@descent-vtt/spec-graph 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -35,7 +35,7 @@ export { attributesOf, execute, matches, parseQuery, query, renderMatch, QueryEr
35
35
  export type { ExecuteOptions, Match, NodeMatcher, Operator, Predicate, QuerySpec, StepSpec, } from './select.js';
36
36
  export { resolveStrict, runRules, sortDiagnostics, DEFAULT_SEVERITIES, RULE_DESCRIPTIONS, RULE_IDS, RULE_QUERIES, } from './rules.js';
37
37
  export type { RuleOptions } from './rules.js';
38
- export { createPainter, formatGraph, formatJson, formatReport, shouldUseAscii, shouldUseColor, } from './report.js';
38
+ export { createPainter, formatGraph, formatJson, formatReport, formatSarif, shouldUseAscii, shouldUseColor, } from './report.js';
39
39
  export type { ColorEnvironment, GraphExportOptions, GraphFormat, Painter, ReporterOptions } from './report.js';
40
40
  export { extractDocument, extractSpecifications, classifyReference, sectionPathAt } from './extract.js';
41
41
  export { findSpecificationRegions, readRegionStatus, regionAt } from './sections.js';
@@ -60,4 +60,4 @@ export { compareRefs, createLineIndex, formatRef, refOf, spanOf } from './source
60
60
  export type { LineIndex } from './source.js';
61
61
  export { basenamePosix, dirnamePosix, extnamePosix, joinPosix, normalisePosix, resolveFrom, toPosix, } from './paths.js';
62
62
  export { DISPOSITIONS, EDGE_KINDS, EDGE_TRAITS, OPENNESS_OF } from './types.js';
63
- export type { AnalysisSummary, DanglingReason, DanglingRef, Diagnostic, Disposition, DocumentNode, Edge, EdgeKind, EdgeOrigin, EdgeTraits, ItemNode, NodeKind, Openness, ParseProblem, Phase, Position, Receptivity, RelatedLocation, RuleId, Severity, SourceRef, Span, SpecNode, StateSignal, } from './types.js';
63
+ export type { AnalysisSummary, DanglingReason, DanglingRef, Diagnostic, Disposition, DocumentNode, Edge, EdgeKind, EdgeOrigin, EdgeTraits, ItemNode, MisreadKey, NodeKind, Openness, ParseProblem, Phase, Position, Receptivity, RelatedLocation, RuleId, Severity, SourceRef, Span, SpecNode, StateSignal, } from './types.js';
package/dist/index.js CHANGED
@@ -28,7 +28,7 @@ export { analyse, analyseSources, createFamilyFilter, createHistoryMatcher, with
28
28
  export { buildGraph, LOAD_BEARING_EDGES, OBLIGATION_EDGES } from './graph.js';
29
29
  export { attributesOf, execute, matches, parseQuery, query, renderMatch, QueryError, DEFAULT_MATCH_LIMIT, } from './select.js';
30
30
  export { resolveStrict, runRules, sortDiagnostics, DEFAULT_SEVERITIES, RULE_DESCRIPTIONS, RULE_IDS, RULE_QUERIES, } from './rules.js';
31
- export { createPainter, formatGraph, formatJson, formatReport, shouldUseAscii, shouldUseColor, } from './report.js';
31
+ export { createPainter, formatGraph, formatJson, formatReport, formatSarif, shouldUseAscii, shouldUseColor, } from './report.js';
32
32
  export { extractDocument, extractSpecifications, classifyReference, sectionPathAt } from './extract.js';
33
33
  export { findSpecificationRegions, readRegionStatus, regionAt } from './sections.js';
34
34
  export { resolveCorpus, documentOf } from './resolve.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EACL,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,cAAc,GACf,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGxF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG/F,OAAO,EACL,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9E,OAAO,EACL,YAAY,EACZ,OAAO,EACP,OAAO,EACP,UAAU,EACV,KAAK,EACL,WAAW,EACX,UAAU,EACV,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAWrB,OAAO,EACL,aAAa,EACb,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,EACR,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACxG,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAIrF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAatD,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGhF,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGjE,OAAO,EACL,SAAS,EACT,eAAe,EACf,eAAe,EACf,aAAa,EACb,OAAO,EACP,aAAa,EACb,qBAAqB,EACrB,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGjE,OAAO,EACL,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,OAAO,GACR,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,SAAS,EACT,2BAA2B,EAC3B,aAAa,GACd,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrF,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,cAAc,EACd,WAAW,EACX,OAAO,GACR,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC","sourcesContent":["/**\n * Programmatic API.\n *\n * The CLI is a shell over `analyse`; anything the CLI can do, a build script, a\n * custom reporter or an editor extension can do too.\n *\n * ```ts\n * import { analyse, formatReport } from '@descent-vtt/spec-graph';\n *\n * const result = await analyse({ root: process.cwd(), patterns: ['docs/**\\/*.md'] });\n * if (!result.ok) console.error(formatReport(result, { color: true }));\n * ```\n *\n * For a corpus that is already in memory - a monorepo tool, a language server,\n * a test - skip the filesystem entirely:\n *\n * ```ts\n * import { analyseSources, query } from '@descent-vtt/spec-graph';\n *\n * const { graph } = analyseSources([{ path: 'adr/0001.md', text: '...' }]);\n * const ghosts = query(graph, 'item[openness=open] -delegates-to-> document[phase=retired]');\n * ```\n */\n\nexport {\n applyBaseline,\n formatBaseline,\n fingerprintOf,\n parseBaseline,\n BASELINE_VERSION,\n EMPTY_BASELINE,\n} from './baseline.js';\nexport type { Baseline, BaselineEntry, BaselineOutcome, ParsedBaseline } from './baseline.js';\n\nexport { loadConfig, parseConfig, CONFIG_FILES, CONFIG_PACKAGE_KEY } from './config.js';\nexport type { LoadedConfig, SpecGraphConfig } from './config.js';\n\nexport { main, parseArgs, HELP, UsageError, EXIT_OK, EXIT_FAILED, EXIT_ERROR } from './cli.js';\nexport type { CliIO, CliOptions, Command } from './cli.js';\n\nexport {\n analyse,\n analyseSources,\n createFamilyFilter,\n createHistoryMatcher,\n withDiagnostics,\n DEFAULT_CONCURRENCY,\n DEFAULT_PATTERNS,\n} from './runner.js';\nexport type { AnalyseOptions, AnalyseSourcesOptions, AnalysisResult, Source } from './runner.js';\n\nexport { buildGraph, LOAD_BEARING_EDGES, OBLIGATION_EDGES } from './graph.js';\nexport type { SpecGraph } from './graph.js';\n\nexport {\n attributesOf,\n execute,\n matches,\n parseQuery,\n query,\n renderMatch,\n QueryError,\n DEFAULT_MATCH_LIMIT,\n} from './select.js';\nexport type {\n ExecuteOptions,\n Match,\n NodeMatcher,\n Operator,\n Predicate,\n QuerySpec,\n StepSpec,\n} from './select.js';\n\nexport {\n resolveStrict,\n runRules,\n sortDiagnostics,\n DEFAULT_SEVERITIES,\n RULE_DESCRIPTIONS,\n RULE_IDS,\n RULE_QUERIES,\n} from './rules.js';\nexport type { RuleOptions } from './rules.js';\n\nexport {\n createPainter,\n formatGraph,\n formatJson,\n formatReport,\n shouldUseAscii,\n shouldUseColor,\n} from './report.js';\nexport type { ColorEnvironment, GraphExportOptions, GraphFormat, Painter, ReporterOptions } from './report.js';\n\nexport { extractDocument, extractSpecifications, classifyReference, sectionPathAt } from './extract.js';\nexport { findSpecificationRegions, readRegionStatus, regionAt } from './sections.js';\nexport type { RegionStatus, SpecificationRegion } from './sections.js';\nexport type { Classification, ExtractedDocument, ExtractInput, ReferenceCandidate } from './extract.js';\n\nexport { resolveCorpus, documentOf } from './resolve.js';\nexport type { ResolvedCorpus, ResolveOptions } from './resolve.js';\n\nexport { scanMarkdown, slugify } from './markdown.js';\nexport type {\n FrontMatter,\n Heading,\n HtmlComment,\n Link,\n LinkForm,\n ListItem,\n Range,\n ScannedDocument,\n ScannedLine,\n} from './markdown.js';\n\nexport { parseDirectives, attr, attrList, directiveFor } from './directives.js';\nexport type { Attribute, Directive, DirectiveName } from './directives.js';\n\nexport { parseFrontMatter, toRecord, valuesOf } from './yaml.js';\nexport type { YamlEntry } from './yaml.js';\n\nexport {\n isRetired,\n isStatusHeading,\n normaliseStatus,\n phaseFromPath,\n phaseOf,\n receptivityOf,\n supersessionTargetsIn,\n STATUS_KEYS,\n} from './lifecycle.js';\n\nexport { resolveItemState, KNOWN_STATE_WORDS } from './state.js';\nexport type { ResolvedState, StateInput } from './state.js';\n\nexport {\n familyFromPath,\n identify,\n isDocumentTarget,\n isExternal,\n looksLikePath,\n normaliseRef,\n parseBareRef,\n parsePrefixedRef,\n splitAnchor,\n ID_KEYS,\n} from './identity.js';\nexport type { DocumentIdentity, IdentityInput } from './identity.js';\n\nexport {\n createGlobMatcher,\n createReferenceFilter,\n globBase,\n globToRegExp,\n isGlob,\n walkFiles,\n DEFAULT_IGNORED_DIRECTORIES,\n MAX_FILE_SIZE,\n} from './glob.js';\nexport type { GlobMatcher, WalkedFile, WalkOptions } from './glob.js';\n\nexport { compareRefs, createLineIndex, formatRef, refOf, spanOf } from './source.js';\nexport type { LineIndex } from './source.js';\n\nexport {\n basenamePosix,\n dirnamePosix,\n extnamePosix,\n joinPosix,\n normalisePosix,\n resolveFrom,\n toPosix,\n} from './paths.js';\n\nexport { DISPOSITIONS, EDGE_KINDS, EDGE_TRAITS, OPENNESS_OF } from './types.js';\nexport type {\n AnalysisSummary,\n DanglingReason,\n DanglingRef,\n Diagnostic,\n Disposition,\n DocumentNode,\n Edge,\n EdgeKind,\n EdgeOrigin,\n EdgeTraits,\n ItemNode,\n NodeKind,\n Openness,\n ParseProblem,\n Phase,\n Position,\n Receptivity,\n RelatedLocation,\n RuleId,\n Severity,\n SourceRef,\n Span,\n SpecNode,\n StateSignal,\n} from './types.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EACL,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,cAAc,GACf,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGxF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG/F,OAAO,EACL,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9E,OAAO,EACL,YAAY,EACZ,OAAO,EACP,OAAO,EACP,UAAU,EACV,KAAK,EACL,WAAW,EACX,UAAU,EACV,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAWrB,OAAO,EACL,aAAa,EACb,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,EACR,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACxG,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAIrF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAatD,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGhF,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGjE,OAAO,EACL,SAAS,EACT,eAAe,EACf,eAAe,EACf,aAAa,EACb,OAAO,EACP,aAAa,EACb,qBAAqB,EACrB,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGjE,OAAO,EACL,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,OAAO,GACR,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,SAAS,EACT,2BAA2B,EAC3B,aAAa,GACd,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrF,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,cAAc,EACd,WAAW,EACX,OAAO,GACR,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC","sourcesContent":["/**\n * Programmatic API.\n *\n * The CLI is a shell over `analyse`; anything the CLI can do, a build script, a\n * custom reporter or an editor extension can do too.\n *\n * ```ts\n * import { analyse, formatReport } from '@descent-vtt/spec-graph';\n *\n * const result = await analyse({ root: process.cwd(), patterns: ['docs/**\\/*.md'] });\n * if (!result.ok) console.error(formatReport(result, { color: true }));\n * ```\n *\n * For a corpus that is already in memory - a monorepo tool, a language server,\n * a test - skip the filesystem entirely:\n *\n * ```ts\n * import { analyseSources, query } from '@descent-vtt/spec-graph';\n *\n * const { graph } = analyseSources([{ path: 'adr/0001.md', text: '...' }]);\n * const ghosts = query(graph, 'item[openness=open] -delegates-to-> document[phase=retired]');\n * ```\n */\n\nexport {\n applyBaseline,\n formatBaseline,\n fingerprintOf,\n parseBaseline,\n BASELINE_VERSION,\n EMPTY_BASELINE,\n} from './baseline.js';\nexport type { Baseline, BaselineEntry, BaselineOutcome, ParsedBaseline } from './baseline.js';\n\nexport { loadConfig, parseConfig, CONFIG_FILES, CONFIG_PACKAGE_KEY } from './config.js';\nexport type { LoadedConfig, SpecGraphConfig } from './config.js';\n\nexport { main, parseArgs, HELP, UsageError, EXIT_OK, EXIT_FAILED, EXIT_ERROR } from './cli.js';\nexport type { CliIO, CliOptions, Command } from './cli.js';\n\nexport {\n analyse,\n analyseSources,\n createFamilyFilter,\n createHistoryMatcher,\n withDiagnostics,\n DEFAULT_CONCURRENCY,\n DEFAULT_PATTERNS,\n} from './runner.js';\nexport type { AnalyseOptions, AnalyseSourcesOptions, AnalysisResult, Source } from './runner.js';\n\nexport { buildGraph, LOAD_BEARING_EDGES, OBLIGATION_EDGES } from './graph.js';\nexport type { SpecGraph } from './graph.js';\n\nexport {\n attributesOf,\n execute,\n matches,\n parseQuery,\n query,\n renderMatch,\n QueryError,\n DEFAULT_MATCH_LIMIT,\n} from './select.js';\nexport type {\n ExecuteOptions,\n Match,\n NodeMatcher,\n Operator,\n Predicate,\n QuerySpec,\n StepSpec,\n} from './select.js';\n\nexport {\n resolveStrict,\n runRules,\n sortDiagnostics,\n DEFAULT_SEVERITIES,\n RULE_DESCRIPTIONS,\n RULE_IDS,\n RULE_QUERIES,\n} from './rules.js';\nexport type { RuleOptions } from './rules.js';\n\nexport {\n createPainter,\n formatGraph,\n formatJson,\n formatReport,\n formatSarif,\n shouldUseAscii,\n shouldUseColor,\n} from './report.js';\nexport type { ColorEnvironment, GraphExportOptions, GraphFormat, Painter, ReporterOptions } from './report.js';\n\nexport { extractDocument, extractSpecifications, classifyReference, sectionPathAt } from './extract.js';\nexport { findSpecificationRegions, readRegionStatus, regionAt } from './sections.js';\nexport type { RegionStatus, SpecificationRegion } from './sections.js';\nexport type { Classification, ExtractedDocument, ExtractInput, ReferenceCandidate } from './extract.js';\n\nexport { resolveCorpus, documentOf } from './resolve.js';\nexport type { ResolvedCorpus, ResolveOptions } from './resolve.js';\n\nexport { scanMarkdown, slugify } from './markdown.js';\nexport type {\n FrontMatter,\n Heading,\n HtmlComment,\n Link,\n LinkForm,\n ListItem,\n Range,\n ScannedDocument,\n ScannedLine,\n} from './markdown.js';\n\nexport { parseDirectives, attr, attrList, directiveFor } from './directives.js';\nexport type { Attribute, Directive, DirectiveName } from './directives.js';\n\nexport { parseFrontMatter, toRecord, valuesOf } from './yaml.js';\nexport type { YamlEntry } from './yaml.js';\n\nexport {\n isRetired,\n isStatusHeading,\n normaliseStatus,\n phaseFromPath,\n phaseOf,\n receptivityOf,\n supersessionTargetsIn,\n STATUS_KEYS,\n} from './lifecycle.js';\n\nexport { resolveItemState, KNOWN_STATE_WORDS } from './state.js';\nexport type { ResolvedState, StateInput } from './state.js';\n\nexport {\n familyFromPath,\n identify,\n isDocumentTarget,\n isExternal,\n looksLikePath,\n normaliseRef,\n parseBareRef,\n parsePrefixedRef,\n splitAnchor,\n ID_KEYS,\n} from './identity.js';\nexport type { DocumentIdentity, IdentityInput } from './identity.js';\n\nexport {\n createGlobMatcher,\n createReferenceFilter,\n globBase,\n globToRegExp,\n isGlob,\n walkFiles,\n DEFAULT_IGNORED_DIRECTORIES,\n MAX_FILE_SIZE,\n} from './glob.js';\nexport type { GlobMatcher, WalkedFile, WalkOptions } from './glob.js';\n\nexport { compareRefs, createLineIndex, formatRef, refOf, spanOf } from './source.js';\nexport type { LineIndex } from './source.js';\n\nexport {\n basenamePosix,\n dirnamePosix,\n extnamePosix,\n joinPosix,\n normalisePosix,\n resolveFrom,\n toPosix,\n} from './paths.js';\n\nexport { DISPOSITIONS, EDGE_KINDS, EDGE_TRAITS, OPENNESS_OF } from './types.js';\nexport type {\n AnalysisSummary,\n DanglingReason,\n DanglingRef,\n Diagnostic,\n Disposition,\n DocumentNode,\n Edge,\n EdgeKind,\n EdgeOrigin,\n EdgeTraits,\n ItemNode,\n MisreadKey,\n NodeKind,\n Openness,\n ParseProblem,\n Phase,\n Position,\n Receptivity,\n RelatedLocation,\n RuleId,\n Severity,\n SourceRef,\n Span,\n SpecNode,\n StateSignal,\n} from './types.js';\n"]}
@@ -101,13 +101,27 @@ export type LinkForm = 'inline' | 'reference' | 'shortcut' | 'autolink' | 'wiki'
101
101
  export interface Link {
102
102
  /** Visible label. Empty for autolinks and definitions. */
103
103
  readonly text: string;
104
- /** Destination as written: a path, a URL, or a reference label. */
104
+ /** Destination as written: a path or a URL. */
105
105
  readonly target: string;
106
106
  /** Offset of the whole construct. */
107
107
  readonly start: number;
108
108
  readonly end: number;
109
- /** Offset of `target` inside the source, for precise diagnostics. */
109
+ /**
110
+ * Offset of `target` inside the source, for precise diagnostics.
111
+ *
112
+ * For a reference link this is inside the definition, not inside the use:
113
+ * `[design][one]` has no destination of its own, and the line a human edits
114
+ * to fix it is the one that says what `one` points at.
115
+ */
110
116
  readonly targetStart: number;
117
+ /**
118
+ * The reference label, for the two forms written with one.
119
+ *
120
+ * `null` everywhere else. Kept because `target` is the destination the label
121
+ * stands for, and a report quoting `[design][docs/gone.md]` would be quoting
122
+ * something the author never wrote.
123
+ */
124
+ readonly label: string | null;
111
125
  readonly form: LinkForm;
112
126
  readonly line: number;
113
127
  }
package/dist/markdown.js CHANGED
@@ -29,7 +29,10 @@ export function scanMarkdown(source) {
29
29
  const frontMatter = readFrontMatter(text, index);
30
30
  const bodyStart = frontMatter ? frontMatter.bodyStart : 0;
31
31
  const lines = scanLines(text, index, bodyStart);
32
- const codeRanges = collectCodeRanges(lines, bodyStart);
32
+ // Raw-text HTML joins the code ranges rather than sitting beside them: what
33
+ // both have in common is that their content is not Markdown, and every reader
34
+ // downstream - comments, links, tables - already asks that one question.
35
+ const codeRanges = mergeRanges([...collectCodeRanges(lines, bodyStart), ...collectRawTextHtml(lines, bodyStart)]);
33
36
  const comments = scanComments(text, index, bodyStart, codeRanges);
34
37
  const inlineCode = scanInlineCode(text, bodyStart, codeRanges, comments);
35
38
  const maskRanges = [
@@ -205,6 +208,48 @@ function scanLines(text, index, bodyStart) {
205
208
  }
206
209
  return out;
207
210
  }
211
+ /**
212
+ * `<script>`, `<style>`, `<pre>` and `<textarea>` blocks.
213
+ *
214
+ * These four are the only HTML elements whose content is not Markdown - the
215
+ * CommonMark spec calls them out by name for exactly that reason - and the
216
+ * distinction is load-bearing here rather than pedantic. A page explaining how
217
+ * to annotate a document puts `<!-- @spec-node id="..." -->` inside a script
218
+ * sample or a `<pre>` block, and reading that as a directive lets a worked
219
+ * example rename the document it appears in.
220
+ *
221
+ * `<div>` and `<details>` are deliberately not on the list. Their content *is*
222
+ * Markdown, and a decision written inside a collapsed `<details>` section is
223
+ * still a decision.
224
+ */
225
+ const RAW_TEXT_OPEN = /^<(script|pre|style|textarea)(?:[\s>]|$)/i;
226
+ const RAW_TEXT_CLOSE = /<\/(?:script|pre|style|textarea)>/i;
227
+ function collectRawTextHtml(lines, bodyStart) {
228
+ const ranges = [];
229
+ let open = null;
230
+ for (const line of lines) {
231
+ if (line.code)
232
+ continue;
233
+ if (open === null) {
234
+ if (!RAW_TEXT_OPEN.test(line.content.trimStart()))
235
+ continue;
236
+ open = { start: Math.max(line.start, bodyStart), end: line.end };
237
+ }
238
+ else {
239
+ open.end = line.end;
240
+ }
241
+ // The close tag ends the block on the line that carries it, whichever of
242
+ // the four it names. An unclosed block runs to the end of the document,
243
+ // which is what a browser does with it too.
244
+ if (RAW_TEXT_CLOSE.test(line.content)) {
245
+ ranges.push(open);
246
+ open = null;
247
+ }
248
+ }
249
+ if (open)
250
+ ranges.push(open);
251
+ return ranges;
252
+ }
208
253
  function collectCodeRanges(lines, bodyStart) {
209
254
  const ranges = [];
210
255
  let open = null;
@@ -604,9 +649,13 @@ const AUTOLINK = /<((?:https?|ftp|mailto):[^>\s]+)>/g;
604
649
  const MAX_LINK_SPAN = 4096;
605
650
  function scanLinks(masked, text, index) {
606
651
  const out = [];
607
- const definitions = new Set();
652
+ const definitions = new Map();
608
653
  const definitionRanges = [];
609
- // Pass 1: reference definitions, which also make shortcut links resolvable.
654
+ // Pass 1: reference definitions. These are the destination table the other
655
+ // two written-with-a-label forms are read through, which is why the whole
656
+ // document is swept for them before a single use is looked at: a definition
657
+ // is conventionally written at the foot of the file, long after the links
658
+ // that use it.
610
659
  for (let line = 1; line <= index.lineCount; line += 1) {
611
660
  const start = index.lineStart(line);
612
661
  const content = masked.slice(start, index.lineEnd(line));
@@ -614,16 +663,20 @@ function scanLinks(masked, text, index) {
614
663
  if (!match)
615
664
  continue;
616
665
  const label = match[1].trim().toLowerCase();
617
- definitions.add(label);
618
666
  const rawTarget = match[2];
619
667
  const targetStart = start + content.indexOf(rawTarget, match[1].length);
668
+ const target = unwrapAngle(rawTarget);
669
+ // First definition wins, as in CommonMark.
670
+ if (!definitions.has(label))
671
+ definitions.set(label, { target, targetStart });
620
672
  definitionRanges.push({ start, end: start + match[0].length });
621
673
  out.push({
622
674
  text: match[1].trim(),
623
- target: unwrapAngle(rawTarget),
675
+ target,
624
676
  start,
625
677
  end: start + match[0].length,
626
678
  targetStart,
679
+ label: match[1].trim(),
627
680
  form: 'definition',
628
681
  line,
629
682
  });
@@ -638,6 +691,7 @@ function scanLinks(masked, text, index) {
638
691
  start,
639
692
  end: start + m[0].length,
640
693
  targetStart: start + 1,
694
+ label: null,
641
695
  form: 'autolink',
642
696
  line: index.positionAt(start).line,
643
697
  });
@@ -668,6 +722,7 @@ function scanLinks(masked, text, index) {
668
722
  start: i,
669
723
  end: close + 2,
670
724
  targetStart: i + 2,
725
+ label: null,
671
726
  form: 'wiki',
672
727
  line: index.positionAt(i).line,
673
728
  });
@@ -693,6 +748,7 @@ function scanLinks(masked, text, index) {
693
748
  start: isImage ? i - 1 : i,
694
749
  end: dest.close + 1,
695
750
  targetStart: dest.start,
751
+ label: null,
696
752
  form: 'inline',
697
753
  line: index.positionAt(i).line,
698
754
  });
@@ -705,14 +761,20 @@ function scanLinks(masked, text, index) {
705
761
  const refEnd = matchBracket(masked, labelEnd + 1);
706
762
  if (refEnd !== -1) {
707
763
  const ref = text.slice(labelEnd + 2, refEnd).trim();
708
- const resolved = ref.length > 0 ? ref : label.trim();
709
- if (!isImage) {
764
+ const written = ref.length > 0 ? ref : label.trim();
765
+ const defined = definitions.get(written.toLowerCase());
766
+ // A label with no definition is not a link. Every renderer prints
767
+ // `[design][one]` verbatim when nothing says what `one` is, so reading
768
+ // it as a citation invents a reference the author never made - and
769
+ // then reports it as broken.
770
+ if (!isImage && defined) {
710
771
  out.push({
711
772
  text: label.trim(),
712
- target: resolved,
713
- start: isImage ? i - 1 : i,
773
+ target: defined.target,
774
+ start: i,
714
775
  end: refEnd + 1,
715
- targetStart: ref.length > 0 ? labelEnd + 2 : i + 1,
776
+ targetStart: defined.targetStart,
777
+ label: written,
716
778
  form: 'reference',
717
779
  line: index.positionAt(i).line,
718
780
  });
@@ -721,18 +783,23 @@ function scanLinks(masked, text, index) {
721
783
  continue;
722
784
  }
723
785
  }
724
- else if (!isImage && definitions.has(label.trim().toLowerCase())) {
725
- out.push({
726
- text: label.trim(),
727
- target: label.trim(),
728
- start: i,
729
- end: labelEnd + 1,
730
- targetStart: i + 1,
731
- form: 'shortcut',
732
- line: index.positionAt(i).line,
733
- });
734
- i = labelEnd + 1;
735
- continue;
786
+ else if (!isImage) {
787
+ const written = label.trim();
788
+ const defined = definitions.get(written.toLowerCase());
789
+ if (defined) {
790
+ out.push({
791
+ text: written,
792
+ target: defined.target,
793
+ start: i,
794
+ end: labelEnd + 1,
795
+ targetStart: defined.targetStart,
796
+ label: written,
797
+ form: 'shortcut',
798
+ line: index.positionAt(i).line,
799
+ });
800
+ i = labelEnd + 1;
801
+ continue;
802
+ }
736
803
  }
737
804
  i = labelEnd + 1;
738
805
  }
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,eAAe,EAAkB,MAAM,aAAa,CAAC;AAkJ9D,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1D,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAElE,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG;QACjB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,UAAU;QACb,GAAG,UAAU;QACb,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;KACzD,CAAC;IACF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAE/C,OAAO;QACL,IAAI;QACJ,KAAK;QACL,WAAW;QACX,SAAS;QACT,KAAK;QACL,QAAQ;QACR,SAAS;QACT,QAAQ;QACR,KAAK;QACL,MAAM;QACN,MAAM;QACN,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC;KACzD,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,MAAM,QAAQ,GAAG,wBAAwB,CAAC;AAE1C,SAAS,eAAe,CAAC,IAAY,EAAE,KAAgB;IACrD,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,MAAM,GAAI,IAAI,CAAC,CAAC,CAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAEjG,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QACtD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YACnF,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;QAChE,CAAC;IACH,CAAC;IACD,iEAAiE;IACjE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,MAAM,WAAW,GAAG,wCAAwC,CAAC;AAC7D,MAAM,WAAW,GAAG,qDAAqD,CAAC;AAC1E,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AACjD,MAAM,cAAc,GAAG,8DAA8D,CAAC;AACtF,MAAM,UAAU,GAAG,6BAA6B,CAAC;AAEjD,kFAAkF;AAClF,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;aACtB,IAAI,EAAE,KAAK,IAAI;YAAE,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;;YAC1C,MAAM;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oFAAoF;AACpF,SAAS,WAAW,CAAC,GAAW,EAAE,SAAiB;IACjD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,SAAS,CAAC;QACR,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,CAAC,CAAC;YACZ,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;QACD,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,MAAM;QAC1B,CAAC,IAAI,CAAC,CAAC;QACP,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,CAAC,IAAI,CAAC,CAAC;QAC3B,KAAK,IAAI,CAAC,CAAC;QACX,CAAC,GAAG,CAAC,CAAC;IACR,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,SAAS,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,KAAgB,EAAE,SAAiB;IAClE,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;IAEnD,IAAI,KAAK,GAA4D,IAAI,CAAC;IAC1E,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,aAAa,GAAG,IAAI,CAAC;IACzB,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,KAAK,IAAI,IAAI,GAAG,SAAS,EAAE,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,GAAG,GAAG,SAAS;YAAE,SAAS;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACnC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;QAE1C,IAAI,IAAI,GAAG,KAAK,CAAC;QAEjB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,CAAC;YACZ,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvC,IACE,KAAK;gBACJ,KAAK,CAAC,CAAC,CAAY,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI;gBACrC,KAAK,CAAC,CAAC,CAAY,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;gBAC1C,KAAK,CAAC,CAAC,CAAY,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBACxC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAW,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EACrD,CAAC;gBACD,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,IAAI,IAAK,IAAI,CAAC,CAAC,CAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACpD,KAAK,GAAG;oBACN,IAAI,EAAG,IAAI,CAAC,CAAC,CAAY,CAAC,CAAC,CAAW;oBACtC,MAAM,EAAG,IAAI,CAAC,CAAC,CAAY,CAAC,MAAM;oBAClC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAW,CAAC;iBACzC,CAAC;gBACF,IAAI,GAAG,IAAI,CAAC;gBACZ,YAAY,GAAG,KAAK,CAAC;YACvB,CAAC;iBAAM,IAAI,KAAK,EAAE,CAAC;gBACjB,IAAI,GAAG,YAAY,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,qEAAqE;gBACrE,uEAAuE;gBACvE,qEAAqE;gBACrE,gDAAgD;gBAChD,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,YAAY,CAAC,EAAE,CAAC;oBAC9D,IAAI,GAAG,IAAI,CAAC;oBACZ,YAAY,GAAG,IAAI,CAAC;gBACtB,CAAC;qBAAM,CAAC;oBACN,YAAY,GAAG,KAAK,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,GAAG,IAAI,CAAC;gBACd,UAAU,GAAG,MAAM,CAAC;YACtB,CAAC;iBAAM,IAAI,MAAM,IAAI,MAAM,KAAK,CAAC,IAAI,aAAa,EAAE,CAAC;gBACnD,MAAM,GAAG,KAAK,CAAC;gBACf,UAAU,GAAG,CAAC,CAAC;YACjB,CAAC;iBAAM,IAAI,MAAM,IAAI,MAAM,IAAI,UAAU,IAAI,aAAa,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxF,MAAM,GAAG,KAAK,CAAC;gBACf,UAAU,GAAG,CAAC,CAAC;YACjB,CAAC;YACD,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,MAAM,GAAG,KAAK,CAAC;gBACf,UAAU,GAAG,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9F,aAAa,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CAAC,KAA6B,EAAE,SAAiB;IACzE,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,IAAI,GAA0C,IAAI,CAAC;IACvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC9C,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;gBAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;iBACvD,CAAC;gBACJ,IAAI,IAAI;oBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;YAClC,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,IAAI;QAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;SACjC,IAAI,EAAE;QACP,4EAA4E;QAC5E,+DAA+D;SAC9D,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,YAAY,CAAC,KAA6B;IACjD,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAgB,CAAC;QACrC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS;QAEtC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC;gBACP,KAAK,EAAG,GAAG,CAAC,CAAC,CAAY,CAAC,MAAM;gBAChC,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,YAAY;gBACxB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,0EAA0E;QAC1E,uEAAuE;QACvE,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS;QAC/C,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,SAAS;QAClF,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC;YAAE,SAAS;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChC,GAAG,CAAC,IAAI,CAAC;YACP,KAAK,EAAG,KAAK,CAAC,CAAC,CAAY,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,IAAI,CAAC,YAAY;YACxB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,MAAM,QAAQ,GAAG,iCAAiC,CAAC;AAEnD,SAAS,aAAa,CAAC,KAA6B,EAAE,IAAY,EAAE,MAAc;IAChF,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,6EAA6E;IAC7E,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAgB,CAAC;QACrC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS;QACtC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAW,CAAC,CAAC;QAClD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,IAAK,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAY;YAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QACtF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEnB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,GAAI,MAAM,CAAC,CAAC,CAAY,CAAC,MAAM,CAAC;QACrE,IAAI,SAAS,GAAG,WAAW,GAAI,MAAM,CAAC,CAAC,CAAY,CAAC,MAAM,GAAI,MAAM,CAAC,CAAC,CAAY,CAAC,MAAM,CAAC;QAE1F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,QAAQ,GAAkB,IAAI,CAAC;QACnC,IAAI,aAAa,GAAkB,IAAI,CAAC;QACxC,IAAI,GAAG,EAAE,CAAC;YACR,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAW,CAAC;YAC5B,aAAa,GAAG,SAAS,CAAC;YAC1B,SAAS,IAAK,GAAG,CAAC,CAAC,CAAY,CAAC,MAAM,CAAC;YACvC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI;gBAAE,SAAS,IAAI,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAExC,GAAG,CAAC,IAAI,CAAC;YACP,KAAK,EAAE,IAAI,CAAC,YAAY;YACxB,GAAG;YACH,WAAW;YACX,MAAM,EAAE,MAAM,CAAC,CAAC,CAAW;YAC3B,SAAS;YACT,QAAQ;YACR,aAAa;YACb,SAAS;YACT,IAAI;YACJ,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC;YACxC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK;YACL,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,KAA6B,EAAE,UAAkB,EAAE,MAAc;IACpF,IAAI,GAAG,GAAI,KAAK,CAAC,UAAU,CAAiB,CAAC,GAAG,CAAC;IACjD,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAgB,CAAC;QACrC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,MAAM;YAC7D,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;gBAC1B,IAAI,QAAQ;oBAAE,MAAM;gBACpB,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;oBAAE,MAAM;gBAC1C,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;oBAAE,MAAM;YAC/C,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,QAAQ;YAAE,MAAM;QAC7C,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACf,QAAQ,GAAG,KAAK,CAAC;IACnB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,+EAA+E;AAC/E,MAAM,eAAe,GAAG,yCAAyC,CAAC;AAElE;;;;;;;;GAQG;AACH,SAAS,UAAU,CAAC,KAA6B,EAAE,IAAY,EAAE,MAAc;IAC7E,MAAM,GAAG,GAAY,EAAE,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAgB,CAAC;QACvC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAgB,CAAC;QAC9C,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,SAAS,CAAC,IAAI;YAAE,SAAS;QAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAAE,SAAS;QAE9D,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEnC,MAAM,IAAI,GAAe,EAAE,CAAC;QAC5B,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAgB,CAAC;YACrC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,MAAM;YAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM;YAC9B,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/E,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACjB,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,2EAA2E;AAC3E,SAAS,QAAQ,CAAC,IAAiB,EAAE,IAAY,EAAE,MAAc;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;IAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;IACpB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,SAAS;QAChC,iEAAiE;QACjE,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI;YAAE,SAAS;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,6EAA6E;IAC7E,IAAI,MAAM,GAAI,MAAM,CAAC,CAAC,CAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,GAAG,MAAM;YAAE,SAAS;QAC7B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1C,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,4EAA4E;IAC5E,sBAAsB;IACtB,IAAI,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAEpG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW;IACxD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC;IACpD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,EAAE,GAAG,EAAE,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AAC1F,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,SAAS,YAAY,CAAC,IAAY,EAAE,KAAgB,EAAE,SAAiB,EAAE,IAAsB;IAC7F,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,IAAI,GAAG,SAAS,CAAC;IACrB,SAAS,CAAC;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,CAAC,CAAC;YAAE,MAAM;QACvB,IAAI,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;YACjC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,MAAM;QACxB,GAAG,CAAC,IAAI,CAAC;YACP,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,KAAK,GAAG,CAAC;YACd,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC;YAClC,UAAU,EAAE,IAAI,GAAG,CAAC;YACpB,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI;SAClC,CAAC,CAAC;QACH,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,SAAS,cAAc,CACrB,IAAY,EACZ,SAAiB,EACjB,IAAsB,EACtB,QAAgC;IAEhC,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,IAAI,CAAC,GAAG,SAAS,CAAC;IAElB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/B,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC;QAC/B,4CAA4C;QAC5C,IAAI,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,IAAI;YAAE,SAAS;QAE1D,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACpB,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,MAAM,UAAU,GAAG,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;gBAAE,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,GAAG,UAAU,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;gBACzE,MAAM,GAAG,CAAC,CAAC;gBACX,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,MAAM,KAAK,CAAC,CAAC;YAAE,SAAS;QAC5B,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3C,CAAC,GAAG,MAAM,CAAC;IACb,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,SAAS,WAAW,CAAC,MAAwB;IAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAY,CAAC,EAAE,GAAI,MAAM,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAU,CAAC;QAChC,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAmC,CAAC;QACnE,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;;YAC/D,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,MAAwB,EAAE,MAAc;IAC9D,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAU,CAAC;QACnC,IAAI,MAAM,GAAG,KAAK,CAAC,KAAK;YAAE,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;aAClC,IAAI,MAAM,IAAI,KAAK,CAAC,GAAG;YAAE,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;;YACtC,OAAO,IAAI,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,MAAwB;IACvD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,+EAA+E;IAC/E,+EAA+E;IAC/E,yEAAyE;IACzE,mCAAmC;IACnC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,GAAG,IAAI,KAAK;YAAE,SAAS;QAC3B,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjC,0EAA0E;QAC1E,oEAAoE;QACpE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,CAAC;IACf,CAAC;IACD,OAAO,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,cAAc,GAAG,UAAU,CAAC;AAElC,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,MAAM,UAAU,GAAG,6CAA6C,CAAC;AACjE,MAAM,QAAQ,GAAG,oCAAoC,CAAC;AAEtD,8EAA8E;AAC9E,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,SAAS,SAAS,CAAC,MAAc,EAAE,IAAY,EAAE,KAAgB;IAC/D,MAAM,GAAG,GAAW,EAAE,CAAC;IACvB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,gBAAgB,GAAY,EAAE,CAAC;IAErC,4EAA4E;IAC5E,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,KAAK,GAAI,KAAK,CAAC,CAAC,CAAY,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACxD,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAW,CAAC;QACrC,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAG,KAAK,CAAC,CAAC,CAAY,CAAC,MAAM,CAAC,CAAC;QACpF,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAI,KAAK,CAAC,CAAC,CAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAG,KAAK,CAAC,CAAC,CAAY,CAAC,IAAI,EAAE;YACjC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC;YAC9B,KAAK;YACL,GAAG,EAAE,KAAK,GAAI,KAAK,CAAC,CAAC,CAAY,CAAC,MAAM;YACxC,WAAW;YACX,IAAI,EAAE,YAAY;YAClB,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,qBAAqB;IACrB,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1E,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,CAAC,CAAC,CAAC,CAAW;YACtB,KAAK;YACL,GAAG,EAAE,KAAK,GAAI,CAAC,CAAC,CAAC,CAAY,CAAC,MAAM;YACpC,WAAW,EAAE,KAAK,GAAG,CAAC;YACtB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI;SACnC,CAAC,CAAC;IACL,CAAC;IAED,6CAA6C;IAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,uEAAuE;QACvE,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;YACjC,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;QAE/C,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1C,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,aAAa,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAClG,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC/C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,GAAG,CAAC,IAAI,CAAC;wBACP,IAAI,EAAE,MAAM;wBACZ,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC;wBAC1B,KAAK,EAAE,CAAC;wBACR,GAAG,EAAE,KAAK,GAAG,CAAC;wBACd,WAAW,EAAE,CAAC,GAAG,CAAC;wBAClB,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;qBAC/B,CAAC,CAAC;oBACH,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;oBACd,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAEnC,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;YACnD,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,GAAG,CAAC,IAAI,CAAC;wBACP,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;wBAClB,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC5D,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC1B,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC;wBACnB,WAAW,EAAE,IAAI,CAAC,KAAK;wBACvB,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;qBAC/B,CAAC,CAAC;gBACL,CAAC;gBACD,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;gBACnB,SAAS;YACX,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;YAClD,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;gBAClB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gBACpD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACrD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,GAAG,CAAC,IAAI,CAAC;wBACP,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;wBAClB,MAAM,EAAE,QAAQ;wBAChB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC1B,GAAG,EAAE,MAAM,GAAG,CAAC;wBACf,WAAW,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;wBAClD,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;qBAC/B,CAAC,CAAC;gBACL,CAAC;gBACD,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;gBACf,SAAS;YACX,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,OAAO,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;gBAClB,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE;gBACpB,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,QAAQ,GAAG,CAAC;gBACjB,WAAW,EAAE,CAAC,GAAG,CAAC;gBAClB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;aAC/B,CAAC,CAAC;YACH,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;YACjB,SAAS;QACX,CAAC;QAED,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+EAA+E;AAC/E,SAAS,YAAY,CAAC,IAAY,EAAE,IAAY;IAC9C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,aAAa,CAAC,CAAC;IAC1D,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;QACnD,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;aACtB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACpB,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,wDAAwD;AACxD,SAAS,eAAe,CAAC,IAAY,EAAE,IAAY;IACjD,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,aAAa,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QAAE,CAAC,IAAI,CAAC,CAAC;IAEtF,MAAM,KAAK,GAAG,CAAC,CAAC;IAChB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,KAAK;YAAE,OAAO,IAAI,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,KAAK;YAAE,OAAO,IAAI,CAAC;QAC/C,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,CAAC,GAAG,KAAK,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;aACtB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACpB,IAAI,KAAK,KAAK,CAAC;gBAAE,MAAM;YACvB,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI;YAAE,MAAM;QAC3D,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,CAAC;IACd,0DAA0D;IAC1D,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC1D,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IACD,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC/B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACnF,CAAC;AAED,8EAA8E;AAC9E,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACzD,CAAC","sourcesContent":["/**\n * A structural Markdown scanner.\n *\n * This is deliberately **not** a CommonMark implementation. spec-graph needs six\n * things from a document - front matter, headings, list items with their\n * continuations, HTML comments, links, and a reliable map of what is code - and\n * a full parser would cost a dependency tree, an AST walk, and a position\n * mapping layer to get back the offsets we want in the first place.\n *\n * What the scanner does guarantee is the part that makes regex-based spec\n * linters lie:\n *\n * - **Code never counts.** Fenced blocks, indented blocks and inline spans are\n * masked before a single link is extracted, so an example in a code sample\n * never becomes a graph edge.\n * - **Items are blocks, not lines.** A list item owns its wrapped continuation\n * lines and its nested content, so a resolution written on the second line of\n * a bullet is found instead of missed.\n * - **Everything carries absolute offsets.** No re-scanning, no drift between\n * the text a rule matched and the position it reports.\n */\n\nimport { createLineIndex, type LineIndex } from './source.js';\n\n/* -------------------------------------------------------------------------- */\n/* Shapes */\n/* -------------------------------------------------------------------------- */\n\nexport interface Range {\n readonly start: number;\n readonly end: number;\n}\n\nexport interface FrontMatter {\n /** The body between the delimiters, exclusive. */\n readonly raw: string;\n /** Offset of the first character of `raw`. */\n readonly start: number;\n readonly end: number;\n /** Offset just past the closing delimiter line. */\n readonly bodyStart: number;\n}\n\nexport interface ScannedLine {\n /** 1-based. */\n readonly line: number;\n /** Offset of the raw line start. */\n readonly start: number;\n /** Offset just past the line, excluding its terminator. */\n readonly end: number;\n /** Offset of the first character after any block-quote markers. */\n readonly contentStart: number;\n /** Line text after block-quote markers, indentation intact. */\n readonly content: string;\n /** Indentation of `content`, tabs counted as four columns. */\n readonly indent: number;\n readonly blank: boolean;\n readonly quoteDepth: number;\n /** Inside a fenced or indented code block, fence delimiters included. */\n readonly code: boolean;\n}\n\nexport interface Heading {\n readonly level: number;\n readonly text: string;\n /** GitHub-compatible anchor slug. */\n readonly slug: string;\n readonly start: number;\n readonly end: number;\n readonly line: number;\n}\n\nexport interface ListItem {\n /** The whole block: marker line plus continuations and nested content. */\n readonly start: number;\n readonly end: number;\n /** Offset of the list marker itself. */\n readonly markerStart: number;\n readonly marker: string;\n /** Offset where the item text begins, after marker and any checkbox. */\n readonly textStart: number;\n /** The character inside `[ ]`, or `null` when the item has no checkbox. */\n readonly checkbox: string | null;\n readonly checkboxStart: number | null;\n /** First line of item text, trimmed. */\n readonly firstLine: string;\n /** Full item text including continuations and nested content. */\n readonly body: string;\n /**\n * `body` with code and comments blanked out, same length and offsets.\n *\n * Anything that searches item text for meaning - resolution markers above\n * all - must read this rather than `body`, or a fenced example nested under\n * the item will close it.\n */\n readonly maskedBody: string;\n readonly line: number;\n /** How many list items enclose this one. Top-level items are `0`. */\n readonly depth: number;\n readonly indent: number;\n}\n\nexport interface HtmlComment {\n readonly start: number;\n readonly end: number;\n /** Text between `<!--` and `-->`. */\n readonly inner: string;\n readonly innerStart: number;\n readonly line: number;\n}\n\nexport type LinkForm = 'inline' | 'reference' | 'shortcut' | 'autolink' | 'wiki' | 'definition';\n\nexport interface Link {\n /** Visible label. Empty for autolinks and definitions. */\n readonly text: string;\n /** Destination as written: a path, a URL, or a reference label. */\n readonly target: string;\n /** Offset of the whole construct. */\n readonly start: number;\n readonly end: number;\n /** Offset of `target` inside the source, for precise diagnostics. */\n readonly targetStart: number;\n readonly form: LinkForm;\n readonly line: number;\n}\n\nexport interface TableCell {\n /** Cell text as written, trimmed. */\n readonly text: string;\n /** Offset of the trimmed text, so a finding can point at the cell itself. */\n readonly start: number;\n readonly end: number;\n}\n\nexport interface TableRow {\n readonly cells: readonly TableCell[];\n readonly start: number;\n readonly end: number;\n readonly line: number;\n}\n\nexport interface Table {\n readonly start: number;\n readonly end: number;\n /** Header cells, trimmed. A table without a header row is not a table. */\n readonly headers: readonly TableCell[];\n readonly rows: readonly TableRow[];\n}\n\nexport interface ScannedDocument {\n readonly text: string;\n readonly index: LineIndex;\n readonly frontMatter: FrontMatter | null;\n /** Offset where the body starts, after any front matter. */\n readonly bodyStart: number;\n readonly lines: readonly ScannedLine[];\n readonly headings: readonly Heading[];\n readonly listItems: readonly ListItem[];\n readonly comments: readonly HtmlComment[];\n readonly links: readonly Link[];\n readonly tables: readonly Table[];\n /** Code and comments blanked out, offsets and line breaks preserved. */\n readonly masked: string;\n /** True when the offset falls inside code, a comment, or front matter. */\n isMasked(offset: number): boolean;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Entry point */\n/* -------------------------------------------------------------------------- */\n\nexport function scanMarkdown(source: string): ScannedDocument {\n const text = source.charCodeAt(0) === 0xfeff ? source.slice(1) : source;\n const index = createLineIndex(text);\n const frontMatter = readFrontMatter(text, index);\n const bodyStart = frontMatter ? frontMatter.bodyStart : 0;\n\n const lines = scanLines(text, index, bodyStart);\n const codeRanges = collectCodeRanges(lines, bodyStart);\n const comments = scanComments(text, index, bodyStart, codeRanges);\n\n const inlineCode = scanInlineCode(text, bodyStart, codeRanges, comments);\n const maskRanges = [\n ...(frontMatter ? [{ start: 0, end: frontMatter.bodyStart }] : []),\n ...codeRanges,\n ...inlineCode,\n ...comments.map((c) => ({ start: c.start, end: c.end })),\n ];\n const masked = applyMask(text, maskRanges);\n const sortedMask = mergeRanges(maskRanges);\n\n const headings = scanHeadings(lines);\n const listItems = scanListItems(lines, text, masked);\n const links = scanLinks(masked, text, index);\n const tables = scanTables(lines, text, masked);\n\n return {\n text,\n index,\n frontMatter,\n bodyStart,\n lines,\n headings,\n listItems,\n comments,\n links,\n tables,\n masked,\n isMasked: (offset) => containsOffset(sortedMask, offset),\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Front matter */\n/* -------------------------------------------------------------------------- */\n\nconst FENCE_FM = /^(-{3,}|\\+{3,})[ \\t]*$/;\n\nfunction readFrontMatter(text: string, index: LineIndex): FrontMatter | null {\n if (index.lineCount === 0) return null;\n const first = index.lineText(1);\n const open = FENCE_FM.exec(first);\n if (!open) return null;\n const closer = (open[1] as string).startsWith('-') ? /^(-{3,}|\\.{3,})[ \\t]*$/ : /^\\+{3,}[ \\t]*$/;\n\n for (let line = 2; line <= index.lineCount; line += 1) {\n if (closer.test(index.lineText(line))) {\n const start = index.lineStart(2);\n const end = index.lineStart(line);\n const bodyStart = line < index.lineCount ? index.lineStart(line + 1) : text.length;\n return { raw: text.slice(start, end), start, end, bodyStart };\n }\n }\n // An unterminated opener is a horizontal rule, not front matter.\n return null;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Line classification */\n/* -------------------------------------------------------------------------- */\n\nconst LIST_MARKER = /^([ \\t]*)([-*+]|\\d{1,9}[.)])([ \\t]+|$)/;\nconst ATX_HEADING = /^ {0,3}(#{1,6})(?:[ \\t]+(.*?))?[ \\t]*(?:#+[ \\t]*)?$/;\nconst SETEXT_UNDERLINE = /^ {0,3}(=+|-+)[ \\t]*$/;\nconst THEMATIC_BREAK = /^ {0,3}(?:(?:\\*[ \\t]*){3,}|(?:-[ \\t]*){3,}|(?:_[ \\t]*){3,})$/;\nconst FENCE_OPEN = /^([ \\t]*)(`{3,}|~{3,})(.*)$/;\n\n/** Counts indentation in columns, expanding tabs to the next multiple of four. */\nfunction measureIndent(line: string): number {\n let width = 0;\n for (const ch of line) {\n if (ch === ' ') width += 1;\n else if (ch === '\\t') width += 4 - (width % 4);\n else break;\n }\n return width;\n}\n\n/** Strips `>` block-quote markers, returning the offset and text of the content. */\nfunction stripQuotes(raw: string, lineStart: number): { contentStart: number; content: string; depth: number } {\n let i = 0;\n let depth = 0;\n for (;;) {\n let j = i;\n let spaces = 0;\n while (j < raw.length && (raw[j] === ' ' || raw[j] === '\\t') && spaces < 3) {\n spaces += 1;\n j += 1;\n }\n if (raw[j] !== '>') break;\n j += 1;\n if (raw[j] === ' ') j += 1;\n depth += 1;\n i = j;\n }\n return { contentStart: lineStart + i, content: raw.slice(i), depth };\n}\n\nfunction scanLines(text: string, index: LineIndex, bodyStart: number): ScannedLine[] {\n const out: ScannedLine[] = [];\n const firstLine = index.positionAt(bodyStart).line;\n\n let fence: { char: string; length: number; indent: number } | null = null;\n let inList = false;\n let listIndent = 0;\n let previousBlank = true;\n let indentedCode = false;\n\n for (let line = firstLine; line <= index.lineCount; line += 1) {\n const start = index.lineStart(line);\n const end = index.lineEnd(line);\n if (end < bodyStart) continue;\n const raw = text.slice(start, end);\n const { contentStart, content, depth } = stripQuotes(raw, start);\n const indent = measureIndent(content);\n const blank = content.trim().length === 0;\n\n let code = false;\n\n if (fence) {\n code = true;\n const close = FENCE_OPEN.exec(content);\n if (\n close &&\n (close[2] as string)[0] === fence.char &&\n (close[2] as string).length >= fence.length &&\n (close[3] as string).trim().length === 0 &&\n measureIndent(close[1] as string) <= fence.indent + 3\n ) {\n fence = null;\n }\n } else {\n const open = FENCE_OPEN.exec(content);\n if (open && (open[3] as string).indexOf('`') === -1) {\n fence = {\n char: (open[2] as string)[0] as string,\n length: (open[2] as string).length,\n indent: measureIndent(open[1] as string),\n };\n code = true;\n indentedCode = false;\n } else if (blank) {\n code = indentedCode;\n } else {\n // Indented code is only recognised outside list containers. Inside a\n // list, four-space indentation is ordinary continuation far more often\n // than it is a code block, and masking a continuation would silently\n // drop the links and resolutions written there.\n if (!inList && indent >= 4 && (previousBlank || indentedCode)) {\n code = true;\n indentedCode = true;\n } else {\n indentedCode = false;\n }\n }\n }\n\n if (!code && !blank) {\n const marker = LIST_MARKER.exec(content);\n if (marker) {\n inList = true;\n listIndent = indent;\n } else if (inList && indent === 0 && previousBlank) {\n inList = false;\n listIndent = 0;\n } else if (inList && indent <= listIndent && previousBlank && ATX_HEADING.test(content)) {\n inList = false;\n listIndent = 0;\n }\n if (ATX_HEADING.test(content) && indent < 4) {\n inList = false;\n listIndent = 0;\n }\n }\n\n out.push({ line, start, end, contentStart, content, indent, blank, quoteDepth: depth, code });\n previousBlank = blank;\n }\n\n return out;\n}\n\nfunction collectCodeRanges(lines: readonly ScannedLine[], bodyStart: number): Range[] {\n const ranges: Range[] = [];\n let open: { start: number; end: number } | null = null;\n for (const line of lines) {\n if (line.code) {\n const start = Math.max(line.start, bodyStart);\n if (open && open.end >= line.start - 2) open.end = line.end;\n else {\n if (open) ranges.push(open);\n open = { start, end: line.end };\n }\n } else if (open) {\n ranges.push(open);\n open = null;\n }\n }\n if (open) ranges.push(open);\n return ranges;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Headings */\n/* -------------------------------------------------------------------------- */\n\nexport function slugify(text: string): string {\n return text\n .trim()\n .toLowerCase()\n .replace(/[`*_~[\\]()<>#!|]/g, '')\n .replace(/[^\\p{L}\\p{N}\\s-]/gu, '')\n .trim()\n // GitHub hyphenates every whitespace character, so a run of two spaces left\n // behind by stripped punctuation becomes two hyphens, not one.\n .replace(/\\s/g, '-');\n}\n\nfunction scanHeadings(lines: readonly ScannedLine[]): Heading[] {\n const out: Heading[] = [];\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i] as ScannedLine;\n if (line.code || line.blank) continue;\n\n const atx = ATX_HEADING.exec(line.content);\n if (atx && line.indent < 4) {\n const body = (atx[2] ?? '').trim();\n out.push({\n level: (atx[1] as string).length,\n text: body,\n slug: slugify(body),\n start: line.contentStart,\n end: line.end,\n line: line.line,\n });\n continue;\n }\n\n // Setext: an underline of `=` or `-` directly below a paragraph line. The\n // preceding line must not itself be a heading, a list item or a fence.\n const next = lines[i + 1];\n if (!next || next.code || next.blank) continue;\n const under = SETEXT_UNDERLINE.exec(next.content);\n if (!under) continue;\n if (LIST_MARKER.test(line.content) || THEMATIC_BREAK.test(line.content)) continue;\n if (line.indent >= 4) continue;\n const body = line.content.trim();\n if (body.length === 0) continue;\n out.push({\n level: (under[1] as string)[0] === '=' ? 1 : 2,\n text: body,\n slug: slugify(body),\n start: line.contentStart,\n end: next.end,\n line: line.line,\n });\n }\n return out;\n}\n\n/* -------------------------------------------------------------------------- */\n/* List items */\n/* -------------------------------------------------------------------------- */\n\nconst CHECKBOX = /^\\[([ xX~\\-?!*/+])\\](?=[ \\t]|$)/;\n\nfunction scanListItems(lines: readonly ScannedLine[], text: string, masked: string): ListItem[] {\n const out: ListItem[] = [];\n // Indents of the list items currently enclosing the cursor, outermost first.\n const stack: number[] = [];\n\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i] as ScannedLine;\n if (line.code || line.blank) continue;\n const marker = LIST_MARKER.exec(line.content);\n if (!marker) continue;\n\n const indent = measureIndent(marker[1] as string);\n while (stack.length > 0 && indent <= (stack[stack.length - 1] as number)) stack.pop();\n const depth = stack.length;\n stack.push(indent);\n\n const markerStart = line.contentStart + (marker[1] as string).length;\n let textStart = markerStart + (marker[2] as string).length + (marker[3] as string).length;\n\n const rest = text.slice(textStart, line.end);\n const box = CHECKBOX.exec(rest);\n let checkbox: string | null = null;\n let checkboxStart: number | null = null;\n if (box) {\n checkbox = box[1] as string;\n checkboxStart = textStart;\n textStart += (box[0] as string).length;\n while (text[textStart] === ' ' || text[textStart] === '\\t') textStart += 1;\n }\n\n const end = findItemEnd(lines, i, indent);\n const firstLine = text.slice(textStart, line.end).trim();\n const body = text.slice(textStart, end);\n\n out.push({\n start: line.contentStart,\n end,\n markerStart,\n marker: marker[2] as string,\n textStart,\n checkbox,\n checkboxStart,\n firstLine,\n body,\n maskedBody: masked.slice(textStart, end),\n line: line.line,\n depth,\n indent,\n });\n }\n\n return out;\n}\n\n/**\n * Finds where a list item block ends.\n *\n * The item owns its wrapped continuation lines and everything nested under it.\n * It gives up ownership at the next sibling or shallower marker, at any\n * heading, and at the first non-indented line after a blank one.\n */\nfunction findItemEnd(lines: readonly ScannedLine[], startIndex: number, indent: number): number {\n let end = (lines[startIndex] as ScannedLine).end;\n let sawBlank = false;\n\n for (let i = startIndex + 1; i < lines.length; i += 1) {\n const line = lines[i] as ScannedLine;\n if (line.blank) {\n sawBlank = true;\n continue;\n }\n if (!line.code) {\n if (line.indent < 4 && ATX_HEADING.test(line.content)) break;\n if (line.indent <= indent) {\n if (sawBlank) break;\n if (LIST_MARKER.test(line.content)) break;\n if (THEMATIC_BREAK.test(line.content)) break;\n }\n }\n if (line.indent <= indent && sawBlank) break;\n end = line.end;\n sawBlank = false;\n }\n\n return end;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Tables */\n/* -------------------------------------------------------------------------- */\n\n/** `| :--- | ---: | :-: |` - the row that makes the line above it a header. */\nconst TABLE_DELIMITER = /^\\|?(?:\\s*:?-+:?\\s*\\|)+\\s*:?-*:?\\s*\\|?$/;\n\n/**\n * Finds pipe tables, with an offset for every cell.\n *\n * Cell offsets are the point: a register kept as a table needs findings that\n * name the cell declaring the relation, not the row and not the file.\n *\n * Splitting happens on the masked copy so a pipe inside inline code cannot\n * invent a column, while the text comes from the original.\n */\nfunction scanTables(lines: readonly ScannedLine[], text: string, masked: string): Table[] {\n const out: Table[] = [];\n\n for (let i = 0; i < lines.length - 1; i += 1) {\n const header = lines[i] as ScannedLine;\n const delimiter = lines[i + 1] as ScannedLine;\n if (header.code || header.blank || delimiter.code) continue;\n if (!header.content.includes('|')) continue;\n if (!TABLE_DELIMITER.test(delimiter.content.trim())) continue;\n\n const headers = splitRow(header, text, masked);\n if (headers.length === 0) continue;\n\n const rows: TableRow[] = [];\n let end = delimiter.end;\n for (let j = i + 2; j < lines.length; j += 1) {\n const line = lines[j] as ScannedLine;\n if (line.blank || line.code || !line.content.includes('|')) break;\n const cells = splitRow(line, text, masked);\n if (cells.length === 0) break;\n rows.push({ cells, start: line.contentStart, end: line.end, line: line.line });\n end = line.end;\n }\n\n out.push({ start: header.contentStart, end, headers, rows });\n i += rows.length + 1;\n }\n\n return out;\n}\n\n/** Splits one row into cells, keeping each cell's offset in the source. */\nfunction splitRow(line: ScannedLine, text: string, masked: string): TableCell[] {\n const from = line.contentStart;\n const to = line.end;\n const bounds: number[] = [];\n for (let i = from; i < to; i += 1) {\n if (masked[i] !== '|') continue;\n // A pipe escaped with a backslash is content, not a column edge.\n if (i > from && text[i - 1] === '\\\\') continue;\n bounds.push(i);\n }\n if (bounds.length === 0) return [];\n\n const cells: TableCell[] = [];\n // A leading pipe opens the first cell; without one the row starts at `from`.\n let cursor = (bounds[0] as number) === from ? from + 1 : from;\n for (const bound of bounds) {\n if (bound < cursor) continue;\n cells.push(makeCell(text, cursor, bound));\n cursor = bound + 1;\n }\n // Trailing content after the last pipe is a final cell unless the row ended\n // with a border pipe.\n if (cursor < to && text.slice(cursor, to).trim().length > 0) cells.push(makeCell(text, cursor, to));\n\n return cells;\n}\n\nfunction makeCell(text: string, start: number, end: number): TableCell {\n const raw = text.slice(start, end);\n const leading = raw.length - raw.trimStart().length;\n const trimmed = raw.trim();\n return { text: trimmed, start: start + leading, end: start + leading + trimmed.length };\n}\n\n/* -------------------------------------------------------------------------- */\n/* HTML comments */\n/* -------------------------------------------------------------------------- */\n\nfunction scanComments(text: string, index: LineIndex, bodyStart: number, code: readonly Range[]): HtmlComment[] {\n const out: HtmlComment[] = [];\n const merged = mergeRanges(code);\n let from = bodyStart;\n for (;;) {\n const open = text.indexOf('<!--', from);\n if (open === -1) break;\n if (containsOffset(merged, open)) {\n from = open + 4;\n continue;\n }\n const close = text.indexOf('-->', open + 4);\n if (close === -1) break;\n out.push({\n start: open,\n end: close + 3,\n inner: text.slice(open + 4, close),\n innerStart: open + 4,\n line: index.positionAt(open).line,\n });\n from = close + 3;\n }\n return out;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Inline code */\n/* -------------------------------------------------------------------------- */\n\nfunction scanInlineCode(\n text: string,\n bodyStart: number,\n code: readonly Range[],\n comments: readonly HtmlComment[],\n): Range[] {\n const blocked = mergeRanges([...code, ...comments.map((c) => ({ start: c.start, end: c.end }))]);\n const out: Range[] = [];\n let i = bodyStart;\n\n while (i < text.length) {\n if (text[i] !== '`') {\n i += 1;\n continue;\n }\n if (containsOffset(blocked, i)) {\n i += 1;\n continue;\n }\n let runStart = i;\n while (text[i] === '`') i += 1;\n const runLength = i - runStart;\n // An escaped backtick does not open a span.\n if (runStart > 0 && text[runStart - 1] === '\\\\') continue;\n\n let j = i;\n let closed = -1;\n while (j < text.length) {\n if (text[j] !== '`') {\n j += 1;\n continue;\n }\n const closeStart = j;\n while (text[j] === '`') j += 1;\n if (j - closeStart === runLength && !containsOffset(blocked, closeStart)) {\n closed = j;\n break;\n }\n }\n if (closed === -1) continue;\n out.push({ start: runStart, end: closed });\n i = closed;\n }\n\n return out;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Masking */\n/* -------------------------------------------------------------------------- */\n\nfunction mergeRanges(ranges: readonly Range[]): Range[] {\n if (ranges.length === 0) return [];\n const sorted = [...ranges].sort((a, b) => a.start - b.start || a.end - b.end);\n const out: Range[] = [{ ...(sorted[0] as Range) }];\n for (let i = 1; i < sorted.length; i += 1) {\n const next = sorted[i] as Range;\n const last = out[out.length - 1] as { start: number; end: number };\n if (next.start <= last.end) last.end = Math.max(last.end, next.end);\n else out.push({ ...next });\n }\n return out;\n}\n\nfunction containsOffset(sorted: readonly Range[], offset: number): boolean {\n let lo = 0;\n let hi = sorted.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const range = sorted[mid] as Range;\n if (offset < range.start) hi = mid - 1;\n else if (offset >= range.end) lo = mid + 1;\n else return true;\n }\n return false;\n}\n\n/**\n * Blanks out the given ranges.\n *\n * Line terminators survive so every offset, line and column in the masked copy\n * still matches the original. Callers slice the original text for content and\n * search the masked copy for structure.\n */\nfunction applyMask(text: string, ranges: readonly Range[]): string {\n const merged = mergeRanges(ranges);\n if (merged.length === 0) return text;\n\n // Built from slices rather than a per-character array. Masking runs over every\n // byte of every document, and a `split('')`/`join('')` round trip allocates an\n // array entry per character - on a large corpus that was the single most\n // expensive thing the scanner did.\n let out = '';\n let cursor = 0;\n for (const range of merged) {\n const start = Math.max(range.start, cursor);\n const end = Math.min(range.end, text.length);\n if (end <= start) continue;\n out += text.slice(cursor, start);\n // The character class is deliberately not Unicode-aware: a surrogate pair\n // must become two spaces so that every later offset still lines up.\n out += text.slice(start, end).replace(NON_TERMINATOR, ' ');\n cursor = end;\n }\n return out + text.slice(cursor);\n}\n\nconst NON_TERMINATOR = /[^\\n\\r]/g;\n\n/* -------------------------------------------------------------------------- */\n/* Links */\n/* -------------------------------------------------------------------------- */\n\nconst DEFINITION = /^ {0,3}\\[([^\\]\\n]+)\\]:[ \\t]*(<[^>\\n]*>|\\S+)/;\nconst AUTOLINK = /<((?:https?|ftp|mailto):[^>\\s]+)>/g;\n\n/** How far a bracket construct may run before we call it unbalanced prose. */\nconst MAX_LINK_SPAN = 4096;\n\nfunction scanLinks(masked: string, text: string, index: LineIndex): Link[] {\n const out: Link[] = [];\n const definitions = new Set<string>();\n const definitionRanges: Range[] = [];\n\n // Pass 1: reference definitions, which also make shortcut links resolvable.\n for (let line = 1; line <= index.lineCount; line += 1) {\n const start = index.lineStart(line);\n const content = masked.slice(start, index.lineEnd(line));\n const match = DEFINITION.exec(content);\n if (!match) continue;\n const label = (match[1] as string).trim().toLowerCase();\n definitions.add(label);\n const rawTarget = match[2] as string;\n const targetStart = start + content.indexOf(rawTarget, (match[1] as string).length);\n definitionRanges.push({ start, end: start + (match[0] as string).length });\n out.push({\n text: (match[1] as string).trim(),\n target: unwrapAngle(rawTarget),\n start,\n end: start + (match[0] as string).length,\n targetStart,\n form: 'definition',\n line,\n });\n }\n\n // Pass 2: autolinks.\n AUTOLINK.lastIndex = 0;\n for (let m = AUTOLINK.exec(masked); m !== null; m = AUTOLINK.exec(masked)) {\n const start = m.index;\n out.push({\n text: '',\n target: m[1] as string,\n start,\n end: start + (m[0] as string).length,\n targetStart: start + 1,\n form: 'autolink',\n line: index.positionAt(start).line,\n });\n }\n\n // Pass 3: bracket constructs, left to right.\n const definedAt = mergeRanges(definitionRanges);\n let i = 0;\n while (i < masked.length) {\n const ch = masked[i];\n if (ch !== '[') {\n i += 1;\n continue;\n }\n // The label of a definition is not itself a shortcut link to anything.\n if (containsOffset(definedAt, i)) {\n i += 1;\n continue;\n }\n const isImage = i > 0 && masked[i - 1] === '!';\n\n if (masked[i + 1] === '[') {\n const close = masked.indexOf(']]', i + 2);\n if (close !== -1 && close - i <= MAX_LINK_SPAN && masked.slice(i + 2, close).indexOf('\\n') === -1) {\n const target = text.slice(i + 2, close).trim();\n if (target.length > 0) {\n out.push({\n text: target,\n target: wikiTarget(target),\n start: i,\n end: close + 2,\n targetStart: i + 2,\n form: 'wiki',\n line: index.positionAt(i).line,\n });\n i = close + 2;\n continue;\n }\n }\n }\n\n const labelEnd = matchBracket(masked, i);\n if (labelEnd === -1) {\n i += 1;\n continue;\n }\n const label = text.slice(i + 1, labelEnd);\n const after = masked[labelEnd + 1];\n\n if (after === '(') {\n const dest = readDestination(masked, labelEnd + 2);\n if (dest) {\n if (!isImage) {\n out.push({\n text: label.trim(),\n target: unwrapAngle(text.slice(dest.start, dest.end).trim()),\n start: isImage ? i - 1 : i,\n end: dest.close + 1,\n targetStart: dest.start,\n form: 'inline',\n line: index.positionAt(i).line,\n });\n }\n i = dest.close + 1;\n continue;\n }\n } else if (after === '[') {\n const refEnd = matchBracket(masked, labelEnd + 1);\n if (refEnd !== -1) {\n const ref = text.slice(labelEnd + 2, refEnd).trim();\n const resolved = ref.length > 0 ? ref : label.trim();\n if (!isImage) {\n out.push({\n text: label.trim(),\n target: resolved,\n start: isImage ? i - 1 : i,\n end: refEnd + 1,\n targetStart: ref.length > 0 ? labelEnd + 2 : i + 1,\n form: 'reference',\n line: index.positionAt(i).line,\n });\n }\n i = refEnd + 1;\n continue;\n }\n } else if (!isImage && definitions.has(label.trim().toLowerCase())) {\n out.push({\n text: label.trim(),\n target: label.trim(),\n start: i,\n end: labelEnd + 1,\n targetStart: i + 1,\n form: 'shortcut',\n line: index.positionAt(i).line,\n });\n i = labelEnd + 1;\n continue;\n }\n\n i = labelEnd + 1;\n }\n\n out.sort((a, b) => a.start - b.start);\n return out;\n}\n\n/** Finds the `]` matching the `[` at `open`, honouring nesting and escapes. */\nfunction matchBracket(text: string, open: number): number {\n let depth = 0;\n const limit = Math.min(text.length, open + MAX_LINK_SPAN);\n for (let i = open; i < limit; i += 1) {\n const ch = text[i];\n if (ch === '\\\\') {\n i += 1;\n continue;\n }\n if (ch === '\\n' && text[i + 1] === '\\n') return -1;\n if (ch === '[') depth += 1;\n else if (ch === ']') {\n depth -= 1;\n if (depth === 0) return i;\n }\n }\n return -1;\n}\n\n/** Reads a link destination starting just after `(`. */\nfunction readDestination(text: string, from: number): { start: number; end: number; close: number } | null {\n let i = from;\n const limit = Math.min(text.length, from + MAX_LINK_SPAN);\n while (i < limit && (text[i] === ' ' || text[i] === '\\t' || text[i] === '\\n')) i += 1;\n\n const start = i;\n if (text[i] === '<') {\n const close = text.indexOf('>', i + 1);\n if (close === -1 || close > limit) return null;\n const paren = text.indexOf(')', close);\n if (paren === -1 || paren > limit) return null;\n return { start, end: close + 1, close: paren };\n }\n\n let depth = 0;\n while (i < limit) {\n const ch = text[i];\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === '(') depth += 1;\n else if (ch === ')') {\n if (depth === 0) break;\n depth -= 1;\n } else if (ch === ' ' || ch === '\\t' || ch === '\\n') break;\n i += 1;\n }\n const end = i;\n // Skip an optional title, then require the closing paren.\n let j = i;\n while (j < limit && text[j] !== ')') {\n if (text[j] === '\\n' && text[j + 1] === '\\n') return null;\n j += 1;\n }\n if (j >= limit || text[j] !== ')') return null;\n if (end === start) return null;\n return { start, end, close: j };\n}\n\nfunction unwrapAngle(value: string): string {\n return value.startsWith('<') && value.endsWith('>') ? value.slice(1, -1) : value;\n}\n\n/** `[[0007-thing|Display]]` and `[[0007-thing]]` both target `0007-thing`. */\nfunction wikiTarget(raw: string): string {\n const pipe = raw.indexOf('|');\n return (pipe === -1 ? raw : raw.slice(0, pipe)).trim();\n}\n"]}
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,eAAe,EAAkB,MAAM,aAAa,CAAC;AAgK9D,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1D,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAChD,4EAA4E;IAC5E,8EAA8E;IAC9E,yEAAyE;IACzE,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAClH,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAElE,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG;QACjB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,UAAU;QACb,GAAG,UAAU;QACb,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;KACzD,CAAC;IACF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAE/C,OAAO;QACL,IAAI;QACJ,KAAK;QACL,WAAW;QACX,SAAS;QACT,KAAK;QACL,QAAQ;QACR,SAAS;QACT,QAAQ;QACR,KAAK;QACL,MAAM;QACN,MAAM;QACN,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC;KACzD,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,MAAM,QAAQ,GAAG,wBAAwB,CAAC;AAE1C,SAAS,eAAe,CAAC,IAAY,EAAE,KAAgB;IACrD,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,MAAM,GAAI,IAAI,CAAC,CAAC,CAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAEjG,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QACtD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YACnF,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;QAChE,CAAC;IACH,CAAC;IACD,iEAAiE;IACjE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,MAAM,WAAW,GAAG,wCAAwC,CAAC;AAC7D,MAAM,WAAW,GAAG,qDAAqD,CAAC;AAC1E,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AACjD,MAAM,cAAc,GAAG,8DAA8D,CAAC;AACtF,MAAM,UAAU,GAAG,6BAA6B,CAAC;AAEjD,kFAAkF;AAClF,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;aACtB,IAAI,EAAE,KAAK,IAAI;YAAE,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;;YAC1C,MAAM;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oFAAoF;AACpF,SAAS,WAAW,CAAC,GAAW,EAAE,SAAiB;IACjD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,SAAS,CAAC;QACR,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,CAAC,CAAC;YACZ,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;QACD,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,MAAM;QAC1B,CAAC,IAAI,CAAC,CAAC;QACP,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,CAAC,IAAI,CAAC,CAAC;QAC3B,KAAK,IAAI,CAAC,CAAC;QACX,CAAC,GAAG,CAAC,CAAC;IACR,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,SAAS,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,KAAgB,EAAE,SAAiB;IAClE,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;IAEnD,IAAI,KAAK,GAA4D,IAAI,CAAC;IAC1E,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,aAAa,GAAG,IAAI,CAAC;IACzB,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,KAAK,IAAI,IAAI,GAAG,SAAS,EAAE,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,GAAG,GAAG,SAAS;YAAE,SAAS;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACnC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;QAE1C,IAAI,IAAI,GAAG,KAAK,CAAC;QAEjB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,CAAC;YACZ,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvC,IACE,KAAK;gBACJ,KAAK,CAAC,CAAC,CAAY,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI;gBACrC,KAAK,CAAC,CAAC,CAAY,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;gBAC1C,KAAK,CAAC,CAAC,CAAY,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBACxC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAW,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EACrD,CAAC;gBACD,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,IAAI,IAAK,IAAI,CAAC,CAAC,CAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACpD,KAAK,GAAG;oBACN,IAAI,EAAG,IAAI,CAAC,CAAC,CAAY,CAAC,CAAC,CAAW;oBACtC,MAAM,EAAG,IAAI,CAAC,CAAC,CAAY,CAAC,MAAM;oBAClC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAW,CAAC;iBACzC,CAAC;gBACF,IAAI,GAAG,IAAI,CAAC;gBACZ,YAAY,GAAG,KAAK,CAAC;YACvB,CAAC;iBAAM,IAAI,KAAK,EAAE,CAAC;gBACjB,IAAI,GAAG,YAAY,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,qEAAqE;gBACrE,uEAAuE;gBACvE,qEAAqE;gBACrE,gDAAgD;gBAChD,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,YAAY,CAAC,EAAE,CAAC;oBAC9D,IAAI,GAAG,IAAI,CAAC;oBACZ,YAAY,GAAG,IAAI,CAAC;gBACtB,CAAC;qBAAM,CAAC;oBACN,YAAY,GAAG,KAAK,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,GAAG,IAAI,CAAC;gBACd,UAAU,GAAG,MAAM,CAAC;YACtB,CAAC;iBAAM,IAAI,MAAM,IAAI,MAAM,KAAK,CAAC,IAAI,aAAa,EAAE,CAAC;gBACnD,MAAM,GAAG,KAAK,CAAC;gBACf,UAAU,GAAG,CAAC,CAAC;YACjB,CAAC;iBAAM,IAAI,MAAM,IAAI,MAAM,IAAI,UAAU,IAAI,aAAa,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxF,MAAM,GAAG,KAAK,CAAC;gBACf,UAAU,GAAG,CAAC,CAAC;YACjB,CAAC;YACD,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,MAAM,GAAG,KAAK,CAAC;gBACf,UAAU,GAAG,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9F,aAAa,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,aAAa,GAAG,2CAA2C,CAAC;AAClE,MAAM,cAAc,GAAG,oCAAoC,CAAC;AAE5D,SAAS,kBAAkB,CAAC,KAA6B,EAAE,SAAiB;IAC1E,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,IAAI,GAA0C,IAAI,CAAC;IACvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI;YAAE,SAAS;QACxB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBAAE,SAAS;YAC5D,IAAI,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACtB,CAAC;QACD,yEAAyE;QACzE,wEAAwE;QACxE,4CAA4C;QAC5C,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,IAAI;QAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAA6B,EAAE,SAAiB;IACzE,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,IAAI,GAA0C,IAAI,CAAC;IACvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC9C,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;gBAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;iBACvD,CAAC;gBACJ,IAAI,IAAI;oBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;YAClC,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,IAAI;QAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;SACjC,IAAI,EAAE;QACP,4EAA4E;QAC5E,+DAA+D;SAC9D,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,YAAY,CAAC,KAA6B;IACjD,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAgB,CAAC;QACrC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS;QAEtC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC;gBACP,KAAK,EAAG,GAAG,CAAC,CAAC,CAAY,CAAC,MAAM;gBAChC,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,YAAY;gBACxB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,0EAA0E;QAC1E,uEAAuE;QACvE,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS;QAC/C,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,SAAS;QAClF,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC;YAAE,SAAS;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChC,GAAG,CAAC,IAAI,CAAC;YACP,KAAK,EAAG,KAAK,CAAC,CAAC,CAAY,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,IAAI,CAAC,YAAY;YACxB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,MAAM,QAAQ,GAAG,iCAAiC,CAAC;AAEnD,SAAS,aAAa,CAAC,KAA6B,EAAE,IAAY,EAAE,MAAc;IAChF,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,6EAA6E;IAC7E,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAgB,CAAC;QACrC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS;QACtC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAW,CAAC,CAAC;QAClD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,IAAK,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAY;YAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QACtF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEnB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,GAAI,MAAM,CAAC,CAAC,CAAY,CAAC,MAAM,CAAC;QACrE,IAAI,SAAS,GAAG,WAAW,GAAI,MAAM,CAAC,CAAC,CAAY,CAAC,MAAM,GAAI,MAAM,CAAC,CAAC,CAAY,CAAC,MAAM,CAAC;QAE1F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,QAAQ,GAAkB,IAAI,CAAC;QACnC,IAAI,aAAa,GAAkB,IAAI,CAAC;QACxC,IAAI,GAAG,EAAE,CAAC;YACR,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAW,CAAC;YAC5B,aAAa,GAAG,SAAS,CAAC;YAC1B,SAAS,IAAK,GAAG,CAAC,CAAC,CAAY,CAAC,MAAM,CAAC;YACvC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI;gBAAE,SAAS,IAAI,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAExC,GAAG,CAAC,IAAI,CAAC;YACP,KAAK,EAAE,IAAI,CAAC,YAAY;YACxB,GAAG;YACH,WAAW;YACX,MAAM,EAAE,MAAM,CAAC,CAAC,CAAW;YAC3B,SAAS;YACT,QAAQ;YACR,aAAa;YACb,SAAS;YACT,IAAI;YACJ,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC;YACxC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK;YACL,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,KAA6B,EAAE,UAAkB,EAAE,MAAc;IACpF,IAAI,GAAG,GAAI,KAAK,CAAC,UAAU,CAAiB,CAAC,GAAG,CAAC;IACjD,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAgB,CAAC;QACrC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,MAAM;YAC7D,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;gBAC1B,IAAI,QAAQ;oBAAE,MAAM;gBACpB,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;oBAAE,MAAM;gBAC1C,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;oBAAE,MAAM;YAC/C,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,QAAQ;YAAE,MAAM;QAC7C,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACf,QAAQ,GAAG,KAAK,CAAC;IACnB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,+EAA+E;AAC/E,MAAM,eAAe,GAAG,yCAAyC,CAAC;AAElE;;;;;;;;GAQG;AACH,SAAS,UAAU,CAAC,KAA6B,EAAE,IAAY,EAAE,MAAc;IAC7E,MAAM,GAAG,GAAY,EAAE,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAgB,CAAC;QACvC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAgB,CAAC;QAC9C,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,SAAS,CAAC,IAAI;YAAE,SAAS;QAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAAE,SAAS;QAE9D,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEnC,MAAM,IAAI,GAAe,EAAE,CAAC;QAC5B,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAgB,CAAC;YACrC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,MAAM;YAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM;YAC9B,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/E,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACjB,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,2EAA2E;AAC3E,SAAS,QAAQ,CAAC,IAAiB,EAAE,IAAY,EAAE,MAAc;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;IAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;IACpB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,SAAS;QAChC,iEAAiE;QACjE,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI;YAAE,SAAS;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,6EAA6E;IAC7E,IAAI,MAAM,GAAI,MAAM,CAAC,CAAC,CAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,GAAG,MAAM;YAAE,SAAS;QAC7B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1C,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,4EAA4E;IAC5E,sBAAsB;IACtB,IAAI,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAEpG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW;IACxD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC;IACpD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,EAAE,GAAG,EAAE,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AAC1F,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,SAAS,YAAY,CAAC,IAAY,EAAE,KAAgB,EAAE,SAAiB,EAAE,IAAsB;IAC7F,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,IAAI,GAAG,SAAS,CAAC;IACrB,SAAS,CAAC;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,CAAC,CAAC;YAAE,MAAM;QACvB,IAAI,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;YACjC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,MAAM;QACxB,GAAG,CAAC,IAAI,CAAC;YACP,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,KAAK,GAAG,CAAC;YACd,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC;YAClC,UAAU,EAAE,IAAI,GAAG,CAAC;YACpB,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI;SAClC,CAAC,CAAC;QACH,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,SAAS,cAAc,CACrB,IAAY,EACZ,SAAiB,EACjB,IAAsB,EACtB,QAAgC;IAEhC,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,IAAI,CAAC,GAAG,SAAS,CAAC;IAElB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/B,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC;QAC/B,4CAA4C;QAC5C,IAAI,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,IAAI;YAAE,SAAS;QAE1D,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACpB,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,MAAM,UAAU,GAAG,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;gBAAE,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,GAAG,UAAU,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;gBACzE,MAAM,GAAG,CAAC,CAAC;gBACX,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,MAAM,KAAK,CAAC,CAAC;YAAE,SAAS;QAC5B,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3C,CAAC,GAAG,MAAM,CAAC;IACb,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,SAAS,WAAW,CAAC,MAAwB;IAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAY,CAAC,EAAE,GAAI,MAAM,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAU,CAAC;QAChC,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAmC,CAAC;QACnE,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;;YAC/D,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,MAAwB,EAAE,MAAc;IAC9D,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAU,CAAC;QACnC,IAAI,MAAM,GAAG,KAAK,CAAC,KAAK;YAAE,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;aAClC,IAAI,MAAM,IAAI,KAAK,CAAC,GAAG;YAAE,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;;YACtC,OAAO,IAAI,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,MAAwB;IACvD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,+EAA+E;IAC/E,+EAA+E;IAC/E,yEAAyE;IACzE,mCAAmC;IACnC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,GAAG,IAAI,KAAK;YAAE,SAAS;QAC3B,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjC,0EAA0E;QAC1E,oEAAoE;QACpE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,CAAC;IACf,CAAC;IACD,OAAO,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,cAAc,GAAG,UAAU,CAAC;AAElC,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF,MAAM,UAAU,GAAG,6CAA6C,CAAC;AACjE,MAAM,QAAQ,GAAG,oCAAoC,CAAC;AAEtD,8EAA8E;AAC9E,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,SAAS,SAAS,CAAC,MAAc,EAAE,IAAY,EAAE,KAAgB;IAC/D,MAAM,GAAG,GAAW,EAAE,CAAC;IACvB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAmD,CAAC;IAC/E,MAAM,gBAAgB,GAAY,EAAE,CAAC;IAErC,2EAA2E;IAC3E,0EAA0E;IAC1E,4EAA4E;IAC5E,0EAA0E;IAC1E,eAAe;IACf,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,KAAK,GAAI,KAAK,CAAC,CAAC,CAAY,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACxD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAW,CAAC;QACrC,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAG,KAAK,CAAC,CAAC,CAAY,CAAC,MAAM,CAAC,CAAC;QACpF,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACtC,2CAA2C;QAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QAC7E,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAI,KAAK,CAAC,CAAC,CAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAG,KAAK,CAAC,CAAC,CAAY,CAAC,IAAI,EAAE;YACjC,MAAM;YACN,KAAK;YACL,GAAG,EAAE,KAAK,GAAI,KAAK,CAAC,CAAC,CAAY,CAAC,MAAM;YACxC,WAAW;YACX,KAAK,EAAG,KAAK,CAAC,CAAC,CAAY,CAAC,IAAI,EAAE;YAClC,IAAI,EAAE,YAAY;YAClB,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,qBAAqB;IACrB,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1E,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,CAAC,CAAC,CAAC,CAAW;YACtB,KAAK;YACL,GAAG,EAAE,KAAK,GAAI,CAAC,CAAC,CAAC,CAAY,CAAC,MAAM;YACpC,WAAW,EAAE,KAAK,GAAG,CAAC;YACtB,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI;SACnC,CAAC,CAAC;IACL,CAAC;IAED,6CAA6C;IAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,uEAAuE;QACvE,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;YACjC,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;QAE/C,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1C,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,aAAa,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAClG,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC/C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,GAAG,CAAC,IAAI,CAAC;wBACP,IAAI,EAAE,MAAM;wBACZ,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC;wBAC1B,KAAK,EAAE,CAAC;wBACR,GAAG,EAAE,KAAK,GAAG,CAAC;wBACd,WAAW,EAAE,CAAC,GAAG,CAAC;wBAClB,KAAK,EAAE,IAAI;wBACX,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;qBAC/B,CAAC,CAAC;oBACH,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;oBACd,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAEnC,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;YACnD,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,GAAG,CAAC,IAAI,CAAC;wBACP,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;wBAClB,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC5D,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC1B,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC;wBACnB,WAAW,EAAE,IAAI,CAAC,KAAK;wBACvB,KAAK,EAAE,IAAI;wBACX,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;qBAC/B,CAAC,CAAC;gBACL,CAAC;gBACD,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;gBACnB,SAAS;YACX,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;YAClD,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;gBAClB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gBACpD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACpD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;gBACvD,kEAAkE;gBAClE,uEAAuE;gBACvE,mEAAmE;gBACnE,6BAA6B;gBAC7B,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;oBACxB,GAAG,CAAC,IAAI,CAAC;wBACP,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;wBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;wBACtB,KAAK,EAAE,CAAC;wBACR,GAAG,EAAE,MAAM,GAAG,CAAC;wBACf,WAAW,EAAE,OAAO,CAAC,WAAW;wBAChC,KAAK,EAAE,OAAO;wBACd,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;qBAC/B,CAAC,CAAC;gBACL,CAAC;gBACD,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;gBACf,SAAS;YACX,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YACvD,IAAI,OAAO,EAAE,CAAC;gBACZ,GAAG,CAAC,IAAI,CAAC;oBACP,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,KAAK,EAAE,CAAC;oBACR,GAAG,EAAE,QAAQ,GAAG,CAAC;oBACjB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;iBAC/B,CAAC,CAAC;gBACH,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;gBACjB,SAAS;YACX,CAAC;QACH,CAAC;QAED,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+EAA+E;AAC/E,SAAS,YAAY,CAAC,IAAY,EAAE,IAAY;IAC9C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,aAAa,CAAC,CAAC;IAC1D,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;QACnD,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;aACtB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACpB,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,wDAAwD;AACxD,SAAS,eAAe,CAAC,IAAY,EAAE,IAAY;IACjD,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,aAAa,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QAAE,CAAC,IAAI,CAAC,CAAC;IAEtF,MAAM,KAAK,GAAG,CAAC,CAAC;IAChB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,KAAK;YAAE,OAAO,IAAI,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,KAAK;YAAE,OAAO,IAAI,CAAC;QAC/C,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,CAAC,GAAG,KAAK,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;aACtB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACpB,IAAI,KAAK,KAAK,CAAC;gBAAE,MAAM;YACvB,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI;YAAE,MAAM;QAC3D,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,CAAC;IACd,0DAA0D;IAC1D,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC1D,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IACD,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC/B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACnF,CAAC;AAED,8EAA8E;AAC9E,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACzD,CAAC","sourcesContent":["/**\n * A structural Markdown scanner.\n *\n * This is deliberately **not** a CommonMark implementation. spec-graph needs six\n * things from a document - front matter, headings, list items with their\n * continuations, HTML comments, links, and a reliable map of what is code - and\n * a full parser would cost a dependency tree, an AST walk, and a position\n * mapping layer to get back the offsets we want in the first place.\n *\n * What the scanner does guarantee is the part that makes regex-based spec\n * linters lie:\n *\n * - **Code never counts.** Fenced blocks, indented blocks and inline spans are\n * masked before a single link is extracted, so an example in a code sample\n * never becomes a graph edge.\n * - **Items are blocks, not lines.** A list item owns its wrapped continuation\n * lines and its nested content, so a resolution written on the second line of\n * a bullet is found instead of missed.\n * - **Everything carries absolute offsets.** No re-scanning, no drift between\n * the text a rule matched and the position it reports.\n */\n\nimport { createLineIndex, type LineIndex } from './source.js';\n\n/* -------------------------------------------------------------------------- */\n/* Shapes */\n/* -------------------------------------------------------------------------- */\n\nexport interface Range {\n readonly start: number;\n readonly end: number;\n}\n\nexport interface FrontMatter {\n /** The body between the delimiters, exclusive. */\n readonly raw: string;\n /** Offset of the first character of `raw`. */\n readonly start: number;\n readonly end: number;\n /** Offset just past the closing delimiter line. */\n readonly bodyStart: number;\n}\n\nexport interface ScannedLine {\n /** 1-based. */\n readonly line: number;\n /** Offset of the raw line start. */\n readonly start: number;\n /** Offset just past the line, excluding its terminator. */\n readonly end: number;\n /** Offset of the first character after any block-quote markers. */\n readonly contentStart: number;\n /** Line text after block-quote markers, indentation intact. */\n readonly content: string;\n /** Indentation of `content`, tabs counted as four columns. */\n readonly indent: number;\n readonly blank: boolean;\n readonly quoteDepth: number;\n /** Inside a fenced or indented code block, fence delimiters included. */\n readonly code: boolean;\n}\n\nexport interface Heading {\n readonly level: number;\n readonly text: string;\n /** GitHub-compatible anchor slug. */\n readonly slug: string;\n readonly start: number;\n readonly end: number;\n readonly line: number;\n}\n\nexport interface ListItem {\n /** The whole block: marker line plus continuations and nested content. */\n readonly start: number;\n readonly end: number;\n /** Offset of the list marker itself. */\n readonly markerStart: number;\n readonly marker: string;\n /** Offset where the item text begins, after marker and any checkbox. */\n readonly textStart: number;\n /** The character inside `[ ]`, or `null` when the item has no checkbox. */\n readonly checkbox: string | null;\n readonly checkboxStart: number | null;\n /** First line of item text, trimmed. */\n readonly firstLine: string;\n /** Full item text including continuations and nested content. */\n readonly body: string;\n /**\n * `body` with code and comments blanked out, same length and offsets.\n *\n * Anything that searches item text for meaning - resolution markers above\n * all - must read this rather than `body`, or a fenced example nested under\n * the item will close it.\n */\n readonly maskedBody: string;\n readonly line: number;\n /** How many list items enclose this one. Top-level items are `0`. */\n readonly depth: number;\n readonly indent: number;\n}\n\nexport interface HtmlComment {\n readonly start: number;\n readonly end: number;\n /** Text between `<!--` and `-->`. */\n readonly inner: string;\n readonly innerStart: number;\n readonly line: number;\n}\n\nexport type LinkForm = 'inline' | 'reference' | 'shortcut' | 'autolink' | 'wiki' | 'definition';\n\nexport interface Link {\n /** Visible label. Empty for autolinks and definitions. */\n readonly text: string;\n /** Destination as written: a path or a URL. */\n readonly target: string;\n /** Offset of the whole construct. */\n readonly start: number;\n readonly end: number;\n /**\n * Offset of `target` inside the source, for precise diagnostics.\n *\n * For a reference link this is inside the definition, not inside the use:\n * `[design][one]` has no destination of its own, and the line a human edits\n * to fix it is the one that says what `one` points at.\n */\n readonly targetStart: number;\n /**\n * The reference label, for the two forms written with one.\n *\n * `null` everywhere else. Kept because `target` is the destination the label\n * stands for, and a report quoting `[design][docs/gone.md]` would be quoting\n * something the author never wrote.\n */\n readonly label: string | null;\n readonly form: LinkForm;\n readonly line: number;\n}\n\nexport interface TableCell {\n /** Cell text as written, trimmed. */\n readonly text: string;\n /** Offset of the trimmed text, so a finding can point at the cell itself. */\n readonly start: number;\n readonly end: number;\n}\n\nexport interface TableRow {\n readonly cells: readonly TableCell[];\n readonly start: number;\n readonly end: number;\n readonly line: number;\n}\n\nexport interface Table {\n readonly start: number;\n readonly end: number;\n /** Header cells, trimmed. A table without a header row is not a table. */\n readonly headers: readonly TableCell[];\n readonly rows: readonly TableRow[];\n}\n\nexport interface ScannedDocument {\n readonly text: string;\n readonly index: LineIndex;\n readonly frontMatter: FrontMatter | null;\n /** Offset where the body starts, after any front matter. */\n readonly bodyStart: number;\n readonly lines: readonly ScannedLine[];\n readonly headings: readonly Heading[];\n readonly listItems: readonly ListItem[];\n readonly comments: readonly HtmlComment[];\n readonly links: readonly Link[];\n readonly tables: readonly Table[];\n /** Code and comments blanked out, offsets and line breaks preserved. */\n readonly masked: string;\n /** True when the offset falls inside code, a comment, or front matter. */\n isMasked(offset: number): boolean;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Entry point */\n/* -------------------------------------------------------------------------- */\n\nexport function scanMarkdown(source: string): ScannedDocument {\n const text = source.charCodeAt(0) === 0xfeff ? source.slice(1) : source;\n const index = createLineIndex(text);\n const frontMatter = readFrontMatter(text, index);\n const bodyStart = frontMatter ? frontMatter.bodyStart : 0;\n\n const lines = scanLines(text, index, bodyStart);\n // Raw-text HTML joins the code ranges rather than sitting beside them: what\n // both have in common is that their content is not Markdown, and every reader\n // downstream - comments, links, tables - already asks that one question.\n const codeRanges = mergeRanges([...collectCodeRanges(lines, bodyStart), ...collectRawTextHtml(lines, bodyStart)]);\n const comments = scanComments(text, index, bodyStart, codeRanges);\n\n const inlineCode = scanInlineCode(text, bodyStart, codeRanges, comments);\n const maskRanges = [\n ...(frontMatter ? [{ start: 0, end: frontMatter.bodyStart }] : []),\n ...codeRanges,\n ...inlineCode,\n ...comments.map((c) => ({ start: c.start, end: c.end })),\n ];\n const masked = applyMask(text, maskRanges);\n const sortedMask = mergeRanges(maskRanges);\n\n const headings = scanHeadings(lines);\n const listItems = scanListItems(lines, text, masked);\n const links = scanLinks(masked, text, index);\n const tables = scanTables(lines, text, masked);\n\n return {\n text,\n index,\n frontMatter,\n bodyStart,\n lines,\n headings,\n listItems,\n comments,\n links,\n tables,\n masked,\n isMasked: (offset) => containsOffset(sortedMask, offset),\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Front matter */\n/* -------------------------------------------------------------------------- */\n\nconst FENCE_FM = /^(-{3,}|\\+{3,})[ \\t]*$/;\n\nfunction readFrontMatter(text: string, index: LineIndex): FrontMatter | null {\n if (index.lineCount === 0) return null;\n const first = index.lineText(1);\n const open = FENCE_FM.exec(first);\n if (!open) return null;\n const closer = (open[1] as string).startsWith('-') ? /^(-{3,}|\\.{3,})[ \\t]*$/ : /^\\+{3,}[ \\t]*$/;\n\n for (let line = 2; line <= index.lineCount; line += 1) {\n if (closer.test(index.lineText(line))) {\n const start = index.lineStart(2);\n const end = index.lineStart(line);\n const bodyStart = line < index.lineCount ? index.lineStart(line + 1) : text.length;\n return { raw: text.slice(start, end), start, end, bodyStart };\n }\n }\n // An unterminated opener is a horizontal rule, not front matter.\n return null;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Line classification */\n/* -------------------------------------------------------------------------- */\n\nconst LIST_MARKER = /^([ \\t]*)([-*+]|\\d{1,9}[.)])([ \\t]+|$)/;\nconst ATX_HEADING = /^ {0,3}(#{1,6})(?:[ \\t]+(.*?))?[ \\t]*(?:#+[ \\t]*)?$/;\nconst SETEXT_UNDERLINE = /^ {0,3}(=+|-+)[ \\t]*$/;\nconst THEMATIC_BREAK = /^ {0,3}(?:(?:\\*[ \\t]*){3,}|(?:-[ \\t]*){3,}|(?:_[ \\t]*){3,})$/;\nconst FENCE_OPEN = /^([ \\t]*)(`{3,}|~{3,})(.*)$/;\n\n/** Counts indentation in columns, expanding tabs to the next multiple of four. */\nfunction measureIndent(line: string): number {\n let width = 0;\n for (const ch of line) {\n if (ch === ' ') width += 1;\n else if (ch === '\\t') width += 4 - (width % 4);\n else break;\n }\n return width;\n}\n\n/** Strips `>` block-quote markers, returning the offset and text of the content. */\nfunction stripQuotes(raw: string, lineStart: number): { contentStart: number; content: string; depth: number } {\n let i = 0;\n let depth = 0;\n for (;;) {\n let j = i;\n let spaces = 0;\n while (j < raw.length && (raw[j] === ' ' || raw[j] === '\\t') && spaces < 3) {\n spaces += 1;\n j += 1;\n }\n if (raw[j] !== '>') break;\n j += 1;\n if (raw[j] === ' ') j += 1;\n depth += 1;\n i = j;\n }\n return { contentStart: lineStart + i, content: raw.slice(i), depth };\n}\n\nfunction scanLines(text: string, index: LineIndex, bodyStart: number): ScannedLine[] {\n const out: ScannedLine[] = [];\n const firstLine = index.positionAt(bodyStart).line;\n\n let fence: { char: string; length: number; indent: number } | null = null;\n let inList = false;\n let listIndent = 0;\n let previousBlank = true;\n let indentedCode = false;\n\n for (let line = firstLine; line <= index.lineCount; line += 1) {\n const start = index.lineStart(line);\n const end = index.lineEnd(line);\n if (end < bodyStart) continue;\n const raw = text.slice(start, end);\n const { contentStart, content, depth } = stripQuotes(raw, start);\n const indent = measureIndent(content);\n const blank = content.trim().length === 0;\n\n let code = false;\n\n if (fence) {\n code = true;\n const close = FENCE_OPEN.exec(content);\n if (\n close &&\n (close[2] as string)[0] === fence.char &&\n (close[2] as string).length >= fence.length &&\n (close[3] as string).trim().length === 0 &&\n measureIndent(close[1] as string) <= fence.indent + 3\n ) {\n fence = null;\n }\n } else {\n const open = FENCE_OPEN.exec(content);\n if (open && (open[3] as string).indexOf('`') === -1) {\n fence = {\n char: (open[2] as string)[0] as string,\n length: (open[2] as string).length,\n indent: measureIndent(open[1] as string),\n };\n code = true;\n indentedCode = false;\n } else if (blank) {\n code = indentedCode;\n } else {\n // Indented code is only recognised outside list containers. Inside a\n // list, four-space indentation is ordinary continuation far more often\n // than it is a code block, and masking a continuation would silently\n // drop the links and resolutions written there.\n if (!inList && indent >= 4 && (previousBlank || indentedCode)) {\n code = true;\n indentedCode = true;\n } else {\n indentedCode = false;\n }\n }\n }\n\n if (!code && !blank) {\n const marker = LIST_MARKER.exec(content);\n if (marker) {\n inList = true;\n listIndent = indent;\n } else if (inList && indent === 0 && previousBlank) {\n inList = false;\n listIndent = 0;\n } else if (inList && indent <= listIndent && previousBlank && ATX_HEADING.test(content)) {\n inList = false;\n listIndent = 0;\n }\n if (ATX_HEADING.test(content) && indent < 4) {\n inList = false;\n listIndent = 0;\n }\n }\n\n out.push({ line, start, end, contentStart, content, indent, blank, quoteDepth: depth, code });\n previousBlank = blank;\n }\n\n return out;\n}\n\n/**\n * `<script>`, `<style>`, `<pre>` and `<textarea>` blocks.\n *\n * These four are the only HTML elements whose content is not Markdown - the\n * CommonMark spec calls them out by name for exactly that reason - and the\n * distinction is load-bearing here rather than pedantic. A page explaining how\n * to annotate a document puts `<!-- @spec-node id=\"...\" -->` inside a script\n * sample or a `<pre>` block, and reading that as a directive lets a worked\n * example rename the document it appears in.\n *\n * `<div>` and `<details>` are deliberately not on the list. Their content *is*\n * Markdown, and a decision written inside a collapsed `<details>` section is\n * still a decision.\n */\nconst RAW_TEXT_OPEN = /^<(script|pre|style|textarea)(?:[\\s>]|$)/i;\nconst RAW_TEXT_CLOSE = /<\\/(?:script|pre|style|textarea)>/i;\n\nfunction collectRawTextHtml(lines: readonly ScannedLine[], bodyStart: number): Range[] {\n const ranges: Range[] = [];\n let open: { start: number; end: number } | null = null;\n for (const line of lines) {\n if (line.code) continue;\n if (open === null) {\n if (!RAW_TEXT_OPEN.test(line.content.trimStart())) continue;\n open = { start: Math.max(line.start, bodyStart), end: line.end };\n } else {\n open.end = line.end;\n }\n // The close tag ends the block on the line that carries it, whichever of\n // the four it names. An unclosed block runs to the end of the document,\n // which is what a browser does with it too.\n if (RAW_TEXT_CLOSE.test(line.content)) {\n ranges.push(open);\n open = null;\n }\n }\n if (open) ranges.push(open);\n return ranges;\n}\n\nfunction collectCodeRanges(lines: readonly ScannedLine[], bodyStart: number): Range[] {\n const ranges: Range[] = [];\n let open: { start: number; end: number } | null = null;\n for (const line of lines) {\n if (line.code) {\n const start = Math.max(line.start, bodyStart);\n if (open && open.end >= line.start - 2) open.end = line.end;\n else {\n if (open) ranges.push(open);\n open = { start, end: line.end };\n }\n } else if (open) {\n ranges.push(open);\n open = null;\n }\n }\n if (open) ranges.push(open);\n return ranges;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Headings */\n/* -------------------------------------------------------------------------- */\n\nexport function slugify(text: string): string {\n return text\n .trim()\n .toLowerCase()\n .replace(/[`*_~[\\]()<>#!|]/g, '')\n .replace(/[^\\p{L}\\p{N}\\s-]/gu, '')\n .trim()\n // GitHub hyphenates every whitespace character, so a run of two spaces left\n // behind by stripped punctuation becomes two hyphens, not one.\n .replace(/\\s/g, '-');\n}\n\nfunction scanHeadings(lines: readonly ScannedLine[]): Heading[] {\n const out: Heading[] = [];\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i] as ScannedLine;\n if (line.code || line.blank) continue;\n\n const atx = ATX_HEADING.exec(line.content);\n if (atx && line.indent < 4) {\n const body = (atx[2] ?? '').trim();\n out.push({\n level: (atx[1] as string).length,\n text: body,\n slug: slugify(body),\n start: line.contentStart,\n end: line.end,\n line: line.line,\n });\n continue;\n }\n\n // Setext: an underline of `=` or `-` directly below a paragraph line. The\n // preceding line must not itself be a heading, a list item or a fence.\n const next = lines[i + 1];\n if (!next || next.code || next.blank) continue;\n const under = SETEXT_UNDERLINE.exec(next.content);\n if (!under) continue;\n if (LIST_MARKER.test(line.content) || THEMATIC_BREAK.test(line.content)) continue;\n if (line.indent >= 4) continue;\n const body = line.content.trim();\n if (body.length === 0) continue;\n out.push({\n level: (under[1] as string)[0] === '=' ? 1 : 2,\n text: body,\n slug: slugify(body),\n start: line.contentStart,\n end: next.end,\n line: line.line,\n });\n }\n return out;\n}\n\n/* -------------------------------------------------------------------------- */\n/* List items */\n/* -------------------------------------------------------------------------- */\n\nconst CHECKBOX = /^\\[([ xX~\\-?!*/+])\\](?=[ \\t]|$)/;\n\nfunction scanListItems(lines: readonly ScannedLine[], text: string, masked: string): ListItem[] {\n const out: ListItem[] = [];\n // Indents of the list items currently enclosing the cursor, outermost first.\n const stack: number[] = [];\n\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i] as ScannedLine;\n if (line.code || line.blank) continue;\n const marker = LIST_MARKER.exec(line.content);\n if (!marker) continue;\n\n const indent = measureIndent(marker[1] as string);\n while (stack.length > 0 && indent <= (stack[stack.length - 1] as number)) stack.pop();\n const depth = stack.length;\n stack.push(indent);\n\n const markerStart = line.contentStart + (marker[1] as string).length;\n let textStart = markerStart + (marker[2] as string).length + (marker[3] as string).length;\n\n const rest = text.slice(textStart, line.end);\n const box = CHECKBOX.exec(rest);\n let checkbox: string | null = null;\n let checkboxStart: number | null = null;\n if (box) {\n checkbox = box[1] as string;\n checkboxStart = textStart;\n textStart += (box[0] as string).length;\n while (text[textStart] === ' ' || text[textStart] === '\\t') textStart += 1;\n }\n\n const end = findItemEnd(lines, i, indent);\n const firstLine = text.slice(textStart, line.end).trim();\n const body = text.slice(textStart, end);\n\n out.push({\n start: line.contentStart,\n end,\n markerStart,\n marker: marker[2] as string,\n textStart,\n checkbox,\n checkboxStart,\n firstLine,\n body,\n maskedBody: masked.slice(textStart, end),\n line: line.line,\n depth,\n indent,\n });\n }\n\n return out;\n}\n\n/**\n * Finds where a list item block ends.\n *\n * The item owns its wrapped continuation lines and everything nested under it.\n * It gives up ownership at the next sibling or shallower marker, at any\n * heading, and at the first non-indented line after a blank one.\n */\nfunction findItemEnd(lines: readonly ScannedLine[], startIndex: number, indent: number): number {\n let end = (lines[startIndex] as ScannedLine).end;\n let sawBlank = false;\n\n for (let i = startIndex + 1; i < lines.length; i += 1) {\n const line = lines[i] as ScannedLine;\n if (line.blank) {\n sawBlank = true;\n continue;\n }\n if (!line.code) {\n if (line.indent < 4 && ATX_HEADING.test(line.content)) break;\n if (line.indent <= indent) {\n if (sawBlank) break;\n if (LIST_MARKER.test(line.content)) break;\n if (THEMATIC_BREAK.test(line.content)) break;\n }\n }\n if (line.indent <= indent && sawBlank) break;\n end = line.end;\n sawBlank = false;\n }\n\n return end;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Tables */\n/* -------------------------------------------------------------------------- */\n\n/** `| :--- | ---: | :-: |` - the row that makes the line above it a header. */\nconst TABLE_DELIMITER = /^\\|?(?:\\s*:?-+:?\\s*\\|)+\\s*:?-*:?\\s*\\|?$/;\n\n/**\n * Finds pipe tables, with an offset for every cell.\n *\n * Cell offsets are the point: a register kept as a table needs findings that\n * name the cell declaring the relation, not the row and not the file.\n *\n * Splitting happens on the masked copy so a pipe inside inline code cannot\n * invent a column, while the text comes from the original.\n */\nfunction scanTables(lines: readonly ScannedLine[], text: string, masked: string): Table[] {\n const out: Table[] = [];\n\n for (let i = 0; i < lines.length - 1; i += 1) {\n const header = lines[i] as ScannedLine;\n const delimiter = lines[i + 1] as ScannedLine;\n if (header.code || header.blank || delimiter.code) continue;\n if (!header.content.includes('|')) continue;\n if (!TABLE_DELIMITER.test(delimiter.content.trim())) continue;\n\n const headers = splitRow(header, text, masked);\n if (headers.length === 0) continue;\n\n const rows: TableRow[] = [];\n let end = delimiter.end;\n for (let j = i + 2; j < lines.length; j += 1) {\n const line = lines[j] as ScannedLine;\n if (line.blank || line.code || !line.content.includes('|')) break;\n const cells = splitRow(line, text, masked);\n if (cells.length === 0) break;\n rows.push({ cells, start: line.contentStart, end: line.end, line: line.line });\n end = line.end;\n }\n\n out.push({ start: header.contentStart, end, headers, rows });\n i += rows.length + 1;\n }\n\n return out;\n}\n\n/** Splits one row into cells, keeping each cell's offset in the source. */\nfunction splitRow(line: ScannedLine, text: string, masked: string): TableCell[] {\n const from = line.contentStart;\n const to = line.end;\n const bounds: number[] = [];\n for (let i = from; i < to; i += 1) {\n if (masked[i] !== '|') continue;\n // A pipe escaped with a backslash is content, not a column edge.\n if (i > from && text[i - 1] === '\\\\') continue;\n bounds.push(i);\n }\n if (bounds.length === 0) return [];\n\n const cells: TableCell[] = [];\n // A leading pipe opens the first cell; without one the row starts at `from`.\n let cursor = (bounds[0] as number) === from ? from + 1 : from;\n for (const bound of bounds) {\n if (bound < cursor) continue;\n cells.push(makeCell(text, cursor, bound));\n cursor = bound + 1;\n }\n // Trailing content after the last pipe is a final cell unless the row ended\n // with a border pipe.\n if (cursor < to && text.slice(cursor, to).trim().length > 0) cells.push(makeCell(text, cursor, to));\n\n return cells;\n}\n\nfunction makeCell(text: string, start: number, end: number): TableCell {\n const raw = text.slice(start, end);\n const leading = raw.length - raw.trimStart().length;\n const trimmed = raw.trim();\n return { text: trimmed, start: start + leading, end: start + leading + trimmed.length };\n}\n\n/* -------------------------------------------------------------------------- */\n/* HTML comments */\n/* -------------------------------------------------------------------------- */\n\nfunction scanComments(text: string, index: LineIndex, bodyStart: number, code: readonly Range[]): HtmlComment[] {\n const out: HtmlComment[] = [];\n const merged = mergeRanges(code);\n let from = bodyStart;\n for (;;) {\n const open = text.indexOf('<!--', from);\n if (open === -1) break;\n if (containsOffset(merged, open)) {\n from = open + 4;\n continue;\n }\n const close = text.indexOf('-->', open + 4);\n if (close === -1) break;\n out.push({\n start: open,\n end: close + 3,\n inner: text.slice(open + 4, close),\n innerStart: open + 4,\n line: index.positionAt(open).line,\n });\n from = close + 3;\n }\n return out;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Inline code */\n/* -------------------------------------------------------------------------- */\n\nfunction scanInlineCode(\n text: string,\n bodyStart: number,\n code: readonly Range[],\n comments: readonly HtmlComment[],\n): Range[] {\n const blocked = mergeRanges([...code, ...comments.map((c) => ({ start: c.start, end: c.end }))]);\n const out: Range[] = [];\n let i = bodyStart;\n\n while (i < text.length) {\n if (text[i] !== '`') {\n i += 1;\n continue;\n }\n if (containsOffset(blocked, i)) {\n i += 1;\n continue;\n }\n let runStart = i;\n while (text[i] === '`') i += 1;\n const runLength = i - runStart;\n // An escaped backtick does not open a span.\n if (runStart > 0 && text[runStart - 1] === '\\\\') continue;\n\n let j = i;\n let closed = -1;\n while (j < text.length) {\n if (text[j] !== '`') {\n j += 1;\n continue;\n }\n const closeStart = j;\n while (text[j] === '`') j += 1;\n if (j - closeStart === runLength && !containsOffset(blocked, closeStart)) {\n closed = j;\n break;\n }\n }\n if (closed === -1) continue;\n out.push({ start: runStart, end: closed });\n i = closed;\n }\n\n return out;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Masking */\n/* -------------------------------------------------------------------------- */\n\nfunction mergeRanges(ranges: readonly Range[]): Range[] {\n if (ranges.length === 0) return [];\n const sorted = [...ranges].sort((a, b) => a.start - b.start || a.end - b.end);\n const out: Range[] = [{ ...(sorted[0] as Range) }];\n for (let i = 1; i < sorted.length; i += 1) {\n const next = sorted[i] as Range;\n const last = out[out.length - 1] as { start: number; end: number };\n if (next.start <= last.end) last.end = Math.max(last.end, next.end);\n else out.push({ ...next });\n }\n return out;\n}\n\nfunction containsOffset(sorted: readonly Range[], offset: number): boolean {\n let lo = 0;\n let hi = sorted.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const range = sorted[mid] as Range;\n if (offset < range.start) hi = mid - 1;\n else if (offset >= range.end) lo = mid + 1;\n else return true;\n }\n return false;\n}\n\n/**\n * Blanks out the given ranges.\n *\n * Line terminators survive so every offset, line and column in the masked copy\n * still matches the original. Callers slice the original text for content and\n * search the masked copy for structure.\n */\nfunction applyMask(text: string, ranges: readonly Range[]): string {\n const merged = mergeRanges(ranges);\n if (merged.length === 0) return text;\n\n // Built from slices rather than a per-character array. Masking runs over every\n // byte of every document, and a `split('')`/`join('')` round trip allocates an\n // array entry per character - on a large corpus that was the single most\n // expensive thing the scanner did.\n let out = '';\n let cursor = 0;\n for (const range of merged) {\n const start = Math.max(range.start, cursor);\n const end = Math.min(range.end, text.length);\n if (end <= start) continue;\n out += text.slice(cursor, start);\n // The character class is deliberately not Unicode-aware: a surrogate pair\n // must become two spaces so that every later offset still lines up.\n out += text.slice(start, end).replace(NON_TERMINATOR, ' ');\n cursor = end;\n }\n return out + text.slice(cursor);\n}\n\nconst NON_TERMINATOR = /[^\\n\\r]/g;\n\n/* -------------------------------------------------------------------------- */\n/* Links */\n/* -------------------------------------------------------------------------- */\n\nconst DEFINITION = /^ {0,3}\\[([^\\]\\n]+)\\]:[ \\t]*(<[^>\\n]*>|\\S+)/;\nconst AUTOLINK = /<((?:https?|ftp|mailto):[^>\\s]+)>/g;\n\n/** How far a bracket construct may run before we call it unbalanced prose. */\nconst MAX_LINK_SPAN = 4096;\n\nfunction scanLinks(masked: string, text: string, index: LineIndex): Link[] {\n const out: Link[] = [];\n const definitions = new Map<string, { target: string; targetStart: number }>();\n const definitionRanges: Range[] = [];\n\n // Pass 1: reference definitions. These are the destination table the other\n // two written-with-a-label forms are read through, which is why the whole\n // document is swept for them before a single use is looked at: a definition\n // is conventionally written at the foot of the file, long after the links\n // that use it.\n for (let line = 1; line <= index.lineCount; line += 1) {\n const start = index.lineStart(line);\n const content = masked.slice(start, index.lineEnd(line));\n const match = DEFINITION.exec(content);\n if (!match) continue;\n const label = (match[1] as string).trim().toLowerCase();\n const rawTarget = match[2] as string;\n const targetStart = start + content.indexOf(rawTarget, (match[1] as string).length);\n const target = unwrapAngle(rawTarget);\n // First definition wins, as in CommonMark.\n if (!definitions.has(label)) definitions.set(label, { target, targetStart });\n definitionRanges.push({ start, end: start + (match[0] as string).length });\n out.push({\n text: (match[1] as string).trim(),\n target,\n start,\n end: start + (match[0] as string).length,\n targetStart,\n label: (match[1] as string).trim(),\n form: 'definition',\n line,\n });\n }\n\n // Pass 2: autolinks.\n AUTOLINK.lastIndex = 0;\n for (let m = AUTOLINK.exec(masked); m !== null; m = AUTOLINK.exec(masked)) {\n const start = m.index;\n out.push({\n text: '',\n target: m[1] as string,\n start,\n end: start + (m[0] as string).length,\n targetStart: start + 1,\n label: null,\n form: 'autolink',\n line: index.positionAt(start).line,\n });\n }\n\n // Pass 3: bracket constructs, left to right.\n const definedAt = mergeRanges(definitionRanges);\n let i = 0;\n while (i < masked.length) {\n const ch = masked[i];\n if (ch !== '[') {\n i += 1;\n continue;\n }\n // The label of a definition is not itself a shortcut link to anything.\n if (containsOffset(definedAt, i)) {\n i += 1;\n continue;\n }\n const isImage = i > 0 && masked[i - 1] === '!';\n\n if (masked[i + 1] === '[') {\n const close = masked.indexOf(']]', i + 2);\n if (close !== -1 && close - i <= MAX_LINK_SPAN && masked.slice(i + 2, close).indexOf('\\n') === -1) {\n const target = text.slice(i + 2, close).trim();\n if (target.length > 0) {\n out.push({\n text: target,\n target: wikiTarget(target),\n start: i,\n end: close + 2,\n targetStart: i + 2,\n label: null,\n form: 'wiki',\n line: index.positionAt(i).line,\n });\n i = close + 2;\n continue;\n }\n }\n }\n\n const labelEnd = matchBracket(masked, i);\n if (labelEnd === -1) {\n i += 1;\n continue;\n }\n const label = text.slice(i + 1, labelEnd);\n const after = masked[labelEnd + 1];\n\n if (after === '(') {\n const dest = readDestination(masked, labelEnd + 2);\n if (dest) {\n if (!isImage) {\n out.push({\n text: label.trim(),\n target: unwrapAngle(text.slice(dest.start, dest.end).trim()),\n start: isImage ? i - 1 : i,\n end: dest.close + 1,\n targetStart: dest.start,\n label: null,\n form: 'inline',\n line: index.positionAt(i).line,\n });\n }\n i = dest.close + 1;\n continue;\n }\n } else if (after === '[') {\n const refEnd = matchBracket(masked, labelEnd + 1);\n if (refEnd !== -1) {\n const ref = text.slice(labelEnd + 2, refEnd).trim();\n const written = ref.length > 0 ? ref : label.trim();\n const defined = definitions.get(written.toLowerCase());\n // A label with no definition is not a link. Every renderer prints\n // `[design][one]` verbatim when nothing says what `one` is, so reading\n // it as a citation invents a reference the author never made - and\n // then reports it as broken.\n if (!isImage && defined) {\n out.push({\n text: label.trim(),\n target: defined.target,\n start: i,\n end: refEnd + 1,\n targetStart: defined.targetStart,\n label: written,\n form: 'reference',\n line: index.positionAt(i).line,\n });\n }\n i = refEnd + 1;\n continue;\n }\n } else if (!isImage) {\n const written = label.trim();\n const defined = definitions.get(written.toLowerCase());\n if (defined) {\n out.push({\n text: written,\n target: defined.target,\n start: i,\n end: labelEnd + 1,\n targetStart: defined.targetStart,\n label: written,\n form: 'shortcut',\n line: index.positionAt(i).line,\n });\n i = labelEnd + 1;\n continue;\n }\n }\n\n i = labelEnd + 1;\n }\n\n out.sort((a, b) => a.start - b.start);\n return out;\n}\n\n/** Finds the `]` matching the `[` at `open`, honouring nesting and escapes. */\nfunction matchBracket(text: string, open: number): number {\n let depth = 0;\n const limit = Math.min(text.length, open + MAX_LINK_SPAN);\n for (let i = open; i < limit; i += 1) {\n const ch = text[i];\n if (ch === '\\\\') {\n i += 1;\n continue;\n }\n if (ch === '\\n' && text[i + 1] === '\\n') return -1;\n if (ch === '[') depth += 1;\n else if (ch === ']') {\n depth -= 1;\n if (depth === 0) return i;\n }\n }\n return -1;\n}\n\n/** Reads a link destination starting just after `(`. */\nfunction readDestination(text: string, from: number): { start: number; end: number; close: number } | null {\n let i = from;\n const limit = Math.min(text.length, from + MAX_LINK_SPAN);\n while (i < limit && (text[i] === ' ' || text[i] === '\\t' || text[i] === '\\n')) i += 1;\n\n const start = i;\n if (text[i] === '<') {\n const close = text.indexOf('>', i + 1);\n if (close === -1 || close > limit) return null;\n const paren = text.indexOf(')', close);\n if (paren === -1 || paren > limit) return null;\n return { start, end: close + 1, close: paren };\n }\n\n let depth = 0;\n while (i < limit) {\n const ch = text[i];\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === '(') depth += 1;\n else if (ch === ')') {\n if (depth === 0) break;\n depth -= 1;\n } else if (ch === ' ' || ch === '\\t' || ch === '\\n') break;\n i += 1;\n }\n const end = i;\n // Skip an optional title, then require the closing paren.\n let j = i;\n while (j < limit && text[j] !== ')') {\n if (text[j] === '\\n' && text[j + 1] === '\\n') return null;\n j += 1;\n }\n if (j >= limit || text[j] !== ')') return null;\n if (end === start) return null;\n return { start, end, close: j };\n}\n\nfunction unwrapAngle(value: string): string {\n return value.startsWith('<') && value.endsWith('>') ? value.slice(1, -1) : value;\n}\n\n/** `[[0007-thing|Display]]` and `[[0007-thing]]` both target `0007-thing`. */\nfunction wikiTarget(raw: string): string {\n const pipe = raw.indexOf('|');\n return (pipe === -1 ? raw : raw.slice(0, pipe)).trim();\n}\n"]}