{"version":3,"sources":["../src/index.ts","../src/providers/errors.ts","../src/providers/helpers.ts","../src/providers/openaiProvider.ts","../src/providers/anthropicProvider.ts","../src/providers/ollamaProvider.ts","../src/providers/sapAICoreProvider.ts","../src/providers/ProviderRegistry.ts","../src/agent/Agent.ts","../src/memory/ThreadStore.ts","../src/messages/ThreadMessage.ts","../src/utils/logger.ts","../src/agent/build.ts","../src/telemetry/Telemetry.ts","../src/telemetry/LangfuseTelemetry.ts","../src/telemetry/LangsmithTelemetry.ts","../src/memory/InMemoryThreadStore.ts","../src/memory/LocalStorageThreadStore.ts","../src/memory/IndexedDBThreadStore.ts","../src/memory/FsThreadStore.ts","../node_modules/@langchain/langgraph-checkpoint/src/serde/types.ts","../node_modules/@langchain/langgraph-checkpoint/src/serde/utils/fast-safe-stringify/index.ts","../node_modules/@langchain/langgraph-checkpoint/src/serde/jsonplus.ts","../node_modules/@langchain/langgraph-checkpoint/src/base.ts","../src/checkpoint/LocalStorageCheckpointSaver.ts"],"sourcesContent":["export {\n    ProviderRegistry,\n    ProviderRegistryError,\n    ProviderNotFoundError,\n    ModelNotFoundError,\n    ProviderImportError,\n    type BuiltInProviderModelMap,\n    type BuiltInProviderOptions,\n    type ChatModelFactory,\n    type EmbeddingModelFactory,\n    type ModelOptions,\n} from './providers/ProviderRegistry';\n\n// Re-export LangChain's tool helper so consumers don't need to depend on\n// @langchain/core directly when defining tools for papa-ts agents.\n// This keeps the public API small while avoiding an extra direct dependency\n// in downstream projects.\nexport { tool } from '@langchain/core/tools';\n\nexport {\n    Agent,\n    type AgentRunOptions,\n    type AgentResult,\n    type AgentOptions,\n    type AgentStreamOptions,\n    type AgentStreamChunk,\n    type ChooseModelParams,\n    type ThreadHistory,\n} from './agent/Agent';\nexport { buildAgent, type BuildAgentParams } from './agent/build';\n\nexport {\n    NullTelemetry,\n    type Telemetry,\n} from './telemetry/Telemetry';\nexport { LangfuseTelemetry, type LangfuseTelemetryOptions } from './telemetry/LangfuseTelemetry';\nexport { LangSmithTelemetry, type LangSmithTelemetryOptions } from './telemetry/LangsmithTelemetry';\n\nexport {\n    createSnapshot,\n    type ThreadSnapshot,\n    type ThreadSnapshotInit,\n    type ThreadStore,\n} from './memory/ThreadStore';\nexport { InMemoryThreadStore } from './memory/InMemoryThreadStore';\nexport { LocalStorageThreadStore, type LocalStorageThreadStoreOptions } from './memory/LocalStorageThreadStore';\nexport { IndexedDBThreadStore, type IndexedDBThreadStoreOptions } from './memory/IndexedDBThreadStore';\nexport { FsThreadStore, type FsThreadStoreOptions } from './memory/FsThreadStore';\n\nexport {\n    type ThreadMessage,\n    type ThreadMessageContent,\n    type ThreadMessageJsonContent,\n    type ThreadMessageRole,\n    type ThreadMessageTextContent,\n    type ThreadMessageToolCall,\n    normalizeThreadMessages,\n    getMessageText,\n} from './messages/ThreadMessage';\n\nexport {\n    LocalStorageCheckpointSaver,\n    type LocalStorageCheckpointSaverOptions,\n} from './checkpoint/LocalStorageCheckpointSaver';\n\nexport {\n    BaseCheckpointSaver,\n    type Checkpoint,\n    type CheckpointMetadata,\n    type CheckpointTuple,\n    type CheckpointListOptions,\n    type PendingWrite,\n} from '@langchain/langgraph-checkpoint';\n\nexport { type RunnableConfig } from '@langchain/core/runnables';\n","export class ProviderRegistryError extends Error { }\n\nexport class ProviderNotFoundError extends ProviderRegistryError {\n    constructor(provider: string) {\n        super(`No provider registered with name \"${provider}\".`);\n        this.name = 'ProviderNotFoundError';\n    }\n}\n\nexport class ModelNotFoundError extends ProviderRegistryError {\n    constructor(provider: string, model: string, type: 'chat' | 'embedding') {\n        super(`Model \"${model}\" not found for ${type} models in provider \"${provider}\".`);\n        this.name = 'ModelNotFoundError';\n    }\n}\n\nexport class ProviderImportError extends ProviderRegistryError {\n    constructor(provider: string, moduleName: string, cause?: unknown) {\n        const hint = `Install the module with \\`npm install ${moduleName}\\` in the host application.`;\n        const message = `Unable to load module \"${moduleName}\" for provider \"${provider}\". ${hint}`;\n        super(message);\n        this.name = 'ProviderImportError';\n        if (cause instanceof Error) {\n            this.stack = cause.stack;\n        }\n    }\n}\n\n","import type {\n    BuiltInProviderModelMap,\n    BuiltInProviderModelMapEntry,\n    ChatModelFactory,\n    EmbeddingModelFactory,\n} from './types';\n\nexport function firstKey<T extends Record<string, unknown>>(value: T | undefined): string | undefined {\n    if (!value) {\n        return undefined;\n    }\n    const [first] = Object.keys(value);\n    return first;\n}\n\nexport function normalizeDescriptor(value: string | BuiltInProviderModelMapEntry): BuiltInProviderModelMapEntry {\n    if (typeof value === 'string') {\n        return { model: value };\n    }\n    return value;\n}\n\nexport function createChatFactories(\n    entries: BuiltInProviderModelMap,\n    factoryCreator: (descriptor: BuiltInProviderModelMapEntry) => ChatModelFactory,\n): Record<string, ChatModelFactory> {\n    return Object.entries(entries).reduce<Record<string, ChatModelFactory>>((acc, [alias, descriptor]) => {\n        const normalized = normalizeDescriptor(descriptor);\n        acc[alias] = factoryCreator(normalized);\n        return acc;\n    }, {});\n}\n\nexport function createEmbeddingFactories(\n    entries: BuiltInProviderModelMap,\n    factoryCreator: (descriptor: BuiltInProviderModelMapEntry) => EmbeddingModelFactory,\n): Record<string, EmbeddingModelFactory> {\n    return Object.entries(entries).reduce<Record<string, EmbeddingModelFactory>>((acc, [alias, descriptor]) => {\n        const normalized = normalizeDescriptor(descriptor);\n        acc[alias] = factoryCreator(normalized);\n        return acc;\n    }, {});\n}\n\n","import type { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport type { EmbeddingsInterface } from '@langchain/core/embeddings';\nimport { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai';\nimport type {\n    BuiltInProviderModelMap,\n    BuiltInProviderModelMapEntry,\n    BuiltInProviderOptions,\n    ChatModelFactory,\n    EmbeddingModelFactory,\n    ProviderDefinition,\n} from './types';\nimport { ProviderImportError } from './errors';\nimport { createChatFactories, createEmbeddingFactories, firstKey } from './helpers';\n\nconst OPENAI_DEFAULT_BASE_URL = 'https://api.openai.com/v1';\n\nexport async function createOpenAIProviderDefinition(options?: BuiltInProviderOptions): Promise<ProviderDefinition> {\n    const { chatEntries, embeddingEntries } = await resolveOpenAIModelEntries(options);\n\n    return {\n        chatModels: createChatFactories(chatEntries, (descriptor) => createOpenAIChatFactory(descriptor, options)),\n        embeddingModels: createEmbeddingFactories(\n            embeddingEntries,\n            (descriptor) => createOpenAIEmbeddingFactory(descriptor, options),\n        ),\n        defaultChatModel: options?.defaultChatModel ?? firstKey(chatEntries),\n        defaultEmbeddingModel: options?.defaultEmbeddingModel ?? firstKey(embeddingEntries),\n    };\n}\n\nfunction createOpenAIChatFactory(\n    descriptor: BuiltInProviderModelMapEntry,\n    providerOptions?: BuiltInProviderOptions,\n): ChatModelFactory {\n    return async (options) => {\n        try {\n            return new ChatOpenAI({\n                model: descriptor.model,\n                ...buildOpenAIClientOptions(providerOptions),\n                ...(descriptor.options ?? {}),\n                ...(options ?? {}),\n            });\n        } catch (error) {\n            throw new ProviderImportError('openai', '@langchain/openai', error);\n        }\n    };\n}\n\nfunction createOpenAIEmbeddingFactory(\n    descriptor: BuiltInProviderModelMapEntry,\n    providerOptions?: BuiltInProviderOptions,\n): EmbeddingModelFactory {\n    return async (options) => {\n        try {\n            return new OpenAIEmbeddings({\n                model: descriptor.model,\n                ...buildOpenAIClientOptions(providerOptions),\n                ...(descriptor.options ?? {}),\n                ...(options ?? {}),\n            });\n        } catch (error) {\n            throw new ProviderImportError('openai', '@langchain/openai', error);\n        }\n    };\n}\n\nasync function resolveOpenAIModelEntries(\n    options?: BuiltInProviderOptions,\n): Promise<{\n    chatEntries: BuiltInProviderModelMap;\n    embeddingEntries: BuiltInProviderModelMap;\n}> {\n    const providedChatModels = options?.chatModels;\n    const providedEmbeddingModels = options?.embeddingModels;\n\n    if (providedChatModels && providedEmbeddingModels) {\n        return {\n            chatEntries: providedChatModels,\n            embeddingEntries: providedEmbeddingModels,\n        };\n    }\n\n    const discovered = await fetchOpenAIModels(options);\n    return {\n        chatEntries: providedChatModels ?? discovered.chatModels,\n        embeddingEntries: providedEmbeddingModels ?? discovered.embeddingModels,\n    };\n}\n\nasync function fetchOpenAIModels(\n    options?: BuiltInProviderOptions,\n): Promise<{ chatModels: BuiltInProviderModelMap; embeddingModels: BuiltInProviderModelMap }> {\n    const apiKey = options?.apiKey ?? process.env.OPENAI_API_KEY;\n    if (!apiKey) {\n        throw new Error('OpenAI model discovery requires an API key. Set OPENAI_API_KEY or pass options.apiKey.');\n    }\n\n    const fetchImpl = options?.fetchImpl ?? globalThis.fetch;\n    if (!fetchImpl) {\n        throw new Error('Global fetch implementation missing. Provide options.fetchImpl to createOpenAIProviderDefinition.');\n    }\n\n    const baseUrl = sanitizeBaseUrl(options?.baseUrl ?? process.env.OPENAI_BASE_URL ?? OPENAI_DEFAULT_BASE_URL);\n    const response = await fetchImpl(`${baseUrl}/models`, {\n        method: 'GET',\n        headers: {\n            Authorization: `Bearer ${apiKey}`,\n            'Content-Type': 'application/json',\n            ...(options?.organization ? { 'OpenAI-Organization': options.organization } : {}),\n            ...(options?.project ? { 'OpenAI-Project': options.project } : {}),\n            ...(options?.headers ?? {}),\n        },\n    });\n\n    if (!response.ok) {\n        const errorBody = await safeReadText(response);\n        throw new Error(\n            `OpenAI model discovery failed with status ${response.status}${errorBody ? `: ${errorBody}` : ''}`,\n        );\n    }\n\n    const payload = (await response.json()) as OpenAIModelResponse;\n    const resources = Array.isArray(payload.data) ? payload.data : [];\n\n    if (resources.length === 0) {\n        throw new Error('OpenAI did not return any models for the provided credentials.');\n    }\n\n    const chatModels: BuiltInProviderModelMap = {};\n    const embeddingModels: BuiltInProviderModelMap = {};\n\n    for (const resource of resources) {\n        const id = typeof resource?.id === 'string' ? resource.id.trim() : undefined;\n        if (!id) {\n            continue;\n        }\n\n        if (isEmbeddingModel(id)) {\n            embeddingModels[id] = id;\n            continue;\n        }\n\n        if (isExcludedModel(id)) {\n            continue;\n        }\n\n        chatModels[id] = id;\n    }\n\n    if (!Object.keys(chatModels).length) {\n        throw new Error('OpenAI did not return any chat-capable models. Specify options.chatModels to override.');\n    }\n\n    return { chatModels, embeddingModels };\n}\n\nfunction sanitizeBaseUrl(url: string): string {\n    return url.replace(/\\/+$/, '');\n}\n\nfunction isEmbeddingModel(modelId: string): boolean {\n    const normalized = modelId.toLowerCase();\n    return normalized.includes('embedding') || normalized.includes('embed');\n}\n\nfunction isExcludedModel(modelId: string): boolean {\n    const normalized = modelId.toLowerCase();\n    return (\n        normalized.includes('moderation') ||\n        normalized.includes('audio') ||\n        normalized.includes('whisper') ||\n        normalized.includes('tts')\n    );\n}\n\nfunction buildOpenAIClientOptions(options?: BuiltInProviderOptions): Record<string, unknown> {\n    const clientOptions: Record<string, unknown> = {};\n    if (options?.apiKey) {\n        clientOptions.apiKey = options.apiKey;\n    }\n    if (options?.baseUrl) {\n        clientOptions.configuration = { baseURL: options.baseUrl };\n    }\n    if (options?.organization) {\n        clientOptions.organization = options.organization;\n    }\n    if (options?.project) {\n        clientOptions.project = options.project;\n    }\n    return clientOptions;\n}\n\nasync function safeReadText(response: Response): Promise<string | undefined> {\n    try {\n        return await response.text();\n    } catch {\n        return undefined;\n    }\n}\n\ninterface OpenAIModelResponse {\n    data?: OpenAIModelResource[];\n}\n\ninterface OpenAIModelResource {\n    id?: string;\n    object?: string;\n}\n\n","import { ChatAnthropic } from '@langchain/anthropic';\nimport type {\n    BuiltInProviderModelMap,\n    BuiltInProviderModelMapEntry,\n    BuiltInProviderOptions,\n    ChatModelFactory,\n    ProviderDefinition,\n} from './types';\nimport { ProviderImportError } from './errors';\nimport { createChatFactories, firstKey } from './helpers';\n\nconst ANTHROPIC_DEFAULT_BASE_URL = 'https://api.anthropic.com/v1';\nconst ANTHROPIC_DEFAULT_VERSION = '2023-06-01';\n\nexport async function createAnthropicProviderDefinition(options?: BuiltInProviderOptions): Promise<ProviderDefinition> {\n    const chatEntries = await resolveAnthropicChatEntries(options);\n\n    return {\n        chatModels: createChatFactories(chatEntries, (descriptor) => createAnthropicChatFactory(descriptor, options)),\n        embeddingModels: {},\n        defaultChatModel: options?.defaultChatModel ?? firstKey(chatEntries),\n    };\n}\n\nfunction createAnthropicChatFactory(\n    descriptor: BuiltInProviderModelMapEntry,\n    providerOptions?: BuiltInProviderOptions,\n): ChatModelFactory {\n    return async (options) => {\n        try {\n            return new ChatAnthropic({\n                model: descriptor.model,\n                ...buildAnthropicClientOptions(providerOptions),\n                ...(descriptor.options ?? {}),\n                ...(options ?? {}),\n            });\n        } catch (error) {\n            throw new ProviderImportError('anthropic', '@langchain/anthropic', error);\n        }\n    };\n}\n\nasync function resolveAnthropicChatEntries(options?: BuiltInProviderOptions): Promise<BuiltInProviderModelMap> {\n    if (options?.chatModels) {\n        return options.chatModels;\n    }\n    return fetchAnthropicChatModels(options);\n}\n\nasync function fetchAnthropicChatModels(options?: BuiltInProviderOptions): Promise<BuiltInProviderModelMap> {\n    const apiKey = options?.apiKey ?? process.env.ANTHROPIC_API_KEY;\n    if (!apiKey) {\n        throw new Error('Anthropic model discovery requires an API key. Set ANTHROPIC_API_KEY or pass options.apiKey.');\n    }\n\n    const fetchImpl = options?.fetchImpl ?? globalThis.fetch;\n    if (!fetchImpl) {\n        throw new Error(\n            'Global fetch implementation missing. Provide options.fetchImpl to createAnthropicProviderDefinition.',\n        );\n    }\n\n    const baseUrl = sanitizeBaseUrl(options?.baseUrl ?? process.env.ANTHROPIC_API_URL ?? ANTHROPIC_DEFAULT_BASE_URL);\n    const apiVersion = options?.apiVersion ?? process.env.ANTHROPIC_API_VERSION ?? ANTHROPIC_DEFAULT_VERSION;\n\n    const response = await fetchImpl(`${baseUrl}/models`, {\n        method: 'GET',\n        headers: {\n            Authorization: `Bearer ${apiKey}`,\n            'anthropic-version': apiVersion,\n            ...(options?.headers ?? {}),\n        },\n    });\n\n    if (!response.ok) {\n        const errorBody = await safeReadText(response);\n        throw new Error(\n            `Anthropic model discovery failed with status ${response.status}${errorBody ? `: ${errorBody}` : ''}`,\n        );\n    }\n\n    const payload = (await response.json()) as AnthropicModelResponse;\n    const resources = Array.isArray(payload.data) ? payload.data : [];\n    if (!resources.length) {\n        throw new Error('Anthropic did not return any models for the provided credentials.');\n    }\n\n    return resources.reduce<BuiltInProviderModelMap>((acc, resource) => {\n        const id = typeof resource?.id === 'string' ? resource.id.trim() : undefined;\n        if (id) {\n            acc[id] = id;\n        }\n        return acc;\n    }, {});\n}\n\nfunction sanitizeBaseUrl(url: string): string {\n    return url.replace(/\\/+$/, '');\n}\n\nfunction buildAnthropicClientOptions(options?: BuiltInProviderOptions): Record<string, unknown> {\n    const clientOptions: Record<string, unknown> = {};\n    if (options?.apiKey) {\n        clientOptions.apiKey = options.apiKey;\n        clientOptions.anthropicApiKey = options.apiKey;\n    }\n    if (options?.baseUrl) {\n        clientOptions.anthropicApiUrl = options.baseUrl;\n    }\n    return clientOptions;\n}\n\nasync function safeReadText(response: Response): Promise<string | undefined> {\n    try {\n        return await response.text();\n    } catch {\n        return undefined;\n    }\n}\n\ninterface AnthropicModelResponse {\n    data?: Array<{ id?: string }>;\n}\n\n","import { ChatOllama, OllamaEmbeddings } from '@langchain/ollama';\nimport type {\n    BuiltInProviderModelMap,\n    BuiltInProviderModelMapEntry,\n    BuiltInProviderOptions,\n    ChatModelFactory,\n    EmbeddingModelFactory,\n    ProviderDefinition,\n} from './types';\nimport { ProviderImportError } from './errors';\nimport { createChatFactories, createEmbeddingFactories, firstKey } from './helpers';\n\nconst OLLAMA_DEFAULT_BASE_URL = 'http://127.0.0.1:11434';\n\nexport async function createOllamaProviderDefinition(options?: BuiltInProviderOptions): Promise<ProviderDefinition> {\n    const { chatEntries, embeddingEntries } = await resolveOllamaEntries(options);\n\n    return {\n        chatModels: createChatFactories(chatEntries, (descriptor) => createOllamaChatFactory(descriptor, options)),\n        embeddingModels: createEmbeddingFactories(\n            embeddingEntries,\n            (descriptor) => createOllamaEmbeddingFactory(descriptor, options),\n        ),\n        defaultChatModel: options?.defaultChatModel ?? firstKey(chatEntries),\n        defaultEmbeddingModel: options?.defaultEmbeddingModel ?? firstKey(embeddingEntries),\n    };\n}\n\nfunction createOllamaChatFactory(\n    descriptor: BuiltInProviderModelMapEntry,\n    providerOptions?: BuiltInProviderOptions,\n): ChatModelFactory {\n    return async (options) => {\n        try {\n            return new ChatOllama({\n                model: descriptor.model,\n                ...buildOllamaClientOptions(providerOptions),\n                ...(descriptor.options ?? {}),\n                ...(options ?? {}),\n            });\n        } catch (error) {\n            throw new ProviderImportError('ollama', '@langchain/ollama', error);\n        }\n    };\n}\n\nfunction createOllamaEmbeddingFactory(\n    descriptor: BuiltInProviderModelMapEntry,\n    providerOptions?: BuiltInProviderOptions,\n): EmbeddingModelFactory {\n    return async (options) => {\n        try {\n            return new OllamaEmbeddings({\n                model: descriptor.model,\n                ...buildOllamaClientOptions(providerOptions),\n                ...(descriptor.options ?? {}),\n                ...(options ?? {}),\n            });\n        } catch (error) {\n            throw new ProviderImportError('ollama', '@langchain/ollama', error);\n        }\n    };\n}\n\nasync function resolveOllamaEntries(\n    options?: BuiltInProviderOptions,\n): Promise<{ chatEntries: BuiltInProviderModelMap; embeddingEntries: BuiltInProviderModelMap }> {\n    const providedChatModels = options?.chatModels;\n    const providedEmbeddingModels = options?.embeddingModels;\n\n    if (providedChatModels && providedEmbeddingModels) {\n        return { chatEntries: providedChatModels, embeddingEntries: providedEmbeddingModels };\n    }\n\n    const discovered = await fetchOllamaModels(options);\n    return {\n        chatEntries: providedChatModels ?? discovered.chatModels,\n        embeddingEntries: providedEmbeddingModels ?? discovered.embeddingModels,\n    };\n}\n\nasync function fetchOllamaModels(\n    options?: BuiltInProviderOptions,\n): Promise<{ chatModels: BuiltInProviderModelMap; embeddingModels: BuiltInProviderModelMap }> {\n    const fetchImpl = options?.fetchImpl ?? globalThis.fetch;\n    if (!fetchImpl) {\n        throw new Error('Provide options.fetchImpl when running outside environments with global fetch (e.g., Node <18).');\n    }\n\n    const baseUrl = sanitizeBaseUrl(options?.baseUrl ?? process.env.OLLAMA_BASE_URL ?? OLLAMA_DEFAULT_BASE_URL);\n    const response = await fetchImpl(`${baseUrl}/api/tags`);\n    if (!response.ok) {\n        const errorBody = await safeReadText(response);\n        throw new Error(\n            `Failed to list Ollama models via ${baseUrl}/api/tags (status ${response.status}${errorBody ? `: ${errorBody}` : ''\n            })`,\n        );\n    }\n\n    const payload = (await response.json()) as OllamaTagsResponse;\n    const models = Array.isArray(payload.models) ? payload.models : [];\n\n    if (!models.length && !options?.chatModels) {\n        throw new Error(\n            'Ollama did not return any locally available models. Run `ollama pull <model>` or provide options.chatModels.',\n        );\n    }\n\n    const chatModels: BuiltInProviderModelMap = {};\n    const embeddingModels: BuiltInProviderModelMap = {};\n\n    for (const model of models) {\n        const name = typeof model?.name === 'string' ? model.name.trim() : undefined;\n        if (!name) {\n            continue;\n        }\n\n        if (isEmbeddingCandidate(name)) {\n            embeddingModels[name] = name;\n            continue;\n        }\n\n        chatModels[name] = name;\n    }\n\n    return { chatModels, embeddingModels };\n}\n\nfunction buildOllamaClientOptions(options?: BuiltInProviderOptions): Record<string, unknown> {\n    if (!options?.baseUrl) {\n        return {};\n    }\n    return { baseUrl: options.baseUrl };\n}\n\nfunction sanitizeBaseUrl(url: string): string {\n    return url.replace(/\\/+$/, '');\n}\n\nfunction isEmbeddingCandidate(name: string): boolean {\n    const normalized = name.toLowerCase();\n    return normalized.includes('embed') || normalized.includes('embedding');\n}\n\nasync function safeReadText(response: Response): Promise<string | undefined> {\n    try {\n        return await response.text();\n    } catch {\n        return undefined;\n    }\n}\n\ninterface OllamaTagsResponse {\n    models?: Array<{ name?: string }>;\n}\n\n","import { AzureOpenAiChatClient, AzureOpenAiEmbeddingClient } from '@sap-ai-sdk/langchain';\nimport type {\n    ChatModelFactory,\n    EmbeddingModelFactory,\n    ProviderDefinition,\n    SapAICoreModelEntry,\n    SapAICoreProviderOptions,\n} from './types';\nimport { ProviderImportError } from './errors';\nimport { firstKey } from './helpers';\n\nconst SAP_AI_CORE_DEFAULT_BASE_URL = 'https://api.ai.sap.com/v1';\n\nexport async function createSapAICoreProviderDefinition(options?: SapAICoreProviderOptions): Promise<ProviderDefinition> {\n    const { chatEntries, embeddingEntries } = await resolveSapAICoreEntries(options);\n\n    return {\n        chatModels: createSapAICoreChatFactories(chatEntries),\n        embeddingModels: createSapAICoreEmbeddingFactories(embeddingEntries),\n        defaultChatModel: options?.defaultChatModel ?? firstKey(chatEntries),\n        defaultEmbeddingModel: options?.defaultEmbeddingModel ?? firstKey(embeddingEntries),\n    };\n}\n\nfunction createSapAICoreChatFactories(entries: Record<string, SapAICoreModelEntry>): Record<string, ChatModelFactory> {\n    return Object.entries(entries).reduce<Record<string, ChatModelFactory>>((acc, [alias, descriptor]) => {\n        acc[alias] = createSapAICoreChatFactory(alias, descriptor);\n        return acc;\n    }, {});\n}\n\nfunction createSapAICoreEmbeddingFactories(\n    entries: Record<string, SapAICoreModelEntry>,\n): Record<string, EmbeddingModelFactory> {\n    return Object.entries(entries).reduce<Record<string, EmbeddingModelFactory>>((acc, [alias, descriptor]) => {\n        acc[alias] = createSapAICoreEmbeddingFactory(alias, descriptor);\n        return acc;\n    }, {});\n}\n\nfunction createSapAICoreChatFactory(alias: string, descriptor: SapAICoreModelEntry): ChatModelFactory {\n    return async (options) => {\n        try {\n            if (!AzureOpenAiChatClient) {\n                throw new Error('AzureOpenAiChatClient export missing');\n            }\n\n            const clientOptions = {\n                modelName: descriptor.model ?? alias,\n                ...(descriptor.options ?? {}),\n                ...(options ?? {}),\n            };\n\n            return new AzureOpenAiChatClient(clientOptions);\n        } catch (error) {\n            throw new ProviderImportError('sap-ai-core', '@sap-ai-sdk/langchain', error);\n        }\n    };\n}\n\nfunction createSapAICoreEmbeddingFactory(alias: string, descriptor: SapAICoreModelEntry): EmbeddingModelFactory {\n    return async (options) => {\n        try {\n            if (!AzureOpenAiEmbeddingClient) {\n                throw new Error('AzureOpenAiEmbeddingClient export missing');\n            }\n\n            const clientOptions = {\n                modelName: descriptor.model ?? alias,\n                ...(descriptor.options ?? {}),\n                ...(options ?? {}),\n            };\n\n            return new AzureOpenAiEmbeddingClient(clientOptions);\n        } catch (error) {\n            throw new ProviderImportError('sap-ai-core', '@sap-ai-sdk/langchain', error);\n        }\n    };\n}\n\nasync function resolveSapAICoreEntries(\n    options?: SapAICoreProviderOptions,\n): Promise<{ chatEntries: Record<string, SapAICoreModelEntry>; embeddingEntries: Record<string, SapAICoreModelEntry> }> {\n    const providedChat = options?.chatModels;\n    const providedEmbedding = options?.embeddingModels;\n\n    if (providedChat && providedEmbedding) {\n        return { chatEntries: providedChat, embeddingEntries: providedEmbedding };\n    }\n\n    const discovered = await fetchSapAICoreModels(options);\n    return {\n        chatEntries: providedChat ?? discovered.chatModels,\n        embeddingEntries: providedEmbedding ?? discovered.embeddingModels,\n    };\n}\n\nasync function fetchSapAICoreModels(\n    options?: SapAICoreProviderOptions,\n): Promise<{ chatModels: Record<string, SapAICoreModelEntry>; embeddingModels: Record<string, SapAICoreModelEntry> }> {\n    const apiKey = options?.apiKey ?? process.env.SAP_AI_API_KEY ?? process.env.SAP_AI_CORE_API_KEY;\n    if (!apiKey) {\n        throw new Error(\n            'SAP AI Core model discovery requires an API key. Set SAP_AI_API_KEY or pass options.apiKey with a valid token.',\n        );\n    }\n\n    const fetchImpl = options?.fetchImpl ?? globalThis.fetch;\n    if (!fetchImpl) {\n        throw new Error('Global fetch implementation missing. Provide options.fetchImpl to createSapAICoreProviderDefinition.');\n    }\n\n    const baseUrl = sanitizeBaseUrl(options?.baseUrl ?? process.env.SAP_AI_API_BASE_URL ?? SAP_AI_CORE_DEFAULT_BASE_URL);\n    const response = await fetchImpl(`${baseUrl}/foundation-models`, {\n        method: 'GET',\n        headers: {\n            Authorization: `Bearer ${apiKey}`,\n            Accept: 'application/json',\n            ...(options?.headers ?? {}),\n        },\n    });\n\n    if (!response.ok) {\n        const errorBody = await safeReadText(response);\n        throw new Error(\n            `SAP AI Core model discovery failed with status ${response.status}${errorBody ? `: ${errorBody}` : ''}`,\n        );\n    }\n\n    const payload = (await response.json()) as SapAiCoreFoundationResponse;\n    const items = extractFoundationModels(payload);\n\n    if (!items.length) {\n        throw new Error('SAP AI Core did not return any foundation models for the provided credentials.');\n    }\n\n    const chatModels: Record<string, SapAICoreModelEntry> = {};\n    const embeddingModels: Record<string, SapAICoreModelEntry> = {};\n\n    for (const item of items) {\n        const name = getModelName(item);\n        if (!name) {\n            continue;\n        }\n\n        const entry: SapAICoreModelEntry = { model: name };\n        if (looksLikeEmbeddingModel(name, item)) {\n            embeddingModels[name] = entry;\n        } else {\n            chatModels[name] = entry;\n        }\n    }\n\n    if (!Object.keys(chatModels).length) {\n        throw new Error('SAP AI Core did not return any chat-compatible models. Provide options.chatModels to override.');\n    }\n\n    return { chatModels, embeddingModels };\n}\n\nfunction sanitizeBaseUrl(url: string): string {\n    return url.replace(/\\/+$/, '');\n}\n\nfunction extractFoundationModels(payload: SapAiCoreFoundationResponse): Array<Record<string, unknown>> {\n    if (Array.isArray(payload.value)) {\n        return payload.value;\n    }\n    if (Array.isArray(payload.items)) {\n        return payload.items;\n    }\n    if (Array.isArray(payload.models)) {\n        return payload.models;\n    }\n    return [];\n}\n\nfunction getModelName(model: Record<string, unknown>): string | undefined {\n    const nameLike = model.name ?? model.id ?? model.modelName ?? model.model;\n    if (typeof nameLike === 'string' && nameLike.trim().length > 0) {\n        return nameLike.trim();\n    }\n    return undefined;\n}\n\nfunction looksLikeEmbeddingModel(name: string, model: Record<string, unknown>): boolean {\n    const normalized = name.toLowerCase();\n    if (normalized.includes('embed') || normalized.includes('embedding')) {\n        return true;\n    }\n\n    const capabilities = extractCapabilities(model);\n    return capabilities?.some((capability) => capability.includes('embedding') || capability.includes('vector')) ?? false;\n}\n\nfunction extractCapabilities(model: Record<string, unknown>): string[] | undefined {\n    const capabilityField = model.capabilities ?? model.capability ?? model.tasks;\n    if (!capabilityField) {\n        return undefined;\n    }\n\n    if (Array.isArray(capabilityField)) {\n        return capabilityField\n            .map((value) => (typeof value === 'string' ? value.toLowerCase() : undefined))\n            .filter((value): value is string => Boolean(value));\n    }\n\n    if (typeof capabilityField === 'string') {\n        return [capabilityField.toLowerCase()];\n    }\n\n    return undefined;\n}\n\nasync function safeReadText(response: Response): Promise<string | undefined> {\n    try {\n        return await response.text();\n    } catch {\n        return undefined;\n    }\n}\n\ninterface SapAiCoreFoundationResponse {\n    value?: Array<Record<string, unknown>>;\n    items?: Array<Record<string, unknown>>;\n    models?: Array<Record<string, unknown>>;\n}\n","import type { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport type { EmbeddingsInterface } from '@langchain/core/embeddings';\nimport type {\n    BuiltInProviderOptions,\n    ChatModelFactory,\n    EmbeddingModelFactory,\n    ModelOptions,\n    ProviderDefinition,\n    SapAICoreProviderOptions,\n} from './types';\nimport { ModelNotFoundError, ProviderNotFoundError } from './errors';\nimport { firstKey } from './helpers';\nimport { createOpenAIProviderDefinition } from './openaiProvider';\nimport { createAnthropicProviderDefinition } from './anthropicProvider';\nimport { createOllamaProviderDefinition } from './ollamaProvider';\nimport { createSapAICoreProviderDefinition } from './sapAICoreProvider';\n\ninterface InternalProviderDefinition {\n    chatModels: Record<string, ChatModelFactory>;\n    embeddingModels: Record<string, EmbeddingModelFactory>;\n    defaultChatModel?: string;\n    defaultEmbeddingModel?: string;\n}\n\nexport class ProviderRegistry {\n    private readonly providers = new Map<string, InternalProviderDefinition>();\n\n    async registerProvider(name: string, definition: ProviderDefinition | Promise<ProviderDefinition>): Promise<this> {\n        const resolvedDefinition = await definition;\n        const key = ProviderRegistry.normalizeName(name);\n        const existing = this.providers.get(key) ?? {\n            chatModels: {},\n            embeddingModels: {},\n            defaultChatModel: undefined,\n            defaultEmbeddingModel: undefined,\n        } satisfies InternalProviderDefinition;\n\n        const chatModels: Record<string, ChatModelFactory> = {\n            ...existing.chatModels,\n            ...(resolvedDefinition.chatModels ?? {}),\n        };\n\n        const embeddingModels: Record<string, EmbeddingModelFactory> = {\n            ...existing.embeddingModels,\n            ...(resolvedDefinition.embeddingModels ?? {}),\n        };\n\n        const mergedDefinition: InternalProviderDefinition = {\n            chatModels,\n            embeddingModels,\n            defaultChatModel: resolvedDefinition.defaultChatModel ?? existing.defaultChatModel ?? firstKey(chatModels),\n            defaultEmbeddingModel:\n                resolvedDefinition.defaultEmbeddingModel ?? existing.defaultEmbeddingModel ?? firstKey(embeddingModels),\n        };\n\n        this.providers.set(key, mergedDefinition);\n        return this;\n    }\n\n    hasProvider(name: string): boolean {\n        return this.providers.has(ProviderRegistry.normalizeName(name));\n    }\n\n    listProviders(): string[] {\n        return Array.from(this.providers.keys());\n    }\n\n    listChatModels(provider: string): string[] {\n        return Object.keys(this.getProvider(provider).chatModels);\n    }\n\n    listEmbeddingModels(provider: string): string[] {\n        return Object.keys(this.getProvider(provider).embeddingModels);\n    }\n\n    async getChatModel(provider: string, model?: string, options?: ModelOptions): Promise<BaseChatModel> {\n        const providerDef = this.getProvider(provider);\n        const modelName = model ?? providerDef.defaultChatModel;\n        if (!modelName) {\n            throw new ModelNotFoundError(provider, '(default)', 'chat');\n        }\n        const factory = providerDef.chatModels[modelName];\n        if (!factory) {\n            throw new ModelNotFoundError(provider, modelName, 'chat');\n        }\n        return factory(options);\n    }\n\n    async getEmbeddingModel(provider: string, model?: string, options?: ModelOptions): Promise<EmbeddingsInterface> {\n        const providerDef = this.getProvider(provider);\n        const modelName = model ?? providerDef.defaultEmbeddingModel;\n        if (!modelName) {\n            throw new ModelNotFoundError(provider, '(default)', 'embedding');\n        }\n        const factory = providerDef.embeddingModels[modelName];\n        if (!factory) {\n            throw new ModelNotFoundError(provider, modelName, 'embedding');\n        }\n        return factory(options);\n    }\n\n    useOpenAI(options?: BuiltInProviderOptions): Promise<this> {\n        return this.registerProvider('openai', createOpenAIProviderDefinition(options));\n    }\n\n    useAnthropic(options?: BuiltInProviderOptions): Promise<this> {\n        return this.registerProvider('anthropic', createAnthropicProviderDefinition(options));\n    }\n\n    useOllama(options?: BuiltInProviderOptions): Promise<this> {\n        return this.registerProvider('ollama', createOllamaProviderDefinition(options));\n    }\n\n    useSapAICore(options?: SapAICoreProviderOptions): Promise<this> {\n        return this.registerProvider('sap-ai-core', createSapAICoreProviderDefinition(options));\n    }\n\n    private getProvider(name: string): InternalProviderDefinition {\n        const key = ProviderRegistry.normalizeName(name);\n        const provider = this.providers.get(key);\n        if (!provider) {\n            throw new ProviderNotFoundError(name);\n        }\n        return provider;\n    }\n\n    private static normalizeName(name: string): string {\n        return name.trim().toLowerCase();\n    }\n}\n\nexport type {\n    ModelOptions,\n    ChatModelFactory,\n    EmbeddingModelFactory,\n    ProviderDefinition,\n    BuiltInProviderOptions,\n    BuiltInProviderModelMap,\n    BuiltInProviderModelMapEntry,\n    SapAICoreModelEntry,\n    SapAICoreProviderOptions,\n} from './types';\n\nexport {\n    ProviderRegistryError,\n    ProviderNotFoundError,\n    ModelNotFoundError,\n    ProviderImportError,\n} from './errors';\n","import { createAgent } from 'langchain';\nimport type { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type { StreamEvent } from '@langchain/core/tracers/log_stream';\nimport type { BaseCheckpointSaver, CheckpointTuple } from '@langchain/langgraph';\nimport { MemorySaver } from '@langchain/langgraph';\n\nimport type { ProviderRegistry, ModelOptions } from '../providers/ProviderRegistry';\nimport type { Telemetry } from '../telemetry/Telemetry';\nimport { createSnapshot, type ThreadSnapshot, type ThreadStore } from '../memory/ThreadStore';\nimport { getMessageText, normalizeThreadMessages, type ThreadMessage } from '../messages/ThreadMessage';\nimport { debugLog } from '../utils/logger';\n\nexport interface ChooseModelParams {\n    provider: string;\n    chatModel?: string;\n    options?: ModelOptions;\n}\n\nexport interface AgentRunOptions {\n    query: string;\n    threadId?: string;\n    metadata?: Record<string, unknown>;\n    configurable?: Record<string, unknown>;\n    signal?: AbortSignal;\n}\n\nexport interface AgentResult {\n    runId: string;\n    threadId: string;\n    durationMs: number;\n    messages: ThreadMessage[];\n    response?: unknown;\n    raw: unknown;\n}\n\nexport interface ThreadHistory extends ThreadSnapshot {\n    messages: ThreadMessage[];\n}\n\nexport interface AgentOptions {\n    registry: ProviderRegistry;\n    telemetry?: Telemetry;\n    threadStore?: ThreadStore;\n    checkpointer?: BaseCheckpointSaver;\n    defaultPrompt?: string;\n}\n\ntype AgentRunnable = ReturnType<typeof createAgent>; // invoke(), stream(), etc.\n\nexport type AgentStreamOptions = AgentRunOptions;\n\nexport type AgentStreamChunk =\n    | {\n        type: 'token';\n        token: string;\n        messages?: ThreadMessage[];\n        runId: string;\n        threadId: string;\n    }\n    | {\n        type: 'result';\n        result: AgentResult;\n        runId: string;\n        threadId: string;\n    };\n\ninterface SelectedModel {\n    provider: string;\n    name: string;\n    instance: BaseChatModel;\n    options?: ModelOptions;\n}\n\nexport class Agent {\n    private prompt: string;\n    private tools: readonly unknown[] = [];\n    private selectedModel?: SelectedModel;\n    private agentRunnable?: AgentRunnable;\n    private readonly checkpointer: BaseCheckpointSaver;\n    private readonly telemetry?: Telemetry;\n    private readonly threadStore?: ThreadStore;\n    private readonly registry: ProviderRegistry;\n    private dirty = true;\n\n    constructor(options: AgentOptions) {\n        this.registry = options.registry;\n        this.telemetry = options.telemetry;\n        this.threadStore = options.threadStore;\n        this.checkpointer = options.checkpointer ?? new MemorySaver();\n        this.prompt = options.defaultPrompt ?? 'You are a privacy-focused assistant.';\n        debugLog('agent.init', {\n            hasTelemetry: Boolean(this.telemetry),\n            hasThreadStore: Boolean(this.threadStore),\n            checkpointer: this.checkpointer.constructor?.name ?? 'unknown',\n        });\n    }\n\n    setPrompt(prompt: string): void {\n        this.prompt = prompt;\n        this.dirty = true;\n    }\n\n    bindTools(tools: readonly unknown[]): void {\n        this.tools = tools;\n        this.dirty = true;\n    }\n\n    async chooseModel(params: ChooseModelParams): Promise<void> {\n        const { provider, chatModel, options } = params;\n        const instance = await this.registry.getChatModel(provider, chatModel, options);\n        const modelName = chatModel ?? this.registry.listChatModels(provider)[0];\n        if (!modelName) {\n            throw new Error(`No chat models registered for provider \"${provider}\".`);\n        }\n        this.selectedModel = {\n            provider,\n            name: modelName,\n            instance,\n            options,\n        };\n        debugLog('agent.chooseModel', { provider, modelName, options });\n        this.dirty = true;\n    }\n\n    async run(options: AgentRunOptions): Promise<AgentResult> {\n        const { query } = options;\n        if (!this.selectedModel) {\n            throw new Error('No model selected. Call chooseModel() before run().');\n        }\n\n        if (!query || query.trim().length === 0) {\n            throw new Error('Query must be a non-empty string.');\n        }\n\n        const agent = await this.ensureAgent();\n        const runId = this.generateId();\n        const threadId = options.threadId ?? runId;\n        const startedAt = new Date();\n        debugLog('agent.run.start', {\n            runId,\n            threadId,\n            provider: this.selectedModel.provider,\n            model: this.selectedModel.name,\n            queryPreview: query.slice(0, 200),\n        });\n\n        const invokeConfig = this.buildRunnableConfig(options, threadId);\n\n        const rawResult = await agent.invoke(\n            {\n                messages: [\n                    {\n                        role: 'user',\n                        content: query,\n                    },\n                ],\n            },\n            invokeConfig,\n        );\n\n        const finishedAt = new Date();\n        const messages = this.extractMessagesFromResult(rawResult);\n        await this.persistThreadMetadata(threadId, runId, messages);\n\n        const result: AgentResult = {\n            runId,\n            threadId,\n            durationMs: finishedAt.getTime() - startedAt.getTime(),\n            messages,\n            response: this.extractResponse(messages),\n            raw: rawResult,\n        };\n\n        await this.telemetry?.onRunComplete?.(result);\n        debugLog('agent.run.complete', { runId, durationMs: result.durationMs, responsePreview: typeof result.response === 'string' ? (result.response as string).slice(0, 200) : undefined });\n\n        return result;\n    }\n\n    async *streamTokens(options: AgentStreamOptions): AsyncGenerator<AgentStreamChunk> {\n        const { query } = options;\n        if (!this.selectedModel) {\n            throw new Error('No model selected. Call chooseModel() before streamTokens().');\n        }\n\n        if (!query || query.trim().length === 0) {\n            throw new Error('Query must be a non-empty string.');\n        }\n\n        const agent = await this.ensureAgent();\n        const runId = this.generateId();\n        const threadId = options.threadId ?? runId;\n        const startedAt = new Date();\n        debugLog('agent.streamTokens.start', {\n            runId,\n            threadId,\n            provider: this.selectedModel.provider,\n            model: this.selectedModel.name,\n            queryPreview: query.slice(0, 200),\n        });\n\n        type StreamEventsConfig = Parameters<AgentRunnable['streamEvents']>[1];\n        const streamConfig = this.buildRunnableConfig(options, threadId) as StreamEventsConfig;\n\n        const stream = agent.streamEvents(\n            {\n                messages: [\n                    {\n                        role: 'user',\n                        content: query,\n                    },\n                ],\n            },\n            streamConfig,\n        );\n\n        let rawResult: unknown;\n        let lastMessageCount = 0;\n        try {\n            for await (const event of stream) {\n                const eventMessages = this.extractMessagesFromEvent(event);\n                const token = this.extractTokenFromEvent(event);\n\n                // For chain_end events (especially after tool execution), try to get latest checkpoint state\n                // This ensures we capture tool calls that might only be in the checkpoint\n                let messagesToEmit: ThreadMessage[] | undefined;\n                const isChainEnd = event.event === 'on_chain_end';\n                const isToolEvent = event.event === 'on_tool_start' || event.event === 'on_tool_end';\n                const mightHaveToolCalls = isChainEnd && (event.name?.includes('tool') || event.name?.includes('Tool'));\n\n                if ((isChainEnd || mightHaveToolCalls || isToolEvent) && eventMessages.length === 0) {\n                    try {\n                        const tuple = await this.checkpointer.getTuple({ configurable: { thread_id: threadId } });\n                        if (tuple) {\n                            const checkpointMessages = this.extractMessagesFromCheckpoint(tuple);\n                            // Only emit if we have new messages with tool calls or tool responses\n                            const hasToolActivity = checkpointMessages.some((msg) => msg.toolCalls || msg.role === 'tool');\n                            if (checkpointMessages.length > lastMessageCount && hasToolActivity) {\n                                messagesToEmit = checkpointMessages;\n                                lastMessageCount = checkpointMessages.length;\n                            }\n                        }\n                    } catch {\n                        // Ignore checkpoint errors during streaming\n                    }\n                } else if (eventMessages.length > 0) {\n                    // Only emit if we have more messages than before\n                    if (eventMessages.length > lastMessageCount) {\n                        messagesToEmit = eventMessages;\n                        lastMessageCount = eventMessages.length;\n                    }\n                }\n\n                // Yield a chunk if we have either a token or new messages\n                // This ensures tool calls and other message updates are visible during streaming\n                if (token || messagesToEmit) {\n                    yield {\n                        type: 'token',\n                        ...(token ? { token } : { token: '' }),\n                        messages: messagesToEmit,\n                        runId,\n                        threadId,\n                    };\n                }\n\n                const output = this.extractOutputFromEvent(event);\n                if (output) {\n                    rawResult = output;\n                }\n            }\n        } catch (error) {\n            debugLog('agent.streamTokens.error', {\n                runId,\n                message: error instanceof Error ? error.message : String(error),\n            });\n            throw error;\n        }\n\n        if (!rawResult) {\n            throw new Error('Agent streaming completed without producing a final output.');\n        }\n\n        const finishedAt = new Date();\n        const messages = this.extractMessagesFromResult(rawResult);\n        await this.persistThreadMetadata(threadId, runId, messages);\n\n        const result: AgentResult = {\n            runId,\n            threadId,\n            durationMs: finishedAt.getTime() - startedAt.getTime(),\n            messages,\n            response: this.extractResponse(messages),\n            raw: rawResult,\n        };\n\n        await this.telemetry?.onRunComplete?.(result);\n        debugLog('agent.streamTokens.complete', {\n            runId,\n            durationMs: result.durationMs,\n            responsePreview: typeof result.response === 'string' ? (result.response as string).slice(0, 200) : undefined,\n        });\n\n        yield {\n            type: 'result',\n            result,\n            runId,\n            threadId,\n        };\n    }\n\n    async getThreadHistory(threadId: string): Promise<ThreadHistory | undefined> {\n        const [metadata, tuple] = await Promise.all([\n            this.threadStore?.read(threadId),\n            this.safeGetCheckpointTuple(threadId),\n        ]);\n\n        if (!metadata && !tuple) {\n            return undefined;\n        }\n\n        const checkpointTimestamp = tuple ? Date.parse(tuple.checkpoint.ts) || Date.now() : Date.now();\n        const baseSnapshot = metadata ? { ...metadata } : createSnapshot({ threadId, updatedAt: checkpointTimestamp, createdAt: checkpointTimestamp });\n        const messages = tuple ? this.extractMessagesFromCheckpoint(tuple) : [];\n\n        return {\n            ...baseSnapshot,\n            updatedAt: metadata?.updatedAt ?? checkpointTimestamp,\n            messages,\n        };\n    }\n\n    private buildRunnableConfig(options: AgentRunOptions, threadId: string): RunnableConfig {\n        const callbacks = this.telemetry?.getCallbacks?.();\n        return {\n            configurable: {\n                thread_id: threadId,\n                ...(options.configurable ?? {}),\n            },\n            metadata: options.metadata,\n            callbacks: callbacks ?? undefined,\n            signal: options.signal,\n        } as RunnableConfig;\n    }\n\n\n    private async ensureAgent(): Promise<AgentRunnable> {\n        if (!this.selectedModel) {\n            throw new Error('No model selected.');\n        }\n\n        if (this.agentRunnable && !this.dirty) {\n            return this.agentRunnable;\n        }\n\n        this.agentRunnable = createAgent({\n            model: this.selectedModel.instance,\n            tools: Array.isArray(this.tools) ? [...this.tools] : [],\n            systemPrompt: this.prompt,\n            checkpointer: this.checkpointer,\n        });\n        this.dirty = false;\n        return this.agentRunnable;\n    }\n\n    private extractMessagesFromResult(result: unknown): ThreadMessage[] {\n        if (!result || typeof result !== 'object' || !('messages' in result)) {\n            return [];\n        }\n        const messages = (result as { messages?: unknown }).messages;\n        if (!Array.isArray(messages)) {\n            return [];\n        }\n        return normalizeThreadMessages(messages);\n    }\n\n    private extractMessagesFromCheckpoint(tuple: CheckpointTuple): ThreadMessage[] {\n        const channelValues = tuple.checkpoint?.channel_values as Record<string, unknown> | undefined;\n        if (!channelValues) {\n            return [];\n        }\n        const messages = channelValues.messages;\n        if (!Array.isArray(messages)) {\n            return [];\n        }\n        return normalizeThreadMessages(messages);\n    }\n\n    private extractOutputFromEvent(event: StreamEvent): unknown | undefined {\n        const output = event?.data?.output;\n        if (this.isAgentOutputCandidate(output)) {\n            return output;\n        }\n        return undefined;\n    }\n\n    private extractMessagesFromEvent(event: StreamEvent): ThreadMessage[] {\n        // Check final output first (most complete state, includes tool calls)\n        const output = this.extractOutputFromEvent(event);\n        if (output) {\n            return this.extractMessagesFromResult(output);\n        }\n\n        // Check if event.data.output exists but wasn't recognized as agent output\n        // This can happen with intermediate chain outputs that contain messages\n        const dataOutput = event?.data?.output;\n        if (dataOutput && typeof dataOutput === 'object' && 'messages' in dataOutput) {\n            const messages = (dataOutput as { messages?: unknown }).messages;\n            if (Array.isArray(messages)) {\n                return normalizeThreadMessages(messages);\n            }\n        }\n\n        // Check chunk data for messages\n        const chunk = event?.data?.chunk;\n        if (!chunk || typeof chunk !== 'object') {\n            return [];\n        }\n\n        // Check if chunk itself is an array of messages\n        if (Array.isArray(chunk)) {\n            return normalizeThreadMessages(chunk);\n        }\n\n        // Check if chunk contains a messages array\n        if ('messages' in chunk) {\n            const messages = (chunk as { messages?: unknown }).messages;\n            if (Array.isArray(messages)) {\n                return normalizeThreadMessages(messages);\n            }\n        }\n\n        // Check if chunk is a single message object (common during token streaming)\n        if ('content' in chunk || 'role' in chunk || 'lc' in chunk || 'kwargs' in chunk) {\n            return normalizeThreadMessages([chunk]);\n        }\n\n        return [];\n    }\n\n    private extractTokenFromEvent(event: StreamEvent): string | undefined {\n        if (!event.event.endsWith('_stream')) {\n            return undefined;\n        }\n        const chunk = event.data?.chunk;\n        if (typeof chunk === 'undefined' || chunk === null) {\n            return undefined;\n        }\n        const token = this.normalizeContentToString(chunk);\n        return token && token.length > 0 ? token : undefined;\n    }\n\n    private normalizeContentToString(value: unknown): string | undefined {\n        if (typeof value === 'string') {\n            return value;\n        }\n        if (Array.isArray(value)) {\n            const combined = value\n                .map((entry) => {\n                    if (typeof entry === 'string') {\n                        return entry;\n                    }\n                    if (entry && typeof entry === 'object') {\n                        if (typeof (entry as { text?: unknown }).text === 'string') {\n                            return (entry as { text: string }).text;\n                        }\n                        if (typeof (entry as { content?: unknown }).content === 'string') {\n                            return (entry as { content: string }).content;\n                        }\n                    }\n                    return '';\n                })\n                .join('');\n            return combined.length > 0 ? combined : undefined;\n        }\n        if (value && typeof value === 'object') {\n            const textField = (value as { text?: unknown }).text;\n            if (typeof textField === 'string') {\n                return textField;\n            }\n            const contentField = (value as { content?: unknown }).content;\n            const contentText = this.normalizeContentToString(contentField);\n            if (contentText) {\n                return contentText;\n            }\n            const messageField = (value as { message?: { content?: unknown } }).message;\n            if (messageField) {\n                const messageText = this.normalizeContentToString(messageField.content);\n                if (messageText) {\n                    return messageText;\n                }\n            }\n            const deltaField = (value as { delta?: unknown }).delta;\n            if (deltaField) {\n                const deltaText = this.normalizeContentToString(deltaField);\n                if (deltaText) {\n                    return deltaText;\n                }\n            }\n        }\n        return undefined;\n    }\n\n    private isAgentOutputCandidate(value: unknown): value is { messages: unknown[] } {\n        return Boolean(\n            value &&\n            typeof value === 'object' &&\n            'messages' in (value as Record<string, unknown>) &&\n            Array.isArray((value as { messages?: unknown }).messages),\n        );\n    }\n\n    private extractResponse(messages: ThreadMessage[]): unknown {\n        if (messages.length === 0) {\n            return undefined;\n        }\n        const last = messages[messages.length - 1];\n        return getMessageText(last) ?? last.content;\n    }\n\n    private async persistThreadMetadata(threadId: string, runId: string, messages: ThreadMessage[]): Promise<void> {\n        if (!this.threadStore) {\n            return;\n        }\n        const existing = await this.threadStore.read(threadId);\n        const metadata: Record<string, unknown> = { ...(existing?.metadata ?? {}) };\n        metadata.lastRunId = runId;\n        metadata.model = this.selectedModel?.name;\n        const lastMessage = messages[messages.length - 1];\n        const preview = getMessageText(lastMessage);\n        if (preview) {\n            metadata.lastMessagePreview = preview.slice(0, 200);\n        }\n        if (lastMessage?.role) {\n            metadata.lastMessageRole = lastMessage.role;\n        }\n        await this.threadStore.write(\n            createSnapshot({\n                threadId,\n                title: existing?.title,\n                metadata,\n                createdAt: existing?.createdAt,\n            }),\n        );\n        debugLog('agent.threadStore.write', { threadId, lastRunId: runId });\n    }\n\n    async generateTitle(threadId: string): Promise<string | undefined> {\n        if (!this.selectedModel) {\n            throw new Error('No model selected. Call chooseModel() before generateTitle().');\n        }\n\n        const history = await this.getThreadHistory(threadId);\n        if (!history || history.messages.length === 0) {\n            return undefined;\n        }\n\n        const conversationText = history.messages\n            .map((m) => `${m.role}: ${getMessageText(m) ?? ''}`)\n            .join('\\n');\n\n        const prompt = `Generate a short, concise title (max 5 words) for the following conversation. Do not use quotes or markdown.\n\nConversation:\n${conversationText}`;\n\n        const response = await this.selectedModel.instance.invoke([\n            { role: 'user', content: prompt },\n        ]);\n\n        const content = response.content;\n        let title = '';\n        if (typeof content === 'string') {\n            title = content;\n        } else if (Array.isArray(content)) {\n            title = content.map((c) => (typeof c === 'string' ? c : (c as { text?: string }).text ?? '')).join('');\n        }\n\n        const cleanTitle = title.replace(/^[\"']|[\"']$/g, '').trim();\n\n        if (cleanTitle && this.threadStore) {\n            const existing = await this.threadStore.read(threadId);\n            await this.threadStore.write(\n                createSnapshot({\n                    threadId,\n                    title: cleanTitle,\n                    metadata: existing?.metadata,\n                    createdAt: existing?.createdAt,\n                    updatedAt: Date.now(),\n                }),\n            );\n        }\n\n        return cleanTitle;\n    }\n\n    private async safeGetCheckpointTuple(threadId: string): Promise<CheckpointTuple | undefined> {\n        try {\n            return await this.checkpointer.getTuple({ configurable: { thread_id: threadId } });\n        } catch (error) {\n            debugLog('agent.checkpointer.getTuple.error', {\n                threadId,\n                message: error instanceof Error ? error.message : String(error),\n            });\n            return undefined;\n        }\n    }\n\n    private generateId(): string {\n        if (typeof globalThis.crypto !== 'undefined' && 'randomUUID' in globalThis.crypto) {\n            return globalThis.crypto.randomUUID();\n        }\n        return `run_${Math.random().toString(36).slice(2, 10)}`;\n    }\n}\n","export interface ThreadSnapshot {\n  threadId: string;\n  title?: string;\n  metadata?: Record<string, unknown>;\n  createdAt: number;\n  updatedAt: number;\n}\n\nexport interface ThreadStore {\n  read(threadId: string): Promise<ThreadSnapshot | undefined>;\n  write(snapshot: ThreadSnapshot): Promise<void>;\n  delete(threadId: string): Promise<void>;\n  list(): Promise<ThreadSnapshot[]>;\n  clear(): Promise<void>;\n}\n\nexport interface ThreadSnapshotInit {\n  threadId: string;\n  title?: string;\n  metadata?: Record<string, unknown>;\n  createdAt?: number;\n  updatedAt?: number;\n}\n\nexport function createSnapshot(params: ThreadSnapshotInit): ThreadSnapshot {\n  const now = Date.now();\n  return {\n    threadId: params.threadId,\n    title: typeof params.title === 'string' ? params.title : undefined,\n    metadata: isPlainRecord(params.metadata) ? params.metadata : undefined,\n    createdAt: typeof params.createdAt === 'number'\n      ? params.createdAt\n      : typeof params.updatedAt === 'number'\n        ? params.updatedAt\n        : now,\n    updatedAt: typeof params.updatedAt === 'number' ? params.updatedAt : now,\n  };\n}\n\nfunction isPlainRecord(value: unknown): Record<string, unknown> | undefined {\n  if (!value || typeof value !== 'object') {\n    return undefined;\n  }\n  if (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) {\n    return undefined;\n}\n  return value as Record<string, unknown>;\n}\n\nexport {\n  type ThreadMessage,\n  type ThreadMessageContent,\n  type ThreadMessageJsonContent,\n  type ThreadMessageRole,\n  type ThreadMessageTextContent,\n  type ThreadMessageToolCall,\n} from '../messages/ThreadMessage';\n\n","export type ThreadMessageRole = 'user' | 'assistant' | 'system' | 'tool';\n\nexport interface ThreadMessageTextContent {\n    type: 'text';\n    text: string;\n}\n\nexport interface ThreadMessageJsonContent {\n    type: 'json';\n    data: unknown;\n}\n\nexport type ThreadMessageContent = ThreadMessageTextContent | ThreadMessageJsonContent;\n\nexport interface ThreadMessageToolCall {\n    id: string;\n    name: string;\n    arguments: unknown;\n    description?: string;\n}\n\nexport interface ThreadMessage {\n    id: string;\n    role: ThreadMessageRole;\n    content: ThreadMessageContent[];\n    toolCalls?: ThreadMessageToolCall[];\n    toolCallId?: string;\n    toolName?: string;\n    metadata?: Record<string, unknown>;\n    timestamp?: number;\n    raw?: unknown;\n}\n\nexport function normalizeThreadMessages(messages: unknown[]): ThreadMessage[] {\n    if (!Array.isArray(messages)) {\n        return [];\n    }\n    return messages\n        .map((message, index) => normalizeThreadMessage(message, index))\n        .filter((message): message is ThreadMessage => Boolean(message));\n}\n\nexport function getMessageText(message: ThreadMessage | undefined): string | undefined {\n    if (!message || !Array.isArray(message.content)) {\n        return undefined;\n    }\n    const textSegments = message.content\n        .filter((segment): segment is ThreadMessageTextContent => segment.type === 'text')\n        .map((segment) => segment.text.trim())\n        .filter((segment) => segment.length > 0);\n    return textSegments.length > 0 ? textSegments.join('\\n') : undefined;\n}\n\nfunction normalizeThreadMessage(message: unknown, index: number): ThreadMessage | undefined {\n    if (isThreadMessage(message)) {\n        return message;\n    }\n    if (isSerializedLangChainMessage(message)) {\n        return fromSerializedLangChainMessage(message, index);\n    }\n    if (isPlainObject(message)) {\n        const obj = message as Record<string, unknown>;\n        // Check for role field (our format or plain objects)\n        if (typeof obj.role === 'string') {\n            return fromRoleContentObject(obj, index);\n        }\n        // Check for type field (LangChain message format: \"human\", \"ai\", \"system\", \"tool\")\n        if (typeof obj.type === 'string') {\n            const role = mapLangChainTypeToRole(obj.type);\n            return {\n                id: typeof obj.id === 'string' && obj.id ? obj.id : createMessageId(index),\n                role,\n                content: buildContentSegments(obj.content),\n                toolCalls: parseToolCalls(obj.tool_calls ?? obj.toolCalls),\n                toolCallId: typeof obj.tool_call_id === 'string' ? obj.tool_call_id : undefined,\n                toolName: typeof obj.name === 'string' ? obj.name : undefined,\n                metadata: isPlainObject(obj.metadata) ? (obj.metadata as Record<string, unknown>) : undefined,\n                raw: message,\n            };\n        }\n    }\n    if (typeof message === 'string') {\n        return {\n            id: createMessageId(index),\n            role: 'assistant',\n            content: [{ type: 'text', text: message }],\n            raw: message,\n        };\n    }\n    return {\n        id: createMessageId(index),\n        role: 'assistant',\n        content: [{ type: 'json', data: message }],\n        raw: message,\n    };\n}\n\ninterface SerializedLangChainMessage {\n    id?: unknown;\n    kwargs: Record<string, unknown>;\n}\n\nfunction isSerializedLangChainMessage(value: unknown): value is SerializedLangChainMessage {\n    if (!isPlainObject(value)) {\n        return false;\n    }\n    if (!('kwargs' in value)) {\n        return false;\n    }\n    return isPlainObject((value as { kwargs: unknown }).kwargs);\n}\n\nfunction fromSerializedLangChainMessage(message: SerializedLangChainMessage, index: number): ThreadMessage {\n    const className = readLangChainClassName(message.id);\n    const kwargs = message.kwargs ?? {};\n    const role = mapClassNameToRole(className);\n    const content = buildContentSegments(kwargs.content);\n    const metadata = buildMetadata(kwargs);\n    const timestamp = extractTimestamp(kwargs);\n    const toolCalls = parseToolCalls(\n        (getPlainObject(kwargs.additional_kwargs)?.tool_calls ??\n            getPlainObject(kwargs.additional_kwargs)?.function_call ??\n            kwargs.tool_calls) as unknown,\n    );\n    const toolCallId = typeof kwargs.tool_call_id === 'string' ? kwargs.tool_call_id : undefined;\n    const toolName = typeof kwargs.name === 'string' ? kwargs.name : undefined;\n    const messageId =\n        (typeof kwargs.id === 'string' && kwargs.id) ||\n        (typeof kwargs.tool_call_id === 'string' && kwargs.tool_call_id) ||\n        createMessageId(index);\n\n    const normalized: ThreadMessage = {\n        id: messageId,\n        role,\n        content,\n        metadata,\n        toolCalls,\n        toolCallId,\n        toolName,\n        timestamp,\n        raw: message,\n    };\n\n    return normalized;\n}\n\nfunction fromRoleContentObject(value: Record<string, unknown>, index: number): ThreadMessage {\n    const role = mapFreeformRole(String(value.role));\n    const content = buildContentSegments(value.content);\n    const metadata = isPlainObject(value.metadata) ? (value.metadata as Record<string, unknown>) : undefined;\n    const toolCalls = parseToolCalls(value.toolCalls ?? value.tool_calls);\n    const toolCallId = typeof value.toolCallId === 'string' ? value.toolCallId : undefined;\n    const toolName = typeof value.toolName === 'string' ? value.toolName : undefined;\n    const messageId = typeof value.id === 'string' && value.id.length > 0 ? value.id : createMessageId(index);\n    return {\n        id: messageId,\n        role,\n        content,\n        metadata,\n        toolCalls,\n        toolCallId,\n        toolName,\n        raw: value,\n    };\n}\n\nfunction buildContentSegments(value: unknown): ThreadMessageContent[] {\n    const segments: ThreadMessageContent[] = [];\n    appendContent(value, segments);\n    if (segments.length === 0) {\n        segments.push({ type: 'text', text: '' });\n    }\n    return segments;\n}\n\nfunction appendContent(value: unknown, segments: ThreadMessageContent[]): void {\n    if (typeof value === 'string') {\n        segments.push({ type: 'text', text: value });\n        return;\n    }\n    if (value === null || typeof value === 'undefined') {\n        return;\n    }\n    if (Array.isArray(value)) {\n        value.forEach((entry) => appendContent(entry, segments));\n        return;\n    }\n    if (isPlainObject(value)) {\n        if (typeof value.text === 'string' && (value.type === 'text' || typeof value.type === 'undefined')) {\n            segments.push({ type: 'text', text: value.text });\n            return;\n        }\n    }\n    segments.push({ type: 'json', data: value });\n}\n\nfunction buildMetadata(kwargs: Record<string, unknown>): Record<string, unknown> | undefined {\n    const metadata: Record<string, unknown> = {};\n    if (isPlainObject(kwargs.metadata)) {\n        Object.assign(metadata, kwargs.metadata as Record<string, unknown>);\n    }\n    if (isPlainObject(kwargs.response_metadata)) {\n        metadata.response = kwargs.response_metadata;\n    }\n    if (isPlainObject(kwargs.usage_metadata)) {\n        metadata.usage = kwargs.usage_metadata;\n    }\n    const additional = getPlainObject(kwargs.additional_kwargs);\n    if (additional && Object.keys(additional).length > 0) {\n        metadata.additional = additional;\n    }\n    return Object.keys(metadata).length > 0 ? metadata : undefined;\n}\n\nfunction extractTimestamp(kwargs: Record<string, unknown>): number | undefined {\n    const response = getPlainObject(kwargs.response_metadata);\n    const value = (response?.created_at as string | undefined) ?? (kwargs.created_at as string | undefined);\n    if (typeof value === 'string') {\n        const time = Date.parse(value);\n        if (!Number.isNaN(time)) {\n            return time;\n        }\n    }\n    return undefined;\n}\n\nfunction parseToolCalls(value: unknown): ThreadMessageToolCall[] | undefined {\n    if (!Array.isArray(value)) {\n        return undefined;\n    }\n    const toolCalls = value\n        .map((entry, index) => parseToolCall(entry, index))\n        .filter((entry): entry is ThreadMessageToolCall => Boolean(entry));\n    return toolCalls.length > 0 ? toolCalls : undefined;\n}\n\nfunction parseToolCall(value: unknown, index: number): ThreadMessageToolCall | undefined {\n    if (!isPlainObject(value)) {\n        return undefined;\n    }\n\n    const functionCall = getPlainObject(value.function);\n    const id =\n        (typeof value.id === 'string' && value.id) ||\n        (typeof functionCall?.id === 'string' && functionCall.id) ||\n        createToolCallId(index);\n    const name =\n        (typeof functionCall?.name === 'string' && functionCall.name) ||\n        (typeof value.name === 'string' && value.name) ||\n        'tool';\n    const args = parseToolArguments(functionCall?.arguments ?? value.arguments ?? value.args);\n\n    return {\n        id,\n        name,\n        arguments: args,\n        description: typeof value.description === 'string' ? value.description : undefined,\n    };\n}\n\nfunction parseToolArguments(value: unknown): unknown {\n    if (typeof value === 'string') {\n        const trimmed = value.trim();\n        if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n            try {\n                return JSON.parse(trimmed);\n            } catch {\n                return value;\n            }\n        }\n        return value;\n    }\n    if (Array.isArray(value)) {\n        return value.map((entry) => parseToolArguments(entry));\n    }\n    if (isPlainObject(value)) {\n        const normalized: Record<string, unknown> = {};\n        Object.entries(value).forEach(([key, entry]) => {\n            normalized[key] = parseToolArguments(entry);\n        });\n        return normalized;\n    }\n    return value;\n}\n\nfunction mapClassNameToRole(className: string | undefined): ThreadMessageRole {\n    switch (className) {\n        case 'HumanMessage':\n        case 'HumanMessageChunk':\n            return 'user';\n        case 'SystemMessage':\n            return 'system';\n        case 'AIMessage':\n        case 'AIMessageChunk':\n        case 'ChatMessage':\n            return 'assistant';\n        case 'ToolMessage':\n        case 'FunctionMessage':\n            return 'tool';\n        default:\n            return 'assistant';\n    }\n}\n\nfunction mapFreeformRole(role: string): ThreadMessageRole {\n    const normalized = role.toLowerCase();\n    if (normalized === 'user' || normalized === 'assistant' || normalized === 'system' || normalized === 'tool') {\n        return normalized;\n    }\n    return normalized === 'function' ? 'tool' : 'assistant';\n}\n\nfunction mapLangChainTypeToRole(type: string): ThreadMessageRole {\n    const normalized = type.toLowerCase();\n    switch (normalized) {\n        case 'human':\n        case 'humanmessage':\n        case 'humanmessagechunk':\n            return 'user';\n        case 'ai':\n        case 'aimessage':\n        case 'aimessagechunk':\n        case 'chatmessage':\n            return 'assistant';\n        case 'system':\n        case 'systemmessage':\n            return 'system';\n        case 'tool':\n        case 'toolmessage':\n        case 'function':\n        case 'functionmessage':\n            return 'tool';\n        default:\n            return 'assistant';\n    }\n}\n\nfunction readLangChainClassName(identifier: unknown): string | undefined {\n    if (typeof identifier === 'string') {\n        return identifier.split(':').pop();\n    }\n    if (Array.isArray(identifier) && typeof identifier[identifier.length - 1] === 'string') {\n        return identifier[identifier.length - 1] as string;\n    }\n    return undefined;\n}\n\nfunction isThreadMessage(value: unknown): value is ThreadMessage {\n    return (\n        isPlainObject(value) &&\n        typeof (value as { role?: unknown }).role === 'string' &&\n        Array.isArray((value as { content?: unknown }).content)\n    );\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n    return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction getPlainObject(value: unknown): Record<string, unknown> | undefined {\n    return isPlainObject(value) ? (value as Record<string, unknown>) : undefined;\n}\n\nfunction createMessageId(index: number): string {\n    if (typeof globalThis.crypto !== 'undefined' && 'randomUUID' in globalThis.crypto) {\n        return globalThis.crypto.randomUUID();\n    }\n    return `msg_${index}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction createToolCallId(index: number): string {\n    return `tool_call_${index}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\n","type DebugFlag = boolean | string | undefined;\n\nfunction resolveFlagValue(value: DebugFlag): boolean | undefined {\n    if (typeof value === 'boolean') {\n        return value;\n    }\n    if (typeof value === 'string') {\n        return value.toLowerCase() === 'true' || value === '1';\n    }\n    return undefined;\n}\n\nconst globalFlag =\n    typeof globalThis !== 'undefined'\n        ? (globalThis as { PRIVACY_AGENT_DEBUG?: DebugFlag }).PRIVACY_AGENT_DEBUG\n        : undefined;\n\nconst envFlag = (() => {\n    if (typeof globalThis === 'undefined') {\n        return undefined;\n    }\n    const maybeProcess = (globalThis as { process?: { env?: Record<string, DebugFlag> } }).process;\n    return maybeProcess?.env?.PRIVACY_AGENT_DEBUG;\n})();\n\nconst isDebugEnabled = resolveFlagValue(globalFlag) ?? resolveFlagValue(envFlag) ?? false;\n\nexport function debugLog(scope: string, details: Record<string, unknown> | string): void {\n    if (!isDebugEnabled) {\n        return;\n    }\n    const globalConsole = typeof globalThis !== 'undefined' ? globalThis.console : undefined;\n    const logFn =\n        globalConsole && typeof globalConsole.debug === 'function'\n            ? globalConsole.debug.bind(globalConsole)\n            : globalConsole?.log?.bind(globalConsole);\n    if (!logFn) {\n        return;\n    }\n    const payload = typeof details === 'string' ? details : JSON.stringify(details, (_, value) => value, 2);\n    logFn(`[privacy-agent][${new Date().toISOString()}][${scope}]`, payload);\n}\n\n","import { createAgent } from 'langchain';\nimport type { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport type { BaseCheckpointSaver } from '@langchain/langgraph';\nimport { MemorySaver } from '@langchain/langgraph';\n\nexport interface BuildAgentParams {\n    model: BaseChatModel;\n    tools?: readonly unknown[];\n    systemPrompt?: string;\n    checkpointer?: BaseCheckpointSaver;\n}\n\nexport function buildAgent(params: BuildAgentParams) {\n    const { model, tools = [], systemPrompt, checkpointer } = params;\n    const toolList = Array.isArray(tools) ? [...tools] : [];\n    return createAgent({\n        model,\n        tools: toolList,\n        systemPrompt,\n        checkpointer: checkpointer ?? new MemorySaver(),\n    });\n}\n\n","import type { Callbacks } from '@langchain/core/callbacks/manager';\n\nimport type { AgentResult } from '../agent/Agent';\n\nexport interface Telemetry {\n    getCallbacks(): Callbacks | undefined;\n    onRunComplete?(result: AgentResult): Promise<void> | void;\n}\n\nexport class NullTelemetry implements Telemetry {\n    getCallbacks(): undefined {\n        return undefined;\n    }\n}\n\n","import { CallbackHandler } from '@langfuse/langchain';\nimport type { Callbacks } from '@langchain/core/callbacks/manager';\nimport { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport { LangfuseSpanProcessor } from \"@langfuse/otel\";\n\nimport type { Telemetry } from './Telemetry';\n\n// See https://langfuse.com/integrations/frameworks/langchain for the official integration pattern.\nexport interface LangfuseTelemetryOptions {\n    /** Optional user identifier to attach to traces. */\n    userId?: string;\n    /** Optional session identifier to group traces. */\n    sessionId?: string;\n    /** Optional tags forwarded to Langfuse. */\n    tags?: string[];\n    /** Optional version of the application emitting traces. */\n    version?: string;\n    /** Additional metadata stored alongside each trace. */\n    traceMetadata?: Record<string, unknown>;\n    /** When true, call `flush` on the handler after each run (useful in short-lived scripts). */\n    flushOnComplete?: boolean;\n    /** Langfuse public key. */\n    publicKey: string;\n    /** Langfuse secret key. */\n    secretKey: string;\n    /** Langfuse base URL. */\n    baseUrl: string;\n    /** Optional environment tag for traces. Defaults to \"node-tools-demo\". */\n    environment?: string;\n}\n\nexport class LangfuseTelemetry implements Telemetry {\n    private readonly handler: CallbackHandler;\n    private readonly flushOnComplete: boolean;\n\n    constructor(options: LangfuseTelemetryOptions) {\n        const {\n            flushOnComplete = false,\n            publicKey,\n            secretKey,\n            baseUrl,\n            environment,\n            ...handlerOptions\n        } = options;\n\n        if (!publicKey || !secretKey || !baseUrl) {\n            throw new Error('LangfuseTelemetry requires publicKey, secretKey, and baseUrl.');\n        }\n\n        const sdk = new NodeSDK({\n            spanProcessors: [new LangfuseSpanProcessor({\n                publicKey,\n                secretKey,\n                baseUrl,\n                environment,\n            })],\n        });\n\n        sdk.start();\n        this.handler = new CallbackHandler(handlerOptions);\n        this.flushOnComplete = flushOnComplete;\n    }\n\n    getCallbacks(): Callbacks {\n        return [this.handler];\n    }\n\n    async onRunComplete(): Promise<void> {\n        if (!this.flushOnComplete) {\n            return;\n        }\n        const maybeFlush = (this.handler as unknown as { flush?: () => Promise<void> }).flush;\n        if (typeof maybeFlush === 'function') {\n            await maybeFlush.call(this.handler);\n        }\n    }\n}\n\n","import { Client } from 'langsmith';\nimport { LangChainTracer, type LangChainTracerFields } from '@langchain/core/tracers/tracer_langchain';\nimport type { Callbacks } from '@langchain/core/callbacks/manager';\n\nimport type { Telemetry } from './Telemetry';\n\nexport interface LangSmithTelemetryOptions extends LangChainTracerFields {\n    /**\n     * Flush spans to LangSmith after each run. This is mainly useful in short-lived\n     * scripts (such as tests) where the Node.js process may exit immediately.\n     */\n    flushOnComplete?: boolean;\n    apiKey?: string;\n    endpoint?: string;\n    project?: string;\n}\n\nexport class LangSmithTelemetry implements Telemetry {\n    private readonly tracer: LangChainTracer;\n    private readonly flushOnComplete: boolean;\n\n    constructor(options?: LangSmithTelemetryOptions) {\n        const {\n            flushOnComplete = false,\n            apiKey,\n            endpoint,\n            project,\n            client,\n            ...fields\n        } = options ?? {};\n\n        let tracerClient = client;\n        if (!tracerClient && (apiKey || endpoint)) {\n            tracerClient = new Client({\n                apiKey,\n                apiUrl: endpoint,\n            });\n        }\n\n        this.tracer = new LangChainTracer({\n            ...fields,\n            projectName: project ?? fields.projectName,\n            client: tracerClient,\n        });\n        this.flushOnComplete = flushOnComplete;\n    }\n\n    getCallbacks(): Callbacks {\n        return [this.tracer];\n    }\n\n    async onRunComplete(): Promise<void> {\n        if (!this.flushOnComplete) {\n            return;\n        }\n        const maybeFlush = (this.tracer as unknown as { flush?: () => Promise<void> }).flush;\n        if (typeof maybeFlush === 'function') {\n            await maybeFlush.call(this.tracer);\n        }\n    }\n}\n","import { createSnapshot, type ThreadSnapshot, type ThreadStore } from './ThreadStore';\n\nexport class InMemoryThreadStore implements ThreadStore {\n  private readonly store = new Map<string, ThreadSnapshot>();\n\n  async read(threadId: string): Promise<ThreadSnapshot | undefined> {\n    return this.store.get(threadId);\n  }\n\n  async write(snapshot: ThreadSnapshot): Promise<void> {\n    this.store.set(snapshot.threadId, createSnapshot(snapshot));\n  }\n\n  async delete(threadId: string): Promise<void> {\n    this.store.delete(threadId);\n  }\n\n  async list(): Promise<ThreadSnapshot[]> {\n    return Array.from(this.store.values()).sort((a, b) => b.updatedAt - a.updatedAt);\n  }\n\n  async clear(): Promise<void> {\n    this.store.clear();\n  }\n}\n\n","import { createSnapshot, type ThreadSnapshot, type ThreadStore } from './ThreadStore';\n\nexport interface LocalStorageThreadStoreOptions {\n  prefix?: string;\n  storage?: Storage;\n}\n\nexport class LocalStorageThreadStore implements ThreadStore {\n  private readonly prefix: string;\n  private readonly storage: Storage;\n\n  constructor(options?: LocalStorageThreadStoreOptions) {\n    this.prefix = options?.prefix ?? 'papa-agent-thread';\n    const storage = options?.storage ?? (typeof globalThis.localStorage !== 'undefined' ? globalThis.localStorage : undefined);\n    if (!storage) {\n      throw new Error('localStorage is not available in the current environment.');\n    }\n    this.storage = storage;\n  }\n\n  async read(threadId: string): Promise<ThreadSnapshot | undefined> {\n    const raw = this.storage.getItem(this.key(threadId));\n    if (!raw) {\n      return undefined;\n    }\n    return this.safeParse(raw);\n  }\n\n  async write(snapshot: ThreadSnapshot): Promise<void> {\n    const normalized = createSnapshot(snapshot);\n    this.storage.setItem(this.key(normalized.threadId), JSON.stringify(normalized));\n  }\n\n  async delete(threadId: string): Promise<void> {\n    this.storage.removeItem(this.key(threadId));\n  }\n\n  async list(): Promise<ThreadSnapshot[]> {\n    const entries: ThreadSnapshot[] = [];\n    for (let index = 0; index < this.storage.length; index += 1) {\n      const key = this.storage.key(index);\n      if (!key || !key.startsWith(this.prefix)) {\n        continue;\n      }\n      const value = this.storage.getItem(key);\n      if (!value) {\n        continue;\n      }\n      const snapshot = this.safeParse(value);\n      if (snapshot) {\n        entries.push(snapshot);\n      }\n    }\n    return entries.sort((a, b) => b.updatedAt - a.updatedAt);\n  }\n\n  async clear(): Promise<void> {\n    const keys: string[] = [];\n    for (let index = 0; index < this.storage.length; index += 1) {\n      const key = this.storage.key(index);\n      if (key && key.startsWith(this.prefix)) {\n        keys.push(key);\n      }\n    }\n    keys.forEach((key) => this.storage.removeItem(key));\n  }\n\n  private key(threadId: string): string {\n    return `${this.prefix}:${threadId}`;\n  }\n\n  private safeParse(raw: string): ThreadSnapshot | undefined {\n    try {\n      const parsed = JSON.parse(raw) as Partial<ThreadSnapshot> & { threadId?: unknown; metadata?: unknown };\n      if (!parsed || typeof parsed.threadId !== 'string') {\n        return undefined;\n      }\n      const metadata = parsed.metadata && typeof parsed.metadata === 'object' ? (parsed.metadata as Record<string, unknown>) : undefined;\n      return createSnapshot({\n        threadId: parsed.threadId,\n        title: typeof parsed.title === 'string' ? parsed.title : undefined,\n        metadata,\n        createdAt: typeof parsed.createdAt === 'number' ? parsed.createdAt : undefined,\n        updatedAt: typeof parsed.updatedAt === 'number' ? parsed.updatedAt : undefined,\n      });\n    } catch {\n      return undefined;\n    }\n  }\n}\n\n","import { createSnapshot, type ThreadSnapshot, type ThreadStore } from './ThreadStore';\n\nconst DEFAULT_DB_NAME = 'papa-agent-threads';\nconst DEFAULT_STORE_NAME = 'threads';\n\nexport interface IndexedDBThreadStoreOptions {\n  dbName?: string;\n  storeName?: string;\n}\n\nexport class IndexedDBThreadStore implements ThreadStore {\n  private readonly dbName: string;\n  private readonly storeName: string;\n  private dbPromise?: Promise<IDBDatabase>;\n\n  constructor(options?: IndexedDBThreadStoreOptions) {\n    if (typeof globalThis.indexedDB === 'undefined') {\n      throw new Error('indexedDB is not available in this environment.');\n    }\n    this.dbName = options?.dbName ?? DEFAULT_DB_NAME;\n    this.storeName = options?.storeName ?? DEFAULT_STORE_NAME;\n  }\n\n  async read(threadId: string): Promise<ThreadSnapshot | undefined> {\n    const db = await this.openDb();\n    return new Promise<ThreadSnapshot | undefined>((resolve, reject) => {\n      const transaction = db.transaction(this.storeName, 'readonly');\n      const store = transaction.objectStore(this.storeName);\n      const request = store.get(threadId);\n      request.onerror = () => reject(request.error);\n      request.onsuccess = () => resolve(this.normalize(request.result));\n    });\n  }\n\n  async write(snapshot: ThreadSnapshot): Promise<void> {\n    const db = await this.openDb();\n    const normalized = createSnapshot(snapshot);\n    await new Promise<void>((resolve, reject) => {\n      const transaction = db.transaction(this.storeName, 'readwrite');\n      const store = transaction.objectStore(this.storeName);\n      const request = store.put(normalized);\n      request.onerror = () => reject(request.error);\n      request.onsuccess = () => resolve();\n    });\n  }\n\n  async delete(threadId: string): Promise<void> {\n    const db = await this.openDb();\n    await new Promise<void>((resolve, reject) => {\n      const transaction = db.transaction(this.storeName, 'readwrite');\n      const store = transaction.objectStore(this.storeName);\n      const request = store.delete(threadId);\n      request.onerror = () => reject(request.error);\n      request.onsuccess = () => resolve();\n    });\n  }\n\n  async list(): Promise<ThreadSnapshot[]> {\n    const db = await this.openDb();\n    return new Promise<ThreadSnapshot[]>((resolve, reject) => {\n      const transaction = db.transaction(this.storeName, 'readonly');\n      const store = transaction.objectStore(this.storeName);\n      const request = store.getAll();\n      request.onerror = () => reject(request.error);\n      request.onsuccess = () => {\n        const results = Array.isArray(request.result) ? request.result : [];\n        resolve(\n          results\n            .map((entry) => this.normalize(entry))\n            .filter((entry): entry is ThreadSnapshot => Boolean(entry))\n            .sort((a, b) => b.updatedAt - a.updatedAt),\n        );\n      };\n    });\n  }\n\n  async clear(): Promise<void> {\n    const db = await this.openDb();\n    await new Promise<void>((resolve, reject) => {\n      const transaction = db.transaction(this.storeName, 'readwrite');\n      const store = transaction.objectStore(this.storeName);\n      const request = store.clear();\n      request.onerror = () => reject(request.error);\n      request.onsuccess = () => resolve();\n    });\n  }\n\n  private async openDb(): Promise<IDBDatabase> {\n    if (!this.dbPromise) {\n      this.dbPromise = new Promise<IDBDatabase>((resolve, reject) => {\n      const request = globalThis.indexedDB.open(this.dbName, 1);\n        request.onerror = () => reject(request.error);\n        request.onsuccess = () => resolve(request.result);\n        request.onupgradeneeded = () => {\n          const db = request.result;\n          if (!db.objectStoreNames.contains(this.storeName)) {\n            db.createObjectStore(this.storeName, { keyPath: 'threadId' });\n          }\n        };\n      });\n    }\n    return this.dbPromise;\n  }\n\n  private normalize(candidate: unknown): ThreadSnapshot | undefined {\n    if (!candidate || typeof candidate !== 'object') {\n      return undefined;\n    }\n    const snapshot = candidate as Partial<ThreadSnapshot> & { threadId?: unknown; metadata?: unknown };\n    if (typeof snapshot.threadId !== 'string') {\n      return undefined;\n    }\n    const metadata = snapshot.metadata && typeof snapshot.metadata === 'object' ? (snapshot.metadata as Record<string, unknown>) : undefined;\n    return createSnapshot({\n      threadId: snapshot.threadId,\n      title: typeof snapshot.title === 'string' ? snapshot.title : undefined,\n      metadata,\n      createdAt: typeof snapshot.createdAt === 'number' ? snapshot.createdAt : undefined,\n      updatedAt: typeof snapshot.updatedAt === 'number' ? snapshot.updatedAt : undefined,\n    });\n  }\n}\n\n","import { createSnapshot, type ThreadSnapshot, type ThreadStore } from './ThreadStore';\n\ntype FsModule = typeof import('node:fs/promises');\ntype PathModule = typeof import('node:path');\n\nexport interface FsThreadStoreOptions {\n  directory: string;\n  fileExtension?: string;\n}\n\nexport class FsThreadStore implements ThreadStore {\n  private readonly directory: string;\n  private readonly extension: string;\n  private fsModule?: FsModule;\n  private pathModule?: PathModule;\n  private initPromise?: Promise<void>;\n\n  constructor(options: FsThreadStoreOptions) {\n    this.directory = options.directory;\n    this.extension = options.fileExtension ?? '.json';\n  }\n\n  async read(threadId: string): Promise<ThreadSnapshot | undefined> {\n    try {\n      const { fs, path } = await this.loadNodeModules();\n      const file = this.filePath(path, threadId);\n      const contents = await fs.readFile(file, 'utf8');\n      return this.normalize(JSON.parse(contents));\n    } catch (error) {\n      if (this.isNotFoundError(error)) {\n        return undefined;\n      }\n      throw error;\n    }\n  }\n\n  async write(snapshot: ThreadSnapshot): Promise<void> {\n    const normalized = createSnapshot(snapshot);\n    const { fs, path } = await this.loadNodeModules();\n    await this.ensureDirectory(fs);\n    const file = this.filePath(path, normalized.threadId);\n    await fs.writeFile(file, JSON.stringify(normalized), 'utf8');\n  }\n\n  async delete(threadId: string): Promise<void> {\n    try {\n      const { fs, path } = await this.loadNodeModules();\n      await fs.unlink(this.filePath(path, threadId));\n    } catch (error) {\n      if (!this.isNotFoundError(error)) {\n        throw error;\n      }\n    }\n  }\n\n  async list(): Promise<ThreadSnapshot[]> {\n    const { fs, path } = await this.loadNodeModules();\n      await this.ensureDirectory(fs);\n    const entries = await fs.readdir(this.directory, { withFileTypes: true });\n    const snapshots: ThreadSnapshot[] = [];\n    for (const entry of entries) {\n      if (!entry.isFile() || !entry.name.endsWith(this.extension)) {\n        continue;\n      }\n      const file = path.join(this.directory, entry.name);\n      try {\n        const contents = await fs.readFile(file, 'utf8');\n        const snapshot = this.normalize(JSON.parse(contents));\n        if (snapshot) {\n          snapshots.push(snapshot);\n        }\n      } catch (error) {\n        if (!this.isNotFoundError(error)) {\n          throw error;\n        }\n      }\n    }\n    return snapshots.sort((a, b) => b.updatedAt - a.updatedAt);\n  }\n\n  async clear(): Promise<void> {\n    const { fs, path } = await this.loadNodeModules();\n      await this.ensureDirectory(fs);\n    const entries = await fs.readdir(this.directory, { withFileTypes: true });\n    await Promise.all(\n      entries\n        .filter((entry) => entry.isFile() && entry.name.endsWith(this.extension))\n        .map((entry) => fs.unlink(path.join(this.directory, entry.name)).catch((error) => {\n          if (!this.isNotFoundError(error)) {\n            throw error;\n          }\n        })),\n    );\n  }\n\n  private async loadNodeModules(): Promise<{ fs: FsModule; path: PathModule }> {\n    if (!this.fsModule || !this.pathModule) {\n      const [fs, path] = await Promise.all([import('node:fs/promises'), import('node:path')]);\n      this.fsModule = fs;\n      this.pathModule = path;\n    }\n    return { fs: this.fsModule!, path: this.pathModule! };\n  }\n\n  private async ensureDirectory(fs: FsModule): Promise<void> {\n    if (!this.initPromise) {\n      this.initPromise = fs.mkdir(this.directory, { recursive: true }).then(() => undefined);\n    }\n    await this.initPromise;\n    // ensure directory still exists when called concurrently\n    await fs.mkdir(this.directory, { recursive: true }).catch((error) => {\n      if (!this.isEexistError(error)) {\n        throw error;\n      }\n    });\n  }\n\n  private filePath(path: PathModule, threadId: string): string {\n    const safeName = encodeURIComponent(threadId);\n    return path.join(this.directory, `${safeName}${this.extension}`);\n  }\n\n  private isNotFoundError(error: unknown): boolean {\n    return this.hasCode(error, 'ENOENT');\n  }\n\n  private isEexistError(error: unknown): boolean {\n    return this.hasCode(error, 'EEXIST');\n  }\n\n  private hasCode(error: unknown, code: string): boolean {\n    return typeof error === 'object' && error !== null && 'code' in error && (error as { code?: string }).code === code;\n  }\n\n  private normalize(candidate: unknown): ThreadSnapshot | undefined {\n    if (!candidate || typeof candidate !== 'object') {\n      return undefined;\n    }\n    const snapshot = candidate as Partial<ThreadSnapshot> & { threadId?: unknown; metadata?: unknown };\n    if (typeof snapshot.threadId !== 'string') {\n      return undefined;\n    }\n    const metadata = snapshot.metadata && typeof snapshot.metadata === 'object' ? (snapshot.metadata as Record<string, unknown>) : undefined;\n    return createSnapshot({\n      threadId: snapshot.threadId,\n      title: typeof snapshot.title === 'string' ? snapshot.title : undefined,\n      metadata,\n      createdAt: typeof snapshot.createdAt === 'number' ? snapshot.createdAt : undefined,\n      updatedAt: typeof snapshot.updatedAt === 'number' ? snapshot.updatedAt : undefined,\n    });\n  }\n}\n\n","export const TASKS = \"__pregel_tasks\";\nexport const ERROR = \"__error__\";\nexport const SCHEDULED = \"__scheduled__\";\nexport const INTERRUPT = \"__interrupt__\";\nexport const RESUME = \"__resume__\";\n\n// Mirrors BaseChannel in \"@langchain/langgraph\"\nexport interface ChannelProtocol<\n  ValueType = unknown,\n  UpdateType = unknown,\n  CheckpointType = unknown\n> {\n  ValueType: ValueType;\n\n  UpdateType: UpdateType;\n\n  /**\n   * The name of the channel.\n   */\n  lc_graph_name: string;\n\n  /**\n   * Return a new identical channel, optionally initialized from a checkpoint.\n   * Can be thought of as a \"restoration\" from a checkpoint which is a \"snapshot\" of the channel's state.\n   *\n   * @param {CheckpointType | undefined} checkpoint\n   * @returns {this}\n   */\n  fromCheckpoint(checkpoint?: CheckpointType): this;\n\n  /**\n   * Update the channel's value with the given sequence of updates.\n   * The order of the updates in the sequence is arbitrary.\n   *\n   * @throws {InvalidUpdateError} if the sequence of updates is invalid.\n   * @param {Array<UpdateType>} values\n   * @returns {void}\n   */\n  update(values: UpdateType[]): void;\n\n  /**\n   * Return the current value of the channel.\n   *\n   * @throws {EmptyChannelError} if the channel is empty (never updated yet).\n   * @returns {ValueType}\n   */\n  get(): ValueType;\n\n  /**\n   * Return a string representation of the channel's current state.\n   *\n   * @throws {EmptyChannelError} if the channel is empty (never updated yet), or doesn't support checkpoints.\n   * @returns {CheckpointType | undefined}\n   */\n  checkpoint(): CheckpointType | undefined;\n}\n\n// Mirrors SendInterface in \"@langchain/langgraph\"\nexport interface SendProtocol {\n  node: string;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  args: any;\n}\n","/* eslint-disable */\n// @ts-nocheck\n\n// Stringify that can handle circular references.\n// Inlined due to ESM import issues\n// Source: https://www.npmjs.com/package/fast-safe-stringify\n\nvar LIMIT_REPLACE_NODE = \"[...]\";\nvar CIRCULAR_REPLACE_NODE = \"[Circular]\";\n\nvar arr = [];\nvar replacerStack = [];\n\nfunction defaultOptions() {\n  return {\n    depthLimit: Number.MAX_SAFE_INTEGER,\n    edgesLimit: Number.MAX_SAFE_INTEGER,\n  };\n}\n\n// Regular stringify\nexport function stringify(obj, replacer?, spacer?, options?) {\n  if (typeof options === \"undefined\") {\n    options = defaultOptions();\n  }\n\n  decirc(obj, \"\", 0, [], undefined, 0, options);\n  var res;\n  try {\n    if (replacerStack.length === 0) {\n      res = JSON.stringify(obj, replacer, spacer);\n    } else {\n      res = JSON.stringify(obj, replaceGetterValues(replacer), spacer);\n    }\n  } catch (_) {\n    return JSON.stringify(\n      \"[unable to serialize, circular reference is too complex to analyze]\"\n    );\n  } finally {\n    while (arr.length !== 0) {\n      var part = arr.pop();\n      if (part.length === 4) {\n        Object.defineProperty(part[0], part[1], part[3]);\n      } else {\n        part[0][part[1]] = part[2];\n      }\n    }\n  }\n  return res;\n}\n\nfunction setReplace(replace, val, k, parent) {\n  var propertyDescriptor = Object.getOwnPropertyDescriptor(parent, k);\n  if (propertyDescriptor.get !== undefined) {\n    if (propertyDescriptor.configurable) {\n      Object.defineProperty(parent, k, { value: replace });\n      arr.push([parent, k, val, propertyDescriptor]);\n    } else {\n      replacerStack.push([val, k, replace]);\n    }\n  } else {\n    parent[k] = replace;\n    arr.push([parent, k, val]);\n  }\n}\n\nfunction decirc(val, k, edgeIndex, stack, parent, depth, options) {\n  depth += 1;\n  var i;\n  if (typeof val === \"object\" && val !== null) {\n    for (i = 0; i < stack.length; i++) {\n      if (stack[i] === val) {\n        setReplace(CIRCULAR_REPLACE_NODE, val, k, parent);\n        return;\n      }\n    }\n\n    if (\n      typeof options.depthLimit !== \"undefined\" &&\n      depth > options.depthLimit\n    ) {\n      setReplace(LIMIT_REPLACE_NODE, val, k, parent);\n      return;\n    }\n\n    if (\n      typeof options.edgesLimit !== \"undefined\" &&\n      edgeIndex + 1 > options.edgesLimit\n    ) {\n      setReplace(LIMIT_REPLACE_NODE, val, k, parent);\n      return;\n    }\n\n    stack.push(val);\n    // Optimize for Arrays. Big arrays could kill the performance otherwise!\n    if (Array.isArray(val)) {\n      for (i = 0; i < val.length; i++) {\n        decirc(val[i], i, i, stack, val, depth, options);\n      }\n    } else {\n      var keys = Object.keys(val);\n      for (i = 0; i < keys.length; i++) {\n        var key = keys[i];\n        decirc(val[key], key, i, stack, val, depth, options);\n      }\n    }\n    stack.pop();\n  }\n}\n\n// Stable-stringify\nfunction compareFunction(a, b) {\n  if (a < b) {\n    return -1;\n  }\n  if (a > b) {\n    return 1;\n  }\n  return 0;\n}\n\nfunction deterministicStringify(obj, replacer, spacer, options) {\n  if (typeof options === \"undefined\") {\n    options = defaultOptions();\n  }\n\n  var tmp = deterministicDecirc(obj, \"\", 0, [], undefined, 0, options) || obj;\n  var res;\n  try {\n    if (replacerStack.length === 0) {\n      res = JSON.stringify(tmp, replacer, spacer);\n    } else {\n      res = JSON.stringify(tmp, replaceGetterValues(replacer), spacer);\n    }\n  } catch (_) {\n    return JSON.stringify(\n      \"[unable to serialize, circular reference is too complex to analyze]\"\n    );\n  } finally {\n    // Ensure that we restore the object as it was.\n    while (arr.length !== 0) {\n      var part = arr.pop();\n      if (part.length === 4) {\n        Object.defineProperty(part[0], part[1], part[3]);\n      } else {\n        part[0][part[1]] = part[2];\n      }\n    }\n  }\n  return res;\n}\n\nfunction deterministicDecirc(val, k, edgeIndex, stack, parent, depth, options) {\n  depth += 1;\n  var i;\n  if (typeof val === \"object\" && val !== null) {\n    for (i = 0; i < stack.length; i++) {\n      if (stack[i] === val) {\n        setReplace(CIRCULAR_REPLACE_NODE, val, k, parent);\n        return;\n      }\n    }\n    try {\n      if (typeof val.toJSON === \"function\") {\n        return;\n      }\n    } catch (_) {\n      return;\n    }\n\n    if (\n      typeof options.depthLimit !== \"undefined\" &&\n      depth > options.depthLimit\n    ) {\n      setReplace(LIMIT_REPLACE_NODE, val, k, parent);\n      return;\n    }\n\n    if (\n      typeof options.edgesLimit !== \"undefined\" &&\n      edgeIndex + 1 > options.edgesLimit\n    ) {\n      setReplace(LIMIT_REPLACE_NODE, val, k, parent);\n      return;\n    }\n\n    stack.push(val);\n    // Optimize for Arrays. Big arrays could kill the performance otherwise!\n    if (Array.isArray(val)) {\n      for (i = 0; i < val.length; i++) {\n        deterministicDecirc(val[i], i, i, stack, val, depth, options);\n      }\n    } else {\n      // Create a temporary object in the required way\n      var tmp = {};\n      var keys = Object.keys(val).sort(compareFunction);\n      for (i = 0; i < keys.length; i++) {\n        var key = keys[i];\n        deterministicDecirc(val[key], key, i, stack, val, depth, options);\n        tmp[key] = val[key];\n      }\n      if (typeof parent !== \"undefined\") {\n        arr.push([parent, k, val]);\n        parent[k] = tmp;\n      } else {\n        return tmp;\n      }\n    }\n    stack.pop();\n  }\n}\n\n// wraps replacer function to handle values we couldn't replace\n// and mark them as replaced value\nfunction replaceGetterValues(replacer) {\n  replacer =\n    typeof replacer !== \"undefined\"\n      ? replacer\n      : function (k, v) {\n          return v;\n        };\n  return function (key, val) {\n    if (replacerStack.length > 0) {\n      for (var i = 0; i < replacerStack.length; i++) {\n        var part = replacerStack[i];\n        if (part[1] === key && part[0] === val) {\n          val = part[2];\n          replacerStack.splice(i, 1);\n          break;\n        }\n      }\n    }\n    return replacer.call(this, key, val);\n  };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-instanceof/no-instanceof */\nimport { load } from \"@langchain/core/load\";\nimport { SerializerProtocol } from \"./base.js\";\nimport { stringify } from \"./utils/fast-safe-stringify/index.js\";\n\nfunction isLangChainSerializedObject(value: Record<string, unknown>) {\n  return (\n    value !== null &&\n    value.lc === 1 &&\n    value.type === \"constructor\" &&\n    Array.isArray(value.id)\n  );\n}\n\n/**\n * The replacer in stringify does not allow delegation to built-in LangChain\n * serialization methods, and instead immediately calls `.toJSON()` and\n * continues to stringify subfields.\n *\n * We therefore must start from the most nested elements in the input and\n * deserialize upwards rather than top-down.\n */\nasync function _reviver(value: any): Promise<any> {\n  if (value && typeof value === \"object\") {\n    if (Array.isArray(value)) {\n      const revivedArray = await Promise.all(\n        value.map((item) => _reviver(item))\n      );\n      return revivedArray;\n    } else {\n      const revivedObj: any = {};\n      for (const [k, v] of Object.entries(value)) {\n        revivedObj[k] = await _reviver(v);\n      }\n\n      if (revivedObj.lc === 2 && revivedObj.type === \"undefined\") {\n        return undefined;\n      } else if (\n        revivedObj.lc === 2 &&\n        revivedObj.type === \"constructor\" &&\n        Array.isArray(revivedObj.id)\n      ) {\n        try {\n          const constructorName = revivedObj.id[revivedObj.id.length - 1];\n          let constructor: any;\n\n          switch (constructorName) {\n            case \"Set\":\n              constructor = Set;\n              break;\n            case \"Map\":\n              constructor = Map;\n              break;\n            case \"RegExp\":\n              constructor = RegExp;\n              break;\n            case \"Error\":\n              constructor = Error;\n              break;\n            default:\n              return revivedObj;\n          }\n          if (revivedObj.method) {\n            return (constructor as any)[revivedObj.method](\n              ...(revivedObj.args || [])\n            );\n          } else {\n            return new (constructor as any)(...(revivedObj.args || []));\n          }\n        } catch (error) {\n          return revivedObj;\n        }\n      } else if (isLangChainSerializedObject(revivedObj)) {\n        return load(JSON.stringify(revivedObj));\n      }\n\n      return revivedObj;\n    }\n  }\n  return value;\n}\n\nfunction _encodeConstructorArgs(\n  // eslint-disable-next-line @typescript-eslint/ban-types\n  constructor: Function,\n  method?: string,\n  args?: any[],\n  kwargs?: Record<string, any>\n): object {\n  return {\n    lc: 2,\n    type: \"constructor\",\n    id: [constructor.name],\n    method: method ?? null,\n    args: args ?? [],\n    kwargs: kwargs ?? {},\n  };\n}\n\nfunction _default(obj: any): any {\n  if (obj === undefined) {\n    return {\n      lc: 2,\n      type: \"undefined\",\n    };\n  } else if (obj instanceof Set || obj instanceof Map) {\n    return _encodeConstructorArgs(obj.constructor, undefined, [\n      Array.from(obj),\n    ]);\n  } else if (obj instanceof RegExp) {\n    return _encodeConstructorArgs(RegExp, undefined, [obj.source, obj.flags]);\n  } else if (obj instanceof Error) {\n    return _encodeConstructorArgs(obj.constructor, undefined, [obj.message]);\n    // TODO: Remove special case\n  } else if (obj?.lg_name === \"Send\") {\n    return {\n      node: obj.node,\n      args: obj.args,\n    };\n  } else {\n    return obj;\n  }\n}\n\nexport class JsonPlusSerializer implements SerializerProtocol {\n  protected _dumps(obj: any): Uint8Array {\n    const encoder = new TextEncoder();\n    return encoder.encode(\n      stringify(obj, (_: string, value: any) => {\n        return _default(value);\n      })\n    );\n  }\n\n  async dumpsTyped(obj: any): Promise<[string, Uint8Array]> {\n    if (obj instanceof Uint8Array) {\n      return [\"bytes\", obj];\n    } else {\n      return [\"json\", this._dumps(obj)];\n    }\n  }\n\n  protected async _loads(data: string): Promise<any> {\n    const parsed = JSON.parse(data);\n    return _reviver(parsed);\n  }\n\n  async loadsTyped(type: string, data: Uint8Array | string): Promise<any> {\n    if (type === \"bytes\") {\n      return typeof data === \"string\" ? new TextEncoder().encode(data) : data;\n    } else if (type === \"json\") {\n      return this._loads(\n        typeof data === \"string\" ? data : new TextDecoder().decode(data)\n      );\n    } else {\n      throw new Error(`Unknown serialization type: ${type}`);\n    }\n  }\n}\n","import type { RunnableConfig } from \"@langchain/core/runnables\";\nimport { SerializerProtocol } from \"./serde/base.js\";\nimport { uuid6 } from \"./id.js\";\nimport type {\n  PendingWrite,\n  CheckpointPendingWrite,\n  CheckpointMetadata,\n} from \"./types.js\";\nimport { ERROR, INTERRUPT, RESUME, SCHEDULED } from \"./serde/types.js\";\nimport { JsonPlusSerializer } from \"./serde/jsonplus.js\";\n\n/** @inline */\ntype ChannelVersion = number | string;\n\nexport type ChannelVersions = Record<string, ChannelVersion>;\n\nexport interface Checkpoint<\n  N extends string = string,\n  C extends string = string\n> {\n  /**\n   * The version of the checkpoint format. Currently 4\n   */\n  v: number;\n  /**\n   * Checkpoint ID {uuid6}\n   */\n  id: string;\n  /**\n   * Timestamp {new Date().toISOString()}\n   */\n  ts: string;\n  /**\n   * @default {}\n   */\n  channel_values: Record<C, unknown>;\n  /**\n   * @default {}\n   */\n  channel_versions: Record<C, ChannelVersion>;\n  /**\n   * @default {}\n   */\n  versions_seen: Record<N, Record<C, ChannelVersion>>;\n}\n\nexport interface ReadonlyCheckpoint extends Readonly<Checkpoint> {\n  readonly channel_values: Readonly<Record<string, unknown>>;\n  readonly channel_versions: Readonly<Record<string, ChannelVersion>>;\n  readonly versions_seen: Readonly<\n    Record<string, Readonly<Record<string, ChannelVersion>>>\n  >;\n}\n\nexport function deepCopy<T>(obj: T): T {\n  if (typeof obj !== \"object\" || obj === null) {\n    return obj;\n  }\n\n  const newObj = Array.isArray(obj) ? [] : {};\n\n  for (const key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      (newObj as Record<PropertyKey, unknown>)[key] = deepCopy(\n        (obj as Record<string, unknown>)[key]\n      );\n    }\n  }\n\n  return newObj as T;\n}\n\n/** @hidden */\nexport function emptyCheckpoint(): Checkpoint {\n  return {\n    v: 4,\n    id: uuid6(-2),\n    ts: new Date().toISOString(),\n    channel_values: {},\n    channel_versions: {},\n    versions_seen: {},\n  };\n}\n\n/** @hidden */\nexport function copyCheckpoint(checkpoint: ReadonlyCheckpoint): Checkpoint {\n  return {\n    v: checkpoint.v,\n    id: checkpoint.id,\n    ts: checkpoint.ts,\n    channel_values: { ...checkpoint.channel_values },\n    channel_versions: { ...checkpoint.channel_versions },\n    versions_seen: deepCopy(checkpoint.versions_seen),\n  };\n}\n\nexport interface CheckpointTuple {\n  config: RunnableConfig;\n  checkpoint: Checkpoint;\n  metadata?: CheckpointMetadata;\n  parentConfig?: RunnableConfig;\n  pendingWrites?: CheckpointPendingWrite[];\n}\n\nexport type CheckpointListOptions = {\n  limit?: number;\n  before?: RunnableConfig;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  filter?: Record<string, any>;\n};\n\nexport abstract class BaseCheckpointSaver<V extends string | number = number> {\n  serde: SerializerProtocol = new JsonPlusSerializer();\n\n  constructor(serde?: SerializerProtocol) {\n    this.serde = serde || this.serde;\n  }\n\n  async get(config: RunnableConfig): Promise<Checkpoint | undefined> {\n    const value = await this.getTuple(config);\n    return value ? value.checkpoint : undefined;\n  }\n\n  abstract getTuple(\n    config: RunnableConfig\n  ): Promise<CheckpointTuple | undefined>;\n\n  abstract list(\n    config: RunnableConfig,\n    options?: CheckpointListOptions\n  ): AsyncGenerator<CheckpointTuple>;\n\n  abstract put(\n    config: RunnableConfig,\n    checkpoint: Checkpoint,\n    metadata: CheckpointMetadata,\n    newVersions: ChannelVersions\n  ): Promise<RunnableConfig>;\n\n  /**\n   * Store intermediate writes linked to a checkpoint.\n   */\n  abstract putWrites(\n    config: RunnableConfig,\n    writes: PendingWrite[],\n    taskId: string\n  ): Promise<void>;\n\n  /**\n   * Delete all checkpoints and writes associated with a specific thread ID.\n   * @param threadId The thread ID whose checkpoints should be deleted.\n   */\n  abstract deleteThread(threadId: string): Promise<void>;\n\n  /**\n   * Generate the next version ID for a channel.\n   *\n   * Default is to use integer versions, incrementing by 1. If you override, you can use str/int/float versions,\n   * as long as they are monotonically increasing.\n   */\n  getNextVersion(current: V | undefined): V {\n    if (typeof current === \"string\") {\n      throw new Error(\"Please override this method to use string versions.\");\n    }\n    return (\n      current !== undefined && typeof current === \"number\" ? current + 1 : 1\n    ) as V;\n  }\n}\n\nexport function compareChannelVersions(\n  a: ChannelVersion,\n  b: ChannelVersion\n): number {\n  if (typeof a === \"number\" && typeof b === \"number\") {\n    return Math.sign(a - b);\n  }\n\n  return String(a).localeCompare(String(b));\n}\n\nexport function maxChannelVersion(\n  ...versions: ChannelVersion[]\n): ChannelVersion {\n  return versions.reduce((max, version, idx) => {\n    if (idx === 0) return version;\n    return compareChannelVersions(max, version) >= 0 ? max : version;\n  });\n}\n\n/**\n * Mapping from error type to error index.\n * Regular writes just map to their index in the list of writes being saved.\n * Special writes (e.g. errors) map to negative indices, to avoid those writes from\n * conflicting with regular writes.\n * Each Checkpointer implementation should use this mapping in put_writes.\n */\nexport const WRITES_IDX_MAP: Record<string, number> = {\n  [ERROR]: -1,\n  [SCHEDULED]: -2,\n  [INTERRUPT]: -3,\n  [RESUME]: -4,\n};\n\nexport function getCheckpointId(config: RunnableConfig): string {\n  return (\n    config.configurable?.checkpoint_id || config.configurable?.thread_ts || \"\"\n  );\n}\n","import type { RunnableConfig } from '@langchain/core/runnables';\nimport {\n    BaseCheckpointSaver,\n    type Checkpoint,\n    type CheckpointListOptions,\n    type CheckpointMetadata,\n    type CheckpointTuple,\n    type PendingWrite,\n    WRITES_IDX_MAP,\n    copyCheckpoint,\n    getCheckpointId,\n    maxChannelVersion,\n    type SerializerProtocol,\n} from '@langchain/langgraph-checkpoint';\nimport { TASKS } from '@langchain/langgraph-checkpoint';\n\ninterface StoredCheckpointRecord {\n    checkpoint: string;\n    metadata: string;\n    parentCheckpointId?: string;\n}\n\ntype StoredWrites = Record<string, [string, string, string]>;\n\ninterface PersistedState {\n    checkpoints: Record<string, Record<string, Record<string, StoredCheckpointRecord>>>;\n    writes: Record<string, StoredWrites>;\n}\n\nfunction generateKey(threadId: string, checkpointNamespace: string, checkpointId: string): string {\n    return JSON.stringify([threadId, checkpointNamespace, checkpointId]);\n}\n\nfunction parseKey(key: string): { threadId: string; checkpointNamespace: string; checkpointId: string } {\n    const [threadId, checkpointNamespace, checkpointId] = JSON.parse(key) as [string, string, string];\n    return { threadId, checkpointNamespace, checkpointId };\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n    if (typeof globalThis.Buffer !== 'undefined') {\n        return globalThis.Buffer.from(bytes).toString('base64');\n    }\n    if (typeof globalThis.btoa === 'function') {\n        let binary = '';\n        for (const byte of bytes) {\n            binary += String.fromCharCode(byte);\n        }\n        return globalThis.btoa(binary);\n    }\n    throw new Error('Unable to encode checkpoint payload: no base64 encoder available in this environment.');\n}\n\nfunction base64ToBytes(value: string): Uint8Array {\n    if (typeof globalThis.Buffer !== 'undefined') {\n        return new Uint8Array(globalThis.Buffer.from(value, 'base64'));\n    }\n    if (typeof globalThis.atob === 'function') {\n        const binary = globalThis.atob(value);\n        const bytes = new Uint8Array(binary.length);\n        for (let index = 0; index < binary.length; index += 1) {\n            bytes[index] = binary.charCodeAt(index);\n        }\n        return bytes;\n    }\n    throw new Error('Unable to decode checkpoint payload: no base64 decoder available in this environment.');\n}\n\nexport interface LocalStorageCheckpointSaverOptions {\n    prefix?: string;\n    storage?: Storage;\n    serde?: SerializerProtocol;\n}\n\nexport class LocalStorageCheckpointSaver extends BaseCheckpointSaver {\n    private readonly storage: Storage;\n    private readonly stateKey: string;\n    private state: PersistedState;\n\n    constructor(options?: LocalStorageCheckpointSaverOptions) {\n        super(options?.serde);\n        const storage = options?.storage ?? (typeof globalThis.localStorage !== 'undefined' ? globalThis.localStorage : undefined);\n        if (!storage) {\n            throw new Error('localStorage is not available in the current environment.');\n        }\n        this.storage = storage;\n        this.stateKey = `${options?.prefix ?? 'papa-agent'}:checkpoints`;\n        this.state = this.loadState();\n    }\n\n    async getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined> {\n        const threadId = config.configurable?.thread_id;\n        if (!threadId) {\n            return undefined;\n        }\n        const checkpointNamespace = config.configurable?.checkpoint_ns ?? '';\n        const checkpoints = this.state.checkpoints[threadId]?.[checkpointNamespace];\n        if (!checkpoints) {\n            return undefined;\n        }\n\n        let checkpointId = getCheckpointId(config);\n        if (checkpointId && checkpoints[checkpointId]) {\n            return this.buildTuple(threadId, checkpointNamespace, checkpointId, config);\n        }\n\n        const availableIds = Object.keys(checkpoints);\n        if (availableIds.length === 0) {\n            return undefined;\n        }\n        checkpointId = availableIds.sort((a, b) => b.localeCompare(a))[0];\n        return this.buildTuple(threadId, checkpointNamespace, checkpointId, {\n            configurable: {\n                thread_id: threadId,\n                checkpoint_ns: checkpointNamespace,\n                checkpoint_id: checkpointId,\n            },\n        });\n    }\n\n    async *list(config: RunnableConfig, options?: CheckpointListOptions): AsyncGenerator<CheckpointTuple> {\n        const { before, limit, filter } = options ?? {};\n        const requestedThread = config.configurable?.thread_id;\n        const threadIds = requestedThread ? [requestedThread] : Object.keys(this.state.checkpoints);\n        let remaining = typeof limit === 'number' ? limit : Number.POSITIVE_INFINITY;\n\n        for (const threadId of threadIds) {\n            const namespaces = this.state.checkpoints[threadId] ?? {};\n            const namespaceFilter = config.configurable?.checkpoint_ns;\n            for (const [checkpointNamespace, checkpoints] of Object.entries(namespaces)) {\n                if (namespaceFilter !== undefined && checkpointNamespace !== namespaceFilter) {\n                    continue;\n                }\n                const sortedEntries = Object.entries(checkpoints).sort((a, b) => b[0].localeCompare(a[0]));\n                for (const [checkpointId] of sortedEntries) {\n                    if (before?.configurable?.checkpoint_id && checkpointId >= before.configurable.checkpoint_id) {\n                        continue;\n                    }\n                    const tuple = await this.buildTuple(threadId, checkpointNamespace, checkpointId, {\n                        configurable: {\n                            thread_id: threadId,\n                            checkpoint_ns: checkpointNamespace,\n                            checkpoint_id: checkpointId,\n                        },\n                    });\n                    if (!tuple) {\n                        continue;\n                    }\n                    if (filter && !this.matchesFilter(tuple.metadata, filter)) {\n                        continue;\n                    }\n                    if (remaining <= 0) {\n                        return;\n                    }\n                    remaining -= 1;\n                    yield tuple;\n                }\n            }\n        }\n    }\n\n    async put(config: RunnableConfig, checkpoint: Checkpoint, metadata: CheckpointMetadata): Promise<RunnableConfig> {\n        const preparedCheckpoint = copyCheckpoint(checkpoint);\n        const threadId = config.configurable?.thread_id;\n        if (!threadId) {\n            throw new Error('Failed to put checkpoint. RunnableConfig is missing \"thread_id\" in its \"configurable\" property.');\n        }\n        const checkpointNamespace = config.configurable?.checkpoint_ns ?? '';\n        if (!this.state.checkpoints[threadId]) {\n            this.state.checkpoints[threadId] = {};\n        }\n        if (!this.state.checkpoints[threadId][checkpointNamespace]) {\n            this.state.checkpoints[threadId][checkpointNamespace] = {};\n        }\n        const [[, serializedCheckpoint], [, serializedMetadata]] = await Promise.all([\n            this.serde.dumpsTyped(preparedCheckpoint),\n            this.serde.dumpsTyped(metadata),\n        ]);\n        this.state.checkpoints[threadId][checkpointNamespace][checkpoint.id] = {\n            checkpoint: bytesToBase64(serializedCheckpoint),\n            metadata: bytesToBase64(serializedMetadata),\n            parentCheckpointId: config.configurable?.checkpoint_id,\n        };\n        this.persistState();\n        return {\n            configurable: {\n                thread_id: threadId,\n                checkpoint_ns: checkpointNamespace,\n                checkpoint_id: checkpoint.id,\n            },\n        };\n    }\n\n    async putWrites(config: RunnableConfig, writes: PendingWrite[], taskId: string): Promise<void> {\n        const threadId = config.configurable?.thread_id;\n        const checkpointNamespace = config.configurable?.checkpoint_ns ?? '';\n        const checkpointId = config.configurable?.checkpoint_id;\n        if (!threadId) {\n            throw new Error('Failed to put writes. RunnableConfig is missing \"thread_id\" in its \"configurable\" property.');\n        }\n        if (!checkpointId) {\n            throw new Error('Failed to put writes. RunnableConfig is missing \"checkpoint_id\" in its \"configurable\" property.');\n        }\n        const outerKey = generateKey(threadId, checkpointNamespace, checkpointId);\n        if (!this.state.writes[outerKey]) {\n            this.state.writes[outerKey] = {};\n        }\n        const existing = this.state.writes[outerKey];\n        await Promise.all(\n            writes.map(async ([channel, value], index) => {\n                const [, serializedValue] = await this.serde.dumpsTyped(value);\n                const idx = WRITES_IDX_MAP[channel] ?? index;\n                const innerKey = `${taskId},${idx}`;\n                if (idx >= 0 && innerKey in existing) {\n                    return;\n                }\n                existing[innerKey] = [taskId, channel, bytesToBase64(serializedValue)];\n            }),\n        );\n        this.persistState();\n    }\n\n    async deleteThread(threadId: string): Promise<void> {\n        delete this.state.checkpoints[threadId];\n        for (const key of Object.keys(this.state.writes)) {\n            if (parseKey(key).threadId === threadId) {\n                delete this.state.writes[key];\n            }\n        }\n        this.persistState();\n    }\n\n    private loadState(): PersistedState {\n        const raw = this.storage.getItem(this.stateKey);\n        if (!raw) {\n            return { checkpoints: {}, writes: {} };\n        }\n        try {\n            const parsed = JSON.parse(raw) as Partial<PersistedState>;\n            return {\n                checkpoints: parsed.checkpoints ?? {},\n                writes: parsed.writes ?? {},\n            };\n        } catch {\n            return { checkpoints: {}, writes: {} };\n        }\n    }\n\n    private persistState(): void {\n        this.storage.setItem(this.stateKey, JSON.stringify(this.state));\n    }\n\n    private async buildTuple(\n        threadId: string,\n        checkpointNamespace: string,\n        checkpointId: string,\n        config: RunnableConfig,\n    ): Promise<CheckpointTuple | undefined> {\n        const record = this.state.checkpoints[threadId]?.[checkpointNamespace]?.[checkpointId];\n        if (!record) {\n            return undefined;\n        }\n        const [checkpoint, metadata] = await Promise.all([\n            this.serde.loadsTyped('json', base64ToBytes(record.checkpoint)),\n            this.serde.loadsTyped('json', base64ToBytes(record.metadata)),\n        ]);\n        if (checkpoint.v < 4 && record.parentCheckpointId) {\n            await this.migratePendingSends(checkpoint, threadId, checkpointNamespace, record.parentCheckpointId);\n        }\n        const pendingWrites = await this.loadPendingWrites(threadId, checkpointNamespace, checkpointId);\n        const tuple: CheckpointTuple = {\n            config,\n            checkpoint,\n            metadata,\n            pendingWrites,\n        };\n        if (record.parentCheckpointId) {\n            tuple.parentConfig = {\n                configurable: {\n                    thread_id: threadId,\n                    checkpoint_ns: checkpointNamespace,\n                    checkpoint_id: record.parentCheckpointId,\n                },\n            };\n        }\n        return tuple;\n    }\n\n    private async loadPendingWrites(threadId: string, checkpointNamespace: string, checkpointId: string) {\n        const key = generateKey(threadId, checkpointNamespace, checkpointId);\n        const pending = this.state.writes[key];\n        if (!pending) {\n            return [];\n        }\n        return Promise.all(\n            Object.values(pending).map(async ([taskId, channel, value]) => {\n                const deserialized = await this.serde.loadsTyped('json', base64ToBytes(value));\n                return [taskId, channel, deserialized] as [string, string, unknown];\n            }),\n        );\n    }\n\n    private async migratePendingSends(\n        mutableCheckpoint: Checkpoint,\n        threadId: string,\n        checkpointNamespace: string,\n        parentCheckpointId: string,\n    ): Promise<void> {\n        const parentKey = generateKey(threadId, checkpointNamespace, parentCheckpointId);\n        const writes = this.state.writes[parentKey] ?? {};\n        const pendingSends = await Promise.all(\n            Object.values(writes)\n                .filter(([, channel]) => channel === TASKS)\n                .map(async ([, , value]) => this.serde.loadsTyped('json', base64ToBytes(value))),\n        );\n        if (pendingSends.length === 0) {\n            return;\n        }\n        mutableCheckpoint.channel_values ??= {};\n        mutableCheckpoint.channel_values[TASKS] = pendingSends;\n        mutableCheckpoint.channel_versions ??= {};\n        mutableCheckpoint.channel_versions[TASKS] =\n            Object.keys(mutableCheckpoint.channel_versions).length > 0\n                ? maxChannelVersion(...Object.values(mutableCheckpoint.channel_versions))\n                : this.getNextVersion(undefined);\n    }\n\n    private matchesFilter(metadata: CheckpointMetadata | undefined, filter: Record<string, unknown>): boolean {\n        if (!metadata || typeof metadata !== 'object') {\n            return false;\n        }\n        const candidate = metadata as Record<string, unknown>;\n        return Object.entries(filter).every(([key, value]) => candidate[key] === value);\n    }\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,wBAAN,cAAoC,MAAM;AAAE;AAE5C,IAAM,wBAAN,cAAoC,sBAAsB;AAAA,EAC7D,YAAY,UAAkB;AAC1B,UAAM,qCAAqC,QAAQ,IAAI;AACvD,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,qBAAN,cAAiC,sBAAsB;AAAA,EAC1D,YAAY,UAAkB,OAAe,MAA4B;AACrE,UAAM,UAAU,KAAK,mBAAmB,IAAI,wBAAwB,QAAQ,IAAI;AAChF,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,sBAAN,cAAkC,sBAAsB;AAAA,EAC3D,YAAY,UAAkB,YAAoB,OAAiB;AAC/D,UAAM,OAAO,yCAAyC,UAAU;AAChE,UAAM,UAAU,0BAA0B,UAAU,mBAAmB,QAAQ,MAAM,IAAI;AACzF,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,QAAI,iBAAiB,OAAO;AACxB,WAAK,QAAQ,MAAM;AAAA,IACvB;AAAA,EACJ;AACJ;;;ACnBO,SAAS,SAA4C,OAA0C;AAClG,MAAI,CAAC,OAAO;AACR,WAAO;AAAA,EACX;AACA,QAAM,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK;AACjC,SAAO;AACX;AAEO,SAAS,oBAAoB,OAA4E;AAC5G,MAAI,OAAO,UAAU,UAAU;AAC3B,WAAO,EAAE,OAAO,MAAM;AAAA,EAC1B;AACA,SAAO;AACX;AAEO,SAAS,oBACZ,SACA,gBACgC;AAChC,SAAO,OAAO,QAAQ,OAAO,EAAE,OAAyC,CAAC,KAAK,CAAC,OAAO,UAAU,MAAM;AAClG,UAAM,aAAa,oBAAoB,UAAU;AACjD,QAAI,KAAK,IAAI,eAAe,UAAU;AACtC,WAAO;AAAA,EACX,GAAG,CAAC,CAAC;AACT;AAEO,SAAS,yBACZ,SACA,gBACqC;AACrC,SAAO,OAAO,QAAQ,OAAO,EAAE,OAA8C,CAAC,KAAK,CAAC,OAAO,UAAU,MAAM;AACvG,UAAM,aAAa,oBAAoB,UAAU;AACjD,QAAI,KAAK,IAAI,eAAe,UAAU;AACtC,WAAO;AAAA,EACX,GAAG,CAAC,CAAC;AACT;;;ACxCA,oBAA6C;AAY7C,IAAM,0BAA0B;AAEhC,eAAsB,+BAA+B,SAA+D;AAChH,QAAM,EAAE,aAAa,iBAAiB,IAAI,MAAM,0BAA0B,OAAO;AAEjF,SAAO;AAAA,IACH,YAAY,oBAAoB,aAAa,CAAC,eAAe,wBAAwB,YAAY,OAAO,CAAC;AAAA,IACzG,iBAAiB;AAAA,MACb;AAAA,MACA,CAAC,eAAe,6BAA6B,YAAY,OAAO;AAAA,IACpE;AAAA,IACA,kBAAkB,SAAS,oBAAoB,SAAS,WAAW;AAAA,IACnE,uBAAuB,SAAS,yBAAyB,SAAS,gBAAgB;AAAA,EACtF;AACJ;AAEA,SAAS,wBACL,YACA,iBACgB;AAChB,SAAO,OAAO,YAAY;AACtB,QAAI;AACA,aAAO,IAAI,yBAAW;AAAA,QAClB,OAAO,WAAW;AAAA,QAClB,GAAG,yBAAyB,eAAe;AAAA,QAC3C,GAAI,WAAW,WAAW,CAAC;AAAA,QAC3B,GAAI,WAAW,CAAC;AAAA,MACpB,CAAC;AAAA,IACL,SAAS,OAAO;AACZ,YAAM,IAAI,oBAAoB,UAAU,qBAAqB,KAAK;AAAA,IACtE;AAAA,EACJ;AACJ;AAEA,SAAS,6BACL,YACA,iBACqB;AACrB,SAAO,OAAO,YAAY;AACtB,QAAI;AACA,aAAO,IAAI,+BAAiB;AAAA,QACxB,OAAO,WAAW;AAAA,QAClB,GAAG,yBAAyB,eAAe;AAAA,QAC3C,GAAI,WAAW,WAAW,CAAC;AAAA,QAC3B,GAAI,WAAW,CAAC;AAAA,MACpB,CAAC;AAAA,IACL,SAAS,OAAO;AACZ,YAAM,IAAI,oBAAoB,UAAU,qBAAqB,KAAK;AAAA,IACtE;AAAA,EACJ;AACJ;AAEA,eAAe,0BACX,SAID;AACC,QAAM,qBAAqB,SAAS;AACpC,QAAM,0BAA0B,SAAS;AAEzC,MAAI,sBAAsB,yBAAyB;AAC/C,WAAO;AAAA,MACH,aAAa;AAAA,MACb,kBAAkB;AAAA,IACtB;AAAA,EACJ;AAEA,QAAM,aAAa,MAAM,kBAAkB,OAAO;AAClD,SAAO;AAAA,IACH,aAAa,sBAAsB,WAAW;AAAA,IAC9C,kBAAkB,2BAA2B,WAAW;AAAA,EAC5D;AACJ;AAEA,eAAe,kBACX,SAC0F;AAC1F,QAAM,SAAS,SAAS,UAAU,QAAQ,IAAI;AAC9C,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,MAAM,wFAAwF;AAAA,EAC5G;AAEA,QAAM,YAAY,SAAS,aAAa,WAAW;AACnD,MAAI,CAAC,WAAW;AACZ,UAAM,IAAI,MAAM,mGAAmG;AAAA,EACvH;AAEA,QAAM,UAAU,gBAAgB,SAAS,WAAW,QAAQ,IAAI,mBAAmB,uBAAuB;AAC1G,QAAM,WAAW,MAAM,UAAU,GAAG,OAAO,WAAW;AAAA,IAClD,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,eAAe,UAAU,MAAM;AAAA,MAC/B,gBAAgB;AAAA,MAChB,GAAI,SAAS,eAAe,EAAE,uBAAuB,QAAQ,aAAa,IAAI,CAAC;AAAA,MAC/E,GAAI,SAAS,UAAU,EAAE,kBAAkB,QAAQ,QAAQ,IAAI,CAAC;AAAA,MAChE,GAAI,SAAS,WAAW,CAAC;AAAA,IAC7B;AAAA,EACJ,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,YAAY,MAAM,aAAa,QAAQ;AAC7C,UAAM,IAAI;AAAA,MACN,6CAA6C,SAAS,MAAM,GAAG,YAAY,KAAK,SAAS,KAAK,EAAE;AAAA,IACpG;AAAA,EACJ;AAEA,QAAM,UAAW,MAAM,SAAS,KAAK;AACrC,QAAM,YAAY,MAAM,QAAQ,QAAQ,IAAI,IAAI,QAAQ,OAAO,CAAC;AAEhE,MAAI,UAAU,WAAW,GAAG;AACxB,UAAM,IAAI,MAAM,gEAAgE;AAAA,EACpF;AAEA,QAAM,aAAsC,CAAC;AAC7C,QAAM,kBAA2C,CAAC;AAElD,aAAW,YAAY,WAAW;AAC9B,UAAM,KAAK,OAAO,UAAU,OAAO,WAAW,SAAS,GAAG,KAAK,IAAI;AACnE,QAAI,CAAC,IAAI;AACL;AAAA,IACJ;AAEA,QAAI,iBAAiB,EAAE,GAAG;AACtB,sBAAgB,EAAE,IAAI;AACtB;AAAA,IACJ;AAEA,QAAI,gBAAgB,EAAE,GAAG;AACrB;AAAA,IACJ;AAEA,eAAW,EAAE,IAAI;AAAA,EACrB;AAEA,MAAI,CAAC,OAAO,KAAK,UAAU,EAAE,QAAQ;AACjC,UAAM,IAAI,MAAM,wFAAwF;AAAA,EAC5G;AAEA,SAAO,EAAE,YAAY,gBAAgB;AACzC;AAEA,SAAS,gBAAgB,KAAqB;AAC1C,SAAO,IAAI,QAAQ,QAAQ,EAAE;AACjC;AAEA,SAAS,iBAAiB,SAA0B;AAChD,QAAM,aAAa,QAAQ,YAAY;AACvC,SAAO,WAAW,SAAS,WAAW,KAAK,WAAW,SAAS,OAAO;AAC1E;AAEA,SAAS,gBAAgB,SAA0B;AAC/C,QAAM,aAAa,QAAQ,YAAY;AACvC,SACI,WAAW,SAAS,YAAY,KAChC,WAAW,SAAS,OAAO,KAC3B,WAAW,SAAS,SAAS,KAC7B,WAAW,SAAS,KAAK;AAEjC;AAEA,SAAS,yBAAyB,SAA2D;AACzF,QAAM,gBAAyC,CAAC;AAChD,MAAI,SAAS,QAAQ;AACjB,kBAAc,SAAS,QAAQ;AAAA,EACnC;AACA,MAAI,SAAS,SAAS;AAClB,kBAAc,gBAAgB,EAAE,SAAS,QAAQ,QAAQ;AAAA,EAC7D;AACA,MAAI,SAAS,cAAc;AACvB,kBAAc,eAAe,QAAQ;AAAA,EACzC;AACA,MAAI,SAAS,SAAS;AAClB,kBAAc,UAAU,QAAQ;AAAA,EACpC;AACA,SAAO;AACX;AAEA,eAAe,aAAa,UAAiD;AACzE,MAAI;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC/B,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;;;ACtMA,uBAA8B;AAW9B,IAAM,6BAA6B;AACnC,IAAM,4BAA4B;AAElC,eAAsB,kCAAkC,SAA+D;AACnH,QAAM,cAAc,MAAM,4BAA4B,OAAO;AAE7D,SAAO;AAAA,IACH,YAAY,oBAAoB,aAAa,CAAC,eAAe,2BAA2B,YAAY,OAAO,CAAC;AAAA,IAC5G,iBAAiB,CAAC;AAAA,IAClB,kBAAkB,SAAS,oBAAoB,SAAS,WAAW;AAAA,EACvE;AACJ;AAEA,SAAS,2BACL,YACA,iBACgB;AAChB,SAAO,OAAO,YAAY;AACtB,QAAI;AACA,aAAO,IAAI,+BAAc;AAAA,QACrB,OAAO,WAAW;AAAA,QAClB,GAAG,4BAA4B,eAAe;AAAA,QAC9C,GAAI,WAAW,WAAW,CAAC;AAAA,QAC3B,GAAI,WAAW,CAAC;AAAA,MACpB,CAAC;AAAA,IACL,SAAS,OAAO;AACZ,YAAM,IAAI,oBAAoB,aAAa,wBAAwB,KAAK;AAAA,IAC5E;AAAA,EACJ;AACJ;AAEA,eAAe,4BAA4B,SAAoE;AAC3G,MAAI,SAAS,YAAY;AACrB,WAAO,QAAQ;AAAA,EACnB;AACA,SAAO,yBAAyB,OAAO;AAC3C;AAEA,eAAe,yBAAyB,SAAoE;AACxG,QAAM,SAAS,SAAS,UAAU,QAAQ,IAAI;AAC9C,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,MAAM,8FAA8F;AAAA,EAClH;AAEA,QAAM,YAAY,SAAS,aAAa,WAAW;AACnD,MAAI,CAAC,WAAW;AACZ,UAAM,IAAI;AAAA,MACN;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,UAAUA,iBAAgB,SAAS,WAAW,QAAQ,IAAI,qBAAqB,0BAA0B;AAC/G,QAAM,aAAa,SAAS,cAAc,QAAQ,IAAI,yBAAyB;AAE/E,QAAM,WAAW,MAAM,UAAU,GAAG,OAAO,WAAW;AAAA,IAClD,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,eAAe,UAAU,MAAM;AAAA,MAC/B,qBAAqB;AAAA,MACrB,GAAI,SAAS,WAAW,CAAC;AAAA,IAC7B;AAAA,EACJ,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,YAAY,MAAMC,cAAa,QAAQ;AAC7C,UAAM,IAAI;AAAA,MACN,gDAAgD,SAAS,MAAM,GAAG,YAAY,KAAK,SAAS,KAAK,EAAE;AAAA,IACvG;AAAA,EACJ;AAEA,QAAM,UAAW,MAAM,SAAS,KAAK;AACrC,QAAM,YAAY,MAAM,QAAQ,QAAQ,IAAI,IAAI,QAAQ,OAAO,CAAC;AAChE,MAAI,CAAC,UAAU,QAAQ;AACnB,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACvF;AAEA,SAAO,UAAU,OAAgC,CAAC,KAAK,aAAa;AAChE,UAAM,KAAK,OAAO,UAAU,OAAO,WAAW,SAAS,GAAG,KAAK,IAAI;AACnE,QAAI,IAAI;AACJ,UAAI,EAAE,IAAI;AAAA,IACd;AACA,WAAO;AAAA,EACX,GAAG,CAAC,CAAC;AACT;AAEA,SAASD,iBAAgB,KAAqB;AAC1C,SAAO,IAAI,QAAQ,QAAQ,EAAE;AACjC;AAEA,SAAS,4BAA4B,SAA2D;AAC5F,QAAM,gBAAyC,CAAC;AAChD,MAAI,SAAS,QAAQ;AACjB,kBAAc,SAAS,QAAQ;AAC/B,kBAAc,kBAAkB,QAAQ;AAAA,EAC5C;AACA,MAAI,SAAS,SAAS;AAClB,kBAAc,kBAAkB,QAAQ;AAAA,EAC5C;AACA,SAAO;AACX;AAEA,eAAeC,cAAa,UAAiD;AACzE,MAAI;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC/B,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;;;ACtHA,oBAA6C;AAY7C,IAAM,0BAA0B;AAEhC,eAAsB,+BAA+B,SAA+D;AAChH,QAAM,EAAE,aAAa,iBAAiB,IAAI,MAAM,qBAAqB,OAAO;AAE5E,SAAO;AAAA,IACH,YAAY,oBAAoB,aAAa,CAAC,eAAe,wBAAwB,YAAY,OAAO,CAAC;AAAA,IACzG,iBAAiB;AAAA,MACb;AAAA,MACA,CAAC,eAAe,6BAA6B,YAAY,OAAO;AAAA,IACpE;AAAA,IACA,kBAAkB,SAAS,oBAAoB,SAAS,WAAW;AAAA,IACnE,uBAAuB,SAAS,yBAAyB,SAAS,gBAAgB;AAAA,EACtF;AACJ;AAEA,SAAS,wBACL,YACA,iBACgB;AAChB,SAAO,OAAO,YAAY;AACtB,QAAI;AACA,aAAO,IAAI,yBAAW;AAAA,QAClB,OAAO,WAAW;AAAA,QAClB,GAAG,yBAAyB,eAAe;AAAA,QAC3C,GAAI,WAAW,WAAW,CAAC;AAAA,QAC3B,GAAI,WAAW,CAAC;AAAA,MACpB,CAAC;AAAA,IACL,SAAS,OAAO;AACZ,YAAM,IAAI,oBAAoB,UAAU,qBAAqB,KAAK;AAAA,IACtE;AAAA,EACJ;AACJ;AAEA,SAAS,6BACL,YACA,iBACqB;AACrB,SAAO,OAAO,YAAY;AACtB,QAAI;AACA,aAAO,IAAI,+BAAiB;AAAA,QACxB,OAAO,WAAW;AAAA,QAClB,GAAG,yBAAyB,eAAe;AAAA,QAC3C,GAAI,WAAW,WAAW,CAAC;AAAA,QAC3B,GAAI,WAAW,CAAC;AAAA,MACpB,CAAC;AAAA,IACL,SAAS,OAAO;AACZ,YAAM,IAAI,oBAAoB,UAAU,qBAAqB,KAAK;AAAA,IACtE;AAAA,EACJ;AACJ;AAEA,eAAe,qBACX,SAC4F;AAC5F,QAAM,qBAAqB,SAAS;AACpC,QAAM,0BAA0B,SAAS;AAEzC,MAAI,sBAAsB,yBAAyB;AAC/C,WAAO,EAAE,aAAa,oBAAoB,kBAAkB,wBAAwB;AAAA,EACxF;AAEA,QAAM,aAAa,MAAM,kBAAkB,OAAO;AAClD,SAAO;AAAA,IACH,aAAa,sBAAsB,WAAW;AAAA,IAC9C,kBAAkB,2BAA2B,WAAW;AAAA,EAC5D;AACJ;AAEA,eAAe,kBACX,SAC0F;AAC1F,QAAM,YAAY,SAAS,aAAa,WAAW;AACnD,MAAI,CAAC,WAAW;AACZ,UAAM,IAAI,MAAM,iGAAiG;AAAA,EACrH;AAEA,QAAM,UAAUC,iBAAgB,SAAS,WAAW,QAAQ,IAAI,mBAAmB,uBAAuB;AAC1G,QAAM,WAAW,MAAM,UAAU,GAAG,OAAO,WAAW;AACtD,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,YAAY,MAAMC,cAAa,QAAQ;AAC7C,UAAM,IAAI;AAAA,MACN,oCAAoC,OAAO,qBAAqB,SAAS,MAAM,GAAG,YAAY,KAAK,SAAS,KAAK,EACjH;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,UAAW,MAAM,SAAS,KAAK;AACrC,QAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,SAAS,CAAC;AAEjE,MAAI,CAAC,OAAO,UAAU,CAAC,SAAS,YAAY;AACxC,UAAM,IAAI;AAAA,MACN;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,aAAsC,CAAC;AAC7C,QAAM,kBAA2C,CAAC;AAElD,aAAW,SAAS,QAAQ;AACxB,UAAM,OAAO,OAAO,OAAO,SAAS,WAAW,MAAM,KAAK,KAAK,IAAI;AACnE,QAAI,CAAC,MAAM;AACP;AAAA,IACJ;AAEA,QAAI,qBAAqB,IAAI,GAAG;AAC5B,sBAAgB,IAAI,IAAI;AACxB;AAAA,IACJ;AAEA,eAAW,IAAI,IAAI;AAAA,EACvB;AAEA,SAAO,EAAE,YAAY,gBAAgB;AACzC;AAEA,SAAS,yBAAyB,SAA2D;AACzF,MAAI,CAAC,SAAS,SAAS;AACnB,WAAO,CAAC;AAAA,EACZ;AACA,SAAO,EAAE,SAAS,QAAQ,QAAQ;AACtC;AAEA,SAASD,iBAAgB,KAAqB;AAC1C,SAAO,IAAI,QAAQ,QAAQ,EAAE;AACjC;AAEA,SAAS,qBAAqB,MAAuB;AACjD,QAAM,aAAa,KAAK,YAAY;AACpC,SAAO,WAAW,SAAS,OAAO,KAAK,WAAW,SAAS,WAAW;AAC1E;AAEA,eAAeC,cAAa,UAAiD;AACzE,MAAI;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC/B,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;;;ACtJA,uBAAkE;AAWlE,IAAM,+BAA+B;AAErC,eAAsB,kCAAkC,SAAiE;AACrH,QAAM,EAAE,aAAa,iBAAiB,IAAI,MAAM,wBAAwB,OAAO;AAE/E,SAAO;AAAA,IACH,YAAY,6BAA6B,WAAW;AAAA,IACpD,iBAAiB,kCAAkC,gBAAgB;AAAA,IACnE,kBAAkB,SAAS,oBAAoB,SAAS,WAAW;AAAA,IACnE,uBAAuB,SAAS,yBAAyB,SAAS,gBAAgB;AAAA,EACtF;AACJ;AAEA,SAAS,6BAA6B,SAAgF;AAClH,SAAO,OAAO,QAAQ,OAAO,EAAE,OAAyC,CAAC,KAAK,CAAC,OAAO,UAAU,MAAM;AAClG,QAAI,KAAK,IAAI,2BAA2B,OAAO,UAAU;AACzD,WAAO;AAAA,EACX,GAAG,CAAC,CAAC;AACT;AAEA,SAAS,kCACL,SACqC;AACrC,SAAO,OAAO,QAAQ,OAAO,EAAE,OAA8C,CAAC,KAAK,CAAC,OAAO,UAAU,MAAM;AACvG,QAAI,KAAK,IAAI,gCAAgC,OAAO,UAAU;AAC9D,WAAO;AAAA,EACX,GAAG,CAAC,CAAC;AACT;AAEA,SAAS,2BAA2B,OAAe,YAAmD;AAClG,SAAO,OAAO,YAAY;AACtB,QAAI;AACA,UAAI,CAAC,wCAAuB;AACxB,cAAM,IAAI,MAAM,sCAAsC;AAAA,MAC1D;AAEA,YAAM,gBAAgB;AAAA,QAClB,WAAW,WAAW,SAAS;AAAA,QAC/B,GAAI,WAAW,WAAW,CAAC;AAAA,QAC3B,GAAI,WAAW,CAAC;AAAA,MACpB;AAEA,aAAO,IAAI,uCAAsB,aAAa;AAAA,IAClD,SAAS,OAAO;AACZ,YAAM,IAAI,oBAAoB,eAAe,yBAAyB,KAAK;AAAA,IAC/E;AAAA,EACJ;AACJ;AAEA,SAAS,gCAAgC,OAAe,YAAwD;AAC5G,SAAO,OAAO,YAAY;AACtB,QAAI;AACA,UAAI,CAAC,6CAA4B;AAC7B,cAAM,IAAI,MAAM,2CAA2C;AAAA,MAC/D;AAEA,YAAM,gBAAgB;AAAA,QAClB,WAAW,WAAW,SAAS;AAAA,QAC/B,GAAI,WAAW,WAAW,CAAC;AAAA,QAC3B,GAAI,WAAW,CAAC;AAAA,MACpB;AAEA,aAAO,IAAI,4CAA2B,aAAa;AAAA,IACvD,SAAS,OAAO;AACZ,YAAM,IAAI,oBAAoB,eAAe,yBAAyB,KAAK;AAAA,IAC/E;AAAA,EACJ;AACJ;AAEA,eAAe,wBACX,SACoH;AACpH,QAAM,eAAe,SAAS;AAC9B,QAAM,oBAAoB,SAAS;AAEnC,MAAI,gBAAgB,mBAAmB;AACnC,WAAO,EAAE,aAAa,cAAc,kBAAkB,kBAAkB;AAAA,EAC5E;AAEA,QAAM,aAAa,MAAM,qBAAqB,OAAO;AACrD,SAAO;AAAA,IACH,aAAa,gBAAgB,WAAW;AAAA,IACxC,kBAAkB,qBAAqB,WAAW;AAAA,EACtD;AACJ;AAEA,eAAe,qBACX,SACkH;AAClH,QAAM,SAAS,SAAS,UAAU,QAAQ,IAAI,kBAAkB,QAAQ,IAAI;AAC5E,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI;AAAA,MACN;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,YAAY,SAAS,aAAa,WAAW;AACnD,MAAI,CAAC,WAAW;AACZ,UAAM,IAAI,MAAM,sGAAsG;AAAA,EAC1H;AAEA,QAAM,UAAUC,iBAAgB,SAAS,WAAW,QAAQ,IAAI,uBAAuB,4BAA4B;AACnH,QAAM,WAAW,MAAM,UAAU,GAAG,OAAO,sBAAsB;AAAA,IAC7D,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,eAAe,UAAU,MAAM;AAAA,MAC/B,QAAQ;AAAA,MACR,GAAI,SAAS,WAAW,CAAC;AAAA,IAC7B;AAAA,EACJ,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,YAAY,MAAMC,cAAa,QAAQ;AAC7C,UAAM,IAAI;AAAA,MACN,kDAAkD,SAAS,MAAM,GAAG,YAAY,KAAK,SAAS,KAAK,EAAE;AAAA,IACzG;AAAA,EACJ;AAEA,QAAM,UAAW,MAAM,SAAS,KAAK;AACrC,QAAM,QAAQ,wBAAwB,OAAO;AAE7C,MAAI,CAAC,MAAM,QAAQ;AACf,UAAM,IAAI,MAAM,gFAAgF;AAAA,EACpG;AAEA,QAAM,aAAkD,CAAC;AACzD,QAAM,kBAAuD,CAAC;AAE9D,aAAW,QAAQ,OAAO;AACtB,UAAM,OAAO,aAAa,IAAI;AAC9B,QAAI,CAAC,MAAM;AACP;AAAA,IACJ;AAEA,UAAM,QAA6B,EAAE,OAAO,KAAK;AACjD,QAAI,wBAAwB,MAAM,IAAI,GAAG;AACrC,sBAAgB,IAAI,IAAI;AAAA,IAC5B,OAAO;AACH,iBAAW,IAAI,IAAI;AAAA,IACvB;AAAA,EACJ;AAEA,MAAI,CAAC,OAAO,KAAK,UAAU,EAAE,QAAQ;AACjC,UAAM,IAAI,MAAM,gGAAgG;AAAA,EACpH;AAEA,SAAO,EAAE,YAAY,gBAAgB;AACzC;AAEA,SAASD,iBAAgB,KAAqB;AAC1C,SAAO,IAAI,QAAQ,QAAQ,EAAE;AACjC;AAEA,SAAS,wBAAwB,SAAsE;AACnG,MAAI,MAAM,QAAQ,QAAQ,KAAK,GAAG;AAC9B,WAAO,QAAQ;AAAA,EACnB;AACA,MAAI,MAAM,QAAQ,QAAQ,KAAK,GAAG;AAC9B,WAAO,QAAQ;AAAA,EACnB;AACA,MAAI,MAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,WAAO,QAAQ;AAAA,EACnB;AACA,SAAO,CAAC;AACZ;AAEA,SAAS,aAAa,OAAoD;AACtE,QAAM,WAAW,MAAM,QAAQ,MAAM,MAAM,MAAM,aAAa,MAAM;AACpE,MAAI,OAAO,aAAa,YAAY,SAAS,KAAK,EAAE,SAAS,GAAG;AAC5D,WAAO,SAAS,KAAK;AAAA,EACzB;AACA,SAAO;AACX;AAEA,SAAS,wBAAwB,MAAc,OAAyC;AACpF,QAAM,aAAa,KAAK,YAAY;AACpC,MAAI,WAAW,SAAS,OAAO,KAAK,WAAW,SAAS,WAAW,GAAG;AAClE,WAAO;AAAA,EACX;AAEA,QAAM,eAAe,oBAAoB,KAAK;AAC9C,SAAO,cAAc,KAAK,CAAC,eAAe,WAAW,SAAS,WAAW,KAAK,WAAW,SAAS,QAAQ,CAAC,KAAK;AACpH;AAEA,SAAS,oBAAoB,OAAsD;AAC/E,QAAM,kBAAkB,MAAM,gBAAgB,MAAM,cAAc,MAAM;AACxE,MAAI,CAAC,iBAAiB;AAClB,WAAO;AAAA,EACX;AAEA,MAAI,MAAM,QAAQ,eAAe,GAAG;AAChC,WAAO,gBACF,IAAI,CAAC,UAAW,OAAO,UAAU,WAAW,MAAM,YAAY,IAAI,MAAU,EAC5E,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC;AAAA,EAC1D;AAEA,MAAI,OAAO,oBAAoB,UAAU;AACrC,WAAO,CAAC,gBAAgB,YAAY,CAAC;AAAA,EACzC;AAEA,SAAO;AACX;AAEA,eAAeC,cAAa,UAAiD;AACzE,MAAI;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC/B,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;;;ACpMO,IAAM,mBAAN,MAAM,kBAAiB;AAAA,EACT,YAAY,oBAAI,IAAwC;AAAA,EAEzE,MAAM,iBAAiB,MAAc,YAA6E;AAC9G,UAAM,qBAAqB,MAAM;AACjC,UAAM,MAAM,kBAAiB,cAAc,IAAI;AAC/C,UAAM,WAAW,KAAK,UAAU,IAAI,GAAG,KAAK;AAAA,MACxC,YAAY,CAAC;AAAA,MACb,iBAAiB,CAAC;AAAA,MAClB,kBAAkB;AAAA,MAClB,uBAAuB;AAAA,IAC3B;AAEA,UAAM,aAA+C;AAAA,MACjD,GAAG,SAAS;AAAA,MACZ,GAAI,mBAAmB,cAAc,CAAC;AAAA,IAC1C;AAEA,UAAM,kBAAyD;AAAA,MAC3D,GAAG,SAAS;AAAA,MACZ,GAAI,mBAAmB,mBAAmB,CAAC;AAAA,IAC/C;AAEA,UAAM,mBAA+C;AAAA,MACjD;AAAA,MACA;AAAA,MACA,kBAAkB,mBAAmB,oBAAoB,SAAS,oBAAoB,SAAS,UAAU;AAAA,MACzG,uBACI,mBAAmB,yBAAyB,SAAS,yBAAyB,SAAS,eAAe;AAAA,IAC9G;AAEA,SAAK,UAAU,IAAI,KAAK,gBAAgB;AACxC,WAAO;AAAA,EACX;AAAA,EAEA,YAAY,MAAuB;AAC/B,WAAO,KAAK,UAAU,IAAI,kBAAiB,cAAc,IAAI,CAAC;AAAA,EAClE;AAAA,EAEA,gBAA0B;AACtB,WAAO,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,EAC3C;AAAA,EAEA,eAAe,UAA4B;AACvC,WAAO,OAAO,KAAK,KAAK,YAAY,QAAQ,EAAE,UAAU;AAAA,EAC5D;AAAA,EAEA,oBAAoB,UAA4B;AAC5C,WAAO,OAAO,KAAK,KAAK,YAAY,QAAQ,EAAE,eAAe;AAAA,EACjE;AAAA,EAEA,MAAM,aAAa,UAAkB,OAAgB,SAAgD;AACjG,UAAM,cAAc,KAAK,YAAY,QAAQ;AAC7C,UAAM,YAAY,SAAS,YAAY;AACvC,QAAI,CAAC,WAAW;AACZ,YAAM,IAAI,mBAAmB,UAAU,aAAa,MAAM;AAAA,IAC9D;AACA,UAAM,UAAU,YAAY,WAAW,SAAS;AAChD,QAAI,CAAC,SAAS;AACV,YAAM,IAAI,mBAAmB,UAAU,WAAW,MAAM;AAAA,IAC5D;AACA,WAAO,QAAQ,OAAO;AAAA,EAC1B;AAAA,EAEA,MAAM,kBAAkB,UAAkB,OAAgB,SAAsD;AAC5G,UAAM,cAAc,KAAK,YAAY,QAAQ;AAC7C,UAAM,YAAY,SAAS,YAAY;AACvC,QAAI,CAAC,WAAW;AACZ,YAAM,IAAI,mBAAmB,UAAU,aAAa,WAAW;AAAA,IACnE;AACA,UAAM,UAAU,YAAY,gBAAgB,SAAS;AACrD,QAAI,CAAC,SAAS;AACV,YAAM,IAAI,mBAAmB,UAAU,WAAW,WAAW;AAAA,IACjE;AACA,WAAO,QAAQ,OAAO;AAAA,EAC1B;AAAA,EAEA,UAAU,SAAiD;AACvD,WAAO,KAAK,iBAAiB,UAAU,+BAA+B,OAAO,CAAC;AAAA,EAClF;AAAA,EAEA,aAAa,SAAiD;AAC1D,WAAO,KAAK,iBAAiB,aAAa,kCAAkC,OAAO,CAAC;AAAA,EACxF;AAAA,EAEA,UAAU,SAAiD;AACvD,WAAO,KAAK,iBAAiB,UAAU,+BAA+B,OAAO,CAAC;AAAA,EAClF;AAAA,EAEA,aAAa,SAAmD;AAC5D,WAAO,KAAK,iBAAiB,eAAe,kCAAkC,OAAO,CAAC;AAAA,EAC1F;AAAA,EAEQ,YAAY,MAA0C;AAC1D,UAAM,MAAM,kBAAiB,cAAc,IAAI;AAC/C,UAAM,WAAW,KAAK,UAAU,IAAI,GAAG;AACvC,QAAI,CAAC,UAAU;AACX,YAAM,IAAI,sBAAsB,IAAI;AAAA,IACxC;AACA,WAAO;AAAA,EACX;AAAA,EAEA,OAAe,cAAc,MAAsB;AAC/C,WAAO,KAAK,KAAK,EAAE,YAAY;AAAA,EACnC;AACJ;;;APhHA,mBAAqB;;;AQjBrB,IAAAC,oBAA4B;AAK5B,uBAA4B;;;ACmBrB,SAAS,eAAe,QAA4C;AACzE,QAAM,MAAM,KAAK,IAAI;AACrB,SAAO;AAAA,IACL,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAAA,IACzD,UAAU,cAAc,OAAO,QAAQ,IAAI,OAAO,WAAW;AAAA,IAC7D,WAAW,OAAO,OAAO,cAAc,WACnC,OAAO,YACP,OAAO,OAAO,cAAc,WAC1B,OAAO,YACP;AAAA,IACN,WAAW,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AAAA,EACvE;AACF;AAEA,SAAS,cAAc,OAAqD;AAC1E,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,eAAe,KAAK,MAAM,OAAO,aAAa,OAAO,eAAe,KAAK,MAAM,MAAM;AAC9F,WAAO;AAAA,EACX;AACE,SAAO;AACT;;;ACdO,SAAS,wBAAwB,UAAsC;AAC1E,MAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC1B,WAAO,CAAC;AAAA,EACZ;AACA,SAAO,SACF,IAAI,CAAC,SAAS,UAAU,uBAAuB,SAAS,KAAK,CAAC,EAC9D,OAAO,CAAC,YAAsC,QAAQ,OAAO,CAAC;AACvE;AAEO,SAAS,eAAe,SAAwD;AACnF,MAAI,CAAC,WAAW,CAAC,MAAM,QAAQ,QAAQ,OAAO,GAAG;AAC7C,WAAO;AAAA,EACX;AACA,QAAM,eAAe,QAAQ,QACxB,OAAO,CAAC,YAAiD,QAAQ,SAAS,MAAM,EAChF,IAAI,CAAC,YAAY,QAAQ,KAAK,KAAK,CAAC,EACpC,OAAO,CAAC,YAAY,QAAQ,SAAS,CAAC;AAC3C,SAAO,aAAa,SAAS,IAAI,aAAa,KAAK,IAAI,IAAI;AAC/D;AAEA,SAAS,uBAAuB,SAAkB,OAA0C;AACxF,MAAI,gBAAgB,OAAO,GAAG;AAC1B,WAAO;AAAA,EACX;AACA,MAAI,6BAA6B,OAAO,GAAG;AACvC,WAAO,+BAA+B,SAAS,KAAK;AAAA,EACxD;AACA,MAAI,cAAc,OAAO,GAAG;AACxB,UAAM,MAAM;AAEZ,QAAI,OAAO,IAAI,SAAS,UAAU;AAC9B,aAAO,sBAAsB,KAAK,KAAK;AAAA,IAC3C;AAEA,QAAI,OAAO,IAAI,SAAS,UAAU;AAC9B,YAAM,OAAO,uBAAuB,IAAI,IAAI;AAC5C,aAAO;AAAA,QACH,IAAI,OAAO,IAAI,OAAO,YAAY,IAAI,KAAK,IAAI,KAAK,gBAAgB,KAAK;AAAA,QACzE;AAAA,QACA,SAAS,qBAAqB,IAAI,OAAO;AAAA,QACzC,WAAW,eAAe,IAAI,cAAc,IAAI,SAAS;AAAA,QACzD,YAAY,OAAO,IAAI,iBAAiB,WAAW,IAAI,eAAe;AAAA,QACtE,UAAU,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AAAA,QACpD,UAAU,cAAc,IAAI,QAAQ,IAAK,IAAI,WAAuC;AAAA,QACpF,KAAK;AAAA,MACT;AAAA,IACJ;AAAA,EACJ;AACA,MAAI,OAAO,YAAY,UAAU;AAC7B,WAAO;AAAA,MACH,IAAI,gBAAgB,KAAK;AAAA,MACzB,MAAM;AAAA,MACN,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,MACzC,KAAK;AAAA,IACT;AAAA,EACJ;AACA,SAAO;AAAA,IACH,IAAI,gBAAgB,KAAK;AAAA,IACzB,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,IACzC,KAAK;AAAA,EACT;AACJ;AAOA,SAAS,6BAA6B,OAAqD;AACvF,MAAI,CAAC,cAAc,KAAK,GAAG;AACvB,WAAO;AAAA,EACX;AACA,MAAI,EAAE,YAAY,QAAQ;AACtB,WAAO;AAAA,EACX;AACA,SAAO,cAAe,MAA8B,MAAM;AAC9D;AAEA,SAAS,+BAA+B,SAAqC,OAA8B;AACvG,QAAM,YAAY,uBAAuB,QAAQ,EAAE;AACnD,QAAM,SAAS,QAAQ,UAAU,CAAC;AAClC,QAAM,OAAO,mBAAmB,SAAS;AACzC,QAAM,UAAU,qBAAqB,OAAO,OAAO;AACnD,QAAM,WAAW,cAAc,MAAM;AACrC,QAAM,YAAY,iBAAiB,MAAM;AACzC,QAAM,YAAY;AAAA,IACb,eAAe,OAAO,iBAAiB,GAAG,cACvC,eAAe,OAAO,iBAAiB,GAAG,iBAC1C,OAAO;AAAA,EACf;AACA,QAAM,aAAa,OAAO,OAAO,iBAAiB,WAAW,OAAO,eAAe;AACnF,QAAM,WAAW,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AACjE,QAAM,YACD,OAAO,OAAO,OAAO,YAAY,OAAO,MACxC,OAAO,OAAO,iBAAiB,YAAY,OAAO,gBACnD,gBAAgB,KAAK;AAEzB,QAAM,aAA4B;AAAA,IAC9B,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,EACT;AAEA,SAAO;AACX;AAEA,SAAS,sBAAsB,OAAgC,OAA8B;AACzF,QAAM,OAAO,gBAAgB,OAAO,MAAM,IAAI,CAAC;AAC/C,QAAM,UAAU,qBAAqB,MAAM,OAAO;AAClD,QAAM,WAAW,cAAc,MAAM,QAAQ,IAAK,MAAM,WAAuC;AAC/F,QAAM,YAAY,eAAe,MAAM,aAAa,MAAM,UAAU;AACpE,QAAM,aAAa,OAAO,MAAM,eAAe,WAAW,MAAM,aAAa;AAC7E,QAAM,WAAW,OAAO,MAAM,aAAa,WAAW,MAAM,WAAW;AACvE,QAAM,YAAY,OAAO,MAAM,OAAO,YAAY,MAAM,GAAG,SAAS,IAAI,MAAM,KAAK,gBAAgB,KAAK;AACxG,SAAO;AAAA,IACH,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,EACT;AACJ;AAEA,SAAS,qBAAqB,OAAwC;AAClE,QAAM,WAAmC,CAAC;AAC1C,gBAAc,OAAO,QAAQ;AAC7B,MAAI,SAAS,WAAW,GAAG;AACvB,aAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,GAAG,CAAC;AAAA,EAC5C;AACA,SAAO;AACX;AAEA,SAAS,cAAc,OAAgB,UAAwC;AAC3E,MAAI,OAAO,UAAU,UAAU;AAC3B,aAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAC3C;AAAA,EACJ;AACA,MAAI,UAAU,QAAQ,OAAO,UAAU,aAAa;AAChD;AAAA,EACJ;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,UAAM,QAAQ,CAAC,UAAU,cAAc,OAAO,QAAQ,CAAC;AACvD;AAAA,EACJ;AACA,MAAI,cAAc,KAAK,GAAG;AACtB,QAAI,OAAO,MAAM,SAAS,aAAa,MAAM,SAAS,UAAU,OAAO,MAAM,SAAS,cAAc;AAChG,eAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC;AAChD;AAAA,IACJ;AAAA,EACJ;AACA,WAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAC/C;AAEA,SAAS,cAAc,QAAsE;AACzF,QAAM,WAAoC,CAAC;AAC3C,MAAI,cAAc,OAAO,QAAQ,GAAG;AAChC,WAAO,OAAO,UAAU,OAAO,QAAmC;AAAA,EACtE;AACA,MAAI,cAAc,OAAO,iBAAiB,GAAG;AACzC,aAAS,WAAW,OAAO;AAAA,EAC/B;AACA,MAAI,cAAc,OAAO,cAAc,GAAG;AACtC,aAAS,QAAQ,OAAO;AAAA,EAC5B;AACA,QAAM,aAAa,eAAe,OAAO,iBAAiB;AAC1D,MAAI,cAAc,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AAClD,aAAS,aAAa;AAAA,EAC1B;AACA,SAAO,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,WAAW;AACzD;AAEA,SAAS,iBAAiB,QAAqD;AAC3E,QAAM,WAAW,eAAe,OAAO,iBAAiB;AACxD,QAAM,QAAS,UAAU,cAAsC,OAAO;AACtE,MAAI,OAAO,UAAU,UAAU;AAC3B,UAAM,OAAO,KAAK,MAAM,KAAK;AAC7B,QAAI,CAAC,OAAO,MAAM,IAAI,GAAG;AACrB,aAAO;AAAA,IACX;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,eAAe,OAAqD;AACzE,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACvB,WAAO;AAAA,EACX;AACA,QAAM,YAAY,MACb,IAAI,CAAC,OAAO,UAAU,cAAc,OAAO,KAAK,CAAC,EACjD,OAAO,CAAC,UAA0C,QAAQ,KAAK,CAAC;AACrE,SAAO,UAAU,SAAS,IAAI,YAAY;AAC9C;AAEA,SAAS,cAAc,OAAgB,OAAkD;AACrF,MAAI,CAAC,cAAc,KAAK,GAAG;AACvB,WAAO;AAAA,EACX;AAEA,QAAM,eAAe,eAAe,MAAM,QAAQ;AAClD,QAAM,KACD,OAAO,MAAM,OAAO,YAAY,MAAM,MACtC,OAAO,cAAc,OAAO,YAAY,aAAa,MACtD,iBAAiB,KAAK;AAC1B,QAAM,OACD,OAAO,cAAc,SAAS,YAAY,aAAa,QACvD,OAAO,MAAM,SAAS,YAAY,MAAM,QACzC;AACJ,QAAM,OAAO,mBAAmB,cAAc,aAAa,MAAM,aAAa,MAAM,IAAI;AAExF,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,aAAa,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc;AAAA,EAC7E;AACJ;AAEA,SAAS,mBAAmB,OAAyB;AACjD,MAAI,OAAO,UAAU,UAAU;AAC3B,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,GAAG,GAAG;AACpD,UAAI;AACA,eAAO,KAAK,MAAM,OAAO;AAAA,MAC7B,QAAQ;AACJ,eAAO;AAAA,MACX;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,WAAO,MAAM,IAAI,CAAC,UAAU,mBAAmB,KAAK,CAAC;AAAA,EACzD;AACA,MAAI,cAAc,KAAK,GAAG;AACtB,UAAM,aAAsC,CAAC;AAC7C,WAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC5C,iBAAW,GAAG,IAAI,mBAAmB,KAAK;AAAA,IAC9C,CAAC;AACD,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEA,SAAS,mBAAmB,WAAkD;AAC1E,UAAQ,WAAW;AAAA,IACf,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAO;AAAA,EACf;AACJ;AAEA,SAAS,gBAAgB,MAAiC;AACtD,QAAM,aAAa,KAAK,YAAY;AACpC,MAAI,eAAe,UAAU,eAAe,eAAe,eAAe,YAAY,eAAe,QAAQ;AACzG,WAAO;AAAA,EACX;AACA,SAAO,eAAe,aAAa,SAAS;AAChD;AAEA,SAAS,uBAAuB,MAAiC;AAC7D,QAAM,aAAa,KAAK,YAAY;AACpC,UAAQ,YAAY;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAO;AAAA,EACf;AACJ;AAEA,SAAS,uBAAuB,YAAyC;AACrE,MAAI,OAAO,eAAe,UAAU;AAChC,WAAO,WAAW,MAAM,GAAG,EAAE,IAAI;AAAA,EACrC;AACA,MAAI,MAAM,QAAQ,UAAU,KAAK,OAAO,WAAW,WAAW,SAAS,CAAC,MAAM,UAAU;AACpF,WAAO,WAAW,WAAW,SAAS,CAAC;AAAA,EAC3C;AACA,SAAO;AACX;AAEA,SAAS,gBAAgB,OAAwC;AAC7D,SACI,cAAc,KAAK,KACnB,OAAQ,MAA6B,SAAS,YAC9C,MAAM,QAAS,MAAgC,OAAO;AAE9D;AAEA,SAAS,cAAc,OAAkD;AACrE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC9E;AAEA,SAAS,eAAe,OAAqD;AACzE,SAAO,cAAc,KAAK,IAAK,QAAoC;AACvE;AAEA,SAAS,gBAAgB,OAAuB;AAC5C,MAAI,OAAO,WAAW,WAAW,eAAe,gBAAgB,WAAW,QAAQ;AAC/E,WAAO,WAAW,OAAO,WAAW;AAAA,EACxC;AACA,SAAO,OAAO,KAAK,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAClE;AAEA,SAAS,iBAAiB,OAAuB;AAC7C,SAAO,aAAa,KAAK,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACxE;;;AClXA,SAAS,iBAAiB,OAAuC;AAC7D,MAAI,OAAO,UAAU,WAAW;AAC5B,WAAO;AAAA,EACX;AACA,MAAI,OAAO,UAAU,UAAU;AAC3B,WAAO,MAAM,YAAY,MAAM,UAAU,UAAU;AAAA,EACvD;AACA,SAAO;AACX;AAEA,IAAM,aACF,OAAO,eAAe,cACf,WAAmD,sBACpD;AAEV,IAAM,WAAW,MAAM;AACnB,MAAI,OAAO,eAAe,aAAa;AACnC,WAAO;AAAA,EACX;AACA,QAAM,eAAgB,WAAiE;AACvF,SAAO,cAAc,KAAK;AAC9B,GAAG;AAEH,IAAM,iBAAiB,iBAAiB,UAAU,KAAK,iBAAiB,OAAO,KAAK;AAE7E,SAAS,SAAS,OAAe,SAAiD;AACrF,MAAI,CAAC,gBAAgB;AACjB;AAAA,EACJ;AACA,QAAM,gBAAgB,OAAO,eAAe,cAAc,WAAW,UAAU;AAC/E,QAAM,QACF,iBAAiB,OAAO,cAAc,UAAU,aAC1C,cAAc,MAAM,KAAK,aAAa,IACtC,eAAe,KAAK,KAAK,aAAa;AAChD,MAAI,CAAC,OAAO;AACR;AAAA,EACJ;AACA,QAAM,UAAU,OAAO,YAAY,WAAW,UAAU,KAAK,UAAU,SAAS,CAAC,GAAG,UAAU,OAAO,CAAC;AACtG,QAAM,oBAAmB,oBAAI,KAAK,GAAE,YAAY,CAAC,KAAK,KAAK,KAAK,OAAO;AAC3E;;;AHiCO,IAAM,QAAN,MAAY;AAAA,EACP;AAAA,EACA,QAA4B,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACS;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,QAAQ;AAAA,EAEhB,YAAY,SAAuB;AAC/B,SAAK,WAAW,QAAQ;AACxB,SAAK,YAAY,QAAQ;AACzB,SAAK,cAAc,QAAQ;AAC3B,SAAK,eAAe,QAAQ,gBAAgB,IAAI,6BAAY;AAC5D,SAAK,SAAS,QAAQ,iBAAiB;AACvC,aAAS,cAAc;AAAA,MACnB,cAAc,QAAQ,KAAK,SAAS;AAAA,MACpC,gBAAgB,QAAQ,KAAK,WAAW;AAAA,MACxC,cAAc,KAAK,aAAa,aAAa,QAAQ;AAAA,IACzD,CAAC;AAAA,EACL;AAAA,EAEA,UAAU,QAAsB;AAC5B,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,UAAU,OAAiC;AACvC,SAAK,QAAQ;AACb,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,MAAM,YAAY,QAA0C;AACxD,UAAM,EAAE,UAAU,WAAW,QAAQ,IAAI;AACzC,UAAM,WAAW,MAAM,KAAK,SAAS,aAAa,UAAU,WAAW,OAAO;AAC9E,UAAM,YAAY,aAAa,KAAK,SAAS,eAAe,QAAQ,EAAE,CAAC;AACvE,QAAI,CAAC,WAAW;AACZ,YAAM,IAAI,MAAM,2CAA2C,QAAQ,IAAI;AAAA,IAC3E;AACA,SAAK,gBAAgB;AAAA,MACjB;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACJ;AACA,aAAS,qBAAqB,EAAE,UAAU,WAAW,QAAQ,CAAC;AAC9D,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,MAAM,IAAI,SAAgD;AACtD,UAAM,EAAE,MAAM,IAAI;AAClB,QAAI,CAAC,KAAK,eAAe;AACrB,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACzE;AAEA,QAAI,CAAC,SAAS,MAAM,KAAK,EAAE,WAAW,GAAG;AACrC,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACvD;AAEA,UAAM,QAAQ,MAAM,KAAK,YAAY;AACrC,UAAM,QAAQ,KAAK,WAAW;AAC9B,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,YAAY,oBAAI,KAAK;AAC3B,aAAS,mBAAmB;AAAA,MACxB;AAAA,MACA;AAAA,MACA,UAAU,KAAK,cAAc;AAAA,MAC7B,OAAO,KAAK,cAAc;AAAA,MAC1B,cAAc,MAAM,MAAM,GAAG,GAAG;AAAA,IACpC,CAAC;AAED,UAAM,eAAe,KAAK,oBAAoB,SAAS,QAAQ;AAE/D,UAAM,YAAY,MAAM,MAAM;AAAA,MAC1B;AAAA,QACI,UAAU;AAAA,UACN;AAAA,YACI,MAAM;AAAA,YACN,SAAS;AAAA,UACb;AAAA,QACJ;AAAA,MACJ;AAAA,MACA;AAAA,IACJ;AAEA,UAAM,aAAa,oBAAI,KAAK;AAC5B,UAAM,WAAW,KAAK,0BAA0B,SAAS;AACzD,UAAM,KAAK,sBAAsB,UAAU,OAAO,QAAQ;AAE1D,UAAM,SAAsB;AAAA,MACxB;AAAA,MACA;AAAA,MACA,YAAY,WAAW,QAAQ,IAAI,UAAU,QAAQ;AAAA,MACrD;AAAA,MACA,UAAU,KAAK,gBAAgB,QAAQ;AAAA,MACvC,KAAK;AAAA,IACT;AAEA,UAAM,KAAK,WAAW,gBAAgB,MAAM;AAC5C,aAAS,sBAAsB,EAAE,OAAO,YAAY,OAAO,YAAY,iBAAiB,OAAO,OAAO,aAAa,WAAY,OAAO,SAAoB,MAAM,GAAG,GAAG,IAAI,OAAU,CAAC;AAErL,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,aAAa,SAA+D;AAC/E,UAAM,EAAE,MAAM,IAAI;AAClB,QAAI,CAAC,KAAK,eAAe;AACrB,YAAM,IAAI,MAAM,8DAA8D;AAAA,IAClF;AAEA,QAAI,CAAC,SAAS,MAAM,KAAK,EAAE,WAAW,GAAG;AACrC,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACvD;AAEA,UAAM,QAAQ,MAAM,KAAK,YAAY;AACrC,UAAM,QAAQ,KAAK,WAAW;AAC9B,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,YAAY,oBAAI,KAAK;AAC3B,aAAS,4BAA4B;AAAA,MACjC;AAAA,MACA;AAAA,MACA,UAAU,KAAK,cAAc;AAAA,MAC7B,OAAO,KAAK,cAAc;AAAA,MAC1B,cAAc,MAAM,MAAM,GAAG,GAAG;AAAA,IACpC,CAAC;AAGD,UAAM,eAAe,KAAK,oBAAoB,SAAS,QAAQ;AAE/D,UAAM,SAAS,MAAM;AAAA,MACjB;AAAA,QACI,UAAU;AAAA,UACN;AAAA,YACI,MAAM;AAAA,YACN,SAAS;AAAA,UACb;AAAA,QACJ;AAAA,MACJ;AAAA,MACA;AAAA,IACJ;AAEA,QAAI;AACJ,QAAI,mBAAmB;AACvB,QAAI;AACA,uBAAiB,SAAS,QAAQ;AAC9B,cAAM,gBAAgB,KAAK,yBAAyB,KAAK;AACzD,cAAM,QAAQ,KAAK,sBAAsB,KAAK;AAI9C,YAAI;AACJ,cAAM,aAAa,MAAM,UAAU;AACnC,cAAM,cAAc,MAAM,UAAU,mBAAmB,MAAM,UAAU;AACvE,cAAM,qBAAqB,eAAe,MAAM,MAAM,SAAS,MAAM,KAAK,MAAM,MAAM,SAAS,MAAM;AAErG,aAAK,cAAc,sBAAsB,gBAAgB,cAAc,WAAW,GAAG;AACjF,cAAI;AACA,kBAAM,QAAQ,MAAM,KAAK,aAAa,SAAS,EAAE,cAAc,EAAE,WAAW,SAAS,EAAE,CAAC;AACxF,gBAAI,OAAO;AACP,oBAAM,qBAAqB,KAAK,8BAA8B,KAAK;AAEnE,oBAAM,kBAAkB,mBAAmB,KAAK,CAAC,QAAQ,IAAI,aAAa,IAAI,SAAS,MAAM;AAC7F,kBAAI,mBAAmB,SAAS,oBAAoB,iBAAiB;AACjE,iCAAiB;AACjB,mCAAmB,mBAAmB;AAAA,cAC1C;AAAA,YACJ;AAAA,UACJ,QAAQ;AAAA,UAER;AAAA,QACJ,WAAW,cAAc,SAAS,GAAG;AAEjC,cAAI,cAAc,SAAS,kBAAkB;AACzC,6BAAiB;AACjB,+BAAmB,cAAc;AAAA,UACrC;AAAA,QACJ;AAIA,YAAI,SAAS,gBAAgB;AACzB,gBAAM;AAAA,YACF,MAAM;AAAA,YACN,GAAI,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,GAAG;AAAA,YACpC,UAAU;AAAA,YACV;AAAA,YACA;AAAA,UACJ;AAAA,QACJ;AAEA,cAAM,SAAS,KAAK,uBAAuB,KAAK;AAChD,YAAI,QAAQ;AACR,sBAAY;AAAA,QAChB;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,eAAS,4BAA4B;AAAA,QACjC;AAAA,QACA,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAClE,CAAC;AACD,YAAM;AAAA,IACV;AAEA,QAAI,CAAC,WAAW;AACZ,YAAM,IAAI,MAAM,6DAA6D;AAAA,IACjF;AAEA,UAAM,aAAa,oBAAI,KAAK;AAC5B,UAAM,WAAW,KAAK,0BAA0B,SAAS;AACzD,UAAM,KAAK,sBAAsB,UAAU,OAAO,QAAQ;AAE1D,UAAM,SAAsB;AAAA,MACxB;AAAA,MACA;AAAA,MACA,YAAY,WAAW,QAAQ,IAAI,UAAU,QAAQ;AAAA,MACrD;AAAA,MACA,UAAU,KAAK,gBAAgB,QAAQ;AAAA,MACvC,KAAK;AAAA,IACT;AAEA,UAAM,KAAK,WAAW,gBAAgB,MAAM;AAC5C,aAAS,+BAA+B;AAAA,MACpC;AAAA,MACA,YAAY,OAAO;AAAA,MACnB,iBAAiB,OAAO,OAAO,aAAa,WAAY,OAAO,SAAoB,MAAM,GAAG,GAAG,IAAI;AAAA,IACvG,CAAC;AAED,UAAM;AAAA,MACF,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,iBAAiB,UAAsD;AACzE,UAAM,CAAC,UAAU,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,MACxC,KAAK,aAAa,KAAK,QAAQ;AAAA,MAC/B,KAAK,uBAAuB,QAAQ;AAAA,IACxC,CAAC;AAED,QAAI,CAAC,YAAY,CAAC,OAAO;AACrB,aAAO;AAAA,IACX;AAEA,UAAM,sBAAsB,QAAQ,KAAK,MAAM,MAAM,WAAW,EAAE,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI;AAC7F,UAAM,eAAe,WAAW,EAAE,GAAG,SAAS,IAAI,eAAe,EAAE,UAAU,WAAW,qBAAqB,WAAW,oBAAoB,CAAC;AAC7I,UAAM,WAAW,QAAQ,KAAK,8BAA8B,KAAK,IAAI,CAAC;AAEtE,WAAO;AAAA,MACH,GAAG;AAAA,MACH,WAAW,UAAU,aAAa;AAAA,MAClC;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,oBAAoB,SAA0B,UAAkC;AACpF,UAAM,YAAY,KAAK,WAAW,eAAe;AACjD,WAAO;AAAA,MACH,cAAc;AAAA,QACV,WAAW;AAAA,QACX,GAAI,QAAQ,gBAAgB,CAAC;AAAA,MACjC;AAAA,MACA,UAAU,QAAQ;AAAA,MAClB,WAAW,aAAa;AAAA,MACxB,QAAQ,QAAQ;AAAA,IACpB;AAAA,EACJ;AAAA,EAGA,MAAc,cAAsC;AAChD,QAAI,CAAC,KAAK,eAAe;AACrB,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACxC;AAEA,QAAI,KAAK,iBAAiB,CAAC,KAAK,OAAO;AACnC,aAAO,KAAK;AAAA,IAChB;AAEA,SAAK,oBAAgB,+BAAY;AAAA,MAC7B,OAAO,KAAK,cAAc;AAAA,MAC1B,OAAO,MAAM,QAAQ,KAAK,KAAK,IAAI,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC;AAAA,MACtD,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,IACvB,CAAC;AACD,SAAK,QAAQ;AACb,WAAO,KAAK;AAAA,EAChB;AAAA,EAEQ,0BAA0B,QAAkC;AAChE,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,EAAE,cAAc,SAAS;AAClE,aAAO,CAAC;AAAA,IACZ;AACA,UAAM,WAAY,OAAkC;AACpD,QAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC1B,aAAO,CAAC;AAAA,IACZ;AACA,WAAO,wBAAwB,QAAQ;AAAA,EAC3C;AAAA,EAEQ,8BAA8B,OAAyC;AAC3E,UAAM,gBAAgB,MAAM,YAAY;AACxC,QAAI,CAAC,eAAe;AAChB,aAAO,CAAC;AAAA,IACZ;AACA,UAAM,WAAW,cAAc;AAC/B,QAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC1B,aAAO,CAAC;AAAA,IACZ;AACA,WAAO,wBAAwB,QAAQ;AAAA,EAC3C;AAAA,EAEQ,uBAAuB,OAAyC;AACpE,UAAM,SAAS,OAAO,MAAM;AAC5B,QAAI,KAAK,uBAAuB,MAAM,GAAG;AACrC,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,yBAAyB,OAAqC;AAElE,UAAM,SAAS,KAAK,uBAAuB,KAAK;AAChD,QAAI,QAAQ;AACR,aAAO,KAAK,0BAA0B,MAAM;AAAA,IAChD;AAIA,UAAM,aAAa,OAAO,MAAM;AAChC,QAAI,cAAc,OAAO,eAAe,YAAY,cAAc,YAAY;AAC1E,YAAM,WAAY,WAAsC;AACxD,UAAI,MAAM,QAAQ,QAAQ,GAAG;AACzB,eAAO,wBAAwB,QAAQ;AAAA,MAC3C;AAAA,IACJ;AAGA,UAAM,QAAQ,OAAO,MAAM;AAC3B,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACrC,aAAO,CAAC;AAAA,IACZ;AAGA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,aAAO,wBAAwB,KAAK;AAAA,IACxC;AAGA,QAAI,cAAc,OAAO;AACrB,YAAM,WAAY,MAAiC;AACnD,UAAI,MAAM,QAAQ,QAAQ,GAAG;AACzB,eAAO,wBAAwB,QAAQ;AAAA,MAC3C;AAAA,IACJ;AAGA,QAAI,aAAa,SAAS,UAAU,SAAS,QAAQ,SAAS,YAAY,OAAO;AAC7E,aAAO,wBAAwB,CAAC,KAAK,CAAC;AAAA,IAC1C;AAEA,WAAO,CAAC;AAAA,EACZ;AAAA,EAEQ,sBAAsB,OAAwC;AAClE,QAAI,CAAC,MAAM,MAAM,SAAS,SAAS,GAAG;AAClC,aAAO;AAAA,IACX;AACA,UAAM,QAAQ,MAAM,MAAM;AAC1B,QAAI,OAAO,UAAU,eAAe,UAAU,MAAM;AAChD,aAAO;AAAA,IACX;AACA,UAAM,QAAQ,KAAK,yBAAyB,KAAK;AACjD,WAAO,SAAS,MAAM,SAAS,IAAI,QAAQ;AAAA,EAC/C;AAAA,EAEQ,yBAAyB,OAAoC;AACjE,QAAI,OAAO,UAAU,UAAU;AAC3B,aAAO;AAAA,IACX;AACA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,YAAM,WAAW,MACZ,IAAI,CAAC,UAAU;AACZ,YAAI,OAAO,UAAU,UAAU;AAC3B,iBAAO;AAAA,QACX;AACA,YAAI,SAAS,OAAO,UAAU,UAAU;AACpC,cAAI,OAAQ,MAA6B,SAAS,UAAU;AACxD,mBAAQ,MAA2B;AAAA,UACvC;AACA,cAAI,OAAQ,MAAgC,YAAY,UAAU;AAC9D,mBAAQ,MAA8B;AAAA,UAC1C;AAAA,QACJ;AACA,eAAO;AAAA,MACX,CAAC,EACA,KAAK,EAAE;AACZ,aAAO,SAAS,SAAS,IAAI,WAAW;AAAA,IAC5C;AACA,QAAI,SAAS,OAAO,UAAU,UAAU;AACpC,YAAM,YAAa,MAA6B;AAChD,UAAI,OAAO,cAAc,UAAU;AAC/B,eAAO;AAAA,MACX;AACA,YAAM,eAAgB,MAAgC;AACtD,YAAM,cAAc,KAAK,yBAAyB,YAAY;AAC9D,UAAI,aAAa;AACb,eAAO;AAAA,MACX;AACA,YAAM,eAAgB,MAA8C;AACpE,UAAI,cAAc;AACd,cAAM,cAAc,KAAK,yBAAyB,aAAa,OAAO;AACtE,YAAI,aAAa;AACb,iBAAO;AAAA,QACX;AAAA,MACJ;AACA,YAAM,aAAc,MAA8B;AAClD,UAAI,YAAY;AACZ,cAAM,YAAY,KAAK,yBAAyB,UAAU;AAC1D,YAAI,WAAW;AACX,iBAAO;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,uBAAuB,OAAkD;AAC7E,WAAO;AAAA,MACH,SACA,OAAO,UAAU,YACjB,cAAe,SACf,MAAM,QAAS,MAAiC,QAAQ;AAAA,IAC5D;AAAA,EACJ;AAAA,EAEQ,gBAAgB,UAAoC;AACxD,QAAI,SAAS,WAAW,GAAG;AACvB,aAAO;AAAA,IACX;AACA,UAAM,OAAO,SAAS,SAAS,SAAS,CAAC;AACzC,WAAO,eAAe,IAAI,KAAK,KAAK;AAAA,EACxC;AAAA,EAEA,MAAc,sBAAsB,UAAkB,OAAe,UAA0C;AAC3G,QAAI,CAAC,KAAK,aAAa;AACnB;AAAA,IACJ;AACA,UAAM,WAAW,MAAM,KAAK,YAAY,KAAK,QAAQ;AACrD,UAAM,WAAoC,EAAE,GAAI,UAAU,YAAY,CAAC,EAAG;AAC1E,aAAS,YAAY;AACrB,aAAS,QAAQ,KAAK,eAAe;AACrC,UAAM,cAAc,SAAS,SAAS,SAAS,CAAC;AAChD,UAAM,UAAU,eAAe,WAAW;AAC1C,QAAI,SAAS;AACT,eAAS,qBAAqB,QAAQ,MAAM,GAAG,GAAG;AAAA,IACtD;AACA,QAAI,aAAa,MAAM;AACnB,eAAS,kBAAkB,YAAY;AAAA,IAC3C;AACA,UAAM,KAAK,YAAY;AAAA,MACnB,eAAe;AAAA,QACX;AAAA,QACA,OAAO,UAAU;AAAA,QACjB;AAAA,QACA,WAAW,UAAU;AAAA,MACzB,CAAC;AAAA,IACL;AACA,aAAS,2BAA2B,EAAE,UAAU,WAAW,MAAM,CAAC;AAAA,EACtE;AAAA,EAEA,MAAM,cAAc,UAA+C;AAC/D,QAAI,CAAC,KAAK,eAAe;AACrB,YAAM,IAAI,MAAM,+DAA+D;AAAA,IACnF;AAEA,UAAM,UAAU,MAAM,KAAK,iBAAiB,QAAQ;AACpD,QAAI,CAAC,WAAW,QAAQ,SAAS,WAAW,GAAG;AAC3C,aAAO;AAAA,IACX;AAEA,UAAM,mBAAmB,QAAQ,SAC5B,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,eAAe,CAAC,KAAK,EAAE,EAAE,EAClD,KAAK,IAAI;AAEd,UAAM,SAAS;AAAA;AAAA;AAAA,EAGrB,gBAAgB;AAEV,UAAM,WAAW,MAAM,KAAK,cAAc,SAAS,OAAO;AAAA,MACtD,EAAE,MAAM,QAAQ,SAAS,OAAO;AAAA,IACpC,CAAC;AAED,UAAM,UAAU,SAAS;AACzB,QAAI,QAAQ;AACZ,QAAI,OAAO,YAAY,UAAU;AAC7B,cAAQ;AAAA,IACZ,WAAW,MAAM,QAAQ,OAAO,GAAG;AAC/B,cAAQ,QAAQ,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,IAAK,EAAwB,QAAQ,EAAG,EAAE,KAAK,EAAE;AAAA,IACzG;AAEA,UAAM,aAAa,MAAM,QAAQ,gBAAgB,EAAE,EAAE,KAAK;AAE1D,QAAI,cAAc,KAAK,aAAa;AAChC,YAAM,WAAW,MAAM,KAAK,YAAY,KAAK,QAAQ;AACrD,YAAM,KAAK,YAAY;AAAA,QACnB,eAAe;AAAA,UACX;AAAA,UACA,OAAO;AAAA,UACP,UAAU,UAAU;AAAA,UACpB,WAAW,UAAU;AAAA,UACrB,WAAW,KAAK,IAAI;AAAA,QACxB,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,uBAAuB,UAAwD;AACzF,QAAI;AACA,aAAO,MAAM,KAAK,aAAa,SAAS,EAAE,cAAc,EAAE,WAAW,SAAS,EAAE,CAAC;AAAA,IACrF,SAAS,OAAO;AACZ,eAAS,qCAAqC;AAAA,QAC1C;AAAA,QACA,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAClE,CAAC;AACD,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEQ,aAAqB;AACzB,QAAI,OAAO,WAAW,WAAW,eAAe,gBAAgB,WAAW,QAAQ;AAC/E,aAAO,WAAW,OAAO,WAAW;AAAA,IACxC;AACA,WAAO,OAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,EACzD;AACJ;;;AItmBA,IAAAC,oBAA4B;AAG5B,IAAAC,oBAA4B;AASrB,SAAS,WAAW,QAA0B;AACjD,QAAM,EAAE,OAAO,QAAQ,CAAC,GAAG,cAAc,aAAa,IAAI;AAC1D,QAAM,WAAW,MAAM,QAAQ,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC;AACtD,aAAO,+BAAY;AAAA,IACf;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,cAAc,gBAAgB,IAAI,8BAAY;AAAA,EAClD,CAAC;AACL;;;ACZO,IAAM,gBAAN,MAAyC;AAAA,EAC5C,eAA0B;AACtB,WAAO;AAAA,EACX;AACJ;;;ACbA,IAAAC,oBAAgC;AAEhC,sBAAwB;AACxB,kBAAsC;AA4B/B,IAAM,oBAAN,MAA6C;AAAA,EAC/B;AAAA,EACA;AAAA,EAEjB,YAAY,SAAmC;AAC3C,UAAM;AAAA,MACF,kBAAkB;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACP,IAAI;AAEJ,QAAI,CAAC,aAAa,CAAC,aAAa,CAAC,SAAS;AACtC,YAAM,IAAI,MAAM,+DAA+D;AAAA,IACnF;AAEA,UAAM,MAAM,IAAI,wBAAQ;AAAA,MACpB,gBAAgB,CAAC,IAAI,kCAAsB;AAAA,QACvC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ,CAAC,CAAC;AAAA,IACN,CAAC;AAED,QAAI,MAAM;AACV,SAAK,UAAU,IAAI,kCAAgB,cAAc;AACjD,SAAK,kBAAkB;AAAA,EAC3B;AAAA,EAEA,eAA0B;AACtB,WAAO,CAAC,KAAK,OAAO;AAAA,EACxB;AAAA,EAEA,MAAM,gBAA+B;AACjC,QAAI,CAAC,KAAK,iBAAiB;AACvB;AAAA,IACJ;AACA,UAAM,aAAc,KAAK,QAAuD;AAChF,QAAI,OAAO,eAAe,YAAY;AAClC,YAAM,WAAW,KAAK,KAAK,OAAO;AAAA,IACtC;AAAA,EACJ;AACJ;;;AC5EA,uBAAuB;AACvB,8BAA4D;AAgBrD,IAAM,qBAAN,MAA8C;AAAA,EAChC;AAAA,EACA;AAAA,EAEjB,YAAY,SAAqC;AAC7C,UAAM;AAAA,MACF,kBAAkB;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACP,IAAI,WAAW,CAAC;AAEhB,QAAI,eAAe;AACnB,QAAI,CAAC,iBAAiB,UAAU,WAAW;AACvC,qBAAe,IAAI,wBAAO;AAAA,QACtB;AAAA,QACA,QAAQ;AAAA,MACZ,CAAC;AAAA,IACL;AAEA,SAAK,SAAS,IAAI,wCAAgB;AAAA,MAC9B,GAAG;AAAA,MACH,aAAa,WAAW,OAAO;AAAA,MAC/B,QAAQ;AAAA,IACZ,CAAC;AACD,SAAK,kBAAkB;AAAA,EAC3B;AAAA,EAEA,eAA0B;AACtB,WAAO,CAAC,KAAK,MAAM;AAAA,EACvB;AAAA,EAEA,MAAM,gBAA+B;AACjC,QAAI,CAAC,KAAK,iBAAiB;AACvB;AAAA,IACJ;AACA,UAAM,aAAc,KAAK,OAAsD;AAC/E,QAAI,OAAO,eAAe,YAAY;AAClC,YAAM,WAAW,KAAK,KAAK,MAAM;AAAA,IACrC;AAAA,EACJ;AACJ;;;AC1DO,IAAM,sBAAN,MAAiD;AAAA,EACrC,QAAQ,oBAAI,IAA4B;AAAA,EAEzD,MAAM,KAAK,UAAuD;AAChE,WAAO,KAAK,MAAM,IAAI,QAAQ;AAAA,EAChC;AAAA,EAEA,MAAM,MAAM,UAAyC;AACnD,SAAK,MAAM,IAAI,SAAS,UAAU,eAAe,QAAQ,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAM,OAAO,UAAiC;AAC5C,SAAK,MAAM,OAAO,QAAQ;AAAA,EAC5B;AAAA,EAEA,MAAM,OAAkC;AACtC,WAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAAA,EACjF;AAAA,EAEA,MAAM,QAAuB;AAC3B,SAAK,MAAM,MAAM;AAAA,EACnB;AACF;;;ACjBO,IAAM,0BAAN,MAAqD;AAAA,EACzC;AAAA,EACA;AAAA,EAEjB,YAAY,SAA0C;AACpD,SAAK,SAAS,SAAS,UAAU;AACjC,UAAM,UAAU,SAAS,YAAY,OAAO,WAAW,iBAAiB,cAAc,WAAW,eAAe;AAChH,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AACA,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,KAAK,UAAuD;AAChE,UAAM,MAAM,KAAK,QAAQ,QAAQ,KAAK,IAAI,QAAQ,CAAC;AACnD,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AACA,WAAO,KAAK,UAAU,GAAG;AAAA,EAC3B;AAAA,EAEA,MAAM,MAAM,UAAyC;AACnD,UAAM,aAAa,eAAe,QAAQ;AAC1C,SAAK,QAAQ,QAAQ,KAAK,IAAI,WAAW,QAAQ,GAAG,KAAK,UAAU,UAAU,CAAC;AAAA,EAChF;AAAA,EAEA,MAAM,OAAO,UAAiC;AAC5C,SAAK,QAAQ,WAAW,KAAK,IAAI,QAAQ,CAAC;AAAA,EAC5C;AAAA,EAEA,MAAM,OAAkC;AACtC,UAAM,UAA4B,CAAC;AACnC,aAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,QAAQ,SAAS,GAAG;AAC3D,YAAM,MAAM,KAAK,QAAQ,IAAI,KAAK;AAClC,UAAI,CAAC,OAAO,CAAC,IAAI,WAAW,KAAK,MAAM,GAAG;AACxC;AAAA,MACF;AACA,YAAM,QAAQ,KAAK,QAAQ,QAAQ,GAAG;AACtC,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AACA,YAAM,WAAW,KAAK,UAAU,KAAK;AACrC,UAAI,UAAU;AACZ,gBAAQ,KAAK,QAAQ;AAAA,MACvB;AAAA,IACF;AACA,WAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAAA,EACzD;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,OAAiB,CAAC;AACxB,aAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,QAAQ,SAAS,GAAG;AAC3D,YAAM,MAAM,KAAK,QAAQ,IAAI,KAAK;AAClC,UAAI,OAAO,IAAI,WAAW,KAAK,MAAM,GAAG;AACtC,aAAK,KAAK,GAAG;AAAA,MACf;AAAA,IACF;AACA,SAAK,QAAQ,CAAC,QAAQ,KAAK,QAAQ,WAAW,GAAG,CAAC;AAAA,EACpD;AAAA,EAEQ,IAAI,UAA0B;AACpC,WAAO,GAAG,KAAK,MAAM,IAAI,QAAQ;AAAA,EACnC;AAAA,EAEQ,UAAU,KAAyC;AACzD,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAI,CAAC,UAAU,OAAO,OAAO,aAAa,UAAU;AAClD,eAAO;AAAA,MACT;AACA,YAAM,WAAW,OAAO,YAAY,OAAO,OAAO,aAAa,WAAY,OAAO,WAAuC;AACzH,aAAO,eAAe;AAAA,QACpB,UAAU,OAAO;AAAA,QACjB,OAAO,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAAA,QACzD;AAAA,QACA,WAAW,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AAAA,QACrE,WAAW,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AAAA,MACvE,CAAC;AAAA,IACH,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACvFA,IAAM,kBAAkB;AACxB,IAAM,qBAAqB;AAOpB,IAAM,uBAAN,MAAkD;AAAA,EACtC;AAAA,EACA;AAAA,EACT;AAAA,EAER,YAAY,SAAuC;AACjD,QAAI,OAAO,WAAW,cAAc,aAAa;AAC/C,YAAM,IAAI,MAAM,iDAAiD;AAAA,IACnE;AACA,SAAK,SAAS,SAAS,UAAU;AACjC,SAAK,YAAY,SAAS,aAAa;AAAA,EACzC;AAAA,EAEA,MAAM,KAAK,UAAuD;AAChE,UAAM,KAAK,MAAM,KAAK,OAAO;AAC7B,WAAO,IAAI,QAAoC,CAAC,SAAS,WAAW;AAClE,YAAM,cAAc,GAAG,YAAY,KAAK,WAAW,UAAU;AAC7D,YAAM,QAAQ,YAAY,YAAY,KAAK,SAAS;AACpD,YAAM,UAAU,MAAM,IAAI,QAAQ;AAClC,cAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAC5C,cAAQ,YAAY,MAAM,QAAQ,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,IAClE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,UAAyC;AACnD,UAAM,KAAK,MAAM,KAAK,OAAO;AAC7B,UAAM,aAAa,eAAe,QAAQ;AAC1C,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,YAAM,cAAc,GAAG,YAAY,KAAK,WAAW,WAAW;AAC9D,YAAM,QAAQ,YAAY,YAAY,KAAK,SAAS;AACpD,YAAM,UAAU,MAAM,IAAI,UAAU;AACpC,cAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAC5C,cAAQ,YAAY,MAAM,QAAQ;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,UAAiC;AAC5C,UAAM,KAAK,MAAM,KAAK,OAAO;AAC7B,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,YAAM,cAAc,GAAG,YAAY,KAAK,WAAW,WAAW;AAC9D,YAAM,QAAQ,YAAY,YAAY,KAAK,SAAS;AACpD,YAAM,UAAU,MAAM,OAAO,QAAQ;AACrC,cAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAC5C,cAAQ,YAAY,MAAM,QAAQ;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAkC;AACtC,UAAM,KAAK,MAAM,KAAK,OAAO;AAC7B,WAAO,IAAI,QAA0B,CAAC,SAAS,WAAW;AACxD,YAAM,cAAc,GAAG,YAAY,KAAK,WAAW,UAAU;AAC7D,YAAM,QAAQ,YAAY,YAAY,KAAK,SAAS;AACpD,YAAM,UAAU,MAAM,OAAO;AAC7B,cAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAC5C,cAAQ,YAAY,MAAM;AACxB,cAAM,UAAU,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,SAAS,CAAC;AAClE;AAAA,UACE,QACG,IAAI,CAAC,UAAU,KAAK,UAAU,KAAK,CAAC,EACpC,OAAO,CAAC,UAAmC,QAAQ,KAAK,CAAC,EACzD,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAAA,QAC7C;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,MAAM,KAAK,OAAO;AAC7B,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,YAAM,cAAc,GAAG,YAAY,KAAK,WAAW,WAAW;AAC9D,YAAM,QAAQ,YAAY,YAAY,KAAK,SAAS;AACpD,YAAM,UAAU,MAAM,MAAM;AAC5B,cAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAC5C,cAAQ,YAAY,MAAM,QAAQ;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,SAA+B;AAC3C,QAAI,CAAC,KAAK,WAAW;AACnB,WAAK,YAAY,IAAI,QAAqB,CAAC,SAAS,WAAW;AAC/D,cAAM,UAAU,WAAW,UAAU,KAAK,KAAK,QAAQ,CAAC;AACtD,gBAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAC5C,gBAAQ,YAAY,MAAM,QAAQ,QAAQ,MAAM;AAChD,gBAAQ,kBAAkB,MAAM;AAC9B,gBAAM,KAAK,QAAQ;AACnB,cAAI,CAAC,GAAG,iBAAiB,SAAS,KAAK,SAAS,GAAG;AACjD,eAAG,kBAAkB,KAAK,WAAW,EAAE,SAAS,WAAW,CAAC;AAAA,UAC9D;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,UAAU,WAAgD;AAChE,QAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C,aAAO;AAAA,IACT;AACA,UAAM,WAAW;AACjB,QAAI,OAAO,SAAS,aAAa,UAAU;AACzC,aAAO;AAAA,IACT;AACA,UAAM,WAAW,SAAS,YAAY,OAAO,SAAS,aAAa,WAAY,SAAS,WAAuC;AAC/H,WAAO,eAAe;AAAA,MACpB,UAAU,SAAS;AAAA,MACnB,OAAO,OAAO,SAAS,UAAU,WAAW,SAAS,QAAQ;AAAA,MAC7D;AAAA,MACA,WAAW,OAAO,SAAS,cAAc,WAAW,SAAS,YAAY;AAAA,MACzE,WAAW,OAAO,SAAS,cAAc,WAAW,SAAS,YAAY;AAAA,IAC3E,CAAC;AAAA,EACH;AACF;;;AC/GO,IAAM,gBAAN,MAA2C;AAAA,EAC/B;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,SAA+B;AACzC,SAAK,YAAY,QAAQ;AACzB,SAAK,YAAY,QAAQ,iBAAiB;AAAA,EAC5C;AAAA,EAEA,MAAM,KAAK,UAAuD;AAChE,QAAI;AACF,YAAM,EAAE,IAAI,KAAK,IAAI,MAAM,KAAK,gBAAgB;AAChD,YAAM,OAAO,KAAK,SAAS,MAAM,QAAQ;AACzC,YAAM,WAAW,MAAM,GAAG,SAAS,MAAM,MAAM;AAC/C,aAAO,KAAK,UAAU,KAAK,MAAM,QAAQ,CAAC;AAAA,IAC5C,SAAS,OAAO;AACd,UAAI,KAAK,gBAAgB,KAAK,GAAG;AAC/B,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,UAAyC;AACnD,UAAM,aAAa,eAAe,QAAQ;AAC1C,UAAM,EAAE,IAAI,KAAK,IAAI,MAAM,KAAK,gBAAgB;AAChD,UAAM,KAAK,gBAAgB,EAAE;AAC7B,UAAM,OAAO,KAAK,SAAS,MAAM,WAAW,QAAQ;AACpD,UAAM,GAAG,UAAU,MAAM,KAAK,UAAU,UAAU,GAAG,MAAM;AAAA,EAC7D;AAAA,EAEA,MAAM,OAAO,UAAiC;AAC5C,QAAI;AACF,YAAM,EAAE,IAAI,KAAK,IAAI,MAAM,KAAK,gBAAgB;AAChD,YAAM,GAAG,OAAO,KAAK,SAAS,MAAM,QAAQ,CAAC;AAAA,IAC/C,SAAS,OAAO;AACd,UAAI,CAAC,KAAK,gBAAgB,KAAK,GAAG;AAChC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAkC;AACtC,UAAM,EAAE,IAAI,KAAK,IAAI,MAAM,KAAK,gBAAgB;AAC9C,UAAM,KAAK,gBAAgB,EAAE;AAC/B,UAAM,UAAU,MAAM,GAAG,QAAQ,KAAK,WAAW,EAAE,eAAe,KAAK,CAAC;AACxE,UAAM,YAA8B,CAAC;AACrC,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,KAAK,SAAS,GAAG;AAC3D;AAAA,MACF;AACA,YAAM,OAAO,KAAK,KAAK,KAAK,WAAW,MAAM,IAAI;AACjD,UAAI;AACF,cAAM,WAAW,MAAM,GAAG,SAAS,MAAM,MAAM;AAC/C,cAAM,WAAW,KAAK,UAAU,KAAK,MAAM,QAAQ,CAAC;AACpD,YAAI,UAAU;AACZ,oBAAU,KAAK,QAAQ;AAAA,QACzB;AAAA,MACF,SAAS,OAAO;AACd,YAAI,CAAC,KAAK,gBAAgB,KAAK,GAAG;AAChC,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,UAAU,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAAA,EAC3D;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,EAAE,IAAI,KAAK,IAAI,MAAM,KAAK,gBAAgB;AAC9C,UAAM,KAAK,gBAAgB,EAAE;AAC/B,UAAM,UAAU,MAAM,GAAG,QAAQ,KAAK,WAAW,EAAE,eAAe,KAAK,CAAC;AACxE,UAAM,QAAQ;AAAA,MACZ,QACG,OAAO,CAAC,UAAU,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,KAAK,SAAS,CAAC,EACvE,IAAI,CAAC,UAAU,GAAG,OAAO,KAAK,KAAK,KAAK,WAAW,MAAM,IAAI,CAAC,EAAE,MAAM,CAAC,UAAU;AAChF,YAAI,CAAC,KAAK,gBAAgB,KAAK,GAAG;AAChC,gBAAM;AAAA,QACR;AAAA,MACF,CAAC,CAAC;AAAA,IACN;AAAA,EACF;AAAA,EAEA,MAAc,kBAA+D;AAC3E,QAAI,CAAC,KAAK,YAAY,CAAC,KAAK,YAAY;AACtC,YAAM,CAAC,IAAI,IAAI,IAAI,MAAM,QAAQ,IAAI,CAAC,OAAO,aAAkB,GAAG,OAAO,MAAW,CAAC,CAAC;AACtF,WAAK,WAAW;AAChB,WAAK,aAAa;AAAA,IACpB;AACA,WAAO,EAAE,IAAI,KAAK,UAAW,MAAM,KAAK,WAAY;AAAA,EACtD;AAAA,EAEA,MAAc,gBAAgB,IAA6B;AACzD,QAAI,CAAC,KAAK,aAAa;AACrB,WAAK,cAAc,GAAG,MAAM,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC,EAAE,KAAK,MAAM,MAAS;AAAA,IACvF;AACA,UAAM,KAAK;AAEX,UAAM,GAAG,MAAM,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU;AACnE,UAAI,CAAC,KAAK,cAAc,KAAK,GAAG;AAC9B,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,SAAS,MAAkB,UAA0B;AAC3D,UAAM,WAAW,mBAAmB,QAAQ;AAC5C,WAAO,KAAK,KAAK,KAAK,WAAW,GAAG,QAAQ,GAAG,KAAK,SAAS,EAAE;AAAA,EACjE;AAAA,EAEQ,gBAAgB,OAAyB;AAC/C,WAAO,KAAK,QAAQ,OAAO,QAAQ;AAAA,EACrC;AAAA,EAEQ,cAAc,OAAyB;AAC7C,WAAO,KAAK,QAAQ,OAAO,QAAQ;AAAA,EACrC;AAAA,EAEQ,QAAQ,OAAgB,MAAuB;AACrD,WAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAU,MAA4B,SAAS;AAAA,EACjH;AAAA,EAEQ,UAAU,WAAgD;AAChE,QAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C,aAAO;AAAA,IACT;AACA,UAAM,WAAW;AACjB,QAAI,OAAO,SAAS,aAAa,UAAU;AACzC,aAAO;AAAA,IACT;AACA,UAAM,WAAW,SAAS,YAAY,OAAO,SAAS,aAAa,WAAY,SAAS,WAAuC;AAC/H,WAAO,eAAe;AAAA,MACpB,UAAU,SAAS;AAAA,MACnB,OAAO,OAAO,SAAS,UAAU,WAAW,SAAS,QAAQ;AAAA,MAC7D;AAAA,MACA,WAAW,OAAO,SAAS,cAAc,WAAW,SAAS,YAAY;AAAA,MACzE,WAAW,OAAO,SAAS,cAAc,WAAW,SAAS,YAAY;AAAA,IAC3E,CAAC;AAAA,EACH;AACF;;;ACvJA,IAAa,QAAQ;AACrB,IAAa,QAAQ;AACrB,IAAa,YAAY;AACzB,IAAa,YAAY;AACzB,IAAa,SAAS;;;ACGtB,IAAI,qBAAqB;AACzB,IAAI,wBAAwB;AAE5B,IAAI,MAAM,CAAA;AACV,IAAI,gBAAgB,CAAA;AAEpB,SAAS,iBAAiB;AACxB,SAAO;IACL,YAAY,OAAO;IACnB,YAAY,OAAO;;;AAKvB,SAAgB,UAAU,KAAK,UAAW,QAAS,SAAU;AAC3D,MAAI,OAAO,YAAY,YACrB,WAAU,eAAA;AAGZ,SAAO,KAAK,IAAI,GAAG,CAAA,GAAI,QAAW,GAAG,OAAA;AACrC,MAAI;AACJ,MAAI;AACF,QAAI,cAAc,WAAW,EAC3B,OAAM,KAAK,UAAU,KAAK,UAAU,MAAA;QAEpC,OAAM,KAAK,UAAU,KAAK,oBAAoB,QAAA,GAAW,MAAA;WAEpD,GAAG;AACV,WAAO,KAAK,UACV,qEAAA;;AAGF,WAAO,IAAI,WAAW,GAAG;AACvB,UAAI,OAAO,IAAI,IAAA;AACf,UAAI,KAAK,WAAW,EAClB,QAAO,eAAe,KAAK,CAAA,GAAI,KAAK,CAAA,GAAI,KAAK,CAAA,CAAA;UAE7C,MAAK,CAAA,EAAG,KAAK,CAAA,CAAA,IAAM,KAAK,CAAA;;;AAI9B,SAAO;;AAGT,SAAS,WAAW,SAAS,KAAK,GAAG,QAAQ;AAC3C,MAAI,qBAAqB,OAAO,yBAAyB,QAAQ,CAAA;AACjE,MAAI,mBAAmB,QAAQ,OAC7B,KAAI,mBAAmB,cAAc;AACnC,WAAO,eAAe,QAAQ,GAAG,EAAE,OAAO,QAAA,CAAA;AAC1C,QAAI,KAAK;MAAC;MAAQ;MAAG;MAAK;;QAE1B,eAAc,KAAK;IAAC;IAAK;IAAG;;OAEzB;AACL,WAAO,CAAA,IAAK;AACZ,QAAI,KAAK;MAAC;MAAQ;MAAG;;;;AAIzB,SAAS,OAAO,KAAK,GAAG,WAAW,OAAO,QAAQ,OAAO,SAAS;AAChE,WAAS;AACT,MAAI;AACJ,MAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAC3C,SAAK,IAAI,GAAG,IAAI,MAAM,QAAQ,IAC5B,KAAI,MAAM,CAAA,MAAO,KAAK;AACpB,iBAAW,uBAAuB,KAAK,GAAG,MAAA;AAC1C;;AAIJ,QACE,OAAO,QAAQ,eAAe,eAC9B,QAAQ,QAAQ,YAChB;AACA,iBAAW,oBAAoB,KAAK,GAAG,MAAA;AACvC;;AAGF,QACE,OAAO,QAAQ,eAAe,eAC9B,YAAY,IAAI,QAAQ,YACxB;AACA,iBAAW,oBAAoB,KAAK,GAAG,MAAA;AACvC;;AAGF,UAAM,KAAK,GAAA;AAEX,QAAI,MAAM,QAAQ,GAAA,EAChB,MAAK,IAAI,GAAG,IAAI,IAAI,QAAQ,IAC1B,QAAO,IAAI,CAAA,GAAI,GAAG,GAAG,OAAO,KAAK,OAAO,OAAA;SAErC;AACL,UAAI,OAAO,OAAO,KAAK,GAAA;AACvB,WAAK,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAChC,YAAI,MAAM,KAAK,CAAA;AACf,eAAO,IAAI,GAAA,GAAM,KAAK,GAAG,OAAO,KAAK,OAAO,OAAA;;;AAGhD,UAAM,IAAA;;;AA4GV,SAAS,oBAAoB,UAAU;AACrC,aACE,OAAO,aAAa,cAChB,WACA,SAAU,GAAG,GAAG;AACd,WAAO;;AAEf,SAAO,SAAU,KAAK,KAAK;AACzB,QAAI,cAAc,SAAS,EACzB,UAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,UAAI,OAAO,cAAc,CAAA;AACzB,UAAI,KAAK,CAAA,MAAO,OAAO,KAAK,CAAA,MAAO,KAAK;AACtC,cAAM,KAAK,CAAA;AACX,sBAAc,OAAO,GAAG,CAAA;AACxB;;;AAIN,WAAO,SAAS,KAAK,MAAM,KAAK,GAAA;;;;;;AClOpC,SAAS,4BAA4B,OAAgC;AACnE,SACE,UAAU,QACV,MAAM,OAAO,KACb,MAAM,SAAS,iBACf,MAAM,QAAQ,MAAM,EAAA;;AAYxB,eAAe,SAAS,OAA0B;AAChD,MAAI,SAAS,OAAO,UAAU,SAC5B,KAAI,MAAM,QAAQ,KAAA,GAAQ;AACxB,UAAM,eAAe,MAAM,QAAQ,IACjC,MAAM,IAAA,CAAK,SAAS,SAAS,IAAA,CAAA,CAAA;AAE/B,WAAO;SACF;AACL,UAAMC,aAAkB,CAAA;AACxB,eAAW,CAAC,GAAG,CAAA,KAAM,OAAO,QAAQ,KAAA,EAClC,YAAW,CAAA,IAAK,MAAM,SAAS,CAAA;AAGjC,QAAI,WAAW,OAAO,KAAK,WAAW,SAAS,YAC7C,QAAO;aAEP,WAAW,OAAO,KAClB,WAAW,SAAS,iBACpB,MAAM,QAAQ,WAAW,EAAA,EAEzB,KAAI;AACF,YAAM,kBAAkB,WAAW,GAAG,WAAW,GAAG,SAAS,CAAA;AAC7D,UAAIC;AAEJ,cAAQ,iBAAR;QACE,KAAK;AACH,wBAAc;AACd;QACF,KAAK;AACH,wBAAc;AACd;QACF,KAAK;AACH,wBAAc;AACd;QACF,KAAK;AACH,wBAAc;AACd;QACF;AACE,iBAAO;;AAEX,UAAI,WAAW,OACb,QAAQ,YAAoB,WAAW,MAAA,EACrC,GAAI,WAAW,QAAQ,CAAA,CAAA;UAGzB,QAAO,IAAK,YAAoB,GAAI,WAAW,QAAQ,CAAA,CAAA;aAElD,OAAO;AACd,aAAO;;aAEA,4BAA4B,UAAA,EACrC,YAAO,kBAAK,KAAK,UAAU,UAAA,CAAA;AAG7B,WAAO;;AAGX,SAAO;;AAGT,SAAS,uBAEP,aACA,QACA,MACA,QACQ;AACR,SAAO;IACL,IAAI;IACJ,MAAM;IACN,IAAI,CAAC,YAAY,IAAA;IACjB,QAAQ,UAAU;IAClB,MAAM,QAAQ,CAAA;IACd,QAAQ,UAAU,CAAA;;;AAItB,SAAS,SAAS,KAAe;AAC/B,MAAI,QAAQ,OACV,QAAO;IACL,IAAI;IACJ,MAAM;;WAEC,eAAe,OAAO,eAAe,IAC9C,QAAO,uBAAuB,IAAI,aAAa,QAAW,CACxD,MAAM,KAAK,GAAA,CAAA,CAAA;WAEJ,eAAe,OACxB,QAAO,uBAAuB,QAAQ,QAAW,CAAC,IAAI,QAAQ,IAAI,KAAA,CAAA;WACzD,eAAe,MACxB,QAAO,uBAAuB,IAAI,aAAa,QAAW,CAAC,IAAI,OAAA,CAAA;WAEtD,KAAK,YAAY,OAC1B,QAAO;IACL,MAAM,IAAI;IACV,MAAM,IAAI;;MAGZ,QAAO;;AAIX,IAAa,qBAAb,MAA8D;EAClD,OAAO,KAAsB;AACrC,UAAM,UAAU,IAAI,YAAA;AACpB,WAAO,QAAQ,OACb,UAAU,KAAA,CAAM,GAAW,UAAe;AACxC,aAAO,SAAS,KAAA;;;EAKtB,MAAM,WAAW,KAAyC;AACxD,QAAI,eAAe,WACjB,QAAO,CAAC,SAAS,GAAA;QAEjB,QAAO,CAAC,QAAQ,KAAK,OAAO,GAAA,CAAA;;EAIhC,MAAgB,OAAO,MAA4B;AACjD,UAAM,SAAS,KAAK,MAAM,IAAA;AAC1B,WAAO,SAAS,MAAA;;EAGlB,MAAM,WAAW,MAAc,MAAyC;AACtE,QAAI,SAAS,QACX,QAAO,OAAO,SAAS,WAAW,IAAI,YAAA,EAAc,OAAO,IAAA,IAAQ;aAC1D,SAAS,OAClB,QAAO,KAAK,OACV,OAAO,SAAS,WAAW,OAAO,IAAI,YAAA,EAAc,OAAO,IAAA,CAAA;QAG7D,OAAM,IAAI,MAAM,+BAA+B,IAAA,EAAA;;;;;ACtGrD,SAAgB,SAAY,KAAW;AACrC,MAAI,OAAO,QAAQ,YAAY,QAAQ,KACrC,QAAO;AAGT,QAAM,SAAS,MAAM,QAAQ,GAAA,IAAO,CAAA,IAAK,CAAA;AAEzC,aAAW,OAAO,IAChB,KAAI,OAAO,UAAU,eAAe,KAAK,KAAK,GAAA,EAC3C,QAAwC,GAAA,IAAO,SAC7C,IAAgC,GAAA,CAAA;AAKvC,SAAO;;AAgBT,SAAgB,eAAe,YAA4C;AACzE,SAAO;IACL,GAAG,WAAW;IACd,IAAI,WAAW;IACf,IAAI,WAAW;IACf,gBAAgB,EAAE,GAAG,WAAW,eAAA;IAChC,kBAAkB,EAAE,GAAG,WAAW,iBAAA;IAClC,eAAe,SAAS,WAAW,aAAA;;;AAmBvC,IAAsB,sBAAtB,MAA8E;EAC5E,QAA4B,IAAI,mBAAA;EAEhC,YAAY,OAA4B;AACtC,SAAK,QAAQ,SAAS,KAAK;;EAG7B,MAAM,IAAI,QAAyD;AACjE,UAAM,QAAQ,MAAM,KAAK,SAAS,MAAA;AAClC,WAAO,QAAQ,MAAM,aAAa;;;;;;;;EAwCpC,eAAe,SAA2B;AACxC,QAAI,OAAO,YAAY,SACrB,OAAM,IAAI,MAAM,qDAAA;AAElB,WACE,YAAY,UAAa,OAAO,YAAY,WAAW,UAAU,IAAI;;;AAK3E,SAAgB,uBACd,GACA,GACQ;AACR,MAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SACxC,QAAO,KAAK,KAAK,IAAI,CAAA;AAGvB,SAAO,OAAO,CAAA,EAAG,cAAc,OAAO,CAAA,CAAA;;AAGxC,SAAgB,qBACX,UACa;AAChB,SAAO,SAAS,OAAA,CAAQ,KAAK,SAAS,QAAQ;AAC5C,QAAI,QAAQ,EAAG,QAAO;AACtB,WAAO,uBAAuB,KAAK,OAAA,KAAY,IAAI,MAAM;;;AAW7D,IAAaC,iBAAyC;GACnD,KAAA,GAAQ;GACR,SAAA,GAAY;GACZ,SAAA,GAAY;GACZ,MAAA,GAAS;;AAGZ,SAAgB,gBAAgB,QAAgC;AAC9D,SACE,OAAO,cAAc,iBAAiB,OAAO,cAAc,aAAa;;;;ACjL5E,SAAS,YAAY,UAAkB,qBAA6B,cAA8B;AAC9F,SAAO,KAAK,UAAU,CAAC,UAAU,qBAAqB,YAAY,CAAC;AACvE;AAEA,SAAS,SAAS,KAAsF;AACpG,QAAM,CAAC,UAAU,qBAAqB,YAAY,IAAI,KAAK,MAAM,GAAG;AACpE,SAAO,EAAE,UAAU,qBAAqB,aAAa;AACzD;AAEA,SAAS,cAAc,OAA2B;AAC9C,MAAI,OAAO,WAAW,WAAW,aAAa;AAC1C,WAAO,WAAW,OAAO,KAAK,KAAK,EAAE,SAAS,QAAQ;AAAA,EAC1D;AACA,MAAI,OAAO,WAAW,SAAS,YAAY;AACvC,QAAI,SAAS;AACb,eAAW,QAAQ,OAAO;AACtB,gBAAU,OAAO,aAAa,IAAI;AAAA,IACtC;AACA,WAAO,WAAW,KAAK,MAAM;AAAA,EACjC;AACA,QAAM,IAAI,MAAM,uFAAuF;AAC3G;AAEA,SAAS,cAAc,OAA2B;AAC9C,MAAI,OAAO,WAAW,WAAW,aAAa;AAC1C,WAAO,IAAI,WAAW,WAAW,OAAO,KAAK,OAAO,QAAQ,CAAC;AAAA,EACjE;AACA,MAAI,OAAO,WAAW,SAAS,YAAY;AACvC,UAAM,SAAS,WAAW,KAAK,KAAK;AACpC,UAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAC1C,aAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACnD,YAAM,KAAK,IAAI,OAAO,WAAW,KAAK;AAAA,IAC1C;AACA,WAAO;AAAA,EACX;AACA,QAAM,IAAI,MAAM,uFAAuF;AAC3G;AAQO,IAAM,8BAAN,cAA0C,oBAAoB;AAAA,EAChD;AAAA,EACA;AAAA,EACT;AAAA,EAER,YAAY,SAA8C;AACtD,UAAM,SAAS,KAAK;AACpB,UAAM,UAAU,SAAS,YAAY,OAAO,WAAW,iBAAiB,cAAc,WAAW,eAAe;AAChH,QAAI,CAAC,SAAS;AACV,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC/E;AACA,SAAK,UAAU;AACf,SAAK,WAAW,GAAG,SAAS,UAAU,YAAY;AAClD,SAAK,QAAQ,KAAK,UAAU;AAAA,EAChC;AAAA,EAEA,MAAM,SAAS,QAA8D;AACzE,UAAM,WAAW,OAAO,cAAc;AACtC,QAAI,CAAC,UAAU;AACX,aAAO;AAAA,IACX;AACA,UAAM,sBAAsB,OAAO,cAAc,iBAAiB;AAClE,UAAM,cAAc,KAAK,MAAM,YAAY,QAAQ,IAAI,mBAAmB;AAC1E,QAAI,CAAC,aAAa;AACd,aAAO;AAAA,IACX;AAEA,QAAI,eAAe,gBAAgB,MAAM;AACzC,QAAI,gBAAgB,YAAY,YAAY,GAAG;AAC3C,aAAO,KAAK,WAAW,UAAU,qBAAqB,cAAc,MAAM;AAAA,IAC9E;AAEA,UAAM,eAAe,OAAO,KAAK,WAAW;AAC5C,QAAI,aAAa,WAAW,GAAG;AAC3B,aAAO;AAAA,IACX;AACA,mBAAe,aAAa,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;AAChE,WAAO,KAAK,WAAW,UAAU,qBAAqB,cAAc;AAAA,MAChE,cAAc;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,MACnB;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEA,OAAO,KAAK,QAAwB,SAAkE;AAClG,UAAM,EAAE,QAAQ,OAAO,OAAO,IAAI,WAAW,CAAC;AAC9C,UAAM,kBAAkB,OAAO,cAAc;AAC7C,UAAM,YAAY,kBAAkB,CAAC,eAAe,IAAI,OAAO,KAAK,KAAK,MAAM,WAAW;AAC1F,QAAI,YAAY,OAAO,UAAU,WAAW,QAAQ,OAAO;AAE3D,eAAW,YAAY,WAAW;AAC9B,YAAM,aAAa,KAAK,MAAM,YAAY,QAAQ,KAAK,CAAC;AACxD,YAAM,kBAAkB,OAAO,cAAc;AAC7C,iBAAW,CAAC,qBAAqB,WAAW,KAAK,OAAO,QAAQ,UAAU,GAAG;AACzE,YAAI,oBAAoB,UAAa,wBAAwB,iBAAiB;AAC1E;AAAA,QACJ;AACA,cAAM,gBAAgB,OAAO,QAAQ,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AACzF,mBAAW,CAAC,YAAY,KAAK,eAAe;AACxC,cAAI,QAAQ,cAAc,iBAAiB,gBAAgB,OAAO,aAAa,eAAe;AAC1F;AAAA,UACJ;AACA,gBAAM,QAAQ,MAAM,KAAK,WAAW,UAAU,qBAAqB,cAAc;AAAA,YAC7E,cAAc;AAAA,cACV,WAAW;AAAA,cACX,eAAe;AAAA,cACf,eAAe;AAAA,YACnB;AAAA,UACJ,CAAC;AACD,cAAI,CAAC,OAAO;AACR;AAAA,UACJ;AACA,cAAI,UAAU,CAAC,KAAK,cAAc,MAAM,UAAU,MAAM,GAAG;AACvD;AAAA,UACJ;AACA,cAAI,aAAa,GAAG;AAChB;AAAA,UACJ;AACA,uBAAa;AACb,gBAAM;AAAA,QACV;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,IAAI,QAAwB,YAAwB,UAAuD;AAC7G,UAAM,qBAAqB,eAAe,UAAU;AACpD,UAAM,WAAW,OAAO,cAAc;AACtC,QAAI,CAAC,UAAU;AACX,YAAM,IAAI,MAAM,iGAAiG;AAAA,IACrH;AACA,UAAM,sBAAsB,OAAO,cAAc,iBAAiB;AAClE,QAAI,CAAC,KAAK,MAAM,YAAY,QAAQ,GAAG;AACnC,WAAK,MAAM,YAAY,QAAQ,IAAI,CAAC;AAAA,IACxC;AACA,QAAI,CAAC,KAAK,MAAM,YAAY,QAAQ,EAAE,mBAAmB,GAAG;AACxD,WAAK,MAAM,YAAY,QAAQ,EAAE,mBAAmB,IAAI,CAAC;AAAA,IAC7D;AACA,UAAM,CAAC,CAAC,EAAE,oBAAoB,GAAG,CAAC,EAAE,kBAAkB,CAAC,IAAI,MAAM,QAAQ,IAAI;AAAA,MACzE,KAAK,MAAM,WAAW,kBAAkB;AAAA,MACxC,KAAK,MAAM,WAAW,QAAQ;AAAA,IAClC,CAAC;AACD,SAAK,MAAM,YAAY,QAAQ,EAAE,mBAAmB,EAAE,WAAW,EAAE,IAAI;AAAA,MACnE,YAAY,cAAc,oBAAoB;AAAA,MAC9C,UAAU,cAAc,kBAAkB;AAAA,MAC1C,oBAAoB,OAAO,cAAc;AAAA,IAC7C;AACA,SAAK,aAAa;AAClB,WAAO;AAAA,MACH,cAAc;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe,WAAW;AAAA,MAC9B;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,UAAU,QAAwB,QAAwB,QAA+B;AAC3F,UAAM,WAAW,OAAO,cAAc;AACtC,UAAM,sBAAsB,OAAO,cAAc,iBAAiB;AAClE,UAAM,eAAe,OAAO,cAAc;AAC1C,QAAI,CAAC,UAAU;AACX,YAAM,IAAI,MAAM,6FAA6F;AAAA,IACjH;AACA,QAAI,CAAC,cAAc;AACf,YAAM,IAAI,MAAM,iGAAiG;AAAA,IACrH;AACA,UAAM,WAAW,YAAY,UAAU,qBAAqB,YAAY;AACxE,QAAI,CAAC,KAAK,MAAM,OAAO,QAAQ,GAAG;AAC9B,WAAK,MAAM,OAAO,QAAQ,IAAI,CAAC;AAAA,IACnC;AACA,UAAM,WAAW,KAAK,MAAM,OAAO,QAAQ;AAC3C,UAAM,QAAQ;AAAA,MACV,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,GAAG,UAAU;AAC1C,cAAM,CAAC,EAAE,eAAe,IAAI,MAAM,KAAK,MAAM,WAAW,KAAK;AAC7D,cAAM,MAAM,eAAe,OAAO,KAAK;AACvC,cAAM,WAAW,GAAG,MAAM,IAAI,GAAG;AACjC,YAAI,OAAO,KAAK,YAAY,UAAU;AAClC;AAAA,QACJ;AACA,iBAAS,QAAQ,IAAI,CAAC,QAAQ,SAAS,cAAc,eAAe,CAAC;AAAA,MACzE,CAAC;AAAA,IACL;AACA,SAAK,aAAa;AAAA,EACtB;AAAA,EAEA,MAAM,aAAa,UAAiC;AAChD,WAAO,KAAK,MAAM,YAAY,QAAQ;AACtC,eAAW,OAAO,OAAO,KAAK,KAAK,MAAM,MAAM,GAAG;AAC9C,UAAI,SAAS,GAAG,EAAE,aAAa,UAAU;AACrC,eAAO,KAAK,MAAM,OAAO,GAAG;AAAA,MAChC;AAAA,IACJ;AACA,SAAK,aAAa;AAAA,EACtB;AAAA,EAEQ,YAA4B;AAChC,UAAM,MAAM,KAAK,QAAQ,QAAQ,KAAK,QAAQ;AAC9C,QAAI,CAAC,KAAK;AACN,aAAO,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,IACzC;AACA,QAAI;AACA,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,aAAO;AAAA,QACH,aAAa,OAAO,eAAe,CAAC;AAAA,QACpC,QAAQ,OAAO,UAAU,CAAC;AAAA,MAC9B;AAAA,IACJ,QAAQ;AACJ,aAAO,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,IACzC;AAAA,EACJ;AAAA,EAEQ,eAAqB;AACzB,SAAK,QAAQ,QAAQ,KAAK,UAAU,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,EAClE;AAAA,EAEA,MAAc,WACV,UACA,qBACA,cACA,QACoC;AACpC,UAAM,SAAS,KAAK,MAAM,YAAY,QAAQ,IAAI,mBAAmB,IAAI,YAAY;AACrF,QAAI,CAAC,QAAQ;AACT,aAAO;AAAA,IACX;AACA,UAAM,CAAC,YAAY,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC7C,KAAK,MAAM,WAAW,QAAQ,cAAc,OAAO,UAAU,CAAC;AAAA,MAC9D,KAAK,MAAM,WAAW,QAAQ,cAAc,OAAO,QAAQ,CAAC;AAAA,IAChE,CAAC;AACD,QAAI,WAAW,IAAI,KAAK,OAAO,oBAAoB;AAC/C,YAAM,KAAK,oBAAoB,YAAY,UAAU,qBAAqB,OAAO,kBAAkB;AAAA,IACvG;AACA,UAAM,gBAAgB,MAAM,KAAK,kBAAkB,UAAU,qBAAqB,YAAY;AAC9F,UAAM,QAAyB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AACA,QAAI,OAAO,oBAAoB;AAC3B,YAAM,eAAe;AAAA,QACjB,cAAc;AAAA,UACV,WAAW;AAAA,UACX,eAAe;AAAA,UACf,eAAe,OAAO;AAAA,QAC1B;AAAA,MACJ;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,kBAAkB,UAAkB,qBAA6B,cAAsB;AACjG,UAAM,MAAM,YAAY,UAAU,qBAAqB,YAAY;AACnE,UAAM,UAAU,KAAK,MAAM,OAAO,GAAG;AACrC,QAAI,CAAC,SAAS;AACV,aAAO,CAAC;AAAA,IACZ;AACA,WAAO,QAAQ;AAAA,MACX,OAAO,OAAO,OAAO,EAAE,IAAI,OAAO,CAAC,QAAQ,SAAS,KAAK,MAAM;AAC3D,cAAM,eAAe,MAAM,KAAK,MAAM,WAAW,QAAQ,cAAc,KAAK,CAAC;AAC7E,eAAO,CAAC,QAAQ,SAAS,YAAY;AAAA,MACzC,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEA,MAAc,oBACV,mBACA,UACA,qBACA,oBACa;AACb,UAAM,YAAY,YAAY,UAAU,qBAAqB,kBAAkB;AAC/E,UAAM,SAAS,KAAK,MAAM,OAAO,SAAS,KAAK,CAAC;AAChD,UAAM,eAAe,MAAM,QAAQ;AAAA,MAC/B,OAAO,OAAO,MAAM,EACf,OAAO,CAAC,CAAC,EAAE,OAAO,MAAM,YAAY,KAAK,EACzC,IAAI,OAAO,CAAC,EAAE,EAAE,KAAK,MAAM,KAAK,MAAM,WAAW,QAAQ,cAAc,KAAK,CAAC,CAAC;AAAA,IACvF;AACA,QAAI,aAAa,WAAW,GAAG;AAC3B;AAAA,IACJ;AACA,sBAAkB,mBAAmB,CAAC;AACtC,sBAAkB,eAAe,KAAK,IAAI;AAC1C,sBAAkB,qBAAqB,CAAC;AACxC,sBAAkB,iBAAiB,KAAK,IACpC,OAAO,KAAK,kBAAkB,gBAAgB,EAAE,SAAS,IACnD,kBAAkB,GAAG,OAAO,OAAO,kBAAkB,gBAAgB,CAAC,IACtE,KAAK,eAAe,MAAS;AAAA,EAC3C;AAAA,EAEQ,cAAc,UAA0C,QAA0C;AACtG,QAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC3C,aAAO;AAAA,IACX;AACA,UAAM,YAAY;AAClB,WAAO,OAAO,QAAQ,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,KAAK,MAAM,UAAU,GAAG,MAAM,KAAK;AAAA,EAClF;AACJ;","names":["sanitizeBaseUrl","safeReadText","sanitizeBaseUrl","safeReadText","sanitizeBaseUrl","safeReadText","import_langchain","import_langchain","import_langgraph","import_langchain","revivedObj: any","constructor: any","WRITES_IDX_MAP: Record<string, number>"]}