@openbkn/bkn-sdk 0.1.1-alpha.0 → 0.1.1-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/utils/errors.ts","../src/config/store.ts","../src/auth/jwt.ts","../src/config/resolve.ts","../src/api/headers.ts","../src/api/tls.ts","../src/api/http.ts","../src/api/eacp-crypto.ts","../src/api/admin.ts","../src/utils/org-tree.ts","../src/resources/admin.ts","../src/api/agent-chat.ts","../src/api/agents.ts","../src/resources/agents.ts","../src/api/context-loader.ts","../src/resources/context-loader.ts","../src/api/dataflow.ts","../src/api/knowledge-networks.ts","../src/api/resources.ts","../src/templates/bkn/document/manifest.json","../src/templates/bkn/document/template.json","../src/templates/dataflow/unstructured/manifest.json","../src/templates/dataflow/unstructured/template.json","../src/templates/dataset/document-content/manifest.json","../src/templates/dataset/document-content/template.json","../src/templates/dataset/document-element/manifest.json","../src/templates/dataset/document-element/template.json","../src/templates/dataset/document/manifest.json","../src/templates/dataset/document/template.json","../src/utils/dataflow-templates.ts","../src/resources/dataflows.ts","../src/resources/knowledge-networks.ts","../src/api/bkn-backend.ts","../src/api/vega.ts","../src/utils/bkn-index.ts","../src/utils/tar.ts","../src/utils/csv-import.ts","../src/utils/pk-detection.ts","../src/resources/bkn-create.ts","../src/api/models.ts","../src/resources/models.ts","../src/resources/resources.ts","../src/resources/skills.ts","../src/api/skills.ts","../src/utils/skill-archive.ts","../src/resources/toolboxes.ts","../src/api/toolboxes.ts","../src/api/trace.ts","../src/trace-ai/claude-judge.ts","../src/trace-ai/diagnose.ts","../src/trace-ai/eval-set.ts","../src/resources/trace.ts","../src/resources/vega.ts","../src/api/call.ts","../src/client.ts","../src/resources/auth.ts"],"sourcesContent":["/** Shared types for the SDK surface. No runtime, no side effects. */\n\n/** Options a caller supplies; any field may be resolved from env/config store. */\nexport interface ClientOptions {\n baseUrl?: string;\n token?: string;\n /** Specific user credentials (transient); maps to legacy `--user`. */\n user?: string;\n /** Business domain header; defaults to `bd_public`. */\n businessDomain?: string;\n /** Skip TLS verification (dev / self-signed only). */\n insecure?: boolean;\n}\n\n/** Fully resolved request context — every field is known. */\nexport interface RequestContext {\n baseUrl: string;\n token: string;\n businessDomain: string;\n insecure: boolean;\n}\n\nexport const DEFAULT_BUSINESS_DOMAIN = \"bd_public\";\n\n/** Default list/query limits — see AGENTS.md conventions. */\nexport const DEFAULT_LIST_LIMIT = 30;\nexport const DEFAULT_QUERY_LIMIT = 50;\n","/** Typed errors and their mapping to user-facing messages + exit codes. */\n\n/** Raised when an HTTP request returns a non-2xx status. */\nexport class HttpError extends Error {\n readonly status: number;\n readonly statusText: string;\n readonly body: string;\n\n constructor(status: number, statusText: string, body: string) {\n super(`HTTP ${status} ${statusText}`);\n this.name = \"HttpError\";\n this.status = status;\n this.statusText = statusText;\n this.body = body;\n }\n}\n\n/** Raised for bad CLI/SDK input before any request is made. */\nexport class InputError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"InputError\";\n }\n}\n\n/** Map an error to a process exit code. */\nexport function toExitCode(err: unknown): number {\n if (err instanceof InputError) return 2;\n if (err instanceof HttpError) {\n if (err.status === 401 || err.status === 403) return 3; // auth\n return 1;\n }\n return 1;\n}\n\n/** A short, actionable message for the user. Never leak tokens. */\nexport function formatError(err: unknown): string {\n if (err instanceof HttpError) {\n if (err.status === 401 || err.status === 403) {\n return `Not authorized (HTTP ${err.status}). Run \\`openbkn auth login\\` and retry.`;\n }\n const detail = err.body ? `: ${truncate(err.body, 500)}` : \"\";\n return `Request failed (HTTP ${err.status} ${err.statusText})${detail}`;\n }\n if (err instanceof Error) {\n // `fetch` throws a terse \"fetch failed\"; the real reason is on `.cause`.\n const cause = (err as { cause?: unknown }).cause as\n | { code?: string; message?: string }\n | undefined;\n if (cause?.code && isTlsCertError(cause.code)) {\n return `TLS certificate rejected (${cause.code}). The platform is likely self-signed — retry with \\`-k\\`/\\`--insecure\\`.`;\n }\n if (err.message === \"fetch failed\" && cause?.message) {\n return `Request failed: ${cause.message}${cause.code ? ` (${cause.code})` : \"\"}`;\n }\n return err.message;\n }\n return String(err);\n}\n\nfunction isTlsCertError(code: string): boolean {\n return (\n code === \"DEPTH_ZERO_SELF_SIGNED_CERT\" ||\n code === \"SELF_SIGNED_CERT_IN_CHAIN\" ||\n code === \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\" ||\n code === \"CERT_HAS_EXPIRED\" ||\n code.includes(\"CERT\")\n );\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length > n ? `${s.slice(0, n)}…` : s;\n}\n","/**\n * Local config + token store under `~/.bkn/` (override: `BKN_CONFIG_DIR`).\n *\n * Multi-user by design (platforms are multi-tenant), aligned with the\n * kweaver-sdk layout — reimplemented slim, no legacy-migration paths:\n *\n * <root>/state.json (or profiles/<BKN_PROFILE>/state.json)\n * <root>/platforms/<base64url(baseUrl)>/users/<userId>/token.json\n * <root>/platforms/<base64url(baseUrl)>/users/<userId>/config.json\n *\n * Active platform + per-platform active user live in state.json, so several\n * accounts on one platform coexist and `--user` can switch between them.\n * Pure functions — nothing runs at import time.\n */\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { decodeJwt } from \"../auth/jwt.js\";\n\nexport interface TokenConfig {\n baseUrl: string;\n accessToken: string;\n refreshToken?: string;\n idToken?: string;\n expiresAt?: string;\n /** Skip TLS verification for this platform (saved by `auth login -k`). */\n tlsInsecure?: boolean;\n /** Login name persisted at login time (fallback when JWT lacks claims). */\n username?: string;\n /** Human-readable name from userinfo. */\n displayName?: string;\n}\n\n/** Per-platform, per-user non-auth settings. */\nexport interface PlatformConfig {\n businessDomain?: string;\n}\n\ninterface StoreState {\n currentPlatform?: string;\n /** baseUrl → active userId. */\n activeUsers?: Record<string, string>;\n}\n\nconst PROFILE_RE = /^[A-Za-z0-9_-]{1,64}$/;\nconst IS_WIN = process.platform === \"win32\";\n\nexport function configDir(): string {\n return process.env.BKN_CONFIG_DIR ?? join(homedir(), \".bkn\");\n}\n\nfunction profileName(): string | null {\n const raw = process.env.BKN_PROFILE?.trim();\n if (!raw) return null;\n if (!PROFILE_RE.test(raw)) {\n throw new Error(`BKN_PROFILE='${raw}' is invalid. Use 1-64 chars from [A-Za-z0-9_-].`);\n }\n return raw;\n}\n\nfunction statePath(): string {\n const profile = profileName();\n return profile\n ? join(configDir(), \"profiles\", profile, \"state.json\")\n : join(configDir(), \"state.json\");\n}\n\nfunction encodeKey(baseUrl: string): string {\n return Buffer.from(baseUrl, \"utf8\")\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/g, \"\");\n}\n\nfunction platformDir(baseUrl: string): string {\n return join(configDir(), \"platforms\", encodeKey(baseUrl));\n}\n\nfunction userDir(baseUrl: string, userId: string): string {\n return join(platformDir(baseUrl), \"users\", userId);\n}\n\n/** userId from the token's JWT `sub` (id_token first), else \"default\". */\nexport function userIdFromToken(token: TokenConfig): string {\n return decodeJwt(token.idToken ?? \"\")?.sub ?? decodeJwt(token.accessToken)?.sub ?? \"default\";\n}\n\n// ---- state ----------------------------------------------------------------\n\nfunction readState(): StoreState {\n return readJson<StoreState>(statePath()) ?? {};\n}\n\nfunction writeState(state: StoreState): void {\n writeJson(statePath(), state);\n}\n\nexport function activePlatform(): string | undefined {\n return readState().currentPlatform;\n}\n\nexport function setActivePlatform(baseUrl: string): void {\n writeState({ ...readState(), currentPlatform: baseUrl });\n}\n\nexport function activeUserId(baseUrl: string): string | undefined {\n return readState().activeUsers?.[baseUrl];\n}\n\nexport function setActiveUser(baseUrl: string, userId: string): void {\n const state = readState();\n writeState({ ...state, activeUsers: { ...state.activeUsers, [baseUrl]: userId } });\n}\n\n// ---- tokens (user-scoped) --------------------------------------------------\n\n/** Read the active user's token for a platform (or a specific userId). */\nexport function readToken(\n baseUrl: string,\n userId = activeUserId(baseUrl),\n): TokenConfig | undefined {\n if (!userId) return undefined;\n return readJson<TokenConfig>(join(userDir(baseUrl, userId), \"token.json\")) ?? undefined;\n}\n\n/** Persist a token under its derived userId and make it the active user. */\nexport function writeToken(baseUrl: string, token: TokenConfig): string {\n const userId = userIdFromToken(token);\n writeJson(join(userDir(baseUrl, userId), \"token.json\"), token, 0o600);\n setActiveUser(baseUrl, userId);\n return userId;\n}\n\nexport function deleteToken(baseUrl: string, userId = activeUserId(baseUrl)): boolean {\n if (!userId) return false;\n const path = join(userDir(baseUrl, userId), \"token.json\");\n if (!existsSync(path)) return false;\n rmSync(path, { force: true });\n return true;\n}\n\n// ---- per-platform/user config ---------------------------------------------\n\nexport function readPlatformConfig(\n baseUrl: string,\n userId = activeUserId(baseUrl),\n): PlatformConfig {\n if (!userId) return {};\n return readJson<PlatformConfig>(join(userDir(baseUrl, userId), \"config.json\")) ?? {};\n}\n\nexport function writePlatformConfig(baseUrl: string, config: PlatformConfig): void {\n const userId = activeUserId(baseUrl) ?? \"default\";\n writeJson(join(userDir(baseUrl, userId), \"config.json\"), config);\n}\n\n// ---- enumeration -----------------------------------------------------------\n\nexport interface PlatformUser {\n userId: string;\n username?: string;\n displayName?: string;\n}\n\nexport interface PlatformEntry {\n baseUrl: string;\n users: PlatformUser[];\n activeUserId?: string;\n}\n\n/** Enumerate saved platforms and their users by scanning the store. */\nexport function listPlatforms(): PlatformEntry[] {\n const root = join(configDir(), \"platforms\");\n if (!existsSync(root)) return [];\n const state = readState();\n const out: PlatformEntry[] = [];\n for (const key of readdirSync(root)) {\n const baseUrl = decodeKey(key);\n if (!baseUrl) continue;\n const usersRoot = join(root, key, \"users\");\n if (!existsSync(usersRoot)) continue;\n const users: PlatformUser[] = [];\n for (const userId of readdirSync(usersRoot)) {\n const token = readJson<TokenConfig>(join(usersRoot, userId, \"token.json\"));\n if (token) users.push({ userId, username: token.username, displayName: token.displayName });\n }\n if (users.length > 0) {\n out.push({ baseUrl, users, activeUserId: state.activeUsers?.[baseUrl] });\n }\n }\n return out;\n}\n\nfunction decodeKey(key: string): string | null {\n try {\n const b64 = key.replace(/-/g, \"+\").replace(/_/g, \"/\");\n return Buffer.from(b64, \"base64\").toString(\"utf8\");\n } catch {\n return null;\n }\n}\n\n// ---- low-level fs ----------------------------------------------------------\n\nfunction readJson<T>(path: string): T | undefined {\n if (!existsSync(path)) return undefined;\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as T;\n } catch {\n return undefined;\n }\n}\n\nfunction writeJson(path: string, value: unknown, mode = 0o600): void {\n const dir = path.slice(0, path.lastIndexOf(\"/\")) || \".\";\n mkdirSync(dir, { recursive: true, ...(IS_WIN ? {} : { mode: 0o700 }) });\n writeFileSync(path, `${JSON.stringify(value, null, 2)}\\n`, IS_WIN ? {} : { mode });\n if (!IS_WIN) chmodSync(path, mode);\n}\n","/**\n * Minimal JWT payload decoder — base64url decode only, NO signature check.\n * Used to surface identity (sub / username / email) from a stored token.\n * Never trust this for authorization decisions; it is display-only.\n */\nexport interface JwtClaims {\n sub?: string;\n name?: string;\n preferred_username?: string;\n email?: string;\n exp?: number;\n [key: string]: unknown;\n}\n\nexport function decodeJwt(token: string): JwtClaims | undefined {\n const parts = token.split(\".\");\n if (parts.length < 2 || !parts[1]) return undefined;\n try {\n const json = Buffer.from(parts[1], \"base64url\").toString(\"utf8\");\n return JSON.parse(json) as JwtClaims;\n } catch {\n return undefined;\n }\n}\n\n/** True if the token carries an `exp` in the past. */\nexport function isExpired(claims: JwtClaims | undefined, nowMs = Date.now()): boolean {\n return claims?.exp !== undefined && claims.exp * 1000 < nowMs;\n}\n","/**\n * Resolve a full RequestContext from explicit options → env → store.\n * Order: caller options win, then env vars, then the active platform/user\n * in `~/.bkn/`.\n */\nimport { type ClientOptions, DEFAULT_BUSINESS_DOMAIN, type RequestContext } from \"../types.js\";\nimport { InputError } from \"../utils/errors.js\";\nimport { activePlatform, readPlatformConfig, readToken } from \"./store.js\";\n\nexport function resolveContext(opts: ClientOptions = {}): RequestContext {\n const baseUrl = opts.baseUrl ?? process.env.BKN_BASE_URL ?? activePlatform();\n if (!baseUrl) {\n throw new InputError(\n \"No base URL. Pass --base-url, set BKN_BASE_URL, or run `openbkn auth login`.\",\n );\n }\n const normalized = baseUrl.replace(/\\/+$/, \"\");\n\n const stored = readToken(normalized);\n const token = opts.token ?? process.env.BKN_TOKEN ?? stored?.accessToken;\n if (!token) {\n throw new InputError(\"No access token. Set BKN_TOKEN or run `openbkn auth login`.\");\n }\n\n return {\n baseUrl: normalized,\n token,\n businessDomain:\n opts.businessDomain ??\n readPlatformConfig(normalized).businessDomain ??\n DEFAULT_BUSINESS_DOMAIN,\n insecure: opts.insecure ?? stored?.tlsInsecure ?? false,\n };\n}\n","/** Build request headers with auth + business domain injected. */\nimport type { RequestContext } from \"../types.js\";\n\nexport function buildHeaders(\n ctx: RequestContext,\n extra?: Record<string, string>,\n): Record<string, string> {\n return {\n authorization: `Bearer ${ctx.token}`,\n token: ctx.token,\n \"x-business-domain\": ctx.businessDomain,\n ...extra,\n };\n}\n","/**\n * TLS handling for self-signed platforms (`--insecure` / `-k`).\n *\n * Node's global `fetch` (undici) has no per-call \"skip verification\" option\n * that works reliably across versions, so for an insecure context we disable\n * verification process-wide via NODE_TLS_REJECT_UNAUTHORIZED. This matches the\n * legacy CLI behavior. Scope is the whole process, which is fine for a CLI run\n * (one platform per invocation); SDK consumers opt in explicitly via\n * `insecure: true`.\n *\n * TODO: move to a per-request undici dispatcher so library use does not flip a\n * global. Tracked in docs/exec-plans/tech-debt-tracker.md.\n */\nimport type { RequestContext } from \"../types.js\";\n\nexport function applyTls(ctx: RequestContext): void {\n if (ctx.insecure && process.env.NODE_TLS_REJECT_UNAUTHORIZED !== \"0\") {\n process.env.NODE_TLS_REJECT_UNAUTHORIZED = \"0\";\n }\n}\n","/**\n * Thin fetch wrapper: explicit timeout, auth headers, JSON in/out, typed errors.\n * The single choke point for every backend call — resources build on this.\n */\nimport type { RequestContext } from \"../types.js\";\nimport { HttpError } from \"../utils/errors.js\";\nimport { buildHeaders } from \"./headers.js\";\nimport { applyTls } from \"./tls.js\";\n\nexport interface RequestInitEx {\n method?: string;\n /** JSON body — serialized and Content-Type set automatically. */\n body?: unknown;\n /** Query params appended to the path. */\n query?: Record<string, string | number | boolean | undefined>;\n headers?: Record<string, string>;\n /** Per-request timeout; defaults to 30s. */\n timeoutMs?: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport async function request<T = unknown>(\n ctx: RequestContext,\n path: string,\n init: RequestInitEx = {},\n): Promise<T> {\n const url = new URL(path.startsWith(\"http\") ? path : `${ctx.baseUrl}${path}`);\n for (const [k, v] of Object.entries(init.query ?? {})) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n\n applyTls(ctx);\n const hasBody = init.body !== undefined;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), init.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n\n try {\n const res = await fetch(url, {\n method: init.method ?? (hasBody ? \"POST\" : \"GET\"),\n headers: buildHeaders(ctx, {\n ...(hasBody ? { \"content-type\": \"application/json\" } : {}),\n ...init.headers,\n }),\n body: hasBody ? JSON.stringify(init.body) : undefined,\n signal: controller.signal,\n });\n\n const text = await res.text();\n if (!res.ok) throw new HttpError(res.status, res.statusText, text);\n return (text ? JSON.parse(text) : undefined) as T;\n } finally {\n clearTimeout(timer);\n }\n}\n","/**\n * EACP password crypto. The UserManagement / EACP `modifypassword` endpoint\n * wants the password RSA-PKCS1-encrypted with a fixed 1024-bit public key, then\n * base64-encoded. That keypair is hard-coded in the ShareServer C++ binary\n * (`ncEACHttpServerUtil::RSADecrypt`) and shipped to every customer — it is NOT\n * a secret, just the agreed transport encoding. We embed the keypair and derive\n * the public half so the CLI can encrypt without a round-trip.\n */\nimport {\n constants,\n type KeyObject,\n createPrivateKey,\n createPublicKey,\n publicEncrypt,\n} from \"node:crypto\";\n\nconst EACP_MODIFYPWD_PRIVATE_KEY_PEM = `-----BEGIN RSA PRIVATE KEY-----\nMIICXgIBAAKBgQDB2fhLla9rMx+6LWTXajnK11Kdp520s1Q+TfPfIXI/7G9+L2YC\n4RA3M5rgRi32s5+UFQ/CVqUFqMqVuzaZ4lw/uEdk1qHcP0g6LB3E9wkl2FclFR0M\n+/HrWmxPoON+0y/tFQxxfNgsUodFzbdh0XY1rIVUIbPLvufUBbLKXHDPpwIDAQAB\nAoGBALCM/H6ajXFs1nCR903aCVicUzoS9qckzI0SIhIOPCfMBp8+PAJTSJl9/ohU\nYnhVj/kmVXwBvboxyJAmOcxdRPWL7iTk5nA1oiVXMer3Wby+tRg/ls91xQbJLVv3\noGSt7q0CXxJpRH2oYkVVlMMlZUwKz3ovHiLKAnhw+jEsdL2BAkEA9hA97yyeA2eq\nf9dMu/ici99R3WJRRtk4NEI4WShtWPyziDg48d3SOzYmhEJjPuOo3g1ze01os70P\nApE7d0qcyQJBAMmt+FR8h5MwxPQPAzjh/fTuTttvUfBeMiUDrIycK1I/L96lH+fU\ni4Nu+7TPOzExnPeGO5UJbZxrpIEUB7Zs8O8CQQCLzTCTGiNwxc5eMgH77kVrRudp\nQ7nv6ex/7Hu9VDXEUFbkdyULbj9KuvppPJrMmWZROw04qgNp02mayM8jeLXZAkEA\no+PM/pMn9TPXiWE9xBbaMhUKXgXLd2KEq1GeAbHS/oY8l1hmYhV1vjwNLbSNrH9d\nyEP73TQJL+jFiONHFTbYXwJAU03Xgum5mLIkX/02LpOrz2QCdfX1IMJk2iKi9osV\nKqfbvHsF0+GvFGg18/FXStG9Kr4TjqLsygQJT76/MnMluw==\n-----END RSA PRIVATE KEY-----`;\n\nlet cachedKey: KeyObject | undefined;\nfunction publicKey(): KeyObject {\n if (!cachedKey) cachedKey = createPublicKey(createPrivateKey(EACP_MODIFYPWD_PRIVATE_KEY_PEM));\n return cachedKey;\n}\n\n/** RSA-PKCS1 encrypt a password and base64-encode it for EACP/UserManagement. */\nexport function encryptModifyPwd(plain: string): string {\n const buf = publicEncrypt(\n { key: publicKey(), padding: constants.RSA_PKCS1_PADDING },\n Buffer.from(plain, \"utf8\"),\n );\n return buf.toString(\"base64\");\n}\n","import { decodeJwt } from \"../auth/jwt.js\";\n/**\n * Admin (operator) client — user-management + authorization. Mirrors\n * kweaver-admin. Reads and writes (org/user create/update/delete +\n * reset-password) implemented; org/user detail and writes go through ISFWeb\n * thrift where the REST routes are RegisterPrivate. Passed through as JSON.\n */\nimport type { RequestContext } from \"../types.js\";\nimport { HttpError } from \"../utils/errors.js\";\nimport { encryptModifyPwd } from \"./eacp-crypto.js\";\nimport { request } from \"./http.js\";\n\nconst UM = \"/api/user-management/v1\";\nconst AUTHZ = \"/api/authorization/v1\";\nconst ISFWEB = \"/isfweb/api/ShareMgnt\";\n\n/**\n * The acting admin's UUID — required as a positional param by ShareMgnt user\n * writes. Prefer the JWT `sub` (id_token); when the token is opaque (Ory\n * `ory_at_…`), fall back to `GET /api/eacp/v1/user/get` (`userid`).\n */\nasync function callerUserId(ctx: RequestContext): Promise<string> {\n const sub = decodeJwt(ctx.token)?.sub;\n if (sub) return sub;\n const info = (await request(ctx, \"/api/eacp/v1/user/get\")) as { userid?: string };\n if (info?.userid) return info.userid;\n throw new Error(\n \"Cannot resolve the caller user id (token has no JWT `sub` and \" +\n \"eacp/v1/user/get returned no `userid`). Re-login.\",\n );\n}\n\n/**\n * ISFWeb thrift-style call: `POST /isfweb/api/ShareMgnt/<method>` with a\n * positional JSON array body. Business errors come back as HTTP 501 with\n * `{error:{errMsg,errID}}` — surface `errMsg` instead of \"501 Not Implemented\".\n */\nasync function shareMgnt(\n ctx: RequestContext,\n method: string,\n params: unknown[] = [],\n): Promise<unknown> {\n try {\n return await request(ctx, `${ISFWEB}/${method}`, { method: \"POST\", body: params });\n } catch (e) {\n if (e instanceof HttpError) {\n try {\n const parsed = JSON.parse(e.body) as { error?: { errMsg?: string; errID?: number } };\n const err = parsed?.error;\n if (err?.errMsg) {\n const m = err.errID !== undefined ? `${err.errMsg} (errID=${err.errID})` : err.errMsg;\n throw new Error(`ShareMgnt.${method} failed: ${m}`);\n }\n } catch (inner) {\n if (inner instanceof Error && inner.message.startsWith(\"ShareMgnt.\")) throw inner;\n }\n }\n throw e;\n }\n}\n\nconst DEPT_FIELDS = \"name,code,remark,manager,enabled,parent_deps,email\";\nconst USER_FIELDS = \"name,account,email,enabled,frozen,parent_deps,roles\";\n\nexport interface AdminListOptions {\n role?: string;\n offset?: number;\n limit?: number;\n name?: string;\n orgId?: string;\n}\n\n/** Departments (org structure) via the console search route. */\nexport function listDepartments(\n ctx: RequestContext,\n opts: AdminListOptions = {},\n): Promise<unknown> {\n return request(ctx, `${UM}/console/search-departments/${DEPT_FIELDS}`, {\n query: {\n role: opts.role ?? \"super_admin\",\n offset: opts.offset ?? 0,\n limit: opts.limit ?? 100,\n name: opts.name || undefined,\n },\n });\n}\n\nexport interface DeptEntry {\n id: string;\n name?: string;\n parent_deps?: Array<{ id: string; name?: string }>;\n}\n\n/** Fetch every department by paging the console search route (for tree building). */\nexport async function listAllDepartments(\n ctx: RequestContext,\n role = \"super_admin\",\n pageSize = 100,\n): Promise<DeptEntry[]> {\n const out: DeptEntry[] = [];\n let offset = 0;\n for (;;) {\n const data = (await listDepartments(ctx, { role, offset, limit: pageSize })) as {\n total_count?: number;\n entries?: DeptEntry[];\n };\n const entries = data.entries ?? [];\n out.push(...entries);\n if (entries.length < pageSize) break;\n if (data.total_count !== undefined && out.length >= data.total_count) break;\n offset += pageSize;\n }\n return out;\n}\n\n/** Users via the console search route (REST `/users` 404s on every deploy). */\nexport function listUsers(ctx: RequestContext, opts: AdminListOptions = {}): Promise<unknown> {\n return request(ctx, `${UM}/console/search-users/${USER_FIELDS}`, {\n query: {\n role: opts.role ?? \"super_admin\",\n offset: opts.offset ?? 0,\n limit: opts.limit ?? 100,\n department_id: opts.orgId || undefined,\n name: opts.name || undefined,\n },\n });\n}\n\nexport interface ListRolesOptions {\n offset?: number;\n limit?: number;\n keyword?: string;\n}\n\nexport function listRoles(ctx: RequestContext, opts: ListRolesOptions = {}): Promise<unknown> {\n return request(ctx, `${AUTHZ}/roles`, {\n query: {\n offset: opts.offset ?? 0,\n limit: opts.limit ?? 100,\n keyword: opts.keyword || undefined,\n },\n });\n}\n\nexport function getRole(ctx: RequestContext, roleId: string): Promise<unknown> {\n return request(ctx, `${AUTHZ}/roles/${encodeURIComponent(roleId)}`);\n}\n\n/**\n * One user's full info. UserManagement REST `/users/:id/:fields` rejects the\n * call (`invalid type` on `role`); the console uses ISFWeb thrift\n * `Usrm_GetUserInfo` with a positional `[id]` body, so we do the same.\n */\nexport function getUser(ctx: RequestContext, userId: string): Promise<unknown> {\n return shareMgnt(ctx, \"Usrm_GetUserInfo\", [userId]);\n}\n\n/**\n * Roles granted to a user. The Authorization `accessor_roles` route is\n * `RegisterPrivate` (404 on a public gateway); on 404 fall back to enumerating\n * roles and querying each role's members (cluster role counts are small).\n */\nexport async function getUserRoles(ctx: RequestContext, userId: string): Promise<unknown> {\n try {\n return await request(ctx, `${AUTHZ}/accessor_roles`, {\n query: { accessor_id: userId, accessor_type: \"user\" },\n });\n } catch (e) {\n if (!(e instanceof HttpError) || e.status !== 404) throw e;\n const rolesPage = (await listRoles(ctx, { offset: 0, limit: 200 })) as {\n entries?: Array<{ id: string; name?: string; description?: string }>;\n };\n const roles = rolesPage.entries ?? [];\n const matched: Array<{ id: string; name?: string; description?: string }> = [];\n await Promise.all(\n roles.map(async (role) => {\n const members = (await listRoleMembers(ctx, role.id, { offset: 0, limit: 500 })) as {\n entries?: Array<{ id: string; type?: string }>;\n };\n if (\n (members.entries ?? []).some((m) => m.id === userId && (!m.type || m.type === \"user\"))\n ) {\n matched.push(role);\n }\n }),\n );\n return {\n entries: matched,\n total_count: matched.length,\n route: \"fallback:list-roles+role-members\",\n };\n }\n}\n\n/**\n * One department's full info. The REST `/departments/:id/:fields` route is\n * `RegisterPrivate` (404 on a public gateway), so go straight to ISFWeb thrift:\n * try `Usrm_GetOrgDepartmentById` (root-level orgs), fall back to\n * `Usrm_GetDepartmentById` (sub-departments) on a \"not found\"-style error.\n */\nexport async function getDepartment(ctx: RequestContext, deptId: string): Promise<unknown> {\n try {\n return await shareMgnt(ctx, \"Usrm_GetOrgDepartmentById\", [deptId]);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n if (!/部门不存在|errID:?\\s*20201|errID=?\\s*99|NoneType.+subscriptable/i.test(msg)) throw e;\n return shareMgnt(ctx, \"Usrm_GetDepartmentById\", [deptId]);\n }\n}\n\n/** Members of a department (public route, fields default to `users`). */\nexport function getDepartmentMembers(\n ctx: RequestContext,\n deptId: string,\n opts: { role?: string; offset?: number; limit?: number } = {},\n): Promise<unknown> {\n return request(ctx, `${UM}/department-members/${encodeURIComponent(deptId)}/users`, {\n query: { role: opts.role ?? \"super_admin\", offset: opts.offset ?? 0, limit: opts.limit ?? 100 },\n });\n}\n\n// ---- department writes (ISFWeb thrift) -------------------------------------\n\nexport interface CreateOrgInput {\n name: string;\n parentId?: string;\n managerID?: string | null;\n code?: string;\n remark?: string;\n status?: number;\n email?: string;\n}\n\n/** Create a department (`Usrm_AddDepartment`). Returns the new department id. */\nexport async function createDepartment(\n ctx: RequestContext,\n input: CreateOrgInput,\n): Promise<unknown> {\n const ncTAddDepartParam = {\n parentId: input.parentId ?? \"-1\",\n departName: input.name,\n managerID: input.managerID ?? null,\n code: input.code ?? \"\",\n remark: input.remark ?? \"\",\n status: input.status ?? 1,\n email: input.email ?? \"\",\n ossId: \"\",\n };\n const id = await shareMgnt(ctx, \"Usrm_AddDepartment\", [{ ncTAddDepartParam }]);\n return { id };\n}\n\nexport interface UpdateOrgInput {\n name?: string;\n managerID?: string | null;\n code?: string;\n remark?: string;\n status?: number;\n email?: string;\n}\n\n/** Update a department (`Usrm_EditDepartment`); only provided fields are sent. */\nexport async function updateDepartment(\n ctx: RequestContext,\n deptId: string,\n input: UpdateOrgInput,\n): Promise<unknown> {\n const p: Record<string, unknown> = { departId: deptId };\n if (input.name !== undefined) p.departName = input.name;\n if (input.managerID !== undefined) p.managerID = input.managerID;\n if (input.code !== undefined) p.code = input.code;\n if (input.remark !== undefined) p.remark = input.remark;\n if (input.status !== undefined) p.status = input.status;\n if (input.email !== undefined) p.email = input.email;\n await shareMgnt(ctx, \"Usrm_EditDepartment\", [{ ncTEditDepartParam: p }]);\n return { id: deptId, updated: true };\n}\n\n/** Delete a department (`DELETE /management/departments/:id`). */\nexport async function deleteDepartment(ctx: RequestContext, deptId: string): Promise<unknown> {\n await request(ctx, `${UM}/management/departments/${encodeURIComponent(deptId)}`, {\n method: \"DELETE\",\n });\n return { id: deptId, deleted: true };\n}\n\n// ---- user writes -----------------------------------------------------------\n\nexport interface CreateUserInput {\n loginName: string;\n displayName?: string;\n email?: string;\n departmentIds?: string[];\n code?: string;\n position?: string;\n remark?: string;\n telNumber?: string;\n priority?: number;\n csfLevel?: number;\n}\n\n/**\n * Create a user (`Usrm_AddUser`). The thrift call does not accept a password —\n * the new user gets the platform default (forced change on first login).\n * Returns the new user id.\n */\nexport async function createUser(ctx: RequestContext, input: CreateUserInput): Promise<unknown> {\n const ncTUsrmUserInfo: Record<string, unknown> = {\n loginName: input.loginName,\n displayName: input.displayName ?? input.loginName,\n code: input.code ?? \"\",\n position: input.position ?? \"\",\n managerID: null,\n managerDisplayName: null,\n remark: input.remark ?? \"\",\n email: input.email ?? \"\",\n telNumber: input.telNumber ?? \"\",\n idcardNumber: \"\",\n departmentIds: input.departmentIds ?? [\"-1\"],\n priority: input.priority ?? 999,\n csfLevel2: null,\n pwdControl: false,\n expireTime: -1,\n };\n if (input.csfLevel !== undefined) ncTUsrmUserInfo.csfLevel = input.csfLevel;\n const id = await shareMgnt(ctx, \"Usrm_AddUser\", [\n { ncTUsrmAddUserInfo: { user: { ncTUsrmUserInfo } } },\n await callerUserId(ctx),\n ]);\n return { id };\n}\n\nexport interface UpdateUserInput {\n displayName?: string;\n code?: string;\n position?: string;\n remark?: string;\n email?: string;\n telNumber?: string;\n managerID?: string;\n priority?: number;\n csfLevel?: number;\n}\n\n/**\n * Update mutable user fields. Tries the public REST route\n * `PATCH /management/users/:id` (snake_case body); on 404/405 falls back to\n * ISFWeb thrift `Usrm_EditUser` (needs the caller UUID).\n */\nexport async function updateUser(\n ctx: RequestContext,\n userId: string,\n input: UpdateUserInput,\n): Promise<unknown> {\n const restBody: Record<string, unknown> = {};\n if (input.displayName !== undefined) restBody.display_name = input.displayName;\n if (input.code !== undefined) restBody.code = input.code;\n if (input.position !== undefined) restBody.position = input.position;\n if (input.remark !== undefined) restBody.remark = input.remark;\n if (input.email !== undefined) restBody.email = input.email;\n if (input.telNumber !== undefined) restBody.tel_number = input.telNumber;\n if (input.managerID !== undefined) restBody.manager_id = input.managerID;\n if (input.priority !== undefined) restBody.priority = input.priority;\n if (input.csfLevel !== undefined) restBody.csf_level = input.csfLevel;\n try {\n const r = await request(ctx, `${UM}/management/users/${encodeURIComponent(userId)}`, {\n method: \"PATCH\",\n body: restBody,\n });\n return r ?? { id: userId, updated: true, route: \"rest\" };\n } catch (e) {\n if (!(e instanceof HttpError) || (e.status !== 404 && e.status !== 405)) throw e;\n const ncTEditUserParam = {\n id: userId,\n displayName: input.displayName ?? \"\",\n code: input.code ?? \"\",\n position: input.position ?? \"\",\n managerID: input.managerID ?? \"\",\n remark: input.remark ?? \"\",\n idcardNumber: null,\n priority: input.priority ?? 999,\n csfLevel: input.csfLevel ?? 5,\n csfLevel2: null,\n email: input.email ?? \"\",\n telNumber: input.telNumber ?? \"\",\n expireTime: -1,\n };\n await shareMgnt(ctx, \"Usrm_EditUser\", [{ ncTEditUserParam }, await callerUserId(ctx)]);\n return { id: userId, updated: true, route: \"shareMgnt\" };\n }\n}\n\n/** Delete a user (`DELETE /users/:id`, fallback ISFWeb thrift `Usrm_DelUser`). */\nexport async function deleteUser(ctx: RequestContext, userId: string): Promise<unknown> {\n try {\n await request(ctx, `${UM}/users/${encodeURIComponent(userId)}`, { method: \"DELETE\" });\n } catch (e) {\n if (!(e instanceof HttpError) || e.status !== 404) throw e;\n await shareMgnt(ctx, \"Usrm_DelUser\", [userId]);\n }\n return { id: userId, deleted: true };\n}\n\n/**\n * Admin reset of a user's password. RSA-PKCS1 encrypts the new password with\n * the built-in UserManagement key (`PUT /management/users/:id/password`).\n * No old password required for this admin route.\n */\nexport async function setUserPassword(\n ctx: RequestContext,\n userId: string,\n newPassword: string,\n): Promise<unknown> {\n await request(ctx, `${UM}/management/users/${encodeURIComponent(userId)}/password`, {\n method: \"PUT\",\n body: { password: encryptModifyPwd(newPassword) },\n });\n return { id: userId, passwordReset: true };\n}\n\nconst EACP = \"/api/eacp/v1\";\n\nexport interface AuditListOptions {\n page?: number;\n size?: number;\n user?: string;\n start?: string;\n end?: string;\n}\n\n/** Login audit events (EACP). */\nexport function listAuditLogs(ctx: RequestContext, opts: AuditListOptions = {}): Promise<unknown> {\n return request(ctx, `${EACP}/auth1/login-log`, {\n method: \"POST\",\n body: {\n page_num: opts.page ?? 1,\n page_size: opts.size ?? 30,\n user_name: opts.user || undefined,\n start_time: opts.start || undefined,\n end_time: opts.end || undefined,\n },\n });\n}\n\n/**\n * Self-service password change via EACP (`POST /api/eacp/v1/auth1/modifypassword`).\n * Both passwords are RSA-PKCS1 encrypted + base64 (same key as reset-password).\n */\nexport function changePassword(\n ctx: RequestContext,\n account: string,\n oldPassword: string,\n newPassword: string,\n): Promise<unknown> {\n return request(ctx, `${EACP}/auth1/modifypassword`, {\n method: \"POST\",\n body: {\n account,\n oldpwd: encryptModifyPwd(oldPassword),\n newpwd: encryptModifyPwd(newPassword),\n },\n });\n}\n\nexport type MemberType = \"user\" | \"department\" | \"group\" | \"app\";\n\nexport function listRoleMembers(\n ctx: RequestContext,\n roleId: string,\n opts: { offset?: number; limit?: number; keyword?: string } = {},\n): Promise<unknown> {\n return request(ctx, `${AUTHZ}/role-members/${encodeURIComponent(roleId)}`, {\n query: {\n offset: opts.offset ?? 0,\n limit: opts.limit ?? 100,\n keyword: opts.keyword || undefined,\n },\n });\n}\n\n/**\n * Add or remove role members. Both use POST; the verb is in the body\n * (`{method:\"POST\"|\"DELETE\", members:[{id,type}]}`).\n */\nexport function modifyRoleMembers(\n ctx: RequestContext,\n roleId: string,\n method: \"POST\" | \"DELETE\",\n members: Array<{ id: string; type: MemberType }>,\n): Promise<unknown> {\n return request(ctx, `${AUTHZ}/role-members/${encodeURIComponent(roleId)}`, {\n method: \"POST\",\n body: { method, members },\n });\n}\n","/** Build / render a department hierarchy from flat ISF search entries. */\nimport type { DeptEntry } from \"../api/admin.js\";\n\nexport interface OrgNode {\n id: string;\n name: string;\n children: OrgNode[];\n}\n\n/** Nest flat departments by their `parent_deps` chain (last dep = immediate parent). */\nexport function buildOrgTree(entries: DeptEntry[]): OrgNode[] {\n const nodes = new Map<string, OrgNode>();\n for (const e of entries) nodes.set(e.id, { id: e.id, name: e.name ?? e.id, children: [] });\n\n const roots: OrgNode[] = [];\n for (const e of entries) {\n const node = nodes.get(e.id);\n if (!node) continue;\n const deps = e.parent_deps;\n const parentId = deps && deps.length > 0 ? deps[deps.length - 1]?.id : undefined;\n const parent = parentId ? nodes.get(parentId) : undefined;\n if (parent) parent.children.push(node);\n else roots.push(node);\n }\n return roots;\n}\n\n/** Render a tree as indented text (`├── name (id: …)`). */\nexport function renderOrgTree(nodes: OrgNode[], prefix = \"\"): string {\n const lines: string[] = [];\n nodes.forEach((node, i) => {\n const last = i === nodes.length - 1;\n lines.push(`${prefix}${last ? \"└── \" : \"├── \"}${node.name} (id: ${node.id})`);\n if (node.children.length) {\n lines.push(renderOrgTree(node.children, `${prefix}${last ? \" \" : \"│ \"}`));\n }\n });\n return lines.join(\"\\n\");\n}\n","import {\n type AdminListOptions,\n type AuditListOptions,\n type CreateOrgInput,\n type CreateUserInput,\n type ListRolesOptions,\n type MemberType,\n type UpdateOrgInput,\n type UpdateUserInput,\n createDepartment,\n createUser,\n deleteDepartment,\n deleteUser,\n getDepartment,\n getDepartmentMembers,\n getRole,\n getUser,\n getUserRoles,\n listAllDepartments,\n listAuditLogs,\n listDepartments,\n listRoleMembers,\n listRoles,\n listUsers,\n modifyRoleMembers,\n setUserPassword,\n updateDepartment,\n updateUser,\n} from \"../api/admin.js\";\nimport type { RequestContext } from \"../types.js\";\n/** Admin (operator) resource surface. */\nimport { buildOrgTree } from \"../utils/org-tree.js\";\n\nexport function admin(ctx: RequestContext) {\n return {\n orgList: (opts?: AdminListOptions) => listDepartments(ctx, opts),\n orgGet: (deptId: string) => getDepartment(ctx, deptId),\n orgMembers: (deptId: string, opts?: { role?: string; offset?: number; limit?: number }) =>\n getDepartmentMembers(ctx, deptId, opts),\n orgTree: async (role?: string) => buildOrgTree(await listAllDepartments(ctx, role)),\n orgCreate: (input: CreateOrgInput) => createDepartment(ctx, input),\n orgUpdate: (deptId: string, input: UpdateOrgInput) => updateDepartment(ctx, deptId, input),\n orgDelete: (deptId: string) => deleteDepartment(ctx, deptId),\n userList: (opts?: AdminListOptions) => listUsers(ctx, opts),\n userGet: (userId: string) => getUser(ctx, userId),\n userRoles: (userId: string) => getUserRoles(ctx, userId),\n userCreate: (input: CreateUserInput) => createUser(ctx, input),\n userUpdate: (userId: string, input: UpdateUserInput) => updateUser(ctx, userId, input),\n userDelete: (userId: string) => deleteUser(ctx, userId),\n userResetPassword: (userId: string, newPassword: string) =>\n setUserPassword(ctx, userId, newPassword),\n roleList: (opts?: ListRolesOptions) => listRoles(ctx, opts),\n roleGet: (roleId: string) => getRole(ctx, roleId),\n roleMembers: (roleId: string, opts?: { keyword?: string; limit?: number }) =>\n listRoleMembers(ctx, roleId, opts),\n addRoleMember: (roleId: string, id: string, type: MemberType = \"user\") =>\n modifyRoleMembers(ctx, roleId, \"POST\", [{ id, type }]),\n removeRoleMember: (roleId: string, id: string, type: MemberType = \"user\") =>\n modifyRoleMembers(ctx, roleId, \"DELETE\", [{ id, type }]),\n auditList: (opts?: AuditListOptions) => listAuditLogs(ctx, opts),\n };\n}\n","import type { RequestContext } from \"../types.js\";\n/**\n * Agent chat (agent-factory app runtime). The chat stream is NOT OpenAI-style:\n * each SSE `data:` line is a JSON-patch-ish `{key, content, action}` that mutates\n * a server-side result tree. We replay those patches into a local tree and pull\n * the answer text out of it after each frame, emitting only the new suffix.\n */\nimport { HttpError } from \"../utils/errors.js\";\nimport { buildHeaders } from \"./headers.js\";\nimport { request } from \"./http.js\";\nimport { applyTls } from \"./tls.js\";\n\nconst FACTORY = \"/api/agent-factory\";\n\nexport interface AgentInfo {\n id: string;\n key: string;\n version: string;\n}\n\n/** Resolve an agent's {id,key,version} from agent-market (required to chat). */\nexport async function fetchAgentInfo(\n ctx: RequestContext,\n agentId: string,\n version = \"v0\",\n): Promise<AgentInfo> {\n const data = (await request(\n ctx,\n `${FACTORY}/v3/agent-market/agent/${encodeURIComponent(agentId)}/version/${encodeURIComponent(version)}`,\n { query: { is_visit: true } },\n )) as Record<string, unknown>;\n const id = data.id;\n const key = data.key;\n if (typeof id !== \"string\" || !id || typeof key !== \"string\" || !key) {\n throw new Error(\"Agent info response did not include id and key.\");\n }\n return { id, key, version: typeof data.version === \"string\" ? data.version : version };\n}\n\n// ---- JSON-patch result tree -------------------------------------------------\n\nfunction getByPath(obj: unknown, path: string[]): unknown {\n let cur: unknown = obj;\n for (const k of path) {\n if (cur === null || typeof cur !== \"object\") return undefined;\n cur = (cur as Record<string, unknown>)[k];\n }\n return cur;\n}\n\nfunction setByPath(obj: Record<string, unknown>, path: string[], value: unknown): void {\n let cur: Record<string, unknown> = obj;\n for (let i = 0; i < path.length - 1; i += 1) {\n const k = path[i] as string;\n if (!(k in cur) || typeof cur[k] !== \"object\" || cur[k] === null) cur[k] = {};\n cur = cur[k] as Record<string, unknown>;\n }\n cur[path[path.length - 1] as string] = value;\n}\n\nfunction applyPatch(\n data: { key?: string[]; content?: unknown; action?: string },\n result: Record<string, unknown>,\n): void {\n const path = data.key;\n if (!path || path.length === 0) return;\n if (data.action === \"upsert\" && data.content !== undefined) {\n setByPath(result, path, data.content);\n } else if (data.action === \"append\") {\n const existing = getByPath(result, path);\n const add = typeof data.content === \"string\" ? data.content : String(data.content ?? \"\");\n setByPath(result, path, typeof existing === \"string\" ? existing + add : add);\n } else if (data.action === \"remove\" && path.length === 1) {\n delete result[path[0] as string];\n }\n}\n\n/** Pull the answer text from the accumulated result tree (best-effort). */\nexport function extractText(result: Record<string, unknown>): string {\n const content = getByPath(result, [\"message\", \"content\"]) as Record<string, unknown> | undefined;\n if (content) {\n if (typeof content.text === \"string\" && content.text) return content.text;\n const fa = content.final_answer as Record<string, unknown> | undefined;\n const ans = fa?.answer as Record<string, unknown> | undefined;\n if (typeof ans?.text === \"string\" && ans.text) return ans.text;\n if (typeof fa?.text === \"string\" && fa.text) return fa.text;\n }\n const msg = result.message as Record<string, unknown> | undefined;\n if (typeof msg?.text === \"string\" && msg.text) return msg.text;\n return \"\";\n}\n\nexport interface ChatResult {\n text: string;\n conversationId?: string;\n}\n\nexport interface SendChatOptions {\n conversationId?: string;\n stream?: boolean;\n onDelta?: (text: string) => void;\n}\n\n/** Send one chat turn (streaming or not). Resolves with the full text. */\nexport async function sendChat(\n ctx: RequestContext,\n info: AgentInfo,\n query: string,\n opts: SendChatOptions = {},\n): Promise<ChatResult> {\n applyTls(ctx);\n const body: Record<string, unknown> = {\n agent_id: info.id,\n agent_key: info.key,\n agent_version: info.version,\n query,\n stream: Boolean(opts.stream),\n };\n if (opts.conversationId) body.conversation_id = opts.conversationId;\n\n const res = await fetch(`${ctx.baseUrl}${FACTORY}/v1/app/${info.key}/chat/completion`, {\n method: \"POST\",\n headers: {\n ...buildHeaders(ctx),\n \"content-type\": \"application/json\",\n accept: opts.stream ? \"text/event-stream\" : \"application/json\",\n \"x-language\": \"zh-CN\",\n },\n body: JSON.stringify(body),\n });\n if (!res.ok) throw new HttpError(res.status, res.statusText, await res.text());\n\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (opts.stream && contentType.includes(\"text/event-stream\")) {\n return consumeStream(res, opts.onDelta);\n }\n const result = JSON.parse(await res.text()) as Record<string, unknown>;\n return { text: extractText(result), conversationId: conversationIdOf(result) };\n}\n\nfunction conversationIdOf(result: Record<string, unknown>): string | undefined {\n const id = result.conversation_id;\n return typeof id === \"string\" ? id : undefined;\n}\n\nasync function consumeStream(res: Response, onDelta?: (text: string) => void): Promise<ChatResult> {\n const reader = res.body?.getReader();\n if (!reader) throw new Error(\"No response body for stream\");\n const decoder = new TextDecoder();\n const result: Record<string, unknown> = {};\n let buffer = \"\";\n let lastText = \"\";\n let conversationId: string | undefined;\n\n const handle = (line: string): void => {\n if (!line.startsWith(\"data:\")) return;\n const payload = line.slice(5).trim();\n if (payload === \"\" || payload === \"[DONE]\") return;\n let data: { key?: string[]; content?: unknown; action?: string };\n try {\n data = JSON.parse(payload);\n } catch {\n return;\n }\n applyPatch(data, result);\n if (data.key?.length === 1 && data.key[0] === \"conversation_id\") {\n conversationId = typeof data.content === \"string\" ? data.content : conversationId;\n }\n const text = extractText(result);\n if (text && text !== lastText) {\n if (onDelta) onDelta(text.slice(lastText.length));\n lastText = text;\n }\n };\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const ln of lines) handle(ln.replace(/\\r$/, \"\"));\n }\n if (buffer.trim()) handle(buffer.trim());\n return { text: lastText, conversationId: conversationId ?? conversationIdOf(result) };\n}\n","/**\n * Agent client (agent-factory v3). Read side + published listing, mirroring\n * kweaver-sdk api/agent-list.ts. Responses passed through as parsed JSON.\n */\nimport type { RequestContext } from \"../types.js\";\nimport { request } from \"./http.js\";\n\nconst BASE = \"/api/agent-factory/v3\";\n\nexport interface ListAgentsOptions {\n name?: string;\n offset?: number;\n limit?: number;\n categoryId?: string;\n customSpaceId?: string;\n isToSquare?: number;\n}\n\n/** Published agents (POST with a paging/filter body). */\nexport function listAgents(ctx: RequestContext, opts: ListAgentsOptions = {}): Promise<unknown> {\n return request(ctx, `${BASE}/published/agent`, {\n method: \"POST\",\n body: {\n offset: opts.offset ?? 0,\n limit: opts.limit ?? 30,\n category_id: opts.categoryId ?? \"\",\n name: opts.name ?? \"\",\n custom_space_id: opts.customSpaceId ?? \"\",\n is_to_square: opts.isToSquare ?? 1,\n },\n });\n}\n\nexport function getAgent(ctx: RequestContext, agentId: string): Promise<unknown> {\n return request(ctx, `${BASE}/agent/${encodeURIComponent(agentId)}`);\n}\n\nexport function getAgentByKey(ctx: RequestContext, key: string): Promise<unknown> {\n return request(ctx, `${BASE}/agent/by-key/${encodeURIComponent(key)}`);\n}\n\nexport interface PagingOptions {\n offset?: number;\n limit?: number;\n name?: string;\n}\n\nexport function listPersonalAgents(\n ctx: RequestContext,\n opts: PagingOptions = {},\n): Promise<unknown> {\n return request(ctx, `${BASE}/personal-space/agent-list`, {\n query: { offset: opts.offset ?? 0, limit: opts.limit ?? 30, name: opts.name || undefined },\n });\n}\n\nexport function listAgentTemplates(\n ctx: RequestContext,\n opts: PagingOptions = {},\n): Promise<unknown> {\n return request(ctx, `${BASE}/published/agent-tpl`, {\n query: { offset: opts.offset ?? 0, limit: opts.limit ?? 30, name: opts.name || undefined },\n });\n}\n\nexport function getAgentTemplate(ctx: RequestContext, templateId: string): Promise<unknown> {\n return request(ctx, `${BASE}/published/agent-tpl/${encodeURIComponent(templateId)}`);\n}\n\nexport function listAgentCategories(ctx: RequestContext): Promise<unknown> {\n return request(ctx, `${BASE}/category`);\n}\n\nexport function createAgent(ctx: RequestContext, body: unknown): Promise<unknown> {\n return request(ctx, `${BASE}/agent`, { method: \"POST\", body });\n}\n\nexport function updateAgent(ctx: RequestContext, agentId: string, body: unknown): Promise<unknown> {\n return request(ctx, `${BASE}/agent/${encodeURIComponent(agentId)}`, { method: \"PUT\", body });\n}\n\nexport function deleteAgent(ctx: RequestContext, agentId: string): Promise<unknown> {\n return request(ctx, `${BASE}/agent/${encodeURIComponent(agentId)}`, { method: \"DELETE\" });\n}\n\nexport function publishAgent(ctx: RequestContext, agentId: string): Promise<unknown> {\n return request(ctx, `${BASE}/agent/${encodeURIComponent(agentId)}/publish`, { method: \"POST\" });\n}\n\nexport function unpublishAgent(ctx: RequestContext, agentId: string): Promise<unknown> {\n return request(ctx, `${BASE}/agent/${encodeURIComponent(agentId)}/unpublish`, { method: \"PUT\" });\n}\n\nconst APP = \"/api/agent-factory/v1/app\";\n\n/** List conversations (sessions) for an agent. `agentKey` is the agent's key. */\nexport function listConversations(\n ctx: RequestContext,\n agentKey: string,\n opts: { page?: number; size?: number } = {},\n): Promise<unknown> {\n return request(ctx, `${APP}/${encodeURIComponent(agentKey)}/conversation`, {\n query: { page: opts.page ?? 1, size: opts.size ?? 30 },\n });\n}\n\n/** Message history for one conversation. */\nexport function listMessages(\n ctx: RequestContext,\n agentKey: string,\n conversationId: string,\n): Promise<unknown> {\n return request(\n ctx,\n `${APP}/${encodeURIComponent(agentKey)}/conversation/${encodeURIComponent(conversationId)}`,\n );\n}\n","import { type SendChatOptions, fetchAgentInfo, sendChat } from \"../api/agent-chat.js\";\n/** Agent resource surface (read side + published listing). */\nimport {\n type ListAgentsOptions,\n type PagingOptions,\n createAgent,\n deleteAgent,\n getAgent,\n getAgentByKey,\n getAgentTemplate,\n listAgentCategories,\n listAgentTemplates,\n listAgents,\n listConversations,\n listMessages,\n listPersonalAgents,\n publishAgent,\n unpublishAgent,\n updateAgent,\n} from \"../api/agents.js\";\nimport type { RequestContext } from \"../types.js\";\n\n/** Read the agent's skill-member array (config.skills.skills), or []. */\nfunction skillMembers(agent: Record<string, unknown>): unknown[] {\n const config = (agent.config ?? {}) as Record<string, unknown>;\n const skills = (config.skills ?? {}) as Record<string, unknown>;\n return Array.isArray(skills.skills) ? skills.skills : [];\n}\n/** Write the agent's skill-member array back into config.skills.skills. */\nfunction setSkillMembers(agent: Record<string, unknown>, members: unknown[]): void {\n if (!agent.config || typeof agent.config !== \"object\") agent.config = {};\n const config = agent.config as Record<string, unknown>;\n if (!config.skills || typeof config.skills !== \"object\") config.skills = {};\n (config.skills as Record<string, unknown>).skills = members;\n}\n\nexport function agents(ctx: RequestContext) {\n return {\n list: (opts?: ListAgentsOptions) => listAgents(ctx, opts),\n get: (agentId: string) => getAgent(ctx, agentId),\n getByKey: (key: string) => getAgentByKey(ctx, key),\n personalList: (opts?: PagingOptions) => listPersonalAgents(ctx, opts),\n templateList: (opts?: PagingOptions) => listAgentTemplates(ctx, opts),\n templateGet: (templateId: string) => getAgentTemplate(ctx, templateId),\n categoryList: () => listAgentCategories(ctx),\n create: (body: unknown) => createAgent(ctx, body),\n update: (agentId: string, body: unknown) => updateAgent(ctx, agentId, body),\n delete: (agentId: string) => deleteAgent(ctx, agentId),\n publish: (agentId: string) => publishAgent(ctx, agentId),\n unpublish: (agentId: string) => unpublishAgent(ctx, agentId),\n sessions: (agentKey: string, opts?: { page?: number; size?: number }) =>\n listConversations(ctx, agentKey, opts),\n history: (agentKey: string, conversationId: string) =>\n listMessages(ctx, agentKey, conversationId),\n /** List skill ids attached to an agent (config.skills.skills). */\n skillList: async (agentId: string): Promise<string[]> => {\n const agent = (await getAgent(ctx, agentId)) as Record<string, unknown>;\n const arr = skillMembers(agent);\n return arr.map((m) => String((m as Record<string, unknown>).skill_id ?? \"\")).filter(Boolean);\n },\n /** Attach skill(s) to an agent (dedup), then persist. */\n skillAdd: async (agentId: string, skillIds: string[]): Promise<unknown> => {\n const agent = (await getAgent(ctx, agentId)) as Record<string, unknown>;\n const arr = skillMembers(agent);\n const have = new Set(arr.map((m) => String((m as Record<string, unknown>).skill_id ?? \"\")));\n for (const id of skillIds) if (!have.has(id)) arr.push({ skill_id: id });\n setSkillMembers(agent, arr);\n return updateAgent(ctx, agentId, agent);\n },\n /** Detach skill(s) from an agent, then persist. */\n skillRemove: async (agentId: string, skillIds: string[]): Promise<unknown> => {\n const agent = (await getAgent(ctx, agentId)) as Record<string, unknown>;\n const drop = new Set(skillIds);\n const arr = skillMembers(agent).filter(\n (m) => !drop.has(String((m as Record<string, unknown>).skill_id ?? \"\")),\n );\n setSkillMembers(agent, arr);\n return updateAgent(ctx, agentId, agent);\n },\n /** Send a chat turn to an agent (resolves agent id/key/version first). */\n chat: async (\n agentId: string,\n query: string,\n opts: SendChatOptions & { version?: string } = {},\n ) => {\n const info = await fetchAgentInfo(ctx, agentId, opts.version ?? \"v0\");\n return sendChat(ctx, info, query, opts);\n },\n };\n}\n","/**\n * Context-loader client over the agent-retrieval MCP endpoint (JSON-RPC).\n * Reimplemented slim from kweaver-sdk: initialize → session id →\n * notifications/initialized, then tools/call. Handles plain-JSON and\n * SSE (`data:`) response bodies. Per-process session cache (5 min TTL).\n */\nimport type { RequestContext } from \"../types.js\";\nimport { HttpError } from \"../utils/errors.js\";\nimport { applyTls } from \"./tls.js\";\n\nconst MCP_PATH = \"/api/agent-retrieval/v1/mcp\";\nconst PROTOCOL = \"2024-11-05\";\nconst SESSION_TTL_MS = 300_000;\n\nconst sessions = new Map<string, { id: string; at: number }>();\nlet rpcId = 0;\nfunction nextId(): number {\n rpcId += 1;\n return rpcId;\n}\n\nfunction mcpUrl(ctx: RequestContext): string {\n return `${ctx.baseUrl}${MCP_PATH}`;\n}\n\nfunction headers(ctx: RequestContext, knId: string, sessionId?: string): Record<string, string> {\n const h: Record<string, string> = {\n \"content-type\": \"application/json\",\n accept: \"application/json, text/event-stream\",\n \"x-kn-id\": knId,\n \"mcp-protocol-version\": PROTOCOL,\n authorization: `Bearer ${ctx.token}`,\n };\n if (sessionId) h[\"mcp-session-id\"] = sessionId;\n return h;\n}\n\n/** Parse a JSON-RPC response body that may be plain JSON or an SSE stream. */\nfunction parseBody(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n const data = text\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim())\n .join(\"\");\n if (data) return JSON.parse(data);\n throw new Error(`Context-loader returned invalid JSON: ${text.slice(0, 200)}`);\n }\n}\n\nasync function post(\n ctx: RequestContext,\n knId: string,\n sessionId: string | undefined,\n body: unknown,\n) {\n applyTls(ctx);\n const res = await fetch(mcpUrl(ctx), {\n method: \"POST\",\n headers: headers(ctx, knId, sessionId),\n body: JSON.stringify(body),\n });\n const text = await res.text();\n if (!res.ok) throw new HttpError(res.status, res.statusText, text);\n return { res, text };\n}\n\nasync function ensureSession(ctx: RequestContext, knId: string): Promise<string> {\n const key = `${mcpUrl(ctx)}:${knId}`;\n const cached = sessions.get(key);\n if (cached && Date.now() - cached.at < SESSION_TTL_MS) return cached.id;\n sessions.delete(key);\n\n const { res } = await post(ctx, knId, undefined, {\n jsonrpc: \"2.0\",\n id: 1,\n method: \"initialize\",\n params: {\n protocolVersion: PROTOCOL,\n capabilities: {},\n clientInfo: { name: \"openbkn\", version: \"0.1.0\" },\n },\n });\n const sessionId = res.headers.get(\"mcp-session-id\") ?? res.headers.get(\"MCP-Session-Id\");\n if (!sessionId) throw new Error(\"MCP server did not return a session id.\");\n\n await post(ctx, knId, sessionId, { jsonrpc: \"2.0\", method: \"notifications/initialized\" });\n sessions.set(key, { id: sessionId, at: Date.now() });\n return sessionId;\n}\n\n/** Unwrap a JSON-RPC result, decoding the MCP content[].text JSON payload. */\nfunction unwrap(parsed: unknown): unknown {\n const rpc = parsed as { result?: unknown; error?: { message: string } };\n if (rpc.error) throw new Error(`Context-loader error: ${rpc.error.message}`);\n const result = rpc.result as Record<string, unknown> | undefined;\n if (result === undefined) return parsed;\n const content = result.content;\n if (Array.isArray(content) && content[0] && typeof content[0].text === \"string\") {\n try {\n return JSON.parse(content[0].text);\n } catch {\n return { raw: content[0].text };\n }\n }\n return result;\n}\n\n/** Call any MCP tool by name. */\nexport async function callTool(\n ctx: RequestContext,\n knId: string,\n name: string,\n args: Record<string, unknown>,\n): Promise<unknown> {\n const sessionId = await ensureSession(ctx, knId);\n const { text } = await post(ctx, knId, sessionId, {\n jsonrpc: \"2.0\",\n method: \"tools/call\",\n params: { name, arguments: args },\n id: nextId(),\n });\n return unwrap(parseBody(text));\n}\n\n/** Call a generic MCP method (tools/list, resources/list, ...). */\nexport async function callMethod(\n ctx: RequestContext,\n knId: string,\n method: string,\n params: Record<string, unknown> = {},\n): Promise<unknown> {\n const sessionId = await ensureSession(ctx, knId);\n const { text } = await post(ctx, knId, sessionId, {\n jsonrpc: \"2.0\",\n method,\n params: Object.keys(params).length > 0 ? params : undefined,\n id: nextId(),\n });\n const parsed = parseBody(text) as { result?: unknown; error?: { message: string } };\n if (parsed.error) throw new Error(`Context-loader error: ${parsed.error.message}`);\n return parsed.result;\n}\n\n// ---- typed tool wrappers ---------------------------------------------------\n\nexport interface SearchSchemaOptions {\n searchScope?: string[];\n maxConcepts?: number;\n}\n\nexport function searchSchema(\n ctx: RequestContext,\n knId: string,\n query: string,\n opts: SearchSchemaOptions = {},\n): Promise<unknown> {\n const args: Record<string, unknown> = { query, response_format: \"json\" };\n if (opts.searchScope) args.search_scope = opts.searchScope;\n if (opts.maxConcepts !== undefined) args.max_concepts = opts.maxConcepts;\n return callTool(ctx, knId, \"search_schema\", args);\n}\n\nexport function queryObjectInstance(\n ctx: RequestContext,\n knId: string,\n args: Record<string, unknown>,\n): Promise<unknown> {\n return callTool(ctx, knId, \"query_object_instance\", args);\n}\n\nexport function findSkills(\n ctx: RequestContext,\n knId: string,\n objectTypeId: string,\n topK?: number,\n): Promise<unknown> {\n const args: Record<string, unknown> = { object_type_id: objectTypeId };\n if (topK !== undefined) args.top_k = topK;\n return callTool(ctx, knId, \"find_skills\", args);\n}\n\nexport function listTools(ctx: RequestContext, knId: string): Promise<unknown> {\n return callMethod(ctx, knId, \"tools/list\");\n}\n\n/** Layer-2 subgraph query across relation-type paths (`query_instance_subgraph`). */\nexport function queryInstanceSubgraph(\n ctx: RequestContext,\n knId: string,\n args: Record<string, unknown>,\n): Promise<unknown> {\n return callTool(ctx, knId, \"query_instance_subgraph\", args);\n}\n\n/** Layer-3 logic-property values for given instances (`get_logic_properties_values`). */\nexport function getLogicProperties(\n ctx: RequestContext,\n knId: string,\n args: Record<string, unknown>,\n): Promise<unknown> {\n return callTool(ctx, knId, \"get_logic_properties_values\", args);\n}\n\n/** Layer-3 action info / dynamic tools for an instance (`get_action_info`). */\nexport function getActionInfo(\n ctx: RequestContext,\n knId: string,\n args: Record<string, unknown>,\n): Promise<unknown> {\n return callTool(ctx, knId, \"get_action_info\", args);\n}\n\n// ---- standard MCP resource / prompt methods --------------------------------\n\nexport function listResources(ctx: RequestContext, knId: string): Promise<unknown> {\n return callMethod(ctx, knId, \"resources/list\");\n}\nexport function readResource(ctx: RequestContext, knId: string, uri: string): Promise<unknown> {\n return callMethod(ctx, knId, \"resources/read\", { uri });\n}\nexport function listResourceTemplates(ctx: RequestContext, knId: string): Promise<unknown> {\n return callMethod(ctx, knId, \"resources/templates/list\");\n}\nexport function listPrompts(ctx: RequestContext, knId: string): Promise<unknown> {\n return callMethod(ctx, knId, \"prompts/list\");\n}\nexport function getPrompt(\n ctx: RequestContext,\n knId: string,\n name: string,\n args: Record<string, unknown> = {},\n): Promise<unknown> {\n return callMethod(ctx, knId, \"prompts/get\", { name, arguments: args });\n}\n","/** Context-loader resource surface (MCP over agent-retrieval). */\nimport {\n type SearchSchemaOptions,\n callTool,\n findSkills,\n getActionInfo,\n getLogicProperties,\n getPrompt,\n listPrompts,\n listResourceTemplates,\n listResources,\n listTools,\n queryInstanceSubgraph,\n queryObjectInstance,\n readResource,\n searchSchema,\n} from \"../api/context-loader.js\";\nimport type { RequestContext } from \"../types.js\";\n\nexport function context(ctx: RequestContext) {\n return {\n searchSchema: (knId: string, query: string, opts?: SearchSchemaOptions) =>\n searchSchema(ctx, knId, query, opts),\n queryObjectInstance: (knId: string, args: Record<string, unknown>) =>\n queryObjectInstance(ctx, knId, args),\n findSkills: (knId: string, objectTypeId: string, topK?: number) =>\n findSkills(ctx, knId, objectTypeId, topK),\n tools: (knId: string) => listTools(ctx, knId),\n toolCall: (knId: string, name: string, args: Record<string, unknown>) =>\n callTool(ctx, knId, name, args),\n queryInstanceSubgraph: (knId: string, args: Record<string, unknown>) =>\n queryInstanceSubgraph(ctx, knId, args),\n logicProperties: (knId: string, args: Record<string, unknown>) =>\n getLogicProperties(ctx, knId, args),\n actionInfo: (knId: string, args: Record<string, unknown>) => getActionInfo(ctx, knId, args),\n resources: (knId: string) => listResources(ctx, knId),\n resource: (knId: string, uri: string) => readResource(ctx, knId, uri),\n templates: (knId: string) => listResourceTemplates(ctx, knId),\n prompts: (knId: string) => listPrompts(ctx, knId),\n prompt: (knId: string, name: string, args?: Record<string, unknown>) =>\n getPrompt(ctx, knId, name, args),\n };\n}\n","/**\n * Dataflow backend client (automation v2). Read endpoints (list/runs/logs) are\n * implemented from kweaver-sdk; trigger/create bodies are deferred until the\n * contract is verified on a live env. Responses passed through as parsed JSON.\n */\nimport type { RequestContext } from \"../types.js\";\nimport { request } from \"./http.js\";\n\nconst BASE = \"/api/automation/v2\";\nconst BASE_V1 = \"/api/automation/v1\";\n\nexport function listDataflows(ctx: RequestContext): Promise<unknown> {\n return request(ctx, `${BASE}/dags`, { query: { type: \"data-flow\", page: 0, limit: -1 } });\n}\n\n/** Create a dataflow (DAG) from a full document body. Returns the new DAG id. */\nexport function createDataflow(ctx: RequestContext, body: unknown): Promise<unknown> {\n return request(ctx, `${BASE_V1}/data-flow/flow`, { method: \"POST\", body });\n}\n\n/** Trigger a run of an existing dataflow DAG. */\nexport function runDataflow(ctx: RequestContext, dagId: string): Promise<unknown> {\n return request(ctx, `${BASE_V1}/run-instance/${encodeURIComponent(dagId)}`, {\n method: \"POST\",\n body: {},\n });\n}\n\n/** Delete a dataflow DAG. */\nexport function deleteDataflow(ctx: RequestContext, dagId: string): Promise<unknown> {\n return request(ctx, `${BASE_V1}/data-flow/flow/${encodeURIComponent(dagId)}`, {\n method: \"DELETE\",\n });\n}\n\n/**\n * Run a one-shot dataflow document to completion: create → run → poll the\n * latest result until success/failure → delete the DAG (always). Throws on a\n * failed run or timeout.\n */\nexport async function executeDataflow(\n ctx: RequestContext,\n body: unknown,\n opts: { intervalMs?: number; timeoutMs?: number } = {},\n): Promise<unknown> {\n const created = (await createDataflow(ctx, body)) as { id?: string };\n const dagId = String(created.id ?? \"\");\n if (!dagId) throw new Error(\"createDataflow returned no DAG id\");\n try {\n await runDataflow(ctx, dagId);\n const interval = opts.intervalMs ?? 2000;\n const deadline = opts.timeoutMs ?? 300_000;\n let waited = 0;\n for (;;) {\n const res = (await request(ctx, `${BASE_V1}/dag/${encodeURIComponent(dagId)}/results`)) as {\n results?: Array<{ status?: string }>;\n };\n const status = res.results?.[0]?.status;\n if (status === \"success\" || status === \"completed\") return { dagId, status };\n if (status === \"failed\" || status === \"error\") throw new Error(`Dataflow run ${status}`);\n if (waited >= deadline) throw new Error(`Dataflow run timed out after ${deadline}ms`);\n await new Promise((r) => setTimeout(r, interval));\n waited += interval;\n }\n } finally {\n await deleteDataflow(ctx, dagId).catch(() => {});\n }\n}\n\nexport interface ListRunsOptions {\n since?: string;\n}\n\nexport function listDataflowRuns(\n ctx: RequestContext,\n dagId: string,\n opts: ListRunsOptions = {},\n): Promise<unknown> {\n return request(ctx, `${BASE}/dag/${encodeURIComponent(dagId)}/results`, {\n query: { since: opts.since || undefined },\n });\n}\n\nexport interface LogsOptions {\n page?: number;\n limit?: number;\n}\n\n/** Trigger a dataflow run from a remote file URL. */\nexport function runDataflowRemote(\n ctx: RequestContext,\n dagId: string,\n url: string,\n name: string,\n): Promise<unknown> {\n return request(ctx, `${BASE}/dataflow-doc/trigger/${encodeURIComponent(dagId)}`, {\n method: \"POST\",\n body: { source_from: \"remote\", url, name },\n });\n}\n\nexport function getDataflowLogs(\n ctx: RequestContext,\n dagId: string,\n instanceId: string,\n opts: LogsOptions = {},\n): Promise<unknown> {\n return request(\n ctx,\n `${BASE}/dag/${encodeURIComponent(dagId)}/result/${encodeURIComponent(instanceId)}`,\n { query: { page: opts.page ?? 0, limit: opts.limit ?? 30 } },\n );\n}\n","/**\n * Knowledge-network backend client (ontology-manager + agent-retrieval).\n * Endpoints mirror kweaver-sdk; responses are passed through as parsed JSON\n * (shapes vary by backend version — validate at higher layers as needed).\n */\nimport type { RequestContext } from \"../types.js\";\nimport { request } from \"./http.js\";\n\nconst ONTOLOGY_BASE = \"/api/ontology-manager/v1/knowledge-networks\";\nconst ONTOLOGY_QUERY_BASE = \"/api/ontology-query/v1/knowledge-networks\";\nconst RETRIEVAL_BASE = \"/api/agent-retrieval/v1/kn\";\n\nexport interface ListKnOptions {\n offset?: number;\n limit?: number;\n sort?: string;\n direction?: \"asc\" | \"desc\";\n namePattern?: string;\n tag?: string;\n}\n\nexport function listKnowledgeNetworks(\n ctx: RequestContext,\n opts: ListKnOptions = {},\n): Promise<unknown> {\n return request(ctx, ONTOLOGY_BASE, {\n query: {\n offset: opts.offset ?? 0,\n limit: opts.limit ?? 30,\n sort: opts.sort ?? \"update_time\",\n direction: opts.direction ?? \"desc\",\n name_pattern: opts.namePattern || undefined,\n tag: opts.tag || undefined,\n },\n });\n}\n\nexport interface GetKnOptions {\n /** Return the full export payload. */\n exportMode?: boolean;\n /** Include statistics in the response. */\n stats?: boolean;\n}\n\nexport function getKnowledgeNetwork(\n ctx: RequestContext,\n knId: string,\n opts: GetKnOptions = {},\n): Promise<unknown> {\n return request(ctx, `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}`, {\n query: {\n mode: opts.exportMode ? \"export\" : undefined,\n include_statistics: opts.stats ? \"true\" : undefined,\n },\n });\n}\n\nexport interface CreateKnOptions {\n name: string;\n branch?: string;\n baseBranch?: string;\n}\n\n/** Create a knowledge network from a fully-formed body (e.g. a rendered template). */\nexport function createKnowledgeNetworkRaw(ctx: RequestContext, body: unknown): Promise<unknown> {\n return request(ctx, ONTOLOGY_BASE, { method: \"POST\", body });\n}\n\nexport function createKnowledgeNetwork(\n ctx: RequestContext,\n opts: CreateKnOptions,\n): Promise<unknown> {\n return request(ctx, ONTOLOGY_BASE, {\n method: \"POST\",\n body: { name: opts.name, branch: opts.branch ?? \"main\", base_branch: opts.baseBranch ?? \"\" },\n });\n}\n\nexport function deleteKnowledgeNetwork(ctx: RequestContext, knId: string): Promise<unknown> {\n return request(ctx, `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}`, { method: \"DELETE\" });\n}\n\nexport function updateKnowledgeNetwork(\n ctx: RequestContext,\n knId: string,\n body: unknown,\n): Promise<unknown> {\n return request(ctx, `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}`, { method: \"PUT\", body });\n}\n\n/** Query a subgraph (ontology-query). Body is a JSON query passthrough. */\nexport function querySubgraph(ctx: RequestContext, knId: string, body: unknown): Promise<unknown> {\n return request(ctx, `${ONTOLOGY_QUERY_BASE}/${encodeURIComponent(knId)}/subgraph`, {\n method: \"POST\",\n body,\n });\n}\n\nexport interface ActionLogListOptions {\n actionTypeId?: string;\n status?: string;\n triggerType?: string;\n limit?: number;\n needTotal?: boolean;\n}\n\nexport function listActionLogs(\n ctx: RequestContext,\n knId: string,\n opts: ActionLogListOptions = {},\n): Promise<unknown> {\n return request(ctx, `${ONTOLOGY_QUERY_BASE}/${encodeURIComponent(knId)}/action-logs`, {\n query: {\n action_type_id: opts.actionTypeId || undefined,\n status: opts.status || undefined,\n trigger_type: opts.triggerType || undefined,\n limit: opts.limit ?? 30,\n need_total: opts.needTotal ? \"true\" : undefined,\n },\n });\n}\n\nexport function getActionLog(ctx: RequestContext, knId: string, logId: string): Promise<unknown> {\n return request(\n ctx,\n `${ONTOLOGY_QUERY_BASE}/${encodeURIComponent(knId)}/action-logs/${encodeURIComponent(logId)}`,\n );\n}\n\nexport function cancelActionLog(\n ctx: RequestContext,\n knId: string,\n logId: string,\n): Promise<unknown> {\n return request(\n ctx,\n `${ONTOLOGY_QUERY_BASE}/${encodeURIComponent(knId)}/action-logs/${encodeURIComponent(logId)}/cancel`,\n { method: \"POST\" },\n );\n}\n\n/** Query instances of an object type (ontology-query). Body is a JSON query. */\nexport function queryObjectTypeInstances(\n ctx: RequestContext,\n knId: string,\n otId: string,\n body: unknown,\n): Promise<unknown> {\n return request(\n ctx,\n `${ONTOLOGY_QUERY_BASE}/${encodeURIComponent(knId)}/object-types/${encodeURIComponent(otId)}`,\n { method: \"POST\", body },\n );\n}\n\n/** Get an object type's (calculated) properties (ontology-query). */\nexport function getObjectTypeProperties(\n ctx: RequestContext,\n knId: string,\n otId: string,\n): Promise<unknown> {\n return request(\n ctx,\n `${ONTOLOGY_QUERY_BASE}/${encodeURIComponent(knId)}/object-types/${encodeURIComponent(otId)}/properties`,\n );\n}\n\n/** Query an action type (ontology-query). Body is a JSON query passthrough. */\nexport function queryActionType(\n ctx: RequestContext,\n knId: string,\n atId: string,\n body: unknown,\n): Promise<unknown> {\n return request(\n ctx,\n `${ONTOLOGY_QUERY_BASE}/${encodeURIComponent(knId)}/action-types/${encodeURIComponent(atId)}/`,\n { method: \"POST\", body },\n );\n}\n\n/** Execute an action type (ontology-query). Body is the execution envelope. */\nexport function executeActionType(\n ctx: RequestContext,\n knId: string,\n atId: string,\n body: unknown,\n): Promise<unknown> {\n return request(\n ctx,\n `${ONTOLOGY_QUERY_BASE}/${encodeURIComponent(knId)}/action-types/${encodeURIComponent(atId)}/execute`,\n { method: \"POST\", body },\n );\n}\n\n/** Get an action type's input schema (ontology-query). */\nexport function getActionTypeInputs(\n ctx: RequestContext,\n knId: string,\n atId: string,\n): Promise<unknown> {\n return request(\n ctx,\n `${ONTOLOGY_QUERY_BASE}/${encodeURIComponent(knId)}/action-types/${encodeURIComponent(atId)}/inputs`,\n );\n}\n\nexport function getActionExecution(\n ctx: RequestContext,\n knId: string,\n executionId: string,\n): Promise<unknown> {\n return request(\n ctx,\n `${ONTOLOGY_QUERY_BASE}/${encodeURIComponent(knId)}/action-executions/${encodeURIComponent(executionId)}`,\n );\n}\n\n/** Query a metric's data (ontology-query). Body is a JSON query passthrough. */\nexport function queryMetricData(\n ctx: RequestContext,\n knId: string,\n metricId: string,\n body: unknown,\n): Promise<unknown> {\n return request(\n ctx,\n `${ONTOLOGY_QUERY_BASE}/${encodeURIComponent(knId)}/metrics/${encodeURIComponent(metricId)}/data`,\n { method: \"POST\", body },\n );\n}\n\n/** Dry-run a metric definition (ontology-query). */\nexport function dryRunMetric(ctx: RequestContext, knId: string, body: unknown): Promise<unknown> {\n return request(ctx, `${ONTOLOGY_QUERY_BASE}/${encodeURIComponent(knId)}/metrics/dry-run`, {\n method: \"POST\",\n body,\n });\n}\n\nexport interface ListSchemaOptions {\n branch?: string;\n /** -1 = all (backend default). */\n limit?: number;\n}\n\nfunction schemaListQuery(opts: ListSchemaOptions) {\n return { branch: opts.branch ?? \"main\", limit: String(opts.limit ?? -1) };\n}\n\nexport function listObjectTypes(\n ctx: RequestContext,\n knId: string,\n opts: ListSchemaOptions = {},\n): Promise<unknown> {\n return request(ctx, `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}/object-types`, {\n query: schemaListQuery(opts),\n });\n}\n\n/** Batch-create object types in one all-or-nothing transaction (`{entries:[…]}`). */\nexport function createObjectTypes(\n ctx: RequestContext,\n knId: string,\n entries: unknown[],\n branch = \"main\",\n): Promise<unknown> {\n return request(ctx, `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}/object-types`, {\n method: \"POST\",\n query: { branch },\n body: { entries },\n });\n}\n\nexport function listRelationTypes(\n ctx: RequestContext,\n knId: string,\n opts: ListSchemaOptions = {},\n): Promise<unknown> {\n return request(ctx, `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}/relation-types`, {\n query: schemaListQuery(opts),\n });\n}\n\nexport function listActionTypes(\n ctx: RequestContext,\n knId: string,\n opts: ListSchemaOptions = {},\n): Promise<unknown> {\n return request(ctx, `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}/action-types`, {\n query: schemaListQuery(opts),\n });\n}\n\n/** Schema item kind in the ontology-manager path. */\nexport type SchemaKind = \"object-types\" | \"relation-types\" | \"action-types\";\n\nexport function getSchemaItem(\n ctx: RequestContext,\n knId: string,\n kind: SchemaKind,\n id: string,\n): Promise<unknown> {\n return request(\n ctx,\n `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}/${kind}/${encodeURIComponent(id)}`,\n );\n}\nexport function createSchemaItem(\n ctx: RequestContext,\n knId: string,\n kind: SchemaKind,\n body: unknown,\n): Promise<unknown> {\n return request(ctx, `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}/${kind}`, {\n method: \"POST\",\n body,\n });\n}\nexport function updateSchemaItem(\n ctx: RequestContext,\n knId: string,\n kind: SchemaKind,\n id: string,\n body: unknown,\n): Promise<unknown> {\n return request(\n ctx,\n `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}/${kind}/${encodeURIComponent(id)}`,\n {\n method: \"PUT\",\n body,\n },\n );\n}\nexport function deleteSchemaItem(\n ctx: RequestContext,\n knId: string,\n kind: SchemaKind,\n id: string,\n): Promise<unknown> {\n return request(\n ctx,\n `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}/${kind}/${encodeURIComponent(id)}`,\n {\n method: \"DELETE\",\n },\n );\n}\n\n// Metric definitions live under ontology-manager (data/dry-run are query-side).\nexport function listMetrics(\n ctx: RequestContext,\n knId: string,\n opts: ListSchemaOptions = {},\n): Promise<unknown> {\n return request(ctx, `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}/metrics`, {\n query: { branch: opts.branch ?? \"main\", limit: String(opts.limit ?? -1) },\n });\n}\nexport function getMetric(ctx: RequestContext, knId: string, metricId: string): Promise<unknown> {\n return request(\n ctx,\n `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}/metrics/${encodeURIComponent(metricId)}`,\n );\n}\nexport function createMetric(ctx: RequestContext, knId: string, body: unknown): Promise<unknown> {\n return request(ctx, `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}/metrics`, {\n method: \"POST\",\n body,\n });\n}\nexport function updateMetric(\n ctx: RequestContext,\n knId: string,\n metricId: string,\n body: unknown,\n): Promise<unknown> {\n return request(\n ctx,\n `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}/metrics/${encodeURIComponent(metricId)}`,\n {\n method: \"PUT\",\n body,\n },\n );\n}\nexport function deleteMetric(\n ctx: RequestContext,\n knId: string,\n metricId: string,\n): Promise<unknown> {\n return request(\n ctx,\n `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}/metrics/${encodeURIComponent(metricId)}`,\n {\n method: \"DELETE\",\n },\n );\n}\nexport function searchMetrics(ctx: RequestContext, knId: string, body: unknown): Promise<unknown> {\n return request(ctx, `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}/metrics/search`, {\n method: \"POST\",\n body,\n });\n}\nexport function validateMetric(ctx: RequestContext, knId: string, body: unknown): Promise<unknown> {\n return request(ctx, `${ONTOLOGY_BASE}/${encodeURIComponent(knId)}/metrics/validate`, {\n method: \"POST\",\n body,\n });\n}\n\nexport interface SemanticSearchOptions {\n mode?: string;\n maxConcepts?: number;\n returnQueryUnderstanding?: boolean;\n}\n\nexport function semanticSearch(\n ctx: RequestContext,\n knId: string,\n query: string,\n opts: SemanticSearchOptions = {},\n): Promise<unknown> {\n return request(ctx, `${RETRIEVAL_BASE}/semantic-search`, {\n method: \"POST\",\n body: {\n kn_id: knId,\n query,\n mode: opts.mode ?? \"keyword_vector_retrieval\",\n max_concepts: opts.maxConcepts ?? 10,\n return_query_understanding: opts.returnQueryUnderstanding ?? false,\n },\n });\n}\n","/**\n * Vega-backend resource client (list/find/get/query/delete). Endpoints mirror\n * kweaver-sdk `api/resources.ts`. Responses passed through as parsed JSON.\n */\nimport type { RequestContext } from \"../types.js\";\nimport { request } from \"./http.js\";\n\nconst BASE = \"/api/vega-backend/v1/resources\";\n\nexport interface ListResourcesOptions {\n datasourceId?: string;\n name?: string;\n /** Resource category, e.g. table | logicview. */\n category?: string;\n limit?: number;\n}\n\nexport function listResources(\n ctx: RequestContext,\n opts: ListResourcesOptions = {},\n): Promise<unknown> {\n return request(ctx, BASE, {\n query: {\n catalog_id: opts.datasourceId || undefined,\n name: opts.name || undefined,\n category: opts.category || undefined,\n limit: opts.limit && opts.limit > 0 ? opts.limit : undefined,\n },\n });\n}\n\nexport function getResource(ctx: RequestContext, id: string): Promise<unknown> {\n return request(ctx, `${BASE}/${encodeURIComponent(id)}`);\n}\n\nexport interface CreateResourceOptions {\n name: string;\n catalogId: string;\n /** Source table/identifier in the catalog. */\n sourceIdentifier: string;\n fields?: Array<{ name: string; type: string }>;\n}\n\n/** Create a vega-backend resource from a fully-formed body (e.g. a rendered template). */\nexport function createResourceRaw(ctx: RequestContext, body: unknown): Promise<unknown> {\n return request(ctx, BASE, { method: \"POST\", body });\n}\n\n/** Create a vega-backend table resource bound to a catalog source. */\nexport function createResource(ctx: RequestContext, opts: CreateResourceOptions): Promise<unknown> {\n const body: Record<string, unknown> = {\n name: opts.name,\n catalog_id: opts.catalogId,\n category: \"table\",\n source_identifier: opts.sourceIdentifier,\n };\n if (opts.fields && opts.fields.length > 0) body.schema_definition = opts.fields;\n return request(ctx, BASE, { method: \"POST\", body });\n}\n\nexport function deleteResource(ctx: RequestContext, id: string): Promise<unknown> {\n return request(ctx, `${BASE}/${encodeURIComponent(id)}`, { method: \"DELETE\" });\n}\n\nexport interface FindResourceOptions {\n datasourceId?: string;\n /** Exact name match instead of fuzzy. */\n exact?: boolean;\n}\n\n/** Search resources by name (fuzzy by default; exact filters client-side). */\nexport async function findResource(\n ctx: RequestContext,\n name: string,\n opts: FindResourceOptions = {},\n): Promise<unknown> {\n const result = (await listResources(ctx, { name, datasourceId: opts.datasourceId })) as\n | { entries?: Array<{ name?: string }> }\n | Array<{ name?: string }>;\n const list = Array.isArray(result) ? result : (result.entries ?? []);\n return opts.exact ? list.filter((r) => r.name === name) : list;\n}\n\nexport interface QueryResourceOptions {\n limit?: number;\n offset?: number;\n needTotal?: boolean;\n}\n\nexport function queryResource(\n ctx: RequestContext,\n id: string,\n opts: QueryResourceOptions = {},\n): Promise<unknown> {\n return request(ctx, `${BASE}/${encodeURIComponent(id)}/data`, {\n method: \"POST\",\n body: {\n limit: opts.limit ?? 50,\n offset: opts.offset ?? 0,\n need_total: opts.needTotal ?? false,\n },\n });\n}\n","{\n \"name\": \"document\",\n \"type\": \"bkn\",\n \"description\": \"文档知识网络\",\n \"arguments\": [\n { \"name\": \"name\", \"required\": true, \"description\": \"BKN 名称\", \"type\": \"string\" },\n {\n \"name\": \"embedding_model_id\",\n \"required\": true,\n \"description\": \"向量化模型 ID\",\n \"type\": \"string\"\n },\n {\n \"name\": \"content_dataset_id\",\n \"required\": true,\n \"description\": \"内容数据集 ID\",\n \"type\": \"string\"\n },\n {\n \"name\": \"document_dataset_id\",\n \"required\": true,\n \"description\": \"文档数据集 ID\",\n \"type\": \"string\"\n },\n {\n \"name\": \"element_dataset_id\",\n \"required\": true,\n \"description\": \"元素数据集 ID\",\n \"type\": \"string\"\n }\n ]\n}\n","{\n \"branch\": \"main\",\n \"business_domain\": \"bd_public\",\n \"color\": \"#0e5fc5\",\n \"detail\": \"---\\ntype: knowledge_network\\nname: {{name}}\\ntags: []\\nbranch: main\\n---\\n\\n# {{name}}\\n\\n\\n## Network Overview\\n\\n\",\n \"icon\": \"icon-dip-graph\",\n \"module_type\": \"knowledge_network\",\n \"name\": \"{{name}}\",\n \"object_types\": [\n {\n \"branch\": \"main\",\n \"color\": \"#0e5fc5\",\n \"comment\": \"\",\n \"data_properties\": [\n {\n \"comment\": \"\",\n \"condition_operations\": [\n \"==\",\n \"!=\",\n \"in\",\n \"not_in\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"range\",\n \"out_range\",\n \"regex\",\n \"like\",\n \"not_like\"\n ],\n \"display_name\": \"deduplication_id\",\n \"index_config\": {\n \"fulltext_config\": {\n \"analyzer\": \"ik_max_word\",\n \"enabled\": true\n },\n \"keyword_config\": {\n \"enabled\": true,\n \"ignore_above_len\": 1024\n },\n \"vector_config\": {\n \"enabled\": true,\n \"model_id\": \"{{embedding_model_id}}\"\n }\n },\n \"mapped_field\": {\n \"display_name\": \"deduplication_id\",\n \"name\": \"deduplication_id\",\n \"type\": \"string\"\n },\n \"name\": \"deduplication_id\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"document_id\",\n \"mapped_field\": {\n \"display_name\": \"document_id\",\n \"name\": \"document_id\",\n \"type\": \"string\"\n },\n \"name\": \"document_id\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"img_path\",\n \"mapped_field\": {\n \"display_name\": \"img_path\",\n \"name\": \"img_path\",\n \"type\": \"string\"\n },\n \"name\": \"img_path\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"condition_operations\": [\n \"==\",\n \"!=\",\n \"in\",\n \"not_in\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"range\",\n \"out_range\",\n \"regex\",\n \"like\",\n \"not_like\"\n ],\n \"display_name\": \"id\",\n \"index_config\": {\n \"fulltext_config\": {\n \"analyzer\": \"ik_max_word\",\n \"enabled\": true\n },\n \"keyword_config\": {\n \"enabled\": true,\n \"ignore_above_len\": 1024\n },\n \"vector_config\": {\n \"enabled\": true,\n \"model_id\": \"{{embedding_model_id}}\"\n }\n },\n \"mapped_field\": {\n \"display_name\": \"id\",\n \"name\": \"id\",\n \"type\": \"string\"\n },\n \"name\": \"id\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"condition_operations\": [\n \"match\",\n \"multi_match\",\n \"==\",\n \"!=\",\n \"in\",\n \"not_in\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"range\",\n \"out_range\",\n \"regex\",\n \"like\",\n \"not_like\"\n ],\n \"display_name\": \"doc_name\",\n \"index_config\": {\n \"fulltext_config\": {\n \"analyzer\": \"ik_max_word\",\n \"enabled\": true\n },\n \"keyword_config\": {\n \"enabled\": true,\n \"ignore_above_len\": 1024\n },\n \"vector_config\": {\n \"enabled\": true,\n \"model_id\": \"{{embedding_model_id}}\"\n }\n },\n \"mapped_field\": {\n \"display_name\": \"doc_name\",\n \"name\": \"doc_name\",\n \"type\": \"text\"\n },\n \"name\": \"doc_name\",\n \"type\": \"text\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"pages\",\n \"name\": \"pages\",\n \"type\": \"text\"\n },\n {\n \"comment\": \"\",\n \"condition_operations\": [\n \"match\",\n \"multi_match\",\n \"==\",\n \"!=\",\n \"in\",\n \"not_in\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"range\",\n \"out_range\",\n \"regex\",\n \"like\",\n \"not_like\"\n ],\n \"display_name\": \"slice_content\",\n \"index_config\": {\n \"fulltext_config\": {\n \"analyzer\": \"ik_max_word\",\n \"enabled\": true\n },\n \"keyword_config\": {\n \"enabled\": true,\n \"ignore_above_len\": 1024\n },\n \"vector_config\": {\n \"enabled\": true,\n \"model_id\": \"{{embedding_model_id}}\"\n }\n },\n \"mapped_field\": {\n \"display_name\": \"slice_content\",\n \"name\": \"slice_content\",\n \"type\": \"text\"\n },\n \"name\": \"slice_content\",\n \"type\": \"text\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"segment_id\",\n \"name\": \"segment_id\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"updated_at\",\n \"mapped_field\": {\n \"display_name\": \"updated_at\",\n \"name\": \"updated_at\",\n \"type\": \"datetime\"\n },\n \"name\": \"updated_at\",\n \"type\": \"datetime\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"doc_md5\",\n \"mapped_field\": {\n \"display_name\": \"doc_md5\",\n \"name\": \"doc_md5\",\n \"type\": \"string\"\n },\n \"name\": \"doc_md5\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"slice_type\",\n \"mapped_field\": {\n \"display_name\": \"slice_type\",\n \"name\": \"slice_type\",\n \"type\": \"integer\"\n },\n \"name\": \"slice_type\",\n \"type\": \"integer\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"element_ids\",\n \"name\": \"element_ids\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"created_at\",\n \"mapped_field\": {\n \"display_name\": \"created_at\",\n \"name\": \"created_at\",\n \"type\": \"datetime\"\n },\n \"name\": \"created_at\",\n \"type\": \"datetime\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"element_id\",\n \"name\": \"element_id\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"slice_md5\",\n \"mapped_field\": {\n \"display_name\": \"slice_md5\",\n \"name\": \"slice_md5\",\n \"type\": \"string\"\n },\n \"name\": \"slice_md5\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"text_vector\",\n \"mapped_field\": {\n \"display_name\": \"text_vector\",\n \"name\": \"text_vector\",\n \"type\": \"vector\"\n },\n \"name\": \"text_vector\",\n \"type\": \"vector\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"image_vector\",\n \"mapped_field\": {\n \"display_name\": \"image_vector\",\n \"name\": \"image_vector\",\n \"type\": \"vector\"\n },\n \"name\": \"image_vector\",\n \"type\": \"vector\"\n }\n ],\n \"data_source\": {\n \"id\": \"{{content_dataset_id}}\",\n \"type\": \"resource\"\n },\n \"display_key\": \"id\",\n \"icon\": \"icon-tianshenpi\",\n \"id\": \"d6sco6s2mlgikcusgpo0\",\n \"incremental_key\": \"\",\n \"kn_id\": \"d6scm5c2mlgikcusgpmg\",\n \"module_type\": \"object_type\",\n \"name\": \"文档特征对象\",\n \"primary_keys\": [\"id\"],\n \"tags\": []\n },\n {\n \"branch\": \"main\",\n \"color\": \"#0e5fc5\",\n \"comment\": \"\",\n \"data_properties\": [\n {\n \"comment\": \"\",\n \"condition_operations\": [\n \"match\",\n \"multi_match\",\n \"==\",\n \"!=\",\n \"in\",\n \"not_in\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"range\",\n \"out_range\",\n \"regex\",\n \"like\",\n \"not_like\"\n ],\n \"display_name\": \"doc_name\",\n \"index_config\": {\n \"fulltext_config\": {\n \"analyzer\": \"ik_max_word\",\n \"enabled\": true\n },\n \"keyword_config\": {\n \"enabled\": true,\n \"ignore_above_len\": 1024\n },\n \"vector_config\": {\n \"enabled\": true,\n \"model_id\": \"{{embedding_model_id}}\"\n }\n },\n \"mapped_field\": {\n \"display_name\": \"doc_name\",\n \"name\": \"doc_name\",\n \"type\": \"text\"\n },\n \"name\": \"doc_name\",\n \"type\": \"text\"\n },\n {\n \"comment\": \"\",\n \"condition_operations\": [\n \"==\",\n \"!=\",\n \"in\",\n \"not_in\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"range\",\n \"out_range\",\n \"regex\",\n \"like\",\n \"not_like\"\n ],\n \"display_name\": \"document_id\",\n \"index_config\": {\n \"fulltext_config\": {\n \"analyzer\": \"\",\n \"enabled\": false\n },\n \"keyword_config\": {\n \"enabled\": true,\n \"ignore_above_len\": 1024\n },\n \"vector_config\": {\n \"enabled\": false,\n \"model_id\": \"\"\n }\n },\n \"mapped_field\": {\n \"display_name\": \"document_id\",\n \"name\": \"document_id\",\n \"type\": \"string\"\n },\n \"name\": \"document_id\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"rev\",\n \"mapped_field\": {\n \"display_name\": \"rev\",\n \"name\": \"rev\",\n \"type\": \"text\"\n },\n \"name\": \"rev\",\n \"type\": \"text\"\n }\n ],\n \"data_source\": {\n \"id\": \"{{document_dataset_id}}\",\n \"type\": \"resource\"\n },\n \"display_key\": \"doc_name\",\n \"icon\": \"icon-tianshenpi\",\n \"id\": \"d6scpd42mlgikcusgpp0\",\n \"incremental_key\": \"\",\n \"kn_id\": \"d6scm5c2mlgikcusgpmg\",\n \"module_type\": \"object_type\",\n \"name\": \"文档对象\",\n \"primary_keys\": [\"document_id\"],\n \"tags\": []\n },\n {\n \"branch\": \"main\",\n \"color\": \"#0e5fc5\",\n \"comment\": \"\",\n \"data_properties\": [\n {\n \"comment\": \"\",\n \"display_name\": \"reading_order\",\n \"mapped_field\": {\n \"display_name\": \"reading_order\",\n \"name\": \"reading_order\",\n \"type\": \"integer\"\n },\n \"name\": \"reading_order\",\n \"type\": \"integer\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"bbox_height\",\n \"name\": \"bbox_height\",\n \"type\": \"integer\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"bbox_x\",\n \"name\": \"bbox_x\",\n \"type\": \"integer\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"modal_type\",\n \"mapped_field\": {\n \"display_name\": \"modal_type\",\n \"name\": \"modal_type\",\n \"type\": \"text\"\n },\n \"name\": \"modal_type\",\n \"type\": \"text\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"bbox_y\",\n \"name\": \"bbox_y\",\n \"type\": \"integer\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"page_no\",\n \"name\": \"page_no\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"metadata_source_format\",\n \"name\": \"metadata_source_format\",\n \"type\": \"text\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"structure_html\",\n \"name\": \"structure_html\",\n \"type\": \"text\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"lat_lon\",\n \"mapped_field\": {\n \"display_name\": \"lat_lon\",\n \"name\": \"lat_lon\",\n \"type\": \"point\"\n },\n \"name\": \"lat_lon\",\n \"type\": \"point\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"metadata_deduplication_id\",\n \"name\": \"metadata_deduplication_id\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"element_id\",\n \"mapped_field\": {\n \"display_name\": \"element_id\",\n \"name\": \"element_id\",\n \"type\": \"string\"\n },\n \"name\": \"element_id\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"level\",\n \"mapped_field\": {\n \"display_name\": \"level\",\n \"name\": \"level\",\n \"type\": \"integer\"\n },\n \"name\": \"level\",\n \"type\": \"integer\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"element_type\",\n \"mapped_field\": {\n \"display_name\": \"element_type\",\n \"name\": \"element_type\",\n \"type\": \"text\"\n },\n \"name\": \"element_type\",\n \"type\": \"text\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"bbox_width\",\n \"name\": \"bbox_width\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"document_id\",\n \"mapped_field\": {\n \"display_name\": \"document_id\",\n \"name\": \"document_id\",\n \"type\": \"string\"\n },\n \"name\": \"document_id\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"condition_operations\": [\n \"match\",\n \"multi_match\",\n \"==\",\n \"!=\",\n \"in\",\n \"not_in\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"range\",\n \"out_range\",\n \"regex\",\n \"like\",\n \"not_like\"\n ],\n \"display_name\": \"content\",\n \"index_config\": {\n \"fulltext_config\": {\n \"analyzer\": \"ik_max_word\",\n \"enabled\": true\n },\n \"keyword_config\": {\n \"enabled\": false,\n \"ignore_above_len\": 1024\n },\n \"vector_config\": {\n \"enabled\": true,\n \"model_id\": \"{{embedding_model_id}}\"\n }\n },\n \"mapped_field\": {\n \"display_name\": \"content\",\n \"name\": \"content\",\n \"type\": \"text\"\n },\n \"name\": \"content\",\n \"type\": \"text\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"img_path\",\n \"name\": \"img_path\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"parent_element_id\",\n \"mapped_field\": {\n \"display_name\": \"parent_element_id\",\n \"name\": \"parent_element_id\",\n \"type\": \"string\"\n },\n \"name\": \"parent_element_id\",\n \"type\": \"string\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"@timestamp\",\n \"mapped_field\": {\n \"display_name\": \"@timestamp\",\n \"name\": \"@timestamp\",\n \"type\": \"integer\"\n },\n \"name\": \"timestamp\",\n \"type\": \"integer\"\n },\n {\n \"comment\": \"\",\n \"display_name\": \"style\",\n \"mapped_field\": {\n \"display_name\": \"style\",\n \"name\": \"style\"\n },\n \"name\": \"style\",\n \"type\": \"\"\n }\n ],\n \"data_source\": {\n \"id\": \"{{element_dataset_id}}\",\n \"type\": \"resource\"\n },\n \"display_key\": \"element_id\",\n \"icon\": \"icon-tianshenpi\",\n \"id\": \"d6scrvk2mlgikcusgpq0\",\n \"incremental_key\": \"\",\n \"kn_id\": \"d6scm5c2mlgikcusgpmg\",\n \"module_type\": \"object_type\",\n \"name\": \"文档解析树对象\",\n \"primary_keys\": [\"element_id\"],\n \"tags\": []\n }\n ],\n \"operations\": [\n \"task_manage\",\n \"import\",\n \"export\",\n \"create\",\n \"delete\",\n \"data_query\",\n \"view_detail\",\n \"modify\",\n \"authorize\"\n ],\n \"relation_types\": [\n {\n \"branch\": \"main\",\n \"color\": \"\",\n \"comment\": \"\",\n \"icon\": \"\",\n \"id\": \"d6se2d42mlgikcusgpr0\",\n \"kn_id\": \"d6scm5c2mlgikcusgpmg\",\n \"mapping_rules\": [\n {\n \"source_property\": {\n \"display_name\": \"document_id\",\n \"name\": \"document_id\"\n },\n \"target_property\": {\n \"display_name\": \"document_id\",\n \"name\": \"document_id\"\n }\n }\n ],\n \"module_type\": \"relation_type\",\n \"name\": \"文档包含特征\",\n \"source_object_type\": {\n \"branch\": \"\",\n \"color\": \"\",\n \"icon\": \"\",\n \"id\": \"\",\n \"name\": \"\"\n },\n \"source_object_type_id\": \"d6scpd42mlgikcusgpp0\",\n \"tags\": [],\n \"target_object_type\": {\n \"branch\": \"\",\n \"color\": \"\",\n \"icon\": \"\",\n \"id\": \"\",\n \"name\": \"\"\n },\n \"target_object_type_id\": \"d6scrvk2mlgikcusgpq0\",\n \"type\": \"direct\"\n },\n {\n \"branch\": \"main\",\n \"color\": \"\",\n \"comment\": \"\",\n \"icon\": \"\",\n \"id\": \"d6se2jc2mlgikcusgps0\",\n \"kn_id\": \"d6scm5c2mlgikcusgpmg\",\n \"mapping_rules\": [\n {\n \"source_property\": {\n \"display_name\": \"document_id\",\n \"name\": \"document_id\"\n },\n \"target_property\": {\n \"display_name\": \"document_id\",\n \"name\": \"document_id\"\n }\n }\n ],\n \"module_type\": \"relation_type\",\n \"name\": \"特征关联元素\",\n \"source_object_type\": {\n \"branch\": \"\",\n \"color\": \"\",\n \"icon\": \"\",\n \"id\": \"\",\n \"name\": \"\"\n },\n \"source_object_type_id\": \"d6sco6s2mlgikcusgpo0\",\n \"tags\": [],\n \"target_object_type\": {\n \"branch\": \"\",\n \"color\": \"\",\n \"icon\": \"\",\n \"id\": \"\",\n \"name\": \"\"\n },\n \"target_object_type_id\": \"d6scrvk2mlgikcusgpq0\",\n \"type\": \"direct\"\n }\n ],\n \"tags\": [],\n \"validate_dependency\": false\n}\n","{\n \"name\": \"unstructured\",\n \"type\": \"dataflow\",\n \"description\": \"非结构化文档处理流程\",\n \"arguments\": [\n { \"name\": \"title\", \"required\": true, \"description\": \"数据流标题\", \"type\": \"string\" },\n {\n \"name\": \"content_dataset_id\",\n \"required\": true,\n \"description\": \"内容数据集 ID\",\n \"type\": \"string\"\n },\n {\n \"name\": \"document_dataset_id\",\n \"required\": true,\n \"description\": \"文档数据集 ID\",\n \"type\": \"string\"\n },\n {\n \"name\": \"element_dataset_id\",\n \"required\": true,\n \"description\": \"元素数据集 ID\",\n \"type\": \"string\"\n }\n ]\n}\n","{\n \"title\": \"{{title}}\",\n \"steps\": [\n {\n \"id\": \"0\",\n \"title\": \"\",\n \"operator\": \"@trigger/dataflow-doc\"\n },\n {\n \"id\": \"1\",\n \"title\": \"\",\n \"operator\": \"@content/file_parse\",\n \"parameters\": {\n \"docid\": \"{{__0.id}}\",\n \"model\": \"embedding\",\n \"slice_vector\": \"slice_vector\",\n \"source_type\": \"docid\",\n \"version\": \"{{__0.rev}}\"\n }\n },\n {\n \"id\": \"1001\",\n \"title\": \"写入向量\",\n \"operator\": \"@dataset/write-docs\",\n \"parameters\": {\n \"dataset_id\": \"{{content_dataset_id}}\",\n \"documents\": \"{{__1.chunks}}\"\n }\n },\n {\n \"id\": \"1002\",\n \"title\": \"写入元素\",\n \"operator\": \"@dataset/write-docs\",\n \"parameters\": {\n \"dataset_id\": \"{{element_dataset_id}}\",\n \"documents\": \"{{__1.content_list}}\"\n }\n },\n {\n \"id\": \"1003\",\n \"title\": \"写入文件元信息\",\n \"operator\": \"@dataset/write-docs\",\n \"parameters\": {\n \"dataset_id\": \"{{document_dataset_id}}\",\n \"documents\": [\n {\n \"document_id\": \"{{__0.id}}\",\n \"doc_name\": \"{{__0.name}}\"\n }\n ]\n }\n }\n ],\n \"trigger_config\": {\n \"operator\": \"@trigger/manual\",\n \"dataSource\": {\n \"operator\": \"\",\n \"parameters\": {\n \"accessorid\": \"00000000-0000-0000-0000-000000000000\"\n }\n }\n }\n}\n","{\n \"name\": \"document-content\",\n \"type\": \"dataset\",\n \"description\": \"文档切片及向量数据集\",\n \"arguments\": [\n { \"name\": \"name\", \"required\": true, \"description\": \"数据集名称\", \"type\": \"string\" },\n {\n \"name\": \"catalog_id\",\n \"required\": false,\n \"default\": \"adp_bkn_catalog\",\n \"description\": \"所属目录ID\",\n \"type\": \"string\"\n },\n {\n \"name\": \"source_identifier\",\n \"required\": false,\n \"default\": \"\",\n \"description\": \"数据源标识符,为空时自动生成\",\n \"type\": \"string\"\n }\n ]\n}\n","{\n \"catalog_id\": \"{{catalog_id}}\",\n \"name\": \"{{name}}\",\n \"category\": \"dataset\",\n \"status\": \"active\",\n \"description\": \"文档切片及向量数据集\",\n \"source_identifier\": \"{{source_identifier}}\",\n \"schema_definition\": [\n { \"name\": \"id\", \"type\": \"keyword\" },\n { \"name\": \"document_id\", \"type\": \"keyword\" },\n { \"name\": \"slice_md5\", \"type\": \"keyword\" },\n { \"name\": \"deduplication_id\", \"type\": \"keyword\" },\n { \"name\": \"segment_id\", \"type\": \"integer\" },\n { \"name\": \"slice_type\", \"type\": \"integer\" },\n {\n \"name\": \"slice_content\",\n \"type\": \"text\",\n \"features\": [\n {\n \"name\": \"slice_content_fulltext\",\n \"feature_type\": \"fulltext\",\n \"ref_property\": \"slice_content\",\n \"config\": { \"analyzer\": \"standard\" }\n }\n ]\n },\n {\n \"name\": \"text_vector\",\n \"type\": \"vector\",\n \"features\": [\n {\n \"name\": \"text_vector\",\n \"feature_type\": \"vector\",\n \"ref_property\": \"text_vector\",\n \"config\": {\n \"dimension\": 768,\n \"method\": {\n \"name\": \"hnsw\",\n \"engine\": \"lucene\",\n \"parameters\": { \"ef_construction\": 256 }\n }\n }\n }\n ]\n },\n { \"name\": \"img_path\", \"type\": \"keyword\" },\n {\n \"name\": \"image_vector\",\n \"type\": \"vector\",\n \"features\": [\n {\n \"name\": \"image_vector\",\n \"feature_type\": \"vector\",\n \"ref_property\": \"image_vector\",\n \"config\": {\n \"dimension\": 512,\n \"method\": {\n \"name\": \"hnsw\",\n \"engine\": \"lucene\",\n \"parameters\": { \"ef_construction\": 256 }\n }\n }\n }\n ]\n },\n { \"name\": \"created_at\", \"type\": \"text\" },\n { \"name\": \"updated_at\", \"type\": \"text\" },\n { \"name\": \"@timestamp\", \"type\": \"long\" }\n ]\n}\n","{\n \"name\": \"document-element\",\n \"type\": \"dataset\",\n \"description\": \"文档结构化元素数据集\",\n \"arguments\": [\n { \"name\": \"name\", \"required\": true, \"description\": \"数据集名称\", \"type\": \"string\" },\n {\n \"name\": \"catalog_id\",\n \"required\": false,\n \"default\": \"adp_bkn_catalog\",\n \"description\": \"所属目录ID\",\n \"type\": \"string\"\n },\n {\n \"name\": \"source_identifier\",\n \"required\": false,\n \"default\": \"\",\n \"description\": \"数据源标识符,为空时自动生成\",\n \"type\": \"string\"\n }\n ]\n}\n","{\n \"catalog_id\": \"{{catalog_id}}\",\n \"name\": \"{{name}}\",\n \"category\": \"dataset\",\n \"status\": \"active\",\n \"description\": \"文档结构化元素数据集\",\n \"source_identifier\": \"{{source_identifier}}\",\n \"schema_definition\": [\n { \"name\": \"id\", \"type\": \"keyword\" },\n { \"name\": \"element_id\", \"type\": \"keyword\" },\n { \"name\": \"document_id\", \"type\": \"keyword\" },\n { \"name\": \"element_type\", \"type\": \"keyword\" },\n { \"name\": \"parent_id\", \"type\": \"keyword\" },\n { \"name\": \"level\", \"type\": \"integer\" },\n {\n \"name\": \"content\",\n \"type\": \"text\",\n \"features\": [\n {\n \"name\": \"content_fulltext\",\n \"feature_type\": \"fulltext\",\n \"ref_property\": \"content\",\n \"config\": { \"analyzer\": \"standard\" }\n }\n ]\n },\n { \"name\": \"metadata\", \"type\": \"object\" },\n { \"name\": \"@timestamp\", \"type\": \"long\" }\n ]\n}\n","{\n \"name\": \"document\",\n \"type\": \"dataset\",\n \"description\": \"文档元信息数据集\",\n \"arguments\": [\n { \"name\": \"name\", \"required\": true, \"description\": \"数据集名称\", \"type\": \"string\" },\n {\n \"name\": \"catalog_id\",\n \"required\": false,\n \"default\": \"adp_bkn_catalog\",\n \"description\": \"所属目录ID\",\n \"type\": \"string\"\n },\n {\n \"name\": \"source_identifier\",\n \"required\": false,\n \"default\": \"\",\n \"description\": \"数据源标识符,为空时自动生成\",\n \"type\": \"string\"\n }\n ]\n}\n","{\n \"catalog_id\": \"{{catalog_id}}\",\n \"name\": \"{{name}}\",\n \"category\": \"dataset\",\n \"status\": \"active\",\n \"description\": \"文档元信息数据集\",\n \"source_identifier\": \"{{source_identifier}}\",\n \"schema_definition\": [\n { \"name\": \"id\", \"type\": \"keyword\" },\n { \"name\": \"document_id\", \"type\": \"keyword\" },\n {\n \"name\": \"doc_name\",\n \"type\": \"text\",\n \"features\": [\n { \"name\": \"doc_name_keyword\", \"feature_type\": \"keyword\", \"ref_property\": \"doc_name\" },\n {\n \"name\": \"doc_name_fulltext\",\n \"feature_type\": \"fulltext\",\n \"ref_property\": \"doc_name\",\n \"config\": { \"analyzer\": \"standard\" }\n }\n ]\n },\n { \"name\": \"doc_md5\", \"type\": \"keyword\" },\n { \"name\": \"pages\", \"type\": \"integer\" },\n { \"name\": \"file_type\", \"type\": \"keyword\" },\n { \"name\": \"creator_id\", \"type\": \"keyword\" },\n { \"name\": \"created_at\", \"type\": \"text\" },\n { \"name\": \"updated_at\", \"type\": \"text\" },\n { \"name\": \"@timestamp\", \"type\": \"long\" }\n ]\n}\n","import bknDocumentManifest from \"../templates/bkn/document/manifest.json\" with { type: \"json\" };\nimport bknDocumentTemplate from \"../templates/bkn/document/template.json\" with { type: \"json\" };\nimport dataflowUnstructuredManifest from \"../templates/dataflow/unstructured/manifest.json\" with {\n type: \"json\",\n};\nimport dataflowUnstructuredTemplate from \"../templates/dataflow/unstructured/template.json\" with {\n type: \"json\",\n};\nimport datasetContentManifest from \"../templates/dataset/document-content/manifest.json\" with {\n type: \"json\",\n};\nimport datasetContentTemplate from \"../templates/dataset/document-content/template.json\" with {\n type: \"json\",\n};\nimport datasetElementManifest from \"../templates/dataset/document-element/manifest.json\" with {\n type: \"json\",\n};\nimport datasetElementTemplate from \"../templates/dataset/document-element/template.json\" with {\n type: \"json\",\n};\n/**\n * Bundled dataflow/dataset/bkn templates + a renderer. Templates are config\n * assets (JSON) copied verbatim from kweaver-sdk; the rendering logic (merge\n * defaults → validate required → interpolate `{{arg}}`) is reimplemented here.\n * Used by `dataflow templates` / `create-dataset` / `create-bkn`.\n */\nimport datasetDocumentManifest from \"../templates/dataset/document/manifest.json\" with {\n type: \"json\",\n};\nimport datasetDocumentTemplate from \"../templates/dataset/document/template.json\" with {\n type: \"json\",\n};\n\nexport type TemplateType = \"dataset\" | \"bkn\" | \"dataflow\";\n\nexport interface TemplateArg {\n name: string;\n required?: boolean;\n description?: string;\n type?: string;\n default?: unknown;\n}\nexport interface TemplateManifest {\n name: string;\n type: TemplateType;\n description?: string;\n arguments: TemplateArg[];\n}\nexport interface LoadedTemplate {\n manifest: TemplateManifest;\n template: Record<string, unknown>;\n}\n\nconst REGISTRY: Record<TemplateType, Record<string, LoadedTemplate>> = {\n dataset: {\n document: {\n manifest: datasetDocumentManifest as TemplateManifest,\n template: datasetDocumentTemplate as Record<string, unknown>,\n },\n \"document-content\": {\n manifest: datasetContentManifest as TemplateManifest,\n template: datasetContentTemplate as Record<string, unknown>,\n },\n \"document-element\": {\n manifest: datasetElementManifest as TemplateManifest,\n template: datasetElementTemplate as Record<string, unknown>,\n },\n },\n bkn: {\n document: {\n manifest: bknDocumentManifest as TemplateManifest,\n template: bknDocumentTemplate as Record<string, unknown>,\n },\n },\n dataflow: {\n unstructured: {\n manifest: dataflowUnstructuredManifest as TemplateManifest,\n template: dataflowUnstructuredTemplate as Record<string, unknown>,\n },\n },\n};\n\nexport function loadTemplate(type: TemplateType, name: string): LoadedTemplate | null {\n return REGISTRY[type]?.[name] ?? null;\n}\n\nexport function listTemplates(): Array<{\n type: TemplateType;\n name: string;\n description?: string;\n arguments: TemplateArg[];\n}> {\n const out: Array<{\n type: TemplateType;\n name: string;\n description?: string;\n arguments: TemplateArg[];\n }> = [];\n for (const type of Object.keys(REGISTRY) as TemplateType[]) {\n for (const [name, t] of Object.entries(REGISTRY[type])) {\n out.push({\n type,\n name,\n description: t.manifest.description,\n arguments: t.manifest.arguments,\n });\n }\n }\n return out;\n}\n\nexport function generateSourceIdentifier(prefix: string): string {\n return `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 12)}`;\n}\n\nfunction interpolate(s: string, values: Record<string, unknown>): string {\n return s.replace(/\\{\\{(\\w+)\\}\\}/g, (_m, k) =>\n values[k] !== undefined ? String(values[k]) : `{{${k}}}`,\n );\n}\nfunction deepReplace(obj: unknown, values: Record<string, unknown>): unknown {\n if (typeof obj === \"string\") return interpolate(obj, values);\n if (Array.isArray(obj)) return obj.map((x) => deepReplace(x, values));\n if (obj && typeof obj === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj as Record<string, unknown>))\n out[k] = deepReplace(v, values);\n return out;\n }\n return obj;\n}\n\n/** Merge args with manifest defaults, enforce required, then interpolate. */\nexport function renderTemplate(\n t: LoadedTemplate,\n args: Record<string, unknown>,\n): Record<string, unknown> {\n const merged: Record<string, unknown> = {};\n const missing: string[] = [];\n for (const arg of t.manifest.arguments) {\n if (args[arg.name] !== undefined) merged[arg.name] = args[arg.name];\n else if (arg.default !== undefined) merged[arg.name] = arg.default;\n else if (arg.required) missing.push(arg.name);\n }\n if (missing.length > 0) throw new Error(`Missing required argument(s): ${missing.join(\", \")}`);\n return deepReplace(t.template, merged) as Record<string, unknown>;\n}\n","/** Dataflow resource surface (read side). */\nimport {\n type ListRunsOptions,\n type LogsOptions,\n createDataflow,\n getDataflowLogs,\n listDataflowRuns,\n listDataflows,\n runDataflowRemote,\n} from \"../api/dataflow.js\";\nimport { createKnowledgeNetworkRaw } from \"../api/knowledge-networks.js\";\nimport { createResourceRaw } from \"../api/resources.js\";\nimport type { RequestContext } from \"../types.js\";\nimport {\n type TemplateType,\n generateSourceIdentifier,\n listTemplates,\n loadTemplate,\n renderTemplate,\n} from \"../utils/dataflow-templates.js\";\n\nfunction instantiate(type: TemplateType, name: string, args: Record<string, unknown>) {\n const t = loadTemplate(type, name);\n if (!t) throw new Error(`Template not found: ${type}/${name}`);\n const merged = { ...args };\n if (type === \"dataset\" && !merged.source_identifier) {\n merged.source_identifier = generateSourceIdentifier(`dataflow_${t.manifest.name}`);\n }\n return renderTemplate(t, merged);\n}\n\nexport function dataflows(ctx: RequestContext) {\n return {\n list: () => listDataflows(ctx),\n runs: (dagId: string, opts?: ListRunsOptions) => listDataflowRuns(ctx, dagId, opts),\n logs: (dagId: string, instanceId: string, opts?: LogsOptions) =>\n getDataflowLogs(ctx, dagId, instanceId, opts),\n run: (dagId: string, url: string, name: string) => runDataflowRemote(ctx, dagId, url, name),\n create: (body: unknown) => createDataflow(ctx, body),\n templates: () => listTemplates(),\n /** Instantiate a dataset template → create a vega resource. */\n createDataset: (template: string, args: Record<string, unknown>) =>\n createResourceRaw(ctx, instantiate(\"dataset\", template, args)),\n /** Instantiate a bkn template → create a knowledge network. */\n createBkn: (template: string, args: Record<string, unknown>) =>\n createKnowledgeNetworkRaw(ctx, instantiate(\"bkn\", template, args)),\n };\n}\n","import { mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport {\n addConceptGroupMembers,\n createActionSchedule,\n createConceptGroup,\n deleteActionSchedules,\n deleteConceptGroup,\n deleteJobs,\n downloadBkn,\n getActionSchedule,\n getConceptGroup,\n getJob,\n getJobTasks,\n listActionSchedules,\n listBknResources,\n listConceptGroups,\n listJobs,\n relationTypePaths,\n removeConceptGroupMembers,\n setActionScheduleStatus,\n updateActionSchedule,\n updateConceptGroup,\n uploadBkn,\n} from \"../api/bkn-backend.js\";\n/** Knowledge-network resource surface (the exported SDK API). */\nimport {\n type ActionLogListOptions,\n type CreateKnOptions,\n type GetKnOptions,\n type ListKnOptions,\n type ListSchemaOptions,\n type SemanticSearchOptions,\n cancelActionLog,\n createKnowledgeNetwork,\n createMetric,\n createSchemaItem,\n deleteKnowledgeNetwork,\n deleteMetric,\n deleteSchemaItem,\n dryRunMetric,\n executeActionType,\n getActionExecution,\n getActionLog,\n getActionTypeInputs,\n getKnowledgeNetwork,\n getMetric,\n getObjectTypeProperties,\n getSchemaItem,\n listActionLogs,\n listActionTypes,\n listKnowledgeNetworks,\n listMetrics,\n listObjectTypes,\n listRelationTypes,\n queryActionType,\n queryMetricData,\n queryObjectTypeInstances,\n querySubgraph,\n searchMetrics,\n semanticSearch,\n updateKnowledgeNetwork,\n updateMetric,\n updateSchemaItem,\n validateMetric,\n} from \"../api/knowledge-networks.js\";\nimport { createBuildTask } from \"../api/vega.js\";\nimport type { RequestContext } from \"../types.js\";\nimport { collectIndexTargets } from \"../utils/bkn-index.js\";\nimport { extractTarToDirectory, packDirectoryToTar } from \"../utils/tar.js\";\nimport {\n type CreateFromCatalogOptions,\n type CreateFromCsvOptions,\n createFromCatalog,\n createFromCsv,\n} from \"./bkn-create.js\";\n\nexport function kn(ctx: RequestContext) {\n return {\n list: (opts?: ListKnOptions) => listKnowledgeNetworks(ctx, opts),\n get: (knId: string, opts?: GetKnOptions) => getKnowledgeNetwork(ctx, knId, opts),\n search: (knId: string, query: string, opts?: SemanticSearchOptions) =>\n semanticSearch(ctx, knId, query, opts),\n create: (opts: CreateKnOptions) => createKnowledgeNetwork(ctx, opts),\n update: (knId: string, body: unknown) => updateKnowledgeNetwork(ctx, knId, body),\n delete: (knId: string) => deleteKnowledgeNetwork(ctx, knId),\n subgraph: (knId: string, body: unknown) => querySubgraph(ctx, knId, body),\n actionLogs: (knId: string, opts?: ActionLogListOptions) => listActionLogs(ctx, knId, opts),\n actionLog: (knId: string, logId: string) => getActionLog(ctx, knId, logId),\n cancelActionLog: (knId: string, logId: string) => cancelActionLog(ctx, knId, logId),\n actionExecution: (knId: string, executionId: string) =>\n getActionExecution(ctx, knId, executionId),\n metricQuery: (knId: string, metricId: string, body: unknown) =>\n queryMetricData(ctx, knId, metricId, body),\n metricDryRun: (knId: string, body: unknown) => dryRunMetric(ctx, knId, body),\n metricList: (knId: string, opts?: ListSchemaOptions) => listMetrics(ctx, knId, opts),\n metricGet: (knId: string, metricId: string) => getMetric(ctx, knId, metricId),\n metricCreate: (knId: string, body: unknown) => createMetric(ctx, knId, body),\n metricUpdate: (knId: string, metricId: string, body: unknown) =>\n updateMetric(ctx, knId, metricId, body),\n metricDelete: (knId: string, metricId: string) => deleteMetric(ctx, knId, metricId),\n metricSearch: (knId: string, body: unknown) => searchMetrics(ctx, knId, body),\n metricValidate: (knId: string, body: unknown) => validateMetric(ctx, knId, body),\n objectTypes: (knId: string, opts?: ListSchemaOptions) => listObjectTypes(ctx, knId, opts),\n objectTypeQuery: (knId: string, otId: string, body: unknown) =>\n queryObjectTypeInstances(ctx, knId, otId, body),\n objectTypeProperties: (knId: string, otId: string) => getObjectTypeProperties(ctx, knId, otId),\n objectTypeGet: (knId: string, id: string) => getSchemaItem(ctx, knId, \"object-types\", id),\n objectTypeCreate: (knId: string, body: unknown) =>\n createSchemaItem(ctx, knId, \"object-types\", body),\n objectTypeUpdate: (knId: string, id: string, body: unknown) =>\n updateSchemaItem(ctx, knId, \"object-types\", id, body),\n objectTypeDelete: (knId: string, id: string) => deleteSchemaItem(ctx, knId, \"object-types\", id),\n relationTypes: (knId: string, opts?: ListSchemaOptions) => listRelationTypes(ctx, knId, opts),\n relationTypeGet: (knId: string, id: string) => getSchemaItem(ctx, knId, \"relation-types\", id),\n relationTypeCreate: (knId: string, body: unknown) =>\n createSchemaItem(ctx, knId, \"relation-types\", body),\n relationTypeUpdate: (knId: string, id: string, body: unknown) =>\n updateSchemaItem(ctx, knId, \"relation-types\", id, body),\n relationTypeDelete: (knId: string, id: string) =>\n deleteSchemaItem(ctx, knId, \"relation-types\", id),\n actionTypes: (knId: string, opts?: ListSchemaOptions) => listActionTypes(ctx, knId, opts),\n actionTypeQuery: (knId: string, atId: string, body: unknown) =>\n queryActionType(ctx, knId, atId, body),\n actionTypeExecute: (knId: string, atId: string, body: unknown) =>\n executeActionType(ctx, knId, atId, body),\n actionTypeInputs: (knId: string, atId: string) => getActionTypeInputs(ctx, knId, atId),\n actionTypeGet: (knId: string, id: string) => getSchemaItem(ctx, knId, \"action-types\", id),\n conceptGroups: (knId: string) => listConceptGroups(ctx, knId),\n conceptGroup: (knId: string, cgId: string) => getConceptGroup(ctx, knId, cgId),\n conceptGroupCreate: (knId: string, body: unknown) => createConceptGroup(ctx, knId, body),\n conceptGroupUpdate: (knId: string, cgId: string, body: unknown) =>\n updateConceptGroup(ctx, knId, cgId, body),\n conceptGroupDelete: (knId: string, cgId: string) => deleteConceptGroup(ctx, knId, cgId),\n conceptGroupAddMembers: (knId: string, cgId: string, body: unknown) =>\n addConceptGroupMembers(ctx, knId, cgId, body),\n conceptGroupRemoveMembers: (knId: string, cgId: string, otIds: string) =>\n removeConceptGroupMembers(ctx, knId, cgId, otIds),\n actionSchedules: (knId: string) => listActionSchedules(ctx, knId),\n actionSchedule: (knId: string, scheduleId: string) => getActionSchedule(ctx, knId, scheduleId),\n actionScheduleCreate: (knId: string, body: unknown) => createActionSchedule(ctx, knId, body),\n actionScheduleUpdate: (knId: string, scheduleId: string, body: unknown) =>\n updateActionSchedule(ctx, knId, scheduleId, body),\n actionScheduleSetStatus: (knId: string, scheduleId: string, body: unknown) =>\n setActionScheduleStatus(ctx, knId, scheduleId, body),\n actionScheduleDelete: (knId: string, ids: string) => deleteActionSchedules(ctx, knId, ids),\n jobs: (knId: string) => listJobs(ctx, knId),\n job: (knId: string, jobId: string) => getJob(ctx, knId, jobId),\n jobTasks: (knId: string, jobId: string) => getJobTasks(ctx, knId, jobId),\n jobDelete: (knId: string, ids: string) => deleteJobs(ctx, knId, ids),\n relationTypePaths: (knId: string, body: unknown) => relationTypePaths(ctx, knId, body),\n bknResources: () => listBknResources(ctx),\n createFromCatalog: (opts: CreateFromCatalogOptions) => createFromCatalog(ctx, opts),\n createFromCsv: (opts: CreateFromCsvOptions) => createFromCsv(ctx, opts),\n /**\n * Pack a local BKN directory and upload it as a knowledge network. With\n * `build`, also submit one Vega BuildTask per object type that declares a\n * `vector` index — the platform does not auto-build these on import.\n */\n push: async (\n dir: string,\n opts?: { branch?: string; build?: boolean; embeddingModel?: string },\n ) => {\n const upload = await uploadBkn(ctx, packDirectoryToTar(dir), { branch: opts?.branch });\n if (!opts?.build) return upload;\n const targets = collectIndexTargets(dir);\n const buildTasks: Array<{ objectType: string; resourceId: string; taskId: string }> = [];\n for (const t of targets) {\n const task = (await createBuildTask(ctx, {\n resource_id: t.resourceId,\n mode: \"batch\",\n embedding_fields: t.embeddingFields,\n ...(t.buildKey ? { build_key_fields: [t.buildKey] } : {}),\n ...((t.embeddingModel ?? opts.embeddingModel)\n ? { embedding_model: t.embeddingModel ?? opts.embeddingModel }\n : {}),\n })) as { id?: string };\n buildTasks.push({\n objectType: t.objectType,\n resourceId: t.resourceId,\n taskId: String(task.id ?? \"\"),\n });\n }\n return { ...(upload as object), build_tasks: buildTasks };\n },\n /** Download a knowledge network and extract it into a local directory. */\n pull: async (knId: string, dir: string, opts?: { branch?: string }) => {\n const tar = await downloadBkn(ctx, knId, opts);\n mkdirSync(resolve(dir), { recursive: true });\n extractTarToDirectory(tar, dir);\n return { knId, dir: resolve(dir), bytes: tar.length };\n },\n };\n}\n","import type { RequestContext } from \"../types.js\";\n/**\n * bkn-backend client (concept-groups, action-schedules, jobs). Read side,\n * mirroring kweaver-sdk api/bkn-backend.ts. Passed through as parsed JSON.\n */\nimport { HttpError } from \"../utils/errors.js\";\nimport { buildHeaders } from \"./headers.js\";\nimport { request } from \"./http.js\";\nimport { applyTls } from \"./tls.js\";\n\nconst BASE = \"/api/bkn-backend/v1/knowledge-networks\";\nconst BKNS = \"/api/bkn-backend/v1/bkns\";\n\nfunction knPath(knId: string, path: string): string {\n return `${BASE}/${encodeURIComponent(knId)}/${path}`;\n}\n\n/**\n * Upload a BKN tar to import it as a knowledge network.\n * `POST /api/bkn-backend/v1/bkns?branch=<branch>`, multipart `file`.\n * Returns the raw response (created kn id / status), passed through.\n */\nexport async function uploadBkn(\n ctx: RequestContext,\n tarBuffer: Buffer,\n opts: { branch?: string } = {},\n): Promise<unknown> {\n applyTls(ctx);\n const url = new URL(`${ctx.baseUrl}${BKNS}`);\n url.searchParams.set(\"branch\", opts.branch ?? \"main\");\n const form = new FormData();\n form.append(\n \"file\",\n new Blob([new Uint8Array(tarBuffer)], { type: \"application/octet-stream\" }),\n \"bkn.tar\",\n );\n // Let fetch set the multipart boundary; only send auth/domain headers.\n const res = await fetch(url, { method: \"POST\", headers: buildHeaders(ctx), body: form });\n const text = await res.text();\n if (!res.ok) throw new HttpError(res.status, res.statusText, text);\n return text ? JSON.parse(text) : undefined;\n}\n\n/**\n * Download a knowledge network as a BKN tar.\n * `GET /api/bkn-backend/v1/bkns/<knId>?branch=<branch>` → raw tar bytes.\n */\nexport async function downloadBkn(\n ctx: RequestContext,\n knId: string,\n opts: { branch?: string } = {},\n): Promise<Buffer> {\n applyTls(ctx);\n const url = new URL(`${ctx.baseUrl}${BKNS}/${encodeURIComponent(knId)}`);\n url.searchParams.set(\"branch\", opts.branch ?? \"main\");\n const res = await fetch(url, { method: \"GET\", headers: buildHeaders(ctx) });\n if (!res.ok) throw new HttpError(res.status, res.statusText, await res.text());\n return Buffer.from(await res.arrayBuffer());\n}\n\n/** List BKN-backend resources (global, not per-KN). */\nexport function listBknResources(ctx: RequestContext): Promise<unknown> {\n return request(ctx, \"/api/bkn-backend/v1/resources\");\n}\n\n/** Query relation-type paths between object types (POST, caller-supplied body). */\nexport function relationTypePaths(\n ctx: RequestContext,\n knId: string,\n body: unknown,\n): Promise<unknown> {\n return request(ctx, knPath(knId, \"relation-type-paths\"), { method: \"POST\", body });\n}\n\nexport function listConceptGroups(ctx: RequestContext, knId: string): Promise<unknown> {\n return request(ctx, knPath(knId, \"concept-groups\"));\n}\nexport function getConceptGroup(ctx: RequestContext, knId: string, cgId: string): Promise<unknown> {\n return request(ctx, knPath(knId, `concept-groups/${encodeURIComponent(cgId)}`));\n}\nexport function createConceptGroup(\n ctx: RequestContext,\n knId: string,\n body: unknown,\n): Promise<unknown> {\n return request(ctx, knPath(knId, \"concept-groups\"), { method: \"POST\", body });\n}\nexport function updateConceptGroup(\n ctx: RequestContext,\n knId: string,\n cgId: string,\n body: unknown,\n): Promise<unknown> {\n return request(ctx, knPath(knId, `concept-groups/${encodeURIComponent(cgId)}`), {\n method: \"PUT\",\n body,\n });\n}\nexport function deleteConceptGroup(\n ctx: RequestContext,\n knId: string,\n cgId: string,\n): Promise<unknown> {\n return request(ctx, knPath(knId, `concept-groups/${encodeURIComponent(cgId)}`), {\n method: \"DELETE\",\n });\n}\nexport function addConceptGroupMembers(\n ctx: RequestContext,\n knId: string,\n cgId: string,\n body: unknown,\n): Promise<unknown> {\n return request(ctx, knPath(knId, `concept-groups/${encodeURIComponent(cgId)}/object-types`), {\n method: \"POST\",\n body,\n });\n}\nexport function removeConceptGroupMembers(\n ctx: RequestContext,\n knId: string,\n cgId: string,\n otIds: string,\n): Promise<unknown> {\n return request(\n ctx,\n knPath(knId, `concept-groups/${encodeURIComponent(cgId)}/object-types/${otIds}`),\n {\n method: \"DELETE\",\n },\n );\n}\n\nexport function listActionSchedules(ctx: RequestContext, knId: string): Promise<unknown> {\n return request(ctx, knPath(knId, \"action-schedules\"));\n}\nexport function getActionSchedule(\n ctx: RequestContext,\n knId: string,\n scheduleId: string,\n): Promise<unknown> {\n return request(ctx, knPath(knId, `action-schedules/${encodeURIComponent(scheduleId)}`));\n}\n\nexport function createActionSchedule(\n ctx: RequestContext,\n knId: string,\n body: unknown,\n): Promise<unknown> {\n return request(ctx, knPath(knId, \"action-schedules\"), { method: \"POST\", body });\n}\nexport function updateActionSchedule(\n ctx: RequestContext,\n knId: string,\n scheduleId: string,\n body: unknown,\n): Promise<unknown> {\n return request(ctx, knPath(knId, `action-schedules/${encodeURIComponent(scheduleId)}`), {\n method: \"PUT\",\n body,\n });\n}\nexport function setActionScheduleStatus(\n ctx: RequestContext,\n knId: string,\n scheduleId: string,\n body: unknown,\n): Promise<unknown> {\n return request(ctx, knPath(knId, `action-schedules/${encodeURIComponent(scheduleId)}/status`), {\n method: \"PUT\",\n body,\n });\n}\nexport function deleteActionSchedules(\n ctx: RequestContext,\n knId: string,\n ids: string,\n): Promise<unknown> {\n return request(ctx, knPath(knId, `action-schedules/${ids}`), { method: \"DELETE\" });\n}\n\nexport function listJobs(ctx: RequestContext, knId: string): Promise<unknown> {\n return request(ctx, knPath(knId, \"jobs\"));\n}\nexport function getJob(ctx: RequestContext, knId: string, jobId: string): Promise<unknown> {\n return request(ctx, knPath(knId, `jobs/${encodeURIComponent(jobId)}`));\n}\nexport function getJobTasks(ctx: RequestContext, knId: string, jobId: string): Promise<unknown> {\n return request(ctx, knPath(knId, `jobs/${encodeURIComponent(jobId)}/tasks`));\n}\nexport function deleteJobs(ctx: RequestContext, knId: string, ids: string): Promise<unknown> {\n return request(ctx, knPath(knId, `jobs/${ids}`), { method: \"DELETE\" });\n}\n","/**\n * Vega backend client — catalog/resource reads + BuildTask (index build).\n * Build config lives on the task (CreateBuildTaskRequest), per the platform model.\n */\nimport { z } from \"zod\";\nimport type { RequestContext } from \"../types.js\";\nimport { request } from \"./http.js\";\n\n// Vega backend base path (matches kweaver-sdk `api/vega.ts`).\nconst VEGA_BASE = \"/api/vega-backend/v1\";\n\nexport const BuildMode = z.enum([\"batch\", \"streaming\"]);\nexport type BuildMode = z.infer<typeof BuildMode>;\n\n/** POST /build-tasks body. */\nexport const CreateBuildTaskRequest = z.object({\n resource_id: z.string().min(1),\n mode: BuildMode,\n embedding_fields: z.array(z.string()).optional(),\n build_key_fields: z.array(z.string()).optional(),\n embedding_model: z.string().optional(),\n model_dimensions: z.number().int().positive().optional(),\n});\nexport type CreateBuildTaskRequest = z.infer<typeof CreateBuildTaskRequest>;\n\n// Lenient: create vs list vs status responses carry different subsets — `status`\n// is the live field (not `state`); the create response can omit `mode`.\nexport const BuildTask = z\n .object({\n id: z.string(),\n resource_id: z.string().optional(),\n mode: BuildMode.optional(),\n status: z.string().optional(),\n state: z.string().optional(),\n total_count: z.number().optional(),\n synced_count: z.number().optional(),\n vectorized_count: z.number().optional(),\n embedding_fields: z.string().optional(),\n build_key_fields: z.string().optional(),\n embedding_model: z.string().optional(),\n model_dimensions: z.number().optional(),\n })\n .passthrough();\nexport type BuildTask = z.infer<typeof BuildTask>;\n\n/** Create an index BuildTask for a resource. Returns the task (with its id). */\nexport async function createBuildTask(\n ctx: RequestContext,\n req: CreateBuildTaskRequest,\n): Promise<BuildTask> {\n const p = CreateBuildTaskRequest.parse(req);\n // The backend takes embedding_fields / build_key_fields as comma-joined\n // strings, not arrays — keep the SDK surface ergonomic, serialize here.\n const body = {\n resource_id: p.resource_id,\n mode: p.mode,\n ...(p.embedding_fields?.length ? { embedding_fields: p.embedding_fields.join(\",\") } : {}),\n ...(p.build_key_fields?.length ? { build_key_fields: p.build_key_fields.join(\",\") } : {}),\n ...(p.embedding_model ? { embedding_model: p.embedding_model } : {}),\n ...(p.model_dimensions ? { model_dimensions: p.model_dimensions } : {}),\n };\n const res = await request<unknown>(ctx, `${VEGA_BASE}/build-tasks`, { method: \"POST\", body });\n return BuildTask.parse(res);\n}\n\n/** Fetch a BuildTask's progress/state. */\nexport async function getBuildTask(ctx: RequestContext, taskId: string): Promise<BuildTask> {\n const res = await request<unknown>(ctx, `${VEGA_BASE}/build-tasks/${encodeURIComponent(taskId)}`);\n return BuildTask.parse(res);\n}\n\nexport interface ListCatalogsOptions {\n limit?: number;\n offset?: number;\n}\n\n/** List catalog entries (raw passthrough — shape varies by backend). */\nexport async function listCatalogs(\n ctx: RequestContext,\n opts: ListCatalogsOptions = {},\n): Promise<unknown> {\n return request(ctx, `${VEGA_BASE}/catalogs`, {\n query: { limit: opts.limit, offset: opts.offset },\n });\n}\n\nexport function getCatalog(ctx: RequestContext, id: string): Promise<unknown> {\n return request(ctx, `${VEGA_BASE}/catalogs/${encodeURIComponent(id)}`);\n}\n\n/** POST /catalogs body. `connector_config` shape varies by connector (raw passthrough). */\nexport interface CreateCatalogRequest {\n name: string;\n connectorType: string;\n connectorConfig: unknown;\n tags?: string[];\n description?: string;\n enabled?: boolean;\n}\n\n/** Create a Vega catalog (data source). Returns the created catalog (with its id). */\nexport function createCatalog(ctx: RequestContext, req: CreateCatalogRequest): Promise<unknown> {\n return request(ctx, `${VEGA_BASE}/catalogs`, {\n method: \"POST\",\n body: {\n name: req.name,\n connector_type: req.connectorType,\n connector_config: req.connectorConfig,\n ...(req.tags ? { tags: req.tags } : {}),\n ...(req.description ? { description: req.description } : {}),\n ...(req.enabled !== undefined ? { enabled: req.enabled } : {}),\n },\n });\n}\n\n/** Enable a catalog (catalogs are created disabled; discovery needs it enabled). */\nexport function enableCatalog(ctx: RequestContext, id: string): Promise<unknown> {\n return request(ctx, `${VEGA_BASE}/catalogs/${encodeURIComponent(id)}/enable`, { method: \"POST\" });\n}\n\n/** Trigger a catalog metadata scan (discover). `wait=true` blocks until done. */\nexport function discoverCatalog(ctx: RequestContext, id: string, wait = true): Promise<unknown> {\n return request(ctx, `${VEGA_BASE}/catalogs/${encodeURIComponent(id)}/discover`, {\n method: \"POST\",\n query: { wait },\n timeoutMs: 120_000,\n });\n}\n\n/** Resources under a catalog (optionally filtered by category). */\nexport function listCatalogResources(\n ctx: RequestContext,\n id: string,\n category?: string,\n): Promise<unknown> {\n return request(ctx, `${VEGA_BASE}/catalogs/${encodeURIComponent(id)}/resources`, {\n query: { category: category || undefined },\n });\n}\n\n/** Health-status for one or more catalog ids (comma-joined in the path). */\nexport function catalogHealthStatus(ctx: RequestContext, ids: string[]): Promise<unknown> {\n return request(\n ctx,\n `${VEGA_BASE}/catalogs/${ids.map(encodeURIComponent).join(\",\")}/health-status`,\n );\n}\n\nexport function listConnectorTypes(ctx: RequestContext): Promise<unknown> {\n return request(ctx, `${VEGA_BASE}/connector-types`, { query: { sort: \"name\", order: \"asc\" } });\n}\n\nexport function getConnectorType(ctx: RequestContext, type: string): Promise<unknown> {\n return request(ctx, `${VEGA_BASE}/connector-types/${encodeURIComponent(type)}`);\n}\n","/**\n * Extract index-build intent from a local BKN directory's object types.\n *\n * The BKN spec lets an object type declare per-property index config — most\n * relevantly a `vector` (semantic/embedding) index — either in a `### 属性覆盖`\n * / `### Property Overrides` table (`属性名 | 索引配置`, e.g. `fulltext + vector`)\n * or via an `索引` / `Index` column on the Data Properties table. The platform\n * stores that as query-capability metadata but never turns it into a Vega\n * BuildTask: the actual OpenSearch index is built per resource via\n * `POST /build-tasks`. This module bridges the gap — it reads those declarations\n * and the object type's resource binding so the SDK can submit one BuildTask per\n * resource (gated behind an explicit flag). It does NOT depend on the backend\n * markdown parser; the resource id comes straight from the `### Data Source`\n * table, so the build is independent of whether the backend honors index_config.\n */\nimport { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface IndexTarget {\n /** Object-type id (frontmatter) or file stem. */\n objectType: string;\n /** Vega resource the object type binds to (its index target). */\n resourceId: string;\n /** Resource columns to vectorize (mapped fields of vector-marked properties). */\n embeddingFields: string[];\n /** Incremental key (preferred) or primary key — the batch build key. */\n buildKey?: string;\n /** Embedding model id if the declaration pins one (`vector(<model>)`). */\n embeddingModel?: string;\n}\n\n/** Split a markdown table row into trimmed cells, preserving empty inner cells. */\nfunction rowCells(line: string): string[] | null {\n const t = line.trim();\n if (!t.startsWith(\"|\")) return null;\n // Drop the leading/trailing pipe's empty cells, keep inner ones (even if blank).\n return t\n .replace(/^\\|/, \"\")\n .replace(/\\|$/, \"\")\n .split(\"|\")\n .map((c) => c.trim());\n}\n\nfunction isDivider(cells: string[]): boolean {\n return cells.length > 0 && cells.every((c) => /^:?-{2,}:?$/.test(c) || c === \"\");\n}\n\n/** Body of a `### <heading>` section up to the next heading (any level). */\nfunction section(text: string, headingRe: RegExp): string | null {\n const lines = text.split(\"\\n\");\n let start = -1;\n for (let i = 0; i < lines.length; i += 1) {\n if (headingRe.test(lines[i] ?? \"\")) {\n start = i + 1;\n break;\n }\n }\n if (start === -1) return null;\n const out: string[] = [];\n for (let i = start; i < lines.length; i += 1) {\n if (/^#{1,6}\\s/.test(lines[i] ?? \"\")) break;\n out.push(lines[i] ?? \"\");\n }\n return out.join(\"\\n\");\n}\n\n/** Find the index of a column whose header matches any alias (case-insensitive). */\nfunction colIndex(header: string[], aliases: RegExp): number {\n return header.findIndex((h) => aliases.test(h));\n}\n\n/** Parse the `### Data Source` table → first resource-typed binding's id. */\nfunction resourceBinding(text: string): string | undefined {\n const sec = section(text, /^#{2,3}\\s*(data\\s*source|数据来源)/i);\n if (!sec) return undefined;\n let header: string[] | null = null;\n for (const line of sec.split(\"\\n\")) {\n const cells = rowCells(line);\n if (!cells || isDivider(cells)) continue;\n if (!header) {\n header = cells; // first non-divider row is the header\n continue;\n }\n const typeIdx = Math.max(0, colIndex(header, /type|类型/i));\n const idIdx = colIndex(header, /\\bid\\b/i);\n const type = (cells[typeIdx] ?? \"\").toLowerCase();\n const id = (cells[idIdx >= 0 ? idIdx : 1] ?? \"\").trim();\n if (type === \"resource\" && id) return id;\n }\n return undefined;\n}\n\n/** name → mapped resource field, from the Data Properties table. */\nfunction mappedFields(text: string): Map<string, string> {\n const map = new Map<string, string>();\n const sec = section(text, /^#{2,3}\\s*(data\\s*propert|数据属性)/i);\n if (!sec) return map;\n let header: string[] | null = null;\n for (const line of sec.split(\"\\n\")) {\n const cells = rowCells(line);\n if (!cells || isDivider(cells)) continue;\n if (!header) {\n header = cells;\n continue;\n }\n const nameIdx = Math.max(0, colIndex(header, /^\\s*(name|属性名|属性)\\s*$/i));\n const mapIdx = colIndex(header, /mapped\\s*field|映射字段|映射/i);\n const name = cells[nameIdx] ?? \"\";\n if (!name) continue;\n map.set(name, (mapIdx >= 0 ? cells[mapIdx] : undefined) || name);\n }\n return map;\n}\n\n/**\n * Property names marked for a vector index, plus an optional pinned model.\n * Sources: the `### 属性覆盖` / `### Property Overrides` `索引配置`/`Index Config`\n * column, and any `索引`/`Index` column on the Data Properties table — counted\n * only when the cell explicitly says `vector` (a bare `YES` is index-type\n * agnostic and deliberately ignored).\n */\nfunction vectorProps(text: string): { names: string[]; model?: string } {\n const names = new Set<string>();\n let model: string | undefined;\n\n const scan = (sec: string | null) => {\n if (!sec) return;\n let header: string[] | null = null;\n for (const line of sec.split(\"\\n\")) {\n const cells = rowCells(line);\n if (!cells || isDivider(cells)) continue;\n if (!header) {\n header = cells;\n continue;\n }\n const nameIdx = Math.max(0, colIndex(header, /^\\s*(name|属性名|属性)\\s*$/i));\n const idxCol = colIndex(header, /索引配置|索引|index\\s*config|index/i);\n const cfg = idxCol >= 0 ? (cells[idxCol] ?? \"\") : \"\";\n if (/vector/i.test(cfg)) {\n const name = cells[nameIdx] ?? \"\";\n if (name) names.add(name);\n const m = cfg.match(/vector\\s*\\(\\s*([^)]+?)\\s*\\)/i);\n if (m?.[1]) model = m[1];\n }\n }\n };\n\n scan(section(text, /^#{2,3}\\s*(property\\s*overrides|属性覆盖)/i));\n scan(section(text, /^#{2,3}\\s*(data\\s*propert|数据属性)/i));\n return { names: [...names], ...(model ? { model } : {}) };\n}\n\n/** Batch build key: Incremental Key if set, else the first Primary Key. */\nfunction buildKey(text: string): string | undefined {\n const clean = (v: string) => v.replace(/`/g, \"\").split(/[,,]/)[0]?.trim() || undefined;\n // `[ \\t]*` (not `\\s*`) so the value can't swallow the next line's heading.\n const incr = text.match(/Incremental[ \\t]*Key[ \\t]*[::][ \\t]*([^\\n]+)/i);\n if (incr?.[1]?.trim()) return clean(incr[1]);\n const pk =\n text.match(/Primary[ \\t]*Keys?[ \\t]*[::][ \\t]*([^\\n]+)/i) ||\n text.match(/\\*\\*[ \\t]*主键[ \\t]*\\*\\*[ \\t]*[::][ \\t]*([^|\\n]+)/);\n if (pk?.[1]?.trim()) return clean(pk[1]);\n return undefined;\n}\n\n/** Object-type id from frontmatter (`id: x`), else undefined. */\nfunction frontmatterId(text: string): string | undefined {\n if (!text.startsWith(\"---\")) return undefined;\n const end = text.indexOf(\"\\n---\", 3);\n if (end === -1) return undefined;\n const m = text.slice(3, end).match(/^\\s*id\\s*:\\s*(.+?)\\s*$/m);\n return m?.[1]?.replace(/^[\"']|[\"']$/g, \"\");\n}\n\n/** Parse one object-type `.bkn` file's index-build intent. */\nexport function parseObjectTypeIndex(text: string, fallbackName = \"\"): IndexTarget | null {\n const resourceId = resourceBinding(text);\n if (!resourceId || resourceId.includes(\"{{\")) return null; // unbound or unrendered placeholder\n const { names, model } = vectorProps(text);\n if (names.length === 0) return null;\n const mapped = mappedFields(text);\n const embeddingFields = names.map((n) => mapped.get(n) ?? n);\n return {\n objectType: frontmatterId(text) ?? fallbackName,\n resourceId,\n embeddingFields,\n ...(buildKey(text) ? { buildKey: buildKey(text) } : {}),\n ...(model ? { embeddingModel: model } : {}),\n };\n}\n\n/** Collect index-build targets from every object type in a BKN directory. */\nexport function collectIndexTargets(dir: string): IndexTarget[] {\n const otDir = join(dir, \"object_types\");\n if (!existsSync(otDir) || !statSync(otDir).isDirectory()) return [];\n const targets: IndexTarget[] = [];\n for (const f of readdirSync(otDir).filter((x) => x.endsWith(\".bkn\"))) {\n const stem = f.replace(/\\.bkn$/, \"\");\n const target = parseObjectTypeIndex(readFileSync(join(otDir, f), \"utf8\"), stem);\n if (target) targets.push(target);\n }\n return targets;\n}\n","/**\n * BKN directory ↔ tar helpers. Shells out to the system `tar` (present on\n * Linux/macOS and Windows 10 1803+). `COPYFILE_DISABLE=1` stops macOS from\n * embedding `._*` AppleDouble resource forks the backend would reject.\n */\nimport { spawnSync } from \"node:child_process\";\nimport { resolve } from \"node:path\";\n\nconst TAR_MISSING =\n \"tar executable not found. On Windows, ensure tar.exe is in PATH \" +\n \"(ships with Windows 10 1803+) or install GNU tar via Git for Windows / scoop.\";\n\n/** Pack a directory's contents (not the dir itself) into a tar buffer. */\nexport function packDirectoryToTar(dirPath: string): Buffer {\n const abs = resolve(dirPath);\n const result = spawnSync(\"tar\", [\"cf\", \"-\", \"-C\", abs, \".\"], {\n maxBuffer: 1024 * 1024 * 512,\n env: { ...process.env, COPYFILE_DISABLE: \"1\" },\n });\n if (result.error && (result.error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(TAR_MISSING);\n }\n if (result.status !== 0) {\n throw new Error(`tar pack failed: ${result.stderr?.toString() ?? result.status}`);\n }\n return result.stdout;\n}\n\n/** Extract a tar buffer into a target directory (created by the caller). */\nexport function extractTarToDirectory(tarBuffer: Buffer, dirPath: string): void {\n const abs = resolve(dirPath);\n const result = spawnSync(\"tar\", [\"xf\", \"-\", \"-C\", abs], {\n input: tarBuffer,\n maxBuffer: 1024 * 1024 * 512,\n });\n if (result.error && (result.error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(TAR_MISSING);\n }\n if (result.status !== 0) {\n throw new Error(`tar extract failed: ${result.stderr?.toString() ?? result.status}`);\n }\n}\n","/**\n * CSV → vega-catalog import helpers. A CSV is ingested by running a one-shot\n * dataflow DAG (`@internal/database/write`) per batch: the first batch creates\n * the table, later batches append. All target columns default to VARCHAR(512).\n */\nimport { statSync } from \"node:fs\";\nimport { glob, readFile } from \"node:fs/promises\";\nimport { basename, resolve } from \"node:path\";\nimport { parse } from \"csv-parse/sync\";\n\nexport interface CsvData {\n headers: string[];\n rows: Array<Record<string, string | null>>;\n}\n\n/** Parse a CSV file into headers + rows (BOM-stripped, \"\" → null). */\nexport async function parseCsvFile(filePath: string): Promise<CsvData> {\n let content = await readFile(filePath, \"utf8\");\n if (content.charCodeAt(0) === 0xfeff) content = content.slice(1);\n\n const records = parse(content, {\n columns: true,\n skip_empty_lines: true,\n trim: true,\n relax_column_count: false,\n }) as Array<Record<string, string>>;\n\n if (records.length === 0) {\n const headerRows = parse(content, {\n columns: false,\n skip_empty_lines: false,\n trim: true,\n to: 1,\n }) as string[][];\n return { headers: headerRows[0] ?? [], rows: [] };\n }\n\n const headers = Object.keys(records[0] as Record<string, string>);\n const rows = records.map((rec) => {\n const row: Record<string, string | null> = {};\n for (const k of headers) row[k] = rec[k] === \"\" ? null : (rec[k] ?? null);\n return row;\n });\n return { headers, rows };\n}\n\n/** Derive a BKN-safe table name from a CSV path + optional prefix. */\nexport function buildTableName(filePath: string, prefix = \"\"): string {\n const stem = basename(filePath).replace(/\\.csv$/i, \"\");\n return `${prefix}${stem}`.replace(/[^a-zA-Z0-9_]/g, \"_\").replace(/^(\\d)/, \"_$1\");\n}\n\nexport function splitBatches<T>(rows: T[], batchSize: number): T[][] {\n const out: T[][] = [];\n for (let i = 0; i < rows.length; i += batchSize) out.push(rows.slice(i, i + batchSize));\n return out;\n}\n\nexport interface FieldMapping {\n source: { name: string };\n target: { name: string; data_type: string };\n}\n\nexport function buildFieldMappings(headers: string[]): FieldMapping[] {\n return headers.map((name) => ({ source: { name }, target: { name, data_type: \"VARCHAR(512)\" } }));\n}\n\nexport interface DagBodyOptions {\n catalogId: string;\n datasourceType: string;\n tableName: string;\n tableExist: boolean;\n data: Array<Record<string, string | null>>;\n fieldMappings: FieldMapping[];\n}\n\n/** A 2-step dataflow doc: manual trigger → database write. */\nexport function buildImportDag(opts: DagBodyOptions): Record<string, unknown> {\n return {\n title: `import-csv-${opts.tableName}`,\n description: `CSV import into table ${opts.tableName}`,\n trigger_config: { operator: \"@internal/trigger/manual\" },\n steps: [\n { id: \"step-trigger\", title: \"Trigger\", operator: \"@trigger/manual\", parameters: {} },\n {\n id: \"step-write\",\n title: \"Write to Database\",\n operator: \"@internal/database/write\",\n parameters: {\n datasource_type: opts.datasourceType,\n datasource_id: opts.catalogId,\n table_name: opts.tableName,\n table_exist: opts.tableExist,\n operate_type: \"append\",\n data: opts.data,\n sync_model_fields: opts.fieldMappings,\n },\n },\n ],\n };\n}\n\n/** Resolve a comma/glob file pattern into absolute .csv paths. */\nexport async function resolveFiles(pattern: string): Promise<string[]> {\n const out: string[] = [];\n for (const part of pattern\n .split(\",\")\n .map((p) => p.trim())\n .filter(Boolean)) {\n if (part.includes(\"*\") || part.includes(\"?\")) {\n for await (const entry of glob(part)) {\n const p = String(entry);\n if (/\\.csv$/i.test(p)) out.push(resolve(p));\n }\n } else {\n statSync(resolve(part)); // throws if missing\n out.push(resolve(part));\n }\n }\n if (out.length === 0) throw new Error(`No CSV files matched: ${pattern}`);\n return out;\n}\n","/**\n * Primary-key / display-key resolution for BKN object types built from tables.\n *\n * Getting the PK wrong silently builds an index over the wrong key and drops\n * most rows (the kweaver-sdk #97 data-loss bug), so resolution is deliberate:\n * 1. caller override (--pk-map)\n * 2. schema-declared single PK (datasource metadata)\n * 3. sample-based cardinality detection\n * A composite schema PK is surfaced as `ambiguous` — BKN takes ONE key, so the\n * caller must disambiguate; we never silently pick one.\n */\n\nexport const PK_NAME_HINTS = [\"id\", \"_id\", \"pk\"];\nexport const DISPLAY_HINTS = [\"name\", \"title\", \"label\", \"display_name\", \"description\"];\n\nexport interface TableColumn {\n name: string;\n type: string;\n isPrimaryKey?: boolean;\n}\nexport interface TableInfo {\n name: string;\n columns: TableColumn[];\n primaryKeys?: string[];\n}\n\nexport interface PkCandidate {\n name: string;\n cardinality: number;\n}\nexport interface PkResolution {\n pk: string | null;\n source: \"override\" | \"schema\" | \"sample\" | \"ambiguous\";\n candidates?: PkCandidate[];\n sampleSize?: number;\n ambiguous?: string[];\n}\n\n/** Sample-based PK detection: a column whose values are unique across the sample. */\nexport function detectPrimaryKey(\n table: TableInfo,\n rows?: Array<Record<string, string | null>>,\n): { pk: string | null; candidates: PkCandidate[]; sampleSize: number } {\n if (!rows || rows.length === 0) return { pk: null, candidates: [], sampleSize: 0 };\n\n const candidates: PkCandidate[] = table.columns\n .map((col) => ({ name: col.name, cardinality: new Set(rows.map((r) => r[col.name])).size }))\n .sort((a, b) => b.cardinality - a.cardinality);\n\n const full = candidates.filter((c) => c.cardinality === rows.length);\n if (full.length === 0) return { pk: null, candidates, sampleSize: rows.length };\n\n const named = full.find((c) => {\n const lower = c.name.toLowerCase();\n return PK_NAME_HINTS.some((h) => lower === h || lower.endsWith(`_${h}`));\n });\n return { pk: named?.name ?? (full[0] as PkCandidate).name, candidates, sampleSize: rows.length };\n}\n\nfunction collectSchemaPks(table: TableInfo): string[] {\n // Filter against the real column list — stale catalog metadata must fall\n // through to sample/fail rather than poison object-type creation.\n const colNames = new Set(table.columns.map((c) => c.name));\n if (Array.isArray(table.primaryKeys) && table.primaryKeys.length > 0) {\n return table.primaryKeys.filter((n) => colNames.has(n));\n }\n return table.columns.filter((c) => c.isPrimaryKey === true).map((c) => c.name);\n}\n\n/** Resolve a single PK in priority order; composite schema PKs are ambiguous. */\nexport function resolvePrimaryKey(\n table: TableInfo,\n sampleRows?: Array<Record<string, string | null>>,\n override?: string | null,\n): PkResolution {\n if (override) return { pk: override, source: \"override\" };\n\n const schemaPks = collectSchemaPks(table);\n if (schemaPks.length === 1) return { pk: schemaPks[0] as string, source: \"schema\" };\n if (schemaPks.length > 1) return { pk: null, source: \"ambiguous\", ambiguous: schemaPks };\n\n const sample = detectPrimaryKey(table, sampleRows);\n return {\n pk: sample.pk,\n source: \"sample\",\n candidates: sample.candidates,\n sampleSize: sample.sampleSize,\n };\n}\n\n/** Pick a display key: first column matching a display hint, else the PK. */\nexport function detectDisplayKey(table: TableInfo, primaryKey: string): string {\n for (const col of table.columns) {\n if (DISPLAY_HINTS.some((h) => col.name.toLowerCase().includes(h))) return col.name;\n }\n return primaryKey;\n}\n\n/** Parse `--pk-map \"t1:col1,t2:col2\"` into a record. Throws on malformed input. */\nexport function parsePkMap(input: string): Record<string, string> {\n const out: Record<string, string> = {};\n for (const pair of input\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)) {\n const idx = pair.indexOf(\":\");\n if (idx <= 0 || idx >= pair.length - 1) {\n throw new Error(`Invalid --pk-map entry '${pair}'. Expected '<table>:<field>[,...]'`);\n }\n out[pair.slice(0, idx).trim()] = pair.slice(idx + 1).trim();\n }\n return out;\n}\n\n/** Parse `--embedding-fields \"t1:col1+col2,t2:col\"` into a record of field lists. */\nexport function parseEmbeddingFields(input: string): Record<string, string[]> {\n const out: Record<string, string[]> = {};\n for (const pair of input\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)) {\n const idx = pair.indexOf(\":\");\n if (idx <= 0 || idx >= pair.length - 1) {\n throw new Error(\n `Invalid --embedding-fields entry '${pair}'. Expected '<table>:<col>[+<col>...][,...]'`,\n );\n }\n const cols = pair\n .slice(idx + 1)\n .split(\"+\")\n .map((c) => c.trim())\n .filter(Boolean);\n if (cols.length > 0) out[pair.slice(0, idx).trim()] = cols;\n }\n return out;\n}\n\n/** Human-facing message when PK auto-detection fails. */\nexport function formatPkDetectionError(\n tableName: string,\n result: { candidates: PkCandidate[]; sampleSize: number },\n): string {\n const lines = [`Cannot auto-detect a primary key for table '${tableName}'.`];\n if (result.sampleSize === 0) {\n lines.push(\" No sample data available — pass --pk-map <table>:<column>.\");\n } else {\n lines.push(` No column is unique across the ${result.sampleSize}-row sample.`);\n lines.push(\" Top candidates by cardinality:\");\n for (const c of result.candidates.slice(0, 5)) {\n lines.push(` ${c.name} ${c.cardinality} unique`);\n }\n }\n lines.push(\"\", ` Specify explicitly: --pk-map ${tableName}:<column>`);\n return lines.join(\"\\n\");\n}\n","import { executeDataflow } from \"../api/dataflow.js\";\n/**\n * `bkn create-from-catalog` orchestration. Build a knowledge network from a\n * Vega catalog's tables:\n * 1. list catalog tables (scan/discover once if empty) + introspect columns\n * 2. resolve a single PK per table (override → schema → sample cardinality);\n * fail-fast rather than silently pick a wrong key (kweaver-sdk #97)\n * 3. create a vega resource per table (idempotent via findResource)\n * 4. create the KN, then batch-create object types (all-or-nothing)\n * 5. optional build: one Vega BuildTask per resource (index build lives on the\n * catalog/resource now — there is no KN-level build)\n * Any failure after the KN is created rolls it back (cascades to OTs) unless\n * `noRollback` is set.\n */\nimport {\n createKnowledgeNetwork,\n createObjectTypes,\n deleteKnowledgeNetwork,\n} from \"../api/knowledge-networks.js\";\nimport {\n createResource,\n findResource,\n getResource,\n listResources,\n queryResource,\n} from \"../api/resources.js\";\nimport { createBuildTask, discoverCatalog, getCatalog } from \"../api/vega.js\";\nimport type { RequestContext } from \"../types.js\";\nimport {\n buildFieldMappings,\n buildImportDag,\n buildTableName,\n parseCsvFile,\n resolveFiles,\n splitBatches,\n} from \"../utils/csv-import.js\";\nimport {\n type TableColumn,\n type TableInfo,\n detectDisplayKey,\n formatPkDetectionError,\n resolvePrimaryKey,\n} from \"../utils/pk-detection.js\";\n\nexport interface CreateFromCatalogOptions {\n catalogId: string;\n name: string;\n tables?: string[];\n pkMap?: Record<string, string>;\n build?: boolean;\n /** Per-table resource columns to vectorize (sets the build task's embedding_fields). */\n embeddingFields?: Record<string, string[]>;\n embeddingModel?: string;\n noRollback?: boolean;\n /** Pre-fetched row samples per table (e.g. from a CSV import) for PK detection. */\n sampleRows?: Record<string, Array<Record<string, string | null>>>;\n onProgress?: (msg: string) => void;\n}\n\ninterface ResourceDetail {\n id?: string;\n name?: string;\n source_metadata?: { columns?: Array<Record<string, unknown>> };\n primary_keys?: unknown;\n}\n\nfunction columnIsPk(col: Record<string, unknown>): boolean {\n if (col.is_primary_key === true) return true;\n return typeof col.column_key === \"string\" && col.column_key.toUpperCase() === \"PRI\";\n}\n\nfunction toTableInfo(detail: ResourceDetail): TableInfo {\n const raw = detail.source_metadata?.columns ?? [];\n const tablePks = Array.isArray(detail.primary_keys)\n ? (detail.primary_keys.filter((x) => typeof x === \"string\") as string[])\n : [];\n const columns: TableColumn[] = raw.map((c) => {\n const name = String(c.name ?? c.field_name ?? \"\");\n const flagged = columnIsPk(c) || tablePks.includes(name);\n return {\n name,\n type: String(c.type ?? c.field_type ?? \"varchar\"),\n ...(flagged ? { isPrimaryKey: true } : {}),\n };\n });\n const pks =\n tablePks.length > 0 ? tablePks : columns.filter((c) => c.isPrimaryKey).map((c) => c.name);\n return {\n name: String(detail.name ?? \"\"),\n columns,\n ...(pks.length > 0 ? { primaryKeys: pks } : {}),\n };\n}\n\nfunction asArray(v: unknown): unknown[] {\n if (Array.isArray(v)) return v;\n if (v && typeof v === \"object\") {\n const o = v as Record<string, unknown>;\n if (Array.isArray(o.entries)) return o.entries;\n if (Array.isArray(o.data)) return o.data;\n }\n return [];\n}\n\n/** Best-effort row sample for cardinality-based PK detection. */\nasync function sampleRows(\n ctx: RequestContext,\n resourceId: string,\n): Promise<Array<Record<string, string | null>>> {\n try {\n const res = await queryResource(ctx, resourceId, { limit: 100 });\n return asArray(res) as Array<Record<string, string | null>>;\n } catch {\n return [];\n }\n}\n\nexport async function createFromCatalog(\n ctx: RequestContext,\n opts: CreateFromCatalogOptions,\n): Promise<unknown> {\n const log = opts.onProgress ?? (() => {});\n const pkMap = opts.pkMap ?? {};\n\n // 1. List catalog tables, scanning once if the catalog is empty.\n const listTables = () =>\n listResources(ctx, { datasourceId: opts.catalogId, category: \"table\" }).then(asArray);\n let summaries = await listTables();\n if (summaries.length === 0) {\n log(\"No tables found; scanning catalog metadata...\");\n await discoverCatalog(ctx, opts.catalogId, true);\n summaries = await listTables();\n }\n if (summaries.length === 0) throw new Error(\"No tables available in catalog after scan.\");\n\n // Resolve full column metadata per summary; filter to --tables if given.\n const details = await Promise.all(\n summaries.map(async (s) => {\n const id = (s as { id?: string }).id;\n const detail = id ? await getResource(ctx, id) : s;\n return toTableInfo(detail as ResourceDetail);\n }),\n );\n const targets =\n opts.tables && opts.tables.length > 0\n ? details.filter((t) => opts.tables?.includes(t.name))\n : details;\n if (targets.length === 0) throw new Error(\"No matching tables to build from.\");\n\n // Validate --pk-map references and resolve a PK per table BEFORE side effects.\n for (const name of Object.keys(pkMap)) {\n if (!targets.some((t) => t.name === name)) {\n throw new Error(`--pk-map references unknown table '${name}'.`);\n }\n }\n const tablePk: Record<string, string> = {};\n for (const t of targets) {\n const override = pkMap[t.name];\n if (override && !t.columns.some((c) => c.name === override)) {\n throw new Error(\n `--pk-map '${override}' for table '${t.name}' is not a column. ` +\n `Columns: ${t.columns.map((c) => c.name).join(\", \")}`,\n );\n }\n // Prefer caller-supplied samples (CSV import) for cardinality detection.\n let res = resolvePrimaryKey(t, opts.sampleRows?.[t.name], override);\n if (res.pk === null && res.source === \"sample\") {\n // Fall back to a live row sample.\n const summary = summaries.find((s) => (s as { name?: string }).name === t.name) as\n | { id?: string }\n | undefined;\n const rows = summary?.id ? await sampleRows(ctx, summary.id) : [];\n res = resolvePrimaryKey(t, rows, override);\n }\n if (res.source === \"ambiguous\") {\n throw new Error(\n `Table '${t.name}' has a composite primary key (${(res.ambiguous ?? []).join(\", \")}). ` +\n `BKN object types take one key — pick with --pk-map ${t.name}:<column>.`,\n );\n }\n if (!res.pk) {\n throw new Error(\n formatPkDetectionError(t.name, {\n candidates: res.candidates ?? [],\n sampleSize: res.sampleSize ?? 0,\n }),\n );\n }\n tablePk[t.name] = res.pk;\n }\n\n // 2. Create a vega resource per table (idempotent).\n log(`Creating resources for ${targets.length} table(s)...`);\n const viewMap: Record<string, string> = {};\n for (const t of targets) {\n const found = asArray(\n await findResource(ctx, t.name, { datasourceId: opts.catalogId, exact: true }),\n );\n const existingId = (found[0] as { id?: string } | undefined)?.id;\n if (existingId) {\n viewMap[t.name] = existingId;\n } else {\n const created = (await createResource(ctx, {\n name: t.name,\n catalogId: opts.catalogId,\n sourceIdentifier: t.name,\n fields: t.columns.map((c) => ({ name: c.name, type: c.type })),\n })) as { id?: string };\n viewMap[t.name] = String(created.id ?? \"\");\n }\n }\n\n // 3. Create the KN. Roll it back on any later failure.\n const knCreated = (await createKnowledgeNetwork(ctx, { name: opts.name })) as\n | { id?: string }\n | Array<{ id?: string }>;\n const knItem = Array.isArray(knCreated) ? knCreated[0] : knCreated;\n const knId = String(knItem?.id ?? \"\");\n log(`Knowledge network created: ${knId}`);\n\n let rollbackKn: string | undefined = knId;\n try {\n // 4. Batch-create object types (all-or-nothing).\n const entries = targets.map((t) => {\n const pk = tablePk[t.name] as string;\n return {\n branch: \"main\",\n name: t.name,\n data_source: { type: \"resource\", id: viewMap[t.name] },\n primary_keys: [pk],\n display_key: detectDisplayKey(t, pk),\n data_properties: t.columns.map((c) => ({\n name: c.name,\n display_name: c.name,\n type: \"string\",\n mapped_field: { name: c.name, type: c.type || \"varchar\" },\n })),\n };\n });\n log(`Creating ${entries.length} object type(s)...`);\n await createObjectTypes(ctx, knId, entries);\n\n // 5. Build each resource's index via a Vega BuildTask (no KN-level build).\n const builds: Array<{ table: string; taskId: string }> = [];\n if (opts.build) {\n log(\"Submitting build tasks...\");\n for (const t of targets) {\n const embedding = opts.embeddingFields?.[t.name];\n const task = (await createBuildTask(ctx, {\n resource_id: viewMap[t.name] as string,\n mode: \"batch\",\n build_key_fields: [tablePk[t.name] as string],\n ...(embedding && embedding.length > 0 ? { embedding_fields: embedding } : {}),\n ...(opts.embeddingModel ? { embedding_model: opts.embeddingModel } : {}),\n })) as { id?: string };\n builds.push({ table: t.name, taskId: String(task.id ?? \"\") });\n }\n }\n\n rollbackKn = undefined; // success — keep the KN\n return {\n kn_id: knId,\n kn_name: opts.name,\n object_types: targets.map((t) => ({ name: t.name, pk: tablePk[t.name] })),\n build_tasks: builds,\n };\n } finally {\n if (rollbackKn !== undefined) {\n if (opts.noRollback) {\n log(`Leaving partial KN ${rollbackKn} in place (--no-rollback).`);\n } else {\n log(`Rolling back KN ${rollbackKn}...`);\n try {\n await deleteKnowledgeNetwork(ctx, rollbackKn);\n } catch {\n /* surface the original error, not the rollback failure */\n }\n }\n }\n }\n}\n\nexport interface ImportCsvResult {\n tables: string[];\n failed: string[];\n sampleRows: Record<string, Array<Record<string, string | null>>>;\n}\n\n/**\n * Import CSV files into a Vega catalog as tables. Each file becomes a table\n * (first batch creates it, later batches append) via a one-shot dataflow DAG.\n * Returns the imported table names and a per-table row sample (≤100 rows) for\n * downstream PK detection.\n */\nexport async function importCsvToCatalog(\n ctx: RequestContext,\n opts: {\n catalogId: string;\n files: string;\n tablePrefix?: string;\n batchSize?: number;\n onProgress?: (msg: string) => void;\n },\n): Promise<ImportCsvResult> {\n const log = opts.onProgress ?? (() => {});\n const batchSize = opts.batchSize ?? 500;\n const paths = await resolveFiles(opts.files);\n\n // The database-write step needs the catalog's connector type.\n const catalog = (await getCatalog(ctx, opts.catalogId)) as {\n connector_type?: string;\n type?: string;\n };\n const datasourceType = catalog.connector_type ?? catalog.type ?? \"\";\n\n const tables: string[] = [];\n const failed: string[] = [];\n const sampleRows: Record<string, Array<Record<string, string | null>>> = {};\n\n for (const path of paths) {\n const tableName = buildTableName(path, opts.tablePrefix ?? \"\");\n const { headers, rows } = await parseCsvFile(path);\n if (headers.length === 0 || rows.length === 0) {\n log(`Skipping ${tableName} (no headers/rows).`);\n failed.push(tableName);\n continue;\n }\n const fieldMappings = buildFieldMappings(headers);\n const batches = splitBatches(rows, batchSize);\n try {\n for (let i = 0; i < batches.length; i += 1) {\n log(`[${tableName}] batch ${i + 1}/${batches.length} (${batches[i]?.length} rows)...`);\n await executeDataflow(\n ctx,\n buildImportDag({\n catalogId: opts.catalogId,\n datasourceType,\n tableName,\n tableExist: i > 0,\n data: batches[i] as Array<Record<string, string | null>>,\n fieldMappings,\n }),\n );\n }\n tables.push(tableName);\n sampleRows[tableName] = rows.slice(0, 100);\n } catch (e) {\n log(`[${tableName}] import failed: ${e instanceof Error ? e.message : String(e)}`);\n failed.push(tableName);\n }\n }\n // Best-effort: refresh catalog metadata so the new tables are visible.\n await discoverCatalog(ctx, opts.catalogId, true).catch(() => {});\n return { tables, failed, sampleRows };\n}\n\nexport interface CreateFromCsvOptions {\n catalogId: string;\n name: string;\n files: string;\n tablePrefix?: string;\n batchSize?: number;\n tables?: string[];\n pkMap?: Record<string, string>;\n build?: boolean;\n embeddingFields?: Record<string, string[]>;\n embeddingModel?: string;\n noRollback?: boolean;\n onProgress?: (msg: string) => void;\n}\n\n/** Import CSVs into a catalog, then build a KN from the imported tables. */\nexport async function createFromCsv(\n ctx: RequestContext,\n opts: CreateFromCsvOptions,\n): Promise<unknown> {\n const log = opts.onProgress ?? (() => {});\n log(\"Phase 1: importing CSVs...\");\n const imported = await importCsvToCatalog(ctx, {\n catalogId: opts.catalogId,\n files: opts.files,\n tablePrefix: opts.tablePrefix,\n batchSize: opts.batchSize,\n onProgress: log,\n });\n if (imported.tables.length === 0) {\n throw new Error(`No tables imported (failed: ${imported.failed.join(\", \") || \"none\"}).`);\n }\n log(`Phase 2: building KN from ${imported.tables.length} table(s)...`);\n const result = await createFromCatalog(ctx, {\n catalogId: opts.catalogId,\n name: opts.name,\n tables: opts.tables && opts.tables.length > 0 ? opts.tables : imported.tables,\n pkMap: opts.pkMap,\n build: opts.build,\n embeddingFields: opts.embeddingFields,\n embeddingModel: opts.embeddingModel,\n noRollback: opts.noRollback,\n sampleRows: imported.sampleRows,\n onProgress: log,\n });\n return {\n imported_tables: imported.tables,\n failed_imports: imported.failed,\n ...(result as object),\n };\n}\n","import type { RequestContext } from \"../types.js\";\n/**\n * Model-factory client: management reads (mf-model-manager) + runtime\n * invocation (mf-model-api), mirroring kweaver-sdk. Passed through as JSON.\n */\nimport { HttpError } from \"../utils/errors.js\";\nimport { buildHeaders } from \"./headers.js\";\nimport { request } from \"./http.js\";\nimport { applyTls } from \"./tls.js\";\n\nconst MANAGER = \"/api/mf-model-manager/v1\";\nconst API = \"/api/mf-model-api/v1\";\n\nexport interface ListModelsOptions {\n page?: number;\n limit?: number;\n name?: string;\n modelType?: string;\n}\n\nfunction listQuery(opts: ListModelsOptions) {\n // mf-model-manager paginates with page + size (NOT limit) — verified live.\n return {\n page: String(opts.page ?? 1),\n size: String(opts.limit ?? 30),\n name: opts.name ?? \"\",\n model_type: opts.modelType ?? \"\",\n };\n}\n\nexport function listLlmModels(ctx: RequestContext, opts: ListModelsOptions = {}): Promise<unknown> {\n return request(ctx, `${MANAGER}/llm/list`, { query: listQuery(opts) });\n}\nexport function getLlmModel(ctx: RequestContext, modelId: string): Promise<unknown> {\n return request(ctx, `${MANAGER}/llm/get`, { query: { model_id: modelId } });\n}\nexport function listSmallModels(\n ctx: RequestContext,\n opts: ListModelsOptions = {},\n): Promise<unknown> {\n return request(ctx, `${MANAGER}/small-model/list`, { query: listQuery(opts) });\n}\nexport function getSmallModel(ctx: RequestContext, modelId: string): Promise<unknown> {\n return request(ctx, `${MANAGER}/small-model/get`, { query: { model_id: modelId } });\n}\n\nexport interface ChatMessage {\n role: string;\n content: string;\n}\n\n/** OpenAI-compatible chat completion (non-streaming). */\nexport function chatCompletions(\n ctx: RequestContext,\n model: string,\n messages: ChatMessage[],\n): Promise<unknown> {\n return request(ctx, `${API}/chat/completions`, {\n method: \"POST\",\n body: { model, messages, stream: false },\n });\n}\n\n/** Pull `choices[0].delta.content` out of one OpenAI streaming chunk. */\nfunction deltaContent(chunk: Record<string, unknown>): string {\n const choices = chunk.choices as Array<{ delta?: { content?: unknown } }> | undefined;\n const c = choices?.[0]?.delta?.content;\n return typeof c === \"string\" ? c : \"\";\n}\n\n/**\n * Streaming chat completion (OpenAI-style SSE: `data: {...}` / `data: [DONE]`).\n * Invokes `onDelta` with each text fragment as it arrives and resolves with the\n * full concatenated text.\n */\nexport async function chatCompletionsStream(\n ctx: RequestContext,\n model: string,\n messages: ChatMessage[],\n onDelta: (text: string) => void,\n): Promise<string> {\n applyTls(ctx);\n const res = await fetch(`${ctx.baseUrl}${API}/chat/completions`, {\n method: \"POST\",\n headers: {\n ...buildHeaders(ctx),\n \"content-type\": \"application/json\",\n accept: \"text/event-stream\",\n },\n body: JSON.stringify({ model, messages, stream: true }),\n });\n if (!res.ok) throw new HttpError(res.status, res.statusText, await res.text());\n\n const reader = res.body?.getReader();\n if (!reader) throw new Error(\"No response body for stream\");\n const decoder = new TextDecoder();\n let buffer = \"\";\n let out = \"\";\n\n const handle = (line: string): void => {\n const trimmed = line.trimEnd();\n if (!trimmed.startsWith(\"data:\")) return;\n const payload = trimmed.slice(5).trim();\n if (payload === \"[DONE]\" || payload === \"\") return;\n try {\n const text = deltaContent(JSON.parse(payload) as Record<string, unknown>);\n if (text) {\n out += text;\n onDelta(text);\n }\n } catch {\n /* skip malformed keep-alive / partial lines */\n }\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const ln of lines) handle(ln);\n }\n if (buffer.trim()) handle(buffer);\n return out;\n}\n\nexport function embeddings(ctx: RequestContext, model: string, input: string[]): Promise<unknown> {\n return request(ctx, `${API}/small-model/embeddings`, { method: \"POST\", body: { model, input } });\n}\n\n// ---- management writes (mf-model-manager) ---------------------------------\n\nexport type ModelKind = \"llm\" | \"small-model\";\n\nexport function addModel(ctx: RequestContext, kind: ModelKind, body: unknown): Promise<unknown> {\n return request(ctx, `${MANAGER}/${kind}/add`, { method: \"POST\", body });\n}\nexport function editModel(ctx: RequestContext, kind: ModelKind, body: unknown): Promise<unknown> {\n return request(ctx, `${MANAGER}/${kind}/edit`, { method: \"POST\", body });\n}\nexport function deleteModels(\n ctx: RequestContext,\n kind: ModelKind,\n modelIds: string[],\n): Promise<unknown> {\n return request(ctx, `${MANAGER}/${kind}/delete`, {\n method: \"POST\",\n body: { model_ids: modelIds },\n });\n}\nexport function testModel(ctx: RequestContext, kind: ModelKind, body: unknown): Promise<unknown> {\n return request(ctx, `${MANAGER}/${kind}/test`, { method: \"POST\", body });\n}\n\nexport function rerank(\n ctx: RequestContext,\n model: string,\n query: string,\n documents: string[],\n): Promise<unknown> {\n return request(ctx, `${API}/small-model/reranker`, {\n method: \"POST\",\n body: { model, query, documents },\n });\n}\n","/** Model-factory resource surface: management reads + runtime invocation. */\nimport {\n type ChatMessage,\n type ListModelsOptions,\n addModel,\n chatCompletions,\n chatCompletionsStream,\n deleteModels,\n editModel,\n embeddings,\n getLlmModel,\n getSmallModel,\n listLlmModels,\n listSmallModels,\n rerank,\n testModel,\n} from \"../api/models.js\";\nimport type { RequestContext } from \"../types.js\";\n\nexport function models(ctx: RequestContext) {\n return {\n llm: {\n list: (opts?: ListModelsOptions) => listLlmModels(ctx, opts),\n get: (modelId: string) => getLlmModel(ctx, modelId),\n chat: (modelId: string, messages: ChatMessage[]) => chatCompletions(ctx, modelId, messages),\n chatStream: (modelId: string, messages: ChatMessage[], onDelta: (t: string) => void) =>\n chatCompletionsStream(ctx, modelId, messages, onDelta),\n add: (body: unknown) => addModel(ctx, \"llm\", body),\n edit: (body: unknown) => editModel(ctx, \"llm\", body),\n delete: (modelIds: string[]) => deleteModels(ctx, \"llm\", modelIds),\n test: (body: unknown) => testModel(ctx, \"llm\", body),\n },\n small: {\n list: (opts?: ListModelsOptions) => listSmallModels(ctx, opts),\n get: (modelId: string) => getSmallModel(ctx, modelId),\n embeddings: (modelId: string, input: string[]) => embeddings(ctx, modelId, input),\n rerank: (modelId: string, query: string, documents: string[]) =>\n rerank(ctx, modelId, query, documents),\n add: (body: unknown) => addModel(ctx, \"small-model\", body),\n edit: (body: unknown) => editModel(ctx, \"small-model\", body),\n delete: (modelIds: string[]) => deleteModels(ctx, \"small-model\", modelIds),\n test: (body: unknown) => testModel(ctx, \"small-model\", body),\n },\n };\n}\n","/** Resource surface (the exported SDK API) over vega-backend resources. */\nimport {\n type FindResourceOptions,\n type ListResourcesOptions,\n type QueryResourceOptions,\n deleteResource,\n findResource,\n getResource,\n listResources,\n queryResource,\n} from \"../api/resources.js\";\nimport type { RequestContext } from \"../types.js\";\n\nexport function resources(ctx: RequestContext) {\n return {\n list: (opts?: ListResourcesOptions) => listResources(ctx, opts),\n get: (id: string) => getResource(ctx, id),\n delete: (id: string) => deleteResource(ctx, id),\n find: (name: string, opts?: FindResourceOptions) => findResource(ctx, name, opts),\n query: (id: string, opts?: QueryResourceOptions) => queryResource(ctx, id, opts),\n };\n}\n","/** Skill registry/market resource surface (read, delete, package register/download/install). */\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, resolve } from \"node:path\";\nimport {\n type ListSkillsOptions,\n type SkillStatus,\n deleteSkill,\n downloadSkill,\n getSkill,\n getSkillContent,\n getSkillHistory,\n getSkillMarket,\n listSkillMarket,\n listSkills,\n publishSkillVersion,\n readSkillFile,\n registerSkillZip,\n republishSkillVersion,\n setSkillStatus,\n updateSkillMetadata,\n updateSkillPackageZip,\n} from \"../api/skills.js\";\nimport type { RequestContext } from \"../types.js\";\nimport { unzipToDirectory, zipDirectory } from \"../utils/skill-archive.js\";\n\nexport function skills(ctx: RequestContext) {\n return {\n list: (opts?: ListSkillsOptions) => listSkills(ctx, opts),\n get: (skillId: string) => getSkill(ctx, skillId),\n market: (opts?: ListSkillsOptions) => listSkillMarket(ctx, opts),\n marketGet: (skillId: string) => getSkillMarket(ctx, skillId),\n delete: (skillId: string) => deleteSkill(ctx, skillId),\n content: (skillId: string) => getSkillContent(ctx, skillId),\n readFile: (skillId: string, relPath: string) => readSkillFile(ctx, skillId, relPath),\n history: (skillId: string) => getSkillHistory(ctx, skillId),\n setStatus: (skillId: string, status: SkillStatus) => setSkillStatus(ctx, skillId, status),\n updateMetadata: (skillId: string, body: unknown) => updateSkillMetadata(ctx, skillId, body),\n republish: (skillId: string, version: string) => republishSkillVersion(ctx, skillId, version),\n publishHistory: (skillId: string, version: string) =>\n publishSkillVersion(ctx, skillId, version),\n /** Zip a local skill directory and register it. */\n register: async (dir: string, opts?: { source?: string; extendInfo?: unknown }) =>\n registerSkillZip(ctx, await zipDirectory(dir), {\n filename: `${basename(resolve(dir))}.zip`,\n ...opts,\n }),\n /** Replace a skill's package from a local directory. */\n updatePackage: async (skillId: string, dir: string) =>\n updateSkillPackageZip(ctx, skillId, await zipDirectory(dir), `${basename(resolve(dir))}.zip`),\n /** Download a skill archive to a local .zip file. */\n download: async (skillId: string, outPath?: string) => {\n const bytes = await downloadSkill(ctx, skillId);\n const dest = resolve(outPath ?? `${skillId}.zip`);\n mkdirSync(dirname(dest), { recursive: true });\n writeFileSync(dest, bytes);\n return { skillId, path: dest, bytes: bytes.length };\n },\n /** Download a skill archive and extract it into a directory. */\n install: async (skillId: string, dir?: string) => {\n const bytes = await downloadSkill(ctx, skillId);\n const target = resolve(dir ?? skillId);\n const files = await unzipToDirectory(bytes, target);\n return { skillId, dir: target, files: files.length };\n },\n };\n}\n","import type { RequestContext } from \"../types.js\";\n/**\n * Skill registry/market client (agent-operator-integration). Read + delete,\n * mirroring kweaver-sdk api/skills.ts. Passed through as parsed JSON.\n */\nimport { HttpError } from \"../utils/errors.js\";\nimport { buildHeaders } from \"./headers.js\";\nimport { request } from \"./http.js\";\nimport { applyTls } from \"./tls.js\";\n\nconst BASE = \"/api/agent-operator-integration/v1\";\n\n/** Register a skill from a zip archive (multipart `file_type=zip`). */\nexport async function registerSkillZip(\n ctx: RequestContext,\n bytes: Uint8Array,\n opts: { filename?: string; source?: string; extendInfo?: unknown } = {},\n): Promise<unknown> {\n applyTls(ctx);\n const form = new FormData();\n form.set(\"file_type\", \"zip\");\n form.set(\"file\", new Blob([bytes]), opts.filename ?? \"skill.zip\");\n if (opts.source) form.set(\"source\", opts.source);\n if (opts.extendInfo) form.set(\"extend_info\", JSON.stringify(opts.extendInfo));\n const res = await fetch(`${ctx.baseUrl}${BASE}/skills`, {\n method: \"POST\",\n headers: buildHeaders(ctx),\n body: form,\n });\n const text = await res.text();\n if (!res.ok) throw new HttpError(res.status, res.statusText, text);\n return text ? JSON.parse(text) : undefined;\n}\n\n/** Update a skill's package from a zip archive (multipart PUT). */\nexport async function updateSkillPackageZip(\n ctx: RequestContext,\n skillId: string,\n bytes: Uint8Array,\n filename = \"skill.zip\",\n): Promise<unknown> {\n applyTls(ctx);\n const form = new FormData();\n form.set(\"file_type\", \"zip\");\n form.set(\"file\", new Blob([bytes]), filename);\n const res = await fetch(`${ctx.baseUrl}${BASE}/skills/${encodeURIComponent(skillId)}/package`, {\n method: \"PUT\",\n headers: buildHeaders(ctx),\n body: form,\n });\n const text = await res.text();\n if (!res.ok) throw new HttpError(res.status, res.statusText, text);\n return text ? JSON.parse(text) : undefined;\n}\n\n/** Download a skill as a zip archive (raw bytes). */\nexport async function downloadSkill(ctx: RequestContext, skillId: string): Promise<Uint8Array> {\n applyTls(ctx);\n const res = await fetch(`${ctx.baseUrl}${BASE}/skills/${encodeURIComponent(skillId)}/download`, {\n headers: buildHeaders(ctx),\n });\n if (!res.ok) throw new HttpError(res.status, res.statusText, await res.text());\n return new Uint8Array(await res.arrayBuffer());\n}\n\n/** Update a skill's editable metadata (JSON PUT). */\nexport function updateSkillMetadata(\n ctx: RequestContext,\n skillId: string,\n body: unknown,\n): Promise<unknown> {\n return request(ctx, `${BASE}/skills/${encodeURIComponent(skillId)}`, { method: \"PUT\", body });\n}\n\n/** Republish a previous skill version (`POST /skills/:id/history/republish`). */\nexport function republishSkillVersion(\n ctx: RequestContext,\n skillId: string,\n version: string,\n): Promise<unknown> {\n return request(ctx, `${BASE}/skills/${encodeURIComponent(skillId)}/history/republish`, {\n method: \"POST\",\n body: { version },\n });\n}\n\n/** Publish a historical skill version (`POST /skills/:id/history/publish`). */\nexport function publishSkillVersion(\n ctx: RequestContext,\n skillId: string,\n version: string,\n): Promise<unknown> {\n return request(ctx, `${BASE}/skills/${encodeURIComponent(skillId)}/history/publish`, {\n method: \"POST\",\n body: { version },\n });\n}\n\nexport interface ListSkillsOptions {\n page?: number;\n pageSize?: number;\n name?: string;\n source?: string;\n status?: string;\n createUser?: string;\n}\n\nfunction listQuery(opts: ListSkillsOptions) {\n return {\n page: opts.page ?? 1,\n page_size: opts.pageSize ?? 30,\n name: opts.name || undefined,\n source: opts.source || undefined,\n status: opts.status || undefined,\n create_user: opts.createUser || undefined,\n };\n}\n\nexport function listSkills(ctx: RequestContext, opts: ListSkillsOptions = {}): Promise<unknown> {\n return request(ctx, `${BASE}/skills`, { query: listQuery(opts) });\n}\n\nexport function listSkillMarket(\n ctx: RequestContext,\n opts: ListSkillsOptions = {},\n): Promise<unknown> {\n return request(ctx, `${BASE}/skills/market`, { query: listQuery(opts) });\n}\n\nexport function getSkill(ctx: RequestContext, skillId: string): Promise<unknown> {\n return request(ctx, `${BASE}/skills/${encodeURIComponent(skillId)}`);\n}\n\nexport function getSkillMarket(ctx: RequestContext, skillId: string): Promise<unknown> {\n return request(ctx, `${BASE}/skills/market/${encodeURIComponent(skillId)}`);\n}\n\nexport function deleteSkill(ctx: RequestContext, skillId: string): Promise<unknown> {\n return request(ctx, `${BASE}/skills/${encodeURIComponent(skillId)}`, { method: \"DELETE\" });\n}\n\n/** Read a skill's SKILL.md content index. */\nexport function getSkillContent(ctx: RequestContext, skillId: string): Promise<unknown> {\n return request(ctx, `${BASE}/skills/${encodeURIComponent(skillId)}/content`);\n}\n\n/** Read a file inside a skill (progressive). */\nexport function readSkillFile(\n ctx: RequestContext,\n skillId: string,\n relPath: string,\n): Promise<unknown> {\n return request(ctx, `${BASE}/skills/${encodeURIComponent(skillId)}/files/read`, {\n method: \"POST\",\n body: { rel_path: relPath },\n });\n}\n\n/** Version history for a skill. */\nexport function getSkillHistory(ctx: RequestContext, skillId: string): Promise<unknown> {\n return request(ctx, `${BASE}/skills/${encodeURIComponent(skillId)}/history`);\n}\n\nexport type SkillStatus = \"unpublish\" | \"published\" | \"offline\";\n\n/** Change a skill's status. */\nexport function setSkillStatus(\n ctx: RequestContext,\n skillId: string,\n status: SkillStatus,\n): Promise<unknown> {\n return request(ctx, `${BASE}/skills/${encodeURIComponent(skillId)}/status`, {\n method: \"PUT\",\n body: { status },\n });\n}\n","/**\n * Skill package ↔ zip helpers (jszip). Skills are shipped as a zip whose root\n * holds SKILL.md plus any referenced files; the backend reads `skill_file_index`\n * from the archive, so the directory layout must be preserved.\n */\nimport { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve, sep } from \"node:path\";\nimport JSZip from \"jszip\";\n\nfunction walk(dir: string, base: string, files: string[]): void {\n for (const entry of readdirSync(dir)) {\n const full = join(dir, entry);\n const st = statSync(full);\n if (st.isDirectory()) walk(full, base, files);\n else files.push(full);\n }\n}\n\n/** Zip a directory's contents (paths relative to the dir, forward slashes). */\nexport async function zipDirectory(dir: string): Promise<Uint8Array> {\n const abs = resolve(dir);\n if (!existsSync(abs)) throw new Error(`directory not found: ${abs}`);\n const zip = new JSZip();\n const files: string[] = [];\n walk(abs, abs, files);\n for (const file of files) {\n const rel = relative(abs, file).split(sep).join(\"/\");\n zip.file(rel, readFileSync(file));\n }\n return new Uint8Array(await zip.generateAsync({ type: \"uint8array\", compression: \"DEFLATE\" }));\n}\n\n/** Extract a zip archive into a target directory (created if missing). */\nexport async function unzipToDirectory(bytes: Uint8Array, dir: string): Promise<string[]> {\n const abs = resolve(dir);\n mkdirSync(abs, { recursive: true });\n const zip = await JSZip.loadAsync(bytes);\n const written: string[] = [];\n const entries = Object.values(zip.files);\n for (const entry of entries) {\n if (entry.dir) continue;\n const out = join(abs, entry.name);\n mkdirSync(dirname(out), { recursive: true });\n writeFileSync(out, await entry.async(\"nodebuffer\"));\n written.push(out);\n }\n return written;\n}\n","/** Toolbox + tool resource surface (read + write). */\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport {\n type CreateToolboxOptions,\n type ImpexType,\n type ListToolboxesOptions,\n type ToolInvokeEnvelope,\n createToolbox,\n debugTool,\n deleteToolbox,\n executeTool,\n exportConfig,\n importConfig,\n listToolboxes,\n listTools,\n setToolStatuses,\n setToolboxStatus,\n uploadTool,\n} from \"../api/toolboxes.js\";\nimport type { RequestContext } from \"../types.js\";\n\nexport function toolboxes(ctx: RequestContext) {\n return {\n list: (opts?: ListToolboxesOptions) => listToolboxes(ctx, opts),\n tools: (boxId: string) => listTools(ctx, boxId),\n create: (opts: CreateToolboxOptions) => createToolbox(ctx, opts),\n delete: (boxId: string) => deleteToolbox(ctx, boxId),\n publish: (boxId: string) => setToolboxStatus(ctx, boxId, \"published\"),\n unpublish: (boxId: string) => setToolboxStatus(ctx, boxId, \"draft\"),\n setToolStatus: (boxId: string, toolIds: string[], status: \"enabled\" | \"disabled\") =>\n setToolStatuses(\n ctx,\n boxId,\n toolIds.map((toolId) => ({ toolId, status })),\n ),\n upload: (boxId: string, filePath: string, metadataType?: string) =>\n uploadTool(ctx, boxId, filePath, metadataType),\n /** Export a toolbox config to a local `.adp` file. */\n export: async (id: string, outPath: string, type?: ImpexType) => {\n const bytes = await exportConfig(ctx, id, type);\n const dest = resolve(outPath);\n mkdirSync(dirname(dest), { recursive: true });\n writeFileSync(dest, bytes);\n return { id, path: dest, bytes: bytes.length };\n },\n /** Import a toolbox config from a local `.adp` file. */\n import: (filePath: string, type?: ImpexType) => importConfig(ctx, filePath, type),\n execute: (boxId: string, toolId: string, e?: ToolInvokeEnvelope) =>\n executeTool(ctx, boxId, toolId, e),\n debug: (boxId: string, toolId: string, e?: ToolInvokeEnvelope) =>\n debugTool(ctx, boxId, toolId, e),\n };\n}\n","/**\n * Toolbox + tool client (agent-operator-integration tool-box). Read side,\n * mirroring kweaver-sdk api/toolboxes.ts. Passed through as parsed JSON.\n */\nimport { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type { RequestContext } from \"../types.js\";\nimport { HttpError } from \"../utils/errors.js\";\nimport { buildHeaders } from \"./headers.js\";\nimport { request } from \"./http.js\";\nimport { applyTls } from \"./tls.js\";\n\nconst PATH = \"/api/agent-operator-integration/v1/tool-box\";\n\nconst IMPEX = \"/api/agent-operator-integration/v1/impex\";\nexport type ImpexType = \"toolbox\" | \"mcp\" | \"operator\";\n\n/** Export a toolbox/mcp/operator config as raw `.adp` bytes (GET impex/export). */\nexport async function exportConfig(\n ctx: RequestContext,\n id: string,\n type: ImpexType = \"toolbox\",\n): Promise<Uint8Array> {\n applyTls(ctx);\n const res = await fetch(\n `${ctx.baseUrl}${IMPEX}/export/${encodeURIComponent(type)}/${encodeURIComponent(id)}`,\n { headers: buildHeaders(ctx) },\n );\n const buf = new Uint8Array(await res.arrayBuffer());\n if (!res.ok) throw new HttpError(res.status, res.statusText, new TextDecoder().decode(buf));\n return buf;\n}\n\n/** Import a previously exported `.adp` config file (POST impex/import, multipart `data`). */\nexport async function importConfig(\n ctx: RequestContext,\n filePath: string,\n type: ImpexType = \"toolbox\",\n): Promise<unknown> {\n applyTls(ctx);\n const buf = await readFile(filePath);\n const form = new FormData();\n form.append(\"data\", new Blob([new Uint8Array(buf)]), basename(filePath));\n const res = await fetch(`${ctx.baseUrl}${IMPEX}/import/${encodeURIComponent(type)}`, {\n method: \"POST\",\n headers: buildHeaders(ctx),\n body: form,\n });\n const text = await res.text();\n if (!res.ok) throw new HttpError(res.status, res.statusText, text);\n return text ? JSON.parse(text) : text;\n}\n\n/**\n * Upload a tool definition file (e.g. an OpenAPI spec) into a toolbox.\n * `POST /tool-box/:id/tool` multipart: `metadata_type` + `data` (file).\n */\nexport async function uploadTool(\n ctx: RequestContext,\n boxId: string,\n filePath: string,\n metadataType = \"openapi\",\n): Promise<unknown> {\n applyTls(ctx);\n const buf = await readFile(filePath);\n const form = new FormData();\n form.append(\"metadata_type\", metadataType);\n form.append(\"data\", new Blob([new Uint8Array(buf)]), basename(filePath));\n const res = await fetch(`${ctx.baseUrl}${PATH}/${encodeURIComponent(boxId)}/tool`, {\n method: \"POST\",\n headers: buildHeaders(ctx),\n body: form,\n });\n const text = await res.text();\n if (!res.ok) throw new HttpError(res.status, res.statusText, text);\n return text ? JSON.parse(text) : text;\n}\n\nexport interface ListToolboxesOptions {\n keyword?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function listToolboxes(\n ctx: RequestContext,\n opts: ListToolboxesOptions = {},\n): Promise<unknown> {\n return request(ctx, `${PATH}/list`, {\n query: { keyword: opts.keyword || undefined, limit: opts.limit, offset: opts.offset ?? 0 },\n });\n}\n\n/** List tools inside a toolbox. */\nexport function listTools(ctx: RequestContext, boxId: string): Promise<unknown> {\n return request(ctx, `${PATH}/${encodeURIComponent(boxId)}/tools/list`);\n}\n\nexport interface CreateToolboxOptions {\n name: string;\n serviceUrl: string;\n description?: string;\n source?: string;\n}\n\nexport function createToolbox(ctx: RequestContext, opts: CreateToolboxOptions): Promise<unknown> {\n return request(ctx, PATH, {\n method: \"POST\",\n body: {\n metadata_type: \"openapi\",\n box_name: opts.name,\n box_desc: opts.description ?? \"\",\n box_svc_url: opts.serviceUrl,\n source: opts.source ?? \"custom\",\n },\n });\n}\n\nexport function deleteToolbox(ctx: RequestContext, boxId: string): Promise<unknown> {\n return request(ctx, `${PATH}/${encodeURIComponent(boxId)}`, { method: \"DELETE\" });\n}\n\n/** Publish (status=published) or unpublish (status=draft) a toolbox. */\nexport function setToolboxStatus(\n ctx: RequestContext,\n boxId: string,\n status: \"published\" | \"draft\",\n): Promise<unknown> {\n return request(ctx, `${PATH}/${encodeURIComponent(boxId)}/status`, {\n method: \"POST\",\n body: { status },\n });\n}\n\nexport interface ToolInvokeEnvelope {\n header?: Record<string, unknown>;\n query?: Record<string, unknown>;\n path?: Record<string, unknown>;\n body?: unknown;\n timeout?: number;\n}\n\nfunction envelope(e: ToolInvokeEnvelope): Record<string, unknown> {\n return {\n ...(e.timeout !== undefined ? { timeout: e.timeout } : {}),\n header: e.header ?? {},\n query: e.query ?? {},\n path: e.path ?? {},\n body: e.body ?? {},\n };\n}\n\n/** Execute a published+enabled tool through the toolbox proxy. */\nexport function executeTool(\n ctx: RequestContext,\n boxId: string,\n toolId: string,\n e: ToolInvokeEnvelope = {},\n): Promise<unknown> {\n return request(ctx, `${PATH}/${encodeURIComponent(boxId)}/proxy/${encodeURIComponent(toolId)}`, {\n method: \"POST\",\n body: envelope(e),\n });\n}\n\n/** Debug a tool (works on draft/disabled tools too). */\nexport function debugTool(\n ctx: RequestContext,\n boxId: string,\n toolId: string,\n e: ToolInvokeEnvelope = {},\n): Promise<unknown> {\n return request(\n ctx,\n `${PATH}/${encodeURIComponent(boxId)}/tool/${encodeURIComponent(toolId)}/debug`,\n {\n method: \"POST\",\n body: envelope(e),\n },\n );\n}\n\n/** Enable/disable tools inside a toolbox. */\nexport function setToolStatuses(\n ctx: RequestContext,\n boxId: string,\n updates: Array<{ toolId: string; status: \"enabled\" | \"disabled\" }>,\n): Promise<unknown> {\n return request(ctx, `${PATH}/${encodeURIComponent(boxId)}/tools/status`, {\n method: \"POST\",\n body: updates.map((u) => ({ tool_id: u.toolId, status: u.status })),\n });\n}\n","/**\n * Trace AI client (agent-observability). Implements raw trace search and a\n * two-hop \"spans by conversation\" fetch, mirroring kweaver-sdk. The full\n * diagnose/eval-set rule engine (LLM-as-judge) is a separate large feature and\n * is NOT included here — see docs/exec-plans/tech-debt-tracker.md.\n */\nimport type { RequestContext } from \"../types.js\";\nimport { request } from \"./http.js\";\n\nconst SEARCH = \"/api/agent-observability/v1/traces/_search\";\n\ninterface SearchHits {\n hits?: { hits?: Array<{ _source?: Record<string, unknown> }> };\n aggregations?: { tids?: { buckets?: Array<{ key?: string }> } };\n}\n\n/** A span flattened to the fields the diagnose rules read. */\nexport interface RawSpan {\n spanId: string;\n parentSpanId: string | null;\n name?: string;\n traceId?: string;\n startTimeUnixNano?: string;\n endTimeUnixNano?: string;\n status?: { code?: string };\n attributes?: Record<string, unknown>;\n events?: Array<{ name?: string; time?: string; attributes?: Record<string, unknown> }>;\n}\n\nfunction isoToNanos(iso: string): string | undefined {\n const ms = Date.parse(iso);\n if (Number.isNaN(ms)) return undefined;\n return (BigInt(ms) * 1_000_000n).toString();\n}\n\nfunction normalizeRawSpan(src: Record<string, unknown>): RawSpan | null {\n const spanIdRaw = src.spanId ?? src.span_id;\n const spanId = typeof spanIdRaw === \"string\" ? spanIdRaw : \"\";\n if (!spanId) return null;\n const parentRaw = src.parentSpanId ?? src.parent_span_id;\n const parentSpanId =\n typeof parentRaw === \"string\" && parentRaw !== \"\" && parentRaw !== \"0\" ? parentRaw : null;\n const start =\n typeof src.startTimeUnixNano === \"string\"\n ? src.startTimeUnixNano\n : typeof src.startTime === \"string\"\n ? isoToNanos(src.startTime)\n : undefined;\n const end =\n typeof src.endTimeUnixNano === \"string\"\n ? src.endTimeUnixNano\n : typeof src.endTime === \"string\"\n ? isoToNanos(src.endTime)\n : undefined;\n const traceIdRaw = src.traceId ?? src.trace_id;\n return {\n spanId,\n parentSpanId,\n name: typeof src.name === \"string\" ? src.name : undefined,\n traceId: typeof traceIdRaw === \"string\" ? traceIdRaw : undefined,\n startTimeUnixNano: start,\n endTimeUnixNano: end,\n status: src.status as RawSpan[\"status\"] | undefined,\n attributes: src.attributes as Record<string, unknown> | undefined,\n events: Array.isArray(src.events) ? (src.events as RawSpan[\"events\"]) : undefined,\n };\n}\n\n/** Two-hop fetch of a conversation's spans, normalized to `RawSpan` + observed traceIds. */\nexport async function getRawSpansByConversation(\n ctx: RequestContext,\n conversationId: string,\n opts: { maxTraceIds?: number; maxSpans?: number } = {},\n): Promise<{ spans: RawSpan[]; traceIds: string[] }> {\n const sources = await getSpansByConversation(ctx, conversationId, opts);\n const spans: RawSpan[] = [];\n const traceIds = new Set<string>();\n for (const src of sources) {\n const span = normalizeRawSpan(src);\n if (!span) continue;\n spans.push(span);\n if (span.traceId) traceIds.add(span.traceId);\n }\n return { spans, traceIds: [...traceIds] };\n}\n\n/** Raw OpenSearch-style trace search (body passthrough). */\nexport function traceSearch(ctx: RequestContext, body: unknown): Promise<unknown> {\n return request(ctx, SEARCH, { method: \"POST\", body });\n}\n\n/**\n * Fetch all span `_source` docs for a conversation.\n * Hop 1: aggregate trace ids for the conversation. Hop 2: fetch their spans.\n * (If hop 1 already returns flat hits, that is used directly.)\n */\nexport async function getSpansByConversation(\n ctx: RequestContext,\n conversationId: string,\n opts: { maxTraceIds?: number; maxSpans?: number } = {},\n): Promise<Array<Record<string, unknown>>> {\n const agg =\n (await request<SearchHits>(ctx, SEARCH, {\n method: \"POST\",\n body: {\n size: 0,\n query: { term: { \"attributes.gen_ai.conversation.id.keyword\": conversationId } },\n aggs: { tids: { terms: { field: \"traceId.keyword\", size: opts.maxTraceIds ?? 100 } } },\n },\n })) ?? {};\n\n const direct = agg.hits?.hits;\n if (!agg.aggregations && Array.isArray(direct)) {\n return direct.map((h) => h._source ?? {});\n }\n\n const traceIds = (agg.aggregations?.tids?.buckets ?? [])\n .map((b) => b.key)\n .filter((k): k is string => typeof k === \"string\" && k.length > 0);\n if (traceIds.length === 0) return [];\n\n const spans =\n (await request<SearchHits>(ctx, SEARCH, {\n method: \"POST\",\n body: {\n size: opts.maxSpans ?? 2000,\n query: { terms: { \"traceId.keyword\": traceIds } },\n },\n })) ?? {};\n return (spans.hits?.hits ?? []).map((h) => h._source ?? {});\n}\n","/**\n * LLM judge backed by the local `claude` CLI run as a one-shot subprocess:\n * claude -p --output-format=json --dangerously-skip-permissions (prompt on stdin)\n * The CLI returns a stable envelope `{ result: \"<text>\" }`; the model is asked\n * to make that text strict JSON, which we then parse. No HTTP/SDK key needed —\n * it reuses the user's existing Claude Code auth. Used by the trace diagnose\n * rubric pillar (the second, semantic half of `diagnose`).\n */\nimport { spawn, spawnSync } from \"node:child_process\";\n\nexport class ClaudeJudgeError extends Error {\n constructor(\n message: string,\n readonly reason: \"not_available\" | \"timeout\" | \"bad_output\" | \"exit\",\n ) {\n super(message);\n this.name = \"ClaudeJudgeError\";\n }\n}\n\n/** True when a `claude` binary is on PATH and responds to --version. */\nexport function claudeAvailable(binary = \"claude\"): boolean {\n try {\n const r = spawnSync(binary, [\"--version\"], {\n timeout: 5000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n return r.status === 0;\n } catch {\n return false;\n }\n}\n\nfunction extractEnvelope(stdout: string): string {\n const trimmed = stdout.trim();\n if (!trimmed) throw new ClaudeJudgeError(\"claude returned empty stdout\", \"bad_output\");\n const env = JSON.parse(trimmed) as { result?: unknown; text?: unknown };\n const text = typeof env.result === \"string\" ? env.result : env.text;\n if (typeof text !== \"string\")\n throw new ClaudeJudgeError(\"claude envelope had no result text\", \"bad_output\");\n return text;\n}\n\n/** Pull the first balanced JSON object out of a (possibly fenced) string. */\nfunction extractJsonObject(text: string): string {\n const fenced = text.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n const body = fenced?.[1] ?? text;\n const start = body.indexOf(\"{\");\n if (start === -1) throw new ClaudeJudgeError(\"no JSON object in judge output\", \"bad_output\");\n let depth = 0;\n for (let i = start; i < body.length; i++) {\n if (body[i] === \"{\") depth++;\n else if (body[i] === \"}\" && --depth === 0) return body.slice(start, i + 1);\n }\n throw new ClaudeJudgeError(\"unbalanced JSON object in judge output\", \"bad_output\");\n}\n\n/** Run the prompt through `claude` and parse the reply as a JSON object. */\nexport async function judgeJson(\n prompt: string,\n opts: { binary?: string; timeoutMs?: number } = {},\n): Promise<Record<string, unknown>> {\n const binary = opts.binary ?? \"claude\";\n const timeoutMs = opts.timeoutMs ?? 120_000;\n const args = [\"-p\", \"--output-format=json\", \"--dangerously-skip-permissions\"];\n\n const stdout = await new Promise<string>((resolve, reject) => {\n const child = spawn(binary, args, { stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n let out = \"\";\n let timedOut = false;\n const killer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n setTimeout(() => child.kill(\"SIGKILL\"), 2000).unref();\n }, timeoutMs);\n killer.unref();\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (d: string) => {\n out += d;\n });\n child.on(\"error\", (err: NodeJS.ErrnoException) => {\n clearTimeout(killer);\n reject(\n err.code === \"ENOENT\"\n ? new ClaudeJudgeError(\"`claude` not found on PATH\", \"not_available\")\n : err,\n );\n });\n child.on(\"close\", (code) => {\n clearTimeout(killer);\n if (timedOut)\n return reject(new ClaudeJudgeError(`claude timed out after ${timeoutMs}ms`, \"timeout\"));\n if (code !== 0) return reject(new ClaudeJudgeError(`claude exited ${code}`, \"exit\"));\n resolve(out);\n });\n child.stdin.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code !== \"EPIPE\") reject(err);\n });\n child.stdin.end(prompt);\n });\n\n const text = extractEnvelope(stdout);\n return JSON.parse(extractJsonObject(text)) as Record<string, unknown>;\n}\n","/**\n * Trace diagnose engine. Fetches a conversation's spans, shapes them into a\n * trace tree, runs deterministic symbolic predicates, and (in hybrid mode) adds\n * gated LLM-judged rubric findings + an LLM synthesized summary. Cross-trace\n * `scan` is the remaining piece (see docs/exec-plans/tech-debt-tracker.md).\n */\nimport type { RawSpan } from \"../api/trace.js\";\n\nexport type SpanKind = \"tool\" | \"llm\" | \"retrieval\" | \"reasoning\" | \"unknown\";\n\nexport interface Span {\n spanId: string;\n parentSpanId: string | null;\n name: string;\n kind: SpanKind;\n startTimeUnixNano: string;\n endTimeUnixNano: string;\n durationMs: number;\n status: \"ok\" | \"error\" | \"unset\";\n attributes: Record<string, unknown>;\n}\n\nexport interface TraceTree {\n traceId: string;\n spans: Span[];\n byKind: Map<SpanKind, Span[]>;\n}\n\nexport interface Hit {\n evidenceSpans: string[];\n excerpt: string;\n bindings: Record<string, unknown>;\n}\n\nexport type Predicate = (trace: TraceTree, params: Record<string, unknown>) => Hit[];\n\nexport interface Rule {\n id: string;\n severity: \"low\" | \"medium\" | \"high\";\n symptom: string;\n suggestedFix: { target: string; changeTemplate: string };\n predicate: Predicate;\n params: Record<string, unknown>;\n}\n\nexport interface Finding {\n ruleId: string;\n judgmentKind: \"symbolic\" | \"rubric\";\n severity: \"low\" | \"medium\" | \"high\";\n symptom: string;\n evidence: { spans: string[]; excerpt: string };\n suggestedFix: { target: string; change: string };\n confidence?: \"low\" | \"medium\" | \"high\";\n}\n\nexport interface Summary {\n headline: string;\n primaryRootCause: string | null;\n targetForFix: string | null;\n}\n\nexport interface DiagnoseReport {\n traceId: string;\n conversationId: string;\n diagnosedAt: string | null;\n mode: \"symbolic-only\" | \"hybrid\";\n rulesApplied: string[];\n findingCount: number;\n summary?: Summary;\n findings: Finding[];\n}\n\n/** A rubric (LLM-judged) rule, gated on a symbolic rule having fired. */\nexport interface RubricRule {\n id: string;\n severity: \"low\" | \"medium\" | \"high\";\n symptom: string;\n gatesOn: string;\n judgeQuestion: string;\n suggestedFix: { target: string; changeTemplate: string };\n}\n\n// ── trace shaping ────────────────────────────────────────────────────────────\n\nconst KIND_MAP: Record<string, SpanKind> = {\n chat: \"llm\",\n text_completion: \"llm\",\n embeddings: \"retrieval\",\n execute_tool: \"tool\",\n model: \"llm\",\n llm: \"llm\",\n tool: \"tool\",\n retrieval: \"retrieval\",\n reasoning: \"reasoning\",\n};\n\nfunction deriveKind(attrs: Record<string, unknown>): SpanKind {\n const op = attrs[\"gen_ai.operation.name\"];\n if (typeof op === \"string\" && op in KIND_MAP) return KIND_MAP[op] as SpanKind;\n const t = attrs[\"agent.trace.type\"];\n if (typeof t === \"string\" && t in KIND_MAP) return KIND_MAP[t] as SpanKind;\n return \"unknown\";\n}\n\nfunction durationMs(start?: string, end?: string): number {\n if (!start || !end) return 0;\n try {\n return Number((BigInt(end) - BigInt(start)) / 1_000_000n);\n } catch {\n return 0;\n }\n}\n\nexport function assembleTraceTree(traceId: string, raw: RawSpan[]): TraceTree {\n const spans: Span[] = raw.map((r) => {\n const attrs = r.attributes ?? {};\n const code = r.status?.code?.toUpperCase();\n return {\n spanId: r.spanId,\n parentSpanId: r.parentSpanId ?? null,\n name: r.name ?? \"\",\n kind: deriveKind(attrs),\n startTimeUnixNano: r.startTimeUnixNano ?? \"0\",\n endTimeUnixNano: r.endTimeUnixNano ?? \"0\",\n durationMs: durationMs(r.startTimeUnixNano, r.endTimeUnixNano),\n status: code === \"OK\" ? \"ok\" : code === \"ERROR\" ? \"error\" : \"unset\",\n attributes: attrs,\n };\n });\n const byKind = new Map<SpanKind, Span[]>();\n for (const s of spans) {\n const arr = byKind.get(s.kind) ?? [];\n arr.push(s);\n byKind.set(s.kind, arr);\n }\n return { traceId, spans, byKind };\n}\n\n// ── predicates (ported 1:1 from kweaver-sdk builtin-rules) ─────────────────────\n\nfunction byStart(spans: Span[]): Span[] {\n return spans\n .slice()\n .sort((a, b) => Number(BigInt(a.startTimeUnixNano) - BigInt(b.startTimeUnixNano)));\n}\nfunction strAttr(s: Span, key: string): string {\n const v = s.attributes[key];\n return typeof v === \"string\" ? v : \"\";\n}\nfunction toolName(s: Span): string {\n return strAttr(s, \"gen_ai.tool.name\") || s.name;\n}\n\nconst toolLoopNoStateChange: Predicate = (trace, params) => {\n const STATE = \"gen_ai.conversation.state\";\n const min = (params.min_consecutive as number | undefined) ?? 3;\n const tools = byStart(trace.byKind.get(\"tool\") ?? []);\n const hits: Hit[] = [];\n let i = 0;\n while (i < tools.length) {\n const start = tools[i] as Span;\n const name = toolName(start);\n const args = start.attributes[\"gen_ai.tool.args\"];\n const state = start.attributes[STATE];\n let j = i + 1;\n while (\n j < tools.length &&\n toolName(tools[j] as Span) === name &&\n JSON.stringify((tools[j] as Span).attributes[\"gen_ai.tool.args\"]) === JSON.stringify(args) &&\n (tools[j] as Span).attributes[STATE] === state\n )\n j++;\n const runLen = j - i;\n if (runLen >= min) {\n hits.push({\n evidenceSpans: tools.slice(i, j).map((s) => s.spanId),\n excerpt: `tool '${name}' called ${runLen} times consecutively with identical args; conversation state unchanged`,\n bindings: { tool_name: name, loop_count: runLen, max_count: min - 1 },\n });\n }\n i = j;\n }\n return hits;\n};\n\nconst toolErrorSwallowed: Predicate = (trace) => {\n const all = byStart(trace.spans);\n const hits: Hit[] = [];\n for (let i = 0; i < all.length; i++) {\n const s = all[i] as Span;\n if (s.kind !== \"tool\" || s.status !== \"error\") continue;\n const errMsg = strAttr(s, \"error.message\");\n let next: Span | undefined;\n for (let j = i + 1; j < all.length; j++) {\n if ((all[j] as Span).kind === \"llm\") {\n next = all[j] as Span;\n break;\n }\n }\n if (!next) continue;\n const prompt = (strAttr(next, \"gen_ai.prompt\") || strAttr(next, \"llm.prompt\")).toLowerCase();\n if (!(errMsg.length > 0 && prompt.includes(errMsg.toLowerCase()))) {\n hits.push({\n evidenceSpans: [s.spanId, next.spanId],\n excerpt: `tool '${toolName(s)}' errored ('${errMsg}') but the next LLM prompt did not propagate the error`,\n bindings: { tool_name: toolName(s), error_message: errMsg },\n });\n }\n }\n return hits;\n};\n\nconst retrievalEmptyNoFallback: Predicate = (trace) => {\n const ordered = byStart(trace.spans);\n const hits: Hit[] = [];\n for (let i = 0; i < ordered.length; i++) {\n const s = ordered[i] as Span;\n if (s.kind !== \"retrieval\") continue;\n if (s.attributes[\"gen_ai.retrieval.result_count\"] !== 0) continue;\n const next = ordered[i + 1];\n if (next?.kind === \"llm\") {\n hits.push({\n evidenceSpans: [s.spanId, next.spanId],\n excerpt: \"retrieval returned 0 results; next step was LLM generation with no fallback path\",\n bindings: {},\n });\n }\n }\n return hits;\n};\n\nconst llmResponseTruncatedNoContinue: Predicate = (trace) => {\n const finishReason = (s: Span): string => {\n const arr = s.attributes[\"gen_ai.response.finish_reasons\"];\n if (Array.isArray(arr)) {\n for (const r of arr) if (typeof r === \"string\" && r) return r;\n }\n return strAttr(s, \"gen_ai.response.finish_reason\") || strAttr(s, \"llm.finish_reason\");\n };\n const convId = (s: Span): string => strAttr(s, \"gen_ai.conversation.id\");\n const llms = byStart(trace.byKind.get(\"llm\") ?? []);\n const hits: Hit[] = [];\n for (let i = 0; i < llms.length; i++) {\n const s = llms[i] as Span;\n if (finishReason(s) !== \"length\") continue;\n const id = convId(s);\n let cont = false;\n for (let j = i + 1; j < llms.length; j++) if (convId(llms[j] as Span) === id) cont = true;\n if (!cont) {\n hits.push({\n evidenceSpans: [s.spanId],\n excerpt: `LLM response truncated (finish_reason=length) with no continuation span in conversation '${id}'`,\n bindings: { conversation_id: id },\n });\n }\n }\n return hits;\n};\n\nconst excessiveToolCallsPerTurn: Predicate = (trace, params) => {\n const max = (params.max_tool_calls_per_turn as number | undefined) ?? 10;\n const tools = trace.byKind.get(\"tool\") ?? [];\n if (tools.length <= max) return [];\n return [\n {\n evidenceSpans: tools.map((t) => t.spanId),\n excerpt: `tool calls per turn exceeded threshold: ${tools.length} > ${max}`,\n bindings: { count: tools.length, max_calls: max },\n },\n ];\n};\n\n// ── builtin rules ──────────────────────────────────────────────────────────\n\nexport const BUILTIN_RULES: Rule[] = [\n {\n id: \"tool_loop_no_state_change\",\n severity: \"high\",\n symptom: \"repeated_tool_call_without_state_change\",\n suggestedFix: {\n target: \"decision_agent.prompt\",\n changeTemplate:\n \"add a stop condition after {{loop_count}} equivalent retries of '{{tool_name}}'\",\n },\n predicate: toolLoopNoStateChange,\n params: { min_consecutive: 3 },\n },\n {\n id: \"tool_error_swallowed\",\n severity: \"high\",\n symptom: \"tool_error_not_propagated_to_llm\",\n suggestedFix: {\n target: \"agent.tool_result_handling\",\n changeTemplate: \"feed tool errors back into the next LLM prompt\",\n },\n predicate: toolErrorSwallowed,\n params: {},\n },\n {\n id: \"retrieval_empty_no_fallback\",\n severity: \"medium\",\n symptom: \"empty_retrieval_no_fallback\",\n suggestedFix: {\n target: \"retrieval.fallback\",\n changeTemplate: \"add a rewrite/alternate-source fallback when retrieval returns 0 results\",\n },\n predicate: retrievalEmptyNoFallback,\n params: {},\n },\n {\n id: \"llm_response_truncated_no_continue\",\n severity: \"medium\",\n symptom: \"truncated_response_no_continuation\",\n suggestedFix: {\n target: \"llm.max_tokens\",\n changeTemplate: \"raise max_tokens or add a continuation turn when finish_reason=length\",\n },\n predicate: llmResponseTruncatedNoContinue,\n params: {},\n },\n {\n id: \"excessive_tool_calls_per_turn\",\n severity: \"low\",\n symptom: \"excessive_tool_calls_per_turn\",\n suggestedFix: {\n target: \"decision_agent.prompt\",\n changeTemplate: \"cap tool calls per turn at {{max_calls}}\",\n },\n predicate: excessiveToolCallsPerTurn,\n params: { max_tool_calls_per_turn: 10 },\n },\n];\n\nfunction applyTemplate(tpl: string, bindings: Record<string, unknown>): string {\n return tpl.replace(/\\{\\{(\\w+)\\}\\}/g, (_m, k) => String(bindings[k] ?? `{{${k}}}`));\n}\n\n/** Run all builtin symbolic rules over a trace tree → findings. */\nexport function runRules(tree: TraceTree, rules: Rule[] = BUILTIN_RULES): Finding[] {\n const findings: Finding[] = [];\n for (const rule of rules) {\n for (const hit of rule.predicate(tree, rule.params)) {\n findings.push({\n ruleId: rule.id,\n judgmentKind: \"symbolic\",\n severity: rule.severity,\n symptom: rule.symptom,\n evidence: { spans: hit.evidenceSpans, excerpt: hit.excerpt },\n suggestedFix: {\n target: rule.suggestedFix.target,\n change: applyTemplate(rule.suggestedFix.changeTemplate, hit.bindings),\n },\n });\n }\n }\n return findings;\n}\n\n// ── rubric (LLM-judge) pillar ─────────────────────────────────────────────────\n\nexport const BUILTIN_RUBRIC_RULES: RubricRule[] = [\n {\n id: \"tool_retry_intent_mismatch\",\n severity: \"high\",\n symptom: \"repeated_tool_call_without_state_change\",\n gatesOn: \"tool_loop_no_state_change\",\n judgeQuestion:\n \"Given the user's intent and the tool retry pattern in this trace, classify why \" +\n \"the agent kept calling the same tool: a legitimate retry (expecting changed state), \" +\n \"a stale-results handling failure (results were identical and the agent didn't notice), \" +\n \"prompt confusion (misinterpreted its own instructions), or other.\",\n suggestedFix: {\n target: \"decision_agent.prompt\",\n changeTemplate:\n \"agent retried because of '{{category}}'; address that intent (staleness detection, broaden query, or escalate)\",\n },\n },\n];\n\nfunction userIntent(tree: TraceTree): string {\n for (const s of tree.spans) {\n const v = s.attributes[\"gen_ai.user.message\"];\n if (typeof v === \"string\" && v) return v;\n }\n const firstLlm = byStart(tree.byKind.get(\"llm\") ?? [])[0];\n return firstLlm ? strAttr(firstLlm, \"gen_ai.prompt\") || strAttr(firstLlm, \"llm.prompt\") : \"\";\n}\n\nfunction spanSequence(tree: TraceTree): Array<Record<string, unknown>> {\n return byStart(tree.spans)\n .filter((s) => s.kind === \"tool\" || s.kind === \"llm\")\n .map((s) => ({\n span_id: s.spanId,\n kind: s.kind,\n name: s.name,\n status: s.status,\n tool: strAttr(s, \"gen_ai.tool.name\") || undefined,\n args: s.attributes[\"gen_ai.tool.args\"],\n }));\n}\n\nfunction buildRubricPrompt(rule: RubricRule, tree: TraceTree): string {\n return [\n \"You are a trace-diagnosis judge. Answer the question about the agent trace below.\",\n \"\",\n `QUESTION: ${rule.judgeQuestion}`,\n \"\",\n `USER INTENT: ${userIntent(tree) || \"(unknown)\"}`,\n \"\",\n \"SPAN SEQUENCE (tool + llm steps, chronological):\",\n JSON.stringify(spanSequence(tree), null, 2),\n \"\",\n \"Respond with ONLY a JSON object (no prose, no code fence) of exactly this shape:\",\n '{\"category\": \"legitimate_retry|stale_results|prompt_confusion|other\", \"reasoning\": \"<one or two sentences>\", \"severity\": \"low|medium|high\", \"confidence\": \"low|medium|high\", \"first_violating_step_id\": \"<span_id>\", \"evidence_span_ids\": [\"<span_id>\", ...]}',\n ].join(\"\\n\");\n}\n\n/**\n * Run rubric (LLM-judged) rules whose symbolic gate fired. Each is judged by\n * the local `claude` CLI. A judge error skips that rule (recorded), never\n * aborts the diagnosis.\n */\nexport async function runRubric(\n tree: TraceTree,\n symbolicFindings: Finding[],\n judge: (prompt: string) => Promise<Record<string, unknown>>,\n rules: RubricRule[] = BUILTIN_RUBRIC_RULES,\n): Promise<Finding[]> {\n const fired = new Set(symbolicFindings.map((f) => f.ruleId));\n const out: Finding[] = [];\n for (const rule of rules) {\n if (!fired.has(rule.gatesOn)) continue;\n let judged: Record<string, unknown>;\n try {\n judged = await judge(buildRubricPrompt(rule, tree));\n } catch {\n continue; // skip-on-failure; symbolic findings still stand\n }\n const category = typeof judged.category === \"string\" ? judged.category : \"other\";\n const sev = judged.severity;\n const conf = judged.confidence;\n const spans = Array.isArray(judged.evidence_span_ids)\n ? judged.evidence_span_ids.filter((s): s is string => typeof s === \"string\")\n : [];\n out.push({\n ruleId: rule.id,\n judgmentKind: \"rubric\",\n severity: sev === \"low\" || sev === \"medium\" || sev === \"high\" ? sev : rule.severity,\n symptom: rule.symptom,\n evidence: { spans, excerpt: typeof judged.reasoning === \"string\" ? judged.reasoning : \"\" },\n suggestedFix: {\n target: rule.suggestedFix.target,\n change: applyTemplate(rule.suggestedFix.changeTemplate, { category }),\n },\n ...(conf === \"low\" || conf === \"medium\" || conf === \"high\" ? { confidence: conf } : {}),\n });\n }\n return out;\n}\n\n/**\n * Synthesize the findings into a one-line headline + primary root cause via the\n * LLM judge. Returns a template fallback when there are no findings or the judge\n * fails, so a report always has a Summary.\n */\nexport async function synthesizeFindings(\n findings: Finding[],\n judge: (prompt: string) => Promise<Record<string, unknown>>,\n): Promise<Summary> {\n if (findings.length === 0) {\n return {\n headline: \"No issues found by the diagnosis rules.\",\n primaryRootCause: null,\n targetForFix: null,\n };\n }\n const prompt = [\n \"You are a trace-diagnosis synthesizer. Given these findings, write a concise summary.\",\n \"FINDINGS:\",\n JSON.stringify(\n findings.map((f) => ({\n rule: f.ruleId,\n severity: f.severity,\n symptom: f.symptom,\n evidence: f.evidence.excerpt,\n fix: f.suggestedFix,\n })),\n null,\n 2,\n ),\n \"\",\n 'Respond with ONLY JSON: {\"headline\":\"<one sentence>\",\"primary_root_cause\":\"<one sentence or null>\",\"target_for_fix\":\"<component or null>\"}',\n ].join(\"\\n\");\n try {\n const out = await judge(prompt);\n return {\n headline: typeof out.headline === \"string\" ? out.headline : fallbackHeadline(findings),\n primaryRootCause: typeof out.primary_root_cause === \"string\" ? out.primary_root_cause : null,\n targetForFix: typeof out.target_for_fix === \"string\" ? out.target_for_fix : null,\n };\n } catch {\n return { headline: fallbackHeadline(findings), primaryRootCause: null, targetForFix: null };\n }\n}\n\nfunction fallbackHeadline(findings: Finding[]): string {\n const high = findings.filter((f) => f.severity === \"high\").length;\n return `${findings.length} finding(s)${high > 0 ? `, ${high} high-severity` : \"\"}.`;\n}\n\n/** Render a diagnose report as human-readable markdown. */\nexport function renderReportMarkdown(r: DiagnoseReport): string {\n const lines = [`# Trace Diagnose — \\`${r.traceId}\\``, \"\"];\n lines.push(\n `> conversation \\`${r.conversationId}\\` · mode ${r.mode} · ${r.findingCount} finding(s)`,\n \"\",\n );\n if (r.summary) {\n lines.push(`**${r.summary.headline}**`, \"\");\n if (r.summary.primaryRootCause) {\n const tgt = r.summary.targetForFix ? ` (fix target: \\`${r.summary.targetForFix}\\`)` : \"\";\n lines.push(`Primary root cause: ${r.summary.primaryRootCause}${tgt}`, \"\");\n }\n }\n if (r.findings.length === 0) {\n if (!r.summary) lines.push(\"No issues found by the symbolic rules.\");\n return lines.join(\"\\n\");\n }\n const order = { high: 0, medium: 1, low: 2 } as const;\n for (const f of r.findings.slice().sort((a, b) => order[a.severity] - order[b.severity])) {\n const conf = f.confidence ? `, confidence ${f.confidence}` : \"\";\n lines.push(`## [${f.severity.toUpperCase()}] ${f.ruleId} (${f.judgmentKind}${conf})`, \"\");\n lines.push(`- **symptom**: ${f.symptom}`);\n lines.push(`- **evidence**: ${f.evidence.excerpt}`);\n lines.push(`- **spans**: ${f.evidence.spans.map((s) => `\\`${s}\\``).join(\", \") || \"—\"}`);\n lines.push(`- **suggested fix** (\\`${f.suggestedFix.target}\\`): ${f.suggestedFix.change}`, \"\");\n }\n return lines.join(\"\\n\");\n}\n","/**\n * Trace eval-set — build a set of evaluation cases and run them against a live\n * agent. Each case is {query, assertions[]}; `test` runs the query through the\n * agent, fetches the resulting trace, and checks each assertion. Deterministic\n * assertion kinds (contains, regex, tool-call count/order, latency) need no LLM;\n * `semantic_match` reuses the local-claude judge. Builder lifts cases from a\n * queries file (JSON). The diagnosis-report lift + YAML shards + redaction from\n * kweaver-sdk are deferred — see tech-debt.\n */\nimport type { Span } from \"./diagnose.js\";\n\nexport type AssertionType =\n | \"contains\"\n | \"not_contains\"\n | \"regex\"\n | \"tool_call_count\"\n | \"tool_call_order\"\n | \"latency_ms\"\n | \"semantic_match\";\n\nexport interface EvalAssertion {\n type: AssertionType;\n [key: string]: unknown;\n}\n\nexport interface EvalCase {\n query_id: string;\n input: { user_message: string };\n reference?: { answer: string };\n assertions?: EvalAssertion[];\n tags?: string[];\n}\n\nexport interface AssertionResult {\n type: AssertionType;\n verdict: \"pass\" | \"fail\" | \"skip\";\n actual?: unknown;\n reason?: string;\n}\n\nexport interface CaseResult {\n queryId: string;\n query: string;\n answer: string;\n conversationId: string | null;\n assertions: AssertionResult[];\n errorCode?: string;\n}\n\nexport interface EvalSetResult {\n agentId: string;\n total: number;\n passed: number;\n failed: number;\n skipped: number;\n cases: CaseResult[];\n}\n\n/** Stable id from the user message (deterministic — no clock/random). */\nfunction hashId(s: string): string {\n let h = 5381;\n for (let i = 0; i < s.length; i++) h = (h * 33) ^ s.charCodeAt(i);\n return `q_${(h >>> 0).toString(36)}`;\n}\n\n/** Normalize loosely-shaped query entries into EvalCases. */\nexport function buildCasesFromQueries(raw: unknown): EvalCase[] {\n const arr = Array.isArray(raw)\n ? raw\n : Array.isArray((raw as { cases?: unknown[] })?.cases)\n ? (raw as { cases: unknown[] }).cases\n : Array.isArray((raw as { queries?: unknown[] })?.queries)\n ? (raw as { queries: unknown[] }).queries\n : [];\n return arr.map((entry) => {\n const e = entry as Record<string, unknown>;\n const userMessage =\n typeof e.query === \"string\"\n ? e.query\n : typeof (e.input as { user_message?: string } | undefined)?.user_message === \"string\"\n ? (e.input as { user_message: string }).user_message\n : \"\";\n const refAnswer = (e.reference as { answer?: string } | undefined)?.answer;\n return {\n query_id: typeof e.query_id === \"string\" && e.query_id ? e.query_id : hashId(userMessage),\n input: { user_message: userMessage },\n ...(typeof refAnswer === \"string\" ? { reference: { answer: refAnswer } } : {}),\n ...(Array.isArray(e.assertions) ? { assertions: e.assertions as EvalAssertion[] } : {}),\n ...(Array.isArray(e.tags) ? { tags: e.tags.map(String) } : {}),\n };\n });\n}\n\ntype Op = \"eq\" | \"lt\" | \"lte\" | \"gt\" | \"gte\";\nfunction applyOp(actual: number, op: Op, expected: number): boolean {\n return op === \"eq\"\n ? actual === expected\n : op === \"lt\"\n ? actual < expected\n : op === \"lte\"\n ? actual <= expected\n : op === \"gt\"\n ? actual > expected\n : actual >= expected;\n}\nfunction toolName(s: Span): string {\n const v = s.attributes[\"gen_ai.tool.name\"];\n return typeof v === \"string\" ? v : s.name;\n}\nfunction orderedToolNames(spans: Span[]): string[] {\n return spans\n .filter((s) => s.kind === \"tool\")\n .slice()\n .sort((a, b) => Number(BigInt(a.startTimeUnixNano) - BigInt(b.startTimeUnixNano)))\n .map(toolName);\n}\nfunction isSubsequence(seq: string[], actual: string[]): boolean {\n let i = 0;\n for (const n of actual) {\n if (n === seq[i]) i++;\n if (i === seq.length) return true;\n }\n return seq.length === 0;\n}\n\nexport interface AssertionContext {\n answer: string;\n spans: Span[];\n durationMs?: number;\n reference?: { answer: string };\n /** Judge for semantic_match: returns pass/fail + reasoning. */\n judgeSemanticMatch?: (\n question: string,\n answer: string,\n reference: string,\n ) => Promise<{ verdict: \"pass\" | \"fail\"; reasoning: string }>;\n}\n\nexport async function evaluateAssertion(\n a: EvalAssertion,\n ctx: AssertionContext,\n): Promise<AssertionResult> {\n const r = a as Record<string, unknown>;\n switch (a.type) {\n case \"contains\": {\n const v = String(r.value ?? \"\");\n return ctx.answer.includes(v)\n ? { type: a.type, verdict: \"pass\" }\n : { type: a.type, verdict: \"fail\", actual: ctx.answer };\n }\n case \"not_contains\": {\n const v = String(r.value ?? \"\");\n return ctx.answer.includes(v)\n ? { type: a.type, verdict: \"fail\", actual: ctx.answer }\n : { type: a.type, verdict: \"pass\" };\n }\n case \"regex\": {\n let re: RegExp;\n try {\n re = new RegExp(String(r.pattern ?? \"\"));\n } catch {\n return { type: a.type, verdict: \"skip\", reason: `invalid regex: ${r.pattern}` };\n }\n return re.test(ctx.answer)\n ? { type: a.type, verdict: \"pass\" }\n : { type: a.type, verdict: \"fail\", actual: ctx.answer };\n }\n case \"tool_call_count\": {\n const count = ctx.spans.filter(\n (s) => s.kind === \"tool\" && toolName(s) === String(r.tool ?? \"\"),\n ).length;\n return applyOp(count, (r.op as Op) ?? \"eq\", Number(r.value ?? 0))\n ? { type: a.type, verdict: \"pass\", actual: count }\n : { type: a.type, verdict: \"fail\", actual: count };\n }\n case \"tool_call_order\": {\n const seq = Array.isArray(r.sequence) ? (r.sequence as unknown[]).map(String) : [];\n const actual = orderedToolNames(ctx.spans);\n return isSubsequence(seq, actual)\n ? { type: a.type, verdict: \"pass\", actual }\n : { type: a.type, verdict: \"fail\", actual };\n }\n case \"latency_ms\": {\n if (ctx.durationMs == null)\n return { type: a.type, verdict: \"skip\", reason: \"durationMs unavailable\" };\n return applyOp(ctx.durationMs, (r.op as Op) ?? \"lte\", Number(r.value ?? 0))\n ? { type: a.type, verdict: \"pass\", actual: ctx.durationMs }\n : { type: a.type, verdict: \"fail\", actual: ctx.durationMs };\n }\n case \"semantic_match\": {\n if (!ctx.judgeSemanticMatch)\n return { type: a.type, verdict: \"skip\", reason: \"no judge (pass --llm)\" };\n if (!ctx.reference?.answer)\n return { type: a.type, verdict: \"skip\", reason: \"no reference.answer on case\" };\n const smv = await ctx.judgeSemanticMatch(\n String(r.question ?? \"\"),\n ctx.answer,\n ctx.reference.answer,\n );\n return { type: a.type, verdict: smv.verdict, actual: smv.reasoning };\n }\n default:\n return { type: a.type, verdict: \"skip\", reason: `unknown assertion type: ${a.type}` };\n }\n}\n\nexport interface RunEvalSetDeps {\n /** Run one query through the agent → answer + conversation id. */\n runQuery: (query: string) => Promise<{ answer: string; conversationId: string | null }>;\n /** Fetch the spans for a conversation (for assertion evaluation). */\n fetchSpans: (conversationId: string) => Promise<Span[]>;\n judgeSemanticMatch?: AssertionContext[\"judgeSemanticMatch\"];\n}\n\n/** Run an eval set: each case → agent run → trace → assertions. */\nexport async function runEvalSet(\n agentId: string,\n cases: EvalCase[],\n deps: RunEvalSetDeps,\n): Promise<EvalSetResult> {\n const results: CaseResult[] = [];\n for (const c of cases) {\n const query = c.input.user_message;\n let answer = \"\";\n let conversationId: string | null = null;\n let spans: Span[] = [];\n let errorCode: string | undefined;\n let chatFailed = false;\n try {\n const run = await deps.runQuery(query);\n answer = run.answer;\n conversationId = run.conversationId;\n if (conversationId) {\n try {\n spans = await deps.fetchSpans(conversationId);\n } catch {\n // Spans unavailable: span-based assertions will fail/skip, but\n // answer-only assertions (contains/regex/semantic_match) still run.\n errorCode = \"trace-fetch-failed\";\n }\n }\n } catch {\n chatFailed = true;\n errorCode = \"chat-failed\";\n }\n const assertionResults: AssertionResult[] = [];\n if (!chatFailed) {\n for (const a of c.assertions ?? []) {\n assertionResults.push(\n await evaluateAssertion(a, {\n answer,\n spans,\n reference: c.reference,\n judgeSemanticMatch: deps.judgeSemanticMatch,\n }),\n );\n }\n }\n results.push({\n queryId: c.query_id,\n query,\n answer,\n conversationId,\n assertions: assertionResults,\n ...(errorCode ? { errorCode } : {}),\n });\n }\n const flat = results.flatMap((r) => r.assertions);\n return {\n agentId,\n total: cases.length,\n passed: flat.filter((a) => a.verdict === \"pass\").length,\n failed: flat.filter((a) => a.verdict === \"fail\").length,\n skipped: flat.filter((a) => a.verdict === \"skip\").length,\n cases: results,\n };\n}\n","/** Trace resource surface (data fetch + symbolic/rubric diagnose + eval-set). */\nimport { fetchAgentInfo, sendChat } from \"../api/agent-chat.js\";\nimport { getRawSpansByConversation, getSpansByConversation, traceSearch } from \"../api/trace.js\";\nimport { claudeAvailable, judgeJson } from \"../trace-ai/claude-judge.js\";\nimport {\n BUILTIN_RULES,\n type DiagnoseReport,\n type Summary,\n assembleTraceTree,\n runRubric,\n runRules,\n synthesizeFindings,\n} from \"../trace-ai/diagnose.js\";\nimport {\n type EvalCase,\n type EvalSetResult,\n buildCasesFromQueries,\n runEvalSet,\n} from \"../trace-ai/eval-set.js\";\nimport type { RequestContext } from \"../types.js\";\n\nasync function semanticJudge(\n question: string,\n answer: string,\n reference: string,\n): Promise<{ verdict: \"pass\" | \"fail\"; reasoning: string }> {\n const prompt = [\n \"You judge whether an agent ANSWER semantically matches a REFERENCE answer.\",\n question ? `QUESTION/CRITERION: ${question}` : \"\",\n `ANSWER: ${answer}`,\n `REFERENCE: ${reference}`,\n 'Respond with ONLY JSON: {\"verdict\":\"pass|fail\",\"reasoning\":\"<one sentence>\"}',\n ]\n .filter(Boolean)\n .join(\"\\n\");\n const out = await judgeJson(prompt, { timeoutMs: 120_000 });\n return {\n verdict: out.verdict === \"pass\" ? \"pass\" : \"fail\",\n reasoning: typeof out.reasoning === \"string\" ? out.reasoning : \"\",\n };\n}\n\nexport function trace(ctx: RequestContext) {\n /**\n * Diagnose a conversation's primary trace. Symbolic rules always run; when\n * `llm` is set and a local `claude` CLI is available, gated rubric rules add\n * an LLM-judged second pillar + a synthesized summary (hybrid mode).\n */\n const diagnoseOne = async (\n conversationId: string,\n opts: { llm?: boolean; judgeTimeoutMs?: number } = {},\n ): Promise<DiagnoseReport> => {\n const { spans, traceIds } = await getRawSpansByConversation(ctx, conversationId);\n if (spans.length === 0) throw new Error(`No spans found for conversation: ${conversationId}`);\n const primaryTraceId = traceIds[0] ?? conversationId;\n const spansForPrimary =\n traceIds.length > 0 ? spans.filter((s) => !s.traceId || s.traceId === primaryTraceId) : spans;\n const tree = assembleTraceTree(primaryTraceId, spansForPrimary);\n const findings = runRules(tree);\n let mode: DiagnoseReport[\"mode\"] = \"symbolic-only\";\n let summary: Summary | undefined;\n if (opts.llm && claudeAvailable()) {\n const judge = (prompt: string) => judgeJson(prompt, { timeoutMs: opts.judgeTimeoutMs });\n const rubric = await runRubric(tree, findings, judge);\n findings.push(...rubric);\n summary = await synthesizeFindings(findings, judge);\n mode = \"hybrid\";\n }\n return {\n traceId: primaryTraceId,\n conversationId,\n diagnosedAt: null,\n mode,\n rulesApplied: BUILTIN_RULES.map((r) => r.id),\n findingCount: findings.length,\n ...(summary ? { summary } : {}),\n findings,\n };\n };\n\n return {\n /** Raw trace search (OpenSearch-style body). */\n search: (body: unknown) => traceSearch(ctx, body),\n /** All span source docs for a conversation. */\n spans: (conversationId: string, opts?: { maxTraceIds?: number; maxSpans?: number }) =>\n getSpansByConversation(ctx, conversationId, opts),\n diagnose: diagnoseOne,\n /**\n * Scan (batch-diagnose) several conversations and aggregate the findings:\n * per-trace reports + a recurring-rule tally across the batch.\n */\n scan: async (\n conversationIds: string[],\n opts: { llm?: boolean; judgeTimeoutMs?: number } = {},\n ) => {\n const reports = [];\n for (const id of conversationIds) {\n try {\n reports.push(await diagnoseOne(id, opts));\n } catch (e) {\n reports.push({\n conversationId: id,\n error: e instanceof Error ? e.message : String(e),\n });\n }\n }\n const byRule: Record<string, number> = {};\n let totalFindings = 0;\n for (const r of reports) {\n if (!(\"findings\" in r)) continue;\n for (const f of r.findings) {\n byRule[f.ruleId] = (byRule[f.ruleId] ?? 0) + 1;\n totalFindings += 1;\n }\n }\n return {\n scanned: conversationIds.length,\n totalFindings,\n recurringRules: Object.entries(byRule)\n .sort((a, b) => b[1] - a[1])\n .map(([ruleId, count]) => ({ ruleId, count })),\n reports,\n };\n },\n /** Build eval cases from a loosely-shaped queries object/array. */\n evalSetBuild: (raw: unknown): EvalCase[] => buildCasesFromQueries(raw),\n /**\n * Run an eval set against an agent: each case's query is sent to the agent,\n * the resulting trace is fetched, and assertions are checked. `llm` enables\n * `semantic_match` assertions via the local claude judge.\n */\n evalSetTest: async (\n agentId: string,\n cases: EvalCase[],\n opts: { version?: string; llm?: boolean } = {},\n ): Promise<EvalSetResult> => {\n const info = await fetchAgentInfo(ctx, agentId, opts.version ?? \"v0\");\n return runEvalSet(agentId, cases, {\n runQuery: async (query) => {\n const res = await sendChat(ctx, info, query, {});\n return { answer: res.text, conversationId: res.conversationId ?? null };\n },\n fetchSpans: async (conversationId) => {\n const { spans, traceIds } = await getRawSpansByConversation(ctx, conversationId);\n const primary = traceIds[0] ?? conversationId;\n return assembleTraceTree(\n primary,\n traceIds.length > 0 ? spans.filter((s) => !s.traceId || s.traceId === primary) : spans,\n ).spans;\n },\n judgeSemanticMatch: opts.llm && claudeAvailable() ? semanticJudge : undefined,\n });\n },\n };\n}\n","import {\n type BuildTask,\n type CreateBuildTaskRequest,\n type CreateCatalogRequest,\n type ListCatalogsOptions,\n catalogHealthStatus,\n createBuildTask,\n createCatalog,\n discoverCatalog,\n enableCatalog,\n getBuildTask,\n getCatalog,\n getConnectorType,\n listCatalogResources,\n listCatalogs,\n listConnectorTypes,\n} from \"../api/vega.js\";\n/**\n * Vega resource surface — the exported SDK API for Catalog + index builds.\n * Knows nothing about argv or stdout; pure typed functions over `api/vega`.\n */\nimport type { RequestContext } from \"../types.js\";\n\nconst TERMINAL_STATES = new Set([\"completed\", \"success\", \"failed\", \"stopped\", \"error\"]);\n\nexport function vega(ctx: RequestContext) {\n return {\n catalogs: (opts?: ListCatalogsOptions) => listCatalogs(ctx, opts),\n getCatalog: (id: string) => getCatalog(ctx, id),\n createCatalog: (req: CreateCatalogRequest) => createCatalog(ctx, req),\n enableCatalog: (id: string) => enableCatalog(ctx, id),\n discoverCatalog: (id: string, wait = false) => discoverCatalog(ctx, id, wait),\n catalogResources: (id: string, category?: string) => listCatalogResources(ctx, id, category),\n catalogHealth: (ids: string[]) => catalogHealthStatus(ctx, ids),\n connectorTypes: () => listConnectorTypes(ctx),\n connectorType: (type: string) => getConnectorType(ctx, type),\n\n /** Build a resource's index. With `wait`, polls until terminal. */\n build: async (\n req: CreateBuildTaskRequest,\n opts: { wait?: boolean; timeoutMs?: number; intervalMs?: number } = {},\n ): Promise<BuildTask> => {\n const task = await createBuildTask(ctx, req);\n if (!opts.wait) return task;\n return pollBuildTask(ctx, task.id, opts.timeoutMs ?? 300_000, opts.intervalMs ?? 2_000);\n },\n\n buildStatus: (taskId: string) => getBuildTask(ctx, taskId),\n };\n}\n\nasync function pollBuildTask(\n ctx: RequestContext,\n taskId: string,\n timeoutMs: number,\n intervalMs: number,\n): Promise<BuildTask> {\n const deadline = Date.now() + timeoutMs;\n const terminal = (t: BuildTask) => TERMINAL_STATES.has((t.status ?? t.state ?? \"\").toLowerCase());\n let last = await getBuildTask(ctx, taskId);\n while (!terminal(last) && Date.now() < deadline) {\n await sleep(intervalMs);\n last = await getBuildTask(ctx, taskId);\n }\n return last;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","/**\n * Raw API passthrough — the `call`/`curl` escape hatch. Builds a request with\n * auth headers injected and returns the raw response (status + body), WITHOUT\n * throwing on non-2xx (the caller decides). Pure helpers are unit-tested.\n */\nimport { readFileSync } from \"node:fs\";\nimport type { RequestContext } from \"../types.js\";\nimport { buildHeaders } from \"./headers.js\";\nimport { applyTls } from \"./tls.js\";\n\nexport interface RawCallOptions {\n method?: string;\n /** Extra headers as raw \"Name: value\" strings. */\n header?: string[];\n /** Raw request body (string). Mutually exclusive with `form`. */\n data?: string;\n /** Multipart fields: \"key=value\" or \"key=@/path/to/file\". */\n form?: string[];\n /** Override business domain for this call. */\n businessDomain?: string;\n verbose?: boolean;\n timeoutMs?: number;\n}\n\nexport interface RawCallResult {\n status: number;\n statusText: string;\n body: string;\n}\n\n/** Parse a single `Name: value` header string. Returns null if malformed. */\nexport function parseHeader(raw: string): [string, string] | null {\n const idx = raw.indexOf(\":\");\n if (idx <= 0) return null;\n return [raw.slice(0, idx).trim(), raw.slice(idx + 1).trim()];\n}\n\n/** Parse a `-F key=value` / `key=@file` field into [key, value, isFile]. */\nexport function parseFormField(raw: string): [string, string, boolean] {\n const idx = raw.indexOf(\"=\");\n if (idx < 0) throw new Error(`Invalid form field (expected key=value): ${raw}`);\n const key = raw.slice(0, idx);\n const value = raw.slice(idx + 1);\n if (value.startsWith(\"@\")) return [key, value.slice(1), true];\n return [key, value, false];\n}\n\nfunction resolveUrl(ctx: RequestContext, path: string): string {\n return path.startsWith(\"http\") ? path : `${ctx.baseUrl}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n}\n\nexport async function rawCall(\n ctx: RequestContext,\n path: string,\n opts: RawCallOptions = {},\n): Promise<RawCallResult> {\n applyTls(ctx);\n const url = resolveUrl(ctx, path);\n const extra: Record<string, string> = {};\n for (const h of opts.header ?? []) {\n const parsed = parseHeader(h);\n if (parsed) extra[parsed[0].toLowerCase()] = parsed[1];\n }\n\n let body: string | FormData | undefined;\n if (opts.form && opts.form.length > 0) {\n const fd = new FormData();\n for (const field of opts.form) {\n const [key, value, isFile] = parseFormField(field);\n if (isFile) fd.append(key, new Blob([readFileSync(value)]), value.split(\"/\").pop());\n else fd.append(key, value);\n }\n body = fd; // fetch sets the multipart content-type + boundary\n } else if (opts.data !== undefined) {\n body = opts.data;\n if (!extra[\"content-type\"]) extra[\"content-type\"] = \"application/json\";\n }\n\n const method = opts.method ?? (body !== undefined ? \"POST\" : \"GET\");\n const headers = buildHeaders(\n { ...ctx, businessDomain: opts.businessDomain ?? ctx.businessDomain },\n extra,\n );\n\n if (opts.verbose) process.stderr.write(`> ${method} ${url}\\n`);\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), opts.timeoutMs ?? 30_000);\n try {\n const res = await fetch(url, { method, headers, body, signal: controller.signal });\n return { status: res.status, statusText: res.statusText, body: await res.text() };\n } finally {\n clearTimeout(timer);\n }\n}\n","import { type RawCallOptions, type RawCallResult, rawCall } from \"./api/call.js\";\nimport { resolveContext } from \"./config/resolve.js\";\nimport { admin } from \"./resources/admin.js\";\nimport { agents } from \"./resources/agents.js\";\nimport { context } from \"./resources/context-loader.js\";\nimport { dataflows } from \"./resources/dataflows.js\";\nimport { kn } from \"./resources/knowledge-networks.js\";\nimport { models } from \"./resources/models.js\";\nimport { resources } from \"./resources/resources.js\";\nimport { skills } from \"./resources/skills.js\";\nimport { toolboxes } from \"./resources/toolboxes.js\";\nimport { trace } from \"./resources/trace.js\";\nimport { vega } from \"./resources/vega.js\";\n/**\n * createClient — the primary entry for SDK consumers.\n *\n * import { createClient } from \"@openbkn/bkn-sdk\";\n * const bkn = createClient({ baseUrl, token });\n * const task = await bkn.vega.build({ resource_id, mode: \"batch\" }, { wait: true });\n *\n * Resolving the context here (not at import) keeps `import` side-effect free.\n */\nimport type { ClientOptions, RequestContext } from \"./types.js\";\n\nexport interface BknClient {\n readonly ctx: RequestContext;\n readonly kn: ReturnType<typeof kn>;\n readonly resource: ReturnType<typeof resources>;\n readonly dataflows: ReturnType<typeof dataflows>;\n readonly agents: ReturnType<typeof agents>;\n readonly context: ReturnType<typeof context>;\n readonly models: ReturnType<typeof models>;\n readonly skills: ReturnType<typeof skills>;\n readonly toolboxes: ReturnType<typeof toolboxes>;\n readonly trace: ReturnType<typeof trace>;\n readonly admin: ReturnType<typeof admin>;\n readonly vega: ReturnType<typeof vega>;\n /** Raw API passthrough (the `call` escape hatch). */\n call(path: string, opts?: RawCallOptions): Promise<RawCallResult>;\n}\n\nexport function createClient(opts: ClientOptions = {}): BknClient {\n const ctx = resolveContext(opts);\n return {\n ctx,\n kn: kn(ctx),\n resource: resources(ctx),\n dataflows: dataflows(ctx),\n agents: agents(ctx),\n context: context(ctx),\n models: models(ctx),\n skills: skills(ctx),\n toolboxes: toolboxes(ctx),\n trace: trace(ctx),\n admin: admin(ctx),\n vega: vega(ctx),\n call: (path, callOpts) => rawCall(ctx, path, callOpts),\n };\n}\n","/**\n * Auth resource — credential store + identity (multi-user, store-backed).\n * Interactive browser/password OAuth lives in `auth/oauth.ts` and is persisted\n * here via `attachToken`.\n */\nimport { type JwtClaims, decodeJwt, isExpired } from \"../auth/jwt.js\";\nimport {\n type PlatformUser,\n type TokenConfig,\n activePlatform,\n activeUserId,\n deleteToken,\n listPlatforms as listStored,\n readToken,\n setActivePlatform,\n setActiveUser,\n userIdFromToken,\n writeToken,\n} from \"../config/store.js\";\nimport { InputError } from \"../utils/errors.js\";\n\nexport function hostOf(baseUrl: string): string {\n try {\n return new URL(baseUrl).host;\n } catch {\n return baseUrl;\n }\n}\n\nfunction normalize(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, \"\");\n}\n\nfunction usernameOf(token: TokenConfig | undefined): string | undefined {\n if (!token) return undefined;\n const claims = decodeJwt(token.accessToken);\n return (\n token.username ?? token.displayName ?? claims?.preferred_username ?? claims?.name ?? claims?.sub\n );\n}\n\n/** Save a token (under its derived user) and make it the active platform/user. */\nexport function attachToken(\n baseUrl: string,\n accessToken: string,\n opts: { refreshToken?: string; idToken?: string; insecure?: boolean } = {},\n): { baseUrl: string; userId: string; username?: string } {\n const url = normalize(baseUrl);\n const token: TokenConfig = {\n baseUrl: url,\n accessToken,\n refreshToken: opts.refreshToken,\n idToken: opts.idToken,\n tlsInsecure: opts.insecure,\n username: decodeJwt(opts.idToken ?? accessToken)?.preferred_username,\n };\n const userId = writeToken(url, token); // also sets active user\n setActivePlatform(url);\n return { baseUrl: url, userId, username: usernameOf(token) };\n}\n\nexport interface AuthStatus {\n baseUrl?: string;\n userId?: string;\n hasToken: boolean;\n username?: string;\n expired?: boolean;\n}\n\nexport function status(): AuthStatus {\n const baseUrl = activePlatform();\n if (!baseUrl) return { hasToken: false };\n const token = readToken(baseUrl);\n return {\n baseUrl,\n userId: activeUserId(baseUrl),\n hasToken: token !== undefined,\n username: usernameOf(token),\n expired: token ? isExpired(decodeJwt(token.accessToken)) : undefined,\n };\n}\n\nexport function currentToken(): string {\n const baseUrl = activePlatform();\n const token = baseUrl ? readToken(baseUrl) : undefined;\n if (!token) throw new InputError(\"Not logged in. Run `openbkn auth login <url> --token <t>`.\");\n return token.accessToken;\n}\n\nexport function whoami(): JwtClaims {\n const baseUrl = activePlatform();\n const token = baseUrl ? readToken(baseUrl) : undefined;\n // The access token may be Ory-opaque; the id_token carries the JWT identity.\n const claims = decodeJwt(token?.idToken ?? \"\") ?? decodeJwt(token?.accessToken ?? \"\");\n if (!claims) {\n throw new InputError(\n \"No decodable identity (token is opaque and no id_token saved). Use `auth status`.\",\n );\n }\n return claims;\n}\n\nexport interface PlatformListItem {\n baseUrl: string;\n userId: string;\n username?: string;\n active: boolean;\n}\n\n/** Flat list of platform/user pairs with a saved session. */\nexport function listPlatforms(): PlatformListItem[] {\n const current = activePlatform();\n return listStored().flatMap((p) =>\n p.users.map((u) => ({\n baseUrl: p.baseUrl,\n userId: u.userId,\n username: u.username ?? u.displayName,\n active: p.baseUrl === current && u.userId === p.activeUserId,\n })),\n );\n}\n\n/** Switch the active platform (must already have a saved token). */\nexport function use(baseUrl: string): void {\n const url = normalize(baseUrl);\n if (!readToken(url)) {\n throw new InputError(`No saved credentials for ${url}. Run \\`openbkn auth login\\` first.`);\n }\n setActivePlatform(url);\n}\n\nexport function logout(): boolean {\n const baseUrl = activePlatform();\n return baseUrl ? deleteToken(baseUrl) : false;\n}\n\nexport function deletePlatform(baseUrl: string, userId?: string): boolean {\n return deleteToken(normalize(baseUrl), userId);\n}\n\n/** Switch the active user for a platform (token must already be saved). */\nexport function switchUser(baseUrl: string, userId: string): { baseUrl: string; userId: string } {\n const url = normalize(baseUrl);\n if (!readToken(url, userId)) {\n throw new InputError(`No saved token for user '${userId}' on ${url}.`);\n }\n setActiveUser(url, userId);\n setActivePlatform(url);\n return { baseUrl: url, userId };\n}\n\n/** List saved user profiles for one platform. */\nexport function usersOf(baseUrl: string): PlatformUser[] {\n const url = normalize(baseUrl);\n return listStored().find((p) => p.baseUrl === url)?.users ?? [];\n}\n\n/** Export the active session's tokens (for seeding a headless host). */\nexport function exportCreds(): {\n baseUrl: string;\n accessToken: string;\n refreshToken?: string;\n idToken?: string;\n} {\n const baseUrl = activePlatform();\n if (!baseUrl) throw new InputError(\"No active platform. Run `openbkn auth login` first.\");\n const token = readToken(baseUrl);\n if (!token) throw new InputError(`No saved token for ${baseUrl}.`);\n return {\n baseUrl,\n accessToken: token.accessToken,\n refreshToken: token.refreshToken,\n idToken: token.idToken,\n };\n}\n\nexport { userIdFromToken };\n"],"mappings":";;;;;;;AAsBO,IAAM,0BAA0B;AAGhC,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;;;ACvB5B,IAAM,YAAN,cAAwB,MAAM;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAYA,SAAgB,YAAoB,MAAc;AAC5D,UAAM,QAAQA,OAAM,IAAI,UAAU,EAAE;AACpC,SAAK,OAAO;AACZ,SAAK,SAASA;AACd,SAAK,aAAa;AAClB,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,aAAN,cAAyB,MAAM;AAAA,EACpC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAGO,SAAS,WAAW,KAAsB;AAC/C,MAAI,eAAe,WAAY,QAAO;AACtC,MAAI,eAAe,WAAW;AAC5B,QAAI,IAAI,WAAW,OAAO,IAAI,WAAW,IAAK,QAAO;AACrD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,SAAS,YAAY,KAAsB;AAChD,MAAI,eAAe,WAAW;AAC5B,QAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;AAC5C,aAAO,wBAAwB,IAAI,MAAM;AAAA,IAC3C;AACA,UAAM,SAAS,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,GAAG,CAAC,KAAK;AAC3D,WAAO,wBAAwB,IAAI,MAAM,IAAI,IAAI,UAAU,IAAI,MAAM;AAAA,EACvE;AACA,MAAI,eAAe,OAAO;AAExB,UAAM,QAAS,IAA4B;AAG3C,QAAI,OAAO,QAAQ,eAAe,MAAM,IAAI,GAAG;AAC7C,aAAO,6BAA6B,MAAM,IAAI;AAAA,IAChD;AACA,QAAI,IAAI,YAAY,kBAAkB,OAAO,SAAS;AACpD,aAAO,mBAAmB,MAAM,OAAO,GAAG,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM,EAAE;AAAA,IAChF;AACA,WAAO,IAAI;AAAA,EACb;AACA,SAAO,OAAO,GAAG;AACnB;AAEA,SAAS,eAAe,MAAuB;AAC7C,SACE,SAAS,iCACT,SAAS,+BACT,SAAS,qCACT,SAAS,sBACT,KAAK,SAAS,MAAM;AAExB;AAEA,SAAS,SAAS,GAAW,GAAmB;AAC9C,SAAO,EAAE,SAAS,IAAI,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,WAAM;AAC9C;;;AC1DA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,eAAe;AACxB,SAAS,YAAY;;;ACVd,SAAS,UAAU,OAAsC;AAC9D,QAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,MAAI,MAAM,SAAS,KAAK,CAAC,MAAM,CAAC,EAAG,QAAO;AAC1C,MAAI;AACF,UAAM,OAAO,OAAO,KAAK,MAAM,CAAC,GAAG,WAAW,EAAE,SAAS,MAAM;AAC/D,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,UAAU,QAA+B,QAAQ,KAAK,IAAI,GAAY;AACpF,SAAO,QAAQ,QAAQ,UAAa,OAAO,MAAM,MAAO;AAC1D;;;ADwBA,IAAM,aAAa;AACnB,IAAM,SAAS,QAAQ,aAAa;AAE7B,SAAS,YAAoB;AAClC,SAAO,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,GAAG,MAAM;AAC7D;AAEA,SAAS,cAA6B;AACpC,QAAM,MAAM,QAAQ,IAAI,aAAa,KAAK;AAC1C,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,CAAC,WAAW,KAAK,GAAG,GAAG;AACzB,UAAM,IAAI,MAAM,gBAAgB,GAAG,kDAAkD;AAAA,EACvF;AACA,SAAO;AACT;AAEA,SAAS,YAAoB;AAC3B,QAAM,UAAU,YAAY;AAC5B,SAAO,UACH,KAAK,UAAU,GAAG,YAAY,SAAS,YAAY,IACnD,KAAK,UAAU,GAAG,YAAY;AACpC;AAEA,SAAS,UAAU,SAAyB;AAC1C,SAAO,OAAO,KAAK,SAAS,MAAM,EAC/B,SAAS,QAAQ,EACjB,QAAQ,OAAO,GAAG,EAClB,QAAQ,OAAO,GAAG,EAClB,QAAQ,QAAQ,EAAE;AACvB;AAEA,SAAS,YAAY,SAAyB;AAC5C,SAAO,KAAK,UAAU,GAAG,aAAa,UAAU,OAAO,CAAC;AAC1D;AAEA,SAAS,QAAQ,SAAiB,QAAwB;AACxD,SAAO,KAAK,YAAY,OAAO,GAAG,SAAS,MAAM;AACnD;AAGO,SAAS,gBAAgB,OAA4B;AAC1D,SAAO,UAAU,MAAM,WAAW,EAAE,GAAG,OAAO,UAAU,MAAM,WAAW,GAAG,OAAO;AACrF;AAIA,SAAS,YAAwB;AAC/B,SAAO,SAAqB,UAAU,CAAC,KAAK,CAAC;AAC/C;AAEA,SAAS,WAAW,OAAyB;AAC3C,YAAU,UAAU,GAAG,KAAK;AAC9B;AAEO,SAAS,iBAAqC;AACnD,SAAO,UAAU,EAAE;AACrB;AAEO,SAAS,kBAAkB,SAAuB;AACvD,aAAW,EAAE,GAAG,UAAU,GAAG,iBAAiB,QAAQ,CAAC;AACzD;AAEO,SAAS,aAAa,SAAqC;AAChE,SAAO,UAAU,EAAE,cAAc,OAAO;AAC1C;AAEO,SAAS,cAAc,SAAiB,QAAsB;AACnE,QAAM,QAAQ,UAAU;AACxB,aAAW,EAAE,GAAG,OAAO,aAAa,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC;AACnF;AAKO,SAAS,UACd,SACA,SAAS,aAAa,OAAO,GACJ;AACzB,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,SAAsB,KAAK,QAAQ,SAAS,MAAM,GAAG,YAAY,CAAC,KAAK;AAChF;AAGO,SAAS,WAAW,SAAiB,OAA4B;AACtE,QAAM,SAAS,gBAAgB,KAAK;AACpC,YAAU,KAAK,QAAQ,SAAS,MAAM,GAAG,YAAY,GAAG,OAAO,GAAK;AACpE,gBAAc,SAAS,MAAM;AAC7B,SAAO;AACT;AAEO,SAAS,YAAY,SAAiB,SAAS,aAAa,OAAO,GAAY;AACpF,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,OAAO,KAAK,QAAQ,SAAS,MAAM,GAAG,YAAY;AACxD,MAAI,CAAC,WAAW,IAAI,EAAG,QAAO;AAC9B,SAAO,MAAM,EAAE,OAAO,KAAK,CAAC;AAC5B,SAAO;AACT;AAIO,SAAS,mBACd,SACA,SAAS,aAAa,OAAO,GACb;AAChB,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,SAAO,SAAyB,KAAK,QAAQ,SAAS,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC;AACrF;AAEO,SAAS,oBAAoB,SAAiB,QAA8B;AACjF,QAAM,SAAS,aAAa,OAAO,KAAK;AACxC,YAAU,KAAK,QAAQ,SAAS,MAAM,GAAG,aAAa,GAAG,MAAM;AACjE;AAiBO,SAAS,gBAAiC;AAC/C,QAAM,OAAO,KAAK,UAAU,GAAG,WAAW;AAC1C,MAAI,CAAC,WAAW,IAAI,EAAG,QAAO,CAAC;AAC/B,QAAM,QAAQ,UAAU;AACxB,QAAM,MAAuB,CAAC;AAC9B,aAAW,OAAO,YAAY,IAAI,GAAG;AACnC,UAAM,UAAU,UAAU,GAAG;AAC7B,QAAI,CAAC,QAAS;AACd,UAAM,YAAY,KAAK,MAAM,KAAK,OAAO;AACzC,QAAI,CAAC,WAAW,SAAS,EAAG;AAC5B,UAAM,QAAwB,CAAC;AAC/B,eAAW,UAAU,YAAY,SAAS,GAAG;AAC3C,YAAM,QAAQ,SAAsB,KAAK,WAAW,QAAQ,YAAY,CAAC;AACzE,UAAI,MAAO,OAAM,KAAK,EAAE,QAAQ,UAAU,MAAM,UAAU,aAAa,MAAM,YAAY,CAAC;AAAA,IAC5F;AACA,QAAI,MAAM,SAAS,GAAG;AACpB,UAAI,KAAK,EAAE,SAAS,OAAO,cAAc,MAAM,cAAc,OAAO,EAAE,CAAC;AAAA,IACzE;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,KAA4B;AAC7C,MAAI;AACF,UAAM,MAAM,IAAI,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AACpD,WAAO,OAAO,KAAK,KAAK,QAAQ,EAAE,SAAS,MAAM;AAAA,EACnD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAIA,SAAS,SAAY,MAA6B;AAChD,MAAI,CAAC,WAAW,IAAI,EAAG,QAAO;AAC9B,MAAI;AACF,WAAO,KAAK,MAAM,aAAa,MAAM,MAAM,CAAC;AAAA,EAC9C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,MAAc,OAAgB,OAAO,KAAa;AACnE,QAAM,MAAM,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,CAAC,KAAK;AACpD,YAAU,KAAK,EAAE,WAAW,MAAM,GAAI,SAAS,CAAC,IAAI,EAAE,MAAM,IAAM,EAAG,CAAC;AACtE,gBAAc,MAAM,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC;AACjF,MAAI,CAAC,OAAQ,WAAU,MAAM,IAAI;AACnC;;;AE1NO,SAAS,eAAe,OAAsB,CAAC,GAAmB;AACvE,QAAM,UAAU,KAAK,WAAW,QAAQ,IAAI,gBAAgB,eAAe;AAC3E,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,aAAa,QAAQ,QAAQ,QAAQ,EAAE;AAE7C,QAAM,SAAS,UAAU,UAAU;AACnC,QAAM,QAAQ,KAAK,SAAS,QAAQ,IAAI,aAAa,QAAQ;AAC7D,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,WAAW,6DAA6D;AAAA,EACpF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,gBACE,KAAK,kBACL,mBAAmB,UAAU,EAAE,kBAC/B;AAAA,IACF,UAAU,KAAK,YAAY,QAAQ,eAAe;AAAA,EACpD;AACF;;;AC9BO,SAAS,aACd,KACA,OACwB;AACxB,SAAO;AAAA,IACL,eAAe,UAAU,IAAI,KAAK;AAAA,IAClC,OAAO,IAAI;AAAA,IACX,qBAAqB,IAAI;AAAA,IACzB,GAAG;AAAA,EACL;AACF;;;ACEO,SAAS,SAAS,KAA2B;AAClD,MAAI,IAAI,YAAY,QAAQ,IAAI,iCAAiC,KAAK;AACpE,YAAQ,IAAI,+BAA+B;AAAA,EAC7C;AACF;;;ACCA,IAAM,qBAAqB;AAE3B,eAAsB,QACpB,KACA,MACA,OAAsB,CAAC,GACX;AACZ,QAAM,MAAM,IAAI,IAAI,KAAK,WAAW,MAAM,IAAI,OAAO,GAAG,IAAI,OAAO,GAAG,IAAI,EAAE;AAC5E,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,GAAG;AACrD,QAAI,MAAM,OAAW,KAAI,aAAa,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,EACxD;AAEA,WAAS,GAAG;AACZ,QAAM,UAAU,KAAK,SAAS;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,aAAa,kBAAkB;AAEvF,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,KAAK;AAAA,MAC3B,QAAQ,KAAK,WAAW,UAAU,SAAS;AAAA,MAC3C,SAAS,aAAa,KAAK;AAAA,QACzB,GAAI,UAAU,EAAE,gBAAgB,mBAAmB,IAAI,CAAC;AAAA,QACxD,GAAG,KAAK;AAAA,MACV,CAAC;AAAA,MACD,MAAM,UAAU,KAAK,UAAU,KAAK,IAAI,IAAI;AAAA,MAC5C,QAAQ,WAAW;AAAA,IACrB,CAAC;AAED,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,UAAU,IAAI,QAAQ,IAAI,YAAY,IAAI;AACjE,WAAQ,OAAO,KAAK,MAAM,IAAI,IAAI;AAAA,EACpC,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;;;AC9CA;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,IAAM,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBvC,IAAI;AACJ,SAAS,YAAuB;AAC9B,MAAI,CAAC,UAAW,aAAY,gBAAgB,iBAAiB,8BAA8B,CAAC;AAC5F,SAAO;AACT;AAGO,SAAS,iBAAiB,OAAuB;AACtD,QAAM,MAAM;AAAA,IACV,EAAE,KAAK,UAAU,GAAG,SAAS,UAAU,kBAAkB;AAAA,IACzD,OAAO,KAAK,OAAO,MAAM;AAAA,EAC3B;AACA,SAAO,IAAI,SAAS,QAAQ;AAC9B;;;ACjCA,IAAM,KAAK;AACX,IAAM,QAAQ;AACd,IAAM,SAAS;AAOf,eAAe,aAAa,KAAsC;AAChE,QAAM,MAAM,UAAU,IAAI,KAAK,GAAG;AAClC,MAAI,IAAK,QAAO;AAChB,QAAM,OAAQ,MAAM,QAAQ,KAAK,uBAAuB;AACxD,MAAI,MAAM,OAAQ,QAAO,KAAK;AAC9B,QAAM,IAAI;AAAA,IACR;AAAA,EAEF;AACF;AAOA,eAAe,UACb,KACA,QACA,SAAoB,CAAC,GACH;AAClB,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK,GAAG,MAAM,IAAI,MAAM,IAAI,EAAE,QAAQ,QAAQ,MAAM,OAAO,CAAC;AAAA,EACnF,SAAS,GAAG;AACV,QAAI,aAAa,WAAW;AAC1B,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,EAAE,IAAI;AAChC,cAAM,MAAM,QAAQ;AACpB,YAAI,KAAK,QAAQ;AACf,gBAAM,IAAI,IAAI,UAAU,SAAY,GAAG,IAAI,MAAM,WAAW,IAAI,KAAK,MAAM,IAAI;AAC/E,gBAAM,IAAI,MAAM,aAAa,MAAM,YAAY,CAAC,EAAE;AAAA,QACpD;AAAA,MACF,SAAS,OAAO;AACd,YAAI,iBAAiB,SAAS,MAAM,QAAQ,WAAW,YAAY,EAAG,OAAM;AAAA,MAC9E;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAEA,IAAM,cAAc;AACpB,IAAM,cAAc;AAWb,SAAS,gBACd,KACA,OAAyB,CAAC,GACR;AAClB,SAAO,QAAQ,KAAK,GAAG,EAAE,+BAA+B,WAAW,IAAI;AAAA,IACrE,OAAO;AAAA,MACL,MAAM,KAAK,QAAQ;AAAA,MACnB,QAAQ,KAAK,UAAU;AAAA,MACvB,OAAO,KAAK,SAAS;AAAA,MACrB,MAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AASA,eAAsB,mBACpB,KACA,OAAO,eACP,WAAW,KACW;AACtB,QAAM,MAAmB,CAAC;AAC1B,MAAI,SAAS;AACb,aAAS;AACP,UAAM,OAAQ,MAAM,gBAAgB,KAAK,EAAE,MAAM,QAAQ,OAAO,SAAS,CAAC;AAI1E,UAAM,UAAU,KAAK,WAAW,CAAC;AACjC,QAAI,KAAK,GAAG,OAAO;AACnB,QAAI,QAAQ,SAAS,SAAU;AAC/B,QAAI,KAAK,gBAAgB,UAAa,IAAI,UAAU,KAAK,YAAa;AACtE,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAGO,SAAS,UAAU,KAAqB,OAAyB,CAAC,GAAqB;AAC5F,SAAO,QAAQ,KAAK,GAAG,EAAE,yBAAyB,WAAW,IAAI;AAAA,IAC/D,OAAO;AAAA,MACL,MAAM,KAAK,QAAQ;AAAA,MACnB,QAAQ,KAAK,UAAU;AAAA,MACvB,OAAO,KAAK,SAAS;AAAA,MACrB,eAAe,KAAK,SAAS;AAAA,MAC7B,MAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAQO,SAAS,UAAU,KAAqB,OAAyB,CAAC,GAAqB;AAC5F,SAAO,QAAQ,KAAK,GAAG,KAAK,UAAU;AAAA,IACpC,OAAO;AAAA,MACL,QAAQ,KAAK,UAAU;AAAA,MACvB,OAAO,KAAK,SAAS;AAAA,MACrB,SAAS,KAAK,WAAW;AAAA,IAC3B;AAAA,EACF,CAAC;AACH;AAEO,SAAS,QAAQ,KAAqB,QAAkC;AAC7E,SAAO,QAAQ,KAAK,GAAG,KAAK,UAAU,mBAAmB,MAAM,CAAC,EAAE;AACpE;AAOO,SAAS,QAAQ,KAAqB,QAAkC;AAC7E,SAAO,UAAU,KAAK,oBAAoB,CAAC,MAAM,CAAC;AACpD;AAOA,eAAsB,aAAa,KAAqB,QAAkC;AACxF,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK,GAAG,KAAK,mBAAmB;AAAA,MACnD,OAAO,EAAE,aAAa,QAAQ,eAAe,OAAO;AAAA,IACtD,CAAC;AAAA,EACH,SAAS,GAAG;AACV,QAAI,EAAE,aAAa,cAAc,EAAE,WAAW,IAAK,OAAM;AACzD,UAAM,YAAa,MAAM,UAAU,KAAK,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC;AAGjE,UAAM,QAAQ,UAAU,WAAW,CAAC;AACpC,UAAM,UAAsE,CAAC;AAC7E,UAAM,QAAQ;AAAA,MACZ,MAAM,IAAI,OAAO,SAAS;AACxB,cAAM,UAAW,MAAM,gBAAgB,KAAK,KAAK,IAAI,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC;AAG9E,aACG,QAAQ,WAAW,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,OAAO,GACrF;AACA,kBAAQ,KAAK,IAAI;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa,QAAQ;AAAA,MACrB,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAQA,eAAsB,cAAc,KAAqB,QAAkC;AACzF,MAAI;AACF,WAAO,MAAM,UAAU,KAAK,6BAA6B,CAAC,MAAM,CAAC;AAAA,EACnE,SAAS,GAAG;AACV,UAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,QAAI,CAAC,8DAA8D,KAAK,GAAG,EAAG,OAAM;AACpF,WAAO,UAAU,KAAK,0BAA0B,CAAC,MAAM,CAAC;AAAA,EAC1D;AACF;AAGO,SAAS,qBACd,KACA,QACA,OAA2D,CAAC,GAC1C;AAClB,SAAO,QAAQ,KAAK,GAAG,EAAE,uBAAuB,mBAAmB,MAAM,CAAC,UAAU;AAAA,IAClF,OAAO,EAAE,MAAM,KAAK,QAAQ,eAAe,QAAQ,KAAK,UAAU,GAAG,OAAO,KAAK,SAAS,IAAI;AAAA,EAChG,CAAC;AACH;AAeA,eAAsB,iBACpB,KACA,OACkB;AAClB,QAAM,oBAAoB;AAAA,IACxB,UAAU,MAAM,YAAY;AAAA,IAC5B,YAAY,MAAM;AAAA,IAClB,WAAW,MAAM,aAAa;AAAA,IAC9B,MAAM,MAAM,QAAQ;AAAA,IACpB,QAAQ,MAAM,UAAU;AAAA,IACxB,QAAQ,MAAM,UAAU;AAAA,IACxB,OAAO,MAAM,SAAS;AAAA,IACtB,OAAO;AAAA,EACT;AACA,QAAM,KAAK,MAAM,UAAU,KAAK,sBAAsB,CAAC,EAAE,kBAAkB,CAAC,CAAC;AAC7E,SAAO,EAAE,GAAG;AACd;AAYA,eAAsB,iBACpB,KACA,QACA,OACkB;AAClB,QAAM,IAA6B,EAAE,UAAU,OAAO;AACtD,MAAI,MAAM,SAAS,OAAW,GAAE,aAAa,MAAM;AACnD,MAAI,MAAM,cAAc,OAAW,GAAE,YAAY,MAAM;AACvD,MAAI,MAAM,SAAS,OAAW,GAAE,OAAO,MAAM;AAC7C,MAAI,MAAM,WAAW,OAAW,GAAE,SAAS,MAAM;AACjD,MAAI,MAAM,WAAW,OAAW,GAAE,SAAS,MAAM;AACjD,MAAI,MAAM,UAAU,OAAW,GAAE,QAAQ,MAAM;AAC/C,QAAM,UAAU,KAAK,uBAAuB,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC;AACvE,SAAO,EAAE,IAAI,QAAQ,SAAS,KAAK;AACrC;AAGA,eAAsB,iBAAiB,KAAqB,QAAkC;AAC5F,QAAM,QAAQ,KAAK,GAAG,EAAE,2BAA2B,mBAAmB,MAAM,CAAC,IAAI;AAAA,IAC/E,QAAQ;AAAA,EACV,CAAC;AACD,SAAO,EAAE,IAAI,QAAQ,SAAS,KAAK;AACrC;AAsBA,eAAsB,WAAW,KAAqB,OAA0C;AAC9F,QAAM,kBAA2C;AAAA,IAC/C,WAAW,MAAM;AAAA,IACjB,aAAa,MAAM,eAAe,MAAM;AAAA,IACxC,MAAM,MAAM,QAAQ;AAAA,IACpB,UAAU,MAAM,YAAY;AAAA,IAC5B,WAAW;AAAA,IACX,oBAAoB;AAAA,IACpB,QAAQ,MAAM,UAAU;AAAA,IACxB,OAAO,MAAM,SAAS;AAAA,IACtB,WAAW,MAAM,aAAa;AAAA,IAC9B,cAAc;AAAA,IACd,eAAe,MAAM,iBAAiB,CAAC,IAAI;AAAA,IAC3C,UAAU,MAAM,YAAY;AAAA,IAC5B,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AACA,MAAI,MAAM,aAAa,OAAW,iBAAgB,WAAW,MAAM;AACnE,QAAM,KAAK,MAAM,UAAU,KAAK,gBAAgB;AAAA,IAC9C,EAAE,oBAAoB,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE;AAAA,IACpD,MAAM,aAAa,GAAG;AAAA,EACxB,CAAC;AACD,SAAO,EAAE,GAAG;AACd;AAmBA,eAAsB,WACpB,KACA,QACA,OACkB;AAClB,QAAM,WAAoC,CAAC;AAC3C,MAAI,MAAM,gBAAgB,OAAW,UAAS,eAAe,MAAM;AACnE,MAAI,MAAM,SAAS,OAAW,UAAS,OAAO,MAAM;AACpD,MAAI,MAAM,aAAa,OAAW,UAAS,WAAW,MAAM;AAC5D,MAAI,MAAM,WAAW,OAAW,UAAS,SAAS,MAAM;AACxD,MAAI,MAAM,UAAU,OAAW,UAAS,QAAQ,MAAM;AACtD,MAAI,MAAM,cAAc,OAAW,UAAS,aAAa,MAAM;AAC/D,MAAI,MAAM,cAAc,OAAW,UAAS,aAAa,MAAM;AAC/D,MAAI,MAAM,aAAa,OAAW,UAAS,WAAW,MAAM;AAC5D,MAAI,MAAM,aAAa,OAAW,UAAS,YAAY,MAAM;AAC7D,MAAI;AACF,UAAM,IAAI,MAAM,QAAQ,KAAK,GAAG,EAAE,qBAAqB,mBAAmB,MAAM,CAAC,IAAI;AAAA,MACnF,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AACD,WAAO,KAAK,EAAE,IAAI,QAAQ,SAAS,MAAM,OAAO,OAAO;AAAA,EACzD,SAAS,GAAG;AACV,QAAI,EAAE,aAAa,cAAe,EAAE,WAAW,OAAO,EAAE,WAAW,IAAM,OAAM;AAC/E,UAAM,mBAAmB;AAAA,MACvB,IAAI;AAAA,MACJ,aAAa,MAAM,eAAe;AAAA,MAClC,MAAM,MAAM,QAAQ;AAAA,MACpB,UAAU,MAAM,YAAY;AAAA,MAC5B,WAAW,MAAM,aAAa;AAAA,MAC9B,QAAQ,MAAM,UAAU;AAAA,MACxB,cAAc;AAAA,MACd,UAAU,MAAM,YAAY;AAAA,MAC5B,UAAU,MAAM,YAAY;AAAA,MAC5B,WAAW;AAAA,MACX,OAAO,MAAM,SAAS;AAAA,MACtB,WAAW,MAAM,aAAa;AAAA,MAC9B,YAAY;AAAA,IACd;AACA,UAAM,UAAU,KAAK,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,MAAM,aAAa,GAAG,CAAC,CAAC;AACrF,WAAO,EAAE,IAAI,QAAQ,SAAS,MAAM,OAAO,YAAY;AAAA,EACzD;AACF;AAGA,eAAsB,WAAW,KAAqB,QAAkC;AACtF,MAAI;AACF,UAAM,QAAQ,KAAK,GAAG,EAAE,UAAU,mBAAmB,MAAM,CAAC,IAAI,EAAE,QAAQ,SAAS,CAAC;AAAA,EACtF,SAAS,GAAG;AACV,QAAI,EAAE,aAAa,cAAc,EAAE,WAAW,IAAK,OAAM;AACzD,UAAM,UAAU,KAAK,gBAAgB,CAAC,MAAM,CAAC;AAAA,EAC/C;AACA,SAAO,EAAE,IAAI,QAAQ,SAAS,KAAK;AACrC;AAOA,eAAsB,gBACpB,KACA,QACA,aACkB;AAClB,QAAM,QAAQ,KAAK,GAAG,EAAE,qBAAqB,mBAAmB,MAAM,CAAC,aAAa;AAAA,IAClF,QAAQ;AAAA,IACR,MAAM,EAAE,UAAU,iBAAiB,WAAW,EAAE;AAAA,EAClD,CAAC;AACD,SAAO,EAAE,IAAI,QAAQ,eAAe,KAAK;AAC3C;AAEA,IAAM,OAAO;AAWN,SAAS,cAAc,KAAqB,OAAyB,CAAC,GAAqB;AAChG,SAAO,QAAQ,KAAK,GAAG,IAAI,oBAAoB;AAAA,IAC7C,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,UAAU,KAAK,QAAQ;AAAA,MACvB,WAAW,KAAK,QAAQ;AAAA,MACxB,WAAW,KAAK,QAAQ;AAAA,MACxB,YAAY,KAAK,SAAS;AAAA,MAC1B,UAAU,KAAK,OAAO;AAAA,IACxB;AAAA,EACF,CAAC;AACH;AAMO,SAAS,eACd,KACA,SACA,aACA,aACkB;AAClB,SAAO,QAAQ,KAAK,GAAG,IAAI,yBAAyB;AAAA,IAClD,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ;AAAA,MACA,QAAQ,iBAAiB,WAAW;AAAA,MACpC,QAAQ,iBAAiB,WAAW;AAAA,IACtC;AAAA,EACF,CAAC;AACH;AAIO,SAAS,gBACd,KACA,QACA,OAA8D,CAAC,GAC7C;AAClB,SAAO,QAAQ,KAAK,GAAG,KAAK,iBAAiB,mBAAmB,MAAM,CAAC,IAAI;AAAA,IACzE,OAAO;AAAA,MACL,QAAQ,KAAK,UAAU;AAAA,MACvB,OAAO,KAAK,SAAS;AAAA,MACrB,SAAS,KAAK,WAAW;AAAA,IAC3B;AAAA,EACF,CAAC;AACH;AAMO,SAAS,kBACd,KACA,QACA,QACA,SACkB;AAClB,SAAO,QAAQ,KAAK,GAAG,KAAK,iBAAiB,mBAAmB,MAAM,CAAC,IAAI;AAAA,IACzE,QAAQ;AAAA,IACR,MAAM,EAAE,QAAQ,QAAQ;AAAA,EAC1B,CAAC;AACH;;;ACpeO,SAAS,aAAa,SAAiC;AAC5D,QAAM,QAAQ,oBAAI,IAAqB;AACvC,aAAW,KAAK,QAAS,OAAM,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,QAAQ,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC;AAEzF,QAAM,QAAmB,CAAC;AAC1B,aAAW,KAAK,SAAS;AACvB,UAAM,OAAO,MAAM,IAAI,EAAE,EAAE;AAC3B,QAAI,CAAC,KAAM;AACX,UAAM,OAAO,EAAE;AACf,UAAM,WAAW,QAAQ,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,CAAC,GAAG,KAAK;AACvE,UAAM,SAAS,WAAW,MAAM,IAAI,QAAQ,IAAI;AAChD,QAAI,OAAQ,QAAO,SAAS,KAAK,IAAI;AAAA,QAChC,OAAM,KAAK,IAAI;AAAA,EACtB;AACA,SAAO;AACT;AAGO,SAAS,cAAc,OAAkB,SAAS,IAAY;AACnE,QAAM,QAAkB,CAAC;AACzB,QAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,UAAM,OAAO,MAAM,MAAM,SAAS;AAClC,UAAM,KAAK,GAAG,MAAM,GAAG,OAAO,wBAAS,qBAAM,GAAG,KAAK,IAAI,SAAS,KAAK,EAAE,GAAG;AAC5E,QAAI,KAAK,SAAS,QAAQ;AACxB,YAAM,KAAK,cAAc,KAAK,UAAU,GAAG,MAAM,GAAG,OAAO,SAAS,WAAM,EAAE,CAAC;AAAA,IAC/E;AAAA,EACF,CAAC;AACD,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACLO,SAAS,MAAM,KAAqB;AACzC,SAAO;AAAA,IACL,SAAS,CAAC,SAA4B,gBAAgB,KAAK,IAAI;AAAA,IAC/D,QAAQ,CAAC,WAAmB,cAAc,KAAK,MAAM;AAAA,IACrD,YAAY,CAAC,QAAgB,SAC3B,qBAAqB,KAAK,QAAQ,IAAI;AAAA,IACxC,SAAS,OAAO,SAAkB,aAAa,MAAM,mBAAmB,KAAK,IAAI,CAAC;AAAA,IAClF,WAAW,CAAC,UAA0B,iBAAiB,KAAK,KAAK;AAAA,IACjE,WAAW,CAAC,QAAgB,UAA0B,iBAAiB,KAAK,QAAQ,KAAK;AAAA,IACzF,WAAW,CAAC,WAAmB,iBAAiB,KAAK,MAAM;AAAA,IAC3D,UAAU,CAAC,SAA4B,UAAU,KAAK,IAAI;AAAA,IAC1D,SAAS,CAAC,WAAmB,QAAQ,KAAK,MAAM;AAAA,IAChD,WAAW,CAAC,WAAmB,aAAa,KAAK,MAAM;AAAA,IACvD,YAAY,CAAC,UAA2B,WAAW,KAAK,KAAK;AAAA,IAC7D,YAAY,CAAC,QAAgB,UAA2B,WAAW,KAAK,QAAQ,KAAK;AAAA,IACrF,YAAY,CAAC,WAAmB,WAAW,KAAK,MAAM;AAAA,IACtD,mBAAmB,CAAC,QAAgB,gBAClC,gBAAgB,KAAK,QAAQ,WAAW;AAAA,IAC1C,UAAU,CAAC,SAA4B,UAAU,KAAK,IAAI;AAAA,IAC1D,SAAS,CAAC,WAAmB,QAAQ,KAAK,MAAM;AAAA,IAChD,aAAa,CAAC,QAAgB,SAC5B,gBAAgB,KAAK,QAAQ,IAAI;AAAA,IACnC,eAAe,CAAC,QAAgB,IAAY,OAAmB,WAC7D,kBAAkB,KAAK,QAAQ,QAAQ,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC;AAAA,IACvD,kBAAkB,CAAC,QAAgB,IAAY,OAAmB,WAChE,kBAAkB,KAAK,QAAQ,UAAU,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC;AAAA,IACzD,WAAW,CAAC,SAA4B,cAAc,KAAK,IAAI;AAAA,EACjE;AACF;;;ACjDA,IAAM,UAAU;AAShB,eAAsB,eACpB,KACA,SACA,UAAU,MACU;AACpB,QAAM,OAAQ,MAAM;AAAA,IAClB;AAAA,IACA,GAAG,OAAO,0BAA0B,mBAAmB,OAAO,CAAC,YAAY,mBAAmB,OAAO,CAAC;AAAA,IACtG,EAAE,OAAO,EAAE,UAAU,KAAK,EAAE;AAAA,EAC9B;AACA,QAAM,KAAK,KAAK;AAChB,QAAM,MAAM,KAAK;AACjB,MAAI,OAAO,OAAO,YAAY,CAAC,MAAM,OAAO,QAAQ,YAAY,CAAC,KAAK;AACpE,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AACA,SAAO,EAAE,IAAI,KAAK,SAAS,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,QAAQ;AACvF;AAIA,SAAS,UAAU,KAAc,MAAyB;AACxD,MAAI,MAAe;AACnB,aAAW,KAAK,MAAM;AACpB,QAAI,QAAQ,QAAQ,OAAO,QAAQ,SAAU,QAAO;AACpD,UAAO,IAAgC,CAAC;AAAA,EAC1C;AACA,SAAO;AACT;AAEA,SAAS,UAAU,KAA8B,MAAgB,OAAsB;AACrF,MAAI,MAA+B;AACnC,WAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG;AAC3C,UAAM,IAAI,KAAK,CAAC;AAChB,QAAI,EAAE,KAAK,QAAQ,OAAO,IAAI,CAAC,MAAM,YAAY,IAAI,CAAC,MAAM,KAAM,KAAI,CAAC,IAAI,CAAC;AAC5E,UAAM,IAAI,CAAC;AAAA,EACb;AACA,MAAI,KAAK,KAAK,SAAS,CAAC,CAAW,IAAI;AACzC;AAEA,SAAS,WACP,MACA,QACM;AACN,QAAM,OAAO,KAAK;AAClB,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG;AAChC,MAAI,KAAK,WAAW,YAAY,KAAK,YAAY,QAAW;AAC1D,cAAU,QAAQ,MAAM,KAAK,OAAO;AAAA,EACtC,WAAW,KAAK,WAAW,UAAU;AACnC,UAAM,WAAW,UAAU,QAAQ,IAAI;AACvC,UAAM,MAAM,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,OAAO,KAAK,WAAW,EAAE;AACvF,cAAU,QAAQ,MAAM,OAAO,aAAa,WAAW,WAAW,MAAM,GAAG;AAAA,EAC7E,WAAW,KAAK,WAAW,YAAY,KAAK,WAAW,GAAG;AACxD,WAAO,OAAO,KAAK,CAAC,CAAW;AAAA,EACjC;AACF;AAGO,SAAS,YAAY,QAAyC;AACnE,QAAM,UAAU,UAAU,QAAQ,CAAC,WAAW,SAAS,CAAC;AACxD,MAAI,SAAS;AACX,QAAI,OAAO,QAAQ,SAAS,YAAY,QAAQ,KAAM,QAAO,QAAQ;AACrE,UAAM,KAAK,QAAQ;AACnB,UAAM,MAAM,IAAI;AAChB,QAAI,OAAO,KAAK,SAAS,YAAY,IAAI,KAAM,QAAO,IAAI;AAC1D,QAAI,OAAO,IAAI,SAAS,YAAY,GAAG,KAAM,QAAO,GAAG;AAAA,EACzD;AACA,QAAM,MAAM,OAAO;AACnB,MAAI,OAAO,KAAK,SAAS,YAAY,IAAI,KAAM,QAAO,IAAI;AAC1D,SAAO;AACT;AAcA,eAAsB,SACpB,KACA,MACA,OACA,OAAwB,CAAC,GACJ;AACrB,WAAS,GAAG;AACZ,QAAM,OAAgC;AAAA,IACpC,UAAU,KAAK;AAAA,IACf,WAAW,KAAK;AAAA,IAChB,eAAe,KAAK;AAAA,IACpB;AAAA,IACA,QAAQ,QAAQ,KAAK,MAAM;AAAA,EAC7B;AACA,MAAI,KAAK,eAAgB,MAAK,kBAAkB,KAAK;AAErD,QAAM,MAAM,MAAM,MAAM,GAAG,IAAI,OAAO,GAAG,OAAO,WAAW,KAAK,GAAG,oBAAoB;AAAA,IACrF,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,GAAG,aAAa,GAAG;AAAA,MACnB,gBAAgB;AAAA,MAChB,QAAQ,KAAK,SAAS,sBAAsB;AAAA,MAC5C,cAAc;AAAA,IAChB;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AACD,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,UAAU,IAAI,QAAQ,IAAI,YAAY,MAAM,IAAI,KAAK,CAAC;AAE7E,QAAM,cAAc,IAAI,QAAQ,IAAI,cAAc,KAAK;AACvD,MAAI,KAAK,UAAU,YAAY,SAAS,mBAAmB,GAAG;AAC5D,WAAO,cAAc,KAAK,KAAK,OAAO;AAAA,EACxC;AACA,QAAM,SAAS,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC;AAC1C,SAAO,EAAE,MAAM,YAAY,MAAM,GAAG,gBAAgB,iBAAiB,MAAM,EAAE;AAC/E;AAEA,SAAS,iBAAiB,QAAqD;AAC7E,QAAM,KAAK,OAAO;AAClB,SAAO,OAAO,OAAO,WAAW,KAAK;AACvC;AAEA,eAAe,cAAc,KAAe,SAAuD;AACjG,QAAM,SAAS,IAAI,MAAM,UAAU;AACnC,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,6BAA6B;AAC1D,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,SAAkC,CAAC;AACzC,MAAI,SAAS;AACb,MAAI,WAAW;AACf,MAAI;AAEJ,QAAM,SAAS,CAAC,SAAuB;AACrC,QAAI,CAAC,KAAK,WAAW,OAAO,EAAG;AAC/B,UAAM,UAAU,KAAK,MAAM,CAAC,EAAE,KAAK;AACnC,QAAI,YAAY,MAAM,YAAY,SAAU;AAC5C,QAAI;AACJ,QAAI;AACF,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,QAAQ;AACN;AAAA,IACF;AACA,eAAW,MAAM,MAAM;AACvB,QAAI,KAAK,KAAK,WAAW,KAAK,KAAK,IAAI,CAAC,MAAM,mBAAmB;AAC/D,uBAAiB,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;AAAA,IACrE;AACA,UAAM,OAAO,YAAY,MAAM;AAC/B,QAAI,QAAQ,SAAS,UAAU;AAC7B,UAAI,QAAS,SAAQ,KAAK,MAAM,SAAS,MAAM,CAAC;AAChD,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,aAAS;AACP,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,QAAI,KAAM;AACV,cAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,UAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,aAAS,MAAM,IAAI,KAAK;AACxB,eAAW,MAAM,MAAO,QAAO,GAAG,QAAQ,OAAO,EAAE,CAAC;AAAA,EACtD;AACA,MAAI,OAAO,KAAK,EAAG,QAAO,OAAO,KAAK,CAAC;AACvC,SAAO,EAAE,MAAM,UAAU,gBAAgB,kBAAkB,iBAAiB,MAAM,EAAE;AACtF;;;AClLA,IAAM,OAAO;AAYN,SAAS,WAAW,KAAqB,OAA0B,CAAC,GAAqB;AAC9F,SAAO,QAAQ,KAAK,GAAG,IAAI,oBAAoB;AAAA,IAC7C,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,QAAQ,KAAK,UAAU;AAAA,MACvB,OAAO,KAAK,SAAS;AAAA,MACrB,aAAa,KAAK,cAAc;AAAA,MAChC,MAAM,KAAK,QAAQ;AAAA,MACnB,iBAAiB,KAAK,iBAAiB;AAAA,MACvC,cAAc,KAAK,cAAc;AAAA,IACnC;AAAA,EACF,CAAC;AACH;AAEO,SAAS,SAAS,KAAqB,SAAmC;AAC/E,SAAO,QAAQ,KAAK,GAAG,IAAI,UAAU,mBAAmB,OAAO,CAAC,EAAE;AACpE;AAEO,SAAS,cAAc,KAAqB,KAA+B;AAChF,SAAO,QAAQ,KAAK,GAAG,IAAI,iBAAiB,mBAAmB,GAAG,CAAC,EAAE;AACvE;AAQO,SAAS,mBACd,KACA,OAAsB,CAAC,GACL;AAClB,SAAO,QAAQ,KAAK,GAAG,IAAI,8BAA8B;AAAA,IACvD,OAAO,EAAE,QAAQ,KAAK,UAAU,GAAG,OAAO,KAAK,SAAS,IAAI,MAAM,KAAK,QAAQ,OAAU;AAAA,EAC3F,CAAC;AACH;AAEO,SAAS,mBACd,KACA,OAAsB,CAAC,GACL;AAClB,SAAO,QAAQ,KAAK,GAAG,IAAI,wBAAwB;AAAA,IACjD,OAAO,EAAE,QAAQ,KAAK,UAAU,GAAG,OAAO,KAAK,SAAS,IAAI,MAAM,KAAK,QAAQ,OAAU;AAAA,EAC3F,CAAC;AACH;AAEO,SAAS,iBAAiB,KAAqB,YAAsC;AAC1F,SAAO,QAAQ,KAAK,GAAG,IAAI,wBAAwB,mBAAmB,UAAU,CAAC,EAAE;AACrF;AAEO,SAAS,oBAAoB,KAAuC;AACzE,SAAO,QAAQ,KAAK,GAAG,IAAI,WAAW;AACxC;AAEO,SAAS,YAAY,KAAqB,MAAiC;AAChF,SAAO,QAAQ,KAAK,GAAG,IAAI,UAAU,EAAE,QAAQ,QAAQ,KAAK,CAAC;AAC/D;AAEO,SAAS,YAAY,KAAqB,SAAiB,MAAiC;AACjG,SAAO,QAAQ,KAAK,GAAG,IAAI,UAAU,mBAAmB,OAAO,CAAC,IAAI,EAAE,QAAQ,OAAO,KAAK,CAAC;AAC7F;AAEO,SAAS,YAAY,KAAqB,SAAmC;AAClF,SAAO,QAAQ,KAAK,GAAG,IAAI,UAAU,mBAAmB,OAAO,CAAC,IAAI,EAAE,QAAQ,SAAS,CAAC;AAC1F;AAEO,SAAS,aAAa,KAAqB,SAAmC;AACnF,SAAO,QAAQ,KAAK,GAAG,IAAI,UAAU,mBAAmB,OAAO,CAAC,YAAY,EAAE,QAAQ,OAAO,CAAC;AAChG;AAEO,SAAS,eAAe,KAAqB,SAAmC;AACrF,SAAO,QAAQ,KAAK,GAAG,IAAI,UAAU,mBAAmB,OAAO,CAAC,cAAc,EAAE,QAAQ,MAAM,CAAC;AACjG;AAEA,IAAM,MAAM;AAGL,SAAS,kBACd,KACA,UACA,OAAyC,CAAC,GACxB;AAClB,SAAO,QAAQ,KAAK,GAAG,GAAG,IAAI,mBAAmB,QAAQ,CAAC,iBAAiB;AAAA,IACzE,OAAO,EAAE,MAAM,KAAK,QAAQ,GAAG,MAAM,KAAK,QAAQ,GAAG;AAAA,EACvD,CAAC;AACH;AAGO,SAAS,aACd,KACA,UACA,gBACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,GAAG,IAAI,mBAAmB,QAAQ,CAAC,iBAAiB,mBAAmB,cAAc,CAAC;AAAA,EAC3F;AACF;;;AC7FA,SAAS,aAAa,OAA2C;AAC/D,QAAM,SAAU,MAAM,UAAU,CAAC;AACjC,QAAMC,UAAU,OAAO,UAAU,CAAC;AAClC,SAAO,MAAM,QAAQA,QAAO,MAAM,IAAIA,QAAO,SAAS,CAAC;AACzD;AAEA,SAAS,gBAAgB,OAAgC,SAA0B;AACjF,MAAI,CAAC,MAAM,UAAU,OAAO,MAAM,WAAW,SAAU,OAAM,SAAS,CAAC;AACvE,QAAM,SAAS,MAAM;AACrB,MAAI,CAAC,OAAO,UAAU,OAAO,OAAO,WAAW,SAAU,QAAO,SAAS,CAAC;AAC1E,EAAC,OAAO,OAAmC,SAAS;AACtD;AAEO,SAAS,OAAO,KAAqB;AAC1C,SAAO;AAAA,IACL,MAAM,CAAC,SAA6B,WAAW,KAAK,IAAI;AAAA,IACxD,KAAK,CAAC,YAAoB,SAAS,KAAK,OAAO;AAAA,IAC/C,UAAU,CAAC,QAAgB,cAAc,KAAK,GAAG;AAAA,IACjD,cAAc,CAAC,SAAyB,mBAAmB,KAAK,IAAI;AAAA,IACpE,cAAc,CAAC,SAAyB,mBAAmB,KAAK,IAAI;AAAA,IACpE,aAAa,CAAC,eAAuB,iBAAiB,KAAK,UAAU;AAAA,IACrE,cAAc,MAAM,oBAAoB,GAAG;AAAA,IAC3C,QAAQ,CAAC,SAAkB,YAAY,KAAK,IAAI;AAAA,IAChD,QAAQ,CAAC,SAAiB,SAAkB,YAAY,KAAK,SAAS,IAAI;AAAA,IAC1E,QAAQ,CAAC,YAAoB,YAAY,KAAK,OAAO;AAAA,IACrD,SAAS,CAAC,YAAoB,aAAa,KAAK,OAAO;AAAA,IACvD,WAAW,CAAC,YAAoB,eAAe,KAAK,OAAO;AAAA,IAC3D,UAAU,CAAC,UAAkB,SAC3B,kBAAkB,KAAK,UAAU,IAAI;AAAA,IACvC,SAAS,CAAC,UAAkB,mBAC1B,aAAa,KAAK,UAAU,cAAc;AAAA;AAAA,IAE5C,WAAW,OAAO,YAAuC;AACvD,YAAM,QAAS,MAAM,SAAS,KAAK,OAAO;AAC1C,YAAM,MAAM,aAAa,KAAK;AAC9B,aAAO,IAAI,IAAI,CAAC,MAAM,OAAQ,EAA8B,YAAY,EAAE,CAAC,EAAE,OAAO,OAAO;AAAA,IAC7F;AAAA;AAAA,IAEA,UAAU,OAAO,SAAiB,aAAyC;AACzE,YAAM,QAAS,MAAM,SAAS,KAAK,OAAO;AAC1C,YAAM,MAAM,aAAa,KAAK;AAC9B,YAAM,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,OAAQ,EAA8B,YAAY,EAAE,CAAC,CAAC;AAC1F,iBAAW,MAAM,SAAU,KAAI,CAAC,KAAK,IAAI,EAAE,EAAG,KAAI,KAAK,EAAE,UAAU,GAAG,CAAC;AACvE,sBAAgB,OAAO,GAAG;AAC1B,aAAO,YAAY,KAAK,SAAS,KAAK;AAAA,IACxC;AAAA;AAAA,IAEA,aAAa,OAAO,SAAiB,aAAyC;AAC5E,YAAM,QAAS,MAAM,SAAS,KAAK,OAAO;AAC1C,YAAM,OAAO,IAAI,IAAI,QAAQ;AAC7B,YAAM,MAAM,aAAa,KAAK,EAAE;AAAA,QAC9B,CAAC,MAAM,CAAC,KAAK,IAAI,OAAQ,EAA8B,YAAY,EAAE,CAAC;AAAA,MACxE;AACA,sBAAgB,OAAO,GAAG;AAC1B,aAAO,YAAY,KAAK,SAAS,KAAK;AAAA,IACxC;AAAA;AAAA,IAEA,MAAM,OACJ,SACA,OACA,OAA+C,CAAC,MAC7C;AACH,YAAM,OAAO,MAAM,eAAe,KAAK,SAAS,KAAK,WAAW,IAAI;AACpE,aAAO,SAAS,KAAK,MAAM,OAAO,IAAI;AAAA,IACxC;AAAA,EACF;AACF;;;AC/EA,IAAM,WAAW;AACjB,IAAM,WAAW;AACjB,IAAM,iBAAiB;AAEvB,IAAM,WAAW,oBAAI,IAAwC;AAC7D,IAAI,QAAQ;AACZ,SAAS,SAAiB;AACxB,WAAS;AACT,SAAO;AACT;AAEA,SAAS,OAAO,KAA6B;AAC3C,SAAO,GAAG,IAAI,OAAO,GAAG,QAAQ;AAClC;AAEA,SAAS,QAAQ,KAAqB,MAAc,WAA4C;AAC9F,QAAM,IAA4B;AAAA,IAChC,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,wBAAwB;AAAA,IACxB,eAAe,UAAU,IAAI,KAAK;AAAA,EACpC;AACA,MAAI,UAAW,GAAE,gBAAgB,IAAI;AACrC,SAAO;AACT;AAGA,SAAS,UAAU,MAAuB;AACxC,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,UAAM,OAAO,KACV,MAAM,IAAI,EACV,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,CAAC,EACnC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,EAC5B,KAAK,EAAE;AACV,QAAI,KAAM,QAAO,KAAK,MAAM,IAAI;AAChC,UAAM,IAAI,MAAM,yCAAyC,KAAK,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EAC/E;AACF;AAEA,eAAe,KACb,KACA,MACA,WACA,MACA;AACA,WAAS,GAAG;AACZ,QAAM,MAAM,MAAM,MAAM,OAAO,GAAG,GAAG;AAAA,IACnC,QAAQ;AAAA,IACR,SAAS,QAAQ,KAAK,MAAM,SAAS;AAAA,IACrC,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AACD,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,UAAU,IAAI,QAAQ,IAAI,YAAY,IAAI;AACjE,SAAO,EAAE,KAAK,KAAK;AACrB;AAEA,eAAe,cAAc,KAAqB,MAA+B;AAC/E,QAAM,MAAM,GAAG,OAAO,GAAG,CAAC,IAAI,IAAI;AAClC,QAAM,SAAS,SAAS,IAAI,GAAG;AAC/B,MAAI,UAAU,KAAK,IAAI,IAAI,OAAO,KAAK,eAAgB,QAAO,OAAO;AACrE,WAAS,OAAO,GAAG;AAEnB,QAAM,EAAE,IAAI,IAAI,MAAM,KAAK,KAAK,MAAM,QAAW;AAAA,IAC/C,SAAS;AAAA,IACT,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN,iBAAiB;AAAA,MACjB,cAAc,CAAC;AAAA,MACf,YAAY,EAAE,MAAM,WAAW,SAAS,QAAQ;AAAA,IAClD;AAAA,EACF,CAAC;AACD,QAAM,YAAY,IAAI,QAAQ,IAAI,gBAAgB,KAAK,IAAI,QAAQ,IAAI,gBAAgB;AACvF,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,yCAAyC;AAEzE,QAAM,KAAK,KAAK,MAAM,WAAW,EAAE,SAAS,OAAO,QAAQ,4BAA4B,CAAC;AACxF,WAAS,IAAI,KAAK,EAAE,IAAI,WAAW,IAAI,KAAK,IAAI,EAAE,CAAC;AACnD,SAAO;AACT;AAGA,SAAS,OAAO,QAA0B;AACxC,QAAM,MAAM;AACZ,MAAI,IAAI,MAAO,OAAM,IAAI,MAAM,yBAAyB,IAAI,MAAM,OAAO,EAAE;AAC3E,QAAM,SAAS,IAAI;AACnB,MAAI,WAAW,OAAW,QAAO;AACjC,QAAM,UAAU,OAAO;AACvB,MAAI,MAAM,QAAQ,OAAO,KAAK,QAAQ,CAAC,KAAK,OAAO,QAAQ,CAAC,EAAE,SAAS,UAAU;AAC/E,QAAI;AACF,aAAO,KAAK,MAAM,QAAQ,CAAC,EAAE,IAAI;AAAA,IACnC,QAAQ;AACN,aAAO,EAAE,KAAK,QAAQ,CAAC,EAAE,KAAK;AAAA,IAChC;AAAA,EACF;AACA,SAAO;AACT;AAGA,eAAsB,SACpB,KACA,MACA,MACA,MACkB;AAClB,QAAM,YAAY,MAAM,cAAc,KAAK,IAAI;AAC/C,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK,MAAM,WAAW;AAAA,IAChD,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ,EAAE,MAAM,WAAW,KAAK;AAAA,IAChC,IAAI,OAAO;AAAA,EACb,CAAC;AACD,SAAO,OAAO,UAAU,IAAI,CAAC;AAC/B;AAGA,eAAsB,WACpB,KACA,MACA,QACA,SAAkC,CAAC,GACjB;AAClB,QAAM,YAAY,MAAM,cAAc,KAAK,IAAI;AAC/C,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK,MAAM,WAAW;AAAA,IAChD,SAAS;AAAA,IACT;AAAA,IACA,QAAQ,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AAAA,IAClD,IAAI,OAAO;AAAA,EACb,CAAC;AACD,QAAM,SAAS,UAAU,IAAI;AAC7B,MAAI,OAAO,MAAO,OAAM,IAAI,MAAM,yBAAyB,OAAO,MAAM,OAAO,EAAE;AACjF,SAAO,OAAO;AAChB;AASO,SAAS,aACd,KACA,MACA,OACA,OAA4B,CAAC,GACX;AAClB,QAAM,OAAgC,EAAE,OAAO,iBAAiB,OAAO;AACvE,MAAI,KAAK,YAAa,MAAK,eAAe,KAAK;AAC/C,MAAI,KAAK,gBAAgB,OAAW,MAAK,eAAe,KAAK;AAC7D,SAAO,SAAS,KAAK,MAAM,iBAAiB,IAAI;AAClD;AAEO,SAAS,oBACd,KACA,MACA,MACkB;AAClB,SAAO,SAAS,KAAK,MAAM,yBAAyB,IAAI;AAC1D;AAEO,SAAS,WACd,KACA,MACA,cACA,MACkB;AAClB,QAAM,OAAgC,EAAE,gBAAgB,aAAa;AACrE,MAAI,SAAS,OAAW,MAAK,QAAQ;AACrC,SAAO,SAAS,KAAK,MAAM,eAAe,IAAI;AAChD;AAEO,SAAS,UAAU,KAAqB,MAAgC;AAC7E,SAAO,WAAW,KAAK,MAAM,YAAY;AAC3C;AAGO,SAAS,sBACd,KACA,MACA,MACkB;AAClB,SAAO,SAAS,KAAK,MAAM,2BAA2B,IAAI;AAC5D;AAGO,SAAS,mBACd,KACA,MACA,MACkB;AAClB,SAAO,SAAS,KAAK,MAAM,+BAA+B,IAAI;AAChE;AAGO,SAAS,cACd,KACA,MACA,MACkB;AAClB,SAAO,SAAS,KAAK,MAAM,mBAAmB,IAAI;AACpD;AAIO,SAAS,cAAc,KAAqB,MAAgC;AACjF,SAAO,WAAW,KAAK,MAAM,gBAAgB;AAC/C;AACO,SAAS,aAAa,KAAqB,MAAc,KAA+B;AAC7F,SAAO,WAAW,KAAK,MAAM,kBAAkB,EAAE,IAAI,CAAC;AACxD;AACO,SAAS,sBAAsB,KAAqB,MAAgC;AACzF,SAAO,WAAW,KAAK,MAAM,0BAA0B;AACzD;AACO,SAAS,YAAY,KAAqB,MAAgC;AAC/E,SAAO,WAAW,KAAK,MAAM,cAAc;AAC7C;AACO,SAAS,UACd,KACA,MACA,MACA,OAAgC,CAAC,GACf;AAClB,SAAO,WAAW,KAAK,MAAM,eAAe,EAAE,MAAM,WAAW,KAAK,CAAC;AACvE;;;ACzNO,SAAS,QAAQ,KAAqB;AAC3C,SAAO;AAAA,IACL,cAAc,CAAC,MAAc,OAAe,SAC1C,aAAa,KAAK,MAAM,OAAO,IAAI;AAAA,IACrC,qBAAqB,CAAC,MAAc,SAClC,oBAAoB,KAAK,MAAM,IAAI;AAAA,IACrC,YAAY,CAAC,MAAc,cAAsB,SAC/C,WAAW,KAAK,MAAM,cAAc,IAAI;AAAA,IAC1C,OAAO,CAAC,SAAiB,UAAU,KAAK,IAAI;AAAA,IAC5C,UAAU,CAAC,MAAc,MAAc,SACrC,SAAS,KAAK,MAAM,MAAM,IAAI;AAAA,IAChC,uBAAuB,CAAC,MAAc,SACpC,sBAAsB,KAAK,MAAM,IAAI;AAAA,IACvC,iBAAiB,CAAC,MAAc,SAC9B,mBAAmB,KAAK,MAAM,IAAI;AAAA,IACpC,YAAY,CAAC,MAAc,SAAkC,cAAc,KAAK,MAAM,IAAI;AAAA,IAC1F,WAAW,CAAC,SAAiB,cAAc,KAAK,IAAI;AAAA,IACpD,UAAU,CAAC,MAAc,QAAgB,aAAa,KAAK,MAAM,GAAG;AAAA,IACpE,WAAW,CAAC,SAAiB,sBAAsB,KAAK,IAAI;AAAA,IAC5D,SAAS,CAAC,SAAiB,YAAY,KAAK,IAAI;AAAA,IAChD,QAAQ,CAAC,MAAc,MAAc,SACnC,UAAU,KAAK,MAAM,MAAM,IAAI;AAAA,EACnC;AACF;;;AClCA,IAAMC,QAAO;AACb,IAAM,UAAU;AAET,SAAS,cAAc,KAAuC;AACnE,SAAO,QAAQ,KAAK,GAAGA,KAAI,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,MAAM,GAAG,OAAO,GAAG,EAAE,CAAC;AAC1F;AAGO,SAAS,eAAe,KAAqB,MAAiC;AACnF,SAAO,QAAQ,KAAK,GAAG,OAAO,mBAAmB,EAAE,QAAQ,QAAQ,KAAK,CAAC;AAC3E;AAGO,SAAS,YAAY,KAAqB,OAAiC;AAChF,SAAO,QAAQ,KAAK,GAAG,OAAO,iBAAiB,mBAAmB,KAAK,CAAC,IAAI;AAAA,IAC1E,QAAQ;AAAA,IACR,MAAM,CAAC;AAAA,EACT,CAAC;AACH;AAGO,SAAS,eAAe,KAAqB,OAAiC;AACnF,SAAO,QAAQ,KAAK,GAAG,OAAO,mBAAmB,mBAAmB,KAAK,CAAC,IAAI;AAAA,IAC5E,QAAQ;AAAA,EACV,CAAC;AACH;AAOA,eAAsB,gBACpB,KACA,MACA,OAAoD,CAAC,GACnC;AAClB,QAAM,UAAW,MAAM,eAAe,KAAK,IAAI;AAC/C,QAAM,QAAQ,OAAO,QAAQ,MAAM,EAAE;AACrC,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,mCAAmC;AAC/D,MAAI;AACF,UAAM,YAAY,KAAK,KAAK;AAC5B,UAAM,WAAW,KAAK,cAAc;AACpC,UAAM,WAAW,KAAK,aAAa;AACnC,QAAI,SAAS;AACb,eAAS;AACP,YAAM,MAAO,MAAM,QAAQ,KAAK,GAAG,OAAO,QAAQ,mBAAmB,KAAK,CAAC,UAAU;AAGrF,YAAMC,UAAS,IAAI,UAAU,CAAC,GAAG;AACjC,UAAIA,YAAW,aAAaA,YAAW,YAAa,QAAO,EAAE,OAAO,QAAAA,QAAO;AAC3E,UAAIA,YAAW,YAAYA,YAAW,QAAS,OAAM,IAAI,MAAM,gBAAgBA,OAAM,EAAE;AACvF,UAAI,UAAU,SAAU,OAAM,IAAI,MAAM,gCAAgC,QAAQ,IAAI;AACpF,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;AAChD,gBAAU;AAAA,IACZ;AAAA,EACF,UAAE;AACA,UAAM,eAAe,KAAK,KAAK,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACjD;AACF;AAMO,SAAS,iBACd,KACA,OACA,OAAwB,CAAC,GACP;AAClB,SAAO,QAAQ,KAAK,GAAGD,KAAI,QAAQ,mBAAmB,KAAK,CAAC,YAAY;AAAA,IACtE,OAAO,EAAE,OAAO,KAAK,SAAS,OAAU;AAAA,EAC1C,CAAC;AACH;AAQO,SAAS,kBACd,KACA,OACA,KACA,MACkB;AAClB,SAAO,QAAQ,KAAK,GAAGA,KAAI,yBAAyB,mBAAmB,KAAK,CAAC,IAAI;AAAA,IAC/E,QAAQ;AAAA,IACR,MAAM,EAAE,aAAa,UAAU,KAAK,KAAK;AAAA,EAC3C,CAAC;AACH;AAEO,SAAS,gBACd,KACA,OACA,YACA,OAAoB,CAAC,GACH;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAGA,KAAI,QAAQ,mBAAmB,KAAK,CAAC,WAAW,mBAAmB,UAAU,CAAC;AAAA,IACjF,EAAE,OAAO,EAAE,MAAM,KAAK,QAAQ,GAAG,OAAO,KAAK,SAAS,GAAG,EAAE;AAAA,EAC7D;AACF;;;ACxGA,IAAM,gBAAgB;AACtB,IAAM,sBAAsB;AAC5B,IAAM,iBAAiB;AAWhB,SAAS,sBACd,KACA,OAAsB,CAAC,GACL;AAClB,SAAO,QAAQ,KAAK,eAAe;AAAA,IACjC,OAAO;AAAA,MACL,QAAQ,KAAK,UAAU;AAAA,MACvB,OAAO,KAAK,SAAS;AAAA,MACrB,MAAM,KAAK,QAAQ;AAAA,MACnB,WAAW,KAAK,aAAa;AAAA,MAC7B,cAAc,KAAK,eAAe;AAAA,MAClC,KAAK,KAAK,OAAO;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AASO,SAAS,oBACd,KACA,MACA,OAAqB,CAAC,GACJ;AAClB,SAAO,QAAQ,KAAK,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,IAAI;AAAA,IAClE,OAAO;AAAA,MACL,MAAM,KAAK,aAAa,WAAW;AAAA,MACnC,oBAAoB,KAAK,QAAQ,SAAS;AAAA,IAC5C;AAAA,EACF,CAAC;AACH;AASO,SAAS,0BAA0B,KAAqB,MAAiC;AAC9F,SAAO,QAAQ,KAAK,eAAe,EAAE,QAAQ,QAAQ,KAAK,CAAC;AAC7D;AAEO,SAAS,uBACd,KACA,MACkB;AAClB,SAAO,QAAQ,KAAK,eAAe;AAAA,IACjC,QAAQ;AAAA,IACR,MAAM,EAAE,MAAM,KAAK,MAAM,QAAQ,KAAK,UAAU,QAAQ,aAAa,KAAK,cAAc,GAAG;AAAA,EAC7F,CAAC;AACH;AAEO,SAAS,uBAAuB,KAAqB,MAAgC;AAC1F,SAAO,QAAQ,KAAK,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,IAAI,EAAE,QAAQ,SAAS,CAAC;AAC1F;AAEO,SAAS,uBACd,KACA,MACA,MACkB;AAClB,SAAO,QAAQ,KAAK,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,IAAI,EAAE,QAAQ,OAAO,KAAK,CAAC;AAC7F;AAGO,SAAS,cAAc,KAAqB,MAAc,MAAiC;AAChG,SAAO,QAAQ,KAAK,GAAG,mBAAmB,IAAI,mBAAmB,IAAI,CAAC,aAAa;AAAA,IACjF,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACH;AAUO,SAAS,eACd,KACA,MACA,OAA6B,CAAC,GACZ;AAClB,SAAO,QAAQ,KAAK,GAAG,mBAAmB,IAAI,mBAAmB,IAAI,CAAC,gBAAgB;AAAA,IACpF,OAAO;AAAA,MACL,gBAAgB,KAAK,gBAAgB;AAAA,MACrC,QAAQ,KAAK,UAAU;AAAA,MACvB,cAAc,KAAK,eAAe;AAAA,MAClC,OAAO,KAAK,SAAS;AAAA,MACrB,YAAY,KAAK,YAAY,SAAS;AAAA,IACxC;AAAA,EACF,CAAC;AACH;AAEO,SAAS,aAAa,KAAqB,MAAc,OAAiC;AAC/F,SAAO;AAAA,IACL;AAAA,IACA,GAAG,mBAAmB,IAAI,mBAAmB,IAAI,CAAC,gBAAgB,mBAAmB,KAAK,CAAC;AAAA,EAC7F;AACF;AAEO,SAAS,gBACd,KACA,MACA,OACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,mBAAmB,IAAI,mBAAmB,IAAI,CAAC,gBAAgB,mBAAmB,KAAK,CAAC;AAAA,IAC3F,EAAE,QAAQ,OAAO;AAAA,EACnB;AACF;AAGO,SAAS,yBACd,KACA,MACA,MACA,MACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,mBAAmB,IAAI,mBAAmB,IAAI,CAAC,iBAAiB,mBAAmB,IAAI,CAAC;AAAA,IAC3F,EAAE,QAAQ,QAAQ,KAAK;AAAA,EACzB;AACF;AAGO,SAAS,wBACd,KACA,MACA,MACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,mBAAmB,IAAI,mBAAmB,IAAI,CAAC,iBAAiB,mBAAmB,IAAI,CAAC;AAAA,EAC7F;AACF;AAGO,SAAS,gBACd,KACA,MACA,MACA,MACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,mBAAmB,IAAI,mBAAmB,IAAI,CAAC,iBAAiB,mBAAmB,IAAI,CAAC;AAAA,IAC3F,EAAE,QAAQ,QAAQ,KAAK;AAAA,EACzB;AACF;AAGO,SAAS,kBACd,KACA,MACA,MACA,MACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,mBAAmB,IAAI,mBAAmB,IAAI,CAAC,iBAAiB,mBAAmB,IAAI,CAAC;AAAA,IAC3F,EAAE,QAAQ,QAAQ,KAAK;AAAA,EACzB;AACF;AAGO,SAAS,oBACd,KACA,MACA,MACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,mBAAmB,IAAI,mBAAmB,IAAI,CAAC,iBAAiB,mBAAmB,IAAI,CAAC;AAAA,EAC7F;AACF;AAEO,SAAS,mBACd,KACA,MACA,aACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,mBAAmB,IAAI,mBAAmB,IAAI,CAAC,sBAAsB,mBAAmB,WAAW,CAAC;AAAA,EACzG;AACF;AAGO,SAAS,gBACd,KACA,MACA,UACA,MACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,mBAAmB,IAAI,mBAAmB,IAAI,CAAC,YAAY,mBAAmB,QAAQ,CAAC;AAAA,IAC1F,EAAE,QAAQ,QAAQ,KAAK;AAAA,EACzB;AACF;AAGO,SAAS,aAAa,KAAqB,MAAc,MAAiC;AAC/F,SAAO,QAAQ,KAAK,GAAG,mBAAmB,IAAI,mBAAmB,IAAI,CAAC,oBAAoB;AAAA,IACxF,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACH;AAQA,SAAS,gBAAgB,MAAyB;AAChD,SAAO,EAAE,QAAQ,KAAK,UAAU,QAAQ,OAAO,OAAO,KAAK,SAAS,EAAE,EAAE;AAC1E;AAEO,SAAS,gBACd,KACA,MACA,OAA0B,CAAC,GACT;AAClB,SAAO,QAAQ,KAAK,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,iBAAiB;AAAA,IAC/E,OAAO,gBAAgB,IAAI;AAAA,EAC7B,CAAC;AACH;AAGO,SAAS,kBACd,KACA,MACA,SACA,SAAS,QACS;AAClB,SAAO,QAAQ,KAAK,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,iBAAiB;AAAA,IAC/E,QAAQ;AAAA,IACR,OAAO,EAAE,OAAO;AAAA,IAChB,MAAM,EAAE,QAAQ;AAAA,EAClB,CAAC;AACH;AAEO,SAAS,kBACd,KACA,MACA,OAA0B,CAAC,GACT;AAClB,SAAO,QAAQ,KAAK,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,mBAAmB;AAAA,IACjF,OAAO,gBAAgB,IAAI;AAAA,EAC7B,CAAC;AACH;AAEO,SAAS,gBACd,KACA,MACA,OAA0B,CAAC,GACT;AAClB,SAAO,QAAQ,KAAK,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,iBAAiB;AAAA,IAC/E,OAAO,gBAAgB,IAAI;AAAA,EAC7B,CAAC;AACH;AAKO,SAAS,cACd,KACA,MACA,MACA,IACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,IAAI,IAAI,IAAI,mBAAmB,EAAE,CAAC;AAAA,EAChF;AACF;AACO,SAAS,iBACd,KACA,MACA,MACA,MACkB;AAClB,SAAO,QAAQ,KAAK,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,IAAI,IAAI,IAAI;AAAA,IAC1E,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACH;AACO,SAAS,iBACd,KACA,MACA,MACA,IACA,MACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,IAAI,IAAI,IAAI,mBAAmB,EAAE,CAAC;AAAA,IAC9E;AAAA,MACE,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AACO,SAAS,iBACd,KACA,MACA,MACA,IACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,IAAI,IAAI,IAAI,mBAAmB,EAAE,CAAC;AAAA,IAC9E;AAAA,MACE,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAGO,SAAS,YACd,KACA,MACA,OAA0B,CAAC,GACT;AAClB,SAAO,QAAQ,KAAK,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,YAAY;AAAA,IAC1E,OAAO,EAAE,QAAQ,KAAK,UAAU,QAAQ,OAAO,OAAO,KAAK,SAAS,EAAE,EAAE;AAAA,EAC1E,CAAC;AACH;AACO,SAAS,UAAU,KAAqB,MAAc,UAAoC;AAC/F,SAAO;AAAA,IACL;AAAA,IACA,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,YAAY,mBAAmB,QAAQ,CAAC;AAAA,EACtF;AACF;AACO,SAAS,aAAa,KAAqB,MAAc,MAAiC;AAC/F,SAAO,QAAQ,KAAK,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,YAAY;AAAA,IAC1E,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACH;AACO,SAAS,aACd,KACA,MACA,UACA,MACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,YAAY,mBAAmB,QAAQ,CAAC;AAAA,IACpF;AAAA,MACE,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AACO,SAAS,aACd,KACA,MACA,UACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,YAAY,mBAAmB,QAAQ,CAAC;AAAA,IACpF;AAAA,MACE,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AACO,SAAS,cAAc,KAAqB,MAAc,MAAiC;AAChG,SAAO,QAAQ,KAAK,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,mBAAmB;AAAA,IACjF,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACH;AACO,SAAS,eAAe,KAAqB,MAAc,MAAiC;AACjG,SAAO,QAAQ,KAAK,GAAG,aAAa,IAAI,mBAAmB,IAAI,CAAC,qBAAqB;AAAA,IACnF,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACH;AAQO,SAAS,eACd,KACA,MACA,OACA,OAA8B,CAAC,GACb;AAClB,SAAO,QAAQ,KAAK,GAAG,cAAc,oBAAoB;AAAA,IACvD,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA,MAAM,KAAK,QAAQ;AAAA,MACnB,cAAc,KAAK,eAAe;AAAA,MAClC,4BAA4B,KAAK,4BAA4B;AAAA,IAC/D;AAAA,EACF,CAAC;AACH;;;AC5aA,IAAME,QAAO;AAUN,SAASC,eACd,KACA,OAA6B,CAAC,GACZ;AAClB,SAAO,QAAQ,KAAKD,OAAM;AAAA,IACxB,OAAO;AAAA,MACL,YAAY,KAAK,gBAAgB;AAAA,MACjC,MAAM,KAAK,QAAQ;AAAA,MACnB,UAAU,KAAK,YAAY;AAAA,MAC3B,OAAO,KAAK,SAAS,KAAK,QAAQ,IAAI,KAAK,QAAQ;AAAA,IACrD;AAAA,EACF,CAAC;AACH;AAEO,SAAS,YAAY,KAAqB,IAA8B;AAC7E,SAAO,QAAQ,KAAK,GAAGA,KAAI,IAAI,mBAAmB,EAAE,CAAC,EAAE;AACzD;AAWO,SAAS,kBAAkB,KAAqB,MAAiC;AACtF,SAAO,QAAQ,KAAKA,OAAM,EAAE,QAAQ,QAAQ,KAAK,CAAC;AACpD;AAGO,SAAS,eAAe,KAAqB,MAA+C;AACjG,QAAM,OAAgC;AAAA,IACpC,MAAM,KAAK;AAAA,IACX,YAAY,KAAK;AAAA,IACjB,UAAU;AAAA,IACV,mBAAmB,KAAK;AAAA,EAC1B;AACA,MAAI,KAAK,UAAU,KAAK,OAAO,SAAS,EAAG,MAAK,oBAAoB,KAAK;AACzE,SAAO,QAAQ,KAAKA,OAAM,EAAE,QAAQ,QAAQ,KAAK,CAAC;AACpD;AAEO,SAAS,eAAe,KAAqB,IAA8B;AAChF,SAAO,QAAQ,KAAK,GAAGA,KAAI,IAAI,mBAAmB,EAAE,CAAC,IAAI,EAAE,QAAQ,SAAS,CAAC;AAC/E;AASA,eAAsB,aACpB,KACA,MACA,OAA4B,CAAC,GACX;AAClB,QAAM,SAAU,MAAMC,eAAc,KAAK,EAAE,MAAM,cAAc,KAAK,aAAa,CAAC;AAGlF,QAAM,OAAO,MAAM,QAAQ,MAAM,IAAI,SAAU,OAAO,WAAW,CAAC;AAClE,SAAO,KAAK,QAAQ,KAAK,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI;AAC5D;AAQO,SAAS,cACd,KACA,IACA,OAA6B,CAAC,GACZ;AAClB,SAAO,QAAQ,KAAK,GAAGD,KAAI,IAAI,mBAAmB,EAAE,CAAC,SAAS;AAAA,IAC5D,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,OAAO,KAAK,SAAS;AAAA,MACrB,QAAQ,KAAK,UAAU;AAAA,MACvB,YAAY,KAAK,aAAa;AAAA,IAChC;AAAA,EACF,CAAC;AACH;;;ACtGA;AAAA,EACE,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,aAAe;AAAA,EACf,WAAa;AAAA,IACX,EAAE,MAAQ,QAAQ,UAAY,MAAM,aAAe,oBAAU,MAAQ,SAAS;AAAA,IAC9E;AAAA,MACE,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,aAAe;AAAA,MACf,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,aAAe;AAAA,MACf,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,aAAe;AAAA,MACf,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,aAAe;AAAA,MACf,MAAQ;AAAA,IACV;AAAA,EACF;AACF;;;AC/BA;AAAA,EACE,QAAU;AAAA,EACV,iBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,QAAU;AAAA,EACV,MAAQ;AAAA,EACR,aAAe;AAAA,EACf,MAAQ;AAAA,EACR,cAAgB;AAAA,IACd;AAAA,MACE,QAAU;AAAA,MACV,OAAS;AAAA,MACT,SAAW;AAAA,MACX,iBAAmB;AAAA,QACjB;AAAA,UACE,SAAW;AAAA,UACX,sBAAwB;AAAA,YACtB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,iBAAmB;AAAA,cACjB,UAAY;AAAA,cACZ,SAAW;AAAA,YACb;AAAA,YACA,gBAAkB;AAAA,cAChB,SAAW;AAAA,cACX,kBAAoB;AAAA,YACtB;AAAA,YACA,eAAiB;AAAA,cACf,SAAW;AAAA,cACX,UAAY;AAAA,YACd;AAAA,UACF;AAAA,UACA,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,sBAAwB;AAAA,YACtB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,iBAAmB;AAAA,cACjB,UAAY;AAAA,cACZ,SAAW;AAAA,YACb;AAAA,YACA,gBAAkB;AAAA,cAChB,SAAW;AAAA,cACX,kBAAoB;AAAA,YACtB;AAAA,YACA,eAAiB;AAAA,cACf,SAAW;AAAA,cACX,UAAY;AAAA,YACd;AAAA,UACF;AAAA,UACA,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,sBAAwB;AAAA,YACtB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,iBAAmB;AAAA,cACjB,UAAY;AAAA,cACZ,SAAW;AAAA,YACb;AAAA,YACA,gBAAkB;AAAA,cAChB,SAAW;AAAA,cACX,kBAAoB;AAAA,YACtB;AAAA,YACA,eAAiB;AAAA,cACf,SAAW;AAAA,cACX,UAAY;AAAA,YACd;AAAA,UACF;AAAA,UACA,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,sBAAwB;AAAA,YACtB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,iBAAmB;AAAA,cACjB,UAAY;AAAA,cACZ,SAAW;AAAA,YACb;AAAA,YACA,gBAAkB;AAAA,cAChB,SAAW;AAAA,cACX,kBAAoB;AAAA,YACtB;AAAA,YACA,eAAiB;AAAA,cACf,SAAW;AAAA,cACX,UAAY;AAAA,YACd;AAAA,UACF;AAAA,UACA,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,aAAe;AAAA,QACb,IAAM;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,IAAM;AAAA,MACN,iBAAmB;AAAA,MACnB,OAAS;AAAA,MACT,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,cAAgB,CAAC,IAAI;AAAA,MACrB,MAAQ,CAAC;AAAA,IACX;AAAA,IACA;AAAA,MACE,QAAU;AAAA,MACV,OAAS;AAAA,MACT,SAAW;AAAA,MACX,iBAAmB;AAAA,QACjB;AAAA,UACE,SAAW;AAAA,UACX,sBAAwB;AAAA,YACtB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,iBAAmB;AAAA,cACjB,UAAY;AAAA,cACZ,SAAW;AAAA,YACb;AAAA,YACA,gBAAkB;AAAA,cAChB,SAAW;AAAA,cACX,kBAAoB;AAAA,YACtB;AAAA,YACA,eAAiB;AAAA,cACf,SAAW;AAAA,cACX,UAAY;AAAA,YACd;AAAA,UACF;AAAA,UACA,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,sBAAwB;AAAA,YACtB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,iBAAmB;AAAA,cACjB,UAAY;AAAA,cACZ,SAAW;AAAA,YACb;AAAA,YACA,gBAAkB;AAAA,cAChB,SAAW;AAAA,cACX,kBAAoB;AAAA,YACtB;AAAA,YACA,eAAiB;AAAA,cACf,SAAW;AAAA,cACX,UAAY;AAAA,YACd;AAAA,UACF;AAAA,UACA,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,aAAe;AAAA,QACb,IAAM;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,IAAM;AAAA,MACN,iBAAmB;AAAA,MACnB,OAAS;AAAA,MACT,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,cAAgB,CAAC,aAAa;AAAA,MAC9B,MAAQ,CAAC;AAAA,IACX;AAAA,IACA;AAAA,MACE,QAAU;AAAA,MACV,OAAS;AAAA,MACT,SAAW;AAAA,MACX,iBAAmB;AAAA,QACjB;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,sBAAwB;AAAA,YACtB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,iBAAmB;AAAA,cACjB,UAAY;AAAA,cACZ,SAAW;AAAA,YACb;AAAA,YACA,gBAAkB;AAAA,cAChB,SAAW;AAAA,cACX,kBAAoB;AAAA,YACtB;AAAA,YACA,eAAiB;AAAA,cACf,SAAW;AAAA,cACX,UAAY;AAAA,YACd;AAAA,UACF;AAAA,UACA,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,SAAW;AAAA,UACX,cAAgB;AAAA,UAChB,cAAgB;AAAA,YACd,cAAgB;AAAA,YAChB,MAAQ;AAAA,UACV;AAAA,UACA,MAAQ;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,aAAe;AAAA,QACb,IAAM;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,IAAM;AAAA,MACN,iBAAmB;AAAA,MACnB,OAAS;AAAA,MACT,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,cAAgB,CAAC,YAAY;AAAA,MAC7B,MAAQ,CAAC;AAAA,IACX;AAAA,EACF;AAAA,EACA,YAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAkB;AAAA,IAChB;AAAA,MACE,QAAU;AAAA,MACV,OAAS;AAAA,MACT,SAAW;AAAA,MACX,MAAQ;AAAA,MACR,IAAM;AAAA,MACN,OAAS;AAAA,MACT,eAAiB;AAAA,QACf;AAAA,UACE,iBAAmB;AAAA,YACjB,cAAgB;AAAA,YAChB,MAAQ;AAAA,UACV;AAAA,UACA,iBAAmB;AAAA,YACjB,cAAgB;AAAA,YAChB,MAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,oBAAsB;AAAA,QACpB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,MAAQ;AAAA,QACR,IAAM;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,uBAAyB;AAAA,MACzB,MAAQ,CAAC;AAAA,MACT,oBAAsB;AAAA,QACpB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,MAAQ;AAAA,QACR,IAAM;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,uBAAyB;AAAA,MACzB,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,QAAU;AAAA,MACV,OAAS;AAAA,MACT,SAAW;AAAA,MACX,MAAQ;AAAA,MACR,IAAM;AAAA,MACN,OAAS;AAAA,MACT,eAAiB;AAAA,QACf;AAAA,UACE,iBAAmB;AAAA,YACjB,cAAgB;AAAA,YAChB,MAAQ;AAAA,UACV;AAAA,UACA,iBAAmB;AAAA,YACjB,cAAgB;AAAA,YAChB,MAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,oBAAsB;AAAA,QACpB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,MAAQ;AAAA,QACR,IAAM;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,uBAAyB;AAAA,MACzB,MAAQ,CAAC;AAAA,MACT,oBAAsB;AAAA,QACpB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,MAAQ;AAAA,QACR,IAAM;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,uBAAyB;AAAA,MACzB,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAQ,CAAC;AAAA,EACT,qBAAuB;AACzB;;;AC9uBA,IAAAE,oBAAA;AAAA,EACE,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,aAAe;AAAA,EACf,WAAa;AAAA,IACX,EAAE,MAAQ,SAAS,UAAY,MAAM,aAAe,kCAAS,MAAQ,SAAS;AAAA,IAC9E;AAAA,MACE,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,aAAe;AAAA,MACf,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,aAAe;AAAA,MACf,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,aAAe;AAAA,MACf,MAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACzBA,IAAAC,oBAAA;AAAA,EACE,OAAS;AAAA,EACT,OAAS;AAAA,IACP;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,UAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,UAAY;AAAA,MACZ,YAAc;AAAA,QACZ,OAAS;AAAA,QACT,OAAS;AAAA,QACT,cAAgB;AAAA,QAChB,aAAe;AAAA,QACf,SAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,UAAY;AAAA,MACZ,YAAc;AAAA,QACZ,YAAc;AAAA,QACd,WAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,UAAY;AAAA,MACZ,YAAc;AAAA,QACZ,YAAc;AAAA,QACd,WAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,UAAY;AAAA,MACZ,YAAc;AAAA,QACZ,YAAc;AAAA,QACd,WAAa;AAAA,UACX;AAAA,YACE,aAAe;AAAA,YACf,UAAY;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,gBAAkB;AAAA,IAChB,UAAY;AAAA,IACZ,YAAc;AAAA,MACZ,UAAY;AAAA,MACZ,YAAc;AAAA,QACZ,YAAc;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;;;AC9DA,IAAAC,oBAAA;AAAA,EACE,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,aAAe;AAAA,EACf,WAAa;AAAA,IACX,EAAE,MAAQ,QAAQ,UAAY,MAAM,aAAe,kCAAS,MAAQ,SAAS;AAAA,IAC7E;AAAA,MACE,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,SAAW;AAAA,MACX,aAAe;AAAA,MACf,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,SAAW;AAAA,MACX,aAAe;AAAA,MACf,MAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACrBA,IAAAC,oBAAA;AAAA,EACE,YAAc;AAAA,EACd,MAAQ;AAAA,EACR,UAAY;AAAA,EACZ,QAAU;AAAA,EACV,aAAe;AAAA,EACf,mBAAqB;AAAA,EACrB,mBAAqB;AAAA,IACnB,EAAE,MAAQ,MAAM,MAAQ,UAAU;AAAA,IAClC,EAAE,MAAQ,eAAe,MAAQ,UAAU;AAAA,IAC3C,EAAE,MAAQ,aAAa,MAAQ,UAAU;AAAA,IACzC,EAAE,MAAQ,oBAAoB,MAAQ,UAAU;AAAA,IAChD,EAAE,MAAQ,cAAc,MAAQ,UAAU;AAAA,IAC1C,EAAE,MAAQ,cAAc,MAAQ,UAAU;AAAA,IAC1C;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,UAAY;AAAA,QACV;AAAA,UACE,MAAQ;AAAA,UACR,cAAgB;AAAA,UAChB,cAAgB;AAAA,UAChB,QAAU,EAAE,UAAY,WAAW;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,UAAY;AAAA,QACV;AAAA,UACE,MAAQ;AAAA,UACR,cAAgB;AAAA,UAChB,cAAgB;AAAA,UAChB,QAAU;AAAA,YACR,WAAa;AAAA,YACb,QAAU;AAAA,cACR,MAAQ;AAAA,cACR,QAAU;AAAA,cACV,YAAc,EAAE,iBAAmB,IAAI;AAAA,YACzC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,MAAQ,YAAY,MAAQ,UAAU;AAAA,IACxC;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,UAAY;AAAA,QACV;AAAA,UACE,MAAQ;AAAA,UACR,cAAgB;AAAA,UAChB,cAAgB;AAAA,UAChB,QAAU;AAAA,YACR,WAAa;AAAA,YACb,QAAU;AAAA,cACR,MAAQ;AAAA,cACR,QAAU;AAAA,cACV,YAAc,EAAE,iBAAmB,IAAI;AAAA,YACzC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,MAAQ,cAAc,MAAQ,OAAO;AAAA,IACvC,EAAE,MAAQ,cAAc,MAAQ,OAAO;AAAA,IACvC,EAAE,MAAQ,cAAc,MAAQ,OAAO;AAAA,EACzC;AACF;;;ACrEA,IAAAC,oBAAA;AAAA,EACE,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,aAAe;AAAA,EACf,WAAa;AAAA,IACX,EAAE,MAAQ,QAAQ,UAAY,MAAM,aAAe,kCAAS,MAAQ,SAAS;AAAA,IAC7E;AAAA,MACE,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,SAAW;AAAA,MACX,aAAe;AAAA,MACf,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,SAAW;AAAA,MACX,aAAe;AAAA,MACf,MAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACrBA,IAAAC,oBAAA;AAAA,EACE,YAAc;AAAA,EACd,MAAQ;AAAA,EACR,UAAY;AAAA,EACZ,QAAU;AAAA,EACV,aAAe;AAAA,EACf,mBAAqB;AAAA,EACrB,mBAAqB;AAAA,IACnB,EAAE,MAAQ,MAAM,MAAQ,UAAU;AAAA,IAClC,EAAE,MAAQ,cAAc,MAAQ,UAAU;AAAA,IAC1C,EAAE,MAAQ,eAAe,MAAQ,UAAU;AAAA,IAC3C,EAAE,MAAQ,gBAAgB,MAAQ,UAAU;AAAA,IAC5C,EAAE,MAAQ,aAAa,MAAQ,UAAU;AAAA,IACzC,EAAE,MAAQ,SAAS,MAAQ,UAAU;AAAA,IACrC;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,UAAY;AAAA,QACV;AAAA,UACE,MAAQ;AAAA,UACR,cAAgB;AAAA,UAChB,cAAgB;AAAA,UAChB,QAAU,EAAE,UAAY,WAAW;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,MAAQ,YAAY,MAAQ,SAAS;AAAA,IACvC,EAAE,MAAQ,cAAc,MAAQ,OAAO;AAAA,EACzC;AACF;;;AC7BA,IAAAC,oBAAA;AAAA,EACE,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,aAAe;AAAA,EACf,WAAa;AAAA,IACX,EAAE,MAAQ,QAAQ,UAAY,MAAM,aAAe,kCAAS,MAAQ,SAAS;AAAA,IAC7E;AAAA,MACE,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,SAAW;AAAA,MACX,aAAe;AAAA,MACf,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,SAAW;AAAA,MACX,aAAe;AAAA,MACf,MAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACrBA,IAAAC,oBAAA;AAAA,EACE,YAAc;AAAA,EACd,MAAQ;AAAA,EACR,UAAY;AAAA,EACZ,QAAU;AAAA,EACV,aAAe;AAAA,EACf,mBAAqB;AAAA,EACrB,mBAAqB;AAAA,IACnB,EAAE,MAAQ,MAAM,MAAQ,UAAU;AAAA,IAClC,EAAE,MAAQ,eAAe,MAAQ,UAAU;AAAA,IAC3C;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,UAAY;AAAA,QACV,EAAE,MAAQ,oBAAoB,cAAgB,WAAW,cAAgB,WAAW;AAAA,QACpF;AAAA,UACE,MAAQ;AAAA,UACR,cAAgB;AAAA,UAChB,cAAgB;AAAA,UAChB,QAAU,EAAE,UAAY,WAAW;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,MAAQ,WAAW,MAAQ,UAAU;AAAA,IACvC,EAAE,MAAQ,SAAS,MAAQ,UAAU;AAAA,IACrC,EAAE,MAAQ,aAAa,MAAQ,UAAU;AAAA,IACzC,EAAE,MAAQ,cAAc,MAAQ,UAAU;AAAA,IAC1C,EAAE,MAAQ,cAAc,MAAQ,OAAO;AAAA,IACvC,EAAE,MAAQ,cAAc,MAAQ,OAAO;AAAA,IACvC,EAAE,MAAQ,cAAc,MAAQ,OAAO;AAAA,EACzC;AACF;;;ACsBA,IAAM,WAAiE;AAAA,EACrE,SAAS;AAAA,IACP,UAAU;AAAA,MACR,UAAUC;AAAA,MACV,UAAUC;AAAA,IACZ;AAAA,IACA,oBAAoB;AAAA,MAClB,UAAUD;AAAA,MACV,UAAUC;AAAA,IACZ;AAAA,IACA,oBAAoB;AAAA,MAClB,UAAUD;AAAA,MACV,UAAUC;AAAA,IACZ;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH,UAAU;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,cAAc;AAAA,MACZ,UAAUD;AAAA,MACV,UAAUC;AAAA,IACZ;AAAA,EACF;AACF;AAEO,SAAS,aAAa,MAAoB,MAAqC;AACpF,SAAO,SAAS,IAAI,IAAI,IAAI,KAAK;AACnC;AAEO,SAAS,gBAKb;AACD,QAAM,MAKD,CAAC;AACN,aAAW,QAAQ,OAAO,KAAK,QAAQ,GAAqB;AAC1D,eAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,SAAS,IAAI,CAAC,GAAG;AACtD,UAAI,KAAK;AAAA,QACP;AAAA,QACA;AAAA,QACA,aAAa,EAAE,SAAS;AAAA,QACxB,WAAW,EAAE,SAAS;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,yBAAyB,QAAwB;AAC/D,SAAO,GAAG,MAAM,IAAI,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACxF;AAEA,SAAS,YAAY,GAAW,QAAyC;AACvE,SAAO,EAAE;AAAA,IAAQ;AAAA,IAAkB,CAAC,IAAI,MACtC,OAAO,CAAC,MAAM,SAAY,OAAO,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC;AAAA,EACtD;AACF;AACA,SAAS,YAAY,KAAc,QAA0C;AAC3E,MAAI,OAAO,QAAQ,SAAU,QAAO,YAAY,KAAK,MAAM;AAC3D,MAAI,MAAM,QAAQ,GAAG,EAAG,QAAO,IAAI,IAAI,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC;AACpE,MAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,UAAM,MAA+B,CAAC;AACtC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAA8B;AAChE,UAAI,CAAC,IAAI,YAAY,GAAG,MAAM;AAChC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,SAAS,eACd,GACA,MACyB;AACzB,QAAM,SAAkC,CAAC;AACzC,QAAM,UAAoB,CAAC;AAC3B,aAAW,OAAO,EAAE,SAAS,WAAW;AACtC,QAAI,KAAK,IAAI,IAAI,MAAM,OAAW,QAAO,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI;AAAA,aACzD,IAAI,YAAY,OAAW,QAAO,IAAI,IAAI,IAAI,IAAI;AAAA,aAClD,IAAI,SAAU,SAAQ,KAAK,IAAI,IAAI;AAAA,EAC9C;AACA,MAAI,QAAQ,SAAS,EAAG,OAAM,IAAI,MAAM,iCAAiC,QAAQ,KAAK,IAAI,CAAC,EAAE;AAC7F,SAAO,YAAY,EAAE,UAAU,MAAM;AACvC;;;AC7HA,SAAS,YAAY,MAAoB,MAAc,MAA+B;AACpF,QAAM,IAAI,aAAa,MAAM,IAAI;AACjC,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,uBAAuB,IAAI,IAAI,IAAI,EAAE;AAC7D,QAAM,SAAS,EAAE,GAAG,KAAK;AACzB,MAAI,SAAS,aAAa,CAAC,OAAO,mBAAmB;AACnD,WAAO,oBAAoB,yBAAyB,YAAY,EAAE,SAAS,IAAI,EAAE;AAAA,EACnF;AACA,SAAO,eAAe,GAAG,MAAM;AACjC;AAEO,SAAS,UAAU,KAAqB;AAC7C,SAAO;AAAA,IACL,MAAM,MAAM,cAAc,GAAG;AAAA,IAC7B,MAAM,CAAC,OAAe,SAA2B,iBAAiB,KAAK,OAAO,IAAI;AAAA,IAClF,MAAM,CAAC,OAAe,YAAoB,SACxC,gBAAgB,KAAK,OAAO,YAAY,IAAI;AAAA,IAC9C,KAAK,CAAC,OAAe,KAAa,SAAiB,kBAAkB,KAAK,OAAO,KAAK,IAAI;AAAA,IAC1F,QAAQ,CAAC,SAAkB,eAAe,KAAK,IAAI;AAAA,IACnD,WAAW,MAAM,cAAc;AAAA;AAAA,IAE/B,eAAe,CAAC,UAAkB,SAChC,kBAAkB,KAAK,YAAY,WAAW,UAAU,IAAI,CAAC;AAAA;AAAA,IAE/D,WAAW,CAAC,UAAkB,SAC5B,0BAA0B,KAAK,YAAY,OAAO,UAAU,IAAI,CAAC;AAAA,EACrE;AACF;;;AC/CA,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,WAAAC,gBAAe;;;ACSxB,IAAMC,QAAO;AACb,IAAM,OAAO;AAEb,SAAS,OAAO,MAAc,MAAsB;AAClD,SAAO,GAAGA,KAAI,IAAI,mBAAmB,IAAI,CAAC,IAAI,IAAI;AACpD;AAOA,eAAsB,UACpB,KACA,WACA,OAA4B,CAAC,GACX;AAClB,WAAS,GAAG;AACZ,QAAM,MAAM,IAAI,IAAI,GAAG,IAAI,OAAO,GAAG,IAAI,EAAE;AAC3C,MAAI,aAAa,IAAI,UAAU,KAAK,UAAU,MAAM;AACpD,QAAM,OAAO,IAAI,SAAS;AAC1B,OAAK;AAAA,IACH;AAAA,IACA,IAAI,KAAK,CAAC,IAAI,WAAW,SAAS,CAAC,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAAA,IAC1E;AAAA,EACF;AAEA,QAAM,MAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,QAAQ,SAAS,aAAa,GAAG,GAAG,MAAM,KAAK,CAAC;AACvF,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,UAAU,IAAI,QAAQ,IAAI,YAAY,IAAI;AACjE,SAAO,OAAO,KAAK,MAAM,IAAI,IAAI;AACnC;AAMA,eAAsB,YACpB,KACA,MACA,OAA4B,CAAC,GACZ;AACjB,WAAS,GAAG;AACZ,QAAM,MAAM,IAAI,IAAI,GAAG,IAAI,OAAO,GAAG,IAAI,IAAI,mBAAmB,IAAI,CAAC,EAAE;AACvE,MAAI,aAAa,IAAI,UAAU,KAAK,UAAU,MAAM;AACpD,QAAM,MAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,OAAO,SAAS,aAAa,GAAG,EAAE,CAAC;AAC1E,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,UAAU,IAAI,QAAQ,IAAI,YAAY,MAAM,IAAI,KAAK,CAAC;AAC7E,SAAO,OAAO,KAAK,MAAM,IAAI,YAAY,CAAC;AAC5C;AAGO,SAAS,iBAAiB,KAAuC;AACtE,SAAO,QAAQ,KAAK,+BAA+B;AACrD;AAGO,SAAS,kBACd,KACA,MACA,MACkB;AAClB,SAAO,QAAQ,KAAK,OAAO,MAAM,qBAAqB,GAAG,EAAE,QAAQ,QAAQ,KAAK,CAAC;AACnF;AAEO,SAAS,kBAAkB,KAAqB,MAAgC;AACrF,SAAO,QAAQ,KAAK,OAAO,MAAM,gBAAgB,CAAC;AACpD;AACO,SAAS,gBAAgB,KAAqB,MAAc,MAAgC;AACjG,SAAO,QAAQ,KAAK,OAAO,MAAM,kBAAkB,mBAAmB,IAAI,CAAC,EAAE,CAAC;AAChF;AACO,SAAS,mBACd,KACA,MACA,MACkB;AAClB,SAAO,QAAQ,KAAK,OAAO,MAAM,gBAAgB,GAAG,EAAE,QAAQ,QAAQ,KAAK,CAAC;AAC9E;AACO,SAAS,mBACd,KACA,MACA,MACA,MACkB;AAClB,SAAO,QAAQ,KAAK,OAAO,MAAM,kBAAkB,mBAAmB,IAAI,CAAC,EAAE,GAAG;AAAA,IAC9E,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACH;AACO,SAAS,mBACd,KACA,MACA,MACkB;AAClB,SAAO,QAAQ,KAAK,OAAO,MAAM,kBAAkB,mBAAmB,IAAI,CAAC,EAAE,GAAG;AAAA,IAC9E,QAAQ;AAAA,EACV,CAAC;AACH;AACO,SAAS,uBACd,KACA,MACA,MACA,MACkB;AAClB,SAAO,QAAQ,KAAK,OAAO,MAAM,kBAAkB,mBAAmB,IAAI,CAAC,eAAe,GAAG;AAAA,IAC3F,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACH;AACO,SAAS,0BACd,KACA,MACA,MACA,OACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,OAAO,MAAM,kBAAkB,mBAAmB,IAAI,CAAC,iBAAiB,KAAK,EAAE;AAAA,IAC/E;AAAA,MACE,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,KAAqB,MAAgC;AACvF,SAAO,QAAQ,KAAK,OAAO,MAAM,kBAAkB,CAAC;AACtD;AACO,SAAS,kBACd,KACA,MACA,YACkB;AAClB,SAAO,QAAQ,KAAK,OAAO,MAAM,oBAAoB,mBAAmB,UAAU,CAAC,EAAE,CAAC;AACxF;AAEO,SAAS,qBACd,KACA,MACA,MACkB;AAClB,SAAO,QAAQ,KAAK,OAAO,MAAM,kBAAkB,GAAG,EAAE,QAAQ,QAAQ,KAAK,CAAC;AAChF;AACO,SAAS,qBACd,KACA,MACA,YACA,MACkB;AAClB,SAAO,QAAQ,KAAK,OAAO,MAAM,oBAAoB,mBAAmB,UAAU,CAAC,EAAE,GAAG;AAAA,IACtF,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACH;AACO,SAAS,wBACd,KACA,MACA,YACA,MACkB;AAClB,SAAO,QAAQ,KAAK,OAAO,MAAM,oBAAoB,mBAAmB,UAAU,CAAC,SAAS,GAAG;AAAA,IAC7F,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACH;AACO,SAAS,sBACd,KACA,MACA,KACkB;AAClB,SAAO,QAAQ,KAAK,OAAO,MAAM,oBAAoB,GAAG,EAAE,GAAG,EAAE,QAAQ,SAAS,CAAC;AACnF;AAEO,SAAS,SAAS,KAAqB,MAAgC;AAC5E,SAAO,QAAQ,KAAK,OAAO,MAAM,MAAM,CAAC;AAC1C;AACO,SAAS,OAAO,KAAqB,MAAc,OAAiC;AACzF,SAAO,QAAQ,KAAK,OAAO,MAAM,QAAQ,mBAAmB,KAAK,CAAC,EAAE,CAAC;AACvE;AACO,SAAS,YAAY,KAAqB,MAAc,OAAiC;AAC9F,SAAO,QAAQ,KAAK,OAAO,MAAM,QAAQ,mBAAmB,KAAK,CAAC,QAAQ,CAAC;AAC7E;AACO,SAAS,WAAW,KAAqB,MAAc,KAA+B;AAC3F,SAAO,QAAQ,KAAK,OAAO,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,QAAQ,SAAS,CAAC;AACvE;;;AC5LA,SAAS,SAAS;AAKlB,IAAM,YAAY;AAEX,IAAM,YAAY,EAAE,KAAK,CAAC,SAAS,WAAW,CAAC;AAI/C,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,MAAM;AAAA,EACN,kBAAkB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC/C,kBAAkB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC/C,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AACzD,CAAC;AAKM,IAAM,YAAY,EACtB,OAAO;AAAA,EACN,IAAI,EAAE,OAAO;AAAA,EACb,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,MAAM,UAAU,SAAS;AAAA,EACzB,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AACxC,CAAC,EACA,YAAY;AAIf,eAAsB,gBACpB,KACA,KACoB;AACpB,QAAM,IAAI,uBAAuB,MAAM,GAAG;AAG1C,QAAM,OAAO;AAAA,IACX,aAAa,EAAE;AAAA,IACf,MAAM,EAAE;AAAA,IACR,GAAI,EAAE,kBAAkB,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,KAAK,GAAG,EAAE,IAAI,CAAC;AAAA,IACvF,GAAI,EAAE,kBAAkB,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,KAAK,GAAG,EAAE,IAAI,CAAC;AAAA,IACvF,GAAI,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAClE,GAAI,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,IAAI,CAAC;AAAA,EACvE;AACA,QAAM,MAAM,MAAM,QAAiB,KAAK,GAAG,SAAS,gBAAgB,EAAE,QAAQ,QAAQ,KAAK,CAAC;AAC5F,SAAO,UAAU,MAAM,GAAG;AAC5B;AAGA,eAAsB,aAAa,KAAqB,QAAoC;AAC1F,QAAM,MAAM,MAAM,QAAiB,KAAK,GAAG,SAAS,gBAAgB,mBAAmB,MAAM,CAAC,EAAE;AAChG,SAAO,UAAU,MAAM,GAAG;AAC5B;AAQA,eAAsB,aACpB,KACA,OAA4B,CAAC,GACX;AAClB,SAAO,QAAQ,KAAK,GAAG,SAAS,aAAa;AAAA,IAC3C,OAAO,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO;AAAA,EAClD,CAAC;AACH;AAEO,SAAS,WAAW,KAAqB,IAA8B;AAC5E,SAAO,QAAQ,KAAK,GAAG,SAAS,aAAa,mBAAmB,EAAE,CAAC,EAAE;AACvE;AAaO,SAAS,cAAc,KAAqB,KAA6C;AAC9F,SAAO,QAAQ,KAAK,GAAG,SAAS,aAAa;AAAA,IAC3C,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,MAAM,IAAI;AAAA,MACV,gBAAgB,IAAI;AAAA,MACpB,kBAAkB,IAAI;AAAA,MACtB,GAAI,IAAI,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,MACrC,GAAI,IAAI,cAAc,EAAE,aAAa,IAAI,YAAY,IAAI,CAAC;AAAA,MAC1D,GAAI,IAAI,YAAY,SAAY,EAAE,SAAS,IAAI,QAAQ,IAAI,CAAC;AAAA,IAC9D;AAAA,EACF,CAAC;AACH;AAGO,SAAS,cAAc,KAAqB,IAA8B;AAC/E,SAAO,QAAQ,KAAK,GAAG,SAAS,aAAa,mBAAmB,EAAE,CAAC,WAAW,EAAE,QAAQ,OAAO,CAAC;AAClG;AAGO,SAAS,gBAAgB,KAAqB,IAAY,OAAO,MAAwB;AAC9F,SAAO,QAAQ,KAAK,GAAG,SAAS,aAAa,mBAAmB,EAAE,CAAC,aAAa;AAAA,IAC9E,QAAQ;AAAA,IACR,OAAO,EAAE,KAAK;AAAA,IACd,WAAW;AAAA,EACb,CAAC;AACH;AAGO,SAAS,qBACd,KACA,IACA,UACkB;AAClB,SAAO,QAAQ,KAAK,GAAG,SAAS,aAAa,mBAAmB,EAAE,CAAC,cAAc;AAAA,IAC/E,OAAO,EAAE,UAAU,YAAY,OAAU;AAAA,EAC3C,CAAC;AACH;AAGO,SAAS,oBAAoB,KAAqB,KAAiC;AACxF,SAAO;AAAA,IACL;AAAA,IACA,GAAG,SAAS,aAAa,IAAI,IAAI,kBAAkB,EAAE,KAAK,GAAG,CAAC;AAAA,EAChE;AACF;AAEO,SAAS,mBAAmB,KAAuC;AACxE,SAAO,QAAQ,KAAK,GAAG,SAAS,oBAAoB,EAAE,OAAO,EAAE,MAAM,QAAQ,OAAO,MAAM,EAAE,CAAC;AAC/F;AAEO,SAAS,iBAAiB,KAAqB,MAAgC;AACpF,SAAO,QAAQ,KAAK,GAAG,SAAS,oBAAoB,mBAAmB,IAAI,CAAC,EAAE;AAChF;;;AC3IA,SAAS,cAAAC,aAAY,gBAAAC,eAAc,eAAAC,cAAa,gBAAgB;AAChE,SAAS,QAAAC,aAAY;AAgBrB,SAAS,SAAS,MAA+B;AAC/C,QAAM,IAAI,KAAK,KAAK;AACpB,MAAI,CAAC,EAAE,WAAW,GAAG,EAAG,QAAO;AAE/B,SAAO,EACJ,QAAQ,OAAO,EAAE,EACjB,QAAQ,OAAO,EAAE,EACjB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACxB;AAEA,SAAS,UAAU,OAA0B;AAC3C,SAAO,MAAM,SAAS,KAAK,MAAM,MAAM,CAAC,MAAM,cAAc,KAAK,CAAC,KAAK,MAAM,EAAE;AACjF;AAGA,SAAS,QAAQ,MAAc,WAAkC;AAC/D,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,QAAI,UAAU,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG;AAClC,cAAQ,IAAI;AACZ;AAAA,IACF;AAAA,EACF;AACA,MAAI,UAAU,GAAI,QAAO;AACzB,QAAM,MAAgB,CAAC;AACvB,WAAS,IAAI,OAAO,IAAI,MAAM,QAAQ,KAAK,GAAG;AAC5C,QAAI,YAAY,KAAK,MAAM,CAAC,KAAK,EAAE,EAAG;AACtC,QAAI,KAAK,MAAM,CAAC,KAAK,EAAE;AAAA,EACzB;AACA,SAAO,IAAI,KAAK,IAAI;AACtB;AAGA,SAAS,SAAS,QAAkB,SAAyB;AAC3D,SAAO,OAAO,UAAU,CAAC,MAAM,QAAQ,KAAK,CAAC,CAAC;AAChD;AAGA,SAAS,gBAAgB,MAAkC;AACzD,QAAM,MAAM,QAAQ,MAAM,iCAAiC;AAC3D,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,SAA0B;AAC9B,aAAW,QAAQ,IAAI,MAAM,IAAI,GAAG;AAClC,UAAM,QAAQ,SAAS,IAAI;AAC3B,QAAI,CAAC,SAAS,UAAU,KAAK,EAAG;AAChC,QAAI,CAAC,QAAQ;AACX,eAAS;AACT;AAAA,IACF;AACA,UAAM,UAAU,KAAK,IAAI,GAAG,SAAS,QAAQ,UAAU,CAAC;AACxD,UAAM,QAAQ,SAAS,QAAQ,SAAS;AACxC,UAAM,QAAQ,MAAM,OAAO,KAAK,IAAI,YAAY;AAChD,UAAM,MAAM,MAAM,SAAS,IAAI,QAAQ,CAAC,KAAK,IAAI,KAAK;AACtD,QAAI,SAAS,cAAc,GAAI,QAAO;AAAA,EACxC;AACA,SAAO;AACT;AAGA,SAAS,aAAa,MAAmC;AACvD,QAAM,MAAM,oBAAI,IAAoB;AACpC,QAAM,MAAM,QAAQ,MAAM,kCAAkC;AAC5D,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,SAA0B;AAC9B,aAAW,QAAQ,IAAI,MAAM,IAAI,GAAG;AAClC,UAAM,QAAQ,SAAS,IAAI;AAC3B,QAAI,CAAC,SAAS,UAAU,KAAK,EAAG;AAChC,QAAI,CAAC,QAAQ;AACX,eAAS;AACT;AAAA,IACF;AACA,UAAM,UAAU,KAAK,IAAI,GAAG,SAAS,QAAQ,wBAAwB,CAAC;AACtE,UAAM,SAAS,SAAS,QAAQ,yBAAyB;AACzD,UAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,QAAI,CAAC,KAAM;AACX,QAAI,IAAI,OAAO,UAAU,IAAI,MAAM,MAAM,IAAI,WAAc,IAAI;AAAA,EACjE;AACA,SAAO;AACT;AASA,SAAS,YAAY,MAAmD;AACtE,QAAM,QAAQ,oBAAI,IAAY;AAC9B,MAAI;AAEJ,QAAM,OAAO,CAAC,QAAuB;AACnC,QAAI,CAAC,IAAK;AACV,QAAI,SAA0B;AAC9B,eAAW,QAAQ,IAAI,MAAM,IAAI,GAAG;AAClC,YAAM,QAAQ,SAAS,IAAI;AAC3B,UAAI,CAAC,SAAS,UAAU,KAAK,EAAG;AAChC,UAAI,CAAC,QAAQ;AACX,iBAAS;AACT;AAAA,MACF;AACA,YAAM,UAAU,KAAK,IAAI,GAAG,SAAS,QAAQ,wBAAwB,CAAC;AACtE,YAAM,SAAS,SAAS,QAAQ,+BAA+B;AAC/D,YAAM,MAAM,UAAU,IAAK,MAAM,MAAM,KAAK,KAAM;AAClD,UAAI,UAAU,KAAK,GAAG,GAAG;AACvB,cAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,YAAI,KAAM,OAAM,IAAI,IAAI;AACxB,cAAM,IAAI,IAAI,MAAM,8BAA8B;AAClD,YAAI,IAAI,CAAC,EAAG,SAAQ,EAAE,CAAC;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,OAAK,QAAQ,MAAM,wCAAwC,CAAC;AAC5D,OAAK,QAAQ,MAAM,kCAAkC,CAAC;AACtD,SAAO,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG;AAC1D;AAGA,SAAS,SAAS,MAAkC;AAClD,QAAM,QAAQ,CAAC,MAAc,EAAE,QAAQ,MAAM,EAAE,EAAE,MAAM,MAAM,EAAE,CAAC,GAAG,KAAK,KAAK;AAE7E,QAAM,OAAO,KAAK,MAAM,+CAA+C;AACvE,MAAI,OAAO,CAAC,GAAG,KAAK,EAAG,QAAO,MAAM,KAAK,CAAC,CAAC;AAC3C,QAAM,KACJ,KAAK,MAAM,6CAA6C,KACxD,KAAK,MAAM,iDAAiD;AAC9D,MAAI,KAAK,CAAC,GAAG,KAAK,EAAG,QAAO,MAAM,GAAG,CAAC,CAAC;AACvC,SAAO;AACT;AAGA,SAAS,cAAc,MAAkC;AACvD,MAAI,CAAC,KAAK,WAAW,KAAK,EAAG,QAAO;AACpC,QAAM,MAAM,KAAK,QAAQ,SAAS,CAAC;AACnC,MAAI,QAAQ,GAAI,QAAO;AACvB,QAAM,IAAI,KAAK,MAAM,GAAG,GAAG,EAAE,MAAM,yBAAyB;AAC5D,SAAO,IAAI,CAAC,GAAG,QAAQ,gBAAgB,EAAE;AAC3C;AAGO,SAAS,qBAAqB,MAAc,eAAe,IAAwB;AACxF,QAAM,aAAa,gBAAgB,IAAI;AACvC,MAAI,CAAC,cAAc,WAAW,SAAS,IAAI,EAAG,QAAO;AACrD,QAAM,EAAE,OAAO,MAAM,IAAI,YAAY,IAAI;AACzC,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,SAAS,aAAa,IAAI;AAChC,QAAM,kBAAkB,MAAM,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,KAAK,CAAC;AAC3D,SAAO;AAAA,IACL,YAAY,cAAc,IAAI,KAAK;AAAA,IACnC;AAAA,IACA;AAAA,IACA,GAAI,SAAS,IAAI,IAAI,EAAE,UAAU,SAAS,IAAI,EAAE,IAAI,CAAC;AAAA,IACrD,GAAI,QAAQ,EAAE,gBAAgB,MAAM,IAAI,CAAC;AAAA,EAC3C;AACF;AAGO,SAAS,oBAAoB,KAA4B;AAC9D,QAAM,QAAQA,MAAK,KAAK,cAAc;AACtC,MAAI,CAACH,YAAW,KAAK,KAAK,CAAC,SAAS,KAAK,EAAE,YAAY,EAAG,QAAO,CAAC;AAClE,QAAM,UAAyB,CAAC;AAChC,aAAW,KAAKE,aAAY,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,CAAC,GAAG;AACpE,UAAM,OAAO,EAAE,QAAQ,UAAU,EAAE;AACnC,UAAM,SAAS,qBAAqBD,cAAaE,MAAK,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI;AAC9E,QAAI,OAAQ,SAAQ,KAAK,MAAM;AAAA,EACjC;AACA,SAAO;AACT;;;ACrMA,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AAExB,IAAM,cACJ;AAIK,SAAS,mBAAmB,SAAyB;AAC1D,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,SAAS,UAAU,OAAO,CAAC,MAAM,KAAK,MAAM,KAAK,GAAG,GAAG;AAAA,IAC3D,WAAW,OAAO,OAAO;AAAA,IACzB,KAAK,EAAE,GAAG,QAAQ,KAAK,kBAAkB,IAAI;AAAA,EAC/C,CAAC;AACD,MAAI,OAAO,SAAU,OAAO,MAAgC,SAAS,UAAU;AAC7E,UAAM,IAAI,MAAM,WAAW;AAAA,EAC7B;AACA,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MAAM,oBAAoB,OAAO,QAAQ,SAAS,KAAK,OAAO,MAAM,EAAE;AAAA,EAClF;AACA,SAAO,OAAO;AAChB;AAGO,SAAS,sBAAsB,WAAmB,SAAuB;AAC9E,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,SAAS,UAAU,OAAO,CAAC,MAAM,KAAK,MAAM,GAAG,GAAG;AAAA,IACtD,OAAO;AAAA,IACP,WAAW,OAAO,OAAO;AAAA,EAC3B,CAAC;AACD,MAAI,OAAO,SAAU,OAAO,MAAgC,SAAS,UAAU;AAC7E,UAAM,IAAI,MAAM,WAAW;AAAA,EAC7B;AACA,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MAAM,uBAAuB,OAAO,QAAQ,SAAS,KAAK,OAAO,MAAM,EAAE;AAAA,EACrF;AACF;;;ACpCA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,MAAM,gBAAgB;AAC/B,SAAS,UAAU,WAAAC,gBAAe;AAClC,SAAS,aAAa;AAQtB,eAAsB,aAAa,UAAoC;AACrE,MAAI,UAAU,MAAM,SAAS,UAAU,MAAM;AAC7C,MAAI,QAAQ,WAAW,CAAC,MAAM,MAAQ,WAAU,QAAQ,MAAM,CAAC;AAE/D,QAAM,UAAU,MAAM,SAAS;AAAA,IAC7B,SAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,MAAM;AAAA,IACN,oBAAoB;AAAA,EACtB,CAAC;AAED,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,aAAa,MAAM,SAAS;AAAA,MAChC,SAAS;AAAA,MACT,kBAAkB;AAAA,MAClB,MAAM;AAAA,MACN,IAAI;AAAA,IACN,CAAC;AACD,WAAO,EAAE,SAAS,WAAW,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,EAAE;AAAA,EAClD;AAEA,QAAMC,WAAU,OAAO,KAAK,QAAQ,CAAC,CAA2B;AAChE,QAAM,OAAO,QAAQ,IAAI,CAAC,QAAQ;AAChC,UAAM,MAAqC,CAAC;AAC5C,eAAW,KAAKA,SAAS,KAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,OAAQ,IAAI,CAAC,KAAK;AACpE,WAAO;AAAA,EACT,CAAC;AACD,SAAO,EAAE,SAAAA,UAAS,KAAK;AACzB;AAGO,SAAS,eAAe,UAAkB,SAAS,IAAY;AACpE,QAAM,OAAO,SAAS,QAAQ,EAAE,QAAQ,WAAW,EAAE;AACrD,SAAO,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ,kBAAkB,GAAG,EAAE,QAAQ,SAAS,KAAK;AACjF;AAEO,SAAS,aAAgB,MAAW,WAA0B;AACnE,QAAM,MAAa,CAAC;AACpB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,UAAW,KAAI,KAAK,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC;AACtF,SAAO;AACT;AAOO,SAAS,mBAAmBA,UAAmC;AACpE,SAAOA,SAAQ,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,GAAG,QAAQ,EAAE,MAAM,WAAW,eAAe,EAAE,EAAE;AAClG;AAYO,SAAS,eAAe,MAA+C;AAC5E,SAAO;AAAA,IACL,OAAO,cAAc,KAAK,SAAS;AAAA,IACnC,aAAa,yBAAyB,KAAK,SAAS;AAAA,IACpD,gBAAgB,EAAE,UAAU,2BAA2B;AAAA,IACvD,OAAO;AAAA,MACL,EAAE,IAAI,gBAAgB,OAAO,WAAW,UAAU,mBAAmB,YAAY,CAAC,EAAE;AAAA,MACpF;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,UAAU;AAAA,QACV,YAAY;AAAA,UACV,iBAAiB,KAAK;AAAA,UACtB,eAAe,KAAK;AAAA,UACpB,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,cAAc;AAAA,UACd,MAAM,KAAK;AAAA,UACX,mBAAmB,KAAK;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAGA,eAAsB,aAAa,SAAoC;AACrE,QAAM,MAAgB,CAAC;AACvB,aAAW,QAAQ,QAChB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,GAAG;AAClB,QAAI,KAAK,SAAS,GAAG,KAAK,KAAK,SAAS,GAAG,GAAG;AAC5C,uBAAiB,SAAS,KAAK,IAAI,GAAG;AACpC,cAAM,IAAI,OAAO,KAAK;AACtB,YAAI,UAAU,KAAK,CAAC,EAAG,KAAI,KAAKD,SAAQ,CAAC,CAAC;AAAA,MAC5C;AAAA,IACF,OAAO;AACL,MAAAD,UAASC,SAAQ,IAAI,CAAC;AACtB,UAAI,KAAKA,SAAQ,IAAI,CAAC;AAAA,IACxB;AAAA,EACF;AACA,MAAI,IAAI,WAAW,EAAG,OAAM,IAAI,MAAM,yBAAyB,OAAO,EAAE;AACxE,SAAO;AACT;;;AC7GO,IAAM,gBAAgB,CAAC,MAAM,OAAO,IAAI;AACxC,IAAM,gBAAgB,CAAC,QAAQ,SAAS,SAAS,gBAAgB,aAAa;AA0B9E,SAAS,iBACd,OACA,MACsE;AACtE,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO,EAAE,IAAI,MAAM,YAAY,CAAC,GAAG,YAAY,EAAE;AAEjF,QAAM,aAA4B,MAAM,QACrC,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,MAAM,aAAa,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAC1F,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,EAAE,WAAW;AAE/C,QAAM,OAAO,WAAW,OAAO,CAAC,MAAM,EAAE,gBAAgB,KAAK,MAAM;AACnE,MAAI,KAAK,WAAW,EAAG,QAAO,EAAE,IAAI,MAAM,YAAY,YAAY,KAAK,OAAO;AAE9E,QAAM,QAAQ,KAAK,KAAK,CAAC,MAAM;AAC7B,UAAM,QAAQ,EAAE,KAAK,YAAY;AACjC,WAAO,cAAc,KAAK,CAAC,MAAM,UAAU,KAAK,MAAM,SAAS,IAAI,CAAC,EAAE,CAAC;AAAA,EACzE,CAAC;AACD,SAAO,EAAE,IAAI,OAAO,QAAS,KAAK,CAAC,EAAkB,MAAM,YAAY,YAAY,KAAK,OAAO;AACjG;AAEA,SAAS,iBAAiB,OAA4B;AAGpD,QAAM,WAAW,IAAI,IAAI,MAAM,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACzD,MAAI,MAAM,QAAQ,MAAM,WAAW,KAAK,MAAM,YAAY,SAAS,GAAG;AACpE,WAAO,MAAM,YAAY,OAAO,CAAC,MAAM,SAAS,IAAI,CAAC,CAAC;AAAA,EACxD;AACA,SAAO,MAAM,QAAQ,OAAO,CAAC,MAAM,EAAE,iBAAiB,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAC/E;AAGO,SAAS,kBACd,OACAE,aACA,UACc;AACd,MAAI,SAAU,QAAO,EAAE,IAAI,UAAU,QAAQ,WAAW;AAExD,QAAM,YAAY,iBAAiB,KAAK;AACxC,MAAI,UAAU,WAAW,EAAG,QAAO,EAAE,IAAI,UAAU,CAAC,GAAa,QAAQ,SAAS;AAClF,MAAI,UAAU,SAAS,EAAG,QAAO,EAAE,IAAI,MAAM,QAAQ,aAAa,WAAW,UAAU;AAEvF,QAAM,SAAS,iBAAiB,OAAOA,WAAU;AACjD,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,QAAQ;AAAA,IACR,YAAY,OAAO;AAAA,IACnB,YAAY,OAAO;AAAA,EACrB;AACF;AAGO,SAAS,iBAAiB,OAAkB,YAA4B;AAC7E,aAAW,OAAO,MAAM,SAAS;AAC/B,QAAI,cAAc,KAAK,CAAC,MAAM,IAAI,KAAK,YAAY,EAAE,SAAS,CAAC,CAAC,EAAG,QAAO,IAAI;AAAA,EAChF;AACA,SAAO;AACT;AAGO,SAAS,WAAW,OAAuC;AAChE,QAAM,MAA8B,CAAC;AACrC,aAAW,QAAQ,MAChB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,GAAG;AAClB,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,QAAI,OAAO,KAAK,OAAO,KAAK,SAAS,GAAG;AACtC,YAAM,IAAI,MAAM,2BAA2B,IAAI,qCAAqC;AAAA,IACtF;AACA,QAAI,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,MAAM,CAAC,EAAE,KAAK;AAAA,EAC5D;AACA,SAAO;AACT;AAGO,SAAS,qBAAqB,OAAyC;AAC5E,QAAM,MAAgC,CAAC;AACvC,aAAW,QAAQ,MAChB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,GAAG;AAClB,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,QAAI,OAAO,KAAK,OAAO,KAAK,SAAS,GAAG;AACtC,YAAM,IAAI;AAAA,QACR,qCAAqC,IAAI;AAAA,MAC3C;AAAA,IACF;AACA,UAAM,OAAO,KACV,MAAM,MAAM,CAAC,EACb,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,QAAI,KAAK,SAAS,EAAG,KAAI,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,IAAI;AAAA,EACxD;AACA,SAAO;AACT;AAGO,SAAS,uBACd,WACA,QACQ;AACR,QAAM,QAAQ,CAAC,+CAA+C,SAAS,IAAI;AAC3E,MAAI,OAAO,eAAe,GAAG;AAC3B,UAAM,KAAK,mEAA8D;AAAA,EAC3E,OAAO;AACL,UAAM,KAAK,oCAAoC,OAAO,UAAU,cAAc;AAC9E,UAAM,KAAK,kCAAkC;AAC7C,eAAW,KAAK,OAAO,WAAW,MAAM,GAAG,CAAC,GAAG;AAC7C,YAAM,KAAK,OAAO,EAAE,IAAI,KAAK,EAAE,WAAW,SAAS;AAAA,IACrD;AAAA,EACF;AACA,QAAM,KAAK,IAAI,mCAAmC,SAAS,WAAW;AACtE,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACxFA,SAAS,WAAW,KAAuC;AACzD,MAAI,IAAI,mBAAmB,KAAM,QAAO;AACxC,SAAO,OAAO,IAAI,eAAe,YAAY,IAAI,WAAW,YAAY,MAAM;AAChF;AAEA,SAAS,YAAY,QAAmC;AACtD,QAAM,MAAM,OAAO,iBAAiB,WAAW,CAAC;AAChD,QAAM,WAAW,MAAM,QAAQ,OAAO,YAAY,IAC7C,OAAO,aAAa,OAAO,CAAC,MAAM,OAAO,MAAM,QAAQ,IACxD,CAAC;AACL,QAAM,UAAyB,IAAI,IAAI,CAAC,MAAM;AAC5C,UAAM,OAAO,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE;AAChD,UAAM,UAAU,WAAW,CAAC,KAAK,SAAS,SAAS,IAAI;AACvD,WAAO;AAAA,MACL;AAAA,MACA,MAAM,OAAO,EAAE,QAAQ,EAAE,cAAc,SAAS;AAAA,MAChD,GAAI,UAAU,EAAE,cAAc,KAAK,IAAI,CAAC;AAAA,IAC1C;AAAA,EACF,CAAC;AACD,QAAM,MACJ,SAAS,SAAS,IAAI,WAAW,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAC1F,SAAO;AAAA,IACL,MAAM,OAAO,OAAO,QAAQ,EAAE;AAAA,IAC9B;AAAA,IACA,GAAI,IAAI,SAAS,IAAI,EAAE,aAAa,IAAI,IAAI,CAAC;AAAA,EAC/C;AACF;AAEA,SAAS,QAAQ,GAAuB;AACtC,MAAI,MAAM,QAAQ,CAAC,EAAG,QAAO;AAC7B,MAAI,KAAK,OAAO,MAAM,UAAU;AAC9B,UAAM,IAAI;AACV,QAAI,MAAM,QAAQ,EAAE,OAAO,EAAG,QAAO,EAAE;AACvC,QAAI,MAAM,QAAQ,EAAE,IAAI,EAAG,QAAO,EAAE;AAAA,EACtC;AACA,SAAO,CAAC;AACV;AAGA,eAAe,WACb,KACA,YAC+C;AAC/C,MAAI;AACF,UAAM,MAAM,MAAM,cAAc,KAAK,YAAY,EAAE,OAAO,IAAI,CAAC;AAC/D,WAAO,QAAQ,GAAG;AAAA,EACpB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAsB,kBACpB,KACA,MACkB;AAClB,QAAM,MAAM,KAAK,eAAe,MAAM;AAAA,EAAC;AACvC,QAAM,QAAQ,KAAK,SAAS,CAAC;AAG7B,QAAM,aAAa,MACjBC,eAAc,KAAK,EAAE,cAAc,KAAK,WAAW,UAAU,QAAQ,CAAC,EAAE,KAAK,OAAO;AACtF,MAAI,YAAY,MAAM,WAAW;AACjC,MAAI,UAAU,WAAW,GAAG;AAC1B,QAAI,+CAA+C;AACnD,UAAM,gBAAgB,KAAK,KAAK,WAAW,IAAI;AAC/C,gBAAY,MAAM,WAAW;AAAA,EAC/B;AACA,MAAI,UAAU,WAAW,EAAG,OAAM,IAAI,MAAM,4CAA4C;AAGxF,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,UAAU,IAAI,OAAO,MAAM;AACzB,YAAM,KAAM,EAAsB;AAClC,YAAM,SAAS,KAAK,MAAM,YAAY,KAAK,EAAE,IAAI;AACjD,aAAO,YAAY,MAAwB;AAAA,IAC7C,CAAC;AAAA,EACH;AACA,QAAM,UACJ,KAAK,UAAU,KAAK,OAAO,SAAS,IAChC,QAAQ,OAAO,CAAC,MAAM,KAAK,QAAQ,SAAS,EAAE,IAAI,CAAC,IACnD;AACN,MAAI,QAAQ,WAAW,EAAG,OAAM,IAAI,MAAM,mCAAmC;AAG7E,aAAW,QAAQ,OAAO,KAAK,KAAK,GAAG;AACrC,QAAI,CAAC,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,GAAG;AACzC,YAAM,IAAI,MAAM,sCAAsC,IAAI,IAAI;AAAA,IAChE;AAAA,EACF;AACA,QAAM,UAAkC,CAAC;AACzC,aAAW,KAAK,SAAS;AACvB,UAAM,WAAW,MAAM,EAAE,IAAI;AAC7B,QAAI,YAAY,CAAC,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,GAAG;AAC3D,YAAM,IAAI;AAAA,QACR,aAAa,QAAQ,gBAAgB,EAAE,IAAI,+BAC7B,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,MACvD;AAAA,IACF;AAEA,QAAI,MAAM,kBAAkB,GAAG,KAAK,aAAa,EAAE,IAAI,GAAG,QAAQ;AAClE,QAAI,IAAI,OAAO,QAAQ,IAAI,WAAW,UAAU;AAE9C,YAAM,UAAU,UAAU,KAAK,CAAC,MAAO,EAAwB,SAAS,EAAE,IAAI;AAG9E,YAAM,OAAO,SAAS,KAAK,MAAM,WAAW,KAAK,QAAQ,EAAE,IAAI,CAAC;AAChE,YAAM,kBAAkB,GAAG,MAAM,QAAQ;AAAA,IAC3C;AACA,QAAI,IAAI,WAAW,aAAa;AAC9B,YAAM,IAAI;AAAA,QACR,UAAU,EAAE,IAAI,mCAAmC,IAAI,aAAa,CAAC,GAAG,KAAK,IAAI,CAAC,8DAC1B,EAAE,IAAI;AAAA,MAChE;AAAA,IACF;AACA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI;AAAA,QACR,uBAAuB,EAAE,MAAM;AAAA,UAC7B,YAAY,IAAI,cAAc,CAAC;AAAA,UAC/B,YAAY,IAAI,cAAc;AAAA,QAChC,CAAC;AAAA,MACH;AAAA,IACF;AACA,YAAQ,EAAE,IAAI,IAAI,IAAI;AAAA,EACxB;AAGA,MAAI,0BAA0B,QAAQ,MAAM,cAAc;AAC1D,QAAM,UAAkC,CAAC;AACzC,aAAW,KAAK,SAAS;AACvB,UAAM,QAAQ;AAAA,MACZ,MAAM,aAAa,KAAK,EAAE,MAAM,EAAE,cAAc,KAAK,WAAW,OAAO,KAAK,CAAC;AAAA,IAC/E;AACA,UAAM,aAAc,MAAM,CAAC,GAAmC;AAC9D,QAAI,YAAY;AACd,cAAQ,EAAE,IAAI,IAAI;AAAA,IACpB,OAAO;AACL,YAAM,UAAW,MAAM,eAAe,KAAK;AAAA,QACzC,MAAM,EAAE;AAAA,QACR,WAAW,KAAK;AAAA,QAChB,kBAAkB,EAAE;AAAA,QACpB,QAAQ,EAAE,QAAQ,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,EAAE;AAAA,MAC/D,CAAC;AACD,cAAQ,EAAE,IAAI,IAAI,OAAO,QAAQ,MAAM,EAAE;AAAA,IAC3C;AAAA,EACF;AAGA,QAAM,YAAa,MAAM,uBAAuB,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC;AAGxE,QAAM,SAAS,MAAM,QAAQ,SAAS,IAAI,UAAU,CAAC,IAAI;AACzD,QAAM,OAAO,OAAO,QAAQ,MAAM,EAAE;AACpC,MAAI,8BAA8B,IAAI,EAAE;AAExC,MAAI,aAAiC;AACrC,MAAI;AAEF,UAAM,UAAU,QAAQ,IAAI,CAAC,MAAM;AACjC,YAAM,KAAK,QAAQ,EAAE,IAAI;AACzB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,EAAE;AAAA,QACR,aAAa,EAAE,MAAM,YAAY,IAAI,QAAQ,EAAE,IAAI,EAAE;AAAA,QACrD,cAAc,CAAC,EAAE;AAAA,QACjB,aAAa,iBAAiB,GAAG,EAAE;AAAA,QACnC,iBAAiB,EAAE,QAAQ,IAAI,CAAC,OAAO;AAAA,UACrC,MAAM,EAAE;AAAA,UACR,cAAc,EAAE;AAAA,UAChB,MAAM;AAAA,UACN,cAAc,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,QAAQ,UAAU;AAAA,QAC1D,EAAE;AAAA,MACJ;AAAA,IACF,CAAC;AACD,QAAI,YAAY,QAAQ,MAAM,oBAAoB;AAClD,UAAM,kBAAkB,KAAK,MAAM,OAAO;AAG1C,UAAM,SAAmD,CAAC;AAC1D,QAAI,KAAK,OAAO;AACd,UAAI,2BAA2B;AAC/B,iBAAW,KAAK,SAAS;AACvB,cAAM,YAAY,KAAK,kBAAkB,EAAE,IAAI;AAC/C,cAAM,OAAQ,MAAM,gBAAgB,KAAK;AAAA,UACvC,aAAa,QAAQ,EAAE,IAAI;AAAA,UAC3B,MAAM;AAAA,UACN,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAW;AAAA,UAC5C,GAAI,aAAa,UAAU,SAAS,IAAI,EAAE,kBAAkB,UAAU,IAAI,CAAC;AAAA,UAC3E,GAAI,KAAK,iBAAiB,EAAE,iBAAiB,KAAK,eAAe,IAAI,CAAC;AAAA,QACxE,CAAC;AACD,eAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,OAAO,KAAK,MAAM,EAAE,EAAE,CAAC;AAAA,MAC9D;AAAA,IACF;AAEA,iBAAa;AACb,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS,KAAK;AAAA,MACd,cAAc,QAAQ,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,QAAQ,EAAE,IAAI,EAAE,EAAE;AAAA,MACxE,aAAa;AAAA,IACf;AAAA,EACF,UAAE;AACA,QAAI,eAAe,QAAW;AAC5B,UAAI,KAAK,YAAY;AACnB,YAAI,sBAAsB,UAAU,4BAA4B;AAAA,MAClE,OAAO;AACL,YAAI,mBAAmB,UAAU,KAAK;AACtC,YAAI;AACF,gBAAM,uBAAuB,KAAK,UAAU;AAAA,QAC9C,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAcA,eAAsB,mBACpB,KACA,MAO0B;AAC1B,QAAM,MAAM,KAAK,eAAe,MAAM;AAAA,EAAC;AACvC,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,QAAQ,MAAM,aAAa,KAAK,KAAK;AAG3C,QAAM,UAAW,MAAM,WAAW,KAAK,KAAK,SAAS;AAIrD,QAAM,iBAAiB,QAAQ,kBAAkB,QAAQ,QAAQ;AAEjE,QAAM,SAAmB,CAAC;AAC1B,QAAM,SAAmB,CAAC;AAC1B,QAAMC,cAAmE,CAAC;AAE1E,aAAW,QAAQ,OAAO;AACxB,UAAM,YAAY,eAAe,MAAM,KAAK,eAAe,EAAE;AAC7D,UAAM,EAAE,SAAAC,UAAS,KAAK,IAAI,MAAM,aAAa,IAAI;AACjD,QAAIA,SAAQ,WAAW,KAAK,KAAK,WAAW,GAAG;AAC7C,UAAI,YAAY,SAAS,qBAAqB;AAC9C,aAAO,KAAK,SAAS;AACrB;AAAA,IACF;AACA,UAAM,gBAAgB,mBAAmBA,QAAO;AAChD,UAAM,UAAU,aAAa,MAAM,SAAS;AAC5C,QAAI;AACF,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;AAC1C,YAAI,IAAI,SAAS,WAAW,IAAI,CAAC,IAAI,QAAQ,MAAM,KAAK,QAAQ,CAAC,GAAG,MAAM,WAAW;AACrF,cAAM;AAAA,UACJ;AAAA,UACA,eAAe;AAAA,YACb,WAAW,KAAK;AAAA,YAChB;AAAA,YACA;AAAA,YACA,YAAY,IAAI;AAAA,YAChB,MAAM,QAAQ,CAAC;AAAA,YACf;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AACA,aAAO,KAAK,SAAS;AACrB,MAAAD,YAAW,SAAS,IAAI,KAAK,MAAM,GAAG,GAAG;AAAA,IAC3C,SAAS,GAAG;AACV,UAAI,IAAI,SAAS,oBAAoB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AACjF,aAAO,KAAK,SAAS;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,gBAAgB,KAAK,KAAK,WAAW,IAAI,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAC/D,SAAO,EAAE,QAAQ,QAAQ,YAAAA,YAAW;AACtC;AAkBA,eAAsB,cACpB,KACA,MACkB;AAClB,QAAM,MAAM,KAAK,eAAe,MAAM;AAAA,EAAC;AACvC,MAAI,4BAA4B;AAChC,QAAM,WAAW,MAAM,mBAAmB,KAAK;AAAA,IAC7C,WAAW,KAAK;AAAA,IAChB,OAAO,KAAK;AAAA,IACZ,aAAa,KAAK;AAAA,IAClB,WAAW,KAAK;AAAA,IAChB,YAAY;AAAA,EACd,CAAC;AACD,MAAI,SAAS,OAAO,WAAW,GAAG;AAChC,UAAM,IAAI,MAAM,+BAA+B,SAAS,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI;AAAA,EACzF;AACA,MAAI,6BAA6B,SAAS,OAAO,MAAM,cAAc;AACrE,QAAM,SAAS,MAAM,kBAAkB,KAAK;AAAA,IAC1C,WAAW,KAAK;AAAA,IAChB,MAAM,KAAK;AAAA,IACX,QAAQ,KAAK,UAAU,KAAK,OAAO,SAAS,IAAI,KAAK,SAAS,SAAS;AAAA,IACvE,OAAO,KAAK;AAAA,IACZ,OAAO,KAAK;AAAA,IACZ,iBAAiB,KAAK;AAAA,IACtB,gBAAgB,KAAK;AAAA,IACrB,YAAY,KAAK;AAAA,IACjB,YAAY,SAAS;AAAA,IACrB,YAAY;AAAA,EACd,CAAC;AACD,SAAO;AAAA,IACL,iBAAiB,SAAS;AAAA,IAC1B,gBAAgB,SAAS;AAAA,IACzB,GAAI;AAAA,EACN;AACF;;;APzUO,SAAS,GAAG,KAAqB;AACtC,SAAO;AAAA,IACL,MAAM,CAAC,SAAyB,sBAAsB,KAAK,IAAI;AAAA,IAC/D,KAAK,CAAC,MAAc,SAAwB,oBAAoB,KAAK,MAAM,IAAI;AAAA,IAC/E,QAAQ,CAAC,MAAc,OAAe,SACpC,eAAe,KAAK,MAAM,OAAO,IAAI;AAAA,IACvC,QAAQ,CAAC,SAA0B,uBAAuB,KAAK,IAAI;AAAA,IACnE,QAAQ,CAAC,MAAc,SAAkB,uBAAuB,KAAK,MAAM,IAAI;AAAA,IAC/E,QAAQ,CAAC,SAAiB,uBAAuB,KAAK,IAAI;AAAA,IAC1D,UAAU,CAAC,MAAc,SAAkB,cAAc,KAAK,MAAM,IAAI;AAAA,IACxE,YAAY,CAAC,MAAc,SAAgC,eAAe,KAAK,MAAM,IAAI;AAAA,IACzF,WAAW,CAAC,MAAc,UAAkB,aAAa,KAAK,MAAM,KAAK;AAAA,IACzE,iBAAiB,CAAC,MAAc,UAAkB,gBAAgB,KAAK,MAAM,KAAK;AAAA,IAClF,iBAAiB,CAAC,MAAc,gBAC9B,mBAAmB,KAAK,MAAM,WAAW;AAAA,IAC3C,aAAa,CAAC,MAAc,UAAkB,SAC5C,gBAAgB,KAAK,MAAM,UAAU,IAAI;AAAA,IAC3C,cAAc,CAAC,MAAc,SAAkB,aAAa,KAAK,MAAM,IAAI;AAAA,IAC3E,YAAY,CAAC,MAAc,SAA6B,YAAY,KAAK,MAAM,IAAI;AAAA,IACnF,WAAW,CAAC,MAAc,aAAqB,UAAU,KAAK,MAAM,QAAQ;AAAA,IAC5E,cAAc,CAAC,MAAc,SAAkB,aAAa,KAAK,MAAM,IAAI;AAAA,IAC3E,cAAc,CAAC,MAAc,UAAkB,SAC7C,aAAa,KAAK,MAAM,UAAU,IAAI;AAAA,IACxC,cAAc,CAAC,MAAc,aAAqB,aAAa,KAAK,MAAM,QAAQ;AAAA,IAClF,cAAc,CAAC,MAAc,SAAkB,cAAc,KAAK,MAAM,IAAI;AAAA,IAC5E,gBAAgB,CAAC,MAAc,SAAkB,eAAe,KAAK,MAAM,IAAI;AAAA,IAC/E,aAAa,CAAC,MAAc,SAA6B,gBAAgB,KAAK,MAAM,IAAI;AAAA,IACxF,iBAAiB,CAAC,MAAc,MAAc,SAC5C,yBAAyB,KAAK,MAAM,MAAM,IAAI;AAAA,IAChD,sBAAsB,CAAC,MAAc,SAAiB,wBAAwB,KAAK,MAAM,IAAI;AAAA,IAC7F,eAAe,CAAC,MAAc,OAAe,cAAc,KAAK,MAAM,gBAAgB,EAAE;AAAA,IACxF,kBAAkB,CAAC,MAAc,SAC/B,iBAAiB,KAAK,MAAM,gBAAgB,IAAI;AAAA,IAClD,kBAAkB,CAAC,MAAc,IAAY,SAC3C,iBAAiB,KAAK,MAAM,gBAAgB,IAAI,IAAI;AAAA,IACtD,kBAAkB,CAAC,MAAc,OAAe,iBAAiB,KAAK,MAAM,gBAAgB,EAAE;AAAA,IAC9F,eAAe,CAAC,MAAc,SAA6B,kBAAkB,KAAK,MAAM,IAAI;AAAA,IAC5F,iBAAiB,CAAC,MAAc,OAAe,cAAc,KAAK,MAAM,kBAAkB,EAAE;AAAA,IAC5F,oBAAoB,CAAC,MAAc,SACjC,iBAAiB,KAAK,MAAM,kBAAkB,IAAI;AAAA,IACpD,oBAAoB,CAAC,MAAc,IAAY,SAC7C,iBAAiB,KAAK,MAAM,kBAAkB,IAAI,IAAI;AAAA,IACxD,oBAAoB,CAAC,MAAc,OACjC,iBAAiB,KAAK,MAAM,kBAAkB,EAAE;AAAA,IAClD,aAAa,CAAC,MAAc,SAA6B,gBAAgB,KAAK,MAAM,IAAI;AAAA,IACxF,iBAAiB,CAAC,MAAc,MAAc,SAC5C,gBAAgB,KAAK,MAAM,MAAM,IAAI;AAAA,IACvC,mBAAmB,CAAC,MAAc,MAAc,SAC9C,kBAAkB,KAAK,MAAM,MAAM,IAAI;AAAA,IACzC,kBAAkB,CAAC,MAAc,SAAiB,oBAAoB,KAAK,MAAM,IAAI;AAAA,IACrF,eAAe,CAAC,MAAc,OAAe,cAAc,KAAK,MAAM,gBAAgB,EAAE;AAAA,IACxF,eAAe,CAAC,SAAiB,kBAAkB,KAAK,IAAI;AAAA,IAC5D,cAAc,CAAC,MAAc,SAAiB,gBAAgB,KAAK,MAAM,IAAI;AAAA,IAC7E,oBAAoB,CAAC,MAAc,SAAkB,mBAAmB,KAAK,MAAM,IAAI;AAAA,IACvF,oBAAoB,CAAC,MAAc,MAAc,SAC/C,mBAAmB,KAAK,MAAM,MAAM,IAAI;AAAA,IAC1C,oBAAoB,CAAC,MAAc,SAAiB,mBAAmB,KAAK,MAAM,IAAI;AAAA,IACtF,wBAAwB,CAAC,MAAc,MAAc,SACnD,uBAAuB,KAAK,MAAM,MAAM,IAAI;AAAA,IAC9C,2BAA2B,CAAC,MAAc,MAAc,UACtD,0BAA0B,KAAK,MAAM,MAAM,KAAK;AAAA,IAClD,iBAAiB,CAAC,SAAiB,oBAAoB,KAAK,IAAI;AAAA,IAChE,gBAAgB,CAAC,MAAc,eAAuB,kBAAkB,KAAK,MAAM,UAAU;AAAA,IAC7F,sBAAsB,CAAC,MAAc,SAAkB,qBAAqB,KAAK,MAAM,IAAI;AAAA,IAC3F,sBAAsB,CAAC,MAAc,YAAoB,SACvD,qBAAqB,KAAK,MAAM,YAAY,IAAI;AAAA,IAClD,yBAAyB,CAAC,MAAc,YAAoB,SAC1D,wBAAwB,KAAK,MAAM,YAAY,IAAI;AAAA,IACrD,sBAAsB,CAAC,MAAc,QAAgB,sBAAsB,KAAK,MAAM,GAAG;AAAA,IACzF,MAAM,CAAC,SAAiB,SAAS,KAAK,IAAI;AAAA,IAC1C,KAAK,CAAC,MAAc,UAAkB,OAAO,KAAK,MAAM,KAAK;AAAA,IAC7D,UAAU,CAAC,MAAc,UAAkB,YAAY,KAAK,MAAM,KAAK;AAAA,IACvE,WAAW,CAAC,MAAc,QAAgB,WAAW,KAAK,MAAM,GAAG;AAAA,IACnE,mBAAmB,CAAC,MAAc,SAAkB,kBAAkB,KAAK,MAAM,IAAI;AAAA,IACrF,cAAc,MAAM,iBAAiB,GAAG;AAAA,IACxC,mBAAmB,CAAC,SAAmC,kBAAkB,KAAK,IAAI;AAAA,IAClF,eAAe,CAAC,SAA+B,cAAc,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMtE,MAAM,OACJ,KACA,SACG;AACH,YAAM,SAAS,MAAM,UAAU,KAAK,mBAAmB,GAAG,GAAG,EAAE,QAAQ,MAAM,OAAO,CAAC;AACrF,UAAI,CAAC,MAAM,MAAO,QAAO;AACzB,YAAM,UAAU,oBAAoB,GAAG;AACvC,YAAM,aAAgF,CAAC;AACvF,iBAAW,KAAK,SAAS;AACvB,cAAM,OAAQ,MAAM,gBAAgB,KAAK;AAAA,UACvC,aAAa,EAAE;AAAA,UACf,MAAM;AAAA,UACN,kBAAkB,EAAE;AAAA,UACpB,GAAI,EAAE,WAAW,EAAE,kBAAkB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC;AAAA,UACvD,GAAK,EAAE,kBAAkB,KAAK,iBAC1B,EAAE,iBAAiB,EAAE,kBAAkB,KAAK,eAAe,IAC3D,CAAC;AAAA,QACP,CAAC;AACD,mBAAW,KAAK;AAAA,UACd,YAAY,EAAE;AAAA,UACd,YAAY,EAAE;AAAA,UACd,QAAQ,OAAO,KAAK,MAAM,EAAE;AAAA,QAC9B,CAAC;AAAA,MACH;AACA,aAAO,EAAE,GAAI,QAAmB,aAAa,WAAW;AAAA,IAC1D;AAAA;AAAA,IAEA,MAAM,OAAO,MAAc,KAAa,SAA+B;AACrE,YAAM,MAAM,MAAM,YAAY,KAAK,MAAM,IAAI;AAC7C,MAAAE,WAAUC,SAAQ,GAAG,GAAG,EAAE,WAAW,KAAK,CAAC;AAC3C,4BAAsB,KAAK,GAAG;AAC9B,aAAO,EAAE,MAAM,KAAKA,SAAQ,GAAG,GAAG,OAAO,IAAI,OAAO;AAAA,IACtD;AAAA,EACF;AACF;;;AQvLA,IAAM,UAAU;AAChB,IAAM,MAAM;AASZ,SAAS,UAAU,MAAyB;AAE1C,SAAO;AAAA,IACL,MAAM,OAAO,KAAK,QAAQ,CAAC;AAAA,IAC3B,MAAM,OAAO,KAAK,SAAS,EAAE;AAAA,IAC7B,MAAM,KAAK,QAAQ;AAAA,IACnB,YAAY,KAAK,aAAa;AAAA,EAChC;AACF;AAEO,SAAS,cAAc,KAAqB,OAA0B,CAAC,GAAqB;AACjG,SAAO,QAAQ,KAAK,GAAG,OAAO,aAAa,EAAE,OAAO,UAAU,IAAI,EAAE,CAAC;AACvE;AACO,SAAS,YAAY,KAAqB,SAAmC;AAClF,SAAO,QAAQ,KAAK,GAAG,OAAO,YAAY,EAAE,OAAO,EAAE,UAAU,QAAQ,EAAE,CAAC;AAC5E;AACO,SAAS,gBACd,KACA,OAA0B,CAAC,GACT;AAClB,SAAO,QAAQ,KAAK,GAAG,OAAO,qBAAqB,EAAE,OAAO,UAAU,IAAI,EAAE,CAAC;AAC/E;AACO,SAAS,cAAc,KAAqB,SAAmC;AACpF,SAAO,QAAQ,KAAK,GAAG,OAAO,oBAAoB,EAAE,OAAO,EAAE,UAAU,QAAQ,EAAE,CAAC;AACpF;AAQO,SAAS,gBACd,KACA,OACA,UACkB;AAClB,SAAO,QAAQ,KAAK,GAAG,GAAG,qBAAqB;AAAA,IAC7C,QAAQ;AAAA,IACR,MAAM,EAAE,OAAO,UAAU,QAAQ,MAAM;AAAA,EACzC,CAAC;AACH;AAGA,SAAS,aAAa,OAAwC;AAC5D,QAAM,UAAU,MAAM;AACtB,QAAM,IAAI,UAAU,CAAC,GAAG,OAAO;AAC/B,SAAO,OAAO,MAAM,WAAW,IAAI;AACrC;AAOA,eAAsB,sBACpB,KACA,OACA,UACA,SACiB;AACjB,WAAS,GAAG;AACZ,QAAM,MAAM,MAAM,MAAM,GAAG,IAAI,OAAO,GAAG,GAAG,qBAAqB;AAAA,IAC/D,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,GAAG,aAAa,GAAG;AAAA,MACnB,gBAAgB;AAAA,MAChB,QAAQ;AAAA,IACV;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,OAAO,UAAU,QAAQ,KAAK,CAAC;AAAA,EACxD,CAAC;AACD,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,UAAU,IAAI,QAAQ,IAAI,YAAY,MAAM,IAAI,KAAK,CAAC;AAE7E,QAAM,SAAS,IAAI,MAAM,UAAU;AACnC,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,6BAA6B;AAC1D,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AACb,MAAI,MAAM;AAEV,QAAM,SAAS,CAAC,SAAuB;AACrC,UAAM,UAAU,KAAK,QAAQ;AAC7B,QAAI,CAAC,QAAQ,WAAW,OAAO,EAAG;AAClC,UAAM,UAAU,QAAQ,MAAM,CAAC,EAAE,KAAK;AACtC,QAAI,YAAY,YAAY,YAAY,GAAI;AAC5C,QAAI;AACF,YAAM,OAAO,aAAa,KAAK,MAAM,OAAO,CAA4B;AACxE,UAAI,MAAM;AACR,eAAO;AACP,gBAAQ,IAAI;AAAA,MACd;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO,MAAM;AACX,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,QAAI,KAAM;AACV,cAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,UAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,aAAS,MAAM,IAAI,KAAK;AACxB,eAAW,MAAM,MAAO,QAAO,EAAE;AAAA,EACnC;AACA,MAAI,OAAO,KAAK,EAAG,QAAO,MAAM;AAChC,SAAO;AACT;AAEO,SAAS,WAAW,KAAqB,OAAe,OAAmC;AAChG,SAAO,QAAQ,KAAK,GAAG,GAAG,2BAA2B,EAAE,QAAQ,QAAQ,MAAM,EAAE,OAAO,MAAM,EAAE,CAAC;AACjG;AAMO,SAAS,SAAS,KAAqB,MAAiB,MAAiC;AAC9F,SAAO,QAAQ,KAAK,GAAG,OAAO,IAAI,IAAI,QAAQ,EAAE,QAAQ,QAAQ,KAAK,CAAC;AACxE;AACO,SAAS,UAAU,KAAqB,MAAiB,MAAiC;AAC/F,SAAO,QAAQ,KAAK,GAAG,OAAO,IAAI,IAAI,SAAS,EAAE,QAAQ,QAAQ,KAAK,CAAC;AACzE;AACO,SAAS,aACd,KACA,MACA,UACkB;AAClB,SAAO,QAAQ,KAAK,GAAG,OAAO,IAAI,IAAI,WAAW;AAAA,IAC/C,QAAQ;AAAA,IACR,MAAM,EAAE,WAAW,SAAS;AAAA,EAC9B,CAAC;AACH;AACO,SAAS,UAAU,KAAqB,MAAiB,MAAiC;AAC/F,SAAO,QAAQ,KAAK,GAAG,OAAO,IAAI,IAAI,SAAS,EAAE,QAAQ,QAAQ,KAAK,CAAC;AACzE;AAEO,SAAS,OACd,KACA,OACA,OACA,WACkB;AAClB,SAAO,QAAQ,KAAK,GAAG,GAAG,yBAAyB;AAAA,IACjD,QAAQ;AAAA,IACR,MAAM,EAAE,OAAO,OAAO,UAAU;AAAA,EAClC,CAAC;AACH;;;AClJO,SAAS,OAAO,KAAqB;AAC1C,SAAO;AAAA,IACL,KAAK;AAAA,MACH,MAAM,CAAC,SAA6B,cAAc,KAAK,IAAI;AAAA,MAC3D,KAAK,CAAC,YAAoB,YAAY,KAAK,OAAO;AAAA,MAClD,MAAM,CAAC,SAAiB,aAA4B,gBAAgB,KAAK,SAAS,QAAQ;AAAA,MAC1F,YAAY,CAAC,SAAiB,UAAyB,YACrD,sBAAsB,KAAK,SAAS,UAAU,OAAO;AAAA,MACvD,KAAK,CAAC,SAAkB,SAAS,KAAK,OAAO,IAAI;AAAA,MACjD,MAAM,CAAC,SAAkB,UAAU,KAAK,OAAO,IAAI;AAAA,MACnD,QAAQ,CAAC,aAAuB,aAAa,KAAK,OAAO,QAAQ;AAAA,MACjE,MAAM,CAAC,SAAkB,UAAU,KAAK,OAAO,IAAI;AAAA,IACrD;AAAA,IACA,OAAO;AAAA,MACL,MAAM,CAAC,SAA6B,gBAAgB,KAAK,IAAI;AAAA,MAC7D,KAAK,CAAC,YAAoB,cAAc,KAAK,OAAO;AAAA,MACpD,YAAY,CAAC,SAAiB,UAAoB,WAAW,KAAK,SAAS,KAAK;AAAA,MAChF,QAAQ,CAAC,SAAiB,OAAe,cACvC,OAAO,KAAK,SAAS,OAAO,SAAS;AAAA,MACvC,KAAK,CAAC,SAAkB,SAAS,KAAK,eAAe,IAAI;AAAA,MACzD,MAAM,CAAC,SAAkB,UAAU,KAAK,eAAe,IAAI;AAAA,MAC3D,QAAQ,CAAC,aAAuB,aAAa,KAAK,eAAe,QAAQ;AAAA,MACzE,MAAM,CAAC,SAAkB,UAAU,KAAK,eAAe,IAAI;AAAA,IAC7D;AAAA,EACF;AACF;;;AC/BO,SAAS,UAAU,KAAqB;AAC7C,SAAO;AAAA,IACL,MAAM,CAAC,SAAgCC,eAAc,KAAK,IAAI;AAAA,IAC9D,KAAK,CAAC,OAAe,YAAY,KAAK,EAAE;AAAA,IACxC,QAAQ,CAAC,OAAe,eAAe,KAAK,EAAE;AAAA,IAC9C,MAAM,CAAC,MAAc,SAA+B,aAAa,KAAK,MAAM,IAAI;AAAA,IAChF,OAAO,CAAC,IAAY,SAAgC,cAAc,KAAK,IAAI,IAAI;AAAA,EACjF;AACF;;;ACpBA,SAAS,aAAAC,YAAW,iBAAAC,sBAAqB;AACzC,SAAS,YAAAC,WAAU,WAAAC,UAAS,WAAAC,gBAAe;;;ACQ3C,IAAMC,QAAO;AAGb,eAAsB,iBACpB,KACA,OACA,OAAqE,CAAC,GACpD;AAClB,WAAS,GAAG;AACZ,QAAM,OAAO,IAAI,SAAS;AAC1B,OAAK,IAAI,aAAa,KAAK;AAC3B,OAAK,IAAI,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,WAAW;AAChE,MAAI,KAAK,OAAQ,MAAK,IAAI,UAAU,KAAK,MAAM;AAC/C,MAAI,KAAK,WAAY,MAAK,IAAI,eAAe,KAAK,UAAU,KAAK,UAAU,CAAC;AAC5E,QAAM,MAAM,MAAM,MAAM,GAAG,IAAI,OAAO,GAAGA,KAAI,WAAW;AAAA,IACtD,QAAQ;AAAA,IACR,SAAS,aAAa,GAAG;AAAA,IACzB,MAAM;AAAA,EACR,CAAC;AACD,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,UAAU,IAAI,QAAQ,IAAI,YAAY,IAAI;AACjE,SAAO,OAAO,KAAK,MAAM,IAAI,IAAI;AACnC;AAGA,eAAsB,sBACpB,KACA,SACA,OACA,WAAW,aACO;AAClB,WAAS,GAAG;AACZ,QAAM,OAAO,IAAI,SAAS;AAC1B,OAAK,IAAI,aAAa,KAAK;AAC3B,OAAK,IAAI,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,QAAQ;AAC5C,QAAM,MAAM,MAAM,MAAM,GAAG,IAAI,OAAO,GAAGA,KAAI,WAAW,mBAAmB,OAAO,CAAC,YAAY;AAAA,IAC7F,QAAQ;AAAA,IACR,SAAS,aAAa,GAAG;AAAA,IACzB,MAAM;AAAA,EACR,CAAC;AACD,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,UAAU,IAAI,QAAQ,IAAI,YAAY,IAAI;AACjE,SAAO,OAAO,KAAK,MAAM,IAAI,IAAI;AACnC;AAGA,eAAsB,cAAc,KAAqB,SAAsC;AAC7F,WAAS,GAAG;AACZ,QAAM,MAAM,MAAM,MAAM,GAAG,IAAI,OAAO,GAAGA,KAAI,WAAW,mBAAmB,OAAO,CAAC,aAAa;AAAA,IAC9F,SAAS,aAAa,GAAG;AAAA,EAC3B,CAAC;AACD,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,UAAU,IAAI,QAAQ,IAAI,YAAY,MAAM,IAAI,KAAK,CAAC;AAC7E,SAAO,IAAI,WAAW,MAAM,IAAI,YAAY,CAAC;AAC/C;AAGO,SAAS,oBACd,KACA,SACA,MACkB;AAClB,SAAO,QAAQ,KAAK,GAAGA,KAAI,WAAW,mBAAmB,OAAO,CAAC,IAAI,EAAE,QAAQ,OAAO,KAAK,CAAC;AAC9F;AAGO,SAAS,sBACd,KACA,SACA,SACkB;AAClB,SAAO,QAAQ,KAAK,GAAGA,KAAI,WAAW,mBAAmB,OAAO,CAAC,sBAAsB;AAAA,IACrF,QAAQ;AAAA,IACR,MAAM,EAAE,QAAQ;AAAA,EAClB,CAAC;AACH;AAGO,SAAS,oBACd,KACA,SACA,SACkB;AAClB,SAAO,QAAQ,KAAK,GAAGA,KAAI,WAAW,mBAAmB,OAAO,CAAC,oBAAoB;AAAA,IACnF,QAAQ;AAAA,IACR,MAAM,EAAE,QAAQ;AAAA,EAClB,CAAC;AACH;AAWA,SAASC,WAAU,MAAyB;AAC1C,SAAO;AAAA,IACL,MAAM,KAAK,QAAQ;AAAA,IACnB,WAAW,KAAK,YAAY;AAAA,IAC5B,MAAM,KAAK,QAAQ;AAAA,IACnB,QAAQ,KAAK,UAAU;AAAA,IACvB,QAAQ,KAAK,UAAU;AAAA,IACvB,aAAa,KAAK,cAAc;AAAA,EAClC;AACF;AAEO,SAAS,WAAW,KAAqB,OAA0B,CAAC,GAAqB;AAC9F,SAAO,QAAQ,KAAK,GAAGD,KAAI,WAAW,EAAE,OAAOC,WAAU,IAAI,EAAE,CAAC;AAClE;AAEO,SAAS,gBACd,KACA,OAA0B,CAAC,GACT;AAClB,SAAO,QAAQ,KAAK,GAAGD,KAAI,kBAAkB,EAAE,OAAOC,WAAU,IAAI,EAAE,CAAC;AACzE;AAEO,SAAS,SAAS,KAAqB,SAAmC;AAC/E,SAAO,QAAQ,KAAK,GAAGD,KAAI,WAAW,mBAAmB,OAAO,CAAC,EAAE;AACrE;AAEO,SAAS,eAAe,KAAqB,SAAmC;AACrF,SAAO,QAAQ,KAAK,GAAGA,KAAI,kBAAkB,mBAAmB,OAAO,CAAC,EAAE;AAC5E;AAEO,SAAS,YAAY,KAAqB,SAAmC;AAClF,SAAO,QAAQ,KAAK,GAAGA,KAAI,WAAW,mBAAmB,OAAO,CAAC,IAAI,EAAE,QAAQ,SAAS,CAAC;AAC3F;AAGO,SAAS,gBAAgB,KAAqB,SAAmC;AACtF,SAAO,QAAQ,KAAK,GAAGA,KAAI,WAAW,mBAAmB,OAAO,CAAC,UAAU;AAC7E;AAGO,SAAS,cACd,KACA,SACA,SACkB;AAClB,SAAO,QAAQ,KAAK,GAAGA,KAAI,WAAW,mBAAmB,OAAO,CAAC,eAAe;AAAA,IAC9E,QAAQ;AAAA,IACR,MAAM,EAAE,UAAU,QAAQ;AAAA,EAC5B,CAAC;AACH;AAGO,SAAS,gBAAgB,KAAqB,SAAmC;AACtF,SAAO,QAAQ,KAAK,GAAGA,KAAI,WAAW,mBAAmB,OAAO,CAAC,UAAU;AAC7E;AAKO,SAAS,eACd,KACA,SACAE,SACkB;AAClB,SAAO,QAAQ,KAAK,GAAGF,KAAI,WAAW,mBAAmB,OAAO,CAAC,WAAW;AAAA,IAC1E,QAAQ;AAAA,IACR,MAAM,EAAE,QAAAE,QAAO;AAAA,EACjB,CAAC;AACH;;;AC1KA,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,eAAAC,cAAa,YAAAC,WAAU,iBAAAC,sBAAqB;AAC1F,SAAS,SAAS,QAAAC,OAAM,UAAU,WAAAC,UAAS,WAAW;AACtD,OAAO,WAAW;AAElB,SAAS,KAAK,KAAa,MAAc,OAAuB;AAC9D,aAAW,SAASJ,aAAY,GAAG,GAAG;AACpC,UAAM,OAAOG,MAAK,KAAK,KAAK;AAC5B,UAAM,KAAKF,UAAS,IAAI;AACxB,QAAI,GAAG,YAAY,EAAG,MAAK,MAAM,MAAM,KAAK;AAAA,QACvC,OAAM,KAAK,IAAI;AAAA,EACtB;AACF;AAGA,eAAsB,aAAa,KAAkC;AACnE,QAAM,MAAMG,SAAQ,GAAG;AACvB,MAAI,CAACP,YAAW,GAAG,EAAG,OAAM,IAAI,MAAM,wBAAwB,GAAG,EAAE;AACnE,QAAM,MAAM,IAAI,MAAM;AACtB,QAAM,QAAkB,CAAC;AACzB,OAAK,KAAK,KAAK,KAAK;AACpB,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,SAAS,KAAK,IAAI,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AACnD,QAAI,KAAK,KAAKE,cAAa,IAAI,CAAC;AAAA,EAClC;AACA,SAAO,IAAI,WAAW,MAAM,IAAI,cAAc,EAAE,MAAM,cAAc,aAAa,UAAU,CAAC,CAAC;AAC/F;AAGA,eAAsB,iBAAiB,OAAmB,KAAgC;AACxF,QAAM,MAAMK,SAAQ,GAAG;AACvB,EAAAN,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,QAAM,MAAM,MAAM,MAAM,UAAU,KAAK;AACvC,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAU,OAAO,OAAO,IAAI,KAAK;AACvC,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,IAAK;AACf,UAAM,MAAMK,MAAK,KAAK,MAAM,IAAI;AAChC,IAAAL,WAAU,QAAQ,GAAG,GAAG,EAAE,WAAW,KAAK,CAAC;AAC3C,IAAAI,eAAc,KAAK,MAAM,MAAM,MAAM,YAAY,CAAC;AAClD,YAAQ,KAAK,GAAG;AAAA,EAClB;AACA,SAAO;AACT;;;AFtBO,SAAS,OAAO,KAAqB;AAC1C,SAAO;AAAA,IACL,MAAM,CAAC,SAA6B,WAAW,KAAK,IAAI;AAAA,IACxD,KAAK,CAAC,YAAoB,SAAS,KAAK,OAAO;AAAA,IAC/C,QAAQ,CAAC,SAA6B,gBAAgB,KAAK,IAAI;AAAA,IAC/D,WAAW,CAAC,YAAoB,eAAe,KAAK,OAAO;AAAA,IAC3D,QAAQ,CAAC,YAAoB,YAAY,KAAK,OAAO;AAAA,IACrD,SAAS,CAAC,YAAoB,gBAAgB,KAAK,OAAO;AAAA,IAC1D,UAAU,CAAC,SAAiB,YAAoB,cAAc,KAAK,SAAS,OAAO;AAAA,IACnF,SAAS,CAAC,YAAoB,gBAAgB,KAAK,OAAO;AAAA,IAC1D,WAAW,CAAC,SAAiBG,YAAwB,eAAe,KAAK,SAASA,OAAM;AAAA,IACxF,gBAAgB,CAAC,SAAiB,SAAkB,oBAAoB,KAAK,SAAS,IAAI;AAAA,IAC1F,WAAW,CAAC,SAAiB,YAAoB,sBAAsB,KAAK,SAAS,OAAO;AAAA,IAC5F,gBAAgB,CAAC,SAAiB,YAChC,oBAAoB,KAAK,SAAS,OAAO;AAAA;AAAA,IAE3C,UAAU,OAAO,KAAa,SAC5B,iBAAiB,KAAK,MAAM,aAAa,GAAG,GAAG;AAAA,MAC7C,UAAU,GAAGC,UAASC,SAAQ,GAAG,CAAC,CAAC;AAAA,MACnC,GAAG;AAAA,IACL,CAAC;AAAA;AAAA,IAEH,eAAe,OAAO,SAAiB,QACrC,sBAAsB,KAAK,SAAS,MAAM,aAAa,GAAG,GAAG,GAAGD,UAASC,SAAQ,GAAG,CAAC,CAAC,MAAM;AAAA;AAAA,IAE9F,UAAU,OAAO,SAAiB,YAAqB;AACrD,YAAM,QAAQ,MAAM,cAAc,KAAK,OAAO;AAC9C,YAAM,OAAOA,SAAQ,WAAW,GAAG,OAAO,MAAM;AAChD,MAAAC,WAAUC,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,MAAAC,eAAc,MAAM,KAAK;AACzB,aAAO,EAAE,SAAS,MAAM,MAAM,OAAO,MAAM,OAAO;AAAA,IACpD;AAAA;AAAA,IAEA,SAAS,OAAO,SAAiB,QAAiB;AAChD,YAAM,QAAQ,MAAM,cAAc,KAAK,OAAO;AAC9C,YAAM,SAASH,SAAQ,OAAO,OAAO;AACrC,YAAM,QAAQ,MAAM,iBAAiB,OAAO,MAAM;AAClD,aAAO,EAAE,SAAS,KAAK,QAAQ,OAAO,MAAM,OAAO;AAAA,IACrD;AAAA,EACF;AACF;;;AGhEA,SAAS,aAAAI,YAAW,iBAAAC,sBAAqB;AACzC,SAAS,WAAAC,UAAS,WAAAC,gBAAe;;;ACEjC,SAAS,YAAAC,iBAAgB;AACzB,SAAS,YAAAC,iBAAgB;AAOzB,IAAM,OAAO;AAEb,IAAM,QAAQ;AAId,eAAsB,aACpB,KACA,IACA,OAAkB,WACG;AACrB,WAAS,GAAG;AACZ,QAAM,MAAM,MAAM;AAAA,IAChB,GAAG,IAAI,OAAO,GAAG,KAAK,WAAW,mBAAmB,IAAI,CAAC,IAAI,mBAAmB,EAAE,CAAC;AAAA,IACnF,EAAE,SAAS,aAAa,GAAG,EAAE;AAAA,EAC/B;AACA,QAAM,MAAM,IAAI,WAAW,MAAM,IAAI,YAAY,CAAC;AAClD,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,UAAU,IAAI,QAAQ,IAAI,YAAY,IAAI,YAAY,EAAE,OAAO,GAAG,CAAC;AAC1F,SAAO;AACT;AAGA,eAAsB,aACpB,KACA,UACA,OAAkB,WACA;AAClB,WAAS,GAAG;AACZ,QAAM,MAAM,MAAMC,UAAS,QAAQ;AACnC,QAAM,OAAO,IAAI,SAAS;AAC1B,OAAK,OAAO,QAAQ,IAAI,KAAK,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC,GAAGC,UAAS,QAAQ,CAAC;AACvE,QAAM,MAAM,MAAM,MAAM,GAAG,IAAI,OAAO,GAAG,KAAK,WAAW,mBAAmB,IAAI,CAAC,IAAI;AAAA,IACnF,QAAQ;AAAA,IACR,SAAS,aAAa,GAAG;AAAA,IACzB,MAAM;AAAA,EACR,CAAC;AACD,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,UAAU,IAAI,QAAQ,IAAI,YAAY,IAAI;AACjE,SAAO,OAAO,KAAK,MAAM,IAAI,IAAI;AACnC;AAMA,eAAsB,WACpB,KACA,OACA,UACA,eAAe,WACG;AAClB,WAAS,GAAG;AACZ,QAAM,MAAM,MAAMD,UAAS,QAAQ;AACnC,QAAM,OAAO,IAAI,SAAS;AAC1B,OAAK,OAAO,iBAAiB,YAAY;AACzC,OAAK,OAAO,QAAQ,IAAI,KAAK,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC,GAAGC,UAAS,QAAQ,CAAC;AACvE,QAAM,MAAM,MAAM,MAAM,GAAG,IAAI,OAAO,GAAG,IAAI,IAAI,mBAAmB,KAAK,CAAC,SAAS;AAAA,IACjF,QAAQ;AAAA,IACR,SAAS,aAAa,GAAG;AAAA,IACzB,MAAM;AAAA,EACR,CAAC;AACD,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,UAAU,IAAI,QAAQ,IAAI,YAAY,IAAI;AACjE,SAAO,OAAO,KAAK,MAAM,IAAI,IAAI;AACnC;AAQO,SAAS,cACd,KACA,OAA6B,CAAC,GACZ;AAClB,SAAO,QAAQ,KAAK,GAAG,IAAI,SAAS;AAAA,IAClC,OAAO,EAAE,SAAS,KAAK,WAAW,QAAW,OAAO,KAAK,OAAO,QAAQ,KAAK,UAAU,EAAE;AAAA,EAC3F,CAAC;AACH;AAGO,SAASC,WAAU,KAAqB,OAAiC;AAC9E,SAAO,QAAQ,KAAK,GAAG,IAAI,IAAI,mBAAmB,KAAK,CAAC,aAAa;AACvE;AASO,SAAS,cAAc,KAAqB,MAA8C;AAC/F,SAAO,QAAQ,KAAK,MAAM;AAAA,IACxB,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,eAAe;AAAA,MACf,UAAU,KAAK;AAAA,MACf,UAAU,KAAK,eAAe;AAAA,MAC9B,aAAa,KAAK;AAAA,MAClB,QAAQ,KAAK,UAAU;AAAA,IACzB;AAAA,EACF,CAAC;AACH;AAEO,SAAS,cAAc,KAAqB,OAAiC;AAClF,SAAO,QAAQ,KAAK,GAAG,IAAI,IAAI,mBAAmB,KAAK,CAAC,IAAI,EAAE,QAAQ,SAAS,CAAC;AAClF;AAGO,SAAS,iBACd,KACA,OACAC,SACkB;AAClB,SAAO,QAAQ,KAAK,GAAG,IAAI,IAAI,mBAAmB,KAAK,CAAC,WAAW;AAAA,IACjE,QAAQ;AAAA,IACR,MAAM,EAAE,QAAAA,QAAO;AAAA,EACjB,CAAC;AACH;AAUA,SAAS,SAAS,GAAgD;AAChE,SAAO;AAAA,IACL,GAAI,EAAE,YAAY,SAAY,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,IACxD,QAAQ,EAAE,UAAU,CAAC;AAAA,IACrB,OAAO,EAAE,SAAS,CAAC;AAAA,IACnB,MAAM,EAAE,QAAQ,CAAC;AAAA,IACjB,MAAM,EAAE,QAAQ,CAAC;AAAA,EACnB;AACF;AAGO,SAAS,YACd,KACA,OACA,QACA,IAAwB,CAAC,GACP;AAClB,SAAO,QAAQ,KAAK,GAAG,IAAI,IAAI,mBAAmB,KAAK,CAAC,UAAU,mBAAmB,MAAM,CAAC,IAAI;AAAA,IAC9F,QAAQ;AAAA,IACR,MAAM,SAAS,CAAC;AAAA,EAClB,CAAC;AACH;AAGO,SAAS,UACd,KACA,OACA,QACA,IAAwB,CAAC,GACP;AAClB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,IAAI,IAAI,mBAAmB,KAAK,CAAC,SAAS,mBAAmB,MAAM,CAAC;AAAA,IACvE;AAAA,MACE,QAAQ;AAAA,MACR,MAAM,SAAS,CAAC;AAAA,IAClB;AAAA,EACF;AACF;AAGO,SAAS,gBACd,KACA,OACA,SACkB;AAClB,SAAO,QAAQ,KAAK,GAAG,IAAI,IAAI,mBAAmB,KAAK,CAAC,iBAAiB;AAAA,IACvE,QAAQ;AAAA,IACR,MAAM,QAAQ,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,QAAQ,EAAE,OAAO,EAAE;AAAA,EACpE,CAAC;AACH;;;AD1KO,SAAS,UAAU,KAAqB;AAC7C,SAAO;AAAA,IACL,MAAM,CAAC,SAAgC,cAAc,KAAK,IAAI;AAAA,IAC9D,OAAO,CAAC,UAAkBC,WAAU,KAAK,KAAK;AAAA,IAC9C,QAAQ,CAAC,SAA+B,cAAc,KAAK,IAAI;AAAA,IAC/D,QAAQ,CAAC,UAAkB,cAAc,KAAK,KAAK;AAAA,IACnD,SAAS,CAAC,UAAkB,iBAAiB,KAAK,OAAO,WAAW;AAAA,IACpE,WAAW,CAAC,UAAkB,iBAAiB,KAAK,OAAO,OAAO;AAAA,IAClE,eAAe,CAAC,OAAe,SAAmBC,YAChD;AAAA,MACE;AAAA,MACA;AAAA,MACA,QAAQ,IAAI,CAAC,YAAY,EAAE,QAAQ,QAAAA,QAAO,EAAE;AAAA,IAC9C;AAAA,IACF,QAAQ,CAAC,OAAe,UAAkB,iBACxC,WAAW,KAAK,OAAO,UAAU,YAAY;AAAA;AAAA,IAE/C,QAAQ,OAAO,IAAY,SAAiB,SAAqB;AAC/D,YAAM,QAAQ,MAAM,aAAa,KAAK,IAAI,IAAI;AAC9C,YAAM,OAAOC,SAAQ,OAAO;AAC5B,MAAAC,WAAUC,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,MAAAC,eAAc,MAAM,KAAK;AACzB,aAAO,EAAE,IAAI,MAAM,MAAM,OAAO,MAAM,OAAO;AAAA,IAC/C;AAAA;AAAA,IAEA,QAAQ,CAAC,UAAkB,SAAqB,aAAa,KAAK,UAAU,IAAI;AAAA,IAChF,SAAS,CAAC,OAAe,QAAgB,MACvC,YAAY,KAAK,OAAO,QAAQ,CAAC;AAAA,IACnC,OAAO,CAAC,OAAe,QAAgB,MACrC,UAAU,KAAK,OAAO,QAAQ,CAAC;AAAA,EACnC;AACF;;;AE5CA,IAAM,SAAS;AAoBf,SAAS,WAAW,KAAiC;AACnD,QAAM,KAAK,KAAK,MAAM,GAAG;AACzB,MAAI,OAAO,MAAM,EAAE,EAAG,QAAO;AAC7B,UAAQ,OAAO,EAAE,IAAI,UAAY,SAAS;AAC5C;AAEA,SAAS,iBAAiB,KAA8C;AACtE,QAAM,YAAY,IAAI,UAAU,IAAI;AACpC,QAAM,SAAS,OAAO,cAAc,WAAW,YAAY;AAC3D,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,YAAY,IAAI,gBAAgB,IAAI;AAC1C,QAAM,eACJ,OAAO,cAAc,YAAY,cAAc,MAAM,cAAc,MAAM,YAAY;AACvF,QAAM,QACJ,OAAO,IAAI,sBAAsB,WAC7B,IAAI,oBACJ,OAAO,IAAI,cAAc,WACvB,WAAW,IAAI,SAAS,IACxB;AACR,QAAM,MACJ,OAAO,IAAI,oBAAoB,WAC3B,IAAI,kBACJ,OAAO,IAAI,YAAY,WACrB,WAAW,IAAI,OAAO,IACtB;AACR,QAAM,aAAa,IAAI,WAAW,IAAI;AACtC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AAAA,IAChD,SAAS,OAAO,eAAe,WAAW,aAAa;AAAA,IACvD,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,QAAQ,IAAI;AAAA,IACZ,YAAY,IAAI;AAAA,IAChB,QAAQ,MAAM,QAAQ,IAAI,MAAM,IAAK,IAAI,SAA+B;AAAA,EAC1E;AACF;AAGA,eAAsB,0BACpB,KACA,gBACA,OAAoD,CAAC,GACF;AACnD,QAAM,UAAU,MAAM,uBAAuB,KAAK,gBAAgB,IAAI;AACtE,QAAM,QAAmB,CAAC;AAC1B,QAAM,WAAW,oBAAI,IAAY;AACjC,aAAW,OAAO,SAAS;AACzB,UAAM,OAAO,iBAAiB,GAAG;AACjC,QAAI,CAAC,KAAM;AACX,UAAM,KAAK,IAAI;AACf,QAAI,KAAK,QAAS,UAAS,IAAI,KAAK,OAAO;AAAA,EAC7C;AACA,SAAO,EAAE,OAAO,UAAU,CAAC,GAAG,QAAQ,EAAE;AAC1C;AAGO,SAAS,YAAY,KAAqB,MAAiC;AAChF,SAAO,QAAQ,KAAK,QAAQ,EAAE,QAAQ,QAAQ,KAAK,CAAC;AACtD;AAOA,eAAsB,uBACpB,KACA,gBACA,OAAoD,CAAC,GACZ;AACzC,QAAM,MACH,MAAM,QAAoB,KAAK,QAAQ;AAAA,IACtC,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO,EAAE,MAAM,EAAE,6CAA6C,eAAe,EAAE;AAAA,MAC/E,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,mBAAmB,MAAM,KAAK,eAAe,IAAI,EAAE,EAAE;AAAA,IACvF;AAAA,EACF,CAAC,KAAM,CAAC;AAEV,QAAM,SAAS,IAAI,MAAM;AACzB,MAAI,CAAC,IAAI,gBAAgB,MAAM,QAAQ,MAAM,GAAG;AAC9C,WAAO,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAAA,EAC1C;AAEA,QAAM,YAAY,IAAI,cAAc,MAAM,WAAW,CAAC,GACnD,IAAI,CAAC,MAAM,EAAE,GAAG,EAChB,OAAO,CAAC,MAAmB,OAAO,MAAM,YAAY,EAAE,SAAS,CAAC;AACnE,MAAI,SAAS,WAAW,EAAG,QAAO,CAAC;AAEnC,QAAM,QACH,MAAM,QAAoB,KAAK,QAAQ;AAAA,IACtC,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,MAAM,KAAK,YAAY;AAAA,MACvB,OAAO,EAAE,OAAO,EAAE,mBAAmB,SAAS,EAAE;AAAA,IAClD;AAAA,EACF,CAAC,KAAM,CAAC;AACV,UAAQ,MAAM,MAAM,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC5D;;;AC1HA,SAAS,OAAO,aAAAC,kBAAiB;AAE1B,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAC1C,YACE,SACS,QACT;AACA,UAAM,OAAO;AAFJ;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EAJW;AAKb;AAGO,SAAS,gBAAgB,SAAS,UAAmB;AAC1D,MAAI;AACF,UAAM,IAAIA,WAAU,QAAQ,CAAC,WAAW,GAAG;AAAA,MACzC,SAAS;AAAA,MACT,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,IACpC,CAAC;AACD,WAAO,EAAE,WAAW;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,QAAwB;AAC/C,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,QAAS,OAAM,IAAI,iBAAiB,gCAAgC,YAAY;AACrF,QAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,QAAM,OAAO,OAAO,IAAI,WAAW,WAAW,IAAI,SAAS,IAAI;AAC/D,MAAI,OAAO,SAAS;AAClB,UAAM,IAAI,iBAAiB,sCAAsC,YAAY;AAC/E,SAAO;AACT;AAGA,SAAS,kBAAkB,MAAsB;AAC/C,QAAM,SAAS,KAAK,MAAM,8BAA8B;AACxD,QAAM,OAAO,SAAS,CAAC,KAAK;AAC5B,QAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,MAAI,UAAU,GAAI,OAAM,IAAI,iBAAiB,kCAAkC,YAAY;AAC3F,MAAI,QAAQ;AACZ,WAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,KAAK;AACxC,QAAI,KAAK,CAAC,MAAM,IAAK;AAAA,aACZ,KAAK,CAAC,MAAM,OAAO,EAAE,UAAU,EAAG,QAAO,KAAK,MAAM,OAAO,IAAI,CAAC;AAAA,EAC3E;AACA,QAAM,IAAI,iBAAiB,0CAA0C,YAAY;AACnF;AAGA,eAAsB,UACpB,QACA,OAAgD,CAAC,GACf;AAClC,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,OAAO,CAAC,MAAM,wBAAwB,gCAAgC;AAE5E,QAAM,SAAS,MAAM,IAAI,QAAgB,CAACC,UAAS,WAAW;AAC5D,UAAM,QAAQ,MAAM,QAAQ,MAAM,EAAE,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE,CAAC;AACrE,QAAI,MAAM;AACV,QAAI,WAAW;AACf,UAAM,SAAS,WAAW,MAAM;AAC9B,iBAAW;AACX,YAAM,KAAK,SAAS;AACpB,iBAAW,MAAM,MAAM,KAAK,SAAS,GAAG,GAAI,EAAE,MAAM;AAAA,IACtD,GAAG,SAAS;AACZ,WAAO,MAAM;AACb,UAAM,OAAO,YAAY,MAAM;AAC/B,UAAM,OAAO,GAAG,QAAQ,CAAC,MAAc;AACrC,aAAO;AAAA,IACT,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,QAA+B;AAChD,mBAAa,MAAM;AACnB;AAAA,QACE,IAAI,SAAS,WACT,IAAI,iBAAiB,8BAA8B,eAAe,IAClE;AAAA,MACN;AAAA,IACF,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,mBAAa,MAAM;AACnB,UAAI;AACF,eAAO,OAAO,IAAI,iBAAiB,0BAA0B,SAAS,MAAM,SAAS,CAAC;AACxF,UAAI,SAAS,EAAG,QAAO,OAAO,IAAI,iBAAiB,iBAAiB,IAAI,IAAI,MAAM,CAAC;AACnF,MAAAA,SAAQ,GAAG;AAAA,IACb,CAAC;AACD,UAAM,MAAM,GAAG,SAAS,CAAC,QAA+B;AACtD,UAAI,IAAI,SAAS,QAAS,QAAO,GAAG;AAAA,IACtC,CAAC;AACD,UAAM,MAAM,IAAI,MAAM;AAAA,EACxB,CAAC;AAED,QAAM,OAAO,gBAAgB,MAAM;AACnC,SAAO,KAAK,MAAM,kBAAkB,IAAI,CAAC;AAC3C;;;ACnBA,IAAM,WAAqC;AAAA,EACzC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,WAAW;AAAA,EACX,WAAW;AACb;AAEA,SAAS,WAAW,OAA0C;AAC5D,QAAM,KAAK,MAAM,uBAAuB;AACxC,MAAI,OAAO,OAAO,YAAY,MAAM,SAAU,QAAO,SAAS,EAAE;AAChE,QAAM,IAAI,MAAM,kBAAkB;AAClC,MAAI,OAAO,MAAM,YAAY,KAAK,SAAU,QAAO,SAAS,CAAC;AAC7D,SAAO;AACT;AAEA,SAAS,WAAW,OAAgB,KAAsB;AACxD,MAAI,CAAC,SAAS,CAAC,IAAK,QAAO;AAC3B,MAAI;AACF,WAAO,QAAQ,OAAO,GAAG,IAAI,OAAO,KAAK,KAAK,QAAU;AAAA,EAC1D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,SAAiB,KAA2B;AAC5E,QAAM,QAAgB,IAAI,IAAI,CAAC,MAAM;AACnC,UAAM,QAAQ,EAAE,cAAc,CAAC;AAC/B,UAAM,OAAO,EAAE,QAAQ,MAAM,YAAY;AACzC,WAAO;AAAA,MACL,QAAQ,EAAE;AAAA,MACV,cAAc,EAAE,gBAAgB;AAAA,MAChC,MAAM,EAAE,QAAQ;AAAA,MAChB,MAAM,WAAW,KAAK;AAAA,MACtB,mBAAmB,EAAE,qBAAqB;AAAA,MAC1C,iBAAiB,EAAE,mBAAmB;AAAA,MACtC,YAAY,WAAW,EAAE,mBAAmB,EAAE,eAAe;AAAA,MAC7D,QAAQ,SAAS,OAAO,OAAO,SAAS,UAAU,UAAU;AAAA,MAC5D,YAAY;AAAA,IACd;AAAA,EACF,CAAC;AACD,QAAM,SAAS,oBAAI,IAAsB;AACzC,aAAW,KAAK,OAAO;AACrB,UAAM,MAAM,OAAO,IAAI,EAAE,IAAI,KAAK,CAAC;AACnC,QAAI,KAAK,CAAC;AACV,WAAO,IAAI,EAAE,MAAM,GAAG;AAAA,EACxB;AACA,SAAO,EAAE,SAAS,OAAO,OAAO;AAClC;AAIA,SAAS,QAAQ,OAAuB;AACtC,SAAO,MACJ,MAAM,EACN,KAAK,CAAC,GAAG,MAAM,OAAO,OAAO,EAAE,iBAAiB,IAAI,OAAO,EAAE,iBAAiB,CAAC,CAAC;AACrF;AACA,SAAS,QAAQ,GAAS,KAAqB;AAC7C,QAAM,IAAI,EAAE,WAAW,GAAG;AAC1B,SAAO,OAAO,MAAM,WAAW,IAAI;AACrC;AACA,SAAS,SAAS,GAAiB;AACjC,SAAO,QAAQ,GAAG,kBAAkB,KAAK,EAAE;AAC7C;AAEA,IAAM,wBAAmC,CAACC,QAAO,WAAW;AAC1D,QAAM,QAAQ;AACd,QAAM,MAAO,OAAO,mBAA0C;AAC9D,QAAM,QAAQ,QAAQA,OAAM,OAAO,IAAI,MAAM,KAAK,CAAC,CAAC;AACpD,QAAM,OAAc,CAAC;AACrB,MAAI,IAAI;AACR,SAAO,IAAI,MAAM,QAAQ;AACvB,UAAM,QAAQ,MAAM,CAAC;AACrB,UAAM,OAAO,SAAS,KAAK;AAC3B,UAAM,OAAO,MAAM,WAAW,kBAAkB;AAChD,UAAM,QAAQ,MAAM,WAAW,KAAK;AACpC,QAAI,IAAI,IAAI;AACZ,WACE,IAAI,MAAM,UACV,SAAS,MAAM,CAAC,CAAS,MAAM,QAC/B,KAAK,UAAW,MAAM,CAAC,EAAW,WAAW,kBAAkB,CAAC,MAAM,KAAK,UAAU,IAAI,KACxF,MAAM,CAAC,EAAW,WAAW,KAAK,MAAM;AAEzC;AACF,UAAM,SAAS,IAAI;AACnB,QAAI,UAAU,KAAK;AACjB,WAAK,KAAK;AAAA,QACR,eAAe,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,QACpD,SAAS,SAAS,IAAI,YAAY,MAAM;AAAA,QACxC,UAAU,EAAE,WAAW,MAAM,YAAY,QAAQ,WAAW,MAAM,EAAE;AAAA,MACtE,CAAC;AAAA,IACH;AACA,QAAI;AAAA,EACN;AACA,SAAO;AACT;AAEA,IAAM,qBAAgC,CAACA,WAAU;AAC/C,QAAM,MAAM,QAAQA,OAAM,KAAK;AAC/B,QAAM,OAAc,CAAC;AACrB,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAM,IAAI,IAAI,CAAC;AACf,QAAI,EAAE,SAAS,UAAU,EAAE,WAAW,QAAS;AAC/C,UAAM,SAAS,QAAQ,GAAG,eAAe;AACzC,QAAI;AACJ,aAAS,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACvC,UAAK,IAAI,CAAC,EAAW,SAAS,OAAO;AACnC,eAAO,IAAI,CAAC;AACZ;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,KAAM;AACX,UAAM,UAAU,QAAQ,MAAM,eAAe,KAAK,QAAQ,MAAM,YAAY,GAAG,YAAY;AAC3F,QAAI,EAAE,OAAO,SAAS,KAAK,OAAO,SAAS,OAAO,YAAY,CAAC,IAAI;AACjE,WAAK,KAAK;AAAA,QACR,eAAe,CAAC,EAAE,QAAQ,KAAK,MAAM;AAAA,QACrC,SAAS,SAAS,SAAS,CAAC,CAAC,eAAe,MAAM;AAAA,QAClD,UAAU,EAAE,WAAW,SAAS,CAAC,GAAG,eAAe,OAAO;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,2BAAsC,CAACA,WAAU;AACrD,QAAM,UAAU,QAAQA,OAAM,KAAK;AACnC,QAAM,OAAc,CAAC;AACrB,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,IAAI,QAAQ,CAAC;AACnB,QAAI,EAAE,SAAS,YAAa;AAC5B,QAAI,EAAE,WAAW,+BAA+B,MAAM,EAAG;AACzD,UAAM,OAAO,QAAQ,IAAI,CAAC;AAC1B,QAAI,MAAM,SAAS,OAAO;AACxB,WAAK,KAAK;AAAA,QACR,eAAe,CAAC,EAAE,QAAQ,KAAK,MAAM;AAAA,QACrC,SAAS;AAAA,QACT,UAAU,CAAC;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,iCAA4C,CAACA,WAAU;AAC3D,QAAM,eAAe,CAAC,MAAoB;AACxC,UAAM,MAAM,EAAE,WAAW,gCAAgC;AACzD,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,iBAAW,KAAK,IAAK,KAAI,OAAO,MAAM,YAAY,EAAG,QAAO;AAAA,IAC9D;AACA,WAAO,QAAQ,GAAG,+BAA+B,KAAK,QAAQ,GAAG,mBAAmB;AAAA,EACtF;AACA,QAAM,SAAS,CAAC,MAAoB,QAAQ,GAAG,wBAAwB;AACvE,QAAM,OAAO,QAAQA,OAAM,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC;AAClD,QAAM,OAAc,CAAC;AACrB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,IAAI,KAAK,CAAC;AAChB,QAAI,aAAa,CAAC,MAAM,SAAU;AAClC,UAAM,KAAK,OAAO,CAAC;AACnB,QAAI,OAAO;AACX,aAAS,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,KAAI,OAAO,KAAK,CAAC,CAAS,MAAM,GAAI,QAAO;AACrF,QAAI,CAAC,MAAM;AACT,WAAK,KAAK;AAAA,QACR,eAAe,CAAC,EAAE,MAAM;AAAA,QACxB,SAAS,4FAA4F,EAAE;AAAA,QACvG,UAAU,EAAE,iBAAiB,GAAG;AAAA,MAClC,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,4BAAuC,CAACA,QAAO,WAAW;AAC9D,QAAM,MAAO,OAAO,2BAAkD;AACtE,QAAM,QAAQA,OAAM,OAAO,IAAI,MAAM,KAAK,CAAC;AAC3C,MAAI,MAAM,UAAU,IAAK,QAAO,CAAC;AACjC,SAAO;AAAA,IACL;AAAA,MACE,eAAe,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,MACxC,SAAS,2CAA2C,MAAM,MAAM,MAAM,GAAG;AAAA,MACzE,UAAU,EAAE,OAAO,MAAM,QAAQ,WAAW,IAAI;AAAA,IAClD;AAAA,EACF;AACF;AAIO,IAAM,gBAAwB;AAAA,EACnC;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,MACZ,QAAQ;AAAA,MACR,gBACE;AAAA,IACJ;AAAA,IACA,WAAW;AAAA,IACX,QAAQ,EAAE,iBAAiB,EAAE;AAAA,EAC/B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,MACZ,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAClB;AAAA,IACA,WAAW;AAAA,IACX,QAAQ,CAAC;AAAA,EACX;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,MACZ,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAClB;AAAA,IACA,WAAW;AAAA,IACX,QAAQ,CAAC;AAAA,EACX;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,MACZ,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAClB;AAAA,IACA,WAAW;AAAA,IACX,QAAQ,CAAC;AAAA,EACX;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,MACZ,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAClB;AAAA,IACA,WAAW;AAAA,IACX,QAAQ,EAAE,yBAAyB,GAAG;AAAA,EACxC;AACF;AAEA,SAAS,cAAc,KAAa,UAA2C;AAC7E,SAAO,IAAI,QAAQ,kBAAkB,CAAC,IAAI,MAAM,OAAO,SAAS,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC;AACnF;AAGO,SAAS,SAAS,MAAiB,QAAgB,eAA0B;AAClF,QAAM,WAAsB,CAAC;AAC7B,aAAW,QAAQ,OAAO;AACxB,eAAW,OAAO,KAAK,UAAU,MAAM,KAAK,MAAM,GAAG;AACnD,eAAS,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,cAAc;AAAA,QACd,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,UAAU,EAAE,OAAO,IAAI,eAAe,SAAS,IAAI,QAAQ;AAAA,QAC3D,cAAc;AAAA,UACZ,QAAQ,KAAK,aAAa;AAAA,UAC1B,QAAQ,cAAc,KAAK,aAAa,gBAAgB,IAAI,QAAQ;AAAA,QACtE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAIO,IAAM,uBAAqC;AAAA,EAChD;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,IACT,eACE;AAAA,IAIF,cAAc;AAAA,MACZ,QAAQ;AAAA,MACR,gBACE;AAAA,IACJ;AAAA,EACF;AACF;AAEA,SAAS,WAAW,MAAyB;AAC3C,aAAW,KAAK,KAAK,OAAO;AAC1B,UAAM,IAAI,EAAE,WAAW,qBAAqB;AAC5C,QAAI,OAAO,MAAM,YAAY,EAAG,QAAO;AAAA,EACzC;AACA,QAAM,WAAW,QAAQ,KAAK,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;AACxD,SAAO,WAAW,QAAQ,UAAU,eAAe,KAAK,QAAQ,UAAU,YAAY,IAAI;AAC5F;AAEA,SAAS,aAAa,MAAiD;AACrE,SAAO,QAAQ,KAAK,KAAK,EACtB,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,SAAS,KAAK,EACnD,IAAI,CAAC,OAAO;AAAA,IACX,SAAS,EAAE;AAAA,IACX,MAAM,EAAE;AAAA,IACR,MAAM,EAAE;AAAA,IACR,QAAQ,EAAE;AAAA,IACV,MAAM,QAAQ,GAAG,kBAAkB,KAAK;AAAA,IACxC,MAAM,EAAE,WAAW,kBAAkB;AAAA,EACvC,EAAE;AACN;AAEA,SAAS,kBAAkB,MAAkB,MAAyB;AACpE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,KAAK,aAAa;AAAA,IAC/B;AAAA,IACA,gBAAgB,WAAW,IAAI,KAAK,WAAW;AAAA,IAC/C;AAAA,IACA;AAAA,IACA,KAAK,UAAU,aAAa,IAAI,GAAG,MAAM,CAAC;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAOA,eAAsB,UACpB,MACA,kBACA,OACA,QAAsB,sBACF;AACpB,QAAM,QAAQ,IAAI,IAAI,iBAAiB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAC3D,QAAM,MAAiB,CAAC;AACxB,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,MAAM,IAAI,KAAK,OAAO,EAAG;AAC9B,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,MAAM,kBAAkB,MAAM,IAAI,CAAC;AAAA,IACpD,QAAQ;AACN;AAAA,IACF;AACA,UAAM,WAAW,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW;AACzE,UAAM,MAAM,OAAO;AACnB,UAAM,OAAO,OAAO;AACpB,UAAM,QAAQ,MAAM,QAAQ,OAAO,iBAAiB,IAChD,OAAO,kBAAkB,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IACzE,CAAC;AACL,QAAI,KAAK;AAAA,MACP,QAAQ,KAAK;AAAA,MACb,cAAc;AAAA,MACd,UAAU,QAAQ,SAAS,QAAQ,YAAY,QAAQ,SAAS,MAAM,KAAK;AAAA,MAC3E,SAAS,KAAK;AAAA,MACd,UAAU,EAAE,OAAO,SAAS,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY,GAAG;AAAA,MACzF,cAAc;AAAA,QACZ,QAAQ,KAAK,aAAa;AAAA,QAC1B,QAAQ,cAAc,KAAK,aAAa,gBAAgB,EAAE,SAAS,CAAC;AAAA,MACtE;AAAA,MACA,GAAI,SAAS,SAAS,SAAS,YAAY,SAAS,SAAS,EAAE,YAAY,KAAK,IAAI,CAAC;AAAA,IACvF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAOA,eAAsB,mBACpB,UACA,OACkB;AAClB,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,MACL,UAAU;AAAA,MACV,kBAAkB;AAAA,MAClB,cAAc;AAAA,IAChB;AAAA,EACF;AACA,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA,KAAK;AAAA,MACH,SAAS,IAAI,CAAC,OAAO;AAAA,QACnB,MAAM,EAAE;AAAA,QACR,UAAU,EAAE;AAAA,QACZ,SAAS,EAAE;AAAA,QACX,UAAU,EAAE,SAAS;AAAA,QACrB,KAAK,EAAE;AAAA,MACT,EAAE;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACX,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,MAAM;AAC9B,WAAO;AAAA,MACL,UAAU,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW,iBAAiB,QAAQ;AAAA,MACrF,kBAAkB,OAAO,IAAI,uBAAuB,WAAW,IAAI,qBAAqB;AAAA,MACxF,cAAc,OAAO,IAAI,mBAAmB,WAAW,IAAI,iBAAiB;AAAA,IAC9E;AAAA,EACF,QAAQ;AACN,WAAO,EAAE,UAAU,iBAAiB,QAAQ,GAAG,kBAAkB,MAAM,cAAc,KAAK;AAAA,EAC5F;AACF;AAEA,SAAS,iBAAiB,UAA6B;AACrD,QAAM,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,MAAM,EAAE;AAC3D,SAAO,GAAG,SAAS,MAAM,cAAc,OAAO,IAAI,KAAK,IAAI,mBAAmB,EAAE;AAClF;AAGO,SAAS,qBAAqB,GAA2B;AAC9D,QAAM,QAAQ,CAAC,6BAAwB,EAAE,OAAO,MAAM,EAAE;AACxD,QAAM;AAAA,IACJ,oBAAoB,EAAE,cAAc,gBAAa,EAAE,IAAI,SAAM,EAAE,YAAY;AAAA,IAC3E;AAAA,EACF;AACA,MAAI,EAAE,SAAS;AACb,UAAM,KAAK,KAAK,EAAE,QAAQ,QAAQ,MAAM,EAAE;AAC1C,QAAI,EAAE,QAAQ,kBAAkB;AAC9B,YAAM,MAAM,EAAE,QAAQ,eAAe,mBAAmB,EAAE,QAAQ,YAAY,QAAQ;AACtF,YAAM,KAAK,uBAAuB,EAAE,QAAQ,gBAAgB,GAAG,GAAG,IAAI,EAAE;AAAA,IAC1E;AAAA,EACF;AACA,MAAI,EAAE,SAAS,WAAW,GAAG;AAC3B,QAAI,CAAC,EAAE,QAAS,OAAM,KAAK,wCAAwC;AACnE,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACA,QAAM,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,EAAE;AAC3C,aAAW,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,MAAM,EAAE,QAAQ,IAAI,MAAM,EAAE,QAAQ,CAAC,GAAG;AACxF,UAAM,OAAO,EAAE,aAAa,gBAAgB,EAAE,UAAU,KAAK;AAC7D,UAAM,KAAK,OAAO,EAAE,SAAS,YAAY,CAAC,KAAK,EAAE,MAAM,KAAK,EAAE,YAAY,GAAG,IAAI,KAAK,EAAE;AACxF,UAAM,KAAK,kBAAkB,EAAE,OAAO,EAAE;AACxC,UAAM,KAAK,mBAAmB,EAAE,SAAS,OAAO,EAAE;AAClD,UAAM,KAAK,gBAAgB,EAAE,SAAS,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,KAAK,QAAG,EAAE;AACtF,UAAM,KAAK,0BAA0B,EAAE,aAAa,MAAM,QAAQ,EAAE,aAAa,MAAM,IAAI,EAAE;AAAA,EAC/F;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AC/dA,SAAS,OAAO,GAAmB;AACjC,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAK,KAAK,IAAI,KAAM,EAAE,WAAW,CAAC;AAChE,SAAO,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AACpC;AAGO,SAAS,sBAAsB,KAA0B;AAC9D,QAAM,MAAM,MAAM,QAAQ,GAAG,IACzB,MACA,MAAM,QAAS,KAA+B,KAAK,IAChD,IAA6B,QAC9B,MAAM,QAAS,KAAiC,OAAO,IACpD,IAA+B,UAChC,CAAC;AACT,SAAO,IAAI,IAAI,CAAC,UAAU;AACxB,UAAM,IAAI;AACV,UAAM,cACJ,OAAO,EAAE,UAAU,WACf,EAAE,QACF,OAAQ,EAAE,OAAiD,iBAAiB,WACzE,EAAE,MAAmC,eACtC;AACR,UAAM,YAAa,EAAE,WAA+C;AACpE,WAAO;AAAA,MACL,UAAU,OAAO,EAAE,aAAa,YAAY,EAAE,WAAW,EAAE,WAAW,OAAO,WAAW;AAAA,MACxF,OAAO,EAAE,cAAc,YAAY;AAAA,MACnC,GAAI,OAAO,cAAc,WAAW,EAAE,WAAW,EAAE,QAAQ,UAAU,EAAE,IAAI,CAAC;AAAA,MAC5E,GAAI,MAAM,QAAQ,EAAE,UAAU,IAAI,EAAE,YAAY,EAAE,WAA8B,IAAI,CAAC;AAAA,MACrF,GAAI,MAAM,QAAQ,EAAE,IAAI,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,IAAI,CAAC;AAAA,IAC9D;AAAA,EACF,CAAC;AACH;AAGA,SAAS,QAAQ,QAAgB,IAAQ,UAA2B;AAClE,SAAO,OAAO,OACV,WAAW,WACX,OAAO,OACL,SAAS,WACT,OAAO,QACL,UAAU,WACV,OAAO,OACL,SAAS,WACT,UAAU;AACtB;AACA,SAASC,UAAS,GAAiB;AACjC,QAAM,IAAI,EAAE,WAAW,kBAAkB;AACzC,SAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACvC;AACA,SAAS,iBAAiB,OAAyB;AACjD,SAAO,MACJ,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,MAAM,EACN,KAAK,CAAC,GAAG,MAAM,OAAO,OAAO,EAAE,iBAAiB,IAAI,OAAO,EAAE,iBAAiB,CAAC,CAAC,EAChF,IAAIA,SAAQ;AACjB;AACA,SAAS,cAAc,KAAe,QAA2B;AAC/D,MAAI,IAAI;AACR,aAAW,KAAK,QAAQ;AACtB,QAAI,MAAM,IAAI,CAAC,EAAG;AAClB,QAAI,MAAM,IAAI,OAAQ,QAAO;AAAA,EAC/B;AACA,SAAO,IAAI,WAAW;AACxB;AAeA,eAAsB,kBACpB,GACA,KAC0B;AAC1B,QAAM,IAAI;AACV,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK,YAAY;AACf,YAAM,IAAI,OAAO,EAAE,SAAS,EAAE;AAC9B,aAAO,IAAI,OAAO,SAAS,CAAC,IACxB,EAAE,MAAM,EAAE,MAAM,SAAS,OAAO,IAChC,EAAE,MAAM,EAAE,MAAM,SAAS,QAAQ,QAAQ,IAAI,OAAO;AAAA,IAC1D;AAAA,IACA,KAAK,gBAAgB;AACnB,YAAM,IAAI,OAAO,EAAE,SAAS,EAAE;AAC9B,aAAO,IAAI,OAAO,SAAS,CAAC,IACxB,EAAE,MAAM,EAAE,MAAM,SAAS,QAAQ,QAAQ,IAAI,OAAO,IACpD,EAAE,MAAM,EAAE,MAAM,SAAS,OAAO;AAAA,IACtC;AAAA,IACA,KAAK,SAAS;AACZ,UAAI;AACJ,UAAI;AACF,aAAK,IAAI,OAAO,OAAO,EAAE,WAAW,EAAE,CAAC;AAAA,MACzC,QAAQ;AACN,eAAO,EAAE,MAAM,EAAE,MAAM,SAAS,QAAQ,QAAQ,kBAAkB,EAAE,OAAO,GAAG;AAAA,MAChF;AACA,aAAO,GAAG,KAAK,IAAI,MAAM,IACrB,EAAE,MAAM,EAAE,MAAM,SAAS,OAAO,IAChC,EAAE,MAAM,EAAE,MAAM,SAAS,QAAQ,QAAQ,IAAI,OAAO;AAAA,IAC1D;AAAA,IACA,KAAK,mBAAmB;AACtB,YAAM,QAAQ,IAAI,MAAM;AAAA,QACtB,CAAC,MAAM,EAAE,SAAS,UAAUA,UAAS,CAAC,MAAM,OAAO,EAAE,QAAQ,EAAE;AAAA,MACjE,EAAE;AACF,aAAO,QAAQ,OAAQ,EAAE,MAAa,MAAM,OAAO,EAAE,SAAS,CAAC,CAAC,IAC5D,EAAE,MAAM,EAAE,MAAM,SAAS,QAAQ,QAAQ,MAAM,IAC/C,EAAE,MAAM,EAAE,MAAM,SAAS,QAAQ,QAAQ,MAAM;AAAA,IACrD;AAAA,IACA,KAAK,mBAAmB;AACtB,YAAM,MAAM,MAAM,QAAQ,EAAE,QAAQ,IAAK,EAAE,SAAuB,IAAI,MAAM,IAAI,CAAC;AACjF,YAAM,SAAS,iBAAiB,IAAI,KAAK;AACzC,aAAO,cAAc,KAAK,MAAM,IAC5B,EAAE,MAAM,EAAE,MAAM,SAAS,QAAQ,OAAO,IACxC,EAAE,MAAM,EAAE,MAAM,SAAS,QAAQ,OAAO;AAAA,IAC9C;AAAA,IACA,KAAK,cAAc;AACjB,UAAI,IAAI,cAAc;AACpB,eAAO,EAAE,MAAM,EAAE,MAAM,SAAS,QAAQ,QAAQ,yBAAyB;AAC3E,aAAO,QAAQ,IAAI,YAAa,EAAE,MAAa,OAAO,OAAO,EAAE,SAAS,CAAC,CAAC,IACtE,EAAE,MAAM,EAAE,MAAM,SAAS,QAAQ,QAAQ,IAAI,WAAW,IACxD,EAAE,MAAM,EAAE,MAAM,SAAS,QAAQ,QAAQ,IAAI,WAAW;AAAA,IAC9D;AAAA,IACA,KAAK,kBAAkB;AACrB,UAAI,CAAC,IAAI;AACP,eAAO,EAAE,MAAM,EAAE,MAAM,SAAS,QAAQ,QAAQ,wBAAwB;AAC1E,UAAI,CAAC,IAAI,WAAW;AAClB,eAAO,EAAE,MAAM,EAAE,MAAM,SAAS,QAAQ,QAAQ,8BAA8B;AAChF,YAAM,MAAM,MAAM,IAAI;AAAA,QACpB,OAAO,EAAE,YAAY,EAAE;AAAA,QACvB,IAAI;AAAA,QACJ,IAAI,UAAU;AAAA,MAChB;AACA,aAAO,EAAE,MAAM,EAAE,MAAM,SAAS,IAAI,SAAS,QAAQ,IAAI,UAAU;AAAA,IACrE;AAAA,IACA;AACE,aAAO,EAAE,MAAM,EAAE,MAAM,SAAS,QAAQ,QAAQ,2BAA2B,EAAE,IAAI,GAAG;AAAA,EACxF;AACF;AAWA,eAAsB,WACpB,SACA,OACA,MACwB;AACxB,QAAM,UAAwB,CAAC;AAC/B,aAAW,KAAK,OAAO;AACrB,UAAM,QAAQ,EAAE,MAAM;AACtB,QAAI,SAAS;AACb,QAAI,iBAAgC;AACpC,QAAI,QAAgB,CAAC;AACrB,QAAI;AACJ,QAAI,aAAa;AACjB,QAAI;AACF,YAAM,MAAM,MAAM,KAAK,SAAS,KAAK;AACrC,eAAS,IAAI;AACb,uBAAiB,IAAI;AACrB,UAAI,gBAAgB;AAClB,YAAI;AACF,kBAAQ,MAAM,KAAK,WAAW,cAAc;AAAA,QAC9C,QAAQ;AAGN,sBAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF,QAAQ;AACN,mBAAa;AACb,kBAAY;AAAA,IACd;AACA,UAAM,mBAAsC,CAAC;AAC7C,QAAI,CAAC,YAAY;AACf,iBAAW,KAAK,EAAE,cAAc,CAAC,GAAG;AAClC,yBAAiB;AAAA,UACf,MAAM,kBAAkB,GAAG;AAAA,YACzB;AAAA,YACA;AAAA,YACA,WAAW,EAAE;AAAA,YACb,oBAAoB,KAAK;AAAA,UAC3B,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK;AAAA,MACX,SAAS,EAAE;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACnC,CAAC;AAAA,EACH;AACA,QAAM,OAAO,QAAQ,QAAQ,CAAC,MAAM,EAAE,UAAU;AAChD,SAAO;AAAA,IACL;AAAA,IACA,OAAO,MAAM;AAAA,IACb,QAAQ,KAAK,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,EAAE;AAAA,IACjD,QAAQ,KAAK,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,EAAE;AAAA,IACjD,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,EAAE;AAAA,IAClD,OAAO;AAAA,EACT;AACF;;;AC/PA,eAAe,cACb,UACA,QACA,WAC0D;AAC1D,QAAM,SAAS;AAAA,IACb;AAAA,IACA,WAAW,uBAAuB,QAAQ,KAAK;AAAA,IAC/C,WAAW,MAAM;AAAA,IACjB,cAAc,SAAS;AAAA,IACvB;AAAA,EACF,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AACZ,QAAM,MAAM,MAAM,UAAU,QAAQ,EAAE,WAAW,KAAQ,CAAC;AAC1D,SAAO;AAAA,IACL,SAAS,IAAI,YAAY,SAAS,SAAS;AAAA,IAC3C,WAAW,OAAO,IAAI,cAAc,WAAW,IAAI,YAAY;AAAA,EACjE;AACF;AAEO,SAAS,MAAM,KAAqB;AAMzC,QAAM,cAAc,OAClB,gBACA,OAAmD,CAAC,MACxB;AAC5B,UAAM,EAAE,OAAO,SAAS,IAAI,MAAM,0BAA0B,KAAK,cAAc;AAC/E,QAAI,MAAM,WAAW,EAAG,OAAM,IAAI,MAAM,oCAAoC,cAAc,EAAE;AAC5F,UAAM,iBAAiB,SAAS,CAAC,KAAK;AACtC,UAAM,kBACJ,SAAS,SAAS,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,YAAY,cAAc,IAAI;AAC1F,UAAM,OAAO,kBAAkB,gBAAgB,eAAe;AAC9D,UAAM,WAAW,SAAS,IAAI;AAC9B,QAAI,OAA+B;AACnC,QAAI;AACJ,QAAI,KAAK,OAAO,gBAAgB,GAAG;AACjC,YAAM,QAAQ,CAAC,WAAmB,UAAU,QAAQ,EAAE,WAAW,KAAK,eAAe,CAAC;AACtF,YAAM,SAAS,MAAM,UAAU,MAAM,UAAU,KAAK;AACpD,eAAS,KAAK,GAAG,MAAM;AACvB,gBAAU,MAAM,mBAAmB,UAAU,KAAK;AAClD,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,aAAa;AAAA,MACb;AAAA,MACA,cAAc,cAAc,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,MAC3C,cAAc,SAAS;AAAA,MACvB,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA;AAAA,IAEL,QAAQ,CAAC,SAAkB,YAAY,KAAK,IAAI;AAAA;AAAA,IAEhD,OAAO,CAAC,gBAAwB,SAC9B,uBAAuB,KAAK,gBAAgB,IAAI;AAAA,IAClD,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,IAKV,MAAM,OACJ,iBACA,OAAmD,CAAC,MACjD;AACH,YAAM,UAAU,CAAC;AACjB,iBAAW,MAAM,iBAAiB;AAChC,YAAI;AACF,kBAAQ,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC;AAAA,QAC1C,SAAS,GAAG;AACV,kBAAQ,KAAK;AAAA,YACX,gBAAgB;AAAA,YAChB,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AAAA,UAClD,CAAC;AAAA,QACH;AAAA,MACF;AACA,YAAM,SAAiC,CAAC;AACxC,UAAI,gBAAgB;AACpB,iBAAW,KAAK,SAAS;AACvB,YAAI,EAAE,cAAc,GAAI;AACxB,mBAAW,KAAK,EAAE,UAAU;AAC1B,iBAAO,EAAE,MAAM,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK;AAC7C,2BAAiB;AAAA,QACnB;AAAA,MACF;AACA,aAAO;AAAA,QACL,SAAS,gBAAgB;AAAA,QACzB;AAAA,QACA,gBAAgB,OAAO,QAAQ,MAAM,EAClC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,EAAE,QAAQ,MAAM,EAAE;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAAA;AAAA,IAEA,cAAc,CAAC,QAA6B,sBAAsB,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMrE,aAAa,OACX,SACA,OACA,OAA4C,CAAC,MAClB;AAC3B,YAAM,OAAO,MAAM,eAAe,KAAK,SAAS,KAAK,WAAW,IAAI;AACpE,aAAO,WAAW,SAAS,OAAO;AAAA,QAChC,UAAU,OAAO,UAAU;AACzB,gBAAM,MAAM,MAAM,SAAS,KAAK,MAAM,OAAO,CAAC,CAAC;AAC/C,iBAAO,EAAE,QAAQ,IAAI,MAAM,gBAAgB,IAAI,kBAAkB,KAAK;AAAA,QACxE;AAAA,QACA,YAAY,OAAO,mBAAmB;AACpC,gBAAM,EAAE,OAAO,SAAS,IAAI,MAAM,0BAA0B,KAAK,cAAc;AAC/E,gBAAM,UAAU,SAAS,CAAC,KAAK;AAC/B,iBAAO;AAAA,YACL;AAAA,YACA,SAAS,SAAS,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,YAAY,OAAO,IAAI;AAAA,UACnF,EAAE;AAAA,QACJ;AAAA,QACA,oBAAoB,KAAK,OAAO,gBAAgB,IAAI,gBAAgB;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACnIA,IAAM,kBAAkB,oBAAI,IAAI,CAAC,aAAa,WAAW,UAAU,WAAW,OAAO,CAAC;AAE/E,SAAS,KAAK,KAAqB;AACxC,SAAO;AAAA,IACL,UAAU,CAAC,SAA+B,aAAa,KAAK,IAAI;AAAA,IAChE,YAAY,CAAC,OAAe,WAAW,KAAK,EAAE;AAAA,IAC9C,eAAe,CAAC,QAA8B,cAAc,KAAK,GAAG;AAAA,IACpE,eAAe,CAAC,OAAe,cAAc,KAAK,EAAE;AAAA,IACpD,iBAAiB,CAAC,IAAY,OAAO,UAAU,gBAAgB,KAAK,IAAI,IAAI;AAAA,IAC5E,kBAAkB,CAAC,IAAY,aAAsB,qBAAqB,KAAK,IAAI,QAAQ;AAAA,IAC3F,eAAe,CAAC,QAAkB,oBAAoB,KAAK,GAAG;AAAA,IAC9D,gBAAgB,MAAM,mBAAmB,GAAG;AAAA,IAC5C,eAAe,CAAC,SAAiB,iBAAiB,KAAK,IAAI;AAAA;AAAA,IAG3D,OAAO,OACL,KACA,OAAoE,CAAC,MAC9C;AACvB,YAAM,OAAO,MAAM,gBAAgB,KAAK,GAAG;AAC3C,UAAI,CAAC,KAAK,KAAM,QAAO;AACvB,aAAO,cAAc,KAAK,KAAK,IAAI,KAAK,aAAa,KAAS,KAAK,cAAc,GAAK;AAAA,IACxF;AAAA,IAEA,aAAa,CAAC,WAAmB,aAAa,KAAK,MAAM;AAAA,EAC3D;AACF;AAEA,eAAe,cACb,KACA,QACA,WACA,YACoB;AACpB,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,QAAM,WAAW,CAAC,MAAiB,gBAAgB,KAAK,EAAE,UAAU,EAAE,SAAS,IAAI,YAAY,CAAC;AAChG,MAAI,OAAO,MAAM,aAAa,KAAK,MAAM;AACzC,SAAO,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,UAAU;AAC/C,UAAM,MAAM,UAAU;AACtB,WAAO,MAAM,aAAa,KAAK,MAAM;AAAA,EACvC;AACA,SAAO;AACT;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAC7C;;;AChEA,SAAS,gBAAAC,qBAAoB;AA0BtB,SAAS,YAAY,KAAsC;AAChE,QAAM,MAAM,IAAI,QAAQ,GAAG;AAC3B,MAAI,OAAO,EAAG,QAAO;AACrB,SAAO,CAAC,IAAI,MAAM,GAAG,GAAG,EAAE,KAAK,GAAG,IAAI,MAAM,MAAM,CAAC,EAAE,KAAK,CAAC;AAC7D;AAGO,SAAS,eAAe,KAAwC;AACrE,QAAM,MAAM,IAAI,QAAQ,GAAG;AAC3B,MAAI,MAAM,EAAG,OAAM,IAAI,MAAM,4CAA4C,GAAG,EAAE;AAC9E,QAAM,MAAM,IAAI,MAAM,GAAG,GAAG;AAC5B,QAAM,QAAQ,IAAI,MAAM,MAAM,CAAC;AAC/B,MAAI,MAAM,WAAW,GAAG,EAAG,QAAO,CAAC,KAAK,MAAM,MAAM,CAAC,GAAG,IAAI;AAC5D,SAAO,CAAC,KAAK,OAAO,KAAK;AAC3B;AAEA,SAAS,WAAW,KAAqB,MAAsB;AAC7D,SAAO,KAAK,WAAW,MAAM,IAAI,OAAO,GAAG,IAAI,OAAO,GAAG,KAAK,WAAW,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI;AACjG;AAEA,eAAsB,QACpB,KACA,MACA,OAAuB,CAAC,GACA;AACxB,WAAS,GAAG;AACZ,QAAM,MAAM,WAAW,KAAK,IAAI;AAChC,QAAM,QAAgC,CAAC;AACvC,aAAW,KAAK,KAAK,UAAU,CAAC,GAAG;AACjC,UAAM,SAAS,YAAY,CAAC;AAC5B,QAAI,OAAQ,OAAM,OAAO,CAAC,EAAE,YAAY,CAAC,IAAI,OAAO,CAAC;AAAA,EACvD;AAEA,MAAI;AACJ,MAAI,KAAK,QAAQ,KAAK,KAAK,SAAS,GAAG;AACrC,UAAM,KAAK,IAAI,SAAS;AACxB,eAAW,SAAS,KAAK,MAAM;AAC7B,YAAM,CAAC,KAAK,OAAO,MAAM,IAAI,eAAe,KAAK;AACjD,UAAI,OAAQ,IAAG,OAAO,KAAK,IAAI,KAAK,CAACC,cAAa,KAAK,CAAC,CAAC,GAAG,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC;AAAA,UAC7E,IAAG,OAAO,KAAK,KAAK;AAAA,IAC3B;AACA,WAAO;AAAA,EACT,WAAW,KAAK,SAAS,QAAW;AAClC,WAAO,KAAK;AACZ,QAAI,CAAC,MAAM,cAAc,EAAG,OAAM,cAAc,IAAI;AAAA,EACtD;AAEA,QAAM,SAAS,KAAK,WAAW,SAAS,SAAY,SAAS;AAC7D,QAAMC,WAAU;AAAA,IACd,EAAE,GAAG,KAAK,gBAAgB,KAAK,kBAAkB,IAAI,eAAe;AAAA,IACpE;AAAA,EACF;AAEA,MAAI,KAAK,QAAS,SAAQ,OAAO,MAAM,KAAK,MAAM,IAAI,GAAG;AAAA,CAAI;AAE7D,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,aAAa,GAAM;AAC3E,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,SAAAA,UAAS,MAAM,QAAQ,WAAW,OAAO,CAAC;AACjF,WAAO,EAAE,QAAQ,IAAI,QAAQ,YAAY,IAAI,YAAY,MAAM,MAAM,IAAI,KAAK,EAAE;AAAA,EAClF,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;;;ACrDO,SAAS,aAAa,OAAsB,CAAC,GAAc;AAChE,QAAM,MAAM,eAAe,IAAI;AAC/B,SAAO;AAAA,IACL;AAAA,IACA,IAAI,GAAG,GAAG;AAAA,IACV,UAAU,UAAU,GAAG;AAAA,IACvB,WAAW,UAAU,GAAG;AAAA,IACxB,QAAQ,OAAO,GAAG;AAAA,IAClB,SAAS,QAAQ,GAAG;AAAA,IACpB,QAAQ,OAAO,GAAG;AAAA,IAClB,QAAQ,OAAO,GAAG;AAAA,IAClB,WAAW,UAAU,GAAG;AAAA,IACxB,OAAO,MAAM,GAAG;AAAA,IAChB,OAAO,MAAM,GAAG;AAAA,IAChB,MAAM,KAAK,GAAG;AAAA,IACd,MAAM,CAAC,MAAM,aAAa,QAAQ,KAAK,MAAM,QAAQ;AAAA,EACvD;AACF;;;AC1DA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBO,SAAS,OAAO,SAAyB;AAC9C,MAAI;AACF,WAAO,IAAI,IAAI,OAAO,EAAE;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,SAAyB;AAC1C,SAAO,QAAQ,QAAQ,QAAQ,EAAE;AACnC;AAEA,SAAS,WAAW,OAAoD;AACtE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,SAAS,UAAU,MAAM,WAAW;AAC1C,SACE,MAAM,YAAY,MAAM,eAAe,QAAQ,sBAAsB,QAAQ,QAAQ,QAAQ;AAEjG;AAGO,SAAS,YACd,SACA,aACA,OAAwE,CAAC,GACjB;AACxD,QAAM,MAAM,UAAU,OAAO;AAC7B,QAAM,QAAqB;AAAA,IACzB,SAAS;AAAA,IACT;AAAA,IACA,cAAc,KAAK;AAAA,IACnB,SAAS,KAAK;AAAA,IACd,aAAa,KAAK;AAAA,IAClB,UAAU,UAAU,KAAK,WAAW,WAAW,GAAG;AAAA,EACpD;AACA,QAAM,SAAS,WAAW,KAAK,KAAK;AACpC,oBAAkB,GAAG;AACrB,SAAO,EAAE,SAAS,KAAK,QAAQ,UAAU,WAAW,KAAK,EAAE;AAC7D;AAUO,SAAS,SAAqB;AACnC,QAAM,UAAU,eAAe;AAC/B,MAAI,CAAC,QAAS,QAAO,EAAE,UAAU,MAAM;AACvC,QAAM,QAAQ,UAAU,OAAO;AAC/B,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,aAAa,OAAO;AAAA,IAC5B,UAAU,UAAU;AAAA,IACpB,UAAU,WAAW,KAAK;AAAA,IAC1B,SAAS,QAAQ,UAAU,UAAU,MAAM,WAAW,CAAC,IAAI;AAAA,EAC7D;AACF;AAEO,SAAS,eAAuB;AACrC,QAAM,UAAU,eAAe;AAC/B,QAAM,QAAQ,UAAU,UAAU,OAAO,IAAI;AAC7C,MAAI,CAAC,MAAO,OAAM,IAAI,WAAW,4DAA4D;AAC7F,SAAO,MAAM;AACf;AAEO,SAAS,SAAoB;AAClC,QAAM,UAAU,eAAe;AAC/B,QAAM,QAAQ,UAAU,UAAU,OAAO,IAAI;AAE7C,QAAM,SAAS,UAAU,OAAO,WAAW,EAAE,KAAK,UAAU,OAAO,eAAe,EAAE;AACpF,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAUO,SAASC,iBAAoC;AAClD,QAAM,UAAU,eAAe;AAC/B,SAAO,cAAW,EAAE;AAAA,IAAQ,CAAC,MAC3B,EAAE,MAAM,IAAI,CAAC,OAAO;AAAA,MAClB,SAAS,EAAE;AAAA,MACX,QAAQ,EAAE;AAAA,MACV,UAAU,EAAE,YAAY,EAAE;AAAA,MAC1B,QAAQ,EAAE,YAAY,WAAW,EAAE,WAAW,EAAE;AAAA,IAClD,EAAE;AAAA,EACJ;AACF;AAGO,SAAS,IAAI,SAAuB;AACzC,QAAM,MAAM,UAAU,OAAO;AAC7B,MAAI,CAAC,UAAU,GAAG,GAAG;AACnB,UAAM,IAAI,WAAW,4BAA4B,GAAG,qCAAqC;AAAA,EAC3F;AACA,oBAAkB,GAAG;AACvB;AAEO,SAAS,SAAkB;AAChC,QAAM,UAAU,eAAe;AAC/B,SAAO,UAAU,YAAY,OAAO,IAAI;AAC1C;AAEO,SAAS,eAAe,SAAiB,QAA0B;AACxE,SAAO,YAAY,UAAU,OAAO,GAAG,MAAM;AAC/C;AAGO,SAAS,WAAW,SAAiB,QAAqD;AAC/F,QAAM,MAAM,UAAU,OAAO;AAC7B,MAAI,CAAC,UAAU,KAAK,MAAM,GAAG;AAC3B,UAAM,IAAI,WAAW,4BAA4B,MAAM,QAAQ,GAAG,GAAG;AAAA,EACvE;AACA,gBAAc,KAAK,MAAM;AACzB,oBAAkB,GAAG;AACrB,SAAO,EAAE,SAAS,KAAK,OAAO;AAChC;AAGO,SAAS,QAAQ,SAAiC;AACvD,QAAM,MAAM,UAAU,OAAO;AAC7B,SAAO,cAAW,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,GAAG,SAAS,CAAC;AAChE;AAGO,SAAS,cAKd;AACA,QAAM,UAAU,eAAe;AAC/B,MAAI,CAAC,QAAS,OAAM,IAAI,WAAW,qDAAqD;AACxF,QAAM,QAAQ,UAAU,OAAO;AAC/B,MAAI,CAAC,MAAO,OAAM,IAAI,WAAW,sBAAsB,OAAO,GAAG;AACjE,SAAO;AAAA,IACL;AAAA,IACA,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,SAAS,MAAM;AAAA,EACjB;AACF;","names":["status","skills","BASE","status","BASE","listResources","manifest_default","template_default","manifest_default","template_default","manifest_default","template_default","manifest_default","template_default","manifest_default","template_default","mkdirSync","resolve","BASE","existsSync","readFileSync","readdirSync","join","statSync","resolve","headers","sampleRows","listResources","sampleRows","headers","mkdirSync","resolve","listResources","mkdirSync","writeFileSync","basename","dirname","resolve","BASE","listQuery","status","existsSync","mkdirSync","readFileSync","readdirSync","statSync","writeFileSync","join","resolve","status","basename","resolve","mkdirSync","dirname","writeFileSync","mkdirSync","writeFileSync","dirname","resolve","readFile","basename","readFile","basename","listTools","status","listTools","status","resolve","mkdirSync","dirname","writeFileSync","spawnSync","resolve","trace","toolName","readFileSync","readFileSync","headers","listPlatforms","listPlatforms"]}
|