@thomasfosterau/effect-parse 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/Ascii.d.ts +0 -2
- package/dist/Ascii.d.ts.map +1 -1
- package/dist/Ascii.js +6 -6
- package/dist/Ascii.js.map +1 -1
- package/dist/Binary.d.ts +0 -2
- package/dist/Binary.d.ts.map +1 -1
- package/dist/Binary.js +1 -2
- package/dist/Bits.d.ts +0 -2
- package/dist/Bits.d.ts.map +1 -1
- package/dist/Bits.js +2 -3
- package/dist/Bits.js.map +1 -1
- package/dist/Compiler.d.ts +0 -2
- package/dist/Compiler.d.ts.map +1 -1
- package/dist/Compiler.js +1 -2
- package/dist/Encoding.d.ts +0 -2
- package/dist/Encoding.d.ts.map +1 -1
- package/dist/Encoding.js +1 -2
- package/dist/Expression.d.ts +0 -2
- package/dist/Expression.d.ts.map +1 -1
- package/dist/Expression.js +44 -8
- package/dist/Expression.js.map +1 -1
- package/dist/Input.d.ts +32 -4
- package/dist/Input.d.ts.map +1 -1
- package/dist/Input.js +47 -8
- package/dist/Input.js.map +1 -1
- package/dist/Nom.d.ts +0 -2
- package/dist/Nom.d.ts.map +1 -1
- package/dist/Nom.js +1 -2
- package/dist/ParseError.d.ts +2 -4
- package/dist/ParseError.d.ts.map +1 -1
- package/dist/ParseError.js +6 -9
- package/dist/ParseError.js.map +1 -1
- package/dist/Parser.d.ts +6 -4
- package/dist/Parser.d.ts.map +1 -1
- package/dist/Parser.js +26 -24
- package/dist/Parser.js.map +1 -1
- package/dist/ParserSchema.d.ts +0 -2
- package/dist/ParserSchema.d.ts.map +1 -1
- package/dist/ParserSchema.js +3 -4
- package/dist/ParserSchema.js.map +1 -1
- package/dist/ParserStream.d.ts +0 -2
- package/dist/ParserStream.d.ts.map +1 -1
- package/dist/ParserStream.js +17 -10
- package/dist/ParserStream.js.map +1 -1
- package/dist/Syntax.d.ts +0 -2
- package/dist/Syntax.d.ts.map +1 -1
- package/dist/Syntax.js +13 -11
- package/dist/Syntax.js.map +1 -1
- package/dist/Text.d.ts +0 -2
- package/dist/Text.d.ts.map +1 -1
- package/dist/Text.js +1 -2
- package/dist/Token.d.ts +0 -2
- package/dist/Token.d.ts.map +1 -1
- package/dist/Token.js +1 -2
- package/dist/internal/compiler/closure.d.ts +5 -2
- package/dist/internal/compiler/closure.d.ts.map +1 -1
- package/dist/internal/compiler/closure.js +160 -92
- package/dist/internal/compiler/closure.js.map +1 -1
- package/dist/internal/compiler/entries.d.ts +0 -2
- package/dist/internal/compiler/entries.d.ts.map +1 -1
- package/dist/internal/compiler/entries.js +6 -7
- package/dist/internal/compiler/entries.js.map +1 -1
- package/dist/internal/compiler/first.d.ts +0 -2
- package/dist/internal/compiler/first.d.ts.map +1 -1
- package/dist/internal/compiler/first.js +10 -10
- package/dist/internal/compiler/first.js.map +1 -1
- package/dist/internal/compiler/jit.d.ts +0 -2
- package/dist/internal/compiler/jit.d.ts.map +1 -1
- package/dist/internal/compiler/jit.js +52 -51
- package/dist/internal/compiler/jit.js.map +1 -1
- package/dist/internal/compiler/registry.d.ts +0 -2
- package/dist/internal/compiler/registry.d.ts.map +1 -1
- package/dist/internal/compiler/registry.js +1 -2
- package/dist/internal/compiler/sets.d.ts +2 -2
- package/dist/internal/compiler/sets.d.ts.map +1 -1
- package/dist/internal/compiler/sets.js +8 -3
- package/dist/internal/compiler/sets.js.map +1 -1
- package/dist/internal/entries.d.ts +0 -2
- package/dist/internal/entries.d.ts.map +1 -1
- package/dist/internal/entries.js +2 -4
- package/dist/internal/entries.js.map +1 -1
- package/dist/internal/key.d.ts +10 -0
- package/dist/internal/key.d.ts.map +1 -0
- package/dist/internal/key.js +11 -0
- package/dist/internal/key.js.map +1 -0
- package/dist/internal/node.d.ts +11 -4
- package/dist/internal/node.d.ts.map +1 -1
- package/dist/internal/node.js +15 -3
- package/dist/internal/node.js.map +1 -1
- package/dist/internal/numbers.d.ts +0 -2
- package/dist/internal/numbers.d.ts.map +1 -1
- package/dist/internal/numbers.js +1 -2
- package/dist/internal/resume.d.ts +5 -6
- package/dist/internal/resume.d.ts.map +1 -1
- package/dist/internal/resume.js +1 -2
- package/dist/internal/resume.js.map +1 -1
- package/dist/internal/run.d.ts +0 -2
- package/dist/internal/run.d.ts.map +1 -1
- package/dist/internal/run.js +2 -3
- package/dist/internal/run.js.map +1 -1
- package/dist/internal/stack.d.ts +0 -2
- package/dist/internal/stack.d.ts.map +1 -1
- package/dist/internal/stack.js +1 -2
- package/dist/internal/syntax.d.ts +30 -20
- package/dist/internal/syntax.d.ts.map +1 -1
- package/dist/internal/syntax.js +73 -66
- package/dist/internal/syntax.js.map +1 -1
- package/dist/internal/text.d.ts +5 -2
- package/dist/internal/text.d.ts.map +1 -1
- package/dist/internal/text.js +14 -5
- package/dist/internal/text.js.map +1 -1
- package/dist/internal/ties.d.ts +0 -2
- package/dist/internal/ties.d.ts.map +1 -1
- package/dist/internal/ties.js +1 -2
- package/dist/internal/tokens.d.ts +10 -9
- package/dist/internal/tokens.d.ts.map +1 -1
- package/dist/internal/tokens.js +4 -8
- package/dist/internal/tokens.js.map +1 -1
- package/package.json +7 -7
- package/src/Ascii.ts +6 -5
- package/src/Bits.ts +1 -1
- package/src/Expression.ts +7 -6
- package/src/Input.ts +50 -11
- package/src/ParseError.ts +13 -9
- package/src/Parser.ts +30 -25
- package/src/ParserSchema.ts +1 -1
- package/src/ParserStream.ts +23 -9
- package/src/Syntax.ts +12 -9
- package/src/internal/compiler/closure.ts +202 -90
- package/src/internal/compiler/entries.ts +14 -11
- package/src/internal/compiler/first.ts +9 -8
- package/src/internal/compiler/jit.ts +95 -74
- package/src/internal/compiler/sets.ts +7 -0
- package/src/internal/entries.ts +2 -2
- package/src/internal/key.ts +11 -0
- package/src/internal/node.ts +19 -2
- package/src/internal/resume.ts +5 -4
- package/src/internal/run.ts +1 -1
- package/src/internal/syntax.ts +78 -87
- package/src/internal/text.ts +24 -4
- package/src/internal/tokens.ts +20 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closure.js","names":[],"sources":["../../../src/internal/compiler/closure.ts"],"sourcesContent":["/**\n * The closure compiler: turns a parser's description into specialized\n * closures with the step signature. Compiled steps return a value, or\n * `Fail` with only `state.mode` set: no diagnostics are recorded.\n *\n * Nothing here generates code, so it works under a Content Security\n * Policy. Parsers that can't be compiled run their own (interpreted) steps\n * on the same state.\n */\nimport * as Predicate from \"effect/Predicate\"\nimport type { Encoding } from \"../../Encoding.js\"\nimport type { ErrMode, State } from \"../../Input.js\"\nimport { Fail } from \"../../Input.js\"\nimport * as Option from \"effect/Option\"\nimport type { Node, NodeOf, ParserLike } from \"../node.js\"\nimport { addEntry, flushEntries, fromEntries, isPlainKey } from \"../entries.js\"\nimport { nodeOf } from \"../node.js\"\nimport { floatScan, floatTexts, scanFloatBytes, scanFloatString, toFloat } from \"../numbers.js\"\nimport { charOf, fastLimit, firstCodePoint, fold, validate } from \"../text.js\"\nimport { countTokens, indexOf } from \"../tokens.js\"\nimport type { AltPlan } from \"./first.js\"\nimport * as Resume from \"../resume.js\"\nimport type { Backend } from \"./registry.js\"\nimport type { EntryPair } from \"./entries.js\"\nimport { buildsEntries, pairOf } from \"./entries.js\"\nimport { FirstSets, planAlt } from \"./first.js\"\nimport type { CharSet } from \"./sets.js\"\nimport { kindOfEncoding, TableSize, textSet, tokenSet } from \"./sets.js\"\n\nexport type Step = (state: State<any>) => any\n\n/** A parser that the compiler left to its interpreted step. */\nexport interface Fallback {\n readonly name: string | undefined\n readonly tag: Node[\"_tag\"]\n readonly reason: string\n}\n\n/** The maximum number of distinct parsers compiled for one root. */\nconst maxNodes = 2048\n\nconst BT: ErrMode = \"Backtrack\"\nconst CUT: ErrMode = \"Cut\"\nconst INC: ErrMode = \"Incomplete\"\n\n/**\n * How many units past the cursor a single token can depend on (a code\n * point is at most 4 units). In a partial parse, a token parser that read\n * no closer than this to the end of the input behaves exactly as on\n * complete input.\n */\nconst Margin = 4\n\nconst lowerAscii = (c: number): number => (c >= 65 && c <= 90 ? c + 32 : c)\n\nconst isSuccess = (r: any): boolean => r._tag === \"Success\"\nconst isSome = (o: any): boolean => o._tag === \"Some\"\n\ninterface Slot {\n fn: Step | undefined\n}\n\nclass Compiler {\n readonly used = new Map<ParserLike, Slot>()\n readonly unused = new Map<ParserLike, Slot>()\n readonly firsts: FirstSets\n readonly fallbacks: Array<Fallback> = []\n private readonly fellBack = new Set<ParserLike>()\n private budget = maxNodes\n\n /**\n * `resumable`: compile for streaming parses, which may be partial (see\n * `state.partial`) and keep checkpoints (see `internal/resume.ts`).\n */\n constructor(\n readonly kind: 0 | 1 | 2,\n readonly resumable = false\n ) {\n this.firsts = new FirstSets(kind)\n }\n\n /**\n * In a resumable build, runs the compiled token parser `step`, and falls\n * back to the interpreted one when it read within `lookahead` units of\n * the end of a partial input, where it might have to report `Incomplete`.\n * Compiled token parsers leave `state.pos` where they stopped reading,\n * even when they fail.\n */\n private partialSafe(p: ParserLike, step: Step, lookahead: number): Step {\n if (!this.resumable) return step\n const interpreted = p.step\n const ahead = Math.max(lookahead, Margin)\n return (s) => {\n if (!s.partial) return step(s)\n const start = s.pos\n const r = step(s)\n if (s.pos + ahead <= s.end) return r\n s.pos = start\n return interpreted(s)\n }\n }\n\n /** Compiles `p`; when `used` is false its output is not needed. */\n compile(p: ParserLike, used: boolean): Step {\n const memo = used ? this.used : this.unused\n const slot = memo.get(p)\n if (slot !== undefined) {\n if (slot.fn !== undefined) return slot.fn\n // A cycle through `suspend`: the slot is filled once the cycle is compiled, before any parse runs\n return (s) => (slot.fn ?? p.step)(s)\n }\n const fresh: Slot = { fn: undefined }\n memo.set(p, fresh)\n const node = nodeOf(p)\n const fn = --this.budget < 0 ? this.fallback(p, node, \"node budget exceeded\") : this.build(p, node, used)\n fresh.fn = fn\n return fn\n }\n\n fallback(p: ParserLike, node: Node, reason: string): Step {\n this.note(p, node, reason)\n return p.step\n }\n\n /** Records that (part of) `p` runs interpreted. */\n note(p: ParserLike, node: Node, reason: string): void {\n if (!this.fellBack.has(p)) {\n this.fellBack.add(p)\n this.fallbacks.push({ name: p.name, tag: node._tag, reason })\n }\n }\n\n /** Whether a token node reads this input kind natively. */\n private native(enc: Encoding<any> | undefined): boolean {\n return enc === undefined ? this.kind !== 2 : kindOfEncoding(enc) === this.kind\n }\n\n build(p: ParserLike, node: Node, used: boolean): Step {\n switch (node._tag) {\n case \"Opaque\":\n return this.fallback(p, node, \"not describable (Parser.make, gen, ...)\")\n case \"Succeed\": {\n const value = node.value\n return () => value\n }\n case \"Sync\": {\n const evaluate = node.evaluate\n return used ? () => evaluate() : () => undefined\n }\n case \"Fail\": {\n const mode = node.mode\n return (s) => {\n s.mode = mode\n return Fail\n }\n }\n case \"Eof\":\n return (s) => {\n if (s.pos < s.end) {\n s.mode = BT\n return Fail\n }\n if (s.partial) {\n s.mode = INC\n return Fail\n }\n return undefined\n }\n case \"Location\":\n return (s) => s.pos\n case \"RestLen\":\n return (s) => s.end - s.pos\n case \"Suspend\":\n return this.compile(node.resolve(), used)\n case \"Any\":\n case \"Literal\":\n case \"OneOf\":\n case \"Take\":\n case \"TakeWhile\":\n case \"TakeUntil\":\n case \"Rest\":\n if (!this.native(node.encoding)) return this.fallback(p, node, \"token parser on array input\")\n return this.partialSafe(\n p,\n node.encoding === undefined ? this.token(p, node, used) : this.text(p, node, node.encoding, used),\n node._tag === \"Literal\" || node._tag === \"TakeUntil\" ? node.literal.length * 4 : Margin\n )\n case \"TillLineEnding\":\n case \"Identifier\":\n case \"Bom\":\n return this.fallback(p, node, \"leaf parser without a compiled form\")\n case \"Escaped\":\n if (!this.native(node.encoding)) return this.fallback(p, node, \"token parser on array input\")\n return this.escaped(node)\n case \"Map\": {\n if (!used) return this.compile(node.self, false)\n if (node.f === toFloat) {\n const step = this.float(node)\n if (step !== undefined) return step\n }\n // Streaming builds keep the array, which their checkpoints hold\n if (node.f === fromEntries && !this.resumable && buildsEntries(node.self)) return this.entries(node.self)\n const c = this.compile(node.self, true)\n const f = node.f\n return (s) => {\n const a = c(s)\n return a === Fail ? Fail : f(a)\n }\n }\n case \"As\": {\n const c = this.compile(node.self, false)\n if (!used) return c\n const value = node.value\n return (s) => (c(s) === Fail ? Fail : value)\n }\n case \"Tap\": {\n const c = this.compile(node.self, true)\n const f = node.f\n return (s) => {\n const a = c(s)\n if (a !== Fail) f(a)\n return a\n }\n }\n case \"TryMap\": {\n const c = this.compile(node.self, true)\n const f = node.f\n return (s) => {\n const a = c(s)\n if (a === Fail) return Fail\n const r = f(a) as any\n if (isSuccess(r)) return r.success\n s.mode = BT\n return Fail\n }\n }\n case \"FilterMap\": {\n const c = this.compile(node.self, true)\n const f = node.f\n return (s) => {\n const a = c(s)\n if (a === Fail) return Fail\n const o = f(a) as any\n if (isSome(o)) return o.value\n s.mode = BT\n return Fail\n }\n }\n case \"Filter\": {\n const c = this.compile(node.self, true)\n const predicate = node.predicate\n return (s) => {\n const a = c(s)\n if (a === Fail) return Fail\n if (predicate(a)) return a\n s.mode = BT\n return Fail\n }\n }\n case \"FlatMap\": {\n // The parser returned by `f` runs interpreted\n const c = this.compile(node.self, true)\n const f = node.f\n this.note(p, node, \"the parser returned by the function runs interpreted\")\n return (s) => {\n const a = c(s)\n return a === Fail ? Fail : f(a).step(s)\n }\n }\n case \"Taken\":\n if (node.encoding !== undefined && !this.native(node.encoding)) {\n return this.fallback(p, node, \"Text parser on another input kind\")\n }\n return this.taken(node, used)\n case \"WithTaken\": {\n const c = this.compile(node.self, true)\n return (s) => {\n const start = s.pos\n const a = c(s)\n return a === Fail ? Fail : [a, s.slice(start, s.pos)]\n }\n }\n case \"Span\": {\n const c = this.compile(node.self, false)\n if (!used) return c\n return (s) => {\n const start = s.pos\n return c(s) === Fail ? Fail : { start, end: s.pos }\n }\n }\n case \"WithSpan\": {\n const c = this.compile(node.self, true)\n return (s) => {\n const start = s.pos\n const a = c(s)\n return a === Fail ? Fail : [a, { start, end: s.pos }]\n }\n }\n case \"Mode\": {\n const c = this.compile(node.self, used)\n const from = node.from\n const to = node.to\n return (s) => {\n const a = c(s)\n if (a === Fail && s.mode === from) s.mode = to\n return a\n }\n }\n case \"Context\":\n case \"Expected\":\n case \"MapError\":\n case \"OrFail\":\n case \"Trace\":\n case \"Syntax\":\n case \"RetryAfter\":\n // Diagnostics only, or inactive outside parseRecoverable / tracing\n return this.compile(node.self, used)\n case \"ResumeAfter\": {\n const c = this.compile(node.self, used)\n if (!used) return c\n return (s) => {\n const a = c(s)\n return a === Fail ? Fail : Option.some(a)\n }\n }\n case \"Opt\":\n case \"OrElseSucceed\": {\n const c = this.compile(node.self, used)\n const orElse = !used ? undefined : node._tag === \"Opt\" ? Option.none : node.value\n const some = used && node._tag === \"Opt\"\n return (s) => {\n const start = s.pos\n const a = c(s)\n if (a !== Fail) return some ? Option.some(a) : a\n if (s.mode !== BT) return Fail\n s.pos = start\n return orElse === undefined ? undefined : orElse()\n }\n }\n case \"Peek\": {\n const c = this.compile(node.self, used)\n return (s) => {\n const start = s.pos\n const a = c(s)\n if (a !== Fail) s.pos = start\n return a\n }\n }\n case \"Not\": {\n const c = this.compile(node.self, false)\n return (s) => {\n const start = s.pos\n if (c(s) !== Fail) {\n s.pos = start\n s.mode = BT\n return Fail\n }\n if (s.mode !== BT) return Fail\n s.pos = start\n return undefined\n }\n }\n case \"Seq\":\n return this.seq(node, used)\n case \"Struct\": {\n const keys = node.keys\n const steps = node.parsers.map((q) => this.compile(q, used))\n const n = steps.length\n if (!used) return this.chain(steps)\n return (s) => {\n const out: Record<string, unknown> = {}\n for (let i = 0; i < n; i++) {\n const a = steps[i](s)\n if (a === Fail) return Fail\n out[keys[i]] = a\n }\n return out\n }\n }\n case \"ZipWith\": {\n const c1 = this.compile(node.self, used)\n const c2 = this.compile(node.that, used)\n if (!used) return this.chain([c1, c2])\n const f = node.f\n return (s) => {\n const a = c1(s)\n if (a === Fail) return Fail\n const b = c2(s)\n return b === Fail ? Fail : f(a, b)\n }\n }\n case \"Alt\":\n return this.alt(node, used)\n case \"Dispatch\":\n return this.dispatch(p, node, used)\n case \"Repeat\":\n case \"Fold\":\n return this.repeat(node, used)\n case \"RepeatTill\":\n return this.repeatTill(node)\n case \"Separated\":\n return this.separated(node, used)\n case \"SeparatedFold\":\n return this.separatedFold(node)\n case \"Service\":\n case \"Provide\":\n return this.fallback(p, node, \"services stay interpreted\")\n }\n }\n\n /** Runs steps in order, for their effect on the cursor only. */\n chain(steps: ReadonlyArray<Step>): Step {\n const n = steps.length\n if (n === 0) return () => undefined\n if (n === 1) return steps[0]\n if (n === 2) {\n const [a, b] = steps as [Step, Step]\n return (s) => (a(s) === Fail ? Fail : b(s))\n }\n return (s) => {\n for (let i = 0; i < n; i++) if (steps[i](s) === Fail) return Fail\n return undefined\n }\n }\n\n seq(node: NodeOf<\"Seq\">, used: boolean): Step {\n const output = node.output\n const keep = (i: number) =>\n used && (output === \"tuple\" || output === i || (Array.isArray(output) && output.includes(i)))\n const steps = node.parsers.map((q, i) => this.compile(q, keep(i)))\n const n = steps.length\n if (!used) return this.chain(steps)\n if (output === \"tuple\") {\n return (s) => {\n const out = new Array(n)\n for (let i = 0; i < n; i++) {\n const a = steps[i](s)\n if (a === Fail) return Fail\n out[i] = a\n }\n return out\n }\n }\n if (Predicate.isNumber(output)) {\n if (n === 2) {\n const [a, b] = steps as [Step, Step]\n return output === 0\n ? (s) => {\n const x = a(s)\n if (x === Fail) return Fail\n return b(s) === Fail ? Fail : x\n }\n : (s) => (a(s) === Fail ? Fail : b(s))\n }\n return (s) => {\n let out: unknown\n for (let i = 0; i < n; i++) {\n const a = steps[i](s)\n if (a === Fail) return Fail\n if (i === output) out = a\n }\n return out\n }\n }\n const [i0, i1] = output\n return (s) => {\n let x: unknown\n let y: unknown\n for (let i = 0; i < n; i++) {\n const a = steps[i](s)\n if (a === Fail) return Fail\n if (i === i0) x = a\n else if (i === i1) y = a\n }\n return [x, y]\n }\n }\n\n /** The unit at the cursor, or -1 at the end of the input. */\n private unitReader(): (s: State<any>) => number {\n return this.kind === 0\n ? (s) => (s.pos < s.end ? (s.input as string).charCodeAt(s.pos) : -1)\n : (s) => (s.pos < s.end ? (s.input as Uint8Array)[s.pos] : -1)\n }\n\n alt(node: NodeOf<\"Alt\">, used: boolean): Step {\n const steps = node.parsers.map((q) => this.compile(q, used))\n const n = steps.length\n if (n === 0) {\n return (s) => {\n s.mode = BT\n return Fail\n }\n }\n if (n === 1) return steps[0]\n const plan: AltPlan | undefined = this.kind === 2 ? undefined : planAlt(node.parsers.map((q) => this.firsts.of(q)))\n if (plan === undefined) {\n return (s) => {\n const start = s.pos\n for (let i = 0; i < n; i++) {\n const a = steps[i](s)\n if (a !== Fail) return a\n if (s.mode !== BT) return Fail\n s.pos = start\n }\n s.mode = BT\n return Fail\n }\n }\n const lists = plan.lists.map((l) => l.map((i) => steps[i]))\n const { byUnit, end, high } = plan\n const unit = this.unitReader()\n const resumable = this.resumable\n return (s) => {\n // Near the end of a partial input, branches may be incomplete rather than fail\n const u = resumable && s.partial && s.pos + Margin > s.end ? -2 : unit(s)\n const candidates = u === -2 ? steps : lists[u < 0 ? end : u < TableSize ? byUnit[u] : high]\n const start = s.pos\n for (let i = 0; i < candidates.length; i++) {\n const a = candidates[i](s)\n if (a !== Fail) return a\n if (s.mode !== BT) return Fail\n s.pos = start\n }\n s.mode = BT\n return Fail\n }\n }\n\n dispatch(p: ParserLike, node: NodeOf<\"Dispatch\">, used: boolean): Step {\n const selector = this.compile(node.selector, true)\n const choose = node.choose\n const compiled = new Map<ParserLike, Step>()\n if (node.cases !== undefined) {\n for (const key of Reflect.ownKeys(node.cases)) {\n const q = node.cases[key as any]\n if (!compiled.has(q)) compiled.set(q, this.compile(q, used))\n }\n }\n if (node.otherwise !== undefined && !compiled.has(node.otherwise)) {\n compiled.set(node.otherwise, this.compile(node.otherwise, used))\n }\n const general: Step = (s) => {\n const start = s.pos\n const key = selector(s)\n if (key === Fail) return Fail\n const q = choose(key)\n if (q === undefined) {\n s.pos = start\n s.mode = BT\n return Fail\n }\n return (compiled.get(q) ?? q.step)(s)\n }\n if (node.cases === undefined) {\n this.note(p, node, \"the parser returned by the function of cases runs interpreted\")\n return general\n }\n // Switch on the next unit when the selector is `any` or `peek(any)`\n let sel = nodeOf(node.selector)\n const peek = sel._tag === \"Peek\"\n if (peek) sel = nodeOf((sel as NodeOf<\"Peek\">).self)\n if (sel._tag !== \"Any\" || !this.native(sel.encoding)) return general\n const enc = sel.encoding\n // Units below `limit` are whole tokens, so the key is known in advance\n const limit = enc === undefined ? (this.kind === 0 ? 0xd800 : TableSize) : Math.min(fastLimit(enc), 0xd800)\n const size = Math.min(limit, TableSize)\n if (size === 0) return general\n const table: Array<Step | null> = []\n for (let u = 0; u < size; u++) {\n const key = enc === undefined && this.kind === 1 ? u : charOf(u)\n const q = choose(key)\n table.push(q === undefined ? null : (compiled.get(q) ?? q.step))\n }\n const unit = this.unitReader()\n const advance = peek ? 0 : 1\n const resumable = this.resumable\n return (s) => {\n if (resumable && s.partial && s.pos + Margin > s.end) return general(s)\n const u = unit(s)\n if (u < 0) {\n s.mode = BT\n return Fail\n }\n if (u >= size) return general(s)\n const q = table[u]\n if (q === null) {\n s.mode = BT\n return Fail\n }\n s.pos += advance\n return q(s)\n }\n }\n\n repeat(node: NodeOf<\"Repeat\"> | NodeOf<\"Fold\">, used: boolean): Step {\n const { max, min } = node\n const checkLoop = max === Infinity\n const isFold = node._tag === \"Fold\"\n const cond = isFold ? (node as NodeOf<\"Fold\">).while : undefined\n const c = this.compile(node.self, used)\n const resumable = this.resumable\n const key = {}\n // The accumulator: an array, the fold's value, or nothing when unused (and unneeded by `while`)\n const tracked = used || cond !== undefined\n const init: () => unknown = !tracked ? () => undefined : isFold ? (node as NodeOf<\"Fold\">).init : () => []\n const add: (acc: any, a: unknown) => unknown = !tracked\n ? (acc) => acc\n : isFold\n ? (node as NodeOf<\"Fold\">).f\n : (acc, a) => {\n acc.push(a)\n return acc\n }\n return (s) => {\n const entry = s.pos\n let acc: unknown\n let count = 0\n let resumed = false\n if (resumable && s.resume !== undefined) {\n const cp = Resume.take(s, key, entry) as Resume.Done | { acc: unknown; count: number; pos: number } | undefined\n if (cp instanceof Resume.Done) {\n s.pos = cp.pos\n return cp.value\n }\n if (cp !== undefined) {\n acc = cp.acc\n count = cp.count\n s.pos = cp.pos\n resumed = true\n }\n }\n if (!resumed) acc = init()\n for (; count < max; count++) {\n if (cond !== undefined && count >= min && !cond(acc)) break\n const start = s.pos\n const a = c(s)\n if (a === Fail) {\n if (s.mode === INC && s.resume !== undefined) Resume.save(s, key, entry, { acc, count, pos: start })\n if (s.mode !== BT || count < min) return Fail\n s.pos = start\n return resumed ? Resume.done(s, key, entry, true, acc) : acc\n }\n if (checkLoop && s.pos === start) {\n s.mode = CUT\n return Fail\n }\n acc = add(acc, a)\n }\n return resumed ? Resume.done(s, key, entry, true, acc) : acc\n }\n }\n\n /**\n * `map(self, Object.fromEntries)`, where `buildsEntries(self)`: builds the\n * object directly (see the JIT).\n */\n private entries(p: ParserLike): Step {\n const node = nodeOf(p)\n switch (node._tag) {\n case \"Mode\": {\n const c = this.entries(node.self)\n const from = node.from\n const to = node.to\n return (s) => {\n const a = c(s)\n if (a === Fail && s.mode === from) s.mode = to\n return a\n }\n }\n case \"Seq\": {\n const i = node.output as number\n const steps = node.parsers.map((q, j) => (j === i ? this.entries(q) : this.compile(q, false)))\n return (s) => {\n let out: unknown\n for (let j = 0; j < steps.length; j++) {\n const a = steps[j](s)\n if (a === Fail) return Fail\n if (j === i) out = a\n }\n return out\n }\n }\n case \"Repeat\":\n case \"Separated\": {\n const pair = pairOf(node.self)\n if (pair !== undefined) return this.entriesLoop(node, pair)\n // Not reached (`buildsEntries` found the pair): build the pairs, then the object\n const c = this.compile(p, true)\n return (s) => {\n const a = c(s)\n return a === Fail ? Fail : fromEntries(a as Iterable<readonly [PropertyKey, unknown]>)\n }\n }\n default:\n return this.entries((node as { readonly self: ParserLike }).self)\n }\n }\n\n private entriesLoop(node: NodeOf<\"Repeat\"> | NodeOf<\"Separated\">, pair: EntryPair): Step {\n const parts = pair.parsers.map((q, j) => this.compile(q, j === pair.key || j === pair.value))\n const { key: ki, value: vi } = pair\n // Parses an entry and adds it to `acc`\n const entry = (s: State<any>, acc: EntriesAcc): boolean => {\n let key: unknown\n let value: unknown\n for (let j = 0; j < parts.length; j++) {\n const a = parts[j](s)\n if (a === Fail) return false\n if (j === ki) key = a\n else if (j === vi) value = a\n }\n acc.add(key, value)\n return true\n }\n const { max, min } = node\n const checkLoop = max === Infinity\n if (node._tag === \"Repeat\") {\n return (s) => {\n const acc = new EntriesAcc()\n for (let count = 0; count < max; count++) {\n const start = s.pos\n let key: unknown\n let value: unknown\n let ok = true\n for (let j = 0; j < parts.length; j++) {\n const a = parts[j](s)\n if (a === Fail) {\n ok = false\n break\n }\n if (j === ki) key = a\n else if (j === vi) value = a\n }\n if (!ok) {\n if (s.mode !== BT || count < min) return Fail\n s.pos = start\n return acc.result()\n }\n if (checkLoop && s.pos === start) {\n s.mode = CUT\n return Fail\n }\n acc.add(key, value)\n }\n return acc.result()\n }\n }\n const sep = this.compile(node.separator, false)\n return (s) => {\n const acc = new EntriesAcc()\n let count = 0\n if (max === 0) return acc.result()\n let start = s.pos\n if (!entry(s, acc)) {\n if (s.mode !== BT || min > 0) return Fail\n s.pos = start\n return acc.result()\n }\n count++\n while (count < max) {\n start = s.pos\n if (sep(s) === Fail) {\n if (s.mode !== BT || count < min) return Fail\n s.pos = start\n return acc.result()\n }\n if (checkLoop && s.pos === start) {\n s.mode = CUT\n return Fail\n }\n if (!entry(s, acc)) {\n if (s.mode !== BT || count < min) return Fail\n s.pos = start\n return acc.result()\n }\n count++\n }\n return acc.result()\n }\n }\n\n repeatTill(node: NodeOf<\"RepeatTill\">): Step {\n const { max, min } = node\n const c = this.compile(node.self, true)\n const end = this.compile(node.end, true)\n return (s) => {\n const acc: Array<unknown> = []\n while (true) {\n const start = s.pos\n if (acc.length >= min) {\n const b = end(s)\n if (b !== Fail) return [acc, b]\n if (s.mode !== BT) return Fail\n s.pos = start\n if (acc.length >= max) return Fail\n }\n const a = c(s)\n if (a === Fail) return Fail\n if (s.pos === start) {\n s.mode = CUT\n return Fail\n }\n acc.push(a)\n }\n }\n }\n\n separated(node: NodeOf<\"Separated\">, used: boolean): Step {\n const { max, min } = node\n const checkLoop = max === Infinity\n const c = this.compile(node.self, used)\n const sep = this.compile(node.separator, false)\n const resumable = this.resumable\n const key = {}\n return (s) => {\n const entry = s.pos\n let acc: Array<unknown> | undefined\n let count = 0\n let resumed = false\n if (resumable && s.resume !== undefined) {\n const cp = Resume.take(s, key, entry) as\n | Resume.Done\n | { acc: Array<unknown>; count: number; pos: number }\n | undefined\n if (cp instanceof Resume.Done) {\n s.pos = cp.pos\n return cp.value\n }\n if (cp !== undefined) {\n acc = cp.acc\n count = cp.count\n s.pos = cp.pos\n resumed = true\n }\n }\n if (!resumed) {\n acc = used ? [] : undefined\n if (max === 0) return acc\n const start = s.pos\n const first = c(s)\n if (first === Fail) {\n if (s.mode !== BT || min > 0) return Fail\n s.pos = start\n return acc\n }\n acc?.push(first)\n count = 1\n }\n while (count < max) {\n const start = s.pos\n if (sep(s) === Fail) {\n if (s.mode === INC && s.resume !== undefined) Resume.save(s, key, entry, { acc, count, pos: start })\n if (s.mode !== BT || count < min) return Fail\n s.pos = start\n return resumed ? Resume.done(s, key, entry, true, acc) : acc\n }\n if (checkLoop && s.pos === start) {\n s.mode = CUT\n return Fail\n }\n const a = c(s)\n if (a === Fail) {\n if (s.mode === INC && s.resume !== undefined) Resume.save(s, key, entry, { acc, count, pos: start })\n if (s.mode !== BT || count < min) return Fail\n s.pos = start\n return resumed ? Resume.done(s, key, entry, true, acc) : acc\n }\n acc?.push(a)\n count++\n }\n return resumed ? Resume.done(s, key, entry, true, acc) : acc\n }\n }\n\n separatedFold(node: NodeOf<\"SeparatedFold\">): Step {\n const c = this.compile(node.self, true)\n const sep = this.compile(node.separator, true)\n const op = node.op\n const resumable = this.resumable\n const key = {}\n if (!node.right) {\n return (s) => {\n const entry = s.pos\n let acc: unknown\n let resumed = false\n if (resumable && s.resume !== undefined) {\n const cp = Resume.take(s, key, entry) as Resume.Done | { acc: unknown; pos: number } | undefined\n if (cp instanceof Resume.Done) {\n s.pos = cp.pos\n return cp.value\n }\n if (cp !== undefined) {\n acc = cp.acc\n s.pos = cp.pos\n resumed = true\n }\n }\n if (!resumed) {\n acc = c(s)\n if (acc === Fail) return Fail\n }\n while (true) {\n const start = s.pos\n const x = sep(s)\n if (x === Fail) {\n if (s.mode === INC && s.resume !== undefined) Resume.save(s, key, entry, { acc, pos: start })\n if (s.mode !== BT) return Fail\n s.pos = start\n return resumed ? Resume.done(s, key, entry, true, acc) : acc\n }\n if (s.pos === start) {\n s.mode = CUT\n return Fail\n }\n const a = c(s)\n if (a === Fail) {\n if (s.mode === INC && s.resume !== undefined) Resume.save(s, key, entry, { acc, pos: start })\n if (s.mode !== BT) return Fail\n s.pos = start\n return resumed ? Resume.done(s, key, entry, true, acc) : acc\n }\n acc = op(acc, x, a)\n }\n }\n }\n return (s) => {\n const first = c(s)\n if (first === Fail) return Fail\n const values: Array<unknown> = [first]\n const seps: Array<unknown> = []\n while (true) {\n const start = s.pos\n const x = sep(s)\n if (x === Fail) {\n if (s.mode !== BT) return Fail\n s.pos = start\n break\n }\n if (s.pos === start) {\n s.mode = CUT\n return Fail\n }\n const a = c(s)\n if (a === Fail) {\n if (s.mode !== BT) return Fail\n s.pos = start\n break\n }\n seps.push(x)\n values.push(a)\n }\n let acc = values[values.length - 1]\n for (let i = seps.length - 1; i >= 0; i--) acc = op(values[i], seps[i], acc)\n return acc\n }\n }\n\n // ---------------------------------------------------------------------------\n // Token parsers (`Token`, `Ascii`)\n // ---------------------------------------------------------------------------\n\n token(p: ParserLike, node: TokenNode, used: boolean): Step {\n const kind = this.kind as 0 | 1\n switch (node._tag) {\n case \"Any\":\n if (kind === 1) {\n return (s) => {\n const pos = s.pos\n if (pos >= s.end) return fail(s)\n s.pos = pos + 1\n return (s.input as Uint8Array)[pos]\n }\n }\n return (s) => {\n const pos = s.pos\n if (pos >= s.end) return fail(s)\n const str = s.input as string\n const c = str.charCodeAt(pos)\n if (c >= 0xd800 && c <= 0xdbff && pos + 1 < str.length && (str.charCodeAt(pos + 1) & 0xfc00) === 0xdc00) {\n s.pos = pos + 2\n return used ? str.slice(pos, pos + 2) : undefined\n }\n s.pos = pos + 1\n return used ? str[pos] : undefined\n }\n case \"Literal\":\n return this.tokenLiteral(p, node)\n case \"OneOf\": {\n const set = tokenSet(node.set, kind)\n const negate = node.negate\n const accept = acceptTable(set, negate)\n const test = set.test\n if (kind === 1) {\n return (s) => {\n const pos = s.pos\n if (pos >= s.end) return fail(s)\n const b = (s.input as Uint8Array)[pos]\n if (accept[b] === 0) return fail(s)\n s.pos = pos + 1\n return b\n }\n }\n return (s) => {\n const pos = s.pos\n if (pos >= s.end) return fail(s)\n const str = s.input as string\n const c = str.charCodeAt(pos)\n if (c < TableSize) {\n if (accept[c] === 0) return fail(s)\n s.pos = pos + 1\n return used ? str[pos] : undefined\n }\n let cp = c\n if (c >= 0xd800 && c <= 0xdbff && pos + 1 < str.length) {\n const d = str.charCodeAt(pos + 1)\n if ((d & 0xfc00) === 0xdc00) cp = ((c - 0xd800) << 10) + (d - 0xdc00) + 0x10000\n }\n if (test(cp) === negate) return fail(s)\n const len = cp > 0xffff ? 2 : 1\n s.pos = pos + len\n return !used ? undefined : len === 1 ? str[pos] : str.slice(pos, pos + 2)\n }\n }\n case \"Take\": {\n const count = node.count\n if (kind === 1) {\n return (s) => {\n const start = s.pos\n if (s.end - start < count) return failAt(s, s.end)\n s.pos = start + count\n return used ? (s.input as Uint8Array).subarray(start, start + count) : undefined\n }\n }\n return (s) => {\n const str = s.input as string\n const start = s.pos\n const end = s.end\n let i = start\n let got = 0\n while (got < count && i < end) {\n const c = str.charCodeAt(i)\n i += c >= 0xd800 && c <= 0xdbff && i + 1 < str.length && (str.charCodeAt(i + 1) & 0xfc00) === 0xdc00 ? 2 : 1\n got++\n }\n if (got < count) return failAt(s, i)\n s.pos = i\n return used ? str.slice(start, i) : undefined\n }\n }\n case \"TakeWhile\":\n return this.tokenTakeWhile(node, used)\n case \"TakeUntil\": {\n const { literal, max, min } = node\n const bounded = min > 0 || max !== Infinity\n return (s) => {\n const start = s.pos\n const idx = indexOf(s, literal, start)\n if (idx < 0) return failAt(s, s.end)\n if (bounded) {\n const count = countTokens(s, start, idx)\n if (count < min || count > max) return failAt(s, idx)\n }\n s.pos = idx\n return used ? s.slice(start, idx) : undefined\n }\n }\n case \"Rest\":\n return (s) => {\n const start = s.pos\n s.pos = s.end\n return used ? s.slice(start, s.end) : undefined\n }\n }\n }\n\n tokenLiteral(p: ParserLike, node: NodeOf<\"Literal\">): Step {\n const lit = node.literal\n const literalKind = Predicate.isString(lit) ? 0 : lit instanceof Uint8Array ? 1 : 2\n if (this.kind === 0) {\n if (literalKind !== 0) return this.fallback(p, node, \"byte or array literal on string input\")\n const str = lit as string\n const len = str.length\n if (node.caseless) {\n const lowered = Array.from({ length: len }, (_, i) => lowerAscii(str.charCodeAt(i)))\n return (s) => {\n const pos = s.pos\n if (s.end - pos < len) return fail(s)\n const input = s.input as string\n for (let i = 0; i < len; i++) {\n if (lowerAscii(input.charCodeAt(pos + i)) !== lowered[i]) return fail(s)\n }\n s.pos = pos + len\n return input.slice(pos, pos + len)\n }\n }\n return stringLiteral(str, str)\n }\n if (literalKind === 2) return this.fallback(p, node, \"array literal on byte input\")\n const bytes = literalKind === 0 ? new TextEncoder().encode(lit as string) : (lit as Uint8Array)\n const len = bytes.length\n const sameKind = literalKind === 1 && !node.caseless\n const expect = node.caseless ? Array.from(bytes, lowerAscii) : Array.from(bytes)\n const caseless = node.caseless\n return (s) => {\n const pos = s.pos\n if (s.end - pos < len) return fail(s)\n const input = s.input as Uint8Array\n for (let i = 0; i < len; i++) {\n const b = input[pos + i]\n if ((caseless ? lowerAscii(b) : b) !== expect[i]) return fail(s)\n }\n s.pos = pos + len\n return sameKind ? lit : input.subarray(pos, pos + len)\n }\n }\n\n tokenTakeWhile(node: NodeOf<\"TakeWhile\">, used: boolean): Step {\n const kind = this.kind as 0 | 1\n const { max, min, negate } = node\n const set = tokenSet(node.set, kind)\n const accept = acceptTable(set, negate)\n if (kind === 1) {\n return (s) => {\n const bytes = s.input as Uint8Array\n const start = s.pos\n const limit = max === Infinity ? s.end : Math.min(s.end, start + max)\n let i = start\n while (i < limit && accept[bytes[i]] === 1) i++\n if (i - start < min) return failAt(s, i)\n s.pos = i\n return used ? bytes.subarray(start, i) : undefined\n }\n }\n const test = set.test\n return (s) => {\n const str = s.input as string\n const start = s.pos\n const end = s.end\n let i = start\n let count = 0\n while (count < max && i < end) {\n const c = str.charCodeAt(i)\n if (c < TableSize) {\n if (accept[c] === 0) break\n i++\n } else if (c < 0xd800 || c > 0xdbff) {\n if (test(c) === negate) break\n i++\n } else {\n let cp = c\n if (i + 1 < str.length) {\n const d = str.charCodeAt(i + 1)\n if ((d & 0xfc00) === 0xdc00) cp = ((c - 0xd800) << 10) + (d - 0xdc00) + 0x10000\n }\n if (test(cp) === negate) break\n i += cp > 0xffff ? 2 : 1\n }\n count++\n }\n if (count < min) return failAt(s, i)\n s.pos = i\n return used ? str.slice(start, i) : undefined\n }\n }\n\n // ---------------------------------------------------------------------------\n // Text parsers, specialized per encoding\n // ---------------------------------------------------------------------------\n\n text(p: ParserLike, node: TokenNode, enc: Encoding<any>, used: boolean): Step {\n const kind = this.kind as 0 | 1\n const fast = fastLimit(enc)\n const decode = enc.decode\n const width = enc.width\n const toText = enc.text\n const unitAt: (input: any, i: number) => number =\n kind === 0 ? (input: string, i) => input.charCodeAt(i) : (input: Uint8Array, i) => input[i]\n switch (node._tag) {\n case \"Any\":\n return (s) => {\n const pos = s.pos\n const end = s.end\n if (pos >= end) return fail(s)\n const c = unitAt(s.input, pos)\n if (c < fast) {\n s.pos = pos + 1\n return used ? charOf(c) : undefined\n }\n const cp = decode(s.input, pos, end)\n if (cp < 0) return fail(s)\n s.pos = pos + width(cp)\n return used ? charOf(cp) : undefined\n }\n case \"Literal\": {\n const lit = node.literal as string\n if (node.caseless) {\n const folded = Array.from(lit, (c) => fold(firstCodePoint(c)))\n const n = folded.length\n return (s) => {\n const start = s.pos\n const end = s.end\n const input = s.input\n let pos = start\n for (let i = 0; i < n; i++) {\n if (pos >= end) return failAt(s, pos)\n const c = unitAt(input, pos)\n let cp: number\n if (c < fast) {\n cp = c\n pos++\n } else {\n cp = decode(input, pos, end)\n if (cp < 0) return failAt(s, pos)\n pos += width(cp)\n }\n if (fold(cp) !== folded[i]) return failAt(s, pos)\n }\n s.pos = pos\n return used ? toText(input, start, pos) : undefined\n }\n }\n const encoded = enc.encode(lit)\n if (Predicate.isString(encoded)) return stringLiteral(encoded, lit)\n const bytes = encoded as Uint8Array\n const len = bytes.length\n if (len === 1) {\n const b0 = bytes[0]\n return (s) => {\n const pos = s.pos\n if (pos < s.end && (s.input as Uint8Array)[pos] === b0) {\n s.pos = pos + 1\n return lit\n }\n return fail(s)\n }\n }\n return (s) => {\n const pos = s.pos\n if (s.end - pos < len) return fail(s)\n const input = s.input as Uint8Array\n for (let i = 0; i < len; i++) if (input[pos + i] !== bytes[i]) return fail(s)\n s.pos = pos + len\n return lit\n }\n }\n case \"OneOf\": {\n const set = textSet(node.set)\n const negate = node.negate\n const accept = acceptTable(set, negate)\n const test = set.test\n return (s) => {\n const pos = s.pos\n const end = s.end\n if (pos >= end) return fail(s)\n const c = unitAt(s.input, pos)\n if (c < fast && c < TableSize) {\n if (accept[c] === 0) return fail(s)\n s.pos = pos + 1\n return used ? charOf(c) : undefined\n }\n const cp = c < fast ? c : decode(s.input, pos, end)\n if (cp < 0 || test(cp) === negate) return fail(s)\n s.pos = pos + (c < fast ? 1 : width(cp))\n return used ? charOf(cp) : undefined\n }\n }\n case \"Take\": {\n const count = node.count\n return (s) => {\n const start = s.pos\n const end = s.end\n const input = s.input\n let pos = start\n for (let got = 0; got < count; got++) {\n if (pos >= end) return failAt(s, pos)\n const c = unitAt(input, pos)\n if (c < fast) pos++\n else {\n const cp = decode(input, pos, end)\n if (cp < 0) return failAt(s, pos)\n pos += width(cp)\n }\n }\n s.pos = pos\n return used ? toText(input, start, pos) : undefined\n }\n }\n case \"TakeWhile\": {\n const { max, min, negate } = node\n const set = textSet(node.set)\n const accept = acceptTable(set, negate)\n const test = set.test\n const small = Math.min(fast, TableSize)\n return (s) => {\n const input = s.input\n const start = s.pos\n const end = s.end\n let i = start\n let count = 0\n while (count < max && i < end) {\n const c = unitAt(input, i)\n if (c < small) {\n if (accept[c] === 0) break\n i++\n } else if (c < fast) {\n if (test(c) === negate) break\n i++\n } else {\n const cp = decode(input, i, end)\n if (cp < 0 || test(cp) === negate) break\n i += width(cp)\n }\n count++\n }\n if (count < min) return failAt(s, i)\n s.pos = i\n return used ? toText(input, start, i) : undefined\n }\n }\n case \"TakeUntil\":\n case \"Rest\":\n return this.fallback(p, node, \"Text parser without a compiled form\")\n }\n }\n\n taken(node: NodeOf<\"Taken\">, used: boolean): Step {\n const c = this.compile(node.self, false)\n const enc = node.encoding\n if (enc === undefined) {\n if (!used) return c\n if (this.kind === 0) {\n return (s) => {\n const start = s.pos\n return c(s) === Fail ? Fail : (s.input as string).slice(start, s.pos)\n }\n }\n return (s) => {\n const start = s.pos\n return c(s) === Fail ? Fail : s.slice(start, s.pos)\n }\n }\n // `Text.taken` checks that the text is well formed, then decodes it\n const fast = fastLimit(enc)\n const toText = enc.text\n const unitAt: (input: any, i: number) => number =\n this.kind === 0 ? (input: string, i) => input.charCodeAt(i) : (input: Uint8Array, i) => input[i]\n return (s) => {\n const start = s.pos\n if (c(s) === Fail) return Fail\n const end = s.pos\n const input = s.input\n let i = start\n while (i < end && unitAt(input, i) < fast) i++\n if (i < end && validate(enc, s, i, end) < 0) return fail(s)\n return used ? toText(input, start, end) : undefined\n }\n }\n\n /**\n * `Ascii.float` and `Text.float` (`map(floatText, toFloat)`): numbers in\n * decimal notation are matched and converted in one pass, without\n * slicing the input; the rest runs the compiled parser (see the JIT).\n */\n private float(node: NodeOf<\"Map\">): Step | undefined {\n if (!floatTexts.has(node.self) || this.kind === 2) return undefined\n let taken = nodeOf(node.self)\n while (taken._tag === \"Expected\") taken = nodeOf(taken.self)\n if (taken._tag !== \"Taken\") return undefined\n const enc = taken.encoding\n if (enc !== undefined && !(this.native(enc) && enc.unit === 1 && enc.asciiCompatible)) return undefined\n const c = this.compile(node.self, true)\n const scan = (this.kind === 0 ? scanFloatString : scanFloatBytes) as (\n input: unknown,\n i: number,\n end: number\n ) => unknown\n const resumable = this.resumable\n return (s) => {\n const v = scan(s.input, s.pos, s.end)\n // Near the end of a partial input, the parser may have to report `Incomplete`\n if (v === undefined || (resumable && s.partial && floatScan.read + Margin > s.end)) {\n const t = c(s)\n return t === Fail ? Fail : toFloat(t)\n }\n if (v === Fail) return fail(s)\n s.pos = floatScan.end\n return v\n }\n }\n\n escaped(node: NodeOf<\"Escaped\">): Step {\n const raw = node.raw\n const normal = this.compile(node.normal, !raw)\n const escape = this.compile(node.escape, !raw)\n const enc = node.encoding\n const ctrl = node.control\n const kind = this.kind\n // Matches the control character, advancing past it\n let control: (s: State<any>) => boolean\n if (enc === undefined || (ctrl < fastLimit(enc) && ctrl < TableSize)) {\n control =\n kind === 0\n ? (s) => {\n if (s.pos < s.end && (s.input as string).charCodeAt(s.pos) === ctrl) {\n s.pos++\n return true\n }\n return false\n }\n : (s) => {\n if (s.pos < s.end && (s.input as Uint8Array)[s.pos] === ctrl) {\n s.pos++\n return true\n }\n return false\n }\n } else {\n control = (s) => {\n if (s.pos >= s.end) return false\n const cp = enc.decode(s.input, s.pos, s.end)\n if (cp !== ctrl) return false\n s.pos += enc.width(cp)\n return true\n }\n }\n const resumable = this.resumable\n const key = {}\n /** Fails as incomplete, keeping a checkpoint in a streaming parse. */\n const incomplete = (s: State<any>, start: number, checkpoint: unknown): typeof Fail => {\n if (s.resume !== undefined) Resume.save(s, key, start, checkpoint)\n s.mode = INC\n return Fail\n }\n if (raw) {\n const slice: (s: State<any>, start: number) => unknown =\n enc === undefined ? (s, start) => s.slice(start, s.pos) : (s, start) => enc.text(s.input, start, s.pos)\n return (s) => {\n const start = s.pos\n let resumed = false\n if (resumable && s.resume !== undefined) {\n const cp = Resume.take(s, key, start) as Resume.Done | number | undefined\n if (cp instanceof Resume.Done) {\n s.pos = cp.pos\n return cp.value\n }\n if (cp !== undefined) {\n s.pos = cp\n resumed = true\n }\n }\n while (s.pos < s.end) {\n const before = s.pos\n if (normal(s) !== Fail) {\n if (s.pos === before) {\n s.mode = CUT\n return Fail\n }\n continue\n }\n if (s.mode === INC) return incomplete(s, start, before)\n if (s.mode !== BT) return Fail\n s.pos = before\n if (control(s)) {\n if (escape(s) === Fail) return s.mode === INC ? incomplete(s, start, before) : Fail\n } else {\n return resumed ? Resume.done(s, key, start, true, slice(s, start)) : slice(s, start)\n }\n }\n if (s.partial) return incomplete(s, start, s.pos)\n return resumed ? Resume.done(s, key, start, true, slice(s, start)) : slice(s, start)\n }\n }\n return (s) => {\n const start = s.pos\n let out = \"\"\n let resumed = false\n if (resumable && s.resume !== undefined) {\n const cp = Resume.take(s, key, start) as Resume.Done | { out: string; pos: number } | undefined\n if (cp instanceof Resume.Done) {\n s.pos = cp.pos\n return cp.value\n }\n if (cp !== undefined) {\n out = cp.out\n s.pos = cp.pos\n resumed = true\n }\n }\n while (s.pos < s.end) {\n const before = s.pos\n const a = normal(s)\n if (a !== Fail) {\n if (s.pos !== before) {\n out += a\n continue\n }\n } else {\n if (s.mode === INC) return incomplete(s, start, { out, pos: before })\n if (s.mode !== BT) return Fail\n s.pos = before\n }\n if (control(s)) {\n const b = escape(s)\n if (b === Fail) return s.mode === INC ? incomplete(s, start, { out, pos: before }) : Fail\n out += b\n } else {\n return resumed ? Resume.done(s, key, start, true, out) : out\n }\n }\n if (s.partial) return incomplete(s, start, { out, pos: s.pos })\n return resumed ? Resume.done(s, key, start, true, out) : out\n }\n }\n}\n\ntype TokenNode = NodeOf<\"Any\" | \"Literal\" | \"OneOf\" | \"Take\" | \"TakeWhile\" | \"TakeUntil\" | \"Rest\">\n\nconst fail = (s: State<any>): typeof Fail => {\n s.mode = BT\n return Fail\n}\n\n/** Fails, leaving the cursor at `pos`: how far a token parser read (see `partialSafe`). */\nconst failAt = (s: State<any>, pos: number): typeof Fail => {\n s.pos = pos\n s.mode = BT\n return Fail\n}\n\n/** 1 where a small code is accepted (taking `negate` into account). */\nconst acceptTable = (set: CharSet, negate: boolean): Uint8Array => {\n const t = new Uint8Array(TableSize)\n for (let c = 0; c < TableSize; c++) t[c] = (set.table[c] === 1) !== negate ? 1 : 0\n return t\n}\n\n/** A literal matched against a string input, returning `value`. */\nconst stringLiteral = (str: string, value: unknown): Step => {\n const len = str.length\n if (len === 0) return () => value\n if (len === 1) {\n const c0 = str.charCodeAt(0)\n return (s) => {\n const pos = s.pos\n if (pos < s.end && (s.input as string).charCodeAt(pos) === c0) {\n s.pos = pos + 1\n return value\n }\n return fail(s)\n }\n }\n return (s) => {\n const pos = s.pos\n if (s.end - pos >= len && (s.input as string).startsWith(str, pos)) {\n s.pos = pos + len\n return value\n }\n return fail(s)\n }\n}\n\n/** A closure compiler for one input kind; it memoizes what it compiles. */\n/** The object of `Object.fromEntries`, built an entry at a time (see `internal/entries.ts`). */\nclass EntriesAcc {\n readonly o: Record<string, unknown> = {}\n deferred: Array<unknown> | undefined = undefined\n add(key: unknown, value: unknown): void {\n if (this.deferred === undefined && isPlainKey(key)) this.o[key] = value\n else this.deferred = addEntry(this.o, this.deferred, key, value)\n }\n result(): object {\n if (this.deferred !== undefined) flushEntries(this.o, this.deferred)\n return this.o\n }\n}\n\nexport interface ClosureCompiler {\n readonly compile: (p: ParserLike, used: boolean) => Step\n readonly note: (p: ParserLike, node: Node, reason: string) => void\n readonly firsts: FirstSets\n readonly fallbacks: ReadonlyArray<Fallback>\n}\n\nexport const createClosureCompiler = (kind: 0 | 1 | 2, resumable = false): ClosureCompiler => {\n const compiler = new Compiler(kind, resumable)\n return {\n compile: (p, used) => compiler.compile(p, used),\n note: (p, node, reason) => compiler.note(p, node, reason),\n firsts: compiler.firsts,\n fallbacks: compiler.fallbacks\n }\n}\n\n/** Compiles a root parser for one input kind. */\nconst compileClosure = (\n root: ParserLike,\n kind: 0 | 1 | 2,\n resumable = false\n): { readonly step: Step; readonly fallbacks: ReadonlyArray<Fallback> } => {\n const compiler = new Compiler(kind, resumable)\n const step = compiler.compile(root, true)\n return { step, fallbacks: compiler.fallbacks }\n}\n\n/** The closure compiler as a backend. */\nexport const backend: Backend = {\n build: (p, kind, resumable) => {\n try {\n const { fallbacks, step } = compileClosure(p, kind, resumable)\n return { backend: \"closure\", step, fallbacks, error: undefined }\n } catch (error) {\n return { backend: undefined, step: undefined, fallbacks: [], error }\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"closure.js","names":[],"sources":["../../../src/internal/compiler/closure.ts"],"sourcesContent":["/**\n * The closure compiler: turns a parser's description into specialized\n * closures with the step signature. Compiled steps return a value, or\n * `Fail` with only `state.mode` set: no diagnostics are recorded.\n *\n * Nothing here generates code, so it works under a Content Security\n * Policy. Parsers that can't be compiled run their own (interpreted) steps\n * on the same state.\n */\nimport * as Predicate from \"effect/Predicate\"\nimport type { Encoding } from \"../../Encoding.js\"\nimport type { ErrMode, State } from \"../../Input.js\"\nimport { Fail } from \"../../Input.js\"\nimport * as Option from \"effect/Option\"\nimport * as Result from \"effect/Result\"\nimport type { Node, NodeOf, ParserLike } from \"../node.js\"\nimport { addEntry, flushEntries, fromEntries, isPlainKey } from \"../entries.js\"\nimport { nodeOf, scansFloat } from \"../node.js\"\nimport { floatScan, floatTexts, scanFloatBytes, scanFloatString, toFloat } from \"../numbers.js\"\nimport { charOf, fastLimit, firstCodePoint, fold, utf16be, utf16le, validate } from \"../text.js\"\nimport { countTokens, indexOf } from \"../tokens.js\"\nimport type { AltPlan } from \"./first.js\"\nimport { Key } from \"../key.js\"\nimport * as Resume from \"../resume.js\"\nimport type { Backend } from \"./registry.js\"\nimport type { EntryPair } from \"./entries.js\"\nimport { buildsEntries, pairOf } from \"./entries.js\"\nimport { FirstSets, planAlt } from \"./first.js\"\nimport { acceptTable, kindOfEncoding, TableSize, textSet, tokenSet } from \"./sets.js\"\n\nexport type Step = (state: State<any>) => any\n\n/** A parser that the compiler left to its interpreted step. */\nexport interface Fallback {\n readonly name: string | undefined\n readonly tag: Node[\"_tag\"]\n readonly reason: string\n}\n\n/** The maximum number of distinct parsers compiled for one root. */\nconst maxNodes = 2048\n\nconst BT: ErrMode = \"Backtrack\"\nconst CUT: ErrMode = \"Cut\"\nconst INC: ErrMode = \"Incomplete\"\n\n/**\n * How many units past the cursor a single token can depend on (a code\n * point is at most 4 units). In a partial parse, a token parser that read\n * no closer than this to the end of the input behaves exactly as on\n * complete input.\n */\nconst Margin = 4\n\nconst lowerAscii = (c: number): number => (c >= 65 && c <= 90 ? c + 32 : c)\n\ninterface Slot {\n fn: Step | undefined\n}\n\nclass Compiler {\n readonly used = new Map<ParserLike, Slot>()\n readonly unused = new Map<ParserLike, Slot>()\n readonly firsts: FirstSets\n readonly fallbacks: Array<Fallback> = []\n private readonly fellBack = new Set<ParserLike>()\n private budget = maxNodes\n\n /**\n * `resumable`: compile for streaming parses, which may be partial (see\n * `state.partial`) and keep checkpoints (see `internal/resume.ts`).\n */\n constructor(\n readonly kind: 0 | 1 | 2,\n readonly resumable = false\n ) {\n this.firsts = new FirstSets(kind)\n }\n\n /**\n * In a resumable build, runs the compiled token parser `step`, and falls\n * back to the interpreted one when it read within `lookahead` units of\n * the end of a partial input, where it might have to report `Incomplete`.\n * Compiled token parsers leave `state.pos` where they stopped reading,\n * even when they fail.\n */\n private partialSafe(p: ParserLike, step: Step, lookahead: number): Step {\n if (!this.resumable) return step\n const interpreted = p.step\n const ahead = Math.max(lookahead, Margin)\n return (s) => {\n if (!s.partial) return step(s)\n const start = s.pos\n const r = step(s)\n if (s.pos + ahead <= s.end) return r\n s.pos = start\n return interpreted(s)\n }\n }\n\n /** Compiles `p`; when `used` is false its output is not needed. */\n compile(p: ParserLike, used: boolean): Step {\n const memo = used ? this.used : this.unused\n const slot = memo.get(p)\n if (slot !== undefined) {\n if (slot.fn !== undefined) return slot.fn\n // A cycle through `suspend`: the slot is filled once the cycle is compiled, before any parse runs\n return (s) => (slot.fn ?? p.step)(s)\n }\n const fresh: Slot = { fn: undefined }\n memo.set(p, fresh)\n const node = nodeOf(p)\n const fn = --this.budget < 0 ? this.fallback(p, node, \"node budget exceeded\") : this.build(p, node, used)\n fresh.fn = fn\n return fn\n }\n\n fallback(p: ParserLike, node: Node, reason: string): Step {\n this.note(p, node, reason)\n return p.step\n }\n\n /** Records that (part of) `p` runs interpreted. */\n note(p: ParserLike, node: Node, reason: string): void {\n if (!this.fellBack.has(p)) {\n this.fellBack.add(p)\n this.fallbacks.push({ name: p.name, tag: node._tag, reason })\n }\n }\n\n /** Whether a token node reads this input kind natively. */\n private native(enc: Encoding<any> | undefined): boolean {\n return enc === undefined ? this.kind !== 2 : kindOfEncoding(enc) === this.kind\n }\n\n build(p: ParserLike, node: Node, used: boolean): Step {\n switch (node._tag) {\n case \"Opaque\":\n return this.fallback(p, node, \"not describable (Parser.make, gen, ...)\")\n case \"Succeed\": {\n const value = node.value\n return () => value\n }\n case \"Sync\": {\n const evaluate = node.evaluate\n return used ? () => evaluate() : () => undefined\n }\n case \"Fail\": {\n const mode = node.mode\n return (s) => {\n s.mode = mode\n return Fail\n }\n }\n case \"Eof\":\n return (s) => {\n if (s.pos < s.end) {\n s.mode = BT\n return Fail\n }\n if (s.partial) {\n s.mode = INC\n return Fail\n }\n return undefined\n }\n case \"Location\":\n return (s) => s.pos\n case \"RestLen\":\n return (s) => s.end - s.pos\n case \"Suspend\":\n return this.compile(node.resolve(), used)\n case \"Any\":\n case \"Literal\":\n case \"OneOf\":\n case \"Take\":\n case \"TakeWhile\":\n case \"TakeUntil\":\n case \"Rest\":\n if (!this.native(node.encoding)) return this.fallback(p, node, \"token parser on array input\")\n return this.partialSafe(\n p,\n node.encoding === undefined ? this.token(p, node, used) : this.text(p, node, node.encoding, used),\n Predicate.isTagged(node, \"Literal\") || Predicate.isTagged(node, \"TakeUntil\")\n ? node.literal.length * 4\n : Margin\n )\n case \"TillLineEnding\":\n case \"Identifier\":\n case \"Bom\":\n return this.fallback(p, node, \"leaf parser without a compiled form\")\n case \"Escaped\":\n if (!this.native(node.encoding)) return this.fallback(p, node, \"token parser on array input\")\n return this.escaped(node)\n case \"Map\": {\n if (!used) return this.compile(node.self, false)\n if (node.f === toFloat) {\n const step = this.float(node)\n if (step !== undefined) return step\n }\n // Streaming builds keep the array, which their checkpoints hold\n if (node.f === fromEntries && !this.resumable && buildsEntries(node.self)) return this.entries(node.self)\n const c = this.compile(node.self, true)\n const f = node.f\n return (s) => {\n const a = c(s)\n return a === Fail ? Fail : f(a)\n }\n }\n case \"As\": {\n const c = this.compile(node.self, false)\n if (!used) return c\n const value = node.value\n return (s) => (c(s) === Fail ? Fail : value)\n }\n case \"Tap\": {\n const c = this.compile(node.self, true)\n const f = node.f\n return (s) => {\n const a = c(s)\n if (a !== Fail) f(a)\n return a\n }\n }\n case \"TryMap\": {\n const c = this.compile(node.self, true)\n const f = node.f\n return (s) => {\n const a = c(s)\n if (a === Fail) return Fail\n const r = f(a)\n if (Result.isSuccess(r)) return r.success\n s.mode = BT\n return Fail\n }\n }\n case \"FilterMap\": {\n const c = this.compile(node.self, true)\n const f = node.f\n return (s) => {\n const a = c(s)\n if (a === Fail) return Fail\n const o = f(a)\n if (Option.isSome(o)) return o.value\n s.mode = BT\n return Fail\n }\n }\n case \"Filter\": {\n const c = this.compile(node.self, true)\n const predicate = node.predicate\n return (s) => {\n const a = c(s)\n if (a === Fail) return Fail\n if (predicate(a)) return a\n s.mode = BT\n return Fail\n }\n }\n case \"FlatMap\": {\n // The parser returned by `f` runs interpreted\n const c = this.compile(node.self, true)\n const f = node.f\n this.note(p, node, \"the parser returned by the function runs interpreted\")\n return (s) => {\n const a = c(s)\n return a === Fail ? Fail : f(a).step(s)\n }\n }\n case \"Taken\":\n if (node.encoding !== undefined && !this.native(node.encoding)) {\n return this.fallback(p, node, \"Text parser on another input kind\")\n }\n return this.taken(node, used)\n case \"WithTaken\": {\n const c = this.compile(node.self, true)\n return (s) => {\n const start = s.pos\n const a = c(s)\n return a === Fail ? Fail : [a, s.slice(start, s.pos)]\n }\n }\n case \"Span\": {\n const c = this.compile(node.self, false)\n if (!used) return c\n return (s) => {\n const start = s.pos\n return c(s) === Fail ? Fail : { start, end: s.pos }\n }\n }\n case \"WithSpan\": {\n const c = this.compile(node.self, true)\n return (s) => {\n const start = s.pos\n const a = c(s)\n return a === Fail ? Fail : [a, { start, end: s.pos }]\n }\n }\n case \"Mode\": {\n const c = this.compile(node.self, used)\n const from = node.from\n const to = node.to\n return (s) => {\n const a = c(s)\n if (a === Fail && s.mode === from) s.mode = to\n return a\n }\n }\n case \"Context\":\n case \"Expected\":\n case \"MapError\":\n case \"OrFail\":\n case \"Trace\":\n case \"Syntax\":\n case \"RetryAfter\":\n // Diagnostics only, or inactive outside parseRecoverable / tracing\n return this.compile(node.self, used)\n case \"ResumeAfter\": {\n const c = this.compile(node.self, used)\n if (!used) return c\n return (s) => {\n const a = c(s)\n return a === Fail ? Fail : Option.some(a)\n }\n }\n case \"Opt\":\n case \"OrElseSucceed\": {\n const c = this.compile(node.self, used)\n const orElse = !used ? undefined : Predicate.isTagged(node, \"Opt\") ? Option.none : node.value\n const some = used && Predicate.isTagged(node, \"Opt\")\n return (s) => {\n const start = s.pos\n const a = c(s)\n if (a !== Fail) return some ? Option.some(a) : a\n if (s.mode !== BT) return Fail\n s.pos = start\n return orElse === undefined ? undefined : orElse()\n }\n }\n case \"Peek\": {\n const c = this.compile(node.self, used)\n return (s) => {\n const start = s.pos\n const a = c(s)\n if (a !== Fail) s.pos = start\n return a\n }\n }\n case \"Not\": {\n const c = this.compile(node.self, false)\n return (s) => {\n const start = s.pos\n if (c(s) !== Fail) {\n s.pos = start\n s.mode = BT\n return Fail\n }\n if (s.mode !== BT) return Fail\n s.pos = start\n return undefined\n }\n }\n case \"Seq\":\n return this.seq(node, used)\n case \"Struct\": {\n const keys = node.keys\n const steps = node.parsers.map((q) => this.compile(q, used))\n const n = steps.length\n if (!used) return this.chain(steps)\n return (s) => {\n const out: Record<string, unknown> = {}\n for (let i = 0; i < n; i++) {\n const a = steps[i](s)\n if (a === Fail) return Fail\n out[keys[i]] = a\n }\n return out\n }\n }\n case \"ZipWith\": {\n const c1 = this.compile(node.self, used)\n const c2 = this.compile(node.that, used)\n if (!used) return this.chain([c1, c2])\n const f = node.f\n return (s) => {\n const a = c1(s)\n if (a === Fail) return Fail\n const b = c2(s)\n return b === Fail ? Fail : f(a, b)\n }\n }\n case \"Alt\":\n return this.alt(node, used)\n case \"Dispatch\":\n return this.dispatch(p, node, used)\n case \"Repeat\":\n case \"Fold\":\n return this.repeat(node, used)\n case \"RepeatTill\":\n return this.repeatTill(node)\n case \"Separated\":\n return this.separated(node, used)\n case \"SeparatedFold\":\n return this.separatedFold(node)\n case \"Service\":\n case \"Provide\":\n return this.fallback(p, node, \"services stay interpreted\")\n }\n }\n\n /** Runs steps in order, for their effect on the cursor only. */\n chain(steps: ReadonlyArray<Step>): Step {\n const n = steps.length\n if (n === 0) return () => undefined\n if (n === 1) return steps[0]\n if (n === 2) {\n const [a, b] = steps as [Step, Step]\n return (s) => (a(s) === Fail ? Fail : b(s))\n }\n return (s) => {\n for (let i = 0; i < n; i++) if (steps[i](s) === Fail) return Fail\n return undefined\n }\n }\n\n seq(node: NodeOf<\"Seq\">, used: boolean): Step {\n const output = node.output\n const keep = (i: number) =>\n used && (output === \"tuple\" || output === i || (Array.isArray(output) && output.includes(i)))\n const steps = node.parsers.map((q, i) => this.compile(q, keep(i)))\n const n = steps.length\n if (!used) return this.chain(steps)\n if (output === \"tuple\") {\n return (s) => {\n const out = new Array(n)\n for (let i = 0; i < n; i++) {\n const a = steps[i](s)\n if (a === Fail) return Fail\n out[i] = a\n }\n return out\n }\n }\n if (Predicate.isNumber(output)) {\n if (n === 2) {\n const [a, b] = steps as [Step, Step]\n return output === 0\n ? (s) => {\n const x = a(s)\n if (x === Fail) return Fail\n return b(s) === Fail ? Fail : x\n }\n : (s) => (a(s) === Fail ? Fail : b(s))\n }\n return (s) => {\n let out: unknown\n for (let i = 0; i < n; i++) {\n const a = steps[i](s)\n if (a === Fail) return Fail\n if (i === output) out = a\n }\n return out\n }\n }\n const [i0, i1] = output\n return (s) => {\n let x: unknown\n let y: unknown\n for (let i = 0; i < n; i++) {\n const a = steps[i](s)\n if (a === Fail) return Fail\n if (i === i0) x = a\n else if (i === i1) y = a\n }\n return [x, y]\n }\n }\n\n /** The unit at the cursor, or -1 at the end of the input. */\n private unitReader(): (s: State<any>) => number {\n return this.kind === 0\n ? (s) => (s.pos < s.end ? (s.input as string).charCodeAt(s.pos) : -1)\n : (s) => (s.pos < s.end ? (s.input as Uint8Array)[s.pos] : -1)\n }\n\n alt(node: NodeOf<\"Alt\">, used: boolean): Step {\n const steps = node.parsers.map((q) => this.compile(q, used))\n const n = steps.length\n if (n === 0) {\n return (s) => {\n s.mode = BT\n return Fail\n }\n }\n if (n === 1) return steps[0]\n const plan: AltPlan | undefined = this.kind === 2 ? undefined : planAlt(node.parsers.map((q) => this.firsts.of(q)))\n if (plan === undefined) {\n return (s) => {\n const start = s.pos\n for (let i = 0; i < n; i++) {\n const a = steps[i](s)\n if (a !== Fail) return a\n if (s.mode !== BT) return Fail\n s.pos = start\n }\n s.mode = BT\n return Fail\n }\n }\n const lists = plan.lists.map((l) => l.map((i) => steps[i]))\n const { byUnit, end, high } = plan\n const unit = this.unitReader()\n const resumable = this.resumable\n return (s) => {\n // Near the end of a partial input, branches may be incomplete rather than fail\n const u = resumable && s.partial && s.pos + Margin > s.end ? -2 : unit(s)\n const candidates = u === -2 ? steps : lists[u < 0 ? end : u < TableSize ? byUnit[u] : high]\n const start = s.pos\n for (let i = 0; i < candidates.length; i++) {\n const a = candidates[i](s)\n if (a !== Fail) return a\n if (s.mode !== BT) return Fail\n s.pos = start\n }\n s.mode = BT\n return Fail\n }\n }\n\n dispatch(p: ParserLike, node: NodeOf<\"Dispatch\">, used: boolean): Step {\n const selector = this.compile(node.selector, true)\n const choose = node.choose\n const compiled = new Map<ParserLike, Step>()\n if (node.cases !== undefined) {\n for (const key of Reflect.ownKeys(node.cases)) {\n const q = node.cases[key as any]\n if (!compiled.has(q)) compiled.set(q, this.compile(q, used))\n }\n }\n if (node.otherwise !== undefined && !compiled.has(node.otherwise)) {\n compiled.set(node.otherwise, this.compile(node.otherwise, used))\n }\n const general: Step = (s) => {\n const start = s.pos\n const key = selector(s)\n if (key === Fail) return Fail\n const q = choose(key)\n if (q === undefined) {\n s.pos = start\n s.mode = BT\n return Fail\n }\n return (compiled.get(q) ?? q.step)(s)\n }\n if (node.cases === undefined) {\n this.note(p, node, \"the parser returned by the function of cases runs interpreted\")\n return general\n }\n // Switch on the next unit when the selector is `any` or `peek(any)`\n let sel = nodeOf(node.selector)\n const peek = Predicate.isTagged(sel, \"Peek\")\n if (peek) sel = nodeOf((sel as NodeOf<\"Peek\">).self)\n if (!Predicate.isTagged(sel, \"Any\") || !this.native(sel.encoding)) return general\n const enc = sel.encoding\n // Units below `limit` are whole tokens, so the key is known in advance\n const limit = enc === undefined ? (this.kind === 0 ? 0xd800 : TableSize) : Math.min(fastLimit(enc), 0xd800)\n const size = Math.min(limit, TableSize)\n if (size === 0) return general\n const table: Array<Step | null> = []\n for (let u = 0; u < size; u++) {\n const key = enc === undefined && this.kind === 1 ? u : charOf(u)\n const q = choose(key)\n table.push(q === undefined ? null : (compiled.get(q) ?? q.step))\n }\n const unit = this.unitReader()\n const advance = peek ? 0 : 1\n const resumable = this.resumable\n return (s) => {\n if (resumable && s.partial && s.pos + Margin > s.end) return general(s)\n const u = unit(s)\n if (u < 0) {\n s.mode = BT\n return Fail\n }\n if (u >= size) return general(s)\n const q = table[u]\n if (q === null) {\n s.mode = BT\n return Fail\n }\n s.pos += advance\n return q(s)\n }\n }\n\n repeat(node: NodeOf<\"Repeat\"> | NodeOf<\"Fold\">, used: boolean): Step {\n const { max, min } = node\n const checkLoop = max === Infinity\n const isFold = Predicate.isTagged(node, \"Fold\")\n const cond = isFold ? (node as NodeOf<\"Fold\">).while : undefined\n const c = this.compile(node.self, used)\n const resumable = this.resumable\n const key = new Key()\n // The accumulator: an array, the fold's value, or nothing when unused (and unneeded by `while`)\n const tracked = used || cond !== undefined\n const init: () => unknown = !tracked ? () => undefined : isFold ? (node as NodeOf<\"Fold\">).init : () => []\n const add: (acc: any, a: unknown) => unknown = !tracked\n ? (acc) => acc\n : isFold\n ? (node as NodeOf<\"Fold\">).f\n : (acc, a) => {\n acc.push(a)\n return acc\n }\n return (s) => {\n const entry = s.pos\n let acc: unknown\n let count = 0\n let resumed = false\n if (resumable && s.resume !== undefined) {\n const cp = Resume.take(s, key, entry) as Resume.Done | { acc: unknown; count: number; pos: number } | undefined\n if (cp instanceof Resume.Done) {\n s.pos = cp.pos\n return cp.value\n }\n if (cp !== undefined) {\n acc = cp.acc\n count = cp.count\n s.pos = cp.pos\n resumed = true\n }\n }\n if (!resumed) acc = init()\n for (; count < max; count++) {\n if (cond !== undefined && count >= min && !cond(acc)) break\n const start = s.pos\n const a = c(s)\n if (a === Fail) {\n if (s.mode === INC && s.resume !== undefined) Resume.save(s, key, entry, { acc, count, pos: start })\n if (s.mode !== BT || count < min) return Fail\n s.pos = start\n return resumed ? Resume.done(s, key, entry, true, acc) : acc\n }\n if (checkLoop && s.pos === start) {\n s.mode = CUT\n return Fail\n }\n acc = add(acc, a)\n }\n return resumed ? Resume.done(s, key, entry, true, acc) : acc\n }\n }\n\n /**\n * `map(self, Object.fromEntries)`, where `buildsEntries(self)`: builds the\n * object directly (see the JIT).\n */\n private entries(p: ParserLike): Step {\n const node = nodeOf(p)\n switch (node._tag) {\n case \"Mode\": {\n const c = this.entries(node.self)\n const from = node.from\n const to = node.to\n return (s) => {\n const a = c(s)\n if (a === Fail && s.mode === from) s.mode = to\n return a\n }\n }\n case \"Seq\": {\n const i = node.output as number\n const steps = node.parsers.map((q, j) => (j === i ? this.entries(q) : this.compile(q, false)))\n return (s) => {\n let out: unknown\n for (let j = 0; j < steps.length; j++) {\n const a = steps[j](s)\n if (a === Fail) return Fail\n if (j === i) out = a\n }\n return out\n }\n }\n case \"Repeat\":\n case \"Separated\": {\n const pair = pairOf(node.self)\n if (pair !== undefined) return this.entriesLoop(node, pair)\n // Not reached (`buildsEntries` found the pair): build the pairs, then the object\n const c = this.compile(p, true)\n return (s) => {\n const a = c(s)\n return a === Fail ? Fail : fromEntries(a as Iterable<readonly [PropertyKey, unknown]>)\n }\n }\n default:\n return this.entries((node as { readonly self: ParserLike }).self)\n }\n }\n\n private entriesLoop(node: NodeOf<\"Repeat\"> | NodeOf<\"Separated\">, pair: EntryPair): Step {\n const parts = pair.parsers.map((q, j) => this.compile(q, j === pair.key || j === pair.value))\n const { key: ki, value: vi } = pair\n // Parses an entry and adds it to `acc`\n const entry = (s: State<any>, acc: EntriesAcc): boolean => {\n let key: unknown\n let value: unknown\n for (let j = 0; j < parts.length; j++) {\n const a = parts[j](s)\n if (a === Fail) return false\n if (j === ki) key = a\n else if (j === vi) value = a\n }\n acc.add(key, value)\n return true\n }\n const { max, min } = node\n const checkLoop = max === Infinity\n if (Predicate.isTagged(node, \"Repeat\")) {\n return (s) => {\n const acc = new EntriesAcc()\n for (let count = 0; count < max; count++) {\n const start = s.pos\n let key: unknown\n let value: unknown\n let ok = true\n for (let j = 0; j < parts.length; j++) {\n const a = parts[j](s)\n if (a === Fail) {\n ok = false\n break\n }\n if (j === ki) key = a\n else if (j === vi) value = a\n }\n if (!ok) {\n if (s.mode !== BT || count < min) return Fail\n s.pos = start\n return acc.result()\n }\n if (checkLoop && s.pos === start) {\n s.mode = CUT\n return Fail\n }\n acc.add(key, value)\n }\n return acc.result()\n }\n }\n const sep = this.compile(node.separator, false)\n return (s) => {\n const acc = new EntriesAcc()\n let count = 0\n if (max === 0) return acc.result()\n let start = s.pos\n if (!entry(s, acc)) {\n if (s.mode !== BT || min > 0) return Fail\n s.pos = start\n return acc.result()\n }\n count++\n while (count < max) {\n start = s.pos\n if (sep(s) === Fail) {\n if (s.mode !== BT || count < min) return Fail\n s.pos = start\n return acc.result()\n }\n if (checkLoop && s.pos === start) {\n s.mode = CUT\n return Fail\n }\n if (!entry(s, acc)) {\n if (s.mode !== BT || count < min) return Fail\n s.pos = start\n return acc.result()\n }\n count++\n }\n return acc.result()\n }\n }\n\n repeatTill(node: NodeOf<\"RepeatTill\">): Step {\n const { max, min } = node\n const c = this.compile(node.self, true)\n const end = this.compile(node.end, true)\n return (s) => {\n const acc: Array<unknown> = []\n while (true) {\n const start = s.pos\n if (acc.length >= min) {\n const b = end(s)\n if (b !== Fail) return [acc, b]\n if (s.mode !== BT) return Fail\n s.pos = start\n if (acc.length >= max) return Fail\n }\n const a = c(s)\n if (a === Fail) return Fail\n if (s.pos === start) {\n s.mode = CUT\n return Fail\n }\n acc.push(a)\n }\n }\n }\n\n separated(node: NodeOf<\"Separated\">, used: boolean): Step {\n const { max, min } = node\n const checkLoop = max === Infinity\n const c = this.compile(node.self, used)\n const sep = this.compile(node.separator, false)\n const resumable = this.resumable\n const key = new Key()\n return (s) => {\n const entry = s.pos\n let acc: Array<unknown> | undefined\n let count = 0\n let resumed = false\n if (resumable && s.resume !== undefined) {\n const cp = Resume.take(s, key, entry) as\n | Resume.Done\n | { acc: Array<unknown>; count: number; pos: number }\n | undefined\n if (cp instanceof Resume.Done) {\n s.pos = cp.pos\n return cp.value\n }\n if (cp !== undefined) {\n acc = cp.acc\n count = cp.count\n s.pos = cp.pos\n resumed = true\n }\n }\n if (!resumed) {\n acc = used ? [] : undefined\n if (max === 0) return acc\n const start = s.pos\n const first = c(s)\n if (first === Fail) {\n if (s.mode !== BT || min > 0) return Fail\n s.pos = start\n return acc\n }\n acc?.push(first)\n count = 1\n }\n while (count < max) {\n const start = s.pos\n if (sep(s) === Fail) {\n if (s.mode === INC && s.resume !== undefined) Resume.save(s, key, entry, { acc, count, pos: start })\n if (s.mode !== BT || count < min) return Fail\n s.pos = start\n return resumed ? Resume.done(s, key, entry, true, acc) : acc\n }\n if (checkLoop && s.pos === start) {\n s.mode = CUT\n return Fail\n }\n const a = c(s)\n if (a === Fail) {\n if (s.mode === INC && s.resume !== undefined) Resume.save(s, key, entry, { acc, count, pos: start })\n if (s.mode !== BT || count < min) return Fail\n s.pos = start\n return resumed ? Resume.done(s, key, entry, true, acc) : acc\n }\n acc?.push(a)\n count++\n }\n return resumed ? Resume.done(s, key, entry, true, acc) : acc\n }\n }\n\n separatedFold(node: NodeOf<\"SeparatedFold\">): Step {\n const c = this.compile(node.self, true)\n const sep = this.compile(node.separator, true)\n const op = node.op\n const resumable = this.resumable\n const key = new Key()\n if (!node.right) {\n return (s) => {\n const entry = s.pos\n let acc: unknown\n let resumed = false\n if (resumable && s.resume !== undefined) {\n const cp = Resume.take(s, key, entry) as Resume.Done | { acc: unknown; pos: number } | undefined\n if (cp instanceof Resume.Done) {\n s.pos = cp.pos\n return cp.value\n }\n if (cp !== undefined) {\n acc = cp.acc\n s.pos = cp.pos\n resumed = true\n }\n }\n if (!resumed) {\n acc = c(s)\n if (acc === Fail) return Fail\n }\n while (true) {\n const start = s.pos\n const x = sep(s)\n if (x === Fail) {\n if (s.mode === INC && s.resume !== undefined) Resume.save(s, key, entry, { acc, pos: start })\n if (s.mode !== BT) return Fail\n s.pos = start\n return resumed ? Resume.done(s, key, entry, true, acc) : acc\n }\n if (s.pos === start) {\n s.mode = CUT\n return Fail\n }\n const a = c(s)\n if (a === Fail) {\n if (s.mode === INC && s.resume !== undefined) Resume.save(s, key, entry, { acc, pos: start })\n if (s.mode !== BT) return Fail\n s.pos = start\n return resumed ? Resume.done(s, key, entry, true, acc) : acc\n }\n acc = op(acc, x, a)\n }\n }\n }\n return (s) => {\n const first = c(s)\n if (first === Fail) return Fail\n const values: Array<unknown> = [first]\n const seps: Array<unknown> = []\n while (true) {\n const start = s.pos\n const x = sep(s)\n if (x === Fail) {\n if (s.mode !== BT) return Fail\n s.pos = start\n break\n }\n if (s.pos === start) {\n s.mode = CUT\n return Fail\n }\n const a = c(s)\n if (a === Fail) {\n if (s.mode !== BT) return Fail\n s.pos = start\n break\n }\n seps.push(x)\n values.push(a)\n }\n let acc = values[values.length - 1]\n for (let i = seps.length - 1; i >= 0; i--) acc = op(values[i], seps[i], acc)\n return acc\n }\n }\n\n // ---------------------------------------------------------------------------\n // Token parsers (`Token`, `Ascii`)\n // ---------------------------------------------------------------------------\n\n token(p: ParserLike, node: TokenNode, used: boolean): Step {\n const kind = this.kind as 0 | 1\n switch (node._tag) {\n case \"Any\":\n if (kind === 1) {\n return (s) => {\n const pos = s.pos\n if (pos >= s.end) return fail(s)\n s.pos = pos + 1\n return (s.input as Uint8Array)[pos]\n }\n }\n return (s) => {\n const pos = s.pos\n if (pos >= s.end) return fail(s)\n const str = s.input as string\n const c = str.charCodeAt(pos)\n if (c >= 0xd800 && c <= 0xdbff && pos + 1 < str.length && (str.charCodeAt(pos + 1) & 0xfc00) === 0xdc00) {\n s.pos = pos + 2\n return used ? str.slice(pos, pos + 2) : undefined\n }\n s.pos = pos + 1\n return used ? str[pos] : undefined\n }\n case \"Literal\":\n return this.tokenLiteral(p, node)\n case \"OneOf\": {\n const set = tokenSet(node.set, kind)\n const negate = node.negate\n const accept = acceptTable(set, negate)\n const test = set.test\n if (kind === 1) {\n return (s) => {\n const pos = s.pos\n if (pos >= s.end) return fail(s)\n const b = (s.input as Uint8Array)[pos]\n if (accept[b] === 0) return fail(s)\n s.pos = pos + 1\n return b\n }\n }\n return (s) => {\n const pos = s.pos\n if (pos >= s.end) return fail(s)\n const str = s.input as string\n const c = str.charCodeAt(pos)\n if (c < TableSize) {\n if (accept[c] === 0) return fail(s)\n s.pos = pos + 1\n return used ? str[pos] : undefined\n }\n let cp = c\n if (c >= 0xd800 && c <= 0xdbff && pos + 1 < str.length) {\n const d = str.charCodeAt(pos + 1)\n if ((d & 0xfc00) === 0xdc00) cp = ((c - 0xd800) << 10) + (d - 0xdc00) + 0x10000\n }\n if (test(cp) === negate) return fail(s)\n const len = cp > 0xffff ? 2 : 1\n s.pos = pos + len\n return !used ? undefined : len === 1 ? str[pos] : str.slice(pos, pos + 2)\n }\n }\n case \"Take\": {\n const count = node.count\n if (kind === 1) {\n return (s) => {\n const start = s.pos\n if (s.end - start < count) return failAt(s, s.end)\n s.pos = start + count\n return used ? (s.input as Uint8Array).subarray(start, start + count) : undefined\n }\n }\n return (s) => {\n const str = s.input as string\n const start = s.pos\n const end = s.end\n let i = start\n let got = 0\n while (got < count && i < end) {\n const c = str.charCodeAt(i)\n i += c >= 0xd800 && c <= 0xdbff && i + 1 < str.length && (str.charCodeAt(i + 1) & 0xfc00) === 0xdc00 ? 2 : 1\n got++\n }\n if (got < count) return failAt(s, i)\n s.pos = i\n return used ? str.slice(start, i) : undefined\n }\n }\n case \"TakeWhile\":\n return this.tokenTakeWhile(node, used)\n case \"TakeUntil\": {\n const { literal, max, min } = node\n const bounded = min > 0 || max !== Infinity\n return (s) => {\n const start = s.pos\n const idx = indexOf(s, literal, start)\n if (idx < 0) return failAt(s, s.end)\n if (bounded) {\n const count = countTokens(s, start, idx)\n if (count < min || count > max) return failAt(s, idx)\n }\n s.pos = idx\n return used ? s.slice(start, idx) : undefined\n }\n }\n case \"Rest\":\n return (s) => {\n const start = s.pos\n s.pos = s.end\n return used ? s.slice(start, s.end) : undefined\n }\n }\n }\n\n tokenLiteral(p: ParserLike, node: NodeOf<\"Literal\">): Step {\n const lit = node.literal\n const literalKind = Predicate.isString(lit) ? 0 : lit instanceof Uint8Array ? 1 : 2\n if (this.kind === 0) {\n if (literalKind !== 0) return this.fallback(p, node, \"byte or array literal on string input\")\n const str = lit as string\n const len = str.length\n if (node.caseless) {\n const lowered = Array.from({ length: len }, (_, i) => lowerAscii(str.charCodeAt(i)))\n return (s) => {\n const pos = s.pos\n if (s.end - pos < len) return fail(s)\n const input = s.input as string\n for (let i = 0; i < len; i++) {\n if (lowerAscii(input.charCodeAt(pos + i)) !== lowered[i]) return fail(s)\n }\n s.pos = pos + len\n return input.slice(pos, pos + len)\n }\n }\n return stringLiteral(str, str)\n }\n if (literalKind === 2) return this.fallback(p, node, \"array literal on byte input\")\n const bytes = literalKind === 0 ? new TextEncoder().encode(lit as string) : (lit as Uint8Array)\n const len = bytes.length\n const sameKind = literalKind === 1 && !node.caseless\n const expect = node.caseless ? Array.from(bytes, lowerAscii) : Array.from(bytes)\n const caseless = node.caseless\n return (s) => {\n const pos = s.pos\n if (s.end - pos < len) return fail(s)\n const input = s.input as Uint8Array\n for (let i = 0; i < len; i++) {\n const b = input[pos + i]\n if ((caseless ? lowerAscii(b) : b) !== expect[i]) return fail(s)\n }\n s.pos = pos + len\n return sameKind ? lit : input.subarray(pos, pos + len)\n }\n }\n\n tokenTakeWhile(node: NodeOf<\"TakeWhile\">, used: boolean): Step {\n const kind = this.kind as 0 | 1\n const { max, min, negate } = node\n const set = tokenSet(node.set, kind)\n const accept = acceptTable(set, negate)\n if (kind === 1) {\n return (s) => {\n const bytes = s.input as Uint8Array\n const start = s.pos\n const limit = max === Infinity ? s.end : Math.min(s.end, start + max)\n let i = start\n while (i < limit && accept[bytes[i]] === 1) i++\n if (i - start < min) return failAt(s, i)\n s.pos = i\n return used ? bytes.subarray(start, i) : undefined\n }\n }\n const test = set.test\n return (s) => {\n const str = s.input as string\n const start = s.pos\n const end = s.end\n let i = start\n let count = 0\n while (count < max && i < end) {\n const c = str.charCodeAt(i)\n if (c < TableSize) {\n if (accept[c] === 0) break\n i++\n } else if (c < 0xd800 || c > 0xdbff) {\n if (test(c) === negate) break\n i++\n } else {\n let cp = c\n if (i + 1 < str.length) {\n const d = str.charCodeAt(i + 1)\n if ((d & 0xfc00) === 0xdc00) cp = ((c - 0xd800) << 10) + (d - 0xdc00) + 0x10000\n }\n if (test(cp) === negate) break\n i += cp > 0xffff ? 2 : 1\n }\n count++\n }\n if (count < min) return failAt(s, i)\n s.pos = i\n return used ? str.slice(start, i) : undefined\n }\n }\n\n // ---------------------------------------------------------------------------\n // Text parsers, specialized per encoding\n // ---------------------------------------------------------------------------\n\n text(p: ParserLike, node: TokenNode, enc: Encoding<any>, used: boolean): Step {\n const { fast, unitAt, width: unitWidth } = unitReader(this.kind, enc)\n const decode = enc.decode\n const width = enc.width\n const toText = enc.text\n switch (node._tag) {\n case \"Any\":\n return (s) => {\n const pos = s.pos\n const end = s.end\n if (pos >= end) return fail(s)\n const c = unitAt(s.input, pos, end)\n if (c < fast) {\n s.pos = pos + unitWidth\n return used ? charOf(c) : undefined\n }\n const cp = decode(s.input, pos, end)\n if (cp < 0) return fail(s)\n s.pos = pos + width(cp)\n return used ? charOf(cp) : undefined\n }\n case \"Literal\": {\n const lit = node.literal as string\n if (node.caseless) {\n const folded = Array.from(lit, (c) => fold(firstCodePoint(c)))\n const n = folded.length\n return (s) => {\n const start = s.pos\n const end = s.end\n const input = s.input\n let pos = start\n for (let i = 0; i < n; i++) {\n if (pos >= end) return failAt(s, pos)\n const c = unitAt(input, pos, end)\n let cp: number\n if (c < fast) {\n cp = c\n pos += unitWidth\n } else {\n cp = decode(input, pos, end)\n if (cp < 0) return failAt(s, pos)\n pos += width(cp)\n }\n if (fold(cp) !== folded[i]) return failAt(s, pos)\n }\n s.pos = pos\n return used ? toText(input, start, pos) : undefined\n }\n }\n const encoded = enc.encode(lit)\n if (Predicate.isString(encoded)) return stringLiteral(encoded, lit)\n const bytes = encoded as Uint8Array\n const len = bytes.length\n if (len === 1) {\n const b0 = bytes[0]\n return (s) => {\n const pos = s.pos\n if (pos < s.end && (s.input as Uint8Array)[pos] === b0) {\n s.pos = pos + 1\n return lit\n }\n return fail(s)\n }\n }\n return (s) => {\n const pos = s.pos\n if (s.end - pos < len) return fail(s)\n const input = s.input as Uint8Array\n for (let i = 0; i < len; i++) if (input[pos + i] !== bytes[i]) return fail(s)\n s.pos = pos + len\n return lit\n }\n }\n case \"OneOf\": {\n const set = textSet(node.set)\n const negate = node.negate\n const accept = acceptTable(set, negate)\n const test = set.test\n return (s) => {\n const pos = s.pos\n const end = s.end\n if (pos >= end) return fail(s)\n const c = unitAt(s.input, pos, end)\n if (c < fast && c < TableSize) {\n if (accept[c] === 0) return fail(s)\n s.pos = pos + unitWidth\n return used ? charOf(c) : undefined\n }\n const cp = c < fast ? c : decode(s.input, pos, end)\n if (cp < 0 || test(cp) === negate) return fail(s)\n s.pos = pos + (c < fast ? unitWidth : width(cp))\n return used ? charOf(cp) : undefined\n }\n }\n case \"Take\": {\n const count = node.count\n return (s) => {\n const start = s.pos\n const end = s.end\n const input = s.input\n let pos = start\n for (let got = 0; got < count; got++) {\n if (pos >= end) return failAt(s, pos)\n const c = unitAt(input, pos, end)\n if (c < fast) pos += unitWidth\n else {\n const cp = decode(input, pos, end)\n if (cp < 0) return failAt(s, pos)\n pos += width(cp)\n }\n }\n s.pos = pos\n return used ? toText(input, start, pos) : undefined\n }\n }\n case \"TakeWhile\": {\n const { max, min, negate } = node\n const set = textSet(node.set)\n const accept = acceptTable(set, negate)\n const test = set.test\n const loop: TextLoop = { max, min, negate, accept, test, small: Math.min(fast, TableSize), fast, used }\n // One function per kind of unit read, from its own source: a loop\n // shared by every encoding sees several readers once a program\n // parses more than one, and stops inlining them\n if (unitWidth === 2) return takeWhileUtf16(loop, enc === utf16le ? 0 : 1, enc)\n return this.kind === 0 ? takeWhileString(loop, enc) : takeWhileBytes(loop, enc)\n }\n case \"TakeUntil\":\n case \"Rest\":\n return this.fallback(p, node, \"Text parser without a compiled form\")\n }\n }\n\n taken(node: NodeOf<\"Taken\">, used: boolean): Step {\n const c = this.compile(node.self, false)\n const enc = node.encoding\n if (enc === undefined) {\n if (!used) return c\n if (this.kind === 0) {\n return (s) => {\n const start = s.pos\n return c(s) === Fail ? Fail : (s.input as string).slice(start, s.pos)\n }\n }\n return (s) => {\n const start = s.pos\n return c(s) === Fail ? Fail : s.slice(start, s.pos)\n }\n }\n // `Text.taken` checks that the text is well formed, then decodes it\n const { fast, unitAt, width } = unitReader(this.kind, enc)\n const toText = enc.text\n return (s) => {\n const start = s.pos\n if (c(s) === Fail) return Fail\n const end = s.pos\n const input = s.input\n let i = start\n while (i < end && unitAt(input, i, end) < fast) i += width\n if (i < end && validate(enc, s, i, end) < 0) return fail(s)\n return used ? toText(input, start, end) : undefined\n }\n }\n\n /**\n * `Ascii.float` and `Text.float` (`map(floatText, toFloat)`): numbers in\n * decimal notation are matched and converted in one pass, without\n * slicing the input; the rest runs the compiled parser (see the JIT).\n */\n private float(node: NodeOf<\"Map\">): Step | undefined {\n if (!floatTexts.has(node.self) || this.kind === 2) return undefined\n if (!scansFloat(node.self, (enc) => this.native(enc))) return undefined\n const c = this.compile(node.self, true)\n const scan = (this.kind === 0 ? scanFloatString : scanFloatBytes) as (\n input: unknown,\n i: number,\n end: number\n ) => unknown\n const resumable = this.resumable\n return (s) => {\n const v = scan(s.input, s.pos, s.end)\n // Near the end of a partial input, the parser may have to report `Incomplete`\n if (v === undefined || (resumable && s.partial && floatScan.read + Margin > s.end)) {\n const t = c(s)\n return t === Fail ? Fail : toFloat(t)\n }\n if (v === Fail) return fail(s)\n s.pos = floatScan.end\n return v\n }\n }\n\n escaped(node: NodeOf<\"Escaped\">): Step {\n const raw = node.raw\n const normal = this.compile(node.normal, !raw)\n const escape = this.compile(node.escape, !raw)\n const enc = node.encoding\n const ctrl = node.control\n const kind = this.kind\n // Matches the control character, advancing past it\n let control: (s: State<any>) => boolean\n if (enc === undefined || (ctrl < fastLimit(enc) && ctrl < TableSize)) {\n control =\n kind === 0\n ? (s) => {\n if (s.pos < s.end && (s.input as string).charCodeAt(s.pos) === ctrl) {\n s.pos++\n return true\n }\n return false\n }\n : (s) => {\n if (s.pos < s.end && (s.input as Uint8Array)[s.pos] === ctrl) {\n s.pos++\n return true\n }\n return false\n }\n } else if (ctrl < unitReader(kind, enc).fast) {\n const { unitAt, width } = unitReader(kind, enc)\n control = (s) => {\n if (s.pos < s.end && unitAt(s.input, s.pos, s.end) === ctrl) {\n s.pos += width\n return true\n }\n return false\n }\n } else {\n control = (s) => {\n if (s.pos >= s.end) return false\n const cp = enc.decode(s.input, s.pos, s.end)\n if (cp !== ctrl) return false\n s.pos += enc.width(cp)\n return true\n }\n }\n const resumable = this.resumable\n const key = new Key()\n /** Fails as incomplete, keeping a checkpoint in a streaming parse. */\n const incomplete = (s: State<any>, start: number, checkpoint: unknown): typeof Fail => {\n if (s.resume !== undefined) Resume.save(s, key, start, checkpoint)\n s.mode = INC\n return Fail\n }\n if (raw) {\n const slice: (s: State<any>, start: number) => unknown =\n enc === undefined ? (s, start) => s.slice(start, s.pos) : (s, start) => enc.text(s.input, start, s.pos)\n return (s) => {\n const start = s.pos\n let resumed = false\n if (resumable && s.resume !== undefined) {\n const cp = Resume.take(s, key, start) as Resume.Done | number | undefined\n if (cp instanceof Resume.Done) {\n s.pos = cp.pos\n return cp.value\n }\n if (cp !== undefined) {\n s.pos = cp\n resumed = true\n }\n }\n while (s.pos < s.end) {\n const before = s.pos\n if (normal(s) !== Fail) {\n if (s.pos === before) {\n s.mode = CUT\n return Fail\n }\n continue\n }\n if (s.mode === INC) return incomplete(s, start, before)\n if (s.mode !== BT) return Fail\n s.pos = before\n if (control(s)) {\n if (escape(s) === Fail) return s.mode === INC ? incomplete(s, start, before) : Fail\n } else {\n return resumed ? Resume.done(s, key, start, true, slice(s, start)) : slice(s, start)\n }\n }\n if (s.partial) return incomplete(s, start, s.pos)\n return resumed ? Resume.done(s, key, start, true, slice(s, start)) : slice(s, start)\n }\n }\n return (s) => {\n const start = s.pos\n let out = \"\"\n let resumed = false\n if (resumable && s.resume !== undefined) {\n const cp = Resume.take(s, key, start) as Resume.Done | { out: string; pos: number } | undefined\n if (cp instanceof Resume.Done) {\n s.pos = cp.pos\n return cp.value\n }\n if (cp !== undefined) {\n out = cp.out\n s.pos = cp.pos\n resumed = true\n }\n }\n while (s.pos < s.end) {\n const before = s.pos\n const a = normal(s)\n if (a !== Fail) {\n if (s.pos !== before) {\n out += a\n continue\n }\n } else {\n if (s.mode === INC) return incomplete(s, start, { out, pos: before })\n if (s.mode !== BT) return Fail\n s.pos = before\n }\n if (control(s)) {\n const b = escape(s)\n if (b === Fail) return s.mode === INC ? incomplete(s, start, { out, pos: before }) : Fail\n out += b\n } else {\n return resumed ? Resume.done(s, key, start, true, out) : out\n }\n }\n if (s.partial) return incomplete(s, start, { out, pos: s.pos })\n return resumed ? Resume.done(s, key, start, true, out) : out\n }\n }\n}\n\ntype TokenNode = NodeOf<\"Any\" | \"Literal\" | \"OneOf\" | \"Take\" | \"TakeWhile\" | \"TakeUntil\" | \"Rest\">\n\nconst fail = (s: State<any>): typeof Fail => {\n s.mode = BT\n return Fail\n}\n\n/** Fails, leaving the cursor at `pos`: how far a token parser read (see `partialSafe`). */\n/** The settings of a compiled `Text` `takeWhile` loop. */\ninterface TextLoop {\n readonly max: number\n readonly min: number\n readonly negate: boolean\n /** 1 where a code below `small` is accepted (see `acceptTable`). */\n readonly accept: Uint8Array\n readonly test: (code: number) => boolean\n readonly small: number\n /** Units below it are whole code points. */\n readonly fast: number\n readonly used: boolean\n}\n\n// `takeWhile` for each kind of unit read. The three loops differ only in\n// how they read a unit; they are written out because a single loop calling\n// a reader, or branching on one, measured slower (see `text`).\n\nconst takeWhileString = (loop: TextLoop, enc: Encoding<string>): Step => {\n const { accept, fast, max, min, negate, small, test, used } = loop\n const { decode, text, width } = enc\n return (s) => {\n const input: string = s.input\n const start = s.pos\n const end = s.end\n let i = start\n let count = 0\n while (count < max && i < end) {\n const c = input.charCodeAt(i)\n if (c < small) {\n if (accept[c] === 0) break\n i++\n } else if (c < fast) {\n if (test(c) === negate) break\n i++\n } else {\n const cp = decode(input, i, end)\n if (cp < 0 || test(cp) === negate) break\n i += width(cp)\n }\n count++\n }\n if (count < min) return failAt(s, i)\n s.pos = i\n return used ? text(input, start, i) : undefined\n }\n}\n\nconst takeWhileBytes = (loop: TextLoop, enc: Encoding<Uint8Array>): Step => {\n const { accept, max, min, negate, small, test, used } = loop\n const { decode, text, width } = enc\n return (s) => {\n const input: Uint8Array = s.input\n const start = s.pos\n const end = s.end\n let i = start\n let count = 0\n while (count < max && i < end) {\n const c = input[i]\n // A byte below `fast` is below `small` too, as `small` is `fast` or the table size\n if (c < small) {\n if (accept[c] === 0) break\n i++\n } else {\n const cp = decode(input, i, end)\n if (cp < 0 || test(cp) === negate) break\n i += width(cp)\n }\n count++\n }\n if (count < min) return failAt(s, i)\n s.pos = i\n return used ? text(input, start, i) : undefined\n }\n}\n\n/** For UTF-16 bytes; `lo` is the offset of a unit's low byte (0 for little endian). */\nconst takeWhileUtf16 = (loop: TextLoop, lo: 0 | 1, enc: Encoding<Uint8Array>): Step => {\n const { accept, fast, max, min, negate, small, test, used } = loop\n const { decode, text, width } = enc\n const hi = 1 - lo\n return (s) => {\n const input: Uint8Array = s.input\n const start = s.pos\n const end = s.end\n let i = start\n let count = 0\n while (count < max && i < end) {\n // A unit cut off by `end` reads as 0xFFFF, so `decode` reports it\n const c = i + 1 < end ? input[i + lo] | (input[i + hi] << 8) : 0xffff\n if (c < fast ? (c < small ? accept[c] === 0 : test(c) === negate) : false) break\n if (c < fast) i += 2\n else {\n const cp = decode(input, i, end)\n if (cp < 0 || test(cp) === negate) break\n i += width(cp)\n }\n count++\n }\n if (count < min) return failAt(s, i)\n s.pos = i\n return used ? text(input, start, i) : undefined\n }\n}\n\n/**\n * How a `Text` parser reads its encoding's code units: a unit below `fast`\n * is a whole code point, `width` input units long. UTF-16 bytes get a unit\n * reader, as in the JIT; a unit cut off by `end` reads as 0xFFFF, so it\n * takes the `decode` path, which reports it truncated.\n */\ninterface UnitReader {\n readonly width: 1 | 2\n readonly fast: number\n readonly unitAt: (input: any, i: number, end: number) => number\n}\n\nconst unitReader = (kind: 0 | 1 | 2, enc: Encoding<any>): UnitReader => {\n if (kind === 1 && (enc === utf16le || enc === utf16be)) {\n return {\n width: 2,\n fast: 0xd800,\n unitAt:\n enc === utf16le\n ? (input: Uint8Array, i, end) => (i + 1 < end ? input[i] | (input[i + 1] << 8) : 0xffff)\n : (input: Uint8Array, i, end) => (i + 1 < end ? (input[i] << 8) | input[i + 1] : 0xffff)\n }\n }\n // `end` is declared though unused: calls with more arguments than\n // parameters measured 1-2% slower on the JSON benchmark\n return {\n width: 1,\n fast: fastLimit(enc),\n unitAt: kind === 0 ? (input: string, i, _end) => input.charCodeAt(i) : (input: Uint8Array, i, _end) => input[i]\n }\n}\n\nconst failAt = (s: State<any>, pos: number): typeof Fail => {\n s.pos = pos\n s.mode = BT\n return Fail\n}\n\n/** A literal matched against a string input, returning `value`. */\nconst stringLiteral = (str: string, value: unknown): Step => {\n const len = str.length\n if (len === 0) return () => value\n if (len === 1) {\n const c0 = str.charCodeAt(0)\n return (s) => {\n const pos = s.pos\n if (pos < s.end && (s.input as string).charCodeAt(pos) === c0) {\n s.pos = pos + 1\n return value\n }\n return fail(s)\n }\n }\n return (s) => {\n const pos = s.pos\n if (s.end - pos >= len && (s.input as string).startsWith(str, pos)) {\n s.pos = pos + len\n return value\n }\n return fail(s)\n }\n}\n\n/** A closure compiler for one input kind; it memoizes what it compiles. */\n/** The object of `Object.fromEntries`, built an entry at a time (see `internal/entries.ts`). */\nclass EntriesAcc {\n readonly o: Record<string, unknown> = {}\n deferred: Array<unknown> | undefined = undefined\n add(key: unknown, value: unknown): void {\n if (this.deferred === undefined && isPlainKey(key)) this.o[key] = value\n else this.deferred = addEntry(this.o, this.deferred, key, value)\n }\n result(): object {\n if (this.deferred !== undefined) flushEntries(this.o, this.deferred)\n return this.o\n }\n}\n\nexport interface ClosureCompiler {\n readonly compile: (p: ParserLike, used: boolean) => Step\n readonly note: (p: ParserLike, node: Node, reason: string) => void\n readonly firsts: FirstSets\n readonly fallbacks: ReadonlyArray<Fallback>\n}\n\nexport const createClosureCompiler = (kind: 0 | 1 | 2, resumable = false): ClosureCompiler => {\n const compiler = new Compiler(kind, resumable)\n return {\n compile: (p, used) => compiler.compile(p, used),\n note: (p, node, reason) => compiler.note(p, node, reason),\n firsts: compiler.firsts,\n fallbacks: compiler.fallbacks\n }\n}\n\n/** A compiled root parser, with the parts of it that run interpreted. */\nexport interface CompiledRoot {\n readonly step: Step\n readonly fallbacks: ReadonlyArray<Fallback>\n}\n\n/** Compiles a root parser for one input kind. */\nconst compileClosure = (root: ParserLike, kind: 0 | 1 | 2, resumable = false): CompiledRoot => {\n const compiler = new Compiler(kind, resumable)\n const step = compiler.compile(root, true)\n return { step, fallbacks: compiler.fallbacks }\n}\n\n/** The closure compiler as a backend. */\nexport const backend: Backend = {\n build: (p, kind, resumable) =>\n Result.match(\n Result.try(() => compileClosure(p, kind, resumable)),\n {\n onSuccess: ({ fallbacks, step }) => ({ backend: \"closure\" as const, step, fallbacks, error: undefined }),\n onFailure: (error) => ({ backend: undefined, step: undefined, fallbacks: [], error })\n }\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,MAAM,WAAW;AAEjB,MAAM,KAAc;AACpB,MAAM,MAAe;AACrB,MAAM,MAAe;;;;;;;AAQrB,MAAM,SAAS;AAEf,MAAM,cAAc,MAAuB,KAAK,MAAM,KAAK,KAAK,IAAI,KAAK;AAMzE,IAAM,WAAN,MAAe;CAaF;CACA;CAbX,uBAAgB,IAAI,IAAsB;CAC1C,yBAAkB,IAAI,IAAsB;CAC5C;CACA,YAAsC,CAAC;CACvC,2BAA4B,IAAI,IAAgB;CAChD,SAAiB;;;;;CAMjB,YACE,MACA,YAAqB,OACrB;EAFS,KAAA,OAAA;EACA,KAAA,YAAA;EAET,KAAK,SAAS,IAAI,UAAU,IAAI;CAClC;;;;;;;;CASA,YAAoB,GAAe,MAAY,WAAyB;EACtE,IAAI,CAAC,KAAK,WAAW,OAAO;EAC5B,MAAM,cAAc,EAAE;EACtB,MAAM,QAAQ,KAAK,IAAI,WAAW,MAAM;EACxC,QAAQ,MAAM;GACZ,IAAI,CAAC,EAAE,SAAS,OAAO,KAAK,CAAC;GAC7B,MAAM,QAAQ,EAAE;GAChB,MAAM,IAAI,KAAK,CAAC;GAChB,IAAI,EAAE,MAAM,SAAS,EAAE,KAAK,OAAO;GACnC,EAAE,MAAM;GACR,OAAO,YAAY,CAAC;EACtB;CACF;;CAGA,QAAQ,GAAe,MAAqB;EAC1C,MAAM,OAAO,OAAO,KAAK,OAAO,KAAK;EACrC,MAAM,OAAO,KAAK,IAAI,CAAC;EACvB,IAAI,SAAS,KAAA,GAAW;GACtB,IAAI,KAAK,OAAO,KAAA,GAAW,OAAO,KAAK;GAEvC,QAAQ,OAAO,KAAK,MAAM,EAAE,KAAA,CAAM,CAAC;EACrC;EACA,MAAM,QAAc,EAAE,IAAI,KAAA,EAAU;EACpC,KAAK,IAAI,GAAG,KAAK;EACjB,MAAM,OAAO,OAAO,CAAC;EACrB,MAAM,KAAK,EAAE,KAAK,SAAS,IAAI,KAAK,SAAS,GAAG,MAAM,sBAAsB,IAAI,KAAK,MAAM,GAAG,MAAM,IAAI;EACxG,MAAM,KAAK;EACX,OAAO;CACT;CAEA,SAAS,GAAe,MAAY,QAAsB;EACxD,KAAK,KAAK,GAAG,MAAM,MAAM;EACzB,OAAO,EAAE;CACX;;CAGA,KAAK,GAAe,MAAY,QAAsB;EACpD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,GAAG;GACzB,KAAK,SAAS,IAAI,CAAC;GACnB,KAAK,UAAU,KAAK;IAAE,MAAM,EAAE;IAAM,KAAK,KAAK;IAAM;GAAO,CAAC;EAC9D;CACF;;CAGA,OAAe,KAAyC;EACtD,OAAO,QAAQ,KAAA,IAAY,KAAK,SAAS,IAAI,eAAe,GAAG,MAAM,KAAK;CAC5E;CAEA,MAAM,GAAe,MAAY,MAAqB;EACpD,QAAQ,KAAK,MAAb;GACE,KAAK,UACH,OAAO,KAAK,SAAS,GAAG,MAAM,yCAAyC;GACzE,KAAK,WAAW;IACd,MAAM,QAAQ,KAAK;IACnB,aAAa;GACf;GACA,KAAK,QAAQ;IACX,MAAM,WAAW,KAAK;IACtB,OAAO,aAAa,SAAS,UAAU,KAAA;GACzC;GACA,KAAK,QAAQ;IACX,MAAM,OAAO,KAAK;IAClB,QAAQ,MAAM;KACZ,EAAE,OAAO;KACT,OAAO;IACT;GACF;GACA,KAAK,OACH,QAAQ,MAAM;IACZ,IAAI,EAAE,MAAM,EAAE,KAAK;KACjB,EAAE,OAAO;KACT,OAAO;IACT;IACA,IAAI,EAAE,SAAS;KACb,EAAE,OAAO;KACT,OAAO;IACT;GAEF;GACF,KAAK,YACH,QAAQ,MAAM,EAAE;GAClB,KAAK,WACH,QAAQ,MAAM,EAAE,MAAM,EAAE;GAC1B,KAAK,WACH,OAAO,KAAK,QAAQ,KAAK,QAAQ,GAAG,IAAI;GAC1C,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;IACH,IAAI,CAAC,KAAK,OAAO,KAAK,QAAQ,GAAG,OAAO,KAAK,SAAS,GAAG,MAAM,6BAA6B;IAC5F,OAAO,KAAK,YACV,GACA,KAAK,aAAa,KAAA,IAAY,KAAK,MAAM,GAAG,MAAM,IAAI,IAAI,KAAK,KAAK,GAAG,MAAM,KAAK,UAAU,IAAI,GAChG,UAAU,SAAS,MAAM,SAAS,KAAK,UAAU,SAAS,MAAM,WAAW,IACvE,KAAK,QAAQ,SAAS,IACtB,MACN;GACF,KAAK;GACL,KAAK;GACL,KAAK,OACH,OAAO,KAAK,SAAS,GAAG,MAAM,qCAAqC;GACrE,KAAK;IACH,IAAI,CAAC,KAAK,OAAO,KAAK,QAAQ,GAAG,OAAO,KAAK,SAAS,GAAG,MAAM,6BAA6B;IAC5F,OAAO,KAAK,QAAQ,IAAI;GAC1B,KAAK,OAAO;IACV,IAAI,CAAC,MAAM,OAAO,KAAK,QAAQ,KAAK,MAAM,KAAK;IAC/C,IAAI,KAAK,MAAM,SAAS;KACtB,MAAM,OAAO,KAAK,MAAM,IAAI;KAC5B,IAAI,SAAS,KAAA,GAAW,OAAO;IACjC;IAEA,IAAI,KAAK,MAAM,eAAe,CAAC,KAAK,aAAa,cAAc,KAAK,IAAI,GAAG,OAAO,KAAK,QAAQ,KAAK,IAAI;IACxG,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;IACtC,MAAM,IAAI,KAAK;IACf,QAAQ,MAAM;KACZ,MAAM,IAAI,EAAE,CAAC;KACb,OAAO,MAAM,OAAO,OAAO,EAAE,CAAC;IAChC;GACF;GACA,KAAK,MAAM;IACT,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,KAAK;IACvC,IAAI,CAAC,MAAM,OAAO;IAClB,MAAM,QAAQ,KAAK;IACnB,QAAQ,MAAO,EAAE,CAAC,MAAM,OAAO,OAAO;GACxC;GACA,KAAK,OAAO;IACV,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;IACtC,MAAM,IAAI,KAAK;IACf,QAAQ,MAAM;KACZ,MAAM,IAAI,EAAE,CAAC;KACb,IAAI,MAAM,MAAM,EAAE,CAAC;KACnB,OAAO;IACT;GACF;GACA,KAAK,UAAU;IACb,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;IACtC,MAAM,IAAI,KAAK;IACf,QAAQ,MAAM;KACZ,MAAM,IAAI,EAAE,CAAC;KACb,IAAI,MAAM,MAAM,OAAO;KACvB,MAAM,IAAI,EAAE,CAAC;KACb,IAAI,OAAO,UAAU,CAAC,GAAG,OAAO,EAAE;KAClC,EAAE,OAAO;KACT,OAAO;IACT;GACF;GACA,KAAK,aAAa;IAChB,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;IACtC,MAAM,IAAI,KAAK;IACf,QAAQ,MAAM;KACZ,MAAM,IAAI,EAAE,CAAC;KACb,IAAI,MAAM,MAAM,OAAO;KACvB,MAAM,IAAI,EAAE,CAAC;KACb,IAAI,OAAO,OAAO,CAAC,GAAG,OAAO,EAAE;KAC/B,EAAE,OAAO;KACT,OAAO;IACT;GACF;GACA,KAAK,UAAU;IACb,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;IACtC,MAAM,YAAY,KAAK;IACvB,QAAQ,MAAM;KACZ,MAAM,IAAI,EAAE,CAAC;KACb,IAAI,MAAM,MAAM,OAAO;KACvB,IAAI,UAAU,CAAC,GAAG,OAAO;KACzB,EAAE,OAAO;KACT,OAAO;IACT;GACF;GACA,KAAK,WAAW;IAEd,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;IACtC,MAAM,IAAI,KAAK;IACf,KAAK,KAAK,GAAG,MAAM,sDAAsD;IACzE,QAAQ,MAAM;KACZ,MAAM,IAAI,EAAE,CAAC;KACb,OAAO,MAAM,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACxC;GACF;GACA,KAAK;IACH,IAAI,KAAK,aAAa,KAAA,KAAa,CAAC,KAAK,OAAO,KAAK,QAAQ,GAC3D,OAAO,KAAK,SAAS,GAAG,MAAM,mCAAmC;IAEnE,OAAO,KAAK,MAAM,MAAM,IAAI;GAC9B,KAAK,aAAa;IAChB,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;IACtC,QAAQ,MAAM;KACZ,MAAM,QAAQ,EAAE;KAChB,MAAM,IAAI,EAAE,CAAC;KACb,OAAO,MAAM,OAAO,OAAO,CAAC,GAAG,EAAE,MAAM,OAAO,EAAE,GAAG,CAAC;IACtD;GACF;GACA,KAAK,QAAQ;IACX,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,KAAK;IACvC,IAAI,CAAC,MAAM,OAAO;IAClB,QAAQ,MAAM;KACZ,MAAM,QAAQ,EAAE;KAChB,OAAO,EAAE,CAAC,MAAM,OAAO,OAAO;MAAE;MAAO,KAAK,EAAE;KAAI;IACpD;GACF;GACA,KAAK,YAAY;IACf,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;IACtC,QAAQ,MAAM;KACZ,MAAM,QAAQ,EAAE;KAChB,MAAM,IAAI,EAAE,CAAC;KACb,OAAO,MAAM,OAAO,OAAO,CAAC,GAAG;MAAE;MAAO,KAAK,EAAE;KAAI,CAAC;IACtD;GACF;GACA,KAAK,QAAQ;IACX,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;IACtC,MAAM,OAAO,KAAK;IAClB,MAAM,KAAK,KAAK;IAChB,QAAQ,MAAM;KACZ,MAAM,IAAI,EAAE,CAAC;KACb,IAAI,MAAM,QAAQ,EAAE,SAAS,MAAM,EAAE,OAAO;KAC5C,OAAO;IACT;GACF;GACA,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,cAEH,OAAO,KAAK,QAAQ,KAAK,MAAM,IAAI;GACrC,KAAK,eAAe;IAClB,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;IACtC,IAAI,CAAC,MAAM,OAAO;IAClB,QAAQ,MAAM;KACZ,MAAM,IAAI,EAAE,CAAC;KACb,OAAO,MAAM,OAAO,OAAO,OAAO,KAAK,CAAC;IAC1C;GACF;GACA,KAAK;GACL,KAAK,iBAAiB;IACpB,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;IACtC,MAAM,SAAS,CAAC,OAAO,KAAA,IAAY,UAAU,SAAS,MAAM,KAAK,IAAI,OAAO,OAAO,KAAK;IACxF,MAAM,OAAO,QAAQ,UAAU,SAAS,MAAM,KAAK;IACnD,QAAQ,MAAM;KACZ,MAAM,QAAQ,EAAE;KAChB,MAAM,IAAI,EAAE,CAAC;KACb,IAAI,MAAM,MAAM,OAAO,OAAO,OAAO,KAAK,CAAC,IAAI;KAC/C,IAAI,EAAE,SAAS,IAAI,OAAO;KAC1B,EAAE,MAAM;KACR,OAAO,WAAW,KAAA,IAAY,KAAA,IAAY,OAAO;IACnD;GACF;GACA,KAAK,QAAQ;IACX,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;IACtC,QAAQ,MAAM;KACZ,MAAM,QAAQ,EAAE;KAChB,MAAM,IAAI,EAAE,CAAC;KACb,IAAI,MAAM,MAAM,EAAE,MAAM;KACxB,OAAO;IACT;GACF;GACA,KAAK,OAAO;IACV,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,KAAK;IACvC,QAAQ,MAAM;KACZ,MAAM,QAAQ,EAAE;KAChB,IAAI,EAAE,CAAC,MAAM,MAAM;MACjB,EAAE,MAAM;MACR,EAAE,OAAO;MACT,OAAO;KACT;KACA,IAAI,EAAE,SAAS,IAAI,OAAO;KAC1B,EAAE,MAAM;IAEV;GACF;GACA,KAAK,OACH,OAAO,KAAK,IAAI,MAAM,IAAI;GAC5B,KAAK,UAAU;IACb,MAAM,OAAO,KAAK;IAClB,MAAM,QAAQ,KAAK,QAAQ,KAAK,MAAM,KAAK,QAAQ,GAAG,IAAI,CAAC;IAC3D,MAAM,IAAI,MAAM;IAChB,IAAI,CAAC,MAAM,OAAO,KAAK,MAAM,KAAK;IAClC,QAAQ,MAAM;KACZ,MAAM,MAA+B,CAAC;KACtC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;MAC1B,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;MACpB,IAAI,MAAM,MAAM,OAAO;MACvB,IAAI,KAAK,MAAM;KACjB;KACA,OAAO;IACT;GACF;GACA,KAAK,WAAW;IACd,MAAM,KAAK,KAAK,QAAQ,KAAK,MAAM,IAAI;IACvC,MAAM,KAAK,KAAK,QAAQ,KAAK,MAAM,IAAI;IACvC,IAAI,CAAC,MAAM,OAAO,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,IAAI,KAAK;IACf,QAAQ,MAAM;KACZ,MAAM,IAAI,GAAG,CAAC;KACd,IAAI,MAAM,MAAM,OAAO;KACvB,MAAM,IAAI,GAAG,CAAC;KACd,OAAO,MAAM,OAAO,OAAO,EAAE,GAAG,CAAC;IACnC;GACF;GACA,KAAK,OACH,OAAO,KAAK,IAAI,MAAM,IAAI;GAC5B,KAAK,YACH,OAAO,KAAK,SAAS,GAAG,MAAM,IAAI;GACpC,KAAK;GACL,KAAK,QACH,OAAO,KAAK,OAAO,MAAM,IAAI;GAC/B,KAAK,cACH,OAAO,KAAK,WAAW,IAAI;GAC7B,KAAK,aACH,OAAO,KAAK,UAAU,MAAM,IAAI;GAClC,KAAK,iBACH,OAAO,KAAK,cAAc,IAAI;GAChC,KAAK;GACL,KAAK,WACH,OAAO,KAAK,SAAS,GAAG,MAAM,2BAA2B;EAC7D;CACF;;CAGA,MAAM,OAAkC;EACtC,MAAM,IAAI,MAAM;EAChB,IAAI,MAAM,GAAG,aAAa,KAAA;EAC1B,IAAI,MAAM,GAAG,OAAO,MAAM;EAC1B,IAAI,MAAM,GAAG;GACX,MAAM,CAAC,GAAG,KAAK;GACf,QAAQ,MAAO,EAAE,CAAC,MAAM,OAAO,OAAO,EAAE,CAAC;EAC3C;EACA,QAAQ,MAAM;GACZ,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC,MAAM,MAAM,OAAO;EAE/D;CACF;CAEA,IAAI,MAAqB,MAAqB;EAC5C,MAAM,SAAS,KAAK;EACpB,MAAM,QAAQ,MACZ,SAAS,WAAW,WAAW,WAAW,KAAM,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,CAAC;EAC5F,MAAM,QAAQ,KAAK,QAAQ,KAAK,GAAG,MAAM,KAAK,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC;EACjE,MAAM,IAAI,MAAM;EAChB,IAAI,CAAC,MAAM,OAAO,KAAK,MAAM,KAAK;EAClC,IAAI,WAAW,SACb,QAAQ,MAAM;GACZ,MAAM,MAAM,IAAI,MAAM,CAAC;GACvB,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;IAC1B,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;IACpB,IAAI,MAAM,MAAM,OAAO;IACvB,IAAI,KAAK;GACX;GACA,OAAO;EACT;EAEF,IAAI,UAAU,SAAS,MAAM,GAAG;GAC9B,IAAI,MAAM,GAAG;IACX,MAAM,CAAC,GAAG,KAAK;IACf,OAAO,WAAW,KACb,MAAM;KACL,MAAM,IAAI,EAAE,CAAC;KACb,IAAI,MAAM,MAAM,OAAO;KACvB,OAAO,EAAE,CAAC,MAAM,OAAO,OAAO;IAChC,KACC,MAAO,EAAE,CAAC,MAAM,OAAO,OAAO,EAAE,CAAC;GACxC;GACA,QAAQ,MAAM;IACZ,IAAI;IACJ,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;KAC1B,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;KACpB,IAAI,MAAM,MAAM,OAAO;KACvB,IAAI,MAAM,QAAQ,MAAM;IAC1B;IACA,OAAO;GACT;EACF;EACA,MAAM,CAAC,IAAI,MAAM;EACjB,QAAQ,MAAM;GACZ,IAAI;GACJ,IAAI;GACJ,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;IAC1B,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;IACpB,IAAI,MAAM,MAAM,OAAO;IACvB,IAAI,MAAM,IAAI,IAAI;SACb,IAAI,MAAM,IAAI,IAAI;GACzB;GACA,OAAO,CAAC,GAAG,CAAC;EACd;CACF;;CAGA,aAAgD;EAC9C,OAAO,KAAK,SAAS,KAChB,MAAO,EAAE,MAAM,EAAE,MAAO,EAAE,MAAiB,WAAW,EAAE,GAAG,IAAI,MAC/D,MAAO,EAAE,MAAM,EAAE,MAAO,EAAE,MAAqB,EAAE,OAAO;CAC/D;CAEA,IAAI,MAAqB,MAAqB;EAC5C,MAAM,QAAQ,KAAK,QAAQ,KAAK,MAAM,KAAK,QAAQ,GAAG,IAAI,CAAC;EAC3D,MAAM,IAAI,MAAM;EAChB,IAAI,MAAM,GACR,QAAQ,MAAM;GACZ,EAAE,OAAO;GACT,OAAO;EACT;EAEF,IAAI,MAAM,GAAG,OAAO,MAAM;EAC1B,MAAM,OAA4B,KAAK,SAAS,IAAI,KAAA,IAAY,QAAQ,KAAK,QAAQ,KAAK,MAAM,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC;EAClH,IAAI,SAAS,KAAA,GACX,QAAQ,MAAM;GACZ,MAAM,QAAQ,EAAE;GAChB,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;IAC1B,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;IACpB,IAAI,MAAM,MAAM,OAAO;IACvB,IAAI,EAAE,SAAS,IAAI,OAAO;IAC1B,EAAE,MAAM;GACV;GACA,EAAE,OAAO;GACT,OAAO;EACT;EAEF,MAAM,QAAQ,KAAK,MAAM,KAAK,MAAM,EAAE,KAAK,MAAM,MAAM,EAAE,CAAC;EAC1D,MAAM,EAAE,QAAQ,KAAK,SAAS;EAC9B,MAAM,OAAO,KAAK,WAAW;EAC7B,MAAM,YAAY,KAAK;EACvB,QAAQ,MAAM;GAEZ,MAAM,IAAI,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,EAAE,MAAM,KAAK,KAAK,CAAC;GACxE,MAAM,aAAa,MAAM,KAAK,QAAQ,MAAM,IAAI,IAAI,MAAM,IAAI,YAAY,OAAO,KAAK;GACtF,MAAM,QAAQ,EAAE;GAChB,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;IAC1C,MAAM,IAAI,WAAW,EAAE,CAAC,CAAC;IACzB,IAAI,MAAM,MAAM,OAAO;IACvB,IAAI,EAAE,SAAS,IAAI,OAAO;IAC1B,EAAE,MAAM;GACV;GACA,EAAE,OAAO;GACT,OAAO;EACT;CACF;CAEA,SAAS,GAAe,MAA0B,MAAqB;EACrE,MAAM,WAAW,KAAK,QAAQ,KAAK,UAAU,IAAI;EACjD,MAAM,SAAS,KAAK;EACpB,MAAM,2BAAW,IAAI,IAAsB;EAC3C,IAAI,KAAK,UAAU,KAAA,GACjB,KAAK,MAAM,OAAO,QAAQ,QAAQ,KAAK,KAAK,GAAG;GAC7C,MAAM,IAAI,KAAK,MAAM;GACrB,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,SAAS,IAAI,GAAG,KAAK,QAAQ,GAAG,IAAI,CAAC;EAC7D;EAEF,IAAI,KAAK,cAAc,KAAA,KAAa,CAAC,SAAS,IAAI,KAAK,SAAS,GAC9D,SAAS,IAAI,KAAK,WAAW,KAAK,QAAQ,KAAK,WAAW,IAAI,CAAC;EAEjE,MAAM,WAAiB,MAAM;GAC3B,MAAM,QAAQ,EAAE;GAChB,MAAM,MAAM,SAAS,CAAC;GACtB,IAAI,QAAQ,MAAM,OAAO;GACzB,MAAM,IAAI,OAAO,GAAG;GACpB,IAAI,MAAM,KAAA,GAAW;IACnB,EAAE,MAAM;IACR,EAAE,OAAO;IACT,OAAO;GACT;GACA,QAAQ,SAAS,IAAI,CAAC,KAAK,EAAE,KAAA,CAAM,CAAC;EACtC;EACA,IAAI,KAAK,UAAU,KAAA,GAAW;GAC5B,KAAK,KAAK,GAAG,MAAM,+DAA+D;GAClF,OAAO;EACT;EAEA,IAAI,MAAM,OAAO,KAAK,QAAQ;EAC9B,MAAM,OAAO,UAAU,SAAS,KAAK,MAAM;EAC3C,IAAI,MAAM,MAAM,OAAQ,IAAuB,IAAI;EACnD,IAAI,CAAC,UAAU,SAAS,KAAK,KAAK,KAAK,CAAC,KAAK,OAAO,IAAI,QAAQ,GAAG,OAAO;EAC1E,MAAM,MAAM,IAAI;EAEhB,MAAM,QAAQ,QAAQ,KAAA,IAAa,KAAK,SAAS,IAAI,QAAS,YAAa,KAAK,IAAI,UAAU,GAAG,GAAG,KAAM;EAC1G,MAAM,OAAO,KAAK,IAAI,OAAO,SAAS;EACtC,IAAI,SAAS,GAAG,OAAO;EACvB,MAAM,QAA4B,CAAC;EACnC,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,KAAK;GAE7B,MAAM,IAAI,OADE,QAAQ,KAAA,KAAa,KAAK,SAAS,IAAI,IAAI,OAAO,CAAC,CAC3C;GACpB,MAAM,KAAK,MAAM,KAAA,IAAY,OAAQ,SAAS,IAAI,CAAC,KAAK,EAAE,IAAK;EACjE;EACA,MAAM,OAAO,KAAK,WAAW;EAC7B,MAAM,UAAU,OAAO,IAAI;EAC3B,MAAM,YAAY,KAAK;EACvB,QAAQ,MAAM;GACZ,IAAI,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,EAAE,KAAK,OAAO,QAAQ,CAAC;GACtE,MAAM,IAAI,KAAK,CAAC;GAChB,IAAI,IAAI,GAAG;IACT,EAAE,OAAO;IACT,OAAO;GACT;GACA,IAAI,KAAK,MAAM,OAAO,QAAQ,CAAC;GAC/B,MAAM,IAAI,MAAM;GAChB,IAAI,MAAM,MAAM;IACd,EAAE,OAAO;IACT,OAAO;GACT;GACA,EAAE,OAAO;GACT,OAAO,EAAE,CAAC;EACZ;CACF;CAEA,OAAO,MAAyC,MAAqB;EACnE,MAAM,EAAE,KAAK,QAAQ;EACrB,MAAM,YAAY,QAAQ;EAC1B,MAAM,SAAS,UAAU,SAAS,MAAM,MAAM;EAC9C,MAAM,OAAO,SAAU,KAAwB,QAAQ,KAAA;EACvD,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;EACtC,MAAM,YAAY,KAAK;EACvB,MAAM,MAAM,IAAI,IAAI;EAEpB,MAAM,UAAU,QAAQ,SAAS,KAAA;EACjC,MAAM,OAAsB,CAAC,gBAAgB,KAAA,IAAY,SAAU,KAAwB,aAAa,CAAC;EACzG,MAAM,MAAyC,CAAC,WAC3C,QAAQ,MACT,SACG,KAAwB,KACxB,KAAK,MAAM;GACV,IAAI,KAAK,CAAC;GACV,OAAO;EACT;EACN,QAAQ,MAAM;GACZ,MAAM,QAAQ,EAAE;GAChB,IAAI;GACJ,IAAI,QAAQ;GACZ,IAAI,UAAU;GACd,IAAI,aAAa,EAAE,WAAW,KAAA,GAAW;IACvC,MAAM,KAAK,OAAO,KAAK,GAAG,KAAK,KAAK;IACpC,IAAI,cAAc,OAAO,MAAM;KAC7B,EAAE,MAAM,GAAG;KACX,OAAO,GAAG;IACZ;IACA,IAAI,OAAO,KAAA,GAAW;KACpB,MAAM,GAAG;KACT,QAAQ,GAAG;KACX,EAAE,MAAM,GAAG;KACX,UAAU;IACZ;GACF;GACA,IAAI,CAAC,SAAS,MAAM,KAAK;GACzB,OAAO,QAAQ,KAAK,SAAS;IAC3B,IAAI,SAAS,KAAA,KAAa,SAAS,OAAO,CAAC,KAAK,GAAG,GAAG;IACtD,MAAM,QAAQ,EAAE;IAChB,MAAM,IAAI,EAAE,CAAC;IACb,IAAI,MAAM,MAAM;KACd,IAAI,EAAE,SAAS,OAAO,EAAE,WAAW,KAAA,GAAW,OAAO,KAAK,GAAG,KAAK,OAAO;MAAE;MAAK;MAAO,KAAK;KAAM,CAAC;KACnG,IAAI,EAAE,SAAS,MAAM,QAAQ,KAAK,OAAO;KACzC,EAAE,MAAM;KACR,OAAO,UAAU,OAAO,KAAK,GAAG,KAAK,OAAO,MAAM,GAAG,IAAI;IAC3D;IACA,IAAI,aAAa,EAAE,QAAQ,OAAO;KAChC,EAAE,OAAO;KACT,OAAO;IACT;IACA,MAAM,IAAI,KAAK,CAAC;GAClB;GACA,OAAO,UAAU,OAAO,KAAK,GAAG,KAAK,OAAO,MAAM,GAAG,IAAI;EAC3D;CACF;;;;;CAMA,QAAgB,GAAqB;EACnC,MAAM,OAAO,OAAO,CAAC;EACrB,QAAQ,KAAK,MAAb;GACE,KAAK,QAAQ;IACX,MAAM,IAAI,KAAK,QAAQ,KAAK,IAAI;IAChC,MAAM,OAAO,KAAK;IAClB,MAAM,KAAK,KAAK;IAChB,QAAQ,MAAM;KACZ,MAAM,IAAI,EAAE,CAAC;KACb,IAAI,MAAM,QAAQ,EAAE,SAAS,MAAM,EAAE,OAAO;KAC5C,OAAO;IACT;GACF;GACA,KAAK,OAAO;IACV,MAAM,IAAI,KAAK;IACf,MAAM,QAAQ,KAAK,QAAQ,KAAK,GAAG,MAAO,MAAM,IAAI,KAAK,QAAQ,CAAC,IAAI,KAAK,QAAQ,GAAG,KAAK,CAAE;IAC7F,QAAQ,MAAM;KACZ,IAAI;KACJ,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;MACrC,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;MACpB,IAAI,MAAM,MAAM,OAAO;MACvB,IAAI,MAAM,GAAG,MAAM;KACrB;KACA,OAAO;IACT;GACF;GACA,KAAK;GACL,KAAK,aAAa;IAChB,MAAM,OAAO,OAAO,KAAK,IAAI;IAC7B,IAAI,SAAS,KAAA,GAAW,OAAO,KAAK,YAAY,MAAM,IAAI;IAE1D,MAAM,IAAI,KAAK,QAAQ,GAAG,IAAI;IAC9B,QAAQ,MAAM;KACZ,MAAM,IAAI,EAAE,CAAC;KACb,OAAO,MAAM,OAAO,OAAO,YAAY,CAA8C;IACvF;GACF;GACA,SACE,OAAO,KAAK,QAAS,KAAuC,IAAI;EACpE;CACF;CAEA,YAAoB,MAA8C,MAAuB;EACvF,MAAM,QAAQ,KAAK,QAAQ,KAAK,GAAG,MAAM,KAAK,QAAQ,GAAG,MAAM,KAAK,OAAO,MAAM,KAAK,KAAK,CAAC;EAC5F,MAAM,EAAE,KAAK,IAAI,OAAO,OAAO;EAE/B,MAAM,SAAS,GAAe,QAA6B;GACzD,IAAI;GACJ,IAAI;GACJ,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;IACpB,IAAI,MAAM,MAAM,OAAO;IACvB,IAAI,MAAM,IAAI,MAAM;SACf,IAAI,MAAM,IAAI,QAAQ;GAC7B;GACA,IAAI,IAAI,KAAK,KAAK;GAClB,OAAO;EACT;EACA,MAAM,EAAE,KAAK,QAAQ;EACrB,MAAM,YAAY,QAAQ;EAC1B,IAAI,UAAU,SAAS,MAAM,QAAQ,GACnC,QAAQ,MAAM;GACZ,MAAM,MAAM,IAAI,WAAW;GAC3B,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,SAAS;IACxC,MAAM,QAAQ,EAAE;IAChB,IAAI;IACJ,IAAI;IACJ,IAAI,KAAK;IACT,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;KACrC,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;KACpB,IAAI,MAAM,MAAM;MACd,KAAK;MACL;KACF;KACA,IAAI,MAAM,IAAI,MAAM;UACf,IAAI,MAAM,IAAI,QAAQ;IAC7B;IACA,IAAI,CAAC,IAAI;KACP,IAAI,EAAE,SAAS,MAAM,QAAQ,KAAK,OAAO;KACzC,EAAE,MAAM;KACR,OAAO,IAAI,OAAO;IACpB;IACA,IAAI,aAAa,EAAE,QAAQ,OAAO;KAChC,EAAE,OAAO;KACT,OAAO;IACT;IACA,IAAI,IAAI,KAAK,KAAK;GACpB;GACA,OAAO,IAAI,OAAO;EACpB;EAEF,MAAM,MAAM,KAAK,QAAQ,KAAK,WAAW,KAAK;EAC9C,QAAQ,MAAM;GACZ,MAAM,MAAM,IAAI,WAAW;GAC3B,IAAI,QAAQ;GACZ,IAAI,QAAQ,GAAG,OAAO,IAAI,OAAO;GACjC,IAAI,QAAQ,EAAE;GACd,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG;IAClB,IAAI,EAAE,SAAS,MAAM,MAAM,GAAG,OAAO;IACrC,EAAE,MAAM;IACR,OAAO,IAAI,OAAO;GACpB;GACA;GACA,OAAO,QAAQ,KAAK;IAClB,QAAQ,EAAE;IACV,IAAI,IAAI,CAAC,MAAM,MAAM;KACnB,IAAI,EAAE,SAAS,MAAM,QAAQ,KAAK,OAAO;KACzC,EAAE,MAAM;KACR,OAAO,IAAI,OAAO;IACpB;IACA,IAAI,aAAa,EAAE,QAAQ,OAAO;KAChC,EAAE,OAAO;KACT,OAAO;IACT;IACA,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG;KAClB,IAAI,EAAE,SAAS,MAAM,QAAQ,KAAK,OAAO;KACzC,EAAE,MAAM;KACR,OAAO,IAAI,OAAO;IACpB;IACA;GACF;GACA,OAAO,IAAI,OAAO;EACpB;CACF;CAEA,WAAW,MAAkC;EAC3C,MAAM,EAAE,KAAK,QAAQ;EACrB,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;EACtC,MAAM,MAAM,KAAK,QAAQ,KAAK,KAAK,IAAI;EACvC,QAAQ,MAAM;GACZ,MAAM,MAAsB,CAAC;GAC7B,OAAO,MAAM;IACX,MAAM,QAAQ,EAAE;IAChB,IAAI,IAAI,UAAU,KAAK;KACrB,MAAM,IAAI,IAAI,CAAC;KACf,IAAI,MAAM,MAAM,OAAO,CAAC,KAAK,CAAC;KAC9B,IAAI,EAAE,SAAS,IAAI,OAAO;KAC1B,EAAE,MAAM;KACR,IAAI,IAAI,UAAU,KAAK,OAAO;IAChC;IACA,MAAM,IAAI,EAAE,CAAC;IACb,IAAI,MAAM,MAAM,OAAO;IACvB,IAAI,EAAE,QAAQ,OAAO;KACnB,EAAE,OAAO;KACT,OAAO;IACT;IACA,IAAI,KAAK,CAAC;GACZ;EACF;CACF;CAEA,UAAU,MAA2B,MAAqB;EACxD,MAAM,EAAE,KAAK,QAAQ;EACrB,MAAM,YAAY,QAAQ;EAC1B,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;EACtC,MAAM,MAAM,KAAK,QAAQ,KAAK,WAAW,KAAK;EAC9C,MAAM,YAAY,KAAK;EACvB,MAAM,MAAM,IAAI,IAAI;EACpB,QAAQ,MAAM;GACZ,MAAM,QAAQ,EAAE;GAChB,IAAI;GACJ,IAAI,QAAQ;GACZ,IAAI,UAAU;GACd,IAAI,aAAa,EAAE,WAAW,KAAA,GAAW;IACvC,MAAM,KAAK,OAAO,KAAK,GAAG,KAAK,KAAK;IAIpC,IAAI,cAAc,OAAO,MAAM;KAC7B,EAAE,MAAM,GAAG;KACX,OAAO,GAAG;IACZ;IACA,IAAI,OAAO,KAAA,GAAW;KACpB,MAAM,GAAG;KACT,QAAQ,GAAG;KACX,EAAE,MAAM,GAAG;KACX,UAAU;IACZ;GACF;GACA,IAAI,CAAC,SAAS;IACZ,MAAM,OAAO,CAAC,IAAI,KAAA;IAClB,IAAI,QAAQ,GAAG,OAAO;IACtB,MAAM,QAAQ,EAAE;IAChB,MAAM,QAAQ,EAAE,CAAC;IACjB,IAAI,UAAU,MAAM;KAClB,IAAI,EAAE,SAAS,MAAM,MAAM,GAAG,OAAO;KACrC,EAAE,MAAM;KACR,OAAO;IACT;IACA,KAAK,KAAK,KAAK;IACf,QAAQ;GACV;GACA,OAAO,QAAQ,KAAK;IAClB,MAAM,QAAQ,EAAE;IAChB,IAAI,IAAI,CAAC,MAAM,MAAM;KACnB,IAAI,EAAE,SAAS,OAAO,EAAE,WAAW,KAAA,GAAW,OAAO,KAAK,GAAG,KAAK,OAAO;MAAE;MAAK;MAAO,KAAK;KAAM,CAAC;KACnG,IAAI,EAAE,SAAS,MAAM,QAAQ,KAAK,OAAO;KACzC,EAAE,MAAM;KACR,OAAO,UAAU,OAAO,KAAK,GAAG,KAAK,OAAO,MAAM,GAAG,IAAI;IAC3D;IACA,IAAI,aAAa,EAAE,QAAQ,OAAO;KAChC,EAAE,OAAO;KACT,OAAO;IACT;IACA,MAAM,IAAI,EAAE,CAAC;IACb,IAAI,MAAM,MAAM;KACd,IAAI,EAAE,SAAS,OAAO,EAAE,WAAW,KAAA,GAAW,OAAO,KAAK,GAAG,KAAK,OAAO;MAAE;MAAK;MAAO,KAAK;KAAM,CAAC;KACnG,IAAI,EAAE,SAAS,MAAM,QAAQ,KAAK,OAAO;KACzC,EAAE,MAAM;KACR,OAAO,UAAU,OAAO,KAAK,GAAG,KAAK,OAAO,MAAM,GAAG,IAAI;IAC3D;IACA,KAAK,KAAK,CAAC;IACX;GACF;GACA,OAAO,UAAU,OAAO,KAAK,GAAG,KAAK,OAAO,MAAM,GAAG,IAAI;EAC3D;CACF;CAEA,cAAc,MAAqC;EACjD,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;EACtC,MAAM,MAAM,KAAK,QAAQ,KAAK,WAAW,IAAI;EAC7C,MAAM,KAAK,KAAK;EAChB,MAAM,YAAY,KAAK;EACvB,MAAM,MAAM,IAAI,IAAI;EACpB,IAAI,CAAC,KAAK,OACR,QAAQ,MAAM;GACZ,MAAM,QAAQ,EAAE;GAChB,IAAI;GACJ,IAAI,UAAU;GACd,IAAI,aAAa,EAAE,WAAW,KAAA,GAAW;IACvC,MAAM,KAAK,OAAO,KAAK,GAAG,KAAK,KAAK;IACpC,IAAI,cAAc,OAAO,MAAM;KAC7B,EAAE,MAAM,GAAG;KACX,OAAO,GAAG;IACZ;IACA,IAAI,OAAO,KAAA,GAAW;KACpB,MAAM,GAAG;KACT,EAAE,MAAM,GAAG;KACX,UAAU;IACZ;GACF;GACA,IAAI,CAAC,SAAS;IACZ,MAAM,EAAE,CAAC;IACT,IAAI,QAAQ,MAAM,OAAO;GAC3B;GACA,OAAO,MAAM;IACX,MAAM,QAAQ,EAAE;IAChB,MAAM,IAAI,IAAI,CAAC;IACf,IAAI,MAAM,MAAM;KACd,IAAI,EAAE,SAAS,OAAO,EAAE,WAAW,KAAA,GAAW,OAAO,KAAK,GAAG,KAAK,OAAO;MAAE;MAAK,KAAK;KAAM,CAAC;KAC5F,IAAI,EAAE,SAAS,IAAI,OAAO;KAC1B,EAAE,MAAM;KACR,OAAO,UAAU,OAAO,KAAK,GAAG,KAAK,OAAO,MAAM,GAAG,IAAI;IAC3D;IACA,IAAI,EAAE,QAAQ,OAAO;KACnB,EAAE,OAAO;KACT,OAAO;IACT;IACA,MAAM,IAAI,EAAE,CAAC;IACb,IAAI,MAAM,MAAM;KACd,IAAI,EAAE,SAAS,OAAO,EAAE,WAAW,KAAA,GAAW,OAAO,KAAK,GAAG,KAAK,OAAO;MAAE;MAAK,KAAK;KAAM,CAAC;KAC5F,IAAI,EAAE,SAAS,IAAI,OAAO;KAC1B,EAAE,MAAM;KACR,OAAO,UAAU,OAAO,KAAK,GAAG,KAAK,OAAO,MAAM,GAAG,IAAI;IAC3D;IACA,MAAM,GAAG,KAAK,GAAG,CAAC;GACpB;EACF;EAEF,QAAQ,MAAM;GACZ,MAAM,QAAQ,EAAE,CAAC;GACjB,IAAI,UAAU,MAAM,OAAO;GAC3B,MAAM,SAAyB,CAAC,KAAK;GACrC,MAAM,OAAuB,CAAC;GAC9B,OAAO,MAAM;IACX,MAAM,QAAQ,EAAE;IAChB,MAAM,IAAI,IAAI,CAAC;IACf,IAAI,MAAM,MAAM;KACd,IAAI,EAAE,SAAS,IAAI,OAAO;KAC1B,EAAE,MAAM;KACR;IACF;IACA,IAAI,EAAE,QAAQ,OAAO;KACnB,EAAE,OAAO;KACT,OAAO;IACT;IACA,MAAM,IAAI,EAAE,CAAC;IACb,IAAI,MAAM,MAAM;KACd,IAAI,EAAE,SAAS,IAAI,OAAO;KAC1B,EAAE,MAAM;KACR;IACF;IACA,KAAK,KAAK,CAAC;IACX,OAAO,KAAK,CAAC;GACf;GACA,IAAI,MAAM,OAAO,OAAO,SAAS;GACjC,KAAK,IAAI,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK,MAAM,GAAG,OAAO,IAAI,KAAK,IAAI,GAAG;GAC3E,OAAO;EACT;CACF;CAMA,MAAM,GAAe,MAAiB,MAAqB;EACzD,MAAM,OAAO,KAAK;EAClB,QAAQ,KAAK,MAAb;GACE,KAAK;IACH,IAAI,SAAS,GACX,QAAQ,MAAM;KACZ,MAAM,MAAM,EAAE;KACd,IAAI,OAAO,EAAE,KAAK,OAAO,KAAK,CAAC;KAC/B,EAAE,MAAM,MAAM;KACd,OAAQ,EAAE,MAAqB;IACjC;IAEF,QAAQ,MAAM;KACZ,MAAM,MAAM,EAAE;KACd,IAAI,OAAO,EAAE,KAAK,OAAO,KAAK,CAAC;KAC/B,MAAM,MAAM,EAAE;KACd,MAAM,IAAI,IAAI,WAAW,GAAG;KAC5B,IAAI,KAAK,SAAU,KAAK,SAAU,MAAM,IAAI,IAAI,WAAW,IAAI,WAAW,MAAM,CAAC,IAAI,WAAY,OAAQ;MACvG,EAAE,MAAM,MAAM;MACd,OAAO,OAAO,IAAI,MAAM,KAAK,MAAM,CAAC,IAAI,KAAA;KAC1C;KACA,EAAE,MAAM,MAAM;KACd,OAAO,OAAO,IAAI,OAAO,KAAA;IAC3B;GACF,KAAK,WACH,OAAO,KAAK,aAAa,GAAG,IAAI;GAClC,KAAK,SAAS;IACZ,MAAM,MAAM,SAAS,KAAK,KAAK,IAAI;IACnC,MAAM,SAAS,KAAK;IACpB,MAAM,SAAS,YAAY,KAAK,MAAM;IACtC,MAAM,OAAO,IAAI;IACjB,IAAI,SAAS,GACX,QAAQ,MAAM;KACZ,MAAM,MAAM,EAAE;KACd,IAAI,OAAO,EAAE,KAAK,OAAO,KAAK,CAAC;KAC/B,MAAM,IAAK,EAAE,MAAqB;KAClC,IAAI,OAAO,OAAO,GAAG,OAAO,KAAK,CAAC;KAClC,EAAE,MAAM,MAAM;KACd,OAAO;IACT;IAEF,QAAQ,MAAM;KACZ,MAAM,MAAM,EAAE;KACd,IAAI,OAAO,EAAE,KAAK,OAAO,KAAK,CAAC;KAC/B,MAAM,MAAM,EAAE;KACd,MAAM,IAAI,IAAI,WAAW,GAAG;KAC5B,IAAI,IAAI,WAAW;MACjB,IAAI,OAAO,OAAO,GAAG,OAAO,KAAK,CAAC;MAClC,EAAE,MAAM,MAAM;MACd,OAAO,OAAO,IAAI,OAAO,KAAA;KAC3B;KACA,IAAI,KAAK;KACT,IAAI,KAAK,SAAU,KAAK,SAAU,MAAM,IAAI,IAAI,QAAQ;MACtD,MAAM,IAAI,IAAI,WAAW,MAAM,CAAC;MAChC,KAAK,IAAI,WAAY,OAAQ,MAAO,IAAI,SAAW,OAAO,IAAI,SAAU;KAC1E;KACA,IAAI,KAAK,EAAE,MAAM,QAAQ,OAAO,KAAK,CAAC;KACtC,MAAM,MAAM,KAAK,QAAS,IAAI;KAC9B,EAAE,MAAM,MAAM;KACd,OAAO,CAAC,OAAO,KAAA,IAAY,QAAQ,IAAI,IAAI,OAAO,IAAI,MAAM,KAAK,MAAM,CAAC;IAC1E;GACF;GACA,KAAK,QAAQ;IACX,MAAM,QAAQ,KAAK;IACnB,IAAI,SAAS,GACX,QAAQ,MAAM;KACZ,MAAM,QAAQ,EAAE;KAChB,IAAI,EAAE,MAAM,QAAQ,OAAO,OAAO,OAAO,GAAG,EAAE,GAAG;KACjD,EAAE,MAAM,QAAQ;KAChB,OAAO,OAAQ,EAAE,MAAqB,SAAS,OAAO,QAAQ,KAAK,IAAI,KAAA;IACzE;IAEF,QAAQ,MAAM;KACZ,MAAM,MAAM,EAAE;KACd,MAAM,QAAQ,EAAE;KAChB,MAAM,MAAM,EAAE;KACd,IAAI,IAAI;KACR,IAAI,MAAM;KACV,OAAO,MAAM,SAAS,IAAI,KAAK;MAC7B,MAAM,IAAI,IAAI,WAAW,CAAC;MAC1B,KAAK,KAAK,SAAU,KAAK,SAAU,IAAI,IAAI,IAAI,WAAW,IAAI,WAAW,IAAI,CAAC,IAAI,WAAY,QAAS,IAAI;MAC3G;KACF;KACA,IAAI,MAAM,OAAO,OAAO,OAAO,GAAG,CAAC;KACnC,EAAE,MAAM;KACR,OAAO,OAAO,IAAI,MAAM,OAAO,CAAC,IAAI,KAAA;IACtC;GACF;GACA,KAAK,aACH,OAAO,KAAK,eAAe,MAAM,IAAI;GACvC,KAAK,aAAa;IAChB,MAAM,EAAE,SAAS,KAAK,QAAQ;IAC9B,MAAM,UAAU,MAAM,KAAK,QAAQ;IACnC,QAAQ,MAAM;KACZ,MAAM,QAAQ,EAAE;KAChB,MAAM,MAAM,QAAQ,GAAG,SAAS,KAAK;KACrC,IAAI,MAAM,GAAG,OAAO,OAAO,GAAG,EAAE,GAAG;KACnC,IAAI,SAAS;MACX,MAAM,QAAQ,YAAY,GAAG,OAAO,GAAG;MACvC,IAAI,QAAQ,OAAO,QAAQ,KAAK,OAAO,OAAO,GAAG,GAAG;KACtD;KACA,EAAE,MAAM;KACR,OAAO,OAAO,EAAE,MAAM,OAAO,GAAG,IAAI,KAAA;IACtC;GACF;GACA,KAAK,QACH,QAAQ,MAAM;IACZ,MAAM,QAAQ,EAAE;IAChB,EAAE,MAAM,EAAE;IACV,OAAO,OAAO,EAAE,MAAM,OAAO,EAAE,GAAG,IAAI,KAAA;GACxC;EACJ;CACF;CAEA,aAAa,GAAe,MAA+B;EACzD,MAAM,MAAM,KAAK;EACjB,MAAM,cAAc,UAAU,SAAS,GAAG,IAAI,IAAI,eAAe,aAAa,IAAI;EAClF,IAAI,KAAK,SAAS,GAAG;GACnB,IAAI,gBAAgB,GAAG,OAAO,KAAK,SAAS,GAAG,MAAM,uCAAuC;GAC5F,MAAM,MAAM;GACZ,MAAM,MAAM,IAAI;GAChB,IAAI,KAAK,UAAU;IACjB,MAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,IAAI,IAAI,GAAG,MAAM,WAAW,IAAI,WAAW,CAAC,CAAC,CAAC;IACnF,QAAQ,MAAM;KACZ,MAAM,MAAM,EAAE;KACd,IAAI,EAAE,MAAM,MAAM,KAAK,OAAO,KAAK,CAAC;KACpC,MAAM,QAAQ,EAAE;KAChB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KACvB,IAAI,WAAW,MAAM,WAAW,MAAM,CAAC,CAAC,MAAM,QAAQ,IAAI,OAAO,KAAK,CAAC;KAEzE,EAAE,MAAM,MAAM;KACd,OAAO,MAAM,MAAM,KAAK,MAAM,GAAG;IACnC;GACF;GACA,OAAO,cAAc,KAAK,GAAG;EAC/B;EACA,IAAI,gBAAgB,GAAG,OAAO,KAAK,SAAS,GAAG,MAAM,6BAA6B;EAClF,MAAM,QAAQ,gBAAgB,IAAI,IAAI,YAAY,CAAC,CAAC,OAAO,GAAa,IAAK;EAC7E,MAAM,MAAM,MAAM;EAClB,MAAM,WAAW,gBAAgB,KAAK,CAAC,KAAK;EAC5C,MAAM,SAAS,KAAK,WAAW,MAAM,KAAK,OAAO,UAAU,IAAI,MAAM,KAAK,KAAK;EAC/E,MAAM,WAAW,KAAK;EACtB,QAAQ,MAAM;GACZ,MAAM,MAAM,EAAE;GACd,IAAI,EAAE,MAAM,MAAM,KAAK,OAAO,KAAK,CAAC;GACpC,MAAM,QAAQ,EAAE;GAChB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;IAC5B,MAAM,IAAI,MAAM,MAAM;IACtB,KAAK,WAAW,WAAW,CAAC,IAAI,OAAO,OAAO,IAAI,OAAO,KAAK,CAAC;GACjE;GACA,EAAE,MAAM,MAAM;GACd,OAAO,WAAW,MAAM,MAAM,SAAS,KAAK,MAAM,GAAG;EACvD;CACF;CAEA,eAAe,MAA2B,MAAqB;EAC7D,MAAM,OAAO,KAAK;EAClB,MAAM,EAAE,KAAK,KAAK,WAAW;EAC7B,MAAM,MAAM,SAAS,KAAK,KAAK,IAAI;EACnC,MAAM,SAAS,YAAY,KAAK,MAAM;EACtC,IAAI,SAAS,GACX,QAAQ,MAAM;GACZ,MAAM,QAAQ,EAAE;GAChB,MAAM,QAAQ,EAAE;GAChB,MAAM,QAAQ,QAAQ,WAAW,EAAE,MAAM,KAAK,IAAI,EAAE,KAAK,QAAQ,GAAG;GACpE,IAAI,IAAI;GACR,OAAO,IAAI,SAAS,OAAO,MAAM,QAAQ,GAAG;GAC5C,IAAI,IAAI,QAAQ,KAAK,OAAO,OAAO,GAAG,CAAC;GACvC,EAAE,MAAM;GACR,OAAO,OAAO,MAAM,SAAS,OAAO,CAAC,IAAI,KAAA;EAC3C;EAEF,MAAM,OAAO,IAAI;EACjB,QAAQ,MAAM;GACZ,MAAM,MAAM,EAAE;GACd,MAAM,QAAQ,EAAE;GAChB,MAAM,MAAM,EAAE;GACd,IAAI,IAAI;GACR,IAAI,QAAQ;GACZ,OAAO,QAAQ,OAAO,IAAI,KAAK;IAC7B,MAAM,IAAI,IAAI,WAAW,CAAC;IAC1B,IAAI,IAAI,WAAW;KACjB,IAAI,OAAO,OAAO,GAAG;KACrB;IACF,OAAO,IAAI,IAAI,SAAU,IAAI,OAAQ;KACnC,IAAI,KAAK,CAAC,MAAM,QAAQ;KACxB;IACF,OAAO;KACL,IAAI,KAAK;KACT,IAAI,IAAI,IAAI,IAAI,QAAQ;MACtB,MAAM,IAAI,IAAI,WAAW,IAAI,CAAC;MAC9B,KAAK,IAAI,WAAY,OAAQ,MAAO,IAAI,SAAW,OAAO,IAAI,SAAU;KAC1E;KACA,IAAI,KAAK,EAAE,MAAM,QAAQ;KACzB,KAAK,KAAK,QAAS,IAAI;IACzB;IACA;GACF;GACA,IAAI,QAAQ,KAAK,OAAO,OAAO,GAAG,CAAC;GACnC,EAAE,MAAM;GACR,OAAO,OAAO,IAAI,MAAM,OAAO,CAAC,IAAI,KAAA;EACtC;CACF;CAMA,KAAK,GAAe,MAAiB,KAAoB,MAAqB;EAC5E,MAAM,EAAE,MAAM,QAAQ,OAAO,cAAc,WAAW,KAAK,MAAM,GAAG;EACpE,MAAM,SAAS,IAAI;EACnB,MAAM,QAAQ,IAAI;EAClB,MAAM,SAAS,IAAI;EACnB,QAAQ,KAAK,MAAb;GACE,KAAK,OACH,QAAQ,MAAM;IACZ,MAAM,MAAM,EAAE;IACd,MAAM,MAAM,EAAE;IACd,IAAI,OAAO,KAAK,OAAO,KAAK,CAAC;IAC7B,MAAM,IAAI,OAAO,EAAE,OAAO,KAAK,GAAG;IAClC,IAAI,IAAI,MAAM;KACZ,EAAE,MAAM,MAAM;KACd,OAAO,OAAO,OAAO,CAAC,IAAI,KAAA;IAC5B;IACA,MAAM,KAAK,OAAO,EAAE,OAAO,KAAK,GAAG;IACnC,IAAI,KAAK,GAAG,OAAO,KAAK,CAAC;IACzB,EAAE,MAAM,MAAM,MAAM,EAAE;IACtB,OAAO,OAAO,OAAO,EAAE,IAAI,KAAA;GAC7B;GACF,KAAK,WAAW;IACd,MAAM,MAAM,KAAK;IACjB,IAAI,KAAK,UAAU;KACjB,MAAM,SAAS,MAAM,KAAK,MAAM,MAAM,KAAK,eAAe,CAAC,CAAC,CAAC;KAC7D,MAAM,IAAI,OAAO;KACjB,QAAQ,MAAM;MACZ,MAAM,QAAQ,EAAE;MAChB,MAAM,MAAM,EAAE;MACd,MAAM,QAAQ,EAAE;MAChB,IAAI,MAAM;MACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;OAC1B,IAAI,OAAO,KAAK,OAAO,OAAO,GAAG,GAAG;OACpC,MAAM,IAAI,OAAO,OAAO,KAAK,GAAG;OAChC,IAAI;OACJ,IAAI,IAAI,MAAM;QACZ,KAAK;QACL,OAAO;OACT,OAAO;QACL,KAAK,OAAO,OAAO,KAAK,GAAG;QAC3B,IAAI,KAAK,GAAG,OAAO,OAAO,GAAG,GAAG;QAChC,OAAO,MAAM,EAAE;OACjB;OACA,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,OAAO,OAAO,GAAG,GAAG;MAClD;MACA,EAAE,MAAM;MACR,OAAO,OAAO,OAAO,OAAO,OAAO,GAAG,IAAI,KAAA;KAC5C;IACF;IACA,MAAM,UAAU,IAAI,OAAO,GAAG;IAC9B,IAAI,UAAU,SAAS,OAAO,GAAG,OAAO,cAAc,SAAS,GAAG;IAClE,MAAM,QAAQ;IACd,MAAM,MAAM,MAAM;IAClB,IAAI,QAAQ,GAAG;KACb,MAAM,KAAK,MAAM;KACjB,QAAQ,MAAM;MACZ,MAAM,MAAM,EAAE;MACd,IAAI,MAAM,EAAE,OAAQ,EAAE,MAAqB,SAAS,IAAI;OACtD,EAAE,MAAM,MAAM;OACd,OAAO;MACT;MACA,OAAO,KAAK,CAAC;KACf;IACF;IACA,QAAQ,MAAM;KACZ,MAAM,MAAM,EAAE;KACd,IAAI,EAAE,MAAM,MAAM,KAAK,OAAO,KAAK,CAAC;KACpC,MAAM,QAAQ,EAAE;KAChB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,IAAI,MAAM,MAAM,OAAO,MAAM,IAAI,OAAO,KAAK,CAAC;KAC5E,EAAE,MAAM,MAAM;KACd,OAAO;IACT;GACF;GACA,KAAK,SAAS;IACZ,MAAM,MAAM,QAAQ,KAAK,GAAG;IAC5B,MAAM,SAAS,KAAK;IACpB,MAAM,SAAS,YAAY,KAAK,MAAM;IACtC,MAAM,OAAO,IAAI;IACjB,QAAQ,MAAM;KACZ,MAAM,MAAM,EAAE;KACd,MAAM,MAAM,EAAE;KACd,IAAI,OAAO,KAAK,OAAO,KAAK,CAAC;KAC7B,MAAM,IAAI,OAAO,EAAE,OAAO,KAAK,GAAG;KAClC,IAAI,IAAI,QAAQ,IAAI,WAAW;MAC7B,IAAI,OAAO,OAAO,GAAG,OAAO,KAAK,CAAC;MAClC,EAAE,MAAM,MAAM;MACd,OAAO,OAAO,OAAO,CAAC,IAAI,KAAA;KAC5B;KACA,MAAM,KAAK,IAAI,OAAO,IAAI,OAAO,EAAE,OAAO,KAAK,GAAG;KAClD,IAAI,KAAK,KAAK,KAAK,EAAE,MAAM,QAAQ,OAAO,KAAK,CAAC;KAChD,EAAE,MAAM,OAAO,IAAI,OAAO,YAAY,MAAM,EAAE;KAC9C,OAAO,OAAO,OAAO,EAAE,IAAI,KAAA;IAC7B;GACF;GACA,KAAK,QAAQ;IACX,MAAM,QAAQ,KAAK;IACnB,QAAQ,MAAM;KACZ,MAAM,QAAQ,EAAE;KAChB,MAAM,MAAM,EAAE;KACd,MAAM,QAAQ,EAAE;KAChB,IAAI,MAAM;KACV,KAAK,IAAI,MAAM,GAAG,MAAM,OAAO,OAAO;MACpC,IAAI,OAAO,KAAK,OAAO,OAAO,GAAG,GAAG;MAEpC,IADU,OAAO,OAAO,KAAK,GACzB,IAAI,MAAM,OAAO;WAChB;OACH,MAAM,KAAK,OAAO,OAAO,KAAK,GAAG;OACjC,IAAI,KAAK,GAAG,OAAO,OAAO,GAAG,GAAG;OAChC,OAAO,MAAM,EAAE;MACjB;KACF;KACA,EAAE,MAAM;KACR,OAAO,OAAO,OAAO,OAAO,OAAO,GAAG,IAAI,KAAA;IAC5C;GACF;GACA,KAAK,aAAa;IAChB,MAAM,EAAE,KAAK,KAAK,WAAW;IAC7B,MAAM,MAAM,QAAQ,KAAK,GAAG;IAG5B,MAAM,OAAiB;KAAE;KAAK;KAAK;KAAQ,QAF5B,YAAY,KAAK,MAEgB;KAAG,MADtC,IAAI;KACwC,OAAO,KAAK,IAAI,MAAM,SAAS;KAAG;KAAM;IAAK;IAItG,IAAI,cAAc,GAAG,OAAO,eAAe,MAAM,QAAQ,UAAU,IAAI,GAAG,GAAG;IAC7E,OAAO,KAAK,SAAS,IAAI,gBAAgB,MAAM,GAAG,IAAI,eAAe,MAAM,GAAG;GAChF;GACA,KAAK;GACL,KAAK,QACH,OAAO,KAAK,SAAS,GAAG,MAAM,qCAAqC;EACvE;CACF;CAEA,MAAM,MAAuB,MAAqB;EAChD,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,KAAK;EACvC,MAAM,MAAM,KAAK;EACjB,IAAI,QAAQ,KAAA,GAAW;GACrB,IAAI,CAAC,MAAM,OAAO;GAClB,IAAI,KAAK,SAAS,GAChB,QAAQ,MAAM;IACZ,MAAM,QAAQ,EAAE;IAChB,OAAO,EAAE,CAAC,MAAM,OAAO,OAAQ,EAAE,MAAiB,MAAM,OAAO,EAAE,GAAG;GACtE;GAEF,QAAQ,MAAM;IACZ,MAAM,QAAQ,EAAE;IAChB,OAAO,EAAE,CAAC,MAAM,OAAO,OAAO,EAAE,MAAM,OAAO,EAAE,GAAG;GACpD;EACF;EAEA,MAAM,EAAE,MAAM,QAAQ,UAAU,WAAW,KAAK,MAAM,GAAG;EACzD,MAAM,SAAS,IAAI;EACnB,QAAQ,MAAM;GACZ,MAAM,QAAQ,EAAE;GAChB,IAAI,EAAE,CAAC,MAAM,MAAM,OAAO;GAC1B,MAAM,MAAM,EAAE;GACd,MAAM,QAAQ,EAAE;GAChB,IAAI,IAAI;GACR,OAAO,IAAI,OAAO,OAAO,OAAO,GAAG,GAAG,IAAI,MAAM,KAAK;GACrD,IAAI,IAAI,OAAO,SAAS,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,OAAO,KAAK,CAAC;GAC1D,OAAO,OAAO,OAAO,OAAO,OAAO,GAAG,IAAI,KAAA;EAC5C;CACF;;;;;;CAOA,MAAc,MAAuC;EACnD,IAAI,CAAC,WAAW,IAAI,KAAK,IAAI,KAAK,KAAK,SAAS,GAAG,OAAO,KAAA;EAC1D,IAAI,CAAC,WAAW,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG,CAAC,GAAG,OAAO,KAAA;EAC9D,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;EACtC,MAAM,OAAQ,KAAK,SAAS,IAAI,kBAAkB;EAKlD,MAAM,YAAY,KAAK;EACvB,QAAQ,MAAM;GACZ,MAAM,IAAI,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG;GAEpC,IAAI,MAAM,KAAA,KAAc,aAAa,EAAE,WAAW,UAAU,OAAO,SAAS,EAAE,KAAM;IAClF,MAAM,IAAI,EAAE,CAAC;IACb,OAAO,MAAM,OAAO,OAAO,QAAQ,CAAC;GACtC;GACA,IAAI,MAAM,MAAM,OAAO,KAAK,CAAC;GAC7B,EAAE,MAAM,UAAU;GAClB,OAAO;EACT;CACF;CAEA,QAAQ,MAA+B;EACrC,MAAM,MAAM,KAAK;EACjB,MAAM,SAAS,KAAK,QAAQ,KAAK,QAAQ,CAAC,GAAG;EAC7C,MAAM,SAAS,KAAK,QAAQ,KAAK,QAAQ,CAAC,GAAG;EAC7C,MAAM,MAAM,KAAK;EACjB,MAAM,OAAO,KAAK;EAClB,MAAM,OAAO,KAAK;EAElB,IAAI;EACJ,IAAI,QAAQ,KAAA,KAAc,OAAO,UAAU,GAAG,KAAK,OAAO,WACxD,UACE,SAAS,KACJ,MAAM;GACL,IAAI,EAAE,MAAM,EAAE,OAAQ,EAAE,MAAiB,WAAW,EAAE,GAAG,MAAM,MAAM;IACnE,EAAE;IACF,OAAO;GACT;GACA,OAAO;EACT,KACC,MAAM;GACL,IAAI,EAAE,MAAM,EAAE,OAAQ,EAAE,MAAqB,EAAE,SAAS,MAAM;IAC5D,EAAE;IACF,OAAO;GACT;GACA,OAAO;EACT;OACD,IAAI,OAAO,WAAW,MAAM,GAAG,CAAC,CAAC,MAAM;GAC5C,MAAM,EAAE,QAAQ,UAAU,WAAW,MAAM,GAAG;GAC9C,WAAW,MAAM;IACf,IAAI,EAAE,MAAM,EAAE,OAAO,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM;KAC3D,EAAE,OAAO;KACT,OAAO;IACT;IACA,OAAO;GACT;EACF,OACE,WAAW,MAAM;GACf,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO;GAC3B,MAAM,KAAK,IAAI,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG;GAC3C,IAAI,OAAO,MAAM,OAAO;GACxB,EAAE,OAAO,IAAI,MAAM,EAAE;GACrB,OAAO;EACT;EAEF,MAAM,YAAY,KAAK;EACvB,MAAM,MAAM,IAAI,IAAI;;EAEpB,MAAM,cAAc,GAAe,OAAe,eAAqC;GACrF,IAAI,EAAE,WAAW,KAAA,GAAW,OAAO,KAAK,GAAG,KAAK,OAAO,UAAU;GACjE,EAAE,OAAO;GACT,OAAO;EACT;EACA,IAAI,KAAK;GACP,MAAM,QACJ,QAAQ,KAAA,KAAa,GAAG,UAAU,EAAE,MAAM,OAAO,EAAE,GAAG,KAAK,GAAG,UAAU,IAAI,KAAK,EAAE,OAAO,OAAO,EAAE,GAAG;GACxG,QAAQ,MAAM;IACZ,MAAM,QAAQ,EAAE;IAChB,IAAI,UAAU;IACd,IAAI,aAAa,EAAE,WAAW,KAAA,GAAW;KACvC,MAAM,KAAK,OAAO,KAAK,GAAG,KAAK,KAAK;KACpC,IAAI,cAAc,OAAO,MAAM;MAC7B,EAAE,MAAM,GAAG;MACX,OAAO,GAAG;KACZ;KACA,IAAI,OAAO,KAAA,GAAW;MACpB,EAAE,MAAM;MACR,UAAU;KACZ;IACF;IACA,OAAO,EAAE,MAAM,EAAE,KAAK;KACpB,MAAM,SAAS,EAAE;KACjB,IAAI,OAAO,CAAC,MAAM,MAAM;MACtB,IAAI,EAAE,QAAQ,QAAQ;OACpB,EAAE,OAAO;OACT,OAAO;MACT;MACA;KACF;KACA,IAAI,EAAE,SAAS,KAAK,OAAO,WAAW,GAAG,OAAO,MAAM;KACtD,IAAI,EAAE,SAAS,IAAI,OAAO;KAC1B,EAAE,MAAM;KACR,IAAI,QAAQ,CAAC,GACP;UAAA,OAAO,CAAC,MAAM,MAAM,OAAO,EAAE,SAAS,MAAM,WAAW,GAAG,OAAO,MAAM,IAAI;KAAA,OAE/E,OAAO,UAAU,OAAO,KAAK,GAAG,KAAK,OAAO,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,MAAM,GAAG,KAAK;IAEvF;IACA,IAAI,EAAE,SAAS,OAAO,WAAW,GAAG,OAAO,EAAE,GAAG;IAChD,OAAO,UAAU,OAAO,KAAK,GAAG,KAAK,OAAO,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,MAAM,GAAG,KAAK;GACrF;EACF;EACA,QAAQ,MAAM;GACZ,MAAM,QAAQ,EAAE;GAChB,IAAI,MAAM;GACV,IAAI,UAAU;GACd,IAAI,aAAa,EAAE,WAAW,KAAA,GAAW;IACvC,MAAM,KAAK,OAAO,KAAK,GAAG,KAAK,KAAK;IACpC,IAAI,cAAc,OAAO,MAAM;KAC7B,EAAE,MAAM,GAAG;KACX,OAAO,GAAG;IACZ;IACA,IAAI,OAAO,KAAA,GAAW;KACpB,MAAM,GAAG;KACT,EAAE,MAAM,GAAG;KACX,UAAU;IACZ;GACF;GACA,OAAO,EAAE,MAAM,EAAE,KAAK;IACpB,MAAM,SAAS,EAAE;IACjB,MAAM,IAAI,OAAO,CAAC;IAClB,IAAI,MAAM,MACJ;SAAA,EAAE,QAAQ,QAAQ;MACpB,OAAO;MACP;KACF;WACK;KACL,IAAI,EAAE,SAAS,KAAK,OAAO,WAAW,GAAG,OAAO;MAAE;MAAK,KAAK;KAAO,CAAC;KACpE,IAAI,EAAE,SAAS,IAAI,OAAO;KAC1B,EAAE,MAAM;IACV;IACA,IAAI,QAAQ,CAAC,GAAG;KACd,MAAM,IAAI,OAAO,CAAC;KAClB,IAAI,MAAM,MAAM,OAAO,EAAE,SAAS,MAAM,WAAW,GAAG,OAAO;MAAE;MAAK,KAAK;KAAO,CAAC,IAAI;KACrF,OAAO;IACT,OACE,OAAO,UAAU,OAAO,KAAK,GAAG,KAAK,OAAO,MAAM,GAAG,IAAI;GAE7D;GACA,IAAI,EAAE,SAAS,OAAO,WAAW,GAAG,OAAO;IAAE;IAAK,KAAK,EAAE;GAAI,CAAC;GAC9D,OAAO,UAAU,OAAO,KAAK,GAAG,KAAK,OAAO,MAAM,GAAG,IAAI;EAC3D;CACF;AACF;AAIA,MAAM,QAAQ,MAA+B;CAC3C,EAAE,OAAO;CACT,OAAO;AACT;AAqBA,MAAM,mBAAmB,MAAgB,QAAgC;CACvE,MAAM,EAAE,QAAQ,MAAM,KAAK,KAAK,QAAQ,OAAO,MAAM,SAAS;CAC9D,MAAM,EAAE,QAAQ,MAAM,UAAU;CAChC,QAAQ,MAAM;EACZ,MAAM,QAAgB,EAAE;EACxB,MAAM,QAAQ,EAAE;EAChB,MAAM,MAAM,EAAE;EACd,IAAI,IAAI;EACR,IAAI,QAAQ;EACZ,OAAO,QAAQ,OAAO,IAAI,KAAK;GAC7B,MAAM,IAAI,MAAM,WAAW,CAAC;GAC5B,IAAI,IAAI,OAAO;IACb,IAAI,OAAO,OAAO,GAAG;IACrB;GACF,OAAO,IAAI,IAAI,MAAM;IACnB,IAAI,KAAK,CAAC,MAAM,QAAQ;IACxB;GACF,OAAO;IACL,MAAM,KAAK,OAAO,OAAO,GAAG,GAAG;IAC/B,IAAI,KAAK,KAAK,KAAK,EAAE,MAAM,QAAQ;IACnC,KAAK,MAAM,EAAE;GACf;GACA;EACF;EACA,IAAI,QAAQ,KAAK,OAAO,OAAO,GAAG,CAAC;EACnC,EAAE,MAAM;EACR,OAAO,OAAO,KAAK,OAAO,OAAO,CAAC,IAAI,KAAA;CACxC;AACF;AAEA,MAAM,kBAAkB,MAAgB,QAAoC;CAC1E,MAAM,EAAE,QAAQ,KAAK,KAAK,QAAQ,OAAO,MAAM,SAAS;CACxD,MAAM,EAAE,QAAQ,MAAM,UAAU;CAChC,QAAQ,MAAM;EACZ,MAAM,QAAoB,EAAE;EAC5B,MAAM,QAAQ,EAAE;EAChB,MAAM,MAAM,EAAE;EACd,IAAI,IAAI;EACR,IAAI,QAAQ;EACZ,OAAO,QAAQ,OAAO,IAAI,KAAK;GAC7B,MAAM,IAAI,MAAM;GAEhB,IAAI,IAAI,OAAO;IACb,IAAI,OAAO,OAAO,GAAG;IACrB;GACF,OAAO;IACL,MAAM,KAAK,OAAO,OAAO,GAAG,GAAG;IAC/B,IAAI,KAAK,KAAK,KAAK,EAAE,MAAM,QAAQ;IACnC,KAAK,MAAM,EAAE;GACf;GACA;EACF;EACA,IAAI,QAAQ,KAAK,OAAO,OAAO,GAAG,CAAC;EACnC,EAAE,MAAM;EACR,OAAO,OAAO,KAAK,OAAO,OAAO,CAAC,IAAI,KAAA;CACxC;AACF;;AAGA,MAAM,kBAAkB,MAAgB,IAAW,QAAoC;CACrF,MAAM,EAAE,QAAQ,MAAM,KAAK,KAAK,QAAQ,OAAO,MAAM,SAAS;CAC9D,MAAM,EAAE,QAAQ,MAAM,UAAU;CAChC,MAAM,KAAK,IAAI;CACf,QAAQ,MAAM;EACZ,MAAM,QAAoB,EAAE;EAC5B,MAAM,QAAQ,EAAE;EAChB,MAAM,MAAM,EAAE;EACd,IAAI,IAAI;EACR,IAAI,QAAQ;EACZ,OAAO,QAAQ,OAAO,IAAI,KAAK;GAE7B,MAAM,IAAI,IAAI,IAAI,MAAM,MAAM,IAAI,MAAO,MAAM,IAAI,OAAO,IAAK;GAC/D,IAAI,IAAI,OAAQ,IAAI,QAAQ,OAAO,OAAO,IAAI,KAAK,CAAC,MAAM,SAAU,OAAO;GAC3E,IAAI,IAAI,MAAM,KAAK;QACd;IACH,MAAM,KAAK,OAAO,OAAO,GAAG,GAAG;IAC/B,IAAI,KAAK,KAAK,KAAK,EAAE,MAAM,QAAQ;IACnC,KAAK,MAAM,EAAE;GACf;GACA;EACF;EACA,IAAI,QAAQ,KAAK,OAAO,OAAO,GAAG,CAAC;EACnC,EAAE,MAAM;EACR,OAAO,OAAO,KAAK,OAAO,OAAO,CAAC,IAAI,KAAA;CACxC;AACF;AAcA,MAAM,cAAc,MAAiB,QAAmC;CACtE,IAAI,SAAS,MAAM,QAAQ,WAAW,QAAQ,UAC5C,OAAO;EACL,OAAO;EACP,MAAM;EACN,QACE,QAAQ,WACH,OAAmB,GAAG,QAAS,IAAI,IAAI,MAAM,MAAM,KAAM,MAAM,IAAI,MAAM,IAAK,SAC9E,OAAmB,GAAG,QAAS,IAAI,IAAI,MAAO,MAAM,MAAM,IAAK,MAAM,IAAI,KAAK;CACvF;CAIF,OAAO;EACL,OAAO;EACP,MAAM,UAAU,GAAG;EACnB,QAAQ,SAAS,KAAK,OAAe,GAAG,SAAS,MAAM,WAAW,CAAC,KAAK,OAAmB,GAAG,SAAS,MAAM;CAC/G;AACF;AAEA,MAAM,UAAU,GAAe,QAA6B;CAC1D,EAAE,MAAM;CACR,EAAE,OAAO;CACT,OAAO;AACT;;AAGA,MAAM,iBAAiB,KAAa,UAAyB;CAC3D,MAAM,MAAM,IAAI;CAChB,IAAI,QAAQ,GAAG,aAAa;CAC5B,IAAI,QAAQ,GAAG;EACb,MAAM,KAAK,IAAI,WAAW,CAAC;EAC3B,QAAQ,MAAM;GACZ,MAAM,MAAM,EAAE;GACd,IAAI,MAAM,EAAE,OAAQ,EAAE,MAAiB,WAAW,GAAG,MAAM,IAAI;IAC7D,EAAE,MAAM,MAAM;IACd,OAAO;GACT;GACA,OAAO,KAAK,CAAC;EACf;CACF;CACA,QAAQ,MAAM;EACZ,MAAM,MAAM,EAAE;EACd,IAAI,EAAE,MAAM,OAAO,OAAQ,EAAE,MAAiB,WAAW,KAAK,GAAG,GAAG;GAClE,EAAE,MAAM,MAAM;GACd,OAAO;EACT;EACA,OAAO,KAAK,CAAC;CACf;AACF;;;AAIA,IAAM,aAAN,MAAiB;CACf,IAAsC,CAAC;CACvC,WAAuC,KAAA;CACvC,IAAI,KAAc,OAAsB;EACtC,IAAI,KAAK,aAAa,KAAA,KAAa,WAAW,GAAG,GAAG,KAAK,EAAE,OAAO;OAC7D,KAAK,WAAW,SAAS,KAAK,GAAG,KAAK,UAAU,KAAK,KAAK;CACjE;CACA,SAAiB;EACf,IAAI,KAAK,aAAa,KAAA,GAAW,aAAa,KAAK,GAAG,KAAK,QAAQ;EACnE,OAAO,KAAK;CACd;AACF;AASA,MAAa,yBAAyB,MAAiB,YAAY,UAA2B;CAC5F,MAAM,WAAW,IAAI,SAAS,MAAM,SAAS;CAC7C,OAAO;EACL,UAAU,GAAG,SAAS,SAAS,QAAQ,GAAG,IAAI;EAC9C,OAAO,GAAG,MAAM,WAAW,SAAS,KAAK,GAAG,MAAM,MAAM;EACxD,QAAQ,SAAS;EACjB,WAAW,SAAS;CACtB;AACF;;AASA,MAAM,kBAAkB,MAAkB,MAAiB,YAAY,UAAwB;CAC7F,MAAM,WAAW,IAAI,SAAS,MAAM,SAAS;CAE7C,OAAO;EAAE,MADI,SAAS,QAAQ,MAAM,IACxB;EAAG,WAAW,SAAS;CAAU;AAC/C;;AAGA,MAAa,UAAmB,EAC9B,QAAQ,GAAG,MAAM,cACf,OAAO,MACL,OAAO,UAAU,eAAe,GAAG,MAAM,SAAS,CAAC,GACnD;CACE,YAAY,EAAE,WAAW,YAAY;EAAE,SAAS;EAAoB;EAAM;EAAW,OAAO,KAAA;CAAU;CACtG,YAAY,WAAW;EAAE,SAAS,KAAA;EAAW,MAAM,KAAA;EAAW,WAAW,CAAC;EAAG;CAAM;AACrF,CACF,EACJ"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ParserLike } from "../node.js";
|
|
2
|
-
//#region src/internal/compiler/entries.d.ts
|
|
3
2
|
/** A sequence that yields an entry: its parsers, and which of them produce the key and the value. */
|
|
4
3
|
export interface EntryPair {
|
|
5
4
|
readonly parsers: ReadonlyArray<ParserLike>;
|
|
@@ -15,5 +14,4 @@ export declare const pairOf: (p: ParserLike) => EntryPair | undefined;
|
|
|
15
14
|
* diagnostics.
|
|
16
15
|
*/
|
|
17
16
|
export declare const buildsEntries: (p: ParserLike) => boolean;
|
|
18
|
-
//#endregion
|
|
19
17
|
//# sourceMappingURL=entries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entries.d.ts","names":[],"sources":["../../../src/internal/compiler/entries.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"entries.d.ts","names":[],"sources":["../../../src/internal/compiler/entries.ts"],"mappings":";;iBASiB;WACN,SAAS,cAAc;WACvB;WACA;;;qBAIE,SAAU,GAAG,eAAa;;;;;;;qBA2B1B,gBAAiB,GAAG"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as Predicate from "effect/Predicate";
|
|
2
2
|
import { nodeOf } from "../node.js";
|
|
3
|
-
|
|
3
|
+
// src/internal/compiler/entries.ts
|
|
4
4
|
/**
|
|
5
5
|
* The shapes of `map(p, Object.fromEntries)` that the compilers build
|
|
6
6
|
* directly (see `internal/entries.ts`).
|
|
@@ -9,7 +9,7 @@ import { nodeOf } from "../node.js";
|
|
|
9
9
|
const pairOf = (p) => {
|
|
10
10
|
let node = nodeOf(p);
|
|
11
11
|
while (isDiagnostic(node)) node = nodeOf(node.self);
|
|
12
|
-
if (node
|
|
12
|
+
if (!Predicate.isTagged(node, "Seq")) return void 0;
|
|
13
13
|
const output = node.output;
|
|
14
14
|
if (output === "tuple") return node.parsers.length === 2 ? {
|
|
15
15
|
parsers: node.parsers,
|
|
@@ -23,7 +23,7 @@ const pairOf = (p) => {
|
|
|
23
23
|
value: output[1]
|
|
24
24
|
};
|
|
25
25
|
};
|
|
26
|
-
const isDiagnostic = (node) => node
|
|
26
|
+
const isDiagnostic = (node) => Predicate.isTagged(node, "Context") || Predicate.isTagged(node, "Expected") || Predicate.isTagged(node, "MapError") || Predicate.isTagged(node, "OrFail") || Predicate.isTagged(node, "Trace") || Predicate.isTagged(node, "Syntax") || Predicate.isTagged(node, "RetryAfter");
|
|
27
27
|
/**
|
|
28
28
|
* Whether `map(p, Object.fromEntries)` can build its object directly: `p`
|
|
29
29
|
* is a `repeat` or `separated` of a pair, possibly inside `cut`, the kept
|
|
@@ -32,11 +32,10 @@ const isDiagnostic = (node) => node._tag === "Context" || node._tag === "Expecte
|
|
|
32
32
|
*/
|
|
33
33
|
const buildsEntries = (p) => {
|
|
34
34
|
const node = nodeOf(p);
|
|
35
|
-
if (isDiagnostic(node) || node
|
|
36
|
-
if (node
|
|
37
|
-
return (node
|
|
35
|
+
if (isDiagnostic(node) || Predicate.isTagged(node, "Mode")) return buildsEntries(node.self);
|
|
36
|
+
if (Predicate.isTagged(node, "Seq")) return Predicate.isNumber(node.output) && buildsEntries(node.parsers[node.output]);
|
|
37
|
+
return (Predicate.isTagged(node, "Repeat") || Predicate.isTagged(node, "Separated")) && pairOf(node.self) !== void 0;
|
|
38
38
|
};
|
|
39
|
-
//#endregion
|
|
40
39
|
export { buildsEntries, pairOf };
|
|
41
40
|
|
|
42
41
|
//# sourceMappingURL=entries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entries.js","names":[],"sources":["../../../src/internal/compiler/entries.ts"],"sourcesContent":["/**\n * The shapes of `map(p, Object.fromEntries)` that the compilers build\n * directly (see `internal/entries.ts`).\n */\nimport * as Predicate from \"effect/Predicate\"\nimport type { Node, NodeOf, ParserLike } from \"../node.js\"\nimport { nodeOf } from \"../node.js\"\n\n/** A sequence that yields an entry: its parsers, and which of them produce the key and the value. */\nexport interface EntryPair {\n readonly parsers: ReadonlyArray<ParserLike>\n readonly key: number\n readonly value: number\n}\n\n/** A repeated pair for `Object.fromEntries`: the sequence and the indices of its key and value. */\nexport const pairOf = (p: ParserLike): EntryPair | undefined => {\n let node = nodeOf(p)\n while (isDiagnostic(node)) node = nodeOf(node.self)\n if (node
|
|
1
|
+
{"version":3,"file":"entries.js","names":[],"sources":["../../../src/internal/compiler/entries.ts"],"sourcesContent":["/**\n * The shapes of `map(p, Object.fromEntries)` that the compilers build\n * directly (see `internal/entries.ts`).\n */\nimport * as Predicate from \"effect/Predicate\"\nimport type { Node, NodeOf, ParserLike } from \"../node.js\"\nimport { nodeOf } from \"../node.js\"\n\n/** A sequence that yields an entry: its parsers, and which of them produce the key and the value. */\nexport interface EntryPair {\n readonly parsers: ReadonlyArray<ParserLike>\n readonly key: number\n readonly value: number\n}\n\n/** A repeated pair for `Object.fromEntries`: the sequence and the indices of its key and value. */\nexport const pairOf = (p: ParserLike): EntryPair | undefined => {\n let node = nodeOf(p)\n while (isDiagnostic(node)) node = nodeOf(node.self)\n if (!Predicate.isTagged(node, \"Seq\")) return undefined\n const output = node.output\n if (output === \"tuple\") return node.parsers.length === 2 ? { parsers: node.parsers, key: 0, value: 1 } : undefined\n if (Predicate.isNumber(output) || output[0] === output[1]) return undefined\n return { parsers: node.parsers, key: output[0], value: output[1] }\n}\n\nconst isDiagnostic = (\n node: Node\n): node is NodeOf<\"Context\" | \"Expected\" | \"MapError\" | \"OrFail\" | \"Trace\" | \"Syntax\" | \"RetryAfter\"> =>\n Predicate.isTagged(node, \"Context\") ||\n Predicate.isTagged(node, \"Expected\") ||\n Predicate.isTagged(node, \"MapError\") ||\n Predicate.isTagged(node, \"OrFail\") ||\n Predicate.isTagged(node, \"Trace\") ||\n Predicate.isTagged(node, \"Syntax\") ||\n Predicate.isTagged(node, \"RetryAfter\")\n\n/**\n * Whether `map(p, Object.fromEntries)` can build its object directly: `p`\n * is a `repeat` or `separated` of a pair, possibly inside `cut`, the kept\n * element of a sequence (`preceded`, `terminated`, `delimited`) and\n * diagnostics.\n */\nexport const buildsEntries = (p: ParserLike): boolean => {\n const node = nodeOf(p)\n if (isDiagnostic(node) || Predicate.isTagged(node, \"Mode\")) return buildsEntries(node.self)\n if (Predicate.isTagged(node, \"Seq\"))\n return Predicate.isNumber(node.output) && buildsEntries(node.parsers[node.output])\n return (\n (Predicate.isTagged(node, \"Repeat\") || Predicate.isTagged(node, \"Separated\")) && pairOf(node.self) !== undefined\n )\n}\n"],"mappings":";;;;;;;;AAgBA,MAAa,UAAU,MAAyC;CAC9D,IAAI,OAAO,OAAO,CAAC;CACnB,OAAO,aAAa,IAAI,GAAG,OAAO,OAAO,KAAK,IAAI;CAClD,IAAI,CAAC,UAAU,SAAS,MAAM,KAAK,GAAG,OAAO,KAAA;CAC7C,MAAM,SAAS,KAAK;CACpB,IAAI,WAAW,SAAS,OAAO,KAAK,QAAQ,WAAW,IAAI;EAAE,SAAS,KAAK;EAAS,KAAK;EAAG,OAAO;CAAE,IAAI,KAAA;CACzG,IAAI,UAAU,SAAS,MAAM,KAAK,OAAO,OAAO,OAAO,IAAI,OAAO,KAAA;CAClE,OAAO;EAAE,SAAS,KAAK;EAAS,KAAK,OAAO;EAAI,OAAO,OAAO;CAAG;AACnE;AAEA,MAAM,gBACJ,SAEA,UAAU,SAAS,MAAM,SAAS,KAClC,UAAU,SAAS,MAAM,UAAU,KACnC,UAAU,SAAS,MAAM,UAAU,KACnC,UAAU,SAAS,MAAM,QAAQ,KACjC,UAAU,SAAS,MAAM,OAAO,KAChC,UAAU,SAAS,MAAM,QAAQ,KACjC,UAAU,SAAS,MAAM,YAAY;;;;;;;AAQvC,MAAa,iBAAiB,MAA2B;CACvD,MAAM,OAAO,OAAO,CAAC;CACrB,IAAI,aAAa,IAAI,KAAK,UAAU,SAAS,MAAM,MAAM,GAAG,OAAO,cAAc,KAAK,IAAI;CAC1F,IAAI,UAAU,SAAS,MAAM,KAAK,GAChC,OAAO,UAAU,SAAS,KAAK,MAAM,KAAK,cAAc,KAAK,QAAQ,KAAK,OAAO;CACnF,QACG,UAAU,SAAS,MAAM,QAAQ,KAAK,UAAU,SAAS,MAAM,WAAW,MAAM,OAAO,KAAK,IAAI,MAAM,KAAA;AAE3G"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ParserLike } from "../node.js";
|
|
2
|
-
//#region src/internal/compiler/first.d.ts
|
|
3
2
|
export declare const Strict = 0;
|
|
4
3
|
export interface First {
|
|
5
4
|
readonly mode: 0 | 1 | 2;
|
|
@@ -29,5 +28,4 @@ export interface AltPlan {
|
|
|
29
28
|
readonly lists: ReadonlyArray<ReadonlyArray<number>>;
|
|
30
29
|
}
|
|
31
30
|
export declare const planAlt: (firsts: ReadonlyArray<First>) => AltPlan | undefined;
|
|
32
|
-
//#endregion
|
|
33
31
|
//# sourceMappingURL=first.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"first.d.ts","names":[],"sources":["../../../src/internal/compiler/first.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"first.d.ts","names":[],"sources":["../../../src/internal/compiler/first.ts"],"mappings":";qBA0Ba;iBAII;WACN;WACA,OAAO;WACP;;qBAgCE;WAEU;mBADJ;EACI,YAAA;EAErB,GAAG,GAAG,aAAa;;UAUX;UAcA;UAgHA;;;;;;;iBAiBO;;WAEN,QAAQ;WACR;WACA;WACA,OAAO,cAAc;;qBAGnB,UAAW,QAAQ,cAAc,WAAS"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as Predicate from "effect/Predicate";
|
|
2
|
-
import { fastLimit } from "../text.js";
|
|
2
|
+
import { fastLimit, isEmptyUnits } from "../text.js";
|
|
3
|
+
import * as Arr from "effect/Array";
|
|
3
4
|
import { nodeOf } from "../node.js";
|
|
4
5
|
import { TableSize, kindOfEncoding, reachesAbove, textSet, tokenSet } from "./sets.js";
|
|
5
|
-
|
|
6
|
+
// src/internal/compiler/first.ts
|
|
6
7
|
/**
|
|
7
8
|
* First sets: which input units can start a match of a parser.
|
|
8
9
|
*
|
|
@@ -125,12 +126,12 @@ var FirstSets = class {
|
|
|
125
126
|
const lit = node.literal;
|
|
126
127
|
if (node.encoding !== void 0) {
|
|
127
128
|
if (kindOfEncoding(node.encoding) !== kind) return unknown;
|
|
128
|
-
if (node.caseless) return lit
|
|
129
|
+
if (node.caseless) return isEmptyUnits(lit) ? unknown : anyUnit;
|
|
129
130
|
const encoded = node.encoding.encode(lit);
|
|
130
|
-
if (encoded
|
|
131
|
+
if (isEmptyUnits(encoded)) return emptyOptional;
|
|
131
132
|
return ofUnits([Predicate.isString(encoded) ? encoded.charCodeAt(0) : encoded[0]]);
|
|
132
133
|
}
|
|
133
|
-
if (lit
|
|
134
|
+
if (isEmptyUnits(lit)) return emptyOptional;
|
|
134
135
|
let first;
|
|
135
136
|
if (Predicate.isString(lit)) first = kind === 0 ? lit.charCodeAt(0) : new TextEncoder().encode(lit)[0];
|
|
136
137
|
else if (lit instanceof Uint8Array && kind === 1) first = lit[0];
|
|
@@ -144,8 +145,8 @@ var FirstSets = class {
|
|
|
144
145
|
case "OneOf":
|
|
145
146
|
case "TakeWhile": {
|
|
146
147
|
if (node.encoding !== void 0 && kindOfEncoding(node.encoding) !== kind) return unknown;
|
|
147
|
-
const min = node
|
|
148
|
-
if (node
|
|
148
|
+
const min = Predicate.isTagged(node, "OneOf") ? 1 : node.min;
|
|
149
|
+
if (Predicate.isTagged(node, "TakeWhile") && node.max === 0) return emptyOptional;
|
|
149
150
|
const mode = min > 0 ? 0 : Optional;
|
|
150
151
|
if (node.negate) return mode === 0 ? anyUnit : withMode(anyUnit, Optional);
|
|
151
152
|
const set = node.encoding === void 0 ? tokenSet(node.set, kind) : textSet(node.set);
|
|
@@ -173,7 +174,7 @@ var FirstSets = class {
|
|
|
173
174
|
case "FlatMap":
|
|
174
175
|
case "SeparatedFold":
|
|
175
176
|
case "Dispatch": {
|
|
176
|
-
const f = this.of(node
|
|
177
|
+
const f = this.of(Predicate.isTagged(node, "Dispatch") ? node.selector : node.self);
|
|
177
178
|
return f.mode === 0 ? f : unknown;
|
|
178
179
|
}
|
|
179
180
|
case "Mode": {
|
|
@@ -189,7 +190,7 @@ var FirstSets = class {
|
|
|
189
190
|
case "Struct": return this.sequence(node.parsers);
|
|
190
191
|
case "ZipWith": return this.sequence([node.self, node.that]);
|
|
191
192
|
case "Alt": {
|
|
192
|
-
if (node.parsers
|
|
193
|
+
if (Arr.isReadonlyArrayEmpty(node.parsers)) return failing;
|
|
193
194
|
let acc;
|
|
194
195
|
let mode = 0;
|
|
195
196
|
for (const p of node.parsers) {
|
|
@@ -253,7 +254,6 @@ const planAlt = (firsts) => {
|
|
|
253
254
|
lists
|
|
254
255
|
};
|
|
255
256
|
};
|
|
256
|
-
//#endregion
|
|
257
257
|
export { FirstSets, Strict, planAlt };
|
|
258
258
|
|
|
259
259
|
//# sourceMappingURL=first.js.map
|