@jmoak/vibrissa 2.0.0-alpha.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-TFXZJODE.js → chunk-AMDRQ2RV.js} +2 -2
- package/dist/{chunk-7GFB72TI.js → chunk-TZK5KIGQ.js} +2 -2
- package/dist/chunk-TZK5KIGQ.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/index.js +2 -2
- package/dist/vitest.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-7GFB72TI.js.map +0 -1
- /package/dist/{chunk-TFXZJODE.js.map → chunk-AMDRQ2RV.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/args.ts","../src/normalize.ts","../src/respond-hint.ts","../src/schema.ts","../src/types.ts","../src/session/errors.ts","../src/session/index.ts","../package.json","../src/version.ts","../src/session/http.ts","../src/defaults.ts","../src/config.ts","../src/paths.ts","../src/lint/outcomes.ts","../src/lint/text.ts","../src/lint/descriptions.ts","../src/lint/refs.ts","../src/lint/spec.ts","../src/lint/index.ts","../src/manifest.ts","../src/match.ts","../src/cases.ts","../src/reporters/ansi.ts","../src/reporters/shared.ts","../src/reporters/manifest.ts","../src/reporters/console.ts","../src/reporters/github.ts","../src/reporters/json.ts","../src/reporters/junit.ts","../src/reporters/tap.ts","../src/reporters/index.ts","../src/runner.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { JsonValue } from '../types.js'\n\nexport interface CliErrorDetails {\n /** Stable machine code: `unknown-option`, `unknown-command`, `unknown-tool`, `invalid-argument`, ... */\n code?: string\n /** What to do next (one sentence). Appended to the human message. */\n hint?: string\n /** Suggested next commands, for agents. */\n next?: string[]\n}\n\n/**\n * A command-line mistake (bad flag, missing argument, unknown tool). The dispatcher maps\n * it to exit code 2. `message` is the full human text (detail + hint); `detail` and `hint`\n * are kept apart for the `--json` error envelope.\n */\nexport class UsageError extends Error {\n readonly code: string\n readonly detail: string\n readonly hint?: string\n readonly next?: string[]\n\n constructor(message: string, details: CliErrorDetails = {}) {\n super(details.hint ? `${message} ${details.hint}` : message)\n this.name = 'UsageError'\n this.code = details.code ?? 'usage'\n this.detail = message\n if (details.hint) this.hint = details.hint\n if (details.next) this.next = details.next\n }\n}\n\n/**\n * Flags that take a value, across every command. Used to find positional arguments\n * (`vib call --config x echo` → `echo`) and to split `--flag=value`.\n */\nexport const VALUE_FLAGS = new Set([\n '--config',\n '--server',\n '--server-cwd',\n '--timeout',\n '--env',\n '--profile',\n '--protocol',\n '--args',\n '--arg',\n '--respond',\n '--respond-key',\n '--await-timeout',\n '--out',\n '--out-dir',\n '--name',\n '--tag',\n '--resource',\n '--resource-template',\n '--prompt',\n '--from-tap',\n '--select',\n '--runs',\n '--seed',\n '--strategy',\n '--budget',\n '--id',\n '--allow',\n '--dir',\n '--cases',\n '--from-claude-config',\n '--reporter',\n '--display',\n '--url',\n // vib run / diff (parsed by their own modules; listed so positionals are found correctly)\n '--exclude-tag',\n '--grep',\n '--shard',\n '--repeat',\n '--concurrency',\n '--baseline',\n '--against',\n])\n\nexport function takeFlag(argv: string[], name: string): string | undefined {\n const index = argv.indexOf(name)\n if (index === -1) return undefined\n return argv[index + 1]\n}\n\nexport function hasFlag(argv: string[], name: string): boolean {\n return argv.includes(name)\n}\n\nexport function takeAllFlags(argv: string[], name: string): string[] {\n const values: string[] = []\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === name && argv[i + 1] !== undefined) {\n values.push(argv[i + 1])\n i++\n }\n }\n return values\n}\n\n/** Like takeFlag, but the flag's value may be omitted (`--from-claude-config` alone → ''). */\nexport function takeOptionalFlag(argv: string[], name: string): string | undefined {\n const index = argv.indexOf(name)\n if (index === -1) return undefined\n const next = argv[index + 1]\n if (next === undefined || next.startsWith('--')) return ''\n return next\n}\n\n/** A numeric flag value; throws a UsageError when it is not a number. */\nexport function takeNumberFlag(\n argv: string[],\n name: string,\n { min = 0, integer = false }: { min?: number; integer?: boolean } = {},\n): number | undefined {\n const raw = takeFlag(argv, name)\n if (raw === undefined) return undefined\n const value = Number(raw)\n if (!Number.isFinite(value) || value < min || (integer && !Number.isInteger(value))) {\n throw new UsageError(\n `Invalid ${name} value \"${raw}\": expected ${integer ? 'an integer' : 'a number'} >= ${min}. Example: ${name} ${Math.max(min, integer ? 10 : 1000)}.`,\n )\n }\n return value\n}\n\n/** Split argv at a bare `--`: [own args, passthrough args]. */\nexport function splitAtDoubleDash(argv: string[]): [string[], string[]] {\n const dash = argv.indexOf('--')\n if (dash === -1) return [argv, []]\n return [argv.slice(0, dash), argv.slice(dash + 1)]\n}\n\n/**\n * Non-flag arguments, in order. Tokens following a value-taking flag are skipped; any\n * other token starting with `--` is treated as a boolean flag. Stops at a bare `--`.\n */\nexport function positionals(\n argv: string[],\n valueFlags: ReadonlySet<string> = VALUE_FLAGS,\n): string[] {\n const out: string[] = []\n for (let i = 0; i < argv.length; i++) {\n const token = argv[i]\n if (token === '--') break\n if (token.startsWith('--')) {\n if (valueFlags.has(token)) i++\n continue\n }\n if (token === '-h') continue\n out.push(token)\n }\n return out\n}\n\n/** `--runs=5` → `--runs 5` for known value flags. Everything after `--` is left alone. */\nexport function normalizeArgv(\n argv: string[],\n valueFlags: ReadonlySet<string> = VALUE_FLAGS,\n): string[] {\n const out: string[] = []\n for (let i = 0; i < argv.length; i++) {\n const token = argv[i]\n if (token === '--') {\n out.push(...argv.slice(i))\n break\n }\n const eq = token.indexOf('=')\n if (token.startsWith('--') && eq > 2 && valueFlags.has(token.slice(0, eq))) {\n out.push(token.slice(0, eq), token.slice(eq + 1))\n continue\n }\n out.push(token)\n }\n return out\n}\n\n/** Every `--flag` token before a bare `--` (values of value flags are skipped). */\nexport function flagTokens(\n argv: string[],\n valueFlags: ReadonlySet<string> = VALUE_FLAGS,\n): string[] {\n const out: string[] = []\n for (let i = 0; i < argv.length; i++) {\n const token = argv[i]\n if (token === '--') break\n if (!token.startsWith('--')) continue\n out.push(token)\n if (valueFlags.has(token)) i++\n }\n return out\n}\n\n/**\n * Throw a UsageError (code `unknown-option`, with a did-you-mean) for the first `--flag`\n * in `argv` (before a bare `--`) that is not in `accepted`. `--help`, `--json` and\n * `--compact` are always accepted.\n */\nexport function assertKnownFlags(\n argv: string[],\n accepted: Iterable<string>,\n command: string,\n valueFlags: ReadonlySet<string> = VALUE_FLAGS,\n): void {\n const known = new Set([...accepted, '--help', '--json', '--compact'])\n for (const flag of flagTokens(argv, valueFlags)) {\n if (known.has(flag)) continue\n throw unknownOptionError(flag, known, command)\n }\n}\n\nexport function unknownOptionError(\n flag: string,\n accepted: Iterable<string>,\n command: string,\n): UsageError {\n const suggestion = closest(flag, [...accepted])\n return new UsageError(`Unknown option ${flag} for vib ${command}.`, {\n code: 'unknown-option',\n hint: `${suggestion ? `Did you mean ${suggestion}? ` : ''}Run vib ${command} --help for its options.`,\n next: [`vib ${command} --help`],\n })\n}\n\n/**\n * A UsageError for a name the server does not list (tool, prompt, resource): did-you-mean\n * plus the available names.\n */\nexport function unknownNameError(\n kind: string,\n name: string,\n available: string[],\n listCommand?: string,\n): UsageError {\n const suggestion = closest(name, available)\n const shown = available.slice(0, 12)\n const more =\n available.length > shown.length ? `, … (${available.length - shown.length} more)` : ''\n const have = available.length\n ? `Available: ${shown.join(', ')}${more}.`\n : `The server lists no ${kind}s.`\n return new UsageError(`Unknown ${kind} \"${name}\" on this server.`, {\n code: `unknown-${kind.replace(/\\s+/g, '-')}`,\n hint: `${suggestion ? `Did you mean \"${suggestion}\"? ` : ''}${have} Pass --expect-missing to send it anyway.`,\n ...(listCommand ? { next: [listCommand] } : {}),\n })\n}\n\n/** Closest candidate by edit distance (for \"did you mean\" hints), or undefined. */\nexport function closest(input: string, candidates: readonly string[]): string | undefined {\n let best: string | undefined\n let bestScore = Number.POSITIVE_INFINITY\n for (const candidate of candidates) {\n const score = editDistance(input.toLowerCase(), candidate.toLowerCase())\n if (score < bestScore) {\n bestScore = score\n best = candidate\n }\n }\n if (best === undefined) return undefined\n return bestScore <= Math.max(2, Math.floor(input.length / 3)) ? best : undefined\n}\n\nfunction editDistance(a: string, b: string): number {\n const row = Array.from({ length: b.length + 1 }, (_, i) => i)\n for (let i = 1; i <= a.length; i++) {\n let prev = row[0]\n row[0] = i\n for (let j = 1; j <= b.length; j++) {\n const tmp = row[j]\n row[j] = Math.min(row[j] + 1, row[j - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1))\n prev = tmp\n }\n }\n return row[b.length]\n}\n\nexport function splitCommandLine(input: string): { cmd: string; args: string[] } {\n const tokens: string[] = []\n let current = ''\n let quote: '\"' | \"'\" | null = null\n for (let i = 0; i < input.length; i++) {\n const ch = input[i]\n if (quote) {\n if (ch === quote) quote = null\n else current += ch\n continue\n }\n if (ch === '\"' || ch === \"'\") {\n quote = ch\n continue\n }\n if (/\\s/.test(ch)) {\n if (current) {\n tokens.push(current)\n current = ''\n }\n continue\n }\n current += ch\n }\n if (current) tokens.push(current)\n if (tokens.length === 0) throw new Error('Empty --server command')\n return { cmd: tokens[0], args: tokens.slice(1) }\n}\n\nexport function parseEnvPairs(pairs: string[]): Record<string, string> {\n const env: Record<string, string> = {}\n for (const pair of pairs) {\n const eq = pair.indexOf('=')\n if (eq <= 0)\n throw new UsageError(`Invalid --env value \"${pair}\" (expected KEY=VALUE).`, {\n code: 'invalid-argument',\n hint: 'Example: --env API_TOKEN=abc123.',\n })\n env[pair.slice(0, eq)] = pair.slice(eq + 1)\n }\n return env\n}\n\nexport function parseArgValue(raw: string): JsonValue {\n if (raw === 'true') return true\n if (raw === 'false') return false\n if (raw === 'null') return null\n if (/^-?\\d+(\\.\\d+)?$/.test(raw)) return Number(raw)\n if (\n (raw.startsWith('{') && raw.endsWith('}')) ||\n (raw.startsWith('[') && raw.endsWith(']')) ||\n (raw.startsWith('\"') && raw.endsWith('\"'))\n ) {\n try {\n return JSON.parse(raw) as JsonValue\n } catch {\n return raw\n }\n }\n return raw\n}\n\nexport function parseToolArgs(argv: string[]): Record<string, JsonValue> {\n const json = takeFlag(argv, '--args')\n const pairs = takeAllFlags(argv, '--arg')\n let args: Record<string, JsonValue> = {}\n if (json !== undefined) {\n let parsed: unknown\n try {\n parsed = JSON.parse(json)\n } catch (err) {\n throw new UsageError(\n `Invalid --args JSON: ${err instanceof Error ? err.message : String(err)}.`,\n {\n code: 'invalid-argument',\n hint: `Quote the object in single quotes: --args '{\"text\": \"hi\"}'.`,\n },\n )\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new UsageError('--args must be a JSON object.', {\n code: 'invalid-argument',\n hint: `Example: --args '{\"text\": \"hi\"}'.`,\n })\n }\n args = { ...(parsed as Record<string, JsonValue>) }\n }\n for (const pair of pairs) {\n const eq = pair.indexOf('=')\n if (eq <= 0)\n throw new UsageError(`Invalid --arg value \"${pair}\" (expected key=value).`, {\n code: 'invalid-argument',\n hint: 'Example: --arg text=hello (true, 3, null and JSON values are parsed).',\n })\n args[pair.slice(0, eq)] = parseArgValue(pair.slice(eq + 1))\n }\n return args\n}\n\n/** Prompt arguments are strings on the wire: stringify anything --arg parsed as JSON. */\nexport function stringifyArgs(args: Record<string, JsonValue>): Record<string, JsonValue> {\n const out: Record<string, JsonValue> = {}\n for (const [key, value] of Object.entries(args)) {\n out[key] = typeof value === 'string' ? value : JSON.stringify(value)\n }\n return out\n}\n\nfunction parseJsonObject(raw: string, flag: string, example: string): Record<string, JsonValue> {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n throw new UsageError(\n `Invalid ${flag} JSON: ${err instanceof Error ? err.message : String(err)}. Example: ${flag} '${example}'.`,\n )\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new UsageError(`Invalid ${flag}: expected a JSON object. Example: ${flag} '${example}'.`)\n }\n return parsed as Record<string, JsonValue>\n}\n\nconst RESPOND_EXAMPLE = '{\"elicitation/create\": {\"action\": \"accept\", \"content\": {\"confirm\": true}}}'\n\n/**\n * Scripted MRTR answers from `--respond '{\"method\": result}'` (repeatable, merged) and\n * `--respond-key method=<json>` (repeatable). Undefined when neither was given.\n */\nexport function parseRespond(argv: string[]): Record<string, JsonValue> | undefined {\n const maps = takeAllFlags(argv, '--respond')\n const pairs = takeAllFlags(argv, '--respond-key')\n if (maps.length === 0 && pairs.length === 0) return undefined\n const out: Record<string, JsonValue> = {}\n for (const raw of maps) Object.assign(out, parseJsonObject(raw, '--respond', RESPOND_EXAMPLE))\n for (const pair of pairs) {\n const eq = pair.indexOf('=')\n if (eq <= 0) {\n throw new UsageError(\n `Invalid --respond-key value \"${pair}\": expected method=<json>. Example: --respond-key 'elicitation/create={\"action\":\"accept\"}'.`,\n )\n }\n const raw = pair.slice(eq + 1)\n let value: JsonValue\n try {\n value = JSON.parse(raw) as JsonValue\n } catch (err) {\n throw new UsageError(\n `Invalid --respond-key JSON for ${pair.slice(0, eq)}: ${err instanceof Error ? err.message : String(err)}. Quote the JSON in single quotes.`,\n )\n }\n out[pair.slice(0, eq)] = value\n }\n return out\n}\n\nexport function resolvePathFromCwd(value: string): string {\n return path.isAbsolute(value) ? value : path.resolve(process.cwd(), value)\n}\n\nlet jsonStyle: 'auto' | 'compact' | 'pretty' = 'auto'\n\n/** `--compact` forces single-line JSON; `auto` = pretty on a TTY, compact otherwise. */\nexport function setJsonStyle(style: 'auto' | 'compact' | 'pretty'): void {\n jsonStyle = style\n}\n\n/** Print one JSON document on stdout (compact when piped or --compact, pretty on a TTY). */\nexport function printJson(value: unknown): void {\n const compact = jsonStyle === 'compact' || (jsonStyle === 'auto' && !process.stdout.isTTY)\n console.log(compact ? JSON.stringify(value) : JSON.stringify(value, null, 2))\n}\n\n/** Drop empty arrays and undefined values (recursively) for terse --json payloads. */\nexport function pruneEmpty<T>(value: T): T {\n if (Array.isArray(value)) return value.map((v) => pruneEmpty(v)) as T\n if (typeof value !== 'object' || value === null) return value\n const out: Record<string, unknown> = {}\n for (const [key, child] of Object.entries(value)) {\n if (child === undefined || (Array.isArray(child) && child.length === 0)) continue\n out[key] = pruneEmpty(child)\n }\n return out as T\n}\n\n/** Short `k=v` rendering of arguments for case names: `text=hello uppercase=true`. */\nexport function argsSummary(args: Record<string, JsonValue> | undefined, max = 48): string {\n const parts = Object.entries(args ?? {}).map(([key, value]) => {\n const text = typeof value === 'string' ? value : JSON.stringify(value)\n return `${key}=${text.length > 24 ? `${text.slice(0, 23)}…` : text}`\n })\n const joined = parts.join(' ')\n return joined.length > max ? `${joined.slice(0, max - 1)}…` : joined\n}\n\n/**\n * Where new case files go: the static directory of the first positive glob\n * (`cases/**` + `/*.json` → `cases`) and the file suffix it expects (`.json`, `.case.json`).\n */\nexport function suiteLayout(globs: string[]): { dir: string; suffix: string } {\n const glob = (globs.find((g) => !g.startsWith('!')) ?? 'tests/integration/**/*.json').replace(\n /\\\\/g,\n '/',\n )\n const segments = glob.split('/')\n const dir: string[] = []\n for (const segment of segments.slice(0, -1)) {\n if (/[*?[\\]{}()!]/.test(segment)) break\n dir.push(segment)\n }\n const last = segments[segments.length - 1]\n const star = last.lastIndexOf('*')\n const tail = star === -1 ? '' : last.slice(star + 1)\n const suffix = /^\\.[\\w.-]+$/.test(tail) ? tail : '.json'\n return { dir: dir.join('/') || '.', suffix }\n}\n\n/** `file` itself, or `name-2.json`, `name-3.json`, ... when it already exists. */\nexport function uniquePath(file: string, suffix = path.extname(file)): string {\n if (!fs.existsSync(file)) return file\n const base = file.endsWith(suffix) ? file.slice(0, -suffix.length) : file\n for (let n = 2; ; n++) {\n const candidate = `${base}-${n}${suffix}`\n if (!fs.existsSync(candidate)) return candidate\n }\n}\n\nexport function slugify(input: string, max = 48): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, max)\n .replace(/-+$/g, '')\n}\n\n/**\n * `$schema` value for a file written under `rootDir`: a relative path to the installed\n * `@jmoak/vibrissa` schema when it exists, else the published unpkg URL.\n */\nexport function schemaRefFor(\n fromFile: string,\n rootDir: string,\n schemaName: 'case.schema.json' | 'vibrissa.schema.json',\n): string {\n const local = path.join(rootDir, 'node_modules', '@jmoak', 'vibrissa', 'schema', schemaName)\n if (fs.existsSync(local)) {\n return path.relative(path.dirname(fromFile), local).replace(/\\\\/g, '/')\n }\n return `https://unpkg.com/@jmoak/vibrissa/schema/${schemaName}`\n}\n\n/** Write `value` as pretty JSON with a trailing newline, creating parent directories. */\nexport function writeJsonFile(file: string, value: unknown): void {\n fs.mkdirSync(path.dirname(file), { recursive: true })\n fs.writeFileSync(file, `${JSON.stringify(value, null, 2)}\\n`, 'utf8')\n}\n\nexport function escapeRegex(input: string): string {\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n","/**\n * Result-envelope normalization, applied by the runner before matching and before\n * recording so goldens stay free of per-protocol-version noise. Pure and idempotent:\n * the input is never mutated and `normalizeResult(normalizeResult(x)) === normalizeResult(x)`\n * structurally.\n */\nimport type { JsonValue } from './types.js'\n\nexport interface NormalizeConfig {\n /** Glob patterns (`*` = any run of characters) for keys removed from every `_meta` object. */\n stripMeta?: string[]\n /** Top-level result keys to remove. */\n dropKeys?: string[]\n /** `'ignore'` removes top-level `ttlMs` and `cacheScope` (list-result cache hints). */\n ttlMs?: 'keep' | 'ignore'\n}\n\nexport const defaultNormalizeConfig: Required<NormalizeConfig> = Object.freeze({\n stripMeta: Object.freeze(['io.modelcontextprotocol/*']) as string[],\n dropKeys: Object.freeze(['resultType']) as string[],\n ttlMs: 'ignore' as const,\n})\n\nconst TTL_KEYS = ['ttlMs', 'cacheScope']\n\ntype JsonObject = { [key: string]: JsonValue }\n\nfunction isPlainObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction globToRegex(pattern: string): RegExp {\n const body = pattern\n .split('*')\n .map((part) => part.replace(/[.+?^${}()|[\\]\\\\/]/g, '\\\\$&'))\n .join('[\\\\s\\\\S]*')\n return new RegExp(`^${body}$`)\n}\n\n/** True when `key` matches the simple glob `pattern` (`*` matches any run of characters). */\nexport function matchesGlob(pattern: string, key: string): boolean {\n return globToRegex(pattern).test(key)\n}\n\n/**\n * Normalize an MCP result for matching/recording. Missing config fields fall back to\n * `defaultNormalizeConfig`; pass empty arrays / `ttlMs: 'keep'` to disable a rule.\n */\nexport function normalizeResult(\n result: JsonValue,\n cfg: NormalizeConfig = defaultNormalizeConfig,\n): JsonValue {\n const stripMeta = (cfg.stripMeta ?? defaultNormalizeConfig.stripMeta).map(globToRegex)\n const dropKeys = new Set(cfg.dropKeys ?? defaultNormalizeConfig.dropKeys)\n if ((cfg.ttlMs ?? defaultNormalizeConfig.ttlMs) === 'ignore') {\n for (const key of TTL_KEYS) dropKeys.add(key)\n }\n\n const stripped = stripMeta.length > 0 ? stripMetaKeys(result, stripMeta) : result\n if (!isPlainObject(stripped) || dropKeys.size === 0) return stripped\n const out: JsonObject = {}\n for (const [key, value] of Object.entries(stripped)) {\n if (!dropKeys.has(key)) out[key] = value\n }\n return out\n}\n\nfunction stripMetaKeys(value: JsonValue, patterns: RegExp[]): JsonValue {\n if (Array.isArray(value)) return value.map((item) => stripMetaKeys(item, patterns))\n if (!isPlainObject(value)) return value\n const out: JsonObject = {}\n for (const [key, child] of Object.entries(value)) {\n if (key === '_meta' && isPlainObject(child)) {\n const meta: JsonObject = {}\n let removed = false\n for (const [metaKey, metaValue] of Object.entries(child)) {\n if (patterns.some((re) => re.test(metaKey))) removed = true\n else meta[metaKey] = stripMetaKeys(metaValue, patterns)\n }\n // A `_meta` emptied by stripping disappears; one that was already empty stays.\n if (removed && Object.keys(meta).length === 0) continue\n out[key] = meta\n continue\n }\n out[key] = stripMetaKeys(child, patterns)\n }\n return out\n}\n","/**\n * Paste-ready `respond` suggestions for unanswered input requests (MRTR rounds or 2025-era\n * server→client requests). Used by `vib call`/`vib record` hints and by the runner's\n * failure messages, so every surface suggests the same answer.\n */\nimport type { JsonValue } from './types.js'\n\nfunction isObject(value: unknown): value is Record<string, JsonValue> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/** A plausible value for one requested elicitation field. */\nfunction sampleValue(schema: JsonValue): JsonValue {\n if (!isObject(schema)) return null\n if (schema.default !== undefined) return schema.default\n if (Array.isArray(schema.enum) && schema.enum.length > 0) return schema.enum[0]\n if (\n Array.isArray(schema.oneOf) &&\n isObject(schema.oneOf[0]) &&\n schema.oneOf[0].const !== undefined\n ) {\n return schema.oneOf[0].const\n }\n switch (schema.type) {\n case 'boolean':\n return true\n case 'number':\n case 'integer':\n return typeof schema.minimum === 'number' ? schema.minimum : 0\n case 'array':\n return []\n case 'object':\n return {}\n default:\n return '...'\n }\n}\n\n/**\n * A `respond` map (keyed by request method) that answers every request in an\n * InputRequests map (`{ key: { method, params } }`):\n * - `elicitation/create` → `{ action: \"accept\", content: { <each requested field>: <sample> } }`\n * - `sampling/createMessage` → a scripted assistant text message\n * - `roots/list` → `{ roots: [] }`\n * - anything else → `{}`\n * The first request of each method wins (a respond map holds one answer per method).\n */\nexport function suggestRespond(requests: JsonValue): Record<string, JsonValue> {\n const out: Record<string, JsonValue> = {}\n const entries = isObject(requests) ? Object.values(requests) : []\n for (const entry of entries) {\n const request = isObject(entry) ? entry : {}\n const method = typeof request.method === 'string' ? request.method : undefined\n if (!method || out[method] !== undefined) continue\n const params = isObject(request.params) ? request.params : {}\n if (method === 'elicitation/create') {\n const schema = isObject(params.requestedSchema) ? params.requestedSchema : {}\n const props = isObject(schema.properties) ? schema.properties : {}\n const content: Record<string, JsonValue> = {}\n for (const [name, prop] of Object.entries(props)) content[name] = sampleValue(prop)\n out[method] = params.mode === 'url' ? { action: 'accept' } : { action: 'accept', content }\n } else if (method === 'sampling/createMessage') {\n out[method] = { role: 'assistant', content: { type: 'text', text: '...' }, model: 'scripted' }\n } else if (method === 'roots/list') {\n out[method] = { roots: [] }\n } else {\n out[method] = {}\n }\n }\n return out\n}\n","import addFormatsImport from 'ajv-formats'\n/**\n * Thin Ajv 8 wrapper used by the `$schema` matcher, `outputSchema` enforcement and the\n * lint module. JSON Schema 2020-12 is the default dialect (MCP's default); schemas that\n * declare draft-07 / draft-06 / 2019-09 via `$schema` are validated with the matching\n * Ajv class, and unknown dialects fall back to 2020-12. Unknown keywords and formats are\n * tolerated (strict: false), and nothing is ever logged.\n *\n * Paths in every error use the matcher's path format: `content[0].text`, `_meta[\"a/b\"]`,\n * with '' for the validated value itself.\n */\nimport { Ajv2019 } from 'ajv/dist/2019.js'\nimport {\n Ajv2020,\n type AnySchema,\n type ErrorObject,\n MissingRefError,\n type ValidateFunction,\n} from 'ajv/dist/2020.js'\nimport { Ajv as AjvDraft07 } from 'ajv/dist/ajv.js'\nimport type { JsonValue } from './types.js'\n\nexport interface SchemaIssue {\n /** Location in the validated value (matcher path format; '' = the value itself). */\n path: string\n message: string\n /** The JSON Schema keyword that failed (e.g. `type`, `required`). */\n keyword?: string\n /** Pointer into the schema, e.g. `#/properties/id/type`. */\n schemaPath?: string\n}\n\nexport interface ValidationResult {\n ok: boolean\n errors: SchemaIssue[]\n /** Set when the schema itself could not be compiled; `errors` then holds one entry. */\n schemaError?: string\n}\n\n/**\n * Hook for `$ref`s that point outside the schema document. Receives the ref URI resolved\n * against the schema's `$id` (as written when there is no `$id`), without its `#fragment`.\n * Return the referenced schema document, or `undefined` if it cannot be found.\n */\nexport type SchemaRefResolver = (ref: string) => JsonValue | undefined\n\nexport interface CompileOptions {\n resolve?: SchemaRefResolver\n}\n\nexport type Validator = (value: unknown) => ValidationResult\n\nexport class SchemaCompileError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SchemaCompileError'\n }\n}\n\n// ---------------------------------------------------------------------------\n// Paths (shared with src/match.ts so matcher and schema errors read the same)\n// ---------------------------------------------------------------------------\n\nconst BARE_KEY = /^[A-Za-z_$][\\w$-]*$/\n\n/** Append an object key to a matcher path: `a.b`, or `a[\"io.x/y\"]` for unusual keys. */\nexport function appendKey(path: string, key: string): string {\n if (BARE_KEY.test(key)) return path === '' ? key : `${path}.${key}`\n return `${path}[${JSON.stringify(key)}]`\n}\n\n/** Append an array index to a matcher path: `content[0]`. */\nexport function appendIndex(path: string, index: number): string {\n return `${path}[${index}]`\n}\n\n/**\n * Convert a JSON Pointer (`/content/0/text`, Ajv's `instancePath`) to a matcher path\n * (`content[0].text`). When `root` is given, the value is walked so numeric object keys\n * are distinguished from array indices.\n */\nexport function formatInstancePath(pointer: string, root?: unknown): string {\n if (pointer === '' || pointer === '#') return ''\n const segments = pointer\n .replace(/^#/, '')\n .split('/')\n .slice(1)\n .map((segment) => segment.replace(/~1/g, '/').replace(/~0/g, '~'))\n let path = ''\n let node: unknown = root\n let known = root !== undefined\n for (const segment of segments) {\n const isIndex = /^(0|[1-9]\\d*)$/.test(segment)\n if (known && Array.isArray(node)) {\n path = appendIndex(path, Number(segment))\n node = node[Number(segment)]\n } else if (known && node !== null && typeof node === 'object') {\n path = appendKey(path, segment)\n node = (node as Record<string, unknown>)[segment]\n } else {\n known = false\n path = isIndex ? appendIndex(path, Number(segment)) : appendKey(path, segment)\n }\n }\n return path\n}\n\nfunction valueAtPointer(root: unknown, pointer: string): unknown {\n if (pointer === '') return root\n let node: unknown = root\n for (const raw of pointer.split('/').slice(1)) {\n const segment = raw.replace(/~1/g, '/').replace(/~0/g, '~')\n if (node === null || typeof node !== 'object') return undefined\n node = (node as Record<string, unknown>)[segment]\n }\n return node\n}\n\n// ---------------------------------------------------------------------------\n// Ajv instances\n// ---------------------------------------------------------------------------\n\ntype Dialect = '2020-12' | '2019-09' | 'draft-07'\n\ninterface AjvLike {\n compile(schema: AnySchema): ValidateFunction\n addSchema(schema: AnySchema, key?: string): unknown\n removeSchema(schema: AnySchema | string): unknown\n validateSchema(schema: AnySchema): boolean | Promise<unknown>\n errors?: ErrorObject[] | null\n}\n\ntype FormatsPlugin = (ajv: unknown) => unknown\n\n// ajv-formats is CommonJS; depending on the loader the default import is either the\n// plugin itself or the module object carrying it as `.default`.\nconst addFormats: FormatsPlugin = (() => {\n const mod = addFormatsImport as unknown as FormatsPlugin & { default?: FormatsPlugin }\n return typeof mod.default === 'function' ? mod.default : mod\n})()\n\nconst AJV_OPTIONS = {\n strict: false,\n allErrors: true,\n allowUnionTypes: true,\n validateFormats: true,\n logger: false,\n} as const\n\nfunction createAjv(dialect: Dialect): AjvLike {\n let ajv: AjvLike\n if (dialect === '2019-09') ajv = new Ajv2019(AJV_OPTIONS) as unknown as AjvLike\n else if (dialect === 'draft-07') ajv = new AjvDraft07(AJV_OPTIONS) as unknown as AjvLike\n else ajv = new Ajv2020(AJV_OPTIONS) as unknown as AjvLike\n addFormats(ajv)\n return ajv\n}\n\nconst shared = new Map<Dialect, AjvLike>()\n\nfunction sharedAjv(dialect: Dialect): AjvLike {\n let ajv = shared.get(dialect)\n if (!ajv) {\n ajv = createAjv(dialect)\n shared.set(dialect, ajv)\n }\n return ajv\n}\n\n/**\n * Pick the dialect from a root `$schema`. Returns the schema to hand to Ajv. Older drafts\n * (04 / 06) have their `$schema` removed and run as draft-07, their closest supported\n * relative; unknown dialects (custom metaschemas) run as 2020-12 rather than being rejected.\n */\nfunction detectDialect(schema: JsonValue): { dialect: Dialect; schema: JsonValue } {\n if (!isObject(schema) || typeof schema.$schema !== 'string') {\n return { dialect: '2020-12', schema }\n }\n const uri = schema.$schema\n if (/json-schema\\.org\\/draft\\/2020-12\\/schema/.test(uri)) return { dialect: '2020-12', schema }\n if (/json-schema\\.org\\/draft\\/2019-09\\/schema/.test(uri)) return { dialect: '2019-09', schema }\n if (/json-schema\\.org\\/draft-07\\/schema/.test(uri)) return { dialect: 'draft-07', schema }\n const { $schema: _ignored, ...rest } = schema\n if (/json-schema\\.org\\/draft-0[46]\\/schema/.test(uri))\n return { dialect: 'draft-07', schema: rest }\n return { dialect: '2020-12', schema: rest }\n}\n\nfunction isObject(value: unknown): value is Record<string, JsonValue> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction errorText(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nfunction compileWith(\n ajv: AjvLike,\n schema: JsonValue,\n resolve?: SchemaRefResolver,\n): ValidateFunction {\n const added = new Set<string>()\n for (let attempt = 0; attempt < 100; attempt++) {\n try {\n return ajv.compile(schema as AnySchema)\n } catch (err) {\n if (!(err instanceof MissingRefError)) throw err\n const ref = err.missingSchema\n if (!resolve || added.has(ref)) {\n throw new SchemaCompileError(\n `cannot resolve $ref \"${err.missingRef}\". Define it under \"$defs\" and reference it as \"#/$defs/<name>\"${resolve ? ', or make sure the external ref resolver can load it' : ''}.`,\n )\n }\n let doc: JsonValue | undefined\n try {\n doc = resolve(ref)\n } catch (loadErr) {\n throw new SchemaCompileError(`cannot load external $ref \"${ref}\": ${errorText(loadErr)}`)\n }\n if (doc === undefined) {\n throw new SchemaCompileError(\n `cannot resolve external $ref \"${ref}\": resolver returned nothing.`,\n )\n }\n ajv.addSchema(doc as AnySchema, ref)\n added.add(ref)\n }\n }\n throw new SchemaCompileError('too many external $refs while compiling schema')\n}\n\n// ---------------------------------------------------------------------------\n// Compile / validate\n// ---------------------------------------------------------------------------\n\nconst plainCache = new WeakMap<object, Validator>()\nconst resolverCache = new WeakMap<object, WeakMap<SchemaRefResolver, Validator>>()\nconst booleanValidators = new Map<boolean, Validator>()\n\nfunction isSchemaShape(schema: unknown): schema is boolean | Record<string, JsonValue> {\n return typeof schema === 'boolean' || isObject(schema)\n}\n\n/**\n * Compile a JSON Schema into a reusable validator. Results are cached by schema object\n * identity (and resolver identity, when one is given), so compiling the same schema\n * object repeatedly is cheap. Throws `SchemaCompileError` if the schema is unusable.\n */\nexport function compileSchema(schema: JsonValue, opts: CompileOptions = {}): Validator {\n if (typeof schema === 'boolean') {\n let cached = booleanValidators.get(schema)\n if (!cached) {\n cached = schema\n ? () => ({ ok: true, errors: [] })\n : () => ({\n ok: false,\n errors: [\n {\n path: '',\n message: 'no value is allowed (schema is false)',\n keyword: 'false schema',\n schemaPath: '#',\n },\n ],\n })\n booleanValidators.set(schema, cached)\n }\n return cached\n }\n if (!isSchemaShape(schema)) {\n throw new SchemaCompileError(\n `a JSON Schema must be an object or a boolean, got ${Array.isArray(schema) ? 'array' : schema === null ? 'null' : typeof schema}`,\n )\n }\n const { resolve } = opts\n const cached = resolve ? resolverCache.get(schema)?.get(resolve) : plainCache.get(schema)\n if (cached) return cached\n\n const validator = buildValidator(schema, resolve)\n if (resolve) {\n let byResolver = resolverCache.get(schema)\n if (!byResolver) {\n byResolver = new WeakMap()\n resolverCache.set(schema, byResolver)\n }\n byResolver.set(resolve, validator)\n } else {\n plainCache.set(schema, validator)\n }\n return validator\n}\n\nfunction buildValidator(schema: Record<string, JsonValue>, resolve?: SchemaRefResolver): Validator {\n const { dialect, schema: prepared } = detectDialect(schema)\n let fn: ValidateFunction\n try {\n if (resolve) {\n // External documents are registered on the instance, so use a private one.\n fn = compileWith(createAjv(dialect), prepared, resolve)\n } else {\n const ajv = sharedAjv(dialect)\n try {\n fn = compileWith(ajv, prepared)\n } catch (err) {\n // An `$id` already registered by another schema: compile in isolation instead.\n if (!/already exists|resolves to more than one schema/.test(errorText(err))) throw err\n fn = compileWith(createAjv(dialect), prepared)\n } finally {\n // Keep the shared instance free of `$id` registrations (and their memory).\n try {\n ajv.removeSchema(prepared as AnySchema)\n } catch {\n // not registered; nothing to clean up\n }\n }\n }\n } catch (err) {\n if (err instanceof SchemaCompileError) throw err\n throw new SchemaCompileError(errorText(err))\n }\n return (value: unknown) => {\n const ok = fn(value) as boolean\n if (ok) return { ok: true, errors: [] }\n return { ok: false, errors: toIssues(fn.errors ?? [], value) }\n }\n}\n\n/** Validate `value` against `schema`. Never throws; compile failures set `schemaError`. */\nexport function validate(\n schema: JsonValue,\n value: unknown,\n opts?: CompileOptions,\n): ValidationResult {\n let validator: Validator\n try {\n validator = compileSchema(schema, opts)\n } catch (err) {\n const message = errorText(err)\n return {\n ok: false,\n errors: [{ path: '', message: `invalid schema: ${message}` }],\n schemaError: message,\n }\n }\n return validator(value)\n}\n\n/**\n * Meta-validate a schema (is it a well-formed schema for its dialect?) and check that it\n * compiles, i.e. every `$ref` resolves. Error paths point into the schema document.\n */\nexport function isValidSchema(\n schema: JsonValue,\n opts?: CompileOptions,\n): { ok: boolean; errors: SchemaIssue[] } {\n if (typeof schema === 'boolean') return { ok: true, errors: [] }\n if (!isSchemaShape(schema)) {\n return {\n ok: false,\n errors: [\n {\n path: '',\n message: `a JSON Schema must be an object or a boolean, got ${Array.isArray(schema) ? 'array' : schema === null ? 'null' : typeof schema}`,\n },\n ],\n }\n }\n const { dialect, schema: prepared } = detectDialect(schema)\n const ajv = sharedAjv(dialect)\n let metaOk: boolean\n try {\n metaOk = ajv.validateSchema(prepared as AnySchema) === true\n } catch (err) {\n return { ok: false, errors: [{ path: '', message: errorText(err) }] }\n }\n if (!metaOk) return { ok: false, errors: toIssues(ajv.errors ?? [], prepared) }\n try {\n compileSchema(schema, opts)\n } catch (err) {\n return { ok: false, errors: [{ path: '', message: errorText(err), keyword: '$ref' }] }\n }\n return { ok: true, errors: [] }\n}\n\n// ---------------------------------------------------------------------------\n// Error formatting\n// ---------------------------------------------------------------------------\n\nfunction describeType(value: unknown): string {\n if (value === undefined) return 'nothing'\n if (value === null) return 'null'\n if (Array.isArray(value)) return 'array'\n if (typeof value === 'number' && Number.isInteger(value)) return 'integer'\n return typeof value\n}\n\nfunction short(value: unknown, max = 60): string {\n const text = JSON.stringify(value) ?? String(value)\n return text.length > max ? `${text.slice(0, max - 1)}…` : text\n}\n\nfunction issueMessage(error: ErrorObject, root: unknown): string {\n const params = error.params as Record<string, unknown>\n switch (error.keyword) {\n case 'type':\n return `must be ${Array.isArray(params.type) ? (params.type as string[]).join(' or ') : String(params.type)}, got ${describeType(valueAtPointer(root, error.instancePath))}`\n case 'required':\n return `must have required property ${JSON.stringify(params.missingProperty)}`\n case 'additionalProperties':\n return `must NOT have additional property ${JSON.stringify(params.additionalProperty)}`\n case 'unevaluatedProperties':\n return `must NOT have unevaluated property ${JSON.stringify(params.unevaluatedProperty)}`\n case 'enum':\n return `must be one of ${short(params.allowedValues, 120)}, got ${short(valueAtPointer(root, error.instancePath))}`\n case 'const':\n return `must be ${short(params.allowedValue)}, got ${short(valueAtPointer(root, error.instancePath))}`\n case 'format':\n return `must match format ${JSON.stringify(params.format)}, got ${short(valueAtPointer(root, error.instancePath))}`\n case 'pattern':\n return `must match pattern /${String(params.pattern)}/, got ${short(valueAtPointer(root, error.instancePath))}`\n default:\n return error.message ?? `failed \"${error.keyword}\"`\n }\n}\n\nfunction toIssues(errors: ErrorObject[], root: unknown): SchemaIssue[] {\n const seen = new Set<string>()\n const issues: SchemaIssue[] = []\n for (const error of errors) {\n const issue: SchemaIssue = {\n path: formatInstancePath(error.instancePath, root),\n message: issueMessage(error, root),\n keyword: error.keyword,\n schemaPath: error.schemaPath,\n }\n const key = `${issue.path}\\u0000${issue.message}`\n if (seen.has(key)) continue\n seen.add(key)\n issues.push(issue)\n }\n return issues\n}\n","/**\n * Vibrissa v2 shared types: case files, config, and the session's summary shapes.\n * See docs/V2_ARCHITECTURE.md (\"Shared interfaces\") for the contract these implement.\n */\n\nexport type JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue }\n\nexport type JsonObject = { [key: string]: JsonValue }\n\n// ---------------------------------------------------------------------------\n// Case files\n// ---------------------------------------------------------------------------\n\n/** A single MCP operation. Exactly one of tool | resource | resourceTemplate | prompt. */\nexport interface Operation {\n /** `tools/call` by tool name. */\n tool?: string\n /** `resources/read` by URI. */\n resource?: string\n /** RFC 6570 URI template; expanded with `args`, then `resources/read`. */\n resourceTemplate?: string\n /** `prompts/get` by prompt name. */\n prompt?: string\n /** Tool arguments, template variables, or prompt arguments. */\n args?: Record<string, JsonValue>\n}\n\nexport interface ExpectError {\n /** Error code name (`InvalidParams`, `RequestTimeout`, ...) or numeric JSON-RPC code. */\n code?: string | number\n message?: string | { $regex: string; flags?: string }\n}\n\n/** Tasks extension polling (SEP-2663): poll `tasks/get` until the task is terminal. */\nexport interface AwaitOptions {\n /** Poll interval override in ms. Default: the task's `pollIntervalMs`, else 500. */\n pollMs?: number\n /** Give up after this many ms. Default 30000. */\n timeoutMs?: number\n}\n\nexport interface Step extends Operation {\n name?: string\n expect?: JsonValue\n expectError?: ExpectError\n /** Scripted answers for MRTR input_required rounds, keyed by request method. */\n respond?: Record<string, JsonValue>\n /** Matcher over the InputRequests map(s) the server sent (see Outcome.inputRequests). */\n expectInputRequired?: JsonValue\n /** Matcher over the CreateTaskResult the server returned (tasks extension). */\n expectTask?: JsonValue\n /** Tasks extension: poll until terminal (`true` = defaults). */\n await?: AwaitOptions | boolean\n /** name → dotted path into the normalized result. */\n capture?: Record<string, string>\n budgetMs?: number\n timeoutMs?: number\n /** Teardown steps: never fail the case. */\n ignoreErrors?: boolean\n /** Validate structuredContent against the tool's outputSchema. Default true when declared. */\n validateOutput?: boolean\n normalize?: NormalizeConfig | false\n}\n\nexport interface TestCase extends Step {\n $schema?: string\n tags?: string[]\n /** Key into config.servers. */\n server?: string\n /** Flow; when present, top-level op fields are ignored. */\n steps?: Step[]\n setup?: Step[]\n teardown?: Step[]\n flaky?: boolean\n skip?: boolean | string\n}\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\n/**\n * Protocol era negotiation.\n * - `auto` (default): probe `server/discover`, fall back to the 2025 `initialize` handshake.\n * - `legacy`: 2025 `initialize` handshake only.\n * - `modern`: require the 2026-07-28 era (sugar for `{ pin: \"2026-07-28\" }`).\n * - `{ pin }`: modern era at exactly this revision; no fallback.\n */\nexport type ProtocolMode = 'auto' | 'legacy' | 'modern' | { pin: string }\n\nexport interface ServerCommon {\n protocol?: ProtocolMode\n /** Max time for spawn + handshake (stdio) or connect (http). Default: clamp(timeoutMs, 2000, 10000). */\n spawnTimeoutMs?: number\n}\n\nexport interface StdioServerConfig {\n cmd: string\n args?: string[]\n cwd?: string\n env?: Record<string, string>\n}\n\nexport interface HttpServerConfig {\n url: string\n headers?: Record<string, string>\n}\n\nexport type ServerConfig = (StdioServerConfig | HttpServerConfig) & ServerCommon\n\nexport type ResolvedStdioServer = StdioServerConfig & ServerCommon\nexport type ResolvedHttpServer = HttpServerConfig & ServerCommon\n\nexport function isHttpServerConfig(server: ServerConfig): server is ResolvedHttpServer {\n return typeof (server as { url?: unknown }).url === 'string'\n}\n\nexport function isStdioServerConfig(server: ServerConfig): server is ResolvedStdioServer {\n return typeof (server as { cmd?: unknown }).cmd === 'string'\n}\n\nexport interface NormalizeConfig {\n /** Glob-ish keys under `_meta` to strip. Default `[\"io.modelcontextprotocol/*\"]`. */\n stripMeta?: string[]\n /** Top-level result keys to drop. Default `[\"resultType\"]`. */\n dropKeys?: string[]\n /** List results' `ttlMs`/`cacheScope`. Default `ignore`. */\n ttlMs?: 'keep' | 'ignore'\n}\n\nexport interface ShardSpec {\n /** 1-based shard index. */\n index: number\n total: number\n}\n\nexport interface SuiteHooks {\n setup?: Step[]\n teardown?: Step[]\n}\n\nexport interface RunOptions {\n servers: Record<string, ServerConfig>\n defaultServer: string\n globs: string[]\n /** Path; default tests/integration/__manifest__.json. */\n manifest?: string\n normalize: NormalizeConfig\n timeoutMs: number\n budgetMs?: number\n failFast: boolean\n allowEmpty: boolean\n /** Reporter names; default [\"console\"]. */\n reporters: string[]\n tags?: string[]\n excludeTags?: string[]\n grep?: string\n repeat?: number\n shard?: ShardSpec\n concurrency?: number\n update?: boolean\n trace?: boolean\n check?: boolean\n baseline?: string\n /** Suite-level setup/teardown steps. */\n hooks?: SuiteHooks\n /** `vib check` / `--check` tuning: skipped check ids and per-check severity overrides. */\n checks?: { allow?: string[]; severity?: Record<string, 'failed' | 'warned'> }\n /**\n * Dotted manifest paths ignored by the lock diff. Filled by loadConfig:\n * [\"server.version\", \"protocolVersion\", \"listMeta\"].\n */\n manifestIgnore?: string[]\n /** Fail the run when a server's manifest lock file is missing (CI). Default false (warn). */\n requireManifest?: boolean\n /** Reporter artifact directory (relative to rootDir). Unset unless configured; the runner defaults to \"reports\". */\n outDir?: string\n /** Directory the config was loaded from; relative paths resolve against it. */\n rootDir: string\n}\n\n// ---------------------------------------------------------------------------\n// Session summaries (what McpSession returns)\n// ---------------------------------------------------------------------------\n\nexport interface ToolSummary {\n name: string\n title?: string\n description?: string\n inputSchema: JsonValue\n outputSchema?: JsonValue\n annotations?: JsonValue\n icons?: JsonValue\n execution?: JsonValue\n _meta?: JsonValue\n}\n\nexport interface ResourceSummary {\n uri: string\n name: string\n title?: string\n description?: string\n mimeType?: string\n size?: number\n annotations?: JsonValue\n icons?: JsonValue\n _meta?: JsonValue\n}\n\nexport interface ResourceTemplateSummary {\n uriTemplate: string\n name: string\n title?: string\n description?: string\n mimeType?: string\n annotations?: JsonValue\n icons?: JsonValue\n _meta?: JsonValue\n}\n\nexport interface PromptArgumentSummary {\n name: string\n title?: string\n description?: string\n required?: boolean\n}\n\nexport interface PromptSummary {\n name: string\n title?: string\n description?: string\n arguments?: PromptArgumentSummary[]\n icons?: JsonValue\n _meta?: JsonValue\n}\n\n/** A list verb's aggregated result plus the list-level cache hints (2026-07-28). */\nexport interface ListResult<T> {\n items: T[]\n /** `ttlMs` from the (first page of the) list result, when the server sent one. */\n ttlMs?: number\n /** `cacheScope` from the list result, when the server sent one. */\n cacheScope?: string\n /** List-level `_meta` (e.g. the stamped serverInfo), when present. */\n _meta?: JsonValue\n}\n\nexport interface ServerIdentity {\n name?: string\n version?: string\n title?: string\n [key: string]: JsonValue | undefined\n}\n\nexport interface DiscoverInfo {\n era: 'legacy' | 'modern'\n /** Negotiated revision, e.g. \"2026-07-28\" or \"2025-11-25\". */\n protocolVersion: string\n /** Revisions the server advertises (modern) or `[protocolVersion]` (legacy). */\n supportedVersions: string[]\n /** Modern: `_meta[\"io.modelcontextprotocol/serverInfo\"]`; legacy: `initialize.serverInfo`. */\n serverInfo?: ServerIdentity\n capabilities: JsonValue\n /** Keys of `capabilities.extensions` (e.g. \"io.modelcontextprotocol/tasks\"). */\n extensions: string[]\n instructions?: string\n /** True when built from the legacy `initialize` result instead of `server/discover`. */\n synthesized: boolean\n /** The raw wire result (`server/discover` or `initialize`). */\n raw: JsonValue\n}\n\n/** One JSON-RPC message (or stderr chunk) observed by the session. */\nexport interface TranscriptEntry {\n /** `out` = client → server, `in` = server → client, `stderr` = server stderr text. */\n dir: 'in' | 'out' | 'stderr'\n /** Epoch milliseconds. */\n ts: number\n message?: JsonValue\n text?: string\n}\n","/**\n * ToolError model and error-code naming for the v2 SDK.\n *\n * Protocol errors (JSON-RPC error responses) carry a numeric code; SDK errors (timeouts,\n * closed connections, invalid results) carry a string `SdkErrorCode`. Both are mapped to\n * a stable human `codeName` (`InvalidParams`, `RequestTimeout`, `ConnectionClosed`, ...)\n * so case files can say `expectError: { code: \"InvalidParams\" }` regardless of era.\n */\nimport {\n ProtocolError,\n ProtocolErrorCode,\n SdkError,\n SdkErrorCode,\n} from '@modelcontextprotocol/client'\nimport type { JsonValue } from '../types.js'\n\nexport type ToolErrorKind = 'protocol' | 'tool' | 'transport' | 'timeout'\n\nexport interface ToolError {\n /**\n * - `protocol`: JSON-RPC error response (or an SDK-level protocol violation, see `local`)\n * - `tool`: the tool ran and returned `isError: true`\n * - `transport`: the connection failed / closed\n * - `timeout`: no response within the time budget\n */\n kind: ToolErrorKind\n /** Numeric JSON-RPC code, when the error has one. */\n code?: number\n /** Stable human name: `InvalidParams`, `MethodNotFound`, `RequestTimeout`, `ConnectionClosed`, ... */\n codeName?: string\n message: string\n /** JSON-RPC `error.data`, when present. */\n data?: JsonValue\n /** True when raised by the client SDK rather than received from the server. */\n local?: boolean\n}\n\n/** HTTP binding header mismatch (SEP-2243). Not in ProtocolErrorCode. */\nexport const HEADER_MISMATCH_CODE = -32020\n\n/** Numeric code → stable name. Includes 2026-07-28 renumbered codes and v1-era names. */\nconst NUMERIC_CODE_NAMES: Record<number, string> = {\n [ProtocolErrorCode.ParseError]: 'ParseError',\n [ProtocolErrorCode.InvalidRequest]: 'InvalidRequest',\n [ProtocolErrorCode.MethodNotFound]: 'MethodNotFound',\n [ProtocolErrorCode.InvalidParams]: 'InvalidParams',\n [ProtocolErrorCode.InternalError]: 'InternalError',\n [ProtocolErrorCode.ResourceNotFound]: 'ResourceNotFound',\n [ProtocolErrorCode.MissingRequiredClientCapability]: 'MissingRequiredClientCapability',\n [ProtocolErrorCode.UnsupportedProtocolVersion]: 'UnsupportedProtocolVersion',\n [ProtocolErrorCode.UrlElicitationRequired]: 'UrlElicitationRequired',\n [HEADER_MISMATCH_CODE]: 'HeaderMismatch',\n // v1 SDK ErrorCode values that were numeric there (now SdkErrors in v2):\n [-32000]: 'ConnectionClosed',\n [-32001]: 'RequestTimeout',\n}\n\n/** Stable names for v2 SdkErrorCode values (string enum → PascalCase key). */\nconst SDK_CODE_NAMES: Record<string, string> = Object.fromEntries(\n Object.entries(SdkErrorCode).map(([key, value]) => [value, key]),\n)\n\n/** Reverse lookup: name → numeric code, for `expectError.code` given as a name. */\nconst NAME_TO_NUMERIC: Record<string, number> = Object.fromEntries(\n Object.entries(NUMERIC_CODE_NAMES).map(([code, name]) => [name, Number(code)]),\n)\n\n/** v1 / alternative spellings accepted in case files, mapped to the canonical name. */\nconst NAME_ALIASES: Record<string, string> = {\n RequestTimedOut: 'RequestTimeout',\n Timeout: 'RequestTimeout',\n ConnectionLost: 'ConnectionClosed',\n UnsupportedVersion: 'UnsupportedProtocolVersion',\n HeaderMismatchError: 'HeaderMismatch',\n}\n\nexport function errorCodeName(code: number): string | undefined {\n return NUMERIC_CODE_NAMES[code]\n}\n\nexport function sdkErrorCodeName(code: string): string {\n return SDK_CODE_NAMES[code] ?? code\n}\n\n/** Canonical code name for a user-supplied name (handles aliases); undefined when unknown. */\nexport function canonicalCodeName(name: string): string {\n return NAME_ALIASES[name] ?? name\n}\n\nexport function numericCodeForName(name: string): number | undefined {\n return NAME_TO_NUMERIC[canonicalCodeName(name)]\n}\n\n/** Every code name known to Vibrissa (numeric + SDK), for docs / schema / migrate. */\nexport function knownCodeNames(): string[] {\n return [...new Set([...Object.values(NUMERIC_CODE_NAMES), ...Object.values(SDK_CODE_NAMES)])]\n}\n\n/**\n * True when a resource-not-found was reported. 2026-07-28 servers answer `-32602` with\n * `data` exactly `{ uri }`; older SDK builds used `-32002`.\n */\nexport function isResourceNotFound(error: Pick<ToolError, 'code' | 'data'>): boolean {\n if (error.code === ProtocolErrorCode.ResourceNotFound) return true\n if (error.code !== ProtocolErrorCode.InvalidParams) return false\n const data = error.data\n return (\n typeof data === 'object' &&\n data !== null &&\n !Array.isArray(data) &&\n Object.keys(data).length === 1 &&\n typeof (data as { uri?: unknown }).uri === 'string'\n )\n}\n\n/**\n * Does an observed error satisfy `expectError.code`? Accepts names (with aliases) and\n * numbers. `ResourceNotFound` also matches the 2026-07-28 `-32602 + { uri }` shape.\n */\nexport function errorMatchesCode(error: ToolError, expected: string | number): boolean {\n if (typeof expected === 'number') return error.code === expected\n const wanted = canonicalCodeName(expected)\n if (error.codeName !== undefined && canonicalCodeName(error.codeName) === wanted) return true\n if (wanted === 'ResourceNotFound' && isResourceNotFound(error)) return true\n const numeric = NAME_TO_NUMERIC[wanted]\n return numeric !== undefined && error.code === numeric\n}\n\nexport function stripMcpErrorPrefix(message: string): string {\n return message.replace(/^MCP error -?\\d+:\\s*/, '')\n}\n\nexport function textFromContent(content: unknown): string {\n if (!Array.isArray(content)) return ''\n return content\n .filter((item): item is { type: string; text: string } => {\n return (\n typeof item === 'object' &&\n item !== null &&\n (item as { type?: unknown }).type === 'text' &&\n typeof (item as { text?: unknown }).text === 'string'\n )\n })\n .map((item) => item.text)\n .join('\\n')\n}\n\nfunction toJsonValue(value: unknown): JsonValue | undefined {\n if (value === undefined) return undefined\n try {\n return JSON.parse(JSON.stringify(value)) as JsonValue\n } catch {\n return String(value)\n }\n}\n\n/**\n * The stable name for a protocol error: `ResourceNotFound` for the resource-not-found shape\n * on either era (`-32002`, or `-32602` with `data` exactly `{ uri }`), else the code's name.\n * `errorMatchesCode(e, \"InvalidParams\")` still matches the `-32602` form by number.\n */\nexport function protocolCodeName(code: number, data?: JsonValue): string | undefined {\n if (isResourceNotFound({ code, data })) return 'ResourceNotFound'\n return errorCodeName(code)\n}\n\n/** Build a ToolError from a raw JSON-RPC `error` object (as received on the wire). */\nexport function fromJsonRpcError(error: {\n code?: unknown\n message?: unknown\n data?: unknown\n}): ToolError {\n const code = typeof error.code === 'number' ? error.code : undefined\n const data = toJsonValue(error.data)\n const codeName = code !== undefined ? protocolCodeName(code, data) : undefined\n return {\n kind: 'protocol',\n ...(code !== undefined ? { code } : {}),\n ...(codeName ? { codeName } : {}),\n message: stripMcpErrorPrefix(\n typeof error.message === 'string' ? error.message : 'Unknown error',\n ),\n ...(data !== undefined ? { data } : {}),\n }\n}\n\nexport interface ErrorContext {\n /** What was being done, e.g. `tools/call \"echo\"`. */\n what: string\n timeoutMs?: number\n}\n\n/**\n * Map anything thrown by the SDK into a ToolError. Never throws.\n * `local` is decided by the caller (it knows whether a wire error response arrived).\n */\nexport function toToolError(err: unknown, ctx: ErrorContext): ToolError {\n if (err instanceof ProtocolError) {\n const data = toJsonValue(err.data)\n const codeName = protocolCodeName(err.code, data)\n return {\n kind: 'protocol',\n code: err.code,\n ...(codeName ? { codeName } : {}),\n message: stripMcpErrorPrefix(err.message),\n ...(data !== undefined ? { data } : {}),\n }\n }\n if (err instanceof SdkError) {\n const codeName = sdkErrorCodeName(err.code)\n const data = toJsonValue(err.data)\n const base = { codeName, ...(data !== undefined ? { data } : {}), local: true }\n switch (err.code) {\n case SdkErrorCode.RequestTimeout:\n return {\n ...base,\n kind: 'timeout',\n message: `Request timed out at ${ctx.what}: no response within ${ctx.timeoutMs ?? '?'}ms. Raise timeoutMs (step or config) if the server is legitimately slow.`,\n }\n case SdkErrorCode.ConnectionClosed:\n case SdkErrorCode.NotConnected:\n case SdkErrorCode.SendFailed:\n return {\n ...base,\n kind: 'transport',\n message: `Server connection closed at ${ctx.what}: ${err.message}. The server process exited or closed its output; check its stderr.`,\n }\n default:\n if (\n String(err.code).startsWith('CLIENT_HTTP') ||\n err.code === SdkErrorCode.EraNegotiationFailed\n ) {\n return { ...base, kind: 'transport', message: `${err.message} (at ${ctx.what})` }\n }\n return { ...base, kind: 'protocol', message: `${err.message} (at ${ctx.what})` }\n }\n }\n const message = err instanceof Error ? err.message : String(err)\n return {\n kind: 'transport',\n codeName: 'ClientError',\n message: `${message} (at ${ctx.what})`,\n local: true,\n }\n}\n","/**\n * McpSession: one live connection to an MCP server (stdio or Streamable HTTP), on either\n * protocol era, with raw-wire results.\n *\n * Design notes (see docs/V2_ARCHITECTURE.md \"Session\"):\n * - Results are the exact `result` objects the server put on the wire (captured at the\n * transport), so `resultType` and `_meta` are present on 2026-07-28 servers. The session\n * never normalizes; the runner does.\n * - Operations on one session are serialized (one in flight at a time). That keeps raw-result\n * capture and per-call MRTR responders unambiguous. Use one session per worker.\n * - MRTR (`input_required`) is fulfilled by the SDK's auto-fulfil driver through handlers we\n * register for elicitation/create, sampling/createMessage and roots/list. Those handlers ask\n * the per-call responder, then the session responder; when neither answers, the handler\n * throws, the flow stops (no retry), and the call resolves to `{ kind: 'input_required' }`.\n * On legacy (2025) connections the same handlers answer real server→client requests.\n * - Tasks extension (SEP-2663): the client declares `io.modelcontextprotocol/tasks`; a\n * `resultType: \"task\"` answer is returned as-is, or polled via `tasks/get` with `await`.\n * - close() releases everything: stdio children are killed promptly when they do not exit on\n * stdin EOF (immediately when a call was left hanging), and HTTP sockets are owned by a\n * per-session agent that is destroyed (see ./http.ts), so the process can exit cleanly.\n */\nimport { spawnSync } from 'node:child_process'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { StringDecoder } from 'node:string_decoder'\nimport {\n Client,\n type ClientCapabilities,\n type JSONRPCMessage,\n ProtocolError,\n SERVER_INFO_META_KEY,\n SdkError,\n SdkErrorCode,\n type StandardSchemaV1,\n StreamableHTTPClientTransport,\n type Tool,\n type Transport,\n UriTemplate,\n type VersionNegotiationOptions,\n} from '@modelcontextprotocol/client'\nimport { StdioClientTransport } from '@modelcontextprotocol/client/stdio'\nimport type {\n AwaitOptions,\n DiscoverInfo,\n JsonObject,\n JsonValue,\n ListResult,\n PromptArgumentSummary,\n PromptSummary,\n ProtocolMode,\n ResourceSummary,\n ResourceTemplateSummary,\n ServerConfig,\n ServerIdentity,\n ToolSummary,\n TranscriptEntry,\n} from '../types.js'\nimport { isHttpServerConfig } from '../types.js'\nimport { VERSION } from '../version.js'\nimport {\n type ToolError,\n fromJsonRpcError,\n sdkErrorCodeName,\n textFromContent,\n toToolError,\n} from './errors.js'\nimport { type NodeHttpClient, createNodeHttpClient } from './http.js'\n\nexport * from './errors.js'\n\nexport const MODERN_PROTOCOL_VERSION = '2026-07-28'\nexport const TASKS_EXTENSION = 'io.modelcontextprotocol/tasks'\nexport const VIBRISSA_CLIENT_INFO = { name: 'vibrissa', version: VERSION }\n\nconst DEFAULT_AWAIT_TIMEOUT_MS = 30000\nconst DEFAULT_POLL_MS = 500\nconst STDERR_TAIL_CHARS = 4000\n/** How long close() lets a stdio server exit on its own after stdin EOF. */\nconst STDIO_EXIT_GRACE_MS = 500\n/** How long close() waits after SIGTERM before SIGKILL. */\nconst STDIO_KILL_GRACE_MS = 500\nconst NOISE_SAMPLE_LINES = 5\nconst NOISE_LINE_CHARS = 200\n\n/** Non-JSON-RPC lines a stdio server wrote to stdout (the SDK drops them silently). */\nexport interface StdoutNoise {\n lines: number\n /** The first few offending lines (truncated). */\n sample: string[]\n}\n\n/**\n * Answers one embedded input request (MRTR round or legacy server→client request).\n * Return the bare result (e.g. `{ action: \"accept\", content: {...} }`), or `undefined`\n * to leave it unanswered (the call then resolves to `kind: 'input_required'`).\n */\nexport type InputResponder = (\n method: string,\n params: JsonValue,\n) => JsonValue | undefined | Promise<JsonValue | undefined>\n\nexport interface SessionOptions {\n /** Default per-request timeout (ms). Also bounds a whole MRTR flow. */\n timeoutMs: number\n /** Called for every JSON-RPC message in/out (and stderr chunks when piped). */\n transcript?: (entry: TranscriptEntry) => void\n /** Session-level responder; `CallOptions.respond` is consulted first. */\n inputResponder?: InputResponder\n /**\n * Server stderr (stdio only): `inherit` (default) forwards to this process's stderr,\n * `capture` keeps it out of the console (transcript / onStderr only), `ignore` drops it.\n */\n stderr?: 'inherit' | 'capture' | 'ignore'\n onStderr?: (text: string) => void\n /**\n * Called for every non-JSON-RPC line a stdio server writes to stdout (e.g. a stray\n * `console.log`). Such lines corrupt the protocol stream; see also `session.stdoutNoise`.\n */\n onStdoutNoise?: (line: string) => void\n /** Declare the tasks extension (servers may then answer with tasks). Default true. */\n tasks?: boolean\n clientInfo?: { name: string; version: string }\n}\n\nexport interface CallOptions {\n timeoutMs?: number\n /** Per-call responder: a function, or a map keyed by request method (`elicitation/create`). */\n respond?: InputResponder | Record<string, JsonValue>\n /** Tasks extension: poll `tasks/get` until terminal. `true` = defaults. */\n await?: AwaitOptions | boolean\n}\n\ninterface OutcomeBase {\n durationMs: number\n /** Every InputRequests map the server sent during this call, one per round, in order. */\n inputRequests?: JsonValue[]\n /** The CreateTaskResult, when the server answered with a task. */\n task?: JsonValue\n}\n\nexport type Outcome =\n | (OutcomeBase & { kind: 'result'; result: JsonValue })\n | (OutcomeBase & { kind: 'error'; error: ToolError; result?: JsonValue })\n | (OutcomeBase & { kind: 'input_required'; requests: JsonValue; requestState?: string })\n\nexport type SessionStartErrorCode =\n | 'spawn'\n | 'exited'\n | 'timeout'\n | 'negotiation'\n | 'http'\n | 'config'\n\n/** Thrown by McpSession.start when the server cannot be reached / spawned / negotiated. */\nexport class SessionStartError extends Error {\n constructor(\n message: string,\n readonly code: SessionStartErrorCode,\n readonly stderr?: string,\n options?: { cause?: unknown },\n ) {\n super(message, options)\n this.name = 'SessionStartError'\n }\n}\n\n/** Thrown by list/discover verbs (which return plain data, not an Outcome). */\nexport class SessionRequestError extends Error {\n constructor(\n message: string,\n readonly error: ToolError,\n ) {\n super(message)\n this.name = 'SessionRequestError'\n }\n}\n\n/** Expand an RFC 6570 URI template with case args (non-strings are stringified). */\nexport function expandUriTemplate(template: string, args: Record<string, JsonValue> = {}): string {\n const vars: Record<string, string | string[]> = {}\n for (const [key, value] of Object.entries(args)) {\n if (value === null || value === undefined) continue\n vars[key] = Array.isArray(value)\n ? value.map((v) => (typeof v === 'string' ? v : JSON.stringify(v)))\n : typeof value === 'string'\n ? value\n : typeof value === 'object'\n ? JSON.stringify(value)\n : String(value)\n }\n return new UriTemplate(template).expand(vars)\n}\n\n// ---------------------------------------------------------------------------\n// internals\n// ---------------------------------------------------------------------------\n\ntype RawMessage = Record<string, unknown>\n\ninterface RawResponse {\n method: string\n message: RawMessage\n}\n\nclass UnansweredInputError extends Error {\n constructor(readonly method: string) {\n super(\n `No scripted response for ${method}. Add a \"respond\" entry for \"${method}\" to the step (or pass --respond).`,\n )\n this.name = 'UnansweredInputError'\n }\n}\n\n/** Per-operation wire bookkeeping. Operations are serialized, so at most one is live. */\nclass OpTracker {\n readonly sent = new Map<string | number, string>()\n readonly responses: RawResponse[] = []\n readonly inputRounds: JsonValue[] = []\n readonly unanswered: Array<{ key: string; method: string; params: JsonValue }> = []\n constructor(readonly respond?: InputResponder) {}\n\n last(method: string): RawMessage | undefined {\n for (let i = this.responses.length - 1; i >= 0; i--) {\n if (this.responses[i].method === method) return this.responses[i].message\n }\n return undefined\n }\n\n results(method: string): RawMessage[] {\n return this.responses\n .filter((r) => r.method === method && isObject(r.message.result))\n .map((r) => r.message.result as RawMessage)\n }\n}\n\nconst PASSTHROUGH: StandardSchemaV1<unknown, unknown> = {\n '~standard': { version: 1, vendor: 'vibrissa', validate: (value: unknown) => ({ value }) },\n}\n\nconst TAPPED = Symbol('vibrissa.tapped')\n\nfunction isObject(value: unknown): value is RawMessage {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isRequest(message: RawMessage): boolean {\n return typeof message.method === 'string' && message.id !== undefined\n}\n\nfunction isResponse(message: RawMessage): boolean {\n return (\n message.method === undefined &&\n message.id !== undefined &&\n ('result' in message || 'error' in message)\n )\n}\n\nfunction clone<T>(value: T): T {\n return value === undefined ? value : (structuredClone(value) as T)\n}\n\nfunction json(value: unknown): JsonValue {\n return clone(value) as JsonValue\n}\n\nfunction elapsed(started: number): number {\n return Math.round(performance.now() - started)\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value))\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction inheritedEnv(overrides: Record<string, string>): Record<string, string> {\n const env: Record<string, string> = {}\n for (const [key, value] of Object.entries(process.env)) {\n if (typeof value === 'string') env[key] = value\n }\n return { ...env, ...overrides }\n}\n\nfunction responderFrom(respond: CallOptions['respond']): InputResponder | undefined {\n if (respond === undefined) return undefined\n if (typeof respond === 'function') return respond\n return (method) => (Object.hasOwn(respond, method) ? respond[method] : undefined)\n}\n\nasync function askResponders(\n responders: Array<InputResponder | undefined>,\n method: string,\n params: JsonValue,\n): Promise<JsonValue | undefined> {\n for (const responder of responders) {\n if (!responder) continue\n const answer = await responder(method, params)\n if (answer !== undefined) return answer\n }\n return undefined\n}\n\nfunction pick(source: RawMessage, keys: string[]): Record<string, JsonValue> {\n const out: Record<string, JsonValue> = {}\n for (const key of keys) {\n if (source[key] !== undefined) out[key] = json(source[key])\n }\n return out\n}\n\nfunction toolSummary(tool: RawMessage): ToolSummary {\n return {\n name: String(tool.name),\n ...pick(tool, ['title', 'description']),\n inputSchema: tool.inputSchema === undefined ? null : json(tool.inputSchema),\n ...pick(tool, ['outputSchema', 'annotations', 'icons', 'execution', '_meta']),\n } as ToolSummary\n}\n\nfunction resourceSummary(resource: RawMessage): ResourceSummary {\n return {\n uri: String(resource.uri),\n name: String(resource.name),\n ...pick(resource, [\n 'title',\n 'description',\n 'mimeType',\n 'size',\n 'annotations',\n 'icons',\n '_meta',\n ]),\n } as ResourceSummary\n}\n\nfunction resourceTemplateSummary(template: RawMessage): ResourceTemplateSummary {\n return {\n uriTemplate: String(template.uriTemplate),\n name: String(template.name),\n ...pick(template, ['title', 'description', 'mimeType', 'annotations', 'icons', '_meta']),\n } as ResourceTemplateSummary\n}\n\nfunction promptSummary(prompt: RawMessage): PromptSummary {\n const args = Array.isArray(prompt.arguments)\n ? prompt.arguments.filter(isObject).map(\n (arg) =>\n ({\n name: String(arg.name),\n ...pick(arg, ['title', 'description', 'required']),\n }) as PromptArgumentSummary,\n )\n : undefined\n return {\n name: String(prompt.name),\n ...pick(prompt, ['title', 'description']),\n ...(args ? { arguments: args } : {}),\n ...pick(prompt, ['icons', '_meta']),\n } as PromptSummary\n}\n\nfunction negotiationFor(protocol: ProtocolMode, timeoutMs: number): VersionNegotiationOptions {\n const probe = { timeoutMs }\n if (protocol === 'legacy') return { mode: 'legacy' }\n if (protocol === 'auto') return { mode: 'auto', probe }\n if (protocol === 'modern') return { mode: { pin: MODERN_PROTOCOL_VERSION }, probe }\n if (isObject(protocol) && typeof protocol.pin === 'string')\n return { mode: { pin: protocol.pin }, probe }\n throw new SessionStartError(\n `Invalid protocol at server.protocol: expected \"auto\" | \"legacy\" | \"modern\" | { \"pin\": \"<version>\" }, got ${JSON.stringify(protocol)}. Fix the server entry in vibrissa.json or pass --protocol auto.`,\n 'config',\n )\n}\n\nfunction describeServer(server: ServerConfig): string {\n if (isHttpServerConfig(server)) return `server url ${server.url}`\n const cmd = [server.cmd, ...(server.args ?? [])].join(' ')\n return `server.cmd \"${cmd}\"`\n}\n\nconst SCRIPT_EXTENSION = /\\.(m?js|cjs|m?ts|cts|py)$/i\n/** Node CLI flags whose value is the next argument (so it is not the entry script). */\nconst NODE_FLAGS_WITH_VALUE = new Set([\n '-r',\n '--require',\n '--import',\n '--loader',\n '--experimental-loader',\n '-C',\n '--conditions',\n '--env-file',\n '--title',\n '--input-type',\n])\nconst NODE_FLAGS_WITHOUT_ENTRY = new Set([\n '-e',\n '--eval',\n '-p',\n '--print',\n '-',\n '-i',\n '--interactive',\n])\n\nfunction interpreterFor(file: string): string {\n return /\\.py$/i.test(file) ? 'python' : 'node'\n}\n\nfunction isExecutableFile(file: string): boolean {\n if (process.platform === 'win32') return false\n try {\n if (!fs.statSync(file).isFile()) return false\n fs.accessSync(file, fs.constants.X_OK)\n return true\n } catch {\n return false\n }\n}\n\n/** Node resolves `node dist/index` like a module path; mirror that for the existence check. */\nfunction nodeEntryExists(abs: string): boolean {\n const candidates = [abs, ...['.js', '.mjs', '.cjs', '.json', '.node'].map((ext) => abs + ext)]\n candidates.push(path.join(abs, 'index.js'))\n return candidates.some((file) => {\n try {\n return fs.statSync(file).isFile()\n } catch {\n return false\n }\n })\n}\n\n/**\n * Fail fast (before spawning) on the two most common stdio mistakes: running a script as\n * the command (`dist/index.js`), and `node <entry>` where the entry was never built.\n */\nfunction preflightStdio(server: StdioServerConfigLike): void {\n const cwd = server.cwd ?? process.cwd()\n const where = describeServer(server as ServerConfig)\n const args = server.args ?? []\n if (SCRIPT_EXTENSION.test(server.cmd)) {\n const abs = path.resolve(cwd, server.cmd)\n if (!isExecutableFile(abs)) {\n const suggestion = [interpreterFor(server.cmd), server.cmd, ...args].join(' ')\n const exists = fs.existsSync(abs)\n throw new SessionStartError(\n exists\n ? `Server failed to start at ${where}: ${server.cmd} is a script, not an executable. Did you mean \"${suggestion}\"?`\n : `Server failed to start at ${where}: File not found: ${server.cmd} (resolved ${abs}). Did you mean \"${suggestion}\"? Run your build first if the file is generated.`,\n 'spawn',\n )\n }\n return\n }\n const base = path\n .basename(server.cmd)\n .toLowerCase()\n .replace(/\\.exe$/, '')\n if (base !== 'node' && server.cmd !== process.execPath) return\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (NODE_FLAGS_WITHOUT_ENTRY.has(arg)) return\n if (NODE_FLAGS_WITH_VALUE.has(arg)) {\n i++\n continue\n }\n if (arg.startsWith('-')) continue\n const abs = path.resolve(cwd, arg)\n if (!nodeEntryExists(abs)) {\n throw new SessionStartError(\n `Server failed to start at ${where}: File not found: ${arg} (resolved ${abs}). Run your build, or vib init --server '<cmd>'.`,\n 'spawn',\n )\n }\n return\n }\n}\n\ntype StdioServerConfigLike = { cmd: string; args?: string[]; cwd?: string }\n\n/** True once `pid` no longer exists (polls; resolves false after `ms`). */\nasync function waitForExit(pid: number, ms: number): Promise<boolean> {\n const deadline = Date.now() + ms\n while (true) {\n try {\n process.kill(pid, 0)\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'EPERM') return true\n }\n if (Date.now() >= deadline) return false\n await sleep(Math.min(20, Math.max(1, deadline - Date.now())))\n }\n}\n\n/** SIGTERM / SIGKILL; on Windows, kill the whole tree (cross-spawn may run cmd.exe shims). */\nfunction terminate(pid: number, force: boolean): void {\n try {\n if (process.platform === 'win32') {\n spawnSync('taskkill', ['/pid', String(pid), '/T', '/F'], {\n stdio: 'ignore',\n windowsHide: true,\n })\n } else {\n process.kill(pid, force ? 'SIGKILL' : 'SIGTERM')\n }\n } catch {\n // already gone\n }\n}\n\n/**\n * The line that best explains an early exit: the first error-looking line\n * (`Error: Cannot find module ...`, `ModuleNotFoundError: ...`), else the first line that is\n * not stack / source-context noise.\n */\nexport function firstMeaningfulStderrLine(stderr: string): string | undefined {\n const lines = stderr\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n const errorLine = lines.find((line) =>\n /^(\\w+(Error|Exception)\\b|Error\\b|Traceback\\b|fatal\\b|panic\\b)|is not recognized as an internal or external command|command not found|No such file or directory|Cannot find module/i.test(\n line,\n ),\n )\n if (errorLine) return errorLine\n return lines.find(\n (line) =>\n !/^at\\s/.test(line) &&\n !/^node:internal\\//.test(line) &&\n !/^\\^+$/.test(line) &&\n !/^throw\\b/.test(line) &&\n !/^Node\\.js v\\d/.test(line),\n )\n}\n\nfunction isJsonRpcLine(line: string): boolean {\n const start = line.trimStart()[0]\n if (start !== '{' && start !== '[') return false\n try {\n const value = JSON.parse(line) as unknown\n const items = Array.isArray(value) ? value : [value]\n return items.length > 0 && items.every((item) => isObject(item) && item.jsonrpc === '2.0')\n } catch {\n return false\n }\n}\n\n// ---------------------------------------------------------------------------\n// McpSession\n// ---------------------------------------------------------------------------\n\nexport class McpSession {\n private queue: Promise<unknown> = Promise.resolve()\n private active: OpTracker | undefined\n private readonly toolDefs = new Map<string, RawMessage>()\n private toolsListed = false\n private initializeRaw: RawMessage | undefined\n private stderrBuffer = ''\n private isClosed = false\n private _era: 'legacy' | 'modern' = 'legacy'\n private _protocolVersion = ''\n private readonly noise: StdoutNoise = { lines: 0, sample: [] }\n private stdoutPending = ''\n private readonly stdoutDecoder = new StringDecoder('utf8')\n /** A request was left unanswered (timeout): the server may be hung, so close() kills at once. */\n private hungRequest = false\n private closing: Promise<void> | undefined\n\n private constructor(\n private readonly client: Client,\n private readonly transport: Transport,\n readonly server: ServerConfig,\n private readonly opts: SessionOptions,\n private readonly stdio?: StdioClientTransport,\n private readonly httpClient?: NodeHttpClient,\n ) {}\n\n /** Non-JSON-RPC lines the stdio server wrote to stdout so far (protocol pollution). */\n get stdoutNoise(): StdoutNoise {\n return { lines: this.noise.lines, sample: [...this.noise.sample] }\n }\n\n /** Negotiated era: `modern` = 2026-07-28+ via server/discover, `legacy` = 2025 initialize. */\n get era(): 'legacy' | 'modern' {\n return this._era\n }\n\n /** Negotiated protocol revision, e.g. \"2026-07-28\". */\n get protocolVersion(): string {\n return this._protocolVersion\n }\n\n /** True once the connection closed (server exit, transport failure, or close()). */\n get closed(): boolean {\n return this.isClosed\n }\n\n /** The last few KB of server stderr (stdio, unless stderr: 'ignore'). */\n get stderrTail(): string {\n return this.stderrBuffer\n }\n\n /** Escape hatch: the underlying SDK client. Calls made here bypass serialization/capture. */\n get sdk(): Client {\n return this.client\n }\n\n static async start(server: ServerConfig, opts: SessionOptions): Promise<McpSession> {\n const protocol = server.protocol ?? 'auto'\n const spawnTimeoutMs = server.spawnTimeoutMs ?? clamp(opts.timeoutMs, 2000, 10000)\n const versionNegotiation = negotiationFor(protocol, spawnTimeoutMs)\n const http = isHttpServerConfig(server)\n\n let transport: Transport\n let stdio: StdioClientTransport | undefined\n let httpClient: NodeHttpClient | undefined\n if (http) {\n let url: URL\n try {\n url = new URL(server.url)\n } catch {\n throw new SessionStartError(\n `Invalid server url at server.url: expected an absolute http(s) URL, got ${JSON.stringify(server.url)}.`,\n 'config',\n )\n }\n httpClient = createNodeHttpClient()\n transport = new StreamableHTTPClientTransport(url, {\n requestInit: server.headers ? { headers: server.headers } : undefined,\n fetch: httpClient.fetch,\n })\n } else {\n if (typeof server.cmd !== 'string' || server.cmd.length === 0) {\n throw new SessionStartError(\n 'Invalid server at server.cmd: expected a command string or a { url } entry. Set \"servers\" in vibrissa.json or pass --server \"<cmd> <args>\".',\n 'config',\n )\n }\n preflightStdio(server)\n stdio = new StdioClientTransport({\n command: server.cmd,\n args: server.args ?? [],\n cwd: server.cwd ?? process.cwd(),\n env: inheritedEnv(server.env ?? {}),\n stderr: opts.stderr === 'ignore' ? 'ignore' : 'pipe',\n })\n transport = stdio\n }\n\n const capabilities: ClientCapabilities = {\n elicitation: { form: {}, url: {} },\n sampling: {},\n roots: {},\n ...(opts.tasks === false ? {} : { extensions: { [TASKS_EXTENSION]: {} } }),\n }\n const client = new Client(opts.clientInfo ?? VIBRISSA_CLIENT_INFO, {\n capabilities,\n versionNegotiation,\n inputRequired: { autoFulfill: true },\n })\n const session = new McpSession(client, transport, server, opts, stdio, httpClient)\n session.wire(stdio)\n await session.connect(spawnTimeoutMs, protocol === 'auto' && !http)\n return session\n }\n\n /**\n * See every raw stdout chunk (in order, before the SDK parses it) by wrapping the stdio\n * transport's line buffer. The SDK silently drops lines that are not JSON-RPC.\n */\n private watchStdout(stdio: StdioClientTransport): void {\n const buffer = (stdio as unknown as { _readBuffer?: { append?: (chunk: Buffer) => void } })\n ._readBuffer\n if (!buffer || typeof buffer.append !== 'function') return\n const append = buffer.append.bind(buffer)\n buffer.append = (chunk: Buffer) => {\n this.scanStdout(chunk)\n append(chunk)\n }\n }\n\n private scanStdout(chunk: Buffer): void {\n const scanFrom = this.stdoutPending.length\n this.stdoutPending += this.stdoutDecoder.write(chunk)\n let newline = this.stdoutPending.indexOf('\\n', scanFrom)\n while (newline !== -1) {\n const line = this.stdoutPending.slice(0, newline).replace(/\\r$/, '')\n this.stdoutPending = this.stdoutPending.slice(newline + 1)\n if (line.trim() !== '' && !isJsonRpcLine(line)) {\n this.noise.lines += 1\n if (this.noise.sample.length < NOISE_SAMPLE_LINES) {\n this.noise.sample.push(\n line.length > NOISE_LINE_CHARS ? `${line.slice(0, NOISE_LINE_CHARS)}…` : line,\n )\n }\n this.opts.onStdoutNoise?.(line)\n }\n newline = this.stdoutPending.indexOf('\\n')\n }\n }\n\n /** Install transport taps, stderr capture, and the input-request handlers. */\n private wire(stdio: StdioClientTransport | undefined): void {\n if (stdio) this.watchStdout(stdio)\n const transport = this.transport\n const send = transport.send.bind(transport)\n transport.send = (message, options) => {\n this.tap('out', message)\n return send(message, options)\n }\n // Wrap whatever handler the SDK installs (probe window, then Protocol.connect).\n // Identity-dedupe guards against chained handlers seeing the same message twice.\n let current: Transport['onmessage']\n let lastIn: unknown\n Object.defineProperty(transport, 'onmessage', {\n configurable: true,\n enumerable: true,\n get: () => current,\n set: (handler: Transport['onmessage']) => {\n if (handler === undefined || (handler as unknown as Record<symbol, unknown>)[TAPPED]) {\n current = handler\n return\n }\n const wrapped = ((message: JSONRPCMessage, extra?: unknown) => {\n if (message !== lastIn) {\n lastIn = message\n this.tap('in', message)\n }\n ;(handler as (m: JSONRPCMessage, e?: unknown) => void)(message, extra)\n }) as unknown as NonNullable<Transport['onmessage']> & Record<symbol, unknown>\n wrapped[TAPPED] = true\n current = wrapped\n },\n })\n\n stdio?.stderr?.on('data', (chunk: Buffer | string) => {\n const text = String(chunk)\n this.stderrBuffer = (this.stderrBuffer + text).slice(-STDERR_TAIL_CHARS)\n if ((this.opts.stderr ?? 'inherit') === 'inherit') process.stderr.write(text)\n this.opts.onStderr?.(text)\n this.opts.transcript?.({ dir: 'stderr', ts: Date.now(), text })\n })\n\n this.client.onerror = () => {\n // Out-of-band noise (late responses after a timeout, dropped requests): visible in the transcript.\n }\n this.client.onclose = () => {\n this.isClosed = true\n }\n for (const method of ['elicitation/create', 'sampling/createMessage', 'roots/list'] as const) {\n this.client.setRequestHandler(method, ((\n request: { params?: unknown },\n ctx: { mcpReq: { id: unknown } },\n ) => this.answerInputRequest(method, request, ctx)) as never)\n }\n }\n\n private tap(dir: 'in' | 'out', message: JSONRPCMessage): void {\n const raw = message as unknown as RawMessage\n const tracker = this.active\n if (tracker) {\n if (dir === 'out' && isRequest(raw))\n tracker.sent.set(raw.id as string | number, raw.method as string)\n if (dir === 'in' && isResponse(raw)) {\n const method = tracker.sent.get(raw.id as string | number)\n if (method !== undefined) {\n tracker.responses.push({ method, message: raw })\n const result = raw.result\n if (isObject(result) && result.resultType === 'input_required') {\n tracker.inputRounds.push(json(result.inputRequests ?? {}))\n }\n }\n }\n }\n if (this.opts.transcript) this.opts.transcript({ dir, ts: Date.now(), message: json(message) })\n }\n\n private async answerInputRequest(\n method: string,\n request: { params?: unknown },\n ctx: { mcpReq: { id: unknown } },\n ): Promise<never> {\n const params = json(request.params ?? {})\n const tracker = this.active\n const key = String(ctx.mcpReq.id)\n // Legacy servers push real requests; record them as rounds (modern rounds come from the wire tap).\n if (this._era === 'legacy' && tracker) tracker.inputRounds.push({ [key]: { method, params } })\n const answer = await askResponders([tracker?.respond, this.opts.inputResponder], method, params)\n if (answer === undefined) {\n tracker?.unanswered.push({ key, method, params })\n throw new UnansweredInputError(method)\n }\n return answer as never\n }\n\n private async connect(spawnTimeoutMs: number, autoOnStdio: boolean): Promise<void> {\n const where = describeServer(this.server)\n const tracker = new OpTracker()\n this.active = tracker\n const guardMs = spawnTimeoutMs * (autoOnStdio ? 2 : 1) + 1000\n let guard: NodeJS.Timeout | undefined\n try {\n await Promise.race([\n this.client.connect(this.transport, { timeout: spawnTimeoutMs }),\n new Promise<never>((_, reject) => {\n guard = setTimeout(\n () => reject(new SdkError(SdkErrorCode.RequestTimeout, 'Server spawn timeout')),\n guardMs,\n )\n }),\n ])\n } catch (err) {\n this.hungRequest = true // nothing worth waiting for: kill the child right away\n await this.close()\n throw this.startError(err, where, spawnTimeoutMs)\n } finally {\n if (guard) clearTimeout(guard)\n this.active = undefined\n }\n this._era = this.client.getProtocolEra() ?? 'legacy'\n this._protocolVersion = this.client.getNegotiatedProtocolVersion() ?? ''\n const init = tracker.last('initialize')\n if (init && isObject(init.result)) this.initializeRaw = init.result\n }\n\n private startError(err: unknown, where: string, spawnTimeoutMs: number): SessionStartError {\n const stderr = this.stderrBuffer.trim()\n const firstLine = firstMeaningfulStderrLine(stderr)\n const noise =\n this.noise.lines > 0\n ? ` The server wrote ${this.noise.lines} non-JSON-RPC line${this.noise.lines === 1 ? '' : 's'} to stdout (first: ${JSON.stringify(this.noise.sample[0])}); stdout must carry only JSON-RPC, log to stderr instead.`\n : ''\n const tail = `${firstLine ? ` Server stderr: ${firstLine}` : ''}${noise}`\n const message = err instanceof Error ? err.message : String(err)\n const errno = (err as { code?: unknown })?.code\n const http = isHttpServerConfig(this.server)\n const protocol = this.server.protocol ?? 'auto'\n const eraHint =\n protocol === 'auto'\n ? 'Try --protocol legacy for 2025-era servers.'\n : protocol === 'legacy'\n ? 'Try --protocol auto.'\n : 'Use --protocol auto to allow the 2025 fallback.'\n // cross-spawn on Windows runs unresolvable commands through cmd.exe, so ENOENT shows up\n // as an early exit with a \"not recognized\" message on stderr.\n const notFound =\n errno === 'ENOENT' ||\n /ENOENT/.test(message) ||\n /is not recognized as an internal or external command|command not found|No such file or directory/i.test(\n stderr,\n )\n if (!http && notFound) {\n return new SessionStartError(\n `Server failed to start at ${where}: command not found (ENOENT). Check the command and PATH, or pass --server \"<cmd> <args>\".${tail}`,\n 'spawn',\n stderr,\n { cause: err },\n )\n }\n if (\n http &&\n /fetch failed|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|ECONNRESET|socket hang up/i.test(message)\n ) {\n return new SessionStartError(\n `Server connection failed at ${where}: ${message}. Is the server running and reachable at that URL?`,\n 'http',\n stderr,\n { cause: err },\n )\n }\n if (err instanceof SdkError) {\n switch (err.code) {\n case SdkErrorCode.ConnectionClosed:\n case SdkErrorCode.NotConnected:\n case SdkErrorCode.SendFailed:\n return new SessionStartError(\n `Server exited early before completing MCP initialization at ${where}: ${message}. Run the command by hand to see why it exits.${tail}`,\n 'exited',\n stderr,\n { cause: err },\n )\n case SdkErrorCode.RequestTimeout:\n return new SessionStartError(\n `Server spawn timeout at ${where}: no MCP handshake within ${spawnTimeoutMs}ms. Make sure the server writes only JSON-RPC to stdout, or raise server.spawnTimeoutMs.${tail}`,\n 'timeout',\n stderr,\n { cause: err },\n )\n case SdkErrorCode.EraNegotiationFailed:\n return new SessionStartError(\n `Protocol negotiation failed at ${where}: ${message}. ${eraHint}${tail}`,\n 'negotiation',\n stderr,\n { cause: err },\n )\n default:\n if (String(err.code).startsWith('CLIENT_HTTP')) {\n return new SessionStartError(\n `Server connection failed at ${where}: ${message} (${sdkErrorCodeName(err.code)}). Check the URL and headers (auth tokens via \\${ENV} in vibrissa.json).`,\n 'http',\n stderr,\n { cause: err },\n )\n }\n }\n }\n if (err instanceof ProtocolError) {\n return new SessionStartError(\n `Protocol negotiation failed at ${where}: server answered ${err.code} ${message}. ${eraHint}${tail}`,\n 'negotiation',\n stderr,\n { cause: err },\n )\n }\n return new SessionStartError(\n `Server ${http ? 'connection' : 'start'} failed at ${where}: ${message}.${http ? ' Is the server running and reachable?' : ''}${tail}`,\n http ? 'http' : 'exited',\n stderr,\n { cause: err },\n )\n }\n\n /** Run `fn` exclusively, with a fresh wire tracker. */\n private exclusive<T>(\n respond: InputResponder | undefined,\n fn: (tracker: OpTracker) => Promise<T>,\n ): Promise<T> {\n const run = this.queue.then(async () => {\n const tracker = new OpTracker(respond)\n this.active = tracker\n try {\n return await fn(tracker)\n } finally {\n this.active = undefined\n const answered = new Set(tracker.responses.map((r) => r.message.id))\n for (const id of tracker.sent.keys()) if (!answered.has(id)) this.hungRequest = true\n }\n })\n this.queue = run.catch(() => undefined)\n return run\n }\n\n // ---- discovery & lists --------------------------------------------------\n\n /** `server/discover` on modern; synthesized from the `initialize` result on legacy. */\n discover(): Promise<DiscoverInfo> {\n if (this._era === 'legacy') return Promise.resolve(this.synthesizeDiscover())\n return this.exclusive(undefined, async (tracker) => {\n let thrown: unknown\n let sdkValue: unknown\n try {\n sdkValue = await this.client.discover({ timeout: this.opts.timeoutMs })\n } catch (err) {\n thrown = err\n }\n const last = tracker.last('server/discover')\n if (last && isObject(last.error)) {\n const error = fromJsonRpcError(last.error)\n throw new SessionRequestError(\n `server/discover failed at ${describeServer(this.server)}: ${error.message}`,\n error,\n )\n }\n const raw =\n last && isObject(last.result) ? last.result : isObject(sdkValue) ? sdkValue : undefined\n if (!raw) {\n const error = toToolError(thrown, {\n what: 'server/discover',\n timeoutMs: this.opts.timeoutMs,\n })\n throw new SessionRequestError(error.message, error)\n }\n const meta = isObject(raw._meta) ? raw._meta : {}\n const identity = isObject(meta[SERVER_INFO_META_KEY])\n ? meta[SERVER_INFO_META_KEY]\n : this.client.getServerVersion()\n const capabilities = isObject(raw.capabilities) ? raw.capabilities : {}\n return {\n era: 'modern',\n protocolVersion: this._protocolVersion,\n supportedVersions: Array.isArray(raw.supportedVersions)\n ? raw.supportedVersions.map(String)\n : [this._protocolVersion],\n ...(identity ? { serverInfo: json(identity) as ServerIdentity } : {}),\n capabilities: json(capabilities),\n extensions: isObject(capabilities.extensions) ? Object.keys(capabilities.extensions) : [],\n ...(typeof raw.instructions === 'string' ? { instructions: raw.instructions } : {}),\n synthesized: false,\n raw: json(raw),\n }\n })\n }\n\n private synthesizeDiscover(): DiscoverInfo {\n const init = this.initializeRaw\n const capabilities = isObject(init?.capabilities)\n ? init.capabilities\n : ((this.client.getServerCapabilities() ?? {}) as RawMessage)\n const identity = isObject(init?.serverInfo) ? init.serverInfo : this.client.getServerVersion()\n const instructions =\n typeof init?.instructions === 'string' ? init.instructions : this.client.getInstructions()\n const raw: RawMessage = init ?? {\n protocolVersion: this._protocolVersion,\n capabilities,\n ...(identity ? { serverInfo: identity } : {}),\n ...(instructions ? { instructions } : {}),\n }\n return {\n era: 'legacy',\n protocolVersion: this._protocolVersion,\n supportedVersions: [this._protocolVersion],\n ...(identity ? { serverInfo: json(identity) as ServerIdentity } : {}),\n capabilities: json(capabilities),\n extensions: isObject(capabilities.extensions) ? Object.keys(capabilities.extensions) : [],\n ...(instructions ? { instructions } : {}),\n synthesized: true,\n raw: json(raw),\n }\n }\n\n async listTools(): Promise<ToolSummary[]> {\n return (await this.listToolsResult()).items\n }\n\n async listResources(): Promise<ResourceSummary[]> {\n return (await this.listResourcesResult()).items\n }\n\n async listResourceTemplates(): Promise<ResourceTemplateSummary[]> {\n return (await this.listResourceTemplatesResult()).items\n }\n\n async listPrompts(): Promise<PromptSummary[]> {\n return (await this.listPromptsResult()).items\n }\n\n listToolsResult(): Promise<ListResult<ToolSummary>> {\n return this.exclusive(undefined, async (tracker) => {\n const list = await this.listPages(tracker, 'tools/list', 'tools')\n return { ...list, items: list.items.map(toolSummary) }\n })\n }\n\n listResourcesResult(): Promise<ListResult<ResourceSummary>> {\n return this.exclusive(undefined, async (tracker) => {\n const list = await this.listPages(tracker, 'resources/list', 'resources')\n return { ...list, items: list.items.map(resourceSummary) }\n })\n }\n\n listResourceTemplatesResult(): Promise<ListResult<ResourceTemplateSummary>> {\n return this.exclusive(undefined, async (tracker) => {\n const list = await this.listPages(tracker, 'resources/templates/list', 'resourceTemplates')\n return { ...list, items: list.items.map(resourceTemplateSummary) }\n })\n }\n\n listPromptsResult(): Promise<ListResult<PromptSummary>> {\n return this.exclusive(undefined, async (tracker) => {\n const list = await this.listPages(tracker, 'prompts/list', 'prompts')\n return { ...list, items: list.items.map(promptSummary) }\n })\n }\n\n /** Walk all pages through the SDK, then rebuild the aggregate from the raw wire pages. */\n private async listPages(\n tracker: OpTracker,\n method: 'tools/list' | 'resources/list' | 'resources/templates/list' | 'prompts/list',\n key: 'tools' | 'resources' | 'resourceTemplates' | 'prompts',\n ): Promise<ListResult<RawMessage>> {\n const options = { timeout: this.opts.timeoutMs, cacheMode: 'bypass' as const }\n let sdkValue: unknown\n let thrown: unknown\n try {\n if (method === 'tools/list') sdkValue = await this.client.listTools(undefined, options)\n else if (method === 'resources/list')\n sdkValue = await this.client.listResources(undefined, options)\n else if (method === 'resources/templates/list')\n sdkValue = await this.client.listResourceTemplates(undefined, options)\n else sdkValue = await this.client.listPrompts(undefined, options)\n } catch (err) {\n thrown = err\n }\n const last = tracker.last(method)\n if (last && isObject(last.error)) {\n const error = fromJsonRpcError(last.error)\n throw new SessionRequestError(\n `${method} failed at ${describeServer(this.server)}: ${error.message}`,\n error,\n )\n }\n const pages = tracker.results(method)\n const first = pages[0] ?? (isObject(sdkValue) ? sdkValue : undefined)\n if (!first) {\n if (thrown === undefined) return { items: [] }\n const error = toToolError(thrown, { what: method, timeoutMs: this.opts.timeoutMs })\n throw new SessionRequestError(error.message, error)\n }\n // Mirror the SDK walk: a page repeating the previous one (same items + cursor) ends it.\n const source = (pages.length > 0 ? pages : [first]).filter(\n (page, i, all) =>\n i === 0 ||\n JSON.stringify([page[key], page.nextCursor]) !==\n JSON.stringify([all[i - 1][key], all[i - 1].nextCursor]),\n )\n const items = source\n .flatMap((page) => (Array.isArray(page[key]) ? (page[key] as unknown[]) : []))\n .filter(isObject)\n if (method === 'tools/list') {\n this.toolsListed = true\n for (const tool of items)\n if (typeof tool.name === 'string') this.toolDefs.set(tool.name, tool)\n }\n return {\n items,\n ...(typeof first.ttlMs === 'number' ? { ttlMs: first.ttlMs } : {}),\n ...(typeof first.cacheScope === 'string' ? { cacheScope: first.cacheScope } : {}),\n ...(first._meta !== undefined ? { _meta: json(first._meta) } : {}),\n }\n }\n\n // ---- operations -----------------------------------------------------------\n\n callTool(\n name: string,\n args: Record<string, JsonValue> = {},\n opts: CallOptions = {},\n ): Promise<Outcome> {\n const timeoutMs = opts.timeoutMs ?? this.opts.timeoutMs\n return this.exclusive(responderFrom(opts.respond), async (tracker) => {\n const toolDefinition = await this.toolDefinitionFor(tracker, name)\n const started = performance.now()\n let sdkValue: unknown\n let thrown: unknown\n try {\n sdkValue = await this.client.callTool(\n { name, arguments: args },\n { timeout: timeoutMs, maxTotalTimeout: timeoutMs, toolDefinition },\n )\n } catch (err) {\n thrown = err\n }\n return this.finish(\n tracker,\n 'tools/call',\n `tools/call \"${name}\"`,\n timeoutMs,\n started,\n sdkValue,\n thrown,\n opts,\n )\n })\n }\n\n readResource(uri: string, opts: CallOptions = {}): Promise<Outcome> {\n const timeoutMs = opts.timeoutMs ?? this.opts.timeoutMs\n return this.exclusive(responderFrom(opts.respond), async (tracker) => {\n const started = performance.now()\n let sdkValue: unknown\n let thrown: unknown\n try {\n sdkValue = await this.client.readResource(\n { uri },\n { timeout: timeoutMs, maxTotalTimeout: timeoutMs, cacheMode: 'bypass' },\n )\n } catch (err) {\n thrown = err\n }\n return this.finish(\n tracker,\n 'resources/read',\n `resources/read \"${uri}\"`,\n timeoutMs,\n started,\n sdkValue,\n thrown,\n opts,\n )\n })\n }\n\n /** Expand `template` with `args`, then `resources/read`. */\n readResourceTemplate(\n template: string,\n args: Record<string, JsonValue> = {},\n opts: CallOptions = {},\n ): Promise<Outcome> {\n return this.readResource(expandUriTemplate(template, args), opts)\n }\n\n getPrompt(\n name: string,\n args: Record<string, JsonValue> = {},\n opts: CallOptions = {},\n ): Promise<Outcome> {\n const timeoutMs = opts.timeoutMs ?? this.opts.timeoutMs\n return this.exclusive(responderFrom(opts.respond), async (tracker) => {\n const started = performance.now()\n let sdkValue: unknown\n let thrown: unknown\n try {\n sdkValue = await this.client.getPrompt(\n { name, arguments: args as Record<string, string> },\n { timeout: timeoutMs, maxTotalTimeout: timeoutMs },\n )\n } catch (err) {\n thrown = err\n }\n return this.finish(\n tracker,\n 'prompts/get',\n `prompts/get \"${name}\"`,\n timeoutMs,\n started,\n sdkValue,\n thrown,\n opts,\n )\n })\n }\n\n /**\n * Liveness round trip; false when the server is gone or does not answer in time.\n * `ping` does not exist on 2026-07-28, so modern sessions use `server/discover`.\n */\n ping(timeoutMs = this.opts.timeoutMs): Promise<boolean> {\n return this.exclusive(undefined, async () => {\n try {\n if (this._era === 'modern') await this.client.discover({ timeout: timeoutMs })\n else await this.client.ping({ timeout: timeoutMs })\n return true\n } catch {\n return false\n }\n })\n }\n\n /**\n * Close the connection and release every OS resource, so the process can exit naturally.\n * - stdio: stdin EOF, then SIGTERM after 500ms (at once if a call was left hanging), then\n * SIGKILL after another 500ms (Windows: kill the process tree).\n * - HTTP: terminate a legacy server session (DELETE) when one exists, close the transport,\n * then destroy the session's sockets.\n * Idempotent; concurrent callers share one teardown.\n */\n close(): Promise<void> {\n this.closing ??= this.teardown()\n return this.closing\n }\n\n private async teardown(): Promise<void> {\n this.isClosed = true\n if (this.httpClient) {\n const http = this.transport as StreamableHTTPClientTransport\n if (http.sessionId !== undefined) {\n let timer: NodeJS.Timeout | undefined\n await Promise.race([\n http.terminateSession().catch(() => {}),\n new Promise<void>((resolve) => {\n timer = setTimeout(resolve, 1000)\n }),\n ])\n if (timer) clearTimeout(timer)\n }\n await this.client.close().catch(() => {})\n this.httpClient.destroy()\n return\n }\n const pid = this.stdio?.pid ?? undefined\n const sdkClose = this.client.close().catch(() => {})\n if (typeof pid === 'number') {\n const graceMs = this.hungRequest ? 0 : STDIO_EXIT_GRACE_MS\n if (!(await waitForExit(pid, graceMs))) {\n terminate(pid, false)\n if (!(await waitForExit(pid, STDIO_KILL_GRACE_MS))) terminate(pid, true)\n }\n }\n await sdkClose\n }\n\n /**\n * The tool definition handed to the SDK: our cached one with `outputSchema` removed, so the\n * SDK never validates structuredContent itself (the runner does, with better errors and a\n * per-case opt-out). On modern HTTP, list once so SEP-2243 `Mcp-Param-*` mirroring has data.\n */\n private async toolDefinitionFor(tracker: OpTracker, name: string): Promise<Tool> {\n if (\n !this.toolDefs.has(name) &&\n !this.toolsListed &&\n this._era === 'modern' &&\n isHttpServerConfig(this.server)\n ) {\n await this.listPages(tracker, 'tools/list', 'tools').catch(() => undefined)\n }\n const cached = this.toolDefs.get(name)\n const { outputSchema: _ignored, ...rest } = cached ?? { name, inputSchema: { type: 'object' } }\n return clone(rest) as unknown as Tool\n }\n\n /** Turn what happened on the wire (and what the SDK threw) into an Outcome. */\n private async finish(\n tracker: OpTracker,\n method: string,\n what: string,\n timeoutMs: number,\n started: number,\n sdkValue: unknown,\n thrown: unknown,\n opts: CallOptions,\n ): Promise<Outcome> {\n const base = (): OutcomeBase => ({\n durationMs: elapsed(started),\n ...(tracker.inputRounds.length > 0\n ? { inputRequests: json(tracker.inputRounds) as JsonValue[] }\n : {}),\n })\n\n if (tracker.unanswered.length > 0) {\n const lastRaw = tracker.last(method)\n const lastResult = lastRaw && isObject(lastRaw.result) ? lastRaw.result : undefined\n const modernRound = lastResult?.resultType === 'input_required'\n const requests: JsonValue = modernRound\n ? json(lastResult.inputRequests ?? {})\n : Object.fromEntries(\n tracker.unanswered.map((u) => [u.key, { method: u.method, params: u.params }]),\n )\n return {\n kind: 'input_required',\n requests,\n ...(modernRound && typeof lastResult.requestState === 'string'\n ? { requestState: lastResult.requestState }\n : {}),\n ...base(),\n }\n }\n\n const last = tracker.last(method)\n if (last && isObject(last.error)) {\n return { kind: 'error', error: fromJsonRpcError(last.error), ...base() }\n }\n\n const raw = last && isObject(last.result) ? last.result : undefined\n if (raw?.resultType === 'task') {\n const task = json(raw)\n if (!opts.await) return { kind: 'result', result: task, task, ...base() }\n return this.awaitTask(tracker, raw, opts, what, timeoutMs, base)\n }\n\n if (thrown !== undefined) {\n const error = toToolError(thrown, { what, timeoutMs })\n return {\n kind: 'error',\n error: { ...error, local: true },\n ...(raw ? { result: json(raw) } : {}),\n ...base(),\n }\n }\n\n const result = raw ?? (isObject(sdkValue) ? sdkValue : undefined)\n if (!result) {\n return {\n kind: 'error',\n error: {\n kind: 'transport',\n codeName: 'NoResponse',\n message: `No response captured at ${what}.`,\n local: true,\n },\n ...base(),\n }\n }\n return this.resultOutcome(method, json(result), base())\n }\n\n private resultOutcome(method: string, result: JsonValue, base: OutcomeBase): Outcome {\n if (method === 'tools/call' && isObject(result) && result.isError === true) {\n return {\n kind: 'error',\n error: { kind: 'tool', message: textFromContent(result.content) },\n result,\n ...base,\n }\n }\n return { kind: 'result', result, ...base }\n }\n\n /** Tasks extension: poll `tasks/get` until completed / failed / cancelled. */\n private async awaitTask(\n tracker: OpTracker,\n seed: RawMessage,\n opts: CallOptions,\n what: string,\n timeoutMs: number,\n base: () => OutcomeBase,\n ): Promise<Outcome> {\n const awaitOpts = typeof opts.await === 'object' ? opts.await : {}\n const budgetMs = awaitOpts.timeoutMs ?? DEFAULT_AWAIT_TIMEOUT_MS\n const deadline = performance.now() + budgetMs\n const task = json(seed)\n const taskId = String(seed.taskId)\n const answered = new Set<string>()\n let current: RawMessage = seed\n const withTask = (): OutcomeBase => ({ ...base(), task })\n\n while (true) {\n const status = current.status\n if (status === 'completed') {\n const result = isObject(current.result) ? json(current.result) : {}\n return this.resultOutcome('tools/call', result, withTask())\n }\n if (status === 'failed') {\n const error = isObject(current.error)\n ? fromJsonRpcError(current.error)\n : {\n kind: 'protocol' as const,\n codeName: 'TaskFailed',\n message: String(current.statusMessage ?? 'Task failed'),\n }\n return { kind: 'error', error, ...withTask() }\n }\n if (status === 'cancelled') {\n return {\n kind: 'error',\n error: {\n kind: 'protocol',\n codeName: 'TaskCancelled',\n message: `Task ${taskId} was cancelled at ${what}${current.statusMessage ? `: ${current.statusMessage}` : ''}.`,\n },\n ...withTask(),\n }\n }\n if (status === 'input_required' && isObject(current.inputRequests)) {\n const pending = Object.entries(current.inputRequests).filter(([key]) => !answered.has(key))\n if (pending.length > 0) {\n tracker.inputRounds.push(json(Object.fromEntries(pending)))\n const responses: Record<string, JsonValue> = {}\n for (const [key, entry] of pending) {\n const request = isObject(entry) ? entry : {}\n const answer = await askResponders(\n [tracker.respond, this.opts.inputResponder],\n String(request.method),\n json(request.params ?? {}),\n )\n if (answer === undefined) {\n return {\n kind: 'input_required',\n requests: json(current.inputRequests),\n ...withTask(),\n }\n }\n responses[key] = answer\n }\n const update = await this.taskRequest(\n tracker,\n 'tasks/update',\n { taskId, inputResponses: responses },\n timeoutMs,\n what,\n )\n if ('error' in update) return { kind: 'error', error: update.error, ...withTask() }\n for (const key of Object.keys(responses)) answered.add(key)\n }\n }\n const remaining = deadline - performance.now()\n if (remaining <= 0) {\n return {\n kind: 'error',\n error: {\n kind: 'timeout',\n codeName: 'RequestTimeout',\n message: `Task did not finish at ${what}: task ${taskId} still \"${String(status)}\" after ${budgetMs}ms. Raise await.timeoutMs if the work is legitimately slow.`,\n local: true,\n },\n ...withTask(),\n }\n }\n const serverPoll =\n typeof current.pollIntervalMs === 'number' ? current.pollIntervalMs : DEFAULT_POLL_MS\n await sleep(Math.max(0, Math.min(awaitOpts.pollMs ?? serverPoll, remaining)))\n const polled = await this.taskRequest(tracker, 'tasks/get', { taskId }, timeoutMs, what)\n if ('error' in polled) return { kind: 'error', error: polled.error, ...withTask() }\n current = polled.result\n }\n }\n\n private async taskRequest(\n tracker: OpTracker,\n method: 'tasks/get' | 'tasks/update',\n params: Record<string, unknown>,\n timeoutMs: number,\n what: string,\n ): Promise<{ result: RawMessage } | { error: ToolError }> {\n let thrown: unknown\n let sdkValue: unknown\n try {\n sdkValue = await this.client.request({ method, params }, PASSTHROUGH, { timeout: timeoutMs })\n } catch (err) {\n thrown = err\n }\n const last = tracker.last(method)\n if (last && isObject(last.error)) return { error: fromJsonRpcError(last.error) }\n if (last && isObject(last.result)) return { result: last.result }\n if (thrown === undefined && isObject(sdkValue)) return { result: sdkValue }\n return {\n error: { ...toToolError(thrown, { what: `${method} for ${what}`, timeoutMs }), local: true },\n }\n }\n}\n","{\n \"name\": \"@jmoak/vibrissa\",\n \"version\": \"2.0.0-alpha.0\",\n \"description\": \"Ultra-light JSON-driven MCP integration test runner\",\n \"type\": \"module\",\n \"engines\": {\n \"node\": \">=20\"\n },\n \"bin\": {\n \"vib-test\": \"bin/vib-test.js\",\n \"vib\": \"bin/vib-test.js\"\n },\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n },\n \"./cli\": {\n \"import\": \"./dist/cli.js\"\n },\n \"./vitest\": {\n \"import\": \"./dist/vitest.js\",\n \"types\": \"./dist/vitest.d.ts\"\n }\n },\n \"files\": [\"dist\", \"bin\", \"schema\", \"README.md\", \"LICENSE\"],\n \"scripts\": {\n \"build\": \"tsup src/cli.ts src/index.ts src/vitest.ts --format esm --target node20 --dts --clean --sourcemap --external fast-glob --external vitest\",\n \"dev\": \"tsup src/cli.ts src/index.ts src/vitest.ts --format esm --target node20 --dts --watch --sourcemap --external fast-glob --external vitest\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:ci\": \"vitest run --reporter=default --reporter=junit --outputFile.junit=reports/junit/junit.xml\",\n \"e2e\": \"npm run build && node bin/vib-test.js --config tests/fixtures/echo-server/vibrissa.json\",\n \"e2e:demo\": \"npm run build && node bin/vib-test.js --config tests/fixtures/echo-server/vibrissa.json --cases \\\"tests/fixtures/echo-server/cases/**/*.json\\\"\",\n \"lint\": \"biome check . --write\",\n \"lint:fix\": \"biome check . --write --unsafe\",\n \"prepack\": \"npm run build\",\n \"release\": \"semantic-release\",\n \"test:release\": \"node --test scripts/release.test.mjs\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/JMoak/vibrissa.git\"\n },\n \"keywords\": [\n \"mcp\",\n \"model-context-protocol\",\n \"mcp-testing\",\n \"integration\",\n \"testing\",\n \"test-runner\",\n \"cli\",\n \"claude\"\n ],\n \"author\": \"Jordan Moak\",\n \"license\": \"MIT\",\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true,\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/JMoak/vibrissa/issues\"\n },\n \"homepage\": \"https://github.com/JMoak/vibrissa#readme\",\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.8.3\",\n \"@modelcontextprotocol/server\": \"^2.4.0\",\n \"@types/node\": \"^20.19.13\",\n \"@vitest/coverage-v8\": \"^4.1.10\",\n \"conventional-changelog-conventionalcommits\": \"8.0.0\",\n \"semantic-release\": \"25.0.9\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.2\",\n \"vitest\": \"^4.1.10\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/client\": \"^2.4.0\",\n \"ajv\": \"^8.20.0\",\n \"ajv-formats\": \"^3.0.1\",\n \"fast-glob\": \"^3.3.2\",\n \"jest-diff\": \"^30.1.3\"\n },\n \"peerDependencies\": {\n \"vitest\": \">=1.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"vitest\": {\n \"optional\": true\n }\n }\n}\n","import manifest from '../package.json' with { type: 'json' }\n\n// Bundlers inline this value. prepack rebuilds after the release job assigns the version.\nexport const VERSION: string = manifest.version\n","/**\n * A minimal `fetch` for the Streamable HTTP transport, built on node:http(s) with a\n * per-session keep-alive agent that `destroy()` tears down completely.\n *\n * Why not global fetch: undici keeps pooled sockets (and SSE body machinery) alive past\n * `transport.close()`, and `process.exit()` while those handles are closing aborts the\n * process on Windows (`Assertion failed: !(handle->flags & UV_HANDLE_CLOSING)`, exit 127).\n * Owning the sockets lets McpSession.close() leave no active handles behind.\n *\n * Redirects are never followed here; the SDK follows them itself (`redirect: 'manual'`\n * semantics) by reading the 3xx status and `Location` header.\n */\nimport http from 'node:http'\nimport https from 'node:https'\nimport { Readable } from 'node:stream'\nimport type { ReadableStream as NodeReadableStream } from 'node:stream/web'\n\nexport type FetchFn = (input: string | URL | Request, init?: RequestInit) => Promise<Response>\n\nexport interface NodeHttpClient {\n fetch: FetchFn\n /** Abort in-flight requests and destroy every socket (active and pooled). Idempotent. */\n destroy(): void\n}\n\nconst NULL_BODY_STATUS = new Set([101, 204, 205, 304])\n\nfunction abortReason(signal: AbortSignal): unknown {\n return signal.reason ?? new DOMException('This operation was aborted', 'AbortError')\n}\n\nasync function bodyBytes(body: unknown, headers: Headers): Promise<Buffer | undefined> {\n if (body === undefined || body === null) return undefined\n if (typeof body === 'string') return Buffer.from(body)\n if (body instanceof URLSearchParams) {\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n return Buffer.from(body.toString())\n }\n if (body instanceof ArrayBuffer) return Buffer.from(body)\n if (ArrayBuffer.isView(body)) return Buffer.from(body.buffer, body.byteOffset, body.byteLength)\n if (body instanceof Blob) return Buffer.from(await body.arrayBuffer())\n if (body instanceof ReadableStream) return Buffer.from(await new Response(body).arrayBuffer())\n throw new TypeError(`Unsupported request body type: ${Object.prototype.toString.call(body)}`)\n}\n\nfunction toHeaders(raw: http.IncomingHttpHeaders): Headers {\n const headers = new Headers()\n for (const [key, value] of Object.entries(raw)) {\n if (Array.isArray(value)) for (const item of value) headers.append(key, item)\n else if (value !== undefined) headers.set(key, value)\n }\n return headers\n}\n\nexport function createNodeHttpClient(): NodeHttpClient {\n const httpAgent = new http.Agent({ keepAlive: true })\n const httpsAgent = new https.Agent({ keepAlive: true })\n const live = new Set<http.ClientRequest>()\n let destroyed = false\n\n const fetchFn: FetchFn = async (input, init = {}) => {\n if (destroyed) throw new TypeError('fetch failed: the session HTTP client was closed')\n const request = input instanceof Request ? input : undefined\n const url = new URL(request ? request.url : input instanceof URL ? input.href : String(input))\n const method = (init.method ?? request?.method ?? 'GET').toUpperCase()\n const headers = new Headers(request?.headers)\n for (const [key, value] of new Headers(init.headers)) headers.set(key, value)\n const signal = init.signal ?? request?.signal ?? undefined\n const body = await bodyBytes(\n init.body ?? (request?.body ? await request.arrayBuffer() : undefined),\n headers,\n )\n if (body) headers.set('content-length', String(body.length))\n if (signal?.aborted) throw abortReason(signal)\n\n const transport = url.protocol === 'https:' ? https : http\n if (url.protocol !== 'https:' && url.protocol !== 'http:') {\n throw new TypeError(`fetch failed: unsupported protocol ${url.protocol}`)\n }\n\n return new Promise<Response>((resolve, reject) => {\n const req = transport.request(url, {\n method,\n headers: Object.fromEntries(headers),\n agent: url.protocol === 'https:' ? httpsAgent : httpAgent,\n })\n live.add(req)\n const onAbort = () => req.destroy(abortReason(signal as AbortSignal) as Error)\n signal?.addEventListener('abort', onAbort, { once: true })\n const cleanup = () => {\n live.delete(req)\n signal?.removeEventListener('abort', onAbort)\n }\n req.on('error', (err) => {\n cleanup()\n reject(\n signal?.aborted\n ? abortReason(signal)\n : Object.assign(new TypeError('fetch failed'), { cause: err }),\n )\n })\n req.on('close', cleanup)\n req.on('response', (res) => {\n const status = res.statusCode ?? 0\n const nullBody = NULL_BODY_STATUS.has(status) || method === 'HEAD'\n if (nullBody) res.resume()\n try {\n resolve(\n new Response(\n nullBody ? null : (Readable.toWeb(res) as unknown as NodeReadableStream as never),\n { status, statusText: res.statusMessage, headers: toHeaders(res.headers) },\n ),\n )\n } catch (err) {\n res.destroy()\n reject(err)\n }\n })\n req.end(body)\n })\n }\n\n return {\n fetch: fetchFn,\n destroy() {\n if (destroyed) return\n destroyed = true\n for (const req of live) req.destroy()\n live.clear()\n httpAgent.destroy()\n httpsAgent.destroy()\n },\n }\n}\n","import type { NormalizeConfig, RunOptions } from './types.js'\n\nexport const DEFAULT_SERVER_NAME = 'default'\nexport const DEFAULT_MANIFEST_PATH = 'tests/integration/__manifest__.json'\n/**\n * Default `manifestIgnore` (src/manifest.ts re-exports it as DEFAULT_MANIFEST_IGNORE): the\n * release version plus what differs only by protocol era, so one lock serves both eras.\n */\nexport const DEFAULT_MANIFEST_IGNORE_PATHS: readonly string[] = [\n 'server.version',\n 'protocolVersion',\n 'listMeta',\n]\nexport const DEFAULT_OUT_DIR = 'reports'\n\nexport const DEFAULT_NORMALIZE: Required<NormalizeConfig> = {\n stripMeta: ['io.modelcontextprotocol/*'],\n dropKeys: ['resultType'],\n ttlMs: 'ignore',\n}\n\n/** Built-in defaults: the bottom layer of defaults → file → profile → CLI. */\nexport const defaultRunOptions: RunOptions = {\n servers: { [DEFAULT_SERVER_NAME]: { cmd: 'node', args: ['dist/index.js'], cwd: '.', env: {} } },\n defaultServer: DEFAULT_SERVER_NAME,\n globs: ['tests/integration/**/*.json'],\n manifest: DEFAULT_MANIFEST_PATH,\n manifestIgnore: [...DEFAULT_MANIFEST_IGNORE_PATHS],\n // outDir stays unset unless configured: the runner applies DEFAULT_OUT_DIR, and callers\n // (e.g. tests) treat a defined outDir as an explicit choice.\n checks: {},\n normalize: DEFAULT_NORMALIZE,\n timeoutMs: 15000,\n failFast: false,\n allowEmpty: false,\n reporters: ['console'],\n rootDir: '.',\n}\n\n/** @deprecated v1 name; use defaultRunOptions. */\nexport const defaultRunCasesOptions = defaultRunOptions\n","/**\n * Config loading (v2).\n *\n * Sources, lowest to highest precedence: built-in defaults → config file → profile → CLI.\n * Config file: vibrissa.json / vibrissa.jsonc (JSONC: comments + trailing commas) or\n * package.json#vibrissa. `server` (singular, v1) is sugar for `servers.default`.\n * `${ENV_VAR}` (and `${ENV_VAR:-fallback}`) are interpolated in every string of the file;\n * `$${...}` escapes a literal `${...}`.\n */\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { splitCommandLine } from './cli/args.js'\nimport { DEFAULT_NORMALIZE, DEFAULT_SERVER_NAME, defaultRunOptions } from './defaults.js'\nimport type {\n NormalizeConfig,\n ProtocolMode,\n RunOptions,\n ServerConfig,\n ShardSpec,\n Step,\n SuiteHooks,\n} from './types.js'\nimport { isHttpServerConfig, isStdioServerConfig } from './types.js'\n\n/** The on-disk config shape. Every key is optional; v1 files are valid. */\nexport interface ConfigFile {\n $schema?: string\n /** v1 sugar for `servers.default`. */\n server?: ServerConfig\n servers?: Record<string, ServerConfig>\n defaultServer?: string\n globs?: string[] | string\n manifest?: string\n normalize?: NormalizeConfig\n timeoutMs?: number\n budgetMs?: number\n failFast?: boolean\n allowEmpty?: boolean\n reporters?: string[] | string\n tags?: string[]\n excludeTags?: string[]\n grep?: string\n repeat?: number\n shard?: ShardSpec | string\n concurrency?: number\n update?: boolean\n trace?: boolean\n check?: boolean\n baseline?: string\n hooks?: SuiteHooks\n checks?: ChecksOptions\n manifestIgnore?: string[] | string\n outDir?: string\n profiles?: Record<string, ConfigFile>\n}\n\n/** `checks` config: skipped check ids and per-check severity overrides. */\nexport type ChecksOptions = NonNullable<RunOptions['checks']>\n\n/** Programmatic / CLI overrides: the top layer. */\nexport interface ConfigOverrides\n extends Partial<Omit<RunOptions, 'servers' | 'rootDir' | 'normalize' | 'defaultServer'>> {\n servers?: Record<string, ServerConfig>\n defaultServer?: string\n normalize?: NormalizeConfig\n /**\n * CLI `--server`: a name from `servers` (selects it), an http(s) URL, or a command line\n * (`\"node dist/index.js\"`) replacing the selected server's command.\n */\n server?: string\n /** CLI `--server-cwd` (absolute) for the selected stdio server. */\n serverCwd?: string\n /** CLI `--env KEY=VALUE`: merged into every stdio server's env. */\n env?: Record<string, string>\n /** CLI `--protocol`: applied to every server. */\n protocol?: ProtocolMode\n}\n\nexport interface ResolveOptionsInput {\n /** Explicit config file (absolute or relative to cwd). */\n configPath?: string\n /** Name under `profiles` to merge over the base config. */\n profile?: string\n overrides?: ConfigOverrides\n /** Environment for `${VAR}` interpolation. Default `process.env`. */\n env?: Record<string, string | undefined>\n}\n\nexport interface ResolvedConfig {\n options: RunOptions\n /** Non-fatal problems (unknown keys, unset env vars). Print them; do not ignore them. */\n warnings: string[]\n configPath?: string\n profile?: string\n}\n\nexport interface LoadedConfig {\n config: ConfigFile\n rootDir: string\n configPath?: string\n}\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ConfigError'\n }\n}\n\n// ---------------------------------------------------------------------------\n// JSONC\n// ---------------------------------------------------------------------------\n\nexport function stripJsonComments(input: string): string {\n let result = ''\n let inString = false\n let stringQuote: string | null = null\n let escaped = false\n let inBlockComment = false\n let inLineComment = false\n\n for (let i = 0; i < input.length; i++) {\n const char = input[i]\n const next = i + 1 < input.length ? input[i + 1] : ''\n\n if (inLineComment) {\n if (char === '\\n') {\n inLineComment = false\n result += char\n }\n continue\n }\n\n if (inBlockComment) {\n if (char === '*' && next === '/') {\n inBlockComment = false\n i++\n }\n continue\n }\n\n if (!inString && char === '/' && next === '*') {\n inBlockComment = true\n i++\n continue\n }\n if (!inString && char === '/' && next === '/') {\n inLineComment = true\n i++\n continue\n }\n\n if (inString) {\n result += char\n if (!escaped && char === stringQuote) {\n inString = false\n stringQuote = null\n }\n escaped = !escaped && char === '\\\\'\n continue\n }\n\n if (char === '\"' || char === \"'\" || char === '`') {\n inString = true\n stringQuote = char\n result += char\n escaped = false\n continue\n }\n\n result += char\n }\n\n return result\n}\n\n/** Remove trailing commas before `}` / `]` (outside strings). Run after stripJsonComments. */\nexport function stripTrailingCommas(input: string): string {\n let result = ''\n let inString = false\n let escaped = false\n for (let i = 0; i < input.length; i++) {\n const char = input[i]\n if (inString) {\n result += char\n if (!escaped && char === '\"') inString = false\n escaped = !escaped && char === '\\\\'\n continue\n }\n if (char === '\"') {\n inString = true\n escaped = false\n result += char\n continue\n }\n if (char === ',') {\n let j = i + 1\n while (j < input.length && /\\s/.test(input[j])) j++\n if (input[j] === '}' || input[j] === ']') continue\n }\n result += char\n }\n return result\n}\n\nexport function parseJsonc(raw: string, where: string): unknown {\n try {\n return JSON.parse(stripTrailingCommas(stripJsonComments(raw)))\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err)\n throw new ConfigError(\n `Invalid JSON at ${where}: ${reason}. Fix the syntax (comments and trailing commas are allowed).`,\n )\n }\n}\n\n// ---------------------------------------------------------------------------\n// File discovery (v1-compatible API)\n// ---------------------------------------------------------------------------\n\nexport function loadConfigObjectFromPath(configPath: string): ConfigFile {\n const raw = fs.readFileSync(configPath, 'utf8')\n const json = parseJsonc(raw, configPath)\n if (path.basename(configPath) === 'package.json') {\n const section = (json as { vibrissa?: unknown })?.vibrissa\n return (isPlainObject(section) ? section : {}) as ConfigFile\n }\n if (!isPlainObject(json)) {\n throw new ConfigError(\n `Invalid config at ${configPath}: expected a JSON object, got ${describe(json)}.`,\n )\n }\n return json as ConfigFile\n}\n\nexport function loadConfigFile(cwd: string, explicitPath?: string): LoadedConfig | undefined {\n if (explicitPath) {\n const abs = path.isAbsolute(explicitPath) ? explicitPath : path.join(cwd, explicitPath)\n if (!fs.existsSync(abs)) {\n throw new ConfigError(\n `Config not found: ${abs}. Check --config, or run \"vib init\" to create vibrissa.json.`,\n )\n }\n return { config: loadConfigObjectFromPath(abs), rootDir: path.dirname(abs), configPath: abs }\n }\n\n for (const name of ['vibrissa.json', 'vibrissa.jsonc']) {\n const file = path.join(cwd, name)\n if (fs.existsSync(file)) {\n return {\n config: loadConfigObjectFromPath(file),\n rootDir: path.dirname(file),\n configPath: file,\n }\n }\n }\n\n const pkgPath = path.join(cwd, 'package.json')\n if (fs.existsSync(pkgPath)) {\n const pkg = parseJsonc(fs.readFileSync(pkgPath, 'utf8'), pkgPath) as { vibrissa?: unknown }\n if (isPlainObject(pkg?.vibrissa)) {\n return {\n config: pkg.vibrissa as ConfigFile,\n rootDir: path.dirname(pkgPath),\n configPath: pkgPath,\n }\n }\n }\n return undefined\n}\n\n// ---------------------------------------------------------------------------\n// ${ENV} interpolation\n// ---------------------------------------------------------------------------\n\nconst ENV_PATTERN = /\\$(\\$?)\\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\\}/g\n\n/** Interpolate `${VAR}` / `${VAR:-fallback}` in every string (keys untouched). */\nexport function interpolateEnv<T>(\n value: T,\n env: Record<string, string | undefined> = process.env,\n warnings: string[] = [],\n at = '',\n): T {\n if (typeof value === 'string') {\n return value.replace(ENV_PATTERN, (match, escaped: string, name: string, fallback?: string) => {\n if (escaped) return match.slice(1)\n const resolved = env[name]\n if (resolved !== undefined && resolved !== '') return resolved\n if (fallback !== undefined) return fallback\n warnings.push(\n `Unset environment variable at ${at || '<root>'}: \\${${name}} is not set (using \"\"). Export it, or write \\${${name}:-default}.`,\n )\n return ''\n }) as T\n }\n if (Array.isArray(value)) {\n return value.map((item, i) => interpolateEnv(item, env, warnings, `${at}[${i}]`)) as T\n }\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {}\n for (const [key, item] of Object.entries(value)) {\n out[key] = interpolateEnv(item, env, warnings, at ? `${at}.${key}` : key)\n }\n return out as T\n }\n return value\n}\n\n// ---------------------------------------------------------------------------\n// Validation helpers\n// ---------------------------------------------------------------------------\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction describe(value: unknown): string {\n if (value === undefined) return 'nothing'\n if (Array.isArray(value)) return 'an array'\n if (value === null) return 'null'\n if (typeof value === 'object') return 'an object'\n return JSON.stringify(value)\n}\n\n/** Closest known key within edit distance 2 (case-insensitive), for did-you-mean hints. */\nfunction suggestKey(key: string, known: Iterable<string>): string | undefined {\n let best: string | undefined\n let bestScore = Number.POSITIVE_INFINITY\n const lower = key.toLowerCase()\n for (const candidate of known) {\n const score = editDistance(lower, candidate.toLowerCase())\n if (score < bestScore) {\n bestScore = score\n best = candidate\n }\n }\n return bestScore <= 2 ? best : undefined\n}\n\nfunction editDistance(a: string, b: string): number {\n const row = Array.from({ length: b.length + 1 }, (_, i) => i)\n for (let i = 1; i <= a.length; i++) {\n let prev = row[0]\n row[0] = i\n for (let j = 1; j <= b.length; j++) {\n const tmp = row[j]\n row[j] = Math.min(row[j] + 1, row[j - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1))\n prev = tmp\n }\n }\n return row[b.length]\n}\n\nclass Validator {\n /** Every problem found so far; loadConfig throws them together (all at once, not just the first). */\n readonly errors: string[] = []\n\n constructor(\n readonly source: string,\n readonly warnings: string[],\n ) {}\n\n /** Run one validation; a ConfigError is recorded instead of aborting the whole file. */\n attempt<T>(fn: () => T): T | undefined {\n try {\n return fn()\n } catch (err) {\n if (!(err instanceof ConfigError)) throw err\n this.errors.push(err.message)\n return undefined\n }\n }\n\n /** An unknown key is an error (it would silently fall back to a default). */\n unknownKey(\n at: string,\n key: string,\n known: Iterable<string>,\n docs = 'schema/vibrissa.schema.json',\n ): void {\n const near = suggestKey(key, known)\n this.errors.push(\n `Unknown config key at ${at ? `${at}.` : ''}${key} (${this.source}):${near ? ` did you mean \"${near}\"?` : ''} Check spelling against ${docs}.`,\n )\n }\n\n /** Throw every recorded problem as one ConfigError. */\n throwIfErrors(): void {\n if (this.errors.length === 0) return\n if (this.errors.length === 1) throw new ConfigError(this.errors[0])\n throw new ConfigError(\n `Invalid config (${this.source}): ${this.errors.length} problems:\\n${this.errors.map((e) => ` - ${e}`).join('\\n')}`,\n )\n }\n\n fail(\n at: string,\n expected: string,\n got: unknown,\n hint = 'See schema/vibrissa.schema.json.',\n ): never {\n throw new ConfigError(\n `Invalid config at ${at} (${this.source}): expected ${expected}, got ${describe(got)}. ${hint}`,\n )\n }\n\n string(value: unknown, at: string): string {\n if (typeof value !== 'string') this.fail(at, 'a string', value)\n return value\n }\n\n boolean(value: unknown, at: string): boolean {\n if (typeof value !== 'boolean') this.fail(at, 'true or false', value)\n return value\n }\n\n number(value: unknown, at: string, { min = 0, integer = false } = {}): number {\n if (\n typeof value !== 'number' ||\n !Number.isFinite(value) ||\n value < min ||\n (integer && !Number.isInteger(value))\n ) {\n this.fail(at, `${integer ? 'an integer' : 'a number'} >= ${min}`, value)\n }\n return value\n }\n\n strings(value: unknown, at: string, { allowSingle = false } = {}): string[] {\n if (allowSingle && typeof value === 'string') return [value]\n if (!Array.isArray(value) || value.some((v) => typeof v !== 'string')) {\n this.fail(at, 'an array of strings', value)\n }\n return value as string[]\n }\n\n stringRecord(value: unknown, at: string): Record<string, string> {\n if (!isPlainObject(value)) this.fail(at, 'an object of string values', value)\n const out: Record<string, string> = {}\n for (const [key, item] of Object.entries(value)) {\n if (typeof item === 'string') out[key] = item\n else if (typeof item === 'number' || typeof item === 'boolean') {\n this.warnings.push(\n `Non-string value at ${at}.${key} (${this.source}): converted ${item} to \"${item}\". Quote it.`,\n )\n out[key] = String(item)\n } else this.fail(`${at}.${key}`, 'a string', item)\n }\n return out\n }\n\n protocol(value: unknown, at: string): ProtocolMode {\n return parseProtocolMode(value, (got) =>\n this.fail(\n at,\n '\"auto\", \"legacy\", \"modern\", or { \"pin\": \"<revision>\" }',\n got,\n 'Use \"auto\" unless you need to force an era.',\n ),\n )\n }\n\n server(value: unknown, at: string): ServerConfig {\n if (!isPlainObject(value))\n this.fail(at, 'a server object ({ \"cmd\": ... } or { \"url\": ... })', value)\n const hasCmd = value.cmd !== undefined\n const hasUrl = value.url !== undefined\n if (hasCmd === hasUrl) {\n this.fail(\n at,\n 'exactly one of \"cmd\" (stdio) or \"url\" (Streamable HTTP)',\n value,\n 'Example: { \"cmd\": \"node\", \"args\": [\"dist/index.js\"] }.',\n )\n }\n const common: Record<string, unknown> = {}\n if (value.protocol !== undefined)\n common.protocol = this.protocol(value.protocol, `${at}.protocol`)\n if (value.spawnTimeoutMs !== undefined) {\n common.spawnTimeoutMs = this.number(value.spawnTimeoutMs, `${at}.spawnTimeoutMs`)\n }\n const known = new Set([\n 'cmd',\n 'args',\n 'cwd',\n 'env',\n 'url',\n 'headers',\n 'protocol',\n 'spawnTimeoutMs',\n ])\n for (const key of Object.keys(value)) {\n if (!known.has(key)) this.unknownKey(at, key, known)\n }\n if (hasUrl) {\n return {\n url: this.string(value.url, `${at}.url`),\n ...(value.headers !== undefined\n ? { headers: this.stringRecord(value.headers, `${at}.headers`) }\n : {}),\n ...common,\n } as ServerConfig\n }\n return {\n cmd: this.string(value.cmd, `${at}.cmd`),\n ...(value.args !== undefined ? { args: this.strings(value.args, `${at}.args`) } : {}),\n ...(value.cwd !== undefined ? { cwd: this.string(value.cwd, `${at}.cwd`) } : {}),\n ...(value.env !== undefined ? { env: this.stringRecord(value.env, `${at}.env`) } : {}),\n ...common,\n } as ServerConfig\n }\n\n /** Partial server entry for profiles (may omit cmd/url to patch fields). */\n serverPatch(value: unknown, at: string): Partial<ServerConfig> {\n if (isPlainObject(value) && value.cmd === undefined && value.url === undefined) {\n const known = ['args', 'cwd', 'env', 'headers', 'protocol', 'spawnTimeoutMs', 'cmd', 'url']\n for (const key of Object.keys(value)) {\n if (!known.includes(key)) this.unknownKey(at, key, known)\n }\n const out: Record<string, unknown> = {}\n if (value.args !== undefined) out.args = this.strings(value.args, `${at}.args`)\n if (value.cwd !== undefined) out.cwd = this.string(value.cwd, `${at}.cwd`)\n if (value.env !== undefined) out.env = this.stringRecord(value.env, `${at}.env`)\n if (value.headers !== undefined)\n out.headers = this.stringRecord(value.headers, `${at}.headers`)\n if (value.protocol !== undefined)\n out.protocol = this.protocol(value.protocol, `${at}.protocol`)\n if (value.spawnTimeoutMs !== undefined)\n out.spawnTimeoutMs = this.number(value.spawnTimeoutMs, `${at}.spawnTimeoutMs`)\n return out as Partial<ServerConfig>\n }\n return this.server(value, at)\n }\n\n shard(value: unknown, at: string): ShardSpec {\n const parsed = parseShard(value)\n if (!parsed)\n this.fail(at, '\"<index>/<total>\" (e.g. \"1/4\") or { \"index\": 1, \"total\": 4 }', value)\n return parsed\n }\n\n normalize(value: unknown, at: string): NormalizeConfig {\n if (!isPlainObject(value)) this.fail(at, 'an object ({ stripMeta, dropKeys, ttlMs })', value)\n const out: NormalizeConfig = {}\n if (value.stripMeta !== undefined)\n out.stripMeta = this.strings(value.stripMeta, `${at}.stripMeta`)\n if (value.dropKeys !== undefined) out.dropKeys = this.strings(value.dropKeys, `${at}.dropKeys`)\n if (value.ttlMs !== undefined) {\n if (value.ttlMs !== 'keep' && value.ttlMs !== 'ignore')\n this.fail(`${at}.ttlMs`, '\"keep\" or \"ignore\"', value.ttlMs)\n out.ttlMs = value.ttlMs\n }\n return out\n }\n\n hooks(value: unknown, at: string): SuiteHooks {\n if (!isPlainObject(value)) this.fail(at, 'an object ({ setup: [...], teardown: [...] })', value)\n const out: SuiteHooks = {}\n for (const key of ['setup', 'teardown'] as const) {\n if (value[key] === undefined) continue\n const steps = value[key]\n if (!Array.isArray(steps) || steps.some((s) => !isPlainObject(s)))\n this.fail(`${at}.${key}`, 'an array of step objects', steps)\n out[key] = steps as Step[]\n }\n return out\n }\n\n checks(value: unknown, at: string): ChecksOptions {\n if (!isPlainObject(value)) {\n this.fail(\n at,\n 'an object ({ allow: [...], severity: { \"<check id>\": \"failed\" | \"warned\" } })',\n value,\n )\n }\n const out: ChecksOptions = {}\n for (const key of Object.keys(value)) {\n if (key !== 'allow' && key !== 'severity') this.unknownKey(at, key, ['allow', 'severity'])\n }\n if (value.allow !== undefined)\n out.allow = this.strings(value.allow, `${at}.allow`, { allowSingle: true })\n if (value.severity !== undefined) {\n if (!isPlainObject(value.severity))\n this.fail(`${at}.severity`, 'an object of check id → \"failed\" | \"warned\"', value.severity)\n const severity: Record<string, 'failed' | 'warned'> = {}\n for (const [id, level] of Object.entries(value.severity)) {\n if (level !== 'failed' && level !== 'warned')\n this.fail(`${at}.severity.${id}`, '\"failed\" or \"warned\"', level)\n severity[id] = level\n }\n out.severity = severity\n }\n return out\n }\n}\n\n/** Merge checks layers: `allow` lists accumulate (deduped), `severity` merges by check id. */\nfunction mergeChecks(layers: Array<ChecksOptions | undefined>): ChecksOptions {\n const allow: string[] = []\n const severity: Record<string, 'failed' | 'warned'> = {}\n let hasAllow = false\n let hasSeverity = false\n for (const layer of layers) {\n if (!layer) continue\n if (layer.allow) {\n hasAllow = true\n for (const id of layer.allow) if (!allow.includes(id)) allow.push(id)\n }\n if (layer.severity) {\n hasSeverity = true\n Object.assign(severity, layer.severity)\n }\n }\n return { ...(hasAllow ? { allow } : {}), ...(hasSeverity ? { severity } : {}) }\n}\n\n/** Parse \"auto\" | \"legacy\" | \"modern\" | \"<YYYY-MM-DD>\" | { pin }. */\nexport function parseProtocolMode(value: unknown, onError?: (got: unknown) => never): ProtocolMode {\n if (value === 'auto' || value === 'legacy' || value === 'modern') return value\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return { pin: value }\n if (isPlainObject(value) && typeof value.pin === 'string' && Object.keys(value).length === 1) {\n return { pin: value.pin }\n }\n if (onError) return onError(value)\n throw new ConfigError(\n `Invalid protocol: expected \"auto\", \"legacy\", \"modern\", or a revision like \"2026-07-28\", got ${describe(value)}.`,\n )\n}\n\n/** Parse \"1/4\" or { index, total } (1-based). Undefined when invalid. */\nexport function parseShard(value: unknown): ShardSpec | undefined {\n let index: unknown\n let total: unknown\n if (typeof value === 'string') {\n const match = /^(\\d+)\\/(\\d+)$/.exec(value.trim())\n if (!match) return undefined\n index = Number(match[1])\n total = Number(match[2])\n } else if (isPlainObject(value)) {\n index = value.index\n total = value.total\n } else return undefined\n if (\n typeof index !== 'number' ||\n typeof total !== 'number' ||\n !Number.isInteger(index) ||\n !Number.isInteger(total) ||\n total < 1 ||\n index < 1 ||\n index > total\n ) {\n return undefined\n }\n return { index, total }\n}\n\n// ---------------------------------------------------------------------------\n// Layers\n// ---------------------------------------------------------------------------\n\ninterface Layer extends Partial<Omit<RunOptions, 'servers' | 'rootDir'>> {\n servers?: Record<string, Partial<ServerConfig>>\n}\n\nconst SCALAR_KEYS = new Set([\n 'manifest',\n 'manifestIgnore',\n 'requireManifest',\n 'outDir',\n 'timeoutMs',\n 'budgetMs',\n 'failFast',\n 'allowEmpty',\n 'grep',\n 'repeat',\n 'concurrency',\n 'update',\n 'trace',\n 'check',\n 'baseline',\n])\n\nconst IGNORED_KEYS = new Set(['$schema', 'display', 'profiles'])\n\n/** Every top-level config key (for did-you-mean on unknown keys). */\nexport const CONFIG_KEYS: readonly string[] = [\n '$schema',\n 'server',\n 'servers',\n 'defaultServer',\n 'globs',\n 'manifest',\n 'manifestIgnore',\n 'requireManifest',\n 'outDir',\n 'normalize',\n 'timeoutMs',\n 'budgetMs',\n 'failFast',\n 'allowEmpty',\n 'reporters',\n 'tags',\n 'excludeTags',\n 'grep',\n 'repeat',\n 'shard',\n 'concurrency',\n 'update',\n 'trace',\n 'check',\n 'checks',\n 'baseline',\n 'hooks',\n 'profiles',\n]\n\n/** Validate a file/profile object into a Layer. `patch` allows partial server entries (profiles). */\nfunction toLayer(\n raw: Record<string, unknown>,\n v: Validator,\n prefix: string,\n patch: boolean,\n): Layer {\n const at = (key: string) => (prefix ? `${prefix}.${key}` : key)\n const layer: Layer = {}\n for (const [key, value] of Object.entries(raw)) {\n if (value === undefined || IGNORED_KEYS.has(key)) continue\n v.attempt(() => assignKey(layer, key, value, at, v, prefix))\n }\n\n const servers: Record<string, Partial<ServerConfig>> = {}\n if (raw.server !== undefined) {\n const entry = v.attempt(() =>\n patch ? v.serverPatch(raw.server, at('server')) : v.server(raw.server, at('server')),\n )\n if (entry) servers[DEFAULT_SERVER_NAME] = entry\n }\n if (raw.servers !== undefined) {\n if (!isPlainObject(raw.servers)) {\n v.attempt(() => v.fail(at('servers'), 'an object of named servers', raw.servers))\n } else {\n for (const [name, entry] of Object.entries(raw.servers)) {\n if (raw.server !== undefined && name === DEFAULT_SERVER_NAME) {\n v.warnings.push(\n `Both server and servers.default are set (${v.source}): servers.default wins.`,\n )\n }\n const parsed = v.attempt(() =>\n patch\n ? v.serverPatch(entry, at(`servers.${name}`))\n : v.server(entry, at(`servers.${name}`)),\n )\n if (parsed) servers[name] = parsed\n }\n }\n }\n if (Object.keys(servers).length > 0) layer.servers = servers\n return layer\n}\n\nfunction assignKey(\n layer: Layer,\n key: string,\n value: unknown,\n at: (key: string) => string,\n v: Validator,\n prefix: string,\n): void {\n switch (key) {\n case 'server':\n case 'servers':\n break\n case 'defaultServer':\n layer.defaultServer = v.string(value, at(key))\n break\n case 'globs':\n layer.globs = v.strings(value, at(key), { allowSingle: true })\n break\n case 'reporters':\n layer.reporters = v.strings(value, at(key), { allowSingle: true })\n break\n case 'tags':\n case 'excludeTags':\n layer[key] = v.strings(value, at(key), { allowSingle: true })\n break\n case 'manifest':\n case 'grep':\n case 'baseline':\n layer[key] = v.string(value, at(key))\n break\n case 'timeoutMs':\n case 'budgetMs':\n layer[key] = v.number(value, at(key))\n break\n case 'repeat':\n case 'concurrency':\n layer[key] = v.number(value, at(key), { min: 1, integer: true })\n break\n case 'failFast':\n case 'allowEmpty':\n case 'update':\n case 'trace':\n case 'check':\n layer[key] = v.boolean(value, at(key))\n break\n case 'shard':\n layer.shard = v.shard(value, at(key))\n break\n case 'normalize':\n layer.normalize = v.normalize(value, at(key))\n break\n case 'hooks':\n layer.hooks = v.hooks(value, at(key))\n break\n case 'checks':\n layer.checks = v.checks(value, at(key))\n break\n case 'manifestIgnore':\n layer.manifestIgnore = v.strings(value, at(key), { allowSingle: true })\n break\n case 'outDir':\n layer.outDir = v.string(value, at(key))\n break\n case 'requireManifest':\n layer.requireManifest = v.boolean(value, at(key))\n break\n default:\n v.unknownKey(prefix, key, CONFIG_KEYS)\n }\n}\n\nfunction mergeServerEntry(\n base: ServerConfig | undefined,\n patch: Partial<ServerConfig>,\n): ServerConfig {\n const replaces =\n (patch as { cmd?: unknown }).cmd !== undefined || (patch as { url?: unknown }).url !== undefined\n if (replaces || !base) return patch as ServerConfig\n // Patch fields only apply to the matching transport (no env on HTTP, no headers on stdio).\n const ignored = isHttpServerConfig(base) ? ['args', 'cwd', 'env'] : ['headers']\n const merged = Object.fromEntries(\n Object.entries({ ...base, ...patch }).filter(([key]) => !ignored.includes(key)),\n )\n return merged as unknown as ServerConfig\n}\n\nfunction inferDefaultServer(servers: Record<string, ServerConfig>): string | undefined {\n const names = Object.keys(servers)\n if (names.includes(DEFAULT_SERVER_NAME)) return DEFAULT_SERVER_NAME\n if (names.length === 1) return names[0]\n return undefined\n}\n\nfunction applyServerOverride(\n servers: Record<string, ServerConfig>,\n selected: string,\n override: string,\n): { servers: Record<string, ServerConfig>; selected: string } {\n if (Object.hasOwn(servers, override)) return { servers, selected: override }\n const existing = servers[selected]\n const common = {\n ...(existing?.protocol !== undefined ? { protocol: existing.protocol } : {}),\n ...(existing?.spawnTimeoutMs !== undefined ? { spawnTimeoutMs: existing.spawnTimeoutMs } : {}),\n }\n if (/^https?:\\/\\//i.test(override.trim())) {\n return { servers: { ...servers, [selected]: { url: override.trim(), ...common } }, selected }\n }\n const { cmd, args } = splitCommandLine(override)\n const next: ServerConfig =\n existing && isStdioServerConfig(existing)\n ? { ...existing, cmd, args }\n : { cmd, args, ...common }\n return { servers: { ...servers, [selected]: next }, selected }\n}\n\n// ---------------------------------------------------------------------------\n// Resolution\n// ---------------------------------------------------------------------------\n\n/** Load + merge config. Prefer this in CLIs so `warnings` can be printed. */\nexport function loadConfig(cwd: string, input: ResolveOptionsInput = {}): ResolvedConfig {\n const env = input.env ?? process.env\n const warnings: string[] = []\n const loaded = loadConfigFile(cwd, input.configPath)\n const source = loaded?.configPath ? path.basename(loaded.configPath) : 'config'\n const { profiles: rawProfiles, ...base } = (loaded?.config ?? {}) as Record<string, unknown>\n const file = interpolateEnv(base, env, warnings)\n const validator = new Validator(source, warnings)\n const fileLayer = toLayer(file, validator, '', false)\n\n let profileLayer: Layer = {}\n if (input.profile !== undefined) {\n const profiles = isPlainObject(rawProfiles) ? rawProfiles : {}\n const profile = isPlainObject(profiles[input.profile])\n ? interpolateEnv(\n profiles[input.profile] as Record<string, unknown>,\n env,\n warnings,\n `profiles.${input.profile}`,\n )\n : undefined\n if (!isPlainObject(profile)) {\n const have = Object.keys(profiles)\n throw new ConfigError(\n `Unknown profile at --profile: \"${input.profile}\" is not defined in profiles (${have.length ? `have: ${have.join(', ')}` : 'none defined'}). Add it under \"profiles\" in ${source}.`,\n )\n }\n profileLayer = toLayer(profile, validator, `profiles.${input.profile}`, true)\n }\n\n // Servers: the file replaces the built-in default; profiles patch entries by name.\n let servers: Record<string, ServerConfig> = fileLayer.servers\n ? (fileLayer.servers as Record<string, ServerConfig>)\n : { ...defaultRunOptions.servers }\n\n // Every profile is validated (typos in a profile you are not using today still fail), and\n // a profile may only patch servers that exist (or define them fully with cmd / url).\n if (rawProfiles !== undefined && !isPlainObject(rawProfiles)) {\n validator.attempt(() => validator.fail('profiles', 'an object of named profiles', rawProfiles))\n }\n for (const [name, raw] of Object.entries(isPlainObject(rawProfiles) ? rawProfiles : {})) {\n let layer: Layer\n if (name === input.profile) layer = profileLayer\n else if (!isPlainObject(raw)) {\n validator.attempt(() => validator.fail(`profiles.${name}`, 'a profile object', raw))\n continue\n } else layer = toLayer(interpolateEnv(raw, env, []), validator, `profiles.${name}`, true)\n for (const [server, entry] of Object.entries(layer.servers ?? {})) {\n const defines =\n (entry as { cmd?: unknown }).cmd !== undefined ||\n (entry as { url?: unknown }).url !== undefined\n if (!defines && !Object.hasOwn(servers, server)) {\n validator.errors.push(\n `Invalid config at profiles.${name}.servers.${server} (${source}): profile ${name} patches unknown server '${server}'; servers are: ${Object.keys(servers).join(', ') || 'none'}. Fix the name, or give it \"cmd\" / \"url\" to define a new server.`,\n )\n }\n }\n }\n validator.throwIfErrors()\n\n for (const [name, entry] of Object.entries(profileLayer.servers ?? {})) {\n servers = { ...servers, [name]: mergeServerEntry(servers[name], entry) }\n }\n const overrides = input.overrides ?? {}\n if (overrides.servers) servers = { ...servers, ...overrides.servers }\n\n let selected =\n overrides.defaultServer ??\n profileLayer.defaultServer ??\n fileLayer.defaultServer ??\n inferDefaultServer(servers)\n\n if (overrides.server !== undefined && overrides.server.trim() !== '') {\n const applied = applyServerOverride(servers, selected ?? DEFAULT_SERVER_NAME, overrides.server)\n servers = applied.servers\n selected = applied.selected\n }\n\n if (selected === undefined) {\n throw new ConfigError(\n `Missing defaultServer at ${source}: servers has ${Object.keys(servers).join(', ')} and none is named \"default\". Set \"defaultServer\", or pass --server <name>.`,\n )\n }\n if (!Object.hasOwn(servers, selected)) {\n throw new ConfigError(\n `Unknown server at defaultServer: \"${selected}\" is not in servers (have: ${Object.keys(servers).join(', ') || 'none'}). Fix defaultServer in ${source}, or pass --server <name|\"cmd args\">.`,\n )\n }\n\n if (overrides.serverCwd !== undefined) {\n const current = servers[selected]\n if (isStdioServerConfig(current))\n servers = { ...servers, [selected]: { ...current, cwd: overrides.serverCwd } }\n else warnings.push(`--server-cwd ignored: server \"${selected}\" is an HTTP server.`)\n }\n if (overrides.env !== undefined || overrides.protocol !== undefined) {\n const next: Record<string, ServerConfig> = {}\n for (const [name, entry] of Object.entries(servers)) {\n let updated: ServerConfig = entry\n if (overrides.env && isStdioServerConfig(entry)) {\n updated = { ...entry, env: { ...(entry.env ?? {}), ...overrides.env } }\n }\n if (overrides.protocol !== undefined) updated = { ...updated, protocol: overrides.protocol }\n next[name] = updated\n }\n servers = next\n }\n\n const scalars: Partial<RunOptions> = {}\n for (const layer of [fileLayer, profileLayer, overrides as Layer]) {\n for (const [key, value] of Object.entries(layer)) {\n if (value === undefined) continue\n if (\n SCALAR_KEYS.has(key) ||\n ['globs', 'reporters', 'tags', 'excludeTags', 'shard', 'hooks'].includes(key)\n ) {\n ;(scalars as Record<string, unknown>)[key] = value\n }\n }\n }\n\n const options: RunOptions = {\n ...defaultRunOptions,\n ...scalars,\n servers,\n defaultServer: selected,\n manifestIgnore: [...(scalars.manifestIgnore ?? defaultRunOptions.manifestIgnore ?? [])],\n checks: mergeChecks([fileLayer.checks, profileLayer.checks, overrides.checks]),\n normalize: {\n ...DEFAULT_NORMALIZE,\n ...(fileLayer.normalize ?? {}),\n ...(profileLayer.normalize ?? {}),\n ...(overrides.normalize ?? {}),\n },\n rootDir: loaded?.rootDir ?? path.resolve(cwd),\n }\n return { options, warnings, configPath: loaded?.configPath, profile: input.profile }\n}\n\n/**\n * Resolve RunOptions: defaults → file → profile → overrides.\n * The second argument may be a config path (v1 signature).\n */\nexport function resolveOptions(cwd: string, input: ResolveOptionsInput | string = {}): RunOptions {\n const normalized: ResolveOptionsInput = typeof input === 'string' ? { configPath: input } : input\n return loadConfig(cwd, normalized).options\n}\n","import path from 'node:path'\nimport { DEFAULT_MANIFEST_PATH } from './defaults.js'\nimport type { RunOptions, ServerConfig } from './types.js'\nimport { isStdioServerConfig } from './types.js'\n\nexport function resolveRootDir(options: Pick<RunOptions, 'rootDir'>): string {\n return options.rootDir ? path.resolve(options.rootDir) : process.cwd()\n}\n\n/** Resolve a path from the config (globs, manifest, reports) against rootDir. */\nexport function resolveFromRoot(options: Pick<RunOptions, 'rootDir'>, value: string): string {\n return path.isAbsolute(value) ? value : path.resolve(resolveRootDir(options), value)\n}\n\n/** Which server a case runs against: the case's `server`, else `defaultServer`. */\nexport function resolveServerName(\n options: Pick<RunOptions, 'servers' | 'defaultServer'>,\n name?: string,\n): string {\n const selected = name ?? options.defaultServer\n if (!Object.hasOwn(options.servers, selected)) {\n const have = Object.keys(options.servers)\n throw new Error(\n `Unknown server at ${name !== undefined ? 'case.server' : 'defaultServer'}: \"${selected}\" is not in servers (have: ${have.join(', ') || 'none'}). Add it to \"servers\" in vibrissa.json or fix the name.`,\n )\n }\n return selected\n}\n\n/**\n * The ServerConfig to start for `name` (default: defaultServer), with a stdio `cwd`\n * resolved against rootDir. HTTP servers are returned unchanged.\n */\nexport function resolveServerConfig(\n options: Pick<RunOptions, 'servers' | 'defaultServer' | 'rootDir'>,\n name?: string,\n): ServerConfig {\n const server = options.servers[resolveServerName(options, name)]\n if (!isStdioServerConfig(server)) return { ...server }\n const cwd = server.cwd ?? '.'\n return { ...server, cwd: path.isAbsolute(cwd) ? cwd : path.resolve(resolveRootDir(options), cwd) }\n}\n\n/** Every configured server, resolved (keyed by name). */\nexport function resolveAllServers(\n options: Pick<RunOptions, 'servers' | 'defaultServer' | 'rootDir'>,\n): Record<string, ServerConfig> {\n return Object.fromEntries(\n Object.keys(options.servers).map((name) => [name, resolveServerConfig(options, name)]),\n )\n}\n\nexport function resolveManifestPath(options: Pick<RunOptions, 'manifest' | 'rootDir'>): string {\n return resolveFromRoot(options, options.manifest ?? DEFAULT_MANIFEST_PATH)\n}\n","/**\n * Shared plumbing for lint rules and spec checks: allow-listing, severity\n * overrides, grouping findings into CheckOutcomes, sorting and summarizing.\n */\nimport type { CheckOutcome } from '../events.js'\n\nexport type Severity = 'failed' | 'warned'\n\nexport interface LintOptions {\n /**\n * Check ids to skip. Each entry is one of:\n * - an exact id: `desc/long-description`\n * - a prefix wildcard: `desc/*`\n * - an id scoped to one subject: `desc/sensitive-paths:ssh.list_keys`\n * (subject = tool / prompt name, resource URI, or `instructions`)\n */\n allow?: string[]\n /** Per-check severity override for findings, e.g. `{ \"desc/embedded-url\": \"failed\" }`. */\n severity?: Record<string, Severity>\n}\n\n/** Static metadata every rule / check carries. */\nexport interface RuleMeta {\n id: string\n title: string\n severity: Severity\n}\n\n/** One problem found by a rule. Findings with the same subject merge into one outcome. */\nexport interface Finding {\n /** Human label: `tool \"add\"`, `prompt \"helper\"`, `server instructions`. */\n subject?: string\n /** Allow-list key for `id:key` entries. */\n key?: string\n message: string\n /** Overrides the rule's default severity (e.g. era-dependent spec checks). */\n severity?: Severity\n /** A note that a check was skipped / not applicable. Always `warned`; never escalated. */\n informational?: boolean\n}\n\nconst MAX_MESSAGES = 6\n\nexport function isAllowed(allow: readonly string[] | undefined, id: string, key?: string): boolean {\n if (!allow?.length) return false\n for (const entry of allow) {\n const colon = entry.indexOf(':')\n const idPart = colon === -1 ? entry : entry.slice(0, colon)\n const keyPart = colon === -1 ? undefined : entry.slice(colon + 1)\n const idMatches =\n idPart === id ||\n idPart === '*' ||\n (idPart.endsWith('/*') && id.startsWith(idPart.slice(0, -1)))\n if (!idMatches) continue\n if (keyPart === undefined || keyPart === key) return true\n }\n return false\n}\n\nfunction effectiveSeverity(rule: RuleMeta, f: Finding, opts: LintOptions): Severity {\n if (f.informational) return 'warned'\n return opts.severity?.[rule.id] ?? f.severity ?? rule.severity\n}\n\n/**\n * Turn a rule's findings into outcomes: one `passed` outcome when there are none,\n * otherwise one outcome per subject (all of that subject's messages joined).\n * Returns [] when the whole rule is allow-listed.\n */\nexport function buildOutcomes(\n rule: RuleMeta,\n findings: readonly Finding[],\n opts: LintOptions = {},\n passDetail?: string,\n): CheckOutcome[] {\n if (isAllowed(opts.allow, rule.id)) return []\n const kept = findings.filter((f) => !isAllowed(opts.allow, rule.id, f.key))\n if (kept.length === 0) {\n const allowed = findings.length - kept.length\n const notes = [passDetail, allowed ? `${allowed} finding(s) allow-listed` : undefined].filter(\n Boolean,\n )\n return [\n {\n id: rule.id,\n title: rule.title,\n status: 'passed',\n ...(notes.length ? { detail: notes.join('; ') } : {}),\n },\n ]\n }\n const groups = new Map<string, Finding[]>()\n for (const f of kept) {\n const k = f.subject ?? ''\n const g = groups.get(k)\n if (g) g.push(f)\n else groups.set(k, [f])\n }\n const out: CheckOutcome[] = []\n for (const [subject, group] of groups) {\n const status = group.some((f) => effectiveSeverity(rule, f, opts) === 'failed')\n ? 'failed'\n : 'warned'\n const messages = [...new Set(group.map((f) => f.message))]\n const shown = messages.slice(0, MAX_MESSAGES)\n if (messages.length > shown.length) shown.push(`(+${messages.length - shown.length} more)`)\n const body = shown.join('; ')\n out.push({\n id: rule.id,\n title: rule.title,\n status,\n detail: subject ? `${subject}: ${body}` : body,\n })\n }\n return out\n}\n\nconst STATUS_RANK: Record<CheckOutcome['status'], number> = { failed: 0, warned: 1, passed: 2 }\n\n/** failed -> warned -> passed, then by id; stable for equal keys. Returns a new array. */\nexport function sortOutcomes(outcomes: readonly CheckOutcome[]): CheckOutcome[] {\n return [...outcomes].sort(\n (a, b) => STATUS_RANK[a.status] - STATUS_RANK[b.status] || a.id.localeCompare(b.id),\n )\n}\n\nexport function summarizeChecks(outcomes: readonly CheckOutcome[]): {\n failed: number\n warned: number\n passed: number\n} {\n const summary = { failed: 0, warned: 0, passed: 0 }\n for (const o of outcomes) summary[o.status]++\n return summary\n}\n","/**\n * Text helpers for the description rules: invisible-character scanning,\n * normalization for pattern matching, sentence splitting and snippet quoting.\n * Pure; no I/O.\n */\n\nexport type InvisibleKind = 'tag' | 'variation-selector' | 'bidi-override' | 'bidi' | 'zero-width'\n\nconst ZERO_WIDTH = new Set([\n 0x00ad, // soft hyphen\n 0x034f, // combining grapheme joiner\n 0x115f, // hangul choseong filler\n 0x1160, // hangul jungseong filler\n 0x17b4, // khmer vowel inherent aq\n 0x17b5, // khmer vowel inherent aa\n 0x180e, // mongolian vowel separator\n 0x200b, // zero width space\n 0x200c, // zero width non-joiner\n 0x200d, // zero width joiner\n 0x2060, // word joiner\n 0x2061, // function application\n 0x2062, // invisible times\n 0x2063, // invisible separator\n 0x2064, // invisible plus\n 0x3164, // hangul filler\n 0xfeff, // zero width no-break space / BOM\n 0xffa0, // halfwidth hangul filler\n])\n\nexport function invisibleKind(cp: number): InvisibleKind | undefined {\n if (cp >= 0xe0000 && cp <= 0xe007f) return 'tag'\n if ((cp >= 0xe0100 && cp <= 0xe01ef) || (cp >= 0xfe00 && cp <= 0xfe0d)) {\n return 'variation-selector'\n }\n if (cp === 0x202d || cp === 0x202e) return 'bidi-override'\n if (\n cp === 0x200e ||\n cp === 0x200f ||\n cp === 0x061c ||\n (cp >= 0x202a && cp <= 0x202c) ||\n (cp >= 0x2066 && cp <= 0x2069)\n ) {\n return 'bidi'\n }\n if (ZERO_WIDTH.has(cp)) return 'zero-width'\n return undefined\n}\n\nconst RTL_LETTER =\n /[\\p{Script=Hebrew}\\p{Script=Arabic}\\p{Script=Syriac}\\p{Script=Thaana}\\p{Script=Nko}]/u\nconst PICTOGRAPHIC = /^\\p{Extended_Pictographic}$/u\nconst NON_ASCII_LETTER = /^[\\p{L}\\p{M}]$/u\n\nfunction isNonAsciiLetter(ch: string | undefined): boolean {\n return ch !== undefined && (ch.codePointAt(0) ?? 0) > 0x7f && NON_ASCII_LETTER.test(ch)\n}\n\n/** Previous code point, skipping emoji modifiers and presentation selectors. */\nfunction prevSignificant(cps: string[], i: number): string | undefined {\n for (let j = i - 1; j >= 0; j--) {\n const cp = cps[j].codePointAt(0) ?? 0\n if (cp === 0xfe0f || cp === 0xfe0e || (cp >= 0x1f3fb && cp <= 0x1f3ff)) continue\n return cps[j]\n }\n return undefined\n}\n\n/** Legitimate uses: emoji ZWJ sequences, ZWJ/ZWNJ inside non-Latin words, bidi marks in RTL text. */\nfunction isExempt(\n kind: InvisibleKind,\n cp: number,\n cps: string[],\n i: number,\n rtl: boolean,\n): boolean {\n if (cp === 0x200d || cp === 0x200c) {\n const prev = prevSignificant(cps, i)\n const next = cps[i + 1]\n if (cp === 0x200d && prev && next && PICTOGRAPHIC.test(prev) && PICTOGRAPHIC.test(next)) {\n return true\n }\n return isNonAsciiLetter(cps[i - 1]) && isNonAsciiLetter(next)\n }\n return kind === 'bidi' && rtl\n}\n\nexport interface InvisibleHit {\n index: number\n codePoint: number\n kind: InvisibleKind\n}\n\nexport interface InvisibleScan {\n /** Suspicious invisible characters (legitimate uses already exempted). */\n hits: InvisibleHit[]\n /** ASCII text smuggled via Unicode tag characters (U+E0020..U+E007E), if any. */\n tagText: string\n}\n\nexport function scanInvisible(raw: string): InvisibleScan {\n const cps = Array.from(raw)\n const rtl = RTL_LETTER.test(raw)\n const hits: InvisibleHit[] = []\n let tagText = ''\n let offset = 0\n for (let i = 0; i < cps.length; i++) {\n const ch = cps[i]\n const cp = ch.codePointAt(0) ?? 0\n const kind = invisibleKind(cp)\n if (kind) {\n if (kind === 'tag' && cp >= 0xe0020 && cp <= 0xe007e) {\n tagText += String.fromCharCode(cp - 0xe0000)\n }\n if (!isExempt(kind, cp, cps, i, rtl)) hits.push({ index: offset, codePoint: cp, kind })\n }\n offset += ch.length\n }\n return { hits, tagText }\n}\n\nexport const TAG_TEXT_MARKER = '[invisible tag text]'\n\n/**\n * Normalize model-visible text before pattern matching: drop invisible\n * characters (so \"ig\\u200Bnore\" still reads \"ignore\"), NFKC-fold look-alike\n * forms (fullwidth letters etc.), and append any tag-smuggled ASCII so the\n * phrase rules can see it.\n */\nexport function normalizeForMatching(raw: string): string {\n let visible = ''\n for (const ch of raw) {\n if (!invisibleKind(ch.codePointAt(0) ?? 0)) visible += ch\n }\n const { tagText } = scanInvisible(raw)\n const out = visible.normalize('NFKC')\n return tagText ? `${out}\\n${TAG_TEXT_MARKER} ${tagText}` : out\n}\n\n/** Split on sentence punctuation followed by whitespace, and on newlines. Dotted names survive. */\nexport function splitSentences(text: string): string[] {\n return text\n .split(/(?<=[.!?])\\s+|\\n+/u)\n .map((s) => s.trim())\n .filter(Boolean)\n}\n\nexport function collapse(s: string): string {\n return s.replace(/\\s+/gu, ' ').trim()\n}\n\nexport function clip(s: string, max = 160): string {\n const c = collapse(s)\n return c.length > max ? `${c.slice(0, max - 3)}...` : c\n}\n\n/** A short window of `text` around a match, whitespace-collapsed. */\nexport function excerpt(text: string, index: number, length: number, radius = 32): string {\n const start = Math.max(0, index - radius)\n const end = Math.min(text.length, index + Math.min(length, 100) + radius)\n const body = collapse(text.slice(start, end))\n return `${start > 0 ? '...' : ''}${body}${end < text.length ? '...' : ''}`\n}\n\n/** JSON-quote for details (escapes quotes, backslashes, control chars). */\nexport function quote(s: string): string {\n return JSON.stringify(s)\n}\n\nexport function formatCodePoint(cp: number): string {\n return `U+${cp.toString(16).toUpperCase().padStart(4, '0')}`\n}\n","/**\n * Tool-description lint: a deterministic, offline smoke detector for tool\n * poisoning, shadowing and exfiltration hints in model-visible text, plus a few\n * quality checks. Pattern-based by design — it catches the well-known shapes of\n * these attacks, not every paraphrase. See docs/CHECKS.md for every rule.\n *\n * Adding a rule = one entry in DESCRIPTION_RULES. Adding a phrase to an existing\n * rule = one entry in its pattern table.\n */\nimport type { CheckOutcome } from '../events.js'\nimport {\n type Finding,\n type LintOptions,\n type RuleMeta,\n buildOutcomes,\n isAllowed,\n sortOutcomes,\n} from './outcomes.js'\nimport {\n clip,\n excerpt,\n formatCodePoint,\n normalizeForMatching,\n quote,\n scanInvisible,\n splitSentences,\n} from './text.js'\nimport type {\n PromptSummary,\n ResourceSummary,\n ResourceTemplateSummary,\n ToolSummary,\n} from './types.js'\n\nexport interface DescriptionLintOptions extends LintOptions {\n /** Also lint these descriptions (pattern rules only; quality rules are tool-only). */\n resources?: ResourceSummary[]\n resourceTemplates?: ResourceTemplateSummary[]\n prompts?: PromptSummary[]\n /** Server instructions from discover/initialize. */\n instructions?: string\n /** Tool names from other servers the same client loads, for cross-server shadowing. */\n knownToolNames?: string[]\n /** Threshold for `desc/long-description`. Default 2000. */\n maxDescriptionLength?: number\n}\n\n/** A model-visible string pulled out of the manifest. */\nexport interface TextSource {\n kind: 'tool' | 'resource' | 'resourceTemplate' | 'prompt' | 'instructions'\n /** `tool \"add\"`, `prompt \"summarize\"`, `server instructions`. */\n subject: string\n /** Allow-list key for `rule-id:key` entries. */\n key: string\n /** Location inside the subject, e.g. `inputSchema.properties.a.description`. */\n field: string\n raw: string\n /** normalizeForMatching(raw) */\n text: string\n toolName?: string\n}\n\ninterface Mention {\n name: string\n re: RegExp\n}\n\nexport interface LintContext {\n maxDescriptionLength: number\n mentions: Mention[]\n}\n\ntype TextResult = string | Omit<Finding, 'subject' | 'key'>\ntype TextCheck = (src: TextSource, ctx: LintContext) => TextResult[]\ntype ToolCheck = (tool: ToolSummary, ctx: LintContext) => string[]\ntype ToolsCheck = (tools: ToolSummary[], ctx: LintContext) => Finding[]\n\nexport interface DescriptionRule extends RuleMeta {\n /** Runs on every model-visible string (descriptions, titles, schema text, prompts, instructions). */\n text?: TextCheck\n /** Runs once per tool. */\n tool?: ToolCheck\n /** Runs once over the whole tool list. */\n tools?: ToolsCheck\n}\n\nexport interface Pattern {\n label: string\n re: RegExp\n /** Patterns sharing a group count as one signal in multi-signal rules. Default: label. */\n group?: string\n}\n\n// ---------------------------------------------------------------------------\n// Pattern tables. Regexes must NOT carry the `g` flag (they are reused).\n// ---------------------------------------------------------------------------\n\n/** Any one of these is a strong signal on its own. */\nexport const HIDDEN_INSTRUCTION_PATTERNS: Pattern[] = [\n {\n label: 'instruction tag',\n re: /<\\/?(?:important|system|instructions?|secret|hidden|admin|assistant|sys)\\b[^<>]{0,40}>/iu,\n },\n {\n label: 'chat-template token',\n re: /<\\|(?:im_start|im_end|system|user|assistant|endoftext|eot_id|start_header_id|end_header_id)\\|>|\\[\\/?INST\\]|<<\\/?SYS>>/iu,\n },\n {\n label: '\"ignore previous instructions\"',\n re: /\\b(?:ignore|disregard|forget)\\s+(?:all\\s+|any\\s+)?(?:of\\s+)?(?:the\\s+|your\\s+|my\\s+)?(?:previous|prior|above|earlier|preceding|former|system|safety|original)\\s+(?:instructions?|prompts?|rules|directives|guidelines|messages|context)\\b/iu,\n },\n {\n label: '\"ignore all instructions\"',\n re: /\\b(?:ignore|disregard|forget)\\s+(?:all|any)\\s+(?:of\\s+)?(?:the\\s+|your\\s+)?(?:instructions?|prompts?|directives|guidelines)\\b/iu,\n },\n {\n label: 'conceal from the user',\n re: /\\b(?:do\\s+not|don['’]?t|never|must\\s+not|should\\s+not)\\s+(?:tell|mention|inform|reveal|disclose)\\s+(?:this\\s+|that\\s+|it\\s+|anything\\s+)?(?:to\\s+)?(?:the\\s+)?users?\\b/iu,\n },\n {\n label: 'act without telling the user',\n re: /\\bwithout\\s+(?:telling|informing)\\s+(?:the\\s+)?users?\\b/iu,\n },\n {\n label: 'hide from the user',\n re: /\\b(?:keep|hide)\\s+(?:this|it|that)\\s+(?:secret\\s+|hidden\\s+)?from\\s+(?:the\\s+)?users?\\b|\\bthe\\s+user\\s+(?:must|should)\\s+(?:not|never)\\s+(?:know|see|find\\s+out|be\\s+told)\\b|\\b(?:could|might|would|will)\\s+(?:even\\s+)?upset\\s+the\\s+user\\b/iu,\n },\n]\n\n/** Weak signals: each is common in benign text, so the rule needs two different groups. */\nexport const IMPERATIVE_PATTERNS: Pattern[] = [\n {\n group: 'precondition',\n label: '\"before using this tool\"',\n re: /\\bbefore\\s+(?:using|calling|invoking|running|executing)\\s+(?:this|the)\\s+tool\\b/iu,\n },\n {\n group: 'precondition',\n label: '\"before calling,\"',\n re: /\\bbefore\\s+(?:using|calling|invoking)(?:\\s+it)?\\s*,/iu,\n },\n {\n group: 'precondition',\n label: '\"you must first/always\"',\n re: /\\byou\\s+must\\s+(?:first|always)\\b/iu,\n },\n { group: 'secrecy', label: '\"without asking\"', re: /\\bwithout\\s+asking\\b/iu },\n {\n group: 'secrecy',\n label: '\"do not mention this\"',\n re: /\\b(?:do\\s+not|don['’]?t|never)\\s+(?:mention|reveal|disclose|explain)\\s+(?:this|that|it)\\b/iu,\n },\n {\n group: 'secrecy',\n label: '\"be gentle/discreet\"',\n re: /\\bbe\\s+(?:very\\s+)?(?:gentle|subtle|discreet)\\b/iu,\n },\n {\n group: 'coercion',\n label: '\"otherwise the tool will not work\"',\n re: /\\botherwise\\s+(?:the|this)\\s+tool\\s+(?:will\\s+not|won['’]?t|cannot|can['’]?t|does\\s+not|doesn['’]?t|will\\s+fail)\\b/iu,\n },\n {\n group: 'coercion',\n label: '\"very important\"',\n re: /\\b(?:very|extremely|critically|vitally)\\s+important\\b/iu,\n },\n {\n group: 'payload',\n label: '\"pass its content as\"',\n re: /\\bpass\\s+(?:its|the|their|this|that|all)\\s+(?:full\\s+|entire\\s+|raw\\s+)?contents?\\s+(?:as|in|into|to)\\b/iu,\n },\n {\n group: 'payload',\n label: 'smuggle into an argument',\n re: /\\b(?:include|put|place|insert|embed|append|pass|send|copy)\\s+(?:it|them|its\\s+contents?|their\\s+contents?|the\\s+contents?)\\s+(?:in|into|as|to)\\s+(?:the\\s+)?[`'\"]?[\\w.-]+[`'\"]?\\s+(?:field|argument|parameter|param)\\b/iu,\n },\n {\n group: 'payload',\n label: 'read a local file',\n re: /\\b(?:read|cat|open|load)\\s+(?:the\\s+)?(?:file\\s+|contents?\\s+of\\s+)?[`'\"]?(?:~|\\$HOME|%USERPROFILE%|\\/etc\\/)/iu,\n },\n {\n group: 'role',\n label: 'role override',\n re: /\\byou\\s+are\\s+now\\b|\\bact\\s+as\\s+(?:an?\\s+)?(?:system|admin(?:istrator)?|root)\\b|\\bdeveloper\\s+mode\\b|\\bnew\\s+instructions\\s*:/iu,\n },\n]\n\n/** Hiding containers. Their content is also scanned by every other rule. */\nexport const HIDDEN_MARKUP_PATTERNS: Pattern[] = [\n { label: 'HTML comment', re: /<!--[\\s\\S]*?(?:-->|$)/u },\n {\n label: 'markdown reference-link comment',\n re: /^[ \\t]*\\[[^\\]\\n]*\\]:\\s*(?:#|<>)\\s*(?:\\([^)\\n]*\\)|\"[^\"\\n]*\")/mu,\n },\n]\n\n/**\n * Most specific first: when two patterns hit the same path token\n * (`~/.ssh/id_rsa`), only the earlier one is reported.\n */\nexport const SENSITIVE_PATH_PATTERNS: Pattern[] = [\n {\n label: 'SSH private key',\n re: /(?<![A-Za-z0-9])id_(?:rsa|dsa|ecdsa|ed25519)(?![A-Za-z0-9])/iu,\n },\n { label: 'SSH directory', re: /(?<![\\w.])\\.ssh(?![\\w-])/iu },\n {\n label: 'cloud credentials',\n re: /\\.aws[\\\\/](?:credentials|config)\\b|(?<![\\w.])\\.(?:azure|kube|gnupg)(?![\\w-])|\\.config[\\\\/]gcloud\\b|\\.docker[\\\\/]config\\.json\\b/iu,\n },\n {\n label: 'auth dotfile',\n re: /(?<![\\w.])\\.(?:netrc|npmrc|pypirc|pgpass|git-credentials|bash_history|zsh_history)(?![\\w-])/iu,\n },\n { label: 'system credential file', re: /\\/etc\\/(?:passwd|shadow|sudoers)\\b/iu },\n {\n label: 'agent/MCP client config',\n re: /(?<![\\w-])(?:mcp\\.json|claude_desktop_config\\.json|\\.claude\\.json)(?!\\w)|~[\\\\/]\\.cursor\\b/iu,\n },\n { label: '.env file', re: /(?<![\\w.$-])\\.env(?:\\.[\\w-]+)?(?![\\w-])/iu },\n { label: 'wallet/keychain', re: /\\bwallet\\.dat\\b|[\\\\/]Keychains?[\\\\/]|\\bLogin Data\\b/iu },\n]\n\nconst SECRET_NOUN = [\n 'api[\\\\s_-]?keys?',\n 'access[\\\\s_-]?tokens?',\n 'auth(?:entication)?[\\\\s_-]?tokens?',\n 'bearer[\\\\s_-]?tokens?',\n 'refresh[\\\\s_-]?tokens?',\n 'session[\\\\s_-]?tokens?',\n 'secret[\\\\s_-]?keys?',\n 'private[\\\\s_-]?keys?',\n 'passwords?',\n 'passphrases?',\n 'credentials?',\n 'seed[\\\\s_-]?phrases?',\n 'mnemonics?',\n 'ssh[\\\\s_-]?keys?',\n 'client[\\\\s_-]?secrets?',\n].join('|')\n\nconst TRANSFER_VERB =\n 'pass|send|include|provide|forward|attach|upload|post|share|paste|append|embed|supply|enter'\nconst TRANSFER_PARTICIPLE =\n 'included|sent|passed|forwarded|attached|uploaded|posted|shared|pasted|appended'\n\n/** Secret noun + a verb asking the model to move it, close together. */\nexport const SECRET_REQUEST_PATTERNS: Pattern[] = [\n {\n label: 'asks for a secret',\n re: new RegExp(`\\\\b(?:${TRANSFER_VERB})\\\\b(?:\\\\W+\\\\w+){0,6}?\\\\W+(?:${SECRET_NOUN})\\\\b`, 'iu'),\n },\n {\n label: 'asks for a secret (passive)',\n re: new RegExp(\n `\\\\b(?:${SECRET_NOUN})(?:\\\\W+\\\\w+){0,4}?\\\\W+(?:${TRANSFER_PARTICIPLE})\\\\b`,\n 'iu',\n ),\n },\n]\n\n/** Same sentence as another tool's name: the description changes how that tool behaves. */\nexport const SHADOWING_CUES: Pattern[] = [\n { label: '\"side effect on\"', re: /\\bside[\\s-]effects?\\s+(?:on|for|of|to)\\b/iu },\n {\n label: '\"when this tool is available\"',\n re: /\\bwhen\\s+this\\s+tool\\s+is\\s+(?:available|present|loaded|installed|enabled|active)\\b/iu,\n },\n {\n label: 'redirect directive',\n re: /\\b(?:must|should|shall|always)\\s+(?:now\\s+|also\\s+|instead\\s+)?(?:send|forward|redirect|route|bcc|cc|copy|proxy|exfiltrate|upload)\\b/iu,\n },\n {\n label: '\"regardless of\"',\n re: /\\bregardless\\s+of\\s+(?:what\\s+)?(?:the\\s+)?(?:user|instructions?|arguments?|recipient)/iu,\n },\n {\n label: 'target substitution',\n re: /\\b(?:instead\\s+of|rather\\s+than)\\s+(?:to\\s+)?(?:the\\s+)?(?:user['’]?s?|intended|actual|original|specified|requested)\\s+(?:recipient|address|destination|account|url|target)\\b|\\b(?:replace|swap|rewrite|override)\\s+(?:the\\s+)?(?:recipient|address|destination|account|url|target|amount)\\b/iu,\n },\n]\n\n/** Same sentence as another tool's name; two different cues needed. */\nexport const STEERING_CUES: Pattern[] = [\n { label: '\"instead\"', re: /\\binstead\\b/iu },\n { label: '\"rather than\"', re: /\\brather\\s+than\\b/iu },\n { label: '\"prefer\"', re: /\\bprefer(?:red|ably|s)?\\b/iu },\n { label: '\"override\"', re: /\\boverrid(?:e|es|ing)\\b/iu },\n {\n label: '\"do not use/call\"',\n re: /\\b(?:never|do\\s+not|don['’]?t|must\\s+not|should\\s+not|stop)\\s+(?:use|using|call|calling|invoke|invoking|run|running|trust)\\b/iu,\n },\n {\n label: 'disparages the tool',\n re: /\\b(?:deprecated|broken|unsafe|insecure|outdated|obsolete|compromised|malicious)\\b/iu,\n },\n { label: '\"always use this\"', re: /\\balways\\s+(?:use|call)\\s+this\\b/iu },\n]\n\n// ---------------------------------------------------------------------------\n// Rule implementations\n// ---------------------------------------------------------------------------\n\ninterface Hit {\n p: Pattern\n index: number\n length: number\n}\n\nconst TOKEN_BOUNDARY = /[\\s'\"`()<>[\\]{},;]/u\nconst MAX_TOKEN_REACH = 200\nconst MAX_MATCHES_PER_PATTERN = 50\nconst globalCache = new WeakMap<RegExp, RegExp>()\n\nfunction globalOf(re: RegExp): RegExp {\n let g = globalCache.get(re)\n if (!g) {\n g = new RegExp(re.source, `${re.flags}g`)\n globalCache.set(re, g)\n }\n return g\n}\n\n/** The match widened to the surrounding path-like token (`~/.ssh/id_rsa`), for overlap tests. */\nfunction tokenSpan(text: string, index: number, length: number): [number, number] {\n let start = index\n let end = index + length\n const minStart = Math.max(0, index - MAX_TOKEN_REACH)\n const maxEnd = Math.min(text.length, end + MAX_TOKEN_REACH)\n while (start > minStart && !TOKEN_BOUNDARY.test(text[start - 1])) start--\n while (end < maxEnd && !TOKEN_BOUNDARY.test(text[end])) end++\n return [start, end]\n}\n\n/**\n * At most one hit per pattern. Within a group (default: the whole table), a hit\n * whose token overlaps an earlier pattern's hit is dropped, so `~/.ssh/id_rsa`\n * reports \"SSH private key\" once instead of also \"SSH directory\". Earlier\n * patterns in a table therefore win: order tables most-specific first.\n */\nfunction collectHits(patterns: Pattern[], text: string, grouped: boolean): Hit[] {\n const kept: Array<Hit & { span: [number, number]; group: string }> = []\n for (const p of patterns) {\n const group = grouped ? (p.group ?? p.label) : ''\n const re = globalOf(p.re)\n re.lastIndex = 0\n let n = 0\n for (const m of text.matchAll(re)) {\n if (++n > MAX_MATCHES_PER_PATTERN) break\n const index = m.index ?? 0\n const span = tokenSpan(text, index, m[0].length)\n const clash = kept.some(\n (k) => k.group === group && span[0] < k.span[1] && k.span[0] < span[1],\n )\n if (clash) continue\n kept.push({ p, index, length: m[0].length, span, group })\n break\n }\n }\n return kept.sort((a, b) => a.index - b.index)\n}\n\n/** Fires once per matching pattern (overlapping hits collapse to the most specific). */\nfunction anyPattern(patterns: Pattern[]): TextCheck {\n return (src) =>\n collectHits(patterns, src.text, false).map(\n (h) => `${src.field}: ${h.p.label} in ${quote(excerpt(src.text, h.index, h.length))}`,\n )\n}\n\n/** Fires when patterns from at least `min` distinct groups match the same string. */\nfunction patternGroups(patterns: Pattern[], min: number): TextCheck {\n return (src) => {\n const hits = collectHits(patterns, src.text, true)\n if (new Set(hits.map((h) => h.p.group ?? h.p.label)).size < min) return []\n const first = hits[0]\n const labels = hits.map((h) => h.p.label).join(' + ')\n return [`${src.field}: ${labels} in ${quote(excerpt(src.text, first.index, first.length, 48))}`]\n }\n}\n\n/** \"any other weather tool\", \"all other tools\", \"other tools\". */\nconst GENERIC_TOOL_REF_RE =\n /\\b(?:any|all|every)\\s+other\\s+(?:[\\w-]+\\s+){0,2}?tools?\\b|\\bother\\s+tools\\b/iu\n\n/** A tool-like identifier right after a directive: \"never use search_web\", \"instead of `read_doc`\". */\nconst DIRECTIVE_REF_RE =\n /\\b(?:(?:never|do\\s+not|don['’]?t|must\\s+not|should\\s+not|stop)\\s+(?:use|using|call|calling|invoke|invoking|run|running|trust)|instead\\s+of(?:\\s+(?:using|calling))?|rather\\s+than(?:\\s+(?:using|calling))?|prefer\\s+this(?:\\s+tool)?\\s+(?:over|to))\\s+(?:the\\s+)?[`'\"]?([A-Za-z][A-Za-z0-9_.-]*[A-Za-z0-9])/giu\n\nconst FILE_LIKE_RE =\n /\\.(?:json|ya?ml|toml|md|txt|js|ts|py|sh|env|ini|cfg|conf|xml|html|csv|log|lock)$/iu\n\n/** Case-sensitive on purpose: separator-joined (`search_web`, `notes.get`) or camelCase (`getUser`). */\nfunction isToolLikeIdentifier(s: string): boolean {\n return (\n s.length >= 3 &&\n !FILE_LIKE_RE.test(s) &&\n (/^[A-Za-z][A-Za-z0-9]*(?:[_.-][A-Za-z0-9]+)+$/u.test(s) || /[a-z][A-Z]/u.test(s))\n )\n}\n\n/**\n * Other tools a sentence refers to: names from the manifest / knownToolNames,\n * generic \"any other ... tool\" phrases, and tool-like identifiers that follow a\n * use/call directive even when the tool is not in this manifest (cross-server).\n * Unlisted identifiers only count when the sentence talks about tools at all,\n * so \"never use snake_case keys\" is not a tool reference.\n */\nfunction referencedTools(sentence: string, ctx: LintContext, self: string | undefined): string[] {\n const selfLower = self?.toLowerCase()\n const refs = ctx.mentions\n .filter((m) => m.name !== self && m.re.test(sentence))\n .map((m) => quote(m.name))\n const known = new Set(ctx.mentions.map((m) => m.name.toLowerCase()))\n const generic = GENERIC_TOOL_REF_RE.exec(sentence)\n if (generic) refs.push(quote(generic[0]))\n if (/\\btools?\\b/iu.test(sentence)) {\n for (const m of sentence.matchAll(DIRECTIVE_REF_RE)) {\n const id = m[1]\n const lower = id.toLowerCase()\n if (!isToolLikeIdentifier(id) || lower === selfLower || known.has(lower)) continue\n const label = `${quote(id)} (not in this manifest)`\n if (!refs.includes(label)) refs.push(label)\n }\n }\n return refs\n}\n\n/** Fires per sentence that refers to another tool together with >= `min` distinct cues. */\nfunction toolMentionRule(cues: Pattern[], min: number): TextCheck {\n return (src, ctx) => {\n if (src.kind !== 'tool') return []\n const out: string[] = []\n for (const sentence of splitSentences(src.text)) {\n const refs = referencedTools(sentence, ctx, src.toolName)\n if (refs.length === 0) continue\n const hits = cues.filter((c) => c.re.test(sentence))\n if (new Set(hits.map((h) => h.group ?? h.label)).size < min) continue\n const labels = hits.map((h) => h.label).join(' + ')\n out.push(`${src.field}: names ${refs.join(', ')} with ${labels} in ${quote(clip(sentence))}`)\n }\n return out\n }\n}\n\n/** Sensitive paths double as the \"exfiltration target\" signal for the imperative rule. */\nconst EXFIL_TARGET_PATTERNS: Pattern[] = SENSITIVE_PATH_PATTERNS.map((p) => ({\n ...p,\n group: 'target',\n label: `targets ${p.label}`,\n}))\n\nfunction invisibleChars(src: TextSource): TextResult[] {\n const { hits, tagText } = scanInvisible(src.raw)\n if (hits.length === 0) return []\n const counts = new Map<string, number>()\n for (const h of hits) {\n const label = h.kind === 'tag' ? 'tag characters U+E00xx' : formatCodePoint(h.codePoint)\n counts.set(label, (counts.get(label) ?? 0) + 1)\n }\n const list = [...counts].map(([k, n]) => (n > 1 ? `${k} x${n}` : k)).join(', ')\n const before = clip(normalizeForMatching(src.raw.slice(0, hits[0].index)).slice(-40), 40)\n const hidden = tagText ? `; hidden text ${quote(clip(tagText, 120))}` : ''\n return [\n `${src.field}: ${hits.length} invisible character(s) (${list}) after ${quote(before || '(start)')}${hidden}`,\n ]\n}\n\nconst PAD_SPACES = 40\nconst PAD_LINES = 8\nconst NEWLINES = new Set(['\\n', '
', '
'])\n\n/**\n * First whitespace run followed by more text that has >= 40 consecutive\n * horizontal blanks or >= 8 line breaks. A linear scan on purpose: descriptions\n * are attacker-controlled and the equivalent regex backtracks quadratically.\n */\nexport function findPadding(\n raw: string,\n): { end: number; spaces: number; lines: number } | undefined {\n let spaces = 0\n let maxSpaces = 0\n let lines = 0\n let inRun = false\n for (let i = 0; i < raw.length; i++) {\n const ch = raw[i]\n if (NEWLINES.has(ch)) {\n lines++\n spaces = 0\n inRun = true\n } else if (ch === '\\r') {\n inRun = true\n } else if (/\\s/u.test(ch)) {\n spaces++\n maxSpaces = Math.max(maxSpaces, spaces)\n inRun = true\n } else {\n if (inRun && (maxSpaces >= PAD_SPACES || lines >= PAD_LINES)) {\n return { end: i, spaces: maxSpaces, lines }\n }\n spaces = 0\n maxSpaces = 0\n lines = 0\n inRun = false\n }\n }\n return undefined\n}\n\nfunction whitespacePadding(src: TextSource): string[] {\n const pad = findPadding(src.raw)\n if (!pad) return []\n const what =\n pad.lines >= PAD_LINES ? `${pad.lines} line breaks` : `${pad.spaces} consecutive blanks`\n return [`${src.field}: ${what} before ${quote(clip(src.raw.slice(pad.end), 80))}`]\n}\n\nconst URL_RE = /\\b(?:https?|ftp|wss?):\\/\\/[^\\s\"'`)\\]]+/giu\nconst TRANSFER_TO_RE =\n /\\b(?:send|post|upload|forward|transmit|exfiltrate|report|submit|beacon)\\b(?:\\W+\\w+){0,6}?\\W+(?:to|at)\\s*$/iu\n\nfunction suspiciousUrls(src: TextSource): string[] {\n const out: string[] = []\n for (const m of src.text.matchAll(URL_RE)) {\n const url = m[0].replace(/[.,;:!?>]+$/u, '')\n const index = m.index ?? 0\n const reasons: string[] = []\n if (/\\?[^#]*=/u.test(url)) reasons.push('query string')\n if (/[{}<>]|\\$\\{|%s/u.test(url)) reasons.push('template placeholder')\n if (/^[a-z]+:\\/\\/(?:\\d{1,3}\\.){3}\\d{1,3}(?::\\d+)?(?:[/?#]|$)/iu.test(url)) {\n reasons.push('IP-literal host')\n }\n if (TRANSFER_TO_RE.test(src.text.slice(Math.max(0, index - 120), index))) {\n reasons.push('data is sent to it')\n }\n if (reasons.length) {\n out.push(`${src.field}: URL with ${reasons.join(', ')}: ${quote(clip(url, 120))}`)\n }\n }\n return out\n}\n\nconst BLOB_RE = /[A-Za-z0-9+/_-]{40,}={0,2}/gu\n\nfunction decodeBlob(blob: string): string | undefined {\n const bytes = Buffer.from(blob.replace(/-/gu, '+').replace(/_/gu, '/'), 'base64')\n if (bytes.length < 8) return undefined\n let printable = 0\n for (const b of bytes) if ((b >= 0x20 && b <= 0x7e) || b === 0x0a || b === 0x09) printable++\n return printable / bytes.length >= 0.9 ? bytes.toString('latin1') : undefined\n}\n\nfunction looksLikeBase64(s: string): boolean {\n if (/^[0-9a-f]+$/iu.test(s)) return false // hex hashes / ids\n if (/[+/]/u.test(s) && /[-_]/u.test(s)) return false // mixes the two base64 alphabets\n if (s.endsWith('=')) return true\n if (!/[A-Z]/u.test(s) || !/[a-z]/u.test(s) || !/\\d/u.test(s)) return false\n const dense = (s.match(/[A-Z0-9+/]/gu) ?? []).length / s.length\n return dense >= 0.2 // long camelCase identifiers are mostly lowercase\n}\n\nfunction encodedBlobs(src: TextSource): TextResult[] {\n const out: TextResult[] = []\n for (const m of src.text.replace(URL_RE, ' ').matchAll(BLOB_RE)) {\n const blob = m[0]\n if (!looksLikeBase64(blob)) continue\n const decoded = decodeBlob(blob)\n const dangerous =\n decoded !== undefined &&\n [...HIDDEN_INSTRUCTION_PATTERNS, ...SENSITIVE_PATH_PATTERNS].some((p) => p.re.test(decoded))\n const shown = blob.length > 48 ? `${blob.slice(0, 45)}...` : blob\n const tail = decoded ? ` decodes to ${quote(clip(decoded, 100))}` : ''\n out.push({\n message: `${src.field}: ${blob.length}-char base64-like blob ${quote(shown)}${tail}`,\n ...(dangerous ? { severity: 'failed' as const } : {}),\n })\n }\n return out\n}\n\nfunction missingDescription(tool: ToolSummary): string[] {\n const d = tool.description\n if (typeof d !== 'string') return ['no description']\n return d.trim() === '' ? ['description is empty'] : []\n}\n\nfunction longDescription(tool: ToolSummary, ctx: LintContext): string[] {\n if (typeof tool.description !== 'string') return []\n const len = Array.from(tool.description).length\n return len > ctx.maxDescriptionLength\n ? [\n `description is ${len} chars (limit ${ctx.maxDescriptionLength}); long descriptions cost context and hide content from reviewers`,\n ]\n : []\n}\n\nconst NAME_CHARS_RE = /^[A-Za-z0-9_.-]+$/u\nconst COMMON_NAME_LIMIT = 64\nconst SPEC_NAME_LIMIT = 128\n\nfunction nameFormat(tool: ToolSummary): string[] {\n const name = tool.name\n if (typeof name !== 'string' || name === '') return ['tool has no name']\n const out: string[] = []\n if (!NAME_CHARS_RE.test(name)) {\n const bad = [...new Set(Array.from(name).filter((c) => !NAME_CHARS_RE.test(c)))]\n out.push(\n `name ${quote(name)} contains ${bad.map((c) => quote(c)).join(' ')}; allowed: A-Z a-z 0-9 _ - .`,\n )\n }\n const len = Array.from(name).length\n if (len > SPEC_NAME_LIMIT) out.push(`name is ${len} chars (spec maximum ${SPEC_NAME_LIMIT})`)\n return out\n}\n\nfunction nameLength(tool: ToolSummary): string[] {\n if (typeof tool.name !== 'string') return []\n const len = Array.from(tool.name).length\n return len > COMMON_NAME_LIMIT && len <= SPEC_NAME_LIMIT\n ? [`name is ${len} chars; many clients and LLM APIs cap tool names at ${COMMON_NAME_LIMIT}`]\n : []\n}\n\nfunction duplicateNames(tools: ToolSummary[]): Finding[] {\n const seen = new Map<string, number[]>()\n tools.forEach((t, i) => {\n if (typeof t.name !== 'string') return\n seen.set(t.name, [...(seen.get(t.name) ?? []), i])\n })\n const out: Finding[] = []\n for (const [name, idx] of seen) {\n if (idx.length < 2) continue\n out.push({\n subject: `tool ${quote(name)}`,\n key: name,\n message: `defined ${idx.length} times (${idx.map((i) => `tools[${i}]`).join(', ')})`,\n })\n }\n return out\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v)\n}\n\nfunction kindOf(v: unknown): string {\n return Array.isArray(v) ? 'an array' : v === null ? 'null' : typeof v\n}\n\nfunction inputSchemaType(tool: ToolSummary): string[] {\n const s = tool.inputSchema\n if (s === undefined) return ['no inputSchema (MCP requires an object schema)']\n if (!isRecord(s)) return [`inputSchema is ${kindOf(s)}, not an object schema`]\n if (s.type !== 'object') {\n const got = s.type === undefined ? 'missing' : JSON.stringify(s.type)\n return [`inputSchema.type is ${got}; MCP requires \"object\"`]\n }\n return []\n}\n\nconst HINTS = ['readOnlyHint', 'destructiveHint', 'idempotentHint', 'openWorldHint'] as const\n\nfunction annotationConflict(tool: ToolSummary): string[] {\n const a = tool.annotations\n if (!isRecord(a)) return []\n return a.readOnlyHint === true && a.destructiveHint === true\n ? [\n 'readOnlyHint: true contradicts destructiveHint: true (clients may skip confirmation for a destructive tool)',\n ]\n : []\n}\n\nfunction annotationTypes(tool: ToolSummary): string[] {\n const a = tool.annotations\n if (a === undefined) return []\n if (!isRecord(a)) return [`annotations is ${kindOf(a)}, not an object`]\n const out: string[] = []\n for (const h of HINTS) {\n if (a[h] !== undefined && typeof a[h] !== 'boolean') {\n out.push(`annotations.${h} is ${JSON.stringify(a[h])}, expected a boolean`)\n }\n }\n if (a.title !== undefined && typeof a.title !== 'string') {\n out.push('annotations.title is not a string')\n }\n return out\n}\n\n// ---------------------------------------------------------------------------\n// The rule table. One entry per rule; ids are stable and allow-listable.\n// ---------------------------------------------------------------------------\n\n// biome-ignore format: one rule per line keeps the table scannable\nexport const DESCRIPTION_RULES: readonly DescriptionRule[] = [\n { id: 'desc/hidden-instructions', title: 'Hidden instructions in model-visible text', severity: 'failed', text: anyPattern(HIDDEN_INSTRUCTION_PATTERNS) },\n { id: 'desc/imperative-instructions', title: 'Coercive imperative phrasing (2+ signals)', severity: 'warned', text: patternGroups([...IMPERATIVE_PATTERNS, ...EXFIL_TARGET_PATTERNS], 2) },\n { id: 'desc/invisible-unicode', title: 'Invisible or bidi-override Unicode characters', severity: 'failed', text: invisibleChars },\n { id: 'desc/whitespace-padding', title: 'Whitespace padding pushes text out of view', severity: 'warned', text: whitespacePadding },\n { id: 'desc/html-comment', title: 'Markdown/HTML comment hides text from reviewers', severity: 'warned', text: anyPattern(HIDDEN_MARKUP_PATTERNS) },\n { id: 'desc/tool-shadowing', title: 'Description alters the behavior of another tool', severity: 'failed', text: toolMentionRule(SHADOWING_CUES, 1) },\n { id: 'desc/tool-steering', title: 'Description steers the model away from another tool', severity: 'warned', text: toolMentionRule(STEERING_CUES, 2) },\n { id: 'desc/sensitive-paths', title: 'References credential or secret file paths', severity: 'failed', text: anyPattern(SENSITIVE_PATH_PATTERNS) },\n { id: 'desc/secret-request', title: 'Asks the model to pass secrets through arguments', severity: 'warned', text: anyPattern(SECRET_REQUEST_PATTERNS) },\n { id: 'desc/embedded-url', title: 'Suspicious URL in model-visible text', severity: 'warned', text: suspiciousUrls },\n { id: 'desc/encoded-blob', title: 'Base64-like blob in model-visible text', severity: 'warned', text: encodedBlobs },\n { id: 'desc/missing-description', title: 'Tool has no description', severity: 'warned', tool: missingDescription },\n { id: 'desc/long-description', title: 'Tool description is very long', severity: 'warned', tool: longDescription },\n { id: 'desc/tool-name-format', title: 'Tool name is not a valid MCP tool name', severity: 'failed', tool: nameFormat },\n { id: 'desc/tool-name-length', title: 'Tool name longer than common client limits', severity: 'warned', tool: nameLength },\n { id: 'desc/duplicate-tool-names', title: 'Duplicate tool names', severity: 'failed', tools: duplicateNames },\n { id: 'desc/input-schema-type', title: 'inputSchema is not an object schema', severity: 'warned', tool: inputSchemaType },\n { id: 'desc/annotations-conflict', title: 'Contradictory tool annotations', severity: 'warned', tool: annotationConflict },\n { id: 'desc/annotations-invalid', title: 'Malformed tool annotations', severity: 'warned', tool: annotationTypes },\n]\n\n// ---------------------------------------------------------------------------\n// Collecting model-visible text\n// ---------------------------------------------------------------------------\n\nconst SCHEMA_DATA_KEYS = new Set(['const', 'enum', 'default', 'examples', 'example'])\nconst MAX_DEPTH = 32\n\n/** description/title strings and property names anywhere in a schema (not data keywords). */\nfunction walkSchemaText(\n node: unknown,\n path: string,\n push: (field: string, value: unknown) => void,\n depth = 0,\n seen: Set<unknown> = new Set(),\n): void {\n if (depth > MAX_DEPTH || typeof node !== 'object' || node === null || seen.has(node)) return\n seen.add(node)\n if (Array.isArray(node)) {\n node.forEach((v, i) => walkSchemaText(v, `${path}[${i}]`, push, depth + 1, seen))\n return\n }\n for (const [k, v] of Object.entries(node)) {\n if (SCHEMA_DATA_KEYS.has(k)) continue\n if ((k === 'description' || k === 'title') && typeof v === 'string') {\n push(`${path}.${k}`, v)\n continue\n }\n if (k === 'properties' && isRecord(v)) {\n for (const prop of Object.keys(v)) push(`${path}.properties[${quote(prop)}] (name)`, prop)\n }\n walkSchemaText(v, `${path}.${k}`, push, depth + 1, seen)\n }\n}\n\nfunction toolLabel(tool: ToolSummary, i: number): { subject: string; key: string; name?: string } {\n const name = typeof tool.name === 'string' && tool.name !== '' ? tool.name : undefined\n return name\n ? { subject: `tool ${quote(name)}`, key: name, name }\n : { subject: `tools[${i}]`, key: `#${i}` }\n}\n\nfunction asArray<T>(v: unknown): T[] {\n return Array.isArray(v) ? (v.filter(isRecord) as T[]) : []\n}\n\n/** Every model-visible string in the tool list (and optional extras), normalized for matching. */\nexport function collectTextSources(\n tools: ToolSummary[],\n opts: DescriptionLintOptions = {},\n): TextSource[] {\n const out: TextSource[] = []\n const add = (\n kind: TextSource['kind'],\n subject: string,\n key: string,\n field: string,\n value: unknown,\n toolName?: string,\n ) => {\n if (typeof value !== 'string' || value === '') return\n out.push({ kind, subject, key, field, raw: value, text: normalizeForMatching(value), toolName })\n }\n asArray<ToolSummary>(tools).forEach((tool, i) => {\n const { subject, key, name } = toolLabel(tool, i)\n const push = (field: string, value: unknown) => add('tool', subject, key, field, value, name)\n push('title', tool.title)\n push('description', tool.description)\n if (isRecord(tool.annotations)) push('annotations.title', tool.annotations.title)\n walkSchemaText(tool.inputSchema, 'inputSchema', push)\n walkSchemaText(tool.outputSchema, 'outputSchema', push)\n })\n for (const r of asArray<ResourceSummary>(opts.resources)) {\n const key = String(r.uri ?? r.name ?? '?')\n add('resource', `resource ${quote(key)}`, key, 'title', r.title)\n add('resource', `resource ${quote(key)}`, key, 'description', r.description)\n }\n for (const r of asArray<ResourceTemplateSummary>(opts.resourceTemplates)) {\n const key = String(r.uriTemplate ?? r.name ?? '?')\n add('resourceTemplate', `resource template ${quote(key)}`, key, 'title', r.title)\n add('resourceTemplate', `resource template ${quote(key)}`, key, 'description', r.description)\n }\n for (const p of asArray<PromptSummary>(opts.prompts)) {\n const key = String(p.name ?? '?')\n const subject = `prompt ${quote(key)}`\n add('prompt', subject, key, 'title', p.title)\n add('prompt', subject, key, 'description', p.description)\n for (const a of asArray<{ name?: string; description?: string }>(p.arguments)) {\n add('prompt', subject, key, `arguments[${quote(String(a.name))}].description`, a.description)\n }\n }\n add('instructions', 'server instructions', 'instructions', 'instructions', opts.instructions)\n return out\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/gu, '\\\\$&')\n}\n\n/**\n * How we decide a tool name is \"mentioned\". Identifier-looking names\n * (send_email, notes.get, getUser, v2tool) match with alphanumeric boundaries,\n * so prefixed forms like mcp_tool_send_email count. Plain-word names (search,\n * add) only count when quoted/backticked or written as \"the search tool\".\n */\nexport function mentionPattern(name: string): RegExp | undefined {\n if (Array.from(name).length < 3) return undefined\n const esc = escapeRegExp(name)\n if (/[_.-]|[a-z][A-Z]|\\d/u.test(name)) {\n return new RegExp(`(?<![A-Za-z0-9])${esc}(?![A-Za-z0-9])`, 'iu')\n }\n return new RegExp(`[\\`'\"“”‘’]${esc}[\\`'\"“”‘’]|\\\\b${esc}\\\\s+tool\\\\b|\\\\btool\\\\s+${esc}\\\\b`, 'iu')\n}\n\nfunction buildContext(tools: ToolSummary[], opts: DescriptionLintOptions): LintContext {\n const names = new Set<string>()\n for (const t of tools) if (typeof t.name === 'string') names.add(t.name)\n for (const n of opts.knownToolNames ?? []) if (typeof n === 'string') names.add(n)\n const mentions: Mention[] = []\n for (const name of names) {\n const re = mentionPattern(name)\n if (re) mentions.push({ name, re })\n }\n return { maxDescriptionLength: opts.maxDescriptionLength ?? 2000, mentions }\n}\n\n/**\n * Lint tool descriptions (and, via opts, resource/prompt descriptions and server\n * instructions). Pure. Returns one `passed` outcome per clean rule and one\n * outcome per offending subject otherwise, sorted failed -> warned -> passed.\n */\nexport function lintDescriptions(\n tools: ToolSummary[] = [],\n opts: DescriptionLintOptions = {},\n): CheckOutcome[] {\n const list = asArray<ToolSummary>(tools)\n const ctx = buildContext(list, opts)\n const sources = collectTextSources(list, opts)\n const out: CheckOutcome[] = []\n for (const rule of DESCRIPTION_RULES) {\n if (isAllowed(opts.allow, rule.id)) continue\n const findings: Finding[] = []\n if (rule.text) {\n for (const src of sources) {\n for (const r of rule.text(src, ctx)) {\n const f = typeof r === 'string' ? { message: r } : r\n findings.push({ ...f, subject: src.subject, key: src.key })\n }\n }\n }\n if (rule.tool) {\n const check = rule.tool\n list.forEach((tool, i) => {\n const { subject, key } = toolLabel(tool, i)\n for (const message of check(tool, ctx)) findings.push({ subject, key, message })\n })\n }\n if (rule.tools) findings.push(...rule.tools(list, ctx))\n out.push(...buildOutcomes(rule, findings, opts))\n }\n return sortOutcomes(out)\n}\n","/**\n * Offline `$ref` resolution check for JSON Schema 2020-12 (draft-07 `definitions`\n * works too). Pure: never fetches anything. A ref resolves when it points at a\n * JSON pointer, `$anchor`/`$dynamicAnchor`, or embedded `$id` inside the same\n * document. Anything else is reported, because MCP clients validate offline.\n */\n\nexport interface RefProblem {\n /** JSON pointer of the `$ref` keyword inside the schema, e.g. `/properties/a/$ref`. */\n at: string\n ref: string\n message: string\n}\n\nconst DEFAULT_BASE = 'https://vibrissa.invalid/schema.json'\n\n/** Keywords whose value is a subschema. */\nconst SCHEMA_KEYWORDS = new Set([\n 'additionalProperties',\n 'not',\n 'if',\n 'then',\n 'else',\n 'contains',\n 'propertyNames',\n 'unevaluatedItems',\n 'unevaluatedProperties',\n 'additionalItems',\n 'items',\n 'contentSchema',\n])\n/** Keywords whose value is an array of subschemas. */\nconst SCHEMA_ARRAY_KEYWORDS = new Set(['allOf', 'anyOf', 'oneOf', 'prefixItems', 'items'])\n/** Keywords whose value is a map of name -> subschema. */\nconst SCHEMA_MAP_KEYWORDS = new Set([\n 'properties',\n 'patternProperties',\n '$defs',\n 'definitions',\n 'dependentSchemas',\n 'dependencies',\n])\n\ninterface Resource {\n root: unknown\n anchors: Set<string>\n}\n\ninterface PendingRef {\n at: string\n ref: string\n base: string\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v)\n}\n\nfunction escapePointer(token: string): string {\n return token.replace(/~/gu, '~0').replace(/\\//gu, '~1')\n}\n\nfunction stripHash(url: string): string {\n const i = url.indexOf('#')\n return i === -1 ? url : url.slice(0, i)\n}\n\nfunction resolveUrl(ref: string, base: string): string | undefined {\n try {\n return new URL(ref, base).href\n } catch {\n return undefined\n }\n}\n\n/** Resolve a JSON pointer (already URI-decoded) against a document. */\nexport function resolvePointer(doc: unknown, pointer: string): { found: boolean; value?: unknown } {\n if (pointer === '') return { found: true, value: doc }\n if (!pointer.startsWith('/')) return { found: false }\n let node: unknown = doc\n for (const raw of pointer.slice(1).split('/')) {\n const token = raw.replace(/~1/gu, '/').replace(/~0/gu, '~')\n if (Array.isArray(node)) {\n if (!/^(?:0|[1-9]\\d*)$/u.test(token) || Number(token) >= node.length) return { found: false }\n node = node[Number(token)]\n } else if (isRecord(node) && Object.hasOwn(node, token)) {\n node = node[token]\n } else {\n return { found: false }\n }\n }\n return { found: true, value: node }\n}\n\n/** Every `$ref` / `$dynamicRef` in `schema` that cannot be resolved inside the document. */\nexport function findUnresolvedRefs(schema: unknown): RefProblem[] {\n const resources = new Map<string, Resource>()\n const pending: PendingRef[] = []\n const seen = new Set<unknown>()\n\n const visit = (node: unknown, at: string, base: string, depth: number): void => {\n if (!isRecord(node) || depth > 64 || seen.has(node)) return\n seen.add(node)\n let here = base\n if (typeof node.$id === 'string') {\n const id = resolveUrl(node.$id, base)\n if (id) {\n here = stripHash(id)\n if (!resources.has(here)) resources.set(here, { root: node, anchors: new Set() })\n }\n }\n const resource = resources.get(here)\n for (const key of ['$anchor', '$dynamicAnchor'] as const) {\n if (typeof node[key] === 'string') resource?.anchors.add(node[key] as string)\n }\n for (const key of ['$ref', '$dynamicRef'] as const) {\n if (typeof node[key] === 'string')\n pending.push({ at: `${at}/${key}`, ref: node[key] as string, base: here })\n }\n for (const [k, v] of Object.entries(node)) {\n const path = `${at}/${escapePointer(k)}`\n if (SCHEMA_ARRAY_KEYWORDS.has(k) && Array.isArray(v)) {\n v.forEach((item, i) => visit(item, `${path}/${i}`, here, depth + 1))\n } else if (SCHEMA_MAP_KEYWORDS.has(k) && isRecord(v)) {\n for (const [name, sub] of Object.entries(v)) {\n visit(sub, `${path}/${escapePointer(name)}`, here, depth + 1)\n }\n } else if (SCHEMA_KEYWORDS.has(k)) {\n visit(v, path, here, depth + 1)\n }\n }\n }\n\n resources.set(DEFAULT_BASE, { root: schema, anchors: new Set() })\n visit(schema, '', DEFAULT_BASE, 0)\n\n const problems: RefProblem[] = []\n for (const p of pending) {\n const target = resolveUrl(p.ref, p.base)\n if (!target) {\n problems.push({ at: p.at || '/', ref: p.ref, message: 'is not a valid URI reference' })\n continue\n }\n const hashAt = target.indexOf('#')\n const doc = stripHash(target)\n const fragment = hashAt === -1 ? '' : target.slice(hashAt + 1)\n const resource = resources.get(doc)\n if (!resource) {\n problems.push({\n at: p.at,\n ref: p.ref,\n message: 'points outside this schema (MCP clients do not fetch remote schemas)',\n })\n continue\n }\n let decoded = fragment\n try {\n decoded = decodeURIComponent(fragment)\n } catch {\n // keep raw fragment\n }\n if (decoded === '' || decoded.startsWith('/')) {\n if (!resolvePointer(resource.root, decoded).found) {\n problems.push({\n at: p.at,\n ref: p.ref,\n message: 'does not resolve to anything in this schema',\n })\n }\n } else if (!resource.anchors.has(decoded)) {\n problems.push({ at: p.at, ref: p.ref, message: `names an unknown anchor \"${decoded}\"` })\n }\n }\n return problems\n}\n","/**\n * Deterministic spec-sanity checks over a recorded manifest (the Layer 0 subset\n * Vibrissa can run on stdio): protocol version, tools/list determinism, list\n * cache metadata, JSON Schema validity and local `$ref` resolution, server\n * identity and capabilities. Pure: takes data, never opens a session.\n *\n * Also exports `errorCodeExpectations`, the per-era error-code table the live\n * runner uses to assert error behavior.\n */\nimport type { CheckOutcome } from '../events.js'\nimport { isValidSchema } from '../schema.js'\nimport type { JsonValue } from '../types.js'\nimport {\n type Finding,\n type LintOptions,\n type RuleMeta,\n buildOutcomes,\n isAllowed,\n sortOutcomes,\n} from './outcomes.js'\nimport { findUnresolvedRefs } from './refs.js'\nimport { clip } from './text.js'\nimport type { ListMeta, ManifestLike, ToolSummary } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Protocol versions & eras\n// ---------------------------------------------------------------------------\n\nexport const KNOWN_PROTOCOL_VERSIONS = [\n '2024-11-05',\n '2025-03-26',\n '2025-06-18',\n '2025-11-25',\n '2026-07-28',\n] as const\nexport const MODERN_PROTOCOL_VERSION = '2026-07-28'\n\nexport type Era = 'legacy' | 'modern'\n\n/** `modern` for 2026-07-28 and later (date-shaped versions compare lexically), else `legacy`. */\nexport function eraOf(protocolVersion: string | undefined): Era | undefined {\n if (typeof protocolVersion !== 'string' || !/^\\d{4}-\\d{2}-\\d{2}$/u.test(protocolVersion)) {\n return undefined\n }\n return protocolVersion >= MODERN_PROTOCOL_VERSION ? 'modern' : 'legacy'\n}\n\n// ---------------------------------------------------------------------------\n// Error-code expectations (for the phase-2 live runner)\n// ---------------------------------------------------------------------------\n\nexport interface ExpectedCode {\n code: number\n name: string\n /** Other codes a tolerant assertion should accept (backwards compatibility). */\n alsoAccept?: number[]\n}\n\nexport interface ErrorCodeExpectation {\n situation: string\n /** 2026-07-28 and later. */\n modern: ExpectedCode\n /** 2025-era revisions; null when the situation has no JSON-RPC error there. */\n legacy: ExpectedCode | null\n note?: string\n}\n\nexport type ErrorSituation =\n | 'unsupportedProtocolVersion'\n | 'headerMismatch'\n | 'missingRequiredClientCapability'\n | 'resourceNotFound'\n | 'unknownTool'\n | 'invalidParams'\n | 'methodNotFound'\n\nexport const errorCodeExpectations: Readonly<Record<ErrorSituation, ErrorCodeExpectation>> = {\n unsupportedProtocolVersion: {\n situation: 'Request names a protocol version the server does not support',\n modern: { code: -32022, name: 'UnsupportedProtocolVersion' },\n legacy: null,\n note: '2025-era servers answer initialize with a version they do support instead of erroring.',\n },\n headerMismatch: {\n situation: 'HTTP Mcp-* headers disagree with the JSON-RPC body (Streamable HTTP)',\n modern: { code: -32020, name: 'HeaderMismatch' },\n legacy: null,\n note: '2025-era HTTP servers reject with a plain 400 and no assigned JSON-RPC code.',\n },\n missingRequiredClientCapability: {\n situation: 'Request needs a client capability the client did not declare',\n modern: { code: -32021, name: 'MissingRequiredClientCapability' },\n legacy: null,\n },\n resourceNotFound: {\n situation: 'resources/read for a URI the server does not have',\n modern: { code: -32602, name: 'InvalidParams' },\n legacy: { code: -32002, name: 'ResourceNotFound', alsoAccept: [-32602] },\n note: 'Renumbered in 2026-07-28. SDK v2 servers emit -32602 on every revision, so legacy assertions also accept it.',\n },\n unknownTool: {\n situation: 'tools/call names a tool that does not exist',\n modern: { code: -32602, name: 'InvalidParams' },\n legacy: { code: -32602, name: 'InvalidParams' },\n },\n invalidParams: {\n situation: 'Request params fail the method schema',\n modern: { code: -32602, name: 'InvalidParams' },\n legacy: { code: -32602, name: 'InvalidParams' },\n },\n methodNotFound: {\n situation: 'Unknown JSON-RPC method (or capability not offered)',\n modern: { code: -32601, name: 'MethodNotFound' },\n legacy: { code: -32601, name: 'MethodNotFound' },\n },\n}\n\n/** The code to expect for `situation` under `protocolVersion`; undefined when none applies. */\nexport function expectedErrorCode(\n situation: ErrorSituation,\n protocolVersion: string,\n): ExpectedCode | undefined {\n const row = errorCodeExpectations[situation]\n const era = eraOf(protocolVersion) ?? 'modern'\n return (era === 'modern' ? row.modern : row.legacy) ?? undefined\n}\n\n// ---------------------------------------------------------------------------\n// Inputs\n// ---------------------------------------------------------------------------\n\nexport type SchemaValidator = (schema: JsonValue) => {\n ok: boolean\n /** `keyword` is the failing JSON Schema keyword when known (`$ref` for unresolved refs). */\n errors: Array<{ path: string; message: string; keyword?: string }>\n}\n\nexport interface SpecInput extends ManifestLike {\n /** Two or more consecutive tools/list results, in call order. */\n toolsListSamples?: ToolSummary[][]\n}\n\nexport interface SpecOptions extends LintOptions {\n /** Defaults to `isValidSchema` from src/schema.ts (Ajv 2020-12). */\n validateSchema?: SchemaValidator\n}\n\ninterface SpecContext {\n version?: string\n era?: Era\n validate: SchemaValidator\n}\n\ninterface CheckResult {\n findings: Finding[]\n passDetail?: string\n}\n\nexport interface SpecCheck extends RuleMeta {\n run(input: SpecInput, ctx: SpecContext): CheckResult\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v)\n}\n\nfunction q(s: string): string {\n return JSON.stringify(s)\n}\n\nfunction toolList(v: unknown): ToolSummary[] {\n return Array.isArray(v) ? (v.filter(isRecord) as unknown as ToolSummary[]) : []\n}\n\nfunction toolSubject(t: ToolSummary, i: number): { subject: string; key: string } {\n return typeof t.name === 'string' && t.name !== ''\n ? { subject: `tool ${q(t.name)}`, key: t.name }\n : { subject: `tools[${i}]`, key: `#${i}` }\n}\n\n/** Key-order-insensitive canonical JSON. */\nfunction canonical(v: unknown): string {\n if (Array.isArray(v)) return `[${v.map(canonical).join(',')}]`\n if (isRecord(v)) {\n const keys = Object.keys(v)\n .filter((k) => v[k] !== undefined)\n .sort()\n return `{${keys.map((k) => `${q(k)}:${canonical(v[k])}`).join(',')}}`\n }\n return JSON.stringify(v) ?? 'null'\n}\n\nconst SCHEMA_FIELDS = ['inputSchema', 'outputSchema'] as const\nconst DIALECT_2020_12 = /^https?:\\/\\/json-schema\\.org\\/draft\\/2020-12\\/schema#?$/u\n\nfunction foreignDialect(schema: unknown): string | undefined {\n if (!isRecord(schema) || typeof schema.$schema !== 'string') return undefined\n return DIALECT_2020_12.test(schema.$schema) ? undefined : schema.$schema\n}\n\nfunction eachSchema(\n input: SpecInput,\n fn: (schema: unknown, field: string, who: { subject: string; key: string }) => void,\n): number {\n let n = 0\n toolList(input.tools).forEach((tool, i) => {\n for (const field of SCHEMA_FIELDS) {\n const schema = tool[field]\n if (schema === undefined) continue\n n++\n fn(schema, field, toolSubject(tool, i))\n }\n })\n return n\n}\n\n// ---------------------------------------------------------------------------\n// Checks\n// ---------------------------------------------------------------------------\n\nfunction protocolVersion(input: SpecInput): CheckResult {\n const v = input.protocolVersion\n if (typeof v !== 'string' || v === '') {\n return {\n findings: [\n { message: 'no protocolVersion reported; server/discover (or initialize) did not succeed' },\n ],\n }\n }\n if ((KNOWN_PROTOCOL_VERSIONS as readonly string[]).includes(v)) {\n return { findings: [], passDetail: `${v} (${eraOf(v)} era)` }\n }\n if (/^\\d{4}-\\d{2}-\\d{2}$/u.test(v) && v > MODERN_PROTOCOL_VERSION) {\n return {\n findings: [\n {\n message: `protocolVersion ${q(v)} is newer than this Vibrissa knows (${MODERN_PROTOCOL_VERSION}); checks use ${MODERN_PROTOCOL_VERSION} rules`,\n informational: true,\n },\n ],\n }\n }\n return {\n findings: [\n {\n message: `protocolVersion ${q(v)} is not a recognized MCP revision (${KNOWN_PROTOCOL_VERSIONS.join(', ')})`,\n },\n ],\n }\n}\n\nfunction describeToolDiff(a: ToolSummary, b: ToolSummary): string[] {\n const ra = a as unknown as Record<string, unknown>\n const rb = b as unknown as Record<string, unknown>\n const keys = [...new Set([...Object.keys(ra), ...Object.keys(rb)])].sort()\n return keys.filter((k) => canonical(ra[k]) !== canonical(rb[k]))\n}\n\nfunction toolsListStable(input: SpecInput, ctx: SpecContext): CheckResult {\n const samples = Array.isArray(input.toolsListSamples) ? input.toolsListSamples.map(toolList) : []\n if (samples.length < 2) {\n return {\n findings: [\n {\n message: 'not checked: needs two consecutive tools/list results (toolsListSamples)',\n informational: true,\n },\n ],\n }\n }\n // Determinism is a MUST from 2026-07-28; on older eras it is advice.\n const severity = ctx.era === 'legacy' ? ('warned' as const) : undefined\n const eraNote =\n ctx.era === 'legacy' ? ` (${ctx.version} does not require determinism; 2026-07-28 does)` : ''\n const findings: Finding[] = []\n for (let i = 1; i < samples.length; i++) {\n const prev = samples[i - 1]\n const next = samples[i]\n const label = `calls ${i} and ${i + 1}`\n const pn = prev.map((t) => String(t.name))\n const nn = next.map((t) => String(t.name))\n const added = nn.filter((n) => !pn.includes(n))\n const removed = pn.filter((n) => !nn.includes(n))\n if (added.length || removed.length || pn.length !== nn.length) {\n const parts = [\n added.length ? `added ${added.map(q).join(', ')}` : '',\n removed.length ? `removed ${removed.map(q).join(', ')}` : '',\n ].filter(Boolean)\n findings.push({\n message: `tool set changed between ${label}: ${parts.join('; ') || `${pn.length} vs ${nn.length} entries`}${eraNote}`,\n severity,\n })\n continue\n }\n const at = pn.findIndex((n, j) => n !== nn[j])\n if (at !== -1) {\n findings.push({\n message: `order changed between ${label} at index ${at}: ${q(pn[at])} then ${q(nn[at])}${eraNote}`,\n severity,\n })\n continue\n }\n prev.forEach((t, j) => {\n const fields = describeToolDiff(t, next[j])\n if (fields.length) {\n findings.push({\n subject: `tool ${q(pn[j])}`,\n key: pn[j],\n message: `definition changed between ${label} (${fields.join(', ')})${eraNote}`,\n severity,\n })\n }\n })\n }\n return {\n findings,\n passDetail: `${samples.length} samples, ${samples[0].length} tool(s), identical`,\n }\n}\n\nconst LISTS: Array<keyof ListMeta> = ['tools', 'resources', 'resourceTemplates', 'prompts']\nconst LIST_METHOD: Record<keyof ListMeta, string> = {\n tools: 'tools/list',\n resources: 'resources/list',\n resourceTemplates: 'resources/templates/list',\n prompts: 'prompts/list',\n}\n\nfunction listCacheMetadata(input: SpecInput, ctx: SpecContext): CheckResult {\n if (ctx.era !== 'modern') {\n const why = ctx.version ? `server negotiated ${ctx.version}` : 'protocol version unknown'\n return {\n findings: [\n {\n message: `skipped: ttlMs/cacheScope are required from ${MODERN_PROTOCOL_VERSION}; ${why}`,\n informational: true,\n },\n ],\n }\n }\n const meta = isRecord(input.listMeta) ? (input.listMeta as ListMeta) : undefined\n const checked = LISTS.filter((l) => meta?.[l] !== undefined)\n if (!meta || checked.length === 0) {\n return {\n findings: [\n {\n message: 'not checked: no list metadata supplied (listMeta)',\n informational: true,\n },\n ],\n }\n }\n const findings: Finding[] = []\n const seen: string[] = []\n for (const list of checked) {\n const entry = meta[list]\n const method = LIST_METHOD[list]\n if (!isRecord(entry)) {\n findings.push({ subject: method, key: list, message: 'list metadata is not an object' })\n continue\n }\n const { ttlMs, cacheScope } = entry\n if (ttlMs === undefined) {\n findings.push({ subject: method, key: list, message: 'result is missing ttlMs' })\n } else if (typeof ttlMs !== 'number' || !Number.isFinite(ttlMs) || ttlMs < 0) {\n findings.push({\n subject: method,\n key: list,\n message: `ttlMs is ${JSON.stringify(ttlMs)}; expected a number >= 0`,\n })\n }\n if (cacheScope === undefined) {\n findings.push({ subject: method, key: list, message: 'result is missing cacheScope' })\n } else if (cacheScope !== 'public' && cacheScope !== 'private') {\n findings.push({\n subject: method,\n key: list,\n message: `cacheScope is ${JSON.stringify(cacheScope)}; expected \"public\" or \"private\"`,\n })\n }\n seen.push(`${method} ttlMs=${JSON.stringify(ttlMs)} cacheScope=${JSON.stringify(cacheScope)}`)\n }\n return { findings, passDetail: seen.join('; ') }\n}\n\nfunction schemaValid(input: SpecInput, ctx: SpecContext): CheckResult {\n const findings: Finding[] = []\n const total = eachSchema(input, (schema, field, who) => {\n let result: ReturnType<SchemaValidator>\n try {\n result = ctx.validate(schema as JsonValue)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n findings.push({ ...who, message: `${field} could not be compiled: ${msg}` })\n return\n }\n if (result.ok) return\n // The validator also compiles $refs; unresolved ones are reported once, by spec/schema-refs.\n const onlyRefErrors =\n result.errors.length > 0 && result.errors.every((e) => e.keyword === '$ref')\n if (onlyRefErrors && findUnresolvedRefs(schema).length > 0) return\n const errs = result.errors.slice(0, 3).map((e) => `${e.path || '/'} ${e.message}`)\n const more = result.errors.length > 3 ? ` (+${result.errors.length - 3} more)` : ''\n const dialect = foreignDialect(schema)\n ? `JSON Schema (${foreignDialect(schema)})`\n : 'JSON Schema 2020-12'\n findings.push({\n ...who,\n message: `${field} is not a valid ${dialect}: ${errs.join('; ') || 'invalid'}${more}`,\n })\n })\n return { findings, passDetail: `${total} schema(s) valid` }\n}\n\nfunction schemaDialect(input: SpecInput): CheckResult {\n const findings: Finding[] = []\n eachSchema(input, (schema, field, who) => {\n const d = foreignDialect(schema)\n if (d) {\n findings.push({\n ...who,\n message: `${field} declares $schema ${q(d)}; MCP's default dialect is 2020-12 and clients may not support others`,\n })\n }\n })\n return { findings }\n}\n\nfunction schemaRefs(input: SpecInput): CheckResult {\n const findings: Finding[] = []\n let refsChecked = 0\n eachSchema(input, (schema, field, who) => {\n refsChecked++\n for (const p of findUnresolvedRefs(schema)) {\n findings.push({ ...who, message: `${field}${p.at}: $ref ${q(p.ref)} ${p.message}` })\n }\n })\n return { findings, passDetail: `${refsChecked} schema(s) checked` }\n}\n\nconst MAX_NOISE_SAMPLES = 3\n\nfunction stdoutClean(input: SpecInput): CheckResult {\n const noise = input.stdoutNoise as unknown\n if (!isRecord(noise)) {\n if (input.transport === 'stdio') {\n return {\n findings: [\n {\n message: 'not checked: no stdout capture supplied (stdoutNoise)',\n informational: true,\n },\n ],\n }\n }\n const why = input.transport === 'http' ? 'not applicable (http transport)' : 'not checked'\n return { findings: [], passDetail: why }\n }\n const sample = Array.isArray(noise.sample)\n ? noise.sample.filter((s): s is string => typeof s === 'string')\n : []\n const lines =\n typeof noise.lines === 'number' && Number.isFinite(noise.lines) ? noise.lines : sample.length\n if (lines <= 0) return { findings: [], passDetail: 'stdout carried only JSON-RPC' }\n const shown = sample.slice(0, MAX_NOISE_SAMPLES).map((s) => q(clip(s, 120)))\n const more = sample.length > shown.length ? ` (+${sample.length - shown.length} more)` : ''\n const eg = shown.length ? `, e.g. ${shown.join(', ')}${more}` : ''\n return {\n findings: [\n {\n message: `${lines} non-JSON-RPC line(s) on stdout${eg}. Write logs to stderr: on the stdio transport stdout must carry only JSON-RPC messages`,\n },\n ],\n }\n}\n\nfunction serverIdentity(input: SpecInput): CheckResult {\n const s = isRecord(input.server) ? input.server : {}\n const findings: Finding[] = []\n for (const k of ['name', 'version'] as const) {\n if (typeof s[k] !== 'string' || s[k] === '') {\n findings.push({ message: `server ${k} missing (serverInfo.${k})` })\n }\n }\n return { findings, passDetail: `${s.name}@${s.version}` }\n}\n\nexport const KNOWN_SERVER_CAPABILITIES = [\n 'experimental',\n 'logging',\n 'completions',\n 'prompts',\n 'resources',\n 'tools',\n 'tasks',\n 'extensions',\n] as const\n\nconst CAPABILITY_FLAGS: Record<string, readonly string[]> = {\n tools: ['listChanged'],\n prompts: ['listChanged'],\n resources: ['subscribe', 'listChanged'],\n}\n\nfunction capabilities(input: SpecInput): CheckResult {\n const caps = input.capabilities\n if (caps === undefined) return { findings: [{ message: 'no capabilities reported' }] }\n if (!isRecord(caps)) return { findings: [{ message: 'capabilities is not an object' }] }\n const findings: Finding[] = []\n const known = KNOWN_SERVER_CAPABILITIES as readonly string[]\n for (const [k, v] of Object.entries(caps)) {\n if (!known.includes(k)) {\n findings.push({\n message: `unknown top-level capability ${q(k)}; put custom capabilities under \"extensions\" (or \"experimental\")`,\n })\n continue\n }\n if (!isRecord(v)) {\n findings.push({ message: `capabilities.${k} is ${JSON.stringify(v)}; expected an object` })\n continue\n }\n for (const flag of CAPABILITY_FLAGS[k] ?? []) {\n if (v[flag] !== undefined && typeof v[flag] !== 'boolean') {\n findings.push({\n message: `capabilities.${k}.${flag} is ${JSON.stringify(v[flag])}; expected a boolean`,\n })\n }\n }\n if (\n (k === 'extensions' || k === 'experimental') &&\n Object.values(v).some((e) => !isRecord(e))\n ) {\n findings.push({ message: `every entry of capabilities.${k} must be an object` })\n }\n }\n const advertised: Array<[string, unknown[] | undefined]> = [\n ['tools', input.tools],\n ['resources', input.resources],\n ['prompts', input.prompts],\n ]\n for (const [cap, items] of advertised) {\n if (Array.isArray(items) && items.length > 0 && caps[cap] === undefined) {\n findings.push({\n message: `server lists ${items.length} ${cap} but does not advertise the \"${cap}\" capability`,\n })\n }\n }\n return { findings, passDetail: Object.keys(caps).join(', ') || '(none)' }\n}\n\n// biome-ignore format: one check per line keeps the table scannable\nexport const SPEC_CHECKS: readonly SpecCheck[] = [\n { id: 'spec/protocol-version', title: 'Discover reports a recognized protocol version', severity: 'failed', run: protocolVersion },\n { id: 'spec/stdout-clean', title: 'stdio server keeps stdout for JSON-RPC only', severity: 'failed', run: stdoutClean },\n { id: 'spec/tools-list-stable', title: 'tools/list is deterministic across calls', severity: 'failed', run: toolsListStable },\n { id: 'spec/list-cache-metadata', title: 'List results carry ttlMs and cacheScope', severity: 'failed', run: listCacheMetadata },\n { id: 'spec/schema-valid', title: 'Tool schemas are valid JSON Schema 2020-12', severity: 'failed', run: schemaValid },\n { id: 'spec/schema-dialect', title: 'Tool schemas use the 2020-12 dialect', severity: 'warned', run: schemaDialect },\n { id: 'spec/schema-refs', title: 'Every $ref resolves inside its schema', severity: 'failed', run: schemaRefs },\n { id: 'spec/server-identity', title: 'Server reports name and version', severity: 'warned', run: serverIdentity },\n { id: 'spec/capabilities', title: 'Capabilities object is well-formed', severity: 'warned', run: capabilities },\n]\n\n/** Run every spec-sanity check over `input`. Pure; sorted failed -> warned -> passed. */\nexport function checkSpec(input: SpecInput, opts: SpecOptions = {}): CheckOutcome[] {\n const data: SpecInput = isRecord(input) ? input : { tools: [] }\n const version = typeof data.protocolVersion === 'string' ? data.protocolVersion : undefined\n const ctx: SpecContext = {\n version,\n era: eraOf(version),\n validate: opts.validateSchema ?? isValidSchema,\n }\n const out: CheckOutcome[] = []\n for (const check of SPEC_CHECKS) {\n if (isAllowed(opts.allow, check.id)) continue\n const { findings, passDetail } = check.run(data, ctx)\n out.push(...buildOutcomes(check, findings, opts, passDetail))\n }\n return sortOutcomes(out)\n}\n","/**\n * `vib check` engine: spec-sanity checks + description lint over a manifest.\n * Pure: give it data recorded from a session, get CheckOutcome[] back.\n */\nimport type { CheckOutcome } from '../events.js'\nimport { DESCRIPTION_RULES, type DescriptionLintOptions, lintDescriptions } from './descriptions.js'\nimport { type Severity, sortOutcomes } from './outcomes.js'\nimport { SPEC_CHECKS, type SchemaValidator, checkSpec } from './spec.js'\nimport type { ManifestLike, ToolSummary } from './types.js'\n\nexport * from './types.js'\nexport {\n DESCRIPTION_RULES,\n HIDDEN_INSTRUCTION_PATTERNS,\n IMPERATIVE_PATTERNS,\n SENSITIVE_PATH_PATTERNS,\n collectTextSources,\n lintDescriptions,\n mentionPattern,\n type DescriptionLintOptions,\n type DescriptionRule,\n type Pattern,\n type TextSource,\n} from './descriptions.js'\nexport {\n KNOWN_PROTOCOL_VERSIONS,\n KNOWN_SERVER_CAPABILITIES,\n MODERN_PROTOCOL_VERSION,\n SPEC_CHECKS,\n checkSpec,\n eraOf,\n errorCodeExpectations,\n expectedErrorCode,\n type Era,\n type ErrorCodeExpectation,\n type ErrorSituation,\n type ExpectedCode,\n type SchemaValidator,\n type SpecInput,\n type SpecOptions,\n} from './spec.js'\nexport { findUnresolvedRefs, type RefProblem } from './refs.js'\nexport {\n isAllowed,\n sortOutcomes,\n summarizeChecks,\n type LintOptions,\n type Severity,\n} from './outcomes.js'\n\nexport interface RunChecksOptions {\n /** Two or more consecutive tools/list results, for `spec/tools-list-stable`. */\n toolsListSamples?: ToolSummary[][]\n /** Check ids to skip (`id`, `prefix/*`, or `id:subject`). Config: `checks.allow`. */\n allow?: string[]\n /** Severity overrides by check id. Config: `checks.severity`. */\n severity?: Record<string, Severity>\n /** Tool names from other configured servers, for cross-server shadowing detection. */\n knownToolNames?: string[]\n maxDescriptionLength?: DescriptionLintOptions['maxDescriptionLength']\n /** Override the JSON Schema validator (defaults to src/schema.ts `isValidSchema`). */\n validateSchema?: SchemaValidator\n}\n\n/** Every check id with its title and default severity, in table order. */\nexport function listChecks(): Array<{ id: string; title: string; severity: Severity }> {\n return [...SPEC_CHECKS, ...DESCRIPTION_RULES].map(({ id, title, severity }) => ({\n id,\n title,\n severity,\n }))\n}\n\n/**\n * Run spec-sanity checks and description lint over a manifest.\n * Returns outcomes sorted failed -> warned -> passed (then by id).\n */\nexport function runChecks(manifest: ManifestLike, opts: RunChecksOptions = {}): CheckOutcome[] {\n const common = { allow: opts.allow, severity: opts.severity }\n const spec = checkSpec(\n { ...manifest, toolsListSamples: opts.toolsListSamples },\n { ...common, validateSchema: opts.validateSchema },\n )\n const desc = lintDescriptions(manifest.tools, {\n ...common,\n resources: manifest.resources,\n resourceTemplates: manifest.resourceTemplates,\n prompts: manifest.prompts,\n instructions: manifest.instructions,\n knownToolNames: opts.knownToolNames,\n maxDescriptionLength: opts.maxDescriptionLength,\n })\n return sortOutcomes([...spec, ...desc])\n}\n","/**\n * Manifest lock: a stable, reviewable snapshot of a server's whole MCP surface\n * (`server/discover` + every list verb), and a structured diff between two snapshots.\n *\n * `vib manifest record` writes it; `vib run` diffs the live manifest against it and fails\n * on drift (added/removed tools, changed schemas, descriptions, annotations, capabilities).\n * It doubles as rug-pull detection: any change to model-visible text shows up in review.\n */\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { DEFAULT_MANIFEST_IGNORE_PATHS, DEFAULT_MANIFEST_PATH } from './defaults.js'\nimport type { ListMeta, ListMetaEntry } from './lint/types.js'\nimport { defaultNormalizeConfig, normalizeResult } from './normalize.js'\nimport { type McpSession, SessionRequestError } from './session/index.js'\nimport type {\n DiscoverInfo,\n JsonObject,\n JsonValue,\n ListResult,\n PromptSummary,\n ResourceSummary,\n ResourceTemplateSummary,\n RunOptions,\n ToolSummary,\n} from './types.js'\n\nexport const MANIFEST_VERSION = 2\n\n/**\n * Dotted paths ignored by diffManifest unless overridden (`manifestIgnore`): the server's\n * release version, and what differs only by protocol era (`protocolVersion`, `listMeta`), so\n * one lock serves both eras. `vib manifest diff --strict` compares everything.\n */\nexport const DEFAULT_MANIFEST_IGNORE: readonly string[] = DEFAULT_MANIFEST_IGNORE_PATHS\n\nexport interface Manifest {\n vibrissa: 2\n protocolVersion: string\n server: { name?: string; version?: string }\n capabilities: JsonValue\n instructions?: string\n /** Sorted by name. */\n tools: ToolSummary[]\n /** Sorted by uri. */\n resources: ResourceSummary[]\n /** Sorted by uriTemplate. */\n resourceTemplates: ResourceTemplateSummary[]\n /** Sorted by name. */\n prompts: PromptSummary[]\n /** `ttlMs` / `cacheScope` of each list result that was fetched. */\n listMeta: ListMeta\n}\n\nexport interface CaptureManifestOptions {\n /** How many tools/list results to collect for the stability check. Default 1. */\n toolsListSamples?: number\n}\n\nexport interface CapturedManifest {\n manifest: Manifest\n /** Raw tools/list results in server order (the first one built the manifest). */\n toolsListSamples: ToolSummary[][]\n discover: DiscoverInfo\n}\n\n// ---------------------------------------------------------------------------\n// Build\n// ---------------------------------------------------------------------------\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction compare(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0\n}\n\nconst ITEM_NORMALIZE = {\n stripMeta: defaultNormalizeConfig.stripMeta,\n dropKeys: [] as string[],\n ttlMs: 'keep' as const,\n}\n\n/** Copy `keys` (in this order, then any others sorted), then strip per-version `_meta`. */\nfunction ordered<T>(source: object, keys: readonly string[]): T {\n const record = source as Record<string, unknown>\n const out: JsonObject = {}\n for (const key of keys) {\n if (record[key] !== undefined) out[key] = record[key] as JsonValue\n }\n for (const key of Object.keys(record).sort()) {\n if (!keys.includes(key) && record[key] !== undefined) out[key] = record[key] as JsonValue\n }\n return normalizeResult(out, ITEM_NORMALIZE) as T\n}\n\nconst TOOL_KEYS = [\n 'name',\n 'title',\n 'description',\n 'inputSchema',\n 'outputSchema',\n 'annotations',\n 'icons',\n 'execution',\n '_meta',\n]\nconst RESOURCE_KEYS = [\n 'uri',\n 'name',\n 'title',\n 'description',\n 'mimeType',\n 'size',\n 'annotations',\n 'icons',\n '_meta',\n]\nconst TEMPLATE_KEYS = [\n 'uriTemplate',\n 'name',\n 'title',\n 'description',\n 'mimeType',\n 'annotations',\n 'icons',\n '_meta',\n]\nconst PROMPT_KEYS = ['name', 'title', 'description', 'arguments', 'icons', '_meta']\nconst PROMPT_ARG_KEYS = ['name', 'title', 'description', 'required']\n\nfunction metaEntry(list: ListResult<unknown>): ListMetaEntry {\n return {\n ...(list.ttlMs !== undefined ? { ttlMs: list.ttlMs } : {}),\n ...(list.cacheScope !== undefined ? { cacheScope: list.cacheScope } : {}),\n }\n}\n\nfunction declares(capabilities: JsonValue, key: string): boolean {\n return isObject(capabilities) && capabilities[key] !== undefined\n}\n\nfunction isMethodNotFound(err: unknown): boolean {\n return (\n err instanceof SessionRequestError &&\n (err.error.code === -32601 || err.error.codeName === 'MethodNotFound')\n )\n}\n\nasync function optionalList<T>(\n run: () => Promise<ListResult<T>>,\n wanted: boolean,\n): Promise<ListResult<T> | undefined> {\n if (!wanted) return undefined\n try {\n return await run()\n } catch (err) {\n if (isMethodNotFound(err)) return undefined\n throw err\n }\n}\n\n/** Assemble a Manifest from already-fetched data (pure). */\nexport function manifestFrom(input: {\n protocolVersion: string\n discover: Pick<DiscoverInfo, 'serverInfo' | 'capabilities' | 'instructions'>\n tools?: ListResult<ToolSummary>\n resources?: ListResult<ResourceSummary>\n resourceTemplates?: ListResult<ResourceTemplateSummary>\n prompts?: ListResult<PromptSummary>\n}): Manifest {\n const info = input.discover.serverInfo\n const listMeta: ListMeta = {}\n if (input.tools) listMeta.tools = metaEntry(input.tools)\n if (input.resources) listMeta.resources = metaEntry(input.resources)\n if (input.resourceTemplates) listMeta.resourceTemplates = metaEntry(input.resourceTemplates)\n if (input.prompts) listMeta.prompts = metaEntry(input.prompts)\n return {\n vibrissa: MANIFEST_VERSION,\n protocolVersion: input.protocolVersion,\n server: {\n ...(typeof info?.name === 'string' ? { name: info.name } : {}),\n ...(typeof info?.version === 'string' ? { version: info.version } : {}),\n },\n capabilities: normalizeResult(input.discover.capabilities ?? {}, ITEM_NORMALIZE),\n ...(input.discover.instructions !== undefined\n ? { instructions: input.discover.instructions }\n : {}),\n tools: (input.tools?.items ?? [])\n .map((tool) => ordered<ToolSummary>(tool, TOOL_KEYS))\n .sort((a, b) => compare(a.name, b.name)),\n resources: (input.resources?.items ?? [])\n .map((r) => ordered<ResourceSummary>(r, RESOURCE_KEYS))\n .sort((a, b) => compare(a.uri, b.uri)),\n resourceTemplates: (input.resourceTemplates?.items ?? [])\n .map((t) => ordered<ResourceTemplateSummary>(t, TEMPLATE_KEYS))\n .sort((a, b) => compare(a.uriTemplate, b.uriTemplate)),\n prompts: (input.prompts?.items ?? [])\n .map((p) =>\n ordered<PromptSummary>(\n {\n ...p,\n ...(p.arguments\n ? { arguments: p.arguments.map((arg) => ordered(arg, PROMPT_ARG_KEYS)) }\n : {}),\n },\n PROMPT_KEYS,\n ),\n )\n .sort((a, b) => compare(a.name, b.name)),\n listMeta,\n }\n}\n\n/**\n * Snapshot the live server: discover + tools/list (+ resources, templates, prompts when the\n * server declares them). Lists the server does not implement (MethodNotFound) are empty.\n * Throws SessionRequestError when a list call fails for another reason.\n */\nexport async function captureManifest(\n session: McpSession,\n opts: CaptureManifestOptions = {},\n): Promise<CapturedManifest> {\n const discover = await session.discover()\n const caps = discover.capabilities\n const tools = await optionalList(() => session.listToolsResult(), true)\n const samples: ToolSummary[][] = tools ? [tools.items] : []\n for (let i = 1; i < (opts.toolsListSamples ?? 1) && tools; i++) {\n samples.push((await session.listToolsResult()).items)\n }\n const resources = await optionalList(\n () => session.listResourcesResult(),\n declares(caps, 'resources'),\n )\n const resourceTemplates = await optionalList(\n () => session.listResourceTemplatesResult(),\n declares(caps, 'resources'),\n )\n const prompts = await optionalList(() => session.listPromptsResult(), declares(caps, 'prompts'))\n const manifest = manifestFrom({\n protocolVersion: session.protocolVersion || discover.protocolVersion,\n discover,\n tools,\n resources,\n resourceTemplates,\n prompts,\n })\n return { manifest, toolsListSamples: samples, discover }\n}\n\n/** Snapshot the live server's manifest. */\nexport async function buildManifest(session: McpSession): Promise<Manifest> {\n return (await captureManifest(session)).manifest\n}\n\n// ---------------------------------------------------------------------------\n// Files\n// ---------------------------------------------------------------------------\n\n/**\n * Lock file for `server`: the configured `manifest` path for the default server, and a\n * sibling `<name>.<server>.json` for any other server (e.g. `__manifest__.staging.json`).\n */\nexport function manifestPathFor(\n options: Pick<RunOptions, 'manifest' | 'rootDir' | 'defaultServer'>,\n server: string = options.defaultServer,\n): string {\n const configured = options.manifest ?? DEFAULT_MANIFEST_PATH\n const root = options.rootDir ? path.resolve(options.rootDir) : process.cwd()\n const base = path.isAbsolute(configured) ? configured : path.resolve(root, configured)\n if (server === options.defaultServer) return base\n const ext = path.extname(base)\n const safe = server.replace(/[^A-Za-z0-9_.-]/g, '_')\n return ext ? `${base.slice(0, -ext.length)}.${safe}${ext}` : `${base}.${safe}`\n}\n\nexport class ManifestFileError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ManifestFileError'\n }\n}\n\n/** Read and sanity-check a manifest lock file. */\nexport function readManifest(file: string): Manifest {\n let raw: unknown\n try {\n raw = JSON.parse(fs.readFileSync(file, 'utf8'))\n } catch (err) {\n throw new ManifestFileError(\n `Invalid manifest at ${file}: ${err instanceof Error ? err.message : String(err)}. Re-create it with \"vib manifest record\".`,\n )\n }\n if (!isObject(raw) || raw.vibrissa !== MANIFEST_VERSION || !Array.isArray(raw.tools)) {\n const got = isObject(raw) ? `an object with keys ${Object.keys(raw).join(', ')}` : typeof raw\n throw new ManifestFileError(\n `Invalid manifest at ${file}: expected { \"vibrissa\": 2, \"tools\": [...], ... }, got ${got}. Re-create it with \"vib manifest record\".`,\n )\n }\n const m = raw as unknown as Manifest\n return {\n ...m,\n server: m.server ?? {},\n capabilities: m.capabilities ?? {},\n resources: m.resources ?? [],\n resourceTemplates: m.resourceTemplates ?? [],\n prompts: m.prompts ?? [],\n listMeta: m.listMeta ?? {},\n }\n}\n\n/** Write a manifest as 2-space JSON (creating directories). */\nexport function writeManifest(file: string, manifest: Manifest): void {\n fs.mkdirSync(path.dirname(file), { recursive: true })\n fs.writeFileSync(file, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8')\n}\n\n// ---------------------------------------------------------------------------\n// Diff\n// ---------------------------------------------------------------------------\n\nexport interface FieldChange {\n /**\n * Dotted sub-path of what changed, as deep as it goes: `description`,\n * `inputSchema.required`, `inputSchema.properties.city.type`, `capabilities.tools`.\n */\n path: string\n /** Absent when the field was added. */\n before?: JsonValue\n /** Absent when the field was removed. */\n after?: JsonValue\n /**\n * Would existing clients / cases break? True for: a removed or renamed input property, a\n * newly required property or prompt argument, a type change, removed enum values, a tightened\n * `additionalProperties`, any outputSchema change, a changed resource mimeType, a removed\n * capability, a protocolVersion change. Descriptions, titles and annotations are not breaking.\n */\n breaking: boolean\n}\n\nexport interface ItemChange {\n /** Tool / prompt name, resource uri, or uriTemplate. */\n key: string\n /** Any of `fields` is breaking. */\n breaking: boolean\n fields: FieldChange[]\n}\n\n/** Only non-empty lists are present. Every removed item is a breaking change. */\nexport interface SectionDiff {\n added?: string[]\n removed?: string[]\n changed?: ItemChange[]\n}\n\nexport const MANIFEST_SECTIONS = ['tools', 'resources', 'resourceTemplates', 'prompts'] as const\nexport type ManifestSection = (typeof MANIFEST_SECTIONS)[number]\n\n/** Machine shape: empty lists and unchanged sections are omitted. */\nexport interface ManifestDiff {\n identical: boolean\n /** At least one breaking change (see FieldChange.breaking) or removed item. */\n breaking: boolean\n /** Server-level changes: protocolVersion, instructions, server.*, capabilities.*, listMeta.* */\n changes?: FieldChange[]\n tools?: SectionDiff\n resources?: SectionDiff\n resourceTemplates?: SectionDiff\n prompts?: SectionDiff\n}\n\nexport interface DiffManifestOptions {\n /**\n * Dotted paths to ignore. Sections are keyed by item name / uri (`tools.*.annotations`,\n * `tools.notes.search.description`); prompt arguments by name\n * (`prompts.*.arguments.*.description`); `*` matches any key. Default\n * `[\"server.version\", \"protocolVersion\", \"listMeta\"]` (per-release and per-era noise); pass\n * `[]` to compare everything (`vib manifest diff --strict`).\n */\n ignore?: readonly string[]\n}\n\nconst SECTION_KEY: Record<ManifestSection, string> = {\n tools: 'name',\n resources: 'uri',\n resourceTemplates: 'uriTemplate',\n prompts: 'name',\n}\n\nfunction canonical(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(canonical).join(',')}]`\n if (isObject(value)) {\n return `{${Object.keys(value)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)\n .join(',')}}`\n }\n return JSON.stringify(value) ?? 'undefined'\n}\n\n/** Deep equality ignoring object key order. */\nexport function jsonEqual(a: unknown, b: unknown): boolean {\n return canonical(a) === canonical(b)\n}\n\nfunction byName(list: unknown): JsonObject | undefined {\n if (!Array.isArray(list)) return undefined\n const out: JsonObject = {}\n for (const item of list) {\n if (isObject(item) && typeof item.name === 'string') out[item.name] = item\n }\n return out\n}\n\n/** Manifest → `{ section: { key: item } }` view used for ignore paths and diffing. */\nfunction keyed(manifest: Manifest): JsonObject {\n const out: JsonObject = {\n protocolVersion: manifest.protocolVersion ?? null,\n server: (manifest.server ?? {}) as JsonObject,\n capabilities: manifest.capabilities ?? {},\n ...(manifest.instructions !== undefined ? { instructions: manifest.instructions } : {}),\n listMeta: (manifest.listMeta ?? {}) as JsonObject,\n }\n for (const section of MANIFEST_SECTIONS) {\n const items: JsonObject = {}\n for (const raw of (manifest[section] ?? []) as unknown as JsonObject[]) {\n let item: JsonObject = raw\n if (section === 'prompts' && Array.isArray(raw.arguments)) {\n item = { ...raw, arguments: byName(raw.arguments) ?? {} }\n }\n items[String(raw[SECTION_KEY[section]])] = item\n }\n out[section] = items\n }\n return out\n}\n\n/** Remove a dotted path (with `*` wildcards; keys may themselves contain dots). */\nfunction omit(value: JsonValue, segments: string[]): JsonValue | undefined {\n if (segments.length === 0) return undefined\n if (!isObject(value)) return value\n const out: JsonObject = {}\n for (const [key, child] of Object.entries(value)) {\n let next: JsonValue | undefined = child\n for (let k = 1; k <= segments.length && next !== undefined; k++) {\n const head = segments.slice(0, k).join('.')\n if (head === key || (k === 1 && segments[0] === '*')) next = omit(next, segments.slice(k))\n }\n if (next !== undefined) out[key] = next\n }\n return out\n}\n\nfunction applyIgnore(view: JsonObject, ignore: readonly string[]): JsonObject {\n let out: JsonValue = view\n for (const pattern of ignore) {\n const segments = pattern.split('.').filter(Boolean)\n if (segments.length > 0) out = omit(out, segments) ?? {}\n }\n return out as JsonObject\n}\n\nfunction segment(key: string): string {\n return /^[A-Za-z_$][\\w$-]*$/.test(key) ? key : `[${JSON.stringify(key)}]`\n}\n\nfunction joinField(prefix: string, key: string): string {\n const seg = segment(key)\n if (!prefix) return seg\n return seg.startsWith('[') ? `${prefix}${seg}` : `${prefix}.${seg}`\n}\n\ninterface RawChange {\n path: string\n segments: string[]\n before?: JsonValue\n after?: JsonValue\n}\n\n/** Leaf-level changes between two values (objects recurse; arrays and scalars are leaves). */\nfunction leafChanges(\n before: JsonValue | undefined,\n after: JsonValue | undefined,\n prefix: string,\n segments: string[],\n): RawChange[] {\n if (jsonEqual(before, after)) return []\n if (isObject(before) && isObject(after)) {\n const keys = [...new Set([...Object.keys(before), ...Object.keys(after)])].sort(compare)\n return keys.flatMap((key) =>\n leafChanges(before[key], after[key], joinField(prefix, key), [...segments, key]),\n )\n }\n return [\n {\n path: prefix,\n segments,\n ...(before !== undefined ? { before } : {}),\n ...(after !== undefined ? { after } : {}),\n },\n ]\n}\n\nfunction stringsOf(value: JsonValue | undefined): string[] {\n return Array.isArray(value) ? value.filter((v): v is string => typeof v === 'string') : []\n}\n\nfunction lostValues(before: JsonValue | undefined, after: JsonValue | undefined): boolean {\n if (!Array.isArray(before)) return false\n const kept = Array.isArray(after) ? after.map(canonical) : []\n return before.some((v) => !kept.includes(canonical(v)))\n}\n\n/** Breaking-ness of a schema leaf change (input side: stricter is breaking). */\nfunction schemaBreaking(change: RawChange, rel: string[]): boolean {\n if (rel.length === 0) return true // the whole schema appeared / disappeared / changed type\n const last = rel[rel.length - 1]\n const parent = rel[rel.length - 2]\n if (parent === 'properties' && change.after === undefined) return true // removed / renamed\n if (last === 'required') {\n const before = stringsOf(change.before)\n return stringsOf(change.after).some((name) => !before.includes(name))\n }\n if (last === 'type') return change.after !== undefined && !jsonEqual(change.before, change.after)\n if (last === 'enum') return change.after !== undefined && lostValues(change.before, change.after)\n if (last === 'additionalProperties') return change.after === false && change.before !== false\n return false\n}\n\nfunction itemBreaking(section: ManifestSection, change: RawChange): boolean {\n const [field, ...rest] = change.segments\n switch (section) {\n case 'tools':\n if (field === 'outputSchema') return true\n if (field === 'inputSchema') return schemaBreaking(change, rest)\n return false\n case 'resources':\n case 'resourceTemplates':\n return field === 'mimeType'\n case 'prompts':\n if (field !== 'arguments') return false\n if (rest.length === 1) {\n // An argument added as required, or removed.\n if (change.after === undefined) return true\n return (\n change.before === undefined && isObject(change.after) && change.after.required === true\n )\n }\n return rest[1] === 'required' && change.after === true && change.before !== true\n }\n}\n\nfunction serverBreaking(change: RawChange): boolean {\n const [field, ...rest] = change.segments\n if (field === 'protocolVersion') return true\n if (field === 'capabilities') return rest.length === 1 && change.after === undefined\n return false\n}\n\nfunction finalize(change: RawChange, breaking: boolean): FieldChange {\n return {\n path: change.path,\n ...(change.before !== undefined ? { before: change.before } : {}),\n ...(change.after !== undefined ? { after: change.after } : {}),\n breaking,\n }\n}\n\nfunction sectionDiff(\n section: ManifestSection,\n before: JsonValue | undefined,\n after: JsonValue | undefined,\n): SectionDiff | undefined {\n const a = isObject(before) ? before : {}\n const b = isObject(after) ? after : {}\n const added = Object.keys(b)\n .filter((key) => !Object.hasOwn(a, key))\n .sort(compare)\n const removed = Object.keys(a)\n .filter((key) => !Object.hasOwn(b, key))\n .sort(compare)\n const changed: ItemChange[] = []\n for (const key of Object.keys(a).sort(compare)) {\n if (!Object.hasOwn(b, key) || jsonEqual(a[key], b[key])) continue\n const fields = leafChanges(a[key], b[key], '', []).map((c) =>\n finalize(c, itemBreaking(section, c)),\n )\n changed.push({ key, breaking: fields.some((f) => f.breaking), fields })\n }\n if (added.length + removed.length + changed.length === 0) return undefined\n return {\n ...(added.length ? { added } : {}),\n ...(removed.length ? { removed } : {}),\n ...(changed.length ? { changed } : {}),\n }\n}\n\n/** Structured diff of a locked manifest against the live one. */\nexport function diffManifest(\n locked: Manifest,\n live: Manifest,\n opts: DiffManifestOptions = {},\n): ManifestDiff {\n const ignore = opts.ignore ?? DEFAULT_MANIFEST_IGNORE\n const a = applyIgnore(keyed(locked), ignore)\n const b = applyIgnore(keyed(live), ignore)\n const changes: FieldChange[] = []\n for (const key of ['protocolVersion', 'instructions', 'server', 'capabilities', 'listMeta']) {\n for (const change of leafChanges(a[key], b[key], key, [key])) {\n changes.push(finalize(change, serverBreaking(change)))\n }\n }\n const diff: ManifestDiff = { identical: true, breaking: false }\n if (changes.length) diff.changes = changes\n for (const section of MANIFEST_SECTIONS) {\n const d = sectionDiff(section, a[section], b[section])\n if (d) diff[section] = d\n }\n diff.identical = !diff.changes && MANIFEST_SECTIONS.every((s) => diff[s] === undefined)\n diff.breaking =\n changes.some((c) => c.breaking) ||\n MANIFEST_SECTIONS.some(\n (s) =>\n (diff[s]?.removed?.length ?? 0) > 0 || (diff[s]?.changed ?? []).some((c) => c.breaking),\n )\n return diff\n}\n\n// ---------------------------------------------------------------------------\n// Rendering\n// ---------------------------------------------------------------------------\n\nconst SECTION_NOUN: Record<ManifestSection, [string, string]> = {\n tools: ['tool', 'tools'],\n resources: ['resource', 'resources'],\n resourceTemplates: ['resource template', 'resource templates'],\n prompts: ['prompt', 'prompts'],\n}\n\nfunction names(list: string[], max = 3): string {\n const shown = list.slice(0, max).join(', ')\n return list.length > max ? `${shown}, +${list.length - max} more` : shown\n}\n\nfunction count(n: number, [one, many]: [string, string]): string {\n return `${n} ${n === 1 ? one : many}`\n}\n\n/**\n * One-line summary: `1 tool changed (echo: description); 1 prompt added (greet)`, ending in\n * ` (breaking)` when any change is breaking.\n */\nexport function summarizeDiff(diff: ManifestDiff): string {\n if (diff.identical) return 'no changes'\n const parts: string[] = []\n for (const section of MANIFEST_SECTIONS) {\n const d = diff[section]\n if (!d) continue\n const noun = SECTION_NOUN[section]\n if (d.added?.length) parts.push(`${count(d.added.length, noun)} added (${names(d.added)})`)\n if (d.removed?.length) {\n parts.push(`${count(d.removed.length, noun)} removed (${names(d.removed)})`)\n }\n if (d.changed?.length) {\n const detail = d.changed\n .slice(0, 3)\n .map(\n (c) =>\n `${c.key}: ${names(\n c.fields.map((f) => f.path),\n 4,\n )}`,\n )\n .join('; ')\n const more = d.changed.length > 3 ? `; +${d.changed.length - 3} more` : ''\n parts.push(`${count(d.changed.length, noun)} changed (${detail}${more})`)\n }\n }\n if (diff.changes?.length) parts.push(`${names(diff.changes.map((c) => c.path))} changed`)\n return `${parts.join('; ')}${diff.breaking ? ' (breaking)' : ''}`\n}\n\nfunction short(value: JsonValue | undefined, max = 120): string {\n if (value === undefined) return '(absent)'\n const text = JSON.stringify(value)\n return text.length > max ? `${text.slice(0, max - 1)}…` : text\n}\n\nconst MAX_WORD_TOKENS = 600\n\n/** Word-level diff in git's `--word-diff=plain` notation: `[-removed-]{+added+}`. */\nexport function wordDiff(before: string, after: string): string | undefined {\n const a = before.match(/\\s+|[^\\s]+/g) ?? []\n const b = after.match(/\\s+|[^\\s]+/g) ?? []\n if (a.length > MAX_WORD_TOKENS || b.length > MAX_WORD_TOKENS) return undefined\n const lcs: number[][] = Array.from({ length: a.length + 1 }, () =>\n new Array(b.length + 1).fill(0),\n )\n for (let i = a.length - 1; i >= 0; i--) {\n for (let j = b.length - 1; j >= 0; j--) {\n lcs[i][j] = a[i] === b[j] ? lcs[i + 1][j + 1] + 1 : Math.max(lcs[i + 1][j], lcs[i][j + 1])\n }\n }\n const ops: Array<['=' | '-' | '+', string]> = []\n const push = (op: '=' | '-' | '+', token: string) => {\n const last = ops[ops.length - 1]\n if (last && last[0] === op) last[1] += token\n else ops.push([op, token])\n }\n let i = 0\n let j = 0\n while (i < a.length && j < b.length) {\n if (a[i] === b[j]) {\n push('=', a[i])\n i++\n j++\n } else if (lcs[i + 1][j] >= lcs[i][j + 1]) push('-', a[i++])\n else push('+', b[j++])\n }\n while (i < a.length) push('-', a[i++])\n while (j < b.length) push('+', b[j++])\n\n // Merge change runs separated only by whitespace into one [-...-]{+...+} pair.\n let out = ''\n let k = 0\n while (k < ops.length) {\n if (ops[k][0] === '=') {\n out += ops[k][1]\n k++\n continue\n }\n let removed = ''\n let added = ''\n while (k < ops.length) {\n const [op, text] = ops[k]\n if (op === '-') removed += text\n else if (op === '+') added += text\n else if (/^\\s+$/.test(text) && k + 1 < ops.length && ops[k + 1][0] !== '=') {\n removed += text\n added += text\n } else break\n k++\n }\n out += `${removed ? `[-${removed}-]` : ''}${added ? `{+${added}+}` : ''}`\n }\n return out\n}\n\nfunction changeLine(change: FieldChange, indent: string): string {\n const tag = change.breaking ? ' (breaking)' : ''\n const { before, after } = change\n if (typeof before === 'string' && typeof after === 'string' && /\\s/.test(before + after)) {\n const words = wordDiff(before, after)\n if (words !== undefined) return `${indent}${change.path}: ${words}${tag}`\n }\n return `${indent}${change.path}: ${short(before)} -> ${short(after)}${tag}`\n}\n\n/**\n * Multi-line, uncolored rendering: one line per changed sub-path (word diff for prose),\n * `+` / `-` per added / removed item, `(breaking)` on breaking lines; empty sections omitted.\n */\nexport function formatDiff(diff: ManifestDiff): string {\n if (diff.identical) return 'Manifest: no changes.'\n const lines: string[] = [`Manifest drift: ${summarizeDiff(diff)}`]\n for (const change of diff.changes ?? []) lines.push(changeLine(change, ' '))\n for (const section of MANIFEST_SECTIONS) {\n const d = diff[section]\n if (!d) continue\n lines.push(` ${section}:`)\n for (const key of d.added ?? []) lines.push(` + ${key} (added)`)\n for (const key of d.removed ?? []) lines.push(` - ${key} (removed) (breaking)`)\n for (const item of d.changed ?? []) {\n lines.push(` ~ ${item.key}`)\n for (const change of item.fields) lines.push(changeLine(change, ' '))\n }\n }\n return lines.join('\\n')\n}\n","/**\n * Matcher engine (pure). Compares an expectation tree from a case file against an actual\n * (normalized) result and returns path-level mismatches. See docs/MATCHERS.md.\n *\n * Plain JSON in an expectation means exact deep equality. Objects whose keys start with\n * `$` and name a matcher (\"directive objects\") are interpreted instead:\n *\n * v1: $partial, $regex (+flags), $wildcard, $unordered (+value)\n * v2: $any, $type, $schema, $oneOf, $contains (+count), $length, $number, $ignore,\n * $ref (expanded by resolveRefs before matching), $literal (escape hatch)\n *\n * Precedence rule: a directive object is only the directive. Plain keys next to a\n * directive are reported as an \"invalid matcher\" mismatch. Several directives in one\n * object must all hold (AND), evaluated in a fixed order that stops at the first failure;\n * $ignore, $ref and $literal must stand alone.\n */\nimport { posix } from 'node:path'\nimport type { Mismatch } from './events.js'\nimport { appendIndex, appendKey, validate as validateAgainstSchema } from './schema.js'\nimport type { JsonValue } from './types.js'\n\nexport type { Mismatch } from './events.js'\n\nexport interface MatchOptions {\n /** Start in partial mode, as if the root expectation carried `\"$partial\": true`. */\n partial?: boolean\n}\n\ninterface MatchContext {\n partial: boolean\n /** Inside `$literal`: directive keys are plain data. */\n literal: boolean\n mismatches: Mismatch[]\n limit: number\n}\n\nexport const MAX_MISMATCHES = 25\n\n/** Evaluation order for AND-combined directives: cheap, specific checks first. */\nconst DIRECTIVES = [\n '$any',\n '$type',\n '$number',\n '$length',\n '$regex',\n '$wildcard',\n '$schema',\n '$contains',\n '$unordered',\n '$oneOf',\n '$ignore',\n '$ref',\n '$literal',\n] as const\n\ntype DirectiveName = (typeof DIRECTIVES)[number]\n\n/** Keys that may accompany a directive (and only that directive). */\nconst AUX_KEYS: Partial<Record<DirectiveName, readonly string[]>> = {\n $regex: ['flags'],\n $unordered: ['value', '$partial'],\n $contains: ['count', '$partial'],\n $oneOf: ['$partial'],\n}\n\nconst SOLO = new Set<DirectiveName>(['$ignore', '$ref', '$literal'])\n\nexport const JSON_TYPES = [\n 'string',\n 'number',\n 'integer',\n 'boolean',\n 'object',\n 'array',\n 'null',\n] as const\n\nconst NUMBER_BOUNDS = ['gt', 'gte', 'lt', 'lte', 'eq'] as const\n\nconst LITERAL_HINT = 'wrap data that really has these keys in {\"$literal\": ...}'\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function matchValue(\n expected: JsonValue,\n actual: unknown,\n options: MatchOptions = {},\n): Mismatch[] {\n const ctx: MatchContext = {\n partial: options.partial === true,\n literal: false,\n mismatches: [],\n limit: MAX_MISMATCHES,\n }\n matchNode(expected, actual, '', ctx)\n return ctx.mismatches\n}\n\nexport function matches(expected: JsonValue, actual: unknown, options?: MatchOptions): boolean {\n return matchValue(expected, actual, options).length === 0\n}\n\n/**\n * True when `value` would be interpreted as a matcher (`{\"$regex\": ...}`, `{\"$type\": ...}`,\n * `{\"$ref\": ...}`, `{\"$literal\": ...}`), not compared as plain data. Plain objects carrying\n * only `$partial` next to data keys are not matchers.\n */\nexport function isMatcherObject(value: unknown): boolean {\n return isPlainObject(value) && parseDirective(value) !== null\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction report(ctx: MatchContext, mismatch: Mismatch): void {\n if (ctx.mismatches.length < ctx.limit) ctx.mismatches.push(mismatch)\n}\n\nfunction displayPath(path: string): string {\n return path === '' ? '(root)' : path\n}\n\n/** Join a path relative to `base` (as produced by schema.ts) onto `base`. */\nfunction joinPath(base: string, relative: string): string {\n if (relative === '') return base\n if (relative.startsWith('[') || base === '') return `${base}${relative}`\n return `${base}.${relative}`\n}\n\nfunction describeType(value: unknown): string {\n if (value === null) return 'null'\n if (Array.isArray(value)) return 'array'\n return typeof value\n}\n\n/** Type plus a short preview, for v2 messages: `number 42`, `string \"abc\"`, `array (3 items)`. */\nfunction describeValue(value: unknown): string {\n if (value === undefined) return 'nothing'\n if (value === null) return 'null'\n if (Array.isArray(value)) return `array (${value.length} item${value.length === 1 ? '' : 's'})`\n if (typeof value === 'object') return 'object'\n return `${typeof value} ${short(value)}`\n}\n\nfunction short(value: unknown, max = 80): string {\n const text = JSON.stringify(value) ?? String(value)\n return text.length > max ? `${text.slice(0, max - 1)}…` : text\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, JsonValue> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction hasOwn(value: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(value, key)\n}\n\nfunction isSchemaValue(value: unknown): boolean {\n return typeof value === 'boolean' || isPlainObject(value)\n}\n\nfunction isDirectiveKey(key: string, value: JsonValue): key is DirectiveName {\n if (!(DIRECTIVES as readonly string[]).includes(key)) return false\n // A string `$schema` is a JSON Schema dialect URI (data), not the $schema matcher.\n return key !== '$schema' || isSchemaValue(value)\n}\n\n/** Every `$` name an expectation may use (directives plus `$partial`). */\nconst MATCHER_NAMES: readonly string[] = ['$partial', ...DIRECTIVES]\n\n/**\n * A `$`-prefixed key that is neither a matcher nor `$partial` (a string `$schema` is a\n * dialect URI, i.e. data). Typos such as `$partail` would otherwise be compared as data.\n */\nfunction isUnknownDollarKey(key: string, value: JsonValue): boolean {\n if (!key.startsWith('$') || MATCHER_NAMES.includes(key)) return false\n return !(key === '$schema' && typeof value === 'string')\n}\n\nfunction closestMatcher(key: string): string | undefined {\n let best: string | undefined\n let bestScore = Number.POSITIVE_INFINITY\n for (const name of MATCHER_NAMES) {\n const score = levenshtein(key.toLowerCase(), name.toLowerCase())\n if (score < bestScore) {\n bestScore = score\n best = name\n }\n }\n return bestScore <= 2 ? best : undefined\n}\n\nfunction levenshtein(a: string, b: string): number {\n const row = Array.from({ length: b.length + 1 }, (_, i) => i)\n for (let i = 1; i <= a.length; i++) {\n let prev = row[0]\n row[0] = i\n for (let j = 1; j <= b.length; j++) {\n const tmp = row[j]\n row[j] = Math.min(row[j] + 1, row[j - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1))\n prev = tmp\n }\n }\n return row[b.length]\n}\n\nfunction scratch(ctx: MatchContext, partial: boolean, limit: number): MatchContext {\n return { partial, literal: ctx.literal, mismatches: [], limit }\n}\n\nfunction firstMismatch(\n expected: JsonValue,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n partial: boolean,\n): Mismatch | undefined {\n const sub = scratch(ctx, partial, 1)\n matchNode(expected, actual, path, sub)\n return sub.mismatches[0]\n}\n\n/** The candidate with the fewest mismatches (first wins ties), for \"closest element\" hints. */\nfunction closest(\n expected: JsonValue,\n candidates: unknown[],\n indices: number[] | undefined,\n path: string,\n ctx: MatchContext,\n partial: boolean,\n): { index: number; mismatch: Mismatch } | undefined {\n let best: { index: number; mismatch: Mismatch; count: number } | undefined\n for (const i of indices ?? candidates.map((_, j) => j)) {\n const sub = scratch(ctx, partial, MAX_MISMATCHES)\n matchNode(expected, candidates[i], appendIndex(path, i), sub)\n const count = sub.mismatches.length\n if (count > 0 && (!best || count < best.count)) {\n best = { index: i, mismatch: sub.mismatches[0], count }\n }\n }\n return best\n}\n\nfunction describeMismatch(m: Mismatch, at: string): string {\n return m.path === displayPath(at) ? m.message : `${m.path}: ${m.message}`\n}\n\nfunction plural(n: number, word: string): string {\n return `${n} ${word}${n === 1 ? '' : 's'}`\n}\n\n// ---------------------------------------------------------------------------\n// Directive parsing / validation\n// ---------------------------------------------------------------------------\n\ninterface ParsedDirective {\n names: DirectiveName[]\n /** Full mismatch message when the directive object is malformed. */\n error?: string\n}\n\nconst parsedCache = new WeakMap<object, ParsedDirective | null>()\n\nfunction parseDirective(expected: Record<string, JsonValue>): ParsedDirective | null {\n if (parsedCache.has(expected)) return parsedCache.get(expected) ?? null\n const parsed = parseDirectiveUncached(expected)\n parsedCache.set(expected, parsed)\n return parsed\n}\n\nfunction parseDirectiveUncached(expected: Record<string, JsonValue>): ParsedDirective | null {\n const names = DIRECTIVES.filter(\n (name) => hasOwn(expected, name) && isDirectiveKey(name, expected[name]),\n )\n if (names.length === 0) return null\n const label = names.join(' + ')\n\n const allowed = new Set<string>(names)\n for (const name of names) for (const aux of AUX_KEYS[name] ?? []) allowed.add(aux)\n const extra = Object.keys(expected).filter((key) => !allowed.has(key))\n if (extra.length > 0) {\n const keys = extra.map((k) => JSON.stringify(k)).join(', ')\n if (extra.length === 1 && extra[0] === '$partial') {\n return {\n names,\n error: `invalid matcher: \"$partial\" cannot be used with ${label} (only on plain objects, $unordered, $contains and $oneOf)`,\n }\n }\n return {\n names,\n error: `invalid matcher: ${keys} cannot sit next to ${label}; a matcher object holds only the matcher and its options. Move plain fields to the enclosing object, or ${LITERAL_HINT}`,\n }\n }\n\n const solo = names.find((name) => SOLO.has(name))\n if (solo && names.length > 1) {\n return {\n names,\n error: `invalid matcher: ${solo} must be used on its own, not combined with ${names.filter((n) => n !== solo).join(' + ')}`,\n }\n }\n\n for (const name of names) {\n const error = validateDirective(name, expected)\n if (error) return { names, error: `invalid matcher: ${error}` }\n }\n return { names }\n}\n\ninterface Range {\n min?: number\n max?: number\n}\n\nfunction isNonNegativeInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value >= 0\n}\n\n/** `3` → exactly 3; `{ \"min\": 1, \"max\": 10 }` → bounds (either may be omitted). */\nfunction parseRange(value: JsonValue | undefined, label: string): Range | string {\n if (isNonNegativeInteger(value)) return { min: value, max: value }\n if (!isPlainObject(value)) {\n return `${label} must be a non-negative integer or {\"min\": n, \"max\": n}; got ${short(value)}`\n }\n const extra = Object.keys(value).filter((k) => k !== 'min' && k !== 'max')\n if (extra.length > 0) return `${label} only accepts \"min\" and \"max\"; got ${short(value)}`\n const { min, max } = value\n if (min === undefined && max === undefined) {\n return `${label} needs \"min\" and/or \"max\"; got ${short(value)}`\n }\n if (\n (min !== undefined && !isNonNegativeInteger(min)) ||\n (max !== undefined && !isNonNegativeInteger(max))\n ) {\n return `${label} bounds must be non-negative integers; got ${short(value)}`\n }\n if (min !== undefined && max !== undefined && min > max) {\n return `${label} has min > max; got ${short(value)}`\n }\n return { min: min as number | undefined, max: max as number | undefined }\n}\n\nfunction describeRange(range: Range): string {\n if (range.min !== undefined && range.min === range.max) return `${range.min}`\n const parts: string[] = []\n if (range.min !== undefined) parts.push(`>= ${range.min}`)\n if (range.max !== undefined) parts.push(`<= ${range.max}`)\n return parts.join(' and ')\n}\n\nfunction inRange(n: number, range: Range): boolean {\n return (range.min === undefined || n >= range.min) && (range.max === undefined || n <= range.max)\n}\n\nfunction checkPartialOption(\n directive: Record<string, JsonValue>,\n name: string,\n): string | undefined {\n if (hasOwn(directive, '$partial') && typeof directive.$partial !== 'boolean') {\n return `\"$partial\" on ${name} must be true or false; got ${short(directive.$partial)}`\n }\n return undefined\n}\n\nfunction validateDirective(name: DirectiveName, d: Record<string, JsonValue>): string | undefined {\n const value = d[name]\n switch (name) {\n case '$any':\n case '$ignore':\n return value === true ? undefined : `\"${name}\" must be true; got ${short(value)}`\n case '$type': {\n const types = Array.isArray(value) ? value : [value]\n const valid =\n types.length > 0 &&\n types.every((t) => typeof t === 'string' && (JSON_TYPES as readonly string[]).includes(t))\n return valid\n ? undefined\n : `\"$type\" must be one of ${JSON_TYPES.map((t) => `\"${t}\"`).join(', ')} or an array of them; got ${short(value)}. If this is data, ${LITERAL_HINT}`\n }\n case '$number': {\n if (!isPlainObject(value) || Object.keys(value).length === 0) {\n return `\"$number\" must be an object with any of ${NUMBER_BOUNDS.join(', ')}; got ${short(value)}`\n }\n for (const [key, bound] of Object.entries(value)) {\n if (!(NUMBER_BOUNDS as readonly string[]).includes(key)) {\n return `\"$number\" does not support \"${key}\" (use ${NUMBER_BOUNDS.join(', ')})`\n }\n if (typeof bound !== 'number' || !Number.isFinite(bound)) {\n return `\"$number\".${key} must be a number; got ${short(bound)}`\n }\n }\n return undefined\n }\n case '$length': {\n const range = parseRange(value, '\"$length\"')\n return typeof range === 'string' ? range : undefined\n }\n case '$regex': {\n if (typeof value !== 'string') return `\"$regex\" must be a string pattern; got ${short(value)}`\n if (hasOwn(d, 'flags') && typeof d.flags !== 'string') {\n return `\"flags\" must be a string such as \"i\"; got ${short(d.flags)}`\n }\n return undefined\n }\n case '$wildcard':\n return typeof value === 'string'\n ? undefined\n : `\"$wildcard\" must be a string pattern; got ${short(value)}`\n case '$schema':\n return undefined\n case '$contains': {\n if (hasOwn(d, 'count')) {\n const range = parseRange(d.count, '\"count\"')\n if (typeof range === 'string') return range\n }\n return checkPartialOption(d, '$contains')\n }\n case '$unordered': {\n if (value !== true) return `\"$unordered\" must be true; got ${short(value)}`\n if (!Array.isArray(d.value)) {\n return `\"$unordered\" needs \"value\": [ ...expected elements ]; got ${short(d.value)}`\n }\n return checkPartialOption(d, '$unordered')\n }\n case '$oneOf': {\n if (!Array.isArray(value) || value.length === 0) {\n return `\"$oneOf\" must be a non-empty array of alternatives; got ${short(value)}`\n }\n return checkPartialOption(d, '$oneOf')\n }\n case '$ref':\n return typeof value === 'string'\n ? undefined\n : `\"$ref\" must be a path string; got ${short(value)}`\n case '$literal':\n return undefined\n }\n}\n\n/** Whether a missing key satisfies this expectation (`$ignore`, or `$oneOf` with one). */\nfunction acceptsMissing(expected: JsonValue, ctx: MatchContext): boolean {\n if (ctx.literal || !isPlainObject(expected)) return false\n const parsed = parseDirective(expected)\n if (!parsed || parsed.error) return false\n return parsed.names.every((name) => {\n if (name === '$ignore') return true\n if (name === '$oneOf')\n return (expected.$oneOf as JsonValue[]).some((alt) => acceptsMissing(alt, ctx))\n return false\n })\n}\n\nfunction isInvalidDirective(expected: JsonValue, ctx: MatchContext): boolean {\n if (ctx.literal || !isPlainObject(expected)) return false\n return parseDirective(expected)?.error !== undefined\n}\n\n// ---------------------------------------------------------------------------\n// Core walk\n// ---------------------------------------------------------------------------\n\nfunction matchNode(expected: JsonValue, actual: unknown, path: string, ctx: MatchContext): void {\n if (ctx.mismatches.length >= ctx.limit) return\n if (isPlainObject(expected)) {\n if (!ctx.literal) {\n const parsed = parseDirective(expected)\n if (parsed) {\n matchDirective(expected, parsed, actual, path, ctx)\n return\n }\n }\n matchObject(expected, actual, path, ctx)\n return\n }\n if (Array.isArray(expected)) {\n matchArray(expected, actual, path, ctx)\n return\n }\n if (!Object.is(expected, actual)) {\n report(ctx, {\n path: displayPath(path),\n message: `expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`,\n expected,\n actual,\n })\n }\n}\n\ntype DirectiveHandler = (\n directive: Record<string, JsonValue>,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n) => void\n\nconst HANDLERS: Record<DirectiveName, DirectiveHandler> = {\n $any: matchAny,\n $type: matchType,\n $number: matchNumber,\n $length: matchLength,\n $regex: matchRegexDirective,\n $wildcard: matchWildcardDirective,\n $schema: matchSchema,\n $contains: matchContains,\n $unordered: (directive, actual, path, ctx) => {\n const partial = typeof directive.$partial === 'boolean' ? directive.$partial : ctx.partial\n matchUnordered(directive.value as JsonValue[], directive, actual, path, { ...ctx, partial })\n },\n $oneOf: matchOneOf,\n $ignore: () => {},\n $ref: (directive, actual, path, ctx) => {\n report(ctx, {\n path: displayPath(path),\n message: `unresolved $ref ${JSON.stringify(directive.$ref)}: expand refs with resolveRefs() before matching`,\n expected: directive,\n actual,\n })\n },\n $literal: (directive, actual, path, ctx) => {\n matchNode(directive.$literal, actual, path, { ...ctx, literal: true })\n },\n}\n\nfunction matchDirective(\n directive: Record<string, JsonValue>,\n parsed: ParsedDirective,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n if (parsed.error) {\n report(ctx, { path: displayPath(path), message: parsed.error, expected: directive, actual })\n return\n }\n for (const name of parsed.names) {\n const before = ctx.mismatches.length\n HANDLERS[name](directive, actual, path, ctx)\n if (ctx.mismatches.length > before) return\n }\n}\n\nfunction matchObject(\n expected: Record<string, JsonValue>,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n if (!isPlainObject(actual)) {\n report(ctx, {\n path: displayPath(path),\n message: `expected an object, got ${describeType(actual)}`,\n expected,\n actual,\n })\n return\n }\n const usesPartialKey = !ctx.literal && hasOwn(expected, '$partial')\n let partial = ctx.partial\n if (usesPartialKey) {\n if (typeof expected.$partial === 'boolean') partial = expected.$partial\n else {\n report(ctx, {\n path: displayPath(path),\n message: `invalid matcher: \"$partial\" must be true or false; got ${short(expected.$partial)}`,\n expected,\n actual,\n })\n }\n }\n const expectedKeys = Object.keys(expected).filter((key) => !usesPartialKey || key !== '$partial')\n if (!partial) {\n const extra = Object.keys(actual).filter((key) => !expectedKeys.includes(key))\n if (extra.length > 0) {\n report(ctx, {\n path: displayPath(path),\n message: `unexpected key${extra.length > 1 ? 's' : ''} ${extra.map((k) => JSON.stringify(k)).join(', ')} (use \"$partial\": true to allow extra fields)`,\n expected,\n actual,\n })\n }\n }\n const childCtx: MatchContext = { ...ctx, partial }\n for (const key of expectedKeys) {\n const childPath = appendKey(path, key)\n if (!hasOwn(actual, key)) {\n if (acceptsMissing(expected[key], childCtx)) continue\n if (isInvalidDirective(expected[key], childCtx)) {\n matchNode(expected[key], undefined, childPath, childCtx)\n continue\n }\n report(ctx, {\n path: displayPath(childPath),\n message: `missing expected key (expected ${JSON.stringify(expected[key])})`,\n expected: expected[key],\n actual: undefined,\n })\n continue\n }\n matchNode(expected[key], actual[key], childPath, childCtx)\n }\n}\n\nfunction matchArray(expected: JsonValue[], actual: unknown, path: string, ctx: MatchContext): void {\n if (!Array.isArray(actual)) {\n report(ctx, {\n path: displayPath(path),\n message: `expected an array, got ${describeType(actual)}`,\n expected,\n actual,\n })\n return\n }\n const lengthOk = ctx.partial\n ? actual.length >= expected.length\n : actual.length === expected.length\n if (!lengthOk) {\n report(ctx, {\n path: displayPath(path),\n message: `expected array of length ${ctx.partial ? `>= ${expected.length}` : expected.length}, got ${actual.length}`,\n expected,\n actual,\n })\n return\n }\n for (let i = 0; i < expected.length; i++) {\n matchNode(expected[i], actual[i], appendIndex(path, i), ctx)\n }\n}\n\n// ---------------------------------------------------------------------------\n// v1 directives\n// ---------------------------------------------------------------------------\n\nfunction matchRegexDirective(\n directive: Record<string, JsonValue>,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n const pattern = directive.$regex as string\n const flags = directive.flags as string | undefined\n if (typeof actual !== 'string') {\n report(ctx, {\n path: displayPath(path),\n message: `expected a string matching /${pattern}/${flags ?? ''}, got ${describeType(actual)}`,\n expected: directive,\n actual,\n })\n return\n }\n let regex: RegExp\n try {\n regex = new RegExp(pattern, flags)\n } catch (err) {\n report(ctx, {\n path: displayPath(path),\n message: `invalid $regex pattern /${pattern}/${flags ?? ''}: ${err instanceof Error ? err.message : String(err)}`,\n expected: directive,\n actual,\n })\n return\n }\n if (!regex.test(actual)) {\n report(ctx, {\n path: displayPath(path),\n message: `expected string matching /${pattern}/${flags ?? ''}, got ${JSON.stringify(actual)}`,\n expected: directive,\n actual,\n })\n }\n}\n\nfunction wildcardToRegex(pattern: string): RegExp {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n const body = escaped.replace(/\\*/g, '[\\\\s\\\\S]*').replace(/\\?/g, '[\\\\s\\\\S]')\n return new RegExp(`^${body}$`)\n}\n\nfunction matchWildcardDirective(\n directive: Record<string, JsonValue>,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n const pattern = directive.$wildcard as string\n if (typeof actual !== 'string') {\n report(ctx, {\n path: displayPath(path),\n message: `expected a string matching wildcard \"${pattern}\", got ${describeType(actual)}`,\n expected: directive,\n actual,\n })\n return\n }\n if (!wildcardToRegex(pattern).test(actual)) {\n report(ctx, {\n path: displayPath(path),\n message: `expected string matching wildcard \"${pattern}\", got ${JSON.stringify(actual)}`,\n expected: directive,\n actual,\n })\n }\n}\n\nfunction matchUnordered(\n expected: JsonValue[],\n directive: Record<string, JsonValue>,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n if (!Array.isArray(actual)) {\n report(ctx, {\n path: displayPath(path),\n message: `expected an array (unordered), got ${describeType(actual)}`,\n expected: directive,\n actual,\n })\n return\n }\n if (ctx.partial ? actual.length < expected.length : actual.length !== expected.length) {\n report(ctx, {\n path: displayPath(path),\n message: `expected unordered array of length ${ctx.partial ? `>= ${expected.length}` : expected.length}, got ${actual.length}`,\n expected: directive,\n actual,\n })\n return\n }\n // Bipartite matching (augmenting paths): expected[i] may take actual[j] when they match.\n const fits = expected.map((item) =>\n actual.map((candidate) => firstMismatch(item, candidate, '', ctx, ctx.partial) === undefined),\n )\n const owner = new Array<number>(actual.length).fill(-1)\n const assign = (i: number, seen: boolean[]): boolean => {\n for (let j = 0; j < actual.length; j++) {\n if (!fits[i][j] || seen[j]) continue\n seen[j] = true\n if (owner[j] === -1 || assign(owner[j], seen)) {\n owner[j] = i\n return true\n }\n }\n return false\n }\n let complete = true\n for (let i = 0; i < expected.length; i++) {\n if (!assign(i, new Array<boolean>(actual.length).fill(false))) complete = false\n }\n if (complete) return\n\n let detail: string\n const orphan = fits.findIndex((row) => !row.some(Boolean))\n if (orphan >= 0) {\n detail = `expected value[${orphan}] ${short(expected[orphan], 60)} matches no actual element`\n // Prefer actual elements the (maximum) assignment left over: they are the likely pair.\n const leftovers = actual.map((_, j) => j).filter((j) => owner[j] === -1)\n const near =\n closest(expected[orphan], actual, leftovers, path, ctx, ctx.partial) ??\n closest(expected[orphan], actual, undefined, path, ctx, ctx.partial)\n if (near) detail += `; closest is ${describeMismatch(near.mismatch, '')}`\n } else {\n detail =\n 'every expected element matches some actual element, but not all at once (each actual element can satisfy only one expected element)'\n }\n report(ctx, {\n path: displayPath(path),\n message: `no arrangement of the actual array satisfies the expected elements (unordered${ctx.partial ? ', partial' : ''}): ${detail}`,\n expected: directive,\n actual,\n })\n}\n\n// ---------------------------------------------------------------------------\n// v2 directives\n// ---------------------------------------------------------------------------\n\nfunction matchAny(\n directive: Record<string, JsonValue>,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n if (actual === undefined) {\n report(ctx, {\n path: displayPath(path),\n message: 'expected a value to be present ($any), got nothing',\n expected: directive,\n actual,\n })\n }\n}\n\nfunction hasJsonType(value: unknown, type: string): boolean {\n switch (type) {\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value)\n case 'number':\n return typeof value === 'number'\n case 'null':\n return value === null\n case 'array':\n return Array.isArray(value)\n case 'object':\n return isPlainObject(value)\n case 'string':\n return typeof value === 'string'\n case 'boolean':\n return typeof value === 'boolean'\n default:\n return false\n }\n}\n\nfunction matchType(\n directive: Record<string, JsonValue>,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n const types = (Array.isArray(directive.$type) ? directive.$type : [directive.$type]) as string[]\n if (types.some((type) => hasJsonType(actual, type))) return\n report(ctx, {\n path: displayPath(path),\n message: `expected type ${types.join(' | ')}, got ${describeValue(actual)}`,\n expected: directive,\n actual,\n })\n}\n\nfunction describeBounds(bounds: Record<string, JsonValue>): string {\n const symbols: Record<string, string> = { gt: '>', gte: '>=', lt: '<', lte: '<=', eq: '==' }\n return NUMBER_BOUNDS.filter((key) => hasOwn(bounds, key))\n .map((key) => `${symbols[key]} ${bounds[key]}`)\n .join(' and ')\n}\n\nfunction matchNumber(\n directive: Record<string, JsonValue>,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n const bounds = directive.$number as Record<string, number>\n const range = describeBounds(bounds)\n if (typeof actual !== 'number') {\n report(ctx, {\n path: displayPath(path),\n message: `expected a number ${range}, got ${describeValue(actual)}`,\n expected: directive,\n actual,\n })\n return\n }\n const ok =\n (bounds.gt === undefined || actual > bounds.gt) &&\n (bounds.gte === undefined || actual >= bounds.gte) &&\n (bounds.lt === undefined || actual < bounds.lt) &&\n (bounds.lte === undefined || actual <= bounds.lte) &&\n (bounds.eq === undefined || actual === bounds.eq)\n if (!ok) {\n report(ctx, {\n path: displayPath(path),\n message: `expected number ${range}, got ${actual}`,\n expected: directive,\n actual,\n })\n }\n}\n\nfunction matchLength(\n directive: Record<string, JsonValue>,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n const range = parseRange(directive.$length, '\"$length\"') as Range\n const spec = describeRange(range)\n if (typeof actual !== 'string' && !Array.isArray(actual)) {\n report(ctx, {\n path: displayPath(path),\n message: `expected an array or string with length ${spec}, got ${describeValue(actual)}`,\n expected: directive,\n actual,\n })\n return\n }\n // Strings count Unicode code points (like JSON Schema's minLength/maxLength).\n const length = Array.isArray(actual) ? actual.length : Array.from(actual).length\n if (!inRange(length, range)) {\n report(ctx, {\n path: displayPath(path),\n message: `expected ${Array.isArray(actual) ? 'array' : 'string'} length ${spec}, got ${length}`,\n expected: directive,\n actual,\n })\n }\n}\n\nconst SCHEMA_ERRORS_SHOWN = 3\n\nfunction matchSchema(\n directive: Record<string, JsonValue>,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n const result = validateAgainstSchema(directive.$schema, actual)\n if (result.ok) return\n if (result.schemaError !== undefined) {\n report(ctx, {\n path: displayPath(path),\n message: `invalid matcher: $schema could not be compiled: ${result.schemaError}`,\n expected: directive,\n actual,\n })\n return\n }\n const shown = result.errors\n .slice(0, SCHEMA_ERRORS_SHOWN)\n .map((issue) => `${displayPath(joinPath(path, issue.path))} ${issue.message}`)\n const more = result.errors.length - shown.length\n report(ctx, {\n path: displayPath(path),\n message: `value does not match $schema: ${shown.join('; ')}${more > 0 ? ` (+${more} more)` : ''}`,\n expected: directive,\n actual,\n })\n}\n\nfunction matchContains(\n directive: Record<string, JsonValue>,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n const needle = directive.$contains\n const partial = typeof directive.$partial === 'boolean' ? directive.$partial : true\n const mode = partial ? '' : ' (exact)'\n const count = hasOwn(directive, 'count')\n ? (parseRange(directive.count, '\"count\"') as Range)\n : undefined\n if (!Array.isArray(actual)) {\n const hint =\n typeof actual === 'string' ? ' (for substrings use {\"$wildcard\": \"*text*\"} or $regex)' : ''\n report(ctx, {\n path: displayPath(path),\n message: `expected an array containing ${short(needle, 60)}, got ${describeValue(actual)}${hint}`,\n expected: directive,\n actual,\n })\n return\n }\n const hits: number[] = []\n for (let i = 0; i < actual.length; i++) {\n if (firstMismatch(needle, actual[i], '', ctx, partial) === undefined) hits.push(i)\n }\n if (count === undefined ? hits.length > 0 : inRange(hits.length, count)) return\n\n let message: string\n if (count === undefined) {\n message =\n actual.length === 0\n ? `expected array to contain an element matching ${short(needle, 60)}${mode}, but the array is empty`\n : `expected array to contain an element matching ${short(needle, 60)}${mode}, but none of ${plural(actual.length, 'element')} matched`\n const near = closest(needle, actual, undefined, path, ctx, partial)\n if (near) message += `; closest is ${describeMismatch(near.mismatch, '')}`\n } else {\n const where = hits.length > 0 ? ` (at ${hits.map((i) => `[${i}]`).join(', ')})` : ''\n message = `expected ${describeRange(count)} element(s) matching ${short(needle, 60)}${mode}, found ${hits.length}${where}`\n }\n report(ctx, { path: displayPath(path), message, expected: directive, actual })\n}\n\nconst ONE_OF_SHOWN = 5\n\nfunction matchOneOf(\n directive: Record<string, JsonValue>,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n const alternatives = directive.$oneOf as JsonValue[]\n const partial = typeof directive.$partial === 'boolean' ? directive.$partial : ctx.partial\n const reasons: string[] = []\n for (const alternative of alternatives) {\n const miss = firstMismatch(alternative, actual, path, ctx, partial)\n if (miss === undefined) return\n reasons.push(describeMismatch(miss, path))\n }\n const shown = reasons\n .slice(0, ONE_OF_SHOWN)\n .map((reason, i) => `#${i + 1} ${reason.length > 160 ? `${reason.slice(0, 159)}…` : reason}`)\n const more = reasons.length - shown.length\n report(ctx, {\n path: displayPath(path),\n message: `none of ${plural(alternatives.length, '$oneOf alternative')} matched: ${shown.join('; ')}${more > 0 ? ` (+${more} more)` : ''}`,\n expected: directive,\n actual,\n })\n}\n\n// ---------------------------------------------------------------------------\n// Static checks & recording helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Statically check an expectation for malformed matchers (bad shapes, invalid regexes,\n * uncompilable `$schema`s), including inside `$oneOf` alternatives that matching may never\n * reach. Paths point into the expectation tree (e.g. `content[0].text.$oneOf[1]`).\n * Returns an empty array when the expectation is well formed.\n */\nexport function lintExpectation(expected: JsonValue): Mismatch[] {\n const out: Mismatch[] = []\n lintNode(expected, '', out)\n return out\n}\n\nfunction lintNode(node: JsonValue, path: string, out: Mismatch[]): void {\n if (Array.isArray(node)) {\n for (let i = 0; i < node.length; i++) lintNode(node[i], appendIndex(path, i), out)\n return\n }\n if (!isPlainObject(node)) return\n const parsed = parseDirective(node)\n if (!parsed) {\n if (hasOwn(node, '$partial') && typeof node.$partial !== 'boolean') {\n out.push({\n path: displayPath(path),\n message: `invalid matcher: \"$partial\" must be true or false; got ${short(node.$partial)}`,\n expected: node,\n })\n }\n for (const key of Object.keys(node)) {\n if (isUnknownDollarKey(key, node[key])) {\n const near = closestMatcher(key)\n out.push({\n path: displayPath(path),\n message: `\"${key}\" is not a matcher;${near ? ` did you mean \"${near}\"?` : ` matchers are ${MATCHER_NAMES.join(', ')}.`} Use {\"$literal\": ...} for data with a literal $-key`,\n expected: node,\n })\n }\n }\n for (const [key, child] of Object.entries(node)) {\n if (key !== '$partial') lintNode(child, appendKey(path, key), out)\n }\n return\n }\n if (parsed.error) {\n out.push({ path: displayPath(path), message: parsed.error, expected: node })\n return\n }\n for (const name of parsed.names) {\n if (name === '$regex') {\n try {\n new RegExp(node.$regex as string, node.flags as string | undefined)\n } catch (err) {\n out.push({\n path: displayPath(path),\n message: `invalid $regex pattern /${node.$regex}/${node.flags ?? ''}: ${err instanceof Error ? err.message : String(err)}`,\n expected: node,\n })\n }\n } else if (name === '$schema') {\n const result = validateAgainstSchema(node.$schema, null)\n if (result.schemaError !== undefined) {\n out.push({\n path: displayPath(path),\n message: `invalid matcher: $schema could not be compiled: ${result.schemaError}`,\n expected: node,\n })\n }\n } else if (name === '$contains') {\n lintNode(node.$contains, appendKey(path, '$contains'), out)\n } else if (name === '$unordered') {\n lintNode(node.value, appendKey(path, 'value'), out)\n } else if (name === '$oneOf') {\n lintNode(node.$oneOf, appendKey(path, '$oneOf'), out)\n }\n }\n}\n\n/**\n * Make recorded data safe to use as an expectation: any object that would be read as a\n * matcher (it has a key such as `$ref`, `$type`, `$regex`, `$partial`) is wrapped in\n * `{\"$literal\": ...}` so it is compared as plain data. Use when writing goldens from\n * live results.\n */\nexport function escapeDirectives(value: JsonValue): JsonValue {\n if (Array.isArray(value)) return value.map(escapeDirectives)\n if (!isPlainObject(value)) return value\n // Any `$`-key (except a string `$schema` URI) would be read as a matcher or rejected by\n // lintExpectation as an unknown one, so the data is compared literally.\n const interpreted = Object.keys(value).some(\n (key) =>\n key === '$partial' || isDirectiveKey(key, value[key]) || isUnknownDollarKey(key, value[key]),\n )\n if (interpreted) return { $literal: value }\n const out: Record<string, JsonValue> = {}\n for (const [key, child] of Object.entries(value)) out[key] = escapeDirectives(child)\n return out\n}\n\n// ---------------------------------------------------------------------------\n// $ref resolution (run by the runner before matching; never reads files itself)\n// ---------------------------------------------------------------------------\n\n/**\n * Loads a referenced fragment. `relPath` is a normalized POSIX path relative to the\n * directory of the case file (nested refs are already re-based onto that directory), or\n * an absolute path / URL when the ref was written that way.\n */\nexport type RefLoader = (relPath: string) => JsonValue\n\nexport class RefResolutionError extends Error {\n /** The `$ref` string as written. */\n readonly ref: string\n /** Where in the expectation tree the failing `$ref` sits (matcher path format). */\n readonly path: string\n /** Fragments being expanded when the error occurred, outermost first. */\n readonly chain: string[]\n\n constructor(message: string, ref: string, path: string, chain: string[]) {\n super(message)\n this.name = 'RefResolutionError'\n this.ref = ref\n this.path = path\n this.chain = chain\n }\n}\n\nconst URL_LIKE = /^[a-z][a-z0-9+.-]*:\\/\\//i\n\nfunction resolveRefPath(base: string, file: string): string {\n const target = file.replace(/\\\\/g, '/')\n if (URL_LIKE.test(target)) return target\n if (URL_LIKE.test(base)) return new URL(target, base).toString()\n if (target.startsWith('/') || /^[A-Za-z]:\\//.test(target)) return posix.normalize(target)\n return posix.normalize(posix.join(base === '' ? '' : posix.dirname(base), target))\n}\n\nfunction readPointer(doc: JsonValue, pointer: string): JsonValue | undefined {\n if (pointer === '') return doc\n if (!pointer.startsWith('/')) return undefined\n let node: JsonValue | undefined = doc\n for (const raw of pointer.slice(1).split('/')) {\n const segment = decodeURIComponent(raw).replace(/~1/g, '/').replace(/~0/g, '~')\n if (Array.isArray(node)) node = node[Number(segment)]\n else if (isPlainObject(node) && hasOwn(node, segment)) node = node[segment]\n else return undefined\n }\n return node\n}\n\n/**\n * Expand every `{\"$ref\": \"./shared/x.json\"}` (optionally with a `#/json/pointer`) in an\n * expectation tree. Refs may appear anywhere and fragments may contain further refs,\n * which resolve relative to the fragment that contains them. `$schema` bodies and\n * `$literal` values are left untouched (their `$ref`s are JSON Schema refs / data).\n * Throws `RefResolutionError` on load failures, bad pointers and cycles.\n */\nexport function resolveRefs(expected: JsonValue, loader: RefLoader): JsonValue {\n const documents = new Map<string, JsonValue>()\n const load = (file: string): JsonValue => {\n if (!documents.has(file)) {\n const doc = loader(file)\n if (doc === undefined) throw new Error('loader returned nothing')\n documents.set(file, doc)\n }\n return documents.get(file) as JsonValue\n }\n\n const walk = (node: JsonValue, path: string, base: string, chain: string[]): JsonValue => {\n if (Array.isArray(node))\n return node.map((item, i) => walk(item, appendIndex(path, i), base, chain))\n if (!isPlainObject(node)) return node\n if (hasOwn(node, '$literal')) return node\n if (hasOwn(node, '$ref')) return expand(node, path, base, chain)\n const out: Record<string, JsonValue> = {}\n for (const [key, child] of Object.entries(node)) {\n out[key] =\n key === '$schema' && isSchemaValue(child)\n ? child\n : walk(child, appendKey(path, key), base, chain)\n }\n return out\n }\n\n const expand = (\n node: Record<string, JsonValue>,\n path: string,\n base: string,\n chain: string[],\n ): JsonValue => {\n const ref = node.$ref\n const where = displayPath(path)\n const fail = (message: string): never => {\n throw new RefResolutionError(message, typeof ref === 'string' ? ref : short(ref), path, chain)\n }\n if (typeof ref !== 'string')\n return fail(`Invalid $ref at ${where}: \"$ref\" must be a path string, got ${short(ref)}.`)\n const extra = Object.keys(node).filter((key) => key !== '$ref')\n if (extra.length > 0) {\n return fail(\n `Invalid $ref at ${where}: a $ref object may only contain \"$ref\", found ${extra.map((k) => JSON.stringify(k)).join(', ')}. Move those fields into the referenced fragment or a surrounding object.`,\n )\n }\n const hash = ref.indexOf('#')\n const filePart = hash < 0 ? ref : ref.slice(0, hash)\n const pointer = hash < 0 ? '' : ref.slice(hash + 1)\n let file: string\n if (filePart === '') {\n if (base === '') {\n return fail(\n `Cannot resolve $ref \"${ref}\" at ${where}: same-document refs only work inside a fragment file. Point at a file instead, e.g. \"./shared/fragments.json${ref}\".`,\n )\n }\n file = base\n } else {\n file = resolveRefPath(base, filePart)\n }\n const key = pointer === '' ? file : `${file}#${pointer}`\n if (chain.includes(key)) {\n return fail(\n `$ref cycle at ${where}: ${[...chain, key].join(' -> ')}. Break the cycle by inlining one of the fragments.`,\n )\n }\n let doc: JsonValue\n try {\n doc = load(file)\n } catch (err) {\n return fail(\n `Cannot resolve $ref \"${ref}\" at ${where}: failed to load \"${file}\": ${err instanceof Error ? err.message : String(err)}. Ref paths are relative to the file that contains them.`,\n )\n }\n const target = readPointer(doc, pointer)\n if (target === undefined) {\n return fail(\n `Cannot resolve $ref \"${ref}\" at ${where}: \"${file}\" has nothing at pointer \"#${pointer}\".`,\n )\n }\n return walk(target, path, file, [...chain, key])\n }\n\n return walk(expected, '', '', [])\n}\n","/**\n * Case loading: globs → files → parsed, validated, `$ref`-expanded cases, plus the\n * filters `vib run` applies (tags, grep, shard, skip) and the `{{name}}` interpolation\n * engine flows use at run time.\n *\n * Loading never throws for a bad case file: the problem is attached to the LoadedCase\n * (`error`) so the runner reports it as a failed case (errorKind `load`) and keeps going.\n */\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport fg from 'fast-glob'\nimport { stripJsonComments, stripTrailingCommas } from './config.js'\nimport type { CaseRef } from './events.js'\nimport { manifestPathFor } from './manifest.js'\nimport { RefResolutionError, lintExpectation, resolveRefs } from './match.js'\nimport { canonicalCodeName, knownCodeNames } from './session/errors.js'\nimport type { JsonObject, JsonValue, ShardSpec, Step, SuiteHooks, TestCase } from './types.js'\n\nexport type OpKind = 'tool' | 'resource' | 'resourceTemplate' | 'prompt'\n\nexport const OP_KINDS: readonly OpKind[] = ['tool', 'resource', 'resourceTemplate', 'prompt']\n\nexport const STEP_KEYS = [\n 'name',\n 'tool',\n 'resource',\n 'resourceTemplate',\n 'prompt',\n 'args',\n 'expect',\n 'expectError',\n 'respond',\n 'expectInputRequired',\n 'expectTask',\n 'await',\n 'capture',\n 'budgetMs',\n 'timeoutMs',\n 'ignoreErrors',\n 'validateOutput',\n 'normalize',\n] as const\n\nexport const CASE_KEYS = [\n '$schema',\n ...STEP_KEYS,\n 'tags',\n 'server',\n 'steps',\n 'setup',\n 'teardown',\n 'flaky',\n 'skip',\n] as const\n\n/** Expectation-bearing step fields: `$ref`-expanded at load, linted, interpolated at run. */\nexport const EXPECTATION_KEYS = ['expect', 'expectInputRequired', 'expectTask'] as const\n\nexport interface LoadedCase {\n /** Stable reference (id = root-relative posix path; `line` 1). */\n ref: CaseRef\n /** Absolute path of the case file. */\n path: string\n /** The case with `$ref`s expanded. Undefined when the file failed to load. */\n data?: TestCase\n /** The case exactly as parsed (no `$ref` expansion): the basis for `--update` rewrites. */\n source?: TestCase\n /** Raw file text. */\n text?: string\n /** Load / validation problem: the case is reported failed with errorKind `load`. */\n error?: string\n /** Set when the case declares `skip: true | \"reason\"`. */\n skip?: string\n /**\n * The file is not a case, and loadCases drops it: a manifest lock, or a `$ref` fragment (no\n * operation / `steps`, and referenced by another matched file or kept in `shared/` /\n * `fragments/`).\n */\n notACase?: 'manifest' | 'fragment'\n}\n\nexport interface CaseFilters {\n /** Keep cases carrying at least one of these tags. */\n tags?: string[]\n /** Drop cases carrying any of these tags. */\n excludeTags?: string[]\n /** Keep cases whose name or id matches (case-insensitive regex, else substring). */\n grep?: string\n /** Keep every `total`-th case (1-based `index`) of the id-sorted selection. */\n shard?: ShardSpec\n}\n\nexport interface LoadCasesOptions extends CaseFilters {\n rootDir: string\n globs: string[]\n /** Server for cases without `server`. Default `\"default\"`. */\n defaultServer?: string\n /** Known server names; a case naming another server fails to load. */\n servers?: string[]\n /** Suite hooks: their captures are valid `{{names}}` in every case. */\n hooks?: SuiteHooks\n /** Environment for `{{env.X}}` checks. Default process.env. */\n env?: Record<string, string | undefined>\n /**\n * Config `manifest` path (default tests/integration/__manifest__.json). The lock files (this\n * path for the default server and the `<name>.<server>.json` siblings for `servers`) are\n * never loaded as cases, even when the globs match them. Files shaped like a manifest\n * (`\"vibrissa\": 2` + a `tools` array) are skipped too.\n */\n manifest?: string\n /** Extra files (absolute, or relative to rootDir) that are never cases. */\n exclude?: string[]\n}\n\nexport interface LoadCasesResult {\n /** Selected cases, sorted by id. */\n cases: LoadedCase[]\n /** Number of case files the globs matched (before filters). */\n matched: number\n /** Non-fatal loader notes (ignored top-level op fields, ...). */\n warnings: string[]\n /** Ids of `$ref` fragment files the globs matched and that were skipped (not cases). */\n fragments?: string[]\n}\n\n// ---------------------------------------------------------------------------\n// Files\n// ---------------------------------------------------------------------------\n\nfunction toPatterns(globs: string[]): string[] {\n return globs.map((glob) => glob.replace(/\\\\/g, '/'))\n}\n\n/** Resolve case globs (relative to rootDir; `!` negates) to absolute, sorted file paths. */\nexport async function resolveCaseFiles(globs: string[], rootDir: string): Promise<string[]> {\n const files = await fg(toPatterns(globs), {\n cwd: rootDir,\n absolute: true,\n onlyFiles: true,\n unique: true,\n dot: false,\n })\n return files.map((file) => path.resolve(file)).sort()\n}\n\nexport function resolveCaseFilesSync(globs: string[], rootDir: string): string[] {\n const files = fg.sync(toPatterns(globs), {\n cwd: rootDir,\n absolute: true,\n onlyFiles: true,\n unique: true,\n dot: false,\n })\n return files.map((file) => path.resolve(file)).sort()\n}\n\n/** Root-relative posix path when the file is inside rootDir, else the absolute posix path. */\nexport function caseIdFor(file: string, rootDir: string): string {\n const rel = path.relative(rootDir, file)\n if (rel && !rel.startsWith('..') && !path.isAbsolute(rel)) return rel.replace(/\\\\/g, '/')\n return path.resolve(file).replace(/\\\\/g, '/')\n}\n\nfunction hasComments(text: string): boolean {\n return stripJsonComments(text) !== text\n}\n\n/** Parse JSONC (comments and trailing commas allowed). Throws \"<where>: invalid JSON ...\". */\nexport function parseCaseText(text: string, where: string): unknown {\n try {\n return JSON.parse(stripTrailingCommas(stripJsonComments(text.replace(/^/, ''))))\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err)\n throw new Error(\n `${where}: invalid JSON (${reason}). Fix the syntax; comments and trailing commas are allowed.`,\n )\n }\n}\n\n/** True when the file contains comments (an --update rewrite would drop them). */\nexport function caseFileHasComments(text: string): boolean {\n return hasComments(text)\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction describe(value: unknown): string {\n if (value === undefined) return 'nothing'\n if (value === null) return 'null'\n if (Array.isArray(value)) return 'an array'\n if (typeof value === 'object') return 'an object'\n const text = JSON.stringify(value)\n return text.length > 60 ? `${text.slice(0, 59)}…` : text\n}\n\nfunction editDistance(a: string, b: string): number {\n const dp = Array.from({ length: b.length + 1 }, (_, j) => j)\n for (let i = 1; i <= a.length; i++) {\n let prev = dp[0]\n dp[0] = i\n for (let j = 1; j <= b.length; j++) {\n const tmp = dp[j]\n dp[j] = Math.min(dp[j] + 1, dp[j - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1))\n prev = tmp\n }\n }\n return dp[b.length]\n}\n\nfunction suggest(key: string, known: readonly string[]): string | undefined {\n const lower = key.toLowerCase()\n return known\n .map((name) => ({ name, d: editDistance(lower, name.toLowerCase()) }))\n .filter(({ d }) => d <= 2)\n .sort((a, b) => a.d - b.d)[0]?.name\n}\n\nfunction isCommentKey(key: string): boolean {\n return key === '$comment' || key.startsWith('//')\n}\n\nfunction joinAt(at: string, key: string | number): string {\n if (typeof key === 'number') return `${at}[${key}]`\n return at ? `${at}.${key}` : key\n}\n\nfunction prefix(at: string): string {\n return at ? `${at}: ` : ''\n}\n\n/** Operation kind of a step, or undefined when it names none. */\nexport function opKindOf(step: Step): OpKind | undefined {\n return OP_KINDS.find((kind) => step[kind] !== undefined)\n}\n\nclass ShapeChecker {\n readonly problems: string[] = []\n readonly warnings: string[] = []\n\n problem(at: string, text: string): void {\n this.problems.push(`${prefix(at)}${text}`)\n }\n\n nonNegative(value: unknown, at: string, key: string): void {\n if (value === undefined) return\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n this.problem(at, `\"${key}\" must be a number of milliseconds >= 0, got ${describe(value)}`)\n }\n }\n\n boolean(value: unknown, at: string, key: string): void {\n if (value !== undefined && typeof value !== 'boolean') {\n this.problem(at, `\"${key}\" must be true or false, got ${describe(value)}`)\n }\n }\n\n keys(raw: Record<string, unknown>, at: string, known: readonly string[], what: string): void {\n for (const key of Object.keys(raw)) {\n if (known.includes(key) || isCommentKey(key)) continue\n const near = suggest(key, known)\n const hint = near\n ? ` Did you mean \"${near}\"?`\n : ` Allowed keys: ${known.filter((k) => k !== '$schema').join(', ')}.`\n if ((CASE_KEYS as readonly string[]).includes(key)) {\n this.problem(at, `\"${key}\" is not allowed in a ${what}; it only works at the case level.`)\n } else {\n this.problem(at, `\"${key}\" is not a ${what} key.${hint}`)\n }\n }\n }\n\n step(raw: Record<string, unknown>, at: string, what: string, requireOp: boolean): void {\n const ops = OP_KINDS.filter((kind) => raw[kind] !== undefined)\n if (requireOp && ops.length === 0) {\n this.problem(\n at,\n `no operation. Add one of \"tool\", \"resource\", \"resourceTemplate\" or \"prompt\"${what === 'case' ? ' (or \"steps\" for a flow)' : ''}`,\n )\n }\n if (ops.length > 1) {\n this.problem(\n at,\n `${ops.map((o) => `\"${o}\"`).join(' and ')} are all set; a ${what} runs exactly one operation. ${what === 'case' ? 'Split it into \"steps\".' : 'Use one step per operation.'}`,\n )\n }\n for (const kind of ops) {\n if (typeof raw[kind] !== 'string' || (raw[kind] as string).length === 0) {\n this.problem(at, `\"${kind}\" must be a non-empty string, got ${describe(raw[kind])}`)\n }\n }\n if (raw.name !== undefined && typeof raw.name !== 'string') {\n this.problem(at, `\"name\" must be a string, got ${describe(raw.name)}`)\n }\n if (raw.args !== undefined && !isPlainObject(raw.args)) {\n this.problem(at, `\"args\" must be an object of arguments, got ${describe(raw.args)}`)\n }\n if (raw.expect !== undefined && raw.expectError !== undefined) {\n this.problem(\n at,\n '\"expect\" and \"expectError\" are both set; a step either succeeds or fails. Keep one.',\n )\n }\n if (raw.expectError !== undefined) this.expectError(raw.expectError, joinAt(at, 'expectError'))\n if (raw.respond !== undefined && !isPlainObject(raw.respond)) {\n this.problem(\n at,\n `\"respond\" must be an object keyed by request method (e.g. {\"elicitation/create\": {...}}), got ${describe(raw.respond)}`,\n )\n }\n if (raw.capture !== undefined) {\n if (!isPlainObject(raw.capture)) {\n this.problem(\n at,\n `\"capture\" must map names to dotted paths (e.g. {\"sid\": \"structuredContent.sessionId\"}), got ${describe(raw.capture)}`,\n )\n } else {\n for (const [name, value] of Object.entries(raw.capture)) {\n if (!/^[A-Za-z_][\\w-]*$/.test(name) || name === 'env') {\n this.problem(\n at,\n `capture name \"${name}\" is not usable in {{...}}. Use letters, digits, _ or - (not \"env\")`,\n )\n }\n if (typeof value !== 'string' || value.length === 0) {\n this.problem(\n joinAt(at, 'capture'),\n `\"${name}\" must be a dotted path string, got ${describe(value)}`,\n )\n }\n }\n }\n }\n if (raw.await !== undefined) {\n const value = raw.await\n if (typeof value !== 'boolean' && !isPlainObject(value)) {\n this.problem(\n at,\n `\"await\" must be true or { \"pollMs\", \"timeoutMs\" }, got ${describe(value)}`,\n )\n } else if (isPlainObject(value)) {\n this.keys(value, joinAt(at, 'await'), ['pollMs', 'timeoutMs'], 'await option')\n this.nonNegative(value.pollMs, joinAt(at, 'await'), 'pollMs')\n this.nonNegative(value.timeoutMs, joinAt(at, 'await'), 'timeoutMs')\n }\n }\n this.nonNegative(raw.budgetMs, at, 'budgetMs')\n this.nonNegative(raw.timeoutMs, at, 'timeoutMs')\n this.boolean(raw.ignoreErrors, at, 'ignoreErrors')\n this.boolean(raw.validateOutput, at, 'validateOutput')\n if (raw.normalize !== undefined) this.normalize(raw.normalize, joinAt(at, 'normalize'))\n }\n\n expectError(value: unknown, at: string): void {\n if (!isPlainObject(value)) {\n this.problem(at, `must be an object like {\"code\": \"InvalidParams\"}, got ${describe(value)}`)\n return\n }\n this.keys(value, at, ['code', 'message'], 'expectError')\n if (\n value.code !== undefined &&\n typeof value.code !== 'string' &&\n typeof value.code !== 'number'\n )\n this.problem(at, `\"code\" must be a code name or number, got ${describe(value.code)}`)\n if (typeof value.code === 'string') {\n const known = knownCodeNames()\n if (!known.includes(canonicalCodeName(value.code))) {\n const near = suggest(value.code, known)\n this.problem(\n at,\n `\"code\" ${JSON.stringify(value.code)} is not a known error code;${near ? ` did you mean \"${near}\"?` : ` known names: ${known.join(', ')}.`} Use the numeric JSON-RPC code for anything else (e.g. -32000)`,\n )\n }\n }\n const message = value.message\n if (\n message !== undefined &&\n typeof message !== 'string' &&\n !(isPlainObject(message) && typeof message.$regex === 'string')\n ) {\n this.problem(at, `\"message\" must be a string or {\"$regex\": \"...\"}, got ${describe(message)}`)\n }\n }\n\n normalize(value: unknown, at: string): void {\n if (value === false) return\n if (!isPlainObject(value)) {\n this.problem(at, `must be false or { stripMeta, dropKeys, ttlMs }, got ${describe(value)}`)\n return\n }\n this.keys(value, at, ['stripMeta', 'dropKeys', 'ttlMs'], 'normalize option')\n for (const key of ['stripMeta', 'dropKeys']) {\n const list = value[key]\n if (list !== undefined && (!Array.isArray(list) || list.some((v) => typeof v !== 'string')))\n this.problem(at, `\"${key}\" must be an array of strings, got ${describe(list)}`)\n }\n if (value.ttlMs !== undefined && value.ttlMs !== 'keep' && value.ttlMs !== 'ignore')\n this.problem(at, `\"ttlMs\" must be \"keep\" or \"ignore\", got ${describe(value.ttlMs)}`)\n }\n\n steps(value: unknown, key: 'steps' | 'setup' | 'teardown'): void {\n if (!Array.isArray(value)) {\n this.problem('', `\"${key}\" must be an array of step objects, got ${describe(value)}`)\n return\n }\n if (key === 'steps' && value.length === 0) {\n this.problem('', '\"steps\" is empty. Add at least one step, or remove \"steps\".')\n }\n value.forEach((step, i) => {\n const at = joinAt(key, i)\n if (!isPlainObject(step)) {\n this.problem(at, `must be a step object, got ${describe(step)}`)\n return\n }\n this.keys(step, at, STEP_KEYS, 'step')\n this.step(step, at, 'step', true)\n })\n }\n}\n\n/** Shape problems for a parsed case (\"<where>: <problem>. <hint>\" without the file). */\nexport function validateCaseShape(raw: unknown): { problems: string[]; warnings: string[] } {\n const check = new ShapeChecker()\n if (!isPlainObject(raw)) {\n check.problem('', `a case must be a JSON object, got ${describe(raw)}`)\n return { problems: check.problems, warnings: check.warnings }\n }\n check.keys(raw, '', CASE_KEYS, 'case')\n const isFlow = raw.steps !== undefined\n if (isFlow) {\n check.steps(raw.steps, 'steps')\n for (const kind of OP_KINDS) {\n if (raw[kind] !== undefined) {\n check.warnings.push(\n `top-level \"${kind}\" is ignored because \"steps\" is present; move it into a step`,\n )\n }\n }\n for (const key of ['expect', 'expectError', 'expectInputRequired', 'expectTask', 'respond']) {\n if (raw[key] !== undefined) {\n check.warnings.push(\n `top-level \"${key}\" is ignored because \"steps\" is present; move it into the step it belongs to`,\n )\n }\n }\n check.nonNegative(raw.budgetMs, '', 'budgetMs')\n check.nonNegative(raw.timeoutMs, '', 'timeoutMs')\n check.boolean(raw.validateOutput, '', 'validateOutput')\n if (raw.normalize !== undefined) check.normalize(raw.normalize, 'normalize')\n } else {\n check.step(raw, '', 'case', true)\n }\n if (raw.setup !== undefined) check.steps(raw.setup, 'setup')\n if (raw.teardown !== undefined) check.steps(raw.teardown, 'teardown')\n if (\n raw.tags !== undefined &&\n (!Array.isArray(raw.tags) || raw.tags.some((t) => typeof t !== 'string'))\n ) {\n check.problem('', `\"tags\" must be an array of strings, got ${describe(raw.tags)}`)\n }\n if (raw.server !== undefined && (typeof raw.server !== 'string' || raw.server === '')) {\n check.problem(\n '',\n `\"server\" must be a server name from vibrissa.json, got ${describe(raw.server)}`,\n )\n }\n check.boolean(raw.flaky, '', 'flaky')\n if (raw.skip !== undefined && typeof raw.skip !== 'boolean' && typeof raw.skip !== 'string') {\n check.problem('', `\"skip\" must be true or a reason string, got ${describe(raw.skip)}`)\n }\n return { problems: check.problems, warnings: check.warnings }\n}\n\n// ---------------------------------------------------------------------------\n// Steps & plan helpers\n// ---------------------------------------------------------------------------\n\nexport type StepPhase = 'setup' | 'main' | 'teardown'\n\nexport interface PlannedStep {\n phase: StepPhase\n step: Step\n /** Where the step lives in the case file (e.g. `[\"steps\", 1]`, `[]` = the case itself). */\n source: Array<string | number>\n /** Matcher-path label of the step: `steps[1]`, `setup[0]`, or `` for a single-op case. */\n at: string\n}\n\nconst CASE_ONLY = new Set([\n '$schema',\n 'tags',\n 'server',\n 'steps',\n 'setup',\n 'teardown',\n 'flaky',\n 'skip',\n])\n\n/** The single operation of a non-flow case, as a step (case-only keys and budgetMs removed). */\nexport function caseAsStep(data: TestCase): Step {\n const step: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(data)) {\n if (CASE_ONLY.has(key) || key === 'budgetMs') continue\n step[key] = value\n }\n return step as Step\n}\n\n/** setup → steps (or the case's own op) → teardown, in run order. */\nexport function planSteps(data: TestCase): PlannedStep[] {\n const plan: PlannedStep[] = []\n data.setup?.forEach((step, i) =>\n plan.push({ phase: 'setup', step, source: ['setup', i], at: `setup[${i}]` }),\n )\n if (data.steps) {\n data.steps.forEach((step, i) =>\n plan.push({ phase: 'main', step, source: ['steps', i], at: `steps[${i}]` }),\n )\n } else {\n plan.push({ phase: 'main', step: caseAsStep(data), source: [], at: '' })\n }\n data.teardown?.forEach((step, i) =>\n plan.push({ phase: 'teardown', step, source: ['teardown', i], at: `teardown[${i}]` }),\n )\n return plan\n}\n\n/** True when the case reports per-step results (a flow, or a case with setup/teardown). */\nexport function isMultiStep(data: TestCase): boolean {\n return (\n data.steps !== undefined || (data.setup?.length ?? 0) > 0 || (data.teardown?.length ?? 0) > 0\n )\n}\n\n// ---------------------------------------------------------------------------\n// Interpolation\n// ---------------------------------------------------------------------------\n\nexport interface InterpolationScope {\n vars: Record<string, JsonValue>\n env?: Record<string, string | undefined>\n}\n\nexport class InterpolationError extends Error {\n constructor(\n message: string,\n /** The placeholder name (`sid`, `env.TOKEN`). */\n readonly placeholder: string,\n readonly at: string,\n ) {\n super(message)\n this.name = 'InterpolationError'\n }\n}\n\nconst PLACEHOLDER = /\\{\\{\\s*([A-Za-z_][\\w.-]*)\\s*\\}\\}/g\nconst EXACT_PLACEHOLDER = /^\\{\\{\\s*([A-Za-z_][\\w.-]*)\\s*\\}\\}$/\n\nfunction lookup(name: string, scope: InterpolationScope, at: string): JsonValue {\n if (name.startsWith('env.')) {\n const key = name.slice(4)\n const value = (scope.env ?? process.env)[key]\n if (value === undefined) {\n throw new InterpolationError(\n `Interpolation failed at ${at || '(root)'}: {{${name}}} refers to environment variable ${key}, which is not set. Export it, or remove the reference.`,\n name,\n at,\n )\n }\n return value\n }\n if (!Object.hasOwn(scope.vars, name)) {\n const have = Object.keys(scope.vars)\n throw new InterpolationError(\n `Interpolation failed at ${at || '(root)'}: {{${name}}} has no captured value (captured so far: ${have.length ? have.join(', ') : 'none'}). Capture it in an earlier step with \"capture\": { \"${name}\": \"<path>\" }.`,\n name,\n at,\n )\n }\n return scope.vars[name]\n}\n\n/**\n * Replace `{{name}}` / `{{env.X}}` in every string of `value` (keys untouched). A string that\n * is exactly one placeholder becomes the raw captured JSON value; otherwise values are\n * inlined (strings as-is, everything else as JSON). Unknown names throw InterpolationError.\n */\nexport function interpolate(value: JsonValue, scope: InterpolationScope, at = ''): JsonValue {\n if (typeof value === 'string') {\n if (!value.includes('{{')) return value\n const exact = EXACT_PLACEHOLDER.exec(value)\n if (exact) return lookup(exact[1], scope, at)\n return value.replace(PLACEHOLDER, (_match, name: string) => {\n const resolved = lookup(name, scope, at)\n return typeof resolved === 'string' ? resolved : JSON.stringify(resolved)\n })\n }\n if (Array.isArray(value)) return value.map((item, i) => interpolate(item, scope, joinAt(at, i)))\n if (isPlainObject(value)) {\n const out: JsonObject = {}\n for (const [key, item] of Object.entries(value)) {\n out[key] = interpolate(item as JsonValue, scope, joinAt(at, key))\n }\n return out\n }\n return value\n}\n\n/** Every `{{name}}` used in `value`, with where it was found. */\nexport function placeholdersIn(value: unknown, at = ''): Array<{ name: string; at: string }> {\n const out: Array<{ name: string; at: string }> = []\n const walk = (node: unknown, where: string) => {\n if (typeof node === 'string') {\n for (const match of node.matchAll(PLACEHOLDER)) out.push({ name: match[1], at: where })\n } else if (Array.isArray(node)) node.forEach((item, i) => walk(item, joinAt(where, i)))\n else if (isPlainObject(node)) {\n for (const [key, item] of Object.entries(node)) walk(item, joinAt(where, key))\n }\n }\n walk(value, at)\n return out\n}\n\n/** Step fields that are interpolated before the operation runs. */\nexport const INTERPOLATED_KEYS = [\n 'tool',\n 'resource',\n 'resourceTemplate',\n 'prompt',\n 'args',\n 'expect',\n 'expectError',\n 'respond',\n 'expectInputRequired',\n 'expectTask',\n] as const\n\n/** Interpolate a step's interpolated fields. */\nexport function interpolateStep(step: Step, scope: InterpolationScope, at: string): Step {\n const out: Record<string, unknown> = { ...step }\n for (const key of INTERPOLATED_KEYS) {\n const value = (step as Record<string, unknown>)[key]\n if (value !== undefined) out[key] = interpolate(value as JsonValue, scope, joinAt(at, key))\n }\n return out as Step\n}\n\n/** Static check: every `{{name}}` refers to something captured earlier (or env / suite). */\nfunction checkPlaceholders(\n data: TestCase,\n globalNames: Set<string>,\n env: Record<string, string | undefined>,\n): string[] {\n const problems: string[] = []\n const known = new Set(globalNames)\n const everCaptured = new Set(globalNames)\n for (const planned of planSteps(data)) {\n for (const name of Object.keys(planned.step.capture ?? {})) everCaptured.add(name)\n }\n for (const planned of planSteps(data)) {\n const visible = planned.phase === 'teardown' ? everCaptured : known\n for (const key of INTERPOLATED_KEYS) {\n const value = (planned.step as Record<string, unknown>)[key]\n for (const use of placeholdersIn(value, joinAt(planned.at, key))) {\n if (use.name.startsWith('env.')) {\n if (env[use.name.slice(4)] === undefined) {\n problems.push(\n `${use.at}: {{${use.name}}} refers to environment variable ${use.name.slice(4)}, which is not set. Export it, or remove the reference`,\n )\n }\n } else if (!visible.has(use.name)) {\n problems.push(\n `${use.at}: {{${use.name}}} is never captured before this step. Add \"capture\": { \"${use.name}\": \"<dotted.path>\" } to an earlier step`,\n )\n }\n }\n }\n for (const name of Object.keys(planned.step.capture ?? {})) known.add(name)\n }\n return problems\n}\n\n// ---------------------------------------------------------------------------\n// $ref expansion & lint\n// ---------------------------------------------------------------------------\n\nfunction refLoader(caseFile: string): (relPath: string) => JsonValue {\n const dir = path.dirname(caseFile)\n return (relPath: string) => {\n if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(relPath)) {\n throw new Error('remote $ref URLs are not supported; vendor the fragment into the repo')\n }\n const file = path.isAbsolute(relPath) ? relPath : path.resolve(dir, relPath)\n return parseCaseText(fs.readFileSync(file, 'utf8'), relPath) as JsonValue\n }\n}\n\nfunction expandStep(step: Step, at: string, load: (relPath: string) => JsonValue): Step {\n const out: Record<string, unknown> = { ...step }\n for (const key of EXPECTATION_KEYS) {\n const value = step[key]\n if (value === undefined) continue\n try {\n out[key] = resolveRefs(value, load)\n } catch (err) {\n if (err instanceof RefResolutionError) {\n throw new Error(`${joinAt(at, key)}: ${err.message}`)\n }\n throw err\n }\n }\n return out as Step\n}\n\nfunction expandCase(data: TestCase, file: string): TestCase {\n const load = refLoader(file)\n const out: TestCase = { ...expandStep(data, '', load) } as TestCase\n for (const key of ['steps', 'setup', 'teardown'] as const) {\n const list = data[key]\n if (list) out[key] = list.map((step, i) => expandStep(step, `${key}[${i}]`, load))\n }\n return out\n}\n\nfunction lintCase(data: TestCase): string[] {\n const problems: string[] = []\n for (const planned of planSteps(data)) {\n for (const key of EXPECTATION_KEYS) {\n const value = planned.step[key]\n if (value === undefined) continue\n for (const m of lintExpectation(value)) {\n problems.push(`${joinAt(planned.at, key)} at ${m.path}: ${m.message}`)\n }\n }\n }\n return problems\n}\n\n// ---------------------------------------------------------------------------\n// Loading\n// ---------------------------------------------------------------------------\n\nfunction summarizeProblems(problems: string[]): string {\n const shown = problems.slice(0, 3).map((p) => p.replace(/\\.$/, ''))\n const more = problems.length > shown.length ? ` (+${problems.length - shown.length} more)` : ''\n const text = `${shown.join('; ')}${more}`\n return /[?!]$/.test(text) ? text : `${text}.`\n}\n\nfunction baseName(file: string): string {\n return path.basename(file).replace(/\\.jsonc?$/i, '')\n}\n\nexport interface LoadCaseFileOptions {\n rootDir: string\n defaultServer?: string\n servers?: string[]\n hooks?: SuiteHooks\n env?: Record<string, string | undefined>\n}\n\nfunction hookCaptureNames(hooks: SuiteHooks | undefined): Set<string> {\n const names = new Set<string>()\n for (const step of hooks?.setup ?? []) {\n for (const name of Object.keys(step.capture ?? {})) names.add(name)\n }\n return names\n}\n\n/** A manifest lock (`vib manifest record` output), not a case. */\nexport function looksLikeManifest(raw: unknown): boolean {\n return isPlainObject(raw) && raw.vibrissa === 2 && Array.isArray(raw.tools)\n}\n\n/** Lock files for `manifest` (default server + per-server siblings), absolute. */\nexport function manifestFiles(options: LoadCasesOptions): string[] {\n const defaultServer = options.defaultServer ?? 'default'\n const servers = [...new Set([defaultServer, ...(options.servers ?? [])])]\n return servers.map((server) =>\n manifestPathFor(\n { manifest: options.manifest, rootDir: options.rootDir, defaultServer },\n server,\n ),\n )\n}\n\n/**\n * Load one case file. Never throws: problems land in `error` (and `warnings`). A file shaped\n * like a manifest lock comes back with `notACase: 'manifest'` (and no data).\n */\nexport function loadCaseFile(\n file: string,\n opts: LoadCaseFileOptions,\n warnings: string[] = [],\n): LoadedCase {\n const id = caseIdFor(file, opts.rootDir)\n const defaultServer = opts.defaultServer ?? 'default'\n const ref: CaseRef = {\n id,\n name: baseName(file),\n file: id,\n tags: [],\n server: defaultServer,\n line: 1,\n }\n const loaded: LoadedCase = { ref, path: path.resolve(file) }\n let text: string\n try {\n text = fs.readFileSync(file, 'utf8')\n } catch (err) {\n loaded.error = `${id}: cannot read the case file (${err instanceof Error ? err.message : String(err)}). Check the path and permissions.`\n return loaded\n }\n loaded.text = text\n let raw: unknown\n try {\n raw = parseCaseText(text, id)\n } catch (err) {\n loaded.error = err instanceof Error ? err.message : String(err)\n return loaded\n }\n\n if (looksLikeManifest(raw)) {\n loaded.notACase = 'manifest'\n return loaded\n }\n\n if (isPlainObject(raw)) {\n if (typeof raw.name === 'string' && raw.name) ref.name = raw.name\n if (Array.isArray(raw.tags))\n ref.tags = raw.tags.filter((t): t is string => typeof t === 'string')\n if (typeof raw.server === 'string' && raw.server) ref.server = raw.server\n if (raw.flaky === true) ref.flaky = true\n }\n\n const shape = validateCaseShape(raw)\n for (const warning of shape.warnings) warnings.push(`${id}: ${warning}.`)\n if (shape.problems.length > 0) {\n loaded.error = `${id}: ${summarizeProblems(shape.problems)}`\n return loaded\n }\n const source = raw as TestCase\n loaded.source = source\n\n if (opts.servers && source.server !== undefined && !opts.servers.includes(source.server)) {\n loaded.error = `${id}: unknown server \"${source.server}\" (have: ${opts.servers.join(', ') || 'none'}). Add it to \"servers\" in vibrissa.json, or fix \"server\".`\n return loaded\n }\n\n let data: TestCase\n try {\n data = expandCase(source, loaded.path)\n } catch (err) {\n loaded.error = `${id}: ${err instanceof Error ? err.message : String(err)}`\n return loaded\n }\n\n const problems = [\n ...lintCase(data),\n ...checkPlaceholders(data, hookCaptureNames(opts.hooks), opts.env ?? process.env),\n ]\n if (problems.length > 0) {\n loaded.error = `${id}: ${summarizeProblems(problems)}`\n return loaded\n }\n loaded.data = data\n if (source.skip !== undefined && source.skip !== false) {\n loaded.skip = typeof source.skip === 'string' && source.skip ? source.skip : 'skip: true'\n }\n return loaded\n}\n\n// ---------------------------------------------------------------------------\n// Filters\n// ---------------------------------------------------------------------------\n\nfunction grepMatcher(grep: string): (text: string) => boolean {\n try {\n const re = new RegExp(grep, 'i')\n return (text) => re.test(text)\n } catch {\n const needle = grep.toLowerCase()\n return (text) => text.toLowerCase().includes(needle)\n }\n}\n\n/** Apply tag / exclude-tag / grep filters, then the shard, to id-sorted cases. */\nexport function filterCases(cases: LoadedCase[], filters: CaseFilters): LoadedCase[] {\n const tags = (filters.tags ?? []).filter(Boolean)\n const exclude = (filters.excludeTags ?? []).filter(Boolean)\n const grep = filters.grep ? grepMatcher(filters.grep) : undefined\n const selected = [...cases]\n .sort((a, b) => (a.ref.id < b.ref.id ? -1 : a.ref.id > b.ref.id ? 1 : 0))\n .filter((c) => {\n // Broken files carry no trustworthy tags; keep them so they are never silently dropped.\n const broken = c.error !== undefined && c.source === undefined\n if (!broken && tags.length > 0 && !c.ref.tags.some((t) => tags.includes(t))) return false\n if (!broken && exclude.length > 0 && c.ref.tags.some((t) => exclude.includes(t))) return false\n if (grep && !grep(c.ref.name) && !grep(c.ref.id)) return false\n return true\n })\n return shardCases(selected, filters.shard)\n}\n\n/** Keep every `total`-th case of the (already sorted) list, starting at `index` (1-based). */\nexport function shardCases<T>(cases: T[], shard: ShardSpec | undefined): T[] {\n if (!shard || shard.total <= 1) return cases\n return cases.filter((_, i) => i % shard.total === shard.index - 1)\n}\n\nfunction pathKey(file: string): string {\n const resolved = path.resolve(file)\n return process.platform === 'win32' ? resolved.toLowerCase() : resolved\n}\n\n/** Directory names whose JSON files are `$ref` fragments, not cases. */\nexport const FRAGMENT_DIRS: readonly string[] = ['shared', 'fragments']\n\nconst URL_REF = /^[a-z][a-z0-9+.-]*:\\/\\//i\n\n/** Absolute files referenced by `$ref`s anywhere in `doc` (pointers and URLs ignored). */\nfunction refTargets(doc: unknown, file: string, out: Set<string>): void {\n if (Array.isArray(doc)) {\n for (const item of doc) refTargets(item, file, out)\n return\n }\n if (!isPlainObject(doc)) return\n for (const [key, value] of Object.entries(doc)) {\n if (key === '$ref' && typeof value === 'string') {\n const target = value.split('#')[0]\n if (target && !URL_REF.test(target)) {\n out.add(pathKey(path.resolve(path.dirname(file), target.replace(/\\\\/g, '/'))))\n }\n } else refTargets(value, file, out)\n }\n}\n\n/** A JSON document that cannot be a case: no operation key and no `steps`. */\nfunction hasNoOperation(raw: unknown): boolean {\n if (!isPlainObject(raw)) return true\n return raw.steps === undefined && OP_KINDS.every((kind) => raw[kind] === undefined)\n}\n\nfunction inFragmentDir(file: string, rootDir: string): boolean {\n const rel = path.relative(rootDir, file)\n const parts = (rel && !rel.startsWith('..') ? rel : file).split(/[\\\\/]/).slice(0, -1)\n return parts.some((part) => FRAGMENT_DIRS.includes(part.toLowerCase()))\n}\n\nfunction loadAll(files: string[], options: LoadCasesOptions): LoadCasesResult {\n const warnings: string[] = []\n const excluded = new Set(\n [\n ...manifestFiles(options),\n ...(options.exclude ?? []).map((file) => path.resolve(options.rootDir, file)),\n ].map(pathKey),\n )\n const loaded = files\n .filter((file) => !excluded.has(pathKey(file)))\n .map((file) => {\n const notes: string[] = []\n return { file, loaded: loadCaseFile(file, options, notes), notes }\n })\n .filter(({ loaded: l }) => l.notACase === undefined)\n\n // `$ref` fragments matched by the globs: no operation, and either referenced by a `$ref`\n // from another matched file or kept in a `shared/` / `fragments/` directory.\n const docs = new Map<string, unknown>()\n for (const { file, loaded: l } of loaded) {\n if (l.text === undefined) continue\n try {\n docs.set(file, parseCaseText(l.text, l.ref.id))\n } catch {\n // unparseable: stays a load error\n }\n }\n const referenced = new Set<string>()\n for (const [file, doc] of docs) refTargets(doc, file, referenced)\n const fragments: string[] = []\n const all: LoadedCase[] = []\n for (const { file, loaded: l, notes } of loaded) {\n const doc = docs.get(file)\n const fragment =\n docs.has(file) &&\n hasNoOperation(doc) &&\n (referenced.has(pathKey(file)) || inFragmentDir(file, options.rootDir))\n if (fragment) {\n l.notACase = 'fragment'\n fragments.push(l.ref.id)\n } else {\n all.push(l)\n warnings.push(...notes)\n }\n }\n return {\n cases: filterCases(all, options),\n matched: all.length,\n warnings,\n ...(fragments.length ? { fragments: fragments.sort() } : {}),\n }\n}\n\n/** Resolve globs, load every case, apply filters. Never throws for bad case files. */\nexport async function loadCases(options: LoadCasesOptions): Promise<LoadCasesResult> {\n return loadAll(await resolveCaseFiles(options.globs, options.rootDir), options)\n}\n\n/** Synchronous loadCases (for test-runner bridges that register tests at import time). */\nexport function loadCasesSync(options: LoadCasesOptions): LoadCasesResult {\n return loadAll(resolveCaseFilesSync(options.globs, options.rootDir), options)\n}\n\n// ---------------------------------------------------------------------------\n// Dotted paths\n// ---------------------------------------------------------------------------\n\n/** Split `a.b[0].c` / `a.b.0.c` into segments. */\nexport function parsePath(dotted: string): string[] {\n const segments: string[] = []\n for (const part of dotted.split('.')) {\n if (part === '') continue\n const re = /([^[\\]]+)|\\[(\\d+)\\]/g\n for (const match of part.matchAll(re)) segments.push(match[1] ?? match[2])\n }\n return segments\n}\n\n/** Read a dotted path (`structuredContent.items[0].id`) from a JSON value. */\nexport function getPath(value: JsonValue | undefined, dotted: string): JsonValue | undefined {\n let node: JsonValue | undefined = value\n for (const segment of parsePath(dotted)) {\n if (Array.isArray(node)) {\n if (!/^\\d+$/.test(segment)) return undefined\n node = node[Number(segment)]\n } else if (isPlainObject(node) && Object.hasOwn(node, segment)) {\n node = (node as JsonObject)[segment]\n } else return undefined\n }\n return node\n}\n\n/** Set `value` at `source` path segments inside `root` (mutates). */\nexport function setIn(\n root: Record<string, unknown>,\n source: Array<string | number>,\n value: unknown,\n): void {\n let node: Record<string | number, unknown> = root\n for (let i = 0; i < source.length - 1; i++) node = node[source[i]] as Record<string, unknown>\n node[source[source.length - 1]] = value\n}\n","/**\n * Tiny ANSI color helper (no chalk). Every reporter takes a `Colors` object so the\n * same rendering code produces colored output in pretty mode and plain text otherwise.\n */\n\nexport type Paint = (text: string) => string\n\nexport interface Colors {\n readonly enabled: boolean\n bold: Paint\n dim: Paint\n inverse: Paint\n red: Paint\n green: Paint\n yellow: Paint\n cyan: Paint\n magenta: Paint\n gray: Paint\n bgRed: Paint\n bgGreen: Paint\n bgYellow: Paint\n bgCyan: Paint\n}\n\nconst identity: Paint = (text) => text\n\nfunction wrap(open: number, close: number): Paint {\n return (text) => (text === '' ? '' : `\\x1b[${open}m${text}\\x1b[${close}m`)\n}\n\nconst ON: Colors = {\n enabled: true,\n bold: wrap(1, 22),\n dim: wrap(2, 22),\n inverse: wrap(7, 27),\n red: wrap(31, 39),\n green: wrap(32, 39),\n yellow: wrap(33, 39),\n cyan: wrap(36, 39),\n magenta: wrap(35, 39),\n gray: wrap(90, 39),\n bgRed: wrap(41, 49),\n bgGreen: wrap(42, 49),\n bgYellow: wrap(43, 49),\n bgCyan: wrap(46, 49),\n}\n\nconst OFF: Colors = {\n enabled: false,\n bold: identity,\n dim: identity,\n inverse: identity,\n red: identity,\n green: identity,\n yellow: identity,\n cyan: identity,\n magenta: identity,\n gray: identity,\n bgRed: identity,\n bgGreen: identity,\n bgYellow: identity,\n bgCyan: identity,\n}\n\nexport function createColors(enabled: boolean): Colors {\n return enabled ? ON : OFF\n}\n\n// biome-ignore lint/suspicious/noControlCharactersInRegex: matching ANSI escapes\nconst ANSI_PATTERN = /\\x1b\\[[0-9;]*m/g\n\nexport function stripAnsi(text: string): string {\n return text.replace(ANSI_PATTERN, '')\n}\n\nexport function visibleLength(text: string): number {\n return stripAnsi(text).length\n}\n\nexport type EnvLike = Record<string, string | undefined>\n\n/**\n * Decide whether console output should be pretty (colors + unicode glyphs) or plain.\n * Plain wins when the caller asked for it, when NO_COLOR is set (https://no-color.org),\n * when TERM=dumb, or when stdout is not a TTY. FORCE_COLOR (non-\"0\") overrides the TTY\n * check so CI systems that render ANSI can opt in.\n */\nexport function resolveStyle(pretty: boolean, env: EnvLike, isTTY: boolean): 'pretty' | 'plain' {\n if (!pretty) return 'plain'\n if (env.NO_COLOR !== undefined && env.NO_COLOR !== '') return 'plain'\n if (env.TERM === 'dumb') return 'plain'\n const force = env.FORCE_COLOR\n if (force !== undefined && force !== '' && force !== '0' && force !== 'false') return 'pretty'\n return isTTY ? 'pretty' : 'plain'\n}\n","/**\n * Helpers shared by the built-in reporters: a run-state collector that folds RunEvents\n * into a queryable model, duration/path formatting, JSON-safe serialization, and the\n * failure-detail renderer (reason, mismatch list, budget, Jest-style diff, trace).\n */\nimport path from 'node:path'\nimport { diffStringsUnified } from 'jest-diff'\nimport type {\n CaseOutcome,\n CaseRef,\n CaseStatus,\n CheckOutcome,\n Mismatch,\n RunEvent,\n RunSummary,\n StepRef,\n} from '../events.js'\nimport type { JsonValue } from '../types.js'\nimport { type Colors, createColors } from './ansi.js'\n\n// ---------------------------------------------------------------------------\n// Fields the runner is adding to the contract. Read defensively so reporters work\n// before and after src/events.ts declares them.\n// ---------------------------------------------------------------------------\n\nexport interface ShardInfo {\n index: number\n total: number\n}\n\n/** `outcome.updateSkipped.reason`: why --update left this failing golden alone. */\nexport function updateSkippedReason(outcome: CaseOutcome): string | undefined {\n const value = (outcome as { updateSkipped?: unknown }).updateSkipped\n if (typeof value !== 'object' || value === null) return undefined\n const reason = (value as { reason?: unknown }).reason\n return typeof reason === 'string' && reason !== '' ? reason : 'skipped by --update'\n}\n\n/** `run:start.shard` as `{ index, total }`, when present and well-formed. */\nexport function shardOf(event: object): ShardInfo | undefined {\n const value = (event as { shard?: unknown }).shard\n if (typeof value !== 'object' || value === null) return undefined\n const { index, total } = value as { index?: unknown; total?: unknown }\n return typeof index === 'number' && typeof total === 'number' ? { index, total } : undefined\n}\n\n/** Remove the runner's \"Use --update ...\" sentence (annotations must not suggest it). */\nexport function stripUpdateHint(text: string): string {\n return text.replace(/\\s*Use --update\\b[^\\n.]*\\.?/g, '').trimEnd()\n}\n\n/** The runner reports \"zero cases after filters\" as a warning; treat it as an error line. */\nexport function isNoCasesMessage(message: string): boolean {\n return /^No test cases (?:matched|left)\\b/.test(message)\n}\n\n// ---------------------------------------------------------------------------\n// Formatting\n// ---------------------------------------------------------------------------\n\nexport function formatDuration(ms: number): string {\n const safe = Number.isFinite(ms) && ms > 0 ? Math.round(ms) : 0\n if (safe < 1000) return `${safe}ms`\n if (safe < 60_000) return `${(safe / 1000).toFixed(2)}s`\n const totalSeconds = Math.round(safe / 1000)\n const minutes = Math.floor(totalSeconds / 60)\n return `${minutes}m${String(totalSeconds % 60).padStart(2, '0')}s`\n}\n\nexport function formatPercent(rate: number): string {\n return `${Math.round(rate * 100)}%`\n}\n\n/**\n * `2/3 passed (67%)`, or just `60% pass rate` when the runs this reporter saw do not\n * account for the rate the runner reported (e.g. sharded or partially reported runs).\n */\nexport function formatPassRate(r: { rate: number; runs: number; passes: number }): string {\n const consistent = r.runs > 0 && Math.abs(r.passes / r.runs - r.rate) < 0.005\n return consistent\n ? `${r.passes}/${r.runs} passed (${formatPercent(r.rate)})`\n : `${formatPercent(r.rate)} pass rate`\n}\n\nexport function plural(count: number, one: string, many = `${one}s`): string {\n return `${count} ${count === 1 ? one : many}`\n}\n\nexport function truncate(text: string, max: number, ellipsis = '...'): string {\n if (text.length <= max) return text\n return `${text.slice(0, Math.max(0, max - ellipsis.length))}${ellipsis}`\n}\n\n/** First line of a possibly multi-line string. */\nexport function firstLine(text: string): string {\n const idx = text.search(/\\r?\\n/)\n return idx === -1 ? text : text.slice(0, idx)\n}\n\nexport function splitLines(text: string): string[] {\n return text.split(/\\r?\\n/)\n}\n\n/** Forward-slash a path; make it relative to rootDir when it is absolute and inside it. */\nexport function displayPath(p: string, rootDir?: string): string {\n let out = p\n if (rootDir && path.isAbsolute(p)) {\n const rel = path.relative(rootDir, p)\n if (rel !== '' && !rel.startsWith('..') && !path.isAbsolute(rel)) out = rel\n }\n return out.replace(/\\\\/g, '/')\n}\n\nexport function resolveOutDir(rootDir: string, outDir: string): string {\n return path.resolve(rootDir, outDir)\n}\n\n/**\n * GitHub Actions treats any stdout line that starts with `::` (after leading whitespace)\n * as a workflow command. Server output we echo (diffs of raw strings) must never be able\n * to inject one, so neutralize the leading `::` with a zero-width space.\n */\nexport function neutralizeWorkflowCommand(line: string): string {\n const trimmed = line.trimStart()\n if (!trimmed.startsWith('::')) return line\n const lead = line.length - trimmed.length\n return `${line.slice(0, lead)}:\\u200b${trimmed.slice(1)}`\n}\n\n/** Compact one-line JSON rendering of an arbitrary value. */\nexport function formatValue(value: unknown, max = 120): string {\n if (value === undefined) return 'undefined'\n let text: string\n try {\n text = JSON.stringify(toJsonSafe(value)) ?? String(value)\n } catch {\n text = String(value)\n }\n return truncate(text, max)\n}\n\n/**\n * Convert an arbitrary value into a JsonValue: drops undefined/functions/symbols in\n * objects (null in arrays), stringifies bigints, breaks cycles, maps non-finite numbers\n * to null, and turns Error/Map/Set/Date into plain JSON.\n */\nexport function toJsonSafe(value: unknown, seen: WeakSet<object> = new WeakSet()): JsonValue {\n if (value === null) return null\n switch (typeof value) {\n case 'string':\n case 'boolean':\n return value\n case 'number':\n return Number.isFinite(value) ? value : null\n case 'bigint':\n return value.toString()\n case 'undefined':\n case 'function':\n case 'symbol':\n return null\n }\n const obj = value as object\n if (seen.has(obj)) return '[Circular]'\n seen.add(obj)\n try {\n if (Array.isArray(obj)) return obj.map((item) => toJsonSafe(item, seen))\n if (obj instanceof Date) return Number.isNaN(obj.getTime()) ? null : obj.toISOString()\n if (obj instanceof Error) return { name: obj.name, message: obj.message }\n if (obj instanceof Map) {\n const out: Record<string, JsonValue> = {}\n for (const [k, v] of obj) out[String(k)] = toJsonSafe(v, seen)\n return out\n }\n if (obj instanceof Set) return Array.from(obj, (item) => toJsonSafe(item, seen))\n const out: Record<string, JsonValue> = {}\n for (const [k, v] of Object.entries(obj)) {\n if (v === undefined || typeof v === 'function' || typeof v === 'symbol') continue\n out[k] = toJsonSafe(v, seen)\n }\n return out\n } finally {\n seen.delete(obj)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Ids\n// ---------------------------------------------------------------------------\n\nconst RUN_SUFFIX = /#(\\d+)$/\n\n/** Case id without the `#<n>` repeat suffix. */\nexport function baseCaseId(id: string): string {\n return id.replace(RUN_SUFFIX, '')\n}\n\n/** Repeat index parsed from a `#<n>` id suffix, if any. */\nexport function runIndexOf(id: string): number | undefined {\n const match = RUN_SUFFIX.exec(id)\n return match ? Number(match[1]) : undefined\n}\n\n/**\n * Human label for a flow step: `2. fetch session [tool session.get]`, or\n * `2. tool session.get` when the step has no distinct name. StepRef.index is 0-based.\n */\nexport function stepLabel(step: StepRef): string {\n const target = `${step.kind} ${step.target}`.trim()\n if (step.name && step.name !== step.target) return `${step.index + 1}. ${step.name} [${target}]`\n return `${step.index + 1}. ${target}`\n}\n\n// ---------------------------------------------------------------------------\n// Run-state collector\n// ---------------------------------------------------------------------------\n\nexport interface StepRecord {\n step: StepRef\n durationMs: number\n status: CaseStatus\n reason?: string\n}\n\nexport interface CaseRecord {\n ref: CaseRef\n outcome: CaseOutcome\n /** `outcome.steps` when present, otherwise steps gathered from step:end events. */\n steps: StepRecord[]\n /** Id without the repeat suffix. */\n caseId: string\n /** Repeat index (from the `#<n>` id suffix) when the run repeats cases. */\n run?: number\n}\n\nexport interface ManifestRecord {\n path: string\n server?: string\n status: 'ok' | 'diff'\n summary?: string\n diff?: JsonValue\n}\n\nexport interface SessionRecord {\n server: string\n era?: 'legacy' | 'modern'\n protocolVersion?: string\n serverInfo?: { name?: string; version?: string }\n}\n\nexport interface PassRateRecord {\n caseId: string\n name: string\n file?: string\n server?: string\n /** The case declared `flaky: true` (a pass-rate floor applies). */\n declaredFlaky?: boolean\n rate: number\n runs: number\n passes: number\n}\n\n/** `echo-server 1.2.0`, or undefined when the server did not identify itself. */\nexport function serverInfoLabel(info?: { name?: string; version?: string }): string | undefined {\n const label = [info?.name, info?.version].filter((x) => x).join(' ')\n return label || undefined\n}\n\nexport class RunCollector {\n startedAt?: number\n totalCases?: number\n /** run:start.repeat, when the runner announced it. */\n repeat?: number\n /** run:start.shard, when the runner announced it. */\n shard?: ShardInfo\n /** run:end.ok: the runner's own verdict, which wins over our derivation. */\n runOk?: boolean\n readonly servers: string[] = []\n readonly sessions = new Map<string, SessionRecord>()\n readonly cases: CaseRecord[] = []\n readonly checks: CheckOutcome[] = []\n readonly manifests: ManifestRecord[] = []\n readonly warnings: string[] = []\n summary?: RunSummary\n ended = false\n private readonly pendingSteps = new Map<string, StepRecord[]>()\n\n /** Fold one event into the model; returns the CaseRecord on case:end. */\n handle(event: RunEvent): CaseRecord | undefined {\n switch (event.type) {\n case 'run:start':\n this.startedAt = event.startedAt\n this.totalCases = event.totalCases\n this.repeat = event.repeat\n this.shard = shardOf(event)\n for (const server of event.servers) this.addServer(server)\n return undefined\n case 'session:start':\n this.addServer(event.server)\n this.sessions.set(event.server, {\n server: event.server,\n era: event.era,\n protocolVersion: event.protocolVersion,\n serverInfo: event.serverInfo,\n })\n return undefined\n case 'manifest:ok':\n this.manifests.push({ path: event.path, server: event.server, status: 'ok' })\n return undefined\n case 'manifest:diff':\n this.manifests.push({\n path: event.path,\n server: event.server,\n status: 'diff',\n summary: event.summary,\n diff: event.diff,\n })\n return undefined\n case 'check':\n this.checks.push(event.outcome)\n return undefined\n case 'step:end': {\n const list = this.pendingSteps.get(event.case.id) ?? []\n list.push({\n step: event.step,\n durationMs: event.durationMs,\n status: event.status,\n reason: event.reason,\n })\n this.pendingSteps.set(event.case.id, list)\n return undefined\n }\n case 'case:end': {\n this.addServer(event.case.server)\n const collected = this.pendingSteps.get(event.case.id) ?? []\n this.pendingSteps.delete(event.case.id)\n const steps = event.outcome.steps?.length ? event.outcome.steps : collected\n const record: CaseRecord = {\n ref: event.case,\n outcome: event.outcome,\n steps: [...steps].sort((a, b) => a.step.index - b.step.index),\n caseId: baseCaseId(event.case.id),\n run: runIndexOf(event.case.id),\n }\n this.cases.push(record)\n return record\n }\n case 'warning':\n this.warnings.push(event.message)\n return undefined\n case 'run:end':\n this.summary = event.summary\n this.runOk = event.ok\n this.ended = true\n return undefined\n default:\n return undefined\n }\n }\n\n private addServer(server: string): void {\n if (!this.servers.includes(server)) this.servers.push(server)\n }\n\n get multiServer(): boolean {\n return this.servers.length > 1\n }\n\n /** The run:end summary, or one computed from collected cases when the run was cut short. */\n resolvedSummary(): RunSummary {\n if (this.summary) return this.summary\n const count = (status: CaseStatus) => this.cases.filter((c) => c.outcome.status === status)\n const durationMs = this.cases.reduce((sum, c) => sum + (c.outcome.durationMs || 0), 0)\n return {\n total: this.cases.length,\n passed: count('passed').length,\n failed: count('failed').length,\n skipped: count('skipped').length,\n updated: count('updated').length,\n durationMs,\n }\n }\n\n casesWith(status: CaseStatus): CaseRecord[] {\n return this.cases.filter((c) => c.outcome.status === status)\n }\n\n checkCounts(): { passed: number; failed: number; warned: number } {\n let passed = 0\n let failed = 0\n let warned = 0\n for (const check of this.checks) {\n if (check.status === 'passed') passed++\n else if (check.status === 'failed') failed++\n else warned++\n }\n return { passed, failed, warned }\n }\n\n manifestDrift(): ManifestRecord[] {\n return this.manifests.filter((m) => m.status === 'diff')\n }\n\n /**\n * The run's verdict: run:end.ok when the runner sent it; otherwise true when nothing\n * failed (no failed cases, no failed checks, no manifest drift).\n */\n ok(): boolean {\n if (this.runOk !== undefined) return this.runOk\n return (\n this.resolvedSummary().failed === 0 &&\n this.checkCounts().failed === 0 &&\n this.manifestDrift().length === 0\n )\n }\n\n /**\n * Pass rates per case when cases were repeated. Uses `summary.passRates` when the runner\n * provided it; otherwise derives rates from cases that ran more than once.\n */\n passRates(): PassRateRecord[] {\n const groups = new Map<string, CaseRecord[]>()\n for (const record of this.cases) {\n const list = groups.get(record.caseId) ?? []\n list.push(record)\n groups.set(record.caseId, list)\n }\n const byId = new Map<string, CaseRecord>()\n for (const record of this.cases) {\n byId.set(record.ref.id, record)\n if (!byId.has(record.caseId)) byId.set(record.caseId, record)\n }\n const tally = (caseId: string) => {\n const runs = (groups.get(caseId) ?? []).filter((c) => c.outcome.status !== 'skipped')\n const passes = runs.filter((c) => c.outcome.status !== 'failed').length\n return { runs: runs.length, passes }\n }\n const records: PassRateRecord[] = []\n const provided = this.summary?.passRates\n if (provided && Object.keys(provided).length > 0) {\n const seen = new Set<string>()\n for (const [key, rate] of Object.entries(provided)) {\n const record = byId.get(key)\n const caseId = record?.caseId ?? baseCaseId(key)\n if (seen.has(caseId)) continue\n seen.add(caseId)\n records.push({\n caseId,\n name: record?.ref.name ?? caseId,\n file: record?.ref.file,\n server: record?.ref.server,\n ...(record?.ref.flaky ? { declaredFlaky: true } : {}),\n rate,\n ...tally(caseId),\n })\n }\n } else {\n if (![...groups.values()].some((list) => list.length > 1)) return []\n for (const [caseId, list] of groups) {\n const { runs, passes } = tally(caseId)\n if (runs === 0) continue\n records.push({\n caseId,\n name: list[0].ref.name,\n file: list[0].ref.file,\n server: list[0].ref.server,\n ...(list[0].ref.flaky ? { declaredFlaky: true } : {}),\n rate: passes / runs,\n runs,\n passes,\n })\n }\n }\n return records.sort((a, b) => compareStrings(a.caseId, b.caseId))\n }\n\n /**\n * Repeat bookkeeping: distinct cases vs. executions. Undefined unless the run repeated\n * (run:start.repeat > 1, or ids carrying a `#<n>` suffix).\n */\n repeatInfo(): { cases: number; runs: number } | undefined {\n const repeated = (this.repeat ?? 1) > 1 || this.cases.some((c) => c.run !== undefined)\n if (!repeated) return undefined\n const runs = this.summary?.total ?? this.cases.length\n const distinct = new Set(this.cases.map((c) => c.caseId)).size\n const cases = distinct || (this.repeat ? Math.round(runs / this.repeat) : runs)\n return { cases, runs }\n }\n\n /**\n * Why the run failed beyond plain case failures: manifest drift, failed checks, case files\n * that failed to load, or no cases at all. Empty when ok, or when failed cases say it all.\n */\n verdictReasons(): string[] {\n if (!this.ended || this.ok()) return []\n const reasons: string[] = []\n const summary = this.resolvedSummary()\n if (summary.total === 0) reasons.push('no cases matched')\n const drift = this.manifestDrift().length\n if (drift > 0) reasons.push(drift === 1 ? 'manifest drift' : `manifest drift in ${drift} locks`)\n const failedChecks = this.checkCounts().failed\n if (failedChecks > 0) reasons.push(`${plural(failedChecks, 'check')} failed`)\n const load = this.cases.filter(\n (c) => c.outcome.status === 'failed' && c.outcome.errorKind === 'load',\n ).length\n if (load > 0) reasons.push(`${plural(load, 'case file')} failed to load`)\n if (reasons.length === 0 && summary.failed === 0 && this.warnings.length > 0) {\n reasons.push('see warnings')\n }\n return reasons\n }\n\n /** Cases that both passed and failed across repeats (0 < pass rate < 1). */\n flaky(): PassRateRecord[] {\n return this.passRates().filter((r) => r.rate > 0 && r.rate < 1)\n }\n}\n\n/** Locale-independent string comparison for stable output ordering. */\nexport function compareStrings(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0\n}\n\nexport function compareCases(a: CaseRecord, b: CaseRecord): number {\n return compareStrings(a.caseId, b.caseId) || (a.run ?? 0) - (b.run ?? 0)\n}\n\n// ---------------------------------------------------------------------------\n// Diff rendering\n// ---------------------------------------------------------------------------\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nconst DIRECTIVE_KEYS = new Set(['$regex', '$wildcard', '$unordered'])\n\nfunction isDirective(value: Record<string, unknown>): boolean {\n return Object.keys(value).some(\n (key) => DIRECTIVE_KEYS.has(key) || (key.startsWith('$') && key !== '$partial'),\n )\n}\n\n/**\n * Shape expected/actual for display. Under `$partial`, keys the expectation does not\n * mention (and array elements past its length) are irrelevant to the failure, so they are\n * omitted from the actual side; the `$partial` marker itself is dropped from the expected\n * side. Matcher directives are shown as written.\n */\nexport function projectForDiff(\n expected: unknown,\n actual: unknown,\n partial = false,\n): { expected: unknown; actual: unknown } {\n if (isPlainObject(expected) && !isDirective(expected)) {\n const isPartial = partial || expected.$partial === true\n const exp: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(expected)) if (k !== '$partial') exp[k] = v\n if (!isPlainObject(actual)) return { expected: exp, actual }\n const outExp: Record<string, unknown> = {}\n const outAct: Record<string, unknown> = {}\n for (const key of Object.keys(exp)) {\n if (key in actual) {\n const child = projectForDiff(exp[key], actual[key], isPartial)\n outExp[key] = child.expected\n outAct[key] = child.actual\n } else {\n outExp[key] = exp[key]\n }\n }\n if (!isPartial) {\n for (const key of Object.keys(actual)) if (!(key in exp)) outAct[key] = actual[key]\n }\n return { expected: outExp, actual: outAct }\n }\n if (Array.isArray(expected) && Array.isArray(actual)) {\n const limit = partial ? Math.min(actual.length, expected.length) : actual.length\n const outExp: unknown[] = []\n const outAct: unknown[] = []\n for (let i = 0; i < Math.max(expected.length, limit); i++) {\n if (i < expected.length && i < limit) {\n const child = projectForDiff(expected[i], actual[i], partial)\n outExp.push(child.expected)\n outAct.push(child.actual)\n } else if (i < expected.length) {\n outExp.push(expected[i])\n } else {\n outAct.push(actual[i])\n }\n }\n return { expected: outExp, actual: outAct }\n }\n return { expected, actual }\n}\n\nfunction stringifyForDiff(value: unknown): string {\n if (value === undefined) return 'undefined'\n return JSON.stringify(toJsonSafe(value), null, 2)\n}\n\nexport interface DiffOptions {\n aAnnotation?: string\n bAnnotation?: string\n maxLines?: number\n ellipsis?: string\n}\n\n/**\n * Jest-style unified diff between expected and actual. Returns undefined when there is\n * nothing to show (one side missing, or the two render identically).\n */\nexport function renderDiff(\n expected: unknown,\n actual: unknown,\n colors: Colors,\n opts: DiffOptions = {},\n): string[] | undefined {\n if (expected === undefined || actual === undefined) return undefined\n const projected = projectForDiff(expected, actual)\n const bothStrings = typeof projected.expected === 'string' && typeof projected.actual === 'string'\n const a = bothStrings ? (projected.expected as string) : stringifyForDiff(projected.expected)\n const b = bothStrings ? (projected.actual as string) : stringifyForDiff(projected.actual)\n if (a === b) return undefined\n const id = (s: string) => s\n const unified = diffStringsUnified(a, b, {\n aAnnotation: opts.aAnnotation ?? 'expected',\n bAnnotation: opts.bAnnotation ?? 'actual',\n aColor: colors.enabled ? colors.green : id,\n bColor: colors.enabled ? colors.red : id,\n changeColor: colors.enabled ? colors.inverse : id,\n commonColor: colors.enabled ? colors.dim : id,\n patchColor: colors.enabled ? colors.yellow : id,\n changeLineTrailingSpaceColor: id,\n commonLineTrailingSpaceColor: id,\n includeChangeCounts: true,\n expand: false,\n contextLines: 3,\n })\n const lines = splitLines(unified)\n const max = opts.maxLines ?? 80\n if (lines.length > max) {\n const hidden = lines.length - max\n return [\n ...lines.slice(0, max),\n colors.dim(`${opts.ellipsis ?? '...'} ${plural(hidden, 'more diff line')}`),\n ]\n }\n return lines\n}\n\n// ---------------------------------------------------------------------------\n// Failure details (plain-text body shared by junit / tap / github / summary)\n// ---------------------------------------------------------------------------\n\nexport const DEFAULT_MAX_MISMATCHES = 10\n\nexport function budgetText(budget: { budgetMs: number; actualMs: number }): string {\n return `Budget exceeded: took ${formatDuration(budget.actualMs)}, budget ${formatDuration(budget.budgetMs)}`\n}\n\n/** Budget line to add to failure details, unless the reason already says it. */\nexport function budgetNote(outcome: CaseOutcome): string | undefined {\n if (!outcome.budget) return undefined\n const text = budgetText(outcome.budget)\n return outcome.reason?.includes(text) ? undefined : text\n}\n\n/** `path (step 2): message`. Mismatch.stepIndex is 0-based; shown 1-based like step labels. */\nexport function mismatchLine(m: Mismatch): string {\n const step = m.stepIndex !== undefined ? ` (step ${m.stepIndex + 1})` : ''\n return `${m.path || '(root)'}${step}: ${m.message}`\n}\n\n/** One-line reason for a non-passing outcome. */\nexport function outcomeHeadline(outcome: CaseOutcome): string {\n if (outcome.reason) return firstLine(outcome.reason)\n const first = outcome.mismatches?.[0]\n if (first) {\n const more = (outcome.mismatches?.length ?? 1) - 1\n return `Expectation failed at ${mismatchLine(first)}${more > 0 ? ` (+${more} more)` : ''}`\n }\n const failedStep = outcome.steps?.find((s) => s.status === 'failed')\n if (failedStep) return `Step ${stepLabel(failedStep.step)} failed`\n if (outcome.budget) {\n return budgetText(outcome.budget)\n }\n return outcome.status === 'skipped' ? 'skipped' : 'failed'\n}\n\nexport interface FailureTextOptions {\n rootDir?: string\n maxMismatches?: number\n maxDiffLines?: number\n includeDiff?: boolean\n}\n\n/** Plain-text failure body: reason, steps, mismatches, budget, diff, trace. */\nexport function failureText(record: CaseRecord, opts: FailureTextOptions = {}): string[] {\n const { outcome } = record\n const lines: string[] = []\n if (outcome.reason) lines.push(...splitLines(outcome.reason))\n else lines.push(outcomeHeadline(outcome))\n const notUpdated = updateSkippedReason(outcome)\n if (notUpdated) lines.push(`Not updated: ${notUpdated}`)\n if (record.steps.length > 0) {\n lines.push('', 'Steps:')\n for (const s of record.steps) {\n const reason = s.reason ? ` - ${firstLine(s.reason)}` : ''\n lines.push(` [${s.status}] ${stepLabel(s.step)} (${formatDuration(s.durationMs)})${reason}`)\n }\n }\n const mismatches = outcome.mismatches ?? []\n if (mismatches.length > 0) {\n const max = opts.maxMismatches ?? DEFAULT_MAX_MISMATCHES\n lines.push('', `Mismatches (${mismatches.length}):`)\n for (const m of mismatches.slice(0, max)) lines.push(` ${mismatchLine(m)}`)\n if (mismatches.length > max) lines.push(` ... and ${mismatches.length - max} more`)\n }\n const budget = budgetNote(outcome)\n if (budget) lines.push('', budget)\n if (opts.includeDiff !== false) {\n const diff = renderDiff(outcome.expected, outcome.actual, createColors(false), {\n maxLines: opts.maxDiffLines,\n })\n if (diff) lines.push('', ...diff)\n }\n const artifacts = artifactLines(outcome, opts.rootDir)\n if (artifacts.length > 0) lines.push('', ...artifacts)\n return lines\n}\n\n/** `Trace: …` / `Stderr: …` lines for the files the runner captured for a case. */\nexport function artifactLines(outcome: CaseOutcome, rootDir?: string): string[] {\n const lines: string[] = []\n if (outcome.tracePath) lines.push(`Trace: ${displayPath(outcome.tracePath, rootDir)}`)\n if (outcome.stderrPath) lines.push(`Stderr: ${displayPath(outcome.stderrPath, rootDir)}`)\n return lines\n}\n\n/** Short label for non-assertion failures (`timeout`, `error`, `load error`). */\nexport function errorKindLabel(outcome: CaseOutcome): string | undefined {\n switch (outcome.errorKind) {\n case 'error':\n return 'error'\n case 'timeout':\n return 'timeout'\n case 'load':\n return 'load error'\n default:\n return undefined\n }\n}\n\n/** JUnit/CI notion of an error (vs an assertion failure). */\nexport function isErrorOutcome(outcome: CaseOutcome): boolean {\n return (\n outcome.errorKind === 'error' || outcome.errorKind === 'timeout' || outcome.errorKind === 'load'\n )\n}\n","/**\n * Render a manifest:diff payload for humans.\n *\n * The payload is the runner's structured ManifestDiff (see src/manifest.ts), read\n * defensively from JsonValue so reporters keep working while its shape evolves:\n *\n * { changes?: FieldChange[],\n * tools?|resources?|resourceTemplates?|prompts?: {\n * added?: Array<string | { key, breaking? }>, removed?: …same…,\n * changed?: Array<{ key, breaking?, fields: Array<{ path, before?, after?, breaking? }> }> },\n * error?: string }\n *\n * Output lines (ASCII, colored in pretty mode):\n * - removed tool get_forecast (breaking)\n * + added tool get_alerts\n * ~ tool get_weather / description (non-breaking)\n * Get the weather [-for a city-]{+anywhere+}\n * ~ server server.name\n * \"old\" -> \"new\"\n *\n * Unrecognized payloads return undefined so callers can fall back to a JSON dump.\n */\nimport type { JsonValue } from '../types.js'\nimport type { Colors } from './ansi.js'\nimport { plural, renderDiff, splitLines, truncate } from './shared.js'\n\ntype Obj = Record<string, JsonValue>\n\nconst SECTIONS: Array<[string, string, string]> = [\n ['tools', 'tool', 'tools'],\n ['resources', 'resource', 'resources'],\n ['resourceTemplates', 'resource template', 'resource templates'],\n ['prompts', 'prompt', 'prompts'],\n]\n\nfunction asObj(value: JsonValue | undefined): Obj | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? value : undefined\n}\n\nfunction asArray(value: JsonValue | undefined): JsonValue[] {\n return Array.isArray(value) ? value : []\n}\n\nfunction breakingOf(value: JsonValue | undefined): boolean | undefined {\n const flag = asObj(value)?.breaking\n return typeof flag === 'boolean' ? flag : undefined\n}\n\n/** `added` / `removed` entries: plain keys, or `{ key | name | uri, breaking? }`. */\nfunction entries(value: JsonValue | undefined): Array<{ key: string; breaking?: boolean }> {\n const out: Array<{ key: string; breaking?: boolean }> = []\n for (const item of asArray(value)) {\n if (typeof item === 'string') out.push({ key: item })\n else {\n const o = asObj(item)\n const key = o?.key ?? o?.name ?? o?.uri ?? o?.uriTemplate\n if (typeof key === 'string') out.push({ key, breaking: breakingOf(item) })\n }\n }\n return out\n}\n\ninterface Change {\n key: string\n breaking?: boolean\n fields: Array<{ path: string; before?: JsonValue; after?: JsonValue; breaking?: boolean }>\n}\n\nfunction fieldList(value: JsonValue | undefined): Change['fields'] {\n const out: Change['fields'] = []\n for (const f of asArray(value)) {\n const o = asObj(f)\n if (!o || typeof o.path !== 'string') continue\n out.push({\n path: o.path,\n ...(o.before !== undefined ? { before: o.before } : {}),\n ...(o.after !== undefined ? { after: o.after } : {}),\n breaking: breakingOf(f),\n })\n }\n return out\n}\n\nfunction changes(value: JsonValue | undefined): Change[] {\n const out: Change[] = []\n for (const c of asArray(value)) {\n const o = asObj(c)\n if (!o || typeof o.key !== 'string') continue\n out.push({ key: o.key, breaking: breakingOf(c), fields: fieldList(o.fields) })\n }\n return out\n}\n\n/** True when the payload looks like a structured ManifestDiff (or its error form). */\nexport function isStructuredDrift(diff: JsonValue | undefined): boolean {\n const o = asObj(diff)\n if (!o) return false\n return (\n typeof o.error === 'string' ||\n Array.isArray(o.changes) ||\n SECTIONS.some(([key]) => asObj(o[key]) !== undefined)\n )\n}\n\n/** `1 tool changed, 1 prompt added`; undefined for unstructured payloads. */\nexport function driftSummary(diff: JsonValue | undefined): string | undefined {\n if (!isStructuredDrift(diff)) return undefined\n const o = asObj(diff) as Obj\n if (typeof o.error === 'string') return `error: ${truncate(o.error, 80)}`\n const parts: string[] = []\n for (const [key, one, many] of SECTIONS) {\n const section = asObj(o[key])\n if (!section) continue\n const add = entries(section.added).length\n const rem = entries(section.removed).length\n const chg = changes(section.changed).length\n if (rem) parts.push(`${plural(rem, one, many)} removed`)\n if (chg) parts.push(`${plural(chg, one, many)} changed`)\n if (add) parts.push(`${plural(add, one, many)} added`)\n }\n const server = fieldList(o.changes).length\n if (server) parts.push(`${plural(server, 'server field')} changed`)\n return parts.length > 0 ? parts.join(', ') : undefined\n}\n\n// ---------------------------------------------------------------------------\n// Word diff\n// ---------------------------------------------------------------------------\n\nconst MAX_TOKENS = 400\n\n/** Words with their trailing whitespace (leading whitespace is its own token). */\nfunction tokenize(text: string): string[] {\n const lead = /^\\s+/.exec(text)?.[0]\n const words = text.match(/\\S+\\s*/g) ?? []\n return lead ? [lead, ...words] : words\n}\n\ntype Op = { op: 'eq' | 'del' | 'ins'; text: string }\n\n/** Words match regardless of the whitespace that follows them. */\nconst same = (x: string, y: string) => x.trimEnd() === y.trimEnd()\n\nfunction diffTokens(a: string[], b: string[]): Op[] {\n // LCS table over tokens; descriptions are short, so O(n·m) is fine (capped above).\n const n = a.length\n const m = b.length\n const lcs: number[][] = Array.from({ length: n + 1 }, () => new Array<number>(m + 1).fill(0))\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n lcs[i][j] = same(a[i], b[j]) ? lcs[i + 1][j + 1] + 1 : Math.max(lcs[i + 1][j], lcs[i][j + 1])\n }\n }\n const ops: Op[] = []\n const push = (op: Op['op'], text: string) => {\n const last = ops[ops.length - 1]\n if (last && last.op === op) last.text += text\n else ops.push({ op, text })\n }\n let i = 0\n let j = 0\n while (i < n && j < m) {\n if (same(a[i], b[j])) {\n // Keep the new text's spacing for unchanged words.\n push('eq', b[j++])\n i++\n } else if (lcs[i + 1][j] >= lcs[i][j + 1]) push('del', a[i++])\n else push('ins', b[j++])\n }\n while (i < n) push('del', a[i++])\n while (j < m) push('ins', b[j++])\n return ops\n}\n\nfunction splitTrailing(text: string): [string, string] {\n const ws = /\\s*$/.exec(text)?.[0] ?? ''\n return [text.slice(0, text.length - ws.length), ws]\n}\n\n/**\n * Word-level diff in `git --word-diff=plain` style: `[-removed-]{+added+}`, colored red /\n * green in pretty mode. Undefined when either text is too long to diff usefully.\n */\nexport function wordDiff(before: string, after: string, c: Colors): string | undefined {\n const a = tokenize(before)\n const b = tokenize(after)\n if (a.length > MAX_TOKENS || b.length > MAX_TOKENS) return undefined\n const ops = diffTokens(a, b)\n let out = ''\n for (let k = 0; k < ops.length; k++) {\n const { op, text } = ops[k]\n if (op === 'eq') {\n out += text\n continue\n }\n if (op === 'del' && ops[k + 1]?.op === 'ins') {\n const [delCore, delWs] = splitTrailing(text)\n const [insCore, insWs] = splitTrailing(ops[k + 1].text)\n out += `${c.red(`[-${delCore}-]`)}${c.green(`{+${insCore}+}`)}${insWs || delWs}`\n k++\n continue\n }\n const [core, ws] = splitTrailing(text)\n out += op === 'del' ? c.red(`[-${core}-]`) : c.green(`{+${core}+}`)\n out += ws\n }\n return out\n}\n\n// ---------------------------------------------------------------------------\n// Drift lines\n// ---------------------------------------------------------------------------\n\nfunction tag(breaking: boolean | undefined, c: Colors): string {\n if (breaking === true) return ` ${c.red('(breaking)')}`\n if (breaking === false) return ` ${c.dim('(non-breaking)')}`\n return ''\n}\n\nfunction short(value: JsonValue | undefined): string {\n return value === undefined ? '(absent)' : truncate(JSON.stringify(value), 100)\n}\n\nfunction valueLines(\n before: JsonValue | undefined,\n after: JsonValue | undefined,\n c: Colors,\n indent: string,\n): string[] {\n // Word diff for prose (descriptions); single tokens read better as `\"a\" -> \"b\"`.\n const prose = (v: string) => /\\s/.test(v.trim())\n if (typeof before === 'string' && typeof after === 'string' && (prose(before) || prose(after))) {\n const words = wordDiff(before, after, c)\n if (words !== undefined) return splitLines(words).map((l) => `${indent}${l}`)\n }\n const structured = (v: JsonValue | undefined) => typeof v === 'object' && v !== null\n if (structured(before) && structured(after)) {\n const diff = renderDiff(before, after, c, {\n aAnnotation: 'locked',\n bAnnotation: 'live',\n maxLines: 20,\n })\n if (diff) return diff.map((l) => (l === '' ? '' : `${indent}${l}`))\n }\n return [`${indent}${c.red(short(before))} -> ${c.green(short(after))}`]\n}\n\n/** The runner's summary is the full rendering (drift lines + tip) when it spans lines. */\nexport function isDetailedSummary(summary: string | undefined): boolean {\n return summary !== undefined && /\\r?\\n/.test(summary.trim())\n}\n\n/**\n * Lines to show under a drift summary: nothing when the summary already renders the drift,\n * otherwise our structured rendering. Never a raw JSON dump (results.json keeps the data).\n */\nexport function driftDetail(\n summary: string | undefined,\n diff: JsonValue | undefined,\n c: Colors,\n maxLines?: number,\n): string[] {\n if (isDetailedSummary(summary)) return []\n return renderManifestDrift(diff, c, maxLines) ?? []\n}\n\n/**\n * Human-readable drift lines for a structured ManifestDiff; undefined when the payload is\n * not recognizably structured (callers then fall back to a JSON dump).\n */\nexport function renderManifestDrift(\n diff: JsonValue | undefined,\n c: Colors,\n maxLines = 60,\n): string[] | undefined {\n if (!isStructuredDrift(diff)) return undefined\n const o = asObj(diff) as Obj\n const lines: string[] = []\n if (typeof o.error === 'string') lines.push(`${c.red('!')} ${o.error}`)\n for (const [key, one] of SECTIONS) {\n const section = asObj(o[key])\n if (!section) continue\n for (const r of entries(section.removed)) {\n // Removing a tool/prompt/resource breaks callers unless the runner says otherwise.\n lines.push(`${c.red('-')} removed ${one} ${c.bold(r.key)}${tag(r.breaking ?? true, c)}`)\n }\n for (const ch of changes(section.changed)) {\n if (ch.fields.length === 0) {\n lines.push(`${c.yellow('~')} ${one} ${c.bold(ch.key)}${tag(ch.breaking, c)}`)\n }\n for (const f of ch.fields) {\n lines.push(\n `${c.yellow('~')} ${one} ${c.bold(ch.key)} / ${f.path}${tag(f.breaking ?? ch.breaking, c)}`,\n )\n lines.push(...valueLines(f.before, f.after, c, ' '))\n }\n }\n for (const a of entries(section.added)) {\n lines.push(`${c.green('+')} added ${one} ${c.bold(a.key)}${tag(a.breaking, c)}`)\n }\n }\n for (const f of fieldList(o.changes)) {\n lines.push(`${c.yellow('~')} server ${f.path}${tag(f.breaking, c)}`)\n lines.push(...valueLines(f.before, f.after, c, ' '))\n }\n if (lines.length === 0) return undefined\n if (lines.length > maxLines) {\n const hidden = lines.length - maxLines\n return [...lines.slice(0, maxLines), c.dim(`... ${plural(hidden, 'more line')}`)]\n }\n return lines\n}\n","/**\n * Console reporter (default). Replaces v1's display.ts.\n *\n * - Quiet on success: one line per case, a header, and the summary banner.\n * - Loud on failure: a Failures section with the reason, flow steps, the mismatch list\n * (capped), budget breaches, a Jest-style expected/actual diff, and the trace path.\n * - Pretty mode: ANSI colors and unicode glyphs, v1-style summary box.\n * - Plain mode (non-TTY, NO_COLOR, TERM=dumb, or ctx.pretty=false): same information,\n * ASCII only, line-oriented, stable for CI logs.\n *\n * Output order is stable under concurrency: a case (and its steps) prints only at\n * case:end, so interleaved events from parallel workers never interleave lines.\n */\nimport type { CaseStatus, CheckOutcome, Reporter, ReporterContext, RunEvent } from '../events.js'\nimport { type Colors, type EnvLike, createColors, resolveStyle, visibleLength } from './ansi.js'\nimport { driftDetail, driftSummary } from './manifest.js'\nimport {\n type CaseRecord,\n DEFAULT_MAX_MISMATCHES,\n RunCollector,\n artifactLines,\n budgetNote,\n displayPath,\n errorKindLabel,\n firstLine,\n formatDuration,\n formatPassRate,\n isNoCasesMessage,\n mismatchLine,\n neutralizeWorkflowCommand,\n outcomeHeadline,\n plural,\n renderDiff,\n serverInfoLabel,\n splitLines,\n stepLabel,\n truncate,\n updateSkippedReason,\n} from './shared.js'\n\nexport interface ConsoleReporterOptions {\n /** Force a style. Default: derived from ctx.pretty, NO_COLOR, FORCE_COLOR and TTY. */\n style?: 'pretty' | 'plain'\n /** Environment used for style detection. Default: process.env. */\n env?: EnvLike\n /** Whether stdout is a terminal. Default: process.stdout.isTTY. */\n isTTY?: boolean\n /** Max mismatches listed per failed case. Default 10. */\n maxMismatches?: number\n /** Max diff lines per failed case. Default 80. */\n maxDiffLines?: number\n /** Width of the pretty summary box. Default 64 (v1). */\n width?: number\n}\n\ntype GlyphKey = CaseStatus | 'warned'\ntype Tone = 'ok' | 'warn' | 'bad'\n\ninterface Glyphs {\n status: Record<GlyphKey, string>\n bullet: string\n ellipsis: string\n rule: string\n arrow: string\n flaky: string\n}\n\nconst PRETTY_GLYPHS: Glyphs = {\n status: { passed: '✓', failed: '✗', skipped: '↓', updated: '✎', warned: '⚠' },\n bullet: '•',\n ellipsis: '…',\n rule: '─',\n arrow: '›',\n flaky: '~',\n}\n\nconst PLAIN_GLYPHS: Glyphs = {\n status: { passed: 'PASS', failed: 'FAIL', skipped: 'SKIP', updated: 'UPD ', warned: 'WARN' },\n bullet: '-',\n ellipsis: '...',\n rule: '-',\n arrow: '>',\n flaky: '~',\n}\n\nexport class ConsoleReporter implements Reporter {\n readonly name = 'console'\n readonly style: 'pretty' | 'plain'\n private readonly c: Colors\n private readonly g: Glyphs\n private readonly run = new RunCollector()\n private readonly maxMismatches: number\n private readonly maxDiffLines: number\n private readonly width: number\n private finished = false\n /** Passing checks, folded into one \"Checks: N passed\" line per server. */\n private readonly passedChecks = new Map<string, number>()\n /** The runner's \"no cases matched\" warning, printed as an error line at the end. */\n private noCasesMessage?: string\n\n constructor(\n private readonly ctx: ReporterContext,\n options: ConsoleReporterOptions = {},\n ) {\n this.style =\n options.style ??\n resolveStyle(ctx.pretty, options.env ?? process.env, options.isTTY ?? !!process.stdout.isTTY)\n const pretty = this.style === 'pretty'\n this.c = createColors(pretty)\n this.g = pretty ? PRETTY_GLYPHS : PLAIN_GLYPHS\n this.maxMismatches = options.maxMismatches ?? DEFAULT_MAX_MISMATCHES\n this.maxDiffLines = options.maxDiffLines ?? 80\n this.width = Math.max(40, options.width ?? 64)\n }\n\n onEvent(event: RunEvent): void {\n const record = this.run.handle(event)\n if (event.type !== 'check') this.flushPassedChecks()\n switch (event.type) {\n case 'run:start':\n this.printHeader(event.totalCases, event.servers, event.repeat)\n break\n case 'session:start': {\n const info = serverInfoLabel(event.serverInfo)\n const protocol = `${event.era} protocol ${event.protocolVersion}`\n this.out(\n this.c.dim(` ${this.g.arrow} ${event.server}: ${info ? `${info}, ` : ''}${protocol}`),\n )\n break\n }\n case 'manifest:ok':\n this.out(\n `${this.badge('passed')} manifest ${this.serverTag(event.server)}${this.path(event.path)}`,\n )\n break\n case 'manifest:diff':\n this.out(\n `${this.badge('failed')} ${this.c.red('manifest drift')} ${this.serverTag(event.server)}${this.path(event.path)}: ${firstLine(event.summary)}`,\n )\n break\n case 'check':\n this.printCheck(event.outcome)\n break\n case 'case:end':\n if (record) this.printCase(record)\n break\n case 'warning':\n this.printWarning(event.message)\n break\n case 'run:end':\n this.finish()\n break\n default:\n break\n }\n }\n\n close(): void {\n if (!this.finished) this.finish()\n }\n\n // -------------------------------------------------------------------------\n // Streaming lines\n // -------------------------------------------------------------------------\n\n private out(text = ''): void {\n for (const line of splitLines(text)) this.ctx.stdout(neutralizeWorkflowCommand(line))\n }\n\n private path(p: string): string {\n return this.c.gray(displayPath(p, this.ctx.rootDir))\n }\n\n private badge(status: GlyphKey): string {\n const glyph = this.g.status[status]\n switch (status) {\n case 'passed':\n return this.c.green(glyph)\n case 'failed':\n return this.c.red(glyph)\n case 'skipped':\n return this.c.yellow(glyph)\n case 'updated':\n return this.c.cyan(glyph)\n default:\n return this.c.yellow(glyph)\n }\n }\n\n /** `[server] ` prefix for manifest/check lines, only when the run spans several servers. */\n private serverTag(server: string | undefined): string {\n return server && this.run.multiServer ? `${this.c.gray(`[${server}]`)} ` : ''\n }\n\n private printHeader(totalCases: number, servers: string[], repeat?: number): void {\n const on = servers.length > 0 ? ` on ${servers.join(', ')}` : ''\n const notes: string[] = []\n if (this.run.shard) notes.push(`shard ${this.run.shard.index}/${this.run.shard.total}`)\n if (repeat !== undefined && repeat > 1) notes.push(`repeat ${repeat}`)\n const times = notes.length > 0 ? ` (${notes.join(', ')})` : ''\n const label = `running ${plural(totalCases, 'case')}${on}${times}`\n if (this.style === 'pretty') this.out(`${this.c.bold(this.c.cyan('vibrissa'))} ${label}`)\n else this.out(`vibrissa: ${label}`)\n }\n\n private caseTitle(record: CaseRecord): string {\n const parts: string[] = []\n if (this.run.multiServer) parts.push(this.c.gray(`[${record.ref.server}]`))\n parts.push(record.outcome.status === 'skipped' ? this.c.dim(record.ref.name) : record.ref.name)\n if (record.run !== undefined) parts.push(this.c.gray(`#${record.run}`))\n return parts.join(' ')\n }\n\n private caseMeta(record: CaseRecord): string {\n const { outcome } = record\n if (outcome.status === 'skipped') {\n return this.c.dim(`(skipped${outcome.reason ? `: ${firstLine(outcome.reason)}` : ''})`)\n }\n const bits: string[] = []\n if (outcome.status === 'updated') bits.push('golden updated')\n const kind = outcome.status === 'failed' ? errorKindLabel(outcome) : undefined\n if (kind) bits.push(kind)\n if (record.steps.length > 0 && outcome.status !== 'failed') {\n bits.push(plural(record.steps.length, 'step'))\n }\n bits.push(formatDuration(outcome.durationMs))\n const meta = this.c.dim(`(${bits.join(', ')})`)\n if (!outcome.budget) return meta\n const budget = `over ${formatDuration(outcome.budget.budgetMs)} budget`\n return `${meta} ${this.c.yellow(budget)}`\n }\n\n private printCase(record: CaseRecord): void {\n const { outcome } = record\n this.out(`${this.badge(outcome.status)} ${this.caseTitle(record)} ${this.caseMeta(record)}`)\n if (outcome.status === 'failed' && record.steps.length > 0) {\n for (const line of this.stepLines(record, ' ', false)) this.out(line)\n }\n }\n\n private stepLines(record: CaseRecord, indent: string, withReasons = true): string[] {\n const lines: string[] = []\n for (const s of record.steps) {\n const label = s.status === 'skipped' ? this.c.dim(stepLabel(s.step)) : stepLabel(s.step)\n const meta =\n s.status === 'skipped'\n ? this.c.dim('(skipped)')\n : this.c.dim(`(${formatDuration(s.durationMs)})`)\n lines.push(`${indent}${this.badge(s.status)} ${label} ${meta}`)\n if (withReasons && s.reason && s.status === 'failed') {\n for (const line of splitLines(s.reason)) lines.push(`${indent} ${this.c.red(line)}`)\n }\n }\n return lines\n }\n\n /**\n * Like `vib check`: passing checks fold into one line; failed/warned checks print their\n * id, title and detail, plus the allow-list entry that would accept them after review.\n */\n private printCheck(check: CheckOutcome): void {\n if (check.status === 'passed') {\n const key = check.server ?? ''\n this.passedChecks.set(key, (this.passedChecks.get(key) ?? 0) + 1)\n return\n }\n const paint = check.status === 'failed' ? this.c.red : this.c.yellow\n this.out(\n `${this.badge(check.status)} ${this.serverTag(check.server)}${paint(this.c.bold(check.id))} ${check.title}`,\n )\n if (check.detail) {\n for (const line of splitLines(check.detail)) this.out(` ${this.c.dim(line)}`)\n }\n this.out(` ${this.c.dim(`Accept after review: checks.allow: [\"${check.id}\"]`)}`)\n }\n\n private flushPassedChecks(): void {\n for (const [server, count] of this.passedChecks) {\n const where = server && this.run.multiServer ? ` [${server}]` : ''\n this.out(`${this.badge('passed')} Checks${where}: ${count} passed`)\n }\n this.passedChecks.clear()\n }\n\n private printWarning(message: string): void {\n if (isNoCasesMessage(message)) {\n this.noCasesMessage = message\n return\n }\n const [first, ...rest] = splitLines(message)\n this.out(`${this.badge('warned')} ${this.c.yellow(first)}`)\n for (const line of rest) this.out(` ${this.c.yellow(line)}`)\n }\n\n /** \"No cases matched\" is an error unless the runner accepted it (allowEmpty). */\n private printNoCases(): void {\n if (!this.noCasesMessage) return\n const accepted = this.run.ended && this.run.ok()\n const [first, ...rest] = splitLines(this.noCasesMessage)\n const glyph = accepted\n ? this.badge('warned')\n : this.c.red(this.style === 'pretty' ? '✗' : 'ERROR')\n const paint = accepted ? this.c.yellow : this.c.red\n this.out(`${glyph} ${paint(first)}`)\n for (const line of rest) this.out(` ${paint(line)}`)\n }\n\n // -------------------------------------------------------------------------\n // End of run\n // -------------------------------------------------------------------------\n\n private finish(): void {\n this.finished = true\n this.flushPassedChecks()\n this.printNoCases()\n this.printFailures()\n this.printManifestDrift()\n if (this.style === 'pretty') this.printBox()\n else this.printPlainSummary()\n }\n\n private rule(title: string, paint: (s: string) => string): void {\n const head = `${this.g.rule.repeat(2)} ${title} `\n const fill = Math.max(4, this.width - head.length)\n this.out('')\n this.out(paint(`${head}${this.g.rule.repeat(fill)}`))\n }\n\n private printFailures(): void {\n const failed = this.run.casesWith('failed')\n if (failed.length === 0) return\n this.rule(`Failures (${failed.length})`, (s) => this.c.bold(this.c.red(s)))\n // An --update run already decided what to rewrite; never suggest --update again.\n const updateRun = this.run.cases.some(\n (c) => c.outcome.status === 'updated' || updateSkippedReason(c.outcome) !== undefined,\n )\n let goldenMismatch = false\n for (const record of failed) {\n this.out('')\n this.printFailure(record)\n const { outcome } = record\n if (\n outcome.expected !== undefined &&\n outcome.actual !== undefined &&\n updateSkippedReason(outcome) === undefined &&\n !outcome.reason?.includes('--update')\n ) {\n goldenMismatch = true\n }\n }\n if (goldenMismatch && !updateRun) {\n this.out('')\n this.out(this.c.dim('Tip: if the new output is correct, rerun with --update to accept it.'))\n }\n }\n\n private printFailure(record: CaseRecord): void {\n const { outcome, ref } = record\n const c = this.c\n const head = this.style === 'pretty' ? c.bgRed(c.bold(' FAIL ')) : this.g.status.failed\n const kind = errorKindLabel(outcome)\n const kindTag = kind ? ` ${c.yellow(`[${kind}]`)}` : ''\n this.out(`${head} ${c.bold(this.caseTitle(record))} ${this.path(ref.file)}${kindTag}`)\n\n const reason = outcome.reason ?? outcomeHeadline(outcome)\n for (const line of splitLines(reason)) this.out(` ${c.red(line)}`)\n const notUpdated = updateSkippedReason(outcome)\n if (notUpdated) this.out(` ${c.yellow(`not updated: ${notUpdated}`)}`)\n\n if (record.steps.length > 0) {\n this.out('')\n this.out(` ${c.bold('Steps:')}`)\n for (const line of this.stepLines(record, ' ')) this.out(line)\n }\n\n const mismatches = outcome.mismatches ?? []\n if (mismatches.length > 0) {\n this.out('')\n this.out(` ${c.bold(`Mismatches (${mismatches.length}):`)}`)\n for (const m of mismatches.slice(0, this.maxMismatches)) {\n const text = mismatchLine(m)\n const colon = text.indexOf(': ')\n const shown = colon === -1 ? text : `${c.cyan(text.slice(0, colon))}${text.slice(colon)}`\n this.out(` ${this.g.bullet} ${shown}`)\n }\n if (mismatches.length > this.maxMismatches) {\n const more = mismatches.length - this.maxMismatches\n this.out(` ${c.dim(`${this.g.ellipsis} and ${more} more`)}`)\n }\n }\n\n const budget = budgetNote(outcome)\n if (budget) {\n this.out('')\n this.out(` ${c.yellow(budget)}`)\n }\n\n const diff = renderDiff(outcome.expected, outcome.actual, c, {\n maxLines: this.maxDiffLines,\n ellipsis: this.g.ellipsis,\n })\n if (diff) {\n this.out('')\n for (const line of diff) this.out(line === '' ? '' : ` ${line}`)\n }\n\n const artifacts = artifactLines(outcome, this.ctx.rootDir)\n if (artifacts.length > 0) {\n this.out('')\n for (const line of artifacts) {\n const colon = line.indexOf(': ')\n this.out(` ${c.dim(line.slice(0, colon + 1))}${line.slice(colon + 1)}`)\n }\n }\n }\n\n private printManifestDrift(): void {\n const drift = this.run.manifestDrift()\n if (drift.length === 0) return\n this.rule(`Manifest drift (${drift.length})`, (s) => this.c.bold(this.c.red(s)))\n for (const m of drift) {\n this.out('')\n this.out(\n `${this.badge('failed')} ${this.serverTag(m.server)}${this.c.bold(displayPath(m.path, this.ctx.rootDir))}`,\n )\n // The runner's summary may already be the full rendering (drift lines + tip).\n splitLines(m.summary ?? '').forEach((line, i) => {\n if (line) this.out(` ${i === 0 ? this.c.red(line) : line}`)\n })\n const lines = driftDetail(m.summary, m.diff, this.c)\n if (lines.length > 0) {\n this.out('')\n for (const line of lines) this.out(line === '' ? '' : ` ${line}`)\n }\n }\n if (!drift.every((m) => m.summary?.includes('--update-manifest'))) {\n this.out('')\n this.out(\n this.c.dim('Tip: review the change, then rerun with --update-manifest to accept it.'),\n )\n }\n }\n\n // Summary -----------------------------------------------------------------\n\n private summaryParts(): {\n counts: Array<[string, number]>\n duration: string\n extras: Array<{ text: string; tone: Tone }>\n flakyLines: string[]\n ok: boolean\n verdict: string\n } {\n const summary = this.run.resolvedSummary()\n const counts: Array<[string, number]> = [\n ['Passed', summary.passed],\n ['Failed', summary.failed],\n ['Skipped', summary.skipped],\n ['Updated', summary.updated],\n ]\n const extras: Array<{ text: string; tone: Tone }> = []\n if (this.run.checks.length > 0) {\n const cc = this.run.checkCounts()\n extras.push({\n text: `Checks: ${cc.passed} passed, ${cc.failed} failed, ${cc.warned} warned`,\n tone: cc.failed > 0 ? 'bad' : cc.warned > 0 ? 'warn' : 'ok',\n })\n }\n for (const m of this.run.manifests) {\n const where = m.server && this.run.multiServer ? ` [${m.server}]` : ''\n const file = displayPath(m.path, this.ctx.rootDir)\n if (m.status === 'ok') {\n extras.push({ text: `Manifest lock${where}: ok (${file})`, tone: 'ok' })\n } else {\n const what = driftSummary(m.diff) ?? firstLine(m.summary ?? 'changed')\n extras.push({ text: `Manifest lock${where}: DRIFT in ${file} (${what})`, tone: 'bad' })\n }\n }\n const warnings = this.run.warnings.filter((w) => !isNoCasesMessage(w)).length\n if (warnings > 0) extras.push({ text: `Warnings: ${warnings}`, tone: 'warn' })\n const updated = this.run.casesWith('updated').length\n if (updated > 0) extras.push({ text: `Goldens updated: ${updated}`, tone: 'ok' })\n if (!this.run.ended) {\n extras.push({ text: 'Run ended before completion (no run:end received)', tone: 'bad' })\n }\n\n const flakyLines: string[] = []\n const rates = this.run.passRates()\n if (rates.length > 0) {\n const flaky = rates.filter((r) => r.rate > 0 && r.rate < 1)\n flakyLines.push(`Pass rates: ${plural(rates.length, 'repeated case')}, ${flaky.length} flaky`)\n for (const r of flaky) {\n const declared = r.declaredFlaky ? ' [declared flaky]' : ''\n flakyLines.push(` ${this.g.flaky} ${r.name}: ${formatPassRate(r)}${declared}`)\n }\n }\n const ok = this.run.ok() && this.run.ended\n const reasons = this.run.verdictReasons()\n const verdict = !this.run.ended\n ? 'INCOMPLETE'\n : ok\n ? 'PASSED'\n : `FAILED${reasons.length > 0 ? ` (${reasons.join(', ')})` : ''}`\n return {\n counts,\n duration: formatDuration(summary.durationMs),\n extras,\n flakyLines,\n ok,\n verdict,\n }\n }\n\n /** `6 cases` or, when repeated, `2 cases, 6 runs`. */\n private sizeLabel(): string {\n const repeat = this.run.repeatInfo()\n if (repeat) return `${plural(repeat.cases, 'case')}, ${plural(repeat.runs, 'run')}`\n return plural(this.run.resolvedSummary().total, 'case')\n }\n\n private printPlainSummary(): void {\n const parts = this.summaryParts()\n this.out('')\n for (const extra of parts.extras) this.out(extra.text)\n for (const line of parts.flakyLines) this.out(line)\n const counts = parts.counts.map(([label, n]) => `${n} ${label.toLowerCase()}`).join(', ')\n this.out(`Result: ${parts.verdict} - ${this.sizeLabel()}: ${counts} in ${parts.duration}`)\n }\n\n /** v1-style ASCII banner box. */\n private printBox(): void {\n const c = this.c\n const summary = this.run.resolvedSummary()\n const parts = this.summaryParts()\n const width = this.width\n const inner = width - 2\n const top = `+${'='.repeat(inner)}+`\n const mid = `+${'-'.repeat(inner)}+`\n const line = (content: string) => {\n const pad = Math.max(0, inner - visibleLength(content))\n return `|${content}${' '.repeat(pad)}|`\n }\n const fit = (text: string) => truncate(text, inner - 1, '...')\n const titleText = 'vibrissa results'\n const left = Math.floor((inner - titleText.length) / 2)\n const titleColor = !this.run.ended ? c.yellow : parts.ok ? c.green : c.red\n const title = `${' '.repeat(left)}${c.bold(titleColor(titleText))}`\n\n const paintCount = (label: string, n: number) => {\n const value = String(n)\n if (label === 'Failed' && n > 0) return c.red(value)\n if (label === 'Passed') return c.green(value)\n if (label === 'Skipped' && n > 0) return c.yellow(value)\n if (label === 'Updated' && n > 0) return c.cyan(value)\n return value\n }\n const repeat = this.run.repeatInfo()\n const sizes = repeat\n ? [\n { plain: `Cases: ${repeat.cases}`, painted: `Cases: ${c.cyan(String(repeat.cases))}` },\n { plain: `Runs: ${repeat.runs}`, painted: `Runs: ${c.cyan(String(repeat.runs))}` },\n ]\n : [{ plain: `Total: ${summary.total}`, painted: `Total: ${c.cyan(String(summary.total))}` }]\n const segments = [\n ...sizes,\n ...parts.counts.map(([label, n]) => ({\n plain: `${label}: ${n}`,\n painted: `${label}: ${paintCount(label, n)}`,\n })),\n ]\n const rows: string[] = []\n let current = ''\n let currentPlain = ''\n for (const seg of segments) {\n const candidate = currentPlain ? `${currentPlain} | ${seg.plain}` : seg.plain\n if (currentPlain && candidate.length + 1 > inner) {\n rows.push(current)\n current = seg.painted\n currentPlain = seg.plain\n } else {\n current = currentPlain ? `${current} | ${seg.painted}` : seg.painted\n currentPlain = candidate\n }\n }\n if (current) rows.push(current)\n\n this.out('')\n this.out(top)\n this.out(line(title))\n this.out(mid)\n for (const row of rows) this.out(line(` ${row}`))\n this.out(line(` Duration: ${c.gray(parts.duration)}`))\n if (parts.verdict.includes('(')) this.out(line(` ${c.red(fit(`Result: ${parts.verdict}`))}`))\n if (parts.extras.length > 0) {\n this.out(mid)\n for (const extra of parts.extras) {\n const text = fit(extra.text)\n const paint = extra.tone === 'bad' ? c.red : extra.tone === 'warn' ? c.yellow : c.green\n this.out(line(` ${paint(text)}`))\n }\n }\n if (parts.flakyLines.length > 0) {\n this.out(mid)\n parts.flakyLines.forEach((text, i) => {\n const shown = fit(text)\n this.out(line(` ${i === 0 ? shown : c.yellow(shown)}`))\n })\n }\n this.out(top)\n }\n}\n\nexport function createConsoleReporter(\n ctx: ReporterContext,\n options?: ConsoleReporterOptions,\n): ConsoleReporter {\n return new ConsoleReporter(ctx, options)\n}\n","/**\n * GitHub Actions reporter.\n *\n * - Workflow commands on stdout: `::error file=…,title=…::message` for failed cases,\n * failed checks and manifest drift; `::warning` for warnings, warned checks and budget\n * breaches on non-failing cases; `::group::…::endgroup::` around each flow's step list.\n * Emitted only inside Actions (GITHUB_ACTIONS=true) unless `annotations: 'always'`, so a\n * `ci` profile run locally stays quiet.\n * - A markdown job summary appended to $GITHUB_STEP_SUMMARY, or written to\n * `<outDir>/summary.md` when that variable is unset (local runs, other CI systems).\n */\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport type { CaseStatus, CheckOutcome, Reporter, ReporterContext, RunEvent } from '../events.js'\nimport type { EnvLike } from './ansi.js'\nimport {\n type CaseRecord,\n DEFAULT_MAX_MISMATCHES,\n RunCollector,\n artifactLines,\n budgetNote,\n compareCases,\n displayPath,\n errorKindLabel,\n failureText,\n firstLine,\n formatDuration,\n formatPercent,\n mismatchLine,\n neutralizeWorkflowCommand,\n outcomeHeadline,\n plural,\n resolveOutDir,\n serverInfoLabel,\n stepLabel,\n stripUpdateHint,\n truncate,\n updateSkippedReason,\n} from './shared.js'\n\nexport const SUMMARY_FILE = 'summary.md'\n\nexport interface GithubReporterOptions {\n /** Environment (GITHUB_ACTIONS, GITHUB_STEP_SUMMARY, GITHUB_WORKSPACE). Default: process.env. */\n env?: EnvLike\n /** 'auto' (default): workflow commands only when GITHUB_ACTIONS=true. */\n annotations?: 'auto' | 'always' | 'never'\n /** Mismatches included per annotation. Default 10. */\n maxMismatches?: number\n /** Failure detail blocks included in the summary. Default 25. */\n maxDetails?: number\n /** Rows in the collapsed \"all cases\" table. Default 500. */\n maxRows?: number\n}\n\n// ---------------------------------------------------------------------------\n// Workflow command encoding (mirrors @actions/core escapeData / escapeProperty)\n// ---------------------------------------------------------------------------\n\nexport function escapeData(value: string): string {\n return value.replace(/%/g, '%25').replace(/\\r/g, '%0D').replace(/\\n/g, '%0A')\n}\n\nexport function escapeProperty(value: string): string {\n return escapeData(value).replace(/:/g, '%3A').replace(/,/g, '%2C')\n}\n\nexport function workflowCommand(\n command: string,\n properties: Record<string, string | number | undefined>,\n message: string,\n): string {\n const props = Object.entries(properties)\n .filter(([, v]) => v !== undefined && v !== '')\n .map(([k, v]) => `${k}=${escapeProperty(String(v))}`)\n .join(',')\n return `::${command}${props ? ` ${props}` : ''}::${escapeData(message)}`\n}\n\n// ---------------------------------------------------------------------------\n// Markdown helpers\n// ---------------------------------------------------------------------------\n\nconst ICON: Record<CaseStatus | 'warned', string> = {\n passed: '✅',\n failed: '❌',\n skipped: '⏭️',\n updated: '✏️',\n warned: '⚠️',\n}\n\nfunction escapeHtml(text: string): string {\n return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n}\n\n/** Escape text for a GFM table cell. */\nexport function mdCell(text: string): string {\n return escapeHtml(text).replace(/\\|/g, '\\\\|').replace(/\\r?\\n/g, '<br>')\n}\n\nfunction mdCode(text: string): string {\n if (text.includes('`') || text.includes('\\n')) return mdCell(text)\n return `\\`${text.replace(/\\|/g, '\\\\|')}\\``\n}\n\n/** A fenced block whose fence cannot be closed by the content. */\nfunction fence(lines: string[], lang = ''): string[] {\n const longest = Math.max(\n 0,\n ...lines.map((l) => Math.max(0, ...(l.match(/`+/g) ?? []).map((m) => m.length))),\n )\n const ticks = '`'.repeat(Math.max(3, longest + 1))\n return [`${ticks}${lang}`, ...lines, ticks]\n}\n\n// ---------------------------------------------------------------------------\n// Reporter\n// ---------------------------------------------------------------------------\n\nexport class GithubReporter implements Reporter {\n readonly name = 'github'\n private readonly run = new RunCollector()\n private readonly env: EnvLike\n private readonly annotate: boolean\n private readonly maxMismatches: number\n private readonly maxDetails: number\n private readonly maxRows: number\n\n constructor(\n private readonly ctx: ReporterContext,\n options: GithubReporterOptions = {},\n ) {\n this.env = options.env ?? process.env\n const mode = options.annotations ?? 'auto'\n this.annotate = mode === 'always' || (mode === 'auto' && this.env.GITHUB_ACTIONS === 'true')\n this.maxMismatches = options.maxMismatches ?? DEFAULT_MAX_MISMATCHES\n this.maxDetails = options.maxDetails ?? 25\n this.maxRows = options.maxRows ?? 500\n }\n\n /** True when workflow commands are written to stdout. */\n get annotating(): boolean {\n return this.annotate\n }\n\n onEvent(event: RunEvent): void {\n const record = this.run.handle(event)\n if (!this.annotate) return\n switch (event.type) {\n case 'case:end':\n if (record) this.annotateCase(record)\n break\n case 'check':\n this.annotateCheck(event.outcome)\n break\n case 'manifest:diff':\n this.emit(\n workflowCommand(\n 'error',\n {\n file: this.annotationPath(event.path),\n title: `Vibrissa: manifest drift${event.server ? ` (${event.server})` : ''}`,\n },\n `${event.summary}\\nReview the change, then rerun with --update-manifest to accept it.`,\n ),\n )\n break\n case 'warning':\n this.emit(workflowCommand('warning', { title: 'Vibrissa' }, event.message))\n break\n default:\n break\n }\n }\n\n private emit(line: string): void {\n this.ctx.stdout(line)\n }\n\n /** Annotation paths must be relative to the repository root (GITHUB_WORKSPACE). */\n private annotationPath(file: string): string {\n const absolute = path.resolve(this.ctx.rootDir, file)\n const workspace = this.env.GITHUB_WORKSPACE\n if (workspace) {\n const rel = path.relative(workspace, absolute)\n if (rel && !rel.startsWith('..') && !path.isAbsolute(rel)) return rel.replace(/\\\\/g, '/')\n }\n return displayPath(absolute, this.ctx.rootDir)\n }\n\n private caseTitle(record: CaseRecord): string {\n const server = this.run.multiServer ? `[${record.ref.server}] ` : ''\n const run = record.run !== undefined ? ` #${record.run}` : ''\n return `${server}${record.ref.name}${run}`\n }\n\n private annotateCase(record: CaseRecord): void {\n const { outcome } = record\n if (record.steps.length > 0) {\n const glyph = outcome.status === 'failed' ? '✗' : outcome.status === 'skipped' ? '↓' : '✓'\n const meta = `${plural(record.steps.length, 'step')}, ${formatDuration(outcome.durationMs)}`\n this.emit(`::group::${escapeData(`${glyph} ${this.caseTitle(record)} (${meta})`)}`)\n for (const s of record.steps) {\n const g = s.status === 'failed' ? '✗' : s.status === 'skipped' ? '↓' : '✓'\n const reason = s.reason ? ` - ${firstLine(s.reason)}` : ''\n this.emit(\n neutralizeWorkflowCommand(\n ` ${g} ${stepLabel(s.step)} (${formatDuration(s.durationMs)})${reason}`,\n ),\n )\n }\n this.emit('::endgroup::')\n }\n const file = this.annotationPath(record.ref.file)\n if (outcome.status === 'failed') {\n // Annotations never suggest --update: the job log and summary carry that context.\n const lines = [stripUpdateHint(outcome.reason ? outcome.reason : outcomeHeadline(outcome))]\n const notUpdated = updateSkippedReason(outcome)\n if (notUpdated) lines.push(`Not updated: ${notUpdated}`)\n const failedStep = record.steps.find((s) => s.status === 'failed')\n if (failedStep && !outcome.reason) {\n lines.push(`Step ${stepLabel(failedStep.step)}: ${failedStep.reason ?? 'failed'}`)\n }\n const mismatches = outcome.mismatches ?? []\n for (const m of mismatches.slice(0, this.maxMismatches)) lines.push(` ${mismatchLine(m)}`)\n if (mismatches.length > this.maxMismatches) {\n lines.push(` ... and ${mismatches.length - this.maxMismatches} more`)\n }\n const budget = budgetNote(outcome)\n if (budget) lines.push(budget)\n lines.push(...artifactLines(outcome, this.ctx.rootDir))\n const kind = errorKindLabel(outcome)\n const verb =\n kind === 'timeout'\n ? 'timed out'\n : kind === 'load error'\n ? 'failed to load'\n : kind\n ? 'errored'\n : 'failed'\n this.emit(\n workflowCommand(\n 'error',\n { file, line: record.ref.line, title: `Vibrissa: ${this.caseTitle(record)} ${verb}` },\n lines.join('\\n'),\n ),\n )\n } else if (outcome.budget) {\n this.emit(\n workflowCommand(\n 'warning',\n { file, line: record.ref.line, title: `Vibrissa: ${this.caseTitle(record)} over budget` },\n `Took ${formatDuration(outcome.budget.actualMs)}, budget ${formatDuration(outcome.budget.budgetMs)}`,\n ),\n )\n }\n }\n\n private annotateCheck(check: CheckOutcome): void {\n if (check.status === 'passed') return\n const command = check.status === 'failed' ? 'error' : 'warning'\n const verb = check.status === 'failed' ? 'failed' : 'warning'\n this.emit(\n workflowCommand(\n command,\n {\n title: `Vibrissa check ${verb}: ${check.title}${check.server ? ` (${check.server})` : ''}`,\n },\n check.detail ?? check.title,\n ),\n )\n }\n\n // -------------------------------------------------------------------------\n // Job summary\n // -------------------------------------------------------------------------\n\n /** Markdown job summary for the run so far. */\n markdown(): string {\n const run = this.run\n const summary = run.resolvedSummary()\n const ok = run.ok() && run.ended\n const reasons = run.verdictReasons()\n const verdict = !run.ended\n ? '⚠️ Incomplete'\n : ok\n ? '✅ Passed'\n : `❌ Failed${reasons.length > 0 ? ` (${reasons.join(', ')})` : ''}`\n const out: string[] = []\n out.push(`## Vibrissa results: ${verdict}`, '')\n out.push('| Result | Total | Passed | Failed | Skipped | Updated | Duration |')\n out.push('| :-- | --: | --: | --: | --: | --: | --: |')\n out.push(\n `| ${verdict} | ${summary.total} | ${summary.passed} | ${summary.failed} | ${summary.skipped} | ${summary.updated} | ${formatDuration(summary.durationMs)} |`,\n )\n if (run.servers.length > 0) {\n const servers = run.servers.map((name) => {\n const s = run.sessions.get(name)\n if (!s) return mdCode(name)\n const info = serverInfoLabel(s.serverInfo)\n return `${mdCode(name)} (${info ? `${mdCell(info)}, ` : ''}${s.era} ${mdCell(s.protocolVersion ?? '')})`\n })\n const repeat = run.repeat !== undefined && run.repeat > 1 ? ` · repeat ${run.repeat}` : ''\n out.push('', `Servers: ${servers.join(', ')}${repeat}`)\n }\n\n const failed = [...run.casesWith('failed')].sort(compareCases)\n if (failed.length > 0) {\n out.push('', `### ❌ Failures (${failed.length})`, '')\n out.push('| Case | File | Server | Duration | Reason |')\n out.push('| :-- | :-- | :-- | --: | :-- |')\n for (const r of failed) {\n out.push(\n `| ${mdCell(this.caseTitle(r))} | ${mdCode(displayPath(r.ref.file, this.ctx.rootDir))} | ${mdCell(r.ref.server)} | ${formatDuration(r.outcome.durationMs)} | ${mdCell(truncate(stripUpdateHint(outcomeHeadline(r.outcome)), 200))} |`,\n )\n }\n for (const r of failed.slice(0, this.maxDetails)) {\n const text = failureText(r, { rootDir: this.ctx.rootDir, maxDiffLines: 60 })\n out.push('', `<details><summary>${escapeHtml(this.caseTitle(r))}</summary>`, '')\n out.push(...fence(text, 'diff'))\n out.push('', '</details>')\n }\n if (failed.length > this.maxDetails) {\n out.push(\n '',\n `_${failed.length - this.maxDetails} more failures not expanded; see results.json or the log._`,\n )\n }\n }\n\n const drift = run.manifestDrift()\n if (run.manifests.length > 0) {\n out.push('', `### Manifest${drift.length > 0 ? ' drift' : ''}`, '')\n out.push('| Status | Manifest | Summary |')\n out.push('| :-- | :-- | :-- |')\n for (const m of run.manifests) {\n const icon = m.status === 'diff' ? ICON.failed : ICON.passed\n const text = m.status === 'diff' ? (m.summary ?? 'drift') : 'matches lock'\n const server = m.server ? ` (${mdCell(m.server)})` : ''\n out.push(\n `| ${icon} | ${mdCode(displayPath(m.path, this.ctx.rootDir))}${server} | ${mdCell(text)} |`,\n )\n }\n if (drift.length > 0) {\n out.push('', 'Review the change, then rerun with `--update-manifest` to accept it.')\n }\n }\n\n if (run.checks.length > 0) {\n const cc = run.checkCounts()\n out.push('', `### Checks (${cc.passed} passed, ${cc.failed} failed, ${cc.warned} warned)`, '')\n out.push('| Status | Check | Detail |')\n out.push('| :-- | :-- | :-- |')\n for (const c of run.checks) {\n out.push(\n `| ${ICON[c.status]} | ${mdCell(c.server ? `${c.title} (${c.server})` : c.title)} | ${mdCell(truncate(c.detail ?? '', 300))} |`,\n )\n }\n }\n\n const rates = run.passRates()\n if (rates.length > 0) {\n const flaky = rates.filter((r) => r.rate > 0 && r.rate < 1)\n out.push(\n '',\n `### Pass rates (${plural(rates.length, 'repeated case')}, ${flaky.length} flaky)`,\n '',\n )\n out.push('| Case | Passed | Rate | Verdict |')\n out.push('| :-- | --: | --: | :-- |')\n for (const r of rates) {\n const base = r.rate >= 1 ? 'stable' : r.rate <= 0 ? 'failing' : 'flaky'\n const verdictText = r.declaredFlaky ? `${base} (declared flaky)` : base\n out.push(\n `| ${mdCell(r.name)} | ${r.runs > 0 ? `${r.passes}/${r.runs}` : '-'} | ${formatPercent(r.rate)} | ${verdictText} |`,\n )\n }\n }\n\n if (run.warnings.length > 0) {\n out.push('', `### ⚠️ Warnings (${run.warnings.length})`, '')\n for (const w of run.warnings) out.push(`- ${escapeHtml(w).replace(/\\r?\\n/g, ' ')}`)\n }\n\n const all = [...run.cases].sort(compareCases)\n if (all.length > 0) {\n out.push('', `<details><summary>All cases (${all.length})</summary>`, '')\n out.push('| Status | Case | Server | Duration |')\n out.push('| :-- | :-- | :-- | --: |')\n for (const r of all.slice(0, this.maxRows)) {\n out.push(\n `| ${ICON[r.outcome.status]} | ${mdCell(this.caseTitle(r))} | ${mdCell(r.ref.server)} | ${formatDuration(r.outcome.durationMs)} |`,\n )\n }\n if (all.length > this.maxRows)\n out.push('', `_${all.length - this.maxRows} more cases omitted._`)\n out.push('', '</details>')\n }\n return `${out.join('\\n')}\\n`\n }\n\n async close(): Promise<void> {\n const markdown = this.markdown()\n const stepSummary = this.env.GITHUB_STEP_SUMMARY\n if (stepSummary) {\n await fs.appendFile(stepSummary, `\\n${markdown}`, 'utf8')\n return\n }\n const file = path.join(resolveOutDir(this.ctx.rootDir, this.ctx.outDir), SUMMARY_FILE)\n await fs.mkdir(path.dirname(file), { recursive: true })\n await fs.writeFile(file, markdown, 'utf8')\n this.ctx.stderr(`vibrissa: wrote ${displayPath(file, this.ctx.rootDir)}`)\n }\n}\n\nexport function createGithubReporter(\n ctx: ReporterContext,\n options?: GithubReporterOptions,\n): GithubReporter {\n return new GithubReporter(ctx, options)\n}\n","/**\n * JSON reporter: writes `<outDir>/results.json`, a stable machine-readable record of the\n * run. Designed to be consumed by `--baseline` delta gating: every case carries its id,\n * status and durationMs, cases are sorted deterministically, and paths are relative to\n * the project root so a committed `last-green.json` compares cleanly across machines.\n */\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport type { CaseStatus, CheckOutcome, Reporter, ReporterContext, RunEvent } from '../events.js'\nimport type { JsonValue } from '../types.js'\nimport {\n type CaseRecord,\n RunCollector,\n compareCases,\n displayPath,\n resolveOutDir,\n toJsonSafe,\n updateSkippedReason,\n} from './shared.js'\n\nexport const RESULTS_FILE = 'results.json'\n\n/**\n * Shape of `results.json` (version 1). Additive changes keep `version: 1`; any removal or\n * change of meaning bumps it.\n *\n * ```jsonc\n * {\n * \"version\": 1,\n * \"generator\": \"vibrissa\",\n * \"ok\": false, // run:end.ok, else: no failed cases/checks, no drift\n * \"complete\": true, // false when the run stopped before run:end\n * \"startedAt\": \"2026-10-28T12:00:00.000Z\",\n * \"finishedAt\": \"2026-10-28T12:00:01.234Z\", // startedAt + summary.durationMs\n * \"repeat\": 3, // run:start.repeat, when > 1\n * \"shard\": { \"index\": 1, \"total\": 4 }, // run:start.shard, when sharded\n * \"servers\": [{ \"name\": \"local\", \"era\": \"modern\", \"protocolVersion\": \"2026-07-28\",\n * \"serverInfo\": { \"name\": \"echo-server\", \"version\": \"1.2.0\" } }],\n * \"summary\": {\n * \"total\": 3, // distinct cases (not runs)\n * \"runs\": 9, // executions; only when repeated\n * \"passed\": 1, \"failed\": 1, \"skipped\": 1, \"updated\": 0, // per run when repeated\n * \"durationMs\": 1234,\n * \"passRates\": { \"cases/echo.json\": 0.6 }, // only with --repeat > 1\n * \"flaky\": [\"cases/echo.json\"], // 0 < pass rate < 1; omitted when none\n * \"checks\": { \"passed\": 2, \"failed\": 0, \"warned\": 1 },\n * \"manifestDrift\": 0,\n * \"warnings\": 1\n * },\n * \"cases\": [{\n * \"id\": \"cases/echo.json#2\", // CaseRef.id as emitted (unique per run)\n * \"caseId\": \"cases/echo.json\", // id without the repeat suffix (stable across runs)\n * \"run\": 2, // repeat index, only when repeated\n * \"name\": \"echo returns input\", \"file\": \"cases/echo.json\", \"server\": \"local\",\n * \"tags\": [\"smoke\"], \"line\": 1, \"flaky\": true, // line/flaky only when known/declared\n * \"status\": \"failed\", \"durationMs\": 12,\n * \"errorKind\": \"assertion\", // assertion | error | timeout | budget | load\n * \"reason\": \"Expectation failed at content[0].text: ...\",\n * \"mismatches\": [{ \"path\": \"content[0].text\", \"message\": \"...\", \"expected\": \"A\", \"actual\": \"a\",\n * \"field\": \"expect\", \"pointer\": \"/steps/1/expect/content/0/text\", \"stepIndex\": 1 }],\n * \"updateSkipped\": { \"reason\": \"expect contains matchers\" }, // --update left it alone\n * \"expected\": { ... }, \"actual\": { ... },\n * \"steps\": [{ \"index\": 0, \"name\": \"create\", \"kind\": \"tool\", \"target\": \"session.create\",\n * \"status\": \"passed\", \"durationMs\": 5 }],\n * \"budget\": { \"budgetMs\": 800, \"actualMs\": 812 },\n * \"tracePath\": \"reports/traces/echo.ndjson\",\n * \"stderrPath\": \"reports/traces/echo.stderr.log\"\n * }],\n * \"checks\": [{ \"id\": \"spec/tools-list-stable\", \"server\": \"local\", \"title\": \"...\", \"status\": \"warned\",\n * \"detail\": \"...\" }],\n * \"manifests\": [{ \"path\": \"tests/integration/__manifest__.json\", \"server\": \"local\", \"status\": \"diff\",\n * \"summary\": \"1 tool changed\", \"diff\": { ... } }],\n * \"warnings\": [\"...\"]\n * }\n * ```\n *\n * Empty arrays are omitted (`tags`, `summary.flaky`, `checks`, `manifests`, `warnings`);\n * `servers` and `cases` are always present.\n */\nexport interface JsonReport {\n version: 1\n generator: 'vibrissa'\n /**\n * The run's verdict: run:end.ok when the runner sent it; otherwise true when no case\n * failed, no check failed and no manifest drifted.\n */\n ok: boolean\n /** False when the reporter was closed without seeing run:end (crash / abort). */\n complete: boolean\n /** ISO 8601, from run:start.startedAt; null if run:start never arrived. */\n startedAt: string | null\n /** ISO 8601, startedAt + summary.durationMs; null if unknown. */\n finishedAt: string | null\n /** run:start.repeat, when cases were repeated (> 1). */\n repeat?: number\n /** run:start.shard, when the run was one shard of several. */\n shard?: { index: number; total: number }\n servers: JsonServer[]\n summary: JsonSummary\n /** Sorted by caseId, then run. */\n cases: JsonCase[]\n /** In emission order; omitted when no checks ran. */\n checks?: CheckOutcome[]\n /** One entry per manifest:ok / manifest:diff event; omitted when no manifest was checked. */\n manifests?: JsonManifest[]\n /** Omitted when there were none. */\n warnings?: string[]\n}\n\nexport interface JsonServer {\n name: string\n era?: 'legacy' | 'modern'\n protocolVersion?: string\n /** What the server reported about itself (session:start.serverInfo). */\n serverInfo?: { name?: string; version?: string }\n}\n\nexport interface JsonSummary {\n /** Distinct cases. With --repeat this is not the number of executions (see `runs`). */\n total: number\n /** Executions (cases x repeat); present only when cases were repeated. */\n runs?: number\n /** Status counts; counted per run when repeated, so they sum to `runs`. */\n passed: number\n failed: number\n skipped: number\n updated: number\n durationMs: number\n /** Pass rate per case id; present only when cases were repeated. */\n passRates?: Record<string, number>\n /** Case ids (without repeat suffix) whose pass rate is strictly between 0 and 1; omitted when none. */\n flaky?: string[]\n checks: { passed: number; failed: number; warned: number }\n /** Number of manifests that differ from the lock file. */\n manifestDrift: number\n warnings: number\n}\n\nexport interface JsonCase {\n /** CaseRef.id as emitted: relative case file path, plus `#<n>` for repeated runs. */\n id: string\n /** id without the `#<n>` repeat suffix; the key to aggregate or compare on. */\n caseId: string\n /** Repeat index, present only for repeated runs. */\n run?: number\n name: string\n /** Case file, forward slashes. */\n file: string\n server: string\n /** Omitted when the case has no tags. */\n tags?: string[]\n /** 1-based line of the case in its file, when known. */\n line?: number\n /** The case declared `flaky: true`. */\n flaky?: true\n status: CaseStatus\n durationMs: number\n /** Kind of failure: assertion | error | timeout | budget | load. */\n errorKind?: 'assertion' | 'error' | 'timeout' | 'budget' | 'load'\n reason?: string\n mismatches?: JsonMismatch[]\n /** Present when --update left this failing golden alone, and why. */\n updateSkipped?: { reason: string }\n expected?: JsonValue\n actual?: JsonValue\n steps?: JsonStep[]\n budget?: { budgetMs: number; actualMs: number }\n /** Transcript path, relative to the project root when inside it. */\n tracePath?: string\n /** Captured server stderr for this case, relative to the project root when inside it. */\n stderrPath?: string\n}\n\nexport interface JsonMismatch {\n path: string\n message: string\n expected?: JsonValue\n actual?: JsonValue\n /** Case field the mismatch belongs to (`expect`, `expectError`, ...). */\n field?: string\n /** RFC 6901 pointer into the case file, e.g. `/steps/1/expect/content/0/text`. */\n pointer?: string\n /** 0-based step index for flows. */\n stepIndex?: number\n}\n\nexport interface JsonStep {\n /** 0-based step index. */\n index: number\n name: string\n kind: string\n target: string\n status: CaseStatus\n durationMs: number\n reason?: string\n}\n\nexport interface JsonManifest {\n path: string\n /** Server whose manifest this is, when the runner attributed it. */\n server?: string\n status: 'ok' | 'diff'\n summary?: string\n diff?: JsonValue\n}\n\nfunction iso(ms: number | undefined): string | null {\n if (ms === undefined || !Number.isFinite(ms)) return null\n const date = new Date(ms)\n return Number.isNaN(date.getTime()) ? null : date.toISOString()\n}\n\nfunction caseToJson(record: CaseRecord, rootDir: string): JsonCase {\n const { ref, outcome } = record\n const out: JsonCase = {\n id: ref.id,\n caseId: record.caseId,\n ...(record.run !== undefined ? { run: record.run } : {}),\n name: ref.name,\n file: displayPath(ref.file, rootDir),\n server: ref.server,\n ...(ref.tags.length > 0 ? { tags: [...ref.tags] } : {}),\n ...(ref.line !== undefined ? { line: ref.line } : {}),\n ...(ref.flaky ? { flaky: true as const } : {}),\n status: outcome.status,\n durationMs: outcome.durationMs,\n }\n if (outcome.errorKind !== undefined) out.errorKind = outcome.errorKind\n if (outcome.reason !== undefined) out.reason = outcome.reason\n if (outcome.mismatches && outcome.mismatches.length > 0) {\n out.mismatches = outcome.mismatches.map((m) => {\n const entry: JsonMismatch = { path: m.path, message: m.message }\n if (m.expected !== undefined) entry.expected = toJsonSafe(m.expected)\n if (m.actual !== undefined) entry.actual = toJsonSafe(m.actual)\n if (m.field !== undefined) entry.field = m.field\n if (m.pointer !== undefined) entry.pointer = m.pointer\n if (m.stepIndex !== undefined) entry.stepIndex = m.stepIndex\n return entry\n })\n }\n const notUpdated = updateSkippedReason(outcome)\n if (notUpdated !== undefined) out.updateSkipped = { reason: notUpdated }\n if (outcome.expected !== undefined) out.expected = toJsonSafe(outcome.expected)\n if (outcome.actual !== undefined) out.actual = toJsonSafe(outcome.actual)\n if (record.steps.length > 0) {\n out.steps = record.steps.map((s) => {\n const step: JsonStep = {\n index: s.step.index,\n name: s.step.name,\n kind: s.step.kind,\n target: s.step.target,\n status: s.status,\n durationMs: s.durationMs,\n }\n if (s.reason !== undefined) step.reason = s.reason\n return step\n })\n }\n if (outcome.budget) {\n out.budget = { budgetMs: outcome.budget.budgetMs, actualMs: outcome.budget.actualMs }\n }\n if (outcome.tracePath) out.tracePath = displayPath(outcome.tracePath, rootDir)\n if (outcome.stderrPath) out.stderrPath = displayPath(outcome.stderrPath, rootDir)\n return out\n}\n\n/** Build the results.json document from a collected run. Pure; exported for reuse/tests. */\nexport function buildJsonReport(run: RunCollector, rootDir: string): JsonReport {\n const summary = run.resolvedSummary()\n const flaky = run.flaky().map((r) => r.caseId)\n const startedAt = iso(run.startedAt)\n const finishedAt =\n run.startedAt !== undefined && run.ended ? iso(run.startedAt + summary.durationMs) : null\n const repeat = run.repeatInfo()\n const jsonSummary: JsonSummary = {\n total: repeat ? repeat.cases : summary.total,\n ...(repeat ? { runs: repeat.runs } : {}),\n passed: summary.passed,\n failed: summary.failed,\n skipped: summary.skipped,\n updated: summary.updated,\n durationMs: summary.durationMs,\n ...(summary.passRates ? { passRates: { ...summary.passRates } } : {}),\n ...(flaky.length > 0 ? { flaky } : {}),\n checks: run.checkCounts(),\n manifestDrift: run.manifestDrift().length,\n warnings: run.warnings.length,\n }\n const report: JsonReport = {\n version: 1,\n generator: 'vibrissa',\n ok: run.ok() && run.ended,\n complete: run.ended,\n startedAt,\n finishedAt,\n ...(run.repeat !== undefined && run.repeat > 1 ? { repeat: run.repeat } : {}),\n ...(run.shard ? { shard: { ...run.shard } } : {}),\n servers: run.servers.map((name) => {\n const session = run.sessions.get(name)\n const server: JsonServer = { name }\n if (session?.era) server.era = session.era\n if (session?.protocolVersion) server.protocolVersion = session.protocolVersion\n if (session?.serverInfo) server.serverInfo = { ...session.serverInfo }\n return server\n }),\n summary: jsonSummary,\n cases: [...run.cases].sort(compareCases).map((c) => caseToJson(c, rootDir)),\n }\n if (run.checks.length > 0) {\n report.checks = run.checks.map((c) => {\n const check: CheckOutcome = {\n id: c.id,\n ...(c.server !== undefined ? { server: c.server } : {}),\n title: c.title,\n status: c.status,\n }\n if (c.detail !== undefined) check.detail = c.detail\n return check\n })\n }\n if (run.manifests.length > 0) {\n report.manifests = run.manifests.map((m) => {\n const entry: JsonManifest = {\n path: displayPath(m.path, rootDir),\n ...(m.server !== undefined ? { server: m.server } : {}),\n status: m.status,\n }\n if (m.summary !== undefined) entry.summary = m.summary\n if (m.diff !== undefined) entry.diff = toJsonSafe(m.diff)\n return entry\n })\n }\n if (run.warnings.length > 0) report.warnings = [...run.warnings]\n return report\n}\n\nexport class JsonReporter implements Reporter {\n readonly name = 'json'\n private readonly run = new RunCollector()\n /** Absolute path of the file written (or to be written). */\n readonly filePath: string\n\n constructor(private readonly ctx: ReporterContext) {\n this.filePath = path.join(resolveOutDir(ctx.rootDir, ctx.outDir), RESULTS_FILE)\n }\n\n onEvent(event: RunEvent): void {\n this.run.handle(event)\n }\n\n /** The document as it would be written right now. */\n report(): JsonReport {\n return buildJsonReport(this.run, this.ctx.rootDir)\n }\n\n async close(): Promise<void> {\n const doc = this.report()\n await fs.mkdir(path.dirname(this.filePath), { recursive: true })\n await fs.writeFile(this.filePath, `${JSON.stringify(doc, null, 2)}\\n`, 'utf8')\n this.ctx.stderr(`vibrissa: wrote ${displayPath(this.filePath, this.ctx.rootDir)}`)\n }\n}\n\nexport function createJsonReporter(ctx: ReporterContext): JsonReporter {\n return new JsonReporter(ctx)\n}\n","/**\n * JUnit reporter: writes `<outDir>/junit.xml` in the common shape GitHub (test-reporter\n * actions), GitLab (`artifacts:reports:junit`) and Jenkins (junit plugin) accept:\n *\n * <testsuites name tests failures errors skipped time>\n * <testsuite name=<server> tests failures errors skipped time timestamp>\n * <properties><property name value/></properties>\n * <testcase classname=<case file> name=<case name> time file>\n * <failure message type><![CDATA[reason, steps, mismatches, diff]]></failure>\n * | <error message type>…</error> (errorKind error / timeout / load)\n * | <skipped message/>\n * <system-out>…</system-out>\n *\n * One testsuite per server, plus `vibrissa:manifest` / `vibrissa:checks` suites when the\n * run produced manifest or check results, so CI dashboards show those failures too.\n */\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport type { Reporter, ReporterContext, RunEvent } from '../events.js'\nimport { createColors } from './ansi.js'\nimport { driftDetail } from './manifest.js'\nimport {\n type CaseRecord,\n RunCollector,\n artifactLines,\n compareCases,\n displayPath,\n failureText,\n firstLine,\n isErrorOutcome,\n outcomeHeadline,\n resolveOutDir,\n truncate,\n} from './shared.js'\n\nexport const JUNIT_FILE = 'junit.xml'\n\n// Characters outside the XML 1.0 Char production (control chars, lone surrogates, FFFE/FFFF).\nconst INVALID_XML_CHARS = /[^\\t\\n\\r\\u0020-\\uD7FF\\uE000-\\uFFFD\\u{10000}-\\u{10FFFF}]/gu\n\nexport function stripInvalidXml(text: string): string {\n return text.replace(INVALID_XML_CHARS, '')\n}\n\nexport function escapeXmlAttr(value: string): string {\n return stripInvalidXml(value)\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/\\t/g, '	')\n .replace(/\\n/g, ' ')\n .replace(/\\r/g, ' ')\n}\n\nexport function escapeXmlText(value: string): string {\n return stripInvalidXml(value).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n}\n\n/** Wrap text in CDATA, splitting any `]]>` so the section cannot be terminated early. */\nexport function cdata(text: string): string {\n return `<![CDATA[${stripInvalidXml(text).replace(/]]>/g, ']]]]><![CDATA[>')}]]>`\n}\n\nfunction seconds(ms: number): string {\n const safe = Number.isFinite(ms) && ms > 0 ? ms : 0\n return (safe / 1000).toFixed(3)\n}\n\nfunction attrs(pairs: Array<[string, string | number | undefined]>): string {\n return pairs\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => ` ${k}=\"${escapeXmlAttr(String(v))}\"`)\n .join('')\n}\n\nfunction timestampOf(ms: number | undefined): string | undefined {\n if (ms === undefined || !Number.isFinite(ms)) return undefined\n const date = new Date(ms)\n // xs:dateTime without zone/fraction, the form the JUnit XSD and Jenkins expect.\n return Number.isNaN(date.getTime()) ? undefined : date.toISOString().slice(0, 19)\n}\n\nfunction failureType(record: CaseRecord): string {\n const { outcome } = record\n if (outcome.errorKind === 'timeout') return 'Timeout'\n if (outcome.errorKind === 'load') return 'LoadError'\n if (outcome.errorKind === 'error') return 'Error'\n if (outcome.errorKind === 'budget') return 'BudgetExceeded'\n if (outcome.mismatches && outcome.mismatches.length > 0) return 'ExpectationFailed'\n if (record.steps.some((s) => s.status === 'failed')) return 'StepFailed'\n if (outcome.budget) return 'BudgetExceeded'\n return 'CaseFailed'\n}\n\ninterface Suite {\n name: string\n timestamp?: string\n properties: Array<[string, string]>\n /** Each testcase as structural lines; an element may hold multi-line CDATA. */\n testcases: string[][]\n tests: number\n failures: number\n errors: number\n skipped: number\n timeMs: number\n}\n\nfunction newSuite(name: string, timestamp?: string): Suite {\n return {\n name,\n timestamp,\n properties: [],\n testcases: [],\n tests: 0,\n failures: 0,\n errors: 0,\n skipped: 0,\n timeMs: 0,\n }\n}\n\nfunction renderSuite(suite: Suite, indent: string): string[] {\n const head = `${indent}<testsuite${attrs([\n ['name', suite.name],\n ['tests', suite.tests],\n ['failures', suite.failures],\n ['errors', suite.errors],\n ['skipped', suite.skipped],\n ['time', seconds(suite.timeMs)],\n ['timestamp', suite.timestamp],\n ])}`\n if (suite.properties.length === 0 && suite.testcases.length === 0) return [`${head}/>`]\n const lines = [`${head}>`]\n if (suite.properties.length > 0) {\n lines.push(`${indent} <properties>`)\n for (const [name, value] of suite.properties) {\n lines.push(\n `${indent} <property${attrs([\n ['name', name],\n ['value', value],\n ])}/>`,\n )\n }\n lines.push(`${indent} </properties>`)\n }\n // Indent tag lines only: splitting would inject indentation into CDATA bodies.\n for (const tc of suite.testcases) lines.push(...tc.map((l) => `${indent} ${l}`))\n lines.push(`${indent}</testsuite>`)\n return lines\n}\n\nfunction testcase(head: Array<[string, string | number | undefined]>, body: string[]): string[] {\n if (body.length === 0) return [`<testcase${attrs(head)}/>`]\n return [`<testcase${attrs(head)}>`, ...body.map((b) => ` ${b}`), '</testcase>']\n}\n\n/** Render junit.xml from a collected run. Pure; exported for reuse/tests. */\nexport function buildJunitXml(run: RunCollector, rootDir: string): string {\n const timestamp = timestampOf(run.startedAt)\n const suites = new Map<string, Suite>()\n for (const server of run.servers) {\n const suite = newSuite(server, timestamp)\n const session = run.sessions.get(server)\n if (session?.era) suite.properties.push(['era', session.era])\n if (session?.protocolVersion)\n suite.properties.push(['protocolVersion', session.protocolVersion])\n suites.set(server, suite)\n }\n\n for (const record of [...run.cases].sort(compareCases)) {\n const { ref, outcome } = record\n let suite = suites.get(ref.server)\n if (!suite) {\n suite = newSuite(ref.server, timestamp)\n suites.set(ref.server, suite)\n }\n const file = displayPath(ref.file, rootDir)\n const name = record.run !== undefined ? `${ref.name} (run ${record.run})` : ref.name\n const body: string[] = []\n suite.tests++\n suite.timeMs += outcome.durationMs || 0\n if (outcome.status === 'failed') {\n // JUnit distinguishes \"the code under test errored\" from \"an assertion failed\".\n const tag = isErrorOutcome(outcome) ? 'error' : 'failure'\n if (tag === 'error') suite.errors++\n else suite.failures++\n const message = truncate(outcomeHeadline(outcome), 500)\n const text = failureText(record, { rootDir }).join('\\n')\n body.push(\n `<${tag}${attrs([\n ['message', message],\n ['type', failureType(record)],\n ])}>${cdata(text)}</${tag}>`,\n )\n } else if (outcome.status === 'skipped') {\n suite.skipped++\n body.push(\n `<skipped${attrs([['message', outcome.reason ? firstLine(outcome.reason) : undefined]])}/>`,\n )\n }\n const notes: string[] = []\n if (outcome.status === 'updated') notes.push('Golden updated from live output.')\n if (outcome.status !== 'failed' && outcome.budget) {\n notes.push(\n `Budget exceeded: took ${outcome.budget.actualMs}ms, budget ${outcome.budget.budgetMs}ms`,\n )\n }\n if (outcome.status !== 'failed') notes.push(...artifactLines(outcome, rootDir))\n if (notes.length > 0) body.push(`<system-out>${cdata(notes.join('\\n'))}</system-out>`)\n suite.testcases.push(\n testcase(\n [\n ['classname', file],\n ['name', name],\n ['time', seconds(outcome.durationMs)],\n ['file', file],\n ['line', ref.line],\n ],\n body,\n ),\n )\n }\n\n if (run.manifests.length > 0) {\n const suite = newSuite('vibrissa:manifest', timestamp)\n for (const m of run.manifests) {\n const file = displayPath(m.path, rootDir)\n const body: string[] = []\n suite.tests++\n if (m.status === 'diff') {\n suite.failures++\n const detail = driftDetail(m.summary, m.diff, createColors(false), 200)\n const text = [\n m.summary ?? 'Manifest drift',\n ...(detail.length ? ['', ...detail] : []),\n ].join('\\n')\n body.push(\n `<failure${attrs([\n ['message', truncate(firstLine(m.summary ?? 'Manifest drift'), 500)],\n ['type', 'ManifestDrift'],\n ])}>${cdata(text)}</failure>`,\n )\n }\n suite.testcases.push(\n testcase(\n [\n ['classname', file],\n ['name', m.server ? `manifest lock (${m.server})` : 'manifest lock'],\n ['time', '0.000'],\n ['file', file],\n ],\n body,\n ),\n )\n }\n suites.set(suite.name, suite)\n }\n\n if (run.checks.length > 0) {\n const suite = newSuite('vibrissa:checks', timestamp)\n for (const check of run.checks) {\n const body: string[] = []\n suite.tests++\n if (check.status === 'failed') {\n suite.failures++\n body.push(\n `<failure${attrs([\n ['message', truncate(firstLine(check.detail ?? check.title), 500)],\n ['type', 'CheckFailed'],\n ])}>${cdata(check.detail ?? check.title)}</failure>`,\n )\n } else if (check.status === 'warned') {\n body.push(`<system-out>${cdata(`WARNING: ${check.detail ?? check.title}`)}</system-out>`)\n }\n suite.testcases.push(\n testcase(\n [\n ['classname', `check.${check.id}`],\n ['name', check.server ? `${check.title} (${check.server})` : check.title],\n ['time', '0.000'],\n ],\n body,\n ),\n )\n }\n suites.set(suite.name, suite)\n }\n\n const all = [...suites.values()]\n const total = (key: 'tests' | 'failures' | 'errors' | 'skipped') =>\n all.reduce((n, s) => n + s[key], 0)\n const summary = run.resolvedSummary()\n const lines = [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n `<testsuites${attrs([\n ['name', 'vibrissa'],\n ['tests', total('tests')],\n ['failures', total('failures')],\n ['errors', total('errors')],\n ['skipped', total('skipped')],\n ['time', seconds(summary.durationMs)],\n ])}>`,\n ]\n for (const suite of all) lines.push(...renderSuite(suite, ' '))\n lines.push('</testsuites>')\n return `${lines.join('\\n')}\\n`\n}\n\nexport class JunitReporter implements Reporter {\n readonly name = 'junit'\n private readonly run = new RunCollector()\n readonly filePath: string\n\n constructor(private readonly ctx: ReporterContext) {\n this.filePath = path.join(resolveOutDir(ctx.rootDir, ctx.outDir), JUNIT_FILE)\n }\n\n onEvent(event: RunEvent): void {\n this.run.handle(event)\n }\n\n xml(): string {\n return buildJunitXml(this.run, this.ctx.rootDir)\n }\n\n async close(): Promise<void> {\n await fs.mkdir(path.dirname(this.filePath), { recursive: true })\n await fs.writeFile(this.filePath, this.xml(), 'utf8')\n this.ctx.stderr(`vibrissa: wrote ${displayPath(this.filePath, this.ctx.rootDir)}`)\n }\n}\n\nexport function createJunitReporter(ctx: ReporterContext): JunitReporter {\n return new JunitReporter(ctx)\n}\n","/**\n * TAP 14 reporter (https://testanything.org/tap-version-14-specification.html).\n *\n * Streams one test point per case as it completes (plus manifest and check results),\n * with YAML diagnostics (`duration_ms`, failure message, mismatches, diff). Flows are\n * emitted as TAP 14 subtests, one point per step. The plan is trailing (`1..N`) because\n * points stream before the total is known; an aborted run ends with `Bail out!`.\n */\nimport type { CheckOutcome, Reporter, ReporterContext, RunEvent } from '../events.js'\nimport { createColors } from './ansi.js'\nimport { driftDetail, isDetailedSummary } from './manifest.js'\nimport {\n type CaseRecord,\n RunCollector,\n displayPath,\n firstLine,\n formatPassRate,\n neutralizeWorkflowCommand,\n outcomeHeadline,\n renderDiff,\n serverInfoLabel,\n splitLines,\n stepLabel,\n updateSkippedReason,\n} from './shared.js'\n\nconst serverSuffix = (server?: string) => (server ? ` (${server})` : '')\n\ntype YamlEntry =\n | { kind: 'scalar'; key: string; value: string | number | boolean }\n | { kind: 'block'; key: string; lines: string[] }\n | { kind: 'list'; key: string; items: Array<Record<string, string | number | boolean>> }\n\n/** Escape a test point description: backslash and `#` are significant in TAP 14. */\nexport function escapeDescription(text: string): string {\n return text.replace(/\\\\/g, '\\\\\\\\').replace(/#/g, '\\\\#').replace(/\\r?\\n/g, ' ')\n}\n\nconst YAML_RESERVED = /^(?:true|false|yes|no|on|off|null|y|n)$/i\n\nfunction yamlScalar(value: string | number | boolean): string {\n if (typeof value === 'number') return Number.isFinite(value) ? String(value) : '.nan'\n if (typeof value === 'boolean') return value ? 'true' : 'false'\n // Simple words stay plain (`severity: fail`); anything else is a JSON (= YAML) string.\n if (/^[A-Za-z_][A-Za-z0-9_-]*$/.test(value) && !YAML_RESERVED.test(value)) return value\n return JSON.stringify(value)\n}\n\nfunction renderYaml(entries: YamlEntry[], indent: string): string[] {\n if (entries.length === 0) return []\n const lines = [`${indent}---`]\n for (const entry of entries) {\n if (entry.kind === 'scalar') {\n lines.push(`${indent}${entry.key}: ${yamlScalar(entry.value)}`)\n } else if (entry.kind === 'block') {\n const firstContent = entry.lines.find((l) => l !== '') ?? ''\n // Explicit indentation indicator when the first line starts with a space.\n const header = firstContent.startsWith(' ') ? '|2-' : '|-'\n lines.push(`${indent}${entry.key}: ${header}`)\n for (const line of entry.lines) lines.push(line === '' ? '' : `${indent} ${line}`)\n } else {\n lines.push(`${indent}${entry.key}:`)\n for (const item of entry.items) {\n let first = true\n for (const [k, v] of Object.entries(item)) {\n lines.push(`${indent} ${first ? '- ' : ' '}${k}: ${yamlScalar(v)}`)\n first = false\n }\n }\n }\n }\n lines.push(`${indent}...`)\n return lines\n}\n\nexport class TapReporter implements Reporter {\n readonly name = 'tap'\n private readonly run = new RunCollector()\n private started = false\n private finished = false\n private count = 0\n\n constructor(private readonly ctx: ReporterContext) {}\n\n private out(line: string): void {\n this.ctx.stdout(neutralizeWorkflowCommand(line))\n }\n\n private ensureHeader(): void {\n if (this.started) return\n this.started = true\n this.out('TAP version 14')\n }\n\n onEvent(event: RunEvent): void {\n const record = this.run.handle(event)\n this.ensureHeader()\n switch (event.type) {\n case 'run:start': {\n const on = event.servers.length > 0 ? ` on ${event.servers.join(', ')}` : ''\n const times =\n event.repeat !== undefined && event.repeat > 1 ? ` (repeat ${event.repeat})` : ''\n this.out(`# vibrissa: running ${event.totalCases} cases${on}${times}`)\n break\n }\n case 'session:start': {\n const info = serverInfoLabel(event.serverInfo)\n this.out(\n `# session ${event.server}: ${info ? `${info}, ` : ''}${event.era} protocol ${event.protocolVersion}`,\n )\n break\n }\n case 'manifest:ok':\n this.point(\n true,\n `manifest ${displayPath(event.path, this.ctx.rootDir)}${serverSuffix(event.server)}`,\n )\n break\n case 'manifest:diff': {\n // A multi-line summary already renders the drift; otherwise render it ourselves.\n const detail = isDetailedSummary(event.summary)\n ? splitLines(event.summary.trim()).slice(1)\n : driftDetail(event.summary, event.diff, createColors(false))\n this.point(\n false,\n `manifest drift ${displayPath(event.path, this.ctx.rootDir)}${serverSuffix(event.server)}`,\n '',\n [\n { kind: 'scalar', key: 'message', value: firstLine(event.summary) },\n { kind: 'scalar', key: 'severity', value: 'fail' },\n ...(detail.length > 0 ? [{ kind: 'block' as const, key: 'diff', lines: detail }] : []),\n ],\n )\n break\n }\n case 'check':\n this.checkPoint(event.outcome)\n break\n case 'case:end':\n if (record) this.casePoint(record)\n break\n case 'warning':\n for (const line of splitLines(event.message)) this.out(`# warning: ${line}`)\n break\n case 'run:end':\n this.finish()\n break\n default:\n break\n }\n }\n\n close(): void {\n this.ensureHeader()\n if (this.finished) return\n this.finished = true\n this.out(`1..${this.count}`)\n this.out('Bail out! Run ended before completion (no run:end received)')\n }\n\n private point(\n ok: boolean,\n description: string,\n directive = '',\n yaml: YamlEntry[] = [],\n indent = '',\n number?: number,\n ): void {\n const n = number ?? ++this.count\n this.out(\n `${indent}${ok ? 'ok' : 'not ok'} ${n} - ${escapeDescription(description)}${directive}`,\n )\n for (const line of renderYaml(yaml, `${indent} `)) this.out(line)\n }\n\n private checkPoint(check: CheckOutcome): void {\n const yaml: YamlEntry[] = []\n if (check.status !== 'passed') {\n yaml.push({ kind: 'scalar', key: 'message', value: firstLine(check.detail ?? check.title) })\n yaml.push({\n kind: 'scalar',\n key: 'severity',\n value: check.status === 'failed' ? 'fail' : 'warn',\n })\n if (check.detail && splitLines(check.detail).length > 1) {\n yaml.push({ kind: 'block', key: 'detail', lines: splitLines(check.detail) })\n }\n }\n this.point(\n check.status !== 'failed',\n `check: ${check.title}${serverSuffix(check.server)}`,\n '',\n yaml,\n )\n }\n\n private casePoint(record: CaseRecord): void {\n const { ref, outcome } = record\n const title = `${this.run.multiServer ? `[${ref.server}] ` : ''}${ref.name}${record.run !== undefined ? ` (run ${record.run})` : ''}`\n\n if (record.steps.length > 0) {\n this.out(`# Subtest: ${escapeDescription(title)}`)\n record.steps.forEach((s, i) => {\n const yaml: YamlEntry[] = [{ kind: 'scalar', key: 'duration_ms', value: s.durationMs }]\n if (s.status === 'failed') {\n yaml.push({ kind: 'scalar', key: 'message', value: firstLine(s.reason ?? 'step failed') })\n yaml.push({ kind: 'scalar', key: 'severity', value: 'fail' })\n }\n const directive =\n s.status === 'skipped' ? ` # SKIP${s.reason ? ` ${firstLine(s.reason)}` : ''}` : ''\n this.point(s.status !== 'failed', stepLabel(s.step), directive, yaml, ' ', i + 1)\n })\n this.out(` 1..${record.steps.length}`)\n }\n\n if (outcome.status === 'skipped') {\n const reason = outcome.reason ? ` ${firstLine(outcome.reason)}` : ''\n this.point(true, title, ` # SKIP${reason}`)\n return\n }\n\n const yaml: YamlEntry[] = [{ kind: 'scalar', key: 'duration_ms', value: outcome.durationMs }]\n if (outcome.status === 'updated') yaml.push({ kind: 'scalar', key: 'status', value: 'updated' })\n const notUpdated = updateSkippedReason(outcome)\n if (outcome.status === 'failed') {\n yaml.push({ kind: 'scalar', key: 'message', value: outcomeHeadline(outcome) })\n yaml.push({ kind: 'scalar', key: 'severity', value: 'fail' })\n yaml.push({ kind: 'scalar', key: 'file', value: displayPath(ref.file, this.ctx.rootDir) })\n yaml.push({ kind: 'scalar', key: 'server', value: ref.server })\n if (ref.line !== undefined) yaml.push({ kind: 'scalar', key: 'line', value: ref.line })\n if (outcome.errorKind)\n yaml.push({ kind: 'scalar', key: 'error_kind', value: outcome.errorKind })\n if (notUpdated) yaml.push({ kind: 'scalar', key: 'not_updated', value: notUpdated })\n if (outcome.reason && splitLines(outcome.reason).length > 1) {\n yaml.push({ kind: 'block', key: 'reason', lines: splitLines(outcome.reason) })\n }\n const mismatches = outcome.mismatches ?? []\n if (mismatches.length > 0) {\n yaml.push({\n kind: 'list',\n key: 'mismatches',\n items: mismatches.map((m) => ({ path: m.path || '(root)', message: m.message })),\n })\n }\n const diff = renderDiff(outcome.expected, outcome.actual, createColors(false))\n if (diff) yaml.push({ kind: 'block', key: 'diff', lines: diff })\n }\n if (outcome.budget) {\n yaml.push({ kind: 'scalar', key: 'budget_ms', value: outcome.budget.budgetMs })\n }\n if (outcome.tracePath) {\n yaml.push({\n kind: 'scalar',\n key: 'trace',\n value: displayPath(outcome.tracePath, this.ctx.rootDir),\n })\n }\n if (outcome.stderrPath) {\n yaml.push({\n kind: 'scalar',\n key: 'stderr',\n value: displayPath(outcome.stderrPath, this.ctx.rootDir),\n })\n }\n if (ref.flaky) yaml.push({ kind: 'scalar', key: 'flaky', value: true })\n this.point(outcome.status !== 'failed', title, '', yaml)\n }\n\n private finish(): void {\n if (this.finished) return\n this.finished = true\n const summary = this.run.resolvedSummary()\n this.out(`1..${this.count}`)\n this.out(`# tests ${summary.total}`)\n this.out(`# pass ${summary.passed}`)\n this.out(`# fail ${summary.failed}`)\n this.out(`# skip ${summary.skipped}`)\n this.out(`# updated ${summary.updated}`)\n if (this.run.checks.length > 0) {\n const cc = this.run.checkCounts()\n this.out(`# checks ${cc.passed} passed, ${cc.failed} failed, ${cc.warned} warned`)\n }\n if (this.run.manifests.length > 0) {\n this.out(\n `# manifest drift ${this.run.manifestDrift().length} of ${this.run.manifests.length}`,\n )\n }\n for (const r of this.run.flaky()) {\n this.out(\n `# flaky ${r.name}: ${formatPassRate(r)}${r.declaredFlaky ? ' [declared flaky]' : ''}`,\n )\n }\n this.out(`# duration_ms ${Math.round(summary.durationMs)}`)\n }\n}\n\nexport function createTapReporter(ctx: ReporterContext): TapReporter {\n return new TapReporter(ctx)\n}\n","/**\n * Reporter registry. Built-ins: console (default), json, junit, github, tap.\n * Plugins add their own with `registerReporter(name, factory)`; the runner builds the\n * active set with `createReporters(names, ctx)` and drives them through `fanout(...)`.\n */\nimport type { Reporter, ReporterContext, RunEvent } from '../events.js'\nimport { ConsoleReporter } from './console.js'\nimport { GithubReporter } from './github.js'\nimport { JsonReporter } from './json.js'\nimport { JunitReporter } from './junit.js'\nimport { TapReporter } from './tap.js'\n\nexport type ReporterFactory = (ctx: ReporterContext) => Reporter\n\nexport const BUILTIN_REPORTERS = ['console', 'json', 'junit', 'github', 'tap'] as const\n\nconst registry = new Map<string, ReporterFactory>()\n\nfunction builtins(): Array<[string, ReporterFactory]> {\n return [\n ['console', (ctx) => new ConsoleReporter(ctx)],\n ['json', (ctx) => new JsonReporter(ctx)],\n ['junit', (ctx) => new JunitReporter(ctx)],\n ['github', (ctx) => new GithubReporter(ctx)],\n ['tap', (ctx) => new TapReporter(ctx)],\n ]\n}\n\nfor (const [name, factory] of builtins()) registry.set(name, factory)\n\nfunction normalizeName(name: string): string {\n return name.trim().toLowerCase()\n}\n\n/**\n * Register a reporter factory under `name` (case-insensitive). Throws if the name is\n * taken, unless `{ override: true }` — which also allows replacing a built-in.\n */\nexport function registerReporter(\n name: string,\n factory: ReporterFactory,\n options: { override?: boolean } = {},\n): void {\n const key = normalizeName(name)\n if (!key || /[\\s,]/.test(key)) {\n throw new Error(\n `Invalid reporter name ${JSON.stringify(name)}: expected a non-empty name without spaces or commas.`,\n )\n }\n if (typeof factory !== 'function') {\n throw new Error(\n `Invalid reporter factory for \"${key}\": expected a function (ctx) => Reporter, got ${typeof factory}.`,\n )\n }\n if (registry.has(key) && !options.override) {\n throw new Error(\n `Reporter \"${key}\" is already registered. Pass { override: true } to replace it.`,\n )\n }\n registry.set(key, factory)\n}\n\n/** Remove a reporter. Built-ins removed this way can be restored with `resetReporters()`. */\nexport function unregisterReporter(name: string): boolean {\n return registry.delete(normalizeName(name))\n}\n\n/** Restore the registry to just the built-ins (mainly for tests). */\nexport function resetReporters(): void {\n registry.clear()\n for (const [name, factory] of builtins()) registry.set(name, factory)\n}\n\nexport function hasReporter(name: string): boolean {\n return registry.has(normalizeName(name))\n}\n\n/** Registered reporter names, sorted. */\nexport function listReporters(): string[] {\n return [...registry.keys()].sort()\n}\n\nfunction editDistance(a: string, b: string): number {\n const dp = Array.from({ length: b.length + 1 }, (_, j) => j)\n for (let i = 1; i <= a.length; i++) {\n let prev = dp[0]\n dp[0] = i\n for (let j = 1; j <= b.length; j++) {\n const tmp = dp[j]\n dp[j] = Math.min(dp[j] + 1, dp[j - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1))\n prev = tmp\n }\n }\n return dp[b.length]\n}\n\nexport class UnknownReporterError extends Error {\n readonly reporter: string\n readonly known: string[]\n readonly suggestion?: string\n\n constructor(reporter: string, known: string[]) {\n const key = normalizeName(reporter)\n const suggestion = known\n .map((name) => ({ name, d: editDistance(key, name) }))\n .filter(({ name, d }) => d <= 2 || name.startsWith(key) || key.startsWith(name))\n .sort((a, b) => a.d - b.d)[0]?.name\n const hint = suggestion ? ` Did you mean \"${suggestion}\"?` : ''\n super(\n `Unknown reporter \"${reporter}\": expected one of ${known.join(', ')}.${hint} Set \"reporters\" in vibrissa.json or pass --reporter <name>; plugins must call registerReporter() before the run.`,\n )\n this.name = 'UnknownReporterError'\n this.reporter = reporter\n this.known = known\n this.suggestion = suggestion\n }\n}\n\n/**\n * Instantiate reporters by name. Names are case-insensitive, may be comma-separated\n * (`\"console,junit\"`), and duplicates collapse to one instance. All names are validated\n * before any reporter is created, so a typo never leaves half the set constructed.\n */\nexport function createReporters(names: string[], ctx: ReporterContext): Reporter[] {\n const keys: string[] = []\n for (const raw of names) {\n for (const part of String(raw).split(',')) {\n const key = normalizeName(part)\n if (!key || keys.includes(key)) continue\n if (!registry.has(key)) throw new UnknownReporterError(part.trim(), listReporters())\n keys.push(key)\n }\n }\n if (keys.includes('console') && keys.includes('tap')) {\n ctx.stderr(\n 'vibrissa: warning: \"console\" and \"tap\" both write to stdout, so the TAP stream will be interleaved with console output. Pick one, or run them separately.',\n )\n }\n return keys.map((key) => {\n const factory = registry.get(key) as ReporterFactory\n return factory(ctx)\n })\n}\n\n// ---------------------------------------------------------------------------\n// Fanout\n// ---------------------------------------------------------------------------\n\ninterface Slot {\n reporter: Reporter\n /** Settles when this reporter's in-flight async onEvent calls are done. */\n tail?: Promise<void>\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<void> {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { then?: unknown }).then === 'function'\n )\n}\n\nfunction reporterError(reporter: Reporter, phase: string, err: unknown): Error {\n const message = err instanceof Error ? err.message : String(err)\n return new Error(`Reporter \"${reporter.name}\" failed during ${phase}: ${message}`, { cause: err })\n}\n\nfunction combine(errors: Error[], phase: string): Error {\n if (errors.length === 1) return errors[0]\n return new AggregateError(\n errors,\n `${errors.length} reporters failed during ${phase}: ${errors.map((e) => e.message).join('; ')}`,\n )\n}\n\n/**\n * Deliver `fn` to one reporter, preserving per-reporter event order: while an async\n * onEvent is in flight, later events queue behind it; otherwise delivery is synchronous.\n */\nfunction deliver(slot: Slot, fn: () => void | Promise<void>): Promise<void> | undefined {\n const track = (p: Promise<void>) => {\n const tail = p.then(\n () => undefined,\n () => undefined,\n )\n slot.tail = tail\n void tail.then(() => {\n if (slot.tail === tail) slot.tail = undefined\n })\n return p\n }\n if (slot.tail) return track(slot.tail.then(fn))\n const result = fn()\n if (isPromiseLike(result)) return track(Promise.resolve(result))\n return undefined\n}\n\n/**\n * Combine reporters into one. Every reporter sees every event even if another throws;\n * failures are rethrown afterwards (one Error, or an AggregateError for several). The\n * return value is synchronous when all reporters handled the event synchronously, and a\n * promise otherwise. `close()` waits for queued events, then awaits every close().\n */\nexport function fanout(reporters: Reporter[]): Reporter {\n const slots: Slot[] = reporters.map((reporter) => ({ reporter }))\n return {\n name: `fanout(${reporters.map((r) => r.name).join(',')})`,\n onEvent(event: RunEvent): void | Promise<void> {\n const errors: Error[] = []\n const pending: Promise<void>[] = []\n for (const slot of slots) {\n try {\n const p = deliver(slot, () => slot.reporter.onEvent(event))\n if (p) {\n pending.push(\n p.catch((err) => {\n errors.push(reporterError(slot.reporter, event.type, err))\n }),\n )\n }\n } catch (err) {\n errors.push(reporterError(slot.reporter, event.type, err))\n }\n }\n if (pending.length === 0) {\n if (errors.length > 0) throw combine(errors, event.type)\n return\n }\n return Promise.all(pending).then(() => {\n if (errors.length > 0) throw combine(errors, event.type)\n })\n },\n async close(): Promise<void> {\n const errors: Error[] = []\n await Promise.all(\n slots.map(async (slot) => {\n try {\n if (slot.tail) await slot.tail\n await slot.reporter.close?.()\n } catch (err) {\n errors.push(reporterError(slot.reporter, 'close', err))\n }\n }),\n )\n if (errors.length > 0) throw combine(errors, 'close')\n },\n }\n}\n\nexport { ConsoleReporter, createConsoleReporter, type ConsoleReporterOptions } from './console.js'\nexport {\n JsonReporter,\n createJsonReporter,\n buildJsonReport,\n RESULTS_FILE,\n type JsonReport,\n type JsonCase,\n type JsonStep,\n type JsonMismatch,\n type JsonManifest,\n type JsonServer,\n type JsonSummary,\n} from './json.js'\nexport { JunitReporter, createJunitReporter, buildJunitXml, JUNIT_FILE } from './junit.js'\nexport {\n GithubReporter,\n createGithubReporter,\n SUMMARY_FILE,\n type GithubReporterOptions,\n} from './github.js'\nexport { TapReporter, createTapReporter } from './tap.js'\nexport { RunCollector, type CaseRecord } from './shared.js'\nexport { resolveStyle } from './ansi.js'\n","/**\n * Runner v2: executes case files against one or more MCP servers and emits RunEvents to\n * the configured reporters.\n *\n * - Cases are grouped by server. Each server gets `concurrency` workers, each with its own\n * McpSession (sessions serialize operations). A case (and every step of a flow) runs on\n * exactly one worker; flows are never split.\n * - Before cases run, the first session of each server verifies the manifest lock and (with\n * `--check`) runs the spec / description checks.\n * - Per case: setup → steps (or the case's single operation) → teardown (always).\n * - `--repeat`, `--update`, `--baseline`, `--trace`, budgets, failFast and allowEmpty are\n * all handled here; reporters only consume events.\n *\n * See docs/V2_ARCHITECTURE.md (\"Runner\") for the semantics of every case key.\n */\nimport { createHash } from 'node:crypto'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport {\n InterpolationError,\n type LoadedCase,\n type PlannedStep,\n caseFileHasComments,\n getPath,\n interpolateStep,\n isMultiStep,\n loadCases,\n opKindOf,\n planSteps,\n setIn,\n} from './cases.js'\nimport { DEFAULT_NORMALIZE, defaultRunOptions } from './defaults.js'\nimport type {\n CaseOutcome,\n CaseRef,\n CaseStatus,\n CheckOutcome,\n Mismatch,\n Reporter,\n ReporterContext,\n RunEvent,\n RunSummary,\n StepRef,\n} from './events.js'\nimport { runChecks } from './lint/index.js'\nimport {\n type CapturedManifest,\n DEFAULT_MANIFEST_IGNORE,\n type ManifestDiff,\n captureManifest,\n diffManifest,\n formatDiff,\n manifestPathFor,\n readManifest,\n summarizeDiff,\n writeManifest,\n} from './manifest.js'\nimport { escapeDirectives, isMatcherObject, matchValue } from './match.js'\nimport { normalizeResult } from './normalize.js'\nimport { resolveRootDir, resolveServerConfig } from './paths.js'\nimport { createReporters, fanout } from './reporters/index.js'\nimport type { JsonReport } from './reporters/json.js'\nimport { baseCaseId, resolveOutDir } from './reporters/shared.js'\nimport { suggestRespond } from './respond-hint.js'\nimport { appendIndex, appendKey, validate } from './schema.js'\nimport {\n type CallOptions,\n McpSession,\n type Outcome,\n SessionStartError,\n type ToolError,\n errorMatchesCode,\n} from './session/index.js'\nimport type {\n JsonObject,\n JsonValue,\n NormalizeConfig,\n RunOptions,\n ServerConfig,\n Step,\n TestCase,\n ToolSummary,\n TranscriptEntry,\n} from './types.js'\nimport { isHttpServerConfig } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Options & results\n// ---------------------------------------------------------------------------\n\n/**\n * RunOptions (incl. `outDir`, `manifestIgnore`, `checks` from config) plus runner-only knobs.\n * `outDir` holds results.json, junit.xml and traces/ (relative to rootDir; default \"reports\").\n */\nexport interface RunnerOptions extends RunOptions {\n /** Allow pretty console output (still subject to TTY / NO_COLOR). Default true. */\n pretty?: boolean\n /** Reporter output sinks. Default console.log / console.error. */\n stdout?: (line: string) => void\n stderr?: (line: string) => void\n /** Reporter instances added to the ones named in `reporters`. */\n extraReporters?: Reporter[]\n /** Informational lines (e.g. skipped `$ref` fragments). Default: `stdout`. */\n info?: (line: string) => void\n /** `--update=all`: also rewrite expectations that contain matchers. */\n updateAll?: boolean\n /** `--update-manifest`: rewrite the manifest lock on drift (or create it when missing). */\n updateManifest?: boolean\n /** Verify the manifest lock at all. Default true. */\n lockManifest?: boolean\n /** Minimum pass rate for `flaky: true` cases under --repeat. Default 0.5. */\n flakyFloor?: number\n /** --baseline: fail when a passing case's durationMs grows by more than this percent. Default 50. */\n baselineLatencyPct?: number\n /** --baseline: ignore latency growth smaller than this many ms (timer noise). Default 10. */\n baselineLatencyMinMs?: number\n /** Server stderr for runner sessions: kept out of the console and saved with traces by default. */\n serverStderr?: 'inherit' | 'capture' | 'ignore'\n /** Environment for `{{env.X}}`. Default process.env. */\n env?: Record<string, string | undefined>\n}\n\nexport interface ManifestResult {\n server: string\n path: string\n /** `missing-required`: no lock while requireManifest is on (fails the run). */\n status: 'ok' | 'diff' | 'missing' | 'missing-required' | 'updated' | 'created' | 'error'\n diff?: ManifestDiff\n summary?: string\n}\n\nexport interface RunResult {\n /** 0 ok, 1 failures, 2 configuration error (e.g. an invalid server entry). */\n exitCode: number\n ok: boolean\n summary: RunSummary\n cases: Array<{ ref: CaseRef; outcome: CaseOutcome }>\n checks: CheckOutcome[]\n manifests: ManifestResult[]\n warnings: string[]\n}\n\nexport const DEFAULT_FLAKY_FLOOR = 0.5\nexport const DEFAULT_BASELINE_LATENCY_PCT = 50\nexport const DEFAULT_BASELINE_LATENCY_MIN_MS = 10\n\n// ---------------------------------------------------------------------------\n// Small helpers\n// ---------------------------------------------------------------------------\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction errorText(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nfunction short(value: unknown, max = 80): string {\n const text = JSON.stringify(value) ?? String(value)\n return text.length > max ? `${text.slice(0, max - 1)}…` : text\n}\n\nfunction joinPath(base: string, relative: string): string {\n if (relative === '') return base\n if (relative.startsWith('[')) return `${base}${relative}`\n return base === '' ? relative : `${base}.${relative}`\n}\n\nfunction summarizeMismatches(label: string, mismatches: Mismatch[]): string {\n const first = mismatches[0]\n const more = mismatches.length > 1 ? ` (+${mismatches.length - 1} more)` : ''\n return `${label} at ${first.path}: ${first.message}${more}`\n}\n\nfunction getIn(root: unknown, source: Array<string | number>): unknown {\n let node = root as Record<string | number, unknown> | undefined\n for (const key of source) {\n if (node === undefined || node === null || typeof node !== 'object') return undefined\n node = node[key] as Record<string | number, unknown> | undefined\n }\n return node\n}\n\nfunction levenshtein(a: string, b: string): number {\n const row = Array.from({ length: b.length + 1 }, (_, i) => i)\n for (let i = 1; i <= a.length; i++) {\n let prev = row[0]\n row[0] = i\n for (let j = 1; j <= b.length; j++) {\n const tmp = row[j]\n row[j] = Math.min(row[j] + 1, row[j - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1))\n prev = tmp\n }\n }\n return row[b.length]\n}\n\n/** Closest name (case-insensitive edit distance within max(2, len/3)), for did-you-mean hints. */\nfunction suggestName(input: string, names: Iterable<string>): string | undefined {\n let best: string | undefined\n let bestScore = Number.POSITIVE_INFINITY\n for (const name of names) {\n const score = levenshtein(input.toLowerCase(), name.toLowerCase())\n if (score < bestScore) {\n bestScore = score\n best = name\n }\n }\n return bestScore <= Math.max(2, Math.floor(input.length / 3)) ? best : undefined\n}\n\n// ---------------------------------------------------------------------------\n// Matcher paths → RFC 6901 pointers into the case file\n// ---------------------------------------------------------------------------\n\n/** `content[0].text` / `_meta[\"a/b\"]` / `(root)` → path segments. */\nexport function matcherPathSegments(path: string): string[] {\n if (path === '' || path === '(root)') return []\n const out: string[] = []\n let i = 0\n while (i < path.length) {\n const ch = path[i]\n if (ch === '.') {\n i++\n } else if (ch === '[') {\n if (path[i + 1] === '\"') {\n let j = i + 2\n while (j < path.length && path[j] !== '\"') j += path[j] === '\\\\' ? 2 : 1\n out.push(JSON.parse(path.slice(i + 1, j + 1)) as string)\n i = j + 2\n } else {\n const end = path.indexOf(']', i)\n out.push(path.slice(i + 1, end === -1 ? undefined : end))\n i = end === -1 ? path.length : end + 1\n }\n } else {\n let j = i\n while (j < path.length && path[j] !== '.' && path[j] !== '[') j++\n out.push(path.slice(i, j))\n i = j\n }\n }\n return out\n}\n\n/** RFC 6901 JSON Pointer for path segments (`[\"steps\", 1, \"expect\"]` → `/steps/1/expect`). */\nexport function toPointer(segments: Array<string | number>): string {\n return segments.map((s) => `/${String(s).replace(/~/g, '~0').replace(/\\//g, '~1')}`).join('')\n}\n\n// ---------------------------------------------------------------------------\n// expectInputRequired views & respond suggestions\n// ---------------------------------------------------------------------------\n\n/**\n * Does an `expectInputRequired` expectation address requests by method? True when every\n * plain (non-`$`) top-level key contains a `/` (`elicitation/create`, `sampling/createMessage`).\n */\nfunction wantsMethodView(expected: JsonValue): boolean {\n if (!isObject(expected)) return false\n const keys = Object.keys(expected).filter((key) => !key.startsWith('$'))\n return keys.length > 0 && keys.every((key) => key.includes('/'))\n}\n\n/**\n * The value `expectInputRequired` is matched against, built from every InputRequests round\n * of the call:\n *\n * - **by key** (default): `{ \"<request key>\": { \"method\": \"...\", \"params\": {...} } }`, the\n * server's own InputRequests keys merged over all rounds. On 2025-era connections the keys\n * are JSON-RPC request ids, so prefer the method view for suites that run on both eras.\n * - **by method** (when every plain key of the expectation contains `/`):\n * `{ \"elicitation/create\": <params> }`; a method asked several times maps to an array of\n * params in order.\n */\nexport function inputRequestView(expected: JsonValue, rounds: JsonValue[]): JsonObject {\n const byKey: JsonObject = {}\n const byMethod: JsonObject = {}\n const repeated = new Set<string>()\n for (const round of rounds) {\n if (!isObject(round)) continue\n for (const [key, entry] of Object.entries(round)) {\n byKey[key] = entry\n if (!isObject(entry) || typeof entry.method !== 'string') continue\n const params = entry.params ?? {}\n const method = entry.method\n if (!Object.hasOwn(byMethod, method)) byMethod[method] = params\n else if (repeated.has(method)) (byMethod[method] as JsonValue[]).push(params)\n else {\n byMethod[method] = [byMethod[method], params]\n repeated.add(method)\n }\n }\n }\n return wantsMethodView(expected) ? byMethod : byKey\n}\n\nfunction describeRequests(requests: JsonValue): string {\n if (!isObject(requests)) return short(requests)\n const parts: string[] = []\n for (const [key, entry] of Object.entries(requests)) {\n const method = isObject(entry) && typeof entry.method === 'string' ? entry.method : key\n const params = isObject(entry) && isObject(entry.params) ? entry.params : undefined\n const message = typeof params?.message === 'string' ? ` ${JSON.stringify(params.message)}` : ''\n parts.push(`${method}${message}`)\n }\n return parts.join(', ') || 'input'\n}\n\n// Paste-ready `respond` suggestions are shared with `vib call` / `vib record`.\nexport { suggestRespond }\n\n// ---------------------------------------------------------------------------\n// Case execution (shared by the runner, the vitest bridge and `vib diff`)\n// ---------------------------------------------------------------------------\n\nexport interface ExecuteContext {\n session: McpSession\n /** Run-level normalization (merged under case / step `normalize`). */\n normalize: NormalizeConfig\n timeoutMs: number\n /** Default case budget (config `budgetMs`). */\n budgetMs?: number\n /** Tool definitions by name: outputSchema enforcement, args pre-validation, name hints. */\n tools?: Map<string, ToolSummary>\n /** Values visible to `{{name}}` before the case captures anything (suite setup). */\n vars?: Record<string, JsonValue>\n env?: Record<string, string | undefined>\n /**\n * `failing` (= --update) rewrites mismatched plain leaves of `expect`; `all` (=\n * --update=all) also replaces mismatched matchers and `$ref`s with literal values.\n */\n update?: 'off' | 'failing' | 'all'\n /** Case as written in its file (no `$ref` expansion): decides what --update may rewrite. */\n source?: TestCase\n /** Set when the case file must not be rewritten (e.g. it has comments): the reason. */\n cannotRewrite?: string\n /** Mention `--update` in failure reasons when it would help. Default true. */\n updateHint?: boolean\n /** Case id for messages. */\n caseId?: string\n onStepStart?: (step: StepRef) => void | Promise<void>\n onStepEnd?: (\n step: StepRef,\n result: { durationMs: number; status: CaseStatus; reason?: string },\n ) => void | Promise<void>\n}\n\nexport interface ExpectationUpdate {\n /** Path inside the case file, e.g. `[\"steps\", 1, \"expect\"]`. */\n source: Array<string | number>\n value: JsonValue\n}\n\nexport interface CaseExecution {\n /** tracePath / stderrPath are filled in by the runner. */\n outcome: CaseOutcome\n /** Normalized observation of every executed step, in run order (used by `vib diff`). */\n observations: Array<{ step: StepRef; observed: JsonValue; planned: PlannedStep }>\n /** Goldens accepted under --update (the caller writes them). */\n updates: ExpectationUpdate[]\n warnings: string[]\n /** Final `{{name}}` scope (suite setup uses this). */\n vars: Record<string, JsonValue>\n}\n\ntype FailureKind = NonNullable<CaseOutcome['errorKind']>\ntype MismatchField = NonNullable<Mismatch['field']>\n\ninterface Failure {\n kind: FailureKind\n reason: string\n /** The case field the failure is about (drives pointers and --update notes). */\n field?: MismatchField\n mismatches?: Mismatch[]\n expected?: JsonValue\n actual?: JsonValue\n budget?: { budgetMs: number; actualMs: number }\n /** A mismatch of `expect` (the only field --update rewrites). */\n golden?: boolean\n}\n\ninterface StepEvaluation {\n durationMs: number\n failures: Failure[]\n observed: JsonValue\n captureSource?: JsonValue\n normalized?: JsonValue\n warnings: string[]\n}\n\nfunction effectiveNormalize(\n base: NormalizeConfig,\n caseLevel: NormalizeConfig | false | undefined,\n stepLevel: NormalizeConfig | false | undefined,\n): NormalizeConfig | false {\n if (stepLevel === false) return false\n if (isObject(stepLevel)) {\n return { ...base, ...(isObject(caseLevel) ? caseLevel : {}), ...stepLevel }\n }\n if (caseLevel === false) return false\n return { ...base, ...(isObject(caseLevel) ? caseLevel : {}) }\n}\n\nfunction describeOp(kind: string, target: string): string {\n return `${kind} \"${target}\"`\n}\n\nfunction errorView(error: ToolError): JsonObject {\n return {\n kind: error.kind,\n ...(error.codeName !== undefined ? { codeName: error.codeName } : {}),\n ...(error.code !== undefined ? { code: error.code } : {}),\n message: error.message,\n ...(error.data !== undefined ? { data: error.data } : {}),\n }\n}\n\n/** \"Tool \"ech\" is not on the server; did you mean \"echo\"? Available: ...\" (or undefined). */\nfunction unknownToolHint(\n kind: string,\n target: string,\n tools: Map<string, ToolSummary> | undefined,\n): string | undefined {\n if (kind !== 'tool' || !tools || tools.size === 0 || tools.has(target)) return undefined\n const names = [...tools.keys()].sort()\n const near = suggestName(target, names)\n const shown = names.length > 12 ? `${names.slice(0, 12).join(', ')}, ...` : names.join(', ')\n return `Tool \"${target}\" is not on the server${near ? `; did you mean \"${near}\"?` : '.'} Available: ${shown}.`\n}\n\nfunction callFailedReason(what: string, error: ToolError, toolHint: string | undefined): string {\n if (error.kind === 'timeout' || error.kind === 'transport') return error.message\n if (error.kind === 'tool') {\n return `Tool returned an error at ${what}: ${error.message || '(no text content)'}. Add \"expectError\" (or an \"expect\" with \"isError\": true) if the error is the expected behavior.`\n }\n const code = error.codeName ?? error.code\n const label =\n error.codeName !== undefined && error.code !== undefined\n ? `[${error.codeName} ${error.code}] `\n : code !== undefined\n ? `[${code}] `\n : ''\n const hint =\n toolHint ??\n (code !== undefined\n ? `Add \"expectError\": { \"code\": ${JSON.stringify(code)} } if this error is the expected behavior.`\n : 'Add \"expectError\" if this error is the expected behavior.')\n return `Call failed at ${what}: ${label}${error.message}. ${hint}`\n}\n\nfunction schemaMismatches(tool: ToolSummary, raw: JsonValue, warnings: string[]): Mismatch[] {\n if (tool.outputSchema === undefined || !isObject(raw) || raw.isError === true) return []\n const structured = raw.structuredContent\n if (structured === undefined) {\n return [\n {\n path: 'structuredContent',\n message: 'missing (the tool declares an outputSchema, so results must include it)',\n field: 'structuredContent',\n },\n ]\n }\n const result = validate(tool.outputSchema, structured)\n if (result.schemaError !== undefined) {\n warnings.push(\n `outputSchema of tool \"${tool.name}\" could not be compiled (${result.schemaError}); structuredContent was not validated. Run \"vib check\" for details.`,\n )\n return []\n }\n if (result.ok) return []\n return result.errors.map((issue) => ({\n path: joinPath('structuredContent', issue.path),\n message: `does not match the tool's outputSchema: ${issue.message}`,\n actual: (getPath(structured, issue.path) ?? null) as unknown,\n field: 'structuredContent' as const,\n }))\n}\n\nasync function callOperation(\n session: McpSession,\n step: Step,\n kind: string,\n target: string,\n opts: CallOptions,\n): Promise<Outcome> {\n const args = step.args ?? {}\n switch (kind) {\n case 'tool':\n return session.callTool(target, args, opts)\n case 'resource':\n return session.readResource(target, opts)\n case 'resourceTemplate':\n return session.readResourceTemplate(target, args, opts)\n default:\n return session.getPrompt(target, args, opts)\n }\n}\n\nasync function evaluateStep(\n step: Step,\n normalize: NormalizeConfig | false,\n ctx: ExecuteContext,\n): Promise<StepEvaluation> {\n const warnings: string[] = []\n const kind = opKindOf(step)\n if (!kind) {\n return {\n durationMs: 0,\n observed: null,\n warnings,\n failures: [\n {\n kind: 'error',\n reason:\n 'No operation: add one of \"tool\", \"resource\", \"resourceTemplate\" or \"prompt\" to the step.',\n },\n ],\n }\n }\n const target = String(step[kind])\n const what = describeOp(kind, target)\n const norm = (value: JsonValue): JsonValue =>\n normalize === false ? value : normalizeResult(value, normalize)\n\n const tool = kind === 'tool' ? ctx.tools?.get(target) : undefined\n if (tool && step.expectError === undefined && isObject(tool.inputSchema)) {\n const check = validate(tool.inputSchema, step.args ?? {})\n if (!check.ok && check.schemaError === undefined) {\n const issue = check.errors[0]\n warnings.push(\n `${ctx.caseId ? `${ctx.caseId}: ` : ''}args for ${what} do not match its inputSchema (${joinPath('args', issue.path)}: ${issue.message}). If that is deliberate, add \"expectError\".`,\n )\n }\n }\n\n const callOpts: CallOptions = { timeoutMs: step.timeoutMs ?? ctx.timeoutMs }\n if (step.respond !== undefined) callOpts.respond = step.respond\n if (step.await !== undefined && step.await !== false) callOpts.await = step.await\n\n let outcome: Outcome\n try {\n outcome = await callOperation(ctx.session, step, kind, target, callOpts)\n } catch (err) {\n return {\n durationMs: 0,\n observed: { error: { kind: 'client', message: errorText(err) } },\n warnings,\n failures: [{ kind: 'error', reason: `Call failed at ${what}: ${errorText(err)}.` }],\n }\n }\n\n const failures: Failure[] = []\n const rounds =\n outcome.inputRequests ?? (outcome.kind === 'input_required' ? [outcome.requests] : [])\n let observed: JsonValue = null\n let captureSource: JsonValue | undefined\n let normalized: JsonValue | undefined\n\n if (outcome.kind === 'input_required') {\n observed = { inputRequired: norm(outcome.requests) }\n captureSource = inputRequestView(step.expectInputRequired ?? {}, rounds)\n const assertsRequestOnly =\n step.expectInputRequired !== undefined &&\n step.expect === undefined &&\n step.expectError === undefined\n if (!assertsRequestOnly) {\n const respond = JSON.stringify({\n ...(step.respond ?? {}),\n ...suggestRespond(outcome.requests),\n })\n failures.push({\n kind: 'error',\n reason: `Unanswered input request at ${what}: the server asked for ${describeRequests(outcome.requests)}. Add to the step: \"respond\": ${respond} (edit the sample values), or assert only the request with \"expectInputRequired\".`,\n actual: norm(outcome.requests),\n })\n }\n }\n\n if (step.expectInputRequired !== undefined) {\n if (rounds.length === 0) {\n failures.push({\n kind: 'assertion',\n field: 'expectInputRequired',\n reason: `Expected an input request at ${what}, but the server answered without asking (no input_required round). Remove \"expectInputRequired\", or check the server.`,\n expected: step.expectInputRequired,\n })\n } else {\n const view = norm(inputRequestView(step.expectInputRequired, rounds))\n const mismatches = matchValue(step.expectInputRequired, view)\n if (mismatches.length > 0) {\n failures.push({\n kind: 'assertion',\n field: 'expectInputRequired',\n reason: `${summarizeMismatches('Input request mismatch', mismatches)} (${what}).`,\n mismatches,\n expected: step.expectInputRequired,\n actual: view,\n })\n }\n }\n }\n\n if (step.expectTask !== undefined) {\n if (outcome.task === undefined) {\n failures.push({\n kind: 'assertion',\n field: 'expectTask',\n reason: `Expected a task at ${what}, but the server answered directly (tasks need a 2026-07-28 connection and a server that supports the tasks extension).`,\n expected: step.expectTask,\n })\n } else {\n const task = norm(outcome.task)\n const mismatches = matchValue(step.expectTask, task)\n if (mismatches.length > 0) {\n failures.push({\n kind: 'assertion',\n field: 'expectTask',\n reason: `${summarizeMismatches('Task mismatch', mismatches)} (${what}).`,\n mismatches,\n expected: step.expectTask,\n actual: task,\n })\n }\n }\n }\n\n if (outcome.kind === 'error') {\n const error = outcome.error\n const view = errorView(error)\n observed = { error: view }\n if (step.expectError !== undefined) {\n captureSource = view\n const expected = step.expectError\n const actual: JsonObject = {\n ...(error.codeName !== undefined || error.code !== undefined\n ? { code: error.codeName ?? error.code ?? null }\n : {}),\n message: error.message,\n }\n if (expected.code !== undefined && !errorMatchesCode(error, expected.code)) {\n const got =\n error.codeName !== undefined\n ? `\"${error.codeName}\"${error.code !== undefined ? ` (${error.code})` : ''}`\n : error.code !== undefined\n ? String(error.code)\n : `no code (${error.kind} error)`\n failures.push({\n kind: 'assertion',\n field: 'expectError',\n reason: `Error code mismatch at ${what}: expected ${JSON.stringify(expected.code)}, got ${got}. Message: ${error.message}`,\n mismatches: [\n {\n path: 'code',\n message: `expected ${JSON.stringify(expected.code)}, got ${got}`,\n expected: expected.code,\n actual: error.codeName ?? error.code,\n },\n ],\n expected: expected as unknown as JsonValue,\n actual,\n })\n }\n if (expected.message !== undefined) {\n const mismatches = matchValue(expected.message as JsonValue, error.message)\n if (mismatches.length > 0) {\n failures.push({\n kind: 'assertion',\n field: 'expectError',\n reason: `Error message mismatch at ${what}: ${mismatches[0].message}.`,\n mismatches: mismatches.map((m) => ({\n ...m,\n path: m.path === '(root)' ? 'message' : `message.${m.path}`,\n })),\n expected: expected as unknown as JsonValue,\n actual,\n })\n }\n }\n } else if (error.kind === 'tool' && outcome.result !== undefined && step.expect !== undefined) {\n // A tool-level `isError` result compared as data (goldens recorded from error results).\n normalized = norm(outcome.result)\n observed = normalized\n captureSource = normalized\n const mismatches = matchValue(step.expect, normalized)\n if (mismatches.length > 0) {\n failures.push({\n kind: 'assertion',\n field: 'expect',\n golden: true,\n reason: `${summarizeMismatches('Expectation failed', mismatches)}.`,\n mismatches,\n expected: step.expect,\n actual: normalized,\n })\n }\n } else {\n failures.push({\n kind: error.kind === 'timeout' ? 'timeout' : 'error',\n reason: callFailedReason(what, error, unknownToolHint(kind, target, ctx.tools)),\n actual: view,\n })\n }\n } else if (outcome.kind === 'result') {\n normalized = norm(outcome.result)\n observed = normalized\n captureSource = normalized\n const raw = outcome.result\n const isTaskHandle = isObject(raw) && raw.resultType === 'task'\n const schemaIssues =\n kind === 'tool' && tool && step.validateOutput !== false && !isTaskHandle\n ? schemaMismatches(tool, raw, warnings)\n : []\n if (step.expectError !== undefined) {\n const violated =\n schemaIssues.length > 0\n ? ` and violated its outputSchema at ${schemaIssues[0].path}: ${schemaIssues[0].message.replace(/^does not match the tool's outputSchema: /, '')}`\n : ''\n failures.push({\n kind: 'assertion',\n field: 'expectError',\n reason: `Expected an error at ${what}, but the call succeeded${violated}. Remove \"expectError\", or fix the server.`,\n ...(schemaIssues.length > 0 ? { mismatches: schemaIssues } : {}),\n expected: step.expectError as unknown as JsonValue,\n actual: normalized,\n })\n } else {\n if (schemaIssues.length > 0) {\n failures.push({\n kind: 'assertion',\n field: 'structuredContent',\n reason: `${summarizeMismatches('Output schema violation', schemaIssues)}. The outputSchema of ${what} rejects its own structuredContent; fix the server, or set \"validateOutput\": false.`,\n mismatches: schemaIssues,\n actual: isObject(raw) ? (raw.structuredContent ?? null) : null,\n })\n }\n if (step.expect !== undefined) {\n const mismatches = matchValue(step.expect, normalized)\n if (mismatches.length > 0) {\n failures.push({\n kind: 'assertion',\n field: 'expect',\n golden: true,\n reason: `${summarizeMismatches('Expectation failed', mismatches)}.`,\n mismatches,\n expected: step.expect,\n actual: normalized,\n })\n }\n }\n }\n }\n\n return { durationMs: outcome.durationMs, failures, observed, captureSource, normalized, warnings }\n}\n\nfunction stepRefFor(planned: PlannedStep, index: number): StepRef {\n const kind = opKindOf(planned.step) ?? 'tool'\n const target = String(planned.step[kind] ?? '?')\n const base = planned.step.name ?? target\n const name =\n planned.phase === 'setup'\n ? `setup: ${base}`\n : planned.phase === 'teardown'\n ? `teardown: ${base}`\n : base\n return { index, name, kind, target }\n}\n\nfunction stepLabel(planned: PlannedStep, ref: StepRef, plan: PlannedStep[]): string {\n const position = plan.filter((p) => p.phase === planned.phase).indexOf(planned) + 1\n const phase =\n planned.phase === 'setup'\n ? 'Setup step'\n : planned.phase === 'teardown'\n ? 'Teardown step'\n : 'Step'\n return `${phase} ${position}${planned.step.name ? ` \"${planned.step.name}\"` : ''} (${ref.kind} ${ref.target})`\n}\n\n// ---------------------------------------------------------------------------\n// --update: leaf-level rewrites\n// ---------------------------------------------------------------------------\n\ninterface Blocked {\n path: string\n why: 'matcher' | 'placeholder' | 'ref'\n detail: string\n}\n\ninterface Reconciled {\n value: JsonValue\n blocked: Blocked[]\n replaced: string[]\n}\n\nfunction displayPath(path: string): string {\n return path === '' ? '(root)' : path\n}\n\nfunction matcherNames(value: JsonObject): string {\n return Object.keys(value)\n .filter((key) => key.startsWith('$'))\n .join(' + ')\n}\n\n/**\n * Patch only what mismatches: walk the expectation as written (`src`) alongside its resolved\n * form (`res`: `$ref`s expanded, `{{captures}}` interpolated) and the actual value. Subtrees\n * that still match are kept verbatim (matchers included); mismatched plain leaves take the\n * actual value; mismatched matchers / `$ref`s are blocked, or replaced in `all` mode.\n */\nfunction reconcile(\n src: JsonValue,\n res: JsonValue,\n act: JsonValue,\n path: string,\n partial: boolean,\n mode: 'failing' | 'all',\n out: Reconciled,\n): JsonValue {\n if (matchValue(res, act, { partial }).length === 0) return src\n const where = displayPath(path)\n if (typeof src === 'string' && src.includes('{{')) {\n out.blocked.push({ path: where, why: 'placeholder', detail: src })\n return src\n }\n if (isObject(src) && Object.hasOwn(src, '$ref')) {\n if (mode === 'all') {\n out.replaced.push(`${where} ($ref ${short(src.$ref, 60)})`)\n return escapeDirectives(act)\n }\n out.blocked.push({ path: where, why: 'ref', detail: String(src.$ref) })\n return src\n }\n if (isMatcherObject(src)) {\n const names = isObject(src) ? matcherNames(src) : 'matcher'\n if (mode === 'all') {\n out.replaced.push(`${where} (${names})`)\n return escapeDirectives(act)\n }\n out.blocked.push({ path: where, why: 'matcher', detail: names })\n return src\n }\n if (isObject(src) && isObject(res) && isObject(act)) {\n const childPartial = typeof src.$partial === 'boolean' ? src.$partial : partial\n const result: JsonObject = {}\n for (const key of Object.keys(src)) {\n if (key === '$partial') {\n result[key] = src[key]\n continue\n }\n const child = appendKey(path, key)\n if (!Object.hasOwn(act, key)) {\n // Gone from the live result: drop it, unless it is a matcher that accepts absence.\n if (matchValue(res[key] ?? null, undefined, { partial: childPartial }).length === 0) {\n result[key] = src[key]\n }\n continue\n }\n result[key] = reconcile(src[key], res[key] ?? null, act[key], child, childPartial, mode, out)\n }\n if (!childPartial) {\n for (const key of Object.keys(act)) {\n if (!Object.hasOwn(src, key)) result[key] = escapeDirectives(act[key])\n }\n }\n return result\n }\n if (Array.isArray(src) && Array.isArray(res) && Array.isArray(act)) {\n return act.map((item, i) =>\n i < src.length\n ? reconcile(src[i], res[i] ?? null, item, appendIndex(path, i), partial, mode, out)\n : escapeDirectives(item),\n )\n }\n return escapeDirectives(act)\n}\n\nfunction blockedReason(blocked: Blocked[]): string {\n const placeholders = blocked.filter((b) => b.why === 'placeholder')\n if (placeholders.length > 0) {\n return `${placeholders.map((b) => b.path).join(', ')} uses {{captured}} values (accepting live output would freeze them); edit it by hand`\n }\n const refs = blocked.filter((b) => b.why === 'ref')\n const matchers = blocked.filter((b) => b.why === 'matcher')\n const parts: string[] = []\n if (matchers.length > 0) {\n const list = matchers.map((b) => `${b.path} (${b.detail})`).join(', ')\n parts.push(\n `${list} ${matchers.length === 1 ? 'is a matcher that no longer matches' : 'are matchers that no longer match'}; fix the matcher by hand`,\n )\n }\n if (refs.length > 0) {\n parts.push(\n `${refs.map((b) => `${b.path} ($ref ${b.detail})`).join(', ')} comes from a shared fragment; edit the fragment`,\n )\n }\n return `${parts.join('; ')}, or rerun with --update=all to replace ${blocked.length === 1 ? 'it' : 'them'} with the literal live value`\n}\n\ninterface RewritePlan {\n ok: boolean\n /** Why --update cannot (or did not) rewrite this expectation. */\n why?: string\n value?: JsonValue\n replaced?: string[]\n previous?: JsonValue\n}\n\nfunction planRewrite(\n ctx: ExecuteContext,\n planned: PlannedStep,\n resolvedExpect: JsonValue,\n actual: JsonValue | undefined,\n mode: 'failing' | 'all',\n): RewritePlan {\n if (ctx.cannotRewrite) return { ok: false, why: ctx.cannotRewrite }\n if (!ctx.source) return { ok: false, why: 'it is not backed by a case file' }\n const written = getIn(ctx.source, [...planned.source, 'expect']) as JsonValue | undefined\n if (written === undefined || actual === undefined) {\n return { ok: false, why: 'the case file has no \"expect\" there' }\n }\n const out: Reconciled = { value: null, blocked: [], replaced: [] }\n out.value = reconcile(written, resolvedExpect, actual, '', false, mode, out)\n if (out.blocked.length > 0) return { ok: false, why: blockedReason(out.blocked) }\n return { ok: true, value: out.value, replaced: out.replaced, previous: written }\n}\n\n/** Why --update does not help with a non-`expect` failure. */\nfunction notRewrittenReason(failure: Failure): string {\n switch (failure.field) {\n case 'expectError':\n return '--update never rewrites \"expectError\"; edit it by hand (expected vs got is in the mismatch list)'\n case 'expectInputRequired':\n return '--update does not rewrite \"expectInputRequired\"; edit it by hand'\n case 'expectTask':\n return '--update does not rewrite \"expectTask\"; edit it by hand'\n case 'structuredContent':\n return 'the server violates its own outputSchema; --update cannot fix that (fix the server, or set \"validateOutput\": false)'\n default:\n if (failure.kind === 'budget')\n return 'a budget breach is not a golden; raise \"budgetMs\" or speed up the server'\n if (failure.kind === 'timeout')\n return 'the call timed out; --update only rewrites \"expect\" goldens'\n return 'the step failed before its \"expect\" could be compared; --update only rewrites \"expect\" goldens'\n }\n}\n\nfunction annotate(\n failure: Failure,\n planned: PlannedStep,\n stepIndex: number | undefined,\n): Mismatch[] | undefined {\n if (!failure.mismatches) return undefined\n return failure.mismatches.map((m) => {\n const field = m.field ?? failure.field\n const pointer =\n field && field !== 'structuredContent'\n ? toPointer([...planned.source, field, ...matcherPathSegments(m.path)])\n : undefined\n return {\n ...m,\n ...(field ? { field } : {}),\n ...(pointer !== undefined ? { pointer } : {}),\n ...(stepIndex !== undefined ? { stepIndex } : {}),\n }\n })\n}\n\n/**\n * Run one case on a session: setup → steps → teardown, with interpolation, MRTR answers,\n * tasks, outputSchema enforcement, expectations, captures and budgets. Never throws.\n */\nexport async function executeCase(data: TestCase, ctx: ExecuteContext): Promise<CaseExecution> {\n const started = performance.now()\n const plan = planSteps(data)\n const multi = isMultiStep(data)\n const vars: Record<string, JsonValue> = { ...(ctx.vars ?? {}) }\n const scope = { vars, env: ctx.env }\n const observations: CaseExecution['observations'] = []\n const updates: ExpectationUpdate[] = []\n const warnings: string[] = []\n const steps: NonNullable<CaseOutcome['steps']> = []\n const mode = ctx.update ?? 'off'\n const hints = ctx.updateHint !== false\n let first: { failure: Failure; label: string; planned?: PlannedStep; index?: number } | undefined\n let updateSkipped: string | undefined\n let accepted: { expected?: JsonValue; actual?: JsonValue } | undefined\n let operationsMs = 0\n\n for (let i = 0; i < plan.length; i++) {\n const planned = plan[i]\n const ref = stepRefFor(planned, i)\n const label = stepLabel(planned, ref, plan)\n if (first && planned.phase !== 'teardown') {\n steps.push({ step: ref, durationMs: 0, status: 'skipped', reason: 'an earlier step failed' })\n continue\n }\n\n let step: Step\n try {\n step = interpolateStep(planned.step, scope, planned.at)\n } catch (err) {\n if (planned.phase === 'teardown' && err instanceof InterpolationError) {\n // A capture the teardown needs never happened (its step failed or was skipped).\n const reason = `skipped: {{${err.placeholder}}} was never captured (an earlier step failed or was skipped)`\n steps.push({ step: ref, durationMs: 0, status: 'skipped', reason })\n if (multi) {\n await ctx.onStepStart?.(ref)\n await ctx.onStepEnd?.(ref, { durationMs: 0, status: 'skipped', reason })\n }\n continue\n }\n step = planned.step\n if (multi) await ctx.onStepStart?.(ref)\n const failure: Failure = { kind: 'error', reason: errorText(err) }\n if (!planned.step.ignoreErrors && !first) first = { failure, label, planned, index: i }\n const status: CaseStatus = 'failed'\n const reason = planned.step.ignoreErrors\n ? `ignored (ignoreErrors): ${failure.reason}`\n : failure.reason\n steps.push({ step: ref, durationMs: 0, status, reason })\n if (multi) await ctx.onStepEnd?.(ref, { durationMs: 0, status, reason })\n continue\n }\n if (multi) await ctx.onStepStart?.(ref)\n\n let evaluation: StepEvaluation\n try {\n const normalize = effectiveNormalize(ctx.normalize, data.normalize, planned.step.normalize)\n evaluation = await evaluateStep(\n { ...step, validateOutput: planned.step.validateOutput ?? data.validateOutput },\n normalize,\n { ...ctx, timeoutMs: planned.step.timeoutMs ?? data.timeoutMs ?? ctx.timeoutMs },\n )\n } catch (err) {\n evaluation = {\n durationMs: 0,\n observed: null,\n warnings: [],\n failures: [{ kind: 'error', reason: `Step crashed: ${errorText(err)}` }],\n }\n }\n warnings.push(...evaluation.warnings)\n observations.push({ step: ref, observed: evaluation.observed, planned })\n\n // Golden mismatch: rewrite it (--update), or say whether --update would.\n let updated = false\n const golden = evaluation.failures.find((f) => f.golden)\n if (golden && step.expect !== undefined) {\n const rewrite = planRewrite(\n ctx,\n planned,\n step.expect,\n evaluation.normalized,\n mode === 'all' ? 'all' : 'failing',\n )\n if (mode !== 'off' && rewrite.ok && rewrite.value !== undefined) {\n updates.push({ source: [...planned.source, 'expect'], value: rewrite.value })\n accepted ??= { expected: rewrite.previous, actual: rewrite.value }\n if (rewrite.replaced?.length) {\n warnings.push(\n `Updated ${ctx.caseId ?? 'case'}${multi ? ` (${label})` : ''}: replaced ${rewrite.replaced.join(', ')} with literal values (--update=all).`,\n )\n }\n evaluation.failures = evaluation.failures.filter((f) => f !== golden)\n updated = true\n } else if (mode !== 'off') {\n golden.reason = `${golden.reason} Not rewritten by --update: ${rewrite.why}.`\n updateSkipped ??= rewrite.why\n } else if (hints) {\n golden.reason = rewrite.ok\n ? `${golden.reason} Use --update to accept the new output.`\n : `${golden.reason} --update would not rewrite it: ${rewrite.why}.`\n }\n }\n\n // Captures (only from a step that otherwise passed).\n if (evaluation.failures.length === 0 && planned.step.capture) {\n for (const [name, dotted] of Object.entries(planned.step.capture)) {\n const value = getPath(evaluation.captureSource, dotted)\n if (value === undefined) {\n const keys = isObject(evaluation.captureSource)\n ? Object.keys(evaluation.captureSource).join(', ')\n : 'none'\n evaluation.failures.push({\n kind: 'assertion',\n reason: `Capture failed at ${joinPath(planned.at || '(case)', `capture.${name}`)}: nothing at \"${dotted}\" in the result (top-level keys: ${keys || 'none'}). Fix the dotted path; \"a.b[0].c\" and \"a.b.0.c\" both work.`,\n actual: evaluation.captureSource,\n })\n break\n }\n vars[name] = value\n }\n }\n\n // Step budget.\n const stepBudget = multi ? planned.step.budgetMs : undefined\n if (\n evaluation.failures.length === 0 &&\n stepBudget !== undefined &&\n evaluation.durationMs > stepBudget\n ) {\n evaluation.failures.push({\n kind: 'budget',\n reason: `Budget exceeded at ${label}: took ${evaluation.durationMs}ms, budget ${stepBudget}ms. Raise \"budgetMs\", or make the server faster.`,\n budget: { budgetMs: stepBudget, actualMs: evaluation.durationMs },\n })\n }\n\n if (planned.phase !== 'teardown') operationsMs += evaluation.durationMs\n\n let status: CaseStatus = updated ? 'updated' : 'passed'\n let reason: string | undefined\n const failure = evaluation.failures[0]\n if (failure) {\n status = 'failed'\n if (planned.step.ignoreErrors) {\n // ignoreErrors: the step is recorded as failed, but never fails the case or stops a flow.\n reason = `ignored (ignoreErrors): ${failure.reason}`\n if (planned.phase !== 'teardown') {\n warnings.push(\n `${ctx.caseId ?? 'case'}${multi ? ` (${label})` : ''}: failure ignored because of \"ignoreErrors\": ${failure.reason}`,\n )\n }\n } else {\n reason = failure.reason\n if (!first) first = { failure, label, planned, index: i }\n }\n }\n steps.push({\n step: ref,\n durationMs: evaluation.durationMs,\n status,\n ...(reason ? { reason } : {}),\n })\n if (multi) {\n await ctx.onStepEnd?.(ref, {\n durationMs: evaluation.durationMs,\n status,\n ...(reason ? { reason } : {}),\n })\n }\n }\n\n // Case budget: time spent in server operations (setup + steps, not teardown).\n const caseBudget = data.budgetMs ?? ctx.budgetMs\n if (!first && caseBudget !== undefined && operationsMs > caseBudget) {\n first = {\n failure: {\n kind: 'budget',\n reason: `Budget exceeded: operations took ${operationsMs}ms, budget ${caseBudget}ms. Raise \"budgetMs\", or make the server faster.`,\n budget: { budgetMs: caseBudget, actualMs: operationsMs },\n },\n label: '',\n }\n }\n\n const durationMs = Math.round(performance.now() - started)\n const outcome: CaseOutcome = {\n status: first ? 'failed' : updates.length > 0 ? 'updated' : 'passed',\n durationMs,\n }\n if (first) {\n const f = first.failure\n outcome.reason = multi && first.label ? `${first.label}: ${f.reason}` : f.reason\n outcome.errorKind = f.kind\n const mismatches = first.planned\n ? annotate(f, first.planned, multi ? first.index : undefined)\n : f.mismatches\n if (mismatches) outcome.mismatches = mismatches\n if (f.expected !== undefined) outcome.expected = f.expected\n if (f.actual !== undefined) outcome.actual = f.actual\n if (f.budget) outcome.budget = f.budget\n if (mode !== 'off') {\n const why = f.golden ? updateSkipped : notRewrittenReason(f)\n if (why) outcome.updateSkipped = { reason: why }\n }\n } else if (accepted) {\n if (accepted.expected !== undefined) outcome.expected = accepted.expected\n if (accepted.actual !== undefined) outcome.actual = accepted.actual\n }\n if (multi) outcome.steps = steps\n return { outcome, observations, updates, warnings, vars }\n}\n\n/** The indent the file uses (`\" \"`, `\" \"`, `\"\\t\"`), for rewrites that keep its format. */\nexport function detectIndent(text: string | undefined): string | number {\n const match = /^([ \\t]+)[\"}\\]]/m.exec(text ?? '')\n return match ? match[1] : 2\n}\n\n/** Write accepted goldens back into the case file (its own indent and EOL; key order kept). */\nexport function applyUpdates(loaded: LoadedCase, updates: ExpectationUpdate[]): void {\n if (!loaded.source || updates.length === 0) return\n const clone = structuredClone(loaded.source) as unknown as Record<string, unknown>\n for (const update of updates) setIn(clone, update.source, update.value)\n const eol = loaded.text?.includes('\\r\\n') ? '\\r\\n' : '\\n'\n const json = JSON.stringify(clone, null, detectIndent(loaded.text)).replace(/\\n/g, eol)\n fs.writeFileSync(loaded.path, `${json}${eol}`, 'utf8')\n loaded.source = clone as unknown as TestCase\n loaded.text = `${json}${eol}`\n}\n\n// ---------------------------------------------------------------------------\n// Traces\n// ---------------------------------------------------------------------------\n\n/**\n * Trace file name (relative, no extension) for a case id: `cases/echo.basic.json#2` →\n * `cases/echo.basic.run2`. Cases outside rootDir (absolute ids) get a flat\n * `_external/<basename>-<hash>` name instead of mirroring the absolute path.\n */\nexport function traceName(caseId: string): string {\n const hash = caseId.lastIndexOf('#')\n const file = hash === -1 ? caseId : caseId.slice(0, hash)\n const run = hash === -1 ? undefined : caseId.slice(hash + 1)\n const suffix = run ? `.run${run}` : ''\n if (/^([A-Za-z]:)?[\\\\/]/.test(file)) {\n const base = (file.split(/[\\\\/]/).pop() ?? 'case')\n .replace(/\\.jsonc?$/i, '')\n .replace(/[^\\w.-]/g, '_')\n const digest = createHash('sha1').update(file).digest('hex').slice(0, 8)\n return `_external/${base || 'case'}-${digest}${suffix}`\n }\n const safe = file\n .replace(/\\.jsonc?$/i, '')\n .split('/')\n .filter((segment) => segment !== '' && segment !== '.')\n .map((segment) => (segment === '..' ? '_up' : segment.replace(/[<>:\"|?*\\\\#]/g, '_')))\n .join('/')\n return `${safe || 'case'}${suffix}`\n}\n\n// ---------------------------------------------------------------------------\n// Runner\n// ---------------------------------------------------------------------------\n\ninterface CaseRun {\n loaded: LoadedCase\n ref: CaseRef\n}\n\ninterface Worker {\n index: number\n server: string\n config: ServerConfig\n session?: McpSession\n startError?: Error\n trace?: TranscriptEntry[]\n vars: Record<string, JsonValue>\n}\n\ninterface ServerState {\n tools?: Map<string, ToolSummary>\n}\n\n/** `session.stdoutNoise` when the session tracks it (feature-detected). */\nfunction noiseOf(session: McpSession): { lines: number; sample: string[] } | undefined {\n const noise = (session as unknown as { stdoutNoise?: { lines?: unknown; sample?: unknown } })\n .stdoutNoise\n if (!noise || typeof noise.lines !== 'number') return undefined\n const sample = Array.isArray(noise.sample)\n ? noise.sample.filter((s): s is string => typeof s === 'string')\n : []\n return { lines: noise.lines, sample }\n}\n\ninterface BaselineCase {\n failed: boolean\n durationMs: number\n}\n\nexport class Runner {\n readonly options: RunnerOptions\n private reporter!: Reporter\n private ctx!: ReporterContext\n private rootDir = ''\n private readonly results: Array<{ ref: CaseRef; outcome: CaseOutcome }> = []\n private readonly checks: CheckOutcome[] = []\n private readonly manifests: ManifestResult[] = []\n private readonly warnings: string[] = []\n private readonly flakyIds = new Set<string>()\n /** Case ids that regressed against --baseline (set once the baseline was applied). */\n private readonly baselineFailures = new Set<string>()\n private baselineActive = false\n private stopped = false\n private fatal: Error | undefined\n /** Every session started per server (restarts included), for the stdout-noise report. */\n private readonly sessionsByServer = new Map<string, McpSession[]>()\n\n constructor(options: RunnerOptions) {\n this.options = options\n }\n\n /** Run and return the exit code (0 ok, 1 failures, 2 configuration error). */\n async run(): Promise<number> {\n return (await this.execute()).exitCode\n }\n\n async execute(): Promise<RunResult> {\n const opts = this.options\n this.rootDir = resolveRootDir(opts)\n this.ctx = {\n rootDir: this.rootDir,\n outDir: opts.outDir ?? 'reports',\n pretty: opts.pretty ?? true,\n stdout: opts.stdout ?? ((line) => console.log(line)),\n stderr: opts.stderr ?? ((line) => console.error(line)),\n }\n const reporters = [\n // `reporters: []` means none (e.g. `vib run --json` attaches its own); unset means console.\n ...createReporters(opts.reporters ?? ['console'], this.ctx),\n ...(opts.extraReporters ?? []),\n ]\n this.reporter = fanout(reporters)\n const startedAt = Date.now()\n try {\n return await this.runAll(startedAt)\n } finally {\n try {\n await this.reporter.close?.()\n } catch (err) {\n this.ctx.stderr(`vibrissa: ${errorText(err)}`)\n }\n }\n }\n\n private async emit(event: RunEvent): Promise<void> {\n if (event.type === 'warning') this.warnings.push(event.message)\n if (event.type === 'check') this.checks.push(event.outcome)\n if (event.type === 'case:end') this.results.push({ ref: event.case, outcome: event.outcome })\n try {\n await this.reporter.onEvent(event)\n } catch (err) {\n this.ctx.stderr(`vibrissa: ${errorText(err)}`)\n }\n }\n\n private async warn(message: string): Promise<void> {\n if (this.warnings.includes(message)) return\n await this.emit({ type: 'warning', message })\n }\n\n private async runAll(startedAt: number): Promise<RunResult> {\n const opts = this.options\n const loaded = await loadCases({\n rootDir: this.rootDir,\n globs: opts.globs,\n defaultServer: opts.defaultServer,\n servers: Object.keys(opts.servers),\n hooks: opts.hooks,\n env: opts.env,\n manifest: opts.manifest,\n tags: opts.tags,\n excludeTags: opts.excludeTags,\n grep: opts.grep,\n shard: opts.shard,\n })\n\n let repeat = Math.max(1, Math.floor(opts.repeat ?? 1))\n const updateMode = opts.update || opts.updateAll\n const repeatIgnored = updateMode && repeat > 1\n if (repeatIgnored) repeat = 1\n const runs: CaseRun[] = []\n for (let r = 1; r <= repeat; r++) {\n for (const c of loaded.cases) {\n runs.push({ loaded: c, ref: repeat > 1 ? { ...c.ref, id: `${c.ref.id}#${r}` } : c.ref })\n }\n }\n for (const c of loaded.cases) if (c.ref.flaky) this.flakyIds.add(c.ref.id)\n\n const servers = this.orderServers(loaded.cases.map((c) => c.ref.server))\n await this.emit({\n type: 'run:start',\n totalCases: runs.length,\n servers,\n startedAt,\n ...(repeat > 1 ? { repeat } : {}),\n ...(opts.shard && opts.shard.total > 1\n ? { shard: { index: opts.shard.index, total: opts.shard.total } }\n : {}),\n })\n for (const warning of loaded.warnings) await this.warn(warning)\n if (loaded.fragments?.length) {\n const shown = loaded.fragments.slice(0, 5).join(', ')\n const more = loaded.fragments.length > 5 ? `, +${loaded.fragments.length - 5} more` : ''\n ;(opts.info ?? this.ctx.stdout)(\n `info: skipped ${loaded.fragments.length} $ref fragment file(s) matched by the case globs (not cases): ${shown}${more}`,\n )\n }\n\n if (repeatIgnored) {\n await this.warn('--update ignores --repeat: each case runs once while goldens are rewritten.')\n }\n\n if (loaded.cases.length === 0) {\n const filters = [\n opts.tags?.length ? `--tag ${opts.tags.join(',')}` : '',\n opts.excludeTags?.length ? `--exclude-tag ${opts.excludeTags.join(',')}` : '',\n opts.grep ? `--grep ${opts.grep}` : '',\n opts.shard ? `--shard ${opts.shard.index}/${opts.shard.total}` : '',\n ]\n .filter(Boolean)\n .join(' ')\n const message =\n loaded.matched === 0\n ? `No test cases matched globs: ${opts.globs.join(', ')} (from ${this.rootDir}). Check \"globs\" in vibrissa.json or pass --cases <glob>.`\n : `No test cases left after filters (${filters}): ${loaded.matched} case file(s) matched the globs. Check the tag / grep spelling, or loosen the filters (--allow-empty accepts an empty selection).`\n // Said once: an error (stderr, exit 1) when it fails the run, a warning under allowEmpty.\n if (opts.allowEmpty) await this.warn(message)\n else this.ctx.stderr(`error: ${message}`)\n return this.finish(startedAt, opts.allowEmpty, repeat)\n }\n\n for (const server of servers) {\n if (this.stopped) break\n await this.runServer(\n server,\n runs.filter((run) => run.ref.server === server),\n )\n }\n\n if (opts.baseline) await this.applyBaseline(opts.baseline)\n return this.finish(startedAt, undefined, repeat)\n }\n\n private orderServers(names: string[]): string[] {\n const unique = [...new Set(names)]\n const preferred = this.options.defaultServer\n return unique.sort((a, b) =>\n a === preferred ? -1 : b === preferred ? 1 : a < b ? -1 : a > b ? 1 : 0,\n )\n }\n\n // -------------------------------------------------------------------------\n // Per server\n // -------------------------------------------------------------------------\n\n private async startWorker(worker: Worker): Promise<void> {\n worker.session = undefined\n worker.startError = undefined\n try {\n worker.session = await McpSession.start(worker.config, {\n timeoutMs: this.options.timeoutMs,\n stderr: this.options.serverStderr ?? 'capture',\n transcript: (entry) => {\n worker.trace?.push(entry)\n },\n })\n const started = this.sessionsByServer.get(worker.server) ?? []\n started.push(worker.session)\n this.sessionsByServer.set(worker.server, started)\n } catch (err) {\n worker.startError = err instanceof Error ? err : new Error(String(err))\n if (err instanceof SessionStartError && err.code === 'config') this.fatal ??= err\n }\n }\n\n private async runServer(server: string, runs: CaseRun[]): Promise<void> {\n const opts = this.options\n const runnable = runs.filter((run) => !run.loaded.error && !run.loaded.skip)\n const queue = [...runs]\n if (runnable.length === 0) {\n while (queue.length > 0 && !this.stopped) await this.runImmediate(queue.shift() as CaseRun)\n return\n }\n\n const config = resolveServerConfig(opts, server)\n const count = Math.max(1, Math.min(Math.floor(opts.concurrency ?? 1), runnable.length))\n const workers: Worker[] = Array.from({ length: count }, (_, index) => ({\n index,\n server,\n config,\n vars: {},\n }))\n await Promise.all(workers.map((w) => this.startWorker(w)))\n const healthy = workers.filter((w) => w.session)\n const state: ServerState = {}\n\n if (healthy.length === 0) {\n const error = workers[0].startError ?? new Error(`Server \"${server}\" could not start.`)\n await this.warn(`Server \"${server}\" could not start: ${error.message}`)\n while (queue.length > 0 && !this.stopped) {\n await this.runImmediate(queue.shift() as CaseRun, error.message)\n }\n return\n }\n\n const control = healthy[0].session as McpSession\n try {\n const info = await control.discover()\n await this.emit({\n type: 'session:start',\n server,\n era: control.era,\n protocolVersion: control.protocolVersion || info.protocolVersion,\n ...(info.serverInfo\n ? {\n serverInfo: {\n ...(typeof info.serverInfo.name === 'string' ? { name: info.serverInfo.name } : {}),\n ...(typeof info.serverInfo.version === 'string'\n ? { version: info.serverInfo.version }\n : {}),\n },\n }\n : {}),\n })\n } catch (err) {\n await this.emit({\n type: 'session:start',\n server,\n era: control.era,\n protocolVersion: control.protocolVersion,\n })\n await this.warn(`server/discover failed on \"${server}\": ${errorText(err)}`)\n }\n\n const captured = await this.verifyManifest(server, control)\n if (opts.check) await this.runServerChecks(server, control, captured)\n state.tools = await this.toolDefinitions(server, control, captured)\n\n // Suite setup per worker.\n for (const worker of healthy) await this.suiteSetup(worker, state)\n\n await Promise.all(workers.map((worker) => this.workerLoop(worker, queue, state)))\n\n for (const worker of workers) {\n if (worker.session && !worker.session.closed) await this.suiteTeardown(worker, state)\n await worker.session?.close()\n }\n await this.warnStdoutNoise(server)\n await this.emit({ type: 'session:end', server })\n }\n\n /** stdio servers must keep stdout for JSON-RPC: report stray lines (even without --check). */\n private async warnStdoutNoise(server: string): Promise<void> {\n let lines = 0\n const sample: string[] = []\n for (const session of this.sessionsByServer.get(server) ?? []) {\n const noise = noiseOf(session)\n if (!noise) continue\n lines += noise.lines\n sample.push(...noise.sample)\n }\n if (lines === 0) return\n const shown = sample\n .slice(0, 2)\n .map((s) => JSON.stringify(s.length > 80 ? `${s.slice(0, 79)}…` : s))\n .join(', ')\n await this.warn(\n `Server \"${server}\" wrote ${lines} non-JSON-RPC line(s) to stdout${shown ? ` (e.g. ${shown})` : ''}. On stdio, stdout must carry only JSON-RPC: log to stderr instead (vib check: spec/stdout-clean).`,\n )\n }\n\n private async toolDefinitions(\n server: string,\n session: McpSession,\n captured: CapturedManifest | undefined,\n ): Promise<Map<string, ToolSummary>> {\n try {\n const tools = captured?.toolsListSamples[0] ?? (await session.listTools())\n return new Map(tools.map((tool) => [tool.name, tool]))\n } catch (err) {\n await this.warn(\n `tools/list failed on \"${server}\" (${errorText(err)}): outputSchema enforcement is off for this run.`,\n )\n return new Map()\n }\n }\n\n private async suiteSetup(worker: Worker, state: ServerState): Promise<void> {\n const setup = this.options.hooks?.setup\n if (!setup?.length || !worker.session) return\n const execution = await executeCase(\n { name: 'suite setup', steps: setup },\n this.executeContext(worker, state, 'off'),\n )\n for (const warning of execution.warnings) await this.warn(warning)\n if (execution.outcome.status === 'failed') {\n worker.startError = new Error(`Suite setup failed: ${execution.outcome.reason}`)\n await worker.session.close()\n worker.session = undefined\n await this.warn(`hooks.setup failed on \"${worker.server}\": ${execution.outcome.reason}`)\n return\n }\n worker.vars = execution.vars\n }\n\n private async suiteTeardown(worker: Worker, state: ServerState): Promise<void> {\n const teardown = this.options.hooks?.teardown\n if (!teardown?.length || !worker.session) return\n const execution = await executeCase(\n { name: 'suite teardown', steps: teardown },\n this.executeContext(worker, state, 'off'),\n )\n if (execution.outcome.status === 'failed') {\n await this.warn(`hooks.teardown failed on \"${worker.server}\": ${execution.outcome.reason}`)\n }\n }\n\n private executeContext(\n worker: Worker,\n state: ServerState,\n update: ExecuteContext['update'],\n loaded?: LoadedCase,\n ref?: CaseRef,\n ): ExecuteContext {\n const opts = this.options\n return {\n session: worker.session as McpSession,\n normalize: opts.normalize ?? DEFAULT_NORMALIZE,\n timeoutMs: opts.timeoutMs,\n budgetMs: opts.budgetMs,\n tools: state.tools,\n vars: worker.vars,\n env: opts.env,\n update,\n source: loaded?.source,\n caseId: ref ? baseCaseId(ref.id) : undefined,\n ...(ref\n ? {\n onStepStart: (step: StepRef) => this.emit({ type: 'step:start', case: ref, step }),\n onStepEnd: (step: StepRef, result) =>\n this.emit({ type: 'step:end', case: ref, step, ...result }),\n }\n : {}),\n }\n }\n\n private async workerLoop(worker: Worker, queue: CaseRun[], state: ServerState): Promise<void> {\n while (!this.stopped) {\n const run = queue.shift()\n if (!run) return\n if (run.loaded.error || run.loaded.skip) {\n await this.runImmediate(run)\n continue\n }\n if (!worker.session || worker.session.closed) {\n if (worker.session) await worker.session.close()\n await this.startWorker(worker)\n if (worker.session) await this.suiteSetup(worker, state)\n }\n if (!worker.session) {\n await this.runImmediate(\n run,\n `Server \"${worker.server}\" is not running: ${worker.startError?.message ?? 'unknown error'}`,\n )\n continue\n }\n await this.runCase(worker, run, state)\n }\n }\n\n /** Emit a case that needs no session: load errors, skips, or a dead server. */\n private async runImmediate(run: CaseRun, serverError?: string): Promise<void> {\n await this.emit({ type: 'case:start', case: run.ref })\n let outcome: CaseOutcome\n if (run.loaded.error) {\n outcome = {\n status: 'failed',\n durationMs: 0,\n errorKind: 'load',\n reason: run.loaded.error,\n ...(this.options.update || this.options.updateAll\n ? { updateSkipped: { reason: 'the case did not load; fix the file first' } }\n : {}),\n }\n } else if (run.loaded.skip) {\n outcome = { status: 'skipped', durationMs: 0, reason: run.loaded.skip }\n } else {\n outcome = {\n status: 'failed',\n durationMs: 0,\n errorKind: 'error',\n reason: serverError ?? 'Server unavailable.',\n }\n }\n await this.emit({ type: 'case:end', case: run.ref, outcome })\n if (outcome.status === 'failed' && this.options.failFast) this.stopped = true\n }\n\n private async runCase(worker: Worker, run: CaseRun, state: ServerState): Promise<void> {\n const opts = this.options\n const { loaded, ref } = run\n await this.emit({ type: 'case:start', case: ref })\n const update: ExecuteContext['update'] =\n opts.update || opts.updateAll ? (opts.updateAll ? 'all' : 'failing') : 'off'\n const cannotRewrite =\n loaded.text !== undefined && caseFileHasComments(loaded.text)\n ? 'the file has comments that a rewrite would drop; edit it by hand'\n : undefined\n worker.trace = []\n const execution = await executeCase(loaded.data as TestCase, {\n ...this.executeContext(worker, state, update, loaded, ref),\n ...(cannotRewrite ? { cannotRewrite } : {}),\n })\n if (update !== 'off' && execution.outcome.updateSkipped) {\n await this.warn(`Not updating ${loaded.ref.id}: ${execution.outcome.updateSkipped.reason}.`)\n }\n const trace = worker.trace\n worker.trace = undefined\n for (const warning of execution.warnings) await this.warn(warning)\n\n const outcome = execution.outcome\n if (execution.updates.length > 0) {\n try {\n applyUpdates(loaded, execution.updates)\n } catch (err) {\n outcome.status = 'failed'\n outcome.errorKind = 'error'\n outcome.reason = `Could not write the updated golden to ${loaded.ref.id}: ${errorText(err)}.`\n }\n }\n if (opts.trace || outcome.status === 'failed') {\n Object.assign(outcome, this.writeTrace(ref, trace ?? []))\n }\n await this.emit({ type: 'case:end', case: ref, outcome })\n if (outcome.status === 'failed' && opts.failFast) this.stopped = true\n }\n\n private writeTrace(\n ref: CaseRef,\n entries: TranscriptEntry[],\n ): { tracePath?: string; stderrPath?: string } {\n const base = path.join(\n resolveOutDir(this.rootDir, this.ctx.outDir),\n 'traces',\n traceName(ref.id),\n )\n const out: { tracePath?: string; stderrPath?: string } = {}\n try {\n fs.mkdirSync(path.dirname(base), { recursive: true })\n const messages = entries.filter((e) => e.dir !== 'stderr')\n const tracePath = `${base}.ndjson`\n fs.writeFileSync(\n tracePath,\n messages.map((e) => JSON.stringify(e)).join('\\n') + (messages.length ? '\\n' : ''),\n 'utf8',\n )\n out.tracePath = tracePath\n const stderr = entries\n .filter((e) => e.dir === 'stderr')\n .map((e) => e.text ?? '')\n .join('')\n const stderrPath = `${base}.stderr.txt`\n if (stderr) {\n fs.writeFileSync(stderrPath, stderr, 'utf8')\n out.stderrPath = stderrPath\n } else if (fs.existsSync(stderrPath)) {\n fs.rmSync(stderrPath)\n }\n } catch (err) {\n void this.warn(`Could not write the trace for ${ref.id}: ${errorText(err)}`)\n }\n return out\n }\n\n // -------------------------------------------------------------------------\n // Manifest lock & checks\n // -------------------------------------------------------------------------\n\n private async verifyManifest(\n server: string,\n session: McpSession,\n ): Promise<CapturedManifest | undefined> {\n const opts = this.options\n const lock = opts.lockManifest !== false\n const file = manifestPathFor({ ...opts, rootDir: this.rootDir }, server)\n const exists = lock && fs.existsSync(file)\n if (!exists && !opts.check && !(lock && opts.updateManifest)) {\n if (lock) await this.missingLock(server, file)\n return undefined\n }\n\n let captured: CapturedManifest\n try {\n captured = await captureManifest(session, { toolsListSamples: opts.check ? 2 : 1 })\n } catch (err) {\n if (exists) {\n this.manifests.push({ server, path: file, status: 'error', summary: errorText(err) })\n await this.emit({\n type: 'manifest:diff',\n path: file,\n server,\n summary: `could not build the live manifest: ${errorText(err)}`,\n diff: { error: errorText(err) },\n })\n } else {\n await this.warn(`Could not build the live manifest for \"${server}\": ${errorText(err)}`)\n }\n return undefined\n }\n if (!lock) return captured\n\n if (!exists) {\n if (opts.updateManifest) {\n writeManifest(file, captured.manifest)\n this.manifests.push({ server, path: file, status: 'created' })\n await this.warn(\n `Manifest lock created at ${path.relative(this.rootDir, file).replace(/\\\\/g, '/')}. Commit it.`,\n )\n await this.emit({ type: 'manifest:ok', path: file, server })\n } else {\n await this.missingLock(server, file)\n }\n return captured\n }\n\n let diff: ManifestDiff\n try {\n diff = diffManifest(readManifest(file), captured.manifest, {\n ignore: opts.manifestIgnore ?? DEFAULT_MANIFEST_IGNORE,\n })\n } catch (err) {\n this.manifests.push({ server, path: file, status: 'error', summary: errorText(err) })\n await this.emit({\n type: 'manifest:diff',\n path: file,\n server,\n summary: errorText(err),\n diff: { error: errorText(err) },\n })\n return captured\n }\n if (diff.identical) {\n this.manifests.push({ server, path: file, status: 'ok', diff })\n await this.emit({ type: 'manifest:ok', path: file, server })\n } else if (opts.updateManifest) {\n writeManifest(file, captured.manifest)\n const summary = summarizeDiff(diff)\n this.manifests.push({ server, path: file, status: 'updated', diff, summary })\n await this.warn(\n `Manifest lock updated at ${path.relative(this.rootDir, file).replace(/\\\\/g, '/')}: ${summary}. Review and commit it.`,\n )\n await this.emit({ type: 'manifest:ok', path: file, server })\n } else {\n const summary = summarizeDiff(diff)\n this.manifests.push({ server, path: file, status: 'diff', diff, summary })\n // First line: the one-liner; then the rendered drift; then what to do about it.\n const body = formatDiff(diff).split('\\n').slice(1)\n const record = `vib manifest record${this.serverFlag(server)}`\n await this.emit({\n type: 'manifest:diff',\n path: file,\n server,\n summary: [\n summary,\n ...body,\n `Review the change, then accept it with --update-manifest (or \"${record}\").`,\n ].join('\\n'),\n diff: diff as unknown as JsonValue,\n })\n }\n return captured\n }\n\n /** ` --server <name>` for non-default servers (CLI hints). */\n private serverFlag(server: string): string {\n return server === this.options.defaultServer ? '' : ` --server ${server}`\n }\n\n private async missingLock(server: string, file: string): Promise<void> {\n const opts = this.options\n const shown = path.relative(this.rootDir, file).replace(/\\\\/g, '/') || file\n const record = `vib manifest record${this.serverFlag(server)}`\n const who = server === opts.defaultServer ? '' : ` for server \"${server}\"`\n if (opts.requireManifest) {\n const summary = `No manifest lock at ${shown}${who}, and requireManifest is on. Record it with \"${record}\" (or vib run --update-manifest), review it, and commit it.`\n this.manifests.push({ server, path: file, status: 'missing-required', summary })\n await this.emit({\n type: 'manifest:diff',\n path: file,\n server,\n summary,\n diff: { error: 'missing', errorKind: 'load', path: shown },\n })\n return\n }\n this.manifests.push({ server, path: file, status: 'missing' })\n await this.warn(\n `No manifest lock at ${shown}${who}. Run \"${record}\" (or vib run --update-manifest) to pin tools, schemas and descriptions; vib run then fails on drift.`,\n )\n }\n\n private async runServerChecks(\n server: string,\n session: McpSession,\n captured: CapturedManifest | undefined,\n ): Promise<void> {\n let data = captured\n if (!data) {\n try {\n data = await captureManifest(session, { toolsListSamples: 2 })\n } catch (err) {\n await this.emit({\n type: 'check',\n outcome: {\n id: 'spec/manifest',\n server,\n title: 'Server manifest can be listed',\n status: 'failed',\n detail: errorText(err),\n },\n })\n return\n }\n }\n const config = resolveServerConfig(this.options, server)\n const noise = noiseOf(session)\n const outcomes = runChecks(\n {\n ...data.manifest,\n transport: isHttpServerConfig(config) ? 'http' : 'stdio',\n ...(noise ? { stdoutNoise: noise } : {}),\n },\n {\n toolsListSamples: data.toolsListSamples,\n allow: this.options.checks?.allow,\n severity: this.options.checks?.severity,\n },\n )\n for (const outcome of outcomes) {\n await this.emit({ type: 'check', outcome: { ...outcome, server } })\n }\n }\n\n // -------------------------------------------------------------------------\n // Baseline (delta gating)\n // -------------------------------------------------------------------------\n\n private async applyBaseline(file: string): Promise<void> {\n const abs = path.isAbsolute(file) ? file : path.resolve(this.rootDir, file)\n let report: JsonReport\n try {\n report = JSON.parse(fs.readFileSync(abs, 'utf8')) as JsonReport\n if (!Array.isArray(report.cases)) throw new Error('no \"cases\" array')\n } catch (err) {\n await this.warn(\n `Baseline not usable at ${file}: ${errorText(err)}. Gating on absolute results instead; write one with --reporter json (reports/results.json).`,\n )\n return\n }\n const before = new Map<string, BaselineCase>()\n const runs = new Map<string, { failed: number; total: number; ms: number }>()\n for (const c of report.cases) {\n if (c.status === 'skipped') continue\n const id = c.caseId ?? baseCaseId(c.id)\n const entry = runs.get(id) ?? { failed: 0, total: 0, ms: 0 }\n entry.total++\n entry.ms += c.durationMs ?? 0\n if (c.status === 'failed') entry.failed++\n runs.set(id, entry)\n }\n for (const [id, entry] of runs) {\n before.set(id, { failed: entry.failed > 0, durationMs: entry.ms / entry.total })\n }\n\n const pct = this.options.baselineLatencyPct ?? DEFAULT_BASELINE_LATENCY_PCT\n const floor = this.options.baselineLatencyMinMs ?? DEFAULT_BASELINE_LATENCY_MIN_MS\n const verdicts = this.caseVerdicts()\n const regressions: string[] = []\n const known: string[] = []\n for (const [id, verdict] of verdicts) {\n const prior = before.get(id)\n if (!verdict.ok) {\n if (prior?.failed) known.push(id)\n else {\n regressions.push(`${id}: newly failing${prior ? '' : ' (not in the baseline)'}`)\n this.baselineFailures.add(id)\n }\n continue\n }\n if (prior && !prior.failed && prior.durationMs > 0) {\n const limit = prior.durationMs * (1 + pct / 100)\n if (verdict.durationMs > limit && verdict.durationMs - prior.durationMs >= floor) {\n regressions.push(\n `${id}: slower, ${Math.round(verdict.durationMs)}ms vs ${Math.round(prior.durationMs)}ms in the baseline (+${Math.round((verdict.durationMs / prior.durationMs - 1) * 100)}%, limit +${pct}%)`,\n )\n this.baselineFailures.add(id)\n }\n }\n }\n this.baselineActive = true\n if (known.length > 0) {\n await this.warn(\n `Baseline: ${known.length} case(s) still failing, as in ${file} (not gated): ${known.slice(0, 5).join(', ')}${known.length > 5 ? ', ...' : ''}`,\n )\n }\n await this.emit({\n type: 'check',\n outcome: {\n id: 'baseline/regressions',\n title:\n regressions.length > 0\n ? `Baseline: ${regressions.length} regression(s) vs ${file}`\n : `Baseline: no regressions vs ${file}`,\n status: regressions.length > 0 ? 'failed' : 'passed',\n ...(regressions.length > 0 ? { detail: regressions.join('\\n') } : {}),\n },\n })\n }\n\n // -------------------------------------------------------------------------\n // Verdict\n // -------------------------------------------------------------------------\n\n private caseVerdicts(): Map<string, { ok: boolean; rate: number; durationMs: number }> {\n const floor = this.options.flakyFloor ?? DEFAULT_FLAKY_FLOOR\n const groups = new Map<string, { runs: number; passes: number; ms: number }>()\n for (const { ref, outcome } of this.results) {\n if (outcome.status === 'skipped') continue\n const id = baseCaseId(ref.id)\n const entry = groups.get(id) ?? { runs: 0, passes: 0, ms: 0 }\n entry.runs++\n entry.ms += outcome.durationMs\n if (outcome.status === 'passed' || outcome.status === 'updated') entry.passes++\n groups.set(id, entry)\n }\n const out = new Map<string, { ok: boolean; rate: number; durationMs: number }>()\n for (const [id, entry] of groups) {\n const rate = entry.passes / entry.runs\n const ok = rate === 1 || (this.flakyIds.has(id) && rate >= floor)\n out.set(id, { ok, rate, durationMs: entry.ms / entry.runs })\n }\n return out\n }\n\n private async finish(\n startedAt: number,\n forcedOk: boolean | undefined,\n repeat: number,\n ): Promise<RunResult> {\n const verdicts = this.caseVerdicts()\n // Per execution: with --repeat the status counts sum to `runs` (= total); the per-case\n // verdict (flaky floors) lives in passRates and run:end.ok. Reporters derive the number\n // of distinct cases from the case ids.\n const counts: Record<CaseStatus, number> = { passed: 0, failed: 0, skipped: 0, updated: 0 }\n for (const { outcome } of this.results) counts[outcome.status]++\n const summary: RunSummary = {\n total: this.results.length,\n ...counts,\n durationMs: Date.now() - startedAt,\n }\n if (repeat > 1) {\n summary.runs = this.results.length\n summary.passRates = Object.fromEntries(\n [...verdicts.entries()].sort(([a], [b]) => (a < b ? -1 : 1)).map(([id, v]) => [id, v.rate]),\n )\n }\n let ok: boolean\n if (forcedOk !== undefined) ok = forcedOk\n else {\n const casesOk = this.baselineActive\n ? this.baselineFailures.size === 0\n : [...verdicts.values()].every((v) => v.ok)\n const checksOk = this.checks.every((c) => c.status !== 'failed')\n const manifestsOk = this.manifests.every(\n (m) => m.status !== 'diff' && m.status !== 'error' && m.status !== 'missing-required',\n )\n ok = casesOk && checksOk && manifestsOk && !this.fatal\n }\n await this.emit({ type: 'run:end', summary, ok })\n return {\n exitCode: this.fatal ? 2 : ok ? 0 : 1,\n ok,\n summary,\n cases: [...this.results],\n checks: [...this.checks],\n manifests: [...this.manifests],\n warnings: [...this.warnings],\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Convenience\n// ---------------------------------------------------------------------------\n\n/** v1-compatible partial options: `server` (singular) is sugar for `servers.default`. */\nexport type RunCasesInput = Partial<RunnerOptions> & { server?: ServerConfig }\n\n/** Fill defaults (and map v1 `server` → `servers.default`). */\nexport function resolveRunnerOptions(input: RunCasesInput = {}): RunnerOptions {\n const { server, ...rest } = input\n const servers = rest.servers ?? (server ? { default: server } : defaultRunOptions.servers)\n const defaultServer =\n rest.defaultServer ?? (server || !rest.servers ? 'default' : Object.keys(servers)[0])\n return {\n ...defaultRunOptions,\n ...rest,\n servers,\n defaultServer,\n normalize: { ...DEFAULT_NORMALIZE, ...(rest.normalize ?? {}) },\n globs: rest.globs ?? defaultRunOptions.globs,\n reporters: rest.reporters ?? defaultRunOptions.reporters,\n rootDir: rest.rootDir ?? process.cwd(),\n }\n}\n\n/** Run cases and resolve to the exit code (0 ok, 1 failures, 2 configuration error). */\nexport async function runCases(options: RunCasesInput = {}): Promise<number> {\n return new Runner(resolveRunnerOptions(options)).run()\n}\n"],"mappings":";AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAiBV,IAAM,aAAN,cAAyB,MAAM;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,UAA2B,CAAC,GAAG;AAC1D,UAAM,QAAQ,OAAO,GAAG,OAAO,IAAI,QAAQ,IAAI,KAAK,OAAO;AAC3D,SAAK,OAAO;AACZ,SAAK,OAAO,QAAQ,QAAQ;AAC5B,SAAK,SAAS;AACd,QAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,QAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AAAA,EACxC;AACF;AAMO,IAAM,cAAc,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,SAAS,MAAgB,MAAkC;AACzE,QAAM,QAAQ,KAAK,QAAQ,IAAI;AAC/B,MAAI,UAAU,GAAI,QAAO;AACzB,SAAO,KAAK,QAAQ,CAAC;AACvB;AAEO,SAAS,QAAQ,MAAgB,MAAuB;AAC7D,SAAO,KAAK,SAAS,IAAI;AAC3B;AAEO,SAAS,aAAa,MAAgB,MAAwB;AACnE,QAAM,SAAmB,CAAC;AAC1B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAI,KAAK,CAAC,MAAM,QAAQ,KAAK,IAAI,CAAC,MAAM,QAAW;AACjD,aAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AACvB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,iBAAiB,MAAgB,MAAkC;AACjF,QAAM,QAAQ,KAAK,QAAQ,IAAI;AAC/B,MAAI,UAAU,GAAI,QAAO;AACzB,QAAM,OAAO,KAAK,QAAQ,CAAC;AAC3B,MAAI,SAAS,UAAa,KAAK,WAAW,IAAI,EAAG,QAAO;AACxD,SAAO;AACT;AAGO,SAAS,eACd,MACA,MACA,EAAE,MAAM,GAAG,UAAU,MAAM,IAAyC,CAAC,GACjD;AACpB,QAAM,MAAM,SAAS,MAAM,IAAI;AAC/B,MAAI,QAAQ,OAAW,QAAO;AAC9B,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,OAAQ,WAAW,CAAC,OAAO,UAAU,KAAK,GAAI;AACnF,UAAM,IAAI;AAAA,MACR,WAAW,IAAI,WAAW,GAAG,eAAe,UAAU,eAAe,UAAU,OAAO,GAAG,cAAc,IAAI,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,GAAI,CAAC;AAAA,IACnJ;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,kBAAkB,MAAsC;AACtE,QAAM,OAAO,KAAK,QAAQ,IAAI;AAC9B,MAAI,SAAS,GAAI,QAAO,CAAC,MAAM,CAAC,CAAC;AACjC,SAAO,CAAC,KAAK,MAAM,GAAG,IAAI,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC;AACnD;AAMO,SAAS,YACd,MACA,aAAkC,aACxB;AACV,QAAM,MAAgB,CAAC;AACvB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,UAAU,KAAM;AACpB,QAAI,MAAM,WAAW,IAAI,GAAG;AAC1B,UAAI,WAAW,IAAI,KAAK,EAAG;AAC3B;AAAA,IACF;AACA,QAAI,UAAU,KAAM;AACpB,QAAI,KAAK,KAAK;AAAA,EAChB;AACA,SAAO;AACT;AAGO,SAAS,cACd,MACA,aAAkC,aACxB;AACV,QAAM,MAAgB,CAAC;AACvB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,UAAU,MAAM;AAClB,UAAI,KAAK,GAAG,KAAK,MAAM,CAAC,CAAC;AACzB;AAAA,IACF;AACA,UAAM,KAAK,MAAM,QAAQ,GAAG;AAC5B,QAAI,MAAM,WAAW,IAAI,KAAK,KAAK,KAAK,WAAW,IAAI,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG;AAC1E,UAAI,KAAK,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,MAAM,KAAK,CAAC,CAAC;AAChD;AAAA,IACF;AACA,QAAI,KAAK,KAAK;AAAA,EAChB;AACA,SAAO;AACT;AAGO,SAAS,WACd,MACA,aAAkC,aACxB;AACV,QAAM,MAAgB,CAAC;AACvB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,UAAU,KAAM;AACpB,QAAI,CAAC,MAAM,WAAW,IAAI,EAAG;AAC7B,QAAI,KAAK,KAAK;AACd,QAAI,WAAW,IAAI,KAAK,EAAG;AAAA,EAC7B;AACA,SAAO;AACT;AAOO,SAAS,iBACd,MACA,UACA,SACA,aAAkC,aAC5B;AACN,QAAM,QAAQ,oBAAI,IAAI,CAAC,GAAG,UAAU,UAAU,UAAU,WAAW,CAAC;AACpE,aAAW,QAAQ,WAAW,MAAM,UAAU,GAAG;AAC/C,QAAI,MAAM,IAAI,IAAI,EAAG;AACrB,UAAM,mBAAmB,MAAM,OAAO,OAAO;AAAA,EAC/C;AACF;AAEO,SAAS,mBACd,MACA,UACA,SACY;AACZ,QAAM,aAAa,QAAQ,MAAM,CAAC,GAAG,QAAQ,CAAC;AAC9C,SAAO,IAAI,WAAW,kBAAkB,IAAI,YAAY,OAAO,KAAK;AAAA,IAClE,MAAM;AAAA,IACN,MAAM,GAAG,aAAa,gBAAgB,UAAU,OAAO,EAAE,WAAW,OAAO;AAAA,IAC3E,MAAM,CAAC,OAAO,OAAO,SAAS;AAAA,EAChC,CAAC;AACH;AAMO,SAAS,iBACd,MACA,MACA,WACA,aACY;AACZ,QAAM,aAAa,QAAQ,MAAM,SAAS;AAC1C,QAAM,QAAQ,UAAU,MAAM,GAAG,EAAE;AACnC,QAAM,OACJ,UAAU,SAAS,MAAM,SAAS,aAAQ,UAAU,SAAS,MAAM,MAAM,WAAW;AACtF,QAAM,OAAO,UAAU,SACnB,cAAc,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,MACrC,uBAAuB,IAAI;AAC/B,SAAO,IAAI,WAAW,WAAW,IAAI,KAAK,IAAI,qBAAqB;AAAA,IACjE,MAAM,WAAW,KAAK,QAAQ,QAAQ,GAAG,CAAC;AAAA,IAC1C,MAAM,GAAG,aAAa,iBAAiB,UAAU,QAAQ,EAAE,GAAG,IAAI;AAAA,IAClE,GAAI,cAAc,EAAE,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC;AAAA,EAC/C,CAAC;AACH;AAGO,SAAS,QAAQ,OAAe,YAAmD;AACxF,MAAI;AACJ,MAAI,YAAY,OAAO;AACvB,aAAW,aAAa,YAAY;AAClC,UAAM,QAAQ,aAAa,MAAM,YAAY,GAAG,UAAU,YAAY,CAAC;AACvE,QAAI,QAAQ,WAAW;AACrB,kBAAY;AACZ,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,SAAS,OAAW,QAAO;AAC/B,SAAO,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,OAAO;AACzE;AAEA,SAAS,aAAa,GAAW,GAAmB;AAClD,QAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC;AAC5D,WAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,QAAI,OAAO,IAAI,CAAC;AAChB,QAAI,CAAC,IAAI;AACT,aAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,YAAM,MAAM,IAAI,CAAC;AACjB,UAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;AACpF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,IAAI,EAAE,MAAM;AACrB;AAEO,SAAS,iBAAiB,OAAgD;AAC/E,QAAM,SAAmB,CAAC;AAC1B,MAAI,UAAU;AACd,MAAIA,SAA0B;AAC9B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,KAAK,MAAM,CAAC;AAClB,QAAIA,QAAO;AACT,UAAI,OAAOA,OAAO,CAAAA,SAAQ;AAAA,UACrB,YAAW;AAChB;AAAA,IACF;AACA,QAAI,OAAO,OAAO,OAAO,KAAK;AAC5B,MAAAA,SAAQ;AACR;AAAA,IACF;AACA,QAAI,KAAK,KAAK,EAAE,GAAG;AACjB,UAAI,SAAS;AACX,eAAO,KAAK,OAAO;AACnB,kBAAU;AAAA,MACZ;AACA;AAAA,IACF;AACA,eAAW;AAAA,EACb;AACA,MAAI,QAAS,QAAO,KAAK,OAAO;AAChC,MAAI,OAAO,WAAW,EAAG,OAAM,IAAI,MAAM,wBAAwB;AACjE,SAAO,EAAE,KAAK,OAAO,CAAC,GAAG,MAAM,OAAO,MAAM,CAAC,EAAE;AACjD;AAEO,SAAS,cAAc,OAAyC;AACrE,QAAM,MAA8B,CAAC;AACrC,aAAW,QAAQ,OAAO;AACxB,UAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,QAAI,MAAM;AACR,YAAM,IAAI,WAAW,wBAAwB,IAAI,2BAA2B;AAAA,QAC1E,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AACH,QAAI,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI,KAAK,MAAM,KAAK,CAAC;AAAA,EAC5C;AACA,SAAO;AACT;AAEO,SAAS,cAAc,KAAwB;AACpD,MAAI,QAAQ,OAAQ,QAAO;AAC3B,MAAI,QAAQ,QAAS,QAAO;AAC5B,MAAI,QAAQ,OAAQ,QAAO;AAC3B,MAAI,kBAAkB,KAAK,GAAG,EAAG,QAAO,OAAO,GAAG;AAClD,MACG,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,KACvC,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,KACvC,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,GACxC;AACA,QAAI;AACF,aAAO,KAAK,MAAM,GAAG;AAAA,IACvB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,cAAc,MAA2C;AACvE,QAAMC,QAAO,SAAS,MAAM,QAAQ;AACpC,QAAM,QAAQ,aAAa,MAAM,OAAO;AACxC,MAAI,OAAkC,CAAC;AACvC,MAAIA,UAAS,QAAW;AACtB,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAMA,KAAI;AAAA,IAC1B,SAAS,KAAK;AACZ,YAAM,IAAI;AAAA,QACR,wBAAwB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QACxE;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,GAAG;AAC1E,YAAM,IAAI,WAAW,iCAAiC;AAAA,QACpD,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,WAAO,EAAE,GAAI,OAAqC;AAAA,EACpD;AACA,aAAW,QAAQ,OAAO;AACxB,UAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,QAAI,MAAM;AACR,YAAM,IAAI,WAAW,wBAAwB,IAAI,2BAA2B;AAAA,QAC1E,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AACH,SAAK,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI,cAAc,KAAK,MAAM,KAAK,CAAC,CAAC;AAAA,EAC5D;AACA,SAAO;AACT;AAGO,SAAS,cAAc,MAA4D;AACxF,QAAM,MAAiC,CAAC;AACxC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,QAAI,GAAG,IAAI,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;AAAA,EACrE;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,KAAa,MAAc,SAA4C;AAC9F,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,SAAS,KAAK;AACZ,UAAM,IAAI;AAAA,MACR,WAAW,IAAI,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,cAAc,IAAI,KAAK,OAAO;AAAA,IACzG;AAAA,EACF;AACA,MAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,GAAG;AAC1E,UAAM,IAAI,WAAW,WAAW,IAAI,sCAAsC,IAAI,KAAK,OAAO,IAAI;AAAA,EAChG;AACA,SAAO;AACT;AAEA,IAAM,kBAAkB;AAMjB,SAAS,aAAa,MAAuD;AAClF,QAAM,OAAO,aAAa,MAAM,WAAW;AAC3C,QAAM,QAAQ,aAAa,MAAM,eAAe;AAChD,MAAI,KAAK,WAAW,KAAK,MAAM,WAAW,EAAG,QAAO;AACpD,QAAM,MAAiC,CAAC;AACxC,aAAW,OAAO,KAAM,QAAO,OAAO,KAAK,gBAAgB,KAAK,aAAa,eAAe,CAAC;AAC7F,aAAW,QAAQ,OAAO;AACxB,UAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,QAAI,MAAM,GAAG;AACX,YAAM,IAAI;AAAA,QACR,gCAAgC,IAAI;AAAA,MACtC;AAAA,IACF;AACA,UAAM,MAAM,KAAK,MAAM,KAAK,CAAC;AAC7B,QAAI;AACJ,QAAI;AACF,cAAQ,KAAK,MAAM,GAAG;AAAA,IACxB,SAAS,KAAK;AACZ,YAAM,IAAI;AAAA,QACR,kCAAkC,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MAC1G;AAAA,IACF;AACA,QAAI,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI;AAAA,EAC3B;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,OAAuB;AACxD,SAAO,KAAK,WAAW,KAAK,IAAI,QAAQ,KAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK;AAC3E;AAEA,IAAI,YAA2C;AAGxC,SAAS,aAAa,OAA4C;AACvE,cAAY;AACd;AAGO,SAAS,UAAU,OAAsB;AAC9C,QAAM,UAAU,cAAc,aAAc,cAAc,UAAU,CAAC,QAAQ,OAAO;AACpF,UAAQ,IAAI,UAAU,KAAK,UAAU,KAAK,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC9E;AAGO,SAAS,WAAc,OAAa;AACzC,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,CAAC,MAAM,WAAW,CAAC,CAAC;AAC/D,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,UAAU,UAAc,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,EAAI;AACzE,QAAI,GAAG,IAAI,WAAW,KAAK;AAAA,EAC7B;AACA,SAAO;AACT;AAGO,SAAS,YAAY,MAA6C,MAAM,IAAY;AACzF,QAAM,QAAQ,OAAO,QAAQ,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC7D,UAAM,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;AACrE,WAAO,GAAG,GAAG,IAAI,KAAK,SAAS,KAAK,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,WAAM,IAAI;AAAA,EACpE,CAAC;AACD,QAAM,SAAS,MAAM,KAAK,GAAG;AAC7B,SAAO,OAAO,SAAS,MAAM,GAAG,OAAO,MAAM,GAAG,MAAM,CAAC,CAAC,WAAM;AAChE;AAMO,SAAS,YAAY,OAAkD;AAC5E,QAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC,KAAK,+BAA+B;AAAA,IACpF;AAAA,IACA;AAAA,EACF;AACA,QAAM,WAAW,KAAK,MAAM,GAAG;AAC/B,QAAM,MAAgB,CAAC;AACvB,aAAWC,YAAW,SAAS,MAAM,GAAG,EAAE,GAAG;AAC3C,QAAI,eAAe,KAAKA,QAAO,EAAG;AAClC,QAAI,KAAKA,QAAO;AAAA,EAClB;AACA,QAAM,OAAO,SAAS,SAAS,SAAS,CAAC;AACzC,QAAM,OAAO,KAAK,YAAY,GAAG;AACjC,QAAM,OAAO,SAAS,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACnD,QAAM,SAAS,cAAc,KAAK,IAAI,IAAI,OAAO;AACjD,SAAO,EAAE,KAAK,IAAI,KAAK,GAAG,KAAK,KAAK,OAAO;AAC7C;AAGO,SAAS,WAAW,MAAc,SAAS,KAAK,QAAQ,IAAI,GAAW;AAC5E,MAAI,CAAC,GAAG,WAAW,IAAI,EAAG,QAAO;AACjC,QAAM,OAAO,KAAK,SAAS,MAAM,IAAI,KAAK,MAAM,GAAG,CAAC,OAAO,MAAM,IAAI;AACrE,WAAS,IAAI,KAAK,KAAK;AACrB,UAAM,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,MAAM;AACvC,QAAI,CAAC,GAAG,WAAW,SAAS,EAAG,QAAO;AAAA,EACxC;AACF;AAEO,SAAS,QAAQ,OAAe,MAAM,IAAY;AACvD,SAAO,MACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,GAAG,EACZ,QAAQ,QAAQ,EAAE;AACvB;AAMO,SAAS,aACd,UACA,SACA,YACQ;AACR,QAAM,QAAQ,KAAK,KAAK,SAAS,gBAAgB,UAAU,YAAY,UAAU,UAAU;AAC3F,MAAI,GAAG,WAAW,KAAK,GAAG;AACxB,WAAO,KAAK,SAAS,KAAK,QAAQ,QAAQ,GAAG,KAAK,EAAE,QAAQ,OAAO,GAAG;AAAA,EACxE;AACA,SAAO,4CAA4C,UAAU;AAC/D;AAGO,SAAS,cAAc,MAAc,OAAsB;AAChE,KAAG,UAAU,KAAK,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,KAAG,cAAc,MAAM,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACtE;AAEO,SAAS,YAAY,OAAuB;AACjD,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;;;AC3gBO,IAAM,yBAAoD,OAAO,OAAO;AAAA,EAC7E,WAAW,OAAO,OAAO,CAAC,2BAA2B,CAAC;AAAA,EACtD,UAAU,OAAO,OAAO,CAAC,YAAY,CAAC;AAAA,EACtC,OAAO;AACT,CAAC;AAED,IAAM,WAAW,CAAC,SAAS,YAAY;AAIvC,SAAS,cAAc,OAAqC;AAC1D,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,YAAY,SAAyB;AAC5C,QAAM,OAAO,QACV,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,QAAQ,uBAAuB,MAAM,CAAC,EACzD,KAAK,WAAW;AACnB,SAAO,IAAI,OAAO,IAAI,IAAI,GAAG;AAC/B;AAGO,SAAS,YAAY,SAAiB,KAAsB;AACjE,SAAO,YAAY,OAAO,EAAE,KAAK,GAAG;AACtC;AAMO,SAAS,gBACd,QACA,MAAuB,wBACZ;AACX,QAAM,aAAa,IAAI,aAAa,uBAAuB,WAAW,IAAI,WAAW;AACrF,QAAM,WAAW,IAAI,IAAI,IAAI,YAAY,uBAAuB,QAAQ;AACxE,OAAK,IAAI,SAAS,uBAAuB,WAAW,UAAU;AAC5D,eAAW,OAAO,SAAU,UAAS,IAAI,GAAG;AAAA,EAC9C;AAEA,QAAM,WAAW,UAAU,SAAS,IAAI,cAAc,QAAQ,SAAS,IAAI;AAC3E,MAAI,CAAC,cAAc,QAAQ,KAAK,SAAS,SAAS,EAAG,QAAO;AAC5D,QAAM,MAAkB,CAAC;AACzB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,QAAI,CAAC,SAAS,IAAI,GAAG,EAAG,KAAI,GAAG,IAAI;AAAA,EACrC;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAkB,UAA+B;AACtE,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,CAAC,SAAS,cAAc,MAAM,QAAQ,CAAC;AAClF,MAAI,CAAC,cAAc,KAAK,EAAG,QAAO;AAClC,QAAM,MAAkB,CAAC;AACzB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,QAAQ,WAAW,cAAc,KAAK,GAAG;AAC3C,YAAM,OAAmB,CAAC;AAC1B,UAAI,UAAU;AACd,iBAAW,CAAC,SAAS,SAAS,KAAK,OAAO,QAAQ,KAAK,GAAG;AACxD,YAAI,SAAS,KAAK,CAAC,OAAO,GAAG,KAAK,OAAO,CAAC,EAAG,WAAU;AAAA,YAClD,MAAK,OAAO,IAAI,cAAc,WAAW,QAAQ;AAAA,MACxD;AAEA,UAAI,WAAW,OAAO,KAAK,IAAI,EAAE,WAAW,EAAG;AAC/C,UAAI,GAAG,IAAI;AACX;AAAA,IACF;AACA,QAAI,GAAG,IAAI,cAAc,OAAO,QAAQ;AAAA,EAC1C;AACA,SAAO;AACT;;;AChFA,SAAS,SAAS,OAAoD;AACpE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAGA,SAAS,YAAY,QAA8B;AACjD,MAAI,CAAC,SAAS,MAAM,EAAG,QAAO;AAC9B,MAAI,OAAO,YAAY,OAAW,QAAO,OAAO;AAChD,MAAI,MAAM,QAAQ,OAAO,IAAI,KAAK,OAAO,KAAK,SAAS,EAAG,QAAO,OAAO,KAAK,CAAC;AAC9E,MACE,MAAM,QAAQ,OAAO,KAAK,KAC1B,SAAS,OAAO,MAAM,CAAC,CAAC,KACxB,OAAO,MAAM,CAAC,EAAE,UAAU,QAC1B;AACA,WAAO,OAAO,MAAM,CAAC,EAAE;AAAA,EACzB;AACA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AAAA,IAC/D,KAAK;AACH,aAAO,CAAC;AAAA,IACV,KAAK;AACH,aAAO,CAAC;AAAA,IACV;AACE,aAAO;AAAA,EACX;AACF;AAWO,SAAS,eAAe,UAAgD;AAC7E,QAAM,MAAiC,CAAC;AACxC,QAAMC,WAAU,SAAS,QAAQ,IAAI,OAAO,OAAO,QAAQ,IAAI,CAAC;AAChE,aAAW,SAASA,UAAS;AAC3B,UAAM,UAAU,SAAS,KAAK,IAAI,QAAQ,CAAC;AAC3C,UAAM,SAAS,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS;AACrE,QAAI,CAAC,UAAU,IAAI,MAAM,MAAM,OAAW;AAC1C,UAAM,SAAS,SAAS,QAAQ,MAAM,IAAI,QAAQ,SAAS,CAAC;AAC5D,QAAI,WAAW,sBAAsB;AACnC,YAAM,SAAS,SAAS,OAAO,eAAe,IAAI,OAAO,kBAAkB,CAAC;AAC5E,YAAM,QAAQ,SAAS,OAAO,UAAU,IAAI,OAAO,aAAa,CAAC;AACjE,YAAM,UAAqC,CAAC;AAC5C,iBAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,KAAK,EAAG,SAAQ,IAAI,IAAI,YAAY,IAAI;AAClF,UAAI,MAAM,IAAI,OAAO,SAAS,QAAQ,EAAE,QAAQ,SAAS,IAAI,EAAE,QAAQ,UAAU,QAAQ;AAAA,IAC3F,WAAW,WAAW,0BAA0B;AAC9C,UAAI,MAAM,IAAI,EAAE,MAAM,aAAa,SAAS,EAAE,MAAM,QAAQ,MAAM,MAAM,GAAG,OAAO,WAAW;AAAA,IAC/F,WAAW,WAAW,cAAc;AAClC,UAAI,MAAM,IAAI,EAAE,OAAO,CAAC,EAAE;AAAA,IAC5B,OAAO;AACL,UAAI,MAAM,IAAI,CAAC;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;;;ACtEA,OAAO,sBAAsB;AAW7B,SAAS,eAAe;AACxB;AAAA,EACE;AAAA,EAGA;AAAA,OAEK;AACP,SAAS,OAAO,kBAAkB;AAiC3B,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAC5C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAMA,IAAM,WAAW;AAGV,SAAS,UAAUC,QAAc,KAAqB;AAC3D,MAAI,SAAS,KAAK,GAAG,EAAG,QAAOA,WAAS,KAAK,MAAM,GAAGA,MAAI,IAAI,GAAG;AACjE,SAAO,GAAGA,MAAI,IAAI,KAAK,UAAU,GAAG,CAAC;AACvC;AAGO,SAAS,YAAYA,QAAc,OAAuB;AAC/D,SAAO,GAAGA,MAAI,IAAI,KAAK;AACzB;AAOO,SAAS,mBAAmB,SAAiB,MAAwB;AAC1E,MAAI,YAAY,MAAM,YAAY,IAAK,QAAO;AAC9C,QAAM,WAAW,QACd,QAAQ,MAAM,EAAE,EAChB,MAAM,GAAG,EACT,MAAM,CAAC,EACP,IAAI,CAACC,aAAYA,SAAQ,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,CAAC;AACnE,MAAID,SAAO;AACX,MAAI,OAAgB;AACpB,MAAI,QAAQ,SAAS;AACrB,aAAWC,YAAW,UAAU;AAC9B,UAAM,UAAU,iBAAiB,KAAKA,QAAO;AAC7C,QAAI,SAAS,MAAM,QAAQ,IAAI,GAAG;AAChC,MAAAD,SAAO,YAAYA,QAAM,OAAOC,QAAO,CAAC;AACxC,aAAO,KAAK,OAAOA,QAAO,CAAC;AAAA,IAC7B,WAAW,SAAS,SAAS,QAAQ,OAAO,SAAS,UAAU;AAC7D,MAAAD,SAAO,UAAUA,QAAMC,QAAO;AAC9B,aAAQ,KAAiCA,QAAO;AAAA,IAClD,OAAO;AACL,cAAQ;AACR,MAAAD,SAAO,UAAU,YAAYA,QAAM,OAAOC,QAAO,CAAC,IAAI,UAAUD,QAAMC,QAAO;AAAA,IAC/E;AAAA,EACF;AACA,SAAOD;AACT;AAEA,SAAS,eAAe,MAAe,SAA0B;AAC/D,MAAI,YAAY,GAAI,QAAO;AAC3B,MAAI,OAAgB;AACpB,aAAW,OAAO,QAAQ,MAAM,GAAG,EAAE,MAAM,CAAC,GAAG;AAC7C,UAAMC,WAAU,IAAI,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG;AAC1D,QAAI,SAAS,QAAQ,OAAO,SAAS,SAAU,QAAO;AACtD,WAAQ,KAAiCA,QAAO;AAAA,EAClD;AACA,SAAO;AACT;AAoBA,IAAM,cAA6B,MAAM;AACvC,QAAM,MAAM;AACZ,SAAO,OAAO,IAAI,YAAY,aAAa,IAAI,UAAU;AAC3D,GAAG;AAEH,IAAM,cAAc;AAAA,EAClB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,QAAQ;AACV;AAEA,SAAS,UAAU,SAA2B;AAC5C,MAAI;AACJ,MAAI,YAAY,UAAW,OAAM,IAAI,QAAQ,WAAW;AAAA,WAC/C,YAAY,WAAY,OAAM,IAAI,WAAW,WAAW;AAAA,MAC5D,OAAM,IAAI,QAAQ,WAAW;AAClC,aAAW,GAAG;AACd,SAAO;AACT;AAEA,IAAM,SAAS,oBAAI,IAAsB;AAEzC,SAAS,UAAU,SAA2B;AAC5C,MAAI,MAAM,OAAO,IAAI,OAAO;AAC5B,MAAI,CAAC,KAAK;AACR,UAAM,UAAU,OAAO;AACvB,WAAO,IAAI,SAAS,GAAG;AAAA,EACzB;AACA,SAAO;AACT;AAOA,SAAS,cAAc,QAA4D;AACjF,MAAI,CAACC,UAAS,MAAM,KAAK,OAAO,OAAO,YAAY,UAAU;AAC3D,WAAO,EAAE,SAAS,WAAW,OAAO;AAAA,EACtC;AACA,QAAM,MAAM,OAAO;AACnB,MAAI,2CAA2C,KAAK,GAAG,EAAG,QAAO,EAAE,SAAS,WAAW,OAAO;AAC9F,MAAI,2CAA2C,KAAK,GAAG,EAAG,QAAO,EAAE,SAAS,WAAW,OAAO;AAC9F,MAAI,qCAAqC,KAAK,GAAG,EAAG,QAAO,EAAE,SAAS,YAAY,OAAO;AACzF,QAAM,EAAE,SAAS,UAAU,GAAG,KAAK,IAAI;AACvC,MAAI,wCAAwC,KAAK,GAAG;AAClD,WAAO,EAAE,SAAS,YAAY,QAAQ,KAAK;AAC7C,SAAO,EAAE,SAAS,WAAW,QAAQ,KAAK;AAC5C;AAEA,SAASA,UAAS,OAAoD;AACpE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,UAAU,KAAsB;AACvC,SAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACxD;AAEA,SAAS,YACP,KACA,QACA,SACkB;AAClB,QAAM,QAAQ,oBAAI,IAAY;AAC9B,WAAS,UAAU,GAAG,UAAU,KAAK,WAAW;AAC9C,QAAI;AACF,aAAO,IAAI,QAAQ,MAAmB;AAAA,IACxC,SAAS,KAAK;AACZ,UAAI,EAAE,eAAe,iBAAkB,OAAM;AAC7C,YAAM,MAAM,IAAI;AAChB,UAAI,CAAC,WAAW,MAAM,IAAI,GAAG,GAAG;AAC9B,cAAM,IAAI;AAAA,UACR,wBAAwB,IAAI,UAAU,kEAAkE,UAAU,yDAAyD,EAAE;AAAA,QAC/K;AAAA,MACF;AACA,UAAI;AACJ,UAAI;AACF,cAAM,QAAQ,GAAG;AAAA,MACnB,SAAS,SAAS;AAChB,cAAM,IAAI,mBAAmB,8BAA8B,GAAG,MAAM,UAAU,OAAO,CAAC,EAAE;AAAA,MAC1F;AACA,UAAI,QAAQ,QAAW;AACrB,cAAM,IAAI;AAAA,UACR,iCAAiC,GAAG;AAAA,QACtC;AAAA,MACF;AACA,UAAI,UAAU,KAAkB,GAAG;AACnC,YAAM,IAAI,GAAG;AAAA,IACf;AAAA,EACF;AACA,QAAM,IAAI,mBAAmB,gDAAgD;AAC/E;AAMA,IAAM,aAAa,oBAAI,QAA2B;AAClD,IAAM,gBAAgB,oBAAI,QAAuD;AACjF,IAAM,oBAAoB,oBAAI,IAAwB;AAEtD,SAAS,cAAc,QAAgE;AACrF,SAAO,OAAO,WAAW,aAAaA,UAAS,MAAM;AACvD;AAOO,SAAS,cAAc,QAAmB,OAAuB,CAAC,GAAc;AACrF,MAAI,OAAO,WAAW,WAAW;AAC/B,QAAIC,UAAS,kBAAkB,IAAI,MAAM;AACzC,QAAI,CAACA,SAAQ;AACX,MAAAA,UAAS,SACL,OAAO,EAAE,IAAI,MAAM,QAAQ,CAAC,EAAE,KAC9B,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ;AAAA,UACN;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,YACT,YAAY;AAAA,UACd;AAAA,QACF;AAAA,MACF;AACJ,wBAAkB,IAAI,QAAQA,OAAM;AAAA,IACtC;AACA,WAAOA;AAAA,EACT;AACA,MAAI,CAAC,cAAc,MAAM,GAAG;AAC1B,UAAM,IAAI;AAAA,MACR,qDAAqD,MAAM,QAAQ,MAAM,IAAI,UAAU,WAAW,OAAO,SAAS,OAAO,MAAM;AAAA,IACjI;AAAA,EACF;AACA,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,SAAS,UAAU,cAAc,IAAI,MAAM,GAAG,IAAI,OAAO,IAAI,WAAW,IAAI,MAAM;AACxF,MAAI,OAAQ,QAAO;AAEnB,QAAM,YAAY,eAAe,QAAQ,OAAO;AAChD,MAAI,SAAS;AACX,QAAI,aAAa,cAAc,IAAI,MAAM;AACzC,QAAI,CAAC,YAAY;AACf,mBAAa,oBAAI,QAAQ;AACzB,oBAAc,IAAI,QAAQ,UAAU;AAAA,IACtC;AACA,eAAW,IAAI,SAAS,SAAS;AAAA,EACnC,OAAO;AACL,eAAW,IAAI,QAAQ,SAAS;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,eAAe,QAAmC,SAAwC;AACjG,QAAM,EAAE,SAAS,QAAQ,SAAS,IAAI,cAAc,MAAM;AAC1D,MAAI;AACJ,MAAI;AACF,QAAI,SAAS;AAEX,WAAK,YAAY,UAAU,OAAO,GAAG,UAAU,OAAO;AAAA,IACxD,OAAO;AACL,YAAM,MAAM,UAAU,OAAO;AAC7B,UAAI;AACF,aAAK,YAAY,KAAK,QAAQ;AAAA,MAChC,SAAS,KAAK;AAEZ,YAAI,CAAC,kDAAkD,KAAK,UAAU,GAAG,CAAC,EAAG,OAAM;AACnF,aAAK,YAAY,UAAU,OAAO,GAAG,QAAQ;AAAA,MAC/C,UAAE;AAEA,YAAI;AACF,cAAI,aAAa,QAAqB;AAAA,QACxC,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,eAAe,mBAAoB,OAAM;AAC7C,UAAM,IAAI,mBAAmB,UAAU,GAAG,CAAC;AAAA,EAC7C;AACA,SAAO,CAAC,UAAmB;AACzB,UAAM,KAAK,GAAG,KAAK;AACnB,QAAI,GAAI,QAAO,EAAE,IAAI,MAAM,QAAQ,CAAC,EAAE;AACtC,WAAO,EAAE,IAAI,OAAO,QAAQ,SAAS,GAAG,UAAU,CAAC,GAAG,KAAK,EAAE;AAAA,EAC/D;AACF;AAGO,SAAS,SACd,QACA,OACA,MACkB;AAClB,MAAI;AACJ,MAAI;AACF,gBAAY,cAAc,QAAQ,IAAI;AAAA,EACxC,SAAS,KAAK;AACZ,UAAM,UAAU,UAAU,GAAG;AAC7B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,CAAC,EAAE,MAAM,IAAI,SAAS,mBAAmB,OAAO,GAAG,CAAC;AAAA,MAC5D,aAAa;AAAA,IACf;AAAA,EACF;AACA,SAAO,UAAU,KAAK;AACxB;AAMO,SAAS,cACd,QACA,MACwC;AACxC,MAAI,OAAO,WAAW,UAAW,QAAO,EAAE,IAAI,MAAM,QAAQ,CAAC,EAAE;AAC/D,MAAI,CAAC,cAAc,MAAM,GAAG;AAC1B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ;AAAA,QACN;AAAA,UACE,MAAM;AAAA,UACN,SAAS,qDAAqD,MAAM,QAAQ,MAAM,IAAI,UAAU,WAAW,OAAO,SAAS,OAAO,MAAM;AAAA,QAC1I;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,EAAE,SAAS,QAAQ,SAAS,IAAI,cAAc,MAAM;AAC1D,QAAM,MAAM,UAAU,OAAO;AAC7B,MAAI;AACJ,MAAI;AACF,aAAS,IAAI,eAAe,QAAqB,MAAM;AAAA,EACzD,SAAS,KAAK;AACZ,WAAO,EAAE,IAAI,OAAO,QAAQ,CAAC,EAAE,MAAM,IAAI,SAAS,UAAU,GAAG,EAAE,CAAC,EAAE;AAAA,EACtE;AACA,MAAI,CAAC,OAAQ,QAAO,EAAE,IAAI,OAAO,QAAQ,SAAS,IAAI,UAAU,CAAC,GAAG,QAAQ,EAAE;AAC9E,MAAI;AACF,kBAAc,QAAQ,IAAI;AAAA,EAC5B,SAAS,KAAK;AACZ,WAAO,EAAE,IAAI,OAAO,QAAQ,CAAC,EAAE,MAAM,IAAI,SAAS,UAAU,GAAG,GAAG,SAAS,OAAO,CAAC,EAAE;AAAA,EACvF;AACA,SAAO,EAAE,IAAI,MAAM,QAAQ,CAAC,EAAE;AAChC;AAMA,SAAS,aAAa,OAAwB;AAC5C,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,EAAG,QAAO;AACjE,SAAO,OAAO;AAChB;AAEA,SAAS,MAAM,OAAgB,MAAM,IAAY;AAC/C,QAAM,OAAO,KAAK,UAAU,KAAK,KAAK,OAAO,KAAK;AAClD,SAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,MAAM,CAAC,CAAC,WAAM;AAC5D;AAEA,SAAS,aAAa,OAAoB,MAAuB;AAC/D,QAAM,SAAS,MAAM;AACrB,UAAQ,MAAM,SAAS;AAAA,IACrB,KAAK;AACH,aAAO,WAAW,MAAM,QAAQ,OAAO,IAAI,IAAK,OAAO,KAAkB,KAAK,MAAM,IAAI,OAAO,OAAO,IAAI,CAAC,SAAS,aAAa,eAAe,MAAM,MAAM,YAAY,CAAC,CAAC;AAAA,IAC5K,KAAK;AACH,aAAO,+BAA+B,KAAK,UAAU,OAAO,eAAe,CAAC;AAAA,IAC9E,KAAK;AACH,aAAO,qCAAqC,KAAK,UAAU,OAAO,kBAAkB,CAAC;AAAA,IACvF,KAAK;AACH,aAAO,sCAAsC,KAAK,UAAU,OAAO,mBAAmB,CAAC;AAAA,IACzF,KAAK;AACH,aAAO,kBAAkB,MAAM,OAAO,eAAe,GAAG,CAAC,SAAS,MAAM,eAAe,MAAM,MAAM,YAAY,CAAC,CAAC;AAAA,IACnH,KAAK;AACH,aAAO,WAAW,MAAM,OAAO,YAAY,CAAC,SAAS,MAAM,eAAe,MAAM,MAAM,YAAY,CAAC,CAAC;AAAA,IACtG,KAAK;AACH,aAAO,qBAAqB,KAAK,UAAU,OAAO,MAAM,CAAC,SAAS,MAAM,eAAe,MAAM,MAAM,YAAY,CAAC,CAAC;AAAA,IACnH,KAAK;AACH,aAAO,uBAAuB,OAAO,OAAO,OAAO,CAAC,UAAU,MAAM,eAAe,MAAM,MAAM,YAAY,CAAC,CAAC;AAAA,IAC/G;AACE,aAAO,MAAM,WAAW,WAAW,MAAM,OAAO;AAAA,EACpD;AACF;AAEA,SAAS,SAAS,QAAuB,MAA8B;AACrE,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAwB,CAAC;AAC/B,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAqB;AAAA,MACzB,MAAM,mBAAmB,MAAM,cAAc,IAAI;AAAA,MACjD,SAAS,aAAa,OAAO,IAAI;AAAA,MACjC,SAAS,MAAM;AAAA,MACf,YAAY,MAAM;AAAA,IACpB;AACA,UAAM,MAAM,GAAG,MAAM,IAAI,KAAS,MAAM,OAAO;AAC/C,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AACZ,WAAO,KAAK,KAAK;AAAA,EACnB;AACA,SAAO;AACT;;;AClUO,SAAS,mBAAmB,QAAoD;AACrF,SAAO,OAAQ,OAA6B,QAAQ;AACtD;AAEO,SAAS,oBAAoB,QAAqD;AACvF,SAAO,OAAQ,OAA6B,QAAQ;AACtD;;;ACrHA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAyBA,IAAM,uBAAuB;AAGpC,IAAM,qBAA6C;AAAA,EACjD,CAAC,kBAAkB,UAAU,GAAG;AAAA,EAChC,CAAC,kBAAkB,cAAc,GAAG;AAAA,EACpC,CAAC,kBAAkB,cAAc,GAAG;AAAA,EACpC,CAAC,kBAAkB,aAAa,GAAG;AAAA,EACnC,CAAC,kBAAkB,aAAa,GAAG;AAAA,EACnC,CAAC,kBAAkB,gBAAgB,GAAG;AAAA,EACtC,CAAC,kBAAkB,+BAA+B,GAAG;AAAA,EACrD,CAAC,kBAAkB,0BAA0B,GAAG;AAAA,EAChD,CAAC,kBAAkB,sBAAsB,GAAG;AAAA,EAC5C,CAAC,oBAAoB,GAAG;AAAA;AAAA,EAExB,CAAC,KAAM,GAAG;AAAA,EACV,CAAC,MAAM,GAAG;AACZ;AAGA,IAAM,iBAAyC,OAAO;AAAA,EACpD,OAAO,QAAQ,YAAY,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,OAAO,GAAG,CAAC;AACjE;AAGA,IAAM,kBAA0C,OAAO;AAAA,EACrD,OAAO,QAAQ,kBAAkB,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,OAAO,IAAI,CAAC,CAAC;AAC/E;AAGA,IAAM,eAAuC;AAAA,EAC3C,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,qBAAqB;AACvB;AAEO,SAAS,cAAc,MAAkC;AAC9D,SAAO,mBAAmB,IAAI;AAChC;AAEO,SAAS,iBAAiB,MAAsB;AACrD,SAAO,eAAe,IAAI,KAAK;AACjC;AAGO,SAAS,kBAAkB,MAAsB;AACtD,SAAO,aAAa,IAAI,KAAK;AAC/B;AAOO,SAAS,iBAA2B;AACzC,SAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,OAAO,kBAAkB,GAAG,GAAG,OAAO,OAAO,cAAc,CAAC,CAAC,CAAC;AAC9F;AAMO,SAAS,mBAAmB,OAAkD;AACnF,MAAI,MAAM,SAAS,kBAAkB,iBAAkB,QAAO;AAC9D,MAAI,MAAM,SAAS,kBAAkB,cAAe,QAAO;AAC3D,QAAM,OAAO,MAAM;AACnB,SACE,OAAO,SAAS,YAChB,SAAS,QACT,CAAC,MAAM,QAAQ,IAAI,KACnB,OAAO,KAAK,IAAI,EAAE,WAAW,KAC7B,OAAQ,KAA2B,QAAQ;AAE/C;AAMO,SAAS,iBAAiB,OAAkB,UAAoC;AACrF,MAAI,OAAO,aAAa,SAAU,QAAO,MAAM,SAAS;AACxD,QAAM,SAAS,kBAAkB,QAAQ;AACzC,MAAI,MAAM,aAAa,UAAa,kBAAkB,MAAM,QAAQ,MAAM,OAAQ,QAAO;AACzF,MAAI,WAAW,sBAAsB,mBAAmB,KAAK,EAAG,QAAO;AACvE,QAAM,UAAU,gBAAgB,MAAM;AACtC,SAAO,YAAY,UAAa,MAAM,SAAS;AACjD;AAEO,SAAS,oBAAoB,SAAyB;AAC3D,SAAO,QAAQ,QAAQ,wBAAwB,EAAE;AACnD;AAEO,SAAS,gBAAgB,SAA0B;AACxD,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AACpC,SAAO,QACJ,OAAO,CAAC,SAAiD;AACxD,WACE,OAAO,SAAS,YAChB,SAAS,QACR,KAA4B,SAAS,UACtC,OAAQ,KAA4B,SAAS;AAAA,EAEjD,CAAC,EACA,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,KAAK,IAAI;AACd;AAEA,SAAS,YAAY,OAAuC;AAC1D,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI;AACF,WAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AAAA,EACzC,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAOO,SAAS,iBAAiB,MAAc,MAAsC;AACnF,MAAI,mBAAmB,EAAE,MAAM,KAAK,CAAC,EAAG,QAAO;AAC/C,SAAO,cAAc,IAAI;AAC3B;AAGO,SAAS,iBAAiB,OAInB;AACZ,QAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAC3D,QAAM,OAAO,YAAY,MAAM,IAAI;AACnC,QAAM,WAAW,SAAS,SAAY,iBAAiB,MAAM,IAAI,IAAI;AACrE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,IACrC,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IAC/B,SAAS;AAAA,MACP,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AAAA,IACtD;AAAA,IACA,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,EACvC;AACF;AAYO,SAAS,YAAY,KAAc,KAA8B;AACtE,MAAI,eAAe,eAAe;AAChC,UAAM,OAAO,YAAY,IAAI,IAAI;AACjC,UAAM,WAAW,iBAAiB,IAAI,MAAM,IAAI;AAChD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,IAAI;AAAA,MACV,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,MAC/B,SAAS,oBAAoB,IAAI,OAAO;AAAA,MACxC,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,IACvC;AAAA,EACF;AACA,MAAI,eAAe,UAAU;AAC3B,UAAM,WAAW,iBAAiB,IAAI,IAAI;AAC1C,UAAM,OAAO,YAAY,IAAI,IAAI;AACjC,UAAM,OAAO,EAAE,UAAU,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC,GAAI,OAAO,KAAK;AAC9E,YAAQ,IAAI,MAAM;AAAA,MAChB,KAAK,aAAa;AAChB,eAAO;AAAA,UACL,GAAG;AAAA,UACH,MAAM;AAAA,UACN,SAAS,wBAAwB,IAAI,IAAI,wBAAwB,IAAI,aAAa,GAAG;AAAA,QACvF;AAAA,MACF,KAAK,aAAa;AAAA,MAClB,KAAK,aAAa;AAAA,MAClB,KAAK,aAAa;AAChB,eAAO;AAAA,UACL,GAAG;AAAA,UACH,MAAM;AAAA,UACN,SAAS,+BAA+B,IAAI,IAAI,KAAK,IAAI,OAAO;AAAA,QAClE;AAAA,MACF;AACE,YACE,OAAO,IAAI,IAAI,EAAE,WAAW,aAAa,KACzC,IAAI,SAAS,aAAa,sBAC1B;AACA,iBAAO,EAAE,GAAG,MAAM,MAAM,aAAa,SAAS,GAAG,IAAI,OAAO,QAAQ,IAAI,IAAI,IAAI;AAAA,QAClF;AACA,eAAO,EAAE,GAAG,MAAM,MAAM,YAAY,SAAS,GAAG,IAAI,OAAO,QAAQ,IAAI,IAAI,IAAI;AAAA,IACnF;AAAA,EACF;AACA,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS,GAAG,OAAO,QAAQ,IAAI,IAAI;AAAA,IACnC,OAAO;AAAA,EACT;AACF;;;AC/NA,SAAS,iBAAiB;AAC1B,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,qBAAqB;AAC9B;AAAA,EACE;AAAA,EAGA,iBAAAC;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,EACA,gBAAAC;AAAA,EAEA;AAAA,EAGA;AAAA,OAEK;AACP,SAAS,4BAA4B;;;ACxCrC;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,MAAQ;AAAA,EACR,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,KAAO;AAAA,IACL,YAAY;AAAA,IACZ,KAAO;AAAA,EACT;AAAA,EACA,SAAW;AAAA,IACT,KAAK;AAAA,MACH,QAAU;AAAA,MACV,OAAS;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,QAAU;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,MACV,QAAU;AAAA,MACV,OAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,OAAS,CAAC,QAAQ,OAAO,UAAU,aAAa,SAAS;AAAA,EACzD,SAAW;AAAA,IACT,OAAS;AAAA,IACT,KAAO;AAAA,IACP,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,WAAW;AAAA,IACX,KAAO;AAAA,IACP,YAAY;AAAA,IACZ,MAAQ;AAAA,IACR,YAAY;AAAA,IACZ,SAAW;AAAA,IACX,SAAW;AAAA,IACX,gBAAgB;AAAA,EAClB;AAAA,EACA,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAU;AAAA,EACV,SAAW;AAAA,EACX,eAAiB;AAAA,IACf,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,MAAQ;AAAA,IACN,KAAO;AAAA,EACT;AAAA,EACA,UAAY;AAAA,EACZ,iBAAmB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gCAAgC;AAAA,IAChC,eAAe;AAAA,IACf,uBAAuB;AAAA,IACvB,8CAA8C;AAAA,IAC9C,oBAAoB;AAAA,IACpB,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,QAAU;AAAA,EACZ;AAAA,EACA,cAAgB;AAAA,IACd,gCAAgC;AAAA,IAChC,KAAO;AAAA,IACP,eAAe;AAAA,IACf,aAAa;AAAA,IACb,aAAa;AAAA,EACf;AAAA,EACA,kBAAoB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,sBAAwB;AAAA,IACtB,QAAU;AAAA,MACR,UAAY;AAAA,IACd;AAAA,EACF;AACF;;;ACxFO,IAAM,UAAkB,gBAAS;;;ACSxC,OAAO,UAAU;AACjB,OAAO,WAAW;AAClB,SAAS,gBAAgB;AAWzB,IAAM,mBAAmB,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,GAAG,CAAC;AAErD,SAAS,YAAY,QAA8B;AACjD,SAAO,OAAO,UAAU,IAAI,aAAa,8BAA8B,YAAY;AACrF;AAEA,eAAe,UAAU,MAAe,SAA+C;AACrF,MAAI,SAAS,UAAa,SAAS,KAAM,QAAO;AAChD,MAAI,OAAO,SAAS,SAAU,QAAO,OAAO,KAAK,IAAI;AACrD,MAAI,gBAAgB,iBAAiB;AACnC,QAAI,CAAC,QAAQ,IAAI,cAAc,GAAG;AAChC,cAAQ,IAAI,gBAAgB,iDAAiD;AAAA,IAC/E;AACA,WAAO,OAAO,KAAK,KAAK,SAAS,CAAC;AAAA,EACpC;AACA,MAAI,gBAAgB,YAAa,QAAO,OAAO,KAAK,IAAI;AACxD,MAAI,YAAY,OAAO,IAAI,EAAG,QAAO,OAAO,KAAK,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;AAC9F,MAAI,gBAAgB,KAAM,QAAO,OAAO,KAAK,MAAM,KAAK,YAAY,CAAC;AACrE,MAAI,gBAAgB,eAAgB,QAAO,OAAO,KAAK,MAAM,IAAI,SAAS,IAAI,EAAE,YAAY,CAAC;AAC7F,QAAM,IAAI,UAAU,kCAAkC,OAAO,UAAU,SAAS,KAAK,IAAI,CAAC,EAAE;AAC9F;AAEA,SAAS,UAAU,KAAwC;AACzD,QAAM,UAAU,IAAI,QAAQ;AAC5B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,MAAM,QAAQ,KAAK,EAAG,YAAW,QAAQ,MAAO,SAAQ,OAAO,KAAK,IAAI;AAAA,aACnE,UAAU,OAAW,SAAQ,IAAI,KAAK,KAAK;AAAA,EACtD;AACA,SAAO;AACT;AAEO,SAAS,uBAAuC;AACrD,QAAM,YAAY,IAAI,KAAK,MAAM,EAAE,WAAW,KAAK,CAAC;AACpD,QAAM,aAAa,IAAI,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AACtD,QAAM,OAAO,oBAAI,IAAwB;AACzC,MAAI,YAAY;AAEhB,QAAM,UAAmB,OAAO,OAAO,OAAO,CAAC,MAAM;AACnD,QAAI,UAAW,OAAM,IAAI,UAAU,kDAAkD;AACrF,UAAM,UAAU,iBAAiB,UAAU,QAAQ;AACnD,UAAM,MAAM,IAAI,IAAI,UAAU,QAAQ,MAAM,iBAAiB,MAAM,MAAM,OAAO,OAAO,KAAK,CAAC;AAC7F,UAAM,UAAU,KAAK,UAAU,SAAS,UAAU,OAAO,YAAY;AACrE,UAAM,UAAU,IAAI,QAAQ,SAAS,OAAO;AAC5C,eAAW,CAAC,KAAK,KAAK,KAAK,IAAI,QAAQ,KAAK,OAAO,EAAG,SAAQ,IAAI,KAAK,KAAK;AAC5E,UAAM,SAAS,KAAK,UAAU,SAAS,UAAU;AACjD,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK,SAAS,SAAS,OAAO,MAAM,QAAQ,YAAY,IAAI;AAAA,MAC5D;AAAA,IACF;AACA,QAAI,KAAM,SAAQ,IAAI,kBAAkB,OAAO,KAAK,MAAM,CAAC;AAC3D,QAAI,QAAQ,QAAS,OAAM,YAAY,MAAM;AAE7C,UAAM,YAAY,IAAI,aAAa,WAAW,QAAQ;AACtD,QAAI,IAAI,aAAa,YAAY,IAAI,aAAa,SAAS;AACzD,YAAM,IAAI,UAAU,sCAAsC,IAAI,QAAQ,EAAE;AAAA,IAC1E;AAEA,WAAO,IAAI,QAAkB,CAAC,SAAS,WAAW;AAChD,YAAM,MAAM,UAAU,QAAQ,KAAK;AAAA,QACjC;AAAA,QACA,SAAS,OAAO,YAAY,OAAO;AAAA,QACnC,OAAO,IAAI,aAAa,WAAW,aAAa;AAAA,MAClD,CAAC;AACD,WAAK,IAAI,GAAG;AACZ,YAAM,UAAU,MAAM,IAAI,QAAQ,YAAY,MAAqB,CAAU;AAC7E,cAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACzD,YAAM,UAAU,MAAM;AACpB,aAAK,OAAO,GAAG;AACf,gBAAQ,oBAAoB,SAAS,OAAO;AAAA,MAC9C;AACA,UAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,gBAAQ;AACR;AAAA,UACE,QAAQ,UACJ,YAAY,MAAM,IAClB,OAAO,OAAO,IAAI,UAAU,cAAc,GAAG,EAAE,OAAO,IAAI,CAAC;AAAA,QACjE;AAAA,MACF,CAAC;AACD,UAAI,GAAG,SAAS,OAAO;AACvB,UAAI,GAAG,YAAY,CAAC,QAAQ;AAC1B,cAAM,SAAS,IAAI,cAAc;AACjC,cAAM,WAAW,iBAAiB,IAAI,MAAM,KAAK,WAAW;AAC5D,YAAI,SAAU,KAAI,OAAO;AACzB,YAAI;AACF;AAAA,YACE,IAAI;AAAA,cACF,WAAW,OAAQ,SAAS,MAAM,GAAG;AAAA,cACrC,EAAE,QAAQ,YAAY,IAAI,eAAe,SAAS,UAAU,IAAI,OAAO,EAAE;AAAA,YAC3E;AAAA,UACF;AAAA,QACF,SAAS,KAAK;AACZ,cAAI,QAAQ;AACZ,iBAAO,GAAG;AAAA,QACZ;AAAA,MACF,CAAC;AACD,UAAI,IAAI,IAAI;AAAA,IACd,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AACR,UAAI,UAAW;AACf,kBAAY;AACZ,iBAAW,OAAO,KAAM,KAAI,QAAQ;AACpC,WAAK,MAAM;AACX,gBAAU,QAAQ;AAClB,iBAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AACF;;;AHjEO,IAAM,0BAA0B;AAChC,IAAM,kBAAkB;AACxB,IAAM,uBAAuB,EAAE,MAAM,YAAY,SAAS,QAAQ;AAEzE,IAAM,2BAA2B;AACjC,IAAM,kBAAkB;AACxB,IAAM,oBAAoB;AAE1B,IAAM,sBAAsB;AAE5B,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AAwElB,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YACE,SACS,MACA,QACT,SACA;AACA,UAAM,SAAS,OAAO;AAJb;AACA;AAIT,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7C,YACE,SACS,OACT;AACA,UAAM,OAAO;AAFJ;AAGT,SAAK,OAAO;AAAA,EACd;AACF;AAGO,SAAS,kBAAkB,UAAkB,OAAkC,CAAC,GAAW;AAChG,QAAM,OAA0C,CAAC;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,QAAI,UAAU,QAAQ,UAAU,OAAW;AAC3C,SAAK,GAAG,IAAI,MAAM,QAAQ,KAAK,IAC3B,MAAM,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,IAAI,KAAK,UAAU,CAAC,CAAE,IAChE,OAAO,UAAU,WACf,QACA,OAAO,UAAU,WACf,KAAK,UAAU,KAAK,IACpB,OAAO,KAAK;AAAA,EACtB;AACA,SAAO,IAAI,YAAY,QAAQ,EAAE,OAAO,IAAI;AAC9C;AAaA,IAAM,uBAAN,cAAmC,MAAM;AAAA,EACvC,YAAqB,QAAgB;AACnC;AAAA,MACE,4BAA4B,MAAM,gCAAgC,MAAM;AAAA,IAC1E;AAHmB;AAInB,SAAK,OAAO;AAAA,EACd;AACF;AAGA,IAAM,YAAN,MAAgB;AAAA,EAKd,YAAqB,SAA0B;AAA1B;AAAA,EAA2B;AAAA,EAJvC,OAAO,oBAAI,IAA6B;AAAA,EACxC,YAA2B,CAAC;AAAA,EAC5B,cAA2B,CAAC;AAAA,EAC5B,aAAwE,CAAC;AAAA,EAGlF,KAAK,QAAwC;AAC3C,aAAS,IAAI,KAAK,UAAU,SAAS,GAAG,KAAK,GAAG,KAAK;AACnD,UAAI,KAAK,UAAU,CAAC,EAAE,WAAW,OAAQ,QAAO,KAAK,UAAU,CAAC,EAAE;AAAA,IACpE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,QAA8B;AACpC,WAAO,KAAK,UACT,OAAO,CAAC,MAAM,EAAE,WAAW,UAAUC,UAAS,EAAE,QAAQ,MAAM,CAAC,EAC/D,IAAI,CAAC,MAAM,EAAE,QAAQ,MAAoB;AAAA,EAC9C;AACF;AAEA,IAAM,cAAkD;AAAA,EACtD,aAAa,EAAE,SAAS,GAAG,QAAQ,YAAY,UAAU,CAAC,WAAoB,EAAE,MAAM,GAAG;AAC3F;AAEA,IAAM,SAAS,OAAO,iBAAiB;AAEvC,SAASA,UAAS,OAAqC;AACrD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,UAAU,SAA8B;AAC/C,SAAO,OAAO,QAAQ,WAAW,YAAY,QAAQ,OAAO;AAC9D;AAEA,SAAS,WAAW,SAA8B;AAChD,SACE,QAAQ,WAAW,UACnB,QAAQ,OAAO,WACd,YAAY,WAAW,WAAW;AAEvC;AAEA,SAAS,MAAS,OAAa;AAC7B,SAAO,UAAU,SAAY,QAAS,gBAAgB,KAAK;AAC7D;AAEA,SAAS,KAAK,OAA2B;AACvC,SAAO,MAAM,KAAK;AACpB;AAEA,SAAS,QAAQ,SAAyB;AACxC,SAAO,KAAK,MAAM,YAAY,IAAI,IAAI,OAAO;AAC/C;AAEA,SAAS,MAAM,OAAe,KAAa,KAAqB;AAC9D,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEA,SAAS,aAAa,WAA2D;AAC/E,QAAM,MAA8B,CAAC;AACrC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,GAAG;AACtD,QAAI,OAAO,UAAU,SAAU,KAAI,GAAG,IAAI;AAAA,EAC5C;AACA,SAAO,EAAE,GAAG,KAAK,GAAG,UAAU;AAChC;AAEA,SAAS,cAAc,SAA6D;AAClF,MAAI,YAAY,OAAW,QAAO;AAClC,MAAI,OAAO,YAAY,WAAY,QAAO;AAC1C,SAAO,CAAC,WAAY,OAAO,OAAO,SAAS,MAAM,IAAI,QAAQ,MAAM,IAAI;AACzE;AAEA,eAAe,cACb,YACA,QACA,QACgC;AAChC,aAAW,aAAa,YAAY;AAClC,QAAI,CAAC,UAAW;AAChB,UAAM,SAAS,MAAM,UAAU,QAAQ,MAAM;AAC7C,QAAI,WAAW,OAAW,QAAO;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,KAAK,QAAoB,MAA2C;AAC3E,QAAM,MAAiC,CAAC;AACxC,aAAW,OAAO,MAAM;AACtB,QAAI,OAAO,GAAG,MAAM,OAAW,KAAI,GAAG,IAAI,KAAK,OAAO,GAAG,CAAC;AAAA,EAC5D;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAA+B;AAClD,SAAO;AAAA,IACL,MAAM,OAAO,KAAK,IAAI;AAAA,IACtB,GAAG,KAAK,MAAM,CAAC,SAAS,aAAa,CAAC;AAAA,IACtC,aAAa,KAAK,gBAAgB,SAAY,OAAO,KAAK,KAAK,WAAW;AAAA,IAC1E,GAAG,KAAK,MAAM,CAAC,gBAAgB,eAAe,SAAS,aAAa,OAAO,CAAC;AAAA,EAC9E;AACF;AAEA,SAAS,gBAAgB,UAAuC;AAC9D,SAAO;AAAA,IACL,KAAK,OAAO,SAAS,GAAG;AAAA,IACxB,MAAM,OAAO,SAAS,IAAI;AAAA,IAC1B,GAAG,KAAK,UAAU;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,wBAAwB,UAA+C;AAC9E,SAAO;AAAA,IACL,aAAa,OAAO,SAAS,WAAW;AAAA,IACxC,MAAM,OAAO,SAAS,IAAI;AAAA,IAC1B,GAAG,KAAK,UAAU,CAAC,SAAS,eAAe,YAAY,eAAe,SAAS,OAAO,CAAC;AAAA,EACzF;AACF;AAEA,SAAS,cAAc,QAAmC;AACxD,QAAM,OAAO,MAAM,QAAQ,OAAO,SAAS,IACvC,OAAO,UAAU,OAAOA,SAAQ,EAAE;AAAA,IAChC,CAAC,SACE;AAAA,MACC,MAAM,OAAO,IAAI,IAAI;AAAA,MACrB,GAAG,KAAK,KAAK,CAAC,SAAS,eAAe,UAAU,CAAC;AAAA,IACnD;AAAA,EACJ,IACA;AACJ,SAAO;AAAA,IACL,MAAM,OAAO,OAAO,IAAI;AAAA,IACxB,GAAG,KAAK,QAAQ,CAAC,SAAS,aAAa,CAAC;AAAA,IACxC,GAAI,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;AAAA,IAClC,GAAG,KAAK,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,EACpC;AACF;AAEA,SAAS,eAAe,UAAwB,WAA8C;AAC5F,QAAM,QAAQ,EAAE,UAAU;AAC1B,MAAI,aAAa,SAAU,QAAO,EAAE,MAAM,SAAS;AACnD,MAAI,aAAa,OAAQ,QAAO,EAAE,MAAM,QAAQ,MAAM;AACtD,MAAI,aAAa,SAAU,QAAO,EAAE,MAAM,EAAE,KAAK,wBAAwB,GAAG,MAAM;AAClF,MAAIA,UAAS,QAAQ,KAAK,OAAO,SAAS,QAAQ;AAChD,WAAO,EAAE,MAAM,EAAE,KAAK,SAAS,IAAI,GAAG,MAAM;AAC9C,QAAM,IAAI;AAAA,IACR,4GAA4G,KAAK,UAAU,QAAQ,CAAC;AAAA,IACpI;AAAA,EACF;AACF;AAEA,SAAS,eAAe,QAA8B;AACpD,MAAI,mBAAmB,MAAM,EAAG,QAAO,cAAc,OAAO,GAAG;AAC/D,QAAM,MAAM,CAAC,OAAO,KAAK,GAAI,OAAO,QAAQ,CAAC,CAAE,EAAE,KAAK,GAAG;AACzD,SAAO,eAAe,GAAG;AAC3B;AAEA,IAAM,mBAAmB;AAEzB,IAAM,wBAAwB,oBAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,eAAe,MAAsB;AAC5C,SAAO,SAAS,KAAK,IAAI,IAAI,WAAW;AAC1C;AAEA,SAAS,iBAAiB,MAAuB;AAC/C,MAAI,QAAQ,aAAa,QAAS,QAAO;AACzC,MAAI;AACF,QAAI,CAACC,IAAG,SAAS,IAAI,EAAE,OAAO,EAAG,QAAO;AACxC,IAAAA,IAAG,WAAW,MAAMA,IAAG,UAAU,IAAI;AACrC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,gBAAgB,KAAsB;AAC7C,QAAM,aAAa,CAAC,KAAK,GAAG,CAAC,OAAO,QAAQ,QAAQ,SAAS,OAAO,EAAE,IAAI,CAAC,QAAQ,MAAM,GAAG,CAAC;AAC7F,aAAW,KAAKC,MAAK,KAAK,KAAK,UAAU,CAAC;AAC1C,SAAO,WAAW,KAAK,CAAC,SAAS;AAC/B,QAAI;AACF,aAAOD,IAAG,SAAS,IAAI,EAAE,OAAO;AAAA,IAClC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAMA,SAAS,eAAe,QAAqC;AAC3D,QAAM,MAAM,OAAO,OAAO,QAAQ,IAAI;AACtC,QAAM,QAAQ,eAAe,MAAsB;AACnD,QAAM,OAAO,OAAO,QAAQ,CAAC;AAC7B,MAAI,iBAAiB,KAAK,OAAO,GAAG,GAAG;AACrC,UAAM,MAAMC,MAAK,QAAQ,KAAK,OAAO,GAAG;AACxC,QAAI,CAAC,iBAAiB,GAAG,GAAG;AAC1B,YAAM,aAAa,CAAC,eAAe,OAAO,GAAG,GAAG,OAAO,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;AAC7E,YAAM,SAASD,IAAG,WAAW,GAAG;AAChC,YAAM,IAAI;AAAA,QACR,SACI,6BAA6B,KAAK,KAAK,OAAO,GAAG,kDAAkD,UAAU,OAC7G,6BAA6B,KAAK,qBAAqB,OAAO,GAAG,cAAc,GAAG,oBAAoB,UAAU;AAAA,QACpH;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AACA,QAAM,OAAOC,MACV,SAAS,OAAO,GAAG,EACnB,YAAY,EACZ,QAAQ,UAAU,EAAE;AACvB,MAAI,SAAS,UAAU,OAAO,QAAQ,QAAQ,SAAU;AACxD,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,yBAAyB,IAAI,GAAG,EAAG;AACvC,QAAI,sBAAsB,IAAI,GAAG,GAAG;AAClC;AACA;AAAA,IACF;AACA,QAAI,IAAI,WAAW,GAAG,EAAG;AACzB,UAAM,MAAMA,MAAK,QAAQ,KAAK,GAAG;AACjC,QAAI,CAAC,gBAAgB,GAAG,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,6BAA6B,KAAK,qBAAqB,GAAG,cAAc,GAAG;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AACF;AAKA,eAAe,YAAY,KAAa,IAA8B;AACpE,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,SAAO,MAAM;AACX,QAAI;AACF,cAAQ,KAAK,KAAK,CAAC;AAAA,IACrB,SAAS,KAAK;AACZ,UAAK,IAA8B,SAAS,QAAS,QAAO;AAAA,IAC9D;AACA,QAAI,KAAK,IAAI,KAAK,SAAU,QAAO;AACnC,UAAM,MAAM,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC;AAAA,EAC9D;AACF;AAGA,SAAS,UAAU,KAAa,OAAsB;AACpD,MAAI;AACF,QAAI,QAAQ,aAAa,SAAS;AAChC,gBAAU,YAAY,CAAC,QAAQ,OAAO,GAAG,GAAG,MAAM,IAAI,GAAG;AAAA,QACvD,OAAO;AAAA,QACP,aAAa;AAAA,MACf,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,KAAK,KAAK,QAAQ,YAAY,SAAS;AAAA,IACjD;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAOO,SAAS,0BAA0B,QAAoC;AAC5E,QAAM,QAAQ,OACX,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACjB,QAAM,YAAY,MAAM;AAAA,IAAK,CAAC,SAC5B,qLAAqL;AAAA,MACnL;AAAA,IACF;AAAA,EACF;AACA,MAAI,UAAW,QAAO;AACtB,SAAO,MAAM;AAAA,IACX,CAAC,SACC,CAAC,QAAQ,KAAK,IAAI,KAClB,CAAC,mBAAmB,KAAK,IAAI,KAC7B,CAAC,QAAQ,KAAK,IAAI,KAClB,CAAC,WAAW,KAAK,IAAI,KACrB,CAAC,gBAAgB,KAAK,IAAI;AAAA,EAC9B;AACF;AAEA,SAAS,cAAc,MAAuB;AAC5C,QAAM,QAAQ,KAAK,UAAU,EAAE,CAAC;AAChC,MAAI,UAAU,OAAO,UAAU,IAAK,QAAO;AAC3C,MAAI;AACF,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,UAAM,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACnD,WAAO,MAAM,SAAS,KAAK,MAAM,MAAM,CAAC,SAASF,UAAS,IAAI,KAAK,KAAK,YAAY,KAAK;AAAA,EAC3F,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMO,IAAM,aAAN,MAAM,YAAW;AAAA,EAiBd,YACW,QACA,WACR,QACQ,MACA,OACA,YACjB;AANiB;AACA;AACR;AACQ;AACA;AACA;AAAA,EAChB;AAAA,EAvBK,QAA0B,QAAQ,QAAQ;AAAA,EAC1C;AAAA,EACS,WAAW,oBAAI,IAAwB;AAAA,EAChD,cAAc;AAAA,EACd;AAAA,EACA,eAAe;AAAA,EACf,WAAW;AAAA,EACX,OAA4B;AAAA,EAC5B,mBAAmB;AAAA,EACV,QAAqB,EAAE,OAAO,GAAG,QAAQ,CAAC,EAAE;AAAA,EACrD,gBAAgB;AAAA,EACP,gBAAgB,IAAI,cAAc,MAAM;AAAA;AAAA,EAEjD,cAAc;AAAA,EACd;AAAA;AAAA,EAYR,IAAI,cAA2B;AAC7B,WAAO,EAAE,OAAO,KAAK,MAAM,OAAO,QAAQ,CAAC,GAAG,KAAK,MAAM,MAAM,EAAE;AAAA,EACnE;AAAA;AAAA,EAGA,IAAI,MAA2B;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,kBAA0B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,SAAkB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,aAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,MAAc;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAa,MAAM,QAAsB,MAA2C;AAClF,UAAM,WAAW,OAAO,YAAY;AACpC,UAAM,iBAAiB,OAAO,kBAAkB,MAAM,KAAK,WAAW,KAAM,GAAK;AACjF,UAAM,qBAAqB,eAAe,UAAU,cAAc;AAClE,UAAMG,QAAO,mBAAmB,MAAM;AAEtC,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAIA,OAAM;AACR,UAAI;AACJ,UAAI;AACF,cAAM,IAAI,IAAI,OAAO,GAAG;AAAA,MAC1B,QAAQ;AACN,cAAM,IAAI;AAAA,UACR,2EAA2E,KAAK,UAAU,OAAO,GAAG,CAAC;AAAA,UACrG;AAAA,QACF;AAAA,MACF;AACA,mBAAa,qBAAqB;AAClC,kBAAY,IAAI,8BAA8B,KAAK;AAAA,QACjD,aAAa,OAAO,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI;AAAA,QAC5D,OAAO,WAAW;AAAA,MACpB,CAAC;AAAA,IACH,OAAO;AACL,UAAI,OAAO,OAAO,QAAQ,YAAY,OAAO,IAAI,WAAW,GAAG;AAC7D,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,qBAAe,MAAM;AACrB,cAAQ,IAAI,qBAAqB;AAAA,QAC/B,SAAS,OAAO;AAAA,QAChB,MAAM,OAAO,QAAQ,CAAC;AAAA,QACtB,KAAK,OAAO,OAAO,QAAQ,IAAI;AAAA,QAC/B,KAAK,aAAa,OAAO,OAAO,CAAC,CAAC;AAAA,QAClC,QAAQ,KAAK,WAAW,WAAW,WAAW;AAAA,MAChD,CAAC;AACD,kBAAY;AAAA,IACd;AAEA,UAAMC,gBAAmC;AAAA,MACvC,aAAa,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE;AAAA,MACjC,UAAU,CAAC;AAAA,MACX,OAAO,CAAC;AAAA,MACR,GAAI,KAAK,UAAU,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,eAAe,GAAG,CAAC,EAAE,EAAE;AAAA,IAC1E;AACA,UAAM,SAAS,IAAI,OAAO,KAAK,cAAc,sBAAsB;AAAA,MACjE,cAAAA;AAAA,MACA;AAAA,MACA,eAAe,EAAE,aAAa,KAAK;AAAA,IACrC,CAAC;AACD,UAAM,UAAU,IAAI,YAAW,QAAQ,WAAW,QAAQ,MAAM,OAAO,UAAU;AACjF,YAAQ,KAAK,KAAK;AAClB,UAAM,QAAQ,QAAQ,gBAAgB,aAAa,UAAU,CAACD,KAAI;AAClE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAY,OAAmC;AACrD,UAAM,SAAU,MACb;AACH,QAAI,CAAC,UAAU,OAAO,OAAO,WAAW,WAAY;AACpD,UAAM,SAAS,OAAO,OAAO,KAAK,MAAM;AACxC,WAAO,SAAS,CAAC,UAAkB;AACjC,WAAK,WAAW,KAAK;AACrB,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEQ,WAAW,OAAqB;AACtC,UAAM,WAAW,KAAK,cAAc;AACpC,SAAK,iBAAiB,KAAK,cAAc,MAAM,KAAK;AACpD,QAAI,UAAU,KAAK,cAAc,QAAQ,MAAM,QAAQ;AACvD,WAAO,YAAY,IAAI;AACrB,YAAM,OAAO,KAAK,cAAc,MAAM,GAAG,OAAO,EAAE,QAAQ,OAAO,EAAE;AACnE,WAAK,gBAAgB,KAAK,cAAc,MAAM,UAAU,CAAC;AACzD,UAAI,KAAK,KAAK,MAAM,MAAM,CAAC,cAAc,IAAI,GAAG;AAC9C,aAAK,MAAM,SAAS;AACpB,YAAI,KAAK,MAAM,OAAO,SAAS,oBAAoB;AACjD,eAAK,MAAM,OAAO;AAAA,YAChB,KAAK,SAAS,mBAAmB,GAAG,KAAK,MAAM,GAAG,gBAAgB,CAAC,WAAM;AAAA,UAC3E;AAAA,QACF;AACA,aAAK,KAAK,gBAAgB,IAAI;AAAA,MAChC;AACA,gBAAU,KAAK,cAAc,QAAQ,IAAI;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA,EAGQ,KAAK,OAA+C;AAC1D,QAAI,MAAO,MAAK,YAAY,KAAK;AACjC,UAAM,YAAY,KAAK;AACvB,UAAM,OAAO,UAAU,KAAK,KAAK,SAAS;AAC1C,cAAU,OAAO,CAAC,SAAS,YAAY;AACrC,WAAK,IAAI,OAAO,OAAO;AACvB,aAAO,KAAK,SAAS,OAAO;AAAA,IAC9B;AAGA,QAAI;AACJ,QAAI;AACJ,WAAO,eAAe,WAAW,aAAa;AAAA,MAC5C,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,KAAK,MAAM;AAAA,MACX,KAAK,CAAC,YAAoC;AACxC,YAAI,YAAY,UAAc,QAA+C,MAAM,GAAG;AACpF,oBAAU;AACV;AAAA,QACF;AACA,cAAM,WAAW,CAAC,SAAyB,UAAoB;AAC7D,cAAI,YAAY,QAAQ;AACtB,qBAAS;AACT,iBAAK,IAAI,MAAM,OAAO;AAAA,UACxB;AACA;AAAC,UAAC,QAAqD,SAAS,KAAK;AAAA,QACvE;AACA,gBAAQ,MAAM,IAAI;AAClB,kBAAU;AAAA,MACZ;AAAA,IACF,CAAC;AAED,WAAO,QAAQ,GAAG,QAAQ,CAAC,UAA2B;AACpD,YAAM,OAAO,OAAO,KAAK;AACzB,WAAK,gBAAgB,KAAK,eAAe,MAAM,MAAM,CAAC,iBAAiB;AACvE,WAAK,KAAK,KAAK,UAAU,eAAe,UAAW,SAAQ,OAAO,MAAM,IAAI;AAC5E,WAAK,KAAK,WAAW,IAAI;AACzB,WAAK,KAAK,aAAa,EAAE,KAAK,UAAU,IAAI,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,IAChE,CAAC;AAED,SAAK,OAAO,UAAU,MAAM;AAAA,IAE5B;AACA,SAAK,OAAO,UAAU,MAAM;AAC1B,WAAK,WAAW;AAAA,IAClB;AACA,eAAW,UAAU,CAAC,sBAAsB,0BAA0B,YAAY,GAAY;AAC5F,WAAK,OAAO,kBAAkB,SAAS,CACrC,SACA,QACG,KAAK,mBAAmB,QAAQ,SAAS,GAAG,EAAW;AAAA,IAC9D;AAAA,EACF;AAAA,EAEQ,IAAI,KAAmB,SAA+B;AAC5D,UAAM,MAAM;AACZ,UAAM,UAAU,KAAK;AACrB,QAAI,SAAS;AACX,UAAI,QAAQ,SAAS,UAAU,GAAG;AAChC,gBAAQ,KAAK,IAAI,IAAI,IAAuB,IAAI,MAAgB;AAClE,UAAI,QAAQ,QAAQ,WAAW,GAAG,GAAG;AACnC,cAAM,SAAS,QAAQ,KAAK,IAAI,IAAI,EAAqB;AACzD,YAAI,WAAW,QAAW;AACxB,kBAAQ,UAAU,KAAK,EAAE,QAAQ,SAAS,IAAI,CAAC;AAC/C,gBAAM,SAAS,IAAI;AACnB,cAAIH,UAAS,MAAM,KAAK,OAAO,eAAe,kBAAkB;AAC9D,oBAAQ,YAAY,KAAK,KAAK,OAAO,iBAAiB,CAAC,CAAC,CAAC;AAAA,UAC3D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,KAAK,WAAY,MAAK,KAAK,WAAW,EAAE,KAAK,IAAI,KAAK,IAAI,GAAG,SAAS,KAAK,OAAO,EAAE,CAAC;AAAA,EAChG;AAAA,EAEA,MAAc,mBACZ,QACA,SACA,KACgB;AAChB,UAAM,SAAS,KAAK,QAAQ,UAAU,CAAC,CAAC;AACxC,UAAM,UAAU,KAAK;AACrB,UAAM,MAAM,OAAO,IAAI,OAAO,EAAE;AAEhC,QAAI,KAAK,SAAS,YAAY,QAAS,SAAQ,YAAY,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,QAAQ,OAAO,EAAE,CAAC;AAC7F,UAAM,SAAS,MAAM,cAAc,CAAC,SAAS,SAAS,KAAK,KAAK,cAAc,GAAG,QAAQ,MAAM;AAC/F,QAAI,WAAW,QAAW;AACxB,eAAS,WAAW,KAAK,EAAE,KAAK,QAAQ,OAAO,CAAC;AAChD,YAAM,IAAI,qBAAqB,MAAM;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,QAAQ,gBAAwB,aAAqC;AACjF,UAAM,QAAQ,eAAe,KAAK,MAAM;AACxC,UAAM,UAAU,IAAI,UAAU;AAC9B,SAAK,SAAS;AACd,UAAM,UAAU,kBAAkB,cAAc,IAAI,KAAK;AACzD,QAAI;AACJ,QAAI;AACF,YAAM,QAAQ,KAAK;AAAA,QACjB,KAAK,OAAO,QAAQ,KAAK,WAAW,EAAE,SAAS,eAAe,CAAC;AAAA,QAC/D,IAAI,QAAe,CAAC,GAAG,WAAW;AAChC,kBAAQ;AAAA,YACN,MAAM,OAAO,IAAIK,UAASC,cAAa,gBAAgB,sBAAsB,CAAC;AAAA,YAC9E;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,WAAK,cAAc;AACnB,YAAM,KAAK,MAAM;AACjB,YAAM,KAAK,WAAW,KAAK,OAAO,cAAc;AAAA,IAClD,UAAE;AACA,UAAI,MAAO,cAAa,KAAK;AAC7B,WAAK,SAAS;AAAA,IAChB;AACA,SAAK,OAAO,KAAK,OAAO,eAAe,KAAK;AAC5C,SAAK,mBAAmB,KAAK,OAAO,6BAA6B,KAAK;AACtE,UAAM,OAAO,QAAQ,KAAK,YAAY;AACtC,QAAI,QAAQN,UAAS,KAAK,MAAM,EAAG,MAAK,gBAAgB,KAAK;AAAA,EAC/D;AAAA,EAEQ,WAAW,KAAc,OAAe,gBAA2C;AACzF,UAAM,SAAS,KAAK,aAAa,KAAK;AACtC,UAAMO,aAAY,0BAA0B,MAAM;AAClD,UAAM,QACJ,KAAK,MAAM,QAAQ,IACf,qBAAqB,KAAK,MAAM,KAAK,qBAAqB,KAAK,MAAM,UAAU,IAAI,KAAK,GAAG,sBAAsB,KAAK,UAAU,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,+DACrJ;AACN,UAAM,OAAO,GAAGA,aAAY,mBAAmBA,UAAS,KAAK,EAAE,GAAG,KAAK;AACvE,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,UAAM,QAAS,KAA4B;AAC3C,UAAMJ,QAAO,mBAAmB,KAAK,MAAM;AAC3C,UAAM,WAAW,KAAK,OAAO,YAAY;AACzC,UAAM,UACJ,aAAa,SACT,gDACA,aAAa,WACX,yBACA;AAGR,UAAM,WACJ,UAAU,YACV,SAAS,KAAK,OAAO,KACrB,oGAAoG;AAAA,MAClG;AAAA,IACF;AACF,QAAI,CAACA,SAAQ,UAAU;AACrB,aAAO,IAAI;AAAA,QACT,6BAA6B,KAAK,6FAA6F,IAAI;AAAA,QACnI;AAAA,QACA;AAAA,QACA,EAAE,OAAO,IAAI;AAAA,MACf;AAAA,IACF;AACA,QACEA,SACA,2EAA2E,KAAK,OAAO,GACvF;AACA,aAAO,IAAI;AAAA,QACT,+BAA+B,KAAK,KAAK,OAAO;AAAA,QAChD;AAAA,QACA;AAAA,QACA,EAAE,OAAO,IAAI;AAAA,MACf;AAAA,IACF;AACA,QAAI,eAAeE,WAAU;AAC3B,cAAQ,IAAI,MAAM;AAAA,QAChB,KAAKC,cAAa;AAAA,QAClB,KAAKA,cAAa;AAAA,QAClB,KAAKA,cAAa;AAChB,iBAAO,IAAI;AAAA,YACT,+DAA+D,KAAK,KAAK,OAAO,iDAAiD,IAAI;AAAA,YACrI;AAAA,YACA;AAAA,YACA,EAAE,OAAO,IAAI;AAAA,UACf;AAAA,QACF,KAAKA,cAAa;AAChB,iBAAO,IAAI;AAAA,YACT,2BAA2B,KAAK,6BAA6B,cAAc,2FAA2F,IAAI;AAAA,YAC1K;AAAA,YACA;AAAA,YACA,EAAE,OAAO,IAAI;AAAA,UACf;AAAA,QACF,KAAKA,cAAa;AAChB,iBAAO,IAAI;AAAA,YACT,kCAAkC,KAAK,KAAK,OAAO,KAAK,OAAO,GAAG,IAAI;AAAA,YACtE;AAAA,YACA;AAAA,YACA,EAAE,OAAO,IAAI;AAAA,UACf;AAAA,QACF;AACE,cAAI,OAAO,IAAI,IAAI,EAAE,WAAW,aAAa,GAAG;AAC9C,mBAAO,IAAI;AAAA,cACT,+BAA+B,KAAK,KAAK,OAAO,KAAK,iBAAiB,IAAI,IAAI,CAAC;AAAA,cAC/E;AAAA,cACA;AAAA,cACA,EAAE,OAAO,IAAI;AAAA,YACf;AAAA,UACF;AAAA,MACJ;AAAA,IACF;AACA,QAAI,eAAeE,gBAAe;AAChC,aAAO,IAAI;AAAA,QACT,kCAAkC,KAAK,qBAAqB,IAAI,IAAI,IAAI,OAAO,KAAK,OAAO,GAAG,IAAI;AAAA,QAClG;AAAA,QACA;AAAA,QACA,EAAE,OAAO,IAAI;AAAA,MACf;AAAA,IACF;AACA,WAAO,IAAI;AAAA,MACT,UAAUL,QAAO,eAAe,OAAO,cAAc,KAAK,KAAK,OAAO,IAAIA,QAAO,0CAA0C,EAAE,GAAG,IAAI;AAAA,MACpIA,QAAO,SAAS;AAAA,MAChB;AAAA,MACA,EAAE,OAAO,IAAI;AAAA,IACf;AAAA,EACF;AAAA;AAAA,EAGQ,UACN,SACA,IACY;AACZ,UAAM,MAAM,KAAK,MAAM,KAAK,YAAY;AACtC,YAAM,UAAU,IAAI,UAAU,OAAO;AACrC,WAAK,SAAS;AACd,UAAI;AACF,eAAO,MAAM,GAAG,OAAO;AAAA,MACzB,UAAE;AACA,aAAK,SAAS;AACd,cAAM,WAAW,IAAI,IAAI,QAAQ,UAAU,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;AACnE,mBAAW,MAAM,QAAQ,KAAK,KAAK,EAAG,KAAI,CAAC,SAAS,IAAI,EAAE,EAAG,MAAK,cAAc;AAAA,MAClF;AAAA,IACF,CAAC;AACD,SAAK,QAAQ,IAAI,MAAM,MAAM,MAAS;AACtC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA,EAKA,WAAkC;AAChC,QAAI,KAAK,SAAS,SAAU,QAAO,QAAQ,QAAQ,KAAK,mBAAmB,CAAC;AAC5E,WAAO,KAAK,UAAU,QAAW,OAAO,YAAY;AAClD,UAAI;AACJ,UAAI;AACJ,UAAI;AACF,mBAAW,MAAM,KAAK,OAAO,SAAS,EAAE,SAAS,KAAK,KAAK,UAAU,CAAC;AAAA,MACxE,SAAS,KAAK;AACZ,iBAAS;AAAA,MACX;AACA,YAAM,OAAO,QAAQ,KAAK,iBAAiB;AAC3C,UAAI,QAAQH,UAAS,KAAK,KAAK,GAAG;AAChC,cAAM,QAAQ,iBAAiB,KAAK,KAAK;AACzC,cAAM,IAAI;AAAA,UACR,6BAA6B,eAAe,KAAK,MAAM,CAAC,KAAK,MAAM,OAAO;AAAA,UAC1E;AAAA,QACF;AAAA,MACF;AACA,YAAM,MACJ,QAAQA,UAAS,KAAK,MAAM,IAAI,KAAK,SAASA,UAAS,QAAQ,IAAI,WAAW;AAChF,UAAI,CAAC,KAAK;AACR,cAAM,QAAQ,YAAY,QAAQ;AAAA,UAChC,MAAM;AAAA,UACN,WAAW,KAAK,KAAK;AAAA,QACvB,CAAC;AACD,cAAM,IAAI,oBAAoB,MAAM,SAAS,KAAK;AAAA,MACpD;AACA,YAAM,OAAOA,UAAS,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC;AAChD,YAAMS,YAAWT,UAAS,KAAK,oBAAoB,CAAC,IAChD,KAAK,oBAAoB,IACzB,KAAK,OAAO,iBAAiB;AACjC,YAAMI,gBAAeJ,UAAS,IAAI,YAAY,IAAI,IAAI,eAAe,CAAC;AACtE,aAAO;AAAA,QACL,KAAK;AAAA,QACL,iBAAiB,KAAK;AAAA,QACtB,mBAAmB,MAAM,QAAQ,IAAI,iBAAiB,IAClD,IAAI,kBAAkB,IAAI,MAAM,IAChC,CAAC,KAAK,gBAAgB;AAAA,QAC1B,GAAIS,YAAW,EAAE,YAAY,KAAKA,SAAQ,EAAoB,IAAI,CAAC;AAAA,QACnE,cAAc,KAAKL,aAAY;AAAA,QAC/B,YAAYJ,UAASI,cAAa,UAAU,IAAI,OAAO,KAAKA,cAAa,UAAU,IAAI,CAAC;AAAA,QACxF,GAAI,OAAO,IAAI,iBAAiB,WAAW,EAAE,cAAc,IAAI,aAAa,IAAI,CAAC;AAAA,QACjF,aAAa;AAAA,QACb,KAAK,KAAK,GAAG;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,qBAAmC;AACzC,UAAM,OAAO,KAAK;AAClB,UAAMA,gBAAeJ,UAAS,MAAM,YAAY,IAC5C,KAAK,eACH,KAAK,OAAO,sBAAsB,KAAK,CAAC;AAC9C,UAAMS,YAAWT,UAAS,MAAM,UAAU,IAAI,KAAK,aAAa,KAAK,OAAO,iBAAiB;AAC7F,UAAM,eACJ,OAAO,MAAM,iBAAiB,WAAW,KAAK,eAAe,KAAK,OAAO,gBAAgB;AAC3F,UAAM,MAAkB,QAAQ;AAAA,MAC9B,iBAAiB,KAAK;AAAA,MACtB,cAAAI;AAAA,MACA,GAAIK,YAAW,EAAE,YAAYA,UAAS,IAAI,CAAC;AAAA,MAC3C,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,IACzC;AACA,WAAO;AAAA,MACL,KAAK;AAAA,MACL,iBAAiB,KAAK;AAAA,MACtB,mBAAmB,CAAC,KAAK,gBAAgB;AAAA,MACzC,GAAIA,YAAW,EAAE,YAAY,KAAKA,SAAQ,EAAoB,IAAI,CAAC;AAAA,MACnE,cAAc,KAAKL,aAAY;AAAA,MAC/B,YAAYJ,UAASI,cAAa,UAAU,IAAI,OAAO,KAAKA,cAAa,UAAU,IAAI,CAAC;AAAA,MACxF,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,MACvC,aAAa;AAAA,MACb,KAAK,KAAK,GAAG;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAM,YAAoC;AACxC,YAAQ,MAAM,KAAK,gBAAgB,GAAG;AAAA,EACxC;AAAA,EAEA,MAAM,gBAA4C;AAChD,YAAQ,MAAM,KAAK,oBAAoB,GAAG;AAAA,EAC5C;AAAA,EAEA,MAAM,wBAA4D;AAChE,YAAQ,MAAM,KAAK,4BAA4B,GAAG;AAAA,EACpD;AAAA,EAEA,MAAM,cAAwC;AAC5C,YAAQ,MAAM,KAAK,kBAAkB,GAAG;AAAA,EAC1C;AAAA,EAEA,kBAAoD;AAClD,WAAO,KAAK,UAAU,QAAW,OAAO,YAAY;AAClD,YAAM,OAAO,MAAM,KAAK,UAAU,SAAS,cAAc,OAAO;AAChE,aAAO,EAAE,GAAG,MAAM,OAAO,KAAK,MAAM,IAAI,WAAW,EAAE;AAAA,IACvD,CAAC;AAAA,EACH;AAAA,EAEA,sBAA4D;AAC1D,WAAO,KAAK,UAAU,QAAW,OAAO,YAAY;AAClD,YAAM,OAAO,MAAM,KAAK,UAAU,SAAS,kBAAkB,WAAW;AACxE,aAAO,EAAE,GAAG,MAAM,OAAO,KAAK,MAAM,IAAI,eAAe,EAAE;AAAA,IAC3D,CAAC;AAAA,EACH;AAAA,EAEA,8BAA4E;AAC1E,WAAO,KAAK,UAAU,QAAW,OAAO,YAAY;AAClD,YAAM,OAAO,MAAM,KAAK,UAAU,SAAS,4BAA4B,mBAAmB;AAC1F,aAAO,EAAE,GAAG,MAAM,OAAO,KAAK,MAAM,IAAI,uBAAuB,EAAE;AAAA,IACnE,CAAC;AAAA,EACH;AAAA,EAEA,oBAAwD;AACtD,WAAO,KAAK,UAAU,QAAW,OAAO,YAAY;AAClD,YAAM,OAAO,MAAM,KAAK,UAAU,SAAS,gBAAgB,SAAS;AACpE,aAAO,EAAE,GAAG,MAAM,OAAO,KAAK,MAAM,IAAI,aAAa,EAAE;AAAA,IACzD,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAc,UACZ,SACA,QACA,KACiC;AACjC,UAAM,UAAU,EAAE,SAAS,KAAK,KAAK,WAAW,WAAW,SAAkB;AAC7E,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,UAAI,WAAW,aAAc,YAAW,MAAM,KAAK,OAAO,UAAU,QAAW,OAAO;AAAA,eAC7E,WAAW;AAClB,mBAAW,MAAM,KAAK,OAAO,cAAc,QAAW,OAAO;AAAA,eACtD,WAAW;AAClB,mBAAW,MAAM,KAAK,OAAO,sBAAsB,QAAW,OAAO;AAAA,UAClE,YAAW,MAAM,KAAK,OAAO,YAAY,QAAW,OAAO;AAAA,IAClE,SAAS,KAAK;AACZ,eAAS;AAAA,IACX;AACA,UAAM,OAAO,QAAQ,KAAK,MAAM;AAChC,QAAI,QAAQJ,UAAS,KAAK,KAAK,GAAG;AAChC,YAAM,QAAQ,iBAAiB,KAAK,KAAK;AACzC,YAAM,IAAI;AAAA,QACR,GAAG,MAAM,cAAc,eAAe,KAAK,MAAM,CAAC,KAAK,MAAM,OAAO;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AACA,UAAM,QAAQ,QAAQ,QAAQ,MAAM;AACpC,UAAM,QAAQ,MAAM,CAAC,MAAMA,UAAS,QAAQ,IAAI,WAAW;AAC3D,QAAI,CAAC,OAAO;AACV,UAAI,WAAW,OAAW,QAAO,EAAE,OAAO,CAAC,EAAE;AAC7C,YAAM,QAAQ,YAAY,QAAQ,EAAE,MAAM,QAAQ,WAAW,KAAK,KAAK,UAAU,CAAC;AAClF,YAAM,IAAI,oBAAoB,MAAM,SAAS,KAAK;AAAA,IACpD;AAEA,UAAM,UAAU,MAAM,SAAS,IAAI,QAAQ,CAAC,KAAK,GAAG;AAAA,MAClD,CAAC,MAAM,GAAG,QACR,MAAM,KACN,KAAK,UAAU,CAAC,KAAK,GAAG,GAAG,KAAK,UAAU,CAAC,MACzC,KAAK,UAAU,CAAC,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,UAAU,CAAC;AAAA,IAC7D;AACA,UAAM,QAAQ,OACX,QAAQ,CAAC,SAAU,MAAM,QAAQ,KAAK,GAAG,CAAC,IAAK,KAAK,GAAG,IAAkB,CAAC,CAAE,EAC5E,OAAOA,SAAQ;AAClB,QAAI,WAAW,cAAc;AAC3B,WAAK,cAAc;AACnB,iBAAW,QAAQ;AACjB,YAAI,OAAO,KAAK,SAAS,SAAU,MAAK,SAAS,IAAI,KAAK,MAAM,IAAI;AAAA,IACxE;AACA,WAAO;AAAA,MACL;AAAA,MACA,GAAI,OAAO,MAAM,UAAU,WAAW,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,MAChE,GAAI,OAAO,MAAM,eAAe,WAAW,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;AAAA,MAC/E,GAAI,MAAM,UAAU,SAAY,EAAE,OAAO,KAAK,MAAM,KAAK,EAAE,IAAI,CAAC;AAAA,IAClE;AAAA,EACF;AAAA;AAAA,EAIA,SACE,MACA,OAAkC,CAAC,GACnC,OAAoB,CAAC,GACH;AAClB,UAAM,YAAY,KAAK,aAAa,KAAK,KAAK;AAC9C,WAAO,KAAK,UAAU,cAAc,KAAK,OAAO,GAAG,OAAO,YAAY;AACpE,YAAM,iBAAiB,MAAM,KAAK,kBAAkB,SAAS,IAAI;AACjE,YAAM,UAAU,YAAY,IAAI;AAChC,UAAI;AACJ,UAAI;AACJ,UAAI;AACF,mBAAW,MAAM,KAAK,OAAO;AAAA,UAC3B,EAAE,MAAM,WAAW,KAAK;AAAA,UACxB,EAAE,SAAS,WAAW,iBAAiB,WAAW,eAAe;AAAA,QACnE;AAAA,MACF,SAAS,KAAK;AACZ,iBAAS;AAAA,MACX;AACA,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA,eAAe,IAAI;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,KAAa,OAAoB,CAAC,GAAqB;AAClE,UAAM,YAAY,KAAK,aAAa,KAAK,KAAK;AAC9C,WAAO,KAAK,UAAU,cAAc,KAAK,OAAO,GAAG,OAAO,YAAY;AACpE,YAAM,UAAU,YAAY,IAAI;AAChC,UAAI;AACJ,UAAI;AACJ,UAAI;AACF,mBAAW,MAAM,KAAK,OAAO;AAAA,UAC3B,EAAE,IAAI;AAAA,UACN,EAAE,SAAS,WAAW,iBAAiB,WAAW,WAAW,SAAS;AAAA,QACxE;AAAA,MACF,SAAS,KAAK;AACZ,iBAAS;AAAA,MACX;AACA,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA,mBAAmB,GAAG;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,qBACE,UACA,OAAkC,CAAC,GACnC,OAAoB,CAAC,GACH;AAClB,WAAO,KAAK,aAAa,kBAAkB,UAAU,IAAI,GAAG,IAAI;AAAA,EAClE;AAAA,EAEA,UACE,MACA,OAAkC,CAAC,GACnC,OAAoB,CAAC,GACH;AAClB,UAAM,YAAY,KAAK,aAAa,KAAK,KAAK;AAC9C,WAAO,KAAK,UAAU,cAAc,KAAK,OAAO,GAAG,OAAO,YAAY;AACpE,YAAM,UAAU,YAAY,IAAI;AAChC,UAAI;AACJ,UAAI;AACJ,UAAI;AACF,mBAAW,MAAM,KAAK,OAAO;AAAA,UAC3B,EAAE,MAAM,WAAW,KAA+B;AAAA,UAClD,EAAE,SAAS,WAAW,iBAAiB,UAAU;AAAA,QACnD;AAAA,MACF,SAAS,KAAK;AACZ,iBAAS;AAAA,MACX;AACA,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA,gBAAgB,IAAI;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,YAAY,KAAK,KAAK,WAA6B;AACtD,WAAO,KAAK,UAAU,QAAW,YAAY;AAC3C,UAAI;AACF,YAAI,KAAK,SAAS,SAAU,OAAM,KAAK,OAAO,SAAS,EAAE,SAAS,UAAU,CAAC;AAAA,YACxE,OAAM,KAAK,OAAO,KAAK,EAAE,SAAS,UAAU,CAAC;AAClD,eAAO;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAuB;AACrB,SAAK,YAAY,KAAK,SAAS;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,WAA0B;AACtC,SAAK,WAAW;AAChB,QAAI,KAAK,YAAY;AACnB,YAAMG,QAAO,KAAK;AAClB,UAAIA,MAAK,cAAc,QAAW;AAChC,YAAI;AACJ,cAAM,QAAQ,KAAK;AAAA,UACjBA,MAAK,iBAAiB,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AAAA,UACtC,IAAI,QAAc,CAAC,YAAY;AAC7B,oBAAQ,WAAW,SAAS,GAAI;AAAA,UAClC,CAAC;AAAA,QACH,CAAC;AACD,YAAI,MAAO,cAAa,KAAK;AAAA,MAC/B;AACA,YAAM,KAAK,OAAO,MAAM,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACxC,WAAK,WAAW,QAAQ;AACxB;AAAA,IACF;AACA,UAAM,MAAM,KAAK,OAAO,OAAO;AAC/B,UAAM,WAAW,KAAK,OAAO,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACnD,QAAI,OAAO,QAAQ,UAAU;AAC3B,YAAM,UAAU,KAAK,cAAc,IAAI;AACvC,UAAI,CAAE,MAAM,YAAY,KAAK,OAAO,GAAI;AACtC,kBAAU,KAAK,KAAK;AACpB,YAAI,CAAE,MAAM,YAAY,KAAK,mBAAmB,EAAI,WAAU,KAAK,IAAI;AAAA,MACzE;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,kBAAkB,SAAoB,MAA6B;AAC/E,QACE,CAAC,KAAK,SAAS,IAAI,IAAI,KACvB,CAAC,KAAK,eACN,KAAK,SAAS,YACd,mBAAmB,KAAK,MAAM,GAC9B;AACA,YAAM,KAAK,UAAU,SAAS,cAAc,OAAO,EAAE,MAAM,MAAM,MAAS;AAAA,IAC5E;AACA,UAAM,SAAS,KAAK,SAAS,IAAI,IAAI;AACrC,UAAM,EAAE,cAAc,UAAU,GAAG,KAAK,IAAI,UAAU,EAAE,MAAM,aAAa,EAAE,MAAM,SAAS,EAAE;AAC9F,WAAO,MAAM,IAAI;AAAA,EACnB;AAAA;AAAA,EAGA,MAAc,OACZ,SACA,QACA,MACA,WACA,SACA,UACA,QACA,MACkB;AAClB,UAAM,OAAO,OAAoB;AAAA,MAC/B,YAAY,QAAQ,OAAO;AAAA,MAC3B,GAAI,QAAQ,YAAY,SAAS,IAC7B,EAAE,eAAe,KAAK,QAAQ,WAAW,EAAiB,IAC1D,CAAC;AAAA,IACP;AAEA,QAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,YAAM,UAAU,QAAQ,KAAK,MAAM;AACnC,YAAM,aAAa,WAAWH,UAAS,QAAQ,MAAM,IAAI,QAAQ,SAAS;AAC1E,YAAM,cAAc,YAAY,eAAe;AAC/C,YAAM,WAAsB,cACxB,KAAK,WAAW,iBAAiB,CAAC,CAAC,IACnC,OAAO;AAAA,QACL,QAAQ,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,QAAQ,EAAE,OAAO,CAAC,CAAC;AAAA,MAC/E;AACJ,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,GAAI,eAAe,OAAO,WAAW,iBAAiB,WAClD,EAAE,cAAc,WAAW,aAAa,IACxC,CAAC;AAAA,QACL,GAAG,KAAK;AAAA,MACV;AAAA,IACF;AAEA,UAAM,OAAO,QAAQ,KAAK,MAAM;AAChC,QAAI,QAAQA,UAAS,KAAK,KAAK,GAAG;AAChC,aAAO,EAAE,MAAM,SAAS,OAAO,iBAAiB,KAAK,KAAK,GAAG,GAAG,KAAK,EAAE;AAAA,IACzE;AAEA,UAAM,MAAM,QAAQA,UAAS,KAAK,MAAM,IAAI,KAAK,SAAS;AAC1D,QAAI,KAAK,eAAe,QAAQ;AAC9B,YAAM,OAAO,KAAK,GAAG;AACrB,UAAI,CAAC,KAAK,MAAO,QAAO,EAAE,MAAM,UAAU,QAAQ,MAAM,MAAM,GAAG,KAAK,EAAE;AACxE,aAAO,KAAK,UAAU,SAAS,KAAK,MAAM,MAAM,WAAW,IAAI;AAAA,IACjE;AAEA,QAAI,WAAW,QAAW;AACxB,YAAM,QAAQ,YAAY,QAAQ,EAAE,MAAM,UAAU,CAAC;AACrD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,EAAE,GAAG,OAAO,OAAO,KAAK;AAAA,QAC/B,GAAI,MAAM,EAAE,QAAQ,KAAK,GAAG,EAAE,IAAI,CAAC;AAAA,QACnC,GAAG,KAAK;AAAA,MACV;AAAA,IACF;AAEA,UAAM,SAAS,QAAQA,UAAS,QAAQ,IAAI,WAAW;AACvD,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,2BAA2B,IAAI;AAAA,UACxC,OAAO;AAAA,QACT;AAAA,QACA,GAAG,KAAK;AAAA,MACV;AAAA,IACF;AACA,WAAO,KAAK,cAAc,QAAQ,KAAK,MAAM,GAAG,KAAK,CAAC;AAAA,EACxD;AAAA,EAEQ,cAAc,QAAgB,QAAmB,MAA4B;AACnF,QAAI,WAAW,gBAAgBA,UAAS,MAAM,KAAK,OAAO,YAAY,MAAM;AAC1E,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,EAAE,MAAM,QAAQ,SAAS,gBAAgB,OAAO,OAAO,EAAE;AAAA,QAChE;AAAA,QACA,GAAG;AAAA,MACL;AAAA,IACF;AACA,WAAO,EAAE,MAAM,UAAU,QAAQ,GAAG,KAAK;AAAA,EAC3C;AAAA;AAAA,EAGA,MAAc,UACZ,SACA,MACA,MACA,MACA,WACA,MACkB;AAClB,UAAM,YAAY,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,CAAC;AACjE,UAAM,WAAW,UAAU,aAAa;AACxC,UAAM,WAAW,YAAY,IAAI,IAAI;AACrC,UAAM,OAAO,KAAK,IAAI;AACtB,UAAM,SAAS,OAAO,KAAK,MAAM;AACjC,UAAM,WAAW,oBAAI,IAAY;AACjC,QAAI,UAAsB;AAC1B,UAAM,WAAW,OAAoB,EAAE,GAAG,KAAK,GAAG,KAAK;AAEvD,WAAO,MAAM;AACX,YAAM,SAAS,QAAQ;AACvB,UAAI,WAAW,aAAa;AAC1B,cAAM,SAASA,UAAS,QAAQ,MAAM,IAAI,KAAK,QAAQ,MAAM,IAAI,CAAC;AAClE,eAAO,KAAK,cAAc,cAAc,QAAQ,SAAS,CAAC;AAAA,MAC5D;AACA,UAAI,WAAW,UAAU;AACvB,cAAM,QAAQA,UAAS,QAAQ,KAAK,IAChC,iBAAiB,QAAQ,KAAK,IAC9B;AAAA,UACE,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,OAAO,QAAQ,iBAAiB,aAAa;AAAA,QACxD;AACJ,eAAO,EAAE,MAAM,SAAS,OAAO,GAAG,SAAS,EAAE;AAAA,MAC/C;AACA,UAAI,WAAW,aAAa;AAC1B,eAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,YACL,MAAM;AAAA,YACN,UAAU;AAAA,YACV,SAAS,QAAQ,MAAM,qBAAqB,IAAI,GAAG,QAAQ,gBAAgB,KAAK,QAAQ,aAAa,KAAK,EAAE;AAAA,UAC9G;AAAA,UACA,GAAG,SAAS;AAAA,QACd;AAAA,MACF;AACA,UAAI,WAAW,oBAAoBA,UAAS,QAAQ,aAAa,GAAG;AAClE,cAAM,UAAU,OAAO,QAAQ,QAAQ,aAAa,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;AAC1F,YAAI,QAAQ,SAAS,GAAG;AACtB,kBAAQ,YAAY,KAAK,KAAK,OAAO,YAAY,OAAO,CAAC,CAAC;AAC1D,gBAAM,YAAuC,CAAC;AAC9C,qBAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AAClC,kBAAM,UAAUA,UAAS,KAAK,IAAI,QAAQ,CAAC;AAC3C,kBAAM,SAAS,MAAM;AAAA,cACnB,CAAC,QAAQ,SAAS,KAAK,KAAK,cAAc;AAAA,cAC1C,OAAO,QAAQ,MAAM;AAAA,cACrB,KAAK,QAAQ,UAAU,CAAC,CAAC;AAAA,YAC3B;AACA,gBAAI,WAAW,QAAW;AACxB,qBAAO;AAAA,gBACL,MAAM;AAAA,gBACN,UAAU,KAAK,QAAQ,aAAa;AAAA,gBACpC,GAAG,SAAS;AAAA,cACd;AAAA,YACF;AACA,sBAAU,GAAG,IAAI;AAAA,UACnB;AACA,gBAAM,SAAS,MAAM,KAAK;AAAA,YACxB;AAAA,YACA;AAAA,YACA,EAAE,QAAQ,gBAAgB,UAAU;AAAA,YACpC;AAAA,YACA;AAAA,UACF;AACA,cAAI,WAAW,OAAQ,QAAO,EAAE,MAAM,SAAS,OAAO,OAAO,OAAO,GAAG,SAAS,EAAE;AAClF,qBAAW,OAAO,OAAO,KAAK,SAAS,EAAG,UAAS,IAAI,GAAG;AAAA,QAC5D;AAAA,MACF;AACA,YAAM,YAAY,WAAW,YAAY,IAAI;AAC7C,UAAI,aAAa,GAAG;AAClB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,YACL,MAAM;AAAA,YACN,UAAU;AAAA,YACV,SAAS,0BAA0B,IAAI,UAAU,MAAM,WAAW,OAAO,MAAM,CAAC,WAAW,QAAQ;AAAA,YACnG,OAAO;AAAA,UACT;AAAA,UACA,GAAG,SAAS;AAAA,QACd;AAAA,MACF;AACA,YAAM,aACJ,OAAO,QAAQ,mBAAmB,WAAW,QAAQ,iBAAiB;AACxE,YAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,UAAU,YAAY,SAAS,CAAC,CAAC;AAC5E,YAAM,SAAS,MAAM,KAAK,YAAY,SAAS,aAAa,EAAE,OAAO,GAAG,WAAW,IAAI;AACvF,UAAI,WAAW,OAAQ,QAAO,EAAE,MAAM,SAAS,OAAO,OAAO,OAAO,GAAG,SAAS,EAAE;AAClF,gBAAU,OAAO;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,MAAc,YACZ,SACA,QACA,QACA,WACA,MACwD;AACxD,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,OAAO,QAAQ,EAAE,QAAQ,OAAO,GAAG,aAAa,EAAE,SAAS,UAAU,CAAC;AAAA,IAC9F,SAAS,KAAK;AACZ,eAAS;AAAA,IACX;AACA,UAAM,OAAO,QAAQ,KAAK,MAAM;AAChC,QAAI,QAAQA,UAAS,KAAK,KAAK,EAAG,QAAO,EAAE,OAAO,iBAAiB,KAAK,KAAK,EAAE;AAC/E,QAAI,QAAQA,UAAS,KAAK,MAAM,EAAG,QAAO,EAAE,QAAQ,KAAK,OAAO;AAChE,QAAI,WAAW,UAAaA,UAAS,QAAQ,EAAG,QAAO,EAAE,QAAQ,SAAS;AAC1E,WAAO;AAAA,MACL,OAAO,EAAE,GAAG,YAAY,QAAQ,EAAE,MAAM,GAAG,MAAM,QAAQ,IAAI,IAAI,UAAU,CAAC,GAAG,OAAO,KAAK;AAAA,IAC7F;AAAA,EACF;AACF;;;AIr+CO,IAAM,sBAAsB;AAC5B,IAAM,wBAAwB;AAK9B,IAAM,gCAAmD;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,oBAA+C;AAAA,EAC1D,WAAW,CAAC,2BAA2B;AAAA,EACvC,UAAU,CAAC,YAAY;AAAA,EACvB,OAAO;AACT;AAGO,IAAM,oBAAgC;AAAA,EAC3C,SAAS,EAAE,CAAC,mBAAmB,GAAG,EAAE,KAAK,QAAQ,MAAM,CAAC,eAAe,GAAG,KAAK,KAAK,KAAK,CAAC,EAAE,EAAE;AAAA,EAC9F,eAAe;AAAA,EACf,OAAO,CAAC,6BAA6B;AAAA,EACrC,UAAU;AAAA,EACV,gBAAgB,CAAC,GAAG,6BAA6B;AAAA;AAAA;AAAA,EAGjD,QAAQ,CAAC;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW,CAAC,SAAS;AAAA,EACrB,SAAS;AACX;AAGO,IAAM,yBAAyB;;;AC/BtC,OAAOU,SAAQ;AACf,OAAOC,WAAU;AA4FV,IAAM,cAAN,cAA0B,MAAM;AAAA,EACrC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAMO,SAAS,kBAAkB,OAAuB;AACvD,MAAI,SAAS;AACb,MAAI,WAAW;AACf,MAAI,cAA6B;AACjC,MAAI,UAAU;AACd,MAAI,iBAAiB;AACrB,MAAI,gBAAgB;AAEpB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,OAAO,IAAI,IAAI,MAAM,SAAS,MAAM,IAAI,CAAC,IAAI;AAEnD,QAAI,eAAe;AACjB,UAAI,SAAS,MAAM;AACjB,wBAAgB;AAChB,kBAAU;AAAA,MACZ;AACA;AAAA,IACF;AAEA,QAAI,gBAAgB;AAClB,UAAI,SAAS,OAAO,SAAS,KAAK;AAChC,yBAAiB;AACjB;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,CAAC,YAAY,SAAS,OAAO,SAAS,KAAK;AAC7C,uBAAiB;AACjB;AACA;AAAA,IACF;AACA,QAAI,CAAC,YAAY,SAAS,OAAO,SAAS,KAAK;AAC7C,sBAAgB;AAChB;AACA;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,gBAAU;AACV,UAAI,CAAC,WAAW,SAAS,aAAa;AACpC,mBAAW;AACX,sBAAc;AAAA,MAChB;AACA,gBAAU,CAAC,WAAW,SAAS;AAC/B;AAAA,IACF;AAEA,QAAI,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AAChD,iBAAW;AACX,oBAAc;AACd,gBAAU;AACV,gBAAU;AACV;AAAA,IACF;AAEA,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAGO,SAAS,oBAAoB,OAAuB;AACzD,MAAI,SAAS;AACb,MAAI,WAAW;AACf,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,UAAU;AACZ,gBAAU;AACV,UAAI,CAAC,WAAW,SAAS,IAAK,YAAW;AACzC,gBAAU,CAAC,WAAW,SAAS;AAC/B;AAAA,IACF;AACA,QAAI,SAAS,KAAK;AAChB,iBAAW;AACX,gBAAU;AACV,gBAAU;AACV;AAAA,IACF;AACA,QAAI,SAAS,KAAK;AAChB,UAAI,IAAI,IAAI;AACZ,aAAO,IAAI,MAAM,UAAU,KAAK,KAAK,MAAM,CAAC,CAAC,EAAG;AAChD,UAAI,MAAM,CAAC,MAAM,OAAO,MAAM,CAAC,MAAM,IAAK;AAAA,IAC5C;AACA,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEO,SAAS,WAAW,KAAa,OAAwB;AAC9D,MAAI;AACF,WAAO,KAAK,MAAM,oBAAoB,kBAAkB,GAAG,CAAC,CAAC;AAAA,EAC/D,SAAS,KAAK;AACZ,UAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC9D,UAAM,IAAI;AAAA,MACR,mBAAmB,KAAK,KAAK,MAAM;AAAA,IACrC;AAAA,EACF;AACF;AAMO,SAAS,yBAAyB,YAAgC;AACvE,QAAM,MAAMC,IAAG,aAAa,YAAY,MAAM;AAC9C,QAAMC,QAAO,WAAW,KAAK,UAAU;AACvC,MAAIC,MAAK,SAAS,UAAU,MAAM,gBAAgB;AAChD,UAAM,UAAWD,OAAiC;AAClD,WAAQE,eAAc,OAAO,IAAI,UAAU,CAAC;AAAA,EAC9C;AACA,MAAI,CAACA,eAAcF,KAAI,GAAG;AACxB,UAAM,IAAI;AAAA,MACR,qBAAqB,UAAU,iCAAiC,SAASA,KAAI,CAAC;AAAA,IAChF;AAAA,EACF;AACA,SAAOA;AACT;AAEO,SAAS,eAAe,KAAa,cAAiD;AAC3F,MAAI,cAAc;AAChB,UAAM,MAAMC,MAAK,WAAW,YAAY,IAAI,eAAeA,MAAK,KAAK,KAAK,YAAY;AACtF,QAAI,CAACF,IAAG,WAAW,GAAG,GAAG;AACvB,YAAM,IAAI;AAAA,QACR,qBAAqB,GAAG;AAAA,MAC1B;AAAA,IACF;AACA,WAAO,EAAE,QAAQ,yBAAyB,GAAG,GAAG,SAASE,MAAK,QAAQ,GAAG,GAAG,YAAY,IAAI;AAAA,EAC9F;AAEA,aAAW,QAAQ,CAAC,iBAAiB,gBAAgB,GAAG;AACtD,UAAM,OAAOA,MAAK,KAAK,KAAK,IAAI;AAChC,QAAIF,IAAG,WAAW,IAAI,GAAG;AACvB,aAAO;AAAA,QACL,QAAQ,yBAAyB,IAAI;AAAA,QACrC,SAASE,MAAK,QAAQ,IAAI;AAAA,QAC1B,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAUA,MAAK,KAAK,KAAK,cAAc;AAC7C,MAAIF,IAAG,WAAW,OAAO,GAAG;AAC1B,UAAM,MAAM,WAAWA,IAAG,aAAa,SAAS,MAAM,GAAG,OAAO;AAChE,QAAIG,eAAc,KAAK,QAAQ,GAAG;AAChC,aAAO;AAAA,QACL,QAAQ,IAAI;AAAA,QACZ,SAASD,MAAK,QAAQ,OAAO;AAAA,QAC7B,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAMA,IAAM,cAAc;AAGb,SAAS,eACd,OACA,MAA0C,QAAQ,KAClD,WAAqB,CAAC,GACtB,KAAK,IACF;AACH,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,QAAQ,aAAa,CAAC,OAAO,SAAiB,MAAc,aAAsB;AAC7F,UAAI,QAAS,QAAO,MAAM,MAAM,CAAC;AACjC,YAAM,WAAW,IAAI,IAAI;AACzB,UAAI,aAAa,UAAa,aAAa,GAAI,QAAO;AACtD,UAAI,aAAa,OAAW,QAAO;AACnC,eAAS;AAAA,QACP,iCAAiC,MAAM,QAAQ,QAAQ,IAAI,mDAAmD,IAAI;AAAA,MACpH;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,MAAM,MAAM,eAAe,MAAM,KAAK,UAAU,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;AAAA,EAClF;AACA,MAAIC,eAAc,KAAK,GAAG;AACxB,UAAM,MAA+B,CAAC;AACtC,eAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,UAAI,GAAG,IAAI,eAAe,MAAM,KAAK,UAAU,KAAK,GAAG,EAAE,IAAI,GAAG,KAAK,GAAG;AAAA,IAC1E;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMA,SAASA,eAAc,OAAkD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,SAAS,OAAwB;AACxC,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,KAAK,UAAU,KAAK;AAC7B;AAGA,SAAS,WAAW,KAAa,OAA6C;AAC5E,MAAI;AACJ,MAAI,YAAY,OAAO;AACvB,QAAM,QAAQ,IAAI,YAAY;AAC9B,aAAW,aAAa,OAAO;AAC7B,UAAM,QAAQC,cAAa,OAAO,UAAU,YAAY,CAAC;AACzD,QAAI,QAAQ,WAAW;AACrB,kBAAY;AACZ,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,aAAa,IAAI,OAAO;AACjC;AAEA,SAASA,cAAa,GAAW,GAAmB;AAClD,QAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC;AAC5D,WAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,QAAI,OAAO,IAAI,CAAC;AAChB,QAAI,CAAC,IAAI;AACT,aAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,YAAM,MAAM,IAAI,CAAC;AACjB,UAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;AACpF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,IAAI,EAAE,MAAM;AACrB;AAEA,IAAM,YAAN,MAAgB;AAAA,EAId,YACW,QACA,UACT;AAFS;AACA;AAAA,EACR;AAAA;AAAA,EALM,SAAmB,CAAC;AAAA;AAAA,EAQ7B,QAAW,IAA4B;AACrC,QAAI;AACF,aAAO,GAAG;AAAA,IACZ,SAAS,KAAK;AACZ,UAAI,EAAE,eAAe,aAAc,OAAM;AACzC,WAAK,OAAO,KAAK,IAAI,OAAO;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,WACE,IACA,KACA,OACA,OAAO,+BACD;AACN,UAAM,OAAO,WAAW,KAAK,KAAK;AAClC,SAAK,OAAO;AAAA,MACV,yBAAyB,KAAK,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,KAAK,KAAK,MAAM,KAAK,OAAO,kBAAkB,IAAI,OAAO,EAAE,2BAA2B,IAAI;AAAA,IAC7I;AAAA,EACF;AAAA;AAAA,EAGA,gBAAsB;AACpB,QAAI,KAAK,OAAO,WAAW,EAAG;AAC9B,QAAI,KAAK,OAAO,WAAW,EAAG,OAAM,IAAI,YAAY,KAAK,OAAO,CAAC,CAAC;AAClE,UAAM,IAAI;AAAA,MACR,mBAAmB,KAAK,MAAM,MAAM,KAAK,OAAO,MAAM;AAAA,EAAe,KAAK,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IACpH;AAAA,EACF;AAAA,EAEA,KACE,IACA,UACA,KACA,OAAO,oCACA;AACP,UAAM,IAAI;AAAA,MACR,qBAAqB,EAAE,KAAK,KAAK,MAAM,eAAe,QAAQ,SAAS,SAAS,GAAG,CAAC,KAAK,IAAI;AAAA,IAC/F;AAAA,EACF;AAAA,EAEA,OAAO,OAAgB,IAAoB;AACzC,QAAI,OAAO,UAAU,SAAU,MAAK,KAAK,IAAI,YAAY,KAAK;AAC9D,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,OAAgB,IAAqB;AAC3C,QAAI,OAAO,UAAU,UAAW,MAAK,KAAK,IAAI,iBAAiB,KAAK;AACpE,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,OAAgB,IAAY,EAAE,MAAM,GAAG,UAAU,MAAM,IAAI,CAAC,GAAW;AAC5E,QACE,OAAO,UAAU,YACjB,CAAC,OAAO,SAAS,KAAK,KACtB,QAAQ,OACP,WAAW,CAAC,OAAO,UAAU,KAAK,GACnC;AACA,WAAK,KAAK,IAAI,GAAG,UAAU,eAAe,UAAU,OAAO,GAAG,IAAI,KAAK;AAAA,IACzE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,OAAgB,IAAY,EAAE,cAAc,MAAM,IAAI,CAAC,GAAa;AAC1E,QAAI,eAAe,OAAO,UAAU,SAAU,QAAO,CAAC,KAAK;AAC3D,QAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,KAAK,CAAC,MAAM,OAAO,MAAM,QAAQ,GAAG;AACrE,WAAK,KAAK,IAAI,uBAAuB,KAAK;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,OAAgB,IAAoC;AAC/D,QAAI,CAACD,eAAc,KAAK,EAAG,MAAK,KAAK,IAAI,8BAA8B,KAAK;AAC5E,UAAM,MAA8B,CAAC;AACrC,eAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,UAAI,OAAO,SAAS,SAAU,KAAI,GAAG,IAAI;AAAA,eAChC,OAAO,SAAS,YAAY,OAAO,SAAS,WAAW;AAC9D,aAAK,SAAS;AAAA,UACZ,uBAAuB,EAAE,IAAI,GAAG,KAAK,KAAK,MAAM,gBAAgB,IAAI,QAAQ,IAAI;AAAA,QAClF;AACA,YAAI,GAAG,IAAI,OAAO,IAAI;AAAA,MACxB,MAAO,MAAK,KAAK,GAAG,EAAE,IAAI,GAAG,IAAI,YAAY,IAAI;AAAA,IACnD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,OAAgB,IAA0B;AACjD,WAAO;AAAA,MAAkB;AAAA,MAAO,CAAC,QAC/B,KAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,OAAgB,IAA0B;AAC/C,QAAI,CAACA,eAAc,KAAK;AACtB,WAAK,KAAK,IAAI,sDAAsD,KAAK;AAC3E,UAAM,SAAS,MAAM,QAAQ;AAC7B,UAAM,SAAS,MAAM,QAAQ;AAC7B,QAAI,WAAW,QAAQ;AACrB,WAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,SAAkC,CAAC;AACzC,QAAI,MAAM,aAAa;AACrB,aAAO,WAAW,KAAK,SAAS,MAAM,UAAU,GAAG,EAAE,WAAW;AAClE,QAAI,MAAM,mBAAmB,QAAW;AACtC,aAAO,iBAAiB,KAAK,OAAO,MAAM,gBAAgB,GAAG,EAAE,iBAAiB;AAAA,IAClF;AACA,UAAM,QAAQ,oBAAI,IAAI;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,eAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,UAAI,CAAC,MAAM,IAAI,GAAG,EAAG,MAAK,WAAW,IAAI,KAAK,KAAK;AAAA,IACrD;AACA,QAAI,QAAQ;AACV,aAAO;AAAA,QACL,KAAK,KAAK,OAAO,MAAM,KAAK,GAAG,EAAE,MAAM;AAAA,QACvC,GAAI,MAAM,YAAY,SAClB,EAAE,SAAS,KAAK,aAAa,MAAM,SAAS,GAAG,EAAE,UAAU,EAAE,IAC7D,CAAC;AAAA,QACL,GAAG;AAAA,MACL;AAAA,IACF;AACA,WAAO;AAAA,MACL,KAAK,KAAK,OAAO,MAAM,KAAK,GAAG,EAAE,MAAM;AAAA,MACvC,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,KAAK,QAAQ,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACnF,GAAI,MAAM,QAAQ,SAAY,EAAE,KAAK,KAAK,OAAO,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC;AAAA,MAC9E,GAAI,MAAM,QAAQ,SAAY,EAAE,KAAK,KAAK,aAAa,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC;AAAA,MACpF,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA,EAGA,YAAY,OAAgB,IAAmC;AAC7D,QAAIA,eAAc,KAAK,KAAK,MAAM,QAAQ,UAAa,MAAM,QAAQ,QAAW;AAC9E,YAAM,QAAQ,CAAC,QAAQ,OAAO,OAAO,WAAW,YAAY,kBAAkB,OAAO,KAAK;AAC1F,iBAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,YAAI,CAAC,MAAM,SAAS,GAAG,EAAG,MAAK,WAAW,IAAI,KAAK,KAAK;AAAA,MAC1D;AACA,YAAM,MAA+B,CAAC;AACtC,UAAI,MAAM,SAAS,OAAW,KAAI,OAAO,KAAK,QAAQ,MAAM,MAAM,GAAG,EAAE,OAAO;AAC9E,UAAI,MAAM,QAAQ,OAAW,KAAI,MAAM,KAAK,OAAO,MAAM,KAAK,GAAG,EAAE,MAAM;AACzE,UAAI,MAAM,QAAQ,OAAW,KAAI,MAAM,KAAK,aAAa,MAAM,KAAK,GAAG,EAAE,MAAM;AAC/E,UAAI,MAAM,YAAY;AACpB,YAAI,UAAU,KAAK,aAAa,MAAM,SAAS,GAAG,EAAE,UAAU;AAChE,UAAI,MAAM,aAAa;AACrB,YAAI,WAAW,KAAK,SAAS,MAAM,UAAU,GAAG,EAAE,WAAW;AAC/D,UAAI,MAAM,mBAAmB;AAC3B,YAAI,iBAAiB,KAAK,OAAO,MAAM,gBAAgB,GAAG,EAAE,iBAAiB;AAC/E,aAAO;AAAA,IACT;AACA,WAAO,KAAK,OAAO,OAAO,EAAE;AAAA,EAC9B;AAAA,EAEA,MAAM,OAAgB,IAAuB;AAC3C,UAAM,SAAS,WAAW,KAAK;AAC/B,QAAI,CAAC;AACH,WAAK,KAAK,IAAI,gEAAgE,KAAK;AACrF,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,OAAgB,IAA6B;AACrD,QAAI,CAACA,eAAc,KAAK,EAAG,MAAK,KAAK,IAAI,8CAA8C,KAAK;AAC5F,UAAM,MAAuB,CAAC;AAC9B,QAAI,MAAM,cAAc;AACtB,UAAI,YAAY,KAAK,QAAQ,MAAM,WAAW,GAAG,EAAE,YAAY;AACjE,QAAI,MAAM,aAAa,OAAW,KAAI,WAAW,KAAK,QAAQ,MAAM,UAAU,GAAG,EAAE,WAAW;AAC9F,QAAI,MAAM,UAAU,QAAW;AAC7B,UAAI,MAAM,UAAU,UAAU,MAAM,UAAU;AAC5C,aAAK,KAAK,GAAG,EAAE,UAAU,sBAAsB,MAAM,KAAK;AAC5D,UAAI,QAAQ,MAAM;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAgB,IAAwB;AAC5C,QAAI,CAACA,eAAc,KAAK,EAAG,MAAK,KAAK,IAAI,iDAAiD,KAAK;AAC/F,UAAM,MAAkB,CAAC;AACzB,eAAW,OAAO,CAAC,SAAS,UAAU,GAAY;AAChD,UAAI,MAAM,GAAG,MAAM,OAAW;AAC9B,YAAM,QAAQ,MAAM,GAAG;AACvB,UAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,KAAK,CAAC,MAAM,CAACA,eAAc,CAAC,CAAC;AAC9D,aAAK,KAAK,GAAG,EAAE,IAAI,GAAG,IAAI,4BAA4B,KAAK;AAC7D,UAAI,GAAG,IAAI;AAAA,IACb;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,OAAgB,IAA2B;AAChD,QAAI,CAACA,eAAc,KAAK,GAAG;AACzB,WAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,MAAqB,CAAC;AAC5B,eAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,UAAI,QAAQ,WAAW,QAAQ,WAAY,MAAK,WAAW,IAAI,KAAK,CAAC,SAAS,UAAU,CAAC;AAAA,IAC3F;AACA,QAAI,MAAM,UAAU;AAClB,UAAI,QAAQ,KAAK,QAAQ,MAAM,OAAO,GAAG,EAAE,UAAU,EAAE,aAAa,KAAK,CAAC;AAC5E,QAAI,MAAM,aAAa,QAAW;AAChC,UAAI,CAACA,eAAc,MAAM,QAAQ;AAC/B,aAAK,KAAK,GAAG,EAAE,aAAa,oDAA+C,MAAM,QAAQ;AAC3F,YAAM,WAAgD,CAAC;AACvD,iBAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ,MAAM,QAAQ,GAAG;AACxD,YAAI,UAAU,YAAY,UAAU;AAClC,eAAK,KAAK,GAAG,EAAE,aAAa,EAAE,IAAI,wBAAwB,KAAK;AACjE,iBAAS,EAAE,IAAI;AAAA,MACjB;AACA,UAAI,WAAW;AAAA,IACjB;AACA,WAAO;AAAA,EACT;AACF;AAGA,SAAS,YAAY,QAAyD;AAC5E,QAAM,QAAkB,CAAC;AACzB,QAAM,WAAgD,CAAC;AACvD,MAAI,WAAW;AACf,MAAI,cAAc;AAClB,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,MAAO;AACZ,QAAI,MAAM,OAAO;AACf,iBAAW;AACX,iBAAW,MAAM,MAAM,MAAO,KAAI,CAAC,MAAM,SAAS,EAAE,EAAG,OAAM,KAAK,EAAE;AAAA,IACtE;AACA,QAAI,MAAM,UAAU;AAClB,oBAAc;AACd,aAAO,OAAO,UAAU,MAAM,QAAQ;AAAA,IACxC;AAAA,EACF;AACA,SAAO,EAAE,GAAI,WAAW,EAAE,MAAM,IAAI,CAAC,GAAI,GAAI,cAAc,EAAE,SAAS,IAAI,CAAC,EAAG;AAChF;AAGO,SAAS,kBAAkB,OAAgB,SAAiD;AACjG,MAAI,UAAU,UAAU,UAAU,YAAY,UAAU,SAAU,QAAO;AACzE,MAAI,OAAO,UAAU,YAAY,sBAAsB,KAAK,KAAK,EAAG,QAAO,EAAE,KAAK,MAAM;AACxF,MAAIA,eAAc,KAAK,KAAK,OAAO,MAAM,QAAQ,YAAY,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AAC5F,WAAO,EAAE,KAAK,MAAM,IAAI;AAAA,EAC1B;AACA,MAAI,QAAS,QAAO,QAAQ,KAAK;AACjC,QAAM,IAAI;AAAA,IACR,+FAA+F,SAAS,KAAK,CAAC;AAAA,EAChH;AACF;AAGO,SAAS,WAAW,OAAuC;AAChE,MAAI;AACJ,MAAI;AACJ,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,QAAQ,iBAAiB,KAAK,MAAM,KAAK,CAAC;AAChD,QAAI,CAAC,MAAO,QAAO;AACnB,YAAQ,OAAO,MAAM,CAAC,CAAC;AACvB,YAAQ,OAAO,MAAM,CAAC,CAAC;AAAA,EACzB,WAAWA,eAAc,KAAK,GAAG;AAC/B,YAAQ,MAAM;AACd,YAAQ,MAAM;AAAA,EAChB,MAAO,QAAO;AACd,MACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,CAAC,OAAO,UAAU,KAAK,KACvB,CAAC,OAAO,UAAU,KAAK,KACvB,QAAQ,KACR,QAAQ,KACR,QAAQ,OACR;AACA,WAAO;AAAA,EACT;AACA,SAAO,EAAE,OAAO,MAAM;AACxB;AAUA,IAAM,cAAc,oBAAI,IAAI;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,eAAe,oBAAI,IAAI,CAAC,WAAW,WAAW,UAAU,CAAC;AAGxD,IAAM,cAAiC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,SAAS,QACP,KACA,GACAE,SACA,OACO;AACP,QAAM,KAAK,CAAC,QAAiBA,UAAS,GAAGA,OAAM,IAAI,GAAG,KAAK;AAC3D,QAAM,QAAe,CAAC;AACtB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,UAAU,UAAa,aAAa,IAAI,GAAG,EAAG;AAClD,MAAE,QAAQ,MAAM,UAAU,OAAO,KAAK,OAAO,IAAI,GAAGA,OAAM,CAAC;AAAA,EAC7D;AAEA,QAAM,UAAiD,CAAC;AACxD,MAAI,IAAI,WAAW,QAAW;AAC5B,UAAM,QAAQ,EAAE;AAAA,MAAQ,MACtB,QAAQ,EAAE,YAAY,IAAI,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG,QAAQ,CAAC;AAAA,IACrF;AACA,QAAI,MAAO,SAAQ,mBAAmB,IAAI;AAAA,EAC5C;AACA,MAAI,IAAI,YAAY,QAAW;AAC7B,QAAI,CAACF,eAAc,IAAI,OAAO,GAAG;AAC/B,QAAE,QAAQ,MAAM,EAAE,KAAK,GAAG,SAAS,GAAG,8BAA8B,IAAI,OAAO,CAAC;AAAA,IAClF,OAAO;AACL,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,IAAI,OAAO,GAAG;AACvD,YAAI,IAAI,WAAW,UAAa,SAAS,qBAAqB;AAC5D,YAAE,SAAS;AAAA,YACT,4CAA4C,EAAE,MAAM;AAAA,UACtD;AAAA,QACF;AACA,cAAM,SAAS,EAAE;AAAA,UAAQ,MACvB,QACI,EAAE,YAAY,OAAO,GAAG,WAAW,IAAI,EAAE,CAAC,IAC1C,EAAE,OAAO,OAAO,GAAG,WAAW,IAAI,EAAE,CAAC;AAAA,QAC3C;AACA,YAAI,OAAQ,SAAQ,IAAI,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,KAAK,OAAO,EAAE,SAAS,EAAG,OAAM,UAAU;AACrD,SAAO;AACT;AAEA,SAAS,UACP,OACA,KACA,OACA,IACA,GACAE,SACM;AACN,UAAQ,KAAK;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AACH;AAAA,IACF,KAAK;AACH,YAAM,gBAAgB,EAAE,OAAO,OAAO,GAAG,GAAG,CAAC;AAC7C;AAAA,IACF,KAAK;AACH,YAAM,QAAQ,EAAE,QAAQ,OAAO,GAAG,GAAG,GAAG,EAAE,aAAa,KAAK,CAAC;AAC7D;AAAA,IACF,KAAK;AACH,YAAM,YAAY,EAAE,QAAQ,OAAO,GAAG,GAAG,GAAG,EAAE,aAAa,KAAK,CAAC;AACjE;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,YAAM,GAAG,IAAI,EAAE,QAAQ,OAAO,GAAG,GAAG,GAAG,EAAE,aAAa,KAAK,CAAC;AAC5D;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,YAAM,GAAG,IAAI,EAAE,OAAO,OAAO,GAAG,GAAG,CAAC;AACpC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,YAAM,GAAG,IAAI,EAAE,OAAO,OAAO,GAAG,GAAG,CAAC;AACpC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,YAAM,GAAG,IAAI,EAAE,OAAO,OAAO,GAAG,GAAG,GAAG,EAAE,KAAK,GAAG,SAAS,KAAK,CAAC;AAC/D;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,YAAM,GAAG,IAAI,EAAE,QAAQ,OAAO,GAAG,GAAG,CAAC;AACrC;AAAA,IACF,KAAK;AACH,YAAM,QAAQ,EAAE,MAAM,OAAO,GAAG,GAAG,CAAC;AACpC;AAAA,IACF,KAAK;AACH,YAAM,YAAY,EAAE,UAAU,OAAO,GAAG,GAAG,CAAC;AAC5C;AAAA,IACF,KAAK;AACH,YAAM,QAAQ,EAAE,MAAM,OAAO,GAAG,GAAG,CAAC;AACpC;AAAA,IACF,KAAK;AACH,YAAM,SAAS,EAAE,OAAO,OAAO,GAAG,GAAG,CAAC;AACtC;AAAA,IACF,KAAK;AACH,YAAM,iBAAiB,EAAE,QAAQ,OAAO,GAAG,GAAG,GAAG,EAAE,aAAa,KAAK,CAAC;AACtE;AAAA,IACF,KAAK;AACH,YAAM,SAAS,EAAE,OAAO,OAAO,GAAG,GAAG,CAAC;AACtC;AAAA,IACF,KAAK;AACH,YAAM,kBAAkB,EAAE,QAAQ,OAAO,GAAG,GAAG,CAAC;AAChD;AAAA,IACF;AACE,QAAE,WAAWA,SAAQ,KAAK,WAAW;AAAA,EACzC;AACF;AAEA,SAAS,iBACP,MACA,OACc;AACd,QAAM,WACH,MAA4B,QAAQ,UAAc,MAA4B,QAAQ;AACzF,MAAI,YAAY,CAAC,KAAM,QAAO;AAE9B,QAAM,UAAU,mBAAmB,IAAI,IAAI,CAAC,QAAQ,OAAO,KAAK,IAAI,CAAC,SAAS;AAC9E,QAAM,SAAS,OAAO;AAAA,IACpB,OAAO,QAAQ,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,SAAS,GAAG,CAAC;AAAA,EAChF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAA2D;AACrF,QAAMC,SAAQ,OAAO,KAAK,OAAO;AACjC,MAAIA,OAAM,SAAS,mBAAmB,EAAG,QAAO;AAChD,MAAIA,OAAM,WAAW,EAAG,QAAOA,OAAM,CAAC;AACtC,SAAO;AACT;AAEA,SAAS,oBACP,SACA,UACA,UAC6D;AAC7D,MAAI,OAAO,OAAO,SAAS,QAAQ,EAAG,QAAO,EAAE,SAAS,UAAU,SAAS;AAC3E,QAAM,WAAW,QAAQ,QAAQ;AACjC,QAAM,SAAS;AAAA,IACb,GAAI,UAAU,aAAa,SAAY,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,IAC1E,GAAI,UAAU,mBAAmB,SAAY,EAAE,gBAAgB,SAAS,eAAe,IAAI,CAAC;AAAA,EAC9F;AACA,MAAI,gBAAgB,KAAK,SAAS,KAAK,CAAC,GAAG;AACzC,WAAO,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,QAAQ,GAAG,EAAE,KAAK,SAAS,KAAK,GAAG,GAAG,OAAO,EAAE,GAAG,SAAS;AAAA,EAC9F;AACA,QAAM,EAAE,KAAK,KAAK,IAAI,iBAAiB,QAAQ;AAC/C,QAAM,OACJ,YAAY,oBAAoB,QAAQ,IACpC,EAAE,GAAG,UAAU,KAAK,KAAK,IACzB,EAAE,KAAK,MAAM,GAAG,OAAO;AAC7B,SAAO,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,QAAQ,GAAG,KAAK,GAAG,SAAS;AAC/D;AAOO,SAAS,WAAW,KAAa,QAA6B,CAAC,GAAmB;AACvF,QAAM,MAAM,MAAM,OAAO,QAAQ;AACjC,QAAM,WAAqB,CAAC;AAC5B,QAAM,SAAS,eAAe,KAAK,MAAM,UAAU;AACnD,QAAM,SAAS,QAAQ,aAAaJ,MAAK,SAAS,OAAO,UAAU,IAAI;AACvE,QAAM,EAAE,UAAU,aAAa,GAAG,KAAK,IAAK,QAAQ,UAAU,CAAC;AAC/D,QAAM,OAAO,eAAe,MAAM,KAAK,QAAQ;AAC/C,QAAM,YAAY,IAAI,UAAU,QAAQ,QAAQ;AAChD,QAAM,YAAY,QAAQ,MAAM,WAAW,IAAI,KAAK;AAEpD,MAAI,eAAsB,CAAC;AAC3B,MAAI,MAAM,YAAY,QAAW;AAC/B,UAAM,WAAWC,eAAc,WAAW,IAAI,cAAc,CAAC;AAC7D,UAAM,UAAUA,eAAc,SAAS,MAAM,OAAO,CAAC,IACjD;AAAA,MACE,SAAS,MAAM,OAAO;AAAA,MACtB;AAAA,MACA;AAAA,MACA,YAAY,MAAM,OAAO;AAAA,IAC3B,IACA;AACJ,QAAI,CAACA,eAAc,OAAO,GAAG;AAC3B,YAAM,OAAO,OAAO,KAAK,QAAQ;AACjC,YAAM,IAAI;AAAA,QACR,kCAAkC,MAAM,OAAO,iCAAiC,KAAK,SAAS,SAAS,KAAK,KAAK,IAAI,CAAC,KAAK,cAAc,iCAAiC,MAAM;AAAA,MAClL;AAAA,IACF;AACA,mBAAe,QAAQ,SAAS,WAAW,YAAY,MAAM,OAAO,IAAI,IAAI;AAAA,EAC9E;AAGA,MAAI,UAAwC,UAAU,UACjD,UAAU,UACX,EAAE,GAAG,kBAAkB,QAAQ;AAInC,MAAI,gBAAgB,UAAa,CAACA,eAAc,WAAW,GAAG;AAC5D,cAAU,QAAQ,MAAM,UAAU,KAAK,YAAY,+BAA+B,WAAW,CAAC;AAAA,EAChG;AACA,aAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQA,eAAc,WAAW,IAAI,cAAc,CAAC,CAAC,GAAG;AACvF,QAAI;AACJ,QAAI,SAAS,MAAM,QAAS,SAAQ;AAAA,aAC3B,CAACA,eAAc,GAAG,GAAG;AAC5B,gBAAU,QAAQ,MAAM,UAAU,KAAK,YAAY,IAAI,IAAI,oBAAoB,GAAG,CAAC;AACnF;AAAA,IACF,MAAO,SAAQ,QAAQ,eAAe,KAAK,KAAK,CAAC,CAAC,GAAG,WAAW,YAAY,IAAI,IAAI,IAAI;AACxF,eAAW,CAAC,QAAQ,KAAK,KAAK,OAAO,QAAQ,MAAM,WAAW,CAAC,CAAC,GAAG;AACjE,YAAM,UACH,MAA4B,QAAQ,UACpC,MAA4B,QAAQ;AACvC,UAAI,CAAC,WAAW,CAAC,OAAO,OAAO,SAAS,MAAM,GAAG;AAC/C,kBAAU,OAAO;AAAA,UACf,8BAA8B,IAAI,YAAY,MAAM,KAAK,MAAM,cAAc,IAAI,4BAA4B,MAAM,mBAAmB,OAAO,KAAK,OAAO,EAAE,KAAK,IAAI,KAAK,MAAM;AAAA,QACjL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,YAAU,cAAc;AAExB,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,aAAa,WAAW,CAAC,CAAC,GAAG;AACtE,cAAU,EAAE,GAAG,SAAS,CAAC,IAAI,GAAG,iBAAiB,QAAQ,IAAI,GAAG,KAAK,EAAE;AAAA,EACzE;AACA,QAAM,YAAY,MAAM,aAAa,CAAC;AACtC,MAAI,UAAU,QAAS,WAAU,EAAE,GAAG,SAAS,GAAG,UAAU,QAAQ;AAEpE,MAAI,WACF,UAAU,iBACV,aAAa,iBACb,UAAU,iBACV,mBAAmB,OAAO;AAE5B,MAAI,UAAU,WAAW,UAAa,UAAU,OAAO,KAAK,MAAM,IAAI;AACpE,UAAM,UAAU,oBAAoB,SAAS,YAAY,qBAAqB,UAAU,MAAM;AAC9F,cAAU,QAAQ;AAClB,eAAW,QAAQ;AAAA,EACrB;AAEA,MAAI,aAAa,QAAW;AAC1B,UAAM,IAAI;AAAA,MACR,4BAA4B,MAAM,iBAAiB,OAAO,KAAK,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACpF;AAAA,EACF;AACA,MAAI,CAAC,OAAO,OAAO,SAAS,QAAQ,GAAG;AACrC,UAAM,IAAI;AAAA,MACR,qCAAqC,QAAQ,8BAA8B,OAAO,KAAK,OAAO,EAAE,KAAK,IAAI,KAAK,MAAM,2BAA2B,MAAM;AAAA,IACvJ;AAAA,EACF;AAEA,MAAI,UAAU,cAAc,QAAW;AACrC,UAAM,UAAU,QAAQ,QAAQ;AAChC,QAAI,oBAAoB,OAAO;AAC7B,gBAAU,EAAE,GAAG,SAAS,CAAC,QAAQ,GAAG,EAAE,GAAG,SAAS,KAAK,UAAU,UAAU,EAAE;AAAA,QAC1E,UAAS,KAAK,iCAAiC,QAAQ,sBAAsB;AAAA,EACpF;AACA,MAAI,UAAU,QAAQ,UAAa,UAAU,aAAa,QAAW;AACnE,UAAM,OAAqC,CAAC;AAC5C,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,UAAI,UAAwB;AAC5B,UAAI,UAAU,OAAO,oBAAoB,KAAK,GAAG;AAC/C,kBAAU,EAAE,GAAG,OAAO,KAAK,EAAE,GAAI,MAAM,OAAO,CAAC,GAAI,GAAG,UAAU,IAAI,EAAE;AAAA,MACxE;AACA,UAAI,UAAU,aAAa,OAAW,WAAU,EAAE,GAAG,SAAS,UAAU,UAAU,SAAS;AAC3F,WAAK,IAAI,IAAI;AAAA,IACf;AACA,cAAU;AAAA,EACZ;AAEA,QAAM,UAA+B,CAAC;AACtC,aAAW,SAAS,CAAC,WAAW,cAAc,SAAkB,GAAG;AACjE,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,UAAI,UAAU,OAAW;AACzB,UACE,YAAY,IAAI,GAAG,KACnB,CAAC,SAAS,aAAa,QAAQ,eAAe,SAAS,OAAO,EAAE,SAAS,GAAG,GAC5E;AACA;AAAC,QAAC,QAAoC,GAAG,IAAI;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAsB;AAAA,IAC1B,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA,eAAe;AAAA,IACf,gBAAgB,CAAC,GAAI,QAAQ,kBAAkB,kBAAkB,kBAAkB,CAAC,CAAE;AAAA,IACtF,QAAQ,YAAY,CAAC,UAAU,QAAQ,aAAa,QAAQ,UAAU,MAAM,CAAC;AAAA,IAC7E,WAAW;AAAA,MACT,GAAG;AAAA,MACH,GAAI,UAAU,aAAa,CAAC;AAAA,MAC5B,GAAI,aAAa,aAAa,CAAC;AAAA,MAC/B,GAAI,UAAU,aAAa,CAAC;AAAA,IAC9B;AAAA,IACA,SAAS,QAAQ,WAAWD,MAAK,QAAQ,GAAG;AAAA,EAC9C;AACA,SAAO,EAAE,SAAS,UAAU,YAAY,QAAQ,YAAY,SAAS,MAAM,QAAQ;AACrF;AAMO,SAAS,eAAe,KAAa,QAAsC,CAAC,GAAe;AAChG,QAAM,aAAkC,OAAO,UAAU,WAAW,EAAE,YAAY,MAAM,IAAI;AAC5F,SAAO,WAAW,KAAK,UAAU,EAAE;AACrC;;;ACpgCA,OAAOK,WAAU;AAKV,SAAS,eAAe,SAA8C;AAC3E,SAAO,QAAQ,UAAUC,MAAK,QAAQ,QAAQ,OAAO,IAAI,QAAQ,IAAI;AACvE;AAQO,SAAS,kBACd,SACA,MACQ;AACR,QAAM,WAAW,QAAQ,QAAQ;AACjC,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAS,QAAQ,GAAG;AAC7C,UAAM,OAAO,OAAO,KAAK,QAAQ,OAAO;AACxC,UAAM,IAAI;AAAA,MACR,qBAAqB,SAAS,SAAY,gBAAgB,eAAe,MAAM,QAAQ,8BAA8B,KAAK,KAAK,IAAI,KAAK,MAAM;AAAA,IAChJ;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,oBACd,SACA,MACc;AACd,QAAM,SAAS,QAAQ,QAAQ,kBAAkB,SAAS,IAAI,CAAC;AAC/D,MAAI,CAAC,oBAAoB,MAAM,EAAG,QAAO,EAAE,GAAG,OAAO;AACrD,QAAM,MAAM,OAAO,OAAO;AAC1B,SAAO,EAAE,GAAG,QAAQ,KAAKC,MAAK,WAAW,GAAG,IAAI,MAAMA,MAAK,QAAQ,eAAe,OAAO,GAAG,GAAG,EAAE;AACnG;;;ACAA,IAAM,eAAe;AAEd,SAAS,UAAU,OAAsC,IAAY,KAAuB;AACjG,MAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,aAAW,SAAS,OAAO;AACzB,UAAM,QAAQ,MAAM,QAAQ,GAAG;AAC/B,UAAM,SAAS,UAAU,KAAK,QAAQ,MAAM,MAAM,GAAG,KAAK;AAC1D,UAAM,UAAU,UAAU,KAAK,SAAY,MAAM,MAAM,QAAQ,CAAC;AAChE,UAAM,YACJ,WAAW,MACX,WAAW,OACV,OAAO,SAAS,IAAI,KAAK,GAAG,WAAW,OAAO,MAAM,GAAG,EAAE,CAAC;AAC7D,QAAI,CAAC,UAAW;AAChB,QAAI,YAAY,UAAa,YAAY,IAAK,QAAO;AAAA,EACvD;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAgB,GAAY,MAA6B;AAClF,MAAI,EAAE,cAAe,QAAO;AAC5B,SAAO,KAAK,WAAW,KAAK,EAAE,KAAK,EAAE,YAAY,KAAK;AACxD;AAOO,SAAS,cACd,MACA,UACA,OAAoB,CAAC,GACrB,YACgB;AAChB,MAAI,UAAU,KAAK,OAAO,KAAK,EAAE,EAAG,QAAO,CAAC;AAC5C,QAAM,OAAO,SAAS,OAAO,CAAC,MAAM,CAAC,UAAU,KAAK,OAAO,KAAK,IAAI,EAAE,GAAG,CAAC;AAC1E,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,UAAU,SAAS,SAAS,KAAK;AACvC,UAAM,QAAQ,CAAC,YAAY,UAAU,GAAG,OAAO,6BAA6B,MAAS,EAAE;AAAA,MACrF;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,QACE,IAAI,KAAK;AAAA,QACT,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,KAAK,IAAI,EAAE,IAAI,CAAC;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,oBAAI,IAAuB;AAC1C,aAAW,KAAK,MAAM;AACpB,UAAM,IAAI,EAAE,WAAW;AACvB,UAAM,IAAI,OAAO,IAAI,CAAC;AACtB,QAAI,EAAG,GAAE,KAAK,CAAC;AAAA,QACV,QAAO,IAAI,GAAG,CAAC,CAAC,CAAC;AAAA,EACxB;AACA,QAAM,MAAsB,CAAC;AAC7B,aAAW,CAAC,SAAS,KAAK,KAAK,QAAQ;AACrC,UAAM,SAAS,MAAM,KAAK,CAAC,MAAM,kBAAkB,MAAM,GAAG,IAAI,MAAM,QAAQ,IAC1E,WACA;AACJ,UAAM,WAAW,CAAC,GAAG,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACzD,UAAM,QAAQ,SAAS,MAAM,GAAG,YAAY;AAC5C,QAAI,SAAS,SAAS,MAAM,OAAQ,OAAM,KAAK,KAAK,SAAS,SAAS,MAAM,MAAM,QAAQ;AAC1F,UAAM,OAAO,MAAM,KAAK,IAAI;AAC5B,QAAI,KAAK;AAAA,MACP,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,QAAQ,UAAU,GAAG,OAAO,KAAK,IAAI,KAAK;AAAA,IAC5C,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,IAAM,cAAsD,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAAE;AAGvF,SAAS,aAAa,UAAmD;AAC9E,SAAO,CAAC,GAAG,QAAQ,EAAE;AAAA,IACnB,CAAC,GAAG,MAAM,YAAY,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,KAAK,EAAE,GAAG,cAAc,EAAE,EAAE;AAAA,EACpF;AACF;AAEO,SAAS,gBAAgB,UAI9B;AACA,QAAM,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAAE;AAClD,aAAW,KAAK,SAAU,SAAQ,EAAE,MAAM;AAC1C,SAAO;AACT;;;AC9HA,IAAM,aAAa,oBAAI,IAAI;AAAA,EACzB;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF,CAAC;AAEM,SAAS,cAAc,IAAuC;AACnE,MAAI,MAAM,UAAW,MAAM,OAAS,QAAO;AAC3C,MAAK,MAAM,UAAW,MAAM,UAAa,MAAM,SAAU,MAAM,OAAS;AACtE,WAAO;AAAA,EACT;AACA,MAAI,OAAO,QAAU,OAAO,KAAQ,QAAO;AAC3C,MACE,OAAO,QACP,OAAO,QACP,OAAO,QACN,MAAM,QAAU,MAAM,QACtB,MAAM,QAAU,MAAM,MACvB;AACA,WAAO;AAAA,EACT;AACA,MAAI,WAAW,IAAI,EAAE,EAAG,QAAO;AAC/B,SAAO;AACT;AAEA,IAAM,aACJ;AACF,IAAM,eAAe,WAAC,gCAA4B,GAAC;AACnD,IAAM,mBAAmB;AAEzB,SAAS,iBAAiB,IAAiC;AACzD,SAAO,OAAO,WAAc,GAAG,YAAY,CAAC,KAAK,KAAK,OAAQ,iBAAiB,KAAK,EAAE;AACxF;AAGA,SAAS,gBAAgB,KAAe,GAA+B;AACrE,WAAS,IAAI,IAAI,GAAG,KAAK,GAAG,KAAK;AAC/B,UAAM,KAAK,IAAI,CAAC,EAAE,YAAY,CAAC,KAAK;AACpC,QAAI,OAAO,SAAU,OAAO,SAAW,MAAM,UAAW,MAAM,OAAU;AACxE,WAAO,IAAI,CAAC;AAAA,EACd;AACA,SAAO;AACT;AAGA,SAAS,SACP,MACA,IACA,KACA,GACA,KACS;AACT,MAAI,OAAO,QAAU,OAAO,MAAQ;AAClC,UAAM,OAAO,gBAAgB,KAAK,CAAC;AACnC,UAAM,OAAO,IAAI,IAAI,CAAC;AACtB,QAAI,OAAO,QAAU,QAAQ,QAAQ,aAAa,KAAK,IAAI,KAAK,aAAa,KAAK,IAAI,GAAG;AACvF,aAAO;AAAA,IACT;AACA,WAAO,iBAAiB,IAAI,IAAI,CAAC,CAAC,KAAK,iBAAiB,IAAI;AAAA,EAC9D;AACA,SAAO,SAAS,UAAU;AAC5B;AAeO,SAAS,cAAc,KAA4B;AACxD,QAAM,MAAM,MAAM,KAAK,GAAG;AAC1B,QAAM,MAAM,WAAW,KAAK,GAAG;AAC/B,QAAM,OAAuB,CAAC;AAC9B,MAAI,UAAU;AACd,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAM,KAAK,IAAI,CAAC;AAChB,UAAM,KAAK,GAAG,YAAY,CAAC,KAAK;AAChC,UAAM,OAAO,cAAc,EAAE;AAC7B,QAAI,MAAM;AACR,UAAI,SAAS,SAAS,MAAM,UAAW,MAAM,QAAS;AACpD,mBAAW,OAAO,aAAa,KAAK,MAAO;AAAA,MAC7C;AACA,UAAI,CAAC,SAAS,MAAM,IAAI,KAAK,GAAG,GAAG,EAAG,MAAK,KAAK,EAAE,OAAO,QAAQ,WAAW,IAAI,KAAK,CAAC;AAAA,IACxF;AACA,cAAU,GAAG;AAAA,EACf;AACA,SAAO,EAAE,MAAM,QAAQ;AACzB;AAEO,IAAM,kBAAkB;AAQxB,SAAS,qBAAqB,KAAqB;AACxD,MAAI,UAAU;AACd,aAAW,MAAM,KAAK;AACpB,QAAI,CAAC,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,EAAG,YAAW;AAAA,EACzD;AACA,QAAM,EAAE,QAAQ,IAAI,cAAc,GAAG;AACrC,QAAM,MAAM,QAAQ,UAAU,MAAM;AACpC,SAAO,UAAU,GAAG,GAAG;AAAA,EAAK,eAAe,IAAI,OAAO,KAAK;AAC7D;AAGO,SAAS,eAAe,MAAwB;AACrD,SAAO,KACJ,MAAM,oBAAoB,EAC1B,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACnB;AAEO,SAAS,SAAS,GAAmB;AAC1C,SAAO,EAAE,QAAQ,SAAS,GAAG,EAAE,KAAK;AACtC;AAEO,SAAS,KAAK,GAAW,MAAM,KAAa;AACjD,QAAM,IAAI,SAAS,CAAC;AACpB,SAAO,EAAE,SAAS,MAAM,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ;AACxD;AAGO,SAAS,QAAQ,MAAc,OAAe,QAAgB,SAAS,IAAY;AACxF,QAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,MAAM;AACxC,QAAM,MAAM,KAAK,IAAI,KAAK,QAAQ,QAAQ,KAAK,IAAI,QAAQ,GAAG,IAAI,MAAM;AACxE,QAAM,OAAO,SAAS,KAAK,MAAM,OAAO,GAAG,CAAC;AAC5C,SAAO,GAAG,QAAQ,IAAI,QAAQ,EAAE,GAAG,IAAI,GAAG,MAAM,KAAK,SAAS,QAAQ,EAAE;AAC1E;AAGO,SAAS,MAAM,GAAmB;AACvC,SAAO,KAAK,UAAU,CAAC;AACzB;AAEO,SAAS,gBAAgB,IAAoB;AAClD,SAAO,KAAK,GAAG,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,CAAC;AAC5D;;;ACxEO,IAAM,8BAAyC;AAAA,EACpD;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AACF;AAGO,IAAM,sBAAiC;AAAA,EAC5C;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA,EAAE,OAAO,WAAW,OAAO,oBAAoB,IAAI,yBAAyB;AAAA,EAC5E;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AACF;AAGO,IAAM,yBAAoC;AAAA,EAC/C,EAAE,OAAO,gBAAgB,IAAI,yBAAyB;AAAA,EACtD;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AACF;AAMO,IAAM,0BAAqC;AAAA,EAChD;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA,EAAE,OAAO,iBAAiB,IAAI,6BAA6B;AAAA,EAC3D;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA,EAAE,OAAO,0BAA0B,IAAI,uCAAuC;AAAA,EAC9E;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA,EAAE,OAAO,aAAa,IAAI,4CAA4C;AAAA,EACtE,EAAE,OAAO,mBAAmB,IAAI,wDAAwD;AAC1F;AAEA,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG;AAEV,IAAM,gBACJ;AACF,IAAM,sBACJ;AAGK,IAAM,0BAAqC;AAAA,EAChD;AAAA,IACE,OAAO;AAAA,IACP,IAAI,IAAI,OAAO,SAAS,aAAa,gCAAgC,WAAW,QAAQ,IAAI;AAAA,EAC9F;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI,IAAI;AAAA,MACN,SAAS,WAAW,6BAA6B,mBAAmB;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AACF;AAGO,IAAM,iBAA4B;AAAA,EACvC,EAAE,OAAO,oBAAoB,IAAI,6CAA6C;AAAA,EAC9E;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AACF;AAGO,IAAM,gBAA2B;AAAA,EACtC,EAAE,OAAO,aAAa,IAAI,gBAAgB;AAAA,EAC1C,EAAE,OAAO,iBAAiB,IAAI,sBAAsB;AAAA,EACpD,EAAE,OAAO,YAAY,IAAI,8BAA8B;AAAA,EACvD,EAAE,OAAO,cAAc,IAAI,4BAA4B;AAAA,EACvD;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA,EAAE,OAAO,qBAAqB,IAAI,qCAAqC;AACzE;AAYA,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,0BAA0B;AAChC,IAAM,cAAc,oBAAI,QAAwB;AAEhD,SAAS,SAAS,IAAoB;AACpC,MAAI,IAAI,YAAY,IAAI,EAAE;AAC1B,MAAI,CAAC,GAAG;AACN,QAAI,IAAI,OAAO,GAAG,QAAQ,GAAG,GAAG,KAAK,GAAG;AACxC,gBAAY,IAAI,IAAI,CAAC;AAAA,EACvB;AACA,SAAO;AACT;AAGA,SAAS,UAAU,MAAc,OAAe,QAAkC;AAChF,MAAI,QAAQ;AACZ,MAAI,MAAM,QAAQ;AAClB,QAAM,WAAW,KAAK,IAAI,GAAG,QAAQ,eAAe;AACpD,QAAM,SAAS,KAAK,IAAI,KAAK,QAAQ,MAAM,eAAe;AAC1D,SAAO,QAAQ,YAAY,CAAC,eAAe,KAAK,KAAK,QAAQ,CAAC,CAAC,EAAG;AAClE,SAAO,MAAM,UAAU,CAAC,eAAe,KAAK,KAAK,GAAG,CAAC,EAAG;AACxD,SAAO,CAAC,OAAO,GAAG;AACpB;AAQA,SAAS,YAAY,UAAqB,MAAc,SAAyB;AAC/E,QAAM,OAA+D,CAAC;AACtE,aAAW,KAAK,UAAU;AACxB,UAAM,QAAQ,UAAW,EAAE,SAAS,EAAE,QAAS;AAC/C,UAAM,KAAK,SAAS,EAAE,EAAE;AACxB,OAAG,YAAY;AACf,QAAI,IAAI;AACR,eAAW,KAAK,KAAK,SAAS,EAAE,GAAG;AACjC,UAAI,EAAE,IAAI,wBAAyB;AACnC,YAAM,QAAQ,EAAE,SAAS;AACzB,YAAM,OAAO,UAAU,MAAM,OAAO,EAAE,CAAC,EAAE,MAAM;AAC/C,YAAM,QAAQ,KAAK;AAAA,QACjB,CAAC,MAAM,EAAE,UAAU,SAAS,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC;AAAA,MACvE;AACA,UAAI,MAAO;AACX,WAAK,KAAK,EAAE,GAAG,OAAO,QAAQ,EAAE,CAAC,EAAE,QAAQ,MAAM,MAAM,CAAC;AACxD;AAAA,IACF;AAAA,EACF;AACA,SAAO,KAAK,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAC9C;AAGA,SAAS,WAAW,UAAgC;AAClD,SAAO,CAAC,QACN,YAAY,UAAU,IAAI,MAAM,KAAK,EAAE;AAAA,IACrC,CAAC,MAAM,GAAG,IAAI,KAAK,KAAK,EAAE,EAAE,KAAK,OAAO,MAAM,QAAQ,IAAI,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAAA,EACrF;AACJ;AAGA,SAAS,cAAc,UAAqB,KAAwB;AAClE,SAAO,CAAC,QAAQ;AACd,UAAM,OAAO,YAAY,UAAU,IAAI,MAAM,IAAI;AACjD,QAAI,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,EAAE,OAAO,IAAK,QAAO,CAAC;AACzE,UAAM,QAAQ,KAAK,CAAC;AACpB,UAAM,SAAS,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,KAAK;AACpD,WAAO,CAAC,GAAG,IAAI,KAAK,KAAK,MAAM,OAAO,MAAM,QAAQ,IAAI,MAAM,MAAM,OAAO,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAE;AAAA,EACjG;AACF;AAGA,IAAM,sBACJ;AAGF,IAAM,mBACJ;AAEF,IAAM,eACJ;AAGF,SAAS,qBAAqB,GAAoB;AAChD,SACE,EAAE,UAAU,KACZ,CAAC,aAAa,KAAK,CAAC,MACnB,gDAAgD,KAAK,CAAC,KAAK,cAAc,KAAK,CAAC;AAEpF;AASA,SAAS,gBAAgB,UAAkB,KAAkB,MAAoC;AAC/F,QAAM,YAAY,MAAM,YAAY;AACpC,QAAM,OAAO,IAAI,SACd,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,GAAG,KAAK,QAAQ,CAAC,EACpD,IAAI,CAAC,MAAM,MAAM,EAAE,IAAI,CAAC;AAC3B,QAAM,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,KAAK,YAAY,CAAC,CAAC;AACnE,QAAM,UAAU,oBAAoB,KAAK,QAAQ;AACjD,MAAI,QAAS,MAAK,KAAK,MAAM,QAAQ,CAAC,CAAC,CAAC;AACxC,MAAI,eAAe,KAAK,QAAQ,GAAG;AACjC,eAAW,KAAK,SAAS,SAAS,gBAAgB,GAAG;AACnD,YAAM,KAAK,EAAE,CAAC;AACd,YAAM,QAAQ,GAAG,YAAY;AAC7B,UAAI,CAAC,qBAAqB,EAAE,KAAK,UAAU,aAAa,MAAM,IAAI,KAAK,EAAG;AAC1E,YAAM,QAAQ,GAAG,MAAM,EAAE,CAAC;AAC1B,UAAI,CAAC,KAAK,SAAS,KAAK,EAAG,MAAK,KAAK,KAAK;AAAA,IAC5C;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,gBAAgB,MAAiB,KAAwB;AAChE,SAAO,CAAC,KAAK,QAAQ;AACnB,QAAI,IAAI,SAAS,OAAQ,QAAO,CAAC;AACjC,UAAM,MAAgB,CAAC;AACvB,eAAW,YAAY,eAAe,IAAI,IAAI,GAAG;AAC/C,YAAM,OAAO,gBAAgB,UAAU,KAAK,IAAI,QAAQ;AACxD,UAAI,KAAK,WAAW,EAAG;AACvB,YAAM,OAAO,KAAK,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,QAAQ,CAAC;AACnD,UAAI,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,OAAO,IAAK;AAC7D,YAAM,SAAS,KAAK,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK;AAClD,UAAI,KAAK,GAAG,IAAI,KAAK,WAAW,KAAK,KAAK,IAAI,CAAC,SAAS,MAAM,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,EAAE;AAAA,IAC9F;AACA,WAAO;AAAA,EACT;AACF;AAGA,IAAM,wBAAmC,wBAAwB,IAAI,CAAC,OAAO;AAAA,EAC3E,GAAG;AAAA,EACH,OAAO;AAAA,EACP,OAAO,WAAW,EAAE,KAAK;AAC3B,EAAE;AAEF,SAAS,eAAe,KAA+B;AACrD,QAAM,EAAE,MAAM,QAAQ,IAAI,cAAc,IAAI,GAAG;AAC/C,MAAI,KAAK,WAAW,EAAG,QAAO,CAAC;AAC/B,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,KAAK,MAAM;AACpB,UAAM,QAAQ,EAAE,SAAS,QAAQ,2BAA2B,gBAAgB,EAAE,SAAS;AACvF,WAAO,IAAI,QAAQ,OAAO,IAAI,KAAK,KAAK,KAAK,CAAC;AAAA,EAChD;AACA,QAAM,OAAO,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAO,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAE,EAAE,KAAK,IAAI;AAC9E,QAAM,SAAS,KAAK,qBAAqB,IAAI,IAAI,MAAM,GAAG,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG,EAAE;AACxF,QAAM,SAAS,UAAU,iBAAiB,MAAM,KAAK,SAAS,GAAG,CAAC,CAAC,KAAK;AACxE,SAAO;AAAA,IACL,GAAG,IAAI,KAAK,KAAK,KAAK,MAAM,4BAA4B,IAAI,WAAW,MAAM,UAAU,SAAS,CAAC,GAAG,MAAM;AAAA,EAC5G;AACF;AAEA,IAAM,aAAa;AACnB,IAAM,YAAY;AAClB,IAAM,WAAW,oBAAI,IAAI,CAAC,MAAM,UAC7B,QACF,CAAC;AAOK,SAAS,YACd,KAC4D;AAC5D,MAAI,SAAS;AACb,MAAI,YAAY;AAChB,MAAI,QAAQ;AACZ,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAM,KAAK,IAAI,CAAC;AAChB,QAAI,SAAS,IAAI,EAAE,GAAG;AACpB;AACA,eAAS;AACT,cAAQ;AAAA,IACV,WAAW,OAAO,MAAM;AACtB,cAAQ;AAAA,IACV,WAAW,MAAM,KAAK,EAAE,GAAG;AACzB;AACA,kBAAY,KAAK,IAAI,WAAW,MAAM;AACtC,cAAQ;AAAA,IACV,OAAO;AACL,UAAI,UAAU,aAAa,cAAc,SAAS,YAAY;AAC5D,eAAO,EAAE,KAAK,GAAG,QAAQ,WAAW,MAAM;AAAA,MAC5C;AACA,eAAS;AACT,kBAAY;AACZ,cAAQ;AACR,cAAQ;AAAA,IACV;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,KAA2B;AACpD,QAAM,MAAM,YAAY,IAAI,GAAG;AAC/B,MAAI,CAAC,IAAK,QAAO,CAAC;AAClB,QAAM,OACJ,IAAI,SAAS,YAAY,GAAG,IAAI,KAAK,iBAAiB,GAAG,IAAI,MAAM;AACrE,SAAO,CAAC,GAAG,IAAI,KAAK,KAAK,IAAI,WAAW,MAAM,KAAK,IAAI,IAAI,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE;AACnF;AAEA,IAAM,SAAS;AACf,IAAM,iBACJ;AAEF,SAAS,eAAe,KAA2B;AACjD,QAAM,MAAgB,CAAC;AACvB,aAAW,KAAK,IAAI,KAAK,SAAS,MAAM,GAAG;AACzC,UAAM,MAAM,EAAE,CAAC,EAAE,QAAQ,gBAAgB,EAAE;AAC3C,UAAM,QAAQ,EAAE,SAAS;AACzB,UAAM,UAAoB,CAAC;AAC3B,QAAI,YAAY,KAAK,GAAG,EAAG,SAAQ,KAAK,cAAc;AACtD,QAAI,kBAAkB,KAAK,GAAG,EAAG,SAAQ,KAAK,sBAAsB;AACpE,QAAI,4DAA4D,KAAK,GAAG,GAAG;AACzE,cAAQ,KAAK,iBAAiB;AAAA,IAChC;AACA,QAAI,eAAe,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,GAAG,QAAQ,GAAG,GAAG,KAAK,CAAC,GAAG;AACxE,cAAQ,KAAK,oBAAoB;AAAA,IACnC;AACA,QAAI,QAAQ,QAAQ;AAClB,UAAI,KAAK,GAAG,IAAI,KAAK,cAAc,QAAQ,KAAK,IAAI,CAAC,KAAK,MAAM,KAAK,KAAK,GAAG,CAAC,CAAC,EAAE;AAAA,IACnF;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,UAAU;AAEhB,SAAS,WAAW,MAAkC;AACpD,QAAM,QAAQ,OAAO,KAAK,KAAK,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,GAAG,QAAQ;AAChF,MAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,MAAI,YAAY;AAChB,aAAW,KAAK,MAAO,KAAK,KAAK,MAAQ,KAAK,OAAS,MAAM,MAAQ,MAAM,EAAM;AACjF,SAAO,YAAY,MAAM,UAAU,MAAM,MAAM,SAAS,QAAQ,IAAI;AACtE;AAEA,SAAS,gBAAgB,GAAoB;AAC3C,MAAI,gBAAgB,KAAK,CAAC,EAAG,QAAO;AACpC,MAAI,QAAQ,KAAK,CAAC,KAAK,QAAQ,KAAK,CAAC,EAAG,QAAO;AAC/C,MAAI,EAAE,SAAS,GAAG,EAAG,QAAO;AAC5B,MAAI,CAAC,SAAS,KAAK,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAG,QAAO;AACrE,QAAM,SAAS,EAAE,MAAM,cAAc,KAAK,CAAC,GAAG,SAAS,EAAE;AACzD,SAAO,SAAS;AAClB;AAEA,SAAS,aAAa,KAA+B;AACnD,QAAM,MAAoB,CAAC;AAC3B,aAAW,KAAK,IAAI,KAAK,QAAQ,QAAQ,GAAG,EAAE,SAAS,OAAO,GAAG;AAC/D,UAAM,OAAO,EAAE,CAAC;AAChB,QAAI,CAAC,gBAAgB,IAAI,EAAG;AAC5B,UAAM,UAAU,WAAW,IAAI;AAC/B,UAAM,YACJ,YAAY,UACZ,CAAC,GAAG,6BAA6B,GAAG,uBAAuB,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC;AAC7F,UAAM,QAAQ,KAAK,SAAS,KAAK,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,QAAQ;AAC7D,UAAM,OAAO,UAAU,eAAe,MAAM,KAAK,SAAS,GAAG,CAAC,CAAC,KAAK;AACpE,QAAI,KAAK;AAAA,MACP,SAAS,GAAG,IAAI,KAAK,KAAK,KAAK,MAAM,0BAA0B,MAAM,KAAK,CAAC,GAAG,IAAI;AAAA,MAClF,GAAI,YAAY,EAAE,UAAU,SAAkB,IAAI,CAAC;AAAA,IACrD,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAA6B;AACvD,QAAM,IAAI,KAAK;AACf,MAAI,OAAO,MAAM,SAAU,QAAO,CAAC,gBAAgB;AACnD,SAAO,EAAE,KAAK,MAAM,KAAK,CAAC,sBAAsB,IAAI,CAAC;AACvD;AAEA,SAAS,gBAAgB,MAAmB,KAA4B;AACtE,MAAI,OAAO,KAAK,gBAAgB,SAAU,QAAO,CAAC;AAClD,QAAM,MAAM,MAAM,KAAK,KAAK,WAAW,EAAE;AACzC,SAAO,MAAM,IAAI,uBACb;AAAA,IACE,kBAAkB,GAAG,iBAAiB,IAAI,oBAAoB;AAAA,EAChE,IACA,CAAC;AACP;AAEA,IAAM,gBAAgB;AACtB,IAAM,oBAAoB;AAC1B,IAAM,kBAAkB;AAExB,SAAS,WAAW,MAA6B;AAC/C,QAAM,OAAO,KAAK;AAClB,MAAI,OAAO,SAAS,YAAY,SAAS,GAAI,QAAO,CAAC,kBAAkB;AACvE,QAAM,MAAgB,CAAC;AACvB,MAAI,CAAC,cAAc,KAAK,IAAI,GAAG;AAC7B,UAAM,MAAM,CAAC,GAAG,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC;AAC/E,QAAI;AAAA,MACF,QAAQ,MAAM,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,IACpE;AAAA,EACF;AACA,QAAM,MAAM,MAAM,KAAK,IAAI,EAAE;AAC7B,MAAI,MAAM,gBAAiB,KAAI,KAAK,WAAW,GAAG,wBAAwB,eAAe,GAAG;AAC5F,SAAO;AACT;AAEA,SAAS,WAAW,MAA6B;AAC/C,MAAI,OAAO,KAAK,SAAS,SAAU,QAAO,CAAC;AAC3C,QAAM,MAAM,MAAM,KAAK,KAAK,IAAI,EAAE;AAClC,SAAO,MAAM,qBAAqB,OAAO,kBACrC,CAAC,WAAW,GAAG,uDAAuD,iBAAiB,EAAE,IACzF,CAAC;AACP;AAEA,SAAS,eAAe,OAAiC;AACvD,QAAM,OAAO,oBAAI,IAAsB;AACvC,QAAM,QAAQ,CAAC,GAAG,MAAM;AACtB,QAAI,OAAO,EAAE,SAAS,SAAU;AAChC,SAAK,IAAI,EAAE,MAAM,CAAC,GAAI,KAAK,IAAI,EAAE,IAAI,KAAK,CAAC,GAAI,CAAC,CAAC;AAAA,EACnD,CAAC;AACD,QAAM,MAAiB,CAAC;AACxB,aAAW,CAAC,MAAM,GAAG,KAAK,MAAM;AAC9B,QAAI,IAAI,SAAS,EAAG;AACpB,QAAI,KAAK;AAAA,MACP,SAAS,QAAQ,MAAM,IAAI,CAAC;AAAA,MAC5B,KAAK;AAAA,MACL,SAAS,WAAW,IAAI,MAAM,WAAW,IAAI,IAAI,CAAC,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,IACnF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,SAAS,GAA0C;AAC1D,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;AAChE;AAEA,SAAS,OAAO,GAAoB;AAClC,SAAO,MAAM,QAAQ,CAAC,IAAI,aAAa,MAAM,OAAO,SAAS,OAAO;AACtE;AAEA,SAAS,gBAAgB,MAA6B;AACpD,QAAM,IAAI,KAAK;AACf,MAAI,MAAM,OAAW,QAAO,CAAC,gDAAgD;AAC7E,MAAI,CAAC,SAAS,CAAC,EAAG,QAAO,CAAC,kBAAkB,OAAO,CAAC,CAAC,wBAAwB;AAC7E,MAAI,EAAE,SAAS,UAAU;AACvB,UAAM,MAAM,EAAE,SAAS,SAAY,YAAY,KAAK,UAAU,EAAE,IAAI;AACpE,WAAO,CAAC,uBAAuB,GAAG,yBAAyB;AAAA,EAC7D;AACA,SAAO,CAAC;AACV;AAEA,IAAM,QAAQ,CAAC,gBAAgB,mBAAmB,kBAAkB,eAAe;AAEnF,SAAS,mBAAmB,MAA6B;AACvD,QAAM,IAAI,KAAK;AACf,MAAI,CAAC,SAAS,CAAC,EAAG,QAAO,CAAC;AAC1B,SAAO,EAAE,iBAAiB,QAAQ,EAAE,oBAAoB,OACpD;AAAA,IACE;AAAA,EACF,IACA,CAAC;AACP;AAEA,SAAS,gBAAgB,MAA6B;AACpD,QAAM,IAAI,KAAK;AACf,MAAI,MAAM,OAAW,QAAO,CAAC;AAC7B,MAAI,CAAC,SAAS,CAAC,EAAG,QAAO,CAAC,kBAAkB,OAAO,CAAC,CAAC,iBAAiB;AACtE,QAAM,MAAgB,CAAC;AACvB,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,CAAC,MAAM,UAAa,OAAO,EAAE,CAAC,MAAM,WAAW;AACnD,UAAI,KAAK,eAAe,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,sBAAsB;AAAA,IAC5E;AAAA,EACF;AACA,MAAI,EAAE,UAAU,UAAa,OAAO,EAAE,UAAU,UAAU;AACxD,QAAI,KAAK,mCAAmC;AAAA,EAC9C;AACA,SAAO;AACT;AAOO,IAAM,oBAAgD;AAAA,EAC3D,EAAE,IAAI,4BAA4B,OAAO,6CAA6C,UAAU,UAAU,MAAM,WAAW,2BAA2B,EAAE;AAAA,EACxJ,EAAE,IAAI,gCAAgC,OAAO,6CAA6C,UAAU,UAAU,MAAM,cAAc,CAAC,GAAG,qBAAqB,GAAG,qBAAqB,GAAG,CAAC,EAAE;AAAA,EACzL,EAAE,IAAI,0BAA0B,OAAO,iDAAiD,UAAU,UAAU,MAAM,eAAe;AAAA,EACjI,EAAE,IAAI,2BAA2B,OAAO,8CAA8C,UAAU,UAAU,MAAM,kBAAkB;AAAA,EAClI,EAAE,IAAI,qBAAqB,OAAO,mDAAmD,UAAU,UAAU,MAAM,WAAW,sBAAsB,EAAE;AAAA,EAClJ,EAAE,IAAI,uBAAuB,OAAO,mDAAmD,UAAU,UAAU,MAAM,gBAAgB,gBAAgB,CAAC,EAAE;AAAA,EACpJ,EAAE,IAAI,sBAAsB,OAAO,uDAAuD,UAAU,UAAU,MAAM,gBAAgB,eAAe,CAAC,EAAE;AAAA,EACtJ,EAAE,IAAI,wBAAwB,OAAO,8CAA8C,UAAU,UAAU,MAAM,WAAW,uBAAuB,EAAE;AAAA,EACjJ,EAAE,IAAI,uBAAuB,OAAO,oDAAoD,UAAU,UAAU,MAAM,WAAW,uBAAuB,EAAE;AAAA,EACtJ,EAAE,IAAI,qBAAqB,OAAO,wCAAwC,UAAU,UAAU,MAAM,eAAe;AAAA,EACnH,EAAE,IAAI,qBAAqB,OAAO,0CAA0C,UAAU,UAAU,MAAM,aAAa;AAAA,EACnH,EAAE,IAAI,4BAA4B,OAAO,2BAA2B,UAAU,UAAU,MAAM,mBAAmB;AAAA,EACjH,EAAE,IAAI,yBAAyB,OAAO,iCAAiC,UAAU,UAAU,MAAM,gBAAgB;AAAA,EACjH,EAAE,IAAI,yBAAyB,OAAO,0CAA0C,UAAU,UAAU,MAAM,WAAW;AAAA,EACrH,EAAE,IAAI,yBAAyB,OAAO,8CAA8C,UAAU,UAAU,MAAM,WAAW;AAAA,EACzH,EAAE,IAAI,6BAA6B,OAAO,wBAAwB,UAAU,UAAU,OAAO,eAAe;AAAA,EAC5G,EAAE,IAAI,0BAA0B,OAAO,uCAAuC,UAAU,UAAU,MAAM,gBAAgB;AAAA,EACxH,EAAE,IAAI,6BAA6B,OAAO,kCAAkC,UAAU,UAAU,MAAM,mBAAmB;AAAA,EACzH,EAAE,IAAI,4BAA4B,OAAO,8BAA8B,UAAU,UAAU,MAAM,gBAAgB;AACnH;AAMA,IAAM,mBAAmB,oBAAI,IAAI,CAAC,SAAS,QAAQ,WAAW,YAAY,SAAS,CAAC;AACpF,IAAM,YAAY;AAGlB,SAAS,eACP,MACAC,QACA,MACA,QAAQ,GACR,OAAqB,oBAAI,IAAI,GACvB;AACN,MAAI,QAAQ,aAAa,OAAO,SAAS,YAAY,SAAS,QAAQ,KAAK,IAAI,IAAI,EAAG;AACtF,OAAK,IAAI,IAAI;AACb,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,SAAK,QAAQ,CAAC,GAAG,MAAM,eAAe,GAAG,GAAGA,MAAI,IAAI,CAAC,KAAK,MAAM,QAAQ,GAAG,IAAI,CAAC;AAChF;AAAA,EACF;AACA,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACzC,QAAI,iBAAiB,IAAI,CAAC,EAAG;AAC7B,SAAK,MAAM,iBAAiB,MAAM,YAAY,OAAO,MAAM,UAAU;AACnE,WAAK,GAAGA,MAAI,IAAI,CAAC,IAAI,CAAC;AACtB;AAAA,IACF;AACA,QAAI,MAAM,gBAAgB,SAAS,CAAC,GAAG;AACrC,iBAAW,QAAQ,OAAO,KAAK,CAAC,EAAG,MAAK,GAAGA,MAAI,eAAe,MAAM,IAAI,CAAC,YAAY,IAAI;AAAA,IAC3F;AACA,mBAAe,GAAG,GAAGA,MAAI,IAAI,CAAC,IAAI,MAAM,QAAQ,GAAG,IAAI;AAAA,EACzD;AACF;AAEA,SAAS,UAAU,MAAmB,GAA4D;AAChG,QAAM,OAAO,OAAO,KAAK,SAAS,YAAY,KAAK,SAAS,KAAK,KAAK,OAAO;AAC7E,SAAO,OACH,EAAE,SAAS,QAAQ,MAAM,IAAI,CAAC,IAAI,KAAK,MAAM,KAAK,IAClD,EAAE,SAAS,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG;AAC7C;AAEA,SAAS,QAAW,GAAiB;AACnC,SAAO,MAAM,QAAQ,CAAC,IAAK,EAAE,OAAO,QAAQ,IAAY,CAAC;AAC3D;AAGO,SAAS,mBACd,OACA,OAA+B,CAAC,GAClB;AACd,QAAM,MAAoB,CAAC;AAC3B,QAAM,MAAM,CACV,MACA,SACA,KACA,OACA,OACA,aACG;AACH,QAAI,OAAO,UAAU,YAAY,UAAU,GAAI;AAC/C,QAAI,KAAK,EAAE,MAAM,SAAS,KAAK,OAAO,KAAK,OAAO,MAAM,qBAAqB,KAAK,GAAG,SAAS,CAAC;AAAA,EACjG;AACA,UAAqB,KAAK,EAAE,QAAQ,CAAC,MAAM,MAAM;AAC/C,UAAM,EAAE,SAAS,KAAK,KAAK,IAAI,UAAU,MAAM,CAAC;AAChD,UAAM,OAAO,CAAC,OAAe,UAAmB,IAAI,QAAQ,SAAS,KAAK,OAAO,OAAO,IAAI;AAC5F,SAAK,SAAS,KAAK,KAAK;AACxB,SAAK,eAAe,KAAK,WAAW;AACpC,QAAI,SAAS,KAAK,WAAW,EAAG,MAAK,qBAAqB,KAAK,YAAY,KAAK;AAChF,mBAAe,KAAK,aAAa,eAAe,IAAI;AACpD,mBAAe,KAAK,cAAc,gBAAgB,IAAI;AAAA,EACxD,CAAC;AACD,aAAW,KAAK,QAAyB,KAAK,SAAS,GAAG;AACxD,UAAM,MAAM,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG;AACzC,QAAI,YAAY,YAAY,MAAM,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,KAAK;AAC/D,QAAI,YAAY,YAAY,MAAM,GAAG,CAAC,IAAI,KAAK,eAAe,EAAE,WAAW;AAAA,EAC7E;AACA,aAAW,KAAK,QAAiC,KAAK,iBAAiB,GAAG;AACxE,UAAM,MAAM,OAAO,EAAE,eAAe,EAAE,QAAQ,GAAG;AACjD,QAAI,oBAAoB,qBAAqB,MAAM,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,KAAK;AAChF,QAAI,oBAAoB,qBAAqB,MAAM,GAAG,CAAC,IAAI,KAAK,eAAe,EAAE,WAAW;AAAA,EAC9F;AACA,aAAW,KAAK,QAAuB,KAAK,OAAO,GAAG;AACpD,UAAM,MAAM,OAAO,EAAE,QAAQ,GAAG;AAChC,UAAM,UAAU,UAAU,MAAM,GAAG,CAAC;AACpC,QAAI,UAAU,SAAS,KAAK,SAAS,EAAE,KAAK;AAC5C,QAAI,UAAU,SAAS,KAAK,eAAe,EAAE,WAAW;AACxD,eAAW,KAAK,QAAiD,EAAE,SAAS,GAAG;AAC7E,UAAI,UAAU,SAAS,KAAK,aAAa,MAAM,OAAO,EAAE,IAAI,CAAC,CAAC,iBAAiB,EAAE,WAAW;AAAA,IAC9F;AAAA,EACF;AACA,MAAI,gBAAgB,uBAAuB,gBAAgB,gBAAgB,KAAK,YAAY;AAC5F,SAAO;AACT;AAEA,SAAS,aAAa,GAAmB;AACvC,SAAO,EAAE,QAAQ,wBAAwB,MAAM;AACjD;AAQO,SAAS,eAAe,MAAkC;AAC/D,MAAI,MAAM,KAAK,IAAI,EAAE,SAAS,EAAG,QAAO;AACxC,QAAM,MAAM,aAAa,IAAI;AAC7B,MAAI,uBAAuB,KAAK,IAAI,GAAG;AACrC,WAAO,IAAI,OAAO,mBAAmB,GAAG,mBAAmB,IAAI;AAAA,EACjE;AACA,SAAO,IAAI,OAAO,iCAAa,GAAG,qCAAiB,GAAG,0BAA0B,GAAG,OAAO,IAAI;AAChG;AAEA,SAAS,aAAa,OAAsB,MAA2C;AACrF,QAAMC,SAAQ,oBAAI,IAAY;AAC9B,aAAW,KAAK,MAAO,KAAI,OAAO,EAAE,SAAS,SAAU,CAAAA,OAAM,IAAI,EAAE,IAAI;AACvE,aAAW,KAAK,KAAK,kBAAkB,CAAC,EAAG,KAAI,OAAO,MAAM,SAAU,CAAAA,OAAM,IAAI,CAAC;AACjF,QAAM,WAAsB,CAAC;AAC7B,aAAW,QAAQA,QAAO;AACxB,UAAM,KAAK,eAAe,IAAI;AAC9B,QAAI,GAAI,UAAS,KAAK,EAAE,MAAM,GAAG,CAAC;AAAA,EACpC;AACA,SAAO,EAAE,sBAAsB,KAAK,wBAAwB,KAAM,SAAS;AAC7E;AAOO,SAAS,iBACd,QAAuB,CAAC,GACxB,OAA+B,CAAC,GAChB;AAChB,QAAM,OAAO,QAAqB,KAAK;AACvC,QAAM,MAAM,aAAa,MAAM,IAAI;AACnC,QAAM,UAAU,mBAAmB,MAAM,IAAI;AAC7C,QAAM,MAAsB,CAAC;AAC7B,aAAW,QAAQ,mBAAmB;AACpC,QAAI,UAAU,KAAK,OAAO,KAAK,EAAE,EAAG;AACpC,UAAM,WAAsB,CAAC;AAC7B,QAAI,KAAK,MAAM;AACb,iBAAW,OAAO,SAAS;AACzB,mBAAW,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG;AACnC,gBAAM,IAAI,OAAO,MAAM,WAAW,EAAE,SAAS,EAAE,IAAI;AACnD,mBAAS,KAAK,EAAE,GAAG,GAAG,SAAS,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,MAAM;AACb,YAAM,QAAQ,KAAK;AACnB,WAAK,QAAQ,CAAC,MAAM,MAAM;AACxB,cAAM,EAAE,SAAS,IAAI,IAAI,UAAU,MAAM,CAAC;AAC1C,mBAAW,WAAW,MAAM,MAAM,GAAG,EAAG,UAAS,KAAK,EAAE,SAAS,KAAK,QAAQ,CAAC;AAAA,MACjF,CAAC;AAAA,IACH;AACA,QAAI,KAAK,MAAO,UAAS,KAAK,GAAG,KAAK,MAAM,MAAM,GAAG,CAAC;AACtD,QAAI,KAAK,GAAG,cAAc,MAAM,UAAU,IAAI,CAAC;AAAA,EACjD;AACA,SAAO,aAAa,GAAG;AACzB;;;ACj2BA,IAAM,eAAe;AAGrB,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,wBAAwB,oBAAI,IAAI,CAAC,SAAS,SAAS,SAAS,eAAe,OAAO,CAAC;AAEzF,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAaD,SAASC,UAAS,GAA0C;AAC1D,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;AAChE;AAEA,SAAS,cAAc,OAAuB;AAC5C,SAAO,MAAM,QAAQ,OAAO,IAAI,EAAE,QAAQ,QAAQ,IAAI;AACxD;AAEA,SAAS,UAAU,KAAqB;AACtC,QAAM,IAAI,IAAI,QAAQ,GAAG;AACzB,SAAO,MAAM,KAAK,MAAM,IAAI,MAAM,GAAG,CAAC;AACxC;AAEA,SAAS,WAAW,KAAa,MAAkC;AACjE,MAAI;AACF,WAAO,IAAI,IAAI,KAAK,IAAI,EAAE;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,eAAe,KAAc,SAAsD;AACjG,MAAI,YAAY,GAAI,QAAO,EAAE,OAAO,MAAM,OAAO,IAAI;AACrD,MAAI,CAAC,QAAQ,WAAW,GAAG,EAAG,QAAO,EAAE,OAAO,MAAM;AACpD,MAAI,OAAgB;AACpB,aAAW,OAAO,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG;AAC7C,UAAM,QAAQ,IAAI,QAAQ,QAAQ,GAAG,EAAE,QAAQ,QAAQ,GAAG;AAC1D,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,UAAI,CAAC,oBAAoB,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,OAAQ,QAAO,EAAE,OAAO,MAAM;AAC5F,aAAO,KAAK,OAAO,KAAK,CAAC;AAAA,IAC3B,WAAWA,UAAS,IAAI,KAAK,OAAO,OAAO,MAAM,KAAK,GAAG;AACvD,aAAO,KAAK,KAAK;AAAA,IACnB,OAAO;AACL,aAAO,EAAE,OAAO,MAAM;AAAA,IACxB;AAAA,EACF;AACA,SAAO,EAAE,OAAO,MAAM,OAAO,KAAK;AACpC;AAGO,SAAS,mBAAmB,QAA+B;AAChE,QAAM,YAAY,oBAAI,IAAsB;AAC5C,QAAM,UAAwB,CAAC;AAC/B,QAAM,OAAO,oBAAI,IAAa;AAE9B,QAAM,QAAQ,CAAC,MAAe,IAAY,MAAc,UAAwB;AAC9E,QAAI,CAACA,UAAS,IAAI,KAAK,QAAQ,MAAM,KAAK,IAAI,IAAI,EAAG;AACrD,SAAK,IAAI,IAAI;AACb,QAAI,OAAO;AACX,QAAI,OAAO,KAAK,QAAQ,UAAU;AAChC,YAAM,KAAK,WAAW,KAAK,KAAK,IAAI;AACpC,UAAI,IAAI;AACN,eAAO,UAAU,EAAE;AACnB,YAAI,CAAC,UAAU,IAAI,IAAI,EAAG,WAAU,IAAI,MAAM,EAAE,MAAM,MAAM,SAAS,oBAAI,IAAI,EAAE,CAAC;AAAA,MAClF;AAAA,IACF;AACA,UAAM,WAAW,UAAU,IAAI,IAAI;AACnC,eAAW,OAAO,CAAC,WAAW,gBAAgB,GAAY;AACxD,UAAI,OAAO,KAAK,GAAG,MAAM,SAAU,WAAU,QAAQ,IAAI,KAAK,GAAG,CAAW;AAAA,IAC9E;AACA,eAAW,OAAO,CAAC,QAAQ,aAAa,GAAY;AAClD,UAAI,OAAO,KAAK,GAAG,MAAM;AACvB,gBAAQ,KAAK,EAAE,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG,GAAa,MAAM,KAAK,CAAC;AAAA,IAC7E;AACA,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACzC,YAAMC,SAAO,GAAG,EAAE,IAAI,cAAc,CAAC,CAAC;AACtC,UAAI,sBAAsB,IAAI,CAAC,KAAK,MAAM,QAAQ,CAAC,GAAG;AACpD,UAAE,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,GAAGA,MAAI,IAAI,CAAC,IAAI,MAAM,QAAQ,CAAC,CAAC;AAAA,MACrE,WAAW,oBAAoB,IAAI,CAAC,KAAKD,UAAS,CAAC,GAAG;AACpD,mBAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,CAAC,GAAG;AAC3C,gBAAM,KAAK,GAAGC,MAAI,IAAI,cAAc,IAAI,CAAC,IAAI,MAAM,QAAQ,CAAC;AAAA,QAC9D;AAAA,MACF,WAAW,gBAAgB,IAAI,CAAC,GAAG;AACjC,cAAM,GAAGA,QAAM,MAAM,QAAQ,CAAC;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEA,YAAU,IAAI,cAAc,EAAE,MAAM,QAAQ,SAAS,oBAAI,IAAI,EAAE,CAAC;AAChE,QAAM,QAAQ,IAAI,cAAc,CAAC;AAEjC,QAAM,WAAyB,CAAC;AAChC,aAAW,KAAK,SAAS;AACvB,UAAM,SAAS,WAAW,EAAE,KAAK,EAAE,IAAI;AACvC,QAAI,CAAC,QAAQ;AACX,eAAS,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,KAAK,EAAE,KAAK,SAAS,+BAA+B,CAAC;AACtF;AAAA,IACF;AACA,UAAM,SAAS,OAAO,QAAQ,GAAG;AACjC,UAAM,MAAM,UAAU,MAAM;AAC5B,UAAM,WAAW,WAAW,KAAK,KAAK,OAAO,MAAM,SAAS,CAAC;AAC7D,UAAM,WAAW,UAAU,IAAI,GAAG;AAClC,QAAI,CAAC,UAAU;AACb,eAAS,KAAK;AAAA,QACZ,IAAI,EAAE;AAAA,QACN,KAAK,EAAE;AAAA,QACP,SAAS;AAAA,MACX,CAAC;AACD;AAAA,IACF;AACA,QAAI,UAAU;AACd,QAAI;AACF,gBAAU,mBAAmB,QAAQ;AAAA,IACvC,QAAQ;AAAA,IAER;AACA,QAAI,YAAY,MAAM,QAAQ,WAAW,GAAG,GAAG;AAC7C,UAAI,CAAC,eAAe,SAAS,MAAM,OAAO,EAAE,OAAO;AACjD,iBAAS,KAAK;AAAA,UACZ,IAAI,EAAE;AAAA,UACN,KAAK,EAAE;AAAA,UACP,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF,WAAW,CAAC,SAAS,QAAQ,IAAI,OAAO,GAAG;AACzC,eAAS,KAAK,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,KAAK,SAAS,4BAA4B,OAAO,IAAI,CAAC;AAAA,IACzF;AAAA,EACF;AACA,SAAO;AACT;;;AClJO,IAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACO,IAAMC,2BAA0B;AAKhC,SAAS,MAAMC,kBAAsD;AAC1E,MAAI,OAAOA,qBAAoB,YAAY,CAAC,uBAAuB,KAAKA,gBAAe,GAAG;AACxF,WAAO;AAAA,EACT;AACA,SAAOA,oBAAmBD,2BAA0B,WAAW;AACjE;AAyHA,SAASE,UAAS,GAA0C;AAC1D,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;AAChE;AAEA,SAAS,EAAE,GAAmB;AAC5B,SAAO,KAAK,UAAU,CAAC;AACzB;AAEA,SAAS,SAAS,GAA2B;AAC3C,SAAO,MAAM,QAAQ,CAAC,IAAK,EAAE,OAAOA,SAAQ,IAAiC,CAAC;AAChF;AAEA,SAAS,YAAY,GAAgB,GAA6C;AAChF,SAAO,OAAO,EAAE,SAAS,YAAY,EAAE,SAAS,KAC5C,EAAE,SAAS,QAAQ,EAAE,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,KAAK,IAC5C,EAAE,SAAS,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG;AAC7C;AAGA,SAAS,UAAU,GAAoB;AACrC,MAAI,MAAM,QAAQ,CAAC,EAAG,QAAO,IAAI,EAAE,IAAI,SAAS,EAAE,KAAK,GAAG,CAAC;AAC3D,MAAIA,UAAS,CAAC,GAAG;AACf,UAAM,OAAO,OAAO,KAAK,CAAC,EACvB,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,MAAS,EAChC,KAAK;AACR,WAAO,IAAI,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AAAA,EACpE;AACA,SAAO,KAAK,UAAU,CAAC,KAAK;AAC9B;AAEA,IAAM,gBAAgB,CAAC,eAAe,cAAc;AACpD,IAAM,kBAAkB;AAExB,SAAS,eAAe,QAAqC;AAC3D,MAAI,CAACA,UAAS,MAAM,KAAK,OAAO,OAAO,YAAY,SAAU,QAAO;AACpE,SAAO,gBAAgB,KAAK,OAAO,OAAO,IAAI,SAAY,OAAO;AACnE;AAEA,SAAS,WACP,OACA,IACQ;AACR,MAAI,IAAI;AACR,WAAS,MAAM,KAAK,EAAE,QAAQ,CAAC,MAAM,MAAM;AACzC,eAAW,SAAS,eAAe;AACjC,YAAM,SAAS,KAAK,KAAK;AACzB,UAAI,WAAW,OAAW;AAC1B;AACA,SAAG,QAAQ,OAAO,YAAY,MAAM,CAAC,CAAC;AAAA,IACxC;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAMA,SAAS,gBAAgB,OAA+B;AACtD,QAAM,IAAI,MAAM;AAChB,MAAI,OAAO,MAAM,YAAY,MAAM,IAAI;AACrC,WAAO;AAAA,MACL,UAAU;AAAA,QACR,EAAE,SAAS,+EAA+E;AAAA,MAC5F;AAAA,IACF;AAAA,EACF;AACA,MAAK,wBAA8C,SAAS,CAAC,GAAG;AAC9D,WAAO,EAAE,UAAU,CAAC,GAAG,YAAY,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC,QAAQ;AAAA,EAC9D;AACA,MAAI,uBAAuB,KAAK,CAAC,KAAK,IAAIC,0BAAyB;AACjE,WAAO;AAAA,MACL,UAAU;AAAA,QACR;AAAA,UACE,SAAS,mBAAmB,EAAE,CAAC,CAAC,uCAAuCA,wBAAuB,iBAAiBA,wBAAuB;AAAA,UACtI,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,UAAU;AAAA,MACR;AAAA,QACE,SAAS,mBAAmB,EAAE,CAAC,CAAC,sCAAsC,wBAAwB,KAAK,IAAI,CAAC;AAAA,MAC1G;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,GAAgB,GAA0B;AAClE,QAAM,KAAK;AACX,QAAM,KAAK;AACX,QAAM,OAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,EAAE,GAAG,GAAG,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK;AACzE,SAAO,KAAK,OAAO,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC;AACjE;AAEA,SAAS,gBAAgB,OAAkB,KAA+B;AACxE,QAAM,UAAU,MAAM,QAAQ,MAAM,gBAAgB,IAAI,MAAM,iBAAiB,IAAI,QAAQ,IAAI,CAAC;AAChG,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO;AAAA,MACL,UAAU;AAAA,QACR;AAAA,UACE,SAAS;AAAA,UACT,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,IAAI,QAAQ,WAAY,WAAqB;AAC9D,QAAM,UACJ,IAAI,QAAQ,WAAW,KAAK,IAAI,OAAO,oDAAoD;AAC7F,QAAM,WAAsB,CAAC;AAC7B,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,OAAO,QAAQ,IAAI,CAAC;AAC1B,UAAM,OAAO,QAAQ,CAAC;AACtB,UAAM,QAAQ,SAAS,CAAC,QAAQ,IAAI,CAAC;AACrC,UAAM,KAAK,KAAK,IAAI,CAAC,MAAM,OAAO,EAAE,IAAI,CAAC;AACzC,UAAM,KAAK,KAAK,IAAI,CAAC,MAAM,OAAO,EAAE,IAAI,CAAC;AACzC,UAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC;AAC9C,UAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC;AAChD,QAAI,MAAM,UAAU,QAAQ,UAAU,GAAG,WAAW,GAAG,QAAQ;AAC7D,YAAM,QAAQ;AAAA,QACZ,MAAM,SAAS,SAAS,MAAM,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK;AAAA,QACpD,QAAQ,SAAS,WAAW,QAAQ,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK;AAAA,MAC5D,EAAE,OAAO,OAAO;AAChB,eAAS,KAAK;AAAA,QACZ,SAAS,4BAA4B,KAAK,KAAK,MAAM,KAAK,IAAI,KAAK,GAAG,GAAG,MAAM,OAAO,GAAG,MAAM,UAAU,GAAG,OAAO;AAAA,QACnH;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,UAAM,KAAK,GAAG,UAAU,CAAC,GAAG,MAAM,MAAM,GAAG,CAAC,CAAC;AAC7C,QAAI,OAAO,IAAI;AACb,eAAS,KAAK;AAAA,QACZ,SAAS,yBAAyB,KAAK,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO;AAAA,QAChG;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,SAAK,QAAQ,CAAC,GAAG,MAAM;AACrB,YAAM,SAAS,iBAAiB,GAAG,KAAK,CAAC,CAAC;AAC1C,UAAI,OAAO,QAAQ;AACjB,iBAAS,KAAK;AAAA,UACZ,SAAS,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,UACzB,KAAK,GAAG,CAAC;AAAA,UACT,SAAS,8BAA8B,KAAK,KAAK,OAAO,KAAK,IAAI,CAAC,IAAI,OAAO;AAAA,UAC7E;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL;AAAA,IACA,YAAY,GAAG,QAAQ,MAAM,aAAa,QAAQ,CAAC,EAAE,MAAM;AAAA,EAC7D;AACF;AAEA,IAAM,QAA+B,CAAC,SAAS,aAAa,qBAAqB,SAAS;AAC1F,IAAM,cAA8C;AAAA,EAClD,OAAO;AAAA,EACP,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,SAAS;AACX;AAEA,SAAS,kBAAkB,OAAkB,KAA+B;AAC1E,MAAI,IAAI,QAAQ,UAAU;AACxB,UAAM,MAAM,IAAI,UAAU,qBAAqB,IAAI,OAAO,KAAK;AAC/D,WAAO;AAAA,MACL,UAAU;AAAA,QACR;AAAA,UACE,SAAS,+CAA+CA,wBAAuB,KAAK,GAAG;AAAA,UACvF,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,OAAOD,UAAS,MAAM,QAAQ,IAAK,MAAM,WAAwB;AACvE,QAAM,UAAU,MAAM,OAAO,CAAC,MAAM,OAAO,CAAC,MAAM,MAAS;AAC3D,MAAI,CAAC,QAAQ,QAAQ,WAAW,GAAG;AACjC,WAAO;AAAA,MACL,UAAU;AAAA,QACR;AAAA,UACE,SAAS;AAAA,UACT,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,WAAsB,CAAC;AAC7B,QAAM,OAAiB,CAAC;AACxB,aAAW,QAAQ,SAAS;AAC1B,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,SAAS,YAAY,IAAI;AAC/B,QAAI,CAACA,UAAS,KAAK,GAAG;AACpB,eAAS,KAAK,EAAE,SAAS,QAAQ,KAAK,MAAM,SAAS,iCAAiC,CAAC;AACvF;AAAA,IACF;AACA,UAAM,EAAE,OAAO,WAAW,IAAI;AAC9B,QAAI,UAAU,QAAW;AACvB,eAAS,KAAK,EAAE,SAAS,QAAQ,KAAK,MAAM,SAAS,0BAA0B,CAAC;AAAA,IAClF,WAAW,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AAC5E,eAAS,KAAK;AAAA,QACZ,SAAS;AAAA,QACT,KAAK;AAAA,QACL,SAAS,YAAY,KAAK,UAAU,KAAK,CAAC;AAAA,MAC5C,CAAC;AAAA,IACH;AACA,QAAI,eAAe,QAAW;AAC5B,eAAS,KAAK,EAAE,SAAS,QAAQ,KAAK,MAAM,SAAS,+BAA+B,CAAC;AAAA,IACvF,WAAW,eAAe,YAAY,eAAe,WAAW;AAC9D,eAAS,KAAK;AAAA,QACZ,SAAS;AAAA,QACT,KAAK;AAAA,QACL,SAAS,iBAAiB,KAAK,UAAU,UAAU,CAAC;AAAA,MACtD,CAAC;AAAA,IACH;AACA,SAAK,KAAK,GAAG,MAAM,UAAU,KAAK,UAAU,KAAK,CAAC,eAAe,KAAK,UAAU,UAAU,CAAC,EAAE;AAAA,EAC/F;AACA,SAAO,EAAE,UAAU,YAAY,KAAK,KAAK,IAAI,EAAE;AACjD;AAEA,SAAS,YAAY,OAAkB,KAA+B;AACpE,QAAM,WAAsB,CAAC;AAC7B,QAAM,QAAQ,WAAW,OAAO,CAAC,QAAQ,OAAO,QAAQ;AACtD,QAAI;AACJ,QAAI;AACF,eAAS,IAAI,SAAS,MAAmB;AAAA,IAC3C,SAAS,KAAK;AACZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,eAAS,KAAK,EAAE,GAAG,KAAK,SAAS,GAAG,KAAK,2BAA2B,GAAG,GAAG,CAAC;AAC3E;AAAA,IACF;AACA,QAAI,OAAO,GAAI;AAEf,UAAM,gBACJ,OAAO,OAAO,SAAS,KAAK,OAAO,OAAO,MAAM,CAAC,MAAM,EAAE,YAAY,MAAM;AAC7E,QAAI,iBAAiB,mBAAmB,MAAM,EAAE,SAAS,EAAG;AAC5D,UAAM,OAAO,OAAO,OAAO,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,GAAG,IAAI,EAAE,OAAO,EAAE;AACjF,UAAM,OAAO,OAAO,OAAO,SAAS,IAAI,MAAM,OAAO,OAAO,SAAS,CAAC,WAAW;AACjF,UAAM,UAAU,eAAe,MAAM,IACjC,gBAAgB,eAAe,MAAM,CAAC,MACtC;AACJ,aAAS,KAAK;AAAA,MACZ,GAAG;AAAA,MACH,SAAS,GAAG,KAAK,mBAAmB,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,SAAS,GAAG,IAAI;AAAA,IACrF,CAAC;AAAA,EACH,CAAC;AACD,SAAO,EAAE,UAAU,YAAY,GAAG,KAAK,mBAAmB;AAC5D;AAEA,SAAS,cAAc,OAA+B;AACpD,QAAM,WAAsB,CAAC;AAC7B,aAAW,OAAO,CAAC,QAAQ,OAAO,QAAQ;AACxC,UAAM,IAAI,eAAe,MAAM;AAC/B,QAAI,GAAG;AACL,eAAS,KAAK;AAAA,QACZ,GAAG;AAAA,QACH,SAAS,GAAG,KAAK,qBAAqB,EAAE,CAAC,CAAC;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACD,SAAO,EAAE,SAAS;AACpB;AAEA,SAAS,WAAW,OAA+B;AACjD,QAAM,WAAsB,CAAC;AAC7B,MAAI,cAAc;AAClB,aAAW,OAAO,CAAC,QAAQ,OAAO,QAAQ;AACxC;AACA,eAAW,KAAK,mBAAmB,MAAM,GAAG;AAC1C,eAAS,KAAK,EAAE,GAAG,KAAK,SAAS,GAAG,KAAK,GAAG,EAAE,EAAE,UAAU,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC;AAAA,IACrF;AAAA,EACF,CAAC;AACD,SAAO,EAAE,UAAU,YAAY,GAAG,WAAW,qBAAqB;AACpE;AAEA,IAAM,oBAAoB;AAE1B,SAAS,YAAY,OAA+B;AAClD,QAAM,QAAQ,MAAM;AACpB,MAAI,CAACA,UAAS,KAAK,GAAG;AACpB,QAAI,MAAM,cAAc,SAAS;AAC/B,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,SAAS;AAAA,YACT,eAAe;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,UAAM,MAAM,MAAM,cAAc,SAAS,oCAAoC;AAC7E,WAAO,EAAE,UAAU,CAAC,GAAG,YAAY,IAAI;AAAA,EACzC;AACA,QAAM,SAAS,MAAM,QAAQ,MAAM,MAAM,IACrC,MAAM,OAAO,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAC7D,CAAC;AACL,QAAM,QACJ,OAAO,MAAM,UAAU,YAAY,OAAO,SAAS,MAAM,KAAK,IAAI,MAAM,QAAQ,OAAO;AACzF,MAAI,SAAS,EAAG,QAAO,EAAE,UAAU,CAAC,GAAG,YAAY,+BAA+B;AAClF,QAAM,QAAQ,OAAO,MAAM,GAAG,iBAAiB,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC;AAC3E,QAAM,OAAO,OAAO,SAAS,MAAM,SAAS,MAAM,OAAO,SAAS,MAAM,MAAM,WAAW;AACzF,QAAM,KAAK,MAAM,SAAS,UAAU,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,KAAK;AAChE,SAAO;AAAA,IACL,UAAU;AAAA,MACR;AAAA,QACE,SAAS,GAAG,KAAK,kCAAkC,EAAE;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,OAA+B;AACrD,QAAM,IAAIA,UAAS,MAAM,MAAM,IAAI,MAAM,SAAS,CAAC;AACnD,QAAM,WAAsB,CAAC;AAC7B,aAAW,KAAK,CAAC,QAAQ,SAAS,GAAY;AAC5C,QAAI,OAAO,EAAE,CAAC,MAAM,YAAY,EAAE,CAAC,MAAM,IAAI;AAC3C,eAAS,KAAK,EAAE,SAAS,UAAU,CAAC,wBAAwB,CAAC,IAAI,CAAC;AAAA,IACpE;AAAA,EACF;AACA,SAAO,EAAE,UAAU,YAAY,GAAG,EAAE,IAAI,IAAI,EAAE,OAAO,GAAG;AAC1D;AAEO,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,mBAAsD;AAAA,EAC1D,OAAO,CAAC,aAAa;AAAA,EACrB,SAAS,CAAC,aAAa;AAAA,EACvB,WAAW,CAAC,aAAa,aAAa;AACxC;AAEA,SAAS,aAAa,OAA+B;AACnD,QAAM,OAAO,MAAM;AACnB,MAAI,SAAS,OAAW,QAAO,EAAE,UAAU,CAAC,EAAE,SAAS,2BAA2B,CAAC,EAAE;AACrF,MAAI,CAACA,UAAS,IAAI,EAAG,QAAO,EAAE,UAAU,CAAC,EAAE,SAAS,gCAAgC,CAAC,EAAE;AACvF,QAAM,WAAsB,CAAC;AAC7B,QAAM,QAAQ;AACd,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACzC,QAAI,CAAC,MAAM,SAAS,CAAC,GAAG;AACtB,eAAS,KAAK;AAAA,QACZ,SAAS,gCAAgC,EAAE,CAAC,CAAC;AAAA,MAC/C,CAAC;AACD;AAAA,IACF;AACA,QAAI,CAACA,UAAS,CAAC,GAAG;AAChB,eAAS,KAAK,EAAE,SAAS,gBAAgB,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,uBAAuB,CAAC;AAC1F;AAAA,IACF;AACA,eAAW,QAAQ,iBAAiB,CAAC,KAAK,CAAC,GAAG;AAC5C,UAAI,EAAE,IAAI,MAAM,UAAa,OAAO,EAAE,IAAI,MAAM,WAAW;AACzD,iBAAS,KAAK;AAAA,UACZ,SAAS,gBAAgB,CAAC,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,IAAI,CAAC,CAAC;AAAA,QAClE,CAAC;AAAA,MACH;AAAA,IACF;AACA,SACG,MAAM,gBAAgB,MAAM,mBAC7B,OAAO,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,CAACA,UAAS,CAAC,CAAC,GACzC;AACA,eAAS,KAAK,EAAE,SAAS,+BAA+B,CAAC,qBAAqB,CAAC;AAAA,IACjF;AAAA,EACF;AACA,QAAM,aAAqD;AAAA,IACzD,CAAC,SAAS,MAAM,KAAK;AAAA,IACrB,CAAC,aAAa,MAAM,SAAS;AAAA,IAC7B,CAAC,WAAW,MAAM,OAAO;AAAA,EAC3B;AACA,aAAW,CAAC,KAAK,KAAK,KAAK,YAAY;AACrC,QAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,GAAG,MAAM,QAAW;AACvE,eAAS,KAAK;AAAA,QACZ,SAAS,gBAAgB,MAAM,MAAM,IAAI,GAAG,gCAAgC,GAAG;AAAA,MACjF,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,EAAE,UAAU,YAAY,OAAO,KAAK,IAAI,EAAE,KAAK,IAAI,KAAK,SAAS;AAC1E;AAGO,IAAM,cAAoC;AAAA,EAC/C,EAAE,IAAI,yBAAyB,OAAO,kDAAkD,UAAU,UAAU,KAAK,gBAAgB;AAAA,EACjI,EAAE,IAAI,qBAAqB,OAAO,+CAA+C,UAAU,UAAU,KAAK,YAAY;AAAA,EACtH,EAAE,IAAI,0BAA0B,OAAO,4CAA4C,UAAU,UAAU,KAAK,gBAAgB;AAAA,EAC5H,EAAE,IAAI,4BAA4B,OAAO,2CAA2C,UAAU,UAAU,KAAK,kBAAkB;AAAA,EAC/H,EAAE,IAAI,qBAAqB,OAAO,8CAA8C,UAAU,UAAU,KAAK,YAAY;AAAA,EACrH,EAAE,IAAI,uBAAuB,OAAO,wCAAwC,UAAU,UAAU,KAAK,cAAc;AAAA,EACnH,EAAE,IAAI,oBAAoB,OAAO,yCAAyC,UAAU,UAAU,KAAK,WAAW;AAAA,EAC9G,EAAE,IAAI,wBAAwB,OAAO,mCAAmC,UAAU,UAAU,KAAK,eAAe;AAAA,EAChH,EAAE,IAAI,qBAAqB,OAAO,sCAAsC,UAAU,UAAU,KAAK,aAAa;AAChH;AAGO,SAAS,UAAU,OAAkB,OAAoB,CAAC,GAAmB;AAClF,QAAM,OAAkBA,UAAS,KAAK,IAAI,QAAQ,EAAE,OAAO,CAAC,EAAE;AAC9D,QAAM,UAAU,OAAO,KAAK,oBAAoB,WAAW,KAAK,kBAAkB;AAClF,QAAM,MAAmB;AAAA,IACvB;AAAA,IACA,KAAK,MAAM,OAAO;AAAA,IAClB,UAAU,KAAK,kBAAkB;AAAA,EACnC;AACA,QAAM,MAAsB,CAAC;AAC7B,aAAW,SAAS,aAAa;AAC/B,QAAI,UAAU,KAAK,OAAO,MAAM,EAAE,EAAG;AACrC,UAAM,EAAE,UAAU,WAAW,IAAI,MAAM,IAAI,MAAM,GAAG;AACpD,QAAI,KAAK,GAAG,cAAc,OAAO,UAAU,MAAM,UAAU,CAAC;AAAA,EAC9D;AACA,SAAO,aAAa,GAAG;AACzB;;;ACtgBO,SAAS,aAAuE;AACrF,SAAO,CAAC,GAAG,aAAa,GAAG,iBAAiB,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,SAAS,OAAO;AAAA,IAC9E;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE;AACJ;AAMO,SAAS,UAAU,UAAwB,OAAyB,CAAC,GAAmB;AAC7F,QAAM,SAAS,EAAE,OAAO,KAAK,OAAO,UAAU,KAAK,SAAS;AAC5D,QAAM,OAAO;AAAA,IACX,EAAE,GAAG,UAAU,kBAAkB,KAAK,iBAAiB;AAAA,IACvD,EAAE,GAAG,QAAQ,gBAAgB,KAAK,eAAe;AAAA,EACnD;AACA,QAAM,OAAO,iBAAiB,SAAS,OAAO;AAAA,IAC5C,GAAG;AAAA,IACH,WAAW,SAAS;AAAA,IACpB,mBAAmB,SAAS;AAAA,IAC5B,SAAS,SAAS;AAAA,IAClB,cAAc,SAAS;AAAA,IACvB,gBAAgB,KAAK;AAAA,IACrB,sBAAsB,KAAK;AAAA,EAC7B,CAAC;AACD,SAAO,aAAa,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;AACxC;;;ACrFA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AAiBV,IAAM,mBAAmB;AAOzB,IAAM,0BAA6C;AAoC1D,SAASC,UAAS,OAAqC;AACrD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,QAAQ,GAAW,GAAmB;AAC7C,SAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAClC;AAEA,IAAM,iBAAiB;AAAA,EACrB,WAAW,uBAAuB;AAAA,EAClC,UAAU,CAAC;AAAA,EACX,OAAO;AACT;AAGA,SAAS,QAAW,QAAgB,MAA4B;AAC9D,QAAM,SAAS;AACf,QAAM,MAAkB,CAAC;AACzB,aAAW,OAAO,MAAM;AACtB,QAAI,OAAO,GAAG,MAAM,OAAW,KAAI,GAAG,IAAI,OAAO,GAAG;AAAA,EACtD;AACA,aAAW,OAAO,OAAO,KAAK,MAAM,EAAE,KAAK,GAAG;AAC5C,QAAI,CAAC,KAAK,SAAS,GAAG,KAAK,OAAO,GAAG,MAAM,OAAW,KAAI,GAAG,IAAI,OAAO,GAAG;AAAA,EAC7E;AACA,SAAO,gBAAgB,KAAK,cAAc;AAC5C;AAEA,IAAM,YAAY;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,cAAc,CAAC,QAAQ,SAAS,eAAe,aAAa,SAAS,OAAO;AAClF,IAAM,kBAAkB,CAAC,QAAQ,SAAS,eAAe,UAAU;AAEnE,SAAS,UAAU,MAA0C;AAC3D,SAAO;AAAA,IACL,GAAI,KAAK,UAAU,SAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,IACxD,GAAI,KAAK,eAAe,SAAY,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;AAAA,EACzE;AACF;AAEA,SAAS,SAASC,eAAyB,KAAsB;AAC/D,SAAOD,UAASC,aAAY,KAAKA,cAAa,GAAG,MAAM;AACzD;AAEA,SAAS,iBAAiB,KAAuB;AAC/C,SACE,eAAe,wBACd,IAAI,MAAM,SAAS,UAAU,IAAI,MAAM,aAAa;AAEzD;AAEA,eAAe,aACb,KACA,QACoC;AACpC,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI;AACF,WAAO,MAAM,IAAI;AAAA,EACnB,SAAS,KAAK;AACZ,QAAI,iBAAiB,GAAG,EAAG,QAAO;AAClC,UAAM;AAAA,EACR;AACF;AAGO,SAAS,aAAa,OAOhB;AACX,QAAM,OAAO,MAAM,SAAS;AAC5B,QAAM,WAAqB,CAAC;AAC5B,MAAI,MAAM,MAAO,UAAS,QAAQ,UAAU,MAAM,KAAK;AACvD,MAAI,MAAM,UAAW,UAAS,YAAY,UAAU,MAAM,SAAS;AACnE,MAAI,MAAM,kBAAmB,UAAS,oBAAoB,UAAU,MAAM,iBAAiB;AAC3F,MAAI,MAAM,QAAS,UAAS,UAAU,UAAU,MAAM,OAAO;AAC7D,SAAO;AAAA,IACL,UAAU;AAAA,IACV,iBAAiB,MAAM;AAAA,IACvB,QAAQ;AAAA,MACN,GAAI,OAAO,MAAM,SAAS,WAAW,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,MAC5D,GAAI,OAAO,MAAM,YAAY,WAAW,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IACvE;AAAA,IACA,cAAc,gBAAgB,MAAM,SAAS,gBAAgB,CAAC,GAAG,cAAc;AAAA,IAC/E,GAAI,MAAM,SAAS,iBAAiB,SAChC,EAAE,cAAc,MAAM,SAAS,aAAa,IAC5C,CAAC;AAAA,IACL,QAAQ,MAAM,OAAO,SAAS,CAAC,GAC5B,IAAI,CAAC,SAAS,QAAqB,MAAM,SAAS,CAAC,EACnD,KAAK,CAAC,GAAG,MAAM,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;AAAA,IACzC,YAAY,MAAM,WAAW,SAAS,CAAC,GACpC,IAAI,CAAC,MAAM,QAAyB,GAAG,aAAa,CAAC,EACrD,KAAK,CAAC,GAAG,MAAM,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC;AAAA,IACvC,oBAAoB,MAAM,mBAAmB,SAAS,CAAC,GACpD,IAAI,CAAC,MAAM,QAAiC,GAAG,aAAa,CAAC,EAC7D,KAAK,CAAC,GAAG,MAAM,QAAQ,EAAE,aAAa,EAAE,WAAW,CAAC;AAAA,IACvD,UAAU,MAAM,SAAS,SAAS,CAAC,GAChC;AAAA,MAAI,CAAC,MACJ;AAAA,QACE;AAAA,UACE,GAAG;AAAA,UACH,GAAI,EAAE,YACF,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC,QAAQ,QAAQ,KAAK,eAAe,CAAC,EAAE,IACrE,CAAC;AAAA,QACP;AAAA,QACA;AAAA,MACF;AAAA,IACF,EACC,KAAK,CAAC,GAAG,MAAM,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;AAAA,IACzC;AAAA,EACF;AACF;AAOA,eAAsB,gBACpB,SACA,OAA+B,CAAC,GACL;AAC3B,QAAM,WAAW,MAAM,QAAQ,SAAS;AACxC,QAAM,OAAO,SAAS;AACtB,QAAM,QAAQ,MAAM,aAAa,MAAM,QAAQ,gBAAgB,GAAG,IAAI;AACtE,QAAM,UAA2B,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC;AAC1D,WAAS,IAAI,GAAG,KAAK,KAAK,oBAAoB,MAAM,OAAO,KAAK;AAC9D,YAAQ,MAAM,MAAM,QAAQ,gBAAgB,GAAG,KAAK;AAAA,EACtD;AACA,QAAM,YAAY,MAAM;AAAA,IACtB,MAAM,QAAQ,oBAAoB;AAAA,IAClC,SAAS,MAAM,WAAW;AAAA,EAC5B;AACA,QAAM,oBAAoB,MAAM;AAAA,IAC9B,MAAM,QAAQ,4BAA4B;AAAA,IAC1C,SAAS,MAAM,WAAW;AAAA,EAC5B;AACA,QAAM,UAAU,MAAM,aAAa,MAAM,QAAQ,kBAAkB,GAAG,SAAS,MAAM,SAAS,CAAC;AAC/F,QAAM,WAAW,aAAa;AAAA,IAC5B,iBAAiB,QAAQ,mBAAmB,SAAS;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO,EAAE,UAAU,kBAAkB,SAAS,SAAS;AACzD;AAGA,eAAsB,cAAc,SAAwC;AAC1E,UAAQ,MAAM,gBAAgB,OAAO,GAAG;AAC1C;AAUO,SAAS,gBACd,SACA,SAAiB,QAAQ,eACjB;AACR,QAAM,aAAa,QAAQ,YAAY;AACvC,QAAM,OAAO,QAAQ,UAAUC,MAAK,QAAQ,QAAQ,OAAO,IAAI,QAAQ,IAAI;AAC3E,QAAM,OAAOA,MAAK,WAAW,UAAU,IAAI,aAAaA,MAAK,QAAQ,MAAM,UAAU;AACrF,MAAI,WAAW,QAAQ,cAAe,QAAO;AAC7C,QAAM,MAAMA,MAAK,QAAQ,IAAI;AAC7B,QAAM,OAAO,OAAO,QAAQ,oBAAoB,GAAG;AACnD,SAAO,MAAM,GAAG,KAAK,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,GAAG,GAAG,KAAK,GAAG,IAAI,IAAI,IAAI;AAC9E;AAEO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAGO,SAAS,aAAa,MAAwB;AACnD,MAAI;AACJ,MAAI;AACF,UAAM,KAAK,MAAMC,IAAG,aAAa,MAAM,MAAM,CAAC;AAAA,EAChD,SAAS,KAAK;AACZ,UAAM,IAAI;AAAA,MACR,uBAAuB,IAAI,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAClF;AAAA,EACF;AACA,MAAI,CAACH,UAAS,GAAG,KAAK,IAAI,aAAa,oBAAoB,CAAC,MAAM,QAAQ,IAAI,KAAK,GAAG;AACpF,UAAM,MAAMA,UAAS,GAAG,IAAI,uBAAuB,OAAO,KAAK,GAAG,EAAE,KAAK,IAAI,CAAC,KAAK,OAAO;AAC1F,UAAM,IAAI;AAAA,MACR,uBAAuB,IAAI,0DAA0D,GAAG;AAAA,IAC1F;AAAA,EACF;AACA,QAAM,IAAI;AACV,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,EAAE,UAAU,CAAC;AAAA,IACrB,cAAc,EAAE,gBAAgB,CAAC;AAAA,IACjC,WAAW,EAAE,aAAa,CAAC;AAAA,IAC3B,mBAAmB,EAAE,qBAAqB,CAAC;AAAA,IAC3C,SAAS,EAAE,WAAW,CAAC;AAAA,IACvB,UAAU,EAAE,YAAY,CAAC;AAAA,EAC3B;AACF;AAGO,SAAS,cAAc,MAAc,UAA0B;AACpE,EAAAG,IAAG,UAAUD,MAAK,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,EAAAC,IAAG,cAAc,MAAM,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACzE;AAwCO,IAAM,oBAAoB,CAAC,SAAS,aAAa,qBAAqB,SAAS;AA2BtF,IAAM,cAA+C;AAAA,EACnD,OAAO;AAAA,EACP,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,SAAS;AACX;AAEA,SAASC,WAAU,OAAwB;AACzC,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,IAAI,MAAM,IAAIA,UAAS,EAAE,KAAK,GAAG,CAAC;AACnE,MAAIJ,UAAS,KAAK,GAAG;AACnB,WAAO,IAAI,OAAO,KAAK,KAAK,EACzB,KAAK,EACL,IAAI,CAAC,QAAQ,GAAG,KAAK,UAAU,GAAG,CAAC,IAAII,WAAU,MAAM,GAAG,CAAC,CAAC,EAAE,EAC9D,KAAK,GAAG,CAAC;AAAA,EACd;AACA,SAAO,KAAK,UAAU,KAAK,KAAK;AAClC;AAGO,SAAS,UAAU,GAAY,GAAqB;AACzD,SAAOA,WAAU,CAAC,MAAMA,WAAU,CAAC;AACrC;AAEA,SAAS,OAAO,MAAuC;AACrD,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO;AACjC,QAAM,MAAkB,CAAC;AACzB,aAAW,QAAQ,MAAM;AACvB,QAAIJ,UAAS,IAAI,KAAK,OAAO,KAAK,SAAS,SAAU,KAAI,KAAK,IAAI,IAAI;AAAA,EACxE;AACA,SAAO;AACT;AAGA,SAAS,MAAM,UAAgC;AAC7C,QAAM,MAAkB;AAAA,IACtB,iBAAiB,SAAS,mBAAmB;AAAA,IAC7C,QAAS,SAAS,UAAU,CAAC;AAAA,IAC7B,cAAc,SAAS,gBAAgB,CAAC;AAAA,IACxC,GAAI,SAAS,iBAAiB,SAAY,EAAE,cAAc,SAAS,aAAa,IAAI,CAAC;AAAA,IACrF,UAAW,SAAS,YAAY,CAAC;AAAA,EACnC;AACA,aAAW,WAAW,mBAAmB;AACvC,UAAM,QAAoB,CAAC;AAC3B,eAAW,OAAQ,SAAS,OAAO,KAAK,CAAC,GAA+B;AACtE,UAAI,OAAmB;AACvB,UAAI,YAAY,aAAa,MAAM,QAAQ,IAAI,SAAS,GAAG;AACzD,eAAO,EAAE,GAAG,KAAK,WAAW,OAAO,IAAI,SAAS,KAAK,CAAC,EAAE;AAAA,MAC1D;AACA,YAAM,OAAO,IAAI,YAAY,OAAO,CAAC,CAAC,CAAC,IAAI;AAAA,IAC7C;AACA,QAAI,OAAO,IAAI;AAAA,EACjB;AACA,SAAO;AACT;AAGA,SAAS,KAAK,OAAkB,UAA2C;AACzE,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,MAAI,CAACA,UAAS,KAAK,EAAG,QAAO;AAC7B,QAAM,MAAkB,CAAC;AACzB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,OAA8B;AAClC,aAAS,IAAI,GAAG,KAAK,SAAS,UAAU,SAAS,QAAW,KAAK;AAC/D,YAAM,OAAO,SAAS,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AAC1C,UAAI,SAAS,OAAQ,MAAM,KAAK,SAAS,CAAC,MAAM,IAAM,QAAO,KAAK,MAAM,SAAS,MAAM,CAAC,CAAC;AAAA,IAC3F;AACA,QAAI,SAAS,OAAW,KAAI,GAAG,IAAI;AAAA,EACrC;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAkB,QAAuC;AAC5E,MAAI,MAAiB;AACrB,aAAW,WAAW,QAAQ;AAC5B,UAAM,WAAW,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO;AAClD,QAAI,SAAS,SAAS,EAAG,OAAM,KAAK,KAAK,QAAQ,KAAK,CAAC;AAAA,EACzD;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,KAAqB;AACpC,SAAO,sBAAsB,KAAK,GAAG,IAAI,MAAM,IAAI,KAAK,UAAU,GAAG,CAAC;AACxE;AAEA,SAAS,UAAUK,SAAgB,KAAqB;AACtD,QAAM,MAAM,QAAQ,GAAG;AACvB,MAAI,CAACA,QAAQ,QAAO;AACpB,SAAO,IAAI,WAAW,GAAG,IAAI,GAAGA,OAAM,GAAG,GAAG,KAAK,GAAGA,OAAM,IAAI,GAAG;AACnE;AAUA,SAAS,YACP,QACA,OACAA,SACA,UACa;AACb,MAAI,UAAU,QAAQ,KAAK,EAAG,QAAO,CAAC;AACtC,MAAIL,UAAS,MAAM,KAAKA,UAAS,KAAK,GAAG;AACvC,UAAM,OAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO;AACvF,WAAO,KAAK;AAAA,MAAQ,CAAC,QACnB,YAAY,OAAO,GAAG,GAAG,MAAM,GAAG,GAAG,UAAUK,SAAQ,GAAG,GAAG,CAAC,GAAG,UAAU,GAAG,CAAC;AAAA,IACjF;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,MACE,MAAMA;AAAA,MACN;AAAA,MACA,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,MACzC,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,IACzC;AAAA,EACF;AACF;AAEA,SAAS,UAAU,OAAwC;AACzD,SAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAAI,CAAC;AAC3F;AAEA,SAAS,WAAW,QAA+B,OAAuC;AACxF,MAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO;AACnC,QAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAID,UAAS,IAAI,CAAC;AAC5D,SAAO,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,SAASA,WAAU,CAAC,CAAC,CAAC;AACxD;AAGA,SAAS,eAAe,QAAmB,KAAwB;AACjE,MAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,QAAM,OAAO,IAAI,IAAI,SAAS,CAAC;AAC/B,QAAM,SAAS,IAAI,IAAI,SAAS,CAAC;AACjC,MAAI,WAAW,gBAAgB,OAAO,UAAU,OAAW,QAAO;AAClE,MAAI,SAAS,YAAY;AACvB,UAAM,SAAS,UAAU,OAAO,MAAM;AACtC,WAAO,UAAU,OAAO,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,SAAS,IAAI,CAAC;AAAA,EACtE;AACA,MAAI,SAAS,OAAQ,QAAO,OAAO,UAAU,UAAa,CAAC,UAAU,OAAO,QAAQ,OAAO,KAAK;AAChG,MAAI,SAAS,OAAQ,QAAO,OAAO,UAAU,UAAa,WAAW,OAAO,QAAQ,OAAO,KAAK;AAChG,MAAI,SAAS,uBAAwB,QAAO,OAAO,UAAU,SAAS,OAAO,WAAW;AACxF,SAAO;AACT;AAEA,SAAS,aAAa,SAA0B,QAA4B;AAC1E,QAAM,CAAC,OAAO,GAAG,IAAI,IAAI,OAAO;AAChC,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,UAAI,UAAU,eAAgB,QAAO;AACrC,UAAI,UAAU,cAAe,QAAO,eAAe,QAAQ,IAAI;AAC/D,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,UAAI,UAAU,YAAa,QAAO;AAClC,UAAI,KAAK,WAAW,GAAG;AAErB,YAAI,OAAO,UAAU,OAAW,QAAO;AACvC,eACE,OAAO,WAAW,UAAaJ,UAAS,OAAO,KAAK,KAAK,OAAO,MAAM,aAAa;AAAA,MAEvF;AACA,aAAO,KAAK,CAAC,MAAM,cAAc,OAAO,UAAU,QAAQ,OAAO,WAAW;AAAA,EAChF;AACF;AAEA,SAAS,eAAe,QAA4B;AAClD,QAAM,CAAC,OAAO,GAAG,IAAI,IAAI,OAAO;AAChC,MAAI,UAAU,kBAAmB,QAAO;AACxC,MAAI,UAAU,eAAgB,QAAO,KAAK,WAAW,KAAK,OAAO,UAAU;AAC3E,SAAO;AACT;AAEA,SAAS,SAAS,QAAmB,UAAgC;AACnE,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,GAAI,OAAO,WAAW,SAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,IAC/D,GAAI,OAAO,UAAU,SAAY,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,IAC5D;AAAA,EACF;AACF;AAEA,SAAS,YACP,SACA,QACA,OACyB;AACzB,QAAM,IAAIA,UAAS,MAAM,IAAI,SAAS,CAAC;AACvC,QAAM,IAAIA,UAAS,KAAK,IAAI,QAAQ,CAAC;AACrC,QAAM,QAAQ,OAAO,KAAK,CAAC,EACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,OAAO,GAAG,GAAG,CAAC,EACtC,KAAK,OAAO;AACf,QAAM,UAAU,OAAO,KAAK,CAAC,EAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,OAAO,GAAG,GAAG,CAAC,EACtC,KAAK,OAAO;AACf,QAAM,UAAwB,CAAC;AAC/B,aAAW,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK,OAAO,GAAG;AAC9C,QAAI,CAAC,OAAO,OAAO,GAAG,GAAG,KAAK,UAAU,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,EAAG;AACzD,UAAM,SAAS,YAAY,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE;AAAA,MAAI,CAAC,MACtD,SAAS,GAAG,aAAa,SAAS,CAAC,CAAC;AAAA,IACtC;AACA,YAAQ,KAAK,EAAE,KAAK,UAAU,OAAO,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC;AAAA,EACxE;AACA,MAAI,MAAM,SAAS,QAAQ,SAAS,QAAQ,WAAW,EAAG,QAAO;AACjE,SAAO;AAAA,IACL,GAAI,MAAM,SAAS,EAAE,MAAM,IAAI,CAAC;AAAA,IAChC,GAAI,QAAQ,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,IACpC,GAAI,QAAQ,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,EACtC;AACF;AAGO,SAAS,aACd,QACA,MACA,OAA4B,CAAC,GACf;AACd,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,IAAI,YAAY,MAAM,MAAM,GAAG,MAAM;AAC3C,QAAM,IAAI,YAAY,MAAM,IAAI,GAAG,MAAM;AACzC,QAAMM,WAAyB,CAAC;AAChC,aAAW,OAAO,CAAC,mBAAmB,gBAAgB,UAAU,gBAAgB,UAAU,GAAG;AAC3F,eAAW,UAAU,YAAY,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG;AAC5D,MAAAA,SAAQ,KAAK,SAAS,QAAQ,eAAe,MAAM,CAAC,CAAC;AAAA,IACvD;AAAA,EACF;AACA,QAAM,OAAqB,EAAE,WAAW,MAAM,UAAU,MAAM;AAC9D,MAAIA,SAAQ,OAAQ,MAAK,UAAUA;AACnC,aAAW,WAAW,mBAAmB;AACvC,UAAM,IAAI,YAAY,SAAS,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AACrD,QAAI,EAAG,MAAK,OAAO,IAAI;AAAA,EACzB;AACA,OAAK,YAAY,CAAC,KAAK,WAAW,kBAAkB,MAAM,CAAC,MAAM,KAAK,CAAC,MAAM,MAAS;AACtF,OAAK,WACHA,SAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ,KAC9B,kBAAkB;AAAA,IAChB,CAAC,OACE,KAAK,CAAC,GAAG,SAAS,UAAU,KAAK,MAAM,KAAK,CAAC,GAAG,WAAW,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ;AAAA,EAC1F;AACF,SAAO;AACT;AAMA,IAAM,eAA0D;AAAA,EAC9D,OAAO,CAAC,QAAQ,OAAO;AAAA,EACvB,WAAW,CAAC,YAAY,WAAW;AAAA,EACnC,mBAAmB,CAAC,qBAAqB,oBAAoB;AAAA,EAC7D,SAAS,CAAC,UAAU,SAAS;AAC/B;AAEA,SAAS,MAAM,MAAgB,MAAM,GAAW;AAC9C,QAAM,QAAQ,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK,IAAI;AAC1C,SAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG,UAAU;AACtE;AAEA,SAAS,MAAM,GAAW,CAAC,KAAK,IAAI,GAA6B;AAC/D,SAAO,GAAG,CAAC,IAAI,MAAM,IAAI,MAAM,IAAI;AACrC;AAMO,SAAS,cAAc,MAA4B;AACxD,MAAI,KAAK,UAAW,QAAO;AAC3B,QAAM,QAAkB,CAAC;AACzB,aAAW,WAAW,mBAAmB;AACvC,UAAM,IAAI,KAAK,OAAO;AACtB,QAAI,CAAC,EAAG;AACR,UAAM,OAAO,aAAa,OAAO;AACjC,QAAI,EAAE,OAAO,OAAQ,OAAM,KAAK,GAAG,MAAM,EAAE,MAAM,QAAQ,IAAI,CAAC,WAAW,MAAM,EAAE,KAAK,CAAC,GAAG;AAC1F,QAAI,EAAE,SAAS,QAAQ;AACrB,YAAM,KAAK,GAAG,MAAM,EAAE,QAAQ,QAAQ,IAAI,CAAC,aAAa,MAAM,EAAE,OAAO,CAAC,GAAG;AAAA,IAC7E;AACA,QAAI,EAAE,SAAS,QAAQ;AACrB,YAAM,SAAS,EAAE,QACd,MAAM,GAAG,CAAC,EACV;AAAA,QACC,CAAC,MACC,GAAG,EAAE,GAAG,KAAK;AAAA,UACX,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,UAC1B;AAAA,QACF,CAAC;AAAA,MACL,EACC,KAAK,IAAI;AACZ,YAAM,OAAO,EAAE,QAAQ,SAAS,IAAI,MAAM,EAAE,QAAQ,SAAS,CAAC,UAAU;AACxE,YAAM,KAAK,GAAG,MAAM,EAAE,QAAQ,QAAQ,IAAI,CAAC,aAAa,MAAM,GAAG,IAAI,GAAG;AAAA,IAC1E;AAAA,EACF;AACA,MAAI,KAAK,SAAS,OAAQ,OAAM,KAAK,GAAG,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,UAAU;AACxF,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC,GAAG,KAAK,WAAW,gBAAgB,EAAE;AACjE;AAEA,SAASC,OAAM,OAA8B,MAAM,KAAa;AAC9D,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,OAAO,KAAK,UAAU,KAAK;AACjC,SAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,MAAM,CAAC,CAAC,WAAM;AAC5D;AAEA,IAAM,kBAAkB;AAGjB,SAAS,SAAS,QAAgB,OAAmC;AAC1E,QAAM,IAAI,OAAO,MAAM,aAAa,KAAK,CAAC;AAC1C,QAAM,IAAI,MAAM,MAAM,aAAa,KAAK,CAAC;AACzC,MAAI,EAAE,SAAS,mBAAmB,EAAE,SAAS,gBAAiB,QAAO;AACrE,QAAM,MAAkB,MAAM;AAAA,IAAK,EAAE,QAAQ,EAAE,SAAS,EAAE;AAAA,IAAG,MAC3D,IAAI,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC;AAAA,EAChC;AACA,WAASC,KAAI,EAAE,SAAS,GAAGA,MAAK,GAAGA,MAAK;AACtC,aAASC,KAAI,EAAE,SAAS,GAAGA,MAAK,GAAGA,MAAK;AACtC,UAAID,EAAC,EAAEC,EAAC,IAAI,EAAED,EAAC,MAAM,EAAEC,EAAC,IAAI,IAAID,KAAI,CAAC,EAAEC,KAAI,CAAC,IAAI,IAAI,KAAK,IAAI,IAAID,KAAI,CAAC,EAAEC,EAAC,GAAG,IAAID,EAAC,EAAEC,KAAI,CAAC,CAAC;AAAA,IAC3F;AAAA,EACF;AACA,QAAM,MAAwC,CAAC;AAC/C,QAAM,OAAO,CAAC,IAAqB,UAAkB;AACnD,UAAM,OAAO,IAAI,IAAI,SAAS,CAAC;AAC/B,QAAI,QAAQ,KAAK,CAAC,MAAM,GAAI,MAAK,CAAC,KAAK;AAAA,QAClC,KAAI,KAAK,CAAC,IAAI,KAAK,CAAC;AAAA,EAC3B;AACA,MAAI,IAAI;AACR,MAAI,IAAI;AACR,SAAO,IAAI,EAAE,UAAU,IAAI,EAAE,QAAQ;AACnC,QAAI,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG;AACjB,WAAK,KAAK,EAAE,CAAC,CAAC;AACd;AACA;AAAA,IACF,WAAW,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,EAAG,MAAK,KAAK,EAAE,GAAG,CAAC;AAAA,QACtD,MAAK,KAAK,EAAE,GAAG,CAAC;AAAA,EACvB;AACA,SAAO,IAAI,EAAE,OAAQ,MAAK,KAAK,EAAE,GAAG,CAAC;AACrC,SAAO,IAAI,EAAE,OAAQ,MAAK,KAAK,EAAE,GAAG,CAAC;AAGrC,MAAI,MAAM;AACV,MAAI,IAAI;AACR,SAAO,IAAI,IAAI,QAAQ;AACrB,QAAI,IAAI,CAAC,EAAE,CAAC,MAAM,KAAK;AACrB,aAAO,IAAI,CAAC,EAAE,CAAC;AACf;AACA;AAAA,IACF;AACA,QAAI,UAAU;AACd,QAAI,QAAQ;AACZ,WAAO,IAAI,IAAI,QAAQ;AACrB,YAAM,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC;AACxB,UAAI,OAAO,IAAK,YAAW;AAAA,eAClB,OAAO,IAAK,UAAS;AAAA,eACrB,QAAQ,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,CAAC,EAAE,CAAC,MAAM,KAAK;AAC1E,mBAAW;AACX,iBAAS;AAAA,MACX,MAAO;AACP;AAAA,IACF;AACA,WAAO,GAAG,UAAU,KAAK,OAAO,OAAO,EAAE,GAAG,QAAQ,KAAK,KAAK,OAAO,EAAE;AAAA,EACzE;AACA,SAAO;AACT;AAEA,SAAS,WAAW,QAAqB,QAAwB;AAC/D,QAAMC,OAAM,OAAO,WAAW,iBAAiB;AAC/C,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,MAAI,OAAO,WAAW,YAAY,OAAO,UAAU,YAAY,KAAK,KAAK,SAAS,KAAK,GAAG;AACxF,UAAM,QAAQ,SAAS,QAAQ,KAAK;AACpC,QAAI,UAAU,OAAW,QAAO,GAAG,MAAM,GAAG,OAAO,IAAI,KAAK,KAAK,GAAGA,IAAG;AAAA,EACzE;AACA,SAAO,GAAG,MAAM,GAAG,OAAO,IAAI,KAAKH,OAAM,MAAM,CAAC,OAAOA,OAAM,KAAK,CAAC,GAAGG,IAAG;AAC3E;AAMO,SAAS,WAAW,MAA4B;AACrD,MAAI,KAAK,UAAW,QAAO;AAC3B,QAAM,QAAkB,CAAC,mBAAmB,cAAc,IAAI,CAAC,EAAE;AACjE,aAAW,UAAU,KAAK,WAAW,CAAC,EAAG,OAAM,KAAK,WAAW,QAAQ,IAAI,CAAC;AAC5E,aAAW,WAAW,mBAAmB;AACvC,UAAM,IAAI,KAAK,OAAO;AACtB,QAAI,CAAC,EAAG;AACR,UAAM,KAAK,KAAK,OAAO,GAAG;AAC1B,eAAW,OAAO,EAAE,SAAS,CAAC,EAAG,OAAM,KAAK,SAAS,GAAG,UAAU;AAClE,eAAW,OAAO,EAAE,WAAW,CAAC,EAAG,OAAM,KAAK,SAAS,GAAG,wBAAwB;AAClF,eAAW,QAAQ,EAAE,WAAW,CAAC,GAAG;AAClC,YAAM,KAAK,SAAS,KAAK,GAAG,EAAE;AAC9B,iBAAW,UAAU,KAAK,OAAQ,OAAM,KAAK,WAAW,QAAQ,UAAU,CAAC;AAAA,IAC7E;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AC1vBA,SAAS,aAAa;AAoBf,IAAM,iBAAiB;AAG9B,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKA,IAAM,WAA8D;AAAA,EAClE,QAAQ,CAAC,OAAO;AAAA,EAChB,YAAY,CAAC,SAAS,UAAU;AAAA,EAChC,WAAW,CAAC,SAAS,UAAU;AAAA,EAC/B,QAAQ,CAAC,UAAU;AACrB;AAEA,IAAM,OAAO,oBAAI,IAAmB,CAAC,WAAW,QAAQ,UAAU,CAAC;AAE5D,IAAM,aAAa;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,gBAAgB,CAAC,MAAM,OAAO,MAAM,OAAO,IAAI;AAErD,IAAM,eAAe;AAMd,SAAS,WACd,UACA,QACA,UAAwB,CAAC,GACb;AACZ,QAAM,MAAoB;AAAA,IACxB,SAAS,QAAQ,YAAY;AAAA,IAC7B,SAAS;AAAA,IACT,YAAY,CAAC;AAAA,IACb,OAAO;AAAA,EACT;AACA,YAAU,UAAU,QAAQ,IAAI,GAAG;AACnC,SAAO,IAAI;AACb;AAEO,SAAS,QAAQ,UAAqB,QAAiB,SAAiC;AAC7F,SAAO,WAAW,UAAU,QAAQ,OAAO,EAAE,WAAW;AAC1D;AAOO,SAAS,gBAAgB,OAAyB;AACvD,SAAOC,eAAc,KAAK,KAAK,eAAe,KAAK,MAAM;AAC3D;AAMA,SAAS,OAAO,KAAmB,UAA0B;AAC3D,MAAI,IAAI,WAAW,SAAS,IAAI,MAAO,KAAI,WAAW,KAAK,QAAQ;AACrE;AAEA,SAAS,YAAYC,QAAsB;AACzC,SAAOA,WAAS,KAAK,WAAWA;AAClC;AAGA,SAAS,SAAS,MAAc,UAA0B;AACxD,MAAI,aAAa,GAAI,QAAO;AAC5B,MAAI,SAAS,WAAW,GAAG,KAAK,SAAS,GAAI,QAAO,GAAG,IAAI,GAAG,QAAQ;AACtE,SAAO,GAAG,IAAI,IAAI,QAAQ;AAC5B;AAEA,SAASC,cAAa,OAAwB;AAC5C,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,SAAO,OAAO;AAChB;AAGA,SAAS,cAAc,OAAwB;AAC7C,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,UAAU,MAAM,MAAM,QAAQ,MAAM,WAAW,IAAI,KAAK,GAAG;AAC5F,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,GAAG,OAAO,KAAK,IAAIC,OAAM,KAAK,CAAC;AACxC;AAEA,SAASA,OAAM,OAAgB,MAAM,IAAY;AAC/C,QAAM,OAAO,KAAK,UAAU,KAAK,KAAK,OAAO,KAAK;AAClD,SAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,MAAM,CAAC,CAAC,WAAM;AAC5D;AAEA,SAASH,eAAc,OAAoD;AACzE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,OAAO,OAAe,KAAsB;AACnD,SAAO,OAAO,UAAU,eAAe,KAAK,OAAO,GAAG;AACxD;AAEA,SAAS,cAAc,OAAyB;AAC9C,SAAO,OAAO,UAAU,aAAaA,eAAc,KAAK;AAC1D;AAEA,SAAS,eAAe,KAAa,OAAwC;AAC3E,MAAI,CAAE,WAAiC,SAAS,GAAG,EAAG,QAAO;AAE7D,SAAO,QAAQ,aAAa,cAAc,KAAK;AACjD;AAGA,IAAM,gBAAmC,CAAC,YAAY,GAAG,UAAU;AAMnE,SAAS,mBAAmB,KAAa,OAA2B;AAClE,MAAI,CAAC,IAAI,WAAW,GAAG,KAAK,cAAc,SAAS,GAAG,EAAG,QAAO;AAChE,SAAO,EAAE,QAAQ,aAAa,OAAO,UAAU;AACjD;AAEA,SAAS,eAAe,KAAiC;AACvD,MAAI;AACJ,MAAI,YAAY,OAAO;AACvB,aAAW,QAAQ,eAAe;AAChC,UAAM,QAAQ,YAAY,IAAI,YAAY,GAAG,KAAK,YAAY,CAAC;AAC/D,QAAI,QAAQ,WAAW;AACrB,kBAAY;AACZ,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,aAAa,IAAI,OAAO;AACjC;AAEA,SAAS,YAAY,GAAW,GAAmB;AACjD,QAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC;AAC5D,WAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,QAAI,OAAO,IAAI,CAAC;AAChB,QAAI,CAAC,IAAI;AACT,aAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,YAAM,MAAM,IAAI,CAAC;AACjB,UAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;AACpF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,IAAI,EAAE,MAAM;AACrB;AAEA,SAAS,QAAQ,KAAmB,SAAkB,OAA6B;AACjF,SAAO,EAAE,SAAS,SAAS,IAAI,SAAS,YAAY,CAAC,GAAG,MAAM;AAChE;AAEA,SAAS,cACP,UACA,QACAC,QACA,KACA,SACsB;AACtB,QAAM,MAAM,QAAQ,KAAK,SAAS,CAAC;AACnC,YAAU,UAAU,QAAQA,QAAM,GAAG;AACrC,SAAO,IAAI,WAAW,CAAC;AACzB;AAGA,SAASG,SACP,UACA,YACA,SACAH,QACA,KACA,SACmD;AACnD,MAAI;AACJ,aAAW,KAAK,WAAW,WAAW,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG;AACtD,UAAM,MAAM,QAAQ,KAAK,SAAS,cAAc;AAChD,cAAU,UAAU,WAAW,CAAC,GAAG,YAAYA,QAAM,CAAC,GAAG,GAAG;AAC5D,UAAMI,SAAQ,IAAI,WAAW;AAC7B,QAAIA,SAAQ,MAAM,CAAC,QAAQA,SAAQ,KAAK,QAAQ;AAC9C,aAAO,EAAE,OAAO,GAAG,UAAU,IAAI,WAAW,CAAC,GAAG,OAAAA,OAAM;AAAA,IACxD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,GAAa,IAAoB;AACzD,SAAO,EAAE,SAAS,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,IAAI,KAAK,EAAE,OAAO;AACzE;AAEA,SAAS,OAAO,GAAW,MAAsB;AAC/C,SAAO,GAAG,CAAC,IAAI,IAAI,GAAG,MAAM,IAAI,KAAK,GAAG;AAC1C;AAYA,IAAM,cAAc,oBAAI,QAAwC;AAEhE,SAAS,eAAe,UAA6D;AACnF,MAAI,YAAY,IAAI,QAAQ,EAAG,QAAO,YAAY,IAAI,QAAQ,KAAK;AACnE,QAAM,SAAS,uBAAuB,QAAQ;AAC9C,cAAY,IAAI,UAAU,MAAM;AAChC,SAAO;AACT;AAEA,SAAS,uBAAuB,UAA6D;AAC3F,QAAMC,SAAQ,WAAW;AAAA,IACvB,CAAC,SAAS,OAAO,UAAU,IAAI,KAAK,eAAe,MAAM,SAAS,IAAI,CAAC;AAAA,EACzE;AACA,MAAIA,OAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,QAAQA,OAAM,KAAK,KAAK;AAE9B,QAAM,UAAU,IAAI,IAAYA,MAAK;AACrC,aAAW,QAAQA,OAAO,YAAW,OAAO,SAAS,IAAI,KAAK,CAAC,EAAG,SAAQ,IAAI,GAAG;AACjF,QAAM,QAAQ,OAAO,KAAK,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,IAAI,GAAG,CAAC;AACrE,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,OAAO,MAAM,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI;AAC1D,QAAI,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM,YAAY;AACjD,aAAO;AAAA,QACL,OAAAA;AAAA,QACA,OAAO,mDAAmD,KAAK;AAAA,MACjE;AAAA,IACF;AACA,WAAO;AAAA,MACL,OAAAA;AAAA,MACA,OAAO,oBAAoB,IAAI,uBAAuB,KAAK,4GAA4G,YAAY;AAAA,IACrL;AAAA,EACF;AAEA,QAAM,OAAOA,OAAM,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC;AAChD,MAAI,QAAQA,OAAM,SAAS,GAAG;AAC5B,WAAO;AAAA,MACL,OAAAA;AAAA,MACA,OAAO,oBAAoB,IAAI,+CAA+CA,OAAM,OAAO,CAAC,MAAM,MAAM,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,IAC3H;AAAA,EACF;AAEA,aAAW,QAAQA,QAAO;AACxB,UAAM,QAAQ,kBAAkB,MAAM,QAAQ;AAC9C,QAAI,MAAO,QAAO,EAAE,OAAAA,QAAO,OAAO,oBAAoB,KAAK,GAAG;AAAA,EAChE;AACA,SAAO,EAAE,OAAAA,OAAM;AACjB;AAOA,SAAS,qBAAqB,OAAiC;AAC7D,SAAO,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,SAAS;AAC1E;AAGA,SAAS,WAAW,OAA8B,OAA+B;AAC/E,MAAI,qBAAqB,KAAK,EAAG,QAAO,EAAE,KAAK,OAAO,KAAK,MAAM;AACjE,MAAI,CAACN,eAAc,KAAK,GAAG;AACzB,WAAO,GAAG,KAAK,gEAAgEG,OAAM,KAAK,CAAC;AAAA,EAC7F;AACA,QAAM,QAAQ,OAAO,KAAK,KAAK,EAAE,OAAO,CAAC,MAAM,MAAM,SAAS,MAAM,KAAK;AACzE,MAAI,MAAM,SAAS,EAAG,QAAO,GAAG,KAAK,sCAAsCA,OAAM,KAAK,CAAC;AACvF,QAAM,EAAE,KAAK,IAAI,IAAI;AACrB,MAAI,QAAQ,UAAa,QAAQ,QAAW;AAC1C,WAAO,GAAG,KAAK,kCAAkCA,OAAM,KAAK,CAAC;AAAA,EAC/D;AACA,MACG,QAAQ,UAAa,CAAC,qBAAqB,GAAG,KAC9C,QAAQ,UAAa,CAAC,qBAAqB,GAAG,GAC/C;AACA,WAAO,GAAG,KAAK,8CAA8CA,OAAM,KAAK,CAAC;AAAA,EAC3E;AACA,MAAI,QAAQ,UAAa,QAAQ,UAAa,MAAM,KAAK;AACvD,WAAO,GAAG,KAAK,uBAAuBA,OAAM,KAAK,CAAC;AAAA,EACpD;AACA,SAAO,EAAE,KAAgC,IAA+B;AAC1E;AAEA,SAAS,cAAc,OAAsB;AAC3C,MAAI,MAAM,QAAQ,UAAa,MAAM,QAAQ,MAAM,IAAK,QAAO,GAAG,MAAM,GAAG;AAC3E,QAAM,QAAkB,CAAC;AACzB,MAAI,MAAM,QAAQ,OAAW,OAAM,KAAK,MAAM,MAAM,GAAG,EAAE;AACzD,MAAI,MAAM,QAAQ,OAAW,OAAM,KAAK,MAAM,MAAM,GAAG,EAAE;AACzD,SAAO,MAAM,KAAK,OAAO;AAC3B;AAEA,SAAS,QAAQ,GAAW,OAAuB;AACjD,UAAQ,MAAM,QAAQ,UAAa,KAAK,MAAM,SAAS,MAAM,QAAQ,UAAa,KAAK,MAAM;AAC/F;AAEA,SAAS,mBACP,WACA,MACoB;AACpB,MAAI,OAAO,WAAW,UAAU,KAAK,OAAO,UAAU,aAAa,WAAW;AAC5E,WAAO,iBAAiB,IAAI,+BAA+BA,OAAM,UAAU,QAAQ,CAAC;AAAA,EACtF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAqB,GAAkD;AAChG,QAAM,QAAQ,EAAE,IAAI;AACpB,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AACH,aAAO,UAAU,OAAO,SAAY,IAAI,IAAI,uBAAuBA,OAAM,KAAK,CAAC;AAAA,IACjF,KAAK,SAAS;AACZ,YAAM,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACnD,YAAM,QACJ,MAAM,SAAS,KACf,MAAM,MAAM,CAAC,MAAM,OAAO,MAAM,YAAa,WAAiC,SAAS,CAAC,CAAC;AAC3F,aAAO,QACH,SACA,0BAA0B,WAAW,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,6BAA6BA,OAAM,KAAK,CAAC,sBAAsB,YAAY;AAAA,IACrJ;AAAA,IACA,KAAK,WAAW;AACd,UAAI,CAACH,eAAc,KAAK,KAAK,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AAC5D,eAAO,2CAA2C,cAAc,KAAK,IAAI,CAAC,SAASG,OAAM,KAAK,CAAC;AAAA,MACjG;AACA,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,YAAI,CAAE,cAAoC,SAAS,GAAG,GAAG;AACvD,iBAAO,+BAA+B,GAAG,UAAU,cAAc,KAAK,IAAI,CAAC;AAAA,QAC7E;AACA,YAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,iBAAO,aAAa,GAAG,0BAA0BA,OAAM,KAAK,CAAC;AAAA,QAC/D;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,WAAW;AACd,YAAM,QAAQ,WAAW,OAAO,WAAW;AAC3C,aAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,IAC7C;AAAA,IACA,KAAK,UAAU;AACb,UAAI,OAAO,UAAU,SAAU,QAAO,0CAA0CA,OAAM,KAAK,CAAC;AAC5F,UAAI,OAAO,GAAG,OAAO,KAAK,OAAO,EAAE,UAAU,UAAU;AACrD,eAAO,6CAA6CA,OAAM,EAAE,KAAK,CAAC;AAAA,MACpE;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AACH,aAAO,OAAO,UAAU,WACpB,SACA,6CAA6CA,OAAM,KAAK,CAAC;AAAA,IAC/D,KAAK;AACH,aAAO;AAAA,IACT,KAAK,aAAa;AAChB,UAAI,OAAO,GAAG,OAAO,GAAG;AACtB,cAAM,QAAQ,WAAW,EAAE,OAAO,SAAS;AAC3C,YAAI,OAAO,UAAU,SAAU,QAAO;AAAA,MACxC;AACA,aAAO,mBAAmB,GAAG,WAAW;AAAA,IAC1C;AAAA,IACA,KAAK,cAAc;AACjB,UAAI,UAAU,KAAM,QAAO,kCAAkCA,OAAM,KAAK,CAAC;AACzE,UAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,GAAG;AAC3B,eAAO,6DAA6DA,OAAM,EAAE,KAAK,CAAC;AAAA,MACpF;AACA,aAAO,mBAAmB,GAAG,YAAY;AAAA,IAC3C;AAAA,IACA,KAAK,UAAU;AACb,UAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAC/C,eAAO,2DAA2DA,OAAM,KAAK,CAAC;AAAA,MAChF;AACA,aAAO,mBAAmB,GAAG,QAAQ;AAAA,IACvC;AAAA,IACA,KAAK;AACH,aAAO,OAAO,UAAU,WACpB,SACA,qCAAqCA,OAAM,KAAK,CAAC;AAAA,IACvD,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAGA,SAAS,eAAe,UAAqB,KAA4B;AACvE,MAAI,IAAI,WAAW,CAACH,eAAc,QAAQ,EAAG,QAAO;AACpD,QAAM,SAAS,eAAe,QAAQ;AACtC,MAAI,CAAC,UAAU,OAAO,MAAO,QAAO;AACpC,SAAO,OAAO,MAAM,MAAM,CAAC,SAAS;AAClC,QAAI,SAAS,UAAW,QAAO;AAC/B,QAAI,SAAS;AACX,aAAQ,SAAS,OAAuB,KAAK,CAAC,QAAQ,eAAe,KAAK,GAAG,CAAC;AAChF,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,mBAAmB,UAAqB,KAA4B;AAC3E,MAAI,IAAI,WAAW,CAACA,eAAc,QAAQ,EAAG,QAAO;AACpD,SAAO,eAAe,QAAQ,GAAG,UAAU;AAC7C;AAMA,SAAS,UAAU,UAAqB,QAAiBC,QAAc,KAAyB;AAC9F,MAAI,IAAI,WAAW,UAAU,IAAI,MAAO;AACxC,MAAID,eAAc,QAAQ,GAAG;AAC3B,QAAI,CAAC,IAAI,SAAS;AAChB,YAAM,SAAS,eAAe,QAAQ;AACtC,UAAI,QAAQ;AACV,uBAAe,UAAU,QAAQ,QAAQC,QAAM,GAAG;AAClD;AAAA,MACF;AAAA,IACF;AACA,gBAAY,UAAU,QAAQA,QAAM,GAAG;AACvC;AAAA,EACF;AACA,MAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,eAAW,UAAU,QAAQA,QAAM,GAAG;AACtC;AAAA,EACF;AACA,MAAI,CAAC,OAAO,GAAG,UAAU,MAAM,GAAG;AAChC,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,MAAI;AAAA,MACtB,SAAS,YAAY,KAAK,UAAU,QAAQ,CAAC,SAAS,KAAK,UAAU,MAAM,CAAC;AAAA,MAC5E;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;AASA,IAAM,WAAoD;AAAA,EACxD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY,CAAC,WAAW,QAAQA,QAAM,QAAQ;AAC5C,UAAM,UAAU,OAAO,UAAU,aAAa,YAAY,UAAU,WAAW,IAAI;AACnF,mBAAe,UAAU,OAAsB,WAAW,QAAQA,QAAM,EAAE,GAAG,KAAK,QAAQ,CAAC;AAAA,EAC7F;AAAA,EACA,QAAQ;AAAA,EACR,SAAS,MAAM;AAAA,EAAC;AAAA,EAChB,MAAM,CAAC,WAAW,QAAQA,QAAM,QAAQ;AACtC,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,MAAI;AAAA,MACtB,SAAS,mBAAmB,KAAK,UAAU,UAAU,IAAI,CAAC;AAAA,MAC1D,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EACA,UAAU,CAAC,WAAW,QAAQA,QAAM,QAAQ;AAC1C,cAAU,UAAU,UAAU,QAAQA,QAAM,EAAE,GAAG,KAAK,SAAS,KAAK,CAAC;AAAA,EACvE;AACF;AAEA,SAAS,eACP,WACA,QACA,QACAA,QACA,KACM;AACN,MAAI,OAAO,OAAO;AAChB,WAAO,KAAK,EAAE,MAAM,YAAYA,MAAI,GAAG,SAAS,OAAO,OAAO,UAAU,WAAW,OAAO,CAAC;AAC3F;AAAA,EACF;AACA,aAAW,QAAQ,OAAO,OAAO;AAC/B,UAAM,SAAS,IAAI,WAAW;AAC9B,aAAS,IAAI,EAAE,WAAW,QAAQA,QAAM,GAAG;AAC3C,QAAI,IAAI,WAAW,SAAS,OAAQ;AAAA,EACtC;AACF;AAEA,SAAS,YACP,UACA,QACAA,QACA,KACM;AACN,MAAI,CAACD,eAAc,MAAM,GAAG;AAC1B,WAAO,KAAK;AAAA,MACV,MAAM,YAAYC,MAAI;AAAA,MACtB,SAAS,2BAA2BC,cAAa,MAAM,CAAC;AAAA,MACxD;AAAA,MACA;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,QAAM,iBAAiB,CAAC,IAAI,WAAW,OAAO,UAAU,UAAU;AAClE,MAAI,UAAU,IAAI;AAClB,MAAI,gBAAgB;AAClB,QAAI,OAAO,SAAS,aAAa,UAAW,WAAU,SAAS;AAAA,SAC1D;AACH,aAAO,KAAK;AAAA,QACV,MAAM,YAAYD,MAAI;AAAA,QACtB,SAAS,0DAA0DE,OAAM,SAAS,QAAQ,CAAC;AAAA,QAC3F;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,eAAe,OAAO,KAAK,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,QAAQ,UAAU;AAChG,MAAI,CAAC,SAAS;AACZ,UAAM,QAAQ,OAAO,KAAK,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,aAAa,SAAS,GAAG,CAAC;AAC7E,QAAI,MAAM,SAAS,GAAG;AACpB,aAAO,KAAK;AAAA,QACV,MAAM,YAAYF,MAAI;AAAA,QACtB,SAAS,iBAAiB,MAAM,SAAS,IAAI,MAAM,EAAE,IAAI,MAAM,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,QACvG;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,WAAyB,EAAE,GAAG,KAAK,QAAQ;AACjD,aAAW,OAAO,cAAc;AAC9B,UAAM,YAAY,UAAUA,QAAM,GAAG;AACrC,QAAI,CAAC,OAAO,QAAQ,GAAG,GAAG;AACxB,UAAI,eAAe,SAAS,GAAG,GAAG,QAAQ,EAAG;AAC7C,UAAI,mBAAmB,SAAS,GAAG,GAAG,QAAQ,GAAG;AAC/C,kBAAU,SAAS,GAAG,GAAG,QAAW,WAAW,QAAQ;AACvD;AAAA,MACF;AACA,aAAO,KAAK;AAAA,QACV,MAAM,YAAY,SAAS;AAAA,QAC3B,SAAS,kCAAkC,KAAK,UAAU,SAAS,GAAG,CAAC,CAAC;AAAA,QACxE,UAAU,SAAS,GAAG;AAAA,QACtB,QAAQ;AAAA,MACV,CAAC;AACD;AAAA,IACF;AACA,cAAU,SAAS,GAAG,GAAG,OAAO,GAAG,GAAG,WAAW,QAAQ;AAAA,EAC3D;AACF;AAEA,SAAS,WAAW,UAAuB,QAAiBA,QAAc,KAAyB;AACjG,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,MAAI;AAAA,MACtB,SAAS,0BAA0BC,cAAa,MAAM,CAAC;AAAA,MACvD;AAAA,MACA;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,QAAM,WAAW,IAAI,UACjB,OAAO,UAAU,SAAS,SAC1B,OAAO,WAAW,SAAS;AAC/B,MAAI,CAAC,UAAU;AACb,WAAO,KAAK;AAAA,MACV,MAAM,YAAYD,MAAI;AAAA,MACtB,SAAS,4BAA4B,IAAI,UAAU,MAAM,SAAS,MAAM,KAAK,SAAS,MAAM,SAAS,OAAO,MAAM;AAAA,MAClH;AAAA,MACA;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,cAAU,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,YAAYA,QAAM,CAAC,GAAG,GAAG;AAAA,EAC7D;AACF;AAMA,SAAS,oBACP,WACA,QACAA,QACA,KACM;AACN,QAAM,UAAU,UAAU;AAC1B,QAAM,QAAQ,UAAU;AACxB,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,MAAI;AAAA,MACtB,SAAS,+BAA+B,OAAO,IAAI,SAAS,EAAE,SAASC,cAAa,MAAM,CAAC;AAAA,MAC3F,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,MAAI;AACJ,MAAI;AACF,YAAQ,IAAI,OAAO,SAAS,KAAK;AAAA,EACnC,SAAS,KAAK;AACZ,WAAO,KAAK;AAAA,MACV,MAAM,YAAYD,MAAI;AAAA,MACtB,SAAS,2BAA2B,OAAO,IAAI,SAAS,EAAE,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MAC/G,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,MAAI,CAAC,MAAM,KAAK,MAAM,GAAG;AACvB,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,MAAI;AAAA,MACtB,SAAS,6BAA6B,OAAO,IAAI,SAAS,EAAE,SAAS,KAAK,UAAU,MAAM,CAAC;AAAA,MAC3F,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gBAAgB,SAAyB;AAChD,QAAM,UAAU,QAAQ,QAAQ,qBAAqB,MAAM;AAC3D,QAAM,OAAO,QAAQ,QAAQ,OAAO,WAAW,EAAE,QAAQ,OAAO,UAAU;AAC1E,SAAO,IAAI,OAAO,IAAI,IAAI,GAAG;AAC/B;AAEA,SAAS,uBACP,WACA,QACAA,QACA,KACM;AACN,QAAM,UAAU,UAAU;AAC1B,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,MAAI;AAAA,MACtB,SAAS,wCAAwC,OAAO,UAAUC,cAAa,MAAM,CAAC;AAAA,MACtF,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,MAAI,CAAC,gBAAgB,OAAO,EAAE,KAAK,MAAM,GAAG;AAC1C,WAAO,KAAK;AAAA,MACV,MAAM,YAAYD,MAAI;AAAA,MACtB,SAAS,sCAAsC,OAAO,UAAU,KAAK,UAAU,MAAM,CAAC;AAAA,MACtF,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,eACP,UACA,WACA,QACAA,QACA,KACM;AACN,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,MAAI;AAAA,MACtB,SAAS,sCAAsCC,cAAa,MAAM,CAAC;AAAA,MACnE,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,MAAI,IAAI,UAAU,OAAO,SAAS,SAAS,SAAS,OAAO,WAAW,SAAS,QAAQ;AACrF,WAAO,KAAK;AAAA,MACV,MAAM,YAAYD,MAAI;AAAA,MACtB,SAAS,sCAAsC,IAAI,UAAU,MAAM,SAAS,MAAM,KAAK,SAAS,MAAM,SAAS,OAAO,MAAM;AAAA,MAC5H,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD;AAAA,EACF;AAEA,QAAM,OAAO,SAAS;AAAA,IAAI,CAAC,SACzB,OAAO,IAAI,CAAC,cAAc,cAAc,MAAM,WAAW,IAAI,KAAK,IAAI,OAAO,MAAM,MAAS;AAAA,EAC9F;AACA,QAAM,QAAQ,IAAI,MAAc,OAAO,MAAM,EAAE,KAAK,EAAE;AACtD,QAAM,SAAS,CAAC,GAAW,SAA6B;AACtD,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,EAAG;AAC5B,WAAK,CAAC,IAAI;AACV,UAAI,MAAM,CAAC,MAAM,MAAM,OAAO,MAAM,CAAC,GAAG,IAAI,GAAG;AAC7C,cAAM,CAAC,IAAI;AACX,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,MAAI,WAAW;AACf,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,QAAI,CAAC,OAAO,GAAG,IAAI,MAAe,OAAO,MAAM,EAAE,KAAK,KAAK,CAAC,EAAG,YAAW;AAAA,EAC5E;AACA,MAAI,SAAU;AAEd,MAAI;AACJ,QAAM,SAAS,KAAK,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC;AACzD,MAAI,UAAU,GAAG;AACf,aAAS,kBAAkB,MAAM,KAAKE,OAAM,SAAS,MAAM,GAAG,EAAE,CAAC;AAEjE,UAAM,YAAY,OAAO,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE;AACvE,UAAM,OACJC,SAAQ,SAAS,MAAM,GAAG,QAAQ,WAAWH,QAAM,KAAK,IAAI,OAAO,KACnEG,SAAQ,SAAS,MAAM,GAAG,QAAQ,QAAWH,QAAM,KAAK,IAAI,OAAO;AACrE,QAAI,KAAM,WAAU,gBAAgB,iBAAiB,KAAK,UAAU,EAAE,CAAC;AAAA,EACzE,OAAO;AACL,aACE;AAAA,EACJ;AACA,SAAO,KAAK;AAAA,IACV,MAAM,YAAYA,MAAI;AAAA,IACtB,SAAS,gFAAgF,IAAI,UAAU,cAAc,EAAE,MAAM,MAAM;AAAA,IACnI,UAAU;AAAA,IACV;AAAA,EACF,CAAC;AACH;AAMA,SAAS,SACP,WACA,QACAA,QACA,KACM;AACN,MAAI,WAAW,QAAW;AACxB,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,MAAI;AAAA,MACtB,SAAS;AAAA,MACT,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,YAAY,OAAgB,MAAuB;AAC1D,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK;AAAA,IAC5D,KAAK;AACH,aAAO,OAAO,UAAU;AAAA,IAC1B,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,MAAM,QAAQ,KAAK;AAAA,IAC5B,KAAK;AACH,aAAOD,eAAc,KAAK;AAAA,IAC5B,KAAK;AACH,aAAO,OAAO,UAAU;AAAA,IAC1B,KAAK;AACH,aAAO,OAAO,UAAU;AAAA,IAC1B;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,UACP,WACA,QACAC,QACA,KACM;AACN,QAAM,QAAS,MAAM,QAAQ,UAAU,KAAK,IAAI,UAAU,QAAQ,CAAC,UAAU,KAAK;AAClF,MAAI,MAAM,KAAK,CAAC,SAAS,YAAY,QAAQ,IAAI,CAAC,EAAG;AACrD,SAAO,KAAK;AAAA,IACV,MAAM,YAAYA,MAAI;AAAA,IACtB,SAAS,iBAAiB,MAAM,KAAK,KAAK,CAAC,SAAS,cAAc,MAAM,CAAC;AAAA,IACzE,UAAU;AAAA,IACV;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAe,QAA2C;AACjE,QAAM,UAAkC,EAAE,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK;AAC3F,SAAO,cAAc,OAAO,CAAC,QAAQ,OAAO,QAAQ,GAAG,CAAC,EACrD,IAAI,CAAC,QAAQ,GAAG,QAAQ,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,EAC7C,KAAK,OAAO;AACjB;AAEA,SAAS,YACP,WACA,QACAA,QACA,KACM;AACN,QAAM,SAAS,UAAU;AACzB,QAAM,QAAQ,eAAe,MAAM;AACnC,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,MAAI;AAAA,MACtB,SAAS,qBAAqB,KAAK,SAAS,cAAc,MAAM,CAAC;AAAA,MACjE,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,QAAM,MACH,OAAO,OAAO,UAAa,SAAS,OAAO,QAC3C,OAAO,QAAQ,UAAa,UAAU,OAAO,SAC7C,OAAO,OAAO,UAAa,SAAS,OAAO,QAC3C,OAAO,QAAQ,UAAa,UAAU,OAAO,SAC7C,OAAO,OAAO,UAAa,WAAW,OAAO;AAChD,MAAI,CAAC,IAAI;AACP,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,MAAI;AAAA,MACtB,SAAS,mBAAmB,KAAK,SAAS,MAAM;AAAA,MAChD,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,YACP,WACA,QACAA,QACA,KACM;AACN,QAAM,QAAQ,WAAW,UAAU,SAAS,WAAW;AACvD,QAAM,OAAO,cAAc,KAAK;AAChC,MAAI,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AACxD,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,MAAI;AAAA,MACtB,SAAS,2CAA2C,IAAI,SAAS,cAAc,MAAM,CAAC;AAAA,MACtF,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,QAAQ,MAAM,IAAI,OAAO,SAAS,MAAM,KAAK,MAAM,EAAE;AAC1E,MAAI,CAAC,QAAQ,QAAQ,KAAK,GAAG;AAC3B,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,MAAI;AAAA,MACtB,SAAS,YAAY,MAAM,QAAQ,MAAM,IAAI,UAAU,QAAQ,WAAW,IAAI,SAAS,MAAM;AAAA,MAC7F,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,IAAM,sBAAsB;AAE5B,SAAS,YACP,WACA,QACAA,QACA,KACM;AACN,QAAM,SAAS,SAAsB,UAAU,SAAS,MAAM;AAC9D,MAAI,OAAO,GAAI;AACf,MAAI,OAAO,gBAAgB,QAAW;AACpC,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,MAAI;AAAA,MACtB,SAAS,mDAAmD,OAAO,WAAW;AAAA,MAC9E,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,QAAM,QAAQ,OAAO,OAClB,MAAM,GAAG,mBAAmB,EAC5B,IAAI,CAAC,UAAU,GAAG,YAAY,SAASA,QAAM,MAAM,IAAI,CAAC,CAAC,IAAI,MAAM,OAAO,EAAE;AAC/E,QAAM,OAAO,OAAO,OAAO,SAAS,MAAM;AAC1C,SAAO,KAAK;AAAA,IACV,MAAM,YAAYA,MAAI;AAAA,IACtB,SAAS,iCAAiC,MAAM,KAAK,IAAI,CAAC,GAAG,OAAO,IAAI,MAAM,IAAI,WAAW,EAAE;AAAA,IAC/F,UAAU;AAAA,IACV;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cACP,WACA,QACAA,QACA,KACM;AACN,QAAM,SAAS,UAAU;AACzB,QAAM,UAAU,OAAO,UAAU,aAAa,YAAY,UAAU,WAAW;AAC/E,QAAM,OAAO,UAAU,KAAK;AAC5B,QAAMI,SAAQ,OAAO,WAAW,OAAO,IAClC,WAAW,UAAU,OAAO,SAAS,IACtC;AACJ,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,UAAM,OACJ,OAAO,WAAW,WAAW,4DAA4D;AAC3F,WAAO,KAAK;AAAA,MACV,MAAM,YAAYJ,MAAI;AAAA,MACtB,SAAS,gCAAgCE,OAAM,QAAQ,EAAE,CAAC,SAAS,cAAc,MAAM,CAAC,GAAG,IAAI;AAAA,MAC/F,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,QAAM,OAAiB,CAAC;AACxB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,QAAI,cAAc,QAAQ,OAAO,CAAC,GAAG,IAAI,KAAK,OAAO,MAAM,OAAW,MAAK,KAAK,CAAC;AAAA,EACnF;AACA,MAAIE,WAAU,SAAY,KAAK,SAAS,IAAI,QAAQ,KAAK,QAAQA,MAAK,EAAG;AAEzE,MAAI;AACJ,MAAIA,WAAU,QAAW;AACvB,cACE,OAAO,WAAW,IACd,iDAAiDF,OAAM,QAAQ,EAAE,CAAC,GAAG,IAAI,6BACzE,iDAAiDA,OAAM,QAAQ,EAAE,CAAC,GAAG,IAAI,iBAAiB,OAAO,OAAO,QAAQ,SAAS,CAAC;AAChI,UAAM,OAAOC,SAAQ,QAAQ,QAAQ,QAAWH,QAAM,KAAK,OAAO;AAClE,QAAI,KAAM,YAAW,gBAAgB,iBAAiB,KAAK,UAAU,EAAE,CAAC;AAAA,EAC1E,OAAO;AACL,UAAM,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,MAAM;AAClF,cAAU,YAAY,cAAcI,MAAK,CAAC,wBAAwBF,OAAM,QAAQ,EAAE,CAAC,GAAG,IAAI,WAAW,KAAK,MAAM,GAAG,KAAK;AAAA,EAC1H;AACA,SAAO,KAAK,EAAE,MAAM,YAAYF,MAAI,GAAG,SAAS,UAAU,WAAW,OAAO,CAAC;AAC/E;AAEA,IAAM,eAAe;AAErB,SAAS,WACP,WACA,QACAA,QACA,KACM;AACN,QAAM,eAAe,UAAU;AAC/B,QAAM,UAAU,OAAO,UAAU,aAAa,YAAY,UAAU,WAAW,IAAI;AACnF,QAAM,UAAoB,CAAC;AAC3B,aAAW,eAAe,cAAc;AACtC,UAAM,OAAO,cAAc,aAAa,QAAQA,QAAM,KAAK,OAAO;AAClE,QAAI,SAAS,OAAW;AACxB,YAAQ,KAAK,iBAAiB,MAAMA,MAAI,CAAC;AAAA,EAC3C;AACA,QAAM,QAAQ,QACX,MAAM,GAAG,YAAY,EACrB,IAAI,CAAC,QAAQ,MAAM,IAAI,IAAI,CAAC,IAAI,OAAO,SAAS,MAAM,GAAG,OAAO,MAAM,GAAG,GAAG,CAAC,WAAM,MAAM,EAAE;AAC9F,QAAM,OAAO,QAAQ,SAAS,MAAM;AACpC,SAAO,KAAK;AAAA,IACV,MAAM,YAAYA,MAAI;AAAA,IACtB,SAAS,WAAW,OAAO,aAAa,QAAQ,oBAAoB,CAAC,aAAa,MAAM,KAAK,IAAI,CAAC,GAAG,OAAO,IAAI,MAAM,IAAI,WAAW,EAAE;AAAA,IACvI,UAAU;AAAA,IACV;AAAA,EACF,CAAC;AACH;AAYO,SAAS,gBAAgB,UAAiC;AAC/D,QAAM,MAAkB,CAAC;AACzB,WAAS,UAAU,IAAI,GAAG;AAC1B,SAAO;AACT;AAEA,SAAS,SAAS,MAAiBA,QAAc,KAAuB;AACtE,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,UAAS,KAAK,CAAC,GAAG,YAAYA,QAAM,CAAC,GAAG,GAAG;AACjF;AAAA,EACF;AACA,MAAI,CAACD,eAAc,IAAI,EAAG;AAC1B,QAAM,SAAS,eAAe,IAAI;AAClC,MAAI,CAAC,QAAQ;AACX,QAAI,OAAO,MAAM,UAAU,KAAK,OAAO,KAAK,aAAa,WAAW;AAClE,UAAI,KAAK;AAAA,QACP,MAAM,YAAYC,MAAI;AAAA,QACtB,SAAS,0DAA0DE,OAAM,KAAK,QAAQ,CAAC;AAAA,QACvF,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AACA,eAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,UAAI,mBAAmB,KAAK,KAAK,GAAG,CAAC,GAAG;AACtC,cAAM,OAAO,eAAe,GAAG;AAC/B,YAAI,KAAK;AAAA,UACP,MAAM,YAAYF,MAAI;AAAA,UACtB,SAAS,IAAI,GAAG,sBAAsB,OAAO,kBAAkB,IAAI,OAAO,iBAAiB,cAAc,KAAK,IAAI,CAAC,GAAG;AAAA,UACtH,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AACA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,UAAI,QAAQ,WAAY,UAAS,OAAO,UAAUA,QAAM,GAAG,GAAG,GAAG;AAAA,IACnE;AACA;AAAA,EACF;AACA,MAAI,OAAO,OAAO;AAChB,QAAI,KAAK,EAAE,MAAM,YAAYA,MAAI,GAAG,SAAS,OAAO,OAAO,UAAU,KAAK,CAAC;AAC3E;AAAA,EACF;AACA,aAAW,QAAQ,OAAO,OAAO;AAC/B,QAAI,SAAS,UAAU;AACrB,UAAI;AACF,YAAI,OAAO,KAAK,QAAkB,KAAK,KAA2B;AAAA,MACpE,SAAS,KAAK;AACZ,YAAI,KAAK;AAAA,UACP,MAAM,YAAYA,MAAI;AAAA,UACtB,SAAS,2BAA2B,KAAK,MAAM,IAAI,KAAK,SAAS,EAAE,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,UACxH,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF,WAAW,SAAS,WAAW;AAC7B,YAAM,SAAS,SAAsB,KAAK,SAAS,IAAI;AACvD,UAAI,OAAO,gBAAgB,QAAW;AACpC,YAAI,KAAK;AAAA,UACP,MAAM,YAAYA,MAAI;AAAA,UACtB,SAAS,mDAAmD,OAAO,WAAW;AAAA,UAC9E,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF,WAAW,SAAS,aAAa;AAC/B,eAAS,KAAK,WAAW,UAAUA,QAAM,WAAW,GAAG,GAAG;AAAA,IAC5D,WAAW,SAAS,cAAc;AAChC,eAAS,KAAK,OAAO,UAAUA,QAAM,OAAO,GAAG,GAAG;AAAA,IACpD,WAAW,SAAS,UAAU;AAC5B,eAAS,KAAK,QAAQ,UAAUA,QAAM,QAAQ,GAAG,GAAG;AAAA,IACtD;AAAA,EACF;AACF;AAQO,SAAS,iBAAiB,OAA6B;AAC5D,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,gBAAgB;AAC3D,MAAI,CAACD,eAAc,KAAK,EAAG,QAAO;AAGlC,QAAM,cAAc,OAAO,KAAK,KAAK,EAAE;AAAA,IACrC,CAAC,QACC,QAAQ,cAAc,eAAe,KAAK,MAAM,GAAG,CAAC,KAAK,mBAAmB,KAAK,MAAM,GAAG,CAAC;AAAA,EAC/F;AACA,MAAI,YAAa,QAAO,EAAE,UAAU,MAAM;AAC1C,QAAM,MAAiC,CAAC;AACxC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,EAAG,KAAI,GAAG,IAAI,iBAAiB,KAAK;AACnF,SAAO;AACT;AAaO,IAAM,qBAAN,cAAiC,MAAM;AAAA;AAAA,EAEnC;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAET,YAAY,SAAiB,KAAaC,QAAc,OAAiB;AACvE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,MAAM;AACX,SAAK,OAAOA;AACZ,SAAK,QAAQ;AAAA,EACf;AACF;AAEA,IAAM,WAAW;AAEjB,SAAS,eAAe,MAAc,MAAsB;AAC1D,QAAM,SAAS,KAAK,QAAQ,OAAO,GAAG;AACtC,MAAI,SAAS,KAAK,MAAM,EAAG,QAAO;AAClC,MAAI,SAAS,KAAK,IAAI,EAAG,QAAO,IAAI,IAAI,QAAQ,IAAI,EAAE,SAAS;AAC/D,MAAI,OAAO,WAAW,GAAG,KAAK,eAAe,KAAK,MAAM,EAAG,QAAO,MAAM,UAAU,MAAM;AACxF,SAAO,MAAM,UAAU,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,QAAQ,IAAI,GAAG,MAAM,CAAC;AACnF;AAEA,SAAS,YAAY,KAAgB,SAAwC;AAC3E,MAAI,YAAY,GAAI,QAAO;AAC3B,MAAI,CAAC,QAAQ,WAAW,GAAG,EAAG,QAAO;AACrC,MAAI,OAA8B;AAClC,aAAW,OAAO,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG;AAC7C,UAAMM,WAAU,mBAAmB,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG;AAC9E,QAAI,MAAM,QAAQ,IAAI,EAAG,QAAO,KAAK,OAAOA,QAAO,CAAC;AAAA,aAC3CP,eAAc,IAAI,KAAK,OAAO,MAAMO,QAAO,EAAG,QAAO,KAAKA,QAAO;AAAA,QACrE,QAAO;AAAA,EACd;AACA,SAAO;AACT;AASO,SAAS,YAAY,UAAqB,QAA8B;AAC7E,QAAM,YAAY,oBAAI,IAAuB;AAC7C,QAAM,OAAO,CAAC,SAA4B;AACxC,QAAI,CAAC,UAAU,IAAI,IAAI,GAAG;AACxB,YAAM,MAAM,OAAO,IAAI;AACvB,UAAI,QAAQ,OAAW,OAAM,IAAI,MAAM,yBAAyB;AAChE,gBAAU,IAAI,MAAM,GAAG;AAAA,IACzB;AACA,WAAO,UAAU,IAAI,IAAI;AAAA,EAC3B;AAEA,QAAM,OAAO,CAAC,MAAiBN,QAAc,MAAc,UAA+B;AACxF,QAAI,MAAM,QAAQ,IAAI;AACpB,aAAO,KAAK,IAAI,CAAC,MAAM,MAAM,KAAK,MAAM,YAAYA,QAAM,CAAC,GAAG,MAAM,KAAK,CAAC;AAC5E,QAAI,CAACD,eAAc,IAAI,EAAG,QAAO;AACjC,QAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AACrC,QAAI,OAAO,MAAM,MAAM,EAAG,QAAO,OAAO,MAAMC,QAAM,MAAM,KAAK;AAC/D,UAAM,MAAiC,CAAC;AACxC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,UAAI,GAAG,IACL,QAAQ,aAAa,cAAc,KAAK,IACpC,QACA,KAAK,OAAO,UAAUA,QAAM,GAAG,GAAG,MAAM,KAAK;AAAA,IACrD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,CACb,MACAA,QACA,MACA,UACc;AACd,UAAM,MAAM,KAAK;AACjB,UAAM,QAAQ,YAAYA,MAAI;AAC9B,UAAM,OAAO,CAAC,YAA2B;AACvC,YAAM,IAAI,mBAAmB,SAAS,OAAO,QAAQ,WAAW,MAAME,OAAM,GAAG,GAAGF,QAAM,KAAK;AAAA,IAC/F;AACA,QAAI,OAAO,QAAQ;AACjB,aAAO,KAAK,mBAAmB,KAAK,uCAAuCE,OAAM,GAAG,CAAC,GAAG;AAC1F,UAAM,QAAQ,OAAO,KAAK,IAAI,EAAE,OAAO,CAACK,SAAQA,SAAQ,MAAM;AAC9D,QAAI,MAAM,SAAS,GAAG;AACpB,aAAO;AAAA,QACL,mBAAmB,KAAK,kDAAkD,MAAM,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MAC1H;AAAA,IACF;AACA,UAAM,OAAO,IAAI,QAAQ,GAAG;AAC5B,UAAM,WAAW,OAAO,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI;AACnD,UAAM,UAAU,OAAO,IAAI,KAAK,IAAI,MAAM,OAAO,CAAC;AAClD,QAAI;AACJ,QAAI,aAAa,IAAI;AACnB,UAAI,SAAS,IAAI;AACf,eAAO;AAAA,UACL,wBAAwB,GAAG,QAAQ,KAAK,gHAAgH,GAAG;AAAA,QAC7J;AAAA,MACF;AACA,aAAO;AAAA,IACT,OAAO;AACL,aAAO,eAAe,MAAM,QAAQ;AAAA,IACtC;AACA,UAAM,MAAM,YAAY,KAAK,OAAO,GAAG,IAAI,IAAI,OAAO;AACtD,QAAI,MAAM,SAAS,GAAG,GAAG;AACvB,aAAO;AAAA,QACL,iBAAiB,KAAK,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,KAAK,MAAM,CAAC;AAAA,MACzD;AAAA,IACF;AACA,QAAI;AACJ,QAAI;AACF,YAAM,KAAK,IAAI;AAAA,IACjB,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,wBAAwB,GAAG,QAAQ,KAAK,qBAAqB,IAAI,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACzH;AAAA,IACF;AACA,UAAM,SAAS,YAAY,KAAK,OAAO;AACvC,QAAI,WAAW,QAAW;AACxB,aAAO;AAAA,QACL,wBAAwB,GAAG,QAAQ,KAAK,MAAM,IAAI,8BAA8B,OAAO;AAAA,MACzF;AAAA,IACF;AACA,WAAO,KAAK,QAAQP,QAAM,MAAM,CAAC,GAAG,OAAO,GAAG,CAAC;AAAA,EACjD;AAEA,SAAO,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC;AAClC;;;ACxtCA,OAAOQ,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAO,QAAQ;AAUR,IAAM,WAA8B,CAAC,QAAQ,YAAY,oBAAoB,QAAQ;AAErF,IAAM,YAAY;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,YAAY;AAAA,EACvB;AAAA,EACA,GAAG;AAAA,EACH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,mBAAmB,CAAC,UAAU,uBAAuB,YAAY;AAyE9E,SAAS,WAAW,OAA2B;AAC7C,SAAO,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,OAAO,GAAG,CAAC;AACrD;AAGA,eAAsB,iBAAiB,OAAiB,SAAoC;AAC1F,QAAM,QAAQ,MAAM,GAAG,WAAW,KAAK,GAAG;AAAA,IACxC,KAAK;AAAA,IACL,UAAU;AAAA,IACV,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,KAAK;AAAA,EACP,CAAC;AACD,SAAO,MAAM,IAAI,CAAC,SAASC,MAAK,QAAQ,IAAI,CAAC,EAAE,KAAK;AACtD;AAEO,SAAS,qBAAqB,OAAiB,SAA2B;AAC/E,QAAM,QAAQ,GAAG,KAAK,WAAW,KAAK,GAAG;AAAA,IACvC,KAAK;AAAA,IACL,UAAU;AAAA,IACV,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,KAAK;AAAA,EACP,CAAC;AACD,SAAO,MAAM,IAAI,CAAC,SAASA,MAAK,QAAQ,IAAI,CAAC,EAAE,KAAK;AACtD;AAGO,SAAS,UAAU,MAAc,SAAyB;AAC/D,QAAM,MAAMA,MAAK,SAAS,SAAS,IAAI;AACvC,MAAI,OAAO,CAAC,IAAI,WAAW,IAAI,KAAK,CAACA,MAAK,WAAW,GAAG,EAAG,QAAO,IAAI,QAAQ,OAAO,GAAG;AACxF,SAAOA,MAAK,QAAQ,IAAI,EAAE,QAAQ,OAAO,GAAG;AAC9C;AAEA,SAAS,YAAY,MAAuB;AAC1C,SAAO,kBAAkB,IAAI,MAAM;AACrC;AAGO,SAAS,cAAc,MAAc,OAAwB;AAClE,MAAI;AACF,WAAO,KAAK,MAAM,oBAAoB,kBAAkB,KAAK,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC;AAAA,EAClF,SAAS,KAAK;AACZ,UAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC9D,UAAM,IAAI;AAAA,MACR,GAAG,KAAK,mBAAmB,MAAM;AAAA,IACnC;AAAA,EACF;AACF;AAGO,SAAS,oBAAoB,MAAuB;AACzD,SAAO,YAAY,IAAI;AACzB;AAMA,SAASC,eAAc,OAAkD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAASC,UAAS,OAAwB;AACxC,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,OAAO,KAAK,UAAU,KAAK;AACjC,SAAO,KAAK,SAAS,KAAK,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,WAAM;AACtD;AAEA,SAASC,cAAa,GAAW,GAAmB;AAClD,QAAM,KAAK,MAAM,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC;AAC3D,WAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,QAAI,OAAO,GAAG,CAAC;AACf,OAAG,CAAC,IAAI;AACR,aAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,YAAM,MAAM,GAAG,CAAC;AAChB,SAAG,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;AACjF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,GAAG,EAAE,MAAM;AACpB;AAEA,SAAS,QAAQ,KAAa,OAA8C;AAC1E,QAAM,QAAQ,IAAI,YAAY;AAC9B,SAAO,MACJ,IAAI,CAAC,UAAU,EAAE,MAAM,GAAGA,cAAa,OAAO,KAAK,YAAY,CAAC,EAAE,EAAE,EACpE,OAAO,CAAC,EAAE,EAAE,MAAM,KAAK,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG;AACnC;AAEA,SAAS,aAAa,KAAsB;AAC1C,SAAO,QAAQ,cAAc,IAAI,WAAW,IAAI;AAClD;AAEA,SAAS,OAAO,IAAY,KAA8B;AACxD,MAAI,OAAO,QAAQ,SAAU,QAAO,GAAG,EAAE,IAAI,GAAG;AAChD,SAAO,KAAK,GAAG,EAAE,IAAI,GAAG,KAAK;AAC/B;AAEA,SAAS,OAAO,IAAoB;AAClC,SAAO,KAAK,GAAG,EAAE,OAAO;AAC1B;AAGO,SAAS,SAAS,MAAgC;AACvD,SAAO,SAAS,KAAK,CAAC,SAAS,KAAK,IAAI,MAAM,MAAS;AACzD;AAEA,IAAM,eAAN,MAAmB;AAAA,EACR,WAAqB,CAAC;AAAA,EACtB,WAAqB,CAAC;AAAA,EAE/B,QAAQ,IAAY,MAAoB;AACtC,SAAK,SAAS,KAAK,GAAG,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE;AAAA,EAC3C;AAAA,EAEA,YAAY,OAAgB,IAAY,KAAmB;AACzD,QAAI,UAAU,OAAW;AACzB,QAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AACrE,WAAK,QAAQ,IAAI,IAAI,GAAG,gDAAgDD,UAAS,KAAK,CAAC,EAAE;AAAA,IAC3F;AAAA,EACF;AAAA,EAEA,QAAQ,OAAgB,IAAY,KAAmB;AACrD,QAAI,UAAU,UAAa,OAAO,UAAU,WAAW;AACrD,WAAK,QAAQ,IAAI,IAAI,GAAG,gCAAgCA,UAAS,KAAK,CAAC,EAAE;AAAA,IAC3E;AAAA,EACF;AAAA,EAEA,KAAK,KAA8B,IAAY,OAA0B,MAAoB;AAC3F,eAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,UAAI,MAAM,SAAS,GAAG,KAAK,aAAa,GAAG,EAAG;AAC9C,YAAM,OAAO,QAAQ,KAAK,KAAK;AAC/B,YAAM,OAAO,OACT,kBAAkB,IAAI,OACtB,kBAAkB,MAAM,OAAO,CAAC,MAAM,MAAM,SAAS,EAAE,KAAK,IAAI,CAAC;AACrE,UAAK,UAAgC,SAAS,GAAG,GAAG;AAClD,aAAK,QAAQ,IAAI,IAAI,GAAG,yBAAyB,IAAI,oCAAoC;AAAA,MAC3F,OAAO;AACL,aAAK,QAAQ,IAAI,IAAI,GAAG,cAAc,IAAI,QAAQ,IAAI,EAAE;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,KAAK,KAA8B,IAAY,MAAc,WAA0B;AACrF,UAAM,MAAM,SAAS,OAAO,CAAC,SAAS,IAAI,IAAI,MAAM,MAAS;AAC7D,QAAI,aAAa,IAAI,WAAW,GAAG;AACjC,WAAK;AAAA,QACH;AAAA,QACA,8EAA8E,SAAS,SAAS,6BAA6B,EAAE;AAAA,MACjI;AAAA,IACF;AACA,QAAI,IAAI,SAAS,GAAG;AAClB,WAAK;AAAA,QACH;AAAA,QACA,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,OAAO,CAAC,mBAAmB,IAAI,gCAAgC,SAAS,SAAS,2BAA2B,6BAA6B;AAAA,MAC5K;AAAA,IACF;AACA,eAAW,QAAQ,KAAK;AACtB,UAAI,OAAO,IAAI,IAAI,MAAM,YAAa,IAAI,IAAI,EAAa,WAAW,GAAG;AACvE,aAAK,QAAQ,IAAI,IAAI,IAAI,qCAAqCA,UAAS,IAAI,IAAI,CAAC,CAAC,EAAE;AAAA,MACrF;AAAA,IACF;AACA,QAAI,IAAI,SAAS,UAAa,OAAO,IAAI,SAAS,UAAU;AAC1D,WAAK,QAAQ,IAAI,gCAAgCA,UAAS,IAAI,IAAI,CAAC,EAAE;AAAA,IACvE;AACA,QAAI,IAAI,SAAS,UAAa,CAACD,eAAc,IAAI,IAAI,GAAG;AACtD,WAAK,QAAQ,IAAI,8CAA8CC,UAAS,IAAI,IAAI,CAAC,EAAE;AAAA,IACrF;AACA,QAAI,IAAI,WAAW,UAAa,IAAI,gBAAgB,QAAW;AAC7D,WAAK;AAAA,QACH;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,gBAAgB,OAAW,MAAK,YAAY,IAAI,aAAa,OAAO,IAAI,aAAa,CAAC;AAC9F,QAAI,IAAI,YAAY,UAAa,CAACD,eAAc,IAAI,OAAO,GAAG;AAC5D,WAAK;AAAA,QACH;AAAA,QACA,iGAAiGC,UAAS,IAAI,OAAO,CAAC;AAAA,MACxH;AAAA,IACF;AACA,QAAI,IAAI,YAAY,QAAW;AAC7B,UAAI,CAACD,eAAc,IAAI,OAAO,GAAG;AAC/B,aAAK;AAAA,UACH;AAAA,UACA,+FAA+FC,UAAS,IAAI,OAAO,CAAC;AAAA,QACtH;AAAA,MACF,OAAO;AACL,mBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,IAAI,OAAO,GAAG;AACvD,cAAI,CAAC,oBAAoB,KAAK,IAAI,KAAK,SAAS,OAAO;AACrD,iBAAK;AAAA,cACH;AAAA,cACA,iBAAiB,IAAI;AAAA,YACvB;AAAA,UACF;AACA,cAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG;AACnD,iBAAK;AAAA,cACH,OAAO,IAAI,SAAS;AAAA,cACpB,IAAI,IAAI,uCAAuCA,UAAS,KAAK,CAAC;AAAA,YAChE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,UAAU,QAAW;AAC3B,YAAM,QAAQ,IAAI;AAClB,UAAI,OAAO,UAAU,aAAa,CAACD,eAAc,KAAK,GAAG;AACvD,aAAK;AAAA,UACH;AAAA,UACA,0DAA0DC,UAAS,KAAK,CAAC;AAAA,QAC3E;AAAA,MACF,WAAWD,eAAc,KAAK,GAAG;AAC/B,aAAK,KAAK,OAAO,OAAO,IAAI,OAAO,GAAG,CAAC,UAAU,WAAW,GAAG,cAAc;AAC7E,aAAK,YAAY,MAAM,QAAQ,OAAO,IAAI,OAAO,GAAG,QAAQ;AAC5D,aAAK,YAAY,MAAM,WAAW,OAAO,IAAI,OAAO,GAAG,WAAW;AAAA,MACpE;AAAA,IACF;AACA,SAAK,YAAY,IAAI,UAAU,IAAI,UAAU;AAC7C,SAAK,YAAY,IAAI,WAAW,IAAI,WAAW;AAC/C,SAAK,QAAQ,IAAI,cAAc,IAAI,cAAc;AACjD,SAAK,QAAQ,IAAI,gBAAgB,IAAI,gBAAgB;AACrD,QAAI,IAAI,cAAc,OAAW,MAAK,UAAU,IAAI,WAAW,OAAO,IAAI,WAAW,CAAC;AAAA,EACxF;AAAA,EAEA,YAAY,OAAgB,IAAkB;AAC5C,QAAI,CAACA,eAAc,KAAK,GAAG;AACzB,WAAK,QAAQ,IAAI,yDAAyDC,UAAS,KAAK,CAAC,EAAE;AAC3F;AAAA,IACF;AACA,SAAK,KAAK,OAAO,IAAI,CAAC,QAAQ,SAAS,GAAG,aAAa;AACvD,QACE,MAAM,SAAS,UACf,OAAO,MAAM,SAAS,YACtB,OAAO,MAAM,SAAS;AAEtB,WAAK,QAAQ,IAAI,6CAA6CA,UAAS,MAAM,IAAI,CAAC,EAAE;AACtF,QAAI,OAAO,MAAM,SAAS,UAAU;AAClC,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAM,SAAS,kBAAkB,MAAM,IAAI,CAAC,GAAG;AAClD,cAAM,OAAO,QAAQ,MAAM,MAAM,KAAK;AACtC,aAAK;AAAA,UACH;AAAA,UACA,UAAU,KAAK,UAAU,MAAM,IAAI,CAAC,8BAA8B,OAAO,kBAAkB,IAAI,OAAO,iBAAiB,MAAM,KAAK,IAAI,CAAC,GAAG;AAAA,QAC5I;AAAA,MACF;AAAA,IACF;AACA,UAAM,UAAU,MAAM;AACtB,QACE,YAAY,UACZ,OAAO,YAAY,YACnB,EAAED,eAAc,OAAO,KAAK,OAAO,QAAQ,WAAW,WACtD;AACA,WAAK,QAAQ,IAAI,wDAAwDC,UAAS,OAAO,CAAC,EAAE;AAAA,IAC9F;AAAA,EACF;AAAA,EAEA,UAAU,OAAgB,IAAkB;AAC1C,QAAI,UAAU,MAAO;AACrB,QAAI,CAACD,eAAc,KAAK,GAAG;AACzB,WAAK,QAAQ,IAAI,wDAAwDC,UAAS,KAAK,CAAC,EAAE;AAC1F;AAAA,IACF;AACA,SAAK,KAAK,OAAO,IAAI,CAAC,aAAa,YAAY,OAAO,GAAG,kBAAkB;AAC3E,eAAW,OAAO,CAAC,aAAa,UAAU,GAAG;AAC3C,YAAM,OAAO,MAAM,GAAG;AACtB,UAAI,SAAS,WAAc,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,OAAO,MAAM,QAAQ;AACvF,aAAK,QAAQ,IAAI,IAAI,GAAG,sCAAsCA,UAAS,IAAI,CAAC,EAAE;AAAA,IAClF;AACA,QAAI,MAAM,UAAU,UAAa,MAAM,UAAU,UAAU,MAAM,UAAU;AACzE,WAAK,QAAQ,IAAI,2CAA2CA,UAAS,MAAM,KAAK,CAAC,EAAE;AAAA,EACvF;AAAA,EAEA,MAAM,OAAgB,KAA2C;AAC/D,QAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAK,QAAQ,IAAI,IAAI,GAAG,2CAA2CA,UAAS,KAAK,CAAC,EAAE;AACpF;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,MAAM,WAAW,GAAG;AACzC,WAAK,QAAQ,IAAI,6DAA6D;AAAA,IAChF;AACA,UAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,YAAM,KAAK,OAAO,KAAK,CAAC;AACxB,UAAI,CAACD,eAAc,IAAI,GAAG;AACxB,aAAK,QAAQ,IAAI,8BAA8BC,UAAS,IAAI,CAAC,EAAE;AAC/D;AAAA,MACF;AACA,WAAK,KAAK,MAAM,IAAI,WAAW,MAAM;AACrC,WAAK,KAAK,MAAM,IAAI,QAAQ,IAAI;AAAA,IAClC,CAAC;AAAA,EACH;AACF;AAGO,SAAS,kBAAkB,KAA0D;AAC1F,QAAM,QAAQ,IAAI,aAAa;AAC/B,MAAI,CAACD,eAAc,GAAG,GAAG;AACvB,UAAM,QAAQ,IAAI,qCAAqCC,UAAS,GAAG,CAAC,EAAE;AACtE,WAAO,EAAE,UAAU,MAAM,UAAU,UAAU,MAAM,SAAS;AAAA,EAC9D;AACA,QAAM,KAAK,KAAK,IAAI,WAAW,MAAM;AACrC,QAAM,SAAS,IAAI,UAAU;AAC7B,MAAI,QAAQ;AACV,UAAM,MAAM,IAAI,OAAO,OAAO;AAC9B,eAAW,QAAQ,UAAU;AAC3B,UAAI,IAAI,IAAI,MAAM,QAAW;AAC3B,cAAM,SAAS;AAAA,UACb,cAAc,IAAI;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AACA,eAAW,OAAO,CAAC,UAAU,eAAe,uBAAuB,cAAc,SAAS,GAAG;AAC3F,UAAI,IAAI,GAAG,MAAM,QAAW;AAC1B,cAAM,SAAS;AAAA,UACb,cAAc,GAAG;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AACA,UAAM,YAAY,IAAI,UAAU,IAAI,UAAU;AAC9C,UAAM,YAAY,IAAI,WAAW,IAAI,WAAW;AAChD,UAAM,QAAQ,IAAI,gBAAgB,IAAI,gBAAgB;AACtD,QAAI,IAAI,cAAc,OAAW,OAAM,UAAU,IAAI,WAAW,WAAW;AAAA,EAC7E,OAAO;AACL,UAAM,KAAK,KAAK,IAAI,QAAQ,IAAI;AAAA,EAClC;AACA,MAAI,IAAI,UAAU,OAAW,OAAM,MAAM,IAAI,OAAO,OAAO;AAC3D,MAAI,IAAI,aAAa,OAAW,OAAM,MAAM,IAAI,UAAU,UAAU;AACpE,MACE,IAAI,SAAS,WACZ,CAAC,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK,CAAC,MAAM,OAAO,MAAM,QAAQ,IACvE;AACA,UAAM,QAAQ,IAAI,2CAA2CA,UAAS,IAAI,IAAI,CAAC,EAAE;AAAA,EACnF;AACA,MAAI,IAAI,WAAW,WAAc,OAAO,IAAI,WAAW,YAAY,IAAI,WAAW,KAAK;AACrF,UAAM;AAAA,MACJ;AAAA,MACA,0DAA0DA,UAAS,IAAI,MAAM,CAAC;AAAA,IAChF;AAAA,EACF;AACA,QAAM,QAAQ,IAAI,OAAO,IAAI,OAAO;AACpC,MAAI,IAAI,SAAS,UAAa,OAAO,IAAI,SAAS,aAAa,OAAO,IAAI,SAAS,UAAU;AAC3F,UAAM,QAAQ,IAAI,+CAA+CA,UAAS,IAAI,IAAI,CAAC,EAAE;AAAA,EACvF;AACA,SAAO,EAAE,UAAU,MAAM,UAAU,UAAU,MAAM,SAAS;AAC9D;AAiBA,IAAM,YAAY,oBAAI,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,SAAS,WAAW,MAAsB;AAC/C,QAAM,OAAgC,CAAC;AACvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,QAAI,UAAU,IAAI,GAAG,KAAK,QAAQ,WAAY;AAC9C,SAAK,GAAG,IAAI;AAAA,EACd;AACA,SAAO;AACT;AAGO,SAAS,UAAU,MAA+B;AACvD,QAAM,OAAsB,CAAC;AAC7B,OAAK,OAAO;AAAA,IAAQ,CAAC,MAAM,MACzB,KAAK,KAAK,EAAE,OAAO,SAAS,MAAM,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC;AAAA,EAC7E;AACA,MAAI,KAAK,OAAO;AACd,SAAK,MAAM;AAAA,MAAQ,CAAC,MAAM,MACxB,KAAK,KAAK,EAAE,OAAO,QAAQ,MAAM,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC;AAAA,IAC5E;AAAA,EACF,OAAO;AACL,SAAK,KAAK,EAAE,OAAO,QAAQ,MAAM,WAAW,IAAI,GAAG,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC;AAAA,EACzE;AACA,OAAK,UAAU;AAAA,IAAQ,CAAC,MAAM,MAC5B,KAAK,KAAK,EAAE,OAAO,YAAY,MAAM,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC;AAAA,EACtF;AACA,SAAO;AACT;AAGO,SAAS,YAAY,MAAyB;AACnD,SACE,KAAK,UAAU,WAAc,KAAK,OAAO,UAAU,KAAK,MAAM,KAAK,UAAU,UAAU,KAAK;AAEhG;AAWO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAC5C,YACE,SAES,aACA,IACT;AACA,UAAM,OAAO;AAHJ;AACA;AAGT,SAAK,OAAO;AAAA,EACd;AACF;AAEA,IAAM,cAAc;AACpB,IAAM,oBAAoB;AAE1B,SAAS,OAAO,MAAc,OAA2B,IAAuB;AAC9E,MAAI,KAAK,WAAW,MAAM,GAAG;AAC3B,UAAM,MAAM,KAAK,MAAM,CAAC;AACxB,UAAM,SAAS,MAAM,OAAO,QAAQ,KAAK,GAAG;AAC5C,QAAI,UAAU,QAAW;AACvB,YAAM,IAAI;AAAA,QACR,2BAA2B,MAAM,QAAQ,OAAO,IAAI,qCAAqC,GAAG;AAAA,QAC5F;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,MAAI,CAAC,OAAO,OAAO,MAAM,MAAM,IAAI,GAAG;AACpC,UAAM,OAAO,OAAO,KAAK,MAAM,IAAI;AACnC,UAAM,IAAI;AAAA,MACR,2BAA2B,MAAM,QAAQ,OAAO,IAAI,8CAA8C,KAAK,SAAS,KAAK,KAAK,IAAI,IAAI,MAAM,uDAAuD,IAAI;AAAA,MACnM;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAOO,SAAS,YAAY,OAAkB,OAA2B,KAAK,IAAe;AAC3F,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,MAAM,SAAS,IAAI,EAAG,QAAO;AAClC,UAAM,QAAQ,kBAAkB,KAAK,KAAK;AAC1C,QAAI,MAAO,QAAO,OAAO,MAAM,CAAC,GAAG,OAAO,EAAE;AAC5C,WAAO,MAAM,QAAQ,aAAa,CAAC,QAAQ,SAAiB;AAC1D,YAAM,WAAW,OAAO,MAAM,OAAO,EAAE;AACvC,aAAO,OAAO,aAAa,WAAW,WAAW,KAAK,UAAU,QAAQ;AAAA,IAC1E,CAAC;AAAA,EACH;AACA,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,CAAC,MAAM,MAAM,YAAY,MAAM,OAAO,OAAO,IAAI,CAAC,CAAC,CAAC;AAC/F,MAAID,eAAc,KAAK,GAAG;AACxB,UAAM,MAAkB,CAAC;AACzB,eAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,UAAI,GAAG,IAAI,YAAY,MAAmB,OAAO,OAAO,IAAI,GAAG,CAAC;AAAA,IAClE;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,SAAS,eAAe,OAAgB,KAAK,IAAyC;AAC3F,QAAM,MAA2C,CAAC;AAClD,QAAM,OAAO,CAAC,MAAe,UAAkB;AAC7C,QAAI,OAAO,SAAS,UAAU;AAC5B,iBAAW,SAAS,KAAK,SAAS,WAAW,EAAG,KAAI,KAAK,EAAE,MAAM,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;AAAA,IACxF,WAAW,MAAM,QAAQ,IAAI,EAAG,MAAK,QAAQ,CAAC,MAAM,MAAM,KAAK,MAAM,OAAO,OAAO,CAAC,CAAC,CAAC;AAAA,aAC7EA,eAAc,IAAI,GAAG;AAC5B,iBAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,IAAI,EAAG,MAAK,MAAM,OAAO,OAAO,GAAG,CAAC;AAAA,IAC/E;AAAA,EACF;AACA,OAAK,OAAO,EAAE;AACd,SAAO;AACT;AAGO,IAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,SAAS,gBAAgB,MAAY,OAA2B,IAAkB;AACvF,QAAM,MAA+B,EAAE,GAAG,KAAK;AAC/C,aAAW,OAAO,mBAAmB;AACnC,UAAM,QAAS,KAAiC,GAAG;AACnD,QAAI,UAAU,OAAW,KAAI,GAAG,IAAI,YAAY,OAAoB,OAAO,OAAO,IAAI,GAAG,CAAC;AAAA,EAC5F;AACA,SAAO;AACT;AAGA,SAAS,kBACP,MACA,aACA,KACU;AACV,QAAM,WAAqB,CAAC;AAC5B,QAAM,QAAQ,IAAI,IAAI,WAAW;AACjC,QAAM,eAAe,IAAI,IAAI,WAAW;AACxC,aAAW,WAAW,UAAU,IAAI,GAAG;AACrC,eAAW,QAAQ,OAAO,KAAK,QAAQ,KAAK,WAAW,CAAC,CAAC,EAAG,cAAa,IAAI,IAAI;AAAA,EACnF;AACA,aAAW,WAAW,UAAU,IAAI,GAAG;AACrC,UAAM,UAAU,QAAQ,UAAU,aAAa,eAAe;AAC9D,eAAW,OAAO,mBAAmB;AACnC,YAAM,QAAS,QAAQ,KAAiC,GAAG;AAC3D,iBAAW,OAAO,eAAe,OAAO,OAAO,QAAQ,IAAI,GAAG,CAAC,GAAG;AAChE,YAAI,IAAI,KAAK,WAAW,MAAM,GAAG;AAC/B,cAAI,IAAI,IAAI,KAAK,MAAM,CAAC,CAAC,MAAM,QAAW;AACxC,qBAAS;AAAA,cACP,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,qCAAqC,IAAI,KAAK,MAAM,CAAC,CAAC;AAAA,YAChF;AAAA,UACF;AAAA,QACF,WAAW,CAAC,QAAQ,IAAI,IAAI,IAAI,GAAG;AACjC,mBAAS;AAAA,YACP,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,4DAA4D,IAAI,IAAI;AAAA,UAC9F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,eAAW,QAAQ,OAAO,KAAK,QAAQ,KAAK,WAAW,CAAC,CAAC,EAAG,OAAM,IAAI,IAAI;AAAA,EAC5E;AACA,SAAO;AACT;AAMA,SAAS,UAAU,UAAkD;AACnE,QAAM,MAAMD,MAAK,QAAQ,QAAQ;AACjC,SAAO,CAAC,YAAoB;AAC1B,QAAI,2BAA2B,KAAK,OAAO,GAAG;AAC5C,YAAM,IAAI,MAAM,uEAAuE;AAAA,IACzF;AACA,UAAM,OAAOA,MAAK,WAAW,OAAO,IAAI,UAAUA,MAAK,QAAQ,KAAK,OAAO;AAC3E,WAAO,cAAcI,IAAG,aAAa,MAAM,MAAM,GAAG,OAAO;AAAA,EAC7D;AACF;AAEA,SAAS,WAAW,MAAY,IAAY,MAA4C;AACtF,QAAM,MAA+B,EAAE,GAAG,KAAK;AAC/C,aAAW,OAAO,kBAAkB;AAClC,UAAM,QAAQ,KAAK,GAAG;AACtB,QAAI,UAAU,OAAW;AACzB,QAAI;AACF,UAAI,GAAG,IAAI,YAAY,OAAO,IAAI;AAAA,IACpC,SAAS,KAAK;AACZ,UAAI,eAAe,oBAAoB;AACrC,cAAM,IAAI,MAAM,GAAG,OAAO,IAAI,GAAG,CAAC,KAAK,IAAI,OAAO,EAAE;AAAA,MACtD;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,MAAgB,MAAwB;AAC1D,QAAM,OAAO,UAAU,IAAI;AAC3B,QAAM,MAAgB,EAAE,GAAG,WAAW,MAAM,IAAI,IAAI,EAAE;AACtD,aAAW,OAAO,CAAC,SAAS,SAAS,UAAU,GAAY;AACzD,UAAM,OAAO,KAAK,GAAG;AACrB,QAAI,KAAM,KAAI,GAAG,IAAI,KAAK,IAAI,CAAC,MAAM,MAAM,WAAW,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;AAAA,EACnF;AACA,SAAO;AACT;AAEA,SAAS,SAAS,MAA0B;AAC1C,QAAM,WAAqB,CAAC;AAC5B,aAAW,WAAW,UAAU,IAAI,GAAG;AACrC,eAAW,OAAO,kBAAkB;AAClC,YAAM,QAAQ,QAAQ,KAAK,GAAG;AAC9B,UAAI,UAAU,OAAW;AACzB,iBAAW,KAAK,gBAAgB,KAAK,GAAG;AACtC,iBAAS,KAAK,GAAG,OAAO,QAAQ,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAMA,SAAS,kBAAkB,UAA4B;AACrD,QAAM,QAAQ,SAAS,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,OAAO,EAAE,CAAC;AAClE,QAAM,OAAO,SAAS,SAAS,MAAM,SAAS,MAAM,SAAS,SAAS,MAAM,MAAM,WAAW;AAC7F,QAAM,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI;AACvC,SAAO,QAAQ,KAAK,IAAI,IAAI,OAAO,GAAG,IAAI;AAC5C;AAEA,SAAS,SAAS,MAAsB;AACtC,SAAOJ,MAAK,SAAS,IAAI,EAAE,QAAQ,cAAc,EAAE;AACrD;AAUA,SAAS,iBAAiB,OAA4C;AACpE,QAAMK,SAAQ,oBAAI,IAAY;AAC9B,aAAW,QAAQ,OAAO,SAAS,CAAC,GAAG;AACrC,eAAW,QAAQ,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,EAAG,CAAAA,OAAM,IAAI,IAAI;AAAA,EACpE;AACA,SAAOA;AACT;AAGO,SAAS,kBAAkB,KAAuB;AACvD,SAAOJ,eAAc,GAAG,KAAK,IAAI,aAAa,KAAK,MAAM,QAAQ,IAAI,KAAK;AAC5E;AAGO,SAAS,cAAc,SAAqC;AACjE,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,QAAM,UAAU,CAAC,GAAG,oBAAI,IAAI,CAAC,eAAe,GAAI,QAAQ,WAAW,CAAC,CAAE,CAAC,CAAC;AACxE,SAAO,QAAQ;AAAA,IAAI,CAAC,WAClB;AAAA,MACE,EAAE,UAAU,QAAQ,UAAU,SAAS,QAAQ,SAAS,cAAc;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,aACd,MACA,MACA,WAAqB,CAAC,GACV;AACZ,QAAM,KAAK,UAAU,MAAM,KAAK,OAAO;AACvC,QAAM,gBAAgB,KAAK,iBAAiB;AAC5C,QAAM,MAAe;AAAA,IACnB;AAAA,IACA,MAAM,SAAS,IAAI;AAAA,IACnB,MAAM;AAAA,IACN,MAAM,CAAC;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AACA,QAAM,SAAqB,EAAE,KAAK,MAAMD,MAAK,QAAQ,IAAI,EAAE;AAC3D,MAAI;AACJ,MAAI;AACF,WAAOI,IAAG,aAAa,MAAM,MAAM;AAAA,EACrC,SAAS,KAAK;AACZ,WAAO,QAAQ,GAAG,EAAE,gCAAgC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AACpG,WAAO;AAAA,EACT;AACA,SAAO,OAAO;AACd,MAAI;AACJ,MAAI;AACF,UAAM,cAAc,MAAM,EAAE;AAAA,EAC9B,SAAS,KAAK;AACZ,WAAO,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC9D,WAAO;AAAA,EACT;AAEA,MAAI,kBAAkB,GAAG,GAAG;AAC1B,WAAO,WAAW;AAClB,WAAO;AAAA,EACT;AAEA,MAAIH,eAAc,GAAG,GAAG;AACtB,QAAI,OAAO,IAAI,SAAS,YAAY,IAAI,KAAM,KAAI,OAAO,IAAI;AAC7D,QAAI,MAAM,QAAQ,IAAI,IAAI;AACxB,UAAI,OAAO,IAAI,KAAK,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AACtE,QAAI,OAAO,IAAI,WAAW,YAAY,IAAI,OAAQ,KAAI,SAAS,IAAI;AACnE,QAAI,IAAI,UAAU,KAAM,KAAI,QAAQ;AAAA,EACtC;AAEA,QAAM,QAAQ,kBAAkB,GAAG;AACnC,aAAW,WAAW,MAAM,SAAU,UAAS,KAAK,GAAG,EAAE,KAAK,OAAO,GAAG;AACxE,MAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,WAAO,QAAQ,GAAG,EAAE,KAAK,kBAAkB,MAAM,QAAQ,CAAC;AAC1D,WAAO;AAAA,EACT;AACA,QAAM,SAAS;AACf,SAAO,SAAS;AAEhB,MAAI,KAAK,WAAW,OAAO,WAAW,UAAa,CAAC,KAAK,QAAQ,SAAS,OAAO,MAAM,GAAG;AACxF,WAAO,QAAQ,GAAG,EAAE,qBAAqB,OAAO,MAAM,YAAY,KAAK,QAAQ,KAAK,IAAI,KAAK,MAAM;AACnG,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,WAAO,WAAW,QAAQ,OAAO,IAAI;AAAA,EACvC,SAAS,KAAK;AACZ,WAAO,QAAQ,GAAG,EAAE,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AACzE,WAAO;AAAA,EACT;AAEA,QAAM,WAAW;AAAA,IACf,GAAG,SAAS,IAAI;AAAA,IAChB,GAAG,kBAAkB,MAAM,iBAAiB,KAAK,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG;AAAA,EAClF;AACA,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO,QAAQ,GAAG,EAAE,KAAK,kBAAkB,QAAQ,CAAC;AACpD,WAAO;AAAA,EACT;AACA,SAAO,OAAO;AACd,MAAI,OAAO,SAAS,UAAa,OAAO,SAAS,OAAO;AACtD,WAAO,OAAO,OAAO,OAAO,SAAS,YAAY,OAAO,OAAO,OAAO,OAAO;AAAA,EAC/E;AACA,SAAO;AACT;AAMA,SAAS,YAAY,MAAyC;AAC5D,MAAI;AACF,UAAM,KAAK,IAAI,OAAO,MAAM,GAAG;AAC/B,WAAO,CAAC,SAAS,GAAG,KAAK,IAAI;AAAA,EAC/B,QAAQ;AACN,UAAM,SAAS,KAAK,YAAY;AAChC,WAAO,CAAC,SAAS,KAAK,YAAY,EAAE,SAAS,MAAM;AAAA,EACrD;AACF;AAGO,SAAS,YAAY,OAAqB,SAAoC;AACnF,QAAM,QAAQ,QAAQ,QAAQ,CAAC,GAAG,OAAO,OAAO;AAChD,QAAM,WAAW,QAAQ,eAAe,CAAC,GAAG,OAAO,OAAO;AAC1D,QAAM,OAAO,QAAQ,OAAO,YAAY,QAAQ,IAAI,IAAI;AACxD,QAAM,WAAW,CAAC,GAAG,KAAK,EACvB,KAAK,CAAC,GAAG,MAAO,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,IAAI,CAAE,EACvE,OAAO,CAAC,MAAM;AAEb,UAAM,SAAS,EAAE,UAAU,UAAa,EAAE,WAAW;AACrD,QAAI,CAAC,UAAU,KAAK,SAAS,KAAK,CAAC,EAAE,IAAI,KAAK,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,EAAG,QAAO;AACpF,QAAI,CAAC,UAAU,QAAQ,SAAS,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC,MAAM,QAAQ,SAAS,CAAC,CAAC,EAAG,QAAO;AACzF,QAAI,QAAQ,CAAC,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAG,QAAO;AACzD,WAAO;AAAA,EACT,CAAC;AACH,SAAO,WAAW,UAAU,QAAQ,KAAK;AAC3C;AAGO,SAAS,WAAc,OAAY,OAAmC;AAC3E,MAAI,CAAC,SAAS,MAAM,SAAS,EAAG,QAAO;AACvC,SAAO,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,MAAM,UAAU,MAAM,QAAQ,CAAC;AACnE;AAEA,SAAS,QAAQ,MAAsB;AACrC,QAAM,WAAWD,MAAK,QAAQ,IAAI;AAClC,SAAO,QAAQ,aAAa,UAAU,SAAS,YAAY,IAAI;AACjE;AAGO,IAAM,gBAAmC,CAAC,UAAU,WAAW;AAEtE,IAAM,UAAU;AAGhB,SAAS,WAAW,KAAc,MAAc,KAAwB;AACtE,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,eAAW,QAAQ,IAAK,YAAW,MAAM,MAAM,GAAG;AAClD;AAAA,EACF;AACA,MAAI,CAACC,eAAc,GAAG,EAAG;AACzB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,QAAQ,UAAU,OAAO,UAAU,UAAU;AAC/C,YAAM,SAAS,MAAM,MAAM,GAAG,EAAE,CAAC;AACjC,UAAI,UAAU,CAAC,QAAQ,KAAK,MAAM,GAAG;AACnC,YAAI,IAAI,QAAQD,MAAK,QAAQA,MAAK,QAAQ,IAAI,GAAG,OAAO,QAAQ,OAAO,GAAG,CAAC,CAAC,CAAC;AAAA,MAC/E;AAAA,IACF,MAAO,YAAW,OAAO,MAAM,GAAG;AAAA,EACpC;AACF;AAGA,SAAS,eAAe,KAAuB;AAC7C,MAAI,CAACC,eAAc,GAAG,EAAG,QAAO;AAChC,SAAO,IAAI,UAAU,UAAa,SAAS,MAAM,CAAC,SAAS,IAAI,IAAI,MAAM,MAAS;AACpF;AAEA,SAAS,cAAc,MAAc,SAA0B;AAC7D,QAAM,MAAMD,MAAK,SAAS,SAAS,IAAI;AACvC,QAAM,SAAS,OAAO,CAAC,IAAI,WAAW,IAAI,IAAI,MAAM,MAAM,MAAM,OAAO,EAAE,MAAM,GAAG,EAAE;AACpF,SAAO,MAAM,KAAK,CAAC,SAAS,cAAc,SAAS,KAAK,YAAY,CAAC,CAAC;AACxE;AAEA,SAAS,QAAQ,OAAiB,SAA4C;AAC5E,QAAM,WAAqB,CAAC;AAC5B,QAAM,WAAW,IAAI;AAAA,IACnB;AAAA,MACE,GAAG,cAAc,OAAO;AAAA,MACxB,IAAI,QAAQ,WAAW,CAAC,GAAG,IAAI,CAAC,SAASA,MAAK,QAAQ,QAAQ,SAAS,IAAI,CAAC;AAAA,IAC9E,EAAE,IAAI,OAAO;AAAA,EACf;AACA,QAAM,SAAS,MACZ,OAAO,CAAC,SAAS,CAAC,SAAS,IAAI,QAAQ,IAAI,CAAC,CAAC,EAC7C,IAAI,CAAC,SAAS;AACb,UAAM,QAAkB,CAAC;AACzB,WAAO,EAAE,MAAM,QAAQ,aAAa,MAAM,SAAS,KAAK,GAAG,MAAM;AAAA,EACnE,CAAC,EACA,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,MAAS;AAIrD,QAAM,OAAO,oBAAI,IAAqB;AACtC,aAAW,EAAE,MAAM,QAAQ,EAAE,KAAK,QAAQ;AACxC,QAAI,EAAE,SAAS,OAAW;AAC1B,QAAI;AACF,WAAK,IAAI,MAAM,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAAA,IAChD,QAAQ;AAAA,IAER;AAAA,EACF;AACA,QAAM,aAAa,oBAAI,IAAY;AACnC,aAAW,CAAC,MAAM,GAAG,KAAK,KAAM,YAAW,KAAK,MAAM,UAAU;AAChE,QAAM,YAAsB,CAAC;AAC7B,QAAM,MAAoB,CAAC;AAC3B,aAAW,EAAE,MAAM,QAAQ,GAAG,MAAM,KAAK,QAAQ;AAC/C,UAAM,MAAM,KAAK,IAAI,IAAI;AACzB,UAAM,WACJ,KAAK,IAAI,IAAI,KACb,eAAe,GAAG,MACjB,WAAW,IAAI,QAAQ,IAAI,CAAC,KAAK,cAAc,MAAM,QAAQ,OAAO;AACvE,QAAI,UAAU;AACZ,QAAE,WAAW;AACb,gBAAU,KAAK,EAAE,IAAI,EAAE;AAAA,IACzB,OAAO;AACL,UAAI,KAAK,CAAC;AACV,eAAS,KAAK,GAAG,KAAK;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AAAA,IACL,OAAO,YAAY,KAAK,OAAO;AAAA,IAC/B,SAAS,IAAI;AAAA,IACb;AAAA,IACA,GAAI,UAAU,SAAS,EAAE,WAAW,UAAU,KAAK,EAAE,IAAI,CAAC;AAAA,EAC5D;AACF;AAGA,eAAsB,UAAU,SAAqD;AACnF,SAAO,QAAQ,MAAM,iBAAiB,QAAQ,OAAO,QAAQ,OAAO,GAAG,OAAO;AAChF;AAGO,SAAS,cAAc,SAA4C;AACxE,SAAO,QAAQ,qBAAqB,QAAQ,OAAO,QAAQ,OAAO,GAAG,OAAO;AAC9E;AAOO,SAAS,UAAU,QAA0B;AAClD,QAAM,WAAqB,CAAC;AAC5B,aAAW,QAAQ,OAAO,MAAM,GAAG,GAAG;AACpC,QAAI,SAAS,GAAI;AACjB,UAAM,KAAK;AACX,eAAW,SAAS,KAAK,SAAS,EAAE,EAAG,UAAS,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;AAAA,EAC3E;AACA,SAAO;AACT;AAGO,SAAS,QAAQ,OAA8B,QAAuC;AAC3F,MAAI,OAA8B;AAClC,aAAWM,YAAW,UAAU,MAAM,GAAG;AACvC,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,UAAI,CAAC,QAAQ,KAAKA,QAAO,EAAG,QAAO;AACnC,aAAO,KAAK,OAAOA,QAAO,CAAC;AAAA,IAC7B,WAAWL,eAAc,IAAI,KAAK,OAAO,OAAO,MAAMK,QAAO,GAAG;AAC9D,aAAQ,KAAoBA,QAAO;AAAA,IACrC,MAAO,QAAO;AAAA,EAChB;AACA,SAAO;AACT;AAGO,SAAS,MACd,MACA,QACA,OACM;AACN,MAAI,OAAyC;AAC7C,WAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,IAAK,QAAO,KAAK,OAAO,CAAC,CAAC;AACjE,OAAK,OAAO,OAAO,SAAS,CAAC,CAAC,IAAI;AACpC;;;ACzgCA,IAAM,WAAkB,CAAC,SAAS;AAElC,SAAS,KAAK,MAAc,OAAsB;AAChD,SAAO,CAAC,SAAU,SAAS,KAAK,KAAK,QAAQ,IAAI,IAAI,IAAI,QAAQ,KAAK;AACxE;AAEA,IAAM,KAAa;AAAA,EACjB,SAAS;AAAA,EACT,MAAM,KAAK,GAAG,EAAE;AAAA,EAChB,KAAK,KAAK,GAAG,EAAE;AAAA,EACf,SAAS,KAAK,GAAG,EAAE;AAAA,EACnB,KAAK,KAAK,IAAI,EAAE;AAAA,EAChB,OAAO,KAAK,IAAI,EAAE;AAAA,EAClB,QAAQ,KAAK,IAAI,EAAE;AAAA,EACnB,MAAM,KAAK,IAAI,EAAE;AAAA,EACjB,SAAS,KAAK,IAAI,EAAE;AAAA,EACpB,MAAM,KAAK,IAAI,EAAE;AAAA,EACjB,OAAO,KAAK,IAAI,EAAE;AAAA,EAClB,SAAS,KAAK,IAAI,EAAE;AAAA,EACpB,UAAU,KAAK,IAAI,EAAE;AAAA,EACrB,QAAQ,KAAK,IAAI,EAAE;AACrB;AAEA,IAAM,MAAc;AAAA,EAClB,SAAS;AAAA,EACT,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AACV;AAEO,SAAS,aAAa,SAA0B;AACrD,SAAO,UAAU,KAAK;AACxB;AAGA,IAAM,eAAe;AAEd,SAAS,UAAU,MAAsB;AAC9C,SAAO,KAAK,QAAQ,cAAc,EAAE;AACtC;AAEO,SAAS,cAAc,MAAsB;AAClD,SAAO,UAAU,IAAI,EAAE;AACzB;AAUO,SAAS,aAAa,QAAiB,KAAc,OAAoC;AAC9F,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,IAAI,aAAa,UAAa,IAAI,aAAa,GAAI,QAAO;AAC9D,MAAI,IAAI,SAAS,OAAQ,QAAO;AAChC,QAAM,QAAQ,IAAI;AAClB,MAAI,UAAU,UAAa,UAAU,MAAM,UAAU,OAAO,UAAU,QAAS,QAAO;AACtF,SAAO,QAAQ,WAAW;AAC5B;;;ACzFA,OAAOC,WAAU;AACjB,SAAS,0BAA0B;AAyB5B,SAAS,oBAAoB,SAA0C;AAC5E,QAAM,QAAS,QAAwC;AACvD,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAU,MAA+B;AAC/C,SAAO,OAAO,WAAW,YAAY,WAAW,KAAK,SAAS;AAChE;AAGO,SAAS,QAAQ,OAAsC;AAC5D,QAAM,QAAS,MAA8B;AAC7C,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,EAAE,OAAO,MAAM,IAAI;AACzB,SAAO,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW,EAAE,OAAO,MAAM,IAAI;AACrF;AAGO,SAAS,gBAAgB,MAAsB;AACpD,SAAO,KAAK,QAAQ,gCAAgC,EAAE,EAAE,QAAQ;AAClE;AAGO,SAAS,iBAAiB,SAA0B;AACzD,SAAO,oCAAoC,KAAK,OAAO;AACzD;AAMO,SAAS,eAAe,IAAoB;AACjD,QAAM,OAAO,OAAO,SAAS,EAAE,KAAK,KAAK,IAAI,KAAK,MAAM,EAAE,IAAI;AAC9D,MAAI,OAAO,IAAM,QAAO,GAAG,IAAI;AAC/B,MAAI,OAAO,IAAQ,QAAO,IAAI,OAAO,KAAM,QAAQ,CAAC,CAAC;AACrD,QAAM,eAAe,KAAK,MAAM,OAAO,GAAI;AAC3C,QAAM,UAAU,KAAK,MAAM,eAAe,EAAE;AAC5C,SAAO,GAAG,OAAO,IAAI,OAAO,eAAe,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AACjE;AAEO,SAAS,cAAc,MAAsB;AAClD,SAAO,GAAG,KAAK,MAAM,OAAO,GAAG,CAAC;AAClC;AAMO,SAAS,eAAe,GAA2D;AACxF,QAAM,aAAa,EAAE,OAAO,KAAK,KAAK,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,IAAI;AACxE,SAAO,aACH,GAAG,EAAE,MAAM,IAAI,EAAE,IAAI,YAAY,cAAc,EAAE,IAAI,CAAC,MACtD,GAAG,cAAc,EAAE,IAAI,CAAC;AAC9B;AAEO,SAASC,QAAOC,QAAe,KAAa,OAAO,GAAG,GAAG,KAAa;AAC3E,SAAO,GAAGA,MAAK,IAAIA,WAAU,IAAI,MAAM,IAAI;AAC7C;AAEO,SAAS,SAAS,MAAc,KAAa,WAAW,OAAe;AAC5E,MAAI,KAAK,UAAU,IAAK,QAAO;AAC/B,SAAO,GAAG,KAAK,MAAM,GAAG,KAAK,IAAI,GAAG,MAAM,SAAS,MAAM,CAAC,CAAC,GAAG,QAAQ;AACxE;AAGO,SAAS,UAAU,MAAsB;AAC9C,QAAM,MAAM,KAAK,OAAO,OAAO;AAC/B,SAAO,QAAQ,KAAK,OAAO,KAAK,MAAM,GAAG,GAAG;AAC9C;AAEO,SAAS,WAAW,MAAwB;AACjD,SAAO,KAAK,MAAM,OAAO;AAC3B;AAGO,SAASC,aAAY,GAAW,SAA0B;AAC/D,MAAI,MAAM;AACV,MAAI,WAAWC,MAAK,WAAW,CAAC,GAAG;AACjC,UAAM,MAAMA,MAAK,SAAS,SAAS,CAAC;AACpC,QAAI,QAAQ,MAAM,CAAC,IAAI,WAAW,IAAI,KAAK,CAACA,MAAK,WAAW,GAAG,EAAG,OAAM;AAAA,EAC1E;AACA,SAAO,IAAI,QAAQ,OAAO,GAAG;AAC/B;AAEO,SAAS,cAAc,SAAiB,QAAwB;AACrE,SAAOA,MAAK,QAAQ,SAAS,MAAM;AACrC;AAOO,SAAS,0BAA0B,MAAsB;AAC9D,QAAM,UAAU,KAAK,UAAU;AAC/B,MAAI,CAAC,QAAQ,WAAW,IAAI,EAAG,QAAO;AACtC,QAAM,OAAO,KAAK,SAAS,QAAQ;AACnC,SAAO,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,QAAQ,MAAM,CAAC,CAAC;AACzD;AAmBO,SAAS,WAAW,OAAgB,OAAwB,oBAAI,QAAQ,GAAc;AAC3F,MAAI,UAAU,KAAM,QAAO;AAC3B,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAAA,IAC1C,KAAK;AACH,aAAO,MAAM,SAAS;AAAA,IACxB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,EACX;AACA,QAAM,MAAM;AACZ,MAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAC1B,OAAK,IAAI,GAAG;AACZ,MAAI;AACF,QAAI,MAAM,QAAQ,GAAG,EAAG,QAAO,IAAI,IAAI,CAAC,SAAS,WAAW,MAAM,IAAI,CAAC;AACvE,QAAI,eAAe,KAAM,QAAO,OAAO,MAAM,IAAI,QAAQ,CAAC,IAAI,OAAO,IAAI,YAAY;AACrF,QAAI,eAAe,MAAO,QAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ;AACxE,QAAI,eAAe,KAAK;AACtB,YAAMC,OAAiC,CAAC;AACxC,iBAAW,CAAC,GAAG,CAAC,KAAK,IAAK,CAAAA,KAAI,OAAO,CAAC,CAAC,IAAI,WAAW,GAAG,IAAI;AAC7D,aAAOA;AAAA,IACT;AACA,QAAI,eAAe,IAAK,QAAO,MAAM,KAAK,KAAK,CAAC,SAAS,WAAW,MAAM,IAAI,CAAC;AAC/E,UAAM,MAAiC,CAAC;AACxC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,UAAI,MAAM,UAAa,OAAO,MAAM,cAAc,OAAO,MAAM,SAAU;AACzE,UAAI,CAAC,IAAI,WAAW,GAAG,IAAI;AAAA,IAC7B;AACA,WAAO;AAAA,EACT,UAAE;AACA,SAAK,OAAO,GAAG;AAAA,EACjB;AACF;AAMA,IAAM,aAAa;AAGZ,SAAS,WAAW,IAAoB;AAC7C,SAAO,GAAG,QAAQ,YAAY,EAAE;AAClC;AAGO,SAAS,WAAW,IAAgC;AACzD,QAAM,QAAQ,WAAW,KAAK,EAAE;AAChC,SAAO,QAAQ,OAAO,MAAM,CAAC,CAAC,IAAI;AACpC;AAMO,SAAS,UAAU,MAAuB;AAC/C,QAAM,SAAS,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,GAAG,KAAK;AAClD,MAAI,KAAK,QAAQ,KAAK,SAAS,KAAK,OAAQ,QAAO,GAAG,KAAK,QAAQ,CAAC,KAAK,KAAK,IAAI,KAAK,MAAM;AAC7F,SAAO,GAAG,KAAK,QAAQ,CAAC,KAAK,MAAM;AACrC;AAoDO,SAAS,gBAAgB,MAAgE;AAC9F,QAAM,QAAQ,CAAC,MAAM,MAAM,MAAM,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG;AACnE,SAAO,SAAS;AAClB;AAEO,IAAM,eAAN,MAAmB;AAAA,EACxB;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACS,UAAoB,CAAC;AAAA,EACrB,WAAW,oBAAI,IAA2B;AAAA,EAC1C,QAAsB,CAAC;AAAA,EACvB,SAAyB,CAAC;AAAA,EAC1B,YAA8B,CAAC;AAAA,EAC/B,WAAqB,CAAC;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,EACS,eAAe,oBAAI,IAA0B;AAAA;AAAA,EAG9D,OAAO,OAAyC;AAC9C,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,aAAK,YAAY,MAAM;AACvB,aAAK,aAAa,MAAM;AACxB,aAAK,SAAS,MAAM;AACpB,aAAK,QAAQ,QAAQ,KAAK;AAC1B,mBAAW,UAAU,MAAM,QAAS,MAAK,UAAU,MAAM;AACzD,eAAO;AAAA,MACT,KAAK;AACH,aAAK,UAAU,MAAM,MAAM;AAC3B,aAAK,SAAS,IAAI,MAAM,QAAQ;AAAA,UAC9B,QAAQ,MAAM;AAAA,UACd,KAAK,MAAM;AAAA,UACX,iBAAiB,MAAM;AAAA,UACvB,YAAY,MAAM;AAAA,QACpB,CAAC;AACD,eAAO;AAAA,MACT,KAAK;AACH,aAAK,UAAU,KAAK,EAAE,MAAM,MAAM,MAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,CAAC;AAC5E,eAAO;AAAA,MACT,KAAK;AACH,aAAK,UAAU,KAAK;AAAA,UAClB,MAAM,MAAM;AAAA,UACZ,QAAQ,MAAM;AAAA,UACd,QAAQ;AAAA,UACR,SAAS,MAAM;AAAA,UACf,MAAM,MAAM;AAAA,QACd,CAAC;AACD,eAAO;AAAA,MACT,KAAK;AACH,aAAK,OAAO,KAAK,MAAM,OAAO;AAC9B,eAAO;AAAA,MACT,KAAK,YAAY;AACf,cAAM,OAAO,KAAK,aAAa,IAAI,MAAM,KAAK,EAAE,KAAK,CAAC;AACtD,aAAK,KAAK;AAAA,UACR,MAAM,MAAM;AAAA,UACZ,YAAY,MAAM;AAAA,UAClB,QAAQ,MAAM;AAAA,UACd,QAAQ,MAAM;AAAA,QAChB,CAAC;AACD,aAAK,aAAa,IAAI,MAAM,KAAK,IAAI,IAAI;AACzC,eAAO;AAAA,MACT;AAAA,MACA,KAAK,YAAY;AACf,aAAK,UAAU,MAAM,KAAK,MAAM;AAChC,cAAM,YAAY,KAAK,aAAa,IAAI,MAAM,KAAK,EAAE,KAAK,CAAC;AAC3D,aAAK,aAAa,OAAO,MAAM,KAAK,EAAE;AACtC,cAAM,QAAQ,MAAM,QAAQ,OAAO,SAAS,MAAM,QAAQ,QAAQ;AAClE,cAAM,SAAqB;AAAA,UACzB,KAAK,MAAM;AAAA,UACX,SAAS,MAAM;AAAA,UACf,OAAO,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK;AAAA,UAC5D,QAAQ,WAAW,MAAM,KAAK,EAAE;AAAA,UAChC,KAAK,WAAW,MAAM,KAAK,EAAE;AAAA,QAC/B;AACA,aAAK,MAAM,KAAK,MAAM;AACtB,eAAO;AAAA,MACT;AAAA,MACA,KAAK;AACH,aAAK,SAAS,KAAK,MAAM,OAAO;AAChC,eAAO;AAAA,MACT,KAAK;AACH,aAAK,UAAU,MAAM;AACrB,aAAK,QAAQ,MAAM;AACnB,aAAK,QAAQ;AACb,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,UAAU,QAAsB;AACtC,QAAI,CAAC,KAAK,QAAQ,SAAS,MAAM,EAAG,MAAK,QAAQ,KAAK,MAAM;AAAA,EAC9D;AAAA,EAEA,IAAI,cAAuB;AACzB,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AAAA;AAAA,EAGA,kBAA8B;AAC5B,QAAI,KAAK,QAAS,QAAO,KAAK;AAC9B,UAAMC,SAAQ,CAAC,WAAuB,KAAK,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,WAAW,MAAM;AAC1F,UAAM,aAAa,KAAK,MAAM,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,QAAQ,cAAc,IAAI,CAAC;AACrF,WAAO;AAAA,MACL,OAAO,KAAK,MAAM;AAAA,MAClB,QAAQA,OAAM,QAAQ,EAAE;AAAA,MACxB,QAAQA,OAAM,QAAQ,EAAE;AAAA,MACxB,SAASA,OAAM,SAAS,EAAE;AAAA,MAC1B,SAASA,OAAM,SAAS,EAAE;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,QAAkC;AAC1C,WAAO,KAAK,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,WAAW,MAAM;AAAA,EAC7D;AAAA,EAEA,cAAkE;AAChE,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,SAAS;AACb,eAAW,SAAS,KAAK,QAAQ;AAC/B,UAAI,MAAM,WAAW,SAAU;AAAA,eACtB,MAAM,WAAW,SAAU;AAAA,UAC/B;AAAA,IACP;AACA,WAAO,EAAE,QAAQ,QAAQ,OAAO;AAAA,EAClC;AAAA,EAEA,gBAAkC;AAChC,WAAO,KAAK,UAAU,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAc;AACZ,QAAI,KAAK,UAAU,OAAW,QAAO,KAAK;AAC1C,WACE,KAAK,gBAAgB,EAAE,WAAW,KAClC,KAAK,YAAY,EAAE,WAAW,KAC9B,KAAK,cAAc,EAAE,WAAW;AAAA,EAEpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAA8B;AAC5B,UAAM,SAAS,oBAAI,IAA0B;AAC7C,eAAW,UAAU,KAAK,OAAO;AAC/B,YAAM,OAAO,OAAO,IAAI,OAAO,MAAM,KAAK,CAAC;AAC3C,WAAK,KAAK,MAAM;AAChB,aAAO,IAAI,OAAO,QAAQ,IAAI;AAAA,IAChC;AACA,UAAM,OAAO,oBAAI,IAAwB;AACzC,eAAW,UAAU,KAAK,OAAO;AAC/B,WAAK,IAAI,OAAO,IAAI,IAAI,MAAM;AAC9B,UAAI,CAAC,KAAK,IAAI,OAAO,MAAM,EAAG,MAAK,IAAI,OAAO,QAAQ,MAAM;AAAA,IAC9D;AACA,UAAM,QAAQ,CAAC,WAAmB;AAChC,YAAM,QAAQ,OAAO,IAAI,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,WAAW,SAAS;AACpF,YAAM,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,QAAQ,WAAW,QAAQ,EAAE;AACjE,aAAO,EAAE,MAAM,KAAK,QAAQ,OAAO;AAAA,IACrC;AACA,UAAM,UAA4B,CAAC;AACnC,UAAM,WAAW,KAAK,SAAS;AAC/B,QAAI,YAAY,OAAO,KAAK,QAAQ,EAAE,SAAS,GAAG;AAChD,YAAM,OAAO,oBAAI,IAAY;AAC7B,iBAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAClD,cAAM,SAAS,KAAK,IAAI,GAAG;AAC3B,cAAM,SAAS,QAAQ,UAAU,WAAW,GAAG;AAC/C,YAAI,KAAK,IAAI,MAAM,EAAG;AACtB,aAAK,IAAI,MAAM;AACf,gBAAQ,KAAK;AAAA,UACX;AAAA,UACA,MAAM,QAAQ,IAAI,QAAQ;AAAA,UAC1B,MAAM,QAAQ,IAAI;AAAA,UAClB,QAAQ,QAAQ,IAAI;AAAA,UACpB,GAAI,QAAQ,IAAI,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;AAAA,UACnD;AAAA,UACA,GAAG,MAAM,MAAM;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,UAAI,CAAC,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,EAAG,QAAO,CAAC;AACnE,iBAAW,CAAC,QAAQ,IAAI,KAAK,QAAQ;AACnC,cAAM,EAAE,MAAM,OAAO,IAAI,MAAM,MAAM;AACrC,YAAI,SAAS,EAAG;AAChB,gBAAQ,KAAK;AAAA,UACX;AAAA,UACA,MAAM,KAAK,CAAC,EAAE,IAAI;AAAA,UAClB,MAAM,KAAK,CAAC,EAAE,IAAI;AAAA,UAClB,QAAQ,KAAK,CAAC,EAAE,IAAI;AAAA,UACpB,GAAI,KAAK,CAAC,EAAE,IAAI,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;AAAA,UACnD,MAAM,SAAS;AAAA,UACf;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,eAAe,EAAE,QAAQ,EAAE,MAAM,CAAC;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAA0D;AACxD,UAAM,YAAY,KAAK,UAAU,KAAK,KAAK,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,QAAQ,MAAS;AACrF,QAAI,CAAC,SAAU,QAAO;AACtB,UAAM,OAAO,KAAK,SAAS,SAAS,KAAK,MAAM;AAC/C,UAAM,WAAW,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;AAC1D,UAAM,QAAQ,aAAa,KAAK,SAAS,KAAK,MAAM,OAAO,KAAK,MAAM,IAAI;AAC1E,WAAO,EAAE,OAAO,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAA2B;AACzB,QAAI,CAAC,KAAK,SAAS,KAAK,GAAG,EAAG,QAAO,CAAC;AACtC,UAAM,UAAoB,CAAC;AAC3B,UAAM,UAAU,KAAK,gBAAgB;AACrC,QAAI,QAAQ,UAAU,EAAG,SAAQ,KAAK,kBAAkB;AACxD,UAAM,QAAQ,KAAK,cAAc,EAAE;AACnC,QAAI,QAAQ,EAAG,SAAQ,KAAK,UAAU,IAAI,mBAAmB,qBAAqB,KAAK,QAAQ;AAC/F,UAAM,eAAe,KAAK,YAAY,EAAE;AACxC,QAAI,eAAe,EAAG,SAAQ,KAAK,GAAGC,QAAO,cAAc,OAAO,CAAC,SAAS;AAC5E,UAAM,OAAO,KAAK,MAAM;AAAA,MACtB,CAAC,MAAM,EAAE,QAAQ,WAAW,YAAY,EAAE,QAAQ,cAAc;AAAA,IAClE,EAAE;AACF,QAAI,OAAO,EAAG,SAAQ,KAAK,GAAGA,QAAO,MAAM,WAAW,CAAC,iBAAiB;AACxE,QAAI,QAAQ,WAAW,KAAK,QAAQ,WAAW,KAAK,KAAK,SAAS,SAAS,GAAG;AAC5E,cAAQ,KAAK,cAAc;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,QAA0B;AACxB,WAAO,KAAK,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,OAAO,CAAC;AAAA,EAChE;AACF;AAGO,SAAS,eAAe,GAAW,GAAmB;AAC3D,SAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAClC;AAEO,SAAS,aAAa,GAAe,GAAuB;AACjE,SAAO,eAAe,EAAE,QAAQ,EAAE,MAAM,MAAM,EAAE,OAAO,MAAM,EAAE,OAAO;AACxE;AAMA,SAASC,eAAc,OAAkD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,IAAM,iBAAiB,oBAAI,IAAI,CAAC,UAAU,aAAa,YAAY,CAAC;AAEpE,SAAS,YAAY,OAAyC;AAC5D,SAAO,OAAO,KAAK,KAAK,EAAE;AAAA,IACxB,CAAC,QAAQ,eAAe,IAAI,GAAG,KAAM,IAAI,WAAW,GAAG,KAAK,QAAQ;AAAA,EACtE;AACF;AAQO,SAAS,eACd,UACA,QACA,UAAU,OAC8B;AACxC,MAAIA,eAAc,QAAQ,KAAK,CAAC,YAAY,QAAQ,GAAG;AACrD,UAAM,YAAY,WAAW,SAAS,aAAa;AACnD,UAAM,MAA+B,CAAC;AACtC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,QAAQ,EAAG,KAAI,MAAM,WAAY,KAAI,CAAC,IAAI;AAC9E,QAAI,CAACA,eAAc,MAAM,EAAG,QAAO,EAAE,UAAU,KAAK,OAAO;AAC3D,UAAM,SAAkC,CAAC;AACzC,UAAM,SAAkC,CAAC;AACzC,eAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,UAAI,OAAO,QAAQ;AACjB,cAAM,QAAQ,eAAe,IAAI,GAAG,GAAG,OAAO,GAAG,GAAG,SAAS;AAC7D,eAAO,GAAG,IAAI,MAAM;AACpB,eAAO,GAAG,IAAI,MAAM;AAAA,MACtB,OAAO;AACL,eAAO,GAAG,IAAI,IAAI,GAAG;AAAA,MACvB;AAAA,IACF;AACA,QAAI,CAAC,WAAW;AACd,iBAAW,OAAO,OAAO,KAAK,MAAM,EAAG,KAAI,EAAE,OAAO,KAAM,QAAO,GAAG,IAAI,OAAO,GAAG;AAAA,IACpF;AACA,WAAO,EAAE,UAAU,QAAQ,QAAQ,OAAO;AAAA,EAC5C;AACA,MAAI,MAAM,QAAQ,QAAQ,KAAK,MAAM,QAAQ,MAAM,GAAG;AACpD,UAAM,QAAQ,UAAU,KAAK,IAAI,OAAO,QAAQ,SAAS,MAAM,IAAI,OAAO;AAC1E,UAAM,SAAoB,CAAC;AAC3B,UAAM,SAAoB,CAAC;AAC3B,aAAS,IAAI,GAAG,IAAI,KAAK,IAAI,SAAS,QAAQ,KAAK,GAAG,KAAK;AACzD,UAAI,IAAI,SAAS,UAAU,IAAI,OAAO;AACpC,cAAM,QAAQ,eAAe,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO;AAC5D,eAAO,KAAK,MAAM,QAAQ;AAC1B,eAAO,KAAK,MAAM,MAAM;AAAA,MAC1B,WAAW,IAAI,SAAS,QAAQ;AAC9B,eAAO,KAAK,SAAS,CAAC,CAAC;AAAA,MACzB,OAAO;AACL,eAAO,KAAK,OAAO,CAAC,CAAC;AAAA,MACvB;AAAA,IACF;AACA,WAAO,EAAE,UAAU,QAAQ,QAAQ,OAAO;AAAA,EAC5C;AACA,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEA,SAAS,iBAAiB,OAAwB;AAChD,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,KAAK,UAAU,WAAW,KAAK,GAAG,MAAM,CAAC;AAClD;AAaO,SAAS,WACd,UACA,QACA,QACA,OAAoB,CAAC,GACC;AACtB,MAAI,aAAa,UAAa,WAAW,OAAW,QAAO;AAC3D,QAAM,YAAY,eAAe,UAAU,MAAM;AACjD,QAAM,cAAc,OAAO,UAAU,aAAa,YAAY,OAAO,UAAU,WAAW;AAC1F,QAAM,IAAI,cAAe,UAAU,WAAsB,iBAAiB,UAAU,QAAQ;AAC5F,QAAM,IAAI,cAAe,UAAU,SAAoB,iBAAiB,UAAU,MAAM;AACxF,MAAI,MAAM,EAAG,QAAO;AACpB,QAAM,KAAK,CAAC,MAAc;AAC1B,QAAM,UAAU,mBAAmB,GAAG,GAAG;AAAA,IACvC,aAAa,KAAK,eAAe;AAAA,IACjC,aAAa,KAAK,eAAe;AAAA,IACjC,QAAQ,OAAO,UAAU,OAAO,QAAQ;AAAA,IACxC,QAAQ,OAAO,UAAU,OAAO,MAAM;AAAA,IACtC,aAAa,OAAO,UAAU,OAAO,UAAU;AAAA,IAC/C,aAAa,OAAO,UAAU,OAAO,MAAM;AAAA,IAC3C,YAAY,OAAO,UAAU,OAAO,SAAS;AAAA,IAC7C,8BAA8B;AAAA,IAC9B,8BAA8B;AAAA,IAC9B,qBAAqB;AAAA,IACrB,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,QAAQ,WAAW,OAAO;AAChC,QAAM,MAAM,KAAK,YAAY;AAC7B,MAAI,MAAM,SAAS,KAAK;AACtB,UAAM,SAAS,MAAM,SAAS;AAC9B,WAAO;AAAA,MACL,GAAG,MAAM,MAAM,GAAG,GAAG;AAAA,MACrB,OAAO,IAAI,GAAG,KAAK,YAAY,KAAK,IAAID,QAAO,QAAQ,gBAAgB,CAAC,EAAE;AAAA,IAC5E;AAAA,EACF;AACA,SAAO;AACT;AAMO,IAAM,yBAAyB;AAE/B,SAAS,WAAW,QAAwD;AACjF,SAAO,yBAAyB,eAAe,OAAO,QAAQ,CAAC,YAAY,eAAe,OAAO,QAAQ,CAAC;AAC5G;AAGO,SAAS,WAAW,SAA0C;AACnE,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,QAAM,OAAO,WAAW,QAAQ,MAAM;AACtC,SAAO,QAAQ,QAAQ,SAAS,IAAI,IAAI,SAAY;AACtD;AAGO,SAAS,aAAa,GAAqB;AAChD,QAAM,OAAO,EAAE,cAAc,SAAY,UAAU,EAAE,YAAY,CAAC,MAAM;AACxE,SAAO,GAAG,EAAE,QAAQ,QAAQ,GAAG,IAAI,KAAK,EAAE,OAAO;AACnD;AAGO,SAAS,gBAAgB,SAA8B;AAC5D,MAAI,QAAQ,OAAQ,QAAO,UAAU,QAAQ,MAAM;AACnD,QAAM,QAAQ,QAAQ,aAAa,CAAC;AACpC,MAAI,OAAO;AACT,UAAM,QAAQ,QAAQ,YAAY,UAAU,KAAK;AACjD,WAAO,yBAAyB,aAAa,KAAK,CAAC,GAAG,OAAO,IAAI,MAAM,IAAI,WAAW,EAAE;AAAA,EAC1F;AACA,QAAM,aAAa,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ;AACnE,MAAI,WAAY,QAAO,QAAQ,UAAU,WAAW,IAAI,CAAC;AACzD,MAAI,QAAQ,QAAQ;AAClB,WAAO,WAAW,QAAQ,MAAM;AAAA,EAClC;AACA,SAAO,QAAQ,WAAW,YAAY,YAAY;AACpD;AAUO,SAAS,YAAY,QAAoB,OAA2B,CAAC,GAAa;AACvF,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAQ,OAAQ,OAAM,KAAK,GAAG,WAAW,QAAQ,MAAM,CAAC;AAAA,MACvD,OAAM,KAAK,gBAAgB,OAAO,CAAC;AACxC,QAAM,aAAa,oBAAoB,OAAO;AAC9C,MAAI,WAAY,OAAM,KAAK,gBAAgB,UAAU,EAAE;AACvD,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,UAAM,KAAK,IAAI,QAAQ;AACvB,eAAW,KAAK,OAAO,OAAO;AAC5B,YAAM,SAAS,EAAE,SAAS,MAAM,UAAU,EAAE,MAAM,CAAC,KAAK;AACxD,YAAM,KAAK,MAAM,EAAE,MAAM,KAAK,UAAU,EAAE,IAAI,CAAC,KAAK,eAAe,EAAE,UAAU,CAAC,IAAI,MAAM,EAAE;AAAA,IAC9F;AAAA,EACF;AACA,QAAM,aAAa,QAAQ,cAAc,CAAC;AAC1C,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,MAAM,KAAK,iBAAiB;AAClC,UAAM,KAAK,IAAI,eAAe,WAAW,MAAM,IAAI;AACnD,eAAW,KAAK,WAAW,MAAM,GAAG,GAAG,EAAG,OAAM,KAAK,KAAK,aAAa,CAAC,CAAC,EAAE;AAC3E,QAAI,WAAW,SAAS,IAAK,OAAM,KAAK,aAAa,WAAW,SAAS,GAAG,OAAO;AAAA,EACrF;AACA,QAAM,SAAS,WAAW,OAAO;AACjC,MAAI,OAAQ,OAAM,KAAK,IAAI,MAAM;AACjC,MAAI,KAAK,gBAAgB,OAAO;AAC9B,UAAM,OAAO,WAAW,QAAQ,UAAU,QAAQ,QAAQ,aAAa,KAAK,GAAG;AAAA,MAC7E,UAAU,KAAK;AAAA,IACjB,CAAC;AACD,QAAI,KAAM,OAAM,KAAK,IAAI,GAAG,IAAI;AAAA,EAClC;AACA,QAAM,YAAY,cAAc,SAAS,KAAK,OAAO;AACrD,MAAI,UAAU,SAAS,EAAG,OAAM,KAAK,IAAI,GAAG,SAAS;AACrD,SAAO;AACT;AAGO,SAAS,cAAc,SAAsB,SAA4B;AAC9E,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAQ,UAAW,OAAM,KAAK,UAAUE,aAAY,QAAQ,WAAW,OAAO,CAAC,EAAE;AACrF,MAAI,QAAQ,WAAY,OAAM,KAAK,WAAWA,aAAY,QAAQ,YAAY,OAAO,CAAC,EAAE;AACxF,SAAO;AACT;AAGO,SAAS,eAAe,SAA0C;AACvE,UAAQ,QAAQ,WAAW;AAAA,IACzB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAGO,SAAS,eAAe,SAA+B;AAC5D,SACE,QAAQ,cAAc,WAAW,QAAQ,cAAc,aAAa,QAAQ,cAAc;AAE9F;;;ACztBA,IAAM,WAA4C;AAAA,EAChD,CAAC,SAAS,QAAQ,OAAO;AAAA,EACzB,CAAC,aAAa,YAAY,WAAW;AAAA,EACrC,CAAC,qBAAqB,qBAAqB,oBAAoB;AAAA,EAC/D,CAAC,WAAW,UAAU,SAAS;AACjC;AAEA,SAAS,MAAM,OAA+C;AAC5D,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAQ;AACxF;AAEA,SAASC,SAAQ,OAA2C;AAC1D,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AACzC;AAEA,SAAS,WAAW,OAAmD;AACrE,QAAM,OAAO,MAAM,KAAK,GAAG;AAC3B,SAAO,OAAO,SAAS,YAAY,OAAO;AAC5C;AAGA,SAAS,QAAQ,OAA0E;AACzF,QAAM,MAAkD,CAAC;AACzD,aAAW,QAAQA,SAAQ,KAAK,GAAG;AACjC,QAAI,OAAO,SAAS,SAAU,KAAI,KAAK,EAAE,KAAK,KAAK,CAAC;AAAA,SAC/C;AACH,YAAM,IAAI,MAAM,IAAI;AACpB,YAAM,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG;AAC9C,UAAI,OAAO,QAAQ,SAAU,KAAI,KAAK,EAAE,KAAK,UAAU,WAAW,IAAI,EAAE,CAAC;AAAA,IAC3E;AAAA,EACF;AACA,SAAO;AACT;AAQA,SAAS,UAAU,OAAgD;AACjE,QAAM,MAAwB,CAAC;AAC/B,aAAW,KAAKA,SAAQ,KAAK,GAAG;AAC9B,UAAM,IAAI,MAAM,CAAC;AACjB,QAAI,CAAC,KAAK,OAAO,EAAE,SAAS,SAAU;AACtC,QAAI,KAAK;AAAA,MACP,MAAM,EAAE;AAAA,MACR,GAAI,EAAE,WAAW,SAAY,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC;AAAA,MACrD,GAAI,EAAE,UAAU,SAAY,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAAA,MAClD,UAAU,WAAW,CAAC;AAAA,IACxB,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,OAAwC;AACvD,QAAM,MAAgB,CAAC;AACvB,aAAW,KAAKA,SAAQ,KAAK,GAAG;AAC9B,UAAM,IAAI,MAAM,CAAC;AACjB,QAAI,CAAC,KAAK,OAAO,EAAE,QAAQ,SAAU;AACrC,QAAI,KAAK,EAAE,KAAK,EAAE,KAAK,UAAU,WAAW,CAAC,GAAG,QAAQ,UAAU,EAAE,MAAM,EAAE,CAAC;AAAA,EAC/E;AACA,SAAO;AACT;AAGO,SAAS,kBAAkB,MAAsC;AACtE,QAAM,IAAI,MAAM,IAAI;AACpB,MAAI,CAAC,EAAG,QAAO;AACf,SACE,OAAO,EAAE,UAAU,YACnB,MAAM,QAAQ,EAAE,OAAO,KACvB,SAAS,KAAK,CAAC,CAAC,GAAG,MAAM,MAAM,EAAE,GAAG,CAAC,MAAM,MAAS;AAExD;AAGO,SAAS,aAAa,MAAiD;AAC5E,MAAI,CAAC,kBAAkB,IAAI,EAAG,QAAO;AACrC,QAAM,IAAI,MAAM,IAAI;AACpB,MAAI,OAAO,EAAE,UAAU,SAAU,QAAO,UAAU,SAAS,EAAE,OAAO,EAAE,CAAC;AACvE,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,KAAK,KAAK,IAAI,KAAK,UAAU;AACvC,UAAM,UAAU,MAAM,EAAE,GAAG,CAAC;AAC5B,QAAI,CAAC,QAAS;AACd,UAAM,MAAM,QAAQ,QAAQ,KAAK,EAAE;AACnC,UAAM,MAAM,QAAQ,QAAQ,OAAO,EAAE;AACrC,UAAM,MAAM,QAAQ,QAAQ,OAAO,EAAE;AACrC,QAAI,IAAK,OAAM,KAAK,GAAGC,QAAO,KAAK,KAAK,IAAI,CAAC,UAAU;AACvD,QAAI,IAAK,OAAM,KAAK,GAAGA,QAAO,KAAK,KAAK,IAAI,CAAC,UAAU;AACvD,QAAI,IAAK,OAAM,KAAK,GAAGA,QAAO,KAAK,KAAK,IAAI,CAAC,QAAQ;AAAA,EACvD;AACA,QAAM,SAAS,UAAU,EAAE,OAAO,EAAE;AACpC,MAAI,OAAQ,OAAM,KAAK,GAAGA,QAAO,QAAQ,cAAc,CAAC,UAAU;AAClE,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAC/C;AAMA,IAAM,aAAa;AAGnB,SAAS,SAAS,MAAwB;AACxC,QAAM,OAAO,OAAO,KAAK,IAAI,IAAI,CAAC;AAClC,QAAM,QAAQ,KAAK,MAAM,SAAS,KAAK,CAAC;AACxC,SAAO,OAAO,CAAC,MAAM,GAAG,KAAK,IAAI;AACnC;AAKA,IAAM,OAAO,CAAC,GAAW,MAAc,EAAE,QAAQ,MAAM,EAAE,QAAQ;AAEjE,SAAS,WAAW,GAAa,GAAmB;AAElD,QAAM,IAAI,EAAE;AACZ,QAAM,IAAI,EAAE;AACZ,QAAM,MAAkB,MAAM,KAAK,EAAE,QAAQ,IAAI,EAAE,GAAG,MAAM,IAAI,MAAc,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AAC5F,WAASC,KAAI,IAAI,GAAGA,MAAK,GAAGA,MAAK;AAC/B,aAASC,KAAI,IAAI,GAAGA,MAAK,GAAGA,MAAK;AAC/B,UAAID,EAAC,EAAEC,EAAC,IAAI,KAAK,EAAED,EAAC,GAAG,EAAEC,EAAC,CAAC,IAAI,IAAID,KAAI,CAAC,EAAEC,KAAI,CAAC,IAAI,IAAI,KAAK,IAAI,IAAID,KAAI,CAAC,EAAEC,EAAC,GAAG,IAAID,EAAC,EAAEC,KAAI,CAAC,CAAC;AAAA,IAC9F;AAAA,EACF;AACA,QAAM,MAAY,CAAC;AACnB,QAAM,OAAO,CAAC,IAAc,SAAiB;AAC3C,UAAM,OAAO,IAAI,IAAI,SAAS,CAAC;AAC/B,QAAI,QAAQ,KAAK,OAAO,GAAI,MAAK,QAAQ;AAAA,QACpC,KAAI,KAAK,EAAE,IAAI,KAAK,CAAC;AAAA,EAC5B;AACA,MAAI,IAAI;AACR,MAAI,IAAI;AACR,SAAO,IAAI,KAAK,IAAI,GAAG;AACrB,QAAI,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG;AAEpB,WAAK,MAAM,EAAE,GAAG,CAAC;AACjB;AAAA,IACF,WAAW,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,EAAG,MAAK,OAAO,EAAE,GAAG,CAAC;AAAA,QACxD,MAAK,OAAO,EAAE,GAAG,CAAC;AAAA,EACzB;AACA,SAAO,IAAI,EAAG,MAAK,OAAO,EAAE,GAAG,CAAC;AAChC,SAAO,IAAI,EAAG,MAAK,OAAO,EAAE,GAAG,CAAC;AAChC,SAAO;AACT;AAEA,SAAS,cAAc,MAAgC;AACrD,QAAM,KAAK,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK;AACrC,SAAO,CAAC,KAAK,MAAM,GAAG,KAAK,SAAS,GAAG,MAAM,GAAG,EAAE;AACpD;AAMO,SAASC,UAAS,QAAgB,OAAe,GAA+B;AACrF,QAAM,IAAI,SAAS,MAAM;AACzB,QAAM,IAAI,SAAS,KAAK;AACxB,MAAI,EAAE,SAAS,cAAc,EAAE,SAAS,WAAY,QAAO;AAC3D,QAAM,MAAM,WAAW,GAAG,CAAC;AAC3B,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAM,EAAE,IAAI,KAAK,IAAI,IAAI,CAAC;AAC1B,QAAI,OAAO,MAAM;AACf,aAAO;AACP;AAAA,IACF;AACA,QAAI,OAAO,SAAS,IAAI,IAAI,CAAC,GAAG,OAAO,OAAO;AAC5C,YAAM,CAAC,SAAS,KAAK,IAAI,cAAc,IAAI;AAC3C,YAAM,CAAC,SAAS,KAAK,IAAI,cAAc,IAAI,IAAI,CAAC,EAAE,IAAI;AACtD,aAAO,GAAG,EAAE,IAAI,KAAK,OAAO,IAAI,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,IAAI,CAAC,GAAG,SAAS,KAAK;AAC9E;AACA;AAAA,IACF;AACA,UAAM,CAAC,MAAM,EAAE,IAAI,cAAc,IAAI;AACrC,WAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,IAAI,IAAI,IAAI,EAAE,MAAM,KAAK,IAAI,IAAI;AAClE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMA,SAAS,IAAI,UAA+B,GAAmB;AAC7D,MAAI,aAAa,KAAM,QAAO,IAAI,EAAE,IAAI,YAAY,CAAC;AACrD,MAAI,aAAa,MAAO,QAAO,IAAI,EAAE,IAAI,gBAAgB,CAAC;AAC1D,SAAO;AACT;AAEA,SAASC,OAAM,OAAsC;AACnD,SAAO,UAAU,SAAY,aAAa,SAAS,KAAK,UAAU,KAAK,GAAG,GAAG;AAC/E;AAEA,SAAS,WACP,QACA,OACA,GACA,QACU;AAEV,QAAM,QAAQ,CAAC,MAAc,KAAK,KAAK,EAAE,KAAK,CAAC;AAC/C,MAAI,OAAO,WAAW,YAAY,OAAO,UAAU,aAAa,MAAM,MAAM,KAAK,MAAM,KAAK,IAAI;AAC9F,UAAM,QAAQD,UAAS,QAAQ,OAAO,CAAC;AACvC,QAAI,UAAU,OAAW,QAAO,WAAW,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;AAAA,EAC9E;AACA,QAAM,aAAa,CAAC,MAA6B,OAAO,MAAM,YAAY,MAAM;AAChF,MAAI,WAAW,MAAM,KAAK,WAAW,KAAK,GAAG;AAC3C,UAAM,OAAO,WAAW,QAAQ,OAAO,GAAG;AAAA,MACxC,aAAa;AAAA,MACb,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AACD,QAAI,KAAM,QAAO,KAAK,IAAI,CAAC,MAAO,MAAM,KAAK,KAAK,GAAG,MAAM,GAAG,CAAC,EAAG;AAAA,EACpE;AACA,SAAO,CAAC,GAAG,MAAM,GAAG,EAAE,IAAIC,OAAM,MAAM,CAAC,CAAC,OAAO,EAAE,MAAMA,OAAM,KAAK,CAAC,CAAC,EAAE;AACxE;AAGO,SAAS,kBAAkB,SAAsC;AACtE,SAAO,YAAY,UAAa,QAAQ,KAAK,QAAQ,KAAK,CAAC;AAC7D;AAMO,SAAS,YACd,SACA,MACA,GACA,UACU;AACV,MAAI,kBAAkB,OAAO,EAAG,QAAO,CAAC;AACxC,SAAO,oBAAoB,MAAM,GAAG,QAAQ,KAAK,CAAC;AACpD;AAMO,SAAS,oBACd,MACA,GACA,WAAW,IACW;AACtB,MAAI,CAAC,kBAAkB,IAAI,EAAG,QAAO;AACrC,QAAM,IAAI,MAAM,IAAI;AACpB,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO,EAAE,UAAU,SAAU,OAAM,KAAK,GAAG,EAAE,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;AACtE,aAAW,CAAC,KAAK,GAAG,KAAK,UAAU;AACjC,UAAM,UAAU,MAAM,EAAE,GAAG,CAAC;AAC5B,QAAI,CAAC,QAAS;AACd,eAAW,KAAK,QAAQ,QAAQ,OAAO,GAAG;AAExC,YAAM,KAAK,GAAG,EAAE,IAAI,GAAG,CAAC,YAAY,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,YAAY,MAAM,CAAC,CAAC,EAAE;AAAA,IACzF;AACA,eAAW,MAAM,QAAQ,QAAQ,OAAO,GAAG;AACzC,UAAI,GAAG,OAAO,WAAW,GAAG;AAC1B,cAAM,KAAK,GAAG,EAAE,OAAO,GAAG,CAAC,IAAI,GAAG,IAAI,EAAE,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC,EAAE;AAAA,MAC9E;AACA,iBAAW,KAAK,GAAG,QAAQ;AACzB,cAAM;AAAA,UACJ,GAAG,EAAE,OAAO,GAAG,CAAC,IAAI,GAAG,IAAI,EAAE,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,YAAY,GAAG,UAAU,CAAC,CAAC;AAAA,QAC3F;AACA,cAAM,KAAK,GAAG,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;AAAA,MACxD;AAAA,IACF;AACA,eAAW,KAAK,QAAQ,QAAQ,KAAK,GAAG;AACtC,YAAM,KAAK,GAAG,EAAE,MAAM,GAAG,CAAC,UAAU,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE;AAAA,IACjF;AAAA,EACF;AACA,aAAW,KAAK,UAAU,EAAE,OAAO,GAAG;AACpC,UAAM,KAAK,GAAG,EAAE,OAAO,GAAG,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE;AACnE,UAAM,KAAK,GAAG,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;AAAA,EACxD;AACA,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,MAAI,MAAM,SAAS,UAAU;AAC3B,UAAM,SAAS,MAAM,SAAS;AAC9B,WAAO,CAAC,GAAG,MAAM,MAAM,GAAG,QAAQ,GAAG,EAAE,IAAI,OAAOJ,QAAO,QAAQ,WAAW,CAAC,EAAE,CAAC;AAAA,EAClF;AACA,SAAO;AACT;;;ACpPA,IAAM,gBAAwB;AAAA,EAC5B,QAAQ,EAAE,QAAQ,UAAK,QAAQ,UAAK,SAAS,UAAK,SAAS,UAAK,QAAQ,SAAI;AAAA,EAC5E,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AACT;AAEA,IAAM,eAAuB;AAAA,EAC3B,QAAQ,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,SAAS,QAAQ,QAAQ,OAAO;AAAA,EAC3F,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AACT;AAEO,IAAM,kBAAN,MAA0C;AAAA,EAe/C,YACmB,KACjB,UAAkC,CAAC,GACnC;AAFiB;AAGjB,SAAK,QACH,QAAQ,SACR,aAAa,IAAI,QAAQ,QAAQ,OAAO,QAAQ,KAAK,QAAQ,SAAS,CAAC,CAAC,QAAQ,OAAO,KAAK;AAC9F,UAAM,SAAS,KAAK,UAAU;AAC9B,SAAK,IAAI,aAAa,MAAM;AAC5B,SAAK,IAAI,SAAS,gBAAgB;AAClC,SAAK,gBAAgB,QAAQ,iBAAiB;AAC9C,SAAK,eAAe,QAAQ,gBAAgB;AAC5C,SAAK,QAAQ,KAAK,IAAI,IAAI,QAAQ,SAAS,EAAE;AAAA,EAC/C;AAAA,EA3BS,OAAO;AAAA,EACP;AAAA,EACQ;AAAA,EACA;AAAA,EACA,MAAM,IAAI,aAAa;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACT,WAAW;AAAA;AAAA,EAEF,eAAe,oBAAI,IAAoB;AAAA;AAAA,EAEhD;AAAA,EAiBR,QAAQ,OAAuB;AAC7B,UAAM,SAAS,KAAK,IAAI,OAAO,KAAK;AACpC,QAAI,MAAM,SAAS,QAAS,MAAK,kBAAkB;AACnD,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,aAAK,YAAY,MAAM,YAAY,MAAM,SAAS,MAAM,MAAM;AAC9D;AAAA,MACF,KAAK,iBAAiB;AACpB,cAAM,OAAO,gBAAgB,MAAM,UAAU;AAC7C,cAAM,WAAW,GAAG,MAAM,GAAG,aAAa,MAAM,eAAe;AAC/D,aAAK;AAAA,UACH,KAAK,EAAE,IAAI,KAAK,KAAK,EAAE,KAAK,IAAI,MAAM,MAAM,KAAK,OAAO,GAAG,IAAI,OAAO,EAAE,GAAG,QAAQ,EAAE;AAAA,QACvF;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,aAAK;AAAA,UACH,GAAG,KAAK,MAAM,QAAQ,CAAC,aAAa,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,QAC1F;AACA;AAAA,MACF,KAAK;AACH,aAAK;AAAA,UACH,GAAG,KAAK,MAAM,QAAQ,CAAC,IAAI,KAAK,EAAE,IAAI,gBAAgB,CAAC,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,KAAK,KAAK,MAAM,IAAI,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AAAA,QAC9I;AACA;AAAA,MACF,KAAK;AACH,aAAK,WAAW,MAAM,OAAO;AAC7B;AAAA,MACF,KAAK;AACH,YAAI,OAAQ,MAAK,UAAU,MAAM;AACjC;AAAA,MACF,KAAK;AACH,aAAK,aAAa,MAAM,OAAO;AAC/B;AAAA,MACF,KAAK;AACH,aAAK,OAAO;AACZ;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,QAAI,CAAC,KAAK,SAAU,MAAK,OAAO;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAMQ,IAAI,OAAO,IAAU;AAC3B,eAAW,QAAQ,WAAW,IAAI,EAAG,MAAK,IAAI,OAAO,0BAA0B,IAAI,CAAC;AAAA,EACtF;AAAA,EAEQ,KAAK,GAAmB;AAC9B,WAAO,KAAK,EAAE,KAAKK,aAAY,GAAG,KAAK,IAAI,OAAO,CAAC;AAAA,EACrD;AAAA,EAEQ,MAAM,QAA0B;AACtC,UAAM,QAAQ,KAAK,EAAE,OAAO,MAAM;AAClC,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO,KAAK,EAAE,MAAM,KAAK;AAAA,MAC3B,KAAK;AACH,eAAO,KAAK,EAAE,IAAI,KAAK;AAAA,MACzB,KAAK;AACH,eAAO,KAAK,EAAE,OAAO,KAAK;AAAA,MAC5B,KAAK;AACH,eAAO,KAAK,EAAE,KAAK,KAAK;AAAA,MAC1B;AACE,eAAO,KAAK,EAAE,OAAO,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA,EAGQ,UAAU,QAAoC;AACpD,WAAO,UAAU,KAAK,IAAI,cAAc,GAAG,KAAK,EAAE,KAAK,IAAI,MAAM,GAAG,CAAC,MAAM;AAAA,EAC7E;AAAA,EAEQ,YAAY,YAAoB,SAAmB,QAAuB;AAChF,UAAM,KAAK,QAAQ,SAAS,IAAI,OAAO,QAAQ,KAAK,IAAI,CAAC,KAAK;AAC9D,UAAM,QAAkB,CAAC;AACzB,QAAI,KAAK,IAAI,MAAO,OAAM,KAAK,SAAS,KAAK,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK,EAAE;AACtF,QAAI,WAAW,UAAa,SAAS,EAAG,OAAM,KAAK,UAAU,MAAM,EAAE;AACrE,UAAM,QAAQ,MAAM,SAAS,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM;AAC5D,UAAM,QAAQ,WAAWC,QAAO,YAAY,MAAM,CAAC,GAAG,EAAE,GAAG,KAAK;AAChE,QAAI,KAAK,UAAU,SAAU,MAAK,IAAI,GAAG,KAAK,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,CAAC,CAAC,IAAI,KAAK,EAAE;AAAA,QACnF,MAAK,IAAI,aAAa,KAAK,EAAE;AAAA,EACpC;AAAA,EAEQ,UAAU,QAA4B;AAC5C,UAAM,QAAkB,CAAC;AACzB,QAAI,KAAK,IAAI,YAAa,OAAM,KAAK,KAAK,EAAE,KAAK,IAAI,OAAO,IAAI,MAAM,GAAG,CAAC;AAC1E,UAAM,KAAK,OAAO,QAAQ,WAAW,YAAY,KAAK,EAAE,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI;AAC9F,QAAI,OAAO,QAAQ,OAAW,OAAM,KAAK,KAAK,EAAE,KAAK,IAAI,OAAO,GAAG,EAAE,CAAC;AACtE,WAAO,MAAM,KAAK,GAAG;AAAA,EACvB;AAAA,EAEQ,SAAS,QAA4B;AAC3C,UAAM,EAAE,QAAQ,IAAI;AACpB,QAAI,QAAQ,WAAW,WAAW;AAChC,aAAO,KAAK,EAAE,IAAI,WAAW,QAAQ,SAAS,KAAK,UAAU,QAAQ,MAAM,CAAC,KAAK,EAAE,GAAG;AAAA,IACxF;AACA,UAAM,OAAiB,CAAC;AACxB,QAAI,QAAQ,WAAW,UAAW,MAAK,KAAK,gBAAgB;AAC5D,UAAM,OAAO,QAAQ,WAAW,WAAW,eAAe,OAAO,IAAI;AACrE,QAAI,KAAM,MAAK,KAAK,IAAI;AACxB,QAAI,OAAO,MAAM,SAAS,KAAK,QAAQ,WAAW,UAAU;AAC1D,WAAK,KAAKA,QAAO,OAAO,MAAM,QAAQ,MAAM,CAAC;AAAA,IAC/C;AACA,SAAK,KAAK,eAAe,QAAQ,UAAU,CAAC;AAC5C,UAAM,OAAO,KAAK,EAAE,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,GAAG;AAC9C,QAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,UAAM,SAAS,QAAQ,eAAe,QAAQ,OAAO,QAAQ,CAAC;AAC9D,WAAO,GAAG,IAAI,IAAI,KAAK,EAAE,OAAO,MAAM,CAAC;AAAA,EACzC;AAAA,EAEQ,UAAU,QAA0B;AAC1C,UAAM,EAAE,QAAQ,IAAI;AACpB,SAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,MAAM,CAAC,IAAI,KAAK,UAAU,MAAM,CAAC,IAAI,KAAK,SAAS,MAAM,CAAC,EAAE;AAC3F,QAAI,QAAQ,WAAW,YAAY,OAAO,MAAM,SAAS,GAAG;AAC1D,iBAAW,QAAQ,KAAK,UAAU,QAAQ,QAAQ,KAAK,EAAG,MAAK,IAAI,IAAI;AAAA,IACzE;AAAA,EACF;AAAA,EAEQ,UAAU,QAAoB,QAAgB,cAAc,MAAgB;AAClF,UAAM,QAAkB,CAAC;AACzB,eAAW,KAAK,OAAO,OAAO;AAC5B,YAAM,QAAQ,EAAE,WAAW,YAAY,KAAK,EAAE,IAAI,UAAU,EAAE,IAAI,CAAC,IAAI,UAAU,EAAE,IAAI;AACvF,YAAM,OACJ,EAAE,WAAW,YACT,KAAK,EAAE,IAAI,WAAW,IACtB,KAAK,EAAE,IAAI,IAAI,eAAe,EAAE,UAAU,CAAC,GAAG;AACpD,YAAM,KAAK,GAAG,MAAM,GAAG,KAAK,MAAM,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,EAAE;AAC9D,UAAI,eAAe,EAAE,UAAU,EAAE,WAAW,UAAU;AACpD,mBAAW,QAAQ,WAAW,EAAE,MAAM,EAAG,OAAM,KAAK,GAAG,MAAM,OAAO,KAAK,EAAE,IAAI,IAAI,CAAC,EAAE;AAAA,MACxF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,WAAW,OAA2B;AAC5C,QAAI,MAAM,WAAW,UAAU;AAC7B,YAAM,MAAM,MAAM,UAAU;AAC5B,WAAK,aAAa,IAAI,MAAM,KAAK,aAAa,IAAI,GAAG,KAAK,KAAK,CAAC;AAChE;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,WAAW,WAAW,KAAK,EAAE,MAAM,KAAK,EAAE;AAC9D,SAAK;AAAA,MACH,GAAG,KAAK,MAAM,MAAM,MAAM,CAAC,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,MAAM,KAAK,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC,KAAK,MAAM,KAAK;AAAA,IAC5G;AACA,QAAI,MAAM,QAAQ;AAChB,iBAAW,QAAQ,WAAW,MAAM,MAAM,EAAG,MAAK,IAAI,OAAO,KAAK,EAAE,IAAI,IAAI,CAAC,EAAE;AAAA,IACjF;AACA,SAAK,IAAI,OAAO,KAAK,EAAE,IAAI,wCAAwC,MAAM,EAAE,IAAI,CAAC,EAAE;AAAA,EACpF;AAAA,EAEQ,oBAA0B;AAChC,eAAW,CAAC,QAAQC,MAAK,KAAK,KAAK,cAAc;AAC/C,YAAM,QAAQ,UAAU,KAAK,IAAI,cAAc,KAAK,MAAM,MAAM;AAChE,WAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,CAAC,UAAU,KAAK,KAAKA,MAAK,SAAS;AAAA,IACpE;AACA,SAAK,aAAa,MAAM;AAAA,EAC1B;AAAA,EAEQ,aAAa,SAAuB;AAC1C,QAAI,iBAAiB,OAAO,GAAG;AAC7B,WAAK,iBAAiB;AACtB;AAAA,IACF;AACA,UAAM,CAAC,OAAO,GAAG,IAAI,IAAI,WAAW,OAAO;AAC3C,SAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,CAAC,IAAI,KAAK,EAAE,OAAO,KAAK,CAAC,EAAE;AAC1D,eAAW,QAAQ,KAAM,MAAK,IAAI,OAAO,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE;AAAA,EAChE;AAAA;AAAA,EAGQ,eAAqB;AAC3B,QAAI,CAAC,KAAK,eAAgB;AAC1B,UAAM,WAAW,KAAK,IAAI,SAAS,KAAK,IAAI,GAAG;AAC/C,UAAM,CAAC,OAAO,GAAG,IAAI,IAAI,WAAW,KAAK,cAAc;AACvD,UAAM,QAAQ,WACV,KAAK,MAAM,QAAQ,IACnB,KAAK,EAAE,IAAI,KAAK,UAAU,WAAW,WAAM,OAAO;AACtD,UAAM,QAAQ,WAAW,KAAK,EAAE,SAAS,KAAK,EAAE;AAChD,SAAK,IAAI,GAAG,KAAK,IAAI,MAAM,KAAK,CAAC,EAAE;AACnC,eAAW,QAAQ,KAAM,MAAK,IAAI,OAAO,MAAM,IAAI,CAAC,EAAE;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAMQ,SAAe;AACrB,SAAK,WAAW;AAChB,SAAK,kBAAkB;AACvB,SAAK,aAAa;AAClB,SAAK,cAAc;AACnB,SAAK,mBAAmB;AACxB,QAAI,KAAK,UAAU,SAAU,MAAK,SAAS;AAAA,QACtC,MAAK,kBAAkB;AAAA,EAC9B;AAAA,EAEQ,KAAK,OAAe,OAAoC;AAC9D,UAAM,OAAO,GAAG,KAAK,EAAE,KAAK,OAAO,CAAC,CAAC,IAAI,KAAK;AAC9C,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,KAAK,MAAM;AACjD,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,MAAM,GAAG,IAAI,GAAG,KAAK,EAAE,KAAK,OAAO,IAAI,CAAC,EAAE,CAAC;AAAA,EACtD;AAAA,EAEQ,gBAAsB;AAC5B,UAAM,SAAS,KAAK,IAAI,UAAU,QAAQ;AAC1C,QAAI,OAAO,WAAW,EAAG;AACzB,SAAK,KAAK,aAAa,OAAO,MAAM,KAAK,CAAC,MAAM,KAAK,EAAE,KAAK,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAE1E,UAAM,YAAY,KAAK,IAAI,MAAM;AAAA,MAC/B,CAAC,MAAM,EAAE,QAAQ,WAAW,aAAa,oBAAoB,EAAE,OAAO,MAAM;AAAA,IAC9E;AACA,QAAI,iBAAiB;AACrB,eAAW,UAAU,QAAQ;AAC3B,WAAK,IAAI,EAAE;AACX,WAAK,aAAa,MAAM;AACxB,YAAM,EAAE,QAAQ,IAAI;AACpB,UACE,QAAQ,aAAa,UACrB,QAAQ,WAAW,UACnB,oBAAoB,OAAO,MAAM,UACjC,CAAC,QAAQ,QAAQ,SAAS,UAAU,GACpC;AACA,yBAAiB;AAAA,MACnB;AAAA,IACF;AACA,QAAI,kBAAkB,CAAC,WAAW;AAChC,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,KAAK,EAAE,IAAI,sEAAsE,CAAC;AAAA,IAC7F;AAAA,EACF;AAAA,EAEQ,aAAa,QAA0B;AAC7C,UAAM,EAAE,SAAS,IAAI,IAAI;AACzB,UAAM,IAAI,KAAK;AACf,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,EAAE,KAAK,QAAQ,CAAC,IAAI,KAAK,EAAE,OAAO;AACjF,UAAM,OAAO,eAAe,OAAO;AACnC,UAAM,UAAU,OAAO,IAAI,EAAE,OAAO,IAAI,IAAI,GAAG,CAAC,KAAK;AACrD,SAAK,IAAI,GAAG,IAAI,IAAI,EAAE,KAAK,KAAK,UAAU,MAAM,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,GAAG,OAAO,EAAE;AAErF,UAAM,SAAS,QAAQ,UAAU,gBAAgB,OAAO;AACxD,eAAW,QAAQ,WAAW,MAAM,EAAG,MAAK,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,EAAE;AAClE,UAAM,aAAa,oBAAoB,OAAO;AAC9C,QAAI,WAAY,MAAK,IAAI,KAAK,EAAE,OAAO,gBAAgB,UAAU,EAAE,CAAC,EAAE;AAEtE,QAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,KAAK,EAAE,KAAK,QAAQ,CAAC,EAAE;AAChC,iBAAW,QAAQ,KAAK,UAAU,QAAQ,MAAM,EAAG,MAAK,IAAI,IAAI;AAAA,IAClE;AAEA,UAAM,aAAa,QAAQ,cAAc,CAAC;AAC1C,QAAI,WAAW,SAAS,GAAG;AACzB,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,KAAK,EAAE,KAAK,eAAe,WAAW,MAAM,IAAI,CAAC,EAAE;AAC5D,iBAAW,KAAK,WAAW,MAAM,GAAG,KAAK,aAAa,GAAG;AACvD,cAAM,OAAO,aAAa,CAAC;AAC3B,cAAM,QAAQ,KAAK,QAAQ,IAAI;AAC/B,cAAM,QAAQ,UAAU,KAAK,OAAO,GAAG,EAAE,KAAK,KAAK,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC;AACvF,aAAK,IAAI,OAAO,KAAK,EAAE,MAAM,IAAI,KAAK,EAAE;AAAA,MAC1C;AACA,UAAI,WAAW,SAAS,KAAK,eAAe;AAC1C,cAAM,OAAO,WAAW,SAAS,KAAK;AACtC,aAAK,IAAI,OAAO,EAAE,IAAI,GAAG,KAAK,EAAE,QAAQ,QAAQ,IAAI,OAAO,CAAC,EAAE;AAAA,MAChE;AAAA,IACF;AAEA,UAAM,SAAS,WAAW,OAAO;AACjC,QAAI,QAAQ;AACV,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,KAAK,EAAE,OAAO,MAAM,CAAC,EAAE;AAAA,IAClC;AAEA,UAAM,OAAO,WAAW,QAAQ,UAAU,QAAQ,QAAQ,GAAG;AAAA,MAC3D,UAAU,KAAK;AAAA,MACf,UAAU,KAAK,EAAE;AAAA,IACnB,CAAC;AACD,QAAI,MAAM;AACR,WAAK,IAAI,EAAE;AACX,iBAAW,QAAQ,KAAM,MAAK,IAAI,SAAS,KAAK,KAAK,OAAO,IAAI,EAAE;AAAA,IACpE;AAEA,UAAM,YAAY,cAAc,SAAS,KAAK,IAAI,OAAO;AACzD,QAAI,UAAU,SAAS,GAAG;AACxB,WAAK,IAAI,EAAE;AACX,iBAAW,QAAQ,WAAW;AAC5B,cAAM,QAAQ,KAAK,QAAQ,IAAI;AAC/B,aAAK,IAAI,KAAK,EAAE,IAAI,KAAK,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAAC,EAAE;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAA2B;AACjC,UAAM,QAAQ,KAAK,IAAI,cAAc;AACrC,QAAI,MAAM,WAAW,EAAG;AACxB,SAAK,KAAK,mBAAmB,MAAM,MAAM,KAAK,CAAC,MAAM,KAAK,EAAE,KAAK,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/E,eAAW,KAAK,OAAO;AACrB,WAAK,IAAI,EAAE;AACX,WAAK;AAAA,QACH,GAAG,KAAK,MAAM,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,MAAM,CAAC,GAAG,KAAK,EAAE,KAAKF,aAAY,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,CAAC;AAAA,MAC1G;AAEA,iBAAW,EAAE,WAAW,EAAE,EAAE,QAAQ,CAAC,MAAM,MAAM;AAC/C,YAAI,KAAM,MAAK,IAAI,KAAK,MAAM,IAAI,KAAK,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,MAC7D,CAAC;AACD,YAAM,QAAQ,YAAY,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AACnD,UAAI,MAAM,SAAS,GAAG;AACpB,aAAK,IAAI,EAAE;AACX,mBAAW,QAAQ,MAAO,MAAK,IAAI,SAAS,KAAK,KAAK,KAAK,IAAI,EAAE;AAAA,MACnE;AAAA,IACF;AACA,QAAI,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,SAAS,SAAS,mBAAmB,CAAC,GAAG;AACjE,WAAK,IAAI,EAAE;AACX,WAAK;AAAA,QACH,KAAK,EAAE,IAAI,yEAAyE;AAAA,MACtF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIQ,eAON;AACA,UAAM,UAAU,KAAK,IAAI,gBAAgB;AACzC,UAAM,SAAkC;AAAA,MACtC,CAAC,UAAU,QAAQ,MAAM;AAAA,MACzB,CAAC,UAAU,QAAQ,MAAM;AAAA,MACzB,CAAC,WAAW,QAAQ,OAAO;AAAA,MAC3B,CAAC,WAAW,QAAQ,OAAO;AAAA,IAC7B;AACA,UAAM,SAA8C,CAAC;AACrD,QAAI,KAAK,IAAI,OAAO,SAAS,GAAG;AAC9B,YAAM,KAAK,KAAK,IAAI,YAAY;AAChC,aAAO,KAAK;AAAA,QACV,MAAM,WAAW,GAAG,MAAM,YAAY,GAAG,MAAM,YAAY,GAAG,MAAM;AAAA,QACpE,MAAM,GAAG,SAAS,IAAI,QAAQ,GAAG,SAAS,IAAI,SAAS;AAAA,MACzD,CAAC;AAAA,IACH;AACA,eAAW,KAAK,KAAK,IAAI,WAAW;AAClC,YAAM,QAAQ,EAAE,UAAU,KAAK,IAAI,cAAc,KAAK,EAAE,MAAM,MAAM;AACpE,YAAM,OAAOA,aAAY,EAAE,MAAM,KAAK,IAAI,OAAO;AACjD,UAAI,EAAE,WAAW,MAAM;AACrB,eAAO,KAAK,EAAE,MAAM,gBAAgB,KAAK,SAAS,IAAI,KAAK,MAAM,KAAK,CAAC;AAAA,MACzE,OAAO;AACL,cAAM,OAAO,aAAa,EAAE,IAAI,KAAK,UAAU,EAAE,WAAW,SAAS;AACrE,eAAO,KAAK,EAAE,MAAM,gBAAgB,KAAK,cAAc,IAAI,KAAK,IAAI,KAAK,MAAM,MAAM,CAAC;AAAA,MACxF;AAAA,IACF;AACA,UAAM,WAAW,KAAK,IAAI,SAAS,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE;AACvE,QAAI,WAAW,EAAG,QAAO,KAAK,EAAE,MAAM,aAAa,QAAQ,IAAI,MAAM,OAAO,CAAC;AAC7E,UAAM,UAAU,KAAK,IAAI,UAAU,SAAS,EAAE;AAC9C,QAAI,UAAU,EAAG,QAAO,KAAK,EAAE,MAAM,oBAAoB,OAAO,IAAI,MAAM,KAAK,CAAC;AAChF,QAAI,CAAC,KAAK,IAAI,OAAO;AACnB,aAAO,KAAK,EAAE,MAAM,qDAAqD,MAAM,MAAM,CAAC;AAAA,IACxF;AAEA,UAAM,aAAuB,CAAC;AAC9B,UAAM,QAAQ,KAAK,IAAI,UAAU;AACjC,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,QAAQ,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,OAAO,CAAC;AAC1D,iBAAW,KAAK,eAAeC,QAAO,MAAM,QAAQ,eAAe,CAAC,KAAK,MAAM,MAAM,QAAQ;AAC7F,iBAAW,KAAK,OAAO;AACrB,cAAM,WAAW,EAAE,gBAAgB,sBAAsB;AACzD,mBAAW,KAAK,KAAK,KAAK,EAAE,KAAK,IAAI,EAAE,IAAI,KAAK,eAAe,CAAC,CAAC,GAAG,QAAQ,EAAE;AAAA,MAChF;AAAA,IACF;AACA,UAAM,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI;AACrC,UAAM,UAAU,KAAK,IAAI,eAAe;AACxC,UAAM,UAAU,CAAC,KAAK,IAAI,QACtB,eACA,KACE,WACA,SAAS,QAAQ,SAAS,IAAI,KAAK,QAAQ,KAAK,IAAI,CAAC,MAAM,EAAE;AACnE,WAAO;AAAA,MACL;AAAA,MACA,UAAU,eAAe,QAAQ,UAAU;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,YAAoB;AAC1B,UAAM,SAAS,KAAK,IAAI,WAAW;AACnC,QAAI,OAAQ,QAAO,GAAGA,QAAO,OAAO,OAAO,MAAM,CAAC,KAAKA,QAAO,OAAO,MAAM,KAAK,CAAC;AACjF,WAAOA,QAAO,KAAK,IAAI,gBAAgB,EAAE,OAAO,MAAM;AAAA,EACxD;AAAA,EAEQ,oBAA0B;AAChC,UAAM,QAAQ,KAAK,aAAa;AAChC,SAAK,IAAI,EAAE;AACX,eAAW,SAAS,MAAM,OAAQ,MAAK,IAAI,MAAM,IAAI;AACrD,eAAW,QAAQ,MAAM,WAAY,MAAK,IAAI,IAAI;AAClD,UAAM,SAAS,MAAM,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,YAAY,CAAC,EAAE,EAAE,KAAK,IAAI;AACxF,SAAK,IAAI,WAAW,MAAM,OAAO,MAAM,KAAK,UAAU,CAAC,KAAK,MAAM,OAAO,MAAM,QAAQ,EAAE;AAAA,EAC3F;AAAA;AAAA,EAGQ,WAAiB;AACvB,UAAM,IAAI,KAAK;AACf,UAAM,UAAU,KAAK,IAAI,gBAAgB;AACzC,UAAM,QAAQ,KAAK,aAAa;AAChC,UAAM,QAAQ,KAAK;AACnB,UAAM,QAAQ,QAAQ;AACtB,UAAM,MAAM,IAAI,IAAI,OAAO,KAAK,CAAC;AACjC,UAAM,MAAM,IAAI,IAAI,OAAO,KAAK,CAAC;AACjC,UAAM,OAAO,CAAC,YAAoB;AAChC,YAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,cAAc,OAAO,CAAC;AACtD,aAAO,IAAI,OAAO,GAAG,IAAI,OAAO,GAAG,CAAC;AAAA,IACtC;AACA,UAAM,MAAM,CAAC,SAAiB,SAAS,MAAM,QAAQ,GAAG,KAAK;AAC7D,UAAM,YAAY;AAClB,UAAM,OAAO,KAAK,OAAO,QAAQ,UAAU,UAAU,CAAC;AACtD,UAAM,aAAa,CAAC,KAAK,IAAI,QAAQ,EAAE,SAAS,MAAM,KAAK,EAAE,QAAQ,EAAE;AACvE,UAAM,QAAQ,GAAG,IAAI,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,WAAW,SAAS,CAAC,CAAC;AAEjE,UAAM,aAAa,CAAC,OAAe,MAAc;AAC/C,YAAM,QAAQ,OAAO,CAAC;AACtB,UAAI,UAAU,YAAY,IAAI,EAAG,QAAO,EAAE,IAAI,KAAK;AACnD,UAAI,UAAU,SAAU,QAAO,EAAE,MAAM,KAAK;AAC5C,UAAI,UAAU,aAAa,IAAI,EAAG,QAAO,EAAE,OAAO,KAAK;AACvD,UAAI,UAAU,aAAa,IAAI,EAAG,QAAO,EAAE,KAAK,KAAK;AACrD,aAAO;AAAA,IACT;AACA,UAAM,SAAS,KAAK,IAAI,WAAW;AACnC,UAAM,QAAQ,SACV;AAAA,MACE,EAAE,OAAO,UAAU,OAAO,KAAK,IAAI,SAAS,UAAU,EAAE,KAAK,OAAO,OAAO,KAAK,CAAC,CAAC,GAAG;AAAA,MACrF,EAAE,OAAO,SAAS,OAAO,IAAI,IAAI,SAAS,SAAS,EAAE,KAAK,OAAO,OAAO,IAAI,CAAC,CAAC,GAAG;AAAA,IACnF,IACA,CAAC,EAAE,OAAO,UAAU,QAAQ,KAAK,IAAI,SAAS,UAAU,EAAE,KAAK,OAAO,QAAQ,KAAK,CAAC,CAAC,GAAG,CAAC;AAC7F,UAAM,WAAW;AAAA,MACf,GAAG;AAAA,MACH,GAAG,MAAM,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO;AAAA,QACnC,OAAO,GAAG,KAAK,KAAK,CAAC;AAAA,QACrB,SAAS,GAAG,KAAK,KAAK,WAAW,OAAO,CAAC,CAAC;AAAA,MAC5C,EAAE;AAAA,IACJ;AACA,UAAM,OAAiB,CAAC;AACxB,QAAI,UAAU;AACd,QAAI,eAAe;AACnB,eAAW,OAAO,UAAU;AAC1B,YAAM,YAAY,eAAe,GAAG,YAAY,MAAM,IAAI,KAAK,KAAK,IAAI;AACxE,UAAI,gBAAgB,UAAU,SAAS,IAAI,OAAO;AAChD,aAAK,KAAK,OAAO;AACjB,kBAAU,IAAI;AACd,uBAAe,IAAI;AAAA,MACrB,OAAO;AACL,kBAAU,eAAe,GAAG,OAAO,MAAM,IAAI,OAAO,KAAK,IAAI;AAC7D,uBAAe;AAAA,MACjB;AAAA,IACF;AACA,QAAI,QAAS,MAAK,KAAK,OAAO;AAE9B,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,GAAG;AACZ,SAAK,IAAI,KAAK,KAAK,CAAC;AACpB,SAAK,IAAI,GAAG;AACZ,eAAW,OAAO,KAAM,MAAK,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;AAChD,SAAK,IAAI,KAAK,cAAc,EAAE,KAAK,MAAM,QAAQ,CAAC,EAAE,CAAC;AACrD,QAAI,MAAM,QAAQ,SAAS,GAAG,EAAG,MAAK,IAAI,KAAK,IAAI,EAAE,IAAI,IAAI,WAAW,MAAM,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC;AAC5F,QAAI,MAAM,OAAO,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG;AACZ,iBAAW,SAAS,MAAM,QAAQ;AAChC,cAAM,OAAO,IAAI,MAAM,IAAI;AAC3B,cAAM,QAAQ,MAAM,SAAS,QAAQ,EAAE,MAAM,MAAM,SAAS,SAAS,EAAE,SAAS,EAAE;AAClF,aAAK,IAAI,KAAK,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;AAAA,MAClC;AAAA,IACF;AACA,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,WAAK,IAAI,GAAG;AACZ,YAAM,WAAW,QAAQ,CAAC,MAAM,MAAM;AACpC,cAAM,QAAQ,IAAI,IAAI;AACtB,aAAK,IAAI,KAAK,IAAI,MAAM,IAAI,QAAQ,EAAE,OAAO,KAAK,CAAC,EAAE,CAAC;AAAA,MACxD,CAAC;AAAA,IACH;AACA,SAAK,IAAI,GAAG;AAAA,EACd;AACF;;;ACvlBA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AA4BV,IAAM,eAAe;AAmBrB,SAAS,WAAW,OAAuB;AAChD,SAAO,MAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,OAAO,KAAK,EAAE,QAAQ,OAAO,KAAK;AAC9E;AAEO,SAAS,eAAe,OAAuB;AACpD,SAAO,WAAW,KAAK,EAAE,QAAQ,MAAM,KAAK,EAAE,QAAQ,MAAM,KAAK;AACnE;AAEO,SAAS,gBACd,SACA,YACA,SACQ;AACR,QAAM,QAAQ,OAAO,QAAQ,UAAU,EACpC,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,UAAa,MAAM,EAAE,EAC7C,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,eAAe,OAAO,CAAC,CAAC,CAAC,EAAE,EACnD,KAAK,GAAG;AACX,SAAO,KAAK,OAAO,GAAG,QAAQ,IAAI,KAAK,KAAK,EAAE,KAAK,WAAW,OAAO,CAAC;AACxE;AAMA,IAAM,OAA8C;AAAA,EAClD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AACV;AAEA,SAAS,WAAW,MAAsB;AACxC,SAAO,KAAK,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM;AAC/E;AAGO,SAAS,OAAO,MAAsB;AAC3C,SAAO,WAAW,IAAI,EAAE,QAAQ,OAAO,KAAK,EAAE,QAAQ,UAAU,MAAM;AACxE;AAEA,SAAS,OAAO,MAAsB;AACpC,MAAI,KAAK,SAAS,GAAG,KAAK,KAAK,SAAS,IAAI,EAAG,QAAO,OAAO,IAAI;AACjE,SAAO,KAAK,KAAK,QAAQ,OAAO,KAAK,CAAC;AACxC;AAGA,SAAS,MAAM,OAAiB,OAAO,IAAc;AACnD,QAAM,UAAU,KAAK;AAAA,IACnB;AAAA,IACA,GAAG,MAAM,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAAA,EACjF;AACA,QAAM,QAAQ,IAAI,OAAO,KAAK,IAAI,GAAG,UAAU,CAAC,CAAC;AACjD,SAAO,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,GAAG,OAAO,KAAK;AAC5C;AAMO,IAAM,iBAAN,MAAyC;AAAA,EAS9C,YACmB,KACjB,UAAiC,CAAC,GAClC;AAFiB;AAGjB,SAAK,MAAM,QAAQ,OAAO,QAAQ;AAClC,UAAM,OAAO,QAAQ,eAAe;AACpC,SAAK,WAAW,SAAS,YAAa,SAAS,UAAU,KAAK,IAAI,mBAAmB;AACrF,SAAK,gBAAgB,QAAQ,iBAAiB;AAC9C,SAAK,aAAa,QAAQ,cAAc;AACxC,SAAK,UAAU,QAAQ,WAAW;AAAA,EACpC;AAAA,EAlBS,OAAO;AAAA,EACC,MAAM,IAAI,aAAa;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAejB,IAAI,aAAsB;AACxB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ,OAAuB;AAC7B,UAAM,SAAS,KAAK,IAAI,OAAO,KAAK;AACpC,QAAI,CAAC,KAAK,SAAU;AACpB,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,YAAI,OAAQ,MAAK,aAAa,MAAM;AACpC;AAAA,MACF,KAAK;AACH,aAAK,cAAc,MAAM,OAAO;AAChC;AAAA,MACF,KAAK;AACH,aAAK;AAAA,UACH;AAAA,YACE;AAAA,YACA;AAAA,cACE,MAAM,KAAK,eAAe,MAAM,IAAI;AAAA,cACpC,OAAO,2BAA2B,MAAM,SAAS,KAAK,MAAM,MAAM,MAAM,EAAE;AAAA,YAC5E;AAAA,YACA,GAAG,MAAM,OAAO;AAAA;AAAA,UAClB;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,aAAK,KAAK,gBAAgB,WAAW,EAAE,OAAO,WAAW,GAAG,MAAM,OAAO,CAAC;AAC1E;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,KAAK,MAAoB;AAC/B,SAAK,IAAI,OAAO,IAAI;AAAA,EACtB;AAAA;AAAA,EAGQ,eAAe,MAAsB;AAC3C,UAAM,WAAWC,MAAK,QAAQ,KAAK,IAAI,SAAS,IAAI;AACpD,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI,WAAW;AACb,YAAM,MAAMA,MAAK,SAAS,WAAW,QAAQ;AAC7C,UAAI,OAAO,CAAC,IAAI,WAAW,IAAI,KAAK,CAACA,MAAK,WAAW,GAAG,EAAG,QAAO,IAAI,QAAQ,OAAO,GAAG;AAAA,IAC1F;AACA,WAAOC,aAAY,UAAU,KAAK,IAAI,OAAO;AAAA,EAC/C;AAAA,EAEQ,UAAU,QAA4B;AAC5C,UAAM,SAAS,KAAK,IAAI,cAAc,IAAI,OAAO,IAAI,MAAM,OAAO;AAClE,UAAM,MAAM,OAAO,QAAQ,SAAY,KAAK,OAAO,GAAG,KAAK;AAC3D,WAAO,GAAG,MAAM,GAAG,OAAO,IAAI,IAAI,GAAG,GAAG;AAAA,EAC1C;AAAA,EAEQ,aAAa,QAA0B;AAC7C,UAAM,EAAE,QAAQ,IAAI;AACpB,QAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,YAAM,QAAQ,QAAQ,WAAW,WAAW,WAAM,QAAQ,WAAW,YAAY,WAAM;AACvF,YAAM,OAAO,GAAGC,QAAO,OAAO,MAAM,QAAQ,MAAM,CAAC,KAAK,eAAe,QAAQ,UAAU,CAAC;AAC1F,WAAK,KAAK,YAAY,WAAW,GAAG,KAAK,IAAI,KAAK,UAAU,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE;AAClF,iBAAW,KAAK,OAAO,OAAO;AAC5B,cAAM,IAAI,EAAE,WAAW,WAAW,WAAM,EAAE,WAAW,YAAY,WAAM;AACvE,cAAM,SAAS,EAAE,SAAS,MAAM,UAAU,EAAE,MAAM,CAAC,KAAK;AACxD,aAAK;AAAA,UACH;AAAA,YACE,KAAK,CAAC,IAAI,UAAU,EAAE,IAAI,CAAC,KAAK,eAAe,EAAE,UAAU,CAAC,IAAI,MAAM;AAAA,UACxE;AAAA,QACF;AAAA,MACF;AACA,WAAK,KAAK,cAAc;AAAA,IAC1B;AACA,UAAM,OAAO,KAAK,eAAe,OAAO,IAAI,IAAI;AAChD,QAAI,QAAQ,WAAW,UAAU;AAE/B,YAAM,QAAQ,CAAC,gBAAgB,QAAQ,SAAS,QAAQ,SAAS,gBAAgB,OAAO,CAAC,CAAC;AAC1F,YAAM,aAAa,oBAAoB,OAAO;AAC9C,UAAI,WAAY,OAAM,KAAK,gBAAgB,UAAU,EAAE;AACvD,YAAM,aAAa,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ;AACjE,UAAI,cAAc,CAAC,QAAQ,QAAQ;AACjC,cAAM,KAAK,QAAQ,UAAU,WAAW,IAAI,CAAC,KAAK,WAAW,UAAU,QAAQ,EAAE;AAAA,MACnF;AACA,YAAM,aAAa,QAAQ,cAAc,CAAC;AAC1C,iBAAW,KAAK,WAAW,MAAM,GAAG,KAAK,aAAa,EAAG,OAAM,KAAK,KAAK,aAAa,CAAC,CAAC,EAAE;AAC1F,UAAI,WAAW,SAAS,KAAK,eAAe;AAC1C,cAAM,KAAK,aAAa,WAAW,SAAS,KAAK,aAAa,OAAO;AAAA,MACvE;AACA,YAAM,SAAS,WAAW,OAAO;AACjC,UAAI,OAAQ,OAAM,KAAK,MAAM;AAC7B,YAAM,KAAK,GAAG,cAAc,SAAS,KAAK,IAAI,OAAO,CAAC;AACtD,YAAM,OAAO,eAAe,OAAO;AACnC,YAAM,OACJ,SAAS,YACL,cACA,SAAS,eACP,mBACA,OACE,YACA;AACV,WAAK;AAAA,QACH;AAAA,UACE;AAAA,UACA,EAAE,MAAM,MAAM,OAAO,IAAI,MAAM,OAAO,aAAa,KAAK,UAAU,MAAM,CAAC,IAAI,IAAI,GAAG;AAAA,UACpF,MAAM,KAAK,IAAI;AAAA,QACjB;AAAA,MACF;AAAA,IACF,WAAW,QAAQ,QAAQ;AACzB,WAAK;AAAA,QACH;AAAA,UACE;AAAA,UACA,EAAE,MAAM,MAAM,OAAO,IAAI,MAAM,OAAO,aAAa,KAAK,UAAU,MAAM,CAAC,eAAe;AAAA,UACxF,QAAQ,eAAe,QAAQ,OAAO,QAAQ,CAAC,YAAY,eAAe,QAAQ,OAAO,QAAQ,CAAC;AAAA,QACpG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,OAA2B;AAC/C,QAAI,MAAM,WAAW,SAAU;AAC/B,UAAM,UAAU,MAAM,WAAW,WAAW,UAAU;AACtD,UAAM,OAAO,MAAM,WAAW,WAAW,WAAW;AACpD,SAAK;AAAA,MACH;AAAA,QACE;AAAA,QACA;AAAA,UACE,OAAO,kBAAkB,IAAI,KAAK,MAAM,KAAK,GAAG,MAAM,SAAS,KAAK,MAAM,MAAM,MAAM,EAAE;AAAA,QAC1F;AAAA,QACA,MAAM,UAAU,MAAM;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAmB;AACjB,UAAM,MAAM,KAAK;AACjB,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,KAAK,IAAI,GAAG,KAAK,IAAI;AAC3B,UAAM,UAAU,IAAI,eAAe;AACnC,UAAM,UAAU,CAAC,IAAI,QACjB,4BACA,KACE,kBACA,gBAAW,QAAQ,SAAS,IAAI,KAAK,QAAQ,KAAK,IAAI,CAAC,MAAM,EAAE;AACrE,UAAM,MAAgB,CAAC;AACvB,QAAI,KAAK,wBAAwB,OAAO,IAAI,EAAE;AAC9C,QAAI,KAAK,qEAAqE;AAC9E,QAAI,KAAK,6CAA6C;AACtD,QAAI;AAAA,MACF,KAAK,OAAO,MAAM,QAAQ,KAAK,MAAM,QAAQ,MAAM,MAAM,QAAQ,MAAM,MAAM,QAAQ,OAAO,MAAM,QAAQ,OAAO,MAAM,eAAe,QAAQ,UAAU,CAAC;AAAA,IAC3J;AACA,QAAI,IAAI,QAAQ,SAAS,GAAG;AAC1B,YAAM,UAAU,IAAI,QAAQ,IAAI,CAAC,SAAS;AACxC,cAAM,IAAI,IAAI,SAAS,IAAI,IAAI;AAC/B,YAAI,CAAC,EAAG,QAAO,OAAO,IAAI;AAC1B,cAAM,OAAO,gBAAgB,EAAE,UAAU;AACzC,eAAO,GAAG,OAAO,IAAI,CAAC,KAAK,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAAA,MACvG,CAAC;AACD,YAAM,SAAS,IAAI,WAAW,UAAa,IAAI,SAAS,IAAI,gBAAa,IAAI,MAAM,KAAK;AACxF,UAAI,KAAK,IAAI,YAAY,QAAQ,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE;AAAA,IACxD;AAEA,UAAM,SAAS,CAAC,GAAG,IAAI,UAAU,QAAQ,CAAC,EAAE,KAAK,YAAY;AAC7D,QAAI,OAAO,SAAS,GAAG;AACrB,UAAI,KAAK,IAAI,wBAAmB,OAAO,MAAM,KAAK,EAAE;AACpD,UAAI,KAAK,8CAA8C;AACvD,UAAI,KAAK,iCAAiC;AAC1C,iBAAW,KAAK,QAAQ;AACtB,YAAI;AAAA,UACF,KAAK,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,OAAOD,aAAY,EAAE,IAAI,MAAM,KAAK,IAAI,OAAO,CAAC,CAAC,MAAM,OAAO,EAAE,IAAI,MAAM,CAAC,MAAM,eAAe,EAAE,QAAQ,UAAU,CAAC,MAAM,OAAO,SAAS,gBAAgB,gBAAgB,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,QACnO;AAAA,MACF;AACA,iBAAW,KAAK,OAAO,MAAM,GAAG,KAAK,UAAU,GAAG;AAChD,cAAM,OAAO,YAAY,GAAG,EAAE,SAAS,KAAK,IAAI,SAAS,cAAc,GAAG,CAAC;AAC3E,YAAI,KAAK,IAAI,qBAAqB,WAAW,KAAK,UAAU,CAAC,CAAC,CAAC,cAAc,EAAE;AAC/E,YAAI,KAAK,GAAG,MAAM,MAAM,MAAM,CAAC;AAC/B,YAAI,KAAK,IAAI,YAAY;AAAA,MAC3B;AACA,UAAI,OAAO,SAAS,KAAK,YAAY;AACnC,YAAI;AAAA,UACF;AAAA,UACA,IAAI,OAAO,SAAS,KAAK,UAAU;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,IAAI,cAAc;AAChC,QAAI,IAAI,UAAU,SAAS,GAAG;AAC5B,UAAI,KAAK,IAAI,eAAe,MAAM,SAAS,IAAI,WAAW,EAAE,IAAI,EAAE;AAClE,UAAI,KAAK,iCAAiC;AAC1C,UAAI,KAAK,qBAAqB;AAC9B,iBAAW,KAAK,IAAI,WAAW;AAC7B,cAAM,OAAO,EAAE,WAAW,SAAS,KAAK,SAAS,KAAK;AACtD,cAAM,OAAO,EAAE,WAAW,SAAU,EAAE,WAAW,UAAW;AAC5D,cAAM,SAAS,EAAE,SAAS,KAAK,OAAO,EAAE,MAAM,CAAC,MAAM;AACrD,YAAI;AAAA,UACF,KAAK,IAAI,MAAM,OAAOA,aAAY,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,CAAC,GAAG,MAAM,MAAM,OAAO,IAAI,CAAC;AAAA,QACzF;AAAA,MACF;AACA,UAAI,MAAM,SAAS,GAAG;AACpB,YAAI,KAAK,IAAI,sEAAsE;AAAA,MACrF;AAAA,IACF;AAEA,QAAI,IAAI,OAAO,SAAS,GAAG;AACzB,YAAM,KAAK,IAAI,YAAY;AAC3B,UAAI,KAAK,IAAI,eAAe,GAAG,MAAM,YAAY,GAAG,MAAM,YAAY,GAAG,MAAM,YAAY,EAAE;AAC7F,UAAI,KAAK,6BAA6B;AACtC,UAAI,KAAK,qBAAqB;AAC9B,iBAAW,KAAK,IAAI,QAAQ;AAC1B,YAAI;AAAA,UACF,KAAK,KAAK,EAAE,MAAM,CAAC,MAAM,OAAO,EAAE,SAAS,GAAG,EAAE,KAAK,KAAK,EAAE,MAAM,MAAM,EAAE,KAAK,CAAC,MAAM,OAAO,SAAS,EAAE,UAAU,IAAI,GAAG,CAAC,CAAC;AAAA,QAC7H;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,IAAI,UAAU;AAC5B,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,QAAQ,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,OAAO,CAAC;AAC1D,UAAI;AAAA,QACF;AAAA,QACA,mBAAmBC,QAAO,MAAM,QAAQ,eAAe,CAAC,KAAK,MAAM,MAAM;AAAA,QACzE;AAAA,MACF;AACA,UAAI,KAAK,oCAAoC;AAC7C,UAAI,KAAK,2BAA2B;AACpC,iBAAW,KAAK,OAAO;AACrB,cAAM,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,QAAQ,IAAI,YAAY;AAChE,cAAM,cAAc,EAAE,gBAAgB,GAAG,IAAI,sBAAsB;AACnE,YAAI;AAAA,UACF,KAAK,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,IAAI,EAAE,IAAI,KAAK,GAAG,MAAM,cAAc,EAAE,IAAI,CAAC,MAAM,WAAW;AAAA,QACjH;AAAA,MACF;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,SAAS,GAAG;AAC3B,UAAI,KAAK,IAAI,8BAAoB,IAAI,SAAS,MAAM,KAAK,EAAE;AAC3D,iBAAW,KAAK,IAAI,SAAU,KAAI,KAAK,KAAK,WAAW,CAAC,EAAE,QAAQ,UAAU,GAAG,CAAC,EAAE;AAAA,IACpF;AAEA,UAAM,MAAM,CAAC,GAAG,IAAI,KAAK,EAAE,KAAK,YAAY;AAC5C,QAAI,IAAI,SAAS,GAAG;AAClB,UAAI,KAAK,IAAI,gCAAgC,IAAI,MAAM,eAAe,EAAE;AACxE,UAAI,KAAK,uCAAuC;AAChD,UAAI,KAAK,2BAA2B;AACpC,iBAAW,KAAK,IAAI,MAAM,GAAG,KAAK,OAAO,GAAG;AAC1C,YAAI;AAAA,UACF,KAAK,KAAK,EAAE,QAAQ,MAAM,CAAC,MAAM,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,IAAI,MAAM,CAAC,MAAM,eAAe,EAAE,QAAQ,UAAU,CAAC;AAAA,QAChI;AAAA,MACF;AACA,UAAI,IAAI,SAAS,KAAK;AACpB,YAAI,KAAK,IAAI,IAAI,IAAI,SAAS,KAAK,OAAO,uBAAuB;AACnE,UAAI,KAAK,IAAI,YAAY;AAAA,IAC3B;AACA,WAAO,GAAG,IAAI,KAAK,IAAI,CAAC;AAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,WAAW,KAAK,SAAS;AAC/B,UAAM,cAAc,KAAK,IAAI;AAC7B,QAAI,aAAa;AACf,YAAMC,IAAG,WAAW,aAAa;AAAA,EAAK,QAAQ,IAAI,MAAM;AACxD;AAAA,IACF;AACA,UAAM,OAAOH,MAAK,KAAK,cAAc,KAAK,IAAI,SAAS,KAAK,IAAI,MAAM,GAAG,YAAY;AACrF,UAAMG,IAAG,MAAMH,MAAK,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACtD,UAAMG,IAAG,UAAU,MAAM,UAAU,MAAM;AACzC,SAAK,IAAI,OAAO,mBAAmBF,aAAY,MAAM,KAAK,IAAI,OAAO,CAAC,EAAE;AAAA,EAC1E;AACF;;;ACvZA,OAAOG,SAAQ;AACf,OAAOC,WAAU;AAaV,IAAM,eAAe;AA0L5B,SAAS,IAAI,IAAuC;AAClD,MAAI,OAAO,UAAa,CAAC,OAAO,SAAS,EAAE,EAAG,QAAO;AACrD,QAAM,OAAO,IAAI,KAAK,EAAE;AACxB,SAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,IAAI,OAAO,KAAK,YAAY;AAChE;AAEA,SAAS,WAAW,QAAoB,SAA2B;AACjE,QAAM,EAAE,KAAK,QAAQ,IAAI;AACzB,QAAM,MAAgB;AAAA,IACpB,IAAI,IAAI;AAAA,IACR,QAAQ,OAAO;AAAA,IACf,GAAI,OAAO,QAAQ,SAAY,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC;AAAA,IACtD,MAAM,IAAI;AAAA,IACV,MAAMC,aAAY,IAAI,MAAM,OAAO;AAAA,IACnC,QAAQ,IAAI;AAAA,IACZ,GAAI,IAAI,KAAK,SAAS,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,CAAC;AAAA,IACrD,GAAI,IAAI,SAAS,SAAY,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,IACnD,GAAI,IAAI,QAAQ,EAAE,OAAO,KAAc,IAAI,CAAC;AAAA,IAC5C,QAAQ,QAAQ;AAAA,IAChB,YAAY,QAAQ;AAAA,EACtB;AACA,MAAI,QAAQ,cAAc,OAAW,KAAI,YAAY,QAAQ;AAC7D,MAAI,QAAQ,WAAW,OAAW,KAAI,SAAS,QAAQ;AACvD,MAAI,QAAQ,cAAc,QAAQ,WAAW,SAAS,GAAG;AACvD,QAAI,aAAa,QAAQ,WAAW,IAAI,CAAC,MAAM;AAC7C,YAAM,QAAsB,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ;AAC/D,UAAI,EAAE,aAAa,OAAW,OAAM,WAAW,WAAW,EAAE,QAAQ;AACpE,UAAI,EAAE,WAAW,OAAW,OAAM,SAAS,WAAW,EAAE,MAAM;AAC9D,UAAI,EAAE,UAAU,OAAW,OAAM,QAAQ,EAAE;AAC3C,UAAI,EAAE,YAAY,OAAW,OAAM,UAAU,EAAE;AAC/C,UAAI,EAAE,cAAc,OAAW,OAAM,YAAY,EAAE;AACnD,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,QAAM,aAAa,oBAAoB,OAAO;AAC9C,MAAI,eAAe,OAAW,KAAI,gBAAgB,EAAE,QAAQ,WAAW;AACvE,MAAI,QAAQ,aAAa,OAAW,KAAI,WAAW,WAAW,QAAQ,QAAQ;AAC9E,MAAI,QAAQ,WAAW,OAAW,KAAI,SAAS,WAAW,QAAQ,MAAM;AACxE,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,QAAI,QAAQ,OAAO,MAAM,IAAI,CAAC,MAAM;AAClC,YAAM,OAAiB;AAAA,QACrB,OAAO,EAAE,KAAK;AAAA,QACd,MAAM,EAAE,KAAK;AAAA,QACb,MAAM,EAAE,KAAK;AAAA,QACb,QAAQ,EAAE,KAAK;AAAA,QACf,QAAQ,EAAE;AAAA,QACV,YAAY,EAAE;AAAA,MAChB;AACA,UAAI,EAAE,WAAW,OAAW,MAAK,SAAS,EAAE;AAC5C,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,MAAI,QAAQ,QAAQ;AAClB,QAAI,SAAS,EAAE,UAAU,QAAQ,OAAO,UAAU,UAAU,QAAQ,OAAO,SAAS;AAAA,EACtF;AACA,MAAI,QAAQ,UAAW,KAAI,YAAYA,aAAY,QAAQ,WAAW,OAAO;AAC7E,MAAI,QAAQ,WAAY,KAAI,aAAaA,aAAY,QAAQ,YAAY,OAAO;AAChF,SAAO;AACT;AAGO,SAAS,gBAAgB,KAAmB,SAA6B;AAC9E,QAAM,UAAU,IAAI,gBAAgB;AACpC,QAAM,QAAQ,IAAI,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAC7C,QAAM,YAAY,IAAI,IAAI,SAAS;AACnC,QAAM,aACJ,IAAI,cAAc,UAAa,IAAI,QAAQ,IAAI,IAAI,YAAY,QAAQ,UAAU,IAAI;AACvF,QAAM,SAAS,IAAI,WAAW;AAC9B,QAAM,cAA2B;AAAA,IAC/B,OAAO,SAAS,OAAO,QAAQ,QAAQ;AAAA,IACvC,GAAI,SAAS,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,IACtC,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB,SAAS,QAAQ;AAAA,IACjB,YAAY,QAAQ;AAAA,IACpB,GAAI,QAAQ,YAAY,EAAE,WAAW,EAAE,GAAG,QAAQ,UAAU,EAAE,IAAI,CAAC;AAAA,IACnE,GAAI,MAAM,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,IACpC,QAAQ,IAAI,YAAY;AAAA,IACxB,eAAe,IAAI,cAAc,EAAE;AAAA,IACnC,UAAU,IAAI,SAAS;AAAA,EACzB;AACA,QAAMC,UAAqB;AAAA,IACzB,SAAS;AAAA,IACT,WAAW;AAAA,IACX,IAAI,IAAI,GAAG,KAAK,IAAI;AAAA,IACpB,UAAU,IAAI;AAAA,IACd;AAAA,IACA;AAAA,IACA,GAAI,IAAI,WAAW,UAAa,IAAI,SAAS,IAAI,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;AAAA,IAC3E,GAAI,IAAI,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,MAAM,EAAE,IAAI,CAAC;AAAA,IAC/C,SAAS,IAAI,QAAQ,IAAI,CAAC,SAAS;AACjC,YAAM,UAAU,IAAI,SAAS,IAAI,IAAI;AACrC,YAAM,SAAqB,EAAE,KAAK;AAClC,UAAI,SAAS,IAAK,QAAO,MAAM,QAAQ;AACvC,UAAI,SAAS,gBAAiB,QAAO,kBAAkB,QAAQ;AAC/D,UAAI,SAAS,WAAY,QAAO,aAAa,EAAE,GAAG,QAAQ,WAAW;AACrE,aAAO;AAAA,IACT,CAAC;AAAA,IACD,SAAS;AAAA,IACT,OAAO,CAAC,GAAG,IAAI,KAAK,EAAE,KAAK,YAAY,EAAE,IAAI,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAAA,EAC5E;AACA,MAAI,IAAI,OAAO,SAAS,GAAG;AACzB,IAAAA,QAAO,SAAS,IAAI,OAAO,IAAI,CAAC,MAAM;AACpC,YAAM,QAAsB;AAAA,QAC1B,IAAI,EAAE;AAAA,QACN,GAAI,EAAE,WAAW,SAAY,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC;AAAA,QACrD,OAAO,EAAE;AAAA,QACT,QAAQ,EAAE;AAAA,MACZ;AACA,UAAI,EAAE,WAAW,OAAW,OAAM,SAAS,EAAE;AAC7C,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,MAAI,IAAI,UAAU,SAAS,GAAG;AAC5B,IAAAA,QAAO,YAAY,IAAI,UAAU,IAAI,CAAC,MAAM;AAC1C,YAAM,QAAsB;AAAA,QAC1B,MAAMD,aAAY,EAAE,MAAM,OAAO;AAAA,QACjC,GAAI,EAAE,WAAW,SAAY,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC;AAAA,QACrD,QAAQ,EAAE;AAAA,MACZ;AACA,UAAI,EAAE,YAAY,OAAW,OAAM,UAAU,EAAE;AAC/C,UAAI,EAAE,SAAS,OAAW,OAAM,OAAO,WAAW,EAAE,IAAI;AACxD,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,MAAI,IAAI,SAAS,SAAS,EAAG,CAAAC,QAAO,WAAW,CAAC,GAAG,IAAI,QAAQ;AAC/D,SAAOA;AACT;AAEO,IAAM,eAAN,MAAuC;AAAA,EAM5C,YAA6B,KAAsB;AAAtB;AAC3B,SAAK,WAAWC,MAAK,KAAK,cAAc,IAAI,SAAS,IAAI,MAAM,GAAG,YAAY;AAAA,EAChF;AAAA,EAPS,OAAO;AAAA,EACC,MAAM,IAAI,aAAa;AAAA;AAAA,EAE/B;AAAA,EAMT,QAAQ,OAAuB;AAC7B,SAAK,IAAI,OAAO,KAAK;AAAA,EACvB;AAAA;AAAA,EAGA,SAAqB;AACnB,WAAO,gBAAgB,KAAK,KAAK,KAAK,IAAI,OAAO;AAAA,EACnD;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,MAAM,KAAK,OAAO;AACxB,UAAMC,IAAG,MAAMD,MAAK,QAAQ,KAAK,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/D,UAAMC,IAAG,UAAU,KAAK,UAAU,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC7E,SAAK,IAAI,OAAO,mBAAmBH,aAAY,KAAK,UAAU,KAAK,IAAI,OAAO,CAAC,EAAE;AAAA,EACnF;AACF;;;ACzVA,OAAOI,SAAQ;AACf,OAAOC,YAAU;AAkBV,IAAM,aAAa;AAG1B,IAAM,oBAAoB;AAEnB,SAAS,gBAAgB,MAAsB;AACpD,SAAO,KAAK,QAAQ,mBAAmB,EAAE;AAC3C;AAEO,SAAS,cAAc,OAAuB;AACnD,SAAO,gBAAgB,KAAK,EACzB,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,OAAO,EACtB,QAAQ,OAAO,OAAO;AAC3B;AAOO,SAAS,MAAM,MAAsB;AAC1C,SAAO,YAAY,gBAAgB,IAAI,EAAE,QAAQ,QAAQ,iBAAiB,CAAC;AAC7E;AAEA,SAAS,QAAQ,IAAoB;AACnC,QAAM,OAAO,OAAO,SAAS,EAAE,KAAK,KAAK,IAAI,KAAK;AAClD,UAAQ,OAAO,KAAM,QAAQ,CAAC;AAChC;AAEA,SAAS,MAAM,OAA6D;AAC1E,SAAO,MACJ,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,MAAS,EACjC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,cAAc,OAAO,CAAC,CAAC,CAAC,GAAG,EACrD,KAAK,EAAE;AACZ;AAEA,SAAS,YAAY,IAA4C;AAC/D,MAAI,OAAO,UAAa,CAAC,OAAO,SAAS,EAAE,EAAG,QAAO;AACrD,QAAM,OAAO,IAAI,KAAK,EAAE;AAExB,SAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,IAAI,SAAY,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE;AAClF;AAEA,SAAS,YAAY,QAA4B;AAC/C,QAAM,EAAE,QAAQ,IAAI;AACpB,MAAI,QAAQ,cAAc,UAAW,QAAO;AAC5C,MAAI,QAAQ,cAAc,OAAQ,QAAO;AACzC,MAAI,QAAQ,cAAc,QAAS,QAAO;AAC1C,MAAI,QAAQ,cAAc,SAAU,QAAO;AAC3C,MAAI,QAAQ,cAAc,QAAQ,WAAW,SAAS,EAAG,QAAO;AAChE,MAAI,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAG,QAAO;AAC5D,MAAI,QAAQ,OAAQ,QAAO;AAC3B,SAAO;AACT;AAeA,SAAS,SAAS,MAAc,WAA2B;AACzD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,CAAC;AAAA,IACb,WAAW,CAAC;AAAA,IACZ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,YAAY,OAAc,QAA0B;AAC3D,QAAM,OAAO,GAAG,MAAM,aAAa,MAAM;AAAA,IACvC,CAAC,QAAQ,MAAM,IAAI;AAAA,IACnB,CAAC,SAAS,MAAM,KAAK;AAAA,IACrB,CAAC,YAAY,MAAM,QAAQ;AAAA,IAC3B,CAAC,UAAU,MAAM,MAAM;AAAA,IACvB,CAAC,WAAW,MAAM,OAAO;AAAA,IACzB,CAAC,QAAQ,QAAQ,MAAM,MAAM,CAAC;AAAA,IAC9B,CAAC,aAAa,MAAM,SAAS;AAAA,EAC/B,CAAC,CAAC;AACF,MAAI,MAAM,WAAW,WAAW,KAAK,MAAM,UAAU,WAAW,EAAG,QAAO,CAAC,GAAG,IAAI,IAAI;AACtF,QAAM,QAAQ,CAAC,GAAG,IAAI,GAAG;AACzB,MAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,UAAM,KAAK,GAAG,MAAM,gBAAgB;AACpC,eAAW,CAAC,MAAM,KAAK,KAAK,MAAM,YAAY;AAC5C,YAAM;AAAA,QACJ,GAAG,MAAM,gBAAgB,MAAM;AAAA,UAC7B,CAAC,QAAQ,IAAI;AAAA,UACb,CAAC,SAAS,KAAK;AAAA,QACjB,CAAC,CAAC;AAAA,MACJ;AAAA,IACF;AACA,UAAM,KAAK,GAAG,MAAM,iBAAiB;AAAA,EACvC;AAEA,aAAW,MAAM,MAAM,UAAW,OAAM,KAAK,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC;AAChF,QAAM,KAAK,GAAG,MAAM,cAAc;AAClC,SAAO;AACT;AAEA,SAAS,SAAS,MAAoD,MAA0B;AAC9F,MAAI,KAAK,WAAW,EAAG,QAAO,CAAC,YAAY,MAAM,IAAI,CAAC,IAAI;AAC1D,SAAO,CAAC,YAAY,MAAM,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,GAAG,aAAa;AACjF;AAGO,SAAS,cAAc,KAAmB,SAAyB;AACxE,QAAM,YAAY,YAAY,IAAI,SAAS;AAC3C,QAAM,SAAS,oBAAI,IAAmB;AACtC,aAAW,UAAU,IAAI,SAAS;AAChC,UAAM,QAAQ,SAAS,QAAQ,SAAS;AACxC,UAAM,UAAU,IAAI,SAAS,IAAI,MAAM;AACvC,QAAI,SAAS,IAAK,OAAM,WAAW,KAAK,CAAC,OAAO,QAAQ,GAAG,CAAC;AAC5D,QAAI,SAAS;AACX,YAAM,WAAW,KAAK,CAAC,mBAAmB,QAAQ,eAAe,CAAC;AACpE,WAAO,IAAI,QAAQ,KAAK;AAAA,EAC1B;AAEA,aAAW,UAAU,CAAC,GAAG,IAAI,KAAK,EAAE,KAAK,YAAY,GAAG;AACtD,UAAM,EAAE,KAAK,QAAQ,IAAI;AACzB,QAAI,QAAQ,OAAO,IAAI,IAAI,MAAM;AACjC,QAAI,CAAC,OAAO;AACV,cAAQ,SAAS,IAAI,QAAQ,SAAS;AACtC,aAAO,IAAI,IAAI,QAAQ,KAAK;AAAA,IAC9B;AACA,UAAM,OAAOC,aAAY,IAAI,MAAM,OAAO;AAC1C,UAAM,OAAO,OAAO,QAAQ,SAAY,GAAG,IAAI,IAAI,SAAS,OAAO,GAAG,MAAM,IAAI;AAChF,UAAM,OAAiB,CAAC;AACxB,UAAM;AACN,UAAM,UAAU,QAAQ,cAAc;AACtC,QAAI,QAAQ,WAAW,UAAU;AAE/B,YAAMC,OAAM,eAAe,OAAO,IAAI,UAAU;AAChD,UAAIA,SAAQ,QAAS,OAAM;AAAA,UACtB,OAAM;AACX,YAAM,UAAU,SAAS,gBAAgB,OAAO,GAAG,GAAG;AACtD,YAAM,OAAO,YAAY,QAAQ,EAAE,QAAQ,CAAC,EAAE,KAAK,IAAI;AACvD,WAAK;AAAA,QACH,IAAIA,IAAG,GAAG,MAAM;AAAA,UACd,CAAC,WAAW,OAAO;AAAA,UACnB,CAAC,QAAQ,YAAY,MAAM,CAAC;AAAA,QAC9B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,KAAKA,IAAG;AAAA,MAC3B;AAAA,IACF,WAAW,QAAQ,WAAW,WAAW;AACvC,YAAM;AACN,WAAK;AAAA,QACH,WAAW,MAAM,CAAC,CAAC,WAAW,QAAQ,SAAS,UAAU,QAAQ,MAAM,IAAI,MAAS,CAAC,CAAC,CAAC;AAAA,MACzF;AAAA,IACF;AACA,UAAM,QAAkB,CAAC;AACzB,QAAI,QAAQ,WAAW,UAAW,OAAM,KAAK,kCAAkC;AAC/E,QAAI,QAAQ,WAAW,YAAY,QAAQ,QAAQ;AACjD,YAAM;AAAA,QACJ,yBAAyB,QAAQ,OAAO,QAAQ,cAAc,QAAQ,OAAO,QAAQ;AAAA,MACvF;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,SAAU,OAAM,KAAK,GAAG,cAAc,SAAS,OAAO,CAAC;AAC9E,QAAI,MAAM,SAAS,EAAG,MAAK,KAAK,eAAe,MAAM,MAAM,KAAK,IAAI,CAAC,CAAC,eAAe;AACrF,UAAM,UAAU;AAAA,MACd;AAAA,QACE;AAAA,UACE,CAAC,aAAa,IAAI;AAAA,UAClB,CAAC,QAAQ,IAAI;AAAA,UACb,CAAC,QAAQ,QAAQ,QAAQ,UAAU,CAAC;AAAA,UACpC,CAAC,QAAQ,IAAI;AAAA,UACb,CAAC,QAAQ,IAAI,IAAI;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,IAAI,UAAU,SAAS,GAAG;AAC5B,UAAM,QAAQ,SAAS,qBAAqB,SAAS;AACrD,eAAW,KAAK,IAAI,WAAW;AAC7B,YAAM,OAAOD,aAAY,EAAE,MAAM,OAAO;AACxC,YAAM,OAAiB,CAAC;AACxB,YAAM;AACN,UAAI,EAAE,WAAW,QAAQ;AACvB,cAAM;AACN,cAAM,SAAS,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,KAAK,GAAG,GAAG;AACtE,cAAM,OAAO;AAAA,UACX,EAAE,WAAW;AAAA,UACb,GAAI,OAAO,SAAS,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC;AAAA,QACzC,EAAE,KAAK,IAAI;AACX,aAAK;AAAA,UACH,WAAW,MAAM;AAAA,YACf,CAAC,WAAW,SAAS,UAAU,EAAE,WAAW,gBAAgB,GAAG,GAAG,CAAC;AAAA,YACnE,CAAC,QAAQ,eAAe;AAAA,UAC1B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC;AAAA,QACnB;AAAA,MACF;AACA,YAAM,UAAU;AAAA,QACd;AAAA,UACE;AAAA,YACE,CAAC,aAAa,IAAI;AAAA,YAClB,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,MAAM,MAAM,eAAe;AAAA,YACnE,CAAC,QAAQ,OAAO;AAAA,YAChB,CAAC,QAAQ,IAAI;AAAA,UACf;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO,IAAI,MAAM,MAAM,KAAK;AAAA,EAC9B;AAEA,MAAI,IAAI,OAAO,SAAS,GAAG;AACzB,UAAM,QAAQ,SAAS,mBAAmB,SAAS;AACnD,eAAW,SAAS,IAAI,QAAQ;AAC9B,YAAM,OAAiB,CAAC;AACxB,YAAM;AACN,UAAI,MAAM,WAAW,UAAU;AAC7B,cAAM;AACN,aAAK;AAAA,UACH,WAAW,MAAM;AAAA,YACf,CAAC,WAAW,SAAS,UAAU,MAAM,UAAU,MAAM,KAAK,GAAG,GAAG,CAAC;AAAA,YACjE,CAAC,QAAQ,aAAa;AAAA,UACxB,CAAC,CAAC,IAAI,MAAM,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA,QAC1C;AAAA,MACF,WAAW,MAAM,WAAW,UAAU;AACpC,aAAK,KAAK,eAAe,MAAM,YAAY,MAAM,UAAU,MAAM,KAAK,EAAE,CAAC,eAAe;AAAA,MAC1F;AACA,YAAM,UAAU;AAAA,QACd;AAAA,UACE;AAAA,YACE,CAAC,aAAa,SAAS,MAAM,EAAE,EAAE;AAAA,YACjC,CAAC,QAAQ,MAAM,SAAS,GAAG,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,KAAK;AAAA,YACxE,CAAC,QAAQ,OAAO;AAAA,UAClB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO,IAAI,MAAM,MAAM,KAAK;AAAA,EAC9B;AAEA,QAAM,MAAM,CAAC,GAAG,OAAO,OAAO,CAAC;AAC/B,QAAM,QAAQ,CAAC,QACb,IAAI,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,GAAG,GAAG,CAAC;AACpC,QAAM,UAAU,IAAI,gBAAgB;AACpC,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,cAAc,MAAM;AAAA,MAClB,CAAC,QAAQ,UAAU;AAAA,MACnB,CAAC,SAAS,MAAM,OAAO,CAAC;AAAA,MACxB,CAAC,YAAY,MAAM,UAAU,CAAC;AAAA,MAC9B,CAAC,UAAU,MAAM,QAAQ,CAAC;AAAA,MAC1B,CAAC,WAAW,MAAM,SAAS,CAAC;AAAA,MAC5B,CAAC,QAAQ,QAAQ,QAAQ,UAAU,CAAC;AAAA,IACtC,CAAC,CAAC;AAAA,EACJ;AACA,aAAW,SAAS,IAAK,OAAM,KAAK,GAAG,YAAY,OAAO,IAAI,CAAC;AAC/D,QAAM,KAAK,eAAe;AAC1B,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAC5B;AAEO,IAAM,gBAAN,MAAwC;AAAA,EAK7C,YAA6B,KAAsB;AAAtB;AAC3B,SAAK,WAAWE,OAAK,KAAK,cAAc,IAAI,SAAS,IAAI,MAAM,GAAG,UAAU;AAAA,EAC9E;AAAA,EANS,OAAO;AAAA,EACC,MAAM,IAAI,aAAa;AAAA,EAC/B;AAAA,EAMT,QAAQ,OAAuB;AAC7B,SAAK,IAAI,OAAO,KAAK;AAAA,EACvB;AAAA,EAEA,MAAc;AACZ,WAAO,cAAc,KAAK,KAAK,KAAK,IAAI,OAAO;AAAA,EACjD;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAMC,IAAG,MAAMD,OAAK,QAAQ,KAAK,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/D,UAAMC,IAAG,UAAU,KAAK,UAAU,KAAK,IAAI,GAAG,MAAM;AACpD,SAAK,IAAI,OAAO,mBAAmBH,aAAY,KAAK,UAAU,KAAK,IAAI,OAAO,CAAC,EAAE;AAAA,EACnF;AACF;;;AClTA,IAAM,eAAe,CAAC,WAAqB,SAAS,KAAK,MAAM,MAAM;AAQ9D,SAAS,kBAAkB,MAAsB;AACtD,SAAO,KAAK,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,EAAE,QAAQ,UAAU,GAAG;AAC/E;AAEA,IAAM,gBAAgB;AAEtB,SAAS,WAAW,OAA0C;AAC5D,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,SAAS,KAAK,IAAI,OAAO,KAAK,IAAI;AAC/E,MAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,SAAS;AAExD,MAAI,4BAA4B,KAAK,KAAK,KAAK,CAAC,cAAc,KAAK,KAAK,EAAG,QAAO;AAClF,SAAO,KAAK,UAAU,KAAK;AAC7B;AAEA,SAAS,WAAWI,UAAsB,QAA0B;AAClE,MAAIA,SAAQ,WAAW,EAAG,QAAO,CAAC;AAClC,QAAM,QAAQ,CAAC,GAAG,MAAM,KAAK;AAC7B,aAAW,SAASA,UAAS;AAC3B,QAAI,MAAM,SAAS,UAAU;AAC3B,YAAM,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,WAAW,MAAM,KAAK,CAAC,EAAE;AAAA,IAChE,WAAW,MAAM,SAAS,SAAS;AACjC,YAAM,eAAe,MAAM,MAAM,KAAK,CAAC,MAAM,MAAM,EAAE,KAAK;AAE1D,YAAM,SAAS,aAAa,WAAW,GAAG,IAAI,QAAQ;AACtD,YAAM,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,MAAM,EAAE;AAC7C,iBAAW,QAAQ,MAAM,MAAO,OAAM,KAAK,SAAS,KAAK,KAAK,GAAG,MAAM,KAAK,IAAI,EAAE;AAAA,IACpF,OAAO;AACL,YAAM,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,GAAG;AACnC,iBAAW,QAAQ,MAAM,OAAO;AAC9B,YAAI,QAAQ;AACZ,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACzC,gBAAM,KAAK,GAAG,MAAM,KAAK,QAAQ,OAAO,IAAI,GAAG,CAAC,KAAK,WAAW,CAAC,CAAC,EAAE;AACpE,kBAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,KAAK,GAAG,MAAM,KAAK;AACzB,SAAO;AACT;AAEO,IAAM,cAAN,MAAsC;AAAA,EAO3C,YAA6B,KAAsB;AAAtB;AAAA,EAAuB;AAAA,EAN3C,OAAO;AAAA,EACC,MAAM,IAAI,aAAa;AAAA,EAChC,UAAU;AAAA,EACV,WAAW;AAAA,EACX,QAAQ;AAAA,EAIR,IAAI,MAAoB;AAC9B,SAAK,IAAI,OAAO,0BAA0B,IAAI,CAAC;AAAA,EACjD;AAAA,EAEQ,eAAqB;AAC3B,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AACf,SAAK,IAAI,gBAAgB;AAAA,EAC3B;AAAA,EAEA,QAAQ,OAAuB;AAC7B,UAAM,SAAS,KAAK,IAAI,OAAO,KAAK;AACpC,SAAK,aAAa;AAClB,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK,aAAa;AAChB,cAAM,KAAK,MAAM,QAAQ,SAAS,IAAI,OAAO,MAAM,QAAQ,KAAK,IAAI,CAAC,KAAK;AAC1E,cAAM,QACJ,MAAM,WAAW,UAAa,MAAM,SAAS,IAAI,YAAY,MAAM,MAAM,MAAM;AACjF,aAAK,IAAI,uBAAuB,MAAM,UAAU,SAAS,EAAE,GAAG,KAAK,EAAE;AACrE;AAAA,MACF;AAAA,MACA,KAAK,iBAAiB;AACpB,cAAM,OAAO,gBAAgB,MAAM,UAAU;AAC7C,aAAK;AAAA,UACH,aAAa,MAAM,MAAM,KAAK,OAAO,GAAG,IAAI,OAAO,EAAE,GAAG,MAAM,GAAG,aAAa,MAAM,eAAe;AAAA,QACrG;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,aAAK;AAAA,UACH;AAAA,UACA,YAAYC,aAAY,MAAM,MAAM,KAAK,IAAI,OAAO,CAAC,GAAG,aAAa,MAAM,MAAM,CAAC;AAAA,QACpF;AACA;AAAA,MACF,KAAK,iBAAiB;AAEpB,cAAM,SAAS,kBAAkB,MAAM,OAAO,IAC1C,WAAW,MAAM,QAAQ,KAAK,CAAC,EAAE,MAAM,CAAC,IACxC,YAAY,MAAM,SAAS,MAAM,MAAM,aAAa,KAAK,CAAC;AAC9D,aAAK;AAAA,UACH;AAAA,UACA,kBAAkBA,aAAY,MAAM,MAAM,KAAK,IAAI,OAAO,CAAC,GAAG,aAAa,MAAM,MAAM,CAAC;AAAA,UACxF;AAAA,UACA;AAAA,YACE,EAAE,MAAM,UAAU,KAAK,WAAW,OAAO,UAAU,MAAM,OAAO,EAAE;AAAA,YAClE,EAAE,MAAM,UAAU,KAAK,YAAY,OAAO,OAAO;AAAA,YACjD,GAAI,OAAO,SAAS,IAAI,CAAC,EAAE,MAAM,SAAkB,KAAK,QAAQ,OAAO,OAAO,CAAC,IAAI,CAAC;AAAA,UACtF;AAAA,QACF;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,aAAK,WAAW,MAAM,OAAO;AAC7B;AAAA,MACF,KAAK;AACH,YAAI,OAAQ,MAAK,UAAU,MAAM;AACjC;AAAA,MACF,KAAK;AACH,mBAAW,QAAQ,WAAW,MAAM,OAAO,EAAG,MAAK,IAAI,cAAc,IAAI,EAAE;AAC3E;AAAA,MACF,KAAK;AACH,aAAK,OAAO;AACZ;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,aAAa;AAClB,QAAI,KAAK,SAAU;AACnB,SAAK,WAAW;AAChB,SAAK,IAAI,MAAM,KAAK,KAAK,EAAE;AAC3B,SAAK,IAAI,6DAA6D;AAAA,EACxE;AAAA,EAEQ,MACN,IACA,aACA,YAAY,IACZ,OAAoB,CAAC,GACrB,SAAS,IACT,QACM;AACN,UAAM,IAAI,UAAU,EAAE,KAAK;AAC3B,SAAK;AAAA,MACH,GAAG,MAAM,GAAG,KAAK,OAAO,QAAQ,IAAI,CAAC,MAAM,kBAAkB,WAAW,CAAC,GAAG,SAAS;AAAA,IACvF;AACA,eAAW,QAAQ,WAAW,MAAM,GAAG,MAAM,IAAI,EAAG,MAAK,IAAI,IAAI;AAAA,EACnE;AAAA,EAEQ,WAAW,OAA2B;AAC5C,UAAM,OAAoB,CAAC;AAC3B,QAAI,MAAM,WAAW,UAAU;AAC7B,WAAK,KAAK,EAAE,MAAM,UAAU,KAAK,WAAW,OAAO,UAAU,MAAM,UAAU,MAAM,KAAK,EAAE,CAAC;AAC3F,WAAK,KAAK;AAAA,QACR,MAAM;AAAA,QACN,KAAK;AAAA,QACL,OAAO,MAAM,WAAW,WAAW,SAAS;AAAA,MAC9C,CAAC;AACD,UAAI,MAAM,UAAU,WAAW,MAAM,MAAM,EAAE,SAAS,GAAG;AACvD,aAAK,KAAK,EAAE,MAAM,SAAS,KAAK,UAAU,OAAO,WAAW,MAAM,MAAM,EAAE,CAAC;AAAA,MAC7E;AAAA,IACF;AACA,SAAK;AAAA,MACH,MAAM,WAAW;AAAA,MACjB,UAAU,MAAM,KAAK,GAAG,aAAa,MAAM,MAAM,CAAC;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,UAAU,QAA0B;AAC1C,UAAM,EAAE,KAAK,QAAQ,IAAI;AACzB,UAAM,QAAQ,GAAG,KAAK,IAAI,cAAc,IAAI,IAAI,MAAM,OAAO,EAAE,GAAG,IAAI,IAAI,GAAG,OAAO,QAAQ,SAAY,SAAS,OAAO,GAAG,MAAM,EAAE;AAEnI,QAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,WAAK,IAAI,cAAc,kBAAkB,KAAK,CAAC,EAAE;AACjD,aAAO,MAAM,QAAQ,CAAC,GAAG,MAAM;AAC7B,cAAMC,QAAoB,CAAC,EAAE,MAAM,UAAU,KAAK,eAAe,OAAO,EAAE,WAAW,CAAC;AACtF,YAAI,EAAE,WAAW,UAAU;AACzB,UAAAA,MAAK,KAAK,EAAE,MAAM,UAAU,KAAK,WAAW,OAAO,UAAU,EAAE,UAAU,aAAa,EAAE,CAAC;AACzF,UAAAA,MAAK,KAAK,EAAE,MAAM,UAAU,KAAK,YAAY,OAAO,OAAO,CAAC;AAAA,QAC9D;AACA,cAAM,YACJ,EAAE,WAAW,YAAY,UAAU,EAAE,SAAS,IAAI,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK;AACnF,aAAK,MAAM,EAAE,WAAW,UAAU,UAAU,EAAE,IAAI,GAAG,WAAWA,OAAM,QAAQ,IAAI,CAAC;AAAA,MACrF,CAAC;AACD,WAAK,IAAI,UAAU,OAAO,MAAM,MAAM,EAAE;AAAA,IAC1C;AAEA,QAAI,QAAQ,WAAW,WAAW;AAChC,YAAM,SAAS,QAAQ,SAAS,IAAI,UAAU,QAAQ,MAAM,CAAC,KAAK;AAClE,WAAK,MAAM,MAAM,OAAO,UAAU,MAAM,EAAE;AAC1C;AAAA,IACF;AAEA,UAAM,OAAoB,CAAC,EAAE,MAAM,UAAU,KAAK,eAAe,OAAO,QAAQ,WAAW,CAAC;AAC5F,QAAI,QAAQ,WAAW,UAAW,MAAK,KAAK,EAAE,MAAM,UAAU,KAAK,UAAU,OAAO,UAAU,CAAC;AAC/F,UAAM,aAAa,oBAAoB,OAAO;AAC9C,QAAI,QAAQ,WAAW,UAAU;AAC/B,WAAK,KAAK,EAAE,MAAM,UAAU,KAAK,WAAW,OAAO,gBAAgB,OAAO,EAAE,CAAC;AAC7E,WAAK,KAAK,EAAE,MAAM,UAAU,KAAK,YAAY,OAAO,OAAO,CAAC;AAC5D,WAAK,KAAK,EAAE,MAAM,UAAU,KAAK,QAAQ,OAAOD,aAAY,IAAI,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;AACzF,WAAK,KAAK,EAAE,MAAM,UAAU,KAAK,UAAU,OAAO,IAAI,OAAO,CAAC;AAC9D,UAAI,IAAI,SAAS,OAAW,MAAK,KAAK,EAAE,MAAM,UAAU,KAAK,QAAQ,OAAO,IAAI,KAAK,CAAC;AACtF,UAAI,QAAQ;AACV,aAAK,KAAK,EAAE,MAAM,UAAU,KAAK,cAAc,OAAO,QAAQ,UAAU,CAAC;AAC3E,UAAI,WAAY,MAAK,KAAK,EAAE,MAAM,UAAU,KAAK,eAAe,OAAO,WAAW,CAAC;AACnF,UAAI,QAAQ,UAAU,WAAW,QAAQ,MAAM,EAAE,SAAS,GAAG;AAC3D,aAAK,KAAK,EAAE,MAAM,SAAS,KAAK,UAAU,OAAO,WAAW,QAAQ,MAAM,EAAE,CAAC;AAAA,MAC/E;AACA,YAAM,aAAa,QAAQ,cAAc,CAAC;AAC1C,UAAI,WAAW,SAAS,GAAG;AACzB,aAAK,KAAK;AAAA,UACR,MAAM;AAAA,UACN,KAAK;AAAA,UACL,OAAO,WAAW,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,UAAU,SAAS,EAAE,QAAQ,EAAE;AAAA,QACjF,CAAC;AAAA,MACH;AACA,YAAM,OAAO,WAAW,QAAQ,UAAU,QAAQ,QAAQ,aAAa,KAAK,CAAC;AAC7E,UAAI,KAAM,MAAK,KAAK,EAAE,MAAM,SAAS,KAAK,QAAQ,OAAO,KAAK,CAAC;AAAA,IACjE;AACA,QAAI,QAAQ,QAAQ;AAClB,WAAK,KAAK,EAAE,MAAM,UAAU,KAAK,aAAa,OAAO,QAAQ,OAAO,SAAS,CAAC;AAAA,IAChF;AACA,QAAI,QAAQ,WAAW;AACrB,WAAK,KAAK;AAAA,QACR,MAAM;AAAA,QACN,KAAK;AAAA,QACL,OAAOA,aAAY,QAAQ,WAAW,KAAK,IAAI,OAAO;AAAA,MACxD,CAAC;AAAA,IACH;AACA,QAAI,QAAQ,YAAY;AACtB,WAAK,KAAK;AAAA,QACR,MAAM;AAAA,QACN,KAAK;AAAA,QACL,OAAOA,aAAY,QAAQ,YAAY,KAAK,IAAI,OAAO;AAAA,MACzD,CAAC;AAAA,IACH;AACA,QAAI,IAAI,MAAO,MAAK,KAAK,EAAE,MAAM,UAAU,KAAK,SAAS,OAAO,KAAK,CAAC;AACtE,SAAK,MAAM,QAAQ,WAAW,UAAU,OAAO,IAAI,IAAI;AAAA,EACzD;AAAA,EAEQ,SAAe;AACrB,QAAI,KAAK,SAAU;AACnB,SAAK,WAAW;AAChB,UAAM,UAAU,KAAK,IAAI,gBAAgB;AACzC,SAAK,IAAI,MAAM,KAAK,KAAK,EAAE;AAC3B,SAAK,IAAI,WAAW,QAAQ,KAAK,EAAE;AACnC,SAAK,IAAI,UAAU,QAAQ,MAAM,EAAE;AACnC,SAAK,IAAI,UAAU,QAAQ,MAAM,EAAE;AACnC,SAAK,IAAI,UAAU,QAAQ,OAAO,EAAE;AACpC,SAAK,IAAI,aAAa,QAAQ,OAAO,EAAE;AACvC,QAAI,KAAK,IAAI,OAAO,SAAS,GAAG;AAC9B,YAAM,KAAK,KAAK,IAAI,YAAY;AAChC,WAAK,IAAI,YAAY,GAAG,MAAM,YAAY,GAAG,MAAM,YAAY,GAAG,MAAM,SAAS;AAAA,IACnF;AACA,QAAI,KAAK,IAAI,UAAU,SAAS,GAAG;AACjC,WAAK;AAAA,QACH,oBAAoB,KAAK,IAAI,cAAc,EAAE,MAAM,OAAO,KAAK,IAAI,UAAU,MAAM;AAAA,MACrF;AAAA,IACF;AACA,eAAW,KAAK,KAAK,IAAI,MAAM,GAAG;AAChC,WAAK;AAAA,QACH,WAAW,EAAE,IAAI,KAAK,eAAe,CAAC,CAAC,GAAG,EAAE,gBAAgB,sBAAsB,EAAE;AAAA,MACtF;AAAA,IACF;AACA,SAAK,IAAI,iBAAiB,KAAK,MAAM,QAAQ,UAAU,CAAC,EAAE;AAAA,EAC5D;AACF;;;ACxRO,IAAM,oBAAoB,CAAC,WAAW,QAAQ,SAAS,UAAU,KAAK;AAE7E,IAAM,WAAW,oBAAI,IAA6B;AAElD,SAAS,WAA6C;AACpD,SAAO;AAAA,IACL,CAAC,WAAW,CAAC,QAAQ,IAAI,gBAAgB,GAAG,CAAC;AAAA,IAC7C,CAAC,QAAQ,CAAC,QAAQ,IAAI,aAAa,GAAG,CAAC;AAAA,IACvC,CAAC,SAAS,CAAC,QAAQ,IAAI,cAAc,GAAG,CAAC;AAAA,IACzC,CAAC,UAAU,CAAC,QAAQ,IAAI,eAAe,GAAG,CAAC;AAAA,IAC3C,CAAC,OAAO,CAAC,QAAQ,IAAI,YAAY,GAAG,CAAC;AAAA,EACvC;AACF;AAEA,WAAW,CAAC,MAAM,OAAO,KAAK,SAAS,EAAG,UAAS,IAAI,MAAM,OAAO;AAEpE,SAAS,cAAc,MAAsB;AAC3C,SAAO,KAAK,KAAK,EAAE,YAAY;AACjC;AAMO,SAAS,iBACd,MACA,SACA,UAAkC,CAAC,GAC7B;AACN,QAAM,MAAM,cAAc,IAAI;AAC9B,MAAI,CAAC,OAAO,QAAQ,KAAK,GAAG,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR,yBAAyB,KAAK,UAAU,IAAI,CAAC;AAAA,IAC/C;AAAA,EACF;AACA,MAAI,OAAO,YAAY,YAAY;AACjC,UAAM,IAAI;AAAA,MACR,iCAAiC,GAAG,iDAAiD,OAAO,OAAO;AAAA,IACrG;AAAA,EACF;AACA,MAAI,SAAS,IAAI,GAAG,KAAK,CAAC,QAAQ,UAAU;AAC1C,UAAM,IAAI;AAAA,MACR,aAAa,GAAG;AAAA,IAClB;AAAA,EACF;AACA,WAAS,IAAI,KAAK,OAAO;AAC3B;AAGO,SAAS,mBAAmB,MAAuB;AACxD,SAAO,SAAS,OAAO,cAAc,IAAI,CAAC;AAC5C;AAGO,SAAS,iBAAuB;AACrC,WAAS,MAAM;AACf,aAAW,CAAC,MAAM,OAAO,KAAK,SAAS,EAAG,UAAS,IAAI,MAAM,OAAO;AACtE;AAEO,SAAS,YAAY,MAAuB;AACjD,SAAO,SAAS,IAAI,cAAc,IAAI,CAAC;AACzC;AAGO,SAAS,gBAA0B;AACxC,SAAO,CAAC,GAAG,SAAS,KAAK,CAAC,EAAE,KAAK;AACnC;AAEA,SAASE,cAAa,GAAW,GAAmB;AAClD,QAAM,KAAK,MAAM,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC;AAC3D,WAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,QAAI,OAAO,GAAG,CAAC;AACf,OAAG,CAAC,IAAI;AACR,aAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,YAAM,MAAM,GAAG,CAAC;AAChB,SAAG,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;AACjF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,GAAG,EAAE,MAAM;AACpB;AAEO,IAAM,uBAAN,cAAmC,MAAM;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,UAAkB,OAAiB;AAC7C,UAAM,MAAM,cAAc,QAAQ;AAClC,UAAM,aAAa,MAChB,IAAI,CAAC,UAAU,EAAE,MAAM,GAAGA,cAAa,KAAK,IAAI,EAAE,EAAE,EACpD,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,KAAK,KAAK,KAAK,WAAW,GAAG,KAAK,IAAI,WAAW,IAAI,CAAC,EAC9E,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG;AACjC,UAAM,OAAO,aAAa,kBAAkB,UAAU,OAAO;AAC7D;AAAA,MACE,qBAAqB,QAAQ,sBAAsB,MAAM,KAAK,IAAI,CAAC,IAAI,IAAI;AAAA,IAC7E;AACA,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,QAAQ;AACb,SAAK,aAAa;AAAA,EACpB;AACF;AAOO,SAAS,gBAAgBC,QAAiB,KAAkC;AACjF,QAAM,OAAiB,CAAC;AACxB,aAAW,OAAOA,QAAO;AACvB,eAAW,QAAQ,OAAO,GAAG,EAAE,MAAM,GAAG,GAAG;AACzC,YAAM,MAAM,cAAc,IAAI;AAC9B,UAAI,CAAC,OAAO,KAAK,SAAS,GAAG,EAAG;AAChC,UAAI,CAAC,SAAS,IAAI,GAAG,EAAG,OAAM,IAAI,qBAAqB,KAAK,KAAK,GAAG,cAAc,CAAC;AACnF,WAAK,KAAK,GAAG;AAAA,IACf;AAAA,EACF;AACA,MAAI,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,KAAK,GAAG;AACpD,QAAI;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,KAAK,IAAI,CAAC,QAAQ;AACvB,UAAM,UAAU,SAAS,IAAI,GAAG;AAChC,WAAO,QAAQ,GAAG;AAAA,EACpB,CAAC;AACH;AAYA,SAAS,cAAc,OAA4C;AACjE,SACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA6B,SAAS;AAElD;AAEA,SAAS,cAAc,UAAoB,OAAe,KAAqB;AAC7E,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,SAAO,IAAI,MAAM,aAAa,SAAS,IAAI,mBAAmB,KAAK,KAAK,OAAO,IAAI,EAAE,OAAO,IAAI,CAAC;AACnG;AAEA,SAAS,QAAQ,QAAiB,OAAsB;AACtD,MAAI,OAAO,WAAW,EAAG,QAAO,OAAO,CAAC;AACxC,SAAO,IAAI;AAAA,IACT;AAAA,IACA,GAAG,OAAO,MAAM,4BAA4B,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,EAC/F;AACF;AAMA,SAAS,QAAQ,MAAY,IAA2D;AACtF,QAAM,QAAQ,CAAC,MAAqB;AAClC,UAAM,OAAO,EAAE;AAAA,MACb,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,SAAK,OAAO;AACZ,SAAK,KAAK,KAAK,MAAM;AACnB,UAAI,KAAK,SAAS,KAAM,MAAK,OAAO;AAAA,IACtC,CAAC;AACD,WAAO;AAAA,EACT;AACA,MAAI,KAAK,KAAM,QAAO,MAAM,KAAK,KAAK,KAAK,EAAE,CAAC;AAC9C,QAAM,SAAS,GAAG;AAClB,MAAI,cAAc,MAAM,EAAG,QAAO,MAAM,QAAQ,QAAQ,MAAM,CAAC;AAC/D,SAAO;AACT;AAQO,SAAS,OAAO,WAAiC;AACtD,QAAM,QAAgB,UAAU,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE;AAChE,SAAO;AAAA,IACL,MAAM,UAAU,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC;AAAA,IACtD,QAAQ,OAAuC;AAC7C,YAAM,SAAkB,CAAC;AACzB,YAAM,UAA2B,CAAC;AAClC,iBAAW,QAAQ,OAAO;AACxB,YAAI;AACF,gBAAM,IAAI,QAAQ,MAAM,MAAM,KAAK,SAAS,QAAQ,KAAK,CAAC;AAC1D,cAAI,GAAG;AACL,oBAAQ;AAAA,cACN,EAAE,MAAM,CAAC,QAAQ;AACf,uBAAO,KAAK,cAAc,KAAK,UAAU,MAAM,MAAM,GAAG,CAAC;AAAA,cAC3D,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF,SAAS,KAAK;AACZ,iBAAO,KAAK,cAAc,KAAK,UAAU,MAAM,MAAM,GAAG,CAAC;AAAA,QAC3D;AAAA,MACF;AACA,UAAI,QAAQ,WAAW,GAAG;AACxB,YAAI,OAAO,SAAS,EAAG,OAAM,QAAQ,QAAQ,MAAM,IAAI;AACvD;AAAA,MACF;AACA,aAAO,QAAQ,IAAI,OAAO,EAAE,KAAK,MAAM;AACrC,YAAI,OAAO,SAAS,EAAG,OAAM,QAAQ,QAAQ,MAAM,IAAI;AAAA,MACzD,CAAC;AAAA,IACH;AAAA,IACA,MAAM,QAAuB;AAC3B,YAAM,SAAkB,CAAC;AACzB,YAAM,QAAQ;AAAA,QACZ,MAAM,IAAI,OAAO,SAAS;AACxB,cAAI;AACF,gBAAI,KAAK,KAAM,OAAM,KAAK;AAC1B,kBAAM,KAAK,SAAS,QAAQ;AAAA,UAC9B,SAAS,KAAK;AACZ,mBAAO,KAAK,cAAc,KAAK,UAAU,SAAS,GAAG,CAAC;AAAA,UACxD;AAAA,QACF,CAAC;AAAA,MACH;AACA,UAAI,OAAO,SAAS,EAAG,OAAM,QAAQ,QAAQ,OAAO;AAAA,IACtD;AAAA,EACF;AACF;;;ACxOA,SAAS,kBAAkB;AAC3B,OAAOC,SAAQ;AACf,OAAOC,YAAU;AA6HV,IAAM,sBAAsB;AAC5B,IAAM,+BAA+B;AACrC,IAAM,kCAAkC;AAM/C,SAASC,UAAS,OAAqC;AACrD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAASC,WAAU,KAAsB;AACvC,SAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACxD;AAEA,SAASC,OAAM,OAAgB,MAAM,IAAY;AAC/C,QAAM,OAAO,KAAK,UAAU,KAAK,KAAK,OAAO,KAAK;AAClD,SAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,MAAM,CAAC,CAAC,WAAM;AAC5D;AAEA,SAASC,UAAS,MAAc,UAA0B;AACxD,MAAI,aAAa,GAAI,QAAO;AAC5B,MAAI,SAAS,WAAW,GAAG,EAAG,QAAO,GAAG,IAAI,GAAG,QAAQ;AACvD,SAAO,SAAS,KAAK,WAAW,GAAG,IAAI,IAAI,QAAQ;AACrD;AAEA,SAAS,oBAAoB,OAAe,YAAgC;AAC1E,QAAM,QAAQ,WAAW,CAAC;AAC1B,QAAM,OAAO,WAAW,SAAS,IAAI,MAAM,WAAW,SAAS,CAAC,WAAW;AAC3E,SAAO,GAAG,KAAK,OAAO,MAAM,IAAI,KAAK,MAAM,OAAO,GAAG,IAAI;AAC3D;AAEA,SAAS,MAAM,MAAe,QAAyC;AACrE,MAAI,OAAO;AACX,aAAW,OAAO,QAAQ;AACxB,QAAI,SAAS,UAAa,SAAS,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC5E,WAAO,KAAK,GAAG;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAASC,aAAY,GAAW,GAAmB;AACjD,QAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC;AAC5D,WAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,QAAI,OAAO,IAAI,CAAC;AAChB,QAAI,CAAC,IAAI;AACT,aAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,YAAM,MAAM,IAAI,CAAC;AACjB,UAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;AACpF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,IAAI,EAAE,MAAM;AACrB;AAGA,SAAS,YAAY,OAAeC,QAA6C;AAC/E,MAAI;AACJ,MAAI,YAAY,OAAO;AACvB,aAAW,QAAQA,QAAO;AACxB,UAAM,QAAQD,aAAY,MAAM,YAAY,GAAG,KAAK,YAAY,CAAC;AACjE,QAAI,QAAQ,WAAW;AACrB,kBAAY;AACZ,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,OAAO;AACzE;AAOO,SAAS,oBAAoBE,QAAwB;AAC1D,MAAIA,WAAS,MAAMA,WAAS,SAAU,QAAO,CAAC;AAC9C,QAAM,MAAgB,CAAC;AACvB,MAAI,IAAI;AACR,SAAO,IAAIA,OAAK,QAAQ;AACtB,UAAM,KAAKA,OAAK,CAAC;AACjB,QAAI,OAAO,KAAK;AACd;AAAA,IACF,WAAW,OAAO,KAAK;AACrB,UAAIA,OAAK,IAAI,CAAC,MAAM,KAAK;AACvB,YAAI,IAAI,IAAI;AACZ,eAAO,IAAIA,OAAK,UAAUA,OAAK,CAAC,MAAM,IAAK,MAAKA,OAAK,CAAC,MAAM,OAAO,IAAI;AACvE,YAAI,KAAK,KAAK,MAAMA,OAAK,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAW;AACvD,YAAI,IAAI;AAAA,MACV,OAAO;AACL,cAAM,MAAMA,OAAK,QAAQ,KAAK,CAAC;AAC/B,YAAI,KAAKA,OAAK,MAAM,IAAI,GAAG,QAAQ,KAAK,SAAY,GAAG,CAAC;AACxD,YAAI,QAAQ,KAAKA,OAAK,SAAS,MAAM;AAAA,MACvC;AAAA,IACF,OAAO;AACL,UAAI,IAAI;AACR,aAAO,IAAIA,OAAK,UAAUA,OAAK,CAAC,MAAM,OAAOA,OAAK,CAAC,MAAM,IAAK;AAC9D,UAAI,KAAKA,OAAK,MAAM,GAAG,CAAC,CAAC;AACzB,UAAI;AAAA,IACN;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,UAAU,UAA0C;AAClE,SAAO,SAAS,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,EAAE,QAAQ,MAAM,IAAI,EAAE,QAAQ,OAAO,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE;AAC9F;AAUA,SAAS,gBAAgB,UAA8B;AACrD,MAAI,CAACN,UAAS,QAAQ,EAAG,QAAO;AAChC,QAAM,OAAO,OAAO,KAAK,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,WAAW,GAAG,CAAC;AACvE,SAAO,KAAK,SAAS,KAAK,KAAK,MAAM,CAAC,QAAQ,IAAI,SAAS,GAAG,CAAC;AACjE;AAaO,SAAS,iBAAiB,UAAqB,QAAiC;AACrF,QAAM,QAAoB,CAAC;AAC3B,QAAM,WAAuB,CAAC;AAC9B,QAAM,WAAW,oBAAI,IAAY;AACjC,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAACA,UAAS,KAAK,EAAG;AACtB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,YAAM,GAAG,IAAI;AACb,UAAI,CAACA,UAAS,KAAK,KAAK,OAAO,MAAM,WAAW,SAAU;AAC1D,YAAM,SAAS,MAAM,UAAU,CAAC;AAChC,YAAM,SAAS,MAAM;AACrB,UAAI,CAAC,OAAO,OAAO,UAAU,MAAM,EAAG,UAAS,MAAM,IAAI;AAAA,eAChD,SAAS,IAAI,MAAM,EAAG,CAAC,SAAS,MAAM,EAAkB,KAAK,MAAM;AAAA,WACvE;AACH,iBAAS,MAAM,IAAI,CAAC,SAAS,MAAM,GAAG,MAAM;AAC5C,iBAAS,IAAI,MAAM;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACA,SAAO,gBAAgB,QAAQ,IAAI,WAAW;AAChD;AAEA,SAAS,iBAAiB,UAA6B;AACrD,MAAI,CAACA,UAAS,QAAQ,EAAG,QAAOE,OAAM,QAAQ;AAC9C,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,UAAM,SAASF,UAAS,KAAK,KAAK,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AACpF,UAAM,SAASA,UAAS,KAAK,KAAKA,UAAS,MAAM,MAAM,IAAI,MAAM,SAAS;AAC1E,UAAM,UAAU,OAAO,QAAQ,YAAY,WAAW,IAAI,KAAK,UAAU,OAAO,OAAO,CAAC,KAAK;AAC7F,UAAM,KAAK,GAAG,MAAM,GAAG,OAAO,EAAE;AAAA,EAClC;AACA,SAAO,MAAM,KAAK,IAAI,KAAK;AAC7B;AAoFA,SAAS,mBACP,MACA,WACA,WACyB;AACzB,MAAI,cAAc,MAAO,QAAO;AAChC,MAAIO,UAAS,SAAS,GAAG;AACvB,WAAO,EAAE,GAAG,MAAM,GAAIA,UAAS,SAAS,IAAI,YAAY,CAAC,GAAI,GAAG,UAAU;AAAA,EAC5E;AACA,MAAI,cAAc,MAAO,QAAO;AAChC,SAAO,EAAE,GAAG,MAAM,GAAIA,UAAS,SAAS,IAAI,YAAY,CAAC,EAAG;AAC9D;AAEA,SAAS,WAAW,MAAc,QAAwB;AACxD,SAAO,GAAG,IAAI,KAAK,MAAM;AAC3B;AAEA,SAAS,UAAU,OAA8B;AAC/C,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,GAAI,MAAM,aAAa,SAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,IACnE,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,IACvD,SAAS,MAAM;AAAA,IACf,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,EACzD;AACF;AAGA,SAAS,gBACP,MACA,QACA,OACoB;AACpB,MAAI,SAAS,UAAU,CAAC,SAAS,MAAM,SAAS,KAAK,MAAM,IAAI,MAAM,EAAG,QAAO;AAC/E,QAAMC,SAAQ,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,KAAK;AACrC,QAAM,OAAO,YAAY,QAAQA,MAAK;AACtC,QAAM,QAAQA,OAAM,SAAS,KAAK,GAAGA,OAAM,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,UAAUA,OAAM,KAAK,IAAI;AAC3F,SAAO,SAAS,MAAM,yBAAyB,OAAO,mBAAmB,IAAI,OAAO,GAAG,eAAe,KAAK;AAC7G;AAEA,SAAS,iBAAiB,MAAc,OAAkB,UAAsC;AAC9F,MAAI,MAAM,SAAS,aAAa,MAAM,SAAS,YAAa,QAAO,MAAM;AACzE,MAAI,MAAM,SAAS,QAAQ;AACzB,WAAO,6BAA6B,IAAI,KAAK,MAAM,WAAW,mBAAmB;AAAA,EACnF;AACA,QAAM,OAAO,MAAM,YAAY,MAAM;AACrC,QAAM,QACJ,MAAM,aAAa,UAAa,MAAM,SAAS,SAC3C,IAAI,MAAM,QAAQ,IAAI,MAAM,IAAI,OAChC,SAAS,SACP,IAAI,IAAI,OACR;AACR,QAAM,OACJ,aACC,SAAS,SACN,gCAAgC,KAAK,UAAU,IAAI,CAAC,+CACpD;AACN,SAAO,kBAAkB,IAAI,KAAK,KAAK,GAAG,MAAM,OAAO,KAAK,IAAI;AAClE;AAEA,SAAS,iBAAiB,MAAmB,KAAgB,UAAgC;AAC3F,MAAI,KAAK,iBAAiB,UAAa,CAACD,UAAS,GAAG,KAAK,IAAI,YAAY,KAAM,QAAO,CAAC;AACvF,QAAM,aAAa,IAAI;AACvB,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,SAAS,KAAK,cAAc,UAAU;AACrD,MAAI,OAAO,gBAAgB,QAAW;AACpC,aAAS;AAAA,MACP,yBAAyB,KAAK,IAAI,4BAA4B,OAAO,WAAW;AAAA,IAClF;AACA,WAAO,CAAC;AAAA,EACV;AACA,MAAI,OAAO,GAAI,QAAO,CAAC;AACvB,SAAO,OAAO,OAAO,IAAI,CAAC,WAAW;AAAA,IACnC,MAAME,UAAS,qBAAqB,MAAM,IAAI;AAAA,IAC9C,SAAS,2CAA2C,MAAM,OAAO;AAAA,IACjE,QAAS,QAAQ,YAAY,MAAM,IAAI,KAAK;AAAA,IAC5C,OAAO;AAAA,EACT,EAAE;AACJ;AAEA,eAAe,cACb,SACA,MACA,MACA,QACA,MACkB;AAClB,QAAM,OAAO,KAAK,QAAQ,CAAC;AAC3B,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,QAAQ,SAAS,QAAQ,MAAM,IAAI;AAAA,IAC5C,KAAK;AACH,aAAO,QAAQ,aAAa,QAAQ,IAAI;AAAA,IAC1C,KAAK;AACH,aAAO,QAAQ,qBAAqB,QAAQ,MAAM,IAAI;AAAA,IACxD;AACE,aAAO,QAAQ,UAAU,QAAQ,MAAM,IAAI;AAAA,EAC/C;AACF;AAEA,eAAe,aACb,MACA,WACA,KACyB;AACzB,QAAM,WAAqB,CAAC;AAC5B,QAAM,OAAO,SAAS,IAAI;AAC1B,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,UAAU;AAAA,MACV;AAAA,MACA,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,QACE;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,OAAO,KAAK,IAAI,CAAC;AAChC,QAAM,OAAO,WAAW,MAAM,MAAM;AACpC,QAAM,OAAO,CAAC,UACZ,cAAc,QAAQ,QAAQ,gBAAgB,OAAO,SAAS;AAEhE,QAAM,OAAO,SAAS,SAAS,IAAI,OAAO,IAAI,MAAM,IAAI;AACxD,MAAI,QAAQ,KAAK,gBAAgB,UAAaF,UAAS,KAAK,WAAW,GAAG;AACxE,UAAM,QAAQ,SAAS,KAAK,aAAa,KAAK,QAAQ,CAAC,CAAC;AACxD,QAAI,CAAC,MAAM,MAAM,MAAM,gBAAgB,QAAW;AAChD,YAAM,QAAQ,MAAM,OAAO,CAAC;AAC5B,eAAS;AAAA,QACP,GAAG,IAAI,SAAS,GAAG,IAAI,MAAM,OAAO,EAAE,YAAY,IAAI,kCAAkCE,UAAS,QAAQ,MAAM,IAAI,CAAC,KAAK,MAAM,OAAO;AAAA,MACxI;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAwB,EAAE,WAAW,KAAK,aAAa,IAAI,UAAU;AAC3E,MAAI,KAAK,YAAY,OAAW,UAAS,UAAU,KAAK;AACxD,MAAI,KAAK,UAAU,UAAa,KAAK,UAAU,MAAO,UAAS,QAAQ,KAAK;AAE5E,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,cAAc,IAAI,SAAS,MAAM,MAAM,QAAQ,QAAQ;AAAA,EACzE,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,UAAU,EAAE,OAAO,EAAE,MAAM,UAAU,SAASC,WAAU,GAAG,EAAE,EAAE;AAAA,MAC/D;AAAA,MACA,UAAU,CAAC,EAAE,MAAM,SAAS,QAAQ,kBAAkB,IAAI,KAAKA,WAAU,GAAG,CAAC,IAAI,CAAC;AAAA,IACpF;AAAA,EACF;AAEA,QAAM,WAAsB,CAAC;AAC7B,QAAM,SACJ,QAAQ,kBAAkB,QAAQ,SAAS,mBAAmB,CAAC,QAAQ,QAAQ,IAAI,CAAC;AACtF,MAAI,WAAsB;AAC1B,MAAI;AACJ,MAAI;AAEJ,MAAI,QAAQ,SAAS,kBAAkB;AACrC,eAAW,EAAE,eAAe,KAAK,QAAQ,QAAQ,EAAE;AACnD,oBAAgB,iBAAiB,KAAK,uBAAuB,CAAC,GAAG,MAAM;AACvE,UAAM,qBACJ,KAAK,wBAAwB,UAC7B,KAAK,WAAW,UAChB,KAAK,gBAAgB;AACvB,QAAI,CAAC,oBAAoB;AACvB,YAAM,UAAU,KAAK,UAAU;AAAA,QAC7B,GAAI,KAAK,WAAW,CAAC;AAAA,QACrB,GAAG,eAAe,QAAQ,QAAQ;AAAA,MACpC,CAAC;AACD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,QAAQ,+BAA+B,IAAI,0BAA0B,iBAAiB,QAAQ,QAAQ,CAAC,iCAAiC,OAAO;AAAA,QAC/I,QAAQ,KAAK,QAAQ,QAAQ;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,KAAK,wBAAwB,QAAW;AAC1C,QAAI,OAAO,WAAW,GAAG;AACvB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ,gCAAgC,IAAI;AAAA,QAC5C,UAAU,KAAK;AAAA,MACjB,CAAC;AAAA,IACH,OAAO;AACL,YAAM,OAAO,KAAK,iBAAiB,KAAK,qBAAqB,MAAM,CAAC;AACpE,YAAM,aAAa,WAAW,KAAK,qBAAqB,IAAI;AAC5D,UAAI,WAAW,SAAS,GAAG;AACzB,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ,GAAG,oBAAoB,0BAA0B,UAAU,CAAC,KAAK,IAAI;AAAA,UAC7E;AAAA,UACA,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,eAAe,QAAW;AACjC,QAAI,QAAQ,SAAS,QAAW;AAC9B,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ,sBAAsB,IAAI;AAAA,QAClC,UAAU,KAAK;AAAA,MACjB,CAAC;AAAA,IACH,OAAO;AACL,YAAM,OAAO,KAAK,QAAQ,IAAI;AAC9B,YAAM,aAAa,WAAW,KAAK,YAAY,IAAI;AACnD,UAAI,WAAW,SAAS,GAAG;AACzB,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ,GAAG,oBAAoB,iBAAiB,UAAU,CAAC,KAAK,IAAI;AAAA,UACpE;AAAA,UACA,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,SAAS;AAC5B,UAAM,QAAQ,QAAQ;AACtB,UAAM,OAAO,UAAU,KAAK;AAC5B,eAAW,EAAE,OAAO,KAAK;AACzB,QAAI,KAAK,gBAAgB,QAAW;AAClC,sBAAgB;AAChB,YAAM,WAAW,KAAK;AACtB,YAAM,SAAqB;AAAA,QACzB,GAAI,MAAM,aAAa,UAAa,MAAM,SAAS,SAC/C,EAAE,MAAM,MAAM,YAAY,MAAM,QAAQ,KAAK,IAC7C,CAAC;AAAA,QACL,SAAS,MAAM;AAAA,MACjB;AACA,UAAI,SAAS,SAAS,UAAa,CAAC,iBAAiB,OAAO,SAAS,IAAI,GAAG;AAC1E,cAAM,MACJ,MAAM,aAAa,SACf,IAAI,MAAM,QAAQ,IAAI,MAAM,SAAS,SAAY,KAAK,MAAM,IAAI,MAAM,EAAE,KACxE,MAAM,SAAS,SACb,OAAO,MAAM,IAAI,IACjB,YAAY,MAAM,IAAI;AAC9B,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ,0BAA0B,IAAI,cAAc,KAAK,UAAU,SAAS,IAAI,CAAC,SAAS,GAAG,cAAc,MAAM,OAAO;AAAA,UACxH,YAAY;AAAA,YACV;AAAA,cACE,MAAM;AAAA,cACN,SAAS,YAAY,KAAK,UAAU,SAAS,IAAI,CAAC,SAAS,GAAG;AAAA,cAC9D,UAAU,SAAS;AAAA,cACnB,QAAQ,MAAM,YAAY,MAAM;AAAA,YAClC;AAAA,UACF;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA,UAAI,SAAS,YAAY,QAAW;AAClC,cAAM,aAAa,WAAW,SAAS,SAAsB,MAAM,OAAO;AAC1E,YAAI,WAAW,SAAS,GAAG;AACzB,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,OAAO;AAAA,YACP,QAAQ,6BAA6B,IAAI,KAAK,WAAW,CAAC,EAAE,OAAO;AAAA,YACnE,YAAY,WAAW,IAAI,CAAC,OAAO;AAAA,cACjC,GAAG;AAAA,cACH,MAAM,EAAE,SAAS,WAAW,YAAY,WAAW,EAAE,IAAI;AAAA,YAC3D,EAAE;AAAA,YACF;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,WAAW,MAAM,SAAS,UAAU,QAAQ,WAAW,UAAa,KAAK,WAAW,QAAW;AAE7F,mBAAa,KAAK,QAAQ,MAAM;AAChC,iBAAW;AACX,sBAAgB;AAChB,YAAM,aAAa,WAAW,KAAK,QAAQ,UAAU;AACrD,UAAI,WAAW,SAAS,GAAG;AACzB,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ,GAAG,oBAAoB,sBAAsB,UAAU,CAAC;AAAA,UAChE;AAAA,UACA,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,eAAS,KAAK;AAAA,QACZ,MAAM,MAAM,SAAS,YAAY,YAAY;AAAA,QAC7C,QAAQ,iBAAiB,MAAM,OAAO,gBAAgB,MAAM,QAAQ,IAAI,KAAK,CAAC;AAAA,QAC9E,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF,WAAW,QAAQ,SAAS,UAAU;AACpC,iBAAa,KAAK,QAAQ,MAAM;AAChC,eAAW;AACX,oBAAgB;AAChB,UAAM,MAAM,QAAQ;AACpB,UAAM,eAAeH,UAAS,GAAG,KAAK,IAAI,eAAe;AACzD,UAAM,eACJ,SAAS,UAAU,QAAQ,KAAK,mBAAmB,SAAS,CAAC,eACzD,iBAAiB,MAAM,KAAK,QAAQ,IACpC,CAAC;AACP,QAAI,KAAK,gBAAgB,QAAW;AAClC,YAAM,WACJ,aAAa,SAAS,IAClB,qCAAqC,aAAa,CAAC,EAAE,IAAI,KAAK,aAAa,CAAC,EAAE,QAAQ,QAAQ,6CAA6C,EAAE,CAAC,KAC9I;AACN,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ,wBAAwB,IAAI,2BAA2B,QAAQ;AAAA,QACvE,GAAI,aAAa,SAAS,IAAI,EAAE,YAAY,aAAa,IAAI,CAAC;AAAA,QAC9D,UAAU,KAAK;AAAA,QACf,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,OAAO;AACL,UAAI,aAAa,SAAS,GAAG;AAC3B,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ,GAAG,oBAAoB,2BAA2B,YAAY,CAAC,yBAAyB,IAAI;AAAA,UACpG,YAAY;AAAA,UACZ,QAAQA,UAAS,GAAG,IAAK,IAAI,qBAAqB,OAAQ;AAAA,QAC5D,CAAC;AAAA,MACH;AACA,UAAI,KAAK,WAAW,QAAW;AAC7B,cAAM,aAAa,WAAW,KAAK,QAAQ,UAAU;AACrD,YAAI,WAAW,SAAS,GAAG;AACzB,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,QAAQ,GAAG,oBAAoB,sBAAsB,UAAU,CAAC;AAAA,YAChE;AAAA,YACA,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,YAAY,QAAQ,YAAY,UAAU,UAAU,eAAe,YAAY,SAAS;AACnG;AAEA,SAAS,WAAW,SAAsB,OAAwB;AAChE,QAAM,OAAO,SAAS,QAAQ,IAAI,KAAK;AACvC,QAAM,SAAS,OAAO,QAAQ,KAAK,IAAI,KAAK,GAAG;AAC/C,QAAM,OAAO,QAAQ,KAAK,QAAQ;AAClC,QAAM,OACJ,QAAQ,UAAU,UACd,UAAU,IAAI,KACd,QAAQ,UAAU,aAChB,aAAa,IAAI,KACjB;AACR,SAAO,EAAE,OAAO,MAAM,MAAM,OAAO;AACrC;AAEA,SAASI,WAAU,SAAsB,KAAc,MAA6B;AAClF,QAAM,WAAW,KAAK,OAAO,CAAC,MAAM,EAAE,UAAU,QAAQ,KAAK,EAAE,QAAQ,OAAO,IAAI;AAClF,QAAM,QACJ,QAAQ,UAAU,UACd,eACA,QAAQ,UAAU,aAChB,kBACA;AACR,SAAO,GAAG,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,OAAO,KAAK,QAAQ,KAAK,IAAI,MAAM,EAAE,KAAK,IAAI,IAAI,IAAI,IAAI,MAAM;AAC7G;AAkBA,SAASC,aAAYC,QAAsB;AACzC,SAAOA,WAAS,KAAK,WAAWA;AAClC;AAEA,SAAS,aAAa,OAA2B;AAC/C,SAAO,OAAO,KAAK,KAAK,EACrB,OAAO,CAAC,QAAQ,IAAI,WAAW,GAAG,CAAC,EACnC,KAAK,KAAK;AACf;AAQA,SAAS,UACP,KACA,KACA,KACAA,QACA,SACA,MACA,KACW;AACX,MAAI,WAAW,KAAK,KAAK,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAG,QAAO;AAC3D,QAAM,QAAQD,aAAYC,MAAI;AAC9B,MAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,IAAI,GAAG;AACjD,QAAI,QAAQ,KAAK,EAAE,MAAM,OAAO,KAAK,eAAe,QAAQ,IAAI,CAAC;AACjE,WAAO;AAAA,EACT;AACA,MAAIN,UAAS,GAAG,KAAK,OAAO,OAAO,KAAK,MAAM,GAAG;AAC/C,QAAI,SAAS,OAAO;AAClB,UAAI,SAAS,KAAK,GAAG,KAAK,UAAUO,OAAM,IAAI,MAAM,EAAE,CAAC,GAAG;AAC1D,aAAO,iBAAiB,GAAG;AAAA,IAC7B;AACA,QAAI,QAAQ,KAAK,EAAE,MAAM,OAAO,KAAK,OAAO,QAAQ,OAAO,IAAI,IAAI,EAAE,CAAC;AACtE,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,GAAG,GAAG;AACxB,UAAMN,SAAQD,UAAS,GAAG,IAAI,aAAa,GAAG,IAAI;AAClD,QAAI,SAAS,OAAO;AAClB,UAAI,SAAS,KAAK,GAAG,KAAK,KAAKC,MAAK,GAAG;AACvC,aAAO,iBAAiB,GAAG;AAAA,IAC7B;AACA,QAAI,QAAQ,KAAK,EAAE,MAAM,OAAO,KAAK,WAAW,QAAQA,OAAM,CAAC;AAC/D,WAAO;AAAA,EACT;AACA,MAAID,UAAS,GAAG,KAAKA,UAAS,GAAG,KAAKA,UAAS,GAAG,GAAG;AACnD,UAAM,eAAe,OAAO,IAAI,aAAa,YAAY,IAAI,WAAW;AACxE,UAAM,SAAqB,CAAC;AAC5B,eAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,UAAI,QAAQ,YAAY;AACtB,eAAO,GAAG,IAAI,IAAI,GAAG;AACrB;AAAA,MACF;AACA,YAAM,QAAQ,UAAUM,QAAM,GAAG;AACjC,UAAI,CAAC,OAAO,OAAO,KAAK,GAAG,GAAG;AAE5B,YAAI,WAAW,IAAI,GAAG,KAAK,MAAM,QAAW,EAAE,SAAS,aAAa,CAAC,EAAE,WAAW,GAAG;AACnF,iBAAO,GAAG,IAAI,IAAI,GAAG;AAAA,QACvB;AACA;AAAA,MACF;AACA,aAAO,GAAG,IAAI,UAAU,IAAI,GAAG,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,GAAG,OAAO,cAAc,MAAM,GAAG;AAAA,IAC9F;AACA,QAAI,CAAC,cAAc;AACjB,iBAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,YAAI,CAAC,OAAO,OAAO,KAAK,GAAG,EAAG,QAAO,GAAG,IAAI,iBAAiB,IAAI,GAAG,CAAC;AAAA,MACvE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,GAAG,KAAK,MAAM,QAAQ,GAAG,KAAK,MAAM,QAAQ,GAAG,GAAG;AAClE,WAAO,IAAI;AAAA,MAAI,CAAC,MAAM,MACpB,IAAI,IAAI,SACJ,UAAU,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,MAAM,MAAM,YAAYA,QAAM,CAAC,GAAG,SAAS,MAAM,GAAG,IAChF,iBAAiB,IAAI;AAAA,IAC3B;AAAA,EACF;AACA,SAAO,iBAAiB,GAAG;AAC7B;AAEA,SAAS,cAAc,SAA4B;AACjD,QAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ,aAAa;AAClE,MAAI,aAAa,SAAS,GAAG;AAC3B,WAAO,GAAG,aAAa,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,EACtD;AACA,QAAM,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ,KAAK;AAClD,QAAM,WAAW,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ,SAAS;AAC1D,QAAM,QAAkB,CAAC;AACzB,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,OAAO,SAAS,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI;AACrE,UAAM;AAAA,MACJ,GAAG,IAAI,IAAI,SAAS,WAAW,IAAI,wCAAwC,mCAAmC;AAAA,IAChH;AAAA,EACF;AACA,MAAI,KAAK,SAAS,GAAG;AACnB,UAAM;AAAA,MACJ,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,UAAU,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,IAC/D;AAAA,EACF;AACA,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC,2CAA2C,QAAQ,WAAW,IAAI,OAAO,MAAM;AAC3G;AAWA,SAAS,YACP,KACA,SACA,gBACA,QACA,MACa;AACb,MAAI,IAAI,cAAe,QAAO,EAAE,IAAI,OAAO,KAAK,IAAI,cAAc;AAClE,MAAI,CAAC,IAAI,OAAQ,QAAO,EAAE,IAAI,OAAO,KAAK,kCAAkC;AAC5E,QAAM,UAAU,MAAM,IAAI,QAAQ,CAAC,GAAG,QAAQ,QAAQ,QAAQ,CAAC;AAC/D,MAAI,YAAY,UAAa,WAAW,QAAW;AACjD,WAAO,EAAE,IAAI,OAAO,KAAK,sCAAsC;AAAA,EACjE;AACA,QAAM,MAAkB,EAAE,OAAO,MAAM,SAAS,CAAC,GAAG,UAAU,CAAC,EAAE;AACjE,MAAI,QAAQ,UAAU,SAAS,gBAAgB,QAAQ,IAAI,OAAO,MAAM,GAAG;AAC3E,MAAI,IAAI,QAAQ,SAAS,EAAG,QAAO,EAAE,IAAI,OAAO,KAAK,cAAc,IAAI,OAAO,EAAE;AAChF,SAAO,EAAE,IAAI,MAAM,OAAO,IAAI,OAAO,UAAU,IAAI,UAAU,UAAU,QAAQ;AACjF;AAGA,SAAS,mBAAmB,SAA0B;AACpD,UAAQ,QAAQ,OAAO;AAAA,IACrB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,UAAI,QAAQ,SAAS;AACnB,eAAO;AACT,UAAI,QAAQ,SAAS;AACnB,eAAO;AACT,aAAO;AAAA,EACX;AACF;AAEA,SAAS,SACP,SACA,SACA,WACwB;AACxB,MAAI,CAAC,QAAQ,WAAY,QAAO;AAChC,SAAO,QAAQ,WAAW,IAAI,CAAC,MAAM;AACnC,UAAM,QAAQ,EAAE,SAAS,QAAQ;AACjC,UAAM,UACJ,SAAS,UAAU,sBACf,UAAU,CAAC,GAAG,QAAQ,QAAQ,OAAO,GAAG,oBAAoB,EAAE,IAAI,CAAC,CAAC,IACpE;AACN,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MACzB,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC3C,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACjD;AAAA,EACF,CAAC;AACH;AAMA,eAAsB,YAAY,MAAgB,KAA6C;AAC7F,QAAM,UAAU,YAAY,IAAI;AAChC,QAAM,OAAO,UAAU,IAAI;AAC3B,QAAM,QAAQ,YAAY,IAAI;AAC9B,QAAM,OAAkC,EAAE,GAAI,IAAI,QAAQ,CAAC,EAAG;AAC9D,QAAM,QAAQ,EAAE,MAAM,KAAK,IAAI,IAAI;AACnC,QAAM,eAA8C,CAAC;AACrD,QAAM,UAA+B,CAAC;AACtC,QAAM,WAAqB,CAAC;AAC5B,QAAM,QAA2C,CAAC;AAClD,QAAM,OAAO,IAAI,UAAU;AAC3B,QAAM,QAAQ,IAAI,eAAe;AACjC,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,eAAe;AAEnB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,UAAU,KAAK,CAAC;AACtB,UAAM,MAAM,WAAW,SAAS,CAAC;AACjC,UAAM,QAAQF,WAAU,SAAS,KAAK,IAAI;AAC1C,QAAI,SAAS,QAAQ,UAAU,YAAY;AACzC,YAAM,KAAK,EAAE,MAAM,KAAK,YAAY,GAAG,QAAQ,WAAW,QAAQ,yBAAyB,CAAC;AAC5F;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,aAAO,gBAAgB,QAAQ,MAAM,OAAO,QAAQ,EAAE;AAAA,IACxD,SAAS,KAAK;AACZ,UAAI,QAAQ,UAAU,cAAc,eAAe,oBAAoB;AAErE,cAAMI,UAAS,cAAc,IAAI,WAAW;AAC5C,cAAM,KAAK,EAAE,MAAM,KAAK,YAAY,GAAG,QAAQ,WAAW,QAAAA,QAAO,CAAC;AAClE,YAAI,OAAO;AACT,gBAAM,IAAI,cAAc,GAAG;AAC3B,gBAAM,IAAI,YAAY,KAAK,EAAE,YAAY,GAAG,QAAQ,WAAW,QAAAA,QAAO,CAAC;AAAA,QACzE;AACA;AAAA,MACF;AACA,aAAO,QAAQ;AACf,UAAI,MAAO,OAAM,IAAI,cAAc,GAAG;AACtC,YAAMC,WAAmB,EAAE,MAAM,SAAS,QAAQN,WAAU,GAAG,EAAE;AACjE,UAAI,CAAC,QAAQ,KAAK,gBAAgB,CAAC,MAAO,SAAQ,EAAE,SAAAM,UAAS,OAAO,SAAS,OAAO,EAAE;AACtF,YAAMC,UAAqB;AAC3B,YAAMF,UAAS,QAAQ,KAAK,eACxB,2BAA2BC,SAAQ,MAAM,KACzCA,SAAQ;AACZ,YAAM,KAAK,EAAE,MAAM,KAAK,YAAY,GAAG,QAAAC,SAAQ,QAAAF,QAAO,CAAC;AACvD,UAAI,MAAO,OAAM,IAAI,YAAY,KAAK,EAAE,YAAY,GAAG,QAAAE,SAAQ,QAAAF,QAAO,CAAC;AACvE;AAAA,IACF;AACA,QAAI,MAAO,OAAM,IAAI,cAAc,GAAG;AAEtC,QAAI;AACJ,QAAI;AACF,YAAM,YAAY,mBAAmB,IAAI,WAAW,KAAK,WAAW,QAAQ,KAAK,SAAS;AAC1F,mBAAa,MAAM;AAAA,QACjB,EAAE,GAAG,MAAM,gBAAgB,QAAQ,KAAK,kBAAkB,KAAK,eAAe;AAAA,QAC9E;AAAA,QACA,EAAE,GAAG,KAAK,WAAW,QAAQ,KAAK,aAAa,KAAK,aAAa,IAAI,UAAU;AAAA,MACjF;AAAA,IACF,SAAS,KAAK;AACZ,mBAAa;AAAA,QACX,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,UAAU,CAAC;AAAA,QACX,UAAU,CAAC,EAAE,MAAM,SAAS,QAAQ,iBAAiBL,WAAU,GAAG,CAAC,GAAG,CAAC;AAAA,MACzE;AAAA,IACF;AACA,aAAS,KAAK,GAAG,WAAW,QAAQ;AACpC,iBAAa,KAAK,EAAE,MAAM,KAAK,UAAU,WAAW,UAAU,QAAQ,CAAC;AAGvE,QAAI,UAAU;AACd,UAAM,SAAS,WAAW,SAAS,KAAK,CAAC,MAAM,EAAE,MAAM;AACvD,QAAI,UAAU,KAAK,WAAW,QAAW;AACvC,YAAM,UAAU;AAAA,QACd;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,WAAW;AAAA,QACX,SAAS,QAAQ,QAAQ;AAAA,MAC3B;AACA,UAAI,SAAS,SAAS,QAAQ,MAAM,QAAQ,UAAU,QAAW;AAC/D,gBAAQ,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,QAAQ,QAAQ,GAAG,OAAO,QAAQ,MAAM,CAAC;AAC5E,qBAAa,EAAE,UAAU,QAAQ,UAAU,QAAQ,QAAQ,MAAM;AACjE,YAAI,QAAQ,UAAU,QAAQ;AAC5B,mBAAS;AAAA,YACP,WAAW,IAAI,UAAU,MAAM,GAAG,QAAQ,KAAK,KAAK,MAAM,EAAE,cAAc,QAAQ,SAAS,KAAK,IAAI,CAAC;AAAA,UACvG;AAAA,QACF;AACA,mBAAW,WAAW,WAAW,SAAS,OAAO,CAAC,MAAM,MAAM,MAAM;AACpE,kBAAU;AAAA,MACZ,WAAW,SAAS,OAAO;AACzB,eAAO,SAAS,GAAG,OAAO,MAAM,+BAA+B,QAAQ,GAAG;AAC1E,0BAAkB,QAAQ;AAAA,MAC5B,WAAW,OAAO;AAChB,eAAO,SAAS,QAAQ,KACpB,GAAG,OAAO,MAAM,4CAChB,GAAG,OAAO,MAAM,mCAAmC,QAAQ,GAAG;AAAA,MACpE;AAAA,IACF;AAGA,QAAI,WAAW,SAAS,WAAW,KAAK,QAAQ,KAAK,SAAS;AAC5D,iBAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,QAAQ,KAAK,OAAO,GAAG;AACjE,cAAM,QAAQ,QAAQ,WAAW,eAAe,MAAM;AACtD,YAAI,UAAU,QAAW;AACvB,gBAAM,OAAOH,UAAS,WAAW,aAAa,IAC1C,OAAO,KAAK,WAAW,aAAa,EAAE,KAAK,IAAI,IAC/C;AACJ,qBAAW,SAAS,KAAK;AAAA,YACvB,MAAM;AAAA,YACN,QAAQ,qBAAqBE,UAAS,QAAQ,MAAM,UAAU,WAAW,IAAI,EAAE,CAAC,iBAAiB,MAAM,oCAAoC,QAAQ,MAAM;AAAA,YACzJ,QAAQ,WAAW;AAAA,UACrB,CAAC;AACD;AAAA,QACF;AACA,aAAK,IAAI,IAAI;AAAA,MACf;AAAA,IACF;AAGA,UAAM,aAAa,QAAQ,QAAQ,KAAK,WAAW;AACnD,QACE,WAAW,SAAS,WAAW,KAC/B,eAAe,UACf,WAAW,aAAa,YACxB;AACA,iBAAW,SAAS,KAAK;AAAA,QACvB,MAAM;AAAA,QACN,QAAQ,sBAAsB,KAAK,UAAU,WAAW,UAAU,cAAc,UAAU;AAAA,QAC1F,QAAQ,EAAE,UAAU,YAAY,UAAU,WAAW,WAAW;AAAA,MAClE,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,UAAU,WAAY,iBAAgB,WAAW;AAE7D,QAAI,SAAqB,UAAU,YAAY;AAC/C,QAAI;AACJ,UAAM,UAAU,WAAW,SAAS,CAAC;AACrC,QAAI,SAAS;AACX,eAAS;AACT,UAAI,QAAQ,KAAK,cAAc;AAE7B,iBAAS,2BAA2B,QAAQ,MAAM;AAClD,YAAI,QAAQ,UAAU,YAAY;AAChC,mBAAS;AAAA,YACP,GAAG,IAAI,UAAU,MAAM,GAAG,QAAQ,KAAK,KAAK,MAAM,EAAE,gDAAgD,QAAQ,MAAM;AAAA,UACpH;AAAA,QACF;AAAA,MACF,OAAO;AACL,iBAAS,QAAQ;AACjB,YAAI,CAAC,MAAO,SAAQ,EAAE,SAAS,OAAO,SAAS,OAAO,EAAE;AAAA,MAC1D;AAAA,IACF;AACA,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,YAAY,WAAW;AAAA,MACvB;AAAA,MACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC7B,CAAC;AACD,QAAI,OAAO;AACT,YAAM,IAAI,YAAY,KAAK;AAAA,QACzB,YAAY,WAAW;AAAA,QACvB;AAAA,QACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,aAAa,KAAK,YAAY,IAAI;AACxC,MAAI,CAAC,SAAS,eAAe,UAAa,eAAe,YAAY;AACnE,YAAQ;AAAA,MACN,SAAS;AAAA,QACP,MAAM;AAAA,QACN,QAAQ,oCAAoC,YAAY,cAAc,UAAU;AAAA,QAChF,QAAQ,EAAE,UAAU,YAAY,UAAU,aAAa;AAAA,MACzD;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,aAAa,KAAK,MAAM,YAAY,IAAI,IAAI,OAAO;AACzD,QAAM,UAAuB;AAAA,IAC3B,QAAQ,QAAQ,WAAW,QAAQ,SAAS,IAAI,YAAY;AAAA,IAC5D;AAAA,EACF;AACA,MAAI,OAAO;AACT,UAAM,IAAI,MAAM;AAChB,YAAQ,SAAS,SAAS,MAAM,QAAQ,GAAG,MAAM,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE;AAC1E,YAAQ,YAAY,EAAE;AACtB,UAAM,aAAa,MAAM,UACrB,SAAS,GAAG,MAAM,SAAS,QAAQ,MAAM,QAAQ,MAAS,IAC1D,EAAE;AACN,QAAI,WAAY,SAAQ,aAAa;AACrC,QAAI,EAAE,aAAa,OAAW,SAAQ,WAAW,EAAE;AACnD,QAAI,EAAE,WAAW,OAAW,SAAQ,SAAS,EAAE;AAC/C,QAAI,EAAE,OAAQ,SAAQ,SAAS,EAAE;AACjC,QAAI,SAAS,OAAO;AAClB,YAAM,MAAM,EAAE,SAAS,gBAAgB,mBAAmB,CAAC;AAC3D,UAAI,IAAK,SAAQ,gBAAgB,EAAE,QAAQ,IAAI;AAAA,IACjD;AAAA,EACF,WAAW,UAAU;AACnB,QAAI,SAAS,aAAa,OAAW,SAAQ,WAAW,SAAS;AACjE,QAAI,SAAS,WAAW,OAAW,SAAQ,SAAS,SAAS;AAAA,EAC/D;AACA,MAAI,MAAO,SAAQ,QAAQ;AAC3B,SAAO,EAAE,SAAS,cAAc,SAAS,UAAU,KAAK;AAC1D;AAGO,SAAS,aAAa,MAA2C;AACtE,QAAM,QAAQ,mBAAmB,KAAK,QAAQ,EAAE;AAChD,SAAO,QAAQ,MAAM,CAAC,IAAI;AAC5B;AAGO,SAAS,aAAa,QAAoB,SAAoC;AACnF,MAAI,CAAC,OAAO,UAAU,QAAQ,WAAW,EAAG;AAC5C,QAAMS,SAAQ,gBAAgB,OAAO,MAAM;AAC3C,aAAW,UAAU,QAAS,OAAMA,QAAO,OAAO,QAAQ,OAAO,KAAK;AACtE,QAAM,MAAM,OAAO,MAAM,SAAS,MAAM,IAAI,SAAS;AACrD,QAAMC,QAAO,KAAK,UAAUD,QAAO,MAAM,aAAa,OAAO,IAAI,CAAC,EAAE,QAAQ,OAAO,GAAG;AACtF,EAAAE,IAAG,cAAc,OAAO,MAAM,GAAGD,KAAI,GAAG,GAAG,IAAI,MAAM;AACrD,SAAO,SAASD;AAChB,SAAO,OAAO,GAAGC,KAAI,GAAG,GAAG;AAC7B;AAWO,SAAS,UAAU,QAAwB;AAChD,QAAM,OAAO,OAAO,YAAY,GAAG;AACnC,QAAM,OAAO,SAAS,KAAK,SAAS,OAAO,MAAM,GAAG,IAAI;AACxD,QAAM,MAAM,SAAS,KAAK,SAAY,OAAO,MAAM,OAAO,CAAC;AAC3D,QAAM,SAAS,MAAM,OAAO,GAAG,KAAK;AACpC,MAAI,qBAAqB,KAAK,IAAI,GAAG;AACnC,UAAM,QAAQ,KAAK,MAAM,OAAO,EAAE,IAAI,KAAK,QACxC,QAAQ,cAAc,EAAE,EACxB,QAAQ,YAAY,GAAG;AAC1B,UAAM,SAAS,WAAW,MAAM,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC;AACvE,WAAO,aAAa,QAAQ,MAAM,IAAI,MAAM,GAAG,MAAM;AAAA,EACvD;AACA,QAAM,OAAO,KACV,QAAQ,cAAc,EAAE,EACxB,MAAM,GAAG,EACT,OAAO,CAACE,aAAYA,aAAY,MAAMA,aAAY,GAAG,EACrD,IAAI,CAACA,aAAaA,aAAY,OAAO,QAAQA,SAAQ,QAAQ,iBAAiB,GAAG,CAAE,EACnF,KAAK,GAAG;AACX,SAAO,GAAG,QAAQ,MAAM,GAAG,MAAM;AACnC;AA0BA,SAAS,QAAQ,SAAsE;AACrF,QAAM,QAAS,QACZ;AACH,MAAI,CAAC,SAAS,OAAO,MAAM,UAAU,SAAU,QAAO;AACtD,QAAM,SAAS,MAAM,QAAQ,MAAM,MAAM,IACrC,MAAM,OAAO,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAC7D,CAAC;AACL,SAAO,EAAE,OAAO,MAAM,OAAO,OAAO;AACtC;AAOO,IAAM,SAAN,MAAa;AAAA,EACT;AAAA,EACD;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACD,UAAyD,CAAC;AAAA,EAC1D,SAAyB,CAAC;AAAA,EAC1B,YAA8B,CAAC;AAAA,EAC/B,WAAqB,CAAC;AAAA,EACtB,WAAW,oBAAI,IAAY;AAAA;AAAA,EAE3B,mBAAmB,oBAAI,IAAY;AAAA,EAC5C,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV;AAAA;AAAA,EAES,mBAAmB,oBAAI,IAA0B;AAAA,EAElE,YAAY,SAAwB;AAClC,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA,EAGA,MAAM,MAAuB;AAC3B,YAAQ,MAAM,KAAK,QAAQ,GAAG;AAAA,EAChC;AAAA,EAEA,MAAM,UAA8B;AAClC,UAAM,OAAO,KAAK;AAClB,SAAK,UAAU,eAAe,IAAI;AAClC,SAAK,MAAM;AAAA,MACT,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK,UAAU;AAAA,MACvB,QAAQ,KAAK,UAAU;AAAA,MACvB,QAAQ,KAAK,WAAW,CAAC,SAAS,QAAQ,IAAI,IAAI;AAAA,MAClD,QAAQ,KAAK,WAAW,CAAC,SAAS,QAAQ,MAAM,IAAI;AAAA,IACtD;AACA,UAAM,YAAY;AAAA;AAAA,MAEhB,GAAG,gBAAgB,KAAK,aAAa,CAAC,SAAS,GAAG,KAAK,GAAG;AAAA,MAC1D,GAAI,KAAK,kBAAkB,CAAC;AAAA,IAC9B;AACA,SAAK,WAAW,OAAO,SAAS;AAChC,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,SAAS;AAAA,IACpC,UAAE;AACA,UAAI;AACF,cAAM,KAAK,SAAS,QAAQ;AAAA,MAC9B,SAAS,KAAK;AACZ,aAAK,IAAI,OAAO,aAAaX,WAAU,GAAG,CAAC,EAAE;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,KAAK,OAAgC;AACjD,QAAI,MAAM,SAAS,UAAW,MAAK,SAAS,KAAK,MAAM,OAAO;AAC9D,QAAI,MAAM,SAAS,QAAS,MAAK,OAAO,KAAK,MAAM,OAAO;AAC1D,QAAI,MAAM,SAAS,WAAY,MAAK,QAAQ,KAAK,EAAE,KAAK,MAAM,MAAM,SAAS,MAAM,QAAQ,CAAC;AAC5F,QAAI;AACF,YAAM,KAAK,SAAS,QAAQ,KAAK;AAAA,IACnC,SAAS,KAAK;AACZ,WAAK,IAAI,OAAO,aAAaA,WAAU,GAAG,CAAC,EAAE;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAc,KAAK,SAAgC;AACjD,QAAI,KAAK,SAAS,SAAS,OAAO,EAAG;AACrC,UAAM,KAAK,KAAK,EAAE,MAAM,WAAW,QAAQ,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAc,OAAO,WAAuC;AAC1D,UAAM,OAAO,KAAK;AAClB,UAAM,SAAS,MAAM,UAAU;AAAA,MAC7B,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,eAAe,KAAK;AAAA,MACpB,SAAS,OAAO,KAAK,KAAK,OAAO;AAAA,MACjC,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,MACV,UAAU,KAAK;AAAA,MACf,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,IACd,CAAC;AAED,QAAI,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,UAAU,CAAC,CAAC;AACrD,UAAM,aAAa,KAAK,UAAU,KAAK;AACvC,UAAM,gBAAgB,cAAc,SAAS;AAC7C,QAAI,cAAe,UAAS;AAC5B,UAAM,OAAkB,CAAC;AACzB,aAAS,IAAI,GAAG,KAAK,QAAQ,KAAK;AAChC,iBAAW,KAAK,OAAO,OAAO;AAC5B,aAAK,KAAK,EAAE,QAAQ,GAAG,KAAK,SAAS,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC;AAAA,MACzF;AAAA,IACF;AACA,eAAW,KAAK,OAAO,MAAO,KAAI,EAAE,IAAI,MAAO,MAAK,SAAS,IAAI,EAAE,IAAI,EAAE;AAEzE,UAAM,UAAU,KAAK,aAAa,OAAO,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,MAAM,CAAC;AACvE,UAAM,KAAK,KAAK;AAAA,MACd,MAAM;AAAA,MACN,YAAY,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,MACA,GAAI,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,MAC/B,GAAI,KAAK,SAAS,KAAK,MAAM,QAAQ,IACjC,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,MAAM,EAAE,IAC9D,CAAC;AAAA,IACP,CAAC;AACD,eAAW,WAAW,OAAO,SAAU,OAAM,KAAK,KAAK,OAAO;AAC9D,QAAI,OAAO,WAAW,QAAQ;AAC5B,YAAM,QAAQ,OAAO,UAAU,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AACpD,YAAM,OAAO,OAAO,UAAU,SAAS,IAAI,MAAM,OAAO,UAAU,SAAS,CAAC,UAAU;AACrF,OAAC,KAAK,QAAQ,KAAK,IAAI;AAAA,QACtB,iBAAiB,OAAO,UAAU,MAAM,iEAAiE,KAAK,GAAG,IAAI;AAAA,MACvH;AAAA,IACF;AAEA,QAAI,eAAe;AACjB,YAAM,KAAK,KAAK,6EAA6E;AAAA,IAC/F;AAEA,QAAI,OAAO,MAAM,WAAW,GAAG;AAC7B,YAAM,UAAU;AAAA,QACd,KAAK,MAAM,SAAS,SAAS,KAAK,KAAK,KAAK,GAAG,CAAC,KAAK;AAAA,QACrD,KAAK,aAAa,SAAS,iBAAiB,KAAK,YAAY,KAAK,GAAG,CAAC,KAAK;AAAA,QAC3E,KAAK,OAAO,UAAU,KAAK,IAAI,KAAK;AAAA,QACpC,KAAK,QAAQ,WAAW,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,KAAK;AAAA,MACnE,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AACX,YAAM,UACJ,OAAO,YAAY,IACf,gCAAgC,KAAK,MAAM,KAAK,IAAI,CAAC,UAAU,KAAK,OAAO,8DAC3E,qCAAqC,OAAO,MAAM,OAAO,OAAO;AAEtE,UAAI,KAAK,WAAY,OAAM,KAAK,KAAK,OAAO;AAAA,UACvC,MAAK,IAAI,OAAO,UAAU,OAAO,EAAE;AACxC,aAAO,KAAK,OAAO,WAAW,KAAK,YAAY,MAAM;AAAA,IACvD;AAEA,eAAW,UAAU,SAAS;AAC5B,UAAI,KAAK,QAAS;AAClB,YAAM,KAAK;AAAA,QACT;AAAA,QACA,KAAK,OAAO,CAAC,QAAQ,IAAI,IAAI,WAAW,MAAM;AAAA,MAChD;AAAA,IACF;AAEA,QAAI,KAAK,SAAU,OAAM,KAAK,cAAc,KAAK,QAAQ;AACzD,WAAO,KAAK,OAAO,WAAW,QAAW,MAAM;AAAA,EACjD;AAAA,EAEQ,aAAaF,QAA2B;AAC9C,UAAM,SAAS,CAAC,GAAG,IAAI,IAAIA,MAAK,CAAC;AACjC,UAAM,YAAY,KAAK,QAAQ;AAC/B,WAAO,OAAO;AAAA,MAAK,CAAC,GAAG,MACrB,MAAM,YAAY,KAAK,MAAM,YAAY,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,YAAY,QAA+B;AACvD,WAAO,UAAU;AACjB,WAAO,aAAa;AACpB,QAAI;AACF,aAAO,UAAU,MAAM,WAAW,MAAM,OAAO,QAAQ;AAAA,QACrD,WAAW,KAAK,QAAQ;AAAA,QACxB,QAAQ,KAAK,QAAQ,gBAAgB;AAAA,QACrC,YAAY,CAAC,UAAU;AACrB,iBAAO,OAAO,KAAK,KAAK;AAAA,QAC1B;AAAA,MACF,CAAC;AACD,YAAM,UAAU,KAAK,iBAAiB,IAAI,OAAO,MAAM,KAAK,CAAC;AAC7D,cAAQ,KAAK,OAAO,OAAO;AAC3B,WAAK,iBAAiB,IAAI,OAAO,QAAQ,OAAO;AAAA,IAClD,SAAS,KAAK;AACZ,aAAO,aAAa,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACtE,UAAI,eAAe,qBAAqB,IAAI,SAAS,SAAU,MAAK,UAAU;AAAA,IAChF;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,QAAgB,MAAgC;AACtE,UAAM,OAAO,KAAK;AAClB,UAAM,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,SAAS,CAAC,IAAI,OAAO,IAAI;AAC3E,UAAM,QAAQ,CAAC,GAAG,IAAI;AACtB,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,MAAM,SAAS,KAAK,CAAC,KAAK,QAAS,OAAM,KAAK,aAAa,MAAM,MAAM,CAAY;AAC1F;AAAA,IACF;AAEA,UAAM,SAAS,oBAAoB,MAAM,MAAM;AAC/C,UAAMc,SAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,KAAK,eAAe,CAAC,GAAG,SAAS,MAAM,CAAC;AACtF,UAAM,UAAoB,MAAM,KAAK,EAAE,QAAQA,OAAM,GAAG,CAAC,GAAG,WAAW;AAAA,MACrE;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,CAAC;AAAA,IACT,EAAE;AACF,UAAM,QAAQ,IAAI,QAAQ,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC;AACzD,UAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO;AAC/C,UAAM,QAAqB,CAAC;AAE5B,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,QAAQ,QAAQ,CAAC,EAAE,cAAc,IAAI,MAAM,WAAW,MAAM,oBAAoB;AACtF,YAAM,KAAK,KAAK,WAAW,MAAM,sBAAsB,MAAM,OAAO,EAAE;AACtE,aAAO,MAAM,SAAS,KAAK,CAAC,KAAK,SAAS;AACxC,cAAM,KAAK,aAAa,MAAM,MAAM,GAAc,MAAM,OAAO;AAAA,MACjE;AACA;AAAA,IACF;AAEA,UAAM,UAAU,QAAQ,CAAC,EAAE;AAC3B,QAAI;AACF,YAAM,OAAO,MAAM,QAAQ,SAAS;AACpC,YAAM,KAAK,KAAK;AAAA,QACd,MAAM;AAAA,QACN;AAAA,QACA,KAAK,QAAQ;AAAA,QACb,iBAAiB,QAAQ,mBAAmB,KAAK;AAAA,QACjD,GAAI,KAAK,aACL;AAAA,UACE,YAAY;AAAA,YACV,GAAI,OAAO,KAAK,WAAW,SAAS,WAAW,EAAE,MAAM,KAAK,WAAW,KAAK,IAAI,CAAC;AAAA,YACjF,GAAI,OAAO,KAAK,WAAW,YAAY,WACnC,EAAE,SAAS,KAAK,WAAW,QAAQ,IACnC,CAAC;AAAA,UACP;AAAA,QACF,IACA,CAAC;AAAA,MACP,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,KAAK,KAAK;AAAA,QACd,MAAM;AAAA,QACN;AAAA,QACA,KAAK,QAAQ;AAAA,QACb,iBAAiB,QAAQ;AAAA,MAC3B,CAAC;AACD,YAAM,KAAK,KAAK,8BAA8B,MAAM,MAAMZ,WAAU,GAAG,CAAC,EAAE;AAAA,IAC5E;AAEA,UAAM,WAAW,MAAM,KAAK,eAAe,QAAQ,OAAO;AAC1D,QAAI,KAAK,MAAO,OAAM,KAAK,gBAAgB,QAAQ,SAAS,QAAQ;AACpE,UAAM,QAAQ,MAAM,KAAK,gBAAgB,QAAQ,SAAS,QAAQ;AAGlE,eAAW,UAAU,QAAS,OAAM,KAAK,WAAW,QAAQ,KAAK;AAEjE,UAAM,QAAQ,IAAI,QAAQ,IAAI,CAAC,WAAW,KAAK,WAAW,QAAQ,OAAO,KAAK,CAAC,CAAC;AAEhF,eAAW,UAAU,SAAS;AAC5B,UAAI,OAAO,WAAW,CAAC,OAAO,QAAQ,OAAQ,OAAM,KAAK,cAAc,QAAQ,KAAK;AACpF,YAAM,OAAO,SAAS,MAAM;AAAA,IAC9B;AACA,UAAM,KAAK,gBAAgB,MAAM;AACjC,UAAM,KAAK,KAAK,EAAE,MAAM,eAAe,OAAO,CAAC;AAAA,EACjD;AAAA;AAAA,EAGA,MAAc,gBAAgB,QAA+B;AAC3D,QAAI,QAAQ;AACZ,UAAM,SAAmB,CAAC;AAC1B,eAAW,WAAW,KAAK,iBAAiB,IAAI,MAAM,KAAK,CAAC,GAAG;AAC7D,YAAM,QAAQ,QAAQ,OAAO;AAC7B,UAAI,CAAC,MAAO;AACZ,eAAS,MAAM;AACf,aAAO,KAAK,GAAG,MAAM,MAAM;AAAA,IAC7B;AACA,QAAI,UAAU,EAAG;AACjB,UAAM,QAAQ,OACX,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,SAAS,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,WAAM,CAAC,CAAC,EACnE,KAAK,IAAI;AACZ,UAAM,KAAK;AAAA,MACT,WAAW,MAAM,WAAW,KAAK,kCAAkC,QAAQ,UAAU,KAAK,MAAM,EAAE;AAAA,IACpG;AAAA,EACF;AAAA,EAEA,MAAc,gBACZ,QACA,SACA,UACmC;AACnC,QAAI;AACF,YAAM,QAAQ,UAAU,iBAAiB,CAAC,KAAM,MAAM,QAAQ,UAAU;AACxE,aAAO,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC;AAAA,IACvD,SAAS,KAAK;AACZ,YAAM,KAAK;AAAA,QACT,yBAAyB,MAAM,MAAMA,WAAU,GAAG,CAAC;AAAA,MACrD;AACA,aAAO,oBAAI,IAAI;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,QAAgB,OAAmC;AAC1E,UAAM,QAAQ,KAAK,QAAQ,OAAO;AAClC,QAAI,CAAC,OAAO,UAAU,CAAC,OAAO,QAAS;AACvC,UAAM,YAAY,MAAM;AAAA,MACtB,EAAE,MAAM,eAAe,OAAO,MAAM;AAAA,MACpC,KAAK,eAAe,QAAQ,OAAO,KAAK;AAAA,IAC1C;AACA,eAAW,WAAW,UAAU,SAAU,OAAM,KAAK,KAAK,OAAO;AACjE,QAAI,UAAU,QAAQ,WAAW,UAAU;AACzC,aAAO,aAAa,IAAI,MAAM,uBAAuB,UAAU,QAAQ,MAAM,EAAE;AAC/E,YAAM,OAAO,QAAQ,MAAM;AAC3B,aAAO,UAAU;AACjB,YAAM,KAAK,KAAK,0BAA0B,OAAO,MAAM,MAAM,UAAU,QAAQ,MAAM,EAAE;AACvF;AAAA,IACF;AACA,WAAO,OAAO,UAAU;AAAA,EAC1B;AAAA,EAEA,MAAc,cAAc,QAAgB,OAAmC;AAC7E,UAAM,WAAW,KAAK,QAAQ,OAAO;AACrC,QAAI,CAAC,UAAU,UAAU,CAAC,OAAO,QAAS;AAC1C,UAAM,YAAY,MAAM;AAAA,MACtB,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,MAC1C,KAAK,eAAe,QAAQ,OAAO,KAAK;AAAA,IAC1C;AACA,QAAI,UAAU,QAAQ,WAAW,UAAU;AACzC,YAAM,KAAK,KAAK,6BAA6B,OAAO,MAAM,MAAM,UAAU,QAAQ,MAAM,EAAE;AAAA,IAC5F;AAAA,EACF;AAAA,EAEQ,eACN,QACA,OACA,QACA,QACA,KACgB;AAChB,UAAM,OAAO,KAAK;AAClB,WAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,WAAW,KAAK,aAAa;AAAA,MAC7B,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,OAAO,MAAM;AAAA,MACb,MAAM,OAAO;AAAA,MACb,KAAK,KAAK;AAAA,MACV;AAAA,MACA,QAAQ,QAAQ;AAAA,MAChB,QAAQ,MAAM,WAAW,IAAI,EAAE,IAAI;AAAA,MACnC,GAAI,MACA;AAAA,QACE,aAAa,CAAC,SAAkB,KAAK,KAAK,EAAE,MAAM,cAAc,MAAM,KAAK,KAAK,CAAC;AAAA,QACjF,WAAW,CAAC,MAAe,WACzB,KAAK,KAAK,EAAE,MAAM,YAAY,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC;AAAA,MAC9D,IACA,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,QAAgB,OAAkB,OAAmC;AAC5F,WAAO,CAAC,KAAK,SAAS;AACpB,YAAM,MAAM,MAAM,MAAM;AACxB,UAAI,CAAC,IAAK;AACV,UAAI,IAAI,OAAO,SAAS,IAAI,OAAO,MAAM;AACvC,cAAM,KAAK,aAAa,GAAG;AAC3B;AAAA,MACF;AACA,UAAI,CAAC,OAAO,WAAW,OAAO,QAAQ,QAAQ;AAC5C,YAAI,OAAO,QAAS,OAAM,OAAO,QAAQ,MAAM;AAC/C,cAAM,KAAK,YAAY,MAAM;AAC7B,YAAI,OAAO,QAAS,OAAM,KAAK,WAAW,QAAQ,KAAK;AAAA,MACzD;AACA,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,KAAK;AAAA,UACT;AAAA,UACA,WAAW,OAAO,MAAM,qBAAqB,OAAO,YAAY,WAAW,eAAe;AAAA,QAC5F;AACA;AAAA,MACF;AACA,YAAM,KAAK,QAAQ,QAAQ,KAAK,KAAK;AAAA,IACvC;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,aAAa,KAAc,aAAqC;AAC5E,UAAM,KAAK,KAAK,EAAE,MAAM,cAAc,MAAM,IAAI,IAAI,CAAC;AACrD,QAAI;AACJ,QAAI,IAAI,OAAO,OAAO;AACpB,gBAAU;AAAA,QACR,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,QAAQ,IAAI,OAAO;AAAA,QACnB,GAAI,KAAK,QAAQ,UAAU,KAAK,QAAQ,YACpC,EAAE,eAAe,EAAE,QAAQ,4CAA4C,EAAE,IACzE,CAAC;AAAA,MACP;AAAA,IACF,WAAW,IAAI,OAAO,MAAM;AAC1B,gBAAU,EAAE,QAAQ,WAAW,YAAY,GAAG,QAAQ,IAAI,OAAO,KAAK;AAAA,IACxE,OAAO;AACL,gBAAU;AAAA,QACR,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,QAAQ,eAAe;AAAA,MACzB;AAAA,IACF;AACA,UAAM,KAAK,KAAK,EAAE,MAAM,YAAY,MAAM,IAAI,KAAK,QAAQ,CAAC;AAC5D,QAAI,QAAQ,WAAW,YAAY,KAAK,QAAQ,SAAU,MAAK,UAAU;AAAA,EAC3E;AAAA,EAEA,MAAc,QAAQ,QAAgB,KAAc,OAAmC;AACrF,UAAM,OAAO,KAAK;AAClB,UAAM,EAAE,QAAQ,IAAI,IAAI;AACxB,UAAM,KAAK,KAAK,EAAE,MAAM,cAAc,MAAM,IAAI,CAAC;AACjD,UAAM,SACJ,KAAK,UAAU,KAAK,YAAa,KAAK,YAAY,QAAQ,YAAa;AACzE,UAAM,gBACJ,OAAO,SAAS,UAAa,oBAAoB,OAAO,IAAI,IACxD,qEACA;AACN,WAAO,QAAQ,CAAC;AAChB,UAAM,YAAY,MAAM,YAAY,OAAO,MAAkB;AAAA,MAC3D,GAAG,KAAK,eAAe,QAAQ,OAAO,QAAQ,QAAQ,GAAG;AAAA,MACzD,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,IAC3C,CAAC;AACD,QAAI,WAAW,SAAS,UAAU,QAAQ,eAAe;AACvD,YAAM,KAAK,KAAK,gBAAgB,OAAO,IAAI,EAAE,KAAK,UAAU,QAAQ,cAAc,MAAM,GAAG;AAAA,IAC7F;AACA,UAAM,QAAQ,OAAO;AACrB,WAAO,QAAQ;AACf,eAAW,WAAW,UAAU,SAAU,OAAM,KAAK,KAAK,OAAO;AAEjE,UAAM,UAAU,UAAU;AAC1B,QAAI,UAAU,QAAQ,SAAS,GAAG;AAChC,UAAI;AACF,qBAAa,QAAQ,UAAU,OAAO;AAAA,MACxC,SAAS,KAAK;AACZ,gBAAQ,SAAS;AACjB,gBAAQ,YAAY;AACpB,gBAAQ,SAAS,yCAAyC,OAAO,IAAI,EAAE,KAAKA,WAAU,GAAG,CAAC;AAAA,MAC5F;AAAA,IACF;AACA,QAAI,KAAK,SAAS,QAAQ,WAAW,UAAU;AAC7C,aAAO,OAAO,SAAS,KAAK,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,IAC1D;AACA,UAAM,KAAK,KAAK,EAAE,MAAM,YAAY,MAAM,KAAK,QAAQ,CAAC;AACxD,QAAI,QAAQ,WAAW,YAAY,KAAK,SAAU,MAAK,UAAU;AAAA,EACnE;AAAA,EAEQ,WACN,KACAa,UAC6C;AAC7C,UAAM,OAAOV,OAAK;AAAA,MAChB,cAAc,KAAK,SAAS,KAAK,IAAI,MAAM;AAAA,MAC3C;AAAA,MACA,UAAU,IAAI,EAAE;AAAA,IAClB;AACA,UAAM,MAAmD,CAAC;AAC1D,QAAI;AACF,MAAAO,IAAG,UAAUP,OAAK,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,YAAM,WAAWU,SAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ,QAAQ;AACzD,YAAM,YAAY,GAAG,IAAI;AACzB,MAAAH,IAAG;AAAA,QACD;AAAA,QACA,SAAS,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,KAAK,SAAS,SAAS,OAAO;AAAA,QAC9E;AAAA,MACF;AACA,UAAI,YAAY;AAChB,YAAM,SAASG,SACZ,OAAO,CAAC,MAAM,EAAE,QAAQ,QAAQ,EAChC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,EACvB,KAAK,EAAE;AACV,YAAM,aAAa,GAAG,IAAI;AAC1B,UAAI,QAAQ;AACV,QAAAH,IAAG,cAAc,YAAY,QAAQ,MAAM;AAC3C,YAAI,aAAa;AAAA,MACnB,WAAWA,IAAG,WAAW,UAAU,GAAG;AACpC,QAAAA,IAAG,OAAO,UAAU;AAAA,MACtB;AAAA,IACF,SAAS,KAAK;AACZ,WAAK,KAAK,KAAK,iCAAiC,IAAI,EAAE,KAAKV,WAAU,GAAG,CAAC,EAAE;AAAA,IAC7E;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,eACZ,QACA,SACuC;AACvC,UAAM,OAAO,KAAK;AAClB,UAAM,OAAO,KAAK,iBAAiB;AACnC,UAAM,OAAO,gBAAgB,EAAE,GAAG,MAAM,SAAS,KAAK,QAAQ,GAAG,MAAM;AACvE,UAAM,SAAS,QAAQU,IAAG,WAAW,IAAI;AACzC,QAAI,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,QAAQ,KAAK,iBAAiB;AAC5D,UAAI,KAAM,OAAM,KAAK,YAAY,QAAQ,IAAI;AAC7C,aAAO;AAAA,IACT;AAEA,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,gBAAgB,SAAS,EAAE,kBAAkB,KAAK,QAAQ,IAAI,EAAE,CAAC;AAAA,IACpF,SAAS,KAAK;AACZ,UAAI,QAAQ;AACV,aAAK,UAAU,KAAK,EAAE,QAAQ,MAAM,MAAM,QAAQ,SAAS,SAASV,WAAU,GAAG,EAAE,CAAC;AACpF,cAAM,KAAK,KAAK;AAAA,UACd,MAAM;AAAA,UACN,MAAM;AAAA,UACN;AAAA,UACA,SAAS,sCAAsCA,WAAU,GAAG,CAAC;AAAA,UAC7D,MAAM,EAAE,OAAOA,WAAU,GAAG,EAAE;AAAA,QAChC,CAAC;AAAA,MACH,OAAO;AACL,cAAM,KAAK,KAAK,0CAA0C,MAAM,MAAMA,WAAU,GAAG,CAAC,EAAE;AAAA,MACxF;AACA,aAAO;AAAA,IACT;AACA,QAAI,CAAC,KAAM,QAAO;AAElB,QAAI,CAAC,QAAQ;AACX,UAAI,KAAK,gBAAgB;AACvB,sBAAc,MAAM,SAAS,QAAQ;AACrC,aAAK,UAAU,KAAK,EAAE,QAAQ,MAAM,MAAM,QAAQ,UAAU,CAAC;AAC7D,cAAM,KAAK;AAAA,UACT,4BAA4BG,OAAK,SAAS,KAAK,SAAS,IAAI,EAAE,QAAQ,OAAO,GAAG,CAAC;AAAA,QACnF;AACA,cAAM,KAAK,KAAK,EAAE,MAAM,eAAe,MAAM,MAAM,OAAO,CAAC;AAAA,MAC7D,OAAO;AACL,cAAM,KAAK,YAAY,QAAQ,IAAI;AAAA,MACrC;AACA,aAAO;AAAA,IACT;AAEA,QAAI;AACJ,QAAI;AACF,aAAO,aAAa,aAAa,IAAI,GAAG,SAAS,UAAU;AAAA,QACzD,QAAQ,KAAK,kBAAkB;AAAA,MACjC,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,WAAK,UAAU,KAAK,EAAE,QAAQ,MAAM,MAAM,QAAQ,SAAS,SAASH,WAAU,GAAG,EAAE,CAAC;AACpF,YAAM,KAAK,KAAK;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,SAASA,WAAU,GAAG;AAAA,QACtB,MAAM,EAAE,OAAOA,WAAU,GAAG,EAAE;AAAA,MAChC,CAAC;AACD,aAAO;AAAA,IACT;AACA,QAAI,KAAK,WAAW;AAClB,WAAK,UAAU,KAAK,EAAE,QAAQ,MAAM,MAAM,QAAQ,MAAM,KAAK,CAAC;AAC9D,YAAM,KAAK,KAAK,EAAE,MAAM,eAAe,MAAM,MAAM,OAAO,CAAC;AAAA,IAC7D,WAAW,KAAK,gBAAgB;AAC9B,oBAAc,MAAM,SAAS,QAAQ;AACrC,YAAM,UAAU,cAAc,IAAI;AAClC,WAAK,UAAU,KAAK,EAAE,QAAQ,MAAM,MAAM,QAAQ,WAAW,MAAM,QAAQ,CAAC;AAC5E,YAAM,KAAK;AAAA,QACT,4BAA4BG,OAAK,SAAS,KAAK,SAAS,IAAI,EAAE,QAAQ,OAAO,GAAG,CAAC,KAAK,OAAO;AAAA,MAC/F;AACA,YAAM,KAAK,KAAK,EAAE,MAAM,eAAe,MAAM,MAAM,OAAO,CAAC;AAAA,IAC7D,OAAO;AACL,YAAM,UAAU,cAAc,IAAI;AAClC,WAAK,UAAU,KAAK,EAAE,QAAQ,MAAM,MAAM,QAAQ,QAAQ,MAAM,QAAQ,CAAC;AAEzE,YAAM,OAAO,WAAW,IAAI,EAAE,MAAM,IAAI,EAAE,MAAM,CAAC;AACjD,YAAM,SAAS,sBAAsB,KAAK,WAAW,MAAM,CAAC;AAC5D,YAAM,KAAK,KAAK;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,SAAS;AAAA,UACP;AAAA,UACA,GAAG;AAAA,UACH,iEAAiE,MAAM;AAAA,QACzE,EAAE,KAAK,IAAI;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,WAAW,QAAwB;AACzC,WAAO,WAAW,KAAK,QAAQ,gBAAgB,KAAK,aAAa,MAAM;AAAA,EACzE;AAAA,EAEA,MAAc,YAAY,QAAgB,MAA6B;AACrE,UAAM,OAAO,KAAK;AAClB,UAAM,QAAQA,OAAK,SAAS,KAAK,SAAS,IAAI,EAAE,QAAQ,OAAO,GAAG,KAAK;AACvE,UAAM,SAAS,sBAAsB,KAAK,WAAW,MAAM,CAAC;AAC5D,UAAM,MAAM,WAAW,KAAK,gBAAgB,KAAK,gBAAgB,MAAM;AACvE,QAAI,KAAK,iBAAiB;AACxB,YAAM,UAAU,uBAAuB,KAAK,GAAG,GAAG,gDAAgD,MAAM;AACxG,WAAK,UAAU,KAAK,EAAE,QAAQ,MAAM,MAAM,QAAQ,oBAAoB,QAAQ,CAAC;AAC/E,YAAM,KAAK,KAAK;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,MAAM,EAAE,OAAO,WAAW,WAAW,QAAQ,MAAM,MAAM;AAAA,MAC3D,CAAC;AACD;AAAA,IACF;AACA,SAAK,UAAU,KAAK,EAAE,QAAQ,MAAM,MAAM,QAAQ,UAAU,CAAC;AAC7D,UAAM,KAAK;AAAA,MACT,uBAAuB,KAAK,GAAG,GAAG,UAAU,MAAM;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAc,gBACZ,QACA,SACA,UACe;AACf,QAAI,OAAO;AACX,QAAI,CAAC,MAAM;AACT,UAAI;AACF,eAAO,MAAM,gBAAgB,SAAS,EAAE,kBAAkB,EAAE,CAAC;AAAA,MAC/D,SAAS,KAAK;AACZ,cAAM,KAAK,KAAK;AAAA,UACd,MAAM;AAAA,UACN,SAAS;AAAA,YACP,IAAI;AAAA,YACJ;AAAA,YACA,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,QAAQH,WAAU,GAAG;AAAA,UACvB;AAAA,QACF,CAAC;AACD;AAAA,MACF;AAAA,IACF;AACA,UAAM,SAAS,oBAAoB,KAAK,SAAS,MAAM;AACvD,UAAM,QAAQ,QAAQ,OAAO;AAC7B,UAAM,WAAW;AAAA,MACf;AAAA,QACE,GAAG,KAAK;AAAA,QACR,WAAW,mBAAmB,MAAM,IAAI,SAAS;AAAA,QACjD,GAAI,QAAQ,EAAE,aAAa,MAAM,IAAI,CAAC;AAAA,MACxC;AAAA,MACA;AAAA,QACE,kBAAkB,KAAK;AAAA,QACvB,OAAO,KAAK,QAAQ,QAAQ;AAAA,QAC5B,UAAU,KAAK,QAAQ,QAAQ;AAAA,MACjC;AAAA,IACF;AACA,eAAW,WAAW,UAAU;AAC9B,YAAM,KAAK,KAAK,EAAE,MAAM,SAAS,SAAS,EAAE,GAAG,SAAS,OAAO,EAAE,CAAC;AAAA,IACpE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,cAAc,MAA6B;AACvD,UAAM,MAAMG,OAAK,WAAW,IAAI,IAAI,OAAOA,OAAK,QAAQ,KAAK,SAAS,IAAI;AAC1E,QAAIW;AACJ,QAAI;AACF,MAAAA,UAAS,KAAK,MAAMJ,IAAG,aAAa,KAAK,MAAM,CAAC;AAChD,UAAI,CAAC,MAAM,QAAQI,QAAO,KAAK,EAAG,OAAM,IAAI,MAAM,kBAAkB;AAAA,IACtE,SAAS,KAAK;AACZ,YAAM,KAAK;AAAA,QACT,0BAA0B,IAAI,KAAKd,WAAU,GAAG,CAAC;AAAA,MACnD;AACA;AAAA,IACF;AACA,UAAM,SAAS,oBAAI,IAA0B;AAC7C,UAAM,OAAO,oBAAI,IAA2D;AAC5E,eAAW,KAAKc,QAAO,OAAO;AAC5B,UAAI,EAAE,WAAW,UAAW;AAC5B,YAAM,KAAK,EAAE,UAAU,WAAW,EAAE,EAAE;AACtC,YAAM,QAAQ,KAAK,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,EAAE;AAC3D,YAAM;AACN,YAAM,MAAM,EAAE,cAAc;AAC5B,UAAI,EAAE,WAAW,SAAU,OAAM;AACjC,WAAK,IAAI,IAAI,KAAK;AAAA,IACpB;AACA,eAAW,CAAC,IAAI,KAAK,KAAK,MAAM;AAC9B,aAAO,IAAI,IAAI,EAAE,QAAQ,MAAM,SAAS,GAAG,YAAY,MAAM,KAAK,MAAM,MAAM,CAAC;AAAA,IACjF;AAEA,UAAM,MAAM,KAAK,QAAQ,sBAAsB;AAC/C,UAAM,QAAQ,KAAK,QAAQ,wBAAwB;AACnD,UAAM,WAAW,KAAK,aAAa;AACnC,UAAM,cAAwB,CAAC;AAC/B,UAAM,QAAkB,CAAC;AACzB,eAAW,CAAC,IAAI,OAAO,KAAK,UAAU;AACpC,YAAM,QAAQ,OAAO,IAAI,EAAE;AAC3B,UAAI,CAAC,QAAQ,IAAI;AACf,YAAI,OAAO,OAAQ,OAAM,KAAK,EAAE;AAAA,aAC3B;AACH,sBAAY,KAAK,GAAG,EAAE,kBAAkB,QAAQ,KAAK,wBAAwB,EAAE;AAC/E,eAAK,iBAAiB,IAAI,EAAE;AAAA,QAC9B;AACA;AAAA,MACF;AACA,UAAI,SAAS,CAAC,MAAM,UAAU,MAAM,aAAa,GAAG;AAClD,cAAM,QAAQ,MAAM,cAAc,IAAI,MAAM;AAC5C,YAAI,QAAQ,aAAa,SAAS,QAAQ,aAAa,MAAM,cAAc,OAAO;AAChF,sBAAY;AAAA,YACV,GAAG,EAAE,aAAa,KAAK,MAAM,QAAQ,UAAU,CAAC,SAAS,KAAK,MAAM,MAAM,UAAU,CAAC,wBAAwB,KAAK,OAAO,QAAQ,aAAa,MAAM,aAAa,KAAK,GAAG,CAAC,aAAa,GAAG;AAAA,UAC5L;AACA,eAAK,iBAAiB,IAAI,EAAE;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AACA,SAAK,iBAAiB;AACtB,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,KAAK;AAAA,QACT,aAAa,MAAM,MAAM,iCAAiC,IAAI,iBAAiB,MAAM,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,MAAM,SAAS,IAAI,UAAU,EAAE;AAAA,MAC/I;AAAA,IACF;AACA,UAAM,KAAK,KAAK;AAAA,MACd,MAAM;AAAA,MACN,SAAS;AAAA,QACP,IAAI;AAAA,QACJ,OACE,YAAY,SAAS,IACjB,aAAa,YAAY,MAAM,qBAAqB,IAAI,KACxD,+BAA+B,IAAI;AAAA,QACzC,QAAQ,YAAY,SAAS,IAAI,WAAW;AAAA,QAC5C,GAAI,YAAY,SAAS,IAAI,EAAE,QAAQ,YAAY,KAAK,IAAI,EAAE,IAAI,CAAC;AAAA,MACrE;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMQ,eAA+E;AACrF,UAAM,QAAQ,KAAK,QAAQ,cAAc;AACzC,UAAM,SAAS,oBAAI,IAA0D;AAC7E,eAAW,EAAE,KAAK,QAAQ,KAAK,KAAK,SAAS;AAC3C,UAAI,QAAQ,WAAW,UAAW;AAClC,YAAM,KAAK,WAAW,IAAI,EAAE;AAC5B,YAAM,QAAQ,OAAO,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,EAAE;AAC5D,YAAM;AACN,YAAM,MAAM,QAAQ;AACpB,UAAI,QAAQ,WAAW,YAAY,QAAQ,WAAW,UAAW,OAAM;AACvE,aAAO,IAAI,IAAI,KAAK;AAAA,IACtB;AACA,UAAM,MAAM,oBAAI,IAA+D;AAC/E,eAAW,CAAC,IAAI,KAAK,KAAK,QAAQ;AAChC,YAAM,OAAO,MAAM,SAAS,MAAM;AAClC,YAAM,KAAK,SAAS,KAAM,KAAK,SAAS,IAAI,EAAE,KAAK,QAAQ;AAC3D,UAAI,IAAI,IAAI,EAAE,IAAI,MAAM,YAAY,MAAM,KAAK,MAAM,KAAK,CAAC;AAAA,IAC7D;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,OACZ,WACA,UACA,QACoB;AACpB,UAAM,WAAW,KAAK,aAAa;AAInC,UAAM,SAAqC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,EAAE;AAC1F,eAAW,EAAE,QAAQ,KAAK,KAAK,QAAS,QAAO,QAAQ,MAAM;AAC7D,UAAM,UAAsB;AAAA,MAC1B,OAAO,KAAK,QAAQ;AAAA,MACpB,GAAG;AAAA,MACH,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AACA,QAAI,SAAS,GAAG;AACd,cAAQ,OAAO,KAAK,QAAQ;AAC5B,cAAQ,YAAY,OAAO;AAAA,QACzB,CAAC,GAAG,SAAS,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAO,IAAI,IAAI,KAAK,CAAE,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;AAAA,MAC5F;AAAA,IACF;AACA,QAAI;AACJ,QAAI,aAAa,OAAW,MAAK;AAAA,SAC5B;AACH,YAAM,UAAU,KAAK,iBACjB,KAAK,iBAAiB,SAAS,IAC/B,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE;AAC5C,YAAM,WAAW,KAAK,OAAO,MAAM,CAAC,MAAM,EAAE,WAAW,QAAQ;AAC/D,YAAM,cAAc,KAAK,UAAU;AAAA,QACjC,CAAC,MAAM,EAAE,WAAW,UAAU,EAAE,WAAW,WAAW,EAAE,WAAW;AAAA,MACrE;AACA,WAAK,WAAW,YAAY,eAAe,CAAC,KAAK;AAAA,IACnD;AACA,UAAM,KAAK,KAAK,EAAE,MAAM,WAAW,SAAS,GAAG,CAAC;AAChD,WAAO;AAAA,MACL,UAAU,KAAK,QAAQ,IAAI,KAAK,IAAI;AAAA,MACpC;AAAA,MACA;AAAA,MACA,OAAO,CAAC,GAAG,KAAK,OAAO;AAAA,MACvB,QAAQ,CAAC,GAAG,KAAK,MAAM;AAAA,MACvB,WAAW,CAAC,GAAG,KAAK,SAAS;AAAA,MAC7B,UAAU,CAAC,GAAG,KAAK,QAAQ;AAAA,IAC7B;AAAA,EACF;AACF;AAUO,SAAS,qBAAqB,QAAuB,CAAC,GAAkB;AAC7E,QAAM,EAAE,QAAQ,GAAG,KAAK,IAAI;AAC5B,QAAM,UAAU,KAAK,YAAY,SAAS,EAAE,SAAS,OAAO,IAAI,kBAAkB;AAClF,QAAM,gBACJ,KAAK,kBAAkB,UAAU,CAAC,KAAK,UAAU,YAAY,OAAO,KAAK,OAAO,EAAE,CAAC;AACrF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,WAAW,EAAE,GAAG,mBAAmB,GAAI,KAAK,aAAa,CAAC,EAAG;AAAA,IAC7D,OAAO,KAAK,SAAS,kBAAkB;AAAA,IACvC,WAAW,KAAK,aAAa,kBAAkB;AAAA,IAC/C,SAAS,KAAK,WAAW,QAAQ,IAAI;AAAA,EACvC;AACF;AAGA,eAAsB,SAAS,UAAyB,CAAC,GAAoB;AAC3E,SAAO,IAAI,OAAO,qBAAqB,OAAO,CAAC,EAAE,IAAI;AACvD;","names":["quote","json","segment","entries","path","segment","isObject","cached","fs","path","ProtocolError","SdkError","SdkErrorCode","isObject","fs","path","http","capabilities","SdkError","SdkErrorCode","firstLine","ProtocolError","identity","fs","path","fs","json","path","isPlainObject","editDistance","prefix","names","path","path","path","path","names","isRecord","path","MODERN_PROTOCOL_VERSION","protocolVersion","isRecord","MODERN_PROTOCOL_VERSION","fs","path","isObject","capabilities","path","fs","canonical","prefix","changes","short","i","j","tag","isPlainObject","path","describeType","short","closest","count","names","segment","key","fs","path","path","isPlainObject","describe","editDistance","fs","names","segment","path","plural","count","displayPath","path","out","count","plural","isPlainObject","displayPath","asArray","plural","i","j","wordDiff","short","displayPath","plural","count","fs","path","path","displayPath","plural","fs","fs","path","displayPath","report","path","fs","fs","path","displayPath","tag","path","fs","entries","displayPath","yaml","editDistance","names","fs","path","isObject","errorText","short","joinPath","levenshtein","names","path","isObject","names","joinPath","errorText","stepLabel","displayPath","path","short","reason","failure","status","clone","json","fs","segment","count","entries","report"]}
|