@depup/js-yaml 5.2.1-depup.9
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/LICENSE +21 -0
- package/README.md +31 -0
- package/bin/js-yaml.mjs +107 -0
- package/changes.json +10 -0
- package/dist/browser/js-yaml.esm.min.mjs +2209 -0
- package/dist/browser/js-yaml.esm.min.mjs.map +1 -0
- package/dist/browser/js-yaml.umd.min.js +33 -0
- package/dist/browser/js-yaml.umd.min.js.map +1 -0
- package/dist/js-yaml.cjs.js +3242 -0
- package/dist/js-yaml.cjs.js.map +1 -0
- package/dist/js-yaml.d.ts +382 -0
- package/dist/js-yaml.mjs +3136 -0
- package/dist/js-yaml.mjs.map +1 -0
- package/package.json +111 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js-yaml.umd.min.js","names":[],"sources":["../../src/tag.ts","../../src/tag/scalar/str.ts","../../src/tag/scalar/null_core.ts","../../src/tag/scalar/null_json.ts","../../src/tag/scalar/null_yaml11.ts","../../src/tag/scalar/bool_core.ts","../../src/tag/scalar/bool_json.ts","../../src/tag/scalar/bool_yaml11.ts","../../src/tag/scalar/int_core.ts","../../src/tag/scalar/int_json.ts","../../src/tag/scalar/int_yaml11.ts","../../src/tag/scalar/float_core.ts","../../src/tag/scalar/float_json.ts","../../src/tag/scalar/float_yaml11.ts","../../src/tag/scalar/merge.ts","../../src/tag/scalar/binary.ts","../../src/tag/scalar/timestamp.ts","../../src/tag/sequence/seq.ts","../../src/common/object.ts","../../src/tag/sequence/omap.ts","../../src/tag/sequence/pairs.ts","../../src/tag/mapping/map.ts","../../src/tag/mapping/set.ts","../../src/schema.ts","../../src/tag/mapping/real_map.ts","../../src/tag/mapping/legacy_map.ts","../../src/common/snippet.ts","../../src/common/exception.ts","../../src/parser/events.ts","../../src/parser/parser_scalar.ts","../../src/common/tagname.ts","../../src/parser/constructor.ts","../../src/parser/parser.ts","../../src/load.ts","../../src/ast/nodes.ts","../../src/ast/from_js.ts","../../src/ast/visit.ts","../../src/ast/presenter.ts","../../src/dump.ts","../../src/ast/from_events.ts"],"sourcesContent":["const NOT_RESOLVED: unique symbol = Symbol('NOT_RESOLVED')\nconst MERGE_KEY: unique symbol = Symbol('MERGE_KEY')\n\ntype ScalarRepresent = (data: any) => string\ntype SequenceRepresent = (data: any) => ArrayLike<unknown>\ntype MappingRepresent = (data: any) => Map<unknown, unknown>\n\ntype IdentifyFn = (data: any) => boolean\ntype RepresentTagNameFn = (data: any) => string\n\ninterface ScalarTagDefinition<Result = unknown> {\n tagName: string\n nodeKind: 'scalar'\n implicit: boolean\n matchByTagPrefix: boolean\n // Set of `source.charAt(0)` keys for which `resolve` may succeed (a superset of\n // what it really matches). A key is either a single character or '' (empty\n // source). `null` means \"no constraint, always try\". Used by the composer to\n // dispatch implicit scalars by first character without running every resolver.\n implicitFirstChars: readonly string[] | null\n // `isExplicit` is true for an explicit tag (`!!tag`), false for implicit plain\n // scalar resolution.\n resolve: (source: string, isExplicit: boolean, tagName: string) => Result | typeof NOT_RESOLVED\n identify: IdentifyFn | null\n // A scalar's printed form is text, so `represent` always yields a string. The\n // factory supplies a `String(data)` default when a tag omits it.\n represent: ScalarRepresent\n representTagName: RepresentTagNameFn | null\n}\n\ninterface SequenceTagDefinition<Carrier = unknown, Result = Carrier> {\n tagName: string\n nodeKind: 'sequence'\n implicit: false\n matchByTagPrefix: boolean\n create: (tagName: string) => Carrier\n addItem: (carrier: Carrier, item: unknown, index: number) => void | string\n finalize: (carrier: Carrier) => Result\n carrierIsResult: boolean\n identify: IdentifyFn | null\n represent: SequenceRepresent\n representTagName: RepresentTagNameFn | null\n}\n\ninterface MappingTagDefinition<Carrier = unknown, Result = Carrier> {\n tagName: string\n nodeKind: 'mapping'\n implicit: false\n matchByTagPrefix: boolean\n create: (tagName: string) => Carrier\n // Writes a pair. Returns '' on success, a non-empty error message otherwise\n // (key does not fit the representation, value rejected, ...). Always a string\n // so the hot path never allocates an exception wrapper.\n addPair: (carrier: Carrier, key: unknown, value: unknown) => string\n // Read side, mirrors `Map` — defining a representation means defining how to\n // read it back. `has` is the hot dedup probe (membership without fetching the\n // value); `keys`/`get` are used only on the cold merge path (`<<`).\n has: (carrier: Carrier, key: unknown) => boolean\n keys: (result: Result) => Iterable<unknown>\n get: (result: Result, key: unknown) => unknown\n finalize: (carrier: Carrier) => Result\n carrierIsResult: boolean\n identify: IdentifyFn | null\n represent: MappingRepresent\n representTagName: RepresentTagNameFn | null\n}\n\ntype TagDefinition =\n | ScalarTagDefinition<any>\n | SequenceTagDefinition<any, any>\n | MappingTagDefinition<any, any>\n\ninterface ScalarTagOptions<Result> {\n implicit?: boolean\n matchByTagPrefix?: boolean\n implicitFirstChars?: readonly string[] | null\n resolve: ScalarTagDefinition<Result>['resolve']\n identify?: ScalarTagDefinition<Result>['identify']\n represent?: ScalarTagDefinition<Result>['represent']\n representTagName?: ScalarTagDefinition<Result>['representTagName']\n}\n\ntype RepresentOptions<Container, Canonical, Represent> =\n | {\n identify?: null\n represent?: Represent\n representTagName?: RepresentTagNameFn | null\n }\n | (Container extends Canonical\n ? {\n identify?: IdentifyFn | null\n represent?: Represent\n representTagName?: RepresentTagNameFn | null\n }\n : {\n identify: IdentifyFn\n represent: Represent\n representTagName?: RepresentTagNameFn | null\n })\n\ntype SequenceTagOptions<Carrier, Result = Carrier> = {\n matchByTagPrefix?: boolean\n create: SequenceTagDefinition<Carrier, Result>['create']\n addItem: SequenceTagDefinition<Carrier, Result>['addItem']\n finalize?: SequenceTagDefinition<Carrier, Result>['finalize']\n} & RepresentOptions<Result, ArrayLike<unknown>, SequenceRepresent>\n\ntype MappingTagOptions<Carrier, Result = Carrier> = {\n matchByTagPrefix?: boolean\n create: MappingTagDefinition<Carrier, Result>['create']\n addPair: MappingTagDefinition<Carrier, Result>['addPair']\n has: MappingTagDefinition<Carrier, Result>['has']\n keys: MappingTagDefinition<Carrier, Result>['keys']\n get: MappingTagDefinition<Carrier, Result>['get']\n finalize?: MappingTagDefinition<Carrier, Result>['finalize']\n} & RepresentOptions<Result, Map<unknown, unknown>, MappingRepresent>\n\nfunction defineScalarTag<Result> (tagName: string, options: ScalarTagOptions<Result>): ScalarTagDefinition<Result> {\n return {\n tagName,\n nodeKind: 'scalar',\n implicit: options.implicit ?? false,\n matchByTagPrefix: options.matchByTagPrefix ?? false,\n implicitFirstChars: options.implicitFirstChars ?? null,\n resolve: options.resolve,\n identify: options.identify ?? null,\n represent: options.represent ?? (data => String(data)),\n representTagName: options.representTagName ?? null\n }\n}\n\nfunction defineSequenceTag<Carrier, Result = Carrier> (tagName: string, options: SequenceTagOptions<Carrier, Result>): SequenceTagDefinition<Carrier, Result> {\n const carrierIsResult = options.finalize === undefined\n\n return {\n tagName,\n nodeKind: 'sequence',\n implicit: false,\n matchByTagPrefix: options.matchByTagPrefix ?? false,\n create: options.create,\n addItem: options.addItem,\n finalize: options.finalize ?? (carrier => carrier as unknown as Result),\n carrierIsResult,\n identify: options.identify ?? null,\n represent: options.represent ?? (data => data as ArrayLike<unknown>),\n representTagName: options.representTagName ?? null\n }\n}\n\nfunction defineMappingTag<Carrier, Result = Carrier> (tagName: string, options: MappingTagOptions<Carrier, Result>): MappingTagDefinition<Carrier, Result> {\n const carrierIsResult = options.finalize === undefined\n\n return {\n tagName,\n nodeKind: 'mapping',\n implicit: false,\n matchByTagPrefix: options.matchByTagPrefix ?? false,\n create: options.create,\n addPair: options.addPair,\n has: options.has,\n keys: options.keys,\n get: options.get,\n finalize: options.finalize ?? (carrier => carrier as unknown as Result),\n carrierIsResult,\n identify: options.identify ?? null,\n represent: options.represent ?? (data => data as Map<unknown, unknown>),\n representTagName: options.representTagName ?? null\n }\n}\n\nexport {\n NOT_RESOLVED,\n MERGE_KEY,\n defineScalarTag,\n defineSequenceTag,\n defineMappingTag,\n\n type ScalarTagDefinition,\n type SequenceTagDefinition,\n type MappingTagDefinition,\n type TagDefinition,\n type ScalarTagOptions,\n type SequenceTagOptions,\n type MappingTagOptions,\n type ScalarRepresent,\n type SequenceRepresent,\n type MappingRepresent\n}\n","import { defineScalarTag } from '../../tag.ts'\n\nconst strTag = defineScalarTag('tag:yaml.org,2002:str', {\n resolve: (source) => source,\n identify: (data) => typeof data === 'string'\n})\n\nexport { strTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst NULL_VALUES = ['', '~', 'null', 'Null', 'NULL']\n\nconst nullCoreTag = defineScalarTag('tag:yaml.org,2002:null', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: '' (empty), '~', 'null'/'Null'/'NULL'.\n implicitFirstChars: ['', '~', 'n', 'N'],\n resolve: (source) => {\n if (NULL_VALUES.indexOf(source) !== -1) return null\n\n return NOT_RESOLVED\n },\n identify: (object) => object === null,\n represent: () => 'null'\n})\n\nexport { nullCoreTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst nullJsonTag = defineScalarTag('tag:yaml.org,2002:null', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: null.\n implicitFirstChars: ['n'],\n resolve: (source, isExplicit) => {\n if (source === 'null' || (isExplicit && source === '')) return null\n\n return NOT_RESOLVED\n },\n identify: (object) => object === null,\n represent: () => 'null'\n})\n\nexport { nullJsonTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst NULL_VALUES = ['', '~', 'null', 'Null', 'NULL']\n\nconst nullYaml11Tag = defineScalarTag('tag:yaml.org,2002:null', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: '' (empty), '~', 'null'/'Null'/'NULL'.\n implicitFirstChars: ['', '~', 'n', 'N'],\n resolve: (source) => {\n if (NULL_VALUES.indexOf(source) !== -1) return null\n\n return NOT_RESOLVED\n },\n identify: (object) => object === null,\n represent: () => 'null'\n})\n\nexport { nullYaml11Tag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst TRUE_VALUES = ['true', 'True', 'TRUE']\nconst FALSE_VALUES = ['false', 'False', 'FALSE']\n\nconst boolCoreTag = defineScalarTag('tag:yaml.org,2002:bool', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: true/True/TRUE, false/False/FALSE.\n implicitFirstChars: ['t', 'T', 'f', 'F'],\n resolve: (source) => {\n if (TRUE_VALUES.indexOf(source) !== -1) return true\n if (FALSE_VALUES.indexOf(source) !== -1) return false\n\n return NOT_RESOLVED\n },\n identify: (object) => Object.prototype.toString.call(object) === '[object Boolean]',\n represent: (object) => object ? 'true' : 'false'\n})\n\nexport { boolCoreTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst TRUE_VALUES = ['true']\nconst FALSE_VALUES = ['false']\n\nconst boolJsonTag = defineScalarTag('tag:yaml.org,2002:bool', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: true, false.\n implicitFirstChars: ['t', 'f'],\n resolve: (source) => {\n if (TRUE_VALUES.indexOf(source) !== -1) return true\n if (FALSE_VALUES.indexOf(source) !== -1) return false\n\n return NOT_RESOLVED\n },\n identify: (object) => Object.prototype.toString.call(object) === '[object Boolean]',\n represent: (object) => object ? 'true' : 'false'\n})\n\nexport { boolJsonTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst TRUE_VALUES = ['true', 'True', 'TRUE', 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON']\nconst FALSE_VALUES = ['false', 'False', 'FALSE', 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF']\n\nconst boolYaml11Tag = defineScalarTag('tag:yaml.org,2002:bool', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs.\n implicitFirstChars: ['y', 'Y', 'n', 'N', 't', 'T', 'f', 'F', 'o', 'O'],\n resolve: (source) => {\n if (TRUE_VALUES.indexOf(source) !== -1) return true\n if (FALSE_VALUES.indexOf(source) !== -1) return false\n\n return NOT_RESOLVED\n },\n identify: (object) => Object.prototype.toString.call(object) === '[object Boolean]',\n represent: (object) => object ? 'true' : 'false'\n})\n\nexport { boolYaml11Tag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\n// YAML 1.2 Core schema implicit resolution:\n// [-+]? [0-9]+ | 0o [0-7]+ | 0x [0-9a-fA-F]+\nconst YAML_INTEGER_IMPLICIT_PATTERN = new RegExp(\n // 0o123\n '^(?:0o[0-7]+' +\n // 0x1A\n '|0x[0-9a-fA-F]+' +\n // 12345\n '|[-+]?[0-9]+)$')\n\n// Explicit `!!int` validation is separate from Core implicit resolution.\nconst YAML_INTEGER_EXPLICIT_PATTERN = new RegExp(\n // 0b1010\n '^(?:[-+]?0b[0-1]+' +\n // 0o123\n '|[-+]?0o[0-7]+' +\n // 0x1A\n '|[-+]?0x[0-9a-fA-F]+' +\n // 12345\n '|[-+]?[0-9]+)$')\n\nfunction parseYamlInteger (source: string) {\n let value = source\n let sign = 1\n\n if (value[0] === '-' || value[0] === '+') {\n if (value[0] === '-') sign = -1\n value = value.slice(1)\n }\n\n if (value.startsWith('0b')) return sign * parseInt(value.slice(2), 2)\n if (value.startsWith('0o')) return sign * parseInt(value.slice(2), 8)\n if (value.startsWith('0x')) return sign * parseInt(value.slice(2), 16)\n\n return sign * parseInt(value, 10)\n}\n\nfunction resolveYamlInteger (source: string, isExplicit: boolean) {\n if (isExplicit) {\n if (!YAML_INTEGER_EXPLICIT_PATTERN.test(source)) return NOT_RESOLVED\n } else if (!YAML_INTEGER_IMPLICIT_PATTERN.test(source)) {\n return NOT_RESOLVED\n }\n\n const result = parseYamlInteger(source)\n return Number.isFinite(result) ? result : NOT_RESOLVED\n}\n\nconst intCoreTag = defineScalarTag('tag:yaml.org,2002:int', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: optional sign + decimal digit.\n implicitFirstChars: ['-', '+', ...'0123456789'],\n resolve: resolveYamlInteger,\n identify: (object) =>\n // No ancient boxed numbers support\n Number.isInteger(object) &&\n // Negative zero => !!float\n !Object.is(object, -0) &&\n // Exponential form => !!float, round-trip for !!int 1e21 will be broken\n object.toString(10).indexOf('e') < 0,\n represent: (object: number) => object.toString(10)\n})\n\nexport { intCoreTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\n// YAML 1.2 JSON schema implicit resolution:\n// -? ( 0 | [1-9] [0-9]* )\nconst YAML_INTEGER_IMPLICIT_PATTERN = new RegExp(\n '^-?(?:0|[1-9][0-9]*)$')\n\n// Explicit `!!int` validation is separate from JSON implicit resolution.\nconst YAML_INTEGER_EXPLICIT_PATTERN = new RegExp(\n // 0b1010\n '^(?:[-+]?0b[0-1]+' +\n // 0o123\n '|[-+]?0o[0-7]+' +\n // 0x1A\n '|[-+]?0x[0-9a-fA-F]+' +\n // 12345\n '|[-+]?[0-9]+)$')\n\nfunction parseYamlInteger (source: string) {\n let value = source\n let sign = 1\n\n if (value[0] === '-' || value[0] === '+') {\n if (value[0] === '-') sign = -1\n value = value.slice(1)\n }\n\n if (value.startsWith('0b')) return sign * parseInt(value.slice(2), 2)\n if (value.startsWith('0o')) return sign * parseInt(value.slice(2), 8)\n if (value.startsWith('0x')) return sign * parseInt(value.slice(2), 16)\n\n return sign * parseInt(value, 10)\n}\n\nfunction resolveYamlInteger (source: string, isExplicit: boolean) {\n if (isExplicit) {\n if (!YAML_INTEGER_EXPLICIT_PATTERN.test(source)) return NOT_RESOLVED\n } else if (!YAML_INTEGER_IMPLICIT_PATTERN.test(source)) {\n return NOT_RESOLVED\n }\n\n const result = parseYamlInteger(source)\n return Number.isFinite(result) ? result : NOT_RESOLVED\n}\n\nconst intJsonTag = defineScalarTag('tag:yaml.org,2002:int', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: optional '-' or digit.\n implicitFirstChars: ['-', ...'0123456789'],\n resolve: resolveYamlInteger,\n identify: (object) =>\n // No ancient boxed numbers support\n Number.isInteger(object) &&\n // Negative zero => !!float\n !Object.is(object, -0) &&\n // Exponential form => !!float, round-trip for !!int 1e21 will be broken\n object.toString(10).indexOf('e') < 0,\n represent: (object: number) => object.toString(10)\n})\n\nexport { intJsonTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst YAML_INTEGER_PATTERN = new RegExp(\n // 0b1010\n '^(?:[-+]?0b[0-1_]+' +\n // 0123\n '|[-+]?0[0-7_]+' +\n // 0x1A\n '|[-+]?0x[0-9a-fA-F_]+' +\n // 1:23\n '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+' +\n // 12345\n '|[-+]?(?:0|[1-9][0-9_]*))$')\n\nfunction parseYamlInteger (source: string) {\n let value = source.replace(/_/g, '')\n let sign = 1\n\n if (value[0] === '-' || value[0] === '+') {\n if (value[0] === '-') sign = -1\n value = value.slice(1)\n }\n\n if (value.startsWith('0b')) return sign * parseInt(value.slice(2), 2)\n if (value.startsWith('0x')) return sign * parseInt(value.slice(2), 16)\n\n if (value.includes(':')) {\n let result = 0\n for (const part of value.split(':')) result = result * 60 + Number(part)\n return sign * result\n }\n\n if (value !== '0' && value[0] === '0') return sign * parseInt(value, 8)\n\n return sign * parseInt(value, 10)\n}\n\nfunction resolveYamlInteger (source: string) {\n if (!YAML_INTEGER_PATTERN.test(source)) return NOT_RESOLVED\n\n const result = parseYamlInteger(source)\n return Number.isFinite(result) ? result : NOT_RESOLVED\n}\n\nconst intYaml11Tag = defineScalarTag('tag:yaml.org,2002:int', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: optional sign + decimal digit.\n implicitFirstChars: ['-', '+', ...'0123456789'],\n resolve: resolveYamlInteger,\n identify: (object) =>\n // No ancient boxed numbers support\n Number.isInteger(object) &&\n // Negative zero => !!float\n !Object.is(object, -0) &&\n // Exponential form => !!float, round-trip for !!int 1e21 will be broken\n object.toString(10).indexOf('e') < 0,\n represent: (object: number) => object.toString(10)\n})\n\nexport { intYaml11Tag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?[0-9]+(?:\\\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n '|[-+]?\\\\.[0-9]+(?:[eE][-+]?[0-9]+)?' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$')\n\nconst YAML_FLOAT_SPECIAL_PATTERN = new RegExp(\n '^(?:' +\n // .inf\n '[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$')\n\nfunction resolveYamlFloat (source: string) {\n if (!YAML_FLOAT_PATTERN.test(source)) return NOT_RESOLVED\n\n let value = source.toLowerCase()\n const sign = value[0] === '-' ? -1 : 1\n\n if ('+-'.includes(value[0])) value = value.slice(1)\n\n if (value === '.inf') return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY\n if (value === '.nan') return NaN\n\n const result = sign * parseFloat(value)\n\n if (Number.isFinite(result) || YAML_FLOAT_SPECIAL_PATTERN.test(source)) return result\n return NOT_RESOLVED\n}\n\nfunction representYamlFloat (object: number) {\n if (isNaN(object)) return '.nan'\n if (object === Number.POSITIVE_INFINITY) return '.inf'\n if (object === Number.NEGATIVE_INFINITY) return '-.inf'\n if (Object.is(object, -0)) return '-0.0'\n\n const result = object.toString(10)\n return /^[-+]?[0-9]+e/.test(result) ? result.replace('e', '.e') : result\n}\n\nconst floatCoreTag = defineScalarTag('tag:yaml.org,2002:float', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: optional sign, '.', or digit\n // ('.inf'/'.nan' start with '.').\n implicitFirstChars: ['-', '+', '.', ...'0123456789'],\n resolve: resolveYamlFloat,\n identify: (object) =>\n // No ancient boxed numbers support\n typeof object === 'number' &&\n (\n // We land here all numbers, not handled (declined) by !!int `.identify`\n // The same condition as for !!int, but reversed.\n\n // Filter out integers...\n !Number.isInteger(object) ||\n // but allow negative zero\n Object.is(object, -0) ||\n // and integers with exponential form\n object.toString(10).indexOf('e') >= 0\n ),\n represent: representYamlFloat\n})\n\nexport { floatCoreTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\n// YAML 1.2 JSON schema implicit resolution:\n// -? ( 0 | [1-9] [0-9]* ) ( \\. [0-9]* )? ( [eE] [-+]? [0-9]+ )?\nconst YAML_FLOAT_IMPLICIT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^-?(?:0|[1-9][0-9]*)(?:\\\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$')\n\n// Explicit `!!float` validation is separate from JSON implicit resolution.\nconst YAML_FLOAT_EXPLICIT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?[0-9]+(?:\\\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n '|[-+]?\\\\.[0-9]+(?:[eE][-+]?[0-9]+)?' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$')\n\nfunction resolveYamlFloat (source: string, isExplicit: boolean) {\n if (isExplicit) {\n if (!YAML_FLOAT_EXPLICIT_PATTERN.test(source)) return NOT_RESOLVED\n\n let value = source.toLowerCase()\n const sign = value[0] === '-' ? -1 : 1\n\n if ('+-'.includes(value[0])) value = value.slice(1)\n\n if (value === '.inf') return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY\n if (value === '.nan') return NaN\n\n const result = sign * parseFloat(value)\n return Number.isFinite(result) ? result : NOT_RESOLVED\n }\n\n if (!YAML_FLOAT_IMPLICIT_PATTERN.test(source)) return NOT_RESOLVED\n\n const result = Number(source)\n\n if (Number.isFinite(result)) return result\n return NOT_RESOLVED\n}\n\nfunction representYamlFloat (object: number) {\n if (isNaN(object)) return '.nan'\n if (object === Number.POSITIVE_INFINITY) return '.inf'\n if (object === Number.NEGATIVE_INFINITY) return '-.inf'\n if (Object.is(object, -0)) return '-0.0'\n\n const result = object.toString(10)\n return /^[-+]?[0-9]+e/.test(result) ? result.replace('e', '.e') : result\n}\n\nconst floatJsonTag = defineScalarTag('tag:yaml.org,2002:float', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: optional '-' or digit.\n implicitFirstChars: ['-', ...'0123456789'],\n resolve: resolveYamlFloat,\n identify: (object) =>\n // No ancient boxed numbers support\n typeof object === 'number' &&\n (\n // We land here all numbers, not handled (declined) by !!int `.identify`\n // The same condition as for !!int, but reversed.\n\n // Filter out integers...\n !Number.isInteger(object) ||\n // but allow negative zero\n Object.is(object, -0) ||\n // and integers with exponential form\n object.toString(10).indexOf('e') >= 0\n ),\n represent: representYamlFloat\n})\n\nexport { floatJsonTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:(?:[0-9][0-9_]*)?\\\\.[0-9_]*)(?:[eE][-+][0-9]+)?' +\n // 190:20:30.15\n '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$')\n\nconst YAML_FLOAT_SPECIAL_PATTERN = new RegExp(\n '^(?:' +\n // .inf\n '[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$')\n\nfunction resolveYamlFloat (source: string) {\n if (!YAML_FLOAT_PATTERN.test(source)) return NOT_RESOLVED\n\n let value = source.toLowerCase().replace(/_/g, '')\n const sign = value[0] === '-' ? -1 : 1\n\n if ('+-'.includes(value[0])) value = value.slice(1)\n\n if (value === '.inf') return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY\n if (value === '.nan') return NaN\n\n let result = 0\n\n if (value.includes(':')) {\n for (const part of value.split(':')) result = result * 60 + Number(part)\n result *= sign\n } else {\n result = sign * parseFloat(value)\n }\n\n if (Number.isFinite(result) || YAML_FLOAT_SPECIAL_PATTERN.test(source)) return result\n return NOT_RESOLVED\n}\n\nfunction representYamlFloat (object: number) {\n if (isNaN(object)) return '.nan'\n if (object === Number.POSITIVE_INFINITY) return '.inf'\n if (object === Number.NEGATIVE_INFINITY) return '-.inf'\n if (Object.is(object, -0)) return '-0.0'\n\n const result = object.toString(10)\n return /^[-+]?[0-9]+e/.test(result) ? result.replace('e', '.e') : result\n}\n\nconst floatYaml11Tag = defineScalarTag('tag:yaml.org,2002:float', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: optional sign, '.', or digit\n // ('.inf'/'.nan' start with '.').\n implicitFirstChars: ['-', '+', '.', ...'0123456789'],\n resolve: resolveYamlFloat,\n identify: (object) =>\n // No ancient boxed numbers support\n typeof object === 'number' &&\n (\n // We land here all numbers, not handled (declined) by !!int `.identify`\n // The same condition as for !!int, but reversed.\n\n // Filter out integers...\n !Number.isInteger(object) ||\n // but allow negative zero\n Object.is(object, -0) ||\n // and integers with exponential form\n object.toString(10).indexOf('e') >= 0\n ),\n represent: representYamlFloat\n})\n\nexport { floatYaml11Tag }\n","import { defineScalarTag, MERGE_KEY, NOT_RESOLVED } from '../../tag.ts'\n\nconst mergeTag = defineScalarTag('tag:yaml.org,2002:merge', {\n implicit: true,\n // source.charAt(0) over matched implicit inputs: '<' ('<<').\n implicitFirstChars: ['<'],\n resolve: (source, isExplicit) => {\n if (source === '<<' || (isExplicit && source === '')) return MERGE_KEY\n return NOT_RESOLVED\n }\n})\n\nexport { mergeTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst BASE64_PATTERN = /^[A-Za-z0-9+/]*={0,2}$/\n\nfunction resolveYamlBinary (source: string) {\n // Strip allowed whitespace first, so validation stays a plain base64 check.\n const input = source.replace(/\\s/g, '')\n if (input.length % 4 !== 0 || !BASE64_PATTERN.test(input)) return NOT_RESOLVED\n\n const binary = atob(input)\n const result = new Uint8Array(binary.length)\n for (let index = 0; index < binary.length; index++) {\n result[index] = binary.charCodeAt(index)\n }\n return result\n}\n\nfunction representYamlBinary (object: Uint8Array) {\n let binary = ''\n for (let index = 0; index < object.length; index++) {\n binary += String.fromCharCode(object[index])\n }\n return btoa(binary)\n}\n\nconst binaryTag = defineScalarTag('tag:yaml.org,2002:binary', {\n resolve: resolveYamlBinary,\n identify: (object) => Object.prototype.toString.call(object) === '[object Uint8Array]',\n represent: representYamlBinary\n})\n\nexport { binaryTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst YAML_DATE_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$')\n\nconst YAML_TIMESTAMP_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' +\n '-([0-9][0-9]?)' +\n '-([0-9][0-9]?)' +\n '(?:[Tt]|[ \\\\t]+)' +\n '([0-9][0-9]?)' +\n ':([0-9][0-9])' +\n ':([0-9][0-9])' +\n '(?:\\\\.([0-9]*))?' +\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' +\n '(?::([0-9][0-9]))?))?$')\n\nfunction resolveYamlTimestamp (source: string) {\n let match = YAML_DATE_REGEXP.exec(source)\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(source)\n if (match === null) return NOT_RESOLVED\n\n const year = +(match[1])\n const month = +(match[2]) - 1\n const day = +(match[3])\n\n // Date-only form (`YYYY-MM-DD`) has no time captures.\n if (!match[4]) {\n const date = new Date(Date.UTC(year, month, day))\n // Reject dates that JS would normalize, e.g. 2023-02-29 -> 2023-03-01.\n if (date.getUTCFullYear() !== year || date.getUTCMonth() !== month || date.getUTCDate() !== day) {\n return NOT_RESOLVED\n }\n return date\n }\n\n const hour = +(match[4])\n const minute = +(match[5])\n const second = +(match[6])\n let fraction = 0\n\n // Reject times that JS would normalize into the next minute/hour/day.\n if (hour > 23 || minute > 59 || second > 59) return NOT_RESOLVED\n\n if (match[7]) {\n let value = match[7].slice(0, 3)\n while (value.length < 3) value += '0'\n fraction = +value\n }\n\n const date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction))\n\n // Reject invalid calendar dates before applying timezone offset.\n if (date.getUTCFullYear() !== year || date.getUTCMonth() !== month || date.getUTCDate() !== day) {\n return NOT_RESOLVED\n }\n\n if (match[9]) {\n const offsetHour = +(match[10])\n const offsetMinute = +(match[11] || 0)\n // Reject timezone offsets that JS date arithmetic would otherwise accept.\n if (offsetHour > 23 || offsetMinute > 59) return NOT_RESOLVED\n\n const offset = (offsetHour * 60 + offsetMinute) * 60000\n date.setTime(date.getTime() - (match[9] === '-' ? -offset : offset))\n }\n\n return date\n}\n\nconst timestampTag = defineScalarTag('tag:yaml.org,2002:timestamp', {\n implicit: true,\n // Both patterns start with a 4-digit year, so source.charAt(0) is always a digit.\n implicitFirstChars: [...'0123456789'],\n resolve: resolveYamlTimestamp,\n identify: (object) => object instanceof Date,\n represent: (object: Date) => object.toISOString()\n})\n\nexport { timestampTag }\n","import { defineSequenceTag } from '../../tag.ts'\n\nconst seqTag = defineSequenceTag('tag:yaml.org,2002:seq', {\n create: () => [] as unknown[],\n addItem: (container, item) => {\n container.push(item)\n },\n identify: Array.isArray\n})\n\nexport { seqTag }\n","function isPlainObject (data: unknown): boolean {\n if (data === null || typeof data !== 'object' || Array.isArray(data)) return false\n const prototype = Object.getPrototypeOf(data)\n return prototype === null || prototype === Object.prototype\n}\n\n// Project `object` onto `keys`. Absent keys are skipped (so the result can be\n// safely spread over defaults without clobbering them with `undefined`), hence\n// the `Partial` return.\nfunction pick<T extends object, K extends keyof T> (object: T, keys: readonly K[]): Partial<Pick<T, K>> {\n const result: Partial<Pick<T, K>> = {}\n for (const key of keys) {\n if (object[key] !== undefined) result[key] = object[key]\n }\n return result\n}\n\nexport {\n isPlainObject,\n pick\n}\n","import { defineSequenceTag } from '../../tag.ts'\nimport { isPlainObject } from '../../common/object.ts'\n\ninterface OmapCarrier {\n list: unknown[]\n seen: Set<unknown>\n}\n\nconst omapTag = defineSequenceTag('tag:yaml.org,2002:omap', {\n create: (): OmapCarrier => ({ list: [], seen: new Set() }),\n addItem: (carrier, item) => {\n let key: unknown\n\n if (item instanceof Map) {\n if (item.size !== 1) return 'cannot resolve an ordered map item'\n key = item.keys().next().value\n } else if (isPlainObject(item)) {\n const itemKeys = Object.keys(item as Record<string, unknown>)\n if (itemKeys.length !== 1) return 'cannot resolve an ordered map item'\n key = itemKeys[0]\n } else {\n return 'cannot resolve an ordered map item'\n }\n\n if (carrier.seen.has(key)) return 'duplicate key in ordered map'\n carrier.seen.add(key)\n carrier.list.push(item)\n return ''\n },\n finalize: (carrier): unknown[] => carrier.list\n})\n\nexport { omapTag }\n","import { defineSequenceTag } from '../../tag.ts'\n\ntype Pair = [unknown, unknown]\n\nconst pairsTag = defineSequenceTag('tag:yaml.org,2002:pairs', {\n create: () => [] as Pair[],\n addItem: (container, item) => {\n if (item instanceof Map) {\n if (item.size !== 1) return 'cannot resolve a pairs item'\n\n container.push(item.entries().next().value!)\n return ''\n }\n\n if (Object.prototype.toString.call(item) !== '[object Object]') {\n return 'cannot resolve a pairs item'\n }\n\n const object = item as Record<string, unknown>\n const keys = Object.keys(object)\n\n if (keys.length !== 1) return 'cannot resolve a pairs item'\n\n container.push([keys[0], object[keys[0]]] satisfies Pair)\n return ''\n }\n})\n\nexport { pairsTag }\n","import { defineMappingTag } from '../../tag.ts'\nimport { isPlainObject } from '../../common/object.ts'\n\ntype StringMapping = Record<string, unknown>\n\nconst mapTag = defineMappingTag('tag:yaml.org,2002:map', {\n create: (): StringMapping => ({}),\n identify: isPlainObject,\n // Dump side: wrap the plain object into the canonical `Map` form the writer\n // walks. Shallow — keys/values stay references to the originals.\n represent: (o: StringMapping) => {\n const map = new Map<string, unknown>()\n for (const key of Object.keys(o)) map.set(key, o[key])\n return map\n },\n addPair: (container, key, value) => {\n if (key !== null && typeof key === 'object') {\n return 'object-based map does not support complex keys'\n }\n const normalizedKey = String(key)\n if (normalizedKey === '__proto__') {\n // Define as an own data property so a literal `__proto__` key stays data\n // and never invokes the prototype setter.\n Object.defineProperty(container, normalizedKey, {\n value, enumerable: true, configurable: true, writable: true\n })\n } else {\n container[normalizedKey] = value\n }\n return ''\n },\n // hasOwn, not `in`: a plain object inherits `toString` and friends.\n has: (container, key) => {\n if (key !== null && typeof key === 'object') return false\n return Object.prototype.hasOwnProperty.call(container, String(key))\n },\n keys: (container) => Object.keys(container),\n get: (container, key) => container[String(key)]\n})\n\nexport { mapTag, isPlainObject, type StringMapping }\n","import { defineMappingTag } from '../../tag.ts'\n\nconst setTag = defineMappingTag('tag:yaml.org,2002:set', {\n create: () => new Set<unknown>(),\n identify: (data) => data instanceof Set,\n represent: (data: Set<unknown>) => {\n const map = new Map<unknown, null>()\n for (const key of data) map.set(key, null)\n return map\n },\n addPair: (container, key, value) => {\n if (value !== null) return 'cannot resolve a set item'\n container.add(key)\n return ''\n },\n has: (container, key) => container.has(key),\n keys: (container) => container.keys(),\n get: () => null\n})\n\nexport { setTag }\n","import {\n type MappingTagDefinition,\n type ScalarTagDefinition,\n type SequenceTagDefinition,\n type TagDefinition\n} from './tag.ts'\nimport { strTag } from './tag/scalar/str.ts'\nimport { nullCoreTag } from './tag/scalar/null_core.ts'\nimport { nullJsonTag } from './tag/scalar/null_json.ts'\nimport { nullYaml11Tag } from './tag/scalar/null_yaml11.ts'\nimport { boolCoreTag } from './tag/scalar/bool_core.ts'\nimport { boolJsonTag } from './tag/scalar/bool_json.ts'\nimport { boolYaml11Tag } from './tag/scalar/bool_yaml11.ts'\nimport { intCoreTag } from './tag/scalar/int_core.ts'\nimport { intJsonTag } from './tag/scalar/int_json.ts'\nimport { intYaml11Tag } from './tag/scalar/int_yaml11.ts'\nimport { floatCoreTag } from './tag/scalar/float_core.ts'\nimport { floatJsonTag } from './tag/scalar/float_json.ts'\nimport { floatYaml11Tag } from './tag/scalar/float_yaml11.ts'\nimport { mergeTag } from './tag/scalar/merge.ts'\nimport { binaryTag } from './tag/scalar/binary.ts'\nimport { timestampTag } from './tag/scalar/timestamp.ts'\nimport { seqTag } from './tag/sequence/seq.ts'\nimport { omapTag } from './tag/sequence/omap.ts'\nimport { pairsTag } from './tag/sequence/pairs.ts'\nimport { mapTag } from './tag/mapping/map.ts'\nimport { setTag } from './tag/mapping/set.ts'\n\ninterface TagDefinitionMap {\n scalar: Record<string, ScalarTagDefinition>\n sequence: Record<string, SequenceTagDefinition>\n mapping: Record<string, MappingTagDefinition>\n}\n\ninterface TagDefinitionListMap {\n scalar: ScalarTagDefinition[]\n sequence: SequenceTagDefinition[]\n mapping: MappingTagDefinition[]\n}\n\nfunction createTagDefinitionMap (): TagDefinitionMap {\n return {\n scalar: {},\n sequence: {},\n mapping: {}\n }\n}\n\nfunction createTagDefinitionListMap (): TagDefinitionListMap {\n return {\n scalar: [],\n sequence: [],\n mapping: []\n }\n}\n\nfunction compileTags (tags: readonly TagDefinition[]) {\n const result: TagDefinition[] = []\n\n for (const tag of tags) {\n let index = result.length\n\n for (let previousIndex = 0; previousIndex < result.length; previousIndex++) {\n const previous = result[previousIndex]\n\n if (previous.nodeKind === tag.nodeKind &&\n previous.tagName === tag.tagName &&\n previous.matchByTagPrefix === tag.matchByTagPrefix) {\n index = previousIndex\n break\n }\n }\n\n result[index] = tag\n }\n\n return result\n}\n\nclass Schema {\n readonly tags: readonly TagDefinition[]\n readonly implicitScalarTags: readonly ScalarTagDefinition[]\n // Dispatch implicit scalar resolvers by `source.charAt(0)`. Each bucket holds the\n // resolvers that may match that key, in schema order; a key absent from the map\n // uses `implicitScalarAnyFirstChar` (resolvers that declared no first-char\n // constraint, so they apply to any first character).\n readonly implicitScalarByFirstChar: ReadonlyMap<string, readonly ScalarTagDefinition[]>\n readonly implicitScalarAnyFirstChar: readonly ScalarTagDefinition[]\n // The default scalar tag (`!!str`), resolved once so the composer's fallback for\n // unresolved plain scalars avoids a keyed lookup per scalar.\n readonly defaultScalarTag: ScalarTagDefinition\n // The default container tags (`!!seq` / `!!map`), used by the dumper: when a\n // value is identified by its default tag, the tag is implicit and not printed.\n // Undefined if the schema does not define them (then such values can't be dumped).\n readonly defaultSequenceTag: SequenceTagDefinition | undefined\n readonly defaultMappingTag: MappingTagDefinition | undefined\n readonly exact: TagDefinitionMap\n readonly prefix: TagDefinitionListMap\n\n constructor (tags: readonly TagDefinition[]) {\n const compiledTags = compileTags(tags)\n const implicitScalarTags: ScalarTagDefinition[] = []\n const exact = createTagDefinitionMap()\n const prefix = createTagDefinitionListMap()\n\n for (const tag of compiledTags) {\n if (tag.nodeKind === 'scalar' && tag.implicit) {\n if (tag.matchByTagPrefix) {\n throw new Error('Implicit scalar tags cannot match by tag prefix')\n }\n\n implicitScalarTags.push(tag)\n }\n\n switch (tag.nodeKind) {\n case 'scalar':\n if (tag.matchByTagPrefix) prefix.scalar.push(tag)\n else exact.scalar[tag.tagName] = tag\n break\n case 'sequence':\n if (tag.matchByTagPrefix) prefix.sequence.push(tag)\n else exact.sequence[tag.tagName] = tag\n break\n case 'mapping':\n if (tag.matchByTagPrefix) prefix.mapping.push(tag)\n else exact.mapping[tag.tagName] = tag\n break\n }\n }\n\n const implicitScalarAnyFirstChar = implicitScalarTags.filter(tag => tag.implicitFirstChars === null)\n\n const keys = new Set<string>()\n for (const tag of implicitScalarTags) {\n if (tag.implicitFirstChars !== null) {\n for (const key of tag.implicitFirstChars) keys.add(key)\n }\n }\n\n const implicitScalarByFirstChar = new Map<string, ScalarTagDefinition[]>()\n for (const key of keys) {\n implicitScalarByFirstChar.set(key, implicitScalarTags.filter(tag =>\n tag.implicitFirstChars === null || tag.implicitFirstChars.indexOf(key) !== -1))\n }\n\n const defaultScalarTag = exact.scalar['tag:yaml.org,2002:str']\n if (!defaultScalarTag) throw new Error('schema does not define the default scalar tag (tag:yaml.org,2002:str)')\n\n this.tags = compiledTags\n this.implicitScalarTags = implicitScalarTags\n this.implicitScalarByFirstChar = implicitScalarByFirstChar\n this.implicitScalarAnyFirstChar = implicitScalarAnyFirstChar\n this.defaultScalarTag = defaultScalarTag\n this.defaultSequenceTag = exact.sequence['tag:yaml.org,2002:seq']\n this.defaultMappingTag = exact.mapping['tag:yaml.org,2002:map']\n this.exact = exact\n this.prefix = prefix\n }\n\n withTags (...tags: Array<TagDefinition | readonly TagDefinition[]>): Schema {\n let flatTags: TagDefinition[] = []\n for (const tag of tags) flatTags = flatTags.concat(tag)\n\n return new Schema([...this.tags, ...flatTags])\n }\n}\n\nconst FAILSAFE_SCHEMA = new Schema([\n strTag,\n seqTag,\n mapTag\n])\n\nconst JSON_SCHEMA = new Schema([\n ...FAILSAFE_SCHEMA.tags,\n nullJsonTag,\n boolJsonTag,\n intJsonTag,\n floatJsonTag\n])\n\nconst CORE_SCHEMA = new Schema([\n ...FAILSAFE_SCHEMA.tags,\n nullCoreTag,\n boolCoreTag,\n intCoreTag,\n floatCoreTag\n])\n\nconst YAML11_SCHEMA = new Schema([\n ...FAILSAFE_SCHEMA.tags,\n nullYaml11Tag,\n boolYaml11Tag,\n intYaml11Tag,\n floatYaml11Tag,\n timestampTag,\n mergeTag,\n binaryTag,\n omapTag,\n pairsTag,\n setTag\n])\n\nexport {\n Schema,\n FAILSAFE_SCHEMA,\n JSON_SCHEMA,\n CORE_SCHEMA,\n YAML11_SCHEMA,\n\n type TagDefinitionMap,\n type TagDefinitionListMap\n}\n","import { defineMappingTag } from '../../tag.ts'\nimport { isPlainObject } from '../../common/object.ts'\n\ntype RealMapping = Map<unknown, unknown>\n\n// A mapping represented as a real `Map`: keys keep their constructed type,\n// nothing is stringified. Drop-in replacement for the default `!!map` tag\n// (same tag name) — `CORE_SCHEMA.withTags(realMapTag)`.\nconst realMapTag = defineMappingTag('tag:yaml.org,2002:map', {\n create: () => new Map<unknown, unknown>(),\n addPair: (container: RealMapping, key, value) => {\n container.set(key, value)\n return ''\n },\n has: (container: RealMapping, key) => container.has(key),\n keys: (container: RealMapping) => container.keys(),\n get: (container: RealMapping, key) => container.get(key),\n // Dump side: handle both a real `Map` and a plain object, so this tag fully\n // replaces the default map representation when dumping too.\n identify: (data) => data instanceof Map || isPlainObject(data),\n // Dump side: the canonical mapping form is a `Map`. A real `Map` passes\n // through untouched (keys keep their type); a plain object is wrapped\n // shallowly. Lossless — nothing is stringified.\n represent: (data) => {\n if (data instanceof Map) return data\n const map = new Map<unknown, unknown>()\n const obj = data as Record<string, unknown>\n for (const key of Object.keys(obj)) map.set(key, obj[key])\n return map\n }\n})\n\nexport { realMapTag }\n","import { defineMappingTag } from '../../tag.ts'\nimport { isPlainObject } from '../../common/object.ts'\n\ntype StringMapping = Record<string, unknown>\n\n// Coerce a constructed key into the string identity a `{}` representation uses.\n// Returns null for a nested array key (an array element that is itself an\n// array), which would otherwise blow up exponentially when stringified via\n// aliases.\nfunction normalizeKey (key: unknown): string | null {\n if (Array.isArray(key)) {\n const array = Array.prototype.slice.call(key) as unknown[]\n\n for (let index = 0; index < array.length; index++) {\n if (Array.isArray(array[index])) return null\n\n if (typeof array[index] === 'object' &&\n Object.prototype.toString.call(array[index]) === '[object Object]') {\n array[index] = '[object Object]'\n }\n }\n\n return String(array)\n }\n\n if (typeof key === 'object' &&\n Object.prototype.toString.call(key) === '[object Object]') {\n return '[object Object]'\n }\n\n return String(key)\n}\n\nconst legacyMapTag = defineMappingTag('tag:yaml.org,2002:map', {\n create: (): StringMapping => ({}),\n identify: isPlainObject,\n // Dump side: wrap the plain object into the canonical `Map` form the writer\n // walks. Shallow — keys/values stay references to the originals.\n represent: (o: StringMapping) => {\n const map = new Map<string, unknown>()\n for (const key of Object.keys(o)) map.set(key, o[key])\n return map\n },\n addPair: (container, key, value) => {\n const normalizedKey = normalizeKey(key)\n if (normalizedKey === null) return 'nested arrays are not supported inside keys'\n if (normalizedKey === '__proto__') {\n // Define as an own data property so a literal `__proto__` key stays data\n // and never invokes the prototype setter.\n Object.defineProperty(container, normalizedKey, {\n value, enumerable: true, configurable: true, writable: true\n })\n } else {\n container[normalizedKey] = value\n }\n return ''\n },\n // hasOwn, not `in`: a plain object inherits `toString` and friends.\n has: (container, key) => {\n const normalizedKey = normalizeKey(key)\n return normalizedKey !== null && Object.prototype.hasOwnProperty.call(container, normalizedKey)\n },\n keys: (container) => Object.keys(container),\n get: (container, key) => container[String(key)]\n})\n\nexport { legacyMapTag, isPlainObject, type StringMapping }\n","export interface SnippetMark {\n name?: string | null\n buffer: string\n position: number\n line: number\n column: number\n snippet?: string | null\n}\n\ninterface SnippetOptions {\n maxLength?: number\n indent?: number\n linesBefore?: number\n linesAfter?: number\n}\n\nconst DEFAULT_SNIPPET_OPTIONS: Required<SnippetOptions> = {\n maxLength: 79,\n indent: 1,\n linesBefore: 3,\n linesAfter: 2\n}\n\n// get snippet for a single line, respecting maxLength\nfunction getLine (buffer: string, lineStart: number, lineEnd: number, position: number, maxLineLength: number) {\n let head = ''\n let tail = ''\n const maxHalfLength = Math.floor(maxLineLength / 2) - 1\n\n if (position - lineStart > maxHalfLength) {\n head = ' ... '\n lineStart = position - maxHalfLength + head.length\n }\n\n if (lineEnd - position > maxHalfLength) {\n tail = ' ...'\n lineEnd = position + maxHalfLength - tail.length\n }\n\n return {\n str: head + buffer.slice(lineStart, lineEnd).replace(/\\t/g, '→') + tail,\n pos: position - lineStart + head.length // relative position\n }\n}\n\nfunction padStart (string: string, max: number) {\n // max() protects from negativa value, to avoid exception.\n return ' '.repeat(Math.max(max - string.length, 0)) + string\n}\n\nfunction makeSnippet (mark: SnippetMark, options?: SnippetOptions) {\n if (!mark.buffer) return null\n\n const opts = { ...DEFAULT_SNIPPET_OPTIONS, ...options }\n\n const re = /\\r?\\n|\\r|\\0/g\n const lineStarts = [0]\n const lineEnds: number[] = []\n let match: RegExpExecArray | null\n let foundLineNo = -1\n\n while ((match = re.exec(mark.buffer))) {\n lineEnds.push(match.index)\n lineStarts.push(match.index + match[0].length)\n\n if (mark.position <= match.index && foundLineNo < 0) {\n foundLineNo = lineStarts.length - 2\n }\n }\n\n if (foundLineNo < 0) foundLineNo = lineStarts.length - 1\n\n let result = ''\n const lineNoLength = Math.min(mark.line + opts.linesAfter, lineEnds.length).toString().length\n const maxLineLength = opts.maxLength - (opts.indent + lineNoLength + 3)\n\n for (let i = 1; i <= opts.linesBefore; i++) {\n if (foundLineNo - i < 0) break\n const line = getLine(\n mark.buffer,\n lineStarts[foundLineNo - i],\n lineEnds[foundLineNo - i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),\n maxLineLength\n )\n result = `${' '.repeat(opts.indent)}${padStart((mark.line - i + 1).toString(), lineNoLength)} | ${line.str}\\n${result}`\n }\n\n const line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength)\n result += `${' '.repeat(opts.indent)}${padStart((mark.line + 1).toString(), lineNoLength)} | ${line.str}\\n`\n result += `${'-'.repeat(opts.indent + lineNoLength + 3 + line.pos)}^\\n`\n\n for (let i = 1; i <= opts.linesAfter; i++) {\n if (foundLineNo + i >= lineEnds.length) break\n const line = getLine(\n mark.buffer,\n lineStarts[foundLineNo + i],\n lineEnds[foundLineNo + i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),\n maxLineLength\n )\n result += `${' '.repeat(opts.indent)}${padStart((mark.line + i + 1).toString(), lineNoLength)} | ${line.str}\\n`\n }\n\n return result.replace(/\\n$/, '')\n}\n\nexport default makeSnippet\n","import makeSnippet, { type SnippetMark } from './snippet.ts'\n\n// YAML error class. http://stackoverflow.com/questions/8458984\n//\nfunction formatError (exception: YAMLException, compact?: boolean) {\n let where = ''\n\n if (!exception.mark) return exception.reason\n\n if (exception.mark.name) {\n where += `in \"${exception.mark.name}\" `\n }\n\n where += `(${exception.mark.line + 1}:${exception.mark.column + 1})`\n\n if (!compact && exception.mark.snippet) {\n where += `\\n\\n${exception.mark.snippet}`\n }\n\n return `${exception.reason} ${where}`\n}\n\nclass YAMLException extends Error {\n reason: string\n mark?: SnippetMark\n\n constructor (reason: string, mark?: SnippetMark) {\n super()\n\n this.name = 'YAMLException'\n this.reason = reason\n this.mark = mark\n this.message = formatError(this, false)\n\n // Guard for ancient browsers\n if (Error.captureStackTrace) {\n // Include stack trace in error object,\n Error.captureStackTrace(this, this.constructor)\n }\n }\n\n toString (compact?: boolean) {\n return `${this.name}: ${formatError(this, compact)}`\n }\n}\n\n// Build a YAMLException with a source snippet and throw it. `source` is the\n// raw input text (no parser sentinel); `position` is an offset into it.\nfunction throwErrorAt (source: string, position: number, message: string, filename = ''): never {\n let line = 0\n let lineStart = 0\n\n for (let index = 0; index < position; index++) {\n const ch = source.charCodeAt(index)\n\n if (ch === 0x0A/* LF */) {\n line++\n lineStart = index + 1\n } else if (ch === 0x0D/* CR */) {\n line++\n if (source.charCodeAt(index + 1) === 0x0A/* LF */) index++\n lineStart = index + 1\n }\n }\n\n const mark: SnippetMark = {\n name: filename,\n buffer: source,\n position,\n line,\n column: position - lineStart\n }\n\n mark.snippet = makeSnippet(mark)\n throw new YAMLException(message, mark)\n}\n\nexport { YAMLException, throwErrorAt }\n","const EVENT_DOCUMENT = 1\nconst EVENT_SEQUENCE = 2\nconst EVENT_MAPPING = 3\nconst EVENT_SCALAR = 4\nconst EVENT_ALIAS = 5\nconst EVENT_POP = 6\n\ntype EventType =\n typeof EVENT_DOCUMENT | typeof EVENT_SEQUENCE | typeof EVENT_MAPPING |\n typeof EVENT_SCALAR | typeof EVENT_ALIAS | typeof EVENT_POP\n\nconst SCALAR_STYLE_PLAIN = 1\nconst SCALAR_STYLE_SINGLE_QUOTED = 2\nconst SCALAR_STYLE_DOUBLE_QUOTED = 3\nconst SCALAR_STYLE_LITERAL_BLOCK = 4\nconst SCALAR_STYLE_FOLDED_BLOCK = 5\n\ntype ScalarStyle =\n typeof SCALAR_STYLE_PLAIN | typeof SCALAR_STYLE_SINGLE_QUOTED |\n typeof SCALAR_STYLE_DOUBLE_QUOTED | typeof SCALAR_STYLE_LITERAL_BLOCK |\n typeof SCALAR_STYLE_FOLDED_BLOCK\n\nconst COLLECTION_STYLE_BLOCK = 1\nconst COLLECTION_STYLE_FLOW = 2\n\ntype CollectionStyle =\n typeof COLLECTION_STYLE_BLOCK | typeof COLLECTION_STYLE_FLOW\n\nconst CHOMPING_CLIP = 1\nconst CHOMPING_STRIP = 2\nconst CHOMPING_KEEP = 3\n\ntype Chomping =\n typeof CHOMPING_CLIP | typeof CHOMPING_STRIP | typeof CHOMPING_KEEP\n\ntype DocumentDirective =\n { kind: 'yaml', version: string } |\n { kind: 'tag', handle: string, prefix: string }\n\ntype TagHandlers = Record<string, string>\n\ninterface DocumentEvent {\n type: typeof EVENT_DOCUMENT\n explicitStart: boolean\n explicitEnd: boolean\n directives: DocumentDirective[]\n}\n\ninterface SequenceEvent {\n type: typeof EVENT_SEQUENCE\n start: number\n anchorStart: number\n anchorEnd: number\n tagStart: number\n tagEnd: number\n style: CollectionStyle\n}\n\ninterface MappingEvent {\n type: typeof EVENT_MAPPING\n start: number\n anchorStart: number\n anchorEnd: number\n tagStart: number\n tagEnd: number\n style: CollectionStyle\n}\n\ninterface ScalarEvent {\n type: typeof EVENT_SCALAR\n valueStart: number\n valueEnd: number\n anchorStart: number\n anchorEnd: number\n tagStart: number\n tagEnd: number\n style: ScalarStyle\n chomping: Chomping\n indent: number\n fast: boolean\n}\n\ninterface AliasEvent {\n type: typeof EVENT_ALIAS\n anchorStart: number\n anchorEnd: number\n}\n\ninterface PopEvent {\n type: typeof EVENT_POP\n}\n\ntype Event =\n DocumentEvent |\n SequenceEvent |\n MappingEvent |\n ScalarEvent |\n AliasEvent |\n PopEvent\n\nexport {\n EVENT_DOCUMENT,\n EVENT_SEQUENCE,\n EVENT_MAPPING,\n EVENT_SCALAR,\n EVENT_ALIAS,\n EVENT_POP,\n\n SCALAR_STYLE_PLAIN,\n SCALAR_STYLE_SINGLE_QUOTED,\n SCALAR_STYLE_DOUBLE_QUOTED,\n SCALAR_STYLE_LITERAL_BLOCK,\n SCALAR_STYLE_FOLDED_BLOCK,\n\n COLLECTION_STYLE_BLOCK,\n COLLECTION_STYLE_FLOW,\n\n CHOMPING_CLIP,\n CHOMPING_STRIP,\n CHOMPING_KEEP,\n\n type EventType,\n type ScalarStyle,\n type CollectionStyle,\n\n type Chomping,\n type DocumentDirective,\n type TagHandlers,\n type DocumentEvent,\n type SequenceEvent,\n type MappingEvent,\n type ScalarEvent,\n type AliasEvent,\n type PopEvent,\n type Event\n}\n","import {\n SCALAR_STYLE_SINGLE_QUOTED,\n SCALAR_STYLE_DOUBLE_QUOTED,\n SCALAR_STYLE_LITERAL_BLOCK,\n SCALAR_STYLE_FOLDED_BLOCK,\n CHOMPING_STRIP,\n CHOMPING_KEEP,\n type ScalarEvent\n} from './events.ts'\n\nconst NO_RANGE = -1\n\n// --- character helpers (mirrors src/loader.ts, kept self-contained here) ---\n\nfunction simpleEscapeSequence (c: number) {\n switch (c) {\n case 0x30/* 0 */: return '\\x00'\n case 0x61/* a */: return '\\x07'\n case 0x62/* b */: return '\\x08'\n case 0x74/* t */: return '\\x09'\n case 0x09/* Tab */: return '\\x09'\n case 0x6E/* n */: return '\\x0A'\n case 0x76/* v */: return '\\x0B'\n case 0x66/* f */: return '\\x0C'\n case 0x72/* r */: return '\\x0D'\n case 0x65/* e */: return '\\x1B'\n case 0x20/* Space */: return ' '\n case 0x22/* \" */: return '\\x22'\n case 0x2F/* / */: return '/'\n case 0x5C/* \\ */: return '\\x5C'\n case 0x4E/* N */: return '\\x85'\n case 0x5F/* _ */: return '\\xA0'\n case 0x4C/* L */: return '\\u2028'\n case 0x50/* P */: return '\\u2029'\n default: return ''\n }\n}\n\nconst simpleEscapeCheck = new Array(256)\nconst simpleEscapeMap = new Array(256)\nfor (let i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0\n simpleEscapeMap[i] = simpleEscapeSequence(i)\n}\n\nfunction charFromCodepoint (c: number) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c)\n }\n return String.fromCharCode(\n ((c - 0x010000) >> 10) + 0xD800,\n ((c - 0x010000) & 0x03FF) + 0xDC00\n )\n}\n\nfunction fromHexCode (c: number) {\n if (c >= 0x30/* 0 */ && c <= 0x39/* 9 */) return c - 0x30\n const lc = c | 0x20\n // Double-quoted scalar ranges are validated by parser.ts before cooking.\n return lc - 0x61 + 10\n}\n\nfunction escapedHexLen (c: number) {\n if (c === 0x78/* x */) return 2\n if (c === 0x75/* u */) return 4\n // Double-quoted scalar ranges are validated by parser.ts before cooking.\n return 8\n}\n\n// --- line folding helpers ---\n\n// Skip a run of line breaks plus the leading whitespace of the following\n// lines, returning the number of line breaks consumed and the new position.\nfunction skipFoldedBreaks (input: string, position: number, end: number) {\n let breaks = 0\n\n while (position < end) {\n const ch = input.charCodeAt(position)\n\n if (ch === 0x0A/* LF */) {\n breaks++\n position++\n } else if (ch === 0x0D/* CR */) {\n breaks++\n position++\n if (input.charCodeAt(position) === 0x0A/* LF */) position++\n } else if (ch === 0x20/* Space */ || ch === 0x09/* Tab */) {\n position++\n } else {\n break\n }\n }\n\n return { position, breaks }\n}\n\n// Folding of line breaks between content chunks: a single break becomes a\n// space, several breaks become (count - 1) newlines.\nfunction foldedBreaks (count: number) {\n if (count === 1) return ' '\n // Called only after skipFoldedBreaks() consumed at least one line break.\n return '\\n'.repeat(count - 1)\n}\n\n// --- per-style extractors ---\n\nfunction getPlainValue (input: string, start: number, end: number) {\n let result = ''\n let position = start\n let captureStart = start\n let captureEnd = start\n\n while (position < end) {\n const ch = input.charCodeAt(position)\n\n if (ch === 0x0A/* LF */ || ch === 0x0D/* CR */) {\n result += input.slice(captureStart, captureEnd)\n const fold = skipFoldedBreaks(input, position, end)\n result += foldedBreaks(fold.breaks)\n position = captureStart = captureEnd = fold.position\n } else {\n position++\n if (ch !== 0x20/* Space */ && ch !== 0x09/* Tab */) captureEnd = position\n }\n }\n\n return result + input.slice(captureStart, captureEnd)\n}\n\nfunction getSingleQuotedValue (input: string, start: number, end: number) {\n let result = ''\n let position = start\n let captureStart = start\n let captureEnd = start\n\n while (position < end) {\n const ch = input.charCodeAt(position)\n\n if (ch === 0x27/* ' */) {\n // Within the stored range every quote is part of an escaped '' pair.\n result += input.slice(captureStart, position) + \"'\"\n position += 2\n captureStart = captureEnd = position\n } else if (ch === 0x0A/* LF */ || ch === 0x0D/* CR */) {\n result += input.slice(captureStart, captureEnd)\n const fold = skipFoldedBreaks(input, position, end)\n result += foldedBreaks(fold.breaks)\n position = captureStart = captureEnd = fold.position\n } else {\n position++\n if (ch !== 0x20/* Space */ && ch !== 0x09/* Tab */) captureEnd = position\n }\n }\n\n // Whitespace right before the closing quote is significant (it is only\n // stripped when followed by a line break).\n return result + input.slice(captureStart, end)\n}\n\nfunction getDoubleQuotedValue (input: string, start: number, end: number) {\n let result = ''\n let position = start\n let captureStart = start\n let captureEnd = start\n\n while (position < end) {\n const ch = input.charCodeAt(position)\n\n if (ch === 0x5C/* \\ */) {\n result += input.slice(captureStart, position)\n position++\n const escaped = input.charCodeAt(position)\n\n if (escaped === 0x0A/* LF */ || escaped === 0x0D/* CR */) {\n // Escaped line break: a line continuation that joins with nothing.\n position = skipFoldedBreaks(input, position, end).position\n } else if (escaped < 256 && simpleEscapeCheck[escaped]) {\n result += simpleEscapeMap[escaped]\n position++\n } else {\n // parser.ts has already rejected unknown escapes and invalid hex digits.\n let hexLength = escapedHexLen(escaped)\n let hexResult = 0\n\n for (; hexLength > 0; hexLength--) {\n position++\n const digit = fromHexCode(input.charCodeAt(position))\n hexResult = (hexResult << 4) + digit\n }\n\n result += charFromCodepoint(hexResult)\n position++\n }\n\n captureStart = captureEnd = position\n } else if (ch === 0x0A/* LF */ || ch === 0x0D/* CR */) {\n result += input.slice(captureStart, captureEnd)\n const fold = skipFoldedBreaks(input, position, end)\n result += foldedBreaks(fold.breaks)\n position = captureStart = captureEnd = fold.position\n } else {\n position++\n if (ch !== 0x20/* Space */ && ch !== 0x09/* Tab */) captureEnd = position\n }\n }\n\n return result + input.slice(captureStart, end)\n}\n\nfunction getBlockValue (\n input: string,\n start: number,\n end: number,\n indent: number,\n chomping: number,\n folded: boolean\n) {\n const textIndent = indent < 0 ? 0 : indent\n // The range starts at column 0 of the first line and includes every line\n // break, including those of trailing blank lines.\n const region = input.slice(start, end).replace(/\\r\\n?/g, '\\n')\n // An empty range is a block with no lines at all (e.g. an empty `|+`) and\n // must stay empty; a naive split would invent a phantom blank line. Otherwise\n // a trailing line break leaves a trailing '' from split() that is not a real\n // line (just the terminator of the last one), so drop it. Interior blank\n // lines are kept.\n const lines = region === ''\n ? []\n : (region.endsWith('\\n') ? region.slice(0, -1) : region).split('\\n')\n\n let result = ''\n let didReadContent = false\n let emptyLines = 0\n let atMoreIndented = false\n\n for (const line of lines) {\n // Whitespace beyond the content indentation is part of the content, so the\n // indentation scan stops at textIndent. A line is empty only when nothing\n // remains after the (capped) indentation.\n // indent < 0 means no content line was detected (a wholly blank block), so\n // every line is an empty line.\n let column = 0\n while (column < textIndent && line.charCodeAt(column) === 0x20/* Space */) column++\n\n if (indent < 0 || column >= line.length) {\n emptyLines++\n continue\n }\n\n const content = line.slice(textIndent)\n const first = content.charCodeAt(0)\n\n if (folded) {\n if (first === 0x20/* Space */ || first === 0x09/* Tab */) {\n // More-indented lines are not folded.\n atMoreIndented = true\n result += '\\n'.repeat(didReadContent ? 1 + emptyLines : emptyLines)\n } else if (atMoreIndented) {\n atMoreIndented = false\n result += '\\n'.repeat(emptyLines + 1)\n } else if (emptyLines === 0) {\n if (didReadContent) result += ' '\n } else {\n result += '\\n'.repeat(emptyLines)\n }\n } else {\n result += '\\n'.repeat(didReadContent ? 1 + emptyLines : emptyLines)\n }\n\n result += content\n didReadContent = true\n emptyLines = 0\n }\n\n if (chomping === CHOMPING_KEEP) {\n result += '\\n'.repeat(didReadContent ? 1 + emptyLines : emptyLines)\n } else if (chomping !== CHOMPING_STRIP) {\n if (didReadContent) result += '\\n'\n }\n\n return result\n}\n\nfunction getScalarValue (input: string, scalar: ScalarEvent): string {\n if (scalar.valueStart === NO_RANGE) return ''\n\n const { valueStart, valueEnd } = scalar\n\n // Fast path: the parser marked this scalar as a verbatim slice of the input\n // (single-line plain / quoted with no escapes or folded breaks), so the\n // per-style char loop below would just reproduce the slice.\n if (scalar.fast) return input.slice(valueStart, valueEnd)\n\n switch (scalar.style) {\n case SCALAR_STYLE_SINGLE_QUOTED:\n return getSingleQuotedValue(input, valueStart, valueEnd)\n case SCALAR_STYLE_DOUBLE_QUOTED:\n return getDoubleQuotedValue(input, valueStart, valueEnd)\n case SCALAR_STYLE_LITERAL_BLOCK:\n return getBlockValue(input, valueStart, valueEnd, scalar.indent, scalar.chomping, false)\n case SCALAR_STYLE_FOLDED_BLOCK:\n return getBlockValue(input, valueStart, valueEnd, scalar.indent, scalar.chomping, true)\n default:\n return getPlainValue(input, valueStart, valueEnd)\n }\n}\n\nexport {\n getScalarValue\n}\n","const DEFAULT_TAG_HANDLERS: Readonly<Record<string, string>> = {\n '!': '!',\n '!!': 'tag:yaml.org,2002:'\n}\n\nfunction tagPercentEncode (source: string) {\n return encodeURI(source).replace(/!/g, '%21')\n}\n\nfunction tagNameFull (rawTag: string, tagHandlers?: Readonly<Record<string, string>>) {\n if (rawTag.startsWith('!<') && rawTag.endsWith('>')) {\n return decodeURIComponent(rawTag.slice(2, -1))\n }\n\n const handleEnd = rawTag.indexOf('!', 1)\n const handle = handleEnd === -1 ? '!' : rawTag.slice(0, handleEnd + 1)\n const prefix = tagHandlers?.[handle] ?? DEFAULT_TAG_HANDLERS[handle] ?? handle\n\n return decodeURIComponent(prefix) + decodeURIComponent(rawTag.slice(handle.length))\n}\n\nfunction tagNameShort (fullTag: string) {\n let tag = fullTag\n\n if (tag.charCodeAt(0) === 0x21) {\n tag = tag.slice(1)\n return `!${tagPercentEncode(tag)}`\n }\n\n if (tag.slice(0, 18) === 'tag:yaml.org,2002:') {\n return `!!${tagPercentEncode(tag.slice(18))}`\n }\n\n return `!<${tagPercentEncode(tag)}>`\n}\n\nexport {\n tagNameFull,\n tagNameShort\n}\n","import {\n EVENT_ALIAS,\n EVENT_DOCUMENT,\n EVENT_MAPPING,\n EVENT_POP,\n EVENT_SCALAR,\n EVENT_SEQUENCE,\n SCALAR_STYLE_PLAIN,\n type Event,\n type TagHandlers,\n type MappingEvent,\n type ScalarEvent,\n type SequenceEvent\n} from './events.ts'\nimport { getScalarValue } from './parser_scalar.ts'\nimport { CORE_SCHEMA, type Schema } from '../schema.ts'\nimport {\n MERGE_KEY,\n NOT_RESOLVED,\n type MappingTagDefinition,\n type ScalarTagDefinition,\n type SequenceTagDefinition\n} from '../tag.ts'\nimport { YAMLException, throwErrorAt } from '../common/exception.ts'\nimport { tagNameFull } from '../common/tagname.ts'\n\nconst NO_RANGE = -1\n\ninterface DocumentFrame {\n kind: 'document'\n position: number\n value: unknown\n hasValue: boolean\n}\n\ninterface SequenceFrame {\n kind: 'sequence'\n position: number\n value: any\n tag: SequenceTagDefinition<any, any>\n anchor: Anchor | null\n index: number\n // True when this sequence is the source list of a `<<` merge (`<<: [...]`).\n // Each element is validated as a mapping on arrival; the materialized list is\n // then delivered to the target mapping, which folds the elements in.\n merge: boolean\n}\n\ninterface MappingFrame {\n kind: 'mapping'\n position: number\n value: any\n tag: MappingTagDefinition<any, any>\n anchor: Anchor | null\n key: unknown\n keyPosition: number\n hasKey: boolean\n // Keys brought in by a merge that an explicit pair is still allowed to\n // override. Lazily allocated: stays null for mappings without `<<`.\n overridable: Set<unknown> | null\n}\n\ntype Frame = DocumentFrame | SequenceFrame | MappingFrame\n\ntype AnyTag = ScalarTagDefinition | SequenceTagDefinition<any, any> | MappingTagDefinition<any, any>\n\ninterface ValueAndTag {\n value: unknown\n tag: AnyTag\n}\n\ninterface Anchor {\n value: unknown\n tag: AnyTag\n isValueFinal: boolean\n}\n\ninterface ConstructorOptions {\n source: string\n filename?: string\n schema?: Schema\n json?: boolean\n maxTotalMergeKeys?: number\n maxAliases?: number\n}\n\n// `source` is input data, not config — so it has no default here.\nconst DEFAULT_CONSTRUCTOR_OPTIONS: Required<Omit<ConstructorOptions, 'source'>> = {\n filename: '',\n schema: CORE_SCHEMA,\n json: false,\n maxTotalMergeKeys: 10000,\n maxAliases: -1\n}\n\ninterface ConstructorState extends Required<ConstructorOptions> {\n events: Event[]\n documents: unknown[]\n eventIndex: number\n position: number\n frames: Frame[]\n anchors: Map<string, Anchor>\n tagHandlers: TagHandlers\n totalMergeKeys: number\n aliasCount: number\n}\n\nfunction eventPosition (event: Event) {\n if ('tagStart' in event && event.tagStart !== NO_RANGE) return event.tagStart\n if ('anchorStart' in event && event.anchorStart !== NO_RANGE) return event.anchorStart\n if ('valueStart' in event && event.valueStart !== NO_RANGE) return event.valueStart\n if ('start' in event) return event.start\n return 0\n}\n\nfunction throwError (state: ConstructorState, message: string): never {\n throwErrorAt(state.source, state.position, message, state.filename)\n}\n\nfunction finalizeCollection (\n state: ConstructorState,\n position: number,\n tag: SequenceTagDefinition<any, any> | MappingTagDefinition<any, any>,\n carrier: unknown\n) {\n try {\n return tag.finalize(carrier)\n } catch (error) {\n if (error instanceof YAMLException) throw error\n throwErrorAt(\n state.source,\n position,\n error instanceof Error ? error.message : String(error),\n state.filename\n )\n }\n}\n\nfunction lookupTag<T extends ScalarTagDefinition | SequenceTagDefinition | MappingTagDefinition> (\n exact: Record<string, T>,\n prefix: readonly T[],\n tagName: string\n): T | undefined {\n const exactTag = exact[tagName]\n if (exactTag) return exactTag\n\n for (const tag of prefix) {\n if (tagName.startsWith(tag.tagName)) return tag\n }\n\n return undefined\n}\n\nfunction findExplicitTag<T extends ScalarTagDefinition | SequenceTagDefinition | MappingTagDefinition> (\n state: ConstructorState,\n exact: Record<string, T>,\n prefix: readonly T[],\n tagName: string,\n nodeKind: T['nodeKind']\n) {\n const tag = lookupTag(exact, prefix, tagName)\n if (tag) return tag\n\n throwError(state, `unknown ${nodeKind} tag !<${tagName}>`)\n}\n\nfunction constructScalar (\n state: ConstructorState,\n event: ScalarEvent\n): ValueAndTag {\n const source = getScalarValue(state.source, event)\n const rawTag = event.tagStart === NO_RANGE\n ? ''\n : state.source.slice(event.tagStart, event.tagEnd)\n const strTag = state.schema.defaultScalarTag\n\n if (rawTag !== '') {\n if (rawTag === '!') return { value: source, tag: strTag }\n\n const tagName = tagNameFull(rawTag, state.tagHandlers)\n const scalarTag = lookupTag(state.schema.exact.scalar, state.schema.prefix.scalar, tagName)\n\n if (scalarTag) {\n const result = scalarTag.resolve(source, true, tagName)\n\n if (result === NOT_RESOLVED) {\n throwError(state, `cannot resolve a node with !<${tagName}> explicit tag`)\n }\n\n return { value: result, tag: scalarTag }\n }\n\n // An empty node carrying a collection tag (e.g. `!!map`, `!!seq`) is emitted\n // by the parser as a scalar event, since there is no collection syntax to key\n // off. Resolve it here by the explicit tag's kind into an empty collection.\n const collectionTagDef =\n lookupTag(state.schema.exact.mapping, state.schema.prefix.mapping, tagName) ??\n lookupTag(state.schema.exact.sequence, state.schema.prefix.sequence, tagName)\n\n if (collectionTagDef) {\n if (source !== '') {\n throwError(state, `cannot resolve a node with !<${tagName}> explicit tag`)\n }\n\n const carrier = collectionTagDef.create(tagName)\n const value = collectionTagDef.carrierIsResult\n ? carrier\n : finalizeCollection(state, state.position, collectionTagDef, carrier)\n return { value, tag: collectionTagDef }\n }\n\n throwError(state, `unknown scalar tag !<${tagName}>`)\n }\n\n if (event.style === SCALAR_STYLE_PLAIN) {\n // charAt(0) (not source[0]) yields '' for an empty source, which is the key\n // the null tag declares; source[0] would be undefined and miss that bucket.\n const candidates = state.schema.implicitScalarByFirstChar.get(source.charAt(0)) ??\n state.schema.implicitScalarAnyFirstChar\n for (const tag of candidates) {\n const result = tag.resolve(source, false, tag.tagName)\n if (result !== NOT_RESOLVED) return { value: result, tag }\n }\n }\n\n return { value: strTag.resolve(source, false, strTag.tagName), tag: strTag }\n}\n\nfunction collectionTag<Tag extends SequenceTagDefinition | MappingTagDefinition> (\n state: ConstructorState,\n event: SequenceEvent | MappingEvent,\n exact: Record<string, Tag>,\n prefix: readonly Tag[],\n defaultTagName: string,\n nodeKind: Tag['nodeKind']\n) {\n const rawTag = event.tagStart === NO_RANGE\n ? ''\n : state.source.slice(event.tagStart, event.tagEnd)\n const tagName = rawTag === '' || rawTag === '!'\n ? defaultTagName\n : tagNameFull(rawTag, state.tagHandlers)\n\n return {\n tagName,\n tag: findExplicitTag(state, exact, prefix, tagName, nodeKind)\n }\n}\n\n// A merge source must be a mapping; every mapping tag exposes the read side.\nfunction isMappingTag (tag: AnyTag): tag is MappingTagDefinition<any, any> {\n return tag.nodeKind === 'mapping'\n}\n\n// Fold the keys of one mapping source into the target frame, honoring merge\n// precedence: an already-present key (explicit or from an earlier source) wins.\nfunction mergeKeys (state: ConstructorState, frame: MappingFrame, source: unknown, sourceTag: MappingTagDefinition<any, any>) {\n for (const sourceKey of sourceTag.keys(source)) {\n if (state.maxTotalMergeKeys !== -1 && ++state.totalMergeKeys > state.maxTotalMergeKeys) {\n throwError(state, `merge keys exceeded maxTotalMergeKeys (${state.maxTotalMergeKeys})`)\n }\n\n if (frame.tag.has(frame.value, sourceKey)) continue\n\n const err = frame.tag.addPair(frame.value, sourceKey, sourceTag.get(source, sourceKey))\n if (err) throwError(state, err)\n ;(frame.overridable ??= new Set()).add(sourceKey)\n }\n}\n\n// The value of a `<<` key: either a mapping (fold its keys) or a sequence of\n// mappings (fold each). A merge sequence has already had every element validated\n// as a mapping on arrival (see addValue), and its elements were built by the\n// target's own mapping tag, so they are read back with it.\nfunction mergeSource (state: ConstructorState, frame: MappingFrame, source: unknown, sourceTag: AnyTag) {\n state.position = frame.keyPosition\n\n if (isMappingTag(sourceTag)) {\n mergeKeys(state, frame, source, sourceTag)\n } else if (sourceTag.nodeKind === 'sequence' && Array.isArray(source)) {\n for (const element of source) {\n mergeKeys(state, frame, element, frame.tag)\n }\n } else {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable')\n }\n}\n\nfunction addMappingValue (state: ConstructorState, frame: MappingFrame, key: unknown, value: unknown, tag: AnyTag) {\n state.position = frame.keyPosition\n\n // `<<` is intercepted before dedup, so a repeated merge key is allowed.\n if (key === MERGE_KEY) {\n mergeSource(state, frame, value, tag)\n return\n }\n\n if (!state.json && frame.tag.has(frame.value, key) && !frame.overridable?.has(key)) {\n throwError(state, 'duplicated mapping key')\n }\n\n const err = frame.tag.addPair(frame.value, key, value)\n if (err) throwError(state, err)\n frame.overridable?.delete(key)\n}\n\nfunction addValue (state: ConstructorState, value: unknown, tag: AnyTag) {\n const frame = state.frames[state.frames.length - 1]!\n\n if (frame.kind === 'document') {\n frame.value = value\n frame.hasValue = true\n } else if (frame.kind === 'sequence') {\n if (frame.merge) {\n // Element of a `<<: [...]` list: validate it is a mapping, then collect\n // it like any other item for the target to fold in.\n if (!isMappingTag(tag)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable')\n }\n }\n const err = frame.tag.addItem(frame.value, value, frame.index++)\n if (err) throwError(state, err)\n } else if (frame.hasKey) {\n const key = frame.key\n frame.key = undefined\n frame.hasKey = false\n addMappingValue(state, frame, key, value, tag)\n } else {\n frame.key = value\n frame.keyPosition = state.position\n frame.hasKey = true\n }\n}\n\nfunction storeAnchor (\n state: ConstructorState,\n event: ScalarEvent | SequenceEvent | MappingEvent,\n value: unknown,\n tag: AnyTag,\n isValueFinal: boolean\n): Anchor | null {\n if (event.anchorStart !== NO_RANGE) {\n const anchor = {\n value,\n tag,\n isValueFinal\n }\n state.anchors.set(state.source.slice(event.anchorStart, event.anchorEnd), anchor)\n return anchor\n }\n\n return null\n}\n\nfunction constructFromEvents (events: Event[], options: ConstructorOptions): unknown[] {\n const state: ConstructorState = {\n ...DEFAULT_CONSTRUCTOR_OPTIONS,\n ...options,\n events,\n documents: [],\n eventIndex: 0,\n position: 0,\n frames: [],\n anchors: new Map(),\n tagHandlers: Object.create(null),\n totalMergeKeys: 0,\n aliasCount: 0\n }\n\n while (state.eventIndex < state.events.length) {\n const event = state.events[state.eventIndex++]\n state.position = eventPosition(event)\n\n switch (event.type) {\n case EVENT_DOCUMENT:\n state.anchors = new Map()\n state.aliasCount = 0\n state.tagHandlers = Object.create(null)\n for (const directive of event.directives) {\n if (directive.kind === 'tag') state.tagHandlers[directive.handle] = directive.prefix\n }\n state.frames.push({ kind: 'document', position: state.position, value: undefined, hasValue: false })\n break\n\n case EVENT_SCALAR: {\n const { value, tag } = constructScalar(state, event)\n storeAnchor(state, event, value, tag, true)\n addValue(state, value, tag)\n break\n }\n\n case EVENT_SEQUENCE: {\n const definition = collectionTag(\n state,\n event,\n state.schema.exact.sequence,\n state.schema.prefix.sequence,\n 'tag:yaml.org,2002:seq',\n 'sequence'\n )\n const value = definition.tag.create(definition.tagName)\n const anchor = storeAnchor(state, event, value, definition.tag, definition.tag.carrierIsResult)\n\n // `<<: [...]` — the parent mapping is waiting on a merge key, so this\n // sequence is a list of merge sources: its elements must be mappings.\n // It is still built and delivered as a normal value; the target folds it.\n const parent = state.frames[state.frames.length - 1]\n const merge = parent !== undefined && parent.kind === 'mapping' &&\n parent.hasKey && parent.key === MERGE_KEY\n\n state.frames.push({\n kind: 'sequence', position: state.position, value, tag: definition.tag, anchor, index: 0, merge\n })\n break\n }\n\n case EVENT_MAPPING: {\n const definition = collectionTag(\n state,\n event,\n state.schema.exact.mapping,\n state.schema.prefix.mapping,\n 'tag:yaml.org,2002:map',\n 'mapping'\n )\n const value = definition.tag.create(definition.tagName)\n const anchor = storeAnchor(state, event, value, definition.tag, definition.tag.carrierIsResult)\n state.frames.push({\n kind: 'mapping',\n position: state.position,\n value,\n tag: definition.tag,\n anchor,\n key: undefined,\n keyPosition: state.position,\n hasKey: false,\n overridable: null\n })\n break\n }\n\n case EVENT_ALIAS: {\n if (state.maxAliases !== -1 && ++state.aliasCount > state.maxAliases) {\n throwError(state, `aliases exceeded maxAliases (${state.maxAliases})`)\n }\n\n const name = state.source.slice(event.anchorStart, event.anchorEnd)\n const anchor = state.anchors.get(name)\n if (!anchor) {\n throwError(state, `unidentified alias \"${name}\"`)\n }\n if (!anchor.isValueFinal) {\n throwError(state, `recursive alias \"${name}\" is not supported for tag ${anchor.tag.tagName} because it uses finalize()`)\n }\n addValue(state, anchor.value, anchor.tag)\n break\n }\n\n case EVENT_POP: {\n const frame = state.frames.pop()!\n\n if (frame.kind === 'document') {\n state.documents.push(frame.value)\n } else {\n const value = frame.tag.carrierIsResult\n ? frame.value\n : finalizeCollection(state, frame.position, frame.tag, frame.value)\n if (frame.anchor) {\n frame.anchor.value = value\n frame.anchor.isValueFinal = true\n }\n addValue(state, value, frame.tag)\n }\n break\n }\n }\n }\n\n return state.documents\n}\n\nexport {\n constructFromEvents,\n DEFAULT_CONSTRUCTOR_OPTIONS,\n type ConstructorOptions\n}\n","import {\n EVENT_DOCUMENT,\n EVENT_SEQUENCE,\n EVENT_MAPPING,\n EVENT_SCALAR,\n EVENT_ALIAS,\n EVENT_POP,\n SCALAR_STYLE_PLAIN,\n SCALAR_STYLE_SINGLE_QUOTED,\n SCALAR_STYLE_DOUBLE_QUOTED,\n SCALAR_STYLE_LITERAL_BLOCK,\n SCALAR_STYLE_FOLDED_BLOCK,\n COLLECTION_STYLE_BLOCK,\n COLLECTION_STYLE_FLOW,\n CHOMPING_CLIP,\n CHOMPING_STRIP,\n CHOMPING_KEEP,\n type Event,\n type ScalarStyle,\n type CollectionStyle,\n type Chomping,\n type DocumentDirective,\n type TagHandlers\n} from './events.ts'\nimport { throwErrorAt } from '../common/exception.ts'\n\nconst NO_RANGE = -1\nconst HAS_OWN = Object.prototype.hasOwnProperty\n\nconst CONTEXT_FLOW_IN = 1\nconst CONTEXT_FLOW_OUT = 2\nconst CONTEXT_BLOCK_IN = 3\nconst CONTEXT_BLOCK_OUT = 4\n\n// eslint-disable-next-line no-control-regex\nconst PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/\n// eslint-disable-next-line no-useless-escape\nconst PATTERN_FLOW_INDICATORS = /[,\\[\\]{}]/\n// YAML 1.2.2, [91] c-tag-handle.\n// eslint-disable-next-line no-useless-escape\nconst PATTERN_TAG_HANDLE = /^(?:!|!!|![0-9A-Za-z-]+!)$/\n// YAML 1.2.2, [39] ns-uri-char.\n// eslint-disable-next-line no-useless-escape\nconst NS_URI_CHAR = String.raw`(?:%[0-9A-Fa-f]{2}|[0-9A-Za-z\\-#;/?:@&=+$,_.!~*'()\\[\\]])`\n// YAML 1.2.2, [40] ns-tag-char = ns-uri-char - \"!\" - c-flow-indicator.\n// eslint-disable-next-line no-useless-escape\nconst NS_TAG_CHAR = String.raw`(?:%[0-9A-Fa-f]{2}|[0-9A-Za-z\\-#;/?:@&=+$.~*'()_])`\nconst PATTERN_TAG_URI = new RegExp(`^(?:${NS_URI_CHAR})*$`)\n// YAML 1.2.2, [99] c-ns-shorthand-tag suffix part.\nconst PATTERN_TAG_SUFFIX = new RegExp(`^(?:${NS_TAG_CHAR})+$`)\n// YAML 1.2.2, [93] ns-tag-prefix.\nconst PATTERN_TAG_PREFIX = new RegExp(`^(?:!(?:${NS_URI_CHAR})*|${NS_TAG_CHAR}(?:${NS_URI_CHAR})*)$`)\n\ntype NodeContext =\n typeof CONTEXT_FLOW_IN | typeof CONTEXT_FLOW_OUT |\n typeof CONTEXT_BLOCK_IN | typeof CONTEXT_BLOCK_OUT\n\ninterface NodeProperties {\n anchorStart: number\n anchorEnd: number\n tagStart: number\n tagEnd: number\n}\n\ninterface ParserSnapshot {\n position: number\n line: number\n lineStart: number\n lineIndent: number\n firstTabInLine: number\n eventsLength: number\n}\n\ninterface ParserOptions {\n filename?: string\n maxDepth?: number\n}\n\nconst DEFAULT_PARSER_OPTIONS: Required<ParserOptions> = {\n filename: '',\n maxDepth: 100\n}\n\ninterface ParserState extends Required<ParserOptions> {\n input: string\n length: number\n position: number\n line: number\n lineStart: number\n lineIndent: number\n firstTabInLine: number\n depth: number\n directives: DocumentDirective[]\n tagHandlers: TagHandlers\n events: Event[]\n}\n\nfunction addDocumentEvent (\n state: ParserState,\n explicitStart: boolean,\n explicitEnd: boolean\n) {\n state.events.push({\n type: EVENT_DOCUMENT,\n explicitStart,\n explicitEnd,\n directives: state.directives\n })\n}\n\nfunction addSequenceEvent (\n state: ParserState,\n start: number,\n anchorStart: number,\n anchorEnd: number,\n tagStart: number,\n tagEnd: number,\n style: CollectionStyle\n) {\n state.events.push({\n type: EVENT_SEQUENCE,\n start,\n anchorStart,\n anchorEnd,\n tagStart,\n tagEnd,\n style\n })\n}\n\nfunction addMappingEvent (\n state: ParserState,\n start: number,\n anchorStart: number,\n anchorEnd: number,\n tagStart: number,\n tagEnd: number,\n style: CollectionStyle\n) {\n state.events.push({\n type: EVENT_MAPPING,\n start,\n anchorStart,\n anchorEnd,\n tagStart,\n tagEnd,\n style\n })\n}\n\nfunction addScalarEvent (\n state: ParserState,\n valueStart: number,\n valueEnd: number,\n anchorStart: number,\n anchorEnd: number,\n tagStart: number,\n tagEnd: number,\n style: ScalarStyle,\n chomping: Chomping = CHOMPING_CLIP,\n indent = -1,\n fast = false\n) {\n state.events.push({\n type: EVENT_SCALAR,\n valueStart,\n valueEnd,\n anchorStart,\n anchorEnd,\n tagStart,\n tagEnd,\n style,\n chomping,\n indent,\n fast\n })\n}\n\nfunction addAliasEvent (\n state: ParserState,\n anchorStart: number,\n anchorEnd: number\n) {\n state.events.push({\n type: EVENT_ALIAS,\n anchorStart,\n anchorEnd\n })\n}\n\nfunction addPopEvent (state: ParserState) {\n state.events.push({ type: EVENT_POP })\n}\n\nfunction addEmptyScalarEvent (state: ParserState) {\n addScalarEvent(\n state,\n NO_RANGE,\n NO_RANGE,\n NO_RANGE,\n NO_RANGE,\n NO_RANGE,\n NO_RANGE,\n SCALAR_STYLE_PLAIN\n )\n}\n\nfunction emptyProperties (): NodeProperties {\n return {\n anchorStart: NO_RANGE,\n anchorEnd: NO_RANGE,\n tagStart: NO_RANGE,\n tagEnd: NO_RANGE\n }\n}\n\nfunction snapshotState (state: ParserState): ParserSnapshot {\n return {\n position: state.position,\n line: state.line,\n lineStart: state.lineStart,\n lineIndent: state.lineIndent,\n firstTabInLine: state.firstTabInLine,\n eventsLength: state.events.length\n }\n}\n\nfunction restoreState (state: ParserState, snapshot: ParserSnapshot) {\n state.position = snapshot.position\n state.line = snapshot.line\n state.lineStart = snapshot.lineStart\n state.lineIndent = snapshot.lineIndent\n state.firstTabInLine = snapshot.firstTabInLine\n state.events.length = snapshot.eventsLength\n}\n\nfunction throwError (state: ParserState, message: string): never {\n throwErrorAt(state.input.slice(0, state.length), state.position, message, state.filename)\n}\n\nfunction isEol (c: number) {\n return c === 0x0A/* LF */ || c === 0x0D/* CR */\n}\n\nfunction isWhiteSpace (c: number) {\n return c === 0x09/* Tab */ || c === 0x20/* Space */\n}\n\nfunction isWsOrEol (c: number) {\n return isWhiteSpace(c) || isEol(c)\n}\n\nfunction isWsOrEolOrEnd (c: number) {\n return c === 0 || isWsOrEol(c)\n}\n\nfunction isFlowIndicator (c: number) {\n return c === 0x2C/* , */ ||\n c === 0x5B/* [ */ ||\n c === 0x5D/* ] */ ||\n c === 0x7B/* { */ ||\n c === 0x7D/* } */\n}\n\nfunction fromDecimalCode (c: number) {\n return c >= 0x30/* 0 */ && c <= 0x39/* 9 */ ? c - 0x30 : -1\n}\n\nfunction fromHexCode (c: number) {\n if (c >= 0x30/* 0 */ && c <= 0x39/* 9 */) return c - 0x30\n const lc = c | 0x20\n if (lc >= 0x61/* a */ && lc <= 0x66/* f */) return lc - 0x61 + 10\n return -1\n}\n\nfunction escapedHexLen (c: number) {\n if (c === 0x78/* x */) return 2\n if (c === 0x75/* u */) return 4\n if (c === 0x55/* U */) return 8\n return 0\n}\n\nfunction isSimpleEscape (c: number) {\n return c === 0x30/* 0 */ ||\n c === 0x61/* a */ ||\n c === 0x62/* b */ ||\n c === 0x74/* t */ ||\n c === 0x09/* Tab */ ||\n c === 0x6E/* n */ ||\n c === 0x76/* v */ ||\n c === 0x66/* f */ ||\n c === 0x72/* r */ ||\n c === 0x65/* e */ ||\n c === 0x20/* Space */ ||\n c === 0x22/* \" */ ||\n c === 0x2F/* / */ ||\n c === 0x5C/* \\ */ ||\n c === 0x4E/* N */ ||\n c === 0x5F/* _ */ ||\n c === 0x4C/* L */ ||\n c === 0x50/* P */\n}\n\n// Precondition: state.position points at LF or CR.\nfunction consumeLineBreak (state: ParserState) {\n const ch = state.input.charCodeAt(state.position)\n\n if (ch === 0x0A/* LF */) {\n state.position++\n } else {\n state.position++\n if (state.input.charCodeAt(state.position) === 0x0A/* LF */) state.position++\n }\n\n state.line++\n state.lineStart = state.position\n state.lineIndent = 0\n state.firstTabInLine = -1\n}\n\nfunction skipSeparationSpace (state: ParserState, allowComments: boolean) {\n let lineBreaks = 0\n let ch = state.input.charCodeAt(state.position)\n let hasSeparation = state.position === state.lineStart ||\n isWsOrEol(state.input.charCodeAt(state.position - 1))\n\n while (ch !== 0) {\n while (isWhiteSpace(ch)) {\n hasSeparation = true\n if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {\n state.firstTabInLine = state.position\n }\n ch = state.input.charCodeAt(++state.position)\n }\n\n if (allowComments && hasSeparation && ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position) }\n while (!isEol(ch) && ch !== 0)\n }\n\n if (!isEol(ch)) break\n\n consumeLineBreak(state)\n lineBreaks++\n hasSeparation = true\n ch = state.input.charCodeAt(state.position)\n\n while (ch === 0x20/* Space */) {\n state.lineIndent++\n ch = state.input.charCodeAt(++state.position)\n }\n }\n\n return lineBreaks\n}\n\nfunction testDocumentSeparator (state: ParserState, position = state.position) {\n const ch = state.input.charCodeAt(position)\n\n if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&\n ch === state.input.charCodeAt(position + 1) &&\n ch === state.input.charCodeAt(position + 2)) {\n const following = state.input.charCodeAt(position + 3)\n return following === 0 || isWsOrEol(following)\n }\n\n return false\n}\n\nfunction skipUntilLineEnd (state: ParserState) {\n let ch = state.input.charCodeAt(state.position)\n\n while (ch !== 0 && !isEol(ch)) {\n ch = state.input.charCodeAt(++state.position)\n }\n}\n\nfunction checkPrintable (state: ParserState, start: number, end: number) {\n if (PATTERN_NON_PRINTABLE.test(state.input.slice(start, end))) {\n throwError(state, 'the stream contains non-printable characters')\n }\n}\n\nfunction readTagProperty (state: ParserState, props: NodeProperties, inFlow: boolean) {\n if (state.input.charCodeAt(state.position) !== 0x21/* ! */) return false\n if (props.tagStart !== NO_RANGE) throwError(state, 'duplication of a tag property')\n\n const start = state.position\n let isVerbatim = false\n let isNamed = false\n let tagHandle = '!'\n let ch = state.input.charCodeAt(++state.position)\n\n if (ch === 0x3C/* < */) {\n isVerbatim = true\n ch = state.input.charCodeAt(++state.position)\n } else if (ch === 0x21/* ! */) {\n isNamed = true\n tagHandle = '!!'\n ch = state.input.charCodeAt(++state.position)\n }\n\n let suffixStart = state.position\n let tagName\n\n if (isVerbatim) {\n while (ch !== 0 && ch !== 0x3E/* > */) ch = state.input.charCodeAt(++state.position)\n if (ch !== 0x3E/* > */) throwError(state, 'unexpected end of the stream within a verbatim tag')\n tagName = state.input.slice(suffixStart, state.position)\n state.position++\n } else {\n while (ch !== 0 && !isWsOrEol(ch) && !(inFlow && isFlowIndicator(ch))) {\n if (ch === 0x21/* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(suffixStart - 1, state.position + 1)\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) throwError(state, 'named tag handle cannot contain such characters')\n isNamed = true\n suffixStart = state.position + 1\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks')\n }\n }\n\n ch = state.input.charCodeAt(++state.position)\n }\n\n tagName = state.input.slice(suffixStart, state.position)\n if (PATTERN_FLOW_INDICATORS.test(tagName)) throwError(state, 'tag suffix cannot contain flow indicator characters')\n }\n\n if (tagName && !(isVerbatim ? PATTERN_TAG_URI.test(tagName) : PATTERN_TAG_SUFFIX.test(tagName))) {\n throwError(state, `tag name cannot contain such characters: ${tagName}`)\n }\n try {\n decodeURIComponent(tagName)\n } catch {\n throwError(state, `tag name is malformed: ${tagName}`)\n }\n\n if (!isVerbatim && tagHandle !== '!' && tagHandle !== '!!' && !HAS_OWN.call(state.tagHandlers, tagHandle)) {\n throwError(state, `undeclared tag handle \"${tagHandle}\"`)\n }\n\n props.tagStart = start\n props.tagEnd = state.position\n return true\n}\n\nfunction readAnchorProperty (state: ParserState, props: NodeProperties) {\n if (state.input.charCodeAt(state.position) !== 0x26/* & */) return false\n if (props.anchorStart !== NO_RANGE) throwError(state, 'duplication of an anchor property')\n\n state.position++\n const start = state.position\n\n while (state.input.charCodeAt(state.position) !== 0 && !isWsOrEol(state.input.charCodeAt(state.position)) && !isFlowIndicator(state.input.charCodeAt(state.position))) {\n state.position++\n }\n\n if (state.position === start) throwError(state, 'name of an anchor node must contain at least one character')\n\n props.anchorStart = start\n props.anchorEnd = state.position\n return true\n}\n\nfunction readAlias (state: ParserState, props: NodeProperties) {\n if (state.input.charCodeAt(state.position) !== 0x2A/* * */) return false\n if (props.anchorStart !== NO_RANGE || props.tagStart !== NO_RANGE) {\n throwError(state, 'alias node should not have any properties')\n }\n\n state.position++\n const start = state.position\n\n while (state.input.charCodeAt(state.position) !== 0 && !isWsOrEol(state.input.charCodeAt(state.position)) && !isFlowIndicator(state.input.charCodeAt(state.position))) {\n state.position++\n }\n\n if (state.position === start) throwError(state, 'name of an alias node must contain at least one character')\n\n addAliasEvent(state, start, state.position)\n return true\n}\n\nfunction readFlowScalarBreak (state: ParserState, nodeIndent: number) {\n skipSeparationSpace(state, false)\n\n if (state.lineIndent < nodeIndent) {\n throwError(state, 'deficient indentation')\n }\n}\n\nfunction readSingleQuotedScalar (state: ParserState, nodeIndent: number, props: NodeProperties) {\n if (state.input.charCodeAt(state.position) !== 0x27/* ' */) return false\n\n state.position++\n const start = state.position\n // A single-quoted scalar is sliceable verbatim when it has no '' escape pairs\n // and no folded line breaks (see getScalarValue fast path).\n let simple = true\n\n while (state.input.charCodeAt(state.position) !== 0) {\n const ch = state.input.charCodeAt(state.position)\n\n if (ch === 0x27/* ' */) {\n if (state.input.charCodeAt(state.position + 1) === 0x27/* ' */) {\n simple = false\n state.position += 2\n continue\n }\n\n const end = state.position\n state.position++\n addScalarEvent(state, start, end, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, SCALAR_STYLE_SINGLE_QUOTED, CHOMPING_CLIP, -1, simple)\n return true\n }\n\n if (isEol(ch)) {\n simple = false\n readFlowScalarBreak(state, nodeIndent)\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar')\n } else if (ch !== 0x09/* Tab */ && ch < 0x20) {\n throwError(state, 'expected valid JSON character')\n } else {\n state.position++\n }\n }\n\n throwError(state, 'unexpected end of the stream within a single quoted scalar')\n}\n\nfunction readDoubleQuotedScalar (state: ParserState, nodeIndent: number, props: NodeProperties) {\n if (state.input.charCodeAt(state.position) !== 0x22/* \" */) return false\n\n state.position++\n const start = state.position\n // A double-quoted scalar is sliceable verbatim when it has no \\ escapes and\n // no folded line breaks (see getScalarValue fast path).\n let simple = true\n\n while (state.input.charCodeAt(state.position) !== 0) {\n const ch = state.input.charCodeAt(state.position)\n\n if (ch === 0x22/* \" */) {\n const end = state.position\n state.position++\n addScalarEvent(state, start, end, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, SCALAR_STYLE_DOUBLE_QUOTED, CHOMPING_CLIP, -1, simple)\n return true\n }\n\n if (ch === 0x5C/* \\ */) {\n simple = false\n const escaped = state.input.charCodeAt(++state.position)\n\n if (isEol(escaped)) {\n readFlowScalarBreak(state, nodeIndent)\n } else if (isSimpleEscape(escaped)) {\n state.position++\n } else {\n let hexLength = escapedHexLen(escaped)\n\n if (hexLength === 0) throwError(state, 'unknown escape sequence')\n\n while (hexLength-- > 0) {\n state.position++\n if (fromHexCode(state.input.charCodeAt(state.position)) < 0) {\n throwError(state, 'expected hexadecimal character')\n }\n }\n state.position++\n }\n } else if (isEol(ch)) {\n simple = false\n readFlowScalarBreak(state, nodeIndent)\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar')\n } else if (ch !== 0x09/* Tab */ && ch < 0x20) {\n throwError(state, 'expected valid JSON character')\n } else {\n state.position++\n }\n }\n\n throwError(state, 'unexpected end of the stream within a double quoted scalar')\n}\n\nfunction readBlockScalar (state: ParserState, parentIndent: number, props: NodeProperties) {\n const ch = state.input.charCodeAt(state.position)\n let chomping: Chomping = CHOMPING_CLIP\n let indent = -1\n let detectedIndent = false\n\n if (ch !== 0x7C/* | */ && ch !== 0x3E/* > */) return false\n\n const style = ch === 0x7C/* | */ ? SCALAR_STYLE_LITERAL_BLOCK : SCALAR_STYLE_FOLDED_BLOCK\n state.position++\n\n while (state.input.charCodeAt(state.position) !== 0) {\n const current = state.input.charCodeAt(state.position)\n const digit = fromDecimalCode(current)\n\n if (current === 0x2B/* + */ || current === 0x2D/* - */) {\n if (chomping !== CHOMPING_CLIP) throwError(state, 'repeat of a chomping mode identifier')\n chomping = current === 0x2B/* + */ ? CHOMPING_KEEP : CHOMPING_STRIP\n state.position++\n } else if (digit >= 0) {\n if (digit === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one')\n }\n if (detectedIndent) throwError(state, 'repeat of an indentation width identifier')\n indent = parentIndent + digit - 1\n detectedIndent = true\n state.position++\n } else {\n break\n }\n }\n\n let hadWhitespace = false\n while (isWhiteSpace(state.input.charCodeAt(state.position))) {\n hadWhitespace = true\n state.position++\n }\n if (hadWhitespace && state.input.charCodeAt(state.position) === 0x23/* # */) skipUntilLineEnd(state)\n\n if (isEol(state.input.charCodeAt(state.position))) {\n consumeLineBreak(state)\n } else if (state.input.charCodeAt(state.position) !== 0) {\n throwError(state, 'a line break is expected')\n }\n\n let contentIndent = detectedIndent ? indent : -1\n let maxLeadingIndent = 0\n const valueStart = state.position\n let valueEnd = state.position\n\n while (state.input.charCodeAt(state.position) !== 0) {\n const linePosition = state.position\n let column = 0\n\n while (state.input.charCodeAt(linePosition + column) === 0x20/* Space */) column++\n\n const first = state.input.charCodeAt(linePosition + column)\n if (first === 0) {\n // End of input acts as a line terminator, but there is no line break to\n // include here. A final all-spaces line still counts: when the block has a\n // content indent, the spaces beyond it are real content; in a wholly blank\n // block (contentIndent < 0) the spaces form a blank line that chomping must\n // see, exactly as it would if the line ended with a break. Capture the line\n // in both cases; otherwise the block ends at the start of this empty line.\n if (contentIndent >= 0) {\n if (column > contentIndent) valueEnd = linePosition + column\n } else if (column > 0) {\n valueEnd = linePosition + column\n }\n break\n }\n if (linePosition === state.lineStart && testDocumentSeparator(state, linePosition)) break\n\n if (!detectedIndent && contentIndent === -1 && isEol(first)) {\n maxLeadingIndent = Math.max(maxLeadingIndent, column)\n }\n\n if (!detectedIndent && contentIndent === -1 && !isEol(first)) {\n if (first === 0x09/* Tab */ && column < parentIndent) {\n state.position = linePosition + column\n throwError(state, 'tab characters must not be used in indentation')\n }\n if (column < maxLeadingIndent) {\n state.position = linePosition + column\n throwError(state, 'bad indentation of a mapping entry')\n }\n }\n\n if (contentIndent === -1 && first !== 0 && !isEol(first) && column < parentIndent) {\n state.lineIndent = column\n state.position = linePosition + column\n break\n }\n\n if (!detectedIndent && first !== 0 && !isEol(first) && contentIndent === -1) {\n contentIndent = column\n }\n\n const requiredIndent = contentIndent === -1 ? parentIndent + 1 : contentIndent\n if (first !== 0 && !isEol(first) && column < requiredIndent) {\n state.lineIndent = column\n state.position = linePosition + column\n break\n }\n\n skipUntilLineEnd(state)\n valueEnd = state.position\n if (isEol(state.input.charCodeAt(state.position))) {\n consumeLineBreak(state)\n // Include the line break in the range so trailing blank lines are\n // preserved. This is what lets cook tell apart an empty `|+` (range \"\",\n // value \"\") from a `|+` with one blank line (range \"\\n\", value \"\\n\").\n // De-indent and chomping are applied later in getScalarValue.\n valueEnd = state.position\n }\n }\n\n checkPrintable(state, valueStart, valueEnd)\n addScalarEvent(\n state,\n valueStart,\n valueEnd,\n props.anchorStart,\n props.anchorEnd,\n props.tagStart,\n props.tagEnd,\n style,\n chomping,\n contentIndent\n )\n return true\n}\n\nfunction canStartPlainScalar (state: ParserState, nodeContext: NodeContext) {\n const ch = state.input.charCodeAt(state.position)\n const inFlow = nodeContext === CONTEXT_FLOW_IN\n\n if (ch === 0 ||\n isWsOrEol(ch) ||\n ch === 0x23/* # */ ||\n ch === 0x26/* & */ ||\n ch === 0x2A/* * */ ||\n ch === 0x21/* ! */ ||\n ch === 0x7C/* | */ ||\n ch === 0x3E/* > */ ||\n ch === 0x27/* ' */ ||\n ch === 0x22/* \" */ ||\n ch === 0x25/* % */ ||\n ch === 0x40/* @ */ ||\n ch === 0x60/* ` */ ||\n (inFlow && isFlowIndicator(ch))) {\n return false\n }\n\n if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {\n const following = state.input.charCodeAt(state.position + 1)\n if (isWsOrEolOrEnd(following) || (inFlow && isFlowIndicator(following))) return false\n }\n\n return true\n}\n\nfunction readPlainScalar (state: ParserState, nodeIndent: number, nodeContext: NodeContext, props: NodeProperties) {\n if (!canStartPlainScalar(state, nodeContext)) return false\n\n const start = state.position\n let end = state.position\n let ch = state.input.charCodeAt(state.position)\n const inFlow = nodeContext === CONTEXT_FLOW_IN\n // A single-line plain scalar is sliceable verbatim: the parser already trims\n // trailing whitespace from the range, so no folding is needed (see\n // getScalarValue fast path). Folded line breaks make it non-simple.\n let multiline = false\n\n while (ch !== 0) {\n if (state.position === state.lineStart && testDocumentSeparator(state)) break\n\n if (ch === 0x3A/* : */) {\n const following = state.input.charCodeAt(state.position + 1)\n if (isWsOrEolOrEnd(following) || (inFlow && isFlowIndicator(following))) break\n } else if (ch === 0x23/* # */) {\n const preceding = state.input.charCodeAt(state.position - 1)\n if (isWsOrEol(preceding)) break\n } else if (inFlow && isFlowIndicator(ch)) {\n break\n } else if (isEol(ch)) {\n const savedPosition = state.position\n const savedLine = state.line\n const savedLineStart = state.lineStart\n const savedLineIndent = state.lineIndent\n\n skipSeparationSpace(state, false)\n\n if (state.lineIndent >= nodeIndent) {\n multiline = true\n ch = state.input.charCodeAt(state.position)\n continue\n }\n\n state.position = savedPosition\n state.line = savedLine\n state.lineStart = savedLineStart\n state.lineIndent = savedLineIndent\n break\n }\n\n if (!isWhiteSpace(ch)) end = state.position + 1\n ch = state.input.charCodeAt(++state.position)\n }\n\n if (end === start) return false\n\n checkPrintable(state, start, end)\n addScalarEvent(state, start, end, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, SCALAR_STYLE_PLAIN, CHOMPING_CLIP, -1, !multiline)\n return true\n}\n\nfunction findBlockMappingColon (state: ParserState) {\n let position = state.position\n let flowLevel = 0\n\n while (position < state.length) {\n const ch = state.input.charCodeAt(position)\n\n if (isEol(ch)) return -1\n if (ch === 0x23/* # */ && isWsOrEol(state.input.charCodeAt(position - 1))) return -1\n\n if ((ch === 0x2A/* * */ || ch === 0x26/* & */) && position === state.position) {\n do { position++ }\n while (state.input.charCodeAt(position) !== 0 &&\n !isWsOrEol(state.input.charCodeAt(position)) &&\n !isFlowIndicator(state.input.charCodeAt(position)))\n continue\n }\n\n if (ch === 0x5B/* [ */ || ch === 0x7B/* { */) {\n flowLevel++\n } else if (ch === 0x5D/* ] */ || ch === 0x7D/* } */) {\n if (flowLevel > 0) flowLevel--\n } else if (flowLevel === 0 && ch === 0x3A/* : */ && isWsOrEol(state.input.charCodeAt(position + 1))) {\n return position\n }\n\n if ((flowLevel > 0 || position === state.position) &&\n (ch === 0x27/* ' */ || ch === 0x22/* \" */)) {\n const quote = ch\n position++\n\n while (position < state.length && state.input.charCodeAt(position) !== quote) {\n if (state.input.charCodeAt(position) === 0x5C/* \\ */ && quote === 0x22/* \" */) position++\n position++\n }\n }\n\n position++\n }\n\n return -1\n}\n\nfunction skipFlowSeparationSpace (state: ParserState, nodeIndent: number) {\n const startLine = state.line\n skipSeparationSpace(state, true)\n\n if ((state.line > startLine && state.lineIndent < nodeIndent) ||\n (state.firstTabInLine !== -1 && state.lineIndent < nodeIndent)) {\n throwError(state, 'deficient indentation')\n }\n}\n\nfunction readFlowCollection (state: ParserState, nodeIndent: number, props: NodeProperties) {\n const ch = state.input.charCodeAt(state.position)\n const isMapping = ch === 0x7B/* { */\n const start = state.position\n let readNext = true\n\n if (ch !== 0x5B/* [ */ && ch !== 0x7B/* { */) return false\n\n const terminator = isMapping ? 0x7D/* } */ : 0x5D/* ] */\n\n if (isMapping) {\n addMappingEvent(state, start, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, COLLECTION_STYLE_FLOW)\n } else {\n addSequenceEvent(state, start, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, COLLECTION_STYLE_FLOW)\n }\n\n state.position++\n\n while (state.input.charCodeAt(state.position) !== 0) {\n skipFlowSeparationSpace(state, nodeIndent)\n\n let ch = state.input.charCodeAt(state.position)\n\n if (ch === terminator) {\n state.position++\n addPopEvent(state)\n return true\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries')\n } else if (ch === 0x2C/* , */) {\n throwError(state, \"expected the node content, but found ','\")\n }\n\n let isPair = false\n let isExplicitPair = false\n\n if (ch === 0x3F/* ? */ && isWsOrEol(state.input.charCodeAt(state.position + 1))) {\n isPair = isExplicitPair = true\n state.position += 1\n skipFlowSeparationSpace(state, nodeIndent)\n }\n\n const entryLine = state.line\n const entryStart = snapshotState(state)\n\n const keyWasRead = parseNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true)\n skipFlowSeparationSpace(state, nodeIndent)\n\n ch = state.input.charCodeAt(state.position)\n\n if ((isMapping || isExplicitPair || state.line === entryLine) && ch === 0x3A/* : */) {\n isPair = true\n state.position++\n skipFlowSeparationSpace(state, nodeIndent)\n if (!isMapping) {\n restoreState(state, entryStart)\n addMappingEvent(state, entryStart.position, NO_RANGE, NO_RANGE, NO_RANGE, NO_RANGE, COLLECTION_STYLE_FLOW)\n if (!parseNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true)) {\n addEmptyScalarEvent(state)\n }\n skipFlowSeparationSpace(state, nodeIndent)\n state.position++\n skipFlowSeparationSpace(state, nodeIndent)\n } else if (!keyWasRead) {\n addEmptyScalarEvent(state)\n }\n if (!parseNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true)) {\n addEmptyScalarEvent(state)\n }\n skipFlowSeparationSpace(state, nodeIndent)\n if (!isMapping) addPopEvent(state)\n } else if (isMapping && isPair) {\n if (!keyWasRead) addEmptyScalarEvent(state)\n addEmptyScalarEvent(state)\n } else if (isMapping) {\n addEmptyScalarEvent(state)\n } else if (isPair) {\n restoreState(state, entryStart)\n addMappingEvent(state, entryStart.position, NO_RANGE, NO_RANGE, NO_RANGE, NO_RANGE, COLLECTION_STYLE_FLOW)\n parseNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true)\n addEmptyScalarEvent(state)\n addPopEvent(state)\n }\n\n ch = state.input.charCodeAt(state.position)\n\n if (ch === 0x2C/* , */) {\n readNext = true\n state.position++\n } else {\n readNext = false\n }\n }\n\n throwError(state, 'unexpected end of the stream within a flow collection')\n}\n\nfunction readBlockSequence (state: ParserState, nodeIndent: number, props: NodeProperties) {\n if (state.firstTabInLine !== -1 || state.input.charCodeAt(state.position) !== 0x2D/* - */ || !isWsOrEolOrEnd(state.input.charCodeAt(state.position + 1))) {\n return false\n }\n\n addSequenceEvent(state, state.position, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, COLLECTION_STYLE_BLOCK)\n\n while (state.input.charCodeAt(state.position) === 0x2D/* - */ && isWsOrEolOrEnd(state.input.charCodeAt(state.position + 1))) {\n if (state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine\n throwError(state, 'tab characters must not be used in indentation')\n }\n\n const entryLine = state.line\n state.position++\n\n const hadBreak = skipSeparationSpace(state, true) > 0\n if (state.firstTabInLine !== -1 &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n isWsOrEolOrEnd(state.input.charCodeAt(state.position + 1))) {\n throwError(state, 'bad indentation of a sequence entry')\n }\n\n if (hadBreak && state.lineIndent <= nodeIndent) {\n addEmptyScalarEvent(state)\n } else {\n parseNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true)\n }\n\n skipSeparationSpace(state, true)\n\n if (state.lineIndent < nodeIndent || state.position >= state.length) break\n if (state.lineIndent > nodeIndent) throwError(state, 'bad indentation of a sequence entry')\n if (state.line === entryLine &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n isWsOrEolOrEnd(state.input.charCodeAt(state.position + 1))) {\n throwError(state, 'bad indentation of a sequence entry')\n }\n }\n\n addPopEvent(state)\n return true\n}\n\nfunction readBlockMapping (state: ParserState, nodeIndent: number, flowIndent: number, props: NodeProperties) {\n let atExplicitKey = false\n let detected = false\n let mappingOpened = false\n let pendingExplicitKey = false\n\n if (state.firstTabInLine !== -1) return false\n\n let ch = state.input.charCodeAt(state.position)\n\n while (ch !== 0) {\n if (!atExplicitKey && state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine\n throwError(state, 'tab characters must not be used in indentation')\n }\n\n const following = state.input.charCodeAt(state.position + 1)\n const entryLine = state.line\n\n if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && isWsOrEolOrEnd(following)) {\n if (!mappingOpened) {\n addMappingEvent(state, state.position, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, COLLECTION_STYLE_BLOCK)\n mappingOpened = true\n }\n\n if (ch === 0x3F/* ? */) {\n if (atExplicitKey) addEmptyScalarEvent(state)\n detected = true\n atExplicitKey = true\n } else if (atExplicitKey) {\n atExplicitKey = false\n } else {\n addEmptyScalarEvent(state)\n detected = true\n atExplicitKey = false\n }\n\n state.position += 1\n pendingExplicitKey = true\n } else {\n // An explicit key awaiting its value, followed by an implicit key, means\n // the explicit key's value is empty. Emit it now (append-only) so it is\n // ordered before the implicit key node read just below.\n if (atExplicitKey) {\n addEmptyScalarEvent(state)\n atExplicitKey = false\n }\n\n const beforeKey = snapshotState(state)\n\n if (!parseNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n break\n }\n\n if (state.line === entryLine) {\n ch = state.input.charCodeAt(state.position)\n\n while (isWhiteSpace(ch)) {\n ch = state.input.charCodeAt(++state.position)\n }\n\n if (ch === 0x3A/* : */) {\n ch = state.input.charCodeAt(++state.position)\n\n if (!isWsOrEolOrEnd(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping')\n }\n\n if (!mappingOpened) {\n restoreState(state, beforeKey)\n addMappingEvent(state, beforeKey.position, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, COLLECTION_STYLE_BLOCK)\n mappingOpened = true\n // The key, the `:` and the space after it were already validated\n // above, before the rollback. Re-reading the same input cannot\n // fail, so just consume it again without error checks.\n parseNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)\n\n ch = state.input.charCodeAt(state.position)\n while (isWhiteSpace(ch)) {\n ch = state.input.charCodeAt(++state.position)\n }\n\n state.position++\n }\n\n detected = true\n atExplicitKey = false\n pendingExplicitKey = false\n } else if (detected) {\n throwError(state, \"expected ':' after a mapping key\")\n } else {\n // Not a mapping. If outer properties are pending, roll back so the\n // caller re-reads this node with them attached (events are append-only).\n if (props.anchorStart !== NO_RANGE || props.tagStart !== NO_RANGE) {\n restoreState(state, beforeKey)\n return false\n }\n return true\n }\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key')\n } else {\n if (props.anchorStart !== NO_RANGE || props.tagStart !== NO_RANGE) {\n restoreState(state, beforeKey)\n return false\n }\n return true\n }\n }\n\n if (parseNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, pendingExplicitKey)) {\n pendingExplicitKey = false\n }\n\n if (!atExplicitKey) {\n if (pendingExplicitKey) {\n addEmptyScalarEvent(state)\n pendingExplicitKey = false\n }\n }\n\n skipSeparationSpace(state, true)\n ch = state.input.charCodeAt(state.position)\n\n if ((state.line === entryLine || state.lineIndent > nodeIndent) && ch !== 0) {\n throwError(state, 'bad indentation of a mapping entry')\n } else if (state.lineIndent < nodeIndent) {\n break\n }\n }\n\n if (!detected) return false\n if (atExplicitKey) addEmptyScalarEvent(state)\n if (mappingOpened) addPopEvent(state)\n return true\n}\n\nfunction parseNode (\n state: ParserState,\n parentIndent: number,\n nodeContext: NodeContext,\n allowToSeek: boolean,\n allowCompact: boolean,\n allowPropertyMapping = true\n): boolean {\n if (state.depth >= state.maxDepth) {\n throwError(state, `nesting exceeded maxDepth (${state.maxDepth})`)\n }\n\n state.depth++\n\n let indentStatus = 1\n let atNewLine = false\n let hasContent = false\n let propertyStart: ParserSnapshot | null = null\n const props = emptyProperties()\n\n let allowBlockScalars = nodeContext === CONTEXT_BLOCK_OUT || nodeContext === CONTEXT_BLOCK_IN\n let allowBlockCollections = allowBlockScalars\n const allowBlockStyles = allowBlockScalars\n\n if (allowToSeek && skipSeparationSpace(state, true)) {\n atNewLine = true\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0\n } else {\n indentStatus = -1\n }\n }\n\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n state.depth--\n return false\n }\n\n if (indentStatus === 1) {\n while (true) {\n const ch = state.input.charCodeAt(state.position)\n const propertyState = snapshotState(state)\n\n if (atNewLine &&\n indentStatus !== 1 &&\n (ch === 0x21/* ! */ || ch === 0x26/* & */)) {\n break\n }\n\n if (atNewLine &&\n allowBlockStyles &&\n (props.tagStart !== NO_RANGE || props.anchorStart !== NO_RANGE) &&\n (ch === 0x21/* ! */ || ch === 0x26/* & */)) {\n const fallbackState = snapshotState(state)\n const flowIndent = parentIndent + 1\n const mappingIndent = state.position - state.lineStart\n\n if (readBlockMapping(state, mappingIndent, flowIndent, props) &&\n state.events[fallbackState.eventsLength]?.type === EVENT_MAPPING) {\n state.depth--\n return true\n }\n\n restoreState(state, fallbackState)\n }\n\n if (atNewLine &&\n ((ch === 0x21/* ! */ && props.tagStart !== NO_RANGE) ||\n (ch === 0x26/* & */ && props.anchorStart !== NO_RANGE))) {\n break\n }\n\n if (!readTagProperty(state, props, nodeContext === CONTEXT_FLOW_IN) && !readAnchorProperty(state, props)) {\n break\n }\n\n if (propertyStart === null) propertyStart = propertyState\n\n if (skipSeparationSpace(state, true)) {\n atNewLine = true\n allowBlockCollections = allowBlockStyles\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0\n } else {\n indentStatus = -1\n }\n } else {\n allowBlockCollections = false\n }\n }\n }\n\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact\n }\n\n if (indentStatus === 1 || nodeContext === CONTEXT_BLOCK_OUT) {\n const flowIndent = nodeContext === CONTEXT_FLOW_IN || nodeContext === CONTEXT_FLOW_OUT\n ? parentIndent\n : parentIndent + 1\n const blockIndent = state.position - state.lineStart\n\n if (indentStatus === 1) {\n if ((allowBlockCollections &&\n (readBlockSequence(state, blockIndent, props) ||\n readBlockMapping(state, blockIndent, flowIndent, props))) ||\n readFlowCollection(state, flowIndent, props)) {\n hasContent = true\n } else {\n const ch = state.input.charCodeAt(state.position)\n\n if (propertyStart !== null && allowPropertyMapping && allowBlockStyles && !allowBlockCollections &&\n ch !== 0x7C/* | */ && ch !== 0x3E/* > */) {\n const fallbackState = snapshotState(state)\n const propertyIndent = propertyStart.position - propertyStart.lineStart\n\n restoreState(state, propertyStart)\n\n if (readBlockMapping(state, propertyIndent, flowIndent, emptyProperties()) &&\n state.events[fallbackState.eventsLength]?.type === EVENT_MAPPING) {\n hasContent = true\n } else {\n restoreState(state, fallbackState)\n }\n }\n\n if (!hasContent &&\n ((allowBlockScalars && readBlockScalar(state, flowIndent, props)) ||\n readSingleQuotedScalar(state, flowIndent, props) ||\n readDoubleQuotedScalar(state, flowIndent, props) ||\n readAlias(state, props) ||\n readPlainScalar(state, flowIndent, nodeContext, props))) {\n hasContent = true\n }\n }\n } else if (indentStatus === 0) {\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent, props)\n }\n }\n\n allowBlockScalars = allowBlockScalars && !hasContent\n\n if (!hasContent && (props.anchorStart !== NO_RANGE || props.tagStart !== NO_RANGE || allowBlockScalars)) {\n addScalarEvent(\n state,\n NO_RANGE,\n NO_RANGE,\n props.anchorStart,\n props.anchorEnd,\n props.tagStart,\n props.tagEnd,\n SCALAR_STYLE_PLAIN\n )\n hasContent = true\n }\n\n state.depth--\n return hasContent || props.anchorStart !== NO_RANGE || props.tagStart !== NO_RANGE\n}\n\nfunction readDirective (state: ParserState) {\n if (state.lineIndent > 0 || state.input.charCodeAt(state.position) !== 0x25/* % */) return false\n\n state.position++\n const nameStart = state.position\n\n while (state.input.charCodeAt(state.position) !== 0 && !isWsOrEol(state.input.charCodeAt(state.position))) state.position++\n\n const name = state.input.slice(nameStart, state.position)\n const args: string[] = []\n\n if (name.length === 0) throwError(state, 'directive name must not be less than one character in length')\n\n while (state.input.charCodeAt(state.position) !== 0 && !isEol(state.input.charCodeAt(state.position))) {\n while (isWhiteSpace(state.input.charCodeAt(state.position))) state.position++\n if (state.input.charCodeAt(state.position) === 0x23/* # */ || isEol(state.input.charCodeAt(state.position)) || state.input.charCodeAt(state.position) === 0) break\n\n const start = state.position\n while (state.input.charCodeAt(state.position) !== 0 && !isWsOrEol(state.input.charCodeAt(state.position))) state.position++\n args.push(state.input.slice(start, state.position))\n }\n\n if (isEol(state.input.charCodeAt(state.position))) consumeLineBreak(state)\n\n if (name === 'YAML') {\n if (state.directives.some(directive => directive.kind === 'yaml')) throwError(state, 'duplication of %YAML directive')\n if (args.length !== 1) throwError(state, 'YAML directive accepts exactly one argument')\n\n const match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0])\n if (match === null) throwError(state, 'ill-formed argument of the YAML directive')\n if (parseInt(match[1], 10) !== 1) throwError(state, 'unacceptable YAML version of the document')\n\n state.directives.push({ kind: 'yaml', version: args[0] })\n } else if (name === 'TAG') {\n if (args.length !== 2) throwError(state, 'TAG directive accepts exactly two arguments')\n\n const [handle, prefix] = args\n if (!PATTERN_TAG_HANDLE.test(handle)) throwError(state, 'ill-formed tag handle (first argument) of the TAG directive')\n if (HAS_OWN.call(state.tagHandlers, handle)) throwError(state, `there is a previously declared suffix for \"${handle}\" tag handle`)\n if (!PATTERN_TAG_PREFIX.test(prefix)) throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive')\n try {\n decodeURIComponent(prefix)\n } catch {\n throwError(state, `tag prefix is malformed: ${prefix}`)\n }\n\n state.tagHandlers[handle] = prefix\n state.directives.push({ kind: 'tag', handle, prefix })\n }\n\n return true\n}\n\nfunction readDocument (state: ParserState) {\n state.directives = []\n state.tagHandlers = Object.create(null)\n let hasDirectives = false\n\n skipSeparationSpace(state, true)\n\n while (readDirective(state)) {\n hasDirectives = true\n skipSeparationSpace(state, true)\n }\n\n let explicitStart = false\n let explicitEnd = false\n let allowCompact = true\n\n if (state.lineIndent === 0 &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 2) === 0x2D/* - */ &&\n isWsOrEolOrEnd(state.input.charCodeAt(state.position + 3))) {\n explicitStart = true\n const markerLine = state.line\n state.position += 3\n skipSeparationSpace(state, true)\n allowCompact = state.line > markerLine\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected')\n }\n\n const documentEventIndex = state.events.length\n if (!explicitStart &&\n state.position === state.lineStart &&\n state.input.charCodeAt(state.position) === 0x2E/* . */ &&\n testDocumentSeparator(state)) {\n state.position += 3\n skipSeparationSpace(state, true)\n return\n }\n\n addDocumentEvent(state, explicitStart, false)\n if (!parseNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, allowCompact, allowCompact)) {\n addEmptyScalarEvent(state)\n }\n skipSeparationSpace(state, true)\n\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n explicitEnd = state.input.charCodeAt(state.position) === 0x2E/* . */\n if (explicitEnd) {\n const markerLine = state.line\n state.position += 3\n skipSeparationSpace(state, true)\n if (state.line === markerLine && state.position < state.length) {\n throwError(state, 'end of the stream or a document separator is expected')\n }\n }\n }\n\n const documentEvent = state.events[documentEventIndex]\n if (documentEvent?.type === EVENT_DOCUMENT) documentEvent.explicitEnd = explicitEnd\n\n addPopEvent(state)\n\n if (!explicitEnd &&\n state.position < state.length &&\n !(state.position === state.lineStart && testDocumentSeparator(state))) {\n throwError(state, 'end of the stream or a document separator is expected')\n }\n}\n\nfunction parseEvents (input: string, options: ParserOptions): Event[] {\n const length = input.length\n const state: ParserState = {\n ...DEFAULT_PARSER_OPTIONS,\n ...options,\n input: `${input}\\0`,\n length,\n position: 0,\n line: 0,\n lineStart: 0,\n lineIndent: 0,\n firstTabInLine: -1,\n depth: 0,\n directives: [],\n tagHandlers: Object.create(null),\n events: []\n }\n\n const nullpos = input.indexOf('\\0')\n if (nullpos !== -1) throwErrorAt(input, nullpos, 'null byte is not allowed in input', state.filename)\n\n if (state.input.charCodeAt(state.position) === 0xFEFF) state.position++\n\n while (state.position < state.length) {\n skipSeparationSpace(state, true)\n if (state.position >= state.length) break\n const documentStart = state.position\n readDocument(state)\n if (state.position === documentStart) {\n // Internal progress guard: if readDocument() ever returns without\n // consuming input, stop here instead of looping forever.\n /* c8 ignore next */\n throwError(state, 'can not read a document')\n }\n }\n\n return state.events\n}\n\nexport {\n parseEvents,\n DEFAULT_PARSER_OPTIONS,\n type ParserOptions\n}\n","import { YAMLException } from './common/exception.ts'\nimport { pick } from './common/object.ts'\nimport {\n constructFromEvents,\n DEFAULT_CONSTRUCTOR_OPTIONS,\n type ConstructorOptions\n} from './parser/constructor.ts'\nimport {\n parseEvents,\n DEFAULT_PARSER_OPTIONS,\n type ParserOptions\n} from './parser/parser.ts'\n\n// `source` is supplied by `loadDocuments` itself, not by the public caller.\ninterface LoadOptions extends ParserOptions, Omit<ConstructorOptions, 'source'> {}\n\ntype LoadAllIterator = (document: unknown) => void\n\nconst DEFAULT_LOAD_OPTIONS: Required<LoadOptions> = {\n ...DEFAULT_PARSER_OPTIONS,\n ...DEFAULT_CONSTRUCTOR_OPTIONS\n}\n\nfunction loadDocuments (input: string, options: LoadOptions = {}) {\n const opts = { ...DEFAULT_LOAD_OPTIONS, ...options }\n const source = String(input)\n\n const PARSER_OPT_KEYS = Object.keys(DEFAULT_PARSER_OPTIONS) as\n (keyof typeof DEFAULT_PARSER_OPTIONS)[]\n const CONSTRUCTOR_OPT_KEYS = Object.keys(DEFAULT_CONSTRUCTOR_OPTIONS) as\n (keyof typeof DEFAULT_CONSTRUCTOR_OPTIONS)[]\n\n const events = parseEvents(source, pick(opts, PARSER_OPT_KEYS))\n return constructFromEvents(events, { ...pick(opts, CONSTRUCTOR_OPT_KEYS), source })\n}\n\n// Signatures with iterator are deprecated. Will be removed in the next versions.\nfunction loadAll (input: string, options?: LoadOptions): unknown[]\nfunction loadAll (input: string, iterator: null, options?: LoadOptions): unknown[]\nfunction loadAll (input: string, iterator: LoadAllIterator, options?: LoadOptions): void\nfunction loadAll (\n input: string,\n iteratorOrOptions?: LoadAllIterator | LoadOptions | null,\n options?: LoadOptions\n) {\n let iterator: LoadAllIterator | null = null\n\n if (typeof iteratorOrOptions === 'function') {\n iterator = iteratorOrOptions\n } else if (iteratorOrOptions !== null && typeof iteratorOrOptions === 'object') {\n options = iteratorOrOptions\n }\n\n const documents = loadDocuments(input, options)\n\n if (iterator === null) return documents\n for (const document of documents) iterator(document)\n}\n\nfunction load (input: string, options?: LoadOptions) {\n const documents = loadDocuments(input, options)\n\n if (documents.length === 0) throw new YAMLException('expected a document, but the input is empty')\n if (documents.length === 1) return documents[0]\n\n throw new YAMLException('expected a single document in the stream, but found more')\n}\n\nexport {\n load,\n loadAll,\n type LoadOptions\n}\n","// Plain-object discriminated union shared by the dumper (built by `jsToAst`,\n// rendered by the presenter) and, later, by load. Behaviour lives in the walkers,\n// not on the nodes.\n\nimport { type DocumentDirective } from '../parser/events.ts'\n\nclass Style {\n tagged = false\n flow = false\n singleQuoted = false\n doubleQuoted = false\n literal = false\n folded = false\n}\n\ninterface NodeBase {\n // YAML tag. Untagged nodes carry the semantic resolved tag; tagged nodes carry\n // the printable/verbatim tag spelling.\n tag: string\n style: Style\n anchor?: string\n\n // Reserved for the formatting layer; not populated by the dumper yet.\n commentBefore?: string\n comment?: string\n commentAfter?: string\n blankBefore?: number\n}\n\ninterface ScalarNode extends NodeBase {\n kind: 'scalar'\n value: string\n}\n\ninterface SequenceNode extends NodeBase {\n kind: 'sequence'\n items: Node[]\n}\n\ninterface MappingNode extends NodeBase {\n kind: 'mapping'\n items: Array<{ key: Node, value: Node }>\n}\n\ninterface AliasNode extends NodeBase {\n kind: 'alias'\n // The anchor name this alias points at (`*name`).\n anchor: string\n}\n\ntype Node = ScalarNode | SequenceNode | MappingNode | AliasNode\n\n// The layer above `Node`: each document wraps one content node plus its own\n// markers/directives. Not a member of `Node` — the fields differ. Document\n// directives are ordered presentation data.\ninterface Document {\n contents: Node | null // null = empty document\n explicitStart?: boolean // print '---'\n explicitEnd?: boolean // print '...'\n directives: DocumentDirective[]\n}\n\nexport {\n Style,\n\n type Node,\n type Document,\n type NodeBase,\n type ScalarNode,\n type SequenceNode,\n type MappingNode,\n type AliasNode\n}\n","// JS value graph → AST. Knows tags (`identify` / `represent`). A single\n// identity-`Map` walk handles dedup: a repeat occurrence of an object (including\n// a cycle) becomes an `alias`, and the first occurrence gets an `anchor`.\n\nimport { YAMLException } from '../common/exception.ts'\nimport { type Schema } from '../schema.ts'\nimport { type TagDefinition } from '../tag.ts'\nimport { tagNameShort } from '../common/tagname.ts'\nimport {\n Style,\n type Document,\n type Node,\n type ScalarNode,\n type SequenceNode,\n type MappingNode\n} from './nodes.ts'\n\ninterface FromJsOptions {\n noRefs?: boolean\n skipInvalid?: boolean\n}\n\n// A match candidate. `implicitTag` means the tag is not printed (implicit\n// scalars and the default str/seq/map tags).\ninterface RepresentType {\n tag: TagDefinition\n implicitTag: boolean\n}\n\n// Returned by `build` when no tag matched.\nconst INVALID = Symbol('INVALID')\n\ninterface FromJsState {\n representTypes: RepresentType[]\n noRefs: boolean\n skipInvalid: boolean\n\n // Already-built collection values → their node, for anchor/alias dedup.\n refs: Map<unknown, Node>\n refCounter: number\n}\n\nfunction buildRepresentTypes (schema: Schema): RepresentType[] {\n const defaultTags = new Set<TagDefinition>([\n schema.defaultScalarTag,\n schema.defaultSequenceTag,\n schema.defaultMappingTag\n ].filter((t): t is TagDefinition => t !== undefined))\n\n // Default container/str tags go last so a more specific tag identifying the\n // same JS value (e.g. a custom tag on a plain object) wins.\n const implicitScalars = schema.implicitScalarTags\n const explicitTags = schema.tags.filter(t =>\n !(t.nodeKind === 'scalar' && t.implicit) && !defaultTags.has(t))\n const defaultTagsLast = schema.tags.filter(t => defaultTags.has(t))\n\n return [\n ...implicitScalars.map(tag => ({ tag, implicitTag: true })),\n ...explicitTags.map(tag => ({ tag, implicitTag: false })),\n ...defaultTagsLast.map(tag => ({ tag, implicitTag: true }))\n ]\n}\n\n// First tag whose `identify` accepts `object`.\nfunction matchTag (state: FromJsState, object: unknown): { tag: TagDefinition, tagName: string, implicitTag: boolean } | null {\n for (let index = 0, length = state.representTypes.length; index < length; index += 1) {\n const { tag, implicitTag } = state.representTypes[index]\n\n if (tag.identify && tag.identify(object)) {\n let tagName: string\n if (tag.matchByTagPrefix && tag.representTagName) {\n tagName = tag.representTagName(object)\n } else {\n tagName = tag.tagName\n }\n return { tag, tagName, implicitTag }\n }\n }\n\n return null\n}\n\n// Build a node for `object`, or INVALID when no tag matches. `undefined` never\n// throws (caller decides: null in a sequence, skip in a mapping, '' at root);\n// any other unrepresentable value throws unless `skipInvalid`.\nfunction build (state: FromJsState, object: unknown): Node | typeof INVALID {\n if (!state.noRefs && object !== null && typeof object === 'object') {\n const existing = state.refs.get(object)\n if (existing) {\n if (existing.anchor === undefined) existing.anchor = `ref_${state.refCounter++}`\n return { kind: 'alias', tag: '', style: new Style(), anchor: existing.anchor }\n }\n }\n\n const matched = matchTag(state, object)\n\n if (!matched) {\n if (object === undefined) return INVALID\n if (state.skipInvalid) return INVALID\n throw new YAMLException(`unacceptable kind of an object to dump ${Object.prototype.toString.call(object)}`)\n }\n\n const { tag, tagName, implicitTag } = matched\n const nodeTagName = implicitTag ? tagName : tagNameShort(tagName)\n\n if (tag.nodeKind === 'scalar') {\n const style = new Style()\n style.tagged = !implicitTag\n const node: ScalarNode = {\n kind: 'scalar',\n tag: nodeTagName,\n style,\n value: tag.represent(object)\n }\n return node\n }\n\n if (tag.nodeKind === 'sequence') {\n const container = tag.represent(object)\n const style = new Style()\n style.tagged = !implicitTag\n const node: SequenceNode = { kind: 'sequence', tag: nodeTagName, style, items: [] }\n if (!state.noRefs) state.refs.set(object, node)\n\n for (let index = 0, length = container.length; index < length; index += 1) {\n let item = build(state, container[index])\n // An invalid element becomes null; a still-invalid null then skips/throws.\n if (item === INVALID && container[index] === undefined) item = build(state, null)\n if (item === INVALID) continue\n node.items.push(item)\n }\n return node\n }\n\n // mapping — the canonical form is always a `Map`.\n const map = tag.represent(object)\n const style = new Style()\n style.tagged = !implicitTag\n const node: MappingNode = { kind: 'mapping', tag: nodeTagName, style, items: [] }\n if (!state.noRefs) state.refs.set(object, node)\n\n for (const [objectKey, objectValue] of map) {\n const key = build(state, objectKey)\n if (key === INVALID) continue // invalid key skips the pair\n const value = build(state, objectValue)\n if (value === INVALID) continue // invalid value skips the pair\n node.items.push({ key, value })\n }\n return node\n}\n\n// A JS value is one YAML document. An unrepresentable root becomes an empty\n// document, which the presenter renders as an empty string.\nfunction jsToAst (input: unknown, schema: Schema, options: FromJsOptions = {}): Document[] {\n const state: FromJsState = {\n representTypes: buildRepresentTypes(schema),\n noRefs: options.noRefs ?? false,\n skipInvalid: options.skipInvalid ?? false,\n refs: new Map(),\n refCounter: 0\n }\n\n const root = build(state, input)\n return [{ contents: root === INVALID ? null : root, directives: [] }]\n}\n\nexport {\n jsToAst,\n type FromJsOptions\n}\n","// Depth-first AST traversal. Mirrors the `kind` walk of the presenter and the\n// `from_*` builders, but stays read-oriented: nodes are plain objects, so a\n// visitor mutates them in place. Control signals let it prune or stop the walk.\n\nimport {\n type Node,\n type Document\n} from './nodes.ts'\n\n// Returned by a visitor to control the walk; anything else (incl. `undefined`)\n// descends as usual.\nconst VISIT_BREAK = Symbol('visit:break') // stop the whole traversal\nconst VISIT_SKIP = Symbol('visit:skip') // don't descend into this node's children\n\ntype VisitControl = typeof VISIT_BREAK | typeof VISIT_SKIP | undefined | void\n\n// Traversal-derived position of the current node. Kept off the node itself: a\n// node may sit in several places (alias/dedup reuse), so depth/role belong to\n// the walk, not the node. `parent.kind` + `isKey` pin the exact slot.\ninterface VisitContext {\n depth: number // 0 = document content root\n parent: Node | null // enclosing sequence/mapping, null at the root\n isKey: boolean // node sits in a mapping key position\n}\n\ntype Visitor = (node: Node, ctx: VisitContext) => VisitControl\n\n// Returns `true` once `VISIT_BREAK` was seen, so callers can unwind the walk.\nfunction visitNode (node: Node, visitor: Visitor, ctx: VisitContext): boolean {\n const control = visitor(node, ctx)\n if (control === VISIT_BREAK) return true\n if (control === VISIT_SKIP) return false\n\n const depth = ctx.depth + 1\n\n switch (node.kind) {\n case 'sequence':\n for (const item of node.items) {\n if (visitNode(item, visitor, { depth, parent: node, isKey: false })) return true\n }\n break\n case 'mapping':\n for (const { key, value } of node.items) {\n if (visitNode(key, visitor, { depth, parent: node, isKey: true })) return true\n if (visitNode(value, visitor, { depth, parent: node, isKey: false })) return true\n }\n break\n }\n\n return false\n}\n\n// Walk every node in the documents, calling `visitor` once per node (pre-order).\nfunction visit (documents: Document[], visitor: Visitor): void {\n for (const doc of documents) {\n if (doc.contents && visitNode(doc.contents, visitor, { depth: 0, parent: null, isKey: false })) return\n }\n}\n\nexport {\n visit,\n VISIT_BREAK,\n VISIT_SKIP,\n type Visitor,\n type VisitContext\n}\n","// AST → text. Walks the node `kind`; the scalar machinery (style selection,\n// quoting, folding) is driven by node text, not by sniffing a JS value.\n\nimport { YAMLException } from '../common/exception.ts'\nimport { tagNameShort } from '../common/tagname.ts'\nimport { type Schema } from '../schema.ts'\nimport { NOT_RESOLVED, type ScalarTagDefinition } from '../tag.ts'\nimport {\n type Node,\n type Document,\n type ScalarNode,\n type SequenceNode,\n type MappingNode\n} from './nodes.ts'\n\nconst CHAR_BOM = 0xFEFF\nconst CHAR_TAB = 0x09 /* Tab */\nconst CHAR_LINE_FEED = 0x0A /* LF */\nconst CHAR_CARRIAGE_RETURN = 0x0D /* CR */\nconst CHAR_SPACE = 0x20 /* Space */\nconst CHAR_EXCLAMATION = 0x21 /* ! */\nconst CHAR_DOUBLE_QUOTE = 0x22 /* \" */\nconst CHAR_SHARP = 0x23 /* # */\nconst CHAR_PERCENT = 0x25 /* % */\nconst CHAR_AMPERSAND = 0x26 /* & */\nconst CHAR_SINGLE_QUOTE = 0x27 /* ' */\nconst CHAR_ASTERISK = 0x2A /* * */\nconst CHAR_COMMA = 0x2C /* , */\nconst CHAR_MINUS = 0x2D /* - */\nconst CHAR_COLON = 0x3A /* : */\nconst CHAR_EQUALS = 0x3D /* = */\nconst CHAR_GREATER_THAN = 0x3E /* > */\nconst CHAR_QUESTION = 0x3F /* ? */\nconst CHAR_COMMERCIAL_AT = 0x40 /* @ */\nconst CHAR_LEFT_SQUARE_BRACKET = 0x5B /* [ */\nconst CHAR_RIGHT_SQUARE_BRACKET = 0x5D /* ] */\nconst CHAR_GRAVE_ACCENT = 0x60 /* ` */\nconst CHAR_LEFT_CURLY_BRACKET = 0x7B /* { */\nconst CHAR_VERTICAL_LINE = 0x7C /* | */\nconst CHAR_RIGHT_CURLY_BRACKET = 0x7D /* } */\n\nconst ESCAPE_SEQUENCES: Record<number, string> = {}\n\nESCAPE_SEQUENCES[0x00] = '\\\\0'\nESCAPE_SEQUENCES[0x07] = '\\\\a'\nESCAPE_SEQUENCES[0x08] = '\\\\b'\nESCAPE_SEQUENCES[0x09] = '\\\\t'\nESCAPE_SEQUENCES[0x0A] = '\\\\n'\nESCAPE_SEQUENCES[0x0B] = '\\\\v'\nESCAPE_SEQUENCES[0x0C] = '\\\\f'\nESCAPE_SEQUENCES[0x0D] = '\\\\r'\nESCAPE_SEQUENCES[0x1B] = '\\\\e'\nESCAPE_SEQUENCES[0x22] = '\\\\\"'\nESCAPE_SEQUENCES[0x5C] = '\\\\\\\\'\nESCAPE_SEQUENCES[0x85] = '\\\\N'\nESCAPE_SEQUENCES[0xA0] = '\\\\_'\nESCAPE_SEQUENCES[0x2028] = '\\\\L'\nESCAPE_SEQUENCES[0x2029] = '\\\\P'\n\ninterface PresenterOptions {\n schema: Schema\n indent?: number\n seqNoIndent?: boolean\n seqInlineFirst?: boolean\n sortKeys?: boolean | ((a: any, b: any) => number)\n lineWidth?: number\n flowBracketPadding?: boolean\n flowSkipCommaSpace?: boolean\n flowSkipColonSpace?: boolean\n quoteFlowKeys?: boolean\n quoteStyle?: 'single' | 'double'\n forceQuotes?: boolean\n tagBeforeAnchor?: boolean\n}\n\nconst DEFAULT_PRESENTER_OPTIONS: Required<Omit<PresenterOptions, 'schema'>> = {\n indent: 2,\n seqNoIndent: false,\n seqInlineFirst: true,\n sortKeys: false,\n lineWidth: 80,\n flowBracketPadding: false,\n flowSkipCommaSpace: false,\n flowSkipColonSpace: false,\n quoteFlowKeys: false,\n quoteStyle: 'single',\n forceQuotes: false,\n tagBeforeAnchor: false\n}\n\ninterface PresenterState extends Required<PresenterOptions> {\n defaultScalarTagName: string\n implicitResolvers: readonly ScalarTagDefinition[]\n}\n\nfunction nodeTagShort (node: Node) {\n return node.style.tagged ? node.tag : tagNameShort(node.tag)\n}\n\nfunction createPresenterState (options: PresenterOptions): PresenterState {\n const opts = {\n ...DEFAULT_PRESENTER_OPTIONS,\n ...options\n }\n\n return {\n ...opts,\n defaultScalarTagName: opts.schema.defaultScalarTag.tagName,\n implicitResolvers: opts.schema.implicitScalarTags\n }\n}\n\nfunction encodeNonPrintable (character: number) {\n // YAML non-printable code points are all in BMP (max FFFF);\n // astral code points are printable and can't come here.\n const string = character.toString(16).toUpperCase()\n const handle = character <= 0xFF ? 'x' : 'u'\n const length = character <= 0xFF ? 2 : 4\n\n return `\\\\${handle}${'0'.repeat(length - string.length)}${string}`\n}\n\n// Indents every line in a string. Empty lines (\\n only) are not indented.\nfunction indentString (string: string, spaces: number) {\n const ind = ' '.repeat(spaces)\n let position = 0\n let result = ''\n const length = string.length\n\n while (position < length) {\n let line\n const next = string.indexOf('\\n', position)\n if (next === -1) {\n line = string.slice(position)\n position = length\n } else {\n line = string.slice(position, next + 1)\n position = next + 1\n }\n\n if (line.length && line !== '\\n') result += ind\n\n result += line\n }\n\n return result\n}\n\nfunction generateNextLine (state: PresenterState, level: number) {\n return `\\n${' '.repeat(state.indent * level)}`\n}\n\n// Indentation/width numbers that govern how a scalar lays out at `level`.\n// Scalar-only: collections compute their own indent via `generateNextLine`.\n// indent - spaces prepended to the scalar's content (block styles)\n// blockIndent - the block indentation indicator digit (`|2` / `>2`); at the\n// document root (level 0) it is one greater than the spaces we\n// actually prepend (reader applies it relative to parent n = -1)\n// lineWidth - fold width at this depth, shrinking monotonically toward\n// min(state.lineWidth, 40) as indentation deepens; -1 = no limit\nfunction scalarLayout (state: PresenterState, level: number) {\n const indent = state.indent * Math.max(1, level) // no 0-indent scalars\n const blockIndent = level === 0 ? state.indent + 1 : state.indent\n const lineWidth = (state.lineWidth === -1)\n ? -1\n : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent)\n\n return { indent, blockIndent, lineWidth }\n}\n\nfunction resolveImplicitTag (state: PresenterState, str: string) {\n for (let index = 0, length = state.implicitResolvers.length; index < length; index += 1) {\n const tagDefinition = state.implicitResolvers[index]\n\n if (tagDefinition.resolve(str, false, tagDefinition.tagName) !== NOT_RESOLVED) {\n return tagDefinition.tagName\n }\n }\n\n return state.defaultScalarTagName\n}\n\n// [33] s-white ::= s-space | s-tab\nfunction isWhitespace (c: number) {\n return c === CHAR_SPACE || c === CHAR_TAB\n}\n\n// Mirrors parser.testDocumentSeparator(): `---` and `...` are document\n// markers when followed by separation whitespace, a line break, or EOF.\nfunction startsWithDocumentSeparator (string: string) {\n const marker = string.charCodeAt(0)\n\n if ((marker !== CHAR_MINUS && marker !== 0x2E/* . */) ||\n string.charCodeAt(1) !== marker || string.charCodeAt(2) !== marker) return false\n\n if (string.length === 3) return true\n\n const following = string.charCodeAt(3)\n return isWhitespace(following) ||\n following === CHAR_CARRIAGE_RETURN || following === CHAR_LINE_FEED\n}\n\n// Returns true if the character can be printed without escaping.\n// From YAML 1.2: \"any allowed characters known to be non-printable\n// should also be escaped. [However,] This isn’t mandatory\"\n// Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\nfunction isPrintable (c: number) {\n return (c >= 0x00020 && c <= 0x00007E) ||\n ((c >= 0x000A1 && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029) ||\n ((c >= 0x0E000 && c <= 0x00FFFD) && c !== CHAR_BOM) ||\n (c >= 0x10000 && c <= 0x10FFFF)\n}\n\n// [34] ns-char ::= nb-char - s-white\n// [27] nb-char ::= c-printable - b-char - c-byte-order-mark\n// [26] b-char ::= b-line-feed | b-carriage-return\n// Including s-white (for some reason, examples doesn't match specs in this aspect)\n// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark\nfunction isNsCharOrWhitespace (c: number) {\n return isPrintable(c) &&\n c !== CHAR_BOM &&\n // - b-char\n c !== CHAR_CARRIAGE_RETURN &&\n c !== CHAR_LINE_FEED\n}\n\n// [127] ns-plain-safe(c) ::= c = flow-out ⇒ ns-plain-safe-out\n// c = flow-in ⇒ ns-plain-safe-in\n// c = block-key ⇒ ns-plain-safe-out\n// c = flow-key ⇒ ns-plain-safe-in\n// [128] ns-plain-safe-out ::= ns-char\n// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator\n// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - “:” - “#” )\n// | ( /* An ns-char preceding */ “#” )\n// | ( “:” /* Followed by an ns-plain-safe(c) */ )\n// `prev` is the previous code point, or -1 when `c` is the first character\n// (no preceding character). -1 is not a valid code point, so it can never\n// collide with a real one and safely disables the prev-dependent cases below.\nfunction isPlainSafe (c: number, prev: number, inblock: boolean) {\n const cIsNsCharOrWhitespace = isNsCharOrWhitespace(c)\n const cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c)\n return (\n (\n // ns-plain-safe\n inblock // c = flow-in\n ? cIsNsCharOrWhitespace\n : cIsNsCharOrWhitespace &&\n // - c-flow-indicator\n c !== CHAR_COMMA &&\n c !== CHAR_LEFT_SQUARE_BRACKET &&\n c !== CHAR_RIGHT_SQUARE_BRACKET &&\n c !== CHAR_LEFT_CURLY_BRACKET &&\n c !== CHAR_RIGHT_CURLY_BRACKET\n ) &&\n // ns-plain-char\n c !== CHAR_SHARP && // false on '#'\n !(prev === CHAR_COLON && !cIsNsChar)\n ) || // false on ': '\n (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) || // change to true on '[^ ]#'\n (prev === CHAR_COLON && cIsNsChar) // change to true on ':[^ ]'\n}\n\n// Simplified test for values allowed as the first character in plain style.\nfunction isPlainSafeFirst (c: number) {\n // Uses a subset of ns-char - c-indicator\n // where ns-char = nb-char - s-white.\n // No support of ( ( “?” | “:” | “-” ) /* Followed by an ns-plain-safe(c)) */ ) part\n return isPrintable(c) &&\n c !== CHAR_BOM &&\n !isWhitespace(c) && // - s-white\n // - (c-indicator ::=\n // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}”\n c !== CHAR_MINUS &&\n c !== CHAR_QUESTION &&\n c !== CHAR_COLON &&\n c !== CHAR_COMMA &&\n c !== CHAR_LEFT_SQUARE_BRACKET &&\n c !== CHAR_RIGHT_SQUARE_BRACKET &&\n c !== CHAR_LEFT_CURLY_BRACKET &&\n c !== CHAR_RIGHT_CURLY_BRACKET &&\n // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “\"”\n c !== CHAR_SHARP &&\n c !== CHAR_AMPERSAND &&\n c !== CHAR_ASTERISK &&\n c !== CHAR_EXCLAMATION &&\n c !== CHAR_VERTICAL_LINE &&\n c !== CHAR_EQUALS &&\n c !== CHAR_GREATER_THAN &&\n c !== CHAR_SINGLE_QUOTE &&\n c !== CHAR_DOUBLE_QUOTE &&\n // | “%” | “@” | “`”)\n c !== CHAR_PERCENT &&\n c !== CHAR_COMMERCIAL_AT &&\n c !== CHAR_GRAVE_ACCENT\n}\n\nfunction isPlainSafeAtStart (string: string, inblock: boolean) {\n const first = codePointAt(string, 0)\n\n if (isPlainSafeFirst(first)) return true\n\n if (\n string.length > 1 &&\n (first === CHAR_MINUS || first === CHAR_QUESTION || first === CHAR_COLON)\n ) {\n const second = codePointAt(string, 1)\n\n // The relaxed isPlainSafe() accepts whitespace inside a scalar, but the\n // indicator exception in ns-plain-first requires an ns-plain-safe\n // *non-space* character. Otherwise `- value` and `? value` start block\n // collections instead of plain scalars.\n return !isWhitespace(second) && isPlainSafe(second, first, inblock)\n }\n\n return false\n}\n\n// Simplified test for values allowed as the last character in plain style.\nfunction isPlainSafeLast (c: number) {\n // just not whitespace or colon, it will be checked to be plain character later\n return !isWhitespace(c) && c !== CHAR_COLON\n}\n\n// Same as 'string'.codePointAt(pos), but works in older browsers.\nfunction codePointAt (string: string, pos: number) {\n const first = string.charCodeAt(pos)\n let second\n\n if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {\n second = string.charCodeAt(pos + 1)\n if (second >= 0xDC00 && second <= 0xDFFF) {\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000\n }\n }\n return first\n}\n\nfunction needIndentIndicator (string: string) {\n const leadingSpaceRe = /^\\n* /\n return leadingSpaceRe.test(string)\n}\n\nconst STYLE_PLAIN = 1\nconst STYLE_SINGLE = 2\nconst STYLE_LITERAL = 3\nconst STYLE_FOLDED = 4\nconst STYLE_DOUBLE = 5\n\ntype ScalarStyleId =\n typeof STYLE_PLAIN |\n typeof STYLE_SINGLE |\n typeof STYLE_LITERAL |\n typeof STYLE_FOLDED |\n typeof STYLE_DOUBLE\n\n// Determines which scalar styles are possible and returns the preferred style.\n// lineWidth = -1 => no limit.\n// Pre-conditions: str.length > 0.\n// Post-conditions:\n// STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\nfunction chooseScalarStyle (state: PresenterState, string: string, layout: ReturnType<typeof scalarLayout>,\n singleLineOnly: boolean, forceQuote: boolean, inblock: boolean): ScalarStyleId {\n const { blockIndent, lineWidth } = layout\n let i\n let char = 0\n let prevChar = -1 // -1 = no previous character yet (see isPlainSafe)\n let hasLineBreak = false\n let hasFoldableLine = false // only checked if shouldTrackWidth\n const shouldTrackWidth = lineWidth !== -1\n let previousLineBreak = -1 // count the first line correctly\n // Document markers are recognized as whole tokens at the start of a line,\n // so character-level plain-scalar checks alone cannot reject them.\n let plain = !startsWithDocumentSeparator(string) &&\n isPlainSafeAtStart(string, inblock) &&\n isPlainSafeLast(codePointAt(string, string.length - 1))\n\n if (singleLineOnly || forceQuote) {\n // Case: no block styles.\n // Check for disallowed characters to rule out plain and single.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i)\n if (!isPrintable(char)) {\n return STYLE_DOUBLE\n }\n plain = plain && isPlainSafe(char, prevChar, inblock)\n prevChar = char\n }\n } else {\n // Case: block styles permitted.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i)\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true\n // Check if any line can be folded.\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n // Foldable line = too long, and not more-indented.\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' ')\n previousLineBreak = i\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE\n }\n plain = plain && isPlainSafe(char, prevChar, inblock)\n prevChar = char\n }\n // in case the end is missing a \\n\n hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' '))\n }\n // Although every style can represent \\n without escaping, prefer block styles\n // for multiline, since they're more readable and they don't add empty lines.\n // Also prefer folding a super-long line.\n if (!hasLineBreak && !hasFoldableLine) {\n // Syntactic verdict only: whether the bare text round-trips to the node's\n // tag is a semantic check the caller applies (see resolveScalarStyle).\n if (plain && !forceQuote) return STYLE_PLAIN\n return state.quoteStyle === 'double' ? STYLE_DOUBLE : STYLE_SINGLE\n }\n // Edge case: block indentation indicator can only have one digit.\n if (blockIndent > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE\n }\n // At this point we know block styles are valid.\n // Prefer literal style unless we want to fold.\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL\n}\n\n// Renders `string` in the given numeric style with the given layout.\n// NB. We drop the last trailing newline (if any) of a returned block scalar\n// since the dumper adds its own newline. This always works:\n// • No ending newline => unaffected; already using strip \"-\" chomping.\n// • Ending newline => removed then restored.\n// Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\nfunction renderScalarStyle (string: string, style: ScalarStyleId, layout: ReturnType<typeof scalarLayout>) {\n const { indent, blockIndent, lineWidth } = layout\n\n switch (style) {\n case STYLE_PLAIN:\n return encodeFlowBreaks(string, indent)\n case STYLE_SINGLE:\n return `'${encodeFlowBreaks(string, indent).replace(/'/g, \"''\")}'`\n case STYLE_LITERAL:\n return '|' + blockHeader(string, blockIndent) +\n dropEndingNewline(indentString(string, indent))\n case STYLE_FOLDED:\n return '>' + blockHeader(string, blockIndent) +\n dropEndingNewline(indentString(foldBlockScalar(string, lineWidth), indent))\n case STYLE_DOUBLE:\n return `\"${escapeString(string)}\"`\n }\n}\n\n// Picks the scalar style for `node`: a style hint carried on the node wins,\n// otherwise the style chosen by the machinery. Returns a numeric STYLE_*.\nfunction resolveScalarStyle (state: PresenterState, node: ScalarNode,\n layout: ReturnType<typeof scalarLayout>, iskey: boolean, inblock: boolean): ScalarStyleId {\n // Without knowing if keys are implicit/explicit, assume implicit for safety.\n const singleLineOnly = iskey || !inblock\n\n // Style hints carried on the node take precedence. They were valid in their\n // original context; only a parent change can break them, and only block\n // styles in a single-line context — quoted styles survive any context. A\n // rejected block hint falls through to selection by content below.\n if (node.style.singleQuoted) return STYLE_SINGLE\n if (node.style.doubleQuoted) return STYLE_DOUBLE\n if (!singleLineOnly) {\n if (node.style.literal) return STYLE_LITERAL\n if (node.style.folded) return STYLE_FOLDED\n }\n\n const string = node.value\n\n if (string.length === 0) {\n // An empty scalar is safe when its tag is explicit or resolves back to the\n // node tag (notably, the default null representation). A real empty string\n // does neither and therefore remains quoted.\n if (node.style.tagged || resolveImplicitTag(state, string) === node.tag) return STYLE_PLAIN\n return state.quoteStyle === 'double' ? STYLE_DOUBLE : STYLE_SINGLE\n }\n\n // v4's forceQuotes deliberately excluded keys. Keys are still quoted when\n // syntax or tag resolution requires it, using quoteStyle as the preference.\n const style = chooseScalarStyle(\n state, string, layout, singleLineOnly, state.forceQuotes && !iskey, inblock)\n\n // Plain writes no tag, so it round-trips only if the bare text resolves back\n // to the node's tag (or the tag gets printed explicitly). Else downgrade.\n // Downgrade to the preferred quote style here.\n if (style === STYLE_PLAIN && !node.style.tagged && resolveImplicitTag(state, string) !== node.tag) {\n return state.quoteStyle === 'double' ? STYLE_DOUBLE : STYLE_SINGLE\n }\n return style\n}\n\n// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\nfunction blockHeader (string: string, indentPerLevel: number) {\n const indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ''\n\n // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n const clip = string[string.length - 1] === '\\n'\n const keep = clip && (string[string.length - 2] === '\\n' || string === '\\n')\n const chomp = keep ? '+' : (clip ? '' : '-')\n\n return `${indentIndicator}${chomp}\\n`\n}\n\n// Flow scalars (plain, single-quoted) fold line breaks: a run of k source line\n// breaks reparses to k-1 literal `\\n`. So a single break is just line-wrapping\n// (folds back to a space), while a literal `\\n` in the value must be emitted as\n// a blank line (two breaks). Encode each run of p literal `\\n` as p+1 breaks and\n// indent the following content line so the continuation isn't read as a new node\n// (a bare break would yield invalid \"deficient indentation\" output).\n// `foldBlockScalar` can't be reused here: it treats a leading space as a\n// \"more-indented\" line and suppresses the doubling, which a flow scalar must not.\nfunction encodeFlowBreaks (string: string, indent: number) {\n let nextLF = string.indexOf('\\n')\n if (nextLF === -1) return string\n\n const pad = ' '.repeat(indent)\n let result = string.slice(0, nextLF) // first line follows the quote, no indent\n\n const lineRe = /(\\n+)([^\\n]*)/g\n lineRe.lastIndex = nextLF\n let match\n while ((match = lineRe.exec(string))) {\n const breaks = match[1].length\n const line = match[2]\n // line === '' only at the end (the greedy \\n+ leaves no empty line mid-string);\n // pad it so the closing quote carries indent instead of sitting at column 0.\n result += '\\n'.repeat(breaks + 1) + pad + line\n }\n\n return result\n}\n\n// Strips one trailing newline from a block scalar: the dumper adds its own,\n// so without this a \"+\" (keep) chomp would gain an extra blank line.\nfunction dropEndingNewline (string: string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string\n}\n\n// Note: a long line without a suitable break point will exceed the width limit.\n// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\nfunction foldBlockScalar (string: string, width: number) {\n // In folded style, $k$ consecutive newlines output as $k+1$ newlines—\n // unless they're before or after a more-indented line, or at the very\n // beginning or end, in which case $k$ maps to $k$.\n // Therefore, parse each chunk as newline(s) followed by a content line.\n const lineRe = /(\\n+)([^\\n]*)/g\n\n // first line (possibly an empty line)\n let nextLF = string.indexOf('\\n')\n if (nextLF === -1) nextLF = string.length\n lineRe.lastIndex = nextLF\n let result = foldLine(string.slice(0, nextLF), width)\n // If we haven't reached the first content line yet, don't add an extra \\n.\n let prevMoreIndented = string[0] === '\\n' || string[0] === ' '\n let moreIndented\n\n // rest of the lines\n let match\n while ((match = lineRe.exec(string))) {\n const prefix = match[1]\n const line = match[2]\n\n moreIndented = (line[0] === ' ')\n result += prefix +\n ((!prevMoreIndented && !moreIndented && line !== '') ? '\\n' : '') +\n foldLine(line, width)\n prevMoreIndented = moreIndented\n }\n\n return result\n}\n\n// Greedy line breaking.\n// Picks the longest line under the limit each time,\n// otherwise settles for the shortest line over the limit.\n// NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\nfunction foldLine (line: string, width: number) {\n if (line === '' || line[0] === ' ') return line\n\n // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n const breakRe = / [^ ]/g // note: the match index will always be <= length-2.\n let match\n // start is an inclusive index. end, curr, and next are exclusive.\n let start = 0\n let end\n let curr = 0\n let next = 0\n let result = ''\n\n // Invariants: 0 <= start <= length-1.\n // 0 <= curr <= next <= max(0, length-2). curr - start <= width.\n // Inside the loop:\n // A match implies length >= 2, so curr and next are <= length-2.\n while ((match = breakRe.exec(line))) {\n next = match.index\n // maintain invariant: curr - start <= width\n if (next - start > width) {\n end = (curr > start) ? curr : next // derive end <= length-2\n result += `\\n${line.slice(start, end)}`\n // skip the space that was output as \\n\n start = end + 1 // derive start <= length-1\n }\n curr = next\n }\n\n // By the invariants, start <= length-1, so there is something left over.\n // It is either the whole string or a part starting from non-whitespace.\n result += '\\n'\n // Insert a break if the remainder is too long and there is a break available.\n if (line.length - start > width && curr > start) {\n result += `${line.slice(start, curr)}\\n${line.slice(curr + 1)}`\n } else {\n result += line.slice(start)\n }\n\n return result.slice(1) // drop extra \\n joiner\n}\n\nfunction escapeString (string: string) {\n let result = ''\n let char = 0\n\n for (let i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i)\n const escapeSeq = ESCAPE_SEQUENCES[char]\n\n if (escapeSeq) {\n result += escapeSeq\n continue\n }\n\n if (isPrintable(char)) {\n result += string[i]\n if (char >= 0x10000) result += string[i + 1]\n continue\n }\n\n result += encodeNonPrintable(char)\n }\n\n return result\n}\n\nfunction writeFlowSequence (state: PresenterState, level: number, node: SequenceNode) {\n let result = ''\n\n for (let index = 0, length = node.items.length; index < length; index += 1) {\n const item = writeNode(state, level, node.items[index], {})\n if (result !== '') result += `,${!state.flowSkipCommaSpace ? ' ' : ''}`\n result += item\n }\n\n const pad = state.flowBracketPadding && result !== '' ? ' ' : ''\n return `[${pad}${result}${pad}]`\n}\n\nfunction writeBlockSequence (state: PresenterState, level: number, node: SequenceNode, compact: boolean) {\n let result = ''\n\n for (let index = 0, length = node.items.length; index < length; index += 1) {\n const item = writeNode(state, level + 1, node.items[index],\n { block: true, compact: state.seqInlineFirst, isblockseq: true })\n\n if (!compact || result !== '') {\n result += generateNextLine(state, level)\n }\n\n // No trailing space when the value renders empty (e.g. null → '').\n if (item === '' || CHAR_LINE_FEED === item.charCodeAt(0)) {\n result += '-'\n } else {\n result += '- '\n }\n\n result += item\n }\n\n return result\n}\n\nfunction writeFlowMapping (state: PresenterState, level: number, node: MappingNode) {\n let result = ''\n const items = sortMappingItems(state, node.items)\n\n for (const { key, value } of items) {\n let pairBuffer = ''\n if (result !== '') pairBuffer += `,${!state.flowSkipCommaSpace ? ' ' : ''}`\n\n const keyText = writeNode(state, level, key, { iskey: true })\n const explicitPair = keyText.length > 1024\n\n if (explicitPair) {\n pairBuffer += '? '\n } else if (state.quoteFlowKeys) {\n pairBuffer += '\"'\n }\n\n const valueText = writeNode(state, level, value, {})\n // No separating space when the value renders empty (e.g. null → '').\n const sep = state.flowSkipColonSpace || valueText === '' ? '' : ' '\n\n pairBuffer += `${keyText}${state.quoteFlowKeys && !explicitPair ? '\"' : ''}:${sep}${valueText}`\n\n result += pairBuffer\n }\n\n const pad = state.flowBracketPadding && result !== '' ? ' ' : ''\n return `{${pad}${result}${pad}}`\n}\n\n// A scalar key sorts by its text; the default sort and a custom comparator both\n// see that, matching the original keys-array sort.\nfunction sortKeyValue (key: Node): any {\n return key.kind === 'scalar' ? key.value : key\n}\n\nfunction sortMappingItems (state: PresenterState, items: MappingNode['items']) {\n if (!state.sortKeys) return items\n\n const copy = items.slice()\n\n if (state.sortKeys === true) {\n copy.sort((a, b) => {\n const x = sortKeyValue(a.key)\n const y = sortKeyValue(b.key)\n if (x < y) return -1\n if (x > y) return 1\n return 0\n })\n } else {\n const fn = state.sortKeys\n copy.sort((a, b) => fn(sortKeyValue(a.key), sortKeyValue(b.key)))\n }\n\n return copy\n}\n\nfunction writeBlockMapping (state: PresenterState, level: number, node: MappingNode, compact: boolean) {\n let result = ''\n const items = sortMappingItems(state, node.items)\n\n for (let index = 0, length = items.length; index < length; index += 1) {\n let pairBuffer = ''\n\n if (!compact || result !== '') {\n pairBuffer += generateNextLine(state, level)\n }\n\n const { key, value } = items[index]\n\n // A block key — a block collection (mapping/sequence) or a block scalar\n // (literal/folded) — can't sit on a `key:` line, so it's written with block\n // context and the pair takes the explicit `? key / : value` form. A simple\n // scalar key stays inline (flow-vs-block is invisible there).\n const keyIsBlock =\n ((key.kind === 'mapping' || key.kind === 'sequence') &&\n !key.style.flow && key.items.length !== 0) ||\n (key.kind === 'scalar' && (key.style.literal || key.style.folded))\n\n // The `?`/`:` indicators shift content right like a `-`, so a block key or\n // value that stays on the indicator line keeps its indentation under\n // seqNoIndent (`isblockseq`). One that drops to its own line (tag/anchor)\n // collapses to the parent indent, so leave the flag off there.\n const keyText = keyIsBlock\n ? writeNode(state, level + 1, key,\n { block: true, compact: true, isblockseq: !cannotBeCompact(state, key, level + 1) })\n : writeNode(state, level + 1, key, { block: true, compact: true, iskey: true })\n\n // Block key, over-long key, or multiline scalar key forces explicit form.\n // Multiline isn't a spec requirement — just matches pyyaml's simple-key rule.\n const keyHasLineBreak = key.kind === 'scalar' && key.value.indexOf('\\n') !== -1\n const explicitPair = keyIsBlock || keyHasLineBreak || keyText.length > 1024\n\n if (explicitPair) {\n if (keyText && CHAR_LINE_FEED === keyText.charCodeAt(0)) {\n pairBuffer += '?'\n } else {\n pairBuffer += '? '\n }\n }\n\n pairBuffer += keyText\n\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level)\n }\n\n const valueText = writeNode(state, level + 1, value,\n { block: true, compact: explicitPair, isblockseq: explicitPair && !cannotBeCompact(state, value, level + 1) })\n\n // Keep a space before the colon when the key text ends in a leading\n // property rather than scalar content, so the colon can't be read as part\n // of it. Two cases: an inline alias key (`*b : v`), and an empty scalar key\n // whose whole text is its anchor/tag (`&a :`, `!!str :`) — without the\n // space `&a:` reparses as an anchored value, dropping the null key.\n const keyIsBareProps = key.kind === 'scalar' && key.value === '' &&\n keyText !== '' &&\n keyText.charCodeAt(keyText.length - 1) !== CHAR_SINGLE_QUOTE &&\n keyText.charCodeAt(keyText.length - 1) !== CHAR_DOUBLE_QUOTE\n const keyColonSep = !explicitPair && (key.kind === 'alias' || keyIsBareProps) ? ' ' : ''\n\n // No trailing space when the value renders empty (e.g. null → '').\n if (valueText === '' || CHAR_LINE_FEED === valueText.charCodeAt(0)) {\n pairBuffer += `${keyColonSep}:`\n } else {\n pairBuffer += `${keyColonSep}: `\n }\n\n pairBuffer += valueText\n\n result += pairBuffer\n }\n\n return result\n}\n\n// Where a node sits relative to its parent — drives layout/style decisions.\n// All flags default to false (the flow-context, non-key, non-compact case).\ninterface NodeContext {\n block?: boolean // block context (vs flow); propagates downward\n compact?: boolean // may start on the current line (no leading newline)\n iskey?: boolean // node is a mapping key\n isblockseq?: boolean // content follows an indicator (`-`, or `?`/`:` in an\n // explicit pair) that already shifted it right; keeps\n // its indentation under seqNoIndent\n}\n\n// A node can't sit compact on its parent's indicator (`-`/`?`/`:`) line when it\n// carries leading props (tag/anchor) that would collide with the indicator, or\n// when the indent step is too narrow for the 2-char indicator. Such a node drops\n// to its own line; a block collection that does so also collapses its seqNoIndent\n// indentation back to the parent.\nfunction cannotBeCompact (state: PresenterState, node: Node, level: number) {\n return node.style.tagged || node.anchor !== undefined || (state.indent < 2 && level > 0)\n}\n\nfunction writeNode (state: PresenterState, level: number, node: Node, ctx: NodeContext): string {\n if (node.kind === 'alias') return `*${node.anchor}`\n\n const { block = false, iskey = false, isblockseq = false } = ctx\n let compact = ctx.compact ?? false\n\n const hasAnchor = node.anchor !== undefined\n\n if (cannotBeCompact(state, node, level)) {\n compact = false\n }\n\n let body: string\n let shouldPrintTag = node.style.tagged\n const useBlockCollection = block &&\n (node.kind === 'mapping' || node.kind === 'sequence') &&\n !node.style.flow && node.items.length !== 0\n\n if (node.kind === 'mapping') {\n if (useBlockCollection) {\n body = writeBlockMapping(state, level, node, compact)\n } else {\n body = writeFlowMapping(state, level, node)\n }\n } else if (node.kind === 'sequence') {\n if (useBlockCollection) {\n if (state.seqNoIndent && !isblockseq && level > 0) {\n body = writeBlockSequence(state, level - 1, node, compact)\n } else {\n body = writeBlockSequence(state, level, node, compact)\n }\n } else {\n body = writeFlowSequence(state, level, node)\n }\n } else {\n const layout = scalarLayout(state, level)\n const style = resolveScalarStyle(state, node, layout, iskey, block)\n body = renderScalarStyle(node.value, style, layout)\n shouldPrintTag = node.style.tagged || (style !== STYLE_PLAIN && node.tag !== state.defaultScalarTagName)\n }\n\n // An indicator plus its mandatory separator occupies 2 columns. For wider\n // indentation, pad a compact block collection so its first item starts at\n // the same column as the following items.\n if (useBlockCollection && compact && level > 0 && state.indent > 2) {\n body = `${' '.repeat(state.indent - 2)}${body}`\n }\n\n if (shouldPrintTag || hasAnchor) {\n const props: string[] = []\n const tag = shouldPrintTag ? nodeTagShort(node) : null\n const anchor = hasAnchor ? `&${node.anchor}` : null\n\n if (state.tagBeforeAnchor) {\n if (tag !== null) props.push(tag)\n if (anchor !== null) props.push(anchor)\n } else {\n if (anchor !== null) props.push(anchor)\n if (tag !== null) props.push(tag)\n }\n\n // No separator when the body is empty (e.g. `&anchor` on a null node) or\n // already starts on its own line.\n const sep = body === '' || body.charCodeAt(0) === CHAR_LINE_FEED ? '' : ' '\n body = `${props.join(' ')}${sep}${body}`\n }\n\n return body\n}\n\n// A bare (untagged, unanchored) non-empty block collection: writeNode renders it\n// in compact form with its first item on the opening line. That works mid-stream,\n// but right after a `---` the first item must drop to the next line. A tag/anchor\n// already forces the body onto its own line, so those stay on the `---` line.\nfunction rootStartsOwnLine (node: Node) {\n return (node.kind === 'sequence' || node.kind === 'mapping') &&\n !node.style.flow &&\n node.items.length !== 0 &&\n !node.style.tagged &&\n node.anchor === undefined\n}\n\n// A document whose serialization ends with a keep-chomped (`+`) block scalar is\n// open-ended: the trailing blank line(s) would otherwise be ambiguous, so it\n// needs a `...` terminator. Mirrors the keep test in `blockHeader`.\nfunction isOpenEnded (node: Node) {\n // Descend to the last leaf, always taking the last item of a block collection\n // (a flow collection renders on one line, so it ends the document itself).\n let leaf = node\n while ((leaf.kind === 'sequence' || leaf.kind === 'mapping') &&\n !leaf.style.flow && leaf.items.length !== 0) {\n leaf = leaf.kind === 'sequence'\n ? leaf.items[leaf.items.length - 1]\n : leaf.items[leaf.items.length - 1].value\n }\n\n if (leaf.kind !== 'scalar' || !(leaf.style.literal || leaf.style.folded)) return false\n const { value } = leaf\n // Keep chomping: ends in a blank line (`\\n\\n`) or is a lone `\\n`.\n return value.endsWith('\\n\\n') || value === '\\n'\n}\n\nfunction writeDocumentDirectives (doc: Document) {\n let result = ''\n\n for (const directive of doc.directives) {\n if (directive.kind === 'yaml') {\n result += `%YAML ${directive.version}\\n`\n continue\n }\n\n const { handle, prefix } = directive\n result += `%TAG ${handle} ${prefix}\\n`\n }\n\n return result\n}\n\n// Documents → text, including the trailing newline.\nfunction present (documents: Document[], options: PresenterOptions): string {\n const state = createPresenterState(options)\n let result = ''\n let previousEnded = false\n\n for (let index = 0; index < documents.length; index += 1) {\n const doc = documents[index]\n const directives = writeDocumentDirectives(doc)\n const hasDirectives = directives !== ''\n const marker = doc.explicitStart || hasDirectives || (index > 0 && !previousEnded)\n\n result += directives\n\n if (doc.contents === null) {\n if (marker) result += '---\\n'\n } else if (marker) {\n const body = writeNode(state, 0, doc.contents, { block: true, compact: true })\n // Content shares the `---` line, except: an empty render (no separator at\n // all), a bare block collection (wraps to the next line), or directives\n // forcing `---` onto its own line.\n const sep = body === '' ? '' : (hasDirectives || rootStartsOwnLine(doc.contents) ? '\\n' : ' ')\n result += `---${sep}${body}\\n`\n } else {\n result += writeNode(state, 0, doc.contents, { block: true, compact: true }) + '\\n'\n }\n\n previousEnded = doc.explicitEnd || (doc.contents !== null && isOpenEnded(doc.contents))\n if (previousEnded) {\n result += '...\\n'\n }\n }\n\n return result\n}\n\nexport {\n DEFAULT_PRESENTER_OPTIONS,\n present,\n type PresenterOptions\n}\n","import { YAML11_SCHEMA, type Schema } from './schema.ts'\nimport { jsToAst } from './ast/from_js.ts'\nimport { visit, VISIT_SKIP } from './ast/visit.ts'\nimport { type Document } from './ast/nodes.ts'\nimport {\n DEFAULT_PRESENTER_OPTIONS,\n present,\n type PresenterOptions\n} from './ast/presenter.ts'\nimport { pick } from './common/object.ts'\nimport { NOT_RESOLVED } from './tag.ts'\nimport { intCoreTag } from './tag/scalar/int_core.ts'\nimport { intYaml11Tag } from './tag/scalar/int_yaml11.ts'\nimport { floatCoreTag } from './tag/scalar/float_core.ts'\nimport { floatYaml11Tag } from './tag/scalar/float_yaml11.ts'\n\ninterface DumpOptions extends Omit<PresenterOptions, 'schema'> {\n schema?: Schema\n skipInvalid?: boolean\n noRefs?: boolean\n flowLevel?: number\n transform?: (documents: Document[]) => void\n}\n\n// YAML 1.1 misses YAML 1.2 `0o...` ints and exponent-only floats.\n// Combine resolvers so all possible collisions are quoted.\nconst DEFAULT_DUMP_SCHEMA = YAML11_SCHEMA.withTags(\n {\n ...intYaml11Tag,\n resolve: (source, isExplicit, tagName) => {\n const result = intYaml11Tag.resolve(source, isExplicit, tagName)\n return result === NOT_RESOLVED ? intCoreTag.resolve(source, isExplicit, tagName) : result\n }\n },\n {\n ...floatYaml11Tag,\n resolve: (source, isExplicit, tagName) => {\n const result = floatYaml11Tag.resolve(source, isExplicit, tagName)\n return result === NOT_RESOLVED ? floatCoreTag.resolve(source, isExplicit, tagName) : result\n }\n }\n)\n\nconst DEFAULT_DUMP_OPTIONS: Required<DumpOptions> = {\n ...DEFAULT_PRESENTER_OPTIONS,\n schema: DEFAULT_DUMP_SCHEMA,\n skipInvalid: false,\n noRefs: false,\n flowLevel: -1,\n transform: () => {}\n}\n\n// Options that need the JS value (tags, format, dedup) go to `jsToAst`; purely\n// presentational ones go to `present`.\nfunction dump (input: any, options: DumpOptions = {}) {\n const opts = { ...DEFAULT_DUMP_OPTIONS, ...options }\n\n const documents = jsToAst(input, opts.schema, {\n noRefs: opts.noRefs,\n skipInvalid: opts.skipInvalid\n })\n\n // flowLevel: every node at this depth switches to flow; the presenter forces\n // everything below into flow too, so the walk stops there.\n if (opts.flowLevel >= 0) {\n visit(documents, (node, ctx) => {\n if (ctx.depth < opts.flowLevel) return\n node.style.flow = true\n return VISIT_SKIP\n })\n }\n\n opts.transform(documents)\n\n const PRESENTER_OPT_KEYS = Object.keys(DEFAULT_PRESENTER_OPTIONS) as\n (keyof typeof DEFAULT_PRESENTER_OPTIONS)[]\n\n return present(documents, { ...pick(opts, PRESENTER_OPT_KEYS), schema: opts.schema })\n}\n\nexport {\n dump,\n\n type DumpOptions\n}\n","// Parser events → AST. The second entry into the AST world (the first being\n// `jsToAst`): instead of building JS values like the constructor, it mirrors the\n// same document/sequence/mapping frame walk and emits `Node`s that keep the\n// original styles, tags and anchors, so parsed YAML can be re-dumped faithfully.\n\nimport {\n EVENT_ALIAS,\n EVENT_DOCUMENT,\n EVENT_MAPPING,\n EVENT_POP,\n EVENT_SCALAR,\n EVENT_SEQUENCE,\n SCALAR_STYLE_PLAIN,\n SCALAR_STYLE_SINGLE_QUOTED,\n SCALAR_STYLE_DOUBLE_QUOTED,\n SCALAR_STYLE_LITERAL_BLOCK,\n SCALAR_STYLE_FOLDED_BLOCK,\n COLLECTION_STYLE_FLOW,\n type Event,\n type MappingEvent,\n type ScalarEvent,\n type SequenceEvent\n} from '../parser/events.ts'\nimport { getScalarValue } from '../parser/parser_scalar.ts'\nimport { type Schema } from '../schema.ts'\nimport { NOT_RESOLVED } from '../tag.ts'\nimport {\n Style,\n type Node,\n type Document,\n type ScalarNode,\n type SequenceNode,\n type MappingNode,\n type AliasNode\n} from './nodes.ts'\n\nconst NO_RANGE = -1\n\ninterface DocumentFrame {\n kind: 'document'\n doc: Document\n}\n\ninterface SequenceFrame {\n kind: 'sequence'\n node: SequenceNode\n}\n\ninterface MappingFrame {\n kind: 'mapping'\n node: MappingNode\n key: Node | null\n}\n\ntype Frame = DocumentFrame | SequenceFrame | MappingFrame\n\ninterface FromEventsOptions {\n source: string\n schema: Schema\n}\n\ninterface FromEventsState {\n source: string\n schema: Schema\n eventIndex: number\n position: number\n frames: Frame[]\n documents: Document[]\n}\n\nfunction eventPosition (event: Event) {\n if ('tagStart' in event && event.tagStart !== NO_RANGE) return event.tagStart\n if ('anchorStart' in event && event.anchorStart !== NO_RANGE) return event.anchorStart\n if ('valueStart' in event && event.valueStart !== NO_RANGE) return event.valueStart\n if ('start' in event) return event.start\n return 0\n}\n\nfunction rawTag (state: FromEventsState, event: ScalarEvent | SequenceEvent | MappingEvent) {\n return event.tagStart === NO_RANGE\n ? ''\n : state.source.slice(event.tagStart, event.tagEnd)\n}\n\nfunction anchorName (state: FromEventsState, event: ScalarEvent | SequenceEvent | MappingEvent) {\n return event.anchorStart === NO_RANGE\n ? undefined\n : state.source.slice(event.anchorStart, event.anchorEnd)\n}\n\n// Tag name carried by an empty/plain scalar with no explicit tag: the first\n// implicit scalar resolver that accepts the text, falling back to str. Mirrors\n// the implicit branch of `constructScalar`, but we only want the tag name.\nfunction implicitScalarTagName (state: FromEventsState, source: string) {\n const { schema } = state\n const candidates = schema.implicitScalarByFirstChar.get(source.charAt(0)) ??\n schema.implicitScalarAnyFirstChar\n for (const tag of candidates) {\n if (tag.resolve(source, false, tag.tagName) !== NOT_RESOLVED) return tag.tagName\n }\n return schema.defaultScalarTag.tagName\n}\n\nfunction buildScalar (state: FromEventsState, event: ScalarEvent): ScalarNode {\n const value = getScalarValue(state.source, event)\n const raw = rawTag(state, event)\n const style = new Style()\n\n switch (event.style) {\n case SCALAR_STYLE_SINGLE_QUOTED: style.singleQuoted = true; break\n case SCALAR_STYLE_DOUBLE_QUOTED: style.doubleQuoted = true; break\n case SCALAR_STYLE_LITERAL_BLOCK: style.literal = true; break\n case SCALAR_STYLE_FOLDED_BLOCK: style.folded = true; break\n }\n\n let tag: string\n if (raw !== '') {\n style.tagged = true\n tag = raw\n } else if (event.style === SCALAR_STYLE_PLAIN) {\n tag = implicitScalarTagName(state, value)\n } else {\n tag = state.schema.defaultScalarTag.tagName\n }\n\n return { kind: 'scalar', tag, style, anchor: anchorName(state, event), value }\n}\n\nfunction buildCollection (\n state: FromEventsState,\n event: SequenceEvent | MappingEvent,\n defaultTagName: string\n): { tag: string, style: Style, anchor?: string } {\n const raw = rawTag(state, event)\n const style = new Style()\n if (event.style === COLLECTION_STYLE_FLOW) style.flow = true\n\n let tag: string\n if (raw === '') {\n tag = defaultTagName\n } else {\n tag = raw\n style.tagged = true\n }\n\n return { tag, style, anchor: anchorName(state, event) }\n}\n\nfunction addNode (state: FromEventsState, node: Node) {\n const frame = state.frames[state.frames.length - 1]\n\n if (frame.kind === 'document') {\n frame.doc.contents = node\n } else if (frame.kind === 'sequence') {\n frame.node.items.push(node)\n } else if (frame.key) {\n frame.node.items.push({ key: frame.key, value: node })\n frame.key = null\n } else {\n frame.key = node\n }\n}\n\nfunction eventsToAst (events: Event[], options: FromEventsOptions): Document[] {\n const state: FromEventsState = {\n source: options.source,\n schema: options.schema,\n eventIndex: 0,\n position: 0,\n frames: [],\n documents: []\n }\n\n while (state.eventIndex < events.length) {\n const event = events[state.eventIndex++]\n state.position = eventPosition(event)\n\n switch (event.type) {\n case EVENT_DOCUMENT: {\n const doc: Document = {\n contents: null,\n explicitStart: event.explicitStart,\n explicitEnd: event.explicitEnd,\n directives: event.directives\n }\n state.frames.push({ kind: 'document', doc })\n break\n }\n\n case EVENT_SCALAR:\n addNode(state, buildScalar(state, event))\n break\n\n case EVENT_SEQUENCE: {\n const { tag, style, anchor } = buildCollection(state, event, 'tag:yaml.org,2002:seq')\n const node: SequenceNode = { kind: 'sequence', tag, style, anchor, items: [] }\n state.frames.push({ kind: 'sequence', node })\n break\n }\n\n case EVENT_MAPPING: {\n const { tag, style, anchor } = buildCollection(state, event, 'tag:yaml.org,2002:map')\n const node: MappingNode = { kind: 'mapping', tag, style, anchor, items: [] }\n state.frames.push({ kind: 'mapping', node, key: null })\n break\n }\n\n case EVENT_ALIAS: {\n const name = state.source.slice(event.anchorStart, event.anchorEnd)\n const node: AliasNode = { kind: 'alias', tag: '', style: new Style(), anchor: name }\n addNode(state, node)\n break\n }\n\n case EVENT_POP: {\n const frame = state.frames.pop()!\n if (frame.kind === 'document') {\n state.documents.push(frame.doc)\n } else {\n addNode(state, frame.node)\n }\n break\n }\n }\n }\n\n return state.documents\n}\n\nexport {\n eventsToAst,\n type FromEventsOptions\n}\n"],"mappings":"8QAAA,IAAM,EAA8B,OAAO,cAAc,EACnD,EAA2B,OAAO,WAAW,EAoHnD,SAAS,EAAyB,EAAiB,EAAgE,iBACjH,MAAO,CACL,UACA,SAAU,SACV,UAAA,EAAU,EAAQ,WAAA,KAAY,GAAZ,EAClB,kBAAA,EAAkB,EAAQ,mBAAA,KAAoB,GAApB,EAC1B,oBAAA,EAAoB,EAAQ,qBAAA,KAAsB,KAAtB,EAC5B,QAAS,EAAQ,QACjB,UAAA,EAAU,EAAQ,WAAA,KAAY,KAAZ,EAClB,WAAA,EAAW,EAAQ,YAAA,MAAc,GAAQ,OAAO,CAAI,GAAjC,EACnB,kBAAA,EAAkB,EAAQ,mBAAA,KAAoB,KAApB,CAC5B,CACF,CAEA,SAAS,EAA8C,EAAiB,EAAsF,eAC5J,IAAM,EAAkB,EAAQ,WAAa,IAAA,GAE7C,MAAO,CACL,UACA,SAAU,WACV,SAAU,GACV,kBAAA,EAAkB,EAAQ,mBAAA,KAAoB,GAApB,EAC1B,OAAQ,EAAQ,OAChB,QAAS,EAAQ,QACjB,UAAA,EAAU,EAAQ,WAAA,MAAa,GAAW,GAAxB,EAClB,kBACA,UAAA,EAAU,EAAQ,WAAA,KAAY,KAAZ,EAClB,WAAA,EAAW,EAAQ,YAAA,MAAc,GAAQ,GAAtB,EACnB,kBAAA,EAAkB,EAAQ,mBAAA,KAAoB,KAApB,CAC5B,CACF,CAEA,SAAS,EAA6C,EAAiB,EAAoF,eACzJ,IAAM,EAAkB,EAAQ,WAAa,IAAA,GAE7C,MAAO,CACL,UACA,SAAU,UACV,SAAU,GACV,kBAAA,EAAkB,EAAQ,mBAAA,KAAoB,GAApB,EAC1B,OAAQ,EAAQ,OAChB,QAAS,EAAQ,QACjB,IAAK,EAAQ,IACb,KAAM,EAAQ,KACd,IAAK,EAAQ,IACb,UAAA,EAAU,EAAQ,WAAA,MAAa,GAAW,GAAxB,EAClB,kBACA,UAAA,EAAU,EAAQ,WAAA,KAAY,KAAZ,EAClB,WAAA,EAAW,EAAQ,YAAA,MAAc,GAAQ,GAAtB,EACnB,kBAAA,EAAkB,EAAQ,mBAAA,KAAoB,KAApB,CAC5B,CACF,CCtKA,IAAM,EAAS,EAAgB,wBAAyB,CACtD,QAAU,GAAW,EACrB,SAAW,GAAS,OAAO,GAAS,QACtC,CAAC,ECHK,EAAc,CAAC,GAAI,IAAK,OAAQ,OAAQ,MAAM,EAE9C,EAAc,EAAgB,yBAA0B,CAC5D,SAAU,GAEV,mBAAoB,CAAC,GAAI,IAAK,IAAK,GAAG,EACtC,QAAU,GACJ,EAAY,QAAQ,CAAM,IAAM,GAE7B,EAFwC,KAIjD,SAAW,GAAW,IAAW,KACjC,cAAiB,MACnB,CAAC,ECbK,EAAc,EAAgB,yBAA0B,CAC5D,SAAU,GAEV,mBAAoB,CAAC,GAAG,EACxB,SAAU,EAAQ,IACZ,IAAW,QAAW,GAAc,IAAW,GAAY,KAExD,EAET,SAAW,GAAW,IAAW,KACjC,cAAiB,MACnB,CAAC,ECXK,EAAc,CAAC,GAAI,IAAK,OAAQ,OAAQ,MAAM,EAE9C,EAAgB,EAAgB,yBAA0B,CAC9D,SAAU,GAEV,mBAAoB,CAAC,GAAI,IAAK,IAAK,GAAG,EACtC,QAAU,GACJ,EAAY,QAAQ,CAAM,IAAM,GAE7B,EAFwC,KAIjD,SAAW,GAAW,IAAW,KACjC,cAAiB,MACnB,CAAC,ECbK,EAAc,CAAC,OAAQ,OAAQ,MAAM,EACrC,EAAe,CAAC,QAAS,QAAS,OAAO,EAEzC,EAAc,EAAgB,yBAA0B,CAC5D,SAAU,GAEV,mBAAoB,CAAC,IAAK,IAAK,IAAK,GAAG,EACvC,QAAU,GACJ,EAAY,QAAQ,CAAM,IAAM,GAChC,EAAa,QAAQ,CAAM,IAAM,GAE9B,EAFyC,GADD,GAKjD,SAAW,GAAW,OAAO,UAAU,SAAS,KAAK,CAAM,IAAM,mBACjE,UAAY,GAAW,EAAS,OAAS,OAC3C,CAAC,ECfK,EAAc,CAAC,MAAM,EACrB,GAAe,CAAC,OAAO,EAEvB,GAAc,EAAgB,yBAA0B,CAC5D,SAAU,GAEV,mBAAoB,CAAC,IAAK,GAAG,EAC7B,QAAU,GACJ,EAAY,QAAQ,CAAM,IAAM,GAChC,GAAa,QAAQ,CAAM,IAAM,GAE9B,EAFyC,GADD,GAKjD,SAAW,GAAW,OAAO,UAAU,SAAS,KAAK,CAAM,IAAM,mBACjE,UAAY,GAAW,EAAS,OAAS,OAC3C,CAAC,ECfK,GAAc,CAAC,OAAQ,OAAQ,OAAQ,IAAK,IAAK,MAAO,MAAO,MAAO,KAAM,KAAM,IAAI,EACtF,GAAe,CAAC,QAAS,QAAS,QAAS,IAAK,IAAK,KAAM,KAAM,KAAM,MAAO,MAAO,KAAK,EAE1F,GAAgB,EAAgB,yBAA0B,CAC9D,SAAU,GAEV,mBAAoB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EACrE,QAAU,GACJ,GAAY,QAAQ,CAAM,IAAM,GAChC,GAAa,QAAQ,CAAM,IAAM,GAE9B,EAFyC,GADD,GAKjD,SAAW,GAAW,OAAO,UAAU,SAAS,KAAK,CAAM,IAAM,mBACjE,UAAY,GAAW,EAAS,OAAS,OAC3C,CAAC,ECbK,GAAoC,OAExC,2CAIgB,EAGZ,GAAoC,OAExC,mEAMgB,EAElB,SAAS,GAAkB,EAAgB,CACzC,IAAI,EAAQ,EACR,EAAO,EAWX,OATI,EAAM,KAAO,KAAO,EAAM,KAAO,OAC/B,EAAM,KAAO,MAAK,EAAO,IAC7B,EAAQ,EAAM,MAAM,CAAC,GAGnB,EAAM,WAAW,IAAI,EAAU,EAAO,SAAS,EAAM,MAAM,CAAC,EAAG,CAAC,EAChE,EAAM,WAAW,IAAI,EAAU,EAAO,SAAS,EAAM,MAAM,CAAC,EAAG,CAAC,EAChE,EAAM,WAAW,IAAI,EAAU,EAAO,SAAS,EAAM,MAAM,CAAC,EAAG,EAAE,EAE9D,EAAO,SAAS,EAAO,EAAE,CAClC,CAEA,SAAS,GAAoB,EAAgB,EAAqB,CAChE,GAAI,MACE,CAAC,GAA8B,KAAK,CAAM,EAAG,OAAO,CAAA,MACnD,GAAI,CAAC,GAA8B,KAAK,CAAM,EACnD,OAAO,EAGT,IAAM,EAAS,GAAiB,CAAM,EACtC,OAAO,OAAO,SAAS,CAAM,EAAI,EAAS,CAC5C,CAEA,IAAM,GAAa,EAAgB,wBAAyB,CAC1D,SAAU,GAEV,mBAAoB,CAAC,IAAK,IAAK,GAAG,YAAY,EAC9C,QAAS,GACT,SAAW,GAET,OAAO,UAAU,CAAM,GAEvB,CAAC,OAAO,GAAG,EAAQ,EAAE,GAErB,EAAO,SAAS,EAAE,CAAC,CAAC,QAAQ,GAAG,EAAI,EACrC,UAAY,GAAmB,EAAO,SAAS,EAAE,CACnD,CAAC,EC3DK,GAAoC,OACxC,uBAAuB,EAGnB,GAAoC,OAExC,mEAMgB,EAElB,SAAS,GAAkB,EAAgB,CACzC,IAAI,EAAQ,EACR,EAAO,EAWX,OATI,EAAM,KAAO,KAAO,EAAM,KAAO,OAC/B,EAAM,KAAO,MAAK,EAAO,IAC7B,EAAQ,EAAM,MAAM,CAAC,GAGnB,EAAM,WAAW,IAAI,EAAU,EAAO,SAAS,EAAM,MAAM,CAAC,EAAG,CAAC,EAChE,EAAM,WAAW,IAAI,EAAU,EAAO,SAAS,EAAM,MAAM,CAAC,EAAG,CAAC,EAChE,EAAM,WAAW,IAAI,EAAU,EAAO,SAAS,EAAM,MAAM,CAAC,EAAG,EAAE,EAE9D,EAAO,SAAS,EAAO,EAAE,CAClC,CAEA,SAAS,GAAoB,EAAgB,EAAqB,CAChE,GAAI,MACE,CAAC,GAA8B,KAAK,CAAM,EAAG,OAAO,CAAA,MACnD,GAAI,CAAC,GAA8B,KAAK,CAAM,EACnD,OAAO,EAGT,IAAM,EAAS,GAAiB,CAAM,EACtC,OAAO,OAAO,SAAS,CAAM,EAAI,EAAS,CAC5C,CAEA,IAAM,GAAa,EAAgB,wBAAyB,CAC1D,SAAU,GAEV,mBAAoB,CAAC,IAAK,GAAG,YAAY,EACzC,QAAS,GACT,SAAW,GAET,OAAO,UAAU,CAAM,GAEvB,CAAC,OAAO,GAAG,EAAQ,EAAE,GAErB,EAAO,SAAS,EAAE,CAAC,CAAC,QAAQ,GAAG,EAAI,EACrC,UAAY,GAAmB,EAAO,SAAS,EAAE,CACnD,CAAC,ECxDK,GAA2B,OAE/B,oHAQ4B,EAE9B,SAAS,GAAkB,EAAgB,CACzC,IAAI,EAAQ,EAAO,QAAQ,KAAM,EAAE,EAC/B,EAAO,EAOX,IALI,EAAM,KAAO,KAAO,EAAM,KAAO,OAC/B,EAAM,KAAO,MAAK,EAAO,IAC7B,EAAQ,EAAM,MAAM,CAAC,GAGnB,EAAM,WAAW,IAAI,EAAG,OAAO,EAAO,SAAS,EAAM,MAAM,CAAC,EAAG,CAAC,EACpE,GAAI,EAAM,WAAW,IAAI,EAAG,OAAO,EAAO,SAAS,EAAM,MAAM,CAAC,EAAG,EAAE,EAErE,GAAI,EAAM,SAAS,GAAG,EAAG,CACvB,IAAI,EAAS,EACb,IAAK,IAAM,KAAQ,EAAM,MAAM,GAAG,EAAG,EAAS,EAAS,GAAK,OAAO,CAAI,EACvE,OAAO,EAAO,CAChB,CAIA,OAFI,IAAU,KAAO,EAAM,KAAO,IAAY,EAAO,SAAS,EAAO,CAAC,EAE/D,EAAO,SAAS,EAAO,EAAE,CAClC,CAEA,SAAS,GAAoB,EAAgB,CAC3C,GAAI,CAAC,GAAqB,KAAK,CAAM,EAAG,OAAO,EAE/C,IAAM,EAAS,GAAiB,CAAM,EACtC,OAAO,OAAO,SAAS,CAAM,EAAI,EAAS,CAC5C,CAEA,IAAM,GAAe,EAAgB,wBAAyB,CAC5D,SAAU,GAEV,mBAAoB,CAAC,IAAK,IAAK,GAAG,YAAY,EAC9C,QAAS,GACT,SAAW,GAET,OAAO,UAAU,CAAM,GAEvB,CAAC,OAAO,GAAG,EAAQ,EAAE,GAErB,EAAO,SAAS,EAAE,CAAC,CAAC,QAAQ,GAAG,EAAI,EACrC,UAAY,GAAmB,EAAO,SAAS,EAAE,CACnD,CAAC,ECvDK,GAAyB,OAE7B,mIAMuB,EAEnB,GAAiC,OACrC,kDAIuB,EAEzB,SAAS,GAAkB,EAAgB,CACzC,GAAI,CAAC,GAAmB,KAAK,CAAM,EAAG,OAAO,EAE7C,IAAI,EAAQ,EAAO,YAAY,EACzB,EAAO,EAAM,KAAO,IAAM,GAAK,EAIrC,GAFI,KAAK,SAAS,EAAM,EAAE,IAAG,EAAQ,EAAM,MAAM,CAAC,GAE9C,IAAU,OAAQ,OAAO,IAAS,EAAI,IAA2B,KACrE,GAAI,IAAU,OAAQ,MAAO,KAE7B,IAAM,EAAS,EAAO,WAAW,CAAK,EAGtC,OADI,OAAO,SAAS,CAAM,GAAK,GAA2B,KAAK,CAAM,EAAU,EACxE,CACT,CAEA,SAAS,GAAoB,EAAgB,CAC3C,GAAI,MAAM,CAAM,EAAG,MAAO,OAC1B,GAAI,IAAW,IAA0B,MAAO,OAChD,GAAI,IAAW,KAA0B,MAAO,QAChD,GAAI,OAAO,GAAG,EAAQ,EAAE,EAAG,MAAO,OAElC,IAAM,EAAS,EAAO,SAAS,EAAE,EACjC,MAAO,gBAAgB,KAAK,CAAM,EAAI,EAAO,QAAQ,IAAK,IAAI,EAAI,CACpE,CAEA,IAAM,GAAe,EAAgB,0BAA2B,CAC9D,SAAU,GAGV,mBAAoB,CAAC,IAAK,IAAK,IAAK,GAAG,YAAY,EACnD,QAAS,GACT,SAAW,GAET,OAAO,GAAW,WAMhB,CAAC,OAAO,UAAU,CAAM,GAExB,OAAO,GAAG,EAAQ,EAAE,GAEpB,EAAO,SAAS,EAAE,CAAC,CAAC,QAAQ,GAAG,GAAK,GAExC,UAAW,EACb,CAAC,EC/DK,GAAkC,OAEtC,yDAAyD,EAGrD,GAAkC,OAEtC,mIAMuB,EAEzB,SAAS,GAAkB,EAAgB,EAAqB,CAC9D,GAAI,EAAY,CACd,GAAI,CAAC,GAA4B,KAAK,CAAM,EAAG,OAAO,EAEtD,IAAI,EAAQ,EAAO,YAAY,EACzB,EAAO,EAAM,KAAO,IAAM,GAAK,EAIrC,GAFI,KAAK,SAAS,EAAM,EAAE,IAAG,EAAQ,EAAM,MAAM,CAAC,GAE9C,IAAU,OAAQ,OAAO,IAAS,EAAI,IAA2B,KACrE,GAAI,IAAU,OAAQ,MAAO,KAE7B,IAAM,EAAS,EAAO,WAAW,CAAK,EACtC,OAAO,OAAO,SAAS,CAAM,EAAI,EAAS,CAC5C,CAEA,GAAI,CAAC,GAA4B,KAAK,CAAM,EAAG,OAAO,EAEtD,IAAM,EAAS,OAAO,CAAM,EAG5B,OADI,OAAO,SAAS,CAAM,EAAU,EAC7B,CACT,CAEA,SAAS,GAAoB,EAAgB,CAC3C,GAAI,MAAM,CAAM,EAAG,MAAO,OAC1B,GAAI,IAAW,IAA0B,MAAO,OAChD,GAAI,IAAW,KAA0B,MAAO,QAChD,GAAI,OAAO,GAAG,EAAQ,EAAE,EAAG,MAAO,OAElC,IAAM,EAAS,EAAO,SAAS,EAAE,EACjC,MAAO,gBAAgB,KAAK,CAAM,EAAI,EAAO,QAAQ,IAAK,IAAI,EAAI,CACpE,CAEA,IAAM,GAAe,EAAgB,0BAA2B,CAC9D,SAAU,GAEV,mBAAoB,CAAC,IAAK,GAAG,YAAY,EACzC,QAAS,GACT,SAAW,GAET,OAAO,GAAW,WAMhB,CAAC,OAAO,UAAU,CAAM,GAExB,OAAO,GAAG,EAAQ,EAAE,GAEpB,EAAO,SAAS,EAAE,CAAC,CAAC,QAAQ,GAAG,GAAK,GAExC,UAAW,EACb,CAAC,ECvEK,GAAyB,OAE7B,uJAMuB,EAEnB,GAAiC,OACrC,kDAIuB,EAEzB,SAAS,GAAkB,EAAgB,CACzC,GAAI,CAAC,GAAmB,KAAK,CAAM,EAAG,OAAO,EAE7C,IAAI,EAAQ,EAAO,YAAY,CAAC,CAAC,QAAQ,KAAM,EAAE,EAC3C,EAAO,EAAM,KAAO,IAAM,GAAK,EAIrC,GAFI,KAAK,SAAS,EAAM,EAAE,IAAG,EAAQ,EAAM,MAAM,CAAC,GAE9C,IAAU,OAAQ,OAAO,IAAS,EAAI,IAA2B,KACrE,GAAI,IAAU,OAAQ,MAAO,KAE7B,IAAI,EAAS,EAEb,GAAI,EAAM,SAAS,GAAG,EAAG,CACvB,IAAK,IAAM,KAAQ,EAAM,MAAM,GAAG,EAAG,EAAS,EAAS,GAAK,OAAO,CAAI,EACvE,GAAU,CACZ,KACE,GAAS,EAAO,WAAW,CAAK,EAIlC,OADI,OAAO,SAAS,CAAM,GAAK,GAA2B,KAAK,CAAM,EAAU,EACxE,CACT,CAEA,SAAS,GAAoB,EAAgB,CAC3C,GAAI,MAAM,CAAM,EAAG,MAAO,OAC1B,GAAI,IAAW,IAA0B,MAAO,OAChD,GAAI,IAAW,KAA0B,MAAO,QAChD,GAAI,OAAO,GAAG,EAAQ,EAAE,EAAG,MAAO,OAElC,IAAM,EAAS,EAAO,SAAS,EAAE,EACjC,MAAO,gBAAgB,KAAK,CAAM,EAAI,EAAO,QAAQ,IAAK,IAAI,EAAI,CACpE,CAEA,IAAM,GAAiB,EAAgB,0BAA2B,CAChE,SAAU,GAGV,mBAAoB,CAAC,IAAK,IAAK,IAAK,GAAG,YAAY,EACnD,QAAS,GACT,SAAW,GAET,OAAO,GAAW,WAMhB,CAAC,OAAO,UAAU,CAAM,GAExB,OAAO,GAAG,EAAQ,EAAE,GAEpB,EAAO,SAAS,EAAE,CAAC,CAAC,QAAQ,GAAG,GAAK,GAExC,UAAW,EACb,CAAC,ECxEK,GAAW,EAAgB,0BAA2B,CAC1D,SAAU,GAEV,mBAAoB,CAAC,GAAG,EACxB,SAAU,EAAQ,IACZ,IAAW,MAAS,GAAc,IAAW,GAAY,EACtD,CAEX,CAAC,ECRK,GAAiB,yBAEvB,SAAS,GAAmB,EAAgB,CAE1C,IAAM,EAAQ,EAAO,QAAQ,MAAO,EAAE,EACtC,GAAI,EAAM,OAAS,GAAM,GAAK,CAAC,GAAe,KAAK,CAAK,EAAG,OAAO,EAElE,IAAM,EAAS,KAAK,CAAK,EACnB,EAAS,IAAI,WAAW,EAAO,MAAM,EAC3C,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,OAAQ,IACzC,EAAO,GAAS,EAAO,WAAW,CAAK,EAEzC,OAAO,CACT,CAEA,SAAS,GAAqB,EAAoB,CAChD,IAAI,EAAS,GACb,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,OAAQ,IACzC,GAAU,OAAO,aAAa,EAAO,EAAM,EAE7C,OAAO,KAAK,CAAM,CACpB,CAEA,IAAM,GAAY,EAAgB,2BAA4B,CAC5D,QAAS,GACT,SAAW,GAAW,OAAO,UAAU,SAAS,KAAK,CAAM,IAAM,sBACjE,UAAW,EACb,CAAC,EC3BK,GAAuB,OAC3B,oDAAoD,EAEhD,GAA4B,OAChC,kLASwB,EAE1B,SAAS,GAAsB,EAAgB,CAC7C,IAAI,EAAQ,GAAiB,KAAK,CAAM,EAExC,GADI,IAAU,OAAM,EAAQ,GAAsB,KAAK,CAAM,GACzD,IAAU,KAAM,OAAO,EAE3B,IAAM,EAAO,CAAE,EAAM,GACf,EAAU,EAAM,GAAM,EACtB,EAAM,CAAE,EAAM,GAGpB,GAAI,CAAC,EAAM,GAAI,CACb,IAAM,EAAO,IAAI,KAAK,KAAK,IAAI,EAAM,EAAO,CAAG,CAAC,EAKhD,OAHI,EAAK,eAAe,IAAM,GAAQ,EAAK,YAAY,IAAM,GAAS,EAAK,WAAW,IAAM,EACnF,EAEF,CACT,CAEA,IAAM,EAAO,CAAE,EAAM,GACf,EAAS,CAAE,EAAM,GACjB,EAAS,CAAE,EAAM,GACnB,EAAW,EAGf,GAAI,EAAO,IAAM,EAAS,IAAM,EAAS,GAAI,OAAO,EAEpD,GAAI,EAAM,GAAI,CACZ,IAAI,EAAQ,EAAM,EAAE,CAAC,MAAM,EAAG,CAAC,EAC/B,KAAO,EAAM,OAAS,GAAG,GAAS,IAClC,EAAW,CAAC,CACd,CAEA,IAAM,EAAO,IAAI,KAAK,KAAK,IAAI,EAAM,EAAO,EAAK,EAAM,EAAQ,EAAQ,CAAQ,CAAC,EAGhF,GAAI,EAAK,eAAe,IAAM,GAAQ,EAAK,YAAY,IAAM,GAAS,EAAK,WAAW,IAAM,EAC1F,OAAO,EAGT,GAAI,EAAM,GAAI,CACZ,IAAM,EAAa,CAAE,EAAM,IACrB,EAAe,EAAE,EAAM,KAAO,GAEpC,GAAI,EAAa,IAAM,EAAe,GAAI,OAAO,EAEjD,IAAM,GAAU,EAAa,GAAK,GAAgB,IAClD,EAAK,QAAQ,EAAK,QAAQ,GAAK,EAAM,KAAO,IAAM,CAAC,EAAS,EAAO,CACrE,CAEA,OAAO,CACT,CAEA,IAAM,GAAe,EAAgB,8BAA+B,CAClE,SAAU,GAEV,mBAAoB,CAAC,GAAG,YAAY,EACpC,QAAS,GACT,SAAW,GAAW,aAAkB,KACxC,UAAY,GAAiB,EAAO,YAAY,CAClD,CAAC,EC3EK,GAAS,EAAkB,wBAAyB,CACxD,WAAc,CAAC,EACf,SAAU,EAAW,IAAS,CAC5B,EAAU,KAAK,CAAI,CACrB,EACA,SAAU,MAAM,OAClB,CAAC,ECRD,SAAS,GAAe,EAAwB,CAC9C,GAAqB,OAAO,GAAS,WAAjC,GAA6C,MAAM,QAAQ,CAAI,EAAG,MAAO,GAC7E,IAAM,EAAY,OAAO,eAAe,CAAI,EAC5C,OAAO,IAAc,MAAQ,IAAc,OAAO,SACpD,CAKA,SAAS,GAA2C,EAAW,EAAyC,CACtG,IAAM,EAA8B,CAAC,EACrC,IAAK,IAAM,KAAO,EACZ,EAAO,KAAS,IAAA,KAAW,EAAO,GAAO,EAAO,IAEtD,OAAO,CACT,CCPA,IAAM,GAAU,EAAkB,yBAA0B,CAC1D,YAA4B,CAAE,KAAM,CAAC,EAAG,KAAM,IAAI,GAAM,GACxD,SAAU,EAAS,IAAS,CAC1B,IAAI,EAEJ,GAAI,aAAgB,IAAK,CACvB,GAAI,EAAK,OAAS,EAAG,MAAO,qCAC5B,EAAM,EAAK,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAC3B,MAAO,GAAI,GAAc,CAAI,EAAG,CAC9B,IAAM,EAAW,OAAO,KAAK,CAA+B,EAC5D,GAAI,EAAS,SAAW,EAAG,MAAO,qCAClC,EAAM,EAAS,EACjB,MACE,MAAO,qCAMT,OAHI,EAAQ,KAAK,IAAI,CAAG,EAAU,gCAClC,EAAQ,KAAK,IAAI,CAAG,EACpB,EAAQ,KAAK,KAAK,CAAI,EACf,GACT,EACA,SAAW,GAAuB,EAAQ,IAC5C,CAAC,EC1BK,GAAW,EAAkB,0BAA2B,CAC5D,WAAc,CAAC,EACf,SAAU,EAAW,IAAS,CAC5B,GAAI,aAAgB,IAIlB,OAHI,EAAK,OAAS,GAElB,EAAU,KAAK,EAAK,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,KAAM,EACpC,IAHqB,8BAM9B,GAAI,OAAO,UAAU,SAAS,KAAK,CAAI,IAAM,kBAC3C,MAAO,8BAGT,IAAM,EAAS,EACT,EAAO,OAAO,KAAK,CAAM,EAK/B,OAHI,EAAK,SAAW,GAEpB,EAAU,KAAK,CAAC,EAAK,GAAI,EAAO,EAAK,GAAG,CAAgB,EACjD,IAHuB,6BAIhC,CACF,CAAC,ECrBK,GAAS,EAAiB,wBAAyB,CACvD,YAA8B,CAAC,GAC/B,SAAU,GAGV,UAAY,GAAqB,CAC/B,IAAM,EAAM,IAAI,IAChB,IAAK,IAAM,KAAO,OAAO,KAAK,CAAC,EAAG,EAAI,IAAI,EAAK,EAAE,EAAI,EACrD,OAAO,CACT,EACA,SAAU,EAAW,EAAK,IAAU,CAClC,GAAoB,OAAO,GAAQ,UAA/B,EACF,MAAO,iDAET,IAAM,EAAgB,OAAO,CAAG,EAUhC,OATI,IAAkB,YAGpB,OAAO,eAAe,EAAW,EAAe,CAC9C,QAAO,WAAY,GAAM,aAAc,GAAM,SAAU,EACzD,CAAC,EAED,EAAU,GAAiB,EAEtB,EACT,EAEA,KAAM,EAAW,IACK,OAAO,GAAQ,UAA/B,EAAgD,GAC7C,OAAO,UAAU,eAAe,KAAK,EAAW,OAAO,CAAG,CAAC,EAEpE,KAAO,GAAc,OAAO,KAAK,CAAS,EAC1C,KAAM,EAAW,IAAQ,EAAU,OAAO,CAAG,EAC/C,CAAC,ECpCK,GAAS,EAAiB,wBAAyB,CACvD,WAAc,IAAI,IAClB,SAAW,GAAS,aAAgB,IACpC,UAAY,GAAuB,CACjC,IAAM,EAAM,IAAI,IAChB,IAAK,IAAM,KAAO,EAAM,EAAI,IAAI,EAAK,IAAI,EACzC,OAAO,CACT,EACA,SAAU,EAAW,EAAK,IACpB,IAAU,MACd,EAAU,IAAI,CAAG,EACV,IAFoB,4BAI7B,KAAM,EAAW,IAAQ,EAAU,IAAI,CAAG,EAC1C,KAAO,GAAc,EAAU,KAAK,EACpC,QAAW,IACb,CAAC,0rBCsBD,SAAS,IAA4C,CACnD,MAAO,CACL,OAAQ,CAAC,EACT,SAAU,CAAC,EACX,QAAS,CAAC,CACZ,CACF,CAEA,SAAS,IAAoD,CAC3D,MAAO,CACL,OAAQ,CAAC,EACT,SAAU,CAAC,EACX,QAAS,CAAC,CACZ,CACF,CAEA,SAAS,GAAa,EAAgC,CACpD,IAAM,EAA0B,CAAC,EAEjC,IAAK,IAAM,KAAO,EAAM,CACtB,IAAI,EAAQ,EAAO,OAEnB,IAAK,IAAI,EAAgB,EAAG,EAAgB,EAAO,OAAQ,IAAiB,CAC1E,IAAM,EAAW,EAAO,GAExB,GAAI,EAAS,WAAa,EAAI,UAC1B,EAAS,UAAY,EAAI,SACzB,EAAS,mBAAqB,EAAI,iBAAkB,CACtD,EAAQ,EACR,KACF,CACF,CAEA,EAAO,GAAS,CAClB,CAEA,OAAO,CACT,CAEA,IAAM,EAAN,MAAM,CAAO,CAoBX,YAAa,EAAgC,QAnB7C,OAAA,IAAA,EAAA,SACA,qBAAA,IAAA,EAAA,SAKA,4BAAA,IAAA,EAAA,SACA,6BAAA,IAAA,EAAA,SAGA,mBAAA,IAAA,EAAA,SAIA,qBAAA,IAAA,EAAA,SACA,oBAAA,IAAA,EAAA,SACA,QAAA,IAAA,EAAA,SACA,SAAA,IAAA,EAAA,EAGE,IAAM,EAAe,GAAY,CAAI,EAC/B,EAA4C,CAAC,EAC7C,EAAQ,GAAuB,EAC/B,EAAS,GAA2B,EAE1C,IAAK,IAAM,KAAO,EAAc,CAC9B,GAAI,EAAI,WAAa,UAAY,EAAI,SAAU,CAC7C,GAAI,EAAI,iBACN,MAAU,MAAM,iDAAiD,EAGnE,EAAmB,KAAK,CAAG,CAC7B,CAEA,OAAQ,EAAI,SAAZ,CACE,IAAK,SACC,EAAI,iBAAkB,EAAO,OAAO,KAAK,CAAG,EAC3C,EAAM,OAAO,EAAI,SAAW,EACjC,MACF,IAAK,WACC,EAAI,iBAAkB,EAAO,SAAS,KAAK,CAAG,EAC7C,EAAM,SAAS,EAAI,SAAW,EACnC,MACF,IAAK,UACC,EAAI,iBAAkB,EAAO,QAAQ,KAAK,CAAG,EAC5C,EAAM,QAAQ,EAAI,SAAW,EAClC,KACJ,CACF,CAEA,IAAM,EAA6B,EAAmB,OAAO,GAAO,EAAI,qBAAuB,IAAI,EAE7F,EAAO,IAAI,IACjB,IAAK,IAAM,KAAO,EAChB,GAAI,EAAI,qBAAuB,KAC7B,IAAK,IAAM,KAAO,EAAI,mBAAoB,EAAK,IAAI,CAAG,EAI1D,IAAM,EAA4B,IAAI,IACtC,IAAK,IAAM,KAAO,EAChB,EAA0B,IAAI,EAAK,EAAmB,OAAO,GAC3D,EAAI,qBAAuB,MAAQ,EAAI,mBAAmB,QAAQ,CAAG,IAAM,EAAE,CAAC,EAGlF,IAAM,EAAmB,EAAM,OAAO,yBACtC,GAAI,CAAC,EAAkB,MAAU,MAAM,uEAAuE,EAE9G,KAAK,KAAO,EACZ,KAAK,mBAAqB,EAC1B,KAAK,0BAA4B,EACjC,KAAK,2BAA6B,EAClC,KAAK,iBAAmB,EACxB,KAAK,mBAAqB,EAAM,SAAS,yBACzC,KAAK,kBAAoB,EAAM,QAAQ,yBACvC,KAAK,MAAQ,EACb,KAAK,OAAS,CAChB,CAEA,SAAU,GAAG,EAA+D,CAC1E,IAAI,EAA4B,CAAC,EACjC,IAAK,IAAM,KAAO,EAAM,EAAW,EAAS,OAAO,CAAG,EAEtD,OAAO,IAAI,EAAO,CAAC,GAAG,KAAK,KAAM,GAAG,CAAQ,CAAC,CAC/C,CACF,EAEM,GAAkB,IAAI,EAAO,CACjC,EACA,GACA,EACF,CAAC,EAEK,GAAc,IAAI,EAAO,CAC7B,GAAG,GAAgB,KACnB,EACA,GACA,GACA,EACF,CAAC,EAEK,GAAc,IAAI,EAAO,CAC7B,GAAG,GAAgB,KACnB,EACA,EACA,GACA,EACF,CAAC,EAEK,GAAgB,IAAI,EAAO,CAC/B,GAAG,GAAgB,KACnB,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACF,CAAC,ECjMK,GAAa,EAAiB,wBAAyB,CAC3D,WAAc,IAAI,IAClB,SAAU,EAAwB,EAAK,KACrC,EAAU,IAAI,EAAK,CAAK,EACjB,IAET,KAAM,EAAwB,IAAQ,EAAU,IAAI,CAAG,EACvD,KAAO,GAA2B,EAAU,KAAK,EACjD,KAAM,EAAwB,IAAQ,EAAU,IAAI,CAAG,EAGvD,SAAW,GAAS,aAAgB,KAAO,GAAc,CAAI,EAI7D,UAAY,GAAS,CACnB,GAAI,aAAgB,IAAK,OAAO,EAChC,IAAM,EAAM,IAAI,IACV,EAAM,EACZ,IAAK,IAAM,KAAO,OAAO,KAAK,CAAG,EAAG,EAAI,IAAI,EAAK,EAAI,EAAI,EACzD,OAAO,CACT,CACF,CAAC,ECrBD,SAAS,GAAc,EAA6B,CAClD,GAAI,MAAM,QAAQ,CAAG,EAAG,CACtB,IAAM,EAAQ,MAAM,UAAU,MAAM,KAAK,CAAG,EAE5C,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAM,OAAQ,IAAS,CACjD,GAAI,MAAM,QAAQ,EAAM,EAAM,EAAG,OAAO,KAEpC,OAAO,EAAM,IAAW,UACxB,OAAO,UAAU,SAAS,KAAK,EAAM,EAAM,IAAM,oBACnD,EAAM,GAAS,kBAEnB,CAEA,OAAO,OAAO,CAAK,CACrB,CAOA,OALI,OAAO,GAAQ,UACf,OAAO,UAAU,SAAS,KAAK,CAAG,IAAM,kBACnC,kBAGF,OAAO,CAAG,CACnB,CAEA,IAAM,GAAe,EAAiB,wBAAyB,CAC7D,YAA8B,CAAC,GAC/B,SAAU,GAGV,UAAY,GAAqB,CAC/B,IAAM,EAAM,IAAI,IAChB,IAAK,IAAM,KAAO,OAAO,KAAK,CAAC,EAAG,EAAI,IAAI,EAAK,EAAE,EAAI,EACrD,OAAO,CACT,EACA,SAAU,EAAW,EAAK,IAAU,CAClC,IAAM,EAAgB,GAAa,CAAG,EAWtC,OAVI,IAAkB,KAAa,+CAC/B,IAAkB,YAGpB,OAAO,eAAe,EAAW,EAAe,CAC9C,QAAO,WAAY,GAAM,aAAc,GAAM,SAAU,EACzD,CAAC,EAED,EAAU,GAAiB,EAEtB,GACT,EAEA,KAAM,EAAW,IAAQ,CACvB,IAAM,EAAgB,GAAa,CAAG,EACtC,OAAO,IAAkB,MAAQ,OAAO,UAAU,eAAe,KAAK,EAAW,CAAa,CAChG,EACA,KAAO,GAAc,OAAO,KAAK,CAAS,EAC1C,KAAM,EAAW,IAAQ,EAAU,OAAO,CAAG,EAC/C,CAAC,8jBChDD,IAAM,GAAoD,CACxD,UAAW,GACX,OAAQ,EACR,YAAa,EACb,WAAY,CACd,EAGA,SAAS,GAAS,EAAgB,EAAmB,EAAiB,EAAkB,EAAuB,CAC7G,IAAI,EAAO,GACP,EAAO,GACL,EAAgB,KAAK,MAAM,EAAgB,CAAC,EAAI,EAYtD,OAVI,EAAW,EAAY,IACzB,EAAO,QACP,EAAY,EAAW,EAAgB,EAAK,QAG1C,EAAU,EAAW,IACvB,EAAO,OACP,EAAU,EAAW,EAAgB,EAAK,QAGrC,CACL,IAAK,EAAO,EAAO,MAAM,EAAW,CAAO,CAAC,CAAC,QAAQ,MAAO,GAAG,EAAI,EACnE,IAAK,EAAW,EAAY,EAAK,MACnC,CACF,CAEA,SAAS,GAAU,EAAgB,EAAa,CAE9C,MAAO,IAAI,OAAO,KAAK,IAAI,EAAM,EAAO,OAAQ,CAAC,CAAC,EAAI,CACxD,CAEA,SAAS,GAAa,EAAmB,EAA0B,CACjE,GAAI,CAAC,EAAK,OAAQ,OAAO,KAEzB,IAAM,EAAA,EAAA,EAAA,CAAA,EAAY,EAAA,EAA4B,CAAQ,EAEhD,EAAK,eACL,EAAa,CAAC,CAAC,EACf,EAAqB,CAAC,EACxB,EACA,EAAc,GAElB,KAAQ,EAAQ,EAAG,KAAK,EAAK,MAAM,GACjC,EAAS,KAAK,EAAM,KAAK,EACzB,EAAW,KAAK,EAAM,MAAQ,EAAM,EAAE,CAAC,MAAM,EAEzC,EAAK,UAAY,EAAM,OAAS,EAAc,IAChD,EAAc,EAAW,OAAS,GAIlC,EAAc,IAAG,EAAc,EAAW,OAAS,GAEvD,IAAI,EAAS,GACP,EAAe,KAAK,IAAI,EAAK,KAAO,EAAK,WAAY,EAAS,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,OACjF,EAAgB,EAAK,WAAa,EAAK,OAAS,EAAe,GAErE,IAAK,IAAI,EAAI,EAAG,GAAK,EAAK,aACpB,IAAc,EAAI,GADe,IAAK,CAE1C,IAAM,EAAO,GACX,EAAK,OACL,EAAW,EAAc,GACzB,EAAS,EAAc,GACvB,EAAK,UAAY,EAAW,GAAe,EAAW,EAAc,IACpE,CACF,EACA,EAAS,GAAG,IAAI,OAAO,EAAK,MAAM,IAAI,IAAU,EAAK,KAAO,EAAI,EAAA,CAAG,SAAS,EAAG,CAAY,EAAE,KAAK,EAAK,IAAI,IAAI,GACjH,CAEA,IAAM,EAAO,GAAQ,EAAK,OAAQ,EAAW,GAAc,EAAS,GAAc,EAAK,SAAU,CAAa,EAC9G,GAAU,GAAG,IAAI,OAAO,EAAK,MAAM,IAAI,IAAU,EAAK,KAAO,EAAA,CAAG,SAAS,EAAG,CAAY,EAAE,KAAK,EAAK,IAAI,IACxG,GAAU,GAAG,IAAI,OAAO,EAAK,OAAS,EAAe,EAAI,EAAK,GAAG,EAAE,KAEnE,IAAK,IAAI,EAAI,EAAG,GAAK,EAAK,YACpB,IAAc,GAAK,EAAS,QADI,IAAK,CAEzC,IAAM,EAAO,GACX,EAAK,OACL,EAAW,EAAc,GACzB,EAAS,EAAc,GACvB,EAAK,UAAY,EAAW,GAAe,EAAW,EAAc,IACpE,CACF,EACA,GAAU,GAAG,IAAI,OAAO,EAAK,MAAM,IAAI,IAAU,EAAK,KAAO,EAAI,EAAA,CAAG,SAAS,EAAG,CAAY,EAAE,KAAK,EAAK,IAAI,GAC9G,CAEA,OAAO,EAAO,QAAQ,MAAO,EAAE,CACjC,CCrGA,SAAS,GAAa,EAA0B,EAAmB,CACjE,IAAI,EAAQ,GAcZ,OAZK,EAAU,MAEX,EAAU,KAAK,OACjB,GAAS,OAAO,EAAU,KAAK,KAAK,KAGtC,GAAS,IAAI,EAAU,KAAK,KAAO,EAAE,GAAG,EAAU,KAAK,OAAS,EAAE,GAE9D,CAAC,GAAW,EAAU,KAAK,UAC7B,GAAS,OAAO,EAAU,KAAK,WAG1B,GAAG,EAAU,OAAO,GAAG,KAZF,EAAU,MAaxC,CAEA,IAAM,EAAN,cAA4B,KAAM,CAIhC,YAAa,EAAgB,EAAoB,CAC/C,MAAM,SAJR,SAAA,IAAA,EAAA,SACA,OAAA,IAAA,EAAA,EAKE,KAAK,KAAO,gBACZ,KAAK,OAAS,EACd,KAAK,KAAO,EACZ,KAAK,QAAU,GAAY,KAAM,EAAK,EAGlC,MAAM,mBAER,MAAM,kBAAkB,KAAM,KAAK,WAAW,CAElD,CAEA,SAAU,EAAmB,CAC3B,MAAO,GAAG,KAAK,KAAK,IAAI,GAAY,KAAM,CAAO,GACnD,CACF,EAIA,SAAS,GAAc,EAAgB,EAAkB,EAAiB,EAAW,GAAW,CAC9F,IAAI,EAAO,EACP,EAAY,EAEhB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAU,IAAS,CAC7C,IAAM,EAAK,EAAO,WAAW,CAAK,EAE9B,IAAO,IACT,IACA,EAAY,EAAQ,GACX,IAAO,KAChB,IACI,EAAO,WAAW,EAAQ,CAAC,IAAM,IAAc,IACnD,EAAY,EAAQ,EAExB,CAEA,IAAM,EAAoB,CACxB,KAAM,EACN,OAAQ,EACR,WACA,OACA,OAAQ,EAAW,CACrB,EAGA,KADA,GAAK,QAAU,GAAY,CAAI,EACzB,IAAI,EAAc,EAAS,CAAI,CACvC,CC3EA,IAAM,GAAiB,EACjB,GAAiB,EACjB,GAAgB,EAChB,GAAe,EACf,GAAc,EACd,GAAY,EAMZ,GAAqB,EACrB,GAA6B,EAC7B,GAA6B,EAC7B,GAA6B,EAC7B,GAA4B,EAO5B,GAAyB,EACzB,GAAwB,EAKxB,GAAgB,EAChB,GAAiB,EACjB,GAAgB,ECpBhB,GAAW,GAIjB,SAAS,GAAsB,EAAW,CACxC,OAAQ,EAAR,CACE,IAAK,IAAa,MAAO,KACzB,IAAK,IAAa,MAAO,OACzB,IAAK,IAAa,MAAO,KACzB,IAAK,KAAa,MAAO,IACzB,IAAK,GAAe,MAAO,IAC3B,IAAK,KAAa,MAAO;EACzB,IAAK,KAAa,MAAO,KACzB,IAAK,KAAa,MAAO,KACzB,IAAK,KAAa,MAAO,KACzB,IAAK,KAAa,MAAO,OACzB,IAAK,IAAiB,MAAO,IAC7B,IAAK,IAAa,MAAO,IACzB,IAAK,IAAa,MAAO,IACzB,IAAK,IAAa,MAAO,KACzB,IAAK,IAAa,MAAO,IACzB,IAAK,IAAa,MAAO,OACzB,IAAK,IAAa,MAAO,SACzB,IAAK,IAAa,MAAO,SACzB,QAAS,MAAO,EAClB,CACF,CAEA,IAAM,GAAwB,MAAM,GAAG,EACjC,GAAsB,MAAM,GAAG,EACrC,IAAK,IAAI,EAAI,EAAG,EAAI,IAAK,IACvB,GAAkB,GAAK,MAAqB,CAAC,EAC7C,GAAgB,GAAK,GAAqB,CAAC,EAG7C,SAAS,GAAmB,EAAW,CAIrC,OAHI,GAAK,MACA,OAAO,aAAa,CAAC,EAEvB,OAAO,cACV,EAAI,OAAa,IAAM,OACvB,EAAI,MAAY,MAAU,KAC9B,CACF,CAEA,SAAS,GAAa,EAAW,CAI/B,OAHI,GAAK,IAAe,GAAK,GAAoB,EAAI,IAC1C,EAAI,IAEH,GAAO,EACrB,CAEA,SAAS,GAAe,EAAW,CAIjC,OAHI,IAAM,IAAoB,EAC1B,IAAM,IAAoB,EAEvB,CACT,CAMA,SAAS,GAAkB,EAAe,EAAkB,EAAa,CACvE,IAAI,EAAS,EAEb,KAAO,EAAW,GAAK,CACrB,IAAM,EAAK,EAAM,WAAW,CAAQ,EAEpC,GAAI,IAAO,GACT,IACA,SACK,GAAI,IAAO,GAChB,IACA,IACI,EAAM,WAAW,CAAQ,IAAM,IAAc,SAC5C,GAAI,IAAO,IAAmB,IAAO,EAC1C,SAEA,KAEJ,CAEA,MAAO,CAAE,WAAU,QAAO,CAC5B,CAIA,SAAS,GAAc,EAAe,CAGpC,OAFI,IAAU,EAAU,IAEjB;EAAK,OAAO,EAAQ,CAAC,CAC9B,CAIA,SAAS,GAAe,EAAe,EAAe,EAAa,CACjE,IAAI,EAAS,GACT,EAAW,EACX,EAAe,EACf,EAAa,EAEjB,KAAO,EAAW,GAAK,CACrB,IAAM,EAAK,EAAM,WAAW,CAAQ,EAEpC,GAAI,IAAO,IAAgB,IAAO,GAAc,CAC9C,GAAU,EAAM,MAAM,EAAc,CAAU,EAC9C,IAAM,EAAO,GAAiB,EAAO,EAAU,CAAG,EAClD,GAAU,GAAa,EAAK,MAAM,EAClC,EAAW,EAAe,EAAa,EAAK,QAC9C,KACE,KACI,IAAO,IAAmB,IAAO,IAAe,EAAa,EAErE,CAEA,OAAO,EAAS,EAAM,MAAM,EAAc,CAAU,CACtD,CAEA,SAAS,GAAsB,EAAe,EAAe,EAAa,CACxE,IAAI,EAAS,GACT,EAAW,EACX,EAAe,EACf,EAAa,EAEjB,KAAO,EAAW,GAAK,CACrB,IAAM,EAAK,EAAM,WAAW,CAAQ,EAEpC,GAAI,IAAO,GAET,GAAU,EAAM,MAAM,EAAc,CAAQ,EAAI,IAChD,GAAY,EACZ,EAAe,EAAa,OACvB,GAAI,IAAO,IAAgB,IAAO,GAAc,CACrD,GAAU,EAAM,MAAM,EAAc,CAAU,EAC9C,IAAM,EAAO,GAAiB,EAAO,EAAU,CAAG,EAClD,GAAU,GAAa,EAAK,MAAM,EAClC,EAAW,EAAe,EAAa,EAAK,QAC9C,KACE,KACI,IAAO,IAAmB,IAAO,IAAe,EAAa,EAErE,CAIA,OAAO,EAAS,EAAM,MAAM,EAAc,CAAG,CAC/C,CAEA,SAAS,GAAsB,EAAe,EAAe,EAAa,CACxE,IAAI,EAAS,GACT,EAAW,EACX,EAAe,EACf,EAAa,EAEjB,KAAO,EAAW,GAAK,CACrB,IAAM,EAAK,EAAM,WAAW,CAAQ,EAEpC,GAAI,IAAO,GAAa,CACtB,GAAU,EAAM,MAAM,EAAc,CAAQ,EAC5C,IACA,IAAM,EAAU,EAAM,WAAW,CAAQ,EAEzC,GAAI,IAAY,IAAgB,IAAY,GAE1C,EAAW,GAAiB,EAAO,EAAU,CAAG,CAAC,CAAC,cAC7C,GAAI,EAAU,KAAO,GAAkB,GAC5C,GAAU,GAAgB,GAC1B,QACK,CAEL,IAAI,EAAY,GAAc,CAAO,EACjC,EAAY,EAEhB,KAAO,EAAY,EAAG,IAAa,CACjC,IACA,IAAM,EAAQ,GAAY,EAAM,WAAW,CAAQ,CAAC,EACpD,GAAa,GAAa,GAAK,CACjC,CAEA,GAAU,GAAkB,CAAS,EACrC,GACF,CAEA,EAAe,EAAa,CAC9B,MAAO,GAAI,IAAO,IAAgB,IAAO,GAAc,CACrD,GAAU,EAAM,MAAM,EAAc,CAAU,EAC9C,IAAM,EAAO,GAAiB,EAAO,EAAU,CAAG,EAClD,GAAU,GAAa,EAAK,MAAM,EAClC,EAAW,EAAe,EAAa,EAAK,QAC9C,KACE,KACI,IAAO,IAAmB,IAAO,IAAe,EAAa,EAErE,CAEA,OAAO,EAAS,EAAM,MAAM,EAAc,CAAG,CAC/C,CAEA,SAAS,GACP,EACA,EACA,EACA,EACA,EACA,EACA,CACA,IAAM,EAAa,EAAS,EAAI,EAAI,EAG9B,EAAS,EAAM,MAAM,EAAO,CAAG,CAAC,CAAC,QAAQ,SAAU;CAAI,EAMvD,EAAQ,IAAW,GACrB,CAAC,GACA,EAAO,SAAS;CAAI,EAAI,EAAO,MAAM,EAAG,EAAE,EAAI,EAAA,CAAQ,MAAM;CAAI,EAEjE,EAAS,GACT,EAAiB,GACjB,EAAa,EACb,EAAiB,GAErB,IAAK,IAAM,KAAQ,EAAO,CAMxB,IAAI,EAAS,EACb,KAAO,EAAS,GAAc,EAAK,WAAW,CAAM,IAAM,IAAiB,IAE3E,GAAI,EAAS,GAAK,GAAU,EAAK,OAAQ,CACvC,IACA,QACF,CAEA,IAAM,EAAU,EAAK,MAAM,CAAU,EAC/B,EAAQ,EAAQ,WAAW,CAAC,EAE9B,EACE,IAAU,IAAmB,IAAU,GAEzC,EAAiB,GACjB,GAAU;EAAK,OAAO,EAAiB,EAAI,EAAa,CAAU,GACzD,GACT,EAAiB,GACjB,GAAU;EAAK,OAAO,EAAa,CAAC,GAC3B,IAAe,EACpB,IAAgB,GAAU,KAE9B,GAAU;EAAK,OAAO,CAAU,EAGlC,GAAU;EAAK,OAAO,EAAiB,EAAI,EAAa,CAAU,EAGpE,GAAU,EACV,EAAiB,GACjB,EAAa,CACf,CAQA,OANI,IAAA,EACF,GAAU;EAAK,OAAO,EAAiB,EAAI,EAAa,CAAU,EACzD,IAAA,GACL,IAAgB,GAAU;GAGzB,CACT,CAEA,SAAS,GAAgB,EAAe,EAA6B,CACnE,GAAI,EAAO,aAAe,GAAU,MAAO,GAE3C,GAAM,CAAE,aAAY,YAAa,EAKjC,GAAI,EAAO,KAAM,OAAO,EAAM,MAAM,EAAY,CAAQ,EAExD,OAAQ,EAAO,MAAf,CACE,IAAA,GACE,OAAO,GAAqB,EAAO,EAAY,CAAQ,EACzD,IAAA,GACE,OAAO,GAAqB,EAAO,EAAY,CAAQ,EACzD,IAAA,GACE,OAAO,GAAc,EAAO,EAAY,EAAU,EAAO,OAAQ,EAAO,SAAU,EAAK,EACzF,IAAA,GACE,OAAO,GAAc,EAAO,EAAY,EAAU,EAAO,OAAQ,EAAO,SAAU,EAAI,EACxF,QACE,OAAO,GAAc,EAAO,EAAY,CAAQ,CACpD,CACF,CCjTA,IAAM,GAAyD,CAC7D,IAAK,IACL,KAAM,oBACR,EAEA,SAAS,GAAkB,EAAgB,CACzC,OAAO,UAAU,CAAM,CAAC,CAAC,QAAQ,KAAM,KAAK,CAC9C,CAEA,SAAS,GAAa,EAAgB,EAAgD,SACpF,GAAI,EAAO,WAAW,IAAI,GAAK,EAAO,SAAS,GAAG,EAChD,OAAO,mBAAmB,EAAO,MAAM,EAAG,EAAE,CAAC,EAG/C,IAAM,EAAY,EAAO,QAAQ,IAAK,CAAC,EACjC,EAAS,IAAc,GAAK,IAAM,EAAO,MAAM,EAAG,EAAY,CAAC,EAC/D,GAAA,GAAA,EAAA,GAAA,KAAA,IAAA,GAAS,EAAc,KAAA,KAAW,GAAqB,GAAhC,IAAgC,KAAW,EAAX,EAE7D,OAAO,mBAAmB,CAAM,EAAI,mBAAmB,EAAO,MAAM,EAAO,MAAM,CAAC,CACpF,CAEA,SAAS,GAAc,EAAiB,CACtC,IAAI,EAAM,EAWV,OATI,EAAI,WAAW,CAAC,IAAM,IACxB,EAAM,EAAI,MAAM,CAAC,EACV,IAAI,GAAiB,CAAG,KAG7B,EAAI,MAAM,EAAG,EAAE,IAAM,qBAChB,KAAK,GAAiB,EAAI,MAAM,EAAE,CAAC,IAGrC,KAAK,GAAiB,CAAG,EAAE,EACpC,CCRA,IAAM,EAAW,GA6DX,GAA4E,CAChF,SAAU,GACV,OAAQ,GACR,KAAM,GACN,kBAAmB,IACnB,WAAY,EACd,EAcA,SAAS,GAAe,EAAc,CAKpC,MAJI,aAAc,GAAS,EAAM,WAAa,EAAiB,EAAM,SACjE,gBAAiB,GAAS,EAAM,cAAgB,EAAiB,EAAM,YACvE,eAAgB,GAAS,EAAM,aAAe,EAAiB,EAAM,WACrE,UAAW,EAAc,EAAM,MAC5B,CACT,CAEA,SAAS,EAAY,EAAyB,EAAwB,CACpE,GAAa,EAAM,OAAQ,EAAM,SAAU,EAAS,EAAM,QAAQ,CACpE,CAEA,SAAS,GACP,EACA,EACA,EACA,EACA,CACA,GAAI,CACF,OAAO,EAAI,SAAS,CAAO,CAC7B,OAAS,EAAO,CACd,GAAI,aAAiB,EAAe,MAAM,EAC1C,GACE,EAAM,OACN,EACA,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EACrD,EAAM,QACR,CACF,CACF,CAEA,SAAS,GACP,EACA,EACA,EACe,CACf,IAAM,EAAW,EAAM,GACvB,GAAI,EAAU,OAAO,EAErB,IAAK,IAAM,KAAO,EAChB,GAAI,EAAQ,WAAW,EAAI,OAAO,EAAG,OAAO,CAIhD,CAEA,SAAS,GACP,EACA,EACA,EACA,EACA,EACA,CACA,IAAM,EAAM,GAAU,EAAO,EAAQ,CAAO,EAC5C,GAAI,EAAK,OAAO,EAEhB,EAAW,EAAO,WAAW,EAAS,SAAS,EAAQ,EAAE,CAC3D,CAEA,SAAS,GACP,EACA,EACa,CACb,IAAM,EAAS,GAAe,EAAM,OAAQ,CAAK,EAC3C,EAAS,EAAM,WAAa,EAC9B,GACA,EAAM,OAAO,MAAM,EAAM,SAAU,EAAM,MAAM,EAC7C,EAAS,EAAM,OAAO,iBAE5B,GAAI,IAAW,GAAI,OACjB,GAAI,IAAW,IAAK,MAAO,CAAE,MAAO,EAAQ,IAAK,CAAO,EAExD,IAAM,EAAU,GAAY,EAAQ,EAAM,WAAW,EAC/C,EAAY,GAAU,EAAM,OAAO,MAAM,OAAQ,EAAM,OAAO,OAAO,OAAQ,CAAO,EAE1F,GAAI,EAAW,CACb,IAAM,EAAS,EAAU,QAAQ,EAAQ,GAAM,CAAO,EAMtD,OAJI,IAAW,GACb,EAAW,EAAO,gCAAgC,EAAQ,eAAe,EAGpE,CAAE,MAAO,EAAQ,IAAK,CAAU,CACzC,CAKA,IAAM,GAAA,EACJ,GAAU,EAAM,OAAO,MAAM,QAAS,EAAM,OAAO,OAAO,QAAS,CAAO,IAAA,KAC1E,GAAU,EAAM,OAAO,MAAM,SAAU,EAAM,OAAO,OAAO,SAAU,CAAO,EADF,EAG5E,GAAI,EAAkB,CAChB,IAAW,IACb,EAAW,EAAO,gCAAgC,EAAQ,eAAe,EAG3E,IAAM,EAAU,EAAiB,OAAO,CAAO,EAI/C,MAAO,CAAE,MAHK,EAAiB,gBAC3B,EACA,GAAmB,EAAO,EAAM,SAAU,EAAkB,CAAO,EACvD,IAAK,CAAiB,CACxC,CAEA,EAAW,EAAO,wBAAwB,EAAQ,EAAE,CACtD,CAEA,GAAI,EAAM,QAAA,EAA8B,OAGtC,IAAM,GAAA,EAAa,EAAM,OAAO,0BAA0B,IAAI,EAAO,OAAO,CAAC,CAAC,IAAA,KAC5E,EAAM,OAAO,2BAD+D,EAE9E,IAAK,IAAM,KAAO,EAAY,CAC5B,IAAM,EAAS,EAAI,QAAQ,EAAQ,GAAO,EAAI,OAAO,EACrD,GAAI,IAAW,EAAc,MAAO,CAAE,MAAO,EAAQ,KAAI,CAC3D,CACF,CAEA,MAAO,CAAE,MAAO,EAAO,QAAQ,EAAQ,GAAO,EAAO,OAAO,EAAG,IAAK,CAAO,CAC7E,CAEA,SAAS,GACP,EACA,EACA,EACA,EACA,EACA,EACA,CACA,IAAM,EAAS,EAAM,WAAa,EAC9B,GACA,EAAM,OAAO,MAAM,EAAM,SAAU,EAAM,MAAM,EAC7C,EAAU,IAAW,IAAM,IAAW,IACxC,EACA,GAAY,EAAQ,EAAM,WAAW,EAEzC,MAAO,CACL,UACA,IAAK,GAAgB,EAAO,EAAO,EAAQ,EAAS,CAAQ,CAC9D,CACF,CAGA,SAAS,GAAc,EAAoD,CACzE,OAAO,EAAI,WAAa,SAC1B,CAIA,SAAS,GAAW,EAAyB,EAAqB,EAAiB,EAA2C,CAC5H,IAAK,IAAM,KAAa,EAAU,KAAK,CAAM,EAAG,OAK9C,GAJI,EAAM,oBAAsB,IAAM,EAAE,EAAM,eAAiB,EAAM,mBACnE,EAAW,EAAO,0CAA0C,EAAM,kBAAkB,EAAE,EAGpF,EAAM,IAAI,IAAI,EAAM,MAAO,CAAS,EAAG,SAE3C,IAAM,EAAM,EAAM,IAAI,QAAQ,EAAM,MAAO,EAAW,EAAU,IAAI,EAAQ,CAAS,CAAC,EAClF,GAAK,EAAW,EAAO,CAAG,IAC7B,EAAC,EAAM,cAAA,KAAN,EAAM,YAAgB,IAAI,IAApB,EAAwB,CAAG,IAAI,CAAS,CAClD,CACF,CAMA,SAAS,GAAa,EAAyB,EAAqB,EAAiB,EAAmB,CAGtG,GAFA,EAAM,SAAW,EAAM,YAEnB,GAAa,CAAS,EACxB,GAAU,EAAO,EAAO,EAAQ,CAAS,OACpC,GAAI,EAAU,WAAa,YAAc,MAAM,QAAQ,CAAM,EAClE,IAAK,IAAM,KAAW,EACpB,GAAU,EAAO,EAAO,EAAS,EAAM,GAAG,OAG5C,EAAW,EAAO,mEAAmE,CAEzF,CAEA,SAAS,GAAiB,EAAyB,EAAqB,EAAc,EAAgB,EAAa,SAIjH,GAHA,EAAM,SAAW,EAAM,YAGnB,IAAQ,EAAW,CACrB,GAAY,EAAO,EAAO,EAAO,CAAG,EACpC,MACF,CAEI,CAAC,EAAM,MAAQ,EAAM,IAAI,IAAI,EAAM,MAAO,CAAG,GAAK,GAAA,EAAC,EAAM,cAAA,MAAA,EAAa,IAAI,CAAG,IAC/E,EAAW,EAAO,wBAAwB,EAG5C,IAAM,EAAM,EAAM,IAAI,QAAQ,EAAM,MAAO,EAAK,CAAK,EACjD,GAAK,EAAW,EAAO,CAAG,GAC9B,EAAA,EAAM,cAAA,MAAA,EAAa,OAAO,CAAG,CAC/B,CAEA,SAAS,GAAU,EAAyB,EAAgB,EAAa,CACvE,IAAM,EAAQ,EAAM,OAAO,EAAM,OAAO,OAAS,GAEjD,GAAI,EAAM,OAAS,WACjB,EAAM,MAAQ,EACd,EAAM,SAAW,QACZ,GAAI,EAAM,OAAS,WAAY,CAChC,EAAM,QAGH,GAAa,CAAG,GACnB,EAAW,EAAO,mEAAmE,GAGzF,IAAM,EAAM,EAAM,IAAI,QAAQ,EAAM,MAAO,EAAO,EAAM,OAAO,EAC3D,GAAK,EAAW,EAAO,CAAG,CAChC,MAAO,GAAI,EAAM,OAAQ,CACvB,IAAM,EAAM,EAAM,IAClB,EAAM,IAAM,IAAA,GACZ,EAAM,OAAS,GACf,GAAgB,EAAO,EAAO,EAAK,EAAO,CAAG,CAC/C,KACE,GAAM,IAAM,EACZ,EAAM,YAAc,EAAM,SAC1B,EAAM,OAAS,EAEnB,CAEA,SAAS,GACP,EACA,EACA,EACA,EACA,EACe,CACf,GAAI,EAAM,cAAgB,EAAU,CAClC,IAAM,EAAS,CACb,QACA,MACA,cACF,EAEA,OADA,EAAM,QAAQ,IAAI,EAAM,OAAO,MAAM,EAAM,YAAa,EAAM,SAAS,EAAG,CAAM,EACzE,CACT,CAEA,OAAO,IACT,CAEA,SAAS,GAAqB,EAAiB,EAAwC,CACrF,IAAM,EAAA,EAAA,EAAA,EAAA,CAAA,EACD,EAAA,EACA,CAAA,EAAA,CAAA,EAAA,CACH,SACA,UAAW,CAAC,EACZ,WAAY,EACZ,SAAU,EACV,OAAQ,CAAC,EACT,QAAS,IAAI,IACb,YAAa,OAAO,OAAO,IAAI,EAC/B,eAAgB,EAChB,WAAY,EACd,EAEA,KAAO,EAAM,WAAa,EAAM,OAAO,QAAQ,CAC7C,IAAM,EAAQ,EAAM,OAAO,EAAM,cAGjC,OAFA,EAAM,SAAW,GAAc,CAAK,EAE5B,EAAM,KAAd,CACE,IAAA,GACE,EAAM,QAAU,IAAI,IACpB,EAAM,WAAa,EACnB,EAAM,YAAc,OAAO,OAAO,IAAI,EACtC,IAAK,IAAM,KAAa,EAAM,WACxB,EAAU,OAAS,QAAO,EAAM,YAAY,EAAU,QAAU,EAAU,QAEhF,EAAM,OAAO,KAAK,CAAE,KAAM,WAAY,SAAU,EAAM,SAAU,MAAO,IAAA,GAAW,SAAU,EAAM,CAAC,EACnG,MAEF,IAAA,GAAmB,CACjB,GAAM,CAAE,QAAO,OAAQ,GAAgB,EAAO,CAAK,EACnD,GAAY,EAAO,EAAO,EAAO,EAAK,EAAI,EAC1C,GAAS,EAAO,EAAO,CAAG,EAC1B,KACF,CAEA,IAAA,GAAqB,CACnB,IAAM,EAAa,GACjB,EACA,EACA,EAAM,OAAO,MAAM,SACnB,EAAM,OAAO,OAAO,SACpB,wBACA,UACF,EACM,EAAQ,EAAW,IAAI,OAAO,EAAW,OAAO,EAChD,EAAS,GAAY,EAAO,EAAO,EAAO,EAAW,IAAK,EAAW,IAAI,eAAe,EAKxF,EAAS,EAAM,OAAO,EAAM,OAAO,OAAS,GAC5C,EAAQ,IAAW,IAAA,IAAa,EAAO,OAAS,WACpD,EAAO,QAAU,EAAO,MAAQ,EAElC,EAAM,OAAO,KAAK,CAChB,KAAM,WAAY,SAAU,EAAM,SAAU,QAAO,IAAK,EAAW,IAAK,SAAQ,MAAO,EAAG,OAC5F,CAAC,EACD,KACF,CAEA,IAAA,GAAoB,CAClB,IAAM,EAAa,GACjB,EACA,EACA,EAAM,OAAO,MAAM,QACnB,EAAM,OAAO,OAAO,QACpB,wBACA,SACF,EACM,EAAQ,EAAW,IAAI,OAAO,EAAW,OAAO,EAChD,EAAS,GAAY,EAAO,EAAO,EAAO,EAAW,IAAK,EAAW,IAAI,eAAe,EAC9F,EAAM,OAAO,KAAK,CAChB,KAAM,UACN,SAAU,EAAM,SAChB,QACA,IAAK,EAAW,IAChB,SACA,IAAK,IAAA,GACL,YAAa,EAAM,SACnB,OAAQ,GACR,YAAa,IACf,CAAC,EACD,KACF,CAEA,IAAA,GAAkB,CACZ,EAAM,aAAe,IAAM,EAAE,EAAM,WAAa,EAAM,YACxD,EAAW,EAAO,gCAAgC,EAAM,WAAW,EAAE,EAGvE,IAAM,EAAO,EAAM,OAAO,MAAM,EAAM,YAAa,EAAM,SAAS,EAC5D,EAAS,EAAM,QAAQ,IAAI,CAAI,EAChC,GACH,EAAW,EAAO,uBAAuB,EAAK,EAAE,EAE7C,EAAO,cACV,EAAW,EAAO,oBAAoB,EAAK,6BAA6B,EAAO,IAAI,QAAQ,4BAA4B,EAEzH,GAAS,EAAO,EAAO,MAAO,EAAO,GAAG,EACxC,KACF,CAEA,IAAA,GAAgB,CACd,IAAM,EAAQ,EAAM,OAAO,IAAI,EAE/B,GAAI,EAAM,OAAS,WACjB,EAAM,UAAU,KAAK,EAAM,KAAK,MAC3B,CACL,IAAM,EAAQ,EAAM,IAAI,gBACpB,EAAM,MACN,GAAmB,EAAO,EAAM,SAAU,EAAM,IAAK,EAAM,KAAK,EAChE,EAAM,SACR,EAAM,OAAO,MAAQ,EACrB,EAAM,OAAO,aAAe,IAE9B,GAAS,EAAO,EAAO,EAAM,GAAG,CAClC,CACA,KACF,CACF,CACF,CAEA,OAAO,EAAM,SACf,CCrcA,IAAM,EAAW,GACX,GAAU,OAAO,UAAU,eAE3B,EAAkB,EAClB,GAAmB,EACnB,GAAmB,EACnB,GAAoB,EAGpB,GAAwB,sIAExB,GAA0B,YAG1B,GAAqB,6BAGrB,GAAc,OAAO,GAAG,2DAGxB,GAAc,OAAO,GAAG,qDACxB,GAAsB,OAAO,OAAO,GAAY,IAAI,EAEpD,GAAyB,OAAO,OAAO,GAAY,IAAI,EAEvD,GAAyB,OAAO,WAAW,GAAY,KAAK,GAAY,KAAK,GAAY,KAAK,EA2B9F,GAAkD,CACtD,SAAU,GACV,SAAU,GACZ,EAgBA,SAAS,GACP,EACA,EACA,EACA,CACA,EAAM,OAAO,KAAK,CAChB,KAAA,EACA,gBACA,cACA,WAAY,EAAM,UACpB,CAAC,CACH,CAEA,SAAS,GACP,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACA,EAAM,OAAO,KAAK,CAChB,KAAA,EACA,QACA,cACA,YACA,WACA,SACA,OACF,CAAC,CACH,CAEA,SAAS,EACP,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACA,EAAM,OAAO,KAAK,CAChB,KAAA,EACA,QACA,cACA,YACA,WACA,SACA,OACF,CAAC,CACH,CAEA,SAAS,EACP,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EAAA,EACA,EAAS,GACT,EAAO,GACP,CACA,EAAM,OAAO,KAAK,CAChB,KAAA,EACA,aACA,WACA,cACA,YACA,WACA,SACA,QACA,WACA,SACA,MACF,CAAC,CACH,CAEA,SAAS,GACP,EACA,EACA,EACA,CACA,EAAM,OAAO,KAAK,CAChB,KAAA,EACA,cACA,WACF,CAAC,CACH,CAEA,SAAS,EAAa,EAAoB,CACxC,EAAM,OAAO,KAAK,CAAE,KAAA,CAAgB,CAAC,CACvC,CAEA,SAAS,EAAqB,EAAoB,CAChD,EACE,EACA,EACA,EACA,EACA,EACA,EACA,EAAA,CAEF,CACF,CAEA,SAAS,IAAmC,CAC1C,MAAO,CACL,YAAa,EACb,UAAW,EACX,SAAU,EACV,OAAQ,CACV,CACF,CAEA,SAAS,EAAe,EAAoC,CAC1D,MAAO,CACL,SAAU,EAAM,SAChB,KAAM,EAAM,KACZ,UAAW,EAAM,UACjB,WAAY,EAAM,WAClB,eAAgB,EAAM,eACtB,aAAc,EAAM,OAAO,MAC7B,CACF,CAEA,SAAS,EAAc,EAAoB,EAA0B,CACnE,EAAM,SAAW,EAAS,SAC1B,EAAM,KAAO,EAAS,KACtB,EAAM,UAAY,EAAS,UAC3B,EAAM,WAAa,EAAS,WAC5B,EAAM,eAAiB,EAAS,eAChC,EAAM,OAAO,OAAS,EAAS,YACjC,CAEA,SAAS,EAAY,EAAoB,EAAwB,CAC/D,GAAa,EAAM,MAAM,MAAM,EAAG,EAAM,MAAM,EAAG,EAAM,SAAU,EAAS,EAAM,QAAQ,CAC1F,CAEA,SAAS,EAAO,EAAW,CACzB,OAAO,IAAM,IAAgB,IAAM,EACrC,CAEA,SAAS,EAAc,EAAW,CAChC,OAAO,IAAM,GAAiB,IAAM,EACtC,CAEA,SAAS,EAAW,EAAW,CAC7B,OAAO,EAAa,CAAC,GAAK,EAAM,CAAC,CACnC,CAEA,SAAS,EAAgB,EAAW,CAClC,OAAO,IAAM,GAAK,EAAU,CAAC,CAC/B,CAEA,SAAS,EAAiB,EAAW,CACnC,OAAO,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,KACN,IAAM,GACf,CAEA,SAAS,GAAiB,EAAW,CACnC,OAAO,GAAK,IAAe,GAAK,GAAc,EAAI,GAAO,EAC3D,CAEA,SAAS,GAAa,EAAW,CAC/B,GAAI,GAAK,IAAe,GAAK,GAAa,OAAO,EAAI,GACrD,IAAM,EAAK,EAAI,GAEf,OADI,GAAM,IAAe,GAAM,IAAoB,EAAK,GAAO,GACxD,EACT,CAEA,SAAS,GAAe,EAAW,CAIjC,OAHI,IAAM,IAAoB,EAC1B,IAAM,IAAoB,EAC1B,IAAM,GAAoB,EACvB,CACT,CAEA,SAAS,GAAgB,EAAW,CAClC,OAAO,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,KACN,IAAM,GACN,IAAM,KACN,IAAM,KACN,IAAM,KACN,IAAM,KACN,IAAM,KACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,EACf,CAGA,SAAS,GAAkB,EAAoB,CAClC,EAAM,MAAM,WAAW,EAAM,QAEpC,IAAO,GACT,EAAM,YAEN,EAAM,WACF,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,IAAc,EAAM,YAGrE,EAAM,OACN,EAAM,UAAY,EAAM,SACxB,EAAM,WAAa,EACnB,EAAM,eAAiB,EACzB,CAEA,SAAS,EAAqB,EAAoB,EAAwB,CACxE,IAAI,EAAa,EACb,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EAC1C,EAAgB,EAAM,WAAa,EAAM,WAC3C,EAAU,EAAM,MAAM,WAAW,EAAM,SAAW,CAAC,CAAC,EAEtD,KAAO,IAAO,GAAG,CACf,KAAO,EAAa,CAAE,GACpB,EAAgB,GACZ,IAAO,GAAiB,EAAM,iBAAmB,KACnD,EAAM,eAAiB,EAAM,UAE/B,EAAK,EAAM,MAAM,WAAW,EAAE,EAAM,QAAQ,EAG9C,GAAI,GAAiB,GAAiB,IAAO,GAC3C,EAAK,GAAK,EAAM,MAAM,WAAW,EAAE,EAAM,QAAQ,QAC1C,CAAC,EAAM,CAAE,GAAK,IAAO,GAG9B,GAAI,CAAC,EAAM,CAAE,EAAG,MAOhB,IALA,GAAiB,CAAK,EACtB,IACA,EAAgB,GAChB,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EAEnC,IAAO,IACZ,EAAM,aACN,EAAK,EAAM,MAAM,WAAW,EAAE,EAAM,QAAQ,CAEhD,CAEA,OAAO,CACT,CAEA,SAAS,EAAuB,EAAoB,EAAW,EAAM,SAAU,CAC7E,IAAM,EAAK,EAAM,MAAM,WAAW,CAAQ,EAE1C,IAAK,IAAO,IAAe,IAAO,KAC9B,IAAO,EAAM,MAAM,WAAW,EAAW,CAAC,GAC1C,IAAO,EAAM,MAAM,WAAW,EAAW,CAAC,EAAG,CAC/C,IAAM,EAAY,EAAM,MAAM,WAAW,EAAW,CAAC,EACrD,OAAO,IAAc,GAAK,EAAU,CAAS,CAC/C,CAEA,MAAO,EACT,CAEA,SAAS,GAAkB,EAAoB,CAC7C,IAAI,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EAE9C,KAAO,IAAO,GAAK,CAAC,EAAM,CAAE,GAC1B,EAAK,EAAM,MAAM,WAAW,EAAE,EAAM,QAAQ,CAEhD,CAEA,SAAS,GAAgB,EAAoB,EAAe,EAAa,CACnE,GAAsB,KAAK,EAAM,MAAM,MAAM,EAAO,CAAG,CAAC,GAC1D,EAAW,EAAO,8CAA8C,CAEpE,CAEA,SAAS,GAAiB,EAAoB,EAAuB,EAAiB,CACpF,GAAI,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAa,MAAO,GAC/D,EAAM,WAAa,GAAU,EAAW,EAAO,+BAA+B,EAElF,IAAM,EAAQ,EAAM,SAChB,EAAa,GACb,EAAU,GACV,EAAY,IACZ,EAAK,EAAM,MAAM,WAAW,EAAE,EAAM,QAAQ,EAE5C,IAAO,IACT,EAAa,GACb,EAAK,EAAM,MAAM,WAAW,EAAE,EAAM,QAAQ,GACnC,IAAO,KAChB,EAAU,GACV,EAAY,KACZ,EAAK,EAAM,MAAM,WAAW,EAAE,EAAM,QAAQ,GAG9C,IAAI,EAAc,EAAM,SACpB,EAEJ,GAAI,EAAY,CACd,KAAO,IAAO,GAAK,IAAO,IAAa,EAAK,EAAM,MAAM,WAAW,EAAE,EAAM,QAAQ,EAC/E,IAAO,IAAa,EAAW,EAAO,oDAAoD,EAC9F,EAAU,EAAM,MAAM,MAAM,EAAa,EAAM,QAAQ,EACvD,EAAM,UACR,KAAO,CACL,KAAO,IAAO,GAAK,CAAC,EAAU,CAAE,GAAK,EAAE,GAAU,EAAgB,CAAE,IAC7D,IAAO,KACJ,EAMH,EAAW,EAAO,6CAA6C,GAL/D,EAAY,EAAM,MAAM,MAAM,EAAc,EAAG,EAAM,SAAW,CAAC,EAC5D,GAAmB,KAAK,CAAS,GAAG,EAAW,EAAO,iDAAiD,EAC5G,EAAU,GACV,EAAc,EAAM,SAAW,IAMnC,EAAK,EAAM,MAAM,WAAW,EAAE,EAAM,QAAQ,EAG9C,EAAU,EAAM,MAAM,MAAM,EAAa,EAAM,QAAQ,EACnD,GAAwB,KAAK,CAAO,GAAG,EAAW,EAAO,qDAAqD,CACpH,CAiBA,OAfI,GAAW,EAAE,EAAa,GAAgB,KAAK,CAAO,EAAI,GAAmB,KAAK,CAAO,IAC3F,EAAW,EAAO,4CAA4C,GAAS,EAQrE,CAAC,GAAc,IAAc,KAAO,IAAc,MAAQ,CAAC,GAAQ,KAAK,EAAM,YAAa,CAAS,GACtG,EAAW,EAAO,0BAA0B,EAAU,EAAE,EAG1D,EAAM,SAAW,EACjB,EAAM,OAAS,EAAM,SACd,EACT,CAEA,SAAS,GAAoB,EAAoB,EAAuB,CACtE,GAAI,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAa,MAAO,GAC/D,EAAM,cAAgB,GAAU,EAAW,EAAO,mCAAmC,EAEzF,EAAM,WACN,IAAM,EAAQ,EAAM,SAEpB,KAAO,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAK,CAAC,EAAU,EAAM,MAAM,WAAW,EAAM,QAAQ,CAAC,GAAK,CAAC,EAAgB,EAAM,MAAM,WAAW,EAAM,QAAQ,CAAC,GAClK,EAAM,WAOR,OAJI,EAAM,WAAa,GAAO,EAAW,EAAO,4DAA4D,EAE5G,EAAM,YAAc,EACpB,EAAM,UAAY,EAAM,SACjB,EACT,CAEA,SAAS,GAAW,EAAoB,EAAuB,CAC7D,GAAI,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAa,MAAO,IAC/D,EAAM,cAAgB,GAAY,EAAM,WAAa,IACvD,EAAW,EAAO,2CAA2C,EAG/D,EAAM,WACN,IAAM,EAAQ,EAAM,SAEpB,KAAO,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAK,CAAC,EAAU,EAAM,MAAM,WAAW,EAAM,QAAQ,CAAC,GAAK,CAAC,EAAgB,EAAM,MAAM,WAAW,EAAM,QAAQ,CAAC,GAClK,EAAM,WAMR,OAHI,EAAM,WAAa,GAAO,EAAW,EAAO,2DAA2D,EAE3G,GAAc,EAAO,EAAO,EAAM,QAAQ,EACnC,EACT,CAEA,SAAS,GAAqB,EAAoB,EAAoB,CACpE,EAAoB,EAAO,EAAK,EAE5B,EAAM,WAAa,GACrB,EAAW,EAAO,uBAAuB,CAE7C,CAEA,SAAS,GAAwB,EAAoB,EAAoB,EAAuB,CAC9F,GAAI,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAa,MAAO,GAEnE,EAAM,WACN,IAAM,EAAQ,EAAM,SAGhB,EAAS,GAEb,KAAO,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAG,CACnD,IAAM,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EAEhD,GAAI,IAAO,GAAa,CACtB,GAAI,EAAM,MAAM,WAAW,EAAM,SAAW,CAAC,IAAM,GAAa,CAC9D,EAAS,GACT,EAAM,UAAY,EAClB,QACF,CAEA,IAAM,EAAM,EAAM,SAGlB,MAFA,GAAM,WACN,EAAe,EAAO,EAAO,EAAK,EAAM,YAAa,EAAM,UAAW,EAAM,SAAU,EAAM,OAAA,EAAA,EAAmD,GAAI,CAAM,EAClJ,EACT,CAEI,EAAM,CAAE,GACV,EAAS,GACT,GAAoB,EAAO,CAAU,GAC5B,EAAM,WAAa,EAAM,WAAa,EAAsB,CAAK,EAC1E,EAAW,EAAO,8DAA8D,EACvE,IAAO,GAAiB,EAAK,GACtC,EAAW,EAAO,+BAA+B,EAEjD,EAAM,UAEV,CAEA,EAAW,EAAO,4DAA4D,CAChF,CAEA,SAAS,GAAwB,EAAoB,EAAoB,EAAuB,CAC9F,GAAI,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAa,MAAO,GAEnE,EAAM,WACN,IAAM,EAAQ,EAAM,SAGhB,EAAS,GAEb,KAAO,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAG,CACnD,IAAM,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EAEhD,GAAI,IAAO,GAAa,CACtB,IAAM,EAAM,EAAM,SAGlB,MAFA,GAAM,WACN,EAAe,EAAO,EAAO,EAAK,EAAM,YAAa,EAAM,UAAW,EAAM,SAAU,EAAM,OAAA,EAAA,EAAmD,GAAI,CAAM,EAClJ,EACT,CAEA,GAAI,IAAO,GAAa,CACtB,EAAS,GACT,IAAM,EAAU,EAAM,MAAM,WAAW,EAAE,EAAM,QAAQ,EAEvD,GAAI,EAAM,CAAO,EACf,GAAoB,EAAO,CAAU,OAChC,GAAI,GAAe,CAAO,EAC/B,EAAM,eACD,CACL,IAAI,EAAY,GAAc,CAAO,EAIrC,IAFI,IAAc,GAAG,EAAW,EAAO,yBAAyB,EAEzD,IAAc,GACnB,EAAM,WACF,GAAY,EAAM,MAAM,WAAW,EAAM,QAAQ,CAAC,EAAI,GACxD,EAAW,EAAO,gCAAgC,EAGtD,EAAM,UACR,CACF,MAAW,EAAM,CAAE,GACjB,EAAS,GACT,GAAoB,EAAO,CAAU,GAC5B,EAAM,WAAa,EAAM,WAAa,EAAsB,CAAK,EAC1E,EAAW,EAAO,8DAA8D,EACvE,IAAO,GAAiB,EAAK,GACtC,EAAW,EAAO,+BAA+B,EAEjD,EAAM,UAEV,CAEA,EAAW,EAAO,4DAA4D,CAChF,CAEA,SAAS,GAAiB,EAAoB,EAAsB,EAAuB,CACzF,IAAM,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EAC5C,EAAA,EACA,EAAS,GACT,EAAiB,GAErB,GAAI,IAAO,KAAe,IAAO,GAAa,MAAO,GAErD,IAAM,EAAQ,IAAO,IAAA,EAAA,EAGrB,IAFA,EAAM,WAEC,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAG,CACnD,IAAM,EAAU,EAAM,MAAM,WAAW,EAAM,QAAQ,EAC/C,EAAQ,GAAgB,CAAO,EAErC,GAAI,IAAY,IAAe,IAAY,GACrC,IAAA,GAA4B,EAAW,EAAO,sCAAsC,EACxF,EAAW,IAAY,GAAA,EAAA,EACvB,EAAM,gBACD,GAAI,GAAS,EACd,IAAU,GACZ,EAAW,EAAO,8EAA8E,EAE9F,GAAgB,EAAW,EAAO,2CAA2C,EACjF,EAAS,EAAe,EAAQ,EAChC,EAAiB,GACjB,EAAM,gBAEN,KAEJ,CAEA,IAAI,EAAgB,GACpB,KAAO,EAAa,EAAM,MAAM,WAAW,EAAM,QAAQ,CAAC,GACxD,EAAgB,GAChB,EAAM,WAEJ,GAAiB,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,IAAa,GAAiB,CAAK,EAE/F,EAAM,EAAM,MAAM,WAAW,EAAM,QAAQ,CAAC,EAC9C,GAAiB,CAAK,EACb,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GACpD,EAAW,EAAO,0BAA0B,EAG9C,IAAI,EAAgB,EAAiB,EAAS,GAC1C,EAAmB,EACjB,EAAa,EAAM,SACrB,EAAW,EAAM,SAErB,KAAO,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAG,CACnD,IAAM,EAAe,EAAM,SACvB,EAAS,EAEb,KAAO,EAAM,MAAM,WAAW,EAAe,CAAM,IAAM,IAAiB,IAE1E,IAAM,EAAQ,EAAM,MAAM,WAAW,EAAe,CAAM,EAC1D,GAAI,IAAU,EAAG,CAOX,GAAiB,EACf,EAAS,IAAe,EAAW,EAAe,GAC7C,EAAS,IAClB,EAAW,EAAe,GAE5B,KACF,CACA,GAAI,IAAiB,EAAM,WAAa,EAAsB,EAAO,CAAY,EAAG,MAiBpF,GAfI,CAAC,GAAkB,IAAkB,IAAM,EAAM,CAAK,IACxD,EAAmB,KAAK,IAAI,EAAkB,CAAM,GAGlD,CAAC,GAAkB,IAAkB,IAAM,CAAC,EAAM,CAAK,IACrD,IAAU,GAAiB,EAAS,IACtC,EAAM,SAAW,EAAe,EAChC,EAAW,EAAO,gDAAgD,GAEhE,EAAS,IACX,EAAM,SAAW,EAAe,EAChC,EAAW,EAAO,oCAAoC,IAItD,IAAkB,IAAM,IAAU,GAAK,CAAC,EAAM,CAAK,GAAK,EAAS,EAAc,CACjF,EAAM,WAAa,EACnB,EAAM,SAAW,EAAe,EAChC,KACF,CAEI,CAAC,GAAkB,IAAU,GAAK,CAAC,EAAM,CAAK,GAAK,IAAkB,KACvE,EAAgB,GAGlB,IAAM,EAAiB,IAAkB,GAAK,EAAe,EAAI,EACjE,GAAI,IAAU,GAAK,CAAC,EAAM,CAAK,GAAK,EAAS,EAAgB,CAC3D,EAAM,WAAa,EACnB,EAAM,SAAW,EAAe,EAChC,KACF,CAEA,GAAiB,CAAK,EACtB,EAAW,EAAM,SACb,EAAM,EAAM,MAAM,WAAW,EAAM,QAAQ,CAAC,IAC9C,GAAiB,CAAK,EAKtB,EAAW,EAAM,SAErB,CAeA,OAbA,GAAe,EAAO,EAAY,CAAQ,EAC1C,EACE,EACA,EACA,EACA,EAAM,YACN,EAAM,UACN,EAAM,SACN,EAAM,OACN,EACA,EACA,CACF,EACO,EACT,CAEA,SAAS,GAAqB,EAAoB,EAA0B,CAC1E,IAAM,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EAC1C,EAAS,IAAgB,EAE/B,GAAI,IAAO,GACP,EAAU,CAAE,GACZ,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,KACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACN,GAAU,EAAgB,CAAE,EAC/B,MAAO,GAGT,GAAI,IAAO,IAAe,IAAO,GAAa,CAC5C,IAAM,EAAY,EAAM,MAAM,WAAW,EAAM,SAAW,CAAC,EAC3D,GAAI,EAAe,CAAS,GAAM,GAAU,EAAgB,CAAS,EAAI,MAAO,EAClF,CAEA,MAAO,EACT,CAEA,SAAS,GAAiB,EAAoB,EAAoB,EAA0B,EAAuB,CACjH,GAAI,CAAC,GAAoB,EAAO,CAAW,EAAG,MAAO,GAErD,IAAM,EAAQ,EAAM,SAChB,EAAM,EAAM,SACZ,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EACxC,EAAS,IAAgB,EAI3B,EAAY,GAEhB,KAAO,IAAO,GACR,IAAM,WAAa,EAAM,WAAa,EAAsB,CAAK,IADtD,CAGf,GAAI,IAAO,GAAa,CACtB,IAAM,EAAY,EAAM,MAAM,WAAW,EAAM,SAAW,CAAC,EAC3D,GAAI,EAAe,CAAS,GAAM,GAAU,EAAgB,CAAS,EAAI,KAC3E,MAAO,GAAI,IAAO,OAEZ,EADc,EAAM,MAAM,WAAW,EAAM,SAAW,CAC5C,CAAS,EAAG,KAAA,MACrB,GAAI,GAAU,EAAgB,CAAE,EACrC,WACK,GAAI,EAAM,CAAE,EAAG,CACpB,IAAM,EAAgB,EAAM,SACtB,EAAY,EAAM,KAClB,EAAiB,EAAM,UACvB,EAAkB,EAAM,WAI9B,GAFA,EAAoB,EAAO,EAAK,EAE5B,EAAM,YAAc,EAAY,CAClC,EAAY,GACZ,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EAC1C,QACF,CAEA,EAAM,SAAW,EACjB,EAAM,KAAO,EACb,EAAM,UAAY,EAClB,EAAM,WAAa,EACnB,KACF,CAEK,EAAa,CAAE,IAAG,EAAM,EAAM,SAAW,GAC9C,EAAK,EAAM,MAAM,WAAW,EAAE,EAAM,QAAQ,CAC9C,CAMA,OAJI,IAAQ,EAAc,IAE1B,GAAe,EAAO,EAAO,CAAG,EAChC,EAAe,EAAO,EAAO,EAAK,EAAM,YAAa,EAAM,UAAW,EAAM,SAAU,EAAM,OAAA,EAAA,EAA2C,GAAI,CAAC,CAAS,EAC9I,GACT,CA6CA,SAAS,EAAyB,EAAoB,EAAoB,CACxE,IAAM,EAAY,EAAM,KACxB,EAAoB,EAAO,EAAI,GAE1B,EAAM,KAAO,GAAa,EAAM,WAAa,GAC7C,EAAM,iBAAmB,IAAM,EAAM,WAAa,IACrD,EAAW,EAAO,uBAAuB,CAE7C,CAEA,SAAS,GAAoB,EAAoB,EAAoB,EAAuB,CAC1F,IAAM,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EAC1C,EAAY,IAAO,IACnB,EAAQ,EAAM,SAChB,EAAW,GAEf,GAAI,IAAO,IAAe,IAAO,IAAa,MAAO,GAErD,IAAM,EAAa,EAAY,IAAc,GAU7C,IARI,EACF,EAAgB,EAAO,EAAO,EAAM,YAAa,EAAM,UAAW,EAAM,SAAU,EAAM,OAAA,CAA6B,EAErH,GAAiB,EAAO,EAAO,EAAM,YAAa,EAAM,UAAW,EAAM,SAAU,EAAM,OAAA,CAA6B,EAGxH,EAAM,WAEC,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAG,CACnD,EAAwB,EAAO,CAAU,EAEzC,IAAI,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EAE9C,GAAI,IAAO,EAGT,MAFA,GAAM,WACN,EAAY,CAAK,EACV,GACG,EAED,IAAO,IAChB,EAAW,EAAO,0CAA0C,EAF5D,EAAW,EAAO,8CAA8C,EAKlE,IAAI,EAAS,GACT,EAAiB,GAEjB,IAAO,IAAe,EAAU,EAAM,MAAM,WAAW,EAAM,SAAW,CAAC,CAAC,IAC5E,EAAS,EAAiB,GAC1B,EAAM,UAAY,EAClB,EAAwB,EAAO,CAAU,GAG3C,IAAM,EAAY,EAAM,KAClB,EAAa,EAAc,CAAK,EAEhC,EAAa,EAAU,EAAO,EAAY,EAAiB,GAAO,EAAI,EAC5E,EAAwB,EAAO,CAAU,EAEzC,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,GAErC,GAAa,GAAkB,EAAM,OAAS,IAAc,IAAO,IACtE,EAAS,GACT,EAAM,WACN,EAAwB,EAAO,CAAU,EACpC,EASO,GACV,EAAoB,CAAK,GATzB,EAAa,EAAO,CAAU,EAC9B,EAAgB,EAAO,EAAW,SAAU,EAAU,EAAU,EAAU,EAAA,CAA+B,EACpG,EAAU,EAAO,EAAY,EAAiB,GAAO,EAAI,GAC5D,EAAoB,CAAK,EAE3B,EAAwB,EAAO,CAAU,EACzC,EAAM,WACN,EAAwB,EAAO,CAAU,GAItC,EAAU,EAAO,EAAY,EAAiB,GAAO,EAAI,GAC5D,EAAoB,CAAK,EAE3B,EAAwB,EAAO,CAAU,EACpC,GAAW,EAAY,CAAK,GACxB,GAAa,GACjB,GAAY,EAAoB,CAAK,EAC1C,EAAoB,CAAK,GAChB,EACT,EAAoB,CAAK,EAChB,IACT,EAAa,EAAO,CAAU,EAC9B,EAAgB,EAAO,EAAW,SAAU,EAAU,EAAU,EAAU,EAAA,CAA+B,EACzG,EAAU,EAAO,EAAY,EAAiB,GAAO,EAAI,EACzD,EAAoB,CAAK,EACzB,EAAY,CAAK,GAGnB,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EAEtC,IAAO,IACT,EAAW,GACX,EAAM,YAEN,EAAW,EAEf,CAEA,EAAW,EAAO,uDAAuD,CAC3E,CAEA,SAAS,GAAmB,EAAoB,EAAoB,EAAuB,CACzF,GAAI,EAAM,iBAAmB,IAAM,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,IAAe,CAAC,EAAe,EAAM,MAAM,WAAW,EAAM,SAAW,CAAC,CAAC,EACrJ,MAAO,GAKT,IAFA,GAAiB,EAAO,EAAM,SAAU,EAAM,YAAa,EAAM,UAAW,EAAM,SAAU,EAAM,OAAA,CAA8B,EAEzH,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,IAAe,EAAe,EAAM,MAAM,WAAW,EAAM,SAAW,CAAC,CAAC,GAAG,CACvH,EAAM,iBAAmB,KAC3B,EAAM,SAAW,EAAM,eACvB,EAAW,EAAO,gDAAgD,GAGpE,IAAM,EAAY,EAAM,KACxB,EAAM,WAEN,IAAM,EAAW,EAAoB,EAAO,EAAI,EAAI,EAepD,GAdI,EAAM,iBAAmB,IACzB,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,IAC3C,EAAe,EAAM,MAAM,WAAW,EAAM,SAAW,CAAC,CAAC,GAC3D,EAAW,EAAO,qCAAqC,EAGrD,GAAY,EAAM,YAAc,EAClC,EAAoB,CAAK,EAEzB,EAAU,EAAO,EAAY,GAAkB,GAAO,EAAI,EAG5D,EAAoB,EAAO,EAAI,EAE3B,EAAM,WAAa,GAAc,EAAM,UAAY,EAAM,OAAQ,MACjE,EAAM,WAAa,GAAY,EAAW,EAAO,qCAAqC,EACtF,EAAM,OAAS,GACf,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,IAC3C,EAAe,EAAM,MAAM,WAAW,EAAM,SAAW,CAAC,CAAC,GAC3D,EAAW,EAAO,qCAAqC,CAE3D,CAGA,OADA,EAAY,CAAK,EACV,EACT,CAEA,SAAS,GAAkB,EAAoB,EAAoB,EAAoB,EAAuB,CAC5G,IAAI,EAAgB,GAChB,EAAW,GACX,EAAgB,GAChB,EAAqB,GAEzB,GAAI,EAAM,iBAAmB,GAAI,MAAO,GAExC,IAAI,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EAE9C,KAAO,IAAO,GAAG,CACX,CAAC,GAAiB,EAAM,iBAAmB,KAC7C,EAAM,SAAW,EAAM,eACvB,EAAW,EAAO,gDAAgD,GAGpE,IAAM,EAAY,EAAM,MAAM,WAAW,EAAM,SAAW,CAAC,EACrD,EAAY,EAAM,KAExB,IAAK,IAAO,IAAe,IAAO,KAAgB,EAAe,CAAS,EACnE,IACH,EAAgB,EAAO,EAAM,SAAU,EAAM,YAAa,EAAM,UAAW,EAAM,SAAU,EAAM,OAAA,CAA8B,EAC/H,EAAgB,IAGd,IAAO,IACL,GAAe,EAAoB,CAAK,EAC5C,EAAW,GACX,EAAgB,IACP,EACT,EAAgB,IAEhB,EAAoB,CAAK,EACzB,EAAW,GACX,EAAgB,IAGlB,EAAM,UAAY,EAClB,EAAqB,OAChB,CAID,IACF,EAAoB,CAAK,EACzB,EAAgB,IAGlB,IAAM,EAAY,EAAc,CAAK,EAErC,GAAI,CAAC,EAAU,EAAO,EAAY,GAAkB,GAAO,EAAI,EAC7D,MAGF,GAAI,EAAM,OAAS,EAAW,CAG5B,IAFA,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EAEnC,EAAa,CAAE,GACpB,EAAK,EAAM,MAAM,WAAW,EAAE,EAAM,QAAQ,EAG9C,GAAI,IAAO,GAAa,CAOtB,GANA,EAAK,EAAM,MAAM,WAAW,EAAE,EAAM,QAAQ,EAEvC,EAAe,CAAE,GACpB,EAAW,EAAO,yFAAyF,EAGzG,CAAC,EAAe,CAUlB,IATA,EAAa,EAAO,CAAS,EAC7B,EAAgB,EAAO,EAAU,SAAU,EAAM,YAAa,EAAM,UAAW,EAAM,SAAU,EAAM,OAAA,CAA8B,EACnI,EAAgB,GAIhB,EAAU,EAAO,EAAY,GAAkB,GAAO,EAAI,EAE1D,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EACnC,EAAa,CAAE,GACpB,EAAK,EAAM,MAAM,WAAW,EAAE,EAAM,QAAQ,EAG9C,EAAM,UACR,CAEA,EAAW,GACX,EAAgB,GAChB,EAAqB,EACvB,MAAO,GAAI,EACT,EAAW,EAAO,kCAAkC,OAQpD,OAJI,EAAM,cAAgB,GAAY,EAAM,WAAa,GACvD,EAAa,EAAO,CAAS,EACtB,IAEF,EAEX,MAAO,GAAI,EACT,EAAW,EAAO,gFAAgF,OAMlG,OAJI,EAAM,cAAgB,GAAY,EAAM,WAAa,GACvD,EAAa,EAAO,CAAS,EACtB,IAEF,EAEX,CAgBA,GAdI,EAAU,EAAO,EAAY,GAAmB,GAAM,CAAkB,IAC1E,EAAqB,IAGlB,GACC,IACF,EAAoB,CAAK,EACzB,EAAqB,IAIzB,EAAoB,EAAO,EAAI,EAC/B,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,GAErC,EAAM,OAAS,GAAa,EAAM,WAAa,IAAe,IAAO,EACxE,EAAW,EAAO,oCAAoC,OACjD,GAAI,EAAM,WAAa,EAC5B,KAEJ,CAKA,OAHK,GACD,GAAe,EAAoB,CAAK,EACxC,GAAe,EAAY,CAAK,EAC7B,IAHe,EAIxB,CAEA,SAAS,EACP,EACA,EACA,EACA,EACA,EACA,EAAuB,GACd,CACL,EAAM,OAAS,EAAM,UACvB,EAAW,EAAO,8BAA8B,EAAM,SAAS,EAAE,EAGnE,EAAM,QAEN,IAAI,EAAe,EACf,EAAY,GACZ,EAAa,GACb,EAAuC,KACrC,EAAQ,GAAgB,EAE1B,EAAoB,IAAgB,IAAqB,IAAgB,GACzE,EAAwB,EACtB,EAAmB,EAczB,GAZI,GAAe,EAAoB,EAAO,EAAI,IAChD,EAAY,GAEZ,AAKE,EALE,EAAM,WAAa,EACN,EACN,EAAM,aAAe,EACf,EAEA,IAIf,EAAM,WAAa,EAAM,WAAa,EAAsB,CAAK,EAEnE,MADA,GAAM,QACC,GAGT,GAAI,IAAiB,EACnB,OAAa,CACX,IAAM,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EAC1C,EAAgB,EAAc,CAAK,EAEzC,GAAI,GACA,IAAiB,IAChB,IAAO,IAAe,IAAO,IAChC,MAGF,GAAI,GACA,IACC,EAAM,WAAa,GAAY,EAAM,cAAgB,KACrD,IAAO,IAAe,IAAO,IAAc,OAC9C,IAAM,EAAgB,EAAc,CAAK,EACnC,EAAa,EAAe,EAGlC,GAAI,GAAiB,EAFC,EAAM,SAAW,EAAM,UAEF,EAAY,CAAK,KAAA,EACxD,EAAM,OAAO,EAAc,gBAAA,KAAA,IAAA,GAAA,EAAe,QAAA,EAE5C,MADA,GAAM,QACC,GAGT,EAAa,EAAO,CAAa,CACnC,CAQA,GANI,IACE,IAAO,IAAe,EAAM,WAAa,GACzC,IAAO,IAAe,EAAM,cAAgB,IAI9C,CAAC,GAAgB,EAAO,EAAO,IAAgB,CAAe,GAAK,CAAC,GAAmB,EAAO,CAAK,EACrG,MAGE,IAAkB,OAAM,EAAgB,GAExC,EAAoB,EAAO,EAAI,GACjC,EAAY,GACZ,EAAwB,EAExB,AAKE,EALE,EAAM,WAAa,EACN,EACN,EAAM,aAAe,EACf,EAEA,IAGjB,EAAwB,EAE5B,CAOF,GAJI,IACF,EAAwB,GAAa,GAGnC,IAAiB,GAAK,IAAgB,GAAmB,CAC3D,IAAM,EAAa,IAAgB,GAAmB,IAAgB,GAClE,EACA,EAAe,EACb,EAAc,EAAM,SAAW,EAAM,UAE3C,GAAI,IAAiB,EACnB,GAAK,IACA,GAAkB,EAAO,EAAa,CAAK,GAC3C,GAAiB,EAAO,EAAa,EAAY,CAAK,IACvD,GAAmB,EAAO,EAAY,CAAK,EAC7C,EAAa,OACR,CACL,IAAM,EAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,EAEhD,GAAI,IAAkB,MAAQ,GAAwB,GAAoB,CAAC,GACvE,IAAO,KAAe,IAAO,GAAa,OAC5C,IAAM,EAAgB,EAAc,CAAK,EACnC,EAAiB,EAAc,SAAW,EAAc,UAE9D,EAAa,EAAO,CAAa,EAE7B,GAAiB,EAAO,EAAgB,EAAY,GAAgB,CAAC,KAAA,EACrE,EAAM,OAAO,EAAc,gBAAA,KAAA,IAAA,GAAA,EAAe,QAAA,EAC5C,EAAa,GAEb,EAAa,EAAO,CAAa,CAErC,CAEI,CAAC,IACC,GAAqB,GAAgB,EAAO,EAAY,CAAK,GAC9D,GAAuB,EAAO,EAAY,CAAK,GAC/C,GAAuB,EAAO,EAAY,CAAK,GAC/C,GAAU,EAAO,CAAK,GACtB,GAAgB,EAAO,EAAY,EAAa,CAAK,KACxD,EAAa,GAEjB,MACS,IAAiB,IAC1B,EAAa,GAAyB,GAAkB,EAAO,EAAa,CAAK,EAErF,CAmBA,MAjBA,GAAoB,GAAqB,CAAC,EAEtC,CAAC,IAAe,EAAM,cAAgB,GAAY,EAAM,WAAa,GAAY,KACnF,EACE,EACA,EACA,EACA,EAAM,YACN,EAAM,UACN,EAAM,SACN,EAAM,OAAA,CAER,EACA,EAAa,IAGf,EAAM,QACC,GAAc,EAAM,cAAgB,GAAY,EAAM,WAAa,CAC5E,CAEA,SAAS,GAAe,EAAoB,CAC1C,GAAI,EAAM,WAAa,GAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAa,MAAO,GAE3F,EAAM,WACN,IAAM,EAAY,EAAM,SAExB,KAAO,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAK,CAAC,EAAU,EAAM,MAAM,WAAW,EAAM,QAAQ,CAAC,GAAG,EAAM,WAEjH,IAAM,EAAO,EAAM,MAAM,MAAM,EAAW,EAAM,QAAQ,EAClD,EAAiB,CAAC,EAIxB,IAFI,EAAK,SAAW,GAAG,EAAW,EAAO,8DAA8D,EAEhG,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAK,CAAC,EAAM,EAAM,MAAM,WAAW,EAAM,QAAQ,CAAC,GAAG,CACrG,KAAO,EAAa,EAAM,MAAM,WAAW,EAAM,QAAQ,CAAC,GAAG,EAAM,WACnE,GAAI,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,IAAe,EAAM,EAAM,MAAM,WAAW,EAAM,QAAQ,CAAC,GAAK,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,EAAG,MAE7J,IAAM,EAAQ,EAAM,SACpB,KAAO,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GAAK,CAAC,EAAU,EAAM,MAAM,WAAW,EAAM,QAAQ,CAAC,GAAG,EAAM,WACjH,EAAK,KAAK,EAAM,MAAM,MAAM,EAAO,EAAM,QAAQ,CAAC,CACpD,CAIA,GAFI,EAAM,EAAM,MAAM,WAAW,EAAM,QAAQ,CAAC,GAAG,GAAiB,CAAK,EAErE,IAAS,OAAQ,CACf,EAAM,WAAW,KAAK,GAAa,EAAU,OAAS,MAAM,GAAG,EAAW,EAAO,gCAAgC,EACjH,EAAK,SAAW,GAAG,EAAW,EAAO,6CAA6C,EAEtF,IAAM,EAAQ,uBAAuB,KAAK,EAAK,EAAE,EAC7C,IAAU,MAAM,EAAW,EAAO,2CAA2C,EAC7E,SAAS,EAAM,GAAI,EAAE,IAAM,GAAG,EAAW,EAAO,2CAA2C,EAE/F,EAAM,WAAW,KAAK,CAAE,KAAM,OAAQ,QAAS,EAAK,EAAG,CAAC,CAC1D,MAAO,GAAI,IAAS,MAAO,CACrB,EAAK,SAAW,GAAG,EAAW,EAAO,6CAA6C,EAEtF,GAAM,CAAC,EAAQ,GAAU,EACpB,GAAmB,KAAK,CAAM,GAAG,EAAW,EAAO,6DAA6D,EACjH,GAAQ,KAAK,EAAM,YAAa,CAAM,GAAG,EAAW,EAAO,8CAA8C,EAAO,aAAa,EAC5H,GAAmB,KAAK,CAAM,GAAG,EAAW,EAAO,8DAA8D,EAOtH,EAAM,YAAY,GAAU,EAC5B,EAAM,WAAW,KAAK,CAAE,KAAM,MAAO,SAAQ,QAAO,CAAC,CACvD,CAEA,MAAO,EACT,CAEA,SAAS,GAAc,EAAoB,CACzC,EAAM,WAAa,CAAC,EACpB,EAAM,YAAc,OAAO,OAAO,IAAI,EACtC,IAAI,EAAgB,GAIpB,IAFA,EAAoB,EAAO,EAAI,EAExB,GAAc,CAAK,GACxB,EAAgB,GAChB,EAAoB,EAAO,EAAI,EAGjC,IAAI,EAAgB,GAChB,EAAc,GACd,EAAe,GAEnB,GAAI,EAAM,aAAe,GACrB,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,IAC3C,EAAM,MAAM,WAAW,EAAM,SAAW,CAAC,IAAM,IAC/C,EAAM,MAAM,WAAW,EAAM,SAAW,CAAC,IAAM,IAC/C,EAAe,EAAM,MAAM,WAAW,EAAM,SAAW,CAAC,CAAC,EAAG,CAC9D,EAAgB,GAChB,IAAM,EAAa,EAAM,KACzB,EAAM,UAAY,EAClB,EAAoB,EAAO,EAAI,EAC/B,EAAe,EAAM,KAAO,CAC9B,MAAW,GACT,EAAW,EAAO,iCAAiC,EAGrD,IAAM,EAAqB,EAAM,OAAO,OACxC,GAAI,CAAC,GACD,EAAM,WAAa,EAAM,WACzB,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,IAC3C,EAAsB,CAAK,EAAG,CAChC,EAAM,UAAY,EAClB,EAAoB,EAAO,EAAI,EAC/B,MACF,CAQA,GANA,GAAiB,EAAO,EAAe,EAAK,EACvC,EAAU,EAAO,EAAM,WAAa,EAAG,GAAmB,GAAO,EAAc,CAAY,GAC9F,EAAoB,CAAK,EAE3B,EAAoB,EAAO,EAAI,EAE3B,EAAM,WAAa,EAAM,WAAa,EAAsB,CAAK,IACnE,EAAc,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,GACrD,GAAa,CACf,IAAM,EAAa,EAAM,KACzB,EAAM,UAAY,EAClB,EAAoB,EAAO,EAAI,EAC3B,EAAM,OAAS,GAAc,EAAM,SAAW,EAAM,QACtD,EAAW,EAAO,uDAAuD,CAE7E,CAGF,IAAM,EAAgB,EAAM,OAAO,IACnC,GAAA,KAAA,IAAA,GAAI,EAAe,QAAA,IAAyB,EAAc,YAAc,GAExE,EAAY,CAAK,EAEb,CAAC,GACD,EAAM,SAAW,EAAM,QACvB,EAAE,EAAM,WAAa,EAAM,WAAa,EAAsB,CAAK,IACrE,EAAW,EAAO,uDAAuD,CAE7E,CAEA,SAAS,GAAa,EAAe,EAAiC,CACpE,IAAM,EAAS,EAAM,OACf,EAAA,EAAA,EAAA,EAAA,CAAA,EACD,EAAA,EACA,CAAA,EAAA,CAAA,EAAA,CACH,MAAO,GAAG,EAAM,IAChB,SACA,SAAU,EACV,KAAM,EACN,UAAW,EACX,WAAY,EACZ,eAAgB,GAChB,MAAO,EACP,WAAY,CAAC,EACb,YAAa,OAAO,OAAO,IAAI,EAC/B,OAAQ,CAAC,EACX,EAEM,EAAU,EAAM,QAAQ,IAAI,EAKlC,IAJI,IAAY,IAAI,GAAa,EAAO,EAAS,oCAAqC,EAAM,QAAQ,EAEhG,EAAM,MAAM,WAAW,EAAM,QAAQ,IAAM,OAAQ,EAAM,WAEtD,EAAM,SAAW,EAAM,SAC5B,EAAoB,EAAO,EAAI,EAC3B,IAAM,UAAY,EAAM,UAFQ,CAGpC,IAAM,EAAgB,EAAM,SAC5B,GAAa,CAAK,EACd,EAAM,WAAa,GAIrB,EAAW,EAAO,yBAAyB,CAE/C,CAEA,OAAO,EAAM,MACf,CCp6CA,IAAM,GAAA,EAAA,EAAA,CAAA,EACD,EAAA,EACA,EACL,EAEA,SAAS,GAAe,EAAe,EAAuB,CAAC,EAAG,CAChE,IAAM,EAAA,EAAA,EAAA,CAAA,EAAY,EAAA,EAAyB,CAAQ,EAC7C,EAAS,OAAO,CAAK,EAErB,EAAkB,OAAO,KAAK,EAAsB,EAEpD,EAAuB,OAAO,KAAK,EAA2B,EAIpE,OAAO,GADQ,GAAY,EAAQ,GAAK,EAAM,CAAe,CAClC,EAAA,EAAA,EAAA,CAAA,EAAa,GAAK,EAAM,CAAoB,CAAA,EAAA,CAAA,EAAA,CAAG,QAAA,CAAO,CAAC,CACpF,CAMA,SAAS,GACP,EACA,EACA,EACA,CACA,IAAI,EAAmC,KAEnC,OAAO,GAAsB,WAC/B,EAAW,EAC4B,OAAO,GAAsB,UAA3D,IACT,EAAU,GAGZ,IAAM,EAAY,GAAc,EAAO,CAAO,EAE9C,GAAI,IAAa,KAAM,OAAO,EAC9B,IAAK,IAAM,KAAY,EAAW,EAAS,CAAQ,CACrD,CAEA,SAAS,GAAM,EAAe,EAAuB,CACnD,IAAM,EAAY,GAAc,EAAO,CAAO,EAE9C,GAAI,EAAU,SAAW,EAAG,MAAM,IAAI,EAAc,6CAA6C,EACjG,GAAI,EAAU,SAAW,EAAG,OAAO,EAAU,GAE7C,MAAM,IAAI,EAAc,0DAA0D,CACpF,CC5DA,IAAM,EAAN,KAAY,sBACV,SAAS,EAAA,SACT,OAAO,EAAA,SACP,eAAe,EAAA,SACf,eAAe,EAAA,SACf,UAAU,EAAA,SACV,SAAS,EAAA,EACX,ECiBM,EAAU,OAAO,SAAS,EAYhC,SAAS,GAAqB,EAAiC,CAC7D,IAAM,EAAc,IAAI,IAAmB,CACzC,EAAO,iBACP,EAAO,mBACP,EAAO,iBACT,CAAC,CAAC,OAAQ,GAA0B,IAAM,IAAA,EAAS,CAAC,EAI9C,EAAkB,EAAO,mBACzB,EAAe,EAAO,KAAK,OAAO,GACtC,EAAE,EAAE,WAAa,UAAY,EAAE,WAAa,CAAC,EAAY,IAAI,CAAC,CAAC,EAC3D,EAAkB,EAAO,KAAK,OAAO,GAAK,EAAY,IAAI,CAAC,CAAC,EAElE,MAAO,CACL,GAAG,EAAgB,IAAI,IAAQ,CAAE,MAAK,YAAa,EAAK,EAAE,EAC1D,GAAG,EAAa,IAAI,IAAQ,CAAE,MAAK,YAAa,EAAM,EAAE,EACxD,GAAG,EAAgB,IAAI,IAAQ,CAAE,MAAK,YAAa,EAAK,EAAE,CAC5D,CACF,CAGA,SAAS,GAAU,EAAoB,EAAuF,CAC5H,IAAK,IAAI,EAAQ,EAAG,EAAS,EAAM,eAAe,OAAQ,EAAQ,EAAQ,GAAS,EAAG,CACpF,GAAM,CAAE,MAAK,eAAgB,EAAM,eAAe,GAElD,GAAI,EAAI,UAAY,EAAI,SAAS,CAAM,EAAG,CACxC,IAAI,EAMJ,MALA,CAGE,EAHE,EAAI,kBAAoB,EAAI,iBACpB,EAAI,iBAAiB,CAAM,EAE3B,EAAI,QAET,CAAE,MAAK,UAAS,aAAY,CACrC,CACF,CAEA,OAAO,IACT,CAKA,SAAS,EAAO,EAAoB,EAAwC,CAC1E,GAAI,CAAC,EAAM,QAA6B,OAAO,GAAW,UAArC,EAA+C,CAClE,IAAM,EAAW,EAAM,KAAK,IAAI,CAAM,EACtC,GAAI,EAEF,OADI,EAAS,SAAW,IAAA,KAAW,EAAS,OAAS,OAAO,EAAM,gBAC3D,CAAE,KAAM,QAAS,IAAK,GAAI,MAAO,IAAI,EAAS,OAAQ,EAAS,MAAO,CAEjF,CAEA,IAAM,EAAU,GAAS,EAAO,CAAM,EAEtC,GAAI,CAAC,EAAS,CAEZ,GADI,IAAW,IAAA,IACX,EAAM,YAAa,OAAO,EAC9B,MAAM,IAAI,EAAc,0CAA0C,OAAO,UAAU,SAAS,KAAK,CAAM,GAAG,CAC5G,CAEA,GAAM,CAAE,MAAK,UAAS,eAAgB,EAChC,EAAc,EAAc,EAAU,GAAa,CAAO,EAEhE,GAAI,EAAI,WAAa,SAAU,CAC7B,IAAM,EAAQ,IAAI,EAQlB,MAPA,GAAM,OAAS,CAAC,EAOT,CALL,KAAM,SACN,IAAK,EACL,QACA,MAAO,EAAI,UAAU,CAAM,CAEtB,CACT,CAEA,GAAI,EAAI,WAAa,WAAY,CAC/B,IAAM,EAAY,EAAI,UAAU,CAAM,EAChC,EAAQ,IAAI,EAClB,EAAM,OAAS,CAAC,EAChB,IAAM,EAAqB,CAAE,KAAM,WAAY,IAAK,EAAa,QAAO,MAAO,CAAC,CAAE,EAC7E,EAAM,QAAQ,EAAM,KAAK,IAAI,EAAQ,CAAI,EAE9C,IAAK,IAAI,EAAQ,EAAG,EAAS,EAAU,OAAQ,EAAQ,EAAQ,GAAS,EAAG,CACzE,IAAI,EAAO,EAAM,EAAO,EAAU,EAAM,EAEpC,IAAS,GAAW,EAAU,KAAW,IAAA,KAAW,EAAO,EAAM,EAAO,IAAI,GAC5E,IAAS,GACb,EAAK,MAAM,KAAK,CAAI,CACtB,CACA,OAAO,CACT,CAGA,IAAM,EAAM,EAAI,UAAU,CAAM,EAC1B,EAAQ,IAAI,EAClB,EAAM,OAAS,CAAC,EAChB,IAAM,EAAoB,CAAE,KAAM,UAAW,IAAK,EAAa,QAAO,MAAO,CAAC,CAAE,EAC3E,EAAM,QAAQ,EAAM,KAAK,IAAI,EAAQ,CAAI,EAE9C,IAAK,GAAM,CAAC,EAAW,KAAgB,EAAK,CAC1C,IAAM,EAAM,EAAM,EAAO,CAAS,EAClC,GAAI,IAAQ,EAAS,SACrB,IAAM,EAAQ,EAAM,EAAO,CAAW,EAClC,IAAU,GACd,EAAK,MAAM,KAAK,CAAE,MAAK,OAAM,CAAC,CAChC,CACA,OAAO,CACT,CAIA,SAAS,GAAS,EAAgB,EAAgB,EAAyB,CAAC,EAAe,SASzF,IAAM,EAAO,EAAM,CAPjB,eAAgB,GAAoB,CAAM,EAC1C,QAAA,EAAQ,EAAQ,SAAA,KAAU,GAAV,EAChB,aAAA,EAAa,EAAQ,cAAA,KAAe,GAAf,EACrB,KAAM,IAAI,IACV,WAAY,CAGK,EAAO,CAAK,EAC/B,MAAO,CAAC,CAAE,SAAU,IAAS,EAAU,KAAO,EAAM,WAAY,CAAC,CAAE,CAAC,CACtE,CCzJA,IAAM,GAAc,OAAO,aAAa,EAClC,GAAa,OAAO,YAAY,EAgBtC,SAAS,GAAW,EAAY,EAAkB,EAA4B,CAC5E,IAAM,EAAU,EAAQ,EAAM,CAAG,EACjC,GAAI,IAAY,GAAa,MAAO,GACpC,GAAI,IAAY,GAAY,MAAO,GAEnC,IAAM,EAAQ,EAAI,MAAQ,EAE1B,OAAQ,EAAK,KAAb,CACE,IAAK,WACH,IAAK,IAAM,KAAQ,EAAK,MACtB,GAAI,GAAU,EAAM,EAAS,CAAE,QAAO,OAAQ,EAAM,MAAO,EAAM,CAAC,EAAG,MAAO,GAE9E,MACF,IAAK,UACH,IAAK,GAAM,CAAE,MAAK,WAAW,EAAK,MAEhC,GADI,GAAU,EAAK,EAAS,CAAE,QAAO,OAAQ,EAAM,MAAO,EAAK,CAAC,GAC5D,GAAU,EAAO,EAAS,CAAE,QAAO,OAAQ,EAAM,MAAO,EAAM,CAAC,EAAG,MAAO,GAE/E,KACJ,CAEA,MAAO,EACT,CAGA,SAAS,GAAO,EAAuB,EAAwB,CAC7D,IAAK,IAAM,KAAO,EAChB,GAAI,EAAI,UAAY,GAAU,EAAI,SAAU,EAAS,CAAE,MAAO,EAAG,OAAQ,KAAM,MAAO,EAAM,CAAC,EAAG,MAEpG,CC1CA,IAAM,GAAW,MACX,GAAW,EACX,EAAiB,GACjB,GAAuB,GACvB,GAAa,GACb,GAAmB,GACnB,GAAoB,GACpB,GAAa,GACb,GAAe,GACf,GAAiB,GACjB,GAAoB,GACpB,GAAgB,GAChB,GAAa,GACb,GAAa,GACb,EAAa,GACb,GAAc,GACd,GAAoB,GACpB,GAAgB,GAChB,GAAqB,GACrB,GAA2B,GAC3B,GAA4B,GAC5B,GAAoB,GACpB,GAA0B,IAC1B,GAAqB,IACrB,GAA2B,IAE3B,EAA2C,CAAC,EAElD,EAAiB,GAAQ,MACzB,EAAiB,GAAQ,MACzB,EAAiB,GAAQ,MACzB,EAAiB,GAAQ,MACzB,EAAiB,IAAQ,MACzB,EAAiB,IAAQ,MACzB,EAAiB,IAAQ,MACzB,EAAiB,IAAQ,MACzB,EAAiB,IAAQ,MACzB,EAAiB,IAAQ,MACzB,EAAiB,IAAQ,OACzB,EAAiB,KAAQ,MACzB,EAAiB,KAAQ,MACzB,EAAiB,MAAU,MAC3B,EAAiB,MAAU,MAkB3B,IAAM,GAAwE,CAC5E,OAAQ,EACR,YAAa,GACb,eAAgB,GAChB,SAAU,GACV,UAAW,GACX,mBAAoB,GACpB,mBAAoB,GACpB,mBAAoB,GACpB,cAAe,GACf,WAAY,SACZ,YAAa,GACb,gBAAiB,EACnB,EAOA,SAAS,GAAc,EAAY,CACjC,OAAO,EAAK,MAAM,OAAS,EAAK,IAAM,GAAa,EAAK,GAAG,CAC7D,CAEA,SAAS,GAAsB,EAA2C,CACxE,IAAM,EAAA,EAAA,EAAA,CAAA,EACD,EAAA,EACA,CACL,EAEA,OAAA,EAAA,EAAA,CAAA,EACK,CAAA,EAAA,CAAA,EAAA,CACH,qBAAsB,EAAK,OAAO,iBAAiB,QACnD,kBAAmB,EAAK,OAAO,mBACjC,CACF,CAEA,SAAS,GAAoB,EAAmB,CAG9C,IAAM,EAAS,EAAU,SAAS,EAAE,CAAC,CAAC,YAAY,EAC5C,EAAS,GAAa,IAAO,IAAM,IACnC,EAAS,GAAa,IAAO,EAAI,EAEvC,MAAO,KAAK,IAAS,IAAI,OAAO,EAAS,EAAO,MAAM,IAAI,GAC5D,CAGA,SAAS,GAAc,EAAgB,EAAgB,CACrD,IAAM,EAAM,IAAI,OAAO,CAAM,EACzB,EAAW,EACX,EAAS,GACP,EAAS,EAAO,OAEtB,KAAO,EAAW,GAAQ,CACxB,IAAI,EACE,EAAO,EAAO,QAAQ;EAAM,CAAQ,EACtC,IAAS,IACX,EAAO,EAAO,MAAM,CAAQ,EAC5B,EAAW,IAEX,EAAO,EAAO,MAAM,EAAU,EAAO,CAAC,EACtC,EAAW,EAAO,GAGhB,EAAK,QAAU,IAAS;IAAM,GAAU,GAE5C,GAAU,CACZ,CAEA,OAAO,CACT,CAEA,SAAS,GAAkB,EAAuB,EAAe,CAC/D,MAAO,KAAK,IAAI,OAAO,EAAM,OAAS,CAAK,GAC7C,CAUA,SAAS,GAAc,EAAuB,EAAe,CAC3D,IAAM,EAAS,EAAM,OAAS,KAAK,IAAI,EAAG,CAAK,EAM/C,MAAO,CAAE,SAAQ,YALG,IAAU,EAAI,EAAM,OAAS,EAAI,EAAM,OAK7B,UAJX,EAAM,YAAc,GACnC,GACA,KAAK,IAAI,KAAK,IAAI,EAAM,UAAW,EAAE,EAAG,EAAM,UAAY,CAAM,CAE5B,CAC1C,CAEA,SAAS,GAAoB,EAAuB,EAAa,CAC/D,IAAK,IAAI,EAAQ,EAAG,EAAS,EAAM,kBAAkB,OAAQ,EAAQ,EAAQ,GAAS,EAAG,CACvF,IAAM,EAAgB,EAAM,kBAAkB,GAE9C,GAAI,EAAc,QAAQ,EAAK,GAAO,EAAc,OAAO,IAAM,EAC/D,OAAO,EAAc,OAEzB,CAEA,OAAO,EAAM,oBACf,CAGA,SAAS,EAAc,EAAW,CAChC,OAAO,IAAM,IAAc,IAAM,EACnC,CAIA,SAAS,GAA6B,EAAgB,CACpD,IAAM,EAAS,EAAO,WAAW,CAAC,EAElC,GAAK,IAAW,IAAc,IAAW,IACrC,EAAO,WAAW,CAAC,IAAM,GAAU,EAAO,WAAW,CAAC,IAAM,EAAQ,MAAO,GAE/E,GAAI,EAAO,SAAW,EAAG,MAAO,GAEhC,IAAM,EAAY,EAAO,WAAW,CAAC,EACrC,OAAO,EAAa,CAAS,GAC3B,IAAc,IAAwB,IAAc,CACxD,CAMA,SAAS,EAAa,EAAW,CAC/B,OAAQ,GAAK,IAAW,GAAK,KACzB,GAAK,KAAW,GAAK,OAAa,IAAM,MAAU,IAAM,MACxD,GAAK,OAAW,GAAK,OAAa,IAAM,IACzC,GAAK,OAAW,GAAK,OAC1B,CAOA,SAAS,GAAsB,EAAW,CACxC,OAAO,EAAY,CAAC,GAClB,IAAM,IAEN,IAAM,IACN,IAAM,CACV,CAcA,SAAS,GAAa,EAAW,EAAc,EAAkB,CAC/D,IAAM,EAAwB,GAAqB,CAAC,EAC9C,EAAY,GAAyB,CAAC,EAAa,CAAC,EAC1D,OAGI,EACI,EACA,GAEA,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,KAGZ,IAAM,IACN,EAAE,IAAS,GAAc,CAAC,IAE3B,GAAqB,CAAI,GAAK,CAAC,EAAa,CAAI,GAAK,IAAM,IAC3D,IAAS,GAAc,CAC1B,CAGA,SAAS,GAAkB,EAAW,CAIpC,OAAO,EAAY,CAAC,GAClB,IAAM,IACN,CAAC,EAAa,CAAC,GAGf,IAAM,IACN,IAAM,IACN,IAAM,GACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IAEN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IAEN,IAAM,IACN,IAAM,IACN,IAAM,EACV,CAEA,SAAS,GAAoB,EAAgB,EAAkB,CAC7D,IAAM,EAAQ,EAAY,EAAQ,CAAC,EAEnC,GAAI,GAAiB,CAAK,EAAG,MAAO,GAEpC,GACE,EAAO,OAAS,IACf,IAAU,IAAc,IAAU,IAAiB,IAAU,GAC9D,CACA,IAAM,EAAS,EAAY,EAAQ,CAAC,EAMpC,MAAO,CAAC,EAAa,CAAM,GAAK,GAAY,EAAQ,EAAO,CAAO,CACpE,CAEA,MAAO,EACT,CAGA,SAAS,GAAiB,EAAW,CAEnC,MAAO,CAAC,EAAa,CAAC,GAAK,IAAM,CACnC,CAGA,SAAS,EAAa,EAAgB,EAAa,CACjD,IAAM,EAAQ,EAAO,WAAW,CAAG,EAC/B,EASJ,OAPI,GAAS,OAAU,GAAS,OAAU,EAAM,EAAI,EAAO,SACzD,EAAS,EAAO,WAAW,EAAM,CAAC,EAC9B,GAAU,OAAU,GAAU,QAExB,EAAQ,OAAU,KAAQ,EAAS,MAAS,MAGjD,CACT,CAEA,SAAS,GAAqB,EAAgB,CAE5C,MAAO,QAAe,KAAK,CAAM,CACnC,CAEA,IAAM,EAAc,EACd,GAAe,EACf,GAAgB,EAChB,GAAe,EACf,EAAe,EAgBrB,SAAS,GAAmB,EAAuB,EAAgB,EACjE,EAAyB,EAAqB,EAAiC,CAC/E,GAAM,CAAE,cAAa,aAAc,EAC/B,EACA,EAAO,EACP,EAAW,GACX,EAAe,GACf,EAAkB,GAChB,EAAmB,IAAc,GACnC,EAAoB,GAGpB,EAAQ,CAAC,GAA4B,CAAM,GAC7C,GAAmB,EAAQ,CAAO,GAClC,GAAgB,EAAY,EAAQ,EAAO,OAAS,CAAC,CAAC,EAExD,GAAI,GAAkB,EAGpB,IAAK,EAAI,EAAG,EAAI,EAAO,OAAQ,GAAQ,MAAU,GAAK,EAAI,IAAK,CAE7D,GADA,EAAO,EAAY,EAAQ,CAAC,EACxB,CAAC,EAAY,CAAI,EACnB,OAAO,EAET,EAAQ,GAAS,GAAY,EAAM,EAAU,CAAO,EACpD,EAAW,CACb,KACK,CAEL,IAAK,EAAI,EAAG,EAAI,EAAO,OAAQ,GAAQ,MAAU,GAAK,EAAI,IAAK,CAE7D,GADA,EAAO,EAAY,EAAQ,CAAC,EACxB,IAAS,EACX,EAAe,GAEX,IACF,EAAkB,GAEf,EAAI,EAAoB,EAAI,GAC5B,EAAO,EAAoB,KAAO,IACrC,EAAoB,QAEjB,GAAI,CAAC,EAAY,CAAI,EAC1B,OAAO,EAET,EAAQ,GAAS,GAAY,EAAM,EAAU,CAAO,EACpD,EAAW,CACb,CAEA,EAAkB,GAAoB,GACnC,EAAI,EAAoB,EAAI,GAC5B,EAAO,EAAoB,KAAO,GACvC,CAgBA,MAZI,CAAC,GAAgB,CAAC,EAGhB,GAAS,CAAC,EAAmB,EAC1B,EAAM,aAAe,SAAW,EAAe,GAGpD,EAAc,GAAK,GAAoB,CAAM,EACxC,EAIF,EAAkB,GAAe,EAC1C,CAQA,SAAS,GAAmB,EAAgB,EAAsB,EAAyC,CACzG,GAAM,CAAE,SAAQ,cAAa,aAAc,EAE3C,OAAQ,EAAR,CACE,KAAK,EACH,OAAO,GAAiB,EAAQ,CAAM,EACxC,KAAK,GACH,MAAO,IAAI,GAAiB,EAAQ,CAAM,CAAC,CAAC,QAAQ,KAAM,IAAI,EAAE,GAClE,KAAK,GACH,MAAO,IAAM,GAAY,EAAQ,CAAW,EAC1C,GAAkB,GAAa,EAAQ,CAAM,CAAC,EAClD,KAAK,GACH,MAAO,IAAM,GAAY,EAAQ,CAAW,EAC1C,GAAkB,GAAa,GAAgB,EAAQ,CAAS,EAAG,CAAM,CAAC,EAC9E,KAAK,EACH,MAAO,IAAI,GAAa,CAAM,EAAE,EACpC,CACF,CAIA,SAAS,GAAoB,EAAuB,EAClD,EAAyC,EAAgB,EAAiC,CAE1F,IAAM,EAAiB,GAAS,CAAC,EAMjC,GAAI,EAAK,MAAM,aAAc,OAAO,GACpC,GAAI,EAAK,MAAM,aAAc,OAAO,EACpC,GAAI,CAAC,EAAgB,CACnB,GAAI,EAAK,MAAM,QAAS,OAAO,GAC/B,GAAI,EAAK,MAAM,OAAQ,OAAO,EAChC,CAEA,IAAM,EAAS,EAAK,MAEpB,GAAI,EAAO,SAAW,EAKpB,OADI,EAAK,MAAM,QAAU,GAAmB,EAAO,CAAM,IAAM,EAAK,IAAY,EACzE,EAAM,aAAe,SAAW,EAAe,GAKxD,IAAM,EAAQ,GACZ,EAAO,EAAQ,EAAQ,EAAgB,EAAM,aAAe,CAAC,EAAO,CAAO,EAQ7E,OAHI,IAAU,GAAe,CAAC,EAAK,MAAM,QAAU,GAAmB,EAAO,CAAM,IAAM,EAAK,IACrF,EAAM,aAAe,SAAW,EAAe,GAEjD,CACT,CAGA,SAAS,GAAa,EAAgB,EAAwB,CAC5D,IAAM,EAAkB,GAAoB,CAAM,EAAI,OAAO,CAAc,EAAI,GAGzE,EAAO,EAAO,EAAO,OAAS,KAAO;EAI3C,MAAO,GAAG,IAHG,IAAS,EAAO,EAAO,OAAS,KAAO;GAAQ,IAAW;GAClD,IAAO,EAAO,GAAK,IAEN,GACpC,CAUA,SAAS,GAAkB,EAAgB,EAAgB,CACzD,IAAI,EAAS,EAAO,QAAQ;CAAI,EAChC,GAAI,IAAW,GAAI,OAAO,EAE1B,IAAM,EAAM,IAAI,OAAO,CAAM,EACzB,EAAS,EAAO,MAAM,EAAG,CAAM,EAE7B,EAAS,iBACf,EAAO,UAAY,EACnB,IAAI,EACJ,KAAQ,EAAQ,EAAO,KAAK,CAAM,GAAI,CACpC,IAAM,EAAS,EAAM,EAAE,CAAC,OAClB,EAAO,EAAM,GAGnB,GAAU;EAAK,OAAO,EAAS,CAAC,EAAI,EAAM,CAC5C,CAEA,OAAO,CACT,CAIA,SAAS,GAAmB,EAAgB,CAC1C,OAAO,EAAO,EAAO,OAAS,KAAO;EAAO,EAAO,MAAM,EAAG,EAAE,EAAI,CACpE,CAIA,SAAS,GAAiB,EAAgB,EAAe,CAKvD,IAAM,EAAS,iBAGX,EAAS,EAAO,QAAQ;CAAI,EAC5B,IAAW,KAAI,EAAS,EAAO,QACnC,EAAO,UAAY,EACnB,IAAI,EAAS,GAAS,EAAO,MAAM,EAAG,CAAM,EAAG,CAAK,EAEhD,EAAmB,EAAO,KAAO;GAAQ,EAAO,KAAO,IACvD,EAGA,EACJ,KAAQ,EAAQ,EAAO,KAAK,CAAM,GAAI,CACpC,IAAM,EAAS,EAAM,GACf,EAAO,EAAM,GAEnB,EAAgB,EAAK,KAAO,IAC5B,GAAU,GACN,CAAC,GAAoB,CAAC,GAAgB,IAAS,GAAM;EAAO,IAC9D,GAAS,EAAM,CAAK,EACtB,EAAmB,CACrB,CAEA,OAAO,CACT,CAMA,SAAS,GAAU,EAAc,EAAe,CAC9C,GAAI,IAAS,IAAM,EAAK,KAAO,IAAK,OAAO,EAG3C,IAAM,EAAU,SACZ,EAEA,EAAQ,EACR,EACA,EAAO,EACP,EAAO,EACP,EAAS,GAMb,KAAQ,EAAQ,EAAQ,KAAK,CAAI,GAC/B,EAAO,EAAM,MAET,EAAO,EAAQ,IACjB,EAAO,EAAO,EAAS,EAAO,EAC9B,GAAU,KAAK,EAAK,MAAM,EAAO,CAAG,IAEpC,EAAQ,EAAM,GAEhB,EAAO,EAaT,MARA,IAAU;EAEN,EAAK,OAAS,EAAQ,GAAS,EAAO,EACxC,GAAU,GAAG,EAAK,MAAM,EAAO,CAAI,EAAE,IAAI,EAAK,MAAM,EAAO,CAAC,IAE5D,GAAU,EAAK,MAAM,CAAK,EAGrB,EAAO,MAAM,CAAC,CACvB,CAEA,SAAS,GAAc,EAAgB,CACrC,IAAI,EAAS,GACT,EAAO,EAEX,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,GAAQ,MAAU,GAAK,EAAI,IAAK,CACjE,EAAO,EAAY,EAAQ,CAAC,EAC5B,IAAM,EAAY,EAAiB,GAEnC,GAAI,EAAW,CACb,GAAU,EACV,QACF,CAEA,GAAI,EAAY,CAAI,EAAG,CACrB,GAAU,EAAO,GACb,GAAQ,QAAS,GAAU,EAAO,EAAI,IAC1C,QACF,CAEA,GAAU,GAAmB,CAAI,CACnC,CAEA,OAAO,CACT,CAEA,SAAS,GAAmB,EAAuB,EAAe,EAAoB,CACpF,IAAI,EAAS,GAEb,IAAK,IAAI,EAAQ,EAAG,EAAS,EAAK,MAAM,OAAQ,EAAQ,EAAQ,GAAS,EAAG,CAC1E,IAAM,EAAO,EAAU,EAAO,EAAO,EAAK,MAAM,GAAQ,CAAC,CAAC,EACtD,IAAW,KAAI,GAAU,IAAK,EAAM,mBAA2B,GAAN,OAC7D,GAAU,CACZ,CAEA,IAAM,EAAM,EAAM,oBAAsB,IAAW,GAAK,IAAM,GAC9D,MAAO,IAAI,IAAM,IAAS,EAAI,EAChC,CAEA,SAAS,GAAoB,EAAuB,EAAe,EAAoB,EAAkB,CACvG,IAAI,EAAS,GAEb,IAAK,IAAI,EAAQ,EAAG,EAAS,EAAK,MAAM,OAAQ,EAAQ,EAAQ,GAAS,EAAG,CAC1E,IAAM,EAAO,EAAU,EAAO,EAAQ,EAAG,EAAK,MAAM,GAClD,CAAE,MAAO,GAAM,QAAS,EAAM,eAAgB,WAAY,EAAK,CAAC,GAE9D,CAAC,GAAW,IAAW,MACzB,GAAU,GAAiB,EAAO,CAAK,GAIrC,IAAS,IAAM,IAAmB,EAAK,WAAW,CAAC,EACrD,GAAU,IAEV,GAAU,KAGZ,GAAU,CACZ,CAEA,OAAO,CACT,CAEA,SAAS,GAAkB,EAAuB,EAAe,EAAmB,CAClF,IAAI,EAAS,GACP,EAAQ,GAAiB,EAAO,EAAK,KAAK,EAEhD,IAAK,GAAM,CAAE,MAAK,WAAW,EAAO,CAClC,IAAI,EAAa,GACb,IAAW,KAAI,GAAc,IAAK,EAAM,mBAA2B,GAAN,OAEjE,IAAM,EAAU,EAAU,EAAO,EAAO,EAAK,CAAE,MAAO,EAAK,CAAC,EACtD,EAAe,EAAQ,OAAS,KAElC,EACF,GAAc,KACL,EAAM,gBACf,GAAc,KAGhB,IAAM,EAAY,EAAU,EAAO,EAAO,EAAO,CAAC,CAAC,EAE7C,EAAM,EAAM,oBAAsB,IAAc,GAAK,GAAK,IAEhE,GAAc,GAAG,IAAU,EAAM,eAAiB,CAAC,EAAe,IAAM,GAAG,GAAG,IAAM,IAEpF,GAAU,CACZ,CAEA,IAAM,EAAM,EAAM,oBAAsB,IAAW,GAAK,IAAM,GAC9D,MAAO,IAAI,IAAM,IAAS,EAAI,EAChC,CAIA,SAAS,GAAc,EAAgB,CACrC,OAAO,EAAI,OAAS,SAAW,EAAI,MAAQ,CAC7C,CAEA,SAAS,GAAkB,EAAuB,EAA6B,CAC7E,GAAI,CAAC,EAAM,SAAU,OAAO,EAE5B,IAAM,EAAO,EAAM,MAAM,EAEzB,GAAI,EAAM,WAAa,GACrB,EAAK,MAAM,EAAG,IAAM,CAClB,IAAM,EAAI,GAAa,EAAE,GAAG,EACtB,EAAI,GAAa,EAAE,GAAG,EAG5B,OAFI,EAAI,EAAU,GAClB,EAAI,EAAI,EAEV,CAAC,MACI,CACL,IAAM,EAAK,EAAM,SACjB,EAAK,MAAM,EAAG,IAAM,EAAG,GAAa,EAAE,GAAG,EAAG,GAAa,EAAE,GAAG,CAAC,CAAC,CAClE,CAEA,OAAO,CACT,CAEA,SAAS,GAAmB,EAAuB,EAAe,EAAmB,EAAkB,CACrG,IAAI,EAAS,GACP,EAAQ,GAAiB,EAAO,EAAK,KAAK,EAEhD,IAAK,IAAI,EAAQ,EAAG,EAAS,EAAM,OAAQ,EAAQ,EAAQ,GAAS,EAAG,CACrE,IAAI,EAAa,IAEb,CAAC,GAAW,IAAW,MACzB,GAAc,GAAiB,EAAO,CAAK,GAG7C,GAAM,CAAE,MAAK,SAAU,EAAM,GAMvB,GACF,EAAI,OAAS,WAAa,EAAI,OAAS,aACvC,CAAC,EAAI,MAAM,MAAQ,EAAI,MAAM,SAAW,GACzC,EAAI,OAAS,WAAa,EAAI,MAAM,SAAW,EAAI,MAAM,QAMtD,EAAU,EACZ,EAAU,EAAO,EAAQ,EAAG,EAC5B,CAAE,MAAO,GAAM,QAAS,GAAM,WAAY,CAAC,GAAgB,EAAO,EAAK,EAAQ,CAAC,CAAE,CAAC,EACnF,EAAU,EAAO,EAAQ,EAAG,EAAK,CAAE,MAAO,GAAM,QAAS,GAAM,MAAO,EAAK,CAAC,EAI1E,EAAkB,EAAI,OAAS,UAAY,EAAI,MAAM,QAAQ;CAAI,IAAM,GACvE,EAAe,GAAc,GAAmB,EAAQ,OAAS,KAEnE,IACE,GAAW,IAAmB,EAAQ,WAAW,CAAC,EACpD,GAAc,IAEd,GAAc,MAIlB,GAAc,EAEV,IACF,GAAc,GAAiB,EAAO,CAAK,GAG7C,IAAM,EAAY,EAAU,EAAO,EAAQ,EAAG,EAC5C,CAAE,MAAO,GAAM,QAAS,EAAc,WAAY,GAAgB,CAAC,GAAgB,EAAO,EAAO,EAAQ,CAAC,CAAE,CAAC,EAOzG,EAAiB,EAAI,OAAS,UAAY,EAAI,QAAU,IAC5D,IAAY,IACZ,EAAQ,WAAW,EAAQ,OAAS,CAAC,IAAM,IAC3C,EAAQ,WAAW,EAAQ,OAAS,CAAC,IAAM,GACvC,EAAc,CAAC,IAAiB,EAAI,OAAS,SAAW,GAAkB,IAAM,GAGlF,IAAc,IAAM,IAAmB,EAAU,WAAW,CAAC,EAC/D,GAAc,GAAG,EAAY,GAE7B,GAAc,GAAG,EAAY,IAG/B,GAAc,EAEd,GAAU,CACZ,CAEA,OAAO,CACT,CAkBA,SAAS,GAAiB,EAAuB,EAAY,EAAe,CAC1E,OAAO,EAAK,MAAM,QAAU,EAAK,SAAW,IAAA,IAAc,EAAM,OAAS,GAAK,EAAQ,CACxF,CAEA,SAAS,EAAW,EAAuB,EAAe,EAAY,EAA0B,OAC9F,GAAI,EAAK,OAAS,QAAS,MAAO,IAAI,EAAK,SAE3C,GAAM,CAAE,QAAQ,GAAO,QAAQ,GAAO,aAAa,IAAU,EACzD,GAAA,EAAU,EAAI,UAAA,KAAW,GAAX,EAEZ,EAAY,EAAK,SAAW,IAAA,GAE9B,GAAgB,EAAO,EAAM,CAAK,IACpC,EAAU,IAGZ,IAAI,EACA,EAAiB,EAAK,MAAM,OAC1B,EAAqB,IACxB,EAAK,OAAS,WAAa,EAAK,OAAS,aAC1C,CAAC,EAAK,MAAM,MAAQ,EAAK,MAAM,SAAW,EAE5C,GAAI,EAAK,OAAS,UAChB,AAGE,EAHE,EACK,GAAkB,EAAO,EAAO,EAAM,CAAO,EAE7C,GAAiB,EAAO,EAAO,CAAI,OAEvC,GAAI,EAAK,OAAS,WACvB,AAOE,EAPE,EACE,EAAM,aAAe,CAAC,GAAc,EAAQ,EACvC,GAAmB,EAAO,EAAQ,EAAG,EAAM,CAAO,EAElD,GAAmB,EAAO,EAAO,EAAM,CAAO,EAGhD,GAAkB,EAAO,EAAO,CAAI,MAExC,CACL,IAAM,EAAS,GAAa,EAAO,CAAK,EAClC,EAAQ,GAAmB,EAAO,EAAM,EAAQ,EAAO,CAAK,EAClE,EAAO,GAAkB,EAAK,MAAO,EAAO,CAAM,EAClD,EAAiB,EAAK,MAAM,QAAW,IAAU,GAAe,EAAK,MAAQ,EAAM,oBACrF,CASA,GAJI,GAAsB,GAAW,EAAQ,GAAK,EAAM,OAAS,IAC/D,EAAO,GAAG,IAAI,OAAO,EAAM,OAAS,CAAC,IAAI,KAGvC,GAAkB,EAAW,CAC/B,IAAM,EAAkB,CAAC,EACnB,EAAM,EAAiB,GAAa,CAAI,EAAI,KAC5C,EAAS,EAAY,IAAI,EAAK,SAAW,KAE3C,EAAM,iBACJ,IAAQ,MAAM,EAAM,KAAK,CAAG,EAC5B,IAAW,MAAM,EAAM,KAAK,CAAM,IAElC,IAAW,MAAM,EAAM,KAAK,CAAM,EAClC,IAAQ,MAAM,EAAM,KAAK,CAAG,GAKlC,IAAM,EAAM,IAAS,IAAM,EAAK,WAAW,CAAC,IAAM,EAAiB,GAAK,IACxE,EAAO,GAAG,EAAM,KAAK,GAAG,IAAI,IAAM,GACpC,CAEA,OAAO,CACT,CAMA,SAAS,GAAmB,EAAY,CACtC,OAAQ,EAAK,OAAS,YAAc,EAAK,OAAS,YAChD,CAAC,EAAK,MAAM,MACZ,EAAK,MAAM,SAAW,GACtB,CAAC,EAAK,MAAM,QACZ,EAAK,SAAW,IAAA,EACpB,CAKA,SAAS,GAAa,EAAY,CAGhC,IAAI,EAAO,EACX,MAAQ,EAAK,OAAS,YAAc,EAAK,OAAS,YAChD,CAAC,EAAK,MAAM,MAAQ,EAAK,MAAM,SAAW,GAC1C,EAAO,EAAK,OAAS,WACjB,EAAK,MAAM,EAAK,MAAM,OAAS,GAC/B,EAAK,MAAM,EAAK,MAAM,OAAS,EAAE,CAAC,MAGxC,GAAI,EAAK,OAAS,UAAY,EAAE,EAAK,MAAM,SAAW,EAAK,MAAM,QAAS,MAAO,GACjF,GAAM,CAAE,SAAU,EAElB,OAAO,EAAM,SAAS;;CAAM,GAAK,IAAU;CAC7C,CAEA,SAAS,GAAyB,EAAe,CAC/C,IAAI,EAAS,GAEb,IAAK,IAAM,KAAa,EAAI,WAAY,CACtC,GAAI,EAAU,OAAS,OAAQ,CAC7B,GAAU,SAAS,EAAU,QAAQ,IACrC,QACF,CAEA,GAAM,CAAE,SAAQ,UAAW,EAC3B,GAAU,QAAQ,EAAO,GAAG,EAAO,GACrC,CAEA,OAAO,CACT,CAGA,SAAS,GAAS,EAAuB,EAAmC,CAC1E,IAAM,EAAQ,GAAqB,CAAO,EACtC,EAAS,GACT,EAAgB,GAEpB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAU,OAAQ,GAAS,EAAG,CACxD,IAAM,EAAM,EAAU,GAChB,EAAa,GAAwB,CAAG,EACxC,EAAgB,IAAe,GAC/B,EAAS,EAAI,eAAiB,GAAkB,EAAQ,GAAK,CAAC,EAIpE,GAFA,GAAU,EAEN,EAAI,WAAa,KACf,IAAQ,GAAU;QACjB,GAAI,EAAQ,CACjB,IAAM,EAAO,EAAU,EAAO,EAAG,EAAI,SAAU,CAAE,MAAO,GAAM,QAAS,EAAK,CAAC,EAIvE,EAAM,IAAS,GAAK,GAAM,GAAiB,GAAkB,EAAI,QAAQ,EAAI;EAAO,IAC1F,GAAU,MAAM,IAAM,EAAK,GAC7B,KACE,IAAU,EAAU,EAAO,EAAG,EAAI,SAAU,CAAE,MAAO,GAAM,QAAS,EAAK,CAAC,EAAI;EAGhF,EAAgB,EAAI,aAAgB,EAAI,WAAa,MAAQ,GAAY,EAAI,QAAQ,EACjF,IACF,GAAU;EAEd,CAEA,OAAO,CACT,CC38BA,IAAM,GAAsB,GAAc,SAAA,EAAA,EAAA,CAAA,EAEnC,EAAA,EAAA,CAAA,EAAA,CACH,SAAU,EAAQ,EAAY,IAAY,CACxC,IAAM,EAAS,GAAa,QAAQ,EAAQ,EAAY,CAAO,EAC/D,OAAO,IAAW,EAAe,GAAW,QAAQ,EAAQ,EAAY,CAAO,EAAI,CACrF,CAAA,CACF,EAAA,EAAA,EAAA,CAAA,EAEK,EAAA,EAAA,CAAA,EAAA,CACH,SAAU,EAAQ,EAAY,IAAY,CACxC,IAAM,EAAS,GAAe,QAAQ,EAAQ,EAAY,CAAO,EACjE,OAAO,IAAW,EAAe,GAAa,QAAQ,EAAQ,EAAY,CAAO,EAAI,CACvF,CAAA,CACF,CACF,EAEM,GAAA,EAAA,EAAA,CAAA,EACD,EAAA,EAAA,CAAA,EAAA,CACH,OAAQ,GACR,YAAa,GACb,OAAQ,GACR,UAAW,GACX,cAAiB,CAAC,EACpB,EAIA,SAAS,GAAM,EAAY,EAAuB,CAAC,EAAG,CACpD,IAAM,EAAA,EAAA,EAAA,CAAA,EAAY,EAAA,EAAyB,CAAQ,EAE7C,EAAY,GAAQ,EAAO,EAAK,OAAQ,CAC5C,OAAQ,EAAK,OACb,YAAa,EAAK,WACpB,CAAC,EAiBD,OAbI,EAAK,WAAa,GACpB,GAAM,GAAY,EAAM,IAAQ,CAC1B,OAAI,MAAQ,EAAK,WAErB,MADA,GAAK,MAAM,KAAO,GACX,EACT,CAAC,EAGH,EAAK,UAAU,CAAS,EAKjB,GAAQ,EAAA,EAAA,EAAA,CAAA,EAAgB,GAAK,EAHT,OAAO,KAAK,EAGG,CAAkB,CAAA,EAAA,CAAA,EAAA,CAAG,OAAQ,EAAK,MAAA,CAAO,CAAC,CACtF,CC1CA,IAAM,EAAW,GAkCjB,SAAS,GAAe,EAAc,CAKpC,MAJI,aAAc,GAAS,EAAM,WAAa,EAAiB,EAAM,SACjE,gBAAiB,GAAS,EAAM,cAAgB,EAAiB,EAAM,YACvE,eAAgB,GAAS,EAAM,aAAe,EAAiB,EAAM,WACrE,UAAW,EAAc,EAAM,MAC5B,CACT,CAEA,SAAS,GAAQ,EAAwB,EAAmD,CAC1F,OAAO,EAAM,WAAa,EACtB,GACA,EAAM,OAAO,MAAM,EAAM,SAAU,EAAM,MAAM,CACrD,CAEA,SAAS,GAAY,EAAwB,EAAmD,CAC9F,OAAO,EAAM,cAAgB,EACzB,IAAA,GACA,EAAM,OAAO,MAAM,EAAM,YAAa,EAAM,SAAS,CAC3D,CAKA,SAAS,GAAuB,EAAwB,EAAgB,OACtE,GAAM,CAAE,UAAW,EACb,GAAA,EAAa,EAAO,0BAA0B,IAAI,EAAO,OAAO,CAAC,CAAC,IAAA,KACtE,EAAO,2BAD+D,EAExE,IAAK,IAAM,KAAO,EAChB,GAAI,EAAI,QAAQ,EAAQ,GAAO,EAAI,OAAO,IAAM,EAAc,OAAO,EAAI,QAE3E,OAAO,EAAO,iBAAiB,OACjC,CAEA,SAAS,GAAa,EAAwB,EAAgC,CAC5E,IAAM,EAAQ,GAAe,EAAM,OAAQ,CAAK,EAC1C,EAAM,GAAO,EAAO,CAAK,EACzB,EAAQ,IAAI,EAElB,OAAQ,EAAM,MAAd,CACE,IAAA,GAAiC,EAAM,aAAe,GAAM,MAC5D,IAAA,GAAiC,EAAM,aAAe,GAAM,MAC5D,IAAA,GAAiC,EAAM,QAAU,GAAM,MACvD,IAAA,GAAgC,EAAM,OAAS,GAAM,KACvD,CAEA,IAAI,EAUJ,OATI,IAAQ,GAGL,AAGL,EAHS,EAAM,QAAA,EACT,GAAsB,EAAO,CAAK,EAElC,EAAM,OAAO,iBAAiB,SALpC,EAAM,OAAS,GACf,EAAM,GAOD,CAAE,KAAM,SAAU,MAAK,QAAO,OAAQ,GAAW,EAAO,CAAK,EAAG,OAAM,CAC/E,CAEA,SAAS,GACP,EACA,EACA,EACgD,CAChD,IAAM,EAAM,GAAO,EAAO,CAAK,EACzB,EAAQ,IAAI,EACd,EAAM,QAAA,IAAiC,EAAM,KAAO,IAExD,IAAI,EAQJ,OAPI,IAAQ,GACV,EAAM,GAEN,EAAM,EACN,EAAM,OAAS,IAGV,CAAE,MAAK,QAAO,OAAQ,GAAW,EAAO,CAAK,CAAE,CACxD,CAEA,SAAS,GAAS,EAAwB,EAAY,CACpD,IAAM,EAAQ,EAAM,OAAO,EAAM,OAAO,OAAS,GAE7C,EAAM,OAAS,WACjB,EAAM,IAAI,SAAW,EACZ,EAAM,OAAS,WACxB,EAAM,KAAK,MAAM,KAAK,CAAI,EACjB,EAAM,KACf,EAAM,KAAK,MAAM,KAAK,CAAE,IAAK,EAAM,IAAK,MAAO,CAAK,CAAC,EACrD,EAAM,IAAM,MAEZ,EAAM,IAAM,CAEhB,CAEA,SAAS,GAAa,EAAiB,EAAwC,CAC7E,IAAM,EAAyB,CAC7B,OAAQ,EAAQ,OAChB,OAAQ,EAAQ,OAChB,WAAY,EACZ,SAAU,EACV,OAAQ,CAAC,EACT,UAAW,CAAC,CACd,EAEA,KAAO,EAAM,WAAa,EAAO,QAAQ,CACvC,IAAM,EAAQ,EAAO,EAAM,cAG3B,OAFA,EAAM,SAAW,GAAc,CAAK,EAE5B,EAAM,KAAd,CACE,IAAA,GAAqB,CACnB,IAAM,EAAgB,CACpB,SAAU,KACV,cAAe,EAAM,cACrB,YAAa,EAAM,YACnB,WAAY,EAAM,UACpB,EACA,EAAM,OAAO,KAAK,CAAE,KAAM,WAAY,KAAI,CAAC,EAC3C,KACF,CAEA,IAAA,GACE,GAAQ,EAAO,GAAY,EAAO,CAAK,CAAC,EACxC,MAEF,IAAA,GAAqB,CACnB,GAAM,CAAE,MAAK,QAAO,UAAW,GAAgB,EAAO,EAAO,uBAAuB,EAC9E,EAAqB,CAAE,KAAM,WAAY,MAAK,QAAO,SAAQ,MAAO,CAAC,CAAE,EAC7E,EAAM,OAAO,KAAK,CAAE,KAAM,WAAY,MAAK,CAAC,EAC5C,KACF,CAEA,IAAA,GAAoB,CAClB,GAAM,CAAE,MAAK,QAAO,UAAW,GAAgB,EAAO,EAAO,uBAAuB,EAC9E,EAAoB,CAAE,KAAM,UAAW,MAAK,QAAO,SAAQ,MAAO,CAAC,CAAE,EAC3E,EAAM,OAAO,KAAK,CAAE,KAAM,UAAW,OAAM,IAAK,IAAK,CAAC,EACtD,KACF,CAEA,IAAA,GAAkB,CAChB,IAAM,EAAO,EAAM,OAAO,MAAM,EAAM,YAAa,EAAM,SAAS,EAElE,GAAQ,EAAO,CADW,KAAM,QAAS,IAAK,GAAI,MAAO,IAAI,EAAS,OAAQ,CAC/D,CAAI,EACnB,KACF,CAEA,IAAA,GAAgB,CACd,IAAM,EAAQ,EAAM,OAAO,IAAI,EAC3B,EAAM,OAAS,WACjB,EAAM,UAAU,KAAK,EAAM,GAAG,EAE9B,GAAQ,EAAO,EAAM,IAAI,EAE3B,KACF,CACF,CACF,CAEA,OAAO,EAAM,SACf"}
|