@gabrielbryk/jq-ts 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2403 -737
- package/dist/index.d.cts +171 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +171 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2403 -737
- package/dist/index.mjs.map +1 -1
- package/package.json +26 -33
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["keywordKinds: Record<string, TokenKind | undefined>","tokens: Token[]","tokens: Token[]","extract: FilterNode | undefined","handler: FilterNode | undefined","branches: { cond: FilterNode; then: FilterNode }[]","items: FilterNode[]","entries: ObjectEntry[]","expr: FilterNode","args: FilterNode[]","isPlainObject","describeType","emit","builtins: Record<string, BuiltinSpec>","describeType","evaluate","keyStr: string","result: Value[]","pairs: { val: Value; key: Value }[]","seen: Value[]","seenKeys: Value[]","result: ValueObject","entries: Value[]","transformed: Value[]","parts: string[]","isPlainObject","obj: Record<string, Value>","arr: Value[]","byKey: Record<string, (string | number)[][]>","actions: Record<number, (string | number)[][]>","finalArr: Value[]","DEFAULT_LIMITS: ResolvedLimits","limits: ResolvedLimits","env: EnvStack","result: Value[]","partials: Record<string, Value>[]","next: Record<string, Value>[]","result: Record<string, Value>","next: Record<string, Value>"],"sources":["../src/errors.ts","../src/tokens.ts","../src/lexer.ts","../src/parser.ts","../src/value.ts","../src/builtins.ts","../src/validate.ts","../src/limits.ts","../src/eval.ts","../src/index.ts"],"sourcesContent":["import type { Span } from './span'\n\n/**\n * Categories of errors that can occur during processing.\n * - `lex`: Errors during lexical analysis (invalid characters).\n * - `parse`: Errors during parsing (syntax errors).\n * - `validate`: Errors during semantics checking (unsupported features).\n * - `runtime`: Errors during execution (type errors, limits).\n */\nexport type ErrorKind = 'lex' | 'parse' | 'validate' | 'runtime'\n\n/**\n * Common interface for all errors thrown by the jq-ts library.\n */\nexport interface JqTsError extends Error {\n /** The category of the error. */\n kind: ErrorKind\n /** The source code span where the error occurred. */\n span: Span\n}\n\nclass BaseError extends Error implements JqTsError {\n kind: ErrorKind\n span: Span\n\n constructor(kind: ErrorKind, message: string, span: Span) {\n super(message)\n this.kind = kind\n this.span = span\n const pascalKind = kind.charAt(0).toUpperCase() + kind.slice(1)\n this.name = `${pascalKind}Error`\n }\n}\n\n/**\n * Thrown when the lexer encounters invalid input characters.\n */\nexport class LexError extends BaseError {\n constructor(message: string, span: Span) {\n super('lex', message, span)\n }\n}\n\n/**\n * Thrown when the parser encounters invalid syntax.\n */\nexport class ParseError extends BaseError {\n constructor(message: string, span: Span) {\n super('parse', message, span)\n }\n}\n\n/**\n * Thrown when the AST contains unsupported or invalid features (e.g., restricted operators).\n */\nexport class ValidationError extends BaseError {\n constructor(message: string, span: Span) {\n super('validate', message, span)\n }\n}\n\n/**\n * Thrown during execution for runtime issues (type errors, limits exceeded, user-raised errors).\n */\nexport class RuntimeError extends BaseError {\n constructor(message: string, span: Span) {\n super('runtime', message, span)\n }\n}\n","import type { Span } from './span'\n\nexport type TokenKind =\n | 'Null'\n | 'True'\n | 'False'\n | 'Number'\n | 'String'\n | 'Identifier'\n | 'Variable'\n | 'Dot'\n | 'Comma'\n | 'Pipe'\n | 'Alt'\n | 'LParen'\n | 'RParen'\n | 'LBracket'\n | 'RBracket'\n | 'LBrace'\n | 'RBrace'\n | 'Colon'\n | 'Plus'\n | 'Minus'\n | 'Star'\n | 'Slash'\n | 'Percent'\n | 'EqualEqual'\n | 'BangEqual'\n | 'Less'\n | 'LessEqual'\n | 'Greater'\n | 'GreaterEqual'\n | 'If'\n | 'Then'\n | 'Elif'\n | 'Else'\n | 'End'\n | 'As'\n | 'And'\n | 'Or'\n | 'Not'\n | 'Reduce'\n | 'Foreach'\n | 'Try'\n | 'Catch'\n | 'DotDot'\n | 'Semicolon'\n | 'EOF'\n\nexport interface Token {\n kind: TokenKind\n span: Span\n value?: string | number\n}\n\nexport const keywordKinds: Record<string, TokenKind | undefined> = {\n if: 'If',\n then: 'Then',\n elif: 'Elif',\n else: 'Else',\n end: 'End',\n as: 'As',\n and: 'And',\n or: 'Or',\n not: 'Not',\n null: 'Null',\n true: 'True',\n false: 'False',\n reduce: 'Reduce',\n foreach: 'Foreach',\n try: 'Try',\n catch: 'Catch',\n}\n","import { LexError } from './errors'\nimport type { Span } from './span'\nimport type { Token, TokenKind } from './tokens'\nimport { keywordKinds } from './tokens'\n\nexport const lex = (text: string): Token[] => {\n const tokens: Token[] = []\n const length = text.length\n let pos = 0\n\n const peek = (offset = 0) => text[pos + offset]\n const advance = () => text[pos++]\n const makeSpan = (start: number, end: number): Span => ({ start, end })\n const pushToken = (kind: TokenKind, start: number, end: number, value?: string | number) => {\n tokens.push({ kind, span: makeSpan(start, end), value })\n }\n\n const isWhitespace = (ch: string | undefined) =>\n ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r'\n const isDigit = (ch: string | undefined) => !!ch && ch >= '0' && ch <= '9'\n const isIdentifierStart = (ch: string | undefined) =>\n !!ch && ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '_')\n const isIdentifierPart = (ch: string | undefined) => isIdentifierStart(ch) || isDigit(ch)\n\n while (pos < length) {\n const ch = peek()\n if (isWhitespace(ch)) {\n advance()\n continue\n }\n if (ch === '#') {\n while (pos < length && peek() !== '\\n') advance()\n continue\n }\n const start = pos\n switch (ch) {\n case '\"': {\n const endPos = readString(start)\n const value = readStringValue(start, start + 1, endPos - 1)\n pushToken('String', start, endPos, value)\n continue\n }\n case '.': {\n advance()\n if (peek() === '.') {\n advance()\n pushToken('DotDot', start, pos)\n } else {\n pushToken('Dot', start, pos)\n }\n continue\n }\n case ';': {\n advance()\n pushToken('Semicolon', start, pos)\n continue\n }\n case ',': {\n advance()\n pushToken('Comma', start, pos)\n continue\n }\n case '|': {\n advance()\n pushToken('Pipe', start, pos)\n continue\n }\n case '/': {\n advance()\n if (peek() === '/') {\n advance()\n pushToken('Alt', start, pos)\n } else {\n pushToken('Slash', start, pos)\n }\n continue\n }\n case '(': {\n advance()\n pushToken('LParen', start, pos)\n continue\n }\n case ')': {\n advance()\n pushToken('RParen', start, pos)\n continue\n }\n case '[': {\n advance()\n pushToken('LBracket', start, pos)\n continue\n }\n case ']': {\n advance()\n pushToken('RBracket', start, pos)\n continue\n }\n case '{': {\n advance()\n pushToken('LBrace', start, pos)\n continue\n }\n case '}': {\n advance()\n pushToken('RBrace', start, pos)\n continue\n }\n case ':': {\n advance()\n pushToken('Colon', start, pos)\n continue\n }\n case '+': {\n advance()\n pushToken('Plus', start, pos)\n continue\n }\n case '-': {\n advance()\n pushToken('Minus', start, pos)\n continue\n }\n case '*': {\n advance()\n pushToken('Star', start, pos)\n continue\n }\n case '%': {\n advance()\n pushToken('Percent', start, pos)\n continue\n }\n case '=': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('EqualEqual', start, pos)\n } else {\n throw new LexError('Unexpected \"=\" (only \"==\" supported)', makeSpan(start, pos))\n }\n continue\n }\n case '!': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('BangEqual', start, pos)\n } else {\n throw new LexError('Unexpected \"!\" (only \"!=\" supported)', makeSpan(start, pos))\n }\n continue\n }\n case '<': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('LessEqual', start, pos)\n } else {\n pushToken('Less', start, pos)\n }\n continue\n }\n case '>': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('GreaterEqual', start, pos)\n } else {\n pushToken('Greater', start, pos)\n }\n continue\n }\n case '$': {\n advance()\n if (!isIdentifierStart(peek())) {\n throw new LexError('Expected identifier after \"$\"', makeSpan(start, pos))\n }\n const nameStart = pos\n while (isIdentifierPart(peek())) advance()\n pushToken('Variable', start, pos, text.slice(nameStart, pos))\n continue\n }\n default:\n break\n }\n\n if (isDigit(ch)) {\n const end = readNumber(start)\n const raw = text.slice(start, end)\n const value = Number(raw)\n if (!Number.isFinite(value)) {\n throw new LexError(`Invalid number literal: ${raw}`, makeSpan(start, end))\n }\n pushToken('Number', start, end, value)\n continue\n }\n\n if (isIdentifierStart(ch)) {\n while (isIdentifierPart(peek())) advance()\n const raw = text.slice(start, pos)\n const keyword = keywordKinds[raw]\n if (keyword === 'Null' || keyword === 'True' || keyword === 'False') {\n pushToken(keyword, start, pos)\n } else if (keyword) {\n pushToken(keyword, start, pos)\n } else {\n pushToken('Identifier', start, pos, raw)\n }\n continue\n }\n\n throw new LexError(`Unexpected character \"${ch}\"`, makeSpan(start, start + 1))\n }\n\n pushToken('EOF', pos, pos)\n return tokens\n\n function readNumber(tokenStart: number): number {\n while (isDigit(peek())) advance()\n if (peek() === '.' && isDigit(peek(1))) {\n advance()\n while (isDigit(peek())) advance()\n }\n if (peek() === 'e' || peek() === 'E') {\n advance()\n if (peek() === '+' || peek() === '-') advance()\n if (!isDigit(peek())) {\n throw new LexError(`Invalid exponent in number literal`, makeSpan(tokenStart, pos))\n }\n while (isDigit(peek())) advance()\n }\n return pos\n }\n\n function readString(tokenStart: number): number {\n advance() // consume opening \"\n while (pos < length) {\n const current = advance()\n if (current === '\"') {\n return pos\n }\n if (current === '\\\\') {\n const esc = advance()\n if (!esc) {\n break\n }\n if ('\"\\\\/bfnrt'.includes(esc)) {\n continue\n }\n if (esc === 'u') {\n for (let i = 0; i < 4; i += 1) {\n const hex = advance()\n if (!hex || !isHexDigit(hex)) {\n throw new LexError(\n 'Invalid Unicode escape in string literal',\n makeSpan(tokenStart, pos)\n )\n }\n }\n continue\n }\n throw new LexError(`Invalid escape sequence \"\\\\${esc}\"`, makeSpan(tokenStart, pos))\n }\n }\n throw new LexError('Unterminated string literal', makeSpan(tokenStart, pos))\n }\n\n function readStringValue(tokenStart: number, innerStart: number, innerEnd: number): string {\n let result = ''\n let i = innerStart\n while (i < innerEnd) {\n const ch = text[i]\n if (ch === '\\\\') {\n const next = text[i + 1]\n switch (next) {\n case '\"':\n case '\\\\':\n case '/':\n result += next\n i += 2\n break\n case 'b':\n result += '\\b'\n i += 2\n break\n case 'f':\n result += '\\f'\n i += 2\n break\n case 'n':\n result += '\\n'\n i += 2\n break\n case 'r':\n result += '\\r'\n i += 2\n break\n case 't':\n result += '\\t'\n i += 2\n break\n case 'u': {\n const hex = text.slice(i + 2, i + 6)\n result += String.fromCharCode(Number.parseInt(hex, 16))\n i += 6\n break\n }\n default:\n throw new LexError(\n `Invalid escape sequence \"\\\\${next}\"`,\n makeSpan(tokenStart, tokenStart + (i - innerStart) + 2)\n )\n }\n } else {\n result += ch\n i += 1\n }\n }\n return result\n }\n}\n\nconst isHexDigit = (ch: string | undefined) =>\n !!ch && ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F'))\n","import { ParseError } from './errors'\nimport { lex } from './lexer'\nimport type { Span } from './span'\nimport type { Token, TokenKind } from './tokens'\nimport type {\n FilterNode,\n LiteralValue,\n ArrayNode,\n ObjectEntry,\n ObjectKey,\n ObjectNode,\n BinaryOp,\n TryNode,\n ReduceNode,\n ForeachNode,\n} from './ast'\n\n/**\n * Parses a jq source string into an Abstract Syntax Tree (AST).\n *\n * @param source - The input jq query string.\n * @returns The root {@link FilterNode} of the AST.\n * @throws {LexError} If the source contains invalid characters.\n * @throws {ParseError} If the syntax is invalid.\n */\nexport const parse = (source: string): FilterNode => {\n const parser = new Parser(lex(source))\n return parser.parseFilter()\n}\n\nclass Parser {\n private current = 0\n\n constructor(private readonly tokens: Token[]) {}\n\n parseFilter(): FilterNode {\n const expr = this.parseBinding()\n this.consume('EOF', 'Expected end of expression')\n return expr\n }\n\n private parseBinding(): FilterNode {\n let expr = this.parseComma()\n while (this.match('As')) {\n const varToken = this.consume('Variable', 'Expected variable name after \"as\"')\n this.consume('Pipe', 'Expected \"|\" after variable binding')\n const body = this.parseBinding()\n expr = {\n kind: 'As',\n bind: expr,\n name: String(varToken.value),\n body,\n span: spanBetween(expr.span, body.span),\n }\n }\n return expr\n }\n\n private parseComma(): FilterNode {\n let expr = this.parsePipe()\n while (this.match('Comma')) {\n const right = this.parsePipe()\n expr = {\n kind: 'Comma',\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parsePipe(): FilterNode {\n let expr = this.parsePipeOperand()\n while (this.match('Pipe')) {\n const right = this.parsePipeOperand()\n expr = {\n kind: 'Pipe',\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parsePipeOperand(): FilterNode {\n return this.parseAlt()\n }\n\n private parseAlt(): FilterNode {\n let expr = this.parseOr()\n while (this.match('Alt')) {\n const right = this.parseOr()\n expr = {\n kind: 'Alt',\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parseOr(): FilterNode {\n let expr = this.parseAnd()\n while (this.match('Or')) {\n const right = this.parseAnd()\n expr = {\n kind: 'Bool',\n op: 'Or',\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parseAnd(): FilterNode {\n let expr = this.parseComparison()\n while (this.match('And')) {\n const right = this.parseComparison()\n expr = {\n kind: 'Bool',\n op: 'And',\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parseComparison(): FilterNode {\n let expr = this.parseAdd()\n while (true) {\n if (this.match('EqualEqual')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Eq')\n } else if (this.match('BangEqual')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Neq')\n } else if (this.match('Less')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Lt')\n } else if (this.match('LessEqual')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Lte')\n } else if (this.match('Greater')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Gt')\n } else if (this.match('GreaterEqual')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Gte')\n } else {\n break\n }\n }\n return expr\n }\n\n private parseAdd(): FilterNode {\n let expr = this.parseMul()\n while (true) {\n if (this.match('Plus')) {\n const right = this.parseMul()\n expr = this.makeBinary(expr, right, '+')\n } else if (this.match('Minus')) {\n const right = this.parseMul()\n expr = this.makeBinary(expr, right, '-')\n } else {\n break\n }\n }\n return expr\n }\n\n private parseMul(): FilterNode {\n let expr = this.parseUnary()\n while (true) {\n if (this.match('Star')) {\n const right = this.parseUnary()\n expr = this.makeBinary(expr, right, '*')\n } else if (this.match('Slash')) {\n const right = this.parseUnary()\n expr = this.makeBinary(expr, right, '/')\n } else if (this.match('Percent')) {\n const right = this.parseUnary()\n expr = this.makeBinary(expr, right, '%')\n } else {\n break\n }\n }\n return expr\n }\n\n private parseUnary(): FilterNode {\n if (this.match('Not')) {\n const op = this.previous()\n const expr = this.parseUnary()\n return {\n kind: 'Unary',\n op: 'Not',\n expr,\n span: spanBetween(op.span, expr.span),\n }\n }\n if (this.match('Minus')) {\n const op = this.previous()\n const expr = this.parseUnary()\n return {\n kind: 'Unary',\n op: 'Neg',\n expr,\n span: spanBetween(op.span, expr.span),\n }\n }\n return this.parsePostfix()\n }\n\n private parsePostfix(): FilterNode {\n let expr = this.parsePrimary()\n while (true) {\n if (this.match('Dot')) {\n expr = this.finishFieldAccess(expr)\n continue\n }\n if (this.match('LBracket')) {\n if (this.match('RBracket')) {\n const close = this.previous()\n expr = {\n kind: 'Iterate',\n target: expr,\n span: spanBetween(expr.span, close.span),\n }\n continue\n }\n const index = this.parsePipe()\n const closing = this.consume('RBracket', 'Expected \"]\" after index expression')\n expr = {\n kind: 'IndexAccess',\n target: expr,\n index,\n span: spanBetween(expr.span, closing.span),\n }\n continue\n }\n break\n }\n return expr\n }\n\n private parsePrimary(): FilterNode {\n if (this.match('Dot')) {\n return this.parseLeadingDot(this.previous())\n }\n if (this.match('Null')) return this.literalNode(null, this.previous().span)\n if (this.match('True')) return this.literalNode(true, this.previous().span)\n if (this.match('False')) return this.literalNode(false, this.previous().span)\n if (this.match('Number')) {\n return this.literalNode(Number(this.previous().value), this.previous().span)\n }\n if (this.match('String')) {\n return this.literalNode(String(this.previous().value), this.previous().span)\n }\n if (this.match('Variable')) {\n const token = this.previous()\n return {\n kind: 'Var',\n name: String(token.value),\n span: token.span,\n }\n }\n if (this.match('Identifier')) {\n return this.finishIdentifier(this.previous())\n }\n if (this.match('If')) {\n return this.parseIf(this.previous())\n }\n if (this.match('LParen')) {\n const start = this.previous()\n const expr = this.parseComma()\n const close = this.consume('RParen', 'Expected \")\" after expression')\n expr.span = spanBetween(start.span, close.span)\n return expr\n }\n if (this.match('LBracket')) {\n return this.parseArray(this.previous())\n }\n if (this.match('LBrace')) {\n return this.parseObject(this.previous())\n }\n if (this.match('Reduce')) return this.parseReduce(this.previous())\n if (this.match('Foreach')) return this.parseForeach(this.previous())\n if (this.match('Try')) return this.parseTry(this.previous())\n if (this.match('DotDot')) return { kind: 'Recurse', span: this.previous().span }\n throw this.error(this.peek(), 'Unexpected token')\n }\n\n private parseReduce(start: Token): ReduceNode {\n const source = this.parsePipe()\n this.consume('As', 'Expected \"as\" after reduce source')\n const varToken = this.consume('Variable', 'Expected variable after \"as\"')\n this.consume('LParen', 'Expected \"(\" after variable')\n const init = this.parseComma()\n this.consume('Semicolon', 'Expected \";\" after init')\n const update = this.parseComma()\n const end = this.consume('RParen', 'Expected \")\" after update')\n return {\n kind: 'Reduce',\n source,\n var: String(varToken.value),\n init,\n update,\n span: spanBetween(start.span, end.span),\n }\n }\n\n private parseForeach(start: Token): ForeachNode {\n const source = this.parsePipe()\n this.consume('As', 'Expected \"as\" after foreach source')\n const varToken = this.consume('Variable', 'Expected variable after \"as\"')\n this.consume('LParen', 'Expected \"(\" after variable')\n const init = this.parseComma()\n this.consume('Semicolon', 'Expected \";\" after init')\n const update = this.parseComma()\n let extract: FilterNode | undefined\n if (this.match('Semicolon')) {\n extract = this.parseComma()\n }\n const end = this.consume('RParen', 'Expected \")\" after foreach body')\n return {\n kind: 'Foreach',\n source,\n var: String(varToken.value),\n init,\n update,\n extract,\n span: spanBetween(start.span, end.span),\n }\n }\n\n private parseTry(start: Token): TryNode {\n const body = this.parseComma()\n let handler: FilterNode | undefined\n let endSpan = body.span\n if (this.match('Catch')) {\n handler = this.parseComma()\n endSpan = handler.span\n }\n return {\n kind: 'Try',\n body,\n handler,\n span: spanBetween(start.span, endSpan),\n }\n }\n\n private parseIf(start: Token): FilterNode {\n const branches: { cond: FilterNode; then: FilterNode }[] = []\n const firstCond = this.parsePipe()\n this.consume('Then', 'Expected \"then\" after condition')\n const firstThen = this.parsePipe()\n branches.push({ cond: firstCond, then: firstThen })\n\n while (this.match('Elif')) {\n const cond = this.parsePipe()\n this.consume('Then', 'Expected \"then\" after elif condition')\n const thenBranch = this.parsePipe()\n branches.push({ cond, then: thenBranch })\n }\n\n this.consume('Else', 'Expected \"else\" in if expression')\n const elseBranch = this.parsePipe()\n const endToken = this.consume('End', 'Expected \"end\" to close if expression')\n return {\n kind: 'If',\n branches,\n else: elseBranch,\n span: spanBetween(start.span, endToken.span),\n }\n }\n\n private parseArray(start: Token): ArrayNode {\n const items: FilterNode[] = []\n if (!this.check('RBracket')) {\n do {\n items.push(this.parsePipe())\n } while (this.match('Comma'))\n }\n const end = this.consume('RBracket', 'Expected \"]\" after array literal')\n return {\n kind: 'Array',\n items,\n span: spanBetween(start.span, end.span),\n }\n }\n\n private parseObject(start: Token): ObjectNode {\n const entries: ObjectEntry[] = []\n if (!this.check('RBrace')) {\n do {\n entries.push(this.parseObjectEntry())\n } while (this.match('Comma'))\n }\n const end = this.consume('RBrace', 'Expected \"}\" after object literal')\n return {\n kind: 'Object',\n entries,\n span: spanBetween(start.span, end.span),\n }\n }\n\n private parseObjectEntry(): ObjectEntry {\n const key = this.parseObjectKey()\n this.consume('Colon', 'Expected \":\" after object key')\n const value = this.parsePipe()\n return { key, value }\n }\n\n private parseObjectKey(): ObjectKey {\n if (this.match('Identifier')) {\n const token = this.previous()\n return {\n kind: 'KeyIdentifier',\n name: String(token.value),\n span: token.span,\n }\n }\n if (this.match('String')) {\n const token = this.previous()\n return {\n kind: 'KeyString',\n value: String(token.value),\n span: token.span,\n }\n }\n if (this.match('LParen')) {\n const start = this.previous()\n const expr = this.parseComma()\n const closing = this.consume('RParen', 'Expected \")\" after computed key expression')\n return {\n kind: 'KeyExpr',\n expr,\n span: spanBetween(start.span, closing.span),\n }\n }\n throw this.error(this.peek(), 'Expected identifier, string, or \"(expr)\" as object key')\n }\n\n private finishFieldAccess(target: FilterNode): FilterNode {\n if (this.match('Identifier')) {\n const token = this.previous()\n return {\n kind: 'FieldAccess',\n target,\n field: String(token.value),\n span: spanBetween(target.span, token.span),\n }\n }\n if (this.match('String')) {\n const token = this.previous()\n return {\n kind: 'FieldAccess',\n target,\n field: String(token.value),\n span: spanBetween(target.span, token.span),\n }\n }\n throw this.error(this.peek(), 'Expected field name after \".\"')\n }\n\n private parseLeadingDot(dot: Token): FilterNode {\n let expr: FilterNode = { kind: 'Identity', span: dot.span }\n while (true) {\n if (this.check('Identifier') || this.check('String')) {\n expr = this.finishFieldAccess(expr)\n continue\n }\n if (this.match('LBracket')) {\n if (this.match('RBracket')) {\n const close = this.previous()\n expr = {\n kind: 'Iterate',\n target: expr,\n span: spanBetween(expr.span, close.span),\n }\n continue\n }\n const index = this.parsePipe()\n const closing = this.consume('RBracket', 'Expected \"]\" after index expression')\n expr = {\n kind: 'IndexAccess',\n target: expr,\n index,\n span: spanBetween(expr.span, closing.span),\n }\n continue\n }\n break\n }\n return expr\n }\n\n private finishIdentifier(token: Token): FilterNode {\n if (this.match('LParen')) {\n const args = this.parseCallArguments()\n const closing = this.consume('RParen', 'Expected \")\" after arguments')\n return {\n kind: 'Call',\n name: String(token.value),\n args,\n span: spanBetween(token.span, closing.span),\n }\n }\n return {\n kind: 'Call',\n name: String(token.value),\n args: [],\n span: token.span,\n }\n }\n\n private parseCallArguments(): FilterNode[] {\n const args: FilterNode[] = []\n if (this.check('RParen')) {\n return args\n }\n do {\n args.push(this.parsePipe())\n } while (this.match('Semicolon'))\n return args\n }\n\n private literalNode(value: LiteralValue, span: Span): FilterNode {\n return { kind: 'Literal', value, span }\n }\n\n private makeBinary(left: FilterNode, right: FilterNode, op: BinaryOp): FilterNode {\n return {\n kind: 'Binary',\n op,\n left,\n right,\n span: spanBetween(left.span, right.span),\n }\n }\n\n private match(kind: TokenKind): boolean {\n if (this.check(kind)) {\n this.advance()\n return true\n }\n return false\n }\n\n private consume(kind: TokenKind, message: string): Token {\n if (this.check(kind)) return this.advance()\n throw this.error(this.peek(), message)\n }\n\n private check(kind: TokenKind): boolean {\n if (this.isAtEnd()) return kind === 'EOF'\n return this.peek().kind === kind\n }\n\n private advance(): Token {\n if (!this.isAtEnd()) this.current += 1\n return this.previous()\n }\n\n private isAtEnd(): boolean {\n return this.peek().kind === 'EOF'\n }\n\n private peek(): Token {\n return this.tokens[this.current] ?? { kind: 'EOF', span: { start: 0, end: 0 } }\n }\n\n private previous(): Token {\n return this.tokens[this.current - 1] ?? { kind: 'EOF', span: { start: 0, end: 0 } }\n }\n\n private error(token: Token, message: string): ParseError {\n return new ParseError(message, token.span)\n }\n}\n\nconst spanBetween = (a: Span, b: Span): Span => ({\n start: Math.min(a.start, b.start),\n end: Math.max(a.end, b.end),\n})\n","/**\n * Represents any valid JSON value supported by the jq-ts runtime.\n * This is a recursive type definition that matches the structure of JSON data.\n */\n// Use interface to break circular reference for Value type\nexport type Value = null | boolean | number | string | ValueArray | ValueObject\n\n/**\n * Represents a JSON array containing {@link Value} items.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface ValueArray extends Array<Value> {}\n\n/**\n * Represents a JSON object with string keys and {@link Value} values.\n */\nexport interface ValueObject {\n [key: string]: Value\n}\n\n/**\n * Checks if a value is considered \"truthy\" in jq logic.\n * In jq, only `false` and `null` are falsey; everything else (including 0 and empty strings) is truthy.\n *\n * @param value - The value to check.\n * @returns `true` if truthy, `false` otherwise.\n */\nexport const isTruthy = (value: Value): boolean => !(value === false || value === null)\n\n/**\n * deeply compares two JSON values for equality.\n *\n * @param a - The first value.\n * @param b - The second value.\n * @returns `true` if the values are structurally equal, `false` otherwise.\n */\nexport const valueEquals = (a: Value, b: Value): boolean => {\n if (a === b) {\n // Handles primitives not involving NaN.\n return true\n }\n if (typeof a !== typeof b) {\n return false\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return Object.is(a, b)\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i += 1) {\n if (!valueEquals(a[i]!, b[i]!)) return false\n }\n return true\n }\n if (isPlainObject(a) && isPlainObject(b)) {\n const aKeys = Object.keys(a).sort()\n const bKeys = Object.keys(b).sort()\n if (aKeys.length !== bKeys.length) return false\n for (let i = 0; i < aKeys.length; i += 1) {\n const key = aKeys[i]!\n if (key !== bKeys[i]) return false\n // Type safe access via key existence check implicit in loop\n if (!valueEquals(a[key]!, b[key]!)) return false\n }\n return true\n }\n return false\n}\n\n/**\n * Compares two JSON values according to standard jq ordering rules.\n *\n * The sort order is: null < false < true < numbers < strings < arrays < objects.\n * Arrays and objects are compared recursively.\n *\n * @param a - The first value.\n * @param b - The second value.\n * @returns `-1` if `a < b`, `0` if `a == b`, and `1` if `a > b`.\n */\nexport const compareValues = (a: Value, b: Value): -1 | 0 | 1 => {\n if (valueEquals(a, b)) return 0\n const rankDiff = typeRank(a) - typeRank(b)\n if (rankDiff !== 0) return rankDiff < 0 ? -1 : 1\n\n if (typeof a === 'number' && typeof b === 'number') {\n return a < b ? -1 : 1\n }\n if (typeof a === 'string' && typeof b === 'string') {\n return a < b ? -1 : 1\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n const len = Math.min(a.length, b.length)\n for (let i = 0; i < len; i += 1) {\n const cmp = compareValues(a[i]!, b[i]!)\n if (cmp !== 0) return cmp\n }\n return a.length < b.length ? -1 : 1\n }\n if (isPlainObject(a) && isPlainObject(b)) {\n const aKeys = Object.keys(a).sort()\n const bKeys = Object.keys(b).sort()\n const len = Math.min(aKeys.length, bKeys.length)\n for (let i = 0; i < len; i += 1) {\n const key = aKeys[i]!\n const keyCmp = compareStrings(key, bKeys[i]!)\n if (keyCmp !== 0) return keyCmp\n const valueCmp = compareValues(a[key]!, b[key]!)\n if (valueCmp !== 0) return valueCmp\n }\n return aKeys.length < bKeys.length ? -1 : 1\n }\n\n // Remaining ranks are booleans and null which have already been handled by rank diff.\n return 0\n}\n\nconst compareStrings = (a: string, b: string): -1 | 0 | 1 => {\n if (a === b) return 0\n return a < b ? -1 : 1\n}\n\nconst typeRank = (value: Value): number => {\n if (value === null) return 0\n if (value === false) return 1\n if (value === true) return 2\n if (typeof value === 'number') return 3\n if (typeof value === 'string') return 4\n if (Array.isArray(value)) return 5\n return 6 // object\n}\n\n/**\n * Checks if a value is a plain JSON object (and not null or an array).\n *\n * @param value - The value to check.\n * @returns `true` if `value` is a non-null object (and not an array).\n */\nexport const isPlainObject = (value: Value): value is ValueObject =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\n/**\n * Returns the type name of a value as a string (e.g., \"null\", \"boolean\", \"number\", \"string\", \"array\", \"object\").\n * This corresponds to the output of the `type` builtin.\n *\n * @param value - The value to inspect.\n * @returns The lower-case type name.\n */\nexport const describeType = (value: Value): string => {\n if (value === null) return 'null'\n if (typeof value === 'boolean') return 'boolean'\n if (typeof value === 'number') return 'number'\n if (typeof value === 'string') return 'string'\n if (Array.isArray(value)) return 'array'\n return 'object'\n}\n","import type { FilterNode } from './ast'\nimport type { Span } from './span'\nimport { RuntimeError } from './errors'\nimport {\n type Value,\n type ValueObject,\n describeType,\n isTruthy,\n valueEquals,\n compareValues,\n isPlainObject,\n} from './value'\nimport type { LimitTracker } from './limits'\nimport type { EnvStack } from './eval'\n\nexport type Evaluator = (\n node: FilterNode,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n) => Generator<Value>\n\nexport interface BuiltinSpec {\n name: string\n arity: number\n apply: (\n input: Value,\n args: FilterNode[],\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator,\n span: Span\n ) => Generator<Value>\n}\n\nconst emit = (value: Value, span: Span, tracker: LimitTracker): Value => {\n tracker.emit(span)\n return value\n}\n\n// Helper: Ensure value is a number integer for array indexing\nconst ensureIndex = (val: Value): number | undefined => {\n if (typeof val === 'number' && Number.isInteger(val)) return val\n if (typeof val === 'string' && /^-?\\d+$/.test(val)) return parseInt(val, 10)\n return undefined\n}\n\nconst stableStringify = (value: Value): string => {\n if (value === null) return 'null'\n if (typeof value === 'boolean') return value ? 'true' : 'false'\n if (typeof value === 'number') return value.toString()\n if (typeof value === 'string') return JSON.stringify(value)\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(',')}]`\n }\n // Object: sort keys\n const keys = Object.keys(value).sort()\n const entries = keys.map(\n (k) =>\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n `${JSON.stringify(k)}:${stableStringify((value as ValueObject)[k]!)}`\n )\n return `{${entries.join(',')}}`\n}\n\nexport const builtins: Record<string, BuiltinSpec> = {\n type: {\n name: 'type',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n yield emit(describeType(input), span, tracker)\n },\n },\n tostring: {\n name: 'tostring',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n yield emit(stableStringify(input), span, tracker)\n },\n },\n tonumber: {\n name: 'tonumber',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input === 'number') {\n yield emit(input, span, tracker)\n return\n }\n if (typeof input === 'string') {\n const num = Number(input)\n if (!Number.isFinite(num)) {\n throw new RuntimeError(`Cannot convert string \"${input}\" to number`, span)\n }\n yield emit(num, span, tracker)\n return\n }\n throw new RuntimeError(`Cannot convert ${describeType(input)} to number`, span)\n },\n },\n length: {\n name: 'length',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input === 'string') {\n // Use Array.from to count codepoints correctly\n yield emit(Array.from(input).length, span, tracker)\n } else if (Array.isArray(input)) {\n yield emit(input.length, span, tracker)\n } else if (input !== null && typeof input === 'object') {\n // Safe because isPlainObject check implies it's not null/array, but here we can just use Object.keys\n yield emit(Object.keys(input).length, span, tracker)\n } else {\n throw new RuntimeError(`Cannot take length of ${describeType(input)}`, span)\n }\n },\n },\n keys: {\n name: 'keys',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (Array.isArray(input)) {\n const indices = Array.from({ length: input.length }, (_, i) => i)\n yield emit(indices, span, tracker)\n } else if (input !== null && typeof input === 'object') {\n const sortedKeys = Object.keys(input).sort()\n yield emit(sortedKeys, span, tracker)\n } else {\n throw new RuntimeError(`keys expects an array or object`, span)\n }\n },\n },\n has: {\n name: 'has',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const keyFilter = args[0]!\n for (const key of evaluate(keyFilter, input, env, tracker)) {\n if (Array.isArray(input)) {\n const idx = ensureIndex(key)\n yield emit(idx !== undefined && idx >= 0 && idx < input.length, span, tracker)\n } else if (input !== null && typeof input === 'object') {\n let keyStr: string\n if (typeof key === 'string') keyStr = key\n else if (typeof key === 'number') keyStr = key.toString()\n else {\n throw new RuntimeError(`has() key must be string or number for object input`, span)\n }\n yield emit(Object.prototype.hasOwnProperty.call(input, keyStr), span, tracker)\n } else {\n throw new RuntimeError(`has() expects an array or object input`, span)\n }\n }\n },\n },\n error: {\n name: 'error',\n arity: 1,\n // eslint-disable-next-line require-yield\n apply: function* (input, args, env, tracker, evaluate, span) {\n for (const msg of evaluate(args[0]!, input, env, tracker)) {\n throw new RuntimeError(typeof msg === 'string' ? msg : stableStringify(msg), span)\n }\n },\n },\n map: {\n name: 'map',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('map expects an array', span)\n const result: Value[] = []\n const filter = args[0]!\n // Step limit: \"process step\"? Maybe not per element if AST handles it.\n // But we are running a loop here. The evaluate() call inside will step.\n // We should probably check limits if loop is huge?\n // The evaluate() inside handles steps.\n for (const item of input) {\n // tracker.step(span) ? Plan said \"Call tracker.step(span) inside per-element loops\"\n tracker.step(span)\n for (const output of evaluate(filter, item, env, tracker)) {\n result.push(output)\n }\n }\n yield emit(result, span, tracker)\n },\n },\n select: {\n name: 'select',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const filter = args[0]!\n for (const res of evaluate(filter, input, env, tracker)) {\n if (isTruthy(res)) {\n yield emit(input, span, tracker)\n // \"emit original input once\" if ANY output is truthy?\n // jq documentation: \"select(f) produces its input calls if f returns true...\"\n // If f produces multiple values, does it emit multiple times?\n // jq: `1 | select(., .)` -> `1` (checks 1), `1` (checks 1) -> yields 1, 1?\n // `echo 1 | jq 'select(true, true)'` -> `1 \\n 1`.\n // So if filter yields multiple truthy values, it emits input multiple times.\n // Wait, plan says: \"if any output is truthy... emit original input once; otherwise emit nothing.\"\n // My plan might have simplified it. Jq's behavior is typically \"for each output of condition, if truthy yield input\".\n // \"The function `select(foo)` produces its input unchanged if `foo` returns true for that input, and produces no output otherwise.\"\n // Usually implies streaming.\n // Let's stick to the Plan's text for now if precise, or standard behavior.\n // Plan text: \"run filter arg on input value; if any output is truthy (per isTruthy), emit original input once; otherwise emit nothing.\"\n // I will follow the PLAN. It says \"emit original input once\".\n return // Stop after first truthy?\n }\n }\n },\n },\n sort: {\n name: 'sort',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('sort expects an array', span)\n const sorted = sortStable(input, (a, b) => compareValues(a, b))\n tracker.step(span) // Accounting for the sort op itself\n yield emit(sorted, span, tracker)\n },\n },\n sort_by: {\n name: 'sort_by',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('sort_by expects an array', span)\n const filter = args[0]!\n // Compute keys\n const pairs: { val: Value; key: Value }[] = []\n for (const item of input) {\n tracker.step(span)\n const keys = Array.from(evaluate(filter, item, env, tracker))\n if (keys.length !== 1)\n throw new RuntimeError('sort_by key expression must return exactly one value', span)\n pairs.push({ val: item, key: keys[0]! })\n }\n const sorted = sortStable(pairs, (a, b) => compareValues(a.key, b.key))\n yield emit(\n sorted.map((p) => p.val),\n span,\n tracker\n )\n },\n },\n unique: {\n name: 'unique',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('unique expects an array', span)\n // \"unique\" in jq usually implies sorting too.\n // But Plan says: \"Preserve first occurrence order; dedupe via valueEquals.\"\n // Actually standard jq `unique` outputs SORTED array.\n // But let's check the Plan text again carefully.\n // Plan: \"unique/0: input array only. Preserve first occurrence order; dedupe via valueEquals.\"\n // This describes `unique_stable` or generic deduping, NOT `unique` (which sorts).\n // If the plan requested this specific behavior, I should follow it.\n // \"Preserve first occurrence order\" is explicit.\n const seen: Value[] = []\n const result: Value[] = []\n for (const item of input) {\n tracker.step(span) // step per item\n if (!seen.some((s) => valueEquals(s, item))) {\n seen.push(item)\n result.push(item)\n }\n }\n yield emit(result, span, tracker)\n },\n },\n unique_by: {\n name: 'unique_by',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('unique_by expects an array', span)\n const filter = args[0]!\n const seenKeys: Value[] = []\n const result: Value[] = []\n for (const item of input) {\n tracker.step(span)\n const keys = Array.from(evaluate(filter, item, env, tracker))\n if (keys.length !== 1)\n throw new RuntimeError('unique_by key expression must return exactly one value', span)\n const key = keys[0]!\n if (!seenKeys.some((s) => valueEquals(s, key))) {\n seenKeys.push(key)\n result.push(item)\n }\n }\n yield emit(result, span, tracker)\n },\n },\n to_entries: {\n name: 'to_entries',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (Array.isArray(input)) {\n const result = input.map((v, i) => ({ key: i, value: v }))\n yield emit(result, span, tracker)\n } else if (input !== null && typeof input === 'object') {\n const keys = Object.keys(input).sort()\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n const result = keys.map((k) => ({ key: k, value: (input as ValueObject)[k]! }))\n yield emit(result, span, tracker)\n } else {\n throw new RuntimeError('to_entries expects array or object', span)\n }\n },\n },\n from_entries: {\n name: 'from_entries',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('from_entries expects an array', span)\n const result: ValueObject = {}\n for (const item of input) {\n tracker.step(span)\n if (item === null || typeof item !== 'object' || Array.isArray(item)) {\n throw new RuntimeError('from_entries expects array of objects', span)\n }\n const obj = item\n if (!('key' in obj) || !('value' in obj)) {\n throw new RuntimeError('from_entries items must have \"key\" and \"value\"', span)\n }\n const key = obj['key']\n if (typeof key !== 'string') {\n throw new RuntimeError('from_entries object keys must be strings', span)\n }\n result[key] = obj['value']!\n }\n yield emit(result, span, tracker)\n },\n },\n with_entries: {\n name: 'with_entries',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // to_entries\n let entries: Value[]\n if (Array.isArray(input)) {\n entries = input.map((v, i) => ({ key: i, value: v }))\n } else if (input !== null && typeof input === 'object') {\n const keys = Object.keys(input).sort()\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n entries = keys.map((k) => ({ key: k, value: (input as ValueObject)[k]! }))\n } else {\n throw new RuntimeError('with_entries expects array or object', span)\n }\n\n // map(f)\n const transformed: Value[] = []\n const filter = args[0]!\n for (const entry of entries) {\n tracker.step(span)\n for (const outVar of evaluate(filter, entry, env, tracker)) {\n transformed.push(outVar)\n }\n }\n\n // from_entries\n const result: ValueObject = {}\n for (const item of transformed) {\n if (item === null || typeof item !== 'object' || Array.isArray(item)) {\n throw new RuntimeError('with_entries filter must produce objects', span)\n }\n const obj = item\n if (!('key' in obj) || !('value' in obj)) {\n throw new RuntimeError('with_entries items must have \"key\" and \"value\"', span)\n }\n const key = obj['key']\n if (typeof key !== 'string') {\n throw new RuntimeError('with_entries keys must be strings', span)\n }\n result[key] = obj['value']!\n }\n yield emit(result, span, tracker)\n },\n },\n split: {\n name: 'split',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (typeof input !== 'string') throw new RuntimeError('split input must be a string', span)\n const sepGen = evaluate(args[0]!, input, env, tracker)\n for (const sep of sepGen) {\n if (typeof sep !== 'string')\n throw new RuntimeError('split separator must be a string', span)\n // Split logic\n yield emit(input.split(sep), span, tracker)\n }\n },\n },\n join: {\n name: 'join',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('join input must be an array', span)\n const sepGen = evaluate(args[0]!, input, env, tracker)\n for (const sep of sepGen) {\n if (typeof sep !== 'string') throw new RuntimeError('join separator must be a string', span)\n const parts: string[] = []\n for (const item of input) {\n if (typeof item !== 'string') {\n throw new RuntimeError(`join expects strings, but got ${describeType(item)}`, span)\n }\n parts.push(item)\n }\n yield emit(parts.join(sep), span, tracker)\n }\n },\n },\n startswith: {\n name: 'startswith',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (typeof input !== 'string')\n throw new RuntimeError('startswith input must be a string', span)\n const prefixGen = evaluate(args[0]!, input, env, tracker)\n for (const prefix of prefixGen) {\n if (typeof prefix !== 'string')\n throw new RuntimeError('startswith prefix must be a string', span)\n yield emit(input.startsWith(prefix), span, tracker)\n }\n },\n },\n endswith: {\n name: 'endswith',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (typeof input !== 'string') throw new RuntimeError('endswith input must be a string', span)\n const suffixGen = evaluate(args[0]!, input, env, tracker)\n for (const suffix of suffixGen) {\n if (typeof suffix !== 'string')\n throw new RuntimeError('endswith suffix must be a string', span)\n yield emit(input.endsWith(suffix), span, tracker)\n }\n },\n },\n contains: {\n name: 'contains',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const bGen = evaluate(args[0]!, input, env, tracker)\n for (const b of bGen) {\n yield emit(checkContains(input, b), span, tracker)\n }\n },\n },\n paths: {\n name: 'paths',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n // \"paths\": \"emit all paths to leaf scalars...\".\n // If input is scalar, emit `[]`.\n // If input is `{}`, emit `[]`? \"empty arrays/objects\".\n yield* traversePaths(input, [], span, tracker)\n },\n },\n getpath: {\n name: 'getpath',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n for (const pathVal of evaluate(args[0]!, input, env, tracker)) {\n const path = ensurePath(pathVal, span)\n const res = getPath(input, path)\n yield emit(res ?? null, span, tracker)\n }\n },\n },\n setpath: {\n name: 'setpath',\n arity: 2,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // args[0] is path, args[1] is value\n const paths = Array.from(evaluate(args[0]!, input, env, tracker))\n const values = Array.from(evaluate(args[1]!, input, env, tracker))\n for (const pathVal of paths) {\n const path = ensurePath(pathVal, span)\n for (const val of values) {\n const res = updatePath(input, path, () => val, span)\n yield emit(res ?? null, span, tracker) // Should not return undefined for setpath\n }\n }\n },\n },\n delpaths: {\n name: 'delpaths',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n for (const pathsVal of evaluate(args[0]!, input, env, tracker)) {\n if (!Array.isArray(pathsVal))\n throw new RuntimeError('delpaths expects an array of paths', span)\n const paths = pathsVal.map((p) => ensurePath(p, span))\n const res = deletePaths(input, paths, span)\n yield emit(res, span, tracker)\n }\n },\n },\n}\n\nconst checkContains = (a: Value, b: Value): boolean => {\n if (a === b) return true\n if (typeof a !== typeof b) return false\n if (typeof a === 'string' && typeof b === 'string') {\n return a.includes(b)\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n return b.every((bItem) => a.some((aItem) => checkContains(aItem, bItem)))\n }\n if (isPlainObject(a) && isPlainObject(b)) {\n const keys = Object.keys(b)\n for (const key of keys) {\n if (!Object.prototype.hasOwnProperty.call(a, key)) return false\n const valA = a[key]!\n const valB = b[key]!\n if (!checkContains(valA, valB)) return false\n }\n return true\n }\n return valueEquals(a, b)\n}\n\n/**\n * Recursively traverses a JSON value to find all paths to leaf nodes.\n * Yields paths as arrays of strings/numbers.\n */\nfunction* traversePaths(\n root: Value,\n currentPath: (string | number)[],\n span: Span,\n tracker: LimitTracker\n): Generator<Value> {\n tracker.step(span)\n const isLeaf =\n root === null ||\n typeof root !== 'object' ||\n (Array.isArray(root) && root.length === 0) ||\n (isPlainObject(root) && Object.keys(root).length === 0)\n\n if (isLeaf) {\n yield emit([...currentPath], span, tracker)\n return\n }\n\n if (Array.isArray(root)) {\n for (let i = 0; i < root.length; i++) {\n yield* traversePaths(root[i]!, [...currentPath, i], span, tracker)\n }\n } else if (isPlainObject(root)) {\n const keys = Object.keys(root).sort()\n for (const key of keys) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n yield* traversePaths((root as ValueObject)[key]!, [...currentPath, key], span, tracker)\n }\n }\n}\n\n// Logic to check if we should emit path (redundant if traversePaths handles logic)\n// Removed from usage above.\n\nconst isPath = (val: Value): val is (string | number)[] => {\n if (!Array.isArray(val)) return false\n return val.every((p) => typeof p === 'string' || (typeof p === 'number' && Number.isInteger(p)))\n}\n\nconst ensurePath = (val: Value, span: Span): (string | number)[] => {\n if (isPath(val)) return val\n throw new RuntimeError('Path must be an array of strings or integers', span)\n}\n\nconst getPath = (root: Value, path: (string | number)[]): Value | undefined => {\n let curr = root\n for (const part of path) {\n if (curr === null) return undefined\n if (typeof part === 'string' && isPlainObject(curr)) {\n if (!Object.prototype.hasOwnProperty.call(curr, part)) return undefined\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n curr = (curr as ValueObject)[part]!\n } else if (typeof part === 'number' && Array.isArray(curr)) {\n if (part < 0 || part >= curr.length) return undefined\n curr = curr[part]!\n } else {\n return undefined\n }\n }\n return curr\n}\n\n/**\n * Immutably updates a value at a given path.\n * Creates intermediate objects/arrays as needed.\n */\nconst updatePath = (\n root: Value,\n path: (string | number)[],\n updateFn: (val: Value | undefined) => Value | undefined,\n span: Span,\n depth = 0\n): Value | undefined => {\n if (path.length === 0) {\n return updateFn(root)\n }\n const [head, ...tail] = path\n\n if (typeof head === 'string') {\n let obj: Record<string, Value> = {}\n if (isPlainObject(root)) {\n obj = { ...root }\n } else if (root === null) {\n obj = {}\n } else {\n throw new RuntimeError(`Cannot index ${describeType(root)} with string \"${head}\"`, span)\n }\n\n const child = Object.prototype.hasOwnProperty.call(obj, head) ? obj[head]! : undefined\n const newVal = updatePath(child ?? null, tail, updateFn, span, depth + 1)\n if (newVal === undefined) {\n delete obj[head]\n } else {\n obj[head] = newVal\n }\n return obj\n }\n\n if (typeof head === 'number') {\n let arr: Value[] = []\n if (Array.isArray(root)) {\n arr = [...root]\n } else if (root === null) {\n arr = []\n } else {\n throw new RuntimeError(`Cannot index ${describeType(root)} with number ${head}`, span)\n }\n\n const idx = head < 0 ? arr.length + head : head\n if (idx < 0) throw new RuntimeError('Invalid negative index', span)\n\n const child = idx < arr.length ? arr[idx] : null\n const newVal = updatePath(child ?? null, tail, updateFn, span, depth + 1)\n\n if (newVal === undefined) {\n // This branch is for setpath returning undefined?\n // setpath never returns undefined from leaf.\n // If `updatePath` is used for `delpaths` (splice), we need different logic.\n // But `setpath` uses this.\n // If leaf returns undefined (delete), we delete.\n // But `setpath` typically sets to null if null passed? No, `setpath(p, null)` sets to `null`.\n // `setpath` implies leaf returns Value.\n // But if `updatePath` supports deletions...\n // For array, standard `path[i] = undefined` behavior?\n // We'll treat undefined as \"do not set\" or \"hole\"?\n // `setpath` behavior: set to value.\n if (idx >= arr.length) {\n while (arr.length < idx) arr.push(null)\n arr.push(newVal!)\n } else {\n arr[idx] = newVal!\n }\n } else {\n if (idx >= arr.length) {\n while (arr.length < idx) arr.push(null)\n arr.push(newVal)\n } else {\n arr[idx] = newVal\n }\n }\n return arr\n }\n\n throw new RuntimeError(`Path segment must be string or integer`, span)\n}\n\nconst deletePaths = (root: Value, paths: (string | number)[][], span: Span): Value => {\n // Collect paths relevant to this level\n // Group by head\n // Paths ending here (empty tail) -> means delete this node?\n // If root is object:\n // Filter paths that are for this object (strings).\n // Reconstruct object excluding deleted keys, and recursing on others.\n\n // Check if any path is empty -> means delete ROOT.\n if (paths.some((p) => p.length === 0)) return null // Or undefined? delpaths returns ??\n // delpaths on root? `null | delpaths([[]])` -> null?\n // `1 | delpaths([[]])` -> 1? or null?\n // If we delete the root, what do we return?\n // Usually delpaths is structural.\n // If we delete root, maybe return null.\n\n if (isPlainObject(root)) {\n const result: ValueObject = { ...root }\n const relevantPaths = paths.filter((p) => p.length > 0 && typeof p[0] === 'string')\n\n // Group by key\n const byKey: Record<string, (string | number)[][]> = {}\n for (const p of relevantPaths) {\n const key = p[0] as string\n if (!byKey[key]) byKey[key] = []\n byKey[key].push(p.slice(1))\n }\n\n for (const key of Object.keys(byKey)) {\n const tails = byKey[key]!\n if (tails.some((t) => t.length === 0)) {\n // Delete this key\n delete result[key]\n } else {\n // Recurse\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n result[key] = deletePaths((root as ValueObject)[key]!, tails, span)\n }\n }\n return result\n }\n\n if (Array.isArray(root)) {\n const relevantPaths = paths.filter((p) => p.length > 0 && typeof p[0] === 'number')\n\n // Mark indices to delete or recurse\n // We cannot simply splice because indices shift.\n // We map original indices to actions.\n const actions: Record<number, (string | number)[][]> = {}\n for (const p of relevantPaths) {\n let idx = p[0] as number\n if (idx < 0) idx = root.length + idx\n if (idx < 0 || idx >= root.length) continue // Ignore OOB\n if (!actions[idx]) actions[idx] = []\n actions[idx]!.push(p.slice(1))\n }\n\n // Construct new array\n const finalArr: Value[] = []\n for (let i = 0; i < root.length; i++) {\n const tails = actions[i]\n if (tails) {\n if (tails.some((t) => t.length === 0)) {\n // Delete this element (skip push)\n continue\n } else {\n finalArr.push(deletePaths(root[i]!, tails, span))\n }\n } else {\n finalArr.push(root[i]!)\n }\n }\n return finalArr\n }\n\n return root\n}\n\n// Helper for stable sort\nfunction sortStable<T>(arr: T[], compare: (a: T, b: T) => number): T[] {\n return arr\n .map((item, index) => ({ item, index }))\n .sort((a, b) => {\n const cmp = compare(a.item, b.item)\n return cmp !== 0 ? cmp : a.index - b.index\n })\n .map((p) => p.item)\n}\n","import type { FilterNode } from './ast'\nimport { ValidationError } from './errors'\nimport { builtins } from './builtins'\n\n/**\n * Validates the AST for correctness and supported features.\n * Checks for unknown function calls and arity mismatches.\n *\n * @param node - The root AST node to validate.\n * @throws {ValidationError} If validation fails.\n */\nexport const validate = (node: FilterNode): void => {\n visit(node)\n}\n\nconst visit = (node: FilterNode): void => {\n switch (node.kind) {\n case 'Identity':\n case 'Literal':\n case 'Var':\n return\n case 'FieldAccess':\n visit(node.target)\n return\n case 'IndexAccess':\n visit(node.target)\n visit(node.index)\n return\n case 'Array':\n node.items.forEach(visit)\n return\n case 'Object':\n node.entries.forEach((entry) => {\n if (entry.key.kind === 'KeyExpr') {\n visit(entry.key.expr)\n }\n visit(entry.value)\n })\n return\n case 'Pipe':\n case 'Comma':\n case 'Alt':\n visit(node.left)\n visit(node.right)\n return\n case 'Binary':\n case 'Bool':\n visit(node.left)\n visit(node.right)\n return\n case 'Unary':\n visit(node.expr)\n return\n case 'If':\n node.branches.forEach((branch) => {\n visit(branch.cond)\n visit(branch.then)\n })\n visit(node.else)\n return\n case 'As':\n visit(node.bind)\n visit(node.body)\n return\n case 'Call': {\n const builtin = builtins[node.name]\n if (!builtin) {\n throw new ValidationError(`Unknown function: ${node.name}`, node.span)\n }\n if (builtin.arity !== node.args.length) {\n throw new ValidationError(\n `Function ${node.name} expects ${builtin.arity} arguments, but got ${node.args.length}`,\n node.span\n )\n }\n node.args.forEach(visit)\n return\n }\n case 'Reduce':\n visit(node.source)\n visit(node.init)\n visit(node.update)\n return\n case 'Foreach':\n visit(node.source)\n visit(node.init)\n visit(node.update)\n if (node.extract) visit(node.extract)\n return\n case 'Try':\n visit(node.body)\n if (node.handler) visit(node.handler)\n return\n case 'Recurse':\n case 'Iterate':\n return\n default: {\n // Exhaustive check\n const exhaustive: never = node\n return exhaustive\n }\n }\n}\n","import { RuntimeError } from './errors'\nimport type { Span } from './span'\n\n/**\n * Configuration options for execution limits.\n * All fields are optional and default to safe values if strictly undefined.\n */\nexport interface LimitsConfig {\n /** Maximum number of AST nodes to visit during execution. Default: 100,000. */\n maxSteps?: number\n /** Maximum recursion depth for execution and parsing. Default: 200. */\n maxDepth?: number\n /** Maximum number of values to yield from a single output emitter. Default: 10,000. */\n maxOutputs?: number\n}\n\n/**\n * Fully resolved limits with defaults applied.\n */\nexport interface ResolvedLimits {\n maxSteps: number\n maxDepth: number\n maxOutputs: number\n}\n\nconst DEFAULT_LIMITS: ResolvedLimits = {\n maxSteps: 100_000,\n maxDepth: 200,\n maxOutputs: 10_000,\n}\n\n/**\n * Resolves a partial limits configuration into a complete one with defaults.\n *\n * @param config - The user-provided configuration.\n * @returns The resolved limits.\n */\nexport const resolveLimits = (config: LimitsConfig = {}): ResolvedLimits => ({\n maxSteps: config.maxSteps ?? DEFAULT_LIMITS.maxSteps,\n maxDepth: config.maxDepth ?? DEFAULT_LIMITS.maxDepth,\n maxOutputs: config.maxOutputs ?? DEFAULT_LIMITS.maxOutputs,\n})\n\n/**\n * Tracks execution usage against defined limits.\n * Throws {@link RuntimeError} if any limit is exceeded.\n */\nexport class LimitTracker {\n private steps = 0\n private depth = 0\n private outputs = 0\n\n constructor(private readonly limits: ResolvedLimits) {}\n\n /**\n * Records a single execution step (AST node visit).\n * @param span - The source span for error reporting.\n */\n step(span: Span): void {\n this.steps += 1\n if (this.steps > this.limits.maxSteps) {\n throw new RuntimeError('Step limit exceeded', span)\n }\n }\n\n /**\n * Enters a new scope/stack frame, incrementing the depth counter.\n * @param span - The source span for error reporting.\n */\n enter(span: Span): void {\n this.depth += 1\n if (this.depth > this.limits.maxDepth) {\n throw new RuntimeError('Max depth exceeded', span)\n }\n }\n\n /**\n * Exits the current scope, decrementing the depth counter.\n */\n exit(): void {\n this.depth = Math.max(0, this.depth - 1)\n }\n\n /**\n * Records an output value being emitted.\n * @param span - The source span for error reporting.\n */\n emit(span: Span): void {\n this.outputs += 1\n if (this.outputs > this.limits.maxOutputs) {\n throw new RuntimeError('Output limit exceeded', span)\n }\n }\n}\n","import type { FilterNode, ObjectKey } from './ast'\nimport { RuntimeError } from './errors'\nimport { LimitTracker, resolveLimits, type LimitsConfig } from './limits'\nimport type { Span } from './span'\nimport { isTruthy, valueEquals, compareValues, type Value } from './value'\nimport { builtins } from './builtins'\n\nexport type EnvFrame = Map<string, Value>\nexport type EnvStack = EnvFrame[]\n\nexport interface EvalOptions {\n limits?: LimitsConfig\n}\n\nexport const runAst = (ast: FilterNode, input: Value, options: EvalOptions = {}): Value[] => {\n const tracker = new LimitTracker(resolveLimits(options.limits))\n const env: EnvStack = [new Map<string, Value>()]\n return Array.from<Value>(evaluate(ast, input, env, tracker))\n}\n\n/**\n * Evaluates an AST node against an input value.\n * This is a generator function that yields results lazily.\n *\n * @param node - The AST node to evaluate.\n * @param input - The current input value (context).\n * @param env - The variable environment stack.\n * @param tracker - Limits tracker for cycle/output limits.\n */\nfunction* evaluate(\n node: FilterNode,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value, void, undefined> {\n tracker.step(node.span)\n tracker.enter(node.span)\n try {\n switch (node.kind) {\n case 'Identity':\n yield emit(input, node.span, tracker)\n return\n case 'Literal':\n yield emit(node.value, node.span, tracker)\n return\n case 'Var':\n yield emit(getVar(env, node.name, node.span), node.span, tracker)\n return\n case 'FieldAccess':\n yield* evalField(node, input, env, tracker)\n return\n case 'IndexAccess':\n yield* evalIndex(node, input, env, tracker)\n return\n case 'Array':\n yield emit(buildArray(node, input, env, tracker), node.span, tracker)\n return\n case 'Object':\n yield* buildObjects(node, input, env, tracker)\n return\n case 'Pipe':\n for (const left of evaluate(node.left, input, env, tracker)) {\n yield* evaluate(node.right, left, env, tracker)\n }\n return\n case 'Comma':\n yield* evaluate(node.left, input, env, tracker)\n yield* evaluate(node.right, input, env, tracker)\n return\n case 'Alt': {\n const leftValues = Array.from<Value>(evaluate(node.left, input, env, tracker))\n const valid = leftValues.filter((v) => v !== null && v !== false)\n if (valid.length > 0) {\n for (const v of valid) {\n yield v\n }\n } else {\n yield* evaluate(node.right, input, env, tracker)\n }\n return\n }\n case 'Unary':\n if (node.op === 'Not') {\n for (const value of evaluate(node.expr, input, env, tracker)) {\n yield emit(!isTruthy(value), node.span, tracker)\n }\n } else {\n for (const value of evaluate(node.expr, input, env, tracker)) {\n yield emit(applyUnaryNeg(value, node.span), node.span, tracker)\n }\n }\n return\n case 'Binary':\n yield* evalBinary(node, input, env, tracker)\n return\n case 'Bool':\n if (node.op === 'Or') {\n for (const left of evaluate(node.left, input, env, tracker)) {\n if (isTruthy(left)) {\n yield emit(true, node.span, tracker)\n } else {\n for (const right of evaluate(node.right, input, env, tracker)) {\n yield emit(isTruthy(right), node.span, tracker)\n }\n }\n }\n } else {\n for (const left of evaluate(node.left, input, env, tracker)) {\n if (!isTruthy(left)) {\n yield emit(false, node.span, tracker)\n } else {\n for (const right of evaluate(node.right, input, env, tracker)) {\n yield emit(isTruthy(right), node.span, tracker)\n }\n }\n }\n }\n return\n case 'If':\n for (const branch of node.branches) {\n const condValues = Array.from<Value>(evaluate(branch.cond, input, env, tracker))\n if (condValues.length > 1) {\n throw new RuntimeError('Condition produced multiple values', branch.cond.span)\n }\n if (condValues.length === 1 && isTruthy(condValues[0]!)) {\n yield* evaluate(branch.then, input, env, tracker)\n return\n }\n }\n yield* evaluate(node.else, input, env, tracker)\n return\n case 'As': {\n const boundValues = Array.from<Value>(evaluate(node.bind, input, env, tracker))\n for (const value of boundValues) {\n pushBinding(env, node.name, value)\n try {\n yield* evaluate(node.body, input, env, tracker)\n } finally {\n popBinding(env)\n }\n }\n return\n }\n case 'Call': {\n const builtin = builtins[node.name]\n if (!builtin) {\n throw new RuntimeError(`Unknown function: ${node.name}/${node.args.length}`, node.span)\n }\n yield* builtin.apply(input, node.args, env, tracker, evaluate, node.span)\n return\n }\n case 'Reduce':\n yield* evalReduce(node, input, env, tracker)\n return\n case 'Foreach':\n yield* evalForeach(node, input, env, tracker)\n return\n case 'Try':\n yield* evalTry(node, input, env, tracker)\n return\n case 'Recurse':\n yield* evalRecurse(node, input, env, tracker)\n return\n case 'Iterate':\n yield* evalIterate(node, input, env, tracker)\n return\n }\n } finally {\n tracker.exit()\n }\n}\n\nconst emit = (value: Value, span: Span, tracker: LimitTracker): Value => {\n tracker.emit(span)\n return value\n}\n\nconst evalField = function* (\n node: Extract<FilterNode, { kind: 'FieldAccess' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n for (const container of evaluate(node.target, input, env, tracker)) {\n if (container === null) {\n yield emit(null, node.span, tracker)\n continue\n }\n if (isPlainObject(container)) {\n yield emit(\n Object.prototype.hasOwnProperty.call(container, node.field) ? container[node.field]! : null,\n node.span,\n tracker\n )\n continue\n }\n throw new RuntimeError(`Cannot index ${describeType(container)} with string`, node.span)\n }\n}\n\nconst evalIndex = function* (\n node: Extract<FilterNode, { kind: 'IndexAccess' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n const indexValues = Array.from<Value>(evaluate(node.index, input, env, tracker))\n for (const container of evaluate(node.target, input, env, tracker)) {\n if (container === null) {\n yield emit(null, node.span, tracker)\n continue\n }\n if (isValueArray(container)) {\n for (const idxValue of indexValues) {\n const index = ensureInteger(idxValue, node.span)\n const resolved = index < 0 ? container.length + index : index\n if (resolved < 0 || resolved >= container.length) {\n yield emit(null, node.span, tracker)\n } else {\n yield emit(container[resolved]!, node.span, tracker)\n }\n }\n continue\n }\n if (isPlainObject(container)) {\n for (const keyValue of indexValues) {\n if (typeof keyValue !== 'string') {\n throw new RuntimeError(`Cannot index object with ${describeType(keyValue)}`, node.span)\n }\n yield emit(\n Object.prototype.hasOwnProperty.call(container, keyValue) ? container[keyValue]! : null,\n node.span,\n tracker\n )\n }\n continue\n }\n throw new RuntimeError(`Cannot index ${describeType(container)}`, node.span)\n }\n}\n\nconst evalIterate = function* (\n node: Extract<FilterNode, { kind: 'Iterate' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n for (const container of evaluate(node.target, input, env, tracker)) {\n if (container === null) {\n // jq null | .[] outputs nothing\n continue\n }\n if (isValueArray(container)) {\n for (const item of container) {\n yield emit(item, node.span, tracker)\n }\n continue\n }\n if (isPlainObject(container)) {\n const keys = Object.keys(container).sort()\n for (const key of keys) {\n yield emit(container[key]!, node.span, tracker)\n }\n continue\n }\n throw new RuntimeError(`Cannot iterate over ${describeType(container)}`, node.span)\n }\n}\n\nconst evalReduce = function* (\n node: Extract<FilterNode, { kind: 'Reduce' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n const initValues = Array.from(evaluate(node.init, input, env, tracker))\n if (initValues.length !== 1) {\n throw new RuntimeError('Reduce init must single value', node.init.span)\n }\n let acc = initValues[0]!\n\n for (const item of evaluate(node.source, input, env, tracker)) {\n tracker.step(node.span)\n pushBinding(env, node.var, item)\n try {\n const updates = Array.from(evaluate(node.update, acc, env, tracker))\n if (updates.length !== 1) {\n throw new RuntimeError('Reduce update must produce single value', node.update.span)\n }\n acc = updates[0]!\n } finally {\n popBinding(env)\n }\n }\n yield emit(acc, node.span, tracker)\n}\n\nconst evalForeach = function* (\n node: Extract<FilterNode, { kind: 'Foreach' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n const initValues = Array.from(evaluate(node.init, input, env, tracker))\n if (initValues.length !== 1) {\n throw new RuntimeError('Foreach init must single value', node.init.span)\n }\n let acc = initValues[0]!\n\n for (const item of evaluate(node.source, input, env, tracker)) {\n tracker.step(node.span)\n pushBinding(env, node.var, item)\n try {\n const updates = Array.from(evaluate(node.update, acc, env, tracker))\n if (updates.length !== 1) {\n throw new RuntimeError('Foreach update must produce single value', node.update.span)\n }\n acc = updates[0]!\n\n if (node.extract) {\n for (const extracted of evaluate(node.extract, acc, env, tracker)) {\n yield emit(extracted, node.span, tracker)\n }\n } else {\n yield emit(acc, node.span, tracker)\n }\n } finally {\n popBinding(env)\n }\n }\n}\n\nconst evalTry = function* (\n node: Extract<FilterNode, { kind: 'Try' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n try {\n yield* evaluate(node.body, input, env, tracker)\n } catch (err) {\n if (err instanceof RuntimeError) {\n if (node.handler) {\n // Bind error message to input\n yield* evaluate(node.handler, err.message, env, tracker)\n }\n // If no handler, suppress error (emit nothing)\n } else {\n throw err\n }\n }\n}\n\nconst evalRecurse = function* (\n node: Extract<FilterNode, { kind: 'Recurse' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n yield emit(input, node.span, tracker)\n tracker.step(node.span)\n\n if (isValueArray(input)) {\n for (const item of input) {\n yield* evaluate(node, item, env, tracker)\n }\n } else if (isPlainObject(input)) {\n const keys = Object.keys(input).sort()\n for (const key of keys) {\n yield* evaluate(node, input[key]!, env, tracker)\n }\n }\n}\n\nconst buildArray = (\n node: Extract<FilterNode, { kind: 'Array' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Value[] => {\n const result: Value[] = []\n node.items.forEach((item) => {\n for (const value of evaluate(item, input, env, tracker)) {\n result.push(value)\n }\n })\n return result\n}\n\nconst buildObjects = function* (\n node: Extract<FilterNode, { kind: 'Object' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n if (node.entries.length === 0) {\n yield emit({}, node.span, tracker)\n return\n }\n\n let partials: Record<string, Value>[] = [{}]\n for (const entry of node.entries) {\n const keys = resolveObjectKeys(entry.key, input, env, tracker)\n const values = Array.from<Value>(evaluate(entry.value, input, env, tracker))\n const next: Record<string, Value>[] = []\n partials.forEach((partial) => {\n keys.forEach((key) => {\n values.forEach((value) => {\n next.push(extendRecord(partial, key, value))\n })\n })\n })\n partials = next\n if (partials.length === 0) {\n return\n }\n }\n for (const obj of partials) {\n yield emit(obj, node.span, tracker)\n }\n}\n\nconst resolveObjectKeys = (\n key: ObjectKey,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): string[] => {\n if (key.kind === 'KeyIdentifier') return [key.name]\n if (key.kind === 'KeyString') return [key.value]\n const values = Array.from<Value>(evaluate(key.expr, input, env, tracker))\n return values.map((value) => {\n if (typeof value !== 'string') {\n throw new RuntimeError('Object key expression must produce strings', key.span)\n }\n return value\n })\n}\n\nconst evalBinary = function* (\n node: Extract<FilterNode, { kind: 'Binary' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n const leftValues = Array.from<Value>(evaluate(node.left, input, env, tracker))\n const rightValues = Array.from<Value>(evaluate(node.right, input, env, tracker))\n for (const left of leftValues) {\n for (const right of rightValues) {\n yield emit(applyBinaryOp(node.op, left, right, node.span), node.span, tracker)\n }\n }\n}\n\nconst applyBinaryOp = (op: string, left: Value, right: Value, span: Span): Value => {\n switch (op) {\n case '+':\n return applyPlus(left, right, span)\n case '-':\n return applyMinus(left, right, span)\n case '*':\n return applyMultiply(left, right, span)\n case '/':\n return applyDivide(left, right, span)\n case '%':\n return applyModulo(left, right, span)\n case 'Eq':\n return valueEquals(left, right)\n case 'Neq':\n return !valueEquals(left, right)\n case 'Lt':\n return compareValues(left, right) < 0\n case 'Lte':\n return compareValues(left, right) <= 0\n case 'Gt':\n return compareValues(left, right) > 0\n case 'Gte':\n return compareValues(left, right) >= 0\n default:\n throw new RuntimeError(`Unsupported operator ${op}`, span)\n }\n}\n\nconst applyUnaryNeg = (value: Value, span: Span): Value => {\n if (typeof value === 'number') return -value\n throw new RuntimeError('Unary \"-\" expects a number', span)\n}\n\nconst applyPlus = (left: Value, right: Value, span: Span): Value => {\n if (left === null) return cloneValue(right)\n if (right === null) return cloneValue(left)\n if (typeof left === 'number' && typeof right === 'number') return left + right\n if (typeof left === 'string' && typeof right === 'string') return left + right\n if (isValueArray(left) && isValueArray(right)) return [...left, ...right]\n if (isPlainObject(left) && isPlainObject(right)) return mergeShallowObjects(left, right)\n throw new RuntimeError(`Cannot add ${describeType(left)} and ${describeType(right)}`, span)\n}\n\nconst applyMinus = (left: Value, right: Value, span: Span): Value => {\n if (typeof left === 'number' && typeof right === 'number') return left - right\n if (isValueArray(left) && isValueArray(right)) {\n return left.filter((item) => !right.some((candidate) => valueEquals(item, candidate)))\n }\n throw new RuntimeError(`Cannot subtract ${describeType(right)} from ${describeType(left)}`, span)\n}\n\nconst applyMultiply = (left: Value, right: Value, span: Span): Value => {\n if (typeof left === 'number' && typeof right === 'number') return left * right\n if (typeof left === 'string' && typeof right === 'number') return repeatString(left, right, span)\n if (typeof right === 'string' && typeof left === 'number') return repeatString(right, left, span)\n if (isPlainObject(left) && isPlainObject(right)) return deepMergeObjects(left, right)\n throw new RuntimeError(`Cannot multiply ${describeType(left)} and ${describeType(right)}`, span)\n}\n\nconst applyDivide = (left: Value, right: Value, span: Span): Value => {\n if (typeof left !== 'number' || typeof right !== 'number') {\n throw new RuntimeError('Division expects two numbers', span)\n }\n if (right === 0) throw new RuntimeError('Division by zero', span)\n return left / right\n}\n\nconst applyModulo = (left: Value, right: Value, span: Span): Value => {\n if (typeof left !== 'number' || typeof right !== 'number') {\n throw new RuntimeError('Modulo expects two numbers', span)\n }\n if (right === 0) throw new RuntimeError('Modulo by zero', span)\n return left % right\n}\n\nconst repeatString = (text: string, countValue: number, span: Span): string => {\n const count = ensureInteger(countValue, span)\n if (count < 0) throw new RuntimeError('String repeat expects non-negative count', span)\n return text.repeat(count)\n}\n\nconst deepMergeObjects = (left: Record<string, Value>, right: Record<string, Value>): Value => {\n const result: Record<string, Value> = {}\n Object.keys(left).forEach((key) => {\n const leftValue = left[key]\n if (leftValue !== undefined) {\n result[key] = cloneValue(leftValue)\n }\n })\n Object.keys(right).forEach((key) => {\n const existing = result[key]\n const rightValue = right[key]\n if (rightValue === undefined) {\n return\n }\n if (existing !== undefined && isPlainObject(existing) && isPlainObject(rightValue)) {\n result[key] = deepMergeObjects(existing, rightValue)\n } else {\n result[key] = cloneValue(rightValue)\n }\n })\n return result\n}\n\nconst cloneValue = (value: Value): Value => {\n if (isValueArray(value)) {\n return value.map((item) => cloneValue(item))\n }\n if (isPlainObject(value)) {\n const result: Record<string, Value> = {}\n Object.keys(value).forEach((key) => {\n const child = value[key]\n if (child !== undefined) {\n result[key] = cloneValue(child)\n }\n })\n return result\n }\n return value\n}\n\nconst getVar = (env: EnvStack, name: string, span: Span): Value => {\n for (let i = env.length - 1; i >= 0; i -= 1) {\n const frame = env[i]\n if (frame && frame.has(name)) {\n return frame.get(name)!\n }\n }\n throw new RuntimeError(`Unbound variable: $${name}`, span)\n}\n\nconst pushBinding = (env: EnvStack, name: string, value: Value) => {\n env.push(new Map<string, Value>([[name, value]]))\n}\n\nconst popBinding = (env: EnvStack) => {\n env.pop()\n}\n\nconst ensureInteger = (value: Value, span: Span): number => {\n if (typeof value !== 'number' || !Number.isInteger(value)) {\n throw new RuntimeError('Index must be an integer number', span)\n }\n return value\n}\n\nconst extendRecord = (\n base: Record<string, Value>,\n key: string,\n value: Value\n): Record<string, Value> => {\n const next: Record<string, Value> = {}\n Object.keys(base).forEach((existingKey) => {\n const existingValue = base[existingKey]\n if (existingValue !== undefined) {\n next[existingKey] = existingValue\n }\n })\n next[key] = value\n return next\n}\n\nconst mergeShallowObjects = (\n left: Record<string, Value>,\n right: Record<string, Value>\n): Record<string, Value> => {\n const result: Record<string, Value> = {}\n Object.keys(left).forEach((key) => {\n const leftValue = left[key]\n if (leftValue !== undefined) {\n result[key] = leftValue\n }\n })\n Object.keys(right).forEach((key) => {\n const rightValue = right[key]\n if (rightValue !== undefined) {\n result[key] = rightValue\n }\n })\n return result\n}\n\nconst isValueArray = (value: Value): value is Value[] => Array.isArray(value)\n\nconst isPlainObject = (value: Value): value is Record<string, Value> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst describeType = (value: Value): string => {\n if (value === null) return 'null'\n if (typeof value === 'boolean') return 'boolean'\n if (typeof value === 'number') return 'number'\n if (typeof value === 'string') return 'string'\n if (Array.isArray(value)) return 'array'\n return 'object'\n}\n","import { parse } from './parser'\nimport { validate } from './validate'\nimport { runAst, type EvalOptions } from './eval'\nimport type { Value } from './value'\nimport { LimitTracker, resolveLimits, type LimitsConfig, type ResolvedLimits } from './limits'\nimport { LexError, ParseError, ValidationError, RuntimeError } from './errors'\n\nexport { parse, validate, runAst, LimitTracker, resolveLimits }\nexport type { EvalOptions, Value, LimitsConfig, ResolvedLimits }\nexport { LexError, ParseError, ValidationError, RuntimeError }\n\n/**\n * Runs a jq query against a JSON input.\n *\n * @param source - The jq query string (e.g., `.foo | .bar`).\n * @param input - The JSON input value (object, array, string, number, boolean, or null).\n * @param options - Execution options including limits.\n * @returns An array of results. jq queries always produce zero or more values.\n * @throws {LexError} If the query contains invalid characters.\n * @throws {ParseError} If the query syntax is invalid.\n * @throws {ValidationError} If the query uses unsupported features.\n * @throws {RuntimeError} If execution fails (e.g., type error) or exceeds limits.\n */\nexport const run = (source: string, input: Value, options: EvalOptions = {}): Value[] => {\n const ast = parse(source)\n validate(ast)\n return runAst(ast, input, options)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["keywordKinds: Record<string, TokenKind | undefined>","tokens: Token[]","modeStack: number[]","tokens: Token[]","args: string[]","op: AssignmentNode['op']","end: FilterNode | null","extract: FilterNode | undefined","handler: FilterNode | undefined","branches: { cond: FilterNode; then: FilterNode }[]","items: FilterNode[]","entries: ObjectEntry[]","expr: FilterNode","args: FilterNode[]","parts: FilterNode[]","builtins: Record<string, BuiltinSpec[]>","emit","stdBuiltins: BuiltinSpec[]","emit","newStruct: Value","newArr: Value[]","newObj: ValueObject","lastVal: Value | undefined","evaluate","errorBuiltins: BuiltinSpec[]","evaluate","stringBuiltins: BuiltinSpec[]","evaluate","emit","parts: string[]","foundIndex: number | null","indices: number[]","chars: string[]","compare","collectionBuiltins: BuiltinSpec[]","emit","evaluate","keyStr: string","result: Value[]","pairs: { val: Value; key: Value }[]","seen: Value[]","seenKeys: Value[]","result: ValueObject","entries: Value[]","transformed: Value[]","groups: Value[][]","currentGroup: Value[]","res: Value[]","result: Value[][]","newRow: Value[]","arrays: Value[][]","evaluate","key: string | number","emit","obj: Record<string, Value>","arr: Value[]","result: ValueObject","byKey: Record<string, (string | number)[][]>","actions: Record<number, (string | number)[][]>","finalArr: Value[]","pathBuiltins: BuiltinSpec[]","evaluate","iteratorBuiltins: BuiltinSpec[]","evaluate","emit","lastVal: Value | undefined","isPlainObject","mathBuiltins: BuiltinSpec[]","emit","minKey: Value | undefined","evaluate","maxKey: Value | undefined","acc: Value","label: string","DEFAULT_LIMITS: ResolvedLimits","limits: ResolvedLimits","evaluate","newValues: Value[]","res: Value","evaluate","children: Value[]","evaluate","starts: number[]","ends: number[]","result: Value[]","evaluate","keys: string[]","newFrame: EnvFrame","evaluate","funDef: FunctionDef","evaluate","env: EnvStack","newFrame: EnvFrame"],"sources":["../src/errors.ts","../src/tokens.ts","../src/lexer.ts","../src/parser.ts","../src/builtins/registry.ts","../src/value.ts","../src/builtins/utils.ts","../src/builtins/std.ts","../src/builtins/errors.ts","../src/builtins/strings.ts","../src/builtins/collections.ts","../src/eval/path_eval.ts","../src/builtins/paths.ts","../src/builtins/iterators.ts","../src/eval/ops.ts","../src/builtins/math.ts","../src/builtins/index.ts","../src/builtins.ts","../src/validate.ts","../src/eval/break.ts","../src/limits.ts","../src/eval/env.ts","../src/eval/common.ts","../src/eval/assignment.ts","../src/eval/iterators.ts","../src/eval/access.ts","../src/eval/constructors.ts","../src/eval/functions.ts","../src/eval/control_flow.ts","../src/eval/dispatch.ts","../src/index.ts"],"sourcesContent":["import type { Span } from './span'\n\n/**\n * Categories of errors that can occur during processing.\n * - `lex`: Errors during lexical analysis (invalid characters).\n * - `parse`: Errors during parsing (syntax errors).\n * - `validate`: Errors during semantics checking (unsupported features).\n * - `runtime`: Errors during execution (type errors, limits).\n */\nexport type ErrorKind = 'lex' | 'parse' | 'validate' | 'runtime'\n\n/**\n * Common interface for all errors thrown by the jq-ts library.\n */\nexport interface JqTsError extends Error {\n /** The category of the error. */\n kind: ErrorKind\n /** The source code span where the error occurred. */\n span: Span\n}\n\nclass BaseError extends Error implements JqTsError {\n kind: ErrorKind\n span: Span\n\n constructor(kind: ErrorKind, message: string, span: Span) {\n super(message)\n this.kind = kind\n this.span = span\n const pascalKind = kind.charAt(0).toUpperCase() + kind.slice(1)\n this.name = `${pascalKind}Error`\n }\n}\n\n/**\n * Thrown when the lexer encounters invalid input characters.\n */\nexport class LexError extends BaseError {\n constructor(message: string, span: Span) {\n super('lex', message, span)\n }\n}\n\n/**\n * Thrown when the parser encounters invalid syntax.\n */\nexport class ParseError extends BaseError {\n constructor(message: string, span: Span) {\n super('parse', message, span)\n }\n}\n\n/**\n * Thrown when the AST contains unsupported or invalid features (e.g., restricted operators).\n */\nexport class ValidationError extends BaseError {\n constructor(message: string, span: Span) {\n super('validate', message, span)\n }\n}\n\n/**\n * Thrown during execution for runtime issues (type errors, limits exceeded, user-raised errors).\n */\nexport class RuntimeError extends BaseError {\n constructor(message: string, span: Span) {\n super('runtime', message, span)\n }\n}\n","import type { Span } from './span'\n\nexport type TokenKind =\n | 'Null'\n | 'True'\n | 'False'\n | 'Number'\n | 'String'\n | 'StringStart'\n | 'StringMiddle'\n | 'StringEnd'\n | 'Identifier'\n | 'Variable'\n | 'Dot'\n | 'Comma'\n | 'Pipe'\n | 'Alt'\n | 'LParen'\n | 'RParen'\n | 'LBracket'\n | 'RBracket'\n | 'LBrace'\n | 'RBrace'\n | 'Colon'\n | 'Plus'\n | 'Minus'\n | 'Star'\n | 'Slash'\n | 'Percent'\n | 'EqualEqual'\n | 'BangEqual'\n | 'Less'\n | 'LessEqual'\n | 'Greater'\n | 'GreaterEqual'\n | 'If'\n | 'Then'\n | 'Elif'\n | 'Else'\n | 'End'\n | 'As'\n | 'And'\n | 'Or'\n | 'Not'\n | 'Reduce'\n | 'Foreach'\n | 'Try'\n | 'Catch'\n | 'DotDot'\n | 'Semicolon'\n | 'Eq'\n | 'BarEq'\n | 'PlusEq'\n | 'MinusEq'\n | 'StarEq'\n | 'SlashEq'\n | 'PercentEq'\n | 'AltEq'\n | 'Def'\n | 'Label'\n | 'Break'\n | 'Question'\n | 'EOF'\n\nexport interface Token {\n kind: TokenKind\n span: Span\n value?: string | number\n}\n\nexport const keywordKinds: Record<string, TokenKind | undefined> = {\n if: 'If',\n then: 'Then',\n elif: 'Elif',\n else: 'Else',\n end: 'End',\n as: 'As',\n and: 'And',\n or: 'Or',\n not: 'Not',\n null: 'Null',\n true: 'True',\n false: 'False',\n reduce: 'Reduce',\n foreach: 'Foreach',\n try: 'Try',\n catch: 'Catch',\n def: 'Def',\n label: 'Label',\n break: 'Break',\n}\n","import { LexError } from './errors'\nimport type { Span } from './span'\nimport type { Token, TokenKind } from './tokens'\nimport { keywordKinds } from './tokens'\n\n/**\n * Tokenizes the input jq string into a list of AST tokens.\n * Handles string interpolation, comments, and operator grouping.\n *\n * @param text - The source code to tokenize.\n * @returns An array of {@link Token}, including an EOF token at the end.\n * @throws {@link LexError} if an invalid character or sequence is encountered.\n */\nexport const lex = (text: string): Token[] => {\n const tokens: Token[] = []\n const length = text.length\n let pos = 0\n\n const peek = (offset = 0) => text[pos + offset]\n const advance = () => text[pos++]\n const makeSpan = (start: number, end: number): Span => ({ start, end })\n const pushToken = (kind: TokenKind, start: number, end: number, value?: string | number) => {\n tokens.push({ kind, span: makeSpan(start, end), value })\n }\n\n const isWhitespace = (ch: string | undefined) =>\n ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r'\n const isDigit = (ch: string | undefined) => !!ch && ch >= '0' && ch <= '9'\n const isIdentifierStart = (ch: string | undefined) =>\n !!ch && ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '_')\n const isIdentifierPart = (ch: string | undefined) => isIdentifierStart(ch) || isDigit(ch)\n\n // Modes: 0=Normal, 1=Interpolation\n const modeStack: number[] = [0]\n\n while (pos < length) {\n // Check for interpolation end ')' if in String mode (actually it's handled by ) case)\n const ch = peek()\n\n // ... whitespace, comments ...\n if (isWhitespace(ch)) {\n advance()\n continue\n }\n if (ch === '#') {\n while (pos < length && peek() !== '\\n') advance()\n continue\n }\n\n const start = pos\n\n if (ch === ')') {\n // Check if we are ending an interpolation\n if (modeStack.length > 1) {\n advance() // consume ')'\n // Resume string\n const endPos = readString(start, false) // false = not initial quote\n const value = readStringValue(start, start + 1, endPos - (peek(-1) === '\"' ? 1 : 2))\n // Check how readString ended\n if (text[endPos - 1] === '\"') {\n // Ended with quote\n modeStack.pop()\n pushToken('StringEnd', start, endPos, value)\n } else {\n // Ended with \\(\n pushToken('StringMiddle', start, endPos, value)\n }\n continue\n }\n // Else normal RParen\n }\n\n switch (ch) {\n case '\"': {\n const endPos = readString(start, true)\n const isInterp = text.substring(endPos - 2, endPos) === '\\\\('\n const value = readStringValue(start, start + 1, endPos - (isInterp ? 2 : 1))\n\n if (isInterp) {\n modeStack.push(1)\n pushToken('StringStart', start, endPos, value)\n } else {\n pushToken('String', start, endPos, value)\n }\n continue\n }\n // ... same cases ...\n case '.': {\n advance()\n if (peek() === '.') {\n advance()\n pushToken('DotDot', start, pos)\n } else {\n pushToken('Dot', start, pos)\n }\n continue\n }\n case ';': {\n advance()\n pushToken('Semicolon', start, pos)\n continue\n }\n case ',': {\n advance()\n pushToken('Comma', start, pos)\n continue\n }\n case '?': {\n advance()\n pushToken('Question', start, pos)\n continue\n }\n case '|': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('BarEq', start, pos)\n } else {\n pushToken('Pipe', start, pos)\n }\n continue\n }\n case '/': {\n advance()\n if (peek() === '/') {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('AltEq', start, pos)\n } else {\n pushToken('Alt', start, pos)\n }\n } else if (peek() === '=') {\n advance()\n pushToken('SlashEq', start, pos)\n } else {\n pushToken('Slash', start, pos)\n }\n continue\n }\n case '(': {\n advance()\n pushToken('LParen', start, pos)\n continue\n }\n case ')': {\n advance()\n pushToken('RParen', start, pos)\n continue\n }\n case '[': {\n advance()\n pushToken('LBracket', start, pos)\n continue\n }\n case ']': {\n advance()\n pushToken('RBracket', start, pos)\n continue\n }\n case '{': {\n advance()\n pushToken('LBrace', start, pos)\n continue\n }\n case '}': {\n advance()\n pushToken('RBrace', start, pos)\n continue\n }\n case ':': {\n advance()\n pushToken('Colon', start, pos)\n continue\n }\n case '+': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('PlusEq', start, pos)\n } else {\n pushToken('Plus', start, pos)\n }\n continue\n }\n case '-': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('MinusEq', start, pos)\n } else {\n pushToken('Minus', start, pos)\n }\n continue\n }\n case '*': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('StarEq', start, pos)\n } else {\n pushToken('Star', start, pos)\n }\n continue\n }\n case '%': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('PercentEq', start, pos)\n } else {\n pushToken('Percent', start, pos)\n }\n continue\n }\n case '=': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('EqualEqual', start, pos)\n } else {\n pushToken('Eq', start, pos)\n }\n continue\n }\n case '!': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('BangEqual', start, pos)\n } else {\n throw new LexError('Unexpected \"!\" (only \"!=\" supported)', makeSpan(start, pos))\n }\n continue\n }\n case '<': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('LessEqual', start, pos)\n } else {\n pushToken('Less', start, pos)\n }\n continue\n }\n case '>': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('GreaterEqual', start, pos)\n } else {\n pushToken('Greater', start, pos)\n }\n continue\n }\n case '$': {\n advance()\n if (!isIdentifierStart(peek())) {\n throw new LexError('Expected identifier after \"$\"', makeSpan(start, pos))\n }\n const nameStart = pos\n while (isIdentifierPart(peek())) advance()\n pushToken('Variable', start, pos, text.slice(nameStart, pos))\n continue\n }\n default:\n break\n }\n\n if (isDigit(ch)) {\n const end = readNumber(start)\n const raw = text.slice(start, end)\n const value = Number(raw)\n if (!Number.isFinite(value)) {\n throw new LexError(`Invalid number literal: ${raw}`, makeSpan(start, end))\n }\n pushToken('Number', start, end, value)\n continue\n }\n\n if (isIdentifierStart(ch)) {\n while (isIdentifierPart(peek())) advance()\n const raw = text.slice(start, pos)\n const keyword = keywordKinds[raw]\n // ...\n if (keyword === 'Null' || keyword === 'True' || keyword === 'False') {\n pushToken(keyword, start, pos)\n } else if (keyword) {\n pushToken(keyword, start, pos)\n } else {\n pushToken('Identifier', start, pos, raw)\n }\n continue\n }\n\n throw new LexError(`Unexpected character \"${ch}\"`, makeSpan(start, start + 1))\n }\n\n pushToken('EOF', pos, pos)\n return tokens\n\n function readNumber(tokenStart: number): number {\n while (isDigit(peek())) advance()\n if (peek() === '.' && isDigit(peek(1))) {\n advance()\n while (isDigit(peek())) advance()\n }\n if (peek() === 'e' || peek() === 'E') {\n advance()\n if (peek() === '+' || peek() === '-') advance()\n if (!isDigit(peek())) {\n throw new LexError(`Invalid exponent in number literal`, makeSpan(tokenStart, pos))\n }\n while (isDigit(peek())) advance()\n }\n return pos\n }\n\n function readString(tokenStart: number, openQuote: boolean): number {\n if (openQuote) advance() // consume opening \"\n\n while (pos < length) {\n const current = advance()\n if (current === '\"') {\n return pos\n }\n if (current === '\\\\') {\n if (peek() === '(') {\n advance() // consum (\n return pos\n }\n // Escape handling\n const esc = advance()\n if (!esc) break\n // ... (standard escapes)\n if ('\"\\\\/bfnrt'.includes(esc)) continue\n if (esc === 'u') {\n for (let i = 0; i < 4; i++) {\n const h = advance()\n if (!h || !isHexDigit(h))\n throw new LexError('Invalid Unicode escape', makeSpan(tokenStart, pos))\n }\n continue\n }\n throw new LexError(`Invalid escape sequence \"\\\\${esc}\"`, makeSpan(tokenStart, pos))\n }\n }\n throw new LexError('Unterminated string literal', makeSpan(tokenStart, pos))\n }\n\n function readStringValue(tokenStart: number, innerStart: number, innerEnd: number): string {\n let result = ''\n let i = innerStart\n while (i < innerEnd) {\n const ch = text[i]\n if (ch === '\\\\') {\n const next = text[i + 1]\n if (!next) throw new LexError('Unexpected end of input', makeSpan(tokenStart, pos))\n\n if ('\"\\\\/bfnrt'.includes(next)) {\n switch (next) {\n case '\"':\n result += '\"'\n break\n case '\\\\':\n result += '\\\\'\n break\n case '/':\n result += '/'\n break\n case 'b':\n result += '\\b'\n break\n case 'f':\n result += '\\f'\n break\n case 'n':\n result += '\\n'\n break\n case 'r':\n result += '\\r'\n break\n case 't':\n result += '\\t'\n break\n }\n i += 2\n continue\n }\n if (next === 'u') {\n const hex = text.slice(i + 2, i + 6)\n result += String.fromCharCode(parseInt(hex, 16))\n i += 6\n continue\n }\n throw new LexError(`Invalid escape sequence \"\\\\${next}\"`, makeSpan(tokenStart, pos))\n } else {\n result += ch\n i += 1\n }\n }\n return result\n }\n}\n\nconst isHexDigit = (ch: string | undefined) =>\n !!ch && ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F'))\n","import { ParseError } from './errors'\nimport { lex } from './lexer'\nimport type { Span } from './span'\nimport type { Token, TokenKind } from './tokens'\nimport type {\n FilterNode,\n LiteralValue,\n ArrayNode,\n ObjectEntry,\n ObjectKey,\n ObjectNode,\n BinaryOp,\n TryNode,\n ReduceNode,\n ForeachNode,\n AssignmentNode,\n} from './ast'\n\n/**\n * Parses a jq source string into an Abstract Syntax Tree (AST).\n *\n * @param source - The input jq query string.\n * @returns The root {@link FilterNode} of the AST.\n * @throws {LexError} If the source contains invalid characters.\n * @throws {ParseError} If the syntax is invalid.\n */\nexport const parse = (source: string): FilterNode => {\n const parser = new Parser(lex(source))\n return parser.parseFilter()\n}\n\nclass Parser {\n private current = 0\n\n constructor(private readonly tokens: Token[]) {}\n\n parseFilter(): FilterNode {\n const expr = this.parseDef()\n this.consume('EOF', 'Expected end of expression')\n return expr\n }\n\n private parseDef(allowComma = true): FilterNode {\n if (this.match('Def')) {\n const startSpan = this.previous().span\n const nameToken = this.consume('Identifier', 'Expected function name')\n const name = String(nameToken.value)\n\n const args: string[] = []\n if (this.match('LParen')) {\n if (!this.check('RParen')) {\n do {\n const argToken = this.consume('Identifier', 'Expected argument name')\n args.push(String(argToken.value))\n } while (this.match('Semicolon'))\n }\n this.consume('RParen', 'Expected \")\" after arguments')\n }\n\n this.consume('Colon', 'Expected \":\" after function signature')\n // Function body always supports comma\n const body = this.parseDef(true)\n\n this.consume('Semicolon', 'Expected \";\" after function body')\n // Next expression inherits restriction?\n // Def block ends with ; so it is safe. Next expression logic:\n // def a: 1; b, c\n // If we are in allowComma=false context (e.g. object), b, c is invalid.\n // So next expression MUST respect allowComma.\n const next = this.parseDef(allowComma)\n\n return {\n kind: 'Def',\n name,\n args,\n body,\n next,\n span: spanBetween(startSpan, next.span),\n }\n }\n return this.parseBinding(allowComma)\n }\n\n private parseBinding(allowComma = true): FilterNode {\n if (this.match('Label')) {\n const start = this.previous()\n const varToken = this.consume('Variable', 'Expected variable name after \"label\"')\n this.consume('Pipe', 'Expected \"|\" after label')\n const body = this.parseBinding(allowComma)\n return {\n kind: 'Label',\n label: String(varToken.value),\n body,\n span: spanBetween(start.span, body.span),\n }\n }\n\n let expr = allowComma ? this.parseComma() : this.parseAssignment()\n while (this.match('As')) {\n const varToken = this.consume('Variable', 'Expected variable name after \"as\"')\n this.consume('Pipe', 'Expected \"|\" after variable binding')\n const body = this.parseBinding(allowComma)\n expr = {\n kind: 'As',\n bind: expr,\n name: String(varToken.value),\n body,\n span: spanBetween(expr.span, body.span),\n }\n }\n return expr\n }\n\n private parseComma(): FilterNode {\n let expr = this.parseAssignment()\n while (this.match('Comma')) {\n const right = this.parseAssignment()\n expr = {\n kind: 'Comma',\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parseAssignment(): FilterNode {\n const expr = this.parsePipe()\n if (\n this.match('Eq') ||\n this.match('BarEq') ||\n this.match('PlusEq') ||\n this.match('MinusEq') ||\n this.match('StarEq') ||\n this.match('SlashEq') ||\n this.match('PercentEq') ||\n this.match('AltEq')\n ) {\n const opToken = this.previous()\n const right = this.parseAssignment() // Right-associative\n let op: AssignmentNode['op']\n switch (opToken.kind) {\n case 'Eq':\n op = '='\n break\n case 'BarEq':\n op = '|='\n break\n case 'PlusEq':\n op = '+='\n break\n case 'MinusEq':\n op = '-='\n break\n case 'StarEq':\n op = '*='\n break\n case 'SlashEq':\n op = '/='\n break\n case 'PercentEq':\n op = '%='\n break\n case 'AltEq':\n op = '//='\n break\n default:\n throw new Error(`Unknown assignment op: ${opToken.kind}`)\n }\n return {\n kind: 'Assignment',\n op,\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parsePipe(): FilterNode {\n let expr = this.parsePipeOperand()\n while (this.match('Pipe')) {\n const right = this.parsePipeOperand()\n expr = {\n kind: 'Pipe',\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parsePipeOperand(): FilterNode {\n return this.parseAlt()\n }\n\n private parseAlt(): FilterNode {\n let expr = this.parseOr()\n while (this.match('Alt')) {\n const right = this.parseOr()\n expr = {\n kind: 'Alt',\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parseOr(): FilterNode {\n let expr = this.parseAnd()\n while (this.match('Or')) {\n const right = this.parseAnd()\n expr = {\n kind: 'Bool',\n op: 'Or',\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parseAnd(): FilterNode {\n let expr = this.parseComparison()\n while (this.match('And')) {\n const right = this.parseComparison()\n expr = {\n kind: 'Bool',\n op: 'And',\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parseComparison(): FilterNode {\n let expr = this.parseAdd()\n while (true) {\n if (this.match('EqualEqual')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Eq')\n } else if (this.match('BangEqual')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Neq')\n } else if (this.match('Less')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Lt')\n } else if (this.match('LessEqual')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Lte')\n } else if (this.match('Greater')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Gt')\n } else if (this.match('GreaterEqual')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Gte')\n } else {\n break\n }\n }\n return expr\n }\n\n private parseAdd(): FilterNode {\n let expr = this.parseMul()\n while (true) {\n if (this.match('Plus')) {\n const right = this.parseMul()\n expr = this.makeBinary(expr, right, '+')\n } else if (this.match('Minus')) {\n const right = this.parseMul()\n expr = this.makeBinary(expr, right, '-')\n } else {\n break\n }\n }\n return expr\n }\n\n private parseMul(): FilterNode {\n let expr = this.parseUnary()\n while (true) {\n if (this.match('Star')) {\n const right = this.parseUnary()\n expr = this.makeBinary(expr, right, '*')\n } else if (this.match('Slash')) {\n const right = this.parseUnary()\n expr = this.makeBinary(expr, right, '/')\n } else if (this.match('Percent')) {\n const right = this.parseUnary()\n expr = this.makeBinary(expr, right, '%')\n } else {\n break\n }\n }\n return expr\n }\n\n private parseUnary(): FilterNode {\n if (this.match('Not')) {\n const op = this.previous()\n const expr = this.parseUnary()\n return {\n kind: 'Unary',\n op: 'Not',\n expr,\n span: spanBetween(op.span, expr.span),\n }\n }\n if (this.match('Minus')) {\n const op = this.previous()\n const expr = this.parseUnary()\n return {\n kind: 'Unary',\n op: 'Neg',\n expr,\n span: spanBetween(op.span, expr.span),\n }\n }\n return this.parsePostfix()\n }\n\n private parsePostfix(): FilterNode {\n let expr = this.parsePrimary()\n while (true) {\n if (this.match('Dot')) {\n expr = this.finishFieldAccess(expr)\n continue\n }\n if (this.match('LBracket')) {\n // Check for [:end]\n if (this.match('Colon')) {\n let end: FilterNode | null = null\n if (!this.check('RBracket')) {\n end = this.parsePipe()\n }\n const close = this.consume('RBracket', 'Expected \"]\" after slice')\n expr = {\n kind: 'Slice',\n target: expr,\n start: null,\n end,\n span: spanBetween(expr.span, close.span),\n }\n continue\n }\n\n if (this.match('RBracket')) {\n const close = this.previous()\n expr = {\n kind: 'Iterate',\n target: expr,\n span: spanBetween(expr.span, close.span),\n }\n continue\n }\n\n const index = this.parsePipe()\n\n if (this.match('Colon')) {\n let end: FilterNode | null = null\n if (!this.check('RBracket')) {\n end = this.parsePipe()\n }\n const close = this.consume('RBracket', 'Expected \"]\" after slice')\n expr = {\n kind: 'Slice',\n target: expr,\n start: index,\n end,\n span: spanBetween(expr.span, close.span),\n }\n continue\n }\n\n const closing = this.consume('RBracket', 'Expected \"]\" after index expression')\n expr = {\n kind: 'IndexAccess',\n target: expr,\n index,\n span: spanBetween(expr.span, closing.span),\n }\n continue\n }\n if (this.match('Question')) {\n const op = this.previous()\n expr = {\n kind: 'Try',\n body: expr,\n handler: { kind: 'Identity', span: op.span } as FilterNode,\n span: spanBetween(expr.span, op.span),\n }\n continue\n }\n break\n }\n return expr\n }\n\n private parsePrimary(): FilterNode {\n if (this.match('Dot')) {\n return this.parseLeadingDot(this.previous())\n }\n if (this.match('Null')) return this.literalNode(null, this.previous().span)\n if (this.match('True')) return this.literalNode(true, this.previous().span)\n if (this.match('False')) return this.literalNode(false, this.previous().span)\n if (this.match('Number')) {\n return this.literalNode(Number(this.previous().value), this.previous().span)\n }\n if (this.match('String')) {\n return this.literalNode(String(this.previous().value), this.previous().span)\n }\n if (this.match('StringStart')) {\n return this.parseStringInterpolation(this.previous())\n }\n if (this.match('Variable')) {\n const token = this.previous()\n return {\n kind: 'Var',\n name: String(token.value),\n span: token.span,\n }\n }\n if (this.match('Identifier')) {\n return this.finishIdentifier(this.previous())\n }\n if (this.match('If')) {\n return this.parseIf(this.previous())\n }\n if (this.match('LParen')) {\n const start = this.previous()\n const expr = this.parseDef()\n const close = this.consume('RParen', 'Expected \")\" after expression')\n expr.span = spanBetween(start.span, close.span)\n return expr\n }\n if (this.match('LBracket')) {\n return this.parseArray(this.previous())\n }\n if (this.match('LBrace')) {\n return this.parseObject(this.previous())\n }\n if (this.match('Reduce')) return this.parseReduce(this.previous())\n if (this.match('Foreach')) return this.parseForeach(this.previous())\n if (this.match('Try')) return this.parseTry(this.previous())\n if (this.match('DotDot')) return { kind: 'Recurse', span: this.previous().span }\n if (this.match('DotDot')) return { kind: 'Recurse', span: this.previous().span }\n if (this.match('Break')) return this.parseBreak(this.previous())\n throw this.error(this.peek(), 'Unexpected token')\n }\n\n // Moved ParseLabel to ParseBinding level\n\n private parseBreak(start: Token): FilterNode {\n const varToken = this.consume('Variable', 'Expected variable after \"break\"')\n return {\n kind: 'Break',\n label: String(varToken.value),\n span: spanBetween(start.span, varToken.span),\n }\n }\n\n private parseReduce(start: Token): ReduceNode {\n const source = this.parsePipe()\n this.consume('As', 'Expected \"as\" after reduce source')\n const varToken = this.consume('Variable', 'Expected variable after \"as\"')\n this.consume('LParen', 'Expected \"(\" after variable')\n const init = this.parseComma()\n this.consume('Semicolon', 'Expected \";\" after init')\n const update = this.parseComma()\n const end = this.consume('RParen', 'Expected \")\" after update')\n return {\n kind: 'Reduce',\n source,\n var: String(varToken.value),\n init,\n update,\n span: spanBetween(start.span, end.span),\n }\n }\n\n private parseForeach(start: Token): ForeachNode {\n const source = this.parsePipe()\n this.consume('As', 'Expected \"as\" after foreach source')\n const varToken = this.consume('Variable', 'Expected variable after \"as\"')\n this.consume('LParen', 'Expected \"(\" after variable')\n const init = this.parseComma()\n this.consume('Semicolon', 'Expected \";\" after init')\n const update = this.parseComma()\n let extract: FilterNode | undefined\n if (this.match('Semicolon')) {\n extract = this.parseComma()\n }\n const end = this.consume('RParen', 'Expected \")\" after foreach body')\n return {\n kind: 'Foreach',\n source,\n var: String(varToken.value),\n init,\n update,\n extract,\n span: spanBetween(start.span, end.span),\n }\n }\n\n private parseTry(start: Token): TryNode {\n const body = this.parseDef(true)\n let handler: FilterNode | undefined\n let endSpan = body.span\n if (this.match('Catch')) {\n handler = this.parseDef(true)\n endSpan = handler.span\n }\n return {\n kind: 'Try',\n body,\n handler,\n span: spanBetween(start.span, endSpan),\n }\n }\n\n private parseIf(start: Token): FilterNode {\n const branches: { cond: FilterNode; then: FilterNode }[] = []\n const firstCond = this.parseDef(true)\n this.consume('Then', 'Expected \"then\" after condition')\n const firstThen = this.parseDef(true)\n branches.push({ cond: firstCond, then: firstThen })\n\n while (this.match('Elif')) {\n const cond = this.parseDef(true)\n this.consume('Then', 'Expected \"then\" after elif condition')\n const thenBranch = this.parseDef(true)\n branches.push({ cond, then: thenBranch })\n }\n\n this.consume('Else', 'Expected \"else\" in if expression')\n const elseBranch = this.parseDef(true)\n const endToken = this.consume('End', 'Expected \"end\" to close if expression')\n return {\n kind: 'If',\n branches,\n else: elseBranch,\n span: spanBetween(start.span, endToken.span),\n }\n }\n\n private parseArray(start: Token): ArrayNode {\n const items: FilterNode[] = []\n if (!this.match('RBracket')) {\n do {\n items.push(this.parseDef(false))\n } while (this.match('Comma'))\n this.consume('RBracket', 'Expected \"]\" after array elements')\n }\n return {\n kind: 'Array',\n items,\n span: spanBetween(start.span, this.previous().span),\n }\n }\n\n private parseObject(start: Token): ObjectNode {\n const entries: ObjectEntry[] = []\n if (!this.match('RBrace')) {\n do {\n const key = this.parseObjectKey()\n this.consume('Colon', 'Expected \":\" after object key')\n const value = this.parseDef(false)\n entries.push({ key, value })\n } while (this.match('Comma'))\n this.consume('RBrace', 'Expected \"}\" after object entries')\n }\n return {\n kind: 'Object',\n entries,\n span: spanBetween(start.span, this.previous().span),\n }\n }\n\n private parseObjectEntry(): ObjectEntry {\n const key = this.parseObjectKey()\n this.consume('Colon', 'Expected \":\" after object key')\n const value = this.parseDef(false)\n return { key, value }\n }\n\n private parseObjectKey(): ObjectKey {\n if (this.match('Identifier')) {\n const token = this.previous()\n return {\n kind: 'KeyIdentifier',\n name: String(token.value),\n span: token.span,\n }\n }\n if (this.match('String')) {\n const token = this.previous()\n return {\n kind: 'KeyString',\n value: String(token.value),\n span: token.span,\n }\n }\n if (this.match('LParen')) {\n const start = this.previous()\n const expr = this.parseComma()\n const closing = this.consume('RParen', 'Expected \")\" after computed key expression')\n return {\n kind: 'KeyExpr',\n expr,\n span: spanBetween(start.span, closing.span),\n }\n }\n throw this.error(this.peek(), 'Expected identifier, string, or \"(expr)\" as object key')\n }\n\n private finishFieldAccess(target: FilterNode): FilterNode {\n if (this.match('Identifier')) {\n const token = this.previous()\n return {\n kind: 'FieldAccess',\n target,\n field: String(token.value),\n span: spanBetween(target.span, token.span),\n }\n }\n if (this.match('String')) {\n const token = this.previous()\n return {\n kind: 'FieldAccess',\n target,\n field: String(token.value),\n span: spanBetween(target.span, token.span),\n }\n }\n throw this.error(this.peek(), 'Expected field name after \".\"')\n }\n\n private parseLeadingDot(dot: Token): FilterNode {\n let expr: FilterNode = { kind: 'Identity', span: dot.span }\n while (true) {\n if (this.check('Identifier') || this.check('String')) {\n expr = this.finishFieldAccess(expr)\n continue\n }\n if (this.match('LBracket')) {\n // Check for [:end]\n if (this.match('Colon')) {\n let end: FilterNode | null = null\n if (!this.check('RBracket')) {\n end = this.parsePipe()\n }\n const close = this.consume('RBracket', 'Expected \"]\" after slice')\n expr = {\n kind: 'Slice',\n target: expr,\n start: null,\n end,\n span: spanBetween(expr.span, close.span),\n }\n continue\n }\n\n if (this.match('RBracket')) {\n const close = this.previous()\n expr = {\n kind: 'Iterate',\n target: expr,\n span: spanBetween(expr.span, close.span),\n }\n continue\n }\n\n const index = this.parsePipe()\n\n if (this.match('Colon')) {\n let end: FilterNode | null = null\n if (!this.check('RBracket')) {\n end = this.parsePipe()\n }\n const close = this.consume('RBracket', 'Expected \"]\" after slice')\n expr = {\n kind: 'Slice',\n target: expr,\n start: index,\n end,\n span: spanBetween(expr.span, close.span),\n }\n continue\n }\n\n const closing = this.consume('RBracket', 'Expected \"]\" after index expression')\n expr = {\n kind: 'IndexAccess',\n target: expr,\n index,\n span: spanBetween(expr.span, closing.span),\n }\n continue\n }\n if (this.match('Question')) {\n const op = this.previous()\n expr = {\n kind: 'Try',\n body: expr,\n handler: { kind: 'Identity', span: op.span } as FilterNode,\n span: spanBetween(expr.span, op.span),\n }\n continue\n }\n break\n }\n return expr\n }\n\n private finishIdentifier(token: Token): FilterNode {\n if (this.match('LParen')) {\n const args = this.parseCallArguments()\n const closing = this.consume('RParen', 'Expected \")\" after arguments')\n return {\n kind: 'Call',\n name: String(token.value),\n args,\n span: spanBetween(token.span, closing.span),\n }\n }\n return {\n kind: 'Call',\n name: String(token.value),\n args: [],\n span: token.span,\n }\n }\n\n private parseCallArguments(): FilterNode[] {\n const args: FilterNode[] = []\n if (this.check('RParen')) {\n return args\n }\n do {\n args.push(this.parseDef(true))\n } while (this.match('Semicolon'))\n return args\n }\n\n private literalNode(value: LiteralValue, span: Span): FilterNode {\n return { kind: 'Literal', value, span }\n }\n\n private makeBinary(left: FilterNode, right: FilterNode, op: BinaryOp): FilterNode {\n return {\n kind: 'Binary',\n op,\n left,\n right,\n span: spanBetween(left.span, right.span),\n }\n }\n\n private parseStringInterpolation(start: Token): FilterNode {\n const parts: FilterNode[] = [{ kind: 'Literal', value: String(start.value), span: start.span }]\n\n while (true) {\n // Parse expression\n const expr = this.parseDef()\n parts.push({\n kind: 'Pipe',\n left: expr,\n right: {\n kind: 'Call',\n name: 'tostring',\n args: [],\n span: expr.span,\n },\n span: expr.span,\n })\n\n if (this.match('StringMiddle')) {\n const token = this.previous()\n parts.push({ kind: 'Literal', value: String(token.value), span: token.span })\n continue\n }\n if (this.match('StringEnd')) {\n const token = this.previous()\n parts.push({ kind: 'Literal', value: String(token.value), span: token.span })\n break\n }\n throw this.error(this.peek(), 'Expected closing paren of interpolation or continuation')\n }\n\n return parts.reduce((acc, curr) => ({\n kind: 'Binary',\n op: '+', // Use + operator which handles concatenation\n left: acc,\n right: curr,\n span: spanBetween(acc.span, curr.span),\n }))\n }\n\n private match(kind: TokenKind): boolean {\n if (this.check(kind)) {\n this.advance()\n return true\n }\n return false\n }\n\n private consume(kind: TokenKind, message: string): Token {\n if (this.check(kind)) return this.advance()\n throw this.error(this.peek(), message)\n }\n\n private check(kind: TokenKind): boolean {\n if (this.isAtEnd()) return kind === 'EOF'\n return this.peek().kind === kind\n }\n\n private advance(): Token {\n if (!this.isAtEnd()) this.current += 1\n return this.previous()\n }\n\n private isAtEnd(): boolean {\n return this.peek().kind === 'EOF'\n }\n\n private peek(): Token {\n return this.tokens[this.current] ?? { kind: 'EOF', span: { start: 0, end: 0 } }\n }\n\n private previous(): Token {\n return this.tokens[this.current - 1] ?? { kind: 'EOF', span: { start: 0, end: 0 } }\n }\n\n private error(token: Token, message: string): ParseError {\n return new ParseError(message, token.span)\n }\n}\n\nconst spanBetween = (a: Span, b: Span): Span => ({\n start: Math.min(a.start, b.start),\n end: Math.max(a.end, b.end),\n})\n","import type { BuiltinSpec } from './types'\n\nexport const builtins: Record<string, BuiltinSpec[]> = {}\n\nexport const registerBuiltin = (spec: BuiltinSpec) => {\n if (!builtins[spec.name]) {\n builtins[spec.name] = []\n }\n builtins[spec.name]!.push(spec)\n}\n\nexport const registerBuiltins = (specs: BuiltinSpec[]) => {\n for (const spec of specs) {\n registerBuiltin(spec)\n }\n}\n","/**\n * Represents any valid JSON value supported by the jq-ts runtime.\n * This is a recursive type definition that matches the structure of JSON data.\n */\n// Use interface to break circular reference for Value type\nexport type Value = null | boolean | number | string | ValueArray | ValueObject\n\n/**\n * Represents a JSON array containing {@link Value} items.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface ValueArray extends Array<Value> {}\n\n/**\n * Represents a JSON object with string keys and {@link Value} values.\n */\nexport interface ValueObject {\n [key: string]: Value\n}\n\n/**\n * Checks if a value is considered \"truthy\" in jq logic.\n * In jq, only `false` and `null` are falsey; everything else (including 0 and empty strings) is truthy.\n *\n * @param value - The value to check.\n * @returns `true` if truthy, `false` otherwise.\n */\nexport const isTruthy = (value: Value): boolean => !(value === false || value === null)\n\n/**\n * deeply compares two JSON values for equality.\n *\n * @param a - The first value.\n * @param b - The second value.\n * @returns `true` if the values are structurally equal, `false` otherwise.\n */\nexport const valueEquals = (a: Value, b: Value): boolean => {\n if (a === b) {\n // Handles primitives not involving NaN.\n return true\n }\n if (typeof a !== typeof b) {\n return false\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return Object.is(a, b)\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i += 1) {\n if (!valueEquals(a[i]!, b[i]!)) return false\n }\n return true\n }\n if (isPlainObject(a) && isPlainObject(b)) {\n const aKeys = Object.keys(a).sort()\n const bKeys = Object.keys(b).sort()\n if (aKeys.length !== bKeys.length) return false\n for (let i = 0; i < aKeys.length; i += 1) {\n const key = aKeys[i]!\n if (key !== bKeys[i]) return false\n // Type safe access via key existence check implicit in loop\n if (!valueEquals(a[key]!, b[key]!)) return false\n }\n return true\n }\n return false\n}\n\n/**\n * Compares two JSON values according to standard jq ordering rules.\n *\n * The sort order is: null < false < true < numbers < strings < arrays < objects.\n * Arrays and objects are compared recursively.\n *\n * @param a - The first value.\n * @param b - The second value.\n * @returns `-1` if `a < b`, `0` if `a == b`, and `1` if `a > b`.\n */\nexport const compareValues = (a: Value, b: Value): -1 | 0 | 1 => {\n if (valueEquals(a, b)) return 0\n const rankDiff = typeRank(a) - typeRank(b)\n if (rankDiff !== 0) return rankDiff < 0 ? -1 : 1\n\n if (typeof a === 'number' && typeof b === 'number') {\n return a < b ? -1 : 1\n }\n if (typeof a === 'string' && typeof b === 'string') {\n return a < b ? -1 : 1\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n const len = Math.min(a.length, b.length)\n for (let i = 0; i < len; i += 1) {\n const cmp = compareValues(a[i]!, b[i]!)\n if (cmp !== 0) return cmp\n }\n return a.length < b.length ? -1 : 1\n }\n if (isPlainObject(a) && isPlainObject(b)) {\n const aKeys = Object.keys(a).sort()\n const bKeys = Object.keys(b).sort()\n const len = Math.min(aKeys.length, bKeys.length)\n for (let i = 0; i < len; i += 1) {\n const key = aKeys[i]!\n const keyCmp = compareStrings(key, bKeys[i]!)\n if (keyCmp !== 0) return keyCmp\n const valueCmp = compareValues(a[key]!, b[key]!)\n if (valueCmp !== 0) return valueCmp\n }\n return aKeys.length < bKeys.length ? -1 : 1\n }\n\n // Remaining ranks are booleans and null which have already been handled by rank diff.\n return 0\n}\n\nconst compareStrings = (a: string, b: string): -1 | 0 | 1 => {\n if (a === b) return 0\n return a < b ? -1 : 1\n}\n\nconst typeRank = (value: Value): number => {\n if (value === null) return 0\n if (value === false) return 1\n if (value === true) return 2\n if (typeof value === 'number') return 3\n if (typeof value === 'string') return 4\n if (Array.isArray(value)) return 5\n return 6 // object\n}\n\n/**\n * Checks if a value is a plain JSON object (and not null or an array).\n *\n * @param value - The value to check.\n * @returns `true` if `value` is a non-null object (and not an array).\n */\nexport const isPlainObject = (value: Value): value is ValueObject =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\n/**\n * Checks if a value is a JSON array.\n *\n * @param value - The value to check.\n * @returns `true` if `value` is an array.\n */\nexport const isValueArray = (value: Value): value is ValueArray => Array.isArray(value)\n\n/**\n * Returns the type name of a value as a string (e.g., \"null\", \"boolean\", \"number\", \"string\", \"array\", \"object\").\n * This corresponds to the output of the `type` builtin.\n *\n * @param value - The value to inspect.\n * @returns The lower-case type name.\n */\nexport const describeType = (value: Value): string => {\n if (value === null) return 'null'\n if (typeof value === 'boolean') return 'boolean'\n if (typeof value === 'number') return 'number'\n if (typeof value === 'string') return 'string'\n if (Array.isArray(value)) return 'array'\n return 'object'\n}\n","import type { Span } from '../span'\nimport type { LimitTracker } from '../limits'\nimport { type Value, type ValueObject } from '../value'\n\nexport const emit = (value: Value, span: Span, tracker: LimitTracker): Value => {\n tracker.emit(span)\n return value\n}\n\nexport const ensureIndex = (val: Value): number | undefined => {\n if (typeof val === 'number' && Number.isInteger(val)) return val\n if (typeof val === 'string' && /^-?\\d+$/.test(val)) return parseInt(val, 10)\n return undefined\n}\n\nexport const stableStringify = (value: Value): string => {\n if (value === null) return 'null'\n if (typeof value === 'boolean') return value ? 'true' : 'false'\n if (typeof value === 'number') return value.toString()\n if (typeof value === 'string') return JSON.stringify(value)\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(',')}]`\n }\n // Object: sort keys\n const keys = Object.keys(value).sort()\n const entries = keys.map(\n (k) =>\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n `${JSON.stringify(k)}:${stableStringify((value as ValueObject)[k]!)}`\n )\n return `{${entries.join(',')}}`\n}\n","import { RuntimeError } from '../errors'\nimport { describeType, isPlainObject, isTruthy, type Value, type ValueObject } from '../value'\nimport type { BuiltinSpec } from './types'\nimport { emit, stableStringify } from './utils'\n\nexport const stdBuiltins: BuiltinSpec[] = [\n {\n name: 'type',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n yield emit(describeType(input), span, tracker)\n },\n },\n {\n name: 'tostring',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n yield emit(stableStringify(input), span, tracker)\n },\n },\n {\n name: 'tonumber',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input === 'number') {\n yield emit(input, span, tracker)\n return\n }\n if (typeof input === 'string') {\n const num = Number(input)\n if (!Number.isFinite(num)) {\n throw new RuntimeError(`Cannot convert string \"${input}\" to number`, span)\n }\n yield emit(num, span, tracker)\n return\n }\n throw new RuntimeError(`Cannot convert ${describeType(input)} to number`, span)\n },\n },\n {\n name: 'length',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input === 'string') {\n // Use Array.from to count codepoints correctly\n yield emit(Array.from(input).length, span, tracker)\n } else if (Array.isArray(input)) {\n yield emit(input.length, span, tracker)\n } else if (input !== null && typeof input === 'object') {\n // Safe because isPlainObject check implies it's not null/array, but here we can just use Object.keys\n yield emit(Object.keys(input).length, span, tracker)\n } else {\n throw new RuntimeError(`Cannot take length of ${describeType(input)}`, span)\n }\n },\n },\n {\n name: 'empty',\n arity: 0,\n apply: function* () {\n // Do nothing, yield nothing\n },\n },\n {\n name: 'toboolean',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n yield emit(isTruthy(input), span, tracker)\n },\n },\n {\n name: 'walk',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const f = args[0]!\n const walkRec = function* (curr: Value): Generator<Value> {\n tracker.step(span)\n let newStruct: Value = curr\n\n if (Array.isArray(curr)) {\n const newArr: Value[] = []\n for (const item of curr) {\n for (const walkedItem of walkRec(item)) {\n newArr.push(walkedItem)\n }\n }\n newStruct = newArr\n } else if (isPlainObject(curr)) {\n const newObj: ValueObject = {}\n const keys = Object.keys(curr).sort()\n let objValid = true\n for (const key of keys) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n const val = (curr as ValueObject)[key]!\n let lastVal: Value | undefined\n let found = false\n for (const walkedVal of walkRec(val)) {\n lastVal = walkedVal\n found = true\n }\n if (found) {\n newObj[key] = lastVal!\n } else {\n // If any value is empty, the reduce (and thus the object) becomes empty\n objValid = false\n break\n }\n }\n if (!objValid) return // Yield nothing\n newStruct = newObj\n }\n\n yield* evaluate(f, newStruct, env, tracker)\n }\n yield* walkRec(input)\n },\n },\n]\n","import { RuntimeError } from '../errors'\nimport type { BuiltinSpec } from './types'\nimport { stableStringify } from './utils'\n\nexport const errorBuiltins: BuiltinSpec[] = [\n {\n name: 'error',\n arity: 1,\n // eslint-disable-next-line require-yield\n apply: function* (input, args, env, tracker, evaluate, span) {\n for (const msg of evaluate(args[0]!, input, env, tracker)) {\n throw new RuntimeError(typeof msg === 'string' ? msg : stableStringify(msg), span)\n }\n },\n },\n]\n","import { RuntimeError } from '../errors'\nimport { describeType, isPlainObject, valueEquals, type Value } from '../value'\nimport type { BuiltinSpec } from './types'\nimport { emit } from './utils'\n\nexport const checkContains = (a: Value, b: Value): boolean => {\n if (a === b) return true\n if (typeof a !== typeof b) return false\n if (typeof a === 'string' && typeof b === 'string') {\n return a.includes(b)\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n return b.every((bItem) => a.some((aItem) => checkContains(aItem, bItem)))\n }\n if (isPlainObject(a) && isPlainObject(b)) {\n const keys = Object.keys(b)\n for (const key of keys) {\n if (!Object.prototype.hasOwnProperty.call(a, key)) return false\n const valA = a[key]!\n const valB = b[key]!\n if (!checkContains(valA, valB)) return false\n }\n return true\n }\n return valueEquals(a, b)\n}\n\nexport const stringBuiltins: BuiltinSpec[] = [\n {\n name: 'split',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (typeof input !== 'string') throw new RuntimeError('split input must be a string', span)\n const sepGen = evaluate(args[0]!, input, env, tracker)\n for (const sep of sepGen) {\n if (typeof sep !== 'string')\n throw new RuntimeError('split separator must be a string', span)\n yield emit(input.split(sep), span, tracker)\n }\n },\n },\n {\n name: 'join',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('join input must be an array', span)\n const sepGen = evaluate(args[0]!, input, env, tracker)\n for (const sep of sepGen) {\n if (typeof sep !== 'string') throw new RuntimeError('join separator must be a string', span)\n const parts: string[] = []\n for (const item of input) {\n if (typeof item !== 'string') {\n throw new RuntimeError(`join expects strings, but got ${describeType(item)}`, span)\n }\n parts.push(item)\n }\n yield emit(parts.join(sep), span, tracker)\n }\n },\n },\n {\n name: 'startswith',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (typeof input !== 'string')\n throw new RuntimeError('startswith input must be a string', span)\n const prefixGen = evaluate(args[0]!, input, env, tracker)\n for (const prefix of prefixGen) {\n if (typeof prefix !== 'string')\n throw new RuntimeError('startswith prefix must be a string', span)\n yield emit(input.startsWith(prefix), span, tracker)\n }\n },\n },\n {\n name: 'endswith',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (typeof input !== 'string') throw new RuntimeError('endswith input must be a string', span)\n const suffixGen = evaluate(args[0]!, input, env, tracker)\n for (const suffix of suffixGen) {\n if (typeof suffix !== 'string')\n throw new RuntimeError('endswith suffix must be a string', span)\n yield emit(input.endsWith(suffix), span, tracker)\n }\n },\n },\n {\n name: 'contains',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const bGen = evaluate(args[0]!, input, env, tracker)\n for (const b of bGen) {\n yield emit(checkContains(input, b), span, tracker)\n }\n },\n },\n {\n name: 'index',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const searchGen = evaluate(args[0]!, input, env, tracker)\n for (const search of searchGen) {\n if (Array.isArray(input)) {\n // jq index on array: returns index of first occurrence of search value\n let foundIndex: number | null = null\n for (let i = 0; i < input.length; i++) {\n const val = input[i]\n if (val !== undefined && valueEquals(val, search)) {\n foundIndex = i\n break\n }\n }\n yield emit(foundIndex, span, tracker) // jq returns null if not found\n } else if (typeof input === 'string') {\n if (typeof search !== 'string')\n throw new RuntimeError('index expects string search when input is string', span)\n const idx = input.indexOf(search)\n yield emit(idx === -1 ? null : idx, span, tracker)\n } else {\n // jq index on null? null.\n if (input === null) yield emit(null, span, tracker)\n else throw new RuntimeError('index expects string or array', span)\n }\n }\n },\n },\n {\n name: 'rindex',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // rindex only defined for strings in jq documentation? \"index, rindex, indices\" -> \"match input against...\"\n // jq `[1,2,1] | rindex(1)` -> 2.\n const searchGen = evaluate(args[0]!, input, env, tracker)\n for (const search of searchGen) {\n if (Array.isArray(input)) {\n let foundIndex: number | null = null\n for (let i = input.length - 1; i >= 0; i--) {\n const val = input[i]\n if (val !== undefined && valueEquals(val, search)) {\n foundIndex = i\n break\n }\n }\n yield emit(foundIndex, span, tracker)\n } else if (typeof input === 'string') {\n if (typeof search !== 'string')\n throw new RuntimeError('rindex expects string search when input is string', span)\n const idx = input.lastIndexOf(search)\n yield emit(idx === -1 ? null : idx, span, tracker)\n } else {\n if (input === null) yield emit(null, span, tracker)\n else throw new RuntimeError('rindex expects string or array', span)\n }\n }\n },\n },\n {\n name: 'indices',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const searchGen = evaluate(args[0]!, input, env, tracker)\n for (const search of searchGen) {\n const indices: number[] = []\n if (Array.isArray(input)) {\n for (let i = 0; i < input.length; i++) {\n const val = input[i]\n if (val !== undefined && valueEquals(val, search)) indices.push(i)\n }\n } else if (typeof input === 'string') {\n if (typeof search !== 'string') throw new RuntimeError('indices expects string', span)\n // Overlapping? jq `indices` documentation says \"array of indices\".\n // jq `\"aba\" | indices(\"a\")` -> `[0, 2]`.\n // jq `\"aba\" | indices(\"ba\")` -> `[1]`.\n // Use indexOf loop\n if (search.length === 0) {\n // Special case: empty string?\n } else {\n let pos = 0\n while (pos < input.length) {\n const idx = input.indexOf(search, pos)\n if (idx === -1) break\n indices.push(idx)\n pos = idx + 1 // allow overlapping? jq \"aba\" \"aba\" -> ?\n // jq: `\"abab\" | indices(\"aba\")` -> `[0]`. (No overlap)\n // So advance by length?\n // Wait, jq manual might specify overlap.\n // Usually `indices` does NOT overlap.\n // Just `pos = idx + 1` finds all starts?\n // If I have \"aaaa\" and search \"aa\". `indexOf` at 0 -> 0. `indexOf` at 1 -> 1.\n // Does jq return `[0, 1, 2]`?\n // Checked jq: `\"aaaa\" | indices(\"aa\")` -> `[0, 2]`. (Non-overlapping!)\n // So `pos = idx + search.length`.\n pos = idx + search.length\n }\n }\n } else {\n if (input === null) {\n yield emit(null, span, tracker)\n continue\n }\n throw new RuntimeError('indices expects string or array', span)\n }\n yield emit(indices, span, tracker)\n }\n },\n },\n {\n name: 'explode',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input !== 'string') throw new RuntimeError('explode expects string', span)\n // JS strings are UTF-16. `explode` expects codepoints.\n // Array.from(str) splits by code point (surrogate pairs handled).\n // Then map to codePointAt(0).\n const codes = Array.from(input).map((c) => c.codePointAt(0)!)\n yield emit(codes, span, tracker)\n },\n },\n {\n name: 'implode',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('implode expects array', span)\n const chars: string[] = []\n for (const item of input) {\n if (typeof item !== 'number') throw new RuntimeError('implode item must be number', span)\n chars.push(String.fromCodePoint(item))\n }\n yield emit(chars.join(''), span, tracker)\n },\n },\n {\n name: 'ltrimstr',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (typeof input !== 'string') throw new RuntimeError('ltrimstr expects string', span)\n const prefixGen = evaluate(args[0]!, input, env, tracker)\n for (const prefix of prefixGen) {\n if (typeof prefix !== 'string')\n throw new RuntimeError('ltrimstr prefix must be a string', span)\n if (input.startsWith(prefix)) {\n yield emit(input.slice(prefix.length), span, tracker)\n } else {\n yield emit(input, span, tracker)\n }\n }\n },\n },\n {\n name: 'rtrimstr',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (typeof input !== 'string') throw new RuntimeError('rtrimstr expects string', span)\n const suffixGen = evaluate(args[0]!, input, env, tracker)\n for (const suffix of suffixGen) {\n if (typeof suffix !== 'string')\n throw new RuntimeError('rtrimstr suffix must be a string', span)\n if (input.endsWith(suffix)) {\n yield emit(input.slice(0, input.length - suffix.length), span, tracker)\n } else {\n yield emit(input, span, tracker)\n }\n }\n },\n },\n {\n name: 'ascii_downcase',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input !== 'string') throw new RuntimeError('ascii_downcase expects string', span)\n yield emit(input.toLowerCase(), span, tracker)\n },\n },\n {\n name: 'ascii_upcase',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input !== 'string') throw new RuntimeError('ascii_upcase expects string', span)\n yield emit(input.toUpperCase(), span, tracker)\n },\n },\n]\n","import { RuntimeError } from '../errors'\nimport { compareValues, isTruthy, valueEquals, type Value, type ValueObject } from '../value'\nimport { checkContains } from './strings'\nimport type { BuiltinSpec } from './types'\nimport { emit, ensureIndex } from './utils'\n\n// Helper for stable sort\nfunction sortStable<T>(arr: T[], compare: (a: T, b: T) => number): T[] {\n return arr\n .map((item, index) => ({ item, index }))\n .sort((a, b) => {\n const cmp = compare(a.item, b.item)\n return cmp !== 0 ? cmp : a.index - b.index\n })\n .map((p) => p.item)\n}\n\nexport const collectionBuiltins: BuiltinSpec[] = [\n {\n name: 'keys',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (Array.isArray(input)) {\n const indices = Array.from({ length: input.length }, (_, i) => i)\n yield emit(indices, span, tracker)\n } else if (input !== null && typeof input === 'object') {\n const sortedKeys = Object.keys(input).sort()\n yield emit(sortedKeys, span, tracker)\n } else {\n throw new RuntimeError(`keys expects an array or object`, span)\n }\n },\n },\n {\n name: 'has',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const keyFilter = args[0]!\n for (const key of evaluate(keyFilter, input, env, tracker)) {\n if (Array.isArray(input)) {\n const idx = ensureIndex(key)\n yield emit(idx !== undefined && idx >= 0 && idx < input.length, span, tracker)\n } else if (input !== null && typeof input === 'object') {\n let keyStr: string\n if (typeof key === 'string') keyStr = key\n else if (typeof key === 'number') keyStr = key.toString()\n else {\n throw new RuntimeError(`has() key must be string or number for object input`, span)\n }\n yield emit(Object.prototype.hasOwnProperty.call(input, keyStr), span, tracker)\n } else {\n throw new RuntimeError(`has() expects an array or object input`, span)\n }\n }\n },\n },\n {\n name: 'map',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('map expects an array', span)\n const result: Value[] = []\n const filter = args[0]!\n for (const item of input) {\n tracker.step(span)\n for (const output of evaluate(filter, item, env, tracker)) {\n result.push(output)\n }\n }\n yield emit(result, span, tracker)\n },\n },\n {\n name: 'select',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const filter = args[0]!\n for (const res of evaluate(filter, input, env, tracker)) {\n if (isTruthy(res)) {\n yield emit(input, span, tracker)\n return\n }\n }\n },\n },\n {\n name: 'sort',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('sort expects an array', span)\n const sorted = sortStable(input, (a, b) => compareValues(a, b))\n tracker.step(span) // Accounting for the sort op itself\n yield emit(sorted, span, tracker)\n },\n },\n {\n name: 'sort_by',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('sort_by expects an array', span)\n const filter = args[0]!\n // Compute keys\n const pairs: { val: Value; key: Value }[] = []\n for (const item of input) {\n tracker.step(span)\n const keys = Array.from(evaluate(filter, item, env, tracker))\n if (keys.length !== 1)\n throw new RuntimeError('sort_by key expression must return exactly one value', span)\n pairs.push({ val: item, key: keys[0]! })\n }\n const sorted = sortStable(pairs, (a, b) => compareValues(a.key, b.key))\n yield emit(\n sorted.map((p) => p.val),\n span,\n tracker\n )\n },\n },\n {\n name: 'unique',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('unique expects an array', span)\n const seen: Value[] = []\n const result: Value[] = []\n for (const item of input) {\n tracker.step(span) // step per item\n if (!seen.some((s) => valueEquals(s, item))) {\n seen.push(item)\n result.push(item)\n }\n }\n yield emit(result, span, tracker)\n },\n },\n {\n name: 'unique_by',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('unique_by expects an array', span)\n const filter = args[0]!\n const seenKeys: Value[] = []\n const result: Value[] = []\n for (const item of input) {\n tracker.step(span)\n const keys = Array.from(evaluate(filter, item, env, tracker))\n if (keys.length !== 1)\n throw new RuntimeError('unique_by key expression must return exactly one value', span)\n const key = keys[0]!\n if (!seenKeys.some((s) => valueEquals(s, key))) {\n seenKeys.push(key)\n result.push(item)\n }\n }\n yield emit(result, span, tracker)\n },\n },\n {\n name: 'to_entries',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (Array.isArray(input)) {\n const result = input.map((v, i) => ({ key: i, value: v }))\n yield emit(result, span, tracker)\n } else if (input !== null && typeof input === 'object') {\n const keys = Object.keys(input).sort()\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n const result = keys.map((k) => ({ key: k, value: (input as ValueObject)[k]! }))\n yield emit(result, span, tracker)\n } else {\n throw new RuntimeError('to_entries expects array or object', span)\n }\n },\n },\n {\n name: 'from_entries',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('from_entries expects an array', span)\n const result: ValueObject = {}\n for (const item of input) {\n tracker.step(span)\n if (item === null || typeof item !== 'object' || Array.isArray(item)) {\n throw new RuntimeError('from_entries expects array of objects', span)\n }\n const obj = item\n if (!('key' in obj) || !('value' in obj)) {\n throw new RuntimeError('from_entries items must have \"key\" and \"value\"', span)\n }\n const key = obj['key']\n if (typeof key !== 'string') {\n throw new RuntimeError('from_entries object keys must be strings', span)\n }\n result[key] = obj['value']!\n }\n yield emit(result, span, tracker)\n },\n },\n {\n name: 'with_entries',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // to_entries\n let entries: Value[]\n if (Array.isArray(input)) {\n entries = input.map((v, i) => ({ key: i, value: v }))\n } else if (input !== null && typeof input === 'object') {\n const keys = Object.keys(input).sort()\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n entries = keys.map((k) => ({ key: k, value: (input as ValueObject)[k]! }))\n } else {\n throw new RuntimeError('with_entries expects array or object', span)\n }\n\n // map(f)\n const transformed: Value[] = []\n const filter = args[0]!\n for (const entry of entries) {\n tracker.step(span)\n for (const outVar of evaluate(filter, entry, env, tracker)) {\n transformed.push(outVar)\n }\n }\n\n // from_entries\n const result: ValueObject = {}\n for (const item of transformed) {\n if (item === null || typeof item !== 'object' || Array.isArray(item)) {\n throw new RuntimeError('with_entries filter must produce objects', span)\n }\n const obj = item\n if (!('key' in obj) || !('value' in obj)) {\n throw new RuntimeError('with_entries items must have \"key\" and \"value\"', span)\n }\n const key = obj['key']\n if (typeof key !== 'string') {\n throw new RuntimeError('with_entries keys must be strings', span)\n }\n result[key] = obj['value']!\n }\n yield emit(result, span, tracker)\n },\n },\n {\n name: 'group_by',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('group_by expects an array', span)\n // 1. Evaluate keys\n const pairs: { val: Value; key: Value }[] = []\n const filter = args[0]!\n for (const item of input) {\n tracker.step(span)\n const keys = Array.from(evaluate(filter, item, env, tracker))\n if (keys.length !== 1)\n throw new RuntimeError('group_by key expression must return exactly one value', span)\n pairs.push({ val: item, key: keys[0]! })\n }\n // 2. Sort by keys\n const sorted = sortStable(pairs, (a, b) => compareValues(a.key, b.key))\n\n // 3. Group\n const groups: Value[][] = []\n if (sorted.length > 0) {\n let currentGroup: Value[] = [sorted[0]!.val]\n let currentKey = sorted[0]!.key\n for (let i = 1; i < sorted.length; i++) {\n const pair = sorted[i]!\n if (compareValues(pair.key, currentKey) === 0) {\n currentGroup.push(pair.val)\n } else {\n groups.push(currentGroup)\n currentGroup = [pair.val]\n currentKey = pair.key\n }\n }\n groups.push(currentGroup)\n }\n yield emit(groups, span, tracker)\n },\n },\n {\n name: 'reverse',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('reverse expects an array', span)\n yield emit([...input].reverse(), span, tracker)\n },\n },\n {\n name: 'flatten',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('flatten expects an array', span)\n const flattenRec = (arr: Value[]): Value[] => {\n let res: Value[] = []\n for (const item of arr) {\n if (Array.isArray(item)) {\n res = res.concat(flattenRec(item))\n } else {\n res.push(item)\n }\n }\n return res\n }\n yield emit(flattenRec(input), span, tracker)\n },\n },\n {\n name: 'flatten',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('flatten expects an array', span)\n const depths = evaluate(args[0]!, input, env, tracker)\n for (const depthVal of depths) {\n if (typeof depthVal !== 'number')\n throw new RuntimeError('flatten depth must be a number', span)\n const flattenDepth = (arr: Value[], d: number): Value[] => {\n if (d <= 0) return arr\n let res: Value[] = []\n for (const item of arr) {\n if (Array.isArray(item)) {\n res = res.concat(flattenDepth(item, d - 1))\n } else {\n res.push(item)\n }\n }\n return res\n }\n yield emit(flattenDepth(input, depthVal), span, tracker)\n }\n },\n },\n {\n name: 'keys_unsorted',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (Array.isArray(input)) {\n const indices = Array.from({ length: input.length }, (_, i) => i)\n yield emit(indices, span, tracker)\n } else if (input !== null && typeof input === 'object') {\n const keys = Object.keys(input)\n yield emit(keys, span, tracker)\n } else {\n throw new RuntimeError(`keys_unsorted expects an array or object`, span)\n }\n },\n },\n {\n name: 'transpose',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('transpose expects an array', span)\n const arr = input as Value[]\n if (arr.length === 0) {\n yield emit([], span, tracker)\n return\n }\n // Calculate max length\n let maxLen = 0\n for (const row of arr) {\n if (!Array.isArray(row))\n throw new RuntimeError('transpose input must be array of arrays', span)\n if (row.length > maxLen) maxLen = row.length\n }\n\n const result: Value[][] = []\n for (let j = 0; j < maxLen; j++) {\n const newRow: Value[] = []\n for (let i = 0; i < arr.length; i++) {\n const row = arr[i] as Value[]\n const val = j < row.length ? row[j]! : null\n newRow.push(val)\n }\n result.push(newRow)\n }\n yield emit(result, span, tracker)\n },\n },\n {\n name: 'bsearch',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('bsearch expects an array', span)\n const targetGen = evaluate(args[0]!, input, env, tracker)\n for (const target of targetGen) {\n let low = 0\n let high = input.length - 1\n let idx = -1\n while (low <= high) {\n const mid = Math.floor((low + high) / 2)\n const cmp = compareValues(input[mid]!, target)\n if (cmp === 0) {\n idx = mid\n break\n } else if (cmp < 0) {\n low = mid + 1\n } else {\n high = mid - 1\n }\n }\n if (idx !== -1) {\n yield emit(idx, span, tracker)\n } else {\n yield emit(-low - 1, span, tracker)\n }\n }\n },\n },\n {\n name: 'combinations',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('combinations expects an array', span)\n if (input.some((x) => !Array.isArray(x)))\n throw new RuntimeError('combinations input must be array of arrays', span)\n\n const arrays = input as Value[][]\n if (arrays.length === 0) {\n yield emit([], span, tracker)\n return\n }\n\n const helper = function* (idx: number, current: Value[]): Generator<Value[]> {\n if (idx === arrays.length) {\n yield [...current]\n return\n }\n const arr = arrays[idx]!\n if (arr.length === 0) return\n for (const item of arr) {\n current.push(item)\n yield* helper(idx + 1, current)\n current.pop()\n }\n }\n\n for (const combo of helper(0, [])) {\n yield emit(combo, span, tracker)\n }\n },\n },\n {\n name: 'combinations',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('combinations expects an array', span)\n const nGen = evaluate(args[0]!, input, env, tracker)\n for (const nVal of nGen) {\n if (typeof nVal !== 'number')\n throw new RuntimeError('combinations(n) expects n to be number', span)\n\n if (nVal === 0) {\n yield emit([], span, tracker)\n continue\n }\n const arrays: Value[][] = []\n for (let i = 0; i < nVal; i++) arrays.push(input)\n\n const helper = function* (idx: number, current: Value[]): Generator<Value[]> {\n if (idx === arrays.length) {\n yield [...current]\n return\n }\n const arr = arrays[idx]!\n for (const item of arr) {\n current.push(item)\n yield* helper(idx + 1, current)\n current.pop()\n }\n }\n if (input.length === 0 && nVal > 0) {\n // empty\n } else {\n for (const combo of helper(0, [])) {\n yield emit(combo, span, tracker)\n }\n }\n }\n },\n },\n {\n name: 'inside',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const bGen = evaluate(args[0]!, input, env, tracker)\n for (const b of bGen) {\n yield emit(checkContains(b, input), span, tracker)\n }\n },\n },\n]\n","import type { FilterNode } from '../ast'\nimport { RuntimeError } from '../errors'\nimport type { LimitTracker } from '../limits'\nimport type { Value } from '../value'\nimport { getPath } from '../builtins/paths'\nimport type { Evaluator } from '../builtins/types'\nimport type { EnvStack } from './types'\n\n/**\n * Resolves properties paths for assignment or `path()` built-in.\n * Returns an array of paths (arrays of strings/numbers) for valid locations.\n *\n * @param node - The AST node describing trailing field access/indexing.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const evaluatePath = function* (\n node: FilterNode,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<(string | number)[]> {\n switch (node.kind) {\n case 'Identity':\n yield []\n return\n case 'FieldAccess':\n for (const parent of evaluatePath(node.target, input, env, tracker, evaluate)) {\n yield [...parent, node.field]\n }\n return\n case 'IndexAccess': {\n const parentPaths = Array.from(evaluatePath(node.target, input, env, tracker, evaluate))\n const output = evaluate(node.index, input, env, tracker)\n for (const keyVal of output) {\n let key: string | number\n if (typeof keyVal === 'string') key = keyVal\n else if (typeof keyVal === 'number' && Number.isInteger(keyVal)) key = keyVal\n else throw new RuntimeError('Path index must be string or integer', node.span)\n\n for (const parent of parentPaths) {\n yield [...parent, key]\n }\n }\n return\n }\n case 'Pipe': {\n // For .a | .b\n // 1. Get paths of left (.a)\n // 2. For each path p, get value v = getPath(input, p)\n // 3. Get paths of right (.b) against v -> q\n // 4. Yield [...p, ...q]\n\n const leftPaths = Array.from(evaluatePath(node.left, input, env, tracker, evaluate))\n for (const p of leftPaths) {\n const val = getPath(input, p) ?? null\n for (const q of evaluatePath(node.right, val, env, tracker, evaluate)) {\n yield [...p, ...q]\n }\n }\n return\n }\n case 'Comma':\n yield* evaluatePath(node.left, input, env, tracker, evaluate)\n yield* evaluatePath(node.right, input, env, tracker, evaluate)\n return\n case 'Iterate': {\n const parentPaths = Array.from(evaluatePath(node.target, input, env, tracker, evaluate))\n for (const p of parentPaths) {\n const val = getPath(input, p)\n if (Array.isArray(val)) {\n for (let i = 0; i < val.length; i++) {\n yield [...p, i]\n }\n } else if (val !== null && typeof val === 'object') {\n // Object\n for (const key of Object.keys(val)) {\n yield [...p, key]\n }\n } else {\n // Iterate on null is empty, others error?\n if (val === null) continue\n throw new RuntimeError(`Cannot iterate over ${typeof val}`, node.span)\n }\n }\n return\n }\n case 'Call':\n if (node.name === 'select') {\n const conds = evaluate(node.args[0]!, input, env, tracker)\n let matched = false\n for (const c of conds) {\n if (c !== null && c !== false) {\n matched = true // Truthy\n }\n }\n if (matched) yield [] // Relative path is empty (identity)\n return\n }\n throw new RuntimeError(`Function ${node.name} not supported in path expression`, node.span)\n default:\n throw new RuntimeError('Invalid path expression', node.span)\n }\n}\n","import { RuntimeError } from '../errors'\nimport { describeType, isPlainObject, type Value, type ValueObject } from '../value'\nimport type { Span } from '../span'\nimport type { LimitTracker } from '../limits'\nimport type { BuiltinSpec } from './types'\nimport { evaluatePath } from '../eval/path_eval'\nimport { emit } from './utils'\n\n// --- Internal Path Logic ---\n\nfunction* traversePaths(\n root: Value,\n currentPath: (string | number)[],\n span: Span,\n tracker: LimitTracker\n): Generator<Value> {\n tracker.step(span)\n const isLeaf =\n root === null ||\n typeof root !== 'object' ||\n (Array.isArray(root) && root.length === 0) ||\n (isPlainObject(root) && Object.keys(root).length === 0)\n\n if (isLeaf) {\n yield emit([...currentPath], span, tracker)\n return\n }\n\n if (Array.isArray(root)) {\n for (let i = 0; i < root.length; i++) {\n yield* traversePaths(root[i]!, [...currentPath, i], span, tracker)\n }\n } else if (isPlainObject(root)) {\n const keys = Object.keys(root).sort()\n for (const key of keys) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n yield* traversePaths((root as ValueObject)[key]!, [...currentPath, key], span, tracker)\n }\n }\n}\n\nconst isPath = (val: Value): val is (string | number)[] => {\n if (!Array.isArray(val)) return false\n return val.every((p) => typeof p === 'string' || (typeof p === 'number' && Number.isInteger(p)))\n}\n\nexport const ensurePath = (val: Value, span: Span): (string | number)[] => {\n if (isPath(val)) return val\n throw new RuntimeError('Path must be an array of strings or integers', span)\n}\n\nexport const getPath = (root: Value, path: (string | number)[]): Value | undefined => {\n let curr = root\n for (const part of path) {\n if (curr === null) return undefined\n if (typeof part === 'string' && isPlainObject(curr)) {\n if (!Object.prototype.hasOwnProperty.call(curr, part)) return undefined\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n curr = (curr as ValueObject)[part]!\n } else if (typeof part === 'number' && Array.isArray(curr)) {\n if (part < 0 || part >= curr.length) return undefined\n curr = curr[part]!\n } else {\n return undefined\n }\n }\n return curr\n}\n\nexport const updatePath = (\n root: Value,\n path: (string | number)[],\n updateFn: (val: Value | undefined) => Value | undefined,\n span: Span,\n depth = 0\n): Value | undefined => {\n if (path.length === 0) {\n return updateFn(root)\n }\n const [head, ...tail] = path\n\n if (typeof head === 'string') {\n let obj: Record<string, Value> = {}\n if (isPlainObject(root)) {\n obj = { ...root }\n } else if (root === null) {\n obj = {}\n } else {\n throw new RuntimeError(`Cannot index ${describeType(root)} with string \"${head}\"`, span)\n }\n\n const child = Object.prototype.hasOwnProperty.call(obj, head) ? obj[head]! : undefined\n const newVal = updatePath(child ?? null, tail, updateFn, span, depth + 1)\n if (newVal === undefined) {\n delete obj[head]\n } else {\n obj[head] = newVal\n }\n return obj\n }\n\n if (typeof head === 'number') {\n let arr: Value[] = []\n if (Array.isArray(root)) {\n arr = [...root]\n } else if (root === null) {\n arr = []\n } else {\n throw new RuntimeError(`Cannot index ${describeType(root)} with number ${head}`, span)\n }\n\n const idx = head < 0 ? arr.length + head : head\n if (idx < 0) throw new RuntimeError('Invalid negative index', span)\n\n const child = idx < arr.length ? arr[idx] : null\n const newVal = updatePath(child ?? null, tail, updateFn, span, depth + 1)\n\n if (newVal === undefined) {\n if (idx >= arr.length) {\n while (arr.length < idx) arr.push(null)\n arr.push(newVal!)\n } else {\n arr[idx] = newVal!\n }\n } else {\n if (idx >= arr.length) {\n while (arr.length < idx) arr.push(null)\n arr.push(newVal)\n } else {\n arr[idx] = newVal\n }\n }\n return arr\n }\n\n throw new RuntimeError(`Path segment must be string or integer`, span)\n}\n\nexport const deletePaths = (root: Value, paths: (string | number)[][], span: Span): Value => {\n if (paths.some((p) => p.length === 0)) return null\n\n if (isPlainObject(root)) {\n const result: ValueObject = { ...root }\n const relevantPaths = paths.filter((p) => p.length > 0 && typeof p[0] === 'string')\n\n const byKey: Record<string, (string | number)[][]> = {}\n for (const p of relevantPaths) {\n const key = p[0] as string\n if (!byKey[key]) byKey[key] = []\n byKey[key].push(p.slice(1))\n }\n\n for (const key of Object.keys(byKey)) {\n const tails = byKey[key]!\n if (tails.some((t) => t.length === 0)) {\n delete result[key]\n } else {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n result[key] = deletePaths((root as ValueObject)[key]!, tails, span)\n }\n }\n return result\n }\n\n if (Array.isArray(root)) {\n const relevantPaths = paths.filter((p) => p.length > 0 && typeof p[0] === 'number')\n\n const actions: Record<number, (string | number)[][]> = {}\n for (const p of relevantPaths) {\n let idx = p[0] as number\n if (idx < 0) idx = root.length + idx\n if (idx < 0 || idx >= root.length) continue\n if (!actions[idx]) actions[idx] = []\n actions[idx]!.push(p.slice(1))\n }\n\n const finalArr: Value[] = []\n for (let i = 0; i < root.length; i++) {\n const tails = actions[i]\n if (tails) {\n if (tails.some((t) => t.length === 0)) {\n continue\n } else {\n finalArr.push(deletePaths(root[i]!, tails, span))\n }\n } else {\n finalArr.push(root[i]!)\n }\n }\n return finalArr\n }\n\n return root\n}\n\n// --- Builtin Exports ---\n\nexport const pathBuiltins: BuiltinSpec[] = [\n {\n name: 'paths',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n yield* traversePaths(input, [], span, tracker)\n },\n },\n {\n name: 'getpath',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n for (const pathVal of evaluate(args[0]!, input, env, tracker)) {\n const path = ensurePath(pathVal, span)\n const res = getPath(input, path)\n yield emit(res ?? null, span, tracker)\n }\n },\n },\n {\n name: 'setpath',\n arity: 2,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const paths = Array.from(evaluate(args[0]!, input, env, tracker))\n const values = Array.from(evaluate(args[1]!, input, env, tracker))\n for (const pathVal of paths) {\n const path = ensurePath(pathVal, span)\n for (const val of values) {\n const res = updatePath(input, path, () => val, span)\n yield emit(res ?? null, span, tracker)\n }\n }\n },\n },\n {\n name: 'delpaths',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n for (const pathsVal of evaluate(args[0]!, input, env, tracker)) {\n if (!Array.isArray(pathsVal))\n throw new RuntimeError('delpaths expects an array of paths', span)\n const paths = pathsVal.map((p) => ensurePath(p, span))\n const res = deletePaths(input, paths, span)\n yield emit(res, span, tracker)\n }\n },\n },\n {\n name: 'path',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // path(expr) returns the path array of the expression\n // We use evaluatePath logic\n for (const p of evaluatePath(args[0]!, input, env, tracker, evaluate)) {\n yield emit(p, span, tracker)\n }\n },\n },\n]\n","import { RuntimeError } from '../errors'\nimport { isTruthy, type Value } from '../value'\nimport type { BuiltinSpec } from './types'\nimport { emit } from './utils'\n\nexport const iteratorBuiltins: BuiltinSpec[] = [\n // --- Generators ---\n {\n name: 'range',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // range(end): 0 to end\n const ends = evaluate(args[0]!, input, env, tracker)\n for (const end of ends) {\n if (typeof end !== 'number') throw new RuntimeError('range expects numbers', span)\n for (let i = 0; i < end; i++) {\n yield emit(i, span, tracker)\n }\n }\n },\n },\n {\n name: 'range',\n arity: 2,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // range(start; end): start to end (step 1)\n const starts = Array.from(evaluate(args[0]!, input, env, tracker))\n const ends = Array.from(evaluate(args[1]!, input, env, tracker))\n for (const start of starts) {\n for (const end of ends) {\n if (typeof start !== 'number' || typeof end !== 'number')\n throw new RuntimeError('range expects numbers', span)\n if (start < end) {\n for (let i = start; i < end; i++) {\n yield emit(i, span, tracker)\n }\n } else {\n // jq behavior: if start > end, range is empty (step defaults to 1)\n }\n }\n }\n },\n },\n {\n name: 'range',\n arity: 3,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // range(start; end; step)\n const starts = Array.from(evaluate(args[0]!, input, env, tracker))\n const ends = Array.from(evaluate(args[1]!, input, env, tracker))\n const steps = Array.from(evaluate(args[2]!, input, env, tracker))\n\n for (const start of starts) {\n for (const end of ends) {\n for (const step of steps) {\n if (typeof start !== 'number' || typeof end !== 'number' || typeof step !== 'number') {\n throw new RuntimeError('range expects numbers', span)\n }\n if (step === 0) throw new RuntimeError('range step cannot be zero', span)\n\n if (step > 0) {\n for (let i = start; i < end; i += step) {\n yield emit(i, span, tracker)\n }\n } else {\n for (let i = start; i > end; i += step) {\n yield emit(i, span, tracker)\n }\n }\n }\n }\n }\n },\n },\n\n // --- Iterators ---\n {\n name: 'limit',\n arity: 2,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // limit(n; expr)\n const limits = evaluate(args[0]!, input, env, tracker)\n for (const n of limits) {\n if (typeof n !== 'number') throw new RuntimeError('limit expects number', span)\n let count = 0\n if (n > 0) {\n for (const val of evaluate(args[1]!, input, env, tracker)) {\n yield val // val is already emitted by expr\n count++\n if (count >= n) break\n }\n }\n }\n },\n },\n {\n name: 'first',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate) {\n // first(expr) -> limit(1; expr)\n for (const val of evaluate(args[0]!, input, env, tracker)) {\n yield val\n break\n }\n },\n },\n {\n name: 'last',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate) {\n // last(expr)\n let lastVal: Value | undefined\n let found = false\n for (const val of evaluate(args[0]!, input, env, tracker)) {\n lastVal = val\n found = true\n }\n if (found) yield lastVal as Value\n },\n },\n {\n name: 'nth',\n arity: 2,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // nth(n; expr)\n const indices = evaluate(args[0]!, input, env, tracker)\n for (const n of indices) {\n if (typeof n !== 'number') throw new RuntimeError('nth expects number', span)\n let count = 0\n for (const val of evaluate(args[1]!, input, env, tracker)) {\n if (count === n) {\n yield val\n break // optimization: stop after finding nth? jq nth stops.\n }\n count++\n }\n }\n },\n },\n {\n name: 'isempty',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // isempty(expr) -> true if empty, false otherwise\n let empty = true\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const _ of evaluate(args[0]!, input, env, tracker)) {\n empty = false\n break\n }\n yield emit(empty, span, tracker)\n },\n },\n\n // --- Aggregators ---\n {\n name: 'all',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // all(expr): checks if all outputs of expr are truthy\n let result = true\n for (const val of evaluate(args[0]!, input, env, tracker)) {\n if (!isTruthy(val)) {\n result = false\n break // short-circuit\n }\n }\n yield emit(result, span, tracker)\n },\n },\n {\n name: 'any',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // any(expr): checks if any output of expr is truthy\n let result = false\n for (const val of evaluate(args[0]!, input, env, tracker)) {\n if (isTruthy(val)) {\n result = true\n break // short-circuit\n }\n }\n yield emit(result, span, tracker)\n },\n },\n {\n name: 'recurse',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // recurse(f): emit ., then f | recurse(f) (depth-first)\n const rec = function* (curr: Value): Generator<Value> {\n yield emit(curr, span, tracker)\n const nexts = evaluate(args[0]!, curr, env, tracker)\n for (const next of nexts) {\n yield* rec(next)\n }\n }\n yield* rec(input)\n },\n },\n {\n name: 'while',\n arity: 2,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const condExpr = args[0]!\n const updateExpr = args[1]!\n const rec = function* (curr: Value): Generator<Value> {\n tracker.step(span) // Step for recursion/loop\n let condMatches = false\n for (const c of evaluate(condExpr, curr, env, tracker)) {\n if (isTruthy(c)) {\n condMatches = true\n break\n }\n }\n\n if (condMatches) {\n yield emit(curr, span, tracker)\n for (const next of evaluate(updateExpr, curr, env, tracker)) {\n yield* rec(next)\n }\n }\n }\n yield* rec(input)\n },\n },\n {\n name: 'until',\n arity: 2,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const condExpr = args[0]!\n const updateExpr = args[1]!\n const rec = function* (curr: Value): Generator<Value> {\n tracker.step(span)\n let condMatches = false\n for (const c of evaluate(condExpr, curr, env, tracker)) {\n if (isTruthy(c)) {\n condMatches = true\n break\n }\n }\n\n if (condMatches) {\n yield emit(curr, span, tracker)\n } else {\n for (const next of evaluate(updateExpr, curr, env, tracker)) {\n yield* rec(next)\n }\n }\n }\n yield* rec(input)\n },\n },\n {\n name: 'repeat',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // repeat(exp): repeatedly yield outputs of exp\n while (true) {\n tracker.step(span)\n yield* evaluate(args[0]!, input, env, tracker)\n }\n },\n },\n]\n","import { RuntimeError } from '../errors'\nimport { describeType, type Value } from '../value'\nimport { stableStringify } from '../builtins/utils'\nimport type { Span } from '../span'\n\n/**\n * Applies a unary negation (`-`).\n *\n * @param value - The value to negate.\n * @param span - Source span for errors.\n * @returns The negated value.\n */\nexport const applyUnaryNeg = (value: Value, span: Span): Value => {\n if (typeof value === 'number') {\n return -value\n }\n throw new RuntimeError(`Invalid operand for unary -: ${describeType(value)}`, span)\n}\n\n/**\n * Applies a binary operator.\n *\n * Supports arithmetic (`+`, `-`, `*`, `/`, `%`) and comparators.\n *\n * @param op - The operator string.\n * @param left - The left operand.\n * @param right - The right operand.\n * @param span - Source span for errors.\n * @returns The result of the operation.\n */\nexport const applyBinaryOp = (op: string, left: Value, right: Value, span: Span): Value => {\n switch (op) {\n case '+':\n return add(left, right, span)\n case '-':\n return sub(left, right, span)\n case '*':\n return mul(left, right, span)\n case '/':\n return div(left, right, span)\n case '%':\n return mod(left, right, span)\n case 'Eq':\n return isEqual(left, right)\n case 'Neq':\n return !isEqual(left, right)\n case 'Lt':\n return compare(left, right) < 0\n case 'Lte':\n return compare(left, right) <= 0\n case 'Gt':\n return compare(left, right) > 0\n case 'Gte':\n return compare(left, right) >= 0\n default:\n throw new RuntimeError(`Unknown binary operator: ${op}`, span)\n }\n}\n\n// Comparison helpers\nfunction isEqual(a: Value, b: Value): boolean {\n if (a === b) return true\n if (a === null || b === null) return false\n if (typeof a !== typeof b) return false\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n return a.every((v, i) => isEqual(v, b[i] as Value))\n }\n if (isPlainObject(a) && isPlainObject(b)) {\n const ka = Object.keys(a).sort()\n const kb = Object.keys(b).sort()\n if (ka.length !== kb.length) return false\n if (!ka.every((k, i) => k === kb[i])) return false\n return ka.every((k) => isEqual(a[k]!, b[k]!))\n }\n return false\n}\n\nfunction compare(a: Value, b: Value): number {\n if (a === b) return 0\n const typeOrder = (v: Value) => {\n if (v === null) return 0\n if (typeof v === 'boolean') return 1\n if (typeof v === 'number') return 2\n if (typeof v === 'string') return 3\n if (Array.isArray(v)) return 4\n if (isPlainObject(v)) return 5\n return 6\n }\n\n const ta = typeOrder(a)\n const tb = typeOrder(b)\n if (ta !== tb) return ta - tb\n\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n return (a ? 1 : 0) - (b ? 1 : 0)\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b\n }\n if (typeof a === 'string' && typeof b === 'string') {\n return a < b ? -1 : 1\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n for (let i = 0; i < Math.min(a.length, b.length); i++) {\n const c = compare(a[i]!, b[i]!)\n if (c !== 0) return c\n }\n return a.length - b.length\n }\n if (isPlainObject(a) && isPlainObject(b)) {\n // Compare by keys then values\n const keysA = Object.keys(a).sort()\n const keysB = Object.keys(b).sort()\n\n for (let i = 0; i < Math.min(keysA.length, keysB.length); i++) {\n const kA = keysA[i]!\n const kB = keysB[i]!\n if (kA !== kB) return kA < kB ? -1 : 1\n const c = compare(a[kA]!, b[kB]!)\n if (c !== 0) return c\n }\n return keysA.length - keysB.length\n }\n return 0\n}\n\nexport function add(left: Value, right: Value, span: Span): Value {\n if (left === null && right === null) return null\n if (left === null && typeof right === 'number') return right\n if (typeof left === 'number' && right === null) return left\n if (typeof left === 'number' && typeof right === 'number') return left + right\n if (typeof left === 'string' && typeof right === 'string') return left + right\n if (Array.isArray(left) && Array.isArray(right)) return [...left, ...right]\n if (isPlainObject(left) && isPlainObject(right)) return { ...left, ...right } // Merge (shallow)\n throw new RuntimeError(`Cannot add ${describeType(left)} and ${describeType(right)}`, span)\n}\n\nfunction sub(left: Value, right: Value, span: Span): Value {\n if (typeof left === 'number' && typeof right === 'number') return left - right\n if (Array.isArray(left) && Array.isArray(right)) {\n // Remove all occurrences of items in right from left\n const toRemove = new Set(right.map(stableStringify)) // Use stable stringify for value equality check\n return left.filter((x) => !toRemove.has(stableStringify(x)))\n }\n throw new RuntimeError(`Cannot subtract ${describeType(right)} from ${describeType(left)}`, span)\n}\n\nfunction mul(left: Value, right: Value, span: Span): Value {\n if (typeof left === 'number' && typeof right === 'number') return left * right\n\n // String repetition\n if (typeof left === 'string' && typeof right === 'number') return repeatString(left, right)\n if (typeof left === 'number' && typeof right === 'string') return repeatString(right, left)\n\n if (isPlainObject(left) && isPlainObject(right)) {\n return mergeDeep(left, right)\n }\n\n throw new RuntimeError(`Cannot multiply ${describeType(left)} by ${describeType(right)}`, span)\n}\n\nfunction div(left: Value, right: Value, span: Span): Value {\n if (typeof left === 'number' && typeof right === 'number') {\n if (right === 0) throw new RuntimeError('Division by zero', span)\n return left / right\n }\n if (typeof left === 'string' && typeof right === 'string') {\n return left.split(right)\n }\n throw new RuntimeError(`Cannot divide ${describeType(left)} by ${describeType(right)}`, span)\n}\n\nfunction mod(left: Value, right: Value, span: Span): Value {\n if (typeof left === 'number' && typeof right === 'number') {\n if (right === 0) throw new RuntimeError('Modulo by zero', span)\n // float modulo? JS % operator\n return left % right\n }\n throw new RuntimeError(`Cannot modulo ${describeType(left)} by ${describeType(right)}`, span)\n}\n\nfunction repeatString(str: string, count: number): string | null {\n if (count <= 0) return null\n const n = Math.floor(count)\n if (n <= 0) return null\n return str.repeat(n)\n}\n\nfunction mergeDeep(\n target: Record<string, Value>,\n source: Record<string, Value>\n): Record<string, Value> {\n const result = { ...target }\n for (const key of Object.keys(source)) {\n const sVal = source[key]!\n const tVal = result[key]\n if (isPlainObject(sVal) && tVal !== undefined && isPlainObject(tVal)) {\n result[key] = mergeDeep(tVal as Record<string, Value>, sVal as Record<string, Value>)\n } else {\n result[key] = sVal\n }\n }\n return result\n}\n\nfunction isPlainObject(v: Value): v is Record<string, Value> {\n return typeof v === 'object' && v !== null && !Array.isArray(v)\n}\n","import { RuntimeError } from '../errors'\nimport { compareValues, type Value } from '../value'\nimport type { BuiltinSpec } from './types'\nimport { emit } from './utils'\nimport { add } from '../eval/ops'\n\nexport const mathBuiltins: BuiltinSpec[] = [\n // --- Basic Math ---\n {\n name: 'floor',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input !== 'number') throw new RuntimeError('floor expects number', span)\n yield emit(Math.floor(input), span, tracker)\n },\n },\n {\n name: 'ceil',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input !== 'number') throw new RuntimeError('ceil expects number', span)\n yield emit(Math.ceil(input), span, tracker)\n },\n },\n {\n name: 'round',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input !== 'number') throw new RuntimeError('round expects number', span)\n yield emit(Math.round(input), span, tracker)\n },\n },\n {\n name: 'abs',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input !== 'number') throw new RuntimeError('abs expects number', span)\n yield emit(Math.abs(input), span, tracker)\n },\n },\n {\n name: 'sqrt',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input !== 'number') throw new RuntimeError('sqrt expects number', span)\n yield emit(Math.sqrt(input), span, tracker)\n },\n },\n {\n name: 'isnan',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input !== 'number') {\n yield emit(false, span, tracker) // jq behavior: isnan(\"foo\") -> false? or error? jq isnan(\"foo\") -> `false`.\n return\n }\n yield emit(Number.isNaN(input), span, tracker)\n },\n },\n {\n name: 'infinite',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input !== 'number') {\n yield emit(false, span, tracker)\n return\n }\n yield emit(!Number.isFinite(input) && !Number.isNaN(input), span, tracker)\n },\n },\n {\n name: 'isfinite',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input !== 'number') {\n yield emit(true, span, tracker) // jq `isfinite(\"foo\")` -> true. Only numbers can be infinite.\n return\n }\n yield emit(Number.isFinite(input), span, tracker)\n },\n },\n {\n name: 'normal',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input !== 'number') {\n yield emit(false, span, tracker)\n return\n }\n // normal: normal finite number (not subnormal, not 0, not infinite, not nan)\n // JS doesn't distinguish subnormal easily, but `Number.isFinite(x) && Math.abs(x) >= Number.MIN_NORMAL` roughly?\n // jq source says: `isnormal`.\n // For JS:\n if (!Number.isFinite(input) || Number.isNaN(input) || input === 0) {\n yield emit(false, span, tracker)\n return\n }\n // Assuming simplistic \"not zero, not infinite, not nan\" for now as \"normal\" in JS context roughly covers it.\n // Strict IEEE subnormal check is harder.\n yield emit(true, span, tracker)\n },\n },\n {\n name: 'subnormal',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input !== 'number') {\n yield emit(false, span, tracker)\n return\n }\n // In JS, subnormals are handled transparently, but `x !== 0 && Math.abs(x) < Number.MIN_VALUE`? No `MIN_VALUE` is roughly 5e-324 (smallest positive).\n // `Number.MIN_NORMAL` (if available in polyfill) or check?\n // Let's assume false for JS numbers unless extremely small?\n // jq checks `fpclassify`.\n // For now, let's just return false unless 0.\n yield emit(false, span, tracker)\n },\n },\n\n // --- Aggregators ---\n {\n name: 'min',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('min expects an array', span)\n if (input.length === 0) {\n yield emit(null, span, tracker)\n return\n }\n let minVal = input[0]!\n for (let i = 1; i < input.length; i++) {\n if (compareValues(input[i]!, minVal) < 0) {\n minVal = input[i]!\n }\n }\n yield emit(minVal, span, tracker)\n },\n },\n {\n name: 'max',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('max expects an array', span)\n if (input.length === 0) {\n yield emit(null, span, tracker)\n return\n }\n let maxVal = input[0]!\n for (let i = 1; i < input.length; i++) {\n if (compareValues(input[i]!, maxVal) > 0) {\n maxVal = input[i]!\n }\n }\n yield emit(maxVal, span, tracker)\n },\n },\n {\n name: 'min_by',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('min_by expects an array', span)\n if (input.length === 0) {\n yield emit(null, span, tracker)\n return\n }\n let minItem = input[0]!\n let minKey: Value | undefined\n\n // Calculate key for first item\n // Note: evaluate returns generator. We take first? \"key expression must return exactly one value\" typically.\n const keys0 = Array.from(evaluate(args[0]!, minItem, env, tracker))\n if (keys0.length !== 1) throw new RuntimeError('min_by key must return one value', span)\n minKey = keys0[0]!\n\n for (let i = 1; i < input.length; i++) {\n const item = input[i]!\n const keys = Array.from(evaluate(args[0]!, item, env, tracker))\n if (keys.length !== 1) throw new RuntimeError('min_by key must return one value', span)\n const key = keys[0]!\n\n if (compareValues(key, minKey) < 0) {\n minKey = key\n minItem = item\n }\n }\n yield emit(minItem, span, tracker)\n },\n },\n {\n name: 'max_by',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('max_by expects an array', span)\n if (input.length === 0) {\n yield emit(null, span, tracker)\n return\n }\n let maxItem = input[0]!\n let maxKey: Value | undefined\n\n const keys0 = Array.from(evaluate(args[0]!, maxItem, env, tracker))\n if (keys0.length !== 1) throw new RuntimeError('max_by key must return one value', span)\n maxKey = keys0[0]!\n\n for (let i = 1; i < input.length; i++) {\n const item = input[i]!\n const keys = Array.from(evaluate(args[0]!, item, env, tracker))\n if (keys.length !== 1) throw new RuntimeError('max_by key must return one value', span)\n const key = keys[0]!\n\n if (compareValues(key, maxKey) > 0) {\n maxKey = key\n maxItem = item\n }\n }\n yield emit(maxItem, span, tracker)\n },\n },\n {\n name: 'add',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) {\n throw new RuntimeError('add expects an array', span)\n }\n if (input.length === 0) {\n yield emit(null, span, tracker)\n return\n }\n let acc: Value = input[0]!\n for (let i = 1; i < input.length; i++) {\n tracker.step(span)\n acc = add(acc, input[i]!, span)\n }\n yield emit(acc, span, tracker)\n },\n },\n]\n","import { registerBuiltins } from './registry'\nimport { stdBuiltins } from './std'\nimport { errorBuiltins } from './errors'\nimport { collectionBuiltins } from './collections'\nimport { stringBuiltins } from './strings'\nimport { pathBuiltins } from './paths'\nimport { iteratorBuiltins } from './iterators'\nimport { mathBuiltins } from './math'\n\nexport const registerAllBuiltins = () => {\n registerBuiltins(stdBuiltins)\n registerBuiltins(errorBuiltins)\n registerBuiltins(collectionBuiltins)\n registerBuiltins(stringBuiltins)\n registerBuiltins(pathBuiltins)\n registerBuiltins(iteratorBuiltins)\n registerBuiltins(mathBuiltins)\n}\n","import { registerAllBuiltins } from './builtins/index'\nimport { builtins } from './builtins/registry'\n\n// Register all modular builtins\nregisterAllBuiltins()\n\nexport { builtins }\nexport * from './builtins/types'\nexport { stdBuiltins } from './builtins/std'\nexport { errorBuiltins } from './builtins/errors'\nexport { collectionBuiltins } from './builtins/collections'\nexport { stringBuiltins } from './builtins/strings'\nexport { pathBuiltins } from './builtins/paths'\nexport { iteratorBuiltins } from './builtins/iterators'\nexport { mathBuiltins } from './builtins/math'\n","import type { FilterNode } from './ast'\nimport { ValidationError } from './errors'\nimport { builtins } from './builtins'\n\n/**\n * Validates the AST for correctness and supported features.\n * Checks for unknown function calls and arity mismatches.\n *\n * @param node - The root AST node to validate.\n * @throws {ValidationError} If validation fails.\n */\nexport const validate = (node: FilterNode): void => {\n visit(node, [])\n}\n\nconst visit = (node: FilterNode, scope: Set<string>[]): void => {\n switch (node.kind) {\n case 'Identity':\n case 'Literal':\n case 'Var':\n return\n case 'FieldAccess':\n visit(node.target, scope)\n return\n case 'IndexAccess':\n visit(node.target, scope)\n visit(node.index, scope)\n return\n case 'Array':\n node.items.forEach((n) => visit(n, scope))\n return\n case 'Object':\n node.entries.forEach((entry) => {\n if (entry.key.kind === 'KeyExpr') {\n visit(entry.key.expr, scope)\n }\n visit(entry.value, scope)\n })\n return\n case 'Pipe':\n case 'Comma':\n case 'Alt':\n visit(node.left, scope)\n visit(node.right, scope)\n return\n case 'Binary':\n case 'Bool':\n visit(node.left, scope)\n visit(node.right, scope)\n return\n case 'Unary':\n visit(node.expr, scope)\n return\n case 'If':\n node.branches.forEach((branch) => {\n visit(branch.cond, scope)\n visit(branch.then, scope)\n })\n visit(node.else, scope)\n return\n case 'As':\n visit(node.bind, scope)\n visit(node.body, scope)\n return\n case 'Call': {\n // Check local scope first\n for (let i = scope.length - 1; i >= 0; i--) {\n if (scope[i]!.has(node.name)) {\n // Local function (argument or nested def).\n // We assume arity check matches or is loose for arguments (arity 0 effectively)\n // If it is an ARGUMENT, it is arity 0.\n // If it is a nested DEF, it has specific arity.\n // However, validating arity for local functions is harder without tracking definitions in scope.\n // For now, if name is in scope, we assume it's valid.\n // Refine this if needed.\n for (const arg of node.args) {\n visit(arg, scope)\n }\n return\n }\n }\n\n const specs = builtins[node.name]\n if (!specs || specs.length === 0) {\n throw new ValidationError(`Unknown function: ${node.name}`, node.span)\n }\n const match = specs.find((s) => s.arity === node.args.length)\n if (!match) {\n const arities = specs.map((s) => s.arity).join(' or ')\n throw new ValidationError(\n `Function ${node.name} expects ${arities} arguments, but got ${node.args.length}`,\n node.span\n )\n }\n for (const arg of node.args) {\n visit(arg, scope)\n }\n return\n }\n case 'Assignment':\n visit(node.left, scope)\n visit(node.right, scope)\n return\n case 'Def': {\n // Add name to scope for recursion (if recursive)\n // And arguments to scope for body.\n // Wait, Def name visible in 'next'? Yes.\n // Def name visible in 'body'? Yes (recursion).\n\n // Def args visible in BODY only.\n\n // 1. Validate body with args usage\n // Arguments are 0-arity functions\n const bodyScope = new Set(node.args)\n bodyScope.add(node.name) // Recursive\n\n visit(node.body, [...scope, bodyScope])\n\n // 2. Validate next with function name in scope\n // We need to track the function definition itself.\n // For simplicity, just add name to scope.\n const nextScope = new Set([node.name])\n visit(node.next, [...scope, nextScope])\n return\n }\n case 'Reduce':\n visit(node.source, scope)\n visit(node.init, scope)\n visit(node.update, scope)\n return\n case 'Foreach':\n visit(node.source, scope)\n visit(node.init, scope)\n visit(node.update, scope)\n if (node.extract) visit(node.extract, scope)\n return\n case 'Try':\n visit(node.body, scope)\n if (node.handler) visit(node.handler, scope)\n return\n case 'Recurse':\n case 'Iterate':\n case 'Break':\n return\n case 'Label':\n visit(node.body, scope)\n return\n case 'Slice':\n visit(node.target, scope)\n if (node.start) visit(node.start, scope)\n if (node.end) visit(node.end, scope)\n return\n default: {\n const exhaustive: never = node\n return exhaustive\n }\n }\n}\n","/**\n * Internal error class used to implement control flow breaks (`break $label`).\n * Caught by `evalLabel` or `evalForeach`/`evalReduce` if labels match.\n */\nexport class BreakSignal extends Error {\n constructor(public readonly label: string) {\n super(`Break: ${label}`)\n // Set prototype explicitly for instance checks if compiling to ES5 (common TS issue)\n Object.setPrototypeOf(this, BreakSignal.prototype)\n }\n}\n","import { RuntimeError } from './errors'\nimport type { Span } from './span'\n\n/**\n * Configuration options for execution limits.\n * All fields are optional and default to safe values if strictly undefined.\n */\nexport interface LimitsConfig {\n /** Maximum number of AST nodes to visit during execution. Default: 100,000. */\n maxSteps?: number\n /** Maximum recursion depth for execution and parsing. Default: 200. */\n maxDepth?: number\n /** Maximum number of values to yield from a single output emitter. Default: 10,000. */\n maxOutputs?: number\n}\n\n/**\n * Fully resolved limits with defaults applied.\n */\nexport interface ResolvedLimits {\n maxSteps: number\n maxDepth: number\n maxOutputs: number\n}\n\nconst DEFAULT_LIMITS: ResolvedLimits = {\n maxSteps: 100_000,\n maxDepth: 200,\n maxOutputs: 10_000,\n}\n\n/**\n * Resolves a partial limits configuration into a complete one with defaults.\n *\n * @param config - The user-provided configuration.\n * @returns The resolved limits.\n */\nexport const resolveLimits = (config: LimitsConfig = {}): ResolvedLimits => ({\n maxSteps: config.maxSteps ?? DEFAULT_LIMITS.maxSteps,\n maxDepth: config.maxDepth ?? DEFAULT_LIMITS.maxDepth,\n maxOutputs: config.maxOutputs ?? DEFAULT_LIMITS.maxOutputs,\n})\n\n/**\n * Tracks execution usage against defined limits.\n * Throws {@link RuntimeError} if any limit is exceeded.\n */\nexport class LimitTracker {\n private steps = 0\n private depth = 0\n private outputs = 0\n\n constructor(private readonly limits: ResolvedLimits) {}\n\n /**\n * Records a single execution step (AST node visit).\n * @param span - The source span for error reporting.\n */\n step(span: Span): void {\n this.steps += 1\n if (this.steps > this.limits.maxSteps) {\n throw new RuntimeError('Step limit exceeded', span)\n }\n }\n\n /**\n * Enters a new scope/stack frame, incrementing the depth counter.\n * @param span - The source span for error reporting.\n */\n enter(span: Span): void {\n this.depth += 1\n if (this.depth > this.limits.maxDepth) {\n throw new RuntimeError('Max depth exceeded', span)\n }\n }\n\n /**\n * Exits the current scope, decrementing the depth counter.\n */\n exit(): void {\n this.depth = Math.max(0, this.depth - 1)\n }\n\n /**\n * Records an output value being emitted.\n * @param span - The source span for error reporting.\n */\n emit(span: Span): void {\n this.outputs += 1\n if (this.outputs > this.limits.maxOutputs) {\n throw new RuntimeError('Output limit exceeded', span)\n }\n }\n}\n","import type { Value } from '../value'\nimport type { EnvStack } from './types'\n\n/**\n * Retrieves a variable value from the environment stack.\n * Searches from the current (top) frame down to the global frame.\n */\nexport const getVar = (env: EnvStack, name: string): Value | undefined => {\n for (let i = env.length - 1; i >= 0; i--) {\n if (env[i]!.vars.has(name)) {\n return env[i]!.vars.get(name)\n }\n }\n return undefined\n}\n\n/**\n * Bounds a value to a variable name in the current scope frame.\n */\nexport const pushBinding = (env: EnvStack, name: string, value: Value) => {\n env[env.length - 1]!.vars.set(name, value)\n}\n\n/**\n * Removes a variable binding from the current scope frame.\n */\nexport const popBinding = (env: EnvStack, name: string) => {\n env[env.length - 1]!.vars.delete(name)\n}\n","import { RuntimeError } from '../errors'\nimport type { LimitTracker } from '../limits'\nimport type { Span } from '../span'\nimport type { Value } from '../value'\n\n/**\n * Emits a value, recording it in the limits tracker.\n *\n * @param value - The value to yield.\n * @param span - The source span responsible for this value.\n * @param tracker - The limits tracker.\n * @returns The value itself.\n */\nexport const emit = (value: Value, span: Span, tracker: LimitTracker): Value => {\n tracker.emit(span)\n return value\n}\n\n/**\n * Ensures a value is an integer. Throws a RuntimeError otherwise.\n *\n * @param value - The value to check.\n * @param span - To report error.\n * @returns The integer value.\n */\nexport const ensureInteger = (value: Value, span: Span): number => {\n if (typeof value === 'number' && Number.isInteger(value)) {\n return value\n }\n throw new RuntimeError('Expected integer', span)\n}\n","import type { FilterNode } from '../ast'\nimport { RuntimeError } from '../errors'\nimport type { LimitTracker } from '../limits'\nimport { type Value, compareValues } from '../value'\nimport { getPath, updatePath, deletePaths } from '../builtins/paths'\nimport { applyBinaryOp } from './ops'\nimport type { Evaluator } from '../builtins/types'\nimport { emit } from './common'\nimport { evaluatePath } from './path_eval'\nimport type { EnvStack } from './types'\n\n/**\n * Evaluates assignment and update operators (`=`, `|=`, `+=`, etc.).\n *\n * Implements the complex path update logic of jq.\n * It first resolves the path(s) on the left-hand side, then computes new values,\n * and finally reconstructs the object with the updated values.\n *\n * @param node - The assignment AST node.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const evalAssignment = function* (\n node: Extract<FilterNode, { kind: 'Assignment' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n const paths = Array.from(evaluatePath(node.left, input, env, tracker, evaluate))\n // Sort paths descending to handle array deletion correctly (higher indices first)\n paths.sort((a, b) => compareValues(a, b) * -1)\n\n if (paths.length === 0) {\n yield emit(input, node.span, tracker)\n return\n }\n\n // Case 1: Plain Assignment '='\n if (node.op === '=') {\n const rhsValues = Array.from(evaluate(node.right, input, env, tracker))\n if (rhsValues.length === 0) return\n\n for (const rhsVal of rhsValues) {\n let current = input\n for (const path of paths) {\n current = updatePath(current, path, () => rhsVal, node.span) ?? current\n }\n yield emit(current, node.span, tracker)\n }\n return\n }\n\n // Case 2: Update Assignment '|=', '+=', etc.\n yield* applyUpdates(input, paths, 0, node.op, node.right, input, env, tracker, evaluate)\n}\n\nfunction* applyUpdates(\n current: Value,\n paths: (string | number)[][],\n index: number,\n op: string,\n rhsNode: FilterNode,\n contextInput: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n if (index >= paths.length) {\n yield current\n return\n }\n\n const path = paths[index]!\n const oldValue = getPath(current, path) ?? null\n\n // Determine new values for this path\n let newValues: Value[] = []\n\n if (op === '|=') {\n newValues = Array.from(evaluate(rhsNode, oldValue, env, tracker))\n } else {\n // Sugar ops: +=, -=, *=, /=, %=, //=\n const rhsResults = Array.from(evaluate(rhsNode, contextInput, env, tracker))\n for (const rhs of rhsResults) {\n let res: Value\n switch (op) {\n case '+=':\n res = applyBinaryOp('+', oldValue, rhs, rhsNode.span)\n break\n case '-=':\n res = applyBinaryOp('-', oldValue, rhs, rhsNode.span)\n break\n case '*=':\n res = applyBinaryOp('*', oldValue, rhs, rhsNode.span)\n break\n case '/=':\n res = applyBinaryOp('/', oldValue, rhs, rhsNode.span)\n break\n case '%=':\n res = applyBinaryOp('%', oldValue, rhs, rhsNode.span)\n break\n case '//=':\n // false is falsey in jq, so //= should replace if left is false or null.\n res = oldValue !== null && oldValue !== false ? oldValue : rhs\n break\n default:\n throw new RuntimeError(`Unknown assignment op: ${op}`, rhsNode.span)\n }\n newValues.push(res)\n }\n }\n\n if (newValues.length === 0) {\n // If the RHS outputs no values, the path is deleted.\n // deletePaths expects an array of paths. Here we delete just one path 'path'.\n const nextObject = deletePaths(current, [path], rhsNode.span)\n // Recurse for the next path in 'paths'\n yield* applyUpdates(\n nextObject,\n paths,\n index + 1,\n op,\n rhsNode,\n contextInput,\n env,\n tracker,\n evaluate\n )\n return\n }\n\n for (const val of newValues) {\n const nextObject = updatePath(current, path, () => val, rhsNode.span) ?? current\n yield* applyUpdates(\n nextObject,\n paths,\n index + 1,\n op,\n rhsNode,\n contextInput,\n env,\n tracker,\n evaluate\n )\n }\n}\n","import type { FilterNode } from '../ast'\nimport { RuntimeError } from '../errors'\nimport type { LimitTracker } from '../limits'\nimport { isValueArray, isPlainObject, describeType, type Value } from '../value'\nimport type { Evaluator } from '../builtins/types'\nimport { emit } from './common'\nimport { pushBinding, popBinding } from './env'\nimport type { EnvStack } from './types'\n\n/**\n * Iterates over the values of an array or object (`.[]`).\n *\n * @param node - The iterate AST node.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const evalIterate = function* (\n node: Extract<FilterNode, { kind: 'Iterate' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n for (const container of evaluate(node.target, input, env, tracker)) {\n if (container === null) {\n continue\n }\n if (isValueArray(container)) {\n for (const item of container) {\n yield emit(item, node.span, tracker)\n }\n continue\n }\n if (isPlainObject(container)) {\n const keys = Object.keys(container).sort()\n for (const key of keys) {\n yield emit(container[key]!, node.span, tracker)\n }\n continue\n }\n throw new RuntimeError(`Cannot iterate over ${describeType(container)}`, node.span)\n }\n}\n\n/**\n * Executes a `reduce` operation.\n *\n * `reduce inputs as $var (init; update)`\n *\n * @param node - The reduce AST node.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const evalReduce = function* (\n node: Extract<FilterNode, { kind: 'Reduce' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n const initValues = Array.from(evaluate(node.init, input, env, tracker))\n if (initValues.length !== 1) {\n throw new RuntimeError('Reduce init must single value', node.init.span)\n }\n let acc = initValues[0]!\n\n for (const item of evaluate(node.source, input, env, tracker)) {\n tracker.step(node.span)\n pushBinding(env, node.var, item)\n try {\n const updates = Array.from(evaluate(node.update, acc, env, tracker))\n if (updates.length !== 1) {\n throw new RuntimeError('Reduce update must produce single value', node.update.span)\n }\n acc = updates[0]!\n } finally {\n popBinding(env, node.var)\n }\n }\n yield emit(acc, node.span, tracker)\n}\n\n/**\n * Executes a `foreach` operation.\n *\n * `foreach inputs as $var (init; update; extract)`\n *\n * @param node - The foreach AST node.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const evalForeach = function* (\n node: Extract<FilterNode, { kind: 'Foreach' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n const initValues = Array.from(evaluate(node.init, input, env, tracker))\n if (initValues.length !== 1) {\n throw new RuntimeError('Foreach init must single value', node.init.span)\n }\n let acc = initValues[0]!\n\n for (const item of evaluate(node.source, input, env, tracker)) {\n tracker.step(node.span)\n pushBinding(env, node.var, item)\n try {\n const updates = Array.from(evaluate(node.update, acc, env, tracker))\n if (updates.length !== 1) {\n throw new RuntimeError('Foreach update must produce single value', node.update.span)\n }\n acc = updates[0]!\n\n if (node.extract) {\n for (const extracted of evaluate(node.extract, acc, env, tracker)) {\n yield emit(extracted, node.span, tracker)\n }\n } else {\n yield emit(acc, node.span, tracker)\n }\n } finally {\n popBinding(env, node.var)\n }\n }\n}\n\n/**\n * Evaluates the recursive operator `..`.\n * Deprecated node type kept for compatibility; currently implements `..` logic.\n *\n * @param node - The recurse AST node.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const evalRecurse = function* (\n node: Extract<FilterNode, { kind: 'Recurse' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n // recurse: output input, then recurse on output of filter(input)\n // But wait, `recurse` (arity 0) is equivalent to `recurse(.[]?)`.\n // If `recurse(f)`: output input, then `f | recurse(f)`.\n // The AST node `Recurse` handles `..` (recurse input). `..` means `recurse`.\n // The builtin `recurse` handles arguments.\n // The AST node `Recurse` is likely for `..` operator which is equivalent to `recurse`.\n\n // Implementation of `..`:\n // Yield input.\n // Then recurse on children.\n // `recurse` builtin logic:\n // yield input.\n // for x in f(input): yield* recurse(x)\n\n // For `..`, f is `.[]?`.\n // Let's implement `..` specifically.\n\n yield emit(input, node.span, tracker)\n\n const children: Value[] = []\n if (isValueArray(input)) {\n children.push(...input)\n } else if (isPlainObject(input)) {\n const keys = Object.keys(input).sort() // jq iterates objects in sorted key order\n for (const key of keys) {\n children.push(input[key]!)\n }\n }\n\n for (const child of children) {\n yield* evalRecurse(node, child, env, tracker, evaluate)\n }\n}\n","import type { FilterNode } from '../ast'\nimport { RuntimeError } from '../errors'\nimport type { LimitTracker } from '../limits'\nimport { isValueArray, isPlainObject, describeType, type Value } from '../value'\nimport type { Evaluator } from '../builtins/types'\nimport { emit, ensureInteger } from './common'\nimport type { EnvStack } from './types'\n\n/**\n * Evaluates field access (`.foo`).\n *\n * @param node - The field access AST node.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const evalField = function* (\n node: Extract<FilterNode, { kind: 'FieldAccess' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n for (const container of evaluate(node.target, input, env, tracker)) {\n if (container === null) {\n yield emit(null, node.span, tracker)\n continue\n }\n if (isPlainObject(container)) {\n yield emit(\n Object.prototype.hasOwnProperty.call(container, node.field) ? container[node.field]! : null,\n node.span,\n tracker\n )\n continue\n }\n throw new RuntimeError(`Cannot index ${describeType(container)} with string`, node.span)\n }\n}\n\n/**\n * Evaluates index access (`.[0]`, `.[\"foo\"]`).\n * Supports negative indices for arrays.\n *\n * @param node - The index access AST node.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const evalIndex = function* (\n node: Extract<FilterNode, { kind: 'IndexAccess' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n const indexValues = Array.from<Value>(evaluate(node.index, input, env, tracker))\n for (const container of evaluate(node.target, input, env, tracker)) {\n if (container === null) {\n yield emit(null, node.span, tracker)\n continue\n }\n if (isValueArray(container)) {\n for (const idxValue of indexValues) {\n const index = ensureInteger(idxValue, node.span)\n const resolved = index < 0 ? container.length + index : index\n if (resolved < 0 || resolved >= container.length) {\n yield emit(null, node.span, tracker)\n } else {\n yield emit(container[resolved]!, node.span, tracker)\n }\n }\n continue\n }\n if (isPlainObject(container)) {\n for (const keyValue of indexValues) {\n if (typeof keyValue !== 'string') {\n throw new RuntimeError(`Cannot index object with ${describeType(keyValue)}`, node.span)\n }\n yield emit(\n Object.prototype.hasOwnProperty.call(container, keyValue) ? container[keyValue]! : null,\n node.span,\n tracker\n )\n }\n continue\n }\n throw new RuntimeError(`Cannot index ${describeType(container)}`, node.span)\n }\n}\n\n/**\n * Evaluates array slicing (`.[start:end]`).\n * Supports optional start/end (defaults to 0/length) and negative indices (via JS slice).\n *\n * @param node - The slice AST node.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const evalSlice = function* (\n node: Extract<FilterNode, { kind: 'Slice' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n // Evaluate target\n for (const target of evaluate(node.target, input, env, tracker)) {\n if (typeof target !== 'string' && !Array.isArray(target)) {\n throw new RuntimeError('Slice expected string or array', node.span)\n }\n\n // Resolve start(s)\n const starts: number[] = []\n if (node.start) {\n for (const s of evaluate(node.start, input, env, tracker)) {\n if (typeof s !== 'number') throw new RuntimeError('Slice start must be number', node.span)\n starts.push(s)\n }\n } else {\n starts.push(0) // Default start\n }\n\n // Resolve end(s)\n const ends: number[] = []\n if (node.end) {\n for (const e of evaluate(node.end, input, env, tracker)) {\n if (typeof e !== 'number') throw new RuntimeError('Slice end must be number', node.span)\n ends.push(e)\n }\n } else {\n ends.push(target.length) // Default end\n }\n\n // Cartesian product of start/end\n for (const s of starts) {\n for (const e of ends) {\n yield emit(target.slice(s, e), node.span, tracker)\n }\n }\n }\n}\n","import type { ArrayNode, ObjectEntry, ObjectNode } from '../ast'\nimport { RuntimeError } from '../errors'\nimport type { LimitTracker } from '../limits'\nimport type { Value } from '../value'\nimport type { Evaluator } from '../builtins/types'\nimport type { EnvStack } from './types'\n\n/**\n * constructs arrays from the input.\n *\n * `[.foo, .bar]` -> `[foo_val, bar_val]`\n * It computes the Cartesian product of all items in the array definition.\n *\n * @param node - The array definition AST node.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const buildArray = function* (\n node: ArrayNode,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n const result: Value[] = []\n for (const itemNode of node.items) {\n for (const itemVal of evaluate(itemNode, input, env, tracker)) {\n result.push(itemVal)\n }\n }\n yield result\n}\n\n/**\n * constructs objects from the input.\n *\n * `{a: .foo, b: .bar}`\n * Computes the Cartesian product of all key-value pairs.\n *\n * @param node - The object definition AST node.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const buildObjects = function* (\n node: ObjectNode,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n // Similar to array, cartesian product of all entries.\n const obj: Record<string, Value> = {}\n yield* fillObject(node.entries, 0, obj, input, env, tracker, evaluate)\n}\n\nfunction* fillObject(\n entries: ObjectEntry[],\n index: number,\n current: Record<string, Value>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n if (index >= entries.length) {\n yield { ...current }\n return\n }\n\n const entry = entries[index]!\n // Evaluate Key\n let keys: string[] = []\n\n if (entry.key.kind === 'KeyIdentifier') {\n keys = [entry.key.name]\n } else if (entry.key.kind === 'KeyString') {\n keys = [entry.key.value]\n } else {\n // KeyExpr\n for (const k of evaluate(entry.key.expr, input, env, tracker)) {\n if (typeof k !== 'string')\n throw new RuntimeError('Object key must be a string', entry.key.span)\n keys.push(k)\n }\n }\n\n // For each key, evaluate value\n // \"The value is evaluated for EACH key.\"\n // `{ ((\"a\",\"b\")): (1,2) }` -> `{\"a\":1}`, `{\"a\":2}`, `{\"b\":1}`, `{\"b\":2}` ?\n // jq: `{(\"a\",\"b\"): (1,2)}` ->\n // {\"a\":1}\n // {\"a\":2}\n // {\"b\":1}\n // {\"b\":2}\n // So cartesian product of KEYS and VALUES for this entry, AND other entries.\n\n for (const key of keys) {\n for (const val of evaluate(entry.value, input, env, tracker)) {\n current[key] = val\n yield* fillObject(entries, index + 1, current, input, env, tracker, evaluate)\n delete current[key]\n }\n }\n}\n","import type { CallNode, DefNode } from '../ast'\nimport { RuntimeError } from '../errors'\nimport type { LimitTracker } from '../limits'\nimport type { Value } from '../value'\nimport { builtins } from '../builtins'\nimport type { EnvStack, EnvFrame, Evaluator, FunctionDef } from './types'\n\n/**\n * Evaluates a function call.\n *\n * Checks for:\n * 1. User-defined functions in the current environment stack (local scope).\n * 2. Standard library built-ins.\n *\n * Handles closure creation for arguments and recursion.\n *\n * @param node - The call AST node.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const evalCall = function* (\n node: CallNode,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n // 1. Check for user-defined function in scope\n for (let i = env.length - 1; i >= 0; i--) {\n const frame = env[i]!\n const funcs = frame.funcs.get(node.name)\n if (funcs) {\n const def = funcs.find((f) => f.args.length === node.args.length)\n if (def) {\n const newFrame: EnvFrame = { vars: new Map(), funcs: new Map() }\n\n for (let j = 0; j < node.args.length; j++) {\n const argName = def.args[j]!\n const argBody = node.args[j]!\n // Bind argName as a function of arity 0\n const argDefs = newFrame.funcs.get(argName) || []\n argDefs.push({\n args: [],\n body: argBody, // The AST of the argument filter\n closure: env, // Lexical scope at CALL SITE\n })\n newFrame.funcs.set(argName, argDefs)\n }\n\n // Closure stack + new frame\n // NOTE: `def.closure` is the env at definition time.\n const newStack = [...def.closure, newFrame]\n yield* evaluate(def.body, input, newStack, tracker)\n return\n }\n }\n }\n\n // 2. Builtins fallback\n const specs = builtins[node.name]\n if (!specs) {\n throw new RuntimeError(`Unknown function: ${node.name}`, node.span)\n }\n const builtin = specs.find((s) => s.arity === node.args.length)\n if (!builtin) {\n throw new RuntimeError(\n `Function ${node.name} does not accept ${node.args.length} arguments`,\n node.span\n )\n }\n yield* builtin.apply(input, node.args, env, tracker, evaluate, node.span)\n}\n\n/**\n * Defines a new function in the environment.\n *\n * Adds the function definition to the current scope and executes the `next` expression\n * with the updated environment.\n *\n * @param node - The function definition AST node.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const evalDef = function* (\n node: DefNode,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n const newFrame: EnvFrame = { vars: new Map(), funcs: new Map() }\n const currentDefs = newFrame.funcs.get(node.name) || []\n\n const funDef: FunctionDef = {\n args: node.args,\n body: node.body,\n closure: [], // Will be patched\n }\n currentDefs.push(funDef)\n newFrame.funcs.set(node.name, currentDefs)\n\n const newStack = [...env, newFrame]\n funDef.closure = newStack // Recursion support\n\n yield* evaluate(node.next, input, newStack, tracker)\n}\n","import type { IfNode, TryNode, LabelNode } from '../ast'\nimport { BreakSignal } from './break'\nimport { RuntimeError } from '../errors'\nimport type { LimitTracker } from '../limits'\nimport type { Value } from '../value'\nimport { isTruthy } from '../value'\nimport type { EnvStack, Evaluator } from './types'\n\n/**\n * Evaluates an `if-then-else` expression.\n *\n * @param node - The If AST node.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const evalIf = function* (\n node: IfNode,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n yield* evalIfBranch(node, 0, input, env, tracker, evaluate)\n}\n\nfunction* evalIfBranch(\n node: IfNode,\n branchIndex: number,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n if (branchIndex >= node.branches.length) {\n yield* evaluate(node.else, input, env, tracker)\n return\n }\n\n const branch = node.branches[branchIndex]!\n for (const cond of evaluate(branch.cond, input, env, tracker)) {\n if (isTruthy(cond)) {\n yield* evaluate(branch.then, input, env, tracker)\n } else {\n yield* evalIfBranch(node, branchIndex + 1, input, env, tracker, evaluate)\n }\n }\n}\n\n/**\n * Evaluates a `try-catch` expression.\n *\n * @param node - The Try AST node.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const evalTry = function* (\n node: TryNode,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n try {\n yield* evaluate(node.body, input, env, tracker)\n } catch (err) {\n if (err instanceof RuntimeError) {\n if (node.handler) {\n // Feed error string to handler\n yield* evaluate(node.handler, err.message, env, tracker)\n } else {\n // Suppress\n }\n } else {\n throw err\n }\n }\n}\n\n/**\n * Evaluates a `label` expression, establishing a target for `break`.\n *\n * @param node - The Label AST node.\n * @param input - The current input value.\n * @param env - The environment.\n * @param tracker - Limits tracker.\n * @param evaluate - Recursive evaluator.\n */\nexport const evalLabel = function* (\n node: LabelNode,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator\n): Generator<Value> {\n try {\n yield* evaluate(node.body, input, env, tracker)\n } catch (e) {\n if (e instanceof BreakSignal) {\n if (e.label === node.label) return // Caught matching break\n }\n throw e\n }\n}\n","import type { FilterNode } from '../ast'\nimport { BreakSignal } from './break'\nimport { RuntimeError } from '../errors'\nimport { LimitTracker, resolveLimits, type LimitsConfig } from '../limits'\nimport { isTruthy, type Value } from '../value'\nimport { applyBinaryOp, applyUnaryNeg } from './ops'\n\nimport { getVar } from './env'\nimport { emit } from './common'\nimport type { EnvStack, EnvFrame } from './types'\n\n// Sub-modules\nimport { evalAssignment } from './assignment'\nimport { evalIterate, evalReduce, evalForeach, evalRecurse } from './iterators'\nimport { evalField, evalIndex, evalSlice } from './access'\nimport { buildArray, buildObjects } from './constructors'\nimport { evalCall, evalDef } from './functions'\nimport { evalIf, evalTry, evalLabel } from './control_flow'\n\n/**\n * Configuration options for the evaluation engine.\n */\nexport interface EvalOptions {\n /**\n * Limit configuration to prevent infinite loops or excessive resource usage.\n */\n limits?: LimitsConfig\n}\n\n/**\n * Runs a jq AST against an input value.\n *\n * @param ast - The parsed AST.\n * @param input - The initial input value (JSON).\n * @param options - Execution options.\n * @returns An array of all values yielded by the filter.\n */\nexport const runAst = (ast: FilterNode, input: Value, options: EvalOptions = {}): Value[] => {\n const tracker = new LimitTracker(resolveLimits(options.limits))\n const env: EnvStack = [{ vars: new Map(), funcs: new Map() }]\n return Array.from<Value>(evaluate(ast, input, env, tracker))\n}\n\n/**\n * The core evaluation generator.\n *\n * This function dispatches execution to specific handlers based on the AST node kind.\n * It uses a generator to support jq's streaming nature (backtracking and multiple outputs).\n *\n * @param node - The current AST node to evaluate.\n * @param input - The current input value (context).\n * @param env - The current environment (variables and functions).\n * @param tracker - The limit tracker for safety.\n * @yields The output values produced by the filter.\n */\nfunction* evaluate(\n node: FilterNode,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value, void, undefined> {\n if (!node) {\n throw new Error('evaluate called with undefined node')\n }\n tracker.step(node.span)\n tracker.enter(node.span)\n try {\n switch (node.kind) {\n case 'Identity':\n yield emit(input, node.span, tracker)\n return\n case 'Literal':\n yield emit(node.value, node.span, tracker)\n return\n case 'Var': {\n const val = getVar(env, node.name)\n if (val === undefined) {\n throw new RuntimeError(`Undefined variable: ${node.name}`, node.span)\n }\n yield emit(val, node.span, tracker)\n return\n }\n case 'FieldAccess':\n yield* evalField(node, input, env, tracker, evaluate)\n return\n case 'IndexAccess':\n yield* evalIndex(node, input, env, tracker, evaluate)\n return\n case 'Slice':\n yield* evalSlice(node, input, env, tracker, evaluate)\n return\n case 'Array':\n yield* buildArray(node, input, env, tracker, evaluate)\n return\n case 'Object':\n yield* buildObjects(node, input, env, tracker, evaluate)\n return\n case 'Label':\n yield* evalLabel(node, input, env, tracker, evaluate)\n return\n case 'Break':\n throw new BreakSignal(node.label)\n case 'Pipe':\n for (const leftVal of evaluate(node.left, input, env, tracker)) {\n yield* evaluate(node.right, leftVal, env, tracker)\n }\n return\n case 'Comma':\n yield* evaluate(node.left, input, env, tracker)\n yield* evaluate(node.right, input, env, tracker)\n return\n case 'Alt': {\n const leftValues = Array.from<Value>(evaluate(node.left, input, env, tracker))\n const valid = leftValues.filter((v) => v !== null && v !== false)\n if (valid.length > 0) {\n for (const v of valid) {\n yield v\n }\n } else {\n yield* evaluate(node.right, input, env, tracker)\n }\n return\n }\n case 'Unary':\n if (node.op === 'Not') {\n for (const value of evaluate(node.expr, input, env, tracker)) {\n yield emit(!isTruthy(value), node.span, tracker)\n }\n } else {\n for (const value of evaluate(node.expr, input, env, tracker)) {\n yield emit(applyUnaryNeg(value, node.span), node.span, tracker)\n }\n }\n return\n case 'Bool': {\n // Short-circuiting logic\n for (const l of evaluate(node.left, input, env, tracker)) {\n if (node.op === 'And') {\n if (!isTruthy(l)) {\n yield emit(false, node.span, tracker)\n } else {\n for (const r of evaluate(node.right, input, env, tracker)) {\n yield emit(isTruthy(l) && isTruthy(r), node.span, tracker)\n }\n }\n } else {\n // Or\n if (isTruthy(l)) {\n yield emit(true, node.span, tracker)\n } else {\n for (const r of evaluate(node.right, input, env, tracker)) {\n yield emit(isTruthy(l) || isTruthy(r), node.span, tracker)\n }\n }\n }\n }\n return\n }\n case 'Binary': {\n const leftRes = Array.from(evaluate(node.left, input, env, tracker))\n const rightRes = Array.from(evaluate(node.right, input, env, tracker))\n for (const l of leftRes) {\n for (const r of rightRes) {\n yield emit(applyBinaryOp(node.op, l, r, node.span), node.span, tracker)\n }\n }\n return\n }\n case 'If':\n yield* evalIf(node, input, env, tracker, evaluate)\n return\n case 'Try':\n yield* evalTry(node, input, env, tracker, evaluate)\n return\n case 'Recurse':\n yield* evalRecurse(node, input, env, tracker, evaluate)\n return\n case 'Iterate':\n yield* evalIterate(node, input, env, tracker, evaluate)\n return\n case 'Assignment':\n yield* evalAssignment(node, input, env, tracker, evaluate)\n return\n case 'Reduce':\n yield* evalReduce(node, input, env, tracker, evaluate)\n return\n case 'Foreach':\n yield* evalForeach(node, input, env, tracker, evaluate)\n return\n case 'As': {\n const values = Array.from(evaluate(node.bind, input, env, tracker))\n for (const val of values) {\n // Use a new frame for the binding to ensure correct scoping and avoid mutation issues\n const newFrame: EnvFrame = { vars: new Map([[node.name, val]]), funcs: new Map() }\n const newEnv = [...env, newFrame]\n yield* evaluate(node.body, input, newEnv, tracker)\n }\n return\n }\n case 'Call':\n yield* evalCall(node, input, env, tracker, evaluate)\n return\n case 'Def':\n yield* evalDef(node, input, env, tracker, evaluate)\n return\n }\n } finally {\n tracker.exit()\n }\n}\n","import { parse } from './parser'\nimport { validate } from './validate'\nimport { runAst, type EvalOptions } from './eval'\nimport type { Value } from './value'\nimport { LimitTracker, resolveLimits, type LimitsConfig, type ResolvedLimits } from './limits'\nimport { LexError, ParseError, ValidationError, RuntimeError } from './errors'\n\nexport { parse, validate, runAst, LimitTracker, resolveLimits }\nexport type { EvalOptions, Value, LimitsConfig, ResolvedLimits }\nexport { LexError, ParseError, ValidationError, RuntimeError }\n\n/**\n * Runs a jq query against a JSON input.\n *\n * @param source - The jq query string (e.g., `.foo | .bar`).\n * @param input - The JSON input value (object, array, string, number, boolean, or null).\n * @param options - Execution options including limits.\n * @returns An array of results. jq queries always produce zero or more values.\n * @throws {LexError} If the query contains invalid characters.\n * @throws {ParseError} If the query syntax is invalid.\n * @throws {ValidationError} If the query uses unsupported features.\n * @throws {RuntimeError} If execution fails (e.g., type error) or exceeds limits.\n */\nexport const run = (source: string, input: Value, options: EvalOptions = {}): Value[] => {\n const ast = parse(source)\n validate(ast)\n return runAst(ast, input, options)\n}\n"],"mappings":";AAqBA,IAAM,YAAN,cAAwB,MAA2B;CACjD;CACA;CAEA,YAAY,MAAiB,SAAiB,MAAY;AACxD,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,OAAO;AAEZ,OAAK,OAAO,GADO,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE,CACrC;;;;;;AAO9B,IAAa,WAAb,cAA8B,UAAU;CACtC,YAAY,SAAiB,MAAY;AACvC,QAAM,OAAO,SAAS,KAAK;;;;;;AAO/B,IAAa,aAAb,cAAgC,UAAU;CACxC,YAAY,SAAiB,MAAY;AACvC,QAAM,SAAS,SAAS,KAAK;;;;;;AAOjC,IAAa,kBAAb,cAAqC,UAAU;CAC7C,YAAY,SAAiB,MAAY;AACvC,QAAM,YAAY,SAAS,KAAK;;;;;;AAOpC,IAAa,eAAb,cAAkC,UAAU;CAC1C,YAAY,SAAiB,MAAY;AACvC,QAAM,WAAW,SAAS,KAAK;;;;;;ACInC,MAAaA,eAAsD;CACjE,IAAI;CACJ,MAAM;CACN,MAAM;CACN,MAAM;CACN,KAAK;CACL,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,KAAK;CACL,MAAM;CACN,MAAM;CACN,OAAO;CACP,QAAQ;CACR,SAAS;CACT,KAAK;CACL,OAAO;CACP,KAAK;CACL,OAAO;CACP,OAAO;CACR;;;;;;;;;;;;AC7ED,MAAa,OAAO,SAA0B;CAC5C,MAAMC,SAAkB,EAAE;CAC1B,MAAM,SAAS,KAAK;CACpB,IAAI,MAAM;CAEV,MAAM,QAAQ,SAAS,MAAM,KAAK,MAAM;CACxC,MAAM,gBAAgB,KAAK;CAC3B,MAAM,YAAY,OAAe,SAAuB;EAAE;EAAO;EAAK;CACtE,MAAM,aAAa,MAAiB,OAAe,KAAa,UAA4B;AAC1F,SAAO,KAAK;GAAE;GAAM,MAAM,SAAS,OAAO,IAAI;GAAE;GAAO,CAAC;;CAG1D,MAAM,gBAAgB,OACpB,OAAO,OAAO,OAAO,OAAQ,OAAO,QAAQ,OAAO;CACrD,MAAM,WAAW,OAA2B,CAAC,CAAC,MAAM,MAAM,OAAO,MAAM;CACvE,MAAM,qBAAqB,OACzB,CAAC,CAAC,OAAQ,MAAM,OAAO,MAAM,OAAS,MAAM,OAAO,MAAM,OAAQ,OAAO;CAC1E,MAAM,oBAAoB,OAA2B,kBAAkB,GAAG,IAAI,QAAQ,GAAG;CAGzF,MAAMC,YAAsB,CAAC,EAAE;AAE/B,QAAO,MAAM,QAAQ;EAEnB,MAAM,KAAK,MAAM;AAGjB,MAAI,aAAa,GAAG,EAAE;AACpB,YAAS;AACT;;AAEF,MAAI,OAAO,KAAK;AACd,UAAO,MAAM,UAAU,MAAM,KAAK,KAAM,UAAS;AACjD;;EAGF,MAAM,QAAQ;AAEd,MAAI,OAAO,KAET;OAAI,UAAU,SAAS,GAAG;AACxB,aAAS;IAET,MAAM,SAAS,WAAW,OAAO,MAAM;IACvC,MAAM,QAAQ,gBAAgB,OAAO,QAAQ,GAAG,UAAU,KAAK,GAAG,KAAK,OAAM,IAAI,GAAG;AAEpF,QAAI,KAAK,SAAS,OAAO,MAAK;AAE5B,eAAU,KAAK;AACf,eAAU,aAAa,OAAO,QAAQ,MAAM;UAG5C,WAAU,gBAAgB,OAAO,QAAQ,MAAM;AAEjD;;;AAKJ,UAAQ,IAAR;GACE,KAAK,MAAK;IACR,MAAM,SAAS,WAAW,OAAO,KAAK;IACtC,MAAM,WAAW,KAAK,UAAU,SAAS,GAAG,OAAO,KAAK;IACxD,MAAM,QAAQ,gBAAgB,OAAO,QAAQ,GAAG,UAAU,WAAW,IAAI,GAAG;AAE5E,QAAI,UAAU;AACZ,eAAU,KAAK,EAAE;AACjB,eAAU,eAAe,OAAO,QAAQ,MAAM;UAE9C,WAAU,UAAU,OAAO,QAAQ,MAAM;AAE3C;;GAGF,KAAK;AACH,aAAS;AACT,QAAI,MAAM,KAAK,KAAK;AAClB,cAAS;AACT,eAAU,UAAU,OAAO,IAAI;UAE/B,WAAU,OAAO,OAAO,IAAI;AAE9B;GAEF,KAAK;AACH,aAAS;AACT,cAAU,aAAa,OAAO,IAAI;AAClC;GAEF,KAAK;AACH,aAAS;AACT,cAAU,SAAS,OAAO,IAAI;AAC9B;GAEF,KAAK;AACH,aAAS;AACT,cAAU,YAAY,OAAO,IAAI;AACjC;GAEF,KAAK;AACH,aAAS;AACT,QAAI,MAAM,KAAK,KAAK;AAClB,cAAS;AACT,eAAU,SAAS,OAAO,IAAI;UAE9B,WAAU,QAAQ,OAAO,IAAI;AAE/B;GAEF,KAAK;AACH,aAAS;AACT,QAAI,MAAM,KAAK,KAAK;AAClB,cAAS;AACT,SAAI,MAAM,KAAK,KAAK;AAClB,eAAS;AACT,gBAAU,SAAS,OAAO,IAAI;WAE9B,WAAU,OAAO,OAAO,IAAI;eAErB,MAAM,KAAK,KAAK;AACzB,cAAS;AACT,eAAU,WAAW,OAAO,IAAI;UAEhC,WAAU,SAAS,OAAO,IAAI;AAEhC;GAEF,KAAK;AACH,aAAS;AACT,cAAU,UAAU,OAAO,IAAI;AAC/B;GAEF,KAAK;AACH,aAAS;AACT,cAAU,UAAU,OAAO,IAAI;AAC/B;GAEF,KAAK;AACH,aAAS;AACT,cAAU,YAAY,OAAO,IAAI;AACjC;GAEF,KAAK;AACH,aAAS;AACT,cAAU,YAAY,OAAO,IAAI;AACjC;GAEF,KAAK;AACH,aAAS;AACT,cAAU,UAAU,OAAO,IAAI;AAC/B;GAEF,KAAK;AACH,aAAS;AACT,cAAU,UAAU,OAAO,IAAI;AAC/B;GAEF,KAAK;AACH,aAAS;AACT,cAAU,SAAS,OAAO,IAAI;AAC9B;GAEF,KAAK;AACH,aAAS;AACT,QAAI,MAAM,KAAK,KAAK;AAClB,cAAS;AACT,eAAU,UAAU,OAAO,IAAI;UAE/B,WAAU,QAAQ,OAAO,IAAI;AAE/B;GAEF,KAAK;AACH,aAAS;AACT,QAAI,MAAM,KAAK,KAAK;AAClB,cAAS;AACT,eAAU,WAAW,OAAO,IAAI;UAEhC,WAAU,SAAS,OAAO,IAAI;AAEhC;GAEF,KAAK;AACH,aAAS;AACT,QAAI,MAAM,KAAK,KAAK;AAClB,cAAS;AACT,eAAU,UAAU,OAAO,IAAI;UAE/B,WAAU,QAAQ,OAAO,IAAI;AAE/B;GAEF,KAAK;AACH,aAAS;AACT,QAAI,MAAM,KAAK,KAAK;AAClB,cAAS;AACT,eAAU,aAAa,OAAO,IAAI;UAElC,WAAU,WAAW,OAAO,IAAI;AAElC;GAEF,KAAK;AACH,aAAS;AACT,QAAI,MAAM,KAAK,KAAK;AAClB,cAAS;AACT,eAAU,cAAc,OAAO,IAAI;UAEnC,WAAU,MAAM,OAAO,IAAI;AAE7B;GAEF,KAAK;AACH,aAAS;AACT,QAAI,MAAM,KAAK,KAAK;AAClB,cAAS;AACT,eAAU,aAAa,OAAO,IAAI;UAElC,OAAM,IAAI,SAAS,4CAAwC,SAAS,OAAO,IAAI,CAAC;AAElF;GAEF,KAAK;AACH,aAAS;AACT,QAAI,MAAM,KAAK,KAAK;AAClB,cAAS;AACT,eAAU,aAAa,OAAO,IAAI;UAElC,WAAU,QAAQ,OAAO,IAAI;AAE/B;GAEF,KAAK;AACH,aAAS;AACT,QAAI,MAAM,KAAK,KAAK;AAClB,cAAS;AACT,eAAU,gBAAgB,OAAO,IAAI;UAErC,WAAU,WAAW,OAAO,IAAI;AAElC;GAEF,KAAK,KAAK;AACR,aAAS;AACT,QAAI,CAAC,kBAAkB,MAAM,CAAC,CAC5B,OAAM,IAAI,SAAS,mCAAiC,SAAS,OAAO,IAAI,CAAC;IAE3E,MAAM,YAAY;AAClB,WAAO,iBAAiB,MAAM,CAAC,CAAE,UAAS;AAC1C,cAAU,YAAY,OAAO,KAAK,KAAK,MAAM,WAAW,IAAI,CAAC;AAC7D;;GAEF,QACE;;AAGJ,MAAI,QAAQ,GAAG,EAAE;GACf,MAAM,MAAM,WAAW,MAAM;GAC7B,MAAM,MAAM,KAAK,MAAM,OAAO,IAAI;GAClC,MAAM,QAAQ,OAAO,IAAI;AACzB,OAAI,CAAC,OAAO,SAAS,MAAM,CACzB,OAAM,IAAI,SAAS,2BAA2B,OAAO,SAAS,OAAO,IAAI,CAAC;AAE5E,aAAU,UAAU,OAAO,KAAK,MAAM;AACtC;;AAGF,MAAI,kBAAkB,GAAG,EAAE;AACzB,UAAO,iBAAiB,MAAM,CAAC,CAAE,UAAS;GAC1C,MAAM,MAAM,KAAK,MAAM,OAAO,IAAI;GAClC,MAAM,UAAU,aAAa;AAE7B,OAAI,YAAY,UAAU,YAAY,UAAU,YAAY,QAC1D,WAAU,SAAS,OAAO,IAAI;YACrB,QACT,WAAU,SAAS,OAAO,IAAI;OAE9B,WAAU,cAAc,OAAO,KAAK,IAAI;AAE1C;;AAGF,QAAM,IAAI,SAAS,yBAAyB,GAAG,IAAI,SAAS,OAAO,QAAQ,EAAE,CAAC;;AAGhF,WAAU,OAAO,KAAK,IAAI;AAC1B,QAAO;CAEP,SAAS,WAAW,YAA4B;AAC9C,SAAO,QAAQ,MAAM,CAAC,CAAE,UAAS;AACjC,MAAI,MAAM,KAAK,OAAO,QAAQ,KAAK,EAAE,CAAC,EAAE;AACtC,YAAS;AACT,UAAO,QAAQ,MAAM,CAAC,CAAE,UAAS;;AAEnC,MAAI,MAAM,KAAK,OAAO,MAAM,KAAK,KAAK;AACpC,YAAS;AACT,OAAI,MAAM,KAAK,OAAO,MAAM,KAAK,IAAK,UAAS;AAC/C,OAAI,CAAC,QAAQ,MAAM,CAAC,CAClB,OAAM,IAAI,SAAS,sCAAsC,SAAS,YAAY,IAAI,CAAC;AAErF,UAAO,QAAQ,MAAM,CAAC,CAAE,UAAS;;AAEnC,SAAO;;CAGT,SAAS,WAAW,YAAoB,WAA4B;AAClE,MAAI,UAAW,UAAS;AAExB,SAAO,MAAM,QAAQ;GACnB,MAAM,UAAU,SAAS;AACzB,OAAI,YAAY,KACd,QAAO;AAET,OAAI,YAAY,MAAM;AACpB,QAAI,MAAM,KAAK,KAAK;AAClB,cAAS;AACT,YAAO;;IAGT,MAAM,MAAM,SAAS;AACrB,QAAI,CAAC,IAAK;AAEV,QAAI,aAAY,SAAS,IAAI,CAAE;AAC/B,QAAI,QAAQ,KAAK;AACf,UAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;MAC1B,MAAM,IAAI,SAAS;AACnB,UAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CACtB,OAAM,IAAI,SAAS,0BAA0B,SAAS,YAAY,IAAI,CAAC;;AAE3E;;AAEF,UAAM,IAAI,SAAS,8BAA8B,IAAI,IAAI,SAAS,YAAY,IAAI,CAAC;;;AAGvF,QAAM,IAAI,SAAS,+BAA+B,SAAS,YAAY,IAAI,CAAC;;CAG9E,SAAS,gBAAgB,YAAoB,YAAoB,UAA0B;EACzF,IAAI,SAAS;EACb,IAAI,IAAI;AACR,SAAO,IAAI,UAAU;GACnB,MAAM,KAAK,KAAK;AAChB,OAAI,OAAO,MAAM;IACf,MAAM,OAAO,KAAK,IAAI;AACtB,QAAI,CAAC,KAAM,OAAM,IAAI,SAAS,2BAA2B,SAAS,YAAY,IAAI,CAAC;AAEnF,QAAI,aAAY,SAAS,KAAK,EAAE;AAC9B,aAAQ,MAAR;MACE,KAAK;AACH,iBAAU;AACV;MACF,KAAK;AACH,iBAAU;AACV;MACF,KAAK;AACH,iBAAU;AACV;MACF,KAAK;AACH,iBAAU;AACV;MACF,KAAK;AACH,iBAAU;AACV;MACF,KAAK;AACH,iBAAU;AACV;MACF,KAAK;AACH,iBAAU;AACV;MACF,KAAK;AACH,iBAAU;AACV;;AAEJ,UAAK;AACL;;AAEF,QAAI,SAAS,KAAK;KAChB,MAAM,MAAM,KAAK,MAAM,IAAI,GAAG,IAAI,EAAE;AACpC,eAAU,OAAO,aAAa,SAAS,KAAK,GAAG,CAAC;AAChD,UAAK;AACL;;AAEF,UAAM,IAAI,SAAS,8BAA8B,KAAK,IAAI,SAAS,YAAY,IAAI,CAAC;UAC/E;AACL,cAAU;AACV,SAAK;;;AAGT,SAAO;;;AAIX,MAAM,cAAc,OAClB,CAAC,CAAC,OAAQ,MAAM,OAAO,MAAM,OAAS,MAAM,OAAO,MAAM,OAAS,MAAM,OAAO,MAAM;;;;;;;;;;;;AC5XvF,MAAa,SAAS,WAA+B;AAEnD,QADe,IAAI,OAAO,IAAI,OAAO,CAAC,CACxB,aAAa;;AAG7B,IAAM,SAAN,MAAa;CACX,AAAQ,UAAU;CAElB,YAAY,AAAiBC,QAAiB;EAAjB;;CAE7B,cAA0B;EACxB,MAAM,OAAO,KAAK,UAAU;AAC5B,OAAK,QAAQ,OAAO,6BAA6B;AACjD,SAAO;;CAGT,AAAQ,SAAS,aAAa,MAAkB;AAC9C,MAAI,KAAK,MAAM,MAAM,EAAE;GACrB,MAAM,YAAY,KAAK,UAAU,CAAC;GAClC,MAAM,YAAY,KAAK,QAAQ,cAAc,yBAAyB;GACtE,MAAM,OAAO,OAAO,UAAU,MAAM;GAEpC,MAAMC,OAAiB,EAAE;AACzB,OAAI,KAAK,MAAM,SAAS,EAAE;AACxB,QAAI,CAAC,KAAK,MAAM,SAAS,CACvB,IAAG;KACD,MAAM,WAAW,KAAK,QAAQ,cAAc,yBAAyB;AACrE,UAAK,KAAK,OAAO,SAAS,MAAM,CAAC;aAC1B,KAAK,MAAM,YAAY;AAElC,SAAK,QAAQ,UAAU,iCAA+B;;AAGxD,QAAK,QAAQ,SAAS,0CAAwC;GAE9D,MAAM,OAAO,KAAK,SAAS,KAAK;AAEhC,QAAK,QAAQ,aAAa,qCAAmC;GAM7D,MAAM,OAAO,KAAK,SAAS,WAAW;AAEtC,UAAO;IACL,MAAM;IACN;IACA;IACA;IACA;IACA,MAAM,YAAY,WAAW,KAAK,KAAK;IACxC;;AAEH,SAAO,KAAK,aAAa,WAAW;;CAGtC,AAAQ,aAAa,aAAa,MAAkB;AAClD,MAAI,KAAK,MAAM,QAAQ,EAAE;GACvB,MAAM,QAAQ,KAAK,UAAU;GAC7B,MAAM,WAAW,KAAK,QAAQ,YAAY,yCAAuC;AACjF,QAAK,QAAQ,QAAQ,6BAA2B;GAChD,MAAM,OAAO,KAAK,aAAa,WAAW;AAC1C,UAAO;IACL,MAAM;IACN,OAAO,OAAO,SAAS,MAAM;IAC7B;IACA,MAAM,YAAY,MAAM,MAAM,KAAK,KAAK;IACzC;;EAGH,IAAI,OAAO,aAAa,KAAK,YAAY,GAAG,KAAK,iBAAiB;AAClE,SAAO,KAAK,MAAM,KAAK,EAAE;GACvB,MAAM,WAAW,KAAK,QAAQ,YAAY,sCAAoC;AAC9E,QAAK,QAAQ,QAAQ,wCAAsC;GAC3D,MAAM,OAAO,KAAK,aAAa,WAAW;AAC1C,UAAO;IACL,MAAM;IACN,MAAM;IACN,MAAM,OAAO,SAAS,MAAM;IAC5B;IACA,MAAM,YAAY,KAAK,MAAM,KAAK,KAAK;IACxC;;AAEH,SAAO;;CAGT,AAAQ,aAAyB;EAC/B,IAAI,OAAO,KAAK,iBAAiB;AACjC,SAAO,KAAK,MAAM,QAAQ,EAAE;GAC1B,MAAM,QAAQ,KAAK,iBAAiB;AACpC,UAAO;IACL,MAAM;IACN,MAAM;IACN;IACA,MAAM,YAAY,KAAK,MAAM,MAAM,KAAK;IACzC;;AAEH,SAAO;;CAGT,AAAQ,kBAA8B;EACpC,MAAM,OAAO,KAAK,WAAW;AAC7B,MACE,KAAK,MAAM,KAAK,IAChB,KAAK,MAAM,QAAQ,IACnB,KAAK,MAAM,SAAS,IACpB,KAAK,MAAM,UAAU,IACrB,KAAK,MAAM,SAAS,IACpB,KAAK,MAAM,UAAU,IACrB,KAAK,MAAM,YAAY,IACvB,KAAK,MAAM,QAAQ,EACnB;GACA,MAAM,UAAU,KAAK,UAAU;GAC/B,MAAM,QAAQ,KAAK,iBAAiB;GACpC,IAAIC;AACJ,WAAQ,QAAQ,MAAhB;IACE,KAAK;AACH,UAAK;AACL;IACF,KAAK;AACH,UAAK;AACL;IACF,KAAK;AACH,UAAK;AACL;IACF,KAAK;AACH,UAAK;AACL;IACF,KAAK;AACH,UAAK;AACL;IACF,KAAK;AACH,UAAK;AACL;IACF,KAAK;AACH,UAAK;AACL;IACF,KAAK;AACH,UAAK;AACL;IACF,QACE,OAAM,IAAI,MAAM,0BAA0B,QAAQ,OAAO;;AAE7D,UAAO;IACL,MAAM;IACN;IACA,MAAM;IACN;IACA,MAAM,YAAY,KAAK,MAAM,MAAM,KAAK;IACzC;;AAEH,SAAO;;CAGT,AAAQ,YAAwB;EAC9B,IAAI,OAAO,KAAK,kBAAkB;AAClC,SAAO,KAAK,MAAM,OAAO,EAAE;GACzB,MAAM,QAAQ,KAAK,kBAAkB;AACrC,UAAO;IACL,MAAM;IACN,MAAM;IACN;IACA,MAAM,YAAY,KAAK,MAAM,MAAM,KAAK;IACzC;;AAEH,SAAO;;CAGT,AAAQ,mBAA+B;AACrC,SAAO,KAAK,UAAU;;CAGxB,AAAQ,WAAuB;EAC7B,IAAI,OAAO,KAAK,SAAS;AACzB,SAAO,KAAK,MAAM,MAAM,EAAE;GACxB,MAAM,QAAQ,KAAK,SAAS;AAC5B,UAAO;IACL,MAAM;IACN,MAAM;IACN;IACA,MAAM,YAAY,KAAK,MAAM,MAAM,KAAK;IACzC;;AAEH,SAAO;;CAGT,AAAQ,UAAsB;EAC5B,IAAI,OAAO,KAAK,UAAU;AAC1B,SAAO,KAAK,MAAM,KAAK,EAAE;GACvB,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAO;IACL,MAAM;IACN,IAAI;IACJ,MAAM;IACN;IACA,MAAM,YAAY,KAAK,MAAM,MAAM,KAAK;IACzC;;AAEH,SAAO;;CAGT,AAAQ,WAAuB;EAC7B,IAAI,OAAO,KAAK,iBAAiB;AACjC,SAAO,KAAK,MAAM,MAAM,EAAE;GACxB,MAAM,QAAQ,KAAK,iBAAiB;AACpC,UAAO;IACL,MAAM;IACN,IAAI;IACJ,MAAM;IACN;IACA,MAAM,YAAY,KAAK,MAAM,MAAM,KAAK;IACzC;;AAEH,SAAO;;CAGT,AAAQ,kBAA8B;EACpC,IAAI,OAAO,KAAK,UAAU;AAC1B,SAAO,KACL,KAAI,KAAK,MAAM,aAAa,EAAE;GAC5B,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAO,KAAK,WAAW,MAAM,OAAO,KAAK;aAChC,KAAK,MAAM,YAAY,EAAE;GAClC,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAO,KAAK,WAAW,MAAM,OAAO,MAAM;aACjC,KAAK,MAAM,OAAO,EAAE;GAC7B,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAO,KAAK,WAAW,MAAM,OAAO,KAAK;aAChC,KAAK,MAAM,YAAY,EAAE;GAClC,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAO,KAAK,WAAW,MAAM,OAAO,MAAM;aACjC,KAAK,MAAM,UAAU,EAAE;GAChC,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAO,KAAK,WAAW,MAAM,OAAO,KAAK;aAChC,KAAK,MAAM,eAAe,EAAE;GACrC,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAO,KAAK,WAAW,MAAM,OAAO,MAAM;QAE1C;AAGJ,SAAO;;CAGT,AAAQ,WAAuB;EAC7B,IAAI,OAAO,KAAK,UAAU;AAC1B,SAAO,KACL,KAAI,KAAK,MAAM,OAAO,EAAE;GACtB,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAO,KAAK,WAAW,MAAM,OAAO,IAAI;aAC/B,KAAK,MAAM,QAAQ,EAAE;GAC9B,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAO,KAAK,WAAW,MAAM,OAAO,IAAI;QAExC;AAGJ,SAAO;;CAGT,AAAQ,WAAuB;EAC7B,IAAI,OAAO,KAAK,YAAY;AAC5B,SAAO,KACL,KAAI,KAAK,MAAM,OAAO,EAAE;GACtB,MAAM,QAAQ,KAAK,YAAY;AAC/B,UAAO,KAAK,WAAW,MAAM,OAAO,IAAI;aAC/B,KAAK,MAAM,QAAQ,EAAE;GAC9B,MAAM,QAAQ,KAAK,YAAY;AAC/B,UAAO,KAAK,WAAW,MAAM,OAAO,IAAI;aAC/B,KAAK,MAAM,UAAU,EAAE;GAChC,MAAM,QAAQ,KAAK,YAAY;AAC/B,UAAO,KAAK,WAAW,MAAM,OAAO,IAAI;QAExC;AAGJ,SAAO;;CAGT,AAAQ,aAAyB;AAC/B,MAAI,KAAK,MAAM,MAAM,EAAE;GACrB,MAAM,KAAK,KAAK,UAAU;GAC1B,MAAM,OAAO,KAAK,YAAY;AAC9B,UAAO;IACL,MAAM;IACN,IAAI;IACJ;IACA,MAAM,YAAY,GAAG,MAAM,KAAK,KAAK;IACtC;;AAEH,MAAI,KAAK,MAAM,QAAQ,EAAE;GACvB,MAAM,KAAK,KAAK,UAAU;GAC1B,MAAM,OAAO,KAAK,YAAY;AAC9B,UAAO;IACL,MAAM;IACN,IAAI;IACJ;IACA,MAAM,YAAY,GAAG,MAAM,KAAK,KAAK;IACtC;;AAEH,SAAO,KAAK,cAAc;;CAG5B,AAAQ,eAA2B;EACjC,IAAI,OAAO,KAAK,cAAc;AAC9B,SAAO,MAAM;AACX,OAAI,KAAK,MAAM,MAAM,EAAE;AACrB,WAAO,KAAK,kBAAkB,KAAK;AACnC;;AAEF,OAAI,KAAK,MAAM,WAAW,EAAE;AAE1B,QAAI,KAAK,MAAM,QAAQ,EAAE;KACvB,IAAIC,MAAyB;AAC7B,SAAI,CAAC,KAAK,MAAM,WAAW,CACzB,OAAM,KAAK,WAAW;KAExB,MAAM,QAAQ,KAAK,QAAQ,YAAY,6BAA2B;AAClE,YAAO;MACL,MAAM;MACN,QAAQ;MACR,OAAO;MACP;MACA,MAAM,YAAY,KAAK,MAAM,MAAM,KAAK;MACzC;AACD;;AAGF,QAAI,KAAK,MAAM,WAAW,EAAE;KAC1B,MAAM,QAAQ,KAAK,UAAU;AAC7B,YAAO;MACL,MAAM;MACN,QAAQ;MACR,MAAM,YAAY,KAAK,MAAM,MAAM,KAAK;MACzC;AACD;;IAGF,MAAM,QAAQ,KAAK,WAAW;AAE9B,QAAI,KAAK,MAAM,QAAQ,EAAE;KACvB,IAAIA,MAAyB;AAC7B,SAAI,CAAC,KAAK,MAAM,WAAW,CACzB,OAAM,KAAK,WAAW;KAExB,MAAM,QAAQ,KAAK,QAAQ,YAAY,6BAA2B;AAClE,YAAO;MACL,MAAM;MACN,QAAQ;MACR,OAAO;MACP;MACA,MAAM,YAAY,KAAK,MAAM,MAAM,KAAK;MACzC;AACD;;IAGF,MAAM,UAAU,KAAK,QAAQ,YAAY,wCAAsC;AAC/E,WAAO;KACL,MAAM;KACN,QAAQ;KACR;KACA,MAAM,YAAY,KAAK,MAAM,QAAQ,KAAK;KAC3C;AACD;;AAEF,OAAI,KAAK,MAAM,WAAW,EAAE;IAC1B,MAAM,KAAK,KAAK,UAAU;AAC1B,WAAO;KACL,MAAM;KACN,MAAM;KACN,SAAS;MAAE,MAAM;MAAY,MAAM,GAAG;MAAM;KAC5C,MAAM,YAAY,KAAK,MAAM,GAAG,KAAK;KACtC;AACD;;AAEF;;AAEF,SAAO;;CAGT,AAAQ,eAA2B;AACjC,MAAI,KAAK,MAAM,MAAM,CACnB,QAAO,KAAK,gBAAgB,KAAK,UAAU,CAAC;AAE9C,MAAI,KAAK,MAAM,OAAO,CAAE,QAAO,KAAK,YAAY,MAAM,KAAK,UAAU,CAAC,KAAK;AAC3E,MAAI,KAAK,MAAM,OAAO,CAAE,QAAO,KAAK,YAAY,MAAM,KAAK,UAAU,CAAC,KAAK;AAC3E,MAAI,KAAK,MAAM,QAAQ,CAAE,QAAO,KAAK,YAAY,OAAO,KAAK,UAAU,CAAC,KAAK;AAC7E,MAAI,KAAK,MAAM,SAAS,CACtB,QAAO,KAAK,YAAY,OAAO,KAAK,UAAU,CAAC,MAAM,EAAE,KAAK,UAAU,CAAC,KAAK;AAE9E,MAAI,KAAK,MAAM,SAAS,CACtB,QAAO,KAAK,YAAY,OAAO,KAAK,UAAU,CAAC,MAAM,EAAE,KAAK,UAAU,CAAC,KAAK;AAE9E,MAAI,KAAK,MAAM,cAAc,CAC3B,QAAO,KAAK,yBAAyB,KAAK,UAAU,CAAC;AAEvD,MAAI,KAAK,MAAM,WAAW,EAAE;GAC1B,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAO;IACL,MAAM;IACN,MAAM,OAAO,MAAM,MAAM;IACzB,MAAM,MAAM;IACb;;AAEH,MAAI,KAAK,MAAM,aAAa,CAC1B,QAAO,KAAK,iBAAiB,KAAK,UAAU,CAAC;AAE/C,MAAI,KAAK,MAAM,KAAK,CAClB,QAAO,KAAK,QAAQ,KAAK,UAAU,CAAC;AAEtC,MAAI,KAAK,MAAM,SAAS,EAAE;GACxB,MAAM,QAAQ,KAAK,UAAU;GAC7B,MAAM,OAAO,KAAK,UAAU;GAC5B,MAAM,QAAQ,KAAK,QAAQ,UAAU,kCAAgC;AACrE,QAAK,OAAO,YAAY,MAAM,MAAM,MAAM,KAAK;AAC/C,UAAO;;AAET,MAAI,KAAK,MAAM,WAAW,CACxB,QAAO,KAAK,WAAW,KAAK,UAAU,CAAC;AAEzC,MAAI,KAAK,MAAM,SAAS,CACtB,QAAO,KAAK,YAAY,KAAK,UAAU,CAAC;AAE1C,MAAI,KAAK,MAAM,SAAS,CAAE,QAAO,KAAK,YAAY,KAAK,UAAU,CAAC;AAClE,MAAI,KAAK,MAAM,UAAU,CAAE,QAAO,KAAK,aAAa,KAAK,UAAU,CAAC;AACpE,MAAI,KAAK,MAAM,MAAM,CAAE,QAAO,KAAK,SAAS,KAAK,UAAU,CAAC;AAC5D,MAAI,KAAK,MAAM,SAAS,CAAE,QAAO;GAAE,MAAM;GAAW,MAAM,KAAK,UAAU,CAAC;GAAM;AAChF,MAAI,KAAK,MAAM,SAAS,CAAE,QAAO;GAAE,MAAM;GAAW,MAAM,KAAK,UAAU,CAAC;GAAM;AAChF,MAAI,KAAK,MAAM,QAAQ,CAAE,QAAO,KAAK,WAAW,KAAK,UAAU,CAAC;AAChE,QAAM,KAAK,MAAM,KAAK,MAAM,EAAE,mBAAmB;;CAKnD,AAAQ,WAAW,OAA0B;EAC3C,MAAM,WAAW,KAAK,QAAQ,YAAY,oCAAkC;AAC5E,SAAO;GACL,MAAM;GACN,OAAO,OAAO,SAAS,MAAM;GAC7B,MAAM,YAAY,MAAM,MAAM,SAAS,KAAK;GAC7C;;CAGH,AAAQ,YAAY,OAA0B;EAC5C,MAAM,SAAS,KAAK,WAAW;AAC/B,OAAK,QAAQ,MAAM,sCAAoC;EACvD,MAAM,WAAW,KAAK,QAAQ,YAAY,iCAA+B;AACzE,OAAK,QAAQ,UAAU,gCAA8B;EACrD,MAAM,OAAO,KAAK,YAAY;AAC9B,OAAK,QAAQ,aAAa,4BAA0B;EACpD,MAAM,SAAS,KAAK,YAAY;EAChC,MAAM,MAAM,KAAK,QAAQ,UAAU,8BAA4B;AAC/D,SAAO;GACL,MAAM;GACN;GACA,KAAK,OAAO,SAAS,MAAM;GAC3B;GACA;GACA,MAAM,YAAY,MAAM,MAAM,IAAI,KAAK;GACxC;;CAGH,AAAQ,aAAa,OAA2B;EAC9C,MAAM,SAAS,KAAK,WAAW;AAC/B,OAAK,QAAQ,MAAM,uCAAqC;EACxD,MAAM,WAAW,KAAK,QAAQ,YAAY,iCAA+B;AACzE,OAAK,QAAQ,UAAU,gCAA8B;EACrD,MAAM,OAAO,KAAK,YAAY;AAC9B,OAAK,QAAQ,aAAa,4BAA0B;EACpD,MAAM,SAAS,KAAK,YAAY;EAChC,IAAIC;AACJ,MAAI,KAAK,MAAM,YAAY,CACzB,WAAU,KAAK,YAAY;EAE7B,MAAM,MAAM,KAAK,QAAQ,UAAU,oCAAkC;AACrE,SAAO;GACL,MAAM;GACN;GACA,KAAK,OAAO,SAAS,MAAM;GAC3B;GACA;GACA;GACA,MAAM,YAAY,MAAM,MAAM,IAAI,KAAK;GACxC;;CAGH,AAAQ,SAAS,OAAuB;EACtC,MAAM,OAAO,KAAK,SAAS,KAAK;EAChC,IAAIC;EACJ,IAAI,UAAU,KAAK;AACnB,MAAI,KAAK,MAAM,QAAQ,EAAE;AACvB,aAAU,KAAK,SAAS,KAAK;AAC7B,aAAU,QAAQ;;AAEpB,SAAO;GACL,MAAM;GACN;GACA;GACA,MAAM,YAAY,MAAM,MAAM,QAAQ;GACvC;;CAGH,AAAQ,QAAQ,OAA0B;EACxC,MAAMC,WAAqD,EAAE;EAC7D,MAAM,YAAY,KAAK,SAAS,KAAK;AACrC,OAAK,QAAQ,QAAQ,oCAAkC;EACvD,MAAM,YAAY,KAAK,SAAS,KAAK;AACrC,WAAS,KAAK;GAAE,MAAM;GAAW,MAAM;GAAW,CAAC;AAEnD,SAAO,KAAK,MAAM,OAAO,EAAE;GACzB,MAAM,OAAO,KAAK,SAAS,KAAK;AAChC,QAAK,QAAQ,QAAQ,yCAAuC;GAC5D,MAAM,aAAa,KAAK,SAAS,KAAK;AACtC,YAAS,KAAK;IAAE;IAAM,MAAM;IAAY,CAAC;;AAG3C,OAAK,QAAQ,QAAQ,qCAAmC;EACxD,MAAM,aAAa,KAAK,SAAS,KAAK;EACtC,MAAM,WAAW,KAAK,QAAQ,OAAO,0CAAwC;AAC7E,SAAO;GACL,MAAM;GACN;GACA,MAAM;GACN,MAAM,YAAY,MAAM,MAAM,SAAS,KAAK;GAC7C;;CAGH,AAAQ,WAAW,OAAyB;EAC1C,MAAMC,QAAsB,EAAE;AAC9B,MAAI,CAAC,KAAK,MAAM,WAAW,EAAE;AAC3B;AACE,UAAM,KAAK,KAAK,SAAS,MAAM,CAAC;UACzB,KAAK,MAAM,QAAQ;AAC5B,QAAK,QAAQ,YAAY,sCAAoC;;AAE/D,SAAO;GACL,MAAM;GACN;GACA,MAAM,YAAY,MAAM,MAAM,KAAK,UAAU,CAAC,KAAK;GACpD;;CAGH,AAAQ,YAAY,OAA0B;EAC5C,MAAMC,UAAyB,EAAE;AACjC,MAAI,CAAC,KAAK,MAAM,SAAS,EAAE;AACzB,MAAG;IACD,MAAM,MAAM,KAAK,gBAAgB;AACjC,SAAK,QAAQ,SAAS,kCAAgC;IACtD,MAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,YAAQ,KAAK;KAAE;KAAK;KAAO,CAAC;YACrB,KAAK,MAAM,QAAQ;AAC5B,QAAK,QAAQ,UAAU,sCAAoC;;AAE7D,SAAO;GACL,MAAM;GACN;GACA,MAAM,YAAY,MAAM,MAAM,KAAK,UAAU,CAAC,KAAK;GACpD;;CAGH,AAAQ,mBAAgC;EACtC,MAAM,MAAM,KAAK,gBAAgB;AACjC,OAAK,QAAQ,SAAS,kCAAgC;AAEtD,SAAO;GAAE;GAAK,OADA,KAAK,SAAS,MAAM;GACb;;CAGvB,AAAQ,iBAA4B;AAClC,MAAI,KAAK,MAAM,aAAa,EAAE;GAC5B,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAO;IACL,MAAM;IACN,MAAM,OAAO,MAAM,MAAM;IACzB,MAAM,MAAM;IACb;;AAEH,MAAI,KAAK,MAAM,SAAS,EAAE;GACxB,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAO;IACL,MAAM;IACN,OAAO,OAAO,MAAM,MAAM;IAC1B,MAAM,MAAM;IACb;;AAEH,MAAI,KAAK,MAAM,SAAS,EAAE;GACxB,MAAM,QAAQ,KAAK,UAAU;GAC7B,MAAM,OAAO,KAAK,YAAY;GAC9B,MAAM,UAAU,KAAK,QAAQ,UAAU,+CAA6C;AACpF,UAAO;IACL,MAAM;IACN;IACA,MAAM,YAAY,MAAM,MAAM,QAAQ,KAAK;IAC5C;;AAEH,QAAM,KAAK,MAAM,KAAK,MAAM,EAAE,2DAAyD;;CAGzF,AAAQ,kBAAkB,QAAgC;AACxD,MAAI,KAAK,MAAM,aAAa,EAAE;GAC5B,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAO;IACL,MAAM;IACN;IACA,OAAO,OAAO,MAAM,MAAM;IAC1B,MAAM,YAAY,OAAO,MAAM,MAAM,KAAK;IAC3C;;AAEH,MAAI,KAAK,MAAM,SAAS,EAAE;GACxB,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAO;IACL,MAAM;IACN;IACA,OAAO,OAAO,MAAM,MAAM;IAC1B,MAAM,YAAY,OAAO,MAAM,MAAM,KAAK;IAC3C;;AAEH,QAAM,KAAK,MAAM,KAAK,MAAM,EAAE,kCAAgC;;CAGhE,AAAQ,gBAAgB,KAAwB;EAC9C,IAAIC,OAAmB;GAAE,MAAM;GAAY,MAAM,IAAI;GAAM;AAC3D,SAAO,MAAM;AACX,OAAI,KAAK,MAAM,aAAa,IAAI,KAAK,MAAM,SAAS,EAAE;AACpD,WAAO,KAAK,kBAAkB,KAAK;AACnC;;AAEF,OAAI,KAAK,MAAM,WAAW,EAAE;AAE1B,QAAI,KAAK,MAAM,QAAQ,EAAE;KACvB,IAAIN,MAAyB;AAC7B,SAAI,CAAC,KAAK,MAAM,WAAW,CACzB,OAAM,KAAK,WAAW;KAExB,MAAM,QAAQ,KAAK,QAAQ,YAAY,6BAA2B;AAClE,YAAO;MACL,MAAM;MACN,QAAQ;MACR,OAAO;MACP;MACA,MAAM,YAAY,KAAK,MAAM,MAAM,KAAK;MACzC;AACD;;AAGF,QAAI,KAAK,MAAM,WAAW,EAAE;KAC1B,MAAM,QAAQ,KAAK,UAAU;AAC7B,YAAO;MACL,MAAM;MACN,QAAQ;MACR,MAAM,YAAY,KAAK,MAAM,MAAM,KAAK;MACzC;AACD;;IAGF,MAAM,QAAQ,KAAK,WAAW;AAE9B,QAAI,KAAK,MAAM,QAAQ,EAAE;KACvB,IAAIA,MAAyB;AAC7B,SAAI,CAAC,KAAK,MAAM,WAAW,CACzB,OAAM,KAAK,WAAW;KAExB,MAAM,QAAQ,KAAK,QAAQ,YAAY,6BAA2B;AAClE,YAAO;MACL,MAAM;MACN,QAAQ;MACR,OAAO;MACP;MACA,MAAM,YAAY,KAAK,MAAM,MAAM,KAAK;MACzC;AACD;;IAGF,MAAM,UAAU,KAAK,QAAQ,YAAY,wCAAsC;AAC/E,WAAO;KACL,MAAM;KACN,QAAQ;KACR;KACA,MAAM,YAAY,KAAK,MAAM,QAAQ,KAAK;KAC3C;AACD;;AAEF,OAAI,KAAK,MAAM,WAAW,EAAE;IAC1B,MAAM,KAAK,KAAK,UAAU;AAC1B,WAAO;KACL,MAAM;KACN,MAAM;KACN,SAAS;MAAE,MAAM;MAAY,MAAM,GAAG;MAAM;KAC5C,MAAM,YAAY,KAAK,MAAM,GAAG,KAAK;KACtC;AACD;;AAEF;;AAEF,SAAO;;CAGT,AAAQ,iBAAiB,OAA0B;AACjD,MAAI,KAAK,MAAM,SAAS,EAAE;GACxB,MAAM,OAAO,KAAK,oBAAoB;GACtC,MAAM,UAAU,KAAK,QAAQ,UAAU,iCAA+B;AACtE,UAAO;IACL,MAAM;IACN,MAAM,OAAO,MAAM,MAAM;IACzB;IACA,MAAM,YAAY,MAAM,MAAM,QAAQ,KAAK;IAC5C;;AAEH,SAAO;GACL,MAAM;GACN,MAAM,OAAO,MAAM,MAAM;GACzB,MAAM,EAAE;GACR,MAAM,MAAM;GACb;;CAGH,AAAQ,qBAAmC;EACzC,MAAMO,OAAqB,EAAE;AAC7B,MAAI,KAAK,MAAM,SAAS,CACtB,QAAO;AAET;AACE,QAAK,KAAK,KAAK,SAAS,KAAK,CAAC;SACvB,KAAK,MAAM,YAAY;AAChC,SAAO;;CAGT,AAAQ,YAAY,OAAqB,MAAwB;AAC/D,SAAO;GAAE,MAAM;GAAW;GAAO;GAAM;;CAGzC,AAAQ,WAAW,MAAkB,OAAmB,IAA0B;AAChF,SAAO;GACL,MAAM;GACN;GACA;GACA;GACA,MAAM,YAAY,KAAK,MAAM,MAAM,KAAK;GACzC;;CAGH,AAAQ,yBAAyB,OAA0B;EACzD,MAAMC,QAAsB,CAAC;GAAE,MAAM;GAAW,OAAO,OAAO,MAAM,MAAM;GAAE,MAAM,MAAM;GAAM,CAAC;AAE/F,SAAO,MAAM;GAEX,MAAM,OAAO,KAAK,UAAU;AAC5B,SAAM,KAAK;IACT,MAAM;IACN,MAAM;IACN,OAAO;KACL,MAAM;KACN,MAAM;KACN,MAAM,EAAE;KACR,MAAM,KAAK;KACZ;IACD,MAAM,KAAK;IACZ,CAAC;AAEF,OAAI,KAAK,MAAM,eAAe,EAAE;IAC9B,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAM,KAAK;KAAE,MAAM;KAAW,OAAO,OAAO,MAAM,MAAM;KAAE,MAAM,MAAM;KAAM,CAAC;AAC7E;;AAEF,OAAI,KAAK,MAAM,YAAY,EAAE;IAC3B,MAAM,QAAQ,KAAK,UAAU;AAC7B,UAAM,KAAK;KAAE,MAAM;KAAW,OAAO,OAAO,MAAM,MAAM;KAAE,MAAM,MAAM;KAAM,CAAC;AAC7E;;AAEF,SAAM,KAAK,MAAM,KAAK,MAAM,EAAE,0DAA0D;;AAG1F,SAAO,MAAM,QAAQ,KAAK,UAAU;GAClC,MAAM;GACN,IAAI;GACJ,MAAM;GACN,OAAO;GACP,MAAM,YAAY,IAAI,MAAM,KAAK,KAAK;GACvC,EAAE;;CAGL,AAAQ,MAAM,MAA0B;AACtC,MAAI,KAAK,MAAM,KAAK,EAAE;AACpB,QAAK,SAAS;AACd,UAAO;;AAET,SAAO;;CAGT,AAAQ,QAAQ,MAAiB,SAAwB;AACvD,MAAI,KAAK,MAAM,KAAK,CAAE,QAAO,KAAK,SAAS;AAC3C,QAAM,KAAK,MAAM,KAAK,MAAM,EAAE,QAAQ;;CAGxC,AAAQ,MAAM,MAA0B;AACtC,MAAI,KAAK,SAAS,CAAE,QAAO,SAAS;AACpC,SAAO,KAAK,MAAM,CAAC,SAAS;;CAG9B,AAAQ,UAAiB;AACvB,MAAI,CAAC,KAAK,SAAS,CAAE,MAAK,WAAW;AACrC,SAAO,KAAK,UAAU;;CAGxB,AAAQ,UAAmB;AACzB,SAAO,KAAK,MAAM,CAAC,SAAS;;CAG9B,AAAQ,OAAc;AACpB,SAAO,KAAK,OAAO,KAAK,YAAY;GAAE,MAAM;GAAO,MAAM;IAAE,OAAO;IAAG,KAAK;IAAG;GAAE;;CAGjF,AAAQ,WAAkB;AACxB,SAAO,KAAK,OAAO,KAAK,UAAU,MAAM;GAAE,MAAM;GAAO,MAAM;IAAE,OAAO;IAAG,KAAK;IAAG;GAAE;;CAGrF,AAAQ,MAAM,OAAc,SAA6B;AACvD,SAAO,IAAI,WAAW,SAAS,MAAM,KAAK;;;AAI9C,MAAM,eAAe,GAAS,OAAmB;CAC/C,OAAO,KAAK,IAAI,EAAE,OAAO,EAAE,MAAM;CACjC,KAAK,KAAK,IAAI,EAAE,KAAK,EAAE,IAAI;CAC5B;;;;ACh1BD,MAAaC,WAA0C,EAAE;AAEzD,MAAa,mBAAmB,SAAsB;AACpD,KAAI,CAAC,SAAS,KAAK,MACjB,UAAS,KAAK,QAAQ,EAAE;AAE1B,UAAS,KAAK,MAAO,KAAK,KAAK;;AAGjC,MAAa,oBAAoB,UAAyB;AACxD,MAAK,MAAM,QAAQ,MACjB,iBAAgB,KAAK;;;;;;;;;;;;ACczB,MAAa,YAAY,UAA0B,EAAE,UAAU,SAAS,UAAU;;;;;;;;AASlF,MAAa,eAAe,GAAU,MAAsB;AAC1D,KAAI,MAAM,EAER,QAAO;AAET,KAAI,OAAO,MAAM,OAAO,EACtB,QAAO;AAET,KAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SACxC,QAAO,OAAO,GAAG,GAAG,EAAE;AAExB,KAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,EAAE;AACxC,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,OAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,EACjC,KAAI,CAAC,YAAY,EAAE,IAAK,EAAE,GAAI,CAAE,QAAO;AAEzC,SAAO;;AAET,KAAI,cAAc,EAAE,IAAI,cAAc,EAAE,EAAE;EACxC,MAAM,QAAQ,OAAO,KAAK,EAAE,CAAC,MAAM;EACnC,MAAM,QAAQ,OAAO,KAAK,EAAE,CAAC,MAAM;AACnC,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC1C,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;GACxC,MAAM,MAAM,MAAM;AAClB,OAAI,QAAQ,MAAM,GAAI,QAAO;AAE7B,OAAI,CAAC,YAAY,EAAE,MAAO,EAAE,KAAM,CAAE,QAAO;;AAE7C,SAAO;;AAET,QAAO;;;;;;;;;;;;AAaT,MAAa,iBAAiB,GAAU,MAAyB;AAC/D,KAAI,YAAY,GAAG,EAAE,CAAE,QAAO;CAC9B,MAAM,WAAW,SAAS,EAAE,GAAG,SAAS,EAAE;AAC1C,KAAI,aAAa,EAAG,QAAO,WAAW,IAAI,KAAK;AAE/C,KAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SACxC,QAAO,IAAI,IAAI,KAAK;AAEtB,KAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SACxC,QAAO,IAAI,IAAI,KAAK;AAEtB,KAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,EAAE;EACxC,MAAM,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,OAAO;AACxC,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG;GAC/B,MAAM,MAAM,cAAc,EAAE,IAAK,EAAE,GAAI;AACvC,OAAI,QAAQ,EAAG,QAAO;;AAExB,SAAO,EAAE,SAAS,EAAE,SAAS,KAAK;;AAEpC,KAAI,cAAc,EAAE,IAAI,cAAc,EAAE,EAAE;EACxC,MAAM,QAAQ,OAAO,KAAK,EAAE,CAAC,MAAM;EACnC,MAAM,QAAQ,OAAO,KAAK,EAAE,CAAC,MAAM;EACnC,MAAM,MAAM,KAAK,IAAI,MAAM,QAAQ,MAAM,OAAO;AAChD,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG;GAC/B,MAAM,MAAM,MAAM;GAClB,MAAM,SAAS,eAAe,KAAK,MAAM,GAAI;AAC7C,OAAI,WAAW,EAAG,QAAO;GACzB,MAAM,WAAW,cAAc,EAAE,MAAO,EAAE,KAAM;AAChD,OAAI,aAAa,EAAG,QAAO;;AAE7B,SAAO,MAAM,SAAS,MAAM,SAAS,KAAK;;AAI5C,QAAO;;AAGT,MAAM,kBAAkB,GAAW,MAA0B;AAC3D,KAAI,MAAM,EAAG,QAAO;AACpB,QAAO,IAAI,IAAI,KAAK;;AAGtB,MAAM,YAAY,UAAyB;AACzC,KAAI,UAAU,KAAM,QAAO;AAC3B,KAAI,UAAU,MAAO,QAAO;AAC5B,KAAI,UAAU,KAAM,QAAO;AAC3B,KAAI,OAAO,UAAU,SAAU,QAAO;AACtC,KAAI,OAAO,UAAU,SAAU,QAAO;AACtC,KAAI,MAAM,QAAQ,MAAM,CAAE,QAAO;AACjC,QAAO;;;;;;;;AAST,MAAa,iBAAiB,UAC5B,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;;;;;;AAQtE,MAAa,gBAAgB,UAAsC,MAAM,QAAQ,MAAM;;;;;;;;AASvF,MAAa,gBAAgB,UAAyB;AACpD,KAAI,UAAU,KAAM,QAAO;AAC3B,KAAI,OAAO,UAAU,UAAW,QAAO;AACvC,KAAI,OAAO,UAAU,SAAU,QAAO;AACtC,KAAI,OAAO,UAAU,SAAU,QAAO;AACtC,KAAI,MAAM,QAAQ,MAAM,CAAE,QAAO;AACjC,QAAO;;;;;AC7JT,MAAaC,UAAQ,OAAc,MAAY,YAAiC;AAC9E,SAAQ,KAAK,KAAK;AAClB,QAAO;;AAGT,MAAa,eAAe,QAAmC;AAC7D,KAAI,OAAO,QAAQ,YAAY,OAAO,UAAU,IAAI,CAAE,QAAO;AAC7D,KAAI,OAAO,QAAQ,YAAY,UAAU,KAAK,IAAI,CAAE,QAAO,SAAS,KAAK,GAAG;;AAI9E,MAAa,mBAAmB,UAAyB;AACvD,KAAI,UAAU,KAAM,QAAO;AAC3B,KAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,SAAS;AACxD,KAAI,OAAO,UAAU,SAAU,QAAO,MAAM,UAAU;AACtD,KAAI,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,MAAM;AAC3D,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,IAAI,MAAM,IAAI,gBAAgB,CAAC,KAAK,IAAI,CAAC;AASlD,QAAO,IANM,OAAO,KAAK,MAAM,CAAC,MAAM,CACjB,KAClB,MAEC,GAAG,KAAK,UAAU,EAAE,CAAC,GAAG,gBAAiB,MAAsB,GAAI,GACtE,CACkB,KAAK,IAAI,CAAC;;;;;ACzB/B,MAAaC,cAA6B;CACxC;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,SAAMC,OAAK,aAAa,MAAM,EAAE,MAAM,QAAQ;;EAEjD;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,SAAMA,OAAK,gBAAgB,MAAM,EAAE,MAAM,QAAQ;;EAEpD;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,OAAO,UAAU,UAAU;AAC7B,UAAMA,OAAK,OAAO,MAAM,QAAQ;AAChC;;AAEF,OAAI,OAAO,UAAU,UAAU;IAC7B,MAAM,MAAM,OAAO,MAAM;AACzB,QAAI,CAAC,OAAO,SAAS,IAAI,CACvB,OAAM,IAAI,aAAa,0BAA0B,MAAM,cAAc,KAAK;AAE5E,UAAMA,OAAK,KAAK,MAAM,QAAQ;AAC9B;;AAEF,SAAM,IAAI,aAAa,kBAAkB,aAAa,MAAM,CAAC,aAAa,KAAK;;EAElF;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,OAAO,UAAU,SAEnB,OAAMA,OAAK,MAAM,KAAK,MAAM,CAAC,QAAQ,MAAM,QAAQ;YAC1C,MAAM,QAAQ,MAAM,CAC7B,OAAMA,OAAK,MAAM,QAAQ,MAAM,QAAQ;YAC9B,UAAU,QAAQ,OAAO,UAAU,SAE5C,OAAMA,OAAK,OAAO,KAAK,MAAM,CAAC,QAAQ,MAAM,QAAQ;OAEpD,OAAM,IAAI,aAAa,yBAAyB,aAAa,MAAM,IAAI,KAAK;;EAGjF;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,aAAa;EAGrB;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,SAAMA,OAAK,SAAS,MAAM,EAAE,MAAM,QAAQ;;EAE7C;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAC3D,MAAM,IAAI,KAAK;GACf,MAAM,UAAU,WAAW,MAA+B;AACxD,YAAQ,KAAK,KAAK;IAClB,IAAIC,YAAmB;AAEvB,QAAI,MAAM,QAAQ,KAAK,EAAE;KACvB,MAAMC,SAAkB,EAAE;AAC1B,UAAK,MAAM,QAAQ,KACjB,MAAK,MAAM,cAAc,QAAQ,KAAK,CACpC,QAAO,KAAK,WAAW;AAG3B,iBAAY;eACH,cAAc,KAAK,EAAE;KAC9B,MAAMC,SAAsB,EAAE;KAC9B,MAAM,OAAO,OAAO,KAAK,KAAK,CAAC,MAAM;KACrC,IAAI,WAAW;AACf,UAAK,MAAM,OAAO,MAAM;MAEtB,MAAM,MAAO,KAAqB;MAClC,IAAIC;MACJ,IAAI,QAAQ;AACZ,WAAK,MAAM,aAAa,QAAQ,IAAI,EAAE;AACpC,iBAAU;AACV,eAAQ;;AAEV,UAAI,MACF,QAAO,OAAO;WACT;AAEL,kBAAW;AACX;;;AAGJ,SAAI,CAAC,SAAU;AACf,iBAAY;;AAGd,WAAOC,WAAS,GAAG,WAAW,KAAK,QAAQ;;AAE7C,UAAO,QAAQ,MAAM;;EAExB;CACF;;;;ACjHD,MAAaC,gBAA+B,CAC1C;CACE,MAAM;CACN,OAAO;CAEP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAK,MAAM,OAAOC,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,CACvD,OAAM,IAAI,aAAa,OAAO,QAAQ,WAAW,MAAM,gBAAgB,IAAI,EAAE,KAAK;;CAGvF,CACF;;;;ACVD,MAAa,iBAAiB,GAAU,MAAsB;AAC5D,KAAI,MAAM,EAAG,QAAO;AACpB,KAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAClC,KAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SACxC,QAAO,EAAE,SAAS,EAAE;AAEtB,KAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,CACtC,QAAO,EAAE,OAAO,UAAU,EAAE,MAAM,UAAU,cAAc,OAAO,MAAM,CAAC,CAAC;AAE3E,KAAI,cAAc,EAAE,IAAI,cAAc,EAAE,EAAE;EACxC,MAAM,OAAO,OAAO,KAAK,EAAE;AAC3B,OAAK,MAAM,OAAO,MAAM;AACtB,OAAI,CAAC,OAAO,UAAU,eAAe,KAAK,GAAG,IAAI,CAAE,QAAO;GAC1D,MAAM,OAAO,EAAE;GACf,MAAM,OAAO,EAAE;AACf,OAAI,CAAC,cAAc,MAAM,KAAK,CAAE,QAAO;;AAEzC,SAAO;;AAET,QAAO,YAAY,GAAG,EAAE;;AAG1B,MAAaC,iBAAgC;CAC3C;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAI,OAAO,UAAU,SAAU,OAAM,IAAI,aAAa,gCAAgC,KAAK;GAC3F,MAAM,SAASC,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACtD,QAAK,MAAM,OAAO,QAAQ;AACxB,QAAI,OAAO,QAAQ,SACjB,OAAM,IAAI,aAAa,oCAAoC,KAAK;AAClE,UAAMC,OAAK,MAAM,MAAM,IAAI,EAAE,MAAM,QAAQ;;;EAGhD;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,+BAA+B,KAAK;GACtF,MAAM,SAASD,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACtD,QAAK,MAAM,OAAO,QAAQ;AACxB,QAAI,OAAO,QAAQ,SAAU,OAAM,IAAI,aAAa,mCAAmC,KAAK;IAC5F,MAAME,QAAkB,EAAE;AAC1B,SAAK,MAAM,QAAQ,OAAO;AACxB,SAAI,OAAO,SAAS,SAClB,OAAM,IAAI,aAAa,iCAAiC,aAAa,KAAK,IAAI,KAAK;AAErF,WAAM,KAAK,KAAK;;AAElB,UAAMD,OAAK,MAAM,KAAK,IAAI,EAAE,MAAM,QAAQ;;;EAG/C;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAI,OAAO,UAAU,SACnB,OAAM,IAAI,aAAa,qCAAqC,KAAK;GACnE,MAAM,YAAYD,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACzD,QAAK,MAAM,UAAU,WAAW;AAC9B,QAAI,OAAO,WAAW,SACpB,OAAM,IAAI,aAAa,sCAAsC,KAAK;AACpE,UAAMC,OAAK,MAAM,WAAW,OAAO,EAAE,MAAM,QAAQ;;;EAGxD;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAI,OAAO,UAAU,SAAU,OAAM,IAAI,aAAa,mCAAmC,KAAK;GAC9F,MAAM,YAAYD,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACzD,QAAK,MAAM,UAAU,WAAW;AAC9B,QAAI,OAAO,WAAW,SACpB,OAAM,IAAI,aAAa,oCAAoC,KAAK;AAClE,UAAMC,OAAK,MAAM,SAAS,OAAO,EAAE,MAAM,QAAQ;;;EAGtD;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAC3D,MAAM,OAAOD,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACpD,QAAK,MAAM,KAAK,KACd,OAAMC,OAAK,cAAc,OAAO,EAAE,EAAE,MAAM,QAAQ;;EAGvD;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAC3D,MAAM,YAAYD,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACzD,QAAK,MAAM,UAAU,UACnB,KAAI,MAAM,QAAQ,MAAM,EAAE;IAExB,IAAIG,aAA4B;AAChC,SAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;KACrC,MAAM,MAAM,MAAM;AAClB,SAAI,QAAQ,UAAa,YAAY,KAAK,OAAO,EAAE;AACjD,mBAAa;AACb;;;AAGJ,UAAMF,OAAK,YAAY,MAAM,QAAQ;cAC5B,OAAO,UAAU,UAAU;AACpC,QAAI,OAAO,WAAW,SACpB,OAAM,IAAI,aAAa,oDAAoD,KAAK;IAClF,MAAM,MAAM,MAAM,QAAQ,OAAO;AACjC,UAAMA,OAAK,QAAQ,KAAK,OAAO,KAAK,MAAM,QAAQ;cAG9C,UAAU,KAAM,OAAMA,OAAK,MAAM,MAAM,QAAQ;OAC9C,OAAM,IAAI,aAAa,iCAAiC,KAAK;;EAIzE;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAG3D,MAAM,YAAYD,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACzD,QAAK,MAAM,UAAU,UACnB,KAAI,MAAM,QAAQ,MAAM,EAAE;IACxB,IAAIG,aAA4B;AAChC,SAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;KAC1C,MAAM,MAAM,MAAM;AAClB,SAAI,QAAQ,UAAa,YAAY,KAAK,OAAO,EAAE;AACjD,mBAAa;AACb;;;AAGJ,UAAMF,OAAK,YAAY,MAAM,QAAQ;cAC5B,OAAO,UAAU,UAAU;AACpC,QAAI,OAAO,WAAW,SACpB,OAAM,IAAI,aAAa,qDAAqD,KAAK;IACnF,MAAM,MAAM,MAAM,YAAY,OAAO;AACrC,UAAMA,OAAK,QAAQ,KAAK,OAAO,KAAK,MAAM,QAAQ;cAE9C,UAAU,KAAM,OAAMA,OAAK,MAAM,MAAM,QAAQ;OAC9C,OAAM,IAAI,aAAa,kCAAkC,KAAK;;EAI1E;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAC3D,MAAM,YAAYD,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACzD,QAAK,MAAM,UAAU,WAAW;IAC9B,MAAMI,UAAoB,EAAE;AAC5B,QAAI,MAAM,QAAQ,MAAM,CACtB,MAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;KACrC,MAAM,MAAM,MAAM;AAClB,SAAI,QAAQ,UAAa,YAAY,KAAK,OAAO,CAAE,SAAQ,KAAK,EAAE;;aAE3D,OAAO,UAAU,UAAU;AACpC,SAAI,OAAO,WAAW,SAAU,OAAM,IAAI,aAAa,0BAA0B,KAAK;AAKtF,SAAI,OAAO,WAAW,GAAG,QAElB;MACL,IAAI,MAAM;AACV,aAAO,MAAM,MAAM,QAAQ;OACzB,MAAM,MAAM,MAAM,QAAQ,QAAQ,IAAI;AACtC,WAAI,QAAQ,GAAI;AAChB,eAAQ,KAAK,IAAI;AACjB,aAAM,MAAM;AAUZ,aAAM,MAAM,OAAO;;;WAGlB;AACL,SAAI,UAAU,MAAM;AAClB,YAAMH,OAAK,MAAM,MAAM,QAAQ;AAC/B;;AAEF,WAAM,IAAI,aAAa,mCAAmC,KAAK;;AAEjE,UAAMA,OAAK,SAAS,MAAM,QAAQ;;;EAGvC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,OAAO,UAAU,SAAU,OAAM,IAAI,aAAa,0BAA0B,KAAK;AAKrF,SAAMA,OADQ,MAAM,KAAK,MAAM,CAAC,KAAK,MAAM,EAAE,YAAY,EAAE,CAAE,EAC3C,MAAM,QAAQ;;EAEnC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,yBAAyB,KAAK;GAChF,MAAMI,QAAkB,EAAE;AAC1B,QAAK,MAAM,QAAQ,OAAO;AACxB,QAAI,OAAO,SAAS,SAAU,OAAM,IAAI,aAAa,+BAA+B,KAAK;AACzF,UAAM,KAAK,OAAO,cAAc,KAAK,CAAC;;AAExC,SAAMJ,OAAK,MAAM,KAAK,GAAG,EAAE,MAAM,QAAQ;;EAE5C;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAI,OAAO,UAAU,SAAU,OAAM,IAAI,aAAa,2BAA2B,KAAK;GACtF,MAAM,YAAYD,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACzD,QAAK,MAAM,UAAU,WAAW;AAC9B,QAAI,OAAO,WAAW,SACpB,OAAM,IAAI,aAAa,oCAAoC,KAAK;AAClE,QAAI,MAAM,WAAW,OAAO,CAC1B,OAAMC,OAAK,MAAM,MAAM,OAAO,OAAO,EAAE,MAAM,QAAQ;QAErD,OAAMA,OAAK,OAAO,MAAM,QAAQ;;;EAIvC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAI,OAAO,UAAU,SAAU,OAAM,IAAI,aAAa,2BAA2B,KAAK;GACtF,MAAM,YAAYD,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACzD,QAAK,MAAM,UAAU,WAAW;AAC9B,QAAI,OAAO,WAAW,SACpB,OAAM,IAAI,aAAa,oCAAoC,KAAK;AAClE,QAAI,MAAM,SAAS,OAAO,CACxB,OAAMC,OAAK,MAAM,MAAM,GAAG,MAAM,SAAS,OAAO,OAAO,EAAE,MAAM,QAAQ;QAEvE,OAAMA,OAAK,OAAO,MAAM,QAAQ;;;EAIvC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,OAAO,UAAU,SAAU,OAAM,IAAI,aAAa,iCAAiC,KAAK;AAC5F,SAAMA,OAAK,MAAM,aAAa,EAAE,MAAM,QAAQ;;EAEjD;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,OAAO,UAAU,SAAU,OAAM,IAAI,aAAa,+BAA+B,KAAK;AAC1F,SAAMA,OAAK,MAAM,aAAa,EAAE,MAAM,QAAQ;;EAEjD;CACF;;;;ACnRD,SAAS,WAAc,KAAU,WAAsC;AACrE,QAAO,IACJ,KAAK,MAAM,WAAW;EAAE;EAAM;EAAO,EAAE,CACvC,MAAM,GAAG,MAAM;EACd,MAAM,MAAMK,UAAQ,EAAE,MAAM,EAAE,KAAK;AACnC,SAAO,QAAQ,IAAI,MAAM,EAAE,QAAQ,EAAE;GACrC,CACD,KAAK,MAAM,EAAE,KAAK;;AAGvB,MAAaC,qBAAoC;CAC/C;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,MAAM,QAAQ,MAAM,CAEtB,OAAMC,OADU,MAAM,KAAK,EAAE,QAAQ,MAAM,QAAQ,GAAG,GAAG,MAAM,EAAE,EAC7C,MAAM,QAAQ;YACzB,UAAU,QAAQ,OAAO,UAAU,SAE5C,OAAMA,OADa,OAAO,KAAK,MAAM,CAAC,MAAM,EACrB,MAAM,QAAQ;OAErC,OAAM,IAAI,aAAa,mCAAmC,KAAK;;EAGpE;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAC3D,MAAM,YAAY,KAAK;AACvB,QAAK,MAAM,OAAOC,WAAS,WAAW,OAAO,KAAK,QAAQ,CACxD,KAAI,MAAM,QAAQ,MAAM,EAAE;IACxB,MAAM,MAAM,YAAY,IAAI;AAC5B,UAAMD,OAAK,QAAQ,UAAa,OAAO,KAAK,MAAM,MAAM,QAAQ,MAAM,QAAQ;cACrE,UAAU,QAAQ,OAAO,UAAU,UAAU;IACtD,IAAIE;AACJ,QAAI,OAAO,QAAQ,SAAU,UAAS;aAC7B,OAAO,QAAQ,SAAU,UAAS,IAAI,UAAU;QAEvD,OAAM,IAAI,aAAa,uDAAuD,KAAK;AAErF,UAAMF,OAAK,OAAO,UAAU,eAAe,KAAK,OAAO,OAAO,EAAE,MAAM,QAAQ;SAE9E,OAAM,IAAI,aAAa,0CAA0C,KAAK;;EAI7E;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,wBAAwB,KAAK;GAC/E,MAAMG,SAAkB,EAAE;GAC1B,MAAM,SAAS,KAAK;AACpB,QAAK,MAAM,QAAQ,OAAO;AACxB,YAAQ,KAAK,KAAK;AAClB,SAAK,MAAM,UAAUF,WAAS,QAAQ,MAAM,KAAK,QAAQ,CACvD,QAAO,KAAK,OAAO;;AAGvB,SAAMD,OAAK,QAAQ,MAAM,QAAQ;;EAEpC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAC3D,MAAM,SAAS,KAAK;AACpB,QAAK,MAAM,OAAOC,WAAS,QAAQ,OAAO,KAAK,QAAQ,CACrD,KAAI,SAAS,IAAI,EAAE;AACjB,UAAMD,OAAK,OAAO,MAAM,QAAQ;AAChC;;;EAIP;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,yBAAyB,KAAK;GAChF,MAAM,SAAS,WAAW,QAAQ,GAAG,MAAM,cAAc,GAAG,EAAE,CAAC;AAC/D,WAAQ,KAAK,KAAK;AAClB,SAAMA,OAAK,QAAQ,MAAM,QAAQ;;EAEpC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,4BAA4B,KAAK;GACnF,MAAM,SAAS,KAAK;GAEpB,MAAMI,QAAsC,EAAE;AAC9C,QAAK,MAAM,QAAQ,OAAO;AACxB,YAAQ,KAAK,KAAK;IAClB,MAAM,OAAO,MAAM,KAAKH,WAAS,QAAQ,MAAM,KAAK,QAAQ,CAAC;AAC7D,QAAI,KAAK,WAAW,EAClB,OAAM,IAAI,aAAa,wDAAwD,KAAK;AACtF,UAAM,KAAK;KAAE,KAAK;KAAM,KAAK,KAAK;KAAK,CAAC;;AAG1C,SAAMD,OADS,WAAW,QAAQ,GAAG,MAAM,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC,CAE9D,KAAK,MAAM,EAAE,IAAI,EACxB,MACA,QACD;;EAEJ;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,2BAA2B,KAAK;GAClF,MAAMK,OAAgB,EAAE;GACxB,MAAMF,SAAkB,EAAE;AAC1B,QAAK,MAAM,QAAQ,OAAO;AACxB,YAAQ,KAAK,KAAK;AAClB,QAAI,CAAC,KAAK,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,EAAE;AAC3C,UAAK,KAAK,KAAK;AACf,YAAO,KAAK,KAAK;;;AAGrB,SAAMH,OAAK,QAAQ,MAAM,QAAQ;;EAEpC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,8BAA8B,KAAK;GACrF,MAAM,SAAS,KAAK;GACpB,MAAMM,WAAoB,EAAE;GAC5B,MAAMH,SAAkB,EAAE;AAC1B,QAAK,MAAM,QAAQ,OAAO;AACxB,YAAQ,KAAK,KAAK;IAClB,MAAM,OAAO,MAAM,KAAKF,WAAS,QAAQ,MAAM,KAAK,QAAQ,CAAC;AAC7D,QAAI,KAAK,WAAW,EAClB,OAAM,IAAI,aAAa,0DAA0D,KAAK;IACxF,MAAM,MAAM,KAAK;AACjB,QAAI,CAAC,SAAS,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE;AAC9C,cAAS,KAAK,IAAI;AAClB,YAAO,KAAK,KAAK;;;AAGrB,SAAMD,OAAK,QAAQ,MAAM,QAAQ;;EAEpC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,MAAM,QAAQ,MAAM,CAEtB,OAAMA,OADS,MAAM,KAAK,GAAG,OAAO;IAAE,KAAK;IAAG,OAAO;IAAG,EAAE,EACvC,MAAM,QAAQ;YACxB,UAAU,QAAQ,OAAO,UAAU,SAI5C,OAAMA,OAHO,OAAO,KAAK,MAAM,CAAC,MAAM,CAElB,KAAK,OAAO;IAAE,KAAK;IAAG,OAAQ,MAAsB;IAAK,EAAE,EAC5D,MAAM,QAAQ;OAEjC,OAAM,IAAI,aAAa,sCAAsC,KAAK;;EAGvE;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,iCAAiC,KAAK;GACxF,MAAMO,SAAsB,EAAE;AAC9B,QAAK,MAAM,QAAQ,OAAO;AACxB,YAAQ,KAAK,KAAK;AAClB,QAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,KAAK,CAClE,OAAM,IAAI,aAAa,yCAAyC,KAAK;IAEvE,MAAM,MAAM;AACZ,QAAI,EAAE,SAAS,QAAQ,EAAE,WAAW,KAClC,OAAM,IAAI,aAAa,sDAAkD,KAAK;IAEhF,MAAM,MAAM,IAAI;AAChB,QAAI,OAAO,QAAQ,SACjB,OAAM,IAAI,aAAa,4CAA4C,KAAK;AAE1E,WAAO,OAAO,IAAI;;AAEpB,SAAMP,OAAK,QAAQ,MAAM,QAAQ;;EAEpC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAE3D,IAAIQ;AACJ,OAAI,MAAM,QAAQ,MAAM,CACtB,WAAU,MAAM,KAAK,GAAG,OAAO;IAAE,KAAK;IAAG,OAAO;IAAG,EAAE;YAC5C,UAAU,QAAQ,OAAO,UAAU,SAG5C,WAFa,OAAO,KAAK,MAAM,CAAC,MAAM,CAEvB,KAAK,OAAO;IAAE,KAAK;IAAG,OAAQ,MAAsB;IAAK,EAAE;OAE1E,OAAM,IAAI,aAAa,wCAAwC,KAAK;GAItE,MAAMC,cAAuB,EAAE;GAC/B,MAAM,SAAS,KAAK;AACpB,QAAK,MAAM,SAAS,SAAS;AAC3B,YAAQ,KAAK,KAAK;AAClB,SAAK,MAAM,UAAUR,WAAS,QAAQ,OAAO,KAAK,QAAQ,CACxD,aAAY,KAAK,OAAO;;GAK5B,MAAMM,SAAsB,EAAE;AAC9B,QAAK,MAAM,QAAQ,aAAa;AAC9B,QAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,KAAK,CAClE,OAAM,IAAI,aAAa,4CAA4C,KAAK;IAE1E,MAAM,MAAM;AACZ,QAAI,EAAE,SAAS,QAAQ,EAAE,WAAW,KAClC,OAAM,IAAI,aAAa,sDAAkD,KAAK;IAEhF,MAAM,MAAM,IAAI;AAChB,QAAI,OAAO,QAAQ,SACjB,OAAM,IAAI,aAAa,qCAAqC,KAAK;AAEnE,WAAO,OAAO,IAAI;;AAEpB,SAAMP,OAAK,QAAQ,MAAM,QAAQ;;EAEpC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,6BAA6B,KAAK;GAEpF,MAAMI,QAAsC,EAAE;GAC9C,MAAM,SAAS,KAAK;AACpB,QAAK,MAAM,QAAQ,OAAO;AACxB,YAAQ,KAAK,KAAK;IAClB,MAAM,OAAO,MAAM,KAAKH,WAAS,QAAQ,MAAM,KAAK,QAAQ,CAAC;AAC7D,QAAI,KAAK,WAAW,EAClB,OAAM,IAAI,aAAa,yDAAyD,KAAK;AACvF,UAAM,KAAK;KAAE,KAAK;KAAM,KAAK,KAAK;KAAK,CAAC;;GAG1C,MAAM,SAAS,WAAW,QAAQ,GAAG,MAAM,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC;GAGvE,MAAMS,SAAoB,EAAE;AAC5B,OAAI,OAAO,SAAS,GAAG;IACrB,IAAIC,eAAwB,CAAC,OAAO,GAAI,IAAI;IAC5C,IAAI,aAAa,OAAO,GAAI;AAC5B,SAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;KACtC,MAAM,OAAO,OAAO;AACpB,SAAI,cAAc,KAAK,KAAK,WAAW,KAAK,EAC1C,cAAa,KAAK,KAAK,IAAI;UACtB;AACL,aAAO,KAAK,aAAa;AACzB,qBAAe,CAAC,KAAK,IAAI;AACzB,mBAAa,KAAK;;;AAGtB,WAAO,KAAK,aAAa;;AAE3B,SAAMX,OAAK,QAAQ,MAAM,QAAQ;;EAEpC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,4BAA4B,KAAK;AACnF,SAAMA,OAAK,CAAC,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,QAAQ;;EAElD;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,4BAA4B,KAAK;GACnF,MAAM,cAAc,QAA0B;IAC5C,IAAIY,MAAe,EAAE;AACrB,SAAK,MAAM,QAAQ,IACjB,KAAI,MAAM,QAAQ,KAAK,CACrB,OAAM,IAAI,OAAO,WAAW,KAAK,CAAC;QAElC,KAAI,KAAK,KAAK;AAGlB,WAAO;;AAET,SAAMZ,OAAK,WAAW,MAAM,EAAE,MAAM,QAAQ;;EAE/C;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,4BAA4B,KAAK;GACnF,MAAM,SAASC,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACtD,QAAK,MAAM,YAAY,QAAQ;AAC7B,QAAI,OAAO,aAAa,SACtB,OAAM,IAAI,aAAa,kCAAkC,KAAK;IAChE,MAAM,gBAAgB,KAAc,MAAuB;AACzD,SAAI,KAAK,EAAG,QAAO;KACnB,IAAIW,MAAe,EAAE;AACrB,UAAK,MAAM,QAAQ,IACjB,KAAI,MAAM,QAAQ,KAAK,CACrB,OAAM,IAAI,OAAO,aAAa,MAAM,IAAI,EAAE,CAAC;SAE3C,KAAI,KAAK,KAAK;AAGlB,YAAO;;AAET,UAAMZ,OAAK,aAAa,OAAO,SAAS,EAAE,MAAM,QAAQ;;;EAG7D;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,MAAM,QAAQ,MAAM,CAEtB,OAAMA,OADU,MAAM,KAAK,EAAE,QAAQ,MAAM,QAAQ,GAAG,GAAG,MAAM,EAAE,EAC7C,MAAM,QAAQ;YACzB,UAAU,QAAQ,OAAO,UAAU,SAE5C,OAAMA,OADO,OAAO,KAAK,MAAM,EACd,MAAM,QAAQ;OAE/B,OAAM,IAAI,aAAa,4CAA4C,KAAK;;EAG7E;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,8BAA8B,KAAK;GACrF,MAAM,MAAM;AACZ,OAAI,IAAI,WAAW,GAAG;AACpB,UAAMA,OAAK,EAAE,EAAE,MAAM,QAAQ;AAC7B;;GAGF,IAAI,SAAS;AACb,QAAK,MAAM,OAAO,KAAK;AACrB,QAAI,CAAC,MAAM,QAAQ,IAAI,CACrB,OAAM,IAAI,aAAa,2CAA2C,KAAK;AACzE,QAAI,IAAI,SAAS,OAAQ,UAAS,IAAI;;GAGxC,MAAMa,SAAoB,EAAE;AAC5B,QAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;IAC/B,MAAMC,SAAkB,EAAE;AAC1B,SAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;KACnC,MAAM,MAAM,IAAI;KAChB,MAAM,MAAM,IAAI,IAAI,SAAS,IAAI,KAAM;AACvC,YAAO,KAAK,IAAI;;AAElB,WAAO,KAAK,OAAO;;AAErB,SAAMd,OAAK,QAAQ,MAAM,QAAQ;;EAEpC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,4BAA4B,KAAK;GACnF,MAAM,YAAYC,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACzD,QAAK,MAAM,UAAU,WAAW;IAC9B,IAAI,MAAM;IACV,IAAI,OAAO,MAAM,SAAS;IAC1B,IAAI,MAAM;AACV,WAAO,OAAO,MAAM;KAClB,MAAM,MAAM,KAAK,OAAO,MAAM,QAAQ,EAAE;KACxC,MAAM,MAAM,cAAc,MAAM,MAAO,OAAO;AAC9C,SAAI,QAAQ,GAAG;AACb,YAAM;AACN;gBACS,MAAM,EACf,OAAM,MAAM;SAEZ,QAAO,MAAM;;AAGjB,QAAI,QAAQ,GACV,OAAMD,OAAK,KAAK,MAAM,QAAQ;QAE9B,OAAMA,OAAK,CAAC,MAAM,GAAG,MAAM,QAAQ;;;EAI1C;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,iCAAiC,KAAK;AACxF,OAAI,MAAM,MAAM,MAAM,CAAC,MAAM,QAAQ,EAAE,CAAC,CACtC,OAAM,IAAI,aAAa,8CAA8C,KAAK;GAE5E,MAAM,SAAS;AACf,OAAI,OAAO,WAAW,GAAG;AACvB,UAAMA,OAAK,EAAE,EAAE,MAAM,QAAQ;AAC7B;;GAGF,MAAM,SAAS,WAAW,KAAa,SAAsC;AAC3E,QAAI,QAAQ,OAAO,QAAQ;AACzB,WAAM,CAAC,GAAG,QAAQ;AAClB;;IAEF,MAAM,MAAM,OAAO;AACnB,QAAI,IAAI,WAAW,EAAG;AACtB,SAAK,MAAM,QAAQ,KAAK;AACtB,aAAQ,KAAK,KAAK;AAClB,YAAO,OAAO,MAAM,GAAG,QAAQ;AAC/B,aAAQ,KAAK;;;AAIjB,QAAK,MAAM,SAAS,OAAO,GAAG,EAAE,CAAC,CAC/B,OAAMA,OAAK,OAAO,MAAM,QAAQ;;EAGrC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,iCAAiC,KAAK;GACxF,MAAM,OAAOC,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACpD,QAAK,MAAM,QAAQ,MAAM;AACvB,QAAI,OAAO,SAAS,SAClB,OAAM,IAAI,aAAa,0CAA0C,KAAK;AAExE,QAAI,SAAS,GAAG;AACd,WAAMD,OAAK,EAAE,EAAE,MAAM,QAAQ;AAC7B;;IAEF,MAAMe,SAAoB,EAAE;AAC5B,SAAK,IAAI,IAAI,GAAG,IAAI,MAAM,IAAK,QAAO,KAAK,MAAM;IAEjD,MAAM,SAAS,WAAW,KAAa,SAAsC;AAC3E,SAAI,QAAQ,OAAO,QAAQ;AACzB,YAAM,CAAC,GAAG,QAAQ;AAClB;;KAEF,MAAM,MAAM,OAAO;AACnB,UAAK,MAAM,QAAQ,KAAK;AACtB,cAAQ,KAAK,KAAK;AAClB,aAAO,OAAO,MAAM,GAAG,QAAQ;AAC/B,cAAQ,KAAK;;;AAGjB,QAAI,MAAM,WAAW,KAAK,OAAO,GAAG,OAGlC,MAAK,MAAM,SAAS,OAAO,GAAG,EAAE,CAAC,CAC/B,OAAMf,OAAK,OAAO,MAAM,QAAQ;;;EAKzC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAC3D,MAAM,OAAOC,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACpD,QAAK,MAAM,KAAK,KACd,OAAMD,OAAK,cAAc,GAAG,MAAM,EAAE,MAAM,QAAQ;;EAGvD;CACF;;;;;;;;;;;;;;ACzdD,MAAa,eAAe,WAC1B,MACA,OACA,KACA,SACA,YACgC;AAChC,SAAQ,KAAK,MAAb;EACE,KAAK;AACH,SAAM,EAAE;AACR;EACF,KAAK;AACH,QAAK,MAAM,UAAU,aAAa,KAAK,QAAQ,OAAO,KAAK,SAASgB,WAAS,CAC3E,OAAM,CAAC,GAAG,QAAQ,KAAK,MAAM;AAE/B;EACF,KAAK,eAAe;GAClB,MAAM,cAAc,MAAM,KAAK,aAAa,KAAK,QAAQ,OAAO,KAAK,SAASA,WAAS,CAAC;GACxF,MAAM,SAASA,WAAS,KAAK,OAAO,OAAO,KAAK,QAAQ;AACxD,QAAK,MAAM,UAAU,QAAQ;IAC3B,IAAIC;AACJ,QAAI,OAAO,WAAW,SAAU,OAAM;aAC7B,OAAO,WAAW,YAAY,OAAO,UAAU,OAAO,CAAE,OAAM;QAClE,OAAM,IAAI,aAAa,wCAAwC,KAAK,KAAK;AAE9E,SAAK,MAAM,UAAU,YACnB,OAAM,CAAC,GAAG,QAAQ,IAAI;;AAG1B;;EAEF,KAAK,QAAQ;GAOX,MAAM,YAAY,MAAM,KAAK,aAAa,KAAK,MAAM,OAAO,KAAK,SAASD,WAAS,CAAC;AACpF,QAAK,MAAM,KAAK,WAAW;IACzB,MAAM,MAAM,QAAQ,OAAO,EAAE,IAAI;AACjC,SAAK,MAAM,KAAK,aAAa,KAAK,OAAO,KAAK,KAAK,SAASA,WAAS,CACnE,OAAM,CAAC,GAAG,GAAG,GAAG,EAAE;;AAGtB;;EAEF,KAAK;AACH,UAAO,aAAa,KAAK,MAAM,OAAO,KAAK,SAASA,WAAS;AAC7D,UAAO,aAAa,KAAK,OAAO,OAAO,KAAK,SAASA,WAAS;AAC9D;EACF,KAAK,WAAW;GACd,MAAM,cAAc,MAAM,KAAK,aAAa,KAAK,QAAQ,OAAO,KAAK,SAASA,WAAS,CAAC;AACxF,QAAK,MAAM,KAAK,aAAa;IAC3B,MAAM,MAAM,QAAQ,OAAO,EAAE;AAC7B,QAAI,MAAM,QAAQ,IAAI,CACpB,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,IAC9B,OAAM,CAAC,GAAG,GAAG,EAAE;aAER,QAAQ,QAAQ,OAAO,QAAQ,SAExC,MAAK,MAAM,OAAO,OAAO,KAAK,IAAI,CAChC,OAAM,CAAC,GAAG,GAAG,IAAI;SAEd;AAEL,SAAI,QAAQ,KAAM;AAClB,WAAM,IAAI,aAAa,uBAAuB,OAAO,OAAO,KAAK,KAAK;;;AAG1E;;EAEF,KAAK;AACH,OAAI,KAAK,SAAS,UAAU;IAC1B,MAAM,QAAQA,WAAS,KAAK,KAAK,IAAK,OAAO,KAAK,QAAQ;IAC1D,IAAI,UAAU;AACd,SAAK,MAAM,KAAK,MACd,KAAI,MAAM,QAAQ,MAAM,MACtB,WAAU;AAGd,QAAI,QAAS,OAAM,EAAE;AACrB;;AAEF,SAAM,IAAI,aAAa,YAAY,KAAK,KAAK,oCAAoC,KAAK,KAAK;EAC7F,QACE,OAAM,IAAI,aAAa,2BAA2B,KAAK,KAAK;;;;;;AC9FlE,UAAU,cACR,MACA,aACA,MACA,SACkB;AAClB,SAAQ,KAAK,KAAK;AAOlB,KALE,SAAS,QACT,OAAO,SAAS,YACf,MAAM,QAAQ,KAAK,IAAI,KAAK,WAAW,KACvC,cAAc,KAAK,IAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAE3C;AACV,QAAME,OAAK,CAAC,GAAG,YAAY,EAAE,MAAM,QAAQ;AAC3C;;AAGF,KAAI,MAAM,QAAQ,KAAK,CACrB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,QAAO,cAAc,KAAK,IAAK,CAAC,GAAG,aAAa,EAAE,EAAE,MAAM,QAAQ;UAE3D,cAAc,KAAK,EAAE;EAC9B,MAAM,OAAO,OAAO,KAAK,KAAK,CAAC,MAAM;AACrC,OAAK,MAAM,OAAO,KAEhB,QAAO,cAAe,KAAqB,MAAO,CAAC,GAAG,aAAa,IAAI,EAAE,MAAM,QAAQ;;;AAK7F,MAAM,UAAU,QAA2C;AACzD,KAAI,CAAC,MAAM,QAAQ,IAAI,CAAE,QAAO;AAChC,QAAO,IAAI,OAAO,MAAM,OAAO,MAAM,YAAa,OAAO,MAAM,YAAY,OAAO,UAAU,EAAE,CAAE;;AAGlG,MAAa,cAAc,KAAY,SAAoC;AACzE,KAAI,OAAO,IAAI,CAAE,QAAO;AACxB,OAAM,IAAI,aAAa,gDAAgD,KAAK;;AAG9E,MAAa,WAAW,MAAa,SAAiD;CACpF,IAAI,OAAO;AACX,MAAK,MAAM,QAAQ,MAAM;AACvB,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,OAAO,SAAS,YAAY,cAAc,KAAK,EAAE;AACnD,OAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,KAAK,CAAE,QAAO;AAE9D,UAAQ,KAAqB;aACpB,OAAO,SAAS,YAAY,MAAM,QAAQ,KAAK,EAAE;AAC1D,OAAI,OAAO,KAAK,QAAQ,KAAK,OAAQ,QAAO;AAC5C,UAAO,KAAK;QAEZ;;AAGJ,QAAO;;AAGT,MAAa,cACX,MACA,MACA,UACA,MACA,QAAQ,MACc;AACtB,KAAI,KAAK,WAAW,EAClB,QAAO,SAAS,KAAK;CAEvB,MAAM,CAAC,MAAM,GAAG,QAAQ;AAExB,KAAI,OAAO,SAAS,UAAU;EAC5B,IAAIC,MAA6B,EAAE;AACnC,MAAI,cAAc,KAAK,CACrB,OAAM,EAAE,GAAG,MAAM;WACR,SAAS,KAClB,OAAM,EAAE;MAER,OAAM,IAAI,aAAa,gBAAgB,aAAa,KAAK,CAAC,gBAAgB,KAAK,IAAI,KAAK;EAI1F,MAAM,SAAS,YADD,OAAO,UAAU,eAAe,KAAK,KAAK,KAAK,GAAG,IAAI,QAAS,WAC1C,MAAM,MAAM,UAAU,MAAM,QAAQ,EAAE;AACzE,MAAI,WAAW,OACb,QAAO,IAAI;MAEX,KAAI,QAAQ;AAEd,SAAO;;AAGT,KAAI,OAAO,SAAS,UAAU;EAC5B,IAAIC,MAAe,EAAE;AACrB,MAAI,MAAM,QAAQ,KAAK,CACrB,OAAM,CAAC,GAAG,KAAK;WACN,SAAS,KAClB,OAAM,EAAE;MAER,OAAM,IAAI,aAAa,gBAAgB,aAAa,KAAK,CAAC,eAAe,QAAQ,KAAK;EAGxF,MAAM,MAAM,OAAO,IAAI,IAAI,SAAS,OAAO;AAC3C,MAAI,MAAM,EAAG,OAAM,IAAI,aAAa,0BAA0B,KAAK;EAGnE,MAAM,SAAS,YADD,MAAM,IAAI,SAAS,IAAI,OAAO,SACT,MAAM,MAAM,UAAU,MAAM,QAAQ,EAAE;AAEzE,MAAI,WAAW,OACb,KAAI,OAAO,IAAI,QAAQ;AACrB,UAAO,IAAI,SAAS,IAAK,KAAI,KAAK,KAAK;AACvC,OAAI,KAAK,OAAQ;QAEjB,KAAI,OAAO;WAGT,OAAO,IAAI,QAAQ;AACrB,UAAO,IAAI,SAAS,IAAK,KAAI,KAAK,KAAK;AACvC,OAAI,KAAK,OAAO;QAEhB,KAAI,OAAO;AAGf,SAAO;;AAGT,OAAM,IAAI,aAAa,0CAA0C,KAAK;;AAGxE,MAAa,eAAe,MAAa,OAA8B,SAAsB;AAC3F,KAAI,MAAM,MAAM,MAAM,EAAE,WAAW,EAAE,CAAE,QAAO;AAE9C,KAAI,cAAc,KAAK,EAAE;EACvB,MAAMC,SAAsB,EAAE,GAAG,MAAM;EACvC,MAAM,gBAAgB,MAAM,QAAQ,MAAM,EAAE,SAAS,KAAK,OAAO,EAAE,OAAO,SAAS;EAEnF,MAAMC,QAA+C,EAAE;AACvD,OAAK,MAAM,KAAK,eAAe;GAC7B,MAAM,MAAM,EAAE;AACd,OAAI,CAAC,MAAM,KAAM,OAAM,OAAO,EAAE;AAChC,SAAM,KAAK,KAAK,EAAE,MAAM,EAAE,CAAC;;AAG7B,OAAK,MAAM,OAAO,OAAO,KAAK,MAAM,EAAE;GACpC,MAAM,QAAQ,MAAM;AACpB,OAAI,MAAM,MAAM,MAAM,EAAE,WAAW,EAAE,CACnC,QAAO,OAAO;OAGd,QAAO,OAAO,YAAa,KAAqB,MAAO,OAAO,KAAK;;AAGvE,SAAO;;AAGT,KAAI,MAAM,QAAQ,KAAK,EAAE;EACvB,MAAM,gBAAgB,MAAM,QAAQ,MAAM,EAAE,SAAS,KAAK,OAAO,EAAE,OAAO,SAAS;EAEnF,MAAMC,UAAiD,EAAE;AACzD,OAAK,MAAM,KAAK,eAAe;GAC7B,IAAI,MAAM,EAAE;AACZ,OAAI,MAAM,EAAG,OAAM,KAAK,SAAS;AACjC,OAAI,MAAM,KAAK,OAAO,KAAK,OAAQ;AACnC,OAAI,CAAC,QAAQ,KAAM,SAAQ,OAAO,EAAE;AACpC,WAAQ,KAAM,KAAK,EAAE,MAAM,EAAE,CAAC;;EAGhC,MAAMC,WAAoB,EAAE;AAC5B,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,QAAQ,QAAQ;AACtB,OAAI,MACF,KAAI,MAAM,MAAM,MAAM,EAAE,WAAW,EAAE,CACnC;OAEA,UAAS,KAAK,YAAY,KAAK,IAAK,OAAO,KAAK,CAAC;OAGnD,UAAS,KAAK,KAAK,GAAI;;AAG3B,SAAO;;AAGT,QAAO;;AAKT,MAAaC,eAA8B;CACzC;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,UAAO,cAAc,OAAO,EAAE,EAAE,MAAM,QAAQ;;EAEjD;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,QAAK,MAAM,WAAWC,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,CAG3D,OAAMR,OADM,QAAQ,OADP,WAAW,SAAS,KAAK,CACN,IACd,MAAM,MAAM,QAAQ;;EAG3C;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAC3D,MAAM,QAAQ,MAAM,KAAKQ,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,CAAC;GACjE,MAAM,SAAS,MAAM,KAAKA,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,CAAC;AAClE,QAAK,MAAM,WAAW,OAAO;IAC3B,MAAM,OAAO,WAAW,SAAS,KAAK;AACtC,SAAK,MAAM,OAAO,OAEhB,OAAMR,OADM,WAAW,OAAO,YAAY,KAAK,KAAK,IAClC,MAAM,MAAM,QAAQ;;;EAI7C;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,QAAK,MAAM,YAAYQ,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,EAAE;AAC9D,QAAI,CAAC,MAAM,QAAQ,SAAS,CAC1B,OAAM,IAAI,aAAa,sCAAsC,KAAK;AAGpE,UAAMR,OADM,YAAY,OADV,SAAS,KAAK,MAAM,WAAW,GAAG,KAAK,CAAC,EAChB,KAAK,EAC3B,MAAM,QAAQ;;;EAGnC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAG3D,QAAK,MAAM,KAAK,aAAa,KAAK,IAAK,OAAO,KAAK,SAASQ,WAAS,CACnE,OAAMR,OAAK,GAAG,MAAM,QAAQ;;EAGjC;CACF;;;;AC1PD,MAAaS,mBAAkC;CAE7C;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAE3D,MAAM,OAAOC,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACpD,QAAK,MAAM,OAAO,MAAM;AACtB,QAAI,OAAO,QAAQ,SAAU,OAAM,IAAI,aAAa,yBAAyB,KAAK;AAClF,SAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IACvB,OAAMC,OAAK,GAAG,MAAM,QAAQ;;;EAInC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAE3D,MAAM,SAAS,MAAM,KAAKD,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,CAAC;GAClE,MAAM,OAAO,MAAM,KAAKA,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,CAAC;AAChE,QAAK,MAAM,SAAS,OAClB,MAAK,MAAM,OAAO,MAAM;AACtB,QAAI,OAAO,UAAU,YAAY,OAAO,QAAQ,SAC9C,OAAM,IAAI,aAAa,yBAAyB,KAAK;AACvD,QAAI,QAAQ,IACV,MAAK,IAAI,IAAI,OAAO,IAAI,KAAK,IAC3B,OAAMC,OAAK,GAAG,MAAM,QAAQ;;;EAQvC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAE3D,MAAM,SAAS,MAAM,KAAKD,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,CAAC;GAClE,MAAM,OAAO,MAAM,KAAKA,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,CAAC;GAChE,MAAM,QAAQ,MAAM,KAAKA,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,CAAC;AAEjE,QAAK,MAAM,SAAS,OAClB,MAAK,MAAM,OAAO,KAChB,MAAK,MAAM,QAAQ,OAAO;AACxB,QAAI,OAAO,UAAU,YAAY,OAAO,QAAQ,YAAY,OAAO,SAAS,SAC1E,OAAM,IAAI,aAAa,yBAAyB,KAAK;AAEvD,QAAI,SAAS,EAAG,OAAM,IAAI,aAAa,6BAA6B,KAAK;AAEzE,QAAI,OAAO,EACT,MAAK,IAAI,IAAI,OAAO,IAAI,KAAK,KAAK,KAChC,OAAMC,OAAK,GAAG,MAAM,QAAQ;QAG9B,MAAK,IAAI,IAAI,OAAO,IAAI,KAAK,KAAK,KAChC,OAAMA,OAAK,GAAG,MAAM,QAAQ;;;EAOzC;CAGD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAE3D,MAAM,SAASD,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACtD,QAAK,MAAM,KAAK,QAAQ;AACtB,QAAI,OAAO,MAAM,SAAU,OAAM,IAAI,aAAa,wBAAwB,KAAK;IAC/E,IAAI,QAAQ;AACZ,QAAI,IAAI,EACN,MAAK,MAAM,OAAOA,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,EAAE;AACzD,WAAM;AACN;AACA,SAAI,SAAS,EAAG;;;;EAKzB;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU;AAErD,QAAK,MAAM,OAAOA,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,EAAE;AACzD,UAAM;AACN;;;EAGL;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU;GAErD,IAAIE;GACJ,IAAI,QAAQ;AACZ,QAAK,MAAM,OAAOF,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,EAAE;AACzD,cAAU;AACV,YAAQ;;AAEV,OAAI,MAAO,OAAM;;EAEpB;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAE3D,MAAM,UAAUA,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;AACvD,QAAK,MAAM,KAAK,SAAS;AACvB,QAAI,OAAO,MAAM,SAAU,OAAM,IAAI,aAAa,sBAAsB,KAAK;IAC7E,IAAI,QAAQ;AACZ,SAAK,MAAM,OAAOA,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,EAAE;AACzD,SAAI,UAAU,GAAG;AACf,YAAM;AACN;;AAEF;;;;EAIP;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAE3D,IAAI,QAAQ;AAEZ,QAAK,MAAM,KAAKA,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,EAAE;AACvD,YAAQ;AACR;;AAEF,SAAMC,OAAK,OAAO,MAAM,QAAQ;;EAEnC;CAGD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAE3D,IAAI,SAAS;AACb,QAAK,MAAM,OAAOD,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,CACvD,KAAI,CAAC,SAAS,IAAI,EAAE;AAClB,aAAS;AACT;;AAGJ,SAAMC,OAAK,QAAQ,MAAM,QAAQ;;EAEpC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAE3D,IAAI,SAAS;AACb,QAAK,MAAM,OAAOD,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ,CACvD,KAAI,SAAS,IAAI,EAAE;AACjB,aAAS;AACT;;AAGJ,SAAMC,OAAK,QAAQ,MAAM,QAAQ;;EAEpC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAE3D,MAAM,MAAM,WAAW,MAA+B;AACpD,UAAMA,OAAK,MAAM,MAAM,QAAQ;IAC/B,MAAM,QAAQD,WAAS,KAAK,IAAK,MAAM,KAAK,QAAQ;AACpD,SAAK,MAAM,QAAQ,MACjB,QAAO,IAAI,KAAK;;AAGpB,UAAO,IAAI,MAAM;;EAEpB;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAC3D,MAAM,WAAW,KAAK;GACtB,MAAM,aAAa,KAAK;GACxB,MAAM,MAAM,WAAW,MAA+B;AACpD,YAAQ,KAAK,KAAK;IAClB,IAAI,cAAc;AAClB,SAAK,MAAM,KAAKA,WAAS,UAAU,MAAM,KAAK,QAAQ,CACpD,KAAI,SAAS,EAAE,EAAE;AACf,mBAAc;AACd;;AAIJ,QAAI,aAAa;AACf,WAAMC,OAAK,MAAM,MAAM,QAAQ;AAC/B,UAAK,MAAM,QAAQD,WAAS,YAAY,MAAM,KAAK,QAAQ,CACzD,QAAO,IAAI,KAAK;;;AAItB,UAAO,IAAI,MAAM;;EAEpB;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;GAC3D,MAAM,WAAW,KAAK;GACtB,MAAM,aAAa,KAAK;GACxB,MAAM,MAAM,WAAW,MAA+B;AACpD,YAAQ,KAAK,KAAK;IAClB,IAAI,cAAc;AAClB,SAAK,MAAM,KAAKA,WAAS,UAAU,MAAM,KAAK,QAAQ,CACpD,KAAI,SAAS,EAAE,EAAE;AACf,mBAAc;AACd;;AAIJ,QAAI,YACF,OAAMC,OAAK,MAAM,MAAM,QAAQ;QAE/B,MAAK,MAAM,QAAQD,WAAS,YAAY,MAAM,KAAK,QAAQ,CACzD,QAAO,IAAI,KAAK;;AAItB,UAAO,IAAI,MAAM;;EAEpB;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAE3D,UAAO,MAAM;AACX,YAAQ,KAAK,KAAK;AAClB,WAAOA,WAAS,KAAK,IAAK,OAAO,KAAK,QAAQ;;;EAGnD;CACF;;;;;;;;;;;AC5PD,MAAa,iBAAiB,OAAc,SAAsB;AAChE,KAAI,OAAO,UAAU,SACnB,QAAO,CAAC;AAEV,OAAM,IAAI,aAAa,gCAAgC,aAAa,MAAM,IAAI,KAAK;;;;;;;;;;;;;AAcrF,MAAa,iBAAiB,IAAY,MAAa,OAAc,SAAsB;AACzF,SAAQ,IAAR;EACE,KAAK,IACH,QAAO,IAAI,MAAM,OAAO,KAAK;EAC/B,KAAK,IACH,QAAO,IAAI,MAAM,OAAO,KAAK;EAC/B,KAAK,IACH,QAAO,IAAI,MAAM,OAAO,KAAK;EAC/B,KAAK,IACH,QAAO,IAAI,MAAM,OAAO,KAAK;EAC/B,KAAK,IACH,QAAO,IAAI,MAAM,OAAO,KAAK;EAC/B,KAAK,KACH,QAAO,QAAQ,MAAM,MAAM;EAC7B,KAAK,MACH,QAAO,CAAC,QAAQ,MAAM,MAAM;EAC9B,KAAK,KACH,QAAO,QAAQ,MAAM,MAAM,GAAG;EAChC,KAAK,MACH,QAAO,QAAQ,MAAM,MAAM,IAAI;EACjC,KAAK,KACH,QAAO,QAAQ,MAAM,MAAM,GAAG;EAChC,KAAK,MACH,QAAO,QAAQ,MAAM,MAAM,IAAI;EACjC,QACE,OAAM,IAAI,aAAa,4BAA4B,MAAM,KAAK;;;AAKpE,SAAS,QAAQ,GAAU,GAAmB;AAC5C,KAAI,MAAM,EAAG,QAAO;AACpB,KAAI,MAAM,QAAQ,MAAM,KAAM,QAAO;AACrC,KAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAClC,KAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,EAAE;AACxC,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,SAAO,EAAE,OAAO,GAAG,MAAM,QAAQ,GAAG,EAAE,GAAY,CAAC;;AAErD,KAAIG,gBAAc,EAAE,IAAIA,gBAAc,EAAE,EAAE;EACxC,MAAM,KAAK,OAAO,KAAK,EAAE,CAAC,MAAM;EAChC,MAAM,KAAK,OAAO,KAAK,EAAE,CAAC,MAAM;AAChC,MAAI,GAAG,WAAW,GAAG,OAAQ,QAAO;AACpC,MAAI,CAAC,GAAG,OAAO,GAAG,MAAM,MAAM,GAAG,GAAG,CAAE,QAAO;AAC7C,SAAO,GAAG,OAAO,MAAM,QAAQ,EAAE,IAAK,EAAE,GAAI,CAAC;;AAE/C,QAAO;;AAGT,SAAS,QAAQ,GAAU,GAAkB;AAC3C,KAAI,MAAM,EAAG,QAAO;CACpB,MAAM,aAAa,MAAa;AAC9B,MAAI,MAAM,KAAM,QAAO;AACvB,MAAI,OAAO,MAAM,UAAW,QAAO;AACnC,MAAI,OAAO,MAAM,SAAU,QAAO;AAClC,MAAI,OAAO,MAAM,SAAU,QAAO;AAClC,MAAI,MAAM,QAAQ,EAAE,CAAE,QAAO;AAC7B,MAAIA,gBAAc,EAAE,CAAE,QAAO;AAC7B,SAAO;;CAGT,MAAM,KAAK,UAAU,EAAE;CACvB,MAAM,KAAK,UAAU,EAAE;AACvB,KAAI,OAAO,GAAI,QAAO,KAAK;AAE3B,KAAI,OAAO,MAAM,aAAa,OAAO,MAAM,UACzC,SAAQ,IAAI,IAAI,MAAM,IAAI,IAAI;AAEhC,KAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SACxC,QAAO,IAAI;AAEb,KAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SACxC,QAAO,IAAI,IAAI,KAAK;AAEtB,KAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,EAAE;AACxC,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK;GACrD,MAAM,IAAI,QAAQ,EAAE,IAAK,EAAE,GAAI;AAC/B,OAAI,MAAM,EAAG,QAAO;;AAEtB,SAAO,EAAE,SAAS,EAAE;;AAEtB,KAAIA,gBAAc,EAAE,IAAIA,gBAAc,EAAE,EAAE;EAExC,MAAM,QAAQ,OAAO,KAAK,EAAE,CAAC,MAAM;EACnC,MAAM,QAAQ,OAAO,KAAK,EAAE,CAAC,MAAM;AAEnC,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,MAAM,QAAQ,MAAM,OAAO,EAAE,KAAK;GAC7D,MAAM,KAAK,MAAM;GACjB,MAAM,KAAK,MAAM;AACjB,OAAI,OAAO,GAAI,QAAO,KAAK,KAAK,KAAK;GACrC,MAAM,IAAI,QAAQ,EAAE,KAAM,EAAE,IAAK;AACjC,OAAI,MAAM,EAAG,QAAO;;AAEtB,SAAO,MAAM,SAAS,MAAM;;AAE9B,QAAO;;AAGT,SAAgB,IAAI,MAAa,OAAc,MAAmB;AAChE,KAAI,SAAS,QAAQ,UAAU,KAAM,QAAO;AAC5C,KAAI,SAAS,QAAQ,OAAO,UAAU,SAAU,QAAO;AACvD,KAAI,OAAO,SAAS,YAAY,UAAU,KAAM,QAAO;AACvD,KAAI,OAAO,SAAS,YAAY,OAAO,UAAU,SAAU,QAAO,OAAO;AACzE,KAAI,OAAO,SAAS,YAAY,OAAO,UAAU,SAAU,QAAO,OAAO;AACzE,KAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,MAAM,CAAE,QAAO,CAAC,GAAG,MAAM,GAAG,MAAM;AAC3E,KAAIA,gBAAc,KAAK,IAAIA,gBAAc,MAAM,CAAE,QAAO;EAAE,GAAG;EAAM,GAAG;EAAO;AAC7E,OAAM,IAAI,aAAa,cAAc,aAAa,KAAK,CAAC,OAAO,aAAa,MAAM,IAAI,KAAK;;AAG7F,SAAS,IAAI,MAAa,OAAc,MAAmB;AACzD,KAAI,OAAO,SAAS,YAAY,OAAO,UAAU,SAAU,QAAO,OAAO;AACzE,KAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,MAAM,EAAE;EAE/C,MAAM,WAAW,IAAI,IAAI,MAAM,IAAI,gBAAgB,CAAC;AACpD,SAAO,KAAK,QAAQ,MAAM,CAAC,SAAS,IAAI,gBAAgB,EAAE,CAAC,CAAC;;AAE9D,OAAM,IAAI,aAAa,mBAAmB,aAAa,MAAM,CAAC,QAAQ,aAAa,KAAK,IAAI,KAAK;;AAGnG,SAAS,IAAI,MAAa,OAAc,MAAmB;AACzD,KAAI,OAAO,SAAS,YAAY,OAAO,UAAU,SAAU,QAAO,OAAO;AAGzE,KAAI,OAAO,SAAS,YAAY,OAAO,UAAU,SAAU,QAAO,aAAa,MAAM,MAAM;AAC3F,KAAI,OAAO,SAAS,YAAY,OAAO,UAAU,SAAU,QAAO,aAAa,OAAO,KAAK;AAE3F,KAAIA,gBAAc,KAAK,IAAIA,gBAAc,MAAM,CAC7C,QAAO,UAAU,MAAM,MAAM;AAG/B,OAAM,IAAI,aAAa,mBAAmB,aAAa,KAAK,CAAC,MAAM,aAAa,MAAM,IAAI,KAAK;;AAGjG,SAAS,IAAI,MAAa,OAAc,MAAmB;AACzD,KAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAAU;AACzD,MAAI,UAAU,EAAG,OAAM,IAAI,aAAa,oBAAoB,KAAK;AACjE,SAAO,OAAO;;AAEhB,KAAI,OAAO,SAAS,YAAY,OAAO,UAAU,SAC/C,QAAO,KAAK,MAAM,MAAM;AAE1B,OAAM,IAAI,aAAa,iBAAiB,aAAa,KAAK,CAAC,MAAM,aAAa,MAAM,IAAI,KAAK;;AAG/F,SAAS,IAAI,MAAa,OAAc,MAAmB;AACzD,KAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAAU;AACzD,MAAI,UAAU,EAAG,OAAM,IAAI,aAAa,kBAAkB,KAAK;AAE/D,SAAO,OAAO;;AAEhB,OAAM,IAAI,aAAa,iBAAiB,aAAa,KAAK,CAAC,MAAM,aAAa,MAAM,IAAI,KAAK;;AAG/F,SAAS,aAAa,KAAa,OAA8B;AAC/D,KAAI,SAAS,EAAG,QAAO;CACvB,MAAM,IAAI,KAAK,MAAM,MAAM;AAC3B,KAAI,KAAK,EAAG,QAAO;AACnB,QAAO,IAAI,OAAO,EAAE;;AAGtB,SAAS,UACP,QACA,QACuB;CACvB,MAAM,SAAS,EAAE,GAAG,QAAQ;AAC5B,MAAK,MAAM,OAAO,OAAO,KAAK,OAAO,EAAE;EACrC,MAAM,OAAO,OAAO;EACpB,MAAM,OAAO,OAAO;AACpB,MAAIA,gBAAc,KAAK,IAAI,SAAS,UAAaA,gBAAc,KAAK,CAClE,QAAO,OAAO,UAAU,MAA+B,KAA8B;MAErF,QAAO,OAAO;;AAGlB,QAAO;;AAGT,SAASA,gBAAc,GAAsC;AAC3D,QAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,EAAE;;;;;ACzMjE,MAAaC,eAA8B;CAEzC;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,OAAO,UAAU,SAAU,OAAM,IAAI,aAAa,wBAAwB,KAAK;AACnF,SAAMC,OAAK,KAAK,MAAM,MAAM,EAAE,MAAM,QAAQ;;EAE/C;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,OAAO,UAAU,SAAU,OAAM,IAAI,aAAa,uBAAuB,KAAK;AAClF,SAAMA,OAAK,KAAK,KAAK,MAAM,EAAE,MAAM,QAAQ;;EAE9C;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,OAAO,UAAU,SAAU,OAAM,IAAI,aAAa,wBAAwB,KAAK;AACnF,SAAMA,OAAK,KAAK,MAAM,MAAM,EAAE,MAAM,QAAQ;;EAE/C;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,OAAO,UAAU,SAAU,OAAM,IAAI,aAAa,sBAAsB,KAAK;AACjF,SAAMA,OAAK,KAAK,IAAI,MAAM,EAAE,MAAM,QAAQ;;EAE7C;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,OAAO,UAAU,SAAU,OAAM,IAAI,aAAa,uBAAuB,KAAK;AAClF,SAAMA,OAAK,KAAK,KAAK,MAAM,EAAE,MAAM,QAAQ;;EAE9C;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,OAAO,UAAU,UAAU;AAC7B,UAAMA,OAAK,OAAO,MAAM,QAAQ;AAChC;;AAEF,SAAMA,OAAK,OAAO,MAAM,MAAM,EAAE,MAAM,QAAQ;;EAEjD;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,OAAO,UAAU,UAAU;AAC7B,UAAMA,OAAK,OAAO,MAAM,QAAQ;AAChC;;AAEF,SAAMA,OAAK,CAAC,OAAO,SAAS,MAAM,IAAI,CAAC,OAAO,MAAM,MAAM,EAAE,MAAM,QAAQ;;EAE7E;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,OAAO,UAAU,UAAU;AAC7B,UAAMA,OAAK,MAAM,MAAM,QAAQ;AAC/B;;AAEF,SAAMA,OAAK,OAAO,SAAS,MAAM,EAAE,MAAM,QAAQ;;EAEpD;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,OAAO,UAAU,UAAU;AAC7B,UAAMA,OAAK,OAAO,MAAM,QAAQ;AAChC;;AAMF,OAAI,CAAC,OAAO,SAAS,MAAM,IAAI,OAAO,MAAM,MAAM,IAAI,UAAU,GAAG;AACjE,UAAMA,OAAK,OAAO,MAAM,QAAQ;AAChC;;AAIF,SAAMA,OAAK,MAAM,MAAM,QAAQ;;EAElC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,OAAO,UAAU,UAAU;AAC7B,UAAMA,OAAK,OAAO,MAAM,QAAQ;AAChC;;AAOF,SAAMA,OAAK,OAAO,MAAM,QAAQ;;EAEnC;CAGD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,wBAAwB,KAAK;AAC/E,OAAI,MAAM,WAAW,GAAG;AACtB,UAAMA,OAAK,MAAM,MAAM,QAAQ;AAC/B;;GAEF,IAAI,SAAS,MAAM;AACnB,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,IAChC,KAAI,cAAc,MAAM,IAAK,OAAO,GAAG,EACrC,UAAS,MAAM;AAGnB,SAAMA,OAAK,QAAQ,MAAM,QAAQ;;EAEpC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,wBAAwB,KAAK;AAC/E,OAAI,MAAM,WAAW,GAAG;AACtB,UAAMA,OAAK,MAAM,MAAM,QAAQ;AAC/B;;GAEF,IAAI,SAAS,MAAM;AACnB,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,IAChC,KAAI,cAAc,MAAM,IAAK,OAAO,GAAG,EACrC,UAAS,MAAM;AAGnB,SAAMA,OAAK,QAAQ,MAAM,QAAQ;;EAEpC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,2BAA2B,KAAK;AAClF,OAAI,MAAM,WAAW,GAAG;AACtB,UAAMA,OAAK,MAAM,MAAM,QAAQ;AAC/B;;GAEF,IAAI,UAAU,MAAM;GACpB,IAAIC;GAIJ,MAAM,QAAQ,MAAM,KAAKC,WAAS,KAAK,IAAK,SAAS,KAAK,QAAQ,CAAC;AACnE,OAAI,MAAM,WAAW,EAAG,OAAM,IAAI,aAAa,oCAAoC,KAAK;AACxF,YAAS,MAAM;AAEf,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,OAAO,MAAM;IACnB,MAAM,OAAO,MAAM,KAAKA,WAAS,KAAK,IAAK,MAAM,KAAK,QAAQ,CAAC;AAC/D,QAAI,KAAK,WAAW,EAAG,OAAM,IAAI,aAAa,oCAAoC,KAAK;IACvF,MAAM,MAAM,KAAK;AAEjB,QAAI,cAAc,KAAK,OAAO,GAAG,GAAG;AAClC,cAAS;AACT,eAAU;;;AAGd,SAAMF,OAAK,SAAS,MAAM,QAAQ;;EAErC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,MAAM,KAAK,SAAS,YAAU,MAAM;AAC3D,OAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,OAAM,IAAI,aAAa,2BAA2B,KAAK;AAClF,OAAI,MAAM,WAAW,GAAG;AACtB,UAAMA,OAAK,MAAM,MAAM,QAAQ;AAC/B;;GAEF,IAAI,UAAU,MAAM;GACpB,IAAIG;GAEJ,MAAM,QAAQ,MAAM,KAAKD,WAAS,KAAK,IAAK,SAAS,KAAK,QAAQ,CAAC;AACnE,OAAI,MAAM,WAAW,EAAG,OAAM,IAAI,aAAa,oCAAoC,KAAK;AACxF,YAAS,MAAM;AAEf,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,OAAO,MAAM;IACnB,MAAM,OAAO,MAAM,KAAKA,WAAS,KAAK,IAAK,MAAM,KAAK,QAAQ,CAAC;AAC/D,QAAI,KAAK,WAAW,EAAG,OAAM,IAAI,aAAa,oCAAoC,KAAK;IACvF,MAAM,MAAM,KAAK;AAEjB,QAAI,cAAc,KAAK,OAAO,GAAG,GAAG;AAClC,cAAS;AACT,eAAU;;;AAGd,SAAMF,OAAK,SAAS,MAAM,QAAQ;;EAErC;CACD;EACE,MAAM;EACN,OAAO;EACP,OAAO,WAAW,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM;AAC1D,OAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,OAAM,IAAI,aAAa,wBAAwB,KAAK;AAEtD,OAAI,MAAM,WAAW,GAAG;AACtB,UAAMA,OAAK,MAAM,MAAM,QAAQ;AAC/B;;GAEF,IAAII,MAAa,MAAM;AACvB,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAQ,KAAK,KAAK;AAClB,UAAM,IAAI,KAAK,MAAM,IAAK,KAAK;;AAEjC,SAAMJ,OAAK,KAAK,MAAM,QAAQ;;EAEjC;CACF;;;;ACpOD,MAAa,4BAA4B;AACvC,kBAAiB,YAAY;AAC7B,kBAAiB,cAAc;AAC/B,kBAAiB,mBAAmB;AACpC,kBAAiB,eAAe;AAChC,kBAAiB,aAAa;AAC9B,kBAAiB,iBAAiB;AAClC,kBAAiB,aAAa;;;;;ACZhC,qBAAqB;;;;;;;;;;;ACOrB,MAAa,YAAY,SAA2B;AAClD,OAAM,MAAM,EAAE,CAAC;;AAGjB,MAAM,SAAS,MAAkB,UAA+B;AAC9D,SAAQ,KAAK,MAAb;EACE,KAAK;EACL,KAAK;EACL,KAAK,MACH;EACF,KAAK;AACH,SAAM,KAAK,QAAQ,MAAM;AACzB;EACF,KAAK;AACH,SAAM,KAAK,QAAQ,MAAM;AACzB,SAAM,KAAK,OAAO,MAAM;AACxB;EACF,KAAK;AACH,QAAK,MAAM,SAAS,MAAM,MAAM,GAAG,MAAM,CAAC;AAC1C;EACF,KAAK;AACH,QAAK,QAAQ,SAAS,UAAU;AAC9B,QAAI,MAAM,IAAI,SAAS,UACrB,OAAM,MAAM,IAAI,MAAM,MAAM;AAE9B,UAAM,MAAM,OAAO,MAAM;KACzB;AACF;EACF,KAAK;EACL,KAAK;EACL,KAAK;AACH,SAAM,KAAK,MAAM,MAAM;AACvB,SAAM,KAAK,OAAO,MAAM;AACxB;EACF,KAAK;EACL,KAAK;AACH,SAAM,KAAK,MAAM,MAAM;AACvB,SAAM,KAAK,OAAO,MAAM;AACxB;EACF,KAAK;AACH,SAAM,KAAK,MAAM,MAAM;AACvB;EACF,KAAK;AACH,QAAK,SAAS,SAAS,WAAW;AAChC,UAAM,OAAO,MAAM,MAAM;AACzB,UAAM,OAAO,MAAM,MAAM;KACzB;AACF,SAAM,KAAK,MAAM,MAAM;AACvB;EACF,KAAK;AACH,SAAM,KAAK,MAAM,MAAM;AACvB,SAAM,KAAK,MAAM,MAAM;AACvB;EACF,KAAK,QAAQ;AAEX,QAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,IACrC,KAAI,MAAM,GAAI,IAAI,KAAK,KAAK,EAAE;AAQ5B,SAAK,MAAM,OAAO,KAAK,KACrB,OAAM,KAAK,MAAM;AAEnB;;GAIJ,MAAM,QAAQ,SAAS,KAAK;AAC5B,OAAI,CAAC,SAAS,MAAM,WAAW,EAC7B,OAAM,IAAI,gBAAgB,qBAAqB,KAAK,QAAQ,KAAK,KAAK;AAGxE,OAAI,CADU,MAAM,MAAM,MAAM,EAAE,UAAU,KAAK,KAAK,OAAO,EACjD;IACV,MAAM,UAAU,MAAM,KAAK,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO;AACtD,UAAM,IAAI,gBACR,YAAY,KAAK,KAAK,WAAW,QAAQ,sBAAsB,KAAK,KAAK,UACzE,KAAK,KACN;;AAEH,QAAK,MAAM,OAAO,KAAK,KACrB,OAAM,KAAK,MAAM;AAEnB;;EAEF,KAAK;AACH,SAAM,KAAK,MAAM,MAAM;AACvB,SAAM,KAAK,OAAO,MAAM;AACxB;EACF,KAAK,OAAO;GAUV,MAAM,YAAY,IAAI,IAAI,KAAK,KAAK;AACpC,aAAU,IAAI,KAAK,KAAK;AAExB,SAAM,KAAK,MAAM,CAAC,GAAG,OAAO,UAAU,CAAC;GAKvC,MAAM,YAAY,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;AACtC,SAAM,KAAK,MAAM,CAAC,GAAG,OAAO,UAAU,CAAC;AACvC;;EAEF,KAAK;AACH,SAAM,KAAK,QAAQ,MAAM;AACzB,SAAM,KAAK,MAAM,MAAM;AACvB,SAAM,KAAK,QAAQ,MAAM;AACzB;EACF,KAAK;AACH,SAAM,KAAK,QAAQ,MAAM;AACzB,SAAM,KAAK,MAAM,MAAM;AACvB,SAAM,KAAK,QAAQ,MAAM;AACzB,OAAI,KAAK,QAAS,OAAM,KAAK,SAAS,MAAM;AAC5C;EACF,KAAK;AACH,SAAM,KAAK,MAAM,MAAM;AACvB,OAAI,KAAK,QAAS,OAAM,KAAK,SAAS,MAAM;AAC5C;EACF,KAAK;EACL,KAAK;EACL,KAAK,QACH;EACF,KAAK;AACH,SAAM,KAAK,MAAM,MAAM;AACvB;EACF,KAAK;AACH,SAAM,KAAK,QAAQ,MAAM;AACzB,OAAI,KAAK,MAAO,OAAM,KAAK,OAAO,MAAM;AACxC,OAAI,KAAK,IAAK,OAAM,KAAK,KAAK,MAAM;AACpC;EACF,QAEE,QAD0B;;;;;;;;;;ACrJhC,IAAa,cAAb,MAAa,oBAAoB,MAAM;CACrC,YAAY,AAAgBK,OAAe;AACzC,QAAM,UAAU,QAAQ;EADE;AAG1B,SAAO,eAAe,MAAM,YAAY,UAAU;;;;;;ACiBtD,MAAMC,iBAAiC;CACrC,UAAU;CACV,UAAU;CACV,YAAY;CACb;;;;;;;AAQD,MAAa,iBAAiB,SAAuB,EAAE,MAAsB;CAC3E,UAAU,OAAO,YAAY,eAAe;CAC5C,UAAU,OAAO,YAAY,eAAe;CAC5C,YAAY,OAAO,cAAc,eAAe;CACjD;;;;;AAMD,IAAa,eAAb,MAA0B;CACxB,AAAQ,QAAQ;CAChB,AAAQ,QAAQ;CAChB,AAAQ,UAAU;CAElB,YAAY,AAAiBC,QAAwB;EAAxB;;;;;;CAM7B,KAAK,MAAkB;AACrB,OAAK,SAAS;AACd,MAAI,KAAK,QAAQ,KAAK,OAAO,SAC3B,OAAM,IAAI,aAAa,uBAAuB,KAAK;;;;;;CAQvD,MAAM,MAAkB;AACtB,OAAK,SAAS;AACd,MAAI,KAAK,QAAQ,KAAK,OAAO,SAC3B,OAAM,IAAI,aAAa,sBAAsB,KAAK;;;;;CAOtD,OAAa;AACX,OAAK,QAAQ,KAAK,IAAI,GAAG,KAAK,QAAQ,EAAE;;;;;;CAO1C,KAAK,MAAkB;AACrB,OAAK,WAAW;AAChB,MAAI,KAAK,UAAU,KAAK,OAAO,WAC7B,OAAM,IAAI,aAAa,yBAAyB,KAAK;;;;;;;;;;ACnF3D,MAAa,UAAU,KAAe,SAAoC;AACxE,MAAK,IAAI,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,IACnC,KAAI,IAAI,GAAI,KAAK,IAAI,KAAK,CACxB,QAAO,IAAI,GAAI,KAAK,IAAI,KAAK;;;;;AASnC,MAAa,eAAe,KAAe,MAAc,UAAiB;AACxE,KAAI,IAAI,SAAS,GAAI,KAAK,IAAI,MAAM,MAAM;;;;;AAM5C,MAAa,cAAc,KAAe,SAAiB;AACzD,KAAI,IAAI,SAAS,GAAI,KAAK,OAAO,KAAK;;;;;;;;;;;;;ACdxC,MAAa,QAAQ,OAAc,MAAY,YAAiC;AAC9E,SAAQ,KAAK,KAAK;AAClB,QAAO;;;;;;;;;AAUT,MAAa,iBAAiB,OAAc,SAAuB;AACjE,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,MAAM,CACtD,QAAO;AAET,OAAM,IAAI,aAAa,oBAAoB,KAAK;;;;;;;;;;;;;;;;;;ACLlD,MAAa,iBAAiB,WAC5B,MACA,OACA,KACA,SACA,YACkB;CAClB,MAAM,QAAQ,MAAM,KAAK,aAAa,KAAK,MAAM,OAAO,KAAK,SAASC,WAAS,CAAC;AAEhF,OAAM,MAAM,GAAG,MAAM,cAAc,GAAG,EAAE,GAAG,GAAG;AAE9C,KAAI,MAAM,WAAW,GAAG;AACtB,QAAM,KAAK,OAAO,KAAK,MAAM,QAAQ;AACrC;;AAIF,KAAI,KAAK,OAAO,KAAK;EACnB,MAAM,YAAY,MAAM,KAAKA,WAAS,KAAK,OAAO,OAAO,KAAK,QAAQ,CAAC;AACvE,MAAI,UAAU,WAAW,EAAG;AAE5B,OAAK,MAAM,UAAU,WAAW;GAC9B,IAAI,UAAU;AACd,QAAK,MAAM,QAAQ,MACjB,WAAU,WAAW,SAAS,YAAY,QAAQ,KAAK,KAAK,IAAI;AAElE,SAAM,KAAK,SAAS,KAAK,MAAM,QAAQ;;AAEzC;;AAIF,QAAO,aAAa,OAAO,OAAO,GAAG,KAAK,IAAI,KAAK,OAAO,OAAO,KAAK,SAASA,WAAS;;AAG1F,UAAU,aACR,SACA,OACA,OACA,IACA,SACA,cACA,KACA,SACA,YACkB;AAClB,KAAI,SAAS,MAAM,QAAQ;AACzB,QAAM;AACN;;CAGF,MAAM,OAAO,MAAM;CACnB,MAAM,WAAW,QAAQ,SAAS,KAAK,IAAI;CAG3C,IAAIC,YAAqB,EAAE;AAE3B,KAAI,OAAO,KACT,aAAY,MAAM,KAAKD,WAAS,SAAS,UAAU,KAAK,QAAQ,CAAC;MAC5D;EAEL,MAAM,aAAa,MAAM,KAAKA,WAAS,SAAS,cAAc,KAAK,QAAQ,CAAC;AAC5E,OAAK,MAAM,OAAO,YAAY;GAC5B,IAAIE;AACJ,WAAQ,IAAR;IACE,KAAK;AACH,WAAM,cAAc,KAAK,UAAU,KAAK,QAAQ,KAAK;AACrD;IACF,KAAK;AACH,WAAM,cAAc,KAAK,UAAU,KAAK,QAAQ,KAAK;AACrD;IACF,KAAK;AACH,WAAM,cAAc,KAAK,UAAU,KAAK,QAAQ,KAAK;AACrD;IACF,KAAK;AACH,WAAM,cAAc,KAAK,UAAU,KAAK,QAAQ,KAAK;AACrD;IACF,KAAK;AACH,WAAM,cAAc,KAAK,UAAU,KAAK,QAAQ,KAAK;AACrD;IACF,KAAK;AAEH,WAAM,aAAa,QAAQ,aAAa,QAAQ,WAAW;AAC3D;IACF,QACE,OAAM,IAAI,aAAa,0BAA0B,MAAM,QAAQ,KAAK;;AAExE,aAAU,KAAK,IAAI;;;AAIvB,KAAI,UAAU,WAAW,GAAG;AAK1B,SAAO,aAFY,YAAY,SAAS,CAAC,KAAK,EAAE,QAAQ,KAAK,EAI3D,OACA,QAAQ,GACR,IACA,SACA,cACA,KACA,SACAF,WACD;AACD;;AAGF,MAAK,MAAM,OAAO,UAEhB,QAAO,aADY,WAAW,SAAS,YAAY,KAAK,QAAQ,KAAK,IAAI,SAGvE,OACA,QAAQ,GACR,IACA,SACA,cACA,KACA,SACAA,WACD;;;;;;;;;;;;;;AChIL,MAAa,cAAc,WACzB,MACA,OACA,KACA,SACA,YACkB;AAClB,MAAK,MAAM,aAAaG,WAAS,KAAK,QAAQ,OAAO,KAAK,QAAQ,EAAE;AAClE,MAAI,cAAc,KAChB;AAEF,MAAI,aAAa,UAAU,EAAE;AAC3B,QAAK,MAAM,QAAQ,UACjB,OAAM,KAAK,MAAM,KAAK,MAAM,QAAQ;AAEtC;;AAEF,MAAI,cAAc,UAAU,EAAE;GAC5B,MAAM,OAAO,OAAO,KAAK,UAAU,CAAC,MAAM;AAC1C,QAAK,MAAM,OAAO,KAChB,OAAM,KAAK,UAAU,MAAO,KAAK,MAAM,QAAQ;AAEjD;;AAEF,QAAM,IAAI,aAAa,uBAAuB,aAAa,UAAU,IAAI,KAAK,KAAK;;;;;;;;;;;;;;AAevF,MAAa,aAAa,WACxB,MACA,OACA,KACA,SACA,YACkB;CAClB,MAAM,aAAa,MAAM,KAAKA,WAAS,KAAK,MAAM,OAAO,KAAK,QAAQ,CAAC;AACvE,KAAI,WAAW,WAAW,EACxB,OAAM,IAAI,aAAa,iCAAiC,KAAK,KAAK,KAAK;CAEzE,IAAI,MAAM,WAAW;AAErB,MAAK,MAAM,QAAQA,WAAS,KAAK,QAAQ,OAAO,KAAK,QAAQ,EAAE;AAC7D,UAAQ,KAAK,KAAK,KAAK;AACvB,cAAY,KAAK,KAAK,KAAK,KAAK;AAChC,MAAI;GACF,MAAM,UAAU,MAAM,KAAKA,WAAS,KAAK,QAAQ,KAAK,KAAK,QAAQ,CAAC;AACpE,OAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,aAAa,2CAA2C,KAAK,OAAO,KAAK;AAErF,SAAM,QAAQ;YACN;AACR,cAAW,KAAK,KAAK,IAAI;;;AAG7B,OAAM,KAAK,KAAK,KAAK,MAAM,QAAQ;;;;;;;;;;;;;AAcrC,MAAa,cAAc,WACzB,MACA,OACA,KACA,SACA,YACkB;CAClB,MAAM,aAAa,MAAM,KAAKA,WAAS,KAAK,MAAM,OAAO,KAAK,QAAQ,CAAC;AACvE,KAAI,WAAW,WAAW,EACxB,OAAM,IAAI,aAAa,kCAAkC,KAAK,KAAK,KAAK;CAE1E,IAAI,MAAM,WAAW;AAErB,MAAK,MAAM,QAAQA,WAAS,KAAK,QAAQ,OAAO,KAAK,QAAQ,EAAE;AAC7D,UAAQ,KAAK,KAAK,KAAK;AACvB,cAAY,KAAK,KAAK,KAAK,KAAK;AAChC,MAAI;GACF,MAAM,UAAU,MAAM,KAAKA,WAAS,KAAK,QAAQ,KAAK,KAAK,QAAQ,CAAC;AACpE,OAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,aAAa,4CAA4C,KAAK,OAAO,KAAK;AAEtF,SAAM,QAAQ;AAEd,OAAI,KAAK,QACP,MAAK,MAAM,aAAaA,WAAS,KAAK,SAAS,KAAK,KAAK,QAAQ,CAC/D,OAAM,KAAK,WAAW,KAAK,MAAM,QAAQ;OAG3C,OAAM,KAAK,KAAK,KAAK,MAAM,QAAQ;YAE7B;AACR,cAAW,KAAK,KAAK,IAAI;;;;;;;;;;;;;;AAe/B,MAAa,cAAc,WACzB,MACA,OACA,KACA,SACA,YACkB;AAkBlB,OAAM,KAAK,OAAO,KAAK,MAAM,QAAQ;CAErC,MAAMC,WAAoB,EAAE;AAC5B,KAAI,aAAa,MAAM,CACrB,UAAS,KAAK,GAAG,MAAM;UACd,cAAc,MAAM,EAAE;EAC/B,MAAM,OAAO,OAAO,KAAK,MAAM,CAAC,MAAM;AACtC,OAAK,MAAM,OAAO,KAChB,UAAS,KAAK,MAAM,KAAM;;AAI9B,MAAK,MAAM,SAAS,SAClB,QAAO,YAAY,MAAM,OAAO,KAAK,SAASD,WAAS;;;;;;;;;;;;;;ACnK3D,MAAa,YAAY,WACvB,MACA,OACA,KACA,SACA,YACkB;AAClB,MAAK,MAAM,aAAaE,WAAS,KAAK,QAAQ,OAAO,KAAK,QAAQ,EAAE;AAClE,MAAI,cAAc,MAAM;AACtB,SAAM,KAAK,MAAM,KAAK,MAAM,QAAQ;AACpC;;AAEF,MAAI,cAAc,UAAU,EAAE;AAC5B,SAAM,KACJ,OAAO,UAAU,eAAe,KAAK,WAAW,KAAK,MAAM,GAAG,UAAU,KAAK,SAAU,MACvF,KAAK,MACL,QACD;AACD;;AAEF,QAAM,IAAI,aAAa,gBAAgB,aAAa,UAAU,CAAC,eAAe,KAAK,KAAK;;;;;;;;;;;;;AAc5F,MAAa,YAAY,WACvB,MACA,OACA,KACA,SACA,YACkB;CAClB,MAAM,cAAc,MAAM,KAAYA,WAAS,KAAK,OAAO,OAAO,KAAK,QAAQ,CAAC;AAChF,MAAK,MAAM,aAAaA,WAAS,KAAK,QAAQ,OAAO,KAAK,QAAQ,EAAE;AAClE,MAAI,cAAc,MAAM;AACtB,SAAM,KAAK,MAAM,KAAK,MAAM,QAAQ;AACpC;;AAEF,MAAI,aAAa,UAAU,EAAE;AAC3B,QAAK,MAAM,YAAY,aAAa;IAClC,MAAM,QAAQ,cAAc,UAAU,KAAK,KAAK;IAChD,MAAM,WAAW,QAAQ,IAAI,UAAU,SAAS,QAAQ;AACxD,QAAI,WAAW,KAAK,YAAY,UAAU,OACxC,OAAM,KAAK,MAAM,KAAK,MAAM,QAAQ;QAEpC,OAAM,KAAK,UAAU,WAAY,KAAK,MAAM,QAAQ;;AAGxD;;AAEF,MAAI,cAAc,UAAU,EAAE;AAC5B,QAAK,MAAM,YAAY,aAAa;AAClC,QAAI,OAAO,aAAa,SACtB,OAAM,IAAI,aAAa,4BAA4B,aAAa,SAAS,IAAI,KAAK,KAAK;AAEzF,UAAM,KACJ,OAAO,UAAU,eAAe,KAAK,WAAW,SAAS,GAAG,UAAU,YAAa,MACnF,KAAK,MACL,QACD;;AAEH;;AAEF,QAAM,IAAI,aAAa,gBAAgB,aAAa,UAAU,IAAI,KAAK,KAAK;;;;;;;;;;;;;AAchF,MAAa,YAAY,WACvB,MACA,OACA,KACA,SACA,YACkB;AAElB,MAAK,MAAM,UAAUA,WAAS,KAAK,QAAQ,OAAO,KAAK,QAAQ,EAAE;AAC/D,MAAI,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,OAAO,CACtD,OAAM,IAAI,aAAa,kCAAkC,KAAK,KAAK;EAIrE,MAAMC,SAAmB,EAAE;AAC3B,MAAI,KAAK,MACP,MAAK,MAAM,KAAKD,WAAS,KAAK,OAAO,OAAO,KAAK,QAAQ,EAAE;AACzD,OAAI,OAAO,MAAM,SAAU,OAAM,IAAI,aAAa,8BAA8B,KAAK,KAAK;AAC1F,UAAO,KAAK,EAAE;;MAGhB,QAAO,KAAK,EAAE;EAIhB,MAAME,OAAiB,EAAE;AACzB,MAAI,KAAK,IACP,MAAK,MAAM,KAAKF,WAAS,KAAK,KAAK,OAAO,KAAK,QAAQ,EAAE;AACvD,OAAI,OAAO,MAAM,SAAU,OAAM,IAAI,aAAa,4BAA4B,KAAK,KAAK;AACxF,QAAK,KAAK,EAAE;;MAGd,MAAK,KAAK,OAAO,OAAO;AAI1B,OAAK,MAAM,KAAK,OACd,MAAK,MAAM,KAAK,KACd,OAAM,KAAK,OAAO,MAAM,GAAG,EAAE,EAAE,KAAK,MAAM,QAAQ;;;;;;;;;;;;;;;;;;AC1H1D,MAAa,aAAa,WACxB,MACA,OACA,KACA,SACA,YACkB;CAClB,MAAMG,SAAkB,EAAE;AAC1B,MAAK,MAAM,YAAY,KAAK,MAC1B,MAAK,MAAM,WAAWC,WAAS,UAAU,OAAO,KAAK,QAAQ,CAC3D,QAAO,KAAK,QAAQ;AAGxB,OAAM;;;;;;;;;;;;;;AAeR,MAAa,eAAe,WAC1B,MACA,OACA,KACA,SACA,YACkB;AAGlB,QAAO,WAAW,KAAK,SAAS,GADG,EAAE,EACG,OAAO,KAAK,SAASA,WAAS;;AAGxE,UAAU,WACR,SACA,OACA,SACA,OACA,KACA,SACA,YACkB;AAClB,KAAI,SAAS,QAAQ,QAAQ;AAC3B,QAAM,EAAE,GAAG,SAAS;AACpB;;CAGF,MAAM,QAAQ,QAAQ;CAEtB,IAAIC,OAAiB,EAAE;AAEvB,KAAI,MAAM,IAAI,SAAS,gBACrB,QAAO,CAAC,MAAM,IAAI,KAAK;UACd,MAAM,IAAI,SAAS,YAC5B,QAAO,CAAC,MAAM,IAAI,MAAM;KAGxB,MAAK,MAAM,KAAKD,WAAS,MAAM,IAAI,MAAM,OAAO,KAAK,QAAQ,EAAE;AAC7D,MAAI,OAAO,MAAM,SACf,OAAM,IAAI,aAAa,+BAA+B,MAAM,IAAI,KAAK;AACvE,OAAK,KAAK,EAAE;;AAchB,MAAK,MAAM,OAAO,KAChB,MAAK,MAAM,OAAOA,WAAS,MAAM,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC5D,UAAQ,OAAO;AACf,SAAO,WAAW,SAAS,QAAQ,GAAG,SAAS,OAAO,KAAK,SAASA,WAAS;AAC7E,SAAO,QAAQ;;;;;;;;;;;;;;;;;;;;;AClFrB,MAAa,WAAW,WACtB,MACA,OACA,KACA,SACA,YACkB;AAElB,MAAK,IAAI,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,KAAK;EAExC,MAAM,QADQ,IAAI,GACE,MAAM,IAAI,KAAK,KAAK;AACxC,MAAI,OAAO;GACT,MAAM,MAAM,MAAM,MAAM,MAAM,EAAE,KAAK,WAAW,KAAK,KAAK,OAAO;AACjE,OAAI,KAAK;IACP,MAAME,WAAqB;KAAE,sBAAM,IAAI,KAAK;KAAE,uBAAO,IAAI,KAAK;KAAE;AAEhE,SAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,QAAQ,KAAK;KACzC,MAAM,UAAU,IAAI,KAAK;KACzB,MAAM,UAAU,KAAK,KAAK;KAE1B,MAAM,UAAU,SAAS,MAAM,IAAI,QAAQ,IAAI,EAAE;AACjD,aAAQ,KAAK;MACX,MAAM,EAAE;MACR,MAAM;MACN,SAAS;MACV,CAAC;AACF,cAAS,MAAM,IAAI,SAAS,QAAQ;;IAKtC,MAAM,WAAW,CAAC,GAAG,IAAI,SAAS,SAAS;AAC3C,WAAOC,WAAS,IAAI,MAAM,OAAO,UAAU,QAAQ;AACnD;;;;CAMN,MAAM,QAAQ,SAAS,KAAK;AAC5B,KAAI,CAAC,MACH,OAAM,IAAI,aAAa,qBAAqB,KAAK,QAAQ,KAAK,KAAK;CAErE,MAAM,UAAU,MAAM,MAAM,MAAM,EAAE,UAAU,KAAK,KAAK,OAAO;AAC/D,KAAI,CAAC,QACH,OAAM,IAAI,aACR,YAAY,KAAK,KAAK,mBAAmB,KAAK,KAAK,OAAO,aAC1D,KAAK,KACN;AAEH,QAAO,QAAQ,MAAM,OAAO,KAAK,MAAM,KAAK,SAASA,YAAU,KAAK,KAAK;;;;;;;;;;;;;;AAe3E,MAAa,UAAU,WACrB,MACA,OACA,KACA,SACA,YACkB;CAClB,MAAMD,WAAqB;EAAE,sBAAM,IAAI,KAAK;EAAE,uBAAO,IAAI,KAAK;EAAE;CAChE,MAAM,cAAc,SAAS,MAAM,IAAI,KAAK,KAAK,IAAI,EAAE;CAEvD,MAAME,SAAsB;EAC1B,MAAM,KAAK;EACX,MAAM,KAAK;EACX,SAAS,EAAE;EACZ;AACD,aAAY,KAAK,OAAO;AACxB,UAAS,MAAM,IAAI,KAAK,MAAM,YAAY;CAE1C,MAAM,WAAW,CAAC,GAAG,KAAK,SAAS;AACnC,QAAO,UAAU;AAEjB,QAAOD,WAAS,KAAK,MAAM,OAAO,UAAU,QAAQ;;;;;;;;;;;;;;AC3FtD,MAAa,SAAS,WACpB,MACA,OACA,KACA,SACA,YACkB;AAClB,QAAO,aAAa,MAAM,GAAG,OAAO,KAAK,SAASE,WAAS;;AAG7D,UAAU,aACR,MACA,aACA,OACA,KACA,SACA,YACkB;AAClB,KAAI,eAAe,KAAK,SAAS,QAAQ;AACvC,SAAOA,WAAS,KAAK,MAAM,OAAO,KAAK,QAAQ;AAC/C;;CAGF,MAAM,SAAS,KAAK,SAAS;AAC7B,MAAK,MAAM,QAAQA,WAAS,OAAO,MAAM,OAAO,KAAK,QAAQ,CAC3D,KAAI,SAAS,KAAK,CAChB,QAAOA,WAAS,OAAO,MAAM,OAAO,KAAK,QAAQ;KAEjD,QAAO,aAAa,MAAM,cAAc,GAAG,OAAO,KAAK,SAASA,WAAS;;;;;;;;;;;AAc/E,MAAa,UAAU,WACrB,MACA,OACA,KACA,SACA,YACkB;AAClB,KAAI;AACF,SAAOA,WAAS,KAAK,MAAM,OAAO,KAAK,QAAQ;UACxC,KAAK;AACZ,MAAI,eAAe,cACjB;OAAI,KAAK,QAEP,QAAOA,WAAS,KAAK,SAAS,IAAI,SAAS,KAAK,QAAQ;QAK1D,OAAM;;;;;;;;;;;;AAcZ,MAAa,YAAY,WACvB,MACA,OACA,KACA,SACA,YACkB;AAClB,KAAI;AACF,SAAOA,WAAS,KAAK,MAAM,OAAO,KAAK,QAAQ;UACxC,GAAG;AACV,MAAI,aAAa,aACf;OAAI,EAAE,UAAU,KAAK,MAAO;;AAE9B,QAAM;;;;;;;;;;;;;;ACnEV,MAAa,UAAU,KAAiB,OAAc,UAAuB,EAAE,KAAc;CAC3F,MAAM,UAAU,IAAI,aAAa,cAAc,QAAQ,OAAO,CAAC;CAC/D,MAAMC,MAAgB,CAAC;EAAE,sBAAM,IAAI,KAAK;EAAE,uBAAO,IAAI,KAAK;EAAE,CAAC;AAC7D,QAAO,MAAM,KAAY,SAAS,KAAK,OAAO,KAAK,QAAQ,CAAC;;;;;;;;;;;;;;AAe9D,UAAU,SACR,MACA,OACA,KACA,SACmC;AACnC,KAAI,CAAC,KACH,OAAM,IAAI,MAAM,sCAAsC;AAExD,SAAQ,KAAK,KAAK,KAAK;AACvB,SAAQ,MAAM,KAAK,KAAK;AACxB,KAAI;AACF,UAAQ,KAAK,MAAb;GACE,KAAK;AACH,UAAM,KAAK,OAAO,KAAK,MAAM,QAAQ;AACrC;GACF,KAAK;AACH,UAAM,KAAK,KAAK,OAAO,KAAK,MAAM,QAAQ;AAC1C;GACF,KAAK,OAAO;IACV,MAAM,MAAM,OAAO,KAAK,KAAK,KAAK;AAClC,QAAI,QAAQ,OACV,OAAM,IAAI,aAAa,uBAAuB,KAAK,QAAQ,KAAK,KAAK;AAEvE,UAAM,KAAK,KAAK,KAAK,MAAM,QAAQ;AACnC;;GAEF,KAAK;AACH,WAAO,UAAU,MAAM,OAAO,KAAK,SAAS,SAAS;AACrD;GACF,KAAK;AACH,WAAO,UAAU,MAAM,OAAO,KAAK,SAAS,SAAS;AACrD;GACF,KAAK;AACH,WAAO,UAAU,MAAM,OAAO,KAAK,SAAS,SAAS;AACrD;GACF,KAAK;AACH,WAAO,WAAW,MAAM,OAAO,KAAK,SAAS,SAAS;AACtD;GACF,KAAK;AACH,WAAO,aAAa,MAAM,OAAO,KAAK,SAAS,SAAS;AACxD;GACF,KAAK;AACH,WAAO,UAAU,MAAM,OAAO,KAAK,SAAS,SAAS;AACrD;GACF,KAAK,QACH,OAAM,IAAI,YAAY,KAAK,MAAM;GACnC,KAAK;AACH,SAAK,MAAM,WAAW,SAAS,KAAK,MAAM,OAAO,KAAK,QAAQ,CAC5D,QAAO,SAAS,KAAK,OAAO,SAAS,KAAK,QAAQ;AAEpD;GACF,KAAK;AACH,WAAO,SAAS,KAAK,MAAM,OAAO,KAAK,QAAQ;AAC/C,WAAO,SAAS,KAAK,OAAO,OAAO,KAAK,QAAQ;AAChD;GACF,KAAK,OAAO;IAEV,MAAM,QADa,MAAM,KAAY,SAAS,KAAK,MAAM,OAAO,KAAK,QAAQ,CAAC,CACrD,QAAQ,MAAM,MAAM,QAAQ,MAAM,MAAM;AACjE,QAAI,MAAM,SAAS,EACjB,MAAK,MAAM,KAAK,MACd,OAAM;QAGR,QAAO,SAAS,KAAK,OAAO,OAAO,KAAK,QAAQ;AAElD;;GAEF,KAAK;AACH,QAAI,KAAK,OAAO,MACd,MAAK,MAAM,SAAS,SAAS,KAAK,MAAM,OAAO,KAAK,QAAQ,CAC1D,OAAM,KAAK,CAAC,SAAS,MAAM,EAAE,KAAK,MAAM,QAAQ;QAGlD,MAAK,MAAM,SAAS,SAAS,KAAK,MAAM,OAAO,KAAK,QAAQ,CAC1D,OAAM,KAAK,cAAc,OAAO,KAAK,KAAK,EAAE,KAAK,MAAM,QAAQ;AAGnE;GACF,KAAK;AAEH,SAAK,MAAM,KAAK,SAAS,KAAK,MAAM,OAAO,KAAK,QAAQ,CACtD,KAAI,KAAK,OAAO,MACd,KAAI,CAAC,SAAS,EAAE,CACd,OAAM,KAAK,OAAO,KAAK,MAAM,QAAQ;QAErC,MAAK,MAAM,KAAK,SAAS,KAAK,OAAO,OAAO,KAAK,QAAQ,CACvD,OAAM,KAAK,SAAS,EAAE,IAAI,SAAS,EAAE,EAAE,KAAK,MAAM,QAAQ;aAK1D,SAAS,EAAE,CACb,OAAM,KAAK,MAAM,KAAK,MAAM,QAAQ;QAEpC,MAAK,MAAM,KAAK,SAAS,KAAK,OAAO,OAAO,KAAK,QAAQ,CACvD,OAAM,KAAK,SAAS,EAAE,IAAI,SAAS,EAAE,EAAE,KAAK,MAAM,QAAQ;AAKlE;GAEF,KAAK,UAAU;IACb,MAAM,UAAU,MAAM,KAAK,SAAS,KAAK,MAAM,OAAO,KAAK,QAAQ,CAAC;IACpE,MAAM,WAAW,MAAM,KAAK,SAAS,KAAK,OAAO,OAAO,KAAK,QAAQ,CAAC;AACtE,SAAK,MAAM,KAAK,QACd,MAAK,MAAM,KAAK,SACd,OAAM,KAAK,cAAc,KAAK,IAAI,GAAG,GAAG,KAAK,KAAK,EAAE,KAAK,MAAM,QAAQ;AAG3E;;GAEF,KAAK;AACH,WAAO,OAAO,MAAM,OAAO,KAAK,SAAS,SAAS;AAClD;GACF,KAAK;AACH,WAAO,QAAQ,MAAM,OAAO,KAAK,SAAS,SAAS;AACnD;GACF,KAAK;AACH,WAAO,YAAY,MAAM,OAAO,KAAK,SAAS,SAAS;AACvD;GACF,KAAK;AACH,WAAO,YAAY,MAAM,OAAO,KAAK,SAAS,SAAS;AACvD;GACF,KAAK;AACH,WAAO,eAAe,MAAM,OAAO,KAAK,SAAS,SAAS;AAC1D;GACF,KAAK;AACH,WAAO,WAAW,MAAM,OAAO,KAAK,SAAS,SAAS;AACtD;GACF,KAAK;AACH,WAAO,YAAY,MAAM,OAAO,KAAK,SAAS,SAAS;AACvD;GACF,KAAK,MAAM;IACT,MAAM,SAAS,MAAM,KAAK,SAAS,KAAK,MAAM,OAAO,KAAK,QAAQ,CAAC;AACnE,SAAK,MAAM,OAAO,QAAQ;KAExB,MAAMC,WAAqB;MAAE,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC;MAAE,uBAAO,IAAI,KAAK;MAAE;KAClF,MAAM,SAAS,CAAC,GAAG,KAAK,SAAS;AACjC,YAAO,SAAS,KAAK,MAAM,OAAO,QAAQ,QAAQ;;AAEpD;;GAEF,KAAK;AACH,WAAO,SAAS,MAAM,OAAO,KAAK,SAAS,SAAS;AACpD;GACF,KAAK;AACH,WAAO,QAAQ,MAAM,OAAO,KAAK,SAAS,SAAS;AACnD;;WAEI;AACR,UAAQ,MAAM;;;;;;;;;;;;;;;;;;ACxLlB,MAAa,OAAO,QAAgB,OAAc,UAAuB,EAAE,KAAc;CACvF,MAAM,MAAM,MAAM,OAAO;AACzB,UAAS,IAAI;AACb,QAAO,OAAO,KAAK,OAAO,QAAQ"}
|