@crvouga/sqlite-mem 1.1.0 → 1.1.2
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/README.md +3 -1
- package/dist/ast/nodes.d.ts +9 -1
- package/dist/executor/pragma-engine.d.ts +6 -0
- package/dist/functions/table-valued.d.ts +5 -0
- package/dist/index.js +103 -4
- package/dist/index.js.map +2 -2
- package/dist/lexer/tokenize.d.ts +1 -1
- package/dist/unstable.js +23 -0
- package/dist/unstable.js.map +2 -2
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/errors/index.ts", "../src/lexer/tokenize.ts", "../src/parser/parser.ts", "../src/parser/index.ts", "../src/runtime/clock.ts", "../src/runtime/options.ts", "../src/runtime/prng.ts", "../src/types/value.ts", "../src/json/parse.ts", "../src/json/stringify.ts", "../src/json/jsonb.ts", "../src/json/path.ts", "../src/json/types.ts", "../src/json/ops.ts", "../src/json/tvf.ts", "../src/functions/json.ts", "../src/functions/aggregate.ts", "../src/functions/datetime.ts", "../src/functions/extensions.ts", "../src/functions/math.ts", "../src/expressions/like.ts", "../src/functions/scalar.ts", "../src/functions/registry.ts", "../src/types/collation.ts", "../src/expressions/eval.ts", "../src/indexes/index.ts", "../src/types/strict.ts", "../src/vtable/fts/options.ts", "../src/vtable/fts/query.ts", "../src/vtable/fts/porter.ts", "../src/vtable/fts/tokenize.ts", "../src/vtable/fts/table.ts", "../src/vtable/modules.ts", "../src/storage/row.ts", "../src/storage/table.ts", "../src/storage/database-state.ts", "../src/serialization/codec.ts", "../src/transactions/manager.ts", "../src/executor/env.ts", "../src/executor/result.ts", "../src/executor/attach.ts", "../src/functions/window.ts", "../src/executor/pragma-engine.ts", "../src/functions/table-valued-registry.ts", "../src/functions/pragma-tvf.ts", "../src/functions/table-valued.ts", "../src/schema/catalog.ts", "../src/expressions/equals.ts", "../src/planner/access.ts", "../src/executor/simple-select.ts", "../src/executor/select.ts", "../src/executor/ddl.ts", "../src/constraints/check.ts", "../src/executor/triggers.ts", "../src/executor/vtable.ts", "../src/executor/dml.ts", "../src/executor/pragma.ts", "../src/executor/execute.ts", "../src/api/statement.ts", "../src/api/database.ts"],
|
|
4
|
-
"sourcesContent": ["/** Coarse classification of {@link SqliteError} for catch-site branching.\n *\n * New categories may be added in minor releases. Consumers that switch on\n * `category` must include a default case.\n */\nexport type ErrorCategory =\n | \"syntax\"\n | \"no_such_table\"\n | \"no_such_column\"\n | \"constraint_unique\"\n | \"constraint_primary\"\n | \"constraint_notnull\"\n | \"constraint_check\"\n | \"constraint_foreign\"\n | \"constraint\"\n | \"transaction\"\n | \"datatype_mismatch\"\n | \"unsupported\"\n | \"misuse\"\n | \"snapshot_version\"\n | \"other\"\n | (string & {});\n\n/**\n * Engine error. `name` is always `\"SqliteError\"`.\n *\n * `sqliteCode` and Node's conventional `code` property are always set (default\n * `\"SQLITE_ERROR\"` when no more specific code applies).\n *\n * @example\n * ```ts\n * import { Database, SqliteError } from \"@crvouga/sqlite-mem\";\n *\n * const db = new Database();\n * try {\n * db.exec(\"SELECT * FROM missing\");\n * } catch (err) {\n * if (err instanceof SqliteError && err.category === \"no_such_table\") {\n * // handle\n * }\n * }\n * ```\n */\nexport class SqliteError extends Error {\n /** Coarse error class (constraint vs syntax vs missing object, \u2026). */\n readonly category: ErrorCategory;\n /** SQLite result-code name such as `SQLITE_CONSTRAINT_UNIQUE`. */\n readonly sqliteCode: string;\n /** Same value as {@link sqliteCode} (Node `err.code` convention). */\n readonly code: string;\n\n /**\n * @param message - Human-readable error text.\n * @param category - Coarse class; defaults to `\"other\"`.\n * @param sqliteCode - SQLite result-code name; defaults to `\"SQLITE_ERROR\"`.\n */\n constructor(message: string, category: ErrorCategory = \"other\", sqliteCode = \"SQLITE_ERROR\") {\n super(message);\n this.name = \"SqliteError\";\n this.category = category;\n this.sqliteCode = sqliteCode;\n this.code = sqliteCode;\n }\n}\n\nexport function unsupported(feature: string): never {\n throw new SqliteError(`Unsupported SQLite feature: ${feature}`, \"unsupported\");\n}\n\nexport class TriggerRaiseError extends SqliteError {\n readonly action: \"IGNORE\" | \"ABORT\" | \"FAIL\" | \"ROLLBACK\";\n\n constructor(action: \"IGNORE\" | \"ABORT\" | \"FAIL\" | \"ROLLBACK\", message?: string) {\n super(\n message ?? action,\n action === \"FAIL\" ? \"constraint\" : \"other\",\n action === \"FAIL\" ? \"SQLITE_CONSTRAINT\" : undefined,\n );\n this.action = action;\n }\n}\n", "import { SqliteError } from \"../errors/index.ts\";\n\n/** Lexer token kind: keywords, literals, operators, and punctuation. */\nexport type TokenKind =\n | \"EOF\"\n | \"IDENT\"\n | \"STRING\"\n | \"NUMBER\"\n | \"BLOB\"\n | \"PARAM_POS\"\n | \"PARAM_NAMED\"\n | \"DOT\"\n | \"COMMA\"\n | \"SEMI\"\n | \"LPAREN\"\n | \"RPAREN\"\n | \"PLUS\"\n | \"MINUS\"\n | \"STAR\"\n | \"SLASH\"\n | \"PERCENT\"\n | \"EQ\"\n | \"EQEQ\"\n | \"NE\"\n | \"LT\"\n | \"LE\"\n | \"GT\"\n | \"GE\"\n | \"CONCAT\"\n | \"AMP\"\n | \"PIPE\"\n | \"LSHIFT\"\n | \"RSHIFT\"\n | \"JSON_ARROW\"\n | \"JSON_ARROW2\"\n | \"TILDE\"\n // keywords\n | \"ABORT\"\n | \"ACTION\"\n | \"ADD\"\n | \"AFTER\"\n | \"ALL\"\n | \"ALTER\"\n | \"ANALYZE\"\n | \"AND\"\n | \"AS\"\n | \"ASC\"\n | \"ATTACH\"\n | \"AUTOINCREMENT\"\n | \"BEFORE\"\n | \"BEGIN\"\n | \"BETWEEN\"\n | \"BY\"\n | \"CASCADE\"\n | \"CASE\"\n | \"CAST\"\n | \"CHECK\"\n | \"COLLATE\"\n | \"COLUMN\"\n | \"COMMIT\"\n | \"CONFLICT\"\n | \"CONSTRAINT\"\n | \"CREATE\"\n | \"CROSS\"\n | \"CURRENT\"\n | \"CURRENT_DATE\"\n | \"CURRENT_TIME\"\n | \"CURRENT_TIMESTAMP\"\n | \"DATABASE\"\n | \"DEFAULT\"\n | \"DEFERRABLE\"\n | \"DEFERRED\"\n | \"DELETE\"\n | \"DESC\"\n | \"DETACH\"\n | \"DISTINCT\"\n | \"DO\"\n | \"DROP\"\n | \"EACH\"\n | \"ELSE\"\n | \"END\"\n | \"ESCAPE\"\n | \"EXCEPT\"\n | \"EXCLUDE\"\n | \"EXCLUSIVE\"\n | \"EXISTS\"\n | \"EXPLAIN\"\n | \"FAIL\"\n | \"FILTER\"\n | \"FIRST\"\n | \"FOLLOWING\"\n | \"FOR\"\n | \"FOREIGN\"\n | \"FROM\"\n | \"FULL\"\n | \"GENERATED\"\n | \"GLOB\"\n | \"GROUP\"\n | \"GROUPS\"\n | \"HAVING\"\n | \"IF\"\n | \"IGNORE\"\n | \"IMMEDIATE\"\n | \"IN\"\n | \"INDEX\"\n | \"INDEXED\"\n | \"INITIALLY\"\n | \"INNER\"\n | \"INSERT\"\n | \"INSTEAD\"\n | \"INTERSECT\"\n | \"INTO\"\n | \"IS\"\n | \"ISNULL\"\n | \"JOIN\"\n | \"KEY\"\n | \"LAST\"\n | \"LEFT\"\n | \"LIKE\"\n | \"LIMIT\"\n | \"MATCH\"\n | \"MATERIALIZED\"\n | \"NATURAL\"\n | \"NO\"\n | \"NOT\"\n | \"NOTHING\"\n | \"NOTNULL\"\n | \"NULL\"\n | \"NULLS\"\n | \"OF\"\n | \"OFFSET\"\n | \"ON\"\n | \"OR\"\n | \"ORDER\"\n | \"OTHERS\"\n | \"OUTER\"\n | \"OVER\"\n | \"PARTITION\"\n | \"PLAN\"\n | \"PRAGMA\"\n | \"PRECEDING\"\n | \"PRIMARY\"\n | \"QUERY\"\n | \"RAISE\"\n | \"RANGE\"\n | \"RECURSIVE\"\n | \"REFERENCES\"\n | \"REGEXP\"\n | \"REINDEX\"\n | \"RELEASE\"\n | \"RENAME\"\n | \"REPLACE\"\n | \"RESTRICT\"\n | \"RETURNING\"\n | \"RIGHT\"\n | \"ROLLBACK\"\n | \"ROW\"\n | \"ROWS\"\n | \"SAVEPOINT\"\n | \"SELECT\"\n | \"SET\"\n | \"TABLE\"\n | \"TEMP\"\n | \"TEMPORARY\"\n | \"THEN\"\n | \"TIES\"\n | \"TO\"\n | \"TRANSACTION\"\n | \"TRIGGER\"\n | \"UNBOUNDED\"\n | \"UNION\"\n | \"UNIQUE\"\n | \"UPDATE\"\n | \"USING\"\n | \"VACUUM\"\n | \"VALUES\"\n | \"VIEW\"\n | \"VIRTUAL\"\n | \"WHEN\"\n | \"WHERE\"\n | \"WINDOW\"\n | \"WITH\"\n | \"WITHOUT\";\n\n/** A single lexer token from {@link tokenize}. */\nexport interface Token {\n kind: TokenKind;\n value: string;\n /** For NUMBER/BLOB/STRING, the parsed value */\n literal?: string | number | bigint | Uint8Array | null;\n /** True when a NUMBER token used float/scientific syntax. */\n forceReal?: boolean;\n index?: number; // for PARAM_POS\n line: number;\n column: number;\n start: number;\n end: number;\n}\n\nconst KEYWORDS: Record<string, TokenKind> = {\n ABORT: \"ABORT\",\n ACTION: \"ACTION\",\n ADD: \"ADD\",\n AFTER: \"AFTER\",\n ALL: \"ALL\",\n ALTER: \"ALTER\",\n ANALYZE: \"ANALYZE\",\n AND: \"AND\",\n AS: \"AS\",\n ASC: \"ASC\",\n ATTACH: \"ATTACH\",\n AUTOINCREMENT: \"AUTOINCREMENT\",\n BEFORE: \"BEFORE\",\n BEGIN: \"BEGIN\",\n BETWEEN: \"BETWEEN\",\n BY: \"BY\",\n CASCADE: \"CASCADE\",\n CASE: \"CASE\",\n CAST: \"CAST\",\n CHECK: \"CHECK\",\n COLLATE: \"COLLATE\",\n COLUMN: \"COLUMN\",\n COMMIT: \"COMMIT\",\n CONFLICT: \"CONFLICT\",\n CONSTRAINT: \"CONSTRAINT\",\n CREATE: \"CREATE\",\n CROSS: \"CROSS\",\n CURRENT: \"CURRENT\",\n CURRENT_DATE: \"CURRENT_DATE\",\n CURRENT_TIME: \"CURRENT_TIME\",\n CURRENT_TIMESTAMP: \"CURRENT_TIMESTAMP\",\n DATABASE: \"DATABASE\",\n DEFAULT: \"DEFAULT\",\n DEFERRABLE: \"DEFERRABLE\",\n DEFERRED: \"DEFERRED\",\n DELETE: \"DELETE\",\n DESC: \"DESC\",\n DETACH: \"DETACH\",\n DISTINCT: \"DISTINCT\",\n DO: \"DO\",\n DROP: \"DROP\",\n EACH: \"EACH\",\n ELSE: \"ELSE\",\n END: \"END\",\n ESCAPE: \"ESCAPE\",\n EXCEPT: \"EXCEPT\",\n EXCLUDE: \"EXCLUDE\",\n EXCLUSIVE: \"EXCLUSIVE\",\n EXISTS: \"EXISTS\",\n EXPLAIN: \"EXPLAIN\",\n FAIL: \"FAIL\",\n FILTER: \"FILTER\",\n FIRST: \"FIRST\",\n FOLLOWING: \"FOLLOWING\",\n FOR: \"FOR\",\n FOREIGN: \"FOREIGN\",\n FROM: \"FROM\",\n FULL: \"FULL\",\n GENERATED: \"GENERATED\",\n GLOB: \"GLOB\",\n GROUP: \"GROUP\",\n GROUPS: \"GROUPS\",\n HAVING: \"HAVING\",\n IF: \"IF\",\n IGNORE: \"IGNORE\",\n IMMEDIATE: \"IMMEDIATE\",\n IN: \"IN\",\n INDEX: \"INDEX\",\n INDEXED: \"INDEXED\",\n INITIALLY: \"INITIALLY\",\n INNER: \"INNER\",\n INSERT: \"INSERT\",\n INSTEAD: \"INSTEAD\",\n INTERSECT: \"INTERSECT\",\n INTO: \"INTO\",\n IS: \"IS\",\n ISNULL: \"ISNULL\",\n JOIN: \"JOIN\",\n KEY: \"KEY\",\n LAST: \"LAST\",\n LEFT: \"LEFT\",\n LIKE: \"LIKE\",\n LIMIT: \"LIMIT\",\n MATCH: \"MATCH\",\n MATERIALIZED: \"MATERIALIZED\",\n NATURAL: \"NATURAL\",\n NO: \"NO\",\n NOT: \"NOT\",\n NOTHING: \"NOTHING\",\n NOTNULL: \"NOTNULL\",\n NULL: \"NULL\",\n NULLS: \"NULLS\",\n OF: \"OF\",\n OFFSET: \"OFFSET\",\n ON: \"ON\",\n OR: \"OR\",\n ORDER: \"ORDER\",\n OTHERS: \"OTHERS\",\n OUTER: \"OUTER\",\n OVER: \"OVER\",\n PARTITION: \"PARTITION\",\n PLAN: \"PLAN\",\n PRAGMA: \"PRAGMA\",\n PRECEDING: \"PRECEDING\",\n PRIMARY: \"PRIMARY\",\n QUERY: \"QUERY\",\n RAISE: \"RAISE\",\n RANGE: \"RANGE\",\n RECURSIVE: \"RECURSIVE\",\n REFERENCES: \"REFERENCES\",\n REGEXP: \"REGEXP\",\n REINDEX: \"REINDEX\",\n RELEASE: \"RELEASE\",\n RENAME: \"RENAME\",\n REPLACE: \"REPLACE\",\n RESTRICT: \"RESTRICT\",\n RETURNING: \"RETURNING\",\n RIGHT: \"RIGHT\",\n ROLLBACK: \"ROLLBACK\",\n ROW: \"ROW\",\n ROWS: \"ROWS\",\n SAVEPOINT: \"SAVEPOINT\",\n SELECT: \"SELECT\",\n SET: \"SET\",\n TABLE: \"TABLE\",\n TEMP: \"TEMP\",\n TEMPORARY: \"TEMPORARY\",\n THEN: \"THEN\",\n TIES: \"TIES\",\n TO: \"TO\",\n TRANSACTION: \"TRANSACTION\",\n TRIGGER: \"TRIGGER\",\n UNBOUNDED: \"UNBOUNDED\",\n UNION: \"UNION\",\n UNIQUE: \"UNIQUE\",\n UPDATE: \"UPDATE\",\n USING: \"USING\",\n VACUUM: \"VACUUM\",\n VALUES: \"VALUES\",\n VIEW: \"VIEW\",\n VIRTUAL: \"VIRTUAL\",\n WHEN: \"WHEN\",\n WHERE: \"WHERE\",\n WINDOW: \"WINDOW\",\n WITH: \"WITH\",\n WITHOUT: \"WITHOUT\",\n};\n\n/**\n * Lex `input` into SQLite tokens (keywords, literals, operators, parameters).\n *\n * @param input - SQL source text.\n */\nexport function tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n let line = 1;\n let column = 1;\n let nextParameterIndex = 1;\n const namedParameterIndexes = new Map<string, number>();\n\n const peek = (n = 0) => input[i + n] ?? \"\";\n const advance = () => {\n const ch = input[i++] ?? \"\";\n if (ch === \"\\n\") {\n line++;\n column = 1;\n } else {\n column++;\n }\n return ch;\n };\n\n const push = (\n kind: TokenKind,\n start: number,\n startLine: number,\n startCol: number,\n value: string,\n extra?: Partial<Token>,\n ) => {\n tokens.push({\n kind,\n value,\n line: startLine,\n column: startCol,\n start,\n end: i,\n ...extra,\n });\n };\n\n while (i < input.length) {\n const start = i;\n const startLine = line;\n const startCol = column;\n const ch = peek();\n\n // whitespace\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\f\") {\n advance();\n continue;\n }\n\n // comments\n if (ch === \"-\" && peek(1) === \"-\") {\n while (i < input.length && peek() !== \"\\n\") advance();\n continue;\n }\n if (ch === \"/\" && peek(1) === \"*\") {\n advance();\n advance();\n while (i < input.length && !(peek() === \"*\" && peek(1) === \"/\")) advance();\n if (i >= input.length) throw new SqliteError(\"unterminated comment\", \"syntax\");\n advance();\n advance();\n continue;\n }\n\n // string\n if (ch === \"'\") {\n advance();\n let s = \"\";\n while (i < input.length) {\n const c = advance();\n if (c === \"'\") {\n if (peek() === \"'\") {\n advance();\n s += \"'\";\n continue;\n }\n push(\"STRING\", start, startLine, startCol, s, { literal: s });\n break;\n }\n s += c;\n }\n if (tokens.at(-1)?.kind !== \"STRING\" || tokens.at(-1)?.start !== start) {\n throw new SqliteError(\"unrecognized token: incomplete string literal\", \"syntax\");\n }\n continue;\n }\n\n // quoted identifier\n if (ch === '\"' || ch === \"[\" || ch === \"`\") {\n const closer = ch === \"[\" ? \"]\" : ch;\n advance();\n let s = \"\";\n while (i < input.length) {\n const c = advance();\n if (c === closer) {\n if (ch === '\"' && peek() === '\"') {\n advance();\n s += '\"';\n continue;\n }\n push(\"IDENT\", start, startLine, startCol, s);\n break;\n }\n s += c;\n }\n if (tokens.at(-1)?.kind !== \"IDENT\" || tokens.at(-1)?.start !== start) {\n throw new SqliteError(\"unrecognized token: incomplete identifier\", \"syntax\");\n }\n continue;\n }\n\n // blob X'ABCD'\n if ((ch === \"x\" || ch === \"X\") && peek(1) === \"'\") {\n advance();\n advance();\n let hex = \"\";\n while (i < input.length) {\n const c = advance();\n if (c === \"'\") break;\n if (!/[0-9a-fA-F]/.test(c)) {\n throw new SqliteError(\"unrecognized token: invalid blob literal\", \"syntax\");\n }\n hex += c;\n }\n if (hex.length % 2 !== 0) {\n throw new SqliteError(\"unrecognized token: invalid blob literal\", \"syntax\");\n }\n const bytes = new Uint8Array(hex.length / 2);\n for (let j = 0; j < bytes.length; j++) {\n bytes[j] = Number.parseInt(hex.slice(j * 2, j * 2 + 2), 16);\n }\n push(\"BLOB\", start, startLine, startCol, hex, { literal: bytes });\n continue;\n }\n\n // parameters\n if (ch === \"?\") {\n advance();\n let num = \"\";\n while (/[0-9]/.test(peek())) num += advance();\n const index = num ? Number(num) : nextParameterIndex;\n nextParameterIndex = Math.max(nextParameterIndex, index + 1);\n push(\"PARAM_POS\", start, startLine, startCol, num ? `?${num}` : \"?\", { index });\n continue;\n }\n if (ch === \":\" || ch === \"@\" || ch === \"$\") {\n const prefix = advance();\n let name = \"\";\n while (/[A-Za-z0-9_]/.test(peek())) name += advance();\n if (!name) throw new SqliteError(\"unrecognized token near parameter\", \"syntax\");\n const parameter = `${prefix}${name}`;\n if (!namedParameterIndexes.has(parameter.toLowerCase())) {\n namedParameterIndexes.set(parameter.toLowerCase(), nextParameterIndex++);\n }\n push(\"PARAM_NAMED\", start, startLine, startCol, parameter);\n continue;\n }\n\n // numbers\n if (/[0-9]/.test(ch) || (ch === \".\" && /[0-9]/.test(peek(1)))) {\n let raw = \"\";\n let isFloat = false;\n if (ch === \".\") {\n isFloat = true;\n raw += advance();\n while (/[0-9]/.test(peek())) raw += advance();\n } else {\n while (/[0-9]/.test(peek())) raw += advance();\n if (peek() === \".\") {\n isFloat = true;\n raw += advance();\n while (/[0-9]/.test(peek())) raw += advance();\n }\n }\n if (peek() === \"e\" || peek() === \"E\") {\n isFloat = true;\n raw += advance();\n if (peek() === \"+\" || peek() === \"-\") raw += advance();\n if (!/[0-9]/.test(peek())) throw new SqliteError(\"unrecognized token near number\", \"syntax\");\n while (/[0-9]/.test(peek())) raw += advance();\n }\n let literal: number | bigint;\n if (!isFloat && raw.length > 15) {\n try {\n literal = BigInt(raw);\n } catch {\n literal = Number(raw);\n }\n } else if (!isFloat) {\n const n = Number(raw);\n literal = Number.isSafeInteger(n) ? n : BigInt(raw);\n } else {\n literal = Number(raw);\n }\n push(\"NUMBER\", start, startLine, startCol, raw, { literal, forceReal: isFloat || undefined });\n continue;\n }\n\n // operators / punctuation\n const two = ch + peek(1);\n const three = two + peek(2);\n if (three === \"<<\" || three === \">>\") {\n // not three char; handle below\n }\n if (two === \"||\") {\n advance();\n advance();\n push(\"CONCAT\", start, startLine, startCol, \"||\");\n continue;\n }\n if (three === \"->>\") {\n advance();\n advance();\n advance();\n push(\"JSON_ARROW2\", start, startLine, startCol, \"->>\");\n continue;\n }\n if (two === \"->\") {\n advance();\n advance();\n push(\"JSON_ARROW\", start, startLine, startCol, \"->\");\n continue;\n }\n if (two === \"<<\") {\n advance();\n advance();\n push(\"LSHIFT\", start, startLine, startCol, \"<<\");\n continue;\n }\n if (two === \">>\") {\n advance();\n advance();\n push(\"RSHIFT\", start, startLine, startCol, \">>\");\n continue;\n }\n if (two === \"==\") {\n advance();\n advance();\n push(\"EQEQ\", start, startLine, startCol, \"==\");\n continue;\n }\n if (two === \"!=\" || two === \"<>\") {\n advance();\n advance();\n push(\"NE\", start, startLine, startCol, two);\n continue;\n }\n if (two === \"<=\") {\n advance();\n advance();\n push(\"LE\", start, startLine, startCol, \"<=\");\n continue;\n }\n if (two === \">=\") {\n advance();\n advance();\n push(\"GE\", start, startLine, startCol, \">=\");\n continue;\n }\n\n const singles: Record<string, TokenKind> = {\n \".\": \"DOT\",\n \",\": \"COMMA\",\n \";\": \"SEMI\",\n \"(\": \"LPAREN\",\n \")\": \"RPAREN\",\n \"+\": \"PLUS\",\n \"-\": \"MINUS\",\n \"*\": \"STAR\",\n \"/\": \"SLASH\",\n \"%\": \"PERCENT\",\n \"=\": \"EQ\",\n \"<\": \"LT\",\n \">\": \"GT\",\n \"&\": \"AMP\",\n \"|\": \"PIPE\",\n \"~\": \"TILDE\",\n };\n if (singles[ch]) {\n advance();\n push(singles[ch]!, start, startLine, startCol, ch);\n continue;\n }\n\n // identifier / keyword\n if (/[A-Za-z_]/.test(ch)) {\n let s = \"\";\n while (/[A-Za-z0-9_$]/.test(peek())) s += advance();\n const upper = s.toUpperCase();\n const kw = KEYWORDS[upper];\n if (kw) push(kw, start, startLine, startCol, s);\n else push(\"IDENT\", start, startLine, startCol, s);\n continue;\n }\n\n throw new SqliteError(`unrecognized token: \"${ch}\"`, \"syntax\");\n }\n\n tokens.push({\n kind: \"EOF\",\n value: \"\",\n line,\n column,\n start: i,\n end: i,\n });\n return tokens;\n}\n\nexport function isKeyword(kind: TokenKind): boolean {\n return (\n kind !== \"EOF\" &&\n kind !== \"IDENT\" &&\n kind !== \"STRING\" &&\n kind !== \"NUMBER\" &&\n kind !== \"BLOB\" &&\n kind !== \"PARAM_POS\" &&\n kind !== \"PARAM_NAMED\" &&\n ![\n \"DOT\",\n \"COMMA\",\n \"SEMI\",\n \"LPAREN\",\n \"RPAREN\",\n \"PLUS\",\n \"MINUS\",\n \"STAR\",\n \"SLASH\",\n \"PERCENT\",\n \"EQ\",\n \"EQEQ\",\n \"NE\",\n \"LT\",\n \"LE\",\n \"GT\",\n \"GE\",\n \"CONCAT\",\n \"AMP\",\n \"PIPE\",\n \"LSHIFT\",\n \"RSHIFT\",\n \"JSON_ARROW\",\n \"JSON_ARROW2\",\n \"TILDE\",\n ].includes(kind)\n );\n}\n", "import type {\n AlterTableStmt,\n AttachStmt,\n BeginStmt,\n BinaryOp,\n CaseExpr,\n ColumnConstraint,\n ColumnDef,\n CommitStmt,\n CompoundTail,\n ConflictAction,\n CreateIndexStmt,\n CreateTableStmt,\n CreateTriggerStmt,\n CreateViewStmt,\n CreateVirtualTableStmt,\n Cte,\n DeleteStmt,\n DetachStmt,\n DropIndexStmt,\n DropTableStmt,\n DropTriggerStmt,\n DropViewStmt,\n Expr,\n FkAction,\n FrameBound,\n FrameSpec,\n FromItem,\n IndexedColumn,\n InExpr,\n InsertStmt,\n JoinFrom,\n LikeExpr,\n LimitClause,\n OrderByItem,\n PragmaStmt,\n ReleaseStmt,\n ResultColumn,\n RollbackStmt,\n SavepointStmt,\n SelectStmt,\n SetItem,\n Statement,\n TableConstraint,\n TableRef,\n UpdateStmt,\n UpsertClause,\n WindowSpec,\n WithClause,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { Token, TokenKind } from \"../lexer/tokenize.ts\";\n\n/** Keywords that may appear as identifiers via {@link Parser.parseIdent}. */\nconst IDENT_KEYWORDS: ReadonlySet<TokenKind> = new Set<TokenKind>([\n \"ABORT\",\n \"ACTION\",\n \"ADD\",\n \"AFTER\",\n \"ALL\",\n \"ALTER\",\n \"ANALYZE\",\n \"AND\",\n \"AS\",\n \"ASC\",\n \"ATTACH\",\n \"AUTOINCREMENT\",\n \"BEFORE\",\n \"BEGIN\",\n \"BETWEEN\",\n \"BY\",\n \"CASCADE\",\n \"CASE\",\n \"CAST\",\n \"CHECK\",\n \"COLLATE\",\n \"COLUMN\",\n \"COMMIT\",\n \"CONFLICT\",\n \"CONSTRAINT\",\n \"CREATE\",\n \"CROSS\",\n \"CURRENT\",\n \"CURRENT_DATE\",\n \"CURRENT_TIME\",\n \"CURRENT_TIMESTAMP\",\n \"DATABASE\",\n \"DEFAULT\",\n \"DEFERRABLE\",\n \"DEFERRED\",\n \"DELETE\",\n \"DESC\",\n \"DETACH\",\n \"DISTINCT\",\n \"DO\",\n \"DROP\",\n \"EACH\",\n \"ELSE\",\n \"END\",\n \"ESCAPE\",\n \"EXCEPT\",\n \"EXCLUDE\",\n \"EXCLUSIVE\",\n \"EXISTS\",\n \"EXPLAIN\",\n \"FAIL\",\n \"FILTER\",\n \"FIRST\",\n \"FOLLOWING\",\n \"FOR\",\n \"FOREIGN\",\n \"FROM\",\n \"FULL\",\n \"GENERATED\",\n \"GLOB\",\n \"GROUP\",\n \"GROUPS\",\n \"HAVING\",\n \"IF\",\n \"IGNORE\",\n \"IMMEDIATE\",\n \"IN\",\n \"INDEX\",\n \"INDEXED\",\n \"INITIALLY\",\n \"INNER\",\n \"INSERT\",\n \"INSTEAD\",\n \"INTERSECT\",\n \"INTO\",\n \"IS\",\n \"ISNULL\",\n \"JOIN\",\n \"KEY\",\n \"LAST\",\n \"LEFT\",\n \"LIKE\",\n \"LIMIT\",\n \"MATCH\",\n \"MATERIALIZED\",\n \"NATURAL\",\n \"NO\",\n \"NOT\",\n \"NOTHING\",\n \"NOTNULL\",\n \"NULL\",\n \"NULLS\",\n \"OF\",\n \"OFFSET\",\n \"ON\",\n \"OR\",\n \"ORDER\",\n \"OTHERS\",\n \"OUTER\",\n \"OVER\",\n \"PARTITION\",\n \"PLAN\",\n \"PRAGMA\",\n \"PRECEDING\",\n \"PRIMARY\",\n \"QUERY\",\n \"RAISE\",\n \"RANGE\",\n \"RECURSIVE\",\n \"REFERENCES\",\n \"REGEXP\",\n \"REINDEX\",\n \"RELEASE\",\n \"RENAME\",\n \"REPLACE\",\n \"RESTRICT\",\n \"RETURNING\",\n \"RIGHT\",\n \"ROLLBACK\",\n \"ROW\",\n \"ROWS\",\n \"SAVEPOINT\",\n \"SELECT\",\n \"SET\",\n \"TABLE\",\n \"TEMP\",\n \"TEMPORARY\",\n \"THEN\",\n \"TIES\",\n \"TO\",\n \"TRANSACTION\",\n \"TRIGGER\",\n \"UNBOUNDED\",\n \"UNION\",\n \"UNIQUE\",\n \"UPDATE\",\n \"USING\",\n \"VACUUM\",\n \"VALUES\",\n \"VIEW\",\n \"VIRTUAL\",\n \"WHEN\",\n \"WHERE\",\n \"WINDOW\",\n \"WITH\",\n \"WITHOUT\",\n]);\n\nconst AGGREGATE_FUNCTIONS = new Set([\n \"AVG\",\n \"COUNT\",\n \"GROUP_CONCAT\",\n \"STRING_AGG\",\n \"MAX\",\n \"MIN\",\n \"SUM\",\n \"TOTAL\",\n \"JSON_GROUP_ARRAY\",\n \"JSON_GROUP_OBJECT\",\n \"JSONB_GROUP_ARRAY\",\n \"JSONB_GROUP_OBJECT\",\n]);\n\n/** SQLite binary operator precedence (higher binds tighter). */\nconst PREC = {\n OR: 10,\n AND: 20,\n IS_IN_LIKE: 30,\n COMPARE: 40,\n BIT_OR: 45,\n BIT_AND: 46,\n SHIFT: 47,\n ADD: 50,\n MUL: 60,\n CONCAT: 70,\n JSON_ARROW: 80,\n} as const;\n\nexport class Parser {\n private pos = 0;\n\n constructor(private readonly tokens: Token[]) {}\n\n private current(): Token {\n return this.tokens[this.pos] ?? this.tokens[this.tokens.length - 1]!;\n }\n\n private peek(offset = 1): Token {\n return this.tokens[this.pos + offset] ?? this.tokens[this.tokens.length - 1]!;\n }\n\n private at(kind: TokenKind): boolean {\n return this.current().kind === kind;\n }\n\n private check(...kinds: TokenKind[]): boolean {\n return kinds.includes(this.current().kind);\n }\n\n private advance(): Token {\n const t = this.current();\n if (t.kind !== \"EOF\") this.pos++;\n return t;\n }\n\n private match(...kinds: TokenKind[]): boolean {\n if (this.check(...kinds)) {\n this.advance();\n return true;\n }\n return false;\n }\n\n private expect(kind: TokenKind, message?: string): Token {\n if (!this.at(kind)) {\n this.syntaxError(message ?? `expected ${kind}, got ${this.current().kind}`);\n }\n return this.advance();\n }\n\n syntaxError(message: string): never {\n const t = this.current();\n throw new SqliteError(`${message} at ${t.line}:${t.column}`, \"syntax\");\n }\n\n /** Accept IDENT or keyword tokens as identifier names. */\n parseIdent(): string {\n const t = this.current();\n if (t.kind === \"IDENT\") {\n this.advance();\n return t.value;\n }\n if (IDENT_KEYWORDS.has(t.kind)) {\n this.advance();\n return t.value;\n }\n this.syntaxError(\"expected identifier\");\n }\n\n private parseQualifiedTableName(): { schema: string | null; name: string } {\n const first = this.parseIdent();\n if (this.match(\"DOT\")) {\n const second = this.parseIdent();\n return { schema: first, name: second };\n }\n return { schema: null, name: first };\n }\n\n private parseTableName(): string {\n const qname = this.parseQualifiedTableName();\n return qname.schema ? `${qname.schema}.${qname.name}` : qname.name;\n }\n\n private parseAttachStmt(): AttachStmt {\n this.expect(\"ATTACH\");\n this.match(\"DATABASE\");\n const filename = this.parseExpr();\n this.expect(\"AS\");\n const schema = this.parseIdent();\n return { type: \"attach\", filename, schema };\n }\n\n private parseDetachStmt(): DetachStmt {\n this.expect(\"DETACH\");\n this.match(\"DATABASE\");\n const schema = this.parseIdent();\n return { type: \"detach\", schema };\n }\n\n private optionalAlias(): string | null {\n if (this.match(\"AS\")) return this.parseIdent();\n // Implicit aliases use only non-keyword IDENT tokens to avoid swallowing clause keywords.\n if (this.current().kind === \"IDENT\") {\n return this.parseIdent();\n }\n return null;\n }\n\n // \u2500\u2500 Statements \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n parseStatements(): Statement[] {\n const stmts: Statement[] = [];\n while (!this.at(\"EOF\")) {\n if (this.match(\"SEMI\")) continue;\n stmts.push(this.parseStatement());\n this.match(\"SEMI\");\n }\n return stmts;\n }\n\n parseStatement(): Statement {\n if (this.match(\"EXPLAIN\")) {\n let queryPlan = false;\n if (this.match(\"QUERY\")) {\n this.expect(\"PLAN\");\n queryPlan = true;\n }\n const stmt = this.parseStatement();\n return { type: \"explain\", queryPlan, statement: stmt };\n }\n\n if (this.check(\"WITH\", \"SELECT\")) return this.parseSelectStmt();\n if (this.at(\"SELECT\")) return this.parseSelectStmt();\n\n if (this.check(\"WITH\", \"INSERT\") || this.at(\"INSERT\") || this.at(\"REPLACE\")) {\n return this.parseInsertStmt();\n }\n if (this.check(\"WITH\", \"UPDATE\") || this.at(\"UPDATE\")) return this.parseUpdateStmt();\n if (this.check(\"WITH\", \"DELETE\") || this.at(\"DELETE\")) return this.parseDeleteStmt();\n\n if (this.at(\"CREATE\")) return this.parseCreateStmt();\n if (this.at(\"DROP\")) return this.parseDropStmt();\n if (this.at(\"ALTER\")) return this.parseAlterTableStmt();\n\n if (this.at(\"BEGIN\")) return this.parseBeginStmt();\n if (this.check(\"COMMIT\", \"END\")) return this.parseCommitStmt();\n if (this.at(\"ROLLBACK\")) return this.parseRollbackStmt();\n if (this.at(\"SAVEPOINT\")) return this.parseSavepointStmt();\n if (this.at(\"RELEASE\")) return this.parseReleaseStmt();\n if (this.at(\"PRAGMA\")) return this.parsePragmaStmt();\n\n if (this.at(\"ATTACH\")) return this.parseAttachStmt();\n if (this.at(\"DETACH\")) return this.parseDetachStmt();\n\n if (this.at(\"ANALYZE\")) return this.parseAnalyzeStmt();\n if (this.at(\"REINDEX\")) return this.parseReindexStmt();\n if (this.at(\"VACUUM\")) return this.parseVacuumStmt();\n\n this.syntaxError(`unexpected token ${this.current().kind}`);\n }\n\n private parseAnalyzeStmt(): import(\"../ast/nodes.ts\").AnalyzeStmt {\n this.expect(\"ANALYZE\");\n if (this.at(\"SEMI\") || this.at(\"EOF\")) return { type: \"analyze\", schema: null, name: null };\n const first = this.parseIdent();\n if (this.match(\"DOT\")) {\n return { type: \"analyze\", schema: first, name: this.parseIdent() };\n }\n return { type: \"analyze\", schema: null, name: first };\n }\n\n private parseReindexStmt(): import(\"../ast/nodes.ts\").ReindexStmt {\n this.expect(\"REINDEX\");\n if (this.at(\"SEMI\") || this.at(\"EOF\")) return { type: \"reindex\", schema: null, name: null };\n const first = this.parseIdent();\n if (this.match(\"DOT\")) {\n return { type: \"reindex\", schema: first, name: this.parseIdent() };\n }\n return { type: \"reindex\", schema: null, name: first };\n }\n\n private parseVacuumStmt(): import(\"../ast/nodes.ts\").VacuumStmt {\n this.expect(\"VACUUM\");\n let schema: string | null = null;\n if (this.at(\"IDENT\") || this.at(\"STRING\")) {\n // VACUUM schema_name \u2014 but INTO starts with keyword\n if (!this.at(\"INTO\")) schema = this.parseIdent();\n }\n let into: string | null = null;\n if (this.match(\"INTO\")) {\n into = this.at(\"STRING\") ? String(this.advance().value) : this.parseIdent();\n }\n return { type: \"vacuum\", schema, into };\n }\n\n private parseWithClause(): WithClause {\n this.expect(\"WITH\");\n const recursive = this.match(\"RECURSIVE\");\n const ctes: Cte[] = [];\n do {\n const name = this.parseIdent();\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n this.expect(\"AS\");\n if (this.match(\"NOT\")) this.expect(\"MATERIALIZED\", \"expected MATERIALIZED after NOT\");\n else this.match(\"MATERIALIZED\");\n this.expect(\"LPAREN\");\n const select = this.at(\"VALUES\") ? this.parseValuesAsSelect() : this.parseSelectCore();\n this.expect(\"RPAREN\");\n ctes.push({ name, columns, select });\n } while (this.match(\"COMMA\"));\n return { recursive, ctes };\n }\n\n private parseOptionalWith(): WithClause | null {\n return this.at(\"WITH\") ? this.parseWithClause() : null;\n }\n\n // \u2500\u2500 SELECT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n parseSelectStmt(): SelectStmt {\n const withClause = this.parseOptionalWith();\n const select = this.parseSelectCore();\n select.with = withClause;\n return select;\n }\n\n private parseSelectCore(): SelectStmt {\n this.expect(\"SELECT\");\n const distinct = this.match(\"DISTINCT\");\n this.match(\"ALL\");\n\n if (this.at(\"FROM\")) {\n throw new SqliteError('near \"FROM\": syntax error', \"syntax\");\n }\n const columns = this.parseResultColumns();\n let from: FromItem | null = null;\n if (this.match(\"FROM\")) {\n from = this.parseFromItem();\n }\n\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n\n const groupBy: Expr[] = [];\n if (this.match(\"GROUP\")) {\n this.expect(\"BY\");\n do {\n groupBy.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n\n let having: Expr | null = null;\n if (this.match(\"HAVING\")) having = this.parseExpr();\n\n const windows: { name: string; spec: WindowSpec }[] = [];\n if (this.match(\"WINDOW\")) {\n do {\n const name = this.parseIdent();\n this.expect(\"AS\");\n this.expect(\"LPAREN\");\n const spec = this.parseWindowSpec();\n this.expect(\"RPAREN\");\n windows.push({ name, spec });\n } while (this.match(\"COMMA\"));\n }\n\n const orderBy = this.parseOrderBy();\n const limit = this.parseLimit();\n\n const stmt: SelectStmt = {\n type: \"select\",\n with: null,\n distinct,\n columns,\n from,\n where,\n groupBy,\n having,\n windows,\n orderBy,\n limit,\n compound: null,\n };\n\n if (this.check(\"UNION\", \"INTERSECT\", \"EXCEPT\")) {\n stmt.compound = this.parseCompoundTail();\n // ORDER BY and LIMIT following a compound SELECT apply to the entire\n // compound, even though the recursive parser initially attaches them\n // to its right-most arm.\n if (stmt.compound.select.orderBy.length > 0) {\n stmt.orderBy = stmt.compound.select.orderBy;\n stmt.compound.select.orderBy = [];\n }\n if (stmt.compound.select.limit) {\n stmt.limit = stmt.compound.select.limit;\n stmt.compound.select.limit = null;\n }\n }\n\n return stmt;\n }\n\n private parseCompoundTail(): CompoundTail {\n let op: CompoundTail[\"op\"];\n if (this.match(\"UNION\")) {\n op = this.match(\"ALL\") ? \"UNION ALL\" : \"UNION\";\n } else if (this.match(\"INTERSECT\")) {\n op = \"INTERSECT\";\n } else {\n this.expect(\"EXCEPT\");\n op = \"EXCEPT\";\n }\n const select = this.parseSelectCore();\n return { op, select };\n }\n\n private parseResultColumns(): ResultColumn[] {\n const cols: ResultColumn[] = [];\n do {\n if (this.match(\"STAR\")) {\n cols.push({ type: \"star\", table: null });\n } else if (this.check(\"IDENT\") || IDENT_KEYWORDS.has(this.current().kind)) {\n const saved = this.pos;\n const first = this.parseIdent();\n if (this.match(\"DOT\") && this.at(\"STAR\")) {\n this.advance();\n cols.push({ type: \"star\", table: first });\n } else {\n this.pos = saved;\n const expr = this.parseExpr();\n let alias: string | null = null;\n if (this.match(\"AS\")) alias = this.parseIdent();\n else if (\n this.current().kind === \"IDENT\" ||\n (IDENT_KEYWORDS.has(this.current().kind) && !this.isSelectClauseStart())\n ) {\n alias = this.parseIdent();\n }\n cols.push({ type: \"expr\", expr, alias });\n }\n } else {\n const expr = this.parseExpr();\n let alias: string | null = null;\n if (this.match(\"AS\")) alias = this.parseIdent();\n else if (\n this.current().kind === \"IDENT\" ||\n (IDENT_KEYWORDS.has(this.current().kind) && !this.isSelectClauseStart())\n ) {\n alias = this.parseIdent();\n }\n cols.push({ type: \"expr\", expr, alias });\n }\n } while (this.match(\"COMMA\"));\n return cols;\n }\n\n private isSelectClauseStart(): boolean {\n return this.check(\n \"FROM\",\n \"WHERE\",\n \"GROUP\",\n \"HAVING\",\n \"WINDOW\",\n \"ORDER\",\n \"LIMIT\",\n \"UNION\",\n \"INTERSECT\",\n \"EXCEPT\",\n \"COMMA\",\n \"SEMI\",\n \"EOF\",\n \"RPAREN\",\n );\n }\n\n private parseFromItem(): FromItem {\n let left = this.parseFromPrimary();\n while (true) {\n if (this.match(\"COMMA\")) {\n const right = this.parseFromPrimary();\n left = this.makeJoin(left, right, \"CROSS\", null, null);\n continue;\n }\n const joinInfo = this.parseJoinOp();\n if (!joinInfo) break;\n const right = this.parseFromPrimary();\n let on: Expr | null = null;\n let using: string[] | null = null;\n if (joinInfo.natural) {\n using = [];\n } else if (this.match(\"ON\")) {\n on = this.parseExpr();\n } else if (this.match(\"USING\")) {\n this.expect(\"LPAREN\");\n using = [];\n do {\n using.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n } else if (joinInfo.type !== \"CROSS\" && joinInfo.type !== \"INNER\") {\n this.syntaxError(\"expected ON or USING after JOIN\");\n }\n left = this.makeJoin(left, right, joinInfo.type, on, using);\n }\n return left;\n }\n\n private makeJoin(\n left: FromItem,\n right: FromItem,\n joinType: JoinFrom[\"joinType\"],\n on: Expr | null,\n using: string[] | null,\n ): JoinFrom {\n return { type: \"join\", left, right, joinType, on, using };\n }\n\n private parseJoinOp(): { type: JoinFrom[\"joinType\"]; natural: boolean } | null {\n const natural = this.match(\"NATURAL\");\n if (this.match(\"CROSS\")) {\n this.expect(\"JOIN\");\n return { type: \"CROSS\", natural: false };\n }\n let type: JoinFrom[\"joinType\"] = \"INNER\";\n if (this.match(\"INNER\")) type = \"INNER\";\n else if (this.match(\"LEFT\")) type = \"LEFT\";\n else if (this.match(\"RIGHT\")) type = \"RIGHT\";\n else if (this.match(\"FULL\")) type = \"FULL\";\n if (type !== \"INNER\" || this.at(\"OUTER\") || this.at(\"JOIN\")) {\n this.match(\"OUTER\");\n if (!this.match(\"JOIN\")) return null;\n return { type, natural };\n }\n if (this.match(\"JOIN\")) return { type: \"INNER\", natural };\n if (natural) this.syntaxError(\"expected JOIN after NATURAL\");\n return null;\n }\n\n private parseFromPrimary(): FromItem {\n if (this.match(\"LPAREN\")) {\n if (this.at(\"SELECT\") || this.at(\"WITH\") || this.at(\"VALUES\")) {\n const select = this.at(\"SELECT\") || this.at(\"WITH\") ? this.parseSelectStmt() : this.parseValuesAsSelect();\n this.expect(\"RPAREN\");\n const alias = this.optionalAlias() ?? (this.syntaxError(\"subquery in FROM requires an alias\") as never);\n return { type: \"subquery\", select, alias };\n }\n const item = this.parseFromItem();\n this.expect(\"RPAREN\");\n const alias = this.optionalAlias();\n if (alias && item.type === \"table\") item.alias = alias;\n return item;\n }\n\n const qname = this.parseQualifiedTableName();\n if (this.match(\"LPAREN\")) {\n const name = qname.name;\n const args: Expr[] = [];\n if (!this.at(\"RPAREN\")) {\n do {\n args.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n this.expect(\"RPAREN\");\n const alias = this.optionalAlias();\n return { type: \"table_func\", name, args, alias };\n }\n\n const alias = this.optionalAlias();\n if (this.match(\"INDEXED\")) {\n this.expect(\"BY\");\n this.parseIdent(); // index hint \u2014 planner is a no-op\n } else if (this.match(\"NOT\") && this.at(\"INDEXED\")) {\n this.advance(); // INDEXED\n }\n return {\n type: \"table\",\n schema: qname.schema,\n name: qname.name,\n alias,\n } satisfies TableRef;\n }\n\n private parseValuesAsSelect(): SelectStmt {\n this.expect(\"VALUES\");\n const rows: Expr[][] = [];\n do {\n this.expect(\"LPAREN\");\n const row: Expr[] = [];\n do {\n row.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n rows.push(row);\n } while (this.match(\"COMMA\"));\n\n const selectFor = (row: Expr[]): SelectStmt => ({\n type: \"select\",\n with: null,\n distinct: false,\n columns: row.map((expr) => ({ type: \"expr\" as const, expr, alias: null })),\n from: null,\n where: null,\n groupBy: [],\n having: null,\n windows: [],\n orderBy: [],\n limit: null,\n compound: null,\n });\n const result = selectFor(rows[0] ?? []);\n let current = result;\n for (const row of rows.slice(1)) {\n current.compound = { op: \"UNION ALL\", select: selectFor(row) };\n current = current.compound.select;\n }\n if (this.check(\"UNION\", \"INTERSECT\", \"EXCEPT\")) {\n current.compound = this.parseCompoundTail();\n }\n return result;\n }\n\n private parseOrderBy(): OrderByItem[] {\n if (!this.match(\"ORDER\")) return [];\n this.expect(\"BY\");\n const items: OrderByItem[] = [];\n do {\n const expr = this.parseExpr();\n let dir: \"ASC\" | \"DESC\" = \"ASC\";\n if (this.match(\"ASC\")) dir = \"ASC\";\n else if (this.match(\"DESC\")) dir = \"DESC\";\n let nulls: \"FIRST\" | \"LAST\" | null = null;\n if (this.match(\"NULLS\")) {\n if (this.match(\"FIRST\")) nulls = \"FIRST\";\n else if (this.match(\"LAST\")) nulls = \"LAST\";\n else this.syntaxError(\"expected FIRST or LAST after NULLS\");\n }\n items.push({ expr, dir, nulls });\n } while (this.match(\"COMMA\"));\n return items;\n }\n\n private parseLimit(): LimitClause | null {\n if (!this.match(\"LIMIT\")) return null;\n const first = this.parseExpr();\n if (this.match(\"OFFSET\")) {\n return { limit: first, offset: this.parseExpr() };\n }\n if (this.match(\"COMMA\")) {\n const limit = this.parseExpr();\n return { limit, offset: first };\n }\n let offset: Expr | null = null;\n if (this.match(\"OFFSET\")) offset = this.parseExpr();\n return { limit: first, offset };\n }\n\n // \u2500\u2500 INSERT / REPLACE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseInsertStmt(): InsertStmt {\n const withClause = this.parseOptionalWith();\n let mode: InsertStmt[\"mode\"] = \"insert\";\n\n if (this.match(\"REPLACE\")) {\n mode = \"replace\";\n } else {\n this.expect(\"INSERT\");\n const orAction = this.parseOrConflict();\n if (orAction === \"REPLACE\") mode = \"insert_or_replace\";\n else if (orAction === \"IGNORE\") mode = \"insert_or_ignore\";\n else if (orAction === \"ABORT\") mode = \"insert_or_abort\";\n else if (orAction === \"ROLLBACK\") mode = \"insert_or_rollback\";\n else if (orAction === \"FAIL\") mode = \"insert_or_fail\";\n }\n\n this.expect(\"INTO\");\n const table = this.parseTableName();\n\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n\n let values: Expr[][] | null = null;\n let select: SelectStmt | null = null;\n\n if (this.match(\"VALUES\")) {\n values = [];\n do {\n this.expect(\"LPAREN\");\n const row: Expr[] = [];\n do {\n row.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n values.push(row);\n } while (this.match(\"COMMA\"));\n } else if (this.at(\"SELECT\") || this.at(\"WITH\")) {\n select = this.parseSelectStmt();\n } else if (this.at(\"DEFAULT\")) {\n this.advance();\n this.expect(\"VALUES\");\n columns = [];\n values = [[]];\n } else {\n this.syntaxError(\"expected VALUES, SELECT, or DEFAULT\");\n }\n\n const upsert = this.parseUpsertClause();\n const returning = this.parseReturning();\n\n return {\n type: \"insert\",\n with: withClause,\n mode,\n table,\n columns,\n values,\n select,\n upsert,\n returning,\n };\n }\n\n private parseUpsertClause(): UpsertClause | null {\n if (!this.match(\"ON\")) return null;\n this.expect(\"CONFLICT\");\n let targetColumns: string[] | null = null;\n let targetExprs: Expr[] | null = null;\n if (this.match(\"LPAREN\")) {\n targetColumns = [];\n targetExprs = [];\n do {\n const expr = this.parseExprPrec(PREC.ADD);\n targetExprs.push(expr);\n targetColumns.push(expr.type === \"column\" ? expr.name : \"\");\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n let targetWhere: Expr | null = null;\n if (this.match(\"WHERE\")) targetWhere = this.parseExpr();\n\n this.expect(\"DO\");\n if (this.match(\"NOTHING\")) {\n return { targetColumns, targetExprs, targetWhere, action: \"nothing\" };\n }\n this.expect(\"UPDATE\");\n this.expect(\"SET\");\n const set = this.parseSetItems();\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n return { targetColumns, targetExprs, targetWhere, action: { set, where } };\n }\n\n private parseSetItems(): SetItem[] {\n const items: SetItem[] = [];\n do {\n const columns = [this.parseIdent()];\n this.expect(\"EQ\");\n const expr = this.parseExpr();\n items.push({ columns, expr });\n } while (this.match(\"COMMA\"));\n return items;\n }\n\n private parseReturning(): ResultColumn[] {\n if (!this.match(\"RETURNING\")) return [];\n return this.parseResultColumns();\n }\n\n // \u2500\u2500 UPDATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseUpdateStmt(): UpdateStmt {\n const withClause = this.parseOptionalWith();\n this.expect(\"UPDATE\");\n const or = this.mapUpdateOr(this.parseOrConflict());\n const table = this.parseTableName();\n const alias = this.optionalAlias();\n this.expect(\"SET\");\n const set = this.parseSetItems();\n let from: FromItem | null = null;\n if (this.match(\"FROM\")) from = this.parseFromItem();\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n const returning = this.parseReturning();\n return { type: \"update\", with: withClause, or, table, alias, set, from, where, returning };\n }\n\n // \u2500\u2500 DELETE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseDeleteStmt(): DeleteStmt {\n const withClause = this.parseOptionalWith();\n this.expect(\"DELETE\");\n this.expect(\"FROM\");\n const table = this.parseTableName();\n const alias = this.optionalAlias();\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n const returning = this.parseReturning();\n return { type: \"delete\", with: withClause, table, alias, where, returning };\n }\n\n // \u2500\u2500 CREATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseCreateStmt(): Statement {\n this.expect(\"CREATE\");\n const temp = this.match(\"TEMP\") || this.match(\"TEMPORARY\");\n if (this.match(\"VIRTUAL\")) {\n this.expect(\"TABLE\");\n return this.parseCreateVirtualTable();\n }\n if (this.match(\"TRIGGER\")) return this.parseCreateTrigger(temp);\n if (this.match(\"UNIQUE\")) {\n this.expect(\"INDEX\");\n return this.parseCreateIndex(true, temp);\n }\n if (this.match(\"INDEX\")) return this.parseCreateIndex(false, temp);\n if (this.match(\"VIEW\")) return this.parseCreateView(temp);\n this.expect(\"TABLE\");\n return this.parseCreateTable(temp);\n }\n\n private parseCreateVirtualTable(): CreateVirtualTableStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseTableName();\n this.expect(\"USING\");\n const module = this.parseIdent();\n const moduleArgs: string[] = [];\n if (this.match(\"LPAREN\")) {\n if (!this.at(\"RPAREN\")) {\n do {\n moduleArgs.push(this.parseVirtualTableArg());\n } while (this.match(\"COMMA\"));\n }\n this.expect(\"RPAREN\");\n }\n return { type: \"create_virtual_table\", ifNotExists, name, module, moduleArgs };\n }\n\n /** One comma-separated CREATE VIRTUAL TABLE module argument (FTS options, columns, \u2026). */\n private parseVirtualTableArg(): string {\n // STRING alone\n if (this.at(\"STRING\")) {\n const value = String(this.current().literal);\n this.advance();\n return value;\n }\n\n // IDENT [UNINDEXED|NOTINDEXED] | IDENT = value\n const start = this.parseIdentOrQuoted();\n if (this.match(\"EQ\") || this.match(\"EQEQ\")) {\n const value = this.parseVirtualTableOptionValue();\n return `${start}=${value}`;\n }\n // Optional UNINDEXED / NOTINDEXED / type names\n const extras: string[] = [];\n while (this.at(\"IDENT\") || this.at(\"STRING\")) {\n // Stop before next comma-separated arg would need peek of COMMA/RPAREN \u2014 only consume trailing idents\n if (this.at(\"IDENT\")) {\n const upper = this.current().value.toUpperCase();\n if (\n upper === \"UNINDEXED\" ||\n upper === \"NOTINDEXED\" ||\n upper === \"TEXT\" ||\n upper === \"INTEGER\" ||\n upper === \"REAL\" ||\n upper === \"BLOB\" ||\n upper === \"NUMERIC\"\n ) {\n extras.push(this.current().value);\n this.advance();\n continue;\n }\n }\n break;\n }\n return extras.length ? `${start} ${extras.join(\" \")}` : start;\n }\n\n private parseIdentOrQuoted(): string {\n if (this.at(\"STRING\")) {\n // quoted identifier written as string in some dialects\n const value = String(this.current().literal);\n this.advance();\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n }\n return this.parseIdent();\n }\n\n private parseVirtualTableOptionValue(): string {\n if (this.at(\"STRING\")) {\n const value = String(this.current().literal);\n this.advance();\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n }\n if (this.at(\"NUMBER\")) {\n const value = this.current().value;\n this.advance();\n return value;\n }\n if (this.at(\"IDENT\")) {\n return this.parseIdent();\n }\n // Empty string after content=\n return \"''\";\n }\n\n private parseIfNotExists(): boolean {\n if (!this.match(\"IF\")) return false;\n this.expect(\"NOT\");\n this.expect(\"EXISTS\");\n return true;\n }\n\n private parseIfExists(): boolean {\n if (!this.match(\"IF\")) return false;\n this.expect(\"EXISTS\");\n return true;\n }\n\n private mapUpdateOr(action: ConflictAction | null): UpdateStmt[\"or\"] {\n if (!action) return null;\n switch (action) {\n case \"ROLLBACK\":\n return \"rollback\";\n case \"ABORT\":\n return \"abort\";\n case \"FAIL\":\n return \"fail\";\n case \"IGNORE\":\n return \"ignore\";\n case \"REPLACE\":\n return \"replace\";\n }\n }\n\n private parseCreateTable(temp: boolean): CreateTableStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseTableName();\n\n if (this.match(\"AS\")) {\n const asSelect = this.parseSelectStmt();\n return {\n type: \"create_table\",\n ifNotExists,\n temp,\n name,\n columns: [],\n constraints: [],\n asSelect,\n withoutRowid: false,\n strict: false,\n };\n }\n\n this.expect(\"LPAREN\");\n const columns: ColumnDef[] = [];\n const constraints: TableConstraint[] = [];\n do {\n if (this.at(\"PRIMARY\") || this.at(\"UNIQUE\") || this.at(\"CHECK\") || this.at(\"FOREIGN\") || this.at(\"CONSTRAINT\")) {\n constraints.push(this.parseTableConstraint());\n } else {\n columns.push(this.parseColumnDef());\n }\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n let withoutRowid = false;\n let strict = false;\n while (!this.at(\"SEMI\") && !this.at(\"EOF\")) {\n if (this.match(\"WITHOUT\")) {\n const word = this.parseIdent();\n if (word.toUpperCase() !== \"ROWID\") this.syntaxError(\"expected ROWID after WITHOUT\");\n withoutRowid = true;\n } else {\n const word = this.parseIdent();\n if (word.toUpperCase() !== \"STRICT\") this.syntaxError(`unexpected table option ${word}`);\n strict = true;\n }\n this.match(\"COMMA\");\n }\n\n return {\n type: \"create_table\",\n ifNotExists,\n temp,\n name,\n columns,\n constraints,\n asSelect: null,\n withoutRowid,\n strict,\n };\n }\n\n private parseColumnDef(): ColumnDef {\n const name = this.parseIdent();\n let typeName: string | null = null;\n if (this.current().kind === \"IDENT\" || IDENT_KEYWORDS.has(this.current().kind)) {\n if (\n !this.at(\"CONSTRAINT\") &&\n !this.at(\"PRIMARY\") &&\n !this.at(\"NOT\") &&\n !this.at(\"UNIQUE\") &&\n !this.at(\"CHECK\") &&\n !this.at(\"DEFAULT\") &&\n !this.at(\"REFERENCES\") &&\n !this.at(\"COLLATE\") &&\n !this.at(\"GENERATED\") &&\n !this.at(\"COMMA\") &&\n !this.at(\"RPAREN\")\n ) {\n typeName = this.parseTypeName();\n }\n }\n const constraints: ColumnConstraint[] = [];\n while (this.isColumnConstraintStart()) {\n constraints.push(this.parseColumnConstraint());\n }\n return { name, typeName, constraints };\n }\n\n /** Type names may include optional precision/scale: VARCHAR(10), DECIMAL(10,2). */\n private parseTypeName(): string {\n const base = this.parseIdent();\n if (!this.match(\"LPAREN\")) return base;\n const parts: string[] = [];\n do {\n if (this.at(\"NUMBER\") || this.at(\"PLUS\") || this.at(\"MINUS\")) {\n let sign = \"\";\n if (this.match(\"PLUS\")) sign = \"+\";\n else if (this.match(\"MINUS\")) sign = \"-\";\n const number = this.advance();\n parts.push(`${sign}${number.value}`);\n } else {\n parts.push(this.parseIdent());\n }\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n return `${base}(${parts.join(\",\")})`;\n }\n\n private isColumnConstraintStart(): boolean {\n return this.check(\n \"CONSTRAINT\",\n \"PRIMARY\",\n \"NOT\",\n \"UNIQUE\",\n \"CHECK\",\n \"DEFAULT\",\n \"COLLATE\",\n \"REFERENCES\",\n \"GENERATED\",\n );\n }\n\n private parseColumnConstraint(): ColumnConstraint {\n this.match(\"CONSTRAINT\");\n if (this.current().kind === \"IDENT\" || IDENT_KEYWORDS.has(this.current().kind)) {\n const next = this.peek();\n if (\n next.kind === \"PRIMARY\" ||\n next.kind === \"UNIQUE\" ||\n next.kind === \"CHECK\" ||\n next.kind === \"DEFAULT\" ||\n next.kind === \"NOT\" ||\n next.kind === \"REFERENCES\"\n ) {\n this.parseIdent(); // constraint name, discarded for column level\n }\n }\n if (this.match(\"PRIMARY\")) {\n this.expect(\"KEY\");\n let order: \"ASC\" | \"DESC\" | null = null;\n if (this.match(\"ASC\")) order = \"ASC\";\n else if (this.match(\"DESC\")) order = \"DESC\";\n const autoincrement = this.match(\"AUTOINCREMENT\");\n const conflict = this.parseOnConflict();\n return { type: \"primary_key\", order, autoincrement, conflict };\n }\n if (this.match(\"NOT\")) {\n this.expect(\"NULL\");\n const conflict = this.parseOnConflict();\n return { type: \"not_null\", conflict };\n }\n if (this.match(\"UNIQUE\")) {\n const conflict = this.parseOnConflict();\n return { type: \"unique\", conflict };\n }\n if (this.match(\"CHECK\")) {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"RPAREN\");\n return { type: \"check\", expr };\n }\n if (this.match(\"DEFAULT\")) {\n const expr = this.parseExpr();\n return { type: \"default\", expr };\n }\n if (this.match(\"COLLATE\")) {\n const name = this.parseIdent();\n return { type: \"collate\", name };\n }\n if (this.match(\"REFERENCES\")) {\n return this.parseReferencesConstraint();\n }\n if (this.match(\"GENERATED\")) {\n const always = this.parseIdent();\n if (always.toUpperCase() !== \"ALWAYS\") this.syntaxError(\"expected ALWAYS after GENERATED\");\n this.expect(\"AS\");\n return this.parseGeneratedConstraint();\n }\n if (this.match(\"AS\") && this.at(\"LPAREN\")) {\n return this.parseGeneratedConstraint();\n }\n this.syntaxError(\"expected column constraint\");\n }\n\n private parseGeneratedConstraint(): ColumnConstraint {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"RPAREN\");\n let stored = false;\n if (this.current().kind === \"IDENT\" || this.at(\"VIRTUAL\")) {\n const word = this.parseIdent().toUpperCase();\n if (word === \"STORED\") stored = true;\n else if (word === \"VIRTUAL\") stored = false;\n else this.syntaxError(\"expected STORED or VIRTUAL after generated column expression\");\n }\n return { type: \"generated\", expr, stored };\n }\n\n private parseReferencesConstraint(): ColumnConstraint {\n const table = this.parseTableName();\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n const { onDelete, onUpdate } = this.parseFkActions();\n const { deferrable, initiallyDeferred } = this.parseDeferrable();\n return { type: \"references\", table, columns, onDelete, onUpdate, deferrable, initiallyDeferred };\n }\n\n private parseTableConstraint(): TableConstraint {\n let name: string | null = null;\n if (this.match(\"CONSTRAINT\")) {\n name = this.parseIdent();\n }\n if (this.match(\"PRIMARY\")) {\n this.expect(\"KEY\");\n this.expect(\"LPAREN\");\n const columns = this.parseIndexedColumns();\n this.expect(\"RPAREN\");\n const conflict = this.parseOnConflict();\n return { type: \"primary_key\", columns, conflict };\n }\n if (this.match(\"UNIQUE\")) {\n this.expect(\"LPAREN\");\n const columns = this.parseIndexedColumns();\n this.expect(\"RPAREN\");\n const conflict = this.parseOnConflict();\n return { type: \"unique\", columns, conflict, name };\n }\n if (this.match(\"CHECK\")) {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"RPAREN\");\n return { type: \"check\", expr, name };\n }\n if (this.match(\"FOREIGN\")) {\n this.expect(\"KEY\");\n this.expect(\"LPAREN\");\n const columns: string[] = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n this.expect(\"REFERENCES\");\n const refTable = this.parseTableName();\n let refColumns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n refColumns = [];\n do {\n refColumns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n const { onDelete, onUpdate } = this.parseFkActions();\n const { deferrable, initiallyDeferred } = this.parseDeferrable();\n return {\n type: \"foreign_key\",\n columns,\n refTable,\n refColumns,\n onDelete,\n onUpdate,\n name,\n deferrable,\n initiallyDeferred,\n };\n }\n this.syntaxError(\"expected table constraint\");\n }\n\n private parseIndexedColumns(): IndexedColumn[] {\n const cols: IndexedColumn[] = [];\n do {\n const expr = this.parseExprPrec(PREC.ADD);\n let collate: string | null = null;\n let inner = expr;\n if (inner.type === \"collate\") {\n collate = inner.collation;\n inner = inner.expr;\n }\n if (this.match(\"COLLATE\")) collate = this.parseIdent();\n let order: \"ASC\" | \"DESC\" | null = null;\n if (this.match(\"ASC\")) order = \"ASC\";\n else if (this.match(\"DESC\")) order = \"DESC\";\n if (inner.type === \"column\" && inner.table === null) {\n cols.push({ name: inner.name, collate, order });\n } else {\n cols.push({ name: \"\", collate, order, expr: inner });\n }\n } while (this.match(\"COMMA\"));\n return cols;\n }\n\n private parseOnConflict(): ConflictAction | null {\n if (!this.match(\"ON\")) return null;\n this.expect(\"CONFLICT\");\n return this.parseConflictAction();\n }\n\n private parseConflictAction(): ConflictAction {\n if (this.match(\"ROLLBACK\")) return \"ROLLBACK\";\n if (this.match(\"ABORT\")) return \"ABORT\";\n if (this.match(\"FAIL\")) return \"FAIL\";\n if (this.match(\"IGNORE\")) return \"IGNORE\";\n if (this.match(\"REPLACE\")) return \"REPLACE\";\n this.syntaxError(\"expected conflict action\");\n }\n\n private parseFkAction(kind: \"DELETE\" | \"UPDATE\"): FkAction | null {\n if (!this.match(\"ON\")) return null;\n this.expect(kind);\n if (this.match(\"SET\")) {\n if (this.match(\"NULL\")) return \"SET NULL\";\n this.expect(\"DEFAULT\");\n return \"SET DEFAULT\";\n }\n if (this.match(\"CASCADE\")) return \"CASCADE\";\n if (this.match(\"RESTRICT\")) return \"RESTRICT\";\n if (this.match(\"NO\")) {\n this.expect(\"ACTION\");\n return \"NO ACTION\";\n }\n this.syntaxError(`expected ON ${kind} action`);\n }\n\n private parseFkActions(): { onDelete: FkAction | null; onUpdate: FkAction | null } {\n let onDelete: FkAction | null = null;\n let onUpdate: FkAction | null = null;\n while (this.at(\"ON\")) {\n if (this.peek().kind === \"DELETE\") onDelete = this.parseFkAction(\"DELETE\");\n else if (this.peek().kind === \"UPDATE\") onUpdate = this.parseFkAction(\"UPDATE\");\n else this.syntaxError(\"expected ON DELETE or ON UPDATE\");\n }\n return { onDelete, onUpdate };\n }\n\n private parseDeferrable(): { deferrable: boolean; initiallyDeferred: boolean } {\n let deferrable = false;\n let initiallyDeferred = false;\n if (this.match(\"NOT\")) {\n this.expect(\"DEFERRABLE\");\n } else if (this.match(\"DEFERRABLE\")) {\n deferrable = true;\n }\n if (this.match(\"INITIALLY\")) {\n if (this.match(\"DEFERRED\")) initiallyDeferred = true;\n else {\n this.expect(\"IMMEDIATE\");\n initiallyDeferred = false;\n }\n }\n return { deferrable, initiallyDeferred: deferrable && initiallyDeferred };\n }\n\n private parseOrConflict(): ConflictAction | null {\n if (!this.match(\"OR\")) return null;\n return this.parseConflictAction();\n }\n\n private parseCreateIndex(unique: boolean, _temp: boolean): CreateIndexStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseIdent();\n this.expect(\"ON\");\n const table = this.parseTableName();\n this.expect(\"LPAREN\");\n const columns = this.parseIndexedColumns();\n this.expect(\"RPAREN\");\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n return { type: \"create_index\", unique, ifNotExists, name, table, columns, where };\n }\n\n private parseCreateView(temp: boolean): CreateViewStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseIdent();\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n this.expect(\"AS\");\n const select = this.parseSelectStmt();\n return { type: \"create_view\", ifNotExists, temp, name, columns, select };\n }\n\n private parseCreateTrigger(temp: boolean): CreateTriggerStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseTableName();\n let timing: CreateTriggerStmt[\"timing\"];\n if (this.match(\"BEFORE\")) timing = \"BEFORE\";\n else if (this.match(\"AFTER\")) timing = \"AFTER\";\n else if (this.match(\"INSTEAD\")) {\n this.expect(\"OF\");\n timing = \"INSTEAD\";\n } else {\n this.syntaxError(\"expected BEFORE, AFTER, or INSTEAD OF\");\n }\n\n let event: CreateTriggerStmt[\"event\"];\n if (this.match(\"INSERT\")) event = \"INSERT\";\n else if (this.match(\"DELETE\")) event = \"DELETE\";\n else if (this.match(\"UPDATE\")) event = \"UPDATE\";\n else this.syntaxError(\"expected INSERT, DELETE, or UPDATE\");\n\n let updateColumns: string[] | null = null;\n if (event === \"UPDATE\" && this.match(\"OF\")) {\n updateColumns = [];\n do {\n updateColumns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n }\n\n this.expect(\"ON\");\n const table = this.parseTableName();\n\n let forEachRow = false;\n if (this.match(\"FOR\")) {\n this.expect(\"EACH\");\n this.expect(\"ROW\");\n forEachRow = true;\n }\n\n let when: Expr | null = null;\n if (this.match(\"WHEN\")) when = this.parseExpr();\n\n this.expect(\"BEGIN\");\n const body = this.parseTriggerBody();\n\n return {\n type: \"create_trigger\",\n ifNotExists,\n temp,\n name,\n timing,\n event,\n table,\n updateColumns,\n forEachRow,\n when,\n body,\n };\n }\n\n private parseTriggerBody(): Statement[] {\n const body: Statement[] = [];\n while (!this.at(\"END\") && !this.at(\"EOF\")) {\n if (this.match(\"SEMI\")) continue;\n body.push(this.parseStatement());\n this.match(\"SEMI\");\n }\n this.expect(\"END\");\n return body;\n }\n\n // \u2500\u2500 DROP \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseDropStmt(): Statement {\n this.expect(\"DROP\");\n if (this.match(\"TABLE\")) return this.parseDropTable();\n if (this.match(\"INDEX\")) return this.parseDropIndex();\n if (this.match(\"VIEW\")) return this.parseDropView();\n if (this.match(\"TRIGGER\")) return this.parseDropTrigger();\n this.syntaxError(\"expected TABLE, INDEX, or VIEW after DROP\");\n }\n\n private parseDropTable(): DropTableStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseTableName();\n return { type: \"drop_table\", ifExists, name };\n }\n\n private parseDropIndex(): DropIndexStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseIdent();\n return { type: \"drop_index\", ifExists, name };\n }\n\n private parseDropView(): DropViewStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseIdent();\n return { type: \"drop_view\", ifExists, name };\n }\n\n private parseDropTrigger(): DropTriggerStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseTableName();\n return { type: \"drop_trigger\", ifExists, name };\n }\n\n // \u2500\u2500 ALTER TABLE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseAlterTableStmt(): AlterTableStmt {\n this.expect(\"ALTER\");\n this.expect(\"TABLE\");\n const table = this.parseTableName();\n if (this.match(\"RENAME\")) {\n if (this.match(\"TO\")) {\n const newName = this.parseTableName();\n return { type: \"alter_table\", table, action: { kind: \"rename_table\", newName } };\n }\n if (this.match(\"COLUMN\")) {\n const oldName = this.parseIdent();\n this.expect(\"TO\");\n const newName = this.parseIdent();\n return { type: \"alter_table\", table, action: { kind: \"rename_column\", oldName, newName } };\n }\n this.syntaxError(\"expected TO or COLUMN after RENAME\");\n }\n if (this.match(\"ADD\")) {\n this.match(\"COLUMN\");\n const column = this.parseColumnDef();\n return { type: \"alter_table\", table, action: { kind: \"add_column\", column } };\n }\n if (this.match(\"DROP\")) {\n this.match(\"COLUMN\");\n const name = this.parseIdent();\n return { type: \"alter_table\", table, action: { kind: \"drop_column\", name } };\n }\n this.syntaxError(\"expected RENAME, ADD, or DROP after ALTER TABLE\");\n }\n\n // \u2500\u2500 Transactions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseBeginStmt(): BeginStmt {\n this.expect(\"BEGIN\");\n let mode: BeginStmt[\"mode\"] = null;\n if (this.match(\"DEFERRED\")) mode = \"DEFERRED\";\n else if (this.match(\"IMMEDIATE\")) mode = \"IMMEDIATE\";\n else if (this.match(\"EXCLUSIVE\")) mode = \"EXCLUSIVE\";\n this.match(\"TRANSACTION\");\n return { type: \"begin\", mode };\n }\n\n private parseCommitStmt(): CommitStmt {\n if (this.at(\"END\")) this.advance();\n else this.expect(\"COMMIT\");\n this.match(\"TRANSACTION\");\n return { type: \"commit\" };\n }\n\n private parseRollbackStmt(): RollbackStmt {\n this.expect(\"ROLLBACK\");\n this.match(\"TRANSACTION\");\n let savepoint: string | null = null;\n if (this.match(\"TO\")) {\n this.match(\"SAVEPOINT\");\n savepoint = this.parseIdent();\n }\n return { type: \"rollback\", savepoint };\n }\n\n private parseSavepointStmt(): SavepointStmt {\n this.expect(\"SAVEPOINT\");\n const name = this.parseIdent();\n return { type: \"savepoint\", name };\n }\n\n private parseReleaseStmt(): ReleaseStmt {\n this.expect(\"RELEASE\");\n this.match(\"SAVEPOINT\");\n const name = this.parseIdent();\n return { type: \"release\", name };\n }\n\n // \u2500\u2500 PRAGMA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parsePragmaStmt(): PragmaStmt {\n this.expect(\"PRAGMA\");\n const name = this.parseIdent();\n if (this.match(\"EQ\")) {\n return { type: \"pragma\", name, value: this.parseExpr() };\n }\n if (this.match(\"LPAREN\")) {\n let value: Expr | null = null;\n if (!this.at(\"RPAREN\")) value = this.parseExpr();\n this.expect(\"RPAREN\");\n return { type: \"pragma\", name, value };\n }\n return { type: \"pragma\", name, value: null };\n }\n\n // \u2500\u2500 Expressions (Pratt / precedence climbing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n parseExpr(): Expr {\n return this.parseExprPrec(PREC.OR);\n }\n\n private parseExprPrec(minPrec: number): Expr {\n let left = this.parseUnaryExpr();\n\n while (true) {\n left = this.parsePostfix(left);\n\n if (this.at(\"NOT\") && PREC.IS_IN_LIKE >= minPrec) {\n const n = this.peek();\n if (n.kind === \"IN\") {\n this.advance();\n this.advance();\n left = this.parseInRhs(left, true);\n continue;\n }\n if (n.kind === \"LIKE\") {\n this.advance();\n this.advance();\n left = this.parseLikeRhs(left, true, \"LIKE\");\n continue;\n }\n if (n.kind === \"GLOB\") {\n this.advance();\n this.advance();\n left = this.parseLikeRhs(left, true, \"GLOB\");\n continue;\n }\n if (n.kind === \"BETWEEN\") {\n this.advance();\n this.advance();\n const lower = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n this.expect(\"AND\");\n const upper = this.parseExprPrec(PREC.AND + 1);\n left = { type: \"between\", not: true, expr: left, lower, upper };\n continue;\n }\n }\n\n if (this.at(\"IS\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n if (this.at(\"NOT\") && this.peek().kind === \"DISTINCT\") {\n this.advance();\n this.advance();\n this.expect(\"FROM\");\n const right = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = { type: \"binary\", op: \"IS NOT DISTINCT FROM\", left, right };\n continue;\n }\n if (this.at(\"DISTINCT\")) {\n this.advance();\n this.expect(\"FROM\");\n const right = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = { type: \"binary\", op: \"IS DISTINCT FROM\", left, right };\n continue;\n }\n const not = this.match(\"NOT\");\n const right = this.parseIsRhs();\n left = { type: \"binary\", op: not ? \"IS NOT\" : \"IS\", left, right };\n continue;\n }\n\n if (this.at(\"IN\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n left = this.parseInRhs(left, false);\n continue;\n }\n if (this.at(\"LIKE\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n left = this.parseLikeRhs(left, false, \"LIKE\");\n continue;\n }\n if (this.at(\"GLOB\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n left = this.parseLikeRhs(left, false, \"GLOB\");\n continue;\n }\n if (this.at(\"MATCH\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n const right = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = { type: \"binary\", op: \"MATCH\", left, right };\n continue;\n }\n if (this.at(\"BETWEEN\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n const lower = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n this.expect(\"AND\");\n const upper = this.parseExprPrec(PREC.AND + 1);\n left = { type: \"between\", not: false, expr: left, lower, upper };\n continue;\n }\n\n const bin = this.peekBinaryOp();\n if (!bin || bin.prec < minPrec) break;\n this.advance();\n const right = this.parseExprPrec(bin.prec + 1);\n left = { type: \"binary\", op: bin.op, left, right };\n }\n\n return left;\n }\n\n private peekBinaryOp(): { op: BinaryOp; prec: number } | null {\n const t = this.current();\n switch (t.kind) {\n case \"OR\":\n return { op: \"OR\", prec: PREC.OR };\n case \"AND\":\n return { op: \"AND\", prec: PREC.AND };\n case \"CONCAT\":\n return { op: \"||\", prec: PREC.CONCAT };\n case \"JSON_ARROW\":\n return { op: \"->\", prec: PREC.JSON_ARROW };\n case \"JSON_ARROW2\":\n return { op: \"->>\", prec: PREC.JSON_ARROW };\n case \"PLUS\":\n return { op: \"+\", prec: PREC.ADD };\n case \"MINUS\":\n return { op: \"-\", prec: PREC.ADD };\n case \"STAR\":\n return { op: \"*\", prec: PREC.MUL };\n case \"SLASH\":\n return { op: \"/\", prec: PREC.MUL };\n case \"PERCENT\":\n return { op: \"%\", prec: PREC.MUL };\n case \"LT\":\n return { op: \"<\", prec: PREC.COMPARE };\n case \"LE\":\n return { op: \"<=\", prec: PREC.COMPARE };\n case \"GT\":\n return { op: \">\", prec: PREC.COMPARE };\n case \"GE\":\n return { op: \">=\", prec: PREC.COMPARE };\n case \"EQ\":\n return { op: \"=\", prec: PREC.COMPARE };\n case \"EQEQ\":\n return { op: \"==\", prec: PREC.COMPARE };\n case \"NE\":\n return { op: t.value as \"<>\" | \"!=\", prec: PREC.COMPARE };\n case \"AMP\":\n return { op: \"&\", prec: PREC.BIT_AND };\n case \"PIPE\":\n return { op: \"|\", prec: PREC.BIT_OR };\n case \"LSHIFT\":\n return { op: \"<<\", prec: PREC.SHIFT };\n case \"RSHIFT\":\n return { op: \">>\", prec: PREC.SHIFT };\n default:\n return null;\n }\n }\n\n private parseIsRhs(): Expr {\n if (this.match(\"NULL\")) return { type: \"null\" };\n return this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n }\n\n private parseInRhs(left: Expr, not: boolean): InExpr {\n if (this.match(\"LPAREN\")) {\n if (this.at(\"SELECT\") || this.at(\"WITH\")) {\n const select = this.parseSelectStmt();\n this.expect(\"RPAREN\");\n return { type: \"in\", not, expr: left, values: select };\n }\n const values: Expr[] = [];\n if (!this.at(\"RPAREN\")) {\n do {\n values.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n this.expect(\"RPAREN\");\n return { type: \"in\", not, expr: left, values };\n }\n this.syntaxError(\"expected ( after IN\");\n }\n\n private parseLikeRhs(left: Expr, not: boolean, op: \"LIKE\" | \"GLOB\"): LikeExpr {\n const pattern = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n let escapeExpr: Expr | null = null;\n if (this.match(\"ESCAPE\")) escapeExpr = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n return { type: \"like\", not, op, expr: left, pattern, escape: escapeExpr };\n }\n\n private parsePostfix(expr: Expr): Expr {\n let result = expr;\n while (true) {\n if (this.match(\"COLLATE\")) {\n const collation = this.parseIdent();\n result = { type: \"collate\", expr: result, collation };\n continue;\n }\n if (this.match(\"ISNULL\")) {\n result = { type: \"binary\", op: \"IS\", left: result, right: { type: \"null\" } };\n continue;\n }\n if (this.match(\"NOTNULL\")) {\n result = { type: \"binary\", op: \"IS NOT\", left: result, right: { type: \"null\" } };\n continue;\n }\n break;\n }\n return result;\n }\n\n private parseUnaryExpr(): Expr {\n if (this.match(\"NOT\")) {\n const operand = this.parseUnaryExpr();\n if (operand.type === \"exists\") {\n return { ...operand, not: !operand.not };\n }\n return { type: \"unary\", op: \"NOT\", expr: operand };\n }\n if (this.match(\"PLUS\")) return { type: \"unary\", op: \"+\", expr: this.parseUnaryExpr() };\n if (this.match(\"MINUS\")) return { type: \"unary\", op: \"-\", expr: this.parseUnaryExpr() };\n if (this.match(\"TILDE\")) return { type: \"unary\", op: \"~\", expr: this.parseUnaryExpr() };\n if (this.match(\"EXISTS\")) {\n this.expect(\"LPAREN\");\n const select = this.parseSelectStmt();\n this.expect(\"RPAREN\");\n return { type: \"exists\", not: false, select };\n }\n return this.parsePrimaryExpr();\n }\n\n private parsePrimaryExpr(): Expr {\n const t = this.current();\n\n if (this.match(\"NULL\")) return { type: \"null\" };\n\n if (this.match(\"CASE\")) {\n let base: Expr | null = null;\n if (!this.at(\"WHEN\")) {\n base = this.parseExpr();\n }\n return this.parseCaseExpr(base);\n }\n\n if (this.match(\"CAST\")) {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"AS\");\n const typeName = this.parseTypeName();\n this.expect(\"RPAREN\");\n return { type: \"cast\", expr, typeName };\n }\n\n if (this.at(\"CURRENT_DATE\") || this.at(\"CURRENT_TIME\") || this.at(\"CURRENT_TIMESTAMP\")) {\n const tok = this.advance();\n return { type: \"function\", name: tok.value, distinct: false, args: [], filter: null };\n }\n\n if (this.at(\"NUMBER\")) {\n const tok = this.advance();\n return {\n type: \"literal\",\n value: tok.literal as number | bigint,\n forceReal: tok.forceReal || undefined,\n };\n }\n if (this.at(\"STRING\")) {\n const tok = this.advance();\n return { type: \"literal\", value: tok.literal as string };\n }\n if (this.at(\"BLOB\")) {\n const tok = this.advance();\n return { type: \"literal\", value: tok.literal as Uint8Array };\n }\n\n if (this.at(\"PARAM_POS\")) {\n const tok = this.advance();\n const name = tok.index ?? 1;\n return { type: \"parameter\", name };\n }\n if (this.at(\"PARAM_NAMED\")) {\n const tok = this.advance();\n return { type: \"parameter\", name: tok.value };\n }\n\n if (this.match(\"LPAREN\")) {\n if (this.at(\"SELECT\") || this.at(\"WITH\")) {\n const select = this.parseSelectStmt();\n this.expect(\"RPAREN\");\n return { type: \"subquery\", select };\n }\n if (this.at(\"RPAREN\")) {\n this.syntaxError(\"empty expression\");\n }\n const first = this.parseExpr();\n if (this.match(\"COMMA\")) {\n const values = [first];\n do {\n values.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n return { type: \"row\", values };\n }\n this.expect(\"RPAREN\");\n return first;\n }\n\n if (this.match(\"STAR\")) {\n return { type: \"column\", table: null, name: \"*\" };\n }\n\n if (t.kind === \"IDENT\" || IDENT_KEYWORDS.has(t.kind)) {\n return this.parseIdentOrFunction();\n }\n\n this.syntaxError(`unexpected token ${t.kind} in expression`);\n }\n\n private parseIdentOrFunction(): Expr {\n const name = this.parseIdent();\n if (this.match(\"LPAREN\")) {\n return this.finishCall(name);\n }\n if (this.match(\"DOT\")) {\n const col = this.parseIdent();\n return { type: \"column\", table: name, name: col };\n }\n return { type: \"column\", table: null, name };\n }\n\n private finishCall(name: string): Expr {\n let distinct = false;\n if (this.match(\"DISTINCT\")) distinct = true;\n else this.match(\"ALL\");\n\n let args: Expr[] | \"*\";\n let filter: Expr | null = null;\n\n if (this.match(\"STAR\")) {\n args = \"*\";\n } else {\n args = [];\n if (!this.at(\"RPAREN\")) {\n do {\n (args as Expr[]).push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n }\n this.expect(\"RPAREN\");\n\n if (this.match(\"FILTER\")) {\n this.expect(\"LPAREN\");\n this.expect(\"WHERE\");\n filter = this.parseExpr();\n this.expect(\"RPAREN\");\n }\n\n const upper = name.toUpperCase();\n const argCount = args === \"*\" ? 1 : args.length;\n // min()/max() with 2+ args are scalar; single-arg (or *) forms are aggregates.\n const isAgg = AGGREGATE_FUNCTIONS.has(upper) && !(argCount >= 2 && (upper === \"MIN\" || upper === \"MAX\"));\n\n if (this.match(\"OVER\")) {\n let window: WindowSpec;\n if (this.at(\"IDENT\") || IDENT_KEYWORDS.has(this.current().kind)) {\n const winName = this.parseIdent();\n window = { partitionBy: [], orderBy: [], frame: null, ref: winName };\n } else {\n this.expect(\"LPAREN\");\n window = this.parseWindowSpec();\n this.expect(\"RPAREN\");\n }\n const func = isAgg\n ? { type: \"aggregate\" as const, name: upper, distinct, args, filter }\n : { type: \"function\" as const, name, distinct, args, filter };\n return { type: \"window\", func, window };\n }\n\n if (isAgg) {\n return { type: \"aggregate\", name: upper, distinct, args, filter };\n }\n return { type: \"function\", name, distinct, args, filter };\n }\n\n private parseCaseExpr(base: Expr | null): CaseExpr {\n const whens: { when: Expr; then: Expr }[] = [];\n while (this.match(\"WHEN\")) {\n const when = this.parseExpr();\n this.expect(\"THEN\");\n const then = this.parseExpr();\n whens.push({ when, then });\n }\n let elseExpr: Expr | null = null;\n if (this.match(\"ELSE\")) elseExpr = this.parseExpr();\n this.expect(\"END\");\n return { type: \"case\", base, whens, else: elseExpr };\n }\n\n private parseWindowSpec(): WindowSpec {\n const partitionBy: Expr[] = [];\n const orderBy: OrderByItem[] = [];\n let frame: FrameSpec | null = null;\n\n if (this.match(\"PARTITION\")) {\n this.expect(\"BY\");\n do {\n partitionBy.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n\n if (this.match(\"ORDER\")) {\n this.expect(\"BY\");\n do {\n const expr = this.parseExpr();\n let dir: \"ASC\" | \"DESC\" = \"ASC\";\n if (this.match(\"ASC\")) dir = \"ASC\";\n else if (this.match(\"DESC\")) dir = \"DESC\";\n let nulls: \"FIRST\" | \"LAST\" | null = null;\n if (this.match(\"NULLS\")) {\n if (this.match(\"FIRST\")) nulls = \"FIRST\";\n else if (this.match(\"LAST\")) nulls = \"LAST\";\n }\n orderBy.push({ expr, dir, nulls });\n } while (this.match(\"COMMA\"));\n }\n\n if (this.check(\"ROWS\", \"RANGE\", \"GROUPS\")) {\n frame = this.parseFrameSpec();\n }\n\n return { partitionBy, orderBy, frame };\n }\n\n private parseFrameSpec(): FrameSpec {\n let type: FrameSpec[\"type\"] = \"ROWS\";\n if (this.match(\"RANGE\")) type = \"RANGE\";\n else if (this.match(\"GROUPS\")) type = \"GROUPS\";\n else this.expect(\"ROWS\");\n\n let start: FrameBound;\n let end: FrameBound;\n\n if (this.match(\"BETWEEN\")) {\n start = this.parseFrameBound(true);\n this.expect(\"AND\");\n end = this.parseFrameBound(false);\n } else {\n start = this.parseFrameBound(true);\n end = { kind: \"current_row\" };\n }\n\n let exclude: FrameSpec[\"exclude\"] = null;\n if (this.match(\"EXCLUDE\")) {\n if (this.match(\"NO\")) {\n this.expect(\"OTHERS\");\n exclude = \"no_others\";\n } else if (this.match(\"CURRENT\")) {\n this.expect(\"ROW\");\n exclude = \"current_row\";\n } else if (this.match(\"GROUP\")) exclude = \"group\";\n else if (this.match(\"TIES\")) exclude = \"ties\";\n else this.syntaxError(\"expected EXCLUDE CURRENT ROW, GROUP, TIES, or NO OTHERS\");\n }\n\n return { type, start, end, exclude };\n }\n\n private parseFrameBound(precedingSide: boolean): FrameBound {\n if (this.match(\"UNBOUNDED\")) {\n if (this.match(\"PRECEDING\")) return { kind: \"unbounded_preceding\" };\n this.expect(\"FOLLOWING\");\n return { kind: \"unbounded_following\" };\n }\n if (this.match(\"CURRENT\")) {\n this.expect(\"ROW\");\n return { kind: \"current_row\" };\n }\n const expr = this.parseExpr();\n if (this.match(\"PRECEDING\")) return { kind: \"preceding\", expr };\n if (this.match(\"FOLLOWING\")) return { kind: \"following\", expr };\n if (precedingSide) return { kind: \"preceding\", expr };\n return { kind: \"following\", expr };\n }\n}\n\nexport function parseTokens(tokens: Token[]): Statement[] {\n return new Parser(tokens).parseStatements();\n}\n", "import type { Statement as ParsedStatement } from \"../ast/nodes.ts\";\nimport { tokenize } from \"../lexer/tokenize.ts\";\nimport { parseTokens } from \"./parser.ts\";\n\n/** Parsed SQL statement AST (`SELECT`, `INSERT`, `CREATE TABLE`, \u2026). */\nexport type { Statement as ParsedStatement } from \"../ast/nodes.ts\";\nexport { parseTokens } from \"./parser.ts\";\n\n/**\n * Tokenize `sql` and parse every semicolon-separated statement.\n *\n * @param sql - SQLite SQL text.\n * @returns AST statements in source order.\n */\nexport function parse(sql: string): ParsedStatement[] {\n const tokens = tokenize(sql);\n return parseTokens(tokens);\n}\n", "/** Fixed reference instant used when callers do not supply a clock (`2000-01-01T00:00:00.000Z`). */\nexport const DEFAULT_NOW = new Date(\"2000-01-01T00:00:00.000Z\");\n\n/** Function that returns the current instant for `date('now')` and related builtins. */\nexport type Clock = () => Date;\n\n/**\n * Clock that always returns a copy of `instant` (default {@link DEFAULT_NOW}).\n *\n * @throws {RangeError} If `instant` is an invalid `Date`.\n */\nexport function fixedClock(instant: Date = DEFAULT_NOW): Clock {\n const ms = instant.getTime();\n if (Number.isNaN(ms)) throw new RangeError(\"invalid clock instant\");\n return () => new Date(ms);\n}\n\n/** Normalize a `Date`, {@link Clock}, or `undefined` into a {@link Clock}. */\nexport function resolveClock(now?: Date | Clock): Clock {\n if (now === undefined) return fixedClock(DEFAULT_NOW);\n if (typeof now === \"function\") return () => new Date(now().getTime());\n return fixedClock(now);\n}\n", "import type { Clock } from \"./clock.ts\";\n\n/** Options for {@link Database} construction. All fields are optional. */\nexport interface DatabaseOptions {\n /**\n * Seed for deterministic `random()` (and any other PRNG-backed builtins).\n * Defaults to {@link DEFAULT_DATABASE_SEED} (`1`).\n */\n seed?: number | bigint;\n /**\n * Clock for `date('now')` / `datetime('now')` / etc.\n * Defaults to a fixed instant (`2000-01-01T00:00:00.000Z`).\n * Pass a `Date` or `() => Date` to override.\n */\n now?: Date | Clock;\n}\n\n/** Default {@link DatabaseOptions.seed} when constructing a {@link Database}. */\nexport const DEFAULT_DATABASE_SEED = 1;\n", "/**\n * Deterministic 64-bit PRNG (xorshift64*).\n * Used for SQLite `random()` and any other nondeterministic builtins.\n */\nexport class Prng {\n private state: bigint;\n\n /**\n * @param seed - Engine seed. `0` is replaced with a non-zero constant.\n */\n constructor(seed: number | bigint = 1) {\n let s = typeof seed === \"bigint\" ? seed : BigInt(seed | 0);\n if (s === 0n) s = 0x9e3779b97f4a7c15n;\n this.state = BigInt.asUintN(64, s);\n }\n\n /** Next unsigned 64-bit value. */\n nextU64(): bigint {\n let x = this.state;\n x ^= BigInt.asUintN(64, x >> 12n);\n x ^= BigInt.asUintN(64, x << 25n);\n x ^= BigInt.asUintN(64, x >> 27n);\n this.state = BigInt.asUintN(64, x);\n return BigInt.asUintN(64, x * 0x2545f4914f6cdd1dn);\n }\n\n /** SQLite `random()` style signed 64-bit integer in [-2^63+1, 2^63-1]. */\n nextSqliteRandom(): bigint {\n const bits = this.nextU64();\n let signed = BigInt.asIntN(64, bits);\n if (signed === -(1n << 63n)) signed += 1n;\n return signed;\n }\n\n /** Next float in `[0, 1)` from 53 bits of {@link nextU64}. */\n nextFloat(): number {\n const bits = this.nextU64();\n return Number(bits >> 11n) / Number(1n << 53n);\n }\n\n /**\n * Next integer in `[min, max]` (inclusive).\n *\n * @throws {RangeError} If `max < min`.\n */\n nextInt(min: number, max: number): number {\n if (max < min) throw new RangeError(\"max < min\");\n const span = max - min + 1;\n return min + Number(this.nextU64() % BigInt(span));\n }\n\n /** Current unsigned 64-bit engine state (for snapshot / transaction rollback). */\n getState(): bigint {\n return this.state;\n }\n\n /** Restore unsigned 64-bit engine state from {@link getState}. */\n setState(state: bigint): void {\n this.state = BigInt.asUintN(64, state);\n }\n\n /** Independent copy with the same engine state. */\n clone(): Prng {\n const copy = new Prng(1);\n copy.state = this.state;\n return copy;\n }\n}\n\n/** FNV-1a hash of `parts` as a signed 32-bit seed (for tests and custom PRNGs). */\nexport function deriveSeed(...parts: Array<number | string | bigint>): number {\n let hash = 2166136261;\n for (const part of parts) {\n const text = String(part);\n for (let i = 0; i < text.length; i++) {\n hash ^= text.charCodeAt(i)!;\n hash = Math.imul(hash, 16777619);\n }\n }\n return hash | 0;\n}\n", "/** SQLite storage class of a {@link SqlValue} (`null` / `integer` / `real` / `text` / `blob`). */\nexport type StorageClass = \"null\" | \"integer\" | \"real\" | \"text\" | \"blob\";\n\n/** Integer-valued REAL that must not collapse to the integer storage class. */\nexport class SqlReal {\n /** IEEE float payload (`-0` already canonicalized to `+0`). */\n readonly value: number;\n constructor(value: number) {\n this.value = canonicalizeNumber(value);\n }\n valueOf(): number {\n return this.value;\n }\n toString(): string {\n return String(this.value);\n }\n}\n\n/** SQLite JSON subtype (74 / 'J') \u2014 text that nested JSON APIs treat as JSON, not a string. */\nexport const JSON_SUBTYPE = 74;\n\n/** TEXT value with SQLite JSON subtype 74 \u2014 nested JSON APIs treat it as JSON, not a string. */\nexport class SqlJsonText {\n readonly value: string;\n readonly subtype = JSON_SUBTYPE;\n constructor(value: string) {\n this.value = value;\n }\n valueOf(): string {\n return this.value;\n }\n toString(): string {\n return this.value;\n }\n}\n\n/** A SQLite value: NULL, integer/real, text, blob, or a typed REAL/JSON wrapper. */\nexport type SqlValue = null | number | bigint | string | Uint8Array | SqlReal | SqlJsonText;\n\n/**\n * A value as it appears in query result rows.\n * {@link SqlReal} and {@link SqlJsonText} wrappers are unwrapped at the JS API surface.\n */\nexport type QueryValue = null | number | bigint | string | Uint8Array;\n\n/** A result row keyed by column name. Duplicate SELECT names keep the last value. */\nexport type QueryRow = Record<string, QueryValue>;\n\n/**\n * Values accepted by bind slots (`?`, `?NNN`, `:name`, `@name`, `$name`).\n * Booleans become integer 0/1; {@link ArrayBuffer} is copied as a BLOB.\n */\nexport type BindValue = SqlValue | boolean | ArrayBuffer;\n\n/** Column type affinity from a declared type name (SQLite affinity rules). */\nexport type Affinity = \"TEXT\" | \"NUMERIC\" | \"INTEGER\" | \"REAL\" | \"BLOB\";\n\n/** Canonicalize IEEE `-0` to `+0` for cross-runtime determinism. */\nexport function canonicalizeNumber(value: number): number {\n return Object.is(value, -0) ? 0 : value;\n}\n\n/** Wrap `value` as {@link SqlReal} so it stays REAL even when it is an integer. */\nexport function asSqlReal(value: number): SqlReal {\n return new SqlReal(value);\n}\n\n/** `true` when `value` is a {@link SqlReal} wrapper. */\nexport function isSqlReal(value: SqlValue): value is SqlReal {\n return value instanceof SqlReal;\n}\n\n/** `true` when `value` is a {@link SqlJsonText} wrapper. */\nexport function isSqlJsonText(value: SqlValue): value is SqlJsonText {\n return value instanceof SqlJsonText;\n}\n\n/** Wrap `value` as {@link SqlJsonText} (JSON subtype 74). */\nexport function asSqlJsonText(value: string): SqlJsonText {\n return new SqlJsonText(value);\n}\n\n/** Strip ephemeral JSON subtype for table storage / non-JSON contexts. */\nexport function unwrapSqlValue(value: SqlValue): SqlValue {\n if (value instanceof SqlJsonText) return value.value;\n return value;\n}\n\nexport function subtypeOf(value: SqlValue): number {\n if (value instanceof SqlJsonText) return JSON_SUBTYPE;\n return 0;\n}\n\nexport function numberValueOf(value: number | bigint | SqlReal): number {\n if (typeof value === \"bigint\") return Number(value);\n if (value instanceof SqlReal) return value.value;\n return value;\n}\n\n/** SQLite storage class of `value` (`null` / `integer` / `real` / `text` / `blob`). */\nexport function storageClassOf(value: SqlValue): StorageClass {\n if (value === null) return \"null\";\n if (value instanceof SqlReal) return \"real\";\n if (value instanceof SqlJsonText) return \"text\";\n if (typeof value === \"bigint\") return \"integer\";\n if (typeof value === \"number\") {\n return Number.isInteger(value) ? \"integer\" : \"real\";\n }\n if (typeof value === \"string\") return \"text\";\n return \"blob\";\n}\n\n/** SQLite `typeof()` string for `value`. */\nexport function typeofSql(value: SqlValue): string {\n const sc = storageClassOf(value);\n if (sc === \"null\") return \"null\";\n if (sc === \"integer\") return \"integer\";\n if (sc === \"real\") return \"real\";\n if (sc === \"text\") return \"text\";\n return \"blob\";\n}\n\n/** Determine column affinity from a declared type name (SQLite rules). */\nexport function affinityFromTypeName(typeName: string | null | undefined): Affinity {\n if (!typeName) return \"BLOB\";\n const t = typeName.toUpperCase();\n if (t.includes(\"INT\")) return \"INTEGER\";\n if (t.includes(\"CHAR\") || t.includes(\"CLOB\") || t.includes(\"TEXT\")) return \"TEXT\";\n if (t.includes(\"BLOB\")) return \"BLOB\";\n if (t.includes(\"REAL\") || t.includes(\"FLOA\") || t.includes(\"DOUB\")) return \"REAL\";\n return \"NUMERIC\";\n}\n\n/** Apply column {@link Affinity} conversion rules to `value`. */\nexport function applyAffinity(value: SqlValue, affinity: Affinity): SqlValue {\n if (value === null) return null;\n\n switch (affinity) {\n case \"TEXT\":\n if (value instanceof Uint8Array) return utf8Decode(value);\n if (value instanceof SqlJsonText) return value.value;\n if (typeof value === \"string\") return value;\n if (value instanceof SqlReal) return String(value.value);\n return String(value);\n case \"INTEGER\": {\n const n = coerceToNumber(value);\n if (n === null) return value;\n if (typeof value === \"bigint\") return value;\n return Number.isInteger(n) && Number.isSafeInteger(n) ? Math.trunc(n) : canonicalizeNumber(n);\n }\n case \"REAL\": {\n const n = coerceToNumber(value);\n return n === null ? value : asSqlReal(n);\n }\n case \"NUMERIC\": {\n const n = coerceToNumber(value);\n if (n === null) return value;\n if (Number.isInteger(n) && Number.isSafeInteger(n)) return Math.trunc(n);\n return canonicalizeNumber(n);\n }\n case \"BLOB\":\n if (typeof value === \"number\") return canonicalizeNumber(value);\n return value;\n }\n}\n\n/** Parse `value` as a number, or `null` when it is not numeric. */\nexport function coerceToNumber(value: SqlValue): number | null {\n if (value === null) return null;\n if (value instanceof SqlReal) return value.value;\n if (value instanceof SqlJsonText) return coerceToNumber(value.value);\n if (typeof value === \"number\") return canonicalizeNumber(value);\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"string\") {\n const s = value.trim();\n if (s === \"\") return null;\n const n = Number(s);\n if (!Number.isNaN(n) && /^-?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/.test(s)) {\n return canonicalizeNumber(n);\n }\n return null;\n }\n if (value instanceof Uint8Array) {\n return coerceToNumber(utf8Decode(value));\n }\n return null;\n}\n\n/** Truncate `value` toward zero as an integer, or `null` when it is not numeric. */\nexport function toInteger(value: SqlValue): number | bigint | null {\n if (value === null) return null;\n if (typeof value === \"bigint\") return value;\n if (value instanceof SqlReal) return Math.trunc(value.value);\n if (value instanceof SqlJsonText) return toInteger(value.value);\n if (typeof value === \"number\") return Math.trunc(value);\n if (typeof value === \"string\") {\n const n = coerceToNumber(value);\n return n === null ? null : Math.trunc(n);\n }\n return null;\n}\n\n/** SQLite `=` / `IS` equality for two non-NULL values (`NULL = NULL` is false here). */\nexport function sqlValueEquals(a: SqlValue, b: SqlValue): boolean {\n if (a === null || b === null) return false;\n if (a instanceof Uint8Array && b instanceof Uint8Array) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n }\n const an = a instanceof SqlReal ? a.value : a instanceof SqlJsonText ? a.value : a;\n const bn = b instanceof SqlReal ? b.value : b instanceof SqlJsonText ? b.value : b;\n if (typeof an === \"bigint\" || typeof bn === \"bigint\") {\n try {\n return BigInt(an as number | bigint) === BigInt(bn as number | bigint);\n } catch {\n return false;\n }\n }\n if (typeof an === \"number\" && typeof bn === \"number\") return Object.is(an, bn);\n return an === bn;\n}\n\n/**\n * SQLite comparison for ORDER BY / inequalities.\n * Returns -1, 0, 1, or null if either side is NULL (SQL NULL).\n */\nexport function compareSql(a: SqlValue, b: SqlValue): number | null {\n if (a === null || b === null) return null;\n\n const ca = comparisonClass(a);\n const cb = comparisonClass(b);\n if (ca !== cb) return ca < cb ? -1 : 1;\n\n if (ca === 1) {\n // numbers \u2014 compare floats before BigInt conversion (NaN/Inf must not reach BigInt)\n const fa = a instanceof SqlReal ? a.value : typeof a === \"number\" ? a : typeof a === \"bigint\" ? null : Number(a);\n const fb = b instanceof SqlReal ? b.value : typeof b === \"number\" ? b : typeof b === \"bigint\" ? null : Number(b);\n if (typeof a === \"bigint\" && typeof b === \"bigint\") {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n }\n if (typeof a === \"bigint\" || typeof b === \"bigint\") {\n const left = typeof a === \"bigint\" ? Number(a) : (fa as number);\n const right = typeof b === \"bigint\" ? Number(b) : (fb as number);\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n }\n const left = fa as number;\n const right = fb as number;\n if (Number.isNaN(left) && Number.isNaN(right)) return 0;\n if (Number.isNaN(left)) return 1;\n if (Number.isNaN(right)) return -1;\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n }\n\n if (ca === 2) {\n const sa = a instanceof SqlJsonText ? a.value : String(a);\n const sb = b instanceof SqlJsonText ? b.value : String(b);\n if (sa < sb) return -1;\n if (sa > sb) return 1;\n return 0;\n }\n\n // blobs\n const ba = a instanceof Uint8Array ? a : utf8Encode(String(a));\n const bb = b instanceof Uint8Array ? b : utf8Encode(String(b));\n const len = Math.min(ba.length, bb.length);\n for (let i = 0; i < len; i++) {\n const d = (ba[i] ?? 0) - (bb[i] ?? 0);\n if (d !== 0) return d < 0 ? -1 : 1;\n }\n if (ba.length < bb.length) return -1;\n if (ba.length > bb.length) return 1;\n return 0;\n}\n\n/** SQLite sort order: NULL < numbers < text < blob */\nfunction comparisonClass(v: SqlValue): number {\n if (v === null) return 0;\n if (v instanceof SqlReal || typeof v === \"number\" || typeof v === \"bigint\") return 1;\n if (typeof v === \"string\" || v instanceof SqlJsonText) return 2;\n return 3;\n}\n\n/** UTF-8 encode `s` (SQLite TEXT \u2192 BLOB). */\nexport function utf8Encode(s: string): Uint8Array {\n return new TextEncoder().encode(s);\n}\n\n/** UTF-8 decode `b` (SQLite BLOB \u2192 TEXT). */\nexport function utf8Decode(b: Uint8Array): string {\n return new TextDecoder().decode(b);\n}\n\n/** Deep-copy blobs and REAL/JSON wrappers; primitives are returned as-is. */\nexport function cloneSqlValue(v: SqlValue): SqlValue {\n if (v instanceof Uint8Array) return new Uint8Array(v);\n if (v instanceof SqlReal) return new SqlReal(v.value);\n if (v instanceof SqlJsonText) return new SqlJsonText(v.value);\n return v;\n}\n\n/**\n * SQLite boolean truthiness (WHERE / HAVING / CASE / AND / OR / NOT).\n * Non-NULL values are cast to numeric; non-numeric text/blob become 0 (false).\n */\nexport function isTruthySql(v: SqlValue): boolean | null {\n if (v === null) return null;\n if (v instanceof SqlReal) return v.value !== 0;\n if (typeof v === \"number\") return v !== 0 && !Number.isNaN(v);\n if (typeof v === \"bigint\") return v !== 0n;\n if (typeof v === \"string\" || v instanceof Uint8Array || v instanceof SqlJsonText) {\n const n = coerceToNumber(v instanceof SqlJsonText ? v.value : v);\n return n !== null && n !== 0 && !Number.isNaN(n);\n }\n return false;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { JsonNode } from \"./types.ts\";\n\nexport class JsonParseError extends Error {\n constructor(\n message: string,\n readonly position: number,\n ) {\n super(message);\n this.name = \"JsonParseError\";\n }\n}\n\n/** Parse JSON / JSON5-ish input into a JsonNode. Position is 1-based for errors. */\nexport function parseJsonText(input: string, options?: { strictCanonical?: boolean }): JsonNode {\n const parser = new JsonTextParser(input, options?.strictCanonical ?? false);\n const node = parser.parseValue();\n parser.skipWs();\n if (!parser.eof()) {\n throw new JsonParseError(\"malformed JSON\", parser.pos1());\n }\n return node;\n}\n\nexport function jsonErrorPosition(input: string): number {\n try {\n parseJsonText(input);\n return 0;\n } catch (e) {\n if (e instanceof JsonParseError) return e.position;\n return 1;\n }\n}\n\nexport function isValidJsonText(input: string, flags = 0): boolean {\n // flags bit 0x01 = JSON5 accepted as valid when set; without it, only RFC8259\n const allowJson5 = (flags & 0x02) !== 0 || (flags & 0x01) !== 0;\n try {\n if (allowJson5) {\n parseJsonText(input);\n return true;\n }\n // Canonical: reject JSON5 extensions by re-checking with a strict mode\n parseJsonText(input, { strictCanonical: true });\n return true;\n } catch {\n return false;\n }\n}\n\nclass JsonTextParser {\n private i = 0;\n constructor(\n private readonly s: string,\n private readonly strictCanonical: boolean,\n ) {}\n\n eof(): boolean {\n return this.i >= this.s.length;\n }\n\n pos1(): number {\n return this.i + 1;\n }\n\n peek(n = 0): string {\n return this.s[this.i + n] ?? \"\";\n }\n\n advance(): string {\n return this.s[this.i++] ?? \"\";\n }\n\n skipWs(): void {\n while (this.i < this.s.length) {\n const ch = this.peek();\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\v\" || ch === \"\\f\") {\n this.advance();\n continue;\n }\n if (!this.strictCanonical && ch === \"/\" && this.peek(1) === \"/\") {\n this.i += 2;\n while (!this.eof() && this.peek() !== \"\\n\") this.advance();\n continue;\n }\n if (!this.strictCanonical && ch === \"/\" && this.peek(1) === \"*\") {\n this.i += 2;\n while (!this.eof() && !(this.peek() === \"*\" && this.peek(1) === \"/\")) this.advance();\n if (!this.eof()) this.i += 2;\n continue;\n }\n break;\n }\n }\n\n parseValue(): JsonNode {\n this.skipWs();\n if (this.eof()) throw new JsonParseError(\"malformed JSON\", this.pos1());\n const ch = this.peek();\n if (ch === \"{\") return this.parseObject();\n if (ch === \"[\") return this.parseArray();\n if (ch === '\"' || (!this.strictCanonical && ch === \"'\")) return this.parseString();\n if (ch === \"-\" || ch === \"+\" || (ch >= \"0\" && ch <= \"9\") || ch === \".\") return this.parseNumber();\n if (ch === \"n\" || ch === \"N\") return this.parseKeyword();\n if (ch === \"t\" || ch === \"T\" || ch === \"f\" || ch === \"F\" || ch === \"I\" || ch === \"i\") {\n return this.parseKeyword();\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n\n parseObject(): JsonNode {\n this.advance(); // {\n this.skipWs();\n const entries: Array<{ key: string; value: JsonNode }> = [];\n if (this.peek() === \"}\") {\n this.advance();\n return { kind: \"object\", entries };\n }\n while (true) {\n this.skipWs();\n let key: string;\n if (this.peek() === '\"' || (!this.strictCanonical && this.peek() === \"'\")) {\n const str = this.parseString();\n key = (str as { kind: \"string\"; value: string }).value;\n } else if (!this.strictCanonical && this.isIdentStart(this.peek())) {\n key = this.parseIdent();\n } else {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n this.skipWs();\n if (this.advance() !== \":\") throw new JsonParseError(\"malformed JSON\", this.pos1());\n const value = this.parseValue();\n entries.push({ key, value });\n this.skipWs();\n const sep = this.peek();\n if (sep === \",\") {\n this.advance();\n this.skipWs();\n if (!this.strictCanonical && this.peek() === \"}\") {\n this.advance();\n break;\n }\n continue;\n }\n if (sep === \"}\") {\n this.advance();\n break;\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n return { kind: \"object\", entries };\n }\n\n parseArray(): JsonNode {\n this.advance(); // [\n this.skipWs();\n const elements: JsonNode[] = [];\n if (this.peek() === \"]\") {\n this.advance();\n return { kind: \"array\", elements };\n }\n while (true) {\n elements.push(this.parseValue());\n this.skipWs();\n const sep = this.peek();\n if (sep === \",\") {\n this.advance();\n this.skipWs();\n if (!this.strictCanonical && this.peek() === \"]\") {\n this.advance();\n break;\n }\n continue;\n }\n if (sep === \"]\") {\n this.advance();\n break;\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n return { kind: \"array\", elements };\n }\n\n parseString(): JsonNode {\n const quote = this.advance();\n if (this.strictCanonical && quote !== '\"') {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n let out = \"\";\n while (!this.eof()) {\n const ch = this.advance();\n if (ch === quote) return { kind: \"string\", value: out };\n if (ch === \"\\\\\") {\n if (this.eof()) throw new JsonParseError(\"malformed JSON\", this.pos1());\n const esc = this.advance();\n switch (esc) {\n case '\"':\n case \"'\":\n case \"\\\\\":\n case \"/\":\n out += esc;\n break;\n case \"b\":\n out += \"\\b\";\n break;\n case \"f\":\n out += \"\\f\";\n break;\n case \"n\":\n out += \"\\n\";\n break;\n case \"r\":\n out += \"\\r\";\n break;\n case \"t\":\n out += \"\\t\";\n break;\n case \"u\": {\n const hex = this.s.slice(this.i, this.i + 4);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) throw new JsonParseError(\"malformed JSON\", this.pos1());\n this.i += 4;\n out += String.fromCharCode(parseInt(hex, 16));\n break;\n }\n case \"\\n\":\n case \"\\r\":\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n if (esc === \"\\r\" && this.peek() === \"\\n\") this.advance();\n break;\n default:\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n out += esc;\n }\n continue;\n }\n if (ch === \"\\n\" || ch === \"\\r\") {\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n out += ch;\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n\n parseNumber(): JsonNode {\n const start = this.i;\n if (this.peek() === \"+\" || this.peek() === \"-\") {\n if (this.strictCanonical && this.peek() === \"+\") {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n this.advance();\n }\n // Infinity / NaN handled via keyword if letter\n if (/[A-Za-z]/.test(this.peek())) {\n this.i = start;\n return this.parseKeyword();\n }\n if (this.peek() === \"0\" && /[xX]/.test(this.peek(1))) {\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n this.i += 2;\n while (/[0-9a-fA-F]/.test(this.peek())) this.advance();\n const text = this.s.slice(start, this.i);\n const n = Number(text);\n if (!Number.isFinite(n)) throw new JsonParseError(\"malformed JSON\", start + 1);\n return Number.isInteger(n) ? { kind: \"integer\", text: String(Math.trunc(n)) } : { kind: \"real\", text: String(n) };\n }\n let seenDot = false;\n let seenExp = false;\n if (this.peek() === \".\") {\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n seenDot = true;\n this.advance();\n }\n if (!(this.peek() >= \"0\" && this.peek() <= \"9\") && !seenDot) {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n while (this.peek() >= \"0\" && this.peek() <= \"9\") this.advance();\n if (this.peek() === \".\") {\n seenDot = true;\n this.advance();\n while (this.peek() >= \"0\" && this.peek() <= \"9\") this.advance();\n }\n if (this.peek() === \"e\" || this.peek() === \"E\") {\n seenExp = true;\n this.advance();\n if (this.peek() === \"+\" || this.peek() === \"-\") this.advance();\n if (!(this.peek() >= \"0\" && this.peek() <= \"9\")) throw new JsonParseError(\"malformed JSON\", this.pos1());\n while (this.peek() >= \"0\" && this.peek() <= \"9\") this.advance();\n }\n const raw = this.s.slice(start, this.i);\n if (this.strictCanonical) {\n if (raw.startsWith(\"+\")) throw new JsonParseError(\"malformed JSON\", start + 1);\n if (raw.includes(\".\") && (raw.startsWith(\".\") || raw.endsWith(\".\") || /\\.-|\\+\\./.test(raw))) {\n // trailing/leading dot rejected in strict \u2014 already partially handled\n }\n if (/^-?0\\d/.test(raw)) throw new JsonParseError(\"malformed JSON\", start + 1);\n }\n const canon = canonicalizeNumberText(raw);\n if (canon.kind === \"integer\" || (!seenDot && !seenExp && !raw.includes(\".\"))) {\n // Prefer integer when no fractional/exponent markers in original (after leading +-)\n const body = raw.replace(/^[+-]/, \"\");\n if (!body.includes(\".\") && !/[eE]/.test(body)) {\n return { kind: \"integer\", text: canon.text };\n }\n }\n return { kind: \"real\", text: canon.text };\n }\n\n parseKeyword(): JsonNode {\n const start = this.i;\n while (/[A-Za-z]/.test(this.peek())) this.advance();\n const word = this.s.slice(start, this.i);\n const lower = word.toLowerCase();\n if (lower === \"null\") return { kind: \"null\" };\n if (lower === \"true\") return { kind: \"true\" };\n if (lower === \"false\") return { kind: \"false\" };\n if (!this.strictCanonical) {\n if (lower === \"nan\" || lower === \"qnan\" || lower === \"snan\") return { kind: \"null\" };\n if (lower === \"infinity\" || lower === \"inf\") {\n const _sign = this.s[start - 1] === \"-\" ? \"-\" : \"\";\n // Treat as null-ish? Docs say Inf is allowed in JSON5 input and converted; use a large number string?\n // SQLite converts Infinity to null when rendering? Actually json() of Infinity might error or become null.\n // Probe showed NaN -> null. For Inf, check:\n return { kind: \"null\" };\n }\n }\n throw new JsonParseError(\"malformed JSON\", start + 1);\n }\n\n isIdentStart(ch: string): boolean {\n return /[A-Za-z_$]/.test(ch) || (ch.length > 0 && ch.charCodeAt(0) > 0x7f);\n }\n\n parseIdent(): string {\n let out = \"\";\n while (!this.eof()) {\n const ch = this.peek();\n if (/[A-Za-z0-9_$]/.test(ch) || ch.charCodeAt(0) > 0x7f) {\n out += this.advance();\n continue;\n }\n break;\n }\n if (!out) throw new JsonParseError(\"malformed JSON\", this.pos1());\n return out;\n }\n}\n\nfunction canonicalizeNumberText(raw: string): { kind: \"integer\" | \"real\"; text: string } {\n let s = raw.trim();\n if (s.startsWith(\"+\")) s = s.slice(1);\n const n = Number(s);\n if (!Number.isFinite(n)) {\n throw new JsonParseError(\"malformed JSON\", 1);\n }\n if (Number.isInteger(n) && !/[eE.]/.test(s.replace(/^-/, \"\"))) {\n return { kind: \"integer\", text: String(Math.trunc(n)) };\n }\n // Prefer a stable JSON number rendering\n let text = String(n);\n if (text.includes(\"e\") || text.includes(\"E\")) {\n // keep JS default\n } else if (text.endsWith(\".0\") && Number.isInteger(n)) {\n text = String(Math.trunc(n));\n return { kind: \"integer\", text };\n }\n return { kind: Number.isInteger(n) && !s.includes(\".\") && !/[eE]/.test(s) ? \"integer\" : \"real\", text };\n}\n\nexport function malformedJsonError(position?: number): SqliteError {\n return new SqliteError(position !== undefined ? `malformed JSON` : \"malformed JSON\", \"other\");\n}\n", "import type { JsonNode } from \"./types.ts\";\n\nexport function stringifyJson(node: JsonNode): string {\n switch (node.kind) {\n case \"null\":\n return \"null\";\n case \"true\":\n return \"true\";\n case \"false\":\n return \"false\";\n case \"integer\":\n case \"real\":\n return node.text;\n case \"string\":\n return jsonQuoteString(node.value);\n case \"array\":\n return `[${node.elements.map(stringifyJson).join(\",\")}]`;\n case \"object\":\n return `{${node.entries.map((e) => `${jsonQuoteString(e.key)}:${stringifyJson(e.value)}`).join(\",\")}}`;\n }\n}\n\nexport function jsonQuoteString(value: string): string {\n let out = '\"';\n for (let i = 0; i < value.length; i++) {\n const ch = value[i]!;\n const code = ch.charCodeAt(0);\n switch (ch) {\n case '\"':\n out += '\\\\\"';\n break;\n case \"\\\\\":\n out += \"\\\\\\\\\";\n break;\n case \"\\b\":\n out += \"\\\\b\";\n break;\n case \"\\f\":\n out += \"\\\\f\";\n break;\n case \"\\n\":\n out += \"\\\\n\";\n break;\n case \"\\r\":\n out += \"\\\\r\";\n break;\n case \"\\t\":\n out += \"\\\\t\";\n break;\n default:\n if (code < 0x20) {\n out += `\\\\u${code.toString(16).padStart(4, \"0\")}`;\n } else {\n out += ch;\n }\n }\n }\n return `${out}\"`;\n}\n\nexport function prettyJson(node: JsonNode, indent = \" \"): string {\n return prettyNode(node, indent, 0);\n}\n\nfunction prettyNode(node: JsonNode, indent: string, depth: number): string {\n const pad = indent.repeat(depth);\n const padInner = indent.repeat(depth + 1);\n switch (node.kind) {\n case \"array\":\n if (node.elements.length === 0) return \"[]\";\n return `[\\n${node.elements.map((e) => `${padInner}${prettyNode(e, indent, depth + 1)}`).join(\",\\n\")}\\n${pad}]`;\n case \"object\":\n if (node.entries.length === 0) return \"{}\";\n return `{\\n${node.entries\n .map((e) => `${padInner}${jsonQuoteString(e.key)}: ${prettyNode(e.value, indent, depth + 1)}`)\n .join(\",\\n\")}\\n${pad}}`;\n default:\n return stringifyJson(node);\n }\n}\n", "import { utf8Decode, utf8Encode } from \"../types/value.ts\";\nimport { JsonParseError, parseJsonText } from \"./parse.ts\";\nimport { stringifyJson } from \"./stringify.ts\";\nimport type { JsonNode } from \"./types.ts\";\n\n/** JSONB element types (low nibble). */\nexport const JB = {\n NULL: 0,\n TRUE: 1,\n FALSE: 2,\n INT: 3,\n INT5: 4,\n FLOAT: 5,\n FLOAT5: 6,\n TEXT: 7,\n TEXTJ: 8,\n TEXT5: 9,\n TEXTRAW: 10,\n ARRAY: 11,\n OBJECT: 12,\n} as const;\n\nexport function encodeJsonb(node: JsonNode): Uint8Array {\n const parts: number[] = [];\n writeNode(node, parts);\n return Uint8Array.from(parts);\n}\n\nfunction writeNode(node: JsonNode, out: number[]): void {\n switch (node.kind) {\n case \"null\":\n writeHeader(out, 0, JB.NULL);\n break;\n case \"true\":\n writeHeader(out, 0, JB.TRUE);\n break;\n case \"false\":\n writeHeader(out, 0, JB.FALSE);\n break;\n case \"integer\": {\n const payload = utf8Encode(node.text);\n writeHeader(out, payload.length, JB.INT);\n for (const b of payload) out.push(b);\n break;\n }\n case \"real\": {\n const payload = utf8Encode(node.text);\n writeHeader(out, payload.length, JB.FLOAT);\n for (const b of payload) out.push(b);\n break;\n }\n case \"string\": {\n const payload = utf8Encode(node.value);\n const needsEscape = [...node.value].some((ch) => {\n const c = ch.charCodeAt(0);\n return ch === '\"' || ch === \"\\\\\" || c < 0x20;\n });\n // Prefer TEXT when no escapes needed; TEXTRAW if chars need escaping in JSON text\n const type = needsEscape ? JB.TEXTRAW : JB.TEXT;\n writeHeader(out, payload.length, type);\n for (const b of payload) out.push(b);\n break;\n }\n case \"array\": {\n const payload: number[] = [];\n for (const el of node.elements) writeNode(el, payload);\n writeHeader(out, payload.length, JB.ARRAY);\n out.push(...payload);\n break;\n }\n case \"object\": {\n const payload: number[] = [];\n for (const entry of node.entries) {\n writeNode({ kind: \"string\", value: entry.key }, payload);\n writeNode(entry.value, payload);\n }\n writeHeader(out, payload.length, JB.OBJECT);\n out.push(...payload);\n break;\n }\n }\n}\n\nfunction writeHeader(out: number[], size: number, type: number): void {\n if (size <= 11) {\n out.push((size << 4) | type);\n return;\n }\n if (size <= 0xff) {\n out.push((12 << 4) | type, size);\n return;\n }\n if (size <= 0xffff) {\n out.push((13 << 4) | type, (size >> 8) & 0xff, size & 0xff);\n return;\n }\n out.push((14 << 4) | type, (size >> 24) & 0xff, (size >> 16) & 0xff, (size >> 8) & 0xff, size & 0xff);\n}\n\nexport interface JsonbElement {\n offset: number;\n end: number;\n type: number;\n payloadOffset: number;\n payloadSize: number;\n}\n\nexport function readHeader(blob: Uint8Array, offset: number): JsonbElement {\n if (offset >= blob.length) throw new JsonParseError(\"malformed JSON\", offset + 1);\n const first = blob[offset]!;\n const sizeCode = first >> 4;\n const type = first & 0x0f;\n let headerSize = 1;\n let payloadSize = sizeCode;\n if (sizeCode >= 12) {\n const lenBytes = sizeCode === 12 ? 1 : sizeCode === 13 ? 2 : sizeCode === 14 ? 4 : 8;\n headerSize = 1 + lenBytes;\n if (offset + headerSize > blob.length) throw new JsonParseError(\"malformed JSON\", offset + 1);\n payloadSize = 0;\n for (let i = 0; i < lenBytes; i++) {\n payloadSize = (payloadSize << 8) | blob[offset + 1 + i]!;\n }\n }\n const payloadOffset = offset + headerSize;\n const end = payloadOffset + payloadSize;\n if (end > blob.length) throw new JsonParseError(\"malformed JSON\", offset + 1);\n return { offset, end, type, payloadOffset, payloadSize };\n}\n\nexport function looksLikeJsonb(blob: Uint8Array): boolean {\n if (blob.length === 0) return false;\n try {\n const el = readHeader(blob, 0);\n return el.end === blob.length && el.type <= JB.OBJECT;\n } catch {\n return false;\n }\n}\n\nexport function decodeJsonb(blob: Uint8Array): JsonNode {\n const el = readHeader(blob, 0);\n if (el.end !== blob.length) throw new JsonParseError(\"malformed JSON\", 1);\n return decodeElement(blob, el);\n}\n\nfunction decodeElement(blob: Uint8Array, el: JsonbElement): JsonNode {\n switch (el.type) {\n case JB.NULL:\n return { kind: \"null\" };\n case JB.TRUE:\n return { kind: \"true\" };\n case JB.FALSE:\n return { kind: \"false\" };\n case JB.INT:\n case JB.INT5: {\n const text = utf8Decode(blob.subarray(el.payloadOffset, el.end));\n return { kind: \"integer\", text: normalizeIntText(text) };\n }\n case JB.FLOAT:\n case JB.FLOAT5: {\n const text = utf8Decode(blob.subarray(el.payloadOffset, el.end));\n return { kind: \"real\", text };\n }\n case JB.TEXT:\n case JB.TEXTJ:\n case JB.TEXT5:\n case JB.TEXTRAW: {\n const raw = utf8Decode(blob.subarray(el.payloadOffset, el.end));\n if (el.type === JB.TEXT || el.type === JB.TEXTRAW) return { kind: \"string\", value: raw };\n // TEXTJ / TEXT5 store escaped content without quotes \u2014 unescape lightly\n return { kind: \"string\", value: unescapeJsonPayload(raw) };\n }\n case JB.ARRAY: {\n const elements: JsonNode[] = [];\n let pos = el.payloadOffset;\n while (pos < el.end) {\n const child = readHeader(blob, pos);\n elements.push(decodeElement(blob, child));\n pos = child.end;\n }\n return { kind: \"array\", elements };\n }\n case JB.OBJECT: {\n const entries: Array<{ key: string; value: JsonNode }> = [];\n let pos = el.payloadOffset;\n while (pos < el.end) {\n const keyEl = readHeader(blob, pos);\n const keyNode = decodeElement(blob, keyEl);\n if (keyNode.kind !== \"string\") throw new JsonParseError(\"malformed JSON\", pos + 1);\n pos = keyEl.end;\n const valEl = readHeader(blob, pos);\n entries.push({ key: keyNode.value, value: decodeElement(blob, valEl) });\n pos = valEl.end;\n }\n return { kind: \"object\", entries };\n }\n default:\n throw new JsonParseError(\"malformed JSON\", el.offset + 1);\n }\n}\n\nfunction normalizeIntText(text: string): string {\n const n = Number(text);\n if (Number.isFinite(n) && Number.isInteger(n)) return String(Math.trunc(n));\n return text;\n}\n\nfunction unescapeJsonPayload(raw: string): string {\n // Payload may contain JSON escapes without surrounding quotes\n try {\n return JSON.parse(`\"${raw.replace(/\"/g, '\\\\\"')}\"`) as string;\n } catch {\n return raw;\n }\n}\n\n/** Walk JSONB and collect element metadata for TVF id/parent assignment. */\nexport interface JsonbWalkEntry {\n offset: number;\n parent: number | null;\n node: JsonNode;\n key: string | number | null;\n path: string;\n fullkey: string;\n /** For object entries, offset of the key header (used as id). */\n idOffset: number;\n}\n\nexport function walkJsonbTree(blob: Uint8Array): JsonbWalkEntry[] {\n const root = readHeader(blob, 0);\n const node = decodeElement(blob, root);\n const out: JsonbWalkEntry[] = [];\n walk(blob, root, node, null, \"$\", \"$\", null, out);\n return out;\n}\n\nfunction walk(\n blob: Uint8Array,\n el: JsonbElement,\n node: JsonNode,\n parentId: number | null,\n path: string,\n fullkey: string,\n key: string | number | null,\n out: JsonbWalkEntry[],\n idOffset = el.offset,\n): void {\n out.push({ offset: el.offset, parent: parentId, node, key, path, fullkey, idOffset });\n if (node.kind === \"array\") {\n let pos = el.payloadOffset;\n let index = 0;\n while (pos < el.end) {\n const child = readHeader(blob, pos);\n const childNode = decodeElement(blob, child);\n const childFull = `${fullkey}[${index}]`;\n walk(blob, child, childNode, idOffset, fullkey, childFull, index, out);\n pos = child.end;\n index++;\n }\n } else if (node.kind === \"object\") {\n let pos = el.payloadOffset;\n while (pos < el.end) {\n const keyEl = readHeader(blob, pos);\n const keyNode = decodeElement(blob, keyEl);\n if (keyNode.kind !== \"string\") throw new JsonParseError(\"malformed JSON\", pos + 1);\n pos = keyEl.end;\n const valEl = readHeader(blob, pos);\n const valNode = decodeElement(blob, valEl);\n const childFull = appendObjectKey(fullkey, keyNode.value);\n // Children of this entry use the entry's id (key offset), matching SQLite.\n walk(blob, valEl, valNode, idOffset, fullkey, childFull, keyNode.value, out, keyEl.offset);\n pos = valEl.end;\n }\n }\n}\n\nfunction appendObjectKey(base: string, key: string): string {\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) return `${base}.${key}`;\n return `${base}.\"${key.replace(/\"/g, '\\\\\"')}\"`;\n}\n\nexport function jsonbToText(blob: Uint8Array): string {\n return stringifyJson(decodeJsonb(blob));\n}\n\nexport function textToJsonb(text: string): Uint8Array {\n return encodeJsonb(parseJsonText(text));\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { JsonNode } from \"./types.ts\";\n\nexport type PathStep =\n | { kind: \"root\" }\n | { kind: \"key\"; key: string }\n | { kind: \"index\"; index: number }\n | { kind: \"append\" } // [#]\n | { kind: \"fromEnd\"; n: number }; // [#-n]\n\nexport function parseJsonPath(path: string): PathStep[] {\n if (path === \"\") throw new SqliteError(\"bad JSON path: ''\", \"other\");\n if (!path.startsWith(\"$\")) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n const steps: PathStep[] = [{ kind: \"root\" }];\n let i = 1;\n while (i < path.length) {\n if (path[i] === \".\") {\n i++;\n if (i >= path.length) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n if (path[i] === '\"') {\n i++;\n let key = \"\";\n while (i < path.length) {\n const ch = path[i]!;\n if (ch === '\"') {\n i++;\n break;\n }\n if (ch === \"\\\\\") {\n i++;\n if (i >= path.length) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n key += path[i]!;\n i++;\n continue;\n }\n key += ch;\n i++;\n }\n steps.push({ kind: \"key\", key });\n continue;\n }\n let key = \"\";\n while (i < path.length && path[i] !== \".\" && path[i] !== \"[\") {\n key += path[i]!;\n i++;\n }\n if (!key) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n steps.push({ kind: \"key\", key });\n continue;\n }\n if (path[i] === \"[\") {\n i++;\n if (path[i] === \"#\") {\n i++;\n if (path[i] === \"]\") {\n i++;\n steps.push({ kind: \"append\" });\n continue;\n }\n if (path[i] === \"-\") {\n i++;\n let digits = \"\";\n while (i < path.length && path[i]! >= \"0\" && path[i]! <= \"9\") {\n digits += path[i]!;\n i++;\n }\n if (!digits || path[i] !== \"]\") throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n i++;\n steps.push({ kind: \"fromEnd\", n: Number(digits) });\n continue;\n }\n throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n }\n let digits = \"\";\n while (i < path.length && path[i]! >= \"0\" && path[i]! <= \"9\") {\n digits += path[i]!;\n i++;\n }\n if (!digits || path[i] !== \"]\") throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n i++;\n steps.push({ kind: \"index\", index: Number(digits) });\n continue;\n }\n throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n }\n return steps;\n}\n\n/** Resolve path for read; returns undefined if missing. */\nexport function pathGet(root: JsonNode, steps: PathStep[]): JsonNode | undefined {\n let cur: JsonNode | undefined = root;\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!;\n if (step.kind === \"root\") continue;\n if (cur === undefined) return undefined;\n if (step.kind === \"key\") {\n if (cur.kind !== \"object\") return undefined;\n const entries = cur.entries;\n let next: JsonNode | undefined;\n for (let j = entries.length - 1; j >= 0; j--) {\n if (entries[j]!.key === step.key) {\n next = entries[j]!.value;\n break;\n }\n }\n cur = next;\n continue;\n }\n if (step.kind === \"append\") return undefined;\n if (cur.kind !== \"array\") return undefined;\n let index: number;\n if (step.kind === \"index\") index = step.index;\n else index = cur.elements.length - step.n;\n if (index < 0 || index >= cur.elements.length) return undefined;\n cur = cur.elements[index];\n }\n return cur;\n}\n\nexport interface PathParent {\n parent: JsonNode;\n step: PathStep;\n /** For object: entry index; for array: element index (may be length for append). */\n index: number;\n}\n\n/** Locate parent container for the final path step (for mutate). */\nexport function pathParent(root: JsonNode, steps: PathStep[]): PathParent | null {\n if (steps.length <= 1) return null;\n const parentSteps = steps.slice(0, -1);\n const parent = pathGet(root, parentSteps);\n if (!parent) return null;\n const step = steps[steps.length - 1]!;\n if (step.kind === \"root\") return null;\n if (step.kind === \"key\") {\n if (parent.kind !== \"object\") return null;\n const index = parent.entries.findIndex((e) => e.key === step.key);\n return { parent, step, index };\n }\n if (parent.kind !== \"array\") return null;\n if (step.kind === \"append\") return { parent, step, index: parent.elements.length };\n if (step.kind === \"index\") return { parent, step, index: step.index };\n return { parent, step, index: parent.elements.length - step.n };\n}\n", "/** Internal JSON value tree used by sqlite-mem JSON1/JSONB. */\n\nexport type JsonNode =\n | { kind: \"null\" }\n | { kind: \"true\" }\n | { kind: \"false\" }\n | { kind: \"integer\"; text: string }\n | { kind: \"real\"; text: string }\n | { kind: \"string\"; value: string }\n | { kind: \"array\"; elements: JsonNode[] }\n | { kind: \"object\"; entries: Array<{ key: string; value: JsonNode }> };\n\nexport type JsonTypeName = \"null\" | \"true\" | \"false\" | \"integer\" | \"real\" | \"text\" | \"array\" | \"object\";\n\nexport function jsonTypeName(node: JsonNode): JsonTypeName {\n switch (node.kind) {\n case \"null\":\n return \"null\";\n case \"true\":\n return \"true\";\n case \"false\":\n return \"false\";\n case \"integer\":\n return \"integer\";\n case \"real\":\n return \"real\";\n case \"string\":\n return \"text\";\n case \"array\":\n return \"array\";\n case \"object\":\n return \"object\";\n }\n}\n\nexport function cloneJson(node: JsonNode): JsonNode {\n switch (node.kind) {\n case \"array\":\n return { kind: \"array\", elements: node.elements.map(cloneJson) };\n case \"object\":\n return {\n kind: \"object\",\n entries: node.entries.map((e) => ({ key: e.key, value: cloneJson(e.value) })),\n };\n case \"integer\":\n case \"real\":\n return { kind: node.kind, text: node.text };\n case \"string\":\n return { kind: \"string\", value: node.value };\n default:\n return { kind: node.kind };\n }\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { asSqlJsonText, asSqlReal, isSqlJsonText, SqlJsonText, type SqlValue, utf8Decode } from \"../types/value.ts\";\nimport { decodeJsonb, encodeJsonb, looksLikeJsonb } from \"./jsonb.ts\";\nimport { JsonParseError, parseJsonText } from \"./parse.ts\";\nimport { type PathStep, parseJsonPath, pathGet, pathParent } from \"./path.ts\";\nimport { stringifyJson } from \"./stringify.ts\";\nimport { cloneJson, type JsonNode } from \"./types.ts\";\n\nexport function sqlToJsonInput(value: SqlValue): JsonNode {\n if (value === null) return { kind: \"null\" };\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) return { kind: \"null\" };\n if (Number.isInteger(value)) return { kind: \"integer\", text: String(value) };\n return { kind: \"real\", text: String(value) };\n }\n if (typeof value === \"bigint\") return { kind: \"integer\", text: value.toString() };\n if (value instanceof SqlJsonText) return parseJsonText(value.value);\n if (typeof value === \"string\") return parseJsonText(value);\n if (value instanceof Uint8Array) {\n if (looksLikeJsonb(value)) return decodeJsonb(value);\n // Legacy blob-as-text JSON bug compatibility\n return parseJsonText(utf8Decode(value));\n }\n // SqlReal\n if (typeof value === \"object\" && value !== null && \"value\" in value) {\n const n = (value as { value: number }).value;\n if (!Number.isFinite(n)) return { kind: \"null\" };\n return { kind: \"real\", text: String(n) };\n }\n throw new SqliteError(\"malformed JSON\", \"other\");\n}\n\nexport function trySqlToJsonInput(value: SqlValue): JsonNode | null {\n try {\n return sqlToJsonInput(value);\n } catch {\n return null;\n }\n}\n\n/** VALUE arg for insert/set/array/object \u2014 literal unless JSON subtype / JSONB. */\nexport function sqlValueToJsonNode(value: SqlValue): JsonNode {\n if (value === null) return { kind: \"null\" };\n if (isSqlJsonText(value)) return parseJsonText(value.value);\n if (value instanceof Uint8Array && looksLikeJsonb(value)) return decodeJsonb(value);\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) return { kind: \"null\" };\n if (Number.isInteger(value)) return { kind: \"integer\", text: String(value) };\n return { kind: \"real\", text: String(value) };\n }\n if (typeof value === \"bigint\") return { kind: \"integer\", text: value.toString() };\n if (typeof value === \"object\" && value !== null && !(value instanceof Uint8Array) && \"value\" in value) {\n const n = (value as { value: number }).value;\n return { kind: \"real\", text: String(n) };\n }\n if (value instanceof Uint8Array) {\n throw new SqliteError(\"JSON cannot hold BLOB values\", \"other\");\n }\n // plain text / string \u2192 JSON string\n return { kind: \"string\", value: String(value) };\n}\n\nexport function jsonNodeToSql(node: JsonNode, mode: \"sql\" | \"json\" | \"jsonb\"): SqlValue {\n if (mode === \"jsonb\") return encodeJsonb(node);\n if (mode === \"json\") return asSqlJsonText(stringifyJson(node));\n // sql representation (json_extract single path / ->>)\n switch (node.kind) {\n case \"null\":\n return null;\n case \"true\":\n return 1;\n case \"false\":\n return 0;\n case \"integer\": {\n const n = Number(node.text);\n if (Number.isSafeInteger(n)) return n;\n try {\n return BigInt(node.text);\n } catch {\n return n;\n }\n }\n case \"real\": {\n const n = Number(node.text);\n return Number.isInteger(n) ? asSqlReal(n) : n;\n }\n case \"string\":\n return node.value;\n case \"array\":\n case \"object\":\n // ->> / sql mode: plain TEXT without JSON subtype so nested json_* quote it.\n if (mode === \"sql\") return stringifyJson(node);\n return asSqlJsonText(stringifyJson(node));\n }\n}\n\nexport function jsonArrowPath(right: SqlValue): string {\n if (right === null) throw new SqliteError(\"JSON path error\", \"other\");\n if (typeof right === \"number\" || typeof right === \"bigint\") {\n const n = typeof right === \"bigint\" ? Number(right) : Math.trunc(right);\n if (n < 0) return `$[#${n}]`; // -K \u2192 [#-K] via `[#-K]` \u2014 n is already negative\n return `$[${n}]`;\n }\n const text = isSqlJsonText(right) ? right.value : String(right);\n if (text.startsWith(\"$\")) return text;\n if (/^-?\\d+$/.test(text)) {\n const n = Number(text);\n if (n < 0) return `$[#${n}]`;\n return `$[${n}]`;\n }\n return `$.${text}`;\n}\n\nexport function extractOne(root: JsonNode, path: string): JsonNode | undefined {\n return pathGet(root, parseJsonPath(path));\n}\n\nexport type MutateMode = \"insert\" | \"replace\" | \"set\";\n\n/**\n * json_array_insert / jsonb_array_insert \u2014 like json_replace, but PATH must end\n * with an array index and the value is spliced in (existing elements shift right).\n * https://www.sqlite.org/json1.html#jarrins\n */\nexport function arrayInsertJson(root: JsonNode, path: string, value: JsonNode): JsonNode {\n const steps = parseJsonPath(path);\n const last = steps[steps.length - 1];\n if (!last || last.kind === \"root\" || last.kind === \"key\") {\n throw new SqliteError(\"JSON path error\", \"other\");\n }\n const result = cloneJson(root);\n const parentInfo = pathParent(result, steps);\n if (parentInfo?.parent.kind !== \"array\") return result;\n const parent = parentInfo.parent;\n let idx = parentInfo.index;\n if (last.kind === \"fromEnd\") idx = parent.elements.length - last.n;\n if (last.kind === \"append\") idx = parent.elements.length;\n if (idx < 0 || idx > parent.elements.length) return result;\n parent.elements.splice(idx, 0, cloneJson(value));\n return result;\n}\n\nexport function mutateJson(root: JsonNode, path: string, value: JsonNode, mode: MutateMode): JsonNode {\n const steps = parseJsonPath(path);\n if (steps.length <= 1) {\n // path is $\n if (mode === \"insert\") return root;\n return cloneJson(value);\n }\n const result = cloneJson(root);\n if (!applyMutate(result, steps, value, mode)) {\n createPathAndSet(result, steps, value, mode);\n }\n return result;\n}\n\nfunction applyMutate(root: JsonNode, steps: PathStep[], value: JsonNode, mode: MutateMode): boolean {\n const parentInfo = pathParent(root, steps);\n if (!parentInfo) return false;\n const { parent, step, index } = parentInfo;\n if (step.kind === \"key\") {\n if (parent.kind !== \"object\") return false;\n if (index >= 0) {\n if (mode === \"insert\") return false;\n parent.entries[index] = { key: step.key, value: cloneJson(value) };\n return true;\n }\n if (mode === \"replace\") return false;\n parent.entries.push({ key: step.key, value: cloneJson(value) });\n return true;\n }\n if (parent.kind !== \"array\") return false;\n if (step.kind === \"append\") {\n if (mode === \"replace\") return false;\n parent.elements.push(cloneJson(value));\n return true;\n }\n let idx = index;\n if (step.kind === \"fromEnd\") idx = parent.elements.length - step.n;\n if (idx < 0 || idx > parent.elements.length) return false;\n if (idx === parent.elements.length) {\n if (mode === \"replace\") return false;\n parent.elements.push(cloneJson(value));\n return true;\n }\n if (mode === \"insert\") return false;\n parent.elements[idx] = cloneJson(value);\n return true;\n}\n\nfunction createPathAndSet(root: JsonNode, steps: PathStep[], value: JsonNode, mode: MutateMode): boolean {\n // Walk creating missing object keys / refusing missing array slots (SQLite behavior)\n let cur = root;\n for (let i = 1; i < steps.length - 1; i++) {\n const step = steps[i]!;\n const next = steps[i + 1]!;\n if (step.kind === \"key\") {\n if (cur.kind !== \"object\") return false;\n let entry = cur.entries.find((e) => e.key === step.key);\n if (!entry) {\n if (mode === \"replace\") return false;\n const child: JsonNode =\n next.kind === \"key\" || next.kind === \"root\"\n ? { kind: \"object\", entries: [] }\n : { kind: \"array\", elements: [] };\n entry = { key: step.key, value: child };\n cur.entries.push(entry);\n }\n cur = entry.value;\n continue;\n }\n if (cur.kind !== \"array\") return false;\n let idx = step.kind === \"index\" ? step.index : step.kind === \"fromEnd\" ? cur.elements.length - step.n : -1;\n if (step.kind === \"append\") idx = cur.elements.length;\n if (idx < 0 || idx > cur.elements.length) return false;\n if (idx === cur.elements.length) {\n if (mode === \"replace\") return false;\n const child: JsonNode = next.kind === \"key\" ? { kind: \"object\", entries: [] } : { kind: \"array\", elements: [] };\n cur.elements.push(child);\n }\n cur = cur.elements[idx]!;\n }\n return applyMutate(root, steps, value, mode);\n}\n\nexport function removeJson(root: JsonNode, path: string): JsonNode {\n const steps = parseJsonPath(path);\n if (steps.length <= 1) return root;\n const result = cloneJson(root);\n const parentInfo = pathParent(result, steps);\n if (!parentInfo) return result;\n const { parent, step, index } = parentInfo;\n if (step.kind === \"key\" && parent.kind === \"object\" && index >= 0) {\n parent.entries.splice(index, 1);\n } else if (parent.kind === \"array\") {\n let idx = index;\n if (step.kind === \"fromEnd\") idx = parent.elements.length - step.n;\n if (step.kind === \"append\") return result;\n if (idx >= 0 && idx < parent.elements.length) parent.elements.splice(idx, 1);\n }\n return result;\n}\n\n/** RFC7396-ish JSON Merge Patch as implemented by SQLite json_patch. */\nexport function patchJson(target: JsonNode, patch: JsonNode): JsonNode {\n if (patch.kind !== \"object\") return cloneJson(patch);\n const base = target.kind === \"object\" ? cloneJson(target) : ({ kind: \"object\", entries: [] } as JsonNode);\n if (base.kind !== \"object\") return cloneJson(patch);\n for (const entry of patch.entries) {\n if (entry.value.kind === \"null\") {\n base.entries = base.entries.filter((e) => e.key !== entry.key);\n continue;\n }\n const existing = base.entries.find((e) => e.key === entry.key);\n if (existing) {\n existing.value = patchJson(existing.value, entry.value);\n } else {\n base.entries.push({ key: entry.key, value: cloneJson(entry.value) });\n }\n }\n return base;\n}\n\nexport function wrapJsonError(e: unknown): never {\n if (e instanceof SqliteError) throw e;\n if (e instanceof JsonParseError) throw new SqliteError(\"malformed JSON\", \"other\");\n throw new SqliteError(\"malformed JSON\", \"other\");\n}\n\nexport function ensureJson(value: SqlValue): JsonNode {\n try {\n return sqlToJsonInput(value);\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nexport function toJsonbBlob(value: SqlValue): Uint8Array {\n if (value instanceof Uint8Array && looksLikeJsonb(value)) return value;\n return encodeJsonb(ensureJson(value));\n}\n\nexport function toJsonText(value: SqlValue): SqlJsonText {\n return asSqlJsonText(stringifyJson(ensureJson(value)));\n}\n", "import type { SqlValue } from \"../types/value.ts\";\nimport { encodeJsonb, type JsonbWalkEntry, walkJsonbTree } from \"./jsonb.ts\";\nimport { ensureJson, jsonNodeToSql } from \"./ops.ts\";\nimport { stringifyJson } from \"./stringify.ts\";\nimport { type JsonNode, jsonTypeName } from \"./types.ts\";\n\nexport interface JsonTvfRow {\n key: SqlValue;\n value: SqlValue;\n type: string;\n atom: SqlValue;\n id: number;\n parent: SqlValue;\n fullkey: string;\n path: string;\n}\n\nfunction atomOf(node: JsonNode): SqlValue {\n switch (node.kind) {\n case \"null\":\n return null;\n case \"true\":\n return 1;\n case \"false\":\n return 0;\n case \"integer\":\n case \"real\":\n case \"string\":\n return jsonNodeToSql(node, \"sql\");\n default:\n return null;\n }\n}\n\nfunction valueOf(node: JsonNode): SqlValue {\n if (node.kind === \"array\" || node.kind === \"object\") return stringifyJson(node);\n return jsonNodeToSql(node, \"sql\");\n}\n\nexport function jsonEachRows(json: SqlValue, path?: SqlValue): JsonTvfRow[] {\n const root = ensureJson(json);\n const blob = encodeJsonb(root);\n const walk = walkJsonbTree(blob);\n const rootEntry = walk[0];\n if (!rootEntry) return [];\n\n let focus = rootEntry;\n if (path !== undefined && path !== null) {\n const targetPath = String(path);\n const found = walk.find((e) => e.fullkey === targetPath);\n if (!found) return [];\n focus = found;\n }\n\n if (focus.node.kind !== \"array\" && focus.node.kind !== \"object\") {\n return [\n {\n key: focus.key,\n value: valueOf(focus.node),\n type: jsonTypeName(focus.node),\n atom: atomOf(focus.node),\n id: focus.idOffset,\n parent: null,\n fullkey: focus.fullkey,\n path: focus.path,\n },\n ];\n }\n\n return walk.filter((e) => e.parent === focus.idOffset).map((e) => rowFromWalk(e, true));\n}\n\nexport function jsonTreeRows(json: SqlValue, path?: SqlValue): JsonTvfRow[] {\n const root = ensureJson(json);\n const blob = encodeJsonb(root);\n const walk = walkJsonbTree(blob);\n\n if (path === undefined || path === null) {\n return walk.map((e) => rowFromWalk(e, false));\n }\n\n const targetPath = String(path);\n // Keep IDs from the full document; return the subtree rooted at targetPath.\n const rootEntry = walk.find((e) => e.fullkey === targetPath);\n if (!rootEntry) return [];\n const subtree = walk.filter(\n (e) => e.fullkey === targetPath || e.fullkey.startsWith(targetPath + \".\") || e.fullkey.startsWith(targetPath + \"[\"),\n );\n return subtree.map((e) => {\n const row = rowFromWalk(e, false);\n if (e.idOffset === rootEntry.idOffset) {\n row.parent = null;\n }\n return row;\n });\n}\n\nfunction rowFromWalk(e: JsonbWalkEntry, eachMode: boolean): JsonTvfRow {\n return {\n key: e.key,\n value: valueOf(e.node),\n type: jsonTypeName(e.node),\n atom: atomOf(e.node),\n id: e.idOffset,\n parent: eachMode ? null : e.parent,\n fullkey: e.fullkey,\n path: e.path,\n };\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport {\n arrayInsertJson,\n ensureJson,\n extractOne,\n isValidJsonText,\n jsonArrowPath,\n jsonErrorPosition,\n jsonNodeToSql,\n mutateJson,\n patchJson,\n prettyJson,\n removeJson,\n sqlValueToJsonNode,\n stringifyJson,\n toJsonbBlob,\n toJsonText,\n wrapJsonError,\n} from \"../json/index.ts\";\nimport { decodeJsonb, looksLikeJsonb } from \"../json/jsonb.ts\";\nimport { jsonTypeName } from \"../json/types.ts\";\nimport { asSqlJsonText, isSqlJsonText, type SqlValue, subtypeOf, utf8Decode } from \"../types/value.ts\";\nimport type { AggregateAccumulator, AggregateFactory } from \"./aggregate.ts\";\nimport type { ScalarFunction } from \"./registry.ts\";\n\nfunction textOf(value: SqlValue): string {\n if (value instanceof Uint8Array) return utf8Decode(value);\n if (isSqlJsonText(value)) return value.value;\n return String(value);\n}\n\nfunction _requireOdd(name: string, args: SqlValue[]): void {\n if (args.length % 2 === 0) {\n throw new SqliteError(`json_${name}() requires an odd number of arguments`, \"misuse\");\n }\n}\n\nfunction arrayInsertArgs(args: SqlValue[], asJsonb: boolean): SqlValue {\n if (args.length === 0) {\n throw new SqliteError(\"wrong number of arguments to function json_array_insert()\", \"misuse\");\n }\n if (args.length % 2 === 0) {\n throw new SqliteError(\"json_array_insert() requires an odd number of arguments\", \"misuse\");\n }\n if (args.some((arg) => arg === null)) return null;\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i += 2) {\n const path = textOf(args[i]!);\n const value = sqlValueToJsonNode(args[i + 1]!);\n node = arrayInsertJson(node, path, value);\n }\n return asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nfunction mutateArgs(args: SqlValue[], mode: \"insert\" | \"replace\" | \"set\", asJsonb: boolean): SqlValue {\n if (args.length === 0) throw new SqliteError(`wrong number of arguments to function json_${mode}()`, \"misuse\");\n if (args.length % 2 === 0) {\n throw new SqliteError(`json_${mode}() requires an odd number of arguments`, \"misuse\");\n }\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i += 2) {\n const path = textOf(args[i]!);\n const value = sqlValueToJsonNode(args[i + 1]!);\n node = mutateJson(node, path, value, mode);\n }\n return asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nfunction extract(args: SqlValue[], asJsonb: boolean): SqlValue {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function json_extract()\", \"misuse\");\n try {\n const root = ensureJson(args[0]!);\n if (args.length === 2) {\n const found = extractOne(root, textOf(args[1]!));\n if (found === undefined) return null;\n if (asJsonb && (found.kind === \"array\" || found.kind === \"object\")) {\n return jsonNodeToSql(found, \"jsonb\");\n }\n if (found.kind === \"array\" || found.kind === \"object\") return jsonNodeToSql(found, \"json\");\n return jsonNodeToSql(found, \"sql\");\n }\n const parts = args.slice(1).map((p) => {\n const found = extractOne(root, textOf(p!));\n return found === undefined ? { kind: \"null\" as const } : found;\n });\n const arr = { kind: \"array\" as const, elements: parts };\n return asJsonb ? jsonNodeToSql(arr, \"jsonb\") : jsonNodeToSql(arr, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nexport function jsonArrow(left: SqlValue, right: SqlValue, mode: \"->\" | \"->>\"): SqlValue {\n if (left === null || right === null) return null;\n try {\n const root = ensureJson(left);\n const path = jsonArrowPath(right);\n const found = extractOne(root, path);\n if (found === undefined) return null;\n if (mode === \"->\") return asSqlJsonText(stringifyJson(found));\n return jsonNodeToSql(found, \"sql\");\n } catch (e) {\n // -> on malformed JSON errors\n wrapJsonError(e);\n }\n}\n\nexport const jsonScalarFunctions: Readonly<Record<string, ScalarFunction>> = {\n json(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function json()\", \"misuse\");\n if (args[0] === null) return null;\n return toJsonText(args[0]!);\n },\n jsonb(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function jsonb()\", \"misuse\");\n if (args[0] === null) return null;\n return toJsonbBlob(args[0]!);\n },\n json_array(args) {\n try {\n const elements = args.map((a) => sqlValueToJsonNode(a));\n return jsonNodeToSql({ kind: \"array\", elements }, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_array(args) {\n try {\n const elements = args.map((a) => sqlValueToJsonNode(a));\n return jsonNodeToSql({ kind: \"array\", elements }, \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_object(args) {\n if (args.length % 2 !== 0) {\n throw new SqliteError(\"json_object() requires an even number of arguments\", \"misuse\");\n }\n try {\n const entries: Array<{ key: string; value: import(\"../json/types.ts\").JsonNode }> = [];\n for (let i = 0; i < args.length; i += 2) {\n if (args[i] === null) throw new SqliteError(\"json_object() labels must be TEXT\", \"other\");\n if (args[i] instanceof Uint8Array) throw new SqliteError(\"JSON cannot hold BLOB values\", \"other\");\n const key = textOf(args[i]!);\n entries.push({ key, value: sqlValueToJsonNode(args[i + 1]!) });\n }\n return jsonNodeToSql({ kind: \"object\", entries }, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_object(args) {\n if (args.length % 2 !== 0) {\n throw new SqliteError(\"json_object() requires an even number of arguments\", \"misuse\");\n }\n try {\n const entries: Array<{ key: string; value: import(\"../json/types.ts\").JsonNode }> = [];\n for (let i = 0; i < args.length; i += 2) {\n if (args[i] === null) throw new SqliteError(\"json_object() labels must be TEXT\", \"other\");\n if (args[i] instanceof Uint8Array) throw new SqliteError(\"JSON cannot hold BLOB values\", \"other\");\n const key = textOf(args[i]!);\n entries.push({ key, value: sqlValueToJsonNode(args[i + 1]!) });\n }\n return jsonNodeToSql({ kind: \"object\", entries }, \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_quote(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function json_quote()\", \"misuse\");\n const v = args[0] ?? null;\n if (v === null) return asSqlJsonText(\"null\");\n if (isSqlJsonText(v)) return v;\n if (v instanceof Uint8Array && looksLikeJsonb(v)) return asSqlJsonText(stringifyJson(decodeJsonb(v)));\n try {\n return asSqlJsonText(stringifyJson(sqlValueToJsonNode(v)));\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_extract(args) {\n return extract(args, false);\n },\n jsonb_extract(args) {\n return extract(args, true);\n },\n json_insert(args) {\n return mutateArgs(args, \"insert\", false);\n },\n jsonb_insert(args) {\n return mutateArgs(args, \"insert\", true);\n },\n json_array_insert(args) {\n return arrayInsertArgs(args, false);\n },\n jsonb_array_insert(args) {\n return arrayInsertArgs(args, true);\n },\n json_replace(args) {\n return mutateArgs(args, \"replace\", false);\n },\n jsonb_replace(args) {\n return mutateArgs(args, \"replace\", true);\n },\n json_set(args) {\n return mutateArgs(args, \"set\", false);\n },\n jsonb_set(args) {\n return mutateArgs(args, \"set\", true);\n },\n json_remove(args) {\n if (args.length < 1) throw new SqliteError(\"wrong number of arguments to function json_remove()\", \"misuse\");\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i++) {\n node = removeJson(node, textOf(args[i]!));\n }\n return jsonNodeToSql(node, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_remove(args) {\n if (args.length < 1) throw new SqliteError(\"wrong number of arguments to function jsonb_remove()\", \"misuse\");\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i++) {\n node = removeJson(node, textOf(args[i]!));\n }\n return jsonNodeToSql(node, \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_patch(args) {\n if (args.length !== 2) throw new SqliteError(\"wrong number of arguments to function json_patch()\", \"misuse\");\n try {\n return jsonNodeToSql(patchJson(ensureJson(args[0]!), ensureJson(args[1]!)), \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_patch(args) {\n if (args.length !== 2) throw new SqliteError(\"wrong number of arguments to function jsonb_patch()\", \"misuse\");\n try {\n return jsonNodeToSql(patchJson(ensureJson(args[0]!), ensureJson(args[1]!)), \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_type(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_type()\", \"misuse\");\n }\n if (args[0] === null) return null;\n try {\n let node = ensureJson(args[0]!);\n if (args.length === 2) {\n if (args[1] === null) return null;\n const found = extractOne(node, textOf(args[1]!));\n if (!found) return null;\n node = found;\n }\n return jsonTypeName(node);\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_valid(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_valid()\", \"misuse\");\n }\n if (args[0] === null) return 0;\n const flags = args.length === 2 && args[1] !== null ? Number(args[1]) : 0;\n if (args[0] instanceof Uint8Array) {\n return looksLikeJsonb(args[0]) ? 1 : 0;\n }\n return isValidJsonText(textOf(args[0]!), flags) ? 1 : 0;\n },\n json_error_position(args) {\n if (args.length !== 1) {\n throw new SqliteError(\"wrong number of arguments to function json_error_position()\", \"misuse\");\n }\n if (args[0] === null) return 0;\n if (args[0] instanceof Uint8Array) {\n return looksLikeJsonb(args[0]) ? 0 : 1;\n }\n return jsonErrorPosition(textOf(args[0]!));\n },\n json_array_length(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_array_length()\", \"misuse\");\n }\n if (args[0] === null) return null;\n try {\n let node = ensureJson(args[0]!);\n if (args.length === 2) {\n if (args[1] === null) return null;\n const found = extractOne(node, textOf(args[1]!));\n if (!found) return null;\n node = found;\n }\n if (node.kind !== \"array\") return 0;\n return node.elements.length;\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_pretty(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_pretty()\", \"misuse\");\n }\n if (args[0] === null) return null;\n try {\n const node = ensureJson(args[0]!);\n const indent = args.length === 2 && args[1] !== null ? textOf(args[1]!) : \" \";\n return asSqlJsonText(prettyJson(node, indent));\n } catch (e) {\n wrapJsonError(e);\n }\n },\n subtype(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function subtype()\", \"misuse\");\n return subtypeOf(args[0] ?? null);\n },\n};\n\nclass JsonGroupArrayAccumulator implements AggregateAccumulator {\n private readonly values: import(\"../json/types.ts\").JsonNode[] = [];\n constructor(private readonly asJsonb: boolean) {}\n step(args: SqlValue[]): void {\n if (args[0] === undefined) return;\n // NULLs are included as JSON null in json_group_array\n this.values.push(sqlValueToJsonNode(args[0]!));\n }\n finalize(): SqlValue {\n const node = { kind: \"array\" as const, elements: this.values };\n return this.asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n }\n}\n\nclass JsonGroupObjectAccumulator implements AggregateAccumulator {\n private readonly entries: Array<{ key: string; value: import(\"../json/types.ts\").JsonNode }> = [];\n constructor(private readonly asJsonb: boolean) {}\n step(args: SqlValue[]): void {\n if (args[0] === null || args[0] === undefined) return;\n const key = textOf(args[0]!);\n this.entries.push({ key, value: sqlValueToJsonNode(args[1] ?? null) });\n }\n finalize(): SqlValue {\n const node = { kind: \"object\" as const, entries: this.entries };\n return this.asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n }\n}\n\nexport const jsonAggregateFunctions: Readonly<Record<string, AggregateFactory>> = {\n json_group_array: () => new JsonGroupArrayAccumulator(false),\n jsonb_group_array: () => new JsonGroupArrayAccumulator(true),\n json_group_object: () => new JsonGroupObjectAccumulator(false),\n jsonb_group_object: () => new JsonGroupObjectAccumulator(true),\n};\n", "import { coerceToNumber, compareSql, type SqlValue, utf8Decode } from \"../types/value.ts\";\n\nexport interface AggregateAccumulator {\n step(args: SqlValue[]): void;\n finalize(): SqlValue;\n}\n\nexport type AggregateFactory = () => AggregateAccumulator;\n\nclass CountAccumulator implements AggregateAccumulator {\n private count = 0;\n step(args: SqlValue[]): void {\n if (args.length === 0 || args[0] !== null) this.count++;\n }\n finalize(): SqlValue {\n return this.count;\n }\n}\n\nclass NumericAccumulator implements AggregateAccumulator {\n private count = 0;\n private sum = 0;\n constructor(private readonly mode: \"sum\" | \"avg\" | \"total\") {}\n step(args: SqlValue[]): void {\n const value = args[0];\n if (value === null || value === undefined) return;\n this.sum += coerceToNumber(value) ?? 0;\n this.count++;\n }\n finalize(): SqlValue {\n if (this.mode === \"total\") return this.sum;\n if (this.count === 0) return null;\n return this.mode === \"avg\" ? this.sum / this.count : this.sum;\n }\n}\n\nclass MinMaxAccumulator implements AggregateAccumulator {\n private value: SqlValue = null;\n constructor(private readonly direction: \"min\" | \"max\") {}\n step(args: SqlValue[]): void {\n const candidate = args[0];\n if (candidate === null || candidate === undefined) return;\n if (this.value === null) {\n this.value = candidate;\n return;\n }\n const comparison = compareSql(candidate, this.value)!;\n if ((this.direction === \"min\" && comparison < 0) || (this.direction === \"max\" && comparison > 0)) {\n this.value = candidate;\n }\n }\n finalize(): SqlValue {\n return this.value;\n }\n}\n\nclass GroupConcatAccumulator implements AggregateAccumulator {\n private readonly values: string[] = [];\n private separator = \",\";\n step(args: SqlValue[]): void {\n if (args[0] === null || args[0] === undefined) return;\n if (args[1] !== undefined && args[1] !== null) this.separator = String(args[1]);\n this.values.push(args[0] instanceof Uint8Array ? utf8Decode(args[0]) : String(args[0]));\n }\n finalize(): SqlValue {\n return this.values.length === 0 ? null : this.values.join(this.separator);\n }\n}\n\nexport const aggregateFunctions: Readonly<Record<string, AggregateFactory>> = {\n count: () => new CountAccumulator(),\n sum: () => new NumericAccumulator(\"sum\"),\n avg: () => new NumericAccumulator(\"avg\"),\n total: () => new NumericAccumulator(\"total\"),\n min: () => new MinMaxAccumulator(\"min\"),\n max: () => new MinMaxAccumulator(\"max\"),\n group_concat: () => new GroupConcatAccumulator(),\n string_agg: () => new GroupConcatAccumulator(),\n};\n\nexport function createAggregate(name: string): AggregateAccumulator | undefined {\n return aggregateFunctions[name.toLowerCase()]?.();\n}\n", "import { coerceToNumber, isSqlReal, type SqlValue } from \"../types/value.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\nconst JULIAN_UNIX_EPOCH = 2440587.5;\n\nfunction parseDate(value: SqlValue | undefined, context: FunctionContext): Date | null {\n if (value === undefined || value === \"now\") {\n return context.now?.() ?? new Date(\"2000-01-01T00:00:00.000Z\");\n }\n if (value === null || value instanceof Uint8Array) return null;\n if (typeof value === \"number\" || typeof value === \"bigint\" || isSqlReal(value)) {\n return new Date((Number(isSqlReal(value) ? value.value : value) - JULIAN_UNIX_EPOCH) * 86400000);\n }\n if (typeof value !== \"string\") return null;\n const source = /^\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?$/.test(value)\n ? `2000-01-01T${value}Z`\n : /^\\d{4}-\\d\\d-\\d\\d$/.test(value)\n ? `${value}T00:00:00Z`\n : value.replace(\" \", \"T\") + (/[zZ]|[+-]\\d\\d:\\d\\d$/.test(value) ? \"\" : \"Z\");\n const date = new Date(source);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nfunction applyModifier(date: Date, modifier: string): Date | null {\n const result = new Date(date);\n const normalized = modifier.trim().toLowerCase();\n if (normalized === \"unixepoch\") return new Date((date.getTime() / 86400000 + JULIAN_UNIX_EPOCH) * 1000);\n if (normalized === \"utc\" || normalized === \"localtime\") return result;\n if (normalized === \"start of day\") result.setUTCHours(0, 0, 0, 0);\n else if (normalized === \"start of month\") {\n result.setUTCDate(1);\n result.setUTCHours(0, 0, 0, 0);\n } else if (normalized === \"start of year\") {\n result.setUTCMonth(0, 1);\n result.setUTCHours(0, 0, 0, 0);\n } else {\n const match = /^([+-]?\\d+(?:\\.\\d+)?)\\s+(second|minute|hour|day|month|year)s?$/.exec(normalized);\n if (!match) return null;\n const amount = Number(match[1]);\n switch (match[2]) {\n case \"second\":\n result.setTime(result.getTime() + amount * 1000);\n break;\n case \"minute\":\n result.setTime(result.getTime() + amount * 60000);\n break;\n case \"hour\":\n result.setTime(result.getTime() + amount * 3600000);\n break;\n case \"day\":\n result.setTime(result.getTime() + amount * 86400000);\n break;\n case \"month\":\n result.setUTCMonth(result.getUTCMonth() + amount);\n break;\n case \"year\":\n result.setUTCFullYear(result.getUTCFullYear() + amount);\n break;\n }\n }\n return result;\n}\n\nfunction resolveDate(args: SqlValue[], context: FunctionContext): Date | null {\n let source = args[0];\n let modifiers = args.slice(1);\n if (source === undefined) source = \"now\";\n if (modifiers[0] === \"unixepoch\") {\n const seconds = coerceToNumber(source);\n if (seconds === null) return null;\n source = seconds / 86400 + JULIAN_UNIX_EPOCH;\n modifiers = modifiers.slice(1);\n }\n let date = parseDate(source, context);\n if (!date) return null;\n for (const modifier of modifiers) {\n if (typeof modifier !== \"string\") return null;\n date = applyModifier(date, modifier);\n if (!date) return null;\n }\n return date;\n}\n\nfunction pad(value: number, length = 2): string {\n return String(value).padStart(length, \"0\");\n}\n\nfunction isoDate(date: Date): string {\n return `${pad(date.getUTCFullYear(), 4)}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;\n}\n\nfunction isoTime(date: Date): string {\n return `${pad(date.getUTCHours())}:${pad(date.getUTCMinutes())}:${pad(date.getUTCSeconds())}`;\n}\n\nfunction dayOfYear(date: Date): number {\n return (\n Math.floor(\n (Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()) - Date.UTC(date.getUTCFullYear(), 0, 1)) /\n 86400000,\n ) + 1\n );\n}\n\nfunction formatDate(date: Date, format: string): string {\n return format.replace(/%[%YmdHMSfjswWJ]/g, (code) => {\n switch (code) {\n case \"%%\":\n return \"%\";\n case \"%Y\":\n return pad(date.getUTCFullYear(), 4);\n case \"%m\":\n return pad(date.getUTCMonth() + 1);\n case \"%d\":\n return pad(date.getUTCDate());\n case \"%H\":\n return pad(date.getUTCHours());\n case \"%M\":\n return pad(date.getUTCMinutes());\n case \"%S\":\n return pad(date.getUTCSeconds());\n case \"%f\":\n return `${pad(date.getUTCSeconds())}.${pad(date.getUTCMilliseconds(), 3)}`;\n case \"%j\":\n return pad(dayOfYear(date), 3);\n case \"%s\":\n return String(Math.floor(date.getTime() / 1000));\n case \"%w\":\n return String(date.getUTCDay());\n case \"%W\":\n return pad(Math.floor((dayOfYear(date) - 1 + 7 - date.getUTCDay()) / 7));\n case \"%J\":\n return String(date.getTime() / 86400000 + JULIAN_UNIX_EPOCH);\n default:\n return code;\n }\n });\n}\n\nexport const dateTimeFunctions: Readonly<Record<string, ScalarFunction>> = {\n date(args, context) {\n const value = resolveDate(args, context);\n return value ? isoDate(value) : null;\n },\n time(args, context) {\n const value = resolveDate(args, context);\n return value ? isoTime(value) : null;\n },\n datetime(args, context) {\n const value = resolveDate(args, context);\n return value ? `${isoDate(value)} ${isoTime(value)}` : null;\n },\n julianday(args, context) {\n const value = resolveDate(args, context);\n return value ? value.getTime() / 86400000 + JULIAN_UNIX_EPOCH : null;\n },\n strftime(args, context) {\n if (typeof args[0] !== \"string\") return null;\n const value = resolveDate(args.slice(1), context);\n return value ? formatDate(value, args[0]) : null;\n },\n current_date(args, context) {\n return dateTimeFunctions.date!(args.length === 0 ? [\"now\"] : args, context);\n },\n current_time(args, context) {\n return dateTimeFunctions.time!(args.length === 0 ? [\"now\"] : args, context);\n },\n current_timestamp(args, context) {\n return dateTimeFunctions.datetime!(args.length === 0 ? [\"now\"] : args, context);\n },\n unixepoch(args, context) {\n const value = resolveDate(args.length === 0 ? [\"now\"] : args, context);\n return value ? Math.floor(value.getTime() / 1000) : null;\n },\n timediff(args) {\n if (args.length !== 2) return null;\n const a = parseDate(args[0], {});\n const b = parseDate(args[1], {});\n if (!a || !b) return null;\n let ms = a.getTime() - b.getTime();\n const sign = ms < 0 ? \"-\" : \"+\";\n ms = Math.abs(ms);\n const years = Math.floor(ms / (365.2425 * 86400000));\n ms -= years * 365.2425 * 86400000;\n // Approximate month/day breakdown matching SQLite's YYYY-MM-DD HH:MM:SS.mmm style\n const months = Math.floor(ms / (30.436875 * 86400000));\n ms -= months * 30.436875 * 86400000;\n const days = Math.floor(ms / 86400000);\n ms -= days * 86400000;\n const hours = Math.floor(ms / 3600000);\n ms -= hours * 3600000;\n const minutes = Math.floor(ms / 60000);\n ms -= minutes * 60000;\n const seconds = Math.floor(ms / 1000);\n const millis = Math.floor(ms % 1000);\n const p = (n: number, w: number) => String(n).padStart(w, \"0\");\n return `${sign}${p(years, 4)}-${p(months, 2)}-${p(days, 2)} ${p(hours, 2)}:${p(minutes, 2)}:${p(seconds, 2)}.${p(millis, 3)}`;\n },\n};\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\nfunction requireArgs(name: string, args: SqlValue[], min: number, max = min): void {\n if (args.length < min || args.length > max) {\n throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n }\n}\n\nfunction resolveFtsTable(args: SqlValue[], context: FunctionContext, name: string) {\n const first = args[0];\n let tableName: string | null = null;\n if (typeof first === \"string\") tableName = first;\n else if (context.ftsSourceTable) tableName = context.ftsSourceTable;\n else if (context.ftsMatch) tableName = context.ftsMatch.tableName;\n if (!tableName || !context.getFtsTable) {\n throw new SqliteError(`unable to use function ${name} in the requested context`, \"unsupported\");\n }\n const table = context.getFtsTable(tableName);\n if (!table) throw new SqliteError(`unable to use function ${name} in the requested context`, \"unsupported\");\n return table;\n}\n\nfunction columnText(\n table: import(\"../vtable/fts5.ts\").Fts5VirtualTable,\n context: FunctionContext,\n colIndex: number,\n): string {\n const col = table.columns[colIndex];\n if (!col) return \"\";\n const rowid = context.ftsMatch?.rowid ?? context.ftsRowid;\n if (rowid === undefined) return \"\";\n const row = table.rows.get(rowid);\n if (!row) return \"\";\n const value = row.values.get(col.toLowerCase());\n return value === null || value === undefined ? \"\" : String(value);\n}\n\n/**\n * FTS auxiliary functions. When used with a MATCH cursor they compute real\n * values; without MATCH they mirror SQLite's empty-cursor defaults.\n */\nexport const ftsAuxFunctions: Readonly<Record<string, ScalarFunction>> = {\n bm25(args, context) {\n requireArgs(\"bm25\", args, 1, 100);\n const table = resolveFtsTable(args, context, \"bm25\");\n const weights = args.slice(1).map((v) => (typeof v === \"number\" ? v : Number(v)));\n if (!context.ftsMatch || context.ftsMatch.tableName.toLowerCase() !== table.name.toLowerCase()) {\n return -0;\n }\n return table.bm25(context.ftsMatch, weights.length ? weights : undefined);\n },\n highlight(args, context) {\n requireArgs(\"highlight\", args, 4);\n const table = resolveFtsTable(args, context, \"highlight\");\n const colIndex = Number(args[1] ?? 0);\n const open = String(args[2] ?? \"\");\n const close = String(args[3] ?? \"\");\n if (!context.ftsMatch || context.ftsMatch.tableName.toLowerCase() !== table.name.toLowerCase()) {\n return columnText(table, context, colIndex);\n }\n return table.highlight(context.ftsMatch, colIndex, open, close);\n },\n snippet(args, context) {\n requireArgs(\"snippet\", args, 1, 6);\n const table = resolveFtsTable(args, context, \"snippet\");\n const colIndex = Number(args[1] ?? 0);\n const open = String(args[2] ?? \"<b>\");\n const close = String(args[3] ?? \"</b>\");\n const ellipsis = String(args[4] ?? \"...\");\n const tokenCount = Number(args[5] ?? 64);\n if (!context.ftsMatch || context.ftsMatch.tableName.toLowerCase() !== table.name.toLowerCase()) {\n return columnText(table, context, colIndex);\n }\n return table.snippet(context.ftsMatch, colIndex, open, close, ellipsis, tokenCount);\n },\n matchinfo(args, context) {\n requireArgs(\"matchinfo\", args, 1, 2);\n const table = resolveFtsTable(args, context, \"matchinfo\");\n const format = typeof args[1] === \"string\" ? args[1] : \"pcx\";\n if (!context.ftsMatch) {\n throw new SqliteError(\"unable to use function matchinfo in the requested context\", \"unsupported\");\n }\n return table.matchinfo(context.ftsMatch, format);\n },\n offsets(args, context) {\n requireArgs(\"offsets\", args, 1);\n const table = resolveFtsTable(args, context, \"offsets\");\n if (!context.ftsMatch) {\n throw new SqliteError(\"unable to use function offsets in the requested context\", \"unsupported\");\n }\n return table.offsets(context.ftsMatch);\n },\n};\n\nexport const rtreeAuxFunctions: Readonly<Record<string, ScalarFunction>> = {\n rtreecheck(args) {\n requireArgs(\"rtreecheck\", args, 1, 2);\n if (args.length === 1) return \"ok\";\n throw new SqliteError(\"SQL logic error\", \"other\");\n },\n rtreenode(args) {\n requireArgs(\"rtreenode\", args, 2);\n return \"{}\";\n },\n rtreedepth(args) {\n requireArgs(\"rtreedepth\", args, 1);\n return 0;\n },\n};\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { asSqlReal, coerceToNumber, type SqlValue } from \"../types/value.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\nfunction requireArgs(name: string, args: SqlValue[], min: number, max = min): void {\n if (args.length < min || args.length > max) {\n throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n }\n}\n\nfunction num(value: SqlValue): number | null {\n if (value === null) return null;\n return coerceToNumber(value);\n}\n\nfunction realOrNull(value: number | null): SqlValue {\n if (value === null || Number.isNaN(value)) return null;\n return asSqlReal(value);\n}\n\nfunction unaryMath(name: string, fn: (n: number) => number): ScalarFunction {\n return (args) => {\n requireArgs(name, args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n return realOrNull(fn(n));\n };\n}\n\n/** IEEE754 helpers matching SQLite ENABLE_MATH_FUNCTIONS / ieee754 extension. */\nfunction decodeIeee754(value: number): { mantissa: bigint; exponent: number } {\n const buf = new ArrayBuffer(8);\n new DataView(buf).setFloat64(0, value, false);\n const bits = new DataView(buf).getBigUint64(0, false);\n const sign = bits >> 63n;\n const expBits = Number((bits >> 52n) & 0x7ffn);\n const frac = bits & 0xfffffffffffffn;\n if (expBits === 0) {\n // subnormal or zero\n let m = frac;\n let e = -1074;\n if (m === 0n) return { mantissa: sign === 0n ? 0n : -0n, exponent: 0 };\n while ((m & 1n) === 0n) {\n m >>= 1n;\n e++;\n }\n return { mantissa: sign ? -m : m, exponent: e };\n }\n if (expBits === 0x7ff) {\n // Inf/NaN \u2014 SQLite still formats; use mantissa with high bit\n const m = (1n << 52n) | frac;\n return { mantissa: sign ? -m : m, exponent: 972 };\n }\n let m = (1n << 52n) | frac;\n let e = expBits - 1075;\n while ((m & 1n) === 0n) {\n m >>= 1n;\n e++;\n }\n return { mantissa: sign ? -m : m, exponent: e };\n}\n\nfunction encodeIeee754(mantissa: bigint, exponent: number): number {\n if (mantissa === 0n) return 0;\n const sign = mantissa < 0n ? -1 : 1;\n let m = mantissa < 0n ? -mantissa : mantissa;\n let e = exponent;\n while (m > 0n && (m & 1n) === 0n) {\n m >>= 1n;\n e++;\n }\n // Reconstruct via Math: value = m * 2^e\n return sign * Number(m) * 2 ** e;\n}\n\nexport const mathFunctions: Readonly<Record<string, ScalarFunction>> = {\n acos: unaryMath(\"acos\", Math.acos),\n acosh: unaryMath(\"acosh\", Math.acosh),\n asin: unaryMath(\"asin\", Math.asin),\n asinh: unaryMath(\"asinh\", Math.asinh),\n atan: unaryMath(\"atan\", Math.atan),\n atanh: unaryMath(\"atanh\", Math.atanh),\n ceil: unaryMath(\"ceil\", Math.ceil),\n ceiling: unaryMath(\"ceiling\", Math.ceil),\n cos: unaryMath(\"cos\", Math.cos),\n cosh: unaryMath(\"cosh\", Math.cosh),\n degrees: unaryMath(\"degrees\", (n) => (n * 180) / Math.PI),\n exp: unaryMath(\"exp\", Math.exp),\n floor: unaryMath(\"floor\", Math.floor),\n ln: unaryMath(\"ln\", Math.log),\n log10: unaryMath(\"log10\", Math.log10),\n log2: unaryMath(\"log2\", Math.log2),\n pi(args) {\n requireArgs(\"pi\", args, 0);\n return asSqlReal(Math.PI);\n },\n radians: unaryMath(\"radians\", (n) => (n * Math.PI) / 180),\n sign(args) {\n requireArgs(\"sign\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n if (n > 0) return 1;\n if (n < 0) return -1;\n return 0;\n },\n sin: unaryMath(\"sin\", Math.sin),\n sinh: unaryMath(\"sinh\", Math.sinh),\n sqrt: unaryMath(\"sqrt\", Math.sqrt),\n tan: unaryMath(\"tan\", Math.tan),\n tanh: unaryMath(\"tanh\", Math.tanh),\n trunc: unaryMath(\"trunc\", Math.trunc),\n atan2(args) {\n requireArgs(\"atan2\", args, 2);\n const y = num(args[0]!);\n const x = num(args[1]!);\n if (y === null || x === null) return null;\n return realOrNull(Math.atan2(y, x));\n },\n log(args) {\n requireArgs(\"log\", args, 1, 2);\n if (args.length === 1) {\n const n = num(args[0]!);\n if (n === null) return null;\n return realOrNull(Math.log10(n));\n }\n const base = num(args[0]!);\n const n = num(args[1]!);\n if (base === null || n === null) return null;\n return realOrNull(Math.log(n) / Math.log(base));\n },\n mod(args) {\n requireArgs(\"mod\", args, 2);\n const a = num(args[0]!);\n const b = num(args[1]!);\n if (a === null || b === null) return null;\n if (b === 0) return null;\n return realOrNull(a % b);\n },\n pow(args) {\n requireArgs(\"pow\", args, 2);\n const a = num(args[0]!);\n const b = num(args[1]!);\n if (a === null || b === null) return null;\n return realOrNull(a ** b);\n },\n power(args, ctx) {\n return mathFunctions.pow!(args, ctx);\n },\n ieee754(args) {\n requireArgs(\"ieee754\", args, 1, 2);\n if (args.length === 1) {\n const n = num(args[0]!);\n if (n === null) return null;\n const { mantissa, exponent } = decodeIeee754(n);\n return `ieee754(${mantissa},${exponent})`;\n }\n const m = args[0]!;\n const e = args[1]!;\n if (m === null || e === null) return null;\n const mantissa = typeof m === \"bigint\" ? m : BigInt(Math.trunc(num(m)!));\n const exponent = Math.trunc(num(e)!);\n return realOrNull(encodeIeee754(mantissa, exponent));\n },\n ieee754_mantissa(args) {\n requireArgs(\"ieee754_mantissa\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n return decodeIeee754(n).mantissa;\n },\n ieee754_exponent(args) {\n requireArgs(\"ieee754_exponent\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n return decodeIeee754(n).exponent;\n },\n ieee754_to_blob(args) {\n requireArgs(\"ieee754_to_blob\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n const buf = new ArrayBuffer(8);\n new DataView(buf).setFloat64(0, n, false);\n return new Uint8Array(buf);\n },\n ieee754_from_blob(args) {\n requireArgs(\"ieee754_from_blob\", args, 1);\n const value = args[0];\n if (value === null) return null;\n if (!(value instanceof Uint8Array) || value.length !== 8) {\n throw new SqliteError(\"ieee754_from_blob() requires an 8-byte blob\", \"misuse\");\n }\n const view = new DataView(value.buffer, value.byteOffset, value.byteLength);\n return realOrNull(view.getFloat64(0, false));\n },\n ieee754_inc(args) {\n requireArgs(\"ieee754_inc\", args, 2);\n const n = num(args[0]!);\n const delta = num(args[1]!);\n if (n === null || delta === null) return null;\n const buf = new ArrayBuffer(8);\n const view = new DataView(buf);\n view.setFloat64(0, n, false);\n let bits = view.getBigUint64(0, false);\n const step = BigInt(Math.trunc(delta));\n bits = (bits + step) & 0xffffffffffffffffn;\n view.setBigUint64(0, bits, false);\n return realOrNull(view.getFloat64(0, false));\n },\n};\n\n// silence unused\nvoid (null as unknown as FunctionContext);\n", "import { SqliteError } from \"../errors/index.ts\";\n\nfunction escapeRegexChar(char: string): string {\n return /[\\\\^$.*+?()[\\]{}|]/.test(char) ? `\\\\${char}` : char;\n}\n\nfunction likeLiteral(char: string): string {\n const code = char.codePointAt(0)!;\n if (code >= 65 && code <= 90) return `[${char}${char.toLowerCase()}]`;\n if (code >= 97 && code <= 122) return `[${char}${char.toUpperCase()}]`;\n return escapeRegexChar(char);\n}\n\n/**\n * SQLite LIKE matching. ASCII letters are case-insensitive.\n *\n * @param text - Value to test.\n * @param pattern - Pattern with `%` / `_` wildcards.\n * @param escape - Optional single-character ESCAPE (or `null`).\n */\nexport function likeMatch(text: string, pattern: string, escape: string | null = null): boolean {\n if (escape !== null && [...escape].length !== 1) {\n throw new SqliteError(\"ESCAPE expression must be a single character\", \"other\");\n }\n\n let source = \"^\";\n const chars = [...pattern];\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i]!;\n if (escape !== null && char === escape) {\n const next = chars[++i];\n source += next === undefined ? likeLiteral(char) : likeLiteral(next);\n } else if (char === \"%\") {\n source += \"[\\\\s\\\\S]*\";\n } else if (char === \"_\") {\n source += \"[\\\\s\\\\S]\";\n } else {\n source += likeLiteral(char);\n }\n }\n return new RegExp(`${source}$`).test(text);\n}\n\n/**\n * SQLite GLOB matching. GLOB is case-sensitive and uses Unix `*` / `?` wildcards.\n *\n * @param text - Value to test.\n * @param pattern - GLOB pattern.\n */\nexport function globMatch(text: string, pattern: string): boolean {\n let source = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i]!;\n if (char === \"*\") {\n source += \"[\\\\s\\\\S]*\";\n } else if (char === \"?\") {\n source += \"[\\\\s\\\\S]\";\n } else if (char === \"[\") {\n let end = i + 1;\n if (pattern[end] === \"^\") end++;\n if (pattern[end] === \"]\") end++;\n while (end < pattern.length && pattern[end] !== \"]\") end++;\n if (end >= pattern.length) {\n source += \"\\\\[\";\n } else {\n let content = pattern.slice(i + 1, end);\n // SQLite uses either ^ or ! as the first character to negate a class.\n if (content.startsWith(\"!\")) content = `^${content.slice(1)}`;\n source += `[${content.replace(/\\\\/g, \"\\\\\\\\\")}]`;\n i = end;\n }\n } else {\n source += escapeRegexChar(char);\n }\n }\n return new RegExp(`${source}$`).test(text);\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { globMatch, likeMatch } from \"../expressions/like.ts\";\nimport {\n affinityFromTypeName,\n applyAffinity,\n asSqlReal,\n coerceToNumber,\n compareSql,\n type SqlValue,\n storageClassOf,\n typeofSql,\n utf8Decode,\n utf8Encode,\n} from \"../types/value.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\n/** Match bun:sqlite / SQLite 3.51.0 for drop-in parity. */\nexport const SQLITE_MEM_VERSION = \"3.51.0\";\nexport const SQLITE_MEM_SOURCE_ID =\n \"2025-06-12 13:14:41 f0ca7bba1c5e232e5d279fad6338121ab55af0c8c68c84cdfb18ba5114dcaapl\";\n\nconst COMPILE_OPTIONS = [\n \"ENABLE_FTS3\",\n \"ENABLE_FTS4\",\n \"ENABLE_FTS5\",\n \"ENABLE_MATH_FUNCTIONS\",\n \"ENABLE_RTREE\",\n \"ENABLE_DBSTAT_VTAB\",\n \"ENABLE_BYTECODE_VTAB\",\n \"THREADSAFE=1\",\n] as const;\n\nfunction text(value: SqlValue): string {\n if (value instanceof Uint8Array) return utf8Decode(value);\n return String(value);\n}\n\nfunction numeric(value: SqlValue): number {\n return coerceToNumber(value) ?? 0;\n}\n\nexport function castSqlValue(value: SqlValue, typeName: string): SqlValue {\n const affinity = affinityFromTypeName(typeName);\n if (value === null) return null;\n if (affinity === \"BLOB\") {\n return value instanceof Uint8Array ? value : utf8Encode(text(value));\n }\n if (affinity === \"TEXT\") return text(value);\n if (affinity === \"INTEGER\") return Math.trunc(coerceToNumber(value) ?? 0);\n if (affinity === \"REAL\") return asSqlReal(coerceToNumber(value) ?? 0);\n return applyAffinity(value, \"NUMERIC\");\n}\n\nfunction trimChars(value: string, chars: string, left: boolean, right: boolean): string {\n const set = new Set([...chars]);\n const input = [...value];\n let start = 0;\n let end = input.length;\n if (left) while (start < end && set.has(input[start]!)) start++;\n if (right) while (end > start && set.has(input[end - 1]!)) end--;\n return input.slice(start, end).join(\"\");\n}\n\nfunction substr(value: string, startValue: number, lengthValue?: number): string {\n const chars = [...value];\n const start = Math.trunc(startValue);\n let index = start > 0 ? start - 1 : start < 0 ? chars.length + start : 0;\n index = Math.max(0, index);\n if (lengthValue === undefined) return chars.slice(index).join(\"\");\n const length = Math.trunc(lengthValue);\n if (length >= 0) return chars.slice(index, index + length).join(\"\");\n return chars.slice(Math.max(0, index + length), index).join(\"\");\n}\n\nfunction formatPrintf(format: string, args: SqlValue[]): string {\n let index = 0;\n return format.replace(\n /%([0 +\\-#]*)(\\d+)?(?:\\.(\\d+))?([%sdifgGxXcqQ])/g,\n (_match, flags: string, widthText: string | undefined, precisionText: string | undefined, kind: string) => {\n if (kind === \"%\") return \"%\";\n const value = args[index++] ?? null;\n const precision = precisionText === undefined ? undefined : Number(precisionText);\n let result: string;\n switch (kind) {\n case \"d\":\n case \"i\":\n result = String(Math.trunc(numeric(value)));\n break;\n case \"f\":\n result = numeric(value).toFixed(precision ?? 6);\n break;\n case \"g\":\n case \"G\":\n result = numeric(value)\n .toPrecision(precision ?? 6)\n .replace(/\\.?0+(e|$)/i, \"$1\");\n break;\n case \"x\":\n case \"X\":\n result = Math.trunc(numeric(value)).toString(16);\n break;\n case \"c\":\n result = String.fromCodePoint(Math.trunc(numeric(value)));\n break;\n case \"q\":\n result = value === null ? \"(NULL)\" : text(value).replace(/'/g, \"''\");\n break;\n case \"Q\":\n result = value === null ? \"NULL\" : `'${text(value).replace(/'/g, \"''\")}'`;\n break;\n default:\n result = value === null ? \"\" : text(value);\n }\n if (kind === \"G\" || kind === \"X\") result = result.toUpperCase();\n const width = Number(widthText ?? 0);\n if (width > result.length) {\n const pad = flags.includes(\"0\") ? \"0\" : \" \";\n result = flags.includes(\"-\") ? result.padEnd(width, pad) : result.padStart(width, pad);\n }\n return result;\n },\n );\n}\n\nfunction requireArgs(name: string, args: SqlValue[], min: number, max = min): void {\n if (args.length < min || args.length > max) {\n throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n }\n}\n\nconst scalarFunctions: Record<string, ScalarFunction> = {\n abs(args) {\n requireArgs(\"abs\", args, 1);\n const value = args[0]!;\n if (value === null) return null;\n if (typeof value === \"bigint\") return value < 0n ? -value : value;\n return Math.abs(numeric(value));\n },\n coalesce(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function coalesce()\", \"misuse\");\n return args.find((value) => value !== null) ?? null;\n },\n ifnull(args) {\n requireArgs(\"ifnull\", args, 2);\n return args[0] ?? args[1]!;\n },\n nullif(args) {\n requireArgs(\"nullif\", args, 2);\n const comparison = compareSql(args[0]!, args[1]!);\n return comparison === 0 ? null : args[0]!;\n },\n typeof(args) {\n requireArgs(\"typeof\", args, 1);\n return typeofSql(args[0]!);\n },\n length(args) {\n requireArgs(\"length\", args, 1);\n const value = args[0]!;\n if (value === null) return null;\n if (value instanceof Uint8Array) return value.length;\n return [...text(value)].length;\n },\n lower(args) {\n requireArgs(\"lower\", args, 1);\n return args[0] === null ? null : text(args[0]!).replace(/[A-Z]/g, (c) => c.toLowerCase());\n },\n upper(args) {\n requireArgs(\"upper\", args, 1);\n return args[0] === null ? null : text(args[0]!).replace(/[a-z]/g, (c) => c.toUpperCase());\n },\n trim(args) {\n requireArgs(\"trim\", args, 1, 2);\n if (args[0] === null || args[1] === null) return null;\n return trimChars(text(args[0]!), args[1] === undefined ? \" \" : text(args[1]), true, true);\n },\n ltrim(args) {\n requireArgs(\"ltrim\", args, 1, 2);\n if (args[0] === null || args[1] === null) return null;\n return trimChars(text(args[0]!), args[1] === undefined ? \" \" : text(args[1]), true, false);\n },\n rtrim(args) {\n requireArgs(\"rtrim\", args, 1, 2);\n if (args[0] === null || args[1] === null) return null;\n return trimChars(text(args[0]!), args[1] === undefined ? \" \" : text(args[1]), false, true);\n },\n substr(args) {\n requireArgs(\"substr\", args, 2, 3);\n if (args[0] === null || args[1] === null || args[2] === null) return null;\n return substr(text(args[0]!), numeric(args[1]!), args[2] === undefined ? undefined : numeric(args[2]));\n },\n substring(args, context) {\n return scalarFunctions.substr!(args, context);\n },\n replace(args) {\n requireArgs(\"replace\", args, 3);\n if (args.some((value) => value === null)) return null;\n const search = text(args[1]!);\n return search === \"\" ? text(args[0]!) : text(args[0]!).split(search).join(text(args[2]!));\n },\n round(args) {\n requireArgs(\"round\", args, 1, 2);\n if (args[0] === null) return null;\n const places = Math.max(0, Math.min(30, Math.trunc(numeric(args[1] ?? 0))));\n const factor = 10 ** places;\n const scaled = numeric(args[0]!) * factor;\n return (scaled < 0 ? -Math.round(-scaled) : Math.round(scaled)) / factor;\n },\n min(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function min()\", \"misuse\");\n if (args.some((value) => value === null)) return null;\n return args.reduce((best, value) => (compareSql(value, best)! < 0 ? value : best));\n },\n max(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function max()\", \"misuse\");\n if (args.some((value) => value === null)) return null;\n return args.reduce((best, value) => (compareSql(value, best)! > 0 ? value : best));\n },\n random(args, context) {\n requireArgs(\"random\", args, 0);\n if (context.random) return context.random();\n // Fallback deterministic stream when evaluated outside a Database (e.g. unit helpers).\n return 0n;\n },\n randomblob(args, context) {\n requireArgs(\"randomblob\", args, 1);\n if (args[0] === null) return null;\n const length = Math.max(0, Math.trunc(numeric(args[0]!)));\n const out = new Uint8Array(length);\n let offset = 0;\n while (offset < length) {\n const bits = context.randomU64?.() ?? 0n;\n for (let shift = 0; shift < 64 && offset < length; shift += 8) {\n out[offset++] = Number((bits >> BigInt(shift)) & 0xffn);\n }\n }\n return out;\n },\n zeroblob(args) {\n requireArgs(\"zeroblob\", args, 1);\n if (args[0] === null) return null;\n const length = Math.max(0, Math.trunc(numeric(args[0]!)));\n return new Uint8Array(length);\n },\n hex(args) {\n requireArgs(\"hex\", args, 1);\n if (args[0] === null) return \"\";\n const bytes = args[0] instanceof Uint8Array ? args[0] : utf8Encode(text(args[0]!));\n return [...bytes]\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase();\n },\n quote(args) {\n requireArgs(\"quote\", args, 1);\n const value = args[0]!;\n if (value === null) return \"NULL\";\n if (value instanceof Uint8Array) return `X'${scalarFunctions.hex!([value], {})}'`;\n if (typeof value === \"string\") return `'${value.replace(/'/g, \"''\")}'`;\n if (typeof value === \"number\" && !Number.isFinite(value)) return value < 0 ? \"-9.0e+999\" : \"9.0e+999\";\n return String(value);\n },\n printf(args) {\n if (args.length === 0 || args[0] === null) return null;\n return formatPrintf(text(args[0]!), args.slice(1));\n },\n changes(args, context) {\n requireArgs(\"changes\", args, 0);\n return context.changes?.() ?? 0;\n },\n total_changes(args, context) {\n requireArgs(\"total_changes\", args, 0);\n return context.totalChanges?.() ?? 0;\n },\n last_insert_rowid(args, context) {\n requireArgs(\"last_insert_rowid\", args, 0);\n return context.lastInsertRowid?.() ?? 0;\n },\n sqlite_version(args) {\n requireArgs(\"sqlite_version\", args, 0);\n return SQLITE_MEM_VERSION;\n },\n sqlite_source_id(args) {\n requireArgs(\"sqlite_source_id\", args, 0);\n return SQLITE_MEM_SOURCE_ID;\n },\n sqlite_compileoption_used(args) {\n requireArgs(\"sqlite_compileoption_used\", args, 1);\n if (args[0] === null) return null;\n const needle = text(args[0]!)\n .toUpperCase()\n .replace(/^SQLITE_/, \"\");\n return COMPILE_OPTIONS.some((opt) => opt === needle || opt.startsWith(`${needle}=`)) ? 1 : 0;\n },\n sqlite_compileoption_get(args) {\n requireArgs(\"sqlite_compileoption_get\", args, 1);\n if (args[0] === null) return null;\n const index = Math.trunc(numeric(args[0]!));\n if (index < 0 || index >= COMPILE_OPTIONS.length) return null;\n return COMPILE_OPTIONS[index]!;\n },\n sqlite_log(args) {\n requireArgs(\"sqlite_log\", args, 2);\n return null;\n },\n load_extension(args) {\n requireArgs(\"load_extension\", args, 1, 2);\n throw new SqliteError(\"not authorized\", \"misuse\");\n },\n like(args) {\n requireArgs(\"like\", args, 2, 3);\n if (args[0] === null || args[1] === null || args[2] === null) return null;\n // like(pattern, string[, escape]) \u2261 string LIKE pattern [ESCAPE escape]\n const escape = args[2] === undefined ? null : text(args[2]!);\n return likeMatch(text(args[1]!), text(args[0]!), escape) ? 1 : 0;\n },\n glob(args) {\n requireArgs(\"glob\", args, 2);\n if (args[0] === null || args[1] === null) return null;\n // glob(pattern, string) \u2261 string GLOB pattern\n return globMatch(text(args[1]!), text(args[0]!)) ? 1 : 0;\n },\n match() {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n },\n char(args) {\n if (args.length === 0) return \"\";\n let out = \"\";\n for (const arg of args) {\n if (arg === null) continue;\n const code = Math.trunc(numeric(arg));\n if (code > 0) out += String.fromCodePoint(code);\n }\n return out;\n },\n format(args, context) {\n return scalarFunctions.printf!(args, context);\n },\n iif(args) {\n requireArgs(\"iif\", args, 3);\n const cond = args[0];\n if (cond === null) return args[2]!;\n if (typeof cond === \"number\" || typeof cond === \"bigint\") {\n return Number(cond) !== 0 ? args[1]! : args[2]!;\n }\n if (typeof cond === \"string\") return cond.length > 0 ? args[1]! : args[2]!;\n if (cond instanceof Uint8Array) return cond.length > 0 ? args[1]! : args[2]!;\n return args[1]!;\n },\n if(args, context) {\n return scalarFunctions.iif!(args, context);\n },\n instr(args) {\n requireArgs(\"instr\", args, 2);\n if (args[0] === null || args[1] === null) return null;\n if (args[0] instanceof Uint8Array || args[1] instanceof Uint8Array) {\n const hay = args[0] instanceof Uint8Array ? args[0] : utf8Encode(text(args[0]!));\n const needle = args[1] instanceof Uint8Array ? args[1] : utf8Encode(text(args[1]!));\n if (needle.length === 0) return 1;\n outer: for (let i = 0; i <= hay.length - needle.length; i++) {\n for (let j = 0; j < needle.length; j++) {\n if (hay[i + j] !== needle[j]) continue outer;\n }\n return i + 1;\n }\n return 0;\n }\n const hay = text(args[0]!);\n const needle = text(args[1]!);\n if (needle === \"\") return 1;\n const idx = hay.indexOf(needle);\n return idx < 0 ? 0 : [...hay.slice(0, idx)].length + 1;\n },\n unicode(args) {\n requireArgs(\"unicode\", args, 1);\n if (args[0] === null) return null;\n const s = text(args[0]!);\n if (s.length === 0) return null;\n return s.codePointAt(0)!;\n },\n octet_length(args) {\n requireArgs(\"octet_length\", args, 1);\n if (args[0] === null) return null;\n if (args[0] instanceof Uint8Array) return args[0].length;\n return utf8Encode(text(args[0]!)).length;\n },\n unhex(args) {\n requireArgs(\"unhex\", args, 1, 2);\n if (args[0] === null) return null;\n let hex = text(args[0]!).replace(/\\s+/g, \"\");\n if (args[1] !== undefined && args[1] !== null) {\n const sep = text(args[1]!);\n hex = text(args[0]!).split(sep).join(\"\");\n }\n if (hex.length % 2 !== 0) return null;\n if (!/^[0-9a-fA-F]*$/.test(hex)) return null;\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < out.length; i++) {\n out[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n return out;\n },\n concat(args) {\n if (args.some((v) => v === null)) return null;\n return args.map((v) => text(v!)).join(\"\");\n },\n concat_ws(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function concat_ws()\", \"misuse\");\n if (args[0] === null) return null;\n const sep = text(args[0]!);\n const parts: string[] = [];\n for (const arg of args.slice(1)) {\n if (arg === null) continue;\n parts.push(text(arg));\n }\n return parts.join(sep);\n },\n unistr(args) {\n requireArgs(\"unistr\", args, 1);\n if (args[0] === null) return null;\n const input = text(args[0]!);\n let out = \"\";\n for (let i = 0; i < input.length; i++) {\n if (input[i] === \"\\\\\" && input[i + 1] === \"u\") {\n const hex = input.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n throw new SqliteError(\"invalid Unicode escape in unistr()\", \"other\");\n }\n out += String.fromCodePoint(Number.parseInt(hex, 16));\n i += 5;\n } else {\n out += input[i];\n }\n }\n return out;\n },\n unistr_quote(args) {\n requireArgs(\"unistr_quote\", args, 1);\n if (args[0] === null) return \"NULL\";\n const s = text(args[0]!);\n let needs = false;\n let escaped = \"\";\n for (const ch of s) {\n const cp = ch.codePointAt(0)!;\n if (cp < 0x20 || cp === 0x7f) {\n needs = true;\n escaped += `\\\\u${cp.toString(16).padStart(4, \"0\")}`;\n } else if (ch === \"'\") {\n escaped += \"''\";\n } else if (ch === \"\\\\\") {\n needs = true;\n escaped += \"\\\\\\\\\";\n } else {\n escaped += ch;\n }\n }\n return needs ? `unistr('${escaped}')` : `'${escaped}'`;\n },\n likelihood(args) {\n requireArgs(\"likelihood\", args, 2);\n const p = numOrThrow(args[1], \"likelihood\");\n if (p === null || p < 0 || p > 1) {\n throw new SqliteError(\"second argument to likelihood() must be a constant between 0.0 and 1.0\", \"misuse\");\n }\n return args[0]!;\n },\n likely(args) {\n requireArgs(\"likely\", args, 1);\n return args[0]!;\n },\n unlikely(args) {\n requireArgs(\"unlikely\", args, 1);\n return args[0]!;\n },\n unknown() {\n return null;\n },\n uuid(args, context) {\n requireArgs(\"uuid\", args, 0);\n return formatUuid(nextUuidBytes(context));\n },\n uuid_str(args) {\n requireArgs(\"uuid_str\", args, 1);\n if (args[0] === null) return null;\n if (typeof args[0] === \"string\") return args[0].toLowerCase();\n if (args[0] instanceof Uint8Array && args[0].length === 16) return formatUuid(args[0]);\n return null;\n },\n uuid_blob(args) {\n requireArgs(\"uuid_blob\", args, 1);\n if (args[0] === null) return null;\n if (args[0] instanceof Uint8Array && args[0].length === 16) return args[0];\n if (typeof args[0] === \"string\") {\n const hex = args[0].replace(/-/g, \"\");\n if (!/^[0-9a-fA-F]{32}$/.test(hex)) return null;\n const out = new Uint8Array(16);\n for (let i = 0; i < 16; i++) out[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n return out;\n }\n return null;\n },\n // FTS/RTREE helpers registered as context-sensitive stubs; real work is in MATCH/vtab paths.\n optimize() {\n throw new SqliteError(\"unable to use function optimize in the requested context\", \"unsupported\");\n },\n fts5() {\n throw new SqliteError(\"unable to use function fts5 in the requested context\", \"unsupported\");\n },\n fts5_source_id(args) {\n requireArgs(\"fts5_source_id\", args, 0);\n return `fts5: ${SQLITE_MEM_SOURCE_ID}`;\n },\n fts5_get_locale() {\n return null;\n },\n fts5_locale(args) {\n requireArgs(\"fts5_locale\", args, 1, 2);\n return args[0] ?? null;\n },\n fts5_insttoken(args) {\n requireArgs(\"fts5_insttoken\", args, 1);\n return args[0]!;\n },\n fts3_tokenizer() {\n throw new SqliteError(\"unknown tokenizer: \", \"other\");\n },\n};\n\nfunction numOrThrow(value: SqlValue | undefined, name: string): number | null {\n if (value === undefined) throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n if (value === null) return null;\n return coerceToNumber(value);\n}\n\nfunction nextUuidBytes(context: FunctionContext): Uint8Array {\n const out = new Uint8Array(16);\n let offset = 0;\n while (offset < 16) {\n const bits = context.randomU64?.() ?? 0n;\n for (let shift = 0; shift < 64 && offset < 16; shift += 8) {\n out[offset++] = Number((bits >> BigInt(shift)) & 0xffn);\n }\n }\n // RFC 4122 version 4 / variant bits\n out[6] = (out[6]! & 0x0f) | 0x40;\n out[8] = (out[8]! & 0x3f) | 0x80;\n return out;\n}\n\nfunction formatUuid(bytes: Uint8Array): string {\n const hex = [...bytes].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\nexport function getScalarFunctions(): Readonly<Record<string, ScalarFunction>> {\n return scalarFunctions;\n}\n\nexport function invokeScalar(name: string, args: SqlValue[], context: FunctionContext = {}): SqlValue {\n const fn = scalarFunctions[name.toLowerCase()];\n if (!fn) throw new SqliteError(`no such function: ${name}`, \"other\");\n return fn(args, context);\n}\n\nexport { storageClassOf };\n", "import type { SqlValue } from \"../types/value.ts\";\nimport { type AggregateAccumulator, type AggregateFactory, aggregateFunctions } from \"./aggregate.ts\";\nimport { dateTimeFunctions } from \"./datetime.ts\";\nimport { ftsAuxFunctions, rtreeAuxFunctions } from \"./extensions.ts\";\nimport { jsonAggregateFunctions, jsonScalarFunctions } from \"./json.ts\";\nimport { mathFunctions } from \"./math.ts\";\nimport { getScalarFunctions } from \"./scalar.ts\";\n\nexport interface FunctionContext {\n changes?: () => number;\n totalChanges?: () => number;\n lastInsertRowid?: () => number | bigint;\n /** Injectable clock \u2014 defaults to a fixed instant on Database. */\n now?: () => Date;\n /** Injectable SQLite `random()` source \u2014 defaults to a seeded PRNG on Database. */\n random?: () => bigint;\n /** Raw unsigned 64-bit PRNG draws for `randomblob`. */\n randomU64?: () => bigint;\n /** Active FTS MATCH cursor when evaluating projections with MATCH in WHERE. */\n ftsMatch?: import(\"../vtable/fts5.ts\").FtsMatchCursor | null;\n /** Current rowid for FTS aux defaults when MATCH is absent. */\n ftsRowid?: import(\"../storage/row.ts\").Rowid;\n /** Source FTS table name for the current scan row. */\n ftsSourceTable?: string;\n /** Resolve FTS table by name for aux functions. */\n getFtsTable?: (name: string) => import(\"../vtable/fts5.ts\").Fts5VirtualTable | null;\n}\n\nexport type ScalarFunction = (args: SqlValue[], context: FunctionContext) => SqlValue;\n\nexport class FunctionRegistry {\n private readonly scalars = new Map<string, ScalarFunction>();\n private readonly aggregates = new Map<string, AggregateFactory>();\n\n constructor() {\n for (const [name, fn] of Object.entries(getScalarFunctions())) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(dateTimeFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(jsonScalarFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(mathFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(ftsAuxFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(rtreeAuxFunctions)) this.scalars.set(name, fn);\n for (const [name, factory] of Object.entries(aggregateFunctions)) this.aggregates.set(name, factory);\n for (const [name, factory] of Object.entries(jsonAggregateFunctions)) this.aggregates.set(name, factory);\n }\n\n registerScalar(name: string, fn: ScalarFunction): void {\n this.scalars.set(name.toLowerCase(), fn);\n }\n\n registerAggregate(name: string, factory: AggregateFactory): void {\n this.aggregates.set(name.toLowerCase(), factory);\n }\n\n lookupScalar(name: string): ScalarFunction | undefined {\n return this.scalars.get(name.toLowerCase());\n }\n\n lookupAggregate(name: string): AggregateFactory | undefined {\n return this.aggregates.get(name.toLowerCase());\n }\n\n createAggregate(name: string): AggregateAccumulator | undefined {\n return this.lookupAggregate(name)?.();\n }\n\n isAggregateName(name: string): boolean {\n return this.aggregates.has(name.toLowerCase());\n }\n}\n\nexport const defaultFunctionRegistry = new FunctionRegistry();\n\nexport function lookupScalar(name: string): ScalarFunction | undefined {\n return defaultFunctionRegistry.lookupScalar(name);\n}\n\nexport function lookupAggregate(name: string): AggregateFactory | undefined {\n return defaultFunctionRegistry.lookupAggregate(name);\n}\n\nexport function isAggregateName(name: string): boolean {\n return defaultFunctionRegistry.isAggregateName(name);\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { compareSql, type SqlValue } from \"./value.ts\";\n\nexport type BuiltinCollation = \"BINARY\" | \"NOCASE\" | \"RTRIM\";\n\nexport function normalizeForCollation(value: SqlValue, name: string): SqlValue {\n const collation = builtinCollation(name);\n if (typeof value !== \"string\" || collation === \"BINARY\") return value;\n if (collation === \"RTRIM\") return value.replace(/ +$/u, \"\");\n\n let normalized = \"\";\n for (const char of value) {\n const code = char.charCodeAt(0);\n normalized += code >= 0x41 && code <= 0x5a ? String.fromCharCode(code + 0x20) : char;\n }\n return normalized;\n}\n\nexport function compareWithCollation(a: SqlValue, b: SqlValue, name: string): number | null {\n return compareSql(normalizeForCollation(a, name), normalizeForCollation(b, name));\n}\n\nfunction builtinCollation(name: string): BuiltinCollation {\n const normalized = name.toUpperCase();\n if (normalized === \"BINARY\" || normalized === \"NOCASE\" || normalized === \"RTRIM\") return normalized;\n throw new SqliteError(`no such collation sequence: ${name}`, \"other\");\n}\n", "import type { BinaryOp, Expr, SelectStmt } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { jsonArrow } from \"../functions/json.ts\";\nimport { defaultFunctionRegistry } from \"../functions/registry.ts\";\nimport { castSqlValue } from \"../functions/scalar.ts\";\nimport { compareWithCollation } from \"../types/collation.ts\";\nimport {\n asSqlReal,\n canonicalizeNumber,\n coerceToNumber,\n compareSql,\n isTruthySql,\n type SqlValue,\n storageClassOf,\n toInteger,\n utf8Decode,\n} from \"../types/value.ts\";\nimport type { EvalContext } from \"./context.ts\";\nimport { globMatch, likeMatch } from \"./like.ts\";\n\nfunction numberValue(value: SqlValue): number {\n return coerceToNumber(value) ?? 0;\n}\n\nfunction asNumber(value: number): number {\n return canonicalizeNumber(value);\n}\n\nfunction integerValue(value: SqlValue): bigint {\n const integer = toInteger(value);\n return typeof integer === \"bigint\" ? integer : BigInt(integer ?? 0);\n}\n\nfunction textValue(value: SqlValue): string {\n if (value instanceof Uint8Array) return utf8Decode(value);\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"value\" in value &&\n typeof (value as { value: unknown }).value === \"string\"\n ) {\n return (value as { value: string }).value;\n }\n return String(value);\n}\n\nfunction booleanValue(value: boolean): SqlValue {\n return value ? 1 : 0;\n}\n\nfunction executeSelect(ctx: EvalContext, select: SelectStmt): { columns: string[]; rows: SqlValue[][] } {\n if (!ctx.executeSelect) throw new SqliteError(\"subqueries are not available in this evaluation context\", \"misuse\");\n return ctx.executeSelect(select);\n}\n\nfunction resolveColumn(ctx: EvalContext, table: string | null, name: string): SqlValue {\n try {\n return ctx.resolveColumn(table, name);\n } catch (error) {\n if (ctx.parent && error instanceof SqliteError && error.category === \"no_such_column\") {\n return resolveColumn(ctx.parent, table, name);\n }\n throw error;\n }\n}\n\nfunction sqlAnd(left: SqlValue, right: () => SqlValue): SqlValue {\n const leftTruth = isTruthySql(left);\n if (leftTruth === false) return 0;\n const rightTruth = isTruthySql(right());\n if (rightTruth === false) return 0;\n if (leftTruth === null || rightTruth === null) return null;\n return 1;\n}\n\nfunction sqlOr(left: SqlValue, right: () => SqlValue): SqlValue {\n const leftTruth = isTruthySql(left);\n if (leftTruth === true) return 1;\n const rightTruth = isTruthySql(right());\n if (rightTruth === true) return 1;\n if (leftTruth === null || rightTruth === null) return null;\n return 0;\n}\n\nfunction compareResult(op: BinaryOp, left: SqlValue, right: SqlValue, collation?: string): SqlValue {\n if (op === \"IS\" || op === \"IS NOT\" || op === \"IS DISTINCT FROM\" || op === \"IS NOT DISTINCT FROM\") {\n const equal =\n left === null || right === null\n ? left === right\n : (collation ? compareWithCollation(left, right, collation) : compareSql(left, right)) === 0;\n if (op === \"IS\" || op === \"IS NOT DISTINCT FROM\") return booleanValue(equal);\n return booleanValue(!equal);\n }\n const comparison = collation ? compareWithCollation(left, right, collation) : compareSql(left, right);\n if (comparison === null) return null;\n switch (op) {\n case \"=\":\n case \"==\":\n return booleanValue(comparison === 0);\n case \"!=\":\n case \"<>\":\n return booleanValue(comparison !== 0);\n case \"<\":\n return booleanValue(comparison < 0);\n case \"<=\":\n return booleanValue(comparison <= 0);\n case \">\":\n return booleanValue(comparison > 0);\n case \">=\":\n return booleanValue(comparison >= 0);\n default:\n throw new SqliteError(`unsupported comparison operator: ${op}`, \"unsupported\");\n }\n}\n\nfunction evalBinary(op: BinaryOp, leftExpr: Expr, rightExpr: Expr, ctx: EvalContext): SqlValue {\n if (op === \"MATCH\") {\n if (leftExpr.type !== \"column\") {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n const query = textValue(evalExpr(rightExpr, ctx));\n if (!ctx.matchFts) {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n return booleanValue(ctx.matchFts(leftExpr.table, leftExpr.name, query));\n }\n\n if (\n leftExpr.type === \"row\" &&\n rightExpr.type === \"row\" &&\n [\"=\", \"==\", \"!=\", \"<>\", \"<\", \"<=\", \">\", \">=\", \"IS\", \"IS NOT\", \"IS DISTINCT FROM\", \"IS NOT DISTINCT FROM\"].includes(\n op,\n )\n ) {\n return compareRowValues(op, leftExpr.values, rightExpr.values, ctx);\n }\n\n const left = evalExpr(leftExpr, ctx);\n if (op === \"AND\") return sqlAnd(left, () => evalExpr(rightExpr, ctx));\n if (op === \"OR\") return sqlOr(left, () => evalExpr(rightExpr, ctx));\n const right = evalExpr(rightExpr, ctx);\n\n if (op === \"->\" || op === \"->>\") {\n return jsonArrow(left, right, op);\n }\n\n if (\n [\"=\", \"==\", \"!=\", \"<>\", \"<\", \"<=\", \">\", \">=\", \"IS\", \"IS NOT\", \"IS DISTINCT FROM\", \"IS NOT DISTINCT FROM\"].includes(\n op,\n )\n ) {\n return compareResult(op, left, right, resolveComparisonCollation(leftExpr, rightExpr, ctx) ?? undefined);\n }\n if (op === \"LIKE\" || op === \"NOT LIKE\" || op === \"GLOB\" || op === \"NOT GLOB\") {\n if (left === null || right === null) return null;\n const matches = op.includes(\"LIKE\")\n ? likeMatch(textValue(left), textValue(right))\n : globMatch(textValue(left), textValue(right));\n return booleanValue(op.startsWith(\"NOT\") ? !matches : matches);\n }\n if (left === null || right === null) return null;\n switch (op) {\n case \"+\":\n return asNumber(numberValue(left) + numberValue(right));\n case \"-\":\n return asNumber(numberValue(left) - numberValue(right));\n case \"*\":\n return asNumber(numberValue(left) * numberValue(right));\n case \"/\": {\n const divisor = numberValue(right);\n if (divisor === 0) return null;\n if (storageClassOf(left) === \"integer\" && storageClassOf(right) === \"integer\") {\n const quotient = integerValue(left) / integerValue(right);\n return quotient <= BigInt(Number.MAX_SAFE_INTEGER) && quotient >= BigInt(Number.MIN_SAFE_INTEGER)\n ? Number(quotient)\n : quotient;\n }\n return asNumber(numberValue(left) / divisor);\n }\n case \"%\": {\n const divisor = integerValue(right);\n if (divisor === 0n) return null;\n const remainder = integerValue(left) % divisor;\n return remainder <= BigInt(Number.MAX_SAFE_INTEGER) && remainder >= BigInt(Number.MIN_SAFE_INTEGER)\n ? Number(remainder)\n : remainder;\n }\n case \"||\":\n return textValue(left) + textValue(right);\n case \"&\":\n return safeIntegerResult(integerValue(left) & integerValue(right));\n case \"|\":\n return safeIntegerResult(integerValue(left) | integerValue(right));\n case \"<<\":\n return safeIntegerResult(integerValue(left) << integerValue(right));\n case \">>\":\n return safeIntegerResult(integerValue(left) >> integerValue(right));\n case \"IN\":\n case \"NOT IN\":\n throw new SqliteError(`${op} requires an IN expression node`, \"misuse\");\n default:\n throw new SqliteError(`unsupported binary operator: ${op}`, \"unsupported\");\n }\n}\n\nfunction safeIntegerResult(value: bigint): number | bigint {\n return value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER) ? Number(value) : value;\n}\n\nfunction compareRowValues(op: BinaryOp, leftExprs: Expr[], rightExprs: Expr[], ctx: EvalContext): SqlValue {\n if (leftExprs.length !== rightExprs.length) {\n throw new SqliteError(\"row value misused\", \"misuse\");\n }\n const isIsFamily = op === \"IS\" || op === \"IS NOT\" || op === \"IS DISTINCT FROM\" || op === \"IS NOT DISTINCT FROM\";\n let sawNull = false;\n for (let i = 0; i < leftExprs.length; i++) {\n const left = evalExpr(leftExprs[i]!, ctx);\n const right = evalExpr(rightExprs[i]!, ctx);\n if (isIsFamily) {\n const equal = left === null || right === null ? left === right : compareSql(left, right) === 0;\n if (!equal) {\n if (op === \"IS\" || op === \"IS NOT DISTINCT FROM\") return booleanValue(false);\n return booleanValue(true);\n }\n continue;\n }\n if (left === null || right === null) {\n sawNull = true;\n continue;\n }\n const cmp = compareSql(left, right);\n if (cmp === null) {\n sawNull = true;\n continue;\n }\n if (cmp !== 0) {\n switch (op) {\n case \"=\":\n case \"==\":\n return booleanValue(false);\n case \"!=\":\n case \"<>\":\n return booleanValue(true);\n case \"<\":\n return booleanValue(cmp < 0);\n case \"<=\":\n return booleanValue(cmp < 0);\n case \">\":\n return booleanValue(cmp > 0);\n case \">=\":\n return booleanValue(cmp > 0);\n }\n }\n }\n if (isIsFamily) {\n if (op === \"IS\" || op === \"IS NOT DISTINCT FROM\") return booleanValue(true);\n return booleanValue(false);\n }\n if (sawNull) return null;\n switch (op) {\n case \"=\":\n case \"==\":\n case \"<=\":\n case \">=\":\n return booleanValue(true);\n case \"!=\":\n case \"<>\":\n case \"<\":\n case \">\":\n return booleanValue(false);\n default:\n return null;\n }\n}\n\nfunction rowValuesEqual(left: SqlValue[], right: SqlValue[]): boolean | null {\n if (left.length !== right.length) return false;\n let sawNull = false;\n for (let i = 0; i < left.length; i++) {\n const a = left[i]!;\n const b = right[i]!;\n if (a === null || b === null) {\n sawNull = true;\n continue;\n }\n const cmp = compareSql(a, b);\n if (cmp === null) {\n sawNull = true;\n continue;\n }\n if (cmp !== 0) return false;\n }\n return sawNull ? null : true;\n}\n\nfunction explicitCollation(expr: Expr): string | null {\n switch (expr.type) {\n case \"collate\":\n return expr.collation;\n case \"unary\":\n case \"cast\":\n return explicitCollation(expr.expr);\n case \"binary\":\n return explicitCollation(expr.left) ?? explicitCollation(expr.right);\n case \"between\":\n return explicitCollation(expr.expr) ?? explicitCollation(expr.lower) ?? explicitCollation(expr.upper);\n case \"in\":\n return (\n explicitCollation(expr.expr) ??\n (Array.isArray(expr.values) ? (expr.values.map(explicitCollation).find((name) => name !== null) ?? null) : null)\n );\n case \"like\":\n return explicitCollation(expr.expr) ?? explicitCollation(expr.pattern);\n case \"case\":\n return (\n (expr.base && explicitCollation(expr.base)) ??\n expr.whens\n .flatMap((branch) => [branch.when, branch.then])\n .map(explicitCollation)\n .find((name) => name !== null) ??\n (expr.else && explicitCollation(expr.else)) ??\n null\n );\n case \"row\":\n return expr.values.map(explicitCollation).find((name) => name !== null) ?? null;\n default:\n return null;\n }\n}\n\n/** Explicit COLLATE wins; otherwise inherit declared column collation (left then right). */\nfunction resolveComparisonCollation(leftExpr: Expr, rightExpr: Expr, ctx: EvalContext): string | null {\n const explicit = explicitCollation(leftExpr) ?? explicitCollation(rightExpr);\n if (explicit) return explicit;\n return inheritedCollation(leftExpr, ctx) ?? inheritedCollation(rightExpr, ctx);\n}\n\nfunction inheritedCollation(expr: Expr, ctx: EvalContext): string | null {\n switch (expr.type) {\n case \"collate\":\n return inheritedCollation(expr.expr, ctx);\n case \"column\":\n return (\n ctx.resolveCollation?.(expr.table, expr.name) ?? ctx.parent?.resolveCollation?.(expr.table, expr.name) ?? null\n );\n case \"unary\":\n case \"cast\":\n return inheritedCollation(expr.expr, ctx);\n default:\n return null;\n }\n}\n\nfunction evalIn(left: SqlValue, values: SqlValue[], not: boolean): SqlValue {\n if (values.length === 0) return booleanValue(not);\n if (left === null) return null;\n let sawNull = false;\n for (const value of values) {\n if (value === null) {\n sawNull = true;\n } else if (compareSql(left, value) === 0) {\n return booleanValue(!not);\n }\n }\n if (sawNull) return null;\n return booleanValue(not);\n}\n\n/**\n * Evaluate a parsed SQL expression against `ctx` (columns, parameters, functions).\n *\n * @param expr - Expression AST node from {@link parse}.\n * @param ctx - Column / parameter / function resolution.\n */\nexport function evalExpr(expr: Expr, ctx: EvalContext): SqlValue {\n switch (expr.type) {\n case \"literal\": {\n if (expr.forceReal && typeof expr.value === \"number\") {\n return asSqlReal(expr.value);\n }\n return expr.value;\n }\n case \"null\":\n return null;\n case \"column\":\n return resolveColumn(ctx, expr.table, expr.name);\n case \"parameter\":\n return ctx.getParameter(expr.name);\n case \"collate\":\n return evalExpr(expr.expr, ctx);\n case \"unary\": {\n const value = evalExpr(expr.expr, ctx);\n if (expr.op === \"NOT\") {\n const truth = isTruthySql(value);\n return truth === null ? null : booleanValue(!truth);\n }\n if (value === null) return null;\n if (expr.op === \"+\") return asNumber(numberValue(value));\n if (expr.op === \"-\") return asNumber(-numberValue(value));\n return ~integerValue(value);\n }\n case \"binary\":\n return evalBinary(expr.op, expr.left, expr.right, ctx);\n case \"between\": {\n const value = evalExpr(expr.expr, ctx);\n const collation =\n resolveComparisonCollation(expr.expr, expr.lower, ctx) ??\n resolveComparisonCollation(expr.expr, expr.upper, ctx) ??\n undefined;\n const lower = compareResult(\">=\", value, evalExpr(expr.lower, ctx), collation);\n const result = sqlAnd(lower, () => compareResult(\"<=\", value, evalExpr(expr.upper, ctx), collation));\n if (result === null) return null;\n return expr.not ? booleanValue(result === 0) : result;\n }\n case \"in\": {\n if (expr.expr.type === \"row\" && Array.isArray(expr.values)) {\n const left = expr.expr.values.map((value) => evalExpr(value, ctx));\n let sawNull = false;\n let found = false;\n for (const candidate of expr.values) {\n if (candidate.type !== \"row\") {\n throw new SqliteError(\"row value misused\", \"misuse\");\n }\n const right = candidate.values.map((value) => evalExpr(value, ctx));\n const eq = rowValuesEqual(left, right);\n if (eq === true) {\n found = true;\n break;\n }\n if (eq === null) sawNull = true;\n }\n if (found) return booleanValue(!expr.not);\n if (sawNull) return null;\n return booleanValue(expr.not);\n }\n const left = evalExpr(expr.expr, ctx);\n const values = Array.isArray(expr.values)\n ? expr.values.map((value) => evalExpr(value, ctx))\n : executeSelect(ctx, expr.values).rows.map((row) => row[0] ?? null);\n return evalIn(left, values, expr.not);\n }\n case \"like\": {\n const value = evalExpr(expr.expr, ctx);\n const pattern = evalExpr(expr.pattern, ctx);\n const escape = expr.escape === null ? null : evalExpr(expr.escape, ctx);\n if (value === null || pattern === null || (escape === null && expr.escape !== null)) return null;\n const match =\n expr.op === \"LIKE\"\n ? likeMatch(textValue(value), textValue(pattern), escape === null ? null : textValue(escape))\n : globMatch(textValue(value), textValue(pattern));\n return booleanValue(expr.not ? !match : match);\n }\n case \"case\": {\n if (expr.base === null) {\n for (const branch of expr.whens) {\n if (isTruthySql(evalExpr(branch.when, ctx)) === true) return evalExpr(branch.then, ctx);\n }\n } else {\n const base = evalExpr(expr.base, ctx);\n for (const branch of expr.whens) {\n if (compareSql(base, evalExpr(branch.when, ctx)) === 0) return evalExpr(branch.then, ctx);\n }\n }\n return expr.else === null ? null : evalExpr(expr.else, ctx);\n }\n case \"cast\":\n return castSqlValue(evalExpr(expr.expr, ctx), expr.typeName);\n case \"function\": {\n if (expr.args === \"*\") throw new SqliteError(`wrong number of arguments to function ${expr.name}()`, \"misuse\");\n if (expr.name.toLowerCase() === \"raise\") {\n evalRaiseFunction(expr.args, ctx);\n throw new SqliteError(\"RAISE() did not abort execution\", \"misuse\");\n }\n if (\n expr.name.toLowerCase() === \"typeof\" &&\n expr.args.length === 1 &&\n expr.args[0]?.type === \"column\" &&\n ctx.resolveStorageClass\n ) {\n return ctx.resolveStorageClass(expr.args[0].table, expr.args[0].name);\n }\n const fn = (ctx.functions ?? defaultFunctionRegistry).lookupScalar(expr.name);\n if (!fn) throw new SqliteError(`no such function: ${expr.name}`, \"other\");\n return fn(\n expr.args.map((arg) => evalExpr(arg, ctx)),\n ctx.functionContext ?? {},\n );\n }\n case \"exists\": {\n const exists = executeSelect(ctx, expr.select).rows.length > 0;\n return booleanValue(expr.not ? !exists : exists);\n }\n case \"subquery\": {\n const result = executeSelect(ctx, expr.select);\n if (result.columns.length > 1) throw new SqliteError(\"sub-select returns more than 1 column\", \"other\");\n return result.rows[0]?.[0] ?? null;\n }\n case \"aggregate\":\n throw new SqliteError(\"aggregate expression requires aggregate evaluation\", \"misuse\");\n case \"window\":\n throw new SqliteError(\"window expression requires window evaluation\", \"misuse\");\n case \"row\":\n throw new SqliteError(\"row value cannot be used as a scalar value\", \"misuse\");\n }\n}\n\nfunction evalRaiseFunction(args: Expr[], ctx: EvalContext): never {\n if (!ctx.raise) throw new SqliteError(\"RAISE() may only be used within a trigger-program\", \"other\");\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function RAISE()\", \"misuse\");\n }\n const action = raiseActionName(args[0]!);\n if (!action) throw new SqliteError(\"bad argument to RAISE()\", \"other\");\n let message: string | undefined;\n if (args.length === 2) {\n const value = evalExpr(args[1]!, ctx);\n message = value === null ? undefined : String(value);\n }\n ctx.raise(action, message);\n throw new SqliteError(message ?? \"RAISE\", \"other\");\n}\n\nfunction raiseActionName(expr: Expr): \"IGNORE\" | \"ABORT\" | \"FAIL\" | \"ROLLBACK\" | null {\n if (expr.type === \"column\" && expr.table === null) {\n const name = expr.name.toUpperCase();\n if (name === \"IGNORE\" || name === \"ABORT\" || name === \"FAIL\" || name === \"ROLLBACK\") return name;\n }\n if (expr.type === \"literal\" && typeof expr.value === \"string\") {\n const name = expr.value.toUpperCase();\n if (name === \"IGNORE\" || name === \"ABORT\" || name === \"FAIL\" || name === \"ROLLBACK\") return name;\n }\n return null;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport { compareSql, isSqlJsonText, isSqlReal, type SqlValue } from \"../types/value.ts\";\n\nexport class IndexStore {\n readonly name: string;\n private entries: Map<string, Rowid[]>;\n private keyValues: Map<string, SqlValue[]>;\n private sortedKeys: string[] | null;\n frozen = false;\n\n constructor(\n name = \"index\",\n entries?: ReadonlyMap<string, readonly Rowid[]>,\n keyValues?: ReadonlyMap<string, readonly SqlValue[]>,\n ) {\n this.name = name;\n this.entries = new Map();\n this.keyValues = new Map();\n this.sortedKeys = null;\n if (entries) {\n for (const [key, rowids] of entries) this.entries.set(key, [...rowids]);\n }\n if (keyValues) {\n for (const [key, values] of keyValues) this.keyValues.set(key, [...values]);\n }\n }\n\n checkUnique(values: readonly SqlValue[], rowid?: Rowid): void {\n const key = serializeIndexKey(values);\n if (key === null) return;\n const existing = this.entries.get(key);\n if (!existing) return;\n for (const id of existing) {\n if (rowid === undefined || !sameRowid(id, rowid)) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${this.name}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n }\n }\n\n insert(values: readonly SqlValue[], rowid: Rowid, unique = true): void {\n this.assertMutable();\n const key = serializeIndexKey(values);\n if (key === null) return;\n if (unique) this.checkUnique(values, rowid);\n const existing = this.entries.get(key);\n if (!existing) {\n this.entries.set(key, [rowid]);\n this.keyValues.set(key, [...values]);\n this.sortedKeys = null;\n return;\n }\n for (const id of existing) if (sameRowid(id, rowid)) return;\n existing.push(rowid);\n }\n\n lookup(values: readonly SqlValue[]): readonly Rowid[] {\n const key = serializeIndexKey(values);\n if (key === null) return [];\n return this.entries.get(key) ?? [];\n }\n\n /** Leftmost prefix match: INDEX(a,b) used for WHERE a = ?. */\n lookupPrefix(values: readonly SqlValue[]): readonly Rowid[] {\n if (values.length === 0) return [];\n const prefix = serializeIndexKey(values);\n if (prefix === null) return [];\n const exact = this.entries.get(prefix);\n const needle = `${prefix}|`;\n const rowids: Rowid[] = exact ? [...exact] : [];\n for (const [key, ids] of this.entries) {\n if (key.startsWith(needle)) rowids.push(...ids);\n }\n return rowids;\n }\n\n /**\n * Ordered scan of rowids for a single-column comparison.\n * `op` applies to the first key component.\n */\n rangeLookup(op: \">\" | \">=\" | \"<\" | \"<=\" | \"between\", bound: SqlValue, bound2?: SqlValue): readonly Rowid[] {\n const rowids: Rowid[] = [];\n const keys = this.orderedKeys();\n for (const key of keys) {\n const values = this.keyValues.get(key);\n if (!values || values[0] === undefined) continue;\n const cmp = compareSerializedOrder(values[0]!, bound);\n let ok = false;\n if (op === \">\") ok = cmp > 0;\n else if (op === \">=\") ok = cmp >= 0;\n else if (op === \"<\") ok = cmp < 0;\n else if (op === \"<=\") ok = cmp <= 0;\n else if (op === \"between\" && bound2 !== undefined) {\n ok = cmp >= 0 && compareSerializedOrder(values[0]!, bound2) <= 0;\n }\n if (ok) {\n const ids = this.entries.get(key);\n if (ids) rowids.push(...ids);\n }\n }\n return rowids;\n }\n\n orderedRowids(desc = false): readonly Rowid[] {\n const keys = this.orderedKeys();\n const rowids: Rowid[] = [];\n const seq = desc ? [...keys].reverse() : keys;\n for (const key of seq) {\n const ids = this.entries.get(key);\n if (ids) rowids.push(...ids);\n }\n return rowids;\n }\n\n remove(values: readonly SqlValue[], rowid?: Rowid): boolean {\n this.assertMutable();\n const key = serializeIndexKey(values);\n if (key === null) return false;\n const existing = this.entries.get(key);\n if (!existing) return false;\n if (rowid === undefined) {\n this.entries.delete(key);\n this.keyValues.delete(key);\n this.sortedKeys = null;\n return true;\n }\n const index = existing.findIndex((id) => sameRowid(id, rowid));\n if (index < 0) return false;\n existing.splice(index, 1);\n if (existing.length === 0) {\n this.entries.delete(key);\n this.keyValues.delete(key);\n this.sortedKeys = null;\n }\n return true;\n }\n\n clear(): void {\n this.assertMutable();\n this.entries.clear();\n this.keyValues.clear();\n this.sortedKeys = null;\n }\n\n clone(): IndexStore {\n return new IndexStore(this.name, this.entries, this.keyValues);\n }\n\n freeze(): void {\n this.frozen = true;\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n private orderedKeys(): string[] {\n if (this.sortedKeys) return this.sortedKeys;\n const keys = [...this.entries.keys()];\n keys.sort((a, b) => {\n const left = this.keyValues.get(a);\n const right = this.keyValues.get(b);\n if (!left || !right) return a < b ? -1 : a > b ? 1 : 0;\n const n = Math.min(left.length, right.length);\n for (let i = 0; i < n; i++) {\n const cmp = compareSql(left[i] ?? null, right[i] ?? null);\n if (cmp !== 0) return cmp ?? 0;\n }\n return left.length - right.length;\n });\n this.sortedKeys = keys;\n return keys;\n }\n\n private assertMutable(): void {\n if (this.frozen) throw new SqliteError(\"internal: cannot mutate a frozen index\", \"other\");\n }\n}\n\nexport function serializeIndexKey(values: readonly SqlValue[]): string | null {\n if (values.some((value) => value === null)) return null;\n return (values as readonly Exclude<SqlValue, null>[])\n .map(serializeValue)\n .map((part) => `${part.length}:${part}`)\n .join(\"|\");\n}\n\nfunction serializeValue(value: Exclude<SqlValue, null>): string {\n if (isSqlReal(value)) {\n const n = value.value;\n if (Number.isNaN(n)) return \"f:nan\";\n if (n === Infinity) return \"f:+inf\";\n if (n === -Infinity) return \"f:-inf\";\n return `f:${Object.is(n, -0) ? \"0\" : n.toString()}`;\n }\n if (isSqlJsonText(value)) return `t:${value.value}`;\n if (typeof value === \"bigint\") return `n:${value.toString()}`;\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) return `n:${BigInt(value).toString()}`;\n if (Number.isNaN(value)) return \"f:nan\";\n if (value === Infinity) return \"f:+inf\";\n if (value === -Infinity) return \"f:-inf\";\n return `f:${Object.is(value, -0) ? \"0\" : value.toString()}`;\n }\n if (typeof value === \"string\") return `t:${value}`;\n let hex = \"\";\n for (const byte of value) hex += byte.toString(16).padStart(2, \"0\");\n return `b:${hex}`;\n}\n\nfunction compareSerializedOrder(left: SqlValue, right: SqlValue): number {\n return compareSql(left, right) ?? 0;\n}\n\nfunction sameRowid(left: Rowid, right: Rowid): boolean {\n return typeof left === \"bigint\" || typeof right === \"bigint\" ? BigInt(left) === BigInt(right) : left === right;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { asSqlReal, coerceToNumber, isSqlReal, storageClassOf, type SqlValue, utf8Decode } from \"./value.ts\";\n\nconst STRICT_TYPES = new Set([\"INT\", \"INTEGER\", \"REAL\", \"TEXT\", \"BLOB\", \"ANY\"]);\n\nexport function isStrictTypeName(typeName: string | null | undefined): boolean {\n if (!typeName) return false;\n return STRICT_TYPES.has(typeName.trim().toUpperCase());\n}\n\nexport function applyStrictValue(value: SqlValue, typeName: string, table: string, column: string): SqlValue {\n if (value === null) return null;\n const declared = typeName.trim().toUpperCase();\n const storage = storageClassOf(value);\n if (declared === \"ANY\") return value;\n\n if (declared === \"TEXT\") {\n if (storage === \"text\") return typeof value === \"string\" ? value : String((value as { value: string }).value);\n if (storage === \"integer\" || storage === \"real\") return String(isSqlReal(value) ? value.value : value);\n throw cannotStore(storage, declared, table, column);\n }\n\n if (declared === \"INT\" || declared === \"INTEGER\") {\n if (storage === \"integer\") return value;\n if (storage === \"real\") {\n const n = isSqlReal(value) ? value.value : Number(value);\n if (Number.isInteger(n)) return n;\n throw cannotStore(storage, declared, table, column);\n }\n if (storage === \"text\") {\n const n = coerceToNumber(value);\n if (n !== null && Number.isInteger(n) && String(value).trim() === String(n)) return n;\n throw cannotStore(storage, declared, table, column);\n }\n throw cannotStore(storage, declared, table, column);\n }\n\n if (declared === \"REAL\") {\n if (storage === \"real\") return isSqlReal(value) ? value : asSqlReal(Number(value));\n if (storage === \"integer\") return asSqlReal(typeof value === \"bigint\" ? Number(value) : Number(value));\n if (storage === \"text\") {\n const n = coerceToNumber(value);\n if (n !== null) return asSqlReal(n);\n }\n throw cannotStore(storage, declared, table, column);\n }\n\n if (declared === \"BLOB\") {\n if (storage === \"blob\") return value;\n throw cannotStore(storage, declared, table, column);\n }\n\n throw new SqliteError(`unknown datatype for ${table}.${column}: \"${typeName}\"`, \"other\");\n}\n\nfunction cannotStore(storage: string, declared: string, table: string, column: string): never {\n const shown = storage === \"integer\" ? \"INT\" : storage.toUpperCase();\n throw new SqliteError(\n `cannot store ${shown} value in ${declared} column ${table}.${column}`,\n \"datatype_mismatch\",\n \"SQLITE_CONSTRAINT_DATATYPE\",\n );\n}\n\nexport function unknownStrictType(table: string, column: string, typeName: string): never {\n throw new SqliteError(`unknown datatype for ${table}.${column}: \"${typeName}\"`, \"other\");\n}\n\n/** SQLite reports INT for the integer storage class in STRICT errors. */\nexport function strictStorageLabel(value: SqlValue): string {\n const storage = storageClassOf(value);\n if (storage === \"integer\") return \"INT\";\n if (storage === \"text\") return \"TEXT\";\n if (storage === \"real\") return \"REAL\";\n if (storage === \"blob\") return \"BLOB\";\n return \"NULL\";\n}\n\nvoid utf8Decode;\n", "import { SqliteError } from \"../../errors/index.ts\";\n\nexport type FtsKind = \"fts5\" | \"fts3\" | \"fts4\";\n\nexport type FtsDetail = \"full\" | \"column\" | \"none\";\n\nexport interface FtsColumnDef {\n name: string;\n unindexed: boolean;\n}\n\nexport interface FtsTokenizerConfig {\n /** Primary tokenizer name (unicode61, ascii, porter, trigram). */\n name: string;\n /** Base tokenizer when name is porter. */\n base?: string;\n removeDiacritics?: 0 | 1 | 2;\n tokenchars?: string;\n separators?: string;\n caseSensitive?: boolean; // trigram\n removeDiacriticsTrigram?: boolean;\n}\n\nexport interface FtsTableOptions {\n columns: FtsColumnDef[];\n content: \"normal\" | \"contentless\" | \"external\";\n contentTable: string | null;\n contentRowid: string;\n contentlessDelete: boolean;\n prefix: number[];\n columnsize: boolean;\n detail: FtsDetail;\n tokendata: boolean;\n locale: boolean;\n tokenizer: FtsTokenizerConfig;\n /** FTS3/4 */\n languageid: string | null;\n notindexed: Set<string>;\n}\n\nconst OPTION_NAMES = new Set([\n \"tokenize\",\n \"prefix\",\n \"content\",\n \"content_rowid\",\n \"contentless_delete\",\n \"columnsize\",\n \"detail\",\n \"tokendata\",\n \"locale\",\n \"languageid\",\n \"matchinfo\",\n \"order\",\n \"compress\",\n \"uncompress\",\n]);\n\nexport function parseFtsModuleArgs(moduleArgs: string[], kind: FtsKind): FtsTableOptions {\n const columns: FtsColumnDef[] = [];\n const notindexed = new Set<string>();\n let content: FtsTableOptions[\"content\"] = \"normal\";\n let contentTable: string | null = null;\n let contentRowid = \"rowid\";\n let contentlessDelete = false;\n let prefix: number[] = [];\n let columnsize = true;\n let detail: FtsDetail = \"full\";\n let tokendata = false;\n let locale = false;\n let languageid: string | null = null;\n let tokenizer: FtsTokenizerConfig = { name: \"unicode61\", removeDiacritics: 1 };\n\n for (const raw of moduleArgs) {\n const arg = raw.trim();\n if (!arg) continue;\n\n const eq = splitOption(arg);\n if (eq) {\n const key = eq.key.toLowerCase();\n const value = eq.value;\n if (!OPTION_NAMES.has(key) && kind === \"fts5\") {\n // FTS5: unknown option-like keys that aren't columns throw\n if (/^[a-z_][a-z0-9_]*$/i.test(eq.key) && value !== null) {\n // still accept known options only\n }\n }\n switch (key) {\n case \"tokenize\":\n tokenizer = parseTokenizer(value);\n break;\n case \"prefix\":\n prefix = value\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .map((part) => {\n const n = Number(part);\n if (!Number.isInteger(n) || n <= 0) throw new SqliteError(\"SQL logic error\", \"other\");\n return n;\n });\n break;\n case \"content\":\n if (value === \"\") {\n content = \"contentless\";\n contentTable = null;\n } else {\n content = \"external\";\n contentTable = value;\n }\n break;\n case \"content_rowid\":\n contentRowid = value;\n break;\n case \"contentless_delete\":\n contentlessDelete = value === \"1\" || value.toLowerCase() === \"true\";\n break;\n case \"columnsize\":\n columnsize = value !== \"0\";\n break;\n case \"detail\": {\n const d = value.toLowerCase();\n if (d !== \"full\" && d !== \"column\" && d !== \"none\") throw new SqliteError(\"SQL logic error\", \"other\");\n detail = d;\n break;\n }\n case \"tokendata\":\n tokendata = value === \"1\" || value.toLowerCase() === \"true\";\n break;\n case \"locale\":\n locale = value === \"1\" || value.toLowerCase() === \"true\";\n break;\n case \"languageid\":\n languageid = value;\n break;\n default:\n // Treat as column name = something invalid for FTS5 \u2192 column with odd name\n if (kind === \"fts5\") throw new SqliteError(`unrecognized parameter: ${eq.key}`, \"other\");\n columns.push({ name: eq.key, unindexed: false });\n break;\n }\n continue;\n }\n\n // Column form: name [UNINDEXED]\n const parts = arg.split(/\\s+/).filter(Boolean);\n if (parts.length === 0) continue;\n const name = unquoteIdent(parts[0]!);\n const rest = parts.slice(1).map((p) => p.toUpperCase());\n if (rest.includes(\"UNINDEXED\") || rest.includes(\"NOTINDEXED\")) {\n columns.push({ name, unindexed: true });\n notindexed.add(name.toLowerCase());\n } else if (rest.length === 0) {\n if (OPTION_NAMES.has(name.toLowerCase()) && kind === \"fts5\") {\n // bare option name without = is invalid for some; treat as column (SQLite allows content as column name)\n columns.push({ name, unindexed: false });\n } else {\n columns.push({ name, unindexed: false });\n }\n } else if (kind === \"fts3\" || kind === \"fts4\") {\n // FTS3/4 column type names ignored\n columns.push({ name, unindexed: false });\n } else {\n throw new SqliteError(\"SQL logic error\", \"other\");\n }\n }\n\n if (columns.length === 0) throw new SqliteError(\"fts requires at least one column\", \"other\");\n\n const names = new Set<string>();\n for (const column of columns) {\n const key = column.name.toLowerCase();\n if (names.has(key)) throw new SqliteError(\"SQL logic error\", \"other\");\n names.add(key);\n }\n\n return {\n columns,\n content,\n contentTable,\n contentRowid,\n contentlessDelete,\n prefix,\n columnsize,\n detail,\n tokendata,\n locale,\n tokenizer,\n languageid,\n notindexed,\n };\n}\n\nfunction splitOption(arg: string): { key: string; value: string } | null {\n const match = /^([A-Za-z_][\\w]*)\\s*=\\s*(.*)$/s.exec(arg);\n if (!match) return null;\n return { key: match[1]!, value: unquoteValue(match[2]!.trim()) };\n}\n\nfunction unquoteValue(value: string): string {\n if (\n (value.startsWith(\"'\") && value.endsWith(\"'\")) ||\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"`\") && value.endsWith(\"`\"))\n ) {\n const q = value[0]!;\n return value\n .slice(1, -1)\n .replaceAll(q + q, q)\n .replaceAll(\"\\\\'\", \"'\")\n .replaceAll('\\\\\"', '\"');\n }\n return value;\n}\n\nfunction unquoteIdent(value: string): string {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"`\") && value.endsWith(\"`\")) ||\n (value.startsWith(\"[\") && value.endsWith(\"]\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n}\n\nfunction parseTokenizer(spec: string): FtsTokenizerConfig {\n const tokens = tokenizeSpec(spec);\n if (tokens.length === 0) throw new SqliteError(\"no such tokenizer: \", \"other\");\n const name = tokens[0]!.toLowerCase();\n if (name === \"porter\") {\n const base = tokens[1]?.toLowerCase() ?? \"unicode61\";\n const rest = parseUnicodeOpts(tokens.slice(base === \"unicode61\" || base === \"ascii\" ? 2 : 1));\n return { name: \"porter\", base: base === \"ascii\" ? \"ascii\" : \"unicode61\", ...rest };\n }\n if (name === \"trigram\") {\n let caseSensitive = false;\n let removeDiacriticsTrigram = false;\n for (let i = 1; i < tokens.length; i++) {\n const t = tokens[i]!.toLowerCase();\n if (t === \"case_sensitive\" && tokens[i + 1] === \"1\") {\n caseSensitive = true;\n i++;\n } else if (t === \"remove_diacritics\" && tokens[i + 1] === \"1\") {\n removeDiacriticsTrigram = true;\n i++;\n }\n }\n return { name: \"trigram\", caseSensitive, removeDiacriticsTrigram };\n }\n if (name === \"ascii\") {\n return { name: \"ascii\", ...parseUnicodeOpts(tokens.slice(1)) };\n }\n if (name === \"unicode61\") {\n return { name: \"unicode61\", removeDiacritics: 1, ...parseUnicodeOpts(tokens.slice(1)) };\n }\n throw new SqliteError(`no such tokenizer: ${name}`, \"other\");\n}\n\nfunction parseUnicodeOpts(tokens: string[]): Partial<FtsTokenizerConfig> {\n const out: Partial<FtsTokenizerConfig> = {};\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i]!.toLowerCase();\n if (t === \"remove_diacritics\") {\n const v = Number(tokens[++i] ?? \"1\");\n if (v !== 0 && v !== 1 && v !== 2) throw new SqliteError(\"SQL logic error\", \"other\");\n out.removeDiacritics = v as 0 | 1 | 2;\n } else if (t === \"tokenchars\") {\n out.tokenchars = tokens[++i] ?? \"\";\n } else if (t === \"separators\") {\n out.separators = tokens[++i] ?? \"\";\n }\n }\n return out;\n}\n\nfunction tokenizeSpec(spec: string): string[] {\n const out: string[] = [];\n let i = 0;\n while (i < spec.length) {\n while (i < spec.length && /\\s/.test(spec[i]!)) i++;\n if (i >= spec.length) break;\n if (spec[i] === \"'\" || spec[i] === '\"') {\n const q = spec[i]!;\n i++;\n let s = \"\";\n while (i < spec.length && spec[i] !== q) {\n s += spec[i++];\n }\n if (spec[i] === q) i++;\n out.push(s);\n continue;\n }\n let s = \"\";\n while (i < spec.length && !/\\s/.test(spec[i]!)) s += spec[i++];\n out.push(s);\n }\n return out;\n}\n", "import { SqliteError } from \"../../errors/index.ts\";\n\nexport type FtsQueryNode =\n | { type: \"term\"; value: string; prefix: boolean; column: string | null; columns: string[] | null }\n | {\n type: \"phrase\";\n terms: Array<{ value: string; prefix: boolean }>;\n column: string | null;\n columns: string[] | null;\n }\n | { type: \"near\"; children: FtsQueryNode[]; distance: number; column: string | null; columns: string[] | null }\n | { type: \"and\"; children: FtsQueryNode[] }\n | { type: \"or\"; children: FtsQueryNode[] }\n | { type: \"not\"; child: FtsQueryNode }\n | { type: \"true\" };\n\ntype Tok =\n | { kind: \"TERM\"; value: string; prefix: boolean }\n | { kind: \"STRING\"; value: string }\n | { kind: \"AND\" }\n | { kind: \"OR\" }\n | { kind: \"NOT\" }\n | { kind: \"NEAR\" }\n | { kind: \"LPAREN\" }\n | { kind: \"RPAREN\" }\n | { kind: \"COLON\" }\n | { kind: \"COMMA\" }\n | { kind: \"LBRACE\" }\n | { kind: \"RBRACE\" }\n | { kind: \"EOF\" };\n\n/**\n * Parse an FTS5 MATCH expression.\n * Implicit AND between adjacent terms; OR binds looser than AND; NOT is binary (a NOT b).\n */\nexport function parseFts5Query(input: string): FtsQueryNode {\n const tokens = lexFts5(input);\n let i = 0;\n\n function peek(): Tok {\n return tokens[i] ?? { kind: \"EOF\" };\n }\n function next(): Tok {\n return tokens[i++] ?? { kind: \"EOF\" };\n }\n function expect(kind: Tok[\"kind\"]): Tok {\n const t = next();\n if (t.kind !== kind) throw new SqliteError(`fts5: syntax error near \"${displayTok(t)}\"`, \"syntax\");\n return t;\n }\n\n function parseExpr(): FtsQueryNode {\n return parseOr();\n }\n\n function parseOr(): FtsQueryNode {\n let left = parseAnd();\n while (peek().kind === \"OR\") {\n next();\n const right = parseAnd();\n if (left.type === \"or\") left = { type: \"or\", children: [...left.children, right] };\n else left = { type: \"or\", children: [left, right] };\n }\n return left;\n }\n\n function parseAnd(): FtsQueryNode {\n let left = parseUnary();\n while (true) {\n const p = peek();\n if (p.kind === \"EOF\" || p.kind === \"RPAREN\" || p.kind === \"OR\" || p.kind === \"COMMA\" || p.kind === \"RBRACE\")\n break;\n if (p.kind === \"AND\") {\n next();\n const right = parseUnary();\n if (left.type === \"and\") left = { type: \"and\", children: [...left.children, right] };\n else left = { type: \"and\", children: [left, right] };\n continue;\n }\n if (p.kind === \"NOT\") {\n next();\n const right = parseUnary();\n left = { type: \"and\", children: [left, { type: \"not\", child: right }] };\n continue;\n }\n // implicit AND\n if (\n p.kind === \"TERM\" ||\n p.kind === \"STRING\" ||\n p.kind === \"LPAREN\" ||\n p.kind === \"NEAR\" ||\n p.kind === \"LBRACE\" ||\n p.kind === \"COLON\"\n ) {\n // COLON alone is invalid here \u2014 column filter starts with TERM or LBRACE\n if (p.kind === \"COLON\") break;\n const right = parseUnary();\n if (left.type === \"and\") left = { type: \"and\", children: [...left.children, right] };\n else left = { type: \"and\", children: [left, right] };\n continue;\n }\n break;\n }\n return left;\n }\n\n function parseUnary(): FtsQueryNode {\n // column filter: {a b} : expr or col : expr\n const filtered = tryParseColumnFilter();\n if (filtered) return filtered;\n\n const p = peek();\n if (p.kind === \"LPAREN\") {\n next();\n const inner = parseExpr();\n expect(\"RPAREN\");\n return inner;\n }\n if (p.kind === \"NEAR\") {\n next();\n expect(\"LPAREN\");\n const children: FtsQueryNode[] = [];\n children.push(parseUnary());\n while (peek().kind !== \"COMMA\" && peek().kind !== \"RPAREN\" && peek().kind !== \"EOF\") {\n children.push(parseUnary());\n }\n let distance = 10;\n if (peek().kind === \"COMMA\") {\n next();\n const distTok = next();\n if (distTok.kind !== \"TERM\") throw new SqliteError(\"fts5: syntax error near NEAR\", \"syntax\");\n distance = Number(distTok.value);\n if (!Number.isFinite(distance)) throw new SqliteError(\"fts5: syntax error near NEAR\", \"syntax\");\n }\n expect(\"RPAREN\");\n return { type: \"near\", children, distance, column: null, columns: null };\n }\n if (p.kind === \"STRING\") {\n next();\n const terms = p.value\n .split(/\\s+/)\n .filter(Boolean)\n .map((part) => {\n const prefix = part.endsWith(\"*\");\n return { value: prefix ? part.slice(0, -1) : part, prefix };\n });\n return { type: \"phrase\", terms, column: null, columns: null };\n }\n if (p.kind === \"TERM\") {\n next();\n return { type: \"term\", value: p.value, prefix: p.prefix, column: null, columns: null };\n }\n throw new SqliteError(`fts5: syntax error near \"${displayTok(p)}\"`, \"syntax\");\n }\n\n function tryParseColumnFilter(): FtsQueryNode | null {\n const save = i;\n let column: string | null = null;\n let columns: string[] | null = null;\n\n if (peek().kind === \"LBRACE\") {\n next();\n columns = [];\n while (peek().kind !== \"RBRACE\" && peek().kind !== \"EOF\") {\n if (peek().kind === \"TERM\") {\n const termTok = next();\n if (termTok.kind !== \"TERM\") {\n i = save;\n return null;\n }\n columns.push(termTok.value.toLowerCase());\n } else if (peek().kind === \"COMMA\") {\n next();\n } else {\n i = save;\n return null;\n }\n }\n if (peek().kind !== \"RBRACE\") {\n i = save;\n return null;\n }\n next();\n } else if (peek().kind === \"TERM\") {\n const name = next();\n if (name.kind !== \"TERM\") {\n i = save;\n return null;\n }\n if (peek().kind !== \"COLON\") {\n i = save;\n return null;\n }\n column = name.value.toLowerCase();\n } else {\n return null;\n }\n\n if (peek().kind !== \"COLON\") {\n i = save;\n return null;\n }\n next(); // colon\n const inner = parseUnary();\n return applyColumn(inner, column, columns);\n }\n\n if (tokens.length === 1 && tokens[0]!.kind === \"EOF\") return { type: \"true\" };\n const root = parseExpr();\n if (peek().kind !== \"EOF\") throw new SqliteError(`fts5: syntax error near \"${displayTok(peek())}\"`, \"syntax\");\n return root;\n}\n\nfunction applyColumn(node: FtsQueryNode, column: string | null, columns: string[] | null): FtsQueryNode {\n switch (node.type) {\n case \"term\":\n case \"phrase\":\n case \"near\":\n return { ...node, column: column ?? node.column, columns: columns ?? node.columns };\n case \"and\":\n case \"or\":\n return { ...node, children: node.children.map((child) => applyColumn(child, column, columns)) };\n case \"not\":\n return { type: \"not\", child: applyColumn(node.child, column, columns) };\n case \"true\":\n return node;\n }\n}\n\nfunction lexFts5(input: string): Tok[] {\n const tokens: Tok[] = [];\n let i = 0;\n while (i < input.length) {\n const ch = input[i]!;\n if (/\\s/.test(ch)) {\n i++;\n continue;\n }\n if (ch === \"(\") {\n tokens.push({ kind: \"LPAREN\" });\n i++;\n continue;\n }\n if (ch === \")\") {\n tokens.push({ kind: \"RPAREN\" });\n i++;\n continue;\n }\n if (ch === \"{\") {\n tokens.push({ kind: \"LBRACE\" });\n i++;\n continue;\n }\n if (ch === \"}\") {\n tokens.push({ kind: \"RBRACE\" });\n i++;\n continue;\n }\n if (ch === \":\") {\n tokens.push({ kind: \"COLON\" });\n i++;\n continue;\n }\n if (ch === \",\") {\n tokens.push({ kind: \"COMMA\" });\n i++;\n continue;\n }\n if (ch === '\"') {\n i++;\n let value = \"\";\n while (i < input.length && input[i] !== '\"') {\n if (input[i] === \"\\\\\" && i + 1 < input.length) {\n value += input[i + 1];\n i += 2;\n continue;\n }\n value += input[i++];\n }\n if (input[i] === '\"') i++;\n tokens.push({ kind: \"STRING\", value });\n continue;\n }\n // bare word\n let word = \"\";\n while (i < input.length && !/[\\s(){}:,\"]/.test(input[i]!)) word += input[i++];\n if (!word) {\n i++;\n continue;\n }\n const upper = word.toUpperCase();\n if (upper === \"AND\") tokens.push({ kind: \"AND\" });\n else if (upper === \"OR\") tokens.push({ kind: \"OR\" });\n else if (upper === \"NOT\") tokens.push({ kind: \"NOT\" });\n else if (upper === \"NEAR\") {\n // NEAR is a keyword only when followed by '('; otherwise it is a bare term.\n let j = i;\n while (j < input.length && /\\s/.test(input[j]!)) j++;\n if (input[j] === \"(\") tokens.push({ kind: \"NEAR\" });\n else {\n const prefix = word.endsWith(\"*\");\n tokens.push({ kind: \"TERM\", value: prefix ? word.slice(0, -1) : word, prefix });\n }\n } else {\n const prefix = word.endsWith(\"*\");\n tokens.push({ kind: \"TERM\", value: prefix ? word.slice(0, -1) : word, prefix });\n }\n }\n tokens.push({ kind: \"EOF\" });\n return tokens;\n}\n\nfunction displayTok(t: Tok): string {\n switch (t.kind) {\n case \"TERM\":\n return t.prefix ? `${t.value}*` : t.value;\n case \"STRING\":\n return `\"${t.value}\"`;\n case \"EOF\":\n return \"\";\n default:\n return t.kind;\n }\n}\n\n/** FTS3/4 query parser (ENABLE_FTS3_PARENTHESIS style). */\nexport function parseFts3Query(input: string): FtsQueryNode {\n // Reuse FTS5 parser with minor differences: column:term form already handled.\n // FTS3 uses OR/AND/NOT/NEAR similarly when parenthesis enabled.\n try {\n return parseFts5Query(input);\n } catch {\n // Fallback: treat as AND of terms (legacy)\n const terms = input\n .split(/\\s+/)\n .filter(Boolean)\n .filter((t) => !/^(AND|OR|NOT|NEAR)$/i.test(t));\n if (terms.length === 0) return { type: \"true\" };\n const nodes: FtsQueryNode[] = terms.map((t) => {\n const prefix = t.endsWith(\"*\");\n return { type: \"term\" as const, value: prefix ? t.slice(0, -1) : t, prefix, column: null, columns: null };\n });\n return nodes.length === 1 ? nodes[0]! : { type: \"and\", children: nodes };\n }\n}\n", "/** Classic Porter stemming algorithm (English). */\nexport function porterStem(word: string): string {\n let w = word.toLowerCase();\n if (w.length <= 2) return w;\n\n // Step 1a\n if (w.endsWith(\"sses\")) w = `${w.slice(0, -2)}`;\n else if (w.endsWith(\"ies\")) w = `${w.slice(0, -2)}`;\n else if (w.endsWith(\"ss\")) {\n /* keep */\n } else if (w.endsWith(\"s\") && w.length > 3) w = w.slice(0, -1);\n\n // Step 1b\n let step1bStar = false;\n if (w.endsWith(\"eed\")) {\n const stem = w.slice(0, -3);\n if (measure(stem) > 0) w = `${stem}ee`;\n } else {\n let stem: string | null = null;\n if (w.endsWith(\"ed\") && hasVowel(w.slice(0, -2))) stem = w.slice(0, -2);\n else if (w.endsWith(\"ing\") && hasVowel(w.slice(0, -3))) stem = w.slice(0, -3);\n if (stem !== null) {\n w = stem;\n step1bStar = true;\n }\n }\n if (step1bStar) {\n if (w.endsWith(\"at\") || w.endsWith(\"bl\") || w.endsWith(\"iz\")) w = `${w}e`;\n else if (doubleConsonant(w) && !/[lsz]$/.test(w)) w = w.slice(0, -1);\n else if (measure(w) === 1 && cvc(w)) w = `${w}e`;\n }\n\n // Step 1c\n if (w.endsWith(\"y\") && hasVowel(w.slice(0, -1))) w = `${w.slice(0, -1)}i`;\n\n // Step 2\n for (const [suf, rep] of STEP2) {\n if (w.endsWith(suf)) {\n const stem = w.slice(0, -suf.length);\n if (measure(stem) > 0) {\n w = stem + rep;\n break;\n }\n }\n }\n\n // Step 3\n for (const [suf, rep] of STEP3) {\n if (w.endsWith(suf)) {\n const stem = w.slice(0, -suf.length);\n if (measure(stem) > 0) {\n w = stem + rep;\n break;\n }\n }\n }\n\n // Step 4\n for (const suf of STEP4) {\n if (w.endsWith(suf)) {\n const stem = w.slice(0, -suf.length);\n if (measure(stem) > 1) {\n w = stem;\n break;\n }\n }\n }\n if (w.endsWith(\"ion\")) {\n const stem = w.slice(0, -3);\n if (measure(stem) > 1 && /[st]$/.test(stem)) w = stem;\n }\n\n // Step 5a\n if (w.endsWith(\"e\")) {\n const stem = w.slice(0, -1);\n const m = measure(stem);\n if (m > 1 || (m === 1 && !cvc(stem))) w = stem;\n }\n\n // Step 5b\n if (measure(w) > 1 && doubleConsonant(w) && w.endsWith(\"l\")) w = w.slice(0, -1);\n\n return w;\n}\n\nconst STEP2: Array<[string, string]> = [\n [\"ational\", \"ate\"],\n [\"tional\", \"tion\"],\n [\"enci\", \"ence\"],\n [\"anci\", \"ance\"],\n [\"izer\", \"ize\"],\n [\"abli\", \"able\"],\n [\"alli\", \"al\"],\n [\"entli\", \"ent\"],\n [\"eli\", \"e\"],\n [\"ousli\", \"ous\"],\n [\"ization\", \"ize\"],\n [\"ation\", \"ate\"],\n [\"ator\", \"ate\"],\n [\"alism\", \"al\"],\n [\"iveness\", \"ive\"],\n [\"fulness\", \"ful\"],\n [\"ousness\", \"ous\"],\n [\"aliti\", \"al\"],\n [\"iviti\", \"ive\"],\n [\"biliti\", \"ble\"],\n];\n\nconst STEP3: Array<[string, string]> = [\n [\"icate\", \"ic\"],\n [\"ative\", \"\"],\n [\"alize\", \"al\"],\n [\"iciti\", \"ic\"],\n [\"ical\", \"ic\"],\n [\"ful\", \"\"],\n [\"ness\", \"\"],\n];\n\nconst STEP4 = [\n \"al\",\n \"ance\",\n \"ence\",\n \"er\",\n \"ic\",\n \"able\",\n \"ible\",\n \"ant\",\n \"ement\",\n \"ment\",\n \"ent\",\n \"ou\",\n \"ism\",\n \"ate\",\n \"iti\",\n \"ous\",\n \"ive\",\n \"ize\",\n];\n\nfunction isConsonant(word: string, i: number): boolean {\n const c = word[i]!;\n if (\"aeiou\".includes(c)) return false;\n if (c === \"y\") return i === 0 ? true : !isConsonant(word, i - 1);\n return true;\n}\n\nfunction measure(word: string): number {\n let m = 0;\n let i = 0;\n const n = word.length;\n while (i < n && isConsonant(word, i)) i++;\n while (i < n) {\n while (i < n && !isConsonant(word, i)) i++;\n while (i < n && isConsonant(word, i)) i++;\n m++;\n }\n return m;\n}\n\nfunction hasVowel(word: string): boolean {\n for (let i = 0; i < word.length; i++) if (!isConsonant(word, i)) return true;\n return false;\n}\n\nfunction doubleConsonant(word: string): boolean {\n const n = word.length;\n if (n < 2) return false;\n return word[n - 1] === word[n - 2] && isConsonant(word, n - 1);\n}\n\nfunction cvc(word: string): boolean {\n const n = word.length;\n if (n < 3) return false;\n if (!isConsonant(word, n - 1) || isConsonant(word, n - 2) || !isConsonant(word, n - 3)) return false;\n const last = word[n - 1]!;\n return last !== \"w\" && last !== \"x\" && last !== \"y\";\n}\n", "import type { FtsTokenizerConfig } from \"./options.ts\";\nimport { porterStem } from \"./porter.ts\";\n\nexport interface FtsToken {\n /** Normalized token text stored in the index. */\n term: string;\n /** Byte offset of the token in the UTF-8 encoding of the source. */\n start: number;\n /** Byte length in UTF-8. */\n length: number;\n /** Token position (0-based) within the column. */\n position: number;\n /** Original end offset in JS string code units (for highlight). */\n startUnit: number;\n endUnit: number;\n}\n\nexport type TokenizerFn = (text: string) => FtsToken[];\n\nexport function createTokenizer(config: FtsTokenizerConfig): TokenizerFn {\n if (config.name === \"porter\") {\n const base = createTokenizer({\n name: config.base === \"ascii\" ? \"ascii\" : \"unicode61\",\n removeDiacritics: config.removeDiacritics ?? 1,\n tokenchars: config.tokenchars,\n separators: config.separators,\n });\n return (text) =>\n base(text).map((token) => ({\n ...token,\n term: porterStem(token.term),\n }));\n }\n if (config.name === \"trigram\") return createTrigramTokenizer(config);\n if (config.name === \"ascii\") return createAsciiTokenizer(config);\n return createUnicode61Tokenizer(config);\n}\n\nfunction createAsciiTokenizer(config: FtsTokenizerConfig): TokenizerFn {\n const extraToken = new Set(config.tokenchars ?? \"\");\n const extraSep = new Set(config.separators ?? \"\");\n return (text: string) => {\n const tokens: FtsToken[] = [];\n let i = 0;\n let pos = 0;\n while (i < text.length) {\n while (i < text.length && !isAsciiTokenChar(text[i]!, extraToken, extraSep)) i++;\n if (i >= text.length) break;\n const startUnit = i;\n while (i < text.length && isAsciiTokenChar(text[i]!, extraToken, extraSep)) i++;\n const raw = text.slice(startUnit, i);\n const term = raw.toLowerCase();\n if (term.length === 0) continue;\n tokens.push({\n term,\n start: utf8Offset(text, startUnit),\n length: utf8Length(raw),\n position: pos++,\n startUnit,\n endUnit: i,\n });\n }\n return tokens;\n };\n}\n\nfunction createUnicode61Tokenizer(config: FtsTokenizerConfig): TokenizerFn {\n const removeDiacritics = config.removeDiacritics ?? 1;\n const extraToken = new Set([...(config.tokenchars ?? \"\")].map((c) => c));\n const extraSep = new Set([...(config.separators ?? \"\")].map((c) => c));\n return (text: string) => {\n const tokens: FtsToken[] = [];\n let i = 0;\n let pos = 0;\n while (i < text.length) {\n while (i < text.length && !isUnicodeTokenChar(text[i]!, extraToken, extraSep)) i++;\n if (i >= text.length) break;\n const startUnit = i;\n while (i < text.length && isUnicodeTokenChar(text[i]!, extraToken, extraSep)) i++;\n let raw = text.slice(startUnit, i);\n if (removeDiacritics > 0) raw = stripDiacritics(raw, removeDiacritics);\n const term = raw.toLowerCase();\n if (term.length === 0) continue;\n tokens.push({\n term,\n start: utf8Offset(text, startUnit),\n length: utf8Length(text.slice(startUnit, i)),\n position: pos++,\n startUnit,\n endUnit: i,\n });\n }\n return tokens;\n };\n}\n\nfunction createTrigramTokenizer(config: FtsTokenizerConfig): TokenizerFn {\n const caseSensitive = config.caseSensitive ?? false;\n const removeDia = config.removeDiacriticsTrigram ?? false;\n return (text: string) => {\n let source = text;\n if (removeDia) source = stripDiacritics(source, 1);\n if (!caseSensitive) source = source.toLowerCase();\n const tokens: FtsToken[] = [];\n if (source.length < 3) return tokens;\n let pos = 0;\n for (let i = 0; i <= source.length - 3; i++) {\n const term = source.slice(i, i + 3);\n tokens.push({\n term,\n start: utf8Offset(source, i),\n length: utf8Length(term),\n position: pos++,\n startUnit: i,\n endUnit: i + 3,\n });\n }\n return tokens;\n };\n}\n\nfunction isAsciiTokenChar(ch: string, extraToken: Set<string>, extraSep: Set<string>): boolean {\n if (extraSep.has(ch)) return false;\n if (extraToken.has(ch)) return true;\n const code = ch.charCodeAt(0);\n if (code > 127) return false;\n return (code >= 48 && code <= 57) || (code >= 65 && code <= 90) || (code >= 97 && code <= 122);\n}\n\nfunction isUnicodeTokenChar(ch: string, extraToken: Set<string>, extraSep: Set<string>): boolean {\n if (extraSep.has(ch)) return false;\n if (extraToken.has(ch)) return true;\n // Letters, marks (combining), numbers \u2014 exclude punctuation/symbols/emoji\n return /\\p{L}|\\p{M}|\\p{N}/u.test(ch);\n}\n\nfunction stripDiacritics(text: string, mode: 0 | 1 | 2): string {\n if (mode === 0) return text;\n // NFD then strip combining marks. Mode 2 also folds a few special cases similarly.\n const normalized = text.normalize(\"NFD\");\n let out = \"\";\n for (const ch of normalized) {\n if (/\\p{M}/u.test(ch)) continue;\n out += ch;\n }\n return out;\n}\n\nexport function utf8Length(text: string): number {\n return new TextEncoder().encode(text).length;\n}\n\nexport function utf8Offset(text: string, unitIndex: number): number {\n return new TextEncoder().encode(text.slice(0, unitIndex)).length;\n}\n\n/** Legacy helper used by older call sites \u2014 simple alphanum split. */\nexport function tokenizeFtsText(text: string): string[] {\n return createUnicode61Tokenizer({ name: \"unicode61\", removeDiacritics: 1 })(text).map((t) => t.term);\n}\n", "import { SqliteError } from \"../../errors/index.ts\";\nimport type { Rowid } from \"../../storage/row.ts\";\nimport type { SqlValue } from \"../../types/value.ts\";\nimport { type FtsKind, type FtsTableOptions, parseFtsModuleArgs } from \"./options.ts\";\nimport { type FtsQueryNode, parseFts3Query, parseFts5Query } from \"./query.ts\";\nimport { createTokenizer, type FtsToken, type TokenizerFn, tokenizeFtsText } from \"./tokenize.ts\";\n\nexport interface Fts5Row {\n rowid: Rowid;\n values: Map<string, SqlValue>;\n /** Per-column tokens with positions. */\n tokensByColumn: Map<string, FtsToken[]>;\n}\n\nexport interface FtsMatchHit {\n column: string;\n position: number;\n startUnit: number;\n endUnit: number;\n term: string;\n}\n\nexport interface FtsMatchCursor {\n tableName: string;\n rowid: Rowid;\n query: string;\n ast: FtsQueryNode;\n hits: FtsMatchHit[];\n /** Phrase term strings used for ranking (flattened). */\n phraseTerms: string[][];\n}\n\ninterface Posting {\n rowid: Rowid;\n column: string;\n position: number;\n startUnit: number;\n endUnit: number;\n}\n\nexport class Fts5VirtualTable {\n readonly kind: FtsKind;\n readonly name: string;\n readonly columns: string[];\n readonly originalSql: string | null;\n readonly options: FtsTableOptions;\n readonly rows = new Map<Rowid, Fts5Row>();\n nextRowid: Rowid = 1;\n private readonly tokenize: TokenizerFn;\n /** term -> postings */\n private readonly index = new Map<string, Posting[]>();\n /** Global doc count for bm25. */\n private docCount = 0;\n /** Average document length (tokens across indexed columns). */\n private avgDocLen = 0;\n private totalTokens = 0;\n\n constructor(name: string, moduleArgs: string[], originalSql: string | null = null, kind: FtsKind = \"fts5\") {\n this.kind = kind;\n this.name = name;\n this.originalSql = originalSql;\n this.options = parseFtsModuleArgs(moduleArgs, kind);\n this.columns = this.options.columns.map((c) => c.name);\n if (this.columns.length === 0) throw new SqliteError(\"fts requires at least one column\", \"other\");\n this.tokenize = createTokenizer(this.options.tokenizer);\n }\n\n scan(): Fts5Row[] {\n return [...this.rows.values()];\n }\n\n insert(values: Map<string, SqlValue>, rowid?: Rowid): Rowid {\n // Special command: INSERT INTO t(t) VALUES('optimize') etc.\n const command = this.detectCommand(values);\n if (command !== null) {\n this.runCommand(command, values);\n // Match SQLite: special commands report lastInsertRowid 0\n return 0;\n }\n\n const assigned = rowid ?? this.nextRowid++;\n if (this.rows.has(assigned)) throw new SqliteError(\"PRIMARY KEY constraint failed\", \"constraint_primary\");\n const row = this.buildRow(assigned, values);\n this.rows.set(assigned, row);\n this.indexRow(row);\n this.bumpRowid(assigned);\n return assigned;\n }\n\n update(rowid: Rowid, updates: Map<string, SqlValue>): void {\n const row = this.rows.get(rowid);\n if (!row) return;\n this.unindexRow(row);\n const values = new Map(row.values);\n for (const [key, value] of updates) values.set(key, value);\n const next = this.buildRow(rowid, values);\n this.rows.set(rowid, next);\n this.indexRow(next);\n }\n\n delete(rowid: Rowid): void {\n const row = this.rows.get(rowid);\n if (!row) return;\n this.unindexRow(row);\n this.rows.delete(rowid);\n }\n\n matches(rowid: Rowid, leftTable: string | null, leftColumn: string, query: string): boolean {\n const cursor = this.matchCursor(rowid, leftTable, leftColumn, query);\n return cursor !== null;\n }\n\n matchCursor(rowid: Rowid, leftTable: string | null, leftColumn: string, query: string): FtsMatchCursor | null {\n const row = this.rows.get(rowid);\n if (!row) return null;\n const ast = this.kind === \"fts5\" ? parseFts5Query(query) : parseFts3Query(query);\n const columnLower = leftColumn.toLowerCase();\n const tableLower = this.name.toLowerCase();\n const leftTableLower = leftTable?.toLowerCase() ?? null;\n // Column-restricted MATCH (content MATCH 'x') limits default columns\n let defaultColumns = this.indexedColumns();\n if (columnLower !== tableLower && !(leftTableLower !== null && columnLower === leftTableLower)) {\n const matched = this.columns.find((c) => c.toLowerCase() === columnLower);\n if (matched) defaultColumns = [matched];\n else return null;\n }\n const hits: FtsMatchHit[] = [];\n const ok = this.evalNode(ast, row, defaultColumns, hits);\n if (!ok) return null;\n return {\n tableName: this.name,\n rowid,\n query,\n ast,\n hits,\n phraseTerms: collectPhraseTerms(ast),\n };\n }\n\n bm25(cursor: FtsMatchCursor, weights?: number[]): number {\n const row = this.rows.get(cursor.rowid);\n if (!row) return -0;\n const phrases = cursor.phraseTerms.length > 0 ? cursor.phraseTerms : [];\n if (phrases.length === 0) return -0;\n const cols = this.indexedColumns();\n const w = cols.map((_, i) => weights?.[i] ?? 1);\n const k1 = 1.2;\n const b = 0.75;\n const N = Math.max(1, this.docCount);\n const avgdl = Math.max(1e-9, this.avgDocLen);\n let score = 0;\n const D = this.docLength(row);\n\n for (let pi = 0; pi < phrases.length; pi++) {\n const phrase = phrases[pi]!;\n // Phrase frequency: weighted count of phrase occurrences across columns\n let freq = 0;\n for (let ci = 0; ci < cols.length; ci++) {\n const col = cols[ci]!;\n const n = this.phraseFreq(row, col, phrase);\n freq += (w[ci] ?? 1) * n;\n }\n if (freq === 0) continue;\n const df = this.phraseDocFreq(phrase);\n // SQLite FTS5: IDF = log((N - nHit + 0.5) / (nHit + 0.5)); floor at 1e-6\n let idf = Math.log((N - df + 0.5) / (df + 0.5));\n if (idf <= 0) idf = 1e-6;\n score += idf * ((freq * (k1 + 1)) / (freq + k1 * (1 - b + (b * D) / avgdl)));\n }\n return score === 0 ? -0 : -score;\n }\n\n highlight(cursor: FtsMatchCursor, colIndex: number, open: string, close: string): string {\n const row = this.rows.get(cursor.rowid);\n if (!row) return \"\";\n const col = this.columns[colIndex];\n if (!col) return \"\";\n const text = valueToText(row.values.get(col.toLowerCase()) ?? null);\n if (this.options.content === \"contentless\") return text;\n const hits = cursor.hits\n .filter((h) => h.column.toLowerCase() === col.toLowerCase())\n .sort((a, b) => a.startUnit - b.startUnit);\n if (hits.length === 0) return text;\n let out = \"\";\n let at = 0;\n for (const hit of mergeHits(hits)) {\n out += text.slice(at, hit.startUnit);\n out += open + text.slice(hit.startUnit, hit.endUnit) + close;\n at = hit.endUnit;\n }\n out += text.slice(at);\n return out;\n }\n\n snippet(\n cursor: FtsMatchCursor,\n colIndex: number,\n open: string,\n close: string,\n ellipsis: string,\n tokenCount: number,\n ): string {\n const row = this.rows.get(cursor.rowid);\n if (!row) return \"\";\n const col = this.columns[colIndex];\n if (!col) return \"\";\n const text = valueToText(row.values.get(col.toLowerCase()) ?? null);\n const tokens = row.tokensByColumn.get(col.toLowerCase()) ?? [];\n const hitPositions = new Set(\n cursor.hits.filter((h) => h.column.toLowerCase() === col.toLowerCase()).map((h) => h.position),\n );\n if (tokens.length === 0 || hitPositions.size === 0) return text;\n const firstHit = Math.min(...hitPositions);\n const window = Math.max(1, tokenCount);\n const startPos = Math.max(0, firstHit - Math.floor(window / 4));\n const endPos = Math.min(tokens.length - 1, startPos + window - 1);\n const startUnit = tokens[startPos]!.startUnit;\n const endUnit = tokens[endPos]!.endUnit;\n const slice = text.slice(startUnit, endUnit);\n // Re-highlight within slice\n const localHits = cursor.hits\n .filter((h) => h.column.toLowerCase() === col.toLowerCase() && h.startUnit >= startUnit && h.endUnit <= endUnit)\n .map((h) => ({ ...h, startUnit: h.startUnit - startUnit, endUnit: h.endUnit - startUnit }));\n let out = \"\";\n let at = 0;\n for (const hit of mergeHits(localHits)) {\n out += slice.slice(at, hit.startUnit);\n out += open + slice.slice(hit.startUnit, hit.endUnit) + close;\n at = hit.endUnit;\n }\n out += slice.slice(at);\n if (startPos > 0) out = ellipsis + out;\n if (endPos < tokens.length - 1) out = out + ellipsis;\n return out;\n }\n\n /** FTS3/4 offsets(): \"col phrase start length ...\" */\n offsets(cursor: FtsMatchCursor): string {\n const row = this.rows.get(cursor.rowid);\n if (!row) return \"\";\n const parts: string[] = [];\n for (const hit of cursor.hits) {\n const colIndex = this.columns.findIndex((c) => c.toLowerCase() === hit.column.toLowerCase());\n const text = valueToText(row.values.get(hit.column.toLowerCase()) ?? null);\n const start = utf8OffsetLocal(text, hit.startUnit);\n const length = utf8OffsetLocal(text, hit.endUnit) - start;\n parts.push(String(colIndex), \"0\", String(start), String(length));\n }\n return parts.join(\" \");\n }\n\n /** FTS3 matchinfo default format 'pcx' simplified \u2192 blob of 32-bit LE ints. */\n matchinfo(cursor: FtsMatchCursor, _format = \"pcx\"): Uint8Array {\n const row = this.rows.get(cursor.rowid);\n const nPhrase = Math.max(1, cursor.phraseTerms.length);\n const nCol = this.columns.length;\n const values: number[] = [nPhrase, nCol];\n // hits for phrase 0 col 0 roughly\n for (let p = 0; p < nPhrase; p++) {\n for (let c = 0; c < nCol; c++) {\n const col = this.columns[c]!;\n const term = cursor.phraseTerms[p]?.[0] ?? \"\";\n const tf = row ? this.termFreq(row, col, term) : 0;\n values.push(tf);\n }\n }\n const buf = new Uint8Array(values.length * 4);\n const view = new DataView(buf.buffer);\n for (let i = 0; i < values.length; i++) view.setUint32(i * 4, values[i]! >>> 0, true);\n return buf;\n }\n\n vocabRows(mode: \"row\" | \"col\" | \"instance\"): Array<Record<string, SqlValue>> {\n if (mode === \"row\") {\n const out: Array<Record<string, SqlValue>> = [];\n for (const [term, postings] of [...this.index.entries()].sort((a, b) => (a[0] < b[0] ? -1 : 1))) {\n const docs = new Set(postings.map((p) => String(p.rowid)));\n out.push({ term, doc: docs.size, cnt: postings.length });\n }\n return out;\n }\n // col / instance simplified to row shape\n return this.vocabRows(\"row\");\n }\n\n clone(): Fts5VirtualTable {\n const copy = new Fts5VirtualTable(\n this.name,\n this.options.columns.map((c) => (c.unindexed ? `${c.name} UNINDEXED` : c.name)),\n this.originalSql,\n this.kind,\n );\n // Re-parse options by reconstructing module args is imperfect; copy fields\n Object.assign(copy, {\n options: structuredClone(this.options),\n columns: [...this.columns],\n });\n (copy as unknown as { tokenize: TokenizerFn }).tokenize = this.tokenize;\n copy.nextRowid = this.nextRowid;\n for (const [rowid, row] of this.rows) {\n const cloned: Fts5Row = {\n rowid: row.rowid,\n values: new Map(row.values),\n tokensByColumn: new Map([...row.tokensByColumn.entries()].map(([k, v]) => [k, v.map((t) => ({ ...t }))])),\n };\n copy.rows.set(rowid, cloned);\n copy.indexRow(cloned);\n }\n return copy;\n }\n\n private detectCommand(values: Map<string, SqlValue>): string | null {\n // INSERT INTO t(t) VALUES('optimize') \u2014 column name equals table name\n const key = this.name.toLowerCase();\n if (!values.has(key)) return null;\n const v = values.get(key);\n if (typeof v !== \"string\") return null;\n // Command inserts typically only supply the table-name column\n const otherContent = [...values.entries()].some(\n ([k, val]) => k !== key && val !== null && this.columns.some((c) => c.toLowerCase() === k),\n );\n if (otherContent) return null;\n return v;\n }\n\n private runCommand(command: string, _values: Map<string, SqlValue>): void {\n const cmd = command.toLowerCase();\n if (cmd === \"optimize\") return;\n if (cmd === \"rebuild\") {\n this.rebuild();\n return;\n }\n if (cmd === \"integrity-check\") return;\n if (cmd === \"delete-all\") {\n if (this.options.content === \"normal\") {\n throw new SqliteError(\n \"'delete-all' may only be used with a contentless or external content fts5 table\",\n \"other\",\n );\n }\n for (const rowid of [...this.rows.keys()]) this.delete(rowid);\n return;\n }\n if (cmd.startsWith(\"merge=\") || cmd.startsWith(\"automerge=\")) {\n throw new SqliteError(\"SQL logic error\", \"other\");\n }\n if (cmd === \"delete\") {\n // delete by rowid via other columns \u2014 handled elsewhere\n return;\n }\n // Unknown command string may be treated as content insert into table-named column \u2014 ignore as no-op command fail\n throw new SqliteError(\"SQL logic error\", \"other\");\n }\n\n private rebuild(): void {\n this.index.clear();\n this.docCount = 0;\n this.totalTokens = 0;\n this.avgDocLen = 0;\n for (const row of this.rows.values()) this.indexRow(row);\n }\n\n private buildRow(rowid: Rowid, values: Map<string, SqlValue>): Fts5Row {\n const stored = new Map<string, SqlValue>();\n const tokensByColumn = new Map<string, FtsToken[]>();\n for (const column of this.columns) {\n const key = column.toLowerCase();\n const value = values.get(key) ?? null;\n if (this.options.content === \"contentless\") {\n // Contentless stores index only; user-visible content columns are NULL\n stored.set(key, null);\n const text = valueToText(value);\n const colDef = this.options.columns.find((c) => c.name.toLowerCase() === key);\n tokensByColumn.set(key, colDef?.unindexed ? [] : this.tokenize(text));\n continue;\n }\n stored.set(key, value);\n const colDef = this.options.columns.find((c) => c.name.toLowerCase() === key);\n tokensByColumn.set(key, colDef?.unindexed ? [] : this.tokenize(valueToText(value)));\n }\n return { rowid, values: stored, tokensByColumn };\n }\n\n private indexRow(row: Fts5Row): void {\n let tokenCount = 0;\n for (const [col, tokens] of row.tokensByColumn) {\n for (const token of tokens) {\n tokenCount++;\n this.addPosting(token.term, {\n rowid: row.rowid,\n column: col,\n position: token.position,\n startUnit: token.startUnit,\n endUnit: token.endUnit,\n });\n for (const n of this.options.prefix) {\n if (token.term.length >= n) {\n const pref = `${token.term.slice(0, n)}*`;\n // prefix index entries are optimization only \u2014 queries still work via scan\n void pref;\n }\n }\n }\n }\n this.docCount++;\n this.totalTokens += tokenCount;\n this.avgDocLen = this.totalTokens / Math.max(1, this.docCount);\n }\n\n private unindexRow(row: Fts5Row): void {\n let tokenCount = 0;\n for (const [col, tokens] of row.tokensByColumn) {\n for (const token of tokens) {\n tokenCount++;\n this.removePosting(token.term, row.rowid, col, token.position);\n }\n }\n this.docCount = Math.max(0, this.docCount - 1);\n this.totalTokens = Math.max(0, this.totalTokens - tokenCount);\n this.avgDocLen = this.totalTokens / Math.max(1, this.docCount);\n }\n\n private addPosting(term: string, posting: Posting): void {\n const key = term.toLowerCase();\n const list = this.index.get(key);\n if (list) list.push(posting);\n else this.index.set(key, [posting]);\n }\n\n private removePosting(term: string, rowid: Rowid, column: string, position: number): void {\n const key = term.toLowerCase();\n const list = this.index.get(key);\n if (!list) return;\n const next = list.filter((p) => !(p.rowid === rowid && p.column === column && p.position === position));\n if (next.length === 0) this.index.delete(key);\n else this.index.set(key, next);\n }\n\n private indexedColumns(): string[] {\n return this.options.columns.filter((c) => !c.unindexed).map((c) => c.name);\n }\n\n private evalNode(node: FtsQueryNode, row: Fts5Row, defaultColumns: string[], hits: FtsMatchHit[]): boolean {\n switch (node.type) {\n case \"true\":\n return true;\n case \"and\":\n return node.children.every((child) => this.evalNode(child, row, defaultColumns, hits));\n case \"or\": {\n // Collect hits from matching branch only\n for (const child of node.children) {\n const local: FtsMatchHit[] = [];\n if (this.evalNode(child, row, defaultColumns, local)) {\n hits.push(...local);\n return true;\n }\n }\n return false;\n }\n case \"not\": {\n const local: FtsMatchHit[] = [];\n return !this.evalNode(node.child, row, defaultColumns, local);\n }\n case \"term\": {\n const expanded = this.expandTermNode(node);\n if (expanded.type !== \"term\") return this.evalNode(expanded, row, defaultColumns, hits);\n const cols = resolveColumns(node.column, node.columns, defaultColumns, this.columns);\n const needle = this.normalizeQueryTerm(node.value);\n let found = false;\n for (const col of cols) {\n const tokens = row.tokensByColumn.get(col.toLowerCase()) ?? [];\n for (const token of tokens) {\n if (node.prefix ? token.term.startsWith(needle) : token.term === needle) {\n hits.push({\n column: col,\n position: token.position,\n startUnit: token.startUnit,\n endUnit: token.endUnit,\n term: token.term,\n });\n found = true;\n }\n }\n }\n return found;\n }\n case \"phrase\": {\n const cols = resolveColumns(node.column, node.columns, defaultColumns, this.columns);\n let found = false;\n for (const col of cols) {\n const tokens = row.tokensByColumn.get(col.toLowerCase()) ?? [];\n const terms = node.terms.map((t) => ({\n value: this.normalizeQueryTerm(t.value),\n prefix: t.prefix,\n }));\n for (let i = 0; i <= tokens.length - terms.length; i++) {\n let ok = true;\n for (let j = 0; j < terms.length; j++) {\n const tok = tokens[i + j]!;\n const term = terms[j]!;\n if (term.prefix ? !tok.term.startsWith(term.value) : tok.term !== term.value) {\n ok = false;\n break;\n }\n }\n if (ok) {\n found = true;\n for (let j = 0; j < terms.length; j++) {\n const tok = tokens[i + j]!;\n hits.push({\n column: col,\n position: tok.position,\n startUnit: tok.startUnit,\n endUnit: tok.endUnit,\n term: tok.term,\n });\n }\n }\n }\n }\n return found;\n }\n case \"near\": {\n const cols = resolveColumns(node.column, node.columns, defaultColumns, this.columns);\n // Evaluate each child to position sets per column\n for (const col of cols) {\n const posSets: number[][] = [];\n let allOk = true;\n for (const child of node.children) {\n const local: FtsMatchHit[] = [];\n if (!this.evalNode(child, row, [col], local)) {\n allOk = false;\n break;\n }\n posSets.push(local.filter((h) => h.column.toLowerCase() === col.toLowerCase()).map((h) => h.position));\n }\n if (!allOk) continue;\n if (nearMatch(posSets, node.distance)) {\n // re-collect hits\n for (const child of node.children) this.evalNode(child, row, [col], hits);\n return true;\n }\n }\n return false;\n }\n }\n }\n\n private normalizeQueryTerm(term: string): string {\n // Query terms are tokenized with the same tokenizer when possible\n const tokens = this.tokenize(term);\n if (tokens.length === 1) return tokens[0]!.term;\n if (tokens.length === 0) return term.toLowerCase();\n // Trigram (and multi-token) queries: join is wrong for matching \u2014 use first only for df;\n // phrase matching uses tokenize() directly via evalNode.\n return tokens[0]!.term;\n }\n\n /** For trigram tokenizer, a bare MATCH term is a phrase of overlapping trigrams. */\n private expandTermNode(node: Extract<FtsQueryNode, { type: \"term\" }>): FtsQueryNode {\n if (this.options.tokenizer.name !== \"trigram\") return node;\n const tokens = this.tokenize(node.value);\n if (tokens.length <= 1) return node;\n return {\n type: \"phrase\",\n terms: tokens.map((t) => ({ value: t.term, prefix: false })),\n column: node.column,\n columns: node.columns,\n };\n }\n\n private phraseFreq(row: Fts5Row, column: string, phrase: string[]): number {\n if (phrase.length === 0) return 0;\n const tokens = row.tokensByColumn.get(column.toLowerCase()) ?? [];\n const terms = phrase.map((t) => this.normalizeQueryTerm(t));\n let count = 0;\n for (let i = 0; i <= tokens.length - terms.length; i++) {\n let ok = true;\n for (let j = 0; j < terms.length; j++) {\n if (tokens[i + j]!.term !== terms[j]) {\n ok = false;\n break;\n }\n }\n if (ok) count++;\n }\n return count;\n }\n\n private phraseDocFreq(phrase: string[]): number {\n let n = 0;\n for (const row of this.rows.values()) {\n for (const col of this.indexedColumns()) {\n if (this.phraseFreq(row, col, phrase) > 0) {\n n++;\n break;\n }\n }\n }\n return n;\n }\n\n private termFreq(row: Fts5Row, column: string, term: string): number {\n const needle = this.normalizeQueryTerm(term);\n const tokens = row.tokensByColumn.get(column.toLowerCase()) ?? [];\n return tokens.filter((t) => t.term === needle || t.term.startsWith(needle)).length;\n }\n\n private docLength(row: Fts5Row): number {\n let n = 0;\n for (const col of this.indexedColumns()) n += (row.tokensByColumn.get(col.toLowerCase()) ?? []).length;\n return Math.max(1, n);\n }\n\n private bumpRowid(assigned: Rowid): void {\n if (typeof assigned === \"bigint\") {\n if (assigned >= BigInt(this.nextRowid as number | bigint)) this.nextRowid = assigned + 1n;\n } else if (assigned >= (typeof this.nextRowid === \"number\" ? this.nextRowid : Number(this.nextRowid))) {\n this.nextRowid = assigned + 1;\n }\n }\n}\n\nfunction resolveColumns(\n column: string | null,\n columns: string[] | null,\n defaultColumns: string[],\n allColumns: string[],\n): string[] {\n if (columns && columns.length > 0) {\n return columns\n .map((c) => allColumns.find((x) => x.toLowerCase() === c.toLowerCase()))\n .filter((c): c is string => !!c);\n }\n if (column) {\n const matched = allColumns.find((c) => c.toLowerCase() === column.toLowerCase());\n return matched ? [matched] : [];\n }\n return defaultColumns;\n}\n\nfunction nearMatch(posSets: number[][], distance: number): boolean {\n if (posSets.length === 0) return false;\n if (posSets.length === 1) return posSets[0]!.length > 0;\n // Check if there exists a combination where max-min <= distance + (n-1) roughly (FTS5 NEAR)\n // FTS5: NEAR(a b, N) means the terms are within N tokens of each other.\n const first = posSets[0]!;\n for (const p0 of first) {\n if (nearFrom(p0, posSets.slice(1), distance)) return true;\n }\n return false;\n}\n\nfunction nearFrom(anchor: number, rest: number[][], distance: number): boolean {\n if (rest.length === 0) return true;\n const next = rest[0]!;\n for (const p of next) {\n if (Math.abs(p - anchor) <= distance) {\n if (nearFrom(p, rest.slice(1), distance)) return true;\n }\n }\n return false;\n}\n\nfunction collectPhraseTerms(node: FtsQueryNode): string[][] {\n switch (node.type) {\n case \"term\":\n return [[node.value]];\n case \"phrase\":\n return [node.terms.map((t) => t.value)];\n case \"and\":\n case \"or\":\n case \"near\":\n return node.children.flatMap(collectPhraseTerms);\n case \"not\":\n return [];\n case \"true\":\n return [];\n }\n}\n\nfunction mergeHits(hits: FtsMatchHit[]): FtsMatchHit[] {\n if (hits.length === 0) return [];\n const sorted = [...hits].sort((a, b) => a.startUnit - b.startUnit);\n const out: FtsMatchHit[] = [{ ...sorted[0]! }];\n for (let i = 1; i < sorted.length; i++) {\n const cur = sorted[i]!;\n const last = out[out.length - 1]!;\n if (cur.startUnit <= last.endUnit) last.endUnit = Math.max(last.endUnit, cur.endUnit);\n else out.push({ ...cur });\n }\n return out;\n}\n\nfunction valueToText(value: SqlValue): string {\n if (value === null) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n return \"\";\n}\n\nfunction utf8OffsetLocal(text: string, unitIndex: number): number {\n return new TextEncoder().encode(text.slice(0, unitIndex)).length;\n}\n\nexport { tokenizeFtsText };\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport interface RTreeRow {\n id: number | bigint;\n coords: number[];\n}\n\n/**\n * Simplified R*Tree for SQLite rtree / rtree_i32 modules.\n * Stores axis-aligned boxes; queries filter by bound inequalities in WHERE.\n */\nexport class RTreeVirtualTable {\n readonly kind = \"rtree\" as const;\n readonly name: string;\n readonly columns: string[];\n readonly dimension: number;\n readonly integerCoords: boolean;\n readonly originalSql: string | null;\n readonly rows = new Map<string, RTreeRow>();\n /** Shadow node table content for rtreenode/rtreedepth. */\n readonly nodes = new Map<number, Uint8Array>();\n\n constructor(name: string, columns: string[], integerCoords = false, originalSql: string | null = null) {\n if (columns.length < 3 || columns.length % 2 === 0) {\n throw new SqliteError(\"rtree tables must have an odd number of columns >= 3\", \"other\");\n }\n this.name = name;\n this.columns = columns;\n this.dimension = (columns.length - 1) / 2;\n this.integerCoords = integerCoords;\n this.originalSql = originalSql;\n this.nodes.set(1, new Uint8Array([0]));\n }\n\n scan(): Array<{ rowid: Rowid; values: Map<string, SqlValue> }> {\n return [...this.rows.values()].map((row) => {\n const values = new Map<string, SqlValue>();\n values.set(this.columns[0]!.toLowerCase(), row.id);\n for (let i = 0; i < row.coords.length; i++) {\n values.set(this.columns[i + 1]!.toLowerCase(), row.coords[i]!);\n }\n return { rowid: row.id, values };\n });\n }\n\n insert(values: Map<string, SqlValue>): Rowid {\n const idVal = values.get(this.columns[0]!.toLowerCase());\n if (idVal === null || idVal === undefined) {\n throw new SqliteError(\"rtree id must not be NULL\", \"constraint_notnull\");\n }\n const id = typeof idVal === \"bigint\" ? idVal : Math.trunc(Number(idVal));\n const key = String(id);\n if (this.rows.has(key)) throw new SqliteError(\"UNIQUE constraint failed\", \"constraint_unique\");\n const coords: number[] = [];\n for (let i = 1; i < this.columns.length; i++) {\n const raw = values.get(this.columns[i]!.toLowerCase()) ?? null;\n if (raw === null) throw new SqliteError(\"rtree coordinate must not be NULL\", \"constraint_notnull\");\n let n = Number(raw);\n if (this.integerCoords) n = Math.trunc(n);\n coords.push(n);\n }\n this.rows.set(key, { id, coords });\n return id;\n }\n\n update(rowid: Rowid, updates: Map<string, SqlValue>): void {\n const key = String(rowid);\n const existing = this.rows.get(key);\n if (!existing) return;\n const values = new Map<string, SqlValue>();\n values.set(this.columns[0]!.toLowerCase(), existing.id);\n for (let i = 0; i < existing.coords.length; i++) {\n values.set(this.columns[i + 1]!.toLowerCase(), existing.coords[i]!);\n }\n for (const [k, v] of updates) values.set(k, v);\n this.rows.delete(key);\n this.insert(values);\n }\n\n delete(rowid: Rowid): void {\n this.rows.delete(String(rowid));\n }\n\n clone(): RTreeVirtualTable {\n const copy = new RTreeVirtualTable(this.name, this.columns, this.integerCoords, this.originalSql);\n for (const [k, row] of this.rows) copy.rows.set(k, { id: row.id, coords: [...row.coords] });\n for (const [k, v] of this.nodes) copy.nodes.set(k, new Uint8Array(v));\n return copy;\n }\n}\n\nexport class DbStatVirtualTable {\n readonly kind = \"dbstat\" as const;\n readonly name: string;\n readonly columns = [\n \"name\",\n \"path\",\n \"pageno\",\n \"pagetype\",\n \"ncell\",\n \"payload\",\n \"unused\",\n \"mx_payload\",\n \"pgoffset\",\n \"pgsize\",\n ];\n readonly originalSql: string | null;\n readonly schemaArg: string | null;\n\n constructor(name: string, schemaArg: string | null = null, originalSql: string | null = null) {\n this.name = name;\n this.schemaArg = schemaArg;\n this.originalSql = originalSql;\n }\n\n clone(): DbStatVirtualTable {\n return new DbStatVirtualTable(this.name, this.schemaArg, this.originalSql);\n }\n}\n\nexport class BytecodeVirtualTable {\n readonly kind = \"bytecode\" as const;\n readonly name: string;\n readonly columns = [\"addr\", \"opcode\", \"p1\", \"p2\", \"p3\", \"p4\", \"p5\", \"comment\", \"subprog\"];\n readonly originalSql: string | null;\n\n constructor(name: string, originalSql: string | null = null) {\n this.name = name;\n this.originalSql = originalSql;\n }\n\n clone(): BytecodeVirtualTable {\n return new BytecodeVirtualTable(this.name, this.originalSql);\n }\n}\n\nexport class TablesUsedVirtualTable {\n readonly kind = \"tables_used\" as const;\n readonly name: string;\n readonly columns = [\"type\", \"schema\", \"name\"];\n readonly originalSql: string | null;\n\n constructor(name: string, originalSql: string | null = null) {\n this.name = name;\n this.originalSql = originalSql;\n }\n\n clone(): TablesUsedVirtualTable {\n return new TablesUsedVirtualTable(this.name, this.originalSql);\n }\n}\n\nexport class FtsVocabVirtualTable {\n readonly kind = \"fts5vocab\" as const;\n readonly name: string;\n readonly columns: string[];\n readonly ftsTable: string;\n readonly vocabType: string;\n readonly originalSql: string | null;\n\n constructor(name: string, args: string[], originalSql: string | null = null) {\n if (args.length < 1) throw new SqliteError(\"fts5vocab requires an fts5 table name\", \"other\");\n this.name = name;\n this.ftsTable = args[0]!;\n this.vocabType = (args[1] ?? \"row\").replace(/'/g, \"\").toLowerCase();\n this.columns =\n this.vocabType === \"col\"\n ? [\"term\", \"col\", \"doc\", \"cnt\"]\n : this.vocabType === \"instance\"\n ? [\"term\", \"doc\", \"col\", \"offset\"]\n : [\"term\", \"doc\", \"cnt\"];\n this.originalSql = originalSql;\n }\n\n clone(): FtsVocabVirtualTable {\n return new FtsVocabVirtualTable(this.name, [this.ftsTable, this.vocabType], this.originalSql);\n }\n}\n", "import type { SqlValue } from \"../types/value.ts\";\nimport { cloneSqlValue } from \"../types/value.ts\";\n\nexport type Rowid = number | bigint;\n\nexport interface Row {\n rowid: Rowid;\n values: Map<string, SqlValue>;\n}\n\nexport type RowValues = Map<string, SqlValue> | ReadonlyMap<string, SqlValue> | Record<string, SqlValue>;\n\nexport function normalizeColumnName(name: string): string {\n return name.toLowerCase();\n}\n\nexport function rowValues(values: RowValues): Map<string, SqlValue> {\n const result = new Map<string, SqlValue>();\n const entries = values instanceof Map ? values.entries() : Object.entries(values);\n for (const [name, value] of entries) {\n result.set(normalizeColumnName(name), value);\n }\n return result;\n}\n\nexport function cloneRow(row: Row): Row {\n const values = new Map<string, SqlValue>();\n for (const [name, value] of row.values) {\n values.set(name, cloneSqlValue(value));\n }\n return { rowid: row.rowid, values };\n}\n", "import type { Expr, TableConstraint } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { serializeIndexKey } from \"../indexes/index.ts\";\nimport { compareWithCollation, normalizeForCollation } from \"../types/collation.ts\";\nimport { applyStrictValue } from \"../types/strict.ts\";\nimport type { Affinity, SqlValue } from \"../types/value.ts\";\nimport { affinityFromTypeName, applyAffinity, cloneSqlValue, compareSql } from \"../types/value.ts\";\nimport type { Row, Rowid, RowValues } from \"./row.ts\";\nimport { cloneRow, normalizeColumnName, rowValues } from \"./row.ts\";\n\n/** Build a covering equality hash once a table is large enough that scans dominate. */\nconst EQUALITY_HASH_MIN_ROWS = 16;\n\nexport interface ColumnInfo {\n name: string;\n /** Cached `name.toLowerCase()` for hot-path lookups. */\n nameLower?: string;\n typeName: string | null;\n affinity: Affinity;\n notNull: boolean;\n primaryKey: boolean;\n autoincrement: boolean;\n defaultExpr: Expr | null;\n unique: boolean;\n /** Declared column collation (BINARY/NOCASE/RTRIM); null means BINARY. */\n collate: string | null;\n /** GENERATED ALWAYS AS (...) \u2014 VIRTUAL computed on read, STORED materialized. */\n generated: { expr: Expr; stored: boolean } | null;\n}\n\nexport interface InsertOptions {\n /** Values are already affinity-applied Maps with lowercase keys; skip prepareValues. */\n prepared?: boolean;\n /** Skip NOT NULL / UNIQUE / PK scans (caller already enforced, or table is unconstrained). */\n skipValidate?: boolean;\n}\n\nexport interface InsertRow {\n rowid?: Rowid;\n values: RowValues;\n}\n\nexport interface TableOptions {\n constraints?: TableConstraint[];\n indexes?: string[];\n originalSql?: string | null;\n withoutRowid?: boolean;\n strict?: boolean;\n}\n\nexport class Table {\n name: string;\n columns: ColumnInfo[];\n rows: Map<Rowid, Row>;\n nextRowid: Rowid;\n constraints: TableConstraint[];\n indexes: string[];\n originalSql: string | null;\n withoutRowid: boolean;\n strict: boolean;\n /** Clustered PK key string \u2192 row for WITHOUT ROWID tables. */\n clusteredRows: Map<string, Row>;\n private scanCache: Row[] | null = null;\n /** Lazy covering hashes: column nameLower \u2192 serializeIndexKey \u2192 rowids. */\n private equalityHashes: Map<string, Map<string, Rowid[]>> | null = null;\n frozen = false;\n\n constructor(name: string, columns: ColumnInfo[], options: TableOptions = {}) {\n this.name = name;\n this.columns = columns.map(cloneColumn);\n this.rows = new Map();\n this.nextRowid = 1;\n this.constraints = cloneAst(options.constraints ?? []);\n this.indexes = [...(options.indexes ?? [])];\n this.originalSql = options.originalSql ?? null;\n this.withoutRowid = options.withoutRowid ?? false;\n this.strict = options.strict ?? false;\n this.clusteredRows = new Map();\n this.scanCache = null;\n }\n\n integerPkColumn(): ColumnInfo | undefined {\n return this.integerPrimaryKeyAlias();\n }\n\n get(rowid: Rowid): Row | undefined {\n try {\n return this.rows.get(canonicalRowid(rowid));\n } catch {\n return undefined;\n }\n }\n\n getByKey(value: SqlValue): Row | undefined {\n if (value === null || this.withoutRowid) return undefined;\n try {\n return this.get(asRowid(value, \"rowid\"));\n } catch {\n return undefined;\n }\n }\n\n private invalidateScan(): void {\n this.scanCache = null;\n }\n\n private commitRow(row: Row): void {\n this.indexEquality(row);\n this.invalidateScan();\n }\n\n private reindexEquality(before: Row, after: Row): void {\n this.unindexEquality(before);\n this.indexEquality(after);\n this.invalidateScan();\n }\n\n /** True when the table has no user constraints that DML must enforce beyond hidden rowid. */\n isUnconstrained(): boolean {\n if (this.withoutRowid || this.strict || this.indexes.length > 0 || this.constraints.length > 0) return false;\n for (const column of this.columns) {\n if (column.notNull || column.primaryKey || column.unique || column.generated || column.defaultExpr) return false;\n }\n return true;\n }\n\n /**\n * Point lookup via a write-maintained covering hash (not a schema index).\n * Returns null when the table is too small or the column does not exist.\n */\n lookupEquality(columnLower: string, value: SqlValue): Row[] | null {\n if (!this.ensureEqualityHash(columnLower)) return null;\n const map = this.equalityHashes!.get(columnLower);\n if (!map) return null;\n const column = this.columns.find((item) => item.nameLower === columnLower);\n const key = serializeIndexKey([normalizeForCollation(value, column?.collate ?? \"BINARY\")]);\n if (key === null) return [];\n const rowids = map.get(key);\n if (!rowids || rowids.length === 0) return [];\n const rows: Row[] = [];\n for (const rowid of rowids) {\n const row = this.rows.get(rowid);\n if (row) rows.push(row);\n }\n return rows;\n }\n\n ensureEqualityHash(columnLower: string): boolean {\n if (this.frozen || this.rows.size < EQUALITY_HASH_MIN_ROWS) return false;\n const column = this.columns.find((item) => item.nameLower === columnLower);\n if (!column) return false;\n this.equalityHashes ??= new Map();\n if (this.equalityHashes.has(columnLower)) return true;\n const map = new Map<string, Rowid[]>();\n const collate = column.collate ?? \"BINARY\";\n for (const row of this.rows.values()) {\n const key = serializeIndexKey([normalizeForCollation(row.values.get(columnLower) ?? null, collate)]);\n if (key === null) continue;\n const bucket = map.get(key);\n if (bucket) bucket.push(row.rowid);\n else map.set(key, [row.rowid]);\n }\n this.equalityHashes.set(columnLower, map);\n return true;\n }\n\n clearEqualityHashes(): void {\n this.equalityHashes = null;\n }\n\n private indexEquality(row: Row): void {\n if (!this.equalityHashes) return;\n for (const [columnLower, map] of this.equalityHashes) {\n const column = this.columns.find((item) => item.nameLower === columnLower);\n const key = serializeIndexKey([\n normalizeForCollation(row.values.get(columnLower) ?? null, column?.collate ?? \"BINARY\"),\n ]);\n if (key === null) continue;\n const bucket = map.get(key);\n if (bucket) {\n if (!bucket.some((id) => sameRowid(id, row.rowid))) bucket.push(row.rowid);\n } else map.set(key, [row.rowid]);\n }\n }\n\n private unindexEquality(row: Row): void {\n if (!this.equalityHashes) return;\n for (const [columnLower, map] of this.equalityHashes) {\n const column = this.columns.find((item) => item.nameLower === columnLower);\n const key = serializeIndexKey([\n normalizeForCollation(row.values.get(columnLower) ?? null, column?.collate ?? \"BINARY\"),\n ]);\n if (key === null) continue;\n const bucket = map.get(key);\n if (!bucket) continue;\n const index = bucket.findIndex((id) => sameRowid(id, row.rowid));\n if (index >= 0) bucket.splice(index, 1);\n if (bucket.length === 0) map.delete(key);\n }\n }\n\n insert(input: InsertRow | RowValues, options?: InsertOptions): Rowid {\n this.assertMutable();\n const supplied = isInsertRow(input) ? input : { values: input };\n const values = options?.prepared\n ? supplied.values instanceof Map\n ? supplied.values\n : rowValues(supplied.values)\n : this.prepareValues(supplied.values);\n\n if (this.withoutRowid) {\n if (supplied.rowid !== undefined) {\n throw new SqliteError(`table ${this.name} has no column named rowid`, \"other\");\n }\n const rowid = canonicalRowid(this.allocateRowid());\n const candidate: Row = { rowid, values };\n if (!options?.skipValidate) this.validate(candidate);\n const clusterKey = this.makeClusterKey(values);\n if (this.clusteredRows.has(clusterKey)) {\n throw primaryKeyConflict(this.name, this.primaryKeyColumns());\n }\n this.clusteredRows.set(clusterKey, candidate);\n this.rows.set(rowid, candidate);\n this.advanceNextRowid(rowid);\n this.commitRow(candidate);\n return rowid;\n }\n\n const alias = this.integerPrimaryKeyAlias();\n let rowid = supplied.rowid;\n\n if (alias) {\n const value = values.get(normalizeColumnName(alias.name)) ?? null;\n if (rowid === undefined && value !== null) rowid = asRowid(value, alias.name);\n }\n rowid = canonicalRowid(rowid ?? this.allocateRowid());\n\n if (this.rows.has(rowid)) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${this.name}.rowid`,\n \"constraint_primary\",\n \"SQLITE_CONSTRAINT_PRIMARYKEY\",\n );\n }\n if (alias) values.set(normalizeColumnName(alias.name), rowid);\n\n const candidate: Row = { rowid, values };\n if (!options?.skipValidate) this.validate(candidate);\n this.rows.set(rowid, candidate);\n this.advanceNextRowid(rowid);\n this.commitRow(candidate);\n return rowid;\n }\n\n update(rowid: Rowid, updates: RowValues): Row | undefined {\n this.assertMutable();\n const key = canonicalRowid(rowid);\n const existing = this.rows.get(key);\n if (!existing) return undefined;\n\n const values = new Map(existing.values);\n const incoming = rowValues(updates);\n for (const [name, value] of incoming) {\n const column = this.column(name);\n values.set(normalizeColumnName(column.name), applyAffinity(cloneSqlValue(value), column.affinity));\n }\n\n if (this.withoutRowid) {\n const oldClusterKey = this.makeClusterKey(existing.values);\n const newClusterKey = this.makeClusterKey(values);\n if (newClusterKey !== oldClusterKey && this.clusteredRows.has(newClusterKey)) {\n throw primaryKeyConflict(this.name, this.primaryKeyColumns());\n }\n const candidate: Row = { rowid: key, values };\n this.validate(candidate, key);\n if (newClusterKey !== oldClusterKey) this.clusteredRows.delete(oldClusterKey);\n this.clusteredRows.set(newClusterKey, candidate);\n this.rows.set(key, candidate);\n this.reindexEquality(existing, candidate);\n return candidate;\n }\n\n const alias = this.integerPrimaryKeyAlias();\n const targetKey = alias ? asRowid(values.get(normalizeColumnName(alias.name)) ?? null, alias.name) : key;\n if (targetKey !== key && this.rows.has(targetKey)) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${this.name}.${alias?.name ?? \"rowid\"}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n if (alias) values.set(normalizeColumnName(alias.name), targetKey);\n const candidate: Row = { rowid: targetKey, values };\n this.validate(candidate, key);\n if (targetKey !== key) this.rows.delete(key);\n this.rows.set(targetKey, candidate);\n this.advanceNextRowid(targetKey);\n this.reindexEquality(existing, candidate);\n return candidate;\n }\n\n delete(rowid: Rowid): boolean {\n this.assertMutable();\n const key = canonicalRowid(rowid);\n const existing = this.rows.get(key);\n if (!existing) return false;\n if (this.withoutRowid) this.clusteredRows.delete(this.makeClusterKey(existing.values));\n this.unindexEquality(existing);\n this.invalidateScan();\n return this.rows.delete(key);\n }\n\n *scan(): Iterable<Row> {\n if (!this.scanCache) {\n if (this.withoutRowid) {\n this.scanCache = [...this.clusteredRows.values()].sort((a, b) => this.comparePrimaryKeys(a, b));\n } else {\n this.scanCache = [...this.rows.values()].sort((a, b) => compareRowids(a.rowid, b.rowid));\n }\n }\n yield* this.scanCache;\n }\n\n clone(): Table {\n const copy = new Table(this.name, this.columns, {\n constraints: this.constraints,\n indexes: this.indexes,\n originalSql: this.originalSql,\n withoutRowid: this.withoutRowid,\n strict: this.strict,\n });\n copy.nextRowid = this.nextRowid;\n for (const [rowid, row] of this.rows) copy.rows.set(rowid, cloneRow(row));\n for (const [clusterKey, row] of this.clusteredRows) copy.clusteredRows.set(clusterKey, cloneRow(row));\n return copy;\n }\n\n freeze(): void {\n this.frozen = true;\n }\n\n private assertMutable(): void {\n if (this.frozen) throw new SqliteError(\"internal: cannot mutate a frozen table\", \"other\");\n }\n\n /** Rebuild clustered storage after snapshot decode or bulk load. */\n rebuildClusteredRows(): void {\n if (!this.withoutRowid) return;\n this.clusteredRows.clear();\n for (const row of this.rows.values()) {\n this.clusteredRows.set(this.makeClusterKey(row.values), row);\n }\n this.invalidateScan();\n this.clearEqualityHashes();\n }\n\n private prepareValues(input: RowValues): Map<string, SqlValue> {\n const supplied = rowValues(input);\n for (const name of supplied.keys()) this.column(name);\n\n const result = new Map<string, SqlValue>();\n for (const column of this.columns) {\n const key = normalizeColumnName(column.name);\n result.set(\n key,\n this.strict\n ? applyStrictValue(cloneSqlValue(supplied.get(key) ?? null), column.typeName ?? \"\", this.name, column.name)\n : applyAffinity(cloneSqlValue(supplied.get(key) ?? null), column.affinity),\n );\n }\n return result;\n }\n\n private column(name: string): ColumnInfo {\n const key = normalizeColumnName(name);\n const column = this.columns.find((item) => normalizeColumnName(item.name) === key);\n if (!column) throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n return column;\n }\n\n private validate(row: Row, excludedRowid?: Rowid): void {\n for (const column of this.columns) {\n const value = row.values.get(normalizeColumnName(column.name)) ?? null;\n if ((column.notNull || column.primaryKey) && value === null) {\n const category = column.primaryKey ? \"constraint_primary\" : \"constraint_notnull\";\n const code = column.primaryKey ? \"SQLITE_CONSTRAINT_PRIMARYKEY\" : \"SQLITE_CONSTRAINT_NOTNULL\";\n throw new SqliteError(\n `${column.primaryKey ? \"PRIMARY KEY\" : \"NOT NULL\"} constraint failed: ${this.name}.${column.name}`,\n category,\n code,\n );\n }\n }\n\n const uniqueSets = this.uniqueColumnSets();\n // Prefer O(1)/O(k) enforcement via IndexStore in the DML path (autoindexes).\n // Keep a scan only when this table has no indexes registered yet.\n if (this.indexes.length === 0) {\n for (const names of uniqueSets) {\n const values = names.map((name) => row.values.get(normalizeColumnName(name)) ?? null);\n if (values.some((value) => value === null)) continue;\n for (const other of this.rows.values()) {\n if (excludedRowid !== undefined && other.rowid === excludedRowid) continue;\n if (\n values.every((value, index) => {\n const column = this.column(names[index]!);\n const otherValue = other.values.get(normalizeColumnName(names[index]!)) ?? null;\n const collation = column.collate ?? \"BINARY\";\n return compareWithCollation(value, otherValue, collation) === 0;\n })\n ) {\n const qualified = names.map((name) => `${this.name}.${name}`).join(\", \");\n throw new SqliteError(\n `UNIQUE constraint failed: ${qualified}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n }\n }\n } else if (uniqueSets.length > 0) {\n // Indexes exist: uniqueness is enforced by IndexStore on addIndexes / conflict checks.\n // Still guard INTEGER PRIMARY KEY collisions via the rowid map in insert/update.\n }\n }\n\n private uniqueColumnSets(): string[][] {\n const sets = this.columns.filter((column) => column.unique).map((column) => [column.name]);\n if (!this.constraints.some((constraint) => constraint.type === \"primary_key\")) {\n const primary = this.columns.filter((column) => column.primaryKey).map((column) => column.name);\n if (primary.length > 0) sets.push(primary);\n }\n for (const constraint of this.constraints) {\n if (constraint.type === \"unique\" || constraint.type === \"primary_key\") {\n sets.push(constraint.columns.map((column) => column.name));\n }\n }\n return sets;\n }\n\n private primaryKeyColumns(): ColumnInfo[] {\n const tablePrimary = this.constraints.find((constraint) => constraint.type === \"primary_key\");\n if (tablePrimary) {\n return tablePrimary.columns.map((column) => this.column(column.name));\n }\n return this.columns.filter((column) => column.primaryKey);\n }\n\n private makeClusterKey(values: Map<string, SqlValue>): string {\n return this.primaryKeyColumns()\n .map((column) => {\n const value = values.get(normalizeColumnName(column.name)) ?? null;\n const normalized = normalizeForCollation(value, column.collate ?? \"BINARY\");\n return serializePkComponent(normalized);\n })\n .join(\"\\0\");\n }\n\n private comparePrimaryKeys(left: Row, right: Row): number {\n for (const column of this.primaryKeyColumns()) {\n const leftValue = left.values.get(normalizeColumnName(column.name)) ?? null;\n const rightValue = right.values.get(normalizeColumnName(column.name)) ?? null;\n const comparison = column.collate\n ? compareWithCollation(leftValue, rightValue, column.collate)\n : compareSql(leftValue, rightValue);\n if (comparison !== 0) return comparison ?? 0;\n }\n return 0;\n }\n\n private integerPrimaryKeyAlias(): ColumnInfo | undefined {\n if (this.withoutRowid) return undefined;\n const primary = this.columns.filter((column) => column.primaryKey);\n if (primary.length !== 1 || primary[0]!.typeName?.trim().toUpperCase() !== \"INTEGER\") return undefined;\n return primary[0];\n }\n\n private allocateRowid(): Rowid {\n let candidate = canonicalRowid(this.nextRowid);\n while (this.rows.has(candidate)) candidate = incrementRowid(candidate);\n return candidate;\n }\n\n private advanceNextRowid(rowid: Rowid): void {\n if (compareRowids(rowid, this.nextRowid) >= 0) this.nextRowid = incrementRowid(rowid);\n }\n}\n\nexport function makeColumnInfo(\n name: string,\n typeName: string | null,\n options: Partial<Omit<ColumnInfo, \"name\" | \"nameLower\" | \"typeName\" | \"affinity\">> = {},\n): ColumnInfo {\n return {\n name,\n nameLower: name.toLowerCase(),\n typeName,\n affinity: affinityFromTypeName(typeName),\n notNull: options.notNull ?? false,\n primaryKey: options.primaryKey ?? false,\n autoincrement: options.autoincrement ?? false,\n defaultExpr: options.defaultExpr ?? null,\n unique: options.unique ?? false,\n collate: options.collate ?? null,\n generated: options.generated ?? null,\n };\n}\n\nfunction cloneColumn(column: ColumnInfo): ColumnInfo {\n return {\n ...column,\n nameLower: column.nameLower ?? column.name.toLowerCase(),\n defaultExpr: column.defaultExpr === null ? null : cloneAst(column.defaultExpr),\n generated:\n column.generated === null ? null : { expr: cloneAst(column.generated.expr), stored: column.generated.stored },\n };\n}\n\nfunction cloneAst<T>(value: T): T {\n return structuredClone(value);\n}\n\nfunction isInsertRow(input: InsertRow | RowValues): input is InsertRow {\n return !(input instanceof Map) && \"values\" in input;\n}\n\nfunction asRowid(value: SqlValue, column: string): Rowid {\n if (typeof value === \"bigint\") return canonicalRowid(value);\n if (typeof value === \"number\" && Number.isSafeInteger(value)) return value;\n throw new SqliteError(\n `datatype mismatch for INTEGER PRIMARY KEY column: ${column}`,\n \"datatype_mismatch\",\n \"SQLITE_MISMATCH\",\n );\n}\n\nfunction canonicalRowid(value: Rowid): Rowid {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value))\n throw new SqliteError(\"rowid must be a safe integer or bigint\", \"datatype_mismatch\", \"SQLITE_MISMATCH\");\n return value;\n }\n if (value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER)) return Number(value);\n return value;\n}\n\nfunction incrementRowid(value: Rowid): Rowid {\n if (typeof value === \"bigint\") return value + 1n;\n if (value < Number.MAX_SAFE_INTEGER) return value + 1;\n return BigInt(value) + 1n;\n}\n\nfunction compareRowids(left: Rowid, right: Rowid): number {\n const a = typeof left === \"bigint\" ? left : BigInt(left);\n const b = typeof right === \"bigint\" ? right : BigInt(right);\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction sameRowid(left: Rowid, right: Rowid): boolean {\n return typeof left === \"bigint\" || typeof right === \"bigint\" ? BigInt(left) === BigInt(right) : left === right;\n}\n\nfunction serializePkComponent(value: SqlValue): string {\n if (value === null) return \"\\0n\";\n if (typeof value === \"bigint\") return `\\0b:${value.toString()}`;\n if (typeof value === \"number\") return `\\0i:${value}`;\n if (typeof value === \"string\") return `\\0s:${value}`;\n if (value instanceof Uint8Array) return `\\0x:${Array.from(value).join(\",\")}`;\n return `\\0r:${value.value}`;\n}\n\nfunction primaryKeyConflict(tableName: string, columns: ColumnInfo[]): never {\n const qualified = columns.map((column) => `${tableName}.${column.name}`).join(\", \");\n throw new SqliteError(`UNIQUE constraint failed: ${qualified}`, \"constraint_primary\", \"SQLITE_CONSTRAINT_PRIMARYKEY\");\n}\n", "import type {\n CreateIndexStmt,\n CreateTableStmt,\n CreateViewStmt,\n CreateVirtualTableStmt,\n Expr,\n IndexedColumn,\n SelectStmt,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { IndexStore } from \"../indexes/index.ts\";\nimport { isStrictTypeName, unknownStrictType } from \"../types/strict.ts\";\nimport { affinityFromTypeName } from \"../types/value.ts\";\nimport { Fts5VirtualTable } from \"../vtable/fts5.ts\";\nimport {\n BytecodeVirtualTable,\n DbStatVirtualTable,\n FtsVocabVirtualTable,\n RTreeVirtualTable,\n TablesUsedVirtualTable,\n} from \"../vtable/modules.ts\";\nimport type { Rowid } from \"./row.ts\";\nimport type { ColumnInfo } from \"./table.ts\";\nimport { Table } from \"./table.ts\";\n\nexport type AnyVirtualTable =\n | Fts5VirtualTable\n | RTreeVirtualTable\n | DbStatVirtualTable\n | BytecodeVirtualTable\n | TablesUsedVirtualTable\n | FtsVocabVirtualTable;\n\nexport interface ViewInfo {\n name: string;\n columns: string[] | null;\n select: SelectStmt;\n originalSql: string | null;\n}\n\nexport interface IndexInfo {\n name: string;\n tableName: string;\n unique: boolean;\n columns: IndexedColumn[];\n where: Expr | null;\n originalSql: string | null;\n store: IndexStore;\n}\n\nexport interface TriggerInfo {\n name: string;\n tableName: string;\n timing: \"BEFORE\" | \"AFTER\" | \"INSTEAD\";\n event: \"INSERT\" | \"UPDATE\" | \"DELETE\";\n when: Expr | null;\n forEachRow: boolean;\n /** Statements in the trigger body (already parsed). */\n body: import(\"../ast/nodes.ts\").Statement[];\n updateColumns: string[] | null;\n originalSql: string | null;\n}\n\n/** In-memory catalog: tables, indexes, views, triggers, and mutation counters. */\nexport class DatabaseState {\n tables = new Map<string, Table>();\n virtualTables = new Map<string, AnyVirtualTable>();\n views = new Map<string, ViewInfo>();\n indexes = new Map<string, IndexInfo>();\n triggers = new Map<string, TriggerInfo>();\n /** Attached databases: schema name \u2192 state + filename label. */\n attached = new Map<string, { state: DatabaseState; filename: string }>();\n lastInsertRowid: Rowid = 0;\n changes = 0;\n totalChanges = 0;\n foreignKeysEnabled = false;\n schemaVersion = 0;\n userVersion = 0;\n\n databaseForSchema(schema: string | null, qualifiedForError?: string): DatabaseState {\n if (schema === null || schema.toLowerCase() === \"main\" || schema.toLowerCase() === \"temp\") return this;\n const entry = this.attached.get(schema.toLowerCase());\n if (!entry) {\n throw new SqliteError(`no such table: ${qualifiedForError ?? schema}`, \"no_such_table\");\n }\n return entry.state;\n }\n\n databaseForTable(table: Table): DatabaseState {\n if (this.tables.get(keyOf(table.name)) === table) return this;\n for (const { state } of this.attached.values()) {\n if (state.tables.get(keyOf(table.name)) === table) return state;\n }\n return this;\n }\n\n getTable(name: string): Table {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getTable(bare);\n }\n const key = keyOf(bare);\n if (this.virtualTables.has(key)) {\n throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n }\n const table = this.tables.get(key);\n if (!table) throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n return table;\n }\n\n getVirtualTable(name: string): Fts5VirtualTable {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getVirtualTable(bare);\n }\n const key = keyOf(bare);\n const table = this.virtualTables.get(key);\n if (!table || (table.kind !== \"fts5\" && table.kind !== \"fts3\" && table.kind !== \"fts4\")) {\n throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n }\n return table;\n }\n\n getAnyVirtualTable(name: string): AnyVirtualTable {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getAnyVirtualTable(bare);\n }\n const key = keyOf(bare);\n const table = this.virtualTables.get(key);\n if (!table) throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n return table;\n }\n\n isVirtualTable(name: string): boolean {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).isVirtualTable(bare);\n }\n return this.virtualTables.has(keyOf(bare));\n }\n\n isFtsTable(name: string): boolean {\n const table = this.virtualTables.get(keyOf(splitQualifiedName(name).bare));\n return !!table && (table.kind === \"fts5\" || table.kind === \"fts3\" || table.kind === \"fts4\");\n }\n\n createVirtualTable(stmt: CreateVirtualTableStmt, originalSql: string | null = null): AnyVirtualTable {\n const { schema, bare } = splitQualifiedName(stmt.name);\n // temp schema is the same DatabaseState (in-memory); not an ATTACH slot.\n if (schema !== null && schema.toLowerCase() !== \"temp\" && schema.toLowerCase() !== \"main\") {\n return this.databaseForSchema(schema, stmt.name).createVirtualTable({ ...stmt, name: bare }, originalSql);\n }\n const key = keyOf(bare);\n const existing = this.virtualTables.get(key);\n if (existing && stmt.ifNotExists) return existing;\n this.assertSchemaNameAvailable(bare);\n const module = stmt.module.toLowerCase();\n let table: AnyVirtualTable;\n if (module === \"fts5\" || module === \"fts3\" || module === \"fts4\") {\n table = new Fts5VirtualTable(bare, stmt.moduleArgs, originalSql, module);\n } else if (module === \"fts5vocab\") {\n table = new FtsVocabVirtualTable(bare, stmt.moduleArgs, originalSql);\n } else if (module === \"fts3tokenize\" || module === \"fts4aux\") {\n // Tokenize/aux modules: expose as empty FTS-like single-column tables for CREATE success.\n table = new Fts5VirtualTable(bare, stmt.moduleArgs.length ? stmt.moduleArgs : [\"token\"], originalSql, \"fts3\");\n } else if (module === \"rtree\" || module === \"rtree_i32\") {\n table = new RTreeVirtualTable(bare, stmt.moduleArgs, module === \"rtree_i32\", originalSql);\n } else if (module === \"dbstat\") {\n table = new DbStatVirtualTable(bare, stmt.moduleArgs[0] ?? null, originalSql);\n } else if (module === \"bytecode\") {\n table = new BytecodeVirtualTable(bare, originalSql);\n } else if (module === \"tables_used\") {\n table = new TablesUsedVirtualTable(bare, originalSql);\n } else {\n throw new SqliteError(`unknown module: ${stmt.module}`, \"unsupported\");\n }\n this.virtualTables.set(key, table);\n this.schemaVersion++;\n return table;\n }\n\n createTable(stmt: CreateTableStmt, originalSql: string | null = null): Table {\n const { schema, bare } = splitQualifiedName(stmt.name);\n if (schema !== null) {\n return this.databaseForSchema(schema, stmt.name).createTable({ ...stmt, name: bare }, originalSql);\n }\n const key = keyOf(bare);\n const existing = this.tables.get(key);\n if (existing && stmt.ifNotExists) return existing;\n this.assertSchemaNameAvailable(bare);\n\n const seenColumns = new Set<string>();\n const tablePrimaryNames = new Set(\n stmt.constraints\n .filter((constraint) => constraint.type === \"primary_key\")\n .flatMap((constraint) => constraint.columns.map((column) => keyOf(column.name))),\n );\n if (stmt.constraints.filter((constraint) => constraint.type === \"primary_key\").length > 1) {\n throw new SqliteError(\"table has more than one primary key\", \"constraint_primary\");\n }\n const columnPrimaryCount = stmt.columns.filter((column) =>\n column.constraints.some((constraint) => constraint.type === \"primary_key\"),\n ).length;\n if (columnPrimaryCount > 1) {\n throw new SqliteError(\"table has more than one primary key\", \"constraint_primary\");\n }\n\n const columns: ColumnInfo[] = stmt.columns.map((definition) => {\n const columnKey = keyOf(definition.name);\n if (seenColumns.has(columnKey)) throw new SqliteError(`duplicate column name: ${definition.name}`, \"other\");\n seenColumns.add(columnKey);\n\n const primary = definition.constraints.find((constraint) => constraint.type === \"primary_key\");\n const primaryKey = primary !== undefined || tablePrimaryNames.has(columnKey);\n const autoincrement = primary?.type === \"primary_key\" && primary.autoincrement;\n if (autoincrement && definition.typeName?.trim().toUpperCase() !== \"INTEGER\") {\n throw new SqliteError(\"AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY\", \"unsupported\");\n }\n const collateConstraint = definition.constraints.find((constraint) => constraint.type === \"collate\");\n const generatedConstraint = definition.constraints.find((constraint) => constraint.type === \"generated\");\n\n return {\n name: definition.name,\n typeName: definition.typeName,\n affinity: affinityFromTypeName(definition.typeName),\n notNull: definition.constraints.some((constraint) => constraint.type === \"not_null\"),\n primaryKey,\n autoincrement,\n defaultExpr: definition.constraints.find((constraint) => constraint.type === \"default\")?.expr ?? null,\n unique: definition.constraints.some((constraint) => constraint.type === \"unique\"),\n collate: collateConstraint?.type === \"collate\" ? collateConstraint.name : null,\n generated:\n generatedConstraint?.type === \"generated\"\n ? { expr: generatedConstraint.expr, stored: generatedConstraint.stored }\n : null,\n };\n });\n\n for (const constraint of stmt.constraints) {\n const localNames =\n constraint.type === \"primary_key\" || constraint.type === \"unique\"\n ? constraint.columns.map((column) => column.name)\n : constraint.type === \"foreign_key\"\n ? constraint.columns\n : [];\n for (const name of localNames) {\n if (!seenColumns.has(keyOf(name))) throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n }\n }\n const hasColumnPrimary = stmt.columns.some((column) =>\n column.constraints.some((constraint) => constraint.type === \"primary_key\"),\n );\n if (hasColumnPrimary && tablePrimaryNames.size > 0) {\n throw new SqliteError(\"table has more than one primary key\", \"constraint_primary\");\n }\n if (stmt.columns.length === 0) {\n throw new SqliteError(\"table must have at least one column\", \"syntax\");\n }\n if (stmt.strict) {\n for (const definition of stmt.columns) {\n const typeName = definition.typeName?.trim() ?? \"\";\n if (!isStrictTypeName(typeName)) unknownStrictType(bare, definition.name, typeName || \"null\");\n }\n }\n\n const normalizedConstraints = [...stmt.constraints];\n for (const definition of stmt.columns) {\n for (const constraint of definition.constraints) {\n if (constraint.type === \"check\") {\n normalizedConstraints.push({ type: \"check\", expr: constraint.expr, name: null });\n } else if (constraint.type === \"references\") {\n normalizedConstraints.push({\n type: \"foreign_key\",\n columns: [definition.name],\n refTable: constraint.table,\n refColumns: constraint.columns,\n onDelete: constraint.onDelete,\n onUpdate: constraint.onUpdate,\n name: null,\n deferrable: constraint.deferrable,\n initiallyDeferred: constraint.initiallyDeferred,\n });\n }\n }\n }\n const table = new Table(bare, columns, {\n constraints: normalizedConstraints,\n originalSql,\n withoutRowid: stmt.withoutRowid,\n strict: stmt.strict,\n });\n if (stmt.withoutRowid) {\n const pk = columns.filter((column) => column.primaryKey);\n if (pk.length === 0) {\n throw new SqliteError(\"PRIMARY KEY missing on table \" + bare, \"other\");\n }\n }\n this.tables.set(key, table);\n this.createAutoIndexesForTable(table);\n this.schemaVersion++;\n return table;\n }\n\n /**\n * SQLite-like autoindexes for PRIMARY KEY / UNIQUE so lookups and uniqueness\n * checks can use IndexStore. Skips single-column INTEGER PRIMARY KEY (rowid alias).\n */\n private createAutoIndexesForTable(table: Table): void {\n let seq = 1;\n const add = (columns: IndexedColumn[], unique: boolean): void => {\n if (columns.length === 0) return;\n // INTEGER PRIMARY KEY is the rowid map \u2014 no secondary autoindex.\n if (\n unique &&\n columns.length === 1 &&\n !table.withoutRowid &&\n table.integerPkColumn()?.name.toLowerCase() === columns[0]!.name.toLowerCase()\n ) {\n return;\n }\n const name = `sqlite_autoindex_${table.name}_${seq++}`;\n const index: IndexInfo = {\n name,\n tableName: table.name,\n unique,\n columns: structuredClone(columns),\n where: null,\n originalSql: null,\n store: new IndexStore(name),\n };\n this.indexes.set(keyOf(name), index);\n table.indexes.push(index.name);\n };\n\n const hasTablePrimary = table.constraints.some((constraint) => constraint.type === \"primary_key\");\n for (const column of table.columns) {\n if (column.unique) {\n add([{ name: column.name, collate: column.collate, order: null }], true);\n }\n if (column.primaryKey && !hasTablePrimary) {\n add([{ name: column.name, collate: column.collate, order: null }], true);\n }\n }\n for (const constraint of table.constraints) {\n if (constraint.type === \"primary_key\" || constraint.type === \"unique\") {\n add(constraint.columns, true);\n }\n }\n }\n\n dropTable(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).dropTable(bare, ifExists);\n }\n const key = keyOf(bare);\n const table = this.tables.get(key);\n const virtual = this.virtualTables.get(key);\n if (!table && !virtual) {\n if (ifExists) return false;\n throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n }\n if (virtual) {\n this.virtualTables.delete(key);\n this.schemaVersion++;\n return true;\n }\n for (const [indexKey, index] of this.indexes) {\n if (keyOf(index.tableName) === key) this.indexes.delete(indexKey);\n }\n this.dropTriggersForTable(bare);\n this.tables.delete(key);\n this.schemaVersion++;\n return true;\n }\n\n renameTable(oldName: string, newName: string): Table {\n const { schema: oldSchema, bare: oldBare } = splitQualifiedName(oldName);\n if (oldSchema !== null) {\n return this.databaseForSchema(oldSchema, oldName).renameTable(oldBare, splitQualifiedName(newName).bare);\n }\n const oldKey = keyOf(oldBare);\n const table = this.getWritableTable(oldName);\n const { schema: newSchema, bare: newBare } = splitQualifiedName(newName);\n if (newSchema !== null) {\n throw new SqliteError(`no such table: ${newName}`, \"no_such_table\");\n }\n this.assertSchemaNameAvailable(newBare);\n this.tables.delete(oldKey);\n table.name = newBare;\n this.tables.set(keyOf(newBare), table);\n for (const index of [...this.indexes.values()]) {\n if (keyOf(index.tableName) !== oldKey) continue;\n this.ensureWritableIndex(index).tableName = newBare;\n }\n for (const [key, trigger] of this.triggers) {\n if (keyOf(trigger.tableName) !== oldKey) continue;\n this.triggers.set(key, { ...trigger, tableName: newBare });\n }\n this.schemaVersion++;\n return table;\n }\n\n createView(stmt: CreateViewStmt, originalSql: string | null = null): ViewInfo {\n const { schema, bare } = splitQualifiedName(stmt.name);\n if (schema !== null) {\n return this.databaseForSchema(schema, stmt.name).createView({ ...stmt, name: bare }, originalSql);\n }\n const key = keyOf(bare);\n const existing = this.views.get(key);\n if (existing && stmt.ifNotExists) return existing;\n this.assertSchemaNameAvailable(bare);\n const view: ViewInfo = {\n name: bare,\n columns: stmt.columns ? [...stmt.columns] : null,\n select: structuredClone(stmt.select),\n originalSql,\n };\n this.views.set(key, view);\n this.schemaVersion++;\n return view;\n }\n\n dropView(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).dropView(bare, ifExists);\n }\n const deleted = this.views.delete(keyOf(bare));\n if (!deleted && !ifExists) throw new SqliteError(`no such view: ${name}`, \"other\");\n if (deleted) this.schemaVersion++;\n return deleted;\n }\n\n createIndex(stmt: CreateIndexStmt, originalSql: string | null = null): IndexInfo {\n const table = this.getWritableTable(stmt.table);\n const { schema, bare } = splitQualifiedName(stmt.name);\n const target = schema !== null ? this.databaseForSchema(schema, stmt.name) : this.databaseForTable(table);\n const key = keyOf(bare);\n const existing = target.indexes.get(key);\n if (existing && stmt.ifNotExists) return existing;\n target.assertSchemaNameAvailable(bare);\n for (const indexed of stmt.columns) {\n if (indexed.expr) continue;\n if (!table.columns.some((column) => keyOf(column.name) === keyOf(indexed.name))) {\n throw new SqliteError(`no such column: ${indexed.name}`, \"no_such_column\");\n }\n }\n const index: IndexInfo = {\n name: bare,\n tableName: table.name,\n unique: stmt.unique,\n columns: structuredClone(stmt.columns),\n where: stmt.where ? structuredClone(stmt.where) : null,\n originalSql,\n store: new IndexStore(bare),\n };\n target.indexes.set(key, index);\n table.indexes.push(index.name);\n target.schemaVersion++;\n return index;\n }\n\n dropIndex(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n const target = schema !== null ? this.databaseForSchema(schema, name) : this;\n const key = keyOf(bare);\n const index = target.indexes.get(key);\n if (!index) {\n if (ifExists) return false;\n throw new SqliteError(`no such index: ${name}`, \"other\");\n }\n target.indexes.delete(key);\n const table = target.tables.get(keyOf(index.tableName));\n if (table) {\n const writable = target.ensureWritableTable(table);\n writable.indexes = writable.indexes.filter((item) => keyOf(item) !== key);\n }\n target.schemaVersion++;\n return true;\n }\n\n createTrigger(info: TriggerInfo): TriggerInfo {\n const { schema, bare } = splitQualifiedName(info.name);\n const target = schema !== null ? this.databaseForSchema(schema, info.name) : this;\n const key = keyOf(bare);\n target.assertSchemaNameAvailable(bare);\n const trigger: TriggerInfo = {\n ...info,\n name: bare,\n body: structuredClone(info.body),\n when: info.when ? structuredClone(info.when) : null,\n updateColumns: info.updateColumns ? [...info.updateColumns] : null,\n };\n target.triggers.set(key, trigger);\n target.schemaVersion++;\n return trigger;\n }\n\n dropTrigger(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n const target = schema !== null ? this.databaseForSchema(schema, name) : this;\n const key = keyOf(bare);\n const deleted = target.triggers.delete(key);\n if (!deleted && !ifExists) throw new SqliteError(`no such trigger: ${name}`, \"other\");\n if (deleted) target.schemaVersion++;\n return deleted;\n }\n\n dropTriggersForTable(tableName: string): void {\n const key = keyOf(tableName);\n for (const [triggerKey, trigger] of this.triggers) {\n if (keyOf(trigger.tableName) === key) this.triggers.delete(triggerKey);\n }\n }\n\n recordChange(count: number, lastInsertRowid?: Rowid): void {\n this.changes = count;\n this.totalChanges += count;\n if (lastInsertRowid !== undefined) this.lastInsertRowid = lastInsertRowid;\n }\n\n clone(): DatabaseState {\n const copy = new DatabaseState();\n for (const [key, table] of this.tables) copy.tables.set(key, table.clone());\n for (const [key, table] of this.virtualTables) copy.virtualTables.set(key, table.clone());\n for (const [key, view] of this.views) {\n copy.views.set(key, {\n name: view.name,\n columns: view.columns ? [...view.columns] : null,\n select: structuredClone(view.select),\n originalSql: view.originalSql,\n });\n }\n for (const [key, index] of this.indexes) {\n copy.indexes.set(key, {\n name: index.name,\n tableName: index.tableName,\n unique: index.unique,\n columns: structuredClone(index.columns),\n where: index.where ? structuredClone(index.where) : null,\n originalSql: index.originalSql,\n store: index.store.clone(),\n });\n }\n for (const [key, trigger] of this.triggers) {\n copy.triggers.set(key, {\n name: trigger.name,\n tableName: trigger.tableName,\n timing: trigger.timing,\n event: trigger.event,\n when: trigger.when ? structuredClone(trigger.when) : null,\n forEachRow: trigger.forEachRow,\n body: structuredClone(trigger.body),\n updateColumns: trigger.updateColumns ? [...trigger.updateColumns] : null,\n originalSql: trigger.originalSql,\n });\n }\n for (const [name, attached] of this.attached) {\n copy.attached.set(name, { state: attached.state.clone(), filename: attached.filename });\n }\n copy.lastInsertRowid = this.lastInsertRowid;\n copy.changes = this.changes;\n copy.totalChanges = this.totalChanges;\n copy.foreignKeysEnabled = this.foreignKeysEnabled;\n copy.schemaVersion = this.schemaVersion;\n copy.userVersion = this.userVersion;\n return copy;\n }\n\n /** Share table/index objects with the live state. Callers must freeze first. */\n cloneShallow(): DatabaseState {\n const copy = new DatabaseState();\n copy.tables = new Map(this.tables);\n for (const [key, table] of this.virtualTables) copy.virtualTables.set(key, table.clone());\n copy.views = new Map(this.views);\n copy.indexes = new Map(this.indexes);\n copy.triggers = new Map(this.triggers);\n for (const [name, attached] of this.attached) {\n copy.attached.set(name, { state: attached.state.cloneShallow(), filename: attached.filename });\n }\n copy.lastInsertRowid = this.lastInsertRowid;\n copy.changes = this.changes;\n copy.totalChanges = this.totalChanges;\n copy.foreignKeysEnabled = this.foreignKeysEnabled;\n copy.schemaVersion = this.schemaVersion;\n copy.userVersion = this.userVersion;\n return copy;\n }\n\n freezeShared(): void {\n for (const table of this.tables.values()) table.freeze();\n for (const index of this.indexes.values()) index.store.freeze();\n for (const attached of this.attached.values()) attached.state.freezeShared();\n }\n\n thawShared(): void {\n for (const table of this.tables.values()) table.frozen = false;\n for (const index of this.indexes.values()) index.store.frozen = false;\n for (const attached of this.attached.values()) attached.state.thawShared();\n }\n\n getWritableTable(name: string): Table {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getWritableTable(bare);\n }\n const table = this.getTable(bare);\n return this.ensureWritableTable(table);\n }\n\n ensureWritableTable(table: Table): Table {\n if (!table.frozen) return table;\n const key = keyOf(table.name);\n const copy = table.clone();\n this.tables.set(key, copy);\n return copy;\n }\n\n getWritableIndex(name: string): IndexInfo {\n const key = keyOf(name);\n const index = this.indexes.get(key);\n if (!index) throw new SqliteError(`no such index: ${name}`, \"other\");\n return this.ensureWritableIndex(index);\n }\n\n ensureWritableIndex(index: IndexInfo): IndexInfo {\n if (!index.store.frozen) return index;\n const copy: IndexInfo = {\n name: index.name,\n tableName: index.tableName,\n unique: index.unique,\n columns: structuredClone(index.columns),\n where: index.where ? structuredClone(index.where) : null,\n originalSql: index.originalSql,\n store: index.store.clone(),\n };\n this.indexes.set(keyOf(index.name), copy);\n return copy;\n }\n\n replaceWith(state: DatabaseState, options?: { adopt?: boolean }): void {\n const copy = options?.adopt ? state : state.clone();\n this.tables = copy.tables;\n this.virtualTables = copy.virtualTables;\n this.views = copy.views;\n this.indexes = copy.indexes;\n this.triggers = copy.triggers;\n this.attached = copy.attached;\n this.lastInsertRowid = copy.lastInsertRowid;\n this.changes = copy.changes;\n this.totalChanges = copy.totalChanges;\n this.foreignKeysEnabled = copy.foreignKeysEnabled;\n this.schemaVersion = copy.schemaVersion;\n this.userVersion = copy.userVersion;\n }\n\n private assertSchemaNameAvailable(name: string): void {\n const key = keyOf(name);\n if (\n this.tables.has(key) ||\n this.views.has(key) ||\n this.indexes.has(key) ||\n this.virtualTables.has(key) ||\n this.triggers.has(key)\n ) {\n throw new SqliteError(`object already exists: ${name}`, \"other\");\n }\n }\n}\n\nexport function splitQualifiedName(name: string): { schema: string | null; bare: string } {\n const dot = name.indexOf(\".\");\n if (dot < 0) return { schema: null, bare: name };\n return { schema: name.slice(0, dot), bare: name.slice(dot + 1) };\n}\n\nfunction keyOf(name: string): string {\n return name.toLowerCase();\n}\n", "import type { Expr, IndexedColumn, TableConstraint } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { defaultFunctionRegistry } from \"../functions/registry.ts\";\nimport { IndexStore } from \"../indexes/index.ts\";\nimport { DatabaseState, type IndexInfo, type ViewInfo } from \"../storage/database-state.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport { type ColumnInfo, Table } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport { asSqlReal, isTruthySql, SqlJsonText, SqlReal, type SqlValue, utf8Decode, utf8Encode } from \"../types/value.ts\";\n\nconst MAGIC = utf8Encode(\"SQLM\");\n/** Snapshot format: v1 = schema/rows only; v2 appends PRNG state + clock ms. */\nconst VERSION = 2;\nconst VERSION_V1 = 1;\n\n/** PRNG + clock captured alongside schema/rows in a v2 snapshot. */\nexport interface SnapshotRuntime {\n /** Unsigned 64-bit {@link Prng} state. */\n prngState: bigint;\n /** Clock instant as milliseconds since Unix epoch. */\n nowMs: number;\n}\n\n/** Result of {@link decodeDatabaseState}. */\nexport interface DecodedSnapshot {\n /** Restored catalog and table data. */\n state: DatabaseState;\n /** Present for v2 snapshots; `null` for v1 (schema/rows only). */\n runtime: SnapshotRuntime | null;\n}\n\nclass Writer {\n private buf = new Uint8Array(1024);\n private len = 0;\n\n private ensure(needed: number): void {\n if (this.len + needed <= this.buf.length) return;\n let cap = this.buf.length;\n while (cap < this.len + needed) cap *= 2;\n const next = new Uint8Array(cap);\n next.set(this.buf.subarray(0, this.len));\n this.buf = next;\n }\n\n u8(value: number): void {\n this.ensure(1);\n this.buf[this.len++] = value & 0xff;\n }\n u32(value: number): void {\n this.ensure(4);\n this.buf[this.len++] = value & 0xff;\n this.buf[this.len++] = (value >>> 8) & 0xff;\n this.buf[this.len++] = (value >>> 16) & 0xff;\n this.buf[this.len++] = (value >>> 24) & 0xff;\n }\n u64(value: bigint): void {\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setBigUint64(0, BigInt.asUintN(64, value), true);\n this.raw(bytes);\n }\n i64(value: bigint): void {\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setBigInt64(0, value, true);\n this.raw(bytes);\n }\n raw(value: Uint8Array): void {\n this.ensure(value.length);\n this.buf.set(value, this.len);\n this.len += value.length;\n }\n text(value: string): void {\n const bytes = utf8Encode(value);\n this.u32(bytes.length);\n this.raw(bytes);\n }\n json(value: unknown): void {\n this.text(JSON.stringify(value, jsonReplacer));\n }\n value(value: SqlValue): void {\n if (value === null) {\n this.u8(0);\n return;\n }\n if (value instanceof SqlReal) {\n this.u8(2);\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setFloat64(0, value.value, true);\n this.raw(bytes);\n return;\n }\n if (typeof value === \"bigint\" || (typeof value === \"number\" && Number.isInteger(value))) {\n this.u8(1);\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setBigInt64(0, BigInt(value), true);\n this.raw(bytes);\n return;\n }\n if (typeof value === \"number\") {\n this.u8(2);\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setFloat64(0, value, true);\n this.raw(bytes);\n return;\n }\n if (typeof value === \"string\") {\n this.u8(3);\n this.text(value);\n return;\n }\n if (value instanceof SqlJsonText) {\n this.u8(3);\n this.text(value.value);\n return;\n }\n this.u8(4);\n this.u32(value.length);\n this.raw(value);\n }\n finish(): Uint8Array {\n // Avoid retaining unused capacity when the buffer grew past the payload.\n if (this.len === this.buf.length) return this.buf;\n return this.buf.slice(0, this.len);\n }\n}\n\nclass Reader {\n private offset = 0;\n constructor(private readonly bytes: Uint8Array) {}\n u8(): number {\n if (this.offset >= this.bytes.length) this.fail();\n return this.bytes[this.offset++]!;\n }\n u32(): number {\n if (this.offset + 4 > this.bytes.length) this.fail();\n const value = new DataView(this.bytes.buffer, this.bytes.byteOffset + this.offset, 4).getUint32(0, true);\n this.offset += 4;\n return value;\n }\n u64(): bigint {\n const bytes = this.raw(8);\n return new DataView(bytes.buffer, bytes.byteOffset, 8).getBigUint64(0, true);\n }\n i64(): bigint {\n const bytes = this.raw(8);\n return new DataView(bytes.buffer, bytes.byteOffset, 8).getBigInt64(0, true);\n }\n raw(length: number): Uint8Array {\n if (length < 0 || this.offset + length > this.bytes.length) this.fail();\n const value = this.bytes.slice(this.offset, this.offset + length);\n this.offset += length;\n return value;\n }\n text(): string {\n return utf8Decode(this.raw(this.u32()));\n }\n json<T>(): T {\n return JSON.parse(this.text(), jsonReviver) as T;\n }\n value(): SqlValue {\n const tag = this.u8();\n if (tag === 0) return null;\n if (tag === 1) {\n const bytes = this.raw(8);\n const integer = new DataView(bytes.buffer, bytes.byteOffset, 8).getBigInt64(0, true);\n return integer <= BigInt(Number.MAX_SAFE_INTEGER) && integer >= BigInt(Number.MIN_SAFE_INTEGER)\n ? Number(integer)\n : integer;\n }\n if (tag === 2) {\n const bytes = this.raw(8);\n const value = new DataView(bytes.buffer, bytes.byteOffset, 8).getFloat64(0, true);\n // Preserve REAL storage class for integer-valued floats across snapshot restore.\n return Number.isInteger(value) && Number.isFinite(value) ? asSqlReal(value) : value;\n }\n if (tag === 3) return this.text();\n if (tag === 4) return this.raw(this.u32());\n this.fail();\n }\n remaining(): number {\n return this.bytes.length - this.offset;\n }\n done(): boolean {\n return this.offset === this.bytes.length;\n }\n private fail(): never {\n throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n }\n}\n\ninterface TableMeta {\n name: string;\n columns: ColumnInfo[];\n constraints: TableConstraint[];\n indexes: string[];\n originalSql: string | null;\n withoutRowid?: boolean;\n strict?: boolean;\n}\n\ninterface IndexMeta {\n name: string;\n tableName: string;\n unique: boolean;\n columns: IndexedColumn[];\n where: Expr | null;\n originalSql: string | null;\n}\n\n/**\n * Encode catalog, rows, and runtime into a sqlite-mem snapshot blob (not a `.sqlite` file).\n *\n * Prefer {@link Database.snapshot} unless you are serializing engine state directly.\n */\nexport function encodeDatabaseState(state: DatabaseState, runtime: SnapshotRuntime): Uint8Array {\n const writer = new Writer();\n writer.raw(MAGIC);\n writer.u32(VERSION);\n writer.u8(state.foreignKeysEnabled ? 1 : 0);\n writer.u32(state.schemaVersion);\n writer.u32(state.changes);\n writer.u32(state.totalChanges);\n writer.value(state.lastInsertRowid);\n writer.u32(state.tables.size);\n for (const table of sortedValues(state.tables)) {\n writer.json({\n name: table.name,\n columns: table.columns,\n constraints: table.constraints,\n indexes: [...table.indexes].sort(compareNames),\n originalSql: table.originalSql,\n withoutRowid: table.withoutRowid || undefined,\n strict: table.strict || undefined,\n });\n writer.value(table.nextRowid);\n const rows = [...table.rows.values()].sort((a, b) => compareRowids(a.rowid, b.rowid));\n writer.u32(rows.length);\n for (const row of rows) {\n writer.value(row.rowid);\n writer.u32(table.columns.length);\n for (const column of table.columns) writer.value(row.values.get(column.name.toLowerCase()) ?? null);\n }\n }\n const views = sortedValues(state.views);\n writer.u32(views.length);\n for (const view of views) writer.json(view);\n const indexes = sortedValues(state.indexes);\n writer.u32(indexes.length);\n for (const index of indexes) {\n writer.json({\n name: index.name,\n tableName: index.tableName,\n unique: index.unique,\n columns: index.columns,\n where: index.where,\n originalSql: index.originalSql,\n });\n }\n writer.u64(runtime.prngState);\n writer.i64(BigInt(Math.trunc(runtime.nowMs)));\n return writer.finish();\n}\n\n/**\n * Decode a blob from {@link encodeDatabaseState} / {@link Database.snapshot}.\n *\n * @throws {SqliteError} If the magic, version, or payload is invalid.\n */\nexport function decodeDatabaseState(snapshot: Uint8Array): DecodedSnapshot {\n const reader = new Reader(snapshot);\n const magic = reader.raw(4);\n if (!magic.every((byte, index) => byte === MAGIC[index]))\n throw new SqliteError(\"invalid sqlite-mem snapshot magic\", \"other\");\n const version = reader.u32();\n if (version !== VERSION && version !== VERSION_V1) {\n throw new SqliteError(`unsupported sqlite-mem snapshot version: ${version}`, \"snapshot_version\", \"SQLITE_FORMAT\");\n }\n const state = new DatabaseState();\n state.foreignKeysEnabled = reader.u8() !== 0;\n state.schemaVersion = reader.u32();\n state.changes = reader.u32();\n state.totalChanges = reader.u32();\n state.lastInsertRowid = asRowid(reader.value());\n const tableCount = reader.u32();\n for (let tableIndex = 0; tableIndex < tableCount; tableIndex++) {\n const meta = reader.json<TableMeta>();\n const table = new Table(meta.name, meta.columns, {\n constraints: meta.constraints,\n indexes: meta.indexes,\n originalSql: meta.originalSql,\n withoutRowid: meta.withoutRowid ?? false,\n strict: meta.strict ?? false,\n });\n table.nextRowid = asRowid(reader.value());\n const rowCount = reader.u32();\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n const rowid = asRowid(reader.value());\n const valueCount = reader.u32();\n if (valueCount !== table.columns.length) throw new SqliteError(\"snapshot row column count mismatch\", \"other\");\n const values = new Map<string, SqlValue>();\n for (const column of table.columns) values.set(column.name.toLowerCase(), reader.value());\n table.rows.set(rowid, { rowid, values });\n }\n table.rebuildClusteredRows();\n state.tables.set(table.name.toLowerCase(), table);\n }\n const viewCount = reader.u32();\n for (let index = 0; index < viewCount; index++) {\n const view = reader.json<ViewInfo>();\n state.views.set(view.name.toLowerCase(), view);\n }\n const indexCount = reader.u32();\n for (let indexPosition = 0; indexPosition < indexCount; indexPosition++) {\n const meta = reader.json<IndexMeta>();\n const info: IndexInfo = { ...meta, store: new IndexStore(meta.name) };\n state.indexes.set(info.name.toLowerCase(), info);\n const table = state.getTable(info.tableName);\n for (const row of table.scan()) {\n if (\n info.where &&\n isTruthySql(\n evalExpr(info.where, {\n functions: defaultFunctionRegistry,\n resolveColumn: (qualifier, name) => {\n if (qualifier && qualifier.toLowerCase() !== table.name.toLowerCase()) {\n throw new SqliteError(`no such column: ${qualifier}.${name}`, \"no_such_column\");\n }\n if (name.toLowerCase() === \"rowid\") return row.rowid;\n if (!row.values.has(name.toLowerCase()))\n throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n return row.values.get(name.toLowerCase()) ?? null;\n },\n getParameter: () => {\n throw new SqliteError(\"parameters are not allowed in index predicates\", \"misuse\");\n },\n }),\n ) !== true\n )\n continue;\n info.store.insert(\n info.columns.map((column) =>\n normalizeForCollation(row.values.get(column.name.toLowerCase()) ?? null, column.collate ?? \"BINARY\"),\n ),\n row.rowid,\n info.unique,\n );\n }\n }\n\n let runtime: SnapshotRuntime | null = null;\n if (version >= VERSION) {\n if (reader.remaining() < 16) throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n runtime = {\n prngState: reader.u64(),\n nowMs: Number(reader.i64()),\n };\n }\n if (!reader.done()) throw new SqliteError(\"snapshot has trailing data\", \"other\");\n return { state, runtime };\n}\n\nfunction asRowid(value: SqlValue): Rowid {\n if ((typeof value === \"number\" && Number.isSafeInteger(value)) || typeof value === \"bigint\") return value;\n throw new SqliteError(\"invalid rowid in snapshot\", \"other\");\n}\n\n/** Locale-independent UTF-16 code-unit order for stable snapshot encoding. */\nfunction compareNames(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction compareRowids(a: Rowid, b: Rowid): number {\n const left = typeof a === \"bigint\" ? a : BigInt(a);\n const right = typeof b === \"bigint\" ? b : BigInt(b);\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n\nfunction sortedValues<T extends { name: string }>(map: Map<string, T>): T[] {\n return [...map.values()].sort((a, b) => compareNames(a.name, b.name));\n}\n\nfunction jsonReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") return { $sqlm: \"bigint\", value: value.toString() };\n if (value instanceof Uint8Array) return { $sqlm: \"blob\", value: Array.from(value) };\n return value;\n}\n\nfunction jsonReviver(_key: string, value: unknown): unknown {\n if (!value || typeof value !== \"object\" || !(\"$sqlm\" in value)) return value;\n const tagged = value as { $sqlm: string; value: string | number[] };\n if (tagged.$sqlm === \"bigint\") return BigInt(tagged.value as string);\n if (tagged.$sqlm === \"blob\") return Uint8Array.from(tagged.value as number[]);\n return value;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { Prng } from \"../runtime/prng.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\n\ninterface SavepointSnapshot {\n name: string;\n state: DatabaseState;\n prngState: bigint;\n}\n\nexport class TransactionManager {\n readonly state: DatabaseState;\n readonly prng: Prng;\n private transactionSnapshot: DatabaseState | null = null;\n private transactionPrngState: bigint | null = null;\n private savepoints: SavepointSnapshot[] = [];\n private startedBySavepoint = false;\n\n constructor(state: DatabaseState, prng: Prng) {\n this.state = state;\n this.prng = prng;\n }\n\n get inTransaction(): boolean {\n return this.transactionSnapshot !== null;\n }\n\n begin(): void {\n if (this.inTransaction) {\n throw new SqliteError(\"cannot start a transaction within a transaction\", \"transaction\", \"SQLITE_ERROR\");\n }\n this.state.freezeShared();\n this.transactionSnapshot = this.state.cloneShallow();\n this.transactionPrngState = this.prng.getState();\n this.savepoints = [];\n this.startedBySavepoint = false;\n }\n\n commit(): void {\n this.requireTransaction(\"cannot commit - no transaction is active\");\n this.transactionSnapshot = null;\n this.transactionPrngState = null;\n this.savepoints = [];\n this.startedBySavepoint = false;\n this.state.thawShared();\n }\n\n rollback(savepoint?: string): void {\n this.requireTransaction(\"cannot rollback - no transaction is active\");\n if (savepoint !== undefined) {\n const index = this.findSavepoint(savepoint);\n const snapshot = this.savepoints[index];\n if (!snapshot) throw new SqliteError(`no such savepoint: ${savepoint}`, \"transaction\", \"SQLITE_ERROR\");\n this.state.replaceWith(snapshot.state, { adopt: true });\n this.prng.setState(snapshot.prngState);\n this.savepoints.splice(index + 1);\n return;\n }\n\n const snapshot = this.transactionSnapshot;\n const prngState = this.transactionPrngState;\n if (!snapshot || prngState === null) {\n throw new SqliteError(\"cannot rollback - no transaction is active\", \"transaction\", \"SQLITE_ERROR\");\n }\n this.state.replaceWith(snapshot, { adopt: true });\n this.prng.setState(prngState);\n this.transactionSnapshot = null;\n this.transactionPrngState = null;\n this.savepoints = [];\n this.startedBySavepoint = false;\n this.state.thawShared();\n }\n\n savepoint(name: string): void {\n if (!this.inTransaction) {\n this.state.freezeShared();\n this.transactionSnapshot = this.state.cloneShallow();\n this.transactionPrngState = this.prng.getState();\n this.startedBySavepoint = true;\n } else {\n this.state.freezeShared();\n }\n this.savepoints.push({\n name,\n state: this.state.cloneShallow(),\n prngState: this.prng.getState(),\n });\n }\n\n release(name: string): void {\n this.requireTransaction(\"cannot release savepoint - no transaction is active\");\n const index = this.findSavepoint(name);\n this.savepoints.splice(index);\n if (this.startedBySavepoint && this.savepoints.length === 0) {\n this.transactionSnapshot = null;\n this.transactionPrngState = null;\n this.startedBySavepoint = false;\n this.state.thawShared();\n }\n }\n\n private findSavepoint(name: string): number {\n const normalized = name.toLowerCase();\n for (let index = this.savepoints.length - 1; index >= 0; index--) {\n const savepoint = this.savepoints[index];\n if (savepoint && savepoint.name.toLowerCase() === normalized) return index;\n }\n throw new SqliteError(`no such savepoint: ${name}`, \"transaction\", \"SQLITE_ERROR\");\n }\n\n private requireTransaction(message: string): void {\n if (!this.inTransaction) throw new SqliteError(message, \"transaction\", \"SQLITE_ERROR\");\n }\n}\n", "import type { SelectStmt } from \"../ast/nodes.ts\";\nimport { SqliteError, TriggerRaiseError } from \"../errors/index.ts\";\nimport type { EvalContext } from \"../expressions/context.ts\";\nimport { defaultFunctionRegistry, type FunctionRegistry } from \"../functions/registry.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport type { TransactionManager } from \"../transactions/manager.ts\";\nimport type { ResultSet } from \"./result.ts\";\nimport {\n type Affinity,\n canonicalizeNumber,\n SqlJsonText,\n SqlReal,\n type SqlValue,\n storageClassOf,\n} from \"../types/value.ts\";\n\nexport interface Cell {\n table: string | null;\n tableLower?: string | null;\n name: string;\n nameLower?: string;\n value: SqlValue;\n affinity?: Affinity;\n collate?: string | null;\n /** Right-hand duplicate of a column merged by JOIN ... USING. */\n hiddenByUsing?: boolean;\n}\n\nexport function makeCell(\n table: string | null,\n name: string,\n value: SqlValue,\n extra?: Omit<Partial<Cell>, \"table\" | \"name\" | \"value\" | \"tableLower\" | \"nameLower\">,\n): Cell {\n return {\n table,\n tableLower: table?.toLowerCase() ?? null,\n name,\n nameLower: name.toLowerCase(),\n value,\n ...extra,\n };\n}\n\nexport interface ScopeRow {\n cells: Cell[];\n rowid?: Rowid;\n /** Output name of the rowid pseudo-column (INTEGER PRIMARY KEY alias when present). */\n rowidName?: string;\n sourceTable?: string;\n /** Set when WHERE MATCH succeeds for this row. */\n ftsMatch?: import(\"../vtable/fts5.ts\").FtsMatchCursor | null;\n}\n\nexport type SelectRunner = (stmt: SelectStmt, env: ExecutionEnv, parent?: EvalContext) => ResultSet;\n\nexport interface ExecutionHooks {\n now?: () => Date;\n random?: () => bigint;\n /** Raw xorshift64* output for `randomblob`. */\n randomU64?: () => bigint;\n}\n\nexport class ExecutionEnv {\n readonly state: DatabaseState;\n readonly transactions: TransactionManager;\n readonly functions: FunctionRegistry;\n readonly positional: SqlValue[];\n readonly named: Map<string, SqlValue>;\n readonly ctes = new Map<string, ResultSet>();\n readonly hooks: ExecutionHooks;\n selectRunner?: SelectRunner;\n\n /** Nesting depth while executing trigger programs. */\n triggerDepth = 0;\n /** OLD/NEW column scope for the active trigger program. */\n triggerScope: ScopeRow | null = null;\n\n /** Cap SELECT output rows (used by Statement.get). */\n maxRows = Number.POSITIVE_INFINITY;\n includeNamedRows = true;\n includeValues = true;\n\n constructor(\n state: DatabaseState,\n transactions: TransactionManager,\n params: readonly unknown[] = [],\n functions: FunctionRegistry = defaultFunctionRegistry,\n hooks: ExecutionHooks = {},\n ) {\n this.state = state;\n this.transactions = transactions;\n this.functions = functions;\n this.hooks = hooks;\n this.positional = params.map(toSqlValue);\n this.named = new Map();\n }\n\n reset(params: readonly unknown[]): void {\n this.positional.length = 0;\n for (const value of params) this.positional.push(toSqlValue(value));\n this.named.clear();\n this.ctes.clear();\n this.triggerDepth = 0;\n this.triggerScope = null;\n this.maxRows = Number.POSITIVE_INFINITY;\n this.includeNamedRows = true;\n this.includeValues = true;\n }\n\n getBoundParameter(name: string | number): SqlValue {\n if (typeof name === \"number\") {\n if (name < 1 || name > this.positional.length) return null;\n return this.positional[name - 1]!;\n }\n const key = name.toLowerCase();\n if (!this.named.has(key)) {\n // Unnamed positional fallback is handled by the evaluator for PARAM_POS;\n // named placeholders that were never bound are NULL (SQLite).\n return null;\n }\n return this.named.get(key) ?? null;\n }\n\n setNamed(name: string, value: unknown): void {\n this.named.set(name.toLowerCase(), toSqlValue(value));\n }\n\n createEvalContext(row: ScopeRow | null = null, parent?: EvalContext): EvalContext {\n const scope = row ?? this.triggerScope;\n const cells = scope?.cells ?? [];\n const context: EvalContext = {\n parent,\n ftsMatch: scope?.ftsMatch ?? null,\n functions: this.functions,\n functionContext: {\n changes: () => this.state.changes,\n totalChanges: () => this.state.totalChanges,\n lastInsertRowid: () => this.state.lastInsertRowid,\n now: this.hooks.now,\n random: this.hooks.random,\n randomU64: this.hooks.randomU64,\n ftsMatch: scope?.ftsMatch ?? null,\n ftsRowid: scope?.rowid,\n ftsSourceTable: scope?.sourceTable,\n getFtsTable: (name: string) => {\n if (!this.state.isFtsTable(name)) return null;\n return this.state.getVirtualTable(name);\n },\n },\n raise: this.triggerScope\n ? (action, message) => {\n throw new TriggerRaiseError(action, message);\n }\n : undefined,\n resolveColumn: (table, name) => {\n const key = name.toLowerCase();\n const tableKey = table?.toLowerCase();\n const tableMatches =\n table === null || cells.some((cell) => (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey);\n if (tableMatches && (key === \"rowid\" || key === \"_rowid_\" || key === \"oid\") && scope?.rowid !== undefined) {\n return scope.rowid;\n }\n if (key === \"rank\" && scope?.sourceTable && this.state.isFtsTable(scope.sourceTable)) {\n const fts = this.state.getVirtualTable(scope.sourceTable);\n if (scope.ftsMatch) return fts.bm25(scope.ftsMatch);\n return null;\n }\n // FTS table-name reference used by aux functions (bm25(docs), \u2026)\n if (\n scope?.sourceTable &&\n key === scope.sourceTable.toLowerCase() &&\n this.state.isFtsTable(scope.sourceTable) &&\n !cells.some((cell) => (cell.nameLower ?? cell.name.toLowerCase()) === key)\n ) {\n return scope.sourceTable;\n }\n const matches = cells.filter((cell) => {\n if ((cell.nameLower ?? cell.name.toLowerCase()) !== key) return false;\n if (table === null) return !cell.hiddenByUsing;\n return (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey;\n });\n if (matches.length === 0)\n throw new SqliteError(`no such column: ${table ? `${table}.` : \"\"}${name}`, \"no_such_column\");\n if (matches.length > 1 && table === null) throw new SqliteError(`ambiguous column name: ${name}`, \"other\");\n return matches[0]!.value;\n },\n resolveStorageClass: (table, name) => {\n const key = name.toLowerCase();\n if (key === \"rank\") return \"real\";\n const tableKey = table?.toLowerCase();\n const matches = cells.filter((cell) => {\n if ((cell.nameLower ?? cell.name.toLowerCase()) !== key) return false;\n if (table === null) return !cell.hiddenByUsing;\n return (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey;\n });\n if (matches.length === 0)\n throw new SqliteError(`no such column: ${table ? `${table}.` : \"\"}${name}`, \"no_such_column\");\n if (matches.length > 1 && table === null) throw new SqliteError(`ambiguous column name: ${name}`, \"other\");\n const cell = matches[0]!;\n return cell.affinity === \"REAL\" && typeof cell.value === \"number\" ? \"real\" : storageClassOf(cell.value);\n },\n resolveCollation: (table, name) => {\n const key = name.toLowerCase();\n const tableKey = table?.toLowerCase();\n const matches = cells.filter((cell) => {\n if ((cell.nameLower ?? cell.name.toLowerCase()) !== key) return false;\n if (table === null) return !cell.hiddenByUsing;\n return (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey;\n });\n if (matches.length === 0) return null;\n if (matches.length > 1 && table === null) return null;\n return matches[0]!.collate ?? null;\n },\n getParameter: (name) => this.getBoundParameter(name),\n executeSelect: (select) => {\n if (!this.selectRunner) throw new SqliteError(\"select executor is not configured\", \"misuse\");\n const result = this.selectRunner(select, this, context);\n return {\n columns: result.columns,\n rows:\n result.values.length > 0\n ? result.values.map((row) => [...row])\n : result.rows.map((record) => result.columns.map((column) => record[column] ?? null)),\n };\n },\n matchFts: (table, column, query) => {\n if (row?.rowid === undefined || !row.sourceTable) {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n if (!this.state.isFtsTable(row.sourceTable)) {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n const fts = this.state.getVirtualTable(row.sourceTable);\n const cursor = fts.matchCursor(row.rowid, table, column, query);\n if (cursor) row.ftsMatch = cursor;\n else row.ftsMatch = null;\n return cursor !== null;\n },\n };\n return context;\n }\n}\n\nexport function toSqlValue(value: unknown): SqlValue {\n if (value === null || typeof value === \"string\" || typeof value === \"bigint\") return value;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new SqliteError(\"only finite numbers can be bound\", \"datatype_mismatch\");\n return canonicalizeNumber(value);\n }\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (value instanceof SqlReal || value instanceof SqlJsonText) return value;\n if (value instanceof Uint8Array) {\n if (isSharedArrayBufferView(value)) {\n throw new SqliteError(\"cannot bind SharedArrayBuffer-backed buffers; copy into a Uint8Array first\", \"misuse\");\n }\n return new Uint8Array(value);\n }\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n if (typeof SharedArrayBuffer !== \"undefined\" && value instanceof SharedArrayBuffer) {\n throw new SqliteError(\"cannot bind SharedArrayBuffer; copy into an ArrayBuffer or Uint8Array first\", \"misuse\");\n }\n if (ArrayBuffer.isView(value)) {\n const kind = Object.prototype.toString.call(value).slice(8, -1);\n throw new SqliteError(`cannot bind ${kind}; only Uint8Array and ArrayBuffer are accepted as BLOB values`, \"misuse\");\n }\n throw new SqliteError(`unsupported bind value: ${typeof value}`, \"datatype_mismatch\");\n}\n\nfunction isSharedArrayBufferView(view: ArrayBufferView): boolean {\n return typeof SharedArrayBuffer !== \"undefined\" && view.buffer instanceof SharedArrayBuffer;\n}\n", "import { isSqlJsonText, isSqlReal, type QueryRow, type QueryValue, type SqlValue } from \"../types/value.ts\";\n\n/** Query result returned by {@link Statement.result}. */\nexport interface ResultSet {\n /** Result-column names, in SELECT order. Present even when `rows` is empty. */\n columns: string[];\n /** Named rows. Duplicate column names keep the last value. */\n rows: QueryRow[];\n /** Positional rows; always present (empty array when there are zero rows). */\n values: QueryValue[][];\n /** Rows changed by the most recent mutating statement in this execution. */\n changes: number;\n /** Rowid of the most recent INSERT in this execution. */\n lastInsertRowid: number | bigint;\n}\n\nexport function emptyResult(changes = 0, lastInsertRowid: number | bigint = 0): ResultSet {\n return { columns: [], rows: [], values: [], changes, lastInsertRowid };\n}\n\n/** Export engine values to the public JS surface (SqlReal \u2192 number, SqlJsonText \u2192 string). */\nexport function exportSqlValue(value: SqlValue): QueryValue {\n if (isSqlReal(value)) return value.value;\n if (isSqlJsonText(value)) return value.value;\n return value;\n}\n\nexport function valuesToResult(\n columns: string[],\n values: SqlValue[][],\n changes = 0,\n lastInsertRowid: number | bigint = 0,\n options?: { named?: boolean; keepValues?: boolean },\n): ResultSet {\n const named = options?.named !== false;\n const keepValues = options?.keepValues !== false;\n return {\n columns,\n values: keepValues ? values.map((row) => row.map(exportSqlValue)) : [],\n rows: named\n ? values.map((row) => {\n const object: QueryRow = {};\n for (let index = 0; index < columns.length; index++) {\n object[columns[index]!] = exportSqlValue(row[index] ?? null);\n }\n return object;\n })\n : [],\n changes,\n lastInsertRowid,\n };\n}\n\nexport function resultValues(result: ResultSet): SqlValue[][] {\n if (result.values.length > 0 || result.rows.length === 0) {\n return result.values.map((row) => [...row]);\n }\n return result.rows.map((row) => result.columns.map((column) => row[column] ?? null));\n}\n", "import type { AttachStmt, DetachStmt } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { DatabaseState } from \"../storage/database-state.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { emptyResult, type ResultSet } from \"./result.ts\";\n\nexport function executeAttach(stmt: AttachStmt, env: ExecutionEnv): ResultSet {\n const filename = evalExpr(stmt.filename, env.createEvalContext());\n if (typeof filename !== \"string\") {\n throw new SqliteError(\"filename argument to ATTACH must be a string\", \"datatype_mismatch\");\n }\n const schema = stmt.schema.toLowerCase();\n if (schema === \"main\") {\n throw new SqliteError(\"database main is already in use\", \"other\");\n }\n if (schema === \"temp\") {\n throw new SqliteError(\"database temp is already in use\", \"other\");\n }\n if (env.state.attached.has(schema)) {\n throw new SqliteError(`database ${stmt.schema} is already in use`, \"other\");\n }\n env.state.attached.set(schema, { state: new DatabaseState(), filename });\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDetach(stmt: DetachStmt, env: ExecutionEnv): ResultSet {\n const schema = stmt.schema.toLowerCase();\n if (schema === \"main\") {\n throw new SqliteError(\"cannot detach database main\", \"other\");\n }\n if (schema === \"temp\") {\n throw new SqliteError(\"cannot detach database temp\", \"other\");\n }\n if (!env.state.attached.delete(schema)) {\n throw new SqliteError(`no such database: ${stmt.schema}`, \"other\");\n }\n return emptyResult(0, env.state.lastInsertRowid);\n}\n", "import { compareSql, type SqlValue } from \"../types/value.ts\";\n\nexport type PartitionRow = SqlValue[];\n\nfunction rowsEqual(left: PartitionRow, right: PartitionRow): boolean {\n if (left.length !== right.length) return false;\n return left.every((value, index) => {\n const other = right[index];\n return (value === null && other === null) || (other !== undefined && compareSql(value, other) === 0);\n });\n}\n\nexport function rowNumber(_partition: PartitionRow[], index: number): number {\n return index + 1;\n}\n\nexport function rank(partition: PartitionRow[], index: number, orderKeys: PartitionRow[] = partition): number {\n if (index <= 0) return 1;\n let firstPeer = index;\n while (firstPeer > 0 && rowsEqual(orderKeys[firstPeer]!, orderKeys[firstPeer - 1]!)) firstPeer--;\n return firstPeer + 1;\n}\n\nexport function denseRank(partition: PartitionRow[], index: number, orderKeys: PartitionRow[] = partition): number {\n if (index <= 0) return 1;\n let result = 1;\n for (let i = 1; i <= index; i++) {\n if (!rowsEqual(orderKeys[i]!, orderKeys[i - 1]!)) result++;\n }\n return result;\n}\n\nexport function lag(\n partition: PartitionRow[],\n index: number,\n valueIndex = 0,\n offset = 1,\n defaultValue: SqlValue = null,\n): SqlValue {\n const target = index - Math.max(0, Math.trunc(offset));\n return target < 0 ? defaultValue : (partition[target]?.[valueIndex] ?? null);\n}\n\nexport function lead(\n partition: PartitionRow[],\n index: number,\n valueIndex = 0,\n offset = 1,\n defaultValue: SqlValue = null,\n): SqlValue {\n const target = index + Math.max(0, Math.trunc(offset));\n return target >= partition.length ? defaultValue : (partition[target]?.[valueIndex] ?? null);\n}\n\nexport function firstValue(partition: PartitionRow[], valueIndex = 0, frameStart = 0): SqlValue {\n return partition[frameStart]?.[valueIndex] ?? null;\n}\n\nexport function lastValue(partition: PartitionRow[], valueIndex = 0, frameEnd = partition.length - 1): SqlValue {\n return partition[frameEnd]?.[valueIndex] ?? null;\n}\n\nexport function nthValue(partition: PartitionRow[], n: number, valueIndex = 0, frameStart = 0): SqlValue {\n const offset = Math.trunc(n);\n if (offset <= 0) return null;\n return partition[frameStart + offset - 1]?.[valueIndex] ?? null;\n}\n\nexport const windowFunctions = {\n row_number: rowNumber,\n rank,\n dense_rank: denseRank,\n lag,\n lead,\n first_value: firstValue,\n last_value: lastValue,\n nth_value: nthValue,\n ntile: () => 0,\n cume_dist: () => 0,\n percent_rank: () => 0,\n} as const;\n", "/**\n * Shared PRAGMA query engine used by statement-form `PRAGMA \u2026` and `pragma_*` TVFs.\n */\nimport type { Expr } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { aggregateFunctions } from \"../functions/aggregate.ts\";\nimport { dateTimeFunctions } from \"../functions/datetime.ts\";\nimport { ftsAuxFunctions, rtreeAuxFunctions } from \"../functions/extensions.ts\";\nimport { jsonAggregateFunctions, jsonScalarFunctions } from \"../functions/json.ts\";\nimport { mathFunctions } from \"../functions/math.ts\";\nimport { getScalarFunctions } from \"../functions/scalar.ts\";\nimport { windowFunctions } from \"../functions/window.ts\";\nimport type { IndexInfo } from \"../storage/database-state.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { isTruthySql, type SqlValue, toInteger } from \"../types/value.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\n\nexport interface PragmaQueryResult {\n columns: string[];\n rows: SqlValue[][];\n}\n\n/** Oracle-exposed pragma_* TVF base names (without the `pragma_` prefix). */\nexport const PRAGMA_TVF_NAMES = [\n \"analysis_limit\",\n \"application_id\",\n \"auto_vacuum\",\n \"automatic_index\",\n \"busy_timeout\",\n \"cache_size\",\n \"cache_spill\",\n \"cell_size_check\",\n \"checkpoint_fullfsync\",\n \"collation_list\",\n \"compile_options\",\n \"count_changes\",\n \"data_version\",\n \"database_list\",\n \"default_cache_size\",\n \"defer_foreign_keys\",\n \"empty_result_callbacks\",\n \"encoding\",\n \"foreign_key_check\",\n \"foreign_key_list\",\n \"foreign_keys\",\n \"freelist_count\",\n \"full_column_names\",\n \"fullfsync\",\n \"function_list\",\n \"hard_heap_limit\",\n \"ignore_check_constraints\",\n \"index_info\",\n \"index_list\",\n \"index_xinfo\",\n \"integrity_check\",\n \"journal_mode\",\n \"journal_size_limit\",\n \"legacy_alter_table\",\n \"locking_mode\",\n \"max_page_count\",\n \"module_list\",\n \"optimize\",\n \"page_count\",\n \"page_size\",\n \"pragma_list\",\n \"query_only\",\n \"quick_check\",\n \"read_uncommitted\",\n \"recursive_triggers\",\n \"reverse_unordered_selects\",\n \"schema_version\",\n \"secure_delete\",\n \"short_column_names\",\n \"soft_heap_limit\",\n \"synchronous\",\n \"table_info\",\n \"table_list\",\n \"table_xinfo\",\n \"temp_store\",\n \"threads\",\n \"trusted_schema\",\n \"user_version\",\n \"writable_schema\",\n] as const;\n\n/** Full pragma name list for `pragma_pragma_list` (includes names without TVFs). */\nexport const PRAGMA_LIST_NAMES = [\n \"activate_extensions\",\n ...PRAGMA_TVF_NAMES,\n \"case_sensitive_like\",\n \"hexkey\",\n \"hexrekey\",\n \"incremental_vacuum\",\n \"key\",\n \"lock_proxy_file\",\n \"mmap_size\",\n \"rekey\",\n \"shrink_memory\",\n \"temp_store_directory\",\n \"textkey\",\n \"textrekey\",\n \"wal_autocheckpoint\",\n \"wal_checkpoint\",\n].sort((a, b) => a.localeCompare(b));\n\nconst MEMORY_VTABLE_MODULES = [\n \"bytecode\",\n \"dbstat\",\n \"fts3\",\n \"fts3tokenize\",\n \"fts4\",\n \"fts4aux\",\n \"fts5\",\n \"fts5vocab\",\n \"json_each\",\n \"json_tree\",\n \"rtree\",\n \"rtree_i32\",\n \"tables_used\",\n];\n\nconst COMPILE_OPTIONS = [\n \"COMPILER=typescript\",\n \"ENABLE_FTS3\",\n \"ENABLE_FTS4\",\n \"ENABLE_FTS5\",\n \"ENABLE_JSON1\",\n \"ENABLE_RTREE\",\n \"THREADSAFE=0\",\n];\n\n/** Stable in-memory defaults matching bun:sqlite `:memory:` where applicable. */\nconst STORAGE_DEFAULTS: Record<string, { column: string; value: SqlValue }> = {\n analysis_limit: { column: \"analysis_limit\", value: 0 },\n application_id: { column: \"application_id\", value: 0 },\n auto_vacuum: { column: \"auto_vacuum\", value: 0 },\n automatic_index: { column: \"automatic_index\", value: 1 },\n busy_timeout: { column: \"timeout\", value: 0 },\n cache_size: { column: \"cache_size\", value: 2000 },\n cache_spill: { column: \"cache_spill\", value: 20000 },\n cell_size_check: { column: \"cell_size_check\", value: 0 },\n checkpoint_fullfsync: { column: \"checkpoint_fullfsync\", value: 1 },\n count_changes: { column: \"count_changes\", value: 0 },\n data_version: { column: \"data_version\", value: 1 },\n default_cache_size: { column: \"cache_size\", value: 2000 },\n defer_foreign_keys: { column: \"defer_foreign_keys\", value: 0 },\n empty_result_callbacks: { column: \"empty_result_callbacks\", value: 0 },\n encoding: { column: \"encoding\", value: \"UTF-8\" },\n freelist_count: { column: \"freelist_count\", value: 0 },\n full_column_names: { column: \"full_column_names\", value: 0 },\n fullfsync: { column: \"fullfsync\", value: 0 },\n hard_heap_limit: { column: \"hard_heap_limit\", value: 0 },\n ignore_check_constraints: { column: \"ignore_check_constraints\", value: 0 },\n journal_mode: { column: \"journal_mode\", value: \"memory\" },\n journal_size_limit: { column: \"journal_size_limit\", value: 32768 },\n legacy_alter_table: { column: \"legacy_alter_table\", value: 1 },\n locking_mode: { column: \"locking_mode\", value: \"normal\" },\n max_page_count: { column: \"max_page_count\", value: 1073741823 },\n page_size: { column: \"page_size\", value: 4096 },\n query_only: { column: \"query_only\", value: 0 },\n read_uncommitted: { column: \"read_uncommitted\", value: 0 },\n recursive_triggers: { column: \"recursive_triggers\", value: 0 },\n reverse_unordered_selects: { column: \"reverse_unordered_selects\", value: 0 },\n secure_delete: { column: \"secure_delete\", value: 2 },\n short_column_names: { column: \"short_column_names\", value: 1 },\n soft_heap_limit: { column: \"soft_heap_limit\", value: 0 },\n synchronous: { column: \"synchronous\", value: 2 },\n temp_store: { column: \"temp_store\", value: 0 },\n threads: { column: \"threads\", value: 0 },\n trusted_schema: { column: \"trusted_schema\", value: 1 },\n writable_schema: { column: \"writable_schema\", value: 0 },\n};\n\nexport function isPragmaTvfName(name: string): boolean {\n const lower = name.toLowerCase();\n if ((PRAGMA_TVF_NAMES as readonly string[]).includes(lower)) return true;\n if (lower.startsWith(\"pragma_\")) {\n return (PRAGMA_TVF_NAMES as readonly string[]).includes(lower.slice(\"pragma_\".length));\n }\n return false;\n}\n\nfunction normalizePragmaKey(name: string): string {\n const lower = name.toLowerCase();\n if ((PRAGMA_TVF_NAMES as readonly string[]).includes(lower)) return lower;\n if (lower.startsWith(\"pragma_\")) {\n const stripped = lower.slice(\"pragma_\".length);\n if ((PRAGMA_TVF_NAMES as readonly string[]).includes(stripped)) return stripped;\n return stripped;\n }\n return lower;\n}\n\n/**\n * Query a pragma by name with optional SQL values (TVF args or evaluated statement args).\n * Read-only \u2014 writers stay in {@link executePragma}.\n */\nexport function queryPragma(name: string, args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const key = normalizePragmaKey(name);\n\n switch (key) {\n case \"foreign_keys\":\n return single(\"foreign_keys\", env.state.foreignKeysEnabled ? 1 : 0);\n case \"user_version\":\n return single(\"user_version\", env.state.userVersion);\n case \"schema_version\":\n return single(\"schema_version\", env.state.schemaVersion);\n case \"table_info\":\n return pragmaTableInfo(args, env, false);\n case \"table_xinfo\":\n return pragmaTableInfo(args, env, true);\n case \"index_list\":\n return pragmaIndexList(args, env);\n case \"index_info\":\n return pragmaIndexInfo(args, env, false);\n case \"index_xinfo\":\n return pragmaIndexInfo(args, env, true);\n case \"foreign_key_list\":\n return pragmaForeignKeyList(args, env);\n case \"foreign_key_check\":\n return pragmaForeignKeyCheck(args, env);\n case \"database_list\":\n return pragmaDatabaseList(env);\n case \"table_list\":\n return pragmaTableList(env);\n case \"collation_list\":\n return {\n columns: [\"seq\", \"name\"],\n rows: [\n [0, \"RTRIM\"],\n [1, \"NOCASE\"],\n [2, \"BINARY\"],\n ],\n };\n case \"compile_options\":\n return { columns: [\"compile_options\"], rows: COMPILE_OPTIONS.map((opt) => [opt]) };\n case \"function_list\":\n return pragmaFunctionList();\n case \"module_list\":\n return pragmaModuleList();\n case \"pragma_list\":\n return { columns: [\"name\"], rows: PRAGMA_LIST_NAMES.map((n) => [n]) };\n case \"integrity_check\":\n case \"quick_check\":\n return single(key, \"ok\");\n case \"optimize\":\n return { columns: [\"optimize\"], rows: [] };\n case \"page_count\":\n return single(\"page_count\", estimatePageCount(env));\n default: {\n const storage = STORAGE_DEFAULTS[key];\n if (storage) return single(storage.column, storage.value);\n return { columns: [], rows: [] };\n }\n }\n}\n\nfunction single(column: string, value: SqlValue): PragmaQueryResult {\n return { columns: [column], rows: [[value]] };\n}\n\nfunction estimatePageCount(env: ExecutionEnv): number {\n const objects = env.state.tables.size + env.state.indexes.size + env.state.views.size + env.state.virtualTables.size;\n return objects === 0 ? 0 : Math.max(1, objects);\n}\n\nfunction pragmaTableInfo(args: readonly SqlValue[], env: ExecutionEnv, xinfo: boolean): PragmaQueryResult {\n const tableName = requireNameArg(args, \"table_info\");\n const table = env.state.tables.get(tableName.toLowerCase());\n if (!table) return { columns: xinfoColumns(xinfo), rows: [] };\n const rows: SqlValue[][] = table.columns.map((column, cid) => {\n const pkIndex = table.columns.filter((c) => c.primaryKey).findIndex((c) => c.name === column.name);\n const pk = column.primaryKey ? (pkIndex >= 0 ? pkIndex + 1 : 1) : 0;\n const dflt = column.defaultExpr ? defaultLiteral(column.defaultExpr) : null;\n const base: SqlValue[] = [cid, column.name, column.typeName ?? \"\", column.notNull ? 1 : 0, dflt, pk];\n if (xinfo) {\n let hidden = 0;\n if (column.generated && !column.generated.stored) hidden = 2;\n if (column.generated?.stored) hidden = 3;\n base.push(hidden);\n }\n return base;\n });\n return { columns: xinfoColumns(xinfo), rows };\n}\n\nfunction xinfoColumns(xinfo: boolean): string[] {\n return xinfo\n ? [\"cid\", \"name\", \"type\", \"notnull\", \"dflt_value\", \"pk\", \"hidden\"]\n : [\"cid\", \"name\", \"type\", \"notnull\", \"dflt_value\", \"pk\"];\n}\n\nfunction defaultLiteral(expr: Expr): SqlValue {\n if (expr.type === \"literal\")\n return typeof expr.value === \"string\" ? `'${expr.value.replace(/'/g, \"''\")}'` : expr.value;\n if (expr.type === \"null\") return \"NULL\";\n return null;\n}\n\nfunction pragmaIndexList(args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const tableName = requireNameArg(args, \"index_list\");\n const table = env.state.tables.get(tableName.toLowerCase());\n if (!table) return { columns: [\"seq\", \"name\", \"unique\", \"origin\", \"partial\"], rows: [] };\n const rows: SqlValue[][] = [];\n let seq = 0;\n for (const name of table.indexes) {\n const index = env.state.indexes.get(name.toLowerCase());\n if (!index) continue;\n rows.push([seq++, index.name, index.unique ? 1 : 0, indexOrigin(index), index.where ? 1 : 0]);\n }\n return { columns: [\"seq\", \"name\", \"unique\", \"origin\", \"partial\"], rows };\n}\n\nfunction indexOrigin(index: IndexInfo): string {\n if (index.originalSql) return \"c\";\n if (index.name.toLowerCase().startsWith(\"sqlite_autoindex_\") && index.unique) return \"u\";\n return \"c\";\n}\n\nfunction pragmaIndexInfo(args: readonly SqlValue[], env: ExecutionEnv, xinfo: boolean): PragmaQueryResult {\n const indexName = requireNameArg(args, \"index_info\");\n const index = env.state.indexes.get(indexName.toLowerCase());\n const columns = xinfo ? [\"seqno\", \"cid\", \"name\", \"desc\", \"coll\", \"key\"] : [\"seqno\", \"cid\", \"name\"];\n if (!index) return { columns, rows: [] };\n const table = env.state.tables.get(index.tableName.toLowerCase());\n const rows: SqlValue[][] = index.columns.map((column, seqno) => {\n const cid = table?.columns.findIndex((c) => c.name.toLowerCase() === column.name.toLowerCase()) ?? -1;\n const base: SqlValue[] = [seqno, cid, column.name];\n if (xinfo) {\n base.push(column.order === \"DESC\" ? 1 : 0, (column.collate ?? \"BINARY\").toUpperCase(), 1);\n }\n return base;\n });\n if (xinfo) {\n // Trailing rowid key column (SQLite index_xinfo)\n rows.push([index.columns.length, -1, null, 0, \"BINARY\", 0]);\n }\n return { columns, rows };\n}\n\nfunction pragmaForeignKeyList(args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const tableName = requireNameArg(args, \"foreign_key_list\");\n const table = env.state.tables.get(tableName.toLowerCase());\n const columns = [\"id\", \"seq\", \"table\", \"from\", \"to\", \"on_update\", \"on_delete\", \"match\"];\n if (!table) return { columns, rows: [] };\n const rows: SqlValue[][] = [];\n let id = 0;\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\") continue;\n const refColumns =\n constraint.refColumns ??\n env.state.tables\n .get(constraint.refTable.toLowerCase())\n ?.columns.filter((c) => c.primaryKey)\n .map((c) => c.name) ??\n [];\n constraint.columns.forEach((column, seq) => {\n rows.push([\n id,\n seq,\n constraint.refTable,\n column,\n refColumns[seq] ?? null,\n constraint.onUpdate ?? \"NO ACTION\",\n constraint.onDelete ?? \"NO ACTION\",\n \"NONE\",\n ]);\n });\n id++;\n }\n return { columns, rows };\n}\n\nfunction pragmaForeignKeyCheck(args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const columns = [\"table\", \"rowid\", \"parent\", \"fkid\"];\n const filter = args[0] != null && args[0] !== null ? String(args[0]).toLowerCase() : null;\n const rows: SqlValue[][] = [];\n for (const table of env.state.tables.values()) {\n if (filter && table.name.toLowerCase() !== filter) continue;\n let fkid = 0;\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\") continue;\n const parent = env.state.tables.get(constraint.refTable.toLowerCase());\n const refColumns = constraint.refColumns ?? parent?.columns.filter((c) => c.primaryKey).map((c) => c.name) ?? [];\n for (const row of table.scan()) {\n let allNull = true;\n const childValues: SqlValue[] = [];\n for (const col of constraint.columns) {\n const value = row.values.get(col.toLowerCase()) ?? null;\n childValues.push(value);\n if (value !== null) allNull = false;\n }\n if (allNull) continue;\n if (!parent || !parentHasMatch(parent, refColumns, childValues)) {\n rows.push([table.name, row.rowid, constraint.refTable, fkid]);\n }\n }\n fkid++;\n }\n }\n return { columns, rows };\n}\n\nfunction parentHasMatch(parent: Table, refColumns: string[], childValues: SqlValue[]): boolean {\n if (refColumns.length === 0) return false;\n for (const row of parent.scan()) {\n let ok = true;\n for (let i = 0; i < refColumns.length; i++) {\n const parentVal = row.values.get(refColumns[i]!.toLowerCase()) ?? null;\n if (!sqlValuesEqual(parentVal, childValues[i] ?? null)) {\n ok = false;\n break;\n }\n }\n if (ok) return true;\n }\n return false;\n}\n\nfunction sqlValuesEqual(a: SqlValue, b: SqlValue): boolean {\n if (a === null || b === null) return a === b;\n if (typeof a === \"number\" && typeof b === \"number\") return a === b;\n if (typeof a === \"bigint\" || typeof b === \"bigint\") {\n return BigInt(a as number | bigint) === BigInt(b as number | bigint);\n }\n if (a instanceof Uint8Array || b instanceof Uint8Array) return false;\n return String(a) === String(b);\n}\n\nfunction pragmaDatabaseList(env: ExecutionEnv): PragmaQueryResult {\n const rows: SqlValue[][] = [[0, \"main\", \"\"]];\n let seq = 2;\n for (const [name, attached] of env.state.attached) {\n const file = attached.filename === \":memory:\" ? \"\" : attached.filename;\n rows.push([seq++, name, file]);\n }\n return { columns: [\"seq\", \"name\", \"file\"], rows };\n}\n\nfunction pragmaTableList(env: ExecutionEnv): PragmaQueryResult {\n const columns = [\"schema\", \"name\", \"type\", \"ncol\", \"wr\", \"strict\"];\n const rows: SqlValue[][] = [];\n for (const table of env.state.tables.values()) {\n rows.push([\"main\", table.name, \"table\", table.columns.length, table.withoutRowid ? 1 : 0, table.strict ? 1 : 0]);\n }\n for (const view of env.state.views.values()) {\n const ncol = view.columns?.length ?? 0;\n rows.push([\"main\", view.name, \"view\", ncol, 0, 0]);\n }\n for (const vt of env.state.virtualTables.values()) {\n rows.push([\"main\", vt.name, \"virtual\", vt.columns.length, 0, 0]);\n }\n rows.push([\"main\", \"sqlite_schema\", \"table\", 5, 0, 0]);\n rows.push([\"temp\", \"sqlite_temp_schema\", \"table\", 5, 0, 0]);\n for (const [schema] of env.state.attached) {\n rows.push([schema, \"sqlite_schema\", \"table\", 5, 0, 0]);\n }\n return { columns, rows };\n}\n\nfunction pragmaFunctionList(): PragmaQueryResult {\n const columns = [\"name\", \"builtin\", \"type\", \"enc\", \"narg\", \"flags\"];\n const rows: SqlValue[][] = [];\n const add = (name: string, type: string, narg: number, flags: number): void => {\n rows.push([name, 1, type, \"utf8\", narg, flags]);\n };\n for (const name of Object.keys(getScalarFunctions())) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(dateTimeFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(jsonScalarFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(mathFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(ftsAuxFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(rtreeAuxFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(aggregateFunctions)) {\n add(name, \"w\", name === \"count\" ? 0 : 1, 2097152);\n if (name === \"count\") add(name, \"w\", 1, 2097152);\n }\n for (const name of Object.keys(jsonAggregateFunctions)) add(name, \"w\", -1, 2097152);\n for (const name of Object.keys(windowFunctions)) add(name, \"w\", -1, 2097152);\n for (const name of [\"generate_series\", \"json_each\", \"json_tree\"]) {\n add(name, \"s\", -1, 2099200);\n }\n rows.sort((a, b) => String(a[0]).localeCompare(String(b[0])) || Number(a[4]) - Number(b[4]));\n return { columns, rows };\n}\n\nfunction pragmaModuleList(): PragmaQueryResult {\n const names = new Set<string>([\n ...MEMORY_VTABLE_MODULES,\n ...PRAGMA_TVF_NAMES.map((n) => `pragma_${n}`),\n \"generate_series\",\n \"json_each\",\n \"json_tree\",\n ]);\n return {\n columns: [\"name\"],\n rows: [...names].sort((a, b) => a.localeCompare(b)).map((name) => [name]),\n };\n}\n\nfunction requireNameArg(args: readonly SqlValue[], pragma: string): string {\n if (args.length === 0 || args[0] == null) {\n throw new SqliteError(`missing pragma argument for ${pragma}`, \"misuse\");\n }\n const value = args[0];\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n throw new SqliteError(`invalid pragma argument for ${pragma}`, \"misuse\");\n}\n\n/** Evaluate a statement-form pragma argument expression to a SQL value list. */\nexport function evalPragmaArgs(expr: Expr | null, env: ExecutionEnv): SqlValue[] {\n if (expr === null) return [];\n if (expr.type === \"column\" && expr.table === null) return [expr.name];\n if (expr.type === \"literal\") return [expr.value as SqlValue];\n return [evalExpr(expr, env.createEvalContext())];\n}\n\nexport function evalPragmaSetValue(expr: Expr, env: ExecutionEnv): SqlValue {\n if (expr.type === \"column\" && expr.table === null) {\n const keyword = expr.name.toLowerCase();\n if (keyword === \"on\" || keyword === \"true\" || keyword === \"yes\") return 1;\n if (keyword === \"off\" || keyword === \"false\" || keyword === \"no\") return 0;\n return expr.name;\n }\n return evalExpr(expr, env.createEvalContext());\n}\n\nexport function coercePragmaInt(value: SqlValue): number {\n if (typeof value === \"number\") return Math.trunc(value);\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"string\") {\n const n = Number.parseInt(value, 10);\n return Number.isFinite(n) ? n : 0;\n }\n const asInt = toInteger(value);\n return asInt === null ? 0 : typeof asInt === \"bigint\" ? Number(asInt) : asInt;\n}\n\nexport function coercePragmaTruthy(value: SqlValue): boolean {\n return isTruthySql(value) === true;\n}\n", "import type { ExecutionEnv, ScopeRow } from \"../executor/env.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport interface TableValuedResult {\n columns: string[];\n rows: ScopeRow[];\n}\n\nexport type TableValuedFn = (args: SqlValue[], alias: string | null, env: ExecutionEnv) => TableValuedResult;\n\nconst registry = new Map<string, TableValuedFn>();\n\nexport function registerTableValuedFunction(name: string, fn: TableValuedFn): void {\n registry.set(name.toLowerCase(), fn);\n}\n\nexport function getTableValuedFunction(name: string): TableValuedFn | undefined {\n return registry.get(name.toLowerCase());\n}\n\nexport function listRegisteredTableValuedFunctions(): string[] {\n return [...registry.keys()].sort();\n}\n\nexport function hasRegisteredTableValuedFunction(name: string): boolean {\n return registry.has(name.toLowerCase());\n}\n", "/**\n * Register all oracle-exposed `pragma_*` eponymous table-valued functions.\n * Imported for side effects from table-valued / select.\n */\nimport { isPragmaTvfName, PRAGMA_TVF_NAMES, queryPragma } from \"../executor/pragma-engine.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport { registerTableValuedFunction, type TableValuedResult } from \"./table-valued-registry.ts\";\n\nfunction toTvfResult(\n alias: string | null,\n defaultName: string,\n columns: string[],\n rows: SqlValue[][],\n): TableValuedResult {\n const table = alias ?? defaultName;\n return {\n columns,\n rows: rows.map((row) => ({\n cells: columns.map((name, index) => ({\n table,\n name,\n value: row[index] ?? null,\n })),\n })),\n };\n}\n\nlet registered = false;\n\n/** Idempotent registration of every oracle `pragma_*` TVF. */\nexport function ensurePragmaTvfsRegistered(): void {\n if (registered) return;\n registered = true;\n for (const baseName of PRAGMA_TVF_NAMES) {\n const tvfName = `pragma_${baseName}`;\n registerTableValuedFunction(tvfName, (args, alias, env) => {\n const result = queryPragma(baseName, args, env);\n return toTvfResult(alias, tvfName, result.columns, result.rows);\n });\n }\n}\n\nexport { isPragmaTvfName };\n", "import type { Expr } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"../executor/env.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { jsonEachRows, jsonTreeRows } from \"../json/tvf.ts\";\nimport { toInteger } from \"../types/value.ts\";\nimport { ensurePragmaTvfsRegistered } from \"./pragma-tvf.ts\";\nimport {\n getTableValuedFunction,\n hasRegisteredTableValuedFunction,\n listRegisteredTableValuedFunctions,\n registerTableValuedFunction,\n type TableValuedResult,\n} from \"./table-valued-registry.ts\";\n\nexport type { TableValuedResult };\nexport { registerTableValuedFunction };\n\nconst JSON_TVF_COLUMNS = [\"key\", \"value\", \"type\", \"atom\", \"id\", \"parent\", \"fullkey\", \"path\"] as const;\n\nfunction jsonTvfResult(\n alias: string | null,\n defaultName: string,\n rows: ReturnType<typeof jsonEachRows>,\n): TableValuedResult {\n const table = alias ?? defaultName;\n return {\n columns: [...JSON_TVF_COLUMNS],\n rows: rows.map((row) => ({\n cells: JSON_TVF_COLUMNS.map((name) => ({\n table,\n name,\n value: row[name],\n })),\n })),\n };\n}\n\nregisterTableValuedFunction(\"generate_series\", (args, alias) => {\n if (args.length < 2 || args.length > 3) {\n throw new SqliteError(\"wrong number of arguments to function generate_series()\", \"misuse\");\n }\n const start = toInteger(args[0] ?? null);\n const stop = toInteger(args[1] ?? null);\n const step = args.length === 3 ? toInteger(args[2] ?? null) : 1n;\n if (start === null || stop === null || step === null) {\n throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\");\n }\n if (step === 0n || step === 0) throw new SqliteError(\"step must not be zero\", \"misuse\");\n const startN = typeof start === \"bigint\" ? start : BigInt(start);\n const stopN = typeof stop === \"bigint\" ? stop : BigInt(stop);\n const stepN = typeof step === \"bigint\" ? step : BigInt(step);\n const table = alias ?? \"generate_series\";\n const rows: ScopeRow[] = [];\n if (stepN > 0n) {\n for (let value = startN; value <= stopN; value += stepN) {\n rows.push({\n cells: [{ table, name: \"value\", value: safeInt(value) }],\n });\n }\n } else {\n for (let value = startN; value >= stopN; value += stepN) {\n rows.push({\n cells: [{ table, name: \"value\", value: safeInt(value) }],\n });\n }\n }\n return { columns: [\"value\"], rows };\n});\n\nregisterTableValuedFunction(\"json_each\", (args, alias) => {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_each()\", \"misuse\");\n }\n return jsonTvfResult(alias, \"json_each\", jsonEachRows(args[0]!, args[1]));\n});\n\nregisterTableValuedFunction(\"json_tree\", (args, alias) => {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_tree()\", \"misuse\");\n }\n return jsonTvfResult(alias, \"json_tree\", jsonTreeRows(args[0]!, args[1]));\n});\n\nfunction safeInt(value: bigint): number | bigint {\n return value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER) ? Number(value) : value;\n}\n\nexport function evaluateTableFunction(\n name: string,\n args: Expr[],\n alias: string | null,\n env: ExecutionEnv,\n scope?: ScopeRow | null,\n parent?: import(\"../expressions/context.ts\").EvalContext,\n): TableValuedResult {\n ensurePragmaTvfsRegistered();\n const fn = getTableValuedFunction(name);\n if (!fn) throw new SqliteError(`no such table-valued function: ${name}`, \"no_such_table\");\n const values = args.map((arg) => evalExpr(arg, env.createEvalContext(scope ?? null, parent)));\n return fn(values, alias, env);\n}\n\nexport function listTableValuedFunctions(): string[] {\n ensurePragmaTvfsRegistered();\n return listRegisteredTableValuedFunctions();\n}\n\nexport function hasTableValuedFunction(name: string): boolean {\n ensurePragmaTvfsRegistered();\n return hasRegisteredTableValuedFunction(name);\n}\n", "import type { DatabaseState } from \"../storage/database-state.ts\";\nimport { makeColumnInfo, Table } from \"../storage/table.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport type SchemaObjectType = \"table\" | \"index\" | \"view\" | \"trigger\";\n\nexport interface SchemaCatalogRow {\n type: SchemaObjectType;\n name: string;\n tbl_name: string;\n rootpage: number;\n sql: string | null;\n}\n\nexport function schemaCatalogRows(state: DatabaseState): SchemaCatalogRow[] {\n const tables = [...state.tables.values()].sort((a, b) => compareNames(a.name, b.name));\n const indexes = [...state.indexes.values()].sort((a, b) => compareNames(a.name, b.name));\n const views = [...state.views.values()].sort((a, b) => compareNames(a.name, b.name));\n const triggers = [...state.triggers.values()].sort((a, b) => compareNames(a.name, b.name));\n\n const rows: SchemaCatalogRow[] = [];\n let rootpage = 2;\n\n for (const table of tables) {\n rows.push({\n type: \"table\",\n name: table.name,\n tbl_name: table.name,\n rootpage: rootpage++,\n sql: table.originalSql,\n });\n }\n for (const index of indexes) {\n rows.push({\n type: \"index\",\n name: index.name,\n tbl_name: index.tableName,\n rootpage: rootpage++,\n sql: index.originalSql,\n });\n }\n for (const view of views) {\n rows.push({\n type: \"view\",\n name: view.name,\n tbl_name: view.name,\n rootpage: 0,\n sql: view.originalSql,\n });\n }\n for (const trigger of triggers) {\n rows.push({\n type: \"trigger\",\n name: trigger.name,\n tbl_name: trigger.tableName,\n rootpage: 0,\n sql: trigger.originalSql,\n });\n }\n return rows;\n}\n\n/** Locale-independent UTF-16 code-unit order for stable catalog/snapshot encoding. */\nfunction compareNames(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nexport function buildSchemaCatalog(state: DatabaseState, name = \"sqlite_schema\"): Table {\n const catalog = new Table(name, [\n makeColumnInfo(\"type\", \"TEXT\"),\n makeColumnInfo(\"name\", \"TEXT\"),\n makeColumnInfo(\"tbl_name\", \"TEXT\"),\n makeColumnInfo(\"rootpage\", \"INTEGER\"),\n makeColumnInfo(\"sql\", \"TEXT\"),\n ]);\n\n for (const row of schemaCatalogRows(state)) {\n catalog.insert({\n values: {\n type: row.type,\n name: row.name,\n tbl_name: row.tbl_name,\n rootpage: row.rootpage,\n sql: row.sql,\n } satisfies Record<string, SqlValue>,\n });\n }\n return catalog;\n}\n\nexport function buildSqliteSchema(state: DatabaseState): Table {\n return buildSchemaCatalog(state, \"sqlite_schema\");\n}\n\nexport function buildSqliteMaster(state: DatabaseState): Table {\n return buildSchemaCatalog(state, \"sqlite_master\");\n}\n", "import type { Expr } from \"../ast/nodes.ts\";\n\n/** Structural equality for matching WHERE expressions to index expressions. */\nexport function exprEquals(left: Expr, right: Expr): boolean {\n if (left.type !== right.type) return false;\n switch (left.type) {\n case \"null\":\n return true;\n case \"literal\":\n return right.type === \"literal\" && valuesEqual(left.value, right.value);\n case \"column\":\n return (\n right.type === \"column\" &&\n (left.table ?? \"\").toLowerCase() === (right.table ?? \"\").toLowerCase() &&\n left.name.toLowerCase() === right.name.toLowerCase()\n );\n case \"unary\":\n return right.type === \"unary\" && left.op === right.op && exprEquals(left.expr, right.expr);\n case \"binary\":\n return (\n right.type === \"binary\" &&\n left.op === right.op &&\n exprEquals(left.left, right.left) &&\n exprEquals(left.right, right.right)\n );\n case \"function\":\n return (\n right.type === \"function\" &&\n left.name.toLowerCase() === right.name.toLowerCase() &&\n left.distinct === right.distinct &&\n argsEqual(left.args, right.args)\n );\n case \"collate\":\n return (\n right.type === \"collate\" &&\n left.collation.toLowerCase() === right.collation.toLowerCase() &&\n exprEquals(left.expr, right.expr)\n );\n case \"cast\":\n return (\n right.type === \"cast\" &&\n (left.typeName ?? \"\").toUpperCase() === (right.typeName ?? \"\").toUpperCase() &&\n exprEquals(left.expr, right.expr)\n );\n default:\n return JSON.stringify(left) === JSON.stringify(right);\n }\n}\n\nfunction argsEqual(left: Expr[] | \"*\", right: Expr[] | \"*\"): boolean {\n if (left === \"*\" || right === \"*\") return left === right;\n if (left.length !== right.length) return false;\n return left.every((expr, index) => exprEquals(expr, right[index]!));\n}\n\nfunction valuesEqual(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (left instanceof Uint8Array && right instanceof Uint8Array) {\n if (left.length !== right.length) return false;\n return left.every((byte, index) => byte === right[index]);\n }\n return false;\n}\n", "import type { Expr, FromItem, TableRef } from \"../ast/nodes.ts\";\nimport type { ExecutionEnv } from \"../executor/env.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { exprEquals } from \"../expressions/equals.ts\";\nimport type { IndexInfo } from \"../storage/database-state.ts\";\nimport type { Row, Rowid } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport interface ConstEquality {\n table: string | null;\n column: string;\n valueExpr: Expr;\n}\n\nexport function conjunctions(expr: Expr): Expr[] {\n if (expr.type === \"binary\" && expr.op === \"AND\") {\n return [...conjunctions(expr.left), ...conjunctions(expr.right)];\n }\n return [expr];\n}\n\nfunction isRowIndependentExpr(expr: Expr): boolean {\n return expr.type !== \"column\";\n}\n\nexport function equalityAgainstConst(expr: Expr): ConstEquality | null {\n if (expr.type !== \"binary\" || (expr.op !== \"=\" && expr.op !== \"==\")) return null;\n if (expr.left.type === \"column\" && isRowIndependentExpr(expr.right)) {\n return { table: expr.left.table, column: expr.left.name, valueExpr: expr.right };\n }\n if (expr.right.type === \"column\" && isRowIndependentExpr(expr.left)) {\n return { table: expr.right.table, column: expr.right.name, valueExpr: expr.left };\n }\n return null;\n}\n\nexport function equalityAgainstExpr(expr: Expr): { expr: Expr; valueExpr: Expr } | null {\n if (expr.type !== \"binary\" || (expr.op !== \"=\" && expr.op !== \"==\")) return null;\n if (expr.left.type !== \"column\" && isRowIndependentExpr(expr.right)) {\n return { expr: expr.left, valueExpr: expr.right };\n }\n if (expr.right.type !== \"column\" && isRowIndependentExpr(expr.left)) {\n return { expr: expr.right, valueExpr: expr.left };\n }\n return null;\n}\n\nexport function whereFullyCovered(where: Expr, coveredColumns: Set<string>, alias: string, tableName: string): boolean {\n for (const part of conjunctions(where)) {\n const eq = equalityAgainstConst(part);\n if (!eq) return false;\n if (!matchesTable(eq.table, alias, tableName)) return false;\n const col = eq.column.toLowerCase();\n if (!coveredColumns.has(col) && !isRowidName(eq.column)) return false;\n }\n return true;\n}\n\nfunction matchesTable(table: string | null, alias: string, tableName: string): boolean {\n if (table === null) return true;\n const key = table.toLowerCase();\n return key === alias.toLowerCase() || key === tableName.toLowerCase();\n}\n\nfunction isRowidName(name: string): boolean {\n const key = name.toLowerCase();\n return key === \"rowid\" || key === \"_rowid_\" || key === \"oid\";\n}\n\nexport interface TableRowLookup {\n table: Table;\n alias: string;\n rows: Row[];\n /** Lowercased columns whose equality predicates were applied by the access path. */\n coveredColumns: Set<string>;\n}\n\n/** Look up rows for a simple `FROM table WHERE ...` using PK, a covering equality index, or an automatic hash. */\nexport function tryIndexedTableRows(from: FromItem, where: Expr, env: ExecutionEnv): TableRowLookup | null {\n if (from.type !== \"table\") return null;\n return lookupTableRows(from, where, env);\n}\n\nexport function lookupTableRows(from: TableRef, where: Expr, env: ExecutionEnv): TableRowLookup | null {\n const alias = from.alias ?? from.name;\n const qualified = from.schema ? `${from.schema}.${from.name}` : from.name;\n const db = env.state.databaseForSchema(from.schema, qualified);\n if (from.name.toLowerCase() === \"sqlite_schema\" || from.name.toLowerCase() === \"sqlite_master\") return null;\n if (db.virtualTables.has(from.name.toLowerCase()) || db.views.has(from.name.toLowerCase())) return null;\n if (env.ctes.has(from.name.toLowerCase())) return null;\n\n let table: Table;\n try {\n table = db.getTable(from.name);\n } catch {\n return null;\n }\n\n const parts = conjunctions(where);\n const equalities = parts\n .map(equalityAgainstConst)\n .filter((item): item is ConstEquality => item !== null)\n .filter((item) => matchesTable(item.table, alias, table.name));\n\n const evalConst = (expr: Expr): SqlValue | undefined => {\n try {\n return evalExpr(expr, env.createEvalContext(null));\n } catch {\n return undefined;\n }\n };\n\n const resolved: { table: string | null; column: string; value: SqlValue }[] = [];\n for (const eq of equalities) {\n const value = evalConst(eq.valueExpr);\n if (value === undefined) continue;\n resolved.push({ table: eq.table, column: eq.column, value });\n }\n\n const pk = table.integerPkColumn();\n for (const eq of resolved) {\n const col = eq.column.toLowerCase();\n if (isRowidName(eq.column) || (pk && col === pk.name.toLowerCase())) {\n const row = table.getByKey(eq.value);\n const coveredColumns = new Set<string>([col, \"rowid\", \"_rowid_\", \"oid\"]);\n if (pk) coveredColumns.add(pk.nameLower ?? pk.name.toLowerCase());\n if (row) return { table, alias, rows: [row], coveredColumns };\n if (eq.value === null || typeof eq.value === \"number\" || typeof eq.value === \"bigint\") {\n return { table, alias, rows: [], coveredColumns };\n }\n return null;\n }\n }\n\n const byColumn = new Map<string, SqlValue>();\n for (const eq of resolved) byColumn.set(eq.column.toLowerCase(), eq.value);\n\n let best: { rowids: readonly Rowid[]; columns: string[] } | null = null;\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index) continue;\n if (index.where && !parts.some((part) => exprEquals(part, index.where!))) continue;\n\n if (index.columns.some((column) => column.expr)) {\n const prefix: SqlValue[] = [];\n for (const column of index.columns) {\n if (!column.expr) {\n const value = byColumn.get(column.name.toLowerCase());\n if (value === undefined) break;\n prefix.push(normalizeForCollation(value, column.collate ?? \"BINARY\"));\n continue;\n }\n const match = parts.map(equalityAgainstExpr).find((item) => item && exprEquals(item.expr, column.expr!));\n if (!match) break;\n const value = evalConst(match.valueExpr);\n if (value === undefined) break;\n prefix.push(normalizeForCollation(value, column.collate ?? \"BINARY\"));\n }\n if (prefix.length === 0) continue;\n const rowids =\n prefix.length === index.columns.length ? index.store.lookup(prefix) : index.store.lookupPrefix(prefix);\n best = { rowids, columns: index.columns.map((column) => column.name.toLowerCase()) };\n if (index.unique || rowids.length <= 1) break;\n continue;\n }\n\n const prefix: SqlValue[] = [];\n for (const column of index.columns) {\n const value = byColumn.get(column.name.toLowerCase());\n if (value === undefined) break;\n prefix.push(normalizeForCollation(value, column.collate ?? \"BINARY\"));\n }\n if (prefix.length === 0) continue;\n const rowids =\n prefix.length === index.columns.length ? index.store.lookup(prefix) : index.store.lookupPrefix(prefix);\n best = { rowids, columns: index.columns.slice(0, prefix.length).map((column) => column.name.toLowerCase()) };\n if (index.unique && prefix.length === index.columns.length) break;\n if (rowids.length <= 1) break;\n }\n\n if (best) {\n const rows: Row[] = [];\n for (const rowid of best.rowids) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n }\n rows.sort((a, b) => compareRowids(a.rowid, b.rowid));\n return { table, alias, rows, coveredColumns: new Set(best.columns) };\n }\n\n for (const eq of resolved) {\n const col = eq.column.toLowerCase();\n if (isRowidName(eq.column)) continue;\n const hashed = table.lookupEquality(col, eq.value);\n if (!hashed) continue;\n hashed.sort((a, b) => compareRowids(a.rowid, b.rowid));\n return { table, alias, rows: hashed, coveredColumns: new Set([col]) };\n }\n\n const range = rangeAgainstConst(where) ?? rangeFromBetween(where);\n if (range && matchesTable(range.table, alias, table.name)) {\n const value = evalConst(range.valueExpr);\n const value2 = range.valueExpr2 ? evalConst(range.valueExpr2) : undefined;\n if (value !== undefined) {\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index || index.where || index.columns.length !== 1) continue;\n if (index.columns[0]!.expr) continue;\n if (index.columns[0]!.name.toLowerCase() !== range.column.toLowerCase()) continue;\n const bound = normalizeForCollation(value, index.columns[0]!.collate ?? \"BINARY\");\n const bound2 =\n value2 !== undefined ? normalizeForCollation(value2, index.columns[0]!.collate ?? \"BINARY\") : undefined;\n const rowids = index.store.rangeLookup(range.op, bound, bound2);\n const rows: Row[] = [];\n for (const rowid of rowids) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n }\n return { table, alias, rows, coveredColumns: new Set([range.column.toLowerCase()]) };\n }\n }\n }\n\n return null;\n}\n\nfunction rangeAgainstConst(\n expr: Expr,\n): { table: string | null; column: string; op: \">\" | \">=\" | \"<\" | \"<=\"; valueExpr: Expr; valueExpr2?: Expr } | null {\n if (expr.type !== \"binary\") return null;\n const op = expr.op;\n if (op !== \">\" && op !== \">=\" && op !== \"<\" && op !== \"<=\") return null;\n if (expr.left.type === \"column\" && isRowIndependentExpr(expr.right)) {\n return { table: expr.left.table, column: expr.left.name, op, valueExpr: expr.right };\n }\n if (expr.right.type === \"column\" && isRowIndependentExpr(expr.left)) {\n const flipped = op === \">\" ? \"<\" : op === \">=\" ? \"<=\" : op === \"<\" ? \">\" : \">=\";\n return { table: expr.right.table, column: expr.right.name, op: flipped, valueExpr: expr.left };\n }\n return null;\n}\n\nfunction rangeFromBetween(\n expr: Expr,\n): { table: string | null; column: string; op: \"between\"; valueExpr: Expr; valueExpr2: Expr } | null {\n if (expr.type !== \"between\" || expr.not || expr.expr.type !== \"column\") return null;\n return {\n table: expr.expr.table,\n column: expr.expr.name,\n op: \"between\",\n valueExpr: expr.lower,\n valueExpr2: expr.upper,\n };\n}\n\nexport function tryIndexedOrder(\n from: FromItem,\n order: { expr: Expr; dir: \"ASC\" | \"DESC\" },\n env: ExecutionEnv,\n limit?: number,\n): TableRowLookup | null {\n if (from.type !== \"table\" || order.expr.type !== \"column\") return null;\n const alias = from.alias ?? from.name;\n const db = env.state.databaseForSchema(from.schema, from.schema ? `${from.schema}.${from.name}` : from.name);\n let table: Table;\n try {\n table = db.getTable(from.name);\n } catch {\n return null;\n }\n const col = order.expr.name.toLowerCase();\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index || index.where || index.columns.length !== 1 || index.columns[0]!.expr) continue;\n if (index.columns[0]!.name.toLowerCase() !== col) continue;\n const desc = order.dir === \"DESC\";\n const rows: Row[] = [];\n for (const rowid of index.store.orderedRowids(desc)) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n if (limit !== undefined && rows.length >= limit) break;\n }\n return { table, alias, rows, coveredColumns: new Set([col]) };\n }\n return null;\n}\n\nfunction compareRowids(left: Rowid, right: Rowid): number {\n const a = typeof left === \"bigint\" ? left : BigInt(left);\n const b = typeof right === \"bigint\" ? right : BigInt(right);\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nexport interface JoinProbe {\n table: Table;\n alias: string;\n /** When true, ON is fully applied by the probe (skip re-eval). */\n covering: boolean;\n lookup: (leftCellsValue: (table: string | null, name: string) => SqlValue) => Row[];\n}\n\n/** Equality join keys extracted from ON (column = column), for hash join when no index probe. */\nexport interface JoinEqualityKeys {\n /** Right-side column names in join-key order. */\n rightColumns: string[];\n /** Corresponding left-side (probe) column references. */\n leftKeys: { table: string | null; column: string }[];\n}\n\nexport function tryJoinEqualityKeys(right: FromItem, on: Expr | null, env?: ExecutionEnv): JoinEqualityKeys | null {\n if (!on || right.type !== \"table\") return null;\n if (env) {\n const db = env.state.databaseForSchema(right.schema, right.schema ? `${right.schema}.${right.name}` : right.name);\n if (db.virtualTables.has(right.name.toLowerCase()) || db.views.has(right.name.toLowerCase())) return null;\n if (env.ctes.has(right.name.toLowerCase())) return null;\n }\n const alias = right.alias ?? right.name;\n const pairs: { rightColumn: string; leftTable: string | null; leftColumn: string }[] = [];\n for (const part of conjunctions(on)) {\n if (part.type !== \"binary\" || (part.op !== \"=\" && part.op !== \"==\")) continue;\n if (part.left.type !== \"column\" || part.right.type !== \"column\") continue;\n const leftOnRight = columnOnTable(part.left, alias, right.name);\n const rightOnRight = columnOnTable(part.right, alias, right.name);\n if (leftOnRight && !rightOnRight) {\n pairs.push({ rightColumn: part.left.name, leftTable: part.right.table, leftColumn: part.right.name });\n } else if (rightOnRight && !leftOnRight) {\n pairs.push({ rightColumn: part.right.name, leftTable: part.left.table, leftColumn: part.left.name });\n }\n }\n if (pairs.length === 0) return null;\n // Require the entire ON to be only equality conjunctions (no leftover predicates).\n const parts = conjunctions(on);\n if (parts.length !== pairs.length) return null;\n for (const part of parts) {\n if (part.type !== \"binary\" || (part.op !== \"=\" && part.op !== \"==\")) return null;\n if (part.left.type !== \"column\" || part.right.type !== \"column\") return null;\n }\n // rowid join keys need ScopeRow.rowid, not a regular cell \u2014 keep nested loop.\n if (pairs.some((pair) => isRowidName(pair.rightColumn))) return null;\n return {\n rightColumns: pairs.map((pair) => pair.rightColumn),\n leftKeys: pairs.map((pair) => ({ table: pair.leftTable, column: pair.leftColumn })),\n };\n}\n\nexport function tryJoinProbe(right: FromItem, on: Expr | null, env: ExecutionEnv): JoinProbe | null {\n if (!on || right.type !== \"table\") return null;\n const alias = right.alias ?? right.name;\n const db = env.state.databaseForSchema(right.schema, right.schema ? `${right.schema}.${right.name}` : right.name);\n if (db.virtualTables.has(right.name.toLowerCase()) || db.views.has(right.name.toLowerCase())) return null;\n if (env.ctes.has(right.name.toLowerCase())) return null;\n let table: Table;\n try {\n table = db.getTable(right.name);\n } catch {\n return null;\n }\n\n const pairs: { rightColumn: string; leftTable: string | null; leftColumn: string }[] = [];\n for (const part of conjunctions(on)) {\n if (part.type !== \"binary\" || (part.op !== \"=\" && part.op !== \"==\")) continue;\n if (part.left.type !== \"column\" || part.right.type !== \"column\") continue;\n const leftOnRight = columnOnTable(part.left, alias, table.name);\n const rightOnRight = columnOnTable(part.right, alias, table.name);\n if (leftOnRight && !rightOnRight) {\n pairs.push({ rightColumn: part.left.name, leftTable: part.right.table, leftColumn: part.right.name });\n } else if (rightOnRight && !leftOnRight) {\n pairs.push({ rightColumn: part.right.name, leftTable: part.left.table, leftColumn: part.left.name });\n }\n }\n if (pairs.length === 0) return null;\n\n const pk = table.integerPkColumn();\n const pkPair = pairs.find(\n (pair) => isRowidName(pair.rightColumn) || (pk && pair.rightColumn.toLowerCase() === pk.name.toLowerCase()),\n );\n if (pkPair) {\n return {\n table,\n alias,\n covering: pairs.length === 1,\n lookup: (getLeft) => {\n const value = getLeft(pkPair.leftTable, pkPair.leftColumn);\n const row = table.getByKey(value);\n return row ? [row] : [];\n },\n };\n }\n\n for (const indexName of table.indexes) {\n const index: IndexInfo | undefined = db.indexes.get(indexName.toLowerCase());\n if (!index || index.where) continue;\n const prefixPairs: typeof pairs = [];\n for (const column of index.columns) {\n const pair = pairs.find((item) => item.rightColumn.toLowerCase() === column.name.toLowerCase());\n if (!pair) break;\n prefixPairs.push(pair);\n }\n if (prefixPairs.length !== index.columns.length) continue;\n return {\n table,\n alias,\n covering: prefixPairs.length === pairs.length,\n lookup: (getLeft) => {\n const values = prefixPairs.map((pair, i) =>\n normalizeForCollation(getLeft(pair.leftTable, pair.leftColumn), index.columns[i]?.collate ?? \"BINARY\"),\n );\n const rows: Row[] = [];\n for (const rowid of index.store.lookup(values)) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n }\n rows.sort((a, b) => compareRowids(a.rowid, b.rowid));\n return rows;\n },\n };\n }\n\n if (pairs.length === 1) {\n const pair = pairs[0]!;\n const col = pair.rightColumn.toLowerCase();\n if (!isRowidName(pair.rightColumn) && table.ensureEqualityHash(col)) {\n return {\n table,\n alias,\n covering: true,\n lookup: (getLeft) => {\n const rows = table.lookupEquality(col, getLeft(pair.leftTable, pair.leftColumn));\n return rows ?? [];\n },\n };\n }\n }\n return null;\n}\n\nfunction columnOnTable(column: { table: string | null; name: string }, alias: string, tableName: string): boolean {\n return column.table !== null && matchesTable(column.table, alias, tableName);\n}\n", "import type { Expr, ResultColumn, SelectStmt } from \"../ast/nodes.ts\";\nimport { conjunctions, equalityAgainstConst, lookupTableRows, tryJoinEqualityKeys } from \"../planner/access.ts\";\nimport type { Row } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { compareSql, toInteger, type SqlValue } from \"../types/value.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { type ResultSet, valuesToResult } from \"./result.ts\";\n\n/**\n * Tight path for `SELECT cols FROM table WHERE col = ?` (no join/group/order).\n * Skips ScopeRow / evalExpr and honors maxRows during the scan.\n */\nexport function tryExecuteSimpleSelect(stmt: SelectStmt, env: ExecutionEnv): ResultSet | null {\n if (stmt.with || stmt.compound || stmt.distinct || stmt.groupBy.length > 0 || stmt.having || stmt.windows.length > 0)\n return null;\n if (stmt.orderBy.length > 0) return null;\n if (stmt.from?.type !== \"table\") return null;\n for (const column of stmt.columns) {\n if (column.type === \"star\") continue;\n if (column.expr.type !== \"column\") return null;\n }\n\n const from = stmt.from;\n const nameKey = from.name.toLowerCase();\n if (nameKey === \"sqlite_schema\" || nameKey === \"sqlite_master\") return null;\n if (env.ctes.has(nameKey)) return null;\n const qualified = from.schema ? `${from.schema}.${from.name}` : from.name;\n const db = env.state.databaseForSchema(from.schema, qualified);\n if (db.virtualTables.has(nameKey) || db.views.has(nameKey)) return null;\n\n let table: Table;\n try {\n table = db.getTable(from.name);\n } catch {\n return null;\n }\n if (table.withoutRowid) return null;\n if (table.columns.some((column) => column.generated && !column.generated.stored)) return null;\n\n const alias = from.alias ?? from.name;\n const aliasLower = alias.toLowerCase();\n const tableLower = table.name.toLowerCase();\n for (const column of stmt.columns) {\n if (column.type === \"star\") continue;\n if (column.expr.type !== \"column\") return null;\n const tableRef = column.expr.table?.toLowerCase();\n if (tableRef && tableRef !== aliasLower && tableRef !== tableLower && tableRef !== nameKey) return null;\n const key = column.expr.name.toLowerCase();\n if (isRowidName(key)) continue;\n if (!table.columns.some((item) => (item.nameLower ?? item.name.toLowerCase()) === key)) return null;\n }\n\n const filters: { column: string; value: SqlValue }[] = [];\n if (stmt.where) {\n for (const part of conjunctions(stmt.where)) {\n const eq = equalityAgainstConst(part);\n if (!eq) return null;\n let value: SqlValue;\n try {\n value = evalIndependent(eq.valueExpr, env);\n } catch {\n return null;\n }\n filters.push({ column: eq.column.toLowerCase(), value });\n }\n }\n\n let limit = env.maxRows;\n let offset = 0;\n if (stmt.limit) {\n try {\n const limitValue = toInteger(evalIndependent(stmt.limit.limit, env));\n const offsetValue = stmt.limit.offset ? toInteger(evalIndependent(stmt.limit.offset, env)) : 0;\n if (limitValue === null || offsetValue === null) return null;\n offset = Math.max(0, Number(offsetValue));\n const n = Number(limitValue);\n if (n >= 0) limit = Math.min(limit, n);\n } catch {\n return null;\n }\n }\n const columns = projectNames(stmt.columns, table);\n if (limit <= 0) return pack(env, columns, []);\n\n let source: Iterable<Row> = table.scan();\n let alreadyFiltered = false;\n if (stmt.where) {\n const indexed = lookupTableRows(from, stmt.where, env);\n if (indexed) {\n source = indexed.rows;\n alreadyFiltered = true;\n }\n }\n\n const projectors = projectionFns(stmt.columns, table);\n const values: SqlValue[][] = [];\n let skipped = 0;\n\n for (const row of source) {\n if (!alreadyFiltered && filters.length > 0 && !rowMatches(row, filters)) continue;\n if (skipped < offset) {\n skipped++;\n continue;\n }\n values.push(projectors.map((fn) => fn(row)));\n if (values.length >= limit) break;\n }\n\n return pack(env, columns, values);\n}\n\nexport function tryExecuteSimpleJoin(stmt: SelectStmt, env: ExecutionEnv): ResultSet | null {\n if (stmt.with || stmt.compound || stmt.distinct || stmt.groupBy.length > 0 || stmt.having || stmt.windows.length > 0)\n return null;\n if (stmt.orderBy.length > 0 || stmt.limit || stmt.where) return null;\n if (stmt.from?.type !== \"join\") return null;\n const join = stmt.from;\n if ((join.joinType !== \"INNER\" && join.joinType !== \"CROSS\") || join.using || !join.on) return null;\n if (join.left.type !== \"table\" || join.right.type !== \"table\") return null;\n const keys = tryJoinEqualityKeys(join.right, join.on, env);\n if (keys?.rightColumns.length !== 1) return null;\n\n const leftRef = join.left;\n const rightRef = join.right;\n const leftDb = env.state.databaseForSchema(\n leftRef.schema,\n leftRef.schema ? `${leftRef.schema}.${leftRef.name}` : leftRef.name,\n );\n const rightDb = env.state.databaseForSchema(\n rightRef.schema,\n rightRef.schema ? `${rightRef.schema}.${rightRef.name}` : rightRef.name,\n );\n if (env.ctes.has(leftRef.name.toLowerCase()) || env.ctes.has(rightRef.name.toLowerCase())) return null;\n if (leftDb.views.has(leftRef.name.toLowerCase()) || rightDb.views.has(rightRef.name.toLowerCase())) return null;\n if (leftDb.virtualTables.has(leftRef.name.toLowerCase()) || rightDb.virtualTables.has(rightRef.name.toLowerCase()))\n return null;\n\n let leftTable: Table;\n let rightTable: Table;\n try {\n leftTable = leftDb.getTable(leftRef.name);\n rightTable = rightDb.getTable(rightRef.name);\n } catch {\n return null;\n }\n if (leftTable.withoutRowid || rightTable.withoutRowid) return null;\n\n const leftAlias = (leftRef.alias ?? leftRef.name).toLowerCase();\n const rightAlias = (rightRef.alias ?? rightRef.name).toLowerCase();\n const rightCol = keys.rightColumns[0]!.toLowerCase();\n const leftCol = keys.leftKeys[0]!.column.toLowerCase();\n if (!rightTable.ensureEqualityHash(rightCol)) return null;\n\n const names: string[] = [];\n const projectors: ((left: Row, right: Row) => SqlValue)[] = [];\n for (const column of stmt.columns) {\n if (column.type !== \"expr\" || column.expr.type !== \"column\") return null;\n const tableRef = column.expr.table?.toLowerCase() ?? null;\n const key = column.expr.name.toLowerCase();\n const onLeft =\n tableRef === null\n ? leftTable.columns.some((item) => (item.nameLower ?? item.name.toLowerCase()) === key)\n : tableRef === leftAlias || tableRef === leftTable.name.toLowerCase();\n const onRight =\n tableRef === null\n ? rightTable.columns.some((item) => (item.nameLower ?? item.name.toLowerCase()) === key)\n : tableRef === rightAlias || tableRef === rightTable.name.toLowerCase();\n if (onLeft === onRight) return null;\n names.push(column.alias ?? column.expr.name);\n if (onLeft) {\n if (isRowidName(key)) projectors.push((left) => left.rowid);\n else projectors.push((left) => left.values.get(key) ?? null);\n } else {\n if (isRowidName(key)) projectors.push((_left, right) => right.rowid);\n else projectors.push((_left, right) => right.values.get(key) ?? null);\n }\n }\n\n const values: SqlValue[][] = [];\n for (const left of leftTable.scan()) {\n const matches = rightTable.lookupEquality(rightCol, left.values.get(leftCol) ?? null);\n if (!matches) return null;\n for (const right of matches) values.push(projectors.map((fn) => fn(left, right)));\n }\n return pack(env, names, values);\n}\n\nfunction rowMatches(row: Row, filters: { column: string; value: SqlValue }[]): boolean {\n for (const filter of filters) {\n if (isRowidName(filter.column)) {\n if (compareSql(row.rowid, filter.value) !== 0) return false;\n continue;\n }\n if (compareSql(row.values.get(filter.column) ?? null, filter.value) !== 0) return false;\n }\n return true;\n}\n\nfunction projectNames(columns: ResultColumn[], table: Table): string[] {\n const names: string[] = [];\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const item of table.columns) names.push(item.name);\n continue;\n }\n if (column.alias) {\n names.push(column.alias);\n continue;\n }\n const key = column.expr.type === \"column\" ? column.expr.name.toLowerCase() : \"\";\n if (isRowidName(key)) names.push(table.integerPkColumn()?.name ?? \"rowid\");\n else names.push(column.expr.type === \"column\" ? column.expr.name : \"?column?\");\n }\n return names;\n}\n\nfunction projectionFns(columns: ResultColumn[], table: Table): ((row: Row) => SqlValue)[] {\n const fns: ((row: Row) => SqlValue)[] = [];\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const item of table.columns) {\n const key = item.nameLower ?? item.name.toLowerCase();\n fns.push((row) => row.values.get(key) ?? null);\n }\n continue;\n }\n const expr = column.expr;\n if (expr.type !== \"column\") continue;\n const key = expr.name.toLowerCase();\n if (isRowidName(key)) fns.push((row) => row.rowid);\n else fns.push((row) => row.values.get(key) ?? null);\n }\n return fns;\n}\n\nfunction evalIndependent(expr: Expr, env: ExecutionEnv): SqlValue {\n if (expr.type === \"literal\") return expr.value;\n if (expr.type === \"null\") return null;\n if (expr.type === \"parameter\") return env.getBoundParameter(expr.name);\n if (expr.type === \"unary\" && expr.op === \"-\" && expr.expr.type === \"literal\" && typeof expr.expr.value === \"number\") {\n return -expr.expr.value;\n }\n throw new Error(\"not independent\");\n}\n\nfunction isRowidName(name: string): boolean {\n return name === \"rowid\" || name === \"_rowid_\" || name === \"oid\";\n}\n\nfunction pack(env: ExecutionEnv, columns: string[], values: SqlValue[][]): ResultSet {\n return valuesToResult(columns, values, 0, env.state.lastInsertRowid, {\n named: env.includeNamedRows,\n keepValues: true,\n });\n}\n", "import type {\n AggregateExpr,\n Expr,\n FromItem,\n OrderByItem,\n ResultColumn,\n SelectStmt,\n WindowExpr,\n WindowSpec,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { EvalContext } from \"../expressions/context.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { isPragmaTvfName } from \"../functions/pragma-tvf.ts\";\nimport { evaluateTableFunction, hasTableValuedFunction } from \"../functions/table-valued.ts\";\nimport { buildSqliteMaster, buildSqliteSchema } from \"../schema/catalog.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\nimport {\n tryIndexedOrder,\n tryIndexedTableRows,\n tryJoinEqualityKeys,\n tryJoinProbe,\n whereFullyCovered,\n} from \"../planner/access.ts\";\nimport { serializeIndexKey } from \"../indexes/index.ts\";\nimport type { Row } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { compareWithCollation, normalizeForCollation } from \"../types/collation.ts\";\nimport {\n type Affinity,\n applyAffinity,\n compareSql,\n isTruthySql,\n type SqlValue,\n sqlValueEquals,\n toInteger,\n} from \"../types/value.ts\";\nimport type { FtsVocabVirtualTable } from \"../vtable/modules.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"./env.ts\";\nimport { makeCell } from \"./env.ts\";\nimport { type ResultSet, resultValues, valuesToResult } from \"./result.ts\";\nimport { tryExecuteSimpleJoin, tryExecuteSimpleSelect } from \"./simple-select.ts\";\n\nfunction applyAffinityLocal(value: SqlValue, affinity: Affinity): SqlValue {\n return applyAffinity(value, affinity);\n}\n\ninterface OutputRow {\n values: SqlValue[];\n scope: ScopeRow;\n}\n\nexport function executeSelect(stmt: SelectStmt, env: ExecutionEnv, parent?: EvalContext): ResultSet {\n env.selectRunner = executeSelect;\n if (!parent && !stmt.with && !stmt.compound) {\n const simple = tryExecuteSimpleSelect(stmt, env) ?? tryExecuteSimpleJoin(stmt, env);\n if (simple) return simple;\n }\n const savedCtes = new Map(env.ctes);\n try {\n if (stmt.with) executeWith(stmt, env, parent);\n const base = executeSelectCore(\n {\n ...stmt,\n with: null,\n compound: null,\n orderBy: stmt.compound ? [] : stmt.orderBy,\n limit: stmt.compound ? null : stmt.limit,\n },\n env,\n parent,\n );\n if (!stmt.compound) return base;\n const right = executeSelect(stmt.compound.select, env, parent);\n if (base.columns.length !== right.columns.length) {\n throw new SqliteError(\n \"SELECTs to the left and right of compound operator do not have the same number of result columns\",\n \"other\",\n );\n }\n const leftRows = resultValues(base);\n const rightRows = resultValues(right);\n let rows: SqlValue[][];\n switch (stmt.compound.op) {\n case \"UNION ALL\":\n rows = [...leftRows, ...rightRows];\n break;\n case \"UNION\":\n rows = uniqueRows([...leftRows, ...rightRows]);\n break;\n case \"INTERSECT\":\n rows = uniqueRows(leftRows).filter((row) => rightRows.some((other) => rowsEqual(row, other)));\n break;\n case \"EXCEPT\":\n rows = uniqueRows(leftRows).filter((row) => !rightRows.some((other) => rowsEqual(row, other)));\n break;\n }\n if (stmt.orderBy.length > 0) rows.sort((a, b) => compareCompoundRows(a, b, stmt.orderBy, base.columns));\n if (stmt.limit) {\n const ctx = env.createEvalContext(null, parent);\n const limitValue = toInteger(evalExpr(stmt.limit.limit, ctx));\n const offsetValue = stmt.limit.offset ? toInteger(evalExpr(stmt.limit.offset, ctx)) : 0;\n if (limitValue === null || offsetValue === null) throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\");\n const offset = Math.max(0, Number(offsetValue));\n const limit = Number(limitValue);\n rows = rows.slice(offset, limit < 0 ? undefined : offset + limit);\n }\n return valuesToResult(base.columns, rows, 0, env.state.lastInsertRowid, {\n named: env.includeNamedRows,\n keepValues: true,\n });\n } finally {\n env.ctes.clear();\n for (const [name, result] of savedCtes) env.ctes.set(name, result);\n }\n}\n\nfunction executeWith(stmt: SelectStmt, env: ExecutionEnv, parent?: EvalContext): void {\n for (const cte of stmt.with!.ctes) {\n const key = cte.name.toLowerCase();\n if (stmt.with!.recursive && referencesTable(cte.select, cte.name) && cte.select.compound) {\n const anchor = executeSelect({ ...cte.select, compound: null }, env, parent);\n const columns = cte.columns ?? anchor.columns;\n let accumulated = resultValues(anchor);\n let delta = accumulated;\n while (true) {\n env.ctes.set(key, valuesToResult(columns, delta));\n const nextResult = executeSelect(cte.select.compound.select, env, parent);\n const candidates = resultValues(nextResult);\n const additions =\n cte.select.compound.op === \"UNION ALL\"\n ? candidates\n : candidates.filter((row) => !accumulated.some((existing) => rowsEqual(existing, row)));\n if (additions.length === 0) break;\n accumulated = [...accumulated, ...additions];\n delta = additions;\n }\n env.ctes.set(key, valuesToResult(columns, accumulated));\n } else {\n const result = executeSelect(cte.select, env, parent);\n const columns = cte.columns ?? result.columns;\n env.ctes.set(key, valuesToResult(columns, resultValues(result)));\n }\n }\n}\n\nfunction executeSelectCore(stmt: SelectStmt, env: ExecutionEnv, parent?: EvalContext): ResultSet {\n let scopes: ScopeRow[];\n let skipWhere = false;\n let skipOrder = false;\n if (stmt.from && stmt.where) {\n const indexed = tryIndexedTableRows(stmt.from, stmt.where, env);\n if (indexed) {\n scopes = scopesFromTableRows(indexed.table, indexed.rows, indexed.alias, env, parent);\n skipWhere = whereFullyCovered(stmt.where, indexed.coveredColumns, indexed.alias, indexed.table.name);\n } else {\n scopes = scanFrom(stmt.from, env, parent);\n }\n } else if (stmt.from && stmt.orderBy.length === 1 && stmt.orderBy[0]) {\n let take: number | undefined;\n if (stmt.limit) {\n const ctx = env.createEvalContext(null, parent);\n const limitValue = toInteger(evalExpr(stmt.limit.limit, ctx));\n const offsetValue = stmt.limit.offset ? toInteger(evalExpr(stmt.limit.offset, ctx)) : 0;\n if (limitValue !== null && offsetValue !== null) {\n const offset = Math.max(0, Number(offsetValue));\n const limit = Number(limitValue);\n take = limit < 0 ? undefined : offset + limit;\n }\n }\n const ordered = tryIndexedOrder(\n stmt.from,\n { expr: stmt.orderBy[0].expr, dir: stmt.orderBy[0].dir ?? \"ASC\" },\n env,\n take,\n );\n if (ordered) {\n scopes = scopesFromTableRows(ordered.table, ordered.rows, ordered.alias, env, parent);\n skipOrder = true;\n } else scopes = scanFrom(stmt.from, env, parent);\n } else {\n scopes = stmt.from ? scanFrom(stmt.from, env, parent) : [{ cells: [] }];\n }\n const canStopEarly =\n stmt.orderBy.length === 0 &&\n !stmt.distinct &&\n stmt.groupBy.length === 0 &&\n stmt.having === null &&\n Number.isFinite(env.maxRows);\n const aggregate =\n stmt.groupBy.length > 0 ||\n stmt.columns.some((column) => column.type === \"expr\" && containsAggregate(column.expr)) ||\n (stmt.having !== null && containsAggregate(stmt.having));\n if (stmt.where && !skipWhere) {\n if (canStopEarly && !aggregate) {\n const filtered: ScopeRow[] = [];\n for (const scope of scopes) {\n if (isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope, parent))) !== true) continue;\n filtered.push(scope);\n if (filtered.length >= env.maxRows) break;\n }\n scopes = filtered;\n } else {\n scopes = scopes.filter(\n (scope) => isTruthySql(evalExpr(stmt.where!, env.createEvalContext(scope, parent))) === true,\n );\n }\n }\n const groupBy = stmt.groupBy.map((expr) => {\n if (expr.type !== \"literal\" || typeof expr.value !== \"number\" || !Number.isInteger(expr.value)) return expr;\n const column = stmt.columns[expr.value - 1];\n if (column?.type !== \"expr\") throw new SqliteError(`${expr.value}th GROUP BY term out of range`, \"other\");\n return column.expr;\n });\n const groups = aggregate ? groupRows(scopes, groupBy, env, parent) : scopes.map((scope) => [scope]);\n const windowScopes = aggregate ? groups.map((group) => group[0] ?? { cells: [] }) : scopes;\n const sample = scopes[0] ?? (stmt.from ? { cells: shapeOf(stmt.from, env) } : undefined);\n if (scopes.length === 0 && sample) validateProjectedColumns(stmt, sample, env, parent);\n const columns = resultColumnNames(stmt.columns, sample);\n let output: OutputRow[] = [];\n\n for (const group of groups) {\n const scope = group[0] ?? { cells: [] };\n const ctx = env.createEvalContext(scope, parent);\n const values: SqlValue[] = [];\n for (const column of stmt.columns) {\n if (column.type === \"star\") {\n for (const cell of scope.cells) {\n if (\n (column.table !== null || !cell.hiddenByUsing) &&\n (column.table === null || cell.table?.toLowerCase() === column.table.toLowerCase())\n )\n values.push(cell.value);\n }\n } else {\n values.push(evalGrouped(column.expr, ctx, group, env, parent, stmt.windows, windowScopes));\n }\n }\n if (stmt.having) {\n const aliases = new Map<string, SqlValue>();\n stmt.columns.forEach((column, index) => {\n if (column.type === \"expr\" && column.alias) aliases.set(column.alias.toLowerCase(), values[index] ?? null);\n });\n const havingCtx: EvalContext = {\n ...ctx,\n resolveColumn: (table, name) => {\n if (table === null && aliases.has(name.toLowerCase())) return aliases.get(name.toLowerCase()) ?? null;\n return ctx.resolveColumn(table, name);\n },\n };\n if (isTruthySql(evalGrouped(stmt.having, havingCtx, group, env, parent, stmt.windows, windowScopes)) !== true)\n continue;\n }\n output.push({ values, scope });\n if (canStopEarly && !aggregate && !stmt.limit && output.length >= env.maxRows) break;\n }\n\n if (stmt.distinct) {\n const seen = new Set<string>();\n output = output.filter((row) => {\n const key = valueKey(row.values);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }\n if (stmt.orderBy.length > 0 && !skipOrder) {\n output.sort((left, right) => compareOutput(left, right, stmt.orderBy, columns, env, parent));\n }\n if (stmt.limit) {\n const ctx = env.createEvalContext(null, parent);\n const limitValue = toInteger(evalExpr(stmt.limit.limit, ctx));\n const offsetValue = stmt.limit.offset ? toInteger(evalExpr(stmt.limit.offset, ctx)) : 0;\n if (limitValue === null || offsetValue === null) throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\");\n const offset = Math.max(0, Number(offsetValue));\n const limit = Number(limitValue);\n output = output.slice(offset, limit < 0 ? undefined : offset + limit);\n }\n if (Number.isFinite(env.maxRows) && output.length > env.maxRows) output = output.slice(0, env.maxRows);\n return valuesToResult(\n columns,\n output.map((row) => row.values),\n 0,\n env.state.lastInsertRowid,\n {\n named: env.includeNamedRows,\n keepValues: true,\n },\n );\n}\n\nexport function scanFrom(item: FromItem, env: ExecutionEnv, parent?: EvalContext): ScopeRow[] {\n if (item.type === \"join\") {\n const left = scanFrom(item.left, env, parent);\n\n // Correlated table-valued functions (e.g. json_each(t.data)) are evaluated per left row.\n if (item.right.type === \"table_func\") {\n const result: ScopeRow[] = [];\n const rightShape = shapeOf(item.right, env);\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n for (const lhs of left) {\n const tvf = evaluateTableFunction(item.right.name, item.right.args, item.right.alias, env, lhs, parent);\n if (tvf.rows.length === 0) {\n if (item.joinType === \"LEFT\" || item.joinType === \"FULL\") {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n continue;\n }\n for (const rhs of tvf.rows) {\n const joined = { cells: [...lhs.cells, ...rhs.cells] };\n if (item.on) {\n if (isTruthySql(evalExpr(item.on, env.createEvalContext(joined, parent))) !== true) continue;\n }\n result.push(joined);\n }\n }\n return result;\n }\n\n const probe =\n !item.using && item.joinType !== \"RIGHT\" && item.joinType !== \"FULL\"\n ? tryJoinProbe(item.right, item.on, env)\n : null;\n if (probe) {\n const rightShape = shapeOf(item.right, env);\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const result: ScopeRow[] = [];\n for (const lhs of left) {\n const raw = probe.lookup((tableName, name) => {\n const key = name.toLowerCase();\n const match = lhs.cells.find(\n (cell) =>\n (cell.nameLower ?? cell.name.toLowerCase()) === key &&\n (tableName === null || (cell.tableLower ?? cell.table?.toLowerCase()) === tableName.toLowerCase()),\n );\n return match?.value ?? null;\n });\n const rhsScopes = scopesFromTableRows(probe.table, raw, probe.alias, env, parent);\n let matched = false;\n for (const rhs of rhsScopes) {\n const joined = { cells: [...lhs.cells, ...rhs.cells] };\n if (\n item.on &&\n !probe.covering &&\n isTruthySql(evalExpr(item.on, env.createEvalContext(joined, parent))) !== true\n )\n continue;\n matched = true;\n result.push(joined);\n }\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n return result;\n }\n\n // Hash-join fallback for unindexed equality INNER/LEFT joins (NULL keys never match).\n const hashKeys =\n !item.using && item.joinType !== \"RIGHT\" && item.joinType !== \"FULL\"\n ? tryJoinEqualityKeys(item.right, item.on, env)\n : null;\n if (hashKeys) {\n const rawRight = rawJoinTable(item.right, env);\n if (rawRight) {\n return hashJoinRaw(left, rawRight, hashKeys, item);\n }\n const right = scanFrom(item.right, env, parent);\n const rightShape = (right[0]?.cells ?? shapeOf(item.right, env)).map((cell) => cell);\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const buckets = new Map<string, ScopeRow[]>();\n for (const rhs of right) {\n const values = hashKeys.rightColumns.map((name) => {\n const key = name.toLowerCase();\n const cell = rhs.cells.find((c) => (c.nameLower ?? c.name.toLowerCase()) === key);\n return normalizeForCollation(cell?.value ?? null, \"BINARY\");\n });\n const mapKey = serializeIndexKey(values);\n if (mapKey === null) continue; // NULL join key \u2192 never matches via =\n const bucket = buckets.get(mapKey);\n if (bucket) bucket.push(rhs);\n else buckets.set(mapKey, [rhs]);\n }\n const result: ScopeRow[] = [];\n for (const lhs of left) {\n const values = hashKeys.leftKeys.map((key) => {\n const cell = lhs.cells.find(\n (c) =>\n (c.nameLower ?? c.name.toLowerCase()) === key.column.toLowerCase() &&\n (key.table === null || (c.tableLower ?? c.table?.toLowerCase()) === key.table.toLowerCase()),\n );\n return normalizeForCollation(cell?.value ?? null, \"BINARY\");\n });\n const mapKey = serializeIndexKey(values);\n let matched = false;\n if (mapKey !== null) {\n const matches = buckets.get(mapKey);\n if (matches) {\n for (const rhs of matches) {\n const joined = { cells: [...lhs.cells, ...rhs.cells] };\n matched = true;\n result.push(joined);\n }\n }\n }\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n return result;\n }\n\n const right = scanFrom(item.right, env, parent);\n const using = resolveUsingColumns(item, left, right, env);\n const leftShape = left[0]?.cells ?? shapeOf(item.left, env);\n const rightShape = (right[0]?.cells ?? shapeOf(item.right, env)).map((cell) =>\n using?.some((name) => name.toLowerCase() === cell.name.toLowerCase()) ? { ...cell, hiddenByUsing: true } : cell,\n );\n const nullLeft = leftShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const result: ScopeRow[] = [];\n const matchedRight = new Set<number>();\n\n const joinOk = (lhs: ScopeRow, rhs: ScopeRow, joined: ScopeRow): boolean => {\n if (using) {\n return using.every((name) => {\n const l = lhs.cells.find((cell) => cell.name.toLowerCase() === name.toLowerCase())?.value ?? null;\n const r = rhs.cells.find((cell) => cell.name.toLowerCase() === name.toLowerCase())?.value ?? null;\n return l !== null && r !== null && sqlValueEquals(l, r);\n });\n }\n if (item.on) return isTruthySql(evalExpr(item.on, env.createEvalContext(joined, parent))) === true;\n return true;\n };\n\n for (const lhs of left) {\n let matched = false;\n right.forEach((rhs, rightIndex) => {\n const rightCells = using\n ? rhs.cells.map((cell) =>\n using.some((name) => name.toLowerCase() === cell.name.toLowerCase())\n ? { ...cell, hiddenByUsing: true }\n : cell,\n )\n : rhs.cells;\n const joined = { cells: [...lhs.cells, ...rightCells] };\n if (!joinOk(lhs, rhs, joined)) return;\n matched = true;\n matchedRight.add(rightIndex);\n result.push(joined);\n });\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n\n if (item.joinType === \"RIGHT\" || item.joinType === \"FULL\") {\n right.forEach((rhs, rightIndex) => {\n if (matchedRight.has(rightIndex)) return;\n const rightCells = using\n ? rhs.cells.map((cell) =>\n using.some((name) => name.toLowerCase() === cell.name.toLowerCase())\n ? { ...cell, hiddenByUsing: true }\n : cell,\n )\n : rhs.cells;\n result.push({ cells: [...nullLeft, ...rightCells] });\n });\n }\n\n return result;\n }\n if (item.type === \"subquery\") {\n const result = executeSelect(item.select, env, parent);\n return resultValues(result).map((values) => ({\n cells: result.columns.map((name, index) => ({ table: item.alias, name, value: values[index] ?? null })),\n }));\n }\n if (item.type === \"table_func\") {\n return evaluateTableFunction(item.name, item.args, item.alias, env).rows;\n }\n\n // Eponymous pragma_* virtual tables may be referenced without parentheses.\n if (item.type === \"table\" && isPragmaTvfName(item.name) && hasTableValuedFunction(item.name.toLowerCase())) {\n return evaluateTableFunction(item.name, [], item.alias, env, null, parent).rows;\n }\n\n const alias = item.alias ?? item.name;\n const qualified = item.schema ? `${item.schema}.${item.name}` : item.name;\n const db = env.state.databaseForSchema(item.schema, qualified);\n const cte = env.ctes.get(item.name.toLowerCase());\n if (cte) {\n return resultValues(cte).map((values) => ({\n cells: cte.columns.map((name, index) => ({ table: alias, name, value: values[index] ?? null })),\n }));\n }\n const view = db.views.get(item.name.toLowerCase());\n if (view) {\n const result = executeSelect(view.select, env, parent);\n const names = view.columns ?? result.columns;\n return resultValues(result).map((values) => ({\n cells: names.map((name, index) => ({ table: alias, name, value: values[index] ?? null })),\n }));\n }\n const virtual = db.virtualTables.get(item.name.toLowerCase());\n if (virtual) {\n if (virtual.kind === \"fts5\" || virtual.kind === \"fts3\" || virtual.kind === \"fts4\") {\n return virtual.scan().map((row) => ({\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: virtual.name,\n cells: virtual.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n }));\n }\n if (virtual.kind === \"rtree\") {\n return virtual.scan().map((row) => ({\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: virtual.name,\n cells: virtual.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n }));\n }\n if (virtual.kind === \"dbstat\") {\n return scanDbStat(db, alias, virtual.schemaArg);\n }\n if (virtual.kind === \"fts5vocab\") {\n return scanFtsVocab(db, alias, virtual);\n }\n // bytecode / tables_used: empty by default\n return [];\n }\n let table: Table;\n if (item.name.toLowerCase() === \"sqlite_schema\") table = buildSqliteSchema(db);\n else if (item.name.toLowerCase() === \"sqlite_master\") table = buildSqliteMaster(db);\n else table = db.getTable(item.name);\n return scopesFromTableRows(table, table.scan(), alias, env, parent);\n}\n\nfunction rawJoinTable(item: FromItem, env: ExecutionEnv): { table: Table; alias: string } | null {\n if (item.type !== \"table\") return null;\n const nameKey = item.name.toLowerCase();\n if (nameKey === \"sqlite_schema\" || nameKey === \"sqlite_master\") return null;\n if (env.ctes.has(nameKey)) return null;\n const db = env.state.databaseForSchema(item.schema, item.schema ? `${item.schema}.${item.name}` : item.name);\n if (db.virtualTables.has(nameKey) || db.views.has(nameKey)) return null;\n try {\n return { table: db.getTable(item.name), alias: item.alias ?? item.name };\n } catch {\n return null;\n }\n}\n\nfunction hashJoinRaw(\n left: ScopeRow[],\n right: { table: Table; alias: string },\n hashKeys: { rightColumns: string[]; leftKeys: { table: string | null; column: string }[] },\n item: Extract<FromItem, { type: \"join\" }>,\n): ScopeRow[] {\n const rightKeys = hashKeys.rightColumns.map((name) => name.toLowerCase());\n const buckets = new Map<string, Row[]>();\n const source = right.table.withoutRowid ? right.table.clusteredRows.values() : right.table.rows.values();\n for (const row of source) {\n const values = rightKeys.map((key) => normalizeForCollation(row.values.get(key) ?? null, \"BINARY\"));\n const mapKey = serializeIndexKey(values);\n if (mapKey === null) continue;\n const bucket = buckets.get(mapKey);\n if (bucket) bucket.push(row);\n else buckets.set(mapKey, [row]);\n }\n const nullRight = right.table.columns.map((column) =>\n makeCell(right.alias, column.name, null, { affinity: column.affinity, collate: column.collate }),\n );\n const result: ScopeRow[] = [];\n for (const lhs of left) {\n const values = hashKeys.leftKeys.map((key) => {\n const want = key.column.toLowerCase();\n const tableKey = key.table?.toLowerCase();\n const cell = lhs.cells.find(\n (c) =>\n (c.nameLower ?? c.name.toLowerCase()) === want &&\n (tableKey === undefined || (c.tableLower ?? c.table?.toLowerCase()) === tableKey),\n );\n return normalizeForCollation(cell?.value ?? null, \"BINARY\");\n });\n const mapKey = serializeIndexKey(values);\n let matched = false;\n if (mapKey !== null) {\n const matches = buckets.get(mapKey);\n if (matches) {\n for (const row of matches) {\n const rhsCells = right.table.columns.map((column) =>\n makeCell(right.alias, column.name, row.values.get(column.nameLower ?? column.name.toLowerCase()) ?? null, {\n affinity: column.affinity,\n collate: column.collate,\n }),\n );\n result.push({ cells: [...lhs.cells, ...rhsCells] });\n matched = true;\n }\n }\n }\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n return result;\n}\n\nfunction scopesFromTableRows(\n table: Table,\n rows: Iterable<Row>,\n alias: string,\n env: ExecutionEnv,\n parent?: EvalContext,\n): ScopeRow[] {\n const integerPkAlias = table.integerPkColumn()?.name;\n const result: ScopeRow[] = [];\n for (const row of rows) {\n const baseCells = table.columns\n .filter((c) => !c.generated || c.generated.stored)\n .map((column) =>\n makeCell(alias, column.name, row.values.get(column.nameLower ?? column.name.toLowerCase()) ?? null, {\n affinity: column.affinity,\n collate: column.collate,\n }),\n );\n const cells = table.columns.map((column) => {\n if (column.generated && !column.generated.stored) {\n const ctx = env.createEvalContext({ cells: baseCells, sourceTable: table.name }, parent);\n return makeCell(alias, column.name, applyAffinityLocal(evalExpr(column.generated.expr, ctx), column.affinity), {\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n return makeCell(alias, column.name, row.values.get(column.nameLower ?? column.name.toLowerCase()) ?? null, {\n affinity: column.affinity,\n collate: column.collate,\n });\n });\n result.push({\n ...(table.withoutRowid ? {} : { rowid: row.rowid }),\n rowidName: integerPkAlias ?? (table.withoutRowid ? undefined : \"rowid\"),\n sourceTable: table.name,\n cells,\n });\n }\n return result;\n}\n\nfunction shapeOf(item: FromItem, env: ExecutionEnv): ScopeRow[\"cells\"] {\n if (item.type === \"join\") {\n const left = shapeOf(item.left, env);\n const right = shapeOf(item.right, env);\n const using = resolveUsingFromShapes(item.using, left, right);\n return [\n ...left,\n ...right.map((cell) =>\n using?.some((name) => name.toLowerCase() === cell.name.toLowerCase()) ? { ...cell, hiddenByUsing: true } : cell,\n ),\n ];\n }\n if (item.type === \"subquery\")\n return resultColumnNames(item.select.columns).map((name) => ({ table: item.alias, name, value: null }));\n if (item.type === \"table_func\") {\n const columns =\n item.name.toLowerCase() === \"generate_series\"\n ? [\"value\"]\n : item.name.toLowerCase() === \"json_each\" || item.name.toLowerCase() === \"json_tree\"\n ? [\"key\", \"value\", \"type\", \"atom\", \"id\", \"parent\", \"fullkey\", \"path\"]\n : evaluateTableFunction(item.name, item.args, item.alias, env).columns;\n return columns.map((name) => ({\n table: item.alias ?? item.name,\n name,\n value: null,\n }));\n }\n if (item.type === \"table\" && isPragmaTvfName(item.name) && hasTableValuedFunction(item.name.toLowerCase())) {\n const columns = evaluateTableFunction(item.name, [], item.alias, env).columns;\n return columns.map((name) => ({\n table: item.alias ?? item.name,\n name,\n value: null,\n }));\n }\n const alias = item.alias ?? item.name;\n const qualified = item.schema ? `${item.schema}.${item.name}` : item.name;\n const db = env.state.databaseForSchema(item.schema, qualified);\n const cte = env.ctes.get(item.name.toLowerCase());\n if (cte) return cte.columns.map((name) => ({ table: alias, name, value: null }));\n const view = db.views.get(item.name.toLowerCase());\n if (view)\n return (view.columns ?? resultColumnNames(view.select.columns)).map((name) => ({\n table: alias,\n name,\n value: null,\n }));\n const virtual = db.virtualTables.get(item.name.toLowerCase());\n if (virtual) return virtual.columns.map((name) => ({ table: alias, name, value: null }));\n const table =\n item.name.toLowerCase() === \"sqlite_schema\"\n ? buildSqliteSchema(db)\n : item.name.toLowerCase() === \"sqlite_master\"\n ? buildSqliteMaster(db)\n : db.getTable(item.name);\n return table.columns.map((column) => ({ table: alias, name: column.name, value: null, affinity: column.affinity }));\n}\n\n/** NATURAL JOIN uses an empty USING list as a sentinel; resolve shared column names at runtime. */\nfunction resolveUsingColumns(\n item: Extract<FromItem, { type: \"join\" }>,\n left: ScopeRow[],\n right: ScopeRow[],\n env: ExecutionEnv,\n): string[] | null {\n const leftCells = left[0]?.cells ?? shapeOf(item.left, env);\n const rightCells = right[0]?.cells ?? shapeOf(item.right, env);\n return resolveUsingFromShapes(item.using, leftCells, rightCells);\n}\n\nfunction resolveUsingFromShapes(\n using: string[] | null,\n leftCells: ScopeRow[\"cells\"],\n rightCells: ScopeRow[\"cells\"],\n): string[] | null {\n if (using === null) return null;\n if (using.length > 0) return using;\n const rightNames = new Set(rightCells.map((cell) => cell.name.toLowerCase()));\n const common: string[] = [];\n const seen = new Set<string>();\n for (const cell of leftCells) {\n const key = cell.name.toLowerCase();\n if (rightNames.has(key) && !seen.has(key)) {\n seen.add(key);\n common.push(cell.name);\n }\n }\n return common;\n}\n\nfunction groupRows(rows: ScopeRow[], expressions: Expr[], env: ExecutionEnv, parent?: EvalContext): ScopeRow[][] {\n if (expressions.length === 0) return [rows];\n const groups: ScopeRow[][] = [];\n const indexByKey = new Map<string, number>();\n for (const row of rows) {\n const keyValues = expressions.map((expr) => evalExpr(expr, env.createEvalContext(row, parent)));\n const key = valueKey(keyValues);\n const index = indexByKey.get(key);\n if (index === undefined) {\n indexByKey.set(key, groups.length);\n groups.push([row]);\n } else groups[index]!.push(row);\n }\n return groups;\n}\n\nfunction evalGrouped(\n expr: Expr,\n ctx: EvalContext,\n group: ScopeRow[],\n env: ExecutionEnv,\n parent: EvalContext | undefined,\n namedWindows: SelectStmt[\"windows\"],\n windowRows: ScopeRow[],\n): SqlValue {\n return evalExpr(\n replaceSpecial(expr, (special) => {\n if (special.type === \"aggregate\") return aggregateValue(special, group, env, parent);\n return windowValue(special, group[0] ?? { cells: [] }, windowRows, env, parent, namedWindows);\n }),\n ctx,\n );\n}\n\nfunction aggregateValue(expr: AggregateExpr, rows: ScopeRow[], env: ExecutionEnv, parent?: EvalContext): SqlValue {\n const accumulator = env.functions.createAggregate(expr.name);\n if (!accumulator) throw new SqliteError(`no such aggregate function: ${expr.name}`, \"other\");\n const seen: SqlValue[][] = [];\n for (const row of rows) {\n const ctx = env.createEvalContext(row, parent);\n if (expr.filter && isTruthySql(evalExpr(expr.filter, ctx)) !== true) continue;\n const args = expr.args === \"*\" ? [] : expr.args.map((arg) => evalExpr(arg, ctx));\n if (expr.distinct && seen.some((values) => rowsEqual(values, args))) continue;\n seen.push(args);\n accumulator.step(args);\n }\n return accumulator.finalize();\n}\n\nfunction windowValue(\n expr: WindowExpr,\n current: ScopeRow,\n rows: ScopeRow[],\n env: ExecutionEnv,\n parent: EvalContext | undefined,\n namedWindows: SelectStmt[\"windows\"],\n): SqlValue {\n const spec = resolveWindow(expr.window, namedWindows);\n const currentCtx = env.createEvalContext(current, parent);\n const partitionKey = spec.partitionBy.map((item) => evalExpr(item, currentCtx));\n const partition = rows.filter((row) =>\n rowsEqual(\n partitionKey,\n spec.partitionBy.map((item) => evalExpr(item, env.createEvalContext(row, parent))),\n ),\n );\n partition.sort((a, b) => compareScopes(a, b, spec.orderBy, env, parent));\n const index = Math.max(0, partition.indexOf(current));\n const orderKeys = partition.map((row) =>\n spec.orderBy.map((item) => evalExpr(item.expr, env.createEvalContext(row, parent))),\n );\n let defaultFrameEnd = index;\n if (spec.orderBy.length > 0) {\n while (defaultFrameEnd + 1 < partition.length) {\n const next = partition[defaultFrameEnd + 1];\n if (!next || compareScopes(current, next, spec.orderBy, env, parent) !== 0) break;\n defaultFrameEnd++;\n }\n }\n if (expr.func.type === \"aggregate\") {\n const [start, end] = frameBounds(spec, index, partition.length, currentCtx, defaultFrameEnd, orderKeys);\n const framed = frameRows(partition, start, end, index, orderKeys, spec.frame?.exclude ?? null);\n return aggregateValue(expr.func, framed, env, parent);\n }\n const name = expr.func.name.toLowerCase();\n const args = expr.func.args === \"*\" ? [] : expr.func.args;\n const values = partition.map((row) => args.map((arg) => evalExpr(arg, env.createEvalContext(row, parent))));\n if (name === \"row_number\") return index + 1;\n if (name === \"rank\") {\n let first = index;\n while (first > 0 && rowsEqual(orderKeys[first]!, orderKeys[first - 1]!)) first--;\n return first + 1;\n }\n if (name === \"dense_rank\") {\n let rank = 1;\n for (let i = 1; i <= index; i++) if (!rowsEqual(orderKeys[i]!, orderKeys[i - 1]!)) rank++;\n return rank;\n }\n const evaluated = args.map((arg) => evalExpr(arg, currentCtx));\n if (name === \"lag\" || name === \"lead\") {\n const offset = Number(toInteger(evaluated[1] ?? 1) ?? 1);\n const target = name === \"lag\" ? index - offset : index + offset;\n return values[target]?.[0] ?? evaluated[2] ?? null;\n }\n const [start, end] = frameBounds(spec, index, partition.length, currentCtx, defaultFrameEnd, orderKeys);\n const framed = frameRows(partition, start, end, index, orderKeys, spec.frame?.exclude ?? null);\n const framedValues = framed.map((row) => args.map((arg) => evalExpr(arg, env.createEvalContext(row, parent))));\n if (name === \"first_value\") return framedValues[0]?.[0] ?? null;\n if (name === \"last_value\") return framedValues[framedValues.length - 1]?.[0] ?? null;\n if (name === \"nth_value\") {\n const target = Number(toInteger(evaluated[1] ?? null) ?? 0) - 1;\n return target >= 0 && target < framedValues.length ? (framedValues[target]?.[0] ?? null) : null;\n }\n if (name === \"ntile\") {\n const buckets = Math.max(1, Number(toInteger(evaluated[0] ?? 1) ?? 1));\n const n = partition.length;\n const small = Math.floor(n / buckets);\n const large = small + 1;\n const largeCount = n % buckets;\n // First `largeCount` buckets have `large` rows\n let remaining = index;\n for (let b = 1; b <= buckets; b++) {\n const size = b <= largeCount ? large : small;\n if (remaining < size) return b;\n remaining -= size;\n }\n return buckets;\n }\n if (name === \"cume_dist\") {\n if (partition.length === 0) return null;\n let lastPeer = index;\n while (lastPeer + 1 < partition.length && rowsEqual(orderKeys[lastPeer + 1]!, orderKeys[index]!)) {\n lastPeer++;\n }\n return (lastPeer + 1) / partition.length;\n }\n if (name === \"percent_rank\") {\n if (partition.length <= 1) return 0;\n let first = index;\n while (first > 0 && rowsEqual(orderKeys[first]!, orderKeys[first - 1]!)) first--;\n return first / (partition.length - 1);\n }\n throw new SqliteError(`no such window function: ${expr.func.name}`, \"other\");\n}\n\nfunction resolveWindow(spec: WindowSpec, namedWindows: SelectStmt[\"windows\"], seen = new Set<string>()): WindowSpec {\n if (!spec.ref) return spec;\n const key = spec.ref.toLowerCase();\n if (seen.has(key)) throw new SqliteError(`circular window definition: ${spec.ref}`, \"other\");\n const named = namedWindows.find((item) => item.name.toLowerCase() === key);\n if (!named) throw new SqliteError(`no such window: ${spec.ref}`, \"other\");\n seen.add(key);\n const base = resolveWindow(named.spec, namedWindows, seen);\n return {\n partitionBy: spec.partitionBy.length ? spec.partitionBy : base.partitionBy,\n orderBy: spec.orderBy.length ? spec.orderBy : base.orderBy,\n frame: spec.frame ?? base.frame,\n ref: null,\n };\n}\n\nfunction frameBounds(\n spec: WindowSpec,\n index: number,\n length: number,\n ctx: EvalContext,\n defaultFrameEnd: number,\n orderKeys: SqlValue[][],\n): [number, number] {\n if (!spec.frame) return [0, spec.orderBy.length > 0 ? defaultFrameEnd : Math.max(0, length - 1)];\n const isRangeLike = spec.frame.type === \"RANGE\" || spec.frame.type === \"GROUPS\";\n let peerFirst = index;\n if (isRangeLike && spec.orderBy.length > 0) {\n while (peerFirst > 0 && rowsEqual(orderKeys[peerFirst]!, orderKeys[peerFirst - 1]!)) peerFirst--;\n }\n const bound = (\n item: WindowSpec[\"frame\"] extends infer _ ? NonNullable<WindowSpec[\"frame\"]>[\"start\"] : never,\n isStart: boolean,\n ): number => {\n switch (item.kind) {\n case \"unbounded_preceding\":\n return 0;\n case \"unbounded_following\":\n return Math.max(0, length - 1);\n case \"current_row\":\n if (isRangeLike) return isStart ? peerFirst : defaultFrameEnd;\n return index;\n case \"preceding\":\n return Math.max(0, index - Number(toInteger(evalExpr(item.expr, ctx)) ?? 0));\n case \"following\":\n return Math.min(Math.max(0, length - 1), index + Number(toInteger(evalExpr(item.expr, ctx)) ?? 0));\n }\n };\n return [bound(spec.frame.start, true), bound(spec.frame.end, false)];\n}\n\nfunction frameRows(\n partition: ScopeRow[],\n start: number,\n end: number,\n index: number,\n orderKeys: SqlValue[][],\n exclude: \"no_others\" | \"current_row\" | \"group\" | \"ties\" | null,\n): ScopeRow[] {\n let peerFirst = index;\n let peerLast = index;\n while (peerFirst > 0 && rowsEqual(orderKeys[peerFirst]!, orderKeys[peerFirst - 1]!)) peerFirst--;\n while (peerLast + 1 < partition.length && rowsEqual(orderKeys[peerLast]!, orderKeys[peerLast + 1]!)) peerLast++;\n const rows: ScopeRow[] = [];\n for (let i = Math.max(0, start); i <= end && i < partition.length; i++) {\n if (exclude === \"current_row\" && i === index) continue;\n if (exclude === \"group\" && i >= peerFirst && i <= peerLast) continue;\n if (exclude === \"ties\" && i >= peerFirst && i <= peerLast && i !== index) continue;\n rows.push(partition[i]!);\n }\n return rows;\n}\n\nfunction compareScopes(\n a: ScopeRow,\n b: ScopeRow,\n order: OrderByItem[],\n env: ExecutionEnv,\n parent?: EvalContext,\n): number {\n for (const item of order) {\n const left = evalExpr(item.expr, env.createEvalContext(a, parent));\n const right = evalExpr(item.expr, env.createEvalContext(b, parent));\n const result = compareNullable(left, right, item, a);\n if (result !== 0) return result;\n }\n return 0;\n}\n\nfunction compareOutput(\n a: OutputRow,\n b: OutputRow,\n order: OrderByItem[],\n columns: string[],\n env: ExecutionEnv,\n parent?: EvalContext,\n): number {\n for (const item of order) {\n const value = (row: OutputRow): SqlValue => {\n if (item.expr.type === \"literal\" && typeof item.expr.value === \"number\" && Number.isInteger(item.expr.value)) {\n return row.values[item.expr.value - 1] ?? null;\n }\n if (item.expr.type === \"column\" && item.expr.table === null) {\n const requestedName = item.expr.name.toLowerCase();\n const index = columns.findIndex((name) => name.toLowerCase() === requestedName);\n if (index >= 0) return row.values[index] ?? null;\n }\n return evalExpr(item.expr, env.createEvalContext(row.scope, parent));\n };\n const result = compareNullable(value(a), value(b), item, a.scope);\n if (result !== 0) return result;\n }\n return 0;\n}\n\nfunction compareNullable(left: SqlValue, right: SqlValue, item: OrderByItem, scope?: ScopeRow): number {\n if (left === null || right === null) {\n if (left === right) return 0;\n const nullFirst = item.nulls ? item.nulls === \"FIRST\" : item.dir === \"ASC\";\n return (left === null ? -1 : 1) * (nullFirst ? 1 : -1);\n }\n let collation: string | null = null;\n if (item.expr.type === \"collate\") collation = item.expr.collation;\n else if (scope && item.expr.type === \"column\") {\n const key = item.expr.name.toLowerCase();\n const match = scope.cells.find(\n (cell) =>\n cell.name.toLowerCase() === key &&\n item.expr.type === \"column\" &&\n (item.expr.table === null || cell.table?.toLowerCase() === item.expr.table.toLowerCase()),\n );\n collation = match?.collate ?? null;\n }\n const comparison = collation ? compareWithCollation(left, right, collation) : compareSql(left, right);\n return (comparison ?? 0) * (item.dir === \"DESC\" ? -1 : 1);\n}\n\nfunction resultColumnNames(columns: ResultColumn[], sample?: ScopeRow): string[] {\n const names: string[] = [];\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const cell of sample?.cells ?? []) {\n if (\n (column.table !== null || !cell.hiddenByUsing) &&\n (column.table === null || cell.table?.toLowerCase() === column.table.toLowerCase())\n )\n names.push(cell.name);\n }\n } else if (\n !column.alias &&\n column.expr.type === \"column\" &&\n [\"rowid\", \"_rowid_\", \"oid\"].includes(column.expr.name.toLowerCase()) &&\n sample?.rowidName\n ) {\n names.push(sample.rowidName);\n } else names.push(column.alias ?? expressionName(column.expr));\n }\n return names;\n}\n\nfunction compareCompoundRows(left: SqlValue[], right: SqlValue[], order: OrderByItem[], columns: string[]): number {\n for (const item of order) {\n let index = -1;\n if (item.expr.type === \"literal\" && typeof item.expr.value === \"number\" && Number.isInteger(item.expr.value)) {\n index = item.expr.value - 1;\n } else if (item.expr.type === \"column\" && item.expr.table === null) {\n const requested = item.expr.name.toLowerCase();\n index = columns.findIndex((name) => name.toLowerCase() === requested);\n }\n if (index < 0) throw new SqliteError(\"ORDER BY term does not match any column in the result set\", \"other\");\n const result = compareNullable(left[index] ?? null, right[index] ?? null, item);\n if (result !== 0) return result;\n }\n return 0;\n}\n\nfunction validateProjectedColumns(stmt: SelectStmt, sample: ScopeRow, env: ExecutionEnv, parent?: EvalContext): void {\n const ctx = env.createEvalContext({ ...sample, rowid: 1, rowidName: sample.rowidName }, parent);\n const visit = (expr: Expr): void => {\n if (expr.type === \"column\") {\n if (expr.name !== \"*\") ctx.resolveColumn(expr.table, expr.name);\n return;\n }\n const recurse = (item: Expr) => visit(item);\n switch (expr.type) {\n case \"unary\":\n recurse(expr.expr);\n break;\n case \"binary\":\n recurse(expr.left);\n recurse(expr.right);\n break;\n case \"between\":\n recurse(expr.expr);\n recurse(expr.lower);\n recurse(expr.upper);\n break;\n case \"in\":\n recurse(expr.expr);\n if (Array.isArray(expr.values)) expr.values.forEach(recurse);\n break;\n case \"like\":\n recurse(expr.expr);\n recurse(expr.pattern);\n if (expr.escape) recurse(expr.escape);\n break;\n case \"function\":\n case \"aggregate\":\n if (expr.args !== \"*\") expr.args.forEach(recurse);\n if (expr.filter) recurse(expr.filter);\n break;\n case \"window\":\n if (expr.func.args !== \"*\") expr.func.args.forEach(recurse);\n break;\n case \"case\":\n if (expr.base) recurse(expr.base);\n expr.whens.forEach((branch) => {\n recurse(branch.when);\n recurse(branch.then);\n });\n if (expr.else) recurse(expr.else);\n break;\n case \"cast\":\n case \"collate\":\n recurse(expr.expr);\n break;\n case \"row\":\n expr.values.forEach(recurse);\n break;\n }\n };\n for (const column of stmt.columns) if (column.type === \"expr\") visit(column.expr);\n}\n\nfunction expressionName(expr: Expr): string {\n if (expr.type === \"column\") return expr.name;\n if (expr.type === \"literal\") {\n if (expr.value === null) return \"NULL\";\n if (expr.value instanceof Uint8Array)\n return `X'${Array.from(expr.value)\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase()}'`;\n return typeof expr.value === \"string\" ? `'${expr.value.replaceAll(\"'\", \"''\")}'` : String(expr.value);\n }\n if (expr.type === \"null\") return \"NULL\";\n if (expr.type === \"function\" || expr.type === \"aggregate\") {\n if (expr.args === \"*\") return `${expr.name.toLowerCase()}(*)`;\n const args = expr.args.map((arg) => expressionName(arg)).join(\", \");\n return `${expr.name.toLowerCase()}(${args})`;\n }\n if (expr.type === \"binary\") {\n return `${expressionName(expr.left)} ${expr.op} ${expressionName(expr.right)}`;\n }\n return expr.type;\n}\n\nfunction replaceSpecial(expr: Expr, evaluate: (expr: AggregateExpr | WindowExpr) => SqlValue): Expr {\n if (expr.type === \"aggregate\" || expr.type === \"window\") return { type: \"literal\", value: evaluate(expr) };\n const recurse = (item: Expr) => replaceSpecial(item, evaluate);\n switch (expr.type) {\n case \"unary\":\n return { ...expr, expr: recurse(expr.expr) };\n case \"binary\":\n return { ...expr, left: recurse(expr.left), right: recurse(expr.right) };\n case \"between\":\n return { ...expr, expr: recurse(expr.expr), lower: recurse(expr.lower), upper: recurse(expr.upper) };\n case \"in\":\n return {\n ...expr,\n expr: recurse(expr.expr),\n values: Array.isArray(expr.values) ? expr.values.map(recurse) : expr.values,\n };\n case \"like\":\n return {\n ...expr,\n expr: recurse(expr.expr),\n pattern: recurse(expr.pattern),\n escape: expr.escape && recurse(expr.escape),\n };\n case \"function\":\n return {\n ...expr,\n args: expr.args === \"*\" ? \"*\" : expr.args.map(recurse),\n filter: expr.filter && recurse(expr.filter),\n };\n case \"case\":\n return {\n ...expr,\n base: expr.base && recurse(expr.base),\n whens: expr.whens.map(({ when, then: thenExpr }) => {\n // biome-ignore lint/suspicious/noThenProperty: CASE WHEN/THEN AST field, not a thenable\n return { when: recurse(when), then: recurse(thenExpr) };\n }),\n else: expr.else && recurse(expr.else),\n };\n case \"cast\":\n return { ...expr, expr: recurse(expr.expr) };\n case \"row\":\n return { ...expr, values: expr.values.map(recurse) };\n case \"collate\":\n return { ...expr, expr: recurse(expr.expr) };\n default:\n return expr;\n }\n}\n\nfunction containsAggregate(expr: Expr): boolean {\n let found = false;\n replaceSpecial(expr, (special) => {\n if (special.type === \"aggregate\") found = true;\n return null;\n });\n return found;\n}\n\nfunction referencesTable(select: SelectStmt, name: string): boolean {\n const target = name.toLowerCase();\n const visit = (item: FromItem | null): boolean => {\n if (!item) return false;\n if (item.type === \"table\") return item.name.toLowerCase() === target;\n if (item.type === \"join\") return visit(item.left) || visit(item.right);\n return item.type === \"subquery\" ? referencesTable(item.select, name) : false;\n };\n return visit(select.from) || (select.compound ? referencesTable(select.compound.select, name) : false);\n}\n\nfunction rowsEqual(left: SqlValue[], right: SqlValue[]): boolean {\n return (\n left.length === right.length &&\n left.every((value, index) => {\n const other = right[index] ?? null;\n return (value === null && other === null) || (value !== null && other !== null && sqlValueEquals(value, other));\n })\n );\n}\n\nfunction uniqueRows(rows: SqlValue[][]): SqlValue[][] {\n const seen = new Set<string>();\n const result: SqlValue[][] = [];\n for (const row of rows) {\n const key = valueKey(row);\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(row);\n }\n return result;\n}\n\nfunction valueKey(values: SqlValue[]): string {\n return values.map(valueKeyPart).join(\"\\0\");\n}\n\nfunction valueKeyPart(value: SqlValue): string {\n if (value === null) return \"N\";\n if (typeof value === \"bigint\") return `I:${value.toString()}`;\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) return `I:${value.toString()}`;\n if (Number.isNaN(value)) return \"F:nan\";\n return `F:${Object.is(value, -0) ? \"0\" : value.toString()}`;\n }\n if (typeof value === \"string\") return `T:${value}`;\n if (value instanceof Uint8Array) {\n let hex = \"B:\";\n for (const byte of value) hex += byte.toString(16).padStart(2, \"0\");\n return hex;\n }\n if (\"value\" in value && typeof value.value === \"number\") {\n const n = value.value;\n if (Number.isInteger(n)) return `I:${n.toString()}`;\n return `F:${n.toString()}`;\n }\n if (\"value\" in value && typeof value.value === \"string\") return `T:${value.value}`;\n return `T:${String(value)}`;\n}\n\nfunction scanDbStat(db: DatabaseState, alias: string, _schemaArg: string | null): ScopeRow[] {\n const rows: ScopeRow[] = [];\n let pageno = 1;\n const push = (name: string, pagetype: string, ncell: number) => {\n rows.push({\n cells: [\n { table: alias, name: \"name\", value: name },\n { table: alias, name: \"path\", value: \"/\" },\n { table: alias, name: \"pageno\", value: pageno++ },\n { table: alias, name: \"pagetype\", value: pagetype },\n { table: alias, name: \"ncell\", value: ncell },\n { table: alias, name: \"payload\", value: ncell * 8 },\n { table: alias, name: \"unused\", value: 0 },\n { table: alias, name: \"mx_payload\", value: 0 },\n { table: alias, name: \"pgoffset\", value: (pageno - 1) * 4096 },\n { table: alias, name: \"pgsize\", value: 4096 },\n ],\n });\n };\n push(\"sqlite_schema\", \"leaf\", db.tables.size + db.views.size + db.virtualTables.size);\n for (const table of db.tables.values()) {\n push(table.name, \"leaf\", [...table.scan()].length);\n }\n for (const table of db.virtualTables.values()) {\n if (table.kind === \"fts5\" || table.kind === \"fts3\" || table.kind === \"fts4\" || table.kind === \"rtree\") {\n push(table.name, \"leaf\", table.kind === \"rtree\" ? table.rows.size : table.rows.size);\n } else {\n push(table.name, \"leaf\", 0);\n }\n }\n return rows;\n}\n\nfunction scanFtsVocab(db: DatabaseState, alias: string, vocab: FtsVocabVirtualTable): ScopeRow[] {\n const fts = db.virtualTables.get(vocab.ftsTable.toLowerCase());\n if (!fts || (fts.kind !== \"fts5\" && fts.kind !== \"fts3\" && fts.kind !== \"fts4\")) return [];\n return fts.vocabRows(\"row\").map((record) => ({\n cells: vocab.columns.map((column) => ({\n table: alias,\n name: column,\n value: record[column] ?? (column === \"col\" ? \"*\" : column === \"offset\" ? 0 : null),\n })),\n }));\n}\n", "import type {\n AlterTableStmt,\n CreateIndexStmt,\n CreateTableStmt,\n CreateViewStmt,\n DropIndexStmt,\n DropTableStmt,\n DropViewStmt,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport { makeColumnInfo } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport { isTruthySql } from \"../types/value.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { emptyResult, type ResultSet, resultValues } from \"./result.ts\";\nimport { executeSelect } from \"./select.ts\";\n\nexport function executeCreateTable(stmt: CreateTableStmt, env: ExecutionEnv): ResultSet {\n if (!stmt.asSelect) {\n env.state.createTable(stmt);\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n }\n const result = executeSelect(stmt.asSelect, env);\n const columns = result.columns.map((name) => ({ name, typeName: null, constraints: [] }));\n const table = env.state.createTable({ ...stmt, columns, constraints: [], asSelect: null });\n for (const values of resultValues(result)) {\n table.insert(\n new Map(table.columns.map((column, index) => [normalizeColumnName(column.name), values[index] ?? null])),\n );\n }\n // Populate any autoindexes created with the empty table.\n const db = env.state.databaseForTable(table);\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index) continue;\n index.store.clear();\n for (const row of table.scan()) {\n index.store.insert(\n index.columns.map((column) =>\n normalizeForCollation(row.values.get(normalizeColumnName(column.name)) ?? null, column.collate ?? \"BINARY\"),\n ),\n row.rowid,\n index.unique,\n );\n }\n }\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeCreateIndex(stmt: CreateIndexStmt, env: ExecutionEnv): ResultSet {\n const index = env.state.createIndex(stmt);\n const table = env.state.getTable(stmt.table);\n try {\n for (const row of table.scan()) {\n const ctx = env.createEvalContext({\n rowid: row.rowid,\n sourceTable: table.name,\n cells: table.columns.map((column) => ({\n table: table.name,\n name: column.name,\n value: row.values.get(normalizeColumnName(column.name)) ?? null,\n })),\n });\n if (stmt.where && isTruthySql(evalExpr(stmt.where, ctx)) !== true) continue;\n index.store.insert(\n stmt.columns.map((column) => {\n const raw = column.expr\n ? evalExpr(column.expr, ctx)\n : (row.values.get(normalizeColumnName(column.name)) ?? null);\n return normalizeForCollation(raw, column.collate ?? \"BINARY\");\n }),\n row.rowid,\n stmt.unique,\n );\n }\n } catch (error) {\n env.state.dropIndex(stmt.name, true);\n throw error;\n }\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeAlterTable(stmt: AlterTableStmt, env: ExecutionEnv): ResultSet {\n const table = env.state.getWritableTable(stmt.table);\n const action = stmt.action;\n if (action.kind === \"rename_table\") {\n env.state.renameTable(stmt.table, action.newName);\n } else if (action.kind === \"rename_column\") {\n const column = table.columns.find((item) => item.name.toLowerCase() === action.oldName.toLowerCase());\n if (!column) throw new SqliteError(`no such column: ${action.oldName}`, \"no_such_column\");\n if (table.columns.some((item) => item.name.toLowerCase() === action.newName.toLowerCase()))\n throw new SqliteError(`duplicate column name: ${action.newName}`, \"other\");\n const oldKey = normalizeColumnName(column.name);\n column.name = action.newName;\n column.nameLower = action.newName.toLowerCase();\n for (const row of table.rows.values()) {\n const value = row.values.get(oldKey) ?? null;\n row.values.delete(oldKey);\n row.values.set(normalizeColumnName(action.newName), value);\n }\n for (const constraint of table.constraints) renameConstraintColumn(constraint, action.oldName, action.newName);\n for (const name of table.indexes) {\n const index = env.state.getWritableIndex(name);\n if (index)\n for (const indexed of index.columns)\n if (indexed.name.toLowerCase() === action.oldName.toLowerCase()) indexed.name = action.newName;\n }\n table.clearEqualityHashes();\n env.state.schemaVersion++;\n } else if (action.kind === \"add_column\") {\n if (table.columns.some((item) => item.name.toLowerCase() === action.column.name.toLowerCase()))\n throw new SqliteError(`duplicate column name: ${action.column.name}`, \"other\");\n const primary = action.column.constraints.some((item) => item.type === \"primary_key\");\n const unique = action.column.constraints.some((item) => item.type === \"unique\");\n if ((primary || unique) && table.rows.size > 0)\n throw new SqliteError(\"Cannot add a PRIMARY KEY or UNIQUE column\", \"other\");\n const defaultExpr = action.column.constraints.find((item) => item.type === \"default\")?.expr ?? null;\n const collate = action.column.constraints.find((item) => item.type === \"collate\");\n const generated = action.column.constraints.find((item) => item.type === \"generated\");\n const column = makeColumnInfo(action.column.name, action.column.typeName, {\n notNull: action.column.constraints.some((item) => item.type === \"not_null\"),\n primaryKey: primary,\n unique,\n defaultExpr,\n collate: collate?.type === \"collate\" ? collate.name : null,\n generated: generated?.type === \"generated\" ? { expr: generated.expr, stored: generated.stored } : null,\n });\n const defaultValue = defaultExpr ? evalExpr(defaultExpr, env.createEvalContext()) : null;\n if (column.notNull && defaultValue === null && table.rows.size > 0)\n throw new SqliteError(\"Cannot add a NOT NULL column with default value NULL\", \"other\");\n table.columns.push(column);\n for (const row of table.rows.values()) row.values.set(normalizeColumnName(column.name), defaultValue);\n table.clearEqualityHashes();\n env.state.schemaVersion++;\n } else {\n const index = table.columns.findIndex((item) => item.name.toLowerCase() === action.name.toLowerCase());\n if (index < 0) throw new SqliteError(`no such column: ${action.name}`, \"no_such_column\");\n if (table.columns.length === 1)\n throw new SqliteError(\"cannot drop column: table must have at least one column\", \"other\");\n const column = table.columns[index]!;\n if (column.primaryKey) {\n throw new SqliteError(`cannot drop PRIMARY KEY or UNIQUE column: ${action.name}`, \"other\");\n }\n if (column.unique) {\n throw new SqliteError(`cannot drop UNIQUE column: \"${action.name}\"`, \"other\");\n }\n if (\n table.constraints.some(\n (item) =>\n (item.type === \"primary_key\" || item.type === \"unique\") &&\n item.columns.some((part) => part.name.toLowerCase() === action.name.toLowerCase()),\n )\n ) {\n throw new SqliteError(\n `error in table ${stmt.table} after drop column: no such column: ${action.name}`,\n \"no_such_column\",\n );\n }\n for (const name of table.indexes) {\n const schemaIndex = env.state.indexes.get(name.toLowerCase());\n if (schemaIndex?.columns.some((part) => part.name.toLowerCase() === action.name.toLowerCase())) {\n throw new SqliteError(\n `error in index ${name} after drop column: no such column: ${action.name}`,\n \"no_such_column\",\n );\n }\n }\n table.columns.splice(index, 1);\n for (const row of table.rows.values()) row.values.delete(normalizeColumnName(action.name));\n table.clearEqualityHashes();\n env.state.schemaVersion++;\n }\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropTable(stmt: DropTableStmt, env: ExecutionEnv): ResultSet {\n env.state.dropTable(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropIndex(stmt: DropIndexStmt, env: ExecutionEnv): ResultSet {\n env.state.dropIndex(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeCreateView(stmt: CreateViewStmt, env: ExecutionEnv): ResultSet {\n env.state.createView(stmt);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropView(stmt: DropViewStmt, env: ExecutionEnv): ResultSet {\n env.state.dropView(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nfunction renameConstraintColumn(\n constraint: import(\"../ast/nodes.ts\").TableConstraint,\n oldName: string,\n newName: string,\n): void {\n if (constraint.type === \"primary_key\" || constraint.type === \"unique\") {\n for (const column of constraint.columns)\n if (column.name.toLowerCase() === oldName.toLowerCase()) column.name = newName;\n } else if (constraint.type === \"foreign_key\") {\n constraint.columns = constraint.columns.map((name) =>\n name.toLowerCase() === oldName.toLowerCase() ? newName : name,\n );\n }\n}\n", "import type { Expr } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { IndexStore } from \"../indexes/index.ts\";\nimport type { Row, Rowid } from \"../storage/row.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport type { ColumnInfo, Table } from \"../storage/table.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport { isTruthySql } from \"../types/value.ts\";\n\nexport type CheckEvaluator = (expr: Expr, row: Row) => SqlValue;\n\nexport function checkNotNull(columns: readonly ColumnInfo[], row: Row, tableName = \"table\"): void {\n for (const column of columns) {\n if (!column.notNull) continue;\n if ((row.values.get(normalizeColumnName(column.name)) ?? null) === null) {\n throw new SqliteError(\n `NOT NULL constraint failed: ${tableName}.${column.name}`,\n \"constraint_notnull\",\n \"SQLITE_CONSTRAINT_NOTNULL\",\n );\n }\n }\n}\n\nexport function checkPrimaryKey(columns: readonly ColumnInfo[], row: Row, tableName = \"table\"): void {\n for (const column of columns) {\n if (!column.primaryKey) continue;\n if ((row.values.get(normalizeColumnName(column.name)) ?? null) === null) {\n throw new SqliteError(\n `PRIMARY KEY constraint failed: ${tableName}.${column.name}`,\n \"constraint_primary\",\n \"SQLITE_CONSTRAINT_PRIMARYKEY\",\n );\n }\n }\n}\n\nexport function checkUnique(index: IndexStore, values: readonly SqlValue[], rowid?: Rowid): void {\n index.checkUnique(values, rowid);\n}\n\nexport function checkExpressions(\n expressions: readonly Expr[],\n row: Row,\n evaluate: CheckEvaluator,\n constraintName = \"CHECK\",\n): void {\n for (const expression of expressions) {\n const result = evaluate(expression, row);\n if (result !== null && isTruthySql(result) === false) {\n throw new SqliteError(\n `CHECK constraint failed: ${constraintName}`,\n \"constraint_check\",\n \"SQLITE_CONSTRAINT_CHECK\",\n );\n }\n }\n}\n\nexport function checkTableConstraints(table: Table, row: Row, evaluate: CheckEvaluator): void {\n checkNotNull(table.columns, row, table.name);\n checkPrimaryKey(table.columns, row, table.name);\n for (const constraint of table.constraints) {\n if (constraint.type !== \"check\") continue;\n checkExpressions([constraint.expr], row, evaluate, constraint.name ?? table.name);\n }\n}\n", "import type { CreateTriggerStmt, DropTriggerStmt, Statement } from \"../ast/nodes.ts\";\nimport { SqliteError, TriggerRaiseError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport type { TriggerInfo } from \"../storage/database-state.ts\";\nimport { splitQualifiedName } from \"../storage/database-state.ts\";\nimport type { Row } from \"../storage/row.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { isTruthySql, type SqlValue } from \"../types/value.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"./env.ts\";\nimport { executeStatement } from \"./execute.ts\";\nimport { emptyResult, type ResultSet } from \"./result.ts\";\n\nconst MAX_TRIGGER_DEPTH = 1000;\n\nexport function executeCreateTrigger(stmt: CreateTriggerStmt, env: ExecutionEnv): ResultSet {\n const { schema, bare } = splitQualifiedName(stmt.name);\n const target = schema !== null ? env.state.databaseForSchema(schema, stmt.name) : env.state;\n const existing = target.triggers.get(bare.toLowerCase());\n if (existing && stmt.ifNotExists) {\n return emptyResult(0, env.state.lastInsertRowid);\n }\n\n const tableKey = splitQualifiedName(stmt.table).bare.toLowerCase();\n const isView = target.views.has(tableKey);\n const isTable = target.tables.has(tableKey);\n if (stmt.timing === \"INSTEAD\") {\n if (!isView) throw new SqliteError(`cannot create INSTEAD OF trigger on table: ${stmt.table}`, \"other\");\n } else if (isView) {\n throw new SqliteError(`cannot create ${stmt.timing} trigger on view: ${stmt.table}`, \"other\");\n } else if (!isTable) {\n throw new SqliteError(`no such table: ${stmt.table}`, \"no_such_table\");\n }\n\n if (existing) throw new SqliteError(`object already exists: ${bare}`, \"other\");\n\n target.createTrigger({\n name: bare,\n tableName: splitQualifiedName(stmt.table).bare,\n timing: stmt.timing,\n event: stmt.event,\n when: stmt.when,\n forEachRow: stmt.forEachRow,\n body: stmt.body,\n updateColumns: stmt.updateColumns,\n originalSql: null,\n });\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropTrigger(stmt: DropTriggerStmt, env: ExecutionEnv): ResultSet {\n env.state.dropTrigger(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function fireInsertTriggers(\n timing: \"BEFORE\" | \"AFTER\" | \"INSTEAD\",\n table: Table,\n values: Map<string, SqlValue>,\n oldRow: Row | null,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n return runTriggers(table, \"INSERT\", timing, oldRow, values, null, env);\n}\n\nexport function fireUpdateTriggers(\n timing: \"BEFORE\" | \"AFTER\",\n table: Table,\n oldRow: Row,\n newValues: Map<string, SqlValue>,\n updatedColumns: Set<string>,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n return runTriggers(table, \"UPDATE\", timing, oldRow, newValues, updatedColumns, env);\n}\n\nexport function fireDeleteTriggers(\n timing: \"BEFORE\" | \"AFTER\",\n table: Table,\n oldRow: Row,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n return runTriggers(table, \"DELETE\", timing, oldRow, null, null, env);\n}\n\nfunction runTriggers(\n table: Table,\n event: TriggerInfo[\"event\"],\n timing: TriggerInfo[\"timing\"],\n oldRow: Row | null,\n newValues: Map<string, SqlValue> | null,\n updatedColumns: Set<string> | null,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n const db = env.state.databaseForTable(table);\n if (db.triggers.size === 0) return \"ok\";\n const triggers = [...db.triggers.values()].filter(\n (trigger) =>\n trigger.tableName.toLowerCase() === table.name.toLowerCase() &&\n trigger.event === event &&\n trigger.timing === timing,\n );\n\n for (const trigger of triggers) {\n if (event === \"UPDATE\" && trigger.updateColumns) {\n const watched = new Set(trigger.updateColumns.map((name) => name.toLowerCase()));\n if (!updatedColumns || ![...updatedColumns].some((name) => watched.has(name.toLowerCase()))) continue;\n }\n if (trigger.when) {\n const scope = triggerScope(table, oldRow, newValues);\n if (isTruthySql(evalExpr(trigger.when, env.createEvalContext(scope))) !== true) continue;\n }\n const result = executeTriggerProgram(trigger, table, oldRow, newValues, env);\n if (result === \"ignore\") return \"ignore\";\n }\n return \"ok\";\n}\n\nfunction executeTriggerProgram(\n trigger: TriggerInfo,\n table: Table,\n oldRow: Row | null,\n newValues: Map<string, SqlValue> | null,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n if (env.triggerDepth >= MAX_TRIGGER_DEPTH) {\n throw new SqliteError(\"too many levels of trigger recursion\", \"other\");\n }\n env.triggerDepth++;\n const savedScope = env.triggerScope;\n env.triggerScope = triggerScope(table, oldRow, newValues);\n try {\n for (const statement of trigger.body) {\n executeTriggerStatement(statement, env);\n }\n return \"ok\";\n } catch (error) {\n if (error instanceof TriggerRaiseError) {\n if (error.action === \"IGNORE\") return \"ignore\";\n if (error.action === \"ROLLBACK\") {\n env.transactions.rollback();\n throw error;\n }\n throw error;\n }\n throw error;\n } finally {\n env.triggerScope = savedScope;\n env.triggerDepth--;\n }\n}\n\nfunction executeTriggerStatement(statement: Statement, env: ExecutionEnv): void {\n executeStatement(statement, env);\n}\n\nfunction triggerScope(table: Table, oldRow: Row | null, newValues: Map<string, SqlValue> | null): ScopeRow {\n const cells: ScopeRow[\"cells\"] = [];\n for (const column of table.columns) {\n const key = normalizeColumnName(column.name);\n cells.push({\n table: \"old\",\n name: column.name,\n value: oldRow ? (oldRow.values.get(key) ?? null) : null,\n affinity: column.affinity,\n collate: column.collate,\n });\n cells.push({\n table: \"new\",\n name: column.name,\n value: newValues ? (newValues.get(key) ?? null) : null,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n return {\n cells,\n rowid: oldRow?.rowid ?? undefined,\n sourceTable: table.name,\n };\n}\n", "import type { CreateVirtualTableStmt } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport type { Fts5VirtualTable } from \"../vtable/fts5.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { emptyResult, type ResultSet } from \"./result.ts\";\n\nexport function executeCreateVirtualTable(stmt: CreateVirtualTableStmt, env: ExecutionEnv): ResultSet {\n env.state.createVirtualTable(stmt);\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeFtsInsert(\n table: Fts5VirtualTable,\n columnNames: string[],\n sourceRows: SqlValue[][],\n env: ExecutionEnv,\n): { changes: number; lastInsertRowid: number | bigint } {\n let changes = 0;\n let last = env.state.lastInsertRowid;\n for (const source of sourceRows) {\n if (source.length !== columnNames.length) {\n throw new SqliteError(`${source.length} values for ${columnNames.length} columns`, \"other\");\n }\n const values = new Map<string, SqlValue>();\n let explicitRowid: number | bigint | undefined;\n for (let i = 0; i < columnNames.length; i++) {\n const name = columnNames[i]!;\n const lower = name.toLowerCase();\n const value = source[i] ?? null;\n if (lower === \"rowid\" || lower === \"_rowid_\" || lower === \"oid\") {\n if (typeof value === \"number\" || typeof value === \"bigint\") explicitRowid = value;\n else if (value !== null) explicitRowid = Number(value);\n continue;\n }\n values.set(normalizeColumnName(name), value);\n }\n for (const column of table.columns) {\n const key = normalizeColumnName(column);\n if (!values.has(key) && !columnNames.some((n) => n.toLowerCase() === key)) {\n values.set(key, null);\n }\n }\n const rowid = table.insert(values, explicitRowid);\n // Special commands don't change row counts the same way \u2014 still count as a write\n changes++;\n last = rowid;\n }\n return { changes, lastInsertRowid: last };\n}\n\nexport function executeFtsUpdate(\n table: Fts5VirtualTable,\n updates: Map<string, SqlValue>,\n rowids: Iterable<number | bigint>,\n): number {\n let changes = 0;\n for (const rowid of rowids) {\n table.update(rowid, updates);\n changes++;\n }\n return changes;\n}\n\nexport function executeFtsDelete(table: Fts5VirtualTable, rowids: Iterable<number | bigint>): number {\n let changes = 0;\n for (const rowid of rowids) {\n table.delete(rowid);\n changes++;\n }\n return changes;\n}\n", "import type { DeleteStmt, Expr, IndexedColumn, InsertStmt, ResultColumn, SetItem, UpdateStmt } from \"../ast/nodes.ts\";\nimport { checkTableConstraints } from \"../constraints/check.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { exprEquals } from \"../expressions/equals.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport type { Row, Rowid } from \"../storage/row.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport { tryIndexedTableRows } from \"../planner/access.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport { applyStrictValue } from \"../types/strict.ts\";\nimport { applyAffinity, compareSql, isTruthySql, type SqlValue } from \"../types/value.ts\";\nimport type { Fts5Row, Fts5VirtualTable } from \"../vtable/fts5.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"./env.ts\";\nimport { emptyResult, type ResultSet, resultValues, valuesToResult } from \"./result.ts\";\nimport { executeSelect, scanFrom } from \"./select.ts\";\nimport { fireDeleteTriggers, fireInsertTriggers, fireUpdateTriggers } from \"./triggers.ts\";\nimport { executeFtsDelete, executeFtsInsert, executeFtsUpdate } from \"./vtable.ts\";\n\nfunction storeColumnValue(\n table: Table,\n column: { name: string; typeName: string | null; affinity: import(\"../types/value.ts\").Affinity },\n value: SqlValue,\n): SqlValue {\n if (table.strict) return applyStrictValue(value, column.typeName ?? \"\", table.name, column.name);\n return applyAffinity(value, column.affinity);\n}\n\nexport function executeInsert(stmt: InsertStmt, env: ExecutionEnv): ResultSet {\n if (env.state.isVirtualTable(stmt.table)) {\n return executeVirtualInsert(stmt, env);\n }\n const fast = tryFastInsert(stmt, env);\n if (fast) return fast;\n const table = env.state.getWritableTable(stmt.table);\n const columnNames = stmt.columns ?? table.columns.map((column) => column.name);\n const rowidIndexes = columnNames.map((name, index) => (isRowidName(name) ? index : -1)).filter((index) => index >= 0);\n if (rowidIndexes.length > 1) throw new SqliteError(\"duplicate column name: rowid\", \"other\");\n if (table.withoutRowid && rowidIndexes.length > 0) {\n throw new SqliteError(`table ${table.name} has no column named rowid`, \"other\");\n }\n for (const name of columnNames) if (!isRowidName(name)) columnOf(table, name);\n const sourceRows = evaluateInsertSource(stmt, env);\n const returningRows: SqlValue[][] = [];\n let changes = 0;\n let last = env.state.lastInsertRowid;\n const suppliedIndexes = table.columns.map((column) =>\n columnNames.findIndex((name) => name.toLowerCase() === (column.nameLower ?? column.name.toLowerCase())),\n );\n const unconstrained =\n table.isUnconstrained() &&\n !stmt.upsert &&\n stmt.mode === \"insert\" &&\n stmt.returning.length === 0 &&\n rowidIndexes.length === 0;\n\n if (unconstrained) {\n for (const source of sourceRows) {\n if (source.length !== columnNames.length)\n throw new SqliteError(`${source.length} values for ${columnNames.length} columns`, \"other\");\n const values = new Map<string, SqlValue>();\n for (let index = 0; index < table.columns.length; index++) {\n const column = table.columns[index]!;\n const suppliedIndex = suppliedIndexes[index]!;\n const value = suppliedIndex >= 0 ? (source[suppliedIndex] ?? null) : null;\n values.set(column.nameLower ?? column.name.toLowerCase(), storeColumnValue(table, column, value));\n }\n last = table.insert({ values }, { prepared: true, skipValidate: true });\n changes++;\n }\n env.state.recordChange(changes, last);\n return emptyResult(changes, last);\n }\n\n for (const source of sourceRows) {\n if (source.length !== columnNames.length)\n throw new SqliteError(`${source.length} values for ${columnNames.length} columns`, \"other\");\n const values = new Map<string, SqlValue>();\n for (const column of table.columns) {\n if (column.generated) continue;\n const suppliedIndex = suppliedIndexes[table.columns.indexOf(column)] ?? -1;\n const value =\n suppliedIndex >= 0\n ? (source[suppliedIndex] ?? null)\n : column.defaultExpr\n ? evalExpr(column.defaultExpr, env.createEvalContext())\n : null;\n values.set(column.nameLower ?? column.name.toLowerCase(), storeColumnValue(table, column, value));\n }\n for (const column of table.columns) {\n if (!column.generated) continue;\n if (columnNames.some((name) => name.toLowerCase() === column.name.toLowerCase())) {\n throw new SqliteError(`cannot INSERT into generated column \"${column.name}\"`, \"misuse\");\n }\n if (column.generated.stored) {\n const genCtx = env.createEvalContext({\n cells: table.columns\n .filter((c) => !c.generated || c === column)\n .flatMap((c) => {\n if (c.generated && c !== column) return [];\n if (c === column) return [];\n return [\n {\n table: table.name,\n name: c.name,\n value: values.get(normalizeColumnName(c.name)) ?? null,\n affinity: c.affinity,\n collate: c.collate,\n },\n ];\n }),\n });\n const computed = evalExpr(column.generated.expr, genCtx);\n values.set(normalizeColumnName(column.name), storeColumnValue(table, column, computed));\n } else {\n values.set(normalizeColumnName(column.name), null);\n }\n }\n\n if (fireInsertTriggers(\"BEFORE\", table, values, null, env) === \"ignore\") continue;\n\n const conflicts = conflictingRows(table, values, env);\n if (conflicts.length > 0) {\n if (stmt.upsert) {\n const targetConflicts = conflictsForUpsert(table, values, env, stmt.upsert);\n if (targetConflicts.length === 0) {\n // Conflict is on a different unique constraint than the ON CONFLICT target.\n throw new SqliteError(\n `UNIQUE constraint failed: ${table.name}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n if (stmt.upsert.action === \"nothing\") continue;\n const row = targetConflicts[0]!;\n const scope = scopeFor(table, row, stmt.table, env);\n const excluded: ScopeRow = {\n cells: table.columns.map((column) => ({\n table: \"excluded\",\n name: column.name,\n value: values.get(normalizeColumnName(column.name)) ?? null,\n })),\n };\n const merged = { cells: [...scope.cells, ...excluded.cells], rowid: row.rowid, sourceTable: table.name };\n const ctx = env.createEvalContext(merged);\n if (stmt.upsert.action.where && isTruthySql(evalExpr(stmt.upsert.action.where, ctx)) !== true) continue;\n const updates = evaluateSet(stmt.upsert.action.set, table, ctx);\n const updated = updateOne(table, row, updates, env);\n changes += 1 + updated.cascaded;\n if (stmt.returning.length)\n returningRows.push(projectReturning(stmt.returning, scopeFor(table, updated.row, stmt.table, env), env));\n continue;\n }\n const mode = stmt.mode;\n if (mode === \"insert_or_ignore\") continue;\n if (mode === \"replace\" || mode === \"insert_or_replace\") {\n for (const row of conflicts) removeOne(table, row, env);\n } else {\n throw new SqliteError(\n `UNIQUE constraint failed: ${table.name}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n }\n\n let insertedRowid: Rowid | undefined;\n try {\n const suppliedRowid = rowidIndexes.length ? asExplicitRowid(source[rowidIndexes[0]!] ?? null) : undefined;\n const rowid = table.insert({ values, rowid: suppliedRowid }, { prepared: true });\n insertedRowid = rowid;\n const row = table.rows.get(rowid)!;\n validateRow(table, row, env);\n if (table.indexes.length > 0) addIndexes(table, row, env);\n if (env.state.foreignKeysEnabled) checkForeignKeys(table, row, env);\n fireInsertTriggers(\"AFTER\", table, row.values, null, env);\n changes++;\n last = table.withoutRowid ? 0 : rowid;\n if (stmt.returning.length)\n returningRows.push(projectReturning(stmt.returning, scopeFor(table, row, stmt.table, env), env));\n } catch (error) {\n if (insertedRowid !== undefined) {\n const inserted = table.rows.get(insertedRowid);\n if (inserted) removeOne(table, inserted, env);\n }\n if (stmt.mode === \"insert_or_ignore\" && error instanceof SqliteError && error.category.startsWith(\"constraint\"))\n continue;\n throw error;\n }\n }\n env.state.recordChange(changes, last);\n if (stmt.returning.length === 0) return emptyResult(changes, last);\n return valuesToResult(returningNames(stmt.returning, table), returningRows, changes, last);\n}\n\nfunction evaluateInsertSource(stmt: InsertStmt, env: ExecutionEnv): SqlValue[][] {\n if (stmt.select) return resultValues(executeSelect({ ...stmt.select, with: stmt.with ?? stmt.select.with }, env));\n if (!stmt.values) return [[]];\n const ctx = env.createEvalContext();\n return stmt.values.map((items) =>\n items.map((expr) => {\n if (expr.type === \"parameter\") return env.getBoundParameter(expr.name);\n if (expr.type === \"literal\") return expr.value;\n if (expr.type === \"null\") return null;\n return evalExpr(expr, ctx);\n }),\n );\n}\n\ninterface FastInsertSlot {\n key: string;\n affinity: import(\"../types/value.ts\").Affinity;\n read: (env: ExecutionEnv) => SqlValue;\n}\n\ninterface FastInsertPlan {\n tableName: string;\n slots: FastInsertSlot[];\n}\n\nconst fastInsertPlans = new WeakMap<InsertStmt, FastInsertPlan>();\n\nfunction tryFastInsert(stmt: InsertStmt, env: ExecutionEnv): ResultSet | null {\n if (stmt.with || stmt.select || stmt.upsert || stmt.returning.length > 0 || stmt.mode !== \"insert\") return null;\n if (stmt.values?.length !== 1) return null;\n let plan = fastInsertPlans.get(stmt);\n if (!plan) {\n const built = buildFastInsertPlan(stmt, env);\n if (!built) return null;\n plan = built;\n fastInsertPlans.set(stmt, plan);\n }\n let table: Table;\n try {\n table = env.state.getWritableTable(plan.tableName);\n } catch {\n return null;\n }\n if (!table.isUnconstrained()) return null;\n const values = new Map<string, SqlValue>();\n for (const slot of plan.slots) values.set(slot.key, applyAffinity(slot.read(env), slot.affinity));\n const last = table.insert({ values }, { prepared: true, skipValidate: true });\n env.state.recordChange(1, last);\n return emptyResult(1, last);\n}\n\nfunction buildFastInsertPlan(stmt: InsertStmt, env: ExecutionEnv): FastInsertPlan | null {\n let table: Table;\n try {\n table = env.state.getTable(stmt.table);\n } catch {\n return null;\n }\n if (!table.isUnconstrained()) return null;\n const tuple = stmt.values?.[0];\n if (!tuple) return null;\n const columnNames = stmt.columns ?? table.columns.map((column) => column.name);\n if (tuple.length !== columnNames.length) return null;\n if (columnNames.some((name) => isRowidName(name))) return null;\n const slots: FastInsertSlot[] = [];\n for (const column of table.columns) {\n const key = column.nameLower ?? column.name.toLowerCase();\n const suppliedIndex = columnNames.findIndex((name) => name.toLowerCase() === key);\n if (suppliedIndex < 0) {\n if (column.defaultExpr) return null;\n slots.push({ key, affinity: column.affinity, read: () => null });\n continue;\n }\n const expr = tuple[suppliedIndex];\n if (!expr) return null;\n if (expr.type === \"parameter\") {\n const name = expr.name;\n slots.push({ key, affinity: column.affinity, read: (exec) => exec.getBoundParameter(name) });\n } else if (expr.type === \"literal\") {\n const value = expr.value;\n slots.push({ key, affinity: column.affinity, read: () => value });\n } else if (expr.type === \"null\") {\n slots.push({ key, affinity: column.affinity, read: () => null });\n } else return null;\n }\n return { tableName: stmt.table, slots };\n}\n\nexport function executeUpdate(stmt: UpdateStmt, env: ExecutionEnv): ResultSet {\n if (env.state.isVirtualTable(stmt.table)) {\n return executeVirtualUpdate(stmt, env);\n }\n const table = env.state.getWritableTable(stmt.table);\n const alias = stmt.alias ?? stmt.table;\n const candidates: { row: Row; scope: ScopeRow }[] = [];\n\n if (stmt.from) {\n const fromRows = scanFrom(stmt.from, env);\n for (const row of table.scan()) {\n const targetScope = scopeFor(table, row, alias, env);\n let matchedScope: ScopeRow | null = null;\n for (const fromRow of fromRows) {\n const joined: ScopeRow = {\n ...targetScope,\n cells: [...targetScope.cells, ...fromRow.cells],\n };\n if (stmt.where && isTruthySql(evalExpr(stmt.where, env.createEvalContext(joined))) !== true) continue;\n matchedScope = joined;\n break;\n }\n if (matchedScope) candidates.push({ row, scope: matchedScope });\n }\n } else {\n const indexed =\n stmt.where === null\n ? null\n : tryIndexedTableRows({ type: \"table\", schema: null, name: stmt.table, alias: stmt.alias }, stmt.where, env);\n const scanRows = indexed ? indexed.rows : table.scan();\n for (const row of scanRows) {\n const scope = scopeFor(table, row, alias, env);\n if (stmt.where && isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) !== true) continue;\n candidates.push({ row, scope });\n }\n }\n\n const returningRows: SqlValue[][] = [];\n let changes = 0;\n for (const { row, scope } of candidates) {\n const ctx = env.createEvalContext(scope);\n const updates = evaluateSet(stmt.set, table, ctx);\n const newValues = mergedValues(table, row, updates);\n const updatedColumns = new Set(\n [...updates.keys()].map((key) => {\n const column = table.columns.find((item) => normalizeColumnName(item.name) === key);\n return column?.name ?? key;\n }),\n );\n if (fireUpdateTriggers(\"BEFORE\", table, row, newValues, updatedColumns, env) === \"ignore\") continue;\n try {\n const updated = updateOne(table, row, updates, env);\n fireUpdateTriggers(\"AFTER\", table, row, updated.row.values, updatedColumns, env);\n changes += 1 + updated.cascaded;\n if (stmt.returning.length)\n returningRows.push(projectReturning(stmt.returning, scopeFor(table, updated.row, alias, env), env));\n } catch (error) {\n if (stmt.or === \"ignore\" && error instanceof SqliteError && error.category.startsWith(\"constraint\")) continue;\n throw error;\n }\n }\n env.state.recordChange(changes);\n return valuesToResult(returningNames(stmt.returning, table), returningRows, changes, env.state.lastInsertRowid);\n}\n\nexport function executeDelete(stmt: DeleteStmt, env: ExecutionEnv): ResultSet {\n if (env.state.isVirtualTable(stmt.table)) {\n return executeVirtualDelete(stmt, env);\n }\n const table = env.state.getWritableTable(stmt.table);\n const selectedSource =\n stmt.where === null\n ? null\n : tryIndexedTableRows({ type: \"table\", schema: null, name: stmt.table, alias: stmt.alias }, stmt.where, env);\n const selected = [...(selectedSource ? selectedSource.rows : table.scan())].filter((row) => {\n if (!stmt.where) return true;\n return (\n isTruthySql(evalExpr(stmt.where, env.createEvalContext(scopeFor(table, row, stmt.alias ?? stmt.table, env)))) ===\n true\n );\n });\n const returningRows: SqlValue[][] = [];\n let changes = 0;\n for (const row of selected) {\n if (fireDeleteTriggers(\"BEFORE\", table, row, env) === \"ignore\") continue;\n if (stmt.returning.length)\n returningRows.push(projectReturning(stmt.returning, scopeFor(table, row, stmt.alias ?? stmt.table, env), env));\n changes += applyReferentialDelete(table, row, env);\n removeOne(table, row, env);\n fireDeleteTriggers(\"AFTER\", table, row, env);\n changes++;\n }\n env.state.recordChange(changes);\n return valuesToResult(returningNames(stmt.returning, table), returningRows, changes, env.state.lastInsertRowid);\n}\n\nfunction mergedValues(table: Table, row: Row, updates: Map<string, SqlValue>): Map<string, SqlValue> {\n const values = new Map<string, SqlValue>();\n for (const column of table.columns) {\n const key = normalizeColumnName(column.name);\n values.set(key, updates.has(key) ? updates.get(key)! : (row.values.get(key) ?? null));\n }\n return values;\n}\n\nfunction evaluateSet(\n items: SetItem[],\n table: Table,\n ctx: ReturnType<ExecutionEnv[\"createEvalContext\"]>,\n): Map<string, SqlValue> {\n const updates = new Map<string, SqlValue>();\n for (const item of items) {\n if (item.columns.length === 1) {\n const column = columnOf(table, item.columns[0]!);\n if (column.generated) throw new SqliteError(`cannot UPDATE generated column \"${column.name}\"`, \"misuse\");\n updates.set(normalizeColumnName(column.name), storeColumnValue(table, column, evalExpr(item.expr, ctx)));\n continue;\n }\n if (item.expr.type !== \"row\" || item.expr.values.length !== item.columns.length) {\n throw new SqliteError(\n `${item.columns.length} columns assigned ${item.expr.type === \"row\" ? item.expr.values.length : 1} values`,\n \"other\",\n );\n }\n item.columns.forEach((name, index) => {\n const column = columnOf(table, name);\n if (column.generated) throw new SqliteError(`cannot UPDATE generated column \"${column.name}\"`, \"misuse\");\n updates.set(\n normalizeColumnName(column.name),\n storeColumnValue(table, column, evalExpr(item.expr.type === \"row\" ? item.expr.values[index]! : item.expr, ctx)),\n );\n });\n }\n return updates;\n}\n\nfunction updateOne(\n table: Table,\n row: Row,\n updates: Map<string, SqlValue>,\n env: ExecutionEnv,\n): { row: Row; cascaded: number } {\n const before = { rowid: row.rowid, values: new Map(row.values) };\n let after: Row | undefined;\n let indexesAdded = false;\n removeIndexes(table, before, env);\n try {\n const merged = new Map(row.values);\n for (const [name, value] of updates) merged.set(name, value);\n for (const column of table.columns) {\n if (!column.generated?.stored) continue;\n const genCtx = env.createEvalContext({\n cells: table.columns\n .filter((c) => !c.generated)\n .map((c) => ({\n table: table.name,\n name: c.name,\n value: merged.get(normalizeColumnName(c.name)) ?? null,\n affinity: c.affinity,\n collate: c.collate,\n })),\n });\n merged.set(\n normalizeColumnName(column.name),\n storeColumnValue(table, column, evalExpr(column.generated.expr, genCtx)),\n );\n }\n after = table.update(row.rowid, merged);\n if (!after) throw new SqliteError(`no such row: ${row.rowid}`, \"other\");\n validateRow(table, after, env);\n addIndexes(table, after, env);\n indexesAdded = true;\n checkForeignKeys(table, after, env);\n const cascaded = applyReferentialUpdate(table, before, after, env);\n return { row: after, cascaded };\n } catch (error) {\n if (after) {\n if (indexesAdded) removeIndexes(table, after, env);\n table.delete(after.rowid);\n }\n table.rows.set(before.rowid, before);\n if (table.withoutRowid) {\n // best-effort restore handled by table.update failure paths\n }\n addIndexes(table, before, env);\n throw error;\n }\n}\n\nfunction validateRow(table: Table, row: Row, env: ExecutionEnv): void {\n checkTableConstraints(table, row, (expr, candidate) =>\n evalExpr(expr, env.createEvalContext(scopeFor(table, candidate, table.name, env))),\n );\n}\n\nfunction addIndexes(table: Table, row: Row, env: ExecutionEnv): void {\n const db = env.state.databaseForTable(table);\n for (const name of table.indexes) {\n const found = db.indexes.get(name.toLowerCase());\n if (!found) continue;\n const index = db.ensureWritableIndex(found);\n if (\n index.where &&\n isTruthySql(evalExpr(index.where, env.createEvalContext(scopeFor(table, row, table.name, env)))) !== true\n )\n continue;\n index.store.insert(indexValues(index.columns, row, env, table), row.rowid, index.unique);\n }\n}\n\nfunction removeIndexes(table: Table, row: Row, env: ExecutionEnv): void {\n const db = env.state.databaseForTable(table);\n for (const name of table.indexes) {\n const found = db.indexes.get(name.toLowerCase());\n if (!found) continue;\n const index = db.ensureWritableIndex(found);\n index.store.remove(indexValues(index.columns, row, env, table), row.rowid);\n }\n}\n\nfunction removeOne(table: Table, row: Row, env: ExecutionEnv): void {\n removeIndexes(table, row, env);\n table.delete(row.rowid);\n}\n\nfunction conflictingRows(table: Table, values: Map<string, SqlValue>, env: ExecutionEnv): Row[] {\n return conflictsForSets(table, values, uniqueColumnSets(table, env), env);\n}\n\nfunction conflictsMatchingTarget(\n table: Table,\n values: Map<string, SqlValue>,\n env: ExecutionEnv,\n targetColumns: string[],\n): Row[] {\n const targetKeys = targetColumns.map((name) => normalizeColumnName(name));\n const matchingSets = uniqueColumnSets(table, env).filter((columns) => {\n if (columns.length !== targetKeys.length) return false;\n const setKeys = columns.map((column) => normalizeColumnName(column.name));\n return targetKeys.every((key) => setKeys.includes(key));\n });\n if (matchingSets.length === 0) {\n // Infer INTEGER PRIMARY KEY / rowid target.\n if (\n targetKeys.length === 1 &&\n (targetKeys[0] === \"rowid\" ||\n table.columns.some((column) => normalizeColumnName(column.name) === targetKeys[0] && column.primaryKey))\n ) {\n const pkSets = uniqueColumnSets(table, env).filter(\n (columns) =>\n columns.length === 1 &&\n (normalizeColumnName(columns[0]!.name) === targetKeys[0] ||\n table.columns.find((column) => normalizeColumnName(column.name) === normalizeColumnName(columns[0]!.name))\n ?.primaryKey),\n );\n return conflictsForSets(\n table,\n values,\n pkSets.length > 0 ? pkSets : [[{ name: targetColumns[0]!, collate: null, order: null }]],\n env,\n );\n }\n return [];\n }\n return conflictsForSets(table, values, matchingSets, env);\n}\n\nfunction conflictsForUpsert(\n table: Table,\n values: Map<string, SqlValue>,\n env: ExecutionEnv,\n upsert: NonNullable<InsertStmt[\"upsert\"]>,\n): Row[] {\n if (!upsert.targetColumns) return conflictingRows(table, values, env);\n const exprs = upsert.targetExprs;\n const hasExpr = exprs?.some((expr) => expr.type !== \"column\") ?? false;\n if (hasExpr && exprs) {\n const db = env.state.databaseForTable(table);\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index?.unique || index.columns.length !== exprs.length) continue;\n const matches = index.columns.every((column, i) => {\n const expr = exprs[i]!;\n if (column.expr) return exprEquals(column.expr, expr);\n return expr.type === \"column\" && expr.name.toLowerCase() === column.name.toLowerCase();\n });\n if (!matches) continue;\n if (upsert.targetWhere && index.where && !exprEquals(upsert.targetWhere, index.where)) continue;\n return conflictsForSets(table, values, [index.columns], env);\n }\n }\n return conflictsMatchingTarget(table, values, env, upsert.targetColumns.filter(Boolean));\n}\n\nfunction uniqueColumnSets(table: Table, env: ExecutionEnv): IndexedColumn[][] {\n const sets: IndexedColumn[][] = [];\n const seen = new Set<string>();\n const remember = (columns: IndexedColumn[]): void => {\n const key = columns.map((column) => normalizeColumnName(column.name)).join(\"\\0\");\n if (seen.has(key)) return;\n seen.add(key);\n sets.push(columns);\n };\n\n for (const indexName of table.indexes) {\n const index = env.state.databaseForTable(table).indexes.get(indexName.toLowerCase());\n if (index?.unique) remember(index.columns);\n }\n\n // INTEGER PRIMARY KEY / rowid uniqueness (no autoindex).\n const pk = table.integerPkColumn();\n if (pk) remember([{ name: pk.name, collate: pk.collate, order: null }]);\n\n // Fallback for any UNIQUE/PK constraints not yet covered by an index (legacy / edge cases).\n const hasTablePrimary = table.constraints.some((constraint) => constraint.type === \"primary_key\");\n for (const column of table.columns) {\n if (column.unique || (column.primaryKey && !hasTablePrimary)) {\n remember([{ name: column.name, collate: column.collate, order: null }]);\n }\n }\n for (const constraint of table.constraints) {\n if (constraint.type === \"unique\" || constraint.type === \"primary_key\") remember(constraint.columns);\n }\n return sets;\n}\n\nfunction conflictsForSets(\n table: Table,\n values: Map<string, SqlValue>,\n sets: IndexedColumn[][],\n env: ExecutionEnv,\n): Row[] {\n const found: Row[] = [];\n const seen = new Set<string>();\n const push = (row: Row): void => {\n const key = String(row.rowid);\n if (seen.has(key)) return;\n seen.add(key);\n found.push(row);\n };\n\n const db = env.state.databaseForTable(table);\n for (const columns of sets) {\n const desired = indexValuesFromMap(columns, values, table, env);\n if (desired.some((value) => value === null)) continue;\n\n // INTEGER PRIMARY KEY / rowid map.\n if (columns.length === 1) {\n const pk = table.integerPkColumn();\n if (pk && normalizeColumnName(columns[0]!.name) === normalizeColumnName(pk.name)) {\n const row = table.getByKey(desired[0]!);\n if (row) push(row);\n continue;\n }\n }\n\n // Prefer IndexStore lookup (autoindexes + CREATE INDEX).\n let usedIndex = false;\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index?.unique) continue;\n if (index.columns.length !== columns.length) continue;\n if (\n !index.columns.every((column, i) => normalizeColumnName(column.name) === normalizeColumnName(columns[i]!.name))\n ) {\n continue;\n }\n usedIndex = true;\n if (index.where && !indexWhereMatches(index.where, values, table, env)) continue;\n for (const rowid of index.store.lookup(desired)) {\n const row = table.get(rowid);\n if (row) push(row);\n }\n break;\n }\n if (usedIndex) continue;\n\n // Slow fallback: full scan (should be rare once autoindexes exist).\n for (const row of table.scan()) {\n const existing = indexValues(columns, row, env, table);\n if (desired.every((value, index) => compareSql(value, existing[index] ?? null) === 0)) push(row);\n }\n }\n return found;\n}\n\nfunction indexValues(columns: IndexedColumn[], row: Row, env?: ExecutionEnv, table?: Table): SqlValue[] {\n if (!env || !table) {\n return columns.map((column) =>\n normalizeForCollation(row.values.get(normalizeColumnName(column.name)) ?? null, column.collate ?? \"BINARY\"),\n );\n }\n const ctx = env.createEvalContext(scopeFor(table, row, table.name, env));\n return columns.map((column) => {\n const raw = column.expr ? evalExpr(column.expr, ctx) : (row.values.get(normalizeColumnName(column.name)) ?? null);\n return normalizeForCollation(raw, column.collate ?? \"BINARY\");\n });\n}\n\nfunction indexValuesFromMap(\n columns: IndexedColumn[],\n values: Map<string, SqlValue>,\n table: Table,\n env: ExecutionEnv,\n): SqlValue[] {\n const fake: Row = { rowid: 0, values };\n return indexValues(columns, fake, env, table);\n}\n\nfunction indexWhereMatches(where: Expr, values: Map<string, SqlValue>, table: Table, env: ExecutionEnv): boolean {\n const fake: Row = { rowid: 0, values };\n return isTruthySql(evalExpr(where, env.createEvalContext(scopeFor(table, fake, table.name, env)))) === true;\n}\n\nfunction checkForeignKeys(table: Table, row: Row, env: ExecutionEnv): void {\n if (!env.state.foreignKeysEnabled) return;\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\") continue;\n if (fkIsDeferred(constraint, env)) continue;\n assertForeignKeySatisfied(row, constraint, env);\n }\n}\n\nfunction fkIsDeferred(\n constraint: Extract<Table[\"constraints\"][number], { type: \"foreign_key\" }>,\n env: ExecutionEnv,\n): boolean {\n return env.transactions.inTransaction && constraint.initiallyDeferred;\n}\n\nfunction assertForeignKeySatisfied(\n row: Row,\n constraint: Extract<Table[\"constraints\"][number], { type: \"foreign_key\" }>,\n env: ExecutionEnv,\n): void {\n const values = constraint.columns.map((name) => row.values.get(normalizeColumnName(name)) ?? null);\n if (values.some((value) => value === null)) return;\n const parent = env.state.getTable(constraint.refTable);\n const parentColumns =\n constraint.refColumns ?? parent.columns.filter((column) => column.primaryKey).map((column) => column.name);\n if (\n ![...parent.scan()].some((candidate) =>\n values.every((value, index) => {\n const parentColumn = parentColumns[index];\n return (\n parentColumn !== undefined &&\n compareSql(value, candidate.values.get(normalizeColumnName(parentColumn)) ?? null) === 0\n );\n }),\n )\n ) {\n throw new SqliteError(\"FOREIGN KEY constraint failed\", \"constraint_foreign\", \"SQLITE_CONSTRAINT_FOREIGNKEY\");\n }\n}\n\nexport function checkDeferredForeignKeys(env: ExecutionEnv): void {\n if (!env.state.foreignKeysEnabled) return;\n for (const table of env.state.tables.values()) {\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\" || !constraint.initiallyDeferred) continue;\n for (const row of table.scan()) assertForeignKeySatisfied(row, constraint, env);\n }\n }\n}\n\nfunction applyReferentialDelete(parent: Table, row: Row, env: ExecutionEnv): number {\n if (!env.state.foreignKeysEnabled) return 0;\n let changes = 0;\n const parentPk = parent.columns.filter((column) => column.primaryKey).map((column) => column.name);\n for (const child of env.state.tables.values()) {\n for (const constraint of child.constraints) {\n if (constraint.type !== \"foreign_key\" || constraint.refTable.toLowerCase() !== parent.name.toLowerCase())\n continue;\n const referenced = constraint.refColumns ?? parentPk;\n const matches = [...child.scan()].filter(\n (candidate) =>\n !(child === parent && candidate.rowid === row.rowid) &&\n foreignKeyMatches(constraint.columns, candidate, referenced, row),\n );\n for (const candidate of matches) {\n if (constraint.onDelete === \"CASCADE\") {\n changes += applyReferentialDelete(child, candidate, env);\n removeOne(child, candidate, env);\n changes++;\n } else if (constraint.onDelete === \"SET NULL\") {\n const updated = updateOne(\n child,\n candidate,\n new Map(constraint.columns.map((name) => [normalizeColumnName(name), null])),\n env,\n );\n changes += 1 + updated.cascaded;\n } else if (constraint.onDelete === \"SET DEFAULT\") {\n const updated = updateOne(child, candidate, defaultUpdates(child, constraint.columns, env), env);\n changes += 1 + updated.cascaded;\n } else if (!fkIsDeferred(constraint, env)) {\n throw new SqliteError(\"FOREIGN KEY constraint failed\", \"constraint_foreign\", \"SQLITE_CONSTRAINT_FOREIGNKEY\");\n }\n }\n }\n }\n return changes;\n}\n\nfunction applyReferentialUpdate(parent: Table, before: Row, after: Row, env: ExecutionEnv): number {\n if (!env.state.foreignKeysEnabled) return 0;\n let changes = 0;\n const parentPk = parent.columns.filter((column) => column.primaryKey).map((column) => column.name);\n for (const child of env.state.tables.values()) {\n for (const constraint of child.constraints) {\n if (constraint.type !== \"foreign_key\" || constraint.refTable.toLowerCase() !== parent.name.toLowerCase())\n continue;\n const referenced = constraint.refColumns ?? parentPk;\n const oldValues = referenced.map((name) => before.values.get(normalizeColumnName(name)) ?? null);\n const newValues = referenced.map((name) => after.values.get(normalizeColumnName(name)) ?? null);\n if (oldValues.every((value, index) => compareSql(value, newValues[index] ?? null) === 0)) continue;\n\n const matches = [...child.scan()].filter((candidate) =>\n foreignKeyMatches(constraint.columns, candidate, referenced, before),\n );\n for (const candidate of matches) {\n if (constraint.onUpdate === \"CASCADE\") {\n const updated = updateOne(\n child,\n candidate,\n new Map(constraint.columns.map((name, index) => [normalizeColumnName(name), newValues[index] ?? null])),\n env,\n );\n changes += 1 + updated.cascaded;\n } else if (constraint.onUpdate === \"SET NULL\") {\n const updated = updateOne(\n child,\n candidate,\n new Map(constraint.columns.map((name) => [normalizeColumnName(name), null])),\n env,\n );\n changes += 1 + updated.cascaded;\n } else if (constraint.onUpdate === \"SET DEFAULT\") {\n const updated = updateOne(child, candidate, defaultUpdates(child, constraint.columns, env), env);\n changes += 1 + updated.cascaded;\n } else if (!fkIsDeferred(constraint, env)) {\n throw new SqliteError(\"FOREIGN KEY constraint failed\", \"constraint_foreign\", \"SQLITE_CONSTRAINT_FOREIGNKEY\");\n }\n }\n }\n }\n return changes;\n}\n\nfunction foreignKeyMatches(childColumns: string[], child: Row, parentColumns: string[], parent: Row): boolean {\n const childValues = childColumns.map((name) => child.values.get(normalizeColumnName(name)) ?? null);\n if (childValues.some((value) => value === null)) return false;\n return childValues.every((value, index) => {\n const parentColumn = parentColumns[index];\n return (\n parentColumn !== undefined &&\n compareSql(value, parent.values.get(normalizeColumnName(parentColumn)) ?? null) === 0\n );\n });\n}\n\nfunction defaultUpdates(table: Table, columns: string[], env: ExecutionEnv): Map<string, SqlValue> {\n return new Map(\n columns.map((name) => {\n const column = columnOf(table, name);\n const value = column.defaultExpr ? evalExpr(column.defaultExpr, env.createEvalContext()) : null;\n return [normalizeColumnName(column.name), value];\n }),\n );\n}\n\nfunction scopeFor(table: Table, row: Row, alias: string, env?: ExecutionEnv): ScopeRow {\n const integerPkAlias = table.withoutRowid\n ? undefined\n : table.columns.find((column) => column.primaryKey && column.typeName?.trim().toUpperCase() === \"INTEGER\")?.name;\n const baseCells = table.columns\n .filter((c) => !c.generated || c.generated.stored)\n .map((column) => ({\n table: alias,\n name: column.name,\n value: row.values.get(normalizeColumnName(column.name)) ?? null,\n affinity: column.affinity,\n collate: column.collate,\n }));\n const cells = [...baseCells];\n if (env) {\n for (const column of table.columns) {\n if (!column.generated || column.generated.stored) continue;\n const ctx = env.createEvalContext({ cells: baseCells, sourceTable: table.name });\n const value = applyAffinity(evalExpr(column.generated.expr, ctx), column.affinity);\n cells.push({\n table: alias,\n name: column.name,\n value,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n // Preserve column order\n cells.sort((a, b) => {\n const ai = table.columns.findIndex((c) => c.name.toLowerCase() === a.name.toLowerCase());\n const bi = table.columns.findIndex((c) => c.name.toLowerCase() === b.name.toLowerCase());\n return ai - bi;\n });\n } else {\n for (const column of table.columns) {\n if (!column.generated || column.generated.stored) continue;\n cells.push({\n table: alias,\n name: column.name,\n value: null,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n cells.sort((a, b) => {\n const ai = table.columns.findIndex((c) => c.name.toLowerCase() === a.name.toLowerCase());\n const bi = table.columns.findIndex((c) => c.name.toLowerCase() === b.name.toLowerCase());\n return ai - bi;\n });\n }\n return {\n ...(table.withoutRowid ? {} : { rowid: row.rowid }),\n rowidName: integerPkAlias ?? (table.withoutRowid ? undefined : \"rowid\"),\n sourceTable: table.name,\n cells,\n };\n}\n\nfunction projectReturning(columns: ResultColumn[], scope: ScopeRow, env: ExecutionEnv): SqlValue[] {\n const values: SqlValue[] = [];\n const ctx = env.createEvalContext(scope);\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const cell of scope.cells)\n if (column.table === null || cell.table?.toLowerCase() === column.table.toLowerCase()) values.push(cell.value);\n } else values.push(evalExpr(column.expr, ctx));\n }\n return values;\n}\n\nfunction returningNames(columns: ResultColumn[], table: Table): string[] {\n return columns.flatMap((column) =>\n column.type === \"star\"\n ? table.columns.map((item) => item.name)\n : [column.alias ?? (column.expr.type === \"column\" ? column.expr.name : column.expr.type)],\n );\n}\n\nfunction columnOf(table: Table, name: string) {\n const column = table.columns.find((item) => item.name.toLowerCase() === name.toLowerCase());\n if (!column) throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n return column;\n}\n\nfunction isRowidName(name: string): boolean {\n const key = name.toLowerCase();\n return key === \"rowid\" || key === \"_rowid_\" || key === \"oid\";\n}\n\nfunction ftsScopeFor(table: Fts5VirtualTable, row: Fts5Row, alias: string): ScopeRow {\n return {\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: table.name,\n cells: table.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n}\n\nfunction executeVirtualInsert(stmt: InsertStmt, env: ExecutionEnv): ResultSet {\n const any = env.state.getAnyVirtualTable(stmt.table);\n if (any.kind === \"rtree\") {\n const columnNames = stmt.columns ?? any.columns;\n const sourceRows = stmt.values\n ? stmt.values.map((items) => items.map((expr) => evalExpr(expr, env.createEvalContext())))\n : stmt.select\n ? resultValues(executeSelect({ ...stmt.select, with: stmt.with ?? stmt.select.with }, env))\n : [[]];\n let changes = 0;\n let last = env.state.lastInsertRowid;\n for (const source of sourceRows) {\n const values = new Map<string, SqlValue>();\n for (let i = 0; i < columnNames.length; i++) {\n values.set(columnNames[i]!.toLowerCase(), source[i] ?? null);\n }\n last = any.insert(values);\n changes++;\n }\n env.state.recordChange(changes, last);\n return valuesToResult([], [], changes, last);\n }\n if (any.kind !== \"fts5\" && any.kind !== \"fts3\" && any.kind !== \"fts4\") {\n throw new SqliteError(`table ${stmt.table} may not be modified`, \"misuse\");\n }\n const table = any;\n const columnNames = stmt.columns ?? table.columns;\n for (const name of columnNames) {\n const lower = name.toLowerCase();\n if (lower === table.name.toLowerCase()) continue; // FTS special-command column\n if (lower === \"rowid\" || lower === \"_rowid_\" || lower === \"oid\") continue;\n if (!table.columns.some((column) => column.toLowerCase() === lower)) {\n throw new SqliteError(`table ${table.name} has no column named ${name}`, \"no_such_column\");\n }\n }\n const sourceRows = stmt.values\n ? stmt.values.map((items) => items.map((expr) => evalExpr(expr, env.createEvalContext())))\n : stmt.select\n ? resultValues(executeSelect({ ...stmt.select, with: stmt.with ?? stmt.select.with }, env))\n : [[]];\n const { changes, lastInsertRowid } = executeFtsInsert(table, columnNames, sourceRows, env);\n env.state.recordChange(changes, lastInsertRowid);\n return valuesToResult([], [], changes, lastInsertRowid);\n}\n\nfunction executeVirtualUpdate(stmt: UpdateStmt, env: ExecutionEnv): ResultSet {\n if (stmt.from) throw new SqliteError(\"UPDATE FROM is not supported\", \"unsupported\");\n const any = env.state.getAnyVirtualTable(stmt.table);\n if (any.kind === \"rtree\") {\n const alias = stmt.alias ?? stmt.table;\n const candidates = any.scan().filter((row) => {\n if (!stmt.where) return true;\n const scope: ScopeRow = {\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: any.name,\n cells: any.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n return isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) === true;\n });\n let changes = 0;\n for (const row of candidates) {\n const updates = new Map<string, SqlValue>();\n const scope: ScopeRow = {\n rowid: row.rowid,\n cells: any.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n for (const item of stmt.set) {\n if (item.columns.length !== 1)\n throw new SqliteError(\"multi-column SET is not supported on virtual tables\", \"unsupported\");\n updates.set(item.columns[0]!.toLowerCase(), evalExpr(item.expr, env.createEvalContext(scope)));\n }\n any.update(row.rowid, updates);\n changes++;\n }\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n }\n if (any.kind !== \"fts5\" && any.kind !== \"fts3\" && any.kind !== \"fts4\") {\n throw new SqliteError(`table ${stmt.table} may not be modified`, \"misuse\");\n }\n const table = any;\n const alias = stmt.alias ?? stmt.table;\n const candidates: Rowid[] = [];\n for (const row of table.scan()) {\n const scope = ftsScopeFor(table, row, alias);\n if (stmt.where && isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) !== true) continue;\n candidates.push(row.rowid);\n }\n let changes = 0;\n for (const rowid of candidates) {\n const row = table.rows.get(rowid)!;\n const scope = ftsScopeFor(table, row, alias);\n const updates = evaluateFtsSet(stmt.set, table, env.createEvalContext(scope));\n executeFtsUpdate(table, updates, [rowid]);\n changes++;\n }\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n}\n\nfunction executeVirtualDelete(stmt: DeleteStmt, env: ExecutionEnv): ResultSet {\n const any = env.state.getAnyVirtualTable(stmt.table);\n if (any.kind === \"rtree\") {\n const alias = stmt.alias ?? stmt.table;\n const selected = any.scan().filter((row) => {\n if (!stmt.where) return true;\n const scope: ScopeRow = {\n rowid: row.rowid,\n cells: any.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n return isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) === true;\n });\n let changes = 0;\n for (const row of selected) {\n any.delete(row.rowid);\n changes++;\n }\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n }\n if (any.kind !== \"fts5\" && any.kind !== \"fts3\" && any.kind !== \"fts4\") {\n throw new SqliteError(`table ${stmt.table} may not be modified`, \"misuse\");\n }\n const table = any;\n const alias = stmt.alias ?? stmt.table;\n const selected = table.scan().filter((row) => {\n if (!stmt.where) return true;\n return isTruthySql(evalExpr(stmt.where, env.createEvalContext(ftsScopeFor(table, row, alias)))) === true;\n });\n const changes = executeFtsDelete(\n table,\n selected.map((row) => row.rowid),\n );\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n}\n\nfunction evaluateFtsSet(\n items: SetItem[],\n table: Fts5VirtualTable,\n ctx: ReturnType<ExecutionEnv[\"createEvalContext\"]>,\n): Map<string, SqlValue> {\n const updates = new Map<string, SqlValue>();\n for (const item of items) {\n if (item.columns.length !== 1)\n throw new SqliteError(\"multi-column SET is not supported on virtual tables\", \"unsupported\");\n const name = item.columns[0]!;\n if (!table.columns.some((column) => column.toLowerCase() === name.toLowerCase())) {\n throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n }\n updates.set(normalizeColumnName(name), evalExpr(item.expr, ctx));\n }\n return updates;\n}\n\nfunction asExplicitRowid(value: SqlValue): Rowid | undefined {\n if (value === null) return undefined;\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\" && Number.isSafeInteger(value)) return value;\n throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\", \"SQLITE_MISMATCH\");\n}\n", "import type { Expr } from \"../ast/nodes.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport {\n coercePragmaInt,\n coercePragmaTruthy,\n evalPragmaArgs,\n evalPragmaSetValue,\n queryPragma,\n} from \"./pragma-engine.ts\";\nimport { emptyResult, type ResultSet, valuesToResult } from \"./result.ts\";\n\nexport function executePragma(name: string, expr: Expr | null, env: ExecutionEnv): ResultSet {\n const key = name.toLowerCase();\n\n // Writable statement forms\n if (key === \"foreign_keys\" && expr !== null) {\n const value = evalPragmaSetValue(expr, env);\n if (!env.transactions.inTransaction) env.state.foreignKeysEnabled = coercePragmaTruthy(value);\n return emptyResult(0, env.state.lastInsertRowid);\n }\n if ((key === \"user_version\" || key === \"schema_version\") && expr !== null) {\n const value = evalPragmaSetValue(expr, env);\n const num = coercePragmaInt(value);\n if (key === \"user_version\") env.state.userVersion = num;\n else env.state.schemaVersion = num;\n return emptyResult(0, env.state.lastInsertRowid);\n }\n\n const args = evalPragmaArgs(expr, env);\n const result = queryPragma(key, args, env);\n if (result.columns.length === 0 && result.rows.length === 0) {\n return emptyResult(0, env.state.lastInsertRowid);\n }\n return valuesToResult(result.columns, result.rows, 0, env.state.lastInsertRowid);\n}\n", "import type { Statement } from \"../ast/nodes.ts\";\nimport { executeAttach, executeDetach } from \"./attach.ts\";\nimport {\n executeAlterTable,\n executeCreateIndex,\n executeCreateTable,\n executeCreateView,\n executeDropIndex,\n executeDropTable,\n executeDropView,\n} from \"./ddl.ts\";\nimport { checkDeferredForeignKeys, executeDelete, executeInsert, executeUpdate } from \"./dml.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { executePragma } from \"./pragma.ts\";\nimport { emptyResult, type ResultSet, valuesToResult } from \"./result.ts\";\nimport { executeSelect } from \"./select.ts\";\nimport { executeCreateTrigger, executeDropTrigger } from \"./triggers.ts\";\nimport { executeCreateVirtualTable } from \"./vtable.ts\";\n\nexport function executeStatement(stmt: Statement, env: ExecutionEnv): ResultSet {\n env.selectRunner = executeSelect;\n switch (stmt.type) {\n case \"select\":\n return executeSelect(stmt, env);\n case \"insert\":\n return executeInsert(stmt, env);\n case \"update\":\n return executeUpdate(stmt, env);\n case \"delete\":\n return executeDelete(stmt, env);\n case \"create_table\":\n return executeCreateTable(stmt, env);\n case \"drop_table\":\n return executeDropTable(stmt, env);\n case \"alter_table\":\n return executeAlterTable(stmt, env);\n case \"create_index\":\n return executeCreateIndex(stmt, env);\n case \"drop_index\":\n return executeDropIndex(stmt, env);\n case \"create_view\":\n return executeCreateView(stmt, env);\n case \"drop_view\":\n return executeDropView(stmt, env);\n case \"create_trigger\":\n return executeCreateTrigger(stmt, env);\n case \"drop_trigger\":\n return executeDropTrigger(stmt, env);\n case \"create_virtual_table\":\n return executeCreateVirtualTable(stmt, env);\n case \"attach\":\n return executeAttach(stmt, env);\n case \"detach\":\n return executeDetach(stmt, env);\n case \"begin\":\n env.transactions.begin();\n return emptyResult(0, env.state.lastInsertRowid);\n case \"commit\":\n checkDeferredForeignKeys(env);\n env.transactions.commit();\n return emptyResult(0, env.state.lastInsertRowid);\n case \"rollback\":\n env.transactions.rollback(stmt.savepoint ?? undefined);\n return emptyResult(0, env.state.lastInsertRowid);\n case \"savepoint\":\n env.transactions.savepoint(stmt.name);\n return emptyResult(0, env.state.lastInsertRowid);\n case \"release\":\n env.transactions.release(stmt.name);\n return emptyResult(0, env.state.lastInsertRowid);\n case \"pragma\":\n return executePragma(stmt.name, stmt.value, env);\n case \"explain\":\n return valuesToResult(\n stmt.queryPlan\n ? [\"id\", \"parent\", \"notused\", \"detail\"]\n : [\"addr\", \"opcode\", \"p1\", \"p2\", \"p3\", \"p4\", \"p5\", \"comment\"],\n stmt.queryPlan\n ? [[0, 0, 0, `EXECUTE ${stmt.statement.type.toUpperCase()}`]]\n : [[0, \"Execute\", 0, 0, 0, stmt.statement.type, 0, null]],\n 0,\n env.state.lastInsertRowid,\n );\n case \"analyze\":\n return executeAnalyze(stmt, env);\n case \"reindex\":\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n case \"vacuum\":\n // :memory: VACUUM is a successful no-op (matches bun:sqlite).\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n }\n}\n\nfunction executeAnalyze(stmt: import(\"../ast/nodes.ts\").AnalyzeStmt, env: ExecutionEnv): ResultSet {\n // Populate sqlite_stat1 with simple row counts for oracle-visible ANALYZE behavior.\n let stat = env.state.tables.get(\"sqlite_stat1\");\n if (!stat) {\n env.state.createTable(\n {\n type: \"create_table\",\n ifNotExists: true,\n temp: false,\n name: \"sqlite_stat1\",\n columns: [\n { name: \"tbl\", typeName: \"TEXT\", constraints: [] },\n { name: \"idx\", typeName: \"TEXT\", constraints: [] },\n { name: \"stat\", typeName: \"TEXT\", constraints: [] },\n ],\n constraints: [],\n asSelect: null,\n withoutRowid: false,\n strict: false,\n },\n \"CREATE TABLE sqlite_stat1(tbl,idx,stat)\",\n );\n stat = env.state.tables.get(\"sqlite_stat1\");\n }\n if (stat) {\n for (const row of [...stat.scan()]) {\n stat.delete(row.rowid);\n }\n const tables = [...env.state.tables.values()].filter((t) => t.name.toLowerCase() !== \"sqlite_stat1\");\n const targets = stmt.name ? tables.filter((t) => t.name.toLowerCase() === stmt.name!.toLowerCase()) : tables;\n for (const table of targets) {\n const rowCount = [...table.scan()].length;\n const indexes = [...env.state.indexes.values()].filter(\n (i) => i.tableName.toLowerCase() === table.name.toLowerCase(),\n );\n if (indexes.length === 0) {\n stat.insert(\n new Map<string, import(\"../types/value.ts\").SqlValue>([\n [\"tbl\", table.name],\n [\"idx\", null],\n [\"stat\", String(rowCount)],\n ]),\n );\n } else {\n for (const index of indexes) {\n stat.insert(\n new Map<string, import(\"../types/value.ts\").SqlValue>([\n [\"tbl\", table.name],\n [\"idx\", index.name],\n [\"stat\", `${rowCount} ${Math.max(1, Math.floor(rowCount / 2))}`],\n ]),\n );\n }\n }\n }\n }\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n", "import type { Statement as AstStatement } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { ExecutionEnv } from \"../executor/env.ts\";\nimport { executeStatement } from \"../executor/execute.ts\";\nimport type { ResultSet } from \"../executor/result.ts\";\nimport { tokenize } from \"../lexer/tokenize.ts\";\nimport { parse } from \"../parser/index.ts\";\nimport type { BindValue, QueryRow } from \"../types/value.ts\";\nimport type { Database } from \"./database.ts\";\n\n/** Mutation counters returned by {@link Statement.run}. */\nexport interface RunResult {\n /** Rows changed by this execution (SQLite `changes()`). */\n changes: number;\n /** Rowid of the most recent INSERT in this execution. */\n lastInsertRowid: number | bigint;\n}\n\n/**\n * Prepared SQL statement bound to a {@link Database}.\n *\n * Create with {@link Database.prepare}. Pass bind values as rest arguments to\n * {@link run}, {@link all}, {@link get}, or {@link result} on each call\n * (stateless \u2014 there is no sticky `bind()`).\n *\n * @example\n * ```ts\n * import { Database } from \"@crvouga/sqlite-mem\";\n *\n * const db = new Database();\n * db.exec(\"CREATE TABLE t (id INTEGER PRIMARY KEY, name TEXT)\");\n * const insert = db.prepare(\"INSERT INTO t (name) VALUES (?)\");\n * insert.run(\"Ada\");\n * const row = db.prepare(\"SELECT id, name FROM t WHERE id = ?\").get<{ id: number; name: string }>(1);\n * ```\n */\nexport class Statement {\n private namedPlan: ReturnType<typeof planNamedParameters> | null = null;\n private env: ExecutionEnv | null = null;\n private statements: AstStatement[];\n private schemaVersion: number;\n\n private constructor(\n private readonly database: Database,\n private readonly sql: string,\n statements: AstStatement[],\n ) {\n this.statements = statements;\n this.schemaVersion = database.state.schemaVersion;\n }\n\n /**\n * Construct a {@link Statement} for {@link Database.prepare} / {@link Database.exec}.\n * @internal\n */\n static create(database: Database, sql: string, statements: AstStatement[]): Statement {\n return new Statement(database, sql, statements);\n }\n\n /**\n * Execute for side effects (INSERT / UPDATE / DELETE / DDL).\n *\n * @param params - Bind values for this call only.\n * @returns Mutation counters for this execution.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n run(...params: BindValue[]): RunResult {\n const result = this.execute(params, { named: false });\n return { changes: result.changes, lastInsertRowid: result.lastInsertRowid };\n }\n\n /**\n * Execute and return every result row as an object keyed by column name.\n *\n * @typeParam T - Row shape. Defaults to {@link QueryRow}.\n * @param params - Bind values for this call only.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n all<T = QueryRow>(...params: BindValue[]): T[] {\n return this.execute(params, { named: true }).rows as T[];\n }\n\n /**\n * Execute and return the full {@link ResultSet}, including column names.\n *\n * Use this when you need metadata for an empty result (column names with zero rows).\n * {@link all} only returns row objects.\n *\n * @param params - Bind values for this call only.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n result(...params: BindValue[]): ResultSet {\n return this.execute(params, { named: true });\n }\n\n /**\n * Execute and return the first row, or `undefined` if there are no rows.\n *\n * @typeParam T - Row shape. Defaults to {@link QueryRow}.\n * @param params - Bind values for this call only.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n get<T = QueryRow>(...params: BindValue[]): T | undefined {\n return this.execute(params, { named: true, maxRows: 1 }).rows[0] as T | undefined;\n }\n\n private execute(params: readonly BindValue[], options?: { named?: boolean; maxRows?: number }): ResultSet {\n this.database.assertOpen();\n this.reprepareIfSchemaChanged();\n if (this.statements.length === 0) throw new SqliteError(\"empty statement\", \"misuse\");\n this.namedPlan ??= planNamedParameters(this.sql);\n const expected = this.namedPlan.expectedCount;\n if (params.length > 0 && params.length !== expected) {\n throw new SqliteError(`SQLite query expected ${expected} values, received ${params.length}`, \"misuse\");\n }\n const env = this.obtainEnv(params);\n env.maxRows = options?.maxRows ?? Number.POSITIVE_INFINITY;\n env.includeNamedRows = options?.named !== false;\n env.includeValues = true;\n this.bindNamed(env, params);\n let result: ResultSet | undefined;\n for (const statement of this.statements) {\n result = executeStatement(statement, env);\n }\n return result!;\n }\n\n private obtainEnv(params: readonly BindValue[]): ExecutionEnv {\n if (this.env) {\n this.env.reset(params);\n this.env.hooks.now = this.database.now;\n this.env.hooks.random = () => this.database.prng.nextSqliteRandom();\n this.env.hooks.randomU64 = () => this.database.prng.nextU64();\n return this.env;\n }\n this.env = new ExecutionEnv(this.database.state, this.database.transactions, params, undefined, {\n now: this.database.now,\n random: () => this.database.prng.nextSqliteRandom(),\n randomU64: () => this.database.prng.nextU64(),\n });\n return this.env;\n }\n\n private reprepareIfSchemaChanged(): void {\n if (this.schemaVersion === this.database.state.schemaVersion) return;\n this.statements = parse(this.sql);\n this.env = null;\n this.namedPlan = null;\n this.schemaVersion = this.database.state.schemaVersion;\n }\n\n private bindNamed(env: ExecutionEnv, params: readonly BindValue[]): void {\n this.namedPlan ??= planNamedParameters(this.sql);\n for (const item of this.namedPlan.named) {\n if (item.slot <= params.length) env.setNamed(item.name, params[item.slot - 1]);\n }\n }\n}\n\ninterface NamedPlan {\n named: { name: string; slot: number }[];\n /** Highest bind slot index (SQLite parameter count). */\n expectedCount: number;\n}\n\nfunction planNamedParameters(sql: string): NamedPlan {\n const tokens = tokenize(sql);\n let nextSlot = 1;\n const namedSlots = new Map<string, number>();\n const named: { name: string; slot: number }[] = [];\n for (const token of tokens) {\n if (token.kind === \"PARAM_POS\") {\n if (token.index !== undefined) nextSlot = Math.max(nextSlot, token.index + 1);\n else nextSlot++;\n } else if (token.kind === \"PARAM_NAMED\") {\n const name = token.value.toLowerCase();\n let slot = namedSlots.get(name);\n if (slot === undefined) {\n slot = nextSlot++;\n namedSlots.set(name, slot);\n named.push({ name, slot });\n }\n }\n }\n return { named, expectedCount: nextSlot - 1 };\n}\n\n/**\n * Bind named placeholders into an execution environment.\n * @internal\n */\nexport function bindNamedParameters(env: ExecutionEnv, sql: string, params: readonly BindValue[]): void {\n const plan = planNamedParameters(sql);\n for (const item of plan.named) {\n if (item.slot <= params.length) env.setNamed(item.name, params[item.slot - 1]);\n }\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { parse } from \"../parser/index.ts\";\nimport {\n type Clock,\n type DatabaseOptions,\n DEFAULT_DATABASE_SEED,\n fixedClock,\n Prng,\n resolveClock,\n} from \"../runtime/index.ts\";\nimport { decodeDatabaseState, encodeDatabaseState } from \"../serialization/codec.ts\";\nimport { DatabaseState } from \"../storage/database-state.ts\";\nimport { TransactionManager } from \"../transactions/manager.ts\";\nimport type { BindValue, QueryRow } from \"../types/value.ts\";\nimport { Statement } from \"./statement.ts\";\n\n/**\n * Pure TypeScript in-memory SQLite database.\n *\n * Deterministic by default: `random()` / `randomblob()` use a seeded PRNG\n * (`seed` defaults to `1`) and `date('now')` / friends use a fixed clock\n * (`2000-01-01T00:00:00.000Z`). There is no filesystem or WASM.\n *\n * @example\n * ```ts\n * import { Database } from \"@crvouga/sqlite-mem\";\n *\n * const db = new Database();\n * db.exec(\"CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL)\");\n * db.prepare(\"INSERT INTO users (name) VALUES (?)\").run(\"Alice\");\n * const users = db.query<{ id: number; name: string }>(\"SELECT * FROM users\");\n * ```\n */\nexport class Database {\n /** @internal Engine catalog, tables, and mutation counters. */\n readonly state = new DatabaseState();\n /** Seed used to construct the PRNG. */\n readonly seed: number | bigint;\n /**\n * PRNG backing `random()` / `randomblob()` and related builtins.\n * Prefer passing `seed` to the constructor.\n * @internal\n */\n readonly prng: Prng;\n /**\n * Clock used by `date('now')` / `datetime('now')` / `CURRENT_TIMESTAMP`.\n * Prefer passing `now` to the constructor.\n * @internal\n */\n now: Clock;\n /** @internal Transaction / savepoint manager. */\n readonly transactions: TransactionManager;\n private closed = false;\n private transactionSequence = 0;\n /** Depth of active {@link transaction} callbacks (not SQL BEGIN). */\n private apiTransactionDepth = 0;\n\n /**\n * Create an empty in-memory database.\n *\n * @param options - Determinism knobs. See {@link DatabaseOptions}.\n */\n constructor(options: DatabaseOptions = {}) {\n this.seed = options.seed ?? DEFAULT_DATABASE_SEED;\n this.prng = new Prng(this.seed);\n this.now = resolveClock(options.now);\n this.transactions = new TransactionManager(this.state, this.prng);\n }\n\n /**\n * Execute SQL for its side effects (DDL/DML). Multiple statements are allowed.\n *\n * Does not accept bind parameters \u2014 use {@link prepare} or {@link query}.\n *\n * @param sql - SQL to run (semicolon-separated statements are ok).\n * @throws {SqliteError} If the database is closed, extra arguments are passed, or the SQL fails.\n */\n exec(sql: string): void {\n this.assertOpen();\n // Runtime guard: TypeScript rejects a second argument; JS callers must still get misuse.\n // biome-ignore lint/complexity/noArguments: intentional arity check for the frozen exec(sql) signature\n if (arguments.length > 1) {\n throw new SqliteError(\"exec() does not accept parameters; use prepare() or query()\", \"misuse\");\n }\n Statement.create(this, sql, parse(sql)).run();\n }\n\n /**\n * Execute a single-statement query and return all rows as objects keyed by column name.\n *\n * @typeParam T - Row shape. Defaults to {@link QueryRow}.\n * @param sql - A single SQL statement (trailing `;` is fine).\n * @param params - Bound parameters for `?` / `:name` placeholders.\n * @returns All result rows.\n * @throws {SqliteError} If the database is closed, `sql` is not a single statement, or execution fails.\n */\n query<T = QueryRow>(sql: string, params: readonly BindValue[] = []): T[] {\n this.assertOpen();\n return this.prepareSingle(sql).all<T>(...params);\n }\n\n /**\n * Compile a single SQL statement into a reusable {@link Statement}.\n *\n * @param sql - A single SQL statement (trailing `;` is fine). Multi-statement scripts are rejected.\n * @throws {SqliteError} If the database is closed or `sql` cannot be prepared as one statement.\n */\n prepare(sql: string): Statement {\n this.assertOpen();\n return this.prepareSingle(sql);\n }\n\n /**\n * Run `fn` inside a transaction. Commits on success; rolls back if `fn` throws.\n *\n * Nested calls use SAVEPOINTs so an inner failure does not abort the outer\n * transaction. Calling {@link close} from inside `fn` throws `misuse`.\n *\n * @param fn - Work to run while the transaction is open.\n * @returns The value returned by `fn`.\n * @throws {SqliteError} If the database is closed. Re-throws whatever `fn` throws after rollback.\n */\n transaction<T>(fn: () => T): T {\n this.assertOpen();\n this.apiTransactionDepth++;\n try {\n if (!this.transactions.inTransaction) {\n this.transactions.begin();\n try {\n const value = fn();\n this.transactions.commit();\n return value;\n } catch (error) {\n this.transactions.rollback();\n throw error;\n }\n }\n const name = `__api_transaction_${++this.transactionSequence}`;\n this.transactions.savepoint(name);\n try {\n const value = fn();\n this.transactions.release(name);\n return value;\n } catch (error) {\n this.transactions.rollback(name);\n this.transactions.release(name);\n throw error;\n }\n } finally {\n this.apiTransactionDepth--;\n }\n }\n\n /**\n * Serialize schema, rows, PRNG state, and clock into a custom snapshot blob.\n *\n * This is not a `.sqlite` file. Restore it with {@link restore}.\n *\n * @throws {SqliteError} If the database is closed.\n */\n snapshot(): Uint8Array {\n this.assertOpen();\n return encodeDatabaseState(this.state, {\n prngState: this.prng.getState(),\n nowMs: this.now().getTime(),\n });\n }\n\n /**\n * Replace this database's contents with a blob from {@link snapshot}.\n *\n * Restores PRNG state and the clock when the snapshot includes them (v2).\n * Newer library versions can restore older snapshots; older libraries cannot\n * restore newer format versions.\n *\n * @param snapshot - Bytes previously returned by {@link snapshot}.\n * @throws {SqliteError} If the database is closed, a transaction is open, or the blob is invalid.\n */\n restore(snapshot: Uint8Array): void {\n this.assertOpen();\n if (this.transactions.inTransaction) throw new SqliteError(\"cannot restore during a transaction\", \"transaction\");\n // Drop live state before decode so peak \u2248 snapshot bytes + one decoded tree\n // (not old DB + decoded + snapshot).\n this.state.replaceWith(new DatabaseState(), { adopt: true });\n const decoded = decodeDatabaseState(snapshot);\n this.state.replaceWith(decoded.state, { adopt: true });\n if (decoded.runtime) {\n this.prng.setState(decoded.runtime.prngState);\n this.now = fixedClock(new Date(decoded.runtime.nowMs));\n }\n }\n\n /**\n * Close the database. Further SQL throws {@link SqliteError}. Idempotent.\n *\n * Rolls back an open SQL transaction, if any. Throws if called from inside\n * a {@link transaction} callback.\n */\n close(): void {\n if (this.closed) return;\n if (this.apiTransactionDepth > 0) {\n throw new SqliteError(\"cannot close database inside transaction()\", \"misuse\");\n }\n if (this.transactions.inTransaction) this.transactions.rollback();\n this.closed = true;\n }\n\n /**\n * Rows changed by the most recent INSERT / UPDATE / DELETE (SQLite `changes()`).\n *\n * @throws {SqliteError} If the database is closed.\n */\n get changes(): number {\n this.assertOpen();\n return this.state.changes;\n }\n\n /**\n * Rowid of the most recent INSERT (SQLite `last_insert_rowid()`).\n *\n * @throws {SqliteError} If the database is closed.\n */\n get lastInsertRowid(): number | bigint {\n this.assertOpen();\n return this.state.lastInsertRowid;\n }\n\n /**\n * Throw if {@link close} has already been called.\n * @internal\n * @throws {SqliteError} If the database is closed.\n */\n assertOpen(): void {\n if (this.closed) throw new SqliteError(\"Database is closed\", \"misuse\");\n }\n\n private prepareSingle(sql: string): Statement {\n const statements = parse(sql);\n if (statements.length === 0) {\n throw new SqliteError(\"empty statement\", \"misuse\");\n }\n if (statements.length > 1) {\n throw new SqliteError(\"query()/prepare() accept a single statement only; use exec() for scripts\", \"misuse\");\n }\n return Statement.create(this, sql, statements);\n }\n}\n\nconst disposeKey = (Symbol as unknown as { dispose?: symbol }).dispose;\nif (typeof disposeKey === \"symbol\") {\n Object.defineProperty(Database.prototype, disposeKey, {\n value: function (this: Database): void {\n this.close();\n },\n writable: true,\n configurable: true,\n });\n}\n\nexport type { DatabaseOptions };\n"],
|
|
5
|
-
"mappings": "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;AAAA,EAChE;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,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,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,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,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,CAAC;AAED,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,OAAO;AAAA,EACX,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,YAAY;AACd;AAEO,IAAM,SAAN,MAAa;AAAA,EAGlB,YAA6B,QAAiB;AAAjB;AAAA,EAAkB;AAAA,EAAlB;AAAA,EAFrB,MAAM;AAAA,EAIN,UAAiB;AACvB,WAAO,KAAK,OAAO,KAAK,GAAG,KAAK,KAAK,OAAO,KAAK,OAAO,SAAS,CAAC;AAAA,EACpE;AAAA,EAEQ,KAAK,SAAS,GAAU;AAC9B,WAAO,KAAK,OAAO,KAAK,MAAM,MAAM,KAAK,KAAK,OAAO,KAAK,OAAO,SAAS,CAAC;AAAA,EAC7E;AAAA,EAEQ,GAAG,MAA0B;AACnC,WAAO,KAAK,QAAQ,EAAE,SAAS;AAAA,EACjC;AAAA,EAEQ,SAAS,OAA6B;AAC5C,WAAO,MAAM,SAAS,KAAK,QAAQ,EAAE,IAAI;AAAA,EAC3C;AAAA,EAEQ,UAAiB;AACvB,UAAM,IAAI,KAAK,QAAQ;AACvB,QAAI,EAAE,SAAS,MAAO,MAAK;AAC3B,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,OAA6B;AAC5C,QAAI,KAAK,MAAM,GAAG,KAAK,GAAG;AACxB,WAAK,QAAQ;AACb,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,OAAO,MAAiB,SAAyB;AACvD,QAAI,CAAC,KAAK,GAAG,IAAI,GAAG;AAClB,WAAK,YAAY,WAAW,YAAY,IAAI,SAAS,KAAK,QAAQ,EAAE,IAAI,EAAE;AAAA,IAC5E;AACA,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,YAAY,SAAwB;AAClC,UAAM,IAAI,KAAK,QAAQ;AACvB,UAAM,IAAI,YAAY,GAAG,OAAO,OAAO,EAAE,IAAI,IAAI,EAAE,MAAM,IAAI,QAAQ;AAAA,EACvE;AAAA;AAAA,EAGA,aAAqB;AACnB,UAAM,IAAI,KAAK,QAAQ;AACvB,QAAI,EAAE,SAAS,SAAS;AACtB,WAAK,QAAQ;AACb,aAAO,EAAE;AAAA,IACX;AACA,QAAI,eAAe,IAAI,EAAE,IAAI,GAAG;AAC9B,WAAK,QAAQ;AACb,aAAO,EAAE;AAAA,IACX;AACA,SAAK,YAAY,qBAAqB;AAAA,EACxC;AAAA,EAEQ,0BAAmE;AACzE,UAAM,QAAQ,KAAK,WAAW;AAC9B,QAAI,KAAK,MAAM,KAAK,GAAG;AACrB,YAAM,SAAS,KAAK,WAAW;AAC/B,aAAO,EAAE,QAAQ,OAAO,MAAM,OAAO;AAAA,IACvC;AACA,WAAO,EAAE,QAAQ,MAAM,MAAM,MAAM;AAAA,EACrC;AAAA,EAEQ,iBAAyB;AAC/B,UAAM,QAAQ,KAAK,wBAAwB;AAC3C,WAAO,MAAM,SAAS,GAAG,MAAM,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM;AAAA,EAChE;AAAA,EAEQ,kBAA8B;AACpC,SAAK,OAAO,QAAQ;AACpB,SAAK,MAAM,UAAU;AACrB,UAAM,WAAW,KAAK,UAAU;AAChC,SAAK,OAAO,IAAI;AAChB,UAAM,SAAS,KAAK,WAAW;AAC/B,WAAO,EAAE,MAAM,UAAU,UAAU,OAAO;AAAA,EAC5C;AAAA,EAEQ,kBAA8B;AACpC,SAAK,OAAO,QAAQ;AACpB,SAAK,MAAM,UAAU;AACrB,UAAM,SAAS,KAAK,WAAW;AAC/B,WAAO,EAAE,MAAM,UAAU,OAAO;AAAA,EAClC;AAAA,EAEQ,gBAA+B;AACrC,QAAI,KAAK,MAAM,IAAI,EAAG,QAAO,KAAK,WAAW;AAE7C,QAAI,KAAK,QAAQ,EAAE,SAAS,SAAS;AACnC,aAAO,KAAK,WAAW;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,kBAA+B;AAC7B,UAAM,QAAqB,CAAC;AAC5B,WAAO,CAAC,KAAK,GAAG,KAAK,GAAG;AACtB,UAAI,KAAK,MAAM,MAAM,EAAG;AACxB,YAAM,KAAK,KAAK,eAAe,CAAC;AAChC,WAAK,MAAM,MAAM;AAAA,IACnB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,iBAA4B;AAC1B,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,UAAI,YAAY;AAChB,UAAI,KAAK,MAAM,OAAO,GAAG;AACvB,aAAK,OAAO,MAAM;AAClB,oBAAY;AAAA,MACd;AACA,YAAM,OAAO,KAAK,eAAe;AACjC,aAAO,EAAE,MAAM,WAAW,WAAW,WAAW,KAAK;AAAA,IACvD;AAEA,QAAI,KAAK,MAAM,QAAQ,QAAQ,EAAG,QAAO,KAAK,gBAAgB;AAC9D,QAAI,KAAK,GAAG,QAAQ,EAAG,QAAO,KAAK,gBAAgB;AAEnD,QAAI,KAAK,MAAM,QAAQ,QAAQ,KAAK,KAAK,GAAG,QAAQ,KAAK,KAAK,GAAG,SAAS,GAAG;AAC3E,aAAO,KAAK,gBAAgB;AAAA,IAC9B;AACA,QAAI,KAAK,MAAM,QAAQ,QAAQ,KAAK,KAAK,GAAG,QAAQ,EAAG,QAAO,KAAK,gBAAgB;AACnF,QAAI,KAAK,MAAM,QAAQ,QAAQ,KAAK,KAAK,GAAG,QAAQ,EAAG,QAAO,KAAK,gBAAgB;AAEnF,QAAI,KAAK,GAAG,QAAQ,EAAG,QAAO,KAAK,gBAAgB;AACnD,QAAI,KAAK,GAAG,MAAM,EAAG,QAAO,KAAK,cAAc;AAC/C,QAAI,KAAK,GAAG,OAAO,EAAG,QAAO,KAAK,oBAAoB;AAEtD,QAAI,KAAK,GAAG,OAAO,EAAG,QAAO,KAAK,eAAe;AACjD,QAAI,KAAK,MAAM,UAAU,KAAK,EAAG,QAAO,KAAK,gBAAgB;AAC7D,QAAI,KAAK,GAAG,UAAU,EAAG,QAAO,KAAK,kBAAkB;AACvD,QAAI,KAAK,GAAG,WAAW,EAAG,QAAO,KAAK,mBAAmB;AACzD,QAAI,KAAK,GAAG,SAAS,EAAG,QAAO,KAAK,iBAAiB;AACrD,QAAI,KAAK,GAAG,QAAQ,EAAG,QAAO,KAAK,gBAAgB;AAEnD,QAAI,KAAK,GAAG,QAAQ,EAAG,QAAO,KAAK,gBAAgB;AACnD,QAAI,KAAK,GAAG,QAAQ,EAAG,QAAO,KAAK,gBAAgB;AAEnD,QAAI,KAAK,GAAG,SAAS,EAAG,QAAO,KAAK,iBAAiB;AACrD,QAAI,KAAK,GAAG,SAAS,EAAG,QAAO,KAAK,iBAAiB;AACrD,QAAI,KAAK,GAAG,QAAQ,EAAG,QAAO,KAAK,gBAAgB;AAEnD,SAAK,YAAY,oBAAoB,KAAK,QAAQ,EAAE,IAAI,EAAE;AAAA,EAC5D;AAAA,EAEQ,mBAA0D;AAChE,SAAK,OAAO,SAAS;AACrB,QAAI,KAAK,GAAG,MAAM,KAAK,KAAK,GAAG,KAAK,EAAG,QAAO,EAAE,MAAM,WAAW,QAAQ,MAAM,MAAM,KAAK;AAC1F,UAAM,QAAQ,KAAK,WAAW;AAC9B,QAAI,KAAK,MAAM,KAAK,GAAG;AACrB,aAAO,EAAE,MAAM,WAAW,QAAQ,OAAO,MAAM,KAAK,WAAW,EAAE;AAAA,IACnE;AACA,WAAO,EAAE,MAAM,WAAW,QAAQ,MAAM,MAAM,MAAM;AAAA,EACtD;AAAA,EAEQ,mBAA0D;AAChE,SAAK,OAAO,SAAS;AACrB,QAAI,KAAK,GAAG,MAAM,KAAK,KAAK,GAAG,KAAK,EAAG,QAAO,EAAE,MAAM,WAAW,QAAQ,MAAM,MAAM,KAAK;AAC1F,UAAM,QAAQ,KAAK,WAAW;AAC9B,QAAI,KAAK,MAAM,KAAK,GAAG;AACrB,aAAO,EAAE,MAAM,WAAW,QAAQ,OAAO,MAAM,KAAK,WAAW,EAAE;AAAA,IACnE;AACA,WAAO,EAAE,MAAM,WAAW,QAAQ,MAAM,MAAM,MAAM;AAAA,EACtD;AAAA,EAEQ,kBAAwD;AAC9D,SAAK,OAAO,QAAQ;AACpB,QAAI,SAAwB;AAC5B,QAAI,KAAK,GAAG,OAAO,KAAK,KAAK,GAAG,QAAQ,GAAG;AAEzC,UAAI,CAAC,KAAK,GAAG,MAAM,EAAG,UAAS,KAAK,WAAW;AAAA,IACjD;AACA,QAAI,OAAsB;AAC1B,QAAI,KAAK,MAAM,MAAM,GAAG;AACtB,aAAO,KAAK,GAAG,QAAQ,IAAI,OAAO,KAAK,QAAQ,EAAE,KAAK,IAAI,KAAK,WAAW;AAAA,IAC5E;AACA,WAAO,EAAE,MAAM,UAAU,QAAQ,KAAK;AAAA,EACxC;AAAA,EAEQ,kBAA8B;AACpC,SAAK,OAAO,MAAM;AAClB,UAAM,YAAY,KAAK,MAAM,WAAW;AACxC,UAAM,OAAc,CAAC;AACrB,OAAG;AACD,YAAM,OAAO,KAAK,WAAW;AAC7B,UAAI,UAA2B;AAC/B,UAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,kBAAU,CAAC;AACX,WAAG;AACD,kBAAQ,KAAK,KAAK,WAAW,CAAC;AAAA,QAChC,SAAS,KAAK,MAAM,OAAO;AAC3B,aAAK,OAAO,QAAQ;AAAA,MACtB;AACA,WAAK,OAAO,IAAI;AAChB,UAAI,KAAK,MAAM,KAAK,EAAG,MAAK,OAAO,gBAAgB,iCAAiC;AAAA,UAC/E,MAAK,MAAM,cAAc;AAC9B,WAAK,OAAO,QAAQ;AACpB,YAAM,SAAS,KAAK,GAAG,QAAQ,IAAI,KAAK,oBAAoB,IAAI,KAAK,gBAAgB;AACrF,WAAK,OAAO,QAAQ;AACpB,WAAK,KAAK,EAAE,MAAM,SAAS,OAAO,CAAC;AAAA,IACrC,SAAS,KAAK,MAAM,OAAO;AAC3B,WAAO,EAAE,WAAW,KAAK;AAAA,EAC3B;AAAA,EAEQ,oBAAuC;AAC7C,WAAO,KAAK,GAAG,MAAM,IAAI,KAAK,gBAAgB,IAAI;AAAA,EACpD;AAAA;AAAA,EAIA,kBAA8B;AAC5B,UAAM,aAAa,KAAK,kBAAkB;AAC1C,UAAM,SAAS,KAAK,gBAAgB;AACpC,WAAO,OAAO;AACd,WAAO;AAAA,EACT;AAAA,EAEQ,kBAA8B;AACpC,SAAK,OAAO,QAAQ;AACpB,UAAM,WAAW,KAAK,MAAM,UAAU;AACtC,SAAK,MAAM,KAAK;AAEhB,QAAI,KAAK,GAAG,MAAM,GAAG;AACnB,YAAM,IAAI,YAAY,6BAA6B,QAAQ;AAAA,IAC7D;AACA,UAAM,UAAU,KAAK,mBAAmB;AACxC,QAAI,OAAwB;AAC5B,QAAI,KAAK,MAAM,MAAM,GAAG;AACtB,aAAO,KAAK,cAAc;AAAA,IAC5B;AAEA,QAAI,QAAqB;AACzB,QAAI,KAAK,MAAM,OAAO,EAAG,SAAQ,KAAK,UAAU;AAEhD,UAAM,UAAkB,CAAC;AACzB,QAAI,KAAK,MAAM,OAAO,GAAG;AACvB,WAAK,OAAO,IAAI;AAChB,SAAG;AACD,gBAAQ,KAAK,KAAK,UAAU,CAAC;AAAA,MAC/B,SAAS,KAAK,MAAM,OAAO;AAAA,IAC7B;AAEA,QAAI,SAAsB;AAC1B,QAAI,KAAK,MAAM,QAAQ,EAAG,UAAS,KAAK,UAAU;AAElD,UAAM,UAAgD,CAAC;AACvD,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,SAAG;AACD,cAAM,OAAO,KAAK,WAAW;AAC7B,aAAK,OAAO,IAAI;AAChB,aAAK,OAAO,QAAQ;AACpB,cAAM,OAAO,KAAK,gBAAgB;AAClC,aAAK,OAAO,QAAQ;AACpB,gBAAQ,KAAK,EAAE,MAAM,KAAK,CAAC;AAAA,MAC7B,SAAS,KAAK,MAAM,OAAO;AAAA,IAC7B;AAEA,UAAM,UAAU,KAAK,aAAa;AAClC,UAAM,QAAQ,KAAK,WAAW;AAE9B,UAAM,OAAmB;AAAA,MACvB,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,IACZ;AAEA,QAAI,KAAK,MAAM,SAAS,aAAa,QAAQ,GAAG;AAC9C,WAAK,WAAW,KAAK,kBAAkB;AAIvC,UAAI,KAAK,SAAS,OAAO,QAAQ,SAAS,GAAG;AAC3C,aAAK,UAAU,KAAK,SAAS,OAAO;AACpC,aAAK,SAAS,OAAO,UAAU,CAAC;AAAA,MAClC;AACA,UAAI,KAAK,SAAS,OAAO,OAAO;AAC9B,aAAK,QAAQ,KAAK,SAAS,OAAO;AAClC,aAAK,SAAS,OAAO,QAAQ;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAkC;AACxC,QAAI;AACJ,QAAI,KAAK,MAAM,OAAO,GAAG;AACvB,WAAK,KAAK,MAAM,KAAK,IAAI,cAAc;AAAA,IACzC,WAAW,KAAK,MAAM,WAAW,GAAG;AAClC,WAAK;AAAA,IACP,OAAO;AACL,WAAK,OAAO,QAAQ;AACpB,WAAK;AAAA,IACP;AACA,UAAM,SAAS,KAAK,gBAAgB;AACpC,WAAO,EAAE,IAAI,OAAO;AAAA,EACtB;AAAA,EAEQ,qBAAqC;AAC3C,UAAM,OAAuB,CAAC;AAC9B,OAAG;AACD,UAAI,KAAK,MAAM,MAAM,GAAG;AACtB,aAAK,KAAK,EAAE,MAAM,QAAQ,OAAO,KAAK,CAAC;AAAA,MACzC,WAAW,KAAK,MAAM,OAAO,KAAK,eAAe,IAAI,KAAK,QAAQ,EAAE,IAAI,GAAG;AACzE,cAAM,QAAQ,KAAK;AACnB,cAAM,QAAQ,KAAK,WAAW;AAC9B,YAAI,KAAK,MAAM,KAAK,KAAK,KAAK,GAAG,MAAM,GAAG;AACxC,eAAK,QAAQ;AACb,eAAK,KAAK,EAAE,MAAM,QAAQ,OAAO,MAAM,CAAC;AAAA,QAC1C,OAAO;AACL,eAAK,MAAM;AACX,gBAAM,OAAO,KAAK,UAAU;AAC5B,cAAI,QAAuB;AAC3B,cAAI,KAAK,MAAM,IAAI,EAAG,SAAQ,KAAK,WAAW;AAAA,mBAE5C,KAAK,QAAQ,EAAE,SAAS,WACvB,eAAe,IAAI,KAAK,QAAQ,EAAE,IAAI,KAAK,CAAC,KAAK,oBAAoB,GACtE;AACA,oBAAQ,KAAK,WAAW;AAAA,UAC1B;AACA,eAAK,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,QACzC;AAAA,MACF,OAAO;AACL,cAAM,OAAO,KAAK,UAAU;AAC5B,YAAI,QAAuB;AAC3B,YAAI,KAAK,MAAM,IAAI,EAAG,SAAQ,KAAK,WAAW;AAAA,iBAE5C,KAAK,QAAQ,EAAE,SAAS,WACvB,eAAe,IAAI,KAAK,QAAQ,EAAE,IAAI,KAAK,CAAC,KAAK,oBAAoB,GACtE;AACA,kBAAQ,KAAK,WAAW;AAAA,QAC1B;AACA,aAAK,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,MACzC;AAAA,IACF,SAAS,KAAK,MAAM,OAAO;AAC3B,WAAO;AAAA,EACT;AAAA,EAEQ,sBAA+B;AACrC,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAA0B;AAChC,QAAI,OAAO,KAAK,iBAAiB;AACjC,WAAO,MAAM;AACX,UAAI,KAAK,MAAM,OAAO,GAAG;AACvB,cAAMC,SAAQ,KAAK,iBAAiB;AACpC,eAAO,KAAK,SAAS,MAAMA,QAAO,SAAS,MAAM,IAAI;AACrD;AAAA,MACF;AACA,YAAM,WAAW,KAAK,YAAY;AAClC,UAAI,CAAC,SAAU;AACf,YAAM,QAAQ,KAAK,iBAAiB;AACpC,UAAI,KAAkB;AACtB,UAAI,QAAyB;AAC7B,UAAI,SAAS,SAAS;AACpB,gBAAQ,CAAC;AAAA,MACX,WAAW,KAAK,MAAM,IAAI,GAAG;AAC3B,aAAK,KAAK,UAAU;AAAA,MACtB,WAAW,KAAK,MAAM,OAAO,GAAG;AAC9B,aAAK,OAAO,QAAQ;AACpB,gBAAQ,CAAC;AACT,WAAG;AACD,gBAAM,KAAK,KAAK,WAAW,CAAC;AAAA,QAC9B,SAAS,KAAK,MAAM,OAAO;AAC3B,aAAK,OAAO,QAAQ;AAAA,MACtB,WAAW,SAAS,SAAS,WAAW,SAAS,SAAS,SAAS;AACjE,aAAK,YAAY,iCAAiC;AAAA,MACpD;AACA,aAAO,KAAK,SAAS,MAAM,OAAO,SAAS,MAAM,IAAI,KAAK;AAAA,IAC5D;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,SACN,MACA,OACA,UACA,IACA,OACU;AACV,WAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,UAAU,IAAI,MAAM;AAAA,EAC1D;AAAA,EAEQ,cAAuE;AAC7E,UAAM,UAAU,KAAK,MAAM,SAAS;AACpC,QAAI,KAAK,MAAM,OAAO,GAAG;AACvB,WAAK,OAAO,MAAM;AAClB,aAAO,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,IACzC;AACA,QAAI,OAA6B;AACjC,QAAI,KAAK,MAAM,OAAO,EAAG,QAAO;AAAA,aACvB,KAAK,MAAM,MAAM,EAAG,QAAO;AAAA,aAC3B,KAAK,MAAM,OAAO,EAAG,QAAO;AAAA,aAC5B,KAAK,MAAM,MAAM,EAAG,QAAO;AACpC,QAAI,SAAS,WAAW,KAAK,GAAG,OAAO,KAAK,KAAK,GAAG,MAAM,GAAG;AAC3D,WAAK,MAAM,OAAO;AAClB,UAAI,CAAC,KAAK,MAAM,MAAM,EAAG,QAAO;AAChC,aAAO,EAAE,MAAM,QAAQ;AAAA,IACzB;AACA,QAAI,KAAK,MAAM,MAAM,EAAG,QAAO,EAAE,MAAM,SAAS,QAAQ;AACxD,QAAI,QAAS,MAAK,YAAY,6BAA6B;AAC3D,WAAO;AAAA,EACT;AAAA,EAEQ,mBAA6B;AACnC,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,UAAI,KAAK,GAAG,QAAQ,KAAK,KAAK,GAAG,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG;AAC7D,cAAM,SAAS,KAAK,GAAG,QAAQ,KAAK,KAAK,GAAG,MAAM,IAAI,KAAK,gBAAgB,IAAI,KAAK,oBAAoB;AACxG,aAAK,OAAO,QAAQ;AACpB,cAAMC,SAAQ,KAAK,cAAc,KAAM,KAAK,YAAY,oCAAoC;AAC5F,eAAO,EAAE,MAAM,YAAY,QAAQ,OAAAA,OAAM;AAAA,MAC3C;AACA,YAAM,OAAO,KAAK,cAAc;AAChC,WAAK,OAAO,QAAQ;AACpB,YAAMA,SAAQ,KAAK,cAAc;AACjC,UAAIA,UAAS,KAAK,SAAS,QAAS,MAAK,QAAQA;AACjD,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,KAAK,wBAAwB;AAC3C,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,YAAM,OAAO,MAAM;AACnB,YAAM,OAAe,CAAC;AACtB,UAAI,CAAC,KAAK,GAAG,QAAQ,GAAG;AACtB,WAAG;AACD,eAAK,KAAK,KAAK,UAAU,CAAC;AAAA,QAC5B,SAAS,KAAK,MAAM,OAAO;AAAA,MAC7B;AACA,WAAK,OAAO,QAAQ;AACpB,YAAMA,SAAQ,KAAK,cAAc;AACjC,aAAO,EAAE,MAAM,cAAc,MAAM,MAAM,OAAAA,OAAM;AAAA,IACjD;AAEA,UAAM,QAAQ,KAAK,cAAc;AACjC,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,WAAK,OAAO,IAAI;AAChB,WAAK,WAAW;AAAA,IAClB,WAAW,KAAK,MAAM,KAAK,KAAK,KAAK,GAAG,SAAS,GAAG;AAClD,WAAK,QAAQ;AAAA,IACf;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,MAAM;AAAA,MACd,MAAM,MAAM;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,sBAAkC;AACxC,SAAK,OAAO,QAAQ;AACpB,UAAM,OAAiB,CAAC;AACxB,OAAG;AACD,WAAK,OAAO,QAAQ;AACpB,YAAM,MAAc,CAAC;AACrB,SAAG;AACD,YAAI,KAAK,KAAK,UAAU,CAAC;AAAA,MAC3B,SAAS,KAAK,MAAM,OAAO;AAC3B,WAAK,OAAO,QAAQ;AACpB,WAAK,KAAK,GAAG;AAAA,IACf,SAAS,KAAK,MAAM,OAAO;AAE3B,UAAM,YAAY,CAAC,SAA6B;AAAA,MAC9C,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,QAAiB,MAAM,OAAO,KAAK,EAAE;AAAA,MACzE,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS,CAAC;AAAA,MACV,QAAQ;AAAA,MACR,SAAS,CAAC;AAAA,MACV,SAAS,CAAC;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,IACZ;AACA,UAAM,SAAS,UAAU,KAAK,CAAC,KAAK,CAAC,CAAC;AACtC,QAAI,UAAU;AACd,eAAW,OAAO,KAAK,MAAM,CAAC,GAAG;AAC/B,cAAQ,WAAW,EAAE,IAAI,aAAa,QAAQ,UAAU,GAAG,EAAE;AAC7D,gBAAU,QAAQ,SAAS;AAAA,IAC7B;AACA,QAAI,KAAK,MAAM,SAAS,aAAa,QAAQ,GAAG;AAC9C,cAAQ,WAAW,KAAK,kBAAkB;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,eAA8B;AACpC,QAAI,CAAC,KAAK,MAAM,OAAO,EAAG,QAAO,CAAC;AAClC,SAAK,OAAO,IAAI;AAChB,UAAM,QAAuB,CAAC;AAC9B,OAAG;AACD,YAAM,OAAO,KAAK,UAAU;AAC5B,UAAI,MAAsB;AAC1B,UAAI,KAAK,MAAM,KAAK,EAAG,OAAM;AAAA,eACpB,KAAK,MAAM,MAAM,EAAG,OAAM;AACnC,UAAI,QAAiC;AACrC,UAAI,KAAK,MAAM,OAAO,GAAG;AACvB,YAAI,KAAK,MAAM,OAAO,EAAG,SAAQ;AAAA,iBACxB,KAAK,MAAM,MAAM,EAAG,SAAQ;AAAA,YAChC,MAAK,YAAY,oCAAoC;AAAA,MAC5D;AACA,YAAM,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAAA,IACjC,SAAS,KAAK,MAAM,OAAO;AAC3B,WAAO;AAAA,EACT;AAAA,EAEQ,aAAiC;AACvC,QAAI,CAAC,KAAK,MAAM,OAAO,EAAG,QAAO;AACjC,UAAM,QAAQ,KAAK,UAAU;AAC7B,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,aAAO,EAAE,OAAO,OAAO,QAAQ,KAAK,UAAU,EAAE;AAAA,IAClD;AACA,QAAI,KAAK,MAAM,OAAO,GAAG;AACvB,YAAM,QAAQ,KAAK,UAAU;AAC7B,aAAO,EAAE,OAAO,QAAQ,MAAM;AAAA,IAChC;AACA,QAAI,SAAsB;AAC1B,QAAI,KAAK,MAAM,QAAQ,EAAG,UAAS,KAAK,UAAU;AAClD,WAAO,EAAE,OAAO,OAAO,OAAO;AAAA,EAChC;AAAA;AAAA,EAIQ,kBAA8B;AACpC,UAAM,aAAa,KAAK,kBAAkB;AAC1C,QAAI,OAA2B;AAE/B,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,aAAO;AAAA,IACT,OAAO;AACL,WAAK,OAAO,QAAQ;AACpB,YAAM,WAAW,KAAK,gBAAgB;AACtC,UAAI,aAAa,UAAW,QAAO;AAAA,eAC1B,aAAa,SAAU,QAAO;AAAA,eAC9B,aAAa,QAAS,QAAO;AAAA,eAC7B,aAAa,WAAY,QAAO;AAAA,eAChC,aAAa,OAAQ,QAAO;AAAA,IACvC;AAEA,SAAK,OAAO,MAAM;AAClB,UAAM,QAAQ,KAAK,eAAe;AAElC,QAAI,UAA2B;AAC/B,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,gBAAU,CAAC;AACX,SAAG;AACD,gBAAQ,KAAK,KAAK,WAAW,CAAC;AAAA,MAChC,SAAS,KAAK,MAAM,OAAO;AAC3B,WAAK,OAAO,QAAQ;AAAA,IACtB;AAEA,QAAI,SAA0B;AAC9B,QAAI,SAA4B;AAEhC,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,eAAS,CAAC;AACV,SAAG;AACD,aAAK,OAAO,QAAQ;AACpB,cAAM,MAAc,CAAC;AACrB,WAAG;AACD,cAAI,KAAK,KAAK,UAAU,CAAC;AAAA,QAC3B,SAAS,KAAK,MAAM,OAAO;AAC3B,aAAK,OAAO,QAAQ;AACpB,eAAO,KAAK,GAAG;AAAA,MACjB,SAAS,KAAK,MAAM,OAAO;AAAA,IAC7B,WAAW,KAAK,GAAG,QAAQ,KAAK,KAAK,GAAG,MAAM,GAAG;AAC/C,eAAS,KAAK,gBAAgB;AAAA,IAChC,WAAW,KAAK,GAAG,SAAS,GAAG;AAC7B,WAAK,QAAQ;AACb,WAAK,OAAO,QAAQ;AACpB,gBAAU,CAAC;AACX,eAAS,CAAC,CAAC,CAAC;AAAA,IACd,OAAO;AACL,WAAK,YAAY,qCAAqC;AAAA,IACxD;AAEA,UAAM,SAAS,KAAK,kBAAkB;AACtC,UAAM,YAAY,KAAK,eAAe;AAEtC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,oBAAyC;AAC/C,QAAI,CAAC,KAAK,MAAM,IAAI,EAAG,QAAO;AAC9B,SAAK,OAAO,UAAU;AACtB,QAAI,gBAAiC;AACrC,QAAI,cAA6B;AACjC,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,sBAAgB,CAAC;AACjB,oBAAc,CAAC;AACf,SAAG;AACD,cAAM,OAAO,KAAK,cAAc,KAAK,GAAG;AACxC,oBAAY,KAAK,IAAI;AACrB,sBAAc,KAAK,KAAK,SAAS,WAAW,KAAK,OAAO,EAAE;AAAA,MAC5D,SAAS,KAAK,MAAM,OAAO;AAC3B,WAAK,OAAO,QAAQ;AAAA,IACtB;AACA,QAAI,cAA2B;AAC/B,QAAI,KAAK,MAAM,OAAO,EAAG,eAAc,KAAK,UAAU;AAEtD,SAAK,OAAO,IAAI;AAChB,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,aAAO,EAAE,eAAe,aAAa,aAAa,QAAQ,UAAU;AAAA,IACtE;AACA,SAAK,OAAO,QAAQ;AACpB,SAAK,OAAO,KAAK;AACjB,UAAM,MAAM,KAAK,cAAc;AAC/B,QAAI,QAAqB;AACzB,QAAI,KAAK,MAAM,OAAO,EAAG,SAAQ,KAAK,UAAU;AAChD,WAAO,EAAE,eAAe,aAAa,aAAa,QAAQ,EAAE,KAAK,MAAM,EAAE;AAAA,EAC3E;AAAA,EAEQ,gBAA2B;AACjC,UAAM,QAAmB,CAAC;AAC1B,OAAG;AACD,YAAM,UAAU,CAAC,KAAK,WAAW,CAAC;AAClC,WAAK,OAAO,IAAI;AAChB,YAAM,OAAO,KAAK,UAAU;AAC5B,YAAM,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,IAC9B,SAAS,KAAK,MAAM,OAAO;AAC3B,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiC;AACvC,QAAI,CAAC,KAAK,MAAM,WAAW,EAAG,QAAO,CAAC;AACtC,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA;AAAA,EAIQ,kBAA8B;AACpC,UAAM,aAAa,KAAK,kBAAkB;AAC1C,SAAK,OAAO,QAAQ;AACpB,UAAM,KAAK,KAAK,YAAY,KAAK,gBAAgB,CAAC;AAClD,UAAM,QAAQ,KAAK,eAAe;AAClC,UAAM,QAAQ,KAAK,cAAc;AACjC,SAAK,OAAO,KAAK;AACjB,UAAM,MAAM,KAAK,cAAc;AAC/B,QAAI,OAAwB;AAC5B,QAAI,KAAK,MAAM,MAAM,EAAG,QAAO,KAAK,cAAc;AAClD,QAAI,QAAqB;AACzB,QAAI,KAAK,MAAM,OAAO,EAAG,SAAQ,KAAK,UAAU;AAChD,UAAM,YAAY,KAAK,eAAe;AACtC,WAAO,EAAE,MAAM,UAAU,MAAM,YAAY,IAAI,OAAO,OAAO,KAAK,MAAM,OAAO,UAAU;AAAA,EAC3F;AAAA;AAAA,EAIQ,kBAA8B;AACpC,UAAM,aAAa,KAAK,kBAAkB;AAC1C,SAAK,OAAO,QAAQ;AACpB,SAAK,OAAO,MAAM;AAClB,UAAM,QAAQ,KAAK,eAAe;AAClC,UAAM,QAAQ,KAAK,cAAc;AACjC,QAAI,QAAqB;AACzB,QAAI,KAAK,MAAM,OAAO,EAAG,SAAQ,KAAK,UAAU;AAChD,UAAM,YAAY,KAAK,eAAe;AACtC,WAAO,EAAE,MAAM,UAAU,MAAM,YAAY,OAAO,OAAO,OAAO,UAAU;AAAA,EAC5E;AAAA;AAAA,EAIQ,kBAA6B;AACnC,SAAK,OAAO,QAAQ;AACpB,UAAM,OAAO,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,WAAW;AACzD,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,WAAK,OAAO,OAAO;AACnB,aAAO,KAAK,wBAAwB;AAAA,IACtC;AACA,QAAI,KAAK,MAAM,SAAS,EAAG,QAAO,KAAK,mBAAmB,IAAI;AAC9D,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,WAAK,OAAO,OAAO;AACnB,aAAO,KAAK,iBAAiB,MAAM,IAAI;AAAA,IACzC;AACA,QAAI,KAAK,MAAM,OAAO,EAAG,QAAO,KAAK,iBAAiB,OAAO,IAAI;AACjE,QAAI,KAAK,MAAM,MAAM,EAAG,QAAO,KAAK,gBAAgB,IAAI;AACxD,SAAK,OAAO,OAAO;AACnB,WAAO,KAAK,iBAAiB,IAAI;AAAA,EACnC;AAAA,EAEQ,0BAAkD;AACxD,UAAM,cAAc,KAAK,iBAAiB;AAC1C,UAAM,OAAO,KAAK,eAAe;AACjC,SAAK,OAAO,OAAO;AACnB,UAAM,SAAS,KAAK,WAAW;AAC/B,UAAM,aAAuB,CAAC;AAC9B,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,UAAI,CAAC,KAAK,GAAG,QAAQ,GAAG;AACtB,WAAG;AACD,qBAAW,KAAK,KAAK,qBAAqB,CAAC;AAAA,QAC7C,SAAS,KAAK,MAAM,OAAO;AAAA,MAC7B;AACA,WAAK,OAAO,QAAQ;AAAA,IACtB;AACA,WAAO,EAAE,MAAM,wBAAwB,aAAa,MAAM,QAAQ,WAAW;AAAA,EAC/E;AAAA;AAAA,EAGQ,uBAA+B;AAErC,QAAI,KAAK,GAAG,QAAQ,GAAG;AACrB,YAAM,QAAQ,OAAO,KAAK,QAAQ,EAAE,OAAO;AAC3C,WAAK,QAAQ;AACb,aAAO;AAAA,IACT;AAGA,UAAM,QAAQ,KAAK,mBAAmB;AACtC,QAAI,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,MAAM,GAAG;AAC1C,YAAM,QAAQ,KAAK,6BAA6B;AAChD,aAAO,GAAG,KAAK,IAAI,KAAK;AAAA,IAC1B;AAEA,UAAM,SAAmB,CAAC;AAC1B,WAAO,KAAK,GAAG,OAAO,KAAK,KAAK,GAAG,QAAQ,GAAG;AAE5C,UAAI,KAAK,GAAG,OAAO,GAAG;AACpB,cAAM,QAAQ,KAAK,QAAQ,EAAE,MAAM,YAAY;AAC/C,YACE,UAAU,eACV,UAAU,gBACV,UAAU,UACV,UAAU,aACV,UAAU,UACV,UAAU,UACV,UAAU,WACV;AACA,iBAAO,KAAK,KAAK,QAAQ,EAAE,KAAK;AAChC,eAAK,QAAQ;AACb;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,WAAO,OAAO,SAAS,GAAG,KAAK,IAAI,OAAO,KAAK,GAAG,CAAC,KAAK;AAAA,EAC1D;AAAA,EAEQ,qBAA6B;AACnC,QAAI,KAAK,GAAG,QAAQ,GAAG;AAErB,YAAM,QAAQ,OAAO,KAAK,QAAQ,EAAE,OAAO;AAC3C,WAAK,QAAQ;AACb,aAAO,IAAI,MAAM,WAAW,KAAK,IAAI,CAAC;AAAA,IACxC;AACA,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEQ,+BAAuC;AAC7C,QAAI,KAAK,GAAG,QAAQ,GAAG;AACrB,YAAM,QAAQ,OAAO,KAAK,QAAQ,EAAE,OAAO;AAC3C,WAAK,QAAQ;AACb,aAAO,IAAI,MAAM,WAAW,KAAK,IAAI,CAAC;AAAA,IACxC;AACA,QAAI,KAAK,GAAG,QAAQ,GAAG;AACrB,YAAM,QAAQ,KAAK,QAAQ,EAAE;AAC7B,WAAK,QAAQ;AACb,aAAO;AAAA,IACT;AACA,QAAI,KAAK,GAAG,OAAO,GAAG;AACpB,aAAO,KAAK,WAAW;AAAA,IACzB;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,mBAA4B;AAClC,QAAI,CAAC,KAAK,MAAM,IAAI,EAAG,QAAO;AAC9B,SAAK,OAAO,KAAK;AACjB,SAAK,OAAO,QAAQ;AACpB,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAyB;AAC/B,QAAI,CAAC,KAAK,MAAM,IAAI,EAAG,QAAO;AAC9B,SAAK,OAAO,QAAQ;AACpB,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,QAAiD;AACnE,QAAI,CAAC,OAAQ,QAAO;AACpB,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,iBAAiB,MAAgC;AACvD,UAAM,cAAc,KAAK,iBAAiB;AAC1C,UAAM,OAAO,KAAK,eAAe;AAEjC,QAAI,KAAK,MAAM,IAAI,GAAG;AACpB,YAAM,WAAW,KAAK,gBAAgB;AACtC,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,CAAC;AAAA,QACV,aAAa,CAAC;AAAA,QACd;AAAA,QACA,cAAc;AAAA,QACd,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,SAAK,OAAO,QAAQ;AACpB,UAAM,UAAuB,CAAC;AAC9B,UAAM,cAAiC,CAAC;AACxC,OAAG;AACD,UAAI,KAAK,GAAG,SAAS,KAAK,KAAK,GAAG,QAAQ,KAAK,KAAK,GAAG,OAAO,KAAK,KAAK,GAAG,SAAS,KAAK,KAAK,GAAG,YAAY,GAAG;AAC9G,oBAAY,KAAK,KAAK,qBAAqB,CAAC;AAAA,MAC9C,OAAO;AACL,gBAAQ,KAAK,KAAK,eAAe,CAAC;AAAA,MACpC;AAAA,IACF,SAAS,KAAK,MAAM,OAAO;AAC3B,SAAK,OAAO,QAAQ;AACpB,QAAI,eAAe;AACnB,QAAI,SAAS;AACb,WAAO,CAAC,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG;AAC1C,UAAI,KAAK,MAAM,SAAS,GAAG;AACzB,cAAM,OAAO,KAAK,WAAW;AAC7B,YAAI,KAAK,YAAY,MAAM,QAAS,MAAK,YAAY,8BAA8B;AACnF,uBAAe;AAAA,MACjB,OAAO;AACL,cAAM,OAAO,KAAK,WAAW;AAC7B,YAAI,KAAK,YAAY,MAAM,SAAU,MAAK,YAAY,2BAA2B,IAAI,EAAE;AACvF,iBAAS;AAAA,MACX;AACA,WAAK,MAAM,OAAO;AAAA,IACpB;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAA4B;AAClC,UAAM,OAAO,KAAK,WAAW;AAC7B,QAAI,WAA0B;AAC9B,QAAI,KAAK,QAAQ,EAAE,SAAS,WAAW,eAAe,IAAI,KAAK,QAAQ,EAAE,IAAI,GAAG;AAC9E,UACE,CAAC,KAAK,GAAG,YAAY,KACrB,CAAC,KAAK,GAAG,SAAS,KAClB,CAAC,KAAK,GAAG,KAAK,KACd,CAAC,KAAK,GAAG,QAAQ,KACjB,CAAC,KAAK,GAAG,OAAO,KAChB,CAAC,KAAK,GAAG,SAAS,KAClB,CAAC,KAAK,GAAG,YAAY,KACrB,CAAC,KAAK,GAAG,SAAS,KAClB,CAAC,KAAK,GAAG,WAAW,KACpB,CAAC,KAAK,GAAG,OAAO,KAChB,CAAC,KAAK,GAAG,QAAQ,GACjB;AACA,mBAAW,KAAK,cAAc;AAAA,MAChC;AAAA,IACF;AACA,UAAM,cAAkC,CAAC;AACzC,WAAO,KAAK,wBAAwB,GAAG;AACrC,kBAAY,KAAK,KAAK,sBAAsB,CAAC;AAAA,IAC/C;AACA,WAAO,EAAE,MAAM,UAAU,YAAY;AAAA,EACvC;AAAA;AAAA,EAGQ,gBAAwB;AAC9B,UAAM,OAAO,KAAK,WAAW;AAC7B,QAAI,CAAC,KAAK,MAAM,QAAQ,EAAG,QAAO;AAClC,UAAM,QAAkB,CAAC;AACzB,OAAG;AACD,UAAI,KAAK,GAAG,QAAQ,KAAK,KAAK,GAAG,MAAM,KAAK,KAAK,GAAG,OAAO,GAAG;AAC5D,YAAI,OAAO;AACX,YAAI,KAAK,MAAM,MAAM,EAAG,QAAO;AAAA,iBACtB,KAAK,MAAM,OAAO,EAAG,QAAO;AACrC,cAAM,SAAS,KAAK,QAAQ;AAC5B,cAAM,KAAK,GAAG,IAAI,GAAG,OAAO,KAAK,EAAE;AAAA,MACrC,OAAO;AACL,cAAM,KAAK,KAAK,WAAW,CAAC;AAAA,MAC9B;AAAA,IACF,SAAS,KAAK,MAAM,OAAO;AAC3B,SAAK,OAAO,QAAQ;AACpB,WAAO,GAAG,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC;AAAA,EACnC;AAAA,EAEQ,0BAAmC;AACzC,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,wBAA0C;AAChD,SAAK,MAAM,YAAY;AACvB,QAAI,KAAK,QAAQ,EAAE,SAAS,WAAW,eAAe,IAAI,KAAK,QAAQ,EAAE,IAAI,GAAG;AAC9E,YAAM,OAAO,KAAK,KAAK;AACvB,UACE,KAAK,SAAS,aACd,KAAK,SAAS,YACd,KAAK,SAAS,WACd,KAAK,SAAS,aACd,KAAK,SAAS,SACd,KAAK,SAAS,cACd;AACA,aAAK,WAAW;AAAA,MAClB;AAAA,IACF;AACA,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,WAAK,OAAO,KAAK;AACjB,UAAI,QAA+B;AACnC,UAAI,KAAK,MAAM,KAAK,EAAG,SAAQ;AAAA,eACtB,KAAK,MAAM,MAAM,EAAG,SAAQ;AACrC,YAAM,gBAAgB,KAAK,MAAM,eAAe;AAChD,YAAM,WAAW,KAAK,gBAAgB;AACtC,aAAO,EAAE,MAAM,eAAe,OAAO,eAAe,SAAS;AAAA,IAC/D;AACA,QAAI,KAAK,MAAM,KAAK,GAAG;AACrB,WAAK,OAAO,MAAM;AAClB,YAAM,WAAW,KAAK,gBAAgB;AACtC,aAAO,EAAE,MAAM,YAAY,SAAS;AAAA,IACtC;AACA,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,YAAM,WAAW,KAAK,gBAAgB;AACtC,aAAO,EAAE,MAAM,UAAU,SAAS;AAAA,IACpC;AACA,QAAI,KAAK,MAAM,OAAO,GAAG;AACvB,WAAK,OAAO,QAAQ;AACpB,YAAM,OAAO,KAAK,UAAU;AAC5B,WAAK,OAAO,QAAQ;AACpB,aAAO,EAAE,MAAM,SAAS,KAAK;AAAA,IAC/B;AACA,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,YAAM,OAAO,KAAK,UAAU;AAC5B,aAAO,EAAE,MAAM,WAAW,KAAK;AAAA,IACjC;AACA,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,YAAM,OAAO,KAAK,WAAW;AAC7B,aAAO,EAAE,MAAM,WAAW,KAAK;AAAA,IACjC;AACA,QAAI,KAAK,MAAM,YAAY,GAAG;AAC5B,aAAO,KAAK,0BAA0B;AAAA,IACxC;AACA,QAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,YAAM,SAAS,KAAK,WAAW;AAC/B,UAAI,OAAO,YAAY,MAAM,SAAU,MAAK,YAAY,iCAAiC;AACzF,WAAK,OAAO,IAAI;AAChB,aAAO,KAAK,yBAAyB;AAAA,IACvC;AACA,QAAI,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG,QAAQ,GAAG;AACzC,aAAO,KAAK,yBAAyB;AAAA,IACvC;AACA,SAAK,YAAY,4BAA4B;AAAA,EAC/C;AAAA,EAEQ,2BAA6C;AACnD,SAAK,OAAO,QAAQ;AACpB,UAAM,OAAO,KAAK,UAAU;AAC5B,SAAK,OAAO,QAAQ;AACpB,QAAI,SAAS;AACb,QAAI,KAAK,QAAQ,EAAE,SAAS,WAAW,KAAK,GAAG,SAAS,GAAG;AACzD,YAAM,OAAO,KAAK,WAAW,EAAE,YAAY;AAC3C,UAAI,SAAS,SAAU,UAAS;AAAA,eACvB,SAAS,UAAW,UAAS;AAAA,UACjC,MAAK,YAAY,8DAA8D;AAAA,IACtF;AACA,WAAO,EAAE,MAAM,aAAa,MAAM,OAAO;AAAA,EAC3C;AAAA,EAEQ,4BAA8C;AACpD,UAAM,QAAQ,KAAK,eAAe;AAClC,QAAI,UAA2B;AAC/B,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,gBAAU,CAAC;AACX,SAAG;AACD,gBAAQ,KAAK,KAAK,WAAW,CAAC;AAAA,MAChC,SAAS,KAAK,MAAM,OAAO;AAC3B,WAAK,OAAO,QAAQ;AAAA,IACtB;AACA,UAAM,EAAE,UAAU,SAAS,IAAI,KAAK,eAAe;AACnD,UAAM,EAAE,YAAY,kBAAkB,IAAI,KAAK,gBAAgB;AAC/D,WAAO,EAAE,MAAM,cAAc,OAAO,SAAS,UAAU,UAAU,YAAY,kBAAkB;AAAA,EACjG;AAAA,EAEQ,uBAAwC;AAC9C,QAAI,OAAsB;AAC1B,QAAI,KAAK,MAAM,YAAY,GAAG;AAC5B,aAAO,KAAK,WAAW;AAAA,IACzB;AACA,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,WAAK,OAAO,KAAK;AACjB,WAAK,OAAO,QAAQ;AACpB,YAAM,UAAU,KAAK,oBAAoB;AACzC,WAAK,OAAO,QAAQ;AACpB,YAAM,WAAW,KAAK,gBAAgB;AACtC,aAAO,EAAE,MAAM,eAAe,SAAS,SAAS;AAAA,IAClD;AACA,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,WAAK,OAAO,QAAQ;AACpB,YAAM,UAAU,KAAK,oBAAoB;AACzC,WAAK,OAAO,QAAQ;AACpB,YAAM,WAAW,KAAK,gBAAgB;AACtC,aAAO,EAAE,MAAM,UAAU,SAAS,UAAU,KAAK;AAAA,IACnD;AACA,QAAI,KAAK,MAAM,OAAO,GAAG;AACvB,WAAK,OAAO,QAAQ;AACpB,YAAM,OAAO,KAAK,UAAU;AAC5B,WAAK,OAAO,QAAQ;AACpB,aAAO,EAAE,MAAM,SAAS,MAAM,KAAK;AAAA,IACrC;AACA,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,WAAK,OAAO,KAAK;AACjB,WAAK,OAAO,QAAQ;AACpB,YAAM,UAAoB,CAAC;AAC3B,SAAG;AACD,gBAAQ,KAAK,KAAK,WAAW,CAAC;AAAA,MAChC,SAAS,KAAK,MAAM,OAAO;AAC3B,WAAK,OAAO,QAAQ;AACpB,WAAK,OAAO,YAAY;AACxB,YAAM,WAAW,KAAK,eAAe;AACrC,UAAI,aAA8B;AAClC,UAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,qBAAa,CAAC;AACd,WAAG;AACD,qBAAW,KAAK,KAAK,WAAW,CAAC;AAAA,QACnC,SAAS,KAAK,MAAM,OAAO;AAC3B,aAAK,OAAO,QAAQ;AAAA,MACtB;AACA,YAAM,EAAE,UAAU,SAAS,IAAI,KAAK,eAAe;AACnD,YAAM,EAAE,YAAY,kBAAkB,IAAI,KAAK,gBAAgB;AAC/D,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,SAAK,YAAY,2BAA2B;AAAA,EAC9C;AAAA,EAEQ,sBAAuC;AAC7C,UAAM,OAAwB,CAAC;AAC/B,OAAG;AACD,YAAM,OAAO,KAAK,cAAc,KAAK,GAAG;AACxC,UAAI,UAAyB;AAC7B,UAAI,QAAQ;AACZ,UAAI,MAAM,SAAS,WAAW;AAC5B,kBAAU,MAAM;AAChB,gBAAQ,MAAM;AAAA,MAChB;AACA,UAAI,KAAK,MAAM,SAAS,EAAG,WAAU,KAAK,WAAW;AACrD,UAAI,QAA+B;AACnC,UAAI,KAAK,MAAM,KAAK,EAAG,SAAQ;AAAA,eACtB,KAAK,MAAM,MAAM,EAAG,SAAQ;AACrC,UAAI,MAAM,SAAS,YAAY,MAAM,UAAU,MAAM;AACnD,aAAK,KAAK,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,CAAC;AAAA,MAChD,OAAO;AACL,aAAK,KAAK,EAAE,MAAM,IAAI,SAAS,OAAO,MAAM,MAAM,CAAC;AAAA,MACrD;AAAA,IACF,SAAS,KAAK,MAAM,OAAO;AAC3B,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAyC;AAC/C,QAAI,CAAC,KAAK,MAAM,IAAI,EAAG,QAAO;AAC9B,SAAK,OAAO,UAAU;AACtB,WAAO,KAAK,oBAAoB;AAAA,EAClC;AAAA,EAEQ,sBAAsC;AAC5C,QAAI,KAAK,MAAM,UAAU,EAAG,QAAO;AACnC,QAAI,KAAK,MAAM,OAAO,EAAG,QAAO;AAChC,QAAI,KAAK,MAAM,MAAM,EAAG,QAAO;AAC/B,QAAI,KAAK,MAAM,QAAQ,EAAG,QAAO;AACjC,QAAI,KAAK,MAAM,SAAS,EAAG,QAAO;AAClC,SAAK,YAAY,0BAA0B;AAAA,EAC7C;AAAA,EAEQ,cAAc,MAA4C;AAChE,QAAI,CAAC,KAAK,MAAM,IAAI,EAAG,QAAO;AAC9B,SAAK,OAAO,IAAI;AAChB,QAAI,KAAK,MAAM,KAAK,GAAG;AACrB,UAAI,KAAK,MAAM,MAAM,EAAG,QAAO;AAC/B,WAAK,OAAO,SAAS;AACrB,aAAO;AAAA,IACT;AACA,QAAI,KAAK,MAAM,SAAS,EAAG,QAAO;AAClC,QAAI,KAAK,MAAM,UAAU,EAAG,QAAO;AACnC,QAAI,KAAK,MAAM,IAAI,GAAG;AACpB,WAAK,OAAO,QAAQ;AACpB,aAAO;AAAA,IACT;AACA,SAAK,YAAY,eAAe,IAAI,SAAS;AAAA,EAC/C;AAAA,EAEQ,iBAA2E;AACjF,QAAI,WAA4B;AAChC,QAAI,WAA4B;AAChC,WAAO,KAAK,GAAG,IAAI,GAAG;AACpB,UAAI,KAAK,KAAK,EAAE,SAAS,SAAU,YAAW,KAAK,cAAc,QAAQ;AAAA,eAChE,KAAK,KAAK,EAAE,SAAS,SAAU,YAAW,KAAK,cAAc,QAAQ;AAAA,UACzE,MAAK,YAAY,iCAAiC;AAAA,IACzD;AACA,WAAO,EAAE,UAAU,SAAS;AAAA,EAC9B;AAAA,EAEQ,kBAAuE;AAC7E,QAAI,aAAa;AACjB,QAAI,oBAAoB;AACxB,QAAI,KAAK,MAAM,KAAK,GAAG;AACrB,WAAK,OAAO,YAAY;AAAA,IAC1B,WAAW,KAAK,MAAM,YAAY,GAAG;AACnC,mBAAa;AAAA,IACf;AACA,QAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,UAAI,KAAK,MAAM,UAAU,EAAG,qBAAoB;AAAA,WAC3C;AACH,aAAK,OAAO,WAAW;AACvB,4BAAoB;AAAA,MACtB;AAAA,IACF;AACA,WAAO,EAAE,YAAY,mBAAmB,cAAc,kBAAkB;AAAA,EAC1E;AAAA,EAEQ,kBAAyC;AAC/C,QAAI,CAAC,KAAK,MAAM,IAAI,EAAG,QAAO;AAC9B,WAAO,KAAK,oBAAoB;AAAA,EAClC;AAAA,EAEQ,iBAAiB,QAAiB,OAAiC;AACzE,UAAM,cAAc,KAAK,iBAAiB;AAC1C,UAAM,OAAO,KAAK,WAAW;AAC7B,SAAK,OAAO,IAAI;AAChB,UAAM,QAAQ,KAAK,eAAe;AAClC,SAAK,OAAO,QAAQ;AACpB,UAAM,UAAU,KAAK,oBAAoB;AACzC,SAAK,OAAO,QAAQ;AACpB,QAAI,QAAqB;AACzB,QAAI,KAAK,MAAM,OAAO,EAAG,SAAQ,KAAK,UAAU;AAChD,WAAO,EAAE,MAAM,gBAAgB,QAAQ,aAAa,MAAM,OAAO,SAAS,MAAM;AAAA,EAClF;AAAA,EAEQ,gBAAgB,MAA+B;AACrD,UAAM,cAAc,KAAK,iBAAiB;AAC1C,UAAM,OAAO,KAAK,WAAW;AAC7B,QAAI,UAA2B;AAC/B,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,gBAAU,CAAC;AACX,SAAG;AACD,gBAAQ,KAAK,KAAK,WAAW,CAAC;AAAA,MAChC,SAAS,KAAK,MAAM,OAAO;AAC3B,WAAK,OAAO,QAAQ;AAAA,IACtB;AACA,SAAK,OAAO,IAAI;AAChB,UAAM,SAAS,KAAK,gBAAgB;AACpC,WAAO,EAAE,MAAM,eAAe,aAAa,MAAM,MAAM,SAAS,OAAO;AAAA,EACzE;AAAA,EAEQ,mBAAmB,MAAkC;AAC3D,UAAM,cAAc,KAAK,iBAAiB;AAC1C,UAAM,OAAO,KAAK,eAAe;AACjC,QAAI;AACJ,QAAI,KAAK,MAAM,QAAQ,EAAG,UAAS;AAAA,aAC1B,KAAK,MAAM,OAAO,EAAG,UAAS;AAAA,aAC9B,KAAK,MAAM,SAAS,GAAG;AAC9B,WAAK,OAAO,IAAI;AAChB,eAAS;AAAA,IACX,OAAO;AACL,WAAK,YAAY,uCAAuC;AAAA,IAC1D;AAEA,QAAI;AACJ,QAAI,KAAK,MAAM,QAAQ,EAAG,SAAQ;AAAA,aACzB,KAAK,MAAM,QAAQ,EAAG,SAAQ;AAAA,aAC9B,KAAK,MAAM,QAAQ,EAAG,SAAQ;AAAA,QAClC,MAAK,YAAY,oCAAoC;AAE1D,QAAI,gBAAiC;AACrC,QAAI,UAAU,YAAY,KAAK,MAAM,IAAI,GAAG;AAC1C,sBAAgB,CAAC;AACjB,SAAG;AACD,sBAAc,KAAK,KAAK,WAAW,CAAC;AAAA,MACtC,SAAS,KAAK,MAAM,OAAO;AAAA,IAC7B;AAEA,SAAK,OAAO,IAAI;AAChB,UAAM,QAAQ,KAAK,eAAe;AAElC,QAAI,aAAa;AACjB,QAAI,KAAK,MAAM,KAAK,GAAG;AACrB,WAAK,OAAO,MAAM;AAClB,WAAK,OAAO,KAAK;AACjB,mBAAa;AAAA,IACf;AAEA,QAAI,OAAoB;AACxB,QAAI,KAAK,MAAM,MAAM,EAAG,QAAO,KAAK,UAAU;AAE9C,SAAK,OAAO,OAAO;AACnB,UAAM,OAAO,KAAK,iBAAiB;AAEnC,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAgC;AACtC,UAAM,OAAoB,CAAC;AAC3B,WAAO,CAAC,KAAK,GAAG,KAAK,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG;AACzC,UAAI,KAAK,MAAM,MAAM,EAAG;AACxB,WAAK,KAAK,KAAK,eAAe,CAAC;AAC/B,WAAK,MAAM,MAAM;AAAA,IACnB;AACA,SAAK,OAAO,KAAK;AACjB,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,gBAA2B;AACjC,SAAK,OAAO,MAAM;AAClB,QAAI,KAAK,MAAM,OAAO,EAAG,QAAO,KAAK,eAAe;AACpD,QAAI,KAAK,MAAM,OAAO,EAAG,QAAO,KAAK,eAAe;AACpD,QAAI,KAAK,MAAM,MAAM,EAAG,QAAO,KAAK,cAAc;AAClD,QAAI,KAAK,MAAM,SAAS,EAAG,QAAO,KAAK,iBAAiB;AACxD,SAAK,YAAY,2CAA2C;AAAA,EAC9D;AAAA,EAEQ,iBAAgC;AACtC,UAAM,WAAW,KAAK,cAAc;AACpC,UAAM,OAAO,KAAK,eAAe;AACjC,WAAO,EAAE,MAAM,cAAc,UAAU,KAAK;AAAA,EAC9C;AAAA,EAEQ,iBAAgC;AACtC,UAAM,WAAW,KAAK,cAAc;AACpC,UAAM,OAAO,KAAK,WAAW;AAC7B,WAAO,EAAE,MAAM,cAAc,UAAU,KAAK;AAAA,EAC9C;AAAA,EAEQ,gBAA8B;AACpC,UAAM,WAAW,KAAK,cAAc;AACpC,UAAM,OAAO,KAAK,WAAW;AAC7B,WAAO,EAAE,MAAM,aAAa,UAAU,KAAK;AAAA,EAC7C;AAAA,EAEQ,mBAAoC;AAC1C,UAAM,WAAW,KAAK,cAAc;AACpC,UAAM,OAAO,KAAK,eAAe;AACjC,WAAO,EAAE,MAAM,gBAAgB,UAAU,KAAK;AAAA,EAChD;AAAA;AAAA,EAIQ,sBAAsC;AAC5C,SAAK,OAAO,OAAO;AACnB,SAAK,OAAO,OAAO;AACnB,UAAM,QAAQ,KAAK,eAAe;AAClC,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,UAAI,KAAK,MAAM,IAAI,GAAG;AACpB,cAAM,UAAU,KAAK,eAAe;AACpC,eAAO,EAAE,MAAM,eAAe,OAAO,QAAQ,EAAE,MAAM,gBAAgB,QAAQ,EAAE;AAAA,MACjF;AACA,UAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,cAAM,UAAU,KAAK,WAAW;AAChC,aAAK,OAAO,IAAI;AAChB,cAAM,UAAU,KAAK,WAAW;AAChC,eAAO,EAAE,MAAM,eAAe,OAAO,QAAQ,EAAE,MAAM,iBAAiB,SAAS,QAAQ,EAAE;AAAA,MAC3F;AACA,WAAK,YAAY,oCAAoC;AAAA,IACvD;AACA,QAAI,KAAK,MAAM,KAAK,GAAG;AACrB,WAAK,MAAM,QAAQ;AACnB,YAAM,SAAS,KAAK,eAAe;AACnC,aAAO,EAAE,MAAM,eAAe,OAAO,QAAQ,EAAE,MAAM,cAAc,OAAO,EAAE;AAAA,IAC9E;AACA,QAAI,KAAK,MAAM,MAAM,GAAG;AACtB,WAAK,MAAM,QAAQ;AACnB,YAAM,OAAO,KAAK,WAAW;AAC7B,aAAO,EAAE,MAAM,eAAe,OAAO,QAAQ,EAAE,MAAM,eAAe,KAAK,EAAE;AAAA,IAC7E;AACA,SAAK,YAAY,iDAAiD;AAAA,EACpE;AAAA;AAAA,EAIQ,iBAA4B;AAClC,SAAK,OAAO,OAAO;AACnB,QAAI,OAA0B;AAC9B,QAAI,KAAK,MAAM,UAAU,EAAG,QAAO;AAAA,aAC1B,KAAK,MAAM,WAAW,EAAG,QAAO;AAAA,aAChC,KAAK,MAAM,WAAW,EAAG,QAAO;AACzC,SAAK,MAAM,aAAa;AACxB,WAAO,EAAE,MAAM,SAAS,KAAK;AAAA,EAC/B;AAAA,EAEQ,kBAA8B;AACpC,QAAI,KAAK,GAAG,KAAK,EAAG,MAAK,QAAQ;AAAA,QAC5B,MAAK,OAAO,QAAQ;AACzB,SAAK,MAAM,aAAa;AACxB,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AAAA,EAEQ,oBAAkC;AACxC,SAAK,OAAO,UAAU;AACtB,SAAK,MAAM,aAAa;AACxB,QAAI,YAA2B;AAC/B,QAAI,KAAK,MAAM,IAAI,GAAG;AACpB,WAAK,MAAM,WAAW;AACtB,kBAAY,KAAK,WAAW;AAAA,IAC9B;AACA,WAAO,EAAE,MAAM,YAAY,UAAU;AAAA,EACvC;AAAA,EAEQ,qBAAoC;AAC1C,SAAK,OAAO,WAAW;AACvB,UAAM,OAAO,KAAK,WAAW;AAC7B,WAAO,EAAE,MAAM,aAAa,KAAK;AAAA,EACnC;AAAA,EAEQ,mBAAgC;AACtC,SAAK,OAAO,SAAS;AACrB,SAAK,MAAM,WAAW;AACtB,UAAM,OAAO,KAAK,WAAW;AAC7B,WAAO,EAAE,MAAM,WAAW,KAAK;AAAA,EACjC;AAAA;AAAA,EAIQ,kBAA8B;AACpC,SAAK,OAAO,QAAQ;AACpB,UAAM,OAAO,KAAK,WAAW;AAC7B,QAAI,KAAK,MAAM,IAAI,GAAG;AACpB,aAAO,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK,UAAU,EAAE;AAAA,IACzD;AACA,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,UAAI,QAAqB;AACzB,UAAI,CAAC,KAAK,GAAG,QAAQ,EAAG,SAAQ,KAAK,UAAU;AAC/C,WAAK,OAAO,QAAQ;AACpB,aAAO,EAAE,MAAM,UAAU,MAAM,MAAM;AAAA,IACvC;AACA,WAAO,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;AAAA,EAC7C;AAAA;AAAA,EAIA,YAAkB;AAChB,WAAO,KAAK,cAAc,KAAK,EAAE;AAAA,EACnC;AAAA,EAEQ,cAAc,SAAuB;AAC3C,QAAI,OAAO,KAAK,eAAe;AAE/B,WAAO,MAAM;AACX,aAAO,KAAK,aAAa,IAAI;AAE7B,UAAI,KAAK,GAAG,KAAK,KAAK,KAAK,cAAc,SAAS;AAChD,cAAM,IAAI,KAAK,KAAK;AACpB,YAAI,EAAE,SAAS,MAAM;AACnB,eAAK,QAAQ;AACb,eAAK,QAAQ;AACb,iBAAO,KAAK,WAAW,MAAM,IAAI;AACjC;AAAA,QACF;AACA,YAAI,EAAE,SAAS,QAAQ;AACrB,eAAK,QAAQ;AACb,eAAK,QAAQ;AACb,iBAAO,KAAK,aAAa,MAAM,MAAM,MAAM;AAC3C;AAAA,QACF;AACA,YAAI,EAAE,SAAS,QAAQ;AACrB,eAAK,QAAQ;AACb,eAAK,QAAQ;AACb,iBAAO,KAAK,aAAa,MAAM,MAAM,MAAM;AAC3C;AAAA,QACF;AACA,YAAI,EAAE,SAAS,WAAW;AACxB,eAAK,QAAQ;AACb,eAAK,QAAQ;AACb,gBAAM,QAAQ,KAAK,cAAc,KAAK,aAAa,CAAC;AACpD,eAAK,OAAO,KAAK;AACjB,gBAAM,QAAQ,KAAK,cAAc,KAAK,MAAM,CAAC;AAC7C,iBAAO,EAAE,MAAM,WAAW,KAAK,MAAM,MAAM,MAAM,OAAO,MAAM;AAC9D;AAAA,QACF;AAAA,MACF;AAEA,UAAI,KAAK,GAAG,IAAI,KAAK,KAAK,cAAc,SAAS;AAC/C,aAAK,QAAQ;AACb,YAAI,KAAK,GAAG,KAAK,KAAK,KAAK,KAAK,EAAE,SAAS,YAAY;AACrD,eAAK,QAAQ;AACb,eAAK,QAAQ;AACb,eAAK,OAAO,MAAM;AAClB,gBAAMD,SAAQ,KAAK,cAAc,KAAK,aAAa,CAAC;AACpD,iBAAO,EAAE,MAAM,UAAU,IAAI,wBAAwB,MAAM,OAAAA,OAAM;AACjE;AAAA,QACF;AACA,YAAI,KAAK,GAAG,UAAU,GAAG;AACvB,eAAK,QAAQ;AACb,eAAK,OAAO,MAAM;AAClB,gBAAMA,SAAQ,KAAK,cAAc,KAAK,aAAa,CAAC;AACpD,iBAAO,EAAE,MAAM,UAAU,IAAI,oBAAoB,MAAM,OAAAA,OAAM;AAC7D;AAAA,QACF;AACA,cAAM,MAAM,KAAK,MAAM,KAAK;AAC5B,cAAMA,SAAQ,KAAK,WAAW;AAC9B,eAAO,EAAE,MAAM,UAAU,IAAI,MAAM,WAAW,MAAM,MAAM,OAAAA,OAAM;AAChE;AAAA,MACF;AAEA,UAAI,KAAK,GAAG,IAAI,KAAK,KAAK,cAAc,SAAS;AAC/C,aAAK,QAAQ;AACb,eAAO,KAAK,WAAW,MAAM,KAAK;AAClC;AAAA,MACF;AACA,UAAI,KAAK,GAAG,MAAM,KAAK,KAAK,cAAc,SAAS;AACjD,aAAK,QAAQ;AACb,eAAO,KAAK,aAAa,MAAM,OAAO,MAAM;AAC5C;AAAA,MACF;AACA,UAAI,KAAK,GAAG,MAAM,KAAK,KAAK,cAAc,SAAS;AACjD,aAAK,QAAQ;AACb,eAAO,KAAK,aAAa,MAAM,OAAO,MAAM;AAC5C;AAAA,MACF;AACA,UAAI,KAAK,GAAG,OAAO,KAAK,KAAK,cAAc,SAAS;AAClD,aAAK,QAAQ;AACb,cAAMA,SAAQ,KAAK,cAAc,KAAK,aAAa,CAAC;AACpD,eAAO,EAAE,MAAM,UAAU,IAAI,SAAS,MAAM,OAAAA,OAAM;AAClD;AAAA,MACF;AACA,UAAI,KAAK,GAAG,SAAS,KAAK,KAAK,cAAc,SAAS;AACpD,aAAK,QAAQ;AACb,cAAM,QAAQ,KAAK,cAAc,KAAK,aAAa,CAAC;AACpD,aAAK,OAAO,KAAK;AACjB,cAAM,QAAQ,KAAK,cAAc,KAAK,MAAM,CAAC;AAC7C,eAAO,EAAE,MAAM,WAAW,KAAK,OAAO,MAAM,MAAM,OAAO,MAAM;AAC/D;AAAA,MACF;AAEA,YAAM,MAAM,KAAK,aAAa;AAC9B,UAAI,CAAC,OAAO,IAAI,OAAO,QAAS;AAChC,WAAK,QAAQ;AACb,YAAM,QAAQ,KAAK,cAAc,IAAI,OAAO,CAAC;AAC7C,aAAO,EAAE,MAAM,UAAU,IAAI,IAAI,IAAI,MAAM,MAAM;AAAA,IACnD;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAsD;AAC5D,UAAM,IAAI,KAAK,QAAQ;AACvB,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,KAAK,GAAG;AAAA,MACnC,KAAK;AACH,eAAO,EAAE,IAAI,OAAO,MAAM,KAAK,IAAI;AAAA,MACrC,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,KAAK,OAAO;AAAA,MACvC,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,KAAK,WAAW;AAAA,MAC3C,KAAK;AACH,eAAO,EAAE,IAAI,OAAO,MAAM,KAAK,WAAW;AAAA,MAC5C,KAAK;AACH,eAAO,EAAE,IAAI,KAAK,MAAM,KAAK,IAAI;AAAA,MACnC,KAAK;AACH,eAAO,EAAE,IAAI,KAAK,MAAM,KAAK,IAAI;AAAA,MACnC,KAAK;AACH,eAAO,EAAE,IAAI,KAAK,MAAM,KAAK,IAAI;AAAA,MACnC,KAAK;AACH,eAAO,EAAE,IAAI,KAAK,MAAM,KAAK,IAAI;AAAA,MACnC,KAAK;AACH,eAAO,EAAE,IAAI,KAAK,MAAM,KAAK,IAAI;AAAA,MACnC,KAAK;AACH,eAAO,EAAE,IAAI,KAAK,MAAM,KAAK,QAAQ;AAAA,MACvC,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,KAAK,QAAQ;AAAA,MACxC,KAAK;AACH,eAAO,EAAE,IAAI,KAAK,MAAM,KAAK,QAAQ;AAAA,MACvC,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,KAAK,QAAQ;AAAA,MACxC,KAAK;AACH,eAAO,EAAE,IAAI,KAAK,MAAM,KAAK,QAAQ;AAAA,MACvC,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,KAAK,QAAQ;AAAA,MACxC,KAAK;AACH,eAAO,EAAE,IAAI,EAAE,OAAsB,MAAM,KAAK,QAAQ;AAAA,MAC1D,KAAK;AACH,eAAO,EAAE,IAAI,KAAK,MAAM,KAAK,QAAQ;AAAA,MACvC,KAAK;AACH,eAAO,EAAE,IAAI,KAAK,MAAM,KAAK,OAAO;AAAA,MACtC,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,KAAK,MAAM;AAAA,MACtC,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,KAAK,MAAM;AAAA,MACtC;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,aAAmB;AACzB,QAAI,KAAK,MAAM,MAAM,EAAG,QAAO,EAAE,MAAM,OAAO;AAC9C,WAAO,KAAK,cAAc,KAAK,aAAa,CAAC;AAAA,EAC/C;AAAA,EAEQ,WAAW,MAAY,KAAsB;AACnD,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,UAAI,KAAK,GAAG,QAAQ,KAAK,KAAK,GAAG,MAAM,GAAG;AACxC,cAAM,SAAS,KAAK,gBAAgB;AACpC,aAAK,OAAO,QAAQ;AACpB,eAAO,EAAE,MAAM,MAAM,KAAK,MAAM,MAAM,QAAQ,OAAO;AAAA,MACvD;AACA,YAAM,SAAiB,CAAC;AACxB,UAAI,CAAC,KAAK,GAAG,QAAQ,GAAG;AACtB,WAAG;AACD,iBAAO,KAAK,KAAK,UAAU,CAAC;AAAA,QAC9B,SAAS,KAAK,MAAM,OAAO;AAAA,MAC7B;AACA,WAAK,OAAO,QAAQ;AACpB,aAAO,EAAE,MAAM,MAAM,KAAK,MAAM,MAAM,OAAO;AAAA,IAC/C;AACA,SAAK,YAAY,qBAAqB;AAAA,EACxC;AAAA,EAEQ,aAAa,MAAY,KAAc,IAA+B;AAC5E,UAAM,UAAU,KAAK,cAAc,KAAK,aAAa,CAAC;AACtD,QAAI,aAA0B;AAC9B,QAAI,KAAK,MAAM,QAAQ,EAAG,cAAa,KAAK,cAAc,KAAK,aAAa,CAAC;AAC7E,WAAO,EAAE,MAAM,QAAQ,KAAK,IAAI,MAAM,MAAM,SAAS,QAAQ,WAAW;AAAA,EAC1E;AAAA,EAEQ,aAAa,MAAkB;AACrC,QAAI,SAAS;AACb,WAAO,MAAM;AACX,UAAI,KAAK,MAAM,SAAS,GAAG;AACzB,cAAM,YAAY,KAAK,WAAW;AAClC,iBAAS,EAAE,MAAM,WAAW,MAAM,QAAQ,UAAU;AACpD;AAAA,MACF;AACA,UAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,iBAAS,EAAE,MAAM,UAAU,IAAI,MAAM,MAAM,QAAQ,OAAO,EAAE,MAAM,OAAO,EAAE;AAC3E;AAAA,MACF;AACA,UAAI,KAAK,MAAM,SAAS,GAAG;AACzB,iBAAS,EAAE,MAAM,UAAU,IAAI,UAAU,MAAM,QAAQ,OAAO,EAAE,MAAM,OAAO,EAAE;AAC/E;AAAA,MACF;AACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAuB;AAC7B,QAAI,KAAK,MAAM,KAAK,GAAG;AACrB,YAAM,UAAU,KAAK,eAAe;AACpC,UAAI,QAAQ,SAAS,UAAU;AAC7B,eAAO,EAAE,GAAG,SAAS,KAAK,CAAC,QAAQ,IAAI;AAAA,MACzC;AACA,aAAO,EAAE,MAAM,SAAS,IAAI,OAAO,MAAM,QAAQ;AAAA,IACnD;AACA,QAAI,KAAK,MAAM,MAAM,EAAG,QAAO,EAAE,MAAM,SAAS,IAAI,KAAK,MAAM,KAAK,eAAe,EAAE;AACrF,QAAI,KAAK,MAAM,OAAO,EAAG,QAAO,EAAE,MAAM,SAAS,IAAI,KAAK,MAAM,KAAK,eAAe,EAAE;AACtF,QAAI,KAAK,MAAM,OAAO,EAAG,QAAO,EAAE,MAAM,SAAS,IAAI,KAAK,MAAM,KAAK,eAAe,EAAE;AACtF,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,WAAK,OAAO,QAAQ;AACpB,YAAM,SAAS,KAAK,gBAAgB;AACpC,WAAK,OAAO,QAAQ;AACpB,aAAO,EAAE,MAAM,UAAU,KAAK,OAAO,OAAO;AAAA,IAC9C;AACA,WAAO,KAAK,iBAAiB;AAAA,EAC/B;AAAA,EAEQ,mBAAyB;AAC/B,UAAM,IAAI,KAAK,QAAQ;AAEvB,QAAI,KAAK,MAAM,MAAM,EAAG,QAAO,EAAE,MAAM,OAAO;AAE9C,QAAI,KAAK,MAAM,MAAM,GAAG;AACtB,UAAI,OAAoB;AACxB,UAAI,CAAC,KAAK,GAAG,MAAM,GAAG;AACpB,eAAO,KAAK,UAAU;AAAA,MACxB;AACA,aAAO,KAAK,cAAc,IAAI;AAAA,IAChC;AAEA,QAAI,KAAK,MAAM,MAAM,GAAG;AACtB,WAAK,OAAO,QAAQ;AACpB,YAAM,OAAO,KAAK,UAAU;AAC5B,WAAK,OAAO,IAAI;AAChB,YAAM,WAAW,KAAK,cAAc;AACpC,WAAK,OAAO,QAAQ;AACpB,aAAO,EAAE,MAAM,QAAQ,MAAM,SAAS;AAAA,IACxC;AAEA,QAAI,KAAK,GAAG,cAAc,KAAK,KAAK,GAAG,cAAc,KAAK,KAAK,GAAG,mBAAmB,GAAG;AACtF,YAAM,MAAM,KAAK,QAAQ;AACzB,aAAO,EAAE,MAAM,YAAY,MAAM,IAAI,OAAO,UAAU,OAAO,MAAM,CAAC,GAAG,QAAQ,KAAK;AAAA,IACtF;AAEA,QAAI,KAAK,GAAG,QAAQ,GAAG;AACrB,YAAM,MAAM,KAAK,QAAQ;AACzB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,IAAI;AAAA,QACX,WAAW,IAAI,aAAa;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,KAAK,GAAG,QAAQ,GAAG;AACrB,YAAM,MAAM,KAAK,QAAQ;AACzB,aAAO,EAAE,MAAM,WAAW,OAAO,IAAI,QAAkB;AAAA,IACzD;AACA,QAAI,KAAK,GAAG,MAAM,GAAG;AACnB,YAAM,MAAM,KAAK,QAAQ;AACzB,aAAO,EAAE,MAAM,WAAW,OAAO,IAAI,QAAsB;AAAA,IAC7D;AAEA,QAAI,KAAK,GAAG,WAAW,GAAG;AACxB,YAAM,MAAM,KAAK,QAAQ;AACzB,YAAM,OAAO,IAAI,SAAS;AAC1B,aAAO,EAAE,MAAM,aAAa,KAAK;AAAA,IACnC;AACA,QAAI,KAAK,GAAG,aAAa,GAAG;AAC1B,YAAM,MAAM,KAAK,QAAQ;AACzB,aAAO,EAAE,MAAM,aAAa,MAAM,IAAI,MAAM;AAAA,IAC9C;AAEA,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,UAAI,KAAK,GAAG,QAAQ,KAAK,KAAK,GAAG,MAAM,GAAG;AACxC,cAAM,SAAS,KAAK,gBAAgB;AACpC,aAAK,OAAO,QAAQ;AACpB,eAAO,EAAE,MAAM,YAAY,OAAO;AAAA,MACpC;AACA,UAAI,KAAK,GAAG,QAAQ,GAAG;AACrB,aAAK,YAAY,kBAAkB;AAAA,MACrC;AACA,YAAM,QAAQ,KAAK,UAAU;AAC7B,UAAI,KAAK,MAAM,OAAO,GAAG;AACvB,cAAM,SAAS,CAAC,KAAK;AACrB,WAAG;AACD,iBAAO,KAAK,KAAK,UAAU,CAAC;AAAA,QAC9B,SAAS,KAAK,MAAM,OAAO;AAC3B,aAAK,OAAO,QAAQ;AACpB,eAAO,EAAE,MAAM,OAAO,OAAO;AAAA,MAC/B;AACA,WAAK,OAAO,QAAQ;AACpB,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,MAAM,MAAM,GAAG;AACtB,aAAO,EAAE,MAAM,UAAU,OAAO,MAAM,MAAM,IAAI;AAAA,IAClD;AAEA,QAAI,EAAE,SAAS,WAAW,eAAe,IAAI,EAAE,IAAI,GAAG;AACpD,aAAO,KAAK,qBAAqB;AAAA,IACnC;AAEA,SAAK,YAAY,oBAAoB,EAAE,IAAI,gBAAgB;AAAA,EAC7D;AAAA,EAEQ,uBAA6B;AACnC,UAAM,OAAO,KAAK,WAAW;AAC7B,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,aAAO,KAAK,WAAW,IAAI;AAAA,IAC7B;AACA,QAAI,KAAK,MAAM,KAAK,GAAG;AACrB,YAAM,MAAM,KAAK,WAAW;AAC5B,aAAO,EAAE,MAAM,UAAU,OAAO,MAAM,MAAM,IAAI;AAAA,IAClD;AACA,WAAO,EAAE,MAAM,UAAU,OAAO,MAAM,KAAK;AAAA,EAC7C;AAAA,EAEQ,WAAW,MAAoB;AACrC,QAAI,WAAW;AACf,QAAI,KAAK,MAAM,UAAU,EAAG,YAAW;AAAA,QAClC,MAAK,MAAM,KAAK;AAErB,QAAI;AACJ,QAAI,SAAsB;AAE1B,QAAI,KAAK,MAAM,MAAM,GAAG;AACtB,aAAO;AAAA,IACT,OAAO;AACL,aAAO,CAAC;AACR,UAAI,CAAC,KAAK,GAAG,QAAQ,GAAG;AACtB,WAAG;AACD,UAAC,KAAgB,KAAK,KAAK,UAAU,CAAC;AAAA,QACxC,SAAS,KAAK,MAAM,OAAO;AAAA,MAC7B;AAAA,IACF;AACA,SAAK,OAAO,QAAQ;AAEpB,QAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,WAAK,OAAO,QAAQ;AACpB,WAAK,OAAO,OAAO;AACnB,eAAS,KAAK,UAAU;AACxB,WAAK,OAAO,QAAQ;AAAA,IACtB;AAEA,UAAM,QAAQ,KAAK,YAAY;AAC/B,UAAM,WAAW,SAAS,MAAM,IAAI,KAAK;AAEzC,UAAM,QAAQ,oBAAoB,IAAI,KAAK,KAAK,EAAE,YAAY,MAAM,UAAU,SAAS,UAAU;AAEjG,QAAI,KAAK,MAAM,MAAM,GAAG;AACtB,UAAI;AACJ,UAAI,KAAK,GAAG,OAAO,KAAK,eAAe,IAAI,KAAK,QAAQ,EAAE,IAAI,GAAG;AAC/D,cAAM,UAAU,KAAK,WAAW;AAChC,iBAAS,EAAE,aAAa,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,MAAM,KAAK,QAAQ;AAAA,MACrE,OAAO;AACL,aAAK,OAAO,QAAQ;AACpB,iBAAS,KAAK,gBAAgB;AAC9B,aAAK,OAAO,QAAQ;AAAA,MACtB;AACA,YAAM,OAAO,QACT,EAAE,MAAM,aAAsB,MAAM,OAAO,UAAU,MAAM,OAAO,IAClE,EAAE,MAAM,YAAqB,MAAM,UAAU,MAAM,OAAO;AAC9D,aAAO,EAAE,MAAM,UAAU,MAAM,OAAO;AAAA,IACxC;AAEA,QAAI,OAAO;AACT,aAAO,EAAE,MAAM,aAAa,MAAM,OAAO,UAAU,MAAM,OAAO;AAAA,IAClE;AACA,WAAO,EAAE,MAAM,YAAY,MAAM,UAAU,MAAM,OAAO;AAAA,EAC1D;AAAA,EAEQ,cAAc,MAA6B;AACjD,UAAM,QAAsC,CAAC;AAC7C,WAAO,KAAK,MAAM,MAAM,GAAG;AACzB,YAAM,OAAO,KAAK,UAAU;AAC5B,WAAK,OAAO,MAAM;AAClB,YAAM,OAAO,KAAK,UAAU;AAC5B,YAAM,KAAK,EAAE,MAAM,KAAK,CAAC;AAAA,IAC3B;AACA,QAAI,WAAwB;AAC5B,QAAI,KAAK,MAAM,MAAM,EAAG,YAAW,KAAK,UAAU;AAClD,SAAK,OAAO,KAAK;AACjB,WAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,MAAM,SAAS;AAAA,EACrD;AAAA,EAEQ,kBAA8B;AACpC,UAAM,cAAsB,CAAC;AAC7B,UAAM,UAAyB,CAAC;AAChC,QAAI,QAA0B;AAE9B,QAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,WAAK,OAAO,IAAI;AAChB,SAAG;AACD,oBAAY,KAAK,KAAK,UAAU,CAAC;AAAA,MACnC,SAAS,KAAK,MAAM,OAAO;AAAA,IAC7B;AAEA,QAAI,KAAK,MAAM,OAAO,GAAG;AACvB,WAAK,OAAO,IAAI;AAChB,SAAG;AACD,cAAM,OAAO,KAAK,UAAU;AAC5B,YAAI,MAAsB;AAC1B,YAAI,KAAK,MAAM,KAAK,EAAG,OAAM;AAAA,iBACpB,KAAK,MAAM,MAAM,EAAG,OAAM;AACnC,YAAI,QAAiC;AACrC,YAAI,KAAK,MAAM,OAAO,GAAG;AACvB,cAAI,KAAK,MAAM,OAAO,EAAG,SAAQ;AAAA,mBACxB,KAAK,MAAM,MAAM,EAAG,SAAQ;AAAA,QACvC;AACA,gBAAQ,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAAA,MACnC,SAAS,KAAK,MAAM,OAAO;AAAA,IAC7B;AAEA,QAAI,KAAK,MAAM,QAAQ,SAAS,QAAQ,GAAG;AACzC,cAAQ,KAAK,eAAe;AAAA,IAC9B;AAEA,WAAO,EAAE,aAAa,SAAS,MAAM;AAAA,EACvC;AAAA,EAEQ,iBAA4B;AAClC,QAAI,OAA0B;AAC9B,QAAI,KAAK,MAAM,OAAO,EAAG,QAAO;AAAA,aACvB,KAAK,MAAM,QAAQ,EAAG,QAAO;AAAA,QACjC,MAAK,OAAO,MAAM;AAEvB,QAAI;AACJ,QAAI;AAEJ,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,cAAQ,KAAK,gBAAgB,IAAI;AACjC,WAAK,OAAO,KAAK;AACjB,YAAM,KAAK,gBAAgB,KAAK;AAAA,IAClC,OAAO;AACL,cAAQ,KAAK,gBAAgB,IAAI;AACjC,YAAM,EAAE,MAAM,cAAc;AAAA,IAC9B;AAEA,QAAI,UAAgC;AACpC,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,UAAI,KAAK,MAAM,IAAI,GAAG;AACpB,aAAK,OAAO,QAAQ;AACpB,kBAAU;AAAA,MACZ,WAAW,KAAK,MAAM,SAAS,GAAG;AAChC,aAAK,OAAO,KAAK;AACjB,kBAAU;AAAA,MACZ,WAAW,KAAK,MAAM,OAAO,EAAG,WAAU;AAAA,eACjC,KAAK,MAAM,MAAM,EAAG,WAAU;AAAA,UAClC,MAAK,YAAY,yDAAyD;AAAA,IACjF;AAEA,WAAO,EAAE,MAAM,OAAO,KAAK,QAAQ;AAAA,EACrC;AAAA,EAEQ,gBAAgB,eAAoC;AAC1D,QAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,UAAI,KAAK,MAAM,WAAW,EAAG,QAAO,EAAE,MAAM,sBAAsB;AAClE,WAAK,OAAO,WAAW;AACvB,aAAO,EAAE,MAAM,sBAAsB;AAAA,IACvC;AACA,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,WAAK,OAAO,KAAK;AACjB,aAAO,EAAE,MAAM,cAAc;AAAA,IAC/B;AACA,UAAM,OAAO,KAAK,UAAU;AAC5B,QAAI,KAAK,MAAM,WAAW,EAAG,QAAO,EAAE,MAAM,aAAa,KAAK;AAC9D,QAAI,KAAK,MAAM,WAAW,EAAG,QAAO,EAAE,MAAM,aAAa,KAAK;AAC9D,QAAI,cAAe,QAAO,EAAE,MAAM,aAAa,KAAK;AACpD,WAAO,EAAE,MAAM,aAAa,KAAK;AAAA,EACnC;AACF;AAEO,SAAS,YAAY,QAA8B;AACxD,SAAO,IAAI,OAAO,MAAM,EAAE,gBAAgB;AAC5C;;;AC9kEO,SAAS,MAAM,KAAgC;AACpD,QAAM,SAAS,SAAS,GAAG;AAC3B,SAAO,YAAY,MAAM;AAC3B;;;AChBO,IAAM,cAAc,oBAAI,KAAK,0BAA0B;AAUvD,SAAS,WAAW,UAAgB,aAAoB;AAC7D,QAAM,KAAK,QAAQ,QAAQ;AAC3B,MAAI,OAAO,MAAM,EAAE,EAAG,OAAM,IAAI,WAAW,uBAAuB;AAClE,SAAO,MAAM,IAAI,KAAK,EAAE;AAC1B;AAGO,SAAS,aAAa,KAA2B;AACtD,MAAI,QAAQ,OAAW,QAAO,WAAW,WAAW;AACpD,MAAI,OAAO,QAAQ,WAAY,QAAO,MAAM,IAAI,KAAK,IAAI,EAAE,QAAQ,CAAC;AACpE,SAAO,WAAW,GAAG;AACvB;;;ACJO,IAAM,wBAAwB;;;ACd9B,IAAM,OAAN,MAAM,MAAK;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKR,YAAY,OAAwB,GAAG;AACrC,QAAI,IAAI,OAAO,SAAS,WAAW,OAAO,OAAO,OAAO,CAAC;AACzD,QAAI,MAAM,GAAI,KAAI;AAClB,SAAK,QAAQ,OAAO,QAAQ,IAAI,CAAC;AAAA,EACnC;AAAA;AAAA,EAGA,UAAkB;AAChB,QAAI,IAAI,KAAK;AACb,SAAK,OAAO,QAAQ,IAAI,KAAK,GAAG;AAChC,SAAK,OAAO,QAAQ,IAAI,KAAK,GAAG;AAChC,SAAK,OAAO,QAAQ,IAAI,KAAK,GAAG;AAChC,SAAK,QAAQ,OAAO,QAAQ,IAAI,CAAC;AACjC,WAAO,OAAO,QAAQ,IAAI,IAAI,mBAAmB;AAAA,EACnD;AAAA;AAAA,EAGA,mBAA2B;AACzB,UAAM,OAAO,KAAK,QAAQ;AAC1B,QAAI,SAAS,OAAO,OAAO,IAAI,IAAI;AACnC,QAAI,WAAW,EAAE,MAAM,KAAM,WAAU;AACvC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,YAAoB;AAClB,UAAM,OAAO,KAAK,QAAQ;AAC1B,WAAO,OAAO,QAAQ,GAAG,IAAI,OAAO,MAAM,GAAG;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,KAAa,KAAqB;AACxC,QAAI,MAAM,IAAK,OAAM,IAAI,WAAW,WAAW;AAC/C,UAAM,OAAO,MAAM,MAAM;AACzB,WAAO,MAAM,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC;AAAA,EACnD;AAAA;AAAA,EAGA,WAAmB;AACjB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,SAAS,OAAqB;AAC5B,SAAK,QAAQ,OAAO,QAAQ,IAAI,KAAK;AAAA,EACvC;AAAA;AAAA,EAGA,QAAc;AACZ,UAAM,OAAO,IAAI,MAAK,CAAC;AACvB,SAAK,QAAQ,KAAK;AAClB,WAAO;AAAA,EACT;AACF;;;AC/DO,IAAM,UAAN,MAAc;AAAA;AAAA,EAEV;AAAA,EACT,YAAY,OAAe;AACzB,SAAK,QAAQ,mBAAmB,KAAK;AAAA,EACvC;AAAA,EACA,UAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAmB;AACjB,WAAO,OAAO,KAAK,KAAK;AAAA,EAC1B;AACF;AAGO,IAAM,eAAe;AAGrB,IAAM,cAAN,MAAkB;AAAA,EACd;AAAA,EACA,UAAU;AAAA,EACnB,YAAY,OAAe;AACzB,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,UAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAmB;AACjB,WAAO,KAAK;AAAA,EACd;AACF;AAwBO,SAAS,mBAAmB,OAAuB;AACxD,SAAO,OAAO,GAAG,OAAO,EAAE,IAAI,IAAI;AACpC;AAGO,SAAS,UAAU,OAAwB;AAChD,SAAO,IAAI,QAAQ,KAAK;AAC1B;AAGO,SAAS,UAAU,OAAmC;AAC3D,SAAO,iBAAiB;AAC1B;AAGO,SAAS,cAAc,OAAuC;AACnE,SAAO,iBAAiB;AAC1B;AAGO,SAAS,cAAc,OAA4B;AACxD,SAAO,IAAI,YAAY,KAAK;AAC9B;AAQO,SAAS,UAAU,OAAyB;AACjD,MAAI,iBAAiB,YAAa,QAAO;AACzC,SAAO;AACT;AASO,SAAS,eAAe,OAA+B;AAC5D,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,iBAAiB,QAAS,QAAO;AACrC,MAAI,iBAAiB,YAAa,QAAO;AACzC,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,OAAO,UAAU,KAAK,IAAI,YAAY;AAAA,EAC/C;AACA,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO;AACT;AAGO,SAAS,UAAU,OAAyB;AACjD,QAAM,KAAK,eAAe,KAAK;AAC/B,MAAI,OAAO,OAAQ,QAAO;AAC1B,MAAI,OAAO,UAAW,QAAO;AAC7B,MAAI,OAAO,OAAQ,QAAO;AAC1B,MAAI,OAAO,OAAQ,QAAO;AAC1B,SAAO;AACT;AAGO,SAAS,qBAAqB,UAA+C;AAClF,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,IAAI,SAAS,YAAY;AAC/B,MAAI,EAAE,SAAS,KAAK,EAAG,QAAO;AAC9B,MAAI,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,MAAM,EAAG,QAAO;AAC3E,MAAI,EAAE,SAAS,MAAM,EAAG,QAAO;AAC/B,MAAI,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,MAAM,EAAG,QAAO;AAC3E,SAAO;AACT;AAGO,SAAS,cAAc,OAAiB,UAA8B;AAC3E,MAAI,UAAU,KAAM,QAAO;AAE3B,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,UAAI,iBAAiB,WAAY,QAAO,WAAW,KAAK;AACxD,UAAI,iBAAiB,YAAa,QAAO,MAAM;AAC/C,UAAI,OAAO,UAAU,SAAU,QAAO;AACtC,UAAI,iBAAiB,QAAS,QAAO,OAAO,MAAM,KAAK;AACvD,aAAO,OAAO,KAAK;AAAA,IACrB,KAAK,WAAW;AACd,YAAM,IAAI,eAAe,KAAK;AAC9B,UAAI,MAAM,KAAM,QAAO;AACvB,UAAI,OAAO,UAAU,SAAU,QAAO;AACtC,aAAO,OAAO,UAAU,CAAC,KAAK,OAAO,cAAc,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,mBAAmB,CAAC;AAAA,IAC9F;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,IAAI,eAAe,KAAK;AAC9B,aAAO,MAAM,OAAO,QAAQ,UAAU,CAAC;AAAA,IACzC;AAAA,IACA,KAAK,WAAW;AACd,YAAM,IAAI,eAAe,KAAK;AAC9B,UAAI,MAAM,KAAM,QAAO;AACvB,UAAI,OAAO,UAAU,CAAC,KAAK,OAAO,cAAc,CAAC,EAAG,QAAO,KAAK,MAAM,CAAC;AACvE,aAAO,mBAAmB,CAAC;AAAA,IAC7B;AAAA,IACA,KAAK;AACH,UAAI,OAAO,UAAU,SAAU,QAAO,mBAAmB,KAAK;AAC9D,aAAO;AAAA,EACX;AACF;AAGO,SAAS,eAAe,OAAgC;AAC7D,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,iBAAiB,QAAS,QAAO,MAAM;AAC3C,MAAI,iBAAiB,YAAa,QAAO,eAAe,MAAM,KAAK;AACnE,MAAI,OAAO,UAAU,SAAU,QAAO,mBAAmB,KAAK;AAC9D,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK;AAClD,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,KAAK;AACrB,QAAI,MAAM,GAAI,QAAO;AACrB,UAAM,IAAI,OAAO,CAAC;AAClB,QAAI,CAAC,OAAO,MAAM,CAAC,KAAK,yCAAyC,KAAK,CAAC,GAAG;AACxE,aAAO,mBAAmB,CAAC;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,YAAY;AAC/B,WAAO,eAAe,WAAW,KAAK,CAAC;AAAA,EACzC;AACA,SAAO;AACT;AAGO,SAAS,UAAU,OAAyC;AACjE,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,iBAAiB,QAAS,QAAO,KAAK,MAAM,MAAM,KAAK;AAC3D,MAAI,iBAAiB,YAAa,QAAO,UAAU,MAAM,KAAK;AAC9D,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,MAAM,KAAK;AACtD,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,eAAe,KAAK;AAC9B,WAAO,MAAM,OAAO,OAAO,KAAK,MAAM,CAAC;AAAA,EACzC;AACA,SAAO;AACT;AAGO,SAAS,eAAe,GAAa,GAAsB;AAChE,MAAI,MAAM,QAAQ,MAAM,KAAM,QAAO;AACrC,MAAI,aAAa,cAAc,aAAa,YAAY;AACtD,QAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAK,KAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAG,QAAO;AAC7D,WAAO;AAAA,EACT;AACA,QAAM,KAAK,aAAa,UAAU,EAAE,QAAQ,aAAa,cAAc,EAAE,QAAQ;AACjF,QAAM,KAAK,aAAa,UAAU,EAAE,QAAQ,aAAa,cAAc,EAAE,QAAQ;AACjF,MAAI,OAAO,OAAO,YAAY,OAAO,OAAO,UAAU;AACpD,QAAI;AACF,aAAO,OAAO,EAAqB,MAAM,OAAO,EAAqB;AAAA,IACvE,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,OAAO,OAAO,YAAY,OAAO,OAAO,SAAU,QAAO,OAAO,GAAG,IAAI,EAAE;AAC7E,SAAO,OAAO;AAChB;AAMO,SAAS,WAAW,GAAa,GAA4B;AAClE,MAAI,MAAM,QAAQ,MAAM,KAAM,QAAO;AAErC,QAAM,KAAK,gBAAgB,CAAC;AAC5B,QAAM,KAAK,gBAAgB,CAAC;AAC5B,MAAI,OAAO,GAAI,QAAO,KAAK,KAAK,KAAK;AAErC,MAAI,OAAO,GAAG;AAEZ,UAAM,KAAK,aAAa,UAAU,EAAE,QAAQ,OAAO,MAAM,WAAW,IAAI,OAAO,MAAM,WAAW,OAAO,OAAO,CAAC;AAC/G,UAAM,KAAK,aAAa,UAAU,EAAE,QAAQ,OAAO,MAAM,WAAW,IAAI,OAAO,MAAM,WAAW,OAAO,OAAO,CAAC;AAC/G,QAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AAClD,UAAI,IAAI,EAAG,QAAO;AAClB,UAAI,IAAI,EAAG,QAAO;AAClB,aAAO;AAAA,IACT;AACA,QAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AAClD,YAAME,QAAO,OAAO,MAAM,WAAW,OAAO,CAAC,IAAK;AAClD,YAAMC,SAAQ,OAAO,MAAM,WAAW,OAAO,CAAC,IAAK;AACnD,UAAID,QAAOC,OAAO,QAAO;AACzB,UAAID,QAAOC,OAAO,QAAO;AACzB,aAAO;AAAA,IACT;AACA,UAAM,OAAO;AACb,UAAM,QAAQ;AACd,QAAI,OAAO,MAAM,IAAI,KAAK,OAAO,MAAM,KAAK,EAAG,QAAO;AACtD,QAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAC/B,QAAI,OAAO,MAAM,KAAK,EAAG,QAAO;AAChC,QAAI,OAAO,MAAO,QAAO;AACzB,QAAI,OAAO,MAAO,QAAO;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,GAAG;AACZ,UAAM,KAAK,aAAa,cAAc,EAAE,QAAQ,OAAO,CAAC;AACxD,UAAM,KAAK,aAAa,cAAc,EAAE,QAAQ,OAAO,CAAC;AACxD,QAAI,KAAK,GAAI,QAAO;AACpB,QAAI,KAAK,GAAI,QAAO;AACpB,WAAO;AAAA,EACT;AAGA,QAAM,KAAK,aAAa,aAAa,IAAI,WAAW,OAAO,CAAC,CAAC;AAC7D,QAAM,KAAK,aAAa,aAAa,IAAI,WAAW,OAAO,CAAC,CAAC;AAC7D,QAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,GAAG,MAAM;AACzC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAM,KAAK,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,KAAK;AACnC,QAAI,MAAM,EAAG,QAAO,IAAI,IAAI,KAAK;AAAA,EACnC;AACA,MAAI,GAAG,SAAS,GAAG,OAAQ,QAAO;AAClC,MAAI,GAAG,SAAS,GAAG,OAAQ,QAAO;AAClC,SAAO;AACT;AAGA,SAAS,gBAAgB,GAAqB;AAC5C,MAAI,MAAM,KAAM,QAAO;AACvB,MAAI,aAAa,WAAW,OAAO,MAAM,YAAY,OAAO,MAAM,SAAU,QAAO;AACnF,MAAI,OAAO,MAAM,YAAY,aAAa,YAAa,QAAO;AAC9D,SAAO;AACT;AAGO,SAAS,WAAW,GAAuB;AAChD,SAAO,IAAI,YAAY,EAAE,OAAO,CAAC;AACnC;AAGO,SAAS,WAAW,GAAuB;AAChD,SAAO,IAAI,YAAY,EAAE,OAAO,CAAC;AACnC;AAGO,SAAS,cAAc,GAAuB;AACnD,MAAI,aAAa,WAAY,QAAO,IAAI,WAAW,CAAC;AACpD,MAAI,aAAa,QAAS,QAAO,IAAI,QAAQ,EAAE,KAAK;AACpD,MAAI,aAAa,YAAa,QAAO,IAAI,YAAY,EAAE,KAAK;AAC5D,SAAO;AACT;AAMO,SAAS,YAAY,GAA6B;AACvD,MAAI,MAAM,KAAM,QAAO;AACvB,MAAI,aAAa,QAAS,QAAO,EAAE,UAAU;AAC7C,MAAI,OAAO,MAAM,SAAU,QAAO,MAAM,KAAK,CAAC,OAAO,MAAM,CAAC;AAC5D,MAAI,OAAO,MAAM,SAAU,QAAO,MAAM;AACxC,MAAI,OAAO,MAAM,YAAY,aAAa,cAAc,aAAa,aAAa;AAChF,UAAM,IAAI,eAAe,aAAa,cAAc,EAAE,QAAQ,CAAC;AAC/D,WAAO,MAAM,QAAQ,MAAM,KAAK,CAAC,OAAO,MAAM,CAAC;AAAA,EACjD;AACA,SAAO;AACT;;;AC9TO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YACE,SACS,UACT;AACA,UAAM,OAAO;AAFJ;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EAJW;AAKb;AAGO,SAAS,cAAc,OAAe,SAAmD;AAC9F,QAAM,SAAS,IAAI,eAAe,OAAO,SAAS,mBAAmB,KAAK;AAC1E,QAAM,OAAO,OAAO,WAAW;AAC/B,SAAO,OAAO;AACd,MAAI,CAAC,OAAO,IAAI,GAAG;AACjB,UAAM,IAAI,eAAe,kBAAkB,OAAO,KAAK,CAAC;AAAA,EAC1D;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,OAAuB;AACvD,MAAI;AACF,kBAAc,KAAK;AACnB,WAAO;AAAA,EACT,SAAS,GAAG;AACV,QAAI,aAAa,eAAgB,QAAO,EAAE;AAC1C,WAAO;AAAA,EACT;AACF;AAEO,SAAS,gBAAgB,OAAe,QAAQ,GAAY;AAEjE,QAAM,cAAc,QAAQ,OAAU,MAAM,QAAQ,OAAU;AAC9D,MAAI;AACF,QAAI,YAAY;AACd,oBAAc,KAAK;AACnB,aAAO;AAAA,IACT;AAEA,kBAAc,OAAO,EAAE,iBAAiB,KAAK,CAAC;AAC9C,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,iBAAN,MAAqB;AAAA,EAEnB,YACmB,GACA,iBACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAHX,IAAI;AAAA,EAMZ,MAAe;AACb,WAAO,KAAK,KAAK,KAAK,EAAE;AAAA,EAC1B;AAAA,EAEA,OAAe;AACb,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA,EAEA,KAAK,IAAI,GAAW;AAClB,WAAO,KAAK,EAAE,KAAK,IAAI,CAAC,KAAK;AAAA,EAC/B;AAAA,EAEA,UAAkB;AAChB,WAAO,KAAK,EAAE,KAAK,GAAG,KAAK;AAAA,EAC7B;AAAA,EAEA,SAAe;AACb,WAAO,KAAK,IAAI,KAAK,EAAE,QAAQ;AAC7B,YAAM,KAAK,KAAK,KAAK;AACrB,UAAI,OAAO,OAAO,OAAO,OAAQ,OAAO,QAAQ,OAAO,QAAQ,OAAO,QAAQ,OAAO,MAAM;AACzF,aAAK,QAAQ;AACb;AAAA,MACF;AACA,UAAI,CAAC,KAAK,mBAAmB,OAAO,OAAO,KAAK,KAAK,CAAC,MAAM,KAAK;AAC/D,aAAK,KAAK;AACV,eAAO,CAAC,KAAK,IAAI,KAAK,KAAK,KAAK,MAAM,KAAM,MAAK,QAAQ;AACzD;AAAA,MACF;AACA,UAAI,CAAC,KAAK,mBAAmB,OAAO,OAAO,KAAK,KAAK,CAAC,MAAM,KAAK;AAC/D,aAAK,KAAK;AACV,eAAO,CAAC,KAAK,IAAI,KAAK,EAAE,KAAK,KAAK,MAAM,OAAO,KAAK,KAAK,CAAC,MAAM,KAAM,MAAK,QAAQ;AACnF,YAAI,CAAC,KAAK,IAAI,EAAG,MAAK,KAAK;AAC3B;AAAA,MACF;AACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAuB;AACrB,SAAK,OAAO;AACZ,QAAI,KAAK,IAAI,EAAG,OAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AACtE,UAAM,KAAK,KAAK,KAAK;AACrB,QAAI,OAAO,IAAK,QAAO,KAAK,YAAY;AACxC,QAAI,OAAO,IAAK,QAAO,KAAK,WAAW;AACvC,QAAI,OAAO,OAAQ,CAAC,KAAK,mBAAmB,OAAO,IAAM,QAAO,KAAK,YAAY;AACjF,QAAI,OAAO,OAAO,OAAO,OAAQ,MAAM,OAAO,MAAM,OAAQ,OAAO,IAAK,QAAO,KAAK,YAAY;AAChG,QAAI,OAAO,OAAO,OAAO,IAAK,QAAO,KAAK,aAAa;AACvD,QAAI,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AACpF,aAAO,KAAK,aAAa;AAAA,IAC3B;AACA,UAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AAAA,EACxD;AAAA,EAEA,cAAwB;AACtB,SAAK,QAAQ;AACb,SAAK,OAAO;AACZ,UAAM,UAAmD,CAAC;AAC1D,QAAI,KAAK,KAAK,MAAM,KAAK;AACvB,WAAK,QAAQ;AACb,aAAO,EAAE,MAAM,UAAU,QAAQ;AAAA,IACnC;AACA,WAAO,MAAM;AACX,WAAK,OAAO;AACZ,UAAI;AACJ,UAAI,KAAK,KAAK,MAAM,OAAQ,CAAC,KAAK,mBAAmB,KAAK,KAAK,MAAM,KAAM;AACzE,cAAM,MAAM,KAAK,YAAY;AAC7B,cAAO,IAA0C;AAAA,MACnD,WAAW,CAAC,KAAK,mBAAmB,KAAK,aAAa,KAAK,KAAK,CAAC,GAAG;AAClE,cAAM,KAAK,WAAW;AAAA,MACxB,OAAO;AACL,cAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AAAA,MACxD;AACA,WAAK,OAAO;AACZ,UAAI,KAAK,QAAQ,MAAM,IAAK,OAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AAClF,YAAM,QAAQ,KAAK,WAAW;AAC9B,cAAQ,KAAK,EAAE,KAAK,MAAM,CAAC;AAC3B,WAAK,OAAO;AACZ,YAAM,MAAM,KAAK,KAAK;AACtB,UAAI,QAAQ,KAAK;AACf,aAAK,QAAQ;AACb,aAAK,OAAO;AACZ,YAAI,CAAC,KAAK,mBAAmB,KAAK,KAAK,MAAM,KAAK;AAChD,eAAK,QAAQ;AACb;AAAA,QACF;AACA;AAAA,MACF;AACA,UAAI,QAAQ,KAAK;AACf,aAAK,QAAQ;AACb;AAAA,MACF;AACA,YAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AAAA,IACxD;AACA,WAAO,EAAE,MAAM,UAAU,QAAQ;AAAA,EACnC;AAAA,EAEA,aAAuB;AACrB,SAAK,QAAQ;AACb,SAAK,OAAO;AACZ,UAAM,WAAuB,CAAC;AAC9B,QAAI,KAAK,KAAK,MAAM,KAAK;AACvB,WAAK,QAAQ;AACb,aAAO,EAAE,MAAM,SAAS,SAAS;AAAA,IACnC;AACA,WAAO,MAAM;AACX,eAAS,KAAK,KAAK,WAAW,CAAC;AAC/B,WAAK,OAAO;AACZ,YAAM,MAAM,KAAK,KAAK;AACtB,UAAI,QAAQ,KAAK;AACf,aAAK,QAAQ;AACb,aAAK,OAAO;AACZ,YAAI,CAAC,KAAK,mBAAmB,KAAK,KAAK,MAAM,KAAK;AAChD,eAAK,QAAQ;AACb;AAAA,QACF;AACA;AAAA,MACF;AACA,UAAI,QAAQ,KAAK;AACf,aAAK,QAAQ;AACb;AAAA,MACF;AACA,YAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AAAA,IACxD;AACA,WAAO,EAAE,MAAM,SAAS,SAAS;AAAA,EACnC;AAAA,EAEA,cAAwB;AACtB,UAAM,QAAQ,KAAK,QAAQ;AAC3B,QAAI,KAAK,mBAAmB,UAAU,KAAK;AACzC,YAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AAAA,IACxD;AACA,QAAI,MAAM;AACV,WAAO,CAAC,KAAK,IAAI,GAAG;AAClB,YAAM,KAAK,KAAK,QAAQ;AACxB,UAAI,OAAO,MAAO,QAAO,EAAE,MAAM,UAAU,OAAO,IAAI;AACtD,UAAI,OAAO,MAAM;AACf,YAAI,KAAK,IAAI,EAAG,OAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AACtE,cAAM,MAAM,KAAK,QAAQ;AACzB,gBAAQ,KAAK;AAAA,UACX,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AACH,mBAAO;AACP;AAAA,UACF,KAAK;AACH,mBAAO;AACP;AAAA,UACF,KAAK;AACH,mBAAO;AACP;AAAA,UACF,KAAK;AACH,mBAAO;AACP;AAAA,UACF,KAAK;AACH,mBAAO;AACP;AAAA,UACF,KAAK;AACH,mBAAO;AACP;AAAA,UACF,KAAK,KAAK;AACR,kBAAM,MAAM,KAAK,EAAE,MAAM,KAAK,GAAG,KAAK,IAAI,CAAC;AAC3C,gBAAI,CAAC,mBAAmB,KAAK,GAAG,EAAG,OAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AACzF,iBAAK,KAAK;AACV,mBAAO,OAAO,aAAa,SAAS,KAAK,EAAE,CAAC;AAC5C;AAAA,UACF;AAAA,UACA,KAAK;AAAA,UACL,KAAK;AACH,gBAAI,KAAK,gBAAiB,OAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AAChF,gBAAI,QAAQ,QAAQ,KAAK,KAAK,MAAM,KAAM,MAAK,QAAQ;AACvD;AAAA,UACF;AACE,gBAAI,KAAK,gBAAiB,OAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AAChF,mBAAO;AAAA,QACX;AACA;AAAA,MACF;AACA,UAAI,OAAO,QAAQ,OAAO,MAAM;AAC9B,YAAI,KAAK,gBAAiB,OAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AAAA,MAClF;AACA,aAAO;AAAA,IACT;AACA,UAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AAAA,EACxD;AAAA,EAEA,cAAwB;AACtB,UAAM,QAAQ,KAAK;AACnB,QAAI,KAAK,KAAK,MAAM,OAAO,KAAK,KAAK,MAAM,KAAK;AAC9C,UAAI,KAAK,mBAAmB,KAAK,KAAK,MAAM,KAAK;AAC/C,cAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AAAA,MACxD;AACA,WAAK,QAAQ;AAAA,IACf;AAEA,QAAI,WAAW,KAAK,KAAK,KAAK,CAAC,GAAG;AAChC,WAAK,IAAI;AACT,aAAO,KAAK,aAAa;AAAA,IAC3B;AACA,QAAI,KAAK,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,KAAK,CAAC,CAAC,GAAG;AACpD,UAAI,KAAK,gBAAiB,OAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AAChF,WAAK,KAAK;AACV,aAAO,cAAc,KAAK,KAAK,KAAK,CAAC,EAAG,MAAK,QAAQ;AACrD,YAAMC,QAAO,KAAK,EAAE,MAAM,OAAO,KAAK,CAAC;AACvC,YAAM,IAAI,OAAOA,KAAI;AACrB,UAAI,CAAC,OAAO,SAAS,CAAC,EAAG,OAAM,IAAI,eAAe,kBAAkB,QAAQ,CAAC;AAC7E,aAAO,OAAO,UAAU,CAAC,IAAI,EAAE,MAAM,WAAW,MAAM,OAAO,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC,EAAE;AAAA,IAClH;AACA,QAAI,UAAU;AACd,QAAI,UAAU;AACd,QAAI,KAAK,KAAK,MAAM,KAAK;AACvB,UAAI,KAAK,gBAAiB,OAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AAChF,gBAAU;AACV,WAAK,QAAQ;AAAA,IACf;AACA,QAAI,EAAE,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,QAAQ,CAAC,SAAS;AAC3D,YAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AAAA,IACxD;AACA,WAAO,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,IAAK,MAAK,QAAQ;AAC9D,QAAI,KAAK,KAAK,MAAM,KAAK;AACvB,gBAAU;AACV,WAAK,QAAQ;AACb,aAAO,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,IAAK,MAAK,QAAQ;AAAA,IAChE;AACA,QAAI,KAAK,KAAK,MAAM,OAAO,KAAK,KAAK,MAAM,KAAK;AAC9C,gBAAU;AACV,WAAK,QAAQ;AACb,UAAI,KAAK,KAAK,MAAM,OAAO,KAAK,KAAK,MAAM,IAAK,MAAK,QAAQ;AAC7D,UAAI,EAAE,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,KAAM,OAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AACvG,aAAO,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,IAAK,MAAK,QAAQ;AAAA,IAChE;AACA,UAAM,MAAM,KAAK,EAAE,MAAM,OAAO,KAAK,CAAC;AACtC,QAAI,KAAK,iBAAiB;AACxB,UAAI,IAAI,WAAW,GAAG,EAAG,OAAM,IAAI,eAAe,kBAAkB,QAAQ,CAAC;AAC7E,UAAI,IAAI,SAAS,GAAG,MAAM,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,KAAK,WAAW,KAAK,GAAG,IAAI;AAAA,MAE7F;AACA,UAAI,SAAS,KAAK,GAAG,EAAG,OAAM,IAAI,eAAe,kBAAkB,QAAQ,CAAC;AAAA,IAC9E;AACA,UAAM,QAAQ,uBAAuB,GAAG;AACxC,QAAI,MAAM,SAAS,aAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,SAAS,GAAG,GAAI;AAE5E,YAAM,OAAO,IAAI,QAAQ,SAAS,EAAE;AACpC,UAAI,CAAC,KAAK,SAAS,GAAG,KAAK,CAAC,OAAO,KAAK,IAAI,GAAG;AAC7C,eAAO,EAAE,MAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAC7C;AAAA,IACF;AACA,WAAO,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK;AAAA,EAC1C;AAAA,EAEA,eAAyB;AACvB,UAAM,QAAQ,KAAK;AACnB,WAAO,WAAW,KAAK,KAAK,KAAK,CAAC,EAAG,MAAK,QAAQ;AAClD,UAAM,OAAO,KAAK,EAAE,MAAM,OAAO,KAAK,CAAC;AACvC,UAAM,QAAQ,KAAK,YAAY;AAC/B,QAAI,UAAU,OAAQ,QAAO,EAAE,MAAM,OAAO;AAC5C,QAAI,UAAU,OAAQ,QAAO,EAAE,MAAM,OAAO;AAC5C,QAAI,UAAU,QAAS,QAAO,EAAE,MAAM,QAAQ;AAC9C,QAAI,CAAC,KAAK,iBAAiB;AACzB,UAAI,UAAU,SAAS,UAAU,UAAU,UAAU,OAAQ,QAAO,EAAE,MAAM,OAAO;AACnF,UAAI,UAAU,cAAc,UAAU,OAAO;AAC3C,cAAM,QAAQ,KAAK,EAAE,QAAQ,CAAC,MAAM,MAAM,MAAM;AAIhD,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAAA,IACF;AACA,UAAM,IAAI,eAAe,kBAAkB,QAAQ,CAAC;AAAA,EACtD;AAAA,EAEA,aAAa,IAAqB;AAChC,WAAO,aAAa,KAAK,EAAE,KAAM,GAAG,SAAS,KAAK,GAAG,WAAW,CAAC,IAAI;AAAA,EACvE;AAAA,EAEA,aAAqB;AACnB,QAAI,MAAM;AACV,WAAO,CAAC,KAAK,IAAI,GAAG;AAClB,YAAM,KAAK,KAAK,KAAK;AACrB,UAAI,gBAAgB,KAAK,EAAE,KAAK,GAAG,WAAW,CAAC,IAAI,KAAM;AACvD,eAAO,KAAK,QAAQ;AACpB;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,CAAC,IAAK,OAAM,IAAI,eAAe,kBAAkB,KAAK,KAAK,CAAC;AAChE,WAAO;AAAA,EACT;AACF;AAEA,SAAS,uBAAuB,KAAyD;AACvF,MAAI,IAAI,IAAI,KAAK;AACjB,MAAI,EAAE,WAAW,GAAG,EAAG,KAAI,EAAE,MAAM,CAAC;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,MAAI,CAAC,OAAO,SAAS,CAAC,GAAG;AACvB,UAAM,IAAI,eAAe,kBAAkB,CAAC;AAAA,EAC9C;AACA,MAAI,OAAO,UAAU,CAAC,KAAK,CAAC,QAAQ,KAAK,EAAE,QAAQ,MAAM,EAAE,CAAC,GAAG;AAC7D,WAAO,EAAE,MAAM,WAAW,MAAM,OAAO,KAAK,MAAM,CAAC,CAAC,EAAE;AAAA,EACxD;AAEA,MAAIA,QAAO,OAAO,CAAC;AACnB,MAAIA,MAAK,SAAS,GAAG,KAAKA,MAAK,SAAS,GAAG,GAAG;AAAA,EAE9C,WAAWA,MAAK,SAAS,IAAI,KAAK,OAAO,UAAU,CAAC,GAAG;AACrD,IAAAA,QAAO,OAAO,KAAK,MAAM,CAAC,CAAC;AAC3B,WAAO,EAAE,MAAM,WAAW,MAAAA,MAAK;AAAA,EACjC;AACA,SAAO,EAAE,MAAM,OAAO,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,YAAY,QAAQ,MAAAA,MAAK;AACvG;;;AC5WO,SAAS,cAAc,MAAwB;AACpD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,gBAAgB,KAAK,KAAK;AAAA,IACnC,KAAK;AACH,aAAO,IAAI,KAAK,SAAS,IAAI,aAAa,EAAE,KAAK,GAAG,CAAC;AAAA,IACvD,KAAK;AACH,aAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,GAAG,gBAAgB,EAAE,GAAG,CAAC,IAAI,cAAc,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AAAA,EACvG;AACF;AAEO,SAAS,gBAAgB,OAAuB;AACrD,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,KAAK,MAAM,CAAC;AAClB,UAAM,OAAO,GAAG,WAAW,CAAC;AAC5B,YAAQ,IAAI;AAAA,MACV,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF;AACE,YAAI,OAAO,IAAM;AACf,iBAAO,MAAM,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,QACjD,OAAO;AACL,iBAAO;AAAA,QACT;AAAA,IACJ;AAAA,EACF;AACA,SAAO,GAAG,GAAG;AACf;AAEO,SAAS,WAAW,MAAgB,SAAS,QAAgB;AAClE,SAAO,WAAW,MAAM,QAAQ,CAAC;AACnC;AAEA,SAAS,WAAW,MAAgB,QAAgB,OAAuB;AACzE,QAAMC,OAAM,OAAO,OAAO,KAAK;AAC/B,QAAM,WAAW,OAAO,OAAO,QAAQ,CAAC;AACxC,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,UAAI,KAAK,SAAS,WAAW,EAAG,QAAO;AACvC,aAAO;AAAA,EAAM,KAAK,SAAS,IAAI,CAAC,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,QAAQ,CAAC,CAAC,EAAE,EAAE,KAAK,KAAK,CAAC;AAAA,EAAKA,IAAG;AAAA,IAC7G,KAAK;AACH,UAAI,KAAK,QAAQ,WAAW,EAAG,QAAO;AACtC,aAAO;AAAA,EAAM,KAAK,QACf,IAAI,CAAC,MAAM,GAAG,QAAQ,GAAG,gBAAgB,EAAE,GAAG,CAAC,KAAK,WAAW,EAAE,OAAO,QAAQ,QAAQ,CAAC,CAAC,EAAE,EAC5F,KAAK,KAAK,CAAC;AAAA,EAAKA,IAAG;AAAA,IACxB;AACE,aAAO,cAAc,IAAI;AAAA,EAC7B;AACF;;;ACzEO,IAAM,KAAK;AAAA,EAChB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,SAAS,YAAY,MAA4B;AACtD,QAAM,QAAkB,CAAC;AACzB,YAAU,MAAM,KAAK;AACrB,SAAO,WAAW,KAAK,KAAK;AAC9B;AAEA,SAAS,UAAU,MAAgB,KAAqB;AACtD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,kBAAY,KAAK,GAAG,GAAG,IAAI;AAC3B;AAAA,IACF,KAAK;AACH,kBAAY,KAAK,GAAG,GAAG,IAAI;AAC3B;AAAA,IACF,KAAK;AACH,kBAAY,KAAK,GAAG,GAAG,KAAK;AAC5B;AAAA,IACF,KAAK,WAAW;AACd,YAAM,UAAU,WAAW,KAAK,IAAI;AACpC,kBAAY,KAAK,QAAQ,QAAQ,GAAG,GAAG;AACvC,iBAAW,KAAK,QAAS,KAAI,KAAK,CAAC;AACnC;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,UAAU,WAAW,KAAK,IAAI;AACpC,kBAAY,KAAK,QAAQ,QAAQ,GAAG,KAAK;AACzC,iBAAW,KAAK,QAAS,KAAI,KAAK,CAAC;AACnC;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,YAAM,UAAU,WAAW,KAAK,KAAK;AACrC,YAAM,cAAc,CAAC,GAAG,KAAK,KAAK,EAAE,KAAK,CAAC,OAAO;AAC/C,cAAM,IAAI,GAAG,WAAW,CAAC;AACzB,eAAO,OAAO,OAAO,OAAO,QAAQ,IAAI;AAAA,MAC1C,CAAC;AAED,YAAM,OAAO,cAAc,GAAG,UAAU,GAAG;AAC3C,kBAAY,KAAK,QAAQ,QAAQ,IAAI;AACrC,iBAAW,KAAK,QAAS,KAAI,KAAK,CAAC;AACnC;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,UAAoB,CAAC;AAC3B,iBAAW,MAAM,KAAK,SAAU,WAAU,IAAI,OAAO;AACrD,kBAAY,KAAK,QAAQ,QAAQ,GAAG,KAAK;AACzC,UAAI,KAAK,GAAG,OAAO;AACnB;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,YAAM,UAAoB,CAAC;AAC3B,iBAAW,SAAS,KAAK,SAAS;AAChC,kBAAU,EAAE,MAAM,UAAU,OAAO,MAAM,IAAI,GAAG,OAAO;AACvD,kBAAU,MAAM,OAAO,OAAO;AAAA,MAChC;AACA,kBAAY,KAAK,QAAQ,QAAQ,GAAG,MAAM;AAC1C,UAAI,KAAK,GAAG,OAAO;AACnB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,YAAY,KAAe,MAAc,MAAoB;AACpE,MAAI,QAAQ,IAAI;AACd,QAAI,KAAM,QAAQ,IAAK,IAAI;AAC3B;AAAA,EACF;AACA,MAAI,QAAQ,KAAM;AAChB,QAAI,KAAM,MAAM,IAAK,MAAM,IAAI;AAC/B;AAAA,EACF;AACA,MAAI,QAAQ,OAAQ;AAClB,QAAI,KAAM,MAAM,IAAK,MAAO,QAAQ,IAAK,KAAM,OAAO,GAAI;AAC1D;AAAA,EACF;AACA,MAAI,KAAM,MAAM,IAAK,MAAO,QAAQ,KAAM,KAAO,QAAQ,KAAM,KAAO,QAAQ,IAAK,KAAM,OAAO,GAAI;AACtG;AAUO,SAAS,WAAW,MAAkB,QAA8B;AACzE,MAAI,UAAU,KAAK,OAAQ,OAAM,IAAI,eAAe,kBAAkB,SAAS,CAAC;AAChF,QAAM,QAAQ,KAAK,MAAM;AACzB,QAAM,WAAW,SAAS;AAC1B,QAAM,OAAO,QAAQ;AACrB,MAAI,aAAa;AACjB,MAAI,cAAc;AAClB,MAAI,YAAY,IAAI;AAClB,UAAM,WAAW,aAAa,KAAK,IAAI,aAAa,KAAK,IAAI,aAAa,KAAK,IAAI;AACnF,iBAAa,IAAI;AACjB,QAAI,SAAS,aAAa,KAAK,OAAQ,OAAM,IAAI,eAAe,kBAAkB,SAAS,CAAC;AAC5F,kBAAc;AACd,aAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,oBAAe,eAAe,IAAK,KAAK,SAAS,IAAI,CAAC;AAAA,IACxD;AAAA,EACF;AACA,QAAM,gBAAgB,SAAS;AAC/B,QAAM,MAAM,gBAAgB;AAC5B,MAAI,MAAM,KAAK,OAAQ,OAAM,IAAI,eAAe,kBAAkB,SAAS,CAAC;AAC5E,SAAO,EAAE,QAAQ,KAAK,MAAM,eAAe,YAAY;AACzD;AAEO,SAAS,eAAe,MAA2B;AACxD,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,MAAI;AACF,UAAM,KAAK,WAAW,MAAM,CAAC;AAC7B,WAAO,GAAG,QAAQ,KAAK,UAAU,GAAG,QAAQ,GAAG;AAAA,EACjD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,YAAY,MAA4B;AACtD,QAAM,KAAK,WAAW,MAAM,CAAC;AAC7B,MAAI,GAAG,QAAQ,KAAK,OAAQ,OAAM,IAAI,eAAe,kBAAkB,CAAC;AACxE,SAAO,cAAc,MAAM,EAAE;AAC/B;AAEA,SAAS,cAAc,MAAkB,IAA4B;AACnE,UAAQ,GAAG,MAAM;AAAA,IACf,KAAK,GAAG;AACN,aAAO,EAAE,MAAM,OAAO;AAAA,IACxB,KAAK,GAAG;AACN,aAAO,EAAE,MAAM,OAAO;AAAA,IACxB,KAAK,GAAG;AACN,aAAO,EAAE,MAAM,QAAQ;AAAA,IACzB,KAAK,GAAG;AAAA,IACR,KAAK,GAAG,MAAM;AACZ,YAAMC,QAAO,WAAW,KAAK,SAAS,GAAG,eAAe,GAAG,GAAG,CAAC;AAC/D,aAAO,EAAE,MAAM,WAAW,MAAM,iBAAiBA,KAAI,EAAE;AAAA,IACzD;AAAA,IACA,KAAK,GAAG;AAAA,IACR,KAAK,GAAG,QAAQ;AACd,YAAMA,QAAO,WAAW,KAAK,SAAS,GAAG,eAAe,GAAG,GAAG,CAAC;AAC/D,aAAO,EAAE,MAAM,QAAQ,MAAAA,MAAK;AAAA,IAC9B;AAAA,IACA,KAAK,GAAG;AAAA,IACR,KAAK,GAAG;AAAA,IACR,KAAK,GAAG;AAAA,IACR,KAAK,GAAG,SAAS;AACf,YAAM,MAAM,WAAW,KAAK,SAAS,GAAG,eAAe,GAAG,GAAG,CAAC;AAC9D,UAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAS,QAAO,EAAE,MAAM,UAAU,OAAO,IAAI;AAEvF,aAAO,EAAE,MAAM,UAAU,OAAO,oBAAoB,GAAG,EAAE;AAAA,IAC3D;AAAA,IACA,KAAK,GAAG,OAAO;AACb,YAAM,WAAuB,CAAC;AAC9B,UAAI,MAAM,GAAG;AACb,aAAO,MAAM,GAAG,KAAK;AACnB,cAAM,QAAQ,WAAW,MAAM,GAAG;AAClC,iBAAS,KAAK,cAAc,MAAM,KAAK,CAAC;AACxC,cAAM,MAAM;AAAA,MACd;AACA,aAAO,EAAE,MAAM,SAAS,SAAS;AAAA,IACnC;AAAA,IACA,KAAK,GAAG,QAAQ;AACd,YAAM,UAAmD,CAAC;AAC1D,UAAI,MAAM,GAAG;AACb,aAAO,MAAM,GAAG,KAAK;AACnB,cAAM,QAAQ,WAAW,MAAM,GAAG;AAClC,cAAM,UAAU,cAAc,MAAM,KAAK;AACzC,YAAI,QAAQ,SAAS,SAAU,OAAM,IAAI,eAAe,kBAAkB,MAAM,CAAC;AACjF,cAAM,MAAM;AACZ,cAAM,QAAQ,WAAW,MAAM,GAAG;AAClC,gBAAQ,KAAK,EAAE,KAAK,QAAQ,OAAO,OAAO,cAAc,MAAM,KAAK,EAAE,CAAC;AACtE,cAAM,MAAM;AAAA,MACd;AACA,aAAO,EAAE,MAAM,UAAU,QAAQ;AAAA,IACnC;AAAA,IACA;AACE,YAAM,IAAI,eAAe,kBAAkB,GAAG,SAAS,CAAC;AAAA,EAC5D;AACF;AAEA,SAAS,iBAAiBA,OAAsB;AAC9C,QAAM,IAAI,OAAOA,KAAI;AACrB,MAAI,OAAO,SAAS,CAAC,KAAK,OAAO,UAAU,CAAC,EAAG,QAAO,OAAO,KAAK,MAAM,CAAC,CAAC;AAC1E,SAAOA;AACT;AAEA,SAAS,oBAAoB,KAAqB;AAEhD,MAAI;AACF,WAAO,KAAK,MAAM,IAAI,IAAI,QAAQ,MAAM,KAAK,CAAC,GAAG;AAAA,EACnD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAcO,SAAS,cAAc,MAAoC;AAChE,QAAM,OAAO,WAAW,MAAM,CAAC;AAC/B,QAAM,OAAO,cAAc,MAAM,IAAI;AACrC,QAAM,MAAwB,CAAC;AAC/B,OAAK,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK,MAAM,GAAG;AAChD,SAAO;AACT;AAEA,SAAS,KACP,MACA,IACA,MACA,UACA,MACA,SACA,KACA,KACA,WAAW,GAAG,QACR;AACN,MAAI,KAAK,EAAE,QAAQ,GAAG,QAAQ,QAAQ,UAAU,MAAM,KAAK,MAAM,SAAS,SAAS,CAAC;AACpF,MAAI,KAAK,SAAS,SAAS;AACzB,QAAI,MAAM,GAAG;AACb,QAAI,QAAQ;AACZ,WAAO,MAAM,GAAG,KAAK;AACnB,YAAM,QAAQ,WAAW,MAAM,GAAG;AAClC,YAAM,YAAY,cAAc,MAAM,KAAK;AAC3C,YAAM,YAAY,GAAG,OAAO,IAAI,KAAK;AACrC,WAAK,MAAM,OAAO,WAAW,UAAU,SAAS,WAAW,OAAO,GAAG;AACrE,YAAM,MAAM;AACZ;AAAA,IACF;AAAA,EACF,WAAW,KAAK,SAAS,UAAU;AACjC,QAAI,MAAM,GAAG;AACb,WAAO,MAAM,GAAG,KAAK;AACnB,YAAM,QAAQ,WAAW,MAAM,GAAG;AAClC,YAAM,UAAU,cAAc,MAAM,KAAK;AACzC,UAAI,QAAQ,SAAS,SAAU,OAAM,IAAI,eAAe,kBAAkB,MAAM,CAAC;AACjF,YAAM,MAAM;AACZ,YAAM,QAAQ,WAAW,MAAM,GAAG;AAClC,YAAM,UAAU,cAAc,MAAM,KAAK;AACzC,YAAM,YAAY,gBAAgB,SAAS,QAAQ,KAAK;AAExD,WAAK,MAAM,OAAO,SAAS,UAAU,SAAS,WAAW,QAAQ,OAAO,KAAK,MAAM,MAAM;AACzF,YAAM,MAAM;AAAA,IACd;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,MAAc,KAAqB;AAC1D,MAAI,2BAA2B,KAAK,GAAG,EAAG,QAAO,GAAG,IAAI,IAAI,GAAG;AAC/D,SAAO,GAAG,IAAI,KAAK,IAAI,QAAQ,MAAM,KAAK,CAAC;AAC7C;;;AC7QO,SAAS,cAAc,MAA0B;AACtD,MAAI,SAAS,GAAI,OAAM,IAAI,YAAY,qBAAqB,OAAO;AACnE,MAAI,CAAC,KAAK,WAAW,GAAG,EAAG,OAAM,IAAI,YAAY,mBAAmB,IAAI,KAAK,OAAO;AACpF,QAAM,QAAoB,CAAC,EAAE,MAAM,OAAO,CAAC;AAC3C,MAAI,IAAI;AACR,SAAO,IAAI,KAAK,QAAQ;AACtB,QAAI,KAAK,CAAC,MAAM,KAAK;AACnB;AACA,UAAI,KAAK,KAAK,OAAQ,OAAM,IAAI,YAAY,mBAAmB,IAAI,KAAK,OAAO;AAC/E,UAAI,KAAK,CAAC,MAAM,KAAK;AACnB;AACA,YAAIC,OAAM;AACV,eAAO,IAAI,KAAK,QAAQ;AACtB,gBAAM,KAAK,KAAK,CAAC;AACjB,cAAI,OAAO,KAAK;AACd;AACA;AAAA,UACF;AACA,cAAI,OAAO,MAAM;AACf;AACA,gBAAI,KAAK,KAAK,OAAQ,OAAM,IAAI,YAAY,mBAAmB,IAAI,KAAK,OAAO;AAC/E,YAAAA,QAAO,KAAK,CAAC;AACb;AACA;AAAA,UACF;AACA,UAAAA,QAAO;AACP;AAAA,QACF;AACA,cAAM,KAAK,EAAE,MAAM,OAAO,KAAAA,KAAI,CAAC;AAC/B;AAAA,MACF;AACA,UAAI,MAAM;AACV,aAAO,IAAI,KAAK,UAAU,KAAK,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,KAAK;AAC5D,eAAO,KAAK,CAAC;AACb;AAAA,MACF;AACA,UAAI,CAAC,IAAK,OAAM,IAAI,YAAY,mBAAmB,IAAI,KAAK,OAAO;AACnE,YAAM,KAAK,EAAE,MAAM,OAAO,IAAI,CAAC;AAC/B;AAAA,IACF;AACA,QAAI,KAAK,CAAC,MAAM,KAAK;AACnB;AACA,UAAI,KAAK,CAAC,MAAM,KAAK;AACnB;AACA,YAAI,KAAK,CAAC,MAAM,KAAK;AACnB;AACA,gBAAM,KAAK,EAAE,MAAM,SAAS,CAAC;AAC7B;AAAA,QACF;AACA,YAAI,KAAK,CAAC,MAAM,KAAK;AACnB;AACA,cAAIC,UAAS;AACb,iBAAO,IAAI,KAAK,UAAU,KAAK,CAAC,KAAM,OAAO,KAAK,CAAC,KAAM,KAAK;AAC5D,YAAAA,WAAU,KAAK,CAAC;AAChB;AAAA,UACF;AACA,cAAI,CAACA,WAAU,KAAK,CAAC,MAAM,IAAK,OAAM,IAAI,YAAY,mBAAmB,IAAI,KAAK,OAAO;AACzF;AACA,gBAAM,KAAK,EAAE,MAAM,WAAW,GAAG,OAAOA,OAAM,EAAE,CAAC;AACjD;AAAA,QACF;AACA,cAAM,IAAI,YAAY,mBAAmB,IAAI,KAAK,OAAO;AAAA,MAC3D;AACA,UAAI,SAAS;AACb,aAAO,IAAI,KAAK,UAAU,KAAK,CAAC,KAAM,OAAO,KAAK,CAAC,KAAM,KAAK;AAC5D,kBAAU,KAAK,CAAC;AAChB;AAAA,MACF;AACA,UAAI,CAAC,UAAU,KAAK,CAAC,MAAM,IAAK,OAAM,IAAI,YAAY,mBAAmB,IAAI,KAAK,OAAO;AACzF;AACA,YAAM,KAAK,EAAE,MAAM,SAAS,OAAO,OAAO,MAAM,EAAE,CAAC;AACnD;AAAA,IACF;AACA,UAAM,IAAI,YAAY,mBAAmB,IAAI,KAAK,OAAO;AAAA,EAC3D;AACA,SAAO;AACT;AAGO,SAAS,QAAQ,MAAgB,OAAyC;AAC/E,MAAI,MAA4B;AAChC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,KAAK,SAAS,OAAQ;AAC1B,QAAI,QAAQ,OAAW,QAAO;AAC9B,QAAI,KAAK,SAAS,OAAO;AACvB,UAAI,IAAI,SAAS,SAAU,QAAO;AAClC,YAAM,UAAU,IAAI;AACpB,UAAI;AACJ,eAAS,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;AAC5C,YAAI,QAAQ,CAAC,EAAG,QAAQ,KAAK,KAAK;AAChC,iBAAO,QAAQ,CAAC,EAAG;AACnB;AAAA,QACF;AAAA,MACF;AACA,YAAM;AACN;AAAA,IACF;AACA,QAAI,KAAK,SAAS,SAAU,QAAO;AACnC,QAAI,IAAI,SAAS,QAAS,QAAO;AACjC,QAAI;AACJ,QAAI,KAAK,SAAS,QAAS,SAAQ,KAAK;AAAA,QACnC,SAAQ,IAAI,SAAS,SAAS,KAAK;AACxC,QAAI,QAAQ,KAAK,SAAS,IAAI,SAAS,OAAQ,QAAO;AACtD,UAAM,IAAI,SAAS,KAAK;AAAA,EAC1B;AACA,SAAO;AACT;AAUO,SAAS,WAAW,MAAgB,OAAsC;AAC/E,MAAI,MAAM,UAAU,EAAG,QAAO;AAC9B,QAAM,cAAc,MAAM,MAAM,GAAG,EAAE;AACrC,QAAM,SAAS,QAAQ,MAAM,WAAW;AACxC,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,MAAI,KAAK,SAAS,OAAQ,QAAO;AACjC,MAAI,KAAK,SAAS,OAAO;AACvB,QAAI,OAAO,SAAS,SAAU,QAAO;AACrC,UAAM,QAAQ,OAAO,QAAQ,UAAU,CAAC,MAAM,EAAE,QAAQ,KAAK,GAAG;AAChE,WAAO,EAAE,QAAQ,MAAM,MAAM;AAAA,EAC/B;AACA,MAAI,OAAO,SAAS,QAAS,QAAO;AACpC,MAAI,KAAK,SAAS,SAAU,QAAO,EAAE,QAAQ,MAAM,OAAO,OAAO,SAAS,OAAO;AACjF,MAAI,KAAK,SAAS,QAAS,QAAO,EAAE,QAAQ,MAAM,OAAO,KAAK,MAAM;AACpE,SAAO,EAAE,QAAQ,MAAM,OAAO,OAAO,SAAS,SAAS,KAAK,EAAE;AAChE;;;ACjIO,SAAS,aAAa,MAA8B;AACzD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEO,SAAS,UAAU,MAA0B;AAClD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,EAAE,MAAM,SAAS,UAAU,KAAK,SAAS,IAAI,SAAS,EAAE;AAAA,IACjE,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,KAAK,QAAQ,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,OAAO,UAAU,EAAE,KAAK,EAAE,EAAE;AAAA,MAC9E;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK;AAAA,IAC5C,KAAK;AACH,aAAO,EAAE,MAAM,UAAU,OAAO,KAAK,MAAM;AAAA,IAC7C;AACE,aAAO,EAAE,MAAM,KAAK,KAAK;AAAA,EAC7B;AACF;;;AC5CO,SAAS,eAAe,OAA2B;AACxD,MAAI,UAAU,KAAM,QAAO,EAAE,MAAM,OAAO;AAC1C,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO,EAAE,MAAM,OAAO;AACnD,QAAI,OAAO,UAAU,KAAK,EAAG,QAAO,EAAE,MAAM,WAAW,MAAM,OAAO,KAAK,EAAE;AAC3E,WAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,KAAK,EAAE;AAAA,EAC7C;AACA,MAAI,OAAO,UAAU,SAAU,QAAO,EAAE,MAAM,WAAW,MAAM,MAAM,SAAS,EAAE;AAChF,MAAI,iBAAiB,YAAa,QAAO,cAAc,MAAM,KAAK;AAClE,MAAI,OAAO,UAAU,SAAU,QAAO,cAAc,KAAK;AACzD,MAAI,iBAAiB,YAAY;AAC/B,QAAI,eAAe,KAAK,EAAG,QAAO,YAAY,KAAK;AAEnD,WAAO,cAAc,WAAW,KAAK,CAAC;AAAA,EACxC;AAEA,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,WAAW,OAAO;AACnE,UAAM,IAAK,MAA4B;AACvC,QAAI,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO,EAAE,MAAM,OAAO;AAC/C,WAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC,EAAE;AAAA,EACzC;AACA,QAAM,IAAI,YAAY,kBAAkB,OAAO;AACjD;AAWO,SAAS,mBAAmB,OAA2B;AAC5D,MAAI,UAAU,KAAM,QAAO,EAAE,MAAM,OAAO;AAC1C,MAAI,cAAc,KAAK,EAAG,QAAO,cAAc,MAAM,KAAK;AAC1D,MAAI,iBAAiB,cAAc,eAAe,KAAK,EAAG,QAAO,YAAY,KAAK;AAClF,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO,EAAE,MAAM,OAAO;AACnD,QAAI,OAAO,UAAU,KAAK,EAAG,QAAO,EAAE,MAAM,WAAW,MAAM,OAAO,KAAK,EAAE;AAC3E,WAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,KAAK,EAAE;AAAA,EAC7C;AACA,MAAI,OAAO,UAAU,SAAU,QAAO,EAAE,MAAM,WAAW,MAAM,MAAM,SAAS,EAAE;AAChF,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,EAAE,iBAAiB,eAAe,WAAW,OAAO;AACrG,UAAM,IAAK,MAA4B;AACvC,WAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC,EAAE;AAAA,EACzC;AACA,MAAI,iBAAiB,YAAY;AAC/B,UAAM,IAAI,YAAY,gCAAgC,OAAO;AAAA,EAC/D;AAEA,SAAO,EAAE,MAAM,UAAU,OAAO,OAAO,KAAK,EAAE;AAChD;AAEO,SAAS,cAAc,MAAgB,MAA0C;AACtF,MAAI,SAAS,QAAS,QAAO,YAAY,IAAI;AAC7C,MAAI,SAAS,OAAQ,QAAO,cAAc,cAAc,IAAI,CAAC;AAE7D,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK,WAAW;AACd,YAAM,IAAI,OAAO,KAAK,IAAI;AAC1B,UAAI,OAAO,cAAc,CAAC,EAAG,QAAO;AACpC,UAAI;AACF,eAAO,OAAO,KAAK,IAAI;AAAA,MACzB,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,IAAI,OAAO,KAAK,IAAI;AAC1B,aAAO,OAAO,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI;AAAA,IAC9C;AAAA,IACA,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AAEH,UAAI,SAAS,MAAO,QAAO,cAAc,IAAI;AAC7C,aAAO,cAAc,cAAc,IAAI,CAAC;AAAA,EAC5C;AACF;AAEO,SAAS,cAAc,OAAyB;AACrD,MAAI,UAAU,KAAM,OAAM,IAAI,YAAY,mBAAmB,OAAO;AACpE,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AAC1D,UAAM,IAAI,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI,KAAK,MAAM,KAAK;AACtE,QAAI,IAAI,EAAG,QAAO,MAAM,CAAC;AACzB,WAAO,KAAK,CAAC;AAAA,EACf;AACA,QAAMC,QAAO,cAAc,KAAK,IAAI,MAAM,QAAQ,OAAO,KAAK;AAC9D,MAAIA,MAAK,WAAW,GAAG,EAAG,QAAOA;AACjC,MAAI,UAAU,KAAKA,KAAI,GAAG;AACxB,UAAM,IAAI,OAAOA,KAAI;AACrB,QAAI,IAAI,EAAG,QAAO,MAAM,CAAC;AACzB,WAAO,KAAK,CAAC;AAAA,EACf;AACA,SAAO,KAAKA,KAAI;AAClB;AAEO,SAAS,WAAW,MAAgB,MAAoC;AAC7E,SAAO,QAAQ,MAAM,cAAc,IAAI,CAAC;AAC1C;AASO,SAAS,gBAAgB,MAAgB,MAAc,OAA2B;AACvF,QAAM,QAAQ,cAAc,IAAI;AAChC,QAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,MAAI,CAAC,QAAQ,KAAK,SAAS,UAAU,KAAK,SAAS,OAAO;AACxD,UAAM,IAAI,YAAY,mBAAmB,OAAO;AAAA,EAClD;AACA,QAAM,SAAS,UAAU,IAAI;AAC7B,QAAM,aAAa,WAAW,QAAQ,KAAK;AAC3C,MAAI,YAAY,OAAO,SAAS,QAAS,QAAO;AAChD,QAAM,SAAS,WAAW;AAC1B,MAAI,MAAM,WAAW;AACrB,MAAI,KAAK,SAAS,UAAW,OAAM,OAAO,SAAS,SAAS,KAAK;AACjE,MAAI,KAAK,SAAS,SAAU,OAAM,OAAO,SAAS;AAClD,MAAI,MAAM,KAAK,MAAM,OAAO,SAAS,OAAQ,QAAO;AACpD,SAAO,SAAS,OAAO,KAAK,GAAG,UAAU,KAAK,CAAC;AAC/C,SAAO;AACT;AAEO,SAAS,WAAW,MAAgB,MAAc,OAAiB,MAA4B;AACpG,QAAM,QAAQ,cAAc,IAAI;AAChC,MAAI,MAAM,UAAU,GAAG;AAErB,QAAI,SAAS,SAAU,QAAO;AAC9B,WAAO,UAAU,KAAK;AAAA,EACxB;AACA,QAAM,SAAS,UAAU,IAAI;AAC7B,MAAI,CAAC,YAAY,QAAQ,OAAO,OAAO,IAAI,GAAG;AAC5C,qBAAiB,QAAQ,OAAO,OAAO,IAAI;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAgB,OAAmB,OAAiB,MAA2B;AAClG,QAAM,aAAa,WAAW,MAAM,KAAK;AACzC,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,EAAE,QAAQ,MAAM,MAAM,IAAI;AAChC,MAAI,KAAK,SAAS,OAAO;AACvB,QAAI,OAAO,SAAS,SAAU,QAAO;AACrC,QAAI,SAAS,GAAG;AACd,UAAI,SAAS,SAAU,QAAO;AAC9B,aAAO,QAAQ,KAAK,IAAI,EAAE,KAAK,KAAK,KAAK,OAAO,UAAU,KAAK,EAAE;AACjE,aAAO;AAAA,IACT;AACA,QAAI,SAAS,UAAW,QAAO;AAC/B,WAAO,QAAQ,KAAK,EAAE,KAAK,KAAK,KAAK,OAAO,UAAU,KAAK,EAAE,CAAC;AAC9D,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,QAAS,QAAO;AACpC,MAAI,KAAK,SAAS,UAAU;AAC1B,QAAI,SAAS,UAAW,QAAO;AAC/B,WAAO,SAAS,KAAK,UAAU,KAAK,CAAC;AACrC,WAAO;AAAA,EACT;AACA,MAAI,MAAM;AACV,MAAI,KAAK,SAAS,UAAW,OAAM,OAAO,SAAS,SAAS,KAAK;AACjE,MAAI,MAAM,KAAK,MAAM,OAAO,SAAS,OAAQ,QAAO;AACpD,MAAI,QAAQ,OAAO,SAAS,QAAQ;AAClC,QAAI,SAAS,UAAW,QAAO;AAC/B,WAAO,SAAS,KAAK,UAAU,KAAK,CAAC;AACrC,WAAO;AAAA,EACT;AACA,MAAI,SAAS,SAAU,QAAO;AAC9B,SAAO,SAAS,GAAG,IAAI,UAAU,KAAK;AACtC,SAAO;AACT;AAEA,SAAS,iBAAiB,MAAgB,OAAmB,OAAiB,MAA2B;AAEvG,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,OAAO,MAAM,IAAI,CAAC;AACxB,QAAI,KAAK,SAAS,OAAO;AACvB,UAAI,IAAI,SAAS,SAAU,QAAO;AAClC,UAAI,QAAQ,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ,KAAK,GAAG;AACtD,UAAI,CAAC,OAAO;AACV,YAAI,SAAS,UAAW,QAAO;AAC/B,cAAM,QACJ,KAAK,SAAS,SAAS,KAAK,SAAS,SACjC,EAAE,MAAM,UAAU,SAAS,CAAC,EAAE,IAC9B,EAAE,MAAM,SAAS,UAAU,CAAC,EAAE;AACpC,gBAAQ,EAAE,KAAK,KAAK,KAAK,OAAO,MAAM;AACtC,YAAI,QAAQ,KAAK,KAAK;AAAA,MACxB;AACA,YAAM,MAAM;AACZ;AAAA,IACF;AACA,QAAI,IAAI,SAAS,QAAS,QAAO;AACjC,QAAI,MAAM,KAAK,SAAS,UAAU,KAAK,QAAQ,KAAK,SAAS,YAAY,IAAI,SAAS,SAAS,KAAK,IAAI;AACxG,QAAI,KAAK,SAAS,SAAU,OAAM,IAAI,SAAS;AAC/C,QAAI,MAAM,KAAK,MAAM,IAAI,SAAS,OAAQ,QAAO;AACjD,QAAI,QAAQ,IAAI,SAAS,QAAQ;AAC/B,UAAI,SAAS,UAAW,QAAO;AAC/B,YAAM,QAAkB,KAAK,SAAS,QAAQ,EAAE,MAAM,UAAU,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,SAAS,UAAU,CAAC,EAAE;AAC9G,UAAI,SAAS,KAAK,KAAK;AAAA,IACzB;AACA,UAAM,IAAI,SAAS,GAAG;AAAA,EACxB;AACA,SAAO,YAAY,MAAM,OAAO,OAAO,IAAI;AAC7C;AAEO,SAAS,WAAW,MAAgB,MAAwB;AACjE,QAAM,QAAQ,cAAc,IAAI;AAChC,MAAI,MAAM,UAAU,EAAG,QAAO;AAC9B,QAAM,SAAS,UAAU,IAAI;AAC7B,QAAM,aAAa,WAAW,QAAQ,KAAK;AAC3C,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,EAAE,QAAQ,MAAM,MAAM,IAAI;AAChC,MAAI,KAAK,SAAS,SAAS,OAAO,SAAS,YAAY,SAAS,GAAG;AACjE,WAAO,QAAQ,OAAO,OAAO,CAAC;AAAA,EAChC,WAAW,OAAO,SAAS,SAAS;AAClC,QAAI,MAAM;AACV,QAAI,KAAK,SAAS,UAAW,OAAM,OAAO,SAAS,SAAS,KAAK;AACjE,QAAI,KAAK,SAAS,SAAU,QAAO;AACnC,QAAI,OAAO,KAAK,MAAM,OAAO,SAAS,OAAQ,QAAO,SAAS,OAAO,KAAK,CAAC;AAAA,EAC7E;AACA,SAAO;AACT;AAGO,SAAS,UAAU,QAAkB,OAA2B;AACrE,MAAI,MAAM,SAAS,SAAU,QAAO,UAAU,KAAK;AACnD,QAAM,OAAO,OAAO,SAAS,WAAW,UAAU,MAAM,IAAK,EAAE,MAAM,UAAU,SAAS,CAAC,EAAE;AAC3F,MAAI,KAAK,SAAS,SAAU,QAAO,UAAU,KAAK;AAClD,aAAW,SAAS,MAAM,SAAS;AACjC,QAAI,MAAM,MAAM,SAAS,QAAQ;AAC/B,WAAK,UAAU,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ,MAAM,GAAG;AAC7D;AAAA,IACF;AACA,UAAM,WAAW,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ,MAAM,GAAG;AAC7D,QAAI,UAAU;AACZ,eAAS,QAAQ,UAAU,SAAS,OAAO,MAAM,KAAK;AAAA,IACxD,OAAO;AACL,WAAK,QAAQ,KAAK,EAAE,KAAK,MAAM,KAAK,OAAO,UAAU,MAAM,KAAK,EAAE,CAAC;AAAA,IACrE;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,cAAc,GAAmB;AAC/C,MAAI,aAAa,YAAa,OAAM;AACpC,MAAI,aAAa,eAAgB,OAAM,IAAI,YAAY,kBAAkB,OAAO;AAChF,QAAM,IAAI,YAAY,kBAAkB,OAAO;AACjD;AAEO,SAAS,WAAW,OAA2B;AACpD,MAAI;AACF,WAAO,eAAe,KAAK;AAAA,EAC7B,SAAS,GAAG;AACV,kBAAc,CAAC;AAAA,EACjB;AACF;AAEO,SAAS,YAAY,OAA6B;AACvD,MAAI,iBAAiB,cAAc,eAAe,KAAK,EAAG,QAAO;AACjE,SAAO,YAAY,WAAW,KAAK,CAAC;AACtC;AAEO,SAAS,WAAW,OAA8B;AACvD,SAAO,cAAc,cAAc,WAAW,KAAK,CAAC,CAAC;AACvD;;;AC3QA,SAAS,OAAO,MAA0B;AACxC,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,cAAc,MAAM,KAAK;AAAA,IAClC;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,QAAQ,MAA0B;AACzC,MAAI,KAAK,SAAS,WAAW,KAAK,SAAS,SAAU,QAAO,cAAc,IAAI;AAC9E,SAAO,cAAc,MAAM,KAAK;AAClC;AAEO,SAAS,aAAa,MAAgB,MAA+B;AAC1E,QAAM,OAAO,WAAW,IAAI;AAC5B,QAAM,OAAO,YAAY,IAAI;AAC7B,QAAMC,QAAO,cAAc,IAAI;AAC/B,QAAM,YAAYA,MAAK,CAAC;AACxB,MAAI,CAAC,UAAW,QAAO,CAAC;AAExB,MAAI,QAAQ;AACZ,MAAI,SAAS,UAAa,SAAS,MAAM;AACvC,UAAM,aAAa,OAAO,IAAI;AAC9B,UAAM,QAAQA,MAAK,KAAK,CAAC,MAAM,EAAE,YAAY,UAAU;AACvD,QAAI,CAAC,MAAO,QAAO,CAAC;AACpB,YAAQ;AAAA,EACV;AAEA,MAAI,MAAM,KAAK,SAAS,WAAW,MAAM,KAAK,SAAS,UAAU;AAC/D,WAAO;AAAA,MACL;AAAA,QACE,KAAK,MAAM;AAAA,QACX,OAAO,QAAQ,MAAM,IAAI;AAAA,QACzB,MAAM,aAAa,MAAM,IAAI;AAAA,QAC7B,MAAM,OAAO,MAAM,IAAI;AAAA,QACvB,IAAI,MAAM;AAAA,QACV,QAAQ;AAAA,QACR,SAAS,MAAM;AAAA,QACf,MAAM,MAAM;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,SAAOA,MAAK,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,QAAQ,EAAE,IAAI,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AACxF;AAEO,SAAS,aAAa,MAAgB,MAA+B;AAC1E,QAAM,OAAO,WAAW,IAAI;AAC5B,QAAM,OAAO,YAAY,IAAI;AAC7B,QAAMA,QAAO,cAAc,IAAI;AAE/B,MAAI,SAAS,UAAa,SAAS,MAAM;AACvC,WAAOA,MAAK,IAAI,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC;AAAA,EAC9C;AAEA,QAAM,aAAa,OAAO,IAAI;AAE9B,QAAM,YAAYA,MAAK,KAAK,CAAC,MAAM,EAAE,YAAY,UAAU;AAC3D,MAAI,CAAC,UAAW,QAAO,CAAC;AACxB,QAAM,UAAUA,MAAK;AAAA,IACnB,CAAC,MAAM,EAAE,YAAY,cAAc,EAAE,QAAQ,WAAW,aAAa,GAAG,KAAK,EAAE,QAAQ,WAAW,aAAa,GAAG;AAAA,EACpH;AACA,SAAO,QAAQ,IAAI,CAAC,MAAM;AACxB,UAAM,MAAM,YAAY,GAAG,KAAK;AAChC,QAAI,EAAE,aAAa,UAAU,UAAU;AACrC,UAAI,SAAS;AAAA,IACf;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,YAAY,GAAmB,UAA+B;AACrE,SAAO;AAAA,IACL,KAAK,EAAE;AAAA,IACP,OAAO,QAAQ,EAAE,IAAI;AAAA,IACrB,MAAM,aAAa,EAAE,IAAI;AAAA,IACzB,MAAM,OAAO,EAAE,IAAI;AAAA,IACnB,IAAI,EAAE;AAAA,IACN,QAAQ,WAAW,OAAO,EAAE;AAAA,IAC5B,SAAS,EAAE;AAAA,IACX,MAAM,EAAE;AAAA,EACV;AACF;;;ACnFA,SAAS,OAAO,OAAyB;AACvC,MAAI,iBAAiB,WAAY,QAAO,WAAW,KAAK;AACxD,MAAI,cAAc,KAAK,EAAG,QAAO,MAAM;AACvC,SAAO,OAAO,KAAK;AACrB;AAQA,SAAS,gBAAgB,MAAkB,SAA4B;AACrE,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,IAAI,YAAY,6DAA6D,QAAQ;AAAA,EAC7F;AACA,MAAI,KAAK,SAAS,MAAM,GAAG;AACzB,UAAM,IAAI,YAAY,2DAA2D,QAAQ;AAAA,EAC3F;AACA,MAAI,KAAK,KAAK,CAAC,QAAQ,QAAQ,IAAI,EAAG,QAAO;AAC7C,MAAI;AACF,QAAI,OAAO,WAAW,KAAK,CAAC,CAAE;AAC9B,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,YAAM,OAAO,OAAO,KAAK,CAAC,CAAE;AAC5B,YAAM,QAAQ,mBAAmB,KAAK,IAAI,CAAC,CAAE;AAC7C,aAAO,gBAAgB,MAAM,MAAM,KAAK;AAAA,IAC1C;AACA,WAAO,UAAU,cAAc,MAAM,OAAO,IAAI,cAAc,MAAM,MAAM;AAAA,EAC5E,SAAS,GAAG;AACV,kBAAc,CAAC;AAAA,EACjB;AACF;AAEA,SAAS,WAAW,MAAkB,MAAoC,SAA4B;AACpG,MAAI,KAAK,WAAW,EAAG,OAAM,IAAI,YAAY,8CAA8C,IAAI,MAAM,QAAQ;AAC7G,MAAI,KAAK,SAAS,MAAM,GAAG;AACzB,UAAM,IAAI,YAAY,QAAQ,IAAI,0CAA0C,QAAQ;AAAA,EACtF;AACA,MAAI;AACF,QAAI,OAAO,WAAW,KAAK,CAAC,CAAE;AAC9B,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,YAAM,OAAO,OAAO,KAAK,CAAC,CAAE;AAC5B,YAAM,QAAQ,mBAAmB,KAAK,IAAI,CAAC,CAAE;AAC7C,aAAO,WAAW,MAAM,MAAM,OAAO,IAAI;AAAA,IAC3C;AACA,WAAO,UAAU,cAAc,MAAM,OAAO,IAAI,cAAc,MAAM,MAAM;AAAA,EAC5E,SAAS,GAAG;AACV,kBAAc,CAAC;AAAA,EACjB;AACF;AAEA,SAAS,QAAQ,MAAkB,SAA4B;AAC7D,MAAI,KAAK,SAAS,EAAG,OAAM,IAAI,YAAY,wDAAwD,QAAQ;AAC3G,MAAI;AACF,UAAM,OAAO,WAAW,KAAK,CAAC,CAAE;AAChC,QAAI,KAAK,WAAW,GAAG;AACrB,YAAM,QAAQ,WAAW,MAAM,OAAO,KAAK,CAAC,CAAE,CAAC;AAC/C,UAAI,UAAU,OAAW,QAAO;AAChC,UAAI,YAAY,MAAM,SAAS,WAAW,MAAM,SAAS,WAAW;AAClE,eAAO,cAAc,OAAO,OAAO;AAAA,MACrC;AACA,UAAI,MAAM,SAAS,WAAW,MAAM,SAAS,SAAU,QAAO,cAAc,OAAO,MAAM;AACzF,aAAO,cAAc,OAAO,KAAK;AAAA,IACnC;AACA,UAAM,QAAQ,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM;AACrC,YAAM,QAAQ,WAAW,MAAM,OAAO,CAAE,CAAC;AACzC,aAAO,UAAU,SAAY,EAAE,MAAM,OAAgB,IAAI;AAAA,IAC3D,CAAC;AACD,UAAM,MAAM,EAAE,MAAM,SAAkB,UAAU,MAAM;AACtD,WAAO,UAAU,cAAc,KAAK,OAAO,IAAI,cAAc,KAAK,MAAM;AAAA,EAC1E,SAAS,GAAG;AACV,kBAAc,CAAC;AAAA,EACjB;AACF;AAEO,SAAS,UAAU,MAAgB,OAAiB,MAA8B;AACvF,MAAI,SAAS,QAAQ,UAAU,KAAM,QAAO;AAC5C,MAAI;AACF,UAAM,OAAO,WAAW,IAAI;AAC5B,UAAM,OAAO,cAAc,KAAK;AAChC,UAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,QAAI,UAAU,OAAW,QAAO;AAChC,QAAI,SAAS,KAAM,QAAO,cAAc,cAAc,KAAK,CAAC;AAC5D,WAAO,cAAc,OAAO,KAAK;AAAA,EACnC,SAAS,GAAG;AAEV,kBAAc,CAAC;AAAA,EACjB;AACF;AAEO,IAAM,sBAAgE;AAAA,EAC3E,KAAK,MAAM;AACT,QAAI,KAAK,WAAW,EAAG,OAAM,IAAI,YAAY,gDAAgD,QAAQ;AACrG,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,WAAO,WAAW,KAAK,CAAC,CAAE;AAAA,EAC5B;AAAA,EACA,MAAM,MAAM;AACV,QAAI,KAAK,WAAW,EAAG,OAAM,IAAI,YAAY,iDAAiD,QAAQ;AACtG,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,WAAO,YAAY,KAAK,CAAC,CAAE;AAAA,EAC7B;AAAA,EACA,WAAW,MAAM;AACf,QAAI;AACF,YAAM,WAAW,KAAK,IAAI,CAAC,MAAM,mBAAmB,CAAC,CAAC;AACtD,aAAO,cAAc,EAAE,MAAM,SAAS,SAAS,GAAG,MAAM;AAAA,IAC1D,SAAS,GAAG;AACV,oBAAc,CAAC;AAAA,IACjB;AAAA,EACF;AAAA,EACA,YAAY,MAAM;AAChB,QAAI;AACF,YAAM,WAAW,KAAK,IAAI,CAAC,MAAM,mBAAmB,CAAC,CAAC;AACtD,aAAO,cAAc,EAAE,MAAM,SAAS,SAAS,GAAG,OAAO;AAAA,IAC3D,SAAS,GAAG;AACV,oBAAc,CAAC;AAAA,IACjB;AAAA,EACF;AAAA,EACA,YAAY,MAAM;AAChB,QAAI,KAAK,SAAS,MAAM,GAAG;AACzB,YAAM,IAAI,YAAY,sDAAsD,QAAQ;AAAA,IACtF;AACA,QAAI;AACF,YAAM,UAA8E,CAAC;AACrF,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,YAAI,KAAK,CAAC,MAAM,KAAM,OAAM,IAAI,YAAY,qCAAqC,OAAO;AACxF,YAAI,KAAK,CAAC,aAAa,WAAY,OAAM,IAAI,YAAY,gCAAgC,OAAO;AAChG,cAAM,MAAM,OAAO,KAAK,CAAC,CAAE;AAC3B,gBAAQ,KAAK,EAAE,KAAK,OAAO,mBAAmB,KAAK,IAAI,CAAC,CAAE,EAAE,CAAC;AAAA,MAC/D;AACA,aAAO,cAAc,EAAE,MAAM,UAAU,QAAQ,GAAG,MAAM;AAAA,IAC1D,SAAS,GAAG;AACV,oBAAc,CAAC;AAAA,IACjB;AAAA,EACF;AAAA,EACA,aAAa,MAAM;AACjB,QAAI,KAAK,SAAS,MAAM,GAAG;AACzB,YAAM,IAAI,YAAY,sDAAsD,QAAQ;AAAA,IACtF;AACA,QAAI;AACF,YAAM,UAA8E,CAAC;AACrF,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,YAAI,KAAK,CAAC,MAAM,KAAM,OAAM,IAAI,YAAY,qCAAqC,OAAO;AACxF,YAAI,KAAK,CAAC,aAAa,WAAY,OAAM,IAAI,YAAY,gCAAgC,OAAO;AAChG,cAAM,MAAM,OAAO,KAAK,CAAC,CAAE;AAC3B,gBAAQ,KAAK,EAAE,KAAK,OAAO,mBAAmB,KAAK,IAAI,CAAC,CAAE,EAAE,CAAC;AAAA,MAC/D;AACA,aAAO,cAAc,EAAE,MAAM,UAAU,QAAQ,GAAG,OAAO;AAAA,IAC3D,SAAS,GAAG;AACV,oBAAc,CAAC;AAAA,IACjB;AAAA,EACF;AAAA,EACA,WAAW,MAAM;AACf,QAAI,KAAK,WAAW,EAAG,OAAM,IAAI,YAAY,sDAAsD,QAAQ;AAC3G,UAAM,IAAI,KAAK,CAAC,KAAK;AACrB,QAAI,MAAM,KAAM,QAAO,cAAc,MAAM;AAC3C,QAAI,cAAc,CAAC,EAAG,QAAO;AAC7B,QAAI,aAAa,cAAc,eAAe,CAAC,EAAG,QAAO,cAAc,cAAc,YAAY,CAAC,CAAC,CAAC;AACpG,QAAI;AACF,aAAO,cAAc,cAAc,mBAAmB,CAAC,CAAC,CAAC;AAAA,IAC3D,SAAS,GAAG;AACV,oBAAc,CAAC;AAAA,IACjB;AAAA,EACF;AAAA,EACA,aAAa,MAAM;AACjB,WAAO,QAAQ,MAAM,KAAK;AAAA,EAC5B;AAAA,EACA,cAAc,MAAM;AAClB,WAAO,QAAQ,MAAM,IAAI;AAAA,EAC3B;AAAA,EACA,YAAY,MAAM;AAChB,WAAO,WAAW,MAAM,UAAU,KAAK;AAAA,EACzC;AAAA,EACA,aAAa,MAAM;AACjB,WAAO,WAAW,MAAM,UAAU,IAAI;AAAA,EACxC;AAAA,EACA,kBAAkB,MAAM;AACtB,WAAO,gBAAgB,MAAM,KAAK;AAAA,EACpC;AAAA,EACA,mBAAmB,MAAM;AACvB,WAAO,gBAAgB,MAAM,IAAI;AAAA,EACnC;AAAA,EACA,aAAa,MAAM;AACjB,WAAO,WAAW,MAAM,WAAW,KAAK;AAAA,EAC1C;AAAA,EACA,cAAc,MAAM;AAClB,WAAO,WAAW,MAAM,WAAW,IAAI;AAAA,EACzC;AAAA,EACA,SAAS,MAAM;AACb,WAAO,WAAW,MAAM,OAAO,KAAK;AAAA,EACtC;AAAA,EACA,UAAU,MAAM;AACd,WAAO,WAAW,MAAM,OAAO,IAAI;AAAA,EACrC;AAAA,EACA,YAAY,MAAM;AAChB,QAAI,KAAK,SAAS,EAAG,OAAM,IAAI,YAAY,uDAAuD,QAAQ;AAC1G,QAAI;AACF,UAAI,OAAO,WAAW,KAAK,CAAC,CAAE;AAC9B,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,eAAO,WAAW,MAAM,OAAO,KAAK,CAAC,CAAE,CAAC;AAAA,MAC1C;AACA,aAAO,cAAc,MAAM,MAAM;AAAA,IACnC,SAAS,GAAG;AACV,oBAAc,CAAC;AAAA,IACjB;AAAA,EACF;AAAA,EACA,aAAa,MAAM;AACjB,QAAI,KAAK,SAAS,EAAG,OAAM,IAAI,YAAY,wDAAwD,QAAQ;AAC3G,QAAI;AACF,UAAI,OAAO,WAAW,KAAK,CAAC,CAAE;AAC9B,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,eAAO,WAAW,MAAM,OAAO,KAAK,CAAC,CAAE,CAAC;AAAA,MAC1C;AACA,aAAO,cAAc,MAAM,OAAO;AAAA,IACpC,SAAS,GAAG;AACV,oBAAc,CAAC;AAAA,IACjB;AAAA,EACF;AAAA,EACA,WAAW,MAAM;AACf,QAAI,KAAK,WAAW,EAAG,OAAM,IAAI,YAAY,sDAAsD,QAAQ;AAC3G,QAAI;AACF,aAAO,cAAc,UAAU,WAAW,KAAK,CAAC,CAAE,GAAG,WAAW,KAAK,CAAC,CAAE,CAAC,GAAG,MAAM;AAAA,IACpF,SAAS,GAAG;AACV,oBAAc,CAAC;AAAA,IACjB;AAAA,EACF;AAAA,EACA,YAAY,MAAM;AAChB,QAAI,KAAK,WAAW,EAAG,OAAM,IAAI,YAAY,uDAAuD,QAAQ;AAC5G,QAAI;AACF,aAAO,cAAc,UAAU,WAAW,KAAK,CAAC,CAAE,GAAG,WAAW,KAAK,CAAC,CAAE,CAAC,GAAG,OAAO;AAAA,IACrF,SAAS,GAAG;AACV,oBAAc,CAAC;AAAA,IACjB;AAAA,EACF;AAAA,EACA,UAAU,MAAM;AACd,QAAI,KAAK,SAAS,KAAK,KAAK,SAAS,GAAG;AACtC,YAAM,IAAI,YAAY,qDAAqD,QAAQ;AAAA,IACrF;AACA,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,QAAI;AACF,UAAI,OAAO,WAAW,KAAK,CAAC,CAAE;AAC9B,UAAI,KAAK,WAAW,GAAG;AACrB,YAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,cAAM,QAAQ,WAAW,MAAM,OAAO,KAAK,CAAC,CAAE,CAAC;AAC/C,YAAI,CAAC,MAAO,QAAO;AACnB,eAAO;AAAA,MACT;AACA,aAAO,aAAa,IAAI;AAAA,IAC1B,SAAS,GAAG;AACV,oBAAc,CAAC;AAAA,IACjB;AAAA,EACF;AAAA,EACA,WAAW,MAAM;AACf,QAAI,KAAK,SAAS,KAAK,KAAK,SAAS,GAAG;AACtC,YAAM,IAAI,YAAY,sDAAsD,QAAQ;AAAA,IACtF;AACA,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,UAAM,QAAQ,KAAK,WAAW,KAAK,KAAK,CAAC,MAAM,OAAO,OAAO,KAAK,CAAC,CAAC,IAAI;AACxE,QAAI,KAAK,CAAC,aAAa,YAAY;AACjC,aAAO,eAAe,KAAK,CAAC,CAAC,IAAI,IAAI;AAAA,IACvC;AACA,WAAO,gBAAgB,OAAO,KAAK,CAAC,CAAE,GAAG,KAAK,IAAI,IAAI;AAAA,EACxD;AAAA,EACA,oBAAoB,MAAM;AACxB,QAAI,KAAK,WAAW,GAAG;AACrB,YAAM,IAAI,YAAY,+DAA+D,QAAQ;AAAA,IAC/F;AACA,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,QAAI,KAAK,CAAC,aAAa,YAAY;AACjC,aAAO,eAAe,KAAK,CAAC,CAAC,IAAI,IAAI;AAAA,IACvC;AACA,WAAO,kBAAkB,OAAO,KAAK,CAAC,CAAE,CAAC;AAAA,EAC3C;AAAA,EACA,kBAAkB,MAAM;AACtB,QAAI,KAAK,SAAS,KAAK,KAAK,SAAS,GAAG;AACtC,YAAM,IAAI,YAAY,6DAA6D,QAAQ;AAAA,IAC7F;AACA,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,QAAI;AACF,UAAI,OAAO,WAAW,KAAK,CAAC,CAAE;AAC9B,UAAI,KAAK,WAAW,GAAG;AACrB,YAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,cAAM,QAAQ,WAAW,MAAM,OAAO,KAAK,CAAC,CAAE,CAAC;AAC/C,YAAI,CAAC,MAAO,QAAO;AACnB,eAAO;AAAA,MACT;AACA,UAAI,KAAK,SAAS,QAAS,QAAO;AAClC,aAAO,KAAK,SAAS;AAAA,IACvB,SAAS,GAAG;AACV,oBAAc,CAAC;AAAA,IACjB;AAAA,EACF;AAAA,EACA,YAAY,MAAM;AAChB,QAAI,KAAK,SAAS,KAAK,KAAK,SAAS,GAAG;AACtC,YAAM,IAAI,YAAY,uDAAuD,QAAQ;AAAA,IACvF;AACA,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,QAAI;AACF,YAAM,OAAO,WAAW,KAAK,CAAC,CAAE;AAChC,YAAM,SAAS,KAAK,WAAW,KAAK,KAAK,CAAC,MAAM,OAAO,OAAO,KAAK,CAAC,CAAE,IAAI;AAC1E,aAAO,cAAc,WAAW,MAAM,MAAM,CAAC;AAAA,IAC/C,SAAS,GAAG;AACV,oBAAc,CAAC;AAAA,IACjB;AAAA,EACF;AAAA,EACA,QAAQ,MAAM;AACZ,QAAI,KAAK,WAAW,EAAG,OAAM,IAAI,YAAY,mDAAmD,QAAQ;AACxG,WAAO,UAAU,KAAK,CAAC,KAAK,IAAI;AAAA,EAClC;AACF;AAEA,IAAM,4BAAN,MAAgE;AAAA,EAE9D,YAA6B,SAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EADZ,SAAgD,CAAC;AAAA,EAElE,KAAK,MAAwB;AAC3B,QAAI,KAAK,CAAC,MAAM,OAAW;AAE3B,SAAK,OAAO,KAAK,mBAAmB,KAAK,CAAC,CAAE,CAAC;AAAA,EAC/C;AAAA,EACA,WAAqB;AACnB,UAAM,OAAO,EAAE,MAAM,SAAkB,UAAU,KAAK,OAAO;AAC7D,WAAO,KAAK,UAAU,cAAc,MAAM,OAAO,IAAI,cAAc,MAAM,MAAM;AAAA,EACjF;AACF;AAEA,IAAM,6BAAN,MAAiE;AAAA,EAE/D,YAA6B,SAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EADZ,UAA8E,CAAC;AAAA,EAEhG,KAAK,MAAwB;AAC3B,QAAI,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,OAAW;AAC/C,UAAM,MAAM,OAAO,KAAK,CAAC,CAAE;AAC3B,SAAK,QAAQ,KAAK,EAAE,KAAK,OAAO,mBAAmB,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;AAAA,EACvE;AAAA,EACA,WAAqB;AACnB,UAAM,OAAO,EAAE,MAAM,UAAmB,SAAS,KAAK,QAAQ;AAC9D,WAAO,KAAK,UAAU,cAAc,MAAM,OAAO,IAAI,cAAc,MAAM,MAAM;AAAA,EACjF;AACF;AAEO,IAAM,yBAAqE;AAAA,EAChF,kBAAkB,MAAM,IAAI,0BAA0B,KAAK;AAAA,EAC3D,mBAAmB,MAAM,IAAI,0BAA0B,IAAI;AAAA,EAC3D,mBAAmB,MAAM,IAAI,2BAA2B,KAAK;AAAA,EAC7D,oBAAoB,MAAM,IAAI,2BAA2B,IAAI;AAC/D;;;ACvWA,IAAM,mBAAN,MAAuD;AAAA,EAC7C,QAAQ;AAAA,EAChB,KAAK,MAAwB;AAC3B,QAAI,KAAK,WAAW,KAAK,KAAK,CAAC,MAAM,KAAM,MAAK;AAAA,EAClD;AAAA,EACA,WAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AACF;AAEA,IAAM,qBAAN,MAAyD;AAAA,EAGvD,YAA6B,MAA+B;AAA/B;AAAA,EAAgC;AAAA,EAAhC;AAAA,EAFrB,QAAQ;AAAA,EACR,MAAM;AAAA,EAEd,KAAK,MAAwB;AAC3B,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,UAAU,QAAQ,UAAU,OAAW;AAC3C,SAAK,OAAO,eAAe,KAAK,KAAK;AACrC,SAAK;AAAA,EACP;AAAA,EACA,WAAqB;AACnB,QAAI,KAAK,SAAS,QAAS,QAAO,KAAK;AACvC,QAAI,KAAK,UAAU,EAAG,QAAO;AAC7B,WAAO,KAAK,SAAS,QAAQ,KAAK,MAAM,KAAK,QAAQ,KAAK;AAAA,EAC5D;AACF;AAEA,IAAM,oBAAN,MAAwD;AAAA,EAEtD,YAA6B,WAA0B;AAA1B;AAAA,EAA2B;AAAA,EAA3B;AAAA,EADrB,QAAkB;AAAA,EAE1B,KAAK,MAAwB;AAC3B,UAAM,YAAY,KAAK,CAAC;AACxB,QAAI,cAAc,QAAQ,cAAc,OAAW;AACnD,QAAI,KAAK,UAAU,MAAM;AACvB,WAAK,QAAQ;AACb;AAAA,IACF;AACA,UAAM,aAAa,WAAW,WAAW,KAAK,KAAK;AACnD,QAAK,KAAK,cAAc,SAAS,aAAa,KAAO,KAAK,cAAc,SAAS,aAAa,GAAI;AAChG,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA,EACA,WAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AACF;AAEA,IAAM,yBAAN,MAA6D;AAAA,EAC1C,SAAmB,CAAC;AAAA,EAC7B,YAAY;AAAA,EACpB,KAAK,MAAwB;AAC3B,QAAI,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,OAAW;AAC/C,QAAI,KAAK,CAAC,MAAM,UAAa,KAAK,CAAC,MAAM,KAAM,MAAK,YAAY,OAAO,KAAK,CAAC,CAAC;AAC9E,SAAK,OAAO,KAAK,KAAK,CAAC,aAAa,aAAa,WAAW,KAAK,CAAC,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC;AAAA,EACxF;AAAA,EACA,WAAqB;AACnB,WAAO,KAAK,OAAO,WAAW,IAAI,OAAO,KAAK,OAAO,KAAK,KAAK,SAAS;AAAA,EAC1E;AACF;AAEO,IAAM,qBAAiE;AAAA,EAC5E,OAAO,MAAM,IAAI,iBAAiB;AAAA,EAClC,KAAK,MAAM,IAAI,mBAAmB,KAAK;AAAA,EACvC,KAAK,MAAM,IAAI,mBAAmB,KAAK;AAAA,EACvC,OAAO,MAAM,IAAI,mBAAmB,OAAO;AAAA,EAC3C,KAAK,MAAM,IAAI,kBAAkB,KAAK;AAAA,EACtC,KAAK,MAAM,IAAI,kBAAkB,KAAK;AAAA,EACtC,cAAc,MAAM,IAAI,uBAAuB;AAAA,EAC/C,YAAY,MAAM,IAAI,uBAAuB;AAC/C;;;AC3EA,IAAM,oBAAoB;AAE1B,SAAS,UAAU,OAA6B,SAAuC;AACrF,MAAI,UAAU,UAAa,UAAU,OAAO;AAC1C,WAAO,QAAQ,MAAM,KAAK,oBAAI,KAAK,0BAA0B;AAAA,EAC/D;AACA,MAAI,UAAU,QAAQ,iBAAiB,WAAY,QAAO;AAC1D,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,UAAU,KAAK,GAAG;AAC9E,WAAO,IAAI,MAAM,OAAO,UAAU,KAAK,IAAI,MAAM,QAAQ,KAAK,IAAI,qBAAqB,KAAQ;AAAA,EACjG;AACA,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,SAAS,qCAAqC,KAAK,KAAK,IAC1D,cAAc,KAAK,MACnB,oBAAoB,KAAK,KAAK,IAC5B,GAAG,KAAK,eACR,MAAM,QAAQ,KAAK,GAAG,KAAK,sBAAsB,KAAK,KAAK,IAAI,KAAK;AAC1E,QAAM,OAAO,IAAI,KAAK,MAAM;AAC5B,SAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,IAAI,OAAO;AAC/C;AAEA,SAAS,cAAc,MAAY,UAA+B;AAChE,QAAM,SAAS,IAAI,KAAK,IAAI;AAC5B,QAAM,aAAa,SAAS,KAAK,EAAE,YAAY;AAC/C,MAAI,eAAe,YAAa,QAAO,IAAI,MAAM,KAAK,QAAQ,IAAI,QAAW,qBAAqB,GAAI;AACtG,MAAI,eAAe,SAAS,eAAe,YAAa,QAAO;AAC/D,MAAI,eAAe,eAAgB,QAAO,YAAY,GAAG,GAAG,GAAG,CAAC;AAAA,WACvD,eAAe,kBAAkB;AACxC,WAAO,WAAW,CAAC;AACnB,WAAO,YAAY,GAAG,GAAG,GAAG,CAAC;AAAA,EAC/B,WAAW,eAAe,iBAAiB;AACzC,WAAO,YAAY,GAAG,CAAC;AACvB,WAAO,YAAY,GAAG,GAAG,GAAG,CAAC;AAAA,EAC/B,OAAO;AACL,UAAM,QAAQ,iEAAiE,KAAK,UAAU;AAC9F,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,SAAS,OAAO,MAAM,CAAC,CAAC;AAC9B,YAAQ,MAAM,CAAC,GAAG;AAAA,MAChB,KAAK;AACH,eAAO,QAAQ,OAAO,QAAQ,IAAI,SAAS,GAAI;AAC/C;AAAA,MACF,KAAK;AACH,eAAO,QAAQ,OAAO,QAAQ,IAAI,SAAS,GAAK;AAChD;AAAA,MACF,KAAK;AACH,eAAO,QAAQ,OAAO,QAAQ,IAAI,SAAS,IAAO;AAClD;AAAA,MACF,KAAK;AACH,eAAO,QAAQ,OAAO,QAAQ,IAAI,SAAS,KAAQ;AACnD;AAAA,MACF,KAAK;AACH,eAAO,YAAY,OAAO,YAAY,IAAI,MAAM;AAChD;AAAA,MACF,KAAK;AACH,eAAO,eAAe,OAAO,eAAe,IAAI,MAAM;AACtD;AAAA,IACJ;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAkB,SAAuC;AAC5E,MAAI,SAAS,KAAK,CAAC;AACnB,MAAI,YAAY,KAAK,MAAM,CAAC;AAC5B,MAAI,WAAW,OAAW,UAAS;AACnC,MAAI,UAAU,CAAC,MAAM,aAAa;AAChC,UAAM,UAAU,eAAe,MAAM;AACrC,QAAI,YAAY,KAAM,QAAO;AAC7B,aAAS,UAAU,QAAQ;AAC3B,gBAAY,UAAU,MAAM,CAAC;AAAA,EAC/B;AACA,MAAI,OAAO,UAAU,QAAQ,OAAO;AACpC,MAAI,CAAC,KAAM,QAAO;AAClB,aAAW,YAAY,WAAW;AAChC,QAAI,OAAO,aAAa,SAAU,QAAO;AACzC,WAAO,cAAc,MAAM,QAAQ;AACnC,QAAI,CAAC,KAAM,QAAO;AAAA,EACpB;AACA,SAAO;AACT;AAEA,SAAS,IAAI,OAAe,SAAS,GAAW;AAC9C,SAAO,OAAO,KAAK,EAAE,SAAS,QAAQ,GAAG;AAC3C;AAEA,SAAS,QAAQ,MAAoB;AACnC,SAAO,GAAG,IAAI,KAAK,eAAe,GAAG,CAAC,CAAC,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,WAAW,CAAC,CAAC;AAClG;AAEA,SAAS,QAAQ,MAAoB;AACnC,SAAO,GAAG,IAAI,KAAK,YAAY,CAAC,CAAC,IAAI,IAAI,KAAK,cAAc,CAAC,CAAC,IAAI,IAAI,KAAK,cAAc,CAAC,CAAC;AAC7F;AAEA,SAAS,UAAU,MAAoB;AACrC,SACE,KAAK;AAAA,KACF,KAAK,IAAI,KAAK,eAAe,GAAG,KAAK,YAAY,GAAG,KAAK,WAAW,CAAC,IAAI,KAAK,IAAI,KAAK,eAAe,GAAG,GAAG,CAAC,KAC5G;AAAA,EACJ,IAAI;AAER;AAEA,SAAS,WAAW,MAAY,QAAwB;AACtD,SAAO,OAAO,QAAQ,qBAAqB,CAAC,SAAS;AACnD,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO,IAAI,KAAK,eAAe,GAAG,CAAC;AAAA,MACrC,KAAK;AACH,eAAO,IAAI,KAAK,YAAY,IAAI,CAAC;AAAA,MACnC,KAAK;AACH,eAAO,IAAI,KAAK,WAAW,CAAC;AAAA,MAC9B,KAAK;AACH,eAAO,IAAI,KAAK,YAAY,CAAC;AAAA,MAC/B,KAAK;AACH,eAAO,IAAI,KAAK,cAAc,CAAC;AAAA,MACjC,KAAK;AACH,eAAO,IAAI,KAAK,cAAc,CAAC;AAAA,MACjC,KAAK;AACH,eAAO,GAAG,IAAI,KAAK,cAAc,CAAC,CAAC,IAAI,IAAI,KAAK,mBAAmB,GAAG,CAAC,CAAC;AAAA,MAC1E,KAAK;AACH,eAAO,IAAI,UAAU,IAAI,GAAG,CAAC;AAAA,MAC/B,KAAK;AACH,eAAO,OAAO,KAAK,MAAM,KAAK,QAAQ,IAAI,GAAI,CAAC;AAAA,MACjD,KAAK;AACH,eAAO,OAAO,KAAK,UAAU,CAAC;AAAA,MAChC,KAAK;AACH,eAAO,IAAI,KAAK,OAAO,UAAU,IAAI,IAAI,IAAI,IAAI,KAAK,UAAU,KAAK,CAAC,CAAC;AAAA,MACzE,KAAK;AACH,eAAO,OAAO,KAAK,QAAQ,IAAI,QAAW,iBAAiB;AAAA,MAC7D;AACE,eAAO;AAAA,IACX;AAAA,EACF,CAAC;AACH;AAEO,IAAM,oBAA8D;AAAA,EACzE,KAAK,MAAM,SAAS;AAClB,UAAM,QAAQ,YAAY,MAAM,OAAO;AACvC,WAAO,QAAQ,QAAQ,KAAK,IAAI;AAAA,EAClC;AAAA,EACA,KAAK,MAAM,SAAS;AAClB,UAAM,QAAQ,YAAY,MAAM,OAAO;AACvC,WAAO,QAAQ,QAAQ,KAAK,IAAI;AAAA,EAClC;AAAA,EACA,SAAS,MAAM,SAAS;AACtB,UAAM,QAAQ,YAAY,MAAM,OAAO;AACvC,WAAO,QAAQ,GAAG,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,KAAK;AAAA,EACzD;AAAA,EACA,UAAU,MAAM,SAAS;AACvB,UAAM,QAAQ,YAAY,MAAM,OAAO;AACvC,WAAO,QAAQ,MAAM,QAAQ,IAAI,QAAW,oBAAoB;AAAA,EAClE;AAAA,EACA,SAAS,MAAM,SAAS;AACtB,QAAI,OAAO,KAAK,CAAC,MAAM,SAAU,QAAO;AACxC,UAAM,QAAQ,YAAY,KAAK,MAAM,CAAC,GAAG,OAAO;AAChD,WAAO,QAAQ,WAAW,OAAO,KAAK,CAAC,CAAC,IAAI;AAAA,EAC9C;AAAA,EACA,aAAa,MAAM,SAAS;AAC1B,WAAO,kBAAkB,KAAM,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,MAAM,OAAO;AAAA,EAC5E;AAAA,EACA,aAAa,MAAM,SAAS;AAC1B,WAAO,kBAAkB,KAAM,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,MAAM,OAAO;AAAA,EAC5E;AAAA,EACA,kBAAkB,MAAM,SAAS;AAC/B,WAAO,kBAAkB,SAAU,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,MAAM,OAAO;AAAA,EAChF;AAAA,EACA,UAAU,MAAM,SAAS;AACvB,UAAM,QAAQ,YAAY,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,MAAM,OAAO;AACrE,WAAO,QAAQ,KAAK,MAAM,MAAM,QAAQ,IAAI,GAAI,IAAI;AAAA,EACtD;AAAA,EACA,SAAS,MAAM;AACb,QAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,UAAM,IAAI,UAAU,KAAK,CAAC,GAAG,CAAC,CAAC;AAC/B,UAAM,IAAI,UAAU,KAAK,CAAC,GAAG,CAAC,CAAC;AAC/B,QAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,QAAI,KAAK,EAAE,QAAQ,IAAI,EAAE,QAAQ;AACjC,UAAM,OAAO,KAAK,IAAI,MAAM;AAC5B,SAAK,KAAK,IAAI,EAAE;AAChB,UAAM,QAAQ,KAAK,MAAM,MAAM,WAAW,MAAS;AACnD,UAAM,QAAQ,WAAW;AAEzB,UAAM,SAAS,KAAK,MAAM,MAAM,YAAY,MAAS;AACrD,UAAM,SAAS,YAAY;AAC3B,UAAM,OAAO,KAAK,MAAM,KAAK,KAAQ;AACrC,UAAM,OAAO;AACb,UAAM,QAAQ,KAAK,MAAM,KAAK,IAAO;AACrC,UAAM,QAAQ;AACd,UAAM,UAAU,KAAK,MAAM,KAAK,GAAK;AACrC,UAAM,UAAU;AAChB,UAAM,UAAU,KAAK,MAAM,KAAK,GAAI;AACpC,UAAM,SAAS,KAAK,MAAM,KAAK,GAAI;AACnC,UAAM,IAAI,CAAC,GAAW,MAAc,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AAC7D,WAAO,GAAG,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC7H;AACF;;;AClMA,SAAS,YAAY,MAAc,MAAkB,KAAa,MAAM,KAAW;AACjF,MAAI,KAAK,SAAS,OAAO,KAAK,SAAS,KAAK;AAC1C,UAAM,IAAI,YAAY,yCAAyC,IAAI,MAAM,QAAQ;AAAA,EACnF;AACF;AAEA,SAAS,gBAAgB,MAAkB,SAA0B,MAAc;AACjF,QAAM,QAAQ,KAAK,CAAC;AACpB,MAAI,YAA2B;AAC/B,MAAI,OAAO,UAAU,SAAU,aAAY;AAAA,WAClC,QAAQ,eAAgB,aAAY,QAAQ;AAAA,WAC5C,QAAQ,SAAU,aAAY,QAAQ,SAAS;AACxD,MAAI,CAAC,aAAa,CAAC,QAAQ,aAAa;AACtC,UAAM,IAAI,YAAY,0BAA0B,IAAI,6BAA6B,aAAa;AAAA,EAChG;AACA,QAAM,QAAQ,QAAQ,YAAY,SAAS;AAC3C,MAAI,CAAC,MAAO,OAAM,IAAI,YAAY,0BAA0B,IAAI,6BAA6B,aAAa;AAC1G,SAAO;AACT;AAEA,SAAS,WACP,OACA,SACA,UACQ;AACR,QAAM,MAAM,MAAM,QAAQ,QAAQ;AAClC,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,QAAQ,UAAU,SAAS,QAAQ;AACjD,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,MAAM,MAAM,KAAK,IAAI,KAAK;AAChC,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,IAAI,OAAO,IAAI,IAAI,YAAY,CAAC;AAC9C,SAAO,UAAU,QAAQ,UAAU,SAAY,KAAK,OAAO,KAAK;AAClE;AAMO,IAAM,kBAA4D;AAAA,EACvE,KAAK,MAAM,SAAS;AAClB,gBAAY,QAAQ,MAAM,GAAG,GAAG;AAChC,UAAM,QAAQ,gBAAgB,MAAM,SAAS,MAAM;AACnD,UAAM,UAAU,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC,CAAE;AAChF,QAAI,CAAC,QAAQ,YAAY,QAAQ,SAAS,UAAU,YAAY,MAAM,MAAM,KAAK,YAAY,GAAG;AAC9F,aAAO;AAAA,IACT;AACA,WAAO,MAAM,KAAK,QAAQ,UAAU,QAAQ,SAAS,UAAU,MAAS;AAAA,EAC1E;AAAA,EACA,UAAU,MAAM,SAAS;AACvB,gBAAY,aAAa,MAAM,CAAC;AAChC,UAAM,QAAQ,gBAAgB,MAAM,SAAS,WAAW;AACxD,UAAM,WAAW,OAAO,KAAK,CAAC,KAAK,CAAC;AACpC,UAAM,OAAO,OAAO,KAAK,CAAC,KAAK,EAAE;AACjC,UAAM,QAAQ,OAAO,KAAK,CAAC,KAAK,EAAE;AAClC,QAAI,CAAC,QAAQ,YAAY,QAAQ,SAAS,UAAU,YAAY,MAAM,MAAM,KAAK,YAAY,GAAG;AAC9F,aAAO,WAAW,OAAO,SAAS,QAAQ;AAAA,IAC5C;AACA,WAAO,MAAM,UAAU,QAAQ,UAAU,UAAU,MAAM,KAAK;AAAA,EAChE;AAAA,EACA,QAAQ,MAAM,SAAS;AACrB,gBAAY,WAAW,MAAM,GAAG,CAAC;AACjC,UAAM,QAAQ,gBAAgB,MAAM,SAAS,SAAS;AACtD,UAAM,WAAW,OAAO,KAAK,CAAC,KAAK,CAAC;AACpC,UAAM,OAAO,OAAO,KAAK,CAAC,KAAK,KAAK;AACpC,UAAM,QAAQ,OAAO,KAAK,CAAC,KAAK,MAAM;AACtC,UAAM,WAAW,OAAO,KAAK,CAAC,KAAK,KAAK;AACxC,UAAM,aAAa,OAAO,KAAK,CAAC,KAAK,EAAE;AACvC,QAAI,CAAC,QAAQ,YAAY,QAAQ,SAAS,UAAU,YAAY,MAAM,MAAM,KAAK,YAAY,GAAG;AAC9F,aAAO,WAAW,OAAO,SAAS,QAAQ;AAAA,IAC5C;AACA,WAAO,MAAM,QAAQ,QAAQ,UAAU,UAAU,MAAM,OAAO,UAAU,UAAU;AAAA,EACpF;AAAA,EACA,UAAU,MAAM,SAAS;AACvB,gBAAY,aAAa,MAAM,GAAG,CAAC;AACnC,UAAM,QAAQ,gBAAgB,MAAM,SAAS,WAAW;AACxD,UAAM,SAAS,OAAO,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,IAAI;AACvD,QAAI,CAAC,QAAQ,UAAU;AACrB,YAAM,IAAI,YAAY,6DAA6D,aAAa;AAAA,IAClG;AACA,WAAO,MAAM,UAAU,QAAQ,UAAU,MAAM;AAAA,EACjD;AAAA,EACA,QAAQ,MAAM,SAAS;AACrB,gBAAY,WAAW,MAAM,CAAC;AAC9B,UAAM,QAAQ,gBAAgB,MAAM,SAAS,SAAS;AACtD,QAAI,CAAC,QAAQ,UAAU;AACrB,YAAM,IAAI,YAAY,2DAA2D,aAAa;AAAA,IAChG;AACA,WAAO,MAAM,QAAQ,QAAQ,QAAQ;AAAA,EACvC;AACF;AAEO,IAAM,oBAA8D;AAAA,EACzE,WAAW,MAAM;AACf,gBAAY,cAAc,MAAM,GAAG,CAAC;AACpC,QAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,UAAM,IAAI,YAAY,mBAAmB,OAAO;AAAA,EAClD;AAAA,EACA,UAAU,MAAM;AACd,gBAAY,aAAa,MAAM,CAAC;AAChC,WAAO;AAAA,EACT;AAAA,EACA,WAAW,MAAM;AACf,gBAAY,cAAc,MAAM,CAAC;AACjC,WAAO;AAAA,EACT;AACF;;;AC1GA,SAASC,aAAY,MAAc,MAAkB,KAAa,MAAM,KAAW;AACjF,MAAI,KAAK,SAAS,OAAO,KAAK,SAAS,KAAK;AAC1C,UAAM,IAAI,YAAY,yCAAyC,IAAI,MAAM,QAAQ;AAAA,EACnF;AACF;AAEA,SAAS,IAAI,OAAgC;AAC3C,MAAI,UAAU,KAAM,QAAO;AAC3B,SAAO,eAAe,KAAK;AAC7B;AAEA,SAAS,WAAW,OAAgC;AAClD,MAAI,UAAU,QAAQ,OAAO,MAAM,KAAK,EAAG,QAAO;AAClD,SAAO,UAAU,KAAK;AACxB;AAEA,SAAS,UAAU,MAAc,IAA2C;AAC1E,SAAO,CAAC,SAAS;AACf,IAAAA,aAAY,MAAM,MAAM,CAAC;AACzB,UAAM,IAAI,IAAI,KAAK,CAAC,CAAE;AACtB,QAAI,MAAM,KAAM,QAAO;AACvB,WAAO,WAAW,GAAG,CAAC,CAAC;AAAA,EACzB;AACF;AAGA,SAAS,cAAc,OAAuD;AAC5E,QAAM,MAAM,IAAI,YAAY,CAAC;AAC7B,MAAI,SAAS,GAAG,EAAE,WAAW,GAAG,OAAO,KAAK;AAC5C,QAAM,OAAO,IAAI,SAAS,GAAG,EAAE,aAAa,GAAG,KAAK;AACpD,QAAM,OAAO,QAAQ;AACrB,QAAM,UAAU,OAAQ,QAAQ,MAAO,MAAM;AAC7C,QAAM,OAAO,OAAO;AACpB,MAAI,YAAY,GAAG;AAEjB,QAAIC,KAAI;AACR,QAAIC,KAAI;AACR,QAAID,OAAM,GAAI,QAAO,EAAE,UAAU,SAAS,KAAK,KAAK,CAAC,IAAI,UAAU,EAAE;AACrE,YAAQA,KAAI,QAAQ,IAAI;AACtB,MAAAA,OAAM;AACN,MAAAC;AAAA,IACF;AACA,WAAO,EAAE,UAAU,OAAO,CAACD,KAAIA,IAAG,UAAUC,GAAE;AAAA,EAChD;AACA,MAAI,YAAY,MAAO;AAErB,UAAMD,KAAK,MAAM,MAAO;AACxB,WAAO,EAAE,UAAU,OAAO,CAACA,KAAIA,IAAG,UAAU,IAAI;AAAA,EAClD;AACA,MAAI,IAAK,MAAM,MAAO;AACtB,MAAI,IAAI,UAAU;AAClB,UAAQ,IAAI,QAAQ,IAAI;AACtB,UAAM;AACN;AAAA,EACF;AACA,SAAO,EAAE,UAAU,OAAO,CAAC,IAAI,GAAG,UAAU,EAAE;AAChD;AAEA,SAAS,cAAc,UAAkB,UAA0B;AACjE,MAAI,aAAa,GAAI,QAAO;AAC5B,QAAM,OAAO,WAAW,KAAK,KAAK;AAClC,MAAI,IAAI,WAAW,KAAK,CAAC,WAAW;AACpC,MAAI,IAAI;AACR,SAAO,IAAI,OAAO,IAAI,QAAQ,IAAI;AAChC,UAAM;AACN;AAAA,EACF;AAEA,SAAO,OAAO,OAAO,CAAC,IAAI,KAAK;AACjC;AAEO,IAAM,gBAA0D;AAAA,EACrE,MAAM,UAAU,QAAQ,KAAK,IAAI;AAAA,EACjC,OAAO,UAAU,SAAS,KAAK,KAAK;AAAA,EACpC,MAAM,UAAU,QAAQ,KAAK,IAAI;AAAA,EACjC,OAAO,UAAU,SAAS,KAAK,KAAK;AAAA,EACpC,MAAM,UAAU,QAAQ,KAAK,IAAI;AAAA,EACjC,OAAO,UAAU,SAAS,KAAK,KAAK;AAAA,EACpC,MAAM,UAAU,QAAQ,KAAK,IAAI;AAAA,EACjC,SAAS,UAAU,WAAW,KAAK,IAAI;AAAA,EACvC,KAAK,UAAU,OAAO,KAAK,GAAG;AAAA,EAC9B,MAAM,UAAU,QAAQ,KAAK,IAAI;AAAA,EACjC,SAAS,UAAU,WAAW,CAAC,MAAO,IAAI,MAAO,KAAK,EAAE;AAAA,EACxD,KAAK,UAAU,OAAO,KAAK,GAAG;AAAA,EAC9B,OAAO,UAAU,SAAS,KAAK,KAAK;AAAA,EACpC,IAAI,UAAU,MAAM,KAAK,GAAG;AAAA,EAC5B,OAAO,UAAU,SAAS,KAAK,KAAK;AAAA,EACpC,MAAM,UAAU,QAAQ,KAAK,IAAI;AAAA,EACjC,GAAG,MAAM;AACP,IAAAD,aAAY,MAAM,MAAM,CAAC;AACzB,WAAO,UAAU,KAAK,EAAE;AAAA,EAC1B;AAAA,EACA,SAAS,UAAU,WAAW,CAAC,MAAO,IAAI,KAAK,KAAM,GAAG;AAAA,EACxD,KAAK,MAAM;AACT,IAAAA,aAAY,QAAQ,MAAM,CAAC;AAC3B,UAAM,IAAI,IAAI,KAAK,CAAC,CAAE;AACtB,QAAI,MAAM,KAAM,QAAO;AACvB,QAAI,IAAI,EAAG,QAAO;AAClB,QAAI,IAAI,EAAG,QAAO;AAClB,WAAO;AAAA,EACT;AAAA,EACA,KAAK,UAAU,OAAO,KAAK,GAAG;AAAA,EAC9B,MAAM,UAAU,QAAQ,KAAK,IAAI;AAAA,EACjC,MAAM,UAAU,QAAQ,KAAK,IAAI;AAAA,EACjC,KAAK,UAAU,OAAO,KAAK,GAAG;AAAA,EAC9B,MAAM,UAAU,QAAQ,KAAK,IAAI;AAAA,EACjC,OAAO,UAAU,SAAS,KAAK,KAAK;AAAA,EACpC,MAAM,MAAM;AACV,IAAAA,aAAY,SAAS,MAAM,CAAC;AAC5B,UAAM,IAAI,IAAI,KAAK,CAAC,CAAE;AACtB,UAAM,IAAI,IAAI,KAAK,CAAC,CAAE;AACtB,QAAI,MAAM,QAAQ,MAAM,KAAM,QAAO;AACrC,WAAO,WAAW,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,EACpC;AAAA,EACA,IAAI,MAAM;AACR,IAAAA,aAAY,OAAO,MAAM,GAAG,CAAC;AAC7B,QAAI,KAAK,WAAW,GAAG;AACrB,YAAMG,KAAI,IAAI,KAAK,CAAC,CAAE;AACtB,UAAIA,OAAM,KAAM,QAAO;AACvB,aAAO,WAAW,KAAK,MAAMA,EAAC,CAAC;AAAA,IACjC;AACA,UAAM,OAAO,IAAI,KAAK,CAAC,CAAE;AACzB,UAAM,IAAI,IAAI,KAAK,CAAC,CAAE;AACtB,QAAI,SAAS,QAAQ,MAAM,KAAM,QAAO;AACxC,WAAO,WAAW,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC;AAAA,EAChD;AAAA,EACA,IAAI,MAAM;AACR,IAAAH,aAAY,OAAO,MAAM,CAAC;AAC1B,UAAM,IAAI,IAAI,KAAK,CAAC,CAAE;AACtB,UAAM,IAAI,IAAI,KAAK,CAAC,CAAE;AACtB,QAAI,MAAM,QAAQ,MAAM,KAAM,QAAO;AACrC,QAAI,MAAM,EAAG,QAAO;AACpB,WAAO,WAAW,IAAI,CAAC;AAAA,EACzB;AAAA,EACA,IAAI,MAAM;AACR,IAAAA,aAAY,OAAO,MAAM,CAAC;AAC1B,UAAM,IAAI,IAAI,KAAK,CAAC,CAAE;AACtB,UAAM,IAAI,IAAI,KAAK,CAAC,CAAE;AACtB,QAAI,MAAM,QAAQ,MAAM,KAAM,QAAO;AACrC,WAAO,WAAW,KAAK,CAAC;AAAA,EAC1B;AAAA,EACA,MAAM,MAAM,KAAK;AACf,WAAO,cAAc,IAAK,MAAM,GAAG;AAAA,EACrC;AAAA,EACA,QAAQ,MAAM;AACZ,IAAAA,aAAY,WAAW,MAAM,GAAG,CAAC;AACjC,QAAI,KAAK,WAAW,GAAG;AACrB,YAAM,IAAI,IAAI,KAAK,CAAC,CAAE;AACtB,UAAI,MAAM,KAAM,QAAO;AACvB,YAAM,EAAE,UAAAI,WAAU,UAAAC,UAAS,IAAI,cAAc,CAAC;AAC9C,aAAO,WAAWD,SAAQ,IAAIC,SAAQ;AAAA,IACxC;AACA,UAAM,IAAI,KAAK,CAAC;AAChB,UAAM,IAAI,KAAK,CAAC;AAChB,QAAI,MAAM,QAAQ,MAAM,KAAM,QAAO;AACrC,UAAM,WAAW,OAAO,MAAM,WAAW,IAAI,OAAO,KAAK,MAAM,IAAI,CAAC,CAAE,CAAC;AACvE,UAAM,WAAW,KAAK,MAAM,IAAI,CAAC,CAAE;AACnC,WAAO,WAAW,cAAc,UAAU,QAAQ,CAAC;AAAA,EACrD;AAAA,EACA,iBAAiB,MAAM;AACrB,IAAAL,aAAY,oBAAoB,MAAM,CAAC;AACvC,UAAM,IAAI,IAAI,KAAK,CAAC,CAAE;AACtB,QAAI,MAAM,KAAM,QAAO;AACvB,WAAO,cAAc,CAAC,EAAE;AAAA,EAC1B;AAAA,EACA,iBAAiB,MAAM;AACrB,IAAAA,aAAY,oBAAoB,MAAM,CAAC;AACvC,UAAM,IAAI,IAAI,KAAK,CAAC,CAAE;AACtB,QAAI,MAAM,KAAM,QAAO;AACvB,WAAO,cAAc,CAAC,EAAE;AAAA,EAC1B;AAAA,EACA,gBAAgB,MAAM;AACpB,IAAAA,aAAY,mBAAmB,MAAM,CAAC;AACtC,UAAM,IAAI,IAAI,KAAK,CAAC,CAAE;AACtB,QAAI,MAAM,KAAM,QAAO;AACvB,UAAM,MAAM,IAAI,YAAY,CAAC;AAC7B,QAAI,SAAS,GAAG,EAAE,WAAW,GAAG,GAAG,KAAK;AACxC,WAAO,IAAI,WAAW,GAAG;AAAA,EAC3B;AAAA,EACA,kBAAkB,MAAM;AACtB,IAAAA,aAAY,qBAAqB,MAAM,CAAC;AACxC,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,UAAU,KAAM,QAAO;AAC3B,QAAI,EAAE,iBAAiB,eAAe,MAAM,WAAW,GAAG;AACxD,YAAM,IAAI,YAAY,+CAA+C,QAAQ;AAAA,IAC/E;AACA,UAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,WAAO,WAAW,KAAK,WAAW,GAAG,KAAK,CAAC;AAAA,EAC7C;AAAA,EACA,YAAY,MAAM;AAChB,IAAAA,aAAY,eAAe,MAAM,CAAC;AAClC,UAAM,IAAI,IAAI,KAAK,CAAC,CAAE;AACtB,UAAM,QAAQ,IAAI,KAAK,CAAC,CAAE;AAC1B,QAAI,MAAM,QAAQ,UAAU,KAAM,QAAO;AACzC,UAAM,MAAM,IAAI,YAAY,CAAC;AAC7B,UAAM,OAAO,IAAI,SAAS,GAAG;AAC7B,SAAK,WAAW,GAAG,GAAG,KAAK;AAC3B,QAAI,OAAO,KAAK,aAAa,GAAG,KAAK;AACrC,UAAM,OAAO,OAAO,KAAK,MAAM,KAAK,CAAC;AACrC,WAAQ,OAAO,OAAQ;AACvB,SAAK,aAAa,GAAG,MAAM,KAAK;AAChC,WAAO,WAAW,KAAK,WAAW,GAAG,KAAK,CAAC;AAAA,EAC7C;AACF;;;AC7MA,SAAS,gBAAgB,MAAsB;AAC7C,SAAO,qBAAqB,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK;AACzD;AAEA,SAAS,YAAY,MAAsB;AACzC,QAAM,OAAO,KAAK,YAAY,CAAC;AAC/B,MAAI,QAAQ,MAAM,QAAQ,GAAI,QAAO,IAAI,IAAI,GAAG,KAAK,YAAY,CAAC;AAClE,MAAI,QAAQ,MAAM,QAAQ,IAAK,QAAO,IAAI,IAAI,GAAG,KAAK,YAAY,CAAC;AACnE,SAAO,gBAAgB,IAAI;AAC7B;AASO,SAAS,UAAUM,OAAc,SAAiB,SAAwB,MAAe;AAC9F,MAAI,WAAW,QAAQ,CAAC,GAAG,MAAM,EAAE,WAAW,GAAG;AAC/C,UAAM,IAAI,YAAY,gDAAgD,OAAO;AAAA,EAC/E;AAEA,MAAI,SAAS;AACb,QAAM,QAAQ,CAAC,GAAG,OAAO;AACzB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,WAAW,QAAQ,SAAS,QAAQ;AACtC,YAAM,OAAO,MAAM,EAAE,CAAC;AACtB,gBAAU,SAAS,SAAY,YAAY,IAAI,IAAI,YAAY,IAAI;AAAA,IACrE,WAAW,SAAS,KAAK;AACvB,gBAAU;AAAA,IACZ,WAAW,SAAS,KAAK;AACvB,gBAAU;AAAA,IACZ,OAAO;AACL,gBAAU,YAAY,IAAI;AAAA,IAC5B;AAAA,EACF;AACA,SAAO,IAAI,OAAO,GAAG,MAAM,GAAG,EAAE,KAAKA,KAAI;AAC3C;AAQO,SAAS,UAAUA,OAAc,SAA0B;AAChE,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,OAAO,QAAQ,CAAC;AACtB,QAAI,SAAS,KAAK;AAChB,gBAAU;AAAA,IACZ,WAAW,SAAS,KAAK;AACvB,gBAAU;AAAA,IACZ,WAAW,SAAS,KAAK;AACvB,UAAI,MAAM,IAAI;AACd,UAAI,QAAQ,GAAG,MAAM,IAAK;AAC1B,UAAI,QAAQ,GAAG,MAAM,IAAK;AAC1B,aAAO,MAAM,QAAQ,UAAU,QAAQ,GAAG,MAAM,IAAK;AACrD,UAAI,OAAO,QAAQ,QAAQ;AACzB,kBAAU;AAAA,MACZ,OAAO;AACL,YAAI,UAAU,QAAQ,MAAM,IAAI,GAAG,GAAG;AAEtC,YAAI,QAAQ,WAAW,GAAG,EAAG,WAAU,IAAI,QAAQ,MAAM,CAAC,CAAC;AAC3D,kBAAU,IAAI,QAAQ,QAAQ,OAAO,MAAM,CAAC;AAC5C,YAAI;AAAA,MACN;AAAA,IACF,OAAO;AACL,gBAAU,gBAAgB,IAAI;AAAA,IAChC;AAAA,EACF;AACA,SAAO,IAAI,OAAO,GAAG,MAAM,GAAG,EAAE,KAAKA,KAAI;AAC3C;;;AC3DO,IAAM,qBAAqB;AAC3B,IAAM,uBACX;AAEF,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,KAAK,OAAyB;AACrC,MAAI,iBAAiB,WAAY,QAAO,WAAW,KAAK;AACxD,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,QAAQ,OAAyB;AACxC,SAAO,eAAe,KAAK,KAAK;AAClC;AAEO,SAAS,aAAa,OAAiB,UAA4B;AACxE,QAAM,WAAW,qBAAqB,QAAQ;AAC9C,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,aAAa,QAAQ;AACvB,WAAO,iBAAiB,aAAa,QAAQ,WAAW,KAAK,KAAK,CAAC;AAAA,EACrE;AACA,MAAI,aAAa,OAAQ,QAAO,KAAK,KAAK;AAC1C,MAAI,aAAa,UAAW,QAAO,KAAK,MAAM,eAAe,KAAK,KAAK,CAAC;AACxE,MAAI,aAAa,OAAQ,QAAO,UAAU,eAAe,KAAK,KAAK,CAAC;AACpE,SAAO,cAAc,OAAO,SAAS;AACvC;AAEA,SAAS,UAAU,OAAe,OAAe,MAAe,OAAwB;AACtF,QAAM,MAAM,oBAAI,IAAI,CAAC,GAAG,KAAK,CAAC;AAC9B,QAAM,QAAQ,CAAC,GAAG,KAAK;AACvB,MAAI,QAAQ;AACZ,MAAI,MAAM,MAAM;AAChB,MAAI,KAAM,QAAO,QAAQ,OAAO,IAAI,IAAI,MAAM,KAAK,CAAE,EAAG;AACxD,MAAI,MAAO,QAAO,MAAM,SAAS,IAAI,IAAI,MAAM,MAAM,CAAC,CAAE,EAAG;AAC3D,SAAO,MAAM,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE;AACxC;AAEA,SAAS,OAAO,OAAe,YAAoB,aAA8B;AAC/E,QAAM,QAAQ,CAAC,GAAG,KAAK;AACvB,QAAM,QAAQ,KAAK,MAAM,UAAU;AACnC,MAAI,QAAQ,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,MAAM,SAAS,QAAQ;AACvE,UAAQ,KAAK,IAAI,GAAG,KAAK;AACzB,MAAI,gBAAgB,OAAW,QAAO,MAAM,MAAM,KAAK,EAAE,KAAK,EAAE;AAChE,QAAM,SAAS,KAAK,MAAM,WAAW;AACrC,MAAI,UAAU,EAAG,QAAO,MAAM,MAAM,OAAO,QAAQ,MAAM,EAAE,KAAK,EAAE;AAClE,SAAO,MAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,MAAM,GAAG,KAAK,EAAE,KAAK,EAAE;AAChE;AAEA,SAAS,aAAa,QAAgB,MAA0B;AAC9D,MAAI,QAAQ;AACZ,SAAO,OAAO;AAAA,IACZ;AAAA,IACA,CAAC,QAAQ,OAAe,WAA+B,eAAmC,SAAiB;AACzG,UAAI,SAAS,IAAK,QAAO;AACzB,YAAM,QAAQ,KAAK,OAAO,KAAK;AAC/B,YAAM,YAAY,kBAAkB,SAAY,SAAY,OAAO,aAAa;AAChF,UAAI;AACJ,cAAQ,MAAM;AAAA,QACZ,KAAK;AAAA,QACL,KAAK;AACH,mBAAS,OAAO,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC;AAC1C;AAAA,QACF,KAAK;AACH,mBAAS,QAAQ,KAAK,EAAE,QAAQ,aAAa,CAAC;AAC9C;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,mBAAS,QAAQ,KAAK,EACnB,YAAY,aAAa,CAAC,EAC1B,QAAQ,eAAe,IAAI;AAC9B;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,mBAAS,KAAK,MAAM,QAAQ,KAAK,CAAC,EAAE,SAAS,EAAE;AAC/C;AAAA,QACF,KAAK;AACH,mBAAS,OAAO,cAAc,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC;AACxD;AAAA,QACF,KAAK;AACH,mBAAS,UAAU,OAAO,WAAW,KAAK,KAAK,EAAE,QAAQ,MAAM,IAAI;AACnE;AAAA,QACF,KAAK;AACH,mBAAS,UAAU,OAAO,SAAS,IAAI,KAAK,KAAK,EAAE,QAAQ,MAAM,IAAI,CAAC;AACtE;AAAA,QACF;AACE,mBAAS,UAAU,OAAO,KAAK,KAAK,KAAK;AAAA,MAC7C;AACA,UAAI,SAAS,OAAO,SAAS,IAAK,UAAS,OAAO,YAAY;AAC9D,YAAM,QAAQ,OAAO,aAAa,CAAC;AACnC,UAAI,QAAQ,OAAO,QAAQ;AACzB,cAAMC,OAAM,MAAM,SAAS,GAAG,IAAI,MAAM;AACxC,iBAAS,MAAM,SAAS,GAAG,IAAI,OAAO,OAAO,OAAOA,IAAG,IAAI,OAAO,SAAS,OAAOA,IAAG;AAAA,MACvF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAASC,aAAY,MAAc,MAAkB,KAAa,MAAM,KAAW;AACjF,MAAI,KAAK,SAAS,OAAO,KAAK,SAAS,KAAK;AAC1C,UAAM,IAAI,YAAY,yCAAyC,IAAI,MAAM,QAAQ;AAAA,EACnF;AACF;AAEA,IAAM,kBAAkD;AAAA,EACtD,IAAI,MAAM;AACR,IAAAA,aAAY,OAAO,MAAM,CAAC;AAC1B,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,UAAU,KAAM,QAAO;AAC3B,QAAI,OAAO,UAAU,SAAU,QAAO,QAAQ,KAAK,CAAC,QAAQ;AAC5D,WAAO,KAAK,IAAI,QAAQ,KAAK,CAAC;AAAA,EAChC;AAAA,EACA,SAAS,MAAM;AACb,QAAI,KAAK,SAAS,EAAG,OAAM,IAAI,YAAY,oDAAoD,QAAQ;AACvG,WAAO,KAAK,KAAK,CAAC,UAAU,UAAU,IAAI,KAAK;AAAA,EACjD;AAAA,EACA,OAAO,MAAM;AACX,IAAAA,aAAY,UAAU,MAAM,CAAC;AAC7B,WAAO,KAAK,CAAC,KAAK,KAAK,CAAC;AAAA,EAC1B;AAAA,EACA,OAAO,MAAM;AACX,IAAAA,aAAY,UAAU,MAAM,CAAC;AAC7B,UAAM,aAAa,WAAW,KAAK,CAAC,GAAI,KAAK,CAAC,CAAE;AAChD,WAAO,eAAe,IAAI,OAAO,KAAK,CAAC;AAAA,EACzC;AAAA,EACA,OAAO,MAAM;AACX,IAAAA,aAAY,UAAU,MAAM,CAAC;AAC7B,WAAO,UAAU,KAAK,CAAC,CAAE;AAAA,EAC3B;AAAA,EACA,OAAO,MAAM;AACX,IAAAA,aAAY,UAAU,MAAM,CAAC;AAC7B,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,UAAU,KAAM,QAAO;AAC3B,QAAI,iBAAiB,WAAY,QAAO,MAAM;AAC9C,WAAO,CAAC,GAAG,KAAK,KAAK,CAAC,EAAE;AAAA,EAC1B;AAAA,EACA,MAAM,MAAM;AACV,IAAAA,aAAY,SAAS,MAAM,CAAC;AAC5B,WAAO,KAAK,CAAC,MAAM,OAAO,OAAO,KAAK,KAAK,CAAC,CAAE,EAAE,QAAQ,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC;AAAA,EAC1F;AAAA,EACA,MAAM,MAAM;AACV,IAAAA,aAAY,SAAS,MAAM,CAAC;AAC5B,WAAO,KAAK,CAAC,MAAM,OAAO,OAAO,KAAK,KAAK,CAAC,CAAE,EAAE,QAAQ,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC;AAAA,EAC1F;AAAA,EACA,KAAK,MAAM;AACT,IAAAA,aAAY,QAAQ,MAAM,GAAG,CAAC;AAC9B,QAAI,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAM,QAAO;AACjD,WAAO,UAAU,KAAK,KAAK,CAAC,CAAE,GAAG,KAAK,CAAC,MAAM,SAAY,MAAM,KAAK,KAAK,CAAC,CAAC,GAAG,MAAM,IAAI;AAAA,EAC1F;AAAA,EACA,MAAM,MAAM;AACV,IAAAA,aAAY,SAAS,MAAM,GAAG,CAAC;AAC/B,QAAI,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAM,QAAO;AACjD,WAAO,UAAU,KAAK,KAAK,CAAC,CAAE,GAAG,KAAK,CAAC,MAAM,SAAY,MAAM,KAAK,KAAK,CAAC,CAAC,GAAG,MAAM,KAAK;AAAA,EAC3F;AAAA,EACA,MAAM,MAAM;AACV,IAAAA,aAAY,SAAS,MAAM,GAAG,CAAC;AAC/B,QAAI,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAM,QAAO;AACjD,WAAO,UAAU,KAAK,KAAK,CAAC,CAAE,GAAG,KAAK,CAAC,MAAM,SAAY,MAAM,KAAK,KAAK,CAAC,CAAC,GAAG,OAAO,IAAI;AAAA,EAC3F;AAAA,EACA,OAAO,MAAM;AACX,IAAAA,aAAY,UAAU,MAAM,GAAG,CAAC;AAChC,QAAI,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAM,QAAO;AACrE,WAAO,OAAO,KAAK,KAAK,CAAC,CAAE,GAAG,QAAQ,KAAK,CAAC,CAAE,GAAG,KAAK,CAAC,MAAM,SAAY,SAAY,QAAQ,KAAK,CAAC,CAAC,CAAC;AAAA,EACvG;AAAA,EACA,UAAU,MAAM,SAAS;AACvB,WAAO,gBAAgB,OAAQ,MAAM,OAAO;AAAA,EAC9C;AAAA,EACA,QAAQ,MAAM;AACZ,IAAAA,aAAY,WAAW,MAAM,CAAC;AAC9B,QAAI,KAAK,KAAK,CAAC,UAAU,UAAU,IAAI,EAAG,QAAO;AACjD,UAAM,SAAS,KAAK,KAAK,CAAC,CAAE;AAC5B,WAAO,WAAW,KAAK,KAAK,KAAK,CAAC,CAAE,IAAI,KAAK,KAAK,CAAC,CAAE,EAAE,MAAM,MAAM,EAAE,KAAK,KAAK,KAAK,CAAC,CAAE,CAAC;AAAA,EAC1F;AAAA,EACA,MAAM,MAAM;AACV,IAAAA,aAAY,SAAS,MAAM,GAAG,CAAC;AAC/B,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,UAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,QAAQ,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1E,UAAM,SAAS,MAAM;AACrB,UAAM,SAAS,QAAQ,KAAK,CAAC,CAAE,IAAI;AACnC,YAAQ,SAAS,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,IAAI,KAAK,MAAM,MAAM,KAAK;AAAA,EACpE;AAAA,EACA,IAAI,MAAM;AACR,QAAI,KAAK,SAAS,EAAG,OAAM,IAAI,YAAY,+CAA+C,QAAQ;AAClG,QAAI,KAAK,KAAK,CAAC,UAAU,UAAU,IAAI,EAAG,QAAO;AACjD,WAAO,KAAK,OAAO,CAAC,MAAM,UAAW,WAAW,OAAO,IAAI,IAAK,IAAI,QAAQ,IAAK;AAAA,EACnF;AAAA,EACA,IAAI,MAAM;AACR,QAAI,KAAK,SAAS,EAAG,OAAM,IAAI,YAAY,+CAA+C,QAAQ;AAClG,QAAI,KAAK,KAAK,CAAC,UAAU,UAAU,IAAI,EAAG,QAAO;AACjD,WAAO,KAAK,OAAO,CAAC,MAAM,UAAW,WAAW,OAAO,IAAI,IAAK,IAAI,QAAQ,IAAK;AAAA,EACnF;AAAA,EACA,OAAO,MAAM,SAAS;AACpB,IAAAA,aAAY,UAAU,MAAM,CAAC;AAC7B,QAAI,QAAQ,OAAQ,QAAO,QAAQ,OAAO;AAE1C,WAAO;AAAA,EACT;AAAA,EACA,WAAW,MAAM,SAAS;AACxB,IAAAA,aAAY,cAAc,MAAM,CAAC;AACjC,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,UAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAE,CAAC,CAAC;AACxD,UAAM,MAAM,IAAI,WAAW,MAAM;AACjC,QAAI,SAAS;AACb,WAAO,SAAS,QAAQ;AACtB,YAAM,OAAO,QAAQ,YAAY,KAAK;AACtC,eAAS,QAAQ,GAAG,QAAQ,MAAM,SAAS,QAAQ,SAAS,GAAG;AAC7D,YAAI,QAAQ,IAAI,OAAQ,QAAQ,OAAO,KAAK,IAAK,KAAK;AAAA,MACxD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EACA,SAAS,MAAM;AACb,IAAAA,aAAY,YAAY,MAAM,CAAC;AAC/B,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,UAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAE,CAAC,CAAC;AACxD,WAAO,IAAI,WAAW,MAAM;AAAA,EAC9B;AAAA,EACA,IAAI,MAAM;AACR,IAAAA,aAAY,OAAO,MAAM,CAAC;AAC1B,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,UAAM,QAAQ,KAAK,CAAC,aAAa,aAAa,KAAK,CAAC,IAAI,WAAW,KAAK,KAAK,CAAC,CAAE,CAAC;AACjF,WAAO,CAAC,GAAG,KAAK,EACb,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAChD,KAAK,EAAE,EACP,YAAY;AAAA,EACjB;AAAA,EACA,MAAM,MAAM;AACV,IAAAA,aAAY,SAAS,MAAM,CAAC;AAC5B,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,UAAU,KAAM,QAAO;AAC3B,QAAI,iBAAiB,WAAY,QAAO,KAAK,gBAAgB,IAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC9E,QAAI,OAAO,UAAU,SAAU,QAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AACnE,QAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO,QAAQ,IAAI,cAAc;AAC3F,WAAO,OAAO,KAAK;AAAA,EACrB;AAAA,EACA,OAAO,MAAM;AACX,QAAI,KAAK,WAAW,KAAK,KAAK,CAAC,MAAM,KAAM,QAAO;AAClD,WAAO,aAAa,KAAK,KAAK,CAAC,CAAE,GAAG,KAAK,MAAM,CAAC,CAAC;AAAA,EACnD;AAAA,EACA,QAAQ,MAAM,SAAS;AACrB,IAAAA,aAAY,WAAW,MAAM,CAAC;AAC9B,WAAO,QAAQ,UAAU,KAAK;AAAA,EAChC;AAAA,EACA,cAAc,MAAM,SAAS;AAC3B,IAAAA,aAAY,iBAAiB,MAAM,CAAC;AACpC,WAAO,QAAQ,eAAe,KAAK;AAAA,EACrC;AAAA,EACA,kBAAkB,MAAM,SAAS;AAC/B,IAAAA,aAAY,qBAAqB,MAAM,CAAC;AACxC,WAAO,QAAQ,kBAAkB,KAAK;AAAA,EACxC;AAAA,EACA,eAAe,MAAM;AACnB,IAAAA,aAAY,kBAAkB,MAAM,CAAC;AACrC,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB,MAAM;AACrB,IAAAA,aAAY,oBAAoB,MAAM,CAAC;AACvC,WAAO;AAAA,EACT;AAAA,EACA,0BAA0B,MAAM;AAC9B,IAAAA,aAAY,6BAA6B,MAAM,CAAC;AAChD,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,UAAM,SAAS,KAAK,KAAK,CAAC,CAAE,EACzB,YAAY,EACZ,QAAQ,YAAY,EAAE;AACzB,WAAO,gBAAgB,KAAK,CAAC,QAAQ,QAAQ,UAAU,IAAI,WAAW,GAAG,MAAM,GAAG,CAAC,IAAI,IAAI;AAAA,EAC7F;AAAA,EACA,yBAAyB,MAAM;AAC7B,IAAAA,aAAY,4BAA4B,MAAM,CAAC;AAC/C,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,UAAM,QAAQ,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAE,CAAC;AAC1C,QAAI,QAAQ,KAAK,SAAS,gBAAgB,OAAQ,QAAO;AACzD,WAAO,gBAAgB,KAAK;AAAA,EAC9B;AAAA,EACA,WAAW,MAAM;AACf,IAAAA,aAAY,cAAc,MAAM,CAAC;AACjC,WAAO;AAAA,EACT;AAAA,EACA,eAAe,MAAM;AACnB,IAAAA,aAAY,kBAAkB,MAAM,GAAG,CAAC;AACxC,UAAM,IAAI,YAAY,kBAAkB,QAAQ;AAAA,EAClD;AAAA,EACA,KAAK,MAAM;AACT,IAAAA,aAAY,QAAQ,MAAM,GAAG,CAAC;AAC9B,QAAI,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAM,QAAO;AAErE,UAAM,SAAS,KAAK,CAAC,MAAM,SAAY,OAAO,KAAK,KAAK,CAAC,CAAE;AAC3D,WAAO,UAAU,KAAK,KAAK,CAAC,CAAE,GAAG,KAAK,KAAK,CAAC,CAAE,GAAG,MAAM,IAAI,IAAI;AAAA,EACjE;AAAA,EACA,KAAK,MAAM;AACT,IAAAA,aAAY,QAAQ,MAAM,CAAC;AAC3B,QAAI,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAM,QAAO;AAEjD,WAAO,UAAU,KAAK,KAAK,CAAC,CAAE,GAAG,KAAK,KAAK,CAAC,CAAE,CAAC,IAAI,IAAI;AAAA,EACzD;AAAA,EACA,QAAQ;AACN,UAAM,IAAI,YAAY,yDAAyD,aAAa;AAAA,EAC9F;AAAA,EACA,KAAK,MAAM;AACT,QAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,QAAI,MAAM;AACV,eAAW,OAAO,MAAM;AACtB,UAAI,QAAQ,KAAM;AAClB,YAAM,OAAO,KAAK,MAAM,QAAQ,GAAG,CAAC;AACpC,UAAI,OAAO,EAAG,QAAO,OAAO,cAAc,IAAI;AAAA,IAChD;AACA,WAAO;AAAA,EACT;AAAA,EACA,OAAO,MAAM,SAAS;AACpB,WAAO,gBAAgB,OAAQ,MAAM,OAAO;AAAA,EAC9C;AAAA,EACA,IAAI,MAAM;AACR,IAAAA,aAAY,OAAO,MAAM,CAAC;AAC1B,UAAM,OAAO,KAAK,CAAC;AACnB,QAAI,SAAS,KAAM,QAAO,KAAK,CAAC;AAChC,QAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;AACxD,aAAO,OAAO,IAAI,MAAM,IAAI,KAAK,CAAC,IAAK,KAAK,CAAC;AAAA,IAC/C;AACA,QAAI,OAAO,SAAS,SAAU,QAAO,KAAK,SAAS,IAAI,KAAK,CAAC,IAAK,KAAK,CAAC;AACxE,QAAI,gBAAgB,WAAY,QAAO,KAAK,SAAS,IAAI,KAAK,CAAC,IAAK,KAAK,CAAC;AAC1E,WAAO,KAAK,CAAC;AAAA,EACf;AAAA,EACA,GAAG,MAAM,SAAS;AAChB,WAAO,gBAAgB,IAAK,MAAM,OAAO;AAAA,EAC3C;AAAA,EACA,MAAM,MAAM;AACV,IAAAA,aAAY,SAAS,MAAM,CAAC;AAC5B,QAAI,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAM,QAAO;AACjD,QAAI,KAAK,CAAC,aAAa,cAAc,KAAK,CAAC,aAAa,YAAY;AAClE,YAAMC,OAAM,KAAK,CAAC,aAAa,aAAa,KAAK,CAAC,IAAI,WAAW,KAAK,KAAK,CAAC,CAAE,CAAC;AAC/E,YAAMC,UAAS,KAAK,CAAC,aAAa,aAAa,KAAK,CAAC,IAAI,WAAW,KAAK,KAAK,CAAC,CAAE,CAAC;AAClF,UAAIA,QAAO,WAAW,EAAG,QAAO;AAChC,YAAO,UAAS,IAAI,GAAG,KAAKD,KAAI,SAASC,QAAO,QAAQ,KAAK;AAC3D,iBAAS,IAAI,GAAG,IAAIA,QAAO,QAAQ,KAAK;AACtC,cAAID,KAAI,IAAI,CAAC,MAAMC,QAAO,CAAC,EAAG,UAAS;AAAA,QACzC;AACA,eAAO,IAAI;AAAA,MACb;AACA,aAAO;AAAA,IACT;AACA,UAAM,MAAM,KAAK,KAAK,CAAC,CAAE;AACzB,UAAM,SAAS,KAAK,KAAK,CAAC,CAAE;AAC5B,QAAI,WAAW,GAAI,QAAO;AAC1B,UAAM,MAAM,IAAI,QAAQ,MAAM;AAC9B,WAAO,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC,EAAE,SAAS;AAAA,EACvD;AAAA,EACA,QAAQ,MAAM;AACZ,IAAAF,aAAY,WAAW,MAAM,CAAC;AAC9B,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,UAAM,IAAI,KAAK,KAAK,CAAC,CAAE;AACvB,QAAI,EAAE,WAAW,EAAG,QAAO;AAC3B,WAAO,EAAE,YAAY,CAAC;AAAA,EACxB;AAAA,EACA,aAAa,MAAM;AACjB,IAAAA,aAAY,gBAAgB,MAAM,CAAC;AACnC,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,QAAI,KAAK,CAAC,aAAa,WAAY,QAAO,KAAK,CAAC,EAAE;AAClD,WAAO,WAAW,KAAK,KAAK,CAAC,CAAE,CAAC,EAAE;AAAA,EACpC;AAAA,EACA,MAAM,MAAM;AACV,IAAAA,aAAY,SAAS,MAAM,GAAG,CAAC;AAC/B,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,QAAI,MAAM,KAAK,KAAK,CAAC,CAAE,EAAE,QAAQ,QAAQ,EAAE;AAC3C,QAAI,KAAK,CAAC,MAAM,UAAa,KAAK,CAAC,MAAM,MAAM;AAC7C,YAAM,MAAM,KAAK,KAAK,CAAC,CAAE;AACzB,YAAM,KAAK,KAAK,CAAC,CAAE,EAAE,MAAM,GAAG,EAAE,KAAK,EAAE;AAAA,IACzC;AACA,QAAI,IAAI,SAAS,MAAM,EAAG,QAAO;AACjC,QAAI,CAAC,iBAAiB,KAAK,GAAG,EAAG,QAAO;AACxC,UAAM,MAAM,IAAI,WAAW,IAAI,SAAS,CAAC;AACzC,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAI,CAAC,IAAI,OAAO,SAAS,IAAI,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE;AAAA,IAC1D;AACA,WAAO;AAAA,EACT;AAAA,EACA,OAAO,MAAM;AACX,QAAI,KAAK,KAAK,CAAC,MAAM,MAAM,IAAI,EAAG,QAAO;AACzC,WAAO,KAAK,IAAI,CAAC,MAAM,KAAK,CAAE,CAAC,EAAE,KAAK,EAAE;AAAA,EAC1C;AAAA,EACA,UAAU,MAAM;AACd,QAAI,KAAK,SAAS,EAAG,OAAM,IAAI,YAAY,qDAAqD,QAAQ;AACxG,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,UAAM,MAAM,KAAK,KAAK,CAAC,CAAE;AACzB,UAAM,QAAkB,CAAC;AACzB,eAAW,OAAO,KAAK,MAAM,CAAC,GAAG;AAC/B,UAAI,QAAQ,KAAM;AAClB,YAAM,KAAK,KAAK,GAAG,CAAC;AAAA,IACtB;AACA,WAAO,MAAM,KAAK,GAAG;AAAA,EACvB;AAAA,EACA,OAAO,MAAM;AACX,IAAAA,aAAY,UAAU,MAAM,CAAC;AAC7B,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,UAAM,QAAQ,KAAK,KAAK,CAAC,CAAE;AAC3B,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAI,MAAM,CAAC,MAAM,QAAQ,MAAM,IAAI,CAAC,MAAM,KAAK;AAC7C,cAAM,MAAM,MAAM,MAAM,IAAI,GAAG,IAAI,CAAC;AACpC,YAAI,CAAC,mBAAmB,KAAK,GAAG,GAAG;AACjC,gBAAM,IAAI,YAAY,sCAAsC,OAAO;AAAA,QACrE;AACA,eAAO,OAAO,cAAc,OAAO,SAAS,KAAK,EAAE,CAAC;AACpD,aAAK;AAAA,MACP,OAAO;AACL,eAAO,MAAM,CAAC;AAAA,MAChB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EACA,aAAa,MAAM;AACjB,IAAAA,aAAY,gBAAgB,MAAM,CAAC;AACnC,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,UAAM,IAAI,KAAK,KAAK,CAAC,CAAE;AACvB,QAAI,QAAQ;AACZ,QAAI,UAAU;AACd,eAAW,MAAM,GAAG;AAClB,YAAM,KAAK,GAAG,YAAY,CAAC;AAC3B,UAAI,KAAK,MAAQ,OAAO,KAAM;AAC5B,gBAAQ;AACR,mBAAW,MAAM,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,MACnD,WAAW,OAAO,KAAK;AACrB,mBAAW;AAAA,MACb,WAAW,OAAO,MAAM;AACtB,gBAAQ;AACR,mBAAW;AAAA,MACb,OAAO;AACL,mBAAW;AAAA,MACb;AAAA,IACF;AACA,WAAO,QAAQ,WAAW,OAAO,OAAO,IAAI,OAAO;AAAA,EACrD;AAAA,EACA,WAAW,MAAM;AACf,IAAAA,aAAY,cAAc,MAAM,CAAC;AACjC,UAAM,IAAI,WAAW,KAAK,CAAC,GAAG,YAAY;AAC1C,QAAI,MAAM,QAAQ,IAAI,KAAK,IAAI,GAAG;AAChC,YAAM,IAAI,YAAY,0EAA0E,QAAQ;AAAA,IAC1G;AACA,WAAO,KAAK,CAAC;AAAA,EACf;AAAA,EACA,OAAO,MAAM;AACX,IAAAA,aAAY,UAAU,MAAM,CAAC;AAC7B,WAAO,KAAK,CAAC;AAAA,EACf;AAAA,EACA,SAAS,MAAM;AACb,IAAAA,aAAY,YAAY,MAAM,CAAC;AAC/B,WAAO,KAAK,CAAC;AAAA,EACf;AAAA,EACA,UAAU;AACR,WAAO;AAAA,EACT;AAAA,EACA,KAAK,MAAM,SAAS;AAClB,IAAAA,aAAY,QAAQ,MAAM,CAAC;AAC3B,WAAO,WAAW,cAAc,OAAO,CAAC;AAAA,EAC1C;AAAA,EACA,SAAS,MAAM;AACb,IAAAA,aAAY,YAAY,MAAM,CAAC;AAC/B,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,QAAI,OAAO,KAAK,CAAC,MAAM,SAAU,QAAO,KAAK,CAAC,EAAE,YAAY;AAC5D,QAAI,KAAK,CAAC,aAAa,cAAc,KAAK,CAAC,EAAE,WAAW,GAAI,QAAO,WAAW,KAAK,CAAC,CAAC;AACrF,WAAO;AAAA,EACT;AAAA,EACA,UAAU,MAAM;AACd,IAAAA,aAAY,aAAa,MAAM,CAAC;AAChC,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7B,QAAI,KAAK,CAAC,aAAa,cAAc,KAAK,CAAC,EAAE,WAAW,GAAI,QAAO,KAAK,CAAC;AACzE,QAAI,OAAO,KAAK,CAAC,MAAM,UAAU;AAC/B,YAAM,MAAM,KAAK,CAAC,EAAE,QAAQ,MAAM,EAAE;AACpC,UAAI,CAAC,oBAAoB,KAAK,GAAG,EAAG,QAAO;AAC3C,YAAM,MAAM,IAAI,WAAW,EAAE;AAC7B,eAAS,IAAI,GAAG,IAAI,IAAI,IAAK,KAAI,CAAC,IAAI,OAAO,SAAS,IAAI,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE;AACrF,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAEA,WAAW;AACT,UAAM,IAAI,YAAY,4DAA4D,aAAa;AAAA,EACjG;AAAA,EACA,OAAO;AACL,UAAM,IAAI,YAAY,wDAAwD,aAAa;AAAA,EAC7F;AAAA,EACA,eAAe,MAAM;AACnB,IAAAA,aAAY,kBAAkB,MAAM,CAAC;AACrC,WAAO,SAAS,oBAAoB;AAAA,EACtC;AAAA,EACA,kBAAkB;AAChB,WAAO;AAAA,EACT;AAAA,EACA,YAAY,MAAM;AAChB,IAAAA,aAAY,eAAe,MAAM,GAAG,CAAC;AACrC,WAAO,KAAK,CAAC,KAAK;AAAA,EACpB;AAAA,EACA,eAAe,MAAM;AACnB,IAAAA,aAAY,kBAAkB,MAAM,CAAC;AACrC,WAAO,KAAK,CAAC;AAAA,EACf;AAAA,EACA,iBAAiB;AACf,UAAM,IAAI,YAAY,uBAAuB,OAAO;AAAA,EACtD;AACF;AAEA,SAAS,WAAW,OAA6B,MAA6B;AAC5E,MAAI,UAAU,OAAW,OAAM,IAAI,YAAY,yCAAyC,IAAI,MAAM,QAAQ;AAC1G,MAAI,UAAU,KAAM,QAAO;AAC3B,SAAO,eAAe,KAAK;AAC7B;AAEA,SAAS,cAAc,SAAsC;AAC3D,QAAM,MAAM,IAAI,WAAW,EAAE;AAC7B,MAAI,SAAS;AACb,SAAO,SAAS,IAAI;AAClB,UAAM,OAAO,QAAQ,YAAY,KAAK;AACtC,aAAS,QAAQ,GAAG,QAAQ,MAAM,SAAS,IAAI,SAAS,GAAG;AACzD,UAAI,QAAQ,IAAI,OAAQ,QAAQ,OAAO,KAAK,IAAK,KAAK;AAAA,IACxD;AAAA,EACF;AAEA,MAAI,CAAC,IAAK,IAAI,CAAC,IAAK,KAAQ;AAC5B,MAAI,CAAC,IAAK,IAAI,CAAC,IAAK,KAAQ;AAC5B,SAAO;AACT;AAEA,SAAS,WAAW,OAA2B;AAC7C,QAAM,MAAM,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAC1E,SAAO,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,MAAM,GAAG,EAAE,CAAC,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;AAC1G;AAEO,SAAS,qBAA+D;AAC7E,SAAO;AACT;;;AC7gBO,IAAM,mBAAN,MAAuB;AAAA,EACX,UAAU,oBAAI,IAA4B;AAAA,EAC1C,aAAa,oBAAI,IAA8B;AAAA,EAEhE,cAAc;AACZ,eAAW,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ,mBAAmB,CAAC,EAAG,MAAK,QAAQ,IAAI,MAAM,EAAE;AACxF,eAAW,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ,iBAAiB,EAAG,MAAK,QAAQ,IAAI,MAAM,EAAE;AACrF,eAAW,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ,mBAAmB,EAAG,MAAK,QAAQ,IAAI,MAAM,EAAE;AACvF,eAAW,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ,aAAa,EAAG,MAAK,QAAQ,IAAI,MAAM,EAAE;AACjF,eAAW,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ,eAAe,EAAG,MAAK,QAAQ,IAAI,MAAM,EAAE;AACnF,eAAW,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ,iBAAiB,EAAG,MAAK,QAAQ,IAAI,MAAM,EAAE;AACrF,eAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,kBAAkB,EAAG,MAAK,WAAW,IAAI,MAAM,OAAO;AACnG,eAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,sBAAsB,EAAG,MAAK,WAAW,IAAI,MAAM,OAAO;AAAA,EACzG;AAAA,EAEA,eAAe,MAAc,IAA0B;AACrD,SAAK,QAAQ,IAAI,KAAK,YAAY,GAAG,EAAE;AAAA,EACzC;AAAA,EAEA,kBAAkB,MAAc,SAAiC;AAC/D,SAAK,WAAW,IAAI,KAAK,YAAY,GAAG,OAAO;AAAA,EACjD;AAAA,EAEA,aAAa,MAA0C;AACrD,WAAO,KAAK,QAAQ,IAAI,KAAK,YAAY,CAAC;AAAA,EAC5C;AAAA,EAEA,gBAAgB,MAA4C;AAC1D,WAAO,KAAK,WAAW,IAAI,KAAK,YAAY,CAAC;AAAA,EAC/C;AAAA,EAEA,gBAAgB,MAAgD;AAC9D,WAAO,KAAK,gBAAgB,IAAI,IAAI;AAAA,EACtC;AAAA,EAEA,gBAAgB,MAAuB;AACrC,WAAO,KAAK,WAAW,IAAI,KAAK,YAAY,CAAC;AAAA,EAC/C;AACF;AAEO,IAAM,0BAA0B,IAAI,iBAAiB;;;ACjErD,SAAS,sBAAsB,OAAiB,MAAwB;AAC7E,QAAM,YAAY,iBAAiB,IAAI;AACvC,MAAI,OAAO,UAAU,YAAY,cAAc,SAAU,QAAO;AAChE,MAAI,cAAc,QAAS,QAAO,MAAM,QAAQ,QAAQ,EAAE;AAE1D,MAAI,aAAa;AACjB,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,KAAK,WAAW,CAAC;AAC9B,kBAAc,QAAQ,MAAQ,QAAQ,KAAO,OAAO,aAAa,OAAO,EAAI,IAAI;AAAA,EAClF;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,GAAa,GAAa,MAA6B;AAC1F,SAAO,WAAW,sBAAsB,GAAG,IAAI,GAAG,sBAAsB,GAAG,IAAI,CAAC;AAClF;AAEA,SAAS,iBAAiB,MAAgC;AACxD,QAAM,aAAa,KAAK,YAAY;AACpC,MAAI,eAAe,YAAY,eAAe,YAAY,eAAe,QAAS,QAAO;AACzF,QAAM,IAAI,YAAY,+BAA+B,IAAI,IAAI,OAAO;AACtE;;;ACNA,SAAS,YAAY,OAAyB;AAC5C,SAAO,eAAe,KAAK,KAAK;AAClC;AAEA,SAAS,SAAS,OAAuB;AACvC,SAAO,mBAAmB,KAAK;AACjC;AAEA,SAAS,aAAa,OAAyB;AAC7C,QAAM,UAAU,UAAU,KAAK;AAC/B,SAAO,OAAO,YAAY,WAAW,UAAU,OAAO,WAAW,CAAC;AACpE;AAEA,SAAS,UAAU,OAAyB;AAC1C,MAAI,iBAAiB,WAAY,QAAO,WAAW,KAAK;AACxD,MACE,OAAO,UAAU,YACjB,UAAU,QACV,WAAW,SACX,OAAQ,MAA6B,UAAU,UAC/C;AACA,WAAQ,MAA4B;AAAA,EACtC;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,aAAa,OAA0B;AAC9C,SAAO,QAAQ,IAAI;AACrB;AAEA,SAAS,cAAc,KAAkB,QAA+D;AACtG,MAAI,CAAC,IAAI,cAAe,OAAM,IAAI,YAAY,2DAA2D,QAAQ;AACjH,SAAO,IAAI,cAAc,MAAM;AACjC;AAEA,SAAS,cAAc,KAAkB,OAAsB,MAAwB;AACrF,MAAI;AACF,WAAO,IAAI,cAAc,OAAO,IAAI;AAAA,EACtC,SAAS,OAAO;AACd,QAAI,IAAI,UAAU,iBAAiB,eAAe,MAAM,aAAa,kBAAkB;AACrF,aAAO,cAAc,IAAI,QAAQ,OAAO,IAAI;AAAA,IAC9C;AACA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,OAAO,MAAgB,OAAiC;AAC/D,QAAM,YAAY,YAAY,IAAI;AAClC,MAAI,cAAc,MAAO,QAAO;AAChC,QAAM,aAAa,YAAY,MAAM,CAAC;AACtC,MAAI,eAAe,MAAO,QAAO;AACjC,MAAI,cAAc,QAAQ,eAAe,KAAM,QAAO;AACtD,SAAO;AACT;AAEA,SAAS,MAAM,MAAgB,OAAiC;AAC9D,QAAM,YAAY,YAAY,IAAI;AAClC,MAAI,cAAc,KAAM,QAAO;AAC/B,QAAM,aAAa,YAAY,MAAM,CAAC;AACtC,MAAI,eAAe,KAAM,QAAO;AAChC,MAAI,cAAc,QAAQ,eAAe,KAAM,QAAO;AACtD,SAAO;AACT;AAEA,SAAS,cAAc,IAAc,MAAgB,OAAiB,WAA8B;AAClG,MAAI,OAAO,QAAQ,OAAO,YAAY,OAAO,sBAAsB,OAAO,wBAAwB;AAChG,UAAM,QACJ,SAAS,QAAQ,UAAU,OACvB,SAAS,SACR,YAAY,qBAAqB,MAAM,OAAO,SAAS,IAAI,WAAW,MAAM,KAAK,OAAO;AAC/F,QAAI,OAAO,QAAQ,OAAO,uBAAwB,QAAO,aAAa,KAAK;AAC3E,WAAO,aAAa,CAAC,KAAK;AAAA,EAC5B;AACA,QAAM,aAAa,YAAY,qBAAqB,MAAM,OAAO,SAAS,IAAI,WAAW,MAAM,KAAK;AACpG,MAAI,eAAe,KAAM,QAAO;AAChC,UAAQ,IAAI;AAAA,IACV,KAAK;AAAA,IACL,KAAK;AACH,aAAO,aAAa,eAAe,CAAC;AAAA,IACtC,KAAK;AAAA,IACL,KAAK;AACH,aAAO,aAAa,eAAe,CAAC;AAAA,IACtC,KAAK;AACH,aAAO,aAAa,aAAa,CAAC;AAAA,IACpC,KAAK;AACH,aAAO,aAAa,cAAc,CAAC;AAAA,IACrC,KAAK;AACH,aAAO,aAAa,aAAa,CAAC;AAAA,IACpC,KAAK;AACH,aAAO,aAAa,cAAc,CAAC;AAAA,IACrC;AACE,YAAM,IAAI,YAAY,oCAAoC,EAAE,IAAI,aAAa;AAAA,EACjF;AACF;AAEA,SAAS,WAAW,IAAc,UAAgB,WAAiB,KAA4B;AAC7F,MAAI,OAAO,SAAS;AAClB,QAAI,SAAS,SAAS,UAAU;AAC9B,YAAM,IAAI,YAAY,yDAAyD,aAAa;AAAA,IAC9F;AACA,UAAM,QAAQ,UAAU,SAAS,WAAW,GAAG,CAAC;AAChD,QAAI,CAAC,IAAI,UAAU;AACjB,YAAM,IAAI,YAAY,yDAAyD,aAAa;AAAA,IAC9F;AACA,WAAO,aAAa,IAAI,SAAS,SAAS,OAAO,SAAS,MAAM,KAAK,CAAC;AAAA,EACxE;AAEA,MACE,SAAS,SAAS,SAClB,UAAU,SAAS,SACnB,CAAC,KAAK,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,MAAM,MAAM,UAAU,oBAAoB,sBAAsB,EAAE;AAAA,IACxG;AAAA,EACF,GACA;AACA,WAAO,iBAAiB,IAAI,SAAS,QAAQ,UAAU,QAAQ,GAAG;AAAA,EACpE;AAEA,QAAM,OAAO,SAAS,UAAU,GAAG;AACnC,MAAI,OAAO,MAAO,QAAO,OAAO,MAAM,MAAM,SAAS,WAAW,GAAG,CAAC;AACpE,MAAI,OAAO,KAAM,QAAO,MAAM,MAAM,MAAM,SAAS,WAAW,GAAG,CAAC;AAClE,QAAM,QAAQ,SAAS,WAAW,GAAG;AAErC,MAAI,OAAO,QAAQ,OAAO,OAAO;AAC/B,WAAO,UAAU,MAAM,OAAO,EAAE;AAAA,EAClC;AAEA,MACE,CAAC,KAAK,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,MAAM,MAAM,UAAU,oBAAoB,sBAAsB,EAAE;AAAA,IACxG;AAAA,EACF,GACA;AACA,WAAO,cAAc,IAAI,MAAM,OAAO,2BAA2B,UAAU,WAAW,GAAG,KAAK,MAAS;AAAA,EACzG;AACA,MAAI,OAAO,UAAU,OAAO,cAAc,OAAO,UAAU,OAAO,YAAY;AAC5E,QAAI,SAAS,QAAQ,UAAU,KAAM,QAAO;AAC5C,UAAM,UAAU,GAAG,SAAS,MAAM,IAC9B,UAAU,UAAU,IAAI,GAAG,UAAU,KAAK,CAAC,IAC3C,UAAU,UAAU,IAAI,GAAG,UAAU,KAAK,CAAC;AAC/C,WAAO,aAAa,GAAG,WAAW,KAAK,IAAI,CAAC,UAAU,OAAO;AAAA,EAC/D;AACA,MAAI,SAAS,QAAQ,UAAU,KAAM,QAAO;AAC5C,UAAQ,IAAI;AAAA,IACV,KAAK;AACH,aAAO,SAAS,YAAY,IAAI,IAAI,YAAY,KAAK,CAAC;AAAA,IACxD,KAAK;AACH,aAAO,SAAS,YAAY,IAAI,IAAI,YAAY,KAAK,CAAC;AAAA,IACxD,KAAK;AACH,aAAO,SAAS,YAAY,IAAI,IAAI,YAAY,KAAK,CAAC;AAAA,IACxD,KAAK,KAAK;AACR,YAAM,UAAU,YAAY,KAAK;AACjC,UAAI,YAAY,EAAG,QAAO;AAC1B,UAAI,eAAe,IAAI,MAAM,aAAa,eAAe,KAAK,MAAM,WAAW;AAC7E,cAAM,WAAW,aAAa,IAAI,IAAI,aAAa,KAAK;AACxD,eAAO,YAAY,OAAO,OAAO,gBAAgB,KAAK,YAAY,OAAO,OAAO,gBAAgB,IAC5F,OAAO,QAAQ,IACf;AAAA,MACN;AACA,aAAO,SAAS,YAAY,IAAI,IAAI,OAAO;AAAA,IAC7C;AAAA,IACA,KAAK,KAAK;AACR,YAAM,UAAU,aAAa,KAAK;AAClC,UAAI,YAAY,GAAI,QAAO;AAC3B,YAAM,YAAY,aAAa,IAAI,IAAI;AACvC,aAAO,aAAa,OAAO,OAAO,gBAAgB,KAAK,aAAa,OAAO,OAAO,gBAAgB,IAC9F,OAAO,SAAS,IAChB;AAAA,IACN;AAAA,IACA,KAAK;AACH,aAAO,UAAU,IAAI,IAAI,UAAU,KAAK;AAAA,IAC1C,KAAK;AACH,aAAO,kBAAkB,aAAa,IAAI,IAAI,aAAa,KAAK,CAAC;AAAA,IACnE,KAAK;AACH,aAAO,kBAAkB,aAAa,IAAI,IAAI,aAAa,KAAK,CAAC;AAAA,IACnE,KAAK;AACH,aAAO,kBAAkB,aAAa,IAAI,KAAK,aAAa,KAAK,CAAC;AAAA,IACpE,KAAK;AACH,aAAO,kBAAkB,aAAa,IAAI,KAAK,aAAa,KAAK,CAAC;AAAA,IACpE,KAAK;AAAA,IACL,KAAK;AACH,YAAM,IAAI,YAAY,GAAG,EAAE,mCAAmC,QAAQ;AAAA,IACxE;AACE,YAAM,IAAI,YAAY,gCAAgC,EAAE,IAAI,aAAa;AAAA,EAC7E;AACF;AAEA,SAAS,kBAAkB,OAAgC;AACzD,SAAO,SAAS,OAAO,OAAO,gBAAgB,KAAK,SAAS,OAAO,OAAO,gBAAgB,IAAI,OAAO,KAAK,IAAI;AAChH;AAEA,SAAS,iBAAiB,IAAc,WAAmB,YAAoB,KAA4B;AACzG,MAAI,UAAU,WAAW,WAAW,QAAQ;AAC1C,UAAM,IAAI,YAAY,qBAAqB,QAAQ;AAAA,EACrD;AACA,QAAM,aAAa,OAAO,QAAQ,OAAO,YAAY,OAAO,sBAAsB,OAAO;AACzF,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAM,OAAO,SAAS,UAAU,CAAC,GAAI,GAAG;AACxC,UAAM,QAAQ,SAAS,WAAW,CAAC,GAAI,GAAG;AAC1C,QAAI,YAAY;AACd,YAAM,QAAQ,SAAS,QAAQ,UAAU,OAAO,SAAS,QAAQ,WAAW,MAAM,KAAK,MAAM;AAC7F,UAAI,CAAC,OAAO;AACV,YAAI,OAAO,QAAQ,OAAO,uBAAwB,QAAO,aAAa,KAAK;AAC3E,eAAO,aAAa,IAAI;AAAA,MAC1B;AACA;AAAA,IACF;AACA,QAAI,SAAS,QAAQ,UAAU,MAAM;AACnC,gBAAU;AACV;AAAA,IACF;AACA,UAAM,MAAM,WAAW,MAAM,KAAK;AAClC,QAAI,QAAQ,MAAM;AAChB,gBAAU;AACV;AAAA,IACF;AACA,QAAI,QAAQ,GAAG;AACb,cAAQ,IAAI;AAAA,QACV,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,aAAa,KAAK;AAAA,QAC3B,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,aAAa,IAAI;AAAA,QAC1B,KAAK;AACH,iBAAO,aAAa,MAAM,CAAC;AAAA,QAC7B,KAAK;AACH,iBAAO,aAAa,MAAM,CAAC;AAAA,QAC7B,KAAK;AACH,iBAAO,aAAa,MAAM,CAAC;AAAA,QAC7B,KAAK;AACH,iBAAO,aAAa,MAAM,CAAC;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACA,MAAI,YAAY;AACd,QAAI,OAAO,QAAQ,OAAO,uBAAwB,QAAO,aAAa,IAAI;AAC1E,WAAO,aAAa,KAAK;AAAA,EAC3B;AACA,MAAI,QAAS,QAAO;AACpB,UAAQ,IAAI;AAAA,IACV,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,aAAa,IAAI;AAAA,IAC1B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,aAAa,KAAK;AAAA,IAC3B;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,eAAe,MAAkB,OAAmC;AAC3E,MAAI,KAAK,WAAW,MAAM,OAAQ,QAAO;AACzC,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,IAAI,KAAK,CAAC;AAChB,UAAM,IAAI,MAAM,CAAC;AACjB,QAAI,MAAM,QAAQ,MAAM,MAAM;AAC5B,gBAAU;AACV;AAAA,IACF;AACA,UAAM,MAAM,WAAW,GAAG,CAAC;AAC3B,QAAI,QAAQ,MAAM;AAChB,gBAAU;AACV;AAAA,IACF;AACA,QAAI,QAAQ,EAAG,QAAO;AAAA,EACxB;AACA,SAAO,UAAU,OAAO;AAC1B;AAEA,SAAS,kBAAkB,MAA2B;AACpD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AACH,aAAO,kBAAkB,KAAK,IAAI;AAAA,IACpC,KAAK;AACH,aAAO,kBAAkB,KAAK,IAAI,KAAK,kBAAkB,KAAK,KAAK;AAAA,IACrE,KAAK;AACH,aAAO,kBAAkB,KAAK,IAAI,KAAK,kBAAkB,KAAK,KAAK,KAAK,kBAAkB,KAAK,KAAK;AAAA,IACtG,KAAK;AACH,aACE,kBAAkB,KAAK,IAAI,MAC1B,MAAM,QAAQ,KAAK,MAAM,IAAK,KAAK,OAAO,IAAI,iBAAiB,EAAE,KAAK,CAAC,SAAS,SAAS,IAAI,KAAK,OAAQ;AAAA,IAE/G,KAAK;AACH,aAAO,kBAAkB,KAAK,IAAI,KAAK,kBAAkB,KAAK,OAAO;AAAA,IACvE,KAAK;AACH,cACG,KAAK,QAAQ,kBAAkB,KAAK,IAAI,MACzC,KAAK,MACF,QAAQ,CAAC,WAAW,CAAC,OAAO,MAAM,OAAO,IAAI,CAAC,EAC9C,IAAI,iBAAiB,EACrB,KAAK,CAAC,SAAS,SAAS,IAAI,MAC9B,KAAK,QAAQ,kBAAkB,KAAK,IAAI,MACzC;AAAA,IAEJ,KAAK;AACH,aAAO,KAAK,OAAO,IAAI,iBAAiB,EAAE,KAAK,CAAC,SAAS,SAAS,IAAI,KAAK;AAAA,IAC7E;AACE,aAAO;AAAA,EACX;AACF;AAGA,SAAS,2BAA2B,UAAgB,WAAiB,KAAiC;AACpG,QAAM,WAAW,kBAAkB,QAAQ,KAAK,kBAAkB,SAAS;AAC3E,MAAI,SAAU,QAAO;AACrB,SAAO,mBAAmB,UAAU,GAAG,KAAK,mBAAmB,WAAW,GAAG;AAC/E;AAEA,SAAS,mBAAmB,MAAY,KAAiC;AACvE,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,mBAAmB,KAAK,MAAM,GAAG;AAAA,IAC1C,KAAK;AACH,aACE,IAAI,mBAAmB,KAAK,OAAO,KAAK,IAAI,KAAK,IAAI,QAAQ,mBAAmB,KAAK,OAAO,KAAK,IAAI,KAAK;AAAA,IAE9G,KAAK;AAAA,IACL,KAAK;AACH,aAAO,mBAAmB,KAAK,MAAM,GAAG;AAAA,IAC1C;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,OAAO,MAAgB,QAAoB,KAAwB;AAC1E,MAAI,OAAO,WAAW,EAAG,QAAO,aAAa,GAAG;AAChD,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,UAAU;AACd,aAAW,SAAS,QAAQ;AAC1B,QAAI,UAAU,MAAM;AAClB,gBAAU;AAAA,IACZ,WAAW,WAAW,MAAM,KAAK,MAAM,GAAG;AACxC,aAAO,aAAa,CAAC,GAAG;AAAA,IAC1B;AAAA,EACF;AACA,MAAI,QAAS,QAAO;AACpB,SAAO,aAAa,GAAG;AACzB;AAQO,SAAS,SAAS,MAAY,KAA4B;AAC/D,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK,WAAW;AACd,UAAI,KAAK,aAAa,OAAO,KAAK,UAAU,UAAU;AACpD,eAAO,UAAU,KAAK,KAAK;AAAA,MAC7B;AACA,aAAO,KAAK;AAAA,IACd;AAAA,IACA,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,cAAc,KAAK,KAAK,OAAO,KAAK,IAAI;AAAA,IACjD,KAAK;AACH,aAAO,IAAI,aAAa,KAAK,IAAI;AAAA,IACnC,KAAK;AACH,aAAO,SAAS,KAAK,MAAM,GAAG;AAAA,IAChC,KAAK,SAAS;AACZ,YAAM,QAAQ,SAAS,KAAK,MAAM,GAAG;AACrC,UAAI,KAAK,OAAO,OAAO;AACrB,cAAM,QAAQ,YAAY,KAAK;AAC/B,eAAO,UAAU,OAAO,OAAO,aAAa,CAAC,KAAK;AAAA,MACpD;AACA,UAAI,UAAU,KAAM,QAAO;AAC3B,UAAI,KAAK,OAAO,IAAK,QAAO,SAAS,YAAY,KAAK,CAAC;AACvD,UAAI,KAAK,OAAO,IAAK,QAAO,SAAS,CAAC,YAAY,KAAK,CAAC;AACxD,aAAO,CAAC,aAAa,KAAK;AAAA,IAC5B;AAAA,IACA,KAAK;AACH,aAAO,WAAW,KAAK,IAAI,KAAK,MAAM,KAAK,OAAO,GAAG;AAAA,IACvD,KAAK,WAAW;AACd,YAAM,QAAQ,SAAS,KAAK,MAAM,GAAG;AACrC,YAAM,YACJ,2BAA2B,KAAK,MAAM,KAAK,OAAO,GAAG,KACrD,2BAA2B,KAAK,MAAM,KAAK,OAAO,GAAG,KACrD;AACF,YAAM,QAAQ,cAAc,MAAM,OAAO,SAAS,KAAK,OAAO,GAAG,GAAG,SAAS;AAC7E,YAAM,SAAS,OAAO,OAAO,MAAM,cAAc,MAAM,OAAO,SAAS,KAAK,OAAO,GAAG,GAAG,SAAS,CAAC;AACnG,UAAI,WAAW,KAAM,QAAO;AAC5B,aAAO,KAAK,MAAM,aAAa,WAAW,CAAC,IAAI;AAAA,IACjD;AAAA,IACA,KAAK,MAAM;AACT,UAAI,KAAK,KAAK,SAAS,SAAS,MAAM,QAAQ,KAAK,MAAM,GAAG;AAC1D,cAAMG,QAAO,KAAK,KAAK,OAAO,IAAI,CAAC,UAAU,SAAS,OAAO,GAAG,CAAC;AACjE,YAAI,UAAU;AACd,YAAI,QAAQ;AACZ,mBAAW,aAAa,KAAK,QAAQ;AACnC,cAAI,UAAU,SAAS,OAAO;AAC5B,kBAAM,IAAI,YAAY,qBAAqB,QAAQ;AAAA,UACrD;AACA,gBAAM,QAAQ,UAAU,OAAO,IAAI,CAAC,UAAU,SAAS,OAAO,GAAG,CAAC;AAClE,gBAAM,KAAK,eAAeA,OAAM,KAAK;AACrC,cAAI,OAAO,MAAM;AACf,oBAAQ;AACR;AAAA,UACF;AACA,cAAI,OAAO,KAAM,WAAU;AAAA,QAC7B;AACA,YAAI,MAAO,QAAO,aAAa,CAAC,KAAK,GAAG;AACxC,YAAI,QAAS,QAAO;AACpB,eAAO,aAAa,KAAK,GAAG;AAAA,MAC9B;AACA,YAAM,OAAO,SAAS,KAAK,MAAM,GAAG;AACpC,YAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,IACpC,KAAK,OAAO,IAAI,CAAC,UAAU,SAAS,OAAO,GAAG,CAAC,IAC/C,cAAc,KAAK,KAAK,MAAM,EAAE,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,IAAI;AACpE,aAAO,OAAO,MAAM,QAAQ,KAAK,GAAG;AAAA,IACtC;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,QAAQ,SAAS,KAAK,MAAM,GAAG;AACrC,YAAM,UAAU,SAAS,KAAK,SAAS,GAAG;AAC1C,YAAM,SAAS,KAAK,WAAW,OAAO,OAAO,SAAS,KAAK,QAAQ,GAAG;AACtE,UAAI,UAAU,QAAQ,YAAY,QAAS,WAAW,QAAQ,KAAK,WAAW,KAAO,QAAO;AAC5F,YAAM,QACJ,KAAK,OAAO,SACR,UAAU,UAAU,KAAK,GAAG,UAAU,OAAO,GAAG,WAAW,OAAO,OAAO,UAAU,MAAM,CAAC,IAC1F,UAAU,UAAU,KAAK,GAAG,UAAU,OAAO,CAAC;AACpD,aAAO,aAAa,KAAK,MAAM,CAAC,QAAQ,KAAK;AAAA,IAC/C;AAAA,IACA,KAAK,QAAQ;AACX,UAAI,KAAK,SAAS,MAAM;AACtB,mBAAW,UAAU,KAAK,OAAO;AAC/B,cAAI,YAAY,SAAS,OAAO,MAAM,GAAG,CAAC,MAAM,KAAM,QAAO,SAAS,OAAO,MAAM,GAAG;AAAA,QACxF;AAAA,MACF,OAAO;AACL,cAAM,OAAO,SAAS,KAAK,MAAM,GAAG;AACpC,mBAAW,UAAU,KAAK,OAAO;AAC/B,cAAI,WAAW,MAAM,SAAS,OAAO,MAAM,GAAG,CAAC,MAAM,EAAG,QAAO,SAAS,OAAO,MAAM,GAAG;AAAA,QAC1F;AAAA,MACF;AACA,aAAO,KAAK,SAAS,OAAO,OAAO,SAAS,KAAK,MAAM,GAAG;AAAA,IAC5D;AAAA,IACA,KAAK;AACH,aAAO,aAAa,SAAS,KAAK,MAAM,GAAG,GAAG,KAAK,QAAQ;AAAA,IAC7D,KAAK,YAAY;AACf,UAAI,KAAK,SAAS,IAAK,OAAM,IAAI,YAAY,yCAAyC,KAAK,IAAI,MAAM,QAAQ;AAC7G,UAAI,KAAK,KAAK,YAAY,MAAM,SAAS;AACvC,0BAAkB,KAAK,MAAM,GAAG;AAChC,cAAM,IAAI,YAAY,mCAAmC,QAAQ;AAAA,MACnE;AACA,UACE,KAAK,KAAK,YAAY,MAAM,YAC5B,KAAK,KAAK,WAAW,KACrB,KAAK,KAAK,CAAC,GAAG,SAAS,YACvB,IAAI,qBACJ;AACA,eAAO,IAAI,oBAAoB,KAAK,KAAK,CAAC,EAAE,OAAO,KAAK,KAAK,CAAC,EAAE,IAAI;AAAA,MACtE;AACA,YAAM,MAAM,IAAI,aAAa,yBAAyB,aAAa,KAAK,IAAI;AAC5E,UAAI,CAAC,GAAI,OAAM,IAAI,YAAY,qBAAqB,KAAK,IAAI,IAAI,OAAO;AACxE,aAAO;AAAA,QACL,KAAK,KAAK,IAAI,CAAC,QAAQ,SAAS,KAAK,GAAG,CAAC;AAAA,QACzC,IAAI,mBAAmB,CAAC;AAAA,MAC1B;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,YAAM,SAAS,cAAc,KAAK,KAAK,MAAM,EAAE,KAAK,SAAS;AAC7D,aAAO,aAAa,KAAK,MAAM,CAAC,SAAS,MAAM;AAAA,IACjD;AAAA,IACA,KAAK,YAAY;AACf,YAAM,SAAS,cAAc,KAAK,KAAK,MAAM;AAC7C,UAAI,OAAO,QAAQ,SAAS,EAAG,OAAM,IAAI,YAAY,yCAAyC,OAAO;AACrG,aAAO,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK;AAAA,IAChC;AAAA,IACA,KAAK;AACH,YAAM,IAAI,YAAY,sDAAsD,QAAQ;AAAA,IACtF,KAAK;AACH,YAAM,IAAI,YAAY,gDAAgD,QAAQ;AAAA,IAChF,KAAK;AACH,YAAM,IAAI,YAAY,8CAA8C,QAAQ;AAAA,EAChF;AACF;AAEA,SAAS,kBAAkB,MAAc,KAAyB;AAChE,MAAI,CAAC,IAAI,MAAO,OAAM,IAAI,YAAY,qDAAqD,OAAO;AAClG,MAAI,KAAK,SAAS,KAAK,KAAK,SAAS,GAAG;AACtC,UAAM,IAAI,YAAY,iDAAiD,QAAQ;AAAA,EACjF;AACA,QAAM,SAAS,gBAAgB,KAAK,CAAC,CAAE;AACvC,MAAI,CAAC,OAAQ,OAAM,IAAI,YAAY,2BAA2B,OAAO;AACrE,MAAI;AACJ,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,QAAQ,SAAS,KAAK,CAAC,GAAI,GAAG;AACpC,cAAU,UAAU,OAAO,SAAY,OAAO,KAAK;AAAA,EACrD;AACA,MAAI,MAAM,QAAQ,OAAO;AACzB,QAAM,IAAI,YAAY,WAAW,SAAS,OAAO;AACnD;AAEA,SAAS,gBAAgB,MAA6D;AACpF,MAAI,KAAK,SAAS,YAAY,KAAK,UAAU,MAAM;AACjD,UAAM,OAAO,KAAK,KAAK,YAAY;AACnC,QAAI,SAAS,YAAY,SAAS,WAAW,SAAS,UAAU,SAAS,WAAY,QAAO;AAAA,EAC9F;AACA,MAAI,KAAK,SAAS,aAAa,OAAO,KAAK,UAAU,UAAU;AAC7D,UAAM,OAAO,KAAK,MAAM,YAAY;AACpC,QAAI,SAAS,YAAY,SAAS,WAAW,SAAS,UAAU,SAAS,WAAY,QAAO;AAAA,EAC9F;AACA,SAAO;AACT;;;AChhBO,IAAM,aAAN,MAAM,YAAW;AAAA,EACb;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACR,SAAS;AAAA,EAET,YACE,OAAO,SACP,SACA,WACA;AACA,SAAK,OAAO;AACZ,SAAK,UAAU,oBAAI,IAAI;AACvB,SAAK,YAAY,oBAAI,IAAI;AACzB,SAAK,aAAa;AAClB,QAAI,SAAS;AACX,iBAAW,CAAC,KAAK,MAAM,KAAK,QAAS,MAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC;AAAA,IACxE;AACA,QAAI,WAAW;AACb,iBAAW,CAAC,KAAK,MAAM,KAAK,UAAW,MAAK,UAAU,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC;AAAA,IAC5E;AAAA,EACF;AAAA,EAEA,YAAY,QAA6B,OAAqB;AAC5D,UAAM,MAAM,kBAAkB,MAAM;AACpC,QAAI,QAAQ,KAAM;AAClB,UAAM,WAAW,KAAK,QAAQ,IAAI,GAAG;AACrC,QAAI,CAAC,SAAU;AACf,eAAW,MAAM,UAAU;AACzB,UAAI,UAAU,UAAa,CAAC,UAAU,IAAI,KAAK,GAAG;AAChD,cAAM,IAAI;AAAA,UACR,6BAA6B,KAAK,IAAI;AAAA,UACtC;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,QAA6B,OAAc,SAAS,MAAY;AACrE,SAAK,cAAc;AACnB,UAAM,MAAM,kBAAkB,MAAM;AACpC,QAAI,QAAQ,KAAM;AAClB,QAAI,OAAQ,MAAK,YAAY,QAAQ,KAAK;AAC1C,UAAM,WAAW,KAAK,QAAQ,IAAI,GAAG;AACrC,QAAI,CAAC,UAAU;AACb,WAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC;AAC7B,WAAK,UAAU,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC;AACnC,WAAK,aAAa;AAClB;AAAA,IACF;AACA,eAAW,MAAM,SAAU,KAAI,UAAU,IAAI,KAAK,EAAG;AACrD,aAAS,KAAK,KAAK;AAAA,EACrB;AAAA,EAEA,OAAO,QAA+C;AACpD,UAAM,MAAM,kBAAkB,MAAM;AACpC,QAAI,QAAQ,KAAM,QAAO,CAAC;AAC1B,WAAO,KAAK,QAAQ,IAAI,GAAG,KAAK,CAAC;AAAA,EACnC;AAAA;AAAA,EAGA,aAAa,QAA+C;AAC1D,QAAI,OAAO,WAAW,EAAG,QAAO,CAAC;AACjC,UAAM,SAAS,kBAAkB,MAAM;AACvC,QAAI,WAAW,KAAM,QAAO,CAAC;AAC7B,UAAM,QAAQ,KAAK,QAAQ,IAAI,MAAM;AACrC,UAAM,SAAS,GAAG,MAAM;AACxB,UAAM,SAAkB,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC;AAC9C,eAAW,CAAC,KAAK,GAAG,KAAK,KAAK,SAAS;AACrC,UAAI,IAAI,WAAW,MAAM,EAAG,QAAO,KAAK,GAAG,GAAG;AAAA,IAChD;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,IAAyC,OAAiB,QAAqC;AACzG,UAAM,SAAkB,CAAC;AACzB,UAAM,OAAO,KAAK,YAAY;AAC9B,eAAW,OAAO,MAAM;AACtB,YAAM,SAAS,KAAK,UAAU,IAAI,GAAG;AACrC,UAAI,CAAC,UAAU,OAAO,CAAC,MAAM,OAAW;AACxC,YAAM,MAAM,uBAAuB,OAAO,CAAC,GAAI,KAAK;AACpD,UAAI,KAAK;AACT,UAAI,OAAO,IAAK,MAAK,MAAM;AAAA,eAClB,OAAO,KAAM,MAAK,OAAO;AAAA,eACzB,OAAO,IAAK,MAAK,MAAM;AAAA,eACvB,OAAO,KAAM,MAAK,OAAO;AAAA,eACzB,OAAO,aAAa,WAAW,QAAW;AACjD,aAAK,OAAO,KAAK,uBAAuB,OAAO,CAAC,GAAI,MAAM,KAAK;AAAA,MACjE;AACA,UAAI,IAAI;AACN,cAAM,MAAM,KAAK,QAAQ,IAAI,GAAG;AAChC,YAAI,IAAK,QAAO,KAAK,GAAG,GAAG;AAAA,MAC7B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,OAAO,OAAyB;AAC5C,UAAM,OAAO,KAAK,YAAY;AAC9B,UAAM,SAAkB,CAAC;AACzB,UAAM,MAAM,OAAO,CAAC,GAAG,IAAI,EAAE,QAAQ,IAAI;AACzC,eAAW,OAAO,KAAK;AACrB,YAAM,MAAM,KAAK,QAAQ,IAAI,GAAG;AAChC,UAAI,IAAK,QAAO,KAAK,GAAG,GAAG;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAA6B,OAAwB;AAC1D,SAAK,cAAc;AACnB,UAAM,MAAM,kBAAkB,MAAM;AACpC,QAAI,QAAQ,KAAM,QAAO;AACzB,UAAM,WAAW,KAAK,QAAQ,IAAI,GAAG;AACrC,QAAI,CAAC,SAAU,QAAO;AACtB,QAAI,UAAU,QAAW;AACvB,WAAK,QAAQ,OAAO,GAAG;AACvB,WAAK,UAAU,OAAO,GAAG;AACzB,WAAK,aAAa;AAClB,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,SAAS,UAAU,CAAC,OAAO,UAAU,IAAI,KAAK,CAAC;AAC7D,QAAI,QAAQ,EAAG,QAAO;AACtB,aAAS,OAAO,OAAO,CAAC;AACxB,QAAI,SAAS,WAAW,GAAG;AACzB,WAAK,QAAQ,OAAO,GAAG;AACvB,WAAK,UAAU,OAAO,GAAG;AACzB,WAAK,aAAa;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAc;AACZ,SAAK,cAAc;AACnB,SAAK,QAAQ,MAAM;AACnB,SAAK,UAAU,MAAM;AACrB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,QAAoB;AAClB,WAAO,IAAI,YAAW,KAAK,MAAM,KAAK,SAAS,KAAK,SAAS;AAAA,EAC/D;AAAA,EAEA,SAAe;AACb,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEQ,cAAwB;AAC9B,QAAI,KAAK,WAAY,QAAO,KAAK;AACjC,UAAM,OAAO,CAAC,GAAG,KAAK,QAAQ,KAAK,CAAC;AACpC,SAAK,KAAK,CAAC,GAAG,MAAM;AAClB,YAAM,OAAO,KAAK,UAAU,IAAI,CAAC;AACjC,YAAM,QAAQ,KAAK,UAAU,IAAI,CAAC;AAClC,UAAI,CAAC,QAAQ,CAAC,MAAO,QAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AACrD,YAAM,IAAI,KAAK,IAAI,KAAK,QAAQ,MAAM,MAAM;AAC5C,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,MAAM,WAAW,KAAK,CAAC,KAAK,MAAM,MAAM,CAAC,KAAK,IAAI;AACxD,YAAI,QAAQ,EAAG,QAAO,OAAO;AAAA,MAC/B;AACA,aAAO,KAAK,SAAS,MAAM;AAAA,IAC7B,CAAC;AACD,SAAK,aAAa;AAClB,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAsB;AAC5B,QAAI,KAAK,OAAQ,OAAM,IAAI,YAAY,0CAA0C,OAAO;AAAA,EAC1F;AACF;AAEO,SAAS,kBAAkB,QAA4C;AAC5E,MAAI,OAAO,KAAK,CAAC,UAAU,UAAU,IAAI,EAAG,QAAO;AACnD,SAAQ,OACL,IAAI,cAAc,EAClB,IAAI,CAAC,SAAS,GAAG,KAAK,MAAM,IAAI,IAAI,EAAE,EACtC,KAAK,GAAG;AACb;AAEA,SAAS,eAAe,OAAwC;AAC9D,MAAI,UAAU,KAAK,GAAG;AACpB,UAAM,IAAI,MAAM;AAChB,QAAI,OAAO,MAAM,CAAC,EAAG,QAAO;AAC5B,QAAI,MAAM,SAAU,QAAO;AAC3B,QAAI,MAAM,UAAW,QAAO;AAC5B,WAAO,KAAK,OAAO,GAAG,GAAG,EAAE,IAAI,MAAM,EAAE,SAAS,CAAC;AAAA,EACnD;AACA,MAAI,cAAc,KAAK,EAAG,QAAO,KAAK,MAAM,KAAK;AACjD,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,MAAM,SAAS,CAAC;AAC3D,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,OAAO,UAAU,KAAK,EAAG,QAAO,KAAK,OAAO,KAAK,EAAE,SAAS,CAAC;AACjE,QAAI,OAAO,MAAM,KAAK,EAAG,QAAO;AAChC,QAAI,UAAU,SAAU,QAAO;AAC/B,QAAI,UAAU,UAAW,QAAO;AAChC,WAAO,KAAK,OAAO,GAAG,OAAO,EAAE,IAAI,MAAM,MAAM,SAAS,CAAC;AAAA,EAC3D;AACA,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,KAAK;AAChD,MAAI,MAAM;AACV,aAAW,QAAQ,MAAO,QAAO,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAClE,SAAO,KAAK,GAAG;AACjB;AAEA,SAAS,uBAAuB,MAAgB,OAAyB;AACvE,SAAO,WAAW,MAAM,KAAK,KAAK;AACpC;AAEA,SAAS,UAAU,MAAa,OAAuB;AACrD,SAAO,OAAO,SAAS,YAAY,OAAO,UAAU,WAAW,OAAO,IAAI,MAAM,OAAO,KAAK,IAAI,SAAS;AAC3G;;;ACzNA,IAAM,eAAe,oBAAI,IAAI,CAAC,OAAO,WAAW,QAAQ,QAAQ,QAAQ,KAAK,CAAC;AAEvE,SAAS,iBAAiB,UAA8C;AAC7E,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO,aAAa,IAAI,SAAS,KAAK,EAAE,YAAY,CAAC;AACvD;AAEO,SAAS,iBAAiB,OAAiB,UAAkB,OAAe,QAA0B;AAC3G,MAAI,UAAU,KAAM,QAAO;AAC3B,QAAM,WAAW,SAAS,KAAK,EAAE,YAAY;AAC7C,QAAM,UAAU,eAAe,KAAK;AACpC,MAAI,aAAa,MAAO,QAAO;AAE/B,MAAI,aAAa,QAAQ;AACvB,QAAI,YAAY,OAAQ,QAAO,OAAO,UAAU,WAAW,QAAQ,OAAQ,MAA4B,KAAK;AAC5G,QAAI,YAAY,aAAa,YAAY,OAAQ,QAAO,OAAO,UAAU,KAAK,IAAI,MAAM,QAAQ,KAAK;AACrG,UAAM,YAAY,SAAS,UAAU,OAAO,MAAM;AAAA,EACpD;AAEA,MAAI,aAAa,SAAS,aAAa,WAAW;AAChD,QAAI,YAAY,UAAW,QAAO;AAClC,QAAI,YAAY,QAAQ;AACtB,YAAM,IAAI,UAAU,KAAK,IAAI,MAAM,QAAQ,OAAO,KAAK;AACvD,UAAI,OAAO,UAAU,CAAC,EAAG,QAAO;AAChC,YAAM,YAAY,SAAS,UAAU,OAAO,MAAM;AAAA,IACpD;AACA,QAAI,YAAY,QAAQ;AACtB,YAAM,IAAI,eAAe,KAAK;AAC9B,UAAI,MAAM,QAAQ,OAAO,UAAU,CAAC,KAAK,OAAO,KAAK,EAAE,KAAK,MAAM,OAAO,CAAC,EAAG,QAAO;AACpF,YAAM,YAAY,SAAS,UAAU,OAAO,MAAM;AAAA,IACpD;AACA,UAAM,YAAY,SAAS,UAAU,OAAO,MAAM;AAAA,EACpD;AAEA,MAAI,aAAa,QAAQ;AACvB,QAAI,YAAY,OAAQ,QAAO,UAAU,KAAK,IAAI,QAAQ,UAAU,OAAO,KAAK,CAAC;AACjF,QAAI,YAAY,UAAW,QAAO,UAAU,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI,OAAO,KAAK,CAAC;AACrG,QAAI,YAAY,QAAQ;AACtB,YAAM,IAAI,eAAe,KAAK;AAC9B,UAAI,MAAM,KAAM,QAAO,UAAU,CAAC;AAAA,IACpC;AACA,UAAM,YAAY,SAAS,UAAU,OAAO,MAAM;AAAA,EACpD;AAEA,MAAI,aAAa,QAAQ;AACvB,QAAI,YAAY,OAAQ,QAAO;AAC/B,UAAM,YAAY,SAAS,UAAU,OAAO,MAAM;AAAA,EACpD;AAEA,QAAM,IAAI,YAAY,wBAAwB,KAAK,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAO;AACzF;AAEA,SAAS,YAAY,SAAiB,UAAkB,OAAe,QAAuB;AAC5F,QAAM,QAAQ,YAAY,YAAY,QAAQ,QAAQ,YAAY;AAClE,QAAM,IAAI;AAAA,IACR,gBAAgB,KAAK,aAAa,QAAQ,WAAW,KAAK,IAAI,MAAM;AAAA,IACpE;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,OAAe,QAAgB,UAAyB;AACxF,QAAM,IAAI,YAAY,wBAAwB,KAAK,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAO;AACzF;;;AC1BA,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;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;AAEM,SAAS,mBAAmB,YAAsB,MAAgC;AACvF,QAAM,UAA0B,CAAC;AACjC,QAAM,aAAa,oBAAI,IAAY;AACnC,MAAI,UAAsC;AAC1C,MAAI,eAA8B;AAClC,MAAI,eAAe;AACnB,MAAI,oBAAoB;AACxB,MAAI,SAAmB,CAAC;AACxB,MAAI,aAAa;AACjB,MAAI,SAAoB;AACxB,MAAI,YAAY;AAChB,MAAI,SAAS;AACb,MAAI,aAA4B;AAChC,MAAI,YAAgC,EAAE,MAAM,aAAa,kBAAkB,EAAE;AAE7E,aAAW,OAAO,YAAY;AAC5B,UAAM,MAAM,IAAI,KAAK;AACrB,QAAI,CAAC,IAAK;AAEV,UAAM,KAAK,YAAY,GAAG;AAC1B,QAAI,IAAI;AACN,YAAM,MAAM,GAAG,IAAI,YAAY;AAC/B,YAAM,QAAQ,GAAG;AACjB,UAAI,CAAC,aAAa,IAAI,GAAG,KAAK,SAAS,QAAQ;AAE7C,YAAI,sBAAsB,KAAK,GAAG,GAAG,KAAK,UAAU,MAAM;AAAA,QAE1D;AAAA,MACF;AACA,cAAQ,KAAK;AAAA,QACX,KAAK;AACH,sBAAY,eAAe,KAAK;AAChC;AAAA,QACF,KAAK;AACH,mBAAS,MACN,KAAK,EACL,MAAM,KAAK,EACX,OAAO,OAAO,EACd,IAAI,CAAC,SAAS;AACb,kBAAM,IAAI,OAAO,IAAI;AACrB,gBAAI,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,EAAG,OAAM,IAAI,YAAY,mBAAmB,OAAO;AACpF,mBAAO;AAAA,UACT,CAAC;AACH;AAAA,QACF,KAAK;AACH,cAAI,UAAU,IAAI;AAChB,sBAAU;AACV,2BAAe;AAAA,UACjB,OAAO;AACL,sBAAU;AACV,2BAAe;AAAA,UACjB;AACA;AAAA,QACF,KAAK;AACH,yBAAe;AACf;AAAA,QACF,KAAK;AACH,8BAAoB,UAAU,OAAO,MAAM,YAAY,MAAM;AAC7D;AAAA,QACF,KAAK;AACH,uBAAa,UAAU;AACvB;AAAA,QACF,KAAK,UAAU;AACb,gBAAM,IAAI,MAAM,YAAY;AAC5B,cAAI,MAAM,UAAU,MAAM,YAAY,MAAM,OAAQ,OAAM,IAAI,YAAY,mBAAmB,OAAO;AACpG,mBAAS;AACT;AAAA,QACF;AAAA,QACA,KAAK;AACH,sBAAY,UAAU,OAAO,MAAM,YAAY,MAAM;AACrD;AAAA,QACF,KAAK;AACH,mBAAS,UAAU,OAAO,MAAM,YAAY,MAAM;AAClD;AAAA,QACF,KAAK;AACH,uBAAa;AACb;AAAA,QACF;AAEE,cAAI,SAAS,OAAQ,OAAM,IAAI,YAAY,2BAA2B,GAAG,GAAG,IAAI,OAAO;AACvF,kBAAQ,KAAK,EAAE,MAAM,GAAG,KAAK,WAAW,MAAM,CAAC;AAC/C;AAAA,MACJ;AACA;AAAA,IACF;AAGA,UAAM,QAAQ,IAAI,MAAM,KAAK,EAAE,OAAO,OAAO;AAC7C,QAAI,MAAM,WAAW,EAAG;AACxB,UAAM,OAAO,aAAa,MAAM,CAAC,CAAE;AACnC,UAAM,OAAO,MAAM,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AACtD,QAAI,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,YAAY,GAAG;AAC7D,cAAQ,KAAK,EAAE,MAAM,WAAW,KAAK,CAAC;AACtC,iBAAW,IAAI,KAAK,YAAY,CAAC;AAAA,IACnC,WAAW,KAAK,WAAW,GAAG;AAC5B,UAAI,aAAa,IAAI,KAAK,YAAY,CAAC,KAAK,SAAS,QAAQ;AAE3D,gBAAQ,KAAK,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,MACzC,OAAO;AACL,gBAAQ,KAAK,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,MACzC;AAAA,IACF,WAAW,SAAS,UAAU,SAAS,QAAQ;AAE7C,cAAQ,KAAK,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IACzC,OAAO;AACL,YAAM,IAAI,YAAY,mBAAmB,OAAO;AAAA,IAClD;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,EAAG,OAAM,IAAI,YAAY,oCAAoC,OAAO;AAE3F,QAAM,QAAQ,oBAAI,IAAY;AAC9B,aAAW,UAAU,SAAS;AAC5B,UAAM,MAAM,OAAO,KAAK,YAAY;AACpC,QAAI,MAAM,IAAI,GAAG,EAAG,OAAM,IAAI,YAAY,mBAAmB,OAAO;AACpE,UAAM,IAAI,GAAG;AAAA,EACf;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,YAAY,KAAoD;AACvE,QAAM,QAAQ,iCAAiC,KAAK,GAAG;AACvD,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,EAAE,KAAK,MAAM,CAAC,GAAI,OAAO,aAAa,MAAM,CAAC,EAAG,KAAK,CAAC,EAAE;AACjE;AAEA,SAAS,aAAa,OAAuB;AAC3C,MACG,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAC5C;AACA,UAAM,IAAI,MAAM,CAAC;AACjB,WAAO,MACJ,MAAM,GAAG,EAAE,EACX,WAAW,IAAI,GAAG,CAAC,EACnB,WAAW,OAAO,GAAG,EACrB,WAAW,OAAO,GAAG;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAuB;AAC3C,MACG,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAC5C;AACA,WAAO,MAAM,MAAM,GAAG,EAAE;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,eAAe,MAAkC;AACxD,QAAM,SAAS,aAAa,IAAI;AAChC,MAAI,OAAO,WAAW,EAAG,OAAM,IAAI,YAAY,uBAAuB,OAAO;AAC7E,QAAM,OAAO,OAAO,CAAC,EAAG,YAAY;AACpC,MAAI,SAAS,UAAU;AACrB,UAAM,OAAO,OAAO,CAAC,GAAG,YAAY,KAAK;AACzC,UAAM,OAAO,iBAAiB,OAAO,MAAM,SAAS,eAAe,SAAS,UAAU,IAAI,CAAC,CAAC;AAC5F,WAAO,EAAE,MAAM,UAAU,MAAM,SAAS,UAAU,UAAU,aAAa,GAAG,KAAK;AAAA,EACnF;AACA,MAAI,SAAS,WAAW;AACtB,QAAI,gBAAgB;AACpB,QAAI,0BAA0B;AAC9B,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAM,IAAI,OAAO,CAAC,EAAG,YAAY;AACjC,UAAI,MAAM,oBAAoB,OAAO,IAAI,CAAC,MAAM,KAAK;AACnD,wBAAgB;AAChB;AAAA,MACF,WAAW,MAAM,uBAAuB,OAAO,IAAI,CAAC,MAAM,KAAK;AAC7D,kCAA0B;AAC1B;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,MAAM,WAAW,eAAe,wBAAwB;AAAA,EACnE;AACA,MAAI,SAAS,SAAS;AACpB,WAAO,EAAE,MAAM,SAAS,GAAG,iBAAiB,OAAO,MAAM,CAAC,CAAC,EAAE;AAAA,EAC/D;AACA,MAAI,SAAS,aAAa;AACxB,WAAO,EAAE,MAAM,aAAa,kBAAkB,GAAG,GAAG,iBAAiB,OAAO,MAAM,CAAC,CAAC,EAAE;AAAA,EACxF;AACA,QAAM,IAAI,YAAY,sBAAsB,IAAI,IAAI,OAAO;AAC7D;AAEA,SAAS,iBAAiB,QAA+C;AACvE,QAAM,MAAmC,CAAC;AAC1C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,IAAI,OAAO,CAAC,EAAG,YAAY;AACjC,QAAI,MAAM,qBAAqB;AAC7B,YAAM,IAAI,OAAO,OAAO,EAAE,CAAC,KAAK,GAAG;AACnC,UAAI,MAAM,KAAK,MAAM,KAAK,MAAM,EAAG,OAAM,IAAI,YAAY,mBAAmB,OAAO;AACnF,UAAI,mBAAmB;AAAA,IACzB,WAAW,MAAM,cAAc;AAC7B,UAAI,aAAa,OAAO,EAAE,CAAC,KAAK;AAAA,IAClC,WAAW,MAAM,cAAc;AAC7B,UAAI,aAAa,OAAO,EAAE,CAAC,KAAK;AAAA,IAClC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,MAAwB;AAC5C,QAAM,MAAgB,CAAC;AACvB,MAAI,IAAI;AACR,SAAO,IAAI,KAAK,QAAQ;AACtB,WAAO,IAAI,KAAK,UAAU,KAAK,KAAK,KAAK,CAAC,CAAE,EAAG;AAC/C,QAAI,KAAK,KAAK,OAAQ;AACtB,QAAI,KAAK,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,KAAK;AACtC,YAAM,IAAI,KAAK,CAAC;AAChB;AACA,UAAIC,KAAI;AACR,aAAO,IAAI,KAAK,UAAU,KAAK,CAAC,MAAM,GAAG;AACvC,QAAAA,MAAK,KAAK,GAAG;AAAA,MACf;AACA,UAAI,KAAK,CAAC,MAAM,EAAG;AACnB,UAAI,KAAKA,EAAC;AACV;AAAA,IACF;AACA,QAAI,IAAI;AACR,WAAO,IAAI,KAAK,UAAU,CAAC,KAAK,KAAK,KAAK,CAAC,CAAE,EAAG,MAAK,KAAK,GAAG;AAC7D,QAAI,KAAK,CAAC;AAAA,EACZ;AACA,SAAO;AACT;;;ACtQO,SAAS,eAAe,OAA6B;AAC1D,QAAM,SAAS,QAAQ,KAAK;AAC5B,MAAI,IAAI;AAER,WAAS,OAAY;AACnB,WAAO,OAAO,CAAC,KAAK,EAAE,MAAM,MAAM;AAAA,EACpC;AACA,WAAS,OAAY;AACnB,WAAO,OAAO,GAAG,KAAK,EAAE,MAAM,MAAM;AAAA,EACtC;AACA,WAAS,OAAO,MAAwB;AACtC,UAAM,IAAI,KAAK;AACf,QAAI,EAAE,SAAS,KAAM,OAAM,IAAI,YAAY,4BAA4B,WAAW,CAAC,CAAC,KAAK,QAAQ;AACjG,WAAO;AAAA,EACT;AAEA,WAAS,YAA0B;AACjC,WAAO,QAAQ;AAAA,EACjB;AAEA,WAAS,UAAwB;AAC/B,QAAI,OAAO,SAAS;AACpB,WAAO,KAAK,EAAE,SAAS,MAAM;AAC3B,WAAK;AACL,YAAM,QAAQ,SAAS;AACvB,UAAI,KAAK,SAAS,KAAM,QAAO,EAAE,MAAM,MAAM,UAAU,CAAC,GAAG,KAAK,UAAU,KAAK,EAAE;AAAA,UAC5E,QAAO,EAAE,MAAM,MAAM,UAAU,CAAC,MAAM,KAAK,EAAE;AAAA,IACpD;AACA,WAAO;AAAA,EACT;AAEA,WAAS,WAAyB;AAChC,QAAI,OAAO,WAAW;AACtB,WAAO,MAAM;AACX,YAAM,IAAI,KAAK;AACf,UAAI,EAAE,SAAS,SAAS,EAAE,SAAS,YAAY,EAAE,SAAS,QAAQ,EAAE,SAAS,WAAW,EAAE,SAAS;AACjG;AACF,UAAI,EAAE,SAAS,OAAO;AACpB,aAAK;AACL,cAAM,QAAQ,WAAW;AACzB,YAAI,KAAK,SAAS,MAAO,QAAO,EAAE,MAAM,OAAO,UAAU,CAAC,GAAG,KAAK,UAAU,KAAK,EAAE;AAAA,YAC9E,QAAO,EAAE,MAAM,OAAO,UAAU,CAAC,MAAM,KAAK,EAAE;AACnD;AAAA,MACF;AACA,UAAI,EAAE,SAAS,OAAO;AACpB,aAAK;AACL,cAAM,QAAQ,WAAW;AACzB,eAAO,EAAE,MAAM,OAAO,UAAU,CAAC,MAAM,EAAE,MAAM,OAAO,OAAO,MAAM,CAAC,EAAE;AACtE;AAAA,MACF;AAEA,UACE,EAAE,SAAS,UACX,EAAE,SAAS,YACX,EAAE,SAAS,YACX,EAAE,SAAS,UACX,EAAE,SAAS,YACX,EAAE,SAAS,SACX;AAEA,YAAI,EAAE,SAAS,QAAS;AACxB,cAAM,QAAQ,WAAW;AACzB,YAAI,KAAK,SAAS,MAAO,QAAO,EAAE,MAAM,OAAO,UAAU,CAAC,GAAG,KAAK,UAAU,KAAK,EAAE;AAAA,YAC9E,QAAO,EAAE,MAAM,OAAO,UAAU,CAAC,MAAM,KAAK,EAAE;AACnD;AAAA,MACF;AACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,aAA2B;AAElC,UAAM,WAAW,qBAAqB;AACtC,QAAI,SAAU,QAAO;AAErB,UAAM,IAAI,KAAK;AACf,QAAI,EAAE,SAAS,UAAU;AACvB,WAAK;AACL,YAAM,QAAQ,UAAU;AACxB,aAAO,QAAQ;AACf,aAAO;AAAA,IACT;AACA,QAAI,EAAE,SAAS,QAAQ;AACrB,WAAK;AACL,aAAO,QAAQ;AACf,YAAM,WAA2B,CAAC;AAClC,eAAS,KAAK,WAAW,CAAC;AAC1B,aAAO,KAAK,EAAE,SAAS,WAAW,KAAK,EAAE,SAAS,YAAY,KAAK,EAAE,SAAS,OAAO;AACnF,iBAAS,KAAK,WAAW,CAAC;AAAA,MAC5B;AACA,UAAI,WAAW;AACf,UAAI,KAAK,EAAE,SAAS,SAAS;AAC3B,aAAK;AACL,cAAM,UAAU,KAAK;AACrB,YAAI,QAAQ,SAAS,OAAQ,OAAM,IAAI,YAAY,gCAAgC,QAAQ;AAC3F,mBAAW,OAAO,QAAQ,KAAK;AAC/B,YAAI,CAAC,OAAO,SAAS,QAAQ,EAAG,OAAM,IAAI,YAAY,gCAAgC,QAAQ;AAAA,MAChG;AACA,aAAO,QAAQ;AACf,aAAO,EAAE,MAAM,QAAQ,UAAU,UAAU,QAAQ,MAAM,SAAS,KAAK;AAAA,IACzE;AACA,QAAI,EAAE,SAAS,UAAU;AACvB,WAAK;AACL,YAAM,QAAQ,EAAE,MACb,MAAM,KAAK,EACX,OAAO,OAAO,EACd,IAAI,CAAC,SAAS;AACb,cAAM,SAAS,KAAK,SAAS,GAAG;AAChC,eAAO,EAAE,OAAO,SAAS,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM,OAAO;AAAA,MAC5D,CAAC;AACH,aAAO,EAAE,MAAM,UAAU,OAAO,QAAQ,MAAM,SAAS,KAAK;AAAA,IAC9D;AACA,QAAI,EAAE,SAAS,QAAQ;AACrB,WAAK;AACL,aAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,OAAO,QAAQ,EAAE,QAAQ,QAAQ,MAAM,SAAS,KAAK;AAAA,IACvF;AACA,UAAM,IAAI,YAAY,4BAA4B,WAAW,CAAC,CAAC,KAAK,QAAQ;AAAA,EAC9E;AAEA,WAAS,uBAA4C;AACnD,UAAM,OAAO;AACb,QAAI,SAAwB;AAC5B,QAAI,UAA2B;AAE/B,QAAI,KAAK,EAAE,SAAS,UAAU;AAC5B,WAAK;AACL,gBAAU,CAAC;AACX,aAAO,KAAK,EAAE,SAAS,YAAY,KAAK,EAAE,SAAS,OAAO;AACxD,YAAI,KAAK,EAAE,SAAS,QAAQ;AAC1B,gBAAM,UAAU,KAAK;AACrB,cAAI,QAAQ,SAAS,QAAQ;AAC3B,gBAAI;AACJ,mBAAO;AAAA,UACT;AACA,kBAAQ,KAAK,QAAQ,MAAM,YAAY,CAAC;AAAA,QAC1C,WAAW,KAAK,EAAE,SAAS,SAAS;AAClC,eAAK;AAAA,QACP,OAAO;AACL,cAAI;AACJ,iBAAO;AAAA,QACT;AAAA,MACF;AACA,UAAI,KAAK,EAAE,SAAS,UAAU;AAC5B,YAAI;AACJ,eAAO;AAAA,MACT;AACA,WAAK;AAAA,IACP,WAAW,KAAK,EAAE,SAAS,QAAQ;AACjC,YAAM,OAAO,KAAK;AAClB,UAAI,KAAK,SAAS,QAAQ;AACxB,YAAI;AACJ,eAAO;AAAA,MACT;AACA,UAAI,KAAK,EAAE,SAAS,SAAS;AAC3B,YAAI;AACJ,eAAO;AAAA,MACT;AACA,eAAS,KAAK,MAAM,YAAY;AAAA,IAClC,OAAO;AACL,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,EAAE,SAAS,SAAS;AAC3B,UAAI;AACJ,aAAO;AAAA,IACT;AACA,SAAK;AACL,UAAM,QAAQ,WAAW;AACzB,WAAO,YAAY,OAAO,QAAQ,OAAO;AAAA,EAC3C;AAEA,MAAI,OAAO,WAAW,KAAK,OAAO,CAAC,EAAG,SAAS,MAAO,QAAO,EAAE,MAAM,OAAO;AAC5E,QAAM,OAAO,UAAU;AACvB,MAAI,KAAK,EAAE,SAAS,MAAO,OAAM,IAAI,YAAY,4BAA4B,WAAW,KAAK,CAAC,CAAC,KAAK,QAAQ;AAC5G,SAAO;AACT;AAEA,SAAS,YAAY,MAAoB,QAAuB,SAAwC;AACtG,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,GAAG,MAAM,QAAQ,UAAU,KAAK,QAAQ,SAAS,WAAW,KAAK,QAAQ;AAAA,IACpF,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,GAAG,MAAM,UAAU,KAAK,SAAS,IAAI,CAAC,UAAU,YAAY,OAAO,QAAQ,OAAO,CAAC,EAAE;AAAA,IAChG,KAAK;AACH,aAAO,EAAE,MAAM,OAAO,OAAO,YAAY,KAAK,OAAO,QAAQ,OAAO,EAAE;AAAA,IACxE,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,QAAQ,OAAsB;AACrC,QAAM,SAAgB,CAAC;AACvB,MAAI,IAAI;AACR,SAAO,IAAI,MAAM,QAAQ;AACvB,UAAM,KAAK,MAAM,CAAC;AAClB,QAAI,KAAK,KAAK,EAAE,GAAG;AACjB;AACA;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AACd,aAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B;AACA;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AACd,aAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B;AACA;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AACd,aAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B;AACA;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AACd,aAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B;AACA;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AACd,aAAO,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC7B;AACA;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AACd,aAAO,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC7B;AACA;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AACd;AACA,UAAI,QAAQ;AACZ,aAAO,IAAI,MAAM,UAAU,MAAM,CAAC,MAAM,KAAK;AAC3C,YAAI,MAAM,CAAC,MAAM,QAAQ,IAAI,IAAI,MAAM,QAAQ;AAC7C,mBAAS,MAAM,IAAI,CAAC;AACpB,eAAK;AACL;AAAA,QACF;AACA,iBAAS,MAAM,GAAG;AAAA,MACpB;AACA,UAAI,MAAM,CAAC,MAAM,IAAK;AACtB,aAAO,KAAK,EAAE,MAAM,UAAU,MAAM,CAAC;AACrC;AAAA,IACF;AAEA,QAAI,OAAO;AACX,WAAO,IAAI,MAAM,UAAU,CAAC,cAAc,KAAK,MAAM,CAAC,CAAE,EAAG,SAAQ,MAAM,GAAG;AAC5E,QAAI,CAAC,MAAM;AACT;AACA;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,YAAY;AAC/B,QAAI,UAAU,MAAO,QAAO,KAAK,EAAE,MAAM,MAAM,CAAC;AAAA,aACvC,UAAU,KAAM,QAAO,KAAK,EAAE,MAAM,KAAK,CAAC;AAAA,aAC1C,UAAU,MAAO,QAAO,KAAK,EAAE,MAAM,MAAM,CAAC;AAAA,aAC5C,UAAU,QAAQ;AAEzB,UAAI,IAAI;AACR,aAAO,IAAI,MAAM,UAAU,KAAK,KAAK,MAAM,CAAC,CAAE,EAAG;AACjD,UAAI,MAAM,CAAC,MAAM,IAAK,QAAO,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,WAC7C;AACH,cAAM,SAAS,KAAK,SAAS,GAAG;AAChC,eAAO,KAAK,EAAE,MAAM,QAAQ,OAAO,SAAS,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM,OAAO,CAAC;AAAA,MAChF;AAAA,IACF,OAAO;AACL,YAAM,SAAS,KAAK,SAAS,GAAG;AAChC,aAAO,KAAK,EAAE,MAAM,QAAQ,OAAO,SAAS,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM,OAAO,CAAC;AAAA,IAChF;AAAA,EACF;AACA,SAAO,KAAK,EAAE,MAAM,MAAM,CAAC;AAC3B,SAAO;AACT;AAEA,SAAS,WAAW,GAAgB;AAClC,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,aAAO,EAAE,SAAS,GAAG,EAAE,KAAK,MAAM,EAAE;AAAA,IACtC,KAAK;AACH,aAAO,IAAI,EAAE,KAAK;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,EAAE;AAAA,EACb;AACF;AAGO,SAAS,eAAe,OAA6B;AAG1D,MAAI;AACF,WAAO,eAAe,KAAK;AAAA,EAC7B,QAAQ;AAEN,UAAM,QAAQ,MACX,MAAM,KAAK,EACX,OAAO,OAAO,EACd,OAAO,CAAC,MAAM,CAAC,uBAAuB,KAAK,CAAC,CAAC;AAChD,QAAI,MAAM,WAAW,EAAG,QAAO,EAAE,MAAM,OAAO;AAC9C,UAAM,QAAwB,MAAM,IAAI,CAAC,MAAM;AAC7C,YAAM,SAAS,EAAE,SAAS,GAAG;AAC7B,aAAO,EAAE,MAAM,QAAiB,OAAO,SAAS,EAAE,MAAM,GAAG,EAAE,IAAI,GAAG,QAAQ,QAAQ,MAAM,SAAS,KAAK;AAAA,IAC1G,CAAC;AACD,WAAO,MAAM,WAAW,IAAI,MAAM,CAAC,IAAK,EAAE,MAAM,OAAO,UAAU,MAAM;AAAA,EACzE;AACF;;;ACvVO,SAAS,WAAW,MAAsB;AAC/C,MAAI,IAAI,KAAK,YAAY;AACzB,MAAI,EAAE,UAAU,EAAG,QAAO;AAG1B,MAAI,EAAE,SAAS,MAAM,EAAG,KAAI,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,WACpC,EAAE,SAAS,KAAK,EAAG,KAAI,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,WACxC,EAAE,SAAS,IAAI,GAAG;AAAA,EAE3B,WAAW,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,EAAG,KAAI,EAAE,MAAM,GAAG,EAAE;AAG7D,MAAI,aAAa;AACjB,MAAI,EAAE,SAAS,KAAK,GAAG;AACrB,UAAM,OAAO,EAAE,MAAM,GAAG,EAAE;AAC1B,QAAI,QAAQ,IAAI,IAAI,EAAG,KAAI,GAAG,IAAI;AAAA,EACpC,OAAO;AACL,QAAI,OAAsB;AAC1B,QAAI,EAAE,SAAS,IAAI,KAAK,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,EAAG,QAAO,EAAE,MAAM,GAAG,EAAE;AAAA,aAC7D,EAAE,SAAS,KAAK,KAAK,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,EAAG,QAAO,EAAE,MAAM,GAAG,EAAE;AAC5E,QAAI,SAAS,MAAM;AACjB,UAAI;AACJ,mBAAa;AAAA,IACf;AAAA,EACF;AACA,MAAI,YAAY;AACd,QAAI,EAAE,SAAS,IAAI,KAAK,EAAE,SAAS,IAAI,KAAK,EAAE,SAAS,IAAI,EAAG,KAAI,GAAG,CAAC;AAAA,aAC7D,gBAAgB,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC,EAAG,KAAI,EAAE,MAAM,GAAG,EAAE;AAAA,aAC1D,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,EAAG,KAAI,GAAG,CAAC;AAAA,EAC/C;AAGA,MAAI,EAAE,SAAS,GAAG,KAAK,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,EAAG,KAAI,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;AAGtE,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO;AAC9B,QAAI,EAAE,SAAS,GAAG,GAAG;AACnB,YAAM,OAAO,EAAE,MAAM,GAAG,CAAC,IAAI,MAAM;AACnC,UAAI,QAAQ,IAAI,IAAI,GAAG;AACrB,YAAI,OAAO;AACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO;AAC9B,QAAI,EAAE,SAAS,GAAG,GAAG;AACnB,YAAM,OAAO,EAAE,MAAM,GAAG,CAAC,IAAI,MAAM;AACnC,UAAI,QAAQ,IAAI,IAAI,GAAG;AACrB,YAAI,OAAO;AACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,OAAO,OAAO;AACvB,QAAI,EAAE,SAAS,GAAG,GAAG;AACnB,YAAM,OAAO,EAAE,MAAM,GAAG,CAAC,IAAI,MAAM;AACnC,UAAI,QAAQ,IAAI,IAAI,GAAG;AACrB,YAAI;AACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,EAAE,SAAS,KAAK,GAAG;AACrB,UAAM,OAAO,EAAE,MAAM,GAAG,EAAE;AAC1B,QAAI,QAAQ,IAAI,IAAI,KAAK,QAAQ,KAAK,IAAI,EAAG,KAAI;AAAA,EACnD;AAGA,MAAI,EAAE,SAAS,GAAG,GAAG;AACnB,UAAM,OAAO,EAAE,MAAM,GAAG,EAAE;AAC1B,UAAM,IAAI,QAAQ,IAAI;AACtB,QAAI,IAAI,KAAM,MAAM,KAAK,CAAC,IAAI,IAAI,EAAI,KAAI;AAAA,EAC5C;AAGA,MAAI,QAAQ,CAAC,IAAI,KAAK,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,EAAG,KAAI,EAAE,MAAM,GAAG,EAAE;AAE9E,SAAO;AACT;AAEA,IAAM,QAAiC;AAAA,EACrC,CAAC,WAAW,KAAK;AAAA,EACjB,CAAC,UAAU,MAAM;AAAA,EACjB,CAAC,QAAQ,MAAM;AAAA,EACf,CAAC,QAAQ,MAAM;AAAA,EACf,CAAC,QAAQ,KAAK;AAAA,EACd,CAAC,QAAQ,MAAM;AAAA,EACf,CAAC,QAAQ,IAAI;AAAA,EACb,CAAC,SAAS,KAAK;AAAA,EACf,CAAC,OAAO,GAAG;AAAA,EACX,CAAC,SAAS,KAAK;AAAA,EACf,CAAC,WAAW,KAAK;AAAA,EACjB,CAAC,SAAS,KAAK;AAAA,EACf,CAAC,QAAQ,KAAK;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,WAAW,KAAK;AAAA,EACjB,CAAC,WAAW,KAAK;AAAA,EACjB,CAAC,WAAW,KAAK;AAAA,EACjB,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,KAAK;AAAA,EACf,CAAC,UAAU,KAAK;AAClB;AAEA,IAAM,QAAiC;AAAA,EACrC,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,EAAE;AAAA,EACZ,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,QAAQ,IAAI;AAAA,EACb,CAAC,OAAO,EAAE;AAAA,EACV,CAAC,QAAQ,EAAE;AACb;AAEA,IAAM,QAAQ;AAAA,EACZ;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;AAEA,SAAS,YAAY,MAAc,GAAoB;AACrD,QAAM,IAAI,KAAK,CAAC;AAChB,MAAI,QAAQ,SAAS,CAAC,EAAG,QAAO;AAChC,MAAI,MAAM,IAAK,QAAO,MAAM,IAAI,OAAO,CAAC,YAAY,MAAM,IAAI,CAAC;AAC/D,SAAO;AACT;AAEA,SAAS,QAAQ,MAAsB;AACrC,MAAI,IAAI;AACR,MAAI,IAAI;AACR,QAAM,IAAI,KAAK;AACf,SAAO,IAAI,KAAK,YAAY,MAAM,CAAC,EAAG;AACtC,SAAO,IAAI,GAAG;AACZ,WAAO,IAAI,KAAK,CAAC,YAAY,MAAM,CAAC,EAAG;AACvC,WAAO,IAAI,KAAK,YAAY,MAAM,CAAC,EAAG;AACtC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,SAAS,MAAuB;AACvC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,KAAI,CAAC,YAAY,MAAM,CAAC,EAAG,QAAO;AACxE,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAuB;AAC9C,QAAM,IAAI,KAAK;AACf,MAAI,IAAI,EAAG,QAAO;AAClB,SAAO,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,YAAY,MAAM,IAAI,CAAC;AAC/D;AAEA,SAAS,IAAI,MAAuB;AAClC,QAAM,IAAI,KAAK;AACf,MAAI,IAAI,EAAG,QAAO;AAClB,MAAI,CAAC,YAAY,MAAM,IAAI,CAAC,KAAK,YAAY,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,MAAM,IAAI,CAAC,EAAG,QAAO;AAC/F,QAAM,OAAO,KAAK,IAAI,CAAC;AACvB,SAAO,SAAS,OAAO,SAAS,OAAO,SAAS;AAClD;;;AC7JO,SAAS,gBAAgB,QAAyC;AACvE,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,OAAO,gBAAgB;AAAA,MAC3B,MAAM,OAAO,SAAS,UAAU,UAAU;AAAA,MAC1C,kBAAkB,OAAO,oBAAoB;AAAA,MAC7C,YAAY,OAAO;AAAA,MACnB,YAAY,OAAO;AAAA,IACrB,CAAC;AACD,WAAO,CAACC,UACN,KAAKA,KAAI,EAAE,IAAI,CAAC,WAAW;AAAA,MACzB,GAAG;AAAA,MACH,MAAM,WAAW,MAAM,IAAI;AAAA,IAC7B,EAAE;AAAA,EACN;AACA,MAAI,OAAO,SAAS,UAAW,QAAO,uBAAuB,MAAM;AACnE,MAAI,OAAO,SAAS,QAAS,QAAO,qBAAqB,MAAM;AAC/D,SAAO,yBAAyB,MAAM;AACxC;AAEA,SAAS,qBAAqB,QAAyC;AACrE,QAAM,aAAa,IAAI,IAAI,OAAO,cAAc,EAAE;AAClD,QAAM,WAAW,IAAI,IAAI,OAAO,cAAc,EAAE;AAChD,SAAO,CAACA,UAAiB;AACvB,UAAM,SAAqB,CAAC;AAC5B,QAAI,IAAI;AACR,QAAI,MAAM;AACV,WAAO,IAAIA,MAAK,QAAQ;AACtB,aAAO,IAAIA,MAAK,UAAU,CAAC,iBAAiBA,MAAK,CAAC,GAAI,YAAY,QAAQ,EAAG;AAC7E,UAAI,KAAKA,MAAK,OAAQ;AACtB,YAAM,YAAY;AAClB,aAAO,IAAIA,MAAK,UAAU,iBAAiBA,MAAK,CAAC,GAAI,YAAY,QAAQ,EAAG;AAC5E,YAAM,MAAMA,MAAK,MAAM,WAAW,CAAC;AACnC,YAAM,OAAO,IAAI,YAAY;AAC7B,UAAI,KAAK,WAAW,EAAG;AACvB,aAAO,KAAK;AAAA,QACV;AAAA,QACA,OAAO,WAAWA,OAAM,SAAS;AAAA,QACjC,QAAQ,WAAW,GAAG;AAAA,QACtB,UAAU;AAAA,QACV;AAAA,QACA,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,yBAAyB,QAAyC;AACzE,QAAM,mBAAmB,OAAO,oBAAoB;AACpD,QAAM,aAAa,IAAI,IAAI,CAAC,GAAI,OAAO,cAAc,EAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AACvE,QAAM,WAAW,IAAI,IAAI,CAAC,GAAI,OAAO,cAAc,EAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AACrE,SAAO,CAACA,UAAiB;AACvB,UAAM,SAAqB,CAAC;AAC5B,QAAI,IAAI;AACR,QAAI,MAAM;AACV,WAAO,IAAIA,MAAK,QAAQ;AACtB,aAAO,IAAIA,MAAK,UAAU,CAAC,mBAAmBA,MAAK,CAAC,GAAI,YAAY,QAAQ,EAAG;AAC/E,UAAI,KAAKA,MAAK,OAAQ;AACtB,YAAM,YAAY;AAClB,aAAO,IAAIA,MAAK,UAAU,mBAAmBA,MAAK,CAAC,GAAI,YAAY,QAAQ,EAAG;AAC9E,UAAI,MAAMA,MAAK,MAAM,WAAW,CAAC;AACjC,UAAI,mBAAmB,EAAG,OAAM,gBAAgB,KAAK,gBAAgB;AACrE,YAAM,OAAO,IAAI,YAAY;AAC7B,UAAI,KAAK,WAAW,EAAG;AACvB,aAAO,KAAK;AAAA,QACV;AAAA,QACA,OAAO,WAAWA,OAAM,SAAS;AAAA,QACjC,QAAQ,WAAWA,MAAK,MAAM,WAAW,CAAC,CAAC;AAAA,QAC3C,UAAU;AAAA,QACV;AAAA,QACA,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,uBAAuB,QAAyC;AACvE,QAAM,gBAAgB,OAAO,iBAAiB;AAC9C,QAAM,YAAY,OAAO,2BAA2B;AACpD,SAAO,CAACA,UAAiB;AACvB,QAAI,SAASA;AACb,QAAI,UAAW,UAAS,gBAAgB,QAAQ,CAAC;AACjD,QAAI,CAAC,cAAe,UAAS,OAAO,YAAY;AAChD,UAAM,SAAqB,CAAC;AAC5B,QAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,KAAK,OAAO,SAAS,GAAG,KAAK;AAC3C,YAAM,OAAO,OAAO,MAAM,GAAG,IAAI,CAAC;AAClC,aAAO,KAAK;AAAA,QACV;AAAA,QACA,OAAO,WAAW,QAAQ,CAAC;AAAA,QAC3B,QAAQ,WAAW,IAAI;AAAA,QACvB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,SAAS,IAAI;AAAA,MACf,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,IAAY,YAAyB,UAAgC;AAC7F,MAAI,SAAS,IAAI,EAAE,EAAG,QAAO;AAC7B,MAAI,WAAW,IAAI,EAAE,EAAG,QAAO;AAC/B,QAAM,OAAO,GAAG,WAAW,CAAC;AAC5B,MAAI,OAAO,IAAK,QAAO;AACvB,SAAQ,QAAQ,MAAM,QAAQ,MAAQ,QAAQ,MAAM,QAAQ,MAAQ,QAAQ,MAAM,QAAQ;AAC5F;AAEA,SAAS,mBAAmB,IAAY,YAAyB,UAAgC;AAC/F,MAAI,SAAS,IAAI,EAAE,EAAG,QAAO;AAC7B,MAAI,WAAW,IAAI,EAAE,EAAG,QAAO;AAE/B,SAAO,qBAAqB,KAAK,EAAE;AACrC;AAEA,SAAS,gBAAgBA,OAAc,MAAyB;AAC9D,MAAI,SAAS,EAAG,QAAOA;AAEvB,QAAM,aAAaA,MAAK,UAAU,KAAK;AACvC,MAAI,MAAM;AACV,aAAW,MAAM,YAAY;AAC3B,QAAI,SAAS,KAAK,EAAE,EAAG;AACvB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,WAAWA,OAAsB;AAC/C,SAAO,IAAI,YAAY,EAAE,OAAOA,KAAI,EAAE;AACxC;AAEO,SAAS,WAAWA,OAAc,WAA2B;AAClE,SAAO,IAAI,YAAY,EAAE,OAAOA,MAAK,MAAM,GAAG,SAAS,CAAC,EAAE;AAC5D;;;AClHO,IAAM,mBAAN,MAAM,kBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO,oBAAI,IAAoB;AAAA,EACxC,YAAmB;AAAA,EACF;AAAA;AAAA,EAEA,QAAQ,oBAAI,IAAuB;AAAA;AAAA,EAE5C,WAAW;AAAA;AAAA,EAEX,YAAY;AAAA,EACZ,cAAc;AAAA,EAEtB,YAAY,MAAc,YAAsB,cAA6B,MAAM,OAAgB,QAAQ;AACzG,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,cAAc;AACnB,SAAK,UAAU,mBAAmB,YAAY,IAAI;AAClD,SAAK,UAAU,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AACrD,QAAI,KAAK,QAAQ,WAAW,EAAG,OAAM,IAAI,YAAY,oCAAoC,OAAO;AAChG,SAAK,WAAW,gBAAgB,KAAK,QAAQ,SAAS;AAAA,EACxD;AAAA,EAEA,OAAkB;AAChB,WAAO,CAAC,GAAG,KAAK,KAAK,OAAO,CAAC;AAAA,EAC/B;AAAA,EAEA,OAAO,QAA+B,OAAsB;AAE1D,UAAM,UAAU,KAAK,cAAc,MAAM;AACzC,QAAI,YAAY,MAAM;AACpB,WAAK,WAAW,SAAS,MAAM;AAE/B,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,SAAS,KAAK;AAC/B,QAAI,KAAK,KAAK,IAAI,QAAQ,EAAG,OAAM,IAAI,YAAY,iCAAiC,oBAAoB;AACxG,UAAM,MAAM,KAAK,SAAS,UAAU,MAAM;AAC1C,SAAK,KAAK,IAAI,UAAU,GAAG;AAC3B,SAAK,SAAS,GAAG;AACjB,SAAK,UAAU,QAAQ;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,OAAc,SAAsC;AACzD,UAAM,MAAM,KAAK,KAAK,IAAI,KAAK;AAC/B,QAAI,CAAC,IAAK;AACV,SAAK,WAAW,GAAG;AACnB,UAAM,SAAS,IAAI,IAAI,IAAI,MAAM;AACjC,eAAW,CAAC,KAAK,KAAK,KAAK,QAAS,QAAO,IAAI,KAAK,KAAK;AACzD,UAAM,OAAO,KAAK,SAAS,OAAO,MAAM;AACxC,SAAK,KAAK,IAAI,OAAO,IAAI;AACzB,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,OAAO,OAAoB;AACzB,UAAM,MAAM,KAAK,KAAK,IAAI,KAAK;AAC/B,QAAI,CAAC,IAAK;AACV,SAAK,WAAW,GAAG;AACnB,SAAK,KAAK,OAAO,KAAK;AAAA,EACxB;AAAA,EAEA,QAAQ,OAAc,WAA0B,YAAoB,OAAwB;AAC1F,UAAM,SAAS,KAAK,YAAY,OAAO,WAAW,YAAY,KAAK;AACnE,WAAO,WAAW;AAAA,EACpB;AAAA,EAEA,YAAY,OAAc,WAA0B,YAAoB,OAAsC;AAC5G,UAAM,MAAM,KAAK,KAAK,IAAI,KAAK;AAC/B,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,MAAM,KAAK,SAAS,SAAS,eAAe,KAAK,IAAI,eAAe,KAAK;AAC/E,UAAM,cAAc,WAAW,YAAY;AAC3C,UAAM,aAAa,KAAK,KAAK,YAAY;AACzC,UAAM,iBAAiB,WAAW,YAAY,KAAK;AAEnD,QAAI,iBAAiB,KAAK,eAAe;AACzC,QAAI,gBAAgB,cAAc,EAAE,mBAAmB,QAAQ,gBAAgB,iBAAiB;AAC9F,YAAM,UAAU,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,WAAW;AACxE,UAAI,QAAS,kBAAiB,CAAC,OAAO;AAAA,UACjC,QAAO;AAAA,IACd;AACA,UAAM,OAAsB,CAAC;AAC7B,UAAM,KAAK,KAAK,SAAS,KAAK,KAAK,gBAAgB,IAAI;AACvD,QAAI,CAAC,GAAI,QAAO;AAChB,WAAO;AAAA,MACL,WAAW,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,mBAAmB,GAAG;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,KAAK,QAAwB,SAA4B;AACvD,UAAM,MAAM,KAAK,KAAK,IAAI,OAAO,KAAK;AACtC,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,UAAU,OAAO,YAAY,SAAS,IAAI,OAAO,cAAc,CAAC;AACtE,QAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,UAAM,OAAO,KAAK,eAAe;AACjC,UAAM,IAAI,KAAK,IAAI,CAAC,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;AAC9C,UAAM,KAAK;AACX,UAAM,IAAI;AACV,UAAM,IAAI,KAAK,IAAI,GAAG,KAAK,QAAQ;AACnC,UAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,SAAS;AAC3C,QAAI,QAAQ;AACZ,UAAM,IAAI,KAAK,UAAU,GAAG;AAE5B,aAAS,KAAK,GAAG,KAAK,QAAQ,QAAQ,MAAM;AAC1C,YAAM,SAAS,QAAQ,EAAE;AAEzB,UAAI,OAAO;AACX,eAAS,KAAK,GAAG,KAAK,KAAK,QAAQ,MAAM;AACvC,cAAM,MAAM,KAAK,EAAE;AACnB,cAAM,IAAI,KAAK,WAAW,KAAK,KAAK,MAAM;AAC1C,iBAAS,EAAE,EAAE,KAAK,KAAK;AAAA,MACzB;AACA,UAAI,SAAS,EAAG;AAChB,YAAM,KAAK,KAAK,cAAc,MAAM;AAEpC,UAAI,MAAM,KAAK,KAAK,IAAI,KAAK,QAAQ,KAAK,IAAI;AAC9C,UAAI,OAAO,EAAG,OAAM;AACpB,eAAS,OAAQ,QAAQ,KAAK,MAAO,OAAO,MAAM,IAAI,IAAK,IAAI,IAAK;AAAA,IACtE;AACA,WAAO,UAAU,IAAI,KAAK,CAAC;AAAA,EAC7B;AAAA,EAEA,UAAU,QAAwB,UAAkB,MAAc,OAAuB;AACvF,UAAM,MAAM,KAAK,KAAK,IAAI,OAAO,KAAK;AACtC,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,MAAM,KAAK,QAAQ,QAAQ;AACjC,QAAI,CAAC,IAAK,QAAO;AACjB,UAAMC,QAAO,YAAY,IAAI,OAAO,IAAI,IAAI,YAAY,CAAC,KAAK,IAAI;AAClE,QAAI,KAAK,QAAQ,YAAY,cAAe,QAAOA;AACnD,UAAM,OAAO,OAAO,KACjB,OAAO,CAAC,MAAM,EAAE,OAAO,YAAY,MAAM,IAAI,YAAY,CAAC,EAC1D,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAC3C,QAAI,KAAK,WAAW,EAAG,QAAOA;AAC9B,QAAI,MAAM;AACV,QAAI,KAAK;AACT,eAAW,OAAO,UAAU,IAAI,GAAG;AACjC,aAAOA,MAAK,MAAM,IAAI,IAAI,SAAS;AACnC,aAAO,OAAOA,MAAK,MAAM,IAAI,WAAW,IAAI,OAAO,IAAI;AACvD,WAAK,IAAI;AAAA,IACX;AACA,WAAOA,MAAK,MAAM,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,QACE,QACA,UACA,MACA,OACA,UACA,YACQ;AACR,UAAM,MAAM,KAAK,KAAK,IAAI,OAAO,KAAK;AACtC,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,MAAM,KAAK,QAAQ,QAAQ;AACjC,QAAI,CAAC,IAAK,QAAO;AACjB,UAAMA,QAAO,YAAY,IAAI,OAAO,IAAI,IAAI,YAAY,CAAC,KAAK,IAAI;AAClE,UAAM,SAAS,IAAI,eAAe,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC;AAC7D,UAAM,eAAe,IAAI;AAAA,MACvB,OAAO,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,YAAY,MAAM,IAAI,YAAY,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ;AAAA,IAC/F;AACA,QAAI,OAAO,WAAW,KAAK,aAAa,SAAS,EAAG,QAAOA;AAC3D,UAAM,WAAW,KAAK,IAAI,GAAG,YAAY;AACzC,UAAM,SAAS,KAAK,IAAI,GAAG,UAAU;AACrC,UAAM,WAAW,KAAK,IAAI,GAAG,WAAW,KAAK,MAAM,SAAS,CAAC,CAAC;AAC9D,UAAM,SAAS,KAAK,IAAI,OAAO,SAAS,GAAG,WAAW,SAAS,CAAC;AAChE,UAAM,YAAY,OAAO,QAAQ,EAAG;AACpC,UAAM,UAAU,OAAO,MAAM,EAAG;AAChC,UAAM,QAAQA,MAAK,MAAM,WAAW,OAAO;AAE3C,UAAM,YAAY,OAAO,KACtB,OAAO,CAAC,MAAM,EAAE,OAAO,YAAY,MAAM,IAAI,YAAY,KAAK,EAAE,aAAa,aAAa,EAAE,WAAW,OAAO,EAC9G,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,WAAW,EAAE,YAAY,WAAW,SAAS,EAAE,UAAU,UAAU,EAAE;AAC5F,QAAI,MAAM;AACV,QAAI,KAAK;AACT,eAAW,OAAO,UAAU,SAAS,GAAG;AACtC,aAAO,MAAM,MAAM,IAAI,IAAI,SAAS;AACpC,aAAO,OAAO,MAAM,MAAM,IAAI,WAAW,IAAI,OAAO,IAAI;AACxD,WAAK,IAAI;AAAA,IACX;AACA,WAAO,MAAM,MAAM,EAAE;AACrB,QAAI,WAAW,EAAG,OAAM,WAAW;AACnC,QAAI,SAAS,OAAO,SAAS,EAAG,OAAM,MAAM;AAC5C,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,QAAQ,QAAgC;AACtC,UAAM,MAAM,KAAK,KAAK,IAAI,OAAO,KAAK;AACtC,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,QAAkB,CAAC;AACzB,eAAW,OAAO,OAAO,MAAM;AAC7B,YAAM,WAAW,KAAK,QAAQ,UAAU,CAAC,MAAM,EAAE,YAAY,MAAM,IAAI,OAAO,YAAY,CAAC;AAC3F,YAAMA,QAAO,YAAY,IAAI,OAAO,IAAI,IAAI,OAAO,YAAY,CAAC,KAAK,IAAI;AACzE,YAAM,QAAQ,gBAAgBA,OAAM,IAAI,SAAS;AACjD,YAAM,SAAS,gBAAgBA,OAAM,IAAI,OAAO,IAAI;AACpD,YAAM,KAAK,OAAO,QAAQ,GAAG,KAAK,OAAO,KAAK,GAAG,OAAO,MAAM,CAAC;AAAA,IACjE;AACA,WAAO,MAAM,KAAK,GAAG;AAAA,EACvB;AAAA;AAAA,EAGA,UAAU,QAAwB,UAAU,OAAmB;AAC7D,UAAM,MAAM,KAAK,KAAK,IAAI,OAAO,KAAK;AACtC,UAAM,UAAU,KAAK,IAAI,GAAG,OAAO,YAAY,MAAM;AACrD,UAAM,OAAO,KAAK,QAAQ;AAC1B,UAAM,SAAmB,CAAC,SAAS,IAAI;AAEvC,aAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,eAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,cAAM,MAAM,KAAK,QAAQ,CAAC;AAC1B,cAAM,OAAO,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK;AAC3C,cAAM,KAAK,MAAM,KAAK,SAAS,KAAK,KAAK,IAAI,IAAI;AACjD,eAAO,KAAK,EAAE;AAAA,MAChB;AAAA,IACF;AACA,UAAM,MAAM,IAAI,WAAW,OAAO,SAAS,CAAC;AAC5C,UAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AACpC,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAK,MAAK,UAAU,IAAI,GAAG,OAAO,CAAC,MAAO,GAAG,IAAI;AACpF,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,MAAmE;AAC3E,QAAI,SAAS,OAAO;AAClB,YAAM,MAAuC,CAAC;AAC9C,iBAAW,CAAC,MAAM,QAAQ,KAAK,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAO,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAE,GAAG;AAC/F,cAAM,OAAO,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,CAAC,CAAC;AACzD,YAAI,KAAK,EAAE,MAAM,KAAK,KAAK,MAAM,KAAK,SAAS,OAAO,CAAC;AAAA,MACzD;AACA,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAAA,EAEA,QAA0B;AACxB,UAAM,OAAO,IAAI;AAAA,MACf,KAAK;AAAA,MACL,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAO,EAAE,YAAY,GAAG,EAAE,IAAI,eAAe,EAAE,IAAK;AAAA,MAC9E,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAEA,WAAO,OAAO,MAAM;AAAA,MAClB,SAAS,gBAAgB,KAAK,OAAO;AAAA,MACrC,SAAS,CAAC,GAAG,KAAK,OAAO;AAAA,IAC3B,CAAC;AACD,IAAC,KAA8C,WAAW,KAAK;AAC/D,SAAK,YAAY,KAAK;AACtB,eAAW,CAAC,OAAO,GAAG,KAAK,KAAK,MAAM;AACpC,YAAM,SAAkB;AAAA,QACtB,OAAO,IAAI;AAAA,QACX,QAAQ,IAAI,IAAI,IAAI,MAAM;AAAA,QAC1B,gBAAgB,IAAI,IAAI,CAAC,GAAG,IAAI,eAAe,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAAA,MAC1G;AACA,WAAK,KAAK,IAAI,OAAO,MAAM;AAC3B,WAAK,SAAS,MAAM;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,QAA8C;AAElE,UAAM,MAAM,KAAK,KAAK,YAAY;AAClC,QAAI,CAAC,OAAO,IAAI,GAAG,EAAG,QAAO;AAC7B,UAAM,IAAI,OAAO,IAAI,GAAG;AACxB,QAAI,OAAO,MAAM,SAAU,QAAO;AAElC,UAAM,eAAe,CAAC,GAAG,OAAO,QAAQ,CAAC,EAAE;AAAA,MACzC,CAAC,CAAC,GAAG,GAAG,MAAM,MAAM,OAAO,QAAQ,QAAQ,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,CAAC;AAAA,IAC3F;AACA,QAAI,aAAc,QAAO;AACzB,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,SAAiB,SAAsC;AACxE,UAAM,MAAM,QAAQ,YAAY;AAChC,QAAI,QAAQ,WAAY;AACxB,QAAI,QAAQ,WAAW;AACrB,WAAK,QAAQ;AACb;AAAA,IACF;AACA,QAAI,QAAQ,kBAAmB;AAC/B,QAAI,QAAQ,cAAc;AACxB,UAAI,KAAK,QAAQ,YAAY,UAAU;AACrC,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,iBAAW,SAAS,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,EAAG,MAAK,OAAO,KAAK;AAC5D;AAAA,IACF;AACA,QAAI,IAAI,WAAW,QAAQ,KAAK,IAAI,WAAW,YAAY,GAAG;AAC5D,YAAM,IAAI,YAAY,mBAAmB,OAAO;AAAA,IAClD;AACA,QAAI,QAAQ,UAAU;AAEpB;AAAA,IACF;AAEA,UAAM,IAAI,YAAY,mBAAmB,OAAO;AAAA,EAClD;AAAA,EAEQ,UAAgB;AACtB,SAAK,MAAM,MAAM;AACjB,SAAK,WAAW;AAChB,SAAK,cAAc;AACnB,SAAK,YAAY;AACjB,eAAW,OAAO,KAAK,KAAK,OAAO,EAAG,MAAK,SAAS,GAAG;AAAA,EACzD;AAAA,EAEQ,SAAS,OAAc,QAAwC;AACrE,UAAM,SAAS,oBAAI,IAAsB;AACzC,UAAM,iBAAiB,oBAAI,IAAwB;AACnD,eAAW,UAAU,KAAK,SAAS;AACjC,YAAM,MAAM,OAAO,YAAY;AAC/B,YAAM,QAAQ,OAAO,IAAI,GAAG,KAAK;AACjC,UAAI,KAAK,QAAQ,YAAY,eAAe;AAE1C,eAAO,IAAI,KAAK,IAAI;AACpB,cAAMA,QAAO,YAAY,KAAK;AAC9B,cAAMC,UAAS,KAAK,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,GAAG;AAC5E,uBAAe,IAAI,KAAKA,SAAQ,YAAY,CAAC,IAAI,KAAK,SAASD,KAAI,CAAC;AACpE;AAAA,MACF;AACA,aAAO,IAAI,KAAK,KAAK;AACrB,YAAM,SAAS,KAAK,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,GAAG;AAC5E,qBAAe,IAAI,KAAK,QAAQ,YAAY,CAAC,IAAI,KAAK,SAAS,YAAY,KAAK,CAAC,CAAC;AAAA,IACpF;AACA,WAAO,EAAE,OAAO,QAAQ,QAAQ,eAAe;AAAA,EACjD;AAAA,EAEQ,SAAS,KAAoB;AACnC,QAAI,aAAa;AACjB,eAAW,CAAC,KAAK,MAAM,KAAK,IAAI,gBAAgB;AAC9C,iBAAW,SAAS,QAAQ;AAC1B;AACA,aAAK,WAAW,MAAM,MAAM;AAAA,UAC1B,OAAO,IAAI;AAAA,UACX,QAAQ;AAAA,UACR,UAAU,MAAM;AAAA,UAChB,WAAW,MAAM;AAAA,UACjB,SAAS,MAAM;AAAA,QACjB,CAAC;AACD,mBAAW,KAAK,KAAK,QAAQ,QAAQ;AACnC,cAAI,MAAM,KAAK,UAAU,GAAG;AAC1B,kBAAM,OAAO,GAAG,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC;AAEtC,iBAAK;AAAA,UACP;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,SAAK;AACL,SAAK,eAAe;AACpB,SAAK,YAAY,KAAK,cAAc,KAAK,IAAI,GAAG,KAAK,QAAQ;AAAA,EAC/D;AAAA,EAEQ,WAAW,KAAoB;AACrC,QAAI,aAAa;AACjB,eAAW,CAAC,KAAK,MAAM,KAAK,IAAI,gBAAgB;AAC9C,iBAAW,SAAS,QAAQ;AAC1B;AACA,aAAK,cAAc,MAAM,MAAM,IAAI,OAAO,KAAK,MAAM,QAAQ;AAAA,MAC/D;AAAA,IACF;AACA,SAAK,WAAW,KAAK,IAAI,GAAG,KAAK,WAAW,CAAC;AAC7C,SAAK,cAAc,KAAK,IAAI,GAAG,KAAK,cAAc,UAAU;AAC5D,SAAK,YAAY,KAAK,cAAc,KAAK,IAAI,GAAG,KAAK,QAAQ;AAAA,EAC/D;AAAA,EAEQ,WAAW,MAAc,SAAwB;AACvD,UAAM,MAAM,KAAK,YAAY;AAC7B,UAAM,OAAO,KAAK,MAAM,IAAI,GAAG;AAC/B,QAAI,KAAM,MAAK,KAAK,OAAO;AAAA,QACtB,MAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC;AAAA,EACpC;AAAA,EAEQ,cAAc,MAAc,OAAc,QAAgB,UAAwB;AACxF,UAAM,MAAM,KAAK,YAAY;AAC7B,UAAM,OAAO,KAAK,MAAM,IAAI,GAAG;AAC/B,QAAI,CAAC,KAAM;AACX,UAAM,OAAO,KAAK,OAAO,CAAC,MAAM,EAAE,EAAE,UAAU,SAAS,EAAE,WAAW,UAAU,EAAE,aAAa,SAAS;AACtG,QAAI,KAAK,WAAW,EAAG,MAAK,MAAM,OAAO,GAAG;AAAA,QACvC,MAAK,MAAM,IAAI,KAAK,IAAI;AAAA,EAC/B;AAAA,EAEQ,iBAA2B;AACjC,WAAO,KAAK,QAAQ,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EAC3E;AAAA,EAEQ,SAAS,MAAoB,KAAc,gBAA0B,MAA8B;AACzG,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO,KAAK,SAAS,MAAM,CAAC,UAAU,KAAK,SAAS,OAAO,KAAK,gBAAgB,IAAI,CAAC;AAAA,MACvF,KAAK,MAAM;AAET,mBAAW,SAAS,KAAK,UAAU;AACjC,gBAAM,QAAuB,CAAC;AAC9B,cAAI,KAAK,SAAS,OAAO,KAAK,gBAAgB,KAAK,GAAG;AACpD,iBAAK,KAAK,GAAG,KAAK;AAClB,mBAAO;AAAA,UACT;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,OAAO;AACV,cAAM,QAAuB,CAAC;AAC9B,eAAO,CAAC,KAAK,SAAS,KAAK,OAAO,KAAK,gBAAgB,KAAK;AAAA,MAC9D;AAAA,MACA,KAAK,QAAQ;AACX,cAAM,WAAW,KAAK,eAAe,IAAI;AACzC,YAAI,SAAS,SAAS,OAAQ,QAAO,KAAK,SAAS,UAAU,KAAK,gBAAgB,IAAI;AACtF,cAAM,OAAO,eAAe,KAAK,QAAQ,KAAK,SAAS,gBAAgB,KAAK,OAAO;AACnF,cAAM,SAAS,KAAK,mBAAmB,KAAK,KAAK;AACjD,YAAI,QAAQ;AACZ,mBAAW,OAAO,MAAM;AACtB,gBAAM,SAAS,IAAI,eAAe,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC;AAC7D,qBAAW,SAAS,QAAQ;AAC1B,gBAAI,KAAK,SAAS,MAAM,KAAK,WAAW,MAAM,IAAI,MAAM,SAAS,QAAQ;AACvE,mBAAK,KAAK;AAAA,gBACR,QAAQ;AAAA,gBACR,UAAU,MAAM;AAAA,gBAChB,WAAW,MAAM;AAAA,gBACjB,SAAS,MAAM;AAAA,gBACf,MAAM,MAAM;AAAA,cACd,CAAC;AACD,sBAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,UAAU;AACb,cAAM,OAAO,eAAe,KAAK,QAAQ,KAAK,SAAS,gBAAgB,KAAK,OAAO;AACnF,YAAI,QAAQ;AACZ,mBAAW,OAAO,MAAM;AACtB,gBAAM,SAAS,IAAI,eAAe,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC;AAC7D,gBAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,OAAO;AAAA,YACnC,OAAO,KAAK,mBAAmB,EAAE,KAAK;AAAA,YACtC,QAAQ,EAAE;AAAA,UACZ,EAAE;AACF,mBAAS,IAAI,GAAG,KAAK,OAAO,SAAS,MAAM,QAAQ,KAAK;AACtD,gBAAI,KAAK;AACT,qBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,oBAAM,MAAM,OAAO,IAAI,CAAC;AACxB,oBAAM,OAAO,MAAM,CAAC;AACpB,kBAAI,KAAK,SAAS,CAAC,IAAI,KAAK,WAAW,KAAK,KAAK,IAAI,IAAI,SAAS,KAAK,OAAO;AAC5E,qBAAK;AACL;AAAA,cACF;AAAA,YACF;AACA,gBAAI,IAAI;AACN,sBAAQ;AACR,uBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,sBAAM,MAAM,OAAO,IAAI,CAAC;AACxB,qBAAK,KAAK;AAAA,kBACR,QAAQ;AAAA,kBACR,UAAU,IAAI;AAAA,kBACd,WAAW,IAAI;AAAA,kBACf,SAAS,IAAI;AAAA,kBACb,MAAM,IAAI;AAAA,gBACZ,CAAC;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,QAAQ;AACX,cAAM,OAAO,eAAe,KAAK,QAAQ,KAAK,SAAS,gBAAgB,KAAK,OAAO;AAEnF,mBAAW,OAAO,MAAM;AACtB,gBAAM,UAAsB,CAAC;AAC7B,cAAI,QAAQ;AACZ,qBAAW,SAAS,KAAK,UAAU;AACjC,kBAAM,QAAuB,CAAC;AAC9B,gBAAI,CAAC,KAAK,SAAS,OAAO,KAAK,CAAC,GAAG,GAAG,KAAK,GAAG;AAC5C,sBAAQ;AACR;AAAA,YACF;AACA,oBAAQ,KAAK,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,YAAY,MAAM,IAAI,YAAY,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;AAAA,UACvG;AACA,cAAI,CAAC,MAAO;AACZ,cAAI,UAAU,SAAS,KAAK,QAAQ,GAAG;AAErC,uBAAW,SAAS,KAAK,SAAU,MAAK,SAAS,OAAO,KAAK,CAAC,GAAG,GAAG,IAAI;AACxE,mBAAO;AAAA,UACT;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAmB,MAAsB;AAE/C,UAAM,SAAS,KAAK,SAAS,IAAI;AACjC,QAAI,OAAO,WAAW,EAAG,QAAO,OAAO,CAAC,EAAG;AAC3C,QAAI,OAAO,WAAW,EAAG,QAAO,KAAK,YAAY;AAGjD,WAAO,OAAO,CAAC,EAAG;AAAA,EACpB;AAAA;AAAA,EAGQ,eAAe,MAA6D;AAClF,QAAI,KAAK,QAAQ,UAAU,SAAS,UAAW,QAAO;AACtD,UAAM,SAAS,KAAK,SAAS,KAAK,KAAK;AACvC,QAAI,OAAO,UAAU,EAAG,QAAO;AAC/B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,MAAM,EAAE;AAAA,MAC3D,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,WAAW,KAAc,QAAgB,QAA0B;AACzE,QAAI,OAAO,WAAW,EAAG,QAAO;AAChC,UAAM,SAAS,IAAI,eAAe,IAAI,OAAO,YAAY,CAAC,KAAK,CAAC;AAChE,UAAM,QAAQ,OAAO,IAAI,CAAC,MAAM,KAAK,mBAAmB,CAAC,CAAC;AAC1D,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,KAAK,OAAO,SAAS,MAAM,QAAQ,KAAK;AACtD,UAAI,KAAK;AACT,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAI,OAAO,IAAI,CAAC,EAAG,SAAS,MAAM,CAAC,GAAG;AACpC,eAAK;AACL;AAAA,QACF;AAAA,MACF;AACA,UAAI,GAAI;AAAA,IACV;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,QAA0B;AAC9C,QAAI,IAAI;AACR,eAAW,OAAO,KAAK,KAAK,OAAO,GAAG;AACpC,iBAAW,OAAO,KAAK,eAAe,GAAG;AACvC,YAAI,KAAK,WAAW,KAAK,KAAK,MAAM,IAAI,GAAG;AACzC;AACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,KAAc,QAAgB,MAAsB;AACnE,UAAM,SAAS,KAAK,mBAAmB,IAAI;AAC3C,UAAM,SAAS,IAAI,eAAe,IAAI,OAAO,YAAY,CAAC,KAAK,CAAC;AAChE,WAAO,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,KAAK,WAAW,MAAM,CAAC,EAAE;AAAA,EAC9E;AAAA,EAEQ,UAAU,KAAsB;AACtC,QAAI,IAAI;AACR,eAAW,OAAO,KAAK,eAAe,EAAG,OAAM,IAAI,eAAe,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG;AAChG,WAAO,KAAK,IAAI,GAAG,CAAC;AAAA,EACtB;AAAA,EAEQ,UAAU,UAAuB;AACvC,QAAI,OAAO,aAAa,UAAU;AAChC,UAAI,YAAY,OAAO,KAAK,SAA4B,EAAG,MAAK,YAAY,WAAW;AAAA,IACzF,WAAW,aAAa,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI;AACrG,WAAK,YAAY,WAAW;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,SAAS,eACP,QACA,SACA,gBACA,YACU;AACV,MAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,WAAO,QACJ,IAAI,CAAC,MAAM,WAAW,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,EAAE,YAAY,CAAC,CAAC,EACtE,OAAO,CAAC,MAAmB,CAAC,CAAC,CAAC;AAAA,EACnC;AACA,MAAI,QAAQ;AACV,UAAM,UAAU,WAAW,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,OAAO,YAAY,CAAC;AAC/E,WAAO,UAAU,CAAC,OAAO,IAAI,CAAC;AAAA,EAChC;AACA,SAAO;AACT;AAEA,SAAS,UAAU,SAAqB,UAA2B;AACjE,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,MAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC,EAAG,SAAS;AAGtD,QAAM,QAAQ,QAAQ,CAAC;AACvB,aAAW,MAAM,OAAO;AACtB,QAAI,SAAS,IAAI,QAAQ,MAAM,CAAC,GAAG,QAAQ,EAAG,QAAO;AAAA,EACvD;AACA,SAAO;AACT;AAEA,SAAS,SAAS,QAAgB,MAAkB,UAA2B;AAC7E,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,QAAM,OAAO,KAAK,CAAC;AACnB,aAAW,KAAK,MAAM;AACpB,QAAI,KAAK,IAAI,IAAI,MAAM,KAAK,UAAU;AACpC,UAAI,SAAS,GAAG,KAAK,MAAM,CAAC,GAAG,QAAQ,EAAG,QAAO;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAgC;AAC1D,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,CAAC,CAAC,KAAK,KAAK,CAAC;AAAA,IACtB,KAAK;AACH,aAAO,CAAC,KAAK,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,IACxC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,KAAK,SAAS,QAAQ,kBAAkB;AAAA,IACjD,KAAK;AACH,aAAO,CAAC;AAAA,IACV,KAAK;AACH,aAAO,CAAC;AAAA,EACZ;AACF;AAEA,SAAS,UAAU,MAAoC;AACrD,MAAI,KAAK,WAAW,EAAG,QAAO,CAAC;AAC/B,QAAM,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AACjE,QAAM,MAAqB,CAAC,EAAE,GAAG,OAAO,CAAC,EAAG,CAAC;AAC7C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,MAAM,OAAO,CAAC;AACpB,UAAM,OAAO,IAAI,IAAI,SAAS,CAAC;AAC/B,QAAI,IAAI,aAAa,KAAK,QAAS,MAAK,UAAU,KAAK,IAAI,KAAK,SAAS,IAAI,OAAO;AAAA,QAC/E,KAAI,KAAK,EAAE,GAAG,IAAI,CAAC;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAyB;AAC5C,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK;AAC/E,SAAO;AACT;AAEA,SAAS,gBAAgBA,OAAc,WAA2B;AAChE,SAAO,IAAI,YAAY,EAAE,OAAOA,MAAK,MAAM,GAAG,SAAS,CAAC,EAAE;AAC5D;;;AClrBO,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EACpB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO,oBAAI,IAAsB;AAAA;AAAA,EAEjC,QAAQ,oBAAI,IAAwB;AAAA,EAE7C,YAAY,MAAc,SAAmB,gBAAgB,OAAO,cAA6B,MAAM;AACrG,QAAI,QAAQ,SAAS,KAAK,QAAQ,SAAS,MAAM,GAAG;AAClD,YAAM,IAAI,YAAY,wDAAwD,OAAO;AAAA,IACvF;AACA,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,aAAa,QAAQ,SAAS,KAAK;AACxC,SAAK,gBAAgB;AACrB,SAAK,cAAc;AACnB,SAAK,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;AAAA,EACvC;AAAA,EAEA,OAA+D;AAC7D,WAAO,CAAC,GAAG,KAAK,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ;AAC1C,YAAM,SAAS,oBAAI,IAAsB;AACzC,aAAO,IAAI,KAAK,QAAQ,CAAC,EAAG,YAAY,GAAG,IAAI,EAAE;AACjD,eAAS,IAAI,GAAG,IAAI,IAAI,OAAO,QAAQ,KAAK;AAC1C,eAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,EAAG,YAAY,GAAG,IAAI,OAAO,CAAC,CAAE;AAAA,MAC/D;AACA,aAAO,EAAE,OAAO,IAAI,IAAI,OAAO;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAsC;AAC3C,UAAM,QAAQ,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAG,YAAY,CAAC;AACvD,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,YAAM,IAAI,YAAY,6BAA6B,oBAAoB;AAAA,IACzE;AACA,UAAM,KAAK,OAAO,UAAU,WAAW,QAAQ,KAAK,MAAM,OAAO,KAAK,CAAC;AACvE,UAAM,MAAM,OAAO,EAAE;AACrB,QAAI,KAAK,KAAK,IAAI,GAAG,EAAG,OAAM,IAAI,YAAY,4BAA4B,mBAAmB;AAC7F,UAAM,SAAmB,CAAC;AAC1B,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK;AAC5C,YAAM,MAAM,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAG,YAAY,CAAC,KAAK;AAC1D,UAAI,QAAQ,KAAM,OAAM,IAAI,YAAY,qCAAqC,oBAAoB;AACjG,UAAI,IAAI,OAAO,GAAG;AAClB,UAAI,KAAK,cAAe,KAAI,KAAK,MAAM,CAAC;AACxC,aAAO,KAAK,CAAC;AAAA,IACf;AACA,SAAK,KAAK,IAAI,KAAK,EAAE,IAAI,OAAO,CAAC;AACjC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,OAAc,SAAsC;AACzD,UAAM,MAAM,OAAO,KAAK;AACxB,UAAM,WAAW,KAAK,KAAK,IAAI,GAAG;AAClC,QAAI,CAAC,SAAU;AACf,UAAM,SAAS,oBAAI,IAAsB;AACzC,WAAO,IAAI,KAAK,QAAQ,CAAC,EAAG,YAAY,GAAG,SAAS,EAAE;AACtD,aAAS,IAAI,GAAG,IAAI,SAAS,OAAO,QAAQ,KAAK;AAC/C,aAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,EAAG,YAAY,GAAG,SAAS,OAAO,CAAC,CAAE;AAAA,IACpE;AACA,eAAW,CAAC,GAAG,CAAC,KAAK,QAAS,QAAO,IAAI,GAAG,CAAC;AAC7C,SAAK,KAAK,OAAO,GAAG;AACpB,SAAK,OAAO,MAAM;AAAA,EACpB;AAAA,EAEA,OAAO,OAAoB;AACzB,SAAK,KAAK,OAAO,OAAO,KAAK,CAAC;AAAA,EAChC;AAAA,EAEA,QAA2B;AACzB,UAAM,OAAO,IAAI,mBAAkB,KAAK,MAAM,KAAK,SAAS,KAAK,eAAe,KAAK,WAAW;AAChG,eAAW,CAAC,GAAG,GAAG,KAAK,KAAK,KAAM,MAAK,KAAK,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,QAAQ,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;AAC1F,eAAW,CAAC,GAAG,CAAC,KAAK,KAAK,MAAO,MAAK,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,CAAC;AACpE,WAAO;AAAA,EACT;AACF;AAEO,IAAM,qBAAN,MAAM,oBAAmB;AAAA,EACrB,OAAO;AAAA,EACP;AAAA,EACA,UAAU;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACS;AAAA,EACA;AAAA,EAET,YAAY,MAAc,YAA2B,MAAM,cAA6B,MAAM;AAC5F,SAAK,OAAO;AACZ,SAAK,YAAY;AACjB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,QAA4B;AAC1B,WAAO,IAAI,oBAAmB,KAAK,MAAM,KAAK,WAAW,KAAK,WAAW;AAAA,EAC3E;AACF;AAEO,IAAM,uBAAN,MAAM,sBAAqB;AAAA,EACvB,OAAO;AAAA,EACP;AAAA,EACA,UAAU,CAAC,QAAQ,UAAU,MAAM,MAAM,MAAM,MAAM,MAAM,WAAW,SAAS;AAAA,EAC/E;AAAA,EAET,YAAY,MAAc,cAA6B,MAAM;AAC3D,SAAK,OAAO;AACZ,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,QAA8B;AAC5B,WAAO,IAAI,sBAAqB,KAAK,MAAM,KAAK,WAAW;AAAA,EAC7D;AACF;AAEO,IAAM,yBAAN,MAAM,wBAAuB;AAAA,EACzB,OAAO;AAAA,EACP;AAAA,EACA,UAAU,CAAC,QAAQ,UAAU,MAAM;AAAA,EACnC;AAAA,EAET,YAAY,MAAc,cAA6B,MAAM;AAC3D,SAAK,OAAO;AACZ,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,QAAgC;AAC9B,WAAO,IAAI,wBAAuB,KAAK,MAAM,KAAK,WAAW;AAAA,EAC/D;AACF;AAEO,IAAM,uBAAN,MAAM,sBAAqB;AAAA,EACvB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,MAAc,MAAgB,cAA6B,MAAM;AAC3E,QAAI,KAAK,SAAS,EAAG,OAAM,IAAI,YAAY,yCAAyC,OAAO;AAC3F,SAAK,OAAO;AACZ,SAAK,WAAW,KAAK,CAAC;AACtB,SAAK,aAAa,KAAK,CAAC,KAAK,OAAO,QAAQ,MAAM,EAAE,EAAE,YAAY;AAClE,SAAK,UACH,KAAK,cAAc,QACf,CAAC,QAAQ,OAAO,OAAO,KAAK,IAC5B,KAAK,cAAc,aACjB,CAAC,QAAQ,OAAO,OAAO,QAAQ,IAC/B,CAAC,QAAQ,OAAO,KAAK;AAC7B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,QAA8B;AAC5B,WAAO,IAAI,sBAAqB,KAAK,MAAM,CAAC,KAAK,UAAU,KAAK,SAAS,GAAG,KAAK,WAAW;AAAA,EAC9F;AACF;;;ACvKO,SAAS,oBAAoB,MAAsB;AACxD,SAAO,KAAK,YAAY;AAC1B;AAEO,SAAS,UAAU,QAA0C;AAClE,QAAM,SAAS,oBAAI,IAAsB;AACzC,QAAM,UAAU,kBAAkB,MAAM,OAAO,QAAQ,IAAI,OAAO,QAAQ,MAAM;AAChF,aAAW,CAAC,MAAM,KAAK,KAAK,SAAS;AACnC,WAAO,IAAI,oBAAoB,IAAI,GAAG,KAAK;AAAA,EAC7C;AACA,SAAO;AACT;AAEO,SAAS,SAAS,KAAe;AACtC,QAAM,SAAS,oBAAI,IAAsB;AACzC,aAAW,CAAC,MAAM,KAAK,KAAK,IAAI,QAAQ;AACtC,WAAO,IAAI,MAAM,cAAc,KAAK,CAAC;AAAA,EACvC;AACA,SAAO,EAAE,OAAO,IAAI,OAAO,OAAO;AACpC;;;ACpBA,IAAM,yBAAyB;AAuCxB,IAAM,QAAN,MAAM,OAAM;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACQ,YAA0B;AAAA;AAAA,EAE1B,iBAA2D;AAAA,EACnE,SAAS;AAAA,EAET,YAAY,MAAc,SAAuB,UAAwB,CAAC,GAAG;AAC3E,SAAK,OAAO;AACZ,SAAK,UAAU,QAAQ,IAAI,WAAW;AACtC,SAAK,OAAO,oBAAI,IAAI;AACpB,SAAK,YAAY;AACjB,SAAK,cAAc,SAAS,QAAQ,eAAe,CAAC,CAAC;AACrD,SAAK,UAAU,CAAC,GAAI,QAAQ,WAAW,CAAC,CAAE;AAC1C,SAAK,cAAc,QAAQ,eAAe;AAC1C,SAAK,eAAe,QAAQ,gBAAgB;AAC5C,SAAK,SAAS,QAAQ,UAAU;AAChC,SAAK,gBAAgB,oBAAI,IAAI;AAC7B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,kBAA0C;AACxC,WAAO,KAAK,uBAAuB;AAAA,EACrC;AAAA,EAEA,IAAI,OAA+B;AACjC,QAAI;AACF,aAAO,KAAK,KAAK,IAAI,eAAe,KAAK,CAAC;AAAA,IAC5C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,SAAS,OAAkC;AACzC,QAAI,UAAU,QAAQ,KAAK,aAAc,QAAO;AAChD,QAAI;AACF,aAAO,KAAK,IAAI,QAAQ,OAAO,OAAO,CAAC;AAAA,IACzC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,iBAAuB;AAC7B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,UAAU,KAAgB;AAChC,SAAK,cAAc,GAAG;AACtB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEQ,gBAAgB,QAAa,OAAkB;AACrD,SAAK,gBAAgB,MAAM;AAC3B,SAAK,cAAc,KAAK;AACxB,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA,EAGA,kBAA2B;AACzB,QAAI,KAAK,gBAAgB,KAAK,UAAU,KAAK,QAAQ,SAAS,KAAK,KAAK,YAAY,SAAS,EAAG,QAAO;AACvG,eAAW,UAAU,KAAK,SAAS;AACjC,UAAI,OAAO,WAAW,OAAO,cAAc,OAAO,UAAU,OAAO,aAAa,OAAO,YAAa,QAAO;AAAA,IAC7G;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,aAAqB,OAA+B;AACjE,QAAI,CAAC,KAAK,mBAAmB,WAAW,EAAG,QAAO;AAClD,UAAM,MAAM,KAAK,eAAgB,IAAI,WAAW;AAChD,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,SAAS,KAAK,QAAQ,KAAK,CAAC,SAAS,KAAK,cAAc,WAAW;AACzE,UAAM,MAAM,kBAAkB,CAAC,sBAAsB,OAAO,QAAQ,WAAW,QAAQ,CAAC,CAAC;AACzF,QAAI,QAAQ,KAAM,QAAO,CAAC;AAC1B,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,QAAI,CAAC,UAAU,OAAO,WAAW,EAAG,QAAO,CAAC;AAC5C,UAAM,OAAc,CAAC;AACrB,eAAW,SAAS,QAAQ;AAC1B,YAAM,MAAM,KAAK,KAAK,IAAI,KAAK;AAC/B,UAAI,IAAK,MAAK,KAAK,GAAG;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB,aAA8B;AAC/C,QAAI,KAAK,UAAU,KAAK,KAAK,OAAO,uBAAwB,QAAO;AACnE,UAAM,SAAS,KAAK,QAAQ,KAAK,CAAC,SAAS,KAAK,cAAc,WAAW;AACzE,QAAI,CAAC,OAAQ,QAAO;AACpB,SAAK,mBAAmB,oBAAI,IAAI;AAChC,QAAI,KAAK,eAAe,IAAI,WAAW,EAAG,QAAO;AACjD,UAAM,MAAM,oBAAI,IAAqB;AACrC,UAAM,UAAU,OAAO,WAAW;AAClC,eAAW,OAAO,KAAK,KAAK,OAAO,GAAG;AACpC,YAAM,MAAM,kBAAkB,CAAC,sBAAsB,IAAI,OAAO,IAAI,WAAW,KAAK,MAAM,OAAO,CAAC,CAAC;AACnG,UAAI,QAAQ,KAAM;AAClB,YAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAI,OAAQ,QAAO,KAAK,IAAI,KAAK;AAAA,UAC5B,KAAI,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;AAAA,IAC/B;AACA,SAAK,eAAe,IAAI,aAAa,GAAG;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,sBAA4B;AAC1B,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,cAAc,KAAgB;AACpC,QAAI,CAAC,KAAK,eAAgB;AAC1B,eAAW,CAAC,aAAa,GAAG,KAAK,KAAK,gBAAgB;AACpD,YAAM,SAAS,KAAK,QAAQ,KAAK,CAAC,SAAS,KAAK,cAAc,WAAW;AACzE,YAAM,MAAM,kBAAkB;AAAA,QAC5B,sBAAsB,IAAI,OAAO,IAAI,WAAW,KAAK,MAAM,QAAQ,WAAW,QAAQ;AAAA,MACxF,CAAC;AACD,UAAI,QAAQ,KAAM;AAClB,YAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAI,QAAQ;AACV,YAAI,CAAC,OAAO,KAAK,CAAC,OAAOE,WAAU,IAAI,IAAI,KAAK,CAAC,EAAG,QAAO,KAAK,IAAI,KAAK;AAAA,MAC3E,MAAO,KAAI,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;AAAA,IACjC;AAAA,EACF;AAAA,EAEQ,gBAAgB,KAAgB;AACtC,QAAI,CAAC,KAAK,eAAgB;AAC1B,eAAW,CAAC,aAAa,GAAG,KAAK,KAAK,gBAAgB;AACpD,YAAM,SAAS,KAAK,QAAQ,KAAK,CAAC,SAAS,KAAK,cAAc,WAAW;AACzE,YAAM,MAAM,kBAAkB;AAAA,QAC5B,sBAAsB,IAAI,OAAO,IAAI,WAAW,KAAK,MAAM,QAAQ,WAAW,QAAQ;AAAA,MACxF,CAAC;AACD,UAAI,QAAQ,KAAM;AAClB,YAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAI,CAAC,OAAQ;AACb,YAAM,QAAQ,OAAO,UAAU,CAAC,OAAOA,WAAU,IAAI,IAAI,KAAK,CAAC;AAC/D,UAAI,SAAS,EAAG,QAAO,OAAO,OAAO,CAAC;AACtC,UAAI,OAAO,WAAW,EAAG,KAAI,OAAO,GAAG;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,OAAO,OAA8B,SAAgC;AACnE,SAAK,cAAc;AACnB,UAAM,WAAW,YAAY,KAAK,IAAI,QAAQ,EAAE,QAAQ,MAAM;AAC9D,UAAM,SAAS,SAAS,WACpB,SAAS,kBAAkB,MACzB,SAAS,SACT,UAAU,SAAS,MAAM,IAC3B,KAAK,cAAc,SAAS,MAAM;AAEtC,QAAI,KAAK,cAAc;AACrB,UAAI,SAAS,UAAU,QAAW;AAChC,cAAM,IAAI,YAAY,SAAS,KAAK,IAAI,8BAA8B,OAAO;AAAA,MAC/E;AACA,YAAMC,SAAQ,eAAe,KAAK,cAAc,CAAC;AACjD,YAAMC,aAAiB,EAAE,OAAAD,QAAO,OAAO;AACvC,UAAI,CAAC,SAAS,aAAc,MAAK,SAASC,UAAS;AACnD,YAAM,aAAa,KAAK,eAAe,MAAM;AAC7C,UAAI,KAAK,cAAc,IAAI,UAAU,GAAG;AACtC,cAAM,mBAAmB,KAAK,MAAM,KAAK,kBAAkB,CAAC;AAAA,MAC9D;AACA,WAAK,cAAc,IAAI,YAAYA,UAAS;AAC5C,WAAK,KAAK,IAAID,QAAOC,UAAS;AAC9B,WAAK,iBAAiBD,MAAK;AAC3B,WAAK,UAAUC,UAAS;AACxB,aAAOD;AAAA,IACT;AAEA,UAAM,QAAQ,KAAK,uBAAuB;AAC1C,QAAI,QAAQ,SAAS;AAErB,QAAI,OAAO;AACT,YAAM,QAAQ,OAAO,IAAI,oBAAoB,MAAM,IAAI,CAAC,KAAK;AAC7D,UAAI,UAAU,UAAa,UAAU,KAAM,SAAQ,QAAQ,OAAO,MAAM,IAAI;AAAA,IAC9E;AACA,YAAQ,eAAe,SAAS,KAAK,cAAc,CAAC;AAEpD,QAAI,KAAK,KAAK,IAAI,KAAK,GAAG;AACxB,YAAM,IAAI;AAAA,QACR,6BAA6B,KAAK,IAAI;AAAA,QACtC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAO,QAAO,IAAI,oBAAoB,MAAM,IAAI,GAAG,KAAK;AAE5D,UAAM,YAAiB,EAAE,OAAO,OAAO;AACvC,QAAI,CAAC,SAAS,aAAc,MAAK,SAAS,SAAS;AACnD,SAAK,KAAK,IAAI,OAAO,SAAS;AAC9B,SAAK,iBAAiB,KAAK;AAC3B,SAAK,UAAU,SAAS;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,OAAc,SAAqC;AACxD,SAAK,cAAc;AACnB,UAAM,MAAM,eAAe,KAAK;AAChC,UAAM,WAAW,KAAK,KAAK,IAAI,GAAG;AAClC,QAAI,CAAC,SAAU,QAAO;AAEtB,UAAM,SAAS,IAAI,IAAI,SAAS,MAAM;AACtC,UAAM,WAAW,UAAU,OAAO;AAClC,eAAW,CAAC,MAAM,KAAK,KAAK,UAAU;AACpC,YAAM,SAAS,KAAK,OAAO,IAAI;AAC/B,aAAO,IAAI,oBAAoB,OAAO,IAAI,GAAG,cAAc,cAAc,KAAK,GAAG,OAAO,QAAQ,CAAC;AAAA,IACnG;AAEA,QAAI,KAAK,cAAc;AACrB,YAAM,gBAAgB,KAAK,eAAe,SAAS,MAAM;AACzD,YAAM,gBAAgB,KAAK,eAAe,MAAM;AAChD,UAAI,kBAAkB,iBAAiB,KAAK,cAAc,IAAI,aAAa,GAAG;AAC5E,cAAM,mBAAmB,KAAK,MAAM,KAAK,kBAAkB,CAAC;AAAA,MAC9D;AACA,YAAMC,aAAiB,EAAE,OAAO,KAAK,OAAO;AAC5C,WAAK,SAASA,YAAW,GAAG;AAC5B,UAAI,kBAAkB,cAAe,MAAK,cAAc,OAAO,aAAa;AAC5E,WAAK,cAAc,IAAI,eAAeA,UAAS;AAC/C,WAAK,KAAK,IAAI,KAAKA,UAAS;AAC5B,WAAK,gBAAgB,UAAUA,UAAS;AACxC,aAAOA;AAAA,IACT;AAEA,UAAM,QAAQ,KAAK,uBAAuB;AAC1C,UAAM,YAAY,QAAQ,QAAQ,OAAO,IAAI,oBAAoB,MAAM,IAAI,CAAC,KAAK,MAAM,MAAM,IAAI,IAAI;AACrG,QAAI,cAAc,OAAO,KAAK,KAAK,IAAI,SAAS,GAAG;AACjD,YAAM,IAAI;AAAA,QACR,6BAA6B,KAAK,IAAI,IAAI,OAAO,QAAQ,OAAO;AAAA,QAChE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAO,QAAO,IAAI,oBAAoB,MAAM,IAAI,GAAG,SAAS;AAChE,UAAM,YAAiB,EAAE,OAAO,WAAW,OAAO;AAClD,SAAK,SAAS,WAAW,GAAG;AAC5B,QAAI,cAAc,IAAK,MAAK,KAAK,OAAO,GAAG;AAC3C,SAAK,KAAK,IAAI,WAAW,SAAS;AAClC,SAAK,iBAAiB,SAAS;AAC/B,SAAK,gBAAgB,UAAU,SAAS;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,OAAuB;AAC5B,SAAK,cAAc;AACnB,UAAM,MAAM,eAAe,KAAK;AAChC,UAAM,WAAW,KAAK,KAAK,IAAI,GAAG;AAClC,QAAI,CAAC,SAAU,QAAO;AACtB,QAAI,KAAK,aAAc,MAAK,cAAc,OAAO,KAAK,eAAe,SAAS,MAAM,CAAC;AACrF,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,eAAe;AACpB,WAAO,KAAK,KAAK,OAAO,GAAG;AAAA,EAC7B;AAAA,EAEA,CAAC,OAAsB;AACrB,QAAI,CAAC,KAAK,WAAW;AACnB,UAAI,KAAK,cAAc;AACrB,aAAK,YAAY,CAAC,GAAG,KAAK,cAAc,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,KAAK,mBAAmB,GAAG,CAAC,CAAC;AAAA,MAChG,OAAO;AACL,aAAK,YAAY,CAAC,GAAG,KAAK,KAAK,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,cAAc,EAAE,OAAO,EAAE,KAAK,CAAC;AAAA,MACzF;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAe;AACb,UAAM,OAAO,IAAI,OAAM,KAAK,MAAM,KAAK,SAAS;AAAA,MAC9C,aAAa,KAAK;AAAA,MAClB,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,SAAK,YAAY,KAAK;AACtB,eAAW,CAAC,OAAO,GAAG,KAAK,KAAK,KAAM,MAAK,KAAK,IAAI,OAAO,SAAS,GAAG,CAAC;AACxE,eAAW,CAAC,YAAY,GAAG,KAAK,KAAK,cAAe,MAAK,cAAc,IAAI,YAAY,SAAS,GAAG,CAAC;AACpG,WAAO;AAAA,EACT;AAAA,EAEA,SAAe;AACb,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,gBAAsB;AAC5B,QAAI,KAAK,OAAQ,OAAM,IAAI,YAAY,0CAA0C,OAAO;AAAA,EAC1F;AAAA;AAAA,EAGA,uBAA6B;AAC3B,QAAI,CAAC,KAAK,aAAc;AACxB,SAAK,cAAc,MAAM;AACzB,eAAW,OAAO,KAAK,KAAK,OAAO,GAAG;AACpC,WAAK,cAAc,IAAI,KAAK,eAAe,IAAI,MAAM,GAAG,GAAG;AAAA,IAC7D;AACA,SAAK,eAAe;AACpB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEQ,cAAc,OAAyC;AAC7D,UAAM,WAAW,UAAU,KAAK;AAChC,eAAW,QAAQ,SAAS,KAAK,EAAG,MAAK,OAAO,IAAI;AAEpD,UAAM,SAAS,oBAAI,IAAsB;AACzC,eAAW,UAAU,KAAK,SAAS;AACjC,YAAM,MAAM,oBAAoB,OAAO,IAAI;AAC3C,aAAO;AAAA,QACL;AAAA,QACA,KAAK,SACD,iBAAiB,cAAc,SAAS,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,YAAY,IAAI,KAAK,MAAM,OAAO,IAAI,IACxG,cAAc,cAAc,SAAS,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,QAAQ;AAAA,MAC7E;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,OAAO,MAA0B;AACvC,UAAM,MAAM,oBAAoB,IAAI;AACpC,UAAM,SAAS,KAAK,QAAQ,KAAK,CAAC,SAAS,oBAAoB,KAAK,IAAI,MAAM,GAAG;AACjF,QAAI,CAAC,OAAQ,OAAM,IAAI,YAAY,mBAAmB,IAAI,IAAI,gBAAgB;AAC9E,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,KAAU,eAA6B;AACtD,eAAW,UAAU,KAAK,SAAS;AACjC,YAAM,QAAQ,IAAI,OAAO,IAAI,oBAAoB,OAAO,IAAI,CAAC,KAAK;AAClE,WAAK,OAAO,WAAW,OAAO,eAAe,UAAU,MAAM;AAC3D,cAAM,WAAW,OAAO,aAAa,uBAAuB;AAC5D,cAAM,OAAO,OAAO,aAAa,iCAAiC;AAClE,cAAM,IAAI;AAAA,UACR,GAAG,OAAO,aAAa,gBAAgB,UAAU,uBAAuB,KAAK,IAAI,IAAI,OAAO,IAAI;AAAA,UAChG;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,KAAK,iBAAiB;AAGzC,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,iBAAW,SAAS,YAAY;AAC9B,cAAM,SAAS,MAAM,IAAI,CAAC,SAAS,IAAI,OAAO,IAAI,oBAAoB,IAAI,CAAC,KAAK,IAAI;AACpF,YAAI,OAAO,KAAK,CAAC,UAAU,UAAU,IAAI,EAAG;AAC5C,mBAAW,SAAS,KAAK,KAAK,OAAO,GAAG;AACtC,cAAI,kBAAkB,UAAa,MAAM,UAAU,cAAe;AAClE,cACE,OAAO,MAAM,CAAC,OAAO,UAAU;AAC7B,kBAAM,SAAS,KAAK,OAAO,MAAM,KAAK,CAAE;AACxC,kBAAM,aAAa,MAAM,OAAO,IAAI,oBAAoB,MAAM,KAAK,CAAE,CAAC,KAAK;AAC3E,kBAAM,YAAY,OAAO,WAAW;AACpC,mBAAO,qBAAqB,OAAO,YAAY,SAAS,MAAM;AAAA,UAChE,CAAC,GACD;AACA,kBAAM,YAAY,MAAM,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,IAAI,IAAI,EAAE,EAAE,KAAK,IAAI;AACvE,kBAAM,IAAI;AAAA,cACR,6BAA6B,SAAS;AAAA,cACtC;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,WAAW,SAAS,GAAG;AAAA,IAGlC;AAAA,EACF;AAAA,EAEQ,mBAA+B;AACrC,UAAM,OAAO,KAAK,QAAQ,OAAO,CAAC,WAAW,OAAO,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,CAAC;AACzF,QAAI,CAAC,KAAK,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,aAAa,GAAG;AAC7E,YAAM,UAAU,KAAK,QAAQ,OAAO,CAAC,WAAW,OAAO,UAAU,EAAE,IAAI,CAAC,WAAW,OAAO,IAAI;AAC9F,UAAI,QAAQ,SAAS,EAAG,MAAK,KAAK,OAAO;AAAA,IAC3C;AACA,eAAW,cAAc,KAAK,aAAa;AACzC,UAAI,WAAW,SAAS,YAAY,WAAW,SAAS,eAAe;AACrE,aAAK,KAAK,WAAW,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC;AAAA,MAC3D;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAkC;AACxC,UAAM,eAAe,KAAK,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,aAAa;AAC5F,QAAI,cAAc;AAChB,aAAO,aAAa,QAAQ,IAAI,CAAC,WAAW,KAAK,OAAO,OAAO,IAAI,CAAC;AAAA,IACtE;AACA,WAAO,KAAK,QAAQ,OAAO,CAAC,WAAW,OAAO,UAAU;AAAA,EAC1D;AAAA,EAEQ,eAAe,QAAuC;AAC5D,WAAO,KAAK,kBAAkB,EAC3B,IAAI,CAAC,WAAW;AACf,YAAM,QAAQ,OAAO,IAAI,oBAAoB,OAAO,IAAI,CAAC,KAAK;AAC9D,YAAM,aAAa,sBAAsB,OAAO,OAAO,WAAW,QAAQ;AAC1E,aAAO,qBAAqB,UAAU;AAAA,IACxC,CAAC,EACA,KAAK,IAAI;AAAA,EACd;AAAA,EAEQ,mBAAmB,MAAW,OAAoB;AACxD,eAAW,UAAU,KAAK,kBAAkB,GAAG;AAC7C,YAAM,YAAY,KAAK,OAAO,IAAI,oBAAoB,OAAO,IAAI,CAAC,KAAK;AACvE,YAAM,aAAa,MAAM,OAAO,IAAI,oBAAoB,OAAO,IAAI,CAAC,KAAK;AACzE,YAAM,aAAa,OAAO,UACtB,qBAAqB,WAAW,YAAY,OAAO,OAAO,IAC1D,WAAW,WAAW,UAAU;AACpC,UAAI,eAAe,EAAG,QAAO,cAAc;AAAA,IAC7C;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,yBAAiD;AACvD,QAAI,KAAK,aAAc,QAAO;AAC9B,UAAM,UAAU,KAAK,QAAQ,OAAO,CAAC,WAAW,OAAO,UAAU;AACjE,QAAI,QAAQ,WAAW,KAAK,QAAQ,CAAC,EAAG,UAAU,KAAK,EAAE,YAAY,MAAM,UAAW,QAAO;AAC7F,WAAO,QAAQ,CAAC;AAAA,EAClB;AAAA,EAEQ,gBAAuB;AAC7B,QAAI,YAAY,eAAe,KAAK,SAAS;AAC7C,WAAO,KAAK,KAAK,IAAI,SAAS,EAAG,aAAY,eAAe,SAAS;AACrE,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,OAAoB;AAC3C,QAAI,cAAc,OAAO,KAAK,SAAS,KAAK,EAAG,MAAK,YAAY,eAAe,KAAK;AAAA,EACtF;AACF;AAEO,SAAS,eACd,MACA,UACA,UAAqF,CAAC,GAC1E;AACZ,SAAO;AAAA,IACL;AAAA,IACA,WAAW,KAAK,YAAY;AAAA,IAC5B;AAAA,IACA,UAAU,qBAAqB,QAAQ;AAAA,IACvC,SAAS,QAAQ,WAAW;AAAA,IAC5B,YAAY,QAAQ,cAAc;AAAA,IAClC,eAAe,QAAQ,iBAAiB;AAAA,IACxC,aAAa,QAAQ,eAAe;AAAA,IACpC,QAAQ,QAAQ,UAAU;AAAA,IAC1B,SAAS,QAAQ,WAAW;AAAA,IAC5B,WAAW,QAAQ,aAAa;AAAA,EAClC;AACF;AAEA,SAAS,YAAY,QAAgC;AACnD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW,OAAO,aAAa,OAAO,KAAK,YAAY;AAAA,IACvD,aAAa,OAAO,gBAAgB,OAAO,OAAO,SAAS,OAAO,WAAW;AAAA,IAC7E,WACE,OAAO,cAAc,OAAO,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU,IAAI,GAAG,QAAQ,OAAO,UAAU,OAAO;AAAA,EAChH;AACF;AAEA,SAAS,SAAY,OAAa;AAChC,SAAO,gBAAgB,KAAK;AAC9B;AAEA,SAAS,YAAY,OAAkD;AACrE,SAAO,EAAE,iBAAiB,QAAQ,YAAY;AAChD;AAEA,SAAS,QAAQ,OAAiB,QAAuB;AACvD,MAAI,OAAO,UAAU,SAAU,QAAO,eAAe,KAAK;AAC1D,MAAI,OAAO,UAAU,YAAY,OAAO,cAAc,KAAK,EAAG,QAAO;AACrE,QAAM,IAAI;AAAA,IACR,qDAAqD,MAAM;AAAA,IAC3D;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,eAAe,OAAqB;AAC3C,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,OAAO,cAAc,KAAK;AAC7B,YAAM,IAAI,YAAY,0CAA0C,qBAAqB,iBAAiB;AACxG,WAAO;AAAA,EACT;AACA,MAAI,SAAS,OAAO,OAAO,gBAAgB,KAAK,SAAS,OAAO,OAAO,gBAAgB,EAAG,QAAO,OAAO,KAAK;AAC7G,SAAO;AACT;AAEA,SAAS,eAAe,OAAqB;AAC3C,MAAI,OAAO,UAAU,SAAU,QAAO,QAAQ;AAC9C,MAAI,QAAQ,OAAO,iBAAkB,QAAO,QAAQ;AACpD,SAAO,OAAO,KAAK,IAAI;AACzB;AAEA,SAAS,cAAc,MAAa,OAAsB;AACxD,QAAM,IAAI,OAAO,SAAS,WAAW,OAAO,OAAO,IAAI;AACvD,QAAM,IAAI,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC1D,SAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAClC;AAEA,SAASF,WAAU,MAAa,OAAuB;AACrD,SAAO,OAAO,SAAS,YAAY,OAAO,UAAU,WAAW,OAAO,IAAI,MAAM,OAAO,KAAK,IAAI,SAAS;AAC3G;AAEA,SAAS,qBAAqB,OAAyB;AACrD,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,MAAM,SAAS,CAAC;AAC7D,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK;AAClD,MAAI,iBAAiB,WAAY,QAAO,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,GAAG,CAAC;AAC1E,SAAO,OAAO,MAAM,KAAK;AAC3B;AAEA,SAAS,mBAAmB,WAAmB,SAA8B;AAC3E,QAAM,YAAY,QAAQ,IAAI,CAAC,WAAW,GAAG,SAAS,IAAI,OAAO,IAAI,EAAE,EAAE,KAAK,IAAI;AAClF,QAAM,IAAI,YAAY,6BAA6B,SAAS,IAAI,sBAAsB,8BAA8B;AACtH;;;AC9fO,IAAM,gBAAN,MAAM,eAAc;AAAA,EACzB,SAAS,oBAAI,IAAmB;AAAA,EAChC,gBAAgB,oBAAI,IAA6B;AAAA,EACjD,QAAQ,oBAAI,IAAsB;AAAA,EAClC,UAAU,oBAAI,IAAuB;AAAA,EACrC,WAAW,oBAAI,IAAyB;AAAA;AAAA,EAExC,WAAW,oBAAI,IAAwD;AAAA,EACvE,kBAAyB;AAAA,EACzB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EAEd,kBAAkB,QAAuB,mBAA2C;AAClF,QAAI,WAAW,QAAQ,OAAO,YAAY,MAAM,UAAU,OAAO,YAAY,MAAM,OAAQ,QAAO;AAClG,UAAM,QAAQ,KAAK,SAAS,IAAI,OAAO,YAAY,CAAC;AACpD,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,YAAY,kBAAkB,qBAAqB,MAAM,IAAI,eAAe;AAAA,IACxF;AACA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,iBAAiB,OAA6B;AAC5C,QAAI,KAAK,OAAO,IAAI,MAAM,MAAM,IAAI,CAAC,MAAM,MAAO,QAAO;AACzD,eAAW,EAAE,MAAM,KAAK,KAAK,SAAS,OAAO,GAAG;AAC9C,UAAI,MAAM,OAAO,IAAI,MAAM,MAAM,IAAI,CAAC,MAAM,MAAO,QAAO;AAAA,IAC5D;AACA,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,MAAqB;AAC5B,UAAM,EAAE,QAAQ,KAAK,IAAI,mBAAmB,IAAI;AAChD,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK,kBAAkB,QAAQ,IAAI,EAAE,SAAS,IAAI;AAAA,IAC3D;AACA,UAAM,MAAM,MAAM,IAAI;AACtB,QAAI,KAAK,cAAc,IAAI,GAAG,GAAG;AAC/B,YAAM,IAAI,YAAY,kBAAkB,IAAI,IAAI,eAAe;AAAA,IACjE;AACA,UAAM,QAAQ,KAAK,OAAO,IAAI,GAAG;AACjC,QAAI,CAAC,MAAO,OAAM,IAAI,YAAY,kBAAkB,IAAI,IAAI,eAAe;AAC3E,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,MAAgC;AAC9C,UAAM,EAAE,QAAQ,KAAK,IAAI,mBAAmB,IAAI;AAChD,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK,kBAAkB,QAAQ,IAAI,EAAE,gBAAgB,IAAI;AAAA,IAClE;AACA,UAAM,MAAM,MAAM,IAAI;AACtB,UAAM,QAAQ,KAAK,cAAc,IAAI,GAAG;AACxC,QAAI,CAAC,SAAU,MAAM,SAAS,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS,QAAS;AACvF,YAAM,IAAI,YAAY,kBAAkB,IAAI,IAAI,eAAe;AAAA,IACjE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB,MAA+B;AAChD,UAAM,EAAE,QAAQ,KAAK,IAAI,mBAAmB,IAAI;AAChD,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK,kBAAkB,QAAQ,IAAI,EAAE,mBAAmB,IAAI;AAAA,IACrE;AACA,UAAM,MAAM,MAAM,IAAI;AACtB,UAAM,QAAQ,KAAK,cAAc,IAAI,GAAG;AACxC,QAAI,CAAC,MAAO,OAAM,IAAI,YAAY,kBAAkB,IAAI,IAAI,eAAe;AAC3E,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,MAAuB;AACpC,UAAM,EAAE,QAAQ,KAAK,IAAI,mBAAmB,IAAI;AAChD,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK,kBAAkB,QAAQ,IAAI,EAAE,eAAe,IAAI;AAAA,IACjE;AACA,WAAO,KAAK,cAAc,IAAI,MAAM,IAAI,CAAC;AAAA,EAC3C;AAAA,EAEA,WAAW,MAAuB;AAChC,UAAM,QAAQ,KAAK,cAAc,IAAI,MAAM,mBAAmB,IAAI,EAAE,IAAI,CAAC;AACzE,WAAO,CAAC,CAAC,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS;AAAA,EACtF;AAAA,EAEA,mBAAmB,MAA8B,cAA6B,MAAuB;AACnG,UAAM,EAAE,QAAQ,KAAK,IAAI,mBAAmB,KAAK,IAAI;AAErD,QAAI,WAAW,QAAQ,OAAO,YAAY,MAAM,UAAU,OAAO,YAAY,MAAM,QAAQ;AACzF,aAAO,KAAK,kBAAkB,QAAQ,KAAK,IAAI,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,KAAK,GAAG,WAAW;AAAA,IAC1G;AACA,UAAM,MAAM,MAAM,IAAI;AACtB,UAAM,WAAW,KAAK,cAAc,IAAI,GAAG;AAC3C,QAAI,YAAY,KAAK,YAAa,QAAO;AACzC,SAAK,0BAA0B,IAAI;AACnC,UAAM,SAAS,KAAK,OAAO,YAAY;AACvC,QAAI;AACJ,QAAI,WAAW,UAAU,WAAW,UAAU,WAAW,QAAQ;AAC/D,cAAQ,IAAI,iBAAiB,MAAM,KAAK,YAAY,aAAa,MAAM;AAAA,IACzE,WAAW,WAAW,aAAa;AACjC,cAAQ,IAAI,qBAAqB,MAAM,KAAK,YAAY,WAAW;AAAA,IACrE,WAAW,WAAW,kBAAkB,WAAW,WAAW;AAE5D,cAAQ,IAAI,iBAAiB,MAAM,KAAK,WAAW,SAAS,KAAK,aAAa,CAAC,OAAO,GAAG,aAAa,MAAM;AAAA,IAC9G,WAAW,WAAW,WAAW,WAAW,aAAa;AACvD,cAAQ,IAAI,kBAAkB,MAAM,KAAK,YAAY,WAAW,aAAa,WAAW;AAAA,IAC1F,WAAW,WAAW,UAAU;AAC9B,cAAQ,IAAI,mBAAmB,MAAM,KAAK,WAAW,CAAC,KAAK,MAAM,WAAW;AAAA,IAC9E,WAAW,WAAW,YAAY;AAChC,cAAQ,IAAI,qBAAqB,MAAM,WAAW;AAAA,IACpD,WAAW,WAAW,eAAe;AACnC,cAAQ,IAAI,uBAAuB,MAAM,WAAW;AAAA,IACtD,OAAO;AACL,YAAM,IAAI,YAAY,mBAAmB,KAAK,MAAM,IAAI,aAAa;AAAA,IACvE;AACA,SAAK,cAAc,IAAI,KAAK,KAAK;AACjC,SAAK;AACL,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,MAAuB,cAA6B,MAAa;AAC3E,UAAM,EAAE,QAAQ,KAAK,IAAI,mBAAmB,KAAK,IAAI;AACrD,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK,kBAAkB,QAAQ,KAAK,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,KAAK,GAAG,WAAW;AAAA,IACnG;AACA,UAAM,MAAM,MAAM,IAAI;AACtB,UAAM,WAAW,KAAK,OAAO,IAAI,GAAG;AACpC,QAAI,YAAY,KAAK,YAAa,QAAO;AACzC,SAAK,0BAA0B,IAAI;AAEnC,UAAM,cAAc,oBAAI,IAAY;AACpC,UAAM,oBAAoB,IAAI;AAAA,MAC5B,KAAK,YACF,OAAO,CAAC,eAAe,WAAW,SAAS,aAAa,EACxD,QAAQ,CAAC,eAAe,WAAW,QAAQ,IAAI,CAAC,WAAW,MAAM,OAAO,IAAI,CAAC,CAAC;AAAA,IACnF;AACA,QAAI,KAAK,YAAY,OAAO,CAAC,eAAe,WAAW,SAAS,aAAa,EAAE,SAAS,GAAG;AACzF,YAAM,IAAI,YAAY,uCAAuC,oBAAoB;AAAA,IACnF;AACA,UAAM,qBAAqB,KAAK,QAAQ;AAAA,MAAO,CAAC,WAC9C,OAAO,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,aAAa;AAAA,IAC3E,EAAE;AACF,QAAI,qBAAqB,GAAG;AAC1B,YAAM,IAAI,YAAY,uCAAuC,oBAAoB;AAAA,IACnF;AAEA,UAAM,UAAwB,KAAK,QAAQ,IAAI,CAAC,eAAe;AAC7D,YAAM,YAAY,MAAM,WAAW,IAAI;AACvC,UAAI,YAAY,IAAI,SAAS,EAAG,OAAM,IAAI,YAAY,0BAA0B,WAAW,IAAI,IAAI,OAAO;AAC1G,kBAAY,IAAI,SAAS;AAEzB,YAAM,UAAU,WAAW,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,aAAa;AAC7F,YAAM,aAAa,YAAY,UAAa,kBAAkB,IAAI,SAAS;AAC3E,YAAM,gBAAgB,SAAS,SAAS,iBAAiB,QAAQ;AACjE,UAAI,iBAAiB,WAAW,UAAU,KAAK,EAAE,YAAY,MAAM,WAAW;AAC5E,cAAM,IAAI,YAAY,2DAA2D,aAAa;AAAA,MAChG;AACA,YAAM,oBAAoB,WAAW,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,SAAS;AACnG,YAAM,sBAAsB,WAAW,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,WAAW;AAEvG,aAAO;AAAA,QACL,MAAM,WAAW;AAAA,QACjB,UAAU,WAAW;AAAA,QACrB,UAAU,qBAAqB,WAAW,QAAQ;AAAA,QAClD,SAAS,WAAW,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,UAAU;AAAA,QACnF;AAAA,QACA;AAAA,QACA,aAAa,WAAW,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,SAAS,GAAG,QAAQ;AAAA,QACjG,QAAQ,WAAW,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,QAAQ;AAAA,QAChF,SAAS,mBAAmB,SAAS,YAAY,kBAAkB,OAAO;AAAA,QAC1E,WACE,qBAAqB,SAAS,cAC1B,EAAE,MAAM,oBAAoB,MAAM,QAAQ,oBAAoB,OAAO,IACrE;AAAA,MACR;AAAA,IACF,CAAC;AAED,eAAW,cAAc,KAAK,aAAa;AACzC,YAAM,aACJ,WAAW,SAAS,iBAAiB,WAAW,SAAS,WACrD,WAAW,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,IAC9C,WAAW,SAAS,gBAClB,WAAW,UACX,CAAC;AACT,iBAAW,QAAQ,YAAY;AAC7B,YAAI,CAAC,YAAY,IAAI,MAAM,IAAI,CAAC,EAAG,OAAM,IAAI,YAAY,mBAAmB,IAAI,IAAI,gBAAgB;AAAA,MACtG;AAAA,IACF;AACA,UAAM,mBAAmB,KAAK,QAAQ;AAAA,MAAK,CAAC,WAC1C,OAAO,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,aAAa;AAAA,IAC3E;AACA,QAAI,oBAAoB,kBAAkB,OAAO,GAAG;AAClD,YAAM,IAAI,YAAY,uCAAuC,oBAAoB;AAAA,IACnF;AACA,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,YAAM,IAAI,YAAY,uCAAuC,QAAQ;AAAA,IACvE;AACA,QAAI,KAAK,QAAQ;AACf,iBAAW,cAAc,KAAK,SAAS;AACrC,cAAM,WAAW,WAAW,UAAU,KAAK,KAAK;AAChD,YAAI,CAAC,iBAAiB,QAAQ,EAAG,mBAAkB,MAAM,WAAW,MAAM,YAAY,MAAM;AAAA,MAC9F;AAAA,IACF;AAEA,UAAM,wBAAwB,CAAC,GAAG,KAAK,WAAW;AAClD,eAAW,cAAc,KAAK,SAAS;AACrC,iBAAW,cAAc,WAAW,aAAa;AAC/C,YAAI,WAAW,SAAS,SAAS;AAC/B,gCAAsB,KAAK,EAAE,MAAM,SAAS,MAAM,WAAW,MAAM,MAAM,KAAK,CAAC;AAAA,QACjF,WAAW,WAAW,SAAS,cAAc;AAC3C,gCAAsB,KAAK;AAAA,YACzB,MAAM;AAAA,YACN,SAAS,CAAC,WAAW,IAAI;AAAA,YACzB,UAAU,WAAW;AAAA,YACrB,YAAY,WAAW;AAAA,YACvB,UAAU,WAAW;AAAA,YACrB,UAAU,WAAW;AAAA,YACrB,MAAM;AAAA,YACN,YAAY,WAAW;AAAA,YACvB,mBAAmB,WAAW;AAAA,UAChC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,UAAM,QAAQ,IAAI,MAAM,MAAM,SAAS;AAAA,MACrC,aAAa;AAAA,MACb;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,QAAI,KAAK,cAAc;AACrB,YAAM,KAAK,QAAQ,OAAO,CAAC,WAAW,OAAO,UAAU;AACvD,UAAI,GAAG,WAAW,GAAG;AACnB,cAAM,IAAI,YAAY,kCAAkC,MAAM,OAAO;AAAA,MACvE;AAAA,IACF;AACA,SAAK,OAAO,IAAI,KAAK,KAAK;AAC1B,SAAK,0BAA0B,KAAK;AACpC,SAAK;AACL,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,0BAA0B,OAAoB;AACpD,QAAI,MAAM;AACV,UAAM,MAAM,CAAC,SAA0B,WAA0B;AAC/D,UAAI,QAAQ,WAAW,EAAG;AAE1B,UACE,UACA,QAAQ,WAAW,KACnB,CAAC,MAAM,gBACP,MAAM,gBAAgB,GAAG,KAAK,YAAY,MAAM,QAAQ,CAAC,EAAG,KAAK,YAAY,GAC7E;AACA;AAAA,MACF;AACA,YAAM,OAAO,oBAAoB,MAAM,IAAI,IAAI,KAAK;AACpD,YAAM,QAAmB;AAAA,QACvB;AAAA,QACA,WAAW,MAAM;AAAA,QACjB;AAAA,QACA,SAAS,gBAAgB,OAAO;AAAA,QAChC,OAAO;AAAA,QACP,aAAa;AAAA,QACb,OAAO,IAAI,WAAW,IAAI;AAAA,MAC5B;AACA,WAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,KAAK;AACnC,YAAM,QAAQ,KAAK,MAAM,IAAI;AAAA,IAC/B;AAEA,UAAM,kBAAkB,MAAM,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,aAAa;AAChG,eAAW,UAAU,MAAM,SAAS;AAClC,UAAI,OAAO,QAAQ;AACjB,YAAI,CAAC,EAAE,MAAM,OAAO,MAAM,SAAS,OAAO,SAAS,OAAO,KAAK,CAAC,GAAG,IAAI;AAAA,MACzE;AACA,UAAI,OAAO,cAAc,CAAC,iBAAiB;AACzC,YAAI,CAAC,EAAE,MAAM,OAAO,MAAM,SAAS,OAAO,SAAS,OAAO,KAAK,CAAC,GAAG,IAAI;AAAA,MACzE;AAAA,IACF;AACA,eAAW,cAAc,MAAM,aAAa;AAC1C,UAAI,WAAW,SAAS,iBAAiB,WAAW,SAAS,UAAU;AACrE,YAAI,WAAW,SAAS,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,MAAc,WAAW,OAAgB;AACjD,UAAM,EAAE,QAAQ,KAAK,IAAI,mBAAmB,IAAI;AAChD,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK,kBAAkB,QAAQ,IAAI,EAAE,UAAU,MAAM,QAAQ;AAAA,IACtE;AACA,UAAM,MAAM,MAAM,IAAI;AACtB,UAAM,QAAQ,KAAK,OAAO,IAAI,GAAG;AACjC,UAAM,UAAU,KAAK,cAAc,IAAI,GAAG;AAC1C,QAAI,CAAC,SAAS,CAAC,SAAS;AACtB,UAAI,SAAU,QAAO;AACrB,YAAM,IAAI,YAAY,kBAAkB,IAAI,IAAI,eAAe;AAAA,IACjE;AACA,QAAI,SAAS;AACX,WAAK,cAAc,OAAO,GAAG;AAC7B,WAAK;AACL,aAAO;AAAA,IACT;AACA,eAAW,CAAC,UAAU,KAAK,KAAK,KAAK,SAAS;AAC5C,UAAI,MAAM,MAAM,SAAS,MAAM,IAAK,MAAK,QAAQ,OAAO,QAAQ;AAAA,IAClE;AACA,SAAK,qBAAqB,IAAI;AAC9B,SAAK,OAAO,OAAO,GAAG;AACtB,SAAK;AACL,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,SAAiB,SAAwB;AACnD,UAAM,EAAE,QAAQ,WAAW,MAAM,QAAQ,IAAI,mBAAmB,OAAO;AACvE,QAAI,cAAc,MAAM;AACtB,aAAO,KAAK,kBAAkB,WAAW,OAAO,EAAE,YAAY,SAAS,mBAAmB,OAAO,EAAE,IAAI;AAAA,IACzG;AACA,UAAM,SAAS,MAAM,OAAO;AAC5B,UAAM,QAAQ,KAAK,iBAAiB,OAAO;AAC3C,UAAM,EAAE,QAAQ,WAAW,MAAM,QAAQ,IAAI,mBAAmB,OAAO;AACvE,QAAI,cAAc,MAAM;AACtB,YAAM,IAAI,YAAY,kBAAkB,OAAO,IAAI,eAAe;AAAA,IACpE;AACA,SAAK,0BAA0B,OAAO;AACtC,SAAK,OAAO,OAAO,MAAM;AACzB,UAAM,OAAO;AACb,SAAK,OAAO,IAAI,MAAM,OAAO,GAAG,KAAK;AACrC,eAAW,SAAS,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,GAAG;AAC9C,UAAI,MAAM,MAAM,SAAS,MAAM,OAAQ;AACvC,WAAK,oBAAoB,KAAK,EAAE,YAAY;AAAA,IAC9C;AACA,eAAW,CAAC,KAAK,OAAO,KAAK,KAAK,UAAU;AAC1C,UAAI,MAAM,QAAQ,SAAS,MAAM,OAAQ;AACzC,WAAK,SAAS,IAAI,KAAK,EAAE,GAAG,SAAS,WAAW,QAAQ,CAAC;AAAA,IAC3D;AACA,SAAK;AACL,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,MAAsB,cAA6B,MAAgB;AAC5E,UAAM,EAAE,QAAQ,KAAK,IAAI,mBAAmB,KAAK,IAAI;AACrD,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK,kBAAkB,QAAQ,KAAK,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,KAAK,GAAG,WAAW;AAAA,IAClG;AACA,UAAM,MAAM,MAAM,IAAI;AACtB,UAAM,WAAW,KAAK,MAAM,IAAI,GAAG;AACnC,QAAI,YAAY,KAAK,YAAa,QAAO;AACzC,SAAK,0BAA0B,IAAI;AACnC,UAAM,OAAiB;AAAA,MACrB,MAAM;AAAA,MACN,SAAS,KAAK,UAAU,CAAC,GAAG,KAAK,OAAO,IAAI;AAAA,MAC5C,QAAQ,gBAAgB,KAAK,MAAM;AAAA,MACnC;AAAA,IACF;AACA,SAAK,MAAM,IAAI,KAAK,IAAI;AACxB,SAAK;AACL,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,MAAc,WAAW,OAAgB;AAChD,UAAM,EAAE,QAAQ,KAAK,IAAI,mBAAmB,IAAI;AAChD,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK,kBAAkB,QAAQ,IAAI,EAAE,SAAS,MAAM,QAAQ;AAAA,IACrE;AACA,UAAM,UAAU,KAAK,MAAM,OAAO,MAAM,IAAI,CAAC;AAC7C,QAAI,CAAC,WAAW,CAAC,SAAU,OAAM,IAAI,YAAY,iBAAiB,IAAI,IAAI,OAAO;AACjF,QAAI,QAAS,MAAK;AAClB,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,MAAuB,cAA6B,MAAiB;AAC/E,UAAM,QAAQ,KAAK,iBAAiB,KAAK,KAAK;AAC9C,UAAM,EAAE,QAAQ,KAAK,IAAI,mBAAmB,KAAK,IAAI;AACrD,UAAM,SAAS,WAAW,OAAO,KAAK,kBAAkB,QAAQ,KAAK,IAAI,IAAI,KAAK,iBAAiB,KAAK;AACxG,UAAM,MAAM,MAAM,IAAI;AACtB,UAAM,WAAW,OAAO,QAAQ,IAAI,GAAG;AACvC,QAAI,YAAY,KAAK,YAAa,QAAO;AACzC,WAAO,0BAA0B,IAAI;AACrC,eAAW,WAAW,KAAK,SAAS;AAClC,UAAI,QAAQ,KAAM;AAClB,UAAI,CAAC,MAAM,QAAQ,KAAK,CAAC,WAAW,MAAM,OAAO,IAAI,MAAM,MAAM,QAAQ,IAAI,CAAC,GAAG;AAC/E,cAAM,IAAI,YAAY,mBAAmB,QAAQ,IAAI,IAAI,gBAAgB;AAAA,MAC3E;AAAA,IACF;AACA,UAAM,QAAmB;AAAA,MACvB,MAAM;AAAA,MACN,WAAW,MAAM;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,SAAS,gBAAgB,KAAK,OAAO;AAAA,MACrC,OAAO,KAAK,QAAQ,gBAAgB,KAAK,KAAK,IAAI;AAAA,MAClD;AAAA,MACA,OAAO,IAAI,WAAW,IAAI;AAAA,IAC5B;AACA,WAAO,QAAQ,IAAI,KAAK,KAAK;AAC7B,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,WAAO;AACP,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,MAAc,WAAW,OAAgB;AACjD,UAAM,EAAE,QAAQ,KAAK,IAAI,mBAAmB,IAAI;AAChD,UAAM,SAAS,WAAW,OAAO,KAAK,kBAAkB,QAAQ,IAAI,IAAI;AACxE,UAAM,MAAM,MAAM,IAAI;AACtB,UAAM,QAAQ,OAAO,QAAQ,IAAI,GAAG;AACpC,QAAI,CAAC,OAAO;AACV,UAAI,SAAU,QAAO;AACrB,YAAM,IAAI,YAAY,kBAAkB,IAAI,IAAI,OAAO;AAAA,IACzD;AACA,WAAO,QAAQ,OAAO,GAAG;AACzB,UAAM,QAAQ,OAAO,OAAO,IAAI,MAAM,MAAM,SAAS,CAAC;AACtD,QAAI,OAAO;AACT,YAAM,WAAW,OAAO,oBAAoB,KAAK;AACjD,eAAS,UAAU,SAAS,QAAQ,OAAO,CAAC,SAAS,MAAM,IAAI,MAAM,GAAG;AAAA,IAC1E;AACA,WAAO;AACP,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,MAAgC;AAC5C,UAAM,EAAE,QAAQ,KAAK,IAAI,mBAAmB,KAAK,IAAI;AACrD,UAAM,SAAS,WAAW,OAAO,KAAK,kBAAkB,QAAQ,KAAK,IAAI,IAAI;AAC7E,UAAM,MAAM,MAAM,IAAI;AACtB,WAAO,0BAA0B,IAAI;AACrC,UAAM,UAAuB;AAAA,MAC3B,GAAG;AAAA,MACH,MAAM;AAAA,MACN,MAAM,gBAAgB,KAAK,IAAI;AAAA,MAC/B,MAAM,KAAK,OAAO,gBAAgB,KAAK,IAAI,IAAI;AAAA,MAC/C,eAAe,KAAK,gBAAgB,CAAC,GAAG,KAAK,aAAa,IAAI;AAAA,IAChE;AACA,WAAO,SAAS,IAAI,KAAK,OAAO;AAChC,WAAO;AACP,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,MAAc,WAAW,OAAgB;AACnD,UAAM,EAAE,QAAQ,KAAK,IAAI,mBAAmB,IAAI;AAChD,UAAM,SAAS,WAAW,OAAO,KAAK,kBAAkB,QAAQ,IAAI,IAAI;AACxE,UAAM,MAAM,MAAM,IAAI;AACtB,UAAM,UAAU,OAAO,SAAS,OAAO,GAAG;AAC1C,QAAI,CAAC,WAAW,CAAC,SAAU,OAAM,IAAI,YAAY,oBAAoB,IAAI,IAAI,OAAO;AACpF,QAAI,QAAS,QAAO;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,qBAAqB,WAAyB;AAC5C,UAAM,MAAM,MAAM,SAAS;AAC3B,eAAW,CAAC,YAAY,OAAO,KAAK,KAAK,UAAU;AACjD,UAAI,MAAM,QAAQ,SAAS,MAAM,IAAK,MAAK,SAAS,OAAO,UAAU;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,aAAa,OAAe,iBAA+B;AACzD,SAAK,UAAU;AACf,SAAK,gBAAgB;AACrB,QAAI,oBAAoB,OAAW,MAAK,kBAAkB;AAAA,EAC5D;AAAA,EAEA,QAAuB;AACrB,UAAM,OAAO,IAAI,eAAc;AAC/B,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,OAAQ,MAAK,OAAO,IAAI,KAAK,MAAM,MAAM,CAAC;AAC1E,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,cAAe,MAAK,cAAc,IAAI,KAAK,MAAM,MAAM,CAAC;AACxF,eAAW,CAAC,KAAK,IAAI,KAAK,KAAK,OAAO;AACpC,WAAK,MAAM,IAAI,KAAK;AAAA,QAClB,MAAM,KAAK;AAAA,QACX,SAAS,KAAK,UAAU,CAAC,GAAG,KAAK,OAAO,IAAI;AAAA,QAC5C,QAAQ,gBAAgB,KAAK,MAAM;AAAA,QACnC,aAAa,KAAK;AAAA,MACpB,CAAC;AAAA,IACH;AACA,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,SAAS;AACvC,WAAK,QAAQ,IAAI,KAAK;AAAA,QACpB,MAAM,MAAM;AAAA,QACZ,WAAW,MAAM;AAAA,QACjB,QAAQ,MAAM;AAAA,QACd,SAAS,gBAAgB,MAAM,OAAO;AAAA,QACtC,OAAO,MAAM,QAAQ,gBAAgB,MAAM,KAAK,IAAI;AAAA,QACpD,aAAa,MAAM;AAAA,QACnB,OAAO,MAAM,MAAM,MAAM;AAAA,MAC3B,CAAC;AAAA,IACH;AACA,eAAW,CAAC,KAAK,OAAO,KAAK,KAAK,UAAU;AAC1C,WAAK,SAAS,IAAI,KAAK;AAAA,QACrB,MAAM,QAAQ;AAAA,QACd,WAAW,QAAQ;AAAA,QACnB,QAAQ,QAAQ;AAAA,QAChB,OAAO,QAAQ;AAAA,QACf,MAAM,QAAQ,OAAO,gBAAgB,QAAQ,IAAI,IAAI;AAAA,QACrD,YAAY,QAAQ;AAAA,QACpB,MAAM,gBAAgB,QAAQ,IAAI;AAAA,QAClC,eAAe,QAAQ,gBAAgB,CAAC,GAAG,QAAQ,aAAa,IAAI;AAAA,QACpE,aAAa,QAAQ;AAAA,MACvB,CAAC;AAAA,IACH;AACA,eAAW,CAAC,MAAM,QAAQ,KAAK,KAAK,UAAU;AAC5C,WAAK,SAAS,IAAI,MAAM,EAAE,OAAO,SAAS,MAAM,MAAM,GAAG,UAAU,SAAS,SAAS,CAAC;AAAA,IACxF;AACA,SAAK,kBAAkB,KAAK;AAC5B,SAAK,UAAU,KAAK;AACpB,SAAK,eAAe,KAAK;AACzB,SAAK,qBAAqB,KAAK;AAC/B,SAAK,gBAAgB,KAAK;AAC1B,SAAK,cAAc,KAAK;AACxB,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,eAA8B;AAC5B,UAAM,OAAO,IAAI,eAAc;AAC/B,SAAK,SAAS,IAAI,IAAI,KAAK,MAAM;AACjC,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,cAAe,MAAK,cAAc,IAAI,KAAK,MAAM,MAAM,CAAC;AACxF,SAAK,QAAQ,IAAI,IAAI,KAAK,KAAK;AAC/B,SAAK,UAAU,IAAI,IAAI,KAAK,OAAO;AACnC,SAAK,WAAW,IAAI,IAAI,KAAK,QAAQ;AACrC,eAAW,CAAC,MAAM,QAAQ,KAAK,KAAK,UAAU;AAC5C,WAAK,SAAS,IAAI,MAAM,EAAE,OAAO,SAAS,MAAM,aAAa,GAAG,UAAU,SAAS,SAAS,CAAC;AAAA,IAC/F;AACA,SAAK,kBAAkB,KAAK;AAC5B,SAAK,UAAU,KAAK;AACpB,SAAK,eAAe,KAAK;AACzB,SAAK,qBAAqB,KAAK;AAC/B,SAAK,gBAAgB,KAAK;AAC1B,SAAK,cAAc,KAAK;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,eAAqB;AACnB,eAAW,SAAS,KAAK,OAAO,OAAO,EAAG,OAAM,OAAO;AACvD,eAAW,SAAS,KAAK,QAAQ,OAAO,EAAG,OAAM,MAAM,OAAO;AAC9D,eAAW,YAAY,KAAK,SAAS,OAAO,EAAG,UAAS,MAAM,aAAa;AAAA,EAC7E;AAAA,EAEA,aAAmB;AACjB,eAAW,SAAS,KAAK,OAAO,OAAO,EAAG,OAAM,SAAS;AACzD,eAAW,SAAS,KAAK,QAAQ,OAAO,EAAG,OAAM,MAAM,SAAS;AAChE,eAAW,YAAY,KAAK,SAAS,OAAO,EAAG,UAAS,MAAM,WAAW;AAAA,EAC3E;AAAA,EAEA,iBAAiB,MAAqB;AACpC,UAAM,EAAE,QAAQ,KAAK,IAAI,mBAAmB,IAAI;AAChD,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK,kBAAkB,QAAQ,IAAI,EAAE,iBAAiB,IAAI;AAAA,IACnE;AACA,UAAM,QAAQ,KAAK,SAAS,IAAI;AAChC,WAAO,KAAK,oBAAoB,KAAK;AAAA,EACvC;AAAA,EAEA,oBAAoB,OAAqB;AACvC,QAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,UAAM,MAAM,MAAM,MAAM,IAAI;AAC5B,UAAM,OAAO,MAAM,MAAM;AACzB,SAAK,OAAO,IAAI,KAAK,IAAI;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB,MAAyB;AACxC,UAAM,MAAM,MAAM,IAAI;AACtB,UAAM,QAAQ,KAAK,QAAQ,IAAI,GAAG;AAClC,QAAI,CAAC,MAAO,OAAM,IAAI,YAAY,kBAAkB,IAAI,IAAI,OAAO;AACnE,WAAO,KAAK,oBAAoB,KAAK;AAAA,EACvC;AAAA,EAEA,oBAAoB,OAA6B;AAC/C,QAAI,CAAC,MAAM,MAAM,OAAQ,QAAO;AAChC,UAAM,OAAkB;AAAA,MACtB,MAAM,MAAM;AAAA,MACZ,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM;AAAA,MACd,SAAS,gBAAgB,MAAM,OAAO;AAAA,MACtC,OAAO,MAAM,QAAQ,gBAAgB,MAAM,KAAK,IAAI;AAAA,MACpD,aAAa,MAAM;AAAA,MACnB,OAAO,MAAM,MAAM,MAAM;AAAA,IAC3B;AACA,SAAK,QAAQ,IAAI,MAAM,MAAM,IAAI,GAAG,IAAI;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,OAAsB,SAAqC;AACrE,UAAM,OAAO,SAAS,QAAQ,QAAQ,MAAM,MAAM;AAClD,SAAK,SAAS,KAAK;AACnB,SAAK,gBAAgB,KAAK;AAC1B,SAAK,QAAQ,KAAK;AAClB,SAAK,UAAU,KAAK;AACpB,SAAK,WAAW,KAAK;AACrB,SAAK,WAAW,KAAK;AACrB,SAAK,kBAAkB,KAAK;AAC5B,SAAK,UAAU,KAAK;AACpB,SAAK,eAAe,KAAK;AACzB,SAAK,qBAAqB,KAAK;AAC/B,SAAK,gBAAgB,KAAK;AAC1B,SAAK,cAAc,KAAK;AAAA,EAC1B;AAAA,EAEQ,0BAA0B,MAAoB;AACpD,UAAM,MAAM,MAAM,IAAI;AACtB,QACE,KAAK,OAAO,IAAI,GAAG,KACnB,KAAK,MAAM,IAAI,GAAG,KAClB,KAAK,QAAQ,IAAI,GAAG,KACpB,KAAK,cAAc,IAAI,GAAG,KAC1B,KAAK,SAAS,IAAI,GAAG,GACrB;AACA,YAAM,IAAI,YAAY,0BAA0B,IAAI,IAAI,OAAO;AAAA,IACjE;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,MAAuD;AACxF,QAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,MAAI,MAAM,EAAG,QAAO,EAAE,QAAQ,MAAM,MAAM,KAAK;AAC/C,SAAO,EAAE,QAAQ,KAAK,MAAM,GAAG,GAAG,GAAG,MAAM,KAAK,MAAM,MAAM,CAAC,EAAE;AACjE;AAEA,SAAS,MAAM,MAAsB;AACnC,SAAO,KAAK,YAAY;AAC1B;;;AC7pBA,IAAM,QAAQ,WAAW,MAAM;AAE/B,IAAM,UAAU;AAChB,IAAM,aAAa;AAkBnB,IAAM,SAAN,MAAa;AAAA,EACH,MAAM,IAAI,WAAW,IAAI;AAAA,EACzB,MAAM;AAAA,EAEN,OAAO,QAAsB;AACnC,QAAI,KAAK,MAAM,UAAU,KAAK,IAAI,OAAQ;AAC1C,QAAI,MAAM,KAAK,IAAI;AACnB,WAAO,MAAM,KAAK,MAAM,OAAQ,QAAO;AACvC,UAAM,OAAO,IAAI,WAAW,GAAG;AAC/B,SAAK,IAAI,KAAK,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC;AACvC,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,GAAG,OAAqB;AACtB,SAAK,OAAO,CAAC;AACb,SAAK,IAAI,KAAK,KAAK,IAAI,QAAQ;AAAA,EACjC;AAAA,EACA,IAAI,OAAqB;AACvB,SAAK,OAAO,CAAC;AACb,SAAK,IAAI,KAAK,KAAK,IAAI,QAAQ;AAC/B,SAAK,IAAI,KAAK,KAAK,IAAK,UAAU,IAAK;AACvC,SAAK,IAAI,KAAK,KAAK,IAAK,UAAU,KAAM;AACxC,SAAK,IAAI,KAAK,KAAK,IAAK,UAAU,KAAM;AAAA,EAC1C;AAAA,EACA,IAAI,OAAqB;AACvB,UAAM,QAAQ,IAAI,WAAW,CAAC;AAC9B,QAAI,SAAS,MAAM,MAAM,EAAE,aAAa,GAAG,OAAO,QAAQ,IAAI,KAAK,GAAG,IAAI;AAC1E,SAAK,IAAI,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,OAAqB;AACvB,UAAM,QAAQ,IAAI,WAAW,CAAC;AAC9B,QAAI,SAAS,MAAM,MAAM,EAAE,YAAY,GAAG,OAAO,IAAI;AACrD,SAAK,IAAI,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,OAAyB;AAC3B,SAAK,OAAO,MAAM,MAAM;AACxB,SAAK,IAAI,IAAI,OAAO,KAAK,GAAG;AAC5B,SAAK,OAAO,MAAM;AAAA,EACpB;AAAA,EACA,KAAK,OAAqB;AACxB,UAAM,QAAQ,WAAW,KAAK;AAC9B,SAAK,IAAI,MAAM,MAAM;AACrB,SAAK,IAAI,KAAK;AAAA,EAChB;AAAA,EACA,KAAK,OAAsB;AACzB,SAAK,KAAK,KAAK,UAAU,OAAO,YAAY,CAAC;AAAA,EAC/C;AAAA,EACA,MAAM,OAAuB;AAC3B,QAAI,UAAU,MAAM;AAClB,WAAK,GAAG,CAAC;AACT;AAAA,IACF;AACA,QAAI,iBAAiB,SAAS;AAC5B,WAAK,GAAG,CAAC;AACT,YAAM,QAAQ,IAAI,WAAW,CAAC;AAC9B,UAAI,SAAS,MAAM,MAAM,EAAE,WAAW,GAAG,MAAM,OAAO,IAAI;AAC1D,WAAK,IAAI,KAAK;AACd;AAAA,IACF;AACA,QAAI,OAAO,UAAU,YAAa,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,GAAI;AACvF,WAAK,GAAG,CAAC;AACT,YAAM,QAAQ,IAAI,WAAW,CAAC;AAC9B,UAAI,SAAS,MAAM,MAAM,EAAE,YAAY,GAAG,OAAO,KAAK,GAAG,IAAI;AAC7D,WAAK,IAAI,KAAK;AACd;AAAA,IACF;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,WAAK,GAAG,CAAC;AACT,YAAM,QAAQ,IAAI,WAAW,CAAC;AAC9B,UAAI,SAAS,MAAM,MAAM,EAAE,WAAW,GAAG,OAAO,IAAI;AACpD,WAAK,IAAI,KAAK;AACd;AAAA,IACF;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,WAAK,GAAG,CAAC;AACT,WAAK,KAAK,KAAK;AACf;AAAA,IACF;AACA,QAAI,iBAAiB,aAAa;AAChC,WAAK,GAAG,CAAC;AACT,WAAK,KAAK,MAAM,KAAK;AACrB;AAAA,IACF;AACA,SAAK,GAAG,CAAC;AACT,SAAK,IAAI,MAAM,MAAM;AACrB,SAAK,IAAI,KAAK;AAAA,EAChB;AAAA,EACA,SAAqB;AAEnB,QAAI,KAAK,QAAQ,KAAK,IAAI,OAAQ,QAAO,KAAK;AAC9C,WAAO,KAAK,IAAI,MAAM,GAAG,KAAK,GAAG;AAAA,EACnC;AACF;AAEA,IAAM,SAAN,MAAa;AAAA,EAEX,YAA6B,OAAmB;AAAnB;AAAA,EAAoB;AAAA,EAApB;AAAA,EADrB,SAAS;AAAA,EAEjB,KAAa;AACX,QAAI,KAAK,UAAU,KAAK,MAAM,OAAQ,MAAK,KAAK;AAChD,WAAO,KAAK,MAAM,KAAK,QAAQ;AAAA,EACjC;AAAA,EACA,MAAc;AACZ,QAAI,KAAK,SAAS,IAAI,KAAK,MAAM,OAAQ,MAAK,KAAK;AACnD,UAAM,QAAQ,IAAI,SAAS,KAAK,MAAM,QAAQ,KAAK,MAAM,aAAa,KAAK,QAAQ,CAAC,EAAE,UAAU,GAAG,IAAI;AACvG,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAc;AACZ,UAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,WAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,CAAC,EAAE,aAAa,GAAG,IAAI;AAAA,EAC7E;AAAA,EACA,MAAc;AACZ,UAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,WAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI;AAAA,EAC5E;AAAA,EACA,IAAI,QAA4B;AAC9B,QAAI,SAAS,KAAK,KAAK,SAAS,SAAS,KAAK,MAAM,OAAQ,MAAK,KAAK;AACtE,UAAM,QAAQ,KAAK,MAAM,MAAM,KAAK,QAAQ,KAAK,SAAS,MAAM;AAChE,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA,EACA,OAAe;AACb,WAAO,WAAW,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAAA,EACxC;AAAA,EACA,OAAa;AACX,WAAO,KAAK,MAAM,KAAK,KAAK,GAAG,WAAW;AAAA,EAC5C;AAAA,EACA,QAAkB;AAChB,UAAM,MAAM,KAAK,GAAG;AACpB,QAAI,QAAQ,EAAG,QAAO;AACtB,QAAI,QAAQ,GAAG;AACb,YAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,YAAM,UAAU,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI;AACnF,aAAO,WAAW,OAAO,OAAO,gBAAgB,KAAK,WAAW,OAAO,OAAO,gBAAgB,IAC1F,OAAO,OAAO,IACd;AAAA,IACN;AACA,QAAI,QAAQ,GAAG;AACb,YAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,YAAM,QAAQ,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,CAAC,EAAE,WAAW,GAAG,IAAI;AAEhF,aAAO,OAAO,UAAU,KAAK,KAAK,OAAO,SAAS,KAAK,IAAI,UAAU,KAAK,IAAI;AAAA,IAChF;AACA,QAAI,QAAQ,EAAG,QAAO,KAAK,KAAK;AAChC,QAAI,QAAQ,EAAG,QAAO,KAAK,IAAI,KAAK,IAAI,CAAC;AACzC,SAAK,KAAK;AAAA,EACZ;AAAA,EACA,YAAoB;AAClB,WAAO,KAAK,MAAM,SAAS,KAAK;AAAA,EAClC;AAAA,EACA,OAAgB;AACd,WAAO,KAAK,WAAW,KAAK,MAAM;AAAA,EACpC;AAAA,EACQ,OAAc;AACpB,UAAM,IAAI,YAAY,4CAA4C,OAAO;AAAA,EAC3E;AACF;AA0BO,SAAS,oBAAoB,OAAsB,SAAsC;AAC9F,QAAM,SAAS,IAAI,OAAO;AAC1B,SAAO,IAAI,KAAK;AAChB,SAAO,IAAI,OAAO;AAClB,SAAO,GAAG,MAAM,qBAAqB,IAAI,CAAC;AAC1C,SAAO,IAAI,MAAM,aAAa;AAC9B,SAAO,IAAI,MAAM,OAAO;AACxB,SAAO,IAAI,MAAM,YAAY;AAC7B,SAAO,MAAM,MAAM,eAAe;AAClC,SAAO,IAAI,MAAM,OAAO,IAAI;AAC5B,aAAW,SAAS,aAAa,MAAM,MAAM,GAAG;AAC9C,WAAO,KAAK;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,aAAa,MAAM;AAAA,MACnB,SAAS,CAAC,GAAG,MAAM,OAAO,EAAE,KAAK,YAAY;AAAA,MAC7C,aAAa,MAAM;AAAA,MACnB,cAAc,MAAM,gBAAgB;AAAA,MACpC,QAAQ,MAAM,UAAU;AAAA,IAC1B,CAAC;AACD,WAAO,MAAM,MAAM,SAAS;AAC5B,UAAM,OAAO,CAAC,GAAG,MAAM,KAAK,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAMG,eAAc,EAAE,OAAO,EAAE,KAAK,CAAC;AACpF,WAAO,IAAI,KAAK,MAAM;AACtB,eAAW,OAAO,MAAM;AACtB,aAAO,MAAM,IAAI,KAAK;AACtB,aAAO,IAAI,MAAM,QAAQ,MAAM;AAC/B,iBAAW,UAAU,MAAM,QAAS,QAAO,MAAM,IAAI,OAAO,IAAI,OAAO,KAAK,YAAY,CAAC,KAAK,IAAI;AAAA,IACpG;AAAA,EACF;AACA,QAAM,QAAQ,aAAa,MAAM,KAAK;AACtC,SAAO,IAAI,MAAM,MAAM;AACvB,aAAW,QAAQ,MAAO,QAAO,KAAK,IAAI;AAC1C,QAAM,UAAU,aAAa,MAAM,OAAO;AAC1C,SAAO,IAAI,QAAQ,MAAM;AACzB,aAAW,SAAS,SAAS;AAC3B,WAAO,KAAK;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,IACrB,CAAC;AAAA,EACH;AACA,SAAO,IAAI,QAAQ,SAAS;AAC5B,SAAO,IAAI,OAAO,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC;AAC5C,SAAO,OAAO,OAAO;AACvB;AAOO,SAAS,oBAAoB,UAAuC;AACzE,QAAM,SAAS,IAAI,OAAO,QAAQ;AAClC,QAAM,QAAQ,OAAO,IAAI,CAAC;AAC1B,MAAI,CAAC,MAAM,MAAM,CAAC,MAAM,UAAU,SAAS,MAAM,KAAK,CAAC;AACrD,UAAM,IAAI,YAAY,qCAAqC,OAAO;AACpE,QAAM,UAAU,OAAO,IAAI;AAC3B,MAAI,YAAY,WAAW,YAAY,YAAY;AACjD,UAAM,IAAI,YAAY,4CAA4C,OAAO,IAAI,oBAAoB,eAAe;AAAA,EAClH;AACA,QAAM,QAAQ,IAAI,cAAc;AAChC,QAAM,qBAAqB,OAAO,GAAG,MAAM;AAC3C,QAAM,gBAAgB,OAAO,IAAI;AACjC,QAAM,UAAU,OAAO,IAAI;AAC3B,QAAM,eAAe,OAAO,IAAI;AAChC,QAAM,kBAAkBC,SAAQ,OAAO,MAAM,CAAC;AAC9C,QAAM,aAAa,OAAO,IAAI;AAC9B,WAAS,aAAa,GAAG,aAAa,YAAY,cAAc;AAC9D,UAAM,OAAO,OAAO,KAAgB;AACpC,UAAM,QAAQ,IAAI,MAAM,KAAK,MAAM,KAAK,SAAS;AAAA,MAC/C,aAAa,KAAK;AAAA,MAClB,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK,gBAAgB;AAAA,MACnC,QAAQ,KAAK,UAAU;AAAA,IACzB,CAAC;AACD,UAAM,YAAYA,SAAQ,OAAO,MAAM,CAAC;AACxC,UAAM,WAAW,OAAO,IAAI;AAC5B,aAAS,WAAW,GAAG,WAAW,UAAU,YAAY;AACtD,YAAM,QAAQA,SAAQ,OAAO,MAAM,CAAC;AACpC,YAAM,aAAa,OAAO,IAAI;AAC9B,UAAI,eAAe,MAAM,QAAQ,OAAQ,OAAM,IAAI,YAAY,sCAAsC,OAAO;AAC5G,YAAM,SAAS,oBAAI,IAAsB;AACzC,iBAAW,UAAU,MAAM,QAAS,QAAO,IAAI,OAAO,KAAK,YAAY,GAAG,OAAO,MAAM,CAAC;AACxF,YAAM,KAAK,IAAI,OAAO,EAAE,OAAO,OAAO,CAAC;AAAA,IACzC;AACA,UAAM,qBAAqB;AAC3B,UAAM,OAAO,IAAI,MAAM,KAAK,YAAY,GAAG,KAAK;AAAA,EAClD;AACA,QAAM,YAAY,OAAO,IAAI;AAC7B,WAAS,QAAQ,GAAG,QAAQ,WAAW,SAAS;AAC9C,UAAM,OAAO,OAAO,KAAe;AACnC,UAAM,MAAM,IAAI,KAAK,KAAK,YAAY,GAAG,IAAI;AAAA,EAC/C;AACA,QAAM,aAAa,OAAO,IAAI;AAC9B,WAAS,gBAAgB,GAAG,gBAAgB,YAAY,iBAAiB;AACvE,UAAM,OAAO,OAAO,KAAgB;AACpC,UAAM,OAAkB,EAAE,GAAG,MAAM,OAAO,IAAI,WAAW,KAAK,IAAI,EAAE;AACpE,UAAM,QAAQ,IAAI,KAAK,KAAK,YAAY,GAAG,IAAI;AAC/C,UAAM,QAAQ,MAAM,SAAS,KAAK,SAAS;AAC3C,eAAW,OAAO,MAAM,KAAK,GAAG;AAC9B,UACE,KAAK,SACL;AAAA,QACE,SAAS,KAAK,OAAO;AAAA,UACnB,WAAW;AAAA,UACX,eAAe,CAAC,WAAW,SAAS;AAClC,gBAAI,aAAa,UAAU,YAAY,MAAM,MAAM,KAAK,YAAY,GAAG;AACrE,oBAAM,IAAI,YAAY,mBAAmB,SAAS,IAAI,IAAI,IAAI,gBAAgB;AAAA,YAChF;AACA,gBAAI,KAAK,YAAY,MAAM,QAAS,QAAO,IAAI;AAC/C,gBAAI,CAAC,IAAI,OAAO,IAAI,KAAK,YAAY,CAAC;AACpC,oBAAM,IAAI,YAAY,mBAAmB,IAAI,IAAI,gBAAgB;AACnE,mBAAO,IAAI,OAAO,IAAI,KAAK,YAAY,CAAC,KAAK;AAAA,UAC/C;AAAA,UACA,cAAc,MAAM;AAClB,kBAAM,IAAI,YAAY,kDAAkD,QAAQ;AAAA,UAClF;AAAA,QACF,CAAC;AAAA,MACH,MAAM;AAEN;AACF,WAAK,MAAM;AAAA,QACT,KAAK,QAAQ;AAAA,UAAI,CAAC,WAChB,sBAAsB,IAAI,OAAO,IAAI,OAAO,KAAK,YAAY,CAAC,KAAK,MAAM,OAAO,WAAW,QAAQ;AAAA,QACrG;AAAA,QACA,IAAI;AAAA,QACJ,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAkC;AACtC,MAAI,WAAW,SAAS;AACtB,QAAI,OAAO,UAAU,IAAI,GAAI,OAAM,IAAI,YAAY,4CAA4C,OAAO;AACtG,cAAU;AAAA,MACR,WAAW,OAAO,IAAI;AAAA,MACtB,OAAO,OAAO,OAAO,IAAI,CAAC;AAAA,IAC5B;AAAA,EACF;AACA,MAAI,CAAC,OAAO,KAAK,EAAG,OAAM,IAAI,YAAY,8BAA8B,OAAO;AAC/E,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAEA,SAASA,SAAQ,OAAwB;AACvC,MAAK,OAAO,UAAU,YAAY,OAAO,cAAc,KAAK,KAAM,OAAO,UAAU,SAAU,QAAO;AACpG,QAAM,IAAI,YAAY,6BAA6B,OAAO;AAC5D;AAGA,SAAS,aAAa,GAAW,GAAmB;AAClD,SAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAClC;AAEA,SAASD,eAAc,GAAU,GAAkB;AACjD,QAAM,OAAO,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC;AACjD,QAAM,QAAQ,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC;AAClD,MAAI,OAAO,MAAO,QAAO;AACzB,MAAI,OAAO,MAAO,QAAO;AACzB,SAAO;AACT;AAEA,SAAS,aAAyC,KAA0B;AAC1E,SAAO,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC;AACtE;AAEA,SAAS,aAAa,MAAc,OAAyB;AAC3D,MAAI,OAAO,UAAU,SAAU,QAAO,EAAE,OAAO,UAAU,OAAO,MAAM,SAAS,EAAE;AACjF,MAAI,iBAAiB,WAAY,QAAO,EAAE,OAAO,QAAQ,OAAO,MAAM,KAAK,KAAK,EAAE;AAClF,SAAO;AACT;AAEA,SAAS,YAAY,MAAc,OAAyB;AAC1D,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,EAAE,WAAW,OAAQ,QAAO;AACvE,QAAM,SAAS;AACf,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,OAAO,KAAe;AACnE,MAAI,OAAO,UAAU,OAAQ,QAAO,WAAW,KAAK,OAAO,KAAiB;AAC5E,SAAO;AACT;;;ACjYO,IAAM,qBAAN,MAAyB;AAAA,EACrB;AAAA,EACA;AAAA,EACD,sBAA4C;AAAA,EAC5C,uBAAsC;AAAA,EACtC,aAAkC,CAAC;AAAA,EACnC,qBAAqB;AAAA,EAE7B,YAAY,OAAsB,MAAY;AAC5C,SAAK,QAAQ;AACb,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,IAAI,gBAAyB;AAC3B,WAAO,KAAK,wBAAwB;AAAA,EACtC;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,eAAe;AACtB,YAAM,IAAI,YAAY,mDAAmD,eAAe,cAAc;AAAA,IACxG;AACA,SAAK,MAAM,aAAa;AACxB,SAAK,sBAAsB,KAAK,MAAM,aAAa;AACnD,SAAK,uBAAuB,KAAK,KAAK,SAAS;AAC/C,SAAK,aAAa,CAAC;AACnB,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEA,SAAe;AACb,SAAK,mBAAmB,0CAA0C;AAClE,SAAK,sBAAsB;AAC3B,SAAK,uBAAuB;AAC5B,SAAK,aAAa,CAAC;AACnB,SAAK,qBAAqB;AAC1B,SAAK,MAAM,WAAW;AAAA,EACxB;AAAA,EAEA,SAAS,WAA0B;AACjC,SAAK,mBAAmB,4CAA4C;AACpE,QAAI,cAAc,QAAW;AAC3B,YAAM,QAAQ,KAAK,cAAc,SAAS;AAC1C,YAAME,YAAW,KAAK,WAAW,KAAK;AACtC,UAAI,CAACA,UAAU,OAAM,IAAI,YAAY,sBAAsB,SAAS,IAAI,eAAe,cAAc;AACrG,WAAK,MAAM,YAAYA,UAAS,OAAO,EAAE,OAAO,KAAK,CAAC;AACtD,WAAK,KAAK,SAASA,UAAS,SAAS;AACrC,WAAK,WAAW,OAAO,QAAQ,CAAC;AAChC;AAAA,IACF;AAEA,UAAM,WAAW,KAAK;AACtB,UAAM,YAAY,KAAK;AACvB,QAAI,CAAC,YAAY,cAAc,MAAM;AACnC,YAAM,IAAI,YAAY,8CAA8C,eAAe,cAAc;AAAA,IACnG;AACA,SAAK,MAAM,YAAY,UAAU,EAAE,OAAO,KAAK,CAAC;AAChD,SAAK,KAAK,SAAS,SAAS;AAC5B,SAAK,sBAAsB;AAC3B,SAAK,uBAAuB;AAC5B,SAAK,aAAa,CAAC;AACnB,SAAK,qBAAqB;AAC1B,SAAK,MAAM,WAAW;AAAA,EACxB;AAAA,EAEA,UAAU,MAAoB;AAC5B,QAAI,CAAC,KAAK,eAAe;AACvB,WAAK,MAAM,aAAa;AACxB,WAAK,sBAAsB,KAAK,MAAM,aAAa;AACnD,WAAK,uBAAuB,KAAK,KAAK,SAAS;AAC/C,WAAK,qBAAqB;AAAA,IAC5B,OAAO;AACL,WAAK,MAAM,aAAa;AAAA,IAC1B;AACA,SAAK,WAAW,KAAK;AAAA,MACnB;AAAA,MACA,OAAO,KAAK,MAAM,aAAa;AAAA,MAC/B,WAAW,KAAK,KAAK,SAAS;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ,MAAoB;AAC1B,SAAK,mBAAmB,qDAAqD;AAC7E,UAAM,QAAQ,KAAK,cAAc,IAAI;AACrC,SAAK,WAAW,OAAO,KAAK;AAC5B,QAAI,KAAK,sBAAsB,KAAK,WAAW,WAAW,GAAG;AAC3D,WAAK,sBAAsB;AAC3B,WAAK,uBAAuB;AAC5B,WAAK,qBAAqB;AAC1B,WAAK,MAAM,WAAW;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,cAAc,MAAsB;AAC1C,UAAM,aAAa,KAAK,YAAY;AACpC,aAAS,QAAQ,KAAK,WAAW,SAAS,GAAG,SAAS,GAAG,SAAS;AAChE,YAAM,YAAY,KAAK,WAAW,KAAK;AACvC,UAAI,aAAa,UAAU,KAAK,YAAY,MAAM,WAAY,QAAO;AAAA,IACvE;AACA,UAAM,IAAI,YAAY,sBAAsB,IAAI,IAAI,eAAe,cAAc;AAAA,EACnF;AAAA,EAEQ,mBAAmB,SAAuB;AAChD,QAAI,CAAC,KAAK,cAAe,OAAM,IAAI,YAAY,SAAS,eAAe,cAAc;AAAA,EACvF;AACF;;;ACpFO,SAAS,SACd,OACA,MACA,OACA,OACM;AACN,SAAO;AAAA,IACL;AAAA,IACA,YAAY,OAAO,YAAY,KAAK;AAAA,IACpC;AAAA,IACA,WAAW,KAAK,YAAY;AAAA,IAC5B;AAAA,IACA,GAAG;AAAA,EACL;AACF;AAqBO,IAAM,eAAN,MAAmB;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO,oBAAI,IAAuB;AAAA,EAClC;AAAA,EACT;AAAA;AAAA,EAGA,eAAe;AAAA;AAAA,EAEf,eAAgC;AAAA;AAAA,EAGhC,UAAU,OAAO;AAAA,EACjB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAEhB,YACE,OACA,cACA,SAA6B,CAAC,GAC9B,YAA8B,yBAC9B,QAAwB,CAAC,GACzB;AACA,SAAK,QAAQ;AACb,SAAK,eAAe;AACpB,SAAK,YAAY;AACjB,SAAK,QAAQ;AACb,SAAK,aAAa,OAAO,IAAI,UAAU;AACvC,SAAK,QAAQ,oBAAI,IAAI;AAAA,EACvB;AAAA,EAEA,MAAM,QAAkC;AACtC,SAAK,WAAW,SAAS;AACzB,eAAW,SAAS,OAAQ,MAAK,WAAW,KAAK,WAAW,KAAK,CAAC;AAClE,SAAK,MAAM,MAAM;AACjB,SAAK,KAAK,MAAM;AAChB,SAAK,eAAe;AACpB,SAAK,eAAe;AACpB,SAAK,UAAU,OAAO;AACtB,SAAK,mBAAmB;AACxB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,kBAAkB,MAAiC;AACjD,QAAI,OAAO,SAAS,UAAU;AAC5B,UAAI,OAAO,KAAK,OAAO,KAAK,WAAW,OAAQ,QAAO;AACtD,aAAO,KAAK,WAAW,OAAO,CAAC;AAAA,IACjC;AACA,UAAM,MAAM,KAAK,YAAY;AAC7B,QAAI,CAAC,KAAK,MAAM,IAAI,GAAG,GAAG;AAGxB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,IAAI,GAAG,KAAK;AAAA,EAChC;AAAA,EAEA,SAAS,MAAc,OAAsB;AAC3C,SAAK,MAAM,IAAI,KAAK,YAAY,GAAG,WAAW,KAAK,CAAC;AAAA,EACtD;AAAA,EAEA,kBAAkB,MAAuB,MAAM,QAAmC;AAChF,UAAM,QAAQ,OAAO,KAAK;AAC1B,UAAM,QAAQ,OAAO,SAAS,CAAC;AAC/B,UAAM,UAAuB;AAAA,MAC3B;AAAA,MACA,UAAU,OAAO,YAAY;AAAA,MAC7B,WAAW,KAAK;AAAA,MAChB,iBAAiB;AAAA,QACf,SAAS,MAAM,KAAK,MAAM;AAAA,QAC1B,cAAc,MAAM,KAAK,MAAM;AAAA,QAC/B,iBAAiB,MAAM,KAAK,MAAM;AAAA,QAClC,KAAK,KAAK,MAAM;AAAA,QAChB,QAAQ,KAAK,MAAM;AAAA,QACnB,WAAW,KAAK,MAAM;AAAA,QACtB,UAAU,OAAO,YAAY;AAAA,QAC7B,UAAU,OAAO;AAAA,QACjB,gBAAgB,OAAO;AAAA,QACvB,aAAa,CAAC,SAAiB;AAC7B,cAAI,CAAC,KAAK,MAAM,WAAW,IAAI,EAAG,QAAO;AACzC,iBAAO,KAAK,MAAM,gBAAgB,IAAI;AAAA,QACxC;AAAA,MACF;AAAA,MACA,OAAO,KAAK,eACR,CAAC,QAAQ,YAAY;AACnB,cAAM,IAAI,kBAAkB,QAAQ,OAAO;AAAA,MAC7C,IACA;AAAA,MACJ,eAAe,CAAC,OAAO,SAAS;AAC9B,cAAM,MAAM,KAAK,YAAY;AAC7B,cAAM,WAAW,OAAO,YAAY;AACpC,cAAM,eACJ,UAAU,QAAQ,MAAM,KAAK,CAAC,UAAU,KAAK,cAAc,KAAK,OAAO,YAAY,OAAO,QAAQ;AACpG,YAAI,iBAAiB,QAAQ,WAAW,QAAQ,aAAa,QAAQ,UAAU,OAAO,UAAU,QAAW;AACzG,iBAAO,MAAM;AAAA,QACf;AACA,YAAI,QAAQ,UAAU,OAAO,eAAe,KAAK,MAAM,WAAW,MAAM,WAAW,GAAG;AACpF,gBAAM,MAAM,KAAK,MAAM,gBAAgB,MAAM,WAAW;AACxD,cAAI,MAAM,SAAU,QAAO,IAAI,KAAK,MAAM,QAAQ;AAClD,iBAAO;AAAA,QACT;AAEA,YACE,OAAO,eACP,QAAQ,MAAM,YAAY,YAAY,KACtC,KAAK,MAAM,WAAW,MAAM,WAAW,KACvC,CAAC,MAAM,KAAK,CAAC,UAAU,KAAK,aAAa,KAAK,KAAK,YAAY,OAAO,GAAG,GACzE;AACA,iBAAO,MAAM;AAAA,QACf;AACA,cAAM,UAAU,MAAM,OAAO,CAAC,SAAS;AACrC,eAAK,KAAK,aAAa,KAAK,KAAK,YAAY,OAAO,IAAK,QAAO;AAChE,cAAI,UAAU,KAAM,QAAO,CAAC,KAAK;AACjC,kBAAQ,KAAK,cAAc,KAAK,OAAO,YAAY,OAAO;AAAA,QAC5D,CAAC;AACD,YAAI,QAAQ,WAAW;AACrB,gBAAM,IAAI,YAAY,mBAAmB,QAAQ,GAAG,KAAK,MAAM,EAAE,GAAG,IAAI,IAAI,gBAAgB;AAC9F,YAAI,QAAQ,SAAS,KAAK,UAAU,KAAM,OAAM,IAAI,YAAY,0BAA0B,IAAI,IAAI,OAAO;AACzG,eAAO,QAAQ,CAAC,EAAG;AAAA,MACrB;AAAA,MACA,qBAAqB,CAAC,OAAO,SAAS;AACpC,cAAM,MAAM,KAAK,YAAY;AAC7B,YAAI,QAAQ,OAAQ,QAAO;AAC3B,cAAM,WAAW,OAAO,YAAY;AACpC,cAAM,UAAU,MAAM,OAAO,CAACC,UAAS;AACrC,eAAKA,MAAK,aAAaA,MAAK,KAAK,YAAY,OAAO,IAAK,QAAO;AAChE,cAAI,UAAU,KAAM,QAAO,CAACA,MAAK;AACjC,kBAAQA,MAAK,cAAcA,MAAK,OAAO,YAAY,OAAO;AAAA,QAC5D,CAAC;AACD,YAAI,QAAQ,WAAW;AACrB,gBAAM,IAAI,YAAY,mBAAmB,QAAQ,GAAG,KAAK,MAAM,EAAE,GAAG,IAAI,IAAI,gBAAgB;AAC9F,YAAI,QAAQ,SAAS,KAAK,UAAU,KAAM,OAAM,IAAI,YAAY,0BAA0B,IAAI,IAAI,OAAO;AACzG,cAAM,OAAO,QAAQ,CAAC;AACtB,eAAO,KAAK,aAAa,UAAU,OAAO,KAAK,UAAU,WAAW,SAAS,eAAe,KAAK,KAAK;AAAA,MACxG;AAAA,MACA,kBAAkB,CAAC,OAAO,SAAS;AACjC,cAAM,MAAM,KAAK,YAAY;AAC7B,cAAM,WAAW,OAAO,YAAY;AACpC,cAAM,UAAU,MAAM,OAAO,CAAC,SAAS;AACrC,eAAK,KAAK,aAAa,KAAK,KAAK,YAAY,OAAO,IAAK,QAAO;AAChE,cAAI,UAAU,KAAM,QAAO,CAAC,KAAK;AACjC,kBAAQ,KAAK,cAAc,KAAK,OAAO,YAAY,OAAO;AAAA,QAC5D,CAAC;AACD,YAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,YAAI,QAAQ,SAAS,KAAK,UAAU,KAAM,QAAO;AACjD,eAAO,QAAQ,CAAC,EAAG,WAAW;AAAA,MAChC;AAAA,MACA,cAAc,CAAC,SAAS,KAAK,kBAAkB,IAAI;AAAA,MACnD,eAAe,CAAC,WAAW;AACzB,YAAI,CAAC,KAAK,aAAc,OAAM,IAAI,YAAY,qCAAqC,QAAQ;AAC3F,cAAM,SAAS,KAAK,aAAa,QAAQ,MAAM,OAAO;AACtD,eAAO;AAAA,UACL,SAAS,OAAO;AAAA,UAChB,MACE,OAAO,OAAO,SAAS,IACnB,OAAO,OAAO,IAAI,CAACC,SAAQ,CAAC,GAAGA,IAAG,CAAC,IACnC,OAAO,KAAK,IAAI,CAAC,WAAW,OAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,MAAM,KAAK,IAAI,CAAC;AAAA,QAC1F;AAAA,MACF;AAAA,MACA,UAAU,CAAC,OAAO,QAAQ,UAAU;AAClC,YAAI,KAAK,UAAU,UAAa,CAAC,IAAI,aAAa;AAChD,gBAAM,IAAI,YAAY,yDAAyD,aAAa;AAAA,QAC9F;AACA,YAAI,CAAC,KAAK,MAAM,WAAW,IAAI,WAAW,GAAG;AAC3C,gBAAM,IAAI,YAAY,yDAAyD,aAAa;AAAA,QAC9F;AACA,cAAM,MAAM,KAAK,MAAM,gBAAgB,IAAI,WAAW;AACtD,cAAM,SAAS,IAAI,YAAY,IAAI,OAAO,OAAO,QAAQ,KAAK;AAC9D,YAAI,OAAQ,KAAI,WAAW;AAAA,YACtB,KAAI,WAAW;AACpB,eAAO,WAAW;AAAA,MACpB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,WAAW,OAA0B;AACnD,MAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,OAAO,UAAU,SAAU,QAAO;AACrF,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,OAAO,SAAS,KAAK,EAAG,OAAM,IAAI,YAAY,oCAAoC,mBAAmB;AAC1G,WAAO,mBAAmB,KAAK;AAAA,EACjC;AACA,MAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,IAAI;AACnD,MAAI,iBAAiB,WAAW,iBAAiB,YAAa,QAAO;AACrE,MAAI,iBAAiB,YAAY;AAC/B,QAAI,wBAAwB,KAAK,GAAG;AAClC,YAAM,IAAI,YAAY,8EAA8E,QAAQ;AAAA,IAC9G;AACA,WAAO,IAAI,WAAW,KAAK;AAAA,EAC7B;AACA,MAAI,iBAAiB,YAAa,QAAO,IAAI,WAAW,KAAK;AAC7D,MAAI,OAAO,sBAAsB,eAAe,iBAAiB,mBAAmB;AAClF,UAAM,IAAI,YAAY,+EAA+E,QAAQ;AAAA,EAC/G;AACA,MAAI,YAAY,OAAO,KAAK,GAAG;AAC7B,UAAM,OAAO,OAAO,UAAU,SAAS,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE;AAC9D,UAAM,IAAI,YAAY,eAAe,IAAI,iEAAiE,QAAQ;AAAA,EACpH;AACA,QAAM,IAAI,YAAY,2BAA2B,OAAO,KAAK,IAAI,mBAAmB;AACtF;AAEA,SAAS,wBAAwB,MAAgC;AAC/D,SAAO,OAAO,sBAAsB,eAAe,KAAK,kBAAkB;AAC5E;;;AChQO,SAAS,YAAY,UAAU,GAAG,kBAAmC,GAAc;AACxF,SAAO,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,SAAS,gBAAgB;AACvE;AAGO,SAAS,eAAe,OAA6B;AAC1D,MAAI,UAAU,KAAK,EAAG,QAAO,MAAM;AACnC,MAAI,cAAc,KAAK,EAAG,QAAO,MAAM;AACvC,SAAO;AACT;AAEO,SAAS,eACd,SACA,QACA,UAAU,GACV,kBAAmC,GACnC,SACW;AACX,QAAM,QAAQ,SAAS,UAAU;AACjC,QAAM,aAAa,SAAS,eAAe;AAC3C,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,aAAa,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC;AAAA,IACrE,MAAM,QACF,OAAO,IAAI,CAAC,QAAQ;AAClB,YAAM,SAAmB,CAAC;AAC1B,eAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS;AACnD,eAAO,QAAQ,KAAK,CAAE,IAAI,eAAe,IAAI,KAAK,KAAK,IAAI;AAAA,MAC7D;AACA,aAAO;AAAA,IACT,CAAC,IACD,CAAC;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,aAAa,QAAiC;AAC5D,MAAI,OAAO,OAAO,SAAS,KAAK,OAAO,KAAK,WAAW,GAAG;AACxD,WAAO,OAAO,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;AAAA,EAC5C;AACA,SAAO,OAAO,KAAK,IAAI,CAAC,QAAQ,OAAO,QAAQ,IAAI,CAAC,WAAW,IAAI,MAAM,KAAK,IAAI,CAAC;AACrF;;;ACnDO,SAAS,cAAc,MAAkB,KAA8B;AAC5E,QAAM,WAAW,SAAS,KAAK,UAAU,IAAI,kBAAkB,CAAC;AAChE,MAAI,OAAO,aAAa,UAAU;AAChC,UAAM,IAAI,YAAY,gDAAgD,mBAAmB;AAAA,EAC3F;AACA,QAAM,SAAS,KAAK,OAAO,YAAY;AACvC,MAAI,WAAW,QAAQ;AACrB,UAAM,IAAI,YAAY,mCAAmC,OAAO;AAAA,EAClE;AACA,MAAI,WAAW,QAAQ;AACrB,UAAM,IAAI,YAAY,mCAAmC,OAAO;AAAA,EAClE;AACA,MAAI,IAAI,MAAM,SAAS,IAAI,MAAM,GAAG;AAClC,UAAM,IAAI,YAAY,YAAY,KAAK,MAAM,sBAAsB,OAAO;AAAA,EAC5E;AACA,MAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,OAAO,IAAI,cAAc,GAAG,SAAS,CAAC;AACvE,SAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AACjD;AAEO,SAAS,cAAc,MAAkB,KAA8B;AAC5E,QAAM,SAAS,KAAK,OAAO,YAAY;AACvC,MAAI,WAAW,QAAQ;AACrB,UAAM,IAAI,YAAY,+BAA+B,OAAO;AAAA,EAC9D;AACA,MAAI,WAAW,QAAQ;AACrB,UAAM,IAAI,YAAY,+BAA+B,OAAO;AAAA,EAC9D;AACA,MAAI,CAAC,IAAI,MAAM,SAAS,OAAO,MAAM,GAAG;AACtC,UAAM,IAAI,YAAY,qBAAqB,KAAK,MAAM,IAAI,OAAO;AAAA,EACnE;AACA,SAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AACjD;;;AClCA,SAAS,UAAU,MAAoB,OAA8B;AACnE,MAAI,KAAK,WAAW,MAAM,OAAQ,QAAO;AACzC,SAAO,KAAK,MAAM,CAAC,OAAO,UAAU;AAClC,UAAM,QAAQ,MAAM,KAAK;AACzB,WAAQ,UAAU,QAAQ,UAAU,QAAU,UAAU,UAAa,WAAW,OAAO,KAAK,MAAM;AAAA,EACpG,CAAC;AACH;AAEO,SAAS,UAAU,YAA4B,OAAuB;AAC3E,SAAO,QAAQ;AACjB;AAEO,SAAS,KAAK,WAA2B,OAAe,YAA4B,WAAmB;AAC5G,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,YAAY;AAChB,SAAO,YAAY,KAAK,UAAU,UAAU,SAAS,GAAI,UAAU,YAAY,CAAC,CAAE,EAAG;AACrF,SAAO,YAAY;AACrB;AAEO,SAAS,UAAU,WAA2B,OAAe,YAA4B,WAAmB;AACjH,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,KAAK,OAAO,KAAK;AAC/B,QAAI,CAAC,UAAU,UAAU,CAAC,GAAI,UAAU,IAAI,CAAC,CAAE,EAAG;AAAA,EACpD;AACA,SAAO;AACT;AAEO,SAAS,IACd,WACA,OACA,aAAa,GACb,SAAS,GACT,eAAyB,MACf;AACV,QAAM,SAAS,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC;AACrD,SAAO,SAAS,IAAI,eAAgB,UAAU,MAAM,IAAI,UAAU,KAAK;AACzE;AAEO,SAAS,KACd,WACA,OACA,aAAa,GACb,SAAS,GACT,eAAyB,MACf;AACV,QAAM,SAAS,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC;AACrD,SAAO,UAAU,UAAU,SAAS,eAAgB,UAAU,MAAM,IAAI,UAAU,KAAK;AACzF;AAEO,SAAS,WAAW,WAA2B,aAAa,GAAG,aAAa,GAAa;AAC9F,SAAO,UAAU,UAAU,IAAI,UAAU,KAAK;AAChD;AAEO,SAAS,UAAU,WAA2B,aAAa,GAAG,WAAW,UAAU,SAAS,GAAa;AAC9G,SAAO,UAAU,QAAQ,IAAI,UAAU,KAAK;AAC9C;AAEO,SAAS,SAAS,WAA2B,GAAW,aAAa,GAAG,aAAa,GAAa;AACvG,QAAM,SAAS,KAAK,MAAM,CAAC;AAC3B,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,UAAU,aAAa,SAAS,CAAC,IAAI,UAAU,KAAK;AAC7D;AAEO,IAAM,kBAAkB;AAAA,EAC7B,YAAY;AAAA,EACZ;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,OAAO,MAAM;AAAA,EACb,WAAW,MAAM;AAAA,EACjB,cAAc,MAAM;AACtB;;;ACxDO,IAAM,mBAAmB;AAAA,EAC9B;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,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;AAGO,IAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA,GAAG;AAAA,EACH;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,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAEnC,IAAM,wBAAwB;AAAA,EAC5B;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;AAEA,IAAMC,mBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,mBAAwE;AAAA,EAC5E,gBAAgB,EAAE,QAAQ,kBAAkB,OAAO,EAAE;AAAA,EACrD,gBAAgB,EAAE,QAAQ,kBAAkB,OAAO,EAAE;AAAA,EACrD,aAAa,EAAE,QAAQ,eAAe,OAAO,EAAE;AAAA,EAC/C,iBAAiB,EAAE,QAAQ,mBAAmB,OAAO,EAAE;AAAA,EACvD,cAAc,EAAE,QAAQ,WAAW,OAAO,EAAE;AAAA,EAC5C,YAAY,EAAE,QAAQ,cAAc,OAAO,IAAK;AAAA,EAChD,aAAa,EAAE,QAAQ,eAAe,OAAO,IAAM;AAAA,EACnD,iBAAiB,EAAE,QAAQ,mBAAmB,OAAO,EAAE;AAAA,EACvD,sBAAsB,EAAE,QAAQ,wBAAwB,OAAO,EAAE;AAAA,EACjE,eAAe,EAAE,QAAQ,iBAAiB,OAAO,EAAE;AAAA,EACnD,cAAc,EAAE,QAAQ,gBAAgB,OAAO,EAAE;AAAA,EACjD,oBAAoB,EAAE,QAAQ,cAAc,OAAO,IAAK;AAAA,EACxD,oBAAoB,EAAE,QAAQ,sBAAsB,OAAO,EAAE;AAAA,EAC7D,wBAAwB,EAAE,QAAQ,0BAA0B,OAAO,EAAE;AAAA,EACrE,UAAU,EAAE,QAAQ,YAAY,OAAO,QAAQ;AAAA,EAC/C,gBAAgB,EAAE,QAAQ,kBAAkB,OAAO,EAAE;AAAA,EACrD,mBAAmB,EAAE,QAAQ,qBAAqB,OAAO,EAAE;AAAA,EAC3D,WAAW,EAAE,QAAQ,aAAa,OAAO,EAAE;AAAA,EAC3C,iBAAiB,EAAE,QAAQ,mBAAmB,OAAO,EAAE;AAAA,EACvD,0BAA0B,EAAE,QAAQ,4BAA4B,OAAO,EAAE;AAAA,EACzE,cAAc,EAAE,QAAQ,gBAAgB,OAAO,SAAS;AAAA,EACxD,oBAAoB,EAAE,QAAQ,sBAAsB,OAAO,MAAM;AAAA,EACjE,oBAAoB,EAAE,QAAQ,sBAAsB,OAAO,EAAE;AAAA,EAC7D,cAAc,EAAE,QAAQ,gBAAgB,OAAO,SAAS;AAAA,EACxD,gBAAgB,EAAE,QAAQ,kBAAkB,OAAO,WAAW;AAAA,EAC9D,WAAW,EAAE,QAAQ,aAAa,OAAO,KAAK;AAAA,EAC9C,YAAY,EAAE,QAAQ,cAAc,OAAO,EAAE;AAAA,EAC7C,kBAAkB,EAAE,QAAQ,oBAAoB,OAAO,EAAE;AAAA,EACzD,oBAAoB,EAAE,QAAQ,sBAAsB,OAAO,EAAE;AAAA,EAC7D,2BAA2B,EAAE,QAAQ,6BAA6B,OAAO,EAAE;AAAA,EAC3E,eAAe,EAAE,QAAQ,iBAAiB,OAAO,EAAE;AAAA,EACnD,oBAAoB,EAAE,QAAQ,sBAAsB,OAAO,EAAE;AAAA,EAC7D,iBAAiB,EAAE,QAAQ,mBAAmB,OAAO,EAAE;AAAA,EACvD,aAAa,EAAE,QAAQ,eAAe,OAAO,EAAE;AAAA,EAC/C,YAAY,EAAE,QAAQ,cAAc,OAAO,EAAE;AAAA,EAC7C,SAAS,EAAE,QAAQ,WAAW,OAAO,EAAE;AAAA,EACvC,gBAAgB,EAAE,QAAQ,kBAAkB,OAAO,EAAE;AAAA,EACrD,iBAAiB,EAAE,QAAQ,mBAAmB,OAAO,EAAE;AACzD;AAEO,SAAS,gBAAgB,MAAuB;AACrD,QAAM,QAAQ,KAAK,YAAY;AAC/B,MAAK,iBAAuC,SAAS,KAAK,EAAG,QAAO;AACpE,MAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,WAAQ,iBAAuC,SAAS,MAAM,MAAM,UAAU,MAAM,CAAC;AAAA,EACvF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAsB;AAChD,QAAM,QAAQ,KAAK,YAAY;AAC/B,MAAK,iBAAuC,SAAS,KAAK,EAAG,QAAO;AACpE,MAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,UAAM,WAAW,MAAM,MAAM,UAAU,MAAM;AAC7C,QAAK,iBAAuC,SAAS,QAAQ,EAAG,QAAO;AACvE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMO,SAAS,YAAY,MAAc,MAA2B,KAAsC;AACzG,QAAM,MAAM,mBAAmB,IAAI;AAEnC,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,OAAO,gBAAgB,IAAI,MAAM,qBAAqB,IAAI,CAAC;AAAA,IACpE,KAAK;AACH,aAAO,OAAO,gBAAgB,IAAI,MAAM,WAAW;AAAA,IACrD,KAAK;AACH,aAAO,OAAO,kBAAkB,IAAI,MAAM,aAAa;AAAA,IACzD,KAAK;AACH,aAAO,gBAAgB,MAAM,KAAK,KAAK;AAAA,IACzC,KAAK;AACH,aAAO,gBAAgB,MAAM,KAAK,IAAI;AAAA,IACxC,KAAK;AACH,aAAO,gBAAgB,MAAM,GAAG;AAAA,IAClC,KAAK;AACH,aAAO,gBAAgB,MAAM,KAAK,KAAK;AAAA,IACzC,KAAK;AACH,aAAO,gBAAgB,MAAM,KAAK,IAAI;AAAA,IACxC,KAAK;AACH,aAAO,qBAAqB,MAAM,GAAG;AAAA,IACvC,KAAK;AACH,aAAO,sBAAsB,MAAM,GAAG;AAAA,IACxC,KAAK;AACH,aAAO,mBAAmB,GAAG;AAAA,IAC/B,KAAK;AACH,aAAO,gBAAgB,GAAG;AAAA,IAC5B,KAAK;AACH,aAAO;AAAA,QACL,SAAS,CAAC,OAAO,MAAM;AAAA,QACvB,MAAM;AAAA,UACJ,CAAC,GAAG,OAAO;AAAA,UACX,CAAC,GAAG,QAAQ;AAAA,UACZ,CAAC,GAAG,QAAQ;AAAA,QACd;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO,EAAE,SAAS,CAAC,iBAAiB,GAAG,MAAMA,iBAAgB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAAA,IACnF,KAAK;AACH,aAAO,mBAAmB;AAAA,IAC5B,KAAK;AACH,aAAO,iBAAiB;AAAA,IAC1B,KAAK;AACH,aAAO,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,kBAAkB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;AAAA,IACtE,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,KAAK,IAAI;AAAA,IACzB,KAAK;AACH,aAAO,EAAE,SAAS,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE;AAAA,IAC3C,KAAK;AACH,aAAO,OAAO,cAAc,kBAAkB,GAAG,CAAC;AAAA,IACpD,SAAS;AACP,YAAM,UAAU,iBAAiB,GAAG;AACpC,UAAI,QAAS,QAAO,OAAO,QAAQ,QAAQ,QAAQ,KAAK;AACxD,aAAO,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC,EAAE;AAAA,IACjC;AAAA,EACF;AACF;AAEA,SAAS,OAAO,QAAgB,OAAoC;AAClE,SAAO,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE;AAC9C;AAEA,SAAS,kBAAkB,KAA2B;AACpD,QAAM,UAAU,IAAI,MAAM,OAAO,OAAO,IAAI,MAAM,QAAQ,OAAO,IAAI,MAAM,MAAM,OAAO,IAAI,MAAM,cAAc;AAChH,SAAO,YAAY,IAAI,IAAI,KAAK,IAAI,GAAG,OAAO;AAChD;AAEA,SAAS,gBAAgB,MAA2B,KAAmB,OAAmC;AACxG,QAAM,YAAY,eAAe,MAAM,YAAY;AACnD,QAAM,QAAQ,IAAI,MAAM,OAAO,IAAI,UAAU,YAAY,CAAC;AAC1D,MAAI,CAAC,MAAO,QAAO,EAAE,SAAS,aAAa,KAAK,GAAG,MAAM,CAAC,EAAE;AAC5D,QAAM,OAAqB,MAAM,QAAQ,IAAI,CAAC,QAAQ,QAAQ;AAC5D,UAAM,UAAU,MAAM,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,MAAM,EAAE,SAAS,OAAO,IAAI;AACjG,UAAM,KAAK,OAAO,aAAc,WAAW,IAAI,UAAU,IAAI,IAAK;AAClE,UAAM,OAAO,OAAO,cAAc,eAAe,OAAO,WAAW,IAAI;AACvE,UAAM,OAAmB,CAAC,KAAK,OAAO,MAAM,OAAO,YAAY,IAAI,OAAO,UAAU,IAAI,GAAG,MAAM,EAAE;AACnG,QAAI,OAAO;AACT,UAAI,SAAS;AACb,UAAI,OAAO,aAAa,CAAC,OAAO,UAAU,OAAQ,UAAS;AAC3D,UAAI,OAAO,WAAW,OAAQ,UAAS;AACvC,WAAK,KAAK,MAAM;AAAA,IAClB;AACA,WAAO;AAAA,EACT,CAAC;AACD,SAAO,EAAE,SAAS,aAAa,KAAK,GAAG,KAAK;AAC9C;AAEA,SAAS,aAAa,OAA0B;AAC9C,SAAO,QACH,CAAC,OAAO,QAAQ,QAAQ,WAAW,cAAc,MAAM,QAAQ,IAC/D,CAAC,OAAO,QAAQ,QAAQ,WAAW,cAAc,IAAI;AAC3D;AAEA,SAAS,eAAe,MAAsB;AAC5C,MAAI,KAAK,SAAS;AAChB,WAAO,OAAO,KAAK,UAAU,WAAW,IAAI,KAAK,MAAM,QAAQ,MAAM,IAAI,CAAC,MAAM,KAAK;AACvF,MAAI,KAAK,SAAS,OAAQ,QAAO;AACjC,SAAO;AACT;AAEA,SAAS,gBAAgB,MAA2B,KAAsC;AACxF,QAAM,YAAY,eAAe,MAAM,YAAY;AACnD,QAAM,QAAQ,IAAI,MAAM,OAAO,IAAI,UAAU,YAAY,CAAC;AAC1D,MAAI,CAAC,MAAO,QAAO,EAAE,SAAS,CAAC,OAAO,QAAQ,UAAU,UAAU,SAAS,GAAG,MAAM,CAAC,EAAE;AACvF,QAAM,OAAqB,CAAC;AAC5B,MAAI,MAAM;AACV,aAAW,QAAQ,MAAM,SAAS;AAChC,UAAM,QAAQ,IAAI,MAAM,QAAQ,IAAI,KAAK,YAAY,CAAC;AACtD,QAAI,CAAC,MAAO;AACZ,SAAK,KAAK,CAAC,OAAO,MAAM,MAAM,MAAM,SAAS,IAAI,GAAG,YAAY,KAAK,GAAG,MAAM,QAAQ,IAAI,CAAC,CAAC;AAAA,EAC9F;AACA,SAAO,EAAE,SAAS,CAAC,OAAO,QAAQ,UAAU,UAAU,SAAS,GAAG,KAAK;AACzE;AAEA,SAAS,YAAY,OAA0B;AAC7C,MAAI,MAAM,YAAa,QAAO;AAC9B,MAAI,MAAM,KAAK,YAAY,EAAE,WAAW,mBAAmB,KAAK,MAAM,OAAQ,QAAO;AACrF,SAAO;AACT;AAEA,SAAS,gBAAgB,MAA2B,KAAmB,OAAmC;AACxG,QAAM,YAAY,eAAe,MAAM,YAAY;AACnD,QAAM,QAAQ,IAAI,MAAM,QAAQ,IAAI,UAAU,YAAY,CAAC;AAC3D,QAAM,UAAU,QAAQ,CAAC,SAAS,OAAO,QAAQ,QAAQ,QAAQ,KAAK,IAAI,CAAC,SAAS,OAAO,MAAM;AACjG,MAAI,CAAC,MAAO,QAAO,EAAE,SAAS,MAAM,CAAC,EAAE;AACvC,QAAM,QAAQ,IAAI,MAAM,OAAO,IAAI,MAAM,UAAU,YAAY,CAAC;AAChE,QAAM,OAAqB,MAAM,QAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9D,UAAM,MAAM,OAAO,QAAQ,UAAU,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,OAAO,KAAK,YAAY,CAAC,KAAK;AACnG,UAAM,OAAmB,CAAC,OAAO,KAAK,OAAO,IAAI;AACjD,QAAI,OAAO;AACT,WAAK,KAAK,OAAO,UAAU,SAAS,IAAI,IAAI,OAAO,WAAW,UAAU,YAAY,GAAG,CAAC;AAAA,IAC1F;AACA,WAAO;AAAA,EACT,CAAC;AACD,MAAI,OAAO;AAET,SAAK,KAAK,CAAC,MAAM,QAAQ,QAAQ,IAAI,MAAM,GAAG,UAAU,CAAC,CAAC;AAAA,EAC5D;AACA,SAAO,EAAE,SAAS,KAAK;AACzB;AAEA,SAAS,qBAAqB,MAA2B,KAAsC;AAC7F,QAAM,YAAY,eAAe,MAAM,kBAAkB;AACzD,QAAM,QAAQ,IAAI,MAAM,OAAO,IAAI,UAAU,YAAY,CAAC;AAC1D,QAAM,UAAU,CAAC,MAAM,OAAO,SAAS,QAAQ,MAAM,aAAa,aAAa,OAAO;AACtF,MAAI,CAAC,MAAO,QAAO,EAAE,SAAS,MAAM,CAAC,EAAE;AACvC,QAAM,OAAqB,CAAC;AAC5B,MAAI,KAAK;AACT,aAAW,cAAc,MAAM,aAAa;AAC1C,QAAI,WAAW,SAAS,cAAe;AACvC,UAAM,aACJ,WAAW,cACX,IAAI,MAAM,OACP,IAAI,WAAW,SAAS,YAAY,CAAC,GACpC,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,EACnC,IAAI,CAAC,MAAM,EAAE,IAAI,KACpB,CAAC;AACH,eAAW,QAAQ,QAAQ,CAAC,QAAQ,QAAQ;AAC1C,WAAK,KAAK;AAAA,QACR;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX;AAAA,QACA,WAAW,GAAG,KAAK;AAAA,QACnB,WAAW,YAAY;AAAA,QACvB,WAAW,YAAY;AAAA,QACvB;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AACD;AAAA,EACF;AACA,SAAO,EAAE,SAAS,KAAK;AACzB;AAEA,SAAS,sBAAsB,MAA2B,KAAsC;AAC9F,QAAM,UAAU,CAAC,SAAS,SAAS,UAAU,MAAM;AACnD,QAAM,SAAS,KAAK,CAAC,KAAK,QAAQ,KAAK,CAAC,MAAM,OAAO,OAAO,KAAK,CAAC,CAAC,EAAE,YAAY,IAAI;AACrF,QAAM,OAAqB,CAAC;AAC5B,aAAW,SAAS,IAAI,MAAM,OAAO,OAAO,GAAG;AAC7C,QAAI,UAAU,MAAM,KAAK,YAAY,MAAM,OAAQ;AACnD,QAAI,OAAO;AACX,eAAW,cAAc,MAAM,aAAa;AAC1C,UAAI,WAAW,SAAS,cAAe;AACvC,YAAM,SAAS,IAAI,MAAM,OAAO,IAAI,WAAW,SAAS,YAAY,CAAC;AACrE,YAAM,aAAa,WAAW,cAAc,QAAQ,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC;AAC/G,iBAAW,OAAO,MAAM,KAAK,GAAG;AAC9B,YAAI,UAAU;AACd,cAAM,cAA0B,CAAC;AACjC,mBAAW,OAAO,WAAW,SAAS;AACpC,gBAAM,QAAQ,IAAI,OAAO,IAAI,IAAI,YAAY,CAAC,KAAK;AACnD,sBAAY,KAAK,KAAK;AACtB,cAAI,UAAU,KAAM,WAAU;AAAA,QAChC;AACA,YAAI,QAAS;AACb,YAAI,CAAC,UAAU,CAAC,eAAe,QAAQ,YAAY,WAAW,GAAG;AAC/D,eAAK,KAAK,CAAC,MAAM,MAAM,IAAI,OAAO,WAAW,UAAU,IAAI,CAAC;AAAA,QAC9D;AAAA,MACF;AACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,SAAS,KAAK;AACzB;AAEA,SAAS,eAAe,QAAe,YAAsB,aAAkC;AAC7F,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,aAAW,OAAO,OAAO,KAAK,GAAG;AAC/B,QAAI,KAAK;AACT,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,YAAM,YAAY,IAAI,OAAO,IAAI,WAAW,CAAC,EAAG,YAAY,CAAC,KAAK;AAClE,UAAI,CAAC,eAAe,WAAW,YAAY,CAAC,KAAK,IAAI,GAAG;AACtD,aAAK;AACL;AAAA,MACF;AAAA,IACF;AACA,QAAI,GAAI,QAAO;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAAS,eAAe,GAAa,GAAsB;AACzD,MAAI,MAAM,QAAQ,MAAM,KAAM,QAAO,MAAM;AAC3C,MAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SAAU,QAAO,MAAM;AACjE,MAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AAClD,WAAO,OAAO,CAAoB,MAAM,OAAO,CAAoB;AAAA,EACrE;AACA,MAAI,aAAa,cAAc,aAAa,WAAY,QAAO;AAC/D,SAAO,OAAO,CAAC,MAAM,OAAO,CAAC;AAC/B;AAEA,SAAS,mBAAmB,KAAsC;AAChE,QAAM,OAAqB,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC;AAC3C,MAAI,MAAM;AACV,aAAW,CAAC,MAAM,QAAQ,KAAK,IAAI,MAAM,UAAU;AACjD,UAAM,OAAO,SAAS,aAAa,aAAa,KAAK,SAAS;AAC9D,SAAK,KAAK,CAAC,OAAO,MAAM,IAAI,CAAC;AAAA,EAC/B;AACA,SAAO,EAAE,SAAS,CAAC,OAAO,QAAQ,MAAM,GAAG,KAAK;AAClD;AAEA,SAAS,gBAAgB,KAAsC;AAC7D,QAAM,UAAU,CAAC,UAAU,QAAQ,QAAQ,QAAQ,MAAM,QAAQ;AACjE,QAAM,OAAqB,CAAC;AAC5B,aAAW,SAAS,IAAI,MAAM,OAAO,OAAO,GAAG;AAC7C,SAAK,KAAK,CAAC,QAAQ,MAAM,MAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,eAAe,IAAI,GAAG,MAAM,SAAS,IAAI,CAAC,CAAC;AAAA,EACjH;AACA,aAAW,QAAQ,IAAI,MAAM,MAAM,OAAO,GAAG;AAC3C,UAAM,OAAO,KAAK,SAAS,UAAU;AACrC,SAAK,KAAK,CAAC,QAAQ,KAAK,MAAM,QAAQ,MAAM,GAAG,CAAC,CAAC;AAAA,EACnD;AACA,aAAW,MAAM,IAAI,MAAM,cAAc,OAAO,GAAG;AACjD,SAAK,KAAK,CAAC,QAAQ,GAAG,MAAM,WAAW,GAAG,QAAQ,QAAQ,GAAG,CAAC,CAAC;AAAA,EACjE;AACA,OAAK,KAAK,CAAC,QAAQ,iBAAiB,SAAS,GAAG,GAAG,CAAC,CAAC;AACrD,OAAK,KAAK,CAAC,QAAQ,sBAAsB,SAAS,GAAG,GAAG,CAAC,CAAC;AAC1D,aAAW,CAAC,MAAM,KAAK,IAAI,MAAM,UAAU;AACzC,SAAK,KAAK,CAAC,QAAQ,iBAAiB,SAAS,GAAG,GAAG,CAAC,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,SAAS,KAAK;AACzB;AAEA,SAAS,qBAAwC;AAC/C,QAAM,UAAU,CAAC,QAAQ,WAAW,QAAQ,OAAO,QAAQ,OAAO;AAClE,QAAM,OAAqB,CAAC;AAC5B,QAAM,MAAM,CAAC,MAAc,MAAc,MAAc,UAAwB;AAC7E,SAAK,KAAK,CAAC,MAAM,GAAG,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,EAChD;AACA,aAAW,QAAQ,OAAO,KAAK,mBAAmB,CAAC,EAAG,KAAI,MAAM,KAAK,IAAI,OAAO;AAChF,aAAW,QAAQ,OAAO,KAAK,iBAAiB,EAAG,KAAI,MAAM,KAAK,IAAI,OAAO;AAC7E,aAAW,QAAQ,OAAO,KAAK,mBAAmB,EAAG,KAAI,MAAM,KAAK,IAAI,OAAO;AAC/E,aAAW,QAAQ,OAAO,KAAK,aAAa,EAAG,KAAI,MAAM,KAAK,IAAI,OAAO;AACzE,aAAW,QAAQ,OAAO,KAAK,eAAe,EAAG,KAAI,MAAM,KAAK,IAAI,OAAO;AAC3E,aAAW,QAAQ,OAAO,KAAK,iBAAiB,EAAG,KAAI,MAAM,KAAK,IAAI,OAAO;AAC7E,aAAW,QAAQ,OAAO,KAAK,kBAAkB,GAAG;AAClD,QAAI,MAAM,KAAK,SAAS,UAAU,IAAI,GAAG,OAAO;AAChD,QAAI,SAAS,QAAS,KAAI,MAAM,KAAK,GAAG,OAAO;AAAA,EACjD;AACA,aAAW,QAAQ,OAAO,KAAK,sBAAsB,EAAG,KAAI,MAAM,KAAK,IAAI,OAAO;AAClF,aAAW,QAAQ,OAAO,KAAK,eAAe,EAAG,KAAI,MAAM,KAAK,IAAI,OAAO;AAC3E,aAAW,QAAQ,CAAC,mBAAmB,aAAa,WAAW,GAAG;AAChE,QAAI,MAAM,KAAK,IAAI,OAAO;AAAA,EAC5B;AACA,OAAK,KAAK,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC,CAAC,EAAE,cAAc,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;AAC3F,SAAO,EAAE,SAAS,KAAK;AACzB;AAEA,SAAS,mBAAsC;AAC7C,QAAM,QAAQ,oBAAI,IAAY;AAAA,IAC5B,GAAG;AAAA,IACH,GAAG,iBAAiB,IAAI,CAAC,MAAM,UAAU,CAAC,EAAE;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO;AAAA,IACL,SAAS,CAAC,MAAM;AAAA,IAChB,MAAM,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAAA,EAC1E;AACF;AAEA,SAAS,eAAe,MAA2B,QAAwB;AACzE,MAAI,KAAK,WAAW,KAAK,KAAK,CAAC,KAAK,MAAM;AACxC,UAAM,IAAI,YAAY,+BAA+B,MAAM,IAAI,QAAQ;AAAA,EACzE;AACA,QAAM,QAAQ,KAAK,CAAC;AACpB,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK;AAC/E,QAAM,IAAI,YAAY,+BAA+B,MAAM,IAAI,QAAQ;AACzE;AAGO,SAAS,eAAe,MAAmB,KAA+B;AAC/E,MAAI,SAAS,KAAM,QAAO,CAAC;AAC3B,MAAI,KAAK,SAAS,YAAY,KAAK,UAAU,KAAM,QAAO,CAAC,KAAK,IAAI;AACpE,MAAI,KAAK,SAAS,UAAW,QAAO,CAAC,KAAK,KAAiB;AAC3D,SAAO,CAAC,SAAS,MAAM,IAAI,kBAAkB,CAAC,CAAC;AACjD;AAEO,SAAS,mBAAmB,MAAY,KAA6B;AAC1E,MAAI,KAAK,SAAS,YAAY,KAAK,UAAU,MAAM;AACjD,UAAM,UAAU,KAAK,KAAK,YAAY;AACtC,QAAI,YAAY,QAAQ,YAAY,UAAU,YAAY,MAAO,QAAO;AACxE,QAAI,YAAY,SAAS,YAAY,WAAW,YAAY,KAAM,QAAO;AACzE,WAAO,KAAK;AAAA,EACd;AACA,SAAO,SAAS,MAAM,IAAI,kBAAkB,CAAC;AAC/C;AAEO,SAAS,gBAAgB,OAAyB;AACvD,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,MAAM,KAAK;AACtD,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK;AAClD,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,OAAO,SAAS,OAAO,EAAE;AACnC,WAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,EAClC;AACA,QAAM,QAAQ,UAAU,KAAK;AAC7B,SAAO,UAAU,OAAO,IAAI,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI;AAC1E;AAEO,SAAS,mBAAmB,OAA0B;AAC3D,SAAO,YAAY,KAAK,MAAM;AAChC;;;ACnhBA,IAAM,WAAW,oBAAI,IAA2B;AAEzC,SAAS,4BAA4B,MAAc,IAAyB;AACjF,WAAS,IAAI,KAAK,YAAY,GAAG,EAAE;AACrC;AAEO,SAAS,uBAAuB,MAAyC;AAC9E,SAAO,SAAS,IAAI,KAAK,YAAY,CAAC;AACxC;AAMO,SAAS,iCAAiC,MAAuB;AACtE,SAAO,SAAS,IAAI,KAAK,YAAY,CAAC;AACxC;;;AClBA,SAAS,YACP,OACA,aACA,SACA,MACmB;AACnB,QAAM,QAAQ,SAAS;AACvB,SAAO;AAAA,IACL;AAAA,IACA,MAAM,KAAK,IAAI,CAAC,SAAS;AAAA,MACvB,OAAO,QAAQ,IAAI,CAAC,MAAM,WAAW;AAAA,QACnC;AAAA,QACA;AAAA,QACA,OAAO,IAAI,KAAK,KAAK;AAAA,MACvB,EAAE;AAAA,IACJ,EAAE;AAAA,EACJ;AACF;AAEA,IAAI,aAAa;AAGV,SAAS,6BAAmC;AACjD,MAAI,WAAY;AAChB,eAAa;AACb,aAAW,YAAY,kBAAkB;AACvC,UAAM,UAAU,UAAU,QAAQ;AAClC,gCAA4B,SAAS,CAAC,MAAM,OAAO,QAAQ;AACzD,YAAM,SAAS,YAAY,UAAU,MAAM,GAAG;AAC9C,aAAO,YAAY,OAAO,SAAS,OAAO,SAAS,OAAO,IAAI;AAAA,IAChE,CAAC;AAAA,EACH;AACF;;;ACtBA,IAAM,mBAAmB,CAAC,OAAO,SAAS,QAAQ,QAAQ,MAAM,UAAU,WAAW,MAAM;AAE3F,SAAS,cACP,OACA,aACA,MACmB;AACnB,QAAM,QAAQ,SAAS;AACvB,SAAO;AAAA,IACL,SAAS,CAAC,GAAG,gBAAgB;AAAA,IAC7B,MAAM,KAAK,IAAI,CAAC,SAAS;AAAA,MACvB,OAAO,iBAAiB,IAAI,CAAC,UAAU;AAAA,QACrC;AAAA,QACA;AAAA,QACA,OAAO,IAAI,IAAI;AAAA,MACjB,EAAE;AAAA,IACJ,EAAE;AAAA,EACJ;AACF;AAEA,4BAA4B,mBAAmB,CAAC,MAAM,UAAU;AAC9D,MAAI,KAAK,SAAS,KAAK,KAAK,SAAS,GAAG;AACtC,UAAM,IAAI,YAAY,2DAA2D,QAAQ;AAAA,EAC3F;AACA,QAAM,QAAQ,UAAU,KAAK,CAAC,KAAK,IAAI;AACvC,QAAM,OAAO,UAAU,KAAK,CAAC,KAAK,IAAI;AACtC,QAAM,OAAO,KAAK,WAAW,IAAI,UAAU,KAAK,CAAC,KAAK,IAAI,IAAI;AAC9D,MAAI,UAAU,QAAQ,SAAS,QAAQ,SAAS,MAAM;AACpD,UAAM,IAAI,YAAY,qBAAqB,mBAAmB;AAAA,EAChE;AACA,MAAI,SAAS,MAAM,SAAS,EAAG,OAAM,IAAI,YAAY,yBAAyB,QAAQ;AACtF,QAAM,SAAS,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC/D,QAAM,QAAQ,OAAO,SAAS,WAAW,OAAO,OAAO,IAAI;AAC3D,QAAM,QAAQ,OAAO,SAAS,WAAW,OAAO,OAAO,IAAI;AAC3D,QAAM,QAAQ,SAAS;AACvB,QAAM,OAAmB,CAAC;AAC1B,MAAI,QAAQ,IAAI;AACd,aAAS,QAAQ,QAAQ,SAAS,OAAO,SAAS,OAAO;AACvD,WAAK,KAAK;AAAA,QACR,OAAO,CAAC,EAAE,OAAO,MAAM,SAAS,OAAO,QAAQ,KAAK,EAAE,CAAC;AAAA,MACzD,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,aAAS,QAAQ,QAAQ,SAAS,OAAO,SAAS,OAAO;AACvD,WAAK,KAAK;AAAA,QACR,OAAO,CAAC,EAAE,OAAO,MAAM,SAAS,OAAO,QAAQ,KAAK,EAAE,CAAC;AAAA,MACzD,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,EAAE,SAAS,CAAC,OAAO,GAAG,KAAK;AACpC,CAAC;AAED,4BAA4B,aAAa,CAAC,MAAM,UAAU;AACxD,MAAI,KAAK,SAAS,KAAK,KAAK,SAAS,GAAG;AACtC,UAAM,IAAI,YAAY,qDAAqD,QAAQ;AAAA,EACrF;AACA,SAAO,cAAc,OAAO,aAAa,aAAa,KAAK,CAAC,GAAI,KAAK,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,4BAA4B,aAAa,CAAC,MAAM,UAAU;AACxD,MAAI,KAAK,SAAS,KAAK,KAAK,SAAS,GAAG;AACtC,UAAM,IAAI,YAAY,qDAAqD,QAAQ;AAAA,EACrF;AACA,SAAO,cAAc,OAAO,aAAa,aAAa,KAAK,CAAC,GAAI,KAAK,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,QAAQ,OAAgC;AAC/C,SAAO,SAAS,OAAO,OAAO,gBAAgB,KAAK,SAAS,OAAO,OAAO,gBAAgB,IAAI,OAAO,KAAK,IAAI;AAChH;AAEO,SAAS,sBACd,MACA,MACA,OACA,KACA,OACA,QACmB;AACnB,6BAA2B;AAC3B,QAAM,KAAK,uBAAuB,IAAI;AACtC,MAAI,CAAC,GAAI,OAAM,IAAI,YAAY,kCAAkC,IAAI,IAAI,eAAe;AACxF,QAAM,SAAS,KAAK,IAAI,CAAC,QAAQ,SAAS,KAAK,IAAI,kBAAkB,SAAS,MAAM,MAAM,CAAC,CAAC;AAC5F,SAAO,GAAG,QAAQ,OAAO,GAAG;AAC9B;AAOO,SAAS,uBAAuB,MAAuB;AAC5D,6BAA2B;AAC3B,SAAO,iCAAiC,IAAI;AAC9C;;;ACjGO,SAAS,kBAAkB,OAA0C;AAC1E,QAAM,SAAS,CAAC,GAAG,MAAM,OAAO,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAMC,cAAa,EAAE,MAAM,EAAE,IAAI,CAAC;AACrF,QAAM,UAAU,CAAC,GAAG,MAAM,QAAQ,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAMA,cAAa,EAAE,MAAM,EAAE,IAAI,CAAC;AACvF,QAAM,QAAQ,CAAC,GAAG,MAAM,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAMA,cAAa,EAAE,MAAM,EAAE,IAAI,CAAC;AACnF,QAAM,WAAW,CAAC,GAAG,MAAM,SAAS,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAMA,cAAa,EAAE,MAAM,EAAE,IAAI,CAAC;AAEzF,QAAM,OAA2B,CAAC;AAClC,MAAI,WAAW;AAEf,aAAW,SAAS,QAAQ;AAC1B,SAAK,KAAK;AAAA,MACR,MAAM;AAAA,MACN,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM;AAAA,MAChB,UAAU;AAAA,MACV,KAAK,MAAM;AAAA,IACb,CAAC;AAAA,EACH;AACA,aAAW,SAAS,SAAS;AAC3B,SAAK,KAAK;AAAA,MACR,MAAM;AAAA,MACN,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM;AAAA,MAChB,UAAU;AAAA,MACV,KAAK,MAAM;AAAA,IACb,CAAC;AAAA,EACH;AACA,aAAW,QAAQ,OAAO;AACxB,SAAK,KAAK;AAAA,MACR,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,MACf,UAAU;AAAA,MACV,KAAK,KAAK;AAAA,IACZ,CAAC;AAAA,EACH;AACA,aAAW,WAAW,UAAU;AAC9B,SAAK,KAAK;AAAA,MACR,MAAM;AAAA,MACN,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,UAAU;AAAA,MACV,KAAK,QAAQ;AAAA,IACf,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAGA,SAASA,cAAa,GAAW,GAAmB;AAClD,SAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAClC;AAEO,SAAS,mBAAmB,OAAsB,OAAO,iBAAwB;AACtF,QAAM,UAAU,IAAI,MAAM,MAAM;AAAA,IAC9B,eAAe,QAAQ,MAAM;AAAA,IAC7B,eAAe,QAAQ,MAAM;AAAA,IAC7B,eAAe,YAAY,MAAM;AAAA,IACjC,eAAe,YAAY,SAAS;AAAA,IACpC,eAAe,OAAO,MAAM;AAAA,EAC9B,CAAC;AAED,aAAW,OAAO,kBAAkB,KAAK,GAAG;AAC1C,YAAQ,OAAO;AAAA,MACb,QAAQ;AAAA,QACN,MAAM,IAAI;AAAA,QACV,MAAM,IAAI;AAAA,QACV,UAAU,IAAI;AAAA,QACd,UAAU,IAAI;AAAA,QACd,KAAK,IAAI;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,OAA6B;AAC7D,SAAO,mBAAmB,OAAO,eAAe;AAClD;AAEO,SAAS,kBAAkB,OAA6B;AAC7D,SAAO,mBAAmB,OAAO,eAAe;AAClD;;;AC7FO,SAAS,WAAW,MAAY,OAAsB;AAC3D,MAAI,KAAK,SAAS,MAAM,KAAM,QAAO;AACrC,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,MAAM,SAAS,aAAa,YAAY,KAAK,OAAO,MAAM,KAAK;AAAA,IACxE,KAAK;AACH,aACE,MAAM,SAAS,aACd,KAAK,SAAS,IAAI,YAAY,OAAO,MAAM,SAAS,IAAI,YAAY,KACrE,KAAK,KAAK,YAAY,MAAM,MAAM,KAAK,YAAY;AAAA,IAEvD,KAAK;AACH,aAAO,MAAM,SAAS,WAAW,KAAK,OAAO,MAAM,MAAM,WAAW,KAAK,MAAM,MAAM,IAAI;AAAA,IAC3F,KAAK;AACH,aACE,MAAM,SAAS,YACf,KAAK,OAAO,MAAM,MAClB,WAAW,KAAK,MAAM,MAAM,IAAI,KAChC,WAAW,KAAK,OAAO,MAAM,KAAK;AAAA,IAEtC,KAAK;AACH,aACE,MAAM,SAAS,cACf,KAAK,KAAK,YAAY,MAAM,MAAM,KAAK,YAAY,KACnD,KAAK,aAAa,MAAM,YACxB,UAAU,KAAK,MAAM,MAAM,IAAI;AAAA,IAEnC,KAAK;AACH,aACE,MAAM,SAAS,aACf,KAAK,UAAU,YAAY,MAAM,MAAM,UAAU,YAAY,KAC7D,WAAW,KAAK,MAAM,MAAM,IAAI;AAAA,IAEpC,KAAK;AACH,aACE,MAAM,SAAS,WACd,KAAK,YAAY,IAAI,YAAY,OAAO,MAAM,YAAY,IAAI,YAAY,KAC3E,WAAW,KAAK,MAAM,MAAM,IAAI;AAAA,IAEpC;AACE,aAAO,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,KAAK;AAAA,EACxD;AACF;AAEA,SAAS,UAAU,MAAoB,OAA8B;AACnE,MAAI,SAAS,OAAO,UAAU,IAAK,QAAO,SAAS;AACnD,MAAI,KAAK,WAAW,MAAM,OAAQ,QAAO;AACzC,SAAO,KAAK,MAAM,CAAC,MAAM,UAAU,WAAW,MAAM,MAAM,KAAK,CAAE,CAAC;AACpE;AAEA,SAAS,YAAY,MAAe,OAAyB;AAC3D,MAAI,SAAS,MAAO,QAAO;AAC3B,MAAI,gBAAgB,cAAc,iBAAiB,YAAY;AAC7D,QAAI,KAAK,WAAW,MAAM,OAAQ,QAAO;AACzC,WAAO,KAAK,MAAM,CAAC,MAAM,UAAU,SAAS,MAAM,KAAK,CAAC;AAAA,EAC1D;AACA,SAAO;AACT;;;AC9CO,SAAS,aAAa,MAAoB;AAC/C,MAAI,KAAK,SAAS,YAAY,KAAK,OAAO,OAAO;AAC/C,WAAO,CAAC,GAAG,aAAa,KAAK,IAAI,GAAG,GAAG,aAAa,KAAK,KAAK,CAAC;AAAA,EACjE;AACA,SAAO,CAAC,IAAI;AACd;AAEA,SAAS,qBAAqB,MAAqB;AACjD,SAAO,KAAK,SAAS;AACvB;AAEO,SAAS,qBAAqB,MAAkC;AACrE,MAAI,KAAK,SAAS,YAAa,KAAK,OAAO,OAAO,KAAK,OAAO,KAAO,QAAO;AAC5E,MAAI,KAAK,KAAK,SAAS,YAAY,qBAAqB,KAAK,KAAK,GAAG;AACnE,WAAO,EAAE,OAAO,KAAK,KAAK,OAAO,QAAQ,KAAK,KAAK,MAAM,WAAW,KAAK,MAAM;AAAA,EACjF;AACA,MAAI,KAAK,MAAM,SAAS,YAAY,qBAAqB,KAAK,IAAI,GAAG;AACnE,WAAO,EAAE,OAAO,KAAK,MAAM,OAAO,QAAQ,KAAK,MAAM,MAAM,WAAW,KAAK,KAAK;AAAA,EAClF;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,MAAoD;AACtF,MAAI,KAAK,SAAS,YAAa,KAAK,OAAO,OAAO,KAAK,OAAO,KAAO,QAAO;AAC5E,MAAI,KAAK,KAAK,SAAS,YAAY,qBAAqB,KAAK,KAAK,GAAG;AACnE,WAAO,EAAE,MAAM,KAAK,MAAM,WAAW,KAAK,MAAM;AAAA,EAClD;AACA,MAAI,KAAK,MAAM,SAAS,YAAY,qBAAqB,KAAK,IAAI,GAAG;AACnE,WAAO,EAAE,MAAM,KAAK,OAAO,WAAW,KAAK,KAAK;AAAA,EAClD;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,OAAa,gBAA6B,OAAe,WAA4B;AACrH,aAAW,QAAQ,aAAa,KAAK,GAAG;AACtC,UAAM,KAAK,qBAAqB,IAAI;AACpC,QAAI,CAAC,GAAI,QAAO;AAChB,QAAI,CAAC,aAAa,GAAG,OAAO,OAAO,SAAS,EAAG,QAAO;AACtD,UAAM,MAAM,GAAG,OAAO,YAAY;AAClC,QAAI,CAAC,eAAe,IAAI,GAAG,KAAK,CAAC,YAAY,GAAG,MAAM,EAAG,QAAO;AAAA,EAClE;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAsB,OAAe,WAA4B;AACrF,MAAI,UAAU,KAAM,QAAO;AAC3B,QAAM,MAAM,MAAM,YAAY;AAC9B,SAAO,QAAQ,MAAM,YAAY,KAAK,QAAQ,UAAU,YAAY;AACtE;AAEA,SAAS,YAAY,MAAuB;AAC1C,QAAM,MAAM,KAAK,YAAY;AAC7B,SAAO,QAAQ,WAAW,QAAQ,aAAa,QAAQ;AACzD;AAWO,SAAS,oBAAoB,MAAgB,OAAa,KAA0C;AACzG,MAAI,KAAK,SAAS,QAAS,QAAO;AAClC,SAAO,gBAAgB,MAAM,OAAO,GAAG;AACzC;AAEO,SAAS,gBAAgB,MAAgB,OAAa,KAA0C;AACrG,QAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,QAAM,YAAY,KAAK,SAAS,GAAG,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK;AACrE,QAAM,KAAK,IAAI,MAAM,kBAAkB,KAAK,QAAQ,SAAS;AAC7D,MAAI,KAAK,KAAK,YAAY,MAAM,mBAAmB,KAAK,KAAK,YAAY,MAAM,gBAAiB,QAAO;AACvG,MAAI,GAAG,cAAc,IAAI,KAAK,KAAK,YAAY,CAAC,KAAK,GAAG,MAAM,IAAI,KAAK,KAAK,YAAY,CAAC,EAAG,QAAO;AACnG,MAAI,IAAI,KAAK,IAAI,KAAK,KAAK,YAAY,CAAC,EAAG,QAAO;AAElD,MAAI;AACJ,MAAI;AACF,YAAQ,GAAG,SAAS,KAAK,IAAI;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,aAAa,KAAK;AAChC,QAAM,aAAa,MAChB,IAAI,oBAAoB,EACxB,OAAO,CAAC,SAAgC,SAAS,IAAI,EACrD,OAAO,CAAC,SAAS,aAAa,KAAK,OAAO,OAAO,MAAM,IAAI,CAAC;AAE/D,QAAM,YAAY,CAAC,SAAqC;AACtD,QAAI;AACF,aAAO,SAAS,MAAM,IAAI,kBAAkB,IAAI,CAAC;AAAA,IACnD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,WAAwE,CAAC;AAC/E,aAAW,MAAM,YAAY;AAC3B,UAAM,QAAQ,UAAU,GAAG,SAAS;AACpC,QAAI,UAAU,OAAW;AACzB,aAAS,KAAK,EAAE,OAAO,GAAG,OAAO,QAAQ,GAAG,QAAQ,MAAM,CAAC;AAAA,EAC7D;AAEA,QAAM,KAAK,MAAM,gBAAgB;AACjC,aAAW,MAAM,UAAU;AACzB,UAAM,MAAM,GAAG,OAAO,YAAY;AAClC,QAAI,YAAY,GAAG,MAAM,KAAM,MAAM,QAAQ,GAAG,KAAK,YAAY,GAAI;AACnE,YAAM,MAAM,MAAM,SAAS,GAAG,KAAK;AACnC,YAAM,iBAAiB,oBAAI,IAAY,CAAC,KAAK,SAAS,WAAW,KAAK,CAAC;AACvE,UAAI,GAAI,gBAAe,IAAI,GAAG,aAAa,GAAG,KAAK,YAAY,CAAC;AAChE,UAAI,IAAK,QAAO,EAAE,OAAO,OAAO,MAAM,CAAC,GAAG,GAAG,eAAe;AAC5D,UAAI,GAAG,UAAU,QAAQ,OAAO,GAAG,UAAU,YAAY,OAAO,GAAG,UAAU,UAAU;AACrF,eAAO,EAAE,OAAO,OAAO,MAAM,CAAC,GAAG,eAAe;AAAA,MAClD;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,WAAW,oBAAI,IAAsB;AAC3C,aAAW,MAAM,SAAU,UAAS,IAAI,GAAG,OAAO,YAAY,GAAG,GAAG,KAAK;AAEzE,MAAI,OAA+D;AACnE,aAAW,aAAa,MAAM,SAAS;AACrC,UAAM,QAAQ,GAAG,QAAQ,IAAI,UAAU,YAAY,CAAC;AACpD,QAAI,CAAC,MAAO;AACZ,QAAI,MAAM,SAAS,CAAC,MAAM,KAAK,CAAC,SAAS,WAAW,MAAM,MAAM,KAAM,CAAC,EAAG;AAE1E,QAAI,MAAM,QAAQ,KAAK,CAAC,WAAW,OAAO,IAAI,GAAG;AAC/C,YAAMC,UAAqB,CAAC;AAC5B,iBAAW,UAAU,MAAM,SAAS;AAClC,YAAI,CAAC,OAAO,MAAM;AAChB,gBAAMC,SAAQ,SAAS,IAAI,OAAO,KAAK,YAAY,CAAC;AACpD,cAAIA,WAAU,OAAW;AACzB,UAAAD,QAAO,KAAK,sBAAsBC,QAAO,OAAO,WAAW,QAAQ,CAAC;AACpE;AAAA,QACF;AACA,cAAM,QAAQ,MAAM,IAAI,mBAAmB,EAAE,KAAK,CAAC,SAAS,QAAQ,WAAW,KAAK,MAAM,OAAO,IAAK,CAAC;AACvG,YAAI,CAAC,MAAO;AACZ,cAAM,QAAQ,UAAU,MAAM,SAAS;AACvC,YAAI,UAAU,OAAW;AACzB,QAAAD,QAAO,KAAK,sBAAsB,OAAO,OAAO,WAAW,QAAQ,CAAC;AAAA,MACtE;AACA,UAAIA,QAAO,WAAW,EAAG;AACzB,YAAME,UACJF,QAAO,WAAW,MAAM,QAAQ,SAAS,MAAM,MAAM,OAAOA,OAAM,IAAI,MAAM,MAAM,aAAaA,OAAM;AACvG,aAAO,EAAE,QAAAE,SAAQ,SAAS,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,KAAK,YAAY,CAAC,EAAE;AACnF,UAAI,MAAM,UAAUA,QAAO,UAAU,EAAG;AACxC;AAAA,IACF;AAEA,UAAM,SAAqB,CAAC;AAC5B,eAAW,UAAU,MAAM,SAAS;AAClC,YAAM,QAAQ,SAAS,IAAI,OAAO,KAAK,YAAY,CAAC;AACpD,UAAI,UAAU,OAAW;AACzB,aAAO,KAAK,sBAAsB,OAAO,OAAO,WAAW,QAAQ,CAAC;AAAA,IACtE;AACA,QAAI,OAAO,WAAW,EAAG;AACzB,UAAM,SACJ,OAAO,WAAW,MAAM,QAAQ,SAAS,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,aAAa,MAAM;AACvG,WAAO,EAAE,QAAQ,SAAS,MAAM,QAAQ,MAAM,GAAG,OAAO,MAAM,EAAE,IAAI,CAAC,WAAW,OAAO,KAAK,YAAY,CAAC,EAAE;AAC3G,QAAI,MAAM,UAAU,OAAO,WAAW,MAAM,QAAQ,OAAQ;AAC5D,QAAI,OAAO,UAAU,EAAG;AAAA,EAC1B;AAEA,MAAI,MAAM;AACR,UAAM,OAAc,CAAC;AACrB,eAAW,SAAS,KAAK,QAAQ;AAC/B,YAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,UAAI,IAAK,MAAK,KAAK,GAAG;AAAA,IACxB;AACA,SAAK,KAAK,CAAC,GAAG,MAAMC,eAAc,EAAE,OAAO,EAAE,KAAK,CAAC;AACnD,WAAO,EAAE,OAAO,OAAO,MAAM,gBAAgB,IAAI,IAAI,KAAK,OAAO,EAAE;AAAA,EACrE;AAEA,aAAW,MAAM,UAAU;AACzB,UAAM,MAAM,GAAG,OAAO,YAAY;AAClC,QAAI,YAAY,GAAG,MAAM,EAAG;AAC5B,UAAM,SAAS,MAAM,eAAe,KAAK,GAAG,KAAK;AACjD,QAAI,CAAC,OAAQ;AACb,WAAO,KAAK,CAAC,GAAG,MAAMA,eAAc,EAAE,OAAO,EAAE,KAAK,CAAC;AACrD,WAAO,EAAE,OAAO,OAAO,MAAM,QAAQ,gBAAgB,oBAAI,IAAI,CAAC,GAAG,CAAC,EAAE;AAAA,EACtE;AAEA,QAAM,QAAQ,kBAAkB,KAAK,KAAK,iBAAiB,KAAK;AAChE,MAAI,SAAS,aAAa,MAAM,OAAO,OAAO,MAAM,IAAI,GAAG;AACzD,UAAM,QAAQ,UAAU,MAAM,SAAS;AACvC,UAAM,SAAS,MAAM,aAAa,UAAU,MAAM,UAAU,IAAI;AAChE,QAAI,UAAU,QAAW;AACvB,iBAAW,aAAa,MAAM,SAAS;AACrC,cAAM,QAAQ,GAAG,QAAQ,IAAI,UAAU,YAAY,CAAC;AACpD,YAAI,CAAC,SAAS,MAAM,SAAS,MAAM,QAAQ,WAAW,EAAG;AACzD,YAAI,MAAM,QAAQ,CAAC,EAAG,KAAM;AAC5B,YAAI,MAAM,QAAQ,CAAC,EAAG,KAAK,YAAY,MAAM,MAAM,OAAO,YAAY,EAAG;AACzE,cAAM,QAAQ,sBAAsB,OAAO,MAAM,QAAQ,CAAC,EAAG,WAAW,QAAQ;AAChF,cAAM,SACJ,WAAW,SAAY,sBAAsB,QAAQ,MAAM,QAAQ,CAAC,EAAG,WAAW,QAAQ,IAAI;AAChG,cAAM,SAAS,MAAM,MAAM,YAAY,MAAM,IAAI,OAAO,MAAM;AAC9D,cAAM,OAAc,CAAC;AACrB,mBAAW,SAAS,QAAQ;AAC1B,gBAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,cAAI,IAAK,MAAK,KAAK,GAAG;AAAA,QACxB;AACA,eAAO,EAAE,OAAO,OAAO,MAAM,gBAAgB,oBAAI,IAAI,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC,EAAE;AAAA,MACrF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBACP,MACkH;AAClH,MAAI,KAAK,SAAS,SAAU,QAAO;AACnC,QAAM,KAAK,KAAK;AAChB,MAAI,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,OAAO,KAAM,QAAO;AACnE,MAAI,KAAK,KAAK,SAAS,YAAY,qBAAqB,KAAK,KAAK,GAAG;AACnE,WAAO,EAAE,OAAO,KAAK,KAAK,OAAO,QAAQ,KAAK,KAAK,MAAM,IAAI,WAAW,KAAK,MAAM;AAAA,EACrF;AACA,MAAI,KAAK,MAAM,SAAS,YAAY,qBAAqB,KAAK,IAAI,GAAG;AACnE,UAAM,UAAU,OAAO,MAAM,MAAM,OAAO,OAAO,OAAO,OAAO,MAAM,MAAM;AAC3E,WAAO,EAAE,OAAO,KAAK,MAAM,OAAO,QAAQ,KAAK,MAAM,MAAM,IAAI,SAAS,WAAW,KAAK,KAAK;AAAA,EAC/F;AACA,SAAO;AACT;AAEA,SAAS,iBACP,MACmG;AACnG,MAAI,KAAK,SAAS,aAAa,KAAK,OAAO,KAAK,KAAK,SAAS,SAAU,QAAO;AAC/E,SAAO;AAAA,IACL,OAAO,KAAK,KAAK;AAAA,IACjB,QAAQ,KAAK,KAAK;AAAA,IAClB,IAAI;AAAA,IACJ,WAAW,KAAK;AAAA,IAChB,YAAY,KAAK;AAAA,EACnB;AACF;AAEO,SAAS,gBACd,MACA,OACA,KACA,OACuB;AACvB,MAAI,KAAK,SAAS,WAAW,MAAM,KAAK,SAAS,SAAU,QAAO;AAClE,QAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,QAAM,KAAK,IAAI,MAAM,kBAAkB,KAAK,QAAQ,KAAK,SAAS,GAAG,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI;AAC3G,MAAI;AACJ,MAAI;AACF,YAAQ,GAAG,SAAS,KAAK,IAAI;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,MAAM,MAAM,KAAK,KAAK,YAAY;AACxC,aAAW,aAAa,MAAM,SAAS;AACrC,UAAM,QAAQ,GAAG,QAAQ,IAAI,UAAU,YAAY,CAAC;AACpD,QAAI,CAAC,SAAS,MAAM,SAAS,MAAM,QAAQ,WAAW,KAAK,MAAM,QAAQ,CAAC,EAAG,KAAM;AACnF,QAAI,MAAM,QAAQ,CAAC,EAAG,KAAK,YAAY,MAAM,IAAK;AAClD,UAAM,OAAO,MAAM,QAAQ;AAC3B,UAAM,OAAc,CAAC;AACrB,eAAW,SAAS,MAAM,MAAM,cAAc,IAAI,GAAG;AACnD,YAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,UAAI,IAAK,MAAK,KAAK,GAAG;AACtB,UAAI,UAAU,UAAa,KAAK,UAAU,MAAO;AAAA,IACnD;AACA,WAAO,EAAE,OAAO,OAAO,MAAM,gBAAgB,oBAAI,IAAI,CAAC,GAAG,CAAC,EAAE;AAAA,EAC9D;AACA,SAAO;AACT;AAEA,SAASA,eAAc,MAAa,OAAsB;AACxD,QAAM,IAAI,OAAO,SAAS,WAAW,OAAO,OAAO,IAAI;AACvD,QAAM,IAAI,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC1D,SAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAClC;AAkBO,SAAS,oBAAoB,OAAiB,IAAiB,KAA6C;AACjH,MAAI,CAAC,MAAM,MAAM,SAAS,QAAS,QAAO;AAC1C,MAAI,KAAK;AACP,UAAM,KAAK,IAAI,MAAM,kBAAkB,MAAM,QAAQ,MAAM,SAAS,GAAG,MAAM,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM,IAAI;AAChH,QAAI,GAAG,cAAc,IAAI,MAAM,KAAK,YAAY,CAAC,KAAK,GAAG,MAAM,IAAI,MAAM,KAAK,YAAY,CAAC,EAAG,QAAO;AACrG,QAAI,IAAI,KAAK,IAAI,MAAM,KAAK,YAAY,CAAC,EAAG,QAAO;AAAA,EACrD;AACA,QAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,QAAM,QAAiF,CAAC;AACxF,aAAW,QAAQ,aAAa,EAAE,GAAG;AACnC,QAAI,KAAK,SAAS,YAAa,KAAK,OAAO,OAAO,KAAK,OAAO,KAAO;AACrE,QAAI,KAAK,KAAK,SAAS,YAAY,KAAK,MAAM,SAAS,SAAU;AACjE,UAAM,cAAc,cAAc,KAAK,MAAM,OAAO,MAAM,IAAI;AAC9D,UAAM,eAAe,cAAc,KAAK,OAAO,OAAO,MAAM,IAAI;AAChE,QAAI,eAAe,CAAC,cAAc;AAChC,YAAM,KAAK,EAAE,aAAa,KAAK,KAAK,MAAM,WAAW,KAAK,MAAM,OAAO,YAAY,KAAK,MAAM,KAAK,CAAC;AAAA,IACtG,WAAW,gBAAgB,CAAC,aAAa;AACvC,YAAM,KAAK,EAAE,aAAa,KAAK,MAAM,MAAM,WAAW,KAAK,KAAK,OAAO,YAAY,KAAK,KAAK,KAAK,CAAC;AAAA,IACrG;AAAA,EACF;AACA,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,QAAQ,aAAa,EAAE;AAC7B,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC1C,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,YAAa,KAAK,OAAO,OAAO,KAAK,OAAO,KAAO,QAAO;AAC5E,QAAI,KAAK,KAAK,SAAS,YAAY,KAAK,MAAM,SAAS,SAAU,QAAO;AAAA,EAC1E;AAEA,MAAI,MAAM,KAAK,CAAC,SAAS,YAAY,KAAK,WAAW,CAAC,EAAG,QAAO;AAChE,SAAO;AAAA,IACL,cAAc,MAAM,IAAI,CAAC,SAAS,KAAK,WAAW;AAAA,IAClD,UAAU,MAAM,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,WAAW,QAAQ,KAAK,WAAW,EAAE;AAAA,EACpF;AACF;AAEO,SAAS,aAAa,OAAiB,IAAiB,KAAqC;AAClG,MAAI,CAAC,MAAM,MAAM,SAAS,QAAS,QAAO;AAC1C,QAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,QAAM,KAAK,IAAI,MAAM,kBAAkB,MAAM,QAAQ,MAAM,SAAS,GAAG,MAAM,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM,IAAI;AAChH,MAAI,GAAG,cAAc,IAAI,MAAM,KAAK,YAAY,CAAC,KAAK,GAAG,MAAM,IAAI,MAAM,KAAK,YAAY,CAAC,EAAG,QAAO;AACrG,MAAI,IAAI,KAAK,IAAI,MAAM,KAAK,YAAY,CAAC,EAAG,QAAO;AACnD,MAAI;AACJ,MAAI;AACF,YAAQ,GAAG,SAAS,MAAM,IAAI;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,QAAiF,CAAC;AACxF,aAAW,QAAQ,aAAa,EAAE,GAAG;AACnC,QAAI,KAAK,SAAS,YAAa,KAAK,OAAO,OAAO,KAAK,OAAO,KAAO;AACrE,QAAI,KAAK,KAAK,SAAS,YAAY,KAAK,MAAM,SAAS,SAAU;AACjE,UAAM,cAAc,cAAc,KAAK,MAAM,OAAO,MAAM,IAAI;AAC9D,UAAM,eAAe,cAAc,KAAK,OAAO,OAAO,MAAM,IAAI;AAChE,QAAI,eAAe,CAAC,cAAc;AAChC,YAAM,KAAK,EAAE,aAAa,KAAK,KAAK,MAAM,WAAW,KAAK,MAAM,OAAO,YAAY,KAAK,MAAM,KAAK,CAAC;AAAA,IACtG,WAAW,gBAAgB,CAAC,aAAa;AACvC,YAAM,KAAK,EAAE,aAAa,KAAK,MAAM,MAAM,WAAW,KAAK,KAAK,OAAO,YAAY,KAAK,KAAK,KAAK,CAAC;AAAA,IACrG;AAAA,EACF;AACA,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,KAAK,MAAM,gBAAgB;AACjC,QAAM,SAAS,MAAM;AAAA,IACnB,CAAC,SAAS,YAAY,KAAK,WAAW,KAAM,MAAM,KAAK,YAAY,YAAY,MAAM,GAAG,KAAK,YAAY;AAAA,EAC3G;AACA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,UAAU,MAAM,WAAW;AAAA,MAC3B,QAAQ,CAAC,YAAY;AACnB,cAAM,QAAQ,QAAQ,OAAO,WAAW,OAAO,UAAU;AACzD,cAAM,MAAM,MAAM,SAAS,KAAK;AAChC,eAAO,MAAM,CAAC,GAAG,IAAI,CAAC;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,aAAW,aAAa,MAAM,SAAS;AACrC,UAAM,QAA+B,GAAG,QAAQ,IAAI,UAAU,YAAY,CAAC;AAC3E,QAAI,CAAC,SAAS,MAAM,MAAO;AAC3B,UAAM,cAA4B,CAAC;AACnC,eAAW,UAAU,MAAM,SAAS;AAClC,YAAM,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,YAAY,YAAY,MAAM,OAAO,KAAK,YAAY,CAAC;AAC9F,UAAI,CAAC,KAAM;AACX,kBAAY,KAAK,IAAI;AAAA,IACvB;AACA,QAAI,YAAY,WAAW,MAAM,QAAQ,OAAQ;AACjD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,UAAU,YAAY,WAAW,MAAM;AAAA,MACvC,QAAQ,CAAC,YAAY;AACnB,cAAM,SAAS,YAAY;AAAA,UAAI,CAAC,MAAM,MACpC,sBAAsB,QAAQ,KAAK,WAAW,KAAK,UAAU,GAAG,MAAM,QAAQ,CAAC,GAAG,WAAW,QAAQ;AAAA,QACvG;AACA,cAAM,OAAc,CAAC;AACrB,mBAAW,SAAS,MAAM,MAAM,OAAO,MAAM,GAAG;AAC9C,gBAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,cAAI,IAAK,MAAK,KAAK,GAAG;AAAA,QACxB;AACA,aAAK,KAAK,CAAC,GAAG,MAAMA,eAAc,EAAE,OAAO,EAAE,KAAK,CAAC;AACnD,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,MAAM,KAAK,YAAY,YAAY;AACzC,QAAI,CAAC,YAAY,KAAK,WAAW,KAAK,MAAM,mBAAmB,GAAG,GAAG;AACnE,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,CAAC,YAAY;AACnB,gBAAM,OAAO,MAAM,eAAe,KAAK,QAAQ,KAAK,WAAW,KAAK,UAAU,CAAC;AAC/E,iBAAO,QAAQ,CAAC;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,QAAgD,OAAe,WAA4B;AAChH,SAAO,OAAO,UAAU,QAAQ,aAAa,OAAO,OAAO,OAAO,SAAS;AAC7E;;;AC5aO,SAAS,uBAAuB,MAAkB,KAAqC;AAC5F,MAAI,KAAK,QAAQ,KAAK,YAAY,KAAK,YAAY,KAAK,QAAQ,SAAS,KAAK,KAAK,UAAU,KAAK,QAAQ,SAAS;AACjH,WAAO;AACT,MAAI,KAAK,QAAQ,SAAS,EAAG,QAAO;AACpC,MAAI,KAAK,MAAM,SAAS,QAAS,QAAO;AACxC,aAAW,UAAU,KAAK,SAAS;AACjC,QAAI,OAAO,SAAS,OAAQ;AAC5B,QAAI,OAAO,KAAK,SAAS,SAAU,QAAO;AAAA,EAC5C;AAEA,QAAM,OAAO,KAAK;AAClB,QAAM,UAAU,KAAK,KAAK,YAAY;AACtC,MAAI,YAAY,mBAAmB,YAAY,gBAAiB,QAAO;AACvE,MAAI,IAAI,KAAK,IAAI,OAAO,EAAG,QAAO;AAClC,QAAM,YAAY,KAAK,SAAS,GAAG,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK;AACrE,QAAM,KAAK,IAAI,MAAM,kBAAkB,KAAK,QAAQ,SAAS;AAC7D,MAAI,GAAG,cAAc,IAAI,OAAO,KAAK,GAAG,MAAM,IAAI,OAAO,EAAG,QAAO;AAEnE,MAAI;AACJ,MAAI;AACF,YAAQ,GAAG,SAAS,KAAK,IAAI;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,MAAM,aAAc,QAAO;AAC/B,MAAI,MAAM,QAAQ,KAAK,CAAC,WAAW,OAAO,aAAa,CAAC,OAAO,UAAU,MAAM,EAAG,QAAO;AAEzF,QAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,QAAM,aAAa,MAAM,YAAY;AACrC,QAAM,aAAa,MAAM,KAAK,YAAY;AAC1C,aAAW,UAAU,KAAK,SAAS;AACjC,QAAI,OAAO,SAAS,OAAQ;AAC5B,QAAI,OAAO,KAAK,SAAS,SAAU,QAAO;AAC1C,UAAM,WAAW,OAAO,KAAK,OAAO,YAAY;AAChD,QAAI,YAAY,aAAa,cAAc,aAAa,cAAc,aAAa,QAAS,QAAO;AACnG,UAAM,MAAM,OAAO,KAAK,KAAK,YAAY;AACzC,QAAIC,aAAY,GAAG,EAAG;AACtB,QAAI,CAAC,MAAM,QAAQ,KAAK,CAAC,UAAU,KAAK,aAAa,KAAK,KAAK,YAAY,OAAO,GAAG,EAAG,QAAO;AAAA,EACjG;AAEA,QAAM,UAAiD,CAAC;AACxD,MAAI,KAAK,OAAO;AACd,eAAW,QAAQ,aAAa,KAAK,KAAK,GAAG;AAC3C,YAAM,KAAK,qBAAqB,IAAI;AACpC,UAAI,CAAC,GAAI,QAAO;AAChB,UAAI;AACJ,UAAI;AACF,gBAAQ,gBAAgB,GAAG,WAAW,GAAG;AAAA,MAC3C,QAAQ;AACN,eAAO;AAAA,MACT;AACA,cAAQ,KAAK,EAAE,QAAQ,GAAG,OAAO,YAAY,GAAG,MAAM,CAAC;AAAA,IACzD;AAAA,EACF;AAEA,MAAI,QAAQ,IAAI;AAChB,MAAI,SAAS;AACb,MAAI,KAAK,OAAO;AACd,QAAI;AACF,YAAM,aAAa,UAAU,gBAAgB,KAAK,MAAM,OAAO,GAAG,CAAC;AACnE,YAAM,cAAc,KAAK,MAAM,SAAS,UAAU,gBAAgB,KAAK,MAAM,QAAQ,GAAG,CAAC,IAAI;AAC7F,UAAI,eAAe,QAAQ,gBAAgB,KAAM,QAAO;AACxD,eAAS,KAAK,IAAI,GAAG,OAAO,WAAW,CAAC;AACxC,YAAM,IAAI,OAAO,UAAU;AAC3B,UAAI,KAAK,EAAG,SAAQ,KAAK,IAAI,OAAO,CAAC;AAAA,IACvC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,UAAU,aAAa,KAAK,SAAS,KAAK;AAChD,MAAI,SAAS,EAAG,QAAO,KAAK,KAAK,SAAS,CAAC,CAAC;AAE5C,MAAI,SAAwB,MAAM,KAAK;AACvC,MAAI,kBAAkB;AACtB,MAAI,KAAK,OAAO;AACd,UAAM,UAAU,gBAAgB,MAAM,KAAK,OAAO,GAAG;AACrD,QAAI,SAAS;AACX,eAAS,QAAQ;AACjB,wBAAkB;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,aAAa,cAAc,KAAK,SAAS,KAAK;AACpD,QAAM,SAAuB,CAAC;AAC9B,MAAI,UAAU;AAEd,aAAW,OAAO,QAAQ;AACxB,QAAI,CAAC,mBAAmB,QAAQ,SAAS,KAAK,CAAC,WAAW,KAAK,OAAO,EAAG;AACzE,QAAI,UAAU,QAAQ;AACpB;AACA;AAAA,IACF;AACA,WAAO,KAAK,WAAW,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;AAC3C,QAAI,OAAO,UAAU,MAAO;AAAA,EAC9B;AAEA,SAAO,KAAK,KAAK,SAAS,MAAM;AAClC;AAEO,SAAS,qBAAqB,MAAkB,KAAqC;AAC1F,MAAI,KAAK,QAAQ,KAAK,YAAY,KAAK,YAAY,KAAK,QAAQ,SAAS,KAAK,KAAK,UAAU,KAAK,QAAQ,SAAS;AACjH,WAAO;AACT,MAAI,KAAK,QAAQ,SAAS,KAAK,KAAK,SAAS,KAAK,MAAO,QAAO;AAChE,MAAI,KAAK,MAAM,SAAS,OAAQ,QAAO;AACvC,QAAM,OAAO,KAAK;AAClB,MAAK,KAAK,aAAa,WAAW,KAAK,aAAa,WAAY,KAAK,SAAS,CAAC,KAAK,GAAI,QAAO;AAC/F,MAAI,KAAK,KAAK,SAAS,WAAW,KAAK,MAAM,SAAS,QAAS,QAAO;AACtE,QAAM,OAAO,oBAAoB,KAAK,OAAO,KAAK,IAAI,GAAG;AACzD,MAAI,MAAM,aAAa,WAAW,EAAG,QAAO;AAE5C,QAAM,UAAU,KAAK;AACrB,QAAM,WAAW,KAAK;AACtB,QAAM,SAAS,IAAI,MAAM;AAAA,IACvB,QAAQ;AAAA,IACR,QAAQ,SAAS,GAAG,QAAQ,MAAM,IAAI,QAAQ,IAAI,KAAK,QAAQ;AAAA,EACjE;AACA,QAAM,UAAU,IAAI,MAAM;AAAA,IACxB,SAAS;AAAA,IACT,SAAS,SAAS,GAAG,SAAS,MAAM,IAAI,SAAS,IAAI,KAAK,SAAS;AAAA,EACrE;AACA,MAAI,IAAI,KAAK,IAAI,QAAQ,KAAK,YAAY,CAAC,KAAK,IAAI,KAAK,IAAI,SAAS,KAAK,YAAY,CAAC,EAAG,QAAO;AAClG,MAAI,OAAO,MAAM,IAAI,QAAQ,KAAK,YAAY,CAAC,KAAK,QAAQ,MAAM,IAAI,SAAS,KAAK,YAAY,CAAC,EAAG,QAAO;AAC3G,MAAI,OAAO,cAAc,IAAI,QAAQ,KAAK,YAAY,CAAC,KAAK,QAAQ,cAAc,IAAI,SAAS,KAAK,YAAY,CAAC;AAC/G,WAAO;AAET,MAAI;AACJ,MAAI;AACJ,MAAI;AACF,gBAAY,OAAO,SAAS,QAAQ,IAAI;AACxC,iBAAa,QAAQ,SAAS,SAAS,IAAI;AAAA,EAC7C,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,UAAU,gBAAgB,WAAW,aAAc,QAAO;AAE9D,QAAM,aAAa,QAAQ,SAAS,QAAQ,MAAM,YAAY;AAC9D,QAAM,cAAc,SAAS,SAAS,SAAS,MAAM,YAAY;AACjE,QAAM,WAAW,KAAK,aAAa,CAAC,EAAG,YAAY;AACnD,QAAM,UAAU,KAAK,SAAS,CAAC,EAAG,OAAO,YAAY;AACrD,MAAI,CAAC,WAAW,mBAAmB,QAAQ,EAAG,QAAO;AAErD,QAAM,QAAkB,CAAC;AACzB,QAAM,aAAsD,CAAC;AAC7D,aAAW,UAAU,KAAK,SAAS;AACjC,QAAI,OAAO,SAAS,UAAU,OAAO,KAAK,SAAS,SAAU,QAAO;AACpE,UAAM,WAAW,OAAO,KAAK,OAAO,YAAY,KAAK;AACrD,UAAM,MAAM,OAAO,KAAK,KAAK,YAAY;AACzC,UAAM,SACJ,aAAa,OACT,UAAU,QAAQ,KAAK,CAAC,UAAU,KAAK,aAAa,KAAK,KAAK,YAAY,OAAO,GAAG,IACpF,aAAa,aAAa,aAAa,UAAU,KAAK,YAAY;AACxE,UAAM,UACJ,aAAa,OACT,WAAW,QAAQ,KAAK,CAAC,UAAU,KAAK,aAAa,KAAK,KAAK,YAAY,OAAO,GAAG,IACrF,aAAa,cAAc,aAAa,WAAW,KAAK,YAAY;AAC1E,QAAI,WAAW,QAAS,QAAO;AAC/B,UAAM,KAAK,OAAO,SAAS,OAAO,KAAK,IAAI;AAC3C,QAAI,QAAQ;AACV,UAAIA,aAAY,GAAG,EAAG,YAAW,KAAK,CAAC,SAAS,KAAK,KAAK;AAAA,UACrD,YAAW,KAAK,CAAC,SAAS,KAAK,OAAO,IAAI,GAAG,KAAK,IAAI;AAAA,IAC7D,OAAO;AACL,UAAIA,aAAY,GAAG,EAAG,YAAW,KAAK,CAAC,OAAO,UAAU,MAAM,KAAK;AAAA,UAC9D,YAAW,KAAK,CAAC,OAAO,UAAU,MAAM,OAAO,IAAI,GAAG,KAAK,IAAI;AAAA,IACtE;AAAA,EACF;AAEA,QAAM,SAAuB,CAAC;AAC9B,aAAW,QAAQ,UAAU,KAAK,GAAG;AACnC,UAAM,UAAU,WAAW,eAAe,UAAU,KAAK,OAAO,IAAI,OAAO,KAAK,IAAI;AACpF,QAAI,CAAC,QAAS,QAAO;AACrB,eAAW,SAAS,QAAS,QAAO,KAAK,WAAW,IAAI,CAAC,OAAO,GAAG,MAAM,KAAK,CAAC,CAAC;AAAA,EAClF;AACA,SAAO,KAAK,KAAK,OAAO,MAAM;AAChC;AAEA,SAAS,WAAW,KAAU,SAAyD;AACrF,aAAW,UAAU,SAAS;AAC5B,QAAIA,aAAY,OAAO,MAAM,GAAG;AAC9B,UAAI,WAAW,IAAI,OAAO,OAAO,KAAK,MAAM,EAAG,QAAO;AACtD;AAAA,IACF;AACA,QAAI,WAAW,IAAI,OAAO,IAAI,OAAO,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM,EAAG,QAAO;AAAA,EACpF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,SAAyB,OAAwB;AACrE,QAAM,QAAkB,CAAC;AACzB,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,SAAS,QAAQ;AAC1B,iBAAW,QAAQ,MAAM,QAAS,OAAM,KAAK,KAAK,IAAI;AACtD;AAAA,IACF;AACA,QAAI,OAAO,OAAO;AAChB,YAAM,KAAK,OAAO,KAAK;AACvB;AAAA,IACF;AACA,UAAM,MAAM,OAAO,KAAK,SAAS,WAAW,OAAO,KAAK,KAAK,YAAY,IAAI;AAC7E,QAAIA,aAAY,GAAG,EAAG,OAAM,KAAK,MAAM,gBAAgB,GAAG,QAAQ,OAAO;AAAA,QACpE,OAAM,KAAK,OAAO,KAAK,SAAS,WAAW,OAAO,KAAK,OAAO,UAAU;AAAA,EAC/E;AACA,SAAO;AACT;AAEA,SAAS,cAAc,SAAyB,OAA0C;AACxF,QAAM,MAAkC,CAAC;AACzC,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,SAAS,QAAQ;AAC1B,iBAAW,QAAQ,MAAM,SAAS;AAChC,cAAMC,OAAM,KAAK,aAAa,KAAK,KAAK,YAAY;AACpD,YAAI,KAAK,CAAC,QAAQ,IAAI,OAAO,IAAIA,IAAG,KAAK,IAAI;AAAA,MAC/C;AACA;AAAA,IACF;AACA,UAAM,OAAO,OAAO;AACpB,QAAI,KAAK,SAAS,SAAU;AAC5B,UAAM,MAAM,KAAK,KAAK,YAAY;AAClC,QAAID,aAAY,GAAG,EAAG,KAAI,KAAK,CAAC,QAAQ,IAAI,KAAK;AAAA,QAC5C,KAAI,KAAK,CAAC,QAAQ,IAAI,OAAO,IAAI,GAAG,KAAK,IAAI;AAAA,EACpD;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAY,KAA6B;AAChE,MAAI,KAAK,SAAS,UAAW,QAAO,KAAK;AACzC,MAAI,KAAK,SAAS,OAAQ,QAAO;AACjC,MAAI,KAAK,SAAS,YAAa,QAAO,IAAI,kBAAkB,KAAK,IAAI;AACrE,MAAI,KAAK,SAAS,WAAW,KAAK,OAAO,OAAO,KAAK,KAAK,SAAS,aAAa,OAAO,KAAK,KAAK,UAAU,UAAU;AACnH,WAAO,CAAC,KAAK,KAAK;AAAA,EACpB;AACA,QAAM,IAAI,MAAM,iBAAiB;AACnC;AAEA,SAASA,aAAY,MAAuB;AAC1C,SAAO,SAAS,WAAW,SAAS,aAAa,SAAS;AAC5D;AAEA,SAAS,KAAK,KAAmB,SAAmB,QAAiC;AACnF,SAAO,eAAe,SAAS,QAAQ,GAAG,IAAI,MAAM,iBAAiB;AAAA,IACnE,OAAO,IAAI;AAAA,IACX,YAAY;AAAA,EACd,CAAC;AACH;;;ACnNA,SAAS,mBAAmB,OAAiB,UAA8B;AACzE,SAAO,cAAc,OAAO,QAAQ;AACtC;AAOO,SAASE,eAAc,MAAkB,KAAmB,QAAiC;AAClG,MAAI,eAAeA;AACnB,MAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,KAAK,UAAU;AAC3C,UAAM,SAAS,uBAAuB,MAAM,GAAG,KAAK,qBAAqB,MAAM,GAAG;AAClF,QAAI,OAAQ,QAAO;AAAA,EACrB;AACA,QAAM,YAAY,IAAI,IAAI,IAAI,IAAI;AAClC,MAAI;AACF,QAAI,KAAK,KAAM,aAAY,MAAM,KAAK,MAAM;AAC5C,UAAM,OAAO;AAAA,MACX;AAAA,QACE,GAAG;AAAA,QACH,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,KAAK,WAAW,CAAC,IAAI,KAAK;AAAA,QACnC,OAAO,KAAK,WAAW,OAAO,KAAK;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,KAAK,SAAU,QAAO;AAC3B,UAAM,QAAQA,eAAc,KAAK,SAAS,QAAQ,KAAK,MAAM;AAC7D,QAAI,KAAK,QAAQ,WAAW,MAAM,QAAQ,QAAQ;AAChD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,WAAW,aAAa,IAAI;AAClC,UAAM,YAAY,aAAa,KAAK;AACpC,QAAI;AACJ,YAAQ,KAAK,SAAS,IAAI;AAAA,MACxB,KAAK;AACH,eAAO,CAAC,GAAG,UAAU,GAAG,SAAS;AACjC;AAAA,MACF,KAAK;AACH,eAAO,WAAW,CAAC,GAAG,UAAU,GAAG,SAAS,CAAC;AAC7C;AAAA,MACF,KAAK;AACH,eAAO,WAAW,QAAQ,EAAE,OAAO,CAAC,QAAQ,UAAU,KAAK,CAAC,UAAUC,WAAU,KAAK,KAAK,CAAC,CAAC;AAC5F;AAAA,MACF,KAAK;AACH,eAAO,WAAW,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU,KAAK,CAAC,UAAUA,WAAU,KAAK,KAAK,CAAC,CAAC;AAC7F;AAAA,IACJ;AACA,QAAI,KAAK,QAAQ,SAAS,EAAG,MAAK,KAAK,CAAC,GAAG,MAAM,oBAAoB,GAAG,GAAG,KAAK,SAAS,KAAK,OAAO,CAAC;AACtG,QAAI,KAAK,OAAO;AACd,YAAM,MAAM,IAAI,kBAAkB,MAAM,MAAM;AAC9C,YAAM,aAAa,UAAU,SAAS,KAAK,MAAM,OAAO,GAAG,CAAC;AAC5D,YAAM,cAAc,KAAK,MAAM,SAAS,UAAU,SAAS,KAAK,MAAM,QAAQ,GAAG,CAAC,IAAI;AACtF,UAAI,eAAe,QAAQ,gBAAgB,KAAM,OAAM,IAAI,YAAY,qBAAqB,mBAAmB;AAC/G,YAAM,SAAS,KAAK,IAAI,GAAG,OAAO,WAAW,CAAC;AAC9C,YAAM,QAAQ,OAAO,UAAU;AAC/B,aAAO,KAAK,MAAM,QAAQ,QAAQ,IAAI,SAAY,SAAS,KAAK;AAAA,IAClE;AACA,WAAO,eAAe,KAAK,SAAS,MAAM,GAAG,IAAI,MAAM,iBAAiB;AAAA,MACtE,OAAO,IAAI;AAAA,MACX,YAAY;AAAA,IACd,CAAC;AAAA,EACH,UAAE;AACA,QAAI,KAAK,MAAM;AACf,eAAW,CAAC,MAAM,MAAM,KAAK,UAAW,KAAI,KAAK,IAAI,MAAM,MAAM;AAAA,EACnE;AACF;AAEA,SAAS,YAAY,MAAkB,KAAmB,QAA4B;AACpF,aAAW,OAAO,KAAK,KAAM,MAAM;AACjC,UAAM,MAAM,IAAI,KAAK,YAAY;AACjC,QAAI,KAAK,KAAM,aAAa,gBAAgB,IAAI,QAAQ,IAAI,IAAI,KAAK,IAAI,OAAO,UAAU;AACxF,YAAM,SAASD,eAAc,EAAE,GAAG,IAAI,QAAQ,UAAU,KAAK,GAAG,KAAK,MAAM;AAC3E,YAAM,UAAU,IAAI,WAAW,OAAO;AACtC,UAAI,cAAc,aAAa,MAAM;AACrC,UAAI,QAAQ;AACZ,aAAO,MAAM;AACX,YAAI,KAAK,IAAI,KAAK,eAAe,SAAS,KAAK,CAAC;AAChD,cAAM,aAAaA,eAAc,IAAI,OAAO,SAAS,QAAQ,KAAK,MAAM;AACxE,cAAM,aAAa,aAAa,UAAU;AAC1C,cAAM,YACJ,IAAI,OAAO,SAAS,OAAO,cACvB,aACA,WAAW,OAAO,CAAC,QAAQ,CAAC,YAAY,KAAK,CAAC,aAAaC,WAAU,UAAU,GAAG,CAAC,CAAC;AAC1F,YAAI,UAAU,WAAW,EAAG;AAC5B,sBAAc,CAAC,GAAG,aAAa,GAAG,SAAS;AAC3C,gBAAQ;AAAA,MACV;AACA,UAAI,KAAK,IAAI,KAAK,eAAe,SAAS,WAAW,CAAC;AAAA,IACxD,OAAO;AACL,YAAM,SAASD,eAAc,IAAI,QAAQ,KAAK,MAAM;AACpD,YAAM,UAAU,IAAI,WAAW,OAAO;AACtC,UAAI,KAAK,IAAI,KAAK,eAAe,SAAS,aAAa,MAAM,CAAC,CAAC;AAAA,IACjE;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,MAAkB,KAAmB,QAAiC;AAC/F,MAAI;AACJ,MAAI,YAAY;AAChB,MAAI,YAAY;AAChB,MAAI,KAAK,QAAQ,KAAK,OAAO;AAC3B,UAAM,UAAU,oBAAoB,KAAK,MAAM,KAAK,OAAO,GAAG;AAC9D,QAAI,SAAS;AACX,eAAS,oBAAoB,QAAQ,OAAO,QAAQ,MAAM,QAAQ,OAAO,KAAK,MAAM;AACpF,kBAAY,kBAAkB,KAAK,OAAO,QAAQ,gBAAgB,QAAQ,OAAO,QAAQ,MAAM,IAAI;AAAA,IACrG,OAAO;AACL,eAAS,SAAS,KAAK,MAAM,KAAK,MAAM;AAAA,IAC1C;AAAA,EACF,WAAW,KAAK,QAAQ,KAAK,QAAQ,WAAW,KAAK,KAAK,QAAQ,CAAC,GAAG;AACpE,QAAI;AACJ,QAAI,KAAK,OAAO;AACd,YAAM,MAAM,IAAI,kBAAkB,MAAM,MAAM;AAC9C,YAAM,aAAa,UAAU,SAAS,KAAK,MAAM,OAAO,GAAG,CAAC;AAC5D,YAAM,cAAc,KAAK,MAAM,SAAS,UAAU,SAAS,KAAK,MAAM,QAAQ,GAAG,CAAC,IAAI;AACtF,UAAI,eAAe,QAAQ,gBAAgB,MAAM;AAC/C,cAAM,SAAS,KAAK,IAAI,GAAG,OAAO,WAAW,CAAC;AAC9C,cAAM,QAAQ,OAAO,UAAU;AAC/B,eAAO,QAAQ,IAAI,SAAY,SAAS;AAAA,MAC1C;AAAA,IACF;AACA,UAAM,UAAU;AAAA,MACd,KAAK;AAAA,MACL,EAAE,MAAM,KAAK,QAAQ,CAAC,EAAE,MAAM,KAAK,KAAK,QAAQ,CAAC,EAAE,OAAO,MAAM;AAAA,MAChE;AAAA,MACA;AAAA,IACF;AACA,QAAI,SAAS;AACX,eAAS,oBAAoB,QAAQ,OAAO,QAAQ,MAAM,QAAQ,OAAO,KAAK,MAAM;AACpF,kBAAY;AAAA,IACd,MAAO,UAAS,SAAS,KAAK,MAAM,KAAK,MAAM;AAAA,EACjD,OAAO;AACL,aAAS,KAAK,OAAO,SAAS,KAAK,MAAM,KAAK,MAAM,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;AAAA,EACxE;AACA,QAAM,eACJ,KAAK,QAAQ,WAAW,KACxB,CAAC,KAAK,YACN,KAAK,QAAQ,WAAW,KACxB,KAAK,WAAW,QAChB,OAAO,SAAS,IAAI,OAAO;AAC7B,QAAM,YACJ,KAAK,QAAQ,SAAS,KACtB,KAAK,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,UAAU,kBAAkB,OAAO,IAAI,CAAC,KACrF,KAAK,WAAW,QAAQ,kBAAkB,KAAK,MAAM;AACxD,MAAI,KAAK,SAAS,CAAC,WAAW;AAC5B,QAAI,gBAAgB,CAAC,WAAW;AAC9B,YAAM,WAAuB,CAAC;AAC9B,iBAAW,SAAS,QAAQ;AAC1B,YAAI,YAAY,SAAS,KAAK,OAAO,IAAI,kBAAkB,OAAO,MAAM,CAAC,CAAC,MAAM,KAAM;AACtF,iBAAS,KAAK,KAAK;AACnB,YAAI,SAAS,UAAU,IAAI,QAAS;AAAA,MACtC;AACA,eAAS;AAAA,IACX,OAAO;AACL,eAAS,OAAO;AAAA,QACd,CAAC,UAAU,YAAY,SAAS,KAAK,OAAQ,IAAI,kBAAkB,OAAO,MAAM,CAAC,CAAC,MAAM;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,KAAK,QAAQ,IAAI,CAAC,SAAS;AACzC,QAAI,KAAK,SAAS,aAAa,OAAO,KAAK,UAAU,YAAY,CAAC,OAAO,UAAU,KAAK,KAAK,EAAG,QAAO;AACvG,UAAM,SAAS,KAAK,QAAQ,KAAK,QAAQ,CAAC;AAC1C,QAAI,QAAQ,SAAS,OAAQ,OAAM,IAAI,YAAY,GAAG,KAAK,KAAK,iCAAiC,OAAO;AACxG,WAAO,OAAO;AAAA,EAChB,CAAC;AACD,QAAM,SAAS,YAAY,UAAU,QAAQ,SAAS,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AAClG,QAAM,eAAe,YAAY,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI;AACpF,QAAM,SAAS,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI;AAC9E,MAAI,OAAO,WAAW,KAAK,OAAQ,0BAAyB,MAAM,QAAQ,KAAK,MAAM;AACrF,QAAM,UAAU,kBAAkB,KAAK,SAAS,MAAM;AACtD,MAAI,SAAsB,CAAC;AAE3B,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAQ,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE;AACtC,UAAM,MAAM,IAAI,kBAAkB,OAAO,MAAM;AAC/C,UAAM,SAAqB,CAAC;AAC5B,eAAW,UAAU,KAAK,SAAS;AACjC,UAAI,OAAO,SAAS,QAAQ;AAC1B,mBAAW,QAAQ,MAAM,OAAO;AAC9B,eACG,OAAO,UAAU,QAAQ,CAAC,KAAK,mBAC/B,OAAO,UAAU,QAAQ,KAAK,OAAO,YAAY,MAAM,OAAO,MAAM,YAAY;AAEjF,mBAAO,KAAK,KAAK,KAAK;AAAA,QAC1B;AAAA,MACF,OAAO;AACL,eAAO,KAAK,YAAY,OAAO,MAAM,KAAK,OAAO,KAAK,QAAQ,KAAK,SAAS,YAAY,CAAC;AAAA,MAC3F;AAAA,IACF;AACA,QAAI,KAAK,QAAQ;AACf,YAAM,UAAU,oBAAI,IAAsB;AAC1C,WAAK,QAAQ,QAAQ,CAAC,QAAQ,UAAU;AACtC,YAAI,OAAO,SAAS,UAAU,OAAO,MAAO,SAAQ,IAAI,OAAO,MAAM,YAAY,GAAG,OAAO,KAAK,KAAK,IAAI;AAAA,MAC3G,CAAC;AACD,YAAM,YAAyB;AAAA,QAC7B,GAAG;AAAA,QACH,eAAe,CAAC,OAAO,SAAS;AAC9B,cAAI,UAAU,QAAQ,QAAQ,IAAI,KAAK,YAAY,CAAC,EAAG,QAAO,QAAQ,IAAI,KAAK,YAAY,CAAC,KAAK;AACjG,iBAAO,IAAI,cAAc,OAAO,IAAI;AAAA,QACtC;AAAA,MACF;AACA,UAAI,YAAY,YAAY,KAAK,QAAQ,WAAW,OAAO,KAAK,QAAQ,KAAK,SAAS,YAAY,CAAC,MAAM;AACvG;AAAA,IACJ;AACA,WAAO,KAAK,EAAE,QAAQ,MAAM,CAAC;AAC7B,QAAI,gBAAgB,CAAC,aAAa,CAAC,KAAK,SAAS,OAAO,UAAU,IAAI,QAAS;AAAA,EACjF;AAEA,MAAI,KAAK,UAAU;AACjB,UAAM,OAAO,oBAAI,IAAY;AAC7B,aAAS,OAAO,OAAO,CAAC,QAAQ;AAC9B,YAAM,MAAM,SAAS,IAAI,MAAM;AAC/B,UAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAC1B,WAAK,IAAI,GAAG;AACZ,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,MAAI,KAAK,QAAQ,SAAS,KAAK,CAAC,WAAW;AACzC,WAAO,KAAK,CAAC,MAAM,UAAU,cAAc,MAAM,OAAO,KAAK,SAAS,SAAS,KAAK,MAAM,CAAC;AAAA,EAC7F;AACA,MAAI,KAAK,OAAO;AACd,UAAM,MAAM,IAAI,kBAAkB,MAAM,MAAM;AAC9C,UAAM,aAAa,UAAU,SAAS,KAAK,MAAM,OAAO,GAAG,CAAC;AAC5D,UAAM,cAAc,KAAK,MAAM,SAAS,UAAU,SAAS,KAAK,MAAM,QAAQ,GAAG,CAAC,IAAI;AACtF,QAAI,eAAe,QAAQ,gBAAgB,KAAM,OAAM,IAAI,YAAY,qBAAqB,mBAAmB;AAC/G,UAAM,SAAS,KAAK,IAAI,GAAG,OAAO,WAAW,CAAC;AAC9C,UAAM,QAAQ,OAAO,UAAU;AAC/B,aAAS,OAAO,MAAM,QAAQ,QAAQ,IAAI,SAAY,SAAS,KAAK;AAAA,EACtE;AACA,MAAI,OAAO,SAAS,IAAI,OAAO,KAAK,OAAO,SAAS,IAAI,QAAS,UAAS,OAAO,MAAM,GAAG,IAAI,OAAO;AACrG,SAAO;AAAA,IACL;AAAA,IACA,OAAO,IAAI,CAAC,QAAQ,IAAI,MAAM;AAAA,IAC9B;AAAA,IACA,IAAI,MAAM;AAAA,IACV;AAAA,MACE,OAAO,IAAI;AAAA,MACX,YAAY;AAAA,IACd;AAAA,EACF;AACF;AAEO,SAAS,SAAS,MAAgB,KAAmB,QAAkC;AAC5F,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,OAAO,SAAS,KAAK,MAAM,KAAK,MAAM;AAG5C,QAAI,KAAK,MAAM,SAAS,cAAc;AACpC,YAAME,UAAqB,CAAC;AAC5B,YAAMC,cAAa,QAAQ,KAAK,OAAO,GAAG;AAC1C,YAAMC,aAAYD,YAAW,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,OAAO,KAAiB,EAAE;AACjF,iBAAW,OAAO,MAAM;AACtB,cAAM,MAAM,sBAAsB,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,OAAO,KAAK,KAAK,MAAM;AACtG,YAAI,IAAI,KAAK,WAAW,GAAG;AACzB,cAAI,KAAK,aAAa,UAAU,KAAK,aAAa,QAAQ;AACxD,YAAAD,QAAO,KAAK,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,GAAGE,UAAS,EAAE,CAAC;AAAA,UACrD;AACA;AAAA,QACF;AACA,mBAAW,OAAO,IAAI,MAAM;AAC1B,gBAAM,SAAS,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,GAAG,IAAI,KAAK,EAAE;AACrD,cAAI,KAAK,IAAI;AACX,gBAAI,YAAY,SAAS,KAAK,IAAI,IAAI,kBAAkB,QAAQ,MAAM,CAAC,CAAC,MAAM,KAAM;AAAA,UACtF;AACA,UAAAF,QAAO,KAAK,MAAM;AAAA,QACpB;AAAA,MACF;AACA,aAAOA;AAAA,IACT;AAEA,UAAM,QACJ,CAAC,KAAK,SAAS,KAAK,aAAa,WAAW,KAAK,aAAa,SAC1D,aAAa,KAAK,OAAO,KAAK,IAAI,GAAG,IACrC;AACN,QAAI,OAAO;AACT,YAAMC,cAAa,QAAQ,KAAK,OAAO,GAAG;AAC1C,YAAMC,aAAYD,YAAW,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,OAAO,KAAiB,EAAE;AACjF,YAAMD,UAAqB,CAAC;AAC5B,iBAAW,OAAO,MAAM;AACtB,cAAM,MAAM,MAAM,OAAO,CAAC,WAAW,SAAS;AAC5C,gBAAM,MAAM,KAAK,YAAY;AAC7B,gBAAM,QAAQ,IAAI,MAAM;AAAA,YACtB,CAAC,UACE,KAAK,aAAa,KAAK,KAAK,YAAY,OAAO,QAC/C,cAAc,SAAS,KAAK,cAAc,KAAK,OAAO,YAAY,OAAO,UAAU,YAAY;AAAA,UACpG;AACA,iBAAO,OAAO,SAAS;AAAA,QACzB,CAAC;AACD,cAAM,YAAY,oBAAoB,MAAM,OAAO,KAAK,MAAM,OAAO,KAAK,MAAM;AAChF,YAAI,UAAU;AACd,mBAAW,OAAO,WAAW;AAC3B,gBAAM,SAAS,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,GAAG,IAAI,KAAK,EAAE;AACrD,cACE,KAAK,MACL,CAAC,MAAM,YACP,YAAY,SAAS,KAAK,IAAI,IAAI,kBAAkB,QAAQ,MAAM,CAAC,CAAC,MAAM;AAE1E;AACF,oBAAU;AACV,UAAAA,QAAO,KAAK,MAAM;AAAA,QACpB;AACA,YAAI,CAAC,YAAY,KAAK,aAAa,UAAU,KAAK,aAAa,SAAS;AACtE,UAAAA,QAAO,KAAK,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,GAAGE,UAAS,EAAE,CAAC;AAAA,QACrD;AAAA,MACF;AACA,aAAOF;AAAA,IACT;AAGA,UAAM,WACJ,CAAC,KAAK,SAAS,KAAK,aAAa,WAAW,KAAK,aAAa,SAC1D,oBAAoB,KAAK,OAAO,KAAK,IAAI,GAAG,IAC5C;AACN,QAAI,UAAU;AACZ,YAAM,WAAW,aAAa,KAAK,OAAO,GAAG;AAC7C,UAAI,UAAU;AACZ,eAAO,YAAY,MAAM,UAAU,UAAU,IAAI;AAAA,MACnD;AACA,YAAMG,SAAQ,SAAS,KAAK,OAAO,KAAK,MAAM;AAC9C,YAAMF,eAAcE,OAAM,CAAC,GAAG,SAAS,QAAQ,KAAK,OAAO,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI;AACnF,YAAMD,aAAYD,YAAW,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,OAAO,KAAiB,EAAE;AACjF,YAAM,UAAU,oBAAI,IAAwB;AAC5C,iBAAW,OAAOE,QAAO;AACvB,cAAM,SAAS,SAAS,aAAa,IAAI,CAAC,SAAS;AACjD,gBAAM,MAAM,KAAK,YAAY;AAC7B,gBAAM,OAAO,IAAI,MAAM,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,OAAO,GAAG;AAChF,iBAAO,sBAAsB,MAAM,SAAS,MAAM,QAAQ;AAAA,QAC5D,CAAC;AACD,cAAM,SAAS,kBAAkB,MAAM;AACvC,YAAI,WAAW,KAAM;AACrB,cAAM,SAAS,QAAQ,IAAI,MAAM;AACjC,YAAI,OAAQ,QAAO,KAAK,GAAG;AAAA,YACtB,SAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC;AAAA,MAChC;AACA,YAAMH,UAAqB,CAAC;AAC5B,iBAAW,OAAO,MAAM;AACtB,cAAM,SAAS,SAAS,SAAS,IAAI,CAAC,QAAQ;AAC5C,gBAAM,OAAO,IAAI,MAAM;AAAA,YACrB,CAAC,OACE,EAAE,aAAa,EAAE,KAAK,YAAY,OAAO,IAAI,OAAO,YAAY,MAChE,IAAI,UAAU,SAAS,EAAE,cAAc,EAAE,OAAO,YAAY,OAAO,IAAI,MAAM,YAAY;AAAA,UAC9F;AACA,iBAAO,sBAAsB,MAAM,SAAS,MAAM,QAAQ;AAAA,QAC5D,CAAC;AACD,cAAM,SAAS,kBAAkB,MAAM;AACvC,YAAI,UAAU;AACd,YAAI,WAAW,MAAM;AACnB,gBAAM,UAAU,QAAQ,IAAI,MAAM;AAClC,cAAI,SAAS;AACX,uBAAW,OAAO,SAAS;AACzB,oBAAM,SAAS,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,GAAG,IAAI,KAAK,EAAE;AACrD,wBAAU;AACV,cAAAA,QAAO,KAAK,MAAM;AAAA,YACpB;AAAA,UACF;AAAA,QACF;AACA,YAAI,CAAC,YAAY,KAAK,aAAa,UAAU,KAAK,aAAa,SAAS;AACtE,UAAAA,QAAO,KAAK,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,GAAGE,UAAS,EAAE,CAAC;AAAA,QACrD;AAAA,MACF;AACA,aAAOF;AAAA,IACT;AAEA,UAAM,QAAQ,SAAS,KAAK,OAAO,KAAK,MAAM;AAC9C,UAAM,QAAQ,oBAAoB,MAAM,MAAM,OAAO,GAAG;AACxD,UAAM,YAAY,KAAK,CAAC,GAAG,SAAS,QAAQ,KAAK,MAAM,GAAG;AAC1D,UAAM,cAAc,MAAM,CAAC,GAAG,SAAS,QAAQ,KAAK,OAAO,GAAG,GAAG;AAAA,MAAI,CAAC,SACpE,OAAO,KAAK,CAAC,SAAS,KAAK,YAAY,MAAM,KAAK,KAAK,YAAY,CAAC,IAAI,EAAE,GAAG,MAAM,eAAe,KAAK,IAAI;AAAA,IAC7G;AACA,UAAM,WAAW,UAAU,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,OAAO,KAAiB,EAAE;AAC/E,UAAM,YAAY,WAAW,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,OAAO,KAAiB,EAAE;AACjF,UAAM,SAAqB,CAAC;AAC5B,UAAM,eAAe,oBAAI,IAAY;AAErC,UAAM,SAAS,CAAC,KAAe,KAAe,WAA8B;AAC1E,UAAI,OAAO;AACT,eAAO,MAAM,MAAM,CAAC,SAAS;AAC3B,gBAAM,IAAI,IAAI,MAAM,KAAK,CAAC,SAAS,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,CAAC,GAAG,SAAS;AAC7F,gBAAM,IAAI,IAAI,MAAM,KAAK,CAAC,SAAS,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,CAAC,GAAG,SAAS;AAC7F,iBAAO,MAAM,QAAQ,MAAM,QAAQ,eAAe,GAAG,CAAC;AAAA,QACxD,CAAC;AAAA,MACH;AACA,UAAI,KAAK,GAAI,QAAO,YAAY,SAAS,KAAK,IAAI,IAAI,kBAAkB,QAAQ,MAAM,CAAC,CAAC,MAAM;AAC9F,aAAO;AAAA,IACT;AAEA,eAAW,OAAO,MAAM;AACtB,UAAI,UAAU;AACd,YAAM,QAAQ,CAAC,KAAK,eAAe;AACjC,cAAM,aAAa,QACf,IAAI,MAAM;AAAA,UAAI,CAAC,SACb,MAAM,KAAK,CAAC,SAAS,KAAK,YAAY,MAAM,KAAK,KAAK,YAAY,CAAC,IAC/D,EAAE,GAAG,MAAM,eAAe,KAAK,IAC/B;AAAA,QACN,IACA,IAAI;AACR,cAAM,SAAS,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,GAAG,UAAU,EAAE;AACtD,YAAI,CAAC,OAAO,KAAK,KAAK,MAAM,EAAG;AAC/B,kBAAU;AACV,qBAAa,IAAI,UAAU;AAC3B,eAAO,KAAK,MAAM;AAAA,MACpB,CAAC;AACD,UAAI,CAAC,YAAY,KAAK,aAAa,UAAU,KAAK,aAAa,SAAS;AACtE,eAAO,KAAK,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,GAAG,SAAS,EAAE,CAAC;AAAA,MACrD;AAAA,IACF;AAEA,QAAI,KAAK,aAAa,WAAW,KAAK,aAAa,QAAQ;AACzD,YAAM,QAAQ,CAAC,KAAK,eAAe;AACjC,YAAI,aAAa,IAAI,UAAU,EAAG;AAClC,cAAM,aAAa,QACf,IAAI,MAAM;AAAA,UAAI,CAAC,SACb,MAAM,KAAK,CAAC,SAAS,KAAK,YAAY,MAAM,KAAK,KAAK,YAAY,CAAC,IAC/D,EAAE,GAAG,MAAM,eAAe,KAAK,IAC/B;AAAA,QACN,IACA,IAAI;AACR,eAAO,KAAK,EAAE,OAAO,CAAC,GAAG,UAAU,GAAG,UAAU,EAAE,CAAC;AAAA,MACrD,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,YAAY;AAC5B,UAAM,SAASF,eAAc,KAAK,QAAQ,KAAK,MAAM;AACrD,WAAO,aAAa,MAAM,EAAE,IAAI,CAAC,YAAY;AAAA,MAC3C,OAAO,OAAO,QAAQ,IAAI,CAAC,MAAM,WAAW,EAAE,OAAO,KAAK,OAAO,MAAM,OAAO,OAAO,KAAK,KAAK,KAAK,EAAE;AAAA,IACxG,EAAE;AAAA,EACJ;AACA,MAAI,KAAK,SAAS,cAAc;AAC9B,WAAO,sBAAsB,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO,GAAG,EAAE;AAAA,EACtE;AAGA,MAAI,KAAK,SAAS,WAAW,gBAAgB,KAAK,IAAI,KAAK,uBAAuB,KAAK,KAAK,YAAY,CAAC,GAAG;AAC1G,WAAO,sBAAsB,KAAK,MAAM,CAAC,GAAG,KAAK,OAAO,KAAK,MAAM,MAAM,EAAE;AAAA,EAC7E;AAEA,QAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,QAAM,YAAY,KAAK,SAAS,GAAG,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK;AACrE,QAAM,KAAK,IAAI,MAAM,kBAAkB,KAAK,QAAQ,SAAS;AAC7D,QAAM,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK,YAAY,CAAC;AAChD,MAAI,KAAK;AACP,WAAO,aAAa,GAAG,EAAE,IAAI,CAAC,YAAY;AAAA,MACxC,OAAO,IAAI,QAAQ,IAAI,CAAC,MAAM,WAAW,EAAE,OAAO,OAAO,MAAM,OAAO,OAAO,KAAK,KAAK,KAAK,EAAE;AAAA,IAChG,EAAE;AAAA,EACJ;AACA,QAAM,OAAO,GAAG,MAAM,IAAI,KAAK,KAAK,YAAY,CAAC;AACjD,MAAI,MAAM;AACR,UAAM,SAASA,eAAc,KAAK,QAAQ,KAAK,MAAM;AACrD,UAAM,QAAQ,KAAK,WAAW,OAAO;AACrC,WAAO,aAAa,MAAM,EAAE,IAAI,CAAC,YAAY;AAAA,MAC3C,OAAO,MAAM,IAAI,CAAC,MAAM,WAAW,EAAE,OAAO,OAAO,MAAM,OAAO,OAAO,KAAK,KAAK,KAAK,EAAE;AAAA,IAC1F,EAAE;AAAA,EACJ;AACA,QAAM,UAAU,GAAG,cAAc,IAAI,KAAK,KAAK,YAAY,CAAC;AAC5D,MAAI,SAAS;AACX,QAAI,QAAQ,SAAS,UAAU,QAAQ,SAAS,UAAU,QAAQ,SAAS,QAAQ;AACjF,aAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,SAAS;AAAA,QAClC,OAAO,IAAI;AAAA,QACX,WAAW;AAAA,QACX,aAAa,QAAQ;AAAA,QACrB,OAAO,QAAQ,QAAQ,IAAI,CAAC,YAAY;AAAA,UACtC,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,IAAI,OAAO,IAAI,OAAO,YAAY,CAAC,KAAK;AAAA,QACjD,EAAE;AAAA,MACJ,EAAE;AAAA,IACJ;AACA,QAAI,QAAQ,SAAS,SAAS;AAC5B,aAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,SAAS;AAAA,QAClC,OAAO,IAAI;AAAA,QACX,WAAW;AAAA,QACX,aAAa,QAAQ;AAAA,QACrB,OAAO,QAAQ,QAAQ,IAAI,CAAC,YAAY;AAAA,UACtC,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,IAAI,OAAO,IAAI,OAAO,YAAY,CAAC,KAAK;AAAA,QACjD,EAAE;AAAA,MACJ,EAAE;AAAA,IACJ;AACA,QAAI,QAAQ,SAAS,UAAU;AAC7B,aAAO,WAAW,IAAI,OAAO,QAAQ,SAAS;AAAA,IAChD;AACA,QAAI,QAAQ,SAAS,aAAa;AAChC,aAAO,aAAa,IAAI,OAAO,OAAO;AAAA,IACxC;AAEA,WAAO,CAAC;AAAA,EACV;AACA,MAAI;AACJ,MAAI,KAAK,KAAK,YAAY,MAAM,gBAAiB,SAAQ,kBAAkB,EAAE;AAAA,WACpE,KAAK,KAAK,YAAY,MAAM,gBAAiB,SAAQ,kBAAkB,EAAE;AAAA,MAC7E,SAAQ,GAAG,SAAS,KAAK,IAAI;AAClC,SAAO,oBAAoB,OAAO,MAAM,KAAK,GAAG,OAAO,KAAK,MAAM;AACpE;AAEA,SAAS,aAAa,MAAgB,KAA2D;AAC/F,MAAI,KAAK,SAAS,QAAS,QAAO;AAClC,QAAM,UAAU,KAAK,KAAK,YAAY;AACtC,MAAI,YAAY,mBAAmB,YAAY,gBAAiB,QAAO;AACvE,MAAI,IAAI,KAAK,IAAI,OAAO,EAAG,QAAO;AAClC,QAAM,KAAK,IAAI,MAAM,kBAAkB,KAAK,QAAQ,KAAK,SAAS,GAAG,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI;AAC3G,MAAI,GAAG,cAAc,IAAI,OAAO,KAAK,GAAG,MAAM,IAAI,OAAO,EAAG,QAAO;AACnE,MAAI;AACF,WAAO,EAAE,OAAO,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,KAAK,SAAS,KAAK,KAAK;AAAA,EACzE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YACP,MACA,OACA,UACA,MACY;AACZ,QAAM,YAAY,SAAS,aAAa,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC;AACxE,QAAM,UAAU,oBAAI,IAAmB;AACvC,QAAM,SAAS,MAAM,MAAM,eAAe,MAAM,MAAM,cAAc,OAAO,IAAI,MAAM,MAAM,KAAK,OAAO;AACvG,aAAW,OAAO,QAAQ;AACxB,UAAM,SAAS,UAAU,IAAI,CAAC,QAAQ,sBAAsB,IAAI,OAAO,IAAI,GAAG,KAAK,MAAM,QAAQ,CAAC;AAClG,UAAM,SAAS,kBAAkB,MAAM;AACvC,QAAI,WAAW,KAAM;AACrB,UAAM,SAAS,QAAQ,IAAI,MAAM;AACjC,QAAI,OAAQ,QAAO,KAAK,GAAG;AAAA,QACtB,SAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC;AAAA,EAChC;AACA,QAAM,YAAY,MAAM,MAAM,QAAQ;AAAA,IAAI,CAAC,WACzC,SAAS,MAAM,OAAO,OAAO,MAAM,MAAM,EAAE,UAAU,OAAO,UAAU,SAAS,OAAO,QAAQ,CAAC;AAAA,EACjG;AACA,QAAM,SAAqB,CAAC;AAC5B,aAAW,OAAO,MAAM;AACtB,UAAM,SAAS,SAAS,SAAS,IAAI,CAAC,QAAQ;AAC5C,YAAM,OAAO,IAAI,OAAO,YAAY;AACpC,YAAM,WAAW,IAAI,OAAO,YAAY;AACxC,YAAM,OAAO,IAAI,MAAM;AAAA,QACrB,CAAC,OACE,EAAE,aAAa,EAAE,KAAK,YAAY,OAAO,SACzC,aAAa,WAAc,EAAE,cAAc,EAAE,OAAO,YAAY,OAAO;AAAA,MAC5E;AACA,aAAO,sBAAsB,MAAM,SAAS,MAAM,QAAQ;AAAA,IAC5D,CAAC;AACD,UAAM,SAAS,kBAAkB,MAAM;AACvC,QAAI,UAAU;AACd,QAAI,WAAW,MAAM;AACnB,YAAM,UAAU,QAAQ,IAAI,MAAM;AAClC,UAAI,SAAS;AACX,mBAAW,OAAO,SAAS;AACzB,gBAAM,WAAW,MAAM,MAAM,QAAQ;AAAA,YAAI,CAAC,WACxC,SAAS,MAAM,OAAO,OAAO,MAAM,IAAI,OAAO,IAAI,OAAO,aAAa,OAAO,KAAK,YAAY,CAAC,KAAK,MAAM;AAAA,cACxG,UAAU,OAAO;AAAA,cACjB,SAAS,OAAO;AAAA,YAClB,CAAC;AAAA,UACH;AACA,iBAAO,KAAK,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,GAAG,QAAQ,EAAE,CAAC;AAClD,oBAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,YAAY,KAAK,aAAa,UAAU,KAAK,aAAa,SAAS;AACtE,aAAO,KAAK,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,GAAG,SAAS,EAAE,CAAC;AAAA,IACrD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBACP,OACA,MACA,OACA,KACA,QACY;AACZ,QAAM,iBAAiB,MAAM,gBAAgB,GAAG;AAChD,QAAM,SAAqB,CAAC;AAC5B,aAAW,OAAO,MAAM;AACtB,UAAM,YAAY,MAAM,QACrB,OAAO,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,UAAU,MAAM,EAChD;AAAA,MAAI,CAAC,WACJ,SAAS,OAAO,OAAO,MAAM,IAAI,OAAO,IAAI,OAAO,aAAa,OAAO,KAAK,YAAY,CAAC,KAAK,MAAM;AAAA,QAClG,UAAU,OAAO;AAAA,QACjB,SAAS,OAAO;AAAA,MAClB,CAAC;AAAA,IACH;AACF,UAAM,QAAQ,MAAM,QAAQ,IAAI,CAAC,WAAW;AAC1C,UAAI,OAAO,aAAa,CAAC,OAAO,UAAU,QAAQ;AAChD,cAAM,MAAM,IAAI,kBAAkB,EAAE,OAAO,WAAW,aAAa,MAAM,KAAK,GAAG,MAAM;AACvF,eAAO,SAAS,OAAO,OAAO,MAAM,mBAAmB,SAAS,OAAO,UAAU,MAAM,GAAG,GAAG,OAAO,QAAQ,GAAG;AAAA,UAC7G,UAAU,OAAO;AAAA,UACjB,SAAS,OAAO;AAAA,QAClB,CAAC;AAAA,MACH;AACA,aAAO,SAAS,OAAO,OAAO,MAAM,IAAI,OAAO,IAAI,OAAO,aAAa,OAAO,KAAK,YAAY,CAAC,KAAK,MAAM;AAAA,QACzG,UAAU,OAAO;AAAA,QACjB,SAAS,OAAO;AAAA,MAClB,CAAC;AAAA,IACH,CAAC;AACD,WAAO,KAAK;AAAA,MACV,GAAI,MAAM,eAAe,CAAC,IAAI,EAAE,OAAO,IAAI,MAAM;AAAA,MACjD,WAAW,mBAAmB,MAAM,eAAe,SAAY;AAAA,MAC/D,aAAa,MAAM;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,MAAgB,KAAsC;AACrE,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,OAAO,QAAQ,KAAK,MAAM,GAAG;AACnC,UAAM,QAAQ,QAAQ,KAAK,OAAO,GAAG;AACrC,UAAM,QAAQ,uBAAuB,KAAK,OAAO,MAAM,KAAK;AAC5D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG,MAAM;AAAA,QAAI,CAAC,SACZ,OAAO,KAAK,CAAC,SAAS,KAAK,YAAY,MAAM,KAAK,KAAK,YAAY,CAAC,IAAI,EAAE,GAAG,MAAM,eAAe,KAAK,IAAI;AAAA,MAC7G;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,SAAS;AAChB,WAAO,kBAAkB,KAAK,OAAO,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,EAAE;AACxG,MAAI,KAAK,SAAS,cAAc;AAC9B,UAAM,UACJ,KAAK,KAAK,YAAY,MAAM,oBACxB,CAAC,OAAO,IACR,KAAK,KAAK,YAAY,MAAM,eAAe,KAAK,KAAK,YAAY,MAAM,cACrE,CAAC,OAAO,SAAS,QAAQ,QAAQ,MAAM,UAAU,WAAW,MAAM,IAClE,sBAAsB,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO,GAAG,EAAE;AACrE,WAAO,QAAQ,IAAI,CAAC,UAAU;AAAA,MAC5B,OAAO,KAAK,SAAS,KAAK;AAAA,MAC1B;AAAA,MACA,OAAO;AAAA,IACT,EAAE;AAAA,EACJ;AACA,MAAI,KAAK,SAAS,WAAW,gBAAgB,KAAK,IAAI,KAAK,uBAAuB,KAAK,KAAK,YAAY,CAAC,GAAG;AAC1G,UAAM,UAAU,sBAAsB,KAAK,MAAM,CAAC,GAAG,KAAK,OAAO,GAAG,EAAE;AACtE,WAAO,QAAQ,IAAI,CAAC,UAAU;AAAA,MAC5B,OAAO,KAAK,SAAS,KAAK;AAAA,MAC1B;AAAA,MACA,OAAO;AAAA,IACT,EAAE;AAAA,EACJ;AACA,QAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,QAAM,YAAY,KAAK,SAAS,GAAG,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK;AACrE,QAAM,KAAK,IAAI,MAAM,kBAAkB,KAAK,QAAQ,SAAS;AAC7D,QAAM,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK,YAAY,CAAC;AAChD,MAAI,IAAK,QAAO,IAAI,QAAQ,IAAI,CAAC,UAAU,EAAE,OAAO,OAAO,MAAM,OAAO,KAAK,EAAE;AAC/E,QAAM,OAAO,GAAG,MAAM,IAAI,KAAK,KAAK,YAAY,CAAC;AACjD,MAAI;AACF,YAAQ,KAAK,WAAW,kBAAkB,KAAK,OAAO,OAAO,GAAG,IAAI,CAAC,UAAU;AAAA,MAC7E,OAAO;AAAA,MACP;AAAA,MACA,OAAO;AAAA,IACT,EAAE;AACJ,QAAM,UAAU,GAAG,cAAc,IAAI,KAAK,KAAK,YAAY,CAAC;AAC5D,MAAI,QAAS,QAAO,QAAQ,QAAQ,IAAI,CAAC,UAAU,EAAE,OAAO,OAAO,MAAM,OAAO,KAAK,EAAE;AACvF,QAAM,QACJ,KAAK,KAAK,YAAY,MAAM,kBACxB,kBAAkB,EAAE,IACpB,KAAK,KAAK,YAAY,MAAM,kBAC1B,kBAAkB,EAAE,IACpB,GAAG,SAAS,KAAK,IAAI;AAC7B,SAAO,MAAM,QAAQ,IAAI,CAAC,YAAY,EAAE,OAAO,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,UAAU,OAAO,SAAS,EAAE;AACpH;AAGA,SAAS,oBACP,MACA,MACA,OACA,KACiB;AACjB,QAAM,YAAY,KAAK,CAAC,GAAG,SAAS,QAAQ,KAAK,MAAM,GAAG;AAC1D,QAAM,aAAa,MAAM,CAAC,GAAG,SAAS,QAAQ,KAAK,OAAO,GAAG;AAC7D,SAAO,uBAAuB,KAAK,OAAO,WAAW,UAAU;AACjE;AAEA,SAAS,uBACP,OACA,WACA,YACiB;AACjB,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,QAAM,aAAa,IAAI,IAAI,WAAW,IAAI,CAAC,SAAS,KAAK,KAAK,YAAY,CAAC,CAAC;AAC5E,QAAM,SAAmB,CAAC;AAC1B,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,QAAQ,WAAW;AAC5B,UAAM,MAAM,KAAK,KAAK,YAAY;AAClC,QAAI,WAAW,IAAI,GAAG,KAAK,CAAC,KAAK,IAAI,GAAG,GAAG;AACzC,WAAK,IAAI,GAAG;AACZ,aAAO,KAAK,KAAK,IAAI;AAAA,IACvB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,MAAkB,aAAqB,KAAmB,QAAoC;AAC/G,MAAI,YAAY,WAAW,EAAG,QAAO,CAAC,IAAI;AAC1C,QAAM,SAAuB,CAAC;AAC9B,QAAM,aAAa,oBAAI,IAAoB;AAC3C,aAAW,OAAO,MAAM;AACtB,UAAM,YAAY,YAAY,IAAI,CAAC,SAAS,SAAS,MAAM,IAAI,kBAAkB,KAAK,MAAM,CAAC,CAAC;AAC9F,UAAM,MAAM,SAAS,SAAS;AAC9B,UAAM,QAAQ,WAAW,IAAI,GAAG;AAChC,QAAI,UAAU,QAAW;AACvB,iBAAW,IAAI,KAAK,OAAO,MAAM;AACjC,aAAO,KAAK,CAAC,GAAG,CAAC;AAAA,IACnB,MAAO,QAAO,KAAK,EAAG,KAAK,GAAG;AAAA,EAChC;AACA,SAAO;AACT;AAEA,SAAS,YACP,MACA,KACA,OACA,KACA,QACA,cACA,YACU;AACV,SAAO;AAAA,IACL,eAAe,MAAM,CAAC,YAAY;AAChC,UAAI,QAAQ,SAAS,YAAa,QAAO,eAAe,SAAS,OAAO,KAAK,MAAM;AACnF,aAAO,YAAY,SAAS,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,GAAG,YAAY,KAAK,QAAQ,YAAY;AAAA,IAC9F,CAAC;AAAA,IACD;AAAA,EACF;AACF;AAEA,SAAS,eAAe,MAAqB,MAAkB,KAAmB,QAAgC;AAChH,QAAM,cAAc,IAAI,UAAU,gBAAgB,KAAK,IAAI;AAC3D,MAAI,CAAC,YAAa,OAAM,IAAI,YAAY,+BAA+B,KAAK,IAAI,IAAI,OAAO;AAC3F,QAAM,OAAqB,CAAC;AAC5B,aAAW,OAAO,MAAM;AACtB,UAAM,MAAM,IAAI,kBAAkB,KAAK,MAAM;AAC7C,QAAI,KAAK,UAAU,YAAY,SAAS,KAAK,QAAQ,GAAG,CAAC,MAAM,KAAM;AACrE,UAAM,OAAO,KAAK,SAAS,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,QAAQ,SAAS,KAAK,GAAG,CAAC;AAC/E,QAAI,KAAK,YAAY,KAAK,KAAK,CAAC,WAAWC,WAAU,QAAQ,IAAI,CAAC,EAAG;AACrE,SAAK,KAAK,IAAI;AACd,gBAAY,KAAK,IAAI;AAAA,EACvB;AACA,SAAO,YAAY,SAAS;AAC9B;AAEA,SAAS,YACP,MACA,SACA,MACA,KACA,QACA,cACU;AACV,QAAM,OAAO,cAAc,KAAK,QAAQ,YAAY;AACpD,QAAM,aAAa,IAAI,kBAAkB,SAAS,MAAM;AACxD,QAAM,eAAe,KAAK,YAAY,IAAI,CAAC,SAAS,SAAS,MAAM,UAAU,CAAC;AAC9E,QAAM,YAAY,KAAK;AAAA,IAAO,CAAC,QAC7BA;AAAA,MACE;AAAA,MACA,KAAK,YAAY,IAAI,CAAC,SAAS,SAAS,MAAM,IAAI,kBAAkB,KAAK,MAAM,CAAC,CAAC;AAAA,IACnF;AAAA,EACF;AACA,YAAU,KAAK,CAAC,GAAG,MAAM,cAAc,GAAG,GAAG,KAAK,SAAS,KAAK,MAAM,CAAC;AACvE,QAAM,QAAQ,KAAK,IAAI,GAAG,UAAU,QAAQ,OAAO,CAAC;AACpD,QAAM,YAAY,UAAU;AAAA,IAAI,CAAC,QAC/B,KAAK,QAAQ,IAAI,CAAC,SAAS,SAAS,KAAK,MAAM,IAAI,kBAAkB,KAAK,MAAM,CAAC,CAAC;AAAA,EACpF;AACA,MAAI,kBAAkB;AACtB,MAAI,KAAK,QAAQ,SAAS,GAAG;AAC3B,WAAO,kBAAkB,IAAI,UAAU,QAAQ;AAC7C,YAAM,OAAO,UAAU,kBAAkB,CAAC;AAC1C,UAAI,CAAC,QAAQ,cAAc,SAAS,MAAM,KAAK,SAAS,KAAK,MAAM,MAAM,EAAG;AAC5E;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,KAAK,SAAS,aAAa;AAClC,UAAM,CAACK,QAAOC,IAAG,IAAI,YAAY,MAAM,OAAO,UAAU,QAAQ,YAAY,iBAAiB,SAAS;AACtG,UAAMC,UAAS,UAAU,WAAWF,QAAOC,MAAK,OAAO,WAAW,KAAK,OAAO,WAAW,IAAI;AAC7F,WAAO,eAAe,KAAK,MAAMC,SAAQ,KAAK,MAAM;AAAA,EACtD;AACA,QAAM,OAAO,KAAK,KAAK,KAAK,YAAY;AACxC,QAAM,OAAO,KAAK,KAAK,SAAS,MAAM,CAAC,IAAI,KAAK,KAAK;AACrD,QAAM,SAAS,UAAU,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,SAAS,KAAK,IAAI,kBAAkB,KAAK,MAAM,CAAC,CAAC,CAAC;AAC1G,MAAI,SAAS,aAAc,QAAO,QAAQ;AAC1C,MAAI,SAAS,QAAQ;AACnB,QAAI,QAAQ;AACZ,WAAO,QAAQ,KAAKP,WAAU,UAAU,KAAK,GAAI,UAAU,QAAQ,CAAC,CAAE,EAAG;AACzE,WAAO,QAAQ;AAAA,EACjB;AACA,MAAI,SAAS,cAAc;AACzB,QAAIQ,QAAO;AACX,aAAS,IAAI,GAAG,KAAK,OAAO,IAAK,KAAI,CAACR,WAAU,UAAU,CAAC,GAAI,UAAU,IAAI,CAAC,CAAE,EAAG,CAAAQ;AACnF,WAAOA;AAAA,EACT;AACA,QAAM,YAAY,KAAK,IAAI,CAAC,QAAQ,SAAS,KAAK,UAAU,CAAC;AAC7D,MAAI,SAAS,SAAS,SAAS,QAAQ;AACrC,UAAM,SAAS,OAAO,UAAU,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;AACvD,UAAM,SAAS,SAAS,QAAQ,QAAQ,SAAS,QAAQ;AACzD,WAAO,OAAO,MAAM,IAAI,CAAC,KAAK,UAAU,CAAC,KAAK;AAAA,EAChD;AACA,QAAM,CAAC,OAAO,GAAG,IAAI,YAAY,MAAM,OAAO,UAAU,QAAQ,YAAY,iBAAiB,SAAS;AACtG,QAAM,SAAS,UAAU,WAAW,OAAO,KAAK,OAAO,WAAW,KAAK,OAAO,WAAW,IAAI;AAC7F,QAAM,eAAe,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,SAAS,KAAK,IAAI,kBAAkB,KAAK,MAAM,CAAC,CAAC,CAAC;AAC7G,MAAI,SAAS,cAAe,QAAO,aAAa,CAAC,IAAI,CAAC,KAAK;AAC3D,MAAI,SAAS,aAAc,QAAO,aAAa,aAAa,SAAS,CAAC,IAAI,CAAC,KAAK;AAChF,MAAI,SAAS,aAAa;AACxB,UAAM,SAAS,OAAO,UAAU,UAAU,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI;AAC9D,WAAO,UAAU,KAAK,SAAS,aAAa,SAAU,aAAa,MAAM,IAAI,CAAC,KAAK,OAAQ;AAAA,EAC7F;AACA,MAAI,SAAS,SAAS;AACpB,UAAM,UAAU,KAAK,IAAI,GAAG,OAAO,UAAU,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACrE,UAAM,IAAI,UAAU;AACpB,UAAM,QAAQ,KAAK,MAAM,IAAI,OAAO;AACpC,UAAM,QAAQ,QAAQ;AACtB,UAAM,aAAa,IAAI;AAEvB,QAAI,YAAY;AAChB,aAAS,IAAI,GAAG,KAAK,SAAS,KAAK;AACjC,YAAM,OAAO,KAAK,aAAa,QAAQ;AACvC,UAAI,YAAY,KAAM,QAAO;AAC7B,mBAAa;AAAA,IACf;AACA,WAAO;AAAA,EACT;AACA,MAAI,SAAS,aAAa;AACxB,QAAI,UAAU,WAAW,EAAG,QAAO;AACnC,QAAI,WAAW;AACf,WAAO,WAAW,IAAI,UAAU,UAAUR,WAAU,UAAU,WAAW,CAAC,GAAI,UAAU,KAAK,CAAE,GAAG;AAChG;AAAA,IACF;AACA,YAAQ,WAAW,KAAK,UAAU;AAAA,EACpC;AACA,MAAI,SAAS,gBAAgB;AAC3B,QAAI,UAAU,UAAU,EAAG,QAAO;AAClC,QAAI,QAAQ;AACZ,WAAO,QAAQ,KAAKA,WAAU,UAAU,KAAK,GAAI,UAAU,QAAQ,CAAC,CAAE,EAAG;AACzE,WAAO,SAAS,UAAU,SAAS;AAAA,EACrC;AACA,QAAM,IAAI,YAAY,4BAA4B,KAAK,KAAK,IAAI,IAAI,OAAO;AAC7E;AAEA,SAAS,cAAc,MAAkB,cAAqC,OAAO,oBAAI,IAAY,GAAe;AAClH,MAAI,CAAC,KAAK,IAAK,QAAO;AACtB,QAAM,MAAM,KAAK,IAAI,YAAY;AACjC,MAAI,KAAK,IAAI,GAAG,EAAG,OAAM,IAAI,YAAY,+BAA+B,KAAK,GAAG,IAAI,OAAO;AAC3F,QAAM,QAAQ,aAAa,KAAK,CAAC,SAAS,KAAK,KAAK,YAAY,MAAM,GAAG;AACzE,MAAI,CAAC,MAAO,OAAM,IAAI,YAAY,mBAAmB,KAAK,GAAG,IAAI,OAAO;AACxE,OAAK,IAAI,GAAG;AACZ,QAAM,OAAO,cAAc,MAAM,MAAM,cAAc,IAAI;AACzD,SAAO;AAAA,IACL,aAAa,KAAK,YAAY,SAAS,KAAK,cAAc,KAAK;AAAA,IAC/D,SAAS,KAAK,QAAQ,SAAS,KAAK,UAAU,KAAK;AAAA,IACnD,OAAO,KAAK,SAAS,KAAK;AAAA,IAC1B,KAAK;AAAA,EACP;AACF;AAEA,SAAS,YACP,MACA,OACA,QACA,KACA,iBACA,WACkB;AAClB,MAAI,CAAC,KAAK,MAAO,QAAO,CAAC,GAAG,KAAK,QAAQ,SAAS,IAAI,kBAAkB,KAAK,IAAI,GAAG,SAAS,CAAC,CAAC;AAC/F,QAAM,cAAc,KAAK,MAAM,SAAS,WAAW,KAAK,MAAM,SAAS;AACvE,MAAI,YAAY;AAChB,MAAI,eAAe,KAAK,QAAQ,SAAS,GAAG;AAC1C,WAAO,YAAY,KAAKA,WAAU,UAAU,SAAS,GAAI,UAAU,YAAY,CAAC,CAAE,EAAG;AAAA,EACvF;AACA,QAAM,QAAQ,CACZ,MACA,YACW;AACX,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO,KAAK,IAAI,GAAG,SAAS,CAAC;AAAA,MAC/B,KAAK;AACH,YAAI,YAAa,QAAO,UAAU,YAAY;AAC9C,eAAO;AAAA,MACT,KAAK;AACH,eAAO,KAAK,IAAI,GAAG,QAAQ,OAAO,UAAU,SAAS,KAAK,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;AAAA,MAC7E,KAAK;AACH,eAAO,KAAK,IAAI,KAAK,IAAI,GAAG,SAAS,CAAC,GAAG,QAAQ,OAAO,UAAU,SAAS,KAAK,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;AAAA,IACrG;AAAA,EACF;AACA,SAAO,CAAC,MAAM,KAAK,MAAM,OAAO,IAAI,GAAG,MAAM,KAAK,MAAM,KAAK,KAAK,CAAC;AACrE;AAEA,SAAS,UACP,WACA,OACA,KACA,OACA,WACA,SACY;AACZ,MAAI,YAAY;AAChB,MAAI,WAAW;AACf,SAAO,YAAY,KAAKA,WAAU,UAAU,SAAS,GAAI,UAAU,YAAY,CAAC,CAAE,EAAG;AACrF,SAAO,WAAW,IAAI,UAAU,UAAUA,WAAU,UAAU,QAAQ,GAAI,UAAU,WAAW,CAAC,CAAE,EAAG;AACrG,QAAM,OAAmB,CAAC;AAC1B,WAAS,IAAI,KAAK,IAAI,GAAG,KAAK,GAAG,KAAK,OAAO,IAAI,UAAU,QAAQ,KAAK;AACtE,QAAI,YAAY,iBAAiB,MAAM,MAAO;AAC9C,QAAI,YAAY,WAAW,KAAK,aAAa,KAAK,SAAU;AAC5D,QAAI,YAAY,UAAU,KAAK,aAAa,KAAK,YAAY,MAAM,MAAO;AAC1E,SAAK,KAAK,UAAU,CAAC,CAAE;AAAA,EACzB;AACA,SAAO;AACT;AAEA,SAAS,cACP,GACA,GACA,OACA,KACA,QACQ;AACR,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,SAAS,KAAK,MAAM,IAAI,kBAAkB,GAAG,MAAM,CAAC;AACjE,UAAM,QAAQ,SAAS,KAAK,MAAM,IAAI,kBAAkB,GAAG,MAAM,CAAC;AAClE,UAAM,SAAS,gBAAgB,MAAM,OAAO,MAAM,CAAC;AACnD,QAAI,WAAW,EAAG,QAAO;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,cACP,GACA,GACA,OACA,SACA,KACA,QACQ;AACR,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,CAAC,QAA6B;AAC1C,UAAI,KAAK,KAAK,SAAS,aAAa,OAAO,KAAK,KAAK,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,KAAK,GAAG;AAC5G,eAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,KAAK;AAAA,MAC5C;AACA,UAAI,KAAK,KAAK,SAAS,YAAY,KAAK,KAAK,UAAU,MAAM;AAC3D,cAAM,gBAAgB,KAAK,KAAK,KAAK,YAAY;AACjD,cAAM,QAAQ,QAAQ,UAAU,CAAC,SAAS,KAAK,YAAY,MAAM,aAAa;AAC9E,YAAI,SAAS,EAAG,QAAO,IAAI,OAAO,KAAK,KAAK;AAAA,MAC9C;AACA,aAAO,SAAS,KAAK,MAAM,IAAI,kBAAkB,IAAI,OAAO,MAAM,CAAC;AAAA,IACrE;AACA,UAAM,SAAS,gBAAgB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK;AAChE,QAAI,WAAW,EAAG,QAAO;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAgB,OAAiB,MAAmB,OAA0B;AACrG,MAAI,SAAS,QAAQ,UAAU,MAAM;AACnC,QAAI,SAAS,MAAO,QAAO;AAC3B,UAAM,YAAY,KAAK,QAAQ,KAAK,UAAU,UAAU,KAAK,QAAQ;AACrE,YAAQ,SAAS,OAAO,KAAK,MAAM,YAAY,IAAI;AAAA,EACrD;AACA,MAAI,YAA2B;AAC/B,MAAI,KAAK,KAAK,SAAS,UAAW,aAAY,KAAK,KAAK;AAAA,WAC/C,SAAS,KAAK,KAAK,SAAS,UAAU;AAC7C,UAAM,MAAM,KAAK,KAAK,KAAK,YAAY;AACvC,UAAM,QAAQ,MAAM,MAAM;AAAA,MACxB,CAAC,SACC,KAAK,KAAK,YAAY,MAAM,OAC5B,KAAK,KAAK,SAAS,aAClB,KAAK,KAAK,UAAU,QAAQ,KAAK,OAAO,YAAY,MAAM,KAAK,KAAK,MAAM,YAAY;AAAA,IAC3F;AACA,gBAAY,OAAO,WAAW;AAAA,EAChC;AACA,QAAM,aAAa,YAAY,qBAAqB,MAAM,OAAO,SAAS,IAAI,WAAW,MAAM,KAAK;AACpG,UAAQ,cAAc,MAAM,KAAK,QAAQ,SAAS,KAAK;AACzD;AAEA,SAAS,kBAAkB,SAAyB,QAA6B;AAC/E,QAAM,QAAkB,CAAC;AACzB,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,SAAS,QAAQ;AAC1B,iBAAW,QAAQ,QAAQ,SAAS,CAAC,GAAG;AACtC,aACG,OAAO,UAAU,QAAQ,CAAC,KAAK,mBAC/B,OAAO,UAAU,QAAQ,KAAK,OAAO,YAAY,MAAM,OAAO,MAAM,YAAY;AAEjF,gBAAM,KAAK,KAAK,IAAI;AAAA,MACxB;AAAA,IACF,WACE,CAAC,OAAO,SACR,OAAO,KAAK,SAAS,YACrB,CAAC,SAAS,WAAW,KAAK,EAAE,SAAS,OAAO,KAAK,KAAK,YAAY,CAAC,KACnE,QAAQ,WACR;AACA,YAAM,KAAK,OAAO,SAAS;AAAA,IAC7B,MAAO,OAAM,KAAK,OAAO,SAAS,eAAe,OAAO,IAAI,CAAC;AAAA,EAC/D;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAkB,OAAmB,OAAsB,SAA2B;AACjH,aAAW,QAAQ,OAAO;AACxB,QAAI,QAAQ;AACZ,QAAI,KAAK,KAAK,SAAS,aAAa,OAAO,KAAK,KAAK,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,KAAK,GAAG;AAC5G,cAAQ,KAAK,KAAK,QAAQ;AAAA,IAC5B,WAAW,KAAK,KAAK,SAAS,YAAY,KAAK,KAAK,UAAU,MAAM;AAClE,YAAM,YAAY,KAAK,KAAK,KAAK,YAAY;AAC7C,cAAQ,QAAQ,UAAU,CAAC,SAAS,KAAK,YAAY,MAAM,SAAS;AAAA,IACtE;AACA,QAAI,QAAQ,EAAG,OAAM,IAAI,YAAY,6DAA6D,OAAO;AACzG,UAAM,SAAS,gBAAgB,KAAK,KAAK,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,IAAI;AAC9E,QAAI,WAAW,EAAG,QAAO;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,MAAkB,QAAkB,KAAmB,QAA4B;AACnH,QAAM,MAAM,IAAI,kBAAkB,EAAE,GAAG,QAAQ,OAAO,GAAG,WAAW,OAAO,UAAU,GAAG,MAAM;AAC9F,QAAM,QAAQ,CAAC,SAAqB;AAClC,QAAI,KAAK,SAAS,UAAU;AAC1B,UAAI,KAAK,SAAS,IAAK,KAAI,cAAc,KAAK,OAAO,KAAK,IAAI;AAC9D;AAAA,IACF;AACA,UAAM,UAAU,CAAC,SAAe,MAAM,IAAI;AAC1C,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,gBAAQ,KAAK,IAAI;AACjB;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK,IAAI;AACjB,gBAAQ,KAAK,KAAK;AAClB;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK,IAAI;AACjB,gBAAQ,KAAK,KAAK;AAClB,gBAAQ,KAAK,KAAK;AAClB;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK,IAAI;AACjB,YAAI,MAAM,QAAQ,KAAK,MAAM,EAAG,MAAK,OAAO,QAAQ,OAAO;AAC3D;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK,IAAI;AACjB,gBAAQ,KAAK,OAAO;AACpB,YAAI,KAAK,OAAQ,SAAQ,KAAK,MAAM;AACpC;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,YAAI,KAAK,SAAS,IAAK,MAAK,KAAK,QAAQ,OAAO;AAChD,YAAI,KAAK,OAAQ,SAAQ,KAAK,MAAM;AACpC;AAAA,MACF,KAAK;AACH,YAAI,KAAK,KAAK,SAAS,IAAK,MAAK,KAAK,KAAK,QAAQ,OAAO;AAC1D;AAAA,MACF,KAAK;AACH,YAAI,KAAK,KAAM,SAAQ,KAAK,IAAI;AAChC,aAAK,MAAM,QAAQ,CAAC,WAAW;AAC7B,kBAAQ,OAAO,IAAI;AACnB,kBAAQ,OAAO,IAAI;AAAA,QACrB,CAAC;AACD,YAAI,KAAK,KAAM,SAAQ,KAAK,IAAI;AAChC;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ,KAAK,IAAI;AACjB;AAAA,MACF,KAAK;AACH,aAAK,OAAO,QAAQ,OAAO;AAC3B;AAAA,IACJ;AAAA,EACF;AACA,aAAW,UAAU,KAAK,QAAS,KAAI,OAAO,SAAS,OAAQ,OAAM,OAAO,IAAI;AAClF;AAEA,SAAS,eAAe,MAAoB;AAC1C,MAAI,KAAK,SAAS,SAAU,QAAO,KAAK;AACxC,MAAI,KAAK,SAAS,WAAW;AAC3B,QAAI,KAAK,UAAU,KAAM,QAAO;AAChC,QAAI,KAAK,iBAAiB;AACxB,aAAO,KAAK,MAAM,KAAK,KAAK,KAAK,EAC9B,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAChD,KAAK,EAAE,EACP,YAAY,CAAC;AAClB,WAAO,OAAO,KAAK,UAAU,WAAW,IAAI,KAAK,MAAM,WAAW,KAAK,IAAI,CAAC,MAAM,OAAO,KAAK,KAAK;AAAA,EACrG;AACA,MAAI,KAAK,SAAS,OAAQ,QAAO;AACjC,MAAI,KAAK,SAAS,cAAc,KAAK,SAAS,aAAa;AACzD,QAAI,KAAK,SAAS,IAAK,QAAO,GAAG,KAAK,KAAK,YAAY,CAAC;AACxD,UAAM,OAAO,KAAK,KAAK,IAAI,CAAC,QAAQ,eAAe,GAAG,CAAC,EAAE,KAAK,IAAI;AAClE,WAAO,GAAG,KAAK,KAAK,YAAY,CAAC,IAAI,IAAI;AAAA,EAC3C;AACA,MAAI,KAAK,SAAS,UAAU;AAC1B,WAAO,GAAG,eAAe,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE,IAAI,eAAe,KAAK,KAAK,CAAC;AAAA,EAC9E;AACA,SAAO,KAAK;AACd;AAEA,SAAS,eAAe,MAAY,UAAgE;AAClG,MAAI,KAAK,SAAS,eAAe,KAAK,SAAS,SAAU,QAAO,EAAE,MAAM,WAAW,OAAO,SAAS,IAAI,EAAE;AACzG,QAAM,UAAU,CAAC,SAAe,eAAe,MAAM,QAAQ;AAC7D,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,EAAE,GAAG,MAAM,MAAM,QAAQ,KAAK,IAAI,EAAE;AAAA,IAC7C,KAAK;AACH,aAAO,EAAE,GAAG,MAAM,MAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,QAAQ,KAAK,KAAK,EAAE;AAAA,IACzE,KAAK;AACH,aAAO,EAAE,GAAG,MAAM,MAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,QAAQ,KAAK,KAAK,GAAG,OAAO,QAAQ,KAAK,KAAK,EAAE;AAAA,IACrG,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM,QAAQ,KAAK,IAAI;AAAA,QACvB,QAAQ,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI,KAAK;AAAA,MACvE;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM,QAAQ,KAAK,IAAI;AAAA,QACvB,SAAS,QAAQ,KAAK,OAAO;AAAA,QAC7B,QAAQ,KAAK,UAAU,QAAQ,KAAK,MAAM;AAAA,MAC5C;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM,KAAK,SAAS,MAAM,MAAM,KAAK,KAAK,IAAI,OAAO;AAAA,QACrD,QAAQ,KAAK,UAAU,QAAQ,KAAK,MAAM;AAAA,MAC5C;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM,KAAK,QAAQ,QAAQ,KAAK,IAAI;AAAA,QACpC,OAAO,KAAK,MAAM,IAAI,CAAC,EAAE,MAAM,MAAM,SAAS,MAAM;AAElD,iBAAO,EAAE,MAAM,QAAQ,IAAI,GAAG,MAAM,QAAQ,QAAQ,EAAE;AAAA,QACxD,CAAC;AAAA,QACD,MAAM,KAAK,QAAQ,QAAQ,KAAK,IAAI;AAAA,MACtC;AAAA,IACF,KAAK;AACH,aAAO,EAAE,GAAG,MAAM,MAAM,QAAQ,KAAK,IAAI,EAAE;AAAA,IAC7C,KAAK;AACH,aAAO,EAAE,GAAG,MAAM,QAAQ,KAAK,OAAO,IAAI,OAAO,EAAE;AAAA,IACrD,KAAK;AACH,aAAO,EAAE,GAAG,MAAM,MAAM,QAAQ,KAAK,IAAI,EAAE;AAAA,IAC7C;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,kBAAkB,MAAqB;AAC9C,MAAI,QAAQ;AACZ,iBAAe,MAAM,CAAC,YAAY;AAChC,QAAI,QAAQ,SAAS,YAAa,SAAQ;AAC1C,WAAO;AAAA,EACT,CAAC;AACD,SAAO;AACT;AAEA,SAAS,gBAAgB,QAAoB,MAAuB;AAClE,QAAM,SAAS,KAAK,YAAY;AAChC,QAAM,QAAQ,CAAC,SAAmC;AAChD,QAAI,CAAC,KAAM,QAAO;AAClB,QAAI,KAAK,SAAS,QAAS,QAAO,KAAK,KAAK,YAAY,MAAM;AAC9D,QAAI,KAAK,SAAS,OAAQ,QAAO,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,KAAK;AACrE,WAAO,KAAK,SAAS,aAAa,gBAAgB,KAAK,QAAQ,IAAI,IAAI;AAAA,EACzE;AACA,SAAO,MAAM,OAAO,IAAI,MAAM,OAAO,WAAW,gBAAgB,OAAO,SAAS,QAAQ,IAAI,IAAI;AAClG;AAEA,SAASA,WAAU,MAAkB,OAA4B;AAC/D,SACE,KAAK,WAAW,MAAM,UACtB,KAAK,MAAM,CAAC,OAAO,UAAU;AAC3B,UAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,WAAQ,UAAU,QAAQ,UAAU,QAAU,UAAU,QAAQ,UAAU,QAAQ,eAAe,OAAO,KAAK;AAAA,EAC/G,CAAC;AAEL;AAEA,SAAS,WAAW,MAAkC;AACpD,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAuB,CAAC;AAC9B,aAAW,OAAO,MAAM;AACtB,UAAM,MAAM,SAAS,GAAG;AACxB,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAAS,SAAS,QAA4B;AAC5C,SAAO,OAAO,IAAI,YAAY,EAAE,KAAK,IAAI;AAC3C;AAEA,SAAS,aAAa,OAAyB;AAC7C,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,MAAM,SAAS,CAAC;AAC3D,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,OAAO,UAAU,KAAK,EAAG,QAAO,KAAK,MAAM,SAAS,CAAC;AACzD,QAAI,OAAO,MAAM,KAAK,EAAG,QAAO;AAChC,WAAO,KAAK,OAAO,GAAG,OAAO,EAAE,IAAI,MAAM,MAAM,SAAS,CAAC;AAAA,EAC3D;AACA,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,KAAK;AAChD,MAAI,iBAAiB,YAAY;AAC/B,QAAI,MAAM;AACV,eAAW,QAAQ,MAAO,QAAO,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAClE,WAAO;AAAA,EACT;AACA,MAAI,WAAW,SAAS,OAAO,MAAM,UAAU,UAAU;AACvD,UAAM,IAAI,MAAM;AAChB,QAAI,OAAO,UAAU,CAAC,EAAG,QAAO,KAAK,EAAE,SAAS,CAAC;AACjD,WAAO,KAAK,EAAE,SAAS,CAAC;AAAA,EAC1B;AACA,MAAI,WAAW,SAAS,OAAO,MAAM,UAAU,SAAU,QAAO,KAAK,MAAM,KAAK;AAChF,SAAO,KAAK,OAAO,KAAK,CAAC;AAC3B;AAEA,SAAS,WAAW,IAAmB,OAAe,YAAuC;AAC3F,QAAM,OAAmB,CAAC;AAC1B,MAAI,SAAS;AACb,QAAM,OAAO,CAAC,MAAc,UAAkB,UAAkB;AAC9D,SAAK,KAAK;AAAA,MACR,OAAO;AAAA,QACL,EAAE,OAAO,OAAO,MAAM,QAAQ,OAAO,KAAK;AAAA,QAC1C,EAAE,OAAO,OAAO,MAAM,QAAQ,OAAO,IAAI;AAAA,QACzC,EAAE,OAAO,OAAO,MAAM,UAAU,OAAO,SAAS;AAAA,QAChD,EAAE,OAAO,OAAO,MAAM,YAAY,OAAO,SAAS;AAAA,QAClD,EAAE,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAAA,QAC5C,EAAE,OAAO,OAAO,MAAM,WAAW,OAAO,QAAQ,EAAE;AAAA,QAClD,EAAE,OAAO,OAAO,MAAM,UAAU,OAAO,EAAE;AAAA,QACzC,EAAE,OAAO,OAAO,MAAM,cAAc,OAAO,EAAE;AAAA,QAC7C,EAAE,OAAO,OAAO,MAAM,YAAY,QAAQ,SAAS,KAAK,KAAK;AAAA,QAC7D,EAAE,OAAO,OAAO,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9C;AAAA,IACF,CAAC;AAAA,EACH;AACA,OAAK,iBAAiB,QAAQ,GAAG,OAAO,OAAO,GAAG,MAAM,OAAO,GAAG,cAAc,IAAI;AACpF,aAAW,SAAS,GAAG,OAAO,OAAO,GAAG;AACtC,SAAK,MAAM,MAAM,QAAQ,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,MAAM;AAAA,EACnD;AACA,aAAW,SAAS,GAAG,cAAc,OAAO,GAAG;AAC7C,QAAI,MAAM,SAAS,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS,SAAS;AACrG,WAAK,MAAM,MAAM,QAAQ,MAAM,SAAS,UAAU,MAAM,KAAK,OAAO,MAAM,KAAK,IAAI;AAAA,IACrF,OAAO;AACL,WAAK,MAAM,MAAM,QAAQ,CAAC;AAAA,IAC5B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,IAAmB,OAAe,OAAyC;AAC/F,QAAM,MAAM,GAAG,cAAc,IAAI,MAAM,SAAS,YAAY,CAAC;AAC7D,MAAI,CAAC,OAAQ,IAAI,SAAS,UAAU,IAAI,SAAS,UAAU,IAAI,SAAS,OAAS,QAAO,CAAC;AACzF,SAAO,IAAI,UAAU,KAAK,EAAE,IAAI,CAAC,YAAY;AAAA,IAC3C,OAAO,MAAM,QAAQ,IAAI,CAAC,YAAY;AAAA,MACpC,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,OAAO,MAAM,MAAM,WAAW,QAAQ,MAAM,WAAW,WAAW,IAAI;AAAA,IAC/E,EAAE;AAAA,EACJ,EAAE;AACJ;;;AC5wCO,SAAS,mBAAmB,MAAuB,KAA8B;AACtF,MAAI,CAAC,KAAK,UAAU;AAClB,QAAI,MAAM,YAAY,IAAI;AAC1B,QAAI,MAAM,aAAa,CAAC;AACxB,WAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AAAA,EACjD;AACA,QAAM,SAASS,eAAc,KAAK,UAAU,GAAG;AAC/C,QAAM,UAAU,OAAO,QAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,UAAU,MAAM,aAAa,CAAC,EAAE,EAAE;AACxF,QAAM,QAAQ,IAAI,MAAM,YAAY,EAAE,GAAG,MAAM,SAAS,aAAa,CAAC,GAAG,UAAU,KAAK,CAAC;AACzF,aAAW,UAAU,aAAa,MAAM,GAAG;AACzC,UAAM;AAAA,MACJ,IAAI,IAAI,MAAM,QAAQ,IAAI,CAAC,QAAQ,UAAU,CAAC,oBAAoB,OAAO,IAAI,GAAG,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAAA,IACzG;AAAA,EACF;AAEA,QAAM,KAAK,IAAI,MAAM,iBAAiB,KAAK;AAC3C,aAAW,aAAa,MAAM,SAAS;AACrC,UAAM,QAAQ,GAAG,QAAQ,IAAI,UAAU,YAAY,CAAC;AACpD,QAAI,CAAC,MAAO;AACZ,UAAM,MAAM,MAAM;AAClB,eAAW,OAAO,MAAM,KAAK,GAAG;AAC9B,YAAM,MAAM;AAAA,QACV,MAAM,QAAQ;AAAA,UAAI,CAAC,WACjB,sBAAsB,IAAI,OAAO,IAAI,oBAAoB,OAAO,IAAI,CAAC,KAAK,MAAM,OAAO,WAAW,QAAQ;AAAA,QAC5G;AAAA,QACA,IAAI;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,aAAa,CAAC;AACxB,SAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AACjD;AAEO,SAAS,mBAAmB,MAAuB,KAA8B;AACtF,QAAM,QAAQ,IAAI,MAAM,YAAY,IAAI;AACxC,QAAM,QAAQ,IAAI,MAAM,SAAS,KAAK,KAAK;AAC3C,MAAI;AACF,eAAW,OAAO,MAAM,KAAK,GAAG;AAC9B,YAAM,MAAM,IAAI,kBAAkB;AAAA,QAChC,OAAO,IAAI;AAAA,QACX,aAAa,MAAM;AAAA,QACnB,OAAO,MAAM,QAAQ,IAAI,CAAC,YAAY;AAAA,UACpC,OAAO,MAAM;AAAA,UACb,MAAM,OAAO;AAAA,UACb,OAAO,IAAI,OAAO,IAAI,oBAAoB,OAAO,IAAI,CAAC,KAAK;AAAA,QAC7D,EAAE;AAAA,MACJ,CAAC;AACD,UAAI,KAAK,SAAS,YAAY,SAAS,KAAK,OAAO,GAAG,CAAC,MAAM,KAAM;AACnE,YAAM,MAAM;AAAA,QACV,KAAK,QAAQ,IAAI,CAAC,WAAW;AAC3B,gBAAM,MAAM,OAAO,OACf,SAAS,OAAO,MAAM,GAAG,IACxB,IAAI,OAAO,IAAI,oBAAoB,OAAO,IAAI,CAAC,KAAK;AACzD,iBAAO,sBAAsB,KAAK,OAAO,WAAW,QAAQ;AAAA,QAC9D,CAAC;AAAA,QACD,IAAI;AAAA,QACJ,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,MAAM,UAAU,KAAK,MAAM,IAAI;AACnC,UAAM;AAAA,EACR;AACA,SAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AACjD;AAEO,SAAS,kBAAkB,MAAsB,KAA8B;AACpF,QAAM,QAAQ,IAAI,MAAM,iBAAiB,KAAK,KAAK;AACnD,QAAM,SAAS,KAAK;AACpB,MAAI,OAAO,SAAS,gBAAgB;AAClC,QAAI,MAAM,YAAY,KAAK,OAAO,OAAO,OAAO;AAAA,EAClD,WAAW,OAAO,SAAS,iBAAiB;AAC1C,UAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,SAAS,KAAK,KAAK,YAAY,MAAM,OAAO,QAAQ,YAAY,CAAC;AACpG,QAAI,CAAC,OAAQ,OAAM,IAAI,YAAY,mBAAmB,OAAO,OAAO,IAAI,gBAAgB;AACxF,QAAI,MAAM,QAAQ,KAAK,CAAC,SAAS,KAAK,KAAK,YAAY,MAAM,OAAO,QAAQ,YAAY,CAAC;AACvF,YAAM,IAAI,YAAY,0BAA0B,OAAO,OAAO,IAAI,OAAO;AAC3E,UAAM,SAAS,oBAAoB,OAAO,IAAI;AAC9C,WAAO,OAAO,OAAO;AACrB,WAAO,YAAY,OAAO,QAAQ,YAAY;AAC9C,eAAW,OAAO,MAAM,KAAK,OAAO,GAAG;AACrC,YAAM,QAAQ,IAAI,OAAO,IAAI,MAAM,KAAK;AACxC,UAAI,OAAO,OAAO,MAAM;AACxB,UAAI,OAAO,IAAI,oBAAoB,OAAO,OAAO,GAAG,KAAK;AAAA,IAC3D;AACA,eAAW,cAAc,MAAM,YAAa,wBAAuB,YAAY,OAAO,SAAS,OAAO,OAAO;AAC7G,eAAW,QAAQ,MAAM,SAAS;AAChC,YAAM,QAAQ,IAAI,MAAM,iBAAiB,IAAI;AAC7C,UAAI;AACF,mBAAW,WAAW,MAAM;AAC1B,cAAI,QAAQ,KAAK,YAAY,MAAM,OAAO,QAAQ,YAAY,EAAG,SAAQ,OAAO,OAAO;AAAA;AAAA,IAC7F;AACA,UAAM,oBAAoB;AAC1B,QAAI,MAAM;AAAA,EACZ,WAAW,OAAO,SAAS,cAAc;AACvC,QAAI,MAAM,QAAQ,KAAK,CAAC,SAAS,KAAK,KAAK,YAAY,MAAM,OAAO,OAAO,KAAK,YAAY,CAAC;AAC3F,YAAM,IAAI,YAAY,0BAA0B,OAAO,OAAO,IAAI,IAAI,OAAO;AAC/E,UAAM,UAAU,OAAO,OAAO,YAAY,KAAK,CAAC,SAAS,KAAK,SAAS,aAAa;AACpF,UAAM,SAAS,OAAO,OAAO,YAAY,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ;AAC9E,SAAK,WAAW,WAAW,MAAM,KAAK,OAAO;AAC3C,YAAM,IAAI,YAAY,6CAA6C,OAAO;AAC5E,UAAM,cAAc,OAAO,OAAO,YAAY,KAAK,CAAC,SAAS,KAAK,SAAS,SAAS,GAAG,QAAQ;AAC/F,UAAM,UAAU,OAAO,OAAO,YAAY,KAAK,CAAC,SAAS,KAAK,SAAS,SAAS;AAChF,UAAM,YAAY,OAAO,OAAO,YAAY,KAAK,CAAC,SAAS,KAAK,SAAS,WAAW;AACpF,UAAM,SAAS,eAAe,OAAO,OAAO,MAAM,OAAO,OAAO,UAAU;AAAA,MACxE,SAAS,OAAO,OAAO,YAAY,KAAK,CAAC,SAAS,KAAK,SAAS,UAAU;AAAA,MAC1E,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,SAAS,SAAS,SAAS,YAAY,QAAQ,OAAO;AAAA,MACtD,WAAW,WAAW,SAAS,cAAc,EAAE,MAAM,UAAU,MAAM,QAAQ,UAAU,OAAO,IAAI;AAAA,IACpG,CAAC;AACD,UAAM,eAAe,cAAc,SAAS,aAAa,IAAI,kBAAkB,CAAC,IAAI;AACpF,QAAI,OAAO,WAAW,iBAAiB,QAAQ,MAAM,KAAK,OAAO;AAC/D,YAAM,IAAI,YAAY,wDAAwD,OAAO;AACvF,UAAM,QAAQ,KAAK,MAAM;AACzB,eAAW,OAAO,MAAM,KAAK,OAAO,EAAG,KAAI,OAAO,IAAI,oBAAoB,OAAO,IAAI,GAAG,YAAY;AACpG,UAAM,oBAAoB;AAC1B,QAAI,MAAM;AAAA,EACZ,OAAO;AACL,UAAM,QAAQ,MAAM,QAAQ,UAAU,CAAC,SAAS,KAAK,KAAK,YAAY,MAAM,OAAO,KAAK,YAAY,CAAC;AACrG,QAAI,QAAQ,EAAG,OAAM,IAAI,YAAY,mBAAmB,OAAO,IAAI,IAAI,gBAAgB;AACvF,QAAI,MAAM,QAAQ,WAAW;AAC3B,YAAM,IAAI,YAAY,2DAA2D,OAAO;AAC1F,UAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,QAAI,OAAO,YAAY;AACrB,YAAM,IAAI,YAAY,6CAA6C,OAAO,IAAI,IAAI,OAAO;AAAA,IAC3F;AACA,QAAI,OAAO,QAAQ;AACjB,YAAM,IAAI,YAAY,+BAA+B,OAAO,IAAI,KAAK,OAAO;AAAA,IAC9E;AACA,QACE,MAAM,YAAY;AAAA,MAChB,CAAC,UACE,KAAK,SAAS,iBAAiB,KAAK,SAAS,aAC9C,KAAK,QAAQ,KAAK,CAAC,SAAS,KAAK,KAAK,YAAY,MAAM,OAAO,KAAK,YAAY,CAAC;AAAA,IACrF,GACA;AACA,YAAM,IAAI;AAAA,QACR,kBAAkB,KAAK,KAAK,uCAAuC,OAAO,IAAI;AAAA,QAC9E;AAAA,MACF;AAAA,IACF;AACA,eAAW,QAAQ,MAAM,SAAS;AAChC,YAAM,cAAc,IAAI,MAAM,QAAQ,IAAI,KAAK,YAAY,CAAC;AAC5D,UAAI,aAAa,QAAQ,KAAK,CAAC,SAAS,KAAK,KAAK,YAAY,MAAM,OAAO,KAAK,YAAY,CAAC,GAAG;AAC9F,cAAM,IAAI;AAAA,UACR,kBAAkB,IAAI,uCAAuC,OAAO,IAAI;AAAA,UACxE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,UAAM,QAAQ,OAAO,OAAO,CAAC;AAC7B,eAAW,OAAO,MAAM,KAAK,OAAO,EAAG,KAAI,OAAO,OAAO,oBAAoB,OAAO,IAAI,CAAC;AACzF,UAAM,oBAAoB;AAC1B,QAAI,MAAM;AAAA,EACZ;AACA,SAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AACjD;AAEO,SAAS,iBAAiB,MAAqB,KAA8B;AAClF,MAAI,MAAM,UAAU,KAAK,MAAM,KAAK,QAAQ;AAC5C,SAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AACjD;AAEO,SAAS,iBAAiB,MAAqB,KAA8B;AAClF,MAAI,MAAM,UAAU,KAAK,MAAM,KAAK,QAAQ;AAC5C,SAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AACjD;AAEO,SAAS,kBAAkB,MAAsB,KAA8B;AACpF,MAAI,MAAM,WAAW,IAAI;AACzB,SAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AACjD;AAEO,SAAS,gBAAgB,MAAoB,KAA8B;AAChF,MAAI,MAAM,SAAS,KAAK,MAAM,KAAK,QAAQ;AAC3C,SAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AACjD;AAEA,SAAS,uBACP,YACA,SACA,SACM;AACN,MAAI,WAAW,SAAS,iBAAiB,WAAW,SAAS,UAAU;AACrE,eAAW,UAAU,WAAW;AAC9B,UAAI,OAAO,KAAK,YAAY,MAAM,QAAQ,YAAY,EAAG,QAAO,OAAO;AAAA,EAC3E,WAAW,WAAW,SAAS,eAAe;AAC5C,eAAW,UAAU,WAAW,QAAQ;AAAA,MAAI,CAAC,SAC3C,KAAK,YAAY,MAAM,QAAQ,YAAY,IAAI,UAAU;AAAA,IAC3D;AAAA,EACF;AACF;;;ACzMO,SAAS,aAAa,SAAgC,KAAU,YAAY,SAAe;AAChG,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,QAAS;AACrB,SAAK,IAAI,OAAO,IAAI,oBAAoB,OAAO,IAAI,CAAC,KAAK,UAAU,MAAM;AACvE,YAAM,IAAI;AAAA,QACR,+BAA+B,SAAS,IAAI,OAAO,IAAI;AAAA,QACvD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,SAAgC,KAAU,YAAY,SAAe;AACnG,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,WAAY;AACxB,SAAK,IAAI,OAAO,IAAI,oBAAoB,OAAO,IAAI,CAAC,KAAK,UAAU,MAAM;AACvE,YAAM,IAAI;AAAA,QACR,kCAAkC,SAAS,IAAI,OAAO,IAAI;AAAA,QAC1D;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,iBACd,aACA,KACA,UACA,iBAAiB,SACX;AACN,aAAW,cAAc,aAAa;AACpC,UAAM,SAAS,SAAS,YAAY,GAAG;AACvC,QAAI,WAAW,QAAQ,YAAY,MAAM,MAAM,OAAO;AACpD,YAAM,IAAI;AAAA,QACR,4BAA4B,cAAc;AAAA,QAC1C;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,sBAAsB,OAAc,KAAU,UAAgC;AAC5F,eAAa,MAAM,SAAS,KAAK,MAAM,IAAI;AAC3C,kBAAgB,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9C,aAAW,cAAc,MAAM,aAAa;AAC1C,QAAI,WAAW,SAAS,QAAS;AACjC,qBAAiB,CAAC,WAAW,IAAI,GAAG,KAAK,UAAU,WAAW,QAAQ,MAAM,IAAI;AAAA,EAClF;AACF;;;ACrDA,IAAM,oBAAoB;AAEnB,SAAS,qBAAqB,MAAyB,KAA8B;AAC1F,QAAM,EAAE,QAAQ,KAAK,IAAI,mBAAmB,KAAK,IAAI;AACrD,QAAM,SAAS,WAAW,OAAO,IAAI,MAAM,kBAAkB,QAAQ,KAAK,IAAI,IAAI,IAAI;AACtF,QAAM,WAAW,OAAO,SAAS,IAAI,KAAK,YAAY,CAAC;AACvD,MAAI,YAAY,KAAK,aAAa;AAChC,WAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AAAA,EACjD;AAEA,QAAM,WAAW,mBAAmB,KAAK,KAAK,EAAE,KAAK,YAAY;AACjE,QAAM,SAAS,OAAO,MAAM,IAAI,QAAQ;AACxC,QAAM,UAAU,OAAO,OAAO,IAAI,QAAQ;AAC1C,MAAI,KAAK,WAAW,WAAW;AAC7B,QAAI,CAAC,OAAQ,OAAM,IAAI,YAAY,8CAA8C,KAAK,KAAK,IAAI,OAAO;AAAA,EACxG,WAAW,QAAQ;AACjB,UAAM,IAAI,YAAY,iBAAiB,KAAK,MAAM,qBAAqB,KAAK,KAAK,IAAI,OAAO;AAAA,EAC9F,WAAW,CAAC,SAAS;AACnB,UAAM,IAAI,YAAY,kBAAkB,KAAK,KAAK,IAAI,eAAe;AAAA,EACvE;AAEA,MAAI,SAAU,OAAM,IAAI,YAAY,0BAA0B,IAAI,IAAI,OAAO;AAE7E,SAAO,cAAc;AAAA,IACnB,MAAM;AAAA,IACN,WAAW,mBAAmB,KAAK,KAAK,EAAE;AAAA,IAC1C,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,MAAM,KAAK;AAAA,IACX,YAAY,KAAK;AAAA,IACjB,MAAM,KAAK;AAAA,IACX,eAAe,KAAK;AAAA,IACpB,aAAa;AAAA,EACf,CAAC;AACD,SAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AACjD;AAEO,SAAS,mBAAmB,MAAuB,KAA8B;AACtF,MAAI,MAAM,YAAY,KAAK,MAAM,KAAK,QAAQ;AAC9C,SAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AACjD;AAEO,SAAS,mBACd,QACA,OACA,QACA,QACA,KACiB;AACjB,SAAO,YAAY,OAAO,UAAU,QAAQ,QAAQ,QAAQ,MAAM,GAAG;AACvE;AAEO,SAAS,mBACd,QACA,OACA,QACA,WACA,gBACA,KACiB;AACjB,SAAO,YAAY,OAAO,UAAU,QAAQ,QAAQ,WAAW,gBAAgB,GAAG;AACpF;AAEO,SAAS,mBACd,QACA,OACA,QACA,KACiB;AACjB,SAAO,YAAY,OAAO,UAAU,QAAQ,QAAQ,MAAM,MAAM,GAAG;AACrE;AAEA,SAAS,YACP,OACA,OACA,QACA,QACA,WACA,gBACA,KACiB;AACjB,QAAM,KAAK,IAAI,MAAM,iBAAiB,KAAK;AAC3C,MAAI,GAAG,SAAS,SAAS,EAAG,QAAO;AACnC,QAAM,WAAW,CAAC,GAAG,GAAG,SAAS,OAAO,CAAC,EAAE;AAAA,IACzC,CAAC,YACC,QAAQ,UAAU,YAAY,MAAM,MAAM,KAAK,YAAY,KAC3D,QAAQ,UAAU,SAClB,QAAQ,WAAW;AAAA,EACvB;AAEA,aAAW,WAAW,UAAU;AAC9B,QAAI,UAAU,YAAY,QAAQ,eAAe;AAC/C,YAAM,UAAU,IAAI,IAAI,QAAQ,cAAc,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC;AAC/E,UAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,cAAc,EAAE,KAAK,CAAC,SAAS,QAAQ,IAAI,KAAK,YAAY,CAAC,CAAC,EAAG;AAAA,IAC/F;AACA,QAAI,QAAQ,MAAM;AAChB,YAAM,QAAQ,aAAa,OAAO,QAAQ,SAAS;AACnD,UAAI,YAAY,SAAS,QAAQ,MAAM,IAAI,kBAAkB,KAAK,CAAC,CAAC,MAAM,KAAM;AAAA,IAClF;AACA,UAAM,SAAS,sBAAsB,SAAS,OAAO,QAAQ,WAAW,GAAG;AAC3E,QAAI,WAAW,SAAU,QAAO;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,sBACP,SACA,OACA,QACA,WACA,KACiB;AACjB,MAAI,IAAI,gBAAgB,mBAAmB;AACzC,UAAM,IAAI,YAAY,wCAAwC,OAAO;AAAA,EACvE;AACA,MAAI;AACJ,QAAM,aAAa,IAAI;AACvB,MAAI,eAAe,aAAa,OAAO,QAAQ,SAAS;AACxD,MAAI;AACF,eAAW,aAAa,QAAQ,MAAM;AACpC,8BAAwB,WAAW,GAAG;AAAA,IACxC;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,iBAAiB,mBAAmB;AACtC,UAAI,MAAM,WAAW,SAAU,QAAO;AACtC,UAAI,MAAM,WAAW,YAAY;AAC/B,YAAI,aAAa,SAAS;AAC1B,cAAM;AAAA,MACR;AACA,YAAM;AAAA,IACR;AACA,UAAM;AAAA,EACR,UAAE;AACA,QAAI,eAAe;AACnB,QAAI;AAAA,EACN;AACF;AAEA,SAAS,wBAAwB,WAAsB,KAAyB;AAC9E,mBAAiB,WAAW,GAAG;AACjC;AAEA,SAAS,aAAa,OAAc,QAAoB,WAAmD;AACzG,QAAM,QAA2B,CAAC;AAClC,aAAW,UAAU,MAAM,SAAS;AAClC,UAAM,MAAM,oBAAoB,OAAO,IAAI;AAC3C,UAAM,KAAK;AAAA,MACT,OAAO;AAAA,MACP,MAAM,OAAO;AAAA,MACb,OAAO,SAAU,OAAO,OAAO,IAAI,GAAG,KAAK,OAAQ;AAAA,MACnD,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO;AAAA,IAClB,CAAC;AACD,UAAM,KAAK;AAAA,MACT,OAAO;AAAA,MACP,MAAM,OAAO;AAAA,MACb,OAAO,YAAa,UAAU,IAAI,GAAG,KAAK,OAAQ;AAAA,MAClD,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO;AAAA,IAClB,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,QAAQ,SAAS;AAAA,IACxB,aAAa,MAAM;AAAA,EACrB;AACF;;;AC5KO,SAAS,0BAA0B,MAA8B,KAA8B;AACpG,MAAI,MAAM,mBAAmB,IAAI;AACjC,MAAI,MAAM,aAAa,CAAC;AACxB,SAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AACjD;AAEO,SAAS,iBACd,OACA,aACA,YACA,KACuD;AACvD,MAAI,UAAU;AACd,MAAI,OAAO,IAAI,MAAM;AACrB,aAAW,UAAU,YAAY;AAC/B,QAAI,OAAO,WAAW,YAAY,QAAQ;AACxC,YAAM,IAAI,YAAY,GAAG,OAAO,MAAM,eAAe,YAAY,MAAM,YAAY,OAAO;AAAA,IAC5F;AACA,UAAM,SAAS,oBAAI,IAAsB;AACzC,QAAI;AACJ,aAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,YAAM,OAAO,YAAY,CAAC;AAC1B,YAAM,QAAQ,KAAK,YAAY;AAC/B,YAAM,QAAQ,OAAO,CAAC,KAAK;AAC3B,UAAI,UAAU,WAAW,UAAU,aAAa,UAAU,OAAO;AAC/D,YAAI,OAAO,UAAU,YAAY,OAAO,UAAU,SAAU,iBAAgB;AAAA,iBACnE,UAAU,KAAM,iBAAgB,OAAO,KAAK;AACrD;AAAA,MACF;AACA,aAAO,IAAI,oBAAoB,IAAI,GAAG,KAAK;AAAA,IAC7C;AACA,eAAW,UAAU,MAAM,SAAS;AAClC,YAAM,MAAM,oBAAoB,MAAM;AACtC,UAAI,CAAC,OAAO,IAAI,GAAG,KAAK,CAAC,YAAY,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,GAAG,GAAG;AACzE,eAAO,IAAI,KAAK,IAAI;AAAA,MACtB;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,OAAO,QAAQ,aAAa;AAEhD;AACA,WAAO;AAAA,EACT;AACA,SAAO,EAAE,SAAS,iBAAiB,KAAK;AAC1C;AAEO,SAAS,iBACd,OACA,SACA,QACQ;AACR,MAAI,UAAU;AACd,aAAW,SAAS,QAAQ;AAC1B,UAAM,OAAO,OAAO,OAAO;AAC3B;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,OAAyB,QAA2C;AACnG,MAAI,UAAU;AACd,aAAW,SAAS,QAAQ;AAC1B,UAAM,OAAO,KAAK;AAClB;AAAA,EACF;AACA,SAAO;AACT;;;ACtDA,SAAS,iBACP,OACA,QACA,OACU;AACV,MAAI,MAAM,OAAQ,QAAO,iBAAiB,OAAO,OAAO,YAAY,IAAI,MAAM,MAAM,OAAO,IAAI;AAC/F,SAAO,cAAc,OAAO,OAAO,QAAQ;AAC7C;AAEO,SAAS,cAAc,MAAkB,KAA8B;AAC5E,MAAI,IAAI,MAAM,eAAe,KAAK,KAAK,GAAG;AACxC,WAAO,qBAAqB,MAAM,GAAG;AAAA,EACvC;AACA,QAAM,OAAO,cAAc,MAAM,GAAG;AACpC,MAAI,KAAM,QAAO;AACjB,QAAM,QAAQ,IAAI,MAAM,iBAAiB,KAAK,KAAK;AACnD,QAAM,cAAc,KAAK,WAAW,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI;AAC7E,QAAM,eAAe,YAAY,IAAI,CAAC,MAAM,UAAWC,aAAY,IAAI,IAAI,QAAQ,EAAG,EAAE,OAAO,CAAC,UAAU,SAAS,CAAC;AACpH,MAAI,aAAa,SAAS,EAAG,OAAM,IAAI,YAAY,gCAAgC,OAAO;AAC1F,MAAI,MAAM,gBAAgB,aAAa,SAAS,GAAG;AACjD,UAAM,IAAI,YAAY,SAAS,MAAM,IAAI,8BAA8B,OAAO;AAAA,EAChF;AACA,aAAW,QAAQ,YAAa,KAAI,CAACA,aAAY,IAAI,EAAG,UAAS,OAAO,IAAI;AAC5E,QAAM,aAAa,qBAAqB,MAAM,GAAG;AACjD,QAAM,gBAA8B,CAAC;AACrC,MAAI,UAAU;AACd,MAAI,OAAO,IAAI,MAAM;AACrB,QAAM,kBAAkB,MAAM,QAAQ;AAAA,IAAI,CAAC,WACzC,YAAY,UAAU,CAAC,SAAS,KAAK,YAAY,OAAO,OAAO,aAAa,OAAO,KAAK,YAAY,EAAE;AAAA,EACxG;AACA,QAAM,gBACJ,MAAM,gBAAgB,KACtB,CAAC,KAAK,UACN,KAAK,SAAS,YACd,KAAK,UAAU,WAAW,KAC1B,aAAa,WAAW;AAE1B,MAAI,eAAe;AACjB,eAAW,UAAU,YAAY;AAC/B,UAAI,OAAO,WAAW,YAAY;AAChC,cAAM,IAAI,YAAY,GAAG,OAAO,MAAM,eAAe,YAAY,MAAM,YAAY,OAAO;AAC5F,YAAM,SAAS,oBAAI,IAAsB;AACzC,eAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,QAAQ,SAAS;AACzD,cAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,cAAM,gBAAgB,gBAAgB,KAAK;AAC3C,cAAM,QAAQ,iBAAiB,IAAK,OAAO,aAAa,KAAK,OAAQ;AACrE,eAAO,IAAI,OAAO,aAAa,OAAO,KAAK,YAAY,GAAG,iBAAiB,OAAO,QAAQ,KAAK,CAAC;AAAA,MAClG;AACA,aAAO,MAAM,OAAO,EAAE,OAAO,GAAG,EAAE,UAAU,MAAM,cAAc,KAAK,CAAC;AACtE;AAAA,IACF;AACA,QAAI,MAAM,aAAa,SAAS,IAAI;AACpC,WAAO,YAAY,SAAS,IAAI;AAAA,EAClC;AAEA,aAAW,UAAU,YAAY;AAC/B,QAAI,OAAO,WAAW,YAAY;AAChC,YAAM,IAAI,YAAY,GAAG,OAAO,MAAM,eAAe,YAAY,MAAM,YAAY,OAAO;AAC5F,UAAM,SAAS,oBAAI,IAAsB;AACzC,eAAW,UAAU,MAAM,SAAS;AAClC,UAAI,OAAO,UAAW;AACtB,YAAM,gBAAgB,gBAAgB,MAAM,QAAQ,QAAQ,MAAM,CAAC,KAAK;AACxE,YAAM,QACJ,iBAAiB,IACZ,OAAO,aAAa,KAAK,OAC1B,OAAO,cACL,SAAS,OAAO,aAAa,IAAI,kBAAkB,CAAC,IACpD;AACR,aAAO,IAAI,OAAO,aAAa,OAAO,KAAK,YAAY,GAAG,iBAAiB,OAAO,QAAQ,KAAK,CAAC;AAAA,IAClG;AACA,eAAW,UAAU,MAAM,SAAS;AAClC,UAAI,CAAC,OAAO,UAAW;AACvB,UAAI,YAAY,KAAK,CAAC,SAAS,KAAK,YAAY,MAAM,OAAO,KAAK,YAAY,CAAC,GAAG;AAChF,cAAM,IAAI,YAAY,wCAAwC,OAAO,IAAI,KAAK,QAAQ;AAAA,MACxF;AACA,UAAI,OAAO,UAAU,QAAQ;AAC3B,cAAM,SAAS,IAAI,kBAAkB;AAAA,UACnC,OAAO,MAAM,QACV,OAAO,CAAC,MAAM,CAAC,EAAE,aAAa,MAAM,MAAM,EAC1C,QAAQ,CAAC,MAAM;AACd,gBAAI,EAAE,aAAa,MAAM,OAAQ,QAAO,CAAC;AACzC,gBAAI,MAAM,OAAQ,QAAO,CAAC;AAC1B,mBAAO;AAAA,cACL;AAAA,gBACE,OAAO,MAAM;AAAA,gBACb,MAAM,EAAE;AAAA,gBACR,OAAO,OAAO,IAAI,oBAAoB,EAAE,IAAI,CAAC,KAAK;AAAA,gBAClD,UAAU,EAAE;AAAA,gBACZ,SAAS,EAAE;AAAA,cACb;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACL,CAAC;AACD,cAAM,WAAW,SAAS,OAAO,UAAU,MAAM,MAAM;AACvD,eAAO,IAAI,oBAAoB,OAAO,IAAI,GAAG,iBAAiB,OAAO,QAAQ,QAAQ,CAAC;AAAA,MACxF,OAAO;AACL,eAAO,IAAI,oBAAoB,OAAO,IAAI,GAAG,IAAI;AAAA,MACnD;AAAA,IACF;AAEA,QAAI,mBAAmB,UAAU,OAAO,QAAQ,MAAM,GAAG,MAAM,SAAU;AAEzE,UAAM,YAAY,gBAAgB,OAAO,QAAQ,GAAG;AACpD,QAAI,UAAU,SAAS,GAAG;AACxB,UAAI,KAAK,QAAQ;AACf,cAAM,kBAAkB,mBAAmB,OAAO,QAAQ,KAAK,KAAK,MAAM;AAC1E,YAAI,gBAAgB,WAAW,GAAG;AAEhC,gBAAM,IAAI;AAAA,YACR,6BAA6B,MAAM,IAAI;AAAA,YACvC;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,YAAI,KAAK,OAAO,WAAW,UAAW;AACtC,cAAM,MAAM,gBAAgB,CAAC;AAC7B,cAAM,QAAQ,SAAS,OAAO,KAAK,KAAK,OAAO,GAAG;AAClD,cAAM,WAAqB;AAAA,UACzB,OAAO,MAAM,QAAQ,IAAI,CAAC,YAAY;AAAA,YACpC,OAAO;AAAA,YACP,MAAM,OAAO;AAAA,YACb,OAAO,OAAO,IAAI,oBAAoB,OAAO,IAAI,CAAC,KAAK;AAAA,UACzD,EAAE;AAAA,QACJ;AACA,cAAM,SAAS,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,GAAG,SAAS,KAAK,GAAG,OAAO,IAAI,OAAO,aAAa,MAAM,KAAK;AACvG,cAAM,MAAM,IAAI,kBAAkB,MAAM;AACxC,YAAI,KAAK,OAAO,OAAO,SAAS,YAAY,SAAS,KAAK,OAAO,OAAO,OAAO,GAAG,CAAC,MAAM,KAAM;AAC/F,cAAM,UAAU,YAAY,KAAK,OAAO,OAAO,KAAK,OAAO,GAAG;AAC9D,cAAM,UAAU,UAAU,OAAO,KAAK,SAAS,GAAG;AAClD,mBAAW,IAAI,QAAQ;AACvB,YAAI,KAAK,UAAU;AACjB,wBAAc,KAAK,iBAAiB,KAAK,WAAW,SAAS,OAAO,QAAQ,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,CAAC;AACzG;AAAA,MACF;AACA,YAAM,OAAO,KAAK;AAClB,UAAI,SAAS,mBAAoB;AACjC,UAAI,SAAS,aAAa,SAAS,qBAAqB;AACtD,mBAAW,OAAO,UAAW,WAAU,OAAO,KAAK,GAAG;AAAA,MACxD,OAAO;AACL,cAAM,IAAI;AAAA,UACR,6BAA6B,MAAM,IAAI;AAAA,UACvC;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,gBAAgB,aAAa,SAAS,gBAAgB,OAAO,aAAa,CAAC,CAAE,KAAK,IAAI,IAAI;AAChG,YAAM,QAAQ,MAAM,OAAO,EAAE,QAAQ,OAAO,cAAc,GAAG,EAAE,UAAU,KAAK,CAAC;AAC/E,sBAAgB;AAChB,YAAM,MAAM,MAAM,KAAK,IAAI,KAAK;AAChC,kBAAY,OAAO,KAAK,GAAG;AAC3B,UAAI,MAAM,QAAQ,SAAS,EAAG,YAAW,OAAO,KAAK,GAAG;AACxD,UAAI,IAAI,MAAM,mBAAoB,kBAAiB,OAAO,KAAK,GAAG;AAClE,yBAAmB,SAAS,OAAO,IAAI,QAAQ,MAAM,GAAG;AACxD;AACA,aAAO,MAAM,eAAe,IAAI;AAChC,UAAI,KAAK,UAAU;AACjB,sBAAc,KAAK,iBAAiB,KAAK,WAAW,SAAS,OAAO,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,CAAC;AAAA,IACnG,SAAS,OAAO;AACd,UAAI,kBAAkB,QAAW;AAC/B,cAAM,WAAW,MAAM,KAAK,IAAI,aAAa;AAC7C,YAAI,SAAU,WAAU,OAAO,UAAU,GAAG;AAAA,MAC9C;AACA,UAAI,KAAK,SAAS,sBAAsB,iBAAiB,eAAe,MAAM,SAAS,WAAW,YAAY;AAC5G;AACF,YAAM;AAAA,IACR;AAAA,EACF;AACA,MAAI,MAAM,aAAa,SAAS,IAAI;AACpC,MAAI,KAAK,UAAU,WAAW,EAAG,QAAO,YAAY,SAAS,IAAI;AACjE,SAAO,eAAe,eAAe,KAAK,WAAW,KAAK,GAAG,eAAe,SAAS,IAAI;AAC3F;AAEA,SAAS,qBAAqB,MAAkB,KAAiC;AAC/E,MAAI,KAAK,OAAQ,QAAO,aAAaC,eAAc,EAAE,GAAG,KAAK,QAAQ,MAAM,KAAK,QAAQ,KAAK,OAAO,KAAK,GAAG,GAAG,CAAC;AAChH,MAAI,CAAC,KAAK,OAAQ,QAAO,CAAC,CAAC,CAAC;AAC5B,QAAM,MAAM,IAAI,kBAAkB;AAClC,SAAO,KAAK,OAAO;AAAA,IAAI,CAAC,UACtB,MAAM,IAAI,CAAC,SAAS;AAClB,UAAI,KAAK,SAAS,YAAa,QAAO,IAAI,kBAAkB,KAAK,IAAI;AACrE,UAAI,KAAK,SAAS,UAAW,QAAO,KAAK;AACzC,UAAI,KAAK,SAAS,OAAQ,QAAO;AACjC,aAAO,SAAS,MAAM,GAAG;AAAA,IAC3B,CAAC;AAAA,EACH;AACF;AAaA,IAAM,kBAAkB,oBAAI,QAAoC;AAEhE,SAAS,cAAc,MAAkB,KAAqC;AAC5E,MAAI,KAAK,QAAQ,KAAK,UAAU,KAAK,UAAU,KAAK,UAAU,SAAS,KAAK,KAAK,SAAS,SAAU,QAAO;AAC3G,MAAI,KAAK,QAAQ,WAAW,EAAG,QAAO;AACtC,MAAI,OAAO,gBAAgB,IAAI,IAAI;AACnC,MAAI,CAAC,MAAM;AACT,UAAM,QAAQ,oBAAoB,MAAM,GAAG;AAC3C,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO;AACP,oBAAgB,IAAI,MAAM,IAAI;AAAA,EAChC;AACA,MAAI;AACJ,MAAI;AACF,YAAQ,IAAI,MAAM,iBAAiB,KAAK,SAAS;AAAA,EACnD,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,gBAAgB,EAAG,QAAO;AACrC,QAAM,SAAS,oBAAI,IAAsB;AACzC,aAAW,QAAQ,KAAK,MAAO,QAAO,IAAI,KAAK,KAAK,cAAc,KAAK,KAAK,GAAG,GAAG,KAAK,QAAQ,CAAC;AAChG,QAAM,OAAO,MAAM,OAAO,EAAE,OAAO,GAAG,EAAE,UAAU,MAAM,cAAc,KAAK,CAAC;AAC5E,MAAI,MAAM,aAAa,GAAG,IAAI;AAC9B,SAAO,YAAY,GAAG,IAAI;AAC5B;AAEA,SAAS,oBAAoB,MAAkB,KAA0C;AACvF,MAAI;AACJ,MAAI;AACF,YAAQ,IAAI,MAAM,SAAS,KAAK,KAAK;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,gBAAgB,EAAG,QAAO;AACrC,QAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,cAAc,KAAK,WAAW,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI;AAC7E,MAAI,MAAM,WAAW,YAAY,OAAQ,QAAO;AAChD,MAAI,YAAY,KAAK,CAAC,SAASD,aAAY,IAAI,CAAC,EAAG,QAAO;AAC1D,QAAM,QAA0B,CAAC;AACjC,aAAW,UAAU,MAAM,SAAS;AAClC,UAAM,MAAM,OAAO,aAAa,OAAO,KAAK,YAAY;AACxD,UAAM,gBAAgB,YAAY,UAAU,CAAC,SAAS,KAAK,YAAY,MAAM,GAAG;AAChF,QAAI,gBAAgB,GAAG;AACrB,UAAI,OAAO,YAAa,QAAO;AAC/B,YAAM,KAAK,EAAE,KAAK,UAAU,OAAO,UAAU,MAAM,MAAM,KAAK,CAAC;AAC/D;AAAA,IACF;AACA,UAAM,OAAO,MAAM,aAAa;AAChC,QAAI,CAAC,KAAM,QAAO;AAClB,QAAI,KAAK,SAAS,aAAa;AAC7B,YAAM,OAAO,KAAK;AAClB,YAAM,KAAK,EAAE,KAAK,UAAU,OAAO,UAAU,MAAM,CAAC,SAAS,KAAK,kBAAkB,IAAI,EAAE,CAAC;AAAA,IAC7F,WAAW,KAAK,SAAS,WAAW;AAClC,YAAM,QAAQ,KAAK;AACnB,YAAM,KAAK,EAAE,KAAK,UAAU,OAAO,UAAU,MAAM,MAAM,MAAM,CAAC;AAAA,IAClE,WAAW,KAAK,SAAS,QAAQ;AAC/B,YAAM,KAAK,EAAE,KAAK,UAAU,OAAO,UAAU,MAAM,MAAM,KAAK,CAAC;AAAA,IACjE,MAAO,QAAO;AAAA,EAChB;AACA,SAAO,EAAE,WAAW,KAAK,OAAO,MAAM;AACxC;AAEO,SAAS,cAAc,MAAkB,KAA8B;AAC5E,MAAI,IAAI,MAAM,eAAe,KAAK,KAAK,GAAG;AACxC,WAAO,qBAAqB,MAAM,GAAG;AAAA,EACvC;AACA,QAAM,QAAQ,IAAI,MAAM,iBAAiB,KAAK,KAAK;AACnD,QAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,QAAM,aAA8C,CAAC;AAErD,MAAI,KAAK,MAAM;AACb,UAAM,WAAW,SAAS,KAAK,MAAM,GAAG;AACxC,eAAW,OAAO,MAAM,KAAK,GAAG;AAC9B,YAAM,cAAc,SAAS,OAAO,KAAK,OAAO,GAAG;AACnD,UAAI,eAAgC;AACpC,iBAAW,WAAW,UAAU;AAC9B,cAAM,SAAmB;AAAA,UACvB,GAAG;AAAA,UACH,OAAO,CAAC,GAAG,YAAY,OAAO,GAAG,QAAQ,KAAK;AAAA,QAChD;AACA,YAAI,KAAK,SAAS,YAAY,SAAS,KAAK,OAAO,IAAI,kBAAkB,MAAM,CAAC,CAAC,MAAM,KAAM;AAC7F,uBAAe;AACf;AAAA,MACF;AACA,UAAI,aAAc,YAAW,KAAK,EAAE,KAAK,OAAO,aAAa,CAAC;AAAA,IAChE;AAAA,EACF,OAAO;AACL,UAAM,UACJ,KAAK,UAAU,OACX,OACA,oBAAoB,EAAE,MAAM,SAAS,QAAQ,MAAM,MAAM,KAAK,OAAO,OAAO,KAAK,MAAM,GAAG,KAAK,OAAO,GAAG;AAC/G,UAAM,WAAW,UAAU,QAAQ,OAAO,MAAM,KAAK;AACrD,eAAW,OAAO,UAAU;AAC1B,YAAM,QAAQ,SAAS,OAAO,KAAK,OAAO,GAAG;AAC7C,UAAI,KAAK,SAAS,YAAY,SAAS,KAAK,OAAO,IAAI,kBAAkB,KAAK,CAAC,CAAC,MAAM,KAAM;AAC5F,iBAAW,KAAK,EAAE,KAAK,MAAM,CAAC;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,gBAA8B,CAAC;AACrC,MAAI,UAAU;AACd,aAAW,EAAE,KAAK,MAAM,KAAK,YAAY;AACvC,UAAM,MAAM,IAAI,kBAAkB,KAAK;AACvC,UAAM,UAAU,YAAY,KAAK,KAAK,OAAO,GAAG;AAChD,UAAM,YAAY,aAAa,OAAO,KAAK,OAAO;AAClD,UAAM,iBAAiB,IAAI;AAAA,MACzB,CAAC,GAAG,QAAQ,KAAK,CAAC,EAAE,IAAI,CAAC,QAAQ;AAC/B,cAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,SAAS,oBAAoB,KAAK,IAAI,MAAM,GAAG;AAClF,eAAO,QAAQ,QAAQ;AAAA,MACzB,CAAC;AAAA,IACH;AACA,QAAI,mBAAmB,UAAU,OAAO,KAAK,WAAW,gBAAgB,GAAG,MAAM,SAAU;AAC3F,QAAI;AACF,YAAM,UAAU,UAAU,OAAO,KAAK,SAAS,GAAG;AAClD,yBAAmB,SAAS,OAAO,KAAK,QAAQ,IAAI,QAAQ,gBAAgB,GAAG;AAC/E,iBAAW,IAAI,QAAQ;AACvB,UAAI,KAAK,UAAU;AACjB,sBAAc,KAAK,iBAAiB,KAAK,WAAW,SAAS,OAAO,QAAQ,KAAK,OAAO,GAAG,GAAG,GAAG,CAAC;AAAA,IACtG,SAAS,OAAO;AACd,UAAI,KAAK,OAAO,YAAY,iBAAiB,eAAe,MAAM,SAAS,WAAW,YAAY,EAAG;AACrG,YAAM;AAAA,IACR;AAAA,EACF;AACA,MAAI,MAAM,aAAa,OAAO;AAC9B,SAAO,eAAe,eAAe,KAAK,WAAW,KAAK,GAAG,eAAe,SAAS,IAAI,MAAM,eAAe;AAChH;AAEO,SAAS,cAAc,MAAkB,KAA8B;AAC5E,MAAI,IAAI,MAAM,eAAe,KAAK,KAAK,GAAG;AACxC,WAAO,qBAAqB,MAAM,GAAG;AAAA,EACvC;AACA,QAAM,QAAQ,IAAI,MAAM,iBAAiB,KAAK,KAAK;AACnD,QAAM,iBACJ,KAAK,UAAU,OACX,OACA,oBAAoB,EAAE,MAAM,SAAS,QAAQ,MAAM,MAAM,KAAK,OAAO,OAAO,KAAK,MAAM,GAAG,KAAK,OAAO,GAAG;AAC/G,QAAM,WAAW,CAAC,GAAI,iBAAiB,eAAe,OAAO,MAAM,KAAK,CAAE,EAAE,OAAO,CAAC,QAAQ;AAC1F,QAAI,CAAC,KAAK,MAAO,QAAO;AACxB,WACE,YAAY,SAAS,KAAK,OAAO,IAAI,kBAAkB,SAAS,OAAO,KAAK,KAAK,SAAS,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,MAC5G;AAAA,EAEJ,CAAC;AACD,QAAM,gBAA8B,CAAC;AACrC,MAAI,UAAU;AACd,aAAW,OAAO,UAAU;AAC1B,QAAI,mBAAmB,UAAU,OAAO,KAAK,GAAG,MAAM,SAAU;AAChE,QAAI,KAAK,UAAU;AACjB,oBAAc,KAAK,iBAAiB,KAAK,WAAW,SAAS,OAAO,KAAK,KAAK,SAAS,KAAK,OAAO,GAAG,GAAG,GAAG,CAAC;AAC/G,eAAW,uBAAuB,OAAO,KAAK,GAAG;AACjD,cAAU,OAAO,KAAK,GAAG;AACzB,uBAAmB,SAAS,OAAO,KAAK,GAAG;AAC3C;AAAA,EACF;AACA,MAAI,MAAM,aAAa,OAAO;AAC9B,SAAO,eAAe,eAAe,KAAK,WAAW,KAAK,GAAG,eAAe,SAAS,IAAI,MAAM,eAAe;AAChH;AAEA,SAAS,aAAa,OAAc,KAAU,SAAuD;AACnG,QAAM,SAAS,oBAAI,IAAsB;AACzC,aAAW,UAAU,MAAM,SAAS;AAClC,UAAM,MAAM,oBAAoB,OAAO,IAAI;AAC3C,WAAO,IAAI,KAAK,QAAQ,IAAI,GAAG,IAAI,QAAQ,IAAI,GAAG,IAAM,IAAI,OAAO,IAAI,GAAG,KAAK,IAAK;AAAA,EACtF;AACA,SAAO;AACT;AAEA,SAAS,YACP,OACA,OACA,KACuB;AACvB,QAAM,UAAU,oBAAI,IAAsB;AAC1C,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,YAAM,SAAS,SAAS,OAAO,KAAK,QAAQ,CAAC,CAAE;AAC/C,UAAI,OAAO,UAAW,OAAM,IAAI,YAAY,mCAAmC,OAAO,IAAI,KAAK,QAAQ;AACvG,cAAQ,IAAI,oBAAoB,OAAO,IAAI,GAAG,iBAAiB,OAAO,QAAQ,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC;AACvG;AAAA,IACF;AACA,QAAI,KAAK,KAAK,SAAS,SAAS,KAAK,KAAK,OAAO,WAAW,KAAK,QAAQ,QAAQ;AAC/E,YAAM,IAAI;AAAA,QACR,GAAG,KAAK,QAAQ,MAAM,qBAAqB,KAAK,KAAK,SAAS,QAAQ,KAAK,KAAK,OAAO,SAAS,CAAC;AAAA,QACjG;AAAA,MACF;AAAA,IACF;AACA,SAAK,QAAQ,QAAQ,CAAC,MAAM,UAAU;AACpC,YAAM,SAAS,SAAS,OAAO,IAAI;AACnC,UAAI,OAAO,UAAW,OAAM,IAAI,YAAY,mCAAmC,OAAO,IAAI,KAAK,QAAQ;AACvG,cAAQ;AAAA,QACN,oBAAoB,OAAO,IAAI;AAAA,QAC/B,iBAAiB,OAAO,QAAQ,SAAS,KAAK,KAAK,SAAS,QAAQ,KAAK,KAAK,OAAO,KAAK,IAAK,KAAK,MAAM,GAAG,CAAC;AAAA,MAChH;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,UACP,OACA,KACA,SACA,KACgC;AAChC,QAAM,SAAS,EAAE,OAAO,IAAI,OAAO,QAAQ,IAAI,IAAI,IAAI,MAAM,EAAE;AAC/D,MAAI;AACJ,MAAI,eAAe;AACnB,gBAAc,OAAO,QAAQ,GAAG;AAChC,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,IAAI,MAAM;AACjC,eAAW,CAAC,MAAM,KAAK,KAAK,QAAS,QAAO,IAAI,MAAM,KAAK;AAC3D,eAAW,UAAU,MAAM,SAAS;AAClC,UAAI,CAAC,OAAO,WAAW,OAAQ;AAC/B,YAAM,SAAS,IAAI,kBAAkB;AAAA,QACnC,OAAO,MAAM,QACV,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAC1B,IAAI,CAAC,OAAO;AAAA,UACX,OAAO,MAAM;AAAA,UACb,MAAM,EAAE;AAAA,UACR,OAAO,OAAO,IAAI,oBAAoB,EAAE,IAAI,CAAC,KAAK;AAAA,UAClD,UAAU,EAAE;AAAA,UACZ,SAAS,EAAE;AAAA,QACb,EAAE;AAAA,MACN,CAAC;AACD,aAAO;AAAA,QACL,oBAAoB,OAAO,IAAI;AAAA,QAC/B,iBAAiB,OAAO,QAAQ,SAAS,OAAO,UAAU,MAAM,MAAM,CAAC;AAAA,MACzE;AAAA,IACF;AACA,YAAQ,MAAM,OAAO,IAAI,OAAO,MAAM;AACtC,QAAI,CAAC,MAAO,OAAM,IAAI,YAAY,gBAAgB,IAAI,KAAK,IAAI,OAAO;AACtE,gBAAY,OAAO,OAAO,GAAG;AAC7B,eAAW,OAAO,OAAO,GAAG;AAC5B,mBAAe;AACf,qBAAiB,OAAO,OAAO,GAAG;AAClC,UAAM,WAAW,uBAAuB,OAAO,QAAQ,OAAO,GAAG;AACjE,WAAO,EAAE,KAAK,OAAO,SAAS;AAAA,EAChC,SAAS,OAAO;AACd,QAAI,OAAO;AACT,UAAI,aAAc,eAAc,OAAO,OAAO,GAAG;AACjD,YAAM,OAAO,MAAM,KAAK;AAAA,IAC1B;AACA,UAAM,KAAK,IAAI,OAAO,OAAO,MAAM;AACnC,QAAI,MAAM,cAAc;AAAA,IAExB;AACA,eAAW,OAAO,QAAQ,GAAG;AAC7B,UAAM;AAAA,EACR;AACF;AAEA,SAAS,YAAY,OAAc,KAAU,KAAyB;AACpE;AAAA,IAAsB;AAAA,IAAO;AAAA,IAAK,CAAC,MAAM,cACvC,SAAS,MAAM,IAAI,kBAAkB,SAAS,OAAO,WAAW,MAAM,MAAM,GAAG,CAAC,CAAC;AAAA,EACnF;AACF;AAEA,SAAS,WAAW,OAAc,KAAU,KAAyB;AACnE,QAAM,KAAK,IAAI,MAAM,iBAAiB,KAAK;AAC3C,aAAW,QAAQ,MAAM,SAAS;AAChC,UAAM,QAAQ,GAAG,QAAQ,IAAI,KAAK,YAAY,CAAC;AAC/C,QAAI,CAAC,MAAO;AACZ,UAAM,QAAQ,GAAG,oBAAoB,KAAK;AAC1C,QACE,MAAM,SACN,YAAY,SAAS,MAAM,OAAO,IAAI,kBAAkB,SAAS,OAAO,KAAK,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM;AAErG;AACF,UAAM,MAAM,OAAO,YAAY,MAAM,SAAS,KAAK,KAAK,KAAK,GAAG,IAAI,OAAO,MAAM,MAAM;AAAA,EACzF;AACF;AAEA,SAAS,cAAc,OAAc,KAAU,KAAyB;AACtE,QAAM,KAAK,IAAI,MAAM,iBAAiB,KAAK;AAC3C,aAAW,QAAQ,MAAM,SAAS;AAChC,UAAM,QAAQ,GAAG,QAAQ,IAAI,KAAK,YAAY,CAAC;AAC/C,QAAI,CAAC,MAAO;AACZ,UAAM,QAAQ,GAAG,oBAAoB,KAAK;AAC1C,UAAM,MAAM,OAAO,YAAY,MAAM,SAAS,KAAK,KAAK,KAAK,GAAG,IAAI,KAAK;AAAA,EAC3E;AACF;AAEA,SAAS,UAAU,OAAc,KAAU,KAAyB;AAClE,gBAAc,OAAO,KAAK,GAAG;AAC7B,QAAM,OAAO,IAAI,KAAK;AACxB;AAEA,SAAS,gBAAgB,OAAc,QAA+B,KAA0B;AAC9F,SAAO,iBAAiB,OAAO,QAAQ,iBAAiB,OAAO,GAAG,GAAG,GAAG;AAC1E;AAEA,SAAS,wBACP,OACA,QACA,KACA,eACO;AACP,QAAM,aAAa,cAAc,IAAI,CAAC,SAAS,oBAAoB,IAAI,CAAC;AACxE,QAAM,eAAe,iBAAiB,OAAO,GAAG,EAAE,OAAO,CAAC,YAAY;AACpE,QAAI,QAAQ,WAAW,WAAW,OAAQ,QAAO;AACjD,UAAM,UAAU,QAAQ,IAAI,CAAC,WAAW,oBAAoB,OAAO,IAAI,CAAC;AACxE,WAAO,WAAW,MAAM,CAAC,QAAQ,QAAQ,SAAS,GAAG,CAAC;AAAA,EACxD,CAAC;AACD,MAAI,aAAa,WAAW,GAAG;AAE7B,QACE,WAAW,WAAW,MACrB,WAAW,CAAC,MAAM,WACjB,MAAM,QAAQ,KAAK,CAAC,WAAW,oBAAoB,OAAO,IAAI,MAAM,WAAW,CAAC,KAAK,OAAO,UAAU,IACxG;AACA,YAAM,SAAS,iBAAiB,OAAO,GAAG,EAAE;AAAA,QAC1C,CAAC,YACC,QAAQ,WAAW,MAClB,oBAAoB,QAAQ,CAAC,EAAG,IAAI,MAAM,WAAW,CAAC,KACrD,MAAM,QAAQ,KAAK,CAAC,WAAW,oBAAoB,OAAO,IAAI,MAAM,oBAAoB,QAAQ,CAAC,EAAG,IAAI,CAAC,GACrG;AAAA,MACV;AACA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,OAAO,SAAS,IAAI,SAAS,CAAC,CAAC,EAAE,MAAM,cAAc,CAAC,GAAI,SAAS,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,QACvF;AAAA,MACF;AAAA,IACF;AACA,WAAO,CAAC;AAAA,EACV;AACA,SAAO,iBAAiB,OAAO,QAAQ,cAAc,GAAG;AAC1D;AAEA,SAAS,mBACP,OACA,QACA,KACA,QACO;AACP,MAAI,CAAC,OAAO,cAAe,QAAO,gBAAgB,OAAO,QAAQ,GAAG;AACpE,QAAM,QAAQ,OAAO;AACrB,QAAM,UAAU,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ,KAAK;AACjE,MAAI,WAAW,OAAO;AACpB,UAAM,KAAK,IAAI,MAAM,iBAAiB,KAAK;AAC3C,eAAW,aAAa,MAAM,SAAS;AACrC,YAAM,QAAQ,GAAG,QAAQ,IAAI,UAAU,YAAY,CAAC;AACpD,UAAI,CAAC,OAAO,UAAU,MAAM,QAAQ,WAAW,MAAM,OAAQ;AAC7D,YAAM,UAAU,MAAM,QAAQ,MAAM,CAAC,QAAQ,MAAM;AACjD,cAAM,OAAO,MAAM,CAAC;AACpB,YAAI,OAAO,KAAM,QAAO,WAAW,OAAO,MAAM,IAAI;AACpD,eAAO,KAAK,SAAS,YAAY,KAAK,KAAK,YAAY,MAAM,OAAO,KAAK,YAAY;AAAA,MACvF,CAAC;AACD,UAAI,CAAC,QAAS;AACd,UAAI,OAAO,eAAe,MAAM,SAAS,CAAC,WAAW,OAAO,aAAa,MAAM,KAAK,EAAG;AACvF,aAAO,iBAAiB,OAAO,QAAQ,CAAC,MAAM,OAAO,GAAG,GAAG;AAAA,IAC7D;AAAA,EACF;AACA,SAAO,wBAAwB,OAAO,QAAQ,KAAK,OAAO,cAAc,OAAO,OAAO,CAAC;AACzF;AAEA,SAAS,iBAAiB,OAAc,KAAsC;AAC5E,QAAM,OAA0B,CAAC;AACjC,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,WAAW,CAAC,YAAmC;AACnD,UAAM,MAAM,QAAQ,IAAI,CAAC,WAAW,oBAAoB,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI;AAC/E,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AACZ,SAAK,KAAK,OAAO;AAAA,EACnB;AAEA,aAAW,aAAa,MAAM,SAAS;AACrC,UAAM,QAAQ,IAAI,MAAM,iBAAiB,KAAK,EAAE,QAAQ,IAAI,UAAU,YAAY,CAAC;AACnF,QAAI,OAAO,OAAQ,UAAS,MAAM,OAAO;AAAA,EAC3C;AAGA,QAAM,KAAK,MAAM,gBAAgB;AACjC,MAAI,GAAI,UAAS,CAAC,EAAE,MAAM,GAAG,MAAM,SAAS,GAAG,SAAS,OAAO,KAAK,CAAC,CAAC;AAGtE,QAAM,kBAAkB,MAAM,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,aAAa;AAChG,aAAW,UAAU,MAAM,SAAS;AAClC,QAAI,OAAO,UAAW,OAAO,cAAc,CAAC,iBAAkB;AAC5D,eAAS,CAAC,EAAE,MAAM,OAAO,MAAM,SAAS,OAAO,SAAS,OAAO,KAAK,CAAC,CAAC;AAAA,IACxE;AAAA,EACF;AACA,aAAW,cAAc,MAAM,aAAa;AAC1C,QAAI,WAAW,SAAS,YAAY,WAAW,SAAS,cAAe,UAAS,WAAW,OAAO;AAAA,EACpG;AACA,SAAO;AACT;AAEA,SAAS,iBACP,OACA,QACA,MACA,KACO;AACP,QAAM,QAAe,CAAC;AACtB,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,OAAO,CAAC,QAAmB;AAC/B,UAAM,MAAM,OAAO,IAAI,KAAK;AAC5B,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AACZ,UAAM,KAAK,GAAG;AAAA,EAChB;AAEA,QAAM,KAAK,IAAI,MAAM,iBAAiB,KAAK;AAC3C,aAAW,WAAW,MAAM;AAC1B,UAAM,UAAU,mBAAmB,SAAS,QAAQ,OAAO,GAAG;AAC9D,QAAI,QAAQ,KAAK,CAAC,UAAU,UAAU,IAAI,EAAG;AAG7C,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,KAAK,MAAM,gBAAgB;AACjC,UAAI,MAAM,oBAAoB,QAAQ,CAAC,EAAG,IAAI,MAAM,oBAAoB,GAAG,IAAI,GAAG;AAChF,cAAM,MAAM,MAAM,SAAS,QAAQ,CAAC,CAAE;AACtC,YAAI,IAAK,MAAK,GAAG;AACjB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,YAAY;AAChB,eAAW,aAAa,MAAM,SAAS;AACrC,YAAM,QAAQ,GAAG,QAAQ,IAAI,UAAU,YAAY,CAAC;AACpD,UAAI,CAAC,OAAO,OAAQ;AACpB,UAAI,MAAM,QAAQ,WAAW,QAAQ,OAAQ;AAC7C,UACE,CAAC,MAAM,QAAQ,MAAM,CAAC,QAAQ,MAAM,oBAAoB,OAAO,IAAI,MAAM,oBAAoB,QAAQ,CAAC,EAAG,IAAI,CAAC,GAC9G;AACA;AAAA,MACF;AACA,kBAAY;AACZ,UAAI,MAAM,SAAS,CAAC,kBAAkB,MAAM,OAAO,QAAQ,OAAO,GAAG,EAAG;AACxE,iBAAW,SAAS,MAAM,MAAM,OAAO,OAAO,GAAG;AAC/C,cAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,YAAI,IAAK,MAAK,GAAG;AAAA,MACnB;AACA;AAAA,IACF;AACA,QAAI,UAAW;AAGf,eAAW,OAAO,MAAM,KAAK,GAAG;AAC9B,YAAM,WAAW,YAAY,SAAS,KAAK,KAAK,KAAK;AACrD,UAAI,QAAQ,MAAM,CAAC,OAAO,UAAU,WAAW,OAAO,SAAS,KAAK,KAAK,IAAI,MAAM,CAAC,EAAG,MAAK,GAAG;AAAA,IACjG;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,SAA0B,KAAU,KAAoB,OAA2B;AACtG,MAAI,CAAC,OAAO,CAAC,OAAO;AAClB,WAAO,QAAQ;AAAA,MAAI,CAAC,WAClB,sBAAsB,IAAI,OAAO,IAAI,oBAAoB,OAAO,IAAI,CAAC,KAAK,MAAM,OAAO,WAAW,QAAQ;AAAA,IAC5G;AAAA,EACF;AACA,QAAM,MAAM,IAAI,kBAAkB,SAAS,OAAO,KAAK,MAAM,MAAM,GAAG,CAAC;AACvE,SAAO,QAAQ,IAAI,CAAC,WAAW;AAC7B,UAAM,MAAM,OAAO,OAAO,SAAS,OAAO,MAAM,GAAG,IAAK,IAAI,OAAO,IAAI,oBAAoB,OAAO,IAAI,CAAC,KAAK;AAC5G,WAAO,sBAAsB,KAAK,OAAO,WAAW,QAAQ;AAAA,EAC9D,CAAC;AACH;AAEA,SAAS,mBACP,SACA,QACA,OACA,KACY;AACZ,QAAM,OAAY,EAAE,OAAO,GAAG,OAAO;AACrC,SAAO,YAAY,SAAS,MAAM,KAAK,KAAK;AAC9C;AAEA,SAAS,kBAAkB,OAAa,QAA+B,OAAc,KAA4B;AAC/G,QAAM,OAAY,EAAE,OAAO,GAAG,OAAO;AACrC,SAAO,YAAY,SAAS,OAAO,IAAI,kBAAkB,SAAS,OAAO,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM;AACzG;AAEA,SAAS,iBAAiB,OAAc,KAAU,KAAyB;AACzE,MAAI,CAAC,IAAI,MAAM,mBAAoB;AACnC,aAAW,cAAc,MAAM,aAAa;AAC1C,QAAI,WAAW,SAAS,cAAe;AACvC,QAAI,aAAa,YAAY,GAAG,EAAG;AACnC,8BAA0B,KAAK,YAAY,GAAG;AAAA,EAChD;AACF;AAEA,SAAS,aACP,YACA,KACS;AACT,SAAO,IAAI,aAAa,iBAAiB,WAAW;AACtD;AAEA,SAAS,0BACP,KACA,YACA,KACM;AACN,QAAM,SAAS,WAAW,QAAQ,IAAI,CAAC,SAAS,IAAI,OAAO,IAAI,oBAAoB,IAAI,CAAC,KAAK,IAAI;AACjG,MAAI,OAAO,KAAK,CAAC,UAAU,UAAU,IAAI,EAAG;AAC5C,QAAM,SAAS,IAAI,MAAM,SAAS,WAAW,QAAQ;AACrD,QAAM,gBACJ,WAAW,cAAc,OAAO,QAAQ,OAAO,CAAC,WAAW,OAAO,UAAU,EAAE,IAAI,CAAC,WAAW,OAAO,IAAI;AAC3G,MACE,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,EAAE;AAAA,IAAK,CAAC,cACxB,OAAO,MAAM,CAAC,OAAO,UAAU;AAC7B,YAAM,eAAe,cAAc,KAAK;AACxC,aACE,iBAAiB,UACjB,WAAW,OAAO,UAAU,OAAO,IAAI,oBAAoB,YAAY,CAAC,KAAK,IAAI,MAAM;AAAA,IAE3F,CAAC;AAAA,EACH,GACA;AACA,UAAM,IAAI,YAAY,iCAAiC,sBAAsB,8BAA8B;AAAA,EAC7G;AACF;AAEO,SAAS,yBAAyB,KAAyB;AAChE,MAAI,CAAC,IAAI,MAAM,mBAAoB;AACnC,aAAW,SAAS,IAAI,MAAM,OAAO,OAAO,GAAG;AAC7C,eAAW,cAAc,MAAM,aAAa;AAC1C,UAAI,WAAW,SAAS,iBAAiB,CAAC,WAAW,kBAAmB;AACxE,iBAAW,OAAO,MAAM,KAAK,EAAG,2BAA0B,KAAK,YAAY,GAAG;AAAA,IAChF;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,QAAe,KAAU,KAA2B;AAClF,MAAI,CAAC,IAAI,MAAM,mBAAoB,QAAO;AAC1C,MAAI,UAAU;AACd,QAAM,WAAW,OAAO,QAAQ,OAAO,CAAC,WAAW,OAAO,UAAU,EAAE,IAAI,CAAC,WAAW,OAAO,IAAI;AACjG,aAAW,SAAS,IAAI,MAAM,OAAO,OAAO,GAAG;AAC7C,eAAW,cAAc,MAAM,aAAa;AAC1C,UAAI,WAAW,SAAS,iBAAiB,WAAW,SAAS,YAAY,MAAM,OAAO,KAAK,YAAY;AACrG;AACF,YAAM,aAAa,WAAW,cAAc;AAC5C,YAAM,UAAU,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE;AAAA,QAChC,CAAC,cACC,EAAE,UAAU,UAAU,UAAU,UAAU,IAAI,UAC9C,kBAAkB,WAAW,SAAS,WAAW,YAAY,GAAG;AAAA,MACpE;AACA,iBAAW,aAAa,SAAS;AAC/B,YAAI,WAAW,aAAa,WAAW;AACrC,qBAAW,uBAAuB,OAAO,WAAW,GAAG;AACvD,oBAAU,OAAO,WAAW,GAAG;AAC/B;AAAA,QACF,WAAW,WAAW,aAAa,YAAY;AAC7C,gBAAM,UAAU;AAAA,YACd;AAAA,YACA;AAAA,YACA,IAAI,IAAI,WAAW,QAAQ,IAAI,CAAC,SAAS,CAAC,oBAAoB,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,YAC3E;AAAA,UACF;AACA,qBAAW,IAAI,QAAQ;AAAA,QACzB,WAAW,WAAW,aAAa,eAAe;AAChD,gBAAM,UAAU,UAAU,OAAO,WAAW,eAAe,OAAO,WAAW,SAAS,GAAG,GAAG,GAAG;AAC/F,qBAAW,IAAI,QAAQ;AAAA,QACzB,WAAW,CAAC,aAAa,YAAY,GAAG,GAAG;AACzC,gBAAM,IAAI,YAAY,iCAAiC,sBAAsB,8BAA8B;AAAA,QAC7G;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,QAAe,QAAa,OAAY,KAA2B;AACjG,MAAI,CAAC,IAAI,MAAM,mBAAoB,QAAO;AAC1C,MAAI,UAAU;AACd,QAAM,WAAW,OAAO,QAAQ,OAAO,CAAC,WAAW,OAAO,UAAU,EAAE,IAAI,CAAC,WAAW,OAAO,IAAI;AACjG,aAAW,SAAS,IAAI,MAAM,OAAO,OAAO,GAAG;AAC7C,eAAW,cAAc,MAAM,aAAa;AAC1C,UAAI,WAAW,SAAS,iBAAiB,WAAW,SAAS,YAAY,MAAM,OAAO,KAAK,YAAY;AACrG;AACF,YAAM,aAAa,WAAW,cAAc;AAC5C,YAAM,YAAY,WAAW,IAAI,CAAC,SAAS,OAAO,OAAO,IAAI,oBAAoB,IAAI,CAAC,KAAK,IAAI;AAC/F,YAAM,YAAY,WAAW,IAAI,CAAC,SAAS,MAAM,OAAO,IAAI,oBAAoB,IAAI,CAAC,KAAK,IAAI;AAC9F,UAAI,UAAU,MAAM,CAAC,OAAO,UAAU,WAAW,OAAO,UAAU,KAAK,KAAK,IAAI,MAAM,CAAC,EAAG;AAE1F,YAAM,UAAU,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE;AAAA,QAAO,CAAC,cACxC,kBAAkB,WAAW,SAAS,WAAW,YAAY,MAAM;AAAA,MACrE;AACA,iBAAW,aAAa,SAAS;AAC/B,YAAI,WAAW,aAAa,WAAW;AACrC,gBAAM,UAAU;AAAA,YACd;AAAA,YACA;AAAA,YACA,IAAI,IAAI,WAAW,QAAQ,IAAI,CAAC,MAAM,UAAU,CAAC,oBAAoB,IAAI,GAAG,UAAU,KAAK,KAAK,IAAI,CAAC,CAAC;AAAA,YACtG;AAAA,UACF;AACA,qBAAW,IAAI,QAAQ;AAAA,QACzB,WAAW,WAAW,aAAa,YAAY;AAC7C,gBAAM,UAAU;AAAA,YACd;AAAA,YACA;AAAA,YACA,IAAI,IAAI,WAAW,QAAQ,IAAI,CAAC,SAAS,CAAC,oBAAoB,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,YAC3E;AAAA,UACF;AACA,qBAAW,IAAI,QAAQ;AAAA,QACzB,WAAW,WAAW,aAAa,eAAe;AAChD,gBAAM,UAAU,UAAU,OAAO,WAAW,eAAe,OAAO,WAAW,SAAS,GAAG,GAAG,GAAG;AAC/F,qBAAW,IAAI,QAAQ;AAAA,QACzB,WAAW,CAAC,aAAa,YAAY,GAAG,GAAG;AACzC,gBAAM,IAAI,YAAY,iCAAiC,sBAAsB,8BAA8B;AAAA,QAC7G;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,cAAwB,OAAY,eAAyB,QAAsB;AAC5G,QAAM,cAAc,aAAa,IAAI,CAAC,SAAS,MAAM,OAAO,IAAI,oBAAoB,IAAI,CAAC,KAAK,IAAI;AAClG,MAAI,YAAY,KAAK,CAAC,UAAU,UAAU,IAAI,EAAG,QAAO;AACxD,SAAO,YAAY,MAAM,CAAC,OAAO,UAAU;AACzC,UAAM,eAAe,cAAc,KAAK;AACxC,WACE,iBAAiB,UACjB,WAAW,OAAO,OAAO,OAAO,IAAI,oBAAoB,YAAY,CAAC,KAAK,IAAI,MAAM;AAAA,EAExF,CAAC;AACH;AAEA,SAAS,eAAe,OAAc,SAAmB,KAA0C;AACjG,SAAO,IAAI;AAAA,IACT,QAAQ,IAAI,CAAC,SAAS;AACpB,YAAM,SAAS,SAAS,OAAO,IAAI;AACnC,YAAM,QAAQ,OAAO,cAAc,SAAS,OAAO,aAAa,IAAI,kBAAkB,CAAC,IAAI;AAC3F,aAAO,CAAC,oBAAoB,OAAO,IAAI,GAAG,KAAK;AAAA,IACjD,CAAC;AAAA,EACH;AACF;AAEA,SAAS,SAAS,OAAc,KAAU,OAAe,KAA8B;AACrF,QAAM,iBAAiB,MAAM,eACzB,SACA,MAAM,QAAQ,KAAK,CAAC,WAAW,OAAO,cAAc,OAAO,UAAU,KAAK,EAAE,YAAY,MAAM,SAAS,GAAG;AAC9G,QAAM,YAAY,MAAM,QACrB,OAAO,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,UAAU,MAAM,EAChD,IAAI,CAAC,YAAY;AAAA,IAChB,OAAO;AAAA,IACP,MAAM,OAAO;AAAA,IACb,OAAO,IAAI,OAAO,IAAI,oBAAoB,OAAO,IAAI,CAAC,KAAK;AAAA,IAC3D,UAAU,OAAO;AAAA,IACjB,SAAS,OAAO;AAAA,EAClB,EAAE;AACJ,QAAM,QAAQ,CAAC,GAAG,SAAS;AAC3B,MAAI,KAAK;AACP,eAAW,UAAU,MAAM,SAAS;AAClC,UAAI,CAAC,OAAO,aAAa,OAAO,UAAU,OAAQ;AAClD,YAAM,MAAM,IAAI,kBAAkB,EAAE,OAAO,WAAW,aAAa,MAAM,KAAK,CAAC;AAC/E,YAAM,QAAQ,cAAc,SAAS,OAAO,UAAU,MAAM,GAAG,GAAG,OAAO,QAAQ;AACjF,YAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP,MAAM,OAAO;AAAA,QACb;AAAA,QACA,UAAU,OAAO;AAAA,QACjB,SAAS,OAAO;AAAA,MAClB,CAAC;AAAA,IACH;AAEA,UAAM,KAAK,CAAC,GAAG,MAAM;AACnB,YAAM,KAAK,MAAM,QAAQ,UAAU,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,EAAE,KAAK,YAAY,CAAC;AACvF,YAAM,KAAK,MAAM,QAAQ,UAAU,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,EAAE,KAAK,YAAY,CAAC;AACvF,aAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH,OAAO;AACL,eAAW,UAAU,MAAM,SAAS;AAClC,UAAI,CAAC,OAAO,aAAa,OAAO,UAAU,OAAQ;AAClD,YAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP,MAAM,OAAO;AAAA,QACb,OAAO;AAAA,QACP,UAAU,OAAO;AAAA,QACjB,SAAS,OAAO;AAAA,MAClB,CAAC;AAAA,IACH;AACA,UAAM,KAAK,CAAC,GAAG,MAAM;AACnB,YAAM,KAAK,MAAM,QAAQ,UAAU,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,EAAE,KAAK,YAAY,CAAC;AACvF,YAAM,KAAK,MAAM,QAAQ,UAAU,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,EAAE,KAAK,YAAY,CAAC;AACvF,aAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL,GAAI,MAAM,eAAe,CAAC,IAAI,EAAE,OAAO,IAAI,MAAM;AAAA,IACjD,WAAW,mBAAmB,MAAM,eAAe,SAAY;AAAA,IAC/D,aAAa,MAAM;AAAA,IACnB;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,SAAyB,OAAiB,KAA+B;AACjG,QAAM,SAAqB,CAAC;AAC5B,QAAM,MAAM,IAAI,kBAAkB,KAAK;AACvC,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,SAAS,QAAQ;AAC1B,iBAAW,QAAQ,MAAM;AACvB,YAAI,OAAO,UAAU,QAAQ,KAAK,OAAO,YAAY,MAAM,OAAO,MAAM,YAAY,EAAG,QAAO,KAAK,KAAK,KAAK;AAAA,IACjH,MAAO,QAAO,KAAK,SAAS,OAAO,MAAM,GAAG,CAAC;AAAA,EAC/C;AACA,SAAO;AACT;AAEA,SAAS,eAAe,SAAyB,OAAwB;AACvE,SAAO,QAAQ;AAAA,IAAQ,CAAC,WACtB,OAAO,SAAS,SACZ,MAAM,QAAQ,IAAI,CAAC,SAAS,KAAK,IAAI,IACrC,CAAC,OAAO,UAAU,OAAO,KAAK,SAAS,WAAW,OAAO,KAAK,OAAO,OAAO,KAAK,KAAK;AAAA,EAC5F;AACF;AAEA,SAAS,SAAS,OAAc,MAAc;AAC5C,QAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,SAAS,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,CAAC;AAC1F,MAAI,CAAC,OAAQ,OAAM,IAAI,YAAY,mBAAmB,IAAI,IAAI,gBAAgB;AAC9E,SAAO;AACT;AAEA,SAASA,aAAY,MAAuB;AAC1C,QAAM,MAAM,KAAK,YAAY;AAC7B,SAAO,QAAQ,WAAW,QAAQ,aAAa,QAAQ;AACzD;AAEA,SAAS,YAAY,OAAyB,KAAc,OAAyB;AACnF,SAAO;AAAA,IACL,OAAO,IAAI;AAAA,IACX,WAAW;AAAA,IACX,aAAa,MAAM;AAAA,IACnB,OAAO,MAAM,QAAQ,IAAI,CAAC,YAAY;AAAA,MACpC,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,IAAI,OAAO,IAAI,OAAO,YAAY,CAAC,KAAK;AAAA,IACjD,EAAE;AAAA,EACJ;AACF;AAEA,SAAS,qBAAqB,MAAkB,KAA8B;AAC5E,QAAM,MAAM,IAAI,MAAM,mBAAmB,KAAK,KAAK;AACnD,MAAI,IAAI,SAAS,SAAS;AACxB,UAAME,eAAc,KAAK,WAAW,IAAI;AACxC,UAAMC,cAAa,KAAK,SACpB,KAAK,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,SAAS,SAAS,MAAM,IAAI,kBAAkB,CAAC,CAAC,CAAC,IACvF,KAAK,SACH,aAAaF,eAAc,EAAE,GAAG,KAAK,QAAQ,MAAM,KAAK,QAAQ,KAAK,OAAO,KAAK,GAAG,GAAG,CAAC,IACxF,CAAC,CAAC,CAAC;AACT,QAAIG,WAAU;AACd,QAAI,OAAO,IAAI,MAAM;AACrB,eAAW,UAAUD,aAAY;AAC/B,YAAM,SAAS,oBAAI,IAAsB;AACzC,eAAS,IAAI,GAAG,IAAID,aAAY,QAAQ,KAAK;AAC3C,eAAO,IAAIA,aAAY,CAAC,EAAG,YAAY,GAAG,OAAO,CAAC,KAAK,IAAI;AAAA,MAC7D;AACA,aAAO,IAAI,OAAO,MAAM;AACxB,MAAAE;AAAA,IACF;AACA,QAAI,MAAM,aAAaA,UAAS,IAAI;AACpC,WAAO,eAAe,CAAC,GAAG,CAAC,GAAGA,UAAS,IAAI;AAAA,EAC7C;AACA,MAAI,IAAI,SAAS,UAAU,IAAI,SAAS,UAAU,IAAI,SAAS,QAAQ;AACrE,UAAM,IAAI,YAAY,SAAS,KAAK,KAAK,wBAAwB,QAAQ;AAAA,EAC3E;AACA,QAAM,QAAQ;AACd,QAAM,cAAc,KAAK,WAAW,MAAM;AAC1C,aAAW,QAAQ,aAAa;AAC9B,UAAM,QAAQ,KAAK,YAAY;AAC/B,QAAI,UAAU,MAAM,KAAK,YAAY,EAAG;AACxC,QAAI,UAAU,WAAW,UAAU,aAAa,UAAU,MAAO;AACjE,QAAI,CAAC,MAAM,QAAQ,KAAK,CAAC,WAAW,OAAO,YAAY,MAAM,KAAK,GAAG;AACnE,YAAM,IAAI,YAAY,SAAS,MAAM,IAAI,wBAAwB,IAAI,IAAI,gBAAgB;AAAA,IAC3F;AAAA,EACF;AACA,QAAM,aAAa,KAAK,SACpB,KAAK,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,SAAS,SAAS,MAAM,IAAI,kBAAkB,CAAC,CAAC,CAAC,IACvF,KAAK,SACH,aAAaH,eAAc,EAAE,GAAG,KAAK,QAAQ,MAAM,KAAK,QAAQ,KAAK,OAAO,KAAK,GAAG,GAAG,CAAC,IACxF,CAAC,CAAC,CAAC;AACT,QAAM,EAAE,SAAS,gBAAgB,IAAI,iBAAiB,OAAO,aAAa,YAAY,GAAG;AACzF,MAAI,MAAM,aAAa,SAAS,eAAe;AAC/C,SAAO,eAAe,CAAC,GAAG,CAAC,GAAG,SAAS,eAAe;AACxD;AAEA,SAAS,qBAAqB,MAAkB,KAA8B;AAC5E,MAAI,KAAK,KAAM,OAAM,IAAI,YAAY,gCAAgC,aAAa;AAClF,QAAM,MAAM,IAAI,MAAM,mBAAmB,KAAK,KAAK;AACnD,MAAI,IAAI,SAAS,SAAS;AACxB,UAAMI,SAAQ,KAAK,SAAS,KAAK;AACjC,UAAMC,cAAa,IAAI,KAAK,EAAE,OAAO,CAAC,QAAQ;AAC5C,UAAI,CAAC,KAAK,MAAO,QAAO;AACxB,YAAM,QAAkB;AAAA,QACtB,OAAO,IAAI;AAAA,QACX,WAAW;AAAA,QACX,aAAa,IAAI;AAAA,QACjB,OAAO,IAAI,QAAQ,IAAI,CAAC,YAAY;AAAA,UAClC,OAAOD;AAAA,UACP,MAAM;AAAA,UACN,OAAO,IAAI,OAAO,IAAI,OAAO,YAAY,CAAC,KAAK;AAAA,QACjD,EAAE;AAAA,MACJ;AACA,aAAO,YAAY,SAAS,KAAK,OAAO,IAAI,kBAAkB,KAAK,CAAC,CAAC,MAAM;AAAA,IAC7E,CAAC;AACD,QAAID,WAAU;AACd,eAAW,OAAOE,aAAY;AAC5B,YAAM,UAAU,oBAAI,IAAsB;AAC1C,YAAM,QAAkB;AAAA,QACtB,OAAO,IAAI;AAAA,QACX,OAAO,IAAI,QAAQ,IAAI,CAAC,YAAY;AAAA,UAClC,OAAOD;AAAA,UACP,MAAM;AAAA,UACN,OAAO,IAAI,OAAO,IAAI,OAAO,YAAY,CAAC,KAAK;AAAA,QACjD,EAAE;AAAA,MACJ;AACA,iBAAW,QAAQ,KAAK,KAAK;AAC3B,YAAI,KAAK,QAAQ,WAAW;AAC1B,gBAAM,IAAI,YAAY,uDAAuD,aAAa;AAC5F,gBAAQ,IAAI,KAAK,QAAQ,CAAC,EAAG,YAAY,GAAG,SAAS,KAAK,MAAM,IAAI,kBAAkB,KAAK,CAAC,CAAC;AAAA,MAC/F;AACA,UAAI,OAAO,IAAI,OAAO,OAAO;AAC7B,MAAAD;AAAA,IACF;AACA,QAAI,MAAM,aAAaA,QAAO;AAC9B,WAAO,eAAe,CAAC,GAAG,CAAC,GAAGA,UAAS,IAAI,MAAM,eAAe;AAAA,EAClE;AACA,MAAI,IAAI,SAAS,UAAU,IAAI,SAAS,UAAU,IAAI,SAAS,QAAQ;AACrE,UAAM,IAAI,YAAY,SAAS,KAAK,KAAK,wBAAwB,QAAQ;AAAA,EAC3E;AACA,QAAM,QAAQ;AACd,QAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,QAAM,aAAsB,CAAC;AAC7B,aAAW,OAAO,MAAM,KAAK,GAAG;AAC9B,UAAM,QAAQ,YAAY,OAAO,KAAK,KAAK;AAC3C,QAAI,KAAK,SAAS,YAAY,SAAS,KAAK,OAAO,IAAI,kBAAkB,KAAK,CAAC,CAAC,MAAM,KAAM;AAC5F,eAAW,KAAK,IAAI,KAAK;AAAA,EAC3B;AACA,MAAI,UAAU;AACd,aAAW,SAAS,YAAY;AAC9B,UAAM,MAAM,MAAM,KAAK,IAAI,KAAK;AAChC,UAAM,QAAQ,YAAY,OAAO,KAAK,KAAK;AAC3C,UAAM,UAAU,eAAe,KAAK,KAAK,OAAO,IAAI,kBAAkB,KAAK,CAAC;AAC5E,qBAAiB,OAAO,SAAS,CAAC,KAAK,CAAC;AACxC;AAAA,EACF;AACA,MAAI,MAAM,aAAa,OAAO;AAC9B,SAAO,eAAe,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,MAAM,eAAe;AAClE;AAEA,SAAS,qBAAqB,MAAkB,KAA8B;AAC5E,QAAM,MAAM,IAAI,MAAM,mBAAmB,KAAK,KAAK;AACnD,MAAI,IAAI,SAAS,SAAS;AACxB,UAAMC,SAAQ,KAAK,SAAS,KAAK;AACjC,UAAME,YAAW,IAAI,KAAK,EAAE,OAAO,CAAC,QAAQ;AAC1C,UAAI,CAAC,KAAK,MAAO,QAAO;AACxB,YAAM,QAAkB;AAAA,QACtB,OAAO,IAAI;AAAA,QACX,OAAO,IAAI,QAAQ,IAAI,CAAC,YAAY;AAAA,UAClC,OAAOF;AAAA,UACP,MAAM;AAAA,UACN,OAAO,IAAI,OAAO,IAAI,OAAO,YAAY,CAAC,KAAK;AAAA,QACjD,EAAE;AAAA,MACJ;AACA,aAAO,YAAY,SAAS,KAAK,OAAO,IAAI,kBAAkB,KAAK,CAAC,CAAC,MAAM;AAAA,IAC7E,CAAC;AACD,QAAID,WAAU;AACd,eAAW,OAAOG,WAAU;AAC1B,UAAI,OAAO,IAAI,KAAK;AACpB,MAAAH;AAAA,IACF;AACA,QAAI,MAAM,aAAaA,QAAO;AAC9B,WAAO,eAAe,CAAC,GAAG,CAAC,GAAGA,UAAS,IAAI,MAAM,eAAe;AAAA,EAClE;AACA,MAAI,IAAI,SAAS,UAAU,IAAI,SAAS,UAAU,IAAI,SAAS,QAAQ;AACrE,UAAM,IAAI,YAAY,SAAS,KAAK,KAAK,wBAAwB,QAAQ;AAAA,EAC3E;AACA,QAAM,QAAQ;AACd,QAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,QAAM,WAAW,MAAM,KAAK,EAAE,OAAO,CAAC,QAAQ;AAC5C,QAAI,CAAC,KAAK,MAAO,QAAO;AACxB,WAAO,YAAY,SAAS,KAAK,OAAO,IAAI,kBAAkB,YAAY,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM;AAAA,EACtG,CAAC;AACD,QAAM,UAAU;AAAA,IACd;AAAA,IACA,SAAS,IAAI,CAAC,QAAQ,IAAI,KAAK;AAAA,EACjC;AACA,MAAI,MAAM,aAAa,OAAO;AAC9B,SAAO,eAAe,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,MAAM,eAAe;AAClE;AAEA,SAAS,eACP,OACA,OACA,KACuB;AACvB,QAAM,UAAU,oBAAI,IAAsB;AAC1C,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,QAAQ,WAAW;AAC1B,YAAM,IAAI,YAAY,uDAAuD,aAAa;AAC5F,UAAM,OAAO,KAAK,QAAQ,CAAC;AAC3B,QAAI,CAAC,MAAM,QAAQ,KAAK,CAAC,WAAW,OAAO,YAAY,MAAM,KAAK,YAAY,CAAC,GAAG;AAChF,YAAM,IAAI,YAAY,mBAAmB,IAAI,IAAI,gBAAgB;AAAA,IACnE;AACA,YAAQ,IAAI,oBAAoB,IAAI,GAAG,SAAS,KAAK,MAAM,GAAG,CAAC;AAAA,EACjE;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAoC;AAC3D,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,YAAY,OAAO,cAAc,KAAK,EAAG,QAAO;AACrE,QAAM,IAAI,YAAY,qBAAqB,qBAAqB,iBAAiB;AACnF;;;AC9lCO,SAAS,cAAc,MAAc,MAAmB,KAA8B;AAC3F,QAAM,MAAM,KAAK,YAAY;AAG7B,MAAI,QAAQ,kBAAkB,SAAS,MAAM;AAC3C,UAAM,QAAQ,mBAAmB,MAAM,GAAG;AAC1C,QAAI,CAAC,IAAI,aAAa,cAAe,KAAI,MAAM,qBAAqB,mBAAmB,KAAK;AAC5F,WAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AAAA,EACjD;AACA,OAAK,QAAQ,kBAAkB,QAAQ,qBAAqB,SAAS,MAAM;AACzE,UAAM,QAAQ,mBAAmB,MAAM,GAAG;AAC1C,UAAMI,OAAM,gBAAgB,KAAK;AACjC,QAAI,QAAQ,eAAgB,KAAI,MAAM,cAAcA;AAAA,QAC/C,KAAI,MAAM,gBAAgBA;AAC/B,WAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AAAA,EACjD;AAEA,QAAM,OAAO,eAAe,MAAM,GAAG;AACrC,QAAM,SAAS,YAAY,KAAK,MAAM,GAAG;AACzC,MAAI,OAAO,QAAQ,WAAW,KAAK,OAAO,KAAK,WAAW,GAAG;AAC3D,WAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AAAA,EACjD;AACA,SAAO,eAAe,OAAO,SAAS,OAAO,MAAM,GAAG,IAAI,MAAM,eAAe;AACjF;;;ACfO,SAAS,iBAAiB,MAAiB,KAA8B;AAC9E,MAAI,eAAeC;AACnB,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAOA,eAAc,MAAM,GAAG;AAAA,IAChC,KAAK;AACH,aAAO,cAAc,MAAM,GAAG;AAAA,IAChC,KAAK;AACH,aAAO,cAAc,MAAM,GAAG;AAAA,IAChC,KAAK;AACH,aAAO,cAAc,MAAM,GAAG;AAAA,IAChC,KAAK;AACH,aAAO,mBAAmB,MAAM,GAAG;AAAA,IACrC,KAAK;AACH,aAAO,iBAAiB,MAAM,GAAG;AAAA,IACnC,KAAK;AACH,aAAO,kBAAkB,MAAM,GAAG;AAAA,IACpC,KAAK;AACH,aAAO,mBAAmB,MAAM,GAAG;AAAA,IACrC,KAAK;AACH,aAAO,iBAAiB,MAAM,GAAG;AAAA,IACnC,KAAK;AACH,aAAO,kBAAkB,MAAM,GAAG;AAAA,IACpC,KAAK;AACH,aAAO,gBAAgB,MAAM,GAAG;AAAA,IAClC,KAAK;AACH,aAAO,qBAAqB,MAAM,GAAG;AAAA,IACvC,KAAK;AACH,aAAO,mBAAmB,MAAM,GAAG;AAAA,IACrC,KAAK;AACH,aAAO,0BAA0B,MAAM,GAAG;AAAA,IAC5C,KAAK;AACH,aAAO,cAAc,MAAM,GAAG;AAAA,IAChC,KAAK;AACH,aAAO,cAAc,MAAM,GAAG;AAAA,IAChC,KAAK;AACH,UAAI,aAAa,MAAM;AACvB,aAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AAAA,IACjD,KAAK;AACH,+BAAyB,GAAG;AAC5B,UAAI,aAAa,OAAO;AACxB,aAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AAAA,IACjD,KAAK;AACH,UAAI,aAAa,SAAS,KAAK,aAAa,MAAS;AACrD,aAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AAAA,IACjD,KAAK;AACH,UAAI,aAAa,UAAU,KAAK,IAAI;AACpC,aAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AAAA,IACjD,KAAK;AACH,UAAI,aAAa,QAAQ,KAAK,IAAI;AAClC,aAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AAAA,IACjD,KAAK;AACH,aAAO,cAAc,KAAK,MAAM,KAAK,OAAO,GAAG;AAAA,IACjD,KAAK;AACH,aAAO;AAAA,QACL,KAAK,YACD,CAAC,MAAM,UAAU,WAAW,QAAQ,IACpC,CAAC,QAAQ,UAAU,MAAM,MAAM,MAAM,MAAM,MAAM,SAAS;AAAA,QAC9D,KAAK,YACD,CAAC,CAAC,GAAG,GAAG,GAAG,WAAW,KAAK,UAAU,KAAK,YAAY,CAAC,EAAE,CAAC,IAC1D,CAAC,CAAC,GAAG,WAAW,GAAG,GAAG,GAAG,KAAK,UAAU,MAAM,GAAG,IAAI,CAAC;AAAA,QAC1D;AAAA,QACA,IAAI,MAAM;AAAA,MACZ;AAAA,IACF,KAAK;AACH,aAAO,eAAe,MAAM,GAAG;AAAA,IACjC,KAAK;AACH,UAAI,MAAM,aAAa,CAAC;AACxB,aAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AAAA,IACjD,KAAK;AAEH,UAAI,MAAM,aAAa,CAAC;AACxB,aAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AAAA,EACnD;AACF;AAEA,SAAS,eAAe,MAA6C,KAA8B;AAEjG,MAAI,OAAO,IAAI,MAAM,OAAO,IAAI,cAAc;AAC9C,MAAI,CAAC,MAAM;AACT,QAAI,MAAM;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,UACP,EAAE,MAAM,OAAO,UAAU,QAAQ,aAAa,CAAC,EAAE;AAAA,UACjD,EAAE,MAAM,OAAO,UAAU,QAAQ,aAAa,CAAC,EAAE;AAAA,UACjD,EAAE,MAAM,QAAQ,UAAU,QAAQ,aAAa,CAAC,EAAE;AAAA,QACpD;AAAA,QACA,aAAa,CAAC;AAAA,QACd,UAAU;AAAA,QACV,cAAc;AAAA,QACd,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AACA,WAAO,IAAI,MAAM,OAAO,IAAI,cAAc;AAAA,EAC5C;AACA,MAAI,MAAM;AACR,eAAW,OAAO,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;AAClC,WAAK,OAAO,IAAI,KAAK;AAAA,IACvB;AACA,UAAM,SAAS,CAAC,GAAG,IAAI,MAAM,OAAO,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,cAAc;AACnG,UAAM,UAAU,KAAK,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,KAAK,KAAM,YAAY,CAAC,IAAI;AACtG,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAW,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE;AACnC,YAAM,UAAU,CAAC,GAAG,IAAI,MAAM,QAAQ,OAAO,CAAC,EAAE;AAAA,QAC9C,CAAC,MAAM,EAAE,UAAU,YAAY,MAAM,MAAM,KAAK,YAAY;AAAA,MAC9D;AACA,UAAI,QAAQ,WAAW,GAAG;AACxB,aAAK;AAAA,UACH,oBAAI,IAAkD;AAAA,YACpD,CAAC,OAAO,MAAM,IAAI;AAAA,YAClB,CAAC,OAAO,IAAI;AAAA,YACZ,CAAC,QAAQ,OAAO,QAAQ,CAAC;AAAA,UAC3B,CAAC;AAAA,QACH;AAAA,MACF,OAAO;AACL,mBAAW,SAAS,SAAS;AAC3B,eAAK;AAAA,YACH,oBAAI,IAAkD;AAAA,cACpD,CAAC,OAAO,MAAM,IAAI;AAAA,cAClB,CAAC,OAAO,MAAM,IAAI;AAAA,cAClB,CAAC,QAAQ,GAAG,QAAQ,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,CAAC,CAAC,CAAC,EAAE;AAAA,YACjE,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,aAAa,CAAC;AACxB,SAAO,YAAY,GAAG,IAAI,MAAM,eAAe;AACjD;;;ACrHO,IAAM,YAAN,MAAM,WAAU;AAAA,EAMb,YACW,UACA,KACjB,YACA;AAHiB;AACA;AAGjB,SAAK,aAAa;AAClB,SAAK,gBAAgB,SAAS,MAAM;AAAA,EACtC;AAAA,EANmB;AAAA,EACA;AAAA,EAPX,YAA2D;AAAA,EAC3D,MAA2B;AAAA,EAC3B;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeR,OAAO,OAAO,UAAoB,KAAa,YAAuC;AACpF,WAAO,IAAI,WAAU,UAAU,KAAK,UAAU;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,QAAgC;AACrC,UAAM,SAAS,KAAK,QAAQ,QAAQ,EAAE,OAAO,MAAM,CAAC;AACpD,WAAO,EAAE,SAAS,OAAO,SAAS,iBAAiB,OAAO,gBAAgB;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAqB,QAA0B;AAC7C,WAAO,KAAK,QAAQ,QAAQ,EAAE,OAAO,KAAK,CAAC,EAAE;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,UAAU,QAAgC;AACxC,WAAO,KAAK,QAAQ,QAAQ,EAAE,OAAO,KAAK,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAqB,QAAoC;AACvD,WAAO,KAAK,QAAQ,QAAQ,EAAE,OAAO,MAAM,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC;AAAA,EACjE;AAAA,EAEQ,QAAQ,QAA8B,SAA4D;AACxG,SAAK,SAAS,WAAW;AACzB,SAAK,yBAAyB;AAC9B,QAAI,KAAK,WAAW,WAAW,EAAG,OAAM,IAAI,YAAY,mBAAmB,QAAQ;AACnF,SAAK,cAAc,oBAAoB,KAAK,GAAG;AAC/C,UAAM,WAAW,KAAK,UAAU;AAChC,QAAI,OAAO,SAAS,KAAK,OAAO,WAAW,UAAU;AACnD,YAAM,IAAI,YAAY,yBAAyB,QAAQ,qBAAqB,OAAO,MAAM,IAAI,QAAQ;AAAA,IACvG;AACA,UAAM,MAAM,KAAK,UAAU,MAAM;AACjC,QAAI,UAAU,SAAS,WAAW,OAAO;AACzC,QAAI,mBAAmB,SAAS,UAAU;AAC1C,QAAI,gBAAgB;AACpB,SAAK,UAAU,KAAK,MAAM;AAC1B,QAAI;AACJ,eAAW,aAAa,KAAK,YAAY;AACvC,eAAS,iBAAiB,WAAW,GAAG;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,QAA4C;AAC5D,QAAI,KAAK,KAAK;AACZ,WAAK,IAAI,MAAM,MAAM;AACrB,WAAK,IAAI,MAAM,MAAM,KAAK,SAAS;AACnC,WAAK,IAAI,MAAM,SAAS,MAAM,KAAK,SAAS,KAAK,iBAAiB;AAClE,WAAK,IAAI,MAAM,YAAY,MAAM,KAAK,SAAS,KAAK,QAAQ;AAC5D,aAAO,KAAK;AAAA,IACd;AACA,SAAK,MAAM,IAAI,aAAa,KAAK,SAAS,OAAO,KAAK,SAAS,cAAc,QAAQ,QAAW;AAAA,MAC9F,KAAK,KAAK,SAAS;AAAA,MACnB,QAAQ,MAAM,KAAK,SAAS,KAAK,iBAAiB;AAAA,MAClD,WAAW,MAAM,KAAK,SAAS,KAAK,QAAQ;AAAA,IAC9C,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,2BAAiC;AACvC,QAAI,KAAK,kBAAkB,KAAK,SAAS,MAAM,cAAe;AAC9D,SAAK,aAAa,MAAM,KAAK,GAAG;AAChC,SAAK,MAAM;AACX,SAAK,YAAY;AACjB,SAAK,gBAAgB,KAAK,SAAS,MAAM;AAAA,EAC3C;AAAA,EAEQ,UAAU,KAAmB,QAAoC;AACvE,SAAK,cAAc,oBAAoB,KAAK,GAAG;AAC/C,eAAW,QAAQ,KAAK,UAAU,OAAO;AACvC,UAAI,KAAK,QAAQ,OAAO,OAAQ,KAAI,SAAS,KAAK,MAAM,OAAO,KAAK,OAAO,CAAC,CAAC;AAAA,IAC/E;AAAA,EACF;AACF;AAQA,SAAS,oBAAoB,KAAwB;AACnD,QAAM,SAAS,SAAS,GAAG;AAC3B,MAAI,WAAW;AACf,QAAM,aAAa,oBAAI,IAAoB;AAC3C,QAAM,QAA0C,CAAC;AACjD,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,aAAa;AAC9B,UAAI,MAAM,UAAU,OAAW,YAAW,KAAK,IAAI,UAAU,MAAM,QAAQ,CAAC;AAAA,UACvE;AAAA,IACP,WAAW,MAAM,SAAS,eAAe;AACvC,YAAM,OAAO,MAAM,MAAM,YAAY;AACrC,UAAI,OAAO,WAAW,IAAI,IAAI;AAC9B,UAAI,SAAS,QAAW;AACtB,eAAO;AACP,mBAAW,IAAI,MAAM,IAAI;AACzB,cAAM,KAAK,EAAE,MAAM,KAAK,CAAC;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,OAAO,eAAe,WAAW,EAAE;AAC9C;;;ACxJO,IAAM,WAAN,MAAe;AAAA;AAAA,EAEX,QAAQ,IAAI,cAAc;AAAA;AAAA,EAE1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT;AAAA;AAAA,EAES;AAAA,EACD,SAAS;AAAA,EACT,sBAAsB;AAAA;AAAA,EAEtB,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO9B,YAAY,UAA2B,CAAC,GAAG;AACzC,SAAK,OAAO,QAAQ,QAAQ;AAC5B,SAAK,OAAO,IAAI,KAAK,KAAK,IAAI;AAC9B,SAAK,MAAM,aAAa,QAAQ,GAAG;AACnC,SAAK,eAAe,IAAI,mBAAmB,KAAK,OAAO,KAAK,IAAI;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,KAAK,KAAmB;AACtB,SAAK,WAAW;AAGhB,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,IAAI,YAAY,+DAA+D,QAAQ;AAAA,IAC/F;AACA,cAAU,OAAO,MAAM,KAAK,MAAM,GAAG,CAAC,EAAE,IAAI;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAoB,KAAa,SAA+B,CAAC,GAAQ;AACvE,SAAK,WAAW;AAChB,WAAO,KAAK,cAAc,GAAG,EAAE,IAAO,GAAG,MAAM;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ,KAAwB;AAC9B,SAAK,WAAW;AAChB,WAAO,KAAK,cAAc,GAAG;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,YAAe,IAAgB;AAC7B,SAAK,WAAW;AAChB,SAAK;AACL,QAAI;AACF,UAAI,CAAC,KAAK,aAAa,eAAe;AACpC,aAAK,aAAa,MAAM;AACxB,YAAI;AACF,gBAAM,QAAQ,GAAG;AACjB,eAAK,aAAa,OAAO;AACzB,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,eAAK,aAAa,SAAS;AAC3B,gBAAM;AAAA,QACR;AAAA,MACF;AACA,YAAM,OAAO,qBAAqB,EAAE,KAAK,mBAAmB;AAC5D,WAAK,aAAa,UAAU,IAAI;AAChC,UAAI;AACF,cAAM,QAAQ,GAAG;AACjB,aAAK,aAAa,QAAQ,IAAI;AAC9B,eAAO;AAAA,MACT,SAAS,OAAO;AACd,aAAK,aAAa,SAAS,IAAI;AAC/B,aAAK,aAAa,QAAQ,IAAI;AAC9B,cAAM;AAAA,MACR;AAAA,IACF,UAAE;AACA,WAAK;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAuB;AACrB,SAAK,WAAW;AAChB,WAAO,oBAAoB,KAAK,OAAO;AAAA,MACrC,WAAW,KAAK,KAAK,SAAS;AAAA,MAC9B,OAAO,KAAK,IAAI,EAAE,QAAQ;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,QAAQ,UAA4B;AAClC,SAAK,WAAW;AAChB,QAAI,KAAK,aAAa,cAAe,OAAM,IAAI,YAAY,uCAAuC,aAAa;AAG/G,SAAK,MAAM,YAAY,IAAI,cAAc,GAAG,EAAE,OAAO,KAAK,CAAC;AAC3D,UAAM,UAAU,oBAAoB,QAAQ;AAC5C,SAAK,MAAM,YAAY,QAAQ,OAAO,EAAE,OAAO,KAAK,CAAC;AACrD,QAAI,QAAQ,SAAS;AACnB,WAAK,KAAK,SAAS,QAAQ,QAAQ,SAAS;AAC5C,WAAK,MAAM,WAAW,IAAI,KAAK,QAAQ,QAAQ,KAAK,CAAC;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAc;AACZ,QAAI,KAAK,OAAQ;AACjB,QAAI,KAAK,sBAAsB,GAAG;AAChC,YAAM,IAAI,YAAY,8CAA8C,QAAQ;AAAA,IAC9E;AACA,QAAI,KAAK,aAAa,cAAe,MAAK,aAAa,SAAS;AAChE,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,UAAkB;AACpB,SAAK,WAAW;AAChB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,kBAAmC;AACrC,SAAK,WAAW;AAChB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAmB;AACjB,QAAI,KAAK,OAAQ,OAAM,IAAI,YAAY,sBAAsB,QAAQ;AAAA,EACvE;AAAA,EAEQ,cAAc,KAAwB;AAC5C,UAAM,aAAa,MAAM,GAAG;AAC5B,QAAI,WAAW,WAAW,GAAG;AAC3B,YAAM,IAAI,YAAY,mBAAmB,QAAQ;AAAA,IACnD;AACA,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,IAAI,YAAY,4EAA4E,QAAQ;AAAA,IAC5G;AACA,WAAO,UAAU,OAAO,MAAM,KAAK,UAAU;AAAA,EAC/C;AACF;AAEA,IAAM,aAAc,OAA2C;AAC/D,IAAI,OAAO,eAAe,UAAU;AAClC,SAAO,eAAe,SAAS,WAAW,YAAY;AAAA,IACpD,OAAO,WAAgC;AACrC,WAAK,MAAM;AAAA,IACb;AAAA,IACA,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,CAAC;AACH;",
|
|
4
|
+
"sourcesContent": ["/** Coarse classification of {@link SqliteError} for catch-site branching.\n *\n * New categories may be added in minor releases. Consumers that switch on\n * `category` must include a default case.\n */\nexport type ErrorCategory =\n | \"syntax\"\n | \"no_such_table\"\n | \"no_such_column\"\n | \"constraint_unique\"\n | \"constraint_primary\"\n | \"constraint_notnull\"\n | \"constraint_check\"\n | \"constraint_foreign\"\n | \"constraint\"\n | \"transaction\"\n | \"datatype_mismatch\"\n | \"unsupported\"\n | \"misuse\"\n | \"snapshot_version\"\n | \"other\"\n | (string & {});\n\n/**\n * Engine error. `name` is always `\"SqliteError\"`.\n *\n * `sqliteCode` and Node's conventional `code` property are always set (default\n * `\"SQLITE_ERROR\"` when no more specific code applies).\n *\n * @example\n * ```ts\n * import { Database, SqliteError } from \"@crvouga/sqlite-mem\";\n *\n * const db = new Database();\n * try {\n * db.exec(\"SELECT * FROM missing\");\n * } catch (err) {\n * if (err instanceof SqliteError && err.category === \"no_such_table\") {\n * // handle\n * }\n * }\n * ```\n */\nexport class SqliteError extends Error {\n /** Coarse error class (constraint vs syntax vs missing object, \u2026). */\n readonly category: ErrorCategory;\n /** SQLite result-code name such as `SQLITE_CONSTRAINT_UNIQUE`. */\n readonly sqliteCode: string;\n /** Same value as {@link sqliteCode} (Node `err.code` convention). */\n readonly code: string;\n\n /**\n * @param message - Human-readable error text.\n * @param category - Coarse class; defaults to `\"other\"`.\n * @param sqliteCode - SQLite result-code name; defaults to `\"SQLITE_ERROR\"`.\n */\n constructor(message: string, category: ErrorCategory = \"other\", sqliteCode = \"SQLITE_ERROR\") {\n super(message);\n this.name = \"SqliteError\";\n this.category = category;\n this.sqliteCode = sqliteCode;\n this.code = sqliteCode;\n }\n}\n\nexport function unsupported(feature: string): never {\n throw new SqliteError(`Unsupported SQLite feature: ${feature}`, \"unsupported\");\n}\n\nexport class TriggerRaiseError extends SqliteError {\n readonly action: \"IGNORE\" | \"ABORT\" | \"FAIL\" | \"ROLLBACK\";\n\n constructor(action: \"IGNORE\" | \"ABORT\" | \"FAIL\" | \"ROLLBACK\", message?: string) {\n super(\n message ?? action,\n action === \"FAIL\" ? \"constraint\" : \"other\",\n action === \"FAIL\" ? \"SQLITE_CONSTRAINT\" : undefined,\n );\n this.action = action;\n }\n}\n", "import { SqliteError } from \"../errors/index.ts\";\n\n/** Lexer token kind: keywords, literals, operators, and punctuation. */\nexport type TokenKind =\n | \"EOF\"\n | \"IDENT\"\n | \"STRING\"\n | \"NUMBER\"\n | \"BLOB\"\n | \"PARAM_POS\"\n | \"PARAM_NAMED\"\n | \"DOT\"\n | \"COMMA\"\n | \"SEMI\"\n | \"LPAREN\"\n | \"RPAREN\"\n | \"PLUS\"\n | \"MINUS\"\n | \"STAR\"\n | \"SLASH\"\n | \"PERCENT\"\n | \"EQ\"\n | \"EQEQ\"\n | \"NE\"\n | \"LT\"\n | \"LE\"\n | \"GT\"\n | \"GE\"\n | \"CONCAT\"\n | \"AMP\"\n | \"PIPE\"\n | \"LSHIFT\"\n | \"RSHIFT\"\n | \"JSON_ARROW\"\n | \"JSON_ARROW2\"\n | \"TILDE\"\n // keywords\n | \"ABORT\"\n | \"ACTION\"\n | \"ADD\"\n | \"AFTER\"\n | \"ALL\"\n | \"ALTER\"\n | \"ANALYZE\"\n | \"AND\"\n | \"AS\"\n | \"ASC\"\n | \"ATTACH\"\n | \"AUTOINCREMENT\"\n | \"BEFORE\"\n | \"BEGIN\"\n | \"BETWEEN\"\n | \"BY\"\n | \"CASCADE\"\n | \"CASE\"\n | \"CAST\"\n | \"CHECK\"\n | \"COLLATE\"\n | \"COLUMN\"\n | \"COMMIT\"\n | \"CONFLICT\"\n | \"CONSTRAINT\"\n | \"CREATE\"\n | \"CROSS\"\n | \"CURRENT\"\n | \"CURRENT_DATE\"\n | \"CURRENT_TIME\"\n | \"CURRENT_TIMESTAMP\"\n | \"DATABASE\"\n | \"DEFAULT\"\n | \"DEFERRABLE\"\n | \"DEFERRED\"\n | \"DELETE\"\n | \"DESC\"\n | \"DETACH\"\n | \"DISTINCT\"\n | \"DO\"\n | \"DROP\"\n | \"EACH\"\n | \"ELSE\"\n | \"END\"\n | \"ESCAPE\"\n | \"EXCEPT\"\n | \"EXCLUDE\"\n | \"EXCLUSIVE\"\n | \"EXISTS\"\n | \"EXPLAIN\"\n | \"FAIL\"\n | \"FILTER\"\n | \"FIRST\"\n | \"FOLLOWING\"\n | \"FOR\"\n | \"FOREIGN\"\n | \"FROM\"\n | \"FULL\"\n | \"FALSE\"\n | \"GENERATED\"\n | \"GLOB\"\n | \"GROUP\"\n | \"GROUPS\"\n | \"HAVING\"\n | \"IF\"\n | \"IGNORE\"\n | \"IMMEDIATE\"\n | \"IN\"\n | \"INDEX\"\n | \"INDEXED\"\n | \"INITIALLY\"\n | \"INNER\"\n | \"INSERT\"\n | \"INSTEAD\"\n | \"INTERSECT\"\n | \"INTO\"\n | \"IS\"\n | \"ISNULL\"\n | \"JOIN\"\n | \"KEY\"\n | \"LAST\"\n | \"LEFT\"\n | \"LIKE\"\n | \"LIMIT\"\n | \"MATCH\"\n | \"MATERIALIZED\"\n | \"NATURAL\"\n | \"NO\"\n | \"NOT\"\n | \"NOTHING\"\n | \"NOTNULL\"\n | \"NULL\"\n | \"NULLS\"\n | \"OF\"\n | \"OFFSET\"\n | \"ON\"\n | \"OR\"\n | \"ORDER\"\n | \"OTHERS\"\n | \"OUTER\"\n | \"OVER\"\n | \"PARTITION\"\n | \"PLAN\"\n | \"PRAGMA\"\n | \"PRECEDING\"\n | \"PRIMARY\"\n | \"QUERY\"\n | \"RAISE\"\n | \"RANGE\"\n | \"RECURSIVE\"\n | \"REFERENCES\"\n | \"REGEXP\"\n | \"REINDEX\"\n | \"RELEASE\"\n | \"RENAME\"\n | \"REPLACE\"\n | \"RESTRICT\"\n | \"RETURNING\"\n | \"RIGHT\"\n | \"ROLLBACK\"\n | \"ROW\"\n | \"ROWS\"\n | \"SAVEPOINT\"\n | \"SELECT\"\n | \"SET\"\n | \"TABLE\"\n | \"TEMP\"\n | \"TEMPORARY\"\n | \"THEN\"\n | \"TIES\"\n | \"TO\"\n | \"TRANSACTION\"\n | \"TRIGGER\"\n | \"TRUE\"\n | \"UNBOUNDED\"\n | \"UNION\"\n | \"UNIQUE\"\n | \"UPDATE\"\n | \"USING\"\n | \"VACUUM\"\n | \"VALUES\"\n | \"VIEW\"\n | \"VIRTUAL\"\n | \"WHEN\"\n | \"WHERE\"\n | \"WINDOW\"\n | \"WITH\"\n | \"WITHOUT\";\n\n/** A single lexer token from {@link tokenize}. */\nexport interface Token {\n kind: TokenKind;\n value: string;\n /** For NUMBER/BLOB/STRING, the parsed value */\n literal?: string | number | bigint | Uint8Array | null;\n /** True when a NUMBER token used float/scientific syntax. */\n forceReal?: boolean;\n index?: number; // for PARAM_POS\n line: number;\n column: number;\n start: number;\n end: number;\n}\n\nconst KEYWORDS: Record<string, TokenKind> = {\n ABORT: \"ABORT\",\n ACTION: \"ACTION\",\n ADD: \"ADD\",\n AFTER: \"AFTER\",\n ALL: \"ALL\",\n ALTER: \"ALTER\",\n ANALYZE: \"ANALYZE\",\n AND: \"AND\",\n AS: \"AS\",\n ASC: \"ASC\",\n ATTACH: \"ATTACH\",\n AUTOINCREMENT: \"AUTOINCREMENT\",\n BEFORE: \"BEFORE\",\n BEGIN: \"BEGIN\",\n BETWEEN: \"BETWEEN\",\n BY: \"BY\",\n CASCADE: \"CASCADE\",\n CASE: \"CASE\",\n CAST: \"CAST\",\n CHECK: \"CHECK\",\n COLLATE: \"COLLATE\",\n COLUMN: \"COLUMN\",\n COMMIT: \"COMMIT\",\n CONFLICT: \"CONFLICT\",\n CONSTRAINT: \"CONSTRAINT\",\n CREATE: \"CREATE\",\n CROSS: \"CROSS\",\n CURRENT: \"CURRENT\",\n CURRENT_DATE: \"CURRENT_DATE\",\n CURRENT_TIME: \"CURRENT_TIME\",\n CURRENT_TIMESTAMP: \"CURRENT_TIMESTAMP\",\n DATABASE: \"DATABASE\",\n DEFAULT: \"DEFAULT\",\n DEFERRABLE: \"DEFERRABLE\",\n DEFERRED: \"DEFERRED\",\n DELETE: \"DELETE\",\n DESC: \"DESC\",\n DETACH: \"DETACH\",\n DISTINCT: \"DISTINCT\",\n DO: \"DO\",\n DROP: \"DROP\",\n EACH: \"EACH\",\n ELSE: \"ELSE\",\n END: \"END\",\n ESCAPE: \"ESCAPE\",\n EXCEPT: \"EXCEPT\",\n EXCLUDE: \"EXCLUDE\",\n EXCLUSIVE: \"EXCLUSIVE\",\n EXISTS: \"EXISTS\",\n EXPLAIN: \"EXPLAIN\",\n FAIL: \"FAIL\",\n FILTER: \"FILTER\",\n FIRST: \"FIRST\",\n FOLLOWING: \"FOLLOWING\",\n FOR: \"FOR\",\n FOREIGN: \"FOREIGN\",\n FROM: \"FROM\",\n FULL: \"FULL\",\n FALSE: \"FALSE\",\n GENERATED: \"GENERATED\",\n GLOB: \"GLOB\",\n GROUP: \"GROUP\",\n GROUPS: \"GROUPS\",\n HAVING: \"HAVING\",\n IF: \"IF\",\n IGNORE: \"IGNORE\",\n IMMEDIATE: \"IMMEDIATE\",\n IN: \"IN\",\n INDEX: \"INDEX\",\n INDEXED: \"INDEXED\",\n INITIALLY: \"INITIALLY\",\n INNER: \"INNER\",\n INSERT: \"INSERT\",\n INSTEAD: \"INSTEAD\",\n INTERSECT: \"INTERSECT\",\n INTO: \"INTO\",\n IS: \"IS\",\n ISNULL: \"ISNULL\",\n JOIN: \"JOIN\",\n KEY: \"KEY\",\n LAST: \"LAST\",\n LEFT: \"LEFT\",\n LIKE: \"LIKE\",\n LIMIT: \"LIMIT\",\n MATCH: \"MATCH\",\n MATERIALIZED: \"MATERIALIZED\",\n NATURAL: \"NATURAL\",\n NO: \"NO\",\n NOT: \"NOT\",\n NOTHING: \"NOTHING\",\n NOTNULL: \"NOTNULL\",\n NULL: \"NULL\",\n NULLS: \"NULLS\",\n OF: \"OF\",\n OFFSET: \"OFFSET\",\n ON: \"ON\",\n OR: \"OR\",\n ORDER: \"ORDER\",\n OTHERS: \"OTHERS\",\n OUTER: \"OUTER\",\n OVER: \"OVER\",\n PARTITION: \"PARTITION\",\n PLAN: \"PLAN\",\n PRAGMA: \"PRAGMA\",\n PRECEDING: \"PRECEDING\",\n PRIMARY: \"PRIMARY\",\n QUERY: \"QUERY\",\n RAISE: \"RAISE\",\n RANGE: \"RANGE\",\n RECURSIVE: \"RECURSIVE\",\n REFERENCES: \"REFERENCES\",\n REGEXP: \"REGEXP\",\n REINDEX: \"REINDEX\",\n RELEASE: \"RELEASE\",\n RENAME: \"RENAME\",\n REPLACE: \"REPLACE\",\n RESTRICT: \"RESTRICT\",\n RETURNING: \"RETURNING\",\n RIGHT: \"RIGHT\",\n ROLLBACK: \"ROLLBACK\",\n ROW: \"ROW\",\n ROWS: \"ROWS\",\n SAVEPOINT: \"SAVEPOINT\",\n SELECT: \"SELECT\",\n SET: \"SET\",\n TABLE: \"TABLE\",\n TEMP: \"TEMP\",\n TEMPORARY: \"TEMPORARY\",\n THEN: \"THEN\",\n TIES: \"TIES\",\n TO: \"TO\",\n TRANSACTION: \"TRANSACTION\",\n TRIGGER: \"TRIGGER\",\n TRUE: \"TRUE\",\n UNBOUNDED: \"UNBOUNDED\",\n UNION: \"UNION\",\n UNIQUE: \"UNIQUE\",\n UPDATE: \"UPDATE\",\n USING: \"USING\",\n VACUUM: \"VACUUM\",\n VALUES: \"VALUES\",\n VIEW: \"VIEW\",\n VIRTUAL: \"VIRTUAL\",\n WHEN: \"WHEN\",\n WHERE: \"WHERE\",\n WINDOW: \"WINDOW\",\n WITH: \"WITH\",\n WITHOUT: \"WITHOUT\",\n};\n\n/**\n * Lex `input` into SQLite tokens (keywords, literals, operators, parameters).\n *\n * @param input - SQL source text.\n */\nexport function tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n let line = 1;\n let column = 1;\n let nextParameterIndex = 1;\n const namedParameterIndexes = new Map<string, number>();\n\n const peek = (n = 0) => input[i + n] ?? \"\";\n const advance = () => {\n const ch = input[i++] ?? \"\";\n if (ch === \"\\n\") {\n line++;\n column = 1;\n } else {\n column++;\n }\n return ch;\n };\n\n const push = (\n kind: TokenKind,\n start: number,\n startLine: number,\n startCol: number,\n value: string,\n extra?: Partial<Token>,\n ) => {\n tokens.push({\n kind,\n value,\n line: startLine,\n column: startCol,\n start,\n end: i,\n ...extra,\n });\n };\n\n while (i < input.length) {\n const start = i;\n const startLine = line;\n const startCol = column;\n const ch = peek();\n\n // whitespace\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\f\") {\n advance();\n continue;\n }\n\n // comments\n if (ch === \"-\" && peek(1) === \"-\") {\n while (i < input.length && peek() !== \"\\n\") advance();\n continue;\n }\n if (ch === \"/\" && peek(1) === \"*\") {\n advance();\n advance();\n while (i < input.length && !(peek() === \"*\" && peek(1) === \"/\")) advance();\n if (i >= input.length) throw new SqliteError(\"unterminated comment\", \"syntax\");\n advance();\n advance();\n continue;\n }\n\n // string\n if (ch === \"'\") {\n advance();\n let s = \"\";\n while (i < input.length) {\n const c = advance();\n if (c === \"'\") {\n if (peek() === \"'\") {\n advance();\n s += \"'\";\n continue;\n }\n push(\"STRING\", start, startLine, startCol, s, { literal: s });\n break;\n }\n s += c;\n }\n if (tokens.at(-1)?.kind !== \"STRING\" || tokens.at(-1)?.start !== start) {\n throw new SqliteError(\"unrecognized token: incomplete string literal\", \"syntax\");\n }\n continue;\n }\n\n // quoted identifier\n if (ch === '\"' || ch === \"[\" || ch === \"`\") {\n const closer = ch === \"[\" ? \"]\" : ch;\n advance();\n let s = \"\";\n while (i < input.length) {\n const c = advance();\n if (c === closer) {\n if (ch === '\"' && peek() === '\"') {\n advance();\n s += '\"';\n continue;\n }\n push(\"IDENT\", start, startLine, startCol, s);\n break;\n }\n s += c;\n }\n if (tokens.at(-1)?.kind !== \"IDENT\" || tokens.at(-1)?.start !== start) {\n throw new SqliteError(\"unrecognized token: incomplete identifier\", \"syntax\");\n }\n continue;\n }\n\n // blob X'ABCD'\n if ((ch === \"x\" || ch === \"X\") && peek(1) === \"'\") {\n advance();\n advance();\n let hex = \"\";\n while (i < input.length) {\n const c = advance();\n if (c === \"'\") break;\n if (!/[0-9a-fA-F]/.test(c)) {\n throw new SqliteError(\"unrecognized token: invalid blob literal\", \"syntax\");\n }\n hex += c;\n }\n if (hex.length % 2 !== 0) {\n throw new SqliteError(\"unrecognized token: invalid blob literal\", \"syntax\");\n }\n const bytes = new Uint8Array(hex.length / 2);\n for (let j = 0; j < bytes.length; j++) {\n bytes[j] = Number.parseInt(hex.slice(j * 2, j * 2 + 2), 16);\n }\n push(\"BLOB\", start, startLine, startCol, hex, { literal: bytes });\n continue;\n }\n\n // parameters\n if (ch === \"?\") {\n advance();\n let num = \"\";\n while (/[0-9]/.test(peek())) num += advance();\n const index = num ? Number(num) : nextParameterIndex;\n nextParameterIndex = Math.max(nextParameterIndex, index + 1);\n push(\"PARAM_POS\", start, startLine, startCol, num ? `?${num}` : \"?\", { index });\n continue;\n }\n if (ch === \":\" || ch === \"@\" || ch === \"$\") {\n const prefix = advance();\n let name = \"\";\n while (/[A-Za-z0-9_]/.test(peek())) name += advance();\n if (!name) throw new SqliteError(\"unrecognized token near parameter\", \"syntax\");\n const parameter = `${prefix}${name}`;\n if (!namedParameterIndexes.has(parameter.toLowerCase())) {\n namedParameterIndexes.set(parameter.toLowerCase(), nextParameterIndex++);\n }\n push(\"PARAM_NAMED\", start, startLine, startCol, parameter);\n continue;\n }\n\n // numbers\n if (/[0-9]/.test(ch) || (ch === \".\" && /[0-9]/.test(peek(1)))) {\n let raw = \"\";\n let isFloat = false;\n if (ch === \".\") {\n isFloat = true;\n raw += advance();\n while (/[0-9]/.test(peek())) raw += advance();\n } else {\n while (/[0-9]/.test(peek())) raw += advance();\n if (peek() === \".\") {\n isFloat = true;\n raw += advance();\n while (/[0-9]/.test(peek())) raw += advance();\n }\n }\n if (peek() === \"e\" || peek() === \"E\") {\n isFloat = true;\n raw += advance();\n if (peek() === \"+\" || peek() === \"-\") raw += advance();\n if (!/[0-9]/.test(peek())) throw new SqliteError(\"unrecognized token near number\", \"syntax\");\n while (/[0-9]/.test(peek())) raw += advance();\n }\n let literal: number | bigint;\n if (!isFloat && raw.length > 15) {\n try {\n literal = BigInt(raw);\n } catch {\n literal = Number(raw);\n }\n } else if (!isFloat) {\n const n = Number(raw);\n literal = Number.isSafeInteger(n) ? n : BigInt(raw);\n } else {\n literal = Number(raw);\n }\n push(\"NUMBER\", start, startLine, startCol, raw, { literal, forceReal: isFloat || undefined });\n continue;\n }\n\n // operators / punctuation\n const two = ch + peek(1);\n const three = two + peek(2);\n if (three === \"<<\" || three === \">>\") {\n // not three char; handle below\n }\n if (two === \"||\") {\n advance();\n advance();\n push(\"CONCAT\", start, startLine, startCol, \"||\");\n continue;\n }\n if (three === \"->>\") {\n advance();\n advance();\n advance();\n push(\"JSON_ARROW2\", start, startLine, startCol, \"->>\");\n continue;\n }\n if (two === \"->\") {\n advance();\n advance();\n push(\"JSON_ARROW\", start, startLine, startCol, \"->\");\n continue;\n }\n if (two === \"<<\") {\n advance();\n advance();\n push(\"LSHIFT\", start, startLine, startCol, \"<<\");\n continue;\n }\n if (two === \">>\") {\n advance();\n advance();\n push(\"RSHIFT\", start, startLine, startCol, \">>\");\n continue;\n }\n if (two === \"==\") {\n advance();\n advance();\n push(\"EQEQ\", start, startLine, startCol, \"==\");\n continue;\n }\n if (two === \"!=\" || two === \"<>\") {\n advance();\n advance();\n push(\"NE\", start, startLine, startCol, two);\n continue;\n }\n if (two === \"<=\") {\n advance();\n advance();\n push(\"LE\", start, startLine, startCol, \"<=\");\n continue;\n }\n if (two === \">=\") {\n advance();\n advance();\n push(\"GE\", start, startLine, startCol, \">=\");\n continue;\n }\n\n const singles: Record<string, TokenKind> = {\n \".\": \"DOT\",\n \",\": \"COMMA\",\n \";\": \"SEMI\",\n \"(\": \"LPAREN\",\n \")\": \"RPAREN\",\n \"+\": \"PLUS\",\n \"-\": \"MINUS\",\n \"*\": \"STAR\",\n \"/\": \"SLASH\",\n \"%\": \"PERCENT\",\n \"=\": \"EQ\",\n \"<\": \"LT\",\n \">\": \"GT\",\n \"&\": \"AMP\",\n \"|\": \"PIPE\",\n \"~\": \"TILDE\",\n };\n if (singles[ch]) {\n advance();\n push(singles[ch]!, start, startLine, startCol, ch);\n continue;\n }\n\n // identifier / keyword\n if (/[A-Za-z_]/.test(ch)) {\n let s = \"\";\n while (/[A-Za-z0-9_$]/.test(peek())) s += advance();\n const upper = s.toUpperCase();\n const kw = KEYWORDS[upper];\n if (kw) push(kw, start, startLine, startCol, s);\n else push(\"IDENT\", start, startLine, startCol, s);\n continue;\n }\n\n throw new SqliteError(`unrecognized token: \"${ch}\"`, \"syntax\");\n }\n\n tokens.push({\n kind: \"EOF\",\n value: \"\",\n line,\n column,\n start: i,\n end: i,\n });\n return tokens;\n}\n\nexport function isKeyword(kind: TokenKind): boolean {\n return (\n kind !== \"EOF\" &&\n kind !== \"IDENT\" &&\n kind !== \"STRING\" &&\n kind !== \"NUMBER\" &&\n kind !== \"BLOB\" &&\n kind !== \"PARAM_POS\" &&\n kind !== \"PARAM_NAMED\" &&\n ![\n \"DOT\",\n \"COMMA\",\n \"SEMI\",\n \"LPAREN\",\n \"RPAREN\",\n \"PLUS\",\n \"MINUS\",\n \"STAR\",\n \"SLASH\",\n \"PERCENT\",\n \"EQ\",\n \"EQEQ\",\n \"NE\",\n \"LT\",\n \"LE\",\n \"GT\",\n \"GE\",\n \"CONCAT\",\n \"AMP\",\n \"PIPE\",\n \"LSHIFT\",\n \"RSHIFT\",\n \"JSON_ARROW\",\n \"JSON_ARROW2\",\n \"TILDE\",\n ].includes(kind)\n );\n}\n", "import type {\n AlterTableStmt,\n AttachStmt,\n BeginStmt,\n BinaryOp,\n CaseExpr,\n ColumnConstraint,\n ColumnDef,\n CommitStmt,\n CompoundTail,\n ConflictAction,\n CreateIndexStmt,\n CreateTableStmt,\n CreateTriggerStmt,\n CreateViewStmt,\n CreateVirtualTableStmt,\n Cte,\n DeleteStmt,\n DetachStmt,\n DropIndexStmt,\n DropTableStmt,\n DropTriggerStmt,\n DropViewStmt,\n Expr,\n FkAction,\n FrameBound,\n FrameSpec,\n FromItem,\n IndexedColumn,\n InExpr,\n InsertStmt,\n JoinFrom,\n LikeExpr,\n LimitClause,\n OrderByItem,\n PragmaStmt,\n ReleaseStmt,\n ResultColumn,\n RollbackStmt,\n SavepointStmt,\n SelectStmt,\n SetItem,\n Statement,\n TableConstraint,\n TableRef,\n UpdateStmt,\n UpsertClause,\n WindowSpec,\n WithClause,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { Token, TokenKind } from \"../lexer/tokenize.ts\";\n\n/** Keywords that may appear as identifiers via {@link Parser.parseIdent}. */\nconst IDENT_KEYWORDS: ReadonlySet<TokenKind> = new Set<TokenKind>([\n \"ABORT\",\n \"ACTION\",\n \"ADD\",\n \"AFTER\",\n \"ALL\",\n \"ALTER\",\n \"ANALYZE\",\n \"AND\",\n \"AS\",\n \"ASC\",\n \"ATTACH\",\n \"AUTOINCREMENT\",\n \"BEFORE\",\n \"BEGIN\",\n \"BETWEEN\",\n \"BY\",\n \"CASCADE\",\n \"CASE\",\n \"CAST\",\n \"CHECK\",\n \"COLLATE\",\n \"COLUMN\",\n \"COMMIT\",\n \"CONFLICT\",\n \"CONSTRAINT\",\n \"CREATE\",\n \"CROSS\",\n \"CURRENT\",\n \"CURRENT_DATE\",\n \"CURRENT_TIME\",\n \"CURRENT_TIMESTAMP\",\n \"DATABASE\",\n \"DEFAULT\",\n \"DEFERRABLE\",\n \"DEFERRED\",\n \"DELETE\",\n \"DESC\",\n \"DETACH\",\n \"DISTINCT\",\n \"DO\",\n \"DROP\",\n \"EACH\",\n \"ELSE\",\n \"END\",\n \"ESCAPE\",\n \"EXCEPT\",\n \"EXCLUDE\",\n \"EXCLUSIVE\",\n \"EXISTS\",\n \"EXPLAIN\",\n \"FAIL\",\n \"FILTER\",\n \"FIRST\",\n \"FOLLOWING\",\n \"FOR\",\n \"FOREIGN\",\n \"FROM\",\n \"FULL\",\n \"FALSE\",\n \"GENERATED\",\n \"GLOB\",\n \"GROUP\",\n \"GROUPS\",\n \"HAVING\",\n \"IF\",\n \"IGNORE\",\n \"IMMEDIATE\",\n \"IN\",\n \"INDEX\",\n \"INDEXED\",\n \"INITIALLY\",\n \"INNER\",\n \"INSERT\",\n \"INSTEAD\",\n \"INTERSECT\",\n \"INTO\",\n \"IS\",\n \"ISNULL\",\n \"JOIN\",\n \"KEY\",\n \"LAST\",\n \"LEFT\",\n \"LIKE\",\n \"LIMIT\",\n \"MATCH\",\n \"MATERIALIZED\",\n \"NATURAL\",\n \"NO\",\n \"NOT\",\n \"NOTHING\",\n \"NOTNULL\",\n \"NULL\",\n \"NULLS\",\n \"OF\",\n \"OFFSET\",\n \"ON\",\n \"OR\",\n \"ORDER\",\n \"OTHERS\",\n \"OUTER\",\n \"OVER\",\n \"PARTITION\",\n \"PLAN\",\n \"PRAGMA\",\n \"PRECEDING\",\n \"PRIMARY\",\n \"QUERY\",\n \"RAISE\",\n \"RANGE\",\n \"RECURSIVE\",\n \"REFERENCES\",\n \"REGEXP\",\n \"REINDEX\",\n \"RELEASE\",\n \"RENAME\",\n \"REPLACE\",\n \"RESTRICT\",\n \"RETURNING\",\n \"RIGHT\",\n \"ROLLBACK\",\n \"ROW\",\n \"ROWS\",\n \"SAVEPOINT\",\n \"SELECT\",\n \"SET\",\n \"TABLE\",\n \"TEMP\",\n \"TEMPORARY\",\n \"THEN\",\n \"TIES\",\n \"TO\",\n \"TRANSACTION\",\n \"TRIGGER\",\n \"TRUE\",\n \"UNBOUNDED\",\n \"UNION\",\n \"UNIQUE\",\n \"UPDATE\",\n \"USING\",\n \"VACUUM\",\n \"VALUES\",\n \"VIEW\",\n \"VIRTUAL\",\n \"WHEN\",\n \"WHERE\",\n \"WINDOW\",\n \"WITH\",\n \"WITHOUT\",\n]);\n\nconst AGGREGATE_FUNCTIONS = new Set([\n \"AVG\",\n \"COUNT\",\n \"GROUP_CONCAT\",\n \"STRING_AGG\",\n \"MAX\",\n \"MIN\",\n \"SUM\",\n \"TOTAL\",\n \"JSON_GROUP_ARRAY\",\n \"JSON_GROUP_OBJECT\",\n \"JSONB_GROUP_ARRAY\",\n \"JSONB_GROUP_OBJECT\",\n]);\n\n/** SQLite binary operator precedence (higher binds tighter). */\nconst PREC = {\n OR: 10,\n AND: 20,\n IS_IN_LIKE: 30,\n COMPARE: 40,\n BIT_OR: 45,\n BIT_AND: 46,\n SHIFT: 47,\n ADD: 50,\n MUL: 60,\n CONCAT: 70,\n JSON_ARROW: 80,\n} as const;\n\nexport class Parser {\n private pos = 0;\n\n constructor(private readonly tokens: Token[]) {}\n\n private current(): Token {\n return this.tokens[this.pos] ?? this.tokens[this.tokens.length - 1]!;\n }\n\n private peek(offset = 1): Token {\n return this.tokens[this.pos + offset] ?? this.tokens[this.tokens.length - 1]!;\n }\n\n private at(kind: TokenKind): boolean {\n return this.current().kind === kind;\n }\n\n private check(...kinds: TokenKind[]): boolean {\n return kinds.includes(this.current().kind);\n }\n\n private advance(): Token {\n const t = this.current();\n if (t.kind !== \"EOF\") this.pos++;\n return t;\n }\n\n private match(...kinds: TokenKind[]): boolean {\n if (this.check(...kinds)) {\n this.advance();\n return true;\n }\n return false;\n }\n\n private expect(kind: TokenKind, message?: string): Token {\n if (!this.at(kind)) {\n this.syntaxError(message ?? `expected ${kind}, got ${this.current().kind}`);\n }\n return this.advance();\n }\n\n syntaxError(message: string): never {\n const t = this.current();\n throw new SqliteError(`${message} at ${t.line}:${t.column}`, \"syntax\");\n }\n\n /** Accept IDENT or keyword tokens as identifier names. */\n parseIdent(): string {\n const t = this.current();\n if (t.kind === \"IDENT\") {\n this.advance();\n return t.value;\n }\n if (IDENT_KEYWORDS.has(t.kind)) {\n this.advance();\n return t.value;\n }\n this.syntaxError(\"expected identifier\");\n }\n\n private parseQualifiedTableName(): { schema: string | null; name: string } {\n const first = this.parseIdent();\n if (this.match(\"DOT\")) {\n const second = this.parseIdent();\n return { schema: first, name: second };\n }\n return { schema: null, name: first };\n }\n\n private parseTableName(): string {\n const qname = this.parseQualifiedTableName();\n return qname.schema ? `${qname.schema}.${qname.name}` : qname.name;\n }\n\n private parseAttachStmt(): AttachStmt {\n this.expect(\"ATTACH\");\n this.match(\"DATABASE\");\n const filename = this.parseExpr();\n this.expect(\"AS\");\n const schema = this.parseIdent();\n return { type: \"attach\", filename, schema };\n }\n\n private parseDetachStmt(): DetachStmt {\n this.expect(\"DETACH\");\n this.match(\"DATABASE\");\n const schema = this.parseIdent();\n return { type: \"detach\", schema };\n }\n\n private optionalAlias(): string | null {\n if (this.match(\"AS\")) return this.parseIdent();\n // Implicit aliases use only non-keyword IDENT tokens to avoid swallowing clause keywords.\n if (this.current().kind === \"IDENT\") {\n return this.parseIdent();\n }\n return null;\n }\n\n // \u2500\u2500 Statements \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n parseStatements(): Statement[] {\n const stmts: Statement[] = [];\n while (!this.at(\"EOF\")) {\n if (this.match(\"SEMI\")) continue;\n stmts.push(this.parseStatement());\n this.match(\"SEMI\");\n }\n return stmts;\n }\n\n parseStatement(): Statement {\n if (this.match(\"EXPLAIN\")) {\n let queryPlan = false;\n if (this.match(\"QUERY\")) {\n this.expect(\"PLAN\");\n queryPlan = true;\n }\n const stmt = this.parseStatement();\n return { type: \"explain\", queryPlan, statement: stmt };\n }\n\n if (this.check(\"WITH\", \"SELECT\")) return this.parseSelectStmt();\n if (this.at(\"SELECT\")) return this.parseSelectStmt();\n\n if (this.check(\"WITH\", \"INSERT\") || this.at(\"INSERT\") || this.at(\"REPLACE\")) {\n return this.parseInsertStmt();\n }\n if (this.check(\"WITH\", \"UPDATE\") || this.at(\"UPDATE\")) return this.parseUpdateStmt();\n if (this.check(\"WITH\", \"DELETE\") || this.at(\"DELETE\")) return this.parseDeleteStmt();\n\n if (this.at(\"CREATE\")) return this.parseCreateStmt();\n if (this.at(\"DROP\")) return this.parseDropStmt();\n if (this.at(\"ALTER\")) return this.parseAlterTableStmt();\n\n if (this.at(\"BEGIN\")) return this.parseBeginStmt();\n if (this.check(\"COMMIT\", \"END\")) return this.parseCommitStmt();\n if (this.at(\"ROLLBACK\")) return this.parseRollbackStmt();\n if (this.at(\"SAVEPOINT\")) return this.parseSavepointStmt();\n if (this.at(\"RELEASE\")) return this.parseReleaseStmt();\n if (this.at(\"PRAGMA\")) return this.parsePragmaStmt();\n\n if (this.at(\"ATTACH\")) return this.parseAttachStmt();\n if (this.at(\"DETACH\")) return this.parseDetachStmt();\n\n if (this.at(\"ANALYZE\")) return this.parseAnalyzeStmt();\n if (this.at(\"REINDEX\")) return this.parseReindexStmt();\n if (this.at(\"VACUUM\")) return this.parseVacuumStmt();\n\n this.syntaxError(`unexpected token ${this.current().kind}`);\n }\n\n private parseAnalyzeStmt(): import(\"../ast/nodes.ts\").AnalyzeStmt {\n this.expect(\"ANALYZE\");\n if (this.at(\"SEMI\") || this.at(\"EOF\")) return { type: \"analyze\", schema: null, name: null };\n const first = this.parseIdent();\n if (this.match(\"DOT\")) {\n return { type: \"analyze\", schema: first, name: this.parseIdent() };\n }\n return { type: \"analyze\", schema: null, name: first };\n }\n\n private parseReindexStmt(): import(\"../ast/nodes.ts\").ReindexStmt {\n this.expect(\"REINDEX\");\n if (this.at(\"SEMI\") || this.at(\"EOF\")) return { type: \"reindex\", schema: null, name: null };\n const first = this.parseIdent();\n if (this.match(\"DOT\")) {\n return { type: \"reindex\", schema: first, name: this.parseIdent() };\n }\n return { type: \"reindex\", schema: null, name: first };\n }\n\n private parseVacuumStmt(): import(\"../ast/nodes.ts\").VacuumStmt {\n this.expect(\"VACUUM\");\n let schema: string | null = null;\n if (this.at(\"IDENT\") || this.at(\"STRING\")) {\n // VACUUM schema_name \u2014 but INTO starts with keyword\n if (!this.at(\"INTO\")) schema = this.parseIdent();\n }\n let into: string | null = null;\n if (this.match(\"INTO\")) {\n into = this.at(\"STRING\") ? String(this.advance().value) : this.parseIdent();\n }\n return { type: \"vacuum\", schema, into };\n }\n\n private parseWithClause(): WithClause {\n this.expect(\"WITH\");\n const recursive = this.match(\"RECURSIVE\");\n const ctes: Cte[] = [];\n do {\n const name = this.parseIdent();\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n this.expect(\"AS\");\n if (this.match(\"NOT\")) this.expect(\"MATERIALIZED\", \"expected MATERIALIZED after NOT\");\n else this.match(\"MATERIALIZED\");\n this.expect(\"LPAREN\");\n const select = this.at(\"VALUES\") ? this.parseValuesAsSelect() : this.parseSelectCore();\n this.expect(\"RPAREN\");\n ctes.push({ name, columns, select });\n } while (this.match(\"COMMA\"));\n return { recursive, ctes };\n }\n\n private parseOptionalWith(): WithClause | null {\n return this.at(\"WITH\") ? this.parseWithClause() : null;\n }\n\n // \u2500\u2500 SELECT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n parseSelectStmt(): SelectStmt {\n const withClause = this.parseOptionalWith();\n const select = this.parseSelectCore();\n select.with = withClause;\n return select;\n }\n\n private parseSelectCore(): SelectStmt {\n this.expect(\"SELECT\");\n const distinct = this.match(\"DISTINCT\");\n this.match(\"ALL\");\n\n if (this.at(\"FROM\")) {\n throw new SqliteError('near \"FROM\": syntax error', \"syntax\");\n }\n const columns = this.parseResultColumns();\n let from: FromItem | null = null;\n if (this.match(\"FROM\")) {\n from = this.parseFromItem();\n }\n\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n\n const groupBy: Expr[] = [];\n if (this.match(\"GROUP\")) {\n this.expect(\"BY\");\n do {\n groupBy.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n\n let having: Expr | null = null;\n if (this.match(\"HAVING\")) having = this.parseExpr();\n\n const windows: { name: string; spec: WindowSpec }[] = [];\n if (this.match(\"WINDOW\")) {\n do {\n const name = this.parseIdent();\n this.expect(\"AS\");\n this.expect(\"LPAREN\");\n const spec = this.parseWindowSpec();\n this.expect(\"RPAREN\");\n windows.push({ name, spec });\n } while (this.match(\"COMMA\"));\n }\n\n const orderBy = this.parseOrderBy();\n const limit = this.parseLimit();\n\n const stmt: SelectStmt = {\n type: \"select\",\n with: null,\n distinct,\n columns,\n from,\n where,\n groupBy,\n having,\n windows,\n orderBy,\n limit,\n compound: null,\n };\n\n if (this.check(\"UNION\", \"INTERSECT\", \"EXCEPT\")) {\n stmt.compound = this.parseCompoundTail();\n // ORDER BY and LIMIT following a compound SELECT apply to the entire\n // compound, even though the recursive parser initially attaches them\n // to its right-most arm.\n if (stmt.compound.select.orderBy.length > 0) {\n stmt.orderBy = stmt.compound.select.orderBy;\n stmt.compound.select.orderBy = [];\n }\n if (stmt.compound.select.limit) {\n stmt.limit = stmt.compound.select.limit;\n stmt.compound.select.limit = null;\n }\n }\n\n return stmt;\n }\n\n private parseCompoundTail(): CompoundTail {\n let op: CompoundTail[\"op\"];\n if (this.match(\"UNION\")) {\n op = this.match(\"ALL\") ? \"UNION ALL\" : \"UNION\";\n } else if (this.match(\"INTERSECT\")) {\n op = \"INTERSECT\";\n } else {\n this.expect(\"EXCEPT\");\n op = \"EXCEPT\";\n }\n const select = this.parseSelectCore();\n return { op, select };\n }\n\n private parseResultColumns(): ResultColumn[] {\n const cols: ResultColumn[] = [];\n do {\n if (this.match(\"STAR\")) {\n cols.push({ type: \"star\", table: null });\n } else if (this.check(\"IDENT\") || IDENT_KEYWORDS.has(this.current().kind)) {\n const saved = this.pos;\n const first = this.parseIdent();\n if (this.match(\"DOT\") && this.at(\"STAR\")) {\n this.advance();\n cols.push({ type: \"star\", table: first });\n } else {\n this.pos = saved;\n const expr = this.parseExpr();\n let alias: string | null = null;\n if (this.match(\"AS\")) alias = this.parseIdent();\n else if (\n this.current().kind === \"IDENT\" ||\n (IDENT_KEYWORDS.has(this.current().kind) && !this.isSelectClauseStart())\n ) {\n alias = this.parseIdent();\n }\n cols.push({ type: \"expr\", expr, alias });\n }\n } else {\n const expr = this.parseExpr();\n let alias: string | null = null;\n if (this.match(\"AS\")) alias = this.parseIdent();\n else if (\n this.current().kind === \"IDENT\" ||\n (IDENT_KEYWORDS.has(this.current().kind) && !this.isSelectClauseStart())\n ) {\n alias = this.parseIdent();\n }\n cols.push({ type: \"expr\", expr, alias });\n }\n } while (this.match(\"COMMA\"));\n return cols;\n }\n\n private isSelectClauseStart(): boolean {\n return this.check(\n \"FROM\",\n \"WHERE\",\n \"GROUP\",\n \"HAVING\",\n \"WINDOW\",\n \"ORDER\",\n \"LIMIT\",\n \"UNION\",\n \"INTERSECT\",\n \"EXCEPT\",\n \"COMMA\",\n \"SEMI\",\n \"EOF\",\n \"RPAREN\",\n );\n }\n\n private parseFromItem(): FromItem {\n let left = this.parseFromPrimary();\n while (true) {\n if (this.match(\"COMMA\")) {\n const right = this.parseFromPrimary();\n left = this.makeJoin(left, right, \"CROSS\", null, null);\n continue;\n }\n const joinInfo = this.parseJoinOp();\n if (!joinInfo) break;\n const right = this.parseFromPrimary();\n let on: Expr | null = null;\n let using: string[] | null = null;\n if (joinInfo.natural) {\n using = [];\n } else if (this.match(\"ON\")) {\n on = this.parseExpr();\n } else if (this.match(\"USING\")) {\n this.expect(\"LPAREN\");\n using = [];\n do {\n using.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n } else if (joinInfo.type !== \"CROSS\" && joinInfo.type !== \"INNER\") {\n this.syntaxError(\"expected ON or USING after JOIN\");\n }\n left = this.makeJoin(left, right, joinInfo.type, on, using);\n }\n return left;\n }\n\n private makeJoin(\n left: FromItem,\n right: FromItem,\n joinType: JoinFrom[\"joinType\"],\n on: Expr | null,\n using: string[] | null,\n ): JoinFrom {\n return { type: \"join\", left, right, joinType, on, using };\n }\n\n private parseJoinOp(): { type: JoinFrom[\"joinType\"]; natural: boolean } | null {\n const natural = this.match(\"NATURAL\");\n if (this.match(\"CROSS\")) {\n this.expect(\"JOIN\");\n return { type: \"CROSS\", natural: false };\n }\n let type: JoinFrom[\"joinType\"] = \"INNER\";\n if (this.match(\"INNER\")) type = \"INNER\";\n else if (this.match(\"LEFT\")) type = \"LEFT\";\n else if (this.match(\"RIGHT\")) type = \"RIGHT\";\n else if (this.match(\"FULL\")) type = \"FULL\";\n if (type !== \"INNER\" || this.at(\"OUTER\") || this.at(\"JOIN\")) {\n this.match(\"OUTER\");\n if (!this.match(\"JOIN\")) return null;\n return { type, natural };\n }\n if (this.match(\"JOIN\")) return { type: \"INNER\", natural };\n if (natural) this.syntaxError(\"expected JOIN after NATURAL\");\n return null;\n }\n\n private parseFromPrimary(): FromItem {\n if (this.match(\"LPAREN\")) {\n if (this.at(\"SELECT\") || this.at(\"WITH\") || this.at(\"VALUES\")) {\n const select = this.at(\"SELECT\") || this.at(\"WITH\") ? this.parseSelectStmt() : this.parseValuesAsSelect();\n this.expect(\"RPAREN\");\n const alias = this.optionalAlias() ?? (this.syntaxError(\"subquery in FROM requires an alias\") as never);\n return { type: \"subquery\", select, alias };\n }\n const item = this.parseFromItem();\n this.expect(\"RPAREN\");\n const alias = this.optionalAlias();\n if (alias && item.type === \"table\") item.alias = alias;\n return item;\n }\n\n const qname = this.parseQualifiedTableName();\n if (this.match(\"LPAREN\")) {\n const name = qname.name;\n const args: Expr[] = [];\n if (!this.at(\"RPAREN\")) {\n do {\n args.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n this.expect(\"RPAREN\");\n const alias = this.optionalAlias();\n return { type: \"table_func\", name, args, alias };\n }\n\n const alias = this.optionalAlias();\n if (this.match(\"INDEXED\")) {\n this.expect(\"BY\");\n this.parseIdent(); // index hint \u2014 planner is a no-op\n } else if (this.match(\"NOT\") && this.at(\"INDEXED\")) {\n this.advance(); // INDEXED\n }\n return {\n type: \"table\",\n schema: qname.schema,\n name: qname.name,\n alias,\n } satisfies TableRef;\n }\n\n private parseValuesAsSelect(): SelectStmt {\n this.expect(\"VALUES\");\n const rows: Expr[][] = [];\n do {\n this.expect(\"LPAREN\");\n const row: Expr[] = [];\n do {\n row.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n rows.push(row);\n } while (this.match(\"COMMA\"));\n\n const selectFor = (row: Expr[]): SelectStmt => ({\n type: \"select\",\n with: null,\n distinct: false,\n columns: row.map((expr) => ({ type: \"expr\" as const, expr, alias: null })),\n from: null,\n where: null,\n groupBy: [],\n having: null,\n windows: [],\n orderBy: [],\n limit: null,\n compound: null,\n });\n const result = selectFor(rows[0] ?? []);\n let current = result;\n for (const row of rows.slice(1)) {\n current.compound = { op: \"UNION ALL\", select: selectFor(row) };\n current = current.compound.select;\n }\n if (this.check(\"UNION\", \"INTERSECT\", \"EXCEPT\")) {\n current.compound = this.parseCompoundTail();\n }\n return result;\n }\n\n private parseOrderBy(): OrderByItem[] {\n if (!this.match(\"ORDER\")) return [];\n this.expect(\"BY\");\n const items: OrderByItem[] = [];\n do {\n const expr = this.parseExpr();\n let dir: \"ASC\" | \"DESC\" = \"ASC\";\n if (this.match(\"ASC\")) dir = \"ASC\";\n else if (this.match(\"DESC\")) dir = \"DESC\";\n let nulls: \"FIRST\" | \"LAST\" | null = null;\n if (this.match(\"NULLS\")) {\n if (this.match(\"FIRST\")) nulls = \"FIRST\";\n else if (this.match(\"LAST\")) nulls = \"LAST\";\n else this.syntaxError(\"expected FIRST or LAST after NULLS\");\n }\n items.push({ expr, dir, nulls });\n } while (this.match(\"COMMA\"));\n return items;\n }\n\n private parseLimit(): LimitClause | null {\n if (!this.match(\"LIMIT\")) return null;\n const first = this.parseExpr();\n if (this.match(\"OFFSET\")) {\n return { limit: first, offset: this.parseExpr() };\n }\n if (this.match(\"COMMA\")) {\n const limit = this.parseExpr();\n return { limit, offset: first };\n }\n let offset: Expr | null = null;\n if (this.match(\"OFFSET\")) offset = this.parseExpr();\n return { limit: first, offset };\n }\n\n // \u2500\u2500 INSERT / REPLACE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseInsertStmt(): InsertStmt {\n const withClause = this.parseOptionalWith();\n let mode: InsertStmt[\"mode\"] = \"insert\";\n\n if (this.match(\"REPLACE\")) {\n mode = \"replace\";\n } else {\n this.expect(\"INSERT\");\n const orAction = this.parseOrConflict();\n if (orAction === \"REPLACE\") mode = \"insert_or_replace\";\n else if (orAction === \"IGNORE\") mode = \"insert_or_ignore\";\n else if (orAction === \"ABORT\") mode = \"insert_or_abort\";\n else if (orAction === \"ROLLBACK\") mode = \"insert_or_rollback\";\n else if (orAction === \"FAIL\") mode = \"insert_or_fail\";\n }\n\n this.expect(\"INTO\");\n const table = this.parseTableName();\n\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n\n let values: Expr[][] | null = null;\n let select: SelectStmt | null = null;\n\n if (this.match(\"VALUES\")) {\n values = [];\n do {\n this.expect(\"LPAREN\");\n const row: Expr[] = [];\n do {\n row.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n values.push(row);\n } while (this.match(\"COMMA\"));\n } else if (this.at(\"SELECT\") || this.at(\"WITH\")) {\n select = this.parseSelectStmt();\n } else if (this.at(\"DEFAULT\")) {\n this.advance();\n this.expect(\"VALUES\");\n columns = [];\n values = [[]];\n } else {\n this.syntaxError(\"expected VALUES, SELECT, or DEFAULT\");\n }\n\n const upsert = this.parseUpsertClause();\n const returning = this.parseReturning();\n\n return {\n type: \"insert\",\n with: withClause,\n mode,\n table,\n columns,\n values,\n select,\n upsert,\n returning,\n };\n }\n\n private parseUpsertClause(): UpsertClause | null {\n if (!this.match(\"ON\")) return null;\n this.expect(\"CONFLICT\");\n let targetColumns: string[] | null = null;\n let targetExprs: Expr[] | null = null;\n if (this.match(\"LPAREN\")) {\n targetColumns = [];\n targetExprs = [];\n do {\n const expr = this.parseExprPrec(PREC.ADD);\n targetExprs.push(expr);\n targetColumns.push(expr.type === \"column\" ? expr.name : \"\");\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n let targetWhere: Expr | null = null;\n if (this.match(\"WHERE\")) targetWhere = this.parseExpr();\n\n this.expect(\"DO\");\n if (this.match(\"NOTHING\")) {\n return { targetColumns, targetExprs, targetWhere, action: \"nothing\" };\n }\n this.expect(\"UPDATE\");\n this.expect(\"SET\");\n const set = this.parseSetItems();\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n return { targetColumns, targetExprs, targetWhere, action: { set, where } };\n }\n\n private parseSetItems(): SetItem[] {\n const items: SetItem[] = [];\n do {\n const columns = [this.parseIdent()];\n this.expect(\"EQ\");\n const expr = this.parseExpr();\n items.push({ columns, expr });\n } while (this.match(\"COMMA\"));\n return items;\n }\n\n private parseReturning(): ResultColumn[] {\n if (!this.match(\"RETURNING\")) return [];\n return this.parseResultColumns();\n }\n\n // \u2500\u2500 UPDATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseUpdateStmt(): UpdateStmt {\n const withClause = this.parseOptionalWith();\n this.expect(\"UPDATE\");\n const or = this.mapUpdateOr(this.parseOrConflict());\n const table = this.parseTableName();\n const alias = this.optionalAlias();\n this.expect(\"SET\");\n const set = this.parseSetItems();\n let from: FromItem | null = null;\n if (this.match(\"FROM\")) from = this.parseFromItem();\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n const returning = this.parseReturning();\n return { type: \"update\", with: withClause, or, table, alias, set, from, where, returning };\n }\n\n // \u2500\u2500 DELETE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseDeleteStmt(): DeleteStmt {\n const withClause = this.parseOptionalWith();\n this.expect(\"DELETE\");\n this.expect(\"FROM\");\n const table = this.parseTableName();\n const alias = this.optionalAlias();\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n const returning = this.parseReturning();\n return { type: \"delete\", with: withClause, table, alias, where, returning };\n }\n\n // \u2500\u2500 CREATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseCreateStmt(): Statement {\n this.expect(\"CREATE\");\n const temp = this.match(\"TEMP\") || this.match(\"TEMPORARY\");\n if (this.match(\"VIRTUAL\")) {\n this.expect(\"TABLE\");\n return this.parseCreateVirtualTable();\n }\n if (this.match(\"TRIGGER\")) return this.parseCreateTrigger(temp);\n if (this.match(\"UNIQUE\")) {\n this.expect(\"INDEX\");\n return this.parseCreateIndex(true, temp);\n }\n if (this.match(\"INDEX\")) return this.parseCreateIndex(false, temp);\n if (this.match(\"VIEW\")) return this.parseCreateView(temp);\n this.expect(\"TABLE\");\n return this.parseCreateTable(temp);\n }\n\n private parseCreateVirtualTable(): CreateVirtualTableStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseTableName();\n this.expect(\"USING\");\n const module = this.parseIdent();\n const moduleArgs: string[] = [];\n if (this.match(\"LPAREN\")) {\n if (!this.at(\"RPAREN\")) {\n do {\n moduleArgs.push(this.parseVirtualTableArg());\n } while (this.match(\"COMMA\"));\n }\n this.expect(\"RPAREN\");\n }\n return { type: \"create_virtual_table\", ifNotExists, name, module, moduleArgs };\n }\n\n /** One comma-separated CREATE VIRTUAL TABLE module argument (FTS options, columns, \u2026). */\n private parseVirtualTableArg(): string {\n // STRING alone\n if (this.at(\"STRING\")) {\n const value = String(this.current().literal);\n this.advance();\n return value;\n }\n\n // IDENT [UNINDEXED|NOTINDEXED] | IDENT = value\n const start = this.parseIdentOrQuoted();\n if (this.match(\"EQ\") || this.match(\"EQEQ\")) {\n const value = this.parseVirtualTableOptionValue();\n return `${start}=${value}`;\n }\n // Optional UNINDEXED / NOTINDEXED / type names\n const extras: string[] = [];\n while (this.at(\"IDENT\") || this.at(\"STRING\")) {\n // Stop before next comma-separated arg would need peek of COMMA/RPAREN \u2014 only consume trailing idents\n if (this.at(\"IDENT\")) {\n const upper = this.current().value.toUpperCase();\n if (\n upper === \"UNINDEXED\" ||\n upper === \"NOTINDEXED\" ||\n upper === \"TEXT\" ||\n upper === \"INTEGER\" ||\n upper === \"REAL\" ||\n upper === \"BLOB\" ||\n upper === \"NUMERIC\"\n ) {\n extras.push(this.current().value);\n this.advance();\n continue;\n }\n }\n break;\n }\n return extras.length ? `${start} ${extras.join(\" \")}` : start;\n }\n\n private parseIdentOrQuoted(): string {\n if (this.at(\"STRING\")) {\n // quoted identifier written as string in some dialects\n const value = String(this.current().literal);\n this.advance();\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n }\n return this.parseIdent();\n }\n\n private parseVirtualTableOptionValue(): string {\n if (this.at(\"STRING\")) {\n const value = String(this.current().literal);\n this.advance();\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n }\n if (this.at(\"NUMBER\")) {\n const value = this.current().value;\n this.advance();\n return value;\n }\n if (this.at(\"IDENT\")) {\n return this.parseIdent();\n }\n // Empty string after content=\n return \"''\";\n }\n\n private parseIfNotExists(): boolean {\n if (!this.match(\"IF\")) return false;\n this.expect(\"NOT\");\n this.expect(\"EXISTS\");\n return true;\n }\n\n private parseIfExists(): boolean {\n if (!this.match(\"IF\")) return false;\n this.expect(\"EXISTS\");\n return true;\n }\n\n private mapUpdateOr(action: ConflictAction | null): UpdateStmt[\"or\"] {\n if (!action) return null;\n switch (action) {\n case \"ROLLBACK\":\n return \"rollback\";\n case \"ABORT\":\n return \"abort\";\n case \"FAIL\":\n return \"fail\";\n case \"IGNORE\":\n return \"ignore\";\n case \"REPLACE\":\n return \"replace\";\n }\n }\n\n private parseCreateTable(temp: boolean): CreateTableStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseTableName();\n\n if (this.match(\"AS\")) {\n const asSelect = this.parseSelectStmt();\n return {\n type: \"create_table\",\n ifNotExists,\n temp,\n name,\n columns: [],\n constraints: [],\n asSelect,\n withoutRowid: false,\n strict: false,\n };\n }\n\n this.expect(\"LPAREN\");\n const columns: ColumnDef[] = [];\n const constraints: TableConstraint[] = [];\n do {\n if (this.at(\"PRIMARY\") || this.at(\"UNIQUE\") || this.at(\"CHECK\") || this.at(\"FOREIGN\") || this.at(\"CONSTRAINT\")) {\n constraints.push(this.parseTableConstraint());\n } else {\n columns.push(this.parseColumnDef());\n }\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n let withoutRowid = false;\n let strict = false;\n while (!this.at(\"SEMI\") && !this.at(\"EOF\")) {\n if (this.match(\"WITHOUT\")) {\n const word = this.parseIdent();\n if (word.toUpperCase() !== \"ROWID\") this.syntaxError(\"expected ROWID after WITHOUT\");\n withoutRowid = true;\n } else {\n const word = this.parseIdent();\n if (word.toUpperCase() !== \"STRICT\") this.syntaxError(`unexpected table option ${word}`);\n strict = true;\n }\n this.match(\"COMMA\");\n }\n\n return {\n type: \"create_table\",\n ifNotExists,\n temp,\n name,\n columns,\n constraints,\n asSelect: null,\n withoutRowid,\n strict,\n };\n }\n\n private parseColumnDef(): ColumnDef {\n const name = this.parseIdent();\n let typeName: string | null = null;\n if (this.current().kind === \"IDENT\" || IDENT_KEYWORDS.has(this.current().kind)) {\n if (\n !this.at(\"CONSTRAINT\") &&\n !this.at(\"PRIMARY\") &&\n !this.at(\"NOT\") &&\n !this.at(\"UNIQUE\") &&\n !this.at(\"CHECK\") &&\n !this.at(\"DEFAULT\") &&\n !this.at(\"REFERENCES\") &&\n !this.at(\"COLLATE\") &&\n !this.at(\"GENERATED\") &&\n !this.at(\"COMMA\") &&\n !this.at(\"RPAREN\")\n ) {\n typeName = this.parseTypeName();\n }\n }\n const constraints: ColumnConstraint[] = [];\n while (this.isColumnConstraintStart()) {\n constraints.push(this.parseColumnConstraint());\n }\n return { name, typeName, constraints };\n }\n\n /** Type names may include optional precision/scale: VARCHAR(10), DECIMAL(10,2). */\n private parseTypeName(): string {\n const base = this.parseIdent();\n if (!this.match(\"LPAREN\")) return base;\n const parts: string[] = [];\n do {\n if (this.at(\"NUMBER\") || this.at(\"PLUS\") || this.at(\"MINUS\")) {\n let sign = \"\";\n if (this.match(\"PLUS\")) sign = \"+\";\n else if (this.match(\"MINUS\")) sign = \"-\";\n const number = this.advance();\n parts.push(`${sign}${number.value}`);\n } else {\n parts.push(this.parseIdent());\n }\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n return `${base}(${parts.join(\",\")})`;\n }\n\n private isColumnConstraintStart(): boolean {\n return this.check(\n \"CONSTRAINT\",\n \"PRIMARY\",\n \"NOT\",\n \"UNIQUE\",\n \"CHECK\",\n \"DEFAULT\",\n \"COLLATE\",\n \"REFERENCES\",\n \"GENERATED\",\n );\n }\n\n private parseColumnConstraint(): ColumnConstraint {\n this.match(\"CONSTRAINT\");\n if (this.current().kind === \"IDENT\" || IDENT_KEYWORDS.has(this.current().kind)) {\n const next = this.peek();\n if (\n next.kind === \"PRIMARY\" ||\n next.kind === \"UNIQUE\" ||\n next.kind === \"CHECK\" ||\n next.kind === \"DEFAULT\" ||\n next.kind === \"NOT\" ||\n next.kind === \"REFERENCES\"\n ) {\n this.parseIdent(); // constraint name, discarded for column level\n }\n }\n if (this.match(\"PRIMARY\")) {\n this.expect(\"KEY\");\n let order: \"ASC\" | \"DESC\" | null = null;\n if (this.match(\"ASC\")) order = \"ASC\";\n else if (this.match(\"DESC\")) order = \"DESC\";\n const autoincrement = this.match(\"AUTOINCREMENT\");\n const conflict = this.parseOnConflict();\n return { type: \"primary_key\", order, autoincrement, conflict };\n }\n if (this.match(\"NOT\")) {\n this.expect(\"NULL\");\n const conflict = this.parseOnConflict();\n return { type: \"not_null\", conflict };\n }\n if (this.match(\"UNIQUE\")) {\n const conflict = this.parseOnConflict();\n return { type: \"unique\", conflict };\n }\n if (this.match(\"CHECK\")) {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"RPAREN\");\n return { type: \"check\", expr };\n }\n if (this.match(\"DEFAULT\")) {\n const expr = this.parseExpr();\n return { type: \"default\", expr };\n }\n if (this.match(\"COLLATE\")) {\n const name = this.parseIdent();\n return { type: \"collate\", name };\n }\n if (this.match(\"REFERENCES\")) {\n return this.parseReferencesConstraint();\n }\n if (this.match(\"GENERATED\")) {\n const always = this.parseIdent();\n if (always.toUpperCase() !== \"ALWAYS\") this.syntaxError(\"expected ALWAYS after GENERATED\");\n this.expect(\"AS\");\n return this.parseGeneratedConstraint();\n }\n if (this.match(\"AS\") && this.at(\"LPAREN\")) {\n return this.parseGeneratedConstraint();\n }\n this.syntaxError(\"expected column constraint\");\n }\n\n private parseGeneratedConstraint(): ColumnConstraint {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"RPAREN\");\n let stored = false;\n if (this.current().kind === \"IDENT\" || this.at(\"VIRTUAL\")) {\n const word = this.parseIdent().toUpperCase();\n if (word === \"STORED\") stored = true;\n else if (word === \"VIRTUAL\") stored = false;\n else this.syntaxError(\"expected STORED or VIRTUAL after generated column expression\");\n }\n return { type: \"generated\", expr, stored };\n }\n\n private parseReferencesConstraint(): ColumnConstraint {\n const table = this.parseTableName();\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n const { onDelete, onUpdate } = this.parseFkActions();\n const { deferrable, initiallyDeferred } = this.parseDeferrable();\n return { type: \"references\", table, columns, onDelete, onUpdate, deferrable, initiallyDeferred };\n }\n\n private parseTableConstraint(): TableConstraint {\n let name: string | null = null;\n if (this.match(\"CONSTRAINT\")) {\n name = this.parseIdent();\n }\n if (this.match(\"PRIMARY\")) {\n this.expect(\"KEY\");\n this.expect(\"LPAREN\");\n const columns = this.parseIndexedColumns();\n this.expect(\"RPAREN\");\n const conflict = this.parseOnConflict();\n return { type: \"primary_key\", columns, conflict };\n }\n if (this.match(\"UNIQUE\")) {\n this.expect(\"LPAREN\");\n const columns = this.parseIndexedColumns();\n this.expect(\"RPAREN\");\n const conflict = this.parseOnConflict();\n return { type: \"unique\", columns, conflict, name };\n }\n if (this.match(\"CHECK\")) {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"RPAREN\");\n return { type: \"check\", expr, name };\n }\n if (this.match(\"FOREIGN\")) {\n this.expect(\"KEY\");\n this.expect(\"LPAREN\");\n const columns: string[] = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n this.expect(\"REFERENCES\");\n const refTable = this.parseTableName();\n let refColumns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n refColumns = [];\n do {\n refColumns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n const { onDelete, onUpdate } = this.parseFkActions();\n const { deferrable, initiallyDeferred } = this.parseDeferrable();\n return {\n type: \"foreign_key\",\n columns,\n refTable,\n refColumns,\n onDelete,\n onUpdate,\n name,\n deferrable,\n initiallyDeferred,\n };\n }\n this.syntaxError(\"expected table constraint\");\n }\n\n private parseIndexedColumns(): IndexedColumn[] {\n const cols: IndexedColumn[] = [];\n do {\n const expr = this.parseExprPrec(PREC.ADD);\n let collate: string | null = null;\n let inner = expr;\n if (inner.type === \"collate\") {\n collate = inner.collation;\n inner = inner.expr;\n }\n if (this.match(\"COLLATE\")) collate = this.parseIdent();\n let order: \"ASC\" | \"DESC\" | null = null;\n if (this.match(\"ASC\")) order = \"ASC\";\n else if (this.match(\"DESC\")) order = \"DESC\";\n if (inner.type === \"column\" && inner.table === null) {\n cols.push({ name: inner.name, collate, order });\n } else {\n cols.push({ name: \"\", collate, order, expr: inner });\n }\n } while (this.match(\"COMMA\"));\n return cols;\n }\n\n private parseOnConflict(): ConflictAction | null {\n if (!this.match(\"ON\")) return null;\n this.expect(\"CONFLICT\");\n return this.parseConflictAction();\n }\n\n private parseConflictAction(): ConflictAction {\n if (this.match(\"ROLLBACK\")) return \"ROLLBACK\";\n if (this.match(\"ABORT\")) return \"ABORT\";\n if (this.match(\"FAIL\")) return \"FAIL\";\n if (this.match(\"IGNORE\")) return \"IGNORE\";\n if (this.match(\"REPLACE\")) return \"REPLACE\";\n this.syntaxError(\"expected conflict action\");\n }\n\n private parseFkAction(kind: \"DELETE\" | \"UPDATE\"): FkAction | null {\n if (!this.match(\"ON\")) return null;\n this.expect(kind);\n if (this.match(\"SET\")) {\n if (this.match(\"NULL\")) return \"SET NULL\";\n this.expect(\"DEFAULT\");\n return \"SET DEFAULT\";\n }\n if (this.match(\"CASCADE\")) return \"CASCADE\";\n if (this.match(\"RESTRICT\")) return \"RESTRICT\";\n if (this.match(\"NO\")) {\n this.expect(\"ACTION\");\n return \"NO ACTION\";\n }\n this.syntaxError(`expected ON ${kind} action`);\n }\n\n private parseFkActions(): { onDelete: FkAction | null; onUpdate: FkAction | null } {\n let onDelete: FkAction | null = null;\n let onUpdate: FkAction | null = null;\n while (this.at(\"ON\")) {\n if (this.peek().kind === \"DELETE\") onDelete = this.parseFkAction(\"DELETE\");\n else if (this.peek().kind === \"UPDATE\") onUpdate = this.parseFkAction(\"UPDATE\");\n else this.syntaxError(\"expected ON DELETE or ON UPDATE\");\n }\n return { onDelete, onUpdate };\n }\n\n private parseDeferrable(): { deferrable: boolean; initiallyDeferred: boolean } {\n let deferrable = false;\n let initiallyDeferred = false;\n if (this.match(\"NOT\")) {\n this.expect(\"DEFERRABLE\");\n } else if (this.match(\"DEFERRABLE\")) {\n deferrable = true;\n }\n if (this.match(\"INITIALLY\")) {\n if (this.match(\"DEFERRED\")) initiallyDeferred = true;\n else {\n this.expect(\"IMMEDIATE\");\n initiallyDeferred = false;\n }\n }\n return { deferrable, initiallyDeferred: deferrable && initiallyDeferred };\n }\n\n private parseOrConflict(): ConflictAction | null {\n if (!this.match(\"OR\")) return null;\n return this.parseConflictAction();\n }\n\n private parseCreateIndex(unique: boolean, _temp: boolean): CreateIndexStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseIdent();\n this.expect(\"ON\");\n const table = this.parseTableName();\n this.expect(\"LPAREN\");\n const columns = this.parseIndexedColumns();\n this.expect(\"RPAREN\");\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n return { type: \"create_index\", unique, ifNotExists, name, table, columns, where };\n }\n\n private parseCreateView(temp: boolean): CreateViewStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseIdent();\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n this.expect(\"AS\");\n const select = this.parseSelectStmt();\n return { type: \"create_view\", ifNotExists, temp, name, columns, select };\n }\n\n private parseCreateTrigger(temp: boolean): CreateTriggerStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseTableName();\n let timing: CreateTriggerStmt[\"timing\"];\n if (this.match(\"BEFORE\")) timing = \"BEFORE\";\n else if (this.match(\"AFTER\")) timing = \"AFTER\";\n else if (this.match(\"INSTEAD\")) {\n this.expect(\"OF\");\n timing = \"INSTEAD\";\n } else {\n this.syntaxError(\"expected BEFORE, AFTER, or INSTEAD OF\");\n }\n\n let event: CreateTriggerStmt[\"event\"];\n if (this.match(\"INSERT\")) event = \"INSERT\";\n else if (this.match(\"DELETE\")) event = \"DELETE\";\n else if (this.match(\"UPDATE\")) event = \"UPDATE\";\n else this.syntaxError(\"expected INSERT, DELETE, or UPDATE\");\n\n let updateColumns: string[] | null = null;\n if (event === \"UPDATE\" && this.match(\"OF\")) {\n updateColumns = [];\n do {\n updateColumns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n }\n\n this.expect(\"ON\");\n const table = this.parseTableName();\n\n let forEachRow = false;\n if (this.match(\"FOR\")) {\n this.expect(\"EACH\");\n this.expect(\"ROW\");\n forEachRow = true;\n }\n\n let when: Expr | null = null;\n if (this.match(\"WHEN\")) when = this.parseExpr();\n\n this.expect(\"BEGIN\");\n const body = this.parseTriggerBody();\n\n return {\n type: \"create_trigger\",\n ifNotExists,\n temp,\n name,\n timing,\n event,\n table,\n updateColumns,\n forEachRow,\n when,\n body,\n };\n }\n\n private parseTriggerBody(): Statement[] {\n const body: Statement[] = [];\n while (!this.at(\"END\") && !this.at(\"EOF\")) {\n if (this.match(\"SEMI\")) continue;\n body.push(this.parseStatement());\n this.match(\"SEMI\");\n }\n this.expect(\"END\");\n return body;\n }\n\n // \u2500\u2500 DROP \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseDropStmt(): Statement {\n this.expect(\"DROP\");\n if (this.match(\"TABLE\")) return this.parseDropTable();\n if (this.match(\"INDEX\")) return this.parseDropIndex();\n if (this.match(\"VIEW\")) return this.parseDropView();\n if (this.match(\"TRIGGER\")) return this.parseDropTrigger();\n this.syntaxError(\"expected TABLE, INDEX, or VIEW after DROP\");\n }\n\n private parseDropTable(): DropTableStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseTableName();\n return { type: \"drop_table\", ifExists, name };\n }\n\n private parseDropIndex(): DropIndexStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseIdent();\n return { type: \"drop_index\", ifExists, name };\n }\n\n private parseDropView(): DropViewStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseIdent();\n return { type: \"drop_view\", ifExists, name };\n }\n\n private parseDropTrigger(): DropTriggerStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseTableName();\n return { type: \"drop_trigger\", ifExists, name };\n }\n\n // \u2500\u2500 ALTER TABLE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseAlterTableStmt(): AlterTableStmt {\n this.expect(\"ALTER\");\n this.expect(\"TABLE\");\n const table = this.parseTableName();\n if (this.match(\"RENAME\")) {\n if (this.match(\"TO\")) {\n const newName = this.parseTableName();\n return { type: \"alter_table\", table, action: { kind: \"rename_table\", newName } };\n }\n if (this.match(\"COLUMN\")) {\n const oldName = this.parseIdent();\n this.expect(\"TO\");\n const newName = this.parseIdent();\n return { type: \"alter_table\", table, action: { kind: \"rename_column\", oldName, newName } };\n }\n this.syntaxError(\"expected TO or COLUMN after RENAME\");\n }\n if (this.match(\"ADD\")) {\n this.match(\"COLUMN\");\n const column = this.parseColumnDef();\n return { type: \"alter_table\", table, action: { kind: \"add_column\", column } };\n }\n if (this.match(\"DROP\")) {\n this.match(\"COLUMN\");\n const name = this.parseIdent();\n return { type: \"alter_table\", table, action: { kind: \"drop_column\", name } };\n }\n this.syntaxError(\"expected RENAME, ADD, or DROP after ALTER TABLE\");\n }\n\n // \u2500\u2500 Transactions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseBeginStmt(): BeginStmt {\n this.expect(\"BEGIN\");\n let mode: BeginStmt[\"mode\"] = null;\n if (this.match(\"DEFERRED\")) mode = \"DEFERRED\";\n else if (this.match(\"IMMEDIATE\")) mode = \"IMMEDIATE\";\n else if (this.match(\"EXCLUSIVE\")) mode = \"EXCLUSIVE\";\n this.match(\"TRANSACTION\");\n return { type: \"begin\", mode };\n }\n\n private parseCommitStmt(): CommitStmt {\n if (this.at(\"END\")) this.advance();\n else this.expect(\"COMMIT\");\n this.match(\"TRANSACTION\");\n return { type: \"commit\" };\n }\n\n private parseRollbackStmt(): RollbackStmt {\n this.expect(\"ROLLBACK\");\n this.match(\"TRANSACTION\");\n let savepoint: string | null = null;\n if (this.match(\"TO\")) {\n this.match(\"SAVEPOINT\");\n savepoint = this.parseIdent();\n }\n return { type: \"rollback\", savepoint };\n }\n\n private parseSavepointStmt(): SavepointStmt {\n this.expect(\"SAVEPOINT\");\n const name = this.parseIdent();\n return { type: \"savepoint\", name };\n }\n\n private parseReleaseStmt(): ReleaseStmt {\n this.expect(\"RELEASE\");\n this.match(\"SAVEPOINT\");\n const name = this.parseIdent();\n return { type: \"release\", name };\n }\n\n // \u2500\u2500 PRAGMA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parsePragmaStmt(): PragmaStmt {\n this.expect(\"PRAGMA\");\n const name = this.parseIdent();\n if (this.match(\"EQ\")) {\n return { type: \"pragma\", name, value: this.parseExpr() };\n }\n if (this.match(\"LPAREN\")) {\n let value: Expr | null = null;\n if (!this.at(\"RPAREN\")) value = this.parseExpr();\n this.expect(\"RPAREN\");\n return { type: \"pragma\", name, value };\n }\n return { type: \"pragma\", name, value: null };\n }\n\n // \u2500\u2500 Expressions (Pratt / precedence climbing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n parseExpr(): Expr {\n return this.parseExprPrec(PREC.OR);\n }\n\n private parseExprPrec(minPrec: number): Expr {\n let left = this.parseUnaryExpr();\n\n while (true) {\n left = this.parsePostfix(left);\n\n if (this.at(\"NOT\") && PREC.IS_IN_LIKE >= minPrec) {\n const n = this.peek();\n if (n.kind === \"IN\") {\n this.advance();\n this.advance();\n left = this.parseInRhs(left, true);\n continue;\n }\n if (n.kind === \"LIKE\") {\n this.advance();\n this.advance();\n left = this.parseLikeRhs(left, true, \"LIKE\");\n continue;\n }\n if (n.kind === \"GLOB\") {\n this.advance();\n this.advance();\n left = this.parseLikeRhs(left, true, \"GLOB\");\n continue;\n }\n if (n.kind === \"BETWEEN\") {\n this.advance();\n this.advance();\n const lower = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n this.expect(\"AND\");\n const upper = this.parseExprPrec(PREC.AND + 1);\n left = { type: \"between\", not: true, expr: left, lower, upper };\n continue;\n }\n }\n\n if (this.at(\"IS\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n if (this.at(\"NOT\") && this.peek().kind === \"DISTINCT\") {\n this.advance();\n this.advance();\n this.expect(\"FROM\");\n const right = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = { type: \"binary\", op: \"IS NOT DISTINCT FROM\", left, right };\n continue;\n }\n if (this.at(\"DISTINCT\")) {\n this.advance();\n this.expect(\"FROM\");\n const right = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = { type: \"binary\", op: \"IS DISTINCT FROM\", left, right };\n continue;\n }\n const not = this.match(\"NOT\");\n if (this.match(\"TRUE\")) {\n left = { type: \"is_bool\", expr: left, not, sense: true };\n continue;\n }\n if (this.match(\"FALSE\")) {\n left = { type: \"is_bool\", expr: left, not, sense: false };\n continue;\n }\n const right = this.parseIsRhs();\n left = { type: \"binary\", op: not ? \"IS NOT\" : \"IS\", left, right };\n continue;\n }\n\n if (this.at(\"IN\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n left = this.parseInRhs(left, false);\n continue;\n }\n if (this.at(\"LIKE\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n left = this.parseLikeRhs(left, false, \"LIKE\");\n continue;\n }\n if (this.at(\"GLOB\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n left = this.parseLikeRhs(left, false, \"GLOB\");\n continue;\n }\n if (this.at(\"MATCH\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n const right = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = { type: \"binary\", op: \"MATCH\", left, right };\n continue;\n }\n if (this.at(\"BETWEEN\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n const lower = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n this.expect(\"AND\");\n const upper = this.parseExprPrec(PREC.AND + 1);\n left = { type: \"between\", not: false, expr: left, lower, upper };\n continue;\n }\n\n const bin = this.peekBinaryOp();\n if (!bin || bin.prec < minPrec) break;\n this.advance();\n const right = this.parseExprPrec(bin.prec + 1);\n left = { type: \"binary\", op: bin.op, left, right };\n }\n\n return left;\n }\n\n private peekBinaryOp(): { op: BinaryOp; prec: number } | null {\n const t = this.current();\n switch (t.kind) {\n case \"OR\":\n return { op: \"OR\", prec: PREC.OR };\n case \"AND\":\n return { op: \"AND\", prec: PREC.AND };\n case \"CONCAT\":\n return { op: \"||\", prec: PREC.CONCAT };\n case \"JSON_ARROW\":\n return { op: \"->\", prec: PREC.JSON_ARROW };\n case \"JSON_ARROW2\":\n return { op: \"->>\", prec: PREC.JSON_ARROW };\n case \"PLUS\":\n return { op: \"+\", prec: PREC.ADD };\n case \"MINUS\":\n return { op: \"-\", prec: PREC.ADD };\n case \"STAR\":\n return { op: \"*\", prec: PREC.MUL };\n case \"SLASH\":\n return { op: \"/\", prec: PREC.MUL };\n case \"PERCENT\":\n return { op: \"%\", prec: PREC.MUL };\n case \"LT\":\n return { op: \"<\", prec: PREC.COMPARE };\n case \"LE\":\n return { op: \"<=\", prec: PREC.COMPARE };\n case \"GT\":\n return { op: \">\", prec: PREC.COMPARE };\n case \"GE\":\n return { op: \">=\", prec: PREC.COMPARE };\n case \"EQ\":\n return { op: \"=\", prec: PREC.COMPARE };\n case \"EQEQ\":\n return { op: \"==\", prec: PREC.COMPARE };\n case \"NE\":\n return { op: t.value as \"<>\" | \"!=\", prec: PREC.COMPARE };\n case \"AMP\":\n return { op: \"&\", prec: PREC.BIT_AND };\n case \"PIPE\":\n return { op: \"|\", prec: PREC.BIT_OR };\n case \"LSHIFT\":\n return { op: \"<<\", prec: PREC.SHIFT };\n case \"RSHIFT\":\n return { op: \">>\", prec: PREC.SHIFT };\n default:\n return null;\n }\n }\n\n private parseIsRhs(): Expr {\n if (this.match(\"NULL\")) return { type: \"null\" };\n return this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n }\n\n private parseInRhs(left: Expr, not: boolean): InExpr {\n if (this.match(\"LPAREN\")) {\n if (this.at(\"SELECT\") || this.at(\"WITH\")) {\n const select = this.parseSelectStmt();\n this.expect(\"RPAREN\");\n return { type: \"in\", not, expr: left, values: select };\n }\n const values: Expr[] = [];\n if (!this.at(\"RPAREN\")) {\n do {\n values.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n this.expect(\"RPAREN\");\n return { type: \"in\", not, expr: left, values };\n }\n this.syntaxError(\"expected ( after IN\");\n }\n\n private parseLikeRhs(left: Expr, not: boolean, op: \"LIKE\" | \"GLOB\"): LikeExpr {\n const pattern = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n let escapeExpr: Expr | null = null;\n if (this.match(\"ESCAPE\")) escapeExpr = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n return { type: \"like\", not, op, expr: left, pattern, escape: escapeExpr };\n }\n\n private parsePostfix(expr: Expr): Expr {\n let result = expr;\n while (true) {\n if (this.match(\"COLLATE\")) {\n const collation = this.parseIdent();\n result = { type: \"collate\", expr: result, collation };\n continue;\n }\n if (this.match(\"ISNULL\")) {\n result = { type: \"binary\", op: \"IS\", left: result, right: { type: \"null\" } };\n continue;\n }\n if (this.match(\"NOTNULL\")) {\n result = { type: \"binary\", op: \"IS NOT\", left: result, right: { type: \"null\" } };\n continue;\n }\n break;\n }\n return result;\n }\n\n private parseUnaryExpr(): Expr {\n if (this.match(\"NOT\")) {\n const operand = this.parseUnaryExpr();\n if (operand.type === \"exists\") {\n return { ...operand, not: !operand.not };\n }\n return { type: \"unary\", op: \"NOT\", expr: operand };\n }\n if (this.match(\"PLUS\")) return { type: \"unary\", op: \"+\", expr: this.parseUnaryExpr() };\n if (this.match(\"MINUS\")) return { type: \"unary\", op: \"-\", expr: this.parseUnaryExpr() };\n if (this.match(\"TILDE\")) return { type: \"unary\", op: \"~\", expr: this.parseUnaryExpr() };\n if (this.match(\"EXISTS\")) {\n this.expect(\"LPAREN\");\n const select = this.parseSelectStmt();\n this.expect(\"RPAREN\");\n return { type: \"exists\", not: false, select };\n }\n return this.parsePrimaryExpr();\n }\n\n private parsePrimaryExpr(): Expr {\n const t = this.current();\n\n if (this.match(\"NULL\")) return { type: \"null\" };\n\n if (this.match(\"CASE\")) {\n let base: Expr | null = null;\n if (!this.at(\"WHEN\")) {\n base = this.parseExpr();\n }\n return this.parseCaseExpr(base);\n }\n\n if (this.match(\"CAST\")) {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"AS\");\n const typeName = this.parseTypeName();\n this.expect(\"RPAREN\");\n return { type: \"cast\", expr, typeName };\n }\n\n if (this.at(\"CURRENT_DATE\") || this.at(\"CURRENT_TIME\") || this.at(\"CURRENT_TIMESTAMP\")) {\n const tok = this.advance();\n return { type: \"function\", name: tok.value, distinct: false, args: [], filter: null };\n }\n\n if (this.at(\"NUMBER\")) {\n const tok = this.advance();\n return {\n type: \"literal\",\n value: tok.literal as number | bigint,\n forceReal: tok.forceReal || undefined,\n };\n }\n if (this.at(\"STRING\")) {\n const tok = this.advance();\n return { type: \"literal\", value: tok.literal as string };\n }\n if (this.at(\"BLOB\")) {\n const tok = this.advance();\n return { type: \"literal\", value: tok.literal as Uint8Array };\n }\n\n if (this.at(\"PARAM_POS\")) {\n const tok = this.advance();\n const name = tok.index ?? 1;\n return { type: \"parameter\", name };\n }\n if (this.at(\"PARAM_NAMED\")) {\n const tok = this.advance();\n return { type: \"parameter\", name: tok.value };\n }\n\n if (this.match(\"LPAREN\")) {\n if (this.at(\"SELECT\") || this.at(\"WITH\")) {\n const select = this.parseSelectStmt();\n this.expect(\"RPAREN\");\n return { type: \"subquery\", select };\n }\n if (this.at(\"RPAREN\")) {\n this.syntaxError(\"empty expression\");\n }\n const first = this.parseExpr();\n if (this.match(\"COMMA\")) {\n const values = [first];\n do {\n values.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n return { type: \"row\", values };\n }\n this.expect(\"RPAREN\");\n return first;\n }\n\n if (this.match(\"STAR\")) {\n return { type: \"column\", table: null, name: \"*\" };\n }\n\n if (t.kind === \"IDENT\" || IDENT_KEYWORDS.has(t.kind)) {\n return this.parseIdentOrFunction();\n }\n\n this.syntaxError(`unexpected token ${t.kind} in expression`);\n }\n\n private parseIdentOrFunction(): Expr {\n const name = this.parseIdent();\n if (this.match(\"LPAREN\")) {\n return this.finishCall(name);\n }\n if (this.match(\"DOT\")) {\n const col = this.parseIdent();\n return { type: \"column\", table: name, name: col };\n }\n return { type: \"column\", table: null, name };\n }\n\n private finishCall(name: string): Expr {\n let distinct = false;\n if (this.match(\"DISTINCT\")) distinct = true;\n else this.match(\"ALL\");\n\n let args: Expr[] | \"*\";\n let filter: Expr | null = null;\n\n if (this.match(\"STAR\")) {\n args = \"*\";\n } else {\n args = [];\n if (!this.at(\"RPAREN\")) {\n do {\n (args as Expr[]).push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n }\n this.expect(\"RPAREN\");\n\n if (this.match(\"FILTER\")) {\n this.expect(\"LPAREN\");\n this.expect(\"WHERE\");\n filter = this.parseExpr();\n this.expect(\"RPAREN\");\n }\n\n const upper = name.toUpperCase();\n const argCount = args === \"*\" ? 1 : args.length;\n // min()/max() with 2+ args are scalar; single-arg (or *) forms are aggregates.\n const isAgg = AGGREGATE_FUNCTIONS.has(upper) && !(argCount >= 2 && (upper === \"MIN\" || upper === \"MAX\"));\n\n if (this.match(\"OVER\")) {\n let window: WindowSpec;\n if (this.at(\"IDENT\") || IDENT_KEYWORDS.has(this.current().kind)) {\n const winName = this.parseIdent();\n window = { partitionBy: [], orderBy: [], frame: null, ref: winName };\n } else {\n this.expect(\"LPAREN\");\n window = this.parseWindowSpec();\n this.expect(\"RPAREN\");\n }\n const func = isAgg\n ? { type: \"aggregate\" as const, name: upper, distinct, args, filter }\n : { type: \"function\" as const, name, distinct, args, filter };\n return { type: \"window\", func, window };\n }\n\n if (isAgg) {\n return { type: \"aggregate\", name: upper, distinct, args, filter };\n }\n return { type: \"function\", name, distinct, args, filter };\n }\n\n private parseCaseExpr(base: Expr | null): CaseExpr {\n const whens: { when: Expr; then: Expr }[] = [];\n while (this.match(\"WHEN\")) {\n const when = this.parseExpr();\n this.expect(\"THEN\");\n const then = this.parseExpr();\n whens.push({ when, then });\n }\n let elseExpr: Expr | null = null;\n if (this.match(\"ELSE\")) elseExpr = this.parseExpr();\n this.expect(\"END\");\n return { type: \"case\", base, whens, else: elseExpr };\n }\n\n private parseWindowSpec(): WindowSpec {\n const partitionBy: Expr[] = [];\n const orderBy: OrderByItem[] = [];\n let frame: FrameSpec | null = null;\n\n if (this.match(\"PARTITION\")) {\n this.expect(\"BY\");\n do {\n partitionBy.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n\n if (this.match(\"ORDER\")) {\n this.expect(\"BY\");\n do {\n const expr = this.parseExpr();\n let dir: \"ASC\" | \"DESC\" = \"ASC\";\n if (this.match(\"ASC\")) dir = \"ASC\";\n else if (this.match(\"DESC\")) dir = \"DESC\";\n let nulls: \"FIRST\" | \"LAST\" | null = null;\n if (this.match(\"NULLS\")) {\n if (this.match(\"FIRST\")) nulls = \"FIRST\";\n else if (this.match(\"LAST\")) nulls = \"LAST\";\n }\n orderBy.push({ expr, dir, nulls });\n } while (this.match(\"COMMA\"));\n }\n\n if (this.check(\"ROWS\", \"RANGE\", \"GROUPS\")) {\n frame = this.parseFrameSpec();\n }\n\n return { partitionBy, orderBy, frame };\n }\n\n private parseFrameSpec(): FrameSpec {\n let type: FrameSpec[\"type\"] = \"ROWS\";\n if (this.match(\"RANGE\")) type = \"RANGE\";\n else if (this.match(\"GROUPS\")) type = \"GROUPS\";\n else this.expect(\"ROWS\");\n\n let start: FrameBound;\n let end: FrameBound;\n\n if (this.match(\"BETWEEN\")) {\n start = this.parseFrameBound(true);\n this.expect(\"AND\");\n end = this.parseFrameBound(false);\n } else {\n start = this.parseFrameBound(true);\n end = { kind: \"current_row\" };\n }\n\n let exclude: FrameSpec[\"exclude\"] = null;\n if (this.match(\"EXCLUDE\")) {\n if (this.match(\"NO\")) {\n this.expect(\"OTHERS\");\n exclude = \"no_others\";\n } else if (this.match(\"CURRENT\")) {\n this.expect(\"ROW\");\n exclude = \"current_row\";\n } else if (this.match(\"GROUP\")) exclude = \"group\";\n else if (this.match(\"TIES\")) exclude = \"ties\";\n else this.syntaxError(\"expected EXCLUDE CURRENT ROW, GROUP, TIES, or NO OTHERS\");\n }\n\n return { type, start, end, exclude };\n }\n\n private parseFrameBound(precedingSide: boolean): FrameBound {\n if (this.match(\"UNBOUNDED\")) {\n if (this.match(\"PRECEDING\")) return { kind: \"unbounded_preceding\" };\n this.expect(\"FOLLOWING\");\n return { kind: \"unbounded_following\" };\n }\n if (this.match(\"CURRENT\")) {\n this.expect(\"ROW\");\n return { kind: \"current_row\" };\n }\n const expr = this.parseExpr();\n if (this.match(\"PRECEDING\")) return { kind: \"preceding\", expr };\n if (this.match(\"FOLLOWING\")) return { kind: \"following\", expr };\n if (precedingSide) return { kind: \"preceding\", expr };\n return { kind: \"following\", expr };\n }\n}\n\nexport function parseTokens(tokens: Token[]): Statement[] {\n return new Parser(tokens).parseStatements();\n}\n", "import type { Statement as ParsedStatement } from \"../ast/nodes.ts\";\nimport { tokenize } from \"../lexer/tokenize.ts\";\nimport { parseTokens } from \"./parser.ts\";\n\n/** Parsed SQL statement AST (`SELECT`, `INSERT`, `CREATE TABLE`, \u2026). */\nexport type { Statement as ParsedStatement } from \"../ast/nodes.ts\";\nexport { parseTokens } from \"./parser.ts\";\n\n/**\n * Tokenize `sql` and parse every semicolon-separated statement.\n *\n * @param sql - SQLite SQL text.\n * @returns AST statements in source order.\n */\nexport function parse(sql: string): ParsedStatement[] {\n const tokens = tokenize(sql);\n return parseTokens(tokens);\n}\n", "/** Fixed reference instant used when callers do not supply a clock (`2000-01-01T00:00:00.000Z`). */\nexport const DEFAULT_NOW = new Date(\"2000-01-01T00:00:00.000Z\");\n\n/** Function that returns the current instant for `date('now')` and related builtins. */\nexport type Clock = () => Date;\n\n/**\n * Clock that always returns a copy of `instant` (default {@link DEFAULT_NOW}).\n *\n * @throws {RangeError} If `instant` is an invalid `Date`.\n */\nexport function fixedClock(instant: Date = DEFAULT_NOW): Clock {\n const ms = instant.getTime();\n if (Number.isNaN(ms)) throw new RangeError(\"invalid clock instant\");\n return () => new Date(ms);\n}\n\n/** Normalize a `Date`, {@link Clock}, or `undefined` into a {@link Clock}. */\nexport function resolveClock(now?: Date | Clock): Clock {\n if (now === undefined) return fixedClock(DEFAULT_NOW);\n if (typeof now === \"function\") return () => new Date(now().getTime());\n return fixedClock(now);\n}\n", "import type { Clock } from \"./clock.ts\";\n\n/** Options for {@link Database} construction. All fields are optional. */\nexport interface DatabaseOptions {\n /**\n * Seed for deterministic `random()` (and any other PRNG-backed builtins).\n * Defaults to {@link DEFAULT_DATABASE_SEED} (`1`).\n */\n seed?: number | bigint;\n /**\n * Clock for `date('now')` / `datetime('now')` / etc.\n * Defaults to a fixed instant (`2000-01-01T00:00:00.000Z`).\n * Pass a `Date` or `() => Date` to override.\n */\n now?: Date | Clock;\n}\n\n/** Default {@link DatabaseOptions.seed} when constructing a {@link Database}. */\nexport const DEFAULT_DATABASE_SEED = 1;\n", "/**\n * Deterministic 64-bit PRNG (xorshift64*).\n * Used for SQLite `random()` and any other nondeterministic builtins.\n */\nexport class Prng {\n private state: bigint;\n\n /**\n * @param seed - Engine seed. `0` is replaced with a non-zero constant.\n */\n constructor(seed: number | bigint = 1) {\n let s = typeof seed === \"bigint\" ? seed : BigInt(seed | 0);\n if (s === 0n) s = 0x9e3779b97f4a7c15n;\n this.state = BigInt.asUintN(64, s);\n }\n\n /** Next unsigned 64-bit value. */\n nextU64(): bigint {\n let x = this.state;\n x ^= BigInt.asUintN(64, x >> 12n);\n x ^= BigInt.asUintN(64, x << 25n);\n x ^= BigInt.asUintN(64, x >> 27n);\n this.state = BigInt.asUintN(64, x);\n return BigInt.asUintN(64, x * 0x2545f4914f6cdd1dn);\n }\n\n /** SQLite `random()` style signed 64-bit integer in [-2^63+1, 2^63-1]. */\n nextSqliteRandom(): bigint {\n const bits = this.nextU64();\n let signed = BigInt.asIntN(64, bits);\n if (signed === -(1n << 63n)) signed += 1n;\n return signed;\n }\n\n /** Next float in `[0, 1)` from 53 bits of {@link nextU64}. */\n nextFloat(): number {\n const bits = this.nextU64();\n return Number(bits >> 11n) / Number(1n << 53n);\n }\n\n /**\n * Next integer in `[min, max]` (inclusive).\n *\n * @throws {RangeError} If `max < min`.\n */\n nextInt(min: number, max: number): number {\n if (max < min) throw new RangeError(\"max < min\");\n const span = max - min + 1;\n return min + Number(this.nextU64() % BigInt(span));\n }\n\n /** Current unsigned 64-bit engine state (for snapshot / transaction rollback). */\n getState(): bigint {\n return this.state;\n }\n\n /** Restore unsigned 64-bit engine state from {@link getState}. */\n setState(state: bigint): void {\n this.state = BigInt.asUintN(64, state);\n }\n\n /** Independent copy with the same engine state. */\n clone(): Prng {\n const copy = new Prng(1);\n copy.state = this.state;\n return copy;\n }\n}\n\n/** FNV-1a hash of `parts` as a signed 32-bit seed (for tests and custom PRNGs). */\nexport function deriveSeed(...parts: Array<number | string | bigint>): number {\n let hash = 2166136261;\n for (const part of parts) {\n const text = String(part);\n for (let i = 0; i < text.length; i++) {\n hash ^= text.charCodeAt(i)!;\n hash = Math.imul(hash, 16777619);\n }\n }\n return hash | 0;\n}\n", "/** SQLite storage class of a {@link SqlValue} (`null` / `integer` / `real` / `text` / `blob`). */\nexport type StorageClass = \"null\" | \"integer\" | \"real\" | \"text\" | \"blob\";\n\n/** Integer-valued REAL that must not collapse to the integer storage class. */\nexport class SqlReal {\n /** IEEE float payload (`-0` already canonicalized to `+0`). */\n readonly value: number;\n constructor(value: number) {\n this.value = canonicalizeNumber(value);\n }\n valueOf(): number {\n return this.value;\n }\n toString(): string {\n return String(this.value);\n }\n}\n\n/** SQLite JSON subtype (74 / 'J') \u2014 text that nested JSON APIs treat as JSON, not a string. */\nexport const JSON_SUBTYPE = 74;\n\n/** TEXT value with SQLite JSON subtype 74 \u2014 nested JSON APIs treat it as JSON, not a string. */\nexport class SqlJsonText {\n readonly value: string;\n readonly subtype = JSON_SUBTYPE;\n constructor(value: string) {\n this.value = value;\n }\n valueOf(): string {\n return this.value;\n }\n toString(): string {\n return this.value;\n }\n}\n\n/** A SQLite value: NULL, integer/real, text, blob, or a typed REAL/JSON wrapper. */\nexport type SqlValue = null | number | bigint | string | Uint8Array | SqlReal | SqlJsonText;\n\n/**\n * A value as it appears in query result rows.\n * {@link SqlReal} and {@link SqlJsonText} wrappers are unwrapped at the JS API surface.\n */\nexport type QueryValue = null | number | bigint | string | Uint8Array;\n\n/** A result row keyed by column name. Duplicate SELECT names keep the last value. */\nexport type QueryRow = Record<string, QueryValue>;\n\n/**\n * Values accepted by bind slots (`?`, `?NNN`, `:name`, `@name`, `$name`).\n * Booleans become integer 0/1; {@link ArrayBuffer} is copied as a BLOB.\n */\nexport type BindValue = SqlValue | boolean | ArrayBuffer;\n\n/** Column type affinity from a declared type name (SQLite affinity rules). */\nexport type Affinity = \"TEXT\" | \"NUMERIC\" | \"INTEGER\" | \"REAL\" | \"BLOB\";\n\n/** Canonicalize IEEE `-0` to `+0` for cross-runtime determinism. */\nexport function canonicalizeNumber(value: number): number {\n return Object.is(value, -0) ? 0 : value;\n}\n\n/** Wrap `value` as {@link SqlReal} so it stays REAL even when it is an integer. */\nexport function asSqlReal(value: number): SqlReal {\n return new SqlReal(value);\n}\n\n/** `true` when `value` is a {@link SqlReal} wrapper. */\nexport function isSqlReal(value: SqlValue): value is SqlReal {\n return value instanceof SqlReal;\n}\n\n/** `true` when `value` is a {@link SqlJsonText} wrapper. */\nexport function isSqlJsonText(value: SqlValue): value is SqlJsonText {\n return value instanceof SqlJsonText;\n}\n\n/** Wrap `value` as {@link SqlJsonText} (JSON subtype 74). */\nexport function asSqlJsonText(value: string): SqlJsonText {\n return new SqlJsonText(value);\n}\n\n/** Strip ephemeral JSON subtype for table storage / non-JSON contexts. */\nexport function unwrapSqlValue(value: SqlValue): SqlValue {\n if (value instanceof SqlJsonText) return value.value;\n return value;\n}\n\nexport function subtypeOf(value: SqlValue): number {\n if (value instanceof SqlJsonText) return JSON_SUBTYPE;\n return 0;\n}\n\nexport function numberValueOf(value: number | bigint | SqlReal): number {\n if (typeof value === \"bigint\") return Number(value);\n if (value instanceof SqlReal) return value.value;\n return value;\n}\n\n/** SQLite storage class of `value` (`null` / `integer` / `real` / `text` / `blob`). */\nexport function storageClassOf(value: SqlValue): StorageClass {\n if (value === null) return \"null\";\n if (value instanceof SqlReal) return \"real\";\n if (value instanceof SqlJsonText) return \"text\";\n if (typeof value === \"bigint\") return \"integer\";\n if (typeof value === \"number\") {\n return Number.isInteger(value) ? \"integer\" : \"real\";\n }\n if (typeof value === \"string\") return \"text\";\n return \"blob\";\n}\n\n/** SQLite `typeof()` string for `value`. */\nexport function typeofSql(value: SqlValue): string {\n const sc = storageClassOf(value);\n if (sc === \"null\") return \"null\";\n if (sc === \"integer\") return \"integer\";\n if (sc === \"real\") return \"real\";\n if (sc === \"text\") return \"text\";\n return \"blob\";\n}\n\n/** Determine column affinity from a declared type name (SQLite rules). */\nexport function affinityFromTypeName(typeName: string | null | undefined): Affinity {\n if (!typeName) return \"BLOB\";\n const t = typeName.toUpperCase();\n if (t.includes(\"INT\")) return \"INTEGER\";\n if (t.includes(\"CHAR\") || t.includes(\"CLOB\") || t.includes(\"TEXT\")) return \"TEXT\";\n if (t.includes(\"BLOB\")) return \"BLOB\";\n if (t.includes(\"REAL\") || t.includes(\"FLOA\") || t.includes(\"DOUB\")) return \"REAL\";\n return \"NUMERIC\";\n}\n\n/** Apply column {@link Affinity} conversion rules to `value`. */\nexport function applyAffinity(value: SqlValue, affinity: Affinity): SqlValue {\n if (value === null) return null;\n\n switch (affinity) {\n case \"TEXT\":\n if (value instanceof Uint8Array) return utf8Decode(value);\n if (value instanceof SqlJsonText) return value.value;\n if (typeof value === \"string\") return value;\n if (value instanceof SqlReal) return String(value.value);\n return String(value);\n case \"INTEGER\": {\n const n = coerceToNumber(value);\n if (n === null) return value;\n if (typeof value === \"bigint\") return value;\n return Number.isInteger(n) && Number.isSafeInteger(n) ? Math.trunc(n) : canonicalizeNumber(n);\n }\n case \"REAL\": {\n const n = coerceToNumber(value);\n return n === null ? value : asSqlReal(n);\n }\n case \"NUMERIC\": {\n const n = coerceToNumber(value);\n if (n === null) return value;\n if (Number.isInteger(n) && Number.isSafeInteger(n)) return Math.trunc(n);\n return canonicalizeNumber(n);\n }\n case \"BLOB\":\n if (typeof value === \"number\") return canonicalizeNumber(value);\n return value;\n }\n}\n\n/** Parse `value` as a number, or `null` when it is not numeric. */\nexport function coerceToNumber(value: SqlValue): number | null {\n if (value === null) return null;\n if (value instanceof SqlReal) return value.value;\n if (value instanceof SqlJsonText) return coerceToNumber(value.value);\n if (typeof value === \"number\") return canonicalizeNumber(value);\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"string\") {\n const s = value.trim();\n if (s === \"\") return null;\n const n = Number(s);\n if (!Number.isNaN(n) && /^-?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/.test(s)) {\n return canonicalizeNumber(n);\n }\n return null;\n }\n if (value instanceof Uint8Array) {\n return coerceToNumber(utf8Decode(value));\n }\n return null;\n}\n\n/** Truncate `value` toward zero as an integer, or `null` when it is not numeric. */\nexport function toInteger(value: SqlValue): number | bigint | null {\n if (value === null) return null;\n if (typeof value === \"bigint\") return value;\n if (value instanceof SqlReal) return Math.trunc(value.value);\n if (value instanceof SqlJsonText) return toInteger(value.value);\n if (typeof value === \"number\") return Math.trunc(value);\n if (typeof value === \"string\") {\n const n = coerceToNumber(value);\n return n === null ? null : Math.trunc(n);\n }\n return null;\n}\n\n/** SQLite `=` / `IS` equality for two non-NULL values (`NULL = NULL` is false here). */\nexport function sqlValueEquals(a: SqlValue, b: SqlValue): boolean {\n if (a === null || b === null) return false;\n if (a instanceof Uint8Array && b instanceof Uint8Array) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n }\n const an = a instanceof SqlReal ? a.value : a instanceof SqlJsonText ? a.value : a;\n const bn = b instanceof SqlReal ? b.value : b instanceof SqlJsonText ? b.value : b;\n if (typeof an === \"bigint\" || typeof bn === \"bigint\") {\n try {\n return BigInt(an as number | bigint) === BigInt(bn as number | bigint);\n } catch {\n return false;\n }\n }\n if (typeof an === \"number\" && typeof bn === \"number\") return Object.is(an, bn);\n return an === bn;\n}\n\n/**\n * SQLite comparison for ORDER BY / inequalities.\n * Returns -1, 0, 1, or null if either side is NULL (SQL NULL).\n */\nexport function compareSql(a: SqlValue, b: SqlValue): number | null {\n if (a === null || b === null) return null;\n\n const ca = comparisonClass(a);\n const cb = comparisonClass(b);\n if (ca !== cb) return ca < cb ? -1 : 1;\n\n if (ca === 1) {\n // numbers \u2014 compare floats before BigInt conversion (NaN/Inf must not reach BigInt)\n const fa = a instanceof SqlReal ? a.value : typeof a === \"number\" ? a : typeof a === \"bigint\" ? null : Number(a);\n const fb = b instanceof SqlReal ? b.value : typeof b === \"number\" ? b : typeof b === \"bigint\" ? null : Number(b);\n if (typeof a === \"bigint\" && typeof b === \"bigint\") {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n }\n if (typeof a === \"bigint\" || typeof b === \"bigint\") {\n const left = typeof a === \"bigint\" ? Number(a) : (fa as number);\n const right = typeof b === \"bigint\" ? Number(b) : (fb as number);\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n }\n const left = fa as number;\n const right = fb as number;\n if (Number.isNaN(left) && Number.isNaN(right)) return 0;\n if (Number.isNaN(left)) return 1;\n if (Number.isNaN(right)) return -1;\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n }\n\n if (ca === 2) {\n const sa = a instanceof SqlJsonText ? a.value : String(a);\n const sb = b instanceof SqlJsonText ? b.value : String(b);\n if (sa < sb) return -1;\n if (sa > sb) return 1;\n return 0;\n }\n\n // blobs\n const ba = a instanceof Uint8Array ? a : utf8Encode(String(a));\n const bb = b instanceof Uint8Array ? b : utf8Encode(String(b));\n const len = Math.min(ba.length, bb.length);\n for (let i = 0; i < len; i++) {\n const d = (ba[i] ?? 0) - (bb[i] ?? 0);\n if (d !== 0) return d < 0 ? -1 : 1;\n }\n if (ba.length < bb.length) return -1;\n if (ba.length > bb.length) return 1;\n return 0;\n}\n\n/** SQLite sort order: NULL < numbers < text < blob */\nfunction comparisonClass(v: SqlValue): number {\n if (v === null) return 0;\n if (v instanceof SqlReal || typeof v === \"number\" || typeof v === \"bigint\") return 1;\n if (typeof v === \"string\" || v instanceof SqlJsonText) return 2;\n return 3;\n}\n\n/** UTF-8 encode `s` (SQLite TEXT \u2192 BLOB). */\nexport function utf8Encode(s: string): Uint8Array {\n return new TextEncoder().encode(s);\n}\n\n/** UTF-8 decode `b` (SQLite BLOB \u2192 TEXT). */\nexport function utf8Decode(b: Uint8Array): string {\n return new TextDecoder().decode(b);\n}\n\n/** Deep-copy blobs and REAL/JSON wrappers; primitives are returned as-is. */\nexport function cloneSqlValue(v: SqlValue): SqlValue {\n if (v instanceof Uint8Array) return new Uint8Array(v);\n if (v instanceof SqlReal) return new SqlReal(v.value);\n if (v instanceof SqlJsonText) return new SqlJsonText(v.value);\n return v;\n}\n\n/**\n * SQLite boolean truthiness (WHERE / HAVING / CASE / AND / OR / NOT).\n * Non-NULL values are cast to numeric; non-numeric text/blob become 0 (false).\n */\nexport function isTruthySql(v: SqlValue): boolean | null {\n if (v === null) return null;\n if (v instanceof SqlReal) return v.value !== 0;\n if (typeof v === \"number\") return v !== 0 && !Number.isNaN(v);\n if (typeof v === \"bigint\") return v !== 0n;\n if (typeof v === \"string\" || v instanceof Uint8Array || v instanceof SqlJsonText) {\n const n = coerceToNumber(v instanceof SqlJsonText ? v.value : v);\n return n !== null && n !== 0 && !Number.isNaN(n);\n }\n return false;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { JsonNode } from \"./types.ts\";\n\nexport class JsonParseError extends Error {\n constructor(\n message: string,\n readonly position: number,\n ) {\n super(message);\n this.name = \"JsonParseError\";\n }\n}\n\n/** Parse JSON / JSON5-ish input into a JsonNode. Position is 1-based for errors. */\nexport function parseJsonText(input: string, options?: { strictCanonical?: boolean }): JsonNode {\n const parser = new JsonTextParser(input, options?.strictCanonical ?? false);\n const node = parser.parseValue();\n parser.skipWs();\n if (!parser.eof()) {\n throw new JsonParseError(\"malformed JSON\", parser.pos1());\n }\n return node;\n}\n\nexport function jsonErrorPosition(input: string): number {\n try {\n parseJsonText(input);\n return 0;\n } catch (e) {\n if (e instanceof JsonParseError) return e.position;\n return 1;\n }\n}\n\nexport function isValidJsonText(input: string, flags = 0): boolean {\n // flags bit 0x01 = JSON5 accepted as valid when set; without it, only RFC8259\n const allowJson5 = (flags & 0x02) !== 0 || (flags & 0x01) !== 0;\n try {\n if (allowJson5) {\n parseJsonText(input);\n return true;\n }\n // Canonical: reject JSON5 extensions by re-checking with a strict mode\n parseJsonText(input, { strictCanonical: true });\n return true;\n } catch {\n return false;\n }\n}\n\nclass JsonTextParser {\n private i = 0;\n constructor(\n private readonly s: string,\n private readonly strictCanonical: boolean,\n ) {}\n\n eof(): boolean {\n return this.i >= this.s.length;\n }\n\n pos1(): number {\n return this.i + 1;\n }\n\n peek(n = 0): string {\n return this.s[this.i + n] ?? \"\";\n }\n\n advance(): string {\n return this.s[this.i++] ?? \"\";\n }\n\n skipWs(): void {\n while (this.i < this.s.length) {\n const ch = this.peek();\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\v\" || ch === \"\\f\") {\n this.advance();\n continue;\n }\n if (!this.strictCanonical && ch === \"/\" && this.peek(1) === \"/\") {\n this.i += 2;\n while (!this.eof() && this.peek() !== \"\\n\") this.advance();\n continue;\n }\n if (!this.strictCanonical && ch === \"/\" && this.peek(1) === \"*\") {\n this.i += 2;\n while (!this.eof() && !(this.peek() === \"*\" && this.peek(1) === \"/\")) this.advance();\n if (!this.eof()) this.i += 2;\n continue;\n }\n break;\n }\n }\n\n parseValue(): JsonNode {\n this.skipWs();\n if (this.eof()) throw new JsonParseError(\"malformed JSON\", this.pos1());\n const ch = this.peek();\n if (ch === \"{\") return this.parseObject();\n if (ch === \"[\") return this.parseArray();\n if (ch === '\"' || (!this.strictCanonical && ch === \"'\")) return this.parseString();\n if (ch === \"-\" || ch === \"+\" || (ch >= \"0\" && ch <= \"9\") || ch === \".\") return this.parseNumber();\n if (ch === \"n\" || ch === \"N\") return this.parseKeyword();\n if (ch === \"t\" || ch === \"T\" || ch === \"f\" || ch === \"F\" || ch === \"I\" || ch === \"i\") {\n return this.parseKeyword();\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n\n parseObject(): JsonNode {\n this.advance(); // {\n this.skipWs();\n const entries: Array<{ key: string; value: JsonNode }> = [];\n if (this.peek() === \"}\") {\n this.advance();\n return { kind: \"object\", entries };\n }\n while (true) {\n this.skipWs();\n let key: string;\n if (this.peek() === '\"' || (!this.strictCanonical && this.peek() === \"'\")) {\n const str = this.parseString();\n key = (str as { kind: \"string\"; value: string }).value;\n } else if (!this.strictCanonical && this.isIdentStart(this.peek())) {\n key = this.parseIdent();\n } else {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n this.skipWs();\n if (this.advance() !== \":\") throw new JsonParseError(\"malformed JSON\", this.pos1());\n const value = this.parseValue();\n entries.push({ key, value });\n this.skipWs();\n const sep = this.peek();\n if (sep === \",\") {\n this.advance();\n this.skipWs();\n if (!this.strictCanonical && this.peek() === \"}\") {\n this.advance();\n break;\n }\n continue;\n }\n if (sep === \"}\") {\n this.advance();\n break;\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n return { kind: \"object\", entries };\n }\n\n parseArray(): JsonNode {\n this.advance(); // [\n this.skipWs();\n const elements: JsonNode[] = [];\n if (this.peek() === \"]\") {\n this.advance();\n return { kind: \"array\", elements };\n }\n while (true) {\n elements.push(this.parseValue());\n this.skipWs();\n const sep = this.peek();\n if (sep === \",\") {\n this.advance();\n this.skipWs();\n if (!this.strictCanonical && this.peek() === \"]\") {\n this.advance();\n break;\n }\n continue;\n }\n if (sep === \"]\") {\n this.advance();\n break;\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n return { kind: \"array\", elements };\n }\n\n parseString(): JsonNode {\n const quote = this.advance();\n if (this.strictCanonical && quote !== '\"') {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n let out = \"\";\n while (!this.eof()) {\n const ch = this.advance();\n if (ch === quote) return { kind: \"string\", value: out };\n if (ch === \"\\\\\") {\n if (this.eof()) throw new JsonParseError(\"malformed JSON\", this.pos1());\n const esc = this.advance();\n switch (esc) {\n case '\"':\n case \"'\":\n case \"\\\\\":\n case \"/\":\n out += esc;\n break;\n case \"b\":\n out += \"\\b\";\n break;\n case \"f\":\n out += \"\\f\";\n break;\n case \"n\":\n out += \"\\n\";\n break;\n case \"r\":\n out += \"\\r\";\n break;\n case \"t\":\n out += \"\\t\";\n break;\n case \"u\": {\n const hex = this.s.slice(this.i, this.i + 4);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) throw new JsonParseError(\"malformed JSON\", this.pos1());\n this.i += 4;\n out += String.fromCharCode(parseInt(hex, 16));\n break;\n }\n case \"\\n\":\n case \"\\r\":\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n if (esc === \"\\r\" && this.peek() === \"\\n\") this.advance();\n break;\n default:\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n out += esc;\n }\n continue;\n }\n if (ch === \"\\n\" || ch === \"\\r\") {\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n out += ch;\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n\n parseNumber(): JsonNode {\n const start = this.i;\n if (this.peek() === \"+\" || this.peek() === \"-\") {\n if (this.strictCanonical && this.peek() === \"+\") {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n this.advance();\n }\n // Infinity / NaN handled via keyword if letter\n if (/[A-Za-z]/.test(this.peek())) {\n this.i = start;\n return this.parseKeyword();\n }\n if (this.peek() === \"0\" && /[xX]/.test(this.peek(1))) {\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n this.i += 2;\n while (/[0-9a-fA-F]/.test(this.peek())) this.advance();\n const text = this.s.slice(start, this.i);\n const n = Number(text);\n if (!Number.isFinite(n)) throw new JsonParseError(\"malformed JSON\", start + 1);\n return Number.isInteger(n) ? { kind: \"integer\", text: String(Math.trunc(n)) } : { kind: \"real\", text: String(n) };\n }\n let seenDot = false;\n let seenExp = false;\n if (this.peek() === \".\") {\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n seenDot = true;\n this.advance();\n }\n if (!(this.peek() >= \"0\" && this.peek() <= \"9\") && !seenDot) {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n while (this.peek() >= \"0\" && this.peek() <= \"9\") this.advance();\n if (this.peek() === \".\") {\n seenDot = true;\n this.advance();\n while (this.peek() >= \"0\" && this.peek() <= \"9\") this.advance();\n }\n if (this.peek() === \"e\" || this.peek() === \"E\") {\n seenExp = true;\n this.advance();\n if (this.peek() === \"+\" || this.peek() === \"-\") this.advance();\n if (!(this.peek() >= \"0\" && this.peek() <= \"9\")) throw new JsonParseError(\"malformed JSON\", this.pos1());\n while (this.peek() >= \"0\" && this.peek() <= \"9\") this.advance();\n }\n const raw = this.s.slice(start, this.i);\n if (this.strictCanonical) {\n if (raw.startsWith(\"+\")) throw new JsonParseError(\"malformed JSON\", start + 1);\n if (raw.includes(\".\") && (raw.startsWith(\".\") || raw.endsWith(\".\") || /\\.-|\\+\\./.test(raw))) {\n // trailing/leading dot rejected in strict \u2014 already partially handled\n }\n if (/^-?0\\d/.test(raw)) throw new JsonParseError(\"malformed JSON\", start + 1);\n }\n const canon = canonicalizeNumberText(raw);\n if (canon.kind === \"integer\" || (!seenDot && !seenExp && !raw.includes(\".\"))) {\n // Prefer integer when no fractional/exponent markers in original (after leading +-)\n const body = raw.replace(/^[+-]/, \"\");\n if (!body.includes(\".\") && !/[eE]/.test(body)) {\n return { kind: \"integer\", text: canon.text };\n }\n }\n return { kind: \"real\", text: canon.text };\n }\n\n parseKeyword(): JsonNode {\n const start = this.i;\n while (/[A-Za-z]/.test(this.peek())) this.advance();\n const word = this.s.slice(start, this.i);\n const lower = word.toLowerCase();\n if (lower === \"null\") return { kind: \"null\" };\n if (lower === \"true\") return { kind: \"true\" };\n if (lower === \"false\") return { kind: \"false\" };\n if (!this.strictCanonical) {\n if (lower === \"nan\" || lower === \"qnan\" || lower === \"snan\") return { kind: \"null\" };\n if (lower === \"infinity\" || lower === \"inf\") {\n const _sign = this.s[start - 1] === \"-\" ? \"-\" : \"\";\n // Treat as null-ish? Docs say Inf is allowed in JSON5 input and converted; use a large number string?\n // SQLite converts Infinity to null when rendering? Actually json() of Infinity might error or become null.\n // Probe showed NaN -> null. For Inf, check:\n return { kind: \"null\" };\n }\n }\n throw new JsonParseError(\"malformed JSON\", start + 1);\n }\n\n isIdentStart(ch: string): boolean {\n return /[A-Za-z_$]/.test(ch) || (ch.length > 0 && ch.charCodeAt(0) > 0x7f);\n }\n\n parseIdent(): string {\n let out = \"\";\n while (!this.eof()) {\n const ch = this.peek();\n if (/[A-Za-z0-9_$]/.test(ch) || ch.charCodeAt(0) > 0x7f) {\n out += this.advance();\n continue;\n }\n break;\n }\n if (!out) throw new JsonParseError(\"malformed JSON\", this.pos1());\n return out;\n }\n}\n\nfunction canonicalizeNumberText(raw: string): { kind: \"integer\" | \"real\"; text: string } {\n let s = raw.trim();\n if (s.startsWith(\"+\")) s = s.slice(1);\n const n = Number(s);\n if (!Number.isFinite(n)) {\n throw new JsonParseError(\"malformed JSON\", 1);\n }\n if (Number.isInteger(n) && !/[eE.]/.test(s.replace(/^-/, \"\"))) {\n return { kind: \"integer\", text: String(Math.trunc(n)) };\n }\n // Prefer a stable JSON number rendering\n let text = String(n);\n if (text.includes(\"e\") || text.includes(\"E\")) {\n // keep JS default\n } else if (text.endsWith(\".0\") && Number.isInteger(n)) {\n text = String(Math.trunc(n));\n return { kind: \"integer\", text };\n }\n return { kind: Number.isInteger(n) && !s.includes(\".\") && !/[eE]/.test(s) ? \"integer\" : \"real\", text };\n}\n\nexport function malformedJsonError(position?: number): SqliteError {\n return new SqliteError(position !== undefined ? `malformed JSON` : \"malformed JSON\", \"other\");\n}\n", "import type { JsonNode } from \"./types.ts\";\n\nexport function stringifyJson(node: JsonNode): string {\n switch (node.kind) {\n case \"null\":\n return \"null\";\n case \"true\":\n return \"true\";\n case \"false\":\n return \"false\";\n case \"integer\":\n case \"real\":\n return node.text;\n case \"string\":\n return jsonQuoteString(node.value);\n case \"array\":\n return `[${node.elements.map(stringifyJson).join(\",\")}]`;\n case \"object\":\n return `{${node.entries.map((e) => `${jsonQuoteString(e.key)}:${stringifyJson(e.value)}`).join(\",\")}}`;\n }\n}\n\nexport function jsonQuoteString(value: string): string {\n let out = '\"';\n for (let i = 0; i < value.length; i++) {\n const ch = value[i]!;\n const code = ch.charCodeAt(0);\n switch (ch) {\n case '\"':\n out += '\\\\\"';\n break;\n case \"\\\\\":\n out += \"\\\\\\\\\";\n break;\n case \"\\b\":\n out += \"\\\\b\";\n break;\n case \"\\f\":\n out += \"\\\\f\";\n break;\n case \"\\n\":\n out += \"\\\\n\";\n break;\n case \"\\r\":\n out += \"\\\\r\";\n break;\n case \"\\t\":\n out += \"\\\\t\";\n break;\n default:\n if (code < 0x20) {\n out += `\\\\u${code.toString(16).padStart(4, \"0\")}`;\n } else {\n out += ch;\n }\n }\n }\n return `${out}\"`;\n}\n\nexport function prettyJson(node: JsonNode, indent = \" \"): string {\n return prettyNode(node, indent, 0);\n}\n\nfunction prettyNode(node: JsonNode, indent: string, depth: number): string {\n const pad = indent.repeat(depth);\n const padInner = indent.repeat(depth + 1);\n switch (node.kind) {\n case \"array\":\n if (node.elements.length === 0) return \"[]\";\n return `[\\n${node.elements.map((e) => `${padInner}${prettyNode(e, indent, depth + 1)}`).join(\",\\n\")}\\n${pad}]`;\n case \"object\":\n if (node.entries.length === 0) return \"{}\";\n return `{\\n${node.entries\n .map((e) => `${padInner}${jsonQuoteString(e.key)}: ${prettyNode(e.value, indent, depth + 1)}`)\n .join(\",\\n\")}\\n${pad}}`;\n default:\n return stringifyJson(node);\n }\n}\n", "import { utf8Decode, utf8Encode } from \"../types/value.ts\";\nimport { JsonParseError, parseJsonText } from \"./parse.ts\";\nimport { stringifyJson } from \"./stringify.ts\";\nimport type { JsonNode } from \"./types.ts\";\n\n/** JSONB element types (low nibble). */\nexport const JB = {\n NULL: 0,\n TRUE: 1,\n FALSE: 2,\n INT: 3,\n INT5: 4,\n FLOAT: 5,\n FLOAT5: 6,\n TEXT: 7,\n TEXTJ: 8,\n TEXT5: 9,\n TEXTRAW: 10,\n ARRAY: 11,\n OBJECT: 12,\n} as const;\n\nexport function encodeJsonb(node: JsonNode): Uint8Array {\n const parts: number[] = [];\n writeNode(node, parts);\n return Uint8Array.from(parts);\n}\n\nfunction writeNode(node: JsonNode, out: number[]): void {\n switch (node.kind) {\n case \"null\":\n writeHeader(out, 0, JB.NULL);\n break;\n case \"true\":\n writeHeader(out, 0, JB.TRUE);\n break;\n case \"false\":\n writeHeader(out, 0, JB.FALSE);\n break;\n case \"integer\": {\n const payload = utf8Encode(node.text);\n writeHeader(out, payload.length, JB.INT);\n for (const b of payload) out.push(b);\n break;\n }\n case \"real\": {\n const payload = utf8Encode(node.text);\n writeHeader(out, payload.length, JB.FLOAT);\n for (const b of payload) out.push(b);\n break;\n }\n case \"string\": {\n const payload = utf8Encode(node.value);\n const needsEscape = [...node.value].some((ch) => {\n const c = ch.charCodeAt(0);\n return ch === '\"' || ch === \"\\\\\" || c < 0x20;\n });\n // Prefer TEXT when no escapes needed; TEXTRAW if chars need escaping in JSON text\n const type = needsEscape ? JB.TEXTRAW : JB.TEXT;\n writeHeader(out, payload.length, type);\n for (const b of payload) out.push(b);\n break;\n }\n case \"array\": {\n const payload: number[] = [];\n for (const el of node.elements) writeNode(el, payload);\n writeHeader(out, payload.length, JB.ARRAY);\n out.push(...payload);\n break;\n }\n case \"object\": {\n const payload: number[] = [];\n for (const entry of node.entries) {\n writeNode({ kind: \"string\", value: entry.key }, payload);\n writeNode(entry.value, payload);\n }\n writeHeader(out, payload.length, JB.OBJECT);\n out.push(...payload);\n break;\n }\n }\n}\n\nfunction writeHeader(out: number[], size: number, type: number): void {\n if (size <= 11) {\n out.push((size << 4) | type);\n return;\n }\n if (size <= 0xff) {\n out.push((12 << 4) | type, size);\n return;\n }\n if (size <= 0xffff) {\n out.push((13 << 4) | type, (size >> 8) & 0xff, size & 0xff);\n return;\n }\n out.push((14 << 4) | type, (size >> 24) & 0xff, (size >> 16) & 0xff, (size >> 8) & 0xff, size & 0xff);\n}\n\nexport interface JsonbElement {\n offset: number;\n end: number;\n type: number;\n payloadOffset: number;\n payloadSize: number;\n}\n\nexport function readHeader(blob: Uint8Array, offset: number): JsonbElement {\n if (offset >= blob.length) throw new JsonParseError(\"malformed JSON\", offset + 1);\n const first = blob[offset]!;\n const sizeCode = first >> 4;\n const type = first & 0x0f;\n let headerSize = 1;\n let payloadSize = sizeCode;\n if (sizeCode >= 12) {\n const lenBytes = sizeCode === 12 ? 1 : sizeCode === 13 ? 2 : sizeCode === 14 ? 4 : 8;\n headerSize = 1 + lenBytes;\n if (offset + headerSize > blob.length) throw new JsonParseError(\"malformed JSON\", offset + 1);\n payloadSize = 0;\n for (let i = 0; i < lenBytes; i++) {\n payloadSize = (payloadSize << 8) | blob[offset + 1 + i]!;\n }\n }\n const payloadOffset = offset + headerSize;\n const end = payloadOffset + payloadSize;\n if (end > blob.length) throw new JsonParseError(\"malformed JSON\", offset + 1);\n return { offset, end, type, payloadOffset, payloadSize };\n}\n\nexport function looksLikeJsonb(blob: Uint8Array): boolean {\n if (blob.length === 0) return false;\n try {\n const el = readHeader(blob, 0);\n return el.end === blob.length && el.type <= JB.OBJECT;\n } catch {\n return false;\n }\n}\n\nexport function decodeJsonb(blob: Uint8Array): JsonNode {\n const el = readHeader(blob, 0);\n if (el.end !== blob.length) throw new JsonParseError(\"malformed JSON\", 1);\n return decodeElement(blob, el);\n}\n\nfunction decodeElement(blob: Uint8Array, el: JsonbElement): JsonNode {\n switch (el.type) {\n case JB.NULL:\n return { kind: \"null\" };\n case JB.TRUE:\n return { kind: \"true\" };\n case JB.FALSE:\n return { kind: \"false\" };\n case JB.INT:\n case JB.INT5: {\n const text = utf8Decode(blob.subarray(el.payloadOffset, el.end));\n return { kind: \"integer\", text: normalizeIntText(text) };\n }\n case JB.FLOAT:\n case JB.FLOAT5: {\n const text = utf8Decode(blob.subarray(el.payloadOffset, el.end));\n return { kind: \"real\", text };\n }\n case JB.TEXT:\n case JB.TEXTJ:\n case JB.TEXT5:\n case JB.TEXTRAW: {\n const raw = utf8Decode(blob.subarray(el.payloadOffset, el.end));\n if (el.type === JB.TEXT || el.type === JB.TEXTRAW) return { kind: \"string\", value: raw };\n // TEXTJ / TEXT5 store escaped content without quotes \u2014 unescape lightly\n return { kind: \"string\", value: unescapeJsonPayload(raw) };\n }\n case JB.ARRAY: {\n const elements: JsonNode[] = [];\n let pos = el.payloadOffset;\n while (pos < el.end) {\n const child = readHeader(blob, pos);\n elements.push(decodeElement(blob, child));\n pos = child.end;\n }\n return { kind: \"array\", elements };\n }\n case JB.OBJECT: {\n const entries: Array<{ key: string; value: JsonNode }> = [];\n let pos = el.payloadOffset;\n while (pos < el.end) {\n const keyEl = readHeader(blob, pos);\n const keyNode = decodeElement(blob, keyEl);\n if (keyNode.kind !== \"string\") throw new JsonParseError(\"malformed JSON\", pos + 1);\n pos = keyEl.end;\n const valEl = readHeader(blob, pos);\n entries.push({ key: keyNode.value, value: decodeElement(blob, valEl) });\n pos = valEl.end;\n }\n return { kind: \"object\", entries };\n }\n default:\n throw new JsonParseError(\"malformed JSON\", el.offset + 1);\n }\n}\n\nfunction normalizeIntText(text: string): string {\n const n = Number(text);\n if (Number.isFinite(n) && Number.isInteger(n)) return String(Math.trunc(n));\n return text;\n}\n\nfunction unescapeJsonPayload(raw: string): string {\n // Payload may contain JSON escapes without surrounding quotes\n try {\n return JSON.parse(`\"${raw.replace(/\"/g, '\\\\\"')}\"`) as string;\n } catch {\n return raw;\n }\n}\n\n/** Walk JSONB and collect element metadata for TVF id/parent assignment. */\nexport interface JsonbWalkEntry {\n offset: number;\n parent: number | null;\n node: JsonNode;\n key: string | number | null;\n path: string;\n fullkey: string;\n /** For object entries, offset of the key header (used as id). */\n idOffset: number;\n}\n\nexport function walkJsonbTree(blob: Uint8Array): JsonbWalkEntry[] {\n const root = readHeader(blob, 0);\n const node = decodeElement(blob, root);\n const out: JsonbWalkEntry[] = [];\n walk(blob, root, node, null, \"$\", \"$\", null, out);\n return out;\n}\n\nfunction walk(\n blob: Uint8Array,\n el: JsonbElement,\n node: JsonNode,\n parentId: number | null,\n path: string,\n fullkey: string,\n key: string | number | null,\n out: JsonbWalkEntry[],\n idOffset = el.offset,\n): void {\n out.push({ offset: el.offset, parent: parentId, node, key, path, fullkey, idOffset });\n if (node.kind === \"array\") {\n let pos = el.payloadOffset;\n let index = 0;\n while (pos < el.end) {\n const child = readHeader(blob, pos);\n const childNode = decodeElement(blob, child);\n const childFull = `${fullkey}[${index}]`;\n walk(blob, child, childNode, idOffset, fullkey, childFull, index, out);\n pos = child.end;\n index++;\n }\n } else if (node.kind === \"object\") {\n let pos = el.payloadOffset;\n while (pos < el.end) {\n const keyEl = readHeader(blob, pos);\n const keyNode = decodeElement(blob, keyEl);\n if (keyNode.kind !== \"string\") throw new JsonParseError(\"malformed JSON\", pos + 1);\n pos = keyEl.end;\n const valEl = readHeader(blob, pos);\n const valNode = decodeElement(blob, valEl);\n const childFull = appendObjectKey(fullkey, keyNode.value);\n // Children of this entry use the entry's id (key offset), matching SQLite.\n walk(blob, valEl, valNode, idOffset, fullkey, childFull, keyNode.value, out, keyEl.offset);\n pos = valEl.end;\n }\n }\n}\n\nfunction appendObjectKey(base: string, key: string): string {\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) return `${base}.${key}`;\n return `${base}.\"${key.replace(/\"/g, '\\\\\"')}\"`;\n}\n\nexport function jsonbToText(blob: Uint8Array): string {\n return stringifyJson(decodeJsonb(blob));\n}\n\nexport function textToJsonb(text: string): Uint8Array {\n return encodeJsonb(parseJsonText(text));\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { JsonNode } from \"./types.ts\";\n\nexport type PathStep =\n | { kind: \"root\" }\n | { kind: \"key\"; key: string }\n | { kind: \"index\"; index: number }\n | { kind: \"append\" } // [#]\n | { kind: \"fromEnd\"; n: number }; // [#-n]\n\nexport function parseJsonPath(path: string): PathStep[] {\n if (path === \"\") throw new SqliteError(\"bad JSON path: ''\", \"other\");\n if (!path.startsWith(\"$\")) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n const steps: PathStep[] = [{ kind: \"root\" }];\n let i = 1;\n while (i < path.length) {\n if (path[i] === \".\") {\n i++;\n if (i >= path.length) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n if (path[i] === '\"') {\n i++;\n let key = \"\";\n while (i < path.length) {\n const ch = path[i]!;\n if (ch === '\"') {\n i++;\n break;\n }\n if (ch === \"\\\\\") {\n i++;\n if (i >= path.length) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n key += path[i]!;\n i++;\n continue;\n }\n key += ch;\n i++;\n }\n steps.push({ kind: \"key\", key });\n continue;\n }\n let key = \"\";\n while (i < path.length && path[i] !== \".\" && path[i] !== \"[\") {\n key += path[i]!;\n i++;\n }\n if (!key) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n steps.push({ kind: \"key\", key });\n continue;\n }\n if (path[i] === \"[\") {\n i++;\n if (path[i] === \"#\") {\n i++;\n if (path[i] === \"]\") {\n i++;\n steps.push({ kind: \"append\" });\n continue;\n }\n if (path[i] === \"-\") {\n i++;\n let digits = \"\";\n while (i < path.length && path[i]! >= \"0\" && path[i]! <= \"9\") {\n digits += path[i]!;\n i++;\n }\n if (!digits || path[i] !== \"]\") throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n i++;\n steps.push({ kind: \"fromEnd\", n: Number(digits) });\n continue;\n }\n throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n }\n let digits = \"\";\n while (i < path.length && path[i]! >= \"0\" && path[i]! <= \"9\") {\n digits += path[i]!;\n i++;\n }\n if (!digits || path[i] !== \"]\") throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n i++;\n steps.push({ kind: \"index\", index: Number(digits) });\n continue;\n }\n throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n }\n return steps;\n}\n\n/** Resolve path for read; returns undefined if missing. */\nexport function pathGet(root: JsonNode, steps: PathStep[]): JsonNode | undefined {\n let cur: JsonNode | undefined = root;\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!;\n if (step.kind === \"root\") continue;\n if (cur === undefined) return undefined;\n if (step.kind === \"key\") {\n if (cur.kind !== \"object\") return undefined;\n const entries = cur.entries;\n let next: JsonNode | undefined;\n for (let j = entries.length - 1; j >= 0; j--) {\n if (entries[j]!.key === step.key) {\n next = entries[j]!.value;\n break;\n }\n }\n cur = next;\n continue;\n }\n if (step.kind === \"append\") return undefined;\n if (cur.kind !== \"array\") return undefined;\n let index: number;\n if (step.kind === \"index\") index = step.index;\n else index = cur.elements.length - step.n;\n if (index < 0 || index >= cur.elements.length) return undefined;\n cur = cur.elements[index];\n }\n return cur;\n}\n\nexport interface PathParent {\n parent: JsonNode;\n step: PathStep;\n /** For object: entry index; for array: element index (may be length for append). */\n index: number;\n}\n\n/** Locate parent container for the final path step (for mutate). */\nexport function pathParent(root: JsonNode, steps: PathStep[]): PathParent | null {\n if (steps.length <= 1) return null;\n const parentSteps = steps.slice(0, -1);\n const parent = pathGet(root, parentSteps);\n if (!parent) return null;\n const step = steps[steps.length - 1]!;\n if (step.kind === \"root\") return null;\n if (step.kind === \"key\") {\n if (parent.kind !== \"object\") return null;\n const index = parent.entries.findIndex((e) => e.key === step.key);\n return { parent, step, index };\n }\n if (parent.kind !== \"array\") return null;\n if (step.kind === \"append\") return { parent, step, index: parent.elements.length };\n if (step.kind === \"index\") return { parent, step, index: step.index };\n return { parent, step, index: parent.elements.length - step.n };\n}\n", "/** Internal JSON value tree used by sqlite-mem JSON1/JSONB. */\n\nexport type JsonNode =\n | { kind: \"null\" }\n | { kind: \"true\" }\n | { kind: \"false\" }\n | { kind: \"integer\"; text: string }\n | { kind: \"real\"; text: string }\n | { kind: \"string\"; value: string }\n | { kind: \"array\"; elements: JsonNode[] }\n | { kind: \"object\"; entries: Array<{ key: string; value: JsonNode }> };\n\nexport type JsonTypeName = \"null\" | \"true\" | \"false\" | \"integer\" | \"real\" | \"text\" | \"array\" | \"object\";\n\nexport function jsonTypeName(node: JsonNode): JsonTypeName {\n switch (node.kind) {\n case \"null\":\n return \"null\";\n case \"true\":\n return \"true\";\n case \"false\":\n return \"false\";\n case \"integer\":\n return \"integer\";\n case \"real\":\n return \"real\";\n case \"string\":\n return \"text\";\n case \"array\":\n return \"array\";\n case \"object\":\n return \"object\";\n }\n}\n\nexport function cloneJson(node: JsonNode): JsonNode {\n switch (node.kind) {\n case \"array\":\n return { kind: \"array\", elements: node.elements.map(cloneJson) };\n case \"object\":\n return {\n kind: \"object\",\n entries: node.entries.map((e) => ({ key: e.key, value: cloneJson(e.value) })),\n };\n case \"integer\":\n case \"real\":\n return { kind: node.kind, text: node.text };\n case \"string\":\n return { kind: \"string\", value: node.value };\n default:\n return { kind: node.kind };\n }\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { asSqlJsonText, asSqlReal, isSqlJsonText, SqlJsonText, type SqlValue, utf8Decode } from \"../types/value.ts\";\nimport { decodeJsonb, encodeJsonb, looksLikeJsonb } from \"./jsonb.ts\";\nimport { JsonParseError, parseJsonText } from \"./parse.ts\";\nimport { type PathStep, parseJsonPath, pathGet, pathParent } from \"./path.ts\";\nimport { stringifyJson } from \"./stringify.ts\";\nimport { cloneJson, type JsonNode } from \"./types.ts\";\n\nexport function sqlToJsonInput(value: SqlValue): JsonNode {\n if (value === null) return { kind: \"null\" };\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) return { kind: \"null\" };\n if (Number.isInteger(value)) return { kind: \"integer\", text: String(value) };\n return { kind: \"real\", text: String(value) };\n }\n if (typeof value === \"bigint\") return { kind: \"integer\", text: value.toString() };\n if (value instanceof SqlJsonText) return parseJsonText(value.value);\n if (typeof value === \"string\") return parseJsonText(value);\n if (value instanceof Uint8Array) {\n if (looksLikeJsonb(value)) return decodeJsonb(value);\n // Legacy blob-as-text JSON bug compatibility\n return parseJsonText(utf8Decode(value));\n }\n // SqlReal\n if (typeof value === \"object\" && value !== null && \"value\" in value) {\n const n = (value as { value: number }).value;\n if (!Number.isFinite(n)) return { kind: \"null\" };\n return { kind: \"real\", text: String(n) };\n }\n throw new SqliteError(\"malformed JSON\", \"other\");\n}\n\nexport function trySqlToJsonInput(value: SqlValue): JsonNode | null {\n try {\n return sqlToJsonInput(value);\n } catch {\n return null;\n }\n}\n\n/** VALUE arg for insert/set/array/object \u2014 literal unless JSON subtype / JSONB. */\nexport function sqlValueToJsonNode(value: SqlValue): JsonNode {\n if (value === null) return { kind: \"null\" };\n if (isSqlJsonText(value)) return parseJsonText(value.value);\n if (value instanceof Uint8Array && looksLikeJsonb(value)) return decodeJsonb(value);\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) return { kind: \"null\" };\n if (Number.isInteger(value)) return { kind: \"integer\", text: String(value) };\n return { kind: \"real\", text: String(value) };\n }\n if (typeof value === \"bigint\") return { kind: \"integer\", text: value.toString() };\n if (typeof value === \"object\" && value !== null && !(value instanceof Uint8Array) && \"value\" in value) {\n const n = (value as { value: number }).value;\n return { kind: \"real\", text: String(n) };\n }\n if (value instanceof Uint8Array) {\n throw new SqliteError(\"JSON cannot hold BLOB values\", \"other\");\n }\n // plain text / string \u2192 JSON string\n return { kind: \"string\", value: String(value) };\n}\n\nexport function jsonNodeToSql(node: JsonNode, mode: \"sql\" | \"json\" | \"jsonb\"): SqlValue {\n if (mode === \"jsonb\") return encodeJsonb(node);\n if (mode === \"json\") return asSqlJsonText(stringifyJson(node));\n // sql representation (json_extract single path / ->>)\n switch (node.kind) {\n case \"null\":\n return null;\n case \"true\":\n return 1;\n case \"false\":\n return 0;\n case \"integer\": {\n const n = Number(node.text);\n if (Number.isSafeInteger(n)) return n;\n try {\n return BigInt(node.text);\n } catch {\n return n;\n }\n }\n case \"real\": {\n const n = Number(node.text);\n return Number.isInteger(n) ? asSqlReal(n) : n;\n }\n case \"string\":\n return node.value;\n case \"array\":\n case \"object\":\n // ->> / sql mode: plain TEXT without JSON subtype so nested json_* quote it.\n if (mode === \"sql\") return stringifyJson(node);\n return asSqlJsonText(stringifyJson(node));\n }\n}\n\nexport function jsonArrowPath(right: SqlValue): string {\n if (right === null) throw new SqliteError(\"JSON path error\", \"other\");\n if (typeof right === \"number\" || typeof right === \"bigint\") {\n const n = typeof right === \"bigint\" ? Number(right) : Math.trunc(right);\n if (n < 0) return `$[#${n}]`; // -K \u2192 [#-K] via `[#-K]` \u2014 n is already negative\n return `$[${n}]`;\n }\n const text = isSqlJsonText(right) ? right.value : String(right);\n if (text.startsWith(\"$\")) return text;\n if (/^-?\\d+$/.test(text)) {\n const n = Number(text);\n if (n < 0) return `$[#${n}]`;\n return `$[${n}]`;\n }\n return `$.${text}`;\n}\n\nexport function extractOne(root: JsonNode, path: string): JsonNode | undefined {\n return pathGet(root, parseJsonPath(path));\n}\n\nexport type MutateMode = \"insert\" | \"replace\" | \"set\";\n\n/**\n * json_array_insert / jsonb_array_insert \u2014 like json_replace, but PATH must end\n * with an array index and the value is spliced in (existing elements shift right).\n * https://www.sqlite.org/json1.html#jarrins\n */\nexport function arrayInsertJson(root: JsonNode, path: string, value: JsonNode): JsonNode {\n const steps = parseJsonPath(path);\n const last = steps[steps.length - 1];\n if (!last || last.kind === \"root\" || last.kind === \"key\") {\n throw new SqliteError(\"JSON path error\", \"other\");\n }\n const result = cloneJson(root);\n const parentInfo = pathParent(result, steps);\n if (parentInfo?.parent.kind !== \"array\") return result;\n const parent = parentInfo.parent;\n let idx = parentInfo.index;\n if (last.kind === \"fromEnd\") idx = parent.elements.length - last.n;\n if (last.kind === \"append\") idx = parent.elements.length;\n if (idx < 0 || idx > parent.elements.length) return result;\n parent.elements.splice(idx, 0, cloneJson(value));\n return result;\n}\n\nexport function mutateJson(root: JsonNode, path: string, value: JsonNode, mode: MutateMode): JsonNode {\n const steps = parseJsonPath(path);\n if (steps.length <= 1) {\n // path is $\n if (mode === \"insert\") return root;\n return cloneJson(value);\n }\n const result = cloneJson(root);\n if (!applyMutate(result, steps, value, mode)) {\n createPathAndSet(result, steps, value, mode);\n }\n return result;\n}\n\nfunction applyMutate(root: JsonNode, steps: PathStep[], value: JsonNode, mode: MutateMode): boolean {\n const parentInfo = pathParent(root, steps);\n if (!parentInfo) return false;\n const { parent, step, index } = parentInfo;\n if (step.kind === \"key\") {\n if (parent.kind !== \"object\") return false;\n if (index >= 0) {\n if (mode === \"insert\") return false;\n parent.entries[index] = { key: step.key, value: cloneJson(value) };\n return true;\n }\n if (mode === \"replace\") return false;\n parent.entries.push({ key: step.key, value: cloneJson(value) });\n return true;\n }\n if (parent.kind !== \"array\") return false;\n if (step.kind === \"append\") {\n if (mode === \"replace\") return false;\n parent.elements.push(cloneJson(value));\n return true;\n }\n let idx = index;\n if (step.kind === \"fromEnd\") idx = parent.elements.length - step.n;\n if (idx < 0 || idx > parent.elements.length) return false;\n if (idx === parent.elements.length) {\n if (mode === \"replace\") return false;\n parent.elements.push(cloneJson(value));\n return true;\n }\n if (mode === \"insert\") return false;\n parent.elements[idx] = cloneJson(value);\n return true;\n}\n\nfunction createPathAndSet(root: JsonNode, steps: PathStep[], value: JsonNode, mode: MutateMode): boolean {\n // Walk creating missing object keys / refusing missing array slots (SQLite behavior)\n let cur = root;\n for (let i = 1; i < steps.length - 1; i++) {\n const step = steps[i]!;\n const next = steps[i + 1]!;\n if (step.kind === \"key\") {\n if (cur.kind !== \"object\") return false;\n let entry = cur.entries.find((e) => e.key === step.key);\n if (!entry) {\n if (mode === \"replace\") return false;\n const child: JsonNode =\n next.kind === \"key\" || next.kind === \"root\"\n ? { kind: \"object\", entries: [] }\n : { kind: \"array\", elements: [] };\n entry = { key: step.key, value: child };\n cur.entries.push(entry);\n }\n cur = entry.value;\n continue;\n }\n if (cur.kind !== \"array\") return false;\n let idx = step.kind === \"index\" ? step.index : step.kind === \"fromEnd\" ? cur.elements.length - step.n : -1;\n if (step.kind === \"append\") idx = cur.elements.length;\n if (idx < 0 || idx > cur.elements.length) return false;\n if (idx === cur.elements.length) {\n if (mode === \"replace\") return false;\n const child: JsonNode = next.kind === \"key\" ? { kind: \"object\", entries: [] } : { kind: \"array\", elements: [] };\n cur.elements.push(child);\n }\n cur = cur.elements[idx]!;\n }\n return applyMutate(root, steps, value, mode);\n}\n\nexport function removeJson(root: JsonNode, path: string): JsonNode {\n const steps = parseJsonPath(path);\n if (steps.length <= 1) return root;\n const result = cloneJson(root);\n const parentInfo = pathParent(result, steps);\n if (!parentInfo) return result;\n const { parent, step, index } = parentInfo;\n if (step.kind === \"key\" && parent.kind === \"object\" && index >= 0) {\n parent.entries.splice(index, 1);\n } else if (parent.kind === \"array\") {\n let idx = index;\n if (step.kind === \"fromEnd\") idx = parent.elements.length - step.n;\n if (step.kind === \"append\") return result;\n if (idx >= 0 && idx < parent.elements.length) parent.elements.splice(idx, 1);\n }\n return result;\n}\n\n/** RFC7396-ish JSON Merge Patch as implemented by SQLite json_patch. */\nexport function patchJson(target: JsonNode, patch: JsonNode): JsonNode {\n if (patch.kind !== \"object\") return cloneJson(patch);\n const base = target.kind === \"object\" ? cloneJson(target) : ({ kind: \"object\", entries: [] } as JsonNode);\n if (base.kind !== \"object\") return cloneJson(patch);\n for (const entry of patch.entries) {\n if (entry.value.kind === \"null\") {\n base.entries = base.entries.filter((e) => e.key !== entry.key);\n continue;\n }\n const existing = base.entries.find((e) => e.key === entry.key);\n if (existing) {\n existing.value = patchJson(existing.value, entry.value);\n } else {\n base.entries.push({ key: entry.key, value: cloneJson(entry.value) });\n }\n }\n return base;\n}\n\nexport function wrapJsonError(e: unknown): never {\n if (e instanceof SqliteError) throw e;\n if (e instanceof JsonParseError) throw new SqliteError(\"malformed JSON\", \"other\");\n throw new SqliteError(\"malformed JSON\", \"other\");\n}\n\nexport function ensureJson(value: SqlValue): JsonNode {\n try {\n return sqlToJsonInput(value);\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nexport function toJsonbBlob(value: SqlValue): Uint8Array {\n if (value instanceof Uint8Array && looksLikeJsonb(value)) return value;\n return encodeJsonb(ensureJson(value));\n}\n\nexport function toJsonText(value: SqlValue): SqlJsonText {\n return asSqlJsonText(stringifyJson(ensureJson(value)));\n}\n", "import type { SqlValue } from \"../types/value.ts\";\nimport { encodeJsonb, type JsonbWalkEntry, walkJsonbTree } from \"./jsonb.ts\";\nimport { ensureJson, jsonNodeToSql } from \"./ops.ts\";\nimport { stringifyJson } from \"./stringify.ts\";\nimport { type JsonNode, jsonTypeName } from \"./types.ts\";\n\nexport interface JsonTvfRow {\n key: SqlValue;\n value: SqlValue;\n type: string;\n atom: SqlValue;\n id: number;\n parent: SqlValue;\n fullkey: string;\n path: string;\n}\n\nfunction atomOf(node: JsonNode): SqlValue {\n switch (node.kind) {\n case \"null\":\n return null;\n case \"true\":\n return 1;\n case \"false\":\n return 0;\n case \"integer\":\n case \"real\":\n case \"string\":\n return jsonNodeToSql(node, \"sql\");\n default:\n return null;\n }\n}\n\nfunction valueOf(node: JsonNode): SqlValue {\n if (node.kind === \"array\" || node.kind === \"object\") return stringifyJson(node);\n return jsonNodeToSql(node, \"sql\");\n}\n\nexport function jsonEachRows(json: SqlValue, path?: SqlValue): JsonTvfRow[] {\n const root = ensureJson(json);\n const blob = encodeJsonb(root);\n const walk = walkJsonbTree(blob);\n const rootEntry = walk[0];\n if (!rootEntry) return [];\n\n let focus = rootEntry;\n if (path !== undefined && path !== null) {\n const targetPath = String(path);\n const found = walk.find((e) => e.fullkey === targetPath);\n if (!found) return [];\n focus = found;\n }\n\n if (focus.node.kind !== \"array\" && focus.node.kind !== \"object\") {\n return [\n {\n key: focus.key,\n value: valueOf(focus.node),\n type: jsonTypeName(focus.node),\n atom: atomOf(focus.node),\n id: focus.idOffset,\n parent: null,\n fullkey: focus.fullkey,\n path: focus.path,\n },\n ];\n }\n\n return walk.filter((e) => e.parent === focus.idOffset).map((e) => rowFromWalk(e, true));\n}\n\nexport function jsonTreeRows(json: SqlValue, path?: SqlValue): JsonTvfRow[] {\n const root = ensureJson(json);\n const blob = encodeJsonb(root);\n const walk = walkJsonbTree(blob);\n\n if (path === undefined || path === null) {\n return walk.map((e) => rowFromWalk(e, false));\n }\n\n const targetPath = String(path);\n // Keep IDs from the full document; return the subtree rooted at targetPath.\n const rootEntry = walk.find((e) => e.fullkey === targetPath);\n if (!rootEntry) return [];\n const subtree = walk.filter(\n (e) => e.fullkey === targetPath || e.fullkey.startsWith(targetPath + \".\") || e.fullkey.startsWith(targetPath + \"[\"),\n );\n return subtree.map((e) => {\n const row = rowFromWalk(e, false);\n if (e.idOffset === rootEntry.idOffset) {\n row.parent = null;\n }\n return row;\n });\n}\n\nfunction rowFromWalk(e: JsonbWalkEntry, eachMode: boolean): JsonTvfRow {\n return {\n key: e.key,\n value: valueOf(e.node),\n type: jsonTypeName(e.node),\n atom: atomOf(e.node),\n id: e.idOffset,\n parent: eachMode ? null : e.parent,\n fullkey: e.fullkey,\n path: e.path,\n };\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport {\n arrayInsertJson,\n ensureJson,\n extractOne,\n isValidJsonText,\n jsonArrowPath,\n jsonErrorPosition,\n jsonNodeToSql,\n mutateJson,\n patchJson,\n prettyJson,\n removeJson,\n sqlValueToJsonNode,\n stringifyJson,\n toJsonbBlob,\n toJsonText,\n wrapJsonError,\n} from \"../json/index.ts\";\nimport { decodeJsonb, looksLikeJsonb } from \"../json/jsonb.ts\";\nimport { jsonTypeName } from \"../json/types.ts\";\nimport { asSqlJsonText, isSqlJsonText, type SqlValue, subtypeOf, utf8Decode } from \"../types/value.ts\";\nimport type { AggregateAccumulator, AggregateFactory } from \"./aggregate.ts\";\nimport type { ScalarFunction } from \"./registry.ts\";\n\nfunction textOf(value: SqlValue): string {\n if (value instanceof Uint8Array) return utf8Decode(value);\n if (isSqlJsonText(value)) return value.value;\n return String(value);\n}\n\nfunction _requireOdd(name: string, args: SqlValue[]): void {\n if (args.length % 2 === 0) {\n throw new SqliteError(`json_${name}() requires an odd number of arguments`, \"misuse\");\n }\n}\n\nfunction arrayInsertArgs(args: SqlValue[], asJsonb: boolean): SqlValue {\n if (args.length === 0) {\n throw new SqliteError(\"wrong number of arguments to function json_array_insert()\", \"misuse\");\n }\n if (args.length % 2 === 0) {\n throw new SqliteError(\"json_array_insert() requires an odd number of arguments\", \"misuse\");\n }\n if (args.some((arg) => arg === null)) return null;\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i += 2) {\n const path = textOf(args[i]!);\n const value = sqlValueToJsonNode(args[i + 1]!);\n node = arrayInsertJson(node, path, value);\n }\n return asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nfunction mutateArgs(args: SqlValue[], mode: \"insert\" | \"replace\" | \"set\", asJsonb: boolean): SqlValue {\n if (args.length === 0) throw new SqliteError(`wrong number of arguments to function json_${mode}()`, \"misuse\");\n if (args.length % 2 === 0) {\n throw new SqliteError(`json_${mode}() requires an odd number of arguments`, \"misuse\");\n }\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i += 2) {\n const path = textOf(args[i]!);\n const value = sqlValueToJsonNode(args[i + 1]!);\n node = mutateJson(node, path, value, mode);\n }\n return asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nfunction extract(args: SqlValue[], asJsonb: boolean): SqlValue {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function json_extract()\", \"misuse\");\n try {\n const root = ensureJson(args[0]!);\n if (args.length === 2) {\n const found = extractOne(root, textOf(args[1]!));\n if (found === undefined) return null;\n if (asJsonb && (found.kind === \"array\" || found.kind === \"object\")) {\n return jsonNodeToSql(found, \"jsonb\");\n }\n if (found.kind === \"array\" || found.kind === \"object\") return jsonNodeToSql(found, \"json\");\n return jsonNodeToSql(found, \"sql\");\n }\n const parts = args.slice(1).map((p) => {\n const found = extractOne(root, textOf(p!));\n return found === undefined ? { kind: \"null\" as const } : found;\n });\n const arr = { kind: \"array\" as const, elements: parts };\n return asJsonb ? jsonNodeToSql(arr, \"jsonb\") : jsonNodeToSql(arr, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nexport function jsonArrow(left: SqlValue, right: SqlValue, mode: \"->\" | \"->>\"): SqlValue {\n if (left === null || right === null) return null;\n try {\n const root = ensureJson(left);\n const path = jsonArrowPath(right);\n const found = extractOne(root, path);\n if (found === undefined) return null;\n if (mode === \"->\") return asSqlJsonText(stringifyJson(found));\n return jsonNodeToSql(found, \"sql\");\n } catch (e) {\n // -> on malformed JSON errors\n wrapJsonError(e);\n }\n}\n\nexport const jsonScalarFunctions: Readonly<Record<string, ScalarFunction>> = {\n json(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function json()\", \"misuse\");\n if (args[0] === null) return null;\n return toJsonText(args[0]!);\n },\n jsonb(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function jsonb()\", \"misuse\");\n if (args[0] === null) return null;\n return toJsonbBlob(args[0]!);\n },\n json_array(args) {\n try {\n const elements = args.map((a) => sqlValueToJsonNode(a));\n return jsonNodeToSql({ kind: \"array\", elements }, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_array(args) {\n try {\n const elements = args.map((a) => sqlValueToJsonNode(a));\n return jsonNodeToSql({ kind: \"array\", elements }, \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_object(args) {\n if (args.length % 2 !== 0) {\n throw new SqliteError(\"json_object() requires an even number of arguments\", \"misuse\");\n }\n try {\n const entries: Array<{ key: string; value: import(\"../json/types.ts\").JsonNode }> = [];\n for (let i = 0; i < args.length; i += 2) {\n if (args[i] === null) throw new SqliteError(\"json_object() labels must be TEXT\", \"other\");\n if (args[i] instanceof Uint8Array) throw new SqliteError(\"JSON cannot hold BLOB values\", \"other\");\n const key = textOf(args[i]!);\n entries.push({ key, value: sqlValueToJsonNode(args[i + 1]!) });\n }\n return jsonNodeToSql({ kind: \"object\", entries }, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_object(args) {\n if (args.length % 2 !== 0) {\n throw new SqliteError(\"json_object() requires an even number of arguments\", \"misuse\");\n }\n try {\n const entries: Array<{ key: string; value: import(\"../json/types.ts\").JsonNode }> = [];\n for (let i = 0; i < args.length; i += 2) {\n if (args[i] === null) throw new SqliteError(\"json_object() labels must be TEXT\", \"other\");\n if (args[i] instanceof Uint8Array) throw new SqliteError(\"JSON cannot hold BLOB values\", \"other\");\n const key = textOf(args[i]!);\n entries.push({ key, value: sqlValueToJsonNode(args[i + 1]!) });\n }\n return jsonNodeToSql({ kind: \"object\", entries }, \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_quote(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function json_quote()\", \"misuse\");\n const v = args[0] ?? null;\n if (v === null) return asSqlJsonText(\"null\");\n if (isSqlJsonText(v)) return v;\n if (v instanceof Uint8Array && looksLikeJsonb(v)) return asSqlJsonText(stringifyJson(decodeJsonb(v)));\n try {\n return asSqlJsonText(stringifyJson(sqlValueToJsonNode(v)));\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_extract(args) {\n return extract(args, false);\n },\n jsonb_extract(args) {\n return extract(args, true);\n },\n json_insert(args) {\n return mutateArgs(args, \"insert\", false);\n },\n jsonb_insert(args) {\n return mutateArgs(args, \"insert\", true);\n },\n json_array_insert(args) {\n return arrayInsertArgs(args, false);\n },\n jsonb_array_insert(args) {\n return arrayInsertArgs(args, true);\n },\n json_replace(args) {\n return mutateArgs(args, \"replace\", false);\n },\n jsonb_replace(args) {\n return mutateArgs(args, \"replace\", true);\n },\n json_set(args) {\n return mutateArgs(args, \"set\", false);\n },\n jsonb_set(args) {\n return mutateArgs(args, \"set\", true);\n },\n json_remove(args) {\n if (args.length < 1) throw new SqliteError(\"wrong number of arguments to function json_remove()\", \"misuse\");\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i++) {\n node = removeJson(node, textOf(args[i]!));\n }\n return jsonNodeToSql(node, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_remove(args) {\n if (args.length < 1) throw new SqliteError(\"wrong number of arguments to function jsonb_remove()\", \"misuse\");\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i++) {\n node = removeJson(node, textOf(args[i]!));\n }\n return jsonNodeToSql(node, \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_patch(args) {\n if (args.length !== 2) throw new SqliteError(\"wrong number of arguments to function json_patch()\", \"misuse\");\n try {\n return jsonNodeToSql(patchJson(ensureJson(args[0]!), ensureJson(args[1]!)), \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_patch(args) {\n if (args.length !== 2) throw new SqliteError(\"wrong number of arguments to function jsonb_patch()\", \"misuse\");\n try {\n return jsonNodeToSql(patchJson(ensureJson(args[0]!), ensureJson(args[1]!)), \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_type(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_type()\", \"misuse\");\n }\n if (args[0] === null) return null;\n try {\n let node = ensureJson(args[0]!);\n if (args.length === 2) {\n if (args[1] === null) return null;\n const found = extractOne(node, textOf(args[1]!));\n if (!found) return null;\n node = found;\n }\n return jsonTypeName(node);\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_valid(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_valid()\", \"misuse\");\n }\n if (args[0] === null) return 0;\n const flags = args.length === 2 && args[1] !== null ? Number(args[1]) : 0;\n if (args[0] instanceof Uint8Array) {\n return looksLikeJsonb(args[0]) ? 1 : 0;\n }\n return isValidJsonText(textOf(args[0]!), flags) ? 1 : 0;\n },\n json_error_position(args) {\n if (args.length !== 1) {\n throw new SqliteError(\"wrong number of arguments to function json_error_position()\", \"misuse\");\n }\n if (args[0] === null) return 0;\n if (args[0] instanceof Uint8Array) {\n return looksLikeJsonb(args[0]) ? 0 : 1;\n }\n return jsonErrorPosition(textOf(args[0]!));\n },\n json_array_length(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_array_length()\", \"misuse\");\n }\n if (args[0] === null) return null;\n try {\n let node = ensureJson(args[0]!);\n if (args.length === 2) {\n if (args[1] === null) return null;\n const found = extractOne(node, textOf(args[1]!));\n if (!found) return null;\n node = found;\n }\n if (node.kind !== \"array\") return 0;\n return node.elements.length;\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_pretty(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_pretty()\", \"misuse\");\n }\n if (args[0] === null) return null;\n try {\n const node = ensureJson(args[0]!);\n const indent = args.length === 2 && args[1] !== null ? textOf(args[1]!) : \" \";\n return asSqlJsonText(prettyJson(node, indent));\n } catch (e) {\n wrapJsonError(e);\n }\n },\n subtype(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function subtype()\", \"misuse\");\n return subtypeOf(args[0] ?? null);\n },\n};\n\nclass JsonGroupArrayAccumulator implements AggregateAccumulator {\n private readonly values: import(\"../json/types.ts\").JsonNode[] = [];\n constructor(private readonly asJsonb: boolean) {}\n step(args: SqlValue[]): void {\n if (args[0] === undefined) return;\n // NULLs are included as JSON null in json_group_array\n this.values.push(sqlValueToJsonNode(args[0]!));\n }\n finalize(): SqlValue {\n const node = { kind: \"array\" as const, elements: this.values };\n return this.asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n }\n}\n\nclass JsonGroupObjectAccumulator implements AggregateAccumulator {\n private readonly entries: Array<{ key: string; value: import(\"../json/types.ts\").JsonNode }> = [];\n constructor(private readonly asJsonb: boolean) {}\n step(args: SqlValue[]): void {\n if (args[0] === null || args[0] === undefined) return;\n const key = textOf(args[0]!);\n this.entries.push({ key, value: sqlValueToJsonNode(args[1] ?? null) });\n }\n finalize(): SqlValue {\n const node = { kind: \"object\" as const, entries: this.entries };\n return this.asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n }\n}\n\nexport const jsonAggregateFunctions: Readonly<Record<string, AggregateFactory>> = {\n json_group_array: () => new JsonGroupArrayAccumulator(false),\n jsonb_group_array: () => new JsonGroupArrayAccumulator(true),\n json_group_object: () => new JsonGroupObjectAccumulator(false),\n jsonb_group_object: () => new JsonGroupObjectAccumulator(true),\n};\n", "import { coerceToNumber, compareSql, type SqlValue, utf8Decode } from \"../types/value.ts\";\n\nexport interface AggregateAccumulator {\n step(args: SqlValue[]): void;\n finalize(): SqlValue;\n}\n\nexport type AggregateFactory = () => AggregateAccumulator;\n\nclass CountAccumulator implements AggregateAccumulator {\n private count = 0;\n step(args: SqlValue[]): void {\n if (args.length === 0 || args[0] !== null) this.count++;\n }\n finalize(): SqlValue {\n return this.count;\n }\n}\n\nclass NumericAccumulator implements AggregateAccumulator {\n private count = 0;\n private sum = 0;\n constructor(private readonly mode: \"sum\" | \"avg\" | \"total\") {}\n step(args: SqlValue[]): void {\n const value = args[0];\n if (value === null || value === undefined) return;\n this.sum += coerceToNumber(value) ?? 0;\n this.count++;\n }\n finalize(): SqlValue {\n if (this.mode === \"total\") return this.sum;\n if (this.count === 0) return null;\n return this.mode === \"avg\" ? this.sum / this.count : this.sum;\n }\n}\n\nclass MinMaxAccumulator implements AggregateAccumulator {\n private value: SqlValue = null;\n constructor(private readonly direction: \"min\" | \"max\") {}\n step(args: SqlValue[]): void {\n const candidate = args[0];\n if (candidate === null || candidate === undefined) return;\n if (this.value === null) {\n this.value = candidate;\n return;\n }\n const comparison = compareSql(candidate, this.value)!;\n if ((this.direction === \"min\" && comparison < 0) || (this.direction === \"max\" && comparison > 0)) {\n this.value = candidate;\n }\n }\n finalize(): SqlValue {\n return this.value;\n }\n}\n\nclass GroupConcatAccumulator implements AggregateAccumulator {\n private readonly values: string[] = [];\n private separator = \",\";\n step(args: SqlValue[]): void {\n if (args[0] === null || args[0] === undefined) return;\n if (args[1] !== undefined && args[1] !== null) this.separator = String(args[1]);\n this.values.push(args[0] instanceof Uint8Array ? utf8Decode(args[0]) : String(args[0]));\n }\n finalize(): SqlValue {\n return this.values.length === 0 ? null : this.values.join(this.separator);\n }\n}\n\nexport const aggregateFunctions: Readonly<Record<string, AggregateFactory>> = {\n count: () => new CountAccumulator(),\n sum: () => new NumericAccumulator(\"sum\"),\n avg: () => new NumericAccumulator(\"avg\"),\n total: () => new NumericAccumulator(\"total\"),\n min: () => new MinMaxAccumulator(\"min\"),\n max: () => new MinMaxAccumulator(\"max\"),\n group_concat: () => new GroupConcatAccumulator(),\n string_agg: () => new GroupConcatAccumulator(),\n};\n\nexport function createAggregate(name: string): AggregateAccumulator | undefined {\n return aggregateFunctions[name.toLowerCase()]?.();\n}\n", "import { coerceToNumber, isSqlReal, type SqlValue } from \"../types/value.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\nconst JULIAN_UNIX_EPOCH = 2440587.5;\n\nfunction parseDate(value: SqlValue | undefined, context: FunctionContext): Date | null {\n if (value === undefined || value === \"now\") {\n return context.now?.() ?? new Date(\"2000-01-01T00:00:00.000Z\");\n }\n if (value === null || value instanceof Uint8Array) return null;\n if (typeof value === \"number\" || typeof value === \"bigint\" || isSqlReal(value)) {\n return new Date((Number(isSqlReal(value) ? value.value : value) - JULIAN_UNIX_EPOCH) * 86400000);\n }\n if (typeof value !== \"string\") return null;\n const source = /^\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?$/.test(value)\n ? `2000-01-01T${value}Z`\n : /^\\d{4}-\\d\\d-\\d\\d$/.test(value)\n ? `${value}T00:00:00Z`\n : value.replace(\" \", \"T\") + (/[zZ]|[+-]\\d\\d:\\d\\d$/.test(value) ? \"\" : \"Z\");\n const date = new Date(source);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nfunction applyModifier(date: Date, modifier: string): Date | null {\n const result = new Date(date);\n const normalized = modifier.trim().toLowerCase();\n if (normalized === \"unixepoch\") return new Date((date.getTime() / 86400000 + JULIAN_UNIX_EPOCH) * 1000);\n if (normalized === \"utc\" || normalized === \"localtime\") return result;\n if (normalized === \"start of day\") result.setUTCHours(0, 0, 0, 0);\n else if (normalized === \"start of month\") {\n result.setUTCDate(1);\n result.setUTCHours(0, 0, 0, 0);\n } else if (normalized === \"start of year\") {\n result.setUTCMonth(0, 1);\n result.setUTCHours(0, 0, 0, 0);\n } else {\n const match = /^([+-]?\\d+(?:\\.\\d+)?)\\s+(second|minute|hour|day|month|year)s?$/.exec(normalized);\n if (!match) return null;\n const amount = Number(match[1]);\n switch (match[2]) {\n case \"second\":\n result.setTime(result.getTime() + amount * 1000);\n break;\n case \"minute\":\n result.setTime(result.getTime() + amount * 60000);\n break;\n case \"hour\":\n result.setTime(result.getTime() + amount * 3600000);\n break;\n case \"day\":\n result.setTime(result.getTime() + amount * 86400000);\n break;\n case \"month\":\n result.setUTCMonth(result.getUTCMonth() + amount);\n break;\n case \"year\":\n result.setUTCFullYear(result.getUTCFullYear() + amount);\n break;\n }\n }\n return result;\n}\n\nfunction resolveDate(args: SqlValue[], context: FunctionContext): Date | null {\n let source = args[0];\n let modifiers = args.slice(1);\n if (source === undefined) source = \"now\";\n if (modifiers[0] === \"unixepoch\") {\n const seconds = coerceToNumber(source);\n if (seconds === null) return null;\n source = seconds / 86400 + JULIAN_UNIX_EPOCH;\n modifiers = modifiers.slice(1);\n }\n let date = parseDate(source, context);\n if (!date) return null;\n for (const modifier of modifiers) {\n if (typeof modifier !== \"string\") return null;\n date = applyModifier(date, modifier);\n if (!date) return null;\n }\n return date;\n}\n\nfunction pad(value: number, length = 2): string {\n return String(value).padStart(length, \"0\");\n}\n\nfunction isoDate(date: Date): string {\n return `${pad(date.getUTCFullYear(), 4)}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;\n}\n\nfunction isoTime(date: Date): string {\n return `${pad(date.getUTCHours())}:${pad(date.getUTCMinutes())}:${pad(date.getUTCSeconds())}`;\n}\n\nfunction dayOfYear(date: Date): number {\n return (\n Math.floor(\n (Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()) - Date.UTC(date.getUTCFullYear(), 0, 1)) /\n 86400000,\n ) + 1\n );\n}\n\nfunction formatDate(date: Date, format: string): string {\n return format.replace(/%[%YmdHMSfjswWJ]/g, (code) => {\n switch (code) {\n case \"%%\":\n return \"%\";\n case \"%Y\":\n return pad(date.getUTCFullYear(), 4);\n case \"%m\":\n return pad(date.getUTCMonth() + 1);\n case \"%d\":\n return pad(date.getUTCDate());\n case \"%H\":\n return pad(date.getUTCHours());\n case \"%M\":\n return pad(date.getUTCMinutes());\n case \"%S\":\n return pad(date.getUTCSeconds());\n case \"%f\":\n return `${pad(date.getUTCSeconds())}.${pad(date.getUTCMilliseconds(), 3)}`;\n case \"%j\":\n return pad(dayOfYear(date), 3);\n case \"%s\":\n return String(Math.floor(date.getTime() / 1000));\n case \"%w\":\n return String(date.getUTCDay());\n case \"%W\":\n return pad(Math.floor((dayOfYear(date) - 1 + 7 - date.getUTCDay()) / 7));\n case \"%J\":\n return String(date.getTime() / 86400000 + JULIAN_UNIX_EPOCH);\n default:\n return code;\n }\n });\n}\n\nexport const dateTimeFunctions: Readonly<Record<string, ScalarFunction>> = {\n date(args, context) {\n const value = resolveDate(args, context);\n return value ? isoDate(value) : null;\n },\n time(args, context) {\n const value = resolveDate(args, context);\n return value ? isoTime(value) : null;\n },\n datetime(args, context) {\n const value = resolveDate(args, context);\n return value ? `${isoDate(value)} ${isoTime(value)}` : null;\n },\n julianday(args, context) {\n const value = resolveDate(args, context);\n return value ? value.getTime() / 86400000 + JULIAN_UNIX_EPOCH : null;\n },\n strftime(args, context) {\n if (typeof args[0] !== \"string\") return null;\n const value = resolveDate(args.slice(1), context);\n return value ? formatDate(value, args[0]) : null;\n },\n current_date(args, context) {\n return dateTimeFunctions.date!(args.length === 0 ? [\"now\"] : args, context);\n },\n current_time(args, context) {\n return dateTimeFunctions.time!(args.length === 0 ? [\"now\"] : args, context);\n },\n current_timestamp(args, context) {\n return dateTimeFunctions.datetime!(args.length === 0 ? [\"now\"] : args, context);\n },\n unixepoch(args, context) {\n const value = resolveDate(args.length === 0 ? [\"now\"] : args, context);\n return value ? Math.floor(value.getTime() / 1000) : null;\n },\n timediff(args) {\n if (args.length !== 2) return null;\n const a = parseDate(args[0], {});\n const b = parseDate(args[1], {});\n if (!a || !b) return null;\n let ms = a.getTime() - b.getTime();\n const sign = ms < 0 ? \"-\" : \"+\";\n ms = Math.abs(ms);\n const years = Math.floor(ms / (365.2425 * 86400000));\n ms -= years * 365.2425 * 86400000;\n // Approximate month/day breakdown matching SQLite's YYYY-MM-DD HH:MM:SS.mmm style\n const months = Math.floor(ms / (30.436875 * 86400000));\n ms -= months * 30.436875 * 86400000;\n const days = Math.floor(ms / 86400000);\n ms -= days * 86400000;\n const hours = Math.floor(ms / 3600000);\n ms -= hours * 3600000;\n const minutes = Math.floor(ms / 60000);\n ms -= minutes * 60000;\n const seconds = Math.floor(ms / 1000);\n const millis = Math.floor(ms % 1000);\n const p = (n: number, w: number) => String(n).padStart(w, \"0\");\n return `${sign}${p(years, 4)}-${p(months, 2)}-${p(days, 2)} ${p(hours, 2)}:${p(minutes, 2)}:${p(seconds, 2)}.${p(millis, 3)}`;\n },\n};\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\nfunction requireArgs(name: string, args: SqlValue[], min: number, max = min): void {\n if (args.length < min || args.length > max) {\n throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n }\n}\n\nfunction resolveFtsTable(args: SqlValue[], context: FunctionContext, name: string) {\n const first = args[0];\n let tableName: string | null = null;\n if (typeof first === \"string\") tableName = first;\n else if (context.ftsSourceTable) tableName = context.ftsSourceTable;\n else if (context.ftsMatch) tableName = context.ftsMatch.tableName;\n if (!tableName || !context.getFtsTable) {\n throw new SqliteError(`unable to use function ${name} in the requested context`, \"unsupported\");\n }\n const table = context.getFtsTable(tableName);\n if (!table) throw new SqliteError(`unable to use function ${name} in the requested context`, \"unsupported\");\n return table;\n}\n\nfunction columnText(\n table: import(\"../vtable/fts5.ts\").Fts5VirtualTable,\n context: FunctionContext,\n colIndex: number,\n): string {\n const col = table.columns[colIndex];\n if (!col) return \"\";\n const rowid = context.ftsMatch?.rowid ?? context.ftsRowid;\n if (rowid === undefined) return \"\";\n const row = table.rows.get(rowid);\n if (!row) return \"\";\n const value = row.values.get(col.toLowerCase());\n return value === null || value === undefined ? \"\" : String(value);\n}\n\n/**\n * FTS auxiliary functions. When used with a MATCH cursor they compute real\n * values; without MATCH they mirror SQLite's empty-cursor defaults.\n */\nexport const ftsAuxFunctions: Readonly<Record<string, ScalarFunction>> = {\n bm25(args, context) {\n requireArgs(\"bm25\", args, 1, 100);\n const table = resolveFtsTable(args, context, \"bm25\");\n const weights = args.slice(1).map((v) => (typeof v === \"number\" ? v : Number(v)));\n if (!context.ftsMatch || context.ftsMatch.tableName.toLowerCase() !== table.name.toLowerCase()) {\n return -0;\n }\n return table.bm25(context.ftsMatch, weights.length ? weights : undefined);\n },\n highlight(args, context) {\n requireArgs(\"highlight\", args, 4);\n const table = resolveFtsTable(args, context, \"highlight\");\n const colIndex = Number(args[1] ?? 0);\n const open = String(args[2] ?? \"\");\n const close = String(args[3] ?? \"\");\n if (!context.ftsMatch || context.ftsMatch.tableName.toLowerCase() !== table.name.toLowerCase()) {\n return columnText(table, context, colIndex);\n }\n return table.highlight(context.ftsMatch, colIndex, open, close);\n },\n snippet(args, context) {\n requireArgs(\"snippet\", args, 1, 6);\n const table = resolveFtsTable(args, context, \"snippet\");\n const colIndex = Number(args[1] ?? 0);\n const open = String(args[2] ?? \"<b>\");\n const close = String(args[3] ?? \"</b>\");\n const ellipsis = String(args[4] ?? \"...\");\n const tokenCount = Number(args[5] ?? 64);\n if (!context.ftsMatch || context.ftsMatch.tableName.toLowerCase() !== table.name.toLowerCase()) {\n return columnText(table, context, colIndex);\n }\n return table.snippet(context.ftsMatch, colIndex, open, close, ellipsis, tokenCount);\n },\n matchinfo(args, context) {\n requireArgs(\"matchinfo\", args, 1, 2);\n const table = resolveFtsTable(args, context, \"matchinfo\");\n const format = typeof args[1] === \"string\" ? args[1] : \"pcx\";\n if (!context.ftsMatch) {\n throw new SqliteError(\"unable to use function matchinfo in the requested context\", \"unsupported\");\n }\n return table.matchinfo(context.ftsMatch, format);\n },\n offsets(args, context) {\n requireArgs(\"offsets\", args, 1);\n const table = resolveFtsTable(args, context, \"offsets\");\n if (!context.ftsMatch) {\n throw new SqliteError(\"unable to use function offsets in the requested context\", \"unsupported\");\n }\n return table.offsets(context.ftsMatch);\n },\n};\n\nexport const rtreeAuxFunctions: Readonly<Record<string, ScalarFunction>> = {\n rtreecheck(args) {\n requireArgs(\"rtreecheck\", args, 1, 2);\n if (args.length === 1) return \"ok\";\n throw new SqliteError(\"SQL logic error\", \"other\");\n },\n rtreenode(args) {\n requireArgs(\"rtreenode\", args, 2);\n return \"{}\";\n },\n rtreedepth(args) {\n requireArgs(\"rtreedepth\", args, 1);\n return 0;\n },\n};\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { asSqlReal, coerceToNumber, type SqlValue } from \"../types/value.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\nfunction requireArgs(name: string, args: SqlValue[], min: number, max = min): void {\n if (args.length < min || args.length > max) {\n throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n }\n}\n\nfunction num(value: SqlValue): number | null {\n if (value === null) return null;\n return coerceToNumber(value);\n}\n\nfunction realOrNull(value: number | null): SqlValue {\n if (value === null || Number.isNaN(value)) return null;\n return asSqlReal(value);\n}\n\nfunction unaryMath(name: string, fn: (n: number) => number): ScalarFunction {\n return (args) => {\n requireArgs(name, args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n return realOrNull(fn(n));\n };\n}\n\n/** IEEE754 helpers matching SQLite ENABLE_MATH_FUNCTIONS / ieee754 extension. */\nfunction decodeIeee754(value: number): { mantissa: bigint; exponent: number } {\n const buf = new ArrayBuffer(8);\n new DataView(buf).setFloat64(0, value, false);\n const bits = new DataView(buf).getBigUint64(0, false);\n const sign = bits >> 63n;\n const expBits = Number((bits >> 52n) & 0x7ffn);\n const frac = bits & 0xfffffffffffffn;\n if (expBits === 0) {\n // subnormal or zero\n let m = frac;\n let e = -1074;\n if (m === 0n) return { mantissa: sign === 0n ? 0n : -0n, exponent: 0 };\n while ((m & 1n) === 0n) {\n m >>= 1n;\n e++;\n }\n return { mantissa: sign ? -m : m, exponent: e };\n }\n if (expBits === 0x7ff) {\n // Inf/NaN \u2014 SQLite still formats; use mantissa with high bit\n const m = (1n << 52n) | frac;\n return { mantissa: sign ? -m : m, exponent: 972 };\n }\n let m = (1n << 52n) | frac;\n let e = expBits - 1075;\n while ((m & 1n) === 0n) {\n m >>= 1n;\n e++;\n }\n return { mantissa: sign ? -m : m, exponent: e };\n}\n\nfunction encodeIeee754(mantissa: bigint, exponent: number): number {\n if (mantissa === 0n) return 0;\n const sign = mantissa < 0n ? -1 : 1;\n let m = mantissa < 0n ? -mantissa : mantissa;\n let e = exponent;\n while (m > 0n && (m & 1n) === 0n) {\n m >>= 1n;\n e++;\n }\n // Reconstruct via Math: value = m * 2^e\n return sign * Number(m) * 2 ** e;\n}\n\nexport const mathFunctions: Readonly<Record<string, ScalarFunction>> = {\n acos: unaryMath(\"acos\", Math.acos),\n acosh: unaryMath(\"acosh\", Math.acosh),\n asin: unaryMath(\"asin\", Math.asin),\n asinh: unaryMath(\"asinh\", Math.asinh),\n atan: unaryMath(\"atan\", Math.atan),\n atanh: unaryMath(\"atanh\", Math.atanh),\n ceil: unaryMath(\"ceil\", Math.ceil),\n ceiling: unaryMath(\"ceiling\", Math.ceil),\n cos: unaryMath(\"cos\", Math.cos),\n cosh: unaryMath(\"cosh\", Math.cosh),\n degrees: unaryMath(\"degrees\", (n) => (n * 180) / Math.PI),\n exp: unaryMath(\"exp\", Math.exp),\n floor: unaryMath(\"floor\", Math.floor),\n ln: unaryMath(\"ln\", Math.log),\n log10: unaryMath(\"log10\", Math.log10),\n log2: unaryMath(\"log2\", Math.log2),\n pi(args) {\n requireArgs(\"pi\", args, 0);\n return asSqlReal(Math.PI);\n },\n radians: unaryMath(\"radians\", (n) => (n * Math.PI) / 180),\n sign(args) {\n requireArgs(\"sign\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n if (n > 0) return 1;\n if (n < 0) return -1;\n return 0;\n },\n sin: unaryMath(\"sin\", Math.sin),\n sinh: unaryMath(\"sinh\", Math.sinh),\n sqrt: unaryMath(\"sqrt\", Math.sqrt),\n tan: unaryMath(\"tan\", Math.tan),\n tanh: unaryMath(\"tanh\", Math.tanh),\n trunc: unaryMath(\"trunc\", Math.trunc),\n atan2(args) {\n requireArgs(\"atan2\", args, 2);\n const y = num(args[0]!);\n const x = num(args[1]!);\n if (y === null || x === null) return null;\n return realOrNull(Math.atan2(y, x));\n },\n log(args) {\n requireArgs(\"log\", args, 1, 2);\n if (args.length === 1) {\n const n = num(args[0]!);\n if (n === null) return null;\n return realOrNull(Math.log10(n));\n }\n const base = num(args[0]!);\n const n = num(args[1]!);\n if (base === null || n === null) return null;\n return realOrNull(Math.log(n) / Math.log(base));\n },\n mod(args) {\n requireArgs(\"mod\", args, 2);\n const a = num(args[0]!);\n const b = num(args[1]!);\n if (a === null || b === null) return null;\n if (b === 0) return null;\n return realOrNull(a % b);\n },\n pow(args) {\n requireArgs(\"pow\", args, 2);\n const a = num(args[0]!);\n const b = num(args[1]!);\n if (a === null || b === null) return null;\n return realOrNull(a ** b);\n },\n power(args, ctx) {\n return mathFunctions.pow!(args, ctx);\n },\n ieee754(args) {\n requireArgs(\"ieee754\", args, 1, 2);\n if (args.length === 1) {\n const n = num(args[0]!);\n if (n === null) return null;\n const { mantissa, exponent } = decodeIeee754(n);\n return `ieee754(${mantissa},${exponent})`;\n }\n const m = args[0]!;\n const e = args[1]!;\n if (m === null || e === null) return null;\n const mantissa = typeof m === \"bigint\" ? m : BigInt(Math.trunc(num(m)!));\n const exponent = Math.trunc(num(e)!);\n return realOrNull(encodeIeee754(mantissa, exponent));\n },\n ieee754_mantissa(args) {\n requireArgs(\"ieee754_mantissa\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n return decodeIeee754(n).mantissa;\n },\n ieee754_exponent(args) {\n requireArgs(\"ieee754_exponent\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n return decodeIeee754(n).exponent;\n },\n ieee754_to_blob(args) {\n requireArgs(\"ieee754_to_blob\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n const buf = new ArrayBuffer(8);\n new DataView(buf).setFloat64(0, n, false);\n return new Uint8Array(buf);\n },\n ieee754_from_blob(args) {\n requireArgs(\"ieee754_from_blob\", args, 1);\n const value = args[0];\n if (value === null) return null;\n if (!(value instanceof Uint8Array) || value.length !== 8) {\n throw new SqliteError(\"ieee754_from_blob() requires an 8-byte blob\", \"misuse\");\n }\n const view = new DataView(value.buffer, value.byteOffset, value.byteLength);\n return realOrNull(view.getFloat64(0, false));\n },\n ieee754_inc(args) {\n requireArgs(\"ieee754_inc\", args, 2);\n const n = num(args[0]!);\n const delta = num(args[1]!);\n if (n === null || delta === null) return null;\n const buf = new ArrayBuffer(8);\n const view = new DataView(buf);\n view.setFloat64(0, n, false);\n let bits = view.getBigUint64(0, false);\n const step = BigInt(Math.trunc(delta));\n bits = (bits + step) & 0xffffffffffffffffn;\n view.setBigUint64(0, bits, false);\n return realOrNull(view.getFloat64(0, false));\n },\n};\n\n// silence unused\nvoid (null as unknown as FunctionContext);\n", "import { SqliteError } from \"../errors/index.ts\";\n\nfunction escapeRegexChar(char: string): string {\n return /[\\\\^$.*+?()[\\]{}|]/.test(char) ? `\\\\${char}` : char;\n}\n\nfunction likeLiteral(char: string): string {\n const code = char.codePointAt(0)!;\n if (code >= 65 && code <= 90) return `[${char}${char.toLowerCase()}]`;\n if (code >= 97 && code <= 122) return `[${char}${char.toUpperCase()}]`;\n return escapeRegexChar(char);\n}\n\n/**\n * SQLite LIKE matching. ASCII letters are case-insensitive.\n *\n * @param text - Value to test.\n * @param pattern - Pattern with `%` / `_` wildcards.\n * @param escape - Optional single-character ESCAPE (or `null`).\n */\nexport function likeMatch(text: string, pattern: string, escape: string | null = null): boolean {\n if (escape !== null && [...escape].length !== 1) {\n throw new SqliteError(\"ESCAPE expression must be a single character\", \"other\");\n }\n\n let source = \"^\";\n const chars = [...pattern];\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i]!;\n if (escape !== null && char === escape) {\n const next = chars[++i];\n source += next === undefined ? likeLiteral(char) : likeLiteral(next);\n } else if (char === \"%\") {\n source += \"[\\\\s\\\\S]*\";\n } else if (char === \"_\") {\n source += \"[\\\\s\\\\S]\";\n } else {\n source += likeLiteral(char);\n }\n }\n return new RegExp(`${source}$`).test(text);\n}\n\n/**\n * SQLite GLOB matching. GLOB is case-sensitive and uses Unix `*` / `?` wildcards.\n *\n * @param text - Value to test.\n * @param pattern - GLOB pattern.\n */\nexport function globMatch(text: string, pattern: string): boolean {\n let source = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i]!;\n if (char === \"*\") {\n source += \"[\\\\s\\\\S]*\";\n } else if (char === \"?\") {\n source += \"[\\\\s\\\\S]\";\n } else if (char === \"[\") {\n let end = i + 1;\n if (pattern[end] === \"^\") end++;\n if (pattern[end] === \"]\") end++;\n while (end < pattern.length && pattern[end] !== \"]\") end++;\n if (end >= pattern.length) {\n source += \"\\\\[\";\n } else {\n let content = pattern.slice(i + 1, end);\n // SQLite uses either ^ or ! as the first character to negate a class.\n if (content.startsWith(\"!\")) content = `^${content.slice(1)}`;\n source += `[${content.replace(/\\\\/g, \"\\\\\\\\\")}]`;\n i = end;\n }\n } else {\n source += escapeRegexChar(char);\n }\n }\n return new RegExp(`${source}$`).test(text);\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { globMatch, likeMatch } from \"../expressions/like.ts\";\nimport {\n affinityFromTypeName,\n applyAffinity,\n asSqlReal,\n coerceToNumber,\n compareSql,\n type SqlValue,\n storageClassOf,\n typeofSql,\n utf8Decode,\n utf8Encode,\n} from \"../types/value.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\n/** Match bun:sqlite / SQLite 3.51.0 for drop-in parity. */\nexport const SQLITE_MEM_VERSION = \"3.51.0\";\nexport const SQLITE_MEM_SOURCE_ID =\n \"2025-06-12 13:14:41 f0ca7bba1c5e232e5d279fad6338121ab55af0c8c68c84cdfb18ba5114dcaapl\";\n\nconst COMPILE_OPTIONS = [\n \"ENABLE_FTS3\",\n \"ENABLE_FTS4\",\n \"ENABLE_FTS5\",\n \"ENABLE_MATH_FUNCTIONS\",\n \"ENABLE_RTREE\",\n \"ENABLE_DBSTAT_VTAB\",\n \"ENABLE_BYTECODE_VTAB\",\n \"THREADSAFE=1\",\n] as const;\n\nfunction text(value: SqlValue): string {\n if (value instanceof Uint8Array) return utf8Decode(value);\n return String(value);\n}\n\nfunction numeric(value: SqlValue): number {\n return coerceToNumber(value) ?? 0;\n}\n\nexport function castSqlValue(value: SqlValue, typeName: string): SqlValue {\n const affinity = affinityFromTypeName(typeName);\n if (value === null) return null;\n if (affinity === \"BLOB\") {\n return value instanceof Uint8Array ? value : utf8Encode(text(value));\n }\n if (affinity === \"TEXT\") return text(value);\n if (affinity === \"INTEGER\") return Math.trunc(coerceToNumber(value) ?? 0);\n if (affinity === \"REAL\") return asSqlReal(coerceToNumber(value) ?? 0);\n return applyAffinity(value, \"NUMERIC\");\n}\n\nfunction trimChars(value: string, chars: string, left: boolean, right: boolean): string {\n const set = new Set([...chars]);\n const input = [...value];\n let start = 0;\n let end = input.length;\n if (left) while (start < end && set.has(input[start]!)) start++;\n if (right) while (end > start && set.has(input[end - 1]!)) end--;\n return input.slice(start, end).join(\"\");\n}\n\nfunction substr(value: string, startValue: number, lengthValue?: number): string {\n const chars = [...value];\n const start = Math.trunc(startValue);\n let index = start > 0 ? start - 1 : start < 0 ? chars.length + start : 0;\n index = Math.max(0, index);\n if (lengthValue === undefined) return chars.slice(index).join(\"\");\n const length = Math.trunc(lengthValue);\n if (length >= 0) return chars.slice(index, index + length).join(\"\");\n return chars.slice(Math.max(0, index + length), index).join(\"\");\n}\n\nfunction formatPrintf(format: string, args: SqlValue[]): string {\n let index = 0;\n return format.replace(\n /%([0 +\\-#]*)(\\d+)?(?:\\.(\\d+))?([%sdifgGxXcqQ])/g,\n (_match, flags: string, widthText: string | undefined, precisionText: string | undefined, kind: string) => {\n if (kind === \"%\") return \"%\";\n const value = args[index++] ?? null;\n const precision = precisionText === undefined ? undefined : Number(precisionText);\n let result: string;\n switch (kind) {\n case \"d\":\n case \"i\":\n result = String(Math.trunc(numeric(value)));\n break;\n case \"f\":\n result = numeric(value).toFixed(precision ?? 6);\n break;\n case \"g\":\n case \"G\":\n result = numeric(value)\n .toPrecision(precision ?? 6)\n .replace(/\\.?0+(e|$)/i, \"$1\");\n break;\n case \"x\":\n case \"X\":\n result = Math.trunc(numeric(value)).toString(16);\n break;\n case \"c\":\n result = String.fromCodePoint(Math.trunc(numeric(value)));\n break;\n case \"q\":\n result = value === null ? \"(NULL)\" : text(value).replace(/'/g, \"''\");\n break;\n case \"Q\":\n result = value === null ? \"NULL\" : `'${text(value).replace(/'/g, \"''\")}'`;\n break;\n default:\n result = value === null ? \"\" : text(value);\n }\n if (kind === \"G\" || kind === \"X\") result = result.toUpperCase();\n const width = Number(widthText ?? 0);\n if (width > result.length) {\n const pad = flags.includes(\"0\") ? \"0\" : \" \";\n result = flags.includes(\"-\") ? result.padEnd(width, pad) : result.padStart(width, pad);\n }\n return result;\n },\n );\n}\n\nfunction requireArgs(name: string, args: SqlValue[], min: number, max = min): void {\n if (args.length < min || args.length > max) {\n throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n }\n}\n\nconst scalarFunctions: Record<string, ScalarFunction> = {\n abs(args) {\n requireArgs(\"abs\", args, 1);\n const value = args[0]!;\n if (value === null) return null;\n if (typeof value === \"bigint\") return value < 0n ? -value : value;\n return Math.abs(numeric(value));\n },\n coalesce(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function coalesce()\", \"misuse\");\n return args.find((value) => value !== null) ?? null;\n },\n ifnull(args) {\n requireArgs(\"ifnull\", args, 2);\n return args[0] ?? args[1]!;\n },\n nullif(args) {\n requireArgs(\"nullif\", args, 2);\n const comparison = compareSql(args[0]!, args[1]!);\n return comparison === 0 ? null : args[0]!;\n },\n typeof(args) {\n requireArgs(\"typeof\", args, 1);\n return typeofSql(args[0]!);\n },\n length(args) {\n requireArgs(\"length\", args, 1);\n const value = args[0]!;\n if (value === null) return null;\n if (value instanceof Uint8Array) return value.length;\n return [...text(value)].length;\n },\n lower(args) {\n requireArgs(\"lower\", args, 1);\n return args[0] === null ? null : text(args[0]!).replace(/[A-Z]/g, (c) => c.toLowerCase());\n },\n upper(args) {\n requireArgs(\"upper\", args, 1);\n return args[0] === null ? null : text(args[0]!).replace(/[a-z]/g, (c) => c.toUpperCase());\n },\n trim(args) {\n requireArgs(\"trim\", args, 1, 2);\n if (args[0] === null || args[1] === null) return null;\n return trimChars(text(args[0]!), args[1] === undefined ? \" \" : text(args[1]), true, true);\n },\n ltrim(args) {\n requireArgs(\"ltrim\", args, 1, 2);\n if (args[0] === null || args[1] === null) return null;\n return trimChars(text(args[0]!), args[1] === undefined ? \" \" : text(args[1]), true, false);\n },\n rtrim(args) {\n requireArgs(\"rtrim\", args, 1, 2);\n if (args[0] === null || args[1] === null) return null;\n return trimChars(text(args[0]!), args[1] === undefined ? \" \" : text(args[1]), false, true);\n },\n substr(args) {\n requireArgs(\"substr\", args, 2, 3);\n if (args[0] === null || args[1] === null || args[2] === null) return null;\n return substr(text(args[0]!), numeric(args[1]!), args[2] === undefined ? undefined : numeric(args[2]));\n },\n substring(args, context) {\n return scalarFunctions.substr!(args, context);\n },\n replace(args) {\n requireArgs(\"replace\", args, 3);\n if (args.some((value) => value === null)) return null;\n const search = text(args[1]!);\n return search === \"\" ? text(args[0]!) : text(args[0]!).split(search).join(text(args[2]!));\n },\n round(args) {\n requireArgs(\"round\", args, 1, 2);\n if (args[0] === null) return null;\n const places = Math.max(0, Math.min(30, Math.trunc(numeric(args[1] ?? 0))));\n const factor = 10 ** places;\n const scaled = numeric(args[0]!) * factor;\n return (scaled < 0 ? -Math.round(-scaled) : Math.round(scaled)) / factor;\n },\n min(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function min()\", \"misuse\");\n if (args.some((value) => value === null)) return null;\n return args.reduce((best, value) => (compareSql(value, best)! < 0 ? value : best));\n },\n max(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function max()\", \"misuse\");\n if (args.some((value) => value === null)) return null;\n return args.reduce((best, value) => (compareSql(value, best)! > 0 ? value : best));\n },\n random(args, context) {\n requireArgs(\"random\", args, 0);\n if (context.random) return context.random();\n // Fallback deterministic stream when evaluated outside a Database (e.g. unit helpers).\n return 0n;\n },\n randomblob(args, context) {\n requireArgs(\"randomblob\", args, 1);\n if (args[0] === null) return null;\n const length = Math.max(0, Math.trunc(numeric(args[0]!)));\n const out = new Uint8Array(length);\n let offset = 0;\n while (offset < length) {\n const bits = context.randomU64?.() ?? 0n;\n for (let shift = 0; shift < 64 && offset < length; shift += 8) {\n out[offset++] = Number((bits >> BigInt(shift)) & 0xffn);\n }\n }\n return out;\n },\n zeroblob(args) {\n requireArgs(\"zeroblob\", args, 1);\n if (args[0] === null) return null;\n const length = Math.max(0, Math.trunc(numeric(args[0]!)));\n return new Uint8Array(length);\n },\n hex(args) {\n requireArgs(\"hex\", args, 1);\n if (args[0] === null) return \"\";\n const bytes = args[0] instanceof Uint8Array ? args[0] : utf8Encode(text(args[0]!));\n return [...bytes]\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase();\n },\n quote(args) {\n requireArgs(\"quote\", args, 1);\n const value = args[0]!;\n if (value === null) return \"NULL\";\n if (value instanceof Uint8Array) return `X'${scalarFunctions.hex!([value], {})}'`;\n if (typeof value === \"string\") return `'${value.replace(/'/g, \"''\")}'`;\n if (typeof value === \"number\" && !Number.isFinite(value)) return value < 0 ? \"-9.0e+999\" : \"9.0e+999\";\n return String(value);\n },\n printf(args) {\n if (args.length === 0 || args[0] === null) return null;\n return formatPrintf(text(args[0]!), args.slice(1));\n },\n changes(args, context) {\n requireArgs(\"changes\", args, 0);\n return context.changes?.() ?? 0;\n },\n total_changes(args, context) {\n requireArgs(\"total_changes\", args, 0);\n return context.totalChanges?.() ?? 0;\n },\n last_insert_rowid(args, context) {\n requireArgs(\"last_insert_rowid\", args, 0);\n return context.lastInsertRowid?.() ?? 0;\n },\n sqlite_version(args) {\n requireArgs(\"sqlite_version\", args, 0);\n return SQLITE_MEM_VERSION;\n },\n sqlite_source_id(args) {\n requireArgs(\"sqlite_source_id\", args, 0);\n return SQLITE_MEM_SOURCE_ID;\n },\n sqlite_compileoption_used(args) {\n requireArgs(\"sqlite_compileoption_used\", args, 1);\n if (args[0] === null) return null;\n const needle = text(args[0]!)\n .toUpperCase()\n .replace(/^SQLITE_/, \"\");\n return COMPILE_OPTIONS.some((opt) => opt === needle || opt.startsWith(`${needle}=`)) ? 1 : 0;\n },\n sqlite_compileoption_get(args) {\n requireArgs(\"sqlite_compileoption_get\", args, 1);\n if (args[0] === null) return null;\n const index = Math.trunc(numeric(args[0]!));\n if (index < 0 || index >= COMPILE_OPTIONS.length) return null;\n return COMPILE_OPTIONS[index]!;\n },\n sqlite_log(args) {\n requireArgs(\"sqlite_log\", args, 2);\n return null;\n },\n load_extension(args) {\n requireArgs(\"load_extension\", args, 1, 2);\n throw new SqliteError(\"not authorized\", \"misuse\");\n },\n like(args) {\n requireArgs(\"like\", args, 2, 3);\n if (args[0] === null || args[1] === null || args[2] === null) return null;\n // like(pattern, string[, escape]) \u2261 string LIKE pattern [ESCAPE escape]\n const escape = args[2] === undefined ? null : text(args[2]!);\n return likeMatch(text(args[1]!), text(args[0]!), escape) ? 1 : 0;\n },\n glob(args) {\n requireArgs(\"glob\", args, 2);\n if (args[0] === null || args[1] === null) return null;\n // glob(pattern, string) \u2261 string GLOB pattern\n return globMatch(text(args[1]!), text(args[0]!)) ? 1 : 0;\n },\n match() {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n },\n char(args) {\n if (args.length === 0) return \"\";\n let out = \"\";\n for (const arg of args) {\n if (arg === null) continue;\n const code = Math.trunc(numeric(arg));\n if (code > 0) out += String.fromCodePoint(code);\n }\n return out;\n },\n format(args, context) {\n return scalarFunctions.printf!(args, context);\n },\n iif(args) {\n requireArgs(\"iif\", args, 3);\n const cond = args[0];\n if (cond === null) return args[2]!;\n if (typeof cond === \"number\" || typeof cond === \"bigint\") {\n return Number(cond) !== 0 ? args[1]! : args[2]!;\n }\n if (typeof cond === \"string\") return cond.length > 0 ? args[1]! : args[2]!;\n if (cond instanceof Uint8Array) return cond.length > 0 ? args[1]! : args[2]!;\n return args[1]!;\n },\n if(args, context) {\n return scalarFunctions.iif!(args, context);\n },\n instr(args) {\n requireArgs(\"instr\", args, 2);\n if (args[0] === null || args[1] === null) return null;\n if (args[0] instanceof Uint8Array || args[1] instanceof Uint8Array) {\n const hay = args[0] instanceof Uint8Array ? args[0] : utf8Encode(text(args[0]!));\n const needle = args[1] instanceof Uint8Array ? args[1] : utf8Encode(text(args[1]!));\n if (needle.length === 0) return 1;\n outer: for (let i = 0; i <= hay.length - needle.length; i++) {\n for (let j = 0; j < needle.length; j++) {\n if (hay[i + j] !== needle[j]) continue outer;\n }\n return i + 1;\n }\n return 0;\n }\n const hay = text(args[0]!);\n const needle = text(args[1]!);\n if (needle === \"\") return 1;\n const idx = hay.indexOf(needle);\n return idx < 0 ? 0 : [...hay.slice(0, idx)].length + 1;\n },\n unicode(args) {\n requireArgs(\"unicode\", args, 1);\n if (args[0] === null) return null;\n const s = text(args[0]!);\n if (s.length === 0) return null;\n return s.codePointAt(0)!;\n },\n octet_length(args) {\n requireArgs(\"octet_length\", args, 1);\n if (args[0] === null) return null;\n if (args[0] instanceof Uint8Array) return args[0].length;\n return utf8Encode(text(args[0]!)).length;\n },\n unhex(args) {\n requireArgs(\"unhex\", args, 1, 2);\n if (args[0] === null) return null;\n let hex = text(args[0]!).replace(/\\s+/g, \"\");\n if (args[1] !== undefined && args[1] !== null) {\n const sep = text(args[1]!);\n hex = text(args[0]!).split(sep).join(\"\");\n }\n if (hex.length % 2 !== 0) return null;\n if (!/^[0-9a-fA-F]*$/.test(hex)) return null;\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < out.length; i++) {\n out[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n return out;\n },\n concat(args) {\n if (args.some((v) => v === null)) return null;\n return args.map((v) => text(v!)).join(\"\");\n },\n concat_ws(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function concat_ws()\", \"misuse\");\n if (args[0] === null) return null;\n const sep = text(args[0]!);\n const parts: string[] = [];\n for (const arg of args.slice(1)) {\n if (arg === null) continue;\n parts.push(text(arg));\n }\n return parts.join(sep);\n },\n unistr(args) {\n requireArgs(\"unistr\", args, 1);\n if (args[0] === null) return null;\n const input = text(args[0]!);\n let out = \"\";\n for (let i = 0; i < input.length; i++) {\n if (input[i] === \"\\\\\" && input[i + 1] === \"u\") {\n const hex = input.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n throw new SqliteError(\"invalid Unicode escape in unistr()\", \"other\");\n }\n out += String.fromCodePoint(Number.parseInt(hex, 16));\n i += 5;\n } else {\n out += input[i];\n }\n }\n return out;\n },\n unistr_quote(args) {\n requireArgs(\"unistr_quote\", args, 1);\n if (args[0] === null) return \"NULL\";\n const s = text(args[0]!);\n let needs = false;\n let escaped = \"\";\n for (const ch of s) {\n const cp = ch.codePointAt(0)!;\n if (cp < 0x20 || cp === 0x7f) {\n needs = true;\n escaped += `\\\\u${cp.toString(16).padStart(4, \"0\")}`;\n } else if (ch === \"'\") {\n escaped += \"''\";\n } else if (ch === \"\\\\\") {\n needs = true;\n escaped += \"\\\\\\\\\";\n } else {\n escaped += ch;\n }\n }\n return needs ? `unistr('${escaped}')` : `'${escaped}'`;\n },\n likelihood(args) {\n requireArgs(\"likelihood\", args, 2);\n const p = numOrThrow(args[1], \"likelihood\");\n if (p === null || p < 0 || p > 1) {\n throw new SqliteError(\"second argument to likelihood() must be a constant between 0.0 and 1.0\", \"misuse\");\n }\n return args[0]!;\n },\n likely(args) {\n requireArgs(\"likely\", args, 1);\n return args[0]!;\n },\n unlikely(args) {\n requireArgs(\"unlikely\", args, 1);\n return args[0]!;\n },\n unknown() {\n return null;\n },\n uuid(args, context) {\n requireArgs(\"uuid\", args, 0);\n return formatUuid(nextUuidBytes(context));\n },\n uuid_str(args) {\n requireArgs(\"uuid_str\", args, 1);\n if (args[0] === null) return null;\n if (typeof args[0] === \"string\") return args[0].toLowerCase();\n if (args[0] instanceof Uint8Array && args[0].length === 16) return formatUuid(args[0]);\n return null;\n },\n uuid_blob(args) {\n requireArgs(\"uuid_blob\", args, 1);\n if (args[0] === null) return null;\n if (args[0] instanceof Uint8Array && args[0].length === 16) return args[0];\n if (typeof args[0] === \"string\") {\n const hex = args[0].replace(/-/g, \"\");\n if (!/^[0-9a-fA-F]{32}$/.test(hex)) return null;\n const out = new Uint8Array(16);\n for (let i = 0; i < 16; i++) out[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n return out;\n }\n return null;\n },\n // FTS/RTREE helpers registered as context-sensitive stubs; real work is in MATCH/vtab paths.\n optimize() {\n throw new SqliteError(\"unable to use function optimize in the requested context\", \"unsupported\");\n },\n fts5() {\n throw new SqliteError(\"unable to use function fts5 in the requested context\", \"unsupported\");\n },\n fts5_source_id(args) {\n requireArgs(\"fts5_source_id\", args, 0);\n return `fts5: ${SQLITE_MEM_SOURCE_ID}`;\n },\n fts5_get_locale() {\n return null;\n },\n fts5_locale(args) {\n requireArgs(\"fts5_locale\", args, 1, 2);\n return args[0] ?? null;\n },\n fts5_insttoken(args) {\n requireArgs(\"fts5_insttoken\", args, 1);\n return args[0]!;\n },\n fts3_tokenizer() {\n throw new SqliteError(\"unknown tokenizer: \", \"other\");\n },\n};\n\nfunction numOrThrow(value: SqlValue | undefined, name: string): number | null {\n if (value === undefined) throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n if (value === null) return null;\n return coerceToNumber(value);\n}\n\nfunction nextUuidBytes(context: FunctionContext): Uint8Array {\n const out = new Uint8Array(16);\n let offset = 0;\n while (offset < 16) {\n const bits = context.randomU64?.() ?? 0n;\n for (let shift = 0; shift < 64 && offset < 16; shift += 8) {\n out[offset++] = Number((bits >> BigInt(shift)) & 0xffn);\n }\n }\n // RFC 4122 version 4 / variant bits\n out[6] = (out[6]! & 0x0f) | 0x40;\n out[8] = (out[8]! & 0x3f) | 0x80;\n return out;\n}\n\nfunction formatUuid(bytes: Uint8Array): string {\n const hex = [...bytes].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\nexport function getScalarFunctions(): Readonly<Record<string, ScalarFunction>> {\n return scalarFunctions;\n}\n\nexport function invokeScalar(name: string, args: SqlValue[], context: FunctionContext = {}): SqlValue {\n const fn = scalarFunctions[name.toLowerCase()];\n if (!fn) throw new SqliteError(`no such function: ${name}`, \"other\");\n return fn(args, context);\n}\n\nexport { storageClassOf };\n", "import type { SqlValue } from \"../types/value.ts\";\nimport { type AggregateAccumulator, type AggregateFactory, aggregateFunctions } from \"./aggregate.ts\";\nimport { dateTimeFunctions } from \"./datetime.ts\";\nimport { ftsAuxFunctions, rtreeAuxFunctions } from \"./extensions.ts\";\nimport { jsonAggregateFunctions, jsonScalarFunctions } from \"./json.ts\";\nimport { mathFunctions } from \"./math.ts\";\nimport { getScalarFunctions } from \"./scalar.ts\";\n\nexport interface FunctionContext {\n changes?: () => number;\n totalChanges?: () => number;\n lastInsertRowid?: () => number | bigint;\n /** Injectable clock \u2014 defaults to a fixed instant on Database. */\n now?: () => Date;\n /** Injectable SQLite `random()` source \u2014 defaults to a seeded PRNG on Database. */\n random?: () => bigint;\n /** Raw unsigned 64-bit PRNG draws for `randomblob`. */\n randomU64?: () => bigint;\n /** Active FTS MATCH cursor when evaluating projections with MATCH in WHERE. */\n ftsMatch?: import(\"../vtable/fts5.ts\").FtsMatchCursor | null;\n /** Current rowid for FTS aux defaults when MATCH is absent. */\n ftsRowid?: import(\"../storage/row.ts\").Rowid;\n /** Source FTS table name for the current scan row. */\n ftsSourceTable?: string;\n /** Resolve FTS table by name for aux functions. */\n getFtsTable?: (name: string) => import(\"../vtable/fts5.ts\").Fts5VirtualTable | null;\n}\n\nexport type ScalarFunction = (args: SqlValue[], context: FunctionContext) => SqlValue;\n\nexport class FunctionRegistry {\n private readonly scalars = new Map<string, ScalarFunction>();\n private readonly aggregates = new Map<string, AggregateFactory>();\n\n constructor() {\n for (const [name, fn] of Object.entries(getScalarFunctions())) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(dateTimeFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(jsonScalarFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(mathFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(ftsAuxFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(rtreeAuxFunctions)) this.scalars.set(name, fn);\n for (const [name, factory] of Object.entries(aggregateFunctions)) this.aggregates.set(name, factory);\n for (const [name, factory] of Object.entries(jsonAggregateFunctions)) this.aggregates.set(name, factory);\n }\n\n registerScalar(name: string, fn: ScalarFunction): void {\n this.scalars.set(name.toLowerCase(), fn);\n }\n\n registerAggregate(name: string, factory: AggregateFactory): void {\n this.aggregates.set(name.toLowerCase(), factory);\n }\n\n lookupScalar(name: string): ScalarFunction | undefined {\n return this.scalars.get(name.toLowerCase());\n }\n\n lookupAggregate(name: string): AggregateFactory | undefined {\n return this.aggregates.get(name.toLowerCase());\n }\n\n createAggregate(name: string): AggregateAccumulator | undefined {\n return this.lookupAggregate(name)?.();\n }\n\n isAggregateName(name: string): boolean {\n return this.aggregates.has(name.toLowerCase());\n }\n}\n\nexport const defaultFunctionRegistry = new FunctionRegistry();\n\nexport function lookupScalar(name: string): ScalarFunction | undefined {\n return defaultFunctionRegistry.lookupScalar(name);\n}\n\nexport function lookupAggregate(name: string): AggregateFactory | undefined {\n return defaultFunctionRegistry.lookupAggregate(name);\n}\n\nexport function isAggregateName(name: string): boolean {\n return defaultFunctionRegistry.isAggregateName(name);\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { compareSql, type SqlValue } from \"./value.ts\";\n\nexport type BuiltinCollation = \"BINARY\" | \"NOCASE\" | \"RTRIM\";\n\nexport function normalizeForCollation(value: SqlValue, name: string): SqlValue {\n const collation = builtinCollation(name);\n if (typeof value !== \"string\" || collation === \"BINARY\") return value;\n if (collation === \"RTRIM\") return value.replace(/ +$/u, \"\");\n\n let normalized = \"\";\n for (const char of value) {\n const code = char.charCodeAt(0);\n normalized += code >= 0x41 && code <= 0x5a ? String.fromCharCode(code + 0x20) : char;\n }\n return normalized;\n}\n\nexport function compareWithCollation(a: SqlValue, b: SqlValue, name: string): number | null {\n return compareSql(normalizeForCollation(a, name), normalizeForCollation(b, name));\n}\n\nfunction builtinCollation(name: string): BuiltinCollation {\n const normalized = name.toUpperCase();\n if (normalized === \"BINARY\" || normalized === \"NOCASE\" || normalized === \"RTRIM\") return normalized;\n throw new SqliteError(`no such collation sequence: ${name}`, \"other\");\n}\n", "import type { BinaryOp, Expr, SelectStmt } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { jsonArrow } from \"../functions/json.ts\";\nimport { defaultFunctionRegistry } from \"../functions/registry.ts\";\nimport { castSqlValue } from \"../functions/scalar.ts\";\nimport { compareWithCollation } from \"../types/collation.ts\";\nimport {\n asSqlReal,\n canonicalizeNumber,\n coerceToNumber,\n compareSql,\n isTruthySql,\n type SqlValue,\n storageClassOf,\n toInteger,\n utf8Decode,\n} from \"../types/value.ts\";\nimport type { EvalContext } from \"./context.ts\";\nimport { globMatch, likeMatch } from \"./like.ts\";\n\nfunction numberValue(value: SqlValue): number {\n return coerceToNumber(value) ?? 0;\n}\n\nfunction asNumber(value: number): number {\n return canonicalizeNumber(value);\n}\n\nfunction integerValue(value: SqlValue): bigint {\n const integer = toInteger(value);\n return typeof integer === \"bigint\" ? integer : BigInt(integer ?? 0);\n}\n\nfunction textValue(value: SqlValue): string {\n if (value instanceof Uint8Array) return utf8Decode(value);\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"value\" in value &&\n typeof (value as { value: unknown }).value === \"string\"\n ) {\n return (value as { value: string }).value;\n }\n return String(value);\n}\n\nfunction booleanValue(value: boolean): SqlValue {\n return value ? 1 : 0;\n}\n\nfunction executeSelect(ctx: EvalContext, select: SelectStmt): { columns: string[]; rows: SqlValue[][] } {\n if (!ctx.executeSelect) throw new SqliteError(\"subqueries are not available in this evaluation context\", \"misuse\");\n return ctx.executeSelect(select);\n}\n\nfunction resolveColumn(ctx: EvalContext, table: string | null, name: string): SqlValue {\n try {\n return ctx.resolveColumn(table, name);\n } catch (error) {\n if (ctx.parent && error instanceof SqliteError && error.category === \"no_such_column\") {\n return resolveColumn(ctx.parent, table, name);\n }\n throw error;\n }\n}\n\nfunction sqlAnd(left: SqlValue, right: () => SqlValue): SqlValue {\n const leftTruth = isTruthySql(left);\n if (leftTruth === false) return 0;\n const rightTruth = isTruthySql(right());\n if (rightTruth === false) return 0;\n if (leftTruth === null || rightTruth === null) return null;\n return 1;\n}\n\nfunction sqlOr(left: SqlValue, right: () => SqlValue): SqlValue {\n const leftTruth = isTruthySql(left);\n if (leftTruth === true) return 1;\n const rightTruth = isTruthySql(right());\n if (rightTruth === true) return 1;\n if (leftTruth === null || rightTruth === null) return null;\n return 0;\n}\n\nfunction compareResult(op: BinaryOp, left: SqlValue, right: SqlValue, collation?: string): SqlValue {\n if (op === \"IS\" || op === \"IS NOT\" || op === \"IS DISTINCT FROM\" || op === \"IS NOT DISTINCT FROM\") {\n const equal =\n left === null || right === null\n ? left === right\n : (collation ? compareWithCollation(left, right, collation) : compareSql(left, right)) === 0;\n if (op === \"IS\" || op === \"IS NOT DISTINCT FROM\") return booleanValue(equal);\n return booleanValue(!equal);\n }\n const comparison = collation ? compareWithCollation(left, right, collation) : compareSql(left, right);\n if (comparison === null) return null;\n switch (op) {\n case \"=\":\n case \"==\":\n return booleanValue(comparison === 0);\n case \"!=\":\n case \"<>\":\n return booleanValue(comparison !== 0);\n case \"<\":\n return booleanValue(comparison < 0);\n case \"<=\":\n return booleanValue(comparison <= 0);\n case \">\":\n return booleanValue(comparison > 0);\n case \">=\":\n return booleanValue(comparison >= 0);\n default:\n throw new SqliteError(`unsupported comparison operator: ${op}`, \"unsupported\");\n }\n}\n\nfunction evalBinary(op: BinaryOp, leftExpr: Expr, rightExpr: Expr, ctx: EvalContext): SqlValue {\n if (op === \"MATCH\") {\n if (leftExpr.type !== \"column\") {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n const query = textValue(evalExpr(rightExpr, ctx));\n if (!ctx.matchFts) {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n return booleanValue(ctx.matchFts(leftExpr.table, leftExpr.name, query));\n }\n\n if (\n leftExpr.type === \"row\" &&\n rightExpr.type === \"row\" &&\n [\"=\", \"==\", \"!=\", \"<>\", \"<\", \"<=\", \">\", \">=\", \"IS\", \"IS NOT\", \"IS DISTINCT FROM\", \"IS NOT DISTINCT FROM\"].includes(\n op,\n )\n ) {\n return compareRowValues(op, leftExpr.values, rightExpr.values, ctx);\n }\n\n const left = evalExpr(leftExpr, ctx);\n if (op === \"AND\") return sqlAnd(left, () => evalExpr(rightExpr, ctx));\n if (op === \"OR\") return sqlOr(left, () => evalExpr(rightExpr, ctx));\n const right = evalExpr(rightExpr, ctx);\n\n if (op === \"->\" || op === \"->>\") {\n return jsonArrow(left, right, op);\n }\n\n if (\n [\"=\", \"==\", \"!=\", \"<>\", \"<\", \"<=\", \">\", \">=\", \"IS\", \"IS NOT\", \"IS DISTINCT FROM\", \"IS NOT DISTINCT FROM\"].includes(\n op,\n )\n ) {\n return compareResult(op, left, right, resolveComparisonCollation(leftExpr, rightExpr, ctx) ?? undefined);\n }\n if (op === \"LIKE\" || op === \"NOT LIKE\" || op === \"GLOB\" || op === \"NOT GLOB\") {\n if (left === null || right === null) return null;\n const matches = op.includes(\"LIKE\")\n ? likeMatch(textValue(left), textValue(right))\n : globMatch(textValue(left), textValue(right));\n return booleanValue(op.startsWith(\"NOT\") ? !matches : matches);\n }\n if (left === null || right === null) return null;\n switch (op) {\n case \"+\":\n return asNumber(numberValue(left) + numberValue(right));\n case \"-\":\n return asNumber(numberValue(left) - numberValue(right));\n case \"*\":\n return asNumber(numberValue(left) * numberValue(right));\n case \"/\": {\n const divisor = numberValue(right);\n if (divisor === 0) return null;\n if (storageClassOf(left) === \"integer\" && storageClassOf(right) === \"integer\") {\n const quotient = integerValue(left) / integerValue(right);\n return quotient <= BigInt(Number.MAX_SAFE_INTEGER) && quotient >= BigInt(Number.MIN_SAFE_INTEGER)\n ? Number(quotient)\n : quotient;\n }\n return asNumber(numberValue(left) / divisor);\n }\n case \"%\": {\n const divisor = integerValue(right);\n if (divisor === 0n) return null;\n const remainder = integerValue(left) % divisor;\n return remainder <= BigInt(Number.MAX_SAFE_INTEGER) && remainder >= BigInt(Number.MIN_SAFE_INTEGER)\n ? Number(remainder)\n : remainder;\n }\n case \"||\":\n return textValue(left) + textValue(right);\n case \"&\":\n return safeIntegerResult(integerValue(left) & integerValue(right));\n case \"|\":\n return safeIntegerResult(integerValue(left) | integerValue(right));\n case \"<<\":\n return safeIntegerResult(integerValue(left) << integerValue(right));\n case \">>\":\n return safeIntegerResult(integerValue(left) >> integerValue(right));\n case \"IN\":\n case \"NOT IN\":\n throw new SqliteError(`${op} requires an IN expression node`, \"misuse\");\n default:\n throw new SqliteError(`unsupported binary operator: ${op}`, \"unsupported\");\n }\n}\n\nfunction safeIntegerResult(value: bigint): number | bigint {\n return value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER) ? Number(value) : value;\n}\n\nfunction compareRowValues(op: BinaryOp, leftExprs: Expr[], rightExprs: Expr[], ctx: EvalContext): SqlValue {\n if (leftExprs.length !== rightExprs.length) {\n throw new SqliteError(\"row value misused\", \"misuse\");\n }\n const isIsFamily = op === \"IS\" || op === \"IS NOT\" || op === \"IS DISTINCT FROM\" || op === \"IS NOT DISTINCT FROM\";\n let sawNull = false;\n for (let i = 0; i < leftExprs.length; i++) {\n const left = evalExpr(leftExprs[i]!, ctx);\n const right = evalExpr(rightExprs[i]!, ctx);\n if (isIsFamily) {\n const equal = left === null || right === null ? left === right : compareSql(left, right) === 0;\n if (!equal) {\n if (op === \"IS\" || op === \"IS NOT DISTINCT FROM\") return booleanValue(false);\n return booleanValue(true);\n }\n continue;\n }\n if (left === null || right === null) {\n sawNull = true;\n continue;\n }\n const cmp = compareSql(left, right);\n if (cmp === null) {\n sawNull = true;\n continue;\n }\n if (cmp !== 0) {\n switch (op) {\n case \"=\":\n case \"==\":\n return booleanValue(false);\n case \"!=\":\n case \"<>\":\n return booleanValue(true);\n case \"<\":\n return booleanValue(cmp < 0);\n case \"<=\":\n return booleanValue(cmp < 0);\n case \">\":\n return booleanValue(cmp > 0);\n case \">=\":\n return booleanValue(cmp > 0);\n }\n }\n }\n if (isIsFamily) {\n if (op === \"IS\" || op === \"IS NOT DISTINCT FROM\") return booleanValue(true);\n return booleanValue(false);\n }\n if (sawNull) return null;\n switch (op) {\n case \"=\":\n case \"==\":\n case \"<=\":\n case \">=\":\n return booleanValue(true);\n case \"!=\":\n case \"<>\":\n case \"<\":\n case \">\":\n return booleanValue(false);\n default:\n return null;\n }\n}\n\nfunction rowValuesEqual(left: SqlValue[], right: SqlValue[]): boolean | null {\n if (left.length !== right.length) return false;\n let sawNull = false;\n for (let i = 0; i < left.length; i++) {\n const a = left[i]!;\n const b = right[i]!;\n if (a === null || b === null) {\n sawNull = true;\n continue;\n }\n const cmp = compareSql(a, b);\n if (cmp === null) {\n sawNull = true;\n continue;\n }\n if (cmp !== 0) return false;\n }\n return sawNull ? null : true;\n}\n\nfunction explicitCollation(expr: Expr): string | null {\n switch (expr.type) {\n case \"collate\":\n return expr.collation;\n case \"unary\":\n case \"cast\":\n return explicitCollation(expr.expr);\n case \"is_bool\":\n return explicitCollation(expr.expr);\n case \"binary\":\n return explicitCollation(expr.left) ?? explicitCollation(expr.right);\n case \"between\":\n return explicitCollation(expr.expr) ?? explicitCollation(expr.lower) ?? explicitCollation(expr.upper);\n case \"in\":\n return (\n explicitCollation(expr.expr) ??\n (Array.isArray(expr.values) ? (expr.values.map(explicitCollation).find((name) => name !== null) ?? null) : null)\n );\n case \"like\":\n return explicitCollation(expr.expr) ?? explicitCollation(expr.pattern);\n case \"case\":\n return (\n (expr.base && explicitCollation(expr.base)) ??\n expr.whens\n .flatMap((branch) => [branch.when, branch.then])\n .map(explicitCollation)\n .find((name) => name !== null) ??\n (expr.else && explicitCollation(expr.else)) ??\n null\n );\n case \"row\":\n return expr.values.map(explicitCollation).find((name) => name !== null) ?? null;\n default:\n return null;\n }\n}\n\n/** Explicit COLLATE wins; otherwise inherit declared column collation (left then right). */\nfunction resolveComparisonCollation(leftExpr: Expr, rightExpr: Expr, ctx: EvalContext): string | null {\n const explicit = explicitCollation(leftExpr) ?? explicitCollation(rightExpr);\n if (explicit) return explicit;\n return inheritedCollation(leftExpr, ctx) ?? inheritedCollation(rightExpr, ctx);\n}\n\nfunction inheritedCollation(expr: Expr, ctx: EvalContext): string | null {\n switch (expr.type) {\n case \"collate\":\n return inheritedCollation(expr.expr, ctx);\n case \"column\":\n return (\n ctx.resolveCollation?.(expr.table, expr.name) ?? ctx.parent?.resolveCollation?.(expr.table, expr.name) ?? null\n );\n case \"unary\":\n case \"cast\":\n return inheritedCollation(expr.expr, ctx);\n case \"is_bool\":\n return inheritedCollation(expr.expr, ctx);\n default:\n return null;\n }\n}\n\nfunction evalIn(left: SqlValue, values: SqlValue[], not: boolean): SqlValue {\n if (values.length === 0) return booleanValue(not);\n if (left === null) return null;\n let sawNull = false;\n for (const value of values) {\n if (value === null) {\n sawNull = true;\n } else if (compareSql(left, value) === 0) {\n return booleanValue(!not);\n }\n }\n if (sawNull) return null;\n return booleanValue(not);\n}\n\n/**\n * Evaluate a parsed SQL expression against `ctx` (columns, parameters, functions).\n *\n * @param expr - Expression AST node from {@link parse}.\n * @param ctx - Column / parameter / function resolution.\n */\nexport function evalExpr(expr: Expr, ctx: EvalContext): SqlValue {\n switch (expr.type) {\n case \"literal\": {\n if (expr.forceReal && typeof expr.value === \"number\") {\n return asSqlReal(expr.value);\n }\n return expr.value;\n }\n case \"null\":\n return null;\n case \"column\":\n return resolveColumn(ctx, expr.table, expr.name);\n case \"parameter\":\n return ctx.getParameter(expr.name);\n case \"collate\":\n return evalExpr(expr.expr, ctx);\n case \"unary\": {\n const value = evalExpr(expr.expr, ctx);\n if (expr.op === \"NOT\") {\n const truth = isTruthySql(value);\n return truth === null ? null : booleanValue(!truth);\n }\n if (value === null) return null;\n if (expr.op === \"+\") return asNumber(numberValue(value));\n if (expr.op === \"-\") return asNumber(-numberValue(value));\n return ~integerValue(value);\n }\n case \"is_bool\": {\n const truth = isTruthySql(evalExpr(expr.expr, ctx));\n if (!expr.not && expr.sense) return booleanValue(truth === true);\n if (!expr.not && !expr.sense) return booleanValue(truth === false);\n if (expr.not && expr.sense) return booleanValue(truth !== true);\n return booleanValue(truth !== false);\n }\n case \"binary\":\n return evalBinary(expr.op, expr.left, expr.right, ctx);\n case \"between\": {\n const value = evalExpr(expr.expr, ctx);\n const collation =\n resolveComparisonCollation(expr.expr, expr.lower, ctx) ??\n resolveComparisonCollation(expr.expr, expr.upper, ctx) ??\n undefined;\n const lower = compareResult(\">=\", value, evalExpr(expr.lower, ctx), collation);\n const result = sqlAnd(lower, () => compareResult(\"<=\", value, evalExpr(expr.upper, ctx), collation));\n if (result === null) return null;\n return expr.not ? booleanValue(result === 0) : result;\n }\n case \"in\": {\n if (expr.expr.type === \"row\" && Array.isArray(expr.values)) {\n const left = expr.expr.values.map((value) => evalExpr(value, ctx));\n let sawNull = false;\n let found = false;\n for (const candidate of expr.values) {\n if (candidate.type !== \"row\") {\n throw new SqliteError(\"row value misused\", \"misuse\");\n }\n const right = candidate.values.map((value) => evalExpr(value, ctx));\n const eq = rowValuesEqual(left, right);\n if (eq === true) {\n found = true;\n break;\n }\n if (eq === null) sawNull = true;\n }\n if (found) return booleanValue(!expr.not);\n if (sawNull) return null;\n return booleanValue(expr.not);\n }\n const left = evalExpr(expr.expr, ctx);\n const values = Array.isArray(expr.values)\n ? expr.values.map((value) => evalExpr(value, ctx))\n : executeSelect(ctx, expr.values).rows.map((row) => row[0] ?? null);\n return evalIn(left, values, expr.not);\n }\n case \"like\": {\n const value = evalExpr(expr.expr, ctx);\n const pattern = evalExpr(expr.pattern, ctx);\n const escape = expr.escape === null ? null : evalExpr(expr.escape, ctx);\n if (value === null || pattern === null || (escape === null && expr.escape !== null)) return null;\n const match =\n expr.op === \"LIKE\"\n ? likeMatch(textValue(value), textValue(pattern), escape === null ? null : textValue(escape))\n : globMatch(textValue(value), textValue(pattern));\n return booleanValue(expr.not ? !match : match);\n }\n case \"case\": {\n if (expr.base === null) {\n for (const branch of expr.whens) {\n if (isTruthySql(evalExpr(branch.when, ctx)) === true) return evalExpr(branch.then, ctx);\n }\n } else {\n const base = evalExpr(expr.base, ctx);\n for (const branch of expr.whens) {\n if (compareSql(base, evalExpr(branch.when, ctx)) === 0) return evalExpr(branch.then, ctx);\n }\n }\n return expr.else === null ? null : evalExpr(expr.else, ctx);\n }\n case \"cast\":\n return castSqlValue(evalExpr(expr.expr, ctx), expr.typeName);\n case \"function\": {\n if (expr.args === \"*\") throw new SqliteError(`wrong number of arguments to function ${expr.name}()`, \"misuse\");\n if (expr.name.toLowerCase() === \"raise\") {\n evalRaiseFunction(expr.args, ctx);\n throw new SqliteError(\"RAISE() did not abort execution\", \"misuse\");\n }\n if (\n expr.name.toLowerCase() === \"typeof\" &&\n expr.args.length === 1 &&\n expr.args[0]?.type === \"column\" &&\n ctx.resolveStorageClass\n ) {\n return ctx.resolveStorageClass(expr.args[0].table, expr.args[0].name);\n }\n const fn = (ctx.functions ?? defaultFunctionRegistry).lookupScalar(expr.name);\n if (!fn) throw new SqliteError(`no such function: ${expr.name}`, \"other\");\n return fn(\n expr.args.map((arg) => evalExpr(arg, ctx)),\n ctx.functionContext ?? {},\n );\n }\n case \"exists\": {\n const exists = executeSelect(ctx, expr.select).rows.length > 0;\n return booleanValue(expr.not ? !exists : exists);\n }\n case \"subquery\": {\n const result = executeSelect(ctx, expr.select);\n if (result.columns.length > 1) throw new SqliteError(\"sub-select returns more than 1 column\", \"other\");\n return result.rows[0]?.[0] ?? null;\n }\n case \"aggregate\":\n throw new SqliteError(\"aggregate expression requires aggregate evaluation\", \"misuse\");\n case \"window\":\n throw new SqliteError(\"window expression requires window evaluation\", \"misuse\");\n case \"row\":\n throw new SqliteError(\"row value cannot be used as a scalar value\", \"misuse\");\n }\n}\n\nfunction evalRaiseFunction(args: Expr[], ctx: EvalContext): never {\n if (!ctx.raise) throw new SqliteError(\"RAISE() may only be used within a trigger-program\", \"other\");\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function RAISE()\", \"misuse\");\n }\n const action = raiseActionName(args[0]!);\n if (!action) throw new SqliteError(\"bad argument to RAISE()\", \"other\");\n let message: string | undefined;\n if (args.length === 2) {\n const value = evalExpr(args[1]!, ctx);\n message = value === null ? undefined : String(value);\n }\n ctx.raise(action, message);\n throw new SqliteError(message ?? \"RAISE\", \"other\");\n}\n\nfunction raiseActionName(expr: Expr): \"IGNORE\" | \"ABORT\" | \"FAIL\" | \"ROLLBACK\" | null {\n if (expr.type === \"column\" && expr.table === null) {\n const name = expr.name.toUpperCase();\n if (name === \"IGNORE\" || name === \"ABORT\" || name === \"FAIL\" || name === \"ROLLBACK\") return name;\n }\n if (expr.type === \"literal\" && typeof expr.value === \"string\") {\n const name = expr.value.toUpperCase();\n if (name === \"IGNORE\" || name === \"ABORT\" || name === \"FAIL\" || name === \"ROLLBACK\") return name;\n }\n return null;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport { compareSql, isSqlJsonText, isSqlReal, type SqlValue } from \"../types/value.ts\";\n\nexport class IndexStore {\n readonly name: string;\n private entries: Map<string, Rowid[]>;\n private keyValues: Map<string, SqlValue[]>;\n private sortedKeys: string[] | null;\n frozen = false;\n\n constructor(\n name = \"index\",\n entries?: ReadonlyMap<string, readonly Rowid[]>,\n keyValues?: ReadonlyMap<string, readonly SqlValue[]>,\n ) {\n this.name = name;\n this.entries = new Map();\n this.keyValues = new Map();\n this.sortedKeys = null;\n if (entries) {\n for (const [key, rowids] of entries) this.entries.set(key, [...rowids]);\n }\n if (keyValues) {\n for (const [key, values] of keyValues) this.keyValues.set(key, [...values]);\n }\n }\n\n checkUnique(values: readonly SqlValue[], rowid?: Rowid): void {\n const key = serializeIndexKey(values);\n if (key === null) return;\n const existing = this.entries.get(key);\n if (!existing) return;\n for (const id of existing) {\n if (rowid === undefined || !sameRowid(id, rowid)) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${this.name}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n }\n }\n\n insert(values: readonly SqlValue[], rowid: Rowid, unique = true): void {\n this.assertMutable();\n const key = serializeIndexKey(values);\n if (key === null) return;\n if (unique) this.checkUnique(values, rowid);\n const existing = this.entries.get(key);\n if (!existing) {\n this.entries.set(key, [rowid]);\n this.keyValues.set(key, [...values]);\n this.sortedKeys = null;\n return;\n }\n for (const id of existing) if (sameRowid(id, rowid)) return;\n existing.push(rowid);\n }\n\n lookup(values: readonly SqlValue[]): readonly Rowid[] {\n const key = serializeIndexKey(values);\n if (key === null) return [];\n return this.entries.get(key) ?? [];\n }\n\n /** Leftmost prefix match: INDEX(a,b) used for WHERE a = ?. */\n lookupPrefix(values: readonly SqlValue[]): readonly Rowid[] {\n if (values.length === 0) return [];\n const prefix = serializeIndexKey(values);\n if (prefix === null) return [];\n const exact = this.entries.get(prefix);\n const needle = `${prefix}|`;\n const rowids: Rowid[] = exact ? [...exact] : [];\n for (const [key, ids] of this.entries) {\n if (key.startsWith(needle)) rowids.push(...ids);\n }\n return rowids;\n }\n\n /**\n * Ordered scan of rowids for a single-column comparison.\n * `op` applies to the first key component.\n */\n rangeLookup(op: \">\" | \">=\" | \"<\" | \"<=\" | \"between\", bound: SqlValue, bound2?: SqlValue): readonly Rowid[] {\n const rowids: Rowid[] = [];\n const keys = this.orderedKeys();\n for (const key of keys) {\n const values = this.keyValues.get(key);\n if (!values || values[0] === undefined) continue;\n const cmp = compareSerializedOrder(values[0]!, bound);\n let ok = false;\n if (op === \">\") ok = cmp > 0;\n else if (op === \">=\") ok = cmp >= 0;\n else if (op === \"<\") ok = cmp < 0;\n else if (op === \"<=\") ok = cmp <= 0;\n else if (op === \"between\" && bound2 !== undefined) {\n ok = cmp >= 0 && compareSerializedOrder(values[0]!, bound2) <= 0;\n }\n if (ok) {\n const ids = this.entries.get(key);\n if (ids) rowids.push(...ids);\n }\n }\n return rowids;\n }\n\n orderedRowids(desc = false): readonly Rowid[] {\n const keys = this.orderedKeys();\n const rowids: Rowid[] = [];\n const seq = desc ? [...keys].reverse() : keys;\n for (const key of seq) {\n const ids = this.entries.get(key);\n if (ids) rowids.push(...ids);\n }\n return rowids;\n }\n\n remove(values: readonly SqlValue[], rowid?: Rowid): boolean {\n this.assertMutable();\n const key = serializeIndexKey(values);\n if (key === null) return false;\n const existing = this.entries.get(key);\n if (!existing) return false;\n if (rowid === undefined) {\n this.entries.delete(key);\n this.keyValues.delete(key);\n this.sortedKeys = null;\n return true;\n }\n const index = existing.findIndex((id) => sameRowid(id, rowid));\n if (index < 0) return false;\n existing.splice(index, 1);\n if (existing.length === 0) {\n this.entries.delete(key);\n this.keyValues.delete(key);\n this.sortedKeys = null;\n }\n return true;\n }\n\n clear(): void {\n this.assertMutable();\n this.entries.clear();\n this.keyValues.clear();\n this.sortedKeys = null;\n }\n\n clone(): IndexStore {\n return new IndexStore(this.name, this.entries, this.keyValues);\n }\n\n freeze(): void {\n this.frozen = true;\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n private orderedKeys(): string[] {\n if (this.sortedKeys) return this.sortedKeys;\n const keys = [...this.entries.keys()];\n keys.sort((a, b) => {\n const left = this.keyValues.get(a);\n const right = this.keyValues.get(b);\n if (!left || !right) return a < b ? -1 : a > b ? 1 : 0;\n const n = Math.min(left.length, right.length);\n for (let i = 0; i < n; i++) {\n const cmp = compareSql(left[i] ?? null, right[i] ?? null);\n if (cmp !== 0) return cmp ?? 0;\n }\n return left.length - right.length;\n });\n this.sortedKeys = keys;\n return keys;\n }\n\n private assertMutable(): void {\n if (this.frozen) throw new SqliteError(\"internal: cannot mutate a frozen index\", \"other\");\n }\n}\n\nexport function serializeIndexKey(values: readonly SqlValue[]): string | null {\n if (values.some((value) => value === null)) return null;\n return (values as readonly Exclude<SqlValue, null>[])\n .map(serializeValue)\n .map((part) => `${part.length}:${part}`)\n .join(\"|\");\n}\n\nfunction serializeValue(value: Exclude<SqlValue, null>): string {\n if (isSqlReal(value)) {\n const n = value.value;\n if (Number.isNaN(n)) return \"f:nan\";\n if (n === Infinity) return \"f:+inf\";\n if (n === -Infinity) return \"f:-inf\";\n return `f:${Object.is(n, -0) ? \"0\" : n.toString()}`;\n }\n if (isSqlJsonText(value)) return `t:${value.value}`;\n if (typeof value === \"bigint\") return `n:${value.toString()}`;\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) return `n:${BigInt(value).toString()}`;\n if (Number.isNaN(value)) return \"f:nan\";\n if (value === Infinity) return \"f:+inf\";\n if (value === -Infinity) return \"f:-inf\";\n return `f:${Object.is(value, -0) ? \"0\" : value.toString()}`;\n }\n if (typeof value === \"string\") return `t:${value}`;\n let hex = \"\";\n for (const byte of value) hex += byte.toString(16).padStart(2, \"0\");\n return `b:${hex}`;\n}\n\nfunction compareSerializedOrder(left: SqlValue, right: SqlValue): number {\n return compareSql(left, right) ?? 0;\n}\n\nfunction sameRowid(left: Rowid, right: Rowid): boolean {\n return typeof left === \"bigint\" || typeof right === \"bigint\" ? BigInt(left) === BigInt(right) : left === right;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { asSqlReal, coerceToNumber, isSqlReal, storageClassOf, type SqlValue, utf8Decode } from \"./value.ts\";\n\nconst STRICT_TYPES = new Set([\"INT\", \"INTEGER\", \"REAL\", \"TEXT\", \"BLOB\", \"ANY\"]);\n\nexport function isStrictTypeName(typeName: string | null | undefined): boolean {\n if (!typeName) return false;\n return STRICT_TYPES.has(typeName.trim().toUpperCase());\n}\n\nexport function applyStrictValue(value: SqlValue, typeName: string, table: string, column: string): SqlValue {\n if (value === null) return null;\n const declared = typeName.trim().toUpperCase();\n const storage = storageClassOf(value);\n if (declared === \"ANY\") return value;\n\n if (declared === \"TEXT\") {\n if (storage === \"text\") return typeof value === \"string\" ? value : String((value as { value: string }).value);\n if (storage === \"integer\" || storage === \"real\") return String(isSqlReal(value) ? value.value : value);\n throw cannotStore(storage, declared, table, column);\n }\n\n if (declared === \"INT\" || declared === \"INTEGER\") {\n if (storage === \"integer\") return value;\n if (storage === \"real\") {\n const n = isSqlReal(value) ? value.value : Number(value);\n if (Number.isInteger(n)) return n;\n throw cannotStore(storage, declared, table, column);\n }\n if (storage === \"text\") {\n const n = coerceToNumber(value);\n if (n !== null && Number.isInteger(n) && String(value).trim() === String(n)) return n;\n throw cannotStore(storage, declared, table, column);\n }\n throw cannotStore(storage, declared, table, column);\n }\n\n if (declared === \"REAL\") {\n if (storage === \"real\") return isSqlReal(value) ? value : asSqlReal(Number(value));\n if (storage === \"integer\") return asSqlReal(typeof value === \"bigint\" ? Number(value) : Number(value));\n if (storage === \"text\") {\n const n = coerceToNumber(value);\n if (n !== null) return asSqlReal(n);\n }\n throw cannotStore(storage, declared, table, column);\n }\n\n if (declared === \"BLOB\") {\n if (storage === \"blob\") return value;\n throw cannotStore(storage, declared, table, column);\n }\n\n throw new SqliteError(`unknown datatype for ${table}.${column}: \"${typeName}\"`, \"other\");\n}\n\nfunction cannotStore(storage: string, declared: string, table: string, column: string): never {\n const shown = storage === \"integer\" ? \"INT\" : storage.toUpperCase();\n throw new SqliteError(\n `cannot store ${shown} value in ${declared} column ${table}.${column}`,\n \"datatype_mismatch\",\n \"SQLITE_CONSTRAINT_DATATYPE\",\n );\n}\n\nexport function unknownStrictType(table: string, column: string, typeName: string): never {\n throw new SqliteError(`unknown datatype for ${table}.${column}: \"${typeName}\"`, \"other\");\n}\n\n/** SQLite reports INT for the integer storage class in STRICT errors. */\nexport function strictStorageLabel(value: SqlValue): string {\n const storage = storageClassOf(value);\n if (storage === \"integer\") return \"INT\";\n if (storage === \"text\") return \"TEXT\";\n if (storage === \"real\") return \"REAL\";\n if (storage === \"blob\") return \"BLOB\";\n return \"NULL\";\n}\n\nvoid utf8Decode;\n", "import { SqliteError } from \"../../errors/index.ts\";\n\nexport type FtsKind = \"fts5\" | \"fts3\" | \"fts4\";\n\nexport type FtsDetail = \"full\" | \"column\" | \"none\";\n\nexport interface FtsColumnDef {\n name: string;\n unindexed: boolean;\n}\n\nexport interface FtsTokenizerConfig {\n /** Primary tokenizer name (unicode61, ascii, porter, trigram). */\n name: string;\n /** Base tokenizer when name is porter. */\n base?: string;\n removeDiacritics?: 0 | 1 | 2;\n tokenchars?: string;\n separators?: string;\n caseSensitive?: boolean; // trigram\n removeDiacriticsTrigram?: boolean;\n}\n\nexport interface FtsTableOptions {\n columns: FtsColumnDef[];\n content: \"normal\" | \"contentless\" | \"external\";\n contentTable: string | null;\n contentRowid: string;\n contentlessDelete: boolean;\n prefix: number[];\n columnsize: boolean;\n detail: FtsDetail;\n tokendata: boolean;\n locale: boolean;\n tokenizer: FtsTokenizerConfig;\n /** FTS3/4 */\n languageid: string | null;\n notindexed: Set<string>;\n}\n\nconst OPTION_NAMES = new Set([\n \"tokenize\",\n \"prefix\",\n \"content\",\n \"content_rowid\",\n \"contentless_delete\",\n \"columnsize\",\n \"detail\",\n \"tokendata\",\n \"locale\",\n \"languageid\",\n \"matchinfo\",\n \"order\",\n \"compress\",\n \"uncompress\",\n]);\n\nexport function parseFtsModuleArgs(moduleArgs: string[], kind: FtsKind): FtsTableOptions {\n const columns: FtsColumnDef[] = [];\n const notindexed = new Set<string>();\n let content: FtsTableOptions[\"content\"] = \"normal\";\n let contentTable: string | null = null;\n let contentRowid = \"rowid\";\n let contentlessDelete = false;\n let prefix: number[] = [];\n let columnsize = true;\n let detail: FtsDetail = \"full\";\n let tokendata = false;\n let locale = false;\n let languageid: string | null = null;\n let tokenizer: FtsTokenizerConfig = { name: \"unicode61\", removeDiacritics: 1 };\n\n for (const raw of moduleArgs) {\n const arg = raw.trim();\n if (!arg) continue;\n\n const eq = splitOption(arg);\n if (eq) {\n const key = eq.key.toLowerCase();\n const value = eq.value;\n if (!OPTION_NAMES.has(key) && kind === \"fts5\") {\n // FTS5: unknown option-like keys that aren't columns throw\n if (/^[a-z_][a-z0-9_]*$/i.test(eq.key) && value !== null) {\n // still accept known options only\n }\n }\n switch (key) {\n case \"tokenize\":\n tokenizer = parseTokenizer(value);\n break;\n case \"prefix\":\n prefix = value\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .map((part) => {\n const n = Number(part);\n if (!Number.isInteger(n) || n <= 0) throw new SqliteError(\"SQL logic error\", \"other\");\n return n;\n });\n break;\n case \"content\":\n if (value === \"\") {\n content = \"contentless\";\n contentTable = null;\n } else {\n content = \"external\";\n contentTable = value;\n }\n break;\n case \"content_rowid\":\n contentRowid = value;\n break;\n case \"contentless_delete\":\n contentlessDelete = value === \"1\" || value.toLowerCase() === \"true\";\n break;\n case \"columnsize\":\n columnsize = value !== \"0\";\n break;\n case \"detail\": {\n const d = value.toLowerCase();\n if (d !== \"full\" && d !== \"column\" && d !== \"none\") throw new SqliteError(\"SQL logic error\", \"other\");\n detail = d;\n break;\n }\n case \"tokendata\":\n tokendata = value === \"1\" || value.toLowerCase() === \"true\";\n break;\n case \"locale\":\n locale = value === \"1\" || value.toLowerCase() === \"true\";\n break;\n case \"languageid\":\n languageid = value;\n break;\n default:\n // Treat as column name = something invalid for FTS5 \u2192 column with odd name\n if (kind === \"fts5\") throw new SqliteError(`unrecognized parameter: ${eq.key}`, \"other\");\n columns.push({ name: eq.key, unindexed: false });\n break;\n }\n continue;\n }\n\n // Column form: name [UNINDEXED]\n const parts = arg.split(/\\s+/).filter(Boolean);\n if (parts.length === 0) continue;\n const name = unquoteIdent(parts[0]!);\n const rest = parts.slice(1).map((p) => p.toUpperCase());\n if (rest.includes(\"UNINDEXED\") || rest.includes(\"NOTINDEXED\")) {\n columns.push({ name, unindexed: true });\n notindexed.add(name.toLowerCase());\n } else if (rest.length === 0) {\n if (OPTION_NAMES.has(name.toLowerCase()) && kind === \"fts5\") {\n // bare option name without = is invalid for some; treat as column (SQLite allows content as column name)\n columns.push({ name, unindexed: false });\n } else {\n columns.push({ name, unindexed: false });\n }\n } else if (kind === \"fts3\" || kind === \"fts4\") {\n // FTS3/4 column type names ignored\n columns.push({ name, unindexed: false });\n } else {\n throw new SqliteError(\"SQL logic error\", \"other\");\n }\n }\n\n if (columns.length === 0) throw new SqliteError(\"fts requires at least one column\", \"other\");\n\n const names = new Set<string>();\n for (const column of columns) {\n const key = column.name.toLowerCase();\n if (names.has(key)) throw new SqliteError(\"SQL logic error\", \"other\");\n names.add(key);\n }\n\n return {\n columns,\n content,\n contentTable,\n contentRowid,\n contentlessDelete,\n prefix,\n columnsize,\n detail,\n tokendata,\n locale,\n tokenizer,\n languageid,\n notindexed,\n };\n}\n\nfunction splitOption(arg: string): { key: string; value: string } | null {\n const match = /^([A-Za-z_][\\w]*)\\s*=\\s*(.*)$/s.exec(arg);\n if (!match) return null;\n return { key: match[1]!, value: unquoteValue(match[2]!.trim()) };\n}\n\nfunction unquoteValue(value: string): string {\n if (\n (value.startsWith(\"'\") && value.endsWith(\"'\")) ||\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"`\") && value.endsWith(\"`\"))\n ) {\n const q = value[0]!;\n return value\n .slice(1, -1)\n .replaceAll(q + q, q)\n .replaceAll(\"\\\\'\", \"'\")\n .replaceAll('\\\\\"', '\"');\n }\n return value;\n}\n\nfunction unquoteIdent(value: string): string {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"`\") && value.endsWith(\"`\")) ||\n (value.startsWith(\"[\") && value.endsWith(\"]\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n}\n\nfunction parseTokenizer(spec: string): FtsTokenizerConfig {\n const tokens = tokenizeSpec(spec);\n if (tokens.length === 0) throw new SqliteError(\"no such tokenizer: \", \"other\");\n const name = tokens[0]!.toLowerCase();\n if (name === \"porter\") {\n const base = tokens[1]?.toLowerCase() ?? \"unicode61\";\n const rest = parseUnicodeOpts(tokens.slice(base === \"unicode61\" || base === \"ascii\" ? 2 : 1));\n return { name: \"porter\", base: base === \"ascii\" ? \"ascii\" : \"unicode61\", ...rest };\n }\n if (name === \"trigram\") {\n let caseSensitive = false;\n let removeDiacriticsTrigram = false;\n for (let i = 1; i < tokens.length; i++) {\n const t = tokens[i]!.toLowerCase();\n if (t === \"case_sensitive\" && tokens[i + 1] === \"1\") {\n caseSensitive = true;\n i++;\n } else if (t === \"remove_diacritics\" && tokens[i + 1] === \"1\") {\n removeDiacriticsTrigram = true;\n i++;\n }\n }\n return { name: \"trigram\", caseSensitive, removeDiacriticsTrigram };\n }\n if (name === \"ascii\") {\n return { name: \"ascii\", ...parseUnicodeOpts(tokens.slice(1)) };\n }\n if (name === \"unicode61\") {\n return { name: \"unicode61\", removeDiacritics: 1, ...parseUnicodeOpts(tokens.slice(1)) };\n }\n throw new SqliteError(`no such tokenizer: ${name}`, \"other\");\n}\n\nfunction parseUnicodeOpts(tokens: string[]): Partial<FtsTokenizerConfig> {\n const out: Partial<FtsTokenizerConfig> = {};\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i]!.toLowerCase();\n if (t === \"remove_diacritics\") {\n const v = Number(tokens[++i] ?? \"1\");\n if (v !== 0 && v !== 1 && v !== 2) throw new SqliteError(\"SQL logic error\", \"other\");\n out.removeDiacritics = v as 0 | 1 | 2;\n } else if (t === \"tokenchars\") {\n out.tokenchars = tokens[++i] ?? \"\";\n } else if (t === \"separators\") {\n out.separators = tokens[++i] ?? \"\";\n }\n }\n return out;\n}\n\nfunction tokenizeSpec(spec: string): string[] {\n const out: string[] = [];\n let i = 0;\n while (i < spec.length) {\n while (i < spec.length && /\\s/.test(spec[i]!)) i++;\n if (i >= spec.length) break;\n if (spec[i] === \"'\" || spec[i] === '\"') {\n const q = spec[i]!;\n i++;\n let s = \"\";\n while (i < spec.length && spec[i] !== q) {\n s += spec[i++];\n }\n if (spec[i] === q) i++;\n out.push(s);\n continue;\n }\n let s = \"\";\n while (i < spec.length && !/\\s/.test(spec[i]!)) s += spec[i++];\n out.push(s);\n }\n return out;\n}\n", "import { SqliteError } from \"../../errors/index.ts\";\n\nexport type FtsQueryNode =\n | { type: \"term\"; value: string; prefix: boolean; column: string | null; columns: string[] | null }\n | {\n type: \"phrase\";\n terms: Array<{ value: string; prefix: boolean }>;\n column: string | null;\n columns: string[] | null;\n }\n | { type: \"near\"; children: FtsQueryNode[]; distance: number; column: string | null; columns: string[] | null }\n | { type: \"and\"; children: FtsQueryNode[] }\n | { type: \"or\"; children: FtsQueryNode[] }\n | { type: \"not\"; child: FtsQueryNode }\n | { type: \"true\" };\n\ntype Tok =\n | { kind: \"TERM\"; value: string; prefix: boolean }\n | { kind: \"STRING\"; value: string }\n | { kind: \"AND\" }\n | { kind: \"OR\" }\n | { kind: \"NOT\" }\n | { kind: \"NEAR\" }\n | { kind: \"LPAREN\" }\n | { kind: \"RPAREN\" }\n | { kind: \"COLON\" }\n | { kind: \"COMMA\" }\n | { kind: \"LBRACE\" }\n | { kind: \"RBRACE\" }\n | { kind: \"EOF\" };\n\n/**\n * Parse an FTS5 MATCH expression.\n * Implicit AND between adjacent terms; OR binds looser than AND; NOT is binary (a NOT b).\n */\nexport function parseFts5Query(input: string): FtsQueryNode {\n const tokens = lexFts5(input);\n let i = 0;\n\n function peek(): Tok {\n return tokens[i] ?? { kind: \"EOF\" };\n }\n function next(): Tok {\n return tokens[i++] ?? { kind: \"EOF\" };\n }\n function expect(kind: Tok[\"kind\"]): Tok {\n const t = next();\n if (t.kind !== kind) throw new SqliteError(`fts5: syntax error near \"${displayTok(t)}\"`, \"syntax\");\n return t;\n }\n\n function parseExpr(): FtsQueryNode {\n return parseOr();\n }\n\n function parseOr(): FtsQueryNode {\n let left = parseAnd();\n while (peek().kind === \"OR\") {\n next();\n const right = parseAnd();\n if (left.type === \"or\") left = { type: \"or\", children: [...left.children, right] };\n else left = { type: \"or\", children: [left, right] };\n }\n return left;\n }\n\n function parseAnd(): FtsQueryNode {\n let left = parseUnary();\n while (true) {\n const p = peek();\n if (p.kind === \"EOF\" || p.kind === \"RPAREN\" || p.kind === \"OR\" || p.kind === \"COMMA\" || p.kind === \"RBRACE\")\n break;\n if (p.kind === \"AND\") {\n next();\n const right = parseUnary();\n if (left.type === \"and\") left = { type: \"and\", children: [...left.children, right] };\n else left = { type: \"and\", children: [left, right] };\n continue;\n }\n if (p.kind === \"NOT\") {\n next();\n const right = parseUnary();\n left = { type: \"and\", children: [left, { type: \"not\", child: right }] };\n continue;\n }\n // implicit AND\n if (\n p.kind === \"TERM\" ||\n p.kind === \"STRING\" ||\n p.kind === \"LPAREN\" ||\n p.kind === \"NEAR\" ||\n p.kind === \"LBRACE\" ||\n p.kind === \"COLON\"\n ) {\n // COLON alone is invalid here \u2014 column filter starts with TERM or LBRACE\n if (p.kind === \"COLON\") break;\n const right = parseUnary();\n if (left.type === \"and\") left = { type: \"and\", children: [...left.children, right] };\n else left = { type: \"and\", children: [left, right] };\n continue;\n }\n break;\n }\n return left;\n }\n\n function parseUnary(): FtsQueryNode {\n // column filter: {a b} : expr or col : expr\n const filtered = tryParseColumnFilter();\n if (filtered) return filtered;\n\n const p = peek();\n if (p.kind === \"LPAREN\") {\n next();\n const inner = parseExpr();\n expect(\"RPAREN\");\n return inner;\n }\n if (p.kind === \"NEAR\") {\n next();\n expect(\"LPAREN\");\n const children: FtsQueryNode[] = [];\n children.push(parseUnary());\n while (peek().kind !== \"COMMA\" && peek().kind !== \"RPAREN\" && peek().kind !== \"EOF\") {\n children.push(parseUnary());\n }\n let distance = 10;\n if (peek().kind === \"COMMA\") {\n next();\n const distTok = next();\n if (distTok.kind !== \"TERM\") throw new SqliteError(\"fts5: syntax error near NEAR\", \"syntax\");\n distance = Number(distTok.value);\n if (!Number.isFinite(distance)) throw new SqliteError(\"fts5: syntax error near NEAR\", \"syntax\");\n }\n expect(\"RPAREN\");\n return { type: \"near\", children, distance, column: null, columns: null };\n }\n if (p.kind === \"STRING\") {\n next();\n const terms = p.value\n .split(/\\s+/)\n .filter(Boolean)\n .map((part) => {\n const prefix = part.endsWith(\"*\");\n return { value: prefix ? part.slice(0, -1) : part, prefix };\n });\n return { type: \"phrase\", terms, column: null, columns: null };\n }\n if (p.kind === \"TERM\") {\n next();\n return { type: \"term\", value: p.value, prefix: p.prefix, column: null, columns: null };\n }\n throw new SqliteError(`fts5: syntax error near \"${displayTok(p)}\"`, \"syntax\");\n }\n\n function tryParseColumnFilter(): FtsQueryNode | null {\n const save = i;\n let column: string | null = null;\n let columns: string[] | null = null;\n\n if (peek().kind === \"LBRACE\") {\n next();\n columns = [];\n while (peek().kind !== \"RBRACE\" && peek().kind !== \"EOF\") {\n if (peek().kind === \"TERM\") {\n const termTok = next();\n if (termTok.kind !== \"TERM\") {\n i = save;\n return null;\n }\n columns.push(termTok.value.toLowerCase());\n } else if (peek().kind === \"COMMA\") {\n next();\n } else {\n i = save;\n return null;\n }\n }\n if (peek().kind !== \"RBRACE\") {\n i = save;\n return null;\n }\n next();\n } else if (peek().kind === \"TERM\") {\n const name = next();\n if (name.kind !== \"TERM\") {\n i = save;\n return null;\n }\n if (peek().kind !== \"COLON\") {\n i = save;\n return null;\n }\n column = name.value.toLowerCase();\n } else {\n return null;\n }\n\n if (peek().kind !== \"COLON\") {\n i = save;\n return null;\n }\n next(); // colon\n const inner = parseUnary();\n return applyColumn(inner, column, columns);\n }\n\n if (tokens.length === 1 && tokens[0]!.kind === \"EOF\") return { type: \"true\" };\n const root = parseExpr();\n if (peek().kind !== \"EOF\") throw new SqliteError(`fts5: syntax error near \"${displayTok(peek())}\"`, \"syntax\");\n return root;\n}\n\nfunction applyColumn(node: FtsQueryNode, column: string | null, columns: string[] | null): FtsQueryNode {\n switch (node.type) {\n case \"term\":\n case \"phrase\":\n case \"near\":\n return { ...node, column: column ?? node.column, columns: columns ?? node.columns };\n case \"and\":\n case \"or\":\n return { ...node, children: node.children.map((child) => applyColumn(child, column, columns)) };\n case \"not\":\n return { type: \"not\", child: applyColumn(node.child, column, columns) };\n case \"true\":\n return node;\n }\n}\n\nfunction lexFts5(input: string): Tok[] {\n const tokens: Tok[] = [];\n let i = 0;\n while (i < input.length) {\n const ch = input[i]!;\n if (/\\s/.test(ch)) {\n i++;\n continue;\n }\n if (ch === \"(\") {\n tokens.push({ kind: \"LPAREN\" });\n i++;\n continue;\n }\n if (ch === \")\") {\n tokens.push({ kind: \"RPAREN\" });\n i++;\n continue;\n }\n if (ch === \"{\") {\n tokens.push({ kind: \"LBRACE\" });\n i++;\n continue;\n }\n if (ch === \"}\") {\n tokens.push({ kind: \"RBRACE\" });\n i++;\n continue;\n }\n if (ch === \":\") {\n tokens.push({ kind: \"COLON\" });\n i++;\n continue;\n }\n if (ch === \",\") {\n tokens.push({ kind: \"COMMA\" });\n i++;\n continue;\n }\n if (ch === '\"') {\n i++;\n let value = \"\";\n while (i < input.length && input[i] !== '\"') {\n if (input[i] === \"\\\\\" && i + 1 < input.length) {\n value += input[i + 1];\n i += 2;\n continue;\n }\n value += input[i++];\n }\n if (input[i] === '\"') i++;\n tokens.push({ kind: \"STRING\", value });\n continue;\n }\n // bare word\n let word = \"\";\n while (i < input.length && !/[\\s(){}:,\"]/.test(input[i]!)) word += input[i++];\n if (!word) {\n i++;\n continue;\n }\n const upper = word.toUpperCase();\n if (upper === \"AND\") tokens.push({ kind: \"AND\" });\n else if (upper === \"OR\") tokens.push({ kind: \"OR\" });\n else if (upper === \"NOT\") tokens.push({ kind: \"NOT\" });\n else if (upper === \"NEAR\") {\n // NEAR is a keyword only when followed by '('; otherwise it is a bare term.\n let j = i;\n while (j < input.length && /\\s/.test(input[j]!)) j++;\n if (input[j] === \"(\") tokens.push({ kind: \"NEAR\" });\n else {\n const prefix = word.endsWith(\"*\");\n tokens.push({ kind: \"TERM\", value: prefix ? word.slice(0, -1) : word, prefix });\n }\n } else {\n const prefix = word.endsWith(\"*\");\n tokens.push({ kind: \"TERM\", value: prefix ? word.slice(0, -1) : word, prefix });\n }\n }\n tokens.push({ kind: \"EOF\" });\n return tokens;\n}\n\nfunction displayTok(t: Tok): string {\n switch (t.kind) {\n case \"TERM\":\n return t.prefix ? `${t.value}*` : t.value;\n case \"STRING\":\n return `\"${t.value}\"`;\n case \"EOF\":\n return \"\";\n default:\n return t.kind;\n }\n}\n\n/** FTS3/4 query parser (ENABLE_FTS3_PARENTHESIS style). */\nexport function parseFts3Query(input: string): FtsQueryNode {\n // Reuse FTS5 parser with minor differences: column:term form already handled.\n // FTS3 uses OR/AND/NOT/NEAR similarly when parenthesis enabled.\n try {\n return parseFts5Query(input);\n } catch {\n // Fallback: treat as AND of terms (legacy)\n const terms = input\n .split(/\\s+/)\n .filter(Boolean)\n .filter((t) => !/^(AND|OR|NOT|NEAR)$/i.test(t));\n if (terms.length === 0) return { type: \"true\" };\n const nodes: FtsQueryNode[] = terms.map((t) => {\n const prefix = t.endsWith(\"*\");\n return { type: \"term\" as const, value: prefix ? t.slice(0, -1) : t, prefix, column: null, columns: null };\n });\n return nodes.length === 1 ? nodes[0]! : { type: \"and\", children: nodes };\n }\n}\n", "/** Classic Porter stemming algorithm (English). */\nexport function porterStem(word: string): string {\n let w = word.toLowerCase();\n if (w.length <= 2) return w;\n\n // Step 1a\n if (w.endsWith(\"sses\")) w = `${w.slice(0, -2)}`;\n else if (w.endsWith(\"ies\")) w = `${w.slice(0, -2)}`;\n else if (w.endsWith(\"ss\")) {\n /* keep */\n } else if (w.endsWith(\"s\") && w.length > 3) w = w.slice(0, -1);\n\n // Step 1b\n let step1bStar = false;\n if (w.endsWith(\"eed\")) {\n const stem = w.slice(0, -3);\n if (measure(stem) > 0) w = `${stem}ee`;\n } else {\n let stem: string | null = null;\n if (w.endsWith(\"ed\") && hasVowel(w.slice(0, -2))) stem = w.slice(0, -2);\n else if (w.endsWith(\"ing\") && hasVowel(w.slice(0, -3))) stem = w.slice(0, -3);\n if (stem !== null) {\n w = stem;\n step1bStar = true;\n }\n }\n if (step1bStar) {\n if (w.endsWith(\"at\") || w.endsWith(\"bl\") || w.endsWith(\"iz\")) w = `${w}e`;\n else if (doubleConsonant(w) && !/[lsz]$/.test(w)) w = w.slice(0, -1);\n else if (measure(w) === 1 && cvc(w)) w = `${w}e`;\n }\n\n // Step 1c\n if (w.endsWith(\"y\") && hasVowel(w.slice(0, -1))) w = `${w.slice(0, -1)}i`;\n\n // Step 2\n for (const [suf, rep] of STEP2) {\n if (w.endsWith(suf)) {\n const stem = w.slice(0, -suf.length);\n if (measure(stem) > 0) {\n w = stem + rep;\n break;\n }\n }\n }\n\n // Step 3\n for (const [suf, rep] of STEP3) {\n if (w.endsWith(suf)) {\n const stem = w.slice(0, -suf.length);\n if (measure(stem) > 0) {\n w = stem + rep;\n break;\n }\n }\n }\n\n // Step 4\n for (const suf of STEP4) {\n if (w.endsWith(suf)) {\n const stem = w.slice(0, -suf.length);\n if (measure(stem) > 1) {\n w = stem;\n break;\n }\n }\n }\n if (w.endsWith(\"ion\")) {\n const stem = w.slice(0, -3);\n if (measure(stem) > 1 && /[st]$/.test(stem)) w = stem;\n }\n\n // Step 5a\n if (w.endsWith(\"e\")) {\n const stem = w.slice(0, -1);\n const m = measure(stem);\n if (m > 1 || (m === 1 && !cvc(stem))) w = stem;\n }\n\n // Step 5b\n if (measure(w) > 1 && doubleConsonant(w) && w.endsWith(\"l\")) w = w.slice(0, -1);\n\n return w;\n}\n\nconst STEP2: Array<[string, string]> = [\n [\"ational\", \"ate\"],\n [\"tional\", \"tion\"],\n [\"enci\", \"ence\"],\n [\"anci\", \"ance\"],\n [\"izer\", \"ize\"],\n [\"abli\", \"able\"],\n [\"alli\", \"al\"],\n [\"entli\", \"ent\"],\n [\"eli\", \"e\"],\n [\"ousli\", \"ous\"],\n [\"ization\", \"ize\"],\n [\"ation\", \"ate\"],\n [\"ator\", \"ate\"],\n [\"alism\", \"al\"],\n [\"iveness\", \"ive\"],\n [\"fulness\", \"ful\"],\n [\"ousness\", \"ous\"],\n [\"aliti\", \"al\"],\n [\"iviti\", \"ive\"],\n [\"biliti\", \"ble\"],\n];\n\nconst STEP3: Array<[string, string]> = [\n [\"icate\", \"ic\"],\n [\"ative\", \"\"],\n [\"alize\", \"al\"],\n [\"iciti\", \"ic\"],\n [\"ical\", \"ic\"],\n [\"ful\", \"\"],\n [\"ness\", \"\"],\n];\n\nconst STEP4 = [\n \"al\",\n \"ance\",\n \"ence\",\n \"er\",\n \"ic\",\n \"able\",\n \"ible\",\n \"ant\",\n \"ement\",\n \"ment\",\n \"ent\",\n \"ou\",\n \"ism\",\n \"ate\",\n \"iti\",\n \"ous\",\n \"ive\",\n \"ize\",\n];\n\nfunction isConsonant(word: string, i: number): boolean {\n const c = word[i]!;\n if (\"aeiou\".includes(c)) return false;\n if (c === \"y\") return i === 0 ? true : !isConsonant(word, i - 1);\n return true;\n}\n\nfunction measure(word: string): number {\n let m = 0;\n let i = 0;\n const n = word.length;\n while (i < n && isConsonant(word, i)) i++;\n while (i < n) {\n while (i < n && !isConsonant(word, i)) i++;\n while (i < n && isConsonant(word, i)) i++;\n m++;\n }\n return m;\n}\n\nfunction hasVowel(word: string): boolean {\n for (let i = 0; i < word.length; i++) if (!isConsonant(word, i)) return true;\n return false;\n}\n\nfunction doubleConsonant(word: string): boolean {\n const n = word.length;\n if (n < 2) return false;\n return word[n - 1] === word[n - 2] && isConsonant(word, n - 1);\n}\n\nfunction cvc(word: string): boolean {\n const n = word.length;\n if (n < 3) return false;\n if (!isConsonant(word, n - 1) || isConsonant(word, n - 2) || !isConsonant(word, n - 3)) return false;\n const last = word[n - 1]!;\n return last !== \"w\" && last !== \"x\" && last !== \"y\";\n}\n", "import type { FtsTokenizerConfig } from \"./options.ts\";\nimport { porterStem } from \"./porter.ts\";\n\nexport interface FtsToken {\n /** Normalized token text stored in the index. */\n term: string;\n /** Byte offset of the token in the UTF-8 encoding of the source. */\n start: number;\n /** Byte length in UTF-8. */\n length: number;\n /** Token position (0-based) within the column. */\n position: number;\n /** Original end offset in JS string code units (for highlight). */\n startUnit: number;\n endUnit: number;\n}\n\nexport type TokenizerFn = (text: string) => FtsToken[];\n\nexport function createTokenizer(config: FtsTokenizerConfig): TokenizerFn {\n if (config.name === \"porter\") {\n const base = createTokenizer({\n name: config.base === \"ascii\" ? \"ascii\" : \"unicode61\",\n removeDiacritics: config.removeDiacritics ?? 1,\n tokenchars: config.tokenchars,\n separators: config.separators,\n });\n return (text) =>\n base(text).map((token) => ({\n ...token,\n term: porterStem(token.term),\n }));\n }\n if (config.name === \"trigram\") return createTrigramTokenizer(config);\n if (config.name === \"ascii\") return createAsciiTokenizer(config);\n return createUnicode61Tokenizer(config);\n}\n\nfunction createAsciiTokenizer(config: FtsTokenizerConfig): TokenizerFn {\n const extraToken = new Set(config.tokenchars ?? \"\");\n const extraSep = new Set(config.separators ?? \"\");\n return (text: string) => {\n const tokens: FtsToken[] = [];\n let i = 0;\n let pos = 0;\n while (i < text.length) {\n while (i < text.length && !isAsciiTokenChar(text[i]!, extraToken, extraSep)) i++;\n if (i >= text.length) break;\n const startUnit = i;\n while (i < text.length && isAsciiTokenChar(text[i]!, extraToken, extraSep)) i++;\n const raw = text.slice(startUnit, i);\n const term = raw.toLowerCase();\n if (term.length === 0) continue;\n tokens.push({\n term,\n start: utf8Offset(text, startUnit),\n length: utf8Length(raw),\n position: pos++,\n startUnit,\n endUnit: i,\n });\n }\n return tokens;\n };\n}\n\nfunction createUnicode61Tokenizer(config: FtsTokenizerConfig): TokenizerFn {\n const removeDiacritics = config.removeDiacritics ?? 1;\n const extraToken = new Set([...(config.tokenchars ?? \"\")].map((c) => c));\n const extraSep = new Set([...(config.separators ?? \"\")].map((c) => c));\n return (text: string) => {\n const tokens: FtsToken[] = [];\n let i = 0;\n let pos = 0;\n while (i < text.length) {\n while (i < text.length && !isUnicodeTokenChar(text[i]!, extraToken, extraSep)) i++;\n if (i >= text.length) break;\n const startUnit = i;\n while (i < text.length && isUnicodeTokenChar(text[i]!, extraToken, extraSep)) i++;\n let raw = text.slice(startUnit, i);\n if (removeDiacritics > 0) raw = stripDiacritics(raw, removeDiacritics);\n const term = raw.toLowerCase();\n if (term.length === 0) continue;\n tokens.push({\n term,\n start: utf8Offset(text, startUnit),\n length: utf8Length(text.slice(startUnit, i)),\n position: pos++,\n startUnit,\n endUnit: i,\n });\n }\n return tokens;\n };\n}\n\nfunction createTrigramTokenizer(config: FtsTokenizerConfig): TokenizerFn {\n const caseSensitive = config.caseSensitive ?? false;\n const removeDia = config.removeDiacriticsTrigram ?? false;\n return (text: string) => {\n let source = text;\n if (removeDia) source = stripDiacritics(source, 1);\n if (!caseSensitive) source = source.toLowerCase();\n const tokens: FtsToken[] = [];\n if (source.length < 3) return tokens;\n let pos = 0;\n for (let i = 0; i <= source.length - 3; i++) {\n const term = source.slice(i, i + 3);\n tokens.push({\n term,\n start: utf8Offset(source, i),\n length: utf8Length(term),\n position: pos++,\n startUnit: i,\n endUnit: i + 3,\n });\n }\n return tokens;\n };\n}\n\nfunction isAsciiTokenChar(ch: string, extraToken: Set<string>, extraSep: Set<string>): boolean {\n if (extraSep.has(ch)) return false;\n if (extraToken.has(ch)) return true;\n const code = ch.charCodeAt(0);\n if (code > 127) return false;\n return (code >= 48 && code <= 57) || (code >= 65 && code <= 90) || (code >= 97 && code <= 122);\n}\n\nfunction isUnicodeTokenChar(ch: string, extraToken: Set<string>, extraSep: Set<string>): boolean {\n if (extraSep.has(ch)) return false;\n if (extraToken.has(ch)) return true;\n // Letters, marks (combining), numbers \u2014 exclude punctuation/symbols/emoji\n return /\\p{L}|\\p{M}|\\p{N}/u.test(ch);\n}\n\nfunction stripDiacritics(text: string, mode: 0 | 1 | 2): string {\n if (mode === 0) return text;\n // NFD then strip combining marks. Mode 2 also folds a few special cases similarly.\n const normalized = text.normalize(\"NFD\");\n let out = \"\";\n for (const ch of normalized) {\n if (/\\p{M}/u.test(ch)) continue;\n out += ch;\n }\n return out;\n}\n\nexport function utf8Length(text: string): number {\n return new TextEncoder().encode(text).length;\n}\n\nexport function utf8Offset(text: string, unitIndex: number): number {\n return new TextEncoder().encode(text.slice(0, unitIndex)).length;\n}\n\n/** Legacy helper used by older call sites \u2014 simple alphanum split. */\nexport function tokenizeFtsText(text: string): string[] {\n return createUnicode61Tokenizer({ name: \"unicode61\", removeDiacritics: 1 })(text).map((t) => t.term);\n}\n", "import { SqliteError } from \"../../errors/index.ts\";\nimport type { Rowid } from \"../../storage/row.ts\";\nimport type { SqlValue } from \"../../types/value.ts\";\nimport { type FtsKind, type FtsTableOptions, parseFtsModuleArgs } from \"./options.ts\";\nimport { type FtsQueryNode, parseFts3Query, parseFts5Query } from \"./query.ts\";\nimport { createTokenizer, type FtsToken, type TokenizerFn, tokenizeFtsText } from \"./tokenize.ts\";\n\nexport interface Fts5Row {\n rowid: Rowid;\n values: Map<string, SqlValue>;\n /** Per-column tokens with positions. */\n tokensByColumn: Map<string, FtsToken[]>;\n}\n\nexport interface FtsMatchHit {\n column: string;\n position: number;\n startUnit: number;\n endUnit: number;\n term: string;\n}\n\nexport interface FtsMatchCursor {\n tableName: string;\n rowid: Rowid;\n query: string;\n ast: FtsQueryNode;\n hits: FtsMatchHit[];\n /** Phrase term strings used for ranking (flattened). */\n phraseTerms: string[][];\n}\n\ninterface Posting {\n rowid: Rowid;\n column: string;\n position: number;\n startUnit: number;\n endUnit: number;\n}\n\nexport class Fts5VirtualTable {\n readonly kind: FtsKind;\n readonly name: string;\n readonly columns: string[];\n readonly originalSql: string | null;\n readonly options: FtsTableOptions;\n readonly rows = new Map<Rowid, Fts5Row>();\n nextRowid: Rowid = 1;\n private readonly tokenize: TokenizerFn;\n /** term -> postings */\n private readonly index = new Map<string, Posting[]>();\n /** Global doc count for bm25. */\n private docCount = 0;\n /** Average document length (tokens across indexed columns). */\n private avgDocLen = 0;\n private totalTokens = 0;\n\n constructor(name: string, moduleArgs: string[], originalSql: string | null = null, kind: FtsKind = \"fts5\") {\n this.kind = kind;\n this.name = name;\n this.originalSql = originalSql;\n this.options = parseFtsModuleArgs(moduleArgs, kind);\n this.columns = this.options.columns.map((c) => c.name);\n if (this.columns.length === 0) throw new SqliteError(\"fts requires at least one column\", \"other\");\n this.tokenize = createTokenizer(this.options.tokenizer);\n }\n\n scan(): Fts5Row[] {\n return [...this.rows.values()];\n }\n\n insert(values: Map<string, SqlValue>, rowid?: Rowid): Rowid {\n // Special command: INSERT INTO t(t) VALUES('optimize') etc.\n const command = this.detectCommand(values);\n if (command !== null) {\n this.runCommand(command, values);\n // Match SQLite: special commands report lastInsertRowid 0\n return 0;\n }\n\n const assigned = rowid ?? this.nextRowid++;\n if (this.rows.has(assigned)) throw new SqliteError(\"PRIMARY KEY constraint failed\", \"constraint_primary\");\n const row = this.buildRow(assigned, values);\n this.rows.set(assigned, row);\n this.indexRow(row);\n this.bumpRowid(assigned);\n return assigned;\n }\n\n update(rowid: Rowid, updates: Map<string, SqlValue>): void {\n const row = this.rows.get(rowid);\n if (!row) return;\n this.unindexRow(row);\n const values = new Map(row.values);\n for (const [key, value] of updates) values.set(key, value);\n const next = this.buildRow(rowid, values);\n this.rows.set(rowid, next);\n this.indexRow(next);\n }\n\n delete(rowid: Rowid): void {\n const row = this.rows.get(rowid);\n if (!row) return;\n this.unindexRow(row);\n this.rows.delete(rowid);\n }\n\n matches(rowid: Rowid, leftTable: string | null, leftColumn: string, query: string): boolean {\n const cursor = this.matchCursor(rowid, leftTable, leftColumn, query);\n return cursor !== null;\n }\n\n matchCursor(rowid: Rowid, leftTable: string | null, leftColumn: string, query: string): FtsMatchCursor | null {\n const row = this.rows.get(rowid);\n if (!row) return null;\n const ast = this.kind === \"fts5\" ? parseFts5Query(query) : parseFts3Query(query);\n const columnLower = leftColumn.toLowerCase();\n const tableLower = this.name.toLowerCase();\n const leftTableLower = leftTable?.toLowerCase() ?? null;\n // Column-restricted MATCH (content MATCH 'x') limits default columns\n let defaultColumns = this.indexedColumns();\n if (columnLower !== tableLower && !(leftTableLower !== null && columnLower === leftTableLower)) {\n const matched = this.columns.find((c) => c.toLowerCase() === columnLower);\n if (matched) defaultColumns = [matched];\n else return null;\n }\n const hits: FtsMatchHit[] = [];\n const ok = this.evalNode(ast, row, defaultColumns, hits);\n if (!ok) return null;\n return {\n tableName: this.name,\n rowid,\n query,\n ast,\n hits,\n phraseTerms: collectPhraseTerms(ast),\n };\n }\n\n bm25(cursor: FtsMatchCursor, weights?: number[]): number {\n const row = this.rows.get(cursor.rowid);\n if (!row) return -0;\n const phrases = cursor.phraseTerms.length > 0 ? cursor.phraseTerms : [];\n if (phrases.length === 0) return -0;\n const cols = this.indexedColumns();\n const w = cols.map((_, i) => weights?.[i] ?? 1);\n const k1 = 1.2;\n const b = 0.75;\n const N = Math.max(1, this.docCount);\n const avgdl = Math.max(1e-9, this.avgDocLen);\n let score = 0;\n const D = this.docLength(row);\n\n for (let pi = 0; pi < phrases.length; pi++) {\n const phrase = phrases[pi]!;\n // Phrase frequency: weighted count of phrase occurrences across columns\n let freq = 0;\n for (let ci = 0; ci < cols.length; ci++) {\n const col = cols[ci]!;\n const n = this.phraseFreq(row, col, phrase);\n freq += (w[ci] ?? 1) * n;\n }\n if (freq === 0) continue;\n const df = this.phraseDocFreq(phrase);\n // SQLite FTS5: IDF = log((N - nHit + 0.5) / (nHit + 0.5)); floor at 1e-6\n let idf = Math.log((N - df + 0.5) / (df + 0.5));\n if (idf <= 0) idf = 1e-6;\n score += idf * ((freq * (k1 + 1)) / (freq + k1 * (1 - b + (b * D) / avgdl)));\n }\n return score === 0 ? -0 : -score;\n }\n\n highlight(cursor: FtsMatchCursor, colIndex: number, open: string, close: string): string {\n const row = this.rows.get(cursor.rowid);\n if (!row) return \"\";\n const col = this.columns[colIndex];\n if (!col) return \"\";\n const text = valueToText(row.values.get(col.toLowerCase()) ?? null);\n if (this.options.content === \"contentless\") return text;\n const hits = cursor.hits\n .filter((h) => h.column.toLowerCase() === col.toLowerCase())\n .sort((a, b) => a.startUnit - b.startUnit);\n if (hits.length === 0) return text;\n let out = \"\";\n let at = 0;\n for (const hit of mergeHits(hits)) {\n out += text.slice(at, hit.startUnit);\n out += open + text.slice(hit.startUnit, hit.endUnit) + close;\n at = hit.endUnit;\n }\n out += text.slice(at);\n return out;\n }\n\n snippet(\n cursor: FtsMatchCursor,\n colIndex: number,\n open: string,\n close: string,\n ellipsis: string,\n tokenCount: number,\n ): string {\n const row = this.rows.get(cursor.rowid);\n if (!row) return \"\";\n const col = this.columns[colIndex];\n if (!col) return \"\";\n const text = valueToText(row.values.get(col.toLowerCase()) ?? null);\n const tokens = row.tokensByColumn.get(col.toLowerCase()) ?? [];\n const hitPositions = new Set(\n cursor.hits.filter((h) => h.column.toLowerCase() === col.toLowerCase()).map((h) => h.position),\n );\n if (tokens.length === 0 || hitPositions.size === 0) return text;\n const firstHit = Math.min(...hitPositions);\n const window = Math.max(1, tokenCount);\n const startPos = Math.max(0, firstHit - Math.floor(window / 4));\n const endPos = Math.min(tokens.length - 1, startPos + window - 1);\n const startUnit = tokens[startPos]!.startUnit;\n const endUnit = tokens[endPos]!.endUnit;\n const slice = text.slice(startUnit, endUnit);\n // Re-highlight within slice\n const localHits = cursor.hits\n .filter((h) => h.column.toLowerCase() === col.toLowerCase() && h.startUnit >= startUnit && h.endUnit <= endUnit)\n .map((h) => ({ ...h, startUnit: h.startUnit - startUnit, endUnit: h.endUnit - startUnit }));\n let out = \"\";\n let at = 0;\n for (const hit of mergeHits(localHits)) {\n out += slice.slice(at, hit.startUnit);\n out += open + slice.slice(hit.startUnit, hit.endUnit) + close;\n at = hit.endUnit;\n }\n out += slice.slice(at);\n if (startPos > 0) out = ellipsis + out;\n if (endPos < tokens.length - 1) out = out + ellipsis;\n return out;\n }\n\n /** FTS3/4 offsets(): \"col phrase start length ...\" */\n offsets(cursor: FtsMatchCursor): string {\n const row = this.rows.get(cursor.rowid);\n if (!row) return \"\";\n const parts: string[] = [];\n for (const hit of cursor.hits) {\n const colIndex = this.columns.findIndex((c) => c.toLowerCase() === hit.column.toLowerCase());\n const text = valueToText(row.values.get(hit.column.toLowerCase()) ?? null);\n const start = utf8OffsetLocal(text, hit.startUnit);\n const length = utf8OffsetLocal(text, hit.endUnit) - start;\n parts.push(String(colIndex), \"0\", String(start), String(length));\n }\n return parts.join(\" \");\n }\n\n /** FTS3 matchinfo default format 'pcx' simplified \u2192 blob of 32-bit LE ints. */\n matchinfo(cursor: FtsMatchCursor, _format = \"pcx\"): Uint8Array {\n const row = this.rows.get(cursor.rowid);\n const nPhrase = Math.max(1, cursor.phraseTerms.length);\n const nCol = this.columns.length;\n const values: number[] = [nPhrase, nCol];\n // hits for phrase 0 col 0 roughly\n for (let p = 0; p < nPhrase; p++) {\n for (let c = 0; c < nCol; c++) {\n const col = this.columns[c]!;\n const term = cursor.phraseTerms[p]?.[0] ?? \"\";\n const tf = row ? this.termFreq(row, col, term) : 0;\n values.push(tf);\n }\n }\n const buf = new Uint8Array(values.length * 4);\n const view = new DataView(buf.buffer);\n for (let i = 0; i < values.length; i++) view.setUint32(i * 4, values[i]! >>> 0, true);\n return buf;\n }\n\n vocabRows(mode: \"row\" | \"col\" | \"instance\"): Array<Record<string, SqlValue>> {\n if (mode === \"row\") {\n const out: Array<Record<string, SqlValue>> = [];\n for (const [term, postings] of [...this.index.entries()].sort((a, b) => (a[0] < b[0] ? -1 : 1))) {\n const docs = new Set(postings.map((p) => String(p.rowid)));\n out.push({ term, doc: docs.size, cnt: postings.length });\n }\n return out;\n }\n // col / instance simplified to row shape\n return this.vocabRows(\"row\");\n }\n\n clone(): Fts5VirtualTable {\n const copy = new Fts5VirtualTable(\n this.name,\n this.options.columns.map((c) => (c.unindexed ? `${c.name} UNINDEXED` : c.name)),\n this.originalSql,\n this.kind,\n );\n // Re-parse options by reconstructing module args is imperfect; copy fields\n Object.assign(copy, {\n options: structuredClone(this.options),\n columns: [...this.columns],\n });\n (copy as unknown as { tokenize: TokenizerFn }).tokenize = this.tokenize;\n copy.nextRowid = this.nextRowid;\n for (const [rowid, row] of this.rows) {\n const cloned: Fts5Row = {\n rowid: row.rowid,\n values: new Map(row.values),\n tokensByColumn: new Map([...row.tokensByColumn.entries()].map(([k, v]) => [k, v.map((t) => ({ ...t }))])),\n };\n copy.rows.set(rowid, cloned);\n copy.indexRow(cloned);\n }\n return copy;\n }\n\n private detectCommand(values: Map<string, SqlValue>): string | null {\n // INSERT INTO t(t) VALUES('optimize') \u2014 column name equals table name\n const key = this.name.toLowerCase();\n if (!values.has(key)) return null;\n const v = values.get(key);\n if (typeof v !== \"string\") return null;\n // Command inserts typically only supply the table-name column\n const otherContent = [...values.entries()].some(\n ([k, val]) => k !== key && val !== null && this.columns.some((c) => c.toLowerCase() === k),\n );\n if (otherContent) return null;\n return v;\n }\n\n private runCommand(command: string, _values: Map<string, SqlValue>): void {\n const cmd = command.toLowerCase();\n if (cmd === \"optimize\") return;\n if (cmd === \"rebuild\") {\n this.rebuild();\n return;\n }\n if (cmd === \"integrity-check\") return;\n if (cmd === \"delete-all\") {\n if (this.options.content === \"normal\") {\n throw new SqliteError(\n \"'delete-all' may only be used with a contentless or external content fts5 table\",\n \"other\",\n );\n }\n for (const rowid of [...this.rows.keys()]) this.delete(rowid);\n return;\n }\n if (cmd.startsWith(\"merge=\") || cmd.startsWith(\"automerge=\")) {\n throw new SqliteError(\"SQL logic error\", \"other\");\n }\n if (cmd === \"delete\") {\n // delete by rowid via other columns \u2014 handled elsewhere\n return;\n }\n // Unknown command string may be treated as content insert into table-named column \u2014 ignore as no-op command fail\n throw new SqliteError(\"SQL logic error\", \"other\");\n }\n\n private rebuild(): void {\n this.index.clear();\n this.docCount = 0;\n this.totalTokens = 0;\n this.avgDocLen = 0;\n for (const row of this.rows.values()) this.indexRow(row);\n }\n\n private buildRow(rowid: Rowid, values: Map<string, SqlValue>): Fts5Row {\n const stored = new Map<string, SqlValue>();\n const tokensByColumn = new Map<string, FtsToken[]>();\n for (const column of this.columns) {\n const key = column.toLowerCase();\n const value = values.get(key) ?? null;\n if (this.options.content === \"contentless\") {\n // Contentless stores index only; user-visible content columns are NULL\n stored.set(key, null);\n const text = valueToText(value);\n const colDef = this.options.columns.find((c) => c.name.toLowerCase() === key);\n tokensByColumn.set(key, colDef?.unindexed ? [] : this.tokenize(text));\n continue;\n }\n stored.set(key, value);\n const colDef = this.options.columns.find((c) => c.name.toLowerCase() === key);\n tokensByColumn.set(key, colDef?.unindexed ? [] : this.tokenize(valueToText(value)));\n }\n return { rowid, values: stored, tokensByColumn };\n }\n\n private indexRow(row: Fts5Row): void {\n let tokenCount = 0;\n for (const [col, tokens] of row.tokensByColumn) {\n for (const token of tokens) {\n tokenCount++;\n this.addPosting(token.term, {\n rowid: row.rowid,\n column: col,\n position: token.position,\n startUnit: token.startUnit,\n endUnit: token.endUnit,\n });\n for (const n of this.options.prefix) {\n if (token.term.length >= n) {\n const pref = `${token.term.slice(0, n)}*`;\n // prefix index entries are optimization only \u2014 queries still work via scan\n void pref;\n }\n }\n }\n }\n this.docCount++;\n this.totalTokens += tokenCount;\n this.avgDocLen = this.totalTokens / Math.max(1, this.docCount);\n }\n\n private unindexRow(row: Fts5Row): void {\n let tokenCount = 0;\n for (const [col, tokens] of row.tokensByColumn) {\n for (const token of tokens) {\n tokenCount++;\n this.removePosting(token.term, row.rowid, col, token.position);\n }\n }\n this.docCount = Math.max(0, this.docCount - 1);\n this.totalTokens = Math.max(0, this.totalTokens - tokenCount);\n this.avgDocLen = this.totalTokens / Math.max(1, this.docCount);\n }\n\n private addPosting(term: string, posting: Posting): void {\n const key = term.toLowerCase();\n const list = this.index.get(key);\n if (list) list.push(posting);\n else this.index.set(key, [posting]);\n }\n\n private removePosting(term: string, rowid: Rowid, column: string, position: number): void {\n const key = term.toLowerCase();\n const list = this.index.get(key);\n if (!list) return;\n const next = list.filter((p) => !(p.rowid === rowid && p.column === column && p.position === position));\n if (next.length === 0) this.index.delete(key);\n else this.index.set(key, next);\n }\n\n private indexedColumns(): string[] {\n return this.options.columns.filter((c) => !c.unindexed).map((c) => c.name);\n }\n\n private evalNode(node: FtsQueryNode, row: Fts5Row, defaultColumns: string[], hits: FtsMatchHit[]): boolean {\n switch (node.type) {\n case \"true\":\n return true;\n case \"and\":\n return node.children.every((child) => this.evalNode(child, row, defaultColumns, hits));\n case \"or\": {\n // Collect hits from matching branch only\n for (const child of node.children) {\n const local: FtsMatchHit[] = [];\n if (this.evalNode(child, row, defaultColumns, local)) {\n hits.push(...local);\n return true;\n }\n }\n return false;\n }\n case \"not\": {\n const local: FtsMatchHit[] = [];\n return !this.evalNode(node.child, row, defaultColumns, local);\n }\n case \"term\": {\n const expanded = this.expandTermNode(node);\n if (expanded.type !== \"term\") return this.evalNode(expanded, row, defaultColumns, hits);\n const cols = resolveColumns(node.column, node.columns, defaultColumns, this.columns);\n const needle = this.normalizeQueryTerm(node.value);\n let found = false;\n for (const col of cols) {\n const tokens = row.tokensByColumn.get(col.toLowerCase()) ?? [];\n for (const token of tokens) {\n if (node.prefix ? token.term.startsWith(needle) : token.term === needle) {\n hits.push({\n column: col,\n position: token.position,\n startUnit: token.startUnit,\n endUnit: token.endUnit,\n term: token.term,\n });\n found = true;\n }\n }\n }\n return found;\n }\n case \"phrase\": {\n const cols = resolveColumns(node.column, node.columns, defaultColumns, this.columns);\n let found = false;\n for (const col of cols) {\n const tokens = row.tokensByColumn.get(col.toLowerCase()) ?? [];\n const terms = node.terms.map((t) => ({\n value: this.normalizeQueryTerm(t.value),\n prefix: t.prefix,\n }));\n for (let i = 0; i <= tokens.length - terms.length; i++) {\n let ok = true;\n for (let j = 0; j < terms.length; j++) {\n const tok = tokens[i + j]!;\n const term = terms[j]!;\n if (term.prefix ? !tok.term.startsWith(term.value) : tok.term !== term.value) {\n ok = false;\n break;\n }\n }\n if (ok) {\n found = true;\n for (let j = 0; j < terms.length; j++) {\n const tok = tokens[i + j]!;\n hits.push({\n column: col,\n position: tok.position,\n startUnit: tok.startUnit,\n endUnit: tok.endUnit,\n term: tok.term,\n });\n }\n }\n }\n }\n return found;\n }\n case \"near\": {\n const cols = resolveColumns(node.column, node.columns, defaultColumns, this.columns);\n // Evaluate each child to position sets per column\n for (const col of cols) {\n const posSets: number[][] = [];\n let allOk = true;\n for (const child of node.children) {\n const local: FtsMatchHit[] = [];\n if (!this.evalNode(child, row, [col], local)) {\n allOk = false;\n break;\n }\n posSets.push(local.filter((h) => h.column.toLowerCase() === col.toLowerCase()).map((h) => h.position));\n }\n if (!allOk) continue;\n if (nearMatch(posSets, node.distance)) {\n // re-collect hits\n for (const child of node.children) this.evalNode(child, row, [col], hits);\n return true;\n }\n }\n return false;\n }\n }\n }\n\n private normalizeQueryTerm(term: string): string {\n // Query terms are tokenized with the same tokenizer when possible\n const tokens = this.tokenize(term);\n if (tokens.length === 1) return tokens[0]!.term;\n if (tokens.length === 0) return term.toLowerCase();\n // Trigram (and multi-token) queries: join is wrong for matching \u2014 use first only for df;\n // phrase matching uses tokenize() directly via evalNode.\n return tokens[0]!.term;\n }\n\n /** For trigram tokenizer, a bare MATCH term is a phrase of overlapping trigrams. */\n private expandTermNode(node: Extract<FtsQueryNode, { type: \"term\" }>): FtsQueryNode {\n if (this.options.tokenizer.name !== \"trigram\") return node;\n const tokens = this.tokenize(node.value);\n if (tokens.length <= 1) return node;\n return {\n type: \"phrase\",\n terms: tokens.map((t) => ({ value: t.term, prefix: false })),\n column: node.column,\n columns: node.columns,\n };\n }\n\n private phraseFreq(row: Fts5Row, column: string, phrase: string[]): number {\n if (phrase.length === 0) return 0;\n const tokens = row.tokensByColumn.get(column.toLowerCase()) ?? [];\n const terms = phrase.map((t) => this.normalizeQueryTerm(t));\n let count = 0;\n for (let i = 0; i <= tokens.length - terms.length; i++) {\n let ok = true;\n for (let j = 0; j < terms.length; j++) {\n if (tokens[i + j]!.term !== terms[j]) {\n ok = false;\n break;\n }\n }\n if (ok) count++;\n }\n return count;\n }\n\n private phraseDocFreq(phrase: string[]): number {\n let n = 0;\n for (const row of this.rows.values()) {\n for (const col of this.indexedColumns()) {\n if (this.phraseFreq(row, col, phrase) > 0) {\n n++;\n break;\n }\n }\n }\n return n;\n }\n\n private termFreq(row: Fts5Row, column: string, term: string): number {\n const needle = this.normalizeQueryTerm(term);\n const tokens = row.tokensByColumn.get(column.toLowerCase()) ?? [];\n return tokens.filter((t) => t.term === needle || t.term.startsWith(needle)).length;\n }\n\n private docLength(row: Fts5Row): number {\n let n = 0;\n for (const col of this.indexedColumns()) n += (row.tokensByColumn.get(col.toLowerCase()) ?? []).length;\n return Math.max(1, n);\n }\n\n private bumpRowid(assigned: Rowid): void {\n if (typeof assigned === \"bigint\") {\n if (assigned >= BigInt(this.nextRowid as number | bigint)) this.nextRowid = assigned + 1n;\n } else if (assigned >= (typeof this.nextRowid === \"number\" ? this.nextRowid : Number(this.nextRowid))) {\n this.nextRowid = assigned + 1;\n }\n }\n}\n\nfunction resolveColumns(\n column: string | null,\n columns: string[] | null,\n defaultColumns: string[],\n allColumns: string[],\n): string[] {\n if (columns && columns.length > 0) {\n return columns\n .map((c) => allColumns.find((x) => x.toLowerCase() === c.toLowerCase()))\n .filter((c): c is string => !!c);\n }\n if (column) {\n const matched = allColumns.find((c) => c.toLowerCase() === column.toLowerCase());\n return matched ? [matched] : [];\n }\n return defaultColumns;\n}\n\nfunction nearMatch(posSets: number[][], distance: number): boolean {\n if (posSets.length === 0) return false;\n if (posSets.length === 1) return posSets[0]!.length > 0;\n // Check if there exists a combination where max-min <= distance + (n-1) roughly (FTS5 NEAR)\n // FTS5: NEAR(a b, N) means the terms are within N tokens of each other.\n const first = posSets[0]!;\n for (const p0 of first) {\n if (nearFrom(p0, posSets.slice(1), distance)) return true;\n }\n return false;\n}\n\nfunction nearFrom(anchor: number, rest: number[][], distance: number): boolean {\n if (rest.length === 0) return true;\n const next = rest[0]!;\n for (const p of next) {\n if (Math.abs(p - anchor) <= distance) {\n if (nearFrom(p, rest.slice(1), distance)) return true;\n }\n }\n return false;\n}\n\nfunction collectPhraseTerms(node: FtsQueryNode): string[][] {\n switch (node.type) {\n case \"term\":\n return [[node.value]];\n case \"phrase\":\n return [node.terms.map((t) => t.value)];\n case \"and\":\n case \"or\":\n case \"near\":\n return node.children.flatMap(collectPhraseTerms);\n case \"not\":\n return [];\n case \"true\":\n return [];\n }\n}\n\nfunction mergeHits(hits: FtsMatchHit[]): FtsMatchHit[] {\n if (hits.length === 0) return [];\n const sorted = [...hits].sort((a, b) => a.startUnit - b.startUnit);\n const out: FtsMatchHit[] = [{ ...sorted[0]! }];\n for (let i = 1; i < sorted.length; i++) {\n const cur = sorted[i]!;\n const last = out[out.length - 1]!;\n if (cur.startUnit <= last.endUnit) last.endUnit = Math.max(last.endUnit, cur.endUnit);\n else out.push({ ...cur });\n }\n return out;\n}\n\nfunction valueToText(value: SqlValue): string {\n if (value === null) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n return \"\";\n}\n\nfunction utf8OffsetLocal(text: string, unitIndex: number): number {\n return new TextEncoder().encode(text.slice(0, unitIndex)).length;\n}\n\nexport { tokenizeFtsText };\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport interface RTreeRow {\n id: number | bigint;\n coords: number[];\n}\n\n/**\n * Simplified R*Tree for SQLite rtree / rtree_i32 modules.\n * Stores axis-aligned boxes; queries filter by bound inequalities in WHERE.\n */\nexport class RTreeVirtualTable {\n readonly kind = \"rtree\" as const;\n readonly name: string;\n readonly columns: string[];\n readonly dimension: number;\n readonly integerCoords: boolean;\n readonly originalSql: string | null;\n readonly rows = new Map<string, RTreeRow>();\n /** Shadow node table content for rtreenode/rtreedepth. */\n readonly nodes = new Map<number, Uint8Array>();\n\n constructor(name: string, columns: string[], integerCoords = false, originalSql: string | null = null) {\n if (columns.length < 3 || columns.length % 2 === 0) {\n throw new SqliteError(\"rtree tables must have an odd number of columns >= 3\", \"other\");\n }\n this.name = name;\n this.columns = columns;\n this.dimension = (columns.length - 1) / 2;\n this.integerCoords = integerCoords;\n this.originalSql = originalSql;\n this.nodes.set(1, new Uint8Array([0]));\n }\n\n scan(): Array<{ rowid: Rowid; values: Map<string, SqlValue> }> {\n return [...this.rows.values()].map((row) => {\n const values = new Map<string, SqlValue>();\n values.set(this.columns[0]!.toLowerCase(), row.id);\n for (let i = 0; i < row.coords.length; i++) {\n values.set(this.columns[i + 1]!.toLowerCase(), row.coords[i]!);\n }\n return { rowid: row.id, values };\n });\n }\n\n insert(values: Map<string, SqlValue>): Rowid {\n const idVal = values.get(this.columns[0]!.toLowerCase());\n if (idVal === null || idVal === undefined) {\n throw new SqliteError(\"rtree id must not be NULL\", \"constraint_notnull\");\n }\n const id = typeof idVal === \"bigint\" ? idVal : Math.trunc(Number(idVal));\n const key = String(id);\n if (this.rows.has(key)) throw new SqliteError(\"UNIQUE constraint failed\", \"constraint_unique\");\n const coords: number[] = [];\n for (let i = 1; i < this.columns.length; i++) {\n const raw = values.get(this.columns[i]!.toLowerCase()) ?? null;\n if (raw === null) throw new SqliteError(\"rtree coordinate must not be NULL\", \"constraint_notnull\");\n let n = Number(raw);\n if (this.integerCoords) n = Math.trunc(n);\n coords.push(n);\n }\n this.rows.set(key, { id, coords });\n return id;\n }\n\n update(rowid: Rowid, updates: Map<string, SqlValue>): void {\n const key = String(rowid);\n const existing = this.rows.get(key);\n if (!existing) return;\n const values = new Map<string, SqlValue>();\n values.set(this.columns[0]!.toLowerCase(), existing.id);\n for (let i = 0; i < existing.coords.length; i++) {\n values.set(this.columns[i + 1]!.toLowerCase(), existing.coords[i]!);\n }\n for (const [k, v] of updates) values.set(k, v);\n this.rows.delete(key);\n this.insert(values);\n }\n\n delete(rowid: Rowid): void {\n this.rows.delete(String(rowid));\n }\n\n clone(): RTreeVirtualTable {\n const copy = new RTreeVirtualTable(this.name, this.columns, this.integerCoords, this.originalSql);\n for (const [k, row] of this.rows) copy.rows.set(k, { id: row.id, coords: [...row.coords] });\n for (const [k, v] of this.nodes) copy.nodes.set(k, new Uint8Array(v));\n return copy;\n }\n}\n\nexport class DbStatVirtualTable {\n readonly kind = \"dbstat\" as const;\n readonly name: string;\n readonly columns = [\n \"name\",\n \"path\",\n \"pageno\",\n \"pagetype\",\n \"ncell\",\n \"payload\",\n \"unused\",\n \"mx_payload\",\n \"pgoffset\",\n \"pgsize\",\n ];\n readonly originalSql: string | null;\n readonly schemaArg: string | null;\n\n constructor(name: string, schemaArg: string | null = null, originalSql: string | null = null) {\n this.name = name;\n this.schemaArg = schemaArg;\n this.originalSql = originalSql;\n }\n\n clone(): DbStatVirtualTable {\n return new DbStatVirtualTable(this.name, this.schemaArg, this.originalSql);\n }\n}\n\nexport class BytecodeVirtualTable {\n readonly kind = \"bytecode\" as const;\n readonly name: string;\n readonly columns = [\"addr\", \"opcode\", \"p1\", \"p2\", \"p3\", \"p4\", \"p5\", \"comment\", \"subprog\"];\n readonly originalSql: string | null;\n\n constructor(name: string, originalSql: string | null = null) {\n this.name = name;\n this.originalSql = originalSql;\n }\n\n clone(): BytecodeVirtualTable {\n return new BytecodeVirtualTable(this.name, this.originalSql);\n }\n}\n\nexport class TablesUsedVirtualTable {\n readonly kind = \"tables_used\" as const;\n readonly name: string;\n readonly columns = [\"type\", \"schema\", \"name\"];\n readonly originalSql: string | null;\n\n constructor(name: string, originalSql: string | null = null) {\n this.name = name;\n this.originalSql = originalSql;\n }\n\n clone(): TablesUsedVirtualTable {\n return new TablesUsedVirtualTable(this.name, this.originalSql);\n }\n}\n\nexport class FtsVocabVirtualTable {\n readonly kind = \"fts5vocab\" as const;\n readonly name: string;\n readonly columns: string[];\n readonly ftsTable: string;\n readonly vocabType: string;\n readonly originalSql: string | null;\n\n constructor(name: string, args: string[], originalSql: string | null = null) {\n if (args.length < 1) throw new SqliteError(\"fts5vocab requires an fts5 table name\", \"other\");\n this.name = name;\n this.ftsTable = args[0]!;\n this.vocabType = (args[1] ?? \"row\").replace(/'/g, \"\").toLowerCase();\n this.columns =\n this.vocabType === \"col\"\n ? [\"term\", \"col\", \"doc\", \"cnt\"]\n : this.vocabType === \"instance\"\n ? [\"term\", \"doc\", \"col\", \"offset\"]\n : [\"term\", \"doc\", \"cnt\"];\n this.originalSql = originalSql;\n }\n\n clone(): FtsVocabVirtualTable {\n return new FtsVocabVirtualTable(this.name, [this.ftsTable, this.vocabType], this.originalSql);\n }\n}\n", "import type { SqlValue } from \"../types/value.ts\";\nimport { cloneSqlValue } from \"../types/value.ts\";\n\nexport type Rowid = number | bigint;\n\nexport interface Row {\n rowid: Rowid;\n values: Map<string, SqlValue>;\n}\n\nexport type RowValues = Map<string, SqlValue> | ReadonlyMap<string, SqlValue> | Record<string, SqlValue>;\n\nexport function normalizeColumnName(name: string): string {\n return name.toLowerCase();\n}\n\nexport function rowValues(values: RowValues): Map<string, SqlValue> {\n const result = new Map<string, SqlValue>();\n const entries = values instanceof Map ? values.entries() : Object.entries(values);\n for (const [name, value] of entries) {\n result.set(normalizeColumnName(name), value);\n }\n return result;\n}\n\nexport function cloneRow(row: Row): Row {\n const values = new Map<string, SqlValue>();\n for (const [name, value] of row.values) {\n values.set(name, cloneSqlValue(value));\n }\n return { rowid: row.rowid, values };\n}\n", "import type { Expr, TableConstraint } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { serializeIndexKey } from \"../indexes/index.ts\";\nimport { compareWithCollation, normalizeForCollation } from \"../types/collation.ts\";\nimport { applyStrictValue } from \"../types/strict.ts\";\nimport type { Affinity, SqlValue } from \"../types/value.ts\";\nimport { affinityFromTypeName, applyAffinity, cloneSqlValue, compareSql } from \"../types/value.ts\";\nimport type { Row, Rowid, RowValues } from \"./row.ts\";\nimport { cloneRow, normalizeColumnName, rowValues } from \"./row.ts\";\n\n/** Build a covering equality hash once a table is large enough that scans dominate. */\nconst EQUALITY_HASH_MIN_ROWS = 16;\n\nexport interface ColumnInfo {\n name: string;\n /** Cached `name.toLowerCase()` for hot-path lookups. */\n nameLower?: string;\n typeName: string | null;\n affinity: Affinity;\n notNull: boolean;\n primaryKey: boolean;\n autoincrement: boolean;\n defaultExpr: Expr | null;\n unique: boolean;\n /** Declared column collation (BINARY/NOCASE/RTRIM); null means BINARY. */\n collate: string | null;\n /** GENERATED ALWAYS AS (...) \u2014 VIRTUAL computed on read, STORED materialized. */\n generated: { expr: Expr; stored: boolean } | null;\n}\n\nexport interface InsertOptions {\n /** Values are already affinity-applied Maps with lowercase keys; skip prepareValues. */\n prepared?: boolean;\n /** Skip NOT NULL / UNIQUE / PK scans (caller already enforced, or table is unconstrained). */\n skipValidate?: boolean;\n}\n\nexport interface InsertRow {\n rowid?: Rowid;\n values: RowValues;\n}\n\nexport interface TableOptions {\n constraints?: TableConstraint[];\n indexes?: string[];\n originalSql?: string | null;\n withoutRowid?: boolean;\n strict?: boolean;\n}\n\nexport class Table {\n name: string;\n columns: ColumnInfo[];\n rows: Map<Rowid, Row>;\n nextRowid: Rowid;\n constraints: TableConstraint[];\n indexes: string[];\n originalSql: string | null;\n withoutRowid: boolean;\n strict: boolean;\n /** Clustered PK key string \u2192 row for WITHOUT ROWID tables. */\n clusteredRows: Map<string, Row>;\n private scanCache: Row[] | null = null;\n /** Lazy covering hashes: column nameLower \u2192 serializeIndexKey \u2192 rowids. */\n private equalityHashes: Map<string, Map<string, Rowid[]>> | null = null;\n frozen = false;\n\n constructor(name: string, columns: ColumnInfo[], options: TableOptions = {}) {\n this.name = name;\n this.columns = columns.map(cloneColumn);\n this.rows = new Map();\n this.nextRowid = 1;\n this.constraints = cloneAst(options.constraints ?? []);\n this.indexes = [...(options.indexes ?? [])];\n this.originalSql = options.originalSql ?? null;\n this.withoutRowid = options.withoutRowid ?? false;\n this.strict = options.strict ?? false;\n this.clusteredRows = new Map();\n this.scanCache = null;\n }\n\n integerPkColumn(): ColumnInfo | undefined {\n return this.integerPrimaryKeyAlias();\n }\n\n get(rowid: Rowid): Row | undefined {\n try {\n return this.rows.get(canonicalRowid(rowid));\n } catch {\n return undefined;\n }\n }\n\n getByKey(value: SqlValue): Row | undefined {\n if (value === null || this.withoutRowid) return undefined;\n try {\n return this.get(asRowid(value, \"rowid\"));\n } catch {\n return undefined;\n }\n }\n\n private invalidateScan(): void {\n this.scanCache = null;\n }\n\n private commitRow(row: Row): void {\n this.indexEquality(row);\n this.invalidateScan();\n }\n\n private reindexEquality(before: Row, after: Row): void {\n this.unindexEquality(before);\n this.indexEquality(after);\n this.invalidateScan();\n }\n\n /** True when the table has no user constraints that DML must enforce beyond hidden rowid. */\n isUnconstrained(): boolean {\n if (this.withoutRowid || this.strict || this.indexes.length > 0 || this.constraints.length > 0) return false;\n for (const column of this.columns) {\n if (column.notNull || column.primaryKey || column.unique || column.generated || column.defaultExpr) return false;\n }\n return true;\n }\n\n /**\n * Point lookup via a write-maintained covering hash (not a schema index).\n * Returns null when the table is too small or the column does not exist.\n */\n lookupEquality(columnLower: string, value: SqlValue): Row[] | null {\n if (!this.ensureEqualityHash(columnLower)) return null;\n const map = this.equalityHashes!.get(columnLower);\n if (!map) return null;\n const column = this.columns.find((item) => item.nameLower === columnLower);\n const key = serializeIndexKey([normalizeForCollation(value, column?.collate ?? \"BINARY\")]);\n if (key === null) return [];\n const rowids = map.get(key);\n if (!rowids || rowids.length === 0) return [];\n const rows: Row[] = [];\n for (const rowid of rowids) {\n const row = this.rows.get(rowid);\n if (row) rows.push(row);\n }\n return rows;\n }\n\n ensureEqualityHash(columnLower: string): boolean {\n if (this.frozen || this.rows.size < EQUALITY_HASH_MIN_ROWS) return false;\n const column = this.columns.find((item) => item.nameLower === columnLower);\n if (!column) return false;\n this.equalityHashes ??= new Map();\n if (this.equalityHashes.has(columnLower)) return true;\n const map = new Map<string, Rowid[]>();\n const collate = column.collate ?? \"BINARY\";\n for (const row of this.rows.values()) {\n const key = serializeIndexKey([normalizeForCollation(row.values.get(columnLower) ?? null, collate)]);\n if (key === null) continue;\n const bucket = map.get(key);\n if (bucket) bucket.push(row.rowid);\n else map.set(key, [row.rowid]);\n }\n this.equalityHashes.set(columnLower, map);\n return true;\n }\n\n clearEqualityHashes(): void {\n this.equalityHashes = null;\n }\n\n private indexEquality(row: Row): void {\n if (!this.equalityHashes) return;\n for (const [columnLower, map] of this.equalityHashes) {\n const column = this.columns.find((item) => item.nameLower === columnLower);\n const key = serializeIndexKey([\n normalizeForCollation(row.values.get(columnLower) ?? null, column?.collate ?? \"BINARY\"),\n ]);\n if (key === null) continue;\n const bucket = map.get(key);\n if (bucket) {\n if (!bucket.some((id) => sameRowid(id, row.rowid))) bucket.push(row.rowid);\n } else map.set(key, [row.rowid]);\n }\n }\n\n private unindexEquality(row: Row): void {\n if (!this.equalityHashes) return;\n for (const [columnLower, map] of this.equalityHashes) {\n const column = this.columns.find((item) => item.nameLower === columnLower);\n const key = serializeIndexKey([\n normalizeForCollation(row.values.get(columnLower) ?? null, column?.collate ?? \"BINARY\"),\n ]);\n if (key === null) continue;\n const bucket = map.get(key);\n if (!bucket) continue;\n const index = bucket.findIndex((id) => sameRowid(id, row.rowid));\n if (index >= 0) bucket.splice(index, 1);\n if (bucket.length === 0) map.delete(key);\n }\n }\n\n insert(input: InsertRow | RowValues, options?: InsertOptions): Rowid {\n this.assertMutable();\n const supplied = isInsertRow(input) ? input : { values: input };\n const values = options?.prepared\n ? supplied.values instanceof Map\n ? supplied.values\n : rowValues(supplied.values)\n : this.prepareValues(supplied.values);\n\n if (this.withoutRowid) {\n if (supplied.rowid !== undefined) {\n throw new SqliteError(`table ${this.name} has no column named rowid`, \"other\");\n }\n const rowid = canonicalRowid(this.allocateRowid());\n const candidate: Row = { rowid, values };\n if (!options?.skipValidate) this.validate(candidate);\n const clusterKey = this.makeClusterKey(values);\n if (this.clusteredRows.has(clusterKey)) {\n throw primaryKeyConflict(this.name, this.primaryKeyColumns());\n }\n this.clusteredRows.set(clusterKey, candidate);\n this.rows.set(rowid, candidate);\n this.advanceNextRowid(rowid);\n this.commitRow(candidate);\n return rowid;\n }\n\n const alias = this.integerPrimaryKeyAlias();\n let rowid = supplied.rowid;\n\n if (alias) {\n const value = values.get(normalizeColumnName(alias.name)) ?? null;\n if (rowid === undefined && value !== null) rowid = asRowid(value, alias.name);\n }\n rowid = canonicalRowid(rowid ?? this.allocateRowid());\n\n if (this.rows.has(rowid)) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${this.name}.rowid`,\n \"constraint_primary\",\n \"SQLITE_CONSTRAINT_PRIMARYKEY\",\n );\n }\n if (alias) values.set(normalizeColumnName(alias.name), rowid);\n\n const candidate: Row = { rowid, values };\n if (!options?.skipValidate) this.validate(candidate);\n this.rows.set(rowid, candidate);\n this.advanceNextRowid(rowid);\n this.commitRow(candidate);\n return rowid;\n }\n\n update(rowid: Rowid, updates: RowValues): Row | undefined {\n this.assertMutable();\n const key = canonicalRowid(rowid);\n const existing = this.rows.get(key);\n if (!existing) return undefined;\n\n const values = new Map(existing.values);\n const incoming = rowValues(updates);\n for (const [name, value] of incoming) {\n const column = this.column(name);\n values.set(normalizeColumnName(column.name), applyAffinity(cloneSqlValue(value), column.affinity));\n }\n\n if (this.withoutRowid) {\n const oldClusterKey = this.makeClusterKey(existing.values);\n const newClusterKey = this.makeClusterKey(values);\n if (newClusterKey !== oldClusterKey && this.clusteredRows.has(newClusterKey)) {\n throw primaryKeyConflict(this.name, this.primaryKeyColumns());\n }\n const candidate: Row = { rowid: key, values };\n this.validate(candidate, key);\n if (newClusterKey !== oldClusterKey) this.clusteredRows.delete(oldClusterKey);\n this.clusteredRows.set(newClusterKey, candidate);\n this.rows.set(key, candidate);\n this.reindexEquality(existing, candidate);\n return candidate;\n }\n\n const alias = this.integerPrimaryKeyAlias();\n const targetKey = alias ? asRowid(values.get(normalizeColumnName(alias.name)) ?? null, alias.name) : key;\n if (targetKey !== key && this.rows.has(targetKey)) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${this.name}.${alias?.name ?? \"rowid\"}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n if (alias) values.set(normalizeColumnName(alias.name), targetKey);\n const candidate: Row = { rowid: targetKey, values };\n this.validate(candidate, key);\n if (targetKey !== key) this.rows.delete(key);\n this.rows.set(targetKey, candidate);\n this.advanceNextRowid(targetKey);\n this.reindexEquality(existing, candidate);\n return candidate;\n }\n\n delete(rowid: Rowid): boolean {\n this.assertMutable();\n const key = canonicalRowid(rowid);\n const existing = this.rows.get(key);\n if (!existing) return false;\n if (this.withoutRowid) this.clusteredRows.delete(this.makeClusterKey(existing.values));\n this.unindexEquality(existing);\n this.invalidateScan();\n return this.rows.delete(key);\n }\n\n *scan(): Iterable<Row> {\n if (!this.scanCache) {\n if (this.withoutRowid) {\n this.scanCache = [...this.clusteredRows.values()].sort((a, b) => this.comparePrimaryKeys(a, b));\n } else {\n this.scanCache = [...this.rows.values()].sort((a, b) => compareRowids(a.rowid, b.rowid));\n }\n }\n yield* this.scanCache;\n }\n\n clone(): Table {\n const copy = new Table(this.name, this.columns, {\n constraints: this.constraints,\n indexes: this.indexes,\n originalSql: this.originalSql,\n withoutRowid: this.withoutRowid,\n strict: this.strict,\n });\n copy.nextRowid = this.nextRowid;\n for (const [rowid, row] of this.rows) copy.rows.set(rowid, cloneRow(row));\n for (const [clusterKey, row] of this.clusteredRows) copy.clusteredRows.set(clusterKey, cloneRow(row));\n return copy;\n }\n\n freeze(): void {\n this.frozen = true;\n }\n\n private assertMutable(): void {\n if (this.frozen) throw new SqliteError(\"internal: cannot mutate a frozen table\", \"other\");\n }\n\n /** Rebuild clustered storage after snapshot decode or bulk load. */\n rebuildClusteredRows(): void {\n if (!this.withoutRowid) return;\n this.clusteredRows.clear();\n for (const row of this.rows.values()) {\n this.clusteredRows.set(this.makeClusterKey(row.values), row);\n }\n this.invalidateScan();\n this.clearEqualityHashes();\n }\n\n private prepareValues(input: RowValues): Map<string, SqlValue> {\n const supplied = rowValues(input);\n for (const name of supplied.keys()) this.column(name);\n\n const result = new Map<string, SqlValue>();\n for (const column of this.columns) {\n const key = normalizeColumnName(column.name);\n result.set(\n key,\n this.strict\n ? applyStrictValue(cloneSqlValue(supplied.get(key) ?? null), column.typeName ?? \"\", this.name, column.name)\n : applyAffinity(cloneSqlValue(supplied.get(key) ?? null), column.affinity),\n );\n }\n return result;\n }\n\n private column(name: string): ColumnInfo {\n const key = normalizeColumnName(name);\n const column = this.columns.find((item) => normalizeColumnName(item.name) === key);\n if (!column) throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n return column;\n }\n\n private validate(row: Row, excludedRowid?: Rowid): void {\n for (const column of this.columns) {\n const value = row.values.get(normalizeColumnName(column.name)) ?? null;\n if ((column.notNull || column.primaryKey) && value === null) {\n const category = column.primaryKey ? \"constraint_primary\" : \"constraint_notnull\";\n const code = column.primaryKey ? \"SQLITE_CONSTRAINT_PRIMARYKEY\" : \"SQLITE_CONSTRAINT_NOTNULL\";\n throw new SqliteError(\n `${column.primaryKey ? \"PRIMARY KEY\" : \"NOT NULL\"} constraint failed: ${this.name}.${column.name}`,\n category,\n code,\n );\n }\n }\n\n const uniqueSets = this.uniqueColumnSets();\n // Prefer O(1)/O(k) enforcement via IndexStore in the DML path (autoindexes).\n // Keep a scan only when this table has no indexes registered yet.\n if (this.indexes.length === 0) {\n for (const names of uniqueSets) {\n const values = names.map((name) => row.values.get(normalizeColumnName(name)) ?? null);\n if (values.some((value) => value === null)) continue;\n for (const other of this.rows.values()) {\n if (excludedRowid !== undefined && other.rowid === excludedRowid) continue;\n if (\n values.every((value, index) => {\n const column = this.column(names[index]!);\n const otherValue = other.values.get(normalizeColumnName(names[index]!)) ?? null;\n const collation = column.collate ?? \"BINARY\";\n return compareWithCollation(value, otherValue, collation) === 0;\n })\n ) {\n const qualified = names.map((name) => `${this.name}.${name}`).join(\", \");\n throw new SqliteError(\n `UNIQUE constraint failed: ${qualified}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n }\n }\n } else if (uniqueSets.length > 0) {\n // Indexes exist: uniqueness is enforced by IndexStore on addIndexes / conflict checks.\n // Still guard INTEGER PRIMARY KEY collisions via the rowid map in insert/update.\n }\n }\n\n private uniqueColumnSets(): string[][] {\n const sets = this.columns.filter((column) => column.unique).map((column) => [column.name]);\n if (!this.constraints.some((constraint) => constraint.type === \"primary_key\")) {\n const primary = this.columns.filter((column) => column.primaryKey).map((column) => column.name);\n if (primary.length > 0) sets.push(primary);\n }\n for (const constraint of this.constraints) {\n if (constraint.type === \"unique\" || constraint.type === \"primary_key\") {\n sets.push(constraint.columns.map((column) => column.name));\n }\n }\n return sets;\n }\n\n private primaryKeyColumns(): ColumnInfo[] {\n const tablePrimary = this.constraints.find((constraint) => constraint.type === \"primary_key\");\n if (tablePrimary) {\n return tablePrimary.columns.map((column) => this.column(column.name));\n }\n return this.columns.filter((column) => column.primaryKey);\n }\n\n private makeClusterKey(values: Map<string, SqlValue>): string {\n return this.primaryKeyColumns()\n .map((column) => {\n const value = values.get(normalizeColumnName(column.name)) ?? null;\n const normalized = normalizeForCollation(value, column.collate ?? \"BINARY\");\n return serializePkComponent(normalized);\n })\n .join(\"\\0\");\n }\n\n private comparePrimaryKeys(left: Row, right: Row): number {\n for (const column of this.primaryKeyColumns()) {\n const leftValue = left.values.get(normalizeColumnName(column.name)) ?? null;\n const rightValue = right.values.get(normalizeColumnName(column.name)) ?? null;\n const comparison = column.collate\n ? compareWithCollation(leftValue, rightValue, column.collate)\n : compareSql(leftValue, rightValue);\n if (comparison !== 0) return comparison ?? 0;\n }\n return 0;\n }\n\n private integerPrimaryKeyAlias(): ColumnInfo | undefined {\n if (this.withoutRowid) return undefined;\n const primary = this.columns.filter((column) => column.primaryKey);\n if (primary.length !== 1 || primary[0]!.typeName?.trim().toUpperCase() !== \"INTEGER\") return undefined;\n return primary[0];\n }\n\n private allocateRowid(): Rowid {\n let candidate = canonicalRowid(this.nextRowid);\n while (this.rows.has(candidate)) candidate = incrementRowid(candidate);\n return candidate;\n }\n\n private advanceNextRowid(rowid: Rowid): void {\n if (compareRowids(rowid, this.nextRowid) >= 0) this.nextRowid = incrementRowid(rowid);\n }\n}\n\nexport function makeColumnInfo(\n name: string,\n typeName: string | null,\n options: Partial<Omit<ColumnInfo, \"name\" | \"nameLower\" | \"typeName\" | \"affinity\">> = {},\n): ColumnInfo {\n return {\n name,\n nameLower: name.toLowerCase(),\n typeName,\n affinity: affinityFromTypeName(typeName),\n notNull: options.notNull ?? false,\n primaryKey: options.primaryKey ?? false,\n autoincrement: options.autoincrement ?? false,\n defaultExpr: options.defaultExpr ?? null,\n unique: options.unique ?? false,\n collate: options.collate ?? null,\n generated: options.generated ?? null,\n };\n}\n\nfunction cloneColumn(column: ColumnInfo): ColumnInfo {\n return {\n ...column,\n nameLower: column.nameLower ?? column.name.toLowerCase(),\n defaultExpr: column.defaultExpr === null ? null : cloneAst(column.defaultExpr),\n generated:\n column.generated === null ? null : { expr: cloneAst(column.generated.expr), stored: column.generated.stored },\n };\n}\n\nfunction cloneAst<T>(value: T): T {\n return structuredClone(value);\n}\n\nfunction isInsertRow(input: InsertRow | RowValues): input is InsertRow {\n return !(input instanceof Map) && \"values\" in input;\n}\n\nfunction asRowid(value: SqlValue, column: string): Rowid {\n if (typeof value === \"bigint\") return canonicalRowid(value);\n if (typeof value === \"number\" && Number.isSafeInteger(value)) return value;\n throw new SqliteError(\n `datatype mismatch for INTEGER PRIMARY KEY column: ${column}`,\n \"datatype_mismatch\",\n \"SQLITE_MISMATCH\",\n );\n}\n\nfunction canonicalRowid(value: Rowid): Rowid {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value))\n throw new SqliteError(\"rowid must be a safe integer or bigint\", \"datatype_mismatch\", \"SQLITE_MISMATCH\");\n return value;\n }\n if (value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER)) return Number(value);\n return value;\n}\n\nfunction incrementRowid(value: Rowid): Rowid {\n if (typeof value === \"bigint\") return value + 1n;\n if (value < Number.MAX_SAFE_INTEGER) return value + 1;\n return BigInt(value) + 1n;\n}\n\nfunction compareRowids(left: Rowid, right: Rowid): number {\n const a = typeof left === \"bigint\" ? left : BigInt(left);\n const b = typeof right === \"bigint\" ? right : BigInt(right);\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction sameRowid(left: Rowid, right: Rowid): boolean {\n return typeof left === \"bigint\" || typeof right === \"bigint\" ? BigInt(left) === BigInt(right) : left === right;\n}\n\nfunction serializePkComponent(value: SqlValue): string {\n if (value === null) return \"\\0n\";\n if (typeof value === \"bigint\") return `\\0b:${value.toString()}`;\n if (typeof value === \"number\") return `\\0i:${value}`;\n if (typeof value === \"string\") return `\\0s:${value}`;\n if (value instanceof Uint8Array) return `\\0x:${Array.from(value).join(\",\")}`;\n return `\\0r:${value.value}`;\n}\n\nfunction primaryKeyConflict(tableName: string, columns: ColumnInfo[]): never {\n const qualified = columns.map((column) => `${tableName}.${column.name}`).join(\", \");\n throw new SqliteError(`UNIQUE constraint failed: ${qualified}`, \"constraint_primary\", \"SQLITE_CONSTRAINT_PRIMARYKEY\");\n}\n", "import type {\n CreateIndexStmt,\n CreateTableStmt,\n CreateViewStmt,\n CreateVirtualTableStmt,\n Expr,\n IndexedColumn,\n SelectStmt,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { IndexStore } from \"../indexes/index.ts\";\nimport { isStrictTypeName, unknownStrictType } from \"../types/strict.ts\";\nimport { affinityFromTypeName } from \"../types/value.ts\";\nimport { Fts5VirtualTable } from \"../vtable/fts5.ts\";\nimport {\n BytecodeVirtualTable,\n DbStatVirtualTable,\n FtsVocabVirtualTable,\n RTreeVirtualTable,\n TablesUsedVirtualTable,\n} from \"../vtable/modules.ts\";\nimport type { Rowid } from \"./row.ts\";\nimport type { ColumnInfo } from \"./table.ts\";\nimport { Table } from \"./table.ts\";\n\nexport type AnyVirtualTable =\n | Fts5VirtualTable\n | RTreeVirtualTable\n | DbStatVirtualTable\n | BytecodeVirtualTable\n | TablesUsedVirtualTable\n | FtsVocabVirtualTable;\n\nexport interface ViewInfo {\n name: string;\n columns: string[] | null;\n select: SelectStmt;\n originalSql: string | null;\n}\n\nexport interface IndexInfo {\n name: string;\n tableName: string;\n unique: boolean;\n columns: IndexedColumn[];\n where: Expr | null;\n originalSql: string | null;\n store: IndexStore;\n}\n\nexport interface TriggerInfo {\n name: string;\n tableName: string;\n timing: \"BEFORE\" | \"AFTER\" | \"INSTEAD\";\n event: \"INSERT\" | \"UPDATE\" | \"DELETE\";\n when: Expr | null;\n forEachRow: boolean;\n /** Statements in the trigger body (already parsed). */\n body: import(\"../ast/nodes.ts\").Statement[];\n updateColumns: string[] | null;\n originalSql: string | null;\n}\n\n/** In-memory catalog: tables, indexes, views, triggers, and mutation counters. */\nexport class DatabaseState {\n tables = new Map<string, Table>();\n virtualTables = new Map<string, AnyVirtualTable>();\n views = new Map<string, ViewInfo>();\n indexes = new Map<string, IndexInfo>();\n triggers = new Map<string, TriggerInfo>();\n /** Attached databases: schema name \u2192 state + filename label. */\n attached = new Map<string, { state: DatabaseState; filename: string }>();\n lastInsertRowid: Rowid = 0;\n changes = 0;\n totalChanges = 0;\n foreignKeysEnabled = false;\n schemaVersion = 0;\n userVersion = 0;\n\n databaseForSchema(schema: string | null, qualifiedForError?: string): DatabaseState {\n if (schema === null || schema.toLowerCase() === \"main\" || schema.toLowerCase() === \"temp\") return this;\n const entry = this.attached.get(schema.toLowerCase());\n if (!entry) {\n throw new SqliteError(`no such table: ${qualifiedForError ?? schema}`, \"no_such_table\");\n }\n return entry.state;\n }\n\n databaseForTable(table: Table): DatabaseState {\n if (this.tables.get(keyOf(table.name)) === table) return this;\n for (const { state } of this.attached.values()) {\n if (state.tables.get(keyOf(table.name)) === table) return state;\n }\n return this;\n }\n\n getTable(name: string): Table {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getTable(bare);\n }\n const key = keyOf(bare);\n if (this.virtualTables.has(key)) {\n throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n }\n const table = this.tables.get(key);\n if (!table) throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n return table;\n }\n\n getVirtualTable(name: string): Fts5VirtualTable {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getVirtualTable(bare);\n }\n const key = keyOf(bare);\n const table = this.virtualTables.get(key);\n if (!table || (table.kind !== \"fts5\" && table.kind !== \"fts3\" && table.kind !== \"fts4\")) {\n throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n }\n return table;\n }\n\n getAnyVirtualTable(name: string): AnyVirtualTable {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getAnyVirtualTable(bare);\n }\n const key = keyOf(bare);\n const table = this.virtualTables.get(key);\n if (!table) throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n return table;\n }\n\n isVirtualTable(name: string): boolean {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).isVirtualTable(bare);\n }\n return this.virtualTables.has(keyOf(bare));\n }\n\n isFtsTable(name: string): boolean {\n const table = this.virtualTables.get(keyOf(splitQualifiedName(name).bare));\n return !!table && (table.kind === \"fts5\" || table.kind === \"fts3\" || table.kind === \"fts4\");\n }\n\n createVirtualTable(stmt: CreateVirtualTableStmt, originalSql: string | null = null): AnyVirtualTable {\n const { schema, bare } = splitQualifiedName(stmt.name);\n // temp schema is the same DatabaseState (in-memory); not an ATTACH slot.\n if (schema !== null && schema.toLowerCase() !== \"temp\" && schema.toLowerCase() !== \"main\") {\n return this.databaseForSchema(schema, stmt.name).createVirtualTable({ ...stmt, name: bare }, originalSql);\n }\n const key = keyOf(bare);\n const existing = this.virtualTables.get(key);\n if (existing && stmt.ifNotExists) return existing;\n this.assertSchemaNameAvailable(bare);\n const module = stmt.module.toLowerCase();\n let table: AnyVirtualTable;\n if (module === \"fts5\" || module === \"fts3\" || module === \"fts4\") {\n table = new Fts5VirtualTable(bare, stmt.moduleArgs, originalSql, module);\n } else if (module === \"fts5vocab\") {\n table = new FtsVocabVirtualTable(bare, stmt.moduleArgs, originalSql);\n } else if (module === \"fts3tokenize\" || module === \"fts4aux\") {\n // Tokenize/aux modules: expose as empty FTS-like single-column tables for CREATE success.\n table = new Fts5VirtualTable(bare, stmt.moduleArgs.length ? stmt.moduleArgs : [\"token\"], originalSql, \"fts3\");\n } else if (module === \"rtree\" || module === \"rtree_i32\") {\n table = new RTreeVirtualTable(bare, stmt.moduleArgs, module === \"rtree_i32\", originalSql);\n } else if (module === \"dbstat\") {\n table = new DbStatVirtualTable(bare, stmt.moduleArgs[0] ?? null, originalSql);\n } else if (module === \"bytecode\") {\n table = new BytecodeVirtualTable(bare, originalSql);\n } else if (module === \"tables_used\") {\n table = new TablesUsedVirtualTable(bare, originalSql);\n } else {\n throw new SqliteError(`unknown module: ${stmt.module}`, \"unsupported\");\n }\n this.virtualTables.set(key, table);\n this.schemaVersion++;\n return table;\n }\n\n createTable(stmt: CreateTableStmt, originalSql: string | null = null): Table {\n const { schema, bare } = splitQualifiedName(stmt.name);\n if (schema !== null) {\n return this.databaseForSchema(schema, stmt.name).createTable({ ...stmt, name: bare }, originalSql);\n }\n const key = keyOf(bare);\n const existing = this.tables.get(key);\n if (existing && stmt.ifNotExists) return existing;\n this.assertSchemaNameAvailable(bare);\n\n const seenColumns = new Set<string>();\n const tablePrimaryNames = new Set(\n stmt.constraints\n .filter((constraint) => constraint.type === \"primary_key\")\n .flatMap((constraint) => constraint.columns.map((column) => keyOf(column.name))),\n );\n if (stmt.constraints.filter((constraint) => constraint.type === \"primary_key\").length > 1) {\n throw new SqliteError(\"table has more than one primary key\", \"constraint_primary\");\n }\n const columnPrimaryCount = stmt.columns.filter((column) =>\n column.constraints.some((constraint) => constraint.type === \"primary_key\"),\n ).length;\n if (columnPrimaryCount > 1) {\n throw new SqliteError(\"table has more than one primary key\", \"constraint_primary\");\n }\n\n const columns: ColumnInfo[] = stmt.columns.map((definition) => {\n const columnKey = keyOf(definition.name);\n if (seenColumns.has(columnKey)) throw new SqliteError(`duplicate column name: ${definition.name}`, \"other\");\n seenColumns.add(columnKey);\n\n const primary = definition.constraints.find((constraint) => constraint.type === \"primary_key\");\n const primaryKey = primary !== undefined || tablePrimaryNames.has(columnKey);\n const autoincrement = primary?.type === \"primary_key\" && primary.autoincrement;\n if (autoincrement && definition.typeName?.trim().toUpperCase() !== \"INTEGER\") {\n throw new SqliteError(\"AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY\", \"unsupported\");\n }\n const collateConstraint = definition.constraints.find((constraint) => constraint.type === \"collate\");\n const generatedConstraint = definition.constraints.find((constraint) => constraint.type === \"generated\");\n\n return {\n name: definition.name,\n typeName: definition.typeName,\n affinity: affinityFromTypeName(definition.typeName),\n notNull: definition.constraints.some((constraint) => constraint.type === \"not_null\"),\n primaryKey,\n autoincrement,\n defaultExpr: definition.constraints.find((constraint) => constraint.type === \"default\")?.expr ?? null,\n unique: definition.constraints.some((constraint) => constraint.type === \"unique\"),\n collate: collateConstraint?.type === \"collate\" ? collateConstraint.name : null,\n generated:\n generatedConstraint?.type === \"generated\"\n ? { expr: generatedConstraint.expr, stored: generatedConstraint.stored }\n : null,\n };\n });\n\n for (const constraint of stmt.constraints) {\n const localNames =\n constraint.type === \"primary_key\" || constraint.type === \"unique\"\n ? constraint.columns.map((column) => column.name)\n : constraint.type === \"foreign_key\"\n ? constraint.columns\n : [];\n for (const name of localNames) {\n if (!seenColumns.has(keyOf(name))) throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n }\n }\n const hasColumnPrimary = stmt.columns.some((column) =>\n column.constraints.some((constraint) => constraint.type === \"primary_key\"),\n );\n if (hasColumnPrimary && tablePrimaryNames.size > 0) {\n throw new SqliteError(\"table has more than one primary key\", \"constraint_primary\");\n }\n if (stmt.columns.length === 0) {\n throw new SqliteError(\"table must have at least one column\", \"syntax\");\n }\n if (stmt.strict) {\n for (const definition of stmt.columns) {\n const typeName = definition.typeName?.trim() ?? \"\";\n if (!isStrictTypeName(typeName)) unknownStrictType(bare, definition.name, typeName || \"null\");\n }\n }\n\n const normalizedConstraints = [...stmt.constraints];\n for (const definition of stmt.columns) {\n for (const constraint of definition.constraints) {\n if (constraint.type === \"check\") {\n normalizedConstraints.push({ type: \"check\", expr: constraint.expr, name: null });\n } else if (constraint.type === \"references\") {\n normalizedConstraints.push({\n type: \"foreign_key\",\n columns: [definition.name],\n refTable: constraint.table,\n refColumns: constraint.columns,\n onDelete: constraint.onDelete,\n onUpdate: constraint.onUpdate,\n name: null,\n deferrable: constraint.deferrable,\n initiallyDeferred: constraint.initiallyDeferred,\n });\n }\n }\n }\n const table = new Table(bare, columns, {\n constraints: normalizedConstraints,\n originalSql,\n withoutRowid: stmt.withoutRowid,\n strict: stmt.strict,\n });\n if (stmt.withoutRowid) {\n const pk = columns.filter((column) => column.primaryKey);\n if (pk.length === 0) {\n throw new SqliteError(\"PRIMARY KEY missing on table \" + bare, \"other\");\n }\n }\n this.tables.set(key, table);\n this.createAutoIndexesForTable(table);\n this.schemaVersion++;\n return table;\n }\n\n /**\n * SQLite-like autoindexes for PRIMARY KEY / UNIQUE so lookups and uniqueness\n * checks can use IndexStore. Skips single-column INTEGER PRIMARY KEY (rowid alias).\n */\n private createAutoIndexesForTable(table: Table): void {\n let seq = 1;\n const add = (columns: IndexedColumn[], unique: boolean): void => {\n if (columns.length === 0) return;\n // INTEGER PRIMARY KEY is the rowid map \u2014 no secondary autoindex.\n if (\n unique &&\n columns.length === 1 &&\n !table.withoutRowid &&\n table.integerPkColumn()?.name.toLowerCase() === columns[0]!.name.toLowerCase()\n ) {\n return;\n }\n const name = `sqlite_autoindex_${table.name}_${seq++}`;\n const index: IndexInfo = {\n name,\n tableName: table.name,\n unique,\n columns: structuredClone(columns),\n where: null,\n originalSql: null,\n store: new IndexStore(name),\n };\n this.indexes.set(keyOf(name), index);\n table.indexes.push(index.name);\n };\n\n const hasTablePrimary = table.constraints.some((constraint) => constraint.type === \"primary_key\");\n for (const column of table.columns) {\n if (column.unique) {\n add([{ name: column.name, collate: column.collate, order: null }], true);\n }\n if (column.primaryKey && !hasTablePrimary) {\n add([{ name: column.name, collate: column.collate, order: null }], true);\n }\n }\n for (const constraint of table.constraints) {\n if (constraint.type === \"primary_key\" || constraint.type === \"unique\") {\n add(constraint.columns, true);\n }\n }\n }\n\n dropTable(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).dropTable(bare, ifExists);\n }\n const key = keyOf(bare);\n const table = this.tables.get(key);\n const virtual = this.virtualTables.get(key);\n if (!table && !virtual) {\n if (ifExists) return false;\n throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n }\n if (virtual) {\n this.virtualTables.delete(key);\n this.schemaVersion++;\n return true;\n }\n for (const [indexKey, index] of this.indexes) {\n if (keyOf(index.tableName) === key) this.indexes.delete(indexKey);\n }\n this.dropTriggersForTable(bare);\n this.tables.delete(key);\n this.schemaVersion++;\n return true;\n }\n\n renameTable(oldName: string, newName: string): Table {\n const { schema: oldSchema, bare: oldBare } = splitQualifiedName(oldName);\n if (oldSchema !== null) {\n return this.databaseForSchema(oldSchema, oldName).renameTable(oldBare, splitQualifiedName(newName).bare);\n }\n const oldKey = keyOf(oldBare);\n const table = this.getWritableTable(oldName);\n const { schema: newSchema, bare: newBare } = splitQualifiedName(newName);\n if (newSchema !== null) {\n throw new SqliteError(`no such table: ${newName}`, \"no_such_table\");\n }\n this.assertSchemaNameAvailable(newBare);\n this.tables.delete(oldKey);\n table.name = newBare;\n this.tables.set(keyOf(newBare), table);\n for (const index of [...this.indexes.values()]) {\n if (keyOf(index.tableName) !== oldKey) continue;\n this.ensureWritableIndex(index).tableName = newBare;\n }\n for (const [key, trigger] of this.triggers) {\n if (keyOf(trigger.tableName) !== oldKey) continue;\n this.triggers.set(key, { ...trigger, tableName: newBare });\n }\n this.schemaVersion++;\n return table;\n }\n\n createView(stmt: CreateViewStmt, originalSql: string | null = null): ViewInfo {\n const { schema, bare } = splitQualifiedName(stmt.name);\n if (schema !== null) {\n return this.databaseForSchema(schema, stmt.name).createView({ ...stmt, name: bare }, originalSql);\n }\n const key = keyOf(bare);\n const existing = this.views.get(key);\n if (existing && stmt.ifNotExists) return existing;\n this.assertSchemaNameAvailable(bare);\n const view: ViewInfo = {\n name: bare,\n columns: stmt.columns ? [...stmt.columns] : null,\n select: structuredClone(stmt.select),\n originalSql,\n };\n this.views.set(key, view);\n this.schemaVersion++;\n return view;\n }\n\n dropView(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).dropView(bare, ifExists);\n }\n const deleted = this.views.delete(keyOf(bare));\n if (!deleted && !ifExists) throw new SqliteError(`no such view: ${name}`, \"other\");\n if (deleted) this.schemaVersion++;\n return deleted;\n }\n\n createIndex(stmt: CreateIndexStmt, originalSql: string | null = null): IndexInfo {\n const table = this.getWritableTable(stmt.table);\n const { schema, bare } = splitQualifiedName(stmt.name);\n const target = schema !== null ? this.databaseForSchema(schema, stmt.name) : this.databaseForTable(table);\n const key = keyOf(bare);\n const existing = target.indexes.get(key);\n if (existing && stmt.ifNotExists) return existing;\n target.assertSchemaNameAvailable(bare);\n for (const indexed of stmt.columns) {\n if (indexed.expr) continue;\n if (!table.columns.some((column) => keyOf(column.name) === keyOf(indexed.name))) {\n throw new SqliteError(`no such column: ${indexed.name}`, \"no_such_column\");\n }\n }\n const index: IndexInfo = {\n name: bare,\n tableName: table.name,\n unique: stmt.unique,\n columns: structuredClone(stmt.columns),\n where: stmt.where ? structuredClone(stmt.where) : null,\n originalSql,\n store: new IndexStore(bare),\n };\n target.indexes.set(key, index);\n table.indexes.push(index.name);\n target.schemaVersion++;\n return index;\n }\n\n dropIndex(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n const target = schema !== null ? this.databaseForSchema(schema, name) : this;\n const key = keyOf(bare);\n const index = target.indexes.get(key);\n if (!index) {\n if (ifExists) return false;\n throw new SqliteError(`no such index: ${name}`, \"other\");\n }\n target.indexes.delete(key);\n const table = target.tables.get(keyOf(index.tableName));\n if (table) {\n const writable = target.ensureWritableTable(table);\n writable.indexes = writable.indexes.filter((item) => keyOf(item) !== key);\n }\n target.schemaVersion++;\n return true;\n }\n\n createTrigger(info: TriggerInfo): TriggerInfo {\n const { schema, bare } = splitQualifiedName(info.name);\n const target = schema !== null ? this.databaseForSchema(schema, info.name) : this;\n const key = keyOf(bare);\n target.assertSchemaNameAvailable(bare);\n const trigger: TriggerInfo = {\n ...info,\n name: bare,\n body: structuredClone(info.body),\n when: info.when ? structuredClone(info.when) : null,\n updateColumns: info.updateColumns ? [...info.updateColumns] : null,\n };\n target.triggers.set(key, trigger);\n target.schemaVersion++;\n return trigger;\n }\n\n dropTrigger(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n const target = schema !== null ? this.databaseForSchema(schema, name) : this;\n const key = keyOf(bare);\n const deleted = target.triggers.delete(key);\n if (!deleted && !ifExists) throw new SqliteError(`no such trigger: ${name}`, \"other\");\n if (deleted) target.schemaVersion++;\n return deleted;\n }\n\n dropTriggersForTable(tableName: string): void {\n const key = keyOf(tableName);\n for (const [triggerKey, trigger] of this.triggers) {\n if (keyOf(trigger.tableName) === key) this.triggers.delete(triggerKey);\n }\n }\n\n recordChange(count: number, lastInsertRowid?: Rowid): void {\n this.changes = count;\n this.totalChanges += count;\n if (lastInsertRowid !== undefined) this.lastInsertRowid = lastInsertRowid;\n }\n\n clone(): DatabaseState {\n const copy = new DatabaseState();\n for (const [key, table] of this.tables) copy.tables.set(key, table.clone());\n for (const [key, table] of this.virtualTables) copy.virtualTables.set(key, table.clone());\n for (const [key, view] of this.views) {\n copy.views.set(key, {\n name: view.name,\n columns: view.columns ? [...view.columns] : null,\n select: structuredClone(view.select),\n originalSql: view.originalSql,\n });\n }\n for (const [key, index] of this.indexes) {\n copy.indexes.set(key, {\n name: index.name,\n tableName: index.tableName,\n unique: index.unique,\n columns: structuredClone(index.columns),\n where: index.where ? structuredClone(index.where) : null,\n originalSql: index.originalSql,\n store: index.store.clone(),\n });\n }\n for (const [key, trigger] of this.triggers) {\n copy.triggers.set(key, {\n name: trigger.name,\n tableName: trigger.tableName,\n timing: trigger.timing,\n event: trigger.event,\n when: trigger.when ? structuredClone(trigger.when) : null,\n forEachRow: trigger.forEachRow,\n body: structuredClone(trigger.body),\n updateColumns: trigger.updateColumns ? [...trigger.updateColumns] : null,\n originalSql: trigger.originalSql,\n });\n }\n for (const [name, attached] of this.attached) {\n copy.attached.set(name, { state: attached.state.clone(), filename: attached.filename });\n }\n copy.lastInsertRowid = this.lastInsertRowid;\n copy.changes = this.changes;\n copy.totalChanges = this.totalChanges;\n copy.foreignKeysEnabled = this.foreignKeysEnabled;\n copy.schemaVersion = this.schemaVersion;\n copy.userVersion = this.userVersion;\n return copy;\n }\n\n /** Share table/index objects with the live state. Callers must freeze first. */\n cloneShallow(): DatabaseState {\n const copy = new DatabaseState();\n copy.tables = new Map(this.tables);\n for (const [key, table] of this.virtualTables) copy.virtualTables.set(key, table.clone());\n copy.views = new Map(this.views);\n copy.indexes = new Map(this.indexes);\n copy.triggers = new Map(this.triggers);\n for (const [name, attached] of this.attached) {\n copy.attached.set(name, { state: attached.state.cloneShallow(), filename: attached.filename });\n }\n copy.lastInsertRowid = this.lastInsertRowid;\n copy.changes = this.changes;\n copy.totalChanges = this.totalChanges;\n copy.foreignKeysEnabled = this.foreignKeysEnabled;\n copy.schemaVersion = this.schemaVersion;\n copy.userVersion = this.userVersion;\n return copy;\n }\n\n freezeShared(): void {\n for (const table of this.tables.values()) table.freeze();\n for (const index of this.indexes.values()) index.store.freeze();\n for (const attached of this.attached.values()) attached.state.freezeShared();\n }\n\n thawShared(): void {\n for (const table of this.tables.values()) table.frozen = false;\n for (const index of this.indexes.values()) index.store.frozen = false;\n for (const attached of this.attached.values()) attached.state.thawShared();\n }\n\n getWritableTable(name: string): Table {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getWritableTable(bare);\n }\n const table = this.getTable(bare);\n return this.ensureWritableTable(table);\n }\n\n ensureWritableTable(table: Table): Table {\n if (!table.frozen) return table;\n const key = keyOf(table.name);\n const copy = table.clone();\n this.tables.set(key, copy);\n return copy;\n }\n\n getWritableIndex(name: string): IndexInfo {\n const key = keyOf(name);\n const index = this.indexes.get(key);\n if (!index) throw new SqliteError(`no such index: ${name}`, \"other\");\n return this.ensureWritableIndex(index);\n }\n\n ensureWritableIndex(index: IndexInfo): IndexInfo {\n if (!index.store.frozen) return index;\n const copy: IndexInfo = {\n name: index.name,\n tableName: index.tableName,\n unique: index.unique,\n columns: structuredClone(index.columns),\n where: index.where ? structuredClone(index.where) : null,\n originalSql: index.originalSql,\n store: index.store.clone(),\n };\n this.indexes.set(keyOf(index.name), copy);\n return copy;\n }\n\n replaceWith(state: DatabaseState, options?: { adopt?: boolean }): void {\n const copy = options?.adopt ? state : state.clone();\n this.tables = copy.tables;\n this.virtualTables = copy.virtualTables;\n this.views = copy.views;\n this.indexes = copy.indexes;\n this.triggers = copy.triggers;\n this.attached = copy.attached;\n this.lastInsertRowid = copy.lastInsertRowid;\n this.changes = copy.changes;\n this.totalChanges = copy.totalChanges;\n this.foreignKeysEnabled = copy.foreignKeysEnabled;\n this.schemaVersion = copy.schemaVersion;\n this.userVersion = copy.userVersion;\n }\n\n private assertSchemaNameAvailable(name: string): void {\n const key = keyOf(name);\n if (\n this.tables.has(key) ||\n this.views.has(key) ||\n this.indexes.has(key) ||\n this.virtualTables.has(key) ||\n this.triggers.has(key)\n ) {\n throw new SqliteError(`object already exists: ${name}`, \"other\");\n }\n }\n}\n\nexport function splitQualifiedName(name: string): { schema: string | null; bare: string } {\n const dot = name.indexOf(\".\");\n if (dot < 0) return { schema: null, bare: name };\n return { schema: name.slice(0, dot), bare: name.slice(dot + 1) };\n}\n\nfunction keyOf(name: string): string {\n return name.toLowerCase();\n}\n", "import type { Expr, IndexedColumn, TableConstraint } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { defaultFunctionRegistry } from \"../functions/registry.ts\";\nimport { IndexStore } from \"../indexes/index.ts\";\nimport { DatabaseState, type IndexInfo, type ViewInfo } from \"../storage/database-state.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport { type ColumnInfo, Table } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport { asSqlReal, isTruthySql, SqlJsonText, SqlReal, type SqlValue, utf8Decode, utf8Encode } from \"../types/value.ts\";\n\nconst MAGIC = utf8Encode(\"SQLM\");\n/** Snapshot format: v1 = schema/rows only; v2 appends PRNG state + clock ms. */\nconst VERSION = 2;\nconst VERSION_V1 = 1;\n\n/** PRNG + clock captured alongside schema/rows in a v2 snapshot. */\nexport interface SnapshotRuntime {\n /** Unsigned 64-bit {@link Prng} state. */\n prngState: bigint;\n /** Clock instant as milliseconds since Unix epoch. */\n nowMs: number;\n}\n\n/** Result of {@link decodeDatabaseState}. */\nexport interface DecodedSnapshot {\n /** Restored catalog and table data. */\n state: DatabaseState;\n /** Present for v2 snapshots; `null` for v1 (schema/rows only). */\n runtime: SnapshotRuntime | null;\n}\n\nclass Writer {\n private buf = new Uint8Array(1024);\n private len = 0;\n\n private ensure(needed: number): void {\n if (this.len + needed <= this.buf.length) return;\n let cap = this.buf.length;\n while (cap < this.len + needed) cap *= 2;\n const next = new Uint8Array(cap);\n next.set(this.buf.subarray(0, this.len));\n this.buf = next;\n }\n\n u8(value: number): void {\n this.ensure(1);\n this.buf[this.len++] = value & 0xff;\n }\n u32(value: number): void {\n this.ensure(4);\n this.buf[this.len++] = value & 0xff;\n this.buf[this.len++] = (value >>> 8) & 0xff;\n this.buf[this.len++] = (value >>> 16) & 0xff;\n this.buf[this.len++] = (value >>> 24) & 0xff;\n }\n u64(value: bigint): void {\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setBigUint64(0, BigInt.asUintN(64, value), true);\n this.raw(bytes);\n }\n i64(value: bigint): void {\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setBigInt64(0, value, true);\n this.raw(bytes);\n }\n raw(value: Uint8Array): void {\n this.ensure(value.length);\n this.buf.set(value, this.len);\n this.len += value.length;\n }\n text(value: string): void {\n const bytes = utf8Encode(value);\n this.u32(bytes.length);\n this.raw(bytes);\n }\n json(value: unknown): void {\n this.text(JSON.stringify(value, jsonReplacer));\n }\n value(value: SqlValue): void {\n if (value === null) {\n this.u8(0);\n return;\n }\n if (value instanceof SqlReal) {\n this.u8(2);\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setFloat64(0, value.value, true);\n this.raw(bytes);\n return;\n }\n if (typeof value === \"bigint\" || (typeof value === \"number\" && Number.isInteger(value))) {\n this.u8(1);\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setBigInt64(0, BigInt(value), true);\n this.raw(bytes);\n return;\n }\n if (typeof value === \"number\") {\n this.u8(2);\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setFloat64(0, value, true);\n this.raw(bytes);\n return;\n }\n if (typeof value === \"string\") {\n this.u8(3);\n this.text(value);\n return;\n }\n if (value instanceof SqlJsonText) {\n this.u8(3);\n this.text(value.value);\n return;\n }\n this.u8(4);\n this.u32(value.length);\n this.raw(value);\n }\n finish(): Uint8Array {\n // Avoid retaining unused capacity when the buffer grew past the payload.\n if (this.len === this.buf.length) return this.buf;\n return this.buf.slice(0, this.len);\n }\n}\n\nclass Reader {\n private offset = 0;\n constructor(private readonly bytes: Uint8Array) {}\n u8(): number {\n if (this.offset >= this.bytes.length) this.fail();\n return this.bytes[this.offset++]!;\n }\n u32(): number {\n if (this.offset + 4 > this.bytes.length) this.fail();\n const value = new DataView(this.bytes.buffer, this.bytes.byteOffset + this.offset, 4).getUint32(0, true);\n this.offset += 4;\n return value;\n }\n u64(): bigint {\n const bytes = this.raw(8);\n return new DataView(bytes.buffer, bytes.byteOffset, 8).getBigUint64(0, true);\n }\n i64(): bigint {\n const bytes = this.raw(8);\n return new DataView(bytes.buffer, bytes.byteOffset, 8).getBigInt64(0, true);\n }\n raw(length: number): Uint8Array {\n if (length < 0 || this.offset + length > this.bytes.length) this.fail();\n const value = this.bytes.slice(this.offset, this.offset + length);\n this.offset += length;\n return value;\n }\n text(): string {\n return utf8Decode(this.raw(this.u32()));\n }\n json<T>(): T {\n return JSON.parse(this.text(), jsonReviver) as T;\n }\n value(): SqlValue {\n const tag = this.u8();\n if (tag === 0) return null;\n if (tag === 1) {\n const bytes = this.raw(8);\n const integer = new DataView(bytes.buffer, bytes.byteOffset, 8).getBigInt64(0, true);\n return integer <= BigInt(Number.MAX_SAFE_INTEGER) && integer >= BigInt(Number.MIN_SAFE_INTEGER)\n ? Number(integer)\n : integer;\n }\n if (tag === 2) {\n const bytes = this.raw(8);\n const value = new DataView(bytes.buffer, bytes.byteOffset, 8).getFloat64(0, true);\n // Preserve REAL storage class for integer-valued floats across snapshot restore.\n return Number.isInteger(value) && Number.isFinite(value) ? asSqlReal(value) : value;\n }\n if (tag === 3) return this.text();\n if (tag === 4) return this.raw(this.u32());\n this.fail();\n }\n remaining(): number {\n return this.bytes.length - this.offset;\n }\n done(): boolean {\n return this.offset === this.bytes.length;\n }\n private fail(): never {\n throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n }\n}\n\ninterface TableMeta {\n name: string;\n columns: ColumnInfo[];\n constraints: TableConstraint[];\n indexes: string[];\n originalSql: string | null;\n withoutRowid?: boolean;\n strict?: boolean;\n}\n\ninterface IndexMeta {\n name: string;\n tableName: string;\n unique: boolean;\n columns: IndexedColumn[];\n where: Expr | null;\n originalSql: string | null;\n}\n\n/**\n * Encode catalog, rows, and runtime into a sqlite-mem snapshot blob (not a `.sqlite` file).\n *\n * Prefer {@link Database.snapshot} unless you are serializing engine state directly.\n */\nexport function encodeDatabaseState(state: DatabaseState, runtime: SnapshotRuntime): Uint8Array {\n const writer = new Writer();\n writer.raw(MAGIC);\n writer.u32(VERSION);\n writer.u8(state.foreignKeysEnabled ? 1 : 0);\n writer.u32(state.schemaVersion);\n writer.u32(state.changes);\n writer.u32(state.totalChanges);\n writer.value(state.lastInsertRowid);\n writer.u32(state.tables.size);\n for (const table of sortedValues(state.tables)) {\n writer.json({\n name: table.name,\n columns: table.columns,\n constraints: table.constraints,\n indexes: [...table.indexes].sort(compareNames),\n originalSql: table.originalSql,\n withoutRowid: table.withoutRowid || undefined,\n strict: table.strict || undefined,\n });\n writer.value(table.nextRowid);\n const rows = [...table.rows.values()].sort((a, b) => compareRowids(a.rowid, b.rowid));\n writer.u32(rows.length);\n for (const row of rows) {\n writer.value(row.rowid);\n writer.u32(table.columns.length);\n for (const column of table.columns) writer.value(row.values.get(column.name.toLowerCase()) ?? null);\n }\n }\n const views = sortedValues(state.views);\n writer.u32(views.length);\n for (const view of views) writer.json(view);\n const indexes = sortedValues(state.indexes);\n writer.u32(indexes.length);\n for (const index of indexes) {\n writer.json({\n name: index.name,\n tableName: index.tableName,\n unique: index.unique,\n columns: index.columns,\n where: index.where,\n originalSql: index.originalSql,\n });\n }\n writer.u64(runtime.prngState);\n writer.i64(BigInt(Math.trunc(runtime.nowMs)));\n return writer.finish();\n}\n\n/**\n * Decode a blob from {@link encodeDatabaseState} / {@link Database.snapshot}.\n *\n * @throws {SqliteError} If the magic, version, or payload is invalid.\n */\nexport function decodeDatabaseState(snapshot: Uint8Array): DecodedSnapshot {\n const reader = new Reader(snapshot);\n const magic = reader.raw(4);\n if (!magic.every((byte, index) => byte === MAGIC[index]))\n throw new SqliteError(\"invalid sqlite-mem snapshot magic\", \"other\");\n const version = reader.u32();\n if (version !== VERSION && version !== VERSION_V1) {\n throw new SqliteError(`unsupported sqlite-mem snapshot version: ${version}`, \"snapshot_version\", \"SQLITE_FORMAT\");\n }\n const state = new DatabaseState();\n state.foreignKeysEnabled = reader.u8() !== 0;\n state.schemaVersion = reader.u32();\n state.changes = reader.u32();\n state.totalChanges = reader.u32();\n state.lastInsertRowid = asRowid(reader.value());\n const tableCount = reader.u32();\n for (let tableIndex = 0; tableIndex < tableCount; tableIndex++) {\n const meta = reader.json<TableMeta>();\n const table = new Table(meta.name, meta.columns, {\n constraints: meta.constraints,\n indexes: meta.indexes,\n originalSql: meta.originalSql,\n withoutRowid: meta.withoutRowid ?? false,\n strict: meta.strict ?? false,\n });\n table.nextRowid = asRowid(reader.value());\n const rowCount = reader.u32();\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n const rowid = asRowid(reader.value());\n const valueCount = reader.u32();\n if (valueCount !== table.columns.length) throw new SqliteError(\"snapshot row column count mismatch\", \"other\");\n const values = new Map<string, SqlValue>();\n for (const column of table.columns) values.set(column.name.toLowerCase(), reader.value());\n table.rows.set(rowid, { rowid, values });\n }\n table.rebuildClusteredRows();\n state.tables.set(table.name.toLowerCase(), table);\n }\n const viewCount = reader.u32();\n for (let index = 0; index < viewCount; index++) {\n const view = reader.json<ViewInfo>();\n state.views.set(view.name.toLowerCase(), view);\n }\n const indexCount = reader.u32();\n for (let indexPosition = 0; indexPosition < indexCount; indexPosition++) {\n const meta = reader.json<IndexMeta>();\n const info: IndexInfo = { ...meta, store: new IndexStore(meta.name) };\n state.indexes.set(info.name.toLowerCase(), info);\n const table = state.getTable(info.tableName);\n for (const row of table.scan()) {\n if (\n info.where &&\n isTruthySql(\n evalExpr(info.where, {\n functions: defaultFunctionRegistry,\n resolveColumn: (qualifier, name) => {\n if (qualifier && qualifier.toLowerCase() !== table.name.toLowerCase()) {\n throw new SqliteError(`no such column: ${qualifier}.${name}`, \"no_such_column\");\n }\n if (name.toLowerCase() === \"rowid\") return row.rowid;\n if (!row.values.has(name.toLowerCase()))\n throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n return row.values.get(name.toLowerCase()) ?? null;\n },\n getParameter: () => {\n throw new SqliteError(\"parameters are not allowed in index predicates\", \"misuse\");\n },\n }),\n ) !== true\n )\n continue;\n info.store.insert(\n info.columns.map((column) =>\n normalizeForCollation(row.values.get(column.name.toLowerCase()) ?? null, column.collate ?? \"BINARY\"),\n ),\n row.rowid,\n info.unique,\n );\n }\n }\n\n let runtime: SnapshotRuntime | null = null;\n if (version >= VERSION) {\n if (reader.remaining() < 16) throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n runtime = {\n prngState: reader.u64(),\n nowMs: Number(reader.i64()),\n };\n }\n if (!reader.done()) throw new SqliteError(\"snapshot has trailing data\", \"other\");\n return { state, runtime };\n}\n\nfunction asRowid(value: SqlValue): Rowid {\n if ((typeof value === \"number\" && Number.isSafeInteger(value)) || typeof value === \"bigint\") return value;\n throw new SqliteError(\"invalid rowid in snapshot\", \"other\");\n}\n\n/** Locale-independent UTF-16 code-unit order for stable snapshot encoding. */\nfunction compareNames(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction compareRowids(a: Rowid, b: Rowid): number {\n const left = typeof a === \"bigint\" ? a : BigInt(a);\n const right = typeof b === \"bigint\" ? b : BigInt(b);\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n\nfunction sortedValues<T extends { name: string }>(map: Map<string, T>): T[] {\n return [...map.values()].sort((a, b) => compareNames(a.name, b.name));\n}\n\nfunction jsonReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") return { $sqlm: \"bigint\", value: value.toString() };\n if (value instanceof Uint8Array) return { $sqlm: \"blob\", value: Array.from(value) };\n return value;\n}\n\nfunction jsonReviver(_key: string, value: unknown): unknown {\n if (!value || typeof value !== \"object\" || !(\"$sqlm\" in value)) return value;\n const tagged = value as { $sqlm: string; value: string | number[] };\n if (tagged.$sqlm === \"bigint\") return BigInt(tagged.value as string);\n if (tagged.$sqlm === \"blob\") return Uint8Array.from(tagged.value as number[]);\n return value;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { Prng } from \"../runtime/prng.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\n\ninterface SavepointSnapshot {\n name: string;\n state: DatabaseState;\n prngState: bigint;\n}\n\nexport class TransactionManager {\n readonly state: DatabaseState;\n readonly prng: Prng;\n private transactionSnapshot: DatabaseState | null = null;\n private transactionPrngState: bigint | null = null;\n private savepoints: SavepointSnapshot[] = [];\n private startedBySavepoint = false;\n\n constructor(state: DatabaseState, prng: Prng) {\n this.state = state;\n this.prng = prng;\n }\n\n get inTransaction(): boolean {\n return this.transactionSnapshot !== null;\n }\n\n begin(): void {\n if (this.inTransaction) {\n throw new SqliteError(\"cannot start a transaction within a transaction\", \"transaction\", \"SQLITE_ERROR\");\n }\n this.state.freezeShared();\n this.transactionSnapshot = this.state.cloneShallow();\n this.transactionPrngState = this.prng.getState();\n this.savepoints = [];\n this.startedBySavepoint = false;\n }\n\n commit(): void {\n this.requireTransaction(\"cannot commit - no transaction is active\");\n this.transactionSnapshot = null;\n this.transactionPrngState = null;\n this.savepoints = [];\n this.startedBySavepoint = false;\n this.state.thawShared();\n }\n\n rollback(savepoint?: string): void {\n this.requireTransaction(\"cannot rollback - no transaction is active\");\n if (savepoint !== undefined) {\n const index = this.findSavepoint(savepoint);\n const snapshot = this.savepoints[index];\n if (!snapshot) throw new SqliteError(`no such savepoint: ${savepoint}`, \"transaction\", \"SQLITE_ERROR\");\n this.state.replaceWith(snapshot.state, { adopt: true });\n this.prng.setState(snapshot.prngState);\n this.savepoints.splice(index + 1);\n return;\n }\n\n const snapshot = this.transactionSnapshot;\n const prngState = this.transactionPrngState;\n if (!snapshot || prngState === null) {\n throw new SqliteError(\"cannot rollback - no transaction is active\", \"transaction\", \"SQLITE_ERROR\");\n }\n this.state.replaceWith(snapshot, { adopt: true });\n this.prng.setState(prngState);\n this.transactionSnapshot = null;\n this.transactionPrngState = null;\n this.savepoints = [];\n this.startedBySavepoint = false;\n this.state.thawShared();\n }\n\n savepoint(name: string): void {\n if (!this.inTransaction) {\n this.state.freezeShared();\n this.transactionSnapshot = this.state.cloneShallow();\n this.transactionPrngState = this.prng.getState();\n this.startedBySavepoint = true;\n } else {\n this.state.freezeShared();\n }\n this.savepoints.push({\n name,\n state: this.state.cloneShallow(),\n prngState: this.prng.getState(),\n });\n }\n\n release(name: string): void {\n this.requireTransaction(\"cannot release savepoint - no transaction is active\");\n const index = this.findSavepoint(name);\n this.savepoints.splice(index);\n if (this.startedBySavepoint && this.savepoints.length === 0) {\n this.transactionSnapshot = null;\n this.transactionPrngState = null;\n this.startedBySavepoint = false;\n this.state.thawShared();\n }\n }\n\n private findSavepoint(name: string): number {\n const normalized = name.toLowerCase();\n for (let index = this.savepoints.length - 1; index >= 0; index--) {\n const savepoint = this.savepoints[index];\n if (savepoint && savepoint.name.toLowerCase() === normalized) return index;\n }\n throw new SqliteError(`no such savepoint: ${name}`, \"transaction\", \"SQLITE_ERROR\");\n }\n\n private requireTransaction(message: string): void {\n if (!this.inTransaction) throw new SqliteError(message, \"transaction\", \"SQLITE_ERROR\");\n }\n}\n", "import type { SelectStmt } from \"../ast/nodes.ts\";\nimport { SqliteError, TriggerRaiseError } from \"../errors/index.ts\";\nimport type { EvalContext } from \"../expressions/context.ts\";\nimport { defaultFunctionRegistry, type FunctionRegistry } from \"../functions/registry.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport type { TransactionManager } from \"../transactions/manager.ts\";\nimport type { ResultSet } from \"./result.ts\";\nimport {\n type Affinity,\n canonicalizeNumber,\n SqlJsonText,\n SqlReal,\n type SqlValue,\n storageClassOf,\n} from \"../types/value.ts\";\n\nexport interface Cell {\n table: string | null;\n tableLower?: string | null;\n name: string;\n nameLower?: string;\n value: SqlValue;\n affinity?: Affinity;\n collate?: string | null;\n /** Right-hand duplicate of a column merged by JOIN ... USING. */\n hiddenByUsing?: boolean;\n}\n\nexport function makeCell(\n table: string | null,\n name: string,\n value: SqlValue,\n extra?: Omit<Partial<Cell>, \"table\" | \"name\" | \"value\" | \"tableLower\" | \"nameLower\">,\n): Cell {\n return {\n table,\n tableLower: table?.toLowerCase() ?? null,\n name,\n nameLower: name.toLowerCase(),\n value,\n ...extra,\n };\n}\n\nexport interface ScopeRow {\n cells: Cell[];\n rowid?: Rowid;\n /** Output name of the rowid pseudo-column (INTEGER PRIMARY KEY alias when present). */\n rowidName?: string;\n sourceTable?: string;\n /** Set when WHERE MATCH succeeds for this row. */\n ftsMatch?: import(\"../vtable/fts5.ts\").FtsMatchCursor | null;\n}\n\nexport type SelectRunner = (stmt: SelectStmt, env: ExecutionEnv, parent?: EvalContext) => ResultSet;\n\nexport interface ExecutionHooks {\n now?: () => Date;\n random?: () => bigint;\n /** Raw xorshift64* output for `randomblob`. */\n randomU64?: () => bigint;\n}\n\nexport class ExecutionEnv {\n readonly state: DatabaseState;\n readonly transactions: TransactionManager;\n readonly functions: FunctionRegistry;\n readonly positional: SqlValue[];\n readonly named: Map<string, SqlValue>;\n readonly ctes = new Map<string, ResultSet>();\n readonly hooks: ExecutionHooks;\n selectRunner?: SelectRunner;\n\n /** Nesting depth while executing trigger programs. */\n triggerDepth = 0;\n /** OLD/NEW column scope for the active trigger program. */\n triggerScope: ScopeRow | null = null;\n\n /** Cap SELECT output rows (used by Statement.get). */\n maxRows = Number.POSITIVE_INFINITY;\n includeNamedRows = true;\n includeValues = true;\n\n constructor(\n state: DatabaseState,\n transactions: TransactionManager,\n params: readonly unknown[] = [],\n functions: FunctionRegistry = defaultFunctionRegistry,\n hooks: ExecutionHooks = {},\n ) {\n this.state = state;\n this.transactions = transactions;\n this.functions = functions;\n this.hooks = hooks;\n this.positional = params.map(toSqlValue);\n this.named = new Map();\n }\n\n reset(params: readonly unknown[]): void {\n this.positional.length = 0;\n for (const value of params) this.positional.push(toSqlValue(value));\n this.named.clear();\n this.ctes.clear();\n this.triggerDepth = 0;\n this.triggerScope = null;\n this.maxRows = Number.POSITIVE_INFINITY;\n this.includeNamedRows = true;\n this.includeValues = true;\n }\n\n getBoundParameter(name: string | number): SqlValue {\n if (typeof name === \"number\") {\n if (name < 1 || name > this.positional.length) return null;\n return this.positional[name - 1]!;\n }\n const key = name.toLowerCase();\n if (!this.named.has(key)) {\n // Unnamed positional fallback is handled by the evaluator for PARAM_POS;\n // named placeholders that were never bound are NULL (SQLite).\n return null;\n }\n return this.named.get(key) ?? null;\n }\n\n setNamed(name: string, value: unknown): void {\n this.named.set(name.toLowerCase(), toSqlValue(value));\n }\n\n createEvalContext(row: ScopeRow | null = null, parent?: EvalContext): EvalContext {\n const scope = row ?? this.triggerScope;\n const cells = scope?.cells ?? [];\n const context: EvalContext = {\n parent,\n ftsMatch: scope?.ftsMatch ?? null,\n functions: this.functions,\n functionContext: {\n changes: () => this.state.changes,\n totalChanges: () => this.state.totalChanges,\n lastInsertRowid: () => this.state.lastInsertRowid,\n now: this.hooks.now,\n random: this.hooks.random,\n randomU64: this.hooks.randomU64,\n ftsMatch: scope?.ftsMatch ?? null,\n ftsRowid: scope?.rowid,\n ftsSourceTable: scope?.sourceTable,\n getFtsTable: (name: string) => {\n if (!this.state.isFtsTable(name)) return null;\n return this.state.getVirtualTable(name);\n },\n },\n raise: this.triggerScope\n ? (action, message) => {\n throw new TriggerRaiseError(action, message);\n }\n : undefined,\n resolveColumn: (table, name) => {\n const key = name.toLowerCase();\n const tableKey = table?.toLowerCase();\n const tableMatches =\n table === null || cells.some((cell) => (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey);\n if (tableMatches && (key === \"rowid\" || key === \"_rowid_\" || key === \"oid\") && scope?.rowid !== undefined) {\n return scope.rowid;\n }\n if (key === \"rank\" && scope?.sourceTable && this.state.isFtsTable(scope.sourceTable)) {\n const fts = this.state.getVirtualTable(scope.sourceTable);\n if (scope.ftsMatch) return fts.bm25(scope.ftsMatch);\n return null;\n }\n // FTS table-name reference used by aux functions (bm25(docs), \u2026)\n if (\n scope?.sourceTable &&\n key === scope.sourceTable.toLowerCase() &&\n this.state.isFtsTable(scope.sourceTable) &&\n !cells.some((cell) => (cell.nameLower ?? cell.name.toLowerCase()) === key)\n ) {\n return scope.sourceTable;\n }\n const matches = cells.filter((cell) => {\n if ((cell.nameLower ?? cell.name.toLowerCase()) !== key) return false;\n if (table === null) return !cell.hiddenByUsing;\n return (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey;\n });\n if (matches.length === 0) {\n // SQLite: bare TRUE/FALSE are integer 1/0 unless a same-named column is in scope.\n if (table === null) {\n if (key === \"true\") return 1;\n if (key === \"false\") return 0;\n }\n throw new SqliteError(`no such column: ${table ? `${table}.` : \"\"}${name}`, \"no_such_column\");\n }\n if (matches.length > 1 && table === null) throw new SqliteError(`ambiguous column name: ${name}`, \"other\");\n return matches[0]!.value;\n },\n resolveStorageClass: (table, name) => {\n const key = name.toLowerCase();\n if (key === \"rank\") return \"real\";\n const tableKey = table?.toLowerCase();\n const matches = cells.filter((cell) => {\n if ((cell.nameLower ?? cell.name.toLowerCase()) !== key) return false;\n if (table === null) return !cell.hiddenByUsing;\n return (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey;\n });\n if (matches.length === 0) {\n if (table === null && (key === \"true\" || key === \"false\")) return \"integer\";\n throw new SqliteError(`no such column: ${table ? `${table}.` : \"\"}${name}`, \"no_such_column\");\n }\n if (matches.length > 1 && table === null) throw new SqliteError(`ambiguous column name: ${name}`, \"other\");\n const cell = matches[0]!;\n return cell.affinity === \"REAL\" && typeof cell.value === \"number\" ? \"real\" : storageClassOf(cell.value);\n },\n resolveCollation: (table, name) => {\n const key = name.toLowerCase();\n const tableKey = table?.toLowerCase();\n const matches = cells.filter((cell) => {\n if ((cell.nameLower ?? cell.name.toLowerCase()) !== key) return false;\n if (table === null) return !cell.hiddenByUsing;\n return (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey;\n });\n if (matches.length === 0) return null;\n if (matches.length > 1 && table === null) return null;\n return matches[0]!.collate ?? null;\n },\n getParameter: (name) => this.getBoundParameter(name),\n executeSelect: (select) => {\n if (!this.selectRunner) throw new SqliteError(\"select executor is not configured\", \"misuse\");\n const result = this.selectRunner(select, this, context);\n return {\n columns: result.columns,\n rows:\n result.values.length > 0\n ? result.values.map((row) => [...row])\n : result.rows.map((record) => result.columns.map((column) => record[column] ?? null)),\n };\n },\n matchFts: (table, column, query) => {\n if (row?.rowid === undefined || !row.sourceTable) {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n if (!this.state.isFtsTable(row.sourceTable)) {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n const fts = this.state.getVirtualTable(row.sourceTable);\n const cursor = fts.matchCursor(row.rowid, table, column, query);\n if (cursor) row.ftsMatch = cursor;\n else row.ftsMatch = null;\n return cursor !== null;\n },\n };\n return context;\n }\n}\n\nexport function toSqlValue(value: unknown): SqlValue {\n if (value === null || typeof value === \"string\" || typeof value === \"bigint\") return value;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new SqliteError(\"only finite numbers can be bound\", \"datatype_mismatch\");\n return canonicalizeNumber(value);\n }\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (value instanceof SqlReal || value instanceof SqlJsonText) return value;\n if (value instanceof Uint8Array) {\n if (isSharedArrayBufferView(value)) {\n throw new SqliteError(\"cannot bind SharedArrayBuffer-backed buffers; copy into a Uint8Array first\", \"misuse\");\n }\n return new Uint8Array(value);\n }\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n if (typeof SharedArrayBuffer !== \"undefined\" && value instanceof SharedArrayBuffer) {\n throw new SqliteError(\"cannot bind SharedArrayBuffer; copy into an ArrayBuffer or Uint8Array first\", \"misuse\");\n }\n if (ArrayBuffer.isView(value)) {\n const kind = Object.prototype.toString.call(value).slice(8, -1);\n throw new SqliteError(`cannot bind ${kind}; only Uint8Array and ArrayBuffer are accepted as BLOB values`, \"misuse\");\n }\n throw new SqliteError(`unsupported bind value: ${typeof value}`, \"datatype_mismatch\");\n}\n\nfunction isSharedArrayBufferView(view: ArrayBufferView): boolean {\n return typeof SharedArrayBuffer !== \"undefined\" && view.buffer instanceof SharedArrayBuffer;\n}\n", "import { isSqlJsonText, isSqlReal, type QueryRow, type QueryValue, type SqlValue } from \"../types/value.ts\";\n\n/** Query result returned by {@link Statement.result}. */\nexport interface ResultSet {\n /** Result-column names, in SELECT order. Present even when `rows` is empty. */\n columns: string[];\n /** Named rows. Duplicate column names keep the last value. */\n rows: QueryRow[];\n /** Positional rows; always present (empty array when there are zero rows). */\n values: QueryValue[][];\n /** Rows changed by the most recent mutating statement in this execution. */\n changes: number;\n /** Rowid of the most recent INSERT in this execution. */\n lastInsertRowid: number | bigint;\n}\n\nexport function emptyResult(changes = 0, lastInsertRowid: number | bigint = 0): ResultSet {\n return { columns: [], rows: [], values: [], changes, lastInsertRowid };\n}\n\n/** Export engine values to the public JS surface (SqlReal \u2192 number, SqlJsonText \u2192 string). */\nexport function exportSqlValue(value: SqlValue): QueryValue {\n if (isSqlReal(value)) return value.value;\n if (isSqlJsonText(value)) return value.value;\n return value;\n}\n\nexport function valuesToResult(\n columns: string[],\n values: SqlValue[][],\n changes = 0,\n lastInsertRowid: number | bigint = 0,\n options?: { named?: boolean; keepValues?: boolean },\n): ResultSet {\n const named = options?.named !== false;\n const keepValues = options?.keepValues !== false;\n return {\n columns,\n values: keepValues ? values.map((row) => row.map(exportSqlValue)) : [],\n rows: named\n ? values.map((row) => {\n const object: QueryRow = {};\n for (let index = 0; index < columns.length; index++) {\n object[columns[index]!] = exportSqlValue(row[index] ?? null);\n }\n return object;\n })\n : [],\n changes,\n lastInsertRowid,\n };\n}\n\nexport function resultValues(result: ResultSet): SqlValue[][] {\n if (result.values.length > 0 || result.rows.length === 0) {\n return result.values.map((row) => [...row]);\n }\n return result.rows.map((row) => result.columns.map((column) => row[column] ?? null));\n}\n", "import type { AttachStmt, DetachStmt } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { DatabaseState } from \"../storage/database-state.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { emptyResult, type ResultSet } from \"./result.ts\";\n\nexport function executeAttach(stmt: AttachStmt, env: ExecutionEnv): ResultSet {\n const filename = evalExpr(stmt.filename, env.createEvalContext());\n if (typeof filename !== \"string\") {\n throw new SqliteError(\"filename argument to ATTACH must be a string\", \"datatype_mismatch\");\n }\n const schema = stmt.schema.toLowerCase();\n if (schema === \"main\") {\n throw new SqliteError(\"database main is already in use\", \"other\");\n }\n if (schema === \"temp\") {\n throw new SqliteError(\"database temp is already in use\", \"other\");\n }\n if (env.state.attached.has(schema)) {\n throw new SqliteError(`database ${stmt.schema} is already in use`, \"other\");\n }\n env.state.attached.set(schema, { state: new DatabaseState(), filename });\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDetach(stmt: DetachStmt, env: ExecutionEnv): ResultSet {\n const schema = stmt.schema.toLowerCase();\n if (schema === \"main\") {\n throw new SqliteError(\"cannot detach database main\", \"other\");\n }\n if (schema === \"temp\") {\n throw new SqliteError(\"cannot detach database temp\", \"other\");\n }\n if (!env.state.attached.delete(schema)) {\n throw new SqliteError(`no such database: ${stmt.schema}`, \"other\");\n }\n return emptyResult(0, env.state.lastInsertRowid);\n}\n", "import { compareSql, type SqlValue } from \"../types/value.ts\";\n\nexport type PartitionRow = SqlValue[];\n\nfunction rowsEqual(left: PartitionRow, right: PartitionRow): boolean {\n if (left.length !== right.length) return false;\n return left.every((value, index) => {\n const other = right[index];\n return (value === null && other === null) || (other !== undefined && compareSql(value, other) === 0);\n });\n}\n\nexport function rowNumber(_partition: PartitionRow[], index: number): number {\n return index + 1;\n}\n\nexport function rank(partition: PartitionRow[], index: number, orderKeys: PartitionRow[] = partition): number {\n if (index <= 0) return 1;\n let firstPeer = index;\n while (firstPeer > 0 && rowsEqual(orderKeys[firstPeer]!, orderKeys[firstPeer - 1]!)) firstPeer--;\n return firstPeer + 1;\n}\n\nexport function denseRank(partition: PartitionRow[], index: number, orderKeys: PartitionRow[] = partition): number {\n if (index <= 0) return 1;\n let result = 1;\n for (let i = 1; i <= index; i++) {\n if (!rowsEqual(orderKeys[i]!, orderKeys[i - 1]!)) result++;\n }\n return result;\n}\n\nexport function lag(\n partition: PartitionRow[],\n index: number,\n valueIndex = 0,\n offset = 1,\n defaultValue: SqlValue = null,\n): SqlValue {\n const target = index - Math.max(0, Math.trunc(offset));\n return target < 0 ? defaultValue : (partition[target]?.[valueIndex] ?? null);\n}\n\nexport function lead(\n partition: PartitionRow[],\n index: number,\n valueIndex = 0,\n offset = 1,\n defaultValue: SqlValue = null,\n): SqlValue {\n const target = index + Math.max(0, Math.trunc(offset));\n return target >= partition.length ? defaultValue : (partition[target]?.[valueIndex] ?? null);\n}\n\nexport function firstValue(partition: PartitionRow[], valueIndex = 0, frameStart = 0): SqlValue {\n return partition[frameStart]?.[valueIndex] ?? null;\n}\n\nexport function lastValue(partition: PartitionRow[], valueIndex = 0, frameEnd = partition.length - 1): SqlValue {\n return partition[frameEnd]?.[valueIndex] ?? null;\n}\n\nexport function nthValue(partition: PartitionRow[], n: number, valueIndex = 0, frameStart = 0): SqlValue {\n const offset = Math.trunc(n);\n if (offset <= 0) return null;\n return partition[frameStart + offset - 1]?.[valueIndex] ?? null;\n}\n\nexport const windowFunctions = {\n row_number: rowNumber,\n rank,\n dense_rank: denseRank,\n lag,\n lead,\n first_value: firstValue,\n last_value: lastValue,\n nth_value: nthValue,\n ntile: () => 0,\n cume_dist: () => 0,\n percent_rank: () => 0,\n} as const;\n", "/**\n * Shared PRAGMA query engine used by statement-form `PRAGMA \u2026` and `pragma_*` TVFs.\n */\nimport type { Expr } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { aggregateFunctions } from \"../functions/aggregate.ts\";\nimport { dateTimeFunctions } from \"../functions/datetime.ts\";\nimport { ftsAuxFunctions, rtreeAuxFunctions } from \"../functions/extensions.ts\";\nimport { jsonAggregateFunctions, jsonScalarFunctions } from \"../functions/json.ts\";\nimport { mathFunctions } from \"../functions/math.ts\";\nimport { getScalarFunctions } from \"../functions/scalar.ts\";\nimport { windowFunctions } from \"../functions/window.ts\";\nimport type { IndexInfo } from \"../storage/database-state.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { isTruthySql, type SqlValue, toInteger } from \"../types/value.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\n\nexport interface PragmaQueryResult {\n columns: string[];\n rows: SqlValue[][];\n}\n\n/** Oracle-exposed pragma_* TVF base names (without the `pragma_` prefix). */\nexport const PRAGMA_TVF_NAMES = [\n \"analysis_limit\",\n \"application_id\",\n \"auto_vacuum\",\n \"automatic_index\",\n \"busy_timeout\",\n \"cache_size\",\n \"cache_spill\",\n \"cell_size_check\",\n \"checkpoint_fullfsync\",\n \"collation_list\",\n \"compile_options\",\n \"count_changes\",\n \"data_version\",\n \"database_list\",\n \"default_cache_size\",\n \"defer_foreign_keys\",\n \"empty_result_callbacks\",\n \"encoding\",\n \"foreign_key_check\",\n \"foreign_key_list\",\n \"foreign_keys\",\n \"freelist_count\",\n \"full_column_names\",\n \"fullfsync\",\n \"function_list\",\n \"hard_heap_limit\",\n \"ignore_check_constraints\",\n \"index_info\",\n \"index_list\",\n \"index_xinfo\",\n \"integrity_check\",\n \"journal_mode\",\n \"journal_size_limit\",\n \"legacy_alter_table\",\n \"locking_mode\",\n \"max_page_count\",\n \"module_list\",\n \"optimize\",\n \"page_count\",\n \"page_size\",\n \"pragma_list\",\n \"query_only\",\n \"quick_check\",\n \"read_uncommitted\",\n \"recursive_triggers\",\n \"reverse_unordered_selects\",\n \"schema_version\",\n \"secure_delete\",\n \"short_column_names\",\n \"soft_heap_limit\",\n \"synchronous\",\n \"table_info\",\n \"table_list\",\n \"table_xinfo\",\n \"temp_store\",\n \"threads\",\n \"trusted_schema\",\n \"user_version\",\n \"writable_schema\",\n] as const;\n\n/** Full pragma name list for `pragma_pragma_list` (includes names without TVFs). */\nexport const PRAGMA_LIST_NAMES = [\n \"activate_extensions\",\n ...PRAGMA_TVF_NAMES,\n \"case_sensitive_like\",\n \"hexkey\",\n \"hexrekey\",\n \"incremental_vacuum\",\n \"key\",\n \"lock_proxy_file\",\n \"mmap_size\",\n \"rekey\",\n \"shrink_memory\",\n \"temp_store_directory\",\n \"textkey\",\n \"textrekey\",\n \"wal_autocheckpoint\",\n \"wal_checkpoint\",\n].sort((a, b) => a.localeCompare(b));\n\nconst MEMORY_VTABLE_MODULES = [\n \"bytecode\",\n \"dbstat\",\n \"fts3\",\n \"fts3tokenize\",\n \"fts4\",\n \"fts4aux\",\n \"fts5\",\n \"fts5vocab\",\n \"json_each\",\n \"json_tree\",\n \"rtree\",\n \"rtree_i32\",\n \"tables_used\",\n];\n\nconst COMPILE_OPTIONS = [\n \"COMPILER=typescript\",\n \"ENABLE_FTS3\",\n \"ENABLE_FTS4\",\n \"ENABLE_FTS5\",\n \"ENABLE_JSON1\",\n \"ENABLE_RTREE\",\n \"THREADSAFE=0\",\n];\n\n/** Stable in-memory defaults matching bun:sqlite `:memory:` where applicable. */\nconst STORAGE_DEFAULTS: Record<string, { column: string; value: SqlValue }> = {\n analysis_limit: { column: \"analysis_limit\", value: 0 },\n application_id: { column: \"application_id\", value: 0 },\n auto_vacuum: { column: \"auto_vacuum\", value: 0 },\n automatic_index: { column: \"automatic_index\", value: 1 },\n busy_timeout: { column: \"timeout\", value: 0 },\n cache_size: { column: \"cache_size\", value: 2000 },\n cache_spill: { column: \"cache_spill\", value: 20000 },\n cell_size_check: { column: \"cell_size_check\", value: 0 },\n checkpoint_fullfsync: { column: \"checkpoint_fullfsync\", value: 1 },\n count_changes: { column: \"count_changes\", value: 0 },\n data_version: { column: \"data_version\", value: 1 },\n default_cache_size: { column: \"cache_size\", value: 2000 },\n defer_foreign_keys: { column: \"defer_foreign_keys\", value: 0 },\n empty_result_callbacks: { column: \"empty_result_callbacks\", value: 0 },\n encoding: { column: \"encoding\", value: \"UTF-8\" },\n freelist_count: { column: \"freelist_count\", value: 0 },\n full_column_names: { column: \"full_column_names\", value: 0 },\n fullfsync: { column: \"fullfsync\", value: 0 },\n hard_heap_limit: { column: \"hard_heap_limit\", value: 0 },\n ignore_check_constraints: { column: \"ignore_check_constraints\", value: 0 },\n journal_mode: { column: \"journal_mode\", value: \"memory\" },\n journal_size_limit: { column: \"journal_size_limit\", value: 32768 },\n legacy_alter_table: { column: \"legacy_alter_table\", value: 1 },\n locking_mode: { column: \"locking_mode\", value: \"normal\" },\n max_page_count: { column: \"max_page_count\", value: 1073741823 },\n page_size: { column: \"page_size\", value: 4096 },\n query_only: { column: \"query_only\", value: 0 },\n read_uncommitted: { column: \"read_uncommitted\", value: 0 },\n recursive_triggers: { column: \"recursive_triggers\", value: 0 },\n reverse_unordered_selects: { column: \"reverse_unordered_selects\", value: 0 },\n secure_delete: { column: \"secure_delete\", value: 2 },\n short_column_names: { column: \"short_column_names\", value: 1 },\n soft_heap_limit: { column: \"soft_heap_limit\", value: 0 },\n synchronous: { column: \"synchronous\", value: 2 },\n temp_store: { column: \"temp_store\", value: 0 },\n threads: { column: \"threads\", value: 0 },\n trusted_schema: { column: \"trusted_schema\", value: 1 },\n writable_schema: { column: \"writable_schema\", value: 0 },\n};\n\nexport function isPragmaTvfName(name: string): boolean {\n const lower = name.toLowerCase();\n if ((PRAGMA_TVF_NAMES as readonly string[]).includes(lower)) return true;\n if (lower.startsWith(\"pragma_\")) {\n return (PRAGMA_TVF_NAMES as readonly string[]).includes(lower.slice(\"pragma_\".length));\n }\n return false;\n}\n\n/**\n * Column names for a pragma_* TVF without evaluating arguments.\n * Used by SELECT shape analysis so correlated args (e.g. `tl.name`) are not\n * resolved before the outer row is bound.\n */\nexport function pragmaTvfColumns(name: string): string[] | null {\n const key = normalizePragmaKey(name);\n switch (key) {\n case \"foreign_keys\":\n return [\"foreign_keys\"];\n case \"user_version\":\n return [\"user_version\"];\n case \"schema_version\":\n return [\"schema_version\"];\n case \"table_info\":\n return [\"cid\", \"name\", \"type\", \"notnull\", \"dflt_value\", \"pk\"];\n case \"table_xinfo\":\n return [\"cid\", \"name\", \"type\", \"notnull\", \"dflt_value\", \"pk\", \"hidden\"];\n case \"index_list\":\n return [\"seq\", \"name\", \"unique\", \"origin\", \"partial\"];\n case \"index_info\":\n return [\"seqno\", \"cid\", \"name\"];\n case \"index_xinfo\":\n return [\"seqno\", \"cid\", \"name\", \"desc\", \"coll\", \"key\"];\n case \"foreign_key_list\":\n return [\"id\", \"seq\", \"table\", \"from\", \"to\", \"on_update\", \"on_delete\", \"match\"];\n case \"foreign_key_check\":\n return [\"table\", \"rowid\", \"parent\", \"fkid\"];\n case \"database_list\":\n return [\"seq\", \"name\", \"file\"];\n case \"table_list\":\n return [\"schema\", \"name\", \"type\", \"ncol\", \"wr\", \"strict\"];\n case \"collation_list\":\n return [\"seq\", \"name\"];\n case \"compile_options\":\n return [\"compile_options\"];\n case \"function_list\":\n return [\"name\", \"builtin\", \"type\", \"enc\", \"narg\", \"flags\"];\n case \"module_list\":\n case \"pragma_list\":\n return [\"name\"];\n case \"integrity_check\":\n case \"quick_check\":\n return [key];\n case \"optimize\":\n return [\"optimize\"];\n case \"page_count\":\n return [\"page_count\"];\n default: {\n const storage = STORAGE_DEFAULTS[key];\n if (storage) return [storage.column];\n return null;\n }\n }\n}\n\nfunction normalizePragmaKey(name: string): string {\n const lower = name.toLowerCase();\n if ((PRAGMA_TVF_NAMES as readonly string[]).includes(lower)) return lower;\n if (lower.startsWith(\"pragma_\")) {\n const stripped = lower.slice(\"pragma_\".length);\n if ((PRAGMA_TVF_NAMES as readonly string[]).includes(stripped)) return stripped;\n return stripped;\n }\n return lower;\n}\n\n/**\n * Query a pragma by name with optional SQL values (TVF args or evaluated statement args).\n * Read-only \u2014 writers stay in {@link executePragma}.\n */\nexport function queryPragma(name: string, args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const key = normalizePragmaKey(name);\n\n switch (key) {\n case \"foreign_keys\":\n return single(\"foreign_keys\", env.state.foreignKeysEnabled ? 1 : 0);\n case \"user_version\":\n return single(\"user_version\", env.state.userVersion);\n case \"schema_version\":\n return single(\"schema_version\", env.state.schemaVersion);\n case \"table_info\":\n return pragmaTableInfo(args, env, false);\n case \"table_xinfo\":\n return pragmaTableInfo(args, env, true);\n case \"index_list\":\n return pragmaIndexList(args, env);\n case \"index_info\":\n return pragmaIndexInfo(args, env, false);\n case \"index_xinfo\":\n return pragmaIndexInfo(args, env, true);\n case \"foreign_key_list\":\n return pragmaForeignKeyList(args, env);\n case \"foreign_key_check\":\n return pragmaForeignKeyCheck(args, env);\n case \"database_list\":\n return pragmaDatabaseList(env);\n case \"table_list\":\n return pragmaTableList(env);\n case \"collation_list\":\n return {\n columns: [\"seq\", \"name\"],\n rows: [\n [0, \"RTRIM\"],\n [1, \"NOCASE\"],\n [2, \"BINARY\"],\n ],\n };\n case \"compile_options\":\n return { columns: [\"compile_options\"], rows: COMPILE_OPTIONS.map((opt) => [opt]) };\n case \"function_list\":\n return pragmaFunctionList();\n case \"module_list\":\n return pragmaModuleList();\n case \"pragma_list\":\n return { columns: [\"name\"], rows: PRAGMA_LIST_NAMES.map((n) => [n]) };\n case \"integrity_check\":\n case \"quick_check\":\n return single(key, \"ok\");\n case \"optimize\":\n return { columns: [\"optimize\"], rows: [] };\n case \"page_count\":\n return single(\"page_count\", estimatePageCount(env));\n default: {\n const storage = STORAGE_DEFAULTS[key];\n if (storage) return single(storage.column, storage.value);\n return { columns: [], rows: [] };\n }\n }\n}\n\nfunction single(column: string, value: SqlValue): PragmaQueryResult {\n return { columns: [column], rows: [[value]] };\n}\n\nfunction estimatePageCount(env: ExecutionEnv): number {\n const objects = env.state.tables.size + env.state.indexes.size + env.state.views.size + env.state.virtualTables.size;\n return objects === 0 ? 0 : Math.max(1, objects);\n}\n\nfunction pragmaTableInfo(args: readonly SqlValue[], env: ExecutionEnv, xinfo: boolean): PragmaQueryResult {\n const tableName = requireNameArg(args, \"table_info\");\n const table = env.state.tables.get(tableName.toLowerCase());\n if (!table) return { columns: xinfoColumns(xinfo), rows: [] };\n const rows: SqlValue[][] = table.columns.map((column, cid) => {\n const pkIndex = table.columns.filter((c) => c.primaryKey).findIndex((c) => c.name === column.name);\n const pk = column.primaryKey ? (pkIndex >= 0 ? pkIndex + 1 : 1) : 0;\n const dflt = column.defaultExpr ? defaultLiteral(column.defaultExpr) : null;\n const base: SqlValue[] = [cid, column.name, column.typeName ?? \"\", column.notNull ? 1 : 0, dflt, pk];\n if (xinfo) {\n let hidden = 0;\n if (column.generated && !column.generated.stored) hidden = 2;\n if (column.generated?.stored) hidden = 3;\n base.push(hidden);\n }\n return base;\n });\n return { columns: xinfoColumns(xinfo), rows };\n}\n\nfunction xinfoColumns(xinfo: boolean): string[] {\n return xinfo\n ? [\"cid\", \"name\", \"type\", \"notnull\", \"dflt_value\", \"pk\", \"hidden\"]\n : [\"cid\", \"name\", \"type\", \"notnull\", \"dflt_value\", \"pk\"];\n}\n\nfunction defaultLiteral(expr: Expr): SqlValue {\n if (expr.type === \"literal\")\n return typeof expr.value === \"string\" ? `'${expr.value.replace(/'/g, \"''\")}'` : expr.value;\n if (expr.type === \"null\") return \"NULL\";\n return null;\n}\n\nfunction pragmaIndexList(args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const tableName = requireNameArg(args, \"index_list\");\n const table = env.state.tables.get(tableName.toLowerCase());\n if (!table) return { columns: [\"seq\", \"name\", \"unique\", \"origin\", \"partial\"], rows: [] };\n const rows: SqlValue[][] = [];\n let seq = 0;\n for (const name of table.indexes) {\n const index = env.state.indexes.get(name.toLowerCase());\n if (!index) continue;\n rows.push([seq++, index.name, index.unique ? 1 : 0, indexOrigin(index), index.where ? 1 : 0]);\n }\n return { columns: [\"seq\", \"name\", \"unique\", \"origin\", \"partial\"], rows };\n}\n\nfunction indexOrigin(index: IndexInfo): string {\n if (index.originalSql) return \"c\";\n if (index.name.toLowerCase().startsWith(\"sqlite_autoindex_\") && index.unique) return \"u\";\n return \"c\";\n}\n\nfunction pragmaIndexInfo(args: readonly SqlValue[], env: ExecutionEnv, xinfo: boolean): PragmaQueryResult {\n const indexName = requireNameArg(args, \"index_info\");\n const index = env.state.indexes.get(indexName.toLowerCase());\n const columns = xinfo ? [\"seqno\", \"cid\", \"name\", \"desc\", \"coll\", \"key\"] : [\"seqno\", \"cid\", \"name\"];\n if (!index) return { columns, rows: [] };\n const table = env.state.tables.get(index.tableName.toLowerCase());\n const rows: SqlValue[][] = index.columns.map((column, seqno) => {\n const cid = table?.columns.findIndex((c) => c.name.toLowerCase() === column.name.toLowerCase()) ?? -1;\n const base: SqlValue[] = [seqno, cid, column.name];\n if (xinfo) {\n base.push(column.order === \"DESC\" ? 1 : 0, (column.collate ?? \"BINARY\").toUpperCase(), 1);\n }\n return base;\n });\n if (xinfo) {\n // Trailing rowid key column (SQLite index_xinfo)\n rows.push([index.columns.length, -1, null, 0, \"BINARY\", 0]);\n }\n return { columns, rows };\n}\n\nfunction pragmaForeignKeyList(args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const tableName = requireNameArg(args, \"foreign_key_list\");\n const table = env.state.tables.get(tableName.toLowerCase());\n const columns = [\"id\", \"seq\", \"table\", \"from\", \"to\", \"on_update\", \"on_delete\", \"match\"];\n if (!table) return { columns, rows: [] };\n const rows: SqlValue[][] = [];\n let id = 0;\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\") continue;\n const refColumns =\n constraint.refColumns ??\n env.state.tables\n .get(constraint.refTable.toLowerCase())\n ?.columns.filter((c) => c.primaryKey)\n .map((c) => c.name) ??\n [];\n constraint.columns.forEach((column, seq) => {\n rows.push([\n id,\n seq,\n constraint.refTable,\n column,\n refColumns[seq] ?? null,\n constraint.onUpdate ?? \"NO ACTION\",\n constraint.onDelete ?? \"NO ACTION\",\n \"NONE\",\n ]);\n });\n id++;\n }\n return { columns, rows };\n}\n\nfunction pragmaForeignKeyCheck(args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const columns = [\"table\", \"rowid\", \"parent\", \"fkid\"];\n const filter = args[0] != null && args[0] !== null ? String(args[0]).toLowerCase() : null;\n const rows: SqlValue[][] = [];\n for (const table of env.state.tables.values()) {\n if (filter && table.name.toLowerCase() !== filter) continue;\n let fkid = 0;\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\") continue;\n const parent = env.state.tables.get(constraint.refTable.toLowerCase());\n const refColumns = constraint.refColumns ?? parent?.columns.filter((c) => c.primaryKey).map((c) => c.name) ?? [];\n for (const row of table.scan()) {\n let allNull = true;\n const childValues: SqlValue[] = [];\n for (const col of constraint.columns) {\n const value = row.values.get(col.toLowerCase()) ?? null;\n childValues.push(value);\n if (value !== null) allNull = false;\n }\n if (allNull) continue;\n if (!parent || !parentHasMatch(parent, refColumns, childValues)) {\n rows.push([table.name, row.rowid, constraint.refTable, fkid]);\n }\n }\n fkid++;\n }\n }\n return { columns, rows };\n}\n\nfunction parentHasMatch(parent: Table, refColumns: string[], childValues: SqlValue[]): boolean {\n if (refColumns.length === 0) return false;\n for (const row of parent.scan()) {\n let ok = true;\n for (let i = 0; i < refColumns.length; i++) {\n const parentVal = row.values.get(refColumns[i]!.toLowerCase()) ?? null;\n if (!sqlValuesEqual(parentVal, childValues[i] ?? null)) {\n ok = false;\n break;\n }\n }\n if (ok) return true;\n }\n return false;\n}\n\nfunction sqlValuesEqual(a: SqlValue, b: SqlValue): boolean {\n if (a === null || b === null) return a === b;\n if (typeof a === \"number\" && typeof b === \"number\") return a === b;\n if (typeof a === \"bigint\" || typeof b === \"bigint\") {\n return BigInt(a as number | bigint) === BigInt(b as number | bigint);\n }\n if (a instanceof Uint8Array || b instanceof Uint8Array) return false;\n return String(a) === String(b);\n}\n\nfunction pragmaDatabaseList(env: ExecutionEnv): PragmaQueryResult {\n const rows: SqlValue[][] = [[0, \"main\", \"\"]];\n let seq = 2;\n for (const [name, attached] of env.state.attached) {\n const file = attached.filename === \":memory:\" ? \"\" : attached.filename;\n rows.push([seq++, name, file]);\n }\n return { columns: [\"seq\", \"name\", \"file\"], rows };\n}\n\nfunction pragmaTableList(env: ExecutionEnv): PragmaQueryResult {\n const columns = [\"schema\", \"name\", \"type\", \"ncol\", \"wr\", \"strict\"];\n const rows: SqlValue[][] = [];\n for (const table of env.state.tables.values()) {\n rows.push([\"main\", table.name, \"table\", table.columns.length, table.withoutRowid ? 1 : 0, table.strict ? 1 : 0]);\n }\n for (const view of env.state.views.values()) {\n const ncol = view.columns?.length ?? 0;\n rows.push([\"main\", view.name, \"view\", ncol, 0, 0]);\n }\n for (const vt of env.state.virtualTables.values()) {\n rows.push([\"main\", vt.name, \"virtual\", vt.columns.length, 0, 0]);\n }\n rows.push([\"main\", \"sqlite_schema\", \"table\", 5, 0, 0]);\n rows.push([\"temp\", \"sqlite_temp_schema\", \"table\", 5, 0, 0]);\n for (const [schema] of env.state.attached) {\n rows.push([schema, \"sqlite_schema\", \"table\", 5, 0, 0]);\n }\n return { columns, rows };\n}\n\nfunction pragmaFunctionList(): PragmaQueryResult {\n const columns = [\"name\", \"builtin\", \"type\", \"enc\", \"narg\", \"flags\"];\n const rows: SqlValue[][] = [];\n const add = (name: string, type: string, narg: number, flags: number): void => {\n rows.push([name, 1, type, \"utf8\", narg, flags]);\n };\n for (const name of Object.keys(getScalarFunctions())) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(dateTimeFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(jsonScalarFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(mathFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(ftsAuxFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(rtreeAuxFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(aggregateFunctions)) {\n add(name, \"w\", name === \"count\" ? 0 : 1, 2097152);\n if (name === \"count\") add(name, \"w\", 1, 2097152);\n }\n for (const name of Object.keys(jsonAggregateFunctions)) add(name, \"w\", -1, 2097152);\n for (const name of Object.keys(windowFunctions)) add(name, \"w\", -1, 2097152);\n for (const name of [\"generate_series\", \"json_each\", \"json_tree\"]) {\n add(name, \"s\", -1, 2099200);\n }\n rows.sort((a, b) => String(a[0]).localeCompare(String(b[0])) || Number(a[4]) - Number(b[4]));\n return { columns, rows };\n}\n\nfunction pragmaModuleList(): PragmaQueryResult {\n const names = new Set<string>([\n ...MEMORY_VTABLE_MODULES,\n ...PRAGMA_TVF_NAMES.map((n) => `pragma_${n}`),\n \"generate_series\",\n \"json_each\",\n \"json_tree\",\n ]);\n return {\n columns: [\"name\"],\n rows: [...names].sort((a, b) => a.localeCompare(b)).map((name) => [name]),\n };\n}\n\nfunction requireNameArg(args: readonly SqlValue[], pragma: string): string {\n if (args.length === 0 || args[0] == null) {\n throw new SqliteError(`missing pragma argument for ${pragma}`, \"misuse\");\n }\n const value = args[0];\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n throw new SqliteError(`invalid pragma argument for ${pragma}`, \"misuse\");\n}\n\n/** Evaluate a statement-form pragma argument expression to a SQL value list. */\nexport function evalPragmaArgs(expr: Expr | null, env: ExecutionEnv): SqlValue[] {\n if (expr === null) return [];\n if (expr.type === \"column\" && expr.table === null) return [expr.name];\n if (expr.type === \"literal\") return [expr.value as SqlValue];\n return [evalExpr(expr, env.createEvalContext())];\n}\n\nexport function evalPragmaSetValue(expr: Expr, env: ExecutionEnv): SqlValue {\n if (expr.type === \"column\" && expr.table === null) {\n const keyword = expr.name.toLowerCase();\n if (keyword === \"on\" || keyword === \"true\" || keyword === \"yes\") return 1;\n if (keyword === \"off\" || keyword === \"false\" || keyword === \"no\") return 0;\n return expr.name;\n }\n return evalExpr(expr, env.createEvalContext());\n}\n\nexport function coercePragmaInt(value: SqlValue): number {\n if (typeof value === \"number\") return Math.trunc(value);\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"string\") {\n const n = Number.parseInt(value, 10);\n return Number.isFinite(n) ? n : 0;\n }\n const asInt = toInteger(value);\n return asInt === null ? 0 : typeof asInt === \"bigint\" ? Number(asInt) : asInt;\n}\n\nexport function coercePragmaTruthy(value: SqlValue): boolean {\n return isTruthySql(value) === true;\n}\n", "import type { ExecutionEnv, ScopeRow } from \"../executor/env.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport interface TableValuedResult {\n columns: string[];\n rows: ScopeRow[];\n}\n\nexport type TableValuedFn = (args: SqlValue[], alias: string | null, env: ExecutionEnv) => TableValuedResult;\n\nconst registry = new Map<string, TableValuedFn>();\n\nexport function registerTableValuedFunction(name: string, fn: TableValuedFn): void {\n registry.set(name.toLowerCase(), fn);\n}\n\nexport function getTableValuedFunction(name: string): TableValuedFn | undefined {\n return registry.get(name.toLowerCase());\n}\n\nexport function listRegisteredTableValuedFunctions(): string[] {\n return [...registry.keys()].sort();\n}\n\nexport function hasRegisteredTableValuedFunction(name: string): boolean {\n return registry.has(name.toLowerCase());\n}\n", "/**\n * Register all oracle-exposed `pragma_*` eponymous table-valued functions.\n * Imported for side effects from table-valued / select.\n */\nimport { isPragmaTvfName, PRAGMA_TVF_NAMES, queryPragma } from \"../executor/pragma-engine.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport { registerTableValuedFunction, type TableValuedResult } from \"./table-valued-registry.ts\";\n\nfunction toTvfResult(\n alias: string | null,\n defaultName: string,\n columns: string[],\n rows: SqlValue[][],\n): TableValuedResult {\n const table = alias ?? defaultName;\n return {\n columns,\n rows: rows.map((row) => ({\n cells: columns.map((name, index) => ({\n table,\n name,\n value: row[index] ?? null,\n })),\n })),\n };\n}\n\nlet registered = false;\n\n/** Idempotent registration of every oracle `pragma_*` TVF. */\nexport function ensurePragmaTvfsRegistered(): void {\n if (registered) return;\n registered = true;\n for (const baseName of PRAGMA_TVF_NAMES) {\n const tvfName = `pragma_${baseName}`;\n registerTableValuedFunction(tvfName, (args, alias, env) => {\n const result = queryPragma(baseName, args, env);\n return toTvfResult(alias, tvfName, result.columns, result.rows);\n });\n }\n}\n\nexport { isPragmaTvfName };\n", "import type { Expr } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"../executor/env.ts\";\nimport { pragmaTvfColumns } from \"../executor/pragma-engine.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { jsonEachRows, jsonTreeRows } from \"../json/tvf.ts\";\nimport { toInteger } from \"../types/value.ts\";\nimport { ensurePragmaTvfsRegistered } from \"./pragma-tvf.ts\";\nimport {\n getTableValuedFunction,\n hasRegisteredTableValuedFunction,\n listRegisteredTableValuedFunctions,\n registerTableValuedFunction,\n type TableValuedResult,\n} from \"./table-valued-registry.ts\";\n\nexport type { TableValuedResult };\nexport { registerTableValuedFunction };\n\nconst JSON_TVF_COLUMNS = [\"key\", \"value\", \"type\", \"atom\", \"id\", \"parent\", \"fullkey\", \"path\"] as const;\n\nfunction jsonTvfResult(\n alias: string | null,\n defaultName: string,\n rows: ReturnType<typeof jsonEachRows>,\n): TableValuedResult {\n const table = alias ?? defaultName;\n return {\n columns: [...JSON_TVF_COLUMNS],\n rows: rows.map((row) => ({\n cells: JSON_TVF_COLUMNS.map((name) => ({\n table,\n name,\n value: row[name],\n })),\n })),\n };\n}\n\nregisterTableValuedFunction(\"generate_series\", (args, alias) => {\n if (args.length < 2 || args.length > 3) {\n throw new SqliteError(\"wrong number of arguments to function generate_series()\", \"misuse\");\n }\n const start = toInteger(args[0] ?? null);\n const stop = toInteger(args[1] ?? null);\n const step = args.length === 3 ? toInteger(args[2] ?? null) : 1n;\n if (start === null || stop === null || step === null) {\n throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\");\n }\n if (step === 0n || step === 0) throw new SqliteError(\"step must not be zero\", \"misuse\");\n const startN = typeof start === \"bigint\" ? start : BigInt(start);\n const stopN = typeof stop === \"bigint\" ? stop : BigInt(stop);\n const stepN = typeof step === \"bigint\" ? step : BigInt(step);\n const table = alias ?? \"generate_series\";\n const rows: ScopeRow[] = [];\n if (stepN > 0n) {\n for (let value = startN; value <= stopN; value += stepN) {\n rows.push({\n cells: [{ table, name: \"value\", value: safeInt(value) }],\n });\n }\n } else {\n for (let value = startN; value >= stopN; value += stepN) {\n rows.push({\n cells: [{ table, name: \"value\", value: safeInt(value) }],\n });\n }\n }\n return { columns: [\"value\"], rows };\n});\n\nregisterTableValuedFunction(\"json_each\", (args, alias) => {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_each()\", \"misuse\");\n }\n return jsonTvfResult(alias, \"json_each\", jsonEachRows(args[0]!, args[1]));\n});\n\nregisterTableValuedFunction(\"json_tree\", (args, alias) => {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_tree()\", \"misuse\");\n }\n return jsonTvfResult(alias, \"json_tree\", jsonTreeRows(args[0]!, args[1]));\n});\n\nfunction safeInt(value: bigint): number | bigint {\n return value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER) ? Number(value) : value;\n}\n\n/**\n * Known output columns for a TVF without evaluating arguments.\n * Prefer this for FROM-item shape analysis when args may be correlated.\n */\nexport function tableValuedColumns(name: string): string[] | null {\n ensurePragmaTvfsRegistered();\n const lower = name.toLowerCase();\n if (lower === \"generate_series\") return [\"value\"];\n if (lower === \"json_each\" || lower === \"json_tree\") return [...JSON_TVF_COLUMNS];\n return pragmaTvfColumns(name);\n}\n\nexport function evaluateTableFunction(\n name: string,\n args: Expr[],\n alias: string | null,\n env: ExecutionEnv,\n scope?: ScopeRow | null,\n parent?: import(\"../expressions/context.ts\").EvalContext,\n): TableValuedResult {\n ensurePragmaTvfsRegistered();\n const fn = getTableValuedFunction(name);\n if (!fn) throw new SqliteError(`no such table-valued function: ${name}`, \"no_such_table\");\n const values = args.map((arg) => evalExpr(arg, env.createEvalContext(scope ?? null, parent)));\n return fn(values, alias, env);\n}\n\nexport function listTableValuedFunctions(): string[] {\n ensurePragmaTvfsRegistered();\n return listRegisteredTableValuedFunctions();\n}\n\nexport function hasTableValuedFunction(name: string): boolean {\n ensurePragmaTvfsRegistered();\n return hasRegisteredTableValuedFunction(name);\n}\n", "import type { DatabaseState } from \"../storage/database-state.ts\";\nimport { makeColumnInfo, Table } from \"../storage/table.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport type SchemaObjectType = \"table\" | \"index\" | \"view\" | \"trigger\";\n\nexport interface SchemaCatalogRow {\n type: SchemaObjectType;\n name: string;\n tbl_name: string;\n rootpage: number;\n sql: string | null;\n}\n\nexport function schemaCatalogRows(state: DatabaseState): SchemaCatalogRow[] {\n const tables = [...state.tables.values()].sort((a, b) => compareNames(a.name, b.name));\n const indexes = [...state.indexes.values()].sort((a, b) => compareNames(a.name, b.name));\n const views = [...state.views.values()].sort((a, b) => compareNames(a.name, b.name));\n const triggers = [...state.triggers.values()].sort((a, b) => compareNames(a.name, b.name));\n\n const rows: SchemaCatalogRow[] = [];\n let rootpage = 2;\n\n for (const table of tables) {\n rows.push({\n type: \"table\",\n name: table.name,\n tbl_name: table.name,\n rootpage: rootpage++,\n sql: table.originalSql,\n });\n }\n for (const index of indexes) {\n rows.push({\n type: \"index\",\n name: index.name,\n tbl_name: index.tableName,\n rootpage: rootpage++,\n sql: index.originalSql,\n });\n }\n for (const view of views) {\n rows.push({\n type: \"view\",\n name: view.name,\n tbl_name: view.name,\n rootpage: 0,\n sql: view.originalSql,\n });\n }\n for (const trigger of triggers) {\n rows.push({\n type: \"trigger\",\n name: trigger.name,\n tbl_name: trigger.tableName,\n rootpage: 0,\n sql: trigger.originalSql,\n });\n }\n return rows;\n}\n\n/** Locale-independent UTF-16 code-unit order for stable catalog/snapshot encoding. */\nfunction compareNames(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nexport function buildSchemaCatalog(state: DatabaseState, name = \"sqlite_schema\"): Table {\n const catalog = new Table(name, [\n makeColumnInfo(\"type\", \"TEXT\"),\n makeColumnInfo(\"name\", \"TEXT\"),\n makeColumnInfo(\"tbl_name\", \"TEXT\"),\n makeColumnInfo(\"rootpage\", \"INTEGER\"),\n makeColumnInfo(\"sql\", \"TEXT\"),\n ]);\n\n for (const row of schemaCatalogRows(state)) {\n catalog.insert({\n values: {\n type: row.type,\n name: row.name,\n tbl_name: row.tbl_name,\n rootpage: row.rootpage,\n sql: row.sql,\n } satisfies Record<string, SqlValue>,\n });\n }\n return catalog;\n}\n\nexport function buildSqliteSchema(state: DatabaseState): Table {\n return buildSchemaCatalog(state, \"sqlite_schema\");\n}\n\nexport function buildSqliteMaster(state: DatabaseState): Table {\n return buildSchemaCatalog(state, \"sqlite_master\");\n}\n", "import type { Expr } from \"../ast/nodes.ts\";\n\n/** Structural equality for matching WHERE expressions to index expressions. */\nexport function exprEquals(left: Expr, right: Expr): boolean {\n if (left.type !== right.type) return false;\n switch (left.type) {\n case \"null\":\n return true;\n case \"literal\":\n return right.type === \"literal\" && valuesEqual(left.value, right.value);\n case \"column\":\n return (\n right.type === \"column\" &&\n (left.table ?? \"\").toLowerCase() === (right.table ?? \"\").toLowerCase() &&\n left.name.toLowerCase() === right.name.toLowerCase()\n );\n case \"unary\":\n return right.type === \"unary\" && left.op === right.op && exprEquals(left.expr, right.expr);\n case \"is_bool\":\n return (\n right.type === \"is_bool\" &&\n left.not === right.not &&\n left.sense === right.sense &&\n exprEquals(left.expr, right.expr)\n );\n case \"binary\":\n return (\n right.type === \"binary\" &&\n left.op === right.op &&\n exprEquals(left.left, right.left) &&\n exprEquals(left.right, right.right)\n );\n case \"function\":\n return (\n right.type === \"function\" &&\n left.name.toLowerCase() === right.name.toLowerCase() &&\n left.distinct === right.distinct &&\n argsEqual(left.args, right.args)\n );\n case \"collate\":\n return (\n right.type === \"collate\" &&\n left.collation.toLowerCase() === right.collation.toLowerCase() &&\n exprEquals(left.expr, right.expr)\n );\n case \"cast\":\n return (\n right.type === \"cast\" &&\n (left.typeName ?? \"\").toUpperCase() === (right.typeName ?? \"\").toUpperCase() &&\n exprEquals(left.expr, right.expr)\n );\n default:\n return JSON.stringify(left) === JSON.stringify(right);\n }\n}\n\nfunction argsEqual(left: Expr[] | \"*\", right: Expr[] | \"*\"): boolean {\n if (left === \"*\" || right === \"*\") return left === right;\n if (left.length !== right.length) return false;\n return left.every((expr, index) => exprEquals(expr, right[index]!));\n}\n\nfunction valuesEqual(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (left instanceof Uint8Array && right instanceof Uint8Array) {\n if (left.length !== right.length) return false;\n return left.every((byte, index) => byte === right[index]);\n }\n return false;\n}\n", "import type { Expr, FromItem, TableRef } from \"../ast/nodes.ts\";\nimport type { ExecutionEnv } from \"../executor/env.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { exprEquals } from \"../expressions/equals.ts\";\nimport type { IndexInfo } from \"../storage/database-state.ts\";\nimport type { Row, Rowid } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport interface ConstEquality {\n table: string | null;\n column: string;\n valueExpr: Expr;\n}\n\nexport function conjunctions(expr: Expr): Expr[] {\n if (expr.type === \"binary\" && expr.op === \"AND\") {\n return [...conjunctions(expr.left), ...conjunctions(expr.right)];\n }\n return [expr];\n}\n\nfunction isRowIndependentExpr(expr: Expr): boolean {\n return expr.type !== \"column\";\n}\n\nexport function equalityAgainstConst(expr: Expr): ConstEquality | null {\n if (expr.type !== \"binary\" || (expr.op !== \"=\" && expr.op !== \"==\")) return null;\n if (expr.left.type === \"column\" && isRowIndependentExpr(expr.right)) {\n return { table: expr.left.table, column: expr.left.name, valueExpr: expr.right };\n }\n if (expr.right.type === \"column\" && isRowIndependentExpr(expr.left)) {\n return { table: expr.right.table, column: expr.right.name, valueExpr: expr.left };\n }\n return null;\n}\n\nexport function equalityAgainstExpr(expr: Expr): { expr: Expr; valueExpr: Expr } | null {\n if (expr.type !== \"binary\" || (expr.op !== \"=\" && expr.op !== \"==\")) return null;\n if (expr.left.type !== \"column\" && isRowIndependentExpr(expr.right)) {\n return { expr: expr.left, valueExpr: expr.right };\n }\n if (expr.right.type !== \"column\" && isRowIndependentExpr(expr.left)) {\n return { expr: expr.right, valueExpr: expr.left };\n }\n return null;\n}\n\nexport function whereFullyCovered(where: Expr, coveredColumns: Set<string>, alias: string, tableName: string): boolean {\n for (const part of conjunctions(where)) {\n const eq = equalityAgainstConst(part);\n if (!eq) return false;\n if (!matchesTable(eq.table, alias, tableName)) return false;\n const col = eq.column.toLowerCase();\n if (!coveredColumns.has(col) && !isRowidName(eq.column)) return false;\n }\n return true;\n}\n\nfunction matchesTable(table: string | null, alias: string, tableName: string): boolean {\n if (table === null) return true;\n const key = table.toLowerCase();\n return key === alias.toLowerCase() || key === tableName.toLowerCase();\n}\n\nfunction isRowidName(name: string): boolean {\n const key = name.toLowerCase();\n return key === \"rowid\" || key === \"_rowid_\" || key === \"oid\";\n}\n\nexport interface TableRowLookup {\n table: Table;\n alias: string;\n rows: Row[];\n /** Lowercased columns whose equality predicates were applied by the access path. */\n coveredColumns: Set<string>;\n}\n\n/** Look up rows for a simple `FROM table WHERE ...` using PK, a covering equality index, or an automatic hash. */\nexport function tryIndexedTableRows(from: FromItem, where: Expr, env: ExecutionEnv): TableRowLookup | null {\n if (from.type !== \"table\") return null;\n return lookupTableRows(from, where, env);\n}\n\nexport function lookupTableRows(from: TableRef, where: Expr, env: ExecutionEnv): TableRowLookup | null {\n const alias = from.alias ?? from.name;\n const qualified = from.schema ? `${from.schema}.${from.name}` : from.name;\n const db = env.state.databaseForSchema(from.schema, qualified);\n if (from.name.toLowerCase() === \"sqlite_schema\" || from.name.toLowerCase() === \"sqlite_master\") return null;\n if (db.virtualTables.has(from.name.toLowerCase()) || db.views.has(from.name.toLowerCase())) return null;\n if (env.ctes.has(from.name.toLowerCase())) return null;\n\n let table: Table;\n try {\n table = db.getTable(from.name);\n } catch {\n return null;\n }\n\n const parts = conjunctions(where);\n const equalities = parts\n .map(equalityAgainstConst)\n .filter((item): item is ConstEquality => item !== null)\n .filter((item) => matchesTable(item.table, alias, table.name));\n\n const evalConst = (expr: Expr): SqlValue | undefined => {\n try {\n return evalExpr(expr, env.createEvalContext(null));\n } catch {\n return undefined;\n }\n };\n\n const resolved: { table: string | null; column: string; value: SqlValue }[] = [];\n for (const eq of equalities) {\n const value = evalConst(eq.valueExpr);\n if (value === undefined) continue;\n resolved.push({ table: eq.table, column: eq.column, value });\n }\n\n const pk = table.integerPkColumn();\n for (const eq of resolved) {\n const col = eq.column.toLowerCase();\n if (isRowidName(eq.column) || (pk && col === pk.name.toLowerCase())) {\n const row = table.getByKey(eq.value);\n const coveredColumns = new Set<string>([col, \"rowid\", \"_rowid_\", \"oid\"]);\n if (pk) coveredColumns.add(pk.nameLower ?? pk.name.toLowerCase());\n if (row) return { table, alias, rows: [row], coveredColumns };\n if (eq.value === null || typeof eq.value === \"number\" || typeof eq.value === \"bigint\") {\n return { table, alias, rows: [], coveredColumns };\n }\n return null;\n }\n }\n\n const byColumn = new Map<string, SqlValue>();\n for (const eq of resolved) byColumn.set(eq.column.toLowerCase(), eq.value);\n\n let best: { rowids: readonly Rowid[]; columns: string[] } | null = null;\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index) continue;\n if (index.where && !parts.some((part) => exprEquals(part, index.where!))) continue;\n\n if (index.columns.some((column) => column.expr)) {\n const prefix: SqlValue[] = [];\n for (const column of index.columns) {\n if (!column.expr) {\n const value = byColumn.get(column.name.toLowerCase());\n if (value === undefined) break;\n prefix.push(normalizeForCollation(value, column.collate ?? \"BINARY\"));\n continue;\n }\n const match = parts.map(equalityAgainstExpr).find((item) => item && exprEquals(item.expr, column.expr!));\n if (!match) break;\n const value = evalConst(match.valueExpr);\n if (value === undefined) break;\n prefix.push(normalizeForCollation(value, column.collate ?? \"BINARY\"));\n }\n if (prefix.length === 0) continue;\n const rowids =\n prefix.length === index.columns.length ? index.store.lookup(prefix) : index.store.lookupPrefix(prefix);\n best = { rowids, columns: index.columns.map((column) => column.name.toLowerCase()) };\n if (index.unique || rowids.length <= 1) break;\n continue;\n }\n\n const prefix: SqlValue[] = [];\n for (const column of index.columns) {\n const value = byColumn.get(column.name.toLowerCase());\n if (value === undefined) break;\n prefix.push(normalizeForCollation(value, column.collate ?? \"BINARY\"));\n }\n if (prefix.length === 0) continue;\n const rowids =\n prefix.length === index.columns.length ? index.store.lookup(prefix) : index.store.lookupPrefix(prefix);\n best = { rowids, columns: index.columns.slice(0, prefix.length).map((column) => column.name.toLowerCase()) };\n if (index.unique && prefix.length === index.columns.length) break;\n if (rowids.length <= 1) break;\n }\n\n if (best) {\n const rows: Row[] = [];\n for (const rowid of best.rowids) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n }\n rows.sort((a, b) => compareRowids(a.rowid, b.rowid));\n return { table, alias, rows, coveredColumns: new Set(best.columns) };\n }\n\n for (const eq of resolved) {\n const col = eq.column.toLowerCase();\n if (isRowidName(eq.column)) continue;\n const hashed = table.lookupEquality(col, eq.value);\n if (!hashed) continue;\n hashed.sort((a, b) => compareRowids(a.rowid, b.rowid));\n return { table, alias, rows: hashed, coveredColumns: new Set([col]) };\n }\n\n const range = rangeAgainstConst(where) ?? rangeFromBetween(where);\n if (range && matchesTable(range.table, alias, table.name)) {\n const value = evalConst(range.valueExpr);\n const value2 = range.valueExpr2 ? evalConst(range.valueExpr2) : undefined;\n if (value !== undefined) {\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index || index.where || index.columns.length !== 1) continue;\n if (index.columns[0]!.expr) continue;\n if (index.columns[0]!.name.toLowerCase() !== range.column.toLowerCase()) continue;\n const bound = normalizeForCollation(value, index.columns[0]!.collate ?? \"BINARY\");\n const bound2 =\n value2 !== undefined ? normalizeForCollation(value2, index.columns[0]!.collate ?? \"BINARY\") : undefined;\n const rowids = index.store.rangeLookup(range.op, bound, bound2);\n const rows: Row[] = [];\n for (const rowid of rowids) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n }\n return { table, alias, rows, coveredColumns: new Set([range.column.toLowerCase()]) };\n }\n }\n }\n\n return null;\n}\n\nfunction rangeAgainstConst(\n expr: Expr,\n): { table: string | null; column: string; op: \">\" | \">=\" | \"<\" | \"<=\"; valueExpr: Expr; valueExpr2?: Expr } | null {\n if (expr.type !== \"binary\") return null;\n const op = expr.op;\n if (op !== \">\" && op !== \">=\" && op !== \"<\" && op !== \"<=\") return null;\n if (expr.left.type === \"column\" && isRowIndependentExpr(expr.right)) {\n return { table: expr.left.table, column: expr.left.name, op, valueExpr: expr.right };\n }\n if (expr.right.type === \"column\" && isRowIndependentExpr(expr.left)) {\n const flipped = op === \">\" ? \"<\" : op === \">=\" ? \"<=\" : op === \"<\" ? \">\" : \">=\";\n return { table: expr.right.table, column: expr.right.name, op: flipped, valueExpr: expr.left };\n }\n return null;\n}\n\nfunction rangeFromBetween(\n expr: Expr,\n): { table: string | null; column: string; op: \"between\"; valueExpr: Expr; valueExpr2: Expr } | null {\n if (expr.type !== \"between\" || expr.not || expr.expr.type !== \"column\") return null;\n return {\n table: expr.expr.table,\n column: expr.expr.name,\n op: \"between\",\n valueExpr: expr.lower,\n valueExpr2: expr.upper,\n };\n}\n\nexport function tryIndexedOrder(\n from: FromItem,\n order: { expr: Expr; dir: \"ASC\" | \"DESC\" },\n env: ExecutionEnv,\n limit?: number,\n): TableRowLookup | null {\n if (from.type !== \"table\" || order.expr.type !== \"column\") return null;\n const alias = from.alias ?? from.name;\n const db = env.state.databaseForSchema(from.schema, from.schema ? `${from.schema}.${from.name}` : from.name);\n let table: Table;\n try {\n table = db.getTable(from.name);\n } catch {\n return null;\n }\n const col = order.expr.name.toLowerCase();\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index || index.where || index.columns.length !== 1 || index.columns[0]!.expr) continue;\n if (index.columns[0]!.name.toLowerCase() !== col) continue;\n const desc = order.dir === \"DESC\";\n const rows: Row[] = [];\n for (const rowid of index.store.orderedRowids(desc)) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n if (limit !== undefined && rows.length >= limit) break;\n }\n return { table, alias, rows, coveredColumns: new Set([col]) };\n }\n return null;\n}\n\nfunction compareRowids(left: Rowid, right: Rowid): number {\n const a = typeof left === \"bigint\" ? left : BigInt(left);\n const b = typeof right === \"bigint\" ? right : BigInt(right);\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nexport interface JoinProbe {\n table: Table;\n alias: string;\n /** When true, ON is fully applied by the probe (skip re-eval). */\n covering: boolean;\n lookup: (leftCellsValue: (table: string | null, name: string) => SqlValue) => Row[];\n}\n\n/** Equality join keys extracted from ON (column = column), for hash join when no index probe. */\nexport interface JoinEqualityKeys {\n /** Right-side column names in join-key order. */\n rightColumns: string[];\n /** Corresponding left-side (probe) column references. */\n leftKeys: { table: string | null; column: string }[];\n}\n\nexport function tryJoinEqualityKeys(right: FromItem, on: Expr | null, env?: ExecutionEnv): JoinEqualityKeys | null {\n if (!on || right.type !== \"table\") return null;\n if (env) {\n const db = env.state.databaseForSchema(right.schema, right.schema ? `${right.schema}.${right.name}` : right.name);\n if (db.virtualTables.has(right.name.toLowerCase()) || db.views.has(right.name.toLowerCase())) return null;\n if (env.ctes.has(right.name.toLowerCase())) return null;\n }\n const alias = right.alias ?? right.name;\n const pairs: { rightColumn: string; leftTable: string | null; leftColumn: string }[] = [];\n for (const part of conjunctions(on)) {\n if (part.type !== \"binary\" || (part.op !== \"=\" && part.op !== \"==\")) continue;\n if (part.left.type !== \"column\" || part.right.type !== \"column\") continue;\n const leftOnRight = columnOnTable(part.left, alias, right.name);\n const rightOnRight = columnOnTable(part.right, alias, right.name);\n if (leftOnRight && !rightOnRight) {\n pairs.push({ rightColumn: part.left.name, leftTable: part.right.table, leftColumn: part.right.name });\n } else if (rightOnRight && !leftOnRight) {\n pairs.push({ rightColumn: part.right.name, leftTable: part.left.table, leftColumn: part.left.name });\n }\n }\n if (pairs.length === 0) return null;\n // Require the entire ON to be only equality conjunctions (no leftover predicates).\n const parts = conjunctions(on);\n if (parts.length !== pairs.length) return null;\n for (const part of parts) {\n if (part.type !== \"binary\" || (part.op !== \"=\" && part.op !== \"==\")) return null;\n if (part.left.type !== \"column\" || part.right.type !== \"column\") return null;\n }\n // rowid join keys need ScopeRow.rowid, not a regular cell \u2014 keep nested loop.\n if (pairs.some((pair) => isRowidName(pair.rightColumn))) return null;\n return {\n rightColumns: pairs.map((pair) => pair.rightColumn),\n leftKeys: pairs.map((pair) => ({ table: pair.leftTable, column: pair.leftColumn })),\n };\n}\n\nexport function tryJoinProbe(right: FromItem, on: Expr | null, env: ExecutionEnv): JoinProbe | null {\n if (!on || right.type !== \"table\") return null;\n const alias = right.alias ?? right.name;\n const db = env.state.databaseForSchema(right.schema, right.schema ? `${right.schema}.${right.name}` : right.name);\n if (db.virtualTables.has(right.name.toLowerCase()) || db.views.has(right.name.toLowerCase())) return null;\n if (env.ctes.has(right.name.toLowerCase())) return null;\n let table: Table;\n try {\n table = db.getTable(right.name);\n } catch {\n return null;\n }\n\n const pairs: { rightColumn: string; leftTable: string | null; leftColumn: string }[] = [];\n for (const part of conjunctions(on)) {\n if (part.type !== \"binary\" || (part.op !== \"=\" && part.op !== \"==\")) continue;\n if (part.left.type !== \"column\" || part.right.type !== \"column\") continue;\n const leftOnRight = columnOnTable(part.left, alias, table.name);\n const rightOnRight = columnOnTable(part.right, alias, table.name);\n if (leftOnRight && !rightOnRight) {\n pairs.push({ rightColumn: part.left.name, leftTable: part.right.table, leftColumn: part.right.name });\n } else if (rightOnRight && !leftOnRight) {\n pairs.push({ rightColumn: part.right.name, leftTable: part.left.table, leftColumn: part.left.name });\n }\n }\n if (pairs.length === 0) return null;\n\n const pk = table.integerPkColumn();\n const pkPair = pairs.find(\n (pair) => isRowidName(pair.rightColumn) || (pk && pair.rightColumn.toLowerCase() === pk.name.toLowerCase()),\n );\n if (pkPair) {\n return {\n table,\n alias,\n covering: pairs.length === 1,\n lookup: (getLeft) => {\n const value = getLeft(pkPair.leftTable, pkPair.leftColumn);\n const row = table.getByKey(value);\n return row ? [row] : [];\n },\n };\n }\n\n for (const indexName of table.indexes) {\n const index: IndexInfo | undefined = db.indexes.get(indexName.toLowerCase());\n if (!index || index.where) continue;\n const prefixPairs: typeof pairs = [];\n for (const column of index.columns) {\n const pair = pairs.find((item) => item.rightColumn.toLowerCase() === column.name.toLowerCase());\n if (!pair) break;\n prefixPairs.push(pair);\n }\n if (prefixPairs.length !== index.columns.length) continue;\n return {\n table,\n alias,\n covering: prefixPairs.length === pairs.length,\n lookup: (getLeft) => {\n const values = prefixPairs.map((pair, i) =>\n normalizeForCollation(getLeft(pair.leftTable, pair.leftColumn), index.columns[i]?.collate ?? \"BINARY\"),\n );\n const rows: Row[] = [];\n for (const rowid of index.store.lookup(values)) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n }\n rows.sort((a, b) => compareRowids(a.rowid, b.rowid));\n return rows;\n },\n };\n }\n\n if (pairs.length === 1) {\n const pair = pairs[0]!;\n const col = pair.rightColumn.toLowerCase();\n if (!isRowidName(pair.rightColumn) && table.ensureEqualityHash(col)) {\n return {\n table,\n alias,\n covering: true,\n lookup: (getLeft) => {\n const rows = table.lookupEquality(col, getLeft(pair.leftTable, pair.leftColumn));\n return rows ?? [];\n },\n };\n }\n }\n return null;\n}\n\nfunction columnOnTable(column: { table: string | null; name: string }, alias: string, tableName: string): boolean {\n return column.table !== null && matchesTable(column.table, alias, tableName);\n}\n", "import type { Expr, ResultColumn, SelectStmt } from \"../ast/nodes.ts\";\nimport { conjunctions, equalityAgainstConst, lookupTableRows, tryJoinEqualityKeys } from \"../planner/access.ts\";\nimport type { Row } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { compareSql, toInteger, type SqlValue } from \"../types/value.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { type ResultSet, valuesToResult } from \"./result.ts\";\n\n/**\n * Tight path for `SELECT cols FROM table WHERE col = ?` (no join/group/order).\n * Skips ScopeRow / evalExpr and honors maxRows during the scan.\n */\nexport function tryExecuteSimpleSelect(stmt: SelectStmt, env: ExecutionEnv): ResultSet | null {\n if (stmt.with || stmt.compound || stmt.distinct || stmt.groupBy.length > 0 || stmt.having || stmt.windows.length > 0)\n return null;\n if (stmt.orderBy.length > 0) return null;\n if (stmt.from?.type !== \"table\") return null;\n for (const column of stmt.columns) {\n if (column.type === \"star\") continue;\n if (column.expr.type !== \"column\") return null;\n }\n\n const from = stmt.from;\n const nameKey = from.name.toLowerCase();\n if (nameKey === \"sqlite_schema\" || nameKey === \"sqlite_master\") return null;\n if (env.ctes.has(nameKey)) return null;\n const qualified = from.schema ? `${from.schema}.${from.name}` : from.name;\n const db = env.state.databaseForSchema(from.schema, qualified);\n if (db.virtualTables.has(nameKey) || db.views.has(nameKey)) return null;\n\n let table: Table;\n try {\n table = db.getTable(from.name);\n } catch {\n return null;\n }\n if (table.withoutRowid) return null;\n if (table.columns.some((column) => column.generated && !column.generated.stored)) return null;\n\n const alias = from.alias ?? from.name;\n const aliasLower = alias.toLowerCase();\n const tableLower = table.name.toLowerCase();\n for (const column of stmt.columns) {\n if (column.type === \"star\") continue;\n if (column.expr.type !== \"column\") return null;\n const tableRef = column.expr.table?.toLowerCase();\n if (tableRef && tableRef !== aliasLower && tableRef !== tableLower && tableRef !== nameKey) return null;\n const key = column.expr.name.toLowerCase();\n if (isRowidName(key)) continue;\n if (!table.columns.some((item) => (item.nameLower ?? item.name.toLowerCase()) === key)) return null;\n }\n\n const filters: { column: string; value: SqlValue }[] = [];\n if (stmt.where) {\n for (const part of conjunctions(stmt.where)) {\n const eq = equalityAgainstConst(part);\n if (!eq) return null;\n let value: SqlValue;\n try {\n value = evalIndependent(eq.valueExpr, env);\n } catch {\n return null;\n }\n filters.push({ column: eq.column.toLowerCase(), value });\n }\n }\n\n let limit = env.maxRows;\n let offset = 0;\n if (stmt.limit) {\n try {\n const limitValue = toInteger(evalIndependent(stmt.limit.limit, env));\n const offsetValue = stmt.limit.offset ? toInteger(evalIndependent(stmt.limit.offset, env)) : 0;\n if (limitValue === null || offsetValue === null) return null;\n offset = Math.max(0, Number(offsetValue));\n const n = Number(limitValue);\n if (n >= 0) limit = Math.min(limit, n);\n } catch {\n return null;\n }\n }\n const columns = projectNames(stmt.columns, table);\n if (limit <= 0) return pack(env, columns, []);\n\n let source: Iterable<Row> = table.scan();\n let alreadyFiltered = false;\n if (stmt.where) {\n const indexed = lookupTableRows(from, stmt.where, env);\n if (indexed) {\n source = indexed.rows;\n alreadyFiltered = true;\n }\n }\n\n const projectors = projectionFns(stmt.columns, table);\n const values: SqlValue[][] = [];\n let skipped = 0;\n\n for (const row of source) {\n if (!alreadyFiltered && filters.length > 0 && !rowMatches(row, filters)) continue;\n if (skipped < offset) {\n skipped++;\n continue;\n }\n values.push(projectors.map((fn) => fn(row)));\n if (values.length >= limit) break;\n }\n\n return pack(env, columns, values);\n}\n\nexport function tryExecuteSimpleJoin(stmt: SelectStmt, env: ExecutionEnv): ResultSet | null {\n if (stmt.with || stmt.compound || stmt.distinct || stmt.groupBy.length > 0 || stmt.having || stmt.windows.length > 0)\n return null;\n if (stmt.orderBy.length > 0 || stmt.limit || stmt.where) return null;\n if (stmt.from?.type !== \"join\") return null;\n const join = stmt.from;\n if ((join.joinType !== \"INNER\" && join.joinType !== \"CROSS\") || join.using || !join.on) return null;\n if (join.left.type !== \"table\" || join.right.type !== \"table\") return null;\n const keys = tryJoinEqualityKeys(join.right, join.on, env);\n if (keys?.rightColumns.length !== 1) return null;\n\n const leftRef = join.left;\n const rightRef = join.right;\n const leftDb = env.state.databaseForSchema(\n leftRef.schema,\n leftRef.schema ? `${leftRef.schema}.${leftRef.name}` : leftRef.name,\n );\n const rightDb = env.state.databaseForSchema(\n rightRef.schema,\n rightRef.schema ? `${rightRef.schema}.${rightRef.name}` : rightRef.name,\n );\n if (env.ctes.has(leftRef.name.toLowerCase()) || env.ctes.has(rightRef.name.toLowerCase())) return null;\n if (leftDb.views.has(leftRef.name.toLowerCase()) || rightDb.views.has(rightRef.name.toLowerCase())) return null;\n if (leftDb.virtualTables.has(leftRef.name.toLowerCase()) || rightDb.virtualTables.has(rightRef.name.toLowerCase()))\n return null;\n\n let leftTable: Table;\n let rightTable: Table;\n try {\n leftTable = leftDb.getTable(leftRef.name);\n rightTable = rightDb.getTable(rightRef.name);\n } catch {\n return null;\n }\n if (leftTable.withoutRowid || rightTable.withoutRowid) return null;\n\n const leftAlias = (leftRef.alias ?? leftRef.name).toLowerCase();\n const rightAlias = (rightRef.alias ?? rightRef.name).toLowerCase();\n const rightCol = keys.rightColumns[0]!.toLowerCase();\n const leftCol = keys.leftKeys[0]!.column.toLowerCase();\n if (!rightTable.ensureEqualityHash(rightCol)) return null;\n\n const names: string[] = [];\n const projectors: ((left: Row, right: Row) => SqlValue)[] = [];\n for (const column of stmt.columns) {\n if (column.type !== \"expr\" || column.expr.type !== \"column\") return null;\n const tableRef = column.expr.table?.toLowerCase() ?? null;\n const key = column.expr.name.toLowerCase();\n const onLeft =\n tableRef === null\n ? leftTable.columns.some((item) => (item.nameLower ?? item.name.toLowerCase()) === key)\n : tableRef === leftAlias || tableRef === leftTable.name.toLowerCase();\n const onRight =\n tableRef === null\n ? rightTable.columns.some((item) => (item.nameLower ?? item.name.toLowerCase()) === key)\n : tableRef === rightAlias || tableRef === rightTable.name.toLowerCase();\n if (onLeft === onRight) return null;\n names.push(column.alias ?? column.expr.name);\n if (onLeft) {\n if (isRowidName(key)) projectors.push((left) => left.rowid);\n else projectors.push((left) => left.values.get(key) ?? null);\n } else {\n if (isRowidName(key)) projectors.push((_left, right) => right.rowid);\n else projectors.push((_left, right) => right.values.get(key) ?? null);\n }\n }\n\n const values: SqlValue[][] = [];\n for (const left of leftTable.scan()) {\n const matches = rightTable.lookupEquality(rightCol, left.values.get(leftCol) ?? null);\n if (!matches) return null;\n for (const right of matches) values.push(projectors.map((fn) => fn(left, right)));\n }\n return pack(env, names, values);\n}\n\nfunction rowMatches(row: Row, filters: { column: string; value: SqlValue }[]): boolean {\n for (const filter of filters) {\n if (isRowidName(filter.column)) {\n if (compareSql(row.rowid, filter.value) !== 0) return false;\n continue;\n }\n if (compareSql(row.values.get(filter.column) ?? null, filter.value) !== 0) return false;\n }\n return true;\n}\n\nfunction projectNames(columns: ResultColumn[], table: Table): string[] {\n const names: string[] = [];\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const item of table.columns) names.push(item.name);\n continue;\n }\n if (column.alias) {\n names.push(column.alias);\n continue;\n }\n const key = column.expr.type === \"column\" ? column.expr.name.toLowerCase() : \"\";\n if (isRowidName(key)) names.push(table.integerPkColumn()?.name ?? \"rowid\");\n else names.push(column.expr.type === \"column\" ? column.expr.name : \"?column?\");\n }\n return names;\n}\n\nfunction projectionFns(columns: ResultColumn[], table: Table): ((row: Row) => SqlValue)[] {\n const fns: ((row: Row) => SqlValue)[] = [];\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const item of table.columns) {\n const key = item.nameLower ?? item.name.toLowerCase();\n fns.push((row) => row.values.get(key) ?? null);\n }\n continue;\n }\n const expr = column.expr;\n if (expr.type !== \"column\") continue;\n const key = expr.name.toLowerCase();\n if (isRowidName(key)) fns.push((row) => row.rowid);\n else fns.push((row) => row.values.get(key) ?? null);\n }\n return fns;\n}\n\nfunction evalIndependent(expr: Expr, env: ExecutionEnv): SqlValue {\n if (expr.type === \"literal\") return expr.value;\n if (expr.type === \"null\") return null;\n if (expr.type === \"parameter\") return env.getBoundParameter(expr.name);\n if (expr.type === \"unary\" && expr.op === \"-\" && expr.expr.type === \"literal\" && typeof expr.expr.value === \"number\") {\n return -expr.expr.value;\n }\n throw new Error(\"not independent\");\n}\n\nfunction isRowidName(name: string): boolean {\n return name === \"rowid\" || name === \"_rowid_\" || name === \"oid\";\n}\n\nfunction pack(env: ExecutionEnv, columns: string[], values: SqlValue[][]): ResultSet {\n return valuesToResult(columns, values, 0, env.state.lastInsertRowid, {\n named: env.includeNamedRows,\n keepValues: true,\n });\n}\n", "import type {\n AggregateExpr,\n Expr,\n FromItem,\n OrderByItem,\n ResultColumn,\n SelectStmt,\n WindowExpr,\n WindowSpec,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { EvalContext } from \"../expressions/context.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { isPragmaTvfName } from \"../functions/pragma-tvf.ts\";\nimport { evaluateTableFunction, hasTableValuedFunction, tableValuedColumns } from \"../functions/table-valued.ts\";\nimport { buildSqliteMaster, buildSqliteSchema } from \"../schema/catalog.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\nimport {\n tryIndexedOrder,\n tryIndexedTableRows,\n tryJoinEqualityKeys,\n tryJoinProbe,\n whereFullyCovered,\n} from \"../planner/access.ts\";\nimport { serializeIndexKey } from \"../indexes/index.ts\";\nimport type { Row } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { compareWithCollation, normalizeForCollation } from \"../types/collation.ts\";\nimport {\n type Affinity,\n applyAffinity,\n compareSql,\n isTruthySql,\n type SqlValue,\n sqlValueEquals,\n toInteger,\n} from \"../types/value.ts\";\nimport type { FtsVocabVirtualTable } from \"../vtable/modules.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"./env.ts\";\nimport { makeCell } from \"./env.ts\";\nimport { type ResultSet, resultValues, valuesToResult } from \"./result.ts\";\nimport { tryExecuteSimpleJoin, tryExecuteSimpleSelect } from \"./simple-select.ts\";\n\nfunction applyAffinityLocal(value: SqlValue, affinity: Affinity): SqlValue {\n return applyAffinity(value, affinity);\n}\n\ninterface OutputRow {\n values: SqlValue[];\n scope: ScopeRow;\n}\n\nexport function executeSelect(stmt: SelectStmt, env: ExecutionEnv, parent?: EvalContext): ResultSet {\n env.selectRunner = executeSelect;\n if (!parent && !stmt.with && !stmt.compound) {\n const simple = tryExecuteSimpleSelect(stmt, env) ?? tryExecuteSimpleJoin(stmt, env);\n if (simple) return simple;\n }\n const savedCtes = new Map(env.ctes);\n try {\n if (stmt.with) executeWith(stmt, env, parent);\n const base = executeSelectCore(\n {\n ...stmt,\n with: null,\n compound: null,\n orderBy: stmt.compound ? [] : stmt.orderBy,\n limit: stmt.compound ? null : stmt.limit,\n },\n env,\n parent,\n );\n if (!stmt.compound) return base;\n const right = executeSelect(stmt.compound.select, env, parent);\n if (base.columns.length !== right.columns.length) {\n throw new SqliteError(\n \"SELECTs to the left and right of compound operator do not have the same number of result columns\",\n \"other\",\n );\n }\n const leftRows = resultValues(base);\n const rightRows = resultValues(right);\n let rows: SqlValue[][];\n switch (stmt.compound.op) {\n case \"UNION ALL\":\n rows = [...leftRows, ...rightRows];\n break;\n case \"UNION\":\n rows = uniqueRows([...leftRows, ...rightRows]);\n break;\n case \"INTERSECT\":\n rows = uniqueRows(leftRows).filter((row) => rightRows.some((other) => rowsEqual(row, other)));\n break;\n case \"EXCEPT\":\n rows = uniqueRows(leftRows).filter((row) => !rightRows.some((other) => rowsEqual(row, other)));\n break;\n }\n if (stmt.orderBy.length > 0) rows.sort((a, b) => compareCompoundRows(a, b, stmt.orderBy, base.columns));\n if (stmt.limit) {\n const ctx = env.createEvalContext(null, parent);\n const limitValue = toInteger(evalExpr(stmt.limit.limit, ctx));\n const offsetValue = stmt.limit.offset ? toInteger(evalExpr(stmt.limit.offset, ctx)) : 0;\n if (limitValue === null || offsetValue === null) throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\");\n const offset = Math.max(0, Number(offsetValue));\n const limit = Number(limitValue);\n rows = rows.slice(offset, limit < 0 ? undefined : offset + limit);\n }\n return valuesToResult(base.columns, rows, 0, env.state.lastInsertRowid, {\n named: env.includeNamedRows,\n keepValues: true,\n });\n } finally {\n env.ctes.clear();\n for (const [name, result] of savedCtes) env.ctes.set(name, result);\n }\n}\n\nfunction executeWith(stmt: SelectStmt, env: ExecutionEnv, parent?: EvalContext): void {\n for (const cte of stmt.with!.ctes) {\n const key = cte.name.toLowerCase();\n if (stmt.with!.recursive && referencesTable(cte.select, cte.name) && cte.select.compound) {\n const anchor = executeSelect({ ...cte.select, compound: null }, env, parent);\n const columns = cte.columns ?? anchor.columns;\n let accumulated = resultValues(anchor);\n let delta = accumulated;\n while (true) {\n env.ctes.set(key, valuesToResult(columns, delta));\n const nextResult = executeSelect(cte.select.compound.select, env, parent);\n const candidates = resultValues(nextResult);\n const additions =\n cte.select.compound.op === \"UNION ALL\"\n ? candidates\n : candidates.filter((row) => !accumulated.some((existing) => rowsEqual(existing, row)));\n if (additions.length === 0) break;\n accumulated = [...accumulated, ...additions];\n delta = additions;\n }\n env.ctes.set(key, valuesToResult(columns, accumulated));\n } else {\n const result = executeSelect(cte.select, env, parent);\n const columns = cte.columns ?? result.columns;\n env.ctes.set(key, valuesToResult(columns, resultValues(result)));\n }\n }\n}\n\nfunction executeSelectCore(stmt: SelectStmt, env: ExecutionEnv, parent?: EvalContext): ResultSet {\n let scopes: ScopeRow[];\n let skipWhere = false;\n let skipOrder = false;\n if (stmt.from && stmt.where) {\n const indexed = tryIndexedTableRows(stmt.from, stmt.where, env);\n if (indexed) {\n scopes = scopesFromTableRows(indexed.table, indexed.rows, indexed.alias, env, parent);\n skipWhere = whereFullyCovered(stmt.where, indexed.coveredColumns, indexed.alias, indexed.table.name);\n } else {\n scopes = scanFrom(stmt.from, env, parent);\n }\n } else if (stmt.from && stmt.orderBy.length === 1 && stmt.orderBy[0]) {\n let take: number | undefined;\n if (stmt.limit) {\n const ctx = env.createEvalContext(null, parent);\n const limitValue = toInteger(evalExpr(stmt.limit.limit, ctx));\n const offsetValue = stmt.limit.offset ? toInteger(evalExpr(stmt.limit.offset, ctx)) : 0;\n if (limitValue !== null && offsetValue !== null) {\n const offset = Math.max(0, Number(offsetValue));\n const limit = Number(limitValue);\n take = limit < 0 ? undefined : offset + limit;\n }\n }\n const ordered = tryIndexedOrder(\n stmt.from,\n { expr: stmt.orderBy[0].expr, dir: stmt.orderBy[0].dir ?? \"ASC\" },\n env,\n take,\n );\n if (ordered) {\n scopes = scopesFromTableRows(ordered.table, ordered.rows, ordered.alias, env, parent);\n skipOrder = true;\n } else scopes = scanFrom(stmt.from, env, parent);\n } else {\n scopes = stmt.from ? scanFrom(stmt.from, env, parent) : [{ cells: [] }];\n }\n const canStopEarly =\n stmt.orderBy.length === 0 &&\n !stmt.distinct &&\n stmt.groupBy.length === 0 &&\n stmt.having === null &&\n Number.isFinite(env.maxRows);\n const aggregate =\n stmt.groupBy.length > 0 ||\n stmt.columns.some((column) => column.type === \"expr\" && containsAggregate(column.expr)) ||\n (stmt.having !== null && containsAggregate(stmt.having));\n if (stmt.where && !skipWhere) {\n if (canStopEarly && !aggregate) {\n const filtered: ScopeRow[] = [];\n for (const scope of scopes) {\n if (isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope, parent))) !== true) continue;\n filtered.push(scope);\n if (filtered.length >= env.maxRows) break;\n }\n scopes = filtered;\n } else {\n scopes = scopes.filter(\n (scope) => isTruthySql(evalExpr(stmt.where!, env.createEvalContext(scope, parent))) === true,\n );\n }\n }\n const groupBy = stmt.groupBy.map((expr) => {\n if (expr.type !== \"literal\" || typeof expr.value !== \"number\" || !Number.isInteger(expr.value)) return expr;\n const column = stmt.columns[expr.value - 1];\n if (column?.type !== \"expr\") throw new SqliteError(`${expr.value}th GROUP BY term out of range`, \"other\");\n return column.expr;\n });\n const groups = aggregate ? groupRows(scopes, groupBy, env, parent) : scopes.map((scope) => [scope]);\n const windowScopes = aggregate ? groups.map((group) => group[0] ?? { cells: [] }) : scopes;\n const sample = scopes[0] ?? (stmt.from ? { cells: shapeOf(stmt.from, env) } : undefined);\n if (scopes.length === 0 && sample) validateProjectedColumns(stmt, sample, env, parent);\n const columns = resultColumnNames(stmt.columns, sample);\n let output: OutputRow[] = [];\n\n for (const group of groups) {\n const scope = group[0] ?? { cells: [] };\n const ctx = env.createEvalContext(scope, parent);\n const values: SqlValue[] = [];\n for (const column of stmt.columns) {\n if (column.type === \"star\") {\n for (const cell of scope.cells) {\n if (\n (column.table !== null || !cell.hiddenByUsing) &&\n (column.table === null || cell.table?.toLowerCase() === column.table.toLowerCase())\n )\n values.push(cell.value);\n }\n } else {\n values.push(evalGrouped(column.expr, ctx, group, env, parent, stmt.windows, windowScopes));\n }\n }\n if (stmt.having) {\n const aliases = new Map<string, SqlValue>();\n stmt.columns.forEach((column, index) => {\n if (column.type === \"expr\" && column.alias) aliases.set(column.alias.toLowerCase(), values[index] ?? null);\n });\n const havingCtx: EvalContext = {\n ...ctx,\n resolveColumn: (table, name) => {\n if (table === null && aliases.has(name.toLowerCase())) return aliases.get(name.toLowerCase()) ?? null;\n return ctx.resolveColumn(table, name);\n },\n };\n if (isTruthySql(evalGrouped(stmt.having, havingCtx, group, env, parent, stmt.windows, windowScopes)) !== true)\n continue;\n }\n output.push({ values, scope });\n if (canStopEarly && !aggregate && !stmt.limit && output.length >= env.maxRows) break;\n }\n\n if (stmt.distinct) {\n const seen = new Set<string>();\n output = output.filter((row) => {\n const key = valueKey(row.values);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }\n if (stmt.orderBy.length > 0 && !skipOrder) {\n output.sort((left, right) => compareOutput(left, right, stmt.orderBy, columns, env, parent));\n }\n if (stmt.limit) {\n const ctx = env.createEvalContext(null, parent);\n const limitValue = toInteger(evalExpr(stmt.limit.limit, ctx));\n const offsetValue = stmt.limit.offset ? toInteger(evalExpr(stmt.limit.offset, ctx)) : 0;\n if (limitValue === null || offsetValue === null) throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\");\n const offset = Math.max(0, Number(offsetValue));\n const limit = Number(limitValue);\n output = output.slice(offset, limit < 0 ? undefined : offset + limit);\n }\n if (Number.isFinite(env.maxRows) && output.length > env.maxRows) output = output.slice(0, env.maxRows);\n return valuesToResult(\n columns,\n output.map((row) => row.values),\n 0,\n env.state.lastInsertRowid,\n {\n named: env.includeNamedRows,\n keepValues: true,\n },\n );\n}\n\nexport function scanFrom(item: FromItem, env: ExecutionEnv, parent?: EvalContext): ScopeRow[] {\n if (item.type === \"join\") {\n const left = scanFrom(item.left, env, parent);\n\n // Correlated table-valued functions (e.g. json_each(t.data)) are evaluated per left row.\n if (item.right.type === \"table_func\") {\n const result: ScopeRow[] = [];\n const rightShape = shapeOf(item.right, env);\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n for (const lhs of left) {\n const tvf = evaluateTableFunction(item.right.name, item.right.args, item.right.alias, env, lhs, parent);\n if (tvf.rows.length === 0) {\n if (item.joinType === \"LEFT\" || item.joinType === \"FULL\") {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n continue;\n }\n for (const rhs of tvf.rows) {\n const joined = { cells: [...lhs.cells, ...rhs.cells] };\n if (item.on) {\n if (isTruthySql(evalExpr(item.on, env.createEvalContext(joined, parent))) !== true) continue;\n }\n result.push(joined);\n }\n }\n return result;\n }\n\n const probe =\n !item.using && item.joinType !== \"RIGHT\" && item.joinType !== \"FULL\"\n ? tryJoinProbe(item.right, item.on, env)\n : null;\n if (probe) {\n const rightShape = shapeOf(item.right, env);\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const result: ScopeRow[] = [];\n for (const lhs of left) {\n const raw = probe.lookup((tableName, name) => {\n const key = name.toLowerCase();\n const match = lhs.cells.find(\n (cell) =>\n (cell.nameLower ?? cell.name.toLowerCase()) === key &&\n (tableName === null || (cell.tableLower ?? cell.table?.toLowerCase()) === tableName.toLowerCase()),\n );\n return match?.value ?? null;\n });\n const rhsScopes = scopesFromTableRows(probe.table, raw, probe.alias, env, parent);\n let matched = false;\n for (const rhs of rhsScopes) {\n const joined = { cells: [...lhs.cells, ...rhs.cells] };\n if (\n item.on &&\n !probe.covering &&\n isTruthySql(evalExpr(item.on, env.createEvalContext(joined, parent))) !== true\n )\n continue;\n matched = true;\n result.push(joined);\n }\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n return result;\n }\n\n // Hash-join fallback for unindexed equality INNER/LEFT joins (NULL keys never match).\n const hashKeys =\n !item.using && item.joinType !== \"RIGHT\" && item.joinType !== \"FULL\"\n ? tryJoinEqualityKeys(item.right, item.on, env)\n : null;\n if (hashKeys) {\n const rawRight = rawJoinTable(item.right, env);\n if (rawRight) {\n return hashJoinRaw(left, rawRight, hashKeys, item);\n }\n const right = scanFrom(item.right, env, parent);\n const rightShape = (right[0]?.cells ?? shapeOf(item.right, env)).map((cell) => cell);\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const buckets = new Map<string, ScopeRow[]>();\n for (const rhs of right) {\n const values = hashKeys.rightColumns.map((name) => {\n const key = name.toLowerCase();\n const cell = rhs.cells.find((c) => (c.nameLower ?? c.name.toLowerCase()) === key);\n return normalizeForCollation(cell?.value ?? null, \"BINARY\");\n });\n const mapKey = serializeIndexKey(values);\n if (mapKey === null) continue; // NULL join key \u2192 never matches via =\n const bucket = buckets.get(mapKey);\n if (bucket) bucket.push(rhs);\n else buckets.set(mapKey, [rhs]);\n }\n const result: ScopeRow[] = [];\n for (const lhs of left) {\n const values = hashKeys.leftKeys.map((key) => {\n const cell = lhs.cells.find(\n (c) =>\n (c.nameLower ?? c.name.toLowerCase()) === key.column.toLowerCase() &&\n (key.table === null || (c.tableLower ?? c.table?.toLowerCase()) === key.table.toLowerCase()),\n );\n return normalizeForCollation(cell?.value ?? null, \"BINARY\");\n });\n const mapKey = serializeIndexKey(values);\n let matched = false;\n if (mapKey !== null) {\n const matches = buckets.get(mapKey);\n if (matches) {\n for (const rhs of matches) {\n const joined = { cells: [...lhs.cells, ...rhs.cells] };\n matched = true;\n result.push(joined);\n }\n }\n }\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n return result;\n }\n\n const right = scanFrom(item.right, env, parent);\n const using = resolveUsingColumns(item, left, right, env);\n const leftShape = left[0]?.cells ?? shapeOf(item.left, env);\n const rightShape = (right[0]?.cells ?? shapeOf(item.right, env)).map((cell) =>\n using?.some((name) => name.toLowerCase() === cell.name.toLowerCase()) ? { ...cell, hiddenByUsing: true } : cell,\n );\n const nullLeft = leftShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const result: ScopeRow[] = [];\n const matchedRight = new Set<number>();\n\n const joinOk = (lhs: ScopeRow, rhs: ScopeRow, joined: ScopeRow): boolean => {\n if (using) {\n return using.every((name) => {\n const l = lhs.cells.find((cell) => cell.name.toLowerCase() === name.toLowerCase())?.value ?? null;\n const r = rhs.cells.find((cell) => cell.name.toLowerCase() === name.toLowerCase())?.value ?? null;\n return l !== null && r !== null && sqlValueEquals(l, r);\n });\n }\n if (item.on) return isTruthySql(evalExpr(item.on, env.createEvalContext(joined, parent))) === true;\n return true;\n };\n\n for (const lhs of left) {\n let matched = false;\n right.forEach((rhs, rightIndex) => {\n const rightCells = using\n ? rhs.cells.map((cell) =>\n using.some((name) => name.toLowerCase() === cell.name.toLowerCase())\n ? { ...cell, hiddenByUsing: true }\n : cell,\n )\n : rhs.cells;\n const joined = { cells: [...lhs.cells, ...rightCells] };\n if (!joinOk(lhs, rhs, joined)) return;\n matched = true;\n matchedRight.add(rightIndex);\n result.push(joined);\n });\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n\n if (item.joinType === \"RIGHT\" || item.joinType === \"FULL\") {\n right.forEach((rhs, rightIndex) => {\n if (matchedRight.has(rightIndex)) return;\n const rightCells = using\n ? rhs.cells.map((cell) =>\n using.some((name) => name.toLowerCase() === cell.name.toLowerCase())\n ? { ...cell, hiddenByUsing: true }\n : cell,\n )\n : rhs.cells;\n result.push({ cells: [...nullLeft, ...rightCells] });\n });\n }\n\n return result;\n }\n if (item.type === \"subquery\") {\n const result = executeSelect(item.select, env, parent);\n return resultValues(result).map((values) => ({\n cells: result.columns.map((name, index) => ({ table: item.alias, name, value: values[index] ?? null })),\n }));\n }\n if (item.type === \"table_func\") {\n return evaluateTableFunction(item.name, item.args, item.alias, env).rows;\n }\n\n // Eponymous pragma_* virtual tables may be referenced without parentheses.\n if (item.type === \"table\" && isPragmaTvfName(item.name) && hasTableValuedFunction(item.name.toLowerCase())) {\n return evaluateTableFunction(item.name, [], item.alias, env, null, parent).rows;\n }\n\n const alias = item.alias ?? item.name;\n const qualified = item.schema ? `${item.schema}.${item.name}` : item.name;\n const db = env.state.databaseForSchema(item.schema, qualified);\n const cte = env.ctes.get(item.name.toLowerCase());\n if (cte) {\n return resultValues(cte).map((values) => ({\n cells: cte.columns.map((name, index) => ({ table: alias, name, value: values[index] ?? null })),\n }));\n }\n const view = db.views.get(item.name.toLowerCase());\n if (view) {\n const result = executeSelect(view.select, env, parent);\n const names = view.columns ?? result.columns;\n return resultValues(result).map((values) => ({\n cells: names.map((name, index) => ({ table: alias, name, value: values[index] ?? null })),\n }));\n }\n const virtual = db.virtualTables.get(item.name.toLowerCase());\n if (virtual) {\n if (virtual.kind === \"fts5\" || virtual.kind === \"fts3\" || virtual.kind === \"fts4\") {\n return virtual.scan().map((row) => ({\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: virtual.name,\n cells: virtual.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n }));\n }\n if (virtual.kind === \"rtree\") {\n return virtual.scan().map((row) => ({\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: virtual.name,\n cells: virtual.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n }));\n }\n if (virtual.kind === \"dbstat\") {\n return scanDbStat(db, alias, virtual.schemaArg);\n }\n if (virtual.kind === \"fts5vocab\") {\n return scanFtsVocab(db, alias, virtual);\n }\n // bytecode / tables_used: empty by default\n return [];\n }\n let table: Table;\n if (item.name.toLowerCase() === \"sqlite_schema\") table = buildSqliteSchema(db);\n else if (item.name.toLowerCase() === \"sqlite_master\") table = buildSqliteMaster(db);\n else table = db.getTable(item.name);\n return scopesFromTableRows(table, table.scan(), alias, env, parent);\n}\n\nfunction rawJoinTable(item: FromItem, env: ExecutionEnv): { table: Table; alias: string } | null {\n if (item.type !== \"table\") return null;\n const nameKey = item.name.toLowerCase();\n if (nameKey === \"sqlite_schema\" || nameKey === \"sqlite_master\") return null;\n if (env.ctes.has(nameKey)) return null;\n const db = env.state.databaseForSchema(item.schema, item.schema ? `${item.schema}.${item.name}` : item.name);\n if (db.virtualTables.has(nameKey) || db.views.has(nameKey)) return null;\n try {\n return { table: db.getTable(item.name), alias: item.alias ?? item.name };\n } catch {\n return null;\n }\n}\n\nfunction hashJoinRaw(\n left: ScopeRow[],\n right: { table: Table; alias: string },\n hashKeys: { rightColumns: string[]; leftKeys: { table: string | null; column: string }[] },\n item: Extract<FromItem, { type: \"join\" }>,\n): ScopeRow[] {\n const rightKeys = hashKeys.rightColumns.map((name) => name.toLowerCase());\n const buckets = new Map<string, Row[]>();\n const source = right.table.withoutRowid ? right.table.clusteredRows.values() : right.table.rows.values();\n for (const row of source) {\n const values = rightKeys.map((key) => normalizeForCollation(row.values.get(key) ?? null, \"BINARY\"));\n const mapKey = serializeIndexKey(values);\n if (mapKey === null) continue;\n const bucket = buckets.get(mapKey);\n if (bucket) bucket.push(row);\n else buckets.set(mapKey, [row]);\n }\n const nullRight = right.table.columns.map((column) =>\n makeCell(right.alias, column.name, null, { affinity: column.affinity, collate: column.collate }),\n );\n const result: ScopeRow[] = [];\n for (const lhs of left) {\n const values = hashKeys.leftKeys.map((key) => {\n const want = key.column.toLowerCase();\n const tableKey = key.table?.toLowerCase();\n const cell = lhs.cells.find(\n (c) =>\n (c.nameLower ?? c.name.toLowerCase()) === want &&\n (tableKey === undefined || (c.tableLower ?? c.table?.toLowerCase()) === tableKey),\n );\n return normalizeForCollation(cell?.value ?? null, \"BINARY\");\n });\n const mapKey = serializeIndexKey(values);\n let matched = false;\n if (mapKey !== null) {\n const matches = buckets.get(mapKey);\n if (matches) {\n for (const row of matches) {\n const rhsCells = right.table.columns.map((column) =>\n makeCell(right.alias, column.name, row.values.get(column.nameLower ?? column.name.toLowerCase()) ?? null, {\n affinity: column.affinity,\n collate: column.collate,\n }),\n );\n result.push({ cells: [...lhs.cells, ...rhsCells] });\n matched = true;\n }\n }\n }\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n return result;\n}\n\nfunction scopesFromTableRows(\n table: Table,\n rows: Iterable<Row>,\n alias: string,\n env: ExecutionEnv,\n parent?: EvalContext,\n): ScopeRow[] {\n const integerPkAlias = table.integerPkColumn()?.name;\n const result: ScopeRow[] = [];\n for (const row of rows) {\n const baseCells = table.columns\n .filter((c) => !c.generated || c.generated.stored)\n .map((column) =>\n makeCell(alias, column.name, row.values.get(column.nameLower ?? column.name.toLowerCase()) ?? null, {\n affinity: column.affinity,\n collate: column.collate,\n }),\n );\n const cells = table.columns.map((column) => {\n if (column.generated && !column.generated.stored) {\n const ctx = env.createEvalContext({ cells: baseCells, sourceTable: table.name }, parent);\n return makeCell(alias, column.name, applyAffinityLocal(evalExpr(column.generated.expr, ctx), column.affinity), {\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n return makeCell(alias, column.name, row.values.get(column.nameLower ?? column.name.toLowerCase()) ?? null, {\n affinity: column.affinity,\n collate: column.collate,\n });\n });\n result.push({\n ...(table.withoutRowid ? {} : { rowid: row.rowid }),\n rowidName: integerPkAlias ?? (table.withoutRowid ? undefined : \"rowid\"),\n sourceTable: table.name,\n cells,\n });\n }\n return result;\n}\n\nfunction shapeOf(item: FromItem, env: ExecutionEnv): ScopeRow[\"cells\"] {\n if (item.type === \"join\") {\n const left = shapeOf(item.left, env);\n const right = shapeOf(item.right, env);\n const using = resolveUsingFromShapes(item.using, left, right);\n return [\n ...left,\n ...right.map((cell) =>\n using?.some((name) => name.toLowerCase() === cell.name.toLowerCase()) ? { ...cell, hiddenByUsing: true } : cell,\n ),\n ];\n }\n if (item.type === \"subquery\")\n return resultColumnNames(item.select.columns).map((name) => ({ table: item.alias, name, value: null }));\n if (item.type === \"table_func\") {\n // Do not evaluate args here \u2014 they may be correlated (e.g. pragma_table_info(tl.name)).\n const known = tableValuedColumns(item.name);\n const columns = known ?? evaluateTableFunction(item.name, item.args, item.alias, env).columns;\n return columns.map((name) => ({\n table: item.alias ?? item.name,\n name,\n value: null,\n }));\n }\n if (item.type === \"table\" && isPragmaTvfName(item.name) && hasTableValuedFunction(item.name.toLowerCase())) {\n const columns = tableValuedColumns(item.name) ?? evaluateTableFunction(item.name, [], item.alias, env).columns;\n return columns.map((name) => ({\n table: item.alias ?? item.name,\n name,\n value: null,\n }));\n }\n const alias = item.alias ?? item.name;\n const qualified = item.schema ? `${item.schema}.${item.name}` : item.name;\n const db = env.state.databaseForSchema(item.schema, qualified);\n const cte = env.ctes.get(item.name.toLowerCase());\n if (cte) return cte.columns.map((name) => ({ table: alias, name, value: null }));\n const view = db.views.get(item.name.toLowerCase());\n if (view)\n return (view.columns ?? resultColumnNames(view.select.columns)).map((name) => ({\n table: alias,\n name,\n value: null,\n }));\n const virtual = db.virtualTables.get(item.name.toLowerCase());\n if (virtual) return virtual.columns.map((name) => ({ table: alias, name, value: null }));\n const table =\n item.name.toLowerCase() === \"sqlite_schema\"\n ? buildSqliteSchema(db)\n : item.name.toLowerCase() === \"sqlite_master\"\n ? buildSqliteMaster(db)\n : db.getTable(item.name);\n return table.columns.map((column) => ({ table: alias, name: column.name, value: null, affinity: column.affinity }));\n}\n\n/** NATURAL JOIN uses an empty USING list as a sentinel; resolve shared column names at runtime. */\nfunction resolveUsingColumns(\n item: Extract<FromItem, { type: \"join\" }>,\n left: ScopeRow[],\n right: ScopeRow[],\n env: ExecutionEnv,\n): string[] | null {\n const leftCells = left[0]?.cells ?? shapeOf(item.left, env);\n const rightCells = right[0]?.cells ?? shapeOf(item.right, env);\n return resolveUsingFromShapes(item.using, leftCells, rightCells);\n}\n\nfunction resolveUsingFromShapes(\n using: string[] | null,\n leftCells: ScopeRow[\"cells\"],\n rightCells: ScopeRow[\"cells\"],\n): string[] | null {\n if (using === null) return null;\n if (using.length > 0) return using;\n const rightNames = new Set(rightCells.map((cell) => cell.name.toLowerCase()));\n const common: string[] = [];\n const seen = new Set<string>();\n for (const cell of leftCells) {\n const key = cell.name.toLowerCase();\n if (rightNames.has(key) && !seen.has(key)) {\n seen.add(key);\n common.push(cell.name);\n }\n }\n return common;\n}\n\nfunction groupRows(rows: ScopeRow[], expressions: Expr[], env: ExecutionEnv, parent?: EvalContext): ScopeRow[][] {\n if (expressions.length === 0) return [rows];\n const groups: ScopeRow[][] = [];\n const indexByKey = new Map<string, number>();\n for (const row of rows) {\n const keyValues = expressions.map((expr) => evalExpr(expr, env.createEvalContext(row, parent)));\n const key = valueKey(keyValues);\n const index = indexByKey.get(key);\n if (index === undefined) {\n indexByKey.set(key, groups.length);\n groups.push([row]);\n } else groups[index]!.push(row);\n }\n return groups;\n}\n\nfunction evalGrouped(\n expr: Expr,\n ctx: EvalContext,\n group: ScopeRow[],\n env: ExecutionEnv,\n parent: EvalContext | undefined,\n namedWindows: SelectStmt[\"windows\"],\n windowRows: ScopeRow[],\n): SqlValue {\n return evalExpr(\n replaceSpecial(expr, (special) => {\n if (special.type === \"aggregate\") return aggregateValue(special, group, env, parent);\n return windowValue(special, group[0] ?? { cells: [] }, windowRows, env, parent, namedWindows);\n }),\n ctx,\n );\n}\n\nfunction aggregateValue(expr: AggregateExpr, rows: ScopeRow[], env: ExecutionEnv, parent?: EvalContext): SqlValue {\n const accumulator = env.functions.createAggregate(expr.name);\n if (!accumulator) throw new SqliteError(`no such aggregate function: ${expr.name}`, \"other\");\n const seen: SqlValue[][] = [];\n for (const row of rows) {\n const ctx = env.createEvalContext(row, parent);\n if (expr.filter && isTruthySql(evalExpr(expr.filter, ctx)) !== true) continue;\n const args = expr.args === \"*\" ? [] : expr.args.map((arg) => evalExpr(arg, ctx));\n if (expr.distinct && seen.some((values) => rowsEqual(values, args))) continue;\n seen.push(args);\n accumulator.step(args);\n }\n return accumulator.finalize();\n}\n\nfunction windowValue(\n expr: WindowExpr,\n current: ScopeRow,\n rows: ScopeRow[],\n env: ExecutionEnv,\n parent: EvalContext | undefined,\n namedWindows: SelectStmt[\"windows\"],\n): SqlValue {\n const spec = resolveWindow(expr.window, namedWindows);\n const currentCtx = env.createEvalContext(current, parent);\n const partitionKey = spec.partitionBy.map((item) => evalExpr(item, currentCtx));\n const partition = rows.filter((row) =>\n rowsEqual(\n partitionKey,\n spec.partitionBy.map((item) => evalExpr(item, env.createEvalContext(row, parent))),\n ),\n );\n partition.sort((a, b) => compareScopes(a, b, spec.orderBy, env, parent));\n const index = Math.max(0, partition.indexOf(current));\n const orderKeys = partition.map((row) =>\n spec.orderBy.map((item) => evalExpr(item.expr, env.createEvalContext(row, parent))),\n );\n let defaultFrameEnd = index;\n if (spec.orderBy.length > 0) {\n while (defaultFrameEnd + 1 < partition.length) {\n const next = partition[defaultFrameEnd + 1];\n if (!next || compareScopes(current, next, spec.orderBy, env, parent) !== 0) break;\n defaultFrameEnd++;\n }\n }\n if (expr.func.type === \"aggregate\") {\n const [start, end] = frameBounds(spec, index, partition.length, currentCtx, defaultFrameEnd, orderKeys);\n const framed = frameRows(partition, start, end, index, orderKeys, spec.frame?.exclude ?? null);\n return aggregateValue(expr.func, framed, env, parent);\n }\n const name = expr.func.name.toLowerCase();\n const args = expr.func.args === \"*\" ? [] : expr.func.args;\n const values = partition.map((row) => args.map((arg) => evalExpr(arg, env.createEvalContext(row, parent))));\n if (name === \"row_number\") return index + 1;\n if (name === \"rank\") {\n let first = index;\n while (first > 0 && rowsEqual(orderKeys[first]!, orderKeys[first - 1]!)) first--;\n return first + 1;\n }\n if (name === \"dense_rank\") {\n let rank = 1;\n for (let i = 1; i <= index; i++) if (!rowsEqual(orderKeys[i]!, orderKeys[i - 1]!)) rank++;\n return rank;\n }\n const evaluated = args.map((arg) => evalExpr(arg, currentCtx));\n if (name === \"lag\" || name === \"lead\") {\n const offset = Number(toInteger(evaluated[1] ?? 1) ?? 1);\n const target = name === \"lag\" ? index - offset : index + offset;\n return values[target]?.[0] ?? evaluated[2] ?? null;\n }\n const [start, end] = frameBounds(spec, index, partition.length, currentCtx, defaultFrameEnd, orderKeys);\n const framed = frameRows(partition, start, end, index, orderKeys, spec.frame?.exclude ?? null);\n const framedValues = framed.map((row) => args.map((arg) => evalExpr(arg, env.createEvalContext(row, parent))));\n if (name === \"first_value\") return framedValues[0]?.[0] ?? null;\n if (name === \"last_value\") return framedValues[framedValues.length - 1]?.[0] ?? null;\n if (name === \"nth_value\") {\n const target = Number(toInteger(evaluated[1] ?? null) ?? 0) - 1;\n return target >= 0 && target < framedValues.length ? (framedValues[target]?.[0] ?? null) : null;\n }\n if (name === \"ntile\") {\n const buckets = Math.max(1, Number(toInteger(evaluated[0] ?? 1) ?? 1));\n const n = partition.length;\n const small = Math.floor(n / buckets);\n const large = small + 1;\n const largeCount = n % buckets;\n // First `largeCount` buckets have `large` rows\n let remaining = index;\n for (let b = 1; b <= buckets; b++) {\n const size = b <= largeCount ? large : small;\n if (remaining < size) return b;\n remaining -= size;\n }\n return buckets;\n }\n if (name === \"cume_dist\") {\n if (partition.length === 0) return null;\n let lastPeer = index;\n while (lastPeer + 1 < partition.length && rowsEqual(orderKeys[lastPeer + 1]!, orderKeys[index]!)) {\n lastPeer++;\n }\n return (lastPeer + 1) / partition.length;\n }\n if (name === \"percent_rank\") {\n if (partition.length <= 1) return 0;\n let first = index;\n while (first > 0 && rowsEqual(orderKeys[first]!, orderKeys[first - 1]!)) first--;\n return first / (partition.length - 1);\n }\n throw new SqliteError(`no such window function: ${expr.func.name}`, \"other\");\n}\n\nfunction resolveWindow(spec: WindowSpec, namedWindows: SelectStmt[\"windows\"], seen = new Set<string>()): WindowSpec {\n if (!spec.ref) return spec;\n const key = spec.ref.toLowerCase();\n if (seen.has(key)) throw new SqliteError(`circular window definition: ${spec.ref}`, \"other\");\n const named = namedWindows.find((item) => item.name.toLowerCase() === key);\n if (!named) throw new SqliteError(`no such window: ${spec.ref}`, \"other\");\n seen.add(key);\n const base = resolveWindow(named.spec, namedWindows, seen);\n return {\n partitionBy: spec.partitionBy.length ? spec.partitionBy : base.partitionBy,\n orderBy: spec.orderBy.length ? spec.orderBy : base.orderBy,\n frame: spec.frame ?? base.frame,\n ref: null,\n };\n}\n\nfunction frameBounds(\n spec: WindowSpec,\n index: number,\n length: number,\n ctx: EvalContext,\n defaultFrameEnd: number,\n orderKeys: SqlValue[][],\n): [number, number] {\n if (!spec.frame) return [0, spec.orderBy.length > 0 ? defaultFrameEnd : Math.max(0, length - 1)];\n const isRangeLike = spec.frame.type === \"RANGE\" || spec.frame.type === \"GROUPS\";\n let peerFirst = index;\n if (isRangeLike && spec.orderBy.length > 0) {\n while (peerFirst > 0 && rowsEqual(orderKeys[peerFirst]!, orderKeys[peerFirst - 1]!)) peerFirst--;\n }\n const bound = (\n item: WindowSpec[\"frame\"] extends infer _ ? NonNullable<WindowSpec[\"frame\"]>[\"start\"] : never,\n isStart: boolean,\n ): number => {\n switch (item.kind) {\n case \"unbounded_preceding\":\n return 0;\n case \"unbounded_following\":\n return Math.max(0, length - 1);\n case \"current_row\":\n if (isRangeLike) return isStart ? peerFirst : defaultFrameEnd;\n return index;\n case \"preceding\":\n return Math.max(0, index - Number(toInteger(evalExpr(item.expr, ctx)) ?? 0));\n case \"following\":\n return Math.min(Math.max(0, length - 1), index + Number(toInteger(evalExpr(item.expr, ctx)) ?? 0));\n }\n };\n return [bound(spec.frame.start, true), bound(spec.frame.end, false)];\n}\n\nfunction frameRows(\n partition: ScopeRow[],\n start: number,\n end: number,\n index: number,\n orderKeys: SqlValue[][],\n exclude: \"no_others\" | \"current_row\" | \"group\" | \"ties\" | null,\n): ScopeRow[] {\n let peerFirst = index;\n let peerLast = index;\n while (peerFirst > 0 && rowsEqual(orderKeys[peerFirst]!, orderKeys[peerFirst - 1]!)) peerFirst--;\n while (peerLast + 1 < partition.length && rowsEqual(orderKeys[peerLast]!, orderKeys[peerLast + 1]!)) peerLast++;\n const rows: ScopeRow[] = [];\n for (let i = Math.max(0, start); i <= end && i < partition.length; i++) {\n if (exclude === \"current_row\" && i === index) continue;\n if (exclude === \"group\" && i >= peerFirst && i <= peerLast) continue;\n if (exclude === \"ties\" && i >= peerFirst && i <= peerLast && i !== index) continue;\n rows.push(partition[i]!);\n }\n return rows;\n}\n\nfunction compareScopes(\n a: ScopeRow,\n b: ScopeRow,\n order: OrderByItem[],\n env: ExecutionEnv,\n parent?: EvalContext,\n): number {\n for (const item of order) {\n const left = evalExpr(item.expr, env.createEvalContext(a, parent));\n const right = evalExpr(item.expr, env.createEvalContext(b, parent));\n const result = compareNullable(left, right, item, a);\n if (result !== 0) return result;\n }\n return 0;\n}\n\nfunction compareOutput(\n a: OutputRow,\n b: OutputRow,\n order: OrderByItem[],\n columns: string[],\n env: ExecutionEnv,\n parent?: EvalContext,\n): number {\n for (const item of order) {\n const value = (row: OutputRow): SqlValue => {\n if (item.expr.type === \"literal\" && typeof item.expr.value === \"number\" && Number.isInteger(item.expr.value)) {\n return row.values[item.expr.value - 1] ?? null;\n }\n if (item.expr.type === \"column\" && item.expr.table === null) {\n const requestedName = item.expr.name.toLowerCase();\n const index = columns.findIndex((name) => name.toLowerCase() === requestedName);\n if (index >= 0) return row.values[index] ?? null;\n }\n return evalExpr(item.expr, env.createEvalContext(row.scope, parent));\n };\n const result = compareNullable(value(a), value(b), item, a.scope);\n if (result !== 0) return result;\n }\n return 0;\n}\n\nfunction compareNullable(left: SqlValue, right: SqlValue, item: OrderByItem, scope?: ScopeRow): number {\n if (left === null || right === null) {\n if (left === right) return 0;\n const nullFirst = item.nulls ? item.nulls === \"FIRST\" : item.dir === \"ASC\";\n return (left === null ? -1 : 1) * (nullFirst ? 1 : -1);\n }\n let collation: string | null = null;\n if (item.expr.type === \"collate\") collation = item.expr.collation;\n else if (scope && item.expr.type === \"column\") {\n const key = item.expr.name.toLowerCase();\n const match = scope.cells.find(\n (cell) =>\n cell.name.toLowerCase() === key &&\n item.expr.type === \"column\" &&\n (item.expr.table === null || cell.table?.toLowerCase() === item.expr.table.toLowerCase()),\n );\n collation = match?.collate ?? null;\n }\n const comparison = collation ? compareWithCollation(left, right, collation) : compareSql(left, right);\n return (comparison ?? 0) * (item.dir === \"DESC\" ? -1 : 1);\n}\n\nfunction resultColumnNames(columns: ResultColumn[], sample?: ScopeRow): string[] {\n const names: string[] = [];\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const cell of sample?.cells ?? []) {\n if (\n (column.table !== null || !cell.hiddenByUsing) &&\n (column.table === null || cell.table?.toLowerCase() === column.table.toLowerCase())\n )\n names.push(cell.name);\n }\n } else if (\n !column.alias &&\n column.expr.type === \"column\" &&\n [\"rowid\", \"_rowid_\", \"oid\"].includes(column.expr.name.toLowerCase()) &&\n sample?.rowidName\n ) {\n names.push(sample.rowidName);\n } else names.push(column.alias ?? expressionName(column.expr));\n }\n return names;\n}\n\nfunction compareCompoundRows(left: SqlValue[], right: SqlValue[], order: OrderByItem[], columns: string[]): number {\n for (const item of order) {\n let index = -1;\n if (item.expr.type === \"literal\" && typeof item.expr.value === \"number\" && Number.isInteger(item.expr.value)) {\n index = item.expr.value - 1;\n } else if (item.expr.type === \"column\" && item.expr.table === null) {\n const requested = item.expr.name.toLowerCase();\n index = columns.findIndex((name) => name.toLowerCase() === requested);\n }\n if (index < 0) throw new SqliteError(\"ORDER BY term does not match any column in the result set\", \"other\");\n const result = compareNullable(left[index] ?? null, right[index] ?? null, item);\n if (result !== 0) return result;\n }\n return 0;\n}\n\nfunction validateProjectedColumns(stmt: SelectStmt, sample: ScopeRow, env: ExecutionEnv, parent?: EvalContext): void {\n const ctx = env.createEvalContext({ ...sample, rowid: 1, rowidName: sample.rowidName }, parent);\n const visit = (expr: Expr): void => {\n if (expr.type === \"column\") {\n if (expr.name !== \"*\") ctx.resolveColumn(expr.table, expr.name);\n return;\n }\n const recurse = (item: Expr) => visit(item);\n switch (expr.type) {\n case \"unary\":\n recurse(expr.expr);\n break;\n case \"is_bool\":\n recurse(expr.expr);\n break;\n case \"binary\":\n recurse(expr.left);\n recurse(expr.right);\n break;\n case \"between\":\n recurse(expr.expr);\n recurse(expr.lower);\n recurse(expr.upper);\n break;\n case \"in\":\n recurse(expr.expr);\n if (Array.isArray(expr.values)) expr.values.forEach(recurse);\n break;\n case \"like\":\n recurse(expr.expr);\n recurse(expr.pattern);\n if (expr.escape) recurse(expr.escape);\n break;\n case \"function\":\n case \"aggregate\":\n if (expr.args !== \"*\") expr.args.forEach(recurse);\n if (expr.filter) recurse(expr.filter);\n break;\n case \"window\":\n if (expr.func.args !== \"*\") expr.func.args.forEach(recurse);\n break;\n case \"case\":\n if (expr.base) recurse(expr.base);\n expr.whens.forEach((branch) => {\n recurse(branch.when);\n recurse(branch.then);\n });\n if (expr.else) recurse(expr.else);\n break;\n case \"cast\":\n case \"collate\":\n recurse(expr.expr);\n break;\n case \"row\":\n expr.values.forEach(recurse);\n break;\n }\n };\n for (const column of stmt.columns) if (column.type === \"expr\") visit(column.expr);\n}\n\nfunction expressionName(expr: Expr): string {\n if (expr.type === \"column\") return expr.name;\n if (expr.type === \"literal\") {\n if (expr.value === null) return \"NULL\";\n if (expr.value instanceof Uint8Array)\n return `X'${Array.from(expr.value)\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase()}'`;\n return typeof expr.value === \"string\" ? `'${expr.value.replaceAll(\"'\", \"''\")}'` : String(expr.value);\n }\n if (expr.type === \"null\") return \"NULL\";\n if (expr.type === \"function\" || expr.type === \"aggregate\") {\n if (expr.args === \"*\") return `${expr.name.toLowerCase()}(*)`;\n const args = expr.args.map((arg) => expressionName(arg)).join(\", \");\n return `${expr.name.toLowerCase()}(${args})`;\n }\n if (expr.type === \"binary\") {\n return `${expressionName(expr.left)} ${expr.op} ${expressionName(expr.right)}`;\n }\n if (expr.type === \"is_bool\") {\n const sense = expr.sense ? \"TRUE\" : \"FALSE\";\n return `${expressionName(expr.expr)} IS${expr.not ? \" NOT\" : \"\"} ${sense}`;\n }\n return expr.type;\n}\n\nfunction replaceSpecial(expr: Expr, evaluate: (expr: AggregateExpr | WindowExpr) => SqlValue): Expr {\n if (expr.type === \"aggregate\" || expr.type === \"window\") return { type: \"literal\", value: evaluate(expr) };\n const recurse = (item: Expr) => replaceSpecial(item, evaluate);\n switch (expr.type) {\n case \"unary\":\n return { ...expr, expr: recurse(expr.expr) };\n case \"is_bool\":\n return { ...expr, expr: recurse(expr.expr) };\n case \"binary\":\n return { ...expr, left: recurse(expr.left), right: recurse(expr.right) };\n case \"between\":\n return { ...expr, expr: recurse(expr.expr), lower: recurse(expr.lower), upper: recurse(expr.upper) };\n case \"in\":\n return {\n ...expr,\n expr: recurse(expr.expr),\n values: Array.isArray(expr.values) ? expr.values.map(recurse) : expr.values,\n };\n case \"like\":\n return {\n ...expr,\n expr: recurse(expr.expr),\n pattern: recurse(expr.pattern),\n escape: expr.escape && recurse(expr.escape),\n };\n case \"function\":\n return {\n ...expr,\n args: expr.args === \"*\" ? \"*\" : expr.args.map(recurse),\n filter: expr.filter && recurse(expr.filter),\n };\n case \"case\":\n return {\n ...expr,\n base: expr.base && recurse(expr.base),\n whens: expr.whens.map(({ when, then: thenExpr }) => {\n // biome-ignore lint/suspicious/noThenProperty: CASE WHEN/THEN AST field, not a thenable\n return { when: recurse(when), then: recurse(thenExpr) };\n }),\n else: expr.else && recurse(expr.else),\n };\n case \"cast\":\n return { ...expr, expr: recurse(expr.expr) };\n case \"row\":\n return { ...expr, values: expr.values.map(recurse) };\n case \"collate\":\n return { ...expr, expr: recurse(expr.expr) };\n default:\n return expr;\n }\n}\n\nfunction containsAggregate(expr: Expr): boolean {\n let found = false;\n replaceSpecial(expr, (special) => {\n if (special.type === \"aggregate\") found = true;\n return null;\n });\n return found;\n}\n\nfunction referencesTable(select: SelectStmt, name: string): boolean {\n const target = name.toLowerCase();\n const visit = (item: FromItem | null): boolean => {\n if (!item) return false;\n if (item.type === \"table\") return item.name.toLowerCase() === target;\n if (item.type === \"join\") return visit(item.left) || visit(item.right);\n return item.type === \"subquery\" ? referencesTable(item.select, name) : false;\n };\n return visit(select.from) || (select.compound ? referencesTable(select.compound.select, name) : false);\n}\n\nfunction rowsEqual(left: SqlValue[], right: SqlValue[]): boolean {\n return (\n left.length === right.length &&\n left.every((value, index) => {\n const other = right[index] ?? null;\n return (value === null && other === null) || (value !== null && other !== null && sqlValueEquals(value, other));\n })\n );\n}\n\nfunction uniqueRows(rows: SqlValue[][]): SqlValue[][] {\n const seen = new Set<string>();\n const result: SqlValue[][] = [];\n for (const row of rows) {\n const key = valueKey(row);\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(row);\n }\n return result;\n}\n\nfunction valueKey(values: SqlValue[]): string {\n return values.map(valueKeyPart).join(\"\\0\");\n}\n\nfunction valueKeyPart(value: SqlValue): string {\n if (value === null) return \"N\";\n if (typeof value === \"bigint\") return `I:${value.toString()}`;\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) return `I:${value.toString()}`;\n if (Number.isNaN(value)) return \"F:nan\";\n return `F:${Object.is(value, -0) ? \"0\" : value.toString()}`;\n }\n if (typeof value === \"string\") return `T:${value}`;\n if (value instanceof Uint8Array) {\n let hex = \"B:\";\n for (const byte of value) hex += byte.toString(16).padStart(2, \"0\");\n return hex;\n }\n if (\"value\" in value && typeof value.value === \"number\") {\n const n = value.value;\n if (Number.isInteger(n)) return `I:${n.toString()}`;\n return `F:${n.toString()}`;\n }\n if (\"value\" in value && typeof value.value === \"string\") return `T:${value.value}`;\n return `T:${String(value)}`;\n}\n\nfunction scanDbStat(db: DatabaseState, alias: string, _schemaArg: string | null): ScopeRow[] {\n const rows: ScopeRow[] = [];\n let pageno = 1;\n const push = (name: string, pagetype: string, ncell: number) => {\n rows.push({\n cells: [\n { table: alias, name: \"name\", value: name },\n { table: alias, name: \"path\", value: \"/\" },\n { table: alias, name: \"pageno\", value: pageno++ },\n { table: alias, name: \"pagetype\", value: pagetype },\n { table: alias, name: \"ncell\", value: ncell },\n { table: alias, name: \"payload\", value: ncell * 8 },\n { table: alias, name: \"unused\", value: 0 },\n { table: alias, name: \"mx_payload\", value: 0 },\n { table: alias, name: \"pgoffset\", value: (pageno - 1) * 4096 },\n { table: alias, name: \"pgsize\", value: 4096 },\n ],\n });\n };\n push(\"sqlite_schema\", \"leaf\", db.tables.size + db.views.size + db.virtualTables.size);\n for (const table of db.tables.values()) {\n push(table.name, \"leaf\", [...table.scan()].length);\n }\n for (const table of db.virtualTables.values()) {\n if (table.kind === \"fts5\" || table.kind === \"fts3\" || table.kind === \"fts4\" || table.kind === \"rtree\") {\n push(table.name, \"leaf\", table.kind === \"rtree\" ? table.rows.size : table.rows.size);\n } else {\n push(table.name, \"leaf\", 0);\n }\n }\n return rows;\n}\n\nfunction scanFtsVocab(db: DatabaseState, alias: string, vocab: FtsVocabVirtualTable): ScopeRow[] {\n const fts = db.virtualTables.get(vocab.ftsTable.toLowerCase());\n if (!fts || (fts.kind !== \"fts5\" && fts.kind !== \"fts3\" && fts.kind !== \"fts4\")) return [];\n return fts.vocabRows(\"row\").map((record) => ({\n cells: vocab.columns.map((column) => ({\n table: alias,\n name: column,\n value: record[column] ?? (column === \"col\" ? \"*\" : column === \"offset\" ? 0 : null),\n })),\n }));\n}\n", "import type {\n AlterTableStmt,\n CreateIndexStmt,\n CreateTableStmt,\n CreateViewStmt,\n DropIndexStmt,\n DropTableStmt,\n DropViewStmt,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport { makeColumnInfo } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport { isTruthySql } from \"../types/value.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { emptyResult, type ResultSet, resultValues } from \"./result.ts\";\nimport { executeSelect } from \"./select.ts\";\n\nexport function executeCreateTable(stmt: CreateTableStmt, env: ExecutionEnv): ResultSet {\n if (!stmt.asSelect) {\n env.state.createTable(stmt);\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n }\n const result = executeSelect(stmt.asSelect, env);\n const columns = result.columns.map((name) => ({ name, typeName: null, constraints: [] }));\n const table = env.state.createTable({ ...stmt, columns, constraints: [], asSelect: null });\n for (const values of resultValues(result)) {\n table.insert(\n new Map(table.columns.map((column, index) => [normalizeColumnName(column.name), values[index] ?? null])),\n );\n }\n // Populate any autoindexes created with the empty table.\n const db = env.state.databaseForTable(table);\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index) continue;\n index.store.clear();\n for (const row of table.scan()) {\n index.store.insert(\n index.columns.map((column) =>\n normalizeForCollation(row.values.get(normalizeColumnName(column.name)) ?? null, column.collate ?? \"BINARY\"),\n ),\n row.rowid,\n index.unique,\n );\n }\n }\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeCreateIndex(stmt: CreateIndexStmt, env: ExecutionEnv): ResultSet {\n const index = env.state.createIndex(stmt);\n const table = env.state.getTable(stmt.table);\n try {\n for (const row of table.scan()) {\n const ctx = env.createEvalContext({\n rowid: row.rowid,\n sourceTable: table.name,\n cells: table.columns.map((column) => ({\n table: table.name,\n name: column.name,\n value: row.values.get(normalizeColumnName(column.name)) ?? null,\n })),\n });\n if (stmt.where && isTruthySql(evalExpr(stmt.where, ctx)) !== true) continue;\n index.store.insert(\n stmt.columns.map((column) => {\n const raw = column.expr\n ? evalExpr(column.expr, ctx)\n : (row.values.get(normalizeColumnName(column.name)) ?? null);\n return normalizeForCollation(raw, column.collate ?? \"BINARY\");\n }),\n row.rowid,\n stmt.unique,\n );\n }\n } catch (error) {\n env.state.dropIndex(stmt.name, true);\n throw error;\n }\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeAlterTable(stmt: AlterTableStmt, env: ExecutionEnv): ResultSet {\n const table = env.state.getWritableTable(stmt.table);\n const action = stmt.action;\n if (action.kind === \"rename_table\") {\n env.state.renameTable(stmt.table, action.newName);\n } else if (action.kind === \"rename_column\") {\n const column = table.columns.find((item) => item.name.toLowerCase() === action.oldName.toLowerCase());\n if (!column) throw new SqliteError(`no such column: ${action.oldName}`, \"no_such_column\");\n if (table.columns.some((item) => item.name.toLowerCase() === action.newName.toLowerCase()))\n throw new SqliteError(`duplicate column name: ${action.newName}`, \"other\");\n const oldKey = normalizeColumnName(column.name);\n column.name = action.newName;\n column.nameLower = action.newName.toLowerCase();\n for (const row of table.rows.values()) {\n const value = row.values.get(oldKey) ?? null;\n row.values.delete(oldKey);\n row.values.set(normalizeColumnName(action.newName), value);\n }\n for (const constraint of table.constraints) renameConstraintColumn(constraint, action.oldName, action.newName);\n for (const name of table.indexes) {\n const index = env.state.getWritableIndex(name);\n if (index)\n for (const indexed of index.columns)\n if (indexed.name.toLowerCase() === action.oldName.toLowerCase()) indexed.name = action.newName;\n }\n table.clearEqualityHashes();\n env.state.schemaVersion++;\n } else if (action.kind === \"add_column\") {\n if (table.columns.some((item) => item.name.toLowerCase() === action.column.name.toLowerCase()))\n throw new SqliteError(`duplicate column name: ${action.column.name}`, \"other\");\n const primary = action.column.constraints.some((item) => item.type === \"primary_key\");\n const unique = action.column.constraints.some((item) => item.type === \"unique\");\n if ((primary || unique) && table.rows.size > 0)\n throw new SqliteError(\"Cannot add a PRIMARY KEY or UNIQUE column\", \"other\");\n const defaultExpr = action.column.constraints.find((item) => item.type === \"default\")?.expr ?? null;\n const collate = action.column.constraints.find((item) => item.type === \"collate\");\n const generated = action.column.constraints.find((item) => item.type === \"generated\");\n const column = makeColumnInfo(action.column.name, action.column.typeName, {\n notNull: action.column.constraints.some((item) => item.type === \"not_null\"),\n primaryKey: primary,\n unique,\n defaultExpr,\n collate: collate?.type === \"collate\" ? collate.name : null,\n generated: generated?.type === \"generated\" ? { expr: generated.expr, stored: generated.stored } : null,\n });\n const defaultValue = defaultExpr ? evalExpr(defaultExpr, env.createEvalContext()) : null;\n if (column.notNull && defaultValue === null && table.rows.size > 0)\n throw new SqliteError(\"Cannot add a NOT NULL column with default value NULL\", \"other\");\n table.columns.push(column);\n for (const row of table.rows.values()) row.values.set(normalizeColumnName(column.name), defaultValue);\n table.clearEqualityHashes();\n env.state.schemaVersion++;\n } else {\n const index = table.columns.findIndex((item) => item.name.toLowerCase() === action.name.toLowerCase());\n if (index < 0) throw new SqliteError(`no such column: ${action.name}`, \"no_such_column\");\n if (table.columns.length === 1)\n throw new SqliteError(\"cannot drop column: table must have at least one column\", \"other\");\n const column = table.columns[index]!;\n if (column.primaryKey) {\n throw new SqliteError(`cannot drop PRIMARY KEY or UNIQUE column: ${action.name}`, \"other\");\n }\n if (column.unique) {\n throw new SqliteError(`cannot drop UNIQUE column: \"${action.name}\"`, \"other\");\n }\n if (\n table.constraints.some(\n (item) =>\n (item.type === \"primary_key\" || item.type === \"unique\") &&\n item.columns.some((part) => part.name.toLowerCase() === action.name.toLowerCase()),\n )\n ) {\n throw new SqliteError(\n `error in table ${stmt.table} after drop column: no such column: ${action.name}`,\n \"no_such_column\",\n );\n }\n for (const name of table.indexes) {\n const schemaIndex = env.state.indexes.get(name.toLowerCase());\n if (schemaIndex?.columns.some((part) => part.name.toLowerCase() === action.name.toLowerCase())) {\n throw new SqliteError(\n `error in index ${name} after drop column: no such column: ${action.name}`,\n \"no_such_column\",\n );\n }\n }\n table.columns.splice(index, 1);\n for (const row of table.rows.values()) row.values.delete(normalizeColumnName(action.name));\n table.clearEqualityHashes();\n env.state.schemaVersion++;\n }\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropTable(stmt: DropTableStmt, env: ExecutionEnv): ResultSet {\n env.state.dropTable(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropIndex(stmt: DropIndexStmt, env: ExecutionEnv): ResultSet {\n env.state.dropIndex(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeCreateView(stmt: CreateViewStmt, env: ExecutionEnv): ResultSet {\n env.state.createView(stmt);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropView(stmt: DropViewStmt, env: ExecutionEnv): ResultSet {\n env.state.dropView(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nfunction renameConstraintColumn(\n constraint: import(\"../ast/nodes.ts\").TableConstraint,\n oldName: string,\n newName: string,\n): void {\n if (constraint.type === \"primary_key\" || constraint.type === \"unique\") {\n for (const column of constraint.columns)\n if (column.name.toLowerCase() === oldName.toLowerCase()) column.name = newName;\n } else if (constraint.type === \"foreign_key\") {\n constraint.columns = constraint.columns.map((name) =>\n name.toLowerCase() === oldName.toLowerCase() ? newName : name,\n );\n }\n}\n", "import type { Expr } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { IndexStore } from \"../indexes/index.ts\";\nimport type { Row, Rowid } from \"../storage/row.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport type { ColumnInfo, Table } from \"../storage/table.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport { isTruthySql } from \"../types/value.ts\";\n\nexport type CheckEvaluator = (expr: Expr, row: Row) => SqlValue;\n\nexport function checkNotNull(columns: readonly ColumnInfo[], row: Row, tableName = \"table\"): void {\n for (const column of columns) {\n if (!column.notNull) continue;\n if ((row.values.get(normalizeColumnName(column.name)) ?? null) === null) {\n throw new SqliteError(\n `NOT NULL constraint failed: ${tableName}.${column.name}`,\n \"constraint_notnull\",\n \"SQLITE_CONSTRAINT_NOTNULL\",\n );\n }\n }\n}\n\nexport function checkPrimaryKey(columns: readonly ColumnInfo[], row: Row, tableName = \"table\"): void {\n for (const column of columns) {\n if (!column.primaryKey) continue;\n if ((row.values.get(normalizeColumnName(column.name)) ?? null) === null) {\n throw new SqliteError(\n `PRIMARY KEY constraint failed: ${tableName}.${column.name}`,\n \"constraint_primary\",\n \"SQLITE_CONSTRAINT_PRIMARYKEY\",\n );\n }\n }\n}\n\nexport function checkUnique(index: IndexStore, values: readonly SqlValue[], rowid?: Rowid): void {\n index.checkUnique(values, rowid);\n}\n\nexport function checkExpressions(\n expressions: readonly Expr[],\n row: Row,\n evaluate: CheckEvaluator,\n constraintName = \"CHECK\",\n): void {\n for (const expression of expressions) {\n const result = evaluate(expression, row);\n if (result !== null && isTruthySql(result) === false) {\n throw new SqliteError(\n `CHECK constraint failed: ${constraintName}`,\n \"constraint_check\",\n \"SQLITE_CONSTRAINT_CHECK\",\n );\n }\n }\n}\n\nexport function checkTableConstraints(table: Table, row: Row, evaluate: CheckEvaluator): void {\n checkNotNull(table.columns, row, table.name);\n checkPrimaryKey(table.columns, row, table.name);\n for (const constraint of table.constraints) {\n if (constraint.type !== \"check\") continue;\n checkExpressions([constraint.expr], row, evaluate, constraint.name ?? table.name);\n }\n}\n", "import type { CreateTriggerStmt, DropTriggerStmt, Statement } from \"../ast/nodes.ts\";\nimport { SqliteError, TriggerRaiseError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport type { TriggerInfo } from \"../storage/database-state.ts\";\nimport { splitQualifiedName } from \"../storage/database-state.ts\";\nimport type { Row } from \"../storage/row.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { isTruthySql, type SqlValue } from \"../types/value.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"./env.ts\";\nimport { executeStatement } from \"./execute.ts\";\nimport { emptyResult, type ResultSet } from \"./result.ts\";\n\nconst MAX_TRIGGER_DEPTH = 1000;\n\nexport function executeCreateTrigger(stmt: CreateTriggerStmt, env: ExecutionEnv): ResultSet {\n const { schema, bare } = splitQualifiedName(stmt.name);\n const target = schema !== null ? env.state.databaseForSchema(schema, stmt.name) : env.state;\n const existing = target.triggers.get(bare.toLowerCase());\n if (existing && stmt.ifNotExists) {\n return emptyResult(0, env.state.lastInsertRowid);\n }\n\n const tableKey = splitQualifiedName(stmt.table).bare.toLowerCase();\n const isView = target.views.has(tableKey);\n const isTable = target.tables.has(tableKey);\n if (stmt.timing === \"INSTEAD\") {\n if (!isView) throw new SqliteError(`cannot create INSTEAD OF trigger on table: ${stmt.table}`, \"other\");\n } else if (isView) {\n throw new SqliteError(`cannot create ${stmt.timing} trigger on view: ${stmt.table}`, \"other\");\n } else if (!isTable) {\n throw new SqliteError(`no such table: ${stmt.table}`, \"no_such_table\");\n }\n\n if (existing) throw new SqliteError(`object already exists: ${bare}`, \"other\");\n\n target.createTrigger({\n name: bare,\n tableName: splitQualifiedName(stmt.table).bare,\n timing: stmt.timing,\n event: stmt.event,\n when: stmt.when,\n forEachRow: stmt.forEachRow,\n body: stmt.body,\n updateColumns: stmt.updateColumns,\n originalSql: null,\n });\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropTrigger(stmt: DropTriggerStmt, env: ExecutionEnv): ResultSet {\n env.state.dropTrigger(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function fireInsertTriggers(\n timing: \"BEFORE\" | \"AFTER\" | \"INSTEAD\",\n table: Table,\n values: Map<string, SqlValue>,\n oldRow: Row | null,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n return runTriggers(table, \"INSERT\", timing, oldRow, values, null, env);\n}\n\nexport function fireUpdateTriggers(\n timing: \"BEFORE\" | \"AFTER\",\n table: Table,\n oldRow: Row,\n newValues: Map<string, SqlValue>,\n updatedColumns: Set<string>,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n return runTriggers(table, \"UPDATE\", timing, oldRow, newValues, updatedColumns, env);\n}\n\nexport function fireDeleteTriggers(\n timing: \"BEFORE\" | \"AFTER\",\n table: Table,\n oldRow: Row,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n return runTriggers(table, \"DELETE\", timing, oldRow, null, null, env);\n}\n\nfunction runTriggers(\n table: Table,\n event: TriggerInfo[\"event\"],\n timing: TriggerInfo[\"timing\"],\n oldRow: Row | null,\n newValues: Map<string, SqlValue> | null,\n updatedColumns: Set<string> | null,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n const db = env.state.databaseForTable(table);\n if (db.triggers.size === 0) return \"ok\";\n const triggers = [...db.triggers.values()].filter(\n (trigger) =>\n trigger.tableName.toLowerCase() === table.name.toLowerCase() &&\n trigger.event === event &&\n trigger.timing === timing,\n );\n\n for (const trigger of triggers) {\n if (event === \"UPDATE\" && trigger.updateColumns) {\n const watched = new Set(trigger.updateColumns.map((name) => name.toLowerCase()));\n if (!updatedColumns || ![...updatedColumns].some((name) => watched.has(name.toLowerCase()))) continue;\n }\n if (trigger.when) {\n const scope = triggerScope(table, oldRow, newValues);\n if (isTruthySql(evalExpr(trigger.when, env.createEvalContext(scope))) !== true) continue;\n }\n const result = executeTriggerProgram(trigger, table, oldRow, newValues, env);\n if (result === \"ignore\") return \"ignore\";\n }\n return \"ok\";\n}\n\nfunction executeTriggerProgram(\n trigger: TriggerInfo,\n table: Table,\n oldRow: Row | null,\n newValues: Map<string, SqlValue> | null,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n if (env.triggerDepth >= MAX_TRIGGER_DEPTH) {\n throw new SqliteError(\"too many levels of trigger recursion\", \"other\");\n }\n env.triggerDepth++;\n const savedScope = env.triggerScope;\n env.triggerScope = triggerScope(table, oldRow, newValues);\n try {\n for (const statement of trigger.body) {\n executeTriggerStatement(statement, env);\n }\n return \"ok\";\n } catch (error) {\n if (error instanceof TriggerRaiseError) {\n if (error.action === \"IGNORE\") return \"ignore\";\n if (error.action === \"ROLLBACK\") {\n env.transactions.rollback();\n throw error;\n }\n throw error;\n }\n throw error;\n } finally {\n env.triggerScope = savedScope;\n env.triggerDepth--;\n }\n}\n\nfunction executeTriggerStatement(statement: Statement, env: ExecutionEnv): void {\n executeStatement(statement, env);\n}\n\nfunction triggerScope(table: Table, oldRow: Row | null, newValues: Map<string, SqlValue> | null): ScopeRow {\n const cells: ScopeRow[\"cells\"] = [];\n for (const column of table.columns) {\n const key = normalizeColumnName(column.name);\n cells.push({\n table: \"old\",\n name: column.name,\n value: oldRow ? (oldRow.values.get(key) ?? null) : null,\n affinity: column.affinity,\n collate: column.collate,\n });\n cells.push({\n table: \"new\",\n name: column.name,\n value: newValues ? (newValues.get(key) ?? null) : null,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n return {\n cells,\n rowid: oldRow?.rowid ?? undefined,\n sourceTable: table.name,\n };\n}\n", "import type { CreateVirtualTableStmt } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport type { Fts5VirtualTable } from \"../vtable/fts5.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { emptyResult, type ResultSet } from \"./result.ts\";\n\nexport function executeCreateVirtualTable(stmt: CreateVirtualTableStmt, env: ExecutionEnv): ResultSet {\n env.state.createVirtualTable(stmt);\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeFtsInsert(\n table: Fts5VirtualTable,\n columnNames: string[],\n sourceRows: SqlValue[][],\n env: ExecutionEnv,\n): { changes: number; lastInsertRowid: number | bigint } {\n let changes = 0;\n let last = env.state.lastInsertRowid;\n for (const source of sourceRows) {\n if (source.length !== columnNames.length) {\n throw new SqliteError(`${source.length} values for ${columnNames.length} columns`, \"other\");\n }\n const values = new Map<string, SqlValue>();\n let explicitRowid: number | bigint | undefined;\n for (let i = 0; i < columnNames.length; i++) {\n const name = columnNames[i]!;\n const lower = name.toLowerCase();\n const value = source[i] ?? null;\n if (lower === \"rowid\" || lower === \"_rowid_\" || lower === \"oid\") {\n if (typeof value === \"number\" || typeof value === \"bigint\") explicitRowid = value;\n else if (value !== null) explicitRowid = Number(value);\n continue;\n }\n values.set(normalizeColumnName(name), value);\n }\n for (const column of table.columns) {\n const key = normalizeColumnName(column);\n if (!values.has(key) && !columnNames.some((n) => n.toLowerCase() === key)) {\n values.set(key, null);\n }\n }\n const rowid = table.insert(values, explicitRowid);\n // Special commands don't change row counts the same way \u2014 still count as a write\n changes++;\n last = rowid;\n }\n return { changes, lastInsertRowid: last };\n}\n\nexport function executeFtsUpdate(\n table: Fts5VirtualTable,\n updates: Map<string, SqlValue>,\n rowids: Iterable<number | bigint>,\n): number {\n let changes = 0;\n for (const rowid of rowids) {\n table.update(rowid, updates);\n changes++;\n }\n return changes;\n}\n\nexport function executeFtsDelete(table: Fts5VirtualTable, rowids: Iterable<number | bigint>): number {\n let changes = 0;\n for (const rowid of rowids) {\n table.delete(rowid);\n changes++;\n }\n return changes;\n}\n", "import type { DeleteStmt, Expr, IndexedColumn, InsertStmt, ResultColumn, SetItem, UpdateStmt } from \"../ast/nodes.ts\";\nimport { checkTableConstraints } from \"../constraints/check.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { exprEquals } from \"../expressions/equals.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport type { Row, Rowid } from \"../storage/row.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport { tryIndexedTableRows } from \"../planner/access.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport { applyStrictValue } from \"../types/strict.ts\";\nimport { applyAffinity, compareSql, isTruthySql, type SqlValue } from \"../types/value.ts\";\nimport type { Fts5Row, Fts5VirtualTable } from \"../vtable/fts5.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"./env.ts\";\nimport { emptyResult, type ResultSet, resultValues, valuesToResult } from \"./result.ts\";\nimport { executeSelect, scanFrom } from \"./select.ts\";\nimport { fireDeleteTriggers, fireInsertTriggers, fireUpdateTriggers } from \"./triggers.ts\";\nimport { executeFtsDelete, executeFtsInsert, executeFtsUpdate } from \"./vtable.ts\";\n\nfunction storeColumnValue(\n table: Table,\n column: { name: string; typeName: string | null; affinity: import(\"../types/value.ts\").Affinity },\n value: SqlValue,\n): SqlValue {\n if (table.strict) return applyStrictValue(value, column.typeName ?? \"\", table.name, column.name);\n return applyAffinity(value, column.affinity);\n}\n\nexport function executeInsert(stmt: InsertStmt, env: ExecutionEnv): ResultSet {\n if (env.state.isVirtualTable(stmt.table)) {\n return executeVirtualInsert(stmt, env);\n }\n const fast = tryFastInsert(stmt, env);\n if (fast) return fast;\n const table = env.state.getWritableTable(stmt.table);\n const columnNames = stmt.columns ?? table.columns.map((column) => column.name);\n const rowidIndexes = columnNames.map((name, index) => (isRowidName(name) ? index : -1)).filter((index) => index >= 0);\n if (rowidIndexes.length > 1) throw new SqliteError(\"duplicate column name: rowid\", \"other\");\n if (table.withoutRowid && rowidIndexes.length > 0) {\n throw new SqliteError(`table ${table.name} has no column named rowid`, \"other\");\n }\n for (const name of columnNames) if (!isRowidName(name)) columnOf(table, name);\n const sourceRows = evaluateInsertSource(stmt, env);\n const returningRows: SqlValue[][] = [];\n let changes = 0;\n let last = env.state.lastInsertRowid;\n const suppliedIndexes = table.columns.map((column) =>\n columnNames.findIndex((name) => name.toLowerCase() === (column.nameLower ?? column.name.toLowerCase())),\n );\n const unconstrained =\n table.isUnconstrained() &&\n !stmt.upsert &&\n stmt.mode === \"insert\" &&\n stmt.returning.length === 0 &&\n rowidIndexes.length === 0;\n\n if (unconstrained) {\n for (const source of sourceRows) {\n if (source.length !== columnNames.length)\n throw new SqliteError(`${source.length} values for ${columnNames.length} columns`, \"other\");\n const values = new Map<string, SqlValue>();\n for (let index = 0; index < table.columns.length; index++) {\n const column = table.columns[index]!;\n const suppliedIndex = suppliedIndexes[index]!;\n const value = suppliedIndex >= 0 ? (source[suppliedIndex] ?? null) : null;\n values.set(column.nameLower ?? column.name.toLowerCase(), storeColumnValue(table, column, value));\n }\n last = table.insert({ values }, { prepared: true, skipValidate: true });\n changes++;\n }\n env.state.recordChange(changes, last);\n return emptyResult(changes, last);\n }\n\n for (const source of sourceRows) {\n if (source.length !== columnNames.length)\n throw new SqliteError(`${source.length} values for ${columnNames.length} columns`, \"other\");\n const values = new Map<string, SqlValue>();\n for (const column of table.columns) {\n if (column.generated) continue;\n const suppliedIndex = suppliedIndexes[table.columns.indexOf(column)] ?? -1;\n const value =\n suppliedIndex >= 0\n ? (source[suppliedIndex] ?? null)\n : column.defaultExpr\n ? evalExpr(column.defaultExpr, env.createEvalContext())\n : null;\n values.set(column.nameLower ?? column.name.toLowerCase(), storeColumnValue(table, column, value));\n }\n for (const column of table.columns) {\n if (!column.generated) continue;\n if (columnNames.some((name) => name.toLowerCase() === column.name.toLowerCase())) {\n throw new SqliteError(`cannot INSERT into generated column \"${column.name}\"`, \"misuse\");\n }\n if (column.generated.stored) {\n const genCtx = env.createEvalContext({\n cells: table.columns\n .filter((c) => !c.generated || c === column)\n .flatMap((c) => {\n if (c.generated && c !== column) return [];\n if (c === column) return [];\n return [\n {\n table: table.name,\n name: c.name,\n value: values.get(normalizeColumnName(c.name)) ?? null,\n affinity: c.affinity,\n collate: c.collate,\n },\n ];\n }),\n });\n const computed = evalExpr(column.generated.expr, genCtx);\n values.set(normalizeColumnName(column.name), storeColumnValue(table, column, computed));\n } else {\n values.set(normalizeColumnName(column.name), null);\n }\n }\n\n if (fireInsertTriggers(\"BEFORE\", table, values, null, env) === \"ignore\") continue;\n\n const conflicts = conflictingRows(table, values, env);\n if (conflicts.length > 0) {\n if (stmt.upsert) {\n const targetConflicts = conflictsForUpsert(table, values, env, stmt.upsert);\n if (targetConflicts.length === 0) {\n // Conflict is on a different unique constraint than the ON CONFLICT target.\n throw new SqliteError(\n `UNIQUE constraint failed: ${table.name}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n if (stmt.upsert.action === \"nothing\") continue;\n const row = targetConflicts[0]!;\n const scope = scopeFor(table, row, stmt.table, env);\n const excluded: ScopeRow = {\n cells: table.columns.map((column) => ({\n table: \"excluded\",\n name: column.name,\n value: values.get(normalizeColumnName(column.name)) ?? null,\n })),\n };\n const merged = { cells: [...scope.cells, ...excluded.cells], rowid: row.rowid, sourceTable: table.name };\n const ctx = env.createEvalContext(merged);\n if (stmt.upsert.action.where && isTruthySql(evalExpr(stmt.upsert.action.where, ctx)) !== true) continue;\n const updates = evaluateSet(stmt.upsert.action.set, table, ctx);\n const updated = updateOne(table, row, updates, env);\n changes += 1 + updated.cascaded;\n if (stmt.returning.length)\n returningRows.push(projectReturning(stmt.returning, scopeFor(table, updated.row, stmt.table, env), env));\n continue;\n }\n const mode = stmt.mode;\n if (mode === \"insert_or_ignore\") continue;\n if (mode === \"replace\" || mode === \"insert_or_replace\") {\n for (const row of conflicts) removeOne(table, row, env);\n } else {\n throw new SqliteError(\n `UNIQUE constraint failed: ${table.name}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n }\n\n let insertedRowid: Rowid | undefined;\n try {\n const suppliedRowid = rowidIndexes.length ? asExplicitRowid(source[rowidIndexes[0]!] ?? null) : undefined;\n const rowid = table.insert({ values, rowid: suppliedRowid }, { prepared: true });\n insertedRowid = rowid;\n const row = table.rows.get(rowid)!;\n validateRow(table, row, env);\n if (table.indexes.length > 0) addIndexes(table, row, env);\n if (env.state.foreignKeysEnabled) checkForeignKeys(table, row, env);\n fireInsertTriggers(\"AFTER\", table, row.values, null, env);\n changes++;\n last = table.withoutRowid ? 0 : rowid;\n if (stmt.returning.length)\n returningRows.push(projectReturning(stmt.returning, scopeFor(table, row, stmt.table, env), env));\n } catch (error) {\n if (insertedRowid !== undefined) {\n const inserted = table.rows.get(insertedRowid);\n if (inserted) removeOne(table, inserted, env);\n }\n if (stmt.mode === \"insert_or_ignore\" && error instanceof SqliteError && error.category.startsWith(\"constraint\"))\n continue;\n throw error;\n }\n }\n env.state.recordChange(changes, last);\n if (stmt.returning.length === 0) return emptyResult(changes, last);\n return valuesToResult(returningNames(stmt.returning, table), returningRows, changes, last);\n}\n\nfunction evaluateInsertSource(stmt: InsertStmt, env: ExecutionEnv): SqlValue[][] {\n if (stmt.select) return resultValues(executeSelect({ ...stmt.select, with: stmt.with ?? stmt.select.with }, env));\n if (!stmt.values) return [[]];\n const ctx = env.createEvalContext();\n return stmt.values.map((items) =>\n items.map((expr) => {\n if (expr.type === \"parameter\") return env.getBoundParameter(expr.name);\n if (expr.type === \"literal\") return expr.value;\n if (expr.type === \"null\") return null;\n return evalExpr(expr, ctx);\n }),\n );\n}\n\ninterface FastInsertSlot {\n key: string;\n affinity: import(\"../types/value.ts\").Affinity;\n read: (env: ExecutionEnv) => SqlValue;\n}\n\ninterface FastInsertPlan {\n tableName: string;\n slots: FastInsertSlot[];\n}\n\nconst fastInsertPlans = new WeakMap<InsertStmt, FastInsertPlan>();\n\nfunction tryFastInsert(stmt: InsertStmt, env: ExecutionEnv): ResultSet | null {\n if (stmt.with || stmt.select || stmt.upsert || stmt.returning.length > 0 || stmt.mode !== \"insert\") return null;\n if (stmt.values?.length !== 1) return null;\n let plan = fastInsertPlans.get(stmt);\n if (!plan) {\n const built = buildFastInsertPlan(stmt, env);\n if (!built) return null;\n plan = built;\n fastInsertPlans.set(stmt, plan);\n }\n let table: Table;\n try {\n table = env.state.getWritableTable(plan.tableName);\n } catch {\n return null;\n }\n if (!table.isUnconstrained()) return null;\n const values = new Map<string, SqlValue>();\n for (const slot of plan.slots) values.set(slot.key, applyAffinity(slot.read(env), slot.affinity));\n const last = table.insert({ values }, { prepared: true, skipValidate: true });\n env.state.recordChange(1, last);\n return emptyResult(1, last);\n}\n\nfunction buildFastInsertPlan(stmt: InsertStmt, env: ExecutionEnv): FastInsertPlan | null {\n let table: Table;\n try {\n table = env.state.getTable(stmt.table);\n } catch {\n return null;\n }\n if (!table.isUnconstrained()) return null;\n const tuple = stmt.values?.[0];\n if (!tuple) return null;\n const columnNames = stmt.columns ?? table.columns.map((column) => column.name);\n if (tuple.length !== columnNames.length) return null;\n if (columnNames.some((name) => isRowidName(name))) return null;\n const slots: FastInsertSlot[] = [];\n for (const column of table.columns) {\n const key = column.nameLower ?? column.name.toLowerCase();\n const suppliedIndex = columnNames.findIndex((name) => name.toLowerCase() === key);\n if (suppliedIndex < 0) {\n if (column.defaultExpr) return null;\n slots.push({ key, affinity: column.affinity, read: () => null });\n continue;\n }\n const expr = tuple[suppliedIndex];\n if (!expr) return null;\n if (expr.type === \"parameter\") {\n const name = expr.name;\n slots.push({ key, affinity: column.affinity, read: (exec) => exec.getBoundParameter(name) });\n } else if (expr.type === \"literal\") {\n const value = expr.value;\n slots.push({ key, affinity: column.affinity, read: () => value });\n } else if (expr.type === \"null\") {\n slots.push({ key, affinity: column.affinity, read: () => null });\n } else return null;\n }\n return { tableName: stmt.table, slots };\n}\n\nexport function executeUpdate(stmt: UpdateStmt, env: ExecutionEnv): ResultSet {\n if (env.state.isVirtualTable(stmt.table)) {\n return executeVirtualUpdate(stmt, env);\n }\n const table = env.state.getWritableTable(stmt.table);\n const alias = stmt.alias ?? stmt.table;\n const candidates: { row: Row; scope: ScopeRow }[] = [];\n\n if (stmt.from) {\n const fromRows = scanFrom(stmt.from, env);\n for (const row of table.scan()) {\n const targetScope = scopeFor(table, row, alias, env);\n let matchedScope: ScopeRow | null = null;\n for (const fromRow of fromRows) {\n const joined: ScopeRow = {\n ...targetScope,\n cells: [...targetScope.cells, ...fromRow.cells],\n };\n if (stmt.where && isTruthySql(evalExpr(stmt.where, env.createEvalContext(joined))) !== true) continue;\n matchedScope = joined;\n break;\n }\n if (matchedScope) candidates.push({ row, scope: matchedScope });\n }\n } else {\n const indexed =\n stmt.where === null\n ? null\n : tryIndexedTableRows({ type: \"table\", schema: null, name: stmt.table, alias: stmt.alias }, stmt.where, env);\n const scanRows = indexed ? indexed.rows : table.scan();\n for (const row of scanRows) {\n const scope = scopeFor(table, row, alias, env);\n if (stmt.where && isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) !== true) continue;\n candidates.push({ row, scope });\n }\n }\n\n const returningRows: SqlValue[][] = [];\n let changes = 0;\n for (const { row, scope } of candidates) {\n const ctx = env.createEvalContext(scope);\n const updates = evaluateSet(stmt.set, table, ctx);\n const newValues = mergedValues(table, row, updates);\n const updatedColumns = new Set(\n [...updates.keys()].map((key) => {\n const column = table.columns.find((item) => normalizeColumnName(item.name) === key);\n return column?.name ?? key;\n }),\n );\n if (fireUpdateTriggers(\"BEFORE\", table, row, newValues, updatedColumns, env) === \"ignore\") continue;\n try {\n const updated = updateOne(table, row, updates, env);\n fireUpdateTriggers(\"AFTER\", table, row, updated.row.values, updatedColumns, env);\n changes += 1 + updated.cascaded;\n if (stmt.returning.length)\n returningRows.push(projectReturning(stmt.returning, scopeFor(table, updated.row, alias, env), env));\n } catch (error) {\n if (stmt.or === \"ignore\" && error instanceof SqliteError && error.category.startsWith(\"constraint\")) continue;\n throw error;\n }\n }\n env.state.recordChange(changes);\n return valuesToResult(returningNames(stmt.returning, table), returningRows, changes, env.state.lastInsertRowid);\n}\n\nexport function executeDelete(stmt: DeleteStmt, env: ExecutionEnv): ResultSet {\n if (env.state.isVirtualTable(stmt.table)) {\n return executeVirtualDelete(stmt, env);\n }\n const table = env.state.getWritableTable(stmt.table);\n const selectedSource =\n stmt.where === null\n ? null\n : tryIndexedTableRows({ type: \"table\", schema: null, name: stmt.table, alias: stmt.alias }, stmt.where, env);\n const selected = [...(selectedSource ? selectedSource.rows : table.scan())].filter((row) => {\n if (!stmt.where) return true;\n return (\n isTruthySql(evalExpr(stmt.where, env.createEvalContext(scopeFor(table, row, stmt.alias ?? stmt.table, env)))) ===\n true\n );\n });\n const returningRows: SqlValue[][] = [];\n let changes = 0;\n for (const row of selected) {\n if (fireDeleteTriggers(\"BEFORE\", table, row, env) === \"ignore\") continue;\n if (stmt.returning.length)\n returningRows.push(projectReturning(stmt.returning, scopeFor(table, row, stmt.alias ?? stmt.table, env), env));\n changes += applyReferentialDelete(table, row, env);\n removeOne(table, row, env);\n fireDeleteTriggers(\"AFTER\", table, row, env);\n changes++;\n }\n env.state.recordChange(changes);\n return valuesToResult(returningNames(stmt.returning, table), returningRows, changes, env.state.lastInsertRowid);\n}\n\nfunction mergedValues(table: Table, row: Row, updates: Map<string, SqlValue>): Map<string, SqlValue> {\n const values = new Map<string, SqlValue>();\n for (const column of table.columns) {\n const key = normalizeColumnName(column.name);\n values.set(key, updates.has(key) ? updates.get(key)! : (row.values.get(key) ?? null));\n }\n return values;\n}\n\nfunction evaluateSet(\n items: SetItem[],\n table: Table,\n ctx: ReturnType<ExecutionEnv[\"createEvalContext\"]>,\n): Map<string, SqlValue> {\n const updates = new Map<string, SqlValue>();\n for (const item of items) {\n if (item.columns.length === 1) {\n const column = columnOf(table, item.columns[0]!);\n if (column.generated) throw new SqliteError(`cannot UPDATE generated column \"${column.name}\"`, \"misuse\");\n updates.set(normalizeColumnName(column.name), storeColumnValue(table, column, evalExpr(item.expr, ctx)));\n continue;\n }\n if (item.expr.type !== \"row\" || item.expr.values.length !== item.columns.length) {\n throw new SqliteError(\n `${item.columns.length} columns assigned ${item.expr.type === \"row\" ? item.expr.values.length : 1} values`,\n \"other\",\n );\n }\n item.columns.forEach((name, index) => {\n const column = columnOf(table, name);\n if (column.generated) throw new SqliteError(`cannot UPDATE generated column \"${column.name}\"`, \"misuse\");\n updates.set(\n normalizeColumnName(column.name),\n storeColumnValue(table, column, evalExpr(item.expr.type === \"row\" ? item.expr.values[index]! : item.expr, ctx)),\n );\n });\n }\n return updates;\n}\n\nfunction updateOne(\n table: Table,\n row: Row,\n updates: Map<string, SqlValue>,\n env: ExecutionEnv,\n): { row: Row; cascaded: number } {\n const before = { rowid: row.rowid, values: new Map(row.values) };\n let after: Row | undefined;\n let indexesAdded = false;\n removeIndexes(table, before, env);\n try {\n const merged = new Map(row.values);\n for (const [name, value] of updates) merged.set(name, value);\n for (const column of table.columns) {\n if (!column.generated?.stored) continue;\n const genCtx = env.createEvalContext({\n cells: table.columns\n .filter((c) => !c.generated)\n .map((c) => ({\n table: table.name,\n name: c.name,\n value: merged.get(normalizeColumnName(c.name)) ?? null,\n affinity: c.affinity,\n collate: c.collate,\n })),\n });\n merged.set(\n normalizeColumnName(column.name),\n storeColumnValue(table, column, evalExpr(column.generated.expr, genCtx)),\n );\n }\n after = table.update(row.rowid, merged);\n if (!after) throw new SqliteError(`no such row: ${row.rowid}`, \"other\");\n validateRow(table, after, env);\n addIndexes(table, after, env);\n indexesAdded = true;\n checkForeignKeys(table, after, env);\n const cascaded = applyReferentialUpdate(table, before, after, env);\n return { row: after, cascaded };\n } catch (error) {\n if (after) {\n if (indexesAdded) removeIndexes(table, after, env);\n table.delete(after.rowid);\n }\n table.rows.set(before.rowid, before);\n if (table.withoutRowid) {\n // best-effort restore handled by table.update failure paths\n }\n addIndexes(table, before, env);\n throw error;\n }\n}\n\nfunction validateRow(table: Table, row: Row, env: ExecutionEnv): void {\n checkTableConstraints(table, row, (expr, candidate) =>\n evalExpr(expr, env.createEvalContext(scopeFor(table, candidate, table.name, env))),\n );\n}\n\nfunction addIndexes(table: Table, row: Row, env: ExecutionEnv): void {\n const db = env.state.databaseForTable(table);\n for (const name of table.indexes) {\n const found = db.indexes.get(name.toLowerCase());\n if (!found) continue;\n const index = db.ensureWritableIndex(found);\n if (\n index.where &&\n isTruthySql(evalExpr(index.where, env.createEvalContext(scopeFor(table, row, table.name, env)))) !== true\n )\n continue;\n index.store.insert(indexValues(index.columns, row, env, table), row.rowid, index.unique);\n }\n}\n\nfunction removeIndexes(table: Table, row: Row, env: ExecutionEnv): void {\n const db = env.state.databaseForTable(table);\n for (const name of table.indexes) {\n const found = db.indexes.get(name.toLowerCase());\n if (!found) continue;\n const index = db.ensureWritableIndex(found);\n index.store.remove(indexValues(index.columns, row, env, table), row.rowid);\n }\n}\n\nfunction removeOne(table: Table, row: Row, env: ExecutionEnv): void {\n removeIndexes(table, row, env);\n table.delete(row.rowid);\n}\n\nfunction conflictingRows(table: Table, values: Map<string, SqlValue>, env: ExecutionEnv): Row[] {\n return conflictsForSets(table, values, uniqueColumnSets(table, env), env);\n}\n\nfunction conflictsMatchingTarget(\n table: Table,\n values: Map<string, SqlValue>,\n env: ExecutionEnv,\n targetColumns: string[],\n): Row[] {\n const targetKeys = targetColumns.map((name) => normalizeColumnName(name));\n const matchingSets = uniqueColumnSets(table, env).filter((columns) => {\n if (columns.length !== targetKeys.length) return false;\n const setKeys = columns.map((column) => normalizeColumnName(column.name));\n return targetKeys.every((key) => setKeys.includes(key));\n });\n if (matchingSets.length === 0) {\n // Infer INTEGER PRIMARY KEY / rowid target.\n if (\n targetKeys.length === 1 &&\n (targetKeys[0] === \"rowid\" ||\n table.columns.some((column) => normalizeColumnName(column.name) === targetKeys[0] && column.primaryKey))\n ) {\n const pkSets = uniqueColumnSets(table, env).filter(\n (columns) =>\n columns.length === 1 &&\n (normalizeColumnName(columns[0]!.name) === targetKeys[0] ||\n table.columns.find((column) => normalizeColumnName(column.name) === normalizeColumnName(columns[0]!.name))\n ?.primaryKey),\n );\n return conflictsForSets(\n table,\n values,\n pkSets.length > 0 ? pkSets : [[{ name: targetColumns[0]!, collate: null, order: null }]],\n env,\n );\n }\n return [];\n }\n return conflictsForSets(table, values, matchingSets, env);\n}\n\nfunction conflictsForUpsert(\n table: Table,\n values: Map<string, SqlValue>,\n env: ExecutionEnv,\n upsert: NonNullable<InsertStmt[\"upsert\"]>,\n): Row[] {\n if (!upsert.targetColumns) return conflictingRows(table, values, env);\n const exprs = upsert.targetExprs;\n const hasExpr = exprs?.some((expr) => expr.type !== \"column\") ?? false;\n if (hasExpr && exprs) {\n const db = env.state.databaseForTable(table);\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index?.unique || index.columns.length !== exprs.length) continue;\n const matches = index.columns.every((column, i) => {\n const expr = exprs[i]!;\n if (column.expr) return exprEquals(column.expr, expr);\n return expr.type === \"column\" && expr.name.toLowerCase() === column.name.toLowerCase();\n });\n if (!matches) continue;\n if (upsert.targetWhere && index.where && !exprEquals(upsert.targetWhere, index.where)) continue;\n return conflictsForSets(table, values, [index.columns], env);\n }\n }\n return conflictsMatchingTarget(table, values, env, upsert.targetColumns.filter(Boolean));\n}\n\nfunction uniqueColumnSets(table: Table, env: ExecutionEnv): IndexedColumn[][] {\n const sets: IndexedColumn[][] = [];\n const seen = new Set<string>();\n const remember = (columns: IndexedColumn[]): void => {\n const key = columns.map((column) => normalizeColumnName(column.name)).join(\"\\0\");\n if (seen.has(key)) return;\n seen.add(key);\n sets.push(columns);\n };\n\n for (const indexName of table.indexes) {\n const index = env.state.databaseForTable(table).indexes.get(indexName.toLowerCase());\n if (index?.unique) remember(index.columns);\n }\n\n // INTEGER PRIMARY KEY / rowid uniqueness (no autoindex).\n const pk = table.integerPkColumn();\n if (pk) remember([{ name: pk.name, collate: pk.collate, order: null }]);\n\n // Fallback for any UNIQUE/PK constraints not yet covered by an index (legacy / edge cases).\n const hasTablePrimary = table.constraints.some((constraint) => constraint.type === \"primary_key\");\n for (const column of table.columns) {\n if (column.unique || (column.primaryKey && !hasTablePrimary)) {\n remember([{ name: column.name, collate: column.collate, order: null }]);\n }\n }\n for (const constraint of table.constraints) {\n if (constraint.type === \"unique\" || constraint.type === \"primary_key\") remember(constraint.columns);\n }\n return sets;\n}\n\nfunction conflictsForSets(\n table: Table,\n values: Map<string, SqlValue>,\n sets: IndexedColumn[][],\n env: ExecutionEnv,\n): Row[] {\n const found: Row[] = [];\n const seen = new Set<string>();\n const push = (row: Row): void => {\n const key = String(row.rowid);\n if (seen.has(key)) return;\n seen.add(key);\n found.push(row);\n };\n\n const db = env.state.databaseForTable(table);\n for (const columns of sets) {\n const desired = indexValuesFromMap(columns, values, table, env);\n if (desired.some((value) => value === null)) continue;\n\n // INTEGER PRIMARY KEY / rowid map.\n if (columns.length === 1) {\n const pk = table.integerPkColumn();\n if (pk && normalizeColumnName(columns[0]!.name) === normalizeColumnName(pk.name)) {\n const row = table.getByKey(desired[0]!);\n if (row) push(row);\n continue;\n }\n }\n\n // Prefer IndexStore lookup (autoindexes + CREATE INDEX).\n let usedIndex = false;\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index?.unique) continue;\n if (index.columns.length !== columns.length) continue;\n if (\n !index.columns.every((column, i) => normalizeColumnName(column.name) === normalizeColumnName(columns[i]!.name))\n ) {\n continue;\n }\n usedIndex = true;\n if (index.where && !indexWhereMatches(index.where, values, table, env)) continue;\n for (const rowid of index.store.lookup(desired)) {\n const row = table.get(rowid);\n if (row) push(row);\n }\n break;\n }\n if (usedIndex) continue;\n\n // Slow fallback: full scan (should be rare once autoindexes exist).\n for (const row of table.scan()) {\n const existing = indexValues(columns, row, env, table);\n if (desired.every((value, index) => compareSql(value, existing[index] ?? null) === 0)) push(row);\n }\n }\n return found;\n}\n\nfunction indexValues(columns: IndexedColumn[], row: Row, env?: ExecutionEnv, table?: Table): SqlValue[] {\n if (!env || !table) {\n return columns.map((column) =>\n normalizeForCollation(row.values.get(normalizeColumnName(column.name)) ?? null, column.collate ?? \"BINARY\"),\n );\n }\n const ctx = env.createEvalContext(scopeFor(table, row, table.name, env));\n return columns.map((column) => {\n const raw = column.expr ? evalExpr(column.expr, ctx) : (row.values.get(normalizeColumnName(column.name)) ?? null);\n return normalizeForCollation(raw, column.collate ?? \"BINARY\");\n });\n}\n\nfunction indexValuesFromMap(\n columns: IndexedColumn[],\n values: Map<string, SqlValue>,\n table: Table,\n env: ExecutionEnv,\n): SqlValue[] {\n const fake: Row = { rowid: 0, values };\n return indexValues(columns, fake, env, table);\n}\n\nfunction indexWhereMatches(where: Expr, values: Map<string, SqlValue>, table: Table, env: ExecutionEnv): boolean {\n const fake: Row = { rowid: 0, values };\n return isTruthySql(evalExpr(where, env.createEvalContext(scopeFor(table, fake, table.name, env)))) === true;\n}\n\nfunction checkForeignKeys(table: Table, row: Row, env: ExecutionEnv): void {\n if (!env.state.foreignKeysEnabled) return;\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\") continue;\n if (fkIsDeferred(constraint, env)) continue;\n assertForeignKeySatisfied(row, constraint, env);\n }\n}\n\nfunction fkIsDeferred(\n constraint: Extract<Table[\"constraints\"][number], { type: \"foreign_key\" }>,\n env: ExecutionEnv,\n): boolean {\n return env.transactions.inTransaction && constraint.initiallyDeferred;\n}\n\nfunction assertForeignKeySatisfied(\n row: Row,\n constraint: Extract<Table[\"constraints\"][number], { type: \"foreign_key\" }>,\n env: ExecutionEnv,\n): void {\n const values = constraint.columns.map((name) => row.values.get(normalizeColumnName(name)) ?? null);\n if (values.some((value) => value === null)) return;\n const parent = env.state.getTable(constraint.refTable);\n const parentColumns =\n constraint.refColumns ?? parent.columns.filter((column) => column.primaryKey).map((column) => column.name);\n if (\n ![...parent.scan()].some((candidate) =>\n values.every((value, index) => {\n const parentColumn = parentColumns[index];\n return (\n parentColumn !== undefined &&\n compareSql(value, candidate.values.get(normalizeColumnName(parentColumn)) ?? null) === 0\n );\n }),\n )\n ) {\n throw new SqliteError(\"FOREIGN KEY constraint failed\", \"constraint_foreign\", \"SQLITE_CONSTRAINT_FOREIGNKEY\");\n }\n}\n\nexport function checkDeferredForeignKeys(env: ExecutionEnv): void {\n if (!env.state.foreignKeysEnabled) return;\n for (const table of env.state.tables.values()) {\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\" || !constraint.initiallyDeferred) continue;\n for (const row of table.scan()) assertForeignKeySatisfied(row, constraint, env);\n }\n }\n}\n\nfunction applyReferentialDelete(parent: Table, row: Row, env: ExecutionEnv): number {\n if (!env.state.foreignKeysEnabled) return 0;\n let changes = 0;\n const parentPk = parent.columns.filter((column) => column.primaryKey).map((column) => column.name);\n for (const child of env.state.tables.values()) {\n for (const constraint of child.constraints) {\n if (constraint.type !== \"foreign_key\" || constraint.refTable.toLowerCase() !== parent.name.toLowerCase())\n continue;\n const referenced = constraint.refColumns ?? parentPk;\n const matches = [...child.scan()].filter(\n (candidate) =>\n !(child === parent && candidate.rowid === row.rowid) &&\n foreignKeyMatches(constraint.columns, candidate, referenced, row),\n );\n for (const candidate of matches) {\n if (constraint.onDelete === \"CASCADE\") {\n changes += applyReferentialDelete(child, candidate, env);\n removeOne(child, candidate, env);\n changes++;\n } else if (constraint.onDelete === \"SET NULL\") {\n const updated = updateOne(\n child,\n candidate,\n new Map(constraint.columns.map((name) => [normalizeColumnName(name), null])),\n env,\n );\n changes += 1 + updated.cascaded;\n } else if (constraint.onDelete === \"SET DEFAULT\") {\n const updated = updateOne(child, candidate, defaultUpdates(child, constraint.columns, env), env);\n changes += 1 + updated.cascaded;\n } else if (!fkIsDeferred(constraint, env)) {\n throw new SqliteError(\"FOREIGN KEY constraint failed\", \"constraint_foreign\", \"SQLITE_CONSTRAINT_FOREIGNKEY\");\n }\n }\n }\n }\n return changes;\n}\n\nfunction applyReferentialUpdate(parent: Table, before: Row, after: Row, env: ExecutionEnv): number {\n if (!env.state.foreignKeysEnabled) return 0;\n let changes = 0;\n const parentPk = parent.columns.filter((column) => column.primaryKey).map((column) => column.name);\n for (const child of env.state.tables.values()) {\n for (const constraint of child.constraints) {\n if (constraint.type !== \"foreign_key\" || constraint.refTable.toLowerCase() !== parent.name.toLowerCase())\n continue;\n const referenced = constraint.refColumns ?? parentPk;\n const oldValues = referenced.map((name) => before.values.get(normalizeColumnName(name)) ?? null);\n const newValues = referenced.map((name) => after.values.get(normalizeColumnName(name)) ?? null);\n if (oldValues.every((value, index) => compareSql(value, newValues[index] ?? null) === 0)) continue;\n\n const matches = [...child.scan()].filter((candidate) =>\n foreignKeyMatches(constraint.columns, candidate, referenced, before),\n );\n for (const candidate of matches) {\n if (constraint.onUpdate === \"CASCADE\") {\n const updated = updateOne(\n child,\n candidate,\n new Map(constraint.columns.map((name, index) => [normalizeColumnName(name), newValues[index] ?? null])),\n env,\n );\n changes += 1 + updated.cascaded;\n } else if (constraint.onUpdate === \"SET NULL\") {\n const updated = updateOne(\n child,\n candidate,\n new Map(constraint.columns.map((name) => [normalizeColumnName(name), null])),\n env,\n );\n changes += 1 + updated.cascaded;\n } else if (constraint.onUpdate === \"SET DEFAULT\") {\n const updated = updateOne(child, candidate, defaultUpdates(child, constraint.columns, env), env);\n changes += 1 + updated.cascaded;\n } else if (!fkIsDeferred(constraint, env)) {\n throw new SqliteError(\"FOREIGN KEY constraint failed\", \"constraint_foreign\", \"SQLITE_CONSTRAINT_FOREIGNKEY\");\n }\n }\n }\n }\n return changes;\n}\n\nfunction foreignKeyMatches(childColumns: string[], child: Row, parentColumns: string[], parent: Row): boolean {\n const childValues = childColumns.map((name) => child.values.get(normalizeColumnName(name)) ?? null);\n if (childValues.some((value) => value === null)) return false;\n return childValues.every((value, index) => {\n const parentColumn = parentColumns[index];\n return (\n parentColumn !== undefined &&\n compareSql(value, parent.values.get(normalizeColumnName(parentColumn)) ?? null) === 0\n );\n });\n}\n\nfunction defaultUpdates(table: Table, columns: string[], env: ExecutionEnv): Map<string, SqlValue> {\n return new Map(\n columns.map((name) => {\n const column = columnOf(table, name);\n const value = column.defaultExpr ? evalExpr(column.defaultExpr, env.createEvalContext()) : null;\n return [normalizeColumnName(column.name), value];\n }),\n );\n}\n\nfunction scopeFor(table: Table, row: Row, alias: string, env?: ExecutionEnv): ScopeRow {\n const integerPkAlias = table.withoutRowid\n ? undefined\n : table.columns.find((column) => column.primaryKey && column.typeName?.trim().toUpperCase() === \"INTEGER\")?.name;\n const baseCells = table.columns\n .filter((c) => !c.generated || c.generated.stored)\n .map((column) => ({\n table: alias,\n name: column.name,\n value: row.values.get(normalizeColumnName(column.name)) ?? null,\n affinity: column.affinity,\n collate: column.collate,\n }));\n const cells = [...baseCells];\n if (env) {\n for (const column of table.columns) {\n if (!column.generated || column.generated.stored) continue;\n const ctx = env.createEvalContext({ cells: baseCells, sourceTable: table.name });\n const value = applyAffinity(evalExpr(column.generated.expr, ctx), column.affinity);\n cells.push({\n table: alias,\n name: column.name,\n value,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n // Preserve column order\n cells.sort((a, b) => {\n const ai = table.columns.findIndex((c) => c.name.toLowerCase() === a.name.toLowerCase());\n const bi = table.columns.findIndex((c) => c.name.toLowerCase() === b.name.toLowerCase());\n return ai - bi;\n });\n } else {\n for (const column of table.columns) {\n if (!column.generated || column.generated.stored) continue;\n cells.push({\n table: alias,\n name: column.name,\n value: null,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n cells.sort((a, b) => {\n const ai = table.columns.findIndex((c) => c.name.toLowerCase() === a.name.toLowerCase());\n const bi = table.columns.findIndex((c) => c.name.toLowerCase() === b.name.toLowerCase());\n return ai - bi;\n });\n }\n return {\n ...(table.withoutRowid ? {} : { rowid: row.rowid }),\n rowidName: integerPkAlias ?? (table.withoutRowid ? undefined : \"rowid\"),\n sourceTable: table.name,\n cells,\n };\n}\n\nfunction projectReturning(columns: ResultColumn[], scope: ScopeRow, env: ExecutionEnv): SqlValue[] {\n const values: SqlValue[] = [];\n const ctx = env.createEvalContext(scope);\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const cell of scope.cells)\n if (column.table === null || cell.table?.toLowerCase() === column.table.toLowerCase()) values.push(cell.value);\n } else values.push(evalExpr(column.expr, ctx));\n }\n return values;\n}\n\nfunction returningNames(columns: ResultColumn[], table: Table): string[] {\n return columns.flatMap((column) =>\n column.type === \"star\"\n ? table.columns.map((item) => item.name)\n : [column.alias ?? (column.expr.type === \"column\" ? column.expr.name : column.expr.type)],\n );\n}\n\nfunction columnOf(table: Table, name: string) {\n const column = table.columns.find((item) => item.name.toLowerCase() === name.toLowerCase());\n if (!column) throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n return column;\n}\n\nfunction isRowidName(name: string): boolean {\n const key = name.toLowerCase();\n return key === \"rowid\" || key === \"_rowid_\" || key === \"oid\";\n}\n\nfunction ftsScopeFor(table: Fts5VirtualTable, row: Fts5Row, alias: string): ScopeRow {\n return {\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: table.name,\n cells: table.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n}\n\nfunction executeVirtualInsert(stmt: InsertStmt, env: ExecutionEnv): ResultSet {\n const any = env.state.getAnyVirtualTable(stmt.table);\n if (any.kind === \"rtree\") {\n const columnNames = stmt.columns ?? any.columns;\n const sourceRows = stmt.values\n ? stmt.values.map((items) => items.map((expr) => evalExpr(expr, env.createEvalContext())))\n : stmt.select\n ? resultValues(executeSelect({ ...stmt.select, with: stmt.with ?? stmt.select.with }, env))\n : [[]];\n let changes = 0;\n let last = env.state.lastInsertRowid;\n for (const source of sourceRows) {\n const values = new Map<string, SqlValue>();\n for (let i = 0; i < columnNames.length; i++) {\n values.set(columnNames[i]!.toLowerCase(), source[i] ?? null);\n }\n last = any.insert(values);\n changes++;\n }\n env.state.recordChange(changes, last);\n return valuesToResult([], [], changes, last);\n }\n if (any.kind !== \"fts5\" && any.kind !== \"fts3\" && any.kind !== \"fts4\") {\n throw new SqliteError(`table ${stmt.table} may not be modified`, \"misuse\");\n }\n const table = any;\n const columnNames = stmt.columns ?? table.columns;\n for (const name of columnNames) {\n const lower = name.toLowerCase();\n if (lower === table.name.toLowerCase()) continue; // FTS special-command column\n if (lower === \"rowid\" || lower === \"_rowid_\" || lower === \"oid\") continue;\n if (!table.columns.some((column) => column.toLowerCase() === lower)) {\n throw new SqliteError(`table ${table.name} has no column named ${name}`, \"no_such_column\");\n }\n }\n const sourceRows = stmt.values\n ? stmt.values.map((items) => items.map((expr) => evalExpr(expr, env.createEvalContext())))\n : stmt.select\n ? resultValues(executeSelect({ ...stmt.select, with: stmt.with ?? stmt.select.with }, env))\n : [[]];\n const { changes, lastInsertRowid } = executeFtsInsert(table, columnNames, sourceRows, env);\n env.state.recordChange(changes, lastInsertRowid);\n return valuesToResult([], [], changes, lastInsertRowid);\n}\n\nfunction executeVirtualUpdate(stmt: UpdateStmt, env: ExecutionEnv): ResultSet {\n if (stmt.from) throw new SqliteError(\"UPDATE FROM is not supported\", \"unsupported\");\n const any = env.state.getAnyVirtualTable(stmt.table);\n if (any.kind === \"rtree\") {\n const alias = stmt.alias ?? stmt.table;\n const candidates = any.scan().filter((row) => {\n if (!stmt.where) return true;\n const scope: ScopeRow = {\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: any.name,\n cells: any.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n return isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) === true;\n });\n let changes = 0;\n for (const row of candidates) {\n const updates = new Map<string, SqlValue>();\n const scope: ScopeRow = {\n rowid: row.rowid,\n cells: any.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n for (const item of stmt.set) {\n if (item.columns.length !== 1)\n throw new SqliteError(\"multi-column SET is not supported on virtual tables\", \"unsupported\");\n updates.set(item.columns[0]!.toLowerCase(), evalExpr(item.expr, env.createEvalContext(scope)));\n }\n any.update(row.rowid, updates);\n changes++;\n }\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n }\n if (any.kind !== \"fts5\" && any.kind !== \"fts3\" && any.kind !== \"fts4\") {\n throw new SqliteError(`table ${stmt.table} may not be modified`, \"misuse\");\n }\n const table = any;\n const alias = stmt.alias ?? stmt.table;\n const candidates: Rowid[] = [];\n for (const row of table.scan()) {\n const scope = ftsScopeFor(table, row, alias);\n if (stmt.where && isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) !== true) continue;\n candidates.push(row.rowid);\n }\n let changes = 0;\n for (const rowid of candidates) {\n const row = table.rows.get(rowid)!;\n const scope = ftsScopeFor(table, row, alias);\n const updates = evaluateFtsSet(stmt.set, table, env.createEvalContext(scope));\n executeFtsUpdate(table, updates, [rowid]);\n changes++;\n }\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n}\n\nfunction executeVirtualDelete(stmt: DeleteStmt, env: ExecutionEnv): ResultSet {\n const any = env.state.getAnyVirtualTable(stmt.table);\n if (any.kind === \"rtree\") {\n const alias = stmt.alias ?? stmt.table;\n const selected = any.scan().filter((row) => {\n if (!stmt.where) return true;\n const scope: ScopeRow = {\n rowid: row.rowid,\n cells: any.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n return isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) === true;\n });\n let changes = 0;\n for (const row of selected) {\n any.delete(row.rowid);\n changes++;\n }\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n }\n if (any.kind !== \"fts5\" && any.kind !== \"fts3\" && any.kind !== \"fts4\") {\n throw new SqliteError(`table ${stmt.table} may not be modified`, \"misuse\");\n }\n const table = any;\n const alias = stmt.alias ?? stmt.table;\n const selected = table.scan().filter((row) => {\n if (!stmt.where) return true;\n return isTruthySql(evalExpr(stmt.where, env.createEvalContext(ftsScopeFor(table, row, alias)))) === true;\n });\n const changes = executeFtsDelete(\n table,\n selected.map((row) => row.rowid),\n );\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n}\n\nfunction evaluateFtsSet(\n items: SetItem[],\n table: Fts5VirtualTable,\n ctx: ReturnType<ExecutionEnv[\"createEvalContext\"]>,\n): Map<string, SqlValue> {\n const updates = new Map<string, SqlValue>();\n for (const item of items) {\n if (item.columns.length !== 1)\n throw new SqliteError(\"multi-column SET is not supported on virtual tables\", \"unsupported\");\n const name = item.columns[0]!;\n if (!table.columns.some((column) => column.toLowerCase() === name.toLowerCase())) {\n throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n }\n updates.set(normalizeColumnName(name), evalExpr(item.expr, ctx));\n }\n return updates;\n}\n\nfunction asExplicitRowid(value: SqlValue): Rowid | undefined {\n if (value === null) return undefined;\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\" && Number.isSafeInteger(value)) return value;\n throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\", \"SQLITE_MISMATCH\");\n}\n", "import type { Expr } from \"../ast/nodes.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport {\n coercePragmaInt,\n coercePragmaTruthy,\n evalPragmaArgs,\n evalPragmaSetValue,\n queryPragma,\n} from \"./pragma-engine.ts\";\nimport { emptyResult, type ResultSet, valuesToResult } from \"./result.ts\";\n\nexport function executePragma(name: string, expr: Expr | null, env: ExecutionEnv): ResultSet {\n const key = name.toLowerCase();\n\n // Writable statement forms\n if (key === \"foreign_keys\" && expr !== null) {\n const value = evalPragmaSetValue(expr, env);\n if (!env.transactions.inTransaction) env.state.foreignKeysEnabled = coercePragmaTruthy(value);\n return emptyResult(0, env.state.lastInsertRowid);\n }\n if ((key === \"user_version\" || key === \"schema_version\") && expr !== null) {\n const value = evalPragmaSetValue(expr, env);\n const num = coercePragmaInt(value);\n if (key === \"user_version\") env.state.userVersion = num;\n else env.state.schemaVersion = num;\n return emptyResult(0, env.state.lastInsertRowid);\n }\n\n const args = evalPragmaArgs(expr, env);\n const result = queryPragma(key, args, env);\n if (result.columns.length === 0 && result.rows.length === 0) {\n return emptyResult(0, env.state.lastInsertRowid);\n }\n return valuesToResult(result.columns, result.rows, 0, env.state.lastInsertRowid);\n}\n", "import type { Statement } from \"../ast/nodes.ts\";\nimport { executeAttach, executeDetach } from \"./attach.ts\";\nimport {\n executeAlterTable,\n executeCreateIndex,\n executeCreateTable,\n executeCreateView,\n executeDropIndex,\n executeDropTable,\n executeDropView,\n} from \"./ddl.ts\";\nimport { checkDeferredForeignKeys, executeDelete, executeInsert, executeUpdate } from \"./dml.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { executePragma } from \"./pragma.ts\";\nimport { emptyResult, type ResultSet, valuesToResult } from \"./result.ts\";\nimport { executeSelect } from \"./select.ts\";\nimport { executeCreateTrigger, executeDropTrigger } from \"./triggers.ts\";\nimport { executeCreateVirtualTable } from \"./vtable.ts\";\n\nexport function executeStatement(stmt: Statement, env: ExecutionEnv): ResultSet {\n env.selectRunner = executeSelect;\n switch (stmt.type) {\n case \"select\":\n return executeSelect(stmt, env);\n case \"insert\":\n return executeInsert(stmt, env);\n case \"update\":\n return executeUpdate(stmt, env);\n case \"delete\":\n return executeDelete(stmt, env);\n case \"create_table\":\n return executeCreateTable(stmt, env);\n case \"drop_table\":\n return executeDropTable(stmt, env);\n case \"alter_table\":\n return executeAlterTable(stmt, env);\n case \"create_index\":\n return executeCreateIndex(stmt, env);\n case \"drop_index\":\n return executeDropIndex(stmt, env);\n case \"create_view\":\n return executeCreateView(stmt, env);\n case \"drop_view\":\n return executeDropView(stmt, env);\n case \"create_trigger\":\n return executeCreateTrigger(stmt, env);\n case \"drop_trigger\":\n return executeDropTrigger(stmt, env);\n case \"create_virtual_table\":\n return executeCreateVirtualTable(stmt, env);\n case \"attach\":\n return executeAttach(stmt, env);\n case \"detach\":\n return executeDetach(stmt, env);\n case \"begin\":\n env.transactions.begin();\n return emptyResult(0, env.state.lastInsertRowid);\n case \"commit\":\n checkDeferredForeignKeys(env);\n env.transactions.commit();\n return emptyResult(0, env.state.lastInsertRowid);\n case \"rollback\":\n env.transactions.rollback(stmt.savepoint ?? undefined);\n return emptyResult(0, env.state.lastInsertRowid);\n case \"savepoint\":\n env.transactions.savepoint(stmt.name);\n return emptyResult(0, env.state.lastInsertRowid);\n case \"release\":\n env.transactions.release(stmt.name);\n return emptyResult(0, env.state.lastInsertRowid);\n case \"pragma\":\n return executePragma(stmt.name, stmt.value, env);\n case \"explain\":\n return valuesToResult(\n stmt.queryPlan\n ? [\"id\", \"parent\", \"notused\", \"detail\"]\n : [\"addr\", \"opcode\", \"p1\", \"p2\", \"p3\", \"p4\", \"p5\", \"comment\"],\n stmt.queryPlan\n ? [[0, 0, 0, `EXECUTE ${stmt.statement.type.toUpperCase()}`]]\n : [[0, \"Execute\", 0, 0, 0, stmt.statement.type, 0, null]],\n 0,\n env.state.lastInsertRowid,\n );\n case \"analyze\":\n return executeAnalyze(stmt, env);\n case \"reindex\":\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n case \"vacuum\":\n // :memory: VACUUM is a successful no-op (matches bun:sqlite).\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n }\n}\n\nfunction executeAnalyze(stmt: import(\"../ast/nodes.ts\").AnalyzeStmt, env: ExecutionEnv): ResultSet {\n // Populate sqlite_stat1 with simple row counts for oracle-visible ANALYZE behavior.\n let stat = env.state.tables.get(\"sqlite_stat1\");\n if (!stat) {\n env.state.createTable(\n {\n type: \"create_table\",\n ifNotExists: true,\n temp: false,\n name: \"sqlite_stat1\",\n columns: [\n { name: \"tbl\", typeName: \"TEXT\", constraints: [] },\n { name: \"idx\", typeName: \"TEXT\", constraints: [] },\n { name: \"stat\", typeName: \"TEXT\", constraints: [] },\n ],\n constraints: [],\n asSelect: null,\n withoutRowid: false,\n strict: false,\n },\n \"CREATE TABLE sqlite_stat1(tbl,idx,stat)\",\n );\n stat = env.state.tables.get(\"sqlite_stat1\");\n }\n if (stat) {\n for (const row of [...stat.scan()]) {\n stat.delete(row.rowid);\n }\n const tables = [...env.state.tables.values()].filter((t) => t.name.toLowerCase() !== \"sqlite_stat1\");\n const targets = stmt.name ? tables.filter((t) => t.name.toLowerCase() === stmt.name!.toLowerCase()) : tables;\n for (const table of targets) {\n const rowCount = [...table.scan()].length;\n const indexes = [...env.state.indexes.values()].filter(\n (i) => i.tableName.toLowerCase() === table.name.toLowerCase(),\n );\n if (indexes.length === 0) {\n stat.insert(\n new Map<string, import(\"../types/value.ts\").SqlValue>([\n [\"tbl\", table.name],\n [\"idx\", null],\n [\"stat\", String(rowCount)],\n ]),\n );\n } else {\n for (const index of indexes) {\n stat.insert(\n new Map<string, import(\"../types/value.ts\").SqlValue>([\n [\"tbl\", table.name],\n [\"idx\", index.name],\n [\"stat\", `${rowCount} ${Math.max(1, Math.floor(rowCount / 2))}`],\n ]),\n );\n }\n }\n }\n }\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n", "import type { Statement as AstStatement } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { ExecutionEnv } from \"../executor/env.ts\";\nimport { executeStatement } from \"../executor/execute.ts\";\nimport type { ResultSet } from \"../executor/result.ts\";\nimport { tokenize } from \"../lexer/tokenize.ts\";\nimport { parse } from \"../parser/index.ts\";\nimport type { BindValue, QueryRow } from \"../types/value.ts\";\nimport type { Database } from \"./database.ts\";\n\n/** Mutation counters returned by {@link Statement.run}. */\nexport interface RunResult {\n /** Rows changed by this execution (SQLite `changes()`). */\n changes: number;\n /** Rowid of the most recent INSERT in this execution. */\n lastInsertRowid: number | bigint;\n}\n\n/**\n * Prepared SQL statement bound to a {@link Database}.\n *\n * Create with {@link Database.prepare}. Pass bind values as rest arguments to\n * {@link run}, {@link all}, {@link get}, or {@link result} on each call\n * (stateless \u2014 there is no sticky `bind()`).\n *\n * @example\n * ```ts\n * import { Database } from \"@crvouga/sqlite-mem\";\n *\n * const db = new Database();\n * db.exec(\"CREATE TABLE t (id INTEGER PRIMARY KEY, name TEXT)\");\n * const insert = db.prepare(\"INSERT INTO t (name) VALUES (?)\");\n * insert.run(\"Ada\");\n * const row = db.prepare(\"SELECT id, name FROM t WHERE id = ?\").get<{ id: number; name: string }>(1);\n * ```\n */\nexport class Statement {\n private namedPlan: ReturnType<typeof planNamedParameters> | null = null;\n private env: ExecutionEnv | null = null;\n private statements: AstStatement[];\n private schemaVersion: number;\n\n private constructor(\n private readonly database: Database,\n private readonly sql: string,\n statements: AstStatement[],\n ) {\n this.statements = statements;\n this.schemaVersion = database.state.schemaVersion;\n }\n\n /**\n * Construct a {@link Statement} for {@link Database.prepare} / {@link Database.exec}.\n * @internal\n */\n static create(database: Database, sql: string, statements: AstStatement[]): Statement {\n return new Statement(database, sql, statements);\n }\n\n /**\n * Execute for side effects (INSERT / UPDATE / DELETE / DDL).\n *\n * @param params - Bind values for this call only.\n * @returns Mutation counters for this execution.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n run(...params: BindValue[]): RunResult {\n const result = this.execute(params, { named: false });\n return { changes: result.changes, lastInsertRowid: result.lastInsertRowid };\n }\n\n /**\n * Execute and return every result row as an object keyed by column name.\n *\n * @typeParam T - Row shape. Defaults to {@link QueryRow}.\n * @param params - Bind values for this call only.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n all<T = QueryRow>(...params: BindValue[]): T[] {\n return this.execute(params, { named: true }).rows as T[];\n }\n\n /**\n * Execute and return the full {@link ResultSet}, including column names.\n *\n * Use this when you need metadata for an empty result (column names with zero rows).\n * {@link all} only returns row objects.\n *\n * @param params - Bind values for this call only.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n result(...params: BindValue[]): ResultSet {\n return this.execute(params, { named: true });\n }\n\n /**\n * Execute and return the first row, or `undefined` if there are no rows.\n *\n * @typeParam T - Row shape. Defaults to {@link QueryRow}.\n * @param params - Bind values for this call only.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n get<T = QueryRow>(...params: BindValue[]): T | undefined {\n return this.execute(params, { named: true, maxRows: 1 }).rows[0] as T | undefined;\n }\n\n private execute(params: readonly BindValue[], options?: { named?: boolean; maxRows?: number }): ResultSet {\n this.database.assertOpen();\n this.reprepareIfSchemaChanged();\n if (this.statements.length === 0) throw new SqliteError(\"empty statement\", \"misuse\");\n this.namedPlan ??= planNamedParameters(this.sql);\n const expected = this.namedPlan.expectedCount;\n if (params.length > 0 && params.length !== expected) {\n throw new SqliteError(`SQLite query expected ${expected} values, received ${params.length}`, \"misuse\");\n }\n const env = this.obtainEnv(params);\n env.maxRows = options?.maxRows ?? Number.POSITIVE_INFINITY;\n env.includeNamedRows = options?.named !== false;\n env.includeValues = true;\n this.bindNamed(env, params);\n let result: ResultSet | undefined;\n for (const statement of this.statements) {\n result = executeStatement(statement, env);\n }\n return result!;\n }\n\n private obtainEnv(params: readonly BindValue[]): ExecutionEnv {\n if (this.env) {\n this.env.reset(params);\n this.env.hooks.now = this.database.now;\n this.env.hooks.random = () => this.database.prng.nextSqliteRandom();\n this.env.hooks.randomU64 = () => this.database.prng.nextU64();\n return this.env;\n }\n this.env = new ExecutionEnv(this.database.state, this.database.transactions, params, undefined, {\n now: this.database.now,\n random: () => this.database.prng.nextSqliteRandom(),\n randomU64: () => this.database.prng.nextU64(),\n });\n return this.env;\n }\n\n private reprepareIfSchemaChanged(): void {\n if (this.schemaVersion === this.database.state.schemaVersion) return;\n this.statements = parse(this.sql);\n this.env = null;\n this.namedPlan = null;\n this.schemaVersion = this.database.state.schemaVersion;\n }\n\n private bindNamed(env: ExecutionEnv, params: readonly BindValue[]): void {\n this.namedPlan ??= planNamedParameters(this.sql);\n for (const item of this.namedPlan.named) {\n if (item.slot <= params.length) env.setNamed(item.name, params[item.slot - 1]);\n }\n }\n}\n\ninterface NamedPlan {\n named: { name: string; slot: number }[];\n /** Highest bind slot index (SQLite parameter count). */\n expectedCount: number;\n}\n\nfunction planNamedParameters(sql: string): NamedPlan {\n const tokens = tokenize(sql);\n let nextSlot = 1;\n const namedSlots = new Map<string, number>();\n const named: { name: string; slot: number }[] = [];\n for (const token of tokens) {\n if (token.kind === \"PARAM_POS\") {\n if (token.index !== undefined) nextSlot = Math.max(nextSlot, token.index + 1);\n else nextSlot++;\n } else if (token.kind === \"PARAM_NAMED\") {\n const name = token.value.toLowerCase();\n let slot = namedSlots.get(name);\n if (slot === undefined) {\n slot = nextSlot++;\n namedSlots.set(name, slot);\n named.push({ name, slot });\n }\n }\n }\n return { named, expectedCount: nextSlot - 1 };\n}\n\n/**\n * Bind named placeholders into an execution environment.\n * @internal\n */\nexport function bindNamedParameters(env: ExecutionEnv, sql: string, params: readonly BindValue[]): void {\n const plan = planNamedParameters(sql);\n for (const item of plan.named) {\n if (item.slot <= params.length) env.setNamed(item.name, params[item.slot - 1]);\n }\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { parse } from \"../parser/index.ts\";\nimport {\n type Clock,\n type DatabaseOptions,\n DEFAULT_DATABASE_SEED,\n fixedClock,\n Prng,\n resolveClock,\n} from \"../runtime/index.ts\";\nimport { decodeDatabaseState, encodeDatabaseState } from \"../serialization/codec.ts\";\nimport { DatabaseState } from \"../storage/database-state.ts\";\nimport { TransactionManager } from \"../transactions/manager.ts\";\nimport type { BindValue, QueryRow } from \"../types/value.ts\";\nimport { Statement } from \"./statement.ts\";\n\n/**\n * Pure TypeScript in-memory SQLite database.\n *\n * Deterministic by default: `random()` / `randomblob()` use a seeded PRNG\n * (`seed` defaults to `1`) and `date('now')` / friends use a fixed clock\n * (`2000-01-01T00:00:00.000Z`). There is no filesystem or WASM.\n *\n * @example\n * ```ts\n * import { Database } from \"@crvouga/sqlite-mem\";\n *\n * const db = new Database();\n * db.exec(\"CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL)\");\n * db.prepare(\"INSERT INTO users (name) VALUES (?)\").run(\"Alice\");\n * const users = db.query<{ id: number; name: string }>(\"SELECT * FROM users\");\n * ```\n */\nexport class Database {\n /** @internal Engine catalog, tables, and mutation counters. */\n readonly state = new DatabaseState();\n /** Seed used to construct the PRNG. */\n readonly seed: number | bigint;\n /**\n * PRNG backing `random()` / `randomblob()` and related builtins.\n * Prefer passing `seed` to the constructor.\n * @internal\n */\n readonly prng: Prng;\n /**\n * Clock used by `date('now')` / `datetime('now')` / `CURRENT_TIMESTAMP`.\n * Prefer passing `now` to the constructor.\n * @internal\n */\n now: Clock;\n /** @internal Transaction / savepoint manager. */\n readonly transactions: TransactionManager;\n private closed = false;\n private transactionSequence = 0;\n /** Depth of active {@link transaction} callbacks (not SQL BEGIN). */\n private apiTransactionDepth = 0;\n\n /**\n * Create an empty in-memory database.\n *\n * @param options - Determinism knobs. See {@link DatabaseOptions}.\n */\n constructor(options: DatabaseOptions = {}) {\n this.seed = options.seed ?? DEFAULT_DATABASE_SEED;\n this.prng = new Prng(this.seed);\n this.now = resolveClock(options.now);\n this.transactions = new TransactionManager(this.state, this.prng);\n }\n\n /**\n * Execute SQL for its side effects (DDL/DML). Multiple statements are allowed.\n *\n * Does not accept bind parameters \u2014 use {@link prepare} or {@link query}.\n *\n * @param sql - SQL to run (semicolon-separated statements are ok).\n * @throws {SqliteError} If the database is closed, extra arguments are passed, or the SQL fails.\n */\n exec(sql: string): void {\n this.assertOpen();\n // Runtime guard: TypeScript rejects a second argument; JS callers must still get misuse.\n // biome-ignore lint/complexity/noArguments: intentional arity check for the frozen exec(sql) signature\n if (arguments.length > 1) {\n throw new SqliteError(\"exec() does not accept parameters; use prepare() or query()\", \"misuse\");\n }\n Statement.create(this, sql, parse(sql)).run();\n }\n\n /**\n * Execute a single-statement query and return all rows as objects keyed by column name.\n *\n * @typeParam T - Row shape. Defaults to {@link QueryRow}.\n * @param sql - A single SQL statement (trailing `;` is fine).\n * @param params - Bound parameters for `?` / `:name` placeholders.\n * @returns All result rows.\n * @throws {SqliteError} If the database is closed, `sql` is not a single statement, or execution fails.\n */\n query<T = QueryRow>(sql: string, params: readonly BindValue[] = []): T[] {\n this.assertOpen();\n return this.prepareSingle(sql).all<T>(...params);\n }\n\n /**\n * Compile a single SQL statement into a reusable {@link Statement}.\n *\n * @param sql - A single SQL statement (trailing `;` is fine). Multi-statement scripts are rejected.\n * @throws {SqliteError} If the database is closed or `sql` cannot be prepared as one statement.\n */\n prepare(sql: string): Statement {\n this.assertOpen();\n return this.prepareSingle(sql);\n }\n\n /**\n * Run `fn` inside a transaction. Commits on success; rolls back if `fn` throws.\n *\n * Nested calls use SAVEPOINTs so an inner failure does not abort the outer\n * transaction. Calling {@link close} from inside `fn` throws `misuse`.\n *\n * @param fn - Work to run while the transaction is open.\n * @returns The value returned by `fn`.\n * @throws {SqliteError} If the database is closed. Re-throws whatever `fn` throws after rollback.\n */\n transaction<T>(fn: () => T): T {\n this.assertOpen();\n this.apiTransactionDepth++;\n try {\n if (!this.transactions.inTransaction) {\n this.transactions.begin();\n try {\n const value = fn();\n this.transactions.commit();\n return value;\n } catch (error) {\n this.transactions.rollback();\n throw error;\n }\n }\n const name = `__api_transaction_${++this.transactionSequence}`;\n this.transactions.savepoint(name);\n try {\n const value = fn();\n this.transactions.release(name);\n return value;\n } catch (error) {\n this.transactions.rollback(name);\n this.transactions.release(name);\n throw error;\n }\n } finally {\n this.apiTransactionDepth--;\n }\n }\n\n /**\n * Serialize schema, rows, PRNG state, and clock into a custom snapshot blob.\n *\n * This is not a `.sqlite` file. Restore it with {@link restore}.\n *\n * @throws {SqliteError} If the database is closed.\n */\n snapshot(): Uint8Array {\n this.assertOpen();\n return encodeDatabaseState(this.state, {\n prngState: this.prng.getState(),\n nowMs: this.now().getTime(),\n });\n }\n\n /**\n * Replace this database's contents with a blob from {@link snapshot}.\n *\n * Restores PRNG state and the clock when the snapshot includes them (v2).\n * Newer library versions can restore older snapshots; older libraries cannot\n * restore newer format versions.\n *\n * @param snapshot - Bytes previously returned by {@link snapshot}.\n * @throws {SqliteError} If the database is closed, a transaction is open, or the blob is invalid.\n */\n restore(snapshot: Uint8Array): void {\n this.assertOpen();\n if (this.transactions.inTransaction) throw new SqliteError(\"cannot restore during a transaction\", \"transaction\");\n // Drop live state before decode so peak \u2248 snapshot bytes + one decoded tree\n // (not old DB + decoded + snapshot).\n this.state.replaceWith(new DatabaseState(), { adopt: true });\n const decoded = decodeDatabaseState(snapshot);\n this.state.replaceWith(decoded.state, { adopt: true });\n if (decoded.runtime) {\n this.prng.setState(decoded.runtime.prngState);\n this.now = fixedClock(new Date(decoded.runtime.nowMs));\n }\n }\n\n /**\n * Close the database. Further SQL throws {@link SqliteError}. Idempotent.\n *\n * Rolls back an open SQL transaction, if any. Throws if called from inside\n * a {@link transaction} callback.\n */\n close(): void {\n if (this.closed) return;\n if (this.apiTransactionDepth > 0) {\n throw new SqliteError(\"cannot close database inside transaction()\", \"misuse\");\n }\n if (this.transactions.inTransaction) this.transactions.rollback();\n this.closed = true;\n }\n\n /**\n * Rows changed by the most recent INSERT / UPDATE / DELETE (SQLite `changes()`).\n *\n * @throws {SqliteError} If the database is closed.\n */\n get changes(): number {\n this.assertOpen();\n return this.state.changes;\n }\n\n /**\n * Rowid of the most recent INSERT (SQLite `last_insert_rowid()`).\n *\n * @throws {SqliteError} If the database is closed.\n */\n get lastInsertRowid(): number | bigint {\n this.assertOpen();\n return this.state.lastInsertRowid;\n }\n\n /**\n * Throw if {@link close} has already been called.\n * @internal\n * @throws {SqliteError} If the database is closed.\n */\n assertOpen(): void {\n if (this.closed) throw new SqliteError(\"Database is closed\", \"misuse\");\n }\n\n private prepareSingle(sql: string): Statement {\n const statements = parse(sql);\n if (statements.length === 0) {\n throw new SqliteError(\"empty statement\", \"misuse\");\n }\n if (statements.length > 1) {\n throw new SqliteError(\"query()/prepare() accept a single statement only; use exec() for scripts\", \"misuse\");\n }\n return Statement.create(this, sql, statements);\n }\n}\n\nconst disposeKey = (Symbol as unknown as { dispose?: symbol }).dispose;\nif (typeof disposeKey === \"symbol\") {\n Object.defineProperty(Database.prototype, disposeKey, {\n value: function (this: Database): void {\n this.close();\n },\n writable: true,\n configurable: true,\n });\n}\n\nexport type { DatabaseOptions };\n"],
|
|
5
|
+
"mappings": "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;ACpmBA,IAAM,iBAAyC,oBAAI,IAAe;AAAA,EAChE;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,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,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,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,EAC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",
|
|
6
6
|
"names": ["num", "right", "alias", "left", "right", "text", "pad", "text", "key", "digits", "text", "walk", "requireArgs", "m", "e", "n", "mantissa", "exponent", "text", "pad", "requireArgs", "hay", "needle", "left", "s", "text", "text", "colDef", "sameRowid", "rowid", "candidate", "compareRowids", "asRowid", "snapshot", "cell", "row", "COMPILE_OPTIONS", "compareNames", "prefix", "value", "rowids", "compareRowids", "isRowidName", "key", "executeSelect", "rowsEqual", "result", "rightShape", "nullRight", "right", "start", "end", "framed", "rank", "executeSelect", "isRowidName", "executeSelect", "columnNames", "sourceRows", "changes", "alias", "candidates", "selected", "num", "executeSelect"]
|
|
7
7
|
}
|