slackmark 0.3.0 → 0.4.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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/capabilities/capabilities.ts","../src/constants.ts","../src/budget/standard-budget-ledger.ts","../src/budget/recording-degradation-collector.ts","../src/budget/conversion-context.ts","../src/registry/adapter-registry.ts","../src/assert-never.ts","../src/types.ts","../src/assemble/message-assembler.ts","../src/assemble/text-fallback.ts","../src/parsers/remark-markdown-parser.ts","../src/mermaid/mermaid-pie-parser.ts","../src/mermaid/mermaid-xychart-parser.ts","../src/converter/slackmark-converter.ts","../src/errors.ts","../src/converter/resolve-config.ts","../src/adapters/blockquote-adapter.ts","../src/adapters/inline.ts","../src/adapters/code-fence-adapter.ts","../src/adapters/heading-adapter.ts","../src/adapters/html-block-adapter.ts","../src/adapters/list-adapter.ts","../src/adapters/math-block-adapter.ts","../src/adapters/mermaid-fence-adapter.ts","../src/adapters/paragraph-adapter.ts","../src/adapters/skip-adapter.ts","../src/adapters/table-adapter.ts","../src/adapters/task-list-adapter.ts","../src/adapters/thematic-break-adapter.ts","../src/converter/create-converter.ts","../src/validate/validate-blocks.ts"],"sourcesContent":["/**\n * Capability profiles keyed to Slack changelog dates.\n * @see design/mapping-matrix.md\n */\n\nexport interface CapabilityFlags {\n readonly richText: boolean;\n readonly markdownBlock: boolean;\n readonly tableBlock: boolean;\n readonly preformattedLanguage: boolean;\n readonly headerLevel: boolean;\n readonly dataTable: boolean;\n readonly dataVisualization: boolean;\n readonly containerBlock: boolean;\n}\n\nexport type CapabilityFlag = keyof CapabilityFlags;\n\nexport const CapabilityPresetName = {\n Latest: \"latest\",\n Conservative: \"conservative\",\n D2025_02: \"2025-02\",\n D2025_08: \"2025-08\",\n D2026_03: \"2026-03\",\n D2026_05: \"2026-05\",\n D2026_06: \"2026-06\",\n} as const;\n\nexport type CapabilityPresetName = (typeof CapabilityPresetName)[keyof typeof CapabilityPresetName];\n\nconst ALL_OFF: CapabilityFlags = {\n richText: false,\n markdownBlock: false,\n tableBlock: false,\n preformattedLanguage: false,\n headerLevel: false,\n dataTable: false,\n dataVisualization: false,\n containerBlock: false,\n};\n\nconst CONSERVATIVE: CapabilityFlags = {\n ...ALL_OFF,\n richText: true,\n};\n\nconst P_2025_02: CapabilityFlags = {\n ...CONSERVATIVE,\n markdownBlock: true,\n};\n\nconst P_2025_08: CapabilityFlags = {\n ...P_2025_02,\n tableBlock: true,\n};\n\nconst P_2026_03: CapabilityFlags = {\n ...P_2025_08,\n preformattedLanguage: true,\n headerLevel: true,\n};\n\nconst P_2026_05: CapabilityFlags = {\n ...P_2026_03,\n dataTable: true,\n};\n\nconst P_2026_06: CapabilityFlags = {\n ...P_2026_05,\n dataVisualization: true,\n containerBlock: true,\n};\n\nconst LATEST: CapabilityFlags = { ...P_2026_06 };\n\nexport const CAPABILITY_PRESETS: {\n readonly latest: CapabilityFlags;\n readonly conservative: CapabilityFlags;\n readonly \"2025-02\": CapabilityFlags;\n readonly \"2025-08\": CapabilityFlags;\n readonly \"2026-03\": CapabilityFlags;\n readonly \"2026-05\": CapabilityFlags;\n readonly \"2026-06\": CapabilityFlags;\n} = {\n latest: LATEST,\n conservative: CONSERVATIVE,\n \"2025-02\": P_2025_02,\n \"2025-08\": P_2025_08,\n \"2026-03\": P_2026_03,\n \"2026-05\": P_2026_05,\n \"2026-06\": P_2026_06,\n};\n\nexport type CapabilityFlagsPartial = {\n readonly [K in CapabilityFlag]?: boolean;\n};\n\n/**\n * Resolve a preset name, flags object, or preset + overrides into immutable flags.\n */\nexport function resolveCapabilities(\n input: CapabilityPresetName | CapabilityFlags | CapabilityFlagsPartial | undefined,\n overrides?: CapabilityFlagsPartial,\n): CapabilityFlags {\n let base: CapabilityFlags;\n if (input === undefined) {\n base = CAPABILITY_PRESETS.latest;\n } else if (typeof input === \"string\") {\n const preset = CAPABILITY_PRESETS[input];\n if (preset === undefined) {\n base = CAPABILITY_PRESETS.latest;\n } else {\n base = preset;\n }\n } else if (isFullFlags(input)) {\n base = input;\n } else {\n base = { ...CAPABILITY_PRESETS.latest, ...input };\n }\n if (overrides === undefined) {\n return Object.freeze({ ...base });\n }\n return Object.freeze({ ...base, ...overrides });\n}\n\nfunction isFullFlags(value: CapabilityFlags | CapabilityFlagsPartial): value is CapabilityFlags {\n return (\n typeof value.richText === \"boolean\" &&\n typeof value.markdownBlock === \"boolean\" &&\n typeof value.tableBlock === \"boolean\" &&\n typeof value.preformattedLanguage === \"boolean\" &&\n typeof value.headerLevel === \"boolean\" &&\n typeof value.dataTable === \"boolean\" &&\n typeof value.dataVisualization === \"boolean\" &&\n typeof value.containerBlock === \"boolean\"\n );\n}\n","/**\n * Named Slack Block Kit limits.\n * Sources: https://docs.slack.dev/block-kit and block reference pages (July 2026 research).\n */\n\n/** https://docs.slack.dev/block-kit */\nexport const MAX_BLOCKS_PER_MESSAGE = 50;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/section-block */\nexport const SECTION_TEXT_MAX_CHARS = 3000;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/header-block */\nexport const HEADER_TEXT_MAX_CHARS = 150;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/header-block */\nexport const HEADER_LEVEL_MAX = 4;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/image-block */\nexport const IMAGE_URL_MAX_CHARS = 3000;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/image-block */\nexport const IMAGE_ALT_MAX_CHARS = 2000;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/context-block */\nexport const CONTEXT_ELEMENTS_MAX = 10;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/markdown-block */\nexport const MARKDOWN_CUMULATIVE_MAX_CHARS = 12_000;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/table-block */\nexport const TABLE_MAX_ROWS = 100;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/table-block */\nexport const TABLE_MAX_COLS = 20;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/table-block */\nexport const TABLE_CELL_CHARS_MAX = 10_000;\n\n/** Spec decision: prefer `table` up to this many rows (incl. header). */\nexport const TABLE_PREFERRED_MAX_ROWS = 50;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-table-block */\nexport const DATA_TABLE_MAX_DATA_ROWS = 200;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-table-block */\nexport const DATA_TABLE_CELL_CHARS_MAX = 20_000;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block */\nexport const CHART_TITLE_MAX_CHARS = 50;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block */\nexport const CHART_LABEL_MAX_CHARS = 20;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block */\nexport const CHART_SEGMENTS_MAX = 12;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block */\nexport const CHART_SERIES_MAX = 12;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block */\nexport const CHART_POINTS_MAX = 20;\n\n/**\n * Community-reported cap (ENG-4936); not in official docs.\n * Enforced defensively with degradation.\n */\nexport const DATA_VISUALIZATION_MAX_PER_MESSAGE = 2;\n\n/** https://docs.slack.dev/reference/methods/chat.postMessage#truncating */\nexport const MESSAGE_TEXT_SAFETY_MAX_CHARS = 40_000;\n\n/** Undocumented; defensive clamp for rich_text_list.indent. */\nexport const RICH_TEXT_LIST_INDENT_MAX = 6;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/container-block */\nexport const CONTAINER_CHILDREN_MAX = 10;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/container-block */\nexport const CONTAINER_TITLE_MAX_CHARS = 150;\n\n/** Cell wrap heuristic for table column_settings.is_wrapped. */\nexport const TABLE_CELL_WRAP_THRESHOLD = 40;\n\nexport const ELLIPSIS = \"…\";\n","import {\n DATA_TABLE_CELL_CHARS_MAX,\n DATA_VISUALIZATION_MAX_PER_MESSAGE,\n MARKDOWN_CUMULATIVE_MAX_CHARS,\n MAX_BLOCKS_PER_MESSAGE,\n MESSAGE_TEXT_SAFETY_MAX_CHARS,\n TABLE_CELL_CHARS_MAX,\n} from \"../constants.js\";\nimport type { BudgetClaim, BudgetLedger, BudgetSnapshot } from \"../types.js\";\n\nexport interface StandardBudgetLedgerOptions {\n /**\n * When false, the per-message chart cap is not enforced (used while emitting\n * a document that will be split; the assembler re-applies the cap per message).\n * Table/markdown/total char caps stay enforced so oversized single blocks cannot slip through.\n */\n readonly enforceChartCap?: boolean;\n}\n\n/**\n * O(1) running-total budget tracker for a single Slack message.\n */\nexport class StandardBudgetLedger implements BudgetLedger {\n readonly maxBlocks: number;\n private readonly enforceChartCap: boolean;\n private blocks: number;\n private tableChars: number;\n private dataTableChars: number;\n private markdownChars: number;\n private charts: number;\n private totalChars: number;\n\n constructor(maxBlocks: number = MAX_BLOCKS_PER_MESSAGE, options?: StandardBudgetLedgerOptions) {\n this.maxBlocks = maxBlocks;\n this.enforceChartCap = options?.enforceChartCap ?? true;\n this.blocks = 0;\n this.tableChars = 0;\n this.dataTableChars = 0;\n this.markdownChars = 0;\n this.charts = 0;\n this.totalChars = 0;\n }\n\n tryReserveClaim(claim: BudgetClaim | undefined): boolean {\n if (claim === undefined) {\n return true;\n }\n const nextBlocks = this.blocks + (claim.blocks ?? 0);\n const nextTable = this.tableChars + (claim.tableChars ?? 0);\n const nextData = this.dataTableChars + (claim.dataTableChars ?? 0);\n const nextMd = this.markdownChars + (claim.markdownChars ?? 0);\n const nextCharts = this.charts + (claim.chart === true ? 1 : 0);\n const nextTotal = this.totalChars + (claim.totalChars ?? 0);\n\n if (nextBlocks > this.maxBlocks) return false;\n if (nextTable > TABLE_CELL_CHARS_MAX) return false;\n if (nextData > DATA_TABLE_CELL_CHARS_MAX) return false;\n if (nextMd > MARKDOWN_CUMULATIVE_MAX_CHARS) return false;\n if (this.enforceChartCap && nextCharts > DATA_VISUALIZATION_MAX_PER_MESSAGE) return false;\n if (nextTotal > MESSAGE_TEXT_SAFETY_MAX_CHARS) return false;\n\n this.blocks = nextBlocks;\n this.tableChars = nextTable;\n this.dataTableChars = nextData;\n this.markdownChars = nextMd;\n this.charts = nextCharts;\n this.totalChars = nextTotal;\n return true;\n }\n\n snapshot(): BudgetSnapshot {\n return {\n blocks: this.blocks,\n tableChars: this.tableChars,\n dataTableChars: this.dataTableChars,\n markdownChars: this.markdownChars,\n charts: this.charts,\n totalChars: this.totalChars,\n };\n }\n\n restore(snapshot: BudgetSnapshot): void {\n this.blocks = snapshot.blocks;\n this.tableChars = snapshot.tableChars;\n this.dataTableChars = snapshot.dataTableChars;\n this.markdownChars = snapshot.markdownChars;\n this.charts = snapshot.charts;\n this.totalChars = snapshot.totalChars;\n }\n\n resetForNewMessage(): void {\n this.blocks = 0;\n this.tableChars = 0;\n this.dataTableChars = 0;\n this.markdownChars = 0;\n this.charts = 0;\n this.totalChars = 0;\n }\n}\n","import type { Degradation, DegradationCollector } from \"../types.js\";\n\n/**\n * In-memory degradation collector for one conversion.\n */\nexport class RecordingDegradationCollector implements DegradationCollector {\n private readonly items: Degradation[];\n\n constructor() {\n this.items = [];\n }\n\n add(d: Degradation): void {\n this.items.push(d);\n }\n\n all(): ReadonlyArray<Degradation> {\n return this.items.slice();\n }\n}\n","import type { Definition, FootnoteDefinition } from \"mdast\";\n\nimport type { CapabilityFlags } from \"../capabilities/capabilities.js\";\nimport type {\n BudgetLedger,\n ConversionStrategy,\n DegradationCollector,\n ImageRenderer,\n MentionResolvers,\n OverflowMode,\n SlackUploader,\n} from \"../types.js\";\n\n/**\n * Immutable resolved config for one conversion.\n */\nexport interface ResolvedConfig {\n readonly capabilities: CapabilityFlags;\n readonly overflow: OverflowMode;\n readonly strategy: ConversionStrategy;\n readonly renderers: ReadonlyArray<ImageRenderer>;\n readonly uploader: SlackUploader | undefined;\n readonly enableMath: boolean;\n readonly enableFrontmatter: boolean;\n readonly mentionResolvers: MentionResolvers | undefined;\n}\n\nexport interface ConversionContextDeps {\n readonly config: ResolvedConfig;\n readonly budget: BudgetLedger;\n readonly degradations: DegradationCollector;\n readonly definitions: ReadonlyMap<string, Definition>;\n readonly footnotes: ReadonlyMap<string, FootnoteDefinition>;\n readonly footnoteOrder: ReadonlyArray<string>;\n readonly precedingHeading: string | undefined;\n readonly path: string;\n}\n\n/**\n * Per-call conversion state. Never stored on converter instances.\n */\nexport class ConversionContext {\n readonly config: ResolvedConfig;\n readonly budget: BudgetLedger;\n readonly degradations: DegradationCollector;\n readonly definitions: ReadonlyMap<string, Definition>;\n readonly footnotes: ReadonlyMap<string, FootnoteDefinition>;\n readonly footnoteOrder: ReadonlyArray<string>;\n readonly precedingHeading: string | undefined;\n readonly path: string;\n\n constructor(deps: ConversionContextDeps) {\n this.config = deps.config;\n this.budget = deps.budget;\n this.degradations = deps.degradations;\n this.definitions = deps.definitions;\n this.footnotes = deps.footnotes;\n this.footnoteOrder = deps.footnoteOrder;\n this.precedingHeading = deps.precedingHeading;\n this.path = deps.path;\n }\n\n withDegradations(degradations: DegradationCollector): ConversionContext {\n return new ConversionContext({\n config: this.config,\n budget: this.budget,\n degradations,\n definitions: this.definitions,\n footnotes: this.footnotes,\n footnoteOrder: this.footnoteOrder,\n precedingHeading: this.precedingHeading,\n path: this.path,\n });\n }\n}\n","import type { RootContent } from \"mdast\";\n\nimport type { NodeAdapter } from \"../adapters/node-adapter.js\";\nimport type { Block } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport type { CapabilityFlag } from \"../capabilities/capabilities.js\";\n\n/**\n * First-matching adapter wins; candidates tried in order with capability/budget gates.\n */\nexport class AdapterRegistry {\n private readonly adapters: ReadonlyArray<NodeAdapter>;\n\n constructor(adapters: ReadonlyArray<NodeAdapter>) {\n this.adapters = adapters;\n }\n\n async emit(node: RootContent, ctx: ConversionContext): Promise<ReadonlyArray<Block>> {\n for (const adapter of this.adapters) {\n if (!adapter.match(node, ctx)) {\n continue;\n }\n const candidates = adapter.plan(node, ctx);\n let budgetBlocked = false;\n let emittedEmpty = false;\n for (const candidate of candidates) {\n if (!capabilitiesAllow(candidate.requires, ctx)) {\n continue;\n }\n const beforeClaim = ctx.budget.snapshot();\n if (!ctx.budget.tryReserveClaim(candidate.budget)) {\n budgetBlocked = true;\n continue;\n }\n const blocks = await candidate.emit(ctx);\n if (blocks.length === 0) {\n // Release the reservation and try the next candidate (e.g. mermaid fallback).\n ctx.budget.restore(beforeClaim);\n emittedEmpty = true;\n continue;\n }\n return blocks;\n }\n // Intentional empty emits (SkipAdapter, empty HTML) already recorded their own\n // degradations; do not double-flag when nothing was budget-blocked.\n if (emittedEmpty && !budgetBlocked) {\n return [];\n }\n ctx.degradations.add({\n nodeType: node.type,\n from: \"adapter\",\n to: \"empty\",\n reason: budgetBlocked\n ? \"Message budget exhausted (blocks/chars/charts); content omitted\"\n : \"All candidates failed capability/budget gates\",\n path: ctx.path,\n });\n return [];\n }\n\n ctx.degradations.add({\n nodeType: node.type,\n from: node.type,\n to: \"skip\",\n reason: \"No adapter matched node\",\n path: ctx.path,\n });\n return [];\n }\n}\n\nfunction capabilitiesAllow(\n requires: ReadonlyArray<CapabilityFlag> | undefined,\n ctx: ConversionContext,\n): boolean {\n if (requires === undefined) {\n return true;\n }\n for (const flag of requires) {\n if (!ctx.config.capabilities[flag]) {\n return false;\n }\n }\n return true;\n}\n","/**\n * Exhaustiveness helper for discriminated unions.\n */\nexport function assertNever(value: never, message?: string): never {\n const detail = message ?? \"Unexpected value\";\n throw new Error(`${detail}: ${JSON.stringify(value)}`);\n}\n","import type { Root } from \"mdast\";\n\nimport type { Block } from \"./blocks/types.js\";\nimport type {\n CapabilityFlags,\n CapabilityFlagsPartial,\n CapabilityPresetName,\n} from \"./capabilities/capabilities.js\";\n\n/**\n * Structured degradation emitted when content falls back or is truncated.\n */\nexport interface Degradation {\n readonly nodeType: string;\n readonly from: string;\n readonly to: string;\n readonly reason: string;\n readonly path: string;\n}\n\n/**\n * Total conversion result — never throws on user markdown.\n */\nexport interface ConversionResult {\n readonly blocks: ReadonlyArray<Block>;\n readonly text: string;\n readonly degradations: ReadonlyArray<Degradation>;\n}\n\n/**\n * One message chunk from multi-message conversion.\n */\nexport interface ConversionMessage {\n readonly blocks: ReadonlyArray<Block>;\n readonly text: string;\n}\n\n/**\n * Multi-message conversion result.\n */\nexport interface ConversionMessagesResult {\n readonly messages: ReadonlyArray<ConversionMessage>;\n readonly degradations: ReadonlyArray<Degradation>;\n}\n\nexport const OverflowMode = {\n Degrade: \"degrade\",\n Split: \"split\",\n} as const;\n\nexport type OverflowMode = (typeof OverflowMode)[keyof typeof OverflowMode];\n\nexport const ConversionStrategy = {\n RichTextFirst: \"rich-text-first\",\n MarkdownBlock: \"markdown-block\",\n} as const;\n\nexport type ConversionStrategy = (typeof ConversionStrategy)[keyof typeof ConversionStrategy];\n\n/**\n * Request passed to {@link ImageRenderer}.\n */\nexport interface RenderRequest {\n readonly lang: string;\n readonly source: string;\n readonly altText: string;\n}\n\nexport type BytesImage = {\n readonly kind: \"bytes\";\n readonly data: Uint8Array;\n readonly mimeType: \"image/png\" | \"image/jpeg\" | \"image/gif\";\n readonly filename: string;\n};\n\nexport type UrlImage = {\n readonly kind: \"url\";\n readonly imageUrl: string;\n};\n\nexport type RenderedImage = UrlImage | BytesImage;\n\n/**\n * Pluggable image renderer for mermaid/math/diagram fences (phase-2 adapters).\n */\nexport interface ImageRenderer {\n canRender(req: RenderRequest): boolean;\n render(req: RenderRequest): Promise<(RenderedImage & { readonly altText: string }) | null>;\n}\n\n/**\n * Uploads bytes-producing renderer output to Slack files API.\n */\nexport interface SlackUploader {\n upload(img: BytesImage): Promise<{ readonly fileId: string }>;\n}\n\n/**\n * Optional mention resolvers (off by default).\n */\nexport interface MentionResolvers {\n readonly resolveUser?: (handle: string) => string | undefined;\n readonly resolveChannel?: (name: string) => string | undefined;\n}\n\n/**\n * Public conversion options (per-call).\n * Custom adapters are wired via {@link createConverter}, not per-call options.\n */\nexport interface ConvertOptions {\n readonly capabilities?:\n | CapabilityPresetName\n | CapabilityFlags\n | CapabilityFlagsPartial\n | undefined;\n readonly capabilityOverrides?: CapabilityFlagsPartial | undefined;\n readonly overflow?: OverflowMode | undefined;\n readonly strategy?: ConversionStrategy | undefined;\n readonly renderers?: ReadonlyArray<ImageRenderer> | undefined;\n readonly uploader?: SlackUploader | undefined;\n readonly enableMath?: boolean | undefined;\n readonly enableFrontmatter?: boolean | undefined;\n readonly mentionResolvers?: MentionResolvers | undefined;\n}\n\n/**\n * Collects degradations during a single conversion.\n */\nexport interface DegradationCollector {\n add(d: Degradation): void;\n all(): ReadonlyArray<Degradation>;\n}\n\n/**\n * Budget reservation claimed while planning a candidate.\n */\nexport interface BudgetClaim {\n readonly blocks?: number;\n readonly tableChars?: number;\n readonly dataTableChars?: number;\n readonly markdownChars?: number;\n readonly chart?: boolean;\n readonly totalChars?: number;\n}\n\n/**\n * Message-wide budget ledger.\n */\nexport interface BudgetLedger {\n readonly maxBlocks: number;\n tryReserveClaim(claim: BudgetClaim | undefined): boolean;\n snapshot(): BudgetSnapshot;\n /** Restore counters to a prior {@link snapshot} (e.g. after an empty emit). */\n restore(snapshot: BudgetSnapshot): void;\n resetForNewMessage(): void;\n}\n\nexport interface BudgetSnapshot {\n readonly blocks: number;\n readonly tableChars: number;\n readonly dataTableChars: number;\n readonly markdownChars: number;\n readonly charts: number;\n readonly totalChars: number;\n}\n\n/**\n * Deterministic markdown → plain text for notification fallbacks.\n */\nexport interface PlainTextRenderer {\n render(markdown: string): string;\n renderFromBlocks(blocks: ReadonlyArray<Block>): string;\n}\n\n/**\n * Swappable markdown parser (wraps remark by default).\n */\nexport interface MarkdownParser {\n parse(markdown: string, options: ParserOptions): Promise<Root>;\n}\n\nexport interface ParserOptions {\n readonly enableMath: boolean;\n readonly enableFrontmatter: boolean;\n}\n\n/**\n * Mermaid chart grammar parser (pie / xychart).\n */\nexport interface MermaidChartParser {\n parse(source: string): MermaidParseResult;\n}\n\nexport type MermaidParseResult =\n | { readonly ok: true; readonly value: MermaidPieAst | MermaidXyChartAst }\n | { readonly ok: false; readonly reason: string };\n\nexport interface MermaidPieAst {\n readonly kind: \"pie\";\n readonly title: string | undefined;\n readonly segments: ReadonlyArray<{ readonly label: string; readonly value: number }>;\n}\n\nexport interface MermaidXyChartAst {\n readonly kind: \"xychart-beta\";\n readonly title: string | undefined;\n readonly categories: ReadonlyArray<string>;\n readonly xLabel: string | undefined;\n readonly yLabel: string | undefined;\n readonly bars: ReadonlyArray<ReadonlyArray<number>>;\n readonly lines: ReadonlyArray<ReadonlyArray<number>>;\n}\n","import { assertNever } from \"../assert-never.js\";\nimport type {\n Block,\n DataTableBlock,\n RichTextBlock,\n RichTextElement,\n TableBlock,\n TableCell,\n} from \"../blocks/types.js\";\nimport { StandardBudgetLedger } from \"../budget/standard-budget-ledger.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport {\n CONTEXT_ELEMENTS_MAX,\n MAX_BLOCKS_PER_MESSAGE,\n MESSAGE_TEXT_SAFETY_MAX_CHARS,\n SECTION_TEXT_MAX_CHARS,\n} from \"../constants.js\";\nimport type {\n BudgetClaim,\n ConversionMessage,\n DegradationCollector,\n PlainTextRenderer,\n} from \"../types.js\";\nimport { OverflowMode as Overflow } from \"../types.js\";\n\nexport interface MessageAssemblerDeps {\n readonly plainText: PlainTextRenderer;\n}\n\n/**\n * Packs blocks into messages, coalesces adjacent rich_text, attaches footnotes.\n */\nexport class MessageAssembler {\n private readonly plainText: PlainTextRenderer;\n\n constructor(deps: MessageAssemblerDeps) {\n this.plainText = deps.plainText;\n }\n\n assemble(\n blocks: ReadonlyArray<Block>,\n ctx: ConversionContext,\n footnoteBlocks: ReadonlyArray<Block>,\n ): ReadonlyArray<ConversionMessage> {\n const coalesced = coalesceRichText(blocks);\n\n if (ctx.config.overflow === Overflow.Split) {\n return this.splitMessages([...coalesced, ...footnoteBlocks], ctx);\n }\n\n // Degrade: reserve trailing slots for footnotes so they are not sliced off.\n const noteCount = footnoteBlocks.length;\n const bodyCap = Math.max(0, MAX_BLOCKS_PER_MESSAGE - noteCount);\n const clippedBody = coalesced.slice(0, bodyCap);\n if (coalesced.length > bodyCap) {\n ctx.degradations.add({\n nodeType: \"message\",\n from: `${String(coalesced.length)} body blocks`,\n to: `${String(bodyCap)} body blocks`,\n reason:\n noteCount > 0\n ? `overflow=degrade truncated body to reserve ${String(noteCount)} footnote blocks`\n : \"overflow=degrade truncated to 50 blocks\",\n path: ctx.path,\n });\n }\n\n let notes = footnoteBlocks;\n if (notes.length > MAX_BLOCKS_PER_MESSAGE) {\n notes = footnoteBlocks.slice(0, MAX_BLOCKS_PER_MESSAGE);\n ctx.degradations.add({\n nodeType: \"footnote\",\n from: `${String(footnoteBlocks.length)} footnote blocks`,\n to: `${String(MAX_BLOCKS_PER_MESSAGE)} footnote blocks`,\n reason: \"Footnote blocks alone exceed 50; truncated\",\n path: ctx.path,\n });\n }\n\n const finalBlocks = [...clippedBody, ...notes];\n return [this.toMessage(finalBlocks, ctx)];\n }\n\n private splitMessages(\n blocks: ReadonlyArray<Block>,\n ctx: ConversionContext,\n ): ReadonlyArray<ConversionMessage> {\n const messages: ConversionMessage[] = [];\n let current: Block[] = [];\n let ledger = new StandardBudgetLedger(MAX_BLOCKS_PER_MESSAGE);\n\n const flush = (): void => {\n if (current.length === 0) {\n return;\n }\n messages.push(this.toMessage(current, ctx));\n current = [];\n ledger = new StandardBudgetLedger(MAX_BLOCKS_PER_MESSAGE);\n };\n\n for (const block of blocks) {\n const claim = claimForBlock(block);\n if (!ledger.tryReserveClaim(claim)) {\n flush();\n if (!ledger.tryReserveClaim(claim)) {\n // Single block exceeds an empty message budget (e.g. oversized table) — omit.\n ctx.degradations.add({\n nodeType: \"message\",\n from: block.type,\n to: \"omitted\",\n reason: \"Block exceeds per-message budget; omitted\",\n path: ctx.path,\n });\n continue;\n }\n }\n current.push(block);\n }\n flush();\n\n if (messages.length > 1) {\n ctx.degradations.add({\n nodeType: \"message\",\n from: \"single\",\n to: `${String(messages.length)} messages`,\n reason: \"Split at semantic block boundaries (per-message budgets)\",\n path: ctx.path,\n });\n }\n\n return messages.length > 0 ? messages : [{ blocks: [], text: \" \" }];\n }\n\n private toMessage(blocks: ReadonlyArray<Block>, ctx: ConversionContext): ConversionMessage {\n const raw = this.plainText.renderFromBlocks(blocks);\n if (raw.length <= MESSAGE_TEXT_SAFETY_MAX_CHARS) {\n return { blocks, text: raw };\n }\n ctx.degradations.add({\n nodeType: \"message\",\n from: `${String(raw.length)} text chars`,\n to: `${String(MESSAGE_TEXT_SAFETY_MAX_CHARS)} text chars`,\n reason: \"Notification text truncated to 40k safety limit\",\n path: ctx.path,\n });\n return { blocks, text: raw.slice(0, MESSAGE_TEXT_SAFETY_MAX_CHARS) };\n }\n}\n\n/**\n * Build trailing divider + context chunks for footnotes.\n */\nexport function buildFootnoteBlocks(\n entries: ReadonlyArray<{ readonly n: number; readonly text: string }>,\n degradations?: DegradationCollector,\n): ReadonlyArray<Block> {\n if (entries.length === 0) {\n return [];\n }\n const blocks: Block[] = [{ type: \"divider\" }];\n const elements: ContextBlockElements = [];\n for (const e of entries) {\n const note = `[${String(e.n)}] ${e.text}`;\n if (note.length > SECTION_TEXT_MAX_CHARS) {\n degradations?.add({\n nodeType: \"footnote\",\n from: `${String(note.length)} chars`,\n to: `${String(SECTION_TEXT_MAX_CHARS)} chars`,\n reason: \"Footnote context text truncated to 3000 chars\",\n path: \"footnote\",\n });\n elements.push({ type: \"mrkdwn\", text: note.slice(0, SECTION_TEXT_MAX_CHARS) });\n } else {\n elements.push({ type: \"mrkdwn\", text: note });\n }\n }\n for (let i = 0; i < elements.length; i += CONTEXT_ELEMENTS_MAX) {\n const chunk = elements.slice(i, i + CONTEXT_ELEMENTS_MAX);\n blocks.push({ type: \"context\", elements: chunk });\n }\n return blocks;\n}\n\ntype ContextBlockElements = Array<{ type: \"mrkdwn\"; text: string }>;\n\nfunction claimForBlock(block: Block): BudgetClaim {\n switch (block.type) {\n case \"data_visualization\":\n return { blocks: 1, chart: true };\n case \"markdown\":\n return { blocks: 1, markdownChars: block.text.length };\n case \"table\":\n return { blocks: 1, tableChars: countEmittedTableChars(block) };\n case \"data_table\":\n return { blocks: 1, dataTableChars: countEmittedTableChars(block) };\n case \"rich_text\":\n case \"header\":\n case \"divider\":\n case \"section\":\n case \"image\":\n case \"context\":\n case \"container\":\n return { blocks: 1 };\n default:\n return assertNever(block);\n }\n}\n\nfunction countEmittedTableChars(block: TableBlock | DataTableBlock): number {\n let total = 0;\n for (const row of block.rows) {\n for (const cell of row) {\n total += cellTextLength(cell);\n }\n }\n return total;\n}\n\nfunction cellTextLength(cell: TableCell): number {\n if (cell.type === \"raw_text\" || cell.type === \"raw_number\") {\n return cell.text.length;\n }\n // rich_text cell — approximate via JSON length of text nodes\n return JSON.stringify(cell).length;\n}\n\nfunction coalesceRichText(blocks: ReadonlyArray<Block>): Block[] {\n const out: Block[] = [];\n let pending: RichTextElement[] | undefined;\n\n const flushPending = (): void => {\n if (pending === undefined || pending.length === 0) {\n pending = undefined;\n return;\n }\n const block: RichTextBlock = { type: \"rich_text\", elements: pending };\n out.push(block);\n pending = undefined;\n };\n\n for (const block of blocks) {\n if (block.type === \"rich_text\" && isCoalescable(block)) {\n if (pending === undefined) {\n pending = [...block.elements];\n } else {\n pending.push(...block.elements);\n }\n } else {\n flushPending();\n out.push(block);\n }\n }\n flushPending();\n return out;\n}\n\nfunction isCoalescable(block: RichTextBlock): boolean {\n // Only coalesce pure section flow; leave lists/quotes/preformatted alone as unit\n return block.elements.every((e) => e.type === \"rich_text_section\");\n}\n","import type { Block, RichTextElement, RichTextInline } from \"../blocks/types.js\";\nimport type { PlainTextRenderer } from \"../types.js\";\n\n/**\n * Deterministic plain-text renderer for notifications / screen readers.\n */\nexport class DeterministicPlainTextRenderer implements PlainTextRenderer {\n render(markdown: string): string {\n const parts: string[] = [];\n // Lightweight strip — full fidelity comes from renderFromBlocks after convert.\n let i = 0;\n const src = markdown;\n while (i < src.length) {\n if (src.startsWith(\"```\", i)) {\n const end = src.indexOf(\"```\", i + 3);\n if (end === -1) {\n parts.push(src.slice(i + 3));\n break;\n }\n parts.push(src.slice(i + 3, end).trim());\n i = end + 3;\n continue;\n }\n parts.push(src[i] ?? \"\");\n i += 1;\n }\n const raw = parts\n .join(\"\")\n .replace(/!\\[[^\\]]{0,200}\\]\\([^)]{0,3000}\\)/g, \" \")\n .replace(/\\[([^\\]]{0,200})\\]\\([^)]{0,3000}\\)/g, \"$1\")\n .replace(/[#>*_`~]/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n return raw.length > 0 ? raw : \" \";\n }\n\n renderFromBlocks(blocks: ReadonlyArray<Block>): string {\n const parts: string[] = [];\n for (const block of blocks) {\n switch (block.type) {\n case \"header\":\n parts.push(block.text.text);\n break;\n case \"section\":\n if (block.text !== undefined) {\n parts.push(stripMrkdwn(block.text.text));\n }\n break;\n case \"rich_text\":\n parts.push(richTextToPlain(block.elements));\n break;\n case \"markdown\":\n parts.push(this.render(block.text));\n break;\n case \"divider\":\n parts.push(\"---\");\n break;\n case \"image\":\n parts.push(block.alt_text);\n break;\n case \"context\":\n for (const el of block.elements) {\n if (el.type === \"mrkdwn\" || el.type === \"plain_text\") {\n parts.push(stripMrkdwn(el.text));\n }\n }\n break;\n case \"table\":\n case \"data_table\":\n parts.push(tableToPlain(block.rows));\n break;\n case \"data_visualization\":\n parts.push(block.title);\n break;\n case \"container\":\n if (block.title !== undefined) {\n parts.push(block.title.text);\n }\n parts.push(this.renderFromBlocks(block.child_blocks));\n break;\n default:\n break;\n }\n }\n const text = parts\n .map((p) => p.trim())\n .filter((p) => p.length > 0)\n .join(\"\\n\")\n .trim();\n return text.length > 0 ? text : \" \";\n }\n}\n\nfunction stripMrkdwn(text: string): string {\n return text\n .replace(/<([^|>]{1,3000})\\|([^>]{0,500})>/g, \"$2\")\n .replace(/<([^>]{1,3000})>/g, \"$1\")\n .replace(/[*_~`]/g, \"\");\n}\n\nfunction richTextToPlain(elements: ReadonlyArray<RichTextElement>): string {\n const parts: string[] = [];\n for (const el of elements) {\n switch (el.type) {\n case \"rich_text_section\":\n case \"rich_text_quote\":\n parts.push(inlinesToPlain(el.elements));\n break;\n case \"rich_text_list\":\n for (const item of el.elements) {\n parts.push(`• ${inlinesToPlain(item.elements)}`);\n }\n break;\n case \"rich_text_preformatted\":\n parts.push(inlinesToPlain(el.elements));\n break;\n default:\n break;\n }\n }\n return parts.join(\"\\n\");\n}\n\nfunction inlinesToPlain(elements: ReadonlyArray<RichTextInline>): string {\n const parts: string[] = [];\n for (const el of elements) {\n switch (el.type) {\n case \"text\":\n parts.push(el.text);\n break;\n case \"link\":\n parts.push(el.text ?? el.url);\n break;\n case \"emoji\":\n parts.push(`:${el.name}:`);\n break;\n case \"user\":\n parts.push(`@${el.user_id}`);\n break;\n case \"channel\":\n parts.push(`#${el.channel_id}`);\n break;\n case \"usergroup\":\n parts.push(`@${el.usergroup_id}`);\n break;\n case \"broadcast\":\n parts.push(`@${el.range}`);\n break;\n case \"date\":\n parts.push(el.fallback ?? el.format);\n break;\n default:\n break;\n }\n }\n return parts.join(\"\");\n}\n\nfunction tableToPlain(rows: ReadonlyArray<ReadonlyArray<unknown>>): string {\n const lines: string[] = [];\n for (const row of rows) {\n const cells = row.map((cell) => cellPlain(cell));\n lines.push(cells.join(\" | \"));\n }\n return lines.join(\"\\n\");\n}\n\nfunction cellPlain(cell: unknown): string {\n if (typeof cell !== \"object\" || cell === null) {\n return \"\";\n }\n const c = cell as { type?: string; text?: string; value?: number; elements?: unknown };\n if (c.type === \"raw_text\" && typeof c.text === \"string\") {\n return c.text;\n }\n if (c.type === \"raw_number\") {\n return typeof c.text === \"string\" ? c.text : String(c.value ?? \"\");\n }\n if (c.type === \"rich_text\" && Array.isArray(c.elements)) {\n return richTextToPlain(c.elements as RichTextElement[]);\n }\n return \"\";\n}\n","import type { Root } from \"mdast\";\nimport remarkFrontmatter from \"remark-frontmatter\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport remarkParse from \"remark-parse\";\nimport { unified } from \"unified\";\n\nimport type { MarkdownParser, ParserOptions } from \"../types.js\";\n\n/**\n * Default markdown parser wrapping the unified/remark pipeline.\n */\nexport class RemarkMarkdownParser implements MarkdownParser {\n async parse(markdown: string, options: ParserOptions): Promise<Root> {\n const processor = unified().use(remarkParse).use(remarkGfm);\n if (options.enableFrontmatter) {\n processor.use(remarkFrontmatter, [\"yaml\", \"toml\"]);\n }\n if (options.enableMath) {\n processor.use(remarkMath);\n }\n return processor.parse(markdown) as Root;\n }\n}\n","import type { MermaidChartParser, MermaidParseResult, MermaidPieAst } from \"../types.js\";\n\nconst COMMENT_RE = /%%[^\\n]{0,500}/g;\nconst TITLE_RE = /^\\s*pie\\b(?:\\s+showData)?(?:\\s+title\\s+(.+))?\\s*$/i;\nconst ENTRY_RE = /^\\s*\"([^\"]{1,200})\"\\s*:\\s*(-?\\d+(?:\\.\\d+)?)\\s*$/;\n\n/**\n * Parses mermaid `pie` diagram grammar into a structured AST.\n */\nexport class MermaidPieParser implements MermaidChartParser {\n parse(source: string): MermaidParseResult {\n const cleaned = source.replace(COMMENT_RE, \"\");\n const lines = cleaned.split(/\\r?\\n/);\n let title: string | undefined;\n const segments: Array<{ label: string; value: number }> = [];\n let seenHeader = false;\n\n for (const raw of lines) {\n const line = raw.trim();\n if (line.length === 0) {\n continue;\n }\n if (!seenHeader) {\n if (!/^\\s*pie\\b/i.test(line)) {\n return { ok: false, reason: \"Not a pie diagram\" };\n }\n seenHeader = true;\n const tm = TITLE_RE.exec(line);\n const titlePart = tm?.[1]?.trim();\n if (titlePart !== undefined && titlePart.length > 0) {\n title = titlePart;\n }\n continue;\n }\n\n // Optional standalone title line: title Foo\n const titleLine = /^\\s*title\\s+(.+)\\s*$/i.exec(line);\n if (titleLine !== null && title === undefined) {\n title = (titleLine[1] ?? \"\").trim();\n continue;\n }\n\n const em = ENTRY_RE.exec(line);\n if (em === null) {\n return { ok: false, reason: `Invalid pie entry: ${line}` };\n }\n const label = em[1] ?? \"\";\n const value = Number(em[2]);\n if (!(value > 0)) {\n return { ok: false, reason: `Pie values must be > 0 (got ${String(value)})` };\n }\n segments.push({ label, value });\n }\n\n if (!seenHeader) {\n return { ok: false, reason: \"Missing pie header\" };\n }\n if (segments.length === 0) {\n return { ok: false, reason: \"Pie has no segments\" };\n }\n\n const ast: MermaidPieAst = {\n kind: \"pie\",\n title,\n segments,\n };\n return { ok: true, value: ast };\n }\n}\n","import { CHART_POINTS_MAX } from \"../constants.js\";\nimport type { MermaidChartParser, MermaidParseResult, MermaidXyChartAst } from \"../types.js\";\n\nconst COMMENT_RE = /%%[^\\n]{0,500}/g;\nconst NUM = String.raw`-?\\d+(?:\\.\\d+)?`;\nconst NUM_LIST_RE = new RegExp(String.raw`\\[\\s*((?:${NUM}\\s*,\\s*)*${NUM})\\s*\\]`);\nconst STR_LIST_RE = /\\[\\s*((?:\"[^\"]{0,200}\"\\s*,\\s*)*\"[^\"]{0,200}\")\\s*\\]/;\n\n/**\n * Parses mermaid `xychart-beta` grammar (categories, bar/line series).\n */\nexport class MermaidXyChartParser implements MermaidChartParser {\n parse(source: string): MermaidParseResult {\n const cleaned = source.replace(COMMENT_RE, \"\");\n const lines = cleaned.split(/\\r?\\n/);\n let title: string | undefined;\n let categories: string[] = [];\n let xLabel: string | undefined;\n let yLabel: string | undefined;\n const bars: number[][] = [];\n const linesSeries: number[][] = [];\n let seenHeader = false;\n\n for (const raw of lines) {\n const line = raw.trim();\n if (line.length === 0) {\n continue;\n }\n if (!seenHeader) {\n if (!/^\\s*xychart-beta\\b/i.test(line)) {\n return { ok: false, reason: \"Not an xychart-beta diagram\" };\n }\n seenHeader = true;\n continue;\n }\n\n const titleM =\n /^\\s*title\\s+\"([^\"]{0,200})\"\\s*$/i.exec(line) ?? /^\\s*title\\s+(.+)\\s*$/i.exec(line);\n if (titleM !== null) {\n title = (titleM[1] ?? \"\").trim();\n continue;\n }\n\n if (/^\\s*x-axis\\b/i.test(line)) {\n const strList = STR_LIST_RE.exec(line);\n if (strList !== null) {\n categories = parseStringList(strList[1] ?? \"\");\n const labelM = /^\\s*x-axis\\s+\"([^\"]{0,200})\"\\s+/i.exec(line);\n if (labelM !== null) {\n xLabel = labelM[1];\n }\n continue;\n }\n const rangeM = new RegExp(\n String.raw`x-axis\\s+(?:\"([^\"]{0,200})\"\\s+)?(${NUM})\\s*-->\\s*(${NUM})`,\n \"i\",\n ).exec(line);\n if (rangeM !== null) {\n xLabel = rangeM[1];\n const min = Number(rangeM[2]);\n const max = Number(rangeM[3]);\n if (!Number.isFinite(min) || !Number.isFinite(max) || max < min) {\n return { ok: false, reason: `Invalid x-axis range: ${line}` };\n }\n const span = max - min + 1;\n if (span > CHART_POINTS_MAX) {\n return {\n ok: false,\n reason: `x-axis range has ${String(span)} points (max ${String(CHART_POINTS_MAX)})`,\n };\n }\n categories = [];\n for (let i = min; i <= max; i += 1) {\n categories.push(String(i));\n }\n continue;\n }\n return { ok: false, reason: `Invalid x-axis: ${line}` };\n }\n\n if (/^\\s*y-axis\\b/i.test(line)) {\n const ym = new RegExp(\n String.raw`y-axis\\s+(?:\"([^\"]{0,200})\"\\s+)?(?:(${NUM})\\s*-->\\s*(${NUM}))?`,\n \"i\",\n ).exec(line);\n if (ym !== null) {\n yLabel = ym[1];\n continue;\n }\n return { ok: false, reason: `Invalid y-axis: ${line}` };\n }\n\n if (/^\\s*bar\\b/i.test(line)) {\n const nums = NUM_LIST_RE.exec(line);\n if (nums === null) {\n return { ok: false, reason: `Invalid bar series: ${line}` };\n }\n bars.push(parseNumberList(nums[1] ?? \"\"));\n continue;\n }\n\n if (/^\\s*line\\b/i.test(line)) {\n const nums = NUM_LIST_RE.exec(line);\n if (nums === null) {\n return { ok: false, reason: `Invalid line series: ${line}` };\n }\n linesSeries.push(parseNumberList(nums[1] ?? \"\"));\n continue;\n }\n\n return { ok: false, reason: `Unrecognized xychart line: ${line}` };\n }\n\n if (!seenHeader) {\n return { ok: false, reason: \"Missing xychart-beta header\" };\n }\n if (categories.length === 0) {\n return { ok: false, reason: \"xychart missing categories\" };\n }\n if (bars.length === 0 && linesSeries.length === 0) {\n return { ok: false, reason: \"xychart has no series\" };\n }\n\n const ast: MermaidXyChartAst = {\n kind: \"xychart-beta\",\n title,\n categories,\n xLabel,\n yLabel,\n bars,\n lines: linesSeries,\n };\n return { ok: true, value: ast };\n }\n}\n\nfunction parseStringList(inner: string): string[] {\n const out: string[] = [];\n const re = /\"([^\"]{0,200})\"/g;\n let m: RegExpExecArray | null = re.exec(inner);\n while (m !== null) {\n out.push(m[1] ?? \"\");\n m = re.exec(inner);\n }\n return out;\n}\n\nfunction parseNumberList(inner: string): number[] {\n return inner\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0)\n .map((s) => Number(s));\n}\n","import type { Definition, FootnoteDefinition, Heading, Root, RootContent } from \"mdast\";\nimport { toString } from \"mdast-util-to-string\";\n\nimport type { Block } from \"../blocks/types.js\";\nimport { ConversionContext, type ResolvedConfig } from \"../budget/conversion-context.js\";\nimport { RecordingDegradationCollector } from \"../budget/recording-degradation-collector.js\";\nimport { StandardBudgetLedger } from \"../budget/standard-budget-ledger.js\";\nimport { buildFootnoteBlocks, type MessageAssembler } from \"../assemble/message-assembler.js\";\nimport type { AdapterRegistry } from \"../registry/adapter-registry.js\";\nimport {\n MAX_BLOCKS_PER_MESSAGE,\n MESSAGE_TEXT_SAFETY_MAX_CHARS,\n SECTION_TEXT_MAX_CHARS,\n} from \"../constants.js\";\nimport type {\n ConversionMessagesResult,\n ConversionResult,\n ConvertOptions,\n DegradationCollector,\n MarkdownParser,\n PlainTextRenderer,\n} from \"../types.js\";\nimport { ConversionStrategy, OverflowMode } from \"../types.js\";\n\nimport { resolveConfig } from \"./resolve-config.js\";\n\nexport interface SlackMarkConverterDeps {\n readonly parser: MarkdownParser;\n readonly registry: AdapterRegistry;\n readonly assembler: MessageAssembler;\n readonly plainText: PlainTextRenderer;\n readonly defaultOptions: ConvertOptions;\n}\n\n/**\n * Primary public API class — stateless across concurrent convert() calls.\n */\nexport class SlackMarkConverter {\n private readonly parser: MarkdownParser;\n private readonly registry: AdapterRegistry;\n private readonly assembler: MessageAssembler;\n private readonly plainText: PlainTextRenderer;\n private readonly defaultOptions: ConvertOptions;\n\n constructor(deps: SlackMarkConverterDeps) {\n this.parser = deps.parser;\n this.registry = deps.registry;\n this.assembler = deps.assembler;\n this.plainText = deps.plainText;\n this.defaultOptions = deps.defaultOptions;\n }\n\n /**\n * Convert markdown to a single message. Always uses overflow=degrade so content\n * is truncated with degradations rather than silently dropping split messages.\n * Callers that need multi-message output should use {@link convertToMessages}.\n */\n async convert(markdown: string, options?: ConvertOptions): Promise<ConversionResult> {\n const multi = await this.convertToMessages(markdown, {\n ...options,\n overflow: OverflowMode.Degrade,\n });\n const first = multi.messages[0] ?? { blocks: [], text: \" \" };\n return {\n blocks: first.blocks,\n text: first.text,\n degradations: multi.degradations,\n };\n }\n\n /**\n * Convert markdown into one or more messages at semantic boundaries.\n */\n async convertToMessages(\n markdown: string,\n options?: ConvertOptions,\n ): Promise<ConversionMessagesResult> {\n const config = resolveConfig(this.defaultOptions, options);\n const degradations = new RecordingDegradationCollector();\n // When splitting, lift the block + chart caps during emission; the assembler\n // re-applies per-message budgets. Table/markdown/total char caps stay on so\n // oversized single blocks cannot be emitted.\n const splitting = config.overflow === OverflowMode.Split;\n const budget = new StandardBudgetLedger(\n splitting ? Number.MAX_SAFE_INTEGER : MAX_BLOCKS_PER_MESSAGE,\n { enforceChartCap: !splitting },\n );\n\n try {\n if (config.strategy === ConversionStrategy.MarkdownBlock) {\n return this.emitAsMarkdownBlocks(markdown, config, degradations, budget);\n }\n\n const tree = await this.parser.parse(markdown, {\n enableMath: config.enableMath,\n enableFrontmatter: config.enableFrontmatter,\n });\n\n const { definitions, footnotes, footnoteOrder } = collectRefs(tree);\n let precedingHeading: string | undefined;\n const emitted: Block[] = [];\n\n let index = 0;\n for (const node of tree.children) {\n // Message boundaries are chosen after emission. In split mode, validate\n // each semantic unit against an empty message, then let the assembler\n // enforce cumulative limits for the messages it creates.\n if (splitting) {\n budget.resetForNewMessage();\n }\n const ctx = new ConversionContext({\n config,\n budget,\n degradations,\n definitions,\n footnotes,\n footnoteOrder,\n precedingHeading,\n path: `root[${String(index)}]`,\n });\n\n if (node.type === \"heading\") {\n precedingHeading = toString(node as Heading);\n }\n\n const blocks = await this.registry.emit(node as RootContent, ctx);\n emitted.push(...blocks);\n index += 1;\n }\n\n const footnoteEntries = footnoteOrder.map((id, i) => {\n const def = footnotes.get(id);\n return {\n n: i + 1,\n text: def !== undefined ? toString(def).trim() : id,\n };\n });\n const footnoteBlocks = buildFootnoteBlocks(footnoteEntries, degradations);\n\n const assembleCtx = new ConversionContext({\n config,\n budget,\n degradations,\n definitions,\n footnotes,\n footnoteOrder,\n precedingHeading,\n path: \"assemble\",\n });\n const messages = this.assembler.assemble(emitted, assembleCtx, footnoteBlocks);\n\n return {\n messages,\n degradations: degradations.all(),\n };\n } catch (err) {\n // User markdown must never throw — degrade to a single section.\n degradations.add({\n nodeType: \"document\",\n from: \"convert\",\n to: \"section\",\n reason: err instanceof Error ? err.message : \"Unknown conversion error\",\n path: \"root\",\n });\n const text = safeNotificationText(this.plainText, markdown, degradations);\n return {\n messages: [\n {\n blocks: [\n {\n type: \"section\",\n text: { type: \"mrkdwn\", text: clampSectionFallback(text, degradations) },\n },\n ],\n text,\n },\n ],\n degradations: degradations.all(),\n };\n }\n }\n\n private emitAsMarkdownBlocks(\n markdown: string,\n config: ResolvedConfig,\n degradations: RecordingDegradationCollector,\n budget: StandardBudgetLedger,\n ): ConversionMessagesResult {\n const chunks = chunkMarkdown(markdown, 12_000);\n let blocks: Block[] = [];\n if (!config.capabilities.markdownBlock) {\n degradations.add({\n nodeType: \"document\",\n from: \"markdown-block\",\n to: \"section\",\n reason: \"markdownBlock capability off; emitting section fallback\",\n path: \"root\",\n });\n const text = safeNotificationText(this.plainText, markdown, degradations);\n blocks = [\n {\n type: \"section\",\n text: { type: \"mrkdwn\", text: clampSectionFallback(text, degradations) },\n },\n ];\n } else {\n for (const chunk of chunks) {\n if (config.overflow === OverflowMode.Split) {\n budget.resetForNewMessage();\n }\n if (!budget.tryReserveClaim({ blocks: 1, markdownChars: chunk.length })) {\n degradations.add({\n nodeType: \"document\",\n from: \"markdown-block\",\n to: \"truncated\",\n reason: \"markdown 12k cumulative budget exhausted\",\n path: \"root\",\n });\n break;\n }\n blocks.push({ type: \"markdown\", text: chunk });\n }\n }\n\n const assembleCtx = new ConversionContext({\n config,\n budget,\n degradations,\n definitions: new Map(),\n footnotes: new Map(),\n footnoteOrder: [],\n precedingHeading: undefined,\n path: \"assemble\",\n });\n // Markdown strategy has no GFM footnote pass; assembler still applies overflow split/degrade.\n const messages = this.assembler.assemble(blocks, assembleCtx, []);\n return {\n messages,\n degradations: degradations.all(),\n };\n }\n}\n\nfunction safeNotificationText(\n plainText: PlainTextRenderer,\n markdown: string,\n degradations: DegradationCollector,\n): string {\n const raw = plainText.render(markdown);\n if (raw.length <= MESSAGE_TEXT_SAFETY_MAX_CHARS) {\n return raw;\n }\n degradations.add({\n nodeType: \"message\",\n from: `${String(raw.length)} text chars`,\n to: `${String(MESSAGE_TEXT_SAFETY_MAX_CHARS)} text chars`,\n reason: \"Notification text truncated to 40k safety limit\",\n path: \"root\",\n });\n return raw.slice(0, MESSAGE_TEXT_SAFETY_MAX_CHARS);\n}\n\nfunction clampSectionFallback(text: string, degradations: DegradationCollector): string {\n if (text.length <= SECTION_TEXT_MAX_CHARS) {\n return text;\n }\n degradations.add({\n nodeType: \"section\",\n from: `${String(text.length)} chars`,\n to: `${String(SECTION_TEXT_MAX_CHARS)} chars`,\n reason: \"Section text truncated to 3000 chars\",\n path: \"root\",\n });\n return text.slice(0, SECTION_TEXT_MAX_CHARS);\n}\n\nfunction collectRefs(tree: Root): {\n definitions: Map<string, Definition>;\n footnotes: Map<string, FootnoteDefinition>;\n footnoteOrder: string[];\n} {\n const definitions = new Map<string, Definition>();\n const footnotes = new Map<string, FootnoteDefinition>();\n for (const node of tree.children) {\n if (node.type === \"definition\") {\n definitions.set(node.identifier.toLowerCase(), node);\n }\n if (node.type === \"footnoteDefinition\") {\n footnotes.set(node.identifier, node);\n }\n }\n // Number footnotes by first reference in document order (not definition order).\n const footnoteOrder: string[] = [];\n const seen = new Set<string>();\n walkFootnoteReferences(tree, (id) => {\n if (!seen.has(id)) {\n seen.add(id);\n footnoteOrder.push(id);\n }\n });\n return { definitions, footnotes, footnoteOrder };\n}\n\nfunction walkFootnoteReferences(node: unknown, onRef: (id: string) => void): void {\n if (node === null || typeof node !== \"object\") {\n return;\n }\n const record = node as {\n readonly type?: string;\n readonly identifier?: string;\n readonly children?: ReadonlyArray<unknown>;\n };\n // Definitions are not part of reading-order numbering.\n if (record.type === \"footnoteDefinition\") {\n return;\n }\n if (record.type === \"footnoteReference\" && typeof record.identifier === \"string\") {\n onRef(record.identifier);\n return;\n }\n if (record.children !== undefined) {\n for (const child of record.children) {\n walkFootnoteReferences(child, onRef);\n }\n }\n}\n\nfunction chunkMarkdown(text: string, max: number): string[] {\n if (text.length <= max) {\n return [text.length > 0 ? text : \" \"];\n }\n const out: string[] = [];\n for (let i = 0; i < text.length; i += max) {\n out.push(text.slice(i, i + max));\n }\n return out;\n}\n","/**\n * Programmer/configuration error thrown only from the composition root.\n */\nexport class ConfigurationError extends Error {\n override readonly name: string;\n\n constructor(message: string, options?: { readonly cause?: unknown }) {\n super(message, options?.cause !== undefined ? { cause: options.cause } : undefined);\n this.name = \"ConfigurationError\";\n }\n}\n","import { resolveCapabilities } from \"../capabilities/capabilities.js\";\nimport type { ResolvedConfig } from \"../budget/conversion-context.js\";\nimport { ConfigurationError } from \"../errors.js\";\nimport {\n ConversionStrategy,\n OverflowMode,\n type ConvertOptions,\n type ImageRenderer,\n} from \"../types.js\";\n\n/**\n * Merge defaults + per-call options into a frozen ResolvedConfig.\n */\nexport function resolveConfig(\n defaults: ConvertOptions,\n overrides: ConvertOptions | undefined,\n): ResolvedConfig {\n const merged: ConvertOptions = {\n ...defaults,\n ...overrides,\n capabilityOverrides: {\n ...defaults.capabilityOverrides,\n ...overrides?.capabilityOverrides,\n },\n renderers: overrides?.renderers ?? defaults.renderers,\n uploader: overrides?.uploader ?? defaults.uploader,\n mentionResolvers: overrides?.mentionResolvers ?? defaults.mentionResolvers,\n };\n\n const capabilities = resolveCapabilities(merged.capabilities, merged.capabilityOverrides);\n\n const overflow = merged.overflow ?? OverflowMode.Degrade;\n if (overflow !== OverflowMode.Degrade && overflow !== OverflowMode.Split) {\n throw new ConfigurationError(\n `Invalid overflow mode ${JSON.stringify(overflow)}; use \"degrade\" or \"split\".`,\n );\n }\n\n const strategy = merged.strategy ?? ConversionStrategy.RichTextFirst;\n if (\n strategy !== ConversionStrategy.RichTextFirst &&\n strategy !== ConversionStrategy.MarkdownBlock\n ) {\n throw new ConfigurationError(\n `Invalid strategy ${JSON.stringify(strategy)}; use \"rich-text-first\" or \"markdown-block\".`,\n );\n }\n\n const renderers: ReadonlyArray<ImageRenderer> = merged.renderers ?? [];\n\n return Object.freeze({\n capabilities,\n overflow,\n strategy,\n renderers,\n uploader: merged.uploader,\n enableMath: merged.enableMath === true,\n enableFrontmatter: merged.enableFrontmatter === true,\n mentionResolvers: merged.mentionResolvers,\n });\n}\n","import type { Blockquote, RootContent } from \"mdast\";\nimport { toString } from \"mdast-util-to-string\";\n\nimport type { Block, RichTextBlock, RichTextInline } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\n\nimport { emitPhrasing } from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\nconst ADMONITION_RE = /^\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\\s*/i;\n\nconst ADMONITION_META = {\n NOTE: { emoji: \"📝\", title: \"Note\" },\n TIP: { emoji: \"💡\", title: \"Tip\" },\n IMPORTANT: { emoji: \"❗\", title: \"Important\" },\n WARNING: { emoji: \"⚠️\", title: \"Warning\" },\n CAUTION: { emoji: \"🚫\", title: \"Caution\" },\n} as const;\n\n/**\n * Blockquotes → rich_text_quote; GitHub admonitions get styled first line.\n */\nexport class BlockquoteAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"blockquote\";\n }\n\n plan(node: RootContent, _ctx: ConversionContext): ReadonlyArray<Candidate> {\n const quote = node as Blockquote;\n return [\n {\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n const elements = flattenQuote(quote, ctx);\n const block: RichTextBlock = {\n type: \"rich_text\",\n elements: [{ type: \"rich_text_quote\", elements, border: 0 }],\n };\n return [block];\n },\n },\n ];\n }\n}\n\nfunction flattenQuote(quote: Blockquote, ctx: ConversionContext): RichTextInline[] {\n const parts: RichTextInline[] = [];\n let first = true;\n\n for (const child of quote.children) {\n if (child.type === \"paragraph\") {\n let children = child.children;\n if (first && children[0]?.type === \"text\") {\n const textNode = children[0];\n const m = ADMONITION_RE.exec(textNode.value);\n if (m !== null) {\n const kind = (m[1] ?? \"NOTE\").toUpperCase() as keyof typeof ADMONITION_META;\n const meta = ADMONITION_META[kind];\n parts.push({\n type: \"text\",\n text: `${meta.emoji}${meta.title}\\n`,\n style: { bold: true },\n });\n const rest = textNode.value.slice(m[0].length);\n children = [\n ...(rest.length > 0 ? [{ ...textNode, value: rest }] : []),\n ...children.slice(1),\n ];\n }\n }\n first = false;\n const inline = emitPhrasing(children, ctx);\n if (parts.length > 0 && inline.elements.length > 0) {\n parts.push({ type: \"text\", text: \"\\n\" });\n }\n parts.push(...inline.elements);\n } else if (child.type === \"list\") {\n ctx.degradations.add({\n nodeType: \"blockquote\",\n from: \"list\",\n to: \"bullet_lines\",\n reason: \"Nested list inside blockquote flattened\",\n path: ctx.path,\n });\n if (parts.length > 0) parts.push({ type: \"text\", text: \"\\n\" });\n for (const item of child.children) {\n parts.push({ type: \"text\", text: `• ${toString(item)}\\n` });\n }\n } else if (child.type === \"code\") {\n ctx.degradations.add({\n nodeType: \"blockquote\",\n from: \"code\",\n to: \"text\",\n reason: \"Nested code inside blockquote flattened to text\",\n path: ctx.path,\n });\n if (parts.length > 0) parts.push({ type: \"text\", text: \"\\n\" });\n parts.push({ type: \"text\", text: child.value, style: { code: true } });\n } else {\n ctx.degradations.add({\n nodeType: \"blockquote\",\n from: child.type,\n to: \"text\",\n reason: \"Nested block inside blockquote flattened\",\n path: ctx.path,\n });\n if (parts.length > 0) parts.push({ type: \"text\", text: \"\\n\" });\n parts.push({ type: \"text\", text: toString(child) });\n }\n }\n\n return parts.length > 0 ? parts : [{ type: \"text\", text: \" \" }];\n}\n","import type { Emphasis, Link, LinkReference, PhrasingContent, Strong, Text } from \"mdast\";\nimport { toString } from \"mdast-util-to-string\";\n\nimport type {\n ImageBlock,\n RichTextBlock,\n RichTextEmoji,\n RichTextInline,\n RichTextLink,\n RichTextStyle,\n RichTextText,\n} from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport {\n ELLIPSIS,\n IMAGE_ALT_MAX_CHARS,\n IMAGE_URL_MAX_CHARS,\n SECTION_TEXT_MAX_CHARS,\n} from \"../constants.js\";\n\nconst EMOJI_SHORTCODE_RE = /:([a-z0-9_+-]{1,64}):/g;\n\n/** Small gemoji↔Slack overlap set for shortcode → emoji element. */\nconst KNOWN_SLACK_EMOJI = new Set<string>([\n \"smile\",\n \"grinning\",\n \"wink\",\n \"blush\",\n \"wave\",\n \"thumbsup\",\n \"thumbsdown\",\n \"tada\",\n \"rocket\",\n \"fire\",\n \"heart\",\n \"eyes\",\n \"thinking_face\",\n \"sweat_smile\",\n \"joy\",\n \"sob\",\n \"clap\",\n \"100\",\n \"white_check_mark\",\n \"x\",\n \"warning\",\n \"bulb\",\n \"memo\",\n \"mag\",\n \"link\",\n \"gear\",\n \"bug\",\n \"sparkles\",\n \"+1\",\n \"-1\",\n \"ok_hand\",\n \"pray\",\n \"star\",\n \"zap\",\n \"check\",\n \"heavy_check_mark\",\n]);\n\nconst HTTP_URL_RE = /^(https?:|mailto:)/i;\nconst IMAGE_EXT_RE = /\\.(png|jpe?g|gif)(?:\\?|#|$)/i;\n\nexport type HoistedImage = {\n readonly url: string;\n readonly alt: string;\n readonly title: string | undefined;\n};\n\nexport interface InlineEmitResult {\n readonly elements: ReadonlyArray<RichTextInline>;\n readonly hoistedImages: ReadonlyArray<HoistedImage>;\n}\n\n/**\n * Convert mdast phrasing content into rich_text inline elements.\n */\nexport function emitPhrasing(\n nodes: ReadonlyArray<PhrasingContent>,\n ctx: ConversionContext,\n baseStyle: RichTextStyle = {},\n): InlineEmitResult {\n const elements: RichTextInline[] = [];\n const hoistedImages: HoistedImage[] = [];\n // Mutable working copy: Slack labeled links with spaces (<https://u|two words>)\n // parse as text(\"…<\") + autolink + text(\"words>…\") and are reassembled in place.\n const work: PhrasingContent[] = [...nodes];\n // remark splits <a href>label</a> into html/text/html siblings — track across nodes.\n let pendingAnchor: { href: string; style: RichTextStyle; textParts: string[] } | undefined;\n\n const flushPendingAnchor = (): void => {\n if (pendingAnchor === undefined) {\n return;\n }\n const label = pendingAnchor.textParts.join(\"\");\n elements.push({\n type: \"link\",\n url: pendingAnchor.href,\n text: label.length > 0 ? label : pendingAnchor.href,\n style: styleOrUndefined(pendingAnchor.style),\n });\n pendingAnchor = undefined;\n };\n\n for (let i = 0; i < work.length; i += 1) {\n const node = work[i] as PhrasingContent;\n if (pendingAnchor === undefined) {\n const reassembled = reassembleSlackLabeledLink(work, i, baseStyle);\n if (reassembled !== undefined) {\n if (reassembled.leadingText.value.length > 0) {\n elements.push(...emitTextWithMentionsAndEmoji(reassembled.leadingText, baseStyle, ctx));\n }\n elements.push(reassembled.link);\n // Drop the lead+autolink+tail trio so the fractured autolink cannot be\n // emitLink'd again; keep only a non-empty trailing remnant for the next pass.\n if (reassembled.trailingText.value.length > 0) {\n work.splice(i, 3, reassembled.trailingText);\n } else {\n work.splice(i, 3);\n }\n i -= 1;\n continue;\n }\n }\n if (pendingAnchor !== undefined) {\n if (node.type === \"html\" && /^<\\/a\\s*>$/i.test(node.value.trim())) {\n flushPendingAnchor();\n continue;\n }\n if (node.type === \"text\") {\n pendingAnchor.textParts.push(node.value);\n continue;\n }\n if (node.type === \"break\") {\n pendingAnchor.textParts.push(\"\\n\");\n continue;\n }\n pendingAnchor.textParts.push(toString(node));\n continue;\n }\n\n if (node.type === \"html\") {\n const trimmed = node.value.trim();\n // remark parses <!here>, <!date^…>, <!subteam^…> as inline html — convert\n // them to their rich text elements instead of stripping (silent mangling).\n const entityInlines = slackEntityRichTextInlines(trimmed, baseStyle);\n if (entityInlines !== undefined) {\n elements.push(...entityInlines);\n continue;\n }\n const openOnly = /^<a\\b([^>]{0,500})>\\s*$/i.exec(trimmed);\n if (openOnly !== null) {\n const hrefMatch = /href\\s*=\\s*[\"']([^\"']{0,3000})[\"']/i.exec(openOnly[1] ?? \"\");\n const href = hrefMatch?.[1];\n if (href !== undefined && isValidLinkUrl(href)) {\n pendingAnchor = { href, style: baseStyle, textParts: [] };\n continue;\n }\n }\n elements.push(...emitInlineHtml(node.value, baseStyle, ctx));\n continue;\n }\n\n switch (node.type) {\n case \"text\": {\n elements.push(...emitTextWithMentionsAndEmoji(node as Text, baseStyle, ctx));\n break;\n }\n case \"strong\": {\n const inner = emitPhrasing((node as Strong).children, ctx, { ...baseStyle, bold: true });\n elements.push(...inner.elements);\n hoistedImages.push(...inner.hoistedImages);\n break;\n }\n case \"emphasis\": {\n const inner = emitPhrasing((node as Emphasis).children, ctx, {\n ...baseStyle,\n italic: true,\n });\n elements.push(...inner.elements);\n hoistedImages.push(...inner.hoistedImages);\n break;\n }\n case \"delete\": {\n const inner = emitPhrasing(node.children, ctx, { ...baseStyle, strike: true });\n elements.push(...inner.elements);\n hoistedImages.push(...inner.hoistedImages);\n break;\n }\n case \"inlineCode\": {\n const el: RichTextText = {\n type: \"text\",\n text: node.value,\n style: styleOrUndefined({ ...baseStyle, code: true }),\n };\n elements.push(el);\n break;\n }\n case \"break\": {\n elements.push({ type: \"text\", text: \"\\n\", style: styleOrUndefined(baseStyle) });\n break;\n }\n case \"link\": {\n elements.push(...emitLink(node, ctx, baseStyle));\n break;\n }\n case \"linkReference\": {\n elements.push(...emitLinkReference(node, ctx, baseStyle));\n break;\n }\n case \"image\": {\n const url = node.url;\n if (isPublicImageUrl(url)) {\n hoistedImages.push({\n url,\n alt: node.alt ?? \"\",\n title: node.title ?? undefined,\n });\n elements.push({\n type: \"link\",\n url,\n text: node.alt && node.alt.length > 0 ? node.alt : url,\n style: styleOrUndefined(baseStyle),\n });\n } else {\n ctx.degradations.add({\n nodeType: \"image\",\n from: \"image\",\n to: \"link\",\n reason: \"Image URL is not a public http(s) png/jpg/gif ≤3000 chars\",\n path: ctx.path,\n });\n elements.push({\n type: \"link\",\n url: url.length > 0 ? url : \"#\",\n text: node.alt && node.alt.length > 0 ? node.alt : url,\n style: styleOrUndefined(baseStyle),\n });\n }\n break;\n }\n case \"imageReference\": {\n const def = ctx.definitions.get(node.identifier.toLowerCase());\n if (def === undefined) {\n elements.push({\n type: \"text\",\n text: node.alt ?? node.identifier,\n style: styleOrUndefined(baseStyle),\n });\n break;\n }\n const asImage = emitPhrasing(\n [\n {\n type: \"image\",\n url: def.url,\n alt: node.alt ?? undefined,\n title: def.title ?? undefined,\n },\n ],\n ctx,\n baseStyle,\n );\n elements.push(...asImage.elements);\n hoistedImages.push(...asImage.hoistedImages);\n break;\n }\n case \"footnoteReference\": {\n const idx = ctx.footnoteOrder.indexOf(node.identifier);\n const n = idx >= 0 ? idx + 1 : 1;\n elements.push({\n type: \"text\",\n text: `[${String(n)}]`,\n style: styleOrUndefined(baseStyle),\n });\n break;\n }\n case \"inlineMath\": {\n elements.push({\n type: \"text\",\n text: node.value,\n style: styleOrUndefined({ ...baseStyle, code: true }),\n });\n ctx.degradations.add({\n nodeType: \"inlineMath\",\n from: \"inlineMath\",\n to: \"style.code\",\n reason: \"Math rendering not configured; emitted as inline code\",\n path: ctx.path,\n });\n break;\n }\n default: {\n const text = toString(node);\n if (text.length > 0) {\n elements.push({ type: \"text\", text, style: styleOrUndefined(baseStyle) });\n }\n break;\n }\n }\n }\n\n flushPendingAnchor();\n return { elements: coalesceText(elements), hoistedImages };\n}\n\n/**\n * Plain string from phrasing (strips styles) — for headers etc.\n */\nexport function phrasingToPlain(nodes: ReadonlyArray<PhrasingContent>): string {\n return toString({ type: \"paragraph\", children: nodes as PhrasingContent[] });\n}\n\nexport function isPublicImageUrl(url: string): boolean {\n if (url.length === 0 || url.length > IMAGE_URL_MAX_CHARS) {\n return false;\n }\n if (!HTTP_URL_RE.test(url)) {\n return false;\n }\n if (\n /^https?:\\/\\/(localhost|127\\.0\\.0\\.1|0\\.0\\.0\\.0|10\\.|192\\.168\\.|172\\.(1[6-9]|2\\d|3[01])\\.)/i.test(\n url,\n )\n ) {\n return false;\n }\n return IMAGE_EXT_RE.test(url);\n}\n\n/**\n * Count images that {@link emitPhrasing} would hoist into separate image blocks.\n */\nexport function countHoistableImages(\n nodes: ReadonlyArray<PhrasingContent>,\n ctx: ConversionContext,\n): number {\n let count = 0;\n for (const node of nodes) {\n switch (node.type) {\n case \"image\": {\n if (isPublicImageUrl(node.url)) {\n count += 1;\n }\n break;\n }\n case \"imageReference\": {\n const def = ctx.definitions.get(node.identifier.toLowerCase());\n if (def !== undefined && isPublicImageUrl(def.url)) {\n count += 1;\n }\n break;\n }\n case \"strong\":\n case \"emphasis\":\n case \"delete\": {\n count += countHoistableImages(node.children, ctx);\n break;\n }\n case \"text\":\n case \"inlineCode\":\n case \"break\":\n case \"link\":\n case \"linkReference\":\n case \"footnoteReference\":\n case \"html\":\n case \"inlineMath\":\n break;\n default: {\n // Other phrasing (e.g. extensions) cannot hoist images.\n break;\n }\n }\n }\n return count;\n}\n\nexport function truncateLabel(label: string, max: number): { text: string; truncated: boolean } {\n if (label.length <= max) {\n return { text: label, truncated: false };\n }\n return { text: `${label.slice(0, Math.max(0, max - 1))}${ELLIPSIS}`, truncated: true };\n}\n\n/** Standalone image block for an image hoisted out of phrasing content. */\nexport function hoistedImageBlock(h: HoistedImage, ctx: ConversionContext): ImageBlock {\n return {\n type: \"image\",\n image_url: h.url,\n alt_text: clampImageText(h.alt.length > 0 ? h.alt : \"image\", ctx, \"alt_text\"),\n title:\n h.title !== undefined && h.title.length > 0\n ? { type: \"plain_text\", text: clampImageText(h.title, ctx, \"title\") }\n : undefined,\n };\n}\n\n/** Clamp section mrkdwn to 3000 chars and record a degradation when clipped. */\nexport function clampSectionText(text: string, ctx: ConversionContext, nodeType: string): string {\n if (text.length <= SECTION_TEXT_MAX_CHARS) {\n return text;\n }\n ctx.degradations.add({\n nodeType,\n from: `${String(text.length)} chars`,\n to: `${String(SECTION_TEXT_MAX_CHARS)} chars`,\n reason: \"Section text truncated to 3000 chars\",\n path: ctx.path,\n });\n return text.slice(0, SECTION_TEXT_MAX_CHARS);\n}\n\n/** rich_text_preformatted block shared by code/math/mermaid/table fallbacks. */\nexport function preformattedRichText(text: string, language: string | undefined): RichTextBlock {\n return {\n type: \"rich_text\",\n elements: [\n {\n type: \"rich_text_preformatted\",\n elements: [{ type: \"text\", text: text.length > 0 ? text : \" \" }],\n border: 0,\n language,\n },\n ],\n };\n}\n\n/** Clamp image alt/title to Slack limits and record a degradation when clipped. */\nexport function clampImageText(\n value: string,\n ctx: ConversionContext,\n field: \"alt_text\" | \"title\",\n): string {\n if (value.length <= IMAGE_ALT_MAX_CHARS) {\n return value;\n }\n ctx.degradations.add({\n nodeType: \"image\",\n from: field,\n to: \"truncated\",\n reason: `Image ${field} truncated to ${String(IMAGE_ALT_MAX_CHARS)} chars`,\n path: ctx.path,\n });\n return value.slice(0, IMAGE_ALT_MAX_CHARS);\n}\n\nfunction styleOrUndefined(style: RichTextStyle): RichTextStyle | undefined {\n if (\n style.bold === true ||\n style.italic === true ||\n style.strike === true ||\n style.code === true ||\n style.underline === true\n ) {\n return style;\n }\n return undefined;\n}\n\n// Raw Slack mrkdwn entity tokens (<@U…>, <#C…>, <!here>, <!subteam^S…>, <!date^…>).\n// These carry Slack IDs directly, so they convert unconditionally — no resolvers needed.\n// Candidates are matched broadly, then parsed strictly; non-parsing tokens stay literal text.\nconst SLACK_ENTITY_CANDIDATE_RE =\n /<([@#!][^<>]{1,340}|(?:https?:|mailto:)[^<>|]{1,3000}\\|[^<>]{1,300})>/gi;\nconst SLACK_USER_RE = /^@([UW][A-Z0-9]{1,60})(?:\\|[^>]{0,300})?$/;\nconst SLACK_CHANNEL_RE = /^#([CDG][A-Z0-9]{1,60})(?:\\|[^>]{0,300})?$/;\nconst SLACK_USERGROUP_RE = /^!subteam\\^(S[A-Z0-9]{1,60})(?:\\|[^>]{0,300})?$/;\nconst SLACK_BROADCAST_RE = /^!(here|channel|everyone)(?:\\|[^>]{0,300})?$/;\nconst SLACK_DATE_RE =\n /^!date\\^(\\d{1,13})\\^([^^|]{1,300})(?:\\^([^^|]{1,3000}))?(?:\\|([^]{0,300}))?$/;\nconst SLACK_LINK_RE = /^((?:https?:|mailto:)[^|]{1,3000})\\|([^]{1,300})$/i;\n\n/** Parse the inside of one `<…>` token into a rich text element, or undefined if not Slack syntax. */\nfunction slackEntityElement(inner: string, style: RichTextStyle): RichTextInline | undefined {\n const labeledLink = SLACK_LINK_RE.exec(inner);\n if (labeledLink?.[1] !== undefined && labeledLink[2] !== undefined) {\n if (!isValidLinkUrl(labeledLink[1])) {\n return undefined;\n }\n return {\n type: \"link\",\n url: labeledLink[1],\n text: labeledLink[2],\n style: styleOrUndefined(style),\n };\n }\n const user = SLACK_USER_RE.exec(inner);\n if (user?.[1] !== undefined) {\n return { type: \"user\", user_id: user[1], style: styleOrUndefined(style) };\n }\n const channel = SLACK_CHANNEL_RE.exec(inner);\n if (channel?.[1] !== undefined) {\n return { type: \"channel\", channel_id: channel[1], style: styleOrUndefined(style) };\n }\n const usergroup = SLACK_USERGROUP_RE.exec(inner);\n if (usergroup?.[1] !== undefined) {\n return { type: \"usergroup\", usergroup_id: usergroup[1], style: styleOrUndefined(style) };\n }\n const broadcast = SLACK_BROADCAST_RE.exec(inner);\n if (broadcast !== null) {\n const range = broadcast[1];\n if (range === \"here\" || range === \"channel\" || range === \"everyone\") {\n return { type: \"broadcast\", range, style: styleOrUndefined(style) };\n }\n }\n const date = SLACK_DATE_RE.exec(inner);\n if (date?.[1] !== undefined && date[2] !== undefined) {\n const timestamp = Number(date[1]);\n if (Number.isSafeInteger(timestamp)) {\n return {\n type: \"date\",\n timestamp,\n format: date[2],\n url: date[3],\n fallback: date[4],\n style: styleOrUndefined(style),\n };\n }\n }\n return undefined;\n}\n\n/**\n * Rich text inlines for a string that may contain raw Slack entity tokens.\n * Returns undefined when the string contains none (callers keep their own path).\n * Non-entity slices flow through {@link emit} so mention/emoji handling still applies.\n */\nfunction slackEntitySplit(\n value: string,\n style: RichTextStyle,\n emit: (slice: string) => ReadonlyArray<RichTextInline>,\n): RichTextInline[] | undefined {\n SLACK_ENTITY_CANDIDATE_RE.lastIndex = 0;\n let match: RegExpExecArray | null = SLACK_ENTITY_CANDIDATE_RE.exec(value);\n if (match === null) {\n return undefined;\n }\n const out: RichTextInline[] = [];\n let last = 0;\n let sawEntity = false;\n while (match !== null) {\n const element = slackEntityElement(match[1] ?? \"\", style);\n if (element !== undefined) {\n sawEntity = true;\n if (match.index > last) {\n out.push(...emit(value.slice(last, match.index)));\n }\n out.push(element);\n last = match.index + match[0].length;\n }\n match = SLACK_ENTITY_CANDIDATE_RE.exec(value);\n }\n if (!sawEntity) {\n return undefined;\n }\n if (last < value.length) {\n out.push(...emit(value.slice(last)));\n }\n return out;\n}\n\n/**\n * Section inlines for raw HTML values carrying Slack entity tokens (remark parses\n * `<!here>` and friends as html nodes). Undefined when the value has no entities.\n */\nexport function slackEntityRichTextInlines(\n value: string,\n style: RichTextStyle,\n): ReadonlyArray<RichTextInline> | undefined {\n return slackEntitySplit(value, style, (slice) => emitTextWithEmoji(slice, style));\n}\n\n// Require a non-identifier boundary so emails like user@example.com are not mentions.\nconst MENTION_RE =\n /(?<![A-Za-z0-9._-])@([a-zA-Z0-9._-]{1,64})|(?<![A-Za-z0-9_-])#([a-zA-Z0-9_-]{1,80})/g;\n\n/** True when mention resolvers are configured and phrasing contains @user / #channel tokens. */\nexport function phrasingNeedsMentionResolution(\n nodes: ReadonlyArray<PhrasingContent>,\n ctx: ConversionContext,\n): boolean {\n const resolvers = ctx.config.mentionResolvers;\n if (resolvers?.resolveUser === undefined && resolvers?.resolveChannel === undefined) {\n return false;\n }\n const plain = phrasingToPlain(nodes);\n MENTION_RE.lastIndex = 0;\n return MENTION_RE.test(plain);\n}\n\nfunction emitTextWithMentionsAndEmoji(\n node: Text,\n style: RichTextStyle,\n ctx: ConversionContext,\n): RichTextInline[] {\n // Raw Slack entity tokens (<@U…>, <#C…>, …) convert first; remaining slices\n // still get resolver-based @handle/#channel and emoji shortcode handling.\n const viaEntities = slackEntitySplit(node.value, style, (slice) =>\n emitMentionsAndEmoji(slice, style, ctx),\n );\n if (viaEntities !== undefined) {\n return viaEntities;\n }\n return emitMentionsAndEmoji(node.value, style, ctx);\n}\n\nfunction emitMentionsAndEmoji(\n value: string,\n style: RichTextStyle,\n ctx: ConversionContext,\n): RichTextInline[] {\n const resolvers = ctx.config.mentionResolvers;\n const canUser = resolvers?.resolveUser !== undefined;\n const canChannel = resolvers?.resolveChannel !== undefined;\n if (!canUser && !canChannel) {\n return emitTextWithEmoji(value, style);\n }\n\n const out: RichTextInline[] = [];\n MENTION_RE.lastIndex = 0;\n let last = 0;\n let match: RegExpExecArray | null = MENTION_RE.exec(value);\n while (match !== null) {\n const start = match.index;\n if (start > last) {\n out.push(...emitTextWithEmoji(value.slice(last, start), style));\n }\n const userHandle = match[1];\n const channelName = match[2];\n if (userHandle !== undefined && canUser) {\n const userId = resolvers.resolveUser?.(userHandle);\n if (userId !== undefined && userId.length > 0) {\n out.push({ type: \"user\", user_id: userId, style: styleOrUndefined(style) });\n } else {\n out.push(...emitTextWithEmoji(match[0], style));\n }\n } else if (channelName !== undefined && canChannel) {\n const channelId = resolvers.resolveChannel?.(channelName);\n if (channelId !== undefined && channelId.length > 0) {\n out.push({ type: \"channel\", channel_id: channelId, style: styleOrUndefined(style) });\n } else {\n out.push(...emitTextWithEmoji(match[0], style));\n }\n } else {\n out.push(...emitTextWithEmoji(match[0], style));\n }\n last = start + match[0].length;\n match = MENTION_RE.exec(value);\n }\n if (last < value.length) {\n out.push(...emitTextWithEmoji(value.slice(last), style));\n }\n if (out.length === 0) {\n out.push(...emitTextWithEmoji(value, style));\n }\n return out;\n}\n\nfunction emitTextWithEmoji(value: string, style: RichTextStyle): RichTextInline[] {\n const out: RichTextInline[] = [];\n EMOJI_SHORTCODE_RE.lastIndex = 0;\n let last = 0;\n let match: RegExpExecArray | null = EMOJI_SHORTCODE_RE.exec(value);\n while (match !== null) {\n const start = match.index;\n if (start > last) {\n out.push({ type: \"text\", text: value.slice(last, start), style: styleOrUndefined(style) });\n }\n const name = match[1] ?? \"\";\n if (KNOWN_SLACK_EMOJI.has(name)) {\n const emoji: RichTextEmoji = { type: \"emoji\", name };\n out.push(emoji);\n } else {\n out.push({ type: \"text\", text: match[0], style: styleOrUndefined(style) });\n }\n last = start + match[0].length;\n match = EMOJI_SHORTCODE_RE.exec(value);\n }\n if (last < value.length) {\n out.push({ type: \"text\", text: value.slice(last), style: styleOrUndefined(style) });\n }\n if (out.length === 0) {\n out.push({ type: \"text\", text: value, style: styleOrUndefined(style) });\n }\n return out;\n}\n\ninterface ReassembledSlackLink {\n readonly leadingText: Text;\n readonly link: RichTextLink;\n readonly trailingText: Text;\n}\n\n/**\n * Slack labeled links whose label contains spaces (`<https://u|two words>`)\n * parse as text ending in \"<\", an autolink whose url swallowed \"|firstWord\",\n * then text carrying the rest of the label up to \">\". Reassemble the trio.\n */\nfunction reassembleSlackLabeledLink(\n work: ReadonlyArray<PhrasingContent>,\n i: number,\n style: RichTextStyle,\n): ReassembledSlackLink | undefined {\n const lead = work[i];\n const linkNode = work[i + 1];\n const tail = work[i + 2];\n if (lead?.type !== \"text\" || !lead.value.endsWith(\"<\")) {\n return undefined;\n }\n if (linkNode?.type !== \"link\" || tail?.type !== \"text\") {\n return undefined;\n }\n const url = linkNode.url;\n const pipeIndex = url.indexOf(\"|\");\n if (pipeIndex <= 0 || !HTTP_URL_RE.test(url)) {\n return undefined;\n }\n // Only GFM literal autolinks qualify (label text equals the raw url).\n if (phrasingToPlain(linkNode.children) !== url) {\n return undefined;\n }\n const closeIndex = tail.value.indexOf(\">\");\n if (closeIndex === -1) {\n return undefined;\n }\n const realUrl = url.slice(0, pipeIndex);\n if (!isValidLinkUrl(realUrl)) {\n return undefined;\n }\n const label = `${url.slice(pipeIndex + 1)}${tail.value.slice(0, closeIndex)}`;\n if (label.length === 0) {\n return undefined;\n }\n return {\n leadingText: { type: \"text\", value: lead.value.slice(0, -1) },\n link: { type: \"link\", url: realUrl, text: label, style: styleOrUndefined(style) },\n trailingText: { type: \"text\", value: tail.value.slice(closeIndex + 1) },\n };\n}\n\nfunction emitLink(node: Link, ctx: ConversionContext, style: RichTextStyle): RichTextInline[] {\n const url = node.url;\n const text = phrasingToPlain(node.children);\n // Slack-style labeled autolink <https://url|label>: remark folds the pipe and\n // label into the URL of an autolink. Split them back apart.\n const pipeIndex = url.indexOf(\"|\");\n if (pipeIndex > 0 && HTTP_URL_RE.test(url) && text === url) {\n const realUrl = url.slice(0, pipeIndex);\n const label = url.slice(pipeIndex + 1);\n if (label.length > 0 && isValidLinkUrl(realUrl)) {\n return [{ type: \"link\", url: realUrl, text: label, style: styleOrUndefined(style) }];\n }\n }\n if (!isValidLinkUrl(url)) {\n ctx.degradations.add({\n nodeType: \"link\",\n from: \"link\",\n to: \"text\",\n reason: \"Invalid or oversized URL\",\n path: ctx.path,\n });\n const suffix = url.length > 0 ? ` (${url})` : \"\";\n return [{ type: \"text\", text: `${text}${suffix}`, style: styleOrUndefined(style) }];\n }\n const link: RichTextLink = {\n type: \"link\",\n url,\n text: text.length > 0 ? text : url,\n style: styleOrUndefined(style),\n };\n return [link];\n}\n\nfunction emitLinkReference(\n node: LinkReference,\n ctx: ConversionContext,\n style: RichTextStyle,\n): RichTextInline[] {\n const def = ctx.definitions.get(node.identifier.toLowerCase());\n if (def === undefined) {\n return [\n {\n type: \"text\",\n text: phrasingToPlain(node.children) || node.identifier,\n style: styleOrUndefined(style),\n },\n ];\n }\n return emitLink(\n {\n type: \"link\",\n url: def.url,\n title: def.title ?? undefined,\n children: node.children,\n },\n ctx,\n style,\n );\n}\n\nfunction isValidLinkUrl(url: string): boolean {\n if (url.length === 0 || url.length > IMAGE_URL_MAX_CHARS) {\n return false;\n }\n return HTTP_URL_RE.test(url) || url.startsWith(\"#\") || url.startsWith(\"/\");\n}\n\nconst INLINE_TAG_RE = /<\\/?(b|strong|i|em|s|del|code|br|a)(\\s+[^>]{0,200})?>|[^<]+/gi;\n\nfunction emitInlineHtml(\n html: string,\n style: RichTextStyle,\n ctx: ConversionContext,\n): RichTextInline[] {\n const out: RichTextInline[] = [];\n const stack: Array<{ tag: string; style: RichTextStyle }> = [];\n let current = style;\n let openAnchor: { href: string; style: RichTextStyle; textParts: string[] } | undefined;\n INLINE_TAG_RE.lastIndex = 0;\n let m: RegExpExecArray | null = INLINE_TAG_RE.exec(html);\n let matched = false;\n while (m !== null) {\n matched = true;\n const token = m[0];\n if (token.startsWith(\"<\")) {\n const tag = (m[1] ?? \"\").toLowerCase();\n const closing = token.startsWith(\"</\");\n if (tag === \"br\") {\n if (openAnchor !== undefined) {\n openAnchor.textParts.push(\"\\n\");\n } else {\n out.push({ type: \"text\", text: \"\\n\", style: styleOrUndefined(current) });\n }\n } else if (closing) {\n if (tag === \"a\" && openAnchor !== undefined) {\n const label = openAnchor.textParts.join(\"\");\n out.push({\n type: \"link\",\n url: openAnchor.href,\n text: label.length > 0 ? label : openAnchor.href,\n style: styleOrUndefined(openAnchor.style),\n });\n openAnchor = undefined;\n }\n stack.pop();\n current = stack.length > 0 ? (stack[stack.length - 1]?.style ?? style) : style;\n } else if (tag === \"a\") {\n const hrefMatch = /href\\s*=\\s*[\"']([^\"']{0,3000})[\"']/i.exec(token);\n const href = hrefMatch?.[1];\n stack.push({ tag, style: current });\n if (href !== undefined && isValidLinkUrl(href)) {\n // Collect label text until </a>; do not emit yet.\n openAnchor = { href, style: current, textParts: [] };\n }\n } else {\n const next = { ...current };\n if (tag === \"b\" || tag === \"strong\") next.bold = true;\n if (tag === \"i\" || tag === \"em\") next.italic = true;\n if (tag === \"s\" || tag === \"del\") next.strike = true;\n if (tag === \"code\") next.code = true;\n stack.push({ tag, style: next });\n current = next;\n }\n } else if (token.length > 0) {\n if (openAnchor !== undefined) {\n openAnchor.textParts.push(token);\n } else {\n out.push({ type: \"text\", text: token, style: styleOrUndefined(current) });\n }\n }\n m = INLINE_TAG_RE.exec(html);\n }\n if (openAnchor !== undefined) {\n const label = openAnchor.textParts.join(\"\");\n out.push({\n type: \"link\",\n url: openAnchor.href,\n text: label.length > 0 ? label : openAnchor.href,\n style: styleOrUndefined(openAnchor.style),\n });\n }\n if (!matched) {\n ctx.degradations.add({\n nodeType: \"html\",\n from: \"html\",\n to: \"text\",\n reason: \"Unrecognized inline HTML stripped to text\",\n path: ctx.path,\n });\n const stripped = html.replace(/<[^>]{0,200}>/g, \"\");\n if (stripped.length > 0) {\n out.push({ type: \"text\", text: stripped, style: styleOrUndefined(style) });\n }\n }\n return out;\n}\n\nfunction coalesceText(elements: ReadonlyArray<RichTextInline>): RichTextInline[] {\n const out: RichTextInline[] = [];\n for (const el of elements) {\n const prev = out[out.length - 1];\n if (\n el.type === \"text\" &&\n prev !== undefined &&\n prev.type === \"text\" &&\n JSON.stringify(prev.style) === JSON.stringify(el.style)\n ) {\n out[out.length - 1] = { type: \"text\", text: prev.text + el.text, style: prev.style };\n } else {\n out.push(el);\n }\n }\n return out;\n}\n","import type { Code, RootContent } from \"mdast\";\n\nimport type { Block, RichTextBlock } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\n\nimport { preformattedRichText } from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * Plain code fences → rich_text_preformatted (+language when flagged).\n * Mermaid/math dialects are handled by more specific adapters that match first.\n */\nexport class CodeFenceAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"code\";\n }\n\n plan(node: RootContent, _ctx: ConversionContext): ReadonlyArray<Candidate> {\n const code = node as Code;\n const hasLang = code.lang !== null && code.lang !== undefined && code.lang.length > 0;\n return [\n {\n requires: [\"preformattedLanguage\"],\n budget: { blocks: 1 },\n emit: (): ReadonlyArray<Block> => [preformatted(code, true)],\n },\n {\n budget: { blocks: 1 },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n if (hasLang) {\n emitCtx.degradations.add({\n nodeType: \"code\",\n from: \"preformatted.language\",\n to: \"preformatted\",\n reason: \"preformattedLanguage capability unavailable; omitting language\",\n path: emitCtx.path,\n });\n }\n return [preformatted(code, false)];\n },\n },\n ];\n }\n}\n\nfunction preformatted(code: Code, withLang: boolean): RichTextBlock {\n const language =\n withLang && code.lang !== null && code.lang !== undefined && code.lang.length > 0\n ? code.lang.toLowerCase()\n : undefined;\n return preformattedRichText(code.value, language);\n}\n","import type { Heading, RootContent } from \"mdast\";\n\nimport type { Block, HeaderBlock, RichTextBlock } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport { HEADER_LEVEL_MAX, HEADER_TEXT_MAX_CHARS } from \"../constants.js\";\n\nimport {\n countHoistableImages,\n emitPhrasing,\n hoistedImageBlock,\n phrasingNeedsMentionResolution,\n phrasingToPlain,\n} from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * Headings 1–4 → header (+level); 5–6 / overflow → bold rich_text.\n */\nexport class HeadingAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"heading\";\n }\n\n plan(node: RootContent, ctx: ConversionContext): ReadonlyArray<Candidate> {\n const heading = node as Heading;\n const hoistCount = countHoistableImages(heading.children, ctx);\n const needsRich = headingNeedsRichText(heading, ctx);\n\n if (!needsRich) {\n return [\n {\n requires: [\"headerLevel\"],\n budget: { blocks: 1 },\n emit: (): ReadonlyArray<Block> => {\n return emitPlainHeader(heading, true);\n },\n },\n {\n budget: { blocks: 1 },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n emitCtx.degradations.add({\n nodeType: \"heading\",\n from: \"header.level\",\n to: \"header\",\n reason: \"headerLevel capability unavailable; omitting level\",\n path: emitCtx.path,\n });\n return emitPlainHeader(heading, false);\n },\n },\n ];\n }\n\n const richCandidates: Candidate[] = [\n {\n budget: { blocks: 1 + hoistCount },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n return emitRichHeading(heading, emitCtx, true);\n },\n },\n ];\n if (hoistCount > 0) {\n richCandidates.push({\n budget: { blocks: 1 },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n emitCtx.degradations.add({\n nodeType: \"heading\",\n from: \"rich_text+images\",\n to: \"rich_text\",\n reason: \"Budget exhausted for hoisted heading images; emitting text only\",\n path: emitCtx.path,\n });\n return emitRichHeading(heading, emitCtx, false);\n },\n });\n }\n return richCandidates;\n }\n}\n\nfunction headingNeedsRichText(heading: Heading, ctx: ConversionContext): boolean {\n if (heading.depth > HEADER_LEVEL_MAX) {\n return true;\n }\n const plain = phrasingToPlain(heading.children);\n if (plain.length > HEADER_TEXT_MAX_CHARS) {\n return true;\n }\n if (phrasingNeedsMentionResolution(heading.children, ctx)) {\n return true;\n }\n return heading.children.some(\n (c) =>\n c.type === \"link\" ||\n c.type === \"inlineCode\" ||\n c.type === \"strong\" ||\n c.type === \"emphasis\" ||\n c.type === \"delete\" ||\n c.type === \"image\" ||\n c.type === \"imageReference\" ||\n c.type === \"html\",\n );\n}\n\nfunction emitPlainHeader(heading: Heading, withLevel: boolean): ReadonlyArray<Block> {\n const plain = phrasingToPlain(heading.children);\n const block: HeaderBlock = {\n type: \"header\",\n text: { type: \"plain_text\", text: plain.length > 0 ? plain : \" \" },\n level: withLevel ? heading.depth : undefined,\n };\n return [block];\n}\n\nfunction emitRichHeading(\n heading: Heading,\n ctx: ConversionContext,\n hoistImages: boolean,\n): ReadonlyArray<Block> {\n const plain = phrasingToPlain(heading.children);\n const depth = heading.depth;\n if (depth > HEADER_LEVEL_MAX) {\n ctx.degradations.add({\n nodeType: \"heading\",\n from: `header.h${String(depth)}`,\n to: \"rich_text.bold\",\n reason: `Heading level ${String(depth)} exceeds max ${String(HEADER_LEVEL_MAX)}`,\n path: ctx.path,\n });\n } else if (plain.length > HEADER_TEXT_MAX_CHARS) {\n ctx.degradations.add({\n nodeType: \"heading\",\n from: \"header\",\n to: \"rich_text.bold\",\n reason: \"Heading exceeds 150 plain chars\",\n path: ctx.path,\n });\n } else {\n ctx.degradations.add({\n nodeType: \"heading\",\n from: \"header\",\n to: \"rich_text.bold\",\n reason:\n \"Heading contains inline content unsupported by header (styles, links, images, or mentions)\",\n path: ctx.path,\n });\n }\n\n const inline = emitPhrasing(heading.children, ctx, { bold: true });\n const rich: RichTextBlock = {\n type: \"rich_text\",\n elements: [\n {\n type: \"rich_text_section\",\n elements:\n inline.elements.length > 0\n ? inline.elements\n : [{ type: \"text\", text: \" \", style: { bold: true } }],\n },\n ],\n };\n const blocks: Block[] = [rich];\n if (!hoistImages) {\n return blocks;\n }\n for (const h of inline.hoistedImages) {\n blocks.push(hoistedImageBlock(h, ctx));\n }\n return blocks;\n}\n","import type { Html, RootContent } from \"mdast\";\n\nimport type { Block, ContainerBlock, SectionBlock } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport { CONTAINER_CHILDREN_MAX, CONTAINER_TITLE_MAX_CHARS } from \"../constants.js\";\n\nimport { clampSectionText, slackEntityRichTextInlines } from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\nconst DETAILS_RE =\n /<details\\b[^>]{0,200}>\\s*<summary\\b[^>]{0,200}>([\\s\\S]{0,500}?)<\\/summary>([\\s\\S]{0,8000}?)<\\/details>/i;\n\n/**\n * Block HTML — details/summary → container; else strip+warn.\n */\nexport class HtmlBlockAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"html\";\n }\n\n plan(node: RootContent, _ctx: ConversionContext): ReadonlyArray<Candidate> {\n const html = node as Html;\n // details/summary must win over the Slack-entity path: a collapsible block\n // that also mentions <@U…> should stay a container, not flatten to rich_text.\n const details = DETAILS_RE.exec(html.value);\n if (details !== null) {\n const title = stripTags(details[1] ?? \"Details\").trim();\n const body = stripTags(details[2] ?? \"\").trim();\n return [\n {\n requires: [\"containerBlock\"],\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n const child: SectionBlock = {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: clampSectionText(body.length > 0 ? body : \" \", ctx, \"html.details.body\"),\n },\n };\n const block: ContainerBlock = {\n type: \"container\",\n title: {\n type: \"plain_text\",\n text: clampContainerTitle(title.length > 0 ? title : \"Details\", ctx),\n },\n child_blocks: [child].slice(0, CONTAINER_CHILDREN_MAX),\n is_collapsible: true,\n };\n return [block];\n },\n },\n {\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n ctx.degradations.add({\n nodeType: \"html.details\",\n from: \"container\",\n to: \"section\",\n reason: \"containerBlock unavailable\",\n path: ctx.path,\n });\n return [\n {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: clampSectionText(`*${title}*\\n${body}`, ctx, \"html.details.section\"),\n },\n },\n ];\n },\n },\n ];\n }\n\n // A line like \"<!here> deploying now\" parses as one block html node; Slack\n // entity tokens must survive as rich text elements, not be stripped as tags.\n const entityInlines = slackEntityRichTextInlines(html.value.trim(), {});\n if (entityInlines !== undefined) {\n return [\n {\n budget: { blocks: 1 },\n emit: (): ReadonlyArray<Block> => [\n {\n type: \"rich_text\",\n elements: [{ type: \"rich_text_section\", elements: entityInlines }],\n },\n ],\n },\n ];\n }\n\n return [\n {\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n ctx.degradations.add({\n nodeType: \"html\",\n from: \"html\",\n to: \"section\",\n reason: \"Unsupported block HTML stripped to text\",\n path: ctx.path,\n });\n const text = stripTags(html.value).trim();\n if (text.length === 0) {\n return [];\n }\n return [\n {\n type: \"section\",\n text: { type: \"mrkdwn\", text: clampSectionText(text, ctx, \"html.section\") },\n },\n ];\n },\n },\n ];\n }\n}\n\nfunction stripTags(html: string): string {\n return html.replace(/<[^>]{0,200}>/g, \"\");\n}\n\nfunction clampContainerTitle(text: string, ctx: ConversionContext): string {\n if (text.length <= CONTAINER_TITLE_MAX_CHARS) {\n return text;\n }\n ctx.degradations.add({\n nodeType: \"html.details\",\n from: \"container.title\",\n to: \"truncated\",\n reason: `Container title truncated to ${String(CONTAINER_TITLE_MAX_CHARS)} chars`,\n path: ctx.path,\n });\n return text.slice(0, CONTAINER_TITLE_MAX_CHARS);\n}\n","import type { List, ListItem, PhrasingContent, RootContent } from \"mdast\";\nimport { toString } from \"mdast-util-to-string\";\n\nimport type { Block, RichTextBlock, RichTextList, RichTextSection } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport { RICH_TEXT_LIST_INDENT_MAX } from \"../constants.js\";\n\nimport {\n countHoistableImages,\n emitPhrasing,\n hoistedImageBlock,\n type HoistedImage,\n} from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * Non-task lists → rich_text_list with sibling-indent nesting.\n */\nexport class ListAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n if (node.type !== \"list\") {\n return false;\n }\n return !isTaskList(node);\n }\n\n plan(node: RootContent, ctx: ConversionContext): ReadonlyArray<Candidate> {\n const list = node as List;\n const hoistCount = countHoistableImagesInList(list, ctx);\n const candidates: Candidate[] = [\n {\n budget: { blocks: 1 + hoistCount },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n return emitListBlocks(list, emitCtx, true);\n },\n },\n ];\n if (hoistCount > 0) {\n candidates.push({\n budget: { blocks: 1 },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n emitCtx.degradations.add({\n nodeType: \"list\",\n from: \"rich_text+images\",\n to: \"rich_text\",\n reason: \"Budget exhausted for hoisted list images; emitting text only\",\n path: emitCtx.path,\n });\n return emitListBlocks(list, emitCtx, false);\n },\n });\n }\n return candidates;\n }\n}\n\nfunction emitListBlocks(\n list: List,\n emitCtx: ConversionContext,\n hoistImages: boolean,\n): ReadonlyArray<Block> {\n const { elements, hoistedImages } = emitListTree(list, 0, emitCtx);\n const block: RichTextBlock = { type: \"rich_text\", elements };\n const blocks: Block[] = [block];\n if (!hoistImages) {\n return blocks;\n }\n for (const h of hoistedImages) {\n blocks.push(hoistedImageBlock(h, emitCtx));\n }\n return blocks;\n}\n\nexport function isTaskList(list: List): boolean {\n return list.children.some((item) => item.checked === true || item.checked === false);\n}\n\nfunction countHoistableImagesInList(list: List, ctx: ConversionContext): number {\n let count = 0;\n for (const item of list.children) {\n count += countHoistableImages(collectListItemPhrasing(item), ctx);\n for (const child of item.children) {\n if (child.type === \"list\") {\n count += countHoistableImagesInList(child, ctx);\n }\n }\n }\n return count;\n}\n\nfunction emitListTree(\n list: List,\n indent: number,\n ctx: ConversionContext,\n): { elements: Array<RichTextList>; hoistedImages: HoistedImage[] } {\n let effectiveIndent = indent;\n if (effectiveIndent > RICH_TEXT_LIST_INDENT_MAX) {\n ctx.degradations.add({\n nodeType: \"list\",\n from: `indent:${String(effectiveIndent)}`,\n to: `indent:${String(RICH_TEXT_LIST_INDENT_MAX)}`,\n reason: \"List indent clamped at 6\",\n path: ctx.path,\n });\n effectiveIndent = RICH_TEXT_LIST_INDENT_MAX;\n }\n\n const sections: RichTextSection[] = [];\n const nested: RichTextList[] = [];\n const hoistedImages: HoistedImage[] = [];\n\n for (const item of list.children) {\n const { section, childLists, hoistedImages: itemImages } = emitListItem(item, ctx);\n sections.push(section);\n hoistedImages.push(...itemImages);\n for (const child of childLists) {\n const nestedResult = emitListTree(child, effectiveIndent + 1, ctx);\n nested.push(...nestedResult.elements);\n hoistedImages.push(...nestedResult.hoistedImages);\n }\n }\n\n const primary: RichTextList = {\n type: \"rich_text_list\",\n style: list.ordered === true ? \"ordered\" : \"bullet\",\n elements:\n sections.length > 0\n ? sections\n : [{ type: \"rich_text_section\", elements: [{ type: \"text\", text: \" \" }] }],\n indent: effectiveIndent,\n offset:\n list.ordered === true && list.start !== null && list.start !== undefined && list.start > 1\n ? list.start - 1\n : undefined,\n };\n\n return { elements: [primary, ...nested], hoistedImages };\n}\n\n/** Phrasing content of a list item for hoist counting — no degradations emitted. */\nfunction collectListItemPhrasing(item: ListItem): PhrasingContent[] {\n const phrasing: PhrasingContent[] = [];\n let sawBlock = false;\n\n for (const child of item.children) {\n if (child.type === \"paragraph\") {\n if (sawBlock) {\n phrasing.push({ type: \"text\", value: \"\\n\" });\n }\n phrasing.push(...child.children);\n sawBlock = true;\n } else if (child.type !== \"list\") {\n sawBlock = true;\n }\n }\n return phrasing;\n}\n\nfunction emitListItem(\n item: ListItem,\n ctx: ConversionContext,\n): { section: RichTextSection; childLists: List[]; hoistedImages: HoistedImage[] } {\n const phrasing: PhrasingContent[] = [];\n const childLists: List[] = [];\n let sawBlock = false;\n\n for (const child of item.children) {\n if (child.type === \"paragraph\") {\n if (sawBlock) {\n phrasing.push({ type: \"text\", value: \"\\n\" });\n }\n phrasing.push(...child.children);\n sawBlock = true;\n } else if (child.type === \"list\") {\n childLists.push(child);\n } else {\n ctx.degradations.add({\n nodeType: \"listItem\",\n from: child.type,\n to: \"text\",\n reason: \"Block child of list item flattened into text\",\n path: ctx.path,\n });\n const text = toString(child);\n if (text.length > 0) {\n phrasing.push({ type: \"text\", value: text });\n }\n sawBlock = true;\n }\n }\n\n const inline = emitPhrasing(phrasing, ctx);\n return {\n section: {\n type: \"rich_text_section\",\n elements: inline.elements.length > 0 ? inline.elements : [{ type: \"text\", text: \" \" }],\n },\n childLists,\n hoistedImages: [...inline.hoistedImages],\n };\n}\n","import type { RootContent } from \"mdast\";\n\nimport type { Block, RichTextBlock } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\n\nimport { preformattedRichText } from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * Display math → preformatted TeX (renderer path is phase 2).\n */\nexport class MathBlockAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"math\";\n }\n\n plan(node: RootContent, _ctx: ConversionContext): ReadonlyArray<Candidate> {\n const value = \"value\" in node && typeof node.value === \"string\" ? node.value : \"\";\n return [\n {\n requires: [\"preformattedLanguage\"],\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n return [preformattedMath(value, true, ctx)];\n },\n },\n {\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n ctx.degradations.add({\n nodeType: \"math\",\n from: \"preformatted.language\",\n to: \"preformatted\",\n reason: \"preformattedLanguage capability unavailable; omitting language\",\n path: ctx.path,\n });\n return [preformattedMath(value, false, ctx)];\n },\n },\n ];\n }\n}\n\nfunction preformattedMath(value: string, withLang: boolean, ctx: ConversionContext): RichTextBlock {\n ctx.degradations.add({\n nodeType: \"math\",\n from: \"math\",\n to: \"rich_text_preformatted\",\n reason: \"No math renderer configured; emitting TeX source\",\n path: ctx.path,\n });\n return preformattedRichText(value, withLang ? \"latex\" : undefined);\n}\n","import type { Code, RootContent } from \"mdast\";\n\nimport type { Block, DataVisualizationBlock, ImageBlock, RichTextBlock } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport { RecordingDegradationCollector } from \"../budget/recording-degradation-collector.js\";\nimport {\n CHART_LABEL_MAX_CHARS,\n CHART_POINTS_MAX,\n CHART_SEGMENTS_MAX,\n CHART_SERIES_MAX,\n CHART_TITLE_MAX_CHARS,\n IMAGE_URL_MAX_CHARS,\n} from \"../constants.js\";\nimport type {\n MermaidChartParser,\n MermaidPieAst,\n MermaidXyChartAst,\n RenderRequest,\n SlackUploader,\n} from \"../types.js\";\n\nimport { clampImageText, preformattedRichText, truncateLabel } from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\nexport interface MermaidFenceAdapterDeps {\n readonly pieParser: MermaidChartParser;\n readonly xyParser: MermaidChartParser;\n}\n\n/**\n * Mermaid fences → data_visualization / image renderer / preformatted.\n */\nexport class MermaidFenceAdapter implements NodeAdapter {\n private readonly pieParser: MermaidChartParser;\n private readonly xyParser: MermaidChartParser;\n\n constructor(deps: MermaidFenceAdapterDeps) {\n this.pieParser = deps.pieParser;\n this.xyParser = deps.xyParser;\n }\n\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"code\" && (node.lang ?? \"\").toLowerCase() === \"mermaid\";\n }\n\n plan(node: RootContent, ctx: ConversionContext): ReadonlyArray<Candidate> {\n const code = node as Code;\n const source = code.value;\n const kind = detectMermaidKind(source);\n const candidates: Candidate[] = [];\n\n // Probe native chart viability with a throwaway collector so plan-time\n // parse/limit failures are not recorded unless the native candidate emits.\n const probeCtx = ctx.withDegradations(new RecordingDegradationCollector());\n\n if (kind === \"pie\") {\n const parsed = this.pieParser.parse(source);\n if (parsed.ok && parsed.value.kind === \"pie\") {\n const probe = tryPieBlock(parsed.value, probeCtx);\n if (probe !== undefined) {\n const ast = parsed.value;\n candidates.push({\n requires: [\"dataVisualization\"],\n budget: { blocks: 1, chart: true },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n const block = tryPieBlock(ast, emitCtx);\n return block !== undefined ? [block] : [];\n },\n });\n }\n }\n } else if (kind === \"xychart-beta\") {\n const parsed = this.xyParser.parse(source);\n if (parsed.ok && parsed.value.kind === \"xychart-beta\") {\n const probe = tryXyBlock(parsed.value, probeCtx);\n if (probe !== undefined) {\n const ast = parsed.value;\n candidates.push({\n requires: [\"dataVisualization\"],\n budget: { blocks: 1, chart: true },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n const block = tryXyBlock(ast, emitCtx);\n return block !== undefined ? [block] : [];\n },\n });\n }\n }\n }\n\n candidates.push({\n budget: { blocks: 1 },\n emit: async (emitCtx: ConversionContext): Promise<ReadonlyArray<Block>> => {\n const rendered = await tryRenderers(source, emitCtx);\n if (rendered !== undefined) {\n return [rendered];\n }\n emitCtx.degradations.add({\n nodeType: \"code.mermaid\",\n from: kind,\n to: \"rich_text_preformatted\",\n reason: \"No native chart / renderer image; emitting mermaid source\",\n path: emitCtx.path,\n });\n return [preformattedMermaid(source, emitCtx)];\n },\n });\n\n return candidates;\n }\n}\n\nfunction detectMermaidKind(source: string): \"pie\" | \"xychart-beta\" | \"other\" {\n const first = source\n .split(/\\r?\\n/)\n .map((l) => l.replace(/%%[^\\n]{0,500}/, \"\").trim())\n .find((l) => l.length > 0);\n if (first === undefined) {\n return \"other\";\n }\n if (/^pie\\b/i.test(first)) {\n return \"pie\";\n }\n if (/^xychart-beta\\b/i.test(first)) {\n return \"xychart-beta\";\n }\n return \"other\";\n}\n\nfunction tryPieBlock(\n ast: MermaidPieAst,\n ctx: ConversionContext,\n): DataVisualizationBlock | undefined {\n if (ast.segments.length > CHART_SEGMENTS_MAX) {\n ctx.degradations.add({\n nodeType: \"code.mermaid.pie\",\n from: \"data_visualization\",\n to: \"fallback\",\n reason: `Pie has ${String(ast.segments.length)} segments (max ${String(CHART_SEGMENTS_MAX)})`,\n path: ctx.path,\n });\n return undefined;\n }\n const segments = ast.segments.map((s) => {\n const t = truncateLabel(s.label, CHART_LABEL_MAX_CHARS);\n if (t.truncated) {\n ctx.degradations.add({\n nodeType: \"code.mermaid.pie\",\n from: s.label,\n to: t.text,\n reason: \"Pie label truncated to 20 chars\",\n path: ctx.path,\n });\n }\n return { label: t.text, value: s.value };\n });\n const titleRaw =\n ast.title ??\n (ctx.precedingHeading !== undefined && ctx.precedingHeading.length > 0\n ? ctx.precedingHeading\n : \"Chart\");\n return {\n type: \"data_visualization\",\n title: truncateChartTitle(titleRaw, ctx, \"code.mermaid.pie\"),\n chart: { type: \"pie\", segments },\n };\n}\n\nfunction tryXyBlock(\n ast: MermaidXyChartAst,\n ctx: ConversionContext,\n): DataVisualizationBlock | undefined {\n const categories = ast.categories.map((c) => {\n const t = truncateLabel(c, CHART_LABEL_MAX_CHARS);\n if (t.truncated) {\n ctx.degradations.add({\n nodeType: \"code.mermaid.xychart\",\n from: c,\n to: t.text,\n reason: \"Category label truncated to 20 chars\",\n path: ctx.path,\n });\n }\n return t.text;\n });\n\n if (categories.length > CHART_POINTS_MAX) {\n ctx.degradations.add({\n nodeType: \"code.mermaid.xychart\",\n from: \"data_visualization\",\n to: \"fallback\",\n reason: `xychart has ${String(categories.length)} points (max ${String(CHART_POINTS_MAX)})`,\n path: ctx.path,\n });\n return undefined;\n }\n\n let chartType: \"bar\" | \"line\" = \"bar\";\n let seriesValues = ast.bars;\n if (ast.bars.length > 0 && ast.lines.length > 0) {\n ctx.degradations.add({\n nodeType: \"code.mermaid.xychart\",\n from: \"mixed bar+line\",\n to: \"bar\",\n reason: \"Slack charts are single-type; preferring bar\",\n path: ctx.path,\n });\n } else if (ast.bars.length === 0) {\n chartType = \"line\";\n seriesValues = ast.lines;\n }\n\n if (seriesValues.length === 0 || seriesValues.length > CHART_SERIES_MAX) {\n ctx.degradations.add({\n nodeType: \"code.mermaid.xychart\",\n from: \"data_visualization\",\n to: \"fallback\",\n reason: `Invalid series count (${String(seriesValues.length)})`,\n path: ctx.path,\n });\n return undefined;\n }\n\n for (const [i, values] of seriesValues.entries()) {\n if (values.length !== categories.length) {\n ctx.degradations.add({\n nodeType: \"code.mermaid.xychart\",\n from: `series[${String(i)}].length=${String(values.length)}`,\n to: `categories.length=${String(categories.length)}`,\n reason: \"xychart series length mismatched categories; padded/truncated by index\",\n path: ctx.path,\n });\n }\n }\n const series = seriesValues.map((values, i) => ({\n name: truncateLabel(`Series ${String(i + 1)}`, CHART_LABEL_MAX_CHARS).text,\n data: categories.map((label, idx) => ({\n label,\n value: values[idx] ?? 0,\n })),\n }));\n\n const titleRaw =\n ast.title ??\n (ctx.precedingHeading !== undefined && ctx.precedingHeading.length > 0\n ? ctx.precedingHeading\n : \"Chart\");\n\n return {\n type: \"data_visualization\",\n title: truncateChartTitle(titleRaw, ctx, \"code.mermaid.xychart\"),\n chart: {\n type: chartType,\n series,\n axis_config: {\n categories,\n x_label:\n ast.xLabel !== undefined\n ? truncateChartTitle(ast.xLabel, ctx, \"code.mermaid.xychart\")\n : undefined,\n y_label:\n ast.yLabel !== undefined\n ? truncateChartTitle(ast.yLabel, ctx, \"code.mermaid.xychart\")\n : undefined,\n },\n },\n };\n}\n\nfunction truncateChartTitle(raw: string, ctx: ConversionContext, nodeType: string): string {\n const t = truncateLabel(raw, CHART_TITLE_MAX_CHARS);\n if (t.truncated) {\n ctx.degradations.add({\n nodeType,\n from: raw,\n to: t.text,\n reason: `Chart title truncated to ${String(CHART_TITLE_MAX_CHARS)} chars`,\n path: ctx.path,\n });\n }\n return t.text;\n}\n\nasync function tryRenderers(\n source: string,\n ctx: ConversionContext,\n): Promise<ImageBlock | undefined> {\n const req: RenderRequest = {\n lang: \"mermaid\",\n source,\n altText: \"mermaid diagram\",\n };\n for (const renderer of ctx.config.renderers) {\n if (!renderer.canRender(req)) {\n continue;\n }\n const result = await renderer.render(req);\n if (result === null) {\n continue;\n }\n if (result.kind === \"url\") {\n if (result.imageUrl.length > IMAGE_URL_MAX_CHARS) {\n ctx.degradations.add({\n nodeType: \"code.mermaid\",\n from: \"image.url\",\n to: \"skip\",\n reason: \"Renderer URL exceeds 3000 chars\",\n path: ctx.path,\n });\n continue;\n }\n return {\n type: \"image\",\n image_url: result.imageUrl,\n alt_text: clampImageText(result.altText, ctx, \"alt_text\"),\n };\n }\n const uploader: SlackUploader | undefined = ctx.config.uploader;\n if (uploader === undefined) {\n ctx.degradations.add({\n nodeType: \"code.mermaid\",\n from: \"image.bytes\",\n to: \"skip\",\n reason: \"Bytes renderer requires options.uploader\",\n path: ctx.path,\n });\n continue;\n }\n const uploaded = await uploader.upload(result);\n return {\n type: \"image\",\n alt_text: clampImageText(result.altText, ctx, \"alt_text\"),\n slack_file: { id: uploaded.fileId },\n };\n }\n return undefined;\n}\n\nfunction preformattedMermaid(source: string, ctx: ConversionContext): RichTextBlock {\n const withLang = ctx.config.capabilities.preformattedLanguage;\n if (!withLang) {\n ctx.degradations.add({\n nodeType: \"code.mermaid\",\n from: \"preformatted.language\",\n to: \"preformatted\",\n reason: \"preformattedLanguage capability unavailable; omitting language\",\n path: ctx.path,\n });\n }\n return preformattedRichText(source, withLang ? \"mermaid\" : undefined);\n}\n","import type { Paragraph, RootContent } from \"mdast\";\n\nimport type { Block, ImageBlock, RichTextBlock } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\n\nimport {\n clampImageText,\n clampSectionText,\n countHoistableImages,\n emitPhrasing,\n hoistedImageBlock,\n isPublicImageUrl,\n} from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * Paragraph → rich_text_section (coalesced later by assembler).\n */\nexport class ParagraphAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"paragraph\";\n }\n\n plan(node: RootContent, ctx: ConversionContext): ReadonlyArray<Candidate> {\n const paragraph = node as Paragraph;\n const loneImage =\n paragraph.children.length === 1 && paragraph.children[0]?.type === \"image\"\n ? paragraph.children[0]\n : undefined;\n const hoistCount = loneImage !== undefined ? 0 : countHoistableImages(paragraph.children, ctx);\n\n const candidates: Candidate[] = [\n {\n budget: { blocks: 1 + hoistCount },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n return emitParagraph(paragraph, emitCtx, loneImage, true);\n },\n },\n ];\n if (hoistCount > 0) {\n candidates.push({\n budget: { blocks: 1 },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n emitCtx.degradations.add({\n nodeType: \"paragraph\",\n from: \"rich_text+images\",\n to: \"rich_text\",\n reason: \"Budget exhausted for hoisted paragraph images; emitting text only\",\n path: emitCtx.path,\n });\n return emitParagraph(paragraph, emitCtx, loneImage, false);\n },\n });\n }\n return candidates;\n }\n}\n\nfunction emitParagraph(\n paragraph: Paragraph,\n emitCtx: ConversionContext,\n loneImage: Paragraph[\"children\"][number] | undefined,\n hoistImages: boolean,\n): ReadonlyArray<Block> {\n // Lone image paragraph → image block\n if (loneImage !== undefined && loneImage.type === \"image\") {\n const img = loneImage;\n if (isPublicImageUrl(img.url)) {\n const altRaw = img.alt ?? \"image\";\n const alt = clampImageText(altRaw.length > 0 ? altRaw : \"image\", emitCtx, \"alt_text\");\n const block: ImageBlock = {\n type: \"image\",\n image_url: img.url,\n alt_text: alt,\n title:\n img.title !== null && img.title !== undefined && img.title.length > 0\n ? {\n type: \"plain_text\",\n text: clampImageText(img.title, emitCtx, \"title\"),\n }\n : undefined,\n };\n return [block];\n }\n emitCtx.degradations.add({\n nodeType: \"image\",\n from: \"image\",\n to: \"section.link\",\n reason: \"Non-public or invalid image URL\",\n path: emitCtx.path,\n });\n const linkText = `<${img.url}|${img.alt ?? img.url}>`;\n return [\n {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: clampSectionText(linkText, emitCtx, \"section\"),\n },\n },\n ];\n }\n\n const inline = emitPhrasing(paragraph.children, emitCtx);\n const blocks: Block[] = [];\n const rich: RichTextBlock = {\n type: \"rich_text\",\n elements: [\n {\n type: \"rich_text_section\",\n elements: inline.elements.length > 0 ? inline.elements : [{ type: \"text\", text: \" \" }],\n },\n ],\n };\n blocks.push(rich);\n if (!hoistImages) {\n return blocks;\n }\n for (const h of inline.hoistedImages) {\n blocks.push(hoistedImageBlock(h, emitCtx));\n }\n return blocks;\n}\n","import type { RootContent } from \"mdast\";\n\nimport type { Block } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\n\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * Consumes definition / yaml / toml nodes without emitting blocks.\n */\nexport class SkipAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n const t = node.type as string;\n return t === \"definition\" || t === \"yaml\" || t === \"toml\" || t === \"footnoteDefinition\";\n }\n\n plan(node: RootContent, _ctx: ConversionContext): ReadonlyArray<Candidate> {\n return [\n {\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n const t = node.type as string;\n if (t === \"yaml\" || t === \"toml\") {\n ctx.degradations.add({\n nodeType: t,\n from: \"frontmatter\",\n to: \"skip\",\n reason: \"Frontmatter skipped by default\",\n path: ctx.path,\n });\n }\n return [];\n },\n },\n ];\n }\n}\n","import type { AlignType, RootContent, Table, TableCell as MdastTableCell } from \"mdast\";\nimport { toString } from \"mdast-util-to-string\";\n\nimport type {\n Block,\n DataTableBlock,\n MarkdownBlock,\n RichTextBlock,\n TableBlock,\n TableCell,\n TableColumnSetting,\n} from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport { RecordingDegradationCollector } from \"../budget/recording-degradation-collector.js\";\nimport {\n DATA_TABLE_MAX_DATA_ROWS,\n TABLE_CELL_WRAP_THRESHOLD,\n TABLE_MAX_COLS,\n TABLE_PREFERRED_MAX_ROWS,\n} from \"../constants.js\";\n\nimport { emitPhrasing, preformattedRichText } from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * GFM tables → table / data_table / markdown / ASCII fallbacks.\n */\nexport class TableAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"table\";\n }\n\n plan(node: RootContent, ctx: ConversionContext): ReadonlyArray<Candidate> {\n const table = node as Table;\n const rowCount = table.children.length;\n const colCount = table.children[0]?.children.length ?? 0;\n // Match validateBlocks measurement (JSON size for rich_text cells).\n const cellChars = countEmittedCellChars(table, ctx);\n\n if (colCount > TABLE_MAX_COLS) {\n return markdownThenAscii(table, cellChars, \"Table exceeds 20 columns\");\n }\n\n if (rowCount <= TABLE_PREFERRED_MAX_ROWS) {\n return [\n {\n requires: [\"tableBlock\"],\n budget: { blocks: 1, tableChars: cellChars },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n return [buildTableBlock(table, ctx)];\n },\n },\n ...markdownThenAscii(table, cellChars, \"tableBlock unavailable or char budget\"),\n ];\n }\n\n // >50 rows → data_table (≤200 data rows)\n const dataRows = Math.max(0, rowCount - 1);\n if (dataRows <= DATA_TABLE_MAX_DATA_ROWS) {\n const preferredTable = truncateRows(table, TABLE_PREFERRED_MAX_ROWS);\n const preferredChars = countEmittedCellChars(preferredTable, ctx);\n return [\n {\n requires: [\"dataTable\"],\n budget: { blocks: 1, dataTableChars: cellChars },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n emitCtx.degradations.add({\n nodeType: \"table\",\n from: \"table\",\n to: \"data_table\",\n reason: `Table has ${String(rowCount)} rows (>${String(TABLE_PREFERRED_MAX_ROWS)}); using data_table`,\n path: emitCtx.path,\n });\n return [buildDataTable(table, emitCtx)];\n },\n },\n {\n requires: [\"tableBlock\"],\n budget: { blocks: 1, tableChars: preferredChars },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n emitCtx.degradations.add({\n nodeType: \"table\",\n from: \"data_table\",\n to: \"table\",\n reason: \"dataTable unavailable; truncating to table block capacity\",\n path: emitCtx.path,\n });\n return [buildTableBlock(preferredTable, emitCtx)];\n },\n },\n ...markdownThenAscii(table, cellChars, \"native table unavailable\"),\n ];\n }\n\n // >200 data rows → split warning + first chunk as data_table / table\n const dataChunk = truncateRows(table, DATA_TABLE_MAX_DATA_ROWS + 1);\n const dataChunkChars = countEmittedCellChars(dataChunk, ctx);\n return [\n {\n requires: [\"dataTable\"],\n budget: { blocks: 1, dataTableChars: dataChunkChars },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n emitCtx.degradations.add({\n nodeType: \"table\",\n from: \"table\",\n to: \"data_table.split\",\n reason: `Table has ${String(dataRows)} data rows; emitting first ${String(DATA_TABLE_MAX_DATA_ROWS)}`,\n path: emitCtx.path,\n });\n return [buildDataTable(dataChunk, emitCtx)];\n },\n },\n ...markdownThenAscii(table, cellChars, \"oversized table\"),\n ];\n }\n}\n\nfunction markdownThenAscii(table: Table, cellChars: number, reason: string): Candidate[] {\n const md = toPipeMarkdown(table);\n return [\n {\n requires: [\"markdownBlock\"],\n budget: { blocks: 1, markdownChars: md.length },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n ctx.degradations.add({\n nodeType: \"table\",\n from: \"native_table\",\n to: \"markdown\",\n reason,\n path: ctx.path,\n });\n const block: MarkdownBlock = { type: \"markdown\", text: md };\n return [block];\n },\n },\n {\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n ctx.degradations.add({\n nodeType: \"table\",\n from: \"markdown\",\n to: \"ascii_preformatted\",\n reason: `${reason}; markdown unavailable (chars≈${String(cellChars)})`,\n path: ctx.path,\n });\n return [asciiTableBlock(table)];\n },\n },\n ];\n}\n\nfunction buildTableBlock(table: Table, ctx: ConversionContext): TableBlock {\n const rows = table.children.map((row, rowIndex) =>\n row.children.map((cell) => cellToSlack(cell, ctx, rowIndex === 0)),\n );\n return {\n type: \"table\",\n rows,\n column_settings: columnSettings(table),\n };\n}\n\nfunction buildDataTable(table: Table, ctx: ConversionContext): DataTableBlock {\n const captionRaw =\n ctx.precedingHeading !== undefined && ctx.precedingHeading.length > 0\n ? ctx.precedingHeading\n : \"Table\";\n const caption = captionRaw.slice(0, 150);\n if (captionRaw.length > 150) {\n ctx.degradations.add({\n nodeType: \"table\",\n from: \"data_table.caption\",\n to: \"truncated\",\n reason: \"data_table caption truncated to 150 chars\",\n path: ctx.path,\n });\n }\n const rows = table.children.map((row, rowIndex) =>\n row.children.map((cell) => {\n if (rowIndex === 0) {\n return { type: \"raw_text\" as const, text: toString(cell) };\n }\n return cellToSlack(cell, ctx, false);\n }),\n );\n return {\n type: \"data_table\",\n caption,\n rows,\n page_size: 5,\n row_header_column_index: 0,\n };\n}\n\nfunction cellToSlack(cell: MdastTableCell, ctx: ConversionContext, header: boolean): TableCell {\n const plain = toString(cell);\n const styled = cell.children.some(\n (c) =>\n c.type === \"strong\" ||\n c.type === \"emphasis\" ||\n c.type === \"delete\" ||\n c.type === \"link\" ||\n c.type === \"inlineCode\",\n );\n if (!styled) {\n // Header row titles must stay text — numeric-looking labels like \"2024\" are not values.\n if (!header && /^-?\\d+(\\.\\d+)?$/.test(plain.trim())) {\n const value = Number(plain.trim());\n return { type: \"raw_number\", value, text: plain.trim() };\n }\n return { type: \"raw_text\", text: plain };\n }\n const inline = emitPhrasing(cell.children, ctx);\n const rich: RichTextBlock = {\n type: \"rich_text\",\n elements: [\n {\n type: \"rich_text_section\",\n elements: inline.elements.length > 0 ? inline.elements : [{ type: \"text\", text: plain }],\n },\n ],\n };\n return rich;\n}\n\nfunction columnSettings(table: Table): ReadonlyArray<TableColumnSetting | null> {\n const align = table.align ?? [];\n const colCount = table.children[0]?.children.length ?? 0;\n const settings: Array<TableColumnSetting | null> = [];\n for (let i = 0; i < colCount; i += 1) {\n const a = align[i] as AlignType | null | undefined;\n const long = table.children.some(\n (row) =>\n toString(row.children[i] ?? { type: \"text\", value: \"\" }).length > TABLE_CELL_WRAP_THRESHOLD,\n );\n const alignVal = a === \"left\" || a === \"center\" || a === \"right\" ? a : undefined;\n if (alignVal === undefined && !long) {\n settings.push(null);\n } else {\n settings.push({\n align: alignVal,\n is_wrapped: long ? true : undefined,\n });\n }\n }\n return settings;\n}\n\nfunction countEmittedCellChars(table: Table, ctx: ConversionContext): number {\n const probe = ctx.withDegradations(new RecordingDegradationCollector());\n let n = 0;\n for (const [rowIndex, row] of table.children.entries()) {\n for (const cell of row.children) {\n n += slackCellCharCount(cellToSlack(cell, probe, rowIndex === 0));\n }\n }\n return n;\n}\n\nfunction slackCellCharCount(cell: TableCell): number {\n if (cell.type === \"raw_text\" || cell.type === \"raw_number\") {\n return cell.text.length;\n }\n return JSON.stringify(cell).length;\n}\n\nfunction truncateRows(table: Table, maxRows: number): Table {\n return {\n ...table,\n children: table.children.slice(0, maxRows),\n };\n}\n\nfunction toPipeMarkdown(table: Table): string {\n const rows = table.children.map((row) =>\n row.children.map((c) => toString(c).replace(/\\|/g, \"\\\\|\")),\n );\n if (rows.length === 0) {\n return \"\";\n }\n const header = rows[0] ?? [];\n const align = table.align ?? [];\n const sep = header.map((_, i) => {\n const a = align[i];\n if (a === \"center\") return \":---:\";\n if (a === \"right\") return \"---:\";\n if (a === \"left\") return \":---\";\n return \"---\";\n });\n const lines = [\n `| ${header.join(\" | \")} |`,\n `| ${sep.join(\" | \")} |`,\n ...rows.slice(1).map((r) => `| ${r.join(\" | \")} |`),\n ];\n return lines.join(\"\\n\");\n}\n\nfunction asciiTableBlock(table: Table): RichTextBlock {\n return preformattedRichText(toPipeMarkdown(table), undefined);\n}\n","import type { List, ListItem, RootContent } from \"mdast\";\nimport { toString } from \"mdast-util-to-string\";\n\nimport type {\n Block,\n MarkdownBlock,\n RichTextBlock,\n RichTextList,\n RichTextSection,\n} from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport { RICH_TEXT_LIST_INDENT_MAX } from \"../constants.js\";\n\nimport { isTaskList } from \"./list-adapter.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * Task lists → markdown block (checkboxes); fallback unicode in rich_text_list.\n */\nexport class TaskListAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"list\" && isTaskList(node);\n }\n\n plan(node: RootContent, _ctx: ConversionContext): ReadonlyArray<Candidate> {\n const list = node as List;\n const md = serializeTaskList(list);\n return [\n {\n requires: [\"markdownBlock\"],\n budget: { blocks: 1, markdownChars: md.length },\n emit: (): ReadonlyArray<Block> => {\n const block: MarkdownBlock = { type: \"markdown\", text: md };\n return [block];\n },\n },\n {\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n ctx.degradations.add({\n nodeType: \"list\",\n from: \"markdown.task_list\",\n to: \"rich_text_list.unicode_checkbox\",\n reason: \"markdownBlock unavailable or budget exhausted\",\n path: ctx.path,\n });\n return [unicodeTaskList(list, ctx)];\n },\n },\n ];\n }\n}\n\nfunction serializeTaskList(list: List, indent = 0): string {\n const pad = \" \".repeat(indent);\n const lines: string[] = [];\n for (const item of list.children) {\n const checked = item.checked === true;\n const box = checked ? \"[x]\" : \"[ ]\";\n const text = itemText(item);\n lines.push(`${pad}- ${box} ${text}`);\n for (const child of item.children) {\n if (child.type === \"list\") {\n lines.push(serializeTaskList(child, indent + 1));\n }\n }\n }\n return lines.join(\"\\n\");\n}\n\nfunction itemText(item: ListItem): string {\n const parts: string[] = [];\n for (const child of item.children) {\n if (child.type === \"paragraph\") {\n parts.push(toString(child));\n } else if (child.type !== \"list\") {\n parts.push(toString(child));\n }\n }\n return parts.join(\" \").trim();\n}\n\nfunction unicodeTaskList(list: List, ctx: ConversionContext): RichTextBlock {\n return {\n type: \"rich_text\",\n elements: emitUnicodeTaskTree(list, 0, ctx),\n };\n}\n\nfunction emitUnicodeTaskTree(\n list: List,\n indent: number,\n ctx: ConversionContext,\n): Array<RichTextList> {\n let effectiveIndent = indent;\n if (effectiveIndent > RICH_TEXT_LIST_INDENT_MAX) {\n ctx.degradations.add({\n nodeType: \"list\",\n from: `indent:${String(effectiveIndent)}`,\n to: `indent:${String(RICH_TEXT_LIST_INDENT_MAX)}`,\n reason: \"Task list indent clamped at 6\",\n path: ctx.path,\n });\n effectiveIndent = RICH_TEXT_LIST_INDENT_MAX;\n }\n\n const sections: RichTextSection[] = [];\n const nested: RichTextList[] = [];\n\n for (const item of list.children) {\n const prefix = item.checked === true ? \"☑ \" : item.checked === false ? \"☐ \" : \"\";\n sections.push({\n type: \"rich_text_section\",\n elements: [{ type: \"text\", text: `${prefix}${itemText(item)}` }],\n });\n for (const child of item.children) {\n if (child.type === \"list\") {\n nested.push(...emitUnicodeTaskTree(child, effectiveIndent + 1, ctx));\n }\n }\n }\n\n const primary: RichTextList = {\n type: \"rich_text_list\",\n style: \"bullet\",\n elements:\n sections.length > 0\n ? sections\n : [{ type: \"rich_text_section\", elements: [{ type: \"text\", text: \" \" }] }],\n indent: effectiveIndent,\n };\n\n return [primary, ...nested];\n}\n","import type { RootContent } from \"mdast\";\n\nimport type { Block } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\n\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * thematicBreak → divider.\n */\nexport class ThematicBreakAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"thematicBreak\";\n }\n\n plan(_node: RootContent, _ctx: ConversionContext): ReadonlyArray<Candidate> {\n return [\n {\n budget: { blocks: 1 },\n emit: (_ctx: ConversionContext): ReadonlyArray<Block> => [{ type: \"divider\" }],\n },\n ];\n }\n}\n","import { BlockquoteAdapter } from \"../adapters/blockquote-adapter.js\";\nimport { CodeFenceAdapter } from \"../adapters/code-fence-adapter.js\";\nimport { HeadingAdapter } from \"../adapters/heading-adapter.js\";\nimport { HtmlBlockAdapter } from \"../adapters/html-block-adapter.js\";\nimport { ListAdapter } from \"../adapters/list-adapter.js\";\nimport { MathBlockAdapter } from \"../adapters/math-block-adapter.js\";\nimport { MermaidFenceAdapter } from \"../adapters/mermaid-fence-adapter.js\";\nimport type { NodeAdapter } from \"../adapters/node-adapter.js\";\nimport { ParagraphAdapter } from \"../adapters/paragraph-adapter.js\";\nimport { SkipAdapter } from \"../adapters/skip-adapter.js\";\nimport { TableAdapter } from \"../adapters/table-adapter.js\";\nimport { TaskListAdapter } from \"../adapters/task-list-adapter.js\";\nimport { ThematicBreakAdapter } from \"../adapters/thematic-break-adapter.js\";\nimport { MessageAssembler } from \"../assemble/message-assembler.js\";\nimport { DeterministicPlainTextRenderer } from \"../assemble/text-fallback.js\";\nimport { MermaidPieParser } from \"../mermaid/mermaid-pie-parser.js\";\nimport { MermaidXyChartParser } from \"../mermaid/mermaid-xychart-parser.js\";\nimport { RemarkMarkdownParser } from \"../parsers/remark-markdown-parser.js\";\nimport { AdapterRegistry } from \"../registry/adapter-registry.js\";\nimport type {\n ConversionMessagesResult,\n ConversionResult,\n ConvertOptions,\n MarkdownParser,\n PlainTextRenderer,\n} from \"../types.js\";\nimport { OverflowMode } from \"../types.js\";\n\nimport { SlackMarkConverter } from \"./slackmark-converter.js\";\n\n/**\n * Options for the composition root. Extends per-call {@link ConvertOptions}\n * with injectable collaborators and user adapters (prepended).\n */\nexport interface CreateConverterOptions extends ConvertOptions {\n readonly adapters?: ReadonlyArray<NodeAdapter>;\n readonly parser?: MarkdownParser;\n readonly plainText?: PlainTextRenderer;\n}\n\n/**\n * Single composition root — wires default implementations.\n */\nexport function createConverter(options: CreateConverterOptions = {}): SlackMarkConverter {\n const parser = options.parser ?? new RemarkMarkdownParser();\n const plainText = options.plainText ?? new DeterministicPlainTextRenderer();\n const pieParser = new MermaidPieParser();\n const xyParser = new MermaidXyChartParser();\n\n const builtIns: NodeAdapter[] = [\n new MermaidFenceAdapter({ pieParser, xyParser }),\n new MathBlockAdapter(),\n new TaskListAdapter(),\n new ListAdapter(),\n new TableAdapter(),\n new HeadingAdapter(),\n new ParagraphAdapter(),\n new BlockquoteAdapter(),\n new CodeFenceAdapter(),\n new ThematicBreakAdapter(),\n new HtmlBlockAdapter(),\n new SkipAdapter(),\n ];\n\n const registry = new AdapterRegistry([...(options.adapters ?? []), ...builtIns]);\n const assembler = new MessageAssembler({ plainText });\n\n const defaultOptions: ConvertOptions = {\n capabilities: options.capabilities,\n capabilityOverrides: options.capabilityOverrides,\n overflow: options.overflow ?? OverflowMode.Degrade,\n strategy: options.strategy,\n renderers: options.renderers ?? [],\n uploader: options.uploader,\n enableMath: options.enableMath,\n enableFrontmatter: options.enableFrontmatter,\n mentionResolvers: options.mentionResolvers,\n };\n\n return new SlackMarkConverter({\n parser,\n registry,\n assembler,\n plainText,\n defaultOptions,\n });\n}\n\n/**\n * Convenience API — creates a default converter per call.\n */\nexport function convert(markdown: string, options?: ConvertOptions): Promise<ConversionResult> {\n return createConverter(options).convert(markdown, options);\n}\n\n/**\n * Convenience multi-message API.\n */\nexport function convertToMessages(\n markdown: string,\n options?: ConvertOptions,\n): Promise<ConversionMessagesResult> {\n return createConverter(options).convertToMessages(markdown, options);\n}\n","import type { Block, TableCell } from \"../blocks/types.js\";\nimport {\n CHART_LABEL_MAX_CHARS,\n CHART_POINTS_MAX,\n CHART_SEGMENTS_MAX,\n CHART_SERIES_MAX,\n CHART_TITLE_MAX_CHARS,\n CONTAINER_CHILDREN_MAX,\n CONTAINER_TITLE_MAX_CHARS,\n CONTEXT_ELEMENTS_MAX,\n DATA_TABLE_CELL_CHARS_MAX,\n DATA_TABLE_MAX_DATA_ROWS,\n DATA_VISUALIZATION_MAX_PER_MESSAGE,\n HEADER_TEXT_MAX_CHARS,\n IMAGE_ALT_MAX_CHARS,\n IMAGE_URL_MAX_CHARS,\n MARKDOWN_CUMULATIVE_MAX_CHARS,\n MAX_BLOCKS_PER_MESSAGE,\n SECTION_TEXT_MAX_CHARS,\n TABLE_CELL_CHARS_MAX,\n TABLE_MAX_COLS,\n TABLE_MAX_ROWS,\n} from \"../constants.js\";\n\nexport interface ValidationIssue {\n readonly path: string;\n readonly message: string;\n}\n\ndeclare const validatedBlocksBrand: unique symbol;\n\n/**\n * Blocks that have passed {@link validateBlocks}.\n */\nexport type ValidatedBlocks = ReadonlyArray<Block> & {\n readonly [validatedBlocksBrand]: true;\n};\n\n/**\n * Assert every documented Block Kit limit from the research doc.\n */\nexport function validateBlocks(blocks: ReadonlyArray<Block>): ValidatedBlocks {\n const issues: ValidationIssue[] = [];\n if (blocks.length > MAX_BLOCKS_PER_MESSAGE) {\n issues.push({\n path: \"$\",\n message: `Too many blocks: ${String(blocks.length)} > ${String(MAX_BLOCKS_PER_MESSAGE)}`,\n });\n }\n\n let markdownChars = 0;\n let tableChars = 0;\n let dataTableChars = 0;\n let charts = 0;\n\n blocks.forEach((block, i) => {\n const path = `blocks[${String(i)}]`;\n switch (block.type) {\n case \"header\":\n if (block.text.text.length > HEADER_TEXT_MAX_CHARS) {\n issues.push({ path, message: \"header text > 150\" });\n }\n if (block.level !== undefined && (block.level < 1 || block.level > 4)) {\n issues.push({ path, message: \"header level out of 1–4\" });\n }\n break;\n case \"section\":\n if (block.text !== undefined && block.text.text.length > SECTION_TEXT_MAX_CHARS) {\n issues.push({ path, message: \"section text > 3000\" });\n }\n break;\n case \"image\":\n if (block.alt_text.length > IMAGE_ALT_MAX_CHARS) {\n issues.push({ path, message: \"image alt > 2000\" });\n }\n if (block.image_url !== undefined && block.image_url.length > IMAGE_URL_MAX_CHARS) {\n issues.push({ path, message: \"image_url > 3000\" });\n }\n break;\n case \"context\":\n if (block.elements.length > CONTEXT_ELEMENTS_MAX) {\n issues.push({ path, message: \"context elements > 10\" });\n }\n break;\n case \"markdown\":\n markdownChars += block.text.length;\n break;\n case \"table\": {\n if (block.rows.length > TABLE_MAX_ROWS) {\n issues.push({ path, message: \"table rows > 100\" });\n }\n for (const row of block.rows) {\n if (row.length > TABLE_MAX_COLS) {\n issues.push({ path, message: \"table cols > 20\" });\n }\n for (const cell of row) {\n tableChars += cellCharCount(cell);\n }\n }\n break;\n }\n case \"data_table\": {\n if (block.rows.length > DATA_TABLE_MAX_DATA_ROWS + 1) {\n issues.push({ path, message: \"data_table rows > 201\" });\n }\n for (const row of block.rows) {\n if (row.length > TABLE_MAX_COLS) {\n issues.push({ path, message: \"data_table cols > 20\" });\n }\n for (const cell of row) {\n dataTableChars += cellCharCount(cell);\n }\n }\n break;\n }\n case \"data_visualization\":\n charts += 1;\n if (block.title.length > CHART_TITLE_MAX_CHARS) {\n issues.push({ path, message: \"chart title > 50\" });\n }\n validateChart(block, path, issues);\n break;\n case \"container\":\n if (block.child_blocks.length > CONTAINER_CHILDREN_MAX) {\n issues.push({ path, message: \"container children > 10\" });\n }\n if (block.title !== undefined && block.title.text.length > CONTAINER_TITLE_MAX_CHARS) {\n issues.push({ path, message: \"container title > 150\" });\n }\n break;\n case \"divider\":\n case \"rich_text\":\n break;\n default: {\n const exhaustive: never = block;\n void exhaustive;\n break;\n }\n }\n });\n\n if (markdownChars > MARKDOWN_CUMULATIVE_MAX_CHARS) {\n issues.push({\n path: \"$\",\n message: `markdown cumulative ${String(markdownChars)} > 12000`,\n });\n }\n if (tableChars > TABLE_CELL_CHARS_MAX) {\n issues.push({\n path: \"$\",\n message: `table chars ${String(tableChars)} > 10000`,\n });\n }\n if (dataTableChars > DATA_TABLE_CELL_CHARS_MAX) {\n issues.push({\n path: \"$\",\n message: `data_table chars ${String(dataTableChars)} > 20000`,\n });\n }\n if (charts > DATA_VISUALIZATION_MAX_PER_MESSAGE) {\n issues.push({\n path: \"$\",\n message: `charts ${String(charts)} > ${String(DATA_VISUALIZATION_MAX_PER_MESSAGE)}`,\n });\n }\n\n if (issues.length > 0) {\n const detail = issues.map((x) => `${x.path}: ${x.message}`).join(\"; \");\n throw new Error(`validateBlocks failed: ${detail}`);\n }\n\n return blocks as ValidatedBlocks;\n}\n\nfunction cellCharCount(cell: TableCell): number {\n if (cell.type === \"raw_text\") {\n return cell.text.length;\n }\n if (cell.type === \"raw_number\") {\n return cell.text.length;\n }\n return JSON.stringify(cell).length;\n}\n\nfunction validateChart(\n block: Extract<Block, { type: \"data_visualization\" }>,\n path: string,\n issues: ValidationIssue[],\n): void {\n const chart = block.chart;\n if (chart.type === \"pie\") {\n if (chart.segments.length < 1 || chart.segments.length > CHART_SEGMENTS_MAX) {\n issues.push({ path, message: \"pie segments out of 1–12\" });\n }\n for (const s of chart.segments) {\n if (s.label.length > CHART_LABEL_MAX_CHARS) {\n issues.push({ path, message: \"pie label > 20\" });\n }\n if (!(s.value > 0)) {\n issues.push({ path, message: \"pie value must be > 0\" });\n }\n }\n return;\n }\n if (chart.series.length < 1 || chart.series.length > CHART_SERIES_MAX) {\n issues.push({ path, message: \"series out of 1–12\" });\n }\n if (chart.axis_config.categories.length > CHART_POINTS_MAX) {\n issues.push({ path, message: \"categories > 20\" });\n }\n for (const s of chart.series) {\n if (s.name.length > CHART_LABEL_MAX_CHARS) {\n issues.push({ path, message: \"series name > 20\" });\n }\n if (s.data.length < 1 || s.data.length > CHART_POINTS_MAX) {\n issues.push({ path, message: \"points out of 1–20\" });\n }\n for (const p of s.data) {\n if (p.label.length > CHART_LABEL_MAX_CHARS) {\n issues.push({ path, message: \"point label > 20\" });\n }\n if (!chart.axis_config.categories.includes(p.label)) {\n issues.push({ path, message: `point label ${p.label} missing from categories` });\n }\n }\n }\n}\n"],"mappings":"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","names":["COMMENT_RE","toString","toString","toString","toString","toString","toString","toString","ctx","toString","toString","toString","_ctx"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/capabilities/capabilities.ts","../src/constants.ts","../src/budget/standard-budget-ledger.ts","../src/budget/recording-degradation-collector.ts","../src/budget/conversion-context.ts","../src/registry/adapter-registry.ts","../src/assert-never.ts","../src/utf16.ts","../src/types.ts","../src/assemble/message-assembler.ts","../src/assemble/text-fallback.ts","../src/parsers/remark-markdown-parser.ts","../src/mermaid/mermaid-pie-parser.ts","../src/mermaid/mermaid-xychart-parser.ts","../src/converter/slackmark-converter.ts","../src/converter/resolve-config.ts","../src/adapters/blockquote-adapter.ts","../src/adapters/inline.ts","../src/adapters/code-fence-adapter.ts","../src/adapters/heading-adapter.ts","../src/adapters/html-block-adapter.ts","../src/adapters/list-adapter.ts","../src/adapters/math-block-adapter.ts","../src/adapters/mermaid-fence-adapter.ts","../src/adapters/paragraph-adapter.ts","../src/adapters/skip-adapter.ts","../src/adapters/table-adapter.ts","../src/adapters/task-list-adapter.ts","../src/adapters/thematic-break-adapter.ts","../src/converter/create-converter.ts","../src/validate/validate-blocks.ts"],"sourcesContent":["/**\n * Programmer/configuration error thrown only from the composition root.\n */\nexport class ConfigurationError extends Error {\n override readonly name: string;\n\n constructor(message: string, options?: { readonly cause?: unknown }) {\n super(message, options?.cause !== undefined ? { cause: options.cause } : undefined);\n this.name = \"ConfigurationError\";\n }\n}\n","/**\n * Capability profiles keyed to Slack changelog dates.\n * @see design/mapping-matrix.md\n */\nimport { ConfigurationError } from \"../errors.js\";\n\nexport interface CapabilityFlags {\n readonly richText: boolean;\n readonly markdownBlock: boolean;\n readonly tableBlock: boolean;\n readonly preformattedLanguage: boolean;\n readonly headerLevel: boolean;\n readonly dataTable: boolean;\n readonly dataVisualization: boolean;\n readonly containerBlock: boolean;\n}\n\nexport type CapabilityFlag = keyof CapabilityFlags;\n\nexport const CapabilityPresetName = {\n Latest: \"latest\",\n Conservative: \"conservative\",\n D2025_02: \"2025-02\",\n D2025_08: \"2025-08\",\n D2026_03: \"2026-03\",\n D2026_05: \"2026-05\",\n D2026_06: \"2026-06\",\n} as const;\n\nexport type CapabilityPresetName = (typeof CapabilityPresetName)[keyof typeof CapabilityPresetName];\n\nconst ALL_OFF: CapabilityFlags = {\n richText: false,\n markdownBlock: false,\n tableBlock: false,\n preformattedLanguage: false,\n headerLevel: false,\n dataTable: false,\n dataVisualization: false,\n containerBlock: false,\n};\n\nconst CONSERVATIVE: CapabilityFlags = {\n ...ALL_OFF,\n richText: true,\n};\n\nconst P_2025_02: CapabilityFlags = {\n ...CONSERVATIVE,\n markdownBlock: true,\n};\n\nconst P_2025_08: CapabilityFlags = {\n ...P_2025_02,\n tableBlock: true,\n};\n\nconst P_2026_03: CapabilityFlags = {\n ...P_2025_08,\n preformattedLanguage: true,\n headerLevel: true,\n};\n\nconst P_2026_05: CapabilityFlags = {\n ...P_2026_03,\n dataTable: true,\n};\n\nconst P_2026_06: CapabilityFlags = {\n ...P_2026_05,\n dataVisualization: true,\n containerBlock: true,\n};\n\nconst LATEST: CapabilityFlags = { ...P_2026_06 };\n\nexport const CAPABILITY_PRESETS: {\n readonly latest: CapabilityFlags;\n readonly conservative: CapabilityFlags;\n readonly \"2025-02\": CapabilityFlags;\n readonly \"2025-08\": CapabilityFlags;\n readonly \"2026-03\": CapabilityFlags;\n readonly \"2026-05\": CapabilityFlags;\n readonly \"2026-06\": CapabilityFlags;\n} = {\n latest: LATEST,\n conservative: CONSERVATIVE,\n \"2025-02\": P_2025_02,\n \"2025-08\": P_2025_08,\n \"2026-03\": P_2026_03,\n \"2026-05\": P_2026_05,\n \"2026-06\": P_2026_06,\n};\n\nexport type CapabilityFlagsPartial = {\n readonly [K in CapabilityFlag]?: boolean;\n};\n\n/**\n * Resolve a preset name, flags object, or preset + overrides into immutable flags.\n * Unknown preset names throw {@link ConfigurationError}: silently substituting\n * `latest` would enable every capability behind a typo.\n */\nexport function resolveCapabilities(\n input: CapabilityPresetName | CapabilityFlags | CapabilityFlagsPartial | undefined,\n overrides?: CapabilityFlagsPartial,\n): CapabilityFlags {\n let base: CapabilityFlags;\n if (input === undefined) {\n base = CAPABILITY_PRESETS.latest;\n } else if (typeof input === \"string\") {\n const preset = isPresetName(input) ? CAPABILITY_PRESETS[input] : undefined;\n if (preset === undefined) {\n throw new ConfigurationError(\n `Unknown capability preset ${JSON.stringify(input)}; use one of: ${Object.keys(CAPABILITY_PRESETS).join(\", \")}.`,\n );\n }\n base = preset;\n } else if (isFullFlags(input)) {\n base = input;\n } else {\n base = { ...CAPABILITY_PRESETS.latest, ...input };\n }\n if (overrides === undefined) {\n return Object.freeze({ ...base });\n }\n return Object.freeze({ ...base, ...overrides });\n}\n\n// TS narrows string inputs to CapabilityPresetName, but JS callers can pass\n// any string; membership must be checked at runtime.\nfunction isPresetName(value: string): value is CapabilityPresetName {\n return Object.hasOwn(CAPABILITY_PRESETS, value);\n}\n\nfunction isFullFlags(value: CapabilityFlags | CapabilityFlagsPartial): value is CapabilityFlags {\n return (\n typeof value.richText === \"boolean\" &&\n typeof value.markdownBlock === \"boolean\" &&\n typeof value.tableBlock === \"boolean\" &&\n typeof value.preformattedLanguage === \"boolean\" &&\n typeof value.headerLevel === \"boolean\" &&\n typeof value.dataTable === \"boolean\" &&\n typeof value.dataVisualization === \"boolean\" &&\n typeof value.containerBlock === \"boolean\"\n );\n}\n","/**\n * Named Slack Block Kit limits.\n * Sources: https://docs.slack.dev/block-kit and block reference pages (July 2026 research).\n */\n\n/** https://docs.slack.dev/block-kit */\nexport const MAX_BLOCKS_PER_MESSAGE = 50;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/section-block */\nexport const SECTION_TEXT_MAX_CHARS = 3000;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/header-block */\nexport const HEADER_TEXT_MAX_CHARS = 150;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/header-block */\nexport const HEADER_LEVEL_MAX = 4;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/image-block */\nexport const IMAGE_URL_MAX_CHARS = 3000;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/image-block */\nexport const IMAGE_ALT_MAX_CHARS = 2000;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/context-block */\nexport const CONTEXT_ELEMENTS_MAX = 10;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/markdown-block */\nexport const MARKDOWN_CUMULATIVE_MAX_CHARS = 12_000;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/table-block */\nexport const TABLE_MAX_ROWS = 100;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/table-block */\nexport const TABLE_MAX_COLS = 20;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/table-block */\nexport const TABLE_CELL_CHARS_MAX = 10_000;\n\n/** Spec decision: prefer `table` up to this many rows (incl. header). */\nexport const TABLE_PREFERRED_MAX_ROWS = 50;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-table-block */\nexport const DATA_TABLE_MAX_DATA_ROWS = 200;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-table-block */\nexport const DATA_TABLE_CELL_CHARS_MAX = 20_000;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block */\nexport const CHART_TITLE_MAX_CHARS = 50;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block */\nexport const CHART_LABEL_MAX_CHARS = 20;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block */\nexport const CHART_SEGMENTS_MAX = 12;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block */\nexport const CHART_SERIES_MAX = 12;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block */\nexport const CHART_POINTS_MAX = 20;\n\n/**\n * Community-reported cap (ENG-4936); not in official docs.\n * Enforced defensively with degradation.\n */\nexport const DATA_VISUALIZATION_MAX_PER_MESSAGE = 2;\n\n/** https://docs.slack.dev/reference/methods/chat.postMessage#truncating */\nexport const MESSAGE_TEXT_SAFETY_MAX_CHARS = 40_000;\n\n/** Undocumented; defensive clamp for rich_text_list.indent. */\nexport const RICH_TEXT_LIST_INDENT_MAX = 6;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/container-block */\nexport const CONTAINER_CHILDREN_MAX = 10;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/container-block */\nexport const CONTAINER_TITLE_MAX_CHARS = 150;\n\n/** Cell wrap heuristic for table column_settings.is_wrapped. */\nexport const TABLE_CELL_WRAP_THRESHOLD = 40;\n\nexport const ELLIPSIS = \"…\";\n","import {\n DATA_TABLE_CELL_CHARS_MAX,\n DATA_VISUALIZATION_MAX_PER_MESSAGE,\n MARKDOWN_CUMULATIVE_MAX_CHARS,\n MAX_BLOCKS_PER_MESSAGE,\n MESSAGE_TEXT_SAFETY_MAX_CHARS,\n TABLE_CELL_CHARS_MAX,\n} from \"../constants.js\";\nimport type { BudgetClaim, BudgetLedger, BudgetSnapshot } from \"../types.js\";\n\nexport interface StandardBudgetLedgerOptions {\n /**\n * When false, the per-message chart cap is not enforced (used while emitting\n * a document that will be split; the assembler re-applies the cap per message).\n * Table/markdown/total char caps stay enforced so oversized single blocks cannot slip through.\n */\n readonly enforceChartCap?: boolean;\n}\n\n/**\n * O(1) running-total budget tracker for a single Slack message.\n */\nexport class StandardBudgetLedger implements BudgetLedger {\n readonly maxBlocks: number;\n private readonly enforceChartCap: boolean;\n private blocks: number;\n private tableChars: number;\n private dataTableChars: number;\n private markdownChars: number;\n private charts: number;\n private totalChars: number;\n\n constructor(maxBlocks: number = MAX_BLOCKS_PER_MESSAGE, options?: StandardBudgetLedgerOptions) {\n this.maxBlocks = maxBlocks;\n this.enforceChartCap = options?.enforceChartCap ?? true;\n this.blocks = 0;\n this.tableChars = 0;\n this.dataTableChars = 0;\n this.markdownChars = 0;\n this.charts = 0;\n this.totalChars = 0;\n }\n\n tryReserveClaim(claim: BudgetClaim | undefined): boolean {\n if (claim === undefined) {\n return true;\n }\n const nextBlocks = this.blocks + (claim.blocks ?? 0);\n const nextTable = this.tableChars + (claim.tableChars ?? 0);\n const nextData = this.dataTableChars + (claim.dataTableChars ?? 0);\n const nextMd = this.markdownChars + (claim.markdownChars ?? 0);\n const nextCharts = this.charts + (claim.chart === true ? 1 : 0);\n const nextTotal = this.totalChars + (claim.totalChars ?? 0);\n\n if (nextBlocks > this.maxBlocks) return false;\n if (nextTable > TABLE_CELL_CHARS_MAX) return false;\n if (nextData > DATA_TABLE_CELL_CHARS_MAX) return false;\n if (nextMd > MARKDOWN_CUMULATIVE_MAX_CHARS) return false;\n if (this.enforceChartCap && nextCharts > DATA_VISUALIZATION_MAX_PER_MESSAGE) return false;\n if (nextTotal > MESSAGE_TEXT_SAFETY_MAX_CHARS) return false;\n\n this.blocks = nextBlocks;\n this.tableChars = nextTable;\n this.dataTableChars = nextData;\n this.markdownChars = nextMd;\n this.charts = nextCharts;\n this.totalChars = nextTotal;\n return true;\n }\n\n snapshot(): BudgetSnapshot {\n return {\n blocks: this.blocks,\n tableChars: this.tableChars,\n dataTableChars: this.dataTableChars,\n markdownChars: this.markdownChars,\n charts: this.charts,\n totalChars: this.totalChars,\n };\n }\n\n restore(snapshot: BudgetSnapshot): void {\n this.blocks = snapshot.blocks;\n this.tableChars = snapshot.tableChars;\n this.dataTableChars = snapshot.dataTableChars;\n this.markdownChars = snapshot.markdownChars;\n this.charts = snapshot.charts;\n this.totalChars = snapshot.totalChars;\n }\n\n resetForNewMessage(): void {\n this.blocks = 0;\n this.tableChars = 0;\n this.dataTableChars = 0;\n this.markdownChars = 0;\n this.charts = 0;\n this.totalChars = 0;\n }\n}\n","import type { Degradation, DegradationCollector } from \"../types.js\";\n\n/**\n * In-memory degradation collector for one conversion.\n */\nexport class RecordingDegradationCollector implements DegradationCollector {\n private readonly items: Degradation[];\n\n constructor() {\n this.items = [];\n }\n\n add(d: Degradation): void {\n this.items.push(d);\n }\n\n all(): ReadonlyArray<Degradation> {\n return this.items.slice();\n }\n}\n","import type { Definition, FootnoteDefinition } from \"mdast\";\n\nimport type { CapabilityFlags } from \"../capabilities/capabilities.js\";\nimport type {\n BudgetLedger,\n ConversionStrategy,\n DegradationCollector,\n ImageRenderer,\n MentionResolvers,\n OverflowMode,\n SlackUploader,\n} from \"../types.js\";\n\n/**\n * Immutable resolved config for one conversion.\n */\nexport interface ResolvedConfig {\n readonly capabilities: CapabilityFlags;\n readonly overflow: OverflowMode;\n readonly strategy: ConversionStrategy;\n readonly renderers: ReadonlyArray<ImageRenderer>;\n readonly uploader: SlackUploader | undefined;\n readonly enableMath: boolean;\n readonly enableFrontmatter: boolean;\n readonly mentionResolvers: MentionResolvers | undefined;\n}\n\nexport interface ConversionContextDeps {\n readonly config: ResolvedConfig;\n readonly budget: BudgetLedger;\n readonly degradations: DegradationCollector;\n readonly definitions: ReadonlyMap<string, Definition>;\n readonly footnotes: ReadonlyMap<string, FootnoteDefinition>;\n readonly footnoteOrder: ReadonlyArray<string>;\n readonly precedingHeading: string | undefined;\n readonly path: string;\n}\n\n/**\n * Per-call conversion state. Never stored on converter instances.\n */\nexport class ConversionContext {\n readonly config: ResolvedConfig;\n readonly budget: BudgetLedger;\n readonly degradations: DegradationCollector;\n readonly definitions: ReadonlyMap<string, Definition>;\n readonly footnotes: ReadonlyMap<string, FootnoteDefinition>;\n readonly footnoteOrder: ReadonlyArray<string>;\n readonly precedingHeading: string | undefined;\n readonly path: string;\n\n constructor(deps: ConversionContextDeps) {\n this.config = deps.config;\n this.budget = deps.budget;\n this.degradations = deps.degradations;\n this.definitions = deps.definitions;\n this.footnotes = deps.footnotes;\n this.footnoteOrder = deps.footnoteOrder;\n this.precedingHeading = deps.precedingHeading;\n this.path = deps.path;\n }\n\n withDegradations(degradations: DegradationCollector): ConversionContext {\n return new ConversionContext({\n config: this.config,\n budget: this.budget,\n degradations,\n definitions: this.definitions,\n footnotes: this.footnotes,\n footnoteOrder: this.footnoteOrder,\n precedingHeading: this.precedingHeading,\n path: this.path,\n });\n }\n}\n","import type { RootContent } from \"mdast\";\n\nimport type { NodeAdapter } from \"../adapters/node-adapter.js\";\nimport type { Block } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport type { CapabilityFlag } from \"../capabilities/capabilities.js\";\n\n/**\n * First-matching adapter wins; candidates tried in order with capability/budget gates.\n */\nexport class AdapterRegistry {\n private readonly adapters: ReadonlyArray<NodeAdapter>;\n\n constructor(adapters: ReadonlyArray<NodeAdapter>) {\n this.adapters = adapters;\n }\n\n async emit(node: RootContent, ctx: ConversionContext): Promise<ReadonlyArray<Block>> {\n for (const adapter of this.adapters) {\n if (!adapter.match(node, ctx)) {\n continue;\n }\n const candidates = adapter.plan(node, ctx);\n let budgetBlocked = false;\n let emittedEmpty = false;\n for (const candidate of candidates) {\n if (!capabilitiesAllow(candidate.requires, ctx)) {\n continue;\n }\n const beforeClaim = ctx.budget.snapshot();\n if (!ctx.budget.tryReserveClaim(candidate.budget)) {\n budgetBlocked = true;\n continue;\n }\n const blocks = await candidate.emit(ctx);\n if (blocks.length === 0) {\n // Release the reservation and try the next candidate (e.g. mermaid fallback).\n ctx.budget.restore(beforeClaim);\n emittedEmpty = true;\n continue;\n }\n return blocks;\n }\n // Intentional empty emits (SkipAdapter, empty HTML) already recorded their own\n // degradations; do not double-flag when nothing was budget-blocked.\n if (emittedEmpty && !budgetBlocked) {\n return [];\n }\n ctx.degradations.add({\n nodeType: node.type,\n from: \"adapter\",\n to: \"empty\",\n reason: budgetBlocked\n ? \"Message budget exhausted (blocks/chars/charts); content omitted\"\n : \"All candidates failed capability/budget gates\",\n path: ctx.path,\n });\n return [];\n }\n\n ctx.degradations.add({\n nodeType: node.type,\n from: node.type,\n to: \"skip\",\n reason: \"No adapter matched node\",\n path: ctx.path,\n });\n return [];\n }\n}\n\nfunction capabilitiesAllow(\n requires: ReadonlyArray<CapabilityFlag> | undefined,\n ctx: ConversionContext,\n): boolean {\n if (requires === undefined) {\n return true;\n }\n for (const flag of requires) {\n if (!ctx.config.capabilities[flag]) {\n return false;\n }\n }\n return true;\n}\n","/**\n * Exhaustiveness helper for discriminated unions.\n */\nexport function assertNever(value: never, message?: string): never {\n const detail = message ?? \"Unexpected value\";\n throw new Error(`${detail}: ${JSON.stringify(value)}`);\n}\n","/**\n * Surrogate-pair-safe string truncation.\n *\n * `String.prototype.slice` counts UTF-16 code units, so a cut can land between\n * the high and low half of a surrogate pair (astral chars: emoji, some CJK).\n * A lone surrogate is malformed UTF-16 — Slack rejects such payloads with\n * `invalid_blocks` — so every truncation site must back off one unit instead.\n * Unicode ranges: https://unicode.org/faq/utf_bom.html#utf16-2\n */\n\nconst HIGH_SURROGATE_MIN = 0xd800;\nconst HIGH_SURROGATE_MAX = 0xdbff;\nconst LOW_SURROGATE_MIN = 0xdc00;\nconst LOW_SURROGATE_MAX = 0xdfff;\n\n/**\n * Largest cut index ≤ `end` that does not split a surrogate pair in `text`.\n * `end` is clamped into `[0, text.length]`.\n */\nexport function surrogateSafeEnd(text: string, end: number): number {\n if (end <= 0) {\n return 0;\n }\n if (end >= text.length) {\n return text.length;\n }\n const before = text.charCodeAt(end - 1);\n const after = text.charCodeAt(end);\n if (\n before >= HIGH_SURROGATE_MIN &&\n before <= HIGH_SURROGATE_MAX &&\n after >= LOW_SURROGATE_MIN &&\n after <= LOW_SURROGATE_MAX\n ) {\n return end - 1;\n }\n return end;\n}\n\n/**\n * `text.slice(0, max)` that never splits a surrogate pair: when the cut would\n * land mid-pair, the whole pair is dropped (result is `max - 1` units).\n */\nexport function sliceSurrogateSafe(text: string, max: number): string {\n return text.slice(0, surrogateSafeEnd(text, max));\n}\n","import type { Root } from \"mdast\";\n\nimport type { Block } from \"./blocks/types.js\";\nimport type {\n CapabilityFlags,\n CapabilityFlagsPartial,\n CapabilityPresetName,\n} from \"./capabilities/capabilities.js\";\n\n/**\n * Structured degradation emitted when content falls back or is truncated.\n */\nexport interface Degradation {\n readonly nodeType: string;\n readonly from: string;\n readonly to: string;\n readonly reason: string;\n readonly path: string;\n}\n\n/**\n * Total conversion result — never throws on user markdown.\n */\nexport interface ConversionResult {\n readonly blocks: ReadonlyArray<Block>;\n readonly text: string;\n readonly degradations: ReadonlyArray<Degradation>;\n}\n\n/**\n * One message chunk from multi-message conversion.\n */\nexport interface ConversionMessage {\n readonly blocks: ReadonlyArray<Block>;\n readonly text: string;\n}\n\n/**\n * Multi-message conversion result.\n */\nexport interface ConversionMessagesResult {\n readonly messages: ReadonlyArray<ConversionMessage>;\n readonly degradations: ReadonlyArray<Degradation>;\n}\n\nexport const OverflowMode = {\n Degrade: \"degrade\",\n Split: \"split\",\n} as const;\n\nexport type OverflowMode = (typeof OverflowMode)[keyof typeof OverflowMode];\n\nexport const ConversionStrategy = {\n RichTextFirst: \"rich-text-first\",\n MarkdownBlock: \"markdown-block\",\n} as const;\n\nexport type ConversionStrategy = (typeof ConversionStrategy)[keyof typeof ConversionStrategy];\n\n/**\n * Request passed to {@link ImageRenderer}.\n */\nexport interface RenderRequest {\n readonly lang: string;\n readonly source: string;\n readonly altText: string;\n}\n\nexport type BytesImage = {\n readonly kind: \"bytes\";\n readonly data: Uint8Array;\n readonly mimeType: \"image/png\" | \"image/jpeg\" | \"image/gif\";\n readonly filename: string;\n};\n\nexport type UrlImage = {\n readonly kind: \"url\";\n readonly imageUrl: string;\n};\n\nexport type RenderedImage = UrlImage | BytesImage;\n\n/**\n * Pluggable image renderer for mermaid/math/diagram fences (phase-2 adapters).\n */\nexport interface ImageRenderer {\n canRender(req: RenderRequest): boolean;\n render(req: RenderRequest): Promise<(RenderedImage & { readonly altText: string }) | null>;\n}\n\n/**\n * Uploads bytes-producing renderer output to Slack files API.\n */\nexport interface SlackUploader {\n upload(img: BytesImage): Promise<{ readonly fileId: string }>;\n}\n\n/**\n * Optional mention resolvers (off by default).\n */\nexport interface MentionResolvers {\n readonly resolveUser?: (handle: string) => string | undefined;\n readonly resolveChannel?: (name: string) => string | undefined;\n}\n\n/**\n * Public conversion options (per-call).\n * Custom adapters are wired via {@link createConverter}, not per-call options.\n */\nexport interface ConvertOptions {\n readonly capabilities?:\n | CapabilityPresetName\n | CapabilityFlags\n | CapabilityFlagsPartial\n | undefined;\n readonly capabilityOverrides?: CapabilityFlagsPartial | undefined;\n readonly overflow?: OverflowMode | undefined;\n readonly strategy?: ConversionStrategy | undefined;\n readonly renderers?: ReadonlyArray<ImageRenderer> | undefined;\n readonly uploader?: SlackUploader | undefined;\n readonly enableMath?: boolean | undefined;\n readonly enableFrontmatter?: boolean | undefined;\n readonly mentionResolvers?: MentionResolvers | undefined;\n}\n\n/**\n * Collects degradations during a single conversion.\n */\nexport interface DegradationCollector {\n add(d: Degradation): void;\n all(): ReadonlyArray<Degradation>;\n}\n\n/**\n * Budget reservation claimed while planning a candidate.\n */\nexport interface BudgetClaim {\n readonly blocks?: number;\n readonly tableChars?: number;\n readonly dataTableChars?: number;\n readonly markdownChars?: number;\n readonly chart?: boolean;\n readonly totalChars?: number;\n}\n\n/**\n * Message-wide budget ledger.\n */\nexport interface BudgetLedger {\n readonly maxBlocks: number;\n tryReserveClaim(claim: BudgetClaim | undefined): boolean;\n snapshot(): BudgetSnapshot;\n /** Restore counters to a prior {@link snapshot} (e.g. after an empty emit). */\n restore(snapshot: BudgetSnapshot): void;\n resetForNewMessage(): void;\n}\n\nexport interface BudgetSnapshot {\n readonly blocks: number;\n readonly tableChars: number;\n readonly dataTableChars: number;\n readonly markdownChars: number;\n readonly charts: number;\n readonly totalChars: number;\n}\n\n/**\n * Deterministic markdown → plain text for notification fallbacks.\n */\nexport interface PlainTextRenderer {\n render(markdown: string): string;\n renderFromBlocks(blocks: ReadonlyArray<Block>): string;\n}\n\n/**\n * Swappable markdown parser (wraps remark by default).\n */\nexport interface MarkdownParser {\n parse(markdown: string, options: ParserOptions): Promise<Root>;\n}\n\nexport interface ParserOptions {\n readonly enableMath: boolean;\n readonly enableFrontmatter: boolean;\n}\n\n/**\n * Mermaid chart grammar parser (pie / xychart).\n */\nexport interface MermaidChartParser {\n parse(source: string): MermaidParseResult;\n}\n\nexport type MermaidParseResult =\n | { readonly ok: true; readonly value: MermaidPieAst | MermaidXyChartAst }\n | { readonly ok: false; readonly reason: string };\n\nexport interface MermaidPieAst {\n readonly kind: \"pie\";\n readonly title: string | undefined;\n readonly segments: ReadonlyArray<{ readonly label: string; readonly value: number }>;\n}\n\nexport interface MermaidXyChartAst {\n readonly kind: \"xychart-beta\";\n readonly title: string | undefined;\n readonly categories: ReadonlyArray<string>;\n readonly xLabel: string | undefined;\n readonly yLabel: string | undefined;\n readonly bars: ReadonlyArray<ReadonlyArray<number>>;\n readonly lines: ReadonlyArray<ReadonlyArray<number>>;\n}\n","import { assertNever } from \"../assert-never.js\";\nimport type {\n Block,\n DataTableBlock,\n RichTextBlock,\n RichTextElement,\n TableBlock,\n TableCell,\n} from \"../blocks/types.js\";\nimport { StandardBudgetLedger } from \"../budget/standard-budget-ledger.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport {\n CONTEXT_ELEMENTS_MAX,\n MAX_BLOCKS_PER_MESSAGE,\n MESSAGE_TEXT_SAFETY_MAX_CHARS,\n SECTION_TEXT_MAX_CHARS,\n} from \"../constants.js\";\nimport type {\n BudgetClaim,\n ConversionMessage,\n DegradationCollector,\n PlainTextRenderer,\n} from \"../types.js\";\nimport { sliceSurrogateSafe } from \"../utf16.js\";\nimport { OverflowMode as Overflow } from \"../types.js\";\n\nexport interface MessageAssemblerDeps {\n readonly plainText: PlainTextRenderer;\n}\n\n/**\n * Packs blocks into messages, coalesces adjacent rich_text, attaches footnotes.\n */\nexport class MessageAssembler {\n private readonly plainText: PlainTextRenderer;\n\n constructor(deps: MessageAssemblerDeps) {\n this.plainText = deps.plainText;\n }\n\n assemble(\n blocks: ReadonlyArray<Block>,\n ctx: ConversionContext,\n footnoteBlocks: ReadonlyArray<Block>,\n ): ReadonlyArray<ConversionMessage> {\n const coalesced = coalesceRichText(blocks);\n\n if (ctx.config.overflow === Overflow.Split) {\n return this.splitMessages([...coalesced, ...footnoteBlocks], ctx);\n }\n\n // Degrade: reserve trailing slots for footnotes so they are not sliced off.\n const noteCount = footnoteBlocks.length;\n const bodyCap = Math.max(0, MAX_BLOCKS_PER_MESSAGE - noteCount);\n const clippedBody = coalesced.slice(0, bodyCap);\n if (coalesced.length > bodyCap) {\n ctx.degradations.add({\n nodeType: \"message\",\n from: `${String(coalesced.length)} body blocks`,\n to: `${String(bodyCap)} body blocks`,\n reason:\n noteCount > 0\n ? `overflow=degrade truncated body to reserve ${String(noteCount)} footnote blocks`\n : \"overflow=degrade truncated to 50 blocks\",\n path: ctx.path,\n });\n }\n\n let notes = footnoteBlocks;\n if (notes.length > MAX_BLOCKS_PER_MESSAGE) {\n notes = footnoteBlocks.slice(0, MAX_BLOCKS_PER_MESSAGE);\n ctx.degradations.add({\n nodeType: \"footnote\",\n from: `${String(footnoteBlocks.length)} footnote blocks`,\n to: `${String(MAX_BLOCKS_PER_MESSAGE)} footnote blocks`,\n reason: \"Footnote blocks alone exceed 50; truncated\",\n path: ctx.path,\n });\n }\n\n const finalBlocks = [...clippedBody, ...notes];\n return [this.toMessage(finalBlocks, ctx)];\n }\n\n private splitMessages(\n blocks: ReadonlyArray<Block>,\n ctx: ConversionContext,\n ): ReadonlyArray<ConversionMessage> {\n const messages: ConversionMessage[] = [];\n let current: Block[] = [];\n let ledger = new StandardBudgetLedger(MAX_BLOCKS_PER_MESSAGE);\n\n const flush = (): void => {\n if (current.length === 0) {\n return;\n }\n messages.push(this.toMessage(current, ctx));\n current = [];\n ledger = new StandardBudgetLedger(MAX_BLOCKS_PER_MESSAGE);\n };\n\n for (const block of blocks) {\n const claim = claimForBlock(block);\n if (!ledger.tryReserveClaim(claim)) {\n flush();\n if (!ledger.tryReserveClaim(claim)) {\n // Single block exceeds an empty message budget (e.g. oversized table) — omit.\n ctx.degradations.add({\n nodeType: \"message\",\n from: block.type,\n to: \"omitted\",\n reason: \"Block exceeds per-message budget; omitted\",\n path: ctx.path,\n });\n continue;\n }\n }\n current.push(block);\n }\n flush();\n\n if (messages.length > 1) {\n ctx.degradations.add({\n nodeType: \"message\",\n from: \"single\",\n to: `${String(messages.length)} messages`,\n reason: \"Split at semantic block boundaries (per-message budgets)\",\n path: ctx.path,\n });\n }\n\n return messages.length > 0 ? messages : [{ blocks: [], text: \" \" }];\n }\n\n private toMessage(blocks: ReadonlyArray<Block>, ctx: ConversionContext): ConversionMessage {\n const raw = this.plainText.renderFromBlocks(blocks);\n if (raw.length <= MESSAGE_TEXT_SAFETY_MAX_CHARS) {\n return { blocks, text: raw };\n }\n ctx.degradations.add({\n nodeType: \"message\",\n from: `${String(raw.length)} text chars`,\n to: `${String(MESSAGE_TEXT_SAFETY_MAX_CHARS)} text chars`,\n reason: \"Notification text truncated to 40k safety limit\",\n path: ctx.path,\n });\n return { blocks, text: sliceSurrogateSafe(raw, MESSAGE_TEXT_SAFETY_MAX_CHARS) };\n }\n}\n\n/**\n * Build trailing divider + context chunks for footnotes.\n */\nexport function buildFootnoteBlocks(\n entries: ReadonlyArray<{ readonly n: number; readonly text: string }>,\n degradations?: DegradationCollector,\n): ReadonlyArray<Block> {\n if (entries.length === 0) {\n return [];\n }\n const blocks: Block[] = [{ type: \"divider\" }];\n const elements: ContextBlockElements = [];\n for (const e of entries) {\n const note = `[${String(e.n)}] ${e.text}`;\n if (note.length > SECTION_TEXT_MAX_CHARS) {\n degradations?.add({\n nodeType: \"footnote\",\n from: `${String(note.length)} chars`,\n to: `${String(SECTION_TEXT_MAX_CHARS)} chars`,\n reason: \"Footnote context text truncated to 3000 chars\",\n path: \"footnote\",\n });\n elements.push({ type: \"mrkdwn\", text: sliceSurrogateSafe(note, SECTION_TEXT_MAX_CHARS) });\n } else {\n elements.push({ type: \"mrkdwn\", text: note });\n }\n }\n for (let i = 0; i < elements.length; i += CONTEXT_ELEMENTS_MAX) {\n const chunk = elements.slice(i, i + CONTEXT_ELEMENTS_MAX);\n blocks.push({ type: \"context\", elements: chunk });\n }\n return blocks;\n}\n\ntype ContextBlockElements = Array<{ type: \"mrkdwn\"; text: string }>;\n\nfunction claimForBlock(block: Block): BudgetClaim {\n switch (block.type) {\n case \"data_visualization\":\n return { blocks: 1, chart: true };\n case \"markdown\":\n return { blocks: 1, markdownChars: block.text.length };\n case \"table\":\n return { blocks: 1, tableChars: countEmittedTableChars(block) };\n case \"data_table\":\n return { blocks: 1, dataTableChars: countEmittedTableChars(block) };\n case \"rich_text\":\n case \"header\":\n case \"divider\":\n case \"section\":\n case \"image\":\n case \"context\":\n case \"container\":\n return { blocks: 1 };\n default:\n return assertNever(block);\n }\n}\n\nfunction countEmittedTableChars(block: TableBlock | DataTableBlock): number {\n let total = 0;\n for (const row of block.rows) {\n for (const cell of row) {\n total += cellTextLength(cell);\n }\n }\n return total;\n}\n\nfunction cellTextLength(cell: TableCell): number {\n if (cell.type === \"raw_text\" || cell.type === \"raw_number\") {\n return cell.text.length;\n }\n // rich_text cell — approximate via JSON length of text nodes\n return JSON.stringify(cell).length;\n}\n\nfunction coalesceRichText(blocks: ReadonlyArray<Block>): Block[] {\n const out: Block[] = [];\n let pending: RichTextElement[] | undefined;\n\n const flushPending = (): void => {\n if (pending === undefined || pending.length === 0) {\n pending = undefined;\n return;\n }\n const block: RichTextBlock = { type: \"rich_text\", elements: pending };\n out.push(block);\n pending = undefined;\n };\n\n for (const block of blocks) {\n if (block.type === \"rich_text\" && isCoalescable(block)) {\n if (pending === undefined) {\n pending = [...block.elements];\n } else {\n pending.push(...block.elements);\n }\n } else {\n flushPending();\n out.push(block);\n }\n }\n flushPending();\n return out;\n}\n\nfunction isCoalescable(block: RichTextBlock): boolean {\n // Only coalesce pure section flow; leave lists/quotes/preformatted alone as unit\n return block.elements.every((e) => e.type === \"rich_text_section\");\n}\n","import type { Block, RichTextElement, RichTextInline } from \"../blocks/types.js\";\nimport type { PlainTextRenderer } from \"../types.js\";\n\n/**\n * Deterministic plain-text renderer for notifications / screen readers.\n */\nexport class DeterministicPlainTextRenderer implements PlainTextRenderer {\n render(markdown: string): string {\n const parts: string[] = [];\n // Lightweight strip — full fidelity comes from renderFromBlocks after convert.\n let i = 0;\n const src = markdown;\n while (i < src.length) {\n if (src.startsWith(\"```\", i)) {\n const end = src.indexOf(\"```\", i + 3);\n if (end === -1) {\n parts.push(src.slice(i + 3));\n break;\n }\n parts.push(src.slice(i + 3, end).trim());\n i = end + 3;\n continue;\n }\n parts.push(src[i] ?? \"\");\n i += 1;\n }\n const raw = parts\n .join(\"\")\n .replace(/!\\[[^\\]]{0,200}\\]\\([^)]{0,3000}\\)/g, \" \")\n .replace(/\\[([^\\]]{0,200})\\]\\([^)]{0,3000}\\)/g, \"$1\")\n .replace(/[#>*_`~]/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n return raw.length > 0 ? raw : \" \";\n }\n\n renderFromBlocks(blocks: ReadonlyArray<Block>): string {\n const parts: string[] = [];\n for (const block of blocks) {\n switch (block.type) {\n case \"header\":\n parts.push(block.text.text);\n break;\n case \"section\":\n if (block.text !== undefined) {\n parts.push(stripMrkdwn(block.text.text));\n }\n break;\n case \"rich_text\":\n parts.push(richTextToPlain(block.elements));\n break;\n case \"markdown\":\n parts.push(this.render(block.text));\n break;\n case \"divider\":\n parts.push(\"---\");\n break;\n case \"image\":\n parts.push(block.alt_text);\n break;\n case \"context\":\n for (const el of block.elements) {\n if (el.type === \"mrkdwn\" || el.type === \"plain_text\") {\n parts.push(stripMrkdwn(el.text));\n }\n }\n break;\n case \"table\":\n case \"data_table\":\n parts.push(tableToPlain(block.rows));\n break;\n case \"data_visualization\":\n parts.push(block.title);\n break;\n case \"container\":\n if (block.title !== undefined) {\n parts.push(block.title.text);\n }\n parts.push(this.renderFromBlocks(block.child_blocks));\n break;\n default:\n break;\n }\n }\n const text = parts\n .map((p) => p.trim())\n .filter((p) => p.length > 0)\n .join(\"\\n\")\n .trim();\n return text.length > 0 ? text : \" \";\n }\n}\n\nfunction stripMrkdwn(text: string): string {\n return text\n .replace(/<([^|>]{1,3000})\\|([^>]{0,500})>/g, \"$2\")\n .replace(/<([^>]{1,3000})>/g, \"$1\")\n .replace(/[*_~`]/g, \"\");\n}\n\nfunction richTextToPlain(elements: ReadonlyArray<RichTextElement>): string {\n const parts: string[] = [];\n for (const el of elements) {\n switch (el.type) {\n case \"rich_text_section\":\n case \"rich_text_quote\":\n parts.push(inlinesToPlain(el.elements));\n break;\n case \"rich_text_list\":\n for (const item of el.elements) {\n parts.push(`• ${inlinesToPlain(item.elements)}`);\n }\n break;\n case \"rich_text_preformatted\":\n parts.push(inlinesToPlain(el.elements));\n break;\n default:\n break;\n }\n }\n return parts.join(\"\\n\");\n}\n\nfunction inlinesToPlain(elements: ReadonlyArray<RichTextInline>): string {\n const parts: string[] = [];\n for (const el of elements) {\n switch (el.type) {\n case \"text\":\n parts.push(el.text);\n break;\n case \"link\":\n parts.push(el.text ?? el.url);\n break;\n case \"emoji\":\n parts.push(`:${el.name}:`);\n break;\n case \"user\":\n parts.push(`@${el.user_id}`);\n break;\n case \"channel\":\n parts.push(`#${el.channel_id}`);\n break;\n case \"usergroup\":\n parts.push(`@${el.usergroup_id}`);\n break;\n case \"broadcast\":\n parts.push(`@${el.range}`);\n break;\n case \"date\":\n parts.push(el.fallback ?? formatDateTokensUtc(el.timestamp, el.format));\n break;\n default:\n break;\n }\n }\n return parts.join(\"\");\n}\n\nconst DATE_TOKEN_RE = /\\{([a-z_]+)\\}/g;\n\nconst MONTHS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n] as const;\n\nconst WEEKDAYS = [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n] as const;\n\nfunction pad2(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nfunction ordinal(value: number): string {\n const remainder = value % 100;\n if (remainder >= 11 && remainder <= 13) {\n return `${String(value)}th`;\n }\n switch (value % 10) {\n case 1:\n return `${String(value)}st`;\n case 2:\n return `${String(value)}nd`;\n case 3:\n return `${String(value)}rd`;\n default:\n return `${String(value)}th`;\n }\n}\n\n/** One Slack date-format token rendered in UTC, or undefined when unsupported. */\nfunction dateToken(token: string, date: Date): string | undefined {\n const day = date.getUTCDate();\n const month = MONTHS[date.getUTCMonth()] ?? \"\";\n const shortMonth = month.slice(0, 3);\n const weekday = WEEKDAYS[date.getUTCDay()] ?? \"\";\n const year = date.getUTCFullYear();\n\n switch (token) {\n case \"date_num\":\n return `${String(year)}-${pad2(date.getUTCMonth() + 1)}-${pad2(day)}`;\n // Slack renders {date_slash} month-first: 02/18/2014 (docs example for\n // timestamp 1392734382).\n case \"date_slash\":\n return `${pad2(date.getUTCMonth() + 1)}/${pad2(day)}/${String(year)}`;\n case \"date_long\":\n case \"date_long_pretty\":\n return `${weekday}, ${month} ${ordinal(day)}, ${String(year)}`;\n case \"date_long_full\":\n return `${month} ${String(day)}, ${String(year)}`;\n // {date} renders \"February 18th, 2014\" (ordinal + year), not \"February 18\".\n case \"date\":\n case \"date_pretty\":\n return `${month} ${ordinal(day)}, ${String(year)}`;\n case \"date_short\":\n case \"date_short_pretty\":\n return `${shortMonth} ${String(day)}, ${String(year)}`;\n case \"time\":\n return `${pad2(date.getUTCHours())}:${pad2(date.getUTCMinutes())}`;\n case \"time_secs\":\n return `${pad2(date.getUTCHours())}:${pad2(date.getUTCMinutes())}:${pad2(date.getUTCSeconds())}`;\n default:\n return undefined;\n }\n}\n\n/**\n * Deterministic UTC rendering of Slack date-format tokens for notification\n * text. A date element without a fallback must not dump raw \"{date_short}\"\n * tokens into the message preview. Tokens needing a clock ({ago}, relative\n * \"pretty\" phrasing) render as their absolute equivalents; unknown tokens\n * degrade the whole format to the ISO date.\n * https://docs.slack.dev/messaging/formatting-message-text#date-formatting\n */\nfunction formatDateTokensUtc(timestamp: number, format: string): string {\n const date = new Date(timestamp * 1000);\n if (!Number.isFinite(timestamp) || Number.isNaN(date.getTime())) {\n return String(timestamp);\n }\n let unsupported = false;\n const formatted = format.replace(DATE_TOKEN_RE, (_match, token: string) => {\n const replacement = dateToken(token, date);\n if (replacement === undefined) {\n unsupported = true;\n return \"\";\n }\n return replacement;\n });\n if (format.length === 0 || unsupported) {\n return date.toISOString().slice(0, 10);\n }\n return formatted;\n}\n\nfunction tableToPlain(rows: ReadonlyArray<ReadonlyArray<unknown>>): string {\n const lines: string[] = [];\n for (const row of rows) {\n const cells = row.map((cell) => cellPlain(cell));\n lines.push(cells.join(\" | \"));\n }\n return lines.join(\"\\n\");\n}\n\nfunction cellPlain(cell: unknown): string {\n if (typeof cell !== \"object\" || cell === null) {\n return \"\";\n }\n const c = cell as { type?: string; text?: string; value?: number; elements?: unknown };\n if (c.type === \"raw_text\" && typeof c.text === \"string\") {\n return c.text;\n }\n if (c.type === \"raw_number\") {\n return typeof c.text === \"string\" ? c.text : String(c.value ?? \"\");\n }\n if (c.type === \"rich_text\" && Array.isArray(c.elements)) {\n return richTextToPlain(c.elements as RichTextElement[]);\n }\n return \"\";\n}\n","import type { Root } from \"mdast\";\nimport remarkFrontmatter from \"remark-frontmatter\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport remarkParse from \"remark-parse\";\nimport { unified } from \"unified\";\n\nimport type { MarkdownParser, ParserOptions } from \"../types.js\";\n\n/**\n * Default markdown parser wrapping the unified/remark pipeline.\n */\nexport class RemarkMarkdownParser implements MarkdownParser {\n async parse(markdown: string, options: ParserOptions): Promise<Root> {\n const processor = unified().use(remarkParse).use(remarkGfm);\n if (options.enableFrontmatter) {\n processor.use(remarkFrontmatter, [\"yaml\", \"toml\"]);\n }\n if (options.enableMath) {\n processor.use(remarkMath);\n }\n return processor.parse(markdown) as Root;\n }\n}\n","import type { MermaidChartParser, MermaidParseResult, MermaidPieAst } from \"../types.js\";\n\nconst COMMENT_RE = /%%[^\\n]{0,500}/g;\nconst TITLE_RE = /^\\s*pie\\b(?:\\s+showData)?(?:\\s+title\\s+(.+))?\\s*$/i;\nconst ENTRY_RE = /^\\s*\"([^\"]{1,200})\"\\s*:\\s*(-?\\d+(?:\\.\\d+)?)\\s*$/;\n\n/**\n * Parses mermaid `pie` diagram grammar into a structured AST.\n */\nexport class MermaidPieParser implements MermaidChartParser {\n parse(source: string): MermaidParseResult {\n const cleaned = source.replace(COMMENT_RE, \"\");\n const lines = cleaned.split(/\\r?\\n/);\n let title: string | undefined;\n const segments: Array<{ label: string; value: number }> = [];\n let seenHeader = false;\n\n for (const raw of lines) {\n const line = raw.trim();\n if (line.length === 0) {\n continue;\n }\n if (!seenHeader) {\n if (!/^\\s*pie\\b/i.test(line)) {\n return { ok: false, reason: \"Not a pie diagram\" };\n }\n seenHeader = true;\n const tm = TITLE_RE.exec(line);\n const titlePart = tm?.[1]?.trim();\n if (titlePart !== undefined && titlePart.length > 0) {\n title = titlePart;\n }\n continue;\n }\n\n // Optional standalone title line: title Foo\n const titleLine = /^\\s*title\\s+(.+)\\s*$/i.exec(line);\n if (titleLine !== null && title === undefined) {\n title = (titleLine[1] ?? \"\").trim();\n continue;\n }\n\n const em = ENTRY_RE.exec(line);\n if (em === null) {\n return { ok: false, reason: `Invalid pie entry: ${line}` };\n }\n const label = em[1] ?? \"\";\n const value = Number(em[2]);\n if (!(value > 0)) {\n return { ok: false, reason: `Pie values must be > 0 (got ${String(value)})` };\n }\n segments.push({ label, value });\n }\n\n if (!seenHeader) {\n return { ok: false, reason: \"Missing pie header\" };\n }\n if (segments.length === 0) {\n return { ok: false, reason: \"Pie has no segments\" };\n }\n\n const ast: MermaidPieAst = {\n kind: \"pie\",\n title,\n segments,\n };\n return { ok: true, value: ast };\n }\n}\n","import { CHART_POINTS_MAX } from \"../constants.js\";\nimport type { MermaidChartParser, MermaidParseResult, MermaidXyChartAst } from \"../types.js\";\n\nconst COMMENT_RE = /%%[^\\n]{0,500}/g;\nconst NUM = String.raw`-?\\d+(?:\\.\\d+)?`;\nconst NUM_LIST_RE = new RegExp(String.raw`\\[\\s*((?:${NUM}\\s*,\\s*)*${NUM})\\s*\\]`);\nconst STR_LIST_RE = /\\[\\s*((?:\"[^\"]{0,200}\"\\s*,\\s*)*\"[^\"]{0,200}\")\\s*\\]/;\n\n/**\n * Parses mermaid `xychart-beta` grammar (categories, bar/line series).\n */\nexport class MermaidXyChartParser implements MermaidChartParser {\n parse(source: string): MermaidParseResult {\n const cleaned = source.replace(COMMENT_RE, \"\");\n const lines = cleaned.split(/\\r?\\n/);\n let title: string | undefined;\n let categories: string[] = [];\n let xLabel: string | undefined;\n let yLabel: string | undefined;\n const bars: number[][] = [];\n const linesSeries: number[][] = [];\n let seenHeader = false;\n\n for (const raw of lines) {\n const line = raw.trim();\n if (line.length === 0) {\n continue;\n }\n if (!seenHeader) {\n if (!/^\\s*xychart-beta\\b/i.test(line)) {\n return { ok: false, reason: \"Not an xychart-beta diagram\" };\n }\n seenHeader = true;\n continue;\n }\n\n const titleM =\n /^\\s*title\\s+\"([^\"]{0,200})\"\\s*$/i.exec(line) ?? /^\\s*title\\s+(.+)\\s*$/i.exec(line);\n if (titleM !== null) {\n title = (titleM[1] ?? \"\").trim();\n continue;\n }\n\n if (/^\\s*x-axis\\b/i.test(line)) {\n const strList = STR_LIST_RE.exec(line);\n if (strList !== null) {\n categories = parseStringList(strList[1] ?? \"\");\n const labelM = /^\\s*x-axis\\s+\"([^\"]{0,200})\"\\s+/i.exec(line);\n if (labelM !== null) {\n xLabel = labelM[1];\n }\n continue;\n }\n const rangeM = new RegExp(\n String.raw`x-axis\\s+(?:\"([^\"]{0,200})\"\\s+)?(${NUM})\\s*-->\\s*(${NUM})`,\n \"i\",\n ).exec(line);\n if (rangeM !== null) {\n xLabel = rangeM[1];\n const min = Number(rangeM[2]);\n const max = Number(rangeM[3]);\n if (!Number.isFinite(min) || !Number.isFinite(max) || max < min) {\n return { ok: false, reason: `Invalid x-axis range: ${line}` };\n }\n const span = max - min + 1;\n if (span > CHART_POINTS_MAX) {\n return {\n ok: false,\n reason: `x-axis range has ${String(span)} points (max ${String(CHART_POINTS_MAX)})`,\n };\n }\n categories = [];\n for (let i = min; i <= max; i += 1) {\n categories.push(String(i));\n }\n continue;\n }\n return { ok: false, reason: `Invalid x-axis: ${line}` };\n }\n\n if (/^\\s*y-axis\\b/i.test(line)) {\n const ym = new RegExp(\n String.raw`y-axis\\s+(?:\"([^\"]{0,200})\"\\s+)?(?:(${NUM})\\s*-->\\s*(${NUM}))?`,\n \"i\",\n ).exec(line);\n if (ym !== null) {\n yLabel = ym[1];\n continue;\n }\n return { ok: false, reason: `Invalid y-axis: ${line}` };\n }\n\n if (/^\\s*bar\\b/i.test(line)) {\n const nums = NUM_LIST_RE.exec(line);\n if (nums === null) {\n return { ok: false, reason: `Invalid bar series: ${line}` };\n }\n bars.push(parseNumberList(nums[1] ?? \"\"));\n continue;\n }\n\n if (/^\\s*line\\b/i.test(line)) {\n const nums = NUM_LIST_RE.exec(line);\n if (nums === null) {\n return { ok: false, reason: `Invalid line series: ${line}` };\n }\n linesSeries.push(parseNumberList(nums[1] ?? \"\"));\n continue;\n }\n\n return { ok: false, reason: `Unrecognized xychart line: ${line}` };\n }\n\n if (!seenHeader) {\n return { ok: false, reason: \"Missing xychart-beta header\" };\n }\n if (categories.length === 0) {\n return { ok: false, reason: \"xychart missing categories\" };\n }\n if (bars.length === 0 && linesSeries.length === 0) {\n return { ok: false, reason: \"xychart has no series\" };\n }\n\n const ast: MermaidXyChartAst = {\n kind: \"xychart-beta\",\n title,\n categories,\n xLabel,\n yLabel,\n bars,\n lines: linesSeries,\n };\n return { ok: true, value: ast };\n }\n}\n\nfunction parseStringList(inner: string): string[] {\n const out: string[] = [];\n const re = /\"([^\"]{0,200})\"/g;\n let m: RegExpExecArray | null = re.exec(inner);\n while (m !== null) {\n out.push(m[1] ?? \"\");\n m = re.exec(inner);\n }\n return out;\n}\n\nfunction parseNumberList(inner: string): number[] {\n return inner\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0)\n .map((s) => Number(s));\n}\n","import type { Definition, FootnoteDefinition, Heading, Root, RootContent } from \"mdast\";\nimport { toString } from \"mdast-util-to-string\";\n\nimport type { Block } from \"../blocks/types.js\";\nimport { ConversionContext, type ResolvedConfig } from \"../budget/conversion-context.js\";\nimport { RecordingDegradationCollector } from \"../budget/recording-degradation-collector.js\";\nimport { StandardBudgetLedger } from \"../budget/standard-budget-ledger.js\";\nimport { buildFootnoteBlocks, type MessageAssembler } from \"../assemble/message-assembler.js\";\nimport type { AdapterRegistry } from \"../registry/adapter-registry.js\";\nimport {\n MAX_BLOCKS_PER_MESSAGE,\n MESSAGE_TEXT_SAFETY_MAX_CHARS,\n SECTION_TEXT_MAX_CHARS,\n} from \"../constants.js\";\nimport { sliceSurrogateSafe, surrogateSafeEnd } from \"../utf16.js\";\nimport type {\n ConversionMessagesResult,\n ConversionResult,\n ConvertOptions,\n DegradationCollector,\n MarkdownParser,\n PlainTextRenderer,\n} from \"../types.js\";\nimport { ConversionStrategy, OverflowMode } from \"../types.js\";\n\nimport { resolveConfig } from \"./resolve-config.js\";\n\nexport interface SlackMarkConverterDeps {\n readonly parser: MarkdownParser;\n readonly registry: AdapterRegistry;\n readonly assembler: MessageAssembler;\n readonly plainText: PlainTextRenderer;\n readonly defaultOptions: ConvertOptions;\n}\n\n/**\n * Primary public API class — stateless across concurrent convert() calls.\n */\nexport class SlackMarkConverter {\n private readonly parser: MarkdownParser;\n private readonly registry: AdapterRegistry;\n private readonly assembler: MessageAssembler;\n private readonly plainText: PlainTextRenderer;\n private readonly defaultOptions: ConvertOptions;\n\n constructor(deps: SlackMarkConverterDeps) {\n this.parser = deps.parser;\n this.registry = deps.registry;\n this.assembler = deps.assembler;\n this.plainText = deps.plainText;\n this.defaultOptions = deps.defaultOptions;\n }\n\n /**\n * Convert markdown to a single message. Always uses overflow=degrade so content\n * is truncated with degradations rather than silently dropping split messages.\n * Callers that need multi-message output should use {@link convertToMessages}.\n */\n async convert(markdown: string, options?: ConvertOptions): Promise<ConversionResult> {\n const multi = await this.convertToMessages(markdown, {\n ...options,\n overflow: OverflowMode.Degrade,\n });\n const first = multi.messages[0] ?? { blocks: [], text: \" \" };\n return {\n blocks: first.blocks,\n text: first.text,\n degradations: multi.degradations,\n };\n }\n\n /**\n * Convert markdown into one or more messages at semantic boundaries.\n */\n async convertToMessages(\n markdown: string,\n options?: ConvertOptions,\n ): Promise<ConversionMessagesResult> {\n const config = resolveConfig(this.defaultOptions, options);\n const degradations = new RecordingDegradationCollector();\n // When splitting, lift the block + chart caps during emission; the assembler\n // re-applies per-message budgets. Table/markdown/total char caps stay on so\n // oversized single blocks cannot be emitted.\n const splitting = config.overflow === OverflowMode.Split;\n const budget = new StandardBudgetLedger(\n splitting ? Number.MAX_SAFE_INTEGER : MAX_BLOCKS_PER_MESSAGE,\n { enforceChartCap: !splitting },\n );\n\n try {\n if (config.strategy === ConversionStrategy.MarkdownBlock) {\n return this.emitAsMarkdownBlocks(markdown, config, degradations, budget);\n }\n\n const tree = await this.parser.parse(markdown, {\n enableMath: config.enableMath,\n enableFrontmatter: config.enableFrontmatter,\n });\n\n const { definitions, footnotes, footnoteOrder } = collectRefs(tree, degradations);\n let precedingHeading: string | undefined;\n const emitted: Block[] = [];\n\n let index = 0;\n for (const node of tree.children) {\n // Message boundaries are chosen after emission. In split mode, validate\n // each semantic unit against an empty message, then let the assembler\n // enforce cumulative limits for the messages it creates.\n if (splitting) {\n budget.resetForNewMessage();\n }\n const ctx = new ConversionContext({\n config,\n budget,\n degradations,\n definitions,\n footnotes,\n footnoteOrder,\n precedingHeading,\n path: `root[${String(index)}]`,\n });\n\n if (node.type === \"heading\") {\n precedingHeading = toString(node as Heading);\n }\n\n const blocks = await this.registry.emit(node as RootContent, ctx);\n emitted.push(...blocks);\n index += 1;\n }\n\n const footnoteNumbers = new Map<string, number>();\n footnoteOrder.forEach((id, i) => footnoteNumbers.set(id, i + 1));\n const footnoteEntries = footnoteOrder.map((id, i) => {\n const def = footnotes.get(id);\n return {\n n: i + 1,\n text: def !== undefined ? footnoteBodyText(def, footnoteNumbers).trim() : id,\n };\n });\n const footnoteBlocks = buildFootnoteBlocks(footnoteEntries, degradations);\n\n const assembleCtx = new ConversionContext({\n config,\n budget,\n degradations,\n definitions,\n footnotes,\n footnoteOrder,\n precedingHeading,\n path: \"assemble\",\n });\n const messages = this.assembler.assemble(emitted, assembleCtx, footnoteBlocks);\n\n return {\n messages,\n degradations: degradations.all(),\n };\n } catch (err) {\n // User markdown must never throw — degrade to a single section.\n degradations.add({\n nodeType: \"document\",\n from: \"convert\",\n to: \"section\",\n reason: err instanceof Error ? err.message : \"Unknown conversion error\",\n path: \"root\",\n });\n const text = safeNotificationText(this.plainText, markdown, degradations);\n return {\n messages: [\n {\n blocks: [\n {\n type: \"section\",\n text: { type: \"mrkdwn\", text: clampSectionFallback(text, degradations) },\n },\n ],\n text,\n },\n ],\n degradations: degradations.all(),\n };\n }\n }\n\n private emitAsMarkdownBlocks(\n markdown: string,\n config: ResolvedConfig,\n degradations: RecordingDegradationCollector,\n budget: StandardBudgetLedger,\n ): ConversionMessagesResult {\n const chunks = chunkMarkdown(markdown, 12_000);\n let blocks: Block[] = [];\n if (!config.capabilities.markdownBlock) {\n degradations.add({\n nodeType: \"document\",\n from: \"markdown-block\",\n to: \"section\",\n reason: \"markdownBlock capability off; emitting section fallback\",\n path: \"root\",\n });\n const text = safeNotificationText(this.plainText, markdown, degradations);\n blocks = [\n {\n type: \"section\",\n text: { type: \"mrkdwn\", text: clampSectionFallback(text, degradations) },\n },\n ];\n } else {\n for (const chunk of chunks) {\n if (config.overflow === OverflowMode.Split) {\n budget.resetForNewMessage();\n }\n if (!budget.tryReserveClaim({ blocks: 1, markdownChars: chunk.length })) {\n degradations.add({\n nodeType: \"document\",\n from: \"markdown-block\",\n to: \"truncated\",\n reason: \"markdown 12k cumulative budget exhausted\",\n path: \"root\",\n });\n break;\n }\n blocks.push({ type: \"markdown\", text: chunk });\n }\n }\n\n const assembleCtx = new ConversionContext({\n config,\n budget,\n degradations,\n definitions: new Map(),\n footnotes: new Map(),\n footnoteOrder: [],\n precedingHeading: undefined,\n path: \"assemble\",\n });\n // Markdown strategy has no GFM footnote pass; assembler still applies overflow split/degrade.\n const messages = this.assembler.assemble(blocks, assembleCtx, []);\n return {\n messages,\n degradations: degradations.all(),\n };\n }\n}\n\nfunction safeNotificationText(\n plainText: PlainTextRenderer,\n markdown: string,\n degradations: DegradationCollector,\n): string {\n const raw = plainText.render(markdown);\n if (raw.length <= MESSAGE_TEXT_SAFETY_MAX_CHARS) {\n return raw;\n }\n degradations.add({\n nodeType: \"message\",\n from: `${String(raw.length)} text chars`,\n to: `${String(MESSAGE_TEXT_SAFETY_MAX_CHARS)} text chars`,\n reason: \"Notification text truncated to 40k safety limit\",\n path: \"root\",\n });\n return sliceSurrogateSafe(raw, MESSAGE_TEXT_SAFETY_MAX_CHARS);\n}\n\nfunction clampSectionFallback(text: string, degradations: DegradationCollector): string {\n if (text.length <= SECTION_TEXT_MAX_CHARS) {\n return text;\n }\n degradations.add({\n nodeType: \"section\",\n from: `${String(text.length)} chars`,\n to: `${String(SECTION_TEXT_MAX_CHARS)} chars`,\n reason: \"Section text truncated to 3000 chars\",\n path: \"root\",\n });\n return sliceSurrogateSafe(text, SECTION_TEXT_MAX_CHARS);\n}\n\nfunction collectRefs(\n tree: Root,\n degradations: DegradationCollector,\n): {\n definitions: Map<string, Definition>;\n footnotes: Map<string, FootnoteDefinition>;\n footnoteOrder: string[];\n} {\n const definitions = new Map<string, Definition>();\n const footnotes = new Map<string, FootnoteDefinition>();\n // CommonMark: when identifiers collide, the first definition takes\n // precedence (spec §Link reference definitions); mdast-util-to-hast applies\n // the same rule to footnote definitions. Ignored duplicates are flagged.\n for (const node of tree.children) {\n if (node.type === \"definition\") {\n const key = node.identifier.toLowerCase();\n if (definitions.has(key)) {\n degradations.add({\n nodeType: \"definition\",\n from: node.identifier,\n to: \"ignored\",\n reason: \"Duplicate link reference definition; first definition wins\",\n path: \"root\",\n });\n } else {\n definitions.set(key, node);\n }\n }\n if (node.type === \"footnoteDefinition\") {\n if (footnotes.has(node.identifier)) {\n degradations.add({\n nodeType: \"footnoteDefinition\",\n from: node.identifier,\n to: \"ignored\",\n reason: \"Duplicate footnote definition; first definition wins\",\n path: \"root\",\n });\n } else {\n footnotes.set(node.identifier, node);\n }\n }\n }\n // Number footnotes by first reference in document order (not definition order).\n const footnoteOrder: string[] = [];\n const seen = new Set<string>();\n walkFootnoteReferences(tree, (id) => {\n if (!seen.has(id)) {\n seen.add(id);\n footnoteOrder.push(id);\n }\n });\n // Footnotes referenced only from other footnote bodies are rendered too\n // (GitHub lists them after body-referenced ones); breadth-first over the\n // bodies of already-ordered footnotes, cycle-safe via `seen`.\n for (let i = 0; i < footnoteOrder.length; i += 1) {\n const def = footnotes.get(footnoteOrder[i] ?? \"\");\n if (def === undefined) {\n continue;\n }\n for (const child of def.children) {\n walkFootnoteReferences(child, (id) => {\n if (!seen.has(id)) {\n seen.add(id);\n footnoteOrder.push(id);\n }\n });\n }\n }\n return { definitions, footnotes, footnoteOrder };\n}\n\n/**\n * Footnote definition body as plain text with nested footnote references\n * rendered as their `[n]` markers (mdast-util-to-string drops them entirely).\n */\nfunction footnoteBodyText(node: unknown, numbers: ReadonlyMap<string, number>): string {\n if (node === null || typeof node !== \"object\") {\n return \"\";\n }\n const record = node as {\n readonly type?: string;\n readonly identifier?: string;\n readonly value?: string;\n readonly alt?: string;\n readonly children?: ReadonlyArray<unknown>;\n };\n if (record.type === \"footnoteReference\" && typeof record.identifier === \"string\") {\n const n = numbers.get(record.identifier);\n return n !== undefined ? `[${String(n)}]` : `[^${record.identifier}]`;\n }\n if (typeof record.value === \"string\") {\n return record.value;\n }\n if (typeof record.alt === \"string\") {\n return record.alt;\n }\n if (record.children !== undefined) {\n const parts: string[] = [];\n for (const child of record.children) {\n parts.push(footnoteBodyText(child, numbers));\n }\n return parts.join(\"\");\n }\n return \"\";\n}\n\nfunction walkFootnoteReferences(node: unknown, onRef: (id: string) => void): void {\n if (node === null || typeof node !== \"object\") {\n return;\n }\n const record = node as {\n readonly type?: string;\n readonly identifier?: string;\n readonly children?: ReadonlyArray<unknown>;\n };\n // Definitions are not part of reading-order numbering.\n if (record.type === \"footnoteDefinition\") {\n return;\n }\n if (record.type === \"footnoteReference\" && typeof record.identifier === \"string\") {\n onRef(record.identifier);\n return;\n }\n if (record.children !== undefined) {\n for (const child of record.children) {\n walkFootnoteReferences(child, onRef);\n }\n }\n}\n\nfunction chunkMarkdown(text: string, max: number): string[] {\n if (text.length <= max) {\n return [text.length > 0 ? text : \" \"];\n }\n const out: string[] = [];\n let i = 0;\n while (i < text.length) {\n // Chunk boundaries must not split a surrogate pair (max ≥ 2 guarantees progress).\n const end = surrogateSafeEnd(text, i + max);\n out.push(text.slice(i, end));\n i = end;\n }\n return out;\n}\n","import { resolveCapabilities } from \"../capabilities/capabilities.js\";\nimport type { ResolvedConfig } from \"../budget/conversion-context.js\";\nimport { ConfigurationError } from \"../errors.js\";\nimport {\n ConversionStrategy,\n OverflowMode,\n type ConvertOptions,\n type ImageRenderer,\n} from \"../types.js\";\n\n/**\n * Merge defaults + per-call options into a frozen ResolvedConfig.\n */\nexport function resolveConfig(\n defaults: ConvertOptions,\n overrides: ConvertOptions | undefined,\n): ResolvedConfig {\n const merged: ConvertOptions = {\n ...defaults,\n ...overrides,\n capabilityOverrides: {\n ...defaults.capabilityOverrides,\n ...overrides?.capabilityOverrides,\n },\n renderers: overrides?.renderers ?? defaults.renderers,\n uploader: overrides?.uploader ?? defaults.uploader,\n mentionResolvers: overrides?.mentionResolvers ?? defaults.mentionResolvers,\n };\n\n const capabilities = resolveCapabilities(merged.capabilities, merged.capabilityOverrides);\n\n const overflow = merged.overflow ?? OverflowMode.Degrade;\n if (overflow !== OverflowMode.Degrade && overflow !== OverflowMode.Split) {\n throw new ConfigurationError(\n `Invalid overflow mode ${JSON.stringify(overflow)}; use \"degrade\" or \"split\".`,\n );\n }\n\n const strategy = merged.strategy ?? ConversionStrategy.RichTextFirst;\n if (\n strategy !== ConversionStrategy.RichTextFirst &&\n strategy !== ConversionStrategy.MarkdownBlock\n ) {\n throw new ConfigurationError(\n `Invalid strategy ${JSON.stringify(strategy)}; use \"rich-text-first\" or \"markdown-block\".`,\n );\n }\n\n const renderers: ReadonlyArray<ImageRenderer> = merged.renderers ?? [];\n\n return Object.freeze({\n capabilities,\n overflow,\n strategy,\n renderers,\n uploader: merged.uploader,\n enableMath: merged.enableMath === true,\n enableFrontmatter: merged.enableFrontmatter === true,\n mentionResolvers: merged.mentionResolvers,\n });\n}\n","import type { Blockquote, RootContent } from \"mdast\";\nimport { toString } from \"mdast-util-to-string\";\n\nimport type { Block, RichTextBlock, RichTextInline } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\n\nimport { emitPhrasing } from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\nconst ADMONITION_RE = /^\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\\s*/i;\n\nconst ADMONITION_META = {\n NOTE: { emoji: \"📝\", title: \"Note\" },\n TIP: { emoji: \"💡\", title: \"Tip\" },\n IMPORTANT: { emoji: \"❗\", title: \"Important\" },\n WARNING: { emoji: \"⚠️\", title: \"Warning\" },\n CAUTION: { emoji: \"🚫\", title: \"Caution\" },\n} as const;\n\n/**\n * Blockquotes → rich_text_quote; GitHub admonitions get styled first line.\n */\nexport class BlockquoteAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"blockquote\";\n }\n\n plan(node: RootContent, _ctx: ConversionContext): ReadonlyArray<Candidate> {\n const quote = node as Blockquote;\n return [\n {\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n const elements = flattenQuote(quote, ctx);\n const block: RichTextBlock = {\n type: \"rich_text\",\n elements: [{ type: \"rich_text_quote\", elements, border: 0 }],\n };\n return [block];\n },\n },\n ];\n }\n}\n\nfunction flattenQuote(quote: Blockquote, ctx: ConversionContext): RichTextInline[] {\n const parts: RichTextInline[] = [];\n let first = true;\n\n for (const child of quote.children) {\n if (child.type === \"paragraph\") {\n let children = child.children;\n if (first && children[0]?.type === \"text\") {\n const textNode = children[0];\n const m = ADMONITION_RE.exec(textNode.value);\n if (m !== null) {\n const kind = (m[1] ?? \"NOTE\").toUpperCase() as keyof typeof ADMONITION_META;\n const meta = ADMONITION_META[kind];\n parts.push({\n type: \"text\",\n text: `${meta.emoji}${meta.title}\\n`,\n style: { bold: true },\n });\n const rest = textNode.value.slice(m[0].length);\n children = [\n ...(rest.length > 0 ? [{ ...textNode, value: rest }] : []),\n ...children.slice(1),\n ];\n }\n }\n first = false;\n const inline = emitPhrasing(children, ctx);\n if (parts.length > 0 && inline.elements.length > 0) {\n parts.push({ type: \"text\", text: \"\\n\" });\n }\n parts.push(...inline.elements);\n } else if (child.type === \"list\") {\n ctx.degradations.add({\n nodeType: \"blockquote\",\n from: \"list\",\n to: \"bullet_lines\",\n reason: \"Nested list inside blockquote flattened\",\n path: ctx.path,\n });\n if (parts.length > 0) parts.push({ type: \"text\", text: \"\\n\" });\n for (const item of child.children) {\n parts.push({ type: \"text\", text: `• ${toString(item)}\\n` });\n }\n } else if (child.type === \"code\") {\n ctx.degradations.add({\n nodeType: \"blockquote\",\n from: \"code\",\n to: \"text\",\n reason: \"Nested code inside blockquote flattened to text\",\n path: ctx.path,\n });\n if (parts.length > 0) parts.push({ type: \"text\", text: \"\\n\" });\n parts.push({ type: \"text\", text: child.value, style: { code: true } });\n } else {\n ctx.degradations.add({\n nodeType: \"blockquote\",\n from: child.type,\n to: \"text\",\n reason: \"Nested block inside blockquote flattened\",\n path: ctx.path,\n });\n if (parts.length > 0) parts.push({ type: \"text\", text: \"\\n\" });\n parts.push({ type: \"text\", text: toString(child) });\n }\n }\n\n return parts.length > 0 ? parts : [{ type: \"text\", text: \" \" }];\n}\n","import type { Emphasis, Link, LinkReference, PhrasingContent, Strong, Text } from \"mdast\";\nimport { toString } from \"mdast-util-to-string\";\n\nimport type {\n ImageBlock,\n RichTextBlock,\n RichTextEmoji,\n RichTextInline,\n RichTextLink,\n RichTextStyle,\n RichTextText,\n} from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport {\n ELLIPSIS,\n IMAGE_ALT_MAX_CHARS,\n IMAGE_URL_MAX_CHARS,\n SECTION_TEXT_MAX_CHARS,\n} from \"../constants.js\";\nimport { sliceSurrogateSafe } from \"../utf16.js\";\n\n// Every well-formed `:name:` becomes an emoji element — Slack accepts arbitrary\n// names and renders a literal `:name:` fallback for unknown ones (verified via\n// Builder probe 2026-07-22), which is also the only way custom workspace emoji\n// (`:party-parrot:`) can work. Word boundaries prevent misparsing times/ratios\n// like `12:30:45` (same rule as react-blockkit's mrkdwn tokenizer).\nconst EMOJI_SHORTCODE_RE = /(?<![A-Za-z0-9]):([a-z0-9_+-]{1,64}):(?![A-Za-z0-9])/g;\n\nconst HTTP_URL_RE = /^(https?:|mailto:)/i;\nconst IMAGE_EXT_RE = /\\.(png|jpe?g|gif)(?:\\?|#|$)/i;\n\nexport type HoistedImage = {\n readonly url: string;\n readonly alt: string;\n readonly title: string | undefined;\n};\n\nexport interface InlineEmitResult {\n readonly elements: ReadonlyArray<RichTextInline>;\n readonly hoistedImages: ReadonlyArray<HoistedImage>;\n}\n\n/**\n * Convert mdast phrasing content into rich_text inline elements.\n */\nexport function emitPhrasing(\n nodes: ReadonlyArray<PhrasingContent>,\n ctx: ConversionContext,\n baseStyle: RichTextStyle = {},\n): InlineEmitResult {\n const elements: RichTextInline[] = [];\n const hoistedImages: HoistedImage[] = [];\n // Mutable working copy: Slack labeled links with spaces (<https://u|two words>)\n // parse as text(\"…<\") + autolink + text(\"words>…\") and are reassembled in place.\n const work: PhrasingContent[] = [...nodes];\n // remark splits <a href>label</a> into html/text/html siblings — track across nodes.\n let pendingAnchor: OpenAnchor | undefined;\n // remark also splits <b>bold</b> into html/text/html siblings, so formatting\n // tags must style the text nodes BETWEEN them; a per-call stack tracks the\n // currently open cross-node tags.\n const htmlStyles: RichTextStyle[] = [];\n const activeStyle = (): RichTextStyle => htmlStyles[htmlStyles.length - 1] ?? baseStyle;\n\n const flushPendingAnchor = (): void => {\n if (pendingAnchor === undefined) {\n return;\n }\n elements.push(anchorInline(pendingAnchor, ctx));\n pendingAnchor = undefined;\n };\n\n for (let i = 0; i < work.length; i += 1) {\n const node = work[i] as PhrasingContent;\n if (pendingAnchor === undefined) {\n const reassembled = reassembleSlackLabeledLink(work, i, activeStyle());\n if (reassembled !== undefined) {\n if (reassembled.leadingText.value.length > 0) {\n elements.push(\n ...emitTextWithMentionsAndEmoji(reassembled.leadingText, activeStyle(), ctx),\n );\n }\n elements.push(reassembled.link);\n // Drop the lead+autolink+tail trio so the fractured autolink cannot be\n // emitLink'd again; keep only a non-empty trailing remnant for the next pass.\n if (reassembled.trailingText.value.length > 0) {\n work.splice(i, 3, reassembled.trailingText);\n } else {\n work.splice(i, 3);\n }\n i -= 1;\n continue;\n }\n }\n if (pendingAnchor !== undefined) {\n if (node.type === \"html\" && /^<\\/a\\s*>$/i.test(node.value.trim())) {\n flushPendingAnchor();\n continue;\n }\n if (node.type === \"text\") {\n pendingAnchor.textParts.push(node.value);\n continue;\n }\n if (node.type === \"break\") {\n pendingAnchor.textParts.push(\"\\n\");\n continue;\n }\n pendingAnchor.textParts.push(toString(node));\n continue;\n }\n\n if (node.type === \"html\") {\n const trimmed = node.value.trim();\n // remark parses <!here>, <!date^…>, <!subteam^…> as inline html — convert\n // them to their rich text elements instead of stripping (silent mangling).\n const entityInlines = slackEntityRichTextInlines(trimmed, activeStyle());\n if (entityInlines !== undefined) {\n elements.push(...entityInlines);\n continue;\n }\n const openOnly = /^<a\\b([^>]{0,500})>\\s*$/i.exec(trimmed);\n if (openOnly !== null) {\n const hrefMatch = /href\\s*=\\s*[\"']([^\"']{0,3000})[\"']/i.exec(openOnly[1] ?? \"\");\n const href = hrefMatch?.[1];\n if (href !== undefined) {\n // Invalid hrefs still collect the label so the anchor text is not lost;\n // the flush degrades them to text with the URL as a suffix.\n pendingAnchor = {\n href,\n style: activeStyle(),\n textParts: [],\n valid: isValidLinkUrl(href),\n };\n continue;\n }\n }\n const openTag = HTML_STYLE_OPEN_RE.exec(trimmed);\n if (openTag !== null) {\n htmlStyles.push(htmlTagStyle(activeStyle(), openTag[1] ?? \"\"));\n continue;\n }\n if (HTML_STYLE_CLOSE_RE.test(trimmed)) {\n htmlStyles.pop();\n continue;\n }\n elements.push(...emitInlineHtml(node.value, activeStyle(), ctx));\n continue;\n }\n\n switch (node.type) {\n case \"text\": {\n elements.push(...emitTextWithMentionsAndEmoji(node as Text, activeStyle(), ctx));\n break;\n }\n case \"strong\": {\n const inner = emitPhrasing((node as Strong).children, ctx, {\n ...activeStyle(),\n bold: true,\n });\n elements.push(...inner.elements);\n hoistedImages.push(...inner.hoistedImages);\n break;\n }\n case \"emphasis\": {\n const inner = emitPhrasing((node as Emphasis).children, ctx, {\n ...activeStyle(),\n italic: true,\n });\n elements.push(...inner.elements);\n hoistedImages.push(...inner.hoistedImages);\n break;\n }\n case \"delete\": {\n const inner = emitPhrasing(node.children, ctx, { ...activeStyle(), strike: true });\n elements.push(...inner.elements);\n hoistedImages.push(...inner.hoistedImages);\n break;\n }\n case \"inlineCode\": {\n const el: RichTextText = {\n type: \"text\",\n text: node.value,\n style: styleOrUndefined({ ...activeStyle(), code: true }),\n };\n elements.push(el);\n break;\n }\n case \"break\": {\n elements.push({ type: \"text\", text: \"\\n\", style: styleOrUndefined(activeStyle()) });\n break;\n }\n case \"link\": {\n elements.push(...emitLink(node, ctx, activeStyle()));\n break;\n }\n case \"linkReference\": {\n elements.push(...emitLinkReference(node, ctx, activeStyle()));\n break;\n }\n case \"image\": {\n const url = node.url;\n if (isPublicImageUrl(url)) {\n hoistedImages.push({\n url,\n alt: node.alt ?? \"\",\n title: node.title ?? undefined,\n });\n elements.push({\n type: \"link\",\n url,\n text: node.alt && node.alt.length > 0 ? node.alt : url,\n style: styleOrUndefined(activeStyle()),\n });\n } else {\n // Slack link elements require absolute http(s)/mailto URLs; anything\n // else (relative, ftp:, data:, empty) must degrade to text or the\n // whole message is rejected with invalid_blocks.\n const linkable = isValidLinkUrl(url);\n ctx.degradations.add({\n nodeType: \"image\",\n from: \"image\",\n to: linkable ? \"link\" : \"text\",\n reason: \"Image URL is not a public http(s) png/jpg/gif ≤3000 chars\",\n path: ctx.path,\n });\n const label = node.alt && node.alt.length > 0 ? node.alt : url.length > 0 ? url : \"image\";\n if (linkable) {\n elements.push({\n type: \"link\",\n url,\n text: label,\n style: styleOrUndefined(activeStyle()),\n });\n } else {\n const suffix = url.length > 0 && url !== label ? ` (${url})` : \"\";\n elements.push({\n type: \"text\",\n text: `${label}${suffix}`,\n style: styleOrUndefined(activeStyle()),\n });\n }\n }\n break;\n }\n case \"imageReference\": {\n const def = ctx.definitions.get(node.identifier.toLowerCase());\n if (def === undefined) {\n elements.push({\n type: \"text\",\n text: node.alt ?? node.identifier,\n style: styleOrUndefined(activeStyle()),\n });\n break;\n }\n const asImage = emitPhrasing(\n [\n {\n type: \"image\",\n url: def.url,\n alt: node.alt ?? undefined,\n title: def.title ?? undefined,\n },\n ],\n ctx,\n activeStyle(),\n );\n elements.push(...asImage.elements);\n hoistedImages.push(...asImage.hoistedImages);\n break;\n }\n case \"footnoteReference\": {\n const idx = ctx.footnoteOrder.indexOf(node.identifier);\n const n = idx >= 0 ? idx + 1 : 1;\n elements.push({\n type: \"text\",\n text: `[${String(n)}]`,\n style: styleOrUndefined(activeStyle()),\n });\n break;\n }\n case \"inlineMath\": {\n elements.push({\n type: \"text\",\n text: node.value,\n style: styleOrUndefined({ ...activeStyle(), code: true }),\n });\n ctx.degradations.add({\n nodeType: \"inlineMath\",\n from: \"inlineMath\",\n to: \"style.code\",\n reason: \"Math rendering not configured; emitted as inline code\",\n path: ctx.path,\n });\n break;\n }\n default: {\n const text = toString(node);\n if (text.length > 0) {\n elements.push({ type: \"text\", text, style: styleOrUndefined(activeStyle()) });\n }\n break;\n }\n }\n }\n\n flushPendingAnchor();\n return { elements: coalesceText(elements), hoistedImages };\n}\n\n/**\n * Plain string from phrasing (strips styles) — for headers etc.\n */\nexport function phrasingToPlain(nodes: ReadonlyArray<PhrasingContent>): string {\n return toString({ type: \"paragraph\", children: nodes as PhrasingContent[] });\n}\n\nexport function isPublicImageUrl(url: string): boolean {\n if (url.length === 0 || url.length > IMAGE_URL_MAX_CHARS) {\n return false;\n }\n if (!HTTP_URL_RE.test(url)) {\n return false;\n }\n if (\n /^https?:\\/\\/(localhost|127\\.0\\.0\\.1|0\\.0\\.0\\.0|10\\.|192\\.168\\.|172\\.(1[6-9]|2\\d|3[01])\\.)/i.test(\n url,\n )\n ) {\n return false;\n }\n return IMAGE_EXT_RE.test(url);\n}\n\n/**\n * Count images that {@link emitPhrasing} would hoist into separate image blocks.\n */\nexport function countHoistableImages(\n nodes: ReadonlyArray<PhrasingContent>,\n ctx: ConversionContext,\n): number {\n let count = 0;\n for (const node of nodes) {\n switch (node.type) {\n case \"image\": {\n if (isPublicImageUrl(node.url)) {\n count += 1;\n }\n break;\n }\n case \"imageReference\": {\n const def = ctx.definitions.get(node.identifier.toLowerCase());\n if (def !== undefined && isPublicImageUrl(def.url)) {\n count += 1;\n }\n break;\n }\n case \"strong\":\n case \"emphasis\":\n case \"delete\": {\n count += countHoistableImages(node.children, ctx);\n break;\n }\n case \"text\":\n case \"inlineCode\":\n case \"break\":\n case \"link\":\n case \"linkReference\":\n case \"footnoteReference\":\n case \"html\":\n case \"inlineMath\":\n break;\n default: {\n // Other phrasing (e.g. extensions) cannot hoist images.\n break;\n }\n }\n }\n return count;\n}\n\nexport function truncateLabel(label: string, max: number): { text: string; truncated: boolean } {\n if (label.length <= max) {\n return { text: label, truncated: false };\n }\n return { text: `${sliceSurrogateSafe(label, Math.max(0, max - 1))}${ELLIPSIS}`, truncated: true };\n}\n\n/** Standalone image block for an image hoisted out of phrasing content. */\nexport function hoistedImageBlock(h: HoistedImage, ctx: ConversionContext): ImageBlock {\n return {\n type: \"image\",\n image_url: h.url,\n alt_text: clampImageText(h.alt.length > 0 ? h.alt : \"image\", ctx, \"alt_text\"),\n title:\n h.title !== undefined && h.title.length > 0\n ? { type: \"plain_text\", text: clampImageText(h.title, ctx, \"title\") }\n : undefined,\n };\n}\n\n/** Clamp section mrkdwn to 3000 chars and record a degradation when clipped. */\nexport function clampSectionText(text: string, ctx: ConversionContext, nodeType: string): string {\n if (text.length <= SECTION_TEXT_MAX_CHARS) {\n return text;\n }\n ctx.degradations.add({\n nodeType,\n from: `${String(text.length)} chars`,\n to: `${String(SECTION_TEXT_MAX_CHARS)} chars`,\n reason: \"Section text truncated to 3000 chars\",\n path: ctx.path,\n });\n return sliceSurrogateSafe(text, SECTION_TEXT_MAX_CHARS);\n}\n\n/** rich_text_preformatted block shared by code/math/mermaid/table fallbacks. */\nexport function preformattedRichText(text: string, language: string | undefined): RichTextBlock {\n return {\n type: \"rich_text\",\n elements: [\n {\n type: \"rich_text_preformatted\",\n elements: [{ type: \"text\", text: text.length > 0 ? text : \" \" }],\n border: 0,\n language,\n },\n ],\n };\n}\n\n/** Clamp image alt/title to Slack limits and record a degradation when clipped. */\nexport function clampImageText(\n value: string,\n ctx: ConversionContext,\n field: \"alt_text\" | \"title\",\n): string {\n if (value.length <= IMAGE_ALT_MAX_CHARS) {\n return value;\n }\n ctx.degradations.add({\n nodeType: \"image\",\n from: field,\n to: \"truncated\",\n reason: `Image ${field} truncated to ${String(IMAGE_ALT_MAX_CHARS)} chars`,\n path: ctx.path,\n });\n return sliceSurrogateSafe(value, IMAGE_ALT_MAX_CHARS);\n}\n\nfunction styleOrUndefined(style: RichTextStyle): RichTextStyle | undefined {\n if (\n style.bold === true ||\n style.italic === true ||\n style.strike === true ||\n style.code === true ||\n style.underline === true\n ) {\n return style;\n }\n return undefined;\n}\n\n// Raw Slack mrkdwn entity tokens (<@U…>, <#C…>, <!here>, <!subteam^S…>, <!date^…>).\n// These carry Slack IDs directly, so they convert unconditionally — no resolvers needed.\n// Candidates are matched broadly, then parsed strictly; non-parsing tokens stay literal text.\nconst SLACK_ENTITY_CANDIDATE_RE =\n /<([@#!][^<>]{1,340}|(?:https?:|mailto:)[^<>|]{1,3000}\\|[^<>]{1,300})>/gi;\nconst SLACK_USER_RE = /^@([UW][A-Z0-9]{1,60})(?:\\|[^>]{0,300})?$/;\nconst SLACK_CHANNEL_RE = /^#([CDG][A-Z0-9]{1,60})(?:\\|[^>]{0,300})?$/;\nconst SLACK_USERGROUP_RE = /^!subteam\\^(S[A-Z0-9]{1,60})(?:\\|[^>]{0,300})?$/;\nconst SLACK_BROADCAST_RE = /^!(here|channel|everyone)(?:\\|[^>]{0,300})?$/;\nconst SLACK_DATE_RE =\n /^!date\\^(\\d{1,13})\\^([^^|]{1,300})(?:\\^([^^|]{1,3000}))?(?:\\|([^]{0,300}))?$/;\nconst SLACK_LINK_RE = /^((?:https?:|mailto:)[^|]{1,3000})\\|([^]{1,300})$/i;\n\n/** Parse the inside of one `<…>` token into a rich text element, or undefined if not Slack syntax. */\nfunction slackEntityElement(inner: string, style: RichTextStyle): RichTextInline | undefined {\n const labeledLink = SLACK_LINK_RE.exec(inner);\n if (labeledLink?.[1] !== undefined && labeledLink[2] !== undefined) {\n if (!isValidLinkUrl(labeledLink[1])) {\n return undefined;\n }\n return {\n type: \"link\",\n url: labeledLink[1],\n text: labeledLink[2],\n style: styleOrUndefined(style),\n };\n }\n const user = SLACK_USER_RE.exec(inner);\n if (user?.[1] !== undefined) {\n return { type: \"user\", user_id: user[1], style: styleOrUndefined(style) };\n }\n const channel = SLACK_CHANNEL_RE.exec(inner);\n if (channel?.[1] !== undefined) {\n return { type: \"channel\", channel_id: channel[1], style: styleOrUndefined(style) };\n }\n const usergroup = SLACK_USERGROUP_RE.exec(inner);\n if (usergroup?.[1] !== undefined) {\n return { type: \"usergroup\", usergroup_id: usergroup[1], style: styleOrUndefined(style) };\n }\n const broadcast = SLACK_BROADCAST_RE.exec(inner);\n if (broadcast !== null) {\n const range = broadcast[1];\n if (range === \"here\" || range === \"channel\" || range === \"everyone\") {\n return { type: \"broadcast\", range, style: styleOrUndefined(style) };\n }\n }\n const date = SLACK_DATE_RE.exec(inner);\n if (date?.[1] !== undefined && date[2] !== undefined) {\n const timestamp = Number(date[1]);\n if (Number.isSafeInteger(timestamp)) {\n return {\n type: \"date\",\n timestamp,\n format: date[2],\n url: date[3],\n fallback: date[4],\n style: styleOrUndefined(style),\n };\n }\n }\n return undefined;\n}\n\n/**\n * Rich text inlines for a string that may contain raw Slack entity tokens.\n * Returns undefined when the string contains none (callers keep their own path).\n * Non-entity slices flow through {@link emit} so mention/emoji handling still applies.\n */\nfunction slackEntitySplit(\n value: string,\n style: RichTextStyle,\n emit: (slice: string) => ReadonlyArray<RichTextInline>,\n): RichTextInline[] | undefined {\n SLACK_ENTITY_CANDIDATE_RE.lastIndex = 0;\n let match: RegExpExecArray | null = SLACK_ENTITY_CANDIDATE_RE.exec(value);\n if (match === null) {\n return undefined;\n }\n const out: RichTextInline[] = [];\n let last = 0;\n let sawEntity = false;\n while (match !== null) {\n const element = slackEntityElement(match[1] ?? \"\", style);\n if (element !== undefined) {\n sawEntity = true;\n if (match.index > last) {\n out.push(...emit(value.slice(last, match.index)));\n }\n out.push(element);\n last = match.index + match[0].length;\n }\n match = SLACK_ENTITY_CANDIDATE_RE.exec(value);\n }\n if (!sawEntity) {\n return undefined;\n }\n if (last < value.length) {\n out.push(...emit(value.slice(last)));\n }\n return out;\n}\n\n/**\n * Section inlines for raw HTML values carrying Slack entity tokens (remark parses\n * `<!here>` and friends as html nodes). Undefined when the value has no entities.\n */\nexport function slackEntityRichTextInlines(\n value: string,\n style: RichTextStyle,\n): ReadonlyArray<RichTextInline> | undefined {\n return slackEntitySplit(value, style, (slice) => emitTextWithEmoji(slice, style));\n}\n\n// Require a non-identifier boundary so emails like user@example.com are not\n// mentions. Handles may contain dots (\"john.doe\") but never start or end with\n// one — a trailing dot is sentence punctuation (\"ping @sarah.\"), and matching\n// it made the handle unresolvable.\nconst MENTION_RE =\n /(?<![A-Za-z0-9._-])@([a-zA-Z0-9_-](?:[a-zA-Z0-9._-]{0,62}[a-zA-Z0-9_-])?)|(?<![A-Za-z0-9_-])#([a-zA-Z0-9_-]{1,80})/g;\n\n/** True when mention resolvers are configured and phrasing contains @user / #channel tokens. */\nexport function phrasingNeedsMentionResolution(\n nodes: ReadonlyArray<PhrasingContent>,\n ctx: ConversionContext,\n): boolean {\n const resolvers = ctx.config.mentionResolvers;\n if (resolvers?.resolveUser === undefined && resolvers?.resolveChannel === undefined) {\n return false;\n }\n const plain = phrasingToPlain(nodes);\n MENTION_RE.lastIndex = 0;\n return MENTION_RE.test(plain);\n}\n\nfunction emitTextWithMentionsAndEmoji(\n node: Text,\n style: RichTextStyle,\n ctx: ConversionContext,\n): RichTextInline[] {\n // Raw Slack entity tokens (<@U…>, <#C…>, …) convert first; remaining slices\n // still get resolver-based @handle/#channel and emoji shortcode handling.\n const viaEntities = slackEntitySplit(node.value, style, (slice) =>\n emitMentionsAndEmoji(slice, style, ctx),\n );\n if (viaEntities !== undefined) {\n return viaEntities;\n }\n return emitMentionsAndEmoji(node.value, style, ctx);\n}\n\nfunction emitMentionsAndEmoji(\n value: string,\n style: RichTextStyle,\n ctx: ConversionContext,\n): RichTextInline[] {\n const resolvers = ctx.config.mentionResolvers;\n const canUser = resolvers?.resolveUser !== undefined;\n const canChannel = resolvers?.resolveChannel !== undefined;\n if (!canUser && !canChannel) {\n return emitTextWithEmoji(value, style);\n }\n\n const out: RichTextInline[] = [];\n MENTION_RE.lastIndex = 0;\n let last = 0;\n let match: RegExpExecArray | null = MENTION_RE.exec(value);\n while (match !== null) {\n const start = match.index;\n if (start > last) {\n out.push(...emitTextWithEmoji(value.slice(last, start), style));\n }\n const userHandle = match[1];\n const channelName = match[2];\n if (userHandle !== undefined && canUser) {\n const userId = resolvers.resolveUser?.(userHandle);\n if (userId !== undefined && userId.length > 0) {\n out.push({ type: \"user\", user_id: userId, style: styleOrUndefined(style) });\n } else {\n out.push(...emitTextWithEmoji(match[0], style));\n }\n } else if (channelName !== undefined && canChannel) {\n const channelId = resolvers.resolveChannel?.(channelName);\n if (channelId !== undefined && channelId.length > 0) {\n out.push({ type: \"channel\", channel_id: channelId, style: styleOrUndefined(style) });\n } else {\n out.push(...emitTextWithEmoji(match[0], style));\n }\n } else {\n out.push(...emitTextWithEmoji(match[0], style));\n }\n last = start + match[0].length;\n match = MENTION_RE.exec(value);\n }\n if (last < value.length) {\n out.push(...emitTextWithEmoji(value.slice(last), style));\n }\n if (out.length === 0) {\n out.push(...emitTextWithEmoji(value, style));\n }\n return out;\n}\n\nfunction emitTextWithEmoji(value: string, style: RichTextStyle): RichTextInline[] {\n const out: RichTextInline[] = [];\n EMOJI_SHORTCODE_RE.lastIndex = 0;\n let last = 0;\n let match: RegExpExecArray | null = EMOJI_SHORTCODE_RE.exec(value);\n while (match !== null) {\n const start = match.index;\n if (start > last) {\n out.push({ type: \"text\", text: value.slice(last, start), style: styleOrUndefined(style) });\n }\n const emoji: RichTextEmoji = { type: \"emoji\", name: match[1] ?? \"\" };\n out.push(emoji);\n last = start + match[0].length;\n match = EMOJI_SHORTCODE_RE.exec(value);\n }\n if (last < value.length) {\n out.push({ type: \"text\", text: value.slice(last), style: styleOrUndefined(style) });\n }\n if (out.length === 0) {\n out.push({ type: \"text\", text: value, style: styleOrUndefined(style) });\n }\n return out;\n}\n\ninterface ReassembledSlackLink {\n readonly leadingText: Text;\n readonly link: RichTextLink;\n readonly trailingText: Text;\n}\n\n/**\n * Slack labeled links whose label contains spaces (`<https://u|two words>`)\n * parse as text ending in \"<\", an autolink whose url swallowed \"|firstWord\",\n * then text carrying the rest of the label up to \">\". Reassemble the trio.\n */\nfunction reassembleSlackLabeledLink(\n work: ReadonlyArray<PhrasingContent>,\n i: number,\n style: RichTextStyle,\n): ReassembledSlackLink | undefined {\n const lead = work[i];\n const linkNode = work[i + 1];\n const tail = work[i + 2];\n if (lead?.type !== \"text\" || !lead.value.endsWith(\"<\")) {\n return undefined;\n }\n if (linkNode?.type !== \"link\" || tail?.type !== \"text\") {\n return undefined;\n }\n const url = linkNode.url;\n const pipeIndex = url.indexOf(\"|\");\n if (pipeIndex <= 0 || !HTTP_URL_RE.test(url)) {\n return undefined;\n }\n // Only GFM literal autolinks qualify (label text equals the raw url).\n if (phrasingToPlain(linkNode.children) !== url) {\n return undefined;\n }\n const closeIndex = tail.value.indexOf(\">\");\n if (closeIndex === -1) {\n return undefined;\n }\n const realUrl = url.slice(0, pipeIndex);\n if (!isValidLinkUrl(realUrl)) {\n return undefined;\n }\n const label = `${url.slice(pipeIndex + 1)}${tail.value.slice(0, closeIndex)}`;\n if (label.length === 0) {\n return undefined;\n }\n return {\n leadingText: { type: \"text\", value: lead.value.slice(0, -1) },\n link: { type: \"link\", url: realUrl, text: label, style: styleOrUndefined(style) },\n trailingText: { type: \"text\", value: tail.value.slice(closeIndex + 1) },\n };\n}\n\nfunction emitLink(node: Link, ctx: ConversionContext, style: RichTextStyle): RichTextInline[] {\n const url = node.url;\n const text = phrasingToPlain(node.children);\n // Slack-style labeled autolink <https://url|label>: remark folds the pipe and\n // label into the URL of an autolink. Split them back apart.\n const pipeIndex = url.indexOf(\"|\");\n if (pipeIndex > 0 && HTTP_URL_RE.test(url) && text === url) {\n const realUrl = url.slice(0, pipeIndex);\n const label = url.slice(pipeIndex + 1);\n if (label.length > 0 && isValidLinkUrl(realUrl)) {\n return [{ type: \"link\", url: realUrl, text: label, style: styleOrUndefined(style) }];\n }\n }\n if (!isValidLinkUrl(url)) {\n ctx.degradations.add({\n nodeType: \"link\",\n from: \"link\",\n to: \"text\",\n reason: \"Invalid or oversized URL\",\n path: ctx.path,\n });\n const suffix = url.length > 0 && url !== text ? ` (${url})` : \"\";\n return [{ type: \"text\", text: `${text}${suffix}`, style: styleOrUndefined(style) }];\n }\n const link: RichTextLink = {\n type: \"link\",\n url,\n text: text.length > 0 ? text : url,\n style: styleOrUndefined(style),\n };\n return [link];\n}\n\nfunction emitLinkReference(\n node: LinkReference,\n ctx: ConversionContext,\n style: RichTextStyle,\n): RichTextInline[] {\n const def = ctx.definitions.get(node.identifier.toLowerCase());\n if (def === undefined) {\n return [\n {\n type: \"text\",\n text: phrasingToPlain(node.children) || node.identifier,\n style: styleOrUndefined(style),\n },\n ];\n }\n return emitLink(\n {\n type: \"link\",\n url: def.url,\n title: def.title ?? undefined,\n children: node.children,\n },\n ctx,\n style,\n );\n}\n\n/**\n * Slack rich text link elements require absolute http(s)/mailto URLs; relative\n * URLs (`/path`, `#fragment`) or other schemes are rejected with invalid_blocks.\n * https://docs.slack.dev/reference/block-kit/block-elements/rich-text-elements\n */\nexport function isValidLinkUrl(url: string): boolean {\n if (url.length === 0 || url.length > IMAGE_URL_MAX_CHARS) {\n return false;\n }\n return HTTP_URL_RE.test(url);\n}\n\n/** Anchor state collected across `<a href>` … `</a>` tags before emission. */\ninterface OpenAnchor {\n readonly href: string;\n readonly style: RichTextStyle;\n readonly textParts: string[];\n readonly valid: boolean;\n}\n\n/** Emit a collected anchor as a link, or degrade to text+suffix when the href is not link-safe. */\nfunction anchorInline(anchor: OpenAnchor, ctx: ConversionContext): RichTextInline {\n const label = anchor.textParts.join(\"\");\n if (anchor.valid) {\n return {\n type: \"link\",\n url: anchor.href,\n text: label.length > 0 ? label : anchor.href,\n style: styleOrUndefined(anchor.style),\n };\n }\n ctx.degradations.add({\n nodeType: \"link\",\n from: \"link\",\n to: \"text\",\n reason: \"Invalid or oversized URL\",\n path: ctx.path,\n });\n const base = label.length > 0 ? label : anchor.href;\n const suffix =\n label.length > 0 && anchor.href.length > 0 && anchor.href !== label ? ` (${anchor.href})` : \"\";\n return { type: \"text\", text: `${base}${suffix}`, style: styleOrUndefined(anchor.style) };\n}\n\n// remark emits formatting tags as standalone html nodes (<b> and </b> are\n// siblings of the text they wrap); these single-tag patterns drive the\n// cross-node style stack in emitPhrasing.\nconst HTML_STYLE_OPEN_RE = /^<(b|strong|i|em|s|del|code)(\\s+[^>]{0,200})?>$/i;\nconst HTML_STYLE_CLOSE_RE = /^<\\/(b|strong|i|em|s|del|code)\\s*>$/i;\n\nfunction htmlTagStyle(base: RichTextStyle, tag: string): RichTextStyle {\n const t = tag.toLowerCase();\n if (t === \"b\" || t === \"strong\") {\n return { ...base, bold: true };\n }\n if (t === \"i\" || t === \"em\") {\n return { ...base, italic: true };\n }\n if (t === \"s\" || t === \"del\") {\n return { ...base, strike: true };\n }\n return { ...base, code: true };\n}\n\n// Alternatives in match order: known tag (optionally self-closing), unknown\n// tag (stripped), a text run, or a stray \"<\" kept literal so unknown tags can\n// never leak fragments like \"ad>\" into the output.\nconst INLINE_TAG_RE =\n /<\\/?(b|strong|i|em|s|del|code|br|a)(\\s+[^>]{0,200})?\\s*\\/?>|<[^>]{0,200}>|[^<]+|</gi;\n\nfunction emitInlineHtml(\n html: string,\n style: RichTextStyle,\n ctx: ConversionContext,\n): RichTextInline[] {\n const out: RichTextInline[] = [];\n const stack: Array<{ tag: string; style: RichTextStyle }> = [];\n let current = style;\n let openAnchor: OpenAnchor | undefined;\n INLINE_TAG_RE.lastIndex = 0;\n let m: RegExpExecArray | null = INLINE_TAG_RE.exec(html);\n let strippedUnknown = false;\n while (m !== null) {\n const token = m[0];\n if (token.startsWith(\"<\") && token.length > 1 && m[1] === undefined) {\n // Unknown <…> tag — strip it (flagged below) instead of leaking fragments.\n strippedUnknown = true;\n m = INLINE_TAG_RE.exec(html);\n continue;\n }\n if (token.startsWith(\"<\") && m[1] !== undefined) {\n const tag = (m[1] ?? \"\").toLowerCase();\n const closing = token.startsWith(\"</\");\n if (tag === \"br\") {\n if (openAnchor !== undefined) {\n openAnchor.textParts.push(\"\\n\");\n } else {\n out.push({ type: \"text\", text: \"\\n\", style: styleOrUndefined(current) });\n }\n } else if (closing) {\n if (tag === \"a\" && openAnchor !== undefined) {\n out.push(anchorInline(openAnchor, ctx));\n openAnchor = undefined;\n }\n stack.pop();\n current = stack.length > 0 ? (stack[stack.length - 1]?.style ?? style) : style;\n } else if (tag === \"a\") {\n const hrefMatch = /href\\s*=\\s*[\"']([^\"']{0,3000})[\"']/i.exec(token);\n const href = hrefMatch?.[1];\n stack.push({ tag, style: current });\n if (href !== undefined) {\n // Collect label text until </a>; do not emit yet. A nested <a> closes\n // the outer anchor first so its collected label is not dropped.\n if (openAnchor !== undefined) {\n out.push(anchorInline(openAnchor, ctx));\n }\n openAnchor = { href, style: current, textParts: [], valid: isValidLinkUrl(href) };\n }\n } else {\n const next = { ...current };\n if (tag === \"b\" || tag === \"strong\") next.bold = true;\n if (tag === \"i\" || tag === \"em\") next.italic = true;\n if (tag === \"s\" || tag === \"del\") next.strike = true;\n if (tag === \"code\") next.code = true;\n stack.push({ tag, style: next });\n current = next;\n }\n } else if (token.length > 0) {\n if (openAnchor !== undefined) {\n openAnchor.textParts.push(token);\n } else {\n out.push({ type: \"text\", text: token, style: styleOrUndefined(current) });\n }\n }\n m = INLINE_TAG_RE.exec(html);\n }\n if (openAnchor !== undefined) {\n out.push(anchorInline(openAnchor, ctx));\n }\n if (strippedUnknown) {\n ctx.degradations.add({\n nodeType: \"html\",\n from: \"html\",\n to: \"text\",\n reason: \"Unrecognized inline HTML stripped to text\",\n path: ctx.path,\n });\n }\n return out;\n}\n\nfunction coalesceText(elements: ReadonlyArray<RichTextInline>): RichTextInline[] {\n const out: RichTextInline[] = [];\n for (const el of elements) {\n const prev = out[out.length - 1];\n if (\n el.type === \"text\" &&\n prev !== undefined &&\n prev.type === \"text\" &&\n JSON.stringify(prev.style) === JSON.stringify(el.style)\n ) {\n out[out.length - 1] = { type: \"text\", text: prev.text + el.text, style: prev.style };\n } else {\n out.push(el);\n }\n }\n return out;\n}\n","import type { Code, RootContent } from \"mdast\";\n\nimport type { Block, RichTextBlock } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\n\nimport { preformattedRichText } from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * Plain code fences → rich_text_preformatted (+language when flagged).\n * Mermaid/math dialects are handled by more specific adapters that match first.\n */\nexport class CodeFenceAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"code\";\n }\n\n plan(node: RootContent, _ctx: ConversionContext): ReadonlyArray<Candidate> {\n const code = node as Code;\n const hasLang = code.lang !== null && code.lang !== undefined && code.lang.length > 0;\n return [\n {\n requires: [\"preformattedLanguage\"],\n budget: { blocks: 1 },\n emit: (): ReadonlyArray<Block> => [preformatted(code, true)],\n },\n {\n budget: { blocks: 1 },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n if (hasLang) {\n emitCtx.degradations.add({\n nodeType: \"code\",\n from: \"preformatted.language\",\n to: \"preformatted\",\n reason: \"preformattedLanguage capability unavailable; omitting language\",\n path: emitCtx.path,\n });\n }\n return [preformatted(code, false)];\n },\n },\n ];\n }\n}\n\nfunction preformatted(code: Code, withLang: boolean): RichTextBlock {\n const language =\n withLang && code.lang !== null && code.lang !== undefined && code.lang.length > 0\n ? code.lang.toLowerCase()\n : undefined;\n return preformattedRichText(code.value, language);\n}\n","import type { Heading, RootContent } from \"mdast\";\n\nimport type { Block, HeaderBlock, RichTextBlock } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport { HEADER_LEVEL_MAX, HEADER_TEXT_MAX_CHARS } from \"../constants.js\";\n\nimport {\n countHoistableImages,\n emitPhrasing,\n hoistedImageBlock,\n phrasingNeedsMentionResolution,\n phrasingToPlain,\n} from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * Headings 1–4 → header (+level); 5–6 / overflow → bold rich_text.\n */\nexport class HeadingAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"heading\";\n }\n\n plan(node: RootContent, ctx: ConversionContext): ReadonlyArray<Candidate> {\n const heading = node as Heading;\n const hoistCount = countHoistableImages(heading.children, ctx);\n const needsRich = headingNeedsRichText(heading, ctx);\n\n if (!needsRich) {\n return [\n {\n requires: [\"headerLevel\"],\n budget: { blocks: 1 },\n emit: (): ReadonlyArray<Block> => {\n return emitPlainHeader(heading, true);\n },\n },\n {\n budget: { blocks: 1 },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n emitCtx.degradations.add({\n nodeType: \"heading\",\n from: \"header.level\",\n to: \"header\",\n reason: \"headerLevel capability unavailable; omitting level\",\n path: emitCtx.path,\n });\n return emitPlainHeader(heading, false);\n },\n },\n ];\n }\n\n const richCandidates: Candidate[] = [\n {\n budget: { blocks: 1 + hoistCount },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n return emitRichHeading(heading, emitCtx, true);\n },\n },\n ];\n if (hoistCount > 0) {\n richCandidates.push({\n budget: { blocks: 1 },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n emitCtx.degradations.add({\n nodeType: \"heading\",\n from: \"rich_text+images\",\n to: \"rich_text\",\n reason: \"Budget exhausted for hoisted heading images; emitting text only\",\n path: emitCtx.path,\n });\n return emitRichHeading(heading, emitCtx, false);\n },\n });\n }\n return richCandidates;\n }\n}\n\nfunction headingNeedsRichText(heading: Heading, ctx: ConversionContext): boolean {\n if (heading.depth > HEADER_LEVEL_MAX) {\n return true;\n }\n const plain = phrasingToPlain(heading.children);\n if (plain.length > HEADER_TEXT_MAX_CHARS) {\n return true;\n }\n if (phrasingNeedsMentionResolution(heading.children, ctx)) {\n return true;\n }\n return heading.children.some(\n (c) =>\n c.type === \"link\" ||\n c.type === \"inlineCode\" ||\n c.type === \"strong\" ||\n c.type === \"emphasis\" ||\n c.type === \"delete\" ||\n c.type === \"image\" ||\n c.type === \"imageReference\" ||\n c.type === \"html\",\n );\n}\n\nfunction emitPlainHeader(heading: Heading, withLevel: boolean): ReadonlyArray<Block> {\n const plain = phrasingToPlain(heading.children);\n const block: HeaderBlock = {\n type: \"header\",\n text: { type: \"plain_text\", text: plain.length > 0 ? plain : \" \" },\n level: withLevel ? headerLevelOf(heading.depth) : undefined,\n };\n return [block];\n}\n\n/**\n * Narrows mdast depth (1–6) to Slack's header domain (1–4, `HEADER_LEVEL_MAX`).\n * Only reachable for depth ≤ 4: deeper headings take the rich_text path.\n */\nfunction headerLevelOf(depth: Heading[\"depth\"]): HeaderBlock[\"level\"] {\n return depth === 1 || depth === 2 || depth === 3 || depth === 4 ? depth : undefined;\n}\n\nfunction emitRichHeading(\n heading: Heading,\n ctx: ConversionContext,\n hoistImages: boolean,\n): ReadonlyArray<Block> {\n const plain = phrasingToPlain(heading.children);\n const depth = heading.depth;\n if (depth > HEADER_LEVEL_MAX) {\n ctx.degradations.add({\n nodeType: \"heading\",\n from: `header.h${String(depth)}`,\n to: \"rich_text.bold\",\n reason: `Heading level ${String(depth)} exceeds max ${String(HEADER_LEVEL_MAX)}`,\n path: ctx.path,\n });\n } else if (plain.length > HEADER_TEXT_MAX_CHARS) {\n ctx.degradations.add({\n nodeType: \"heading\",\n from: \"header\",\n to: \"rich_text.bold\",\n reason: \"Heading exceeds 150 plain chars\",\n path: ctx.path,\n });\n } else {\n ctx.degradations.add({\n nodeType: \"heading\",\n from: \"header\",\n to: \"rich_text.bold\",\n reason:\n \"Heading contains inline content unsupported by header (styles, links, images, or mentions)\",\n path: ctx.path,\n });\n }\n\n const inline = emitPhrasing(heading.children, ctx, { bold: true });\n const rich: RichTextBlock = {\n type: \"rich_text\",\n elements: [\n {\n type: \"rich_text_section\",\n elements:\n inline.elements.length > 0\n ? inline.elements\n : [{ type: \"text\", text: \" \", style: { bold: true } }],\n },\n ],\n };\n const blocks: Block[] = [rich];\n if (!hoistImages) {\n return blocks;\n }\n for (const h of inline.hoistedImages) {\n blocks.push(hoistedImageBlock(h, ctx));\n }\n return blocks;\n}\n","import type { Html, RootContent } from \"mdast\";\n\nimport type { Block, ContainerBlock, SectionBlock } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport { CONTAINER_CHILDREN_MAX, CONTAINER_TITLE_MAX_CHARS } from \"../constants.js\";\nimport { sliceSurrogateSafe } from \"../utf16.js\";\n\nimport { clampSectionText, slackEntityRichTextInlines } from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\nconst DETAILS_RE =\n /<details\\b[^>]{0,200}>\\s*<summary\\b[^>]{0,200}>([\\s\\S]{0,500}?)<\\/summary>([\\s\\S]{0,8000}?)<\\/details>/i;\n\n/**\n * Block HTML — details/summary → container; else strip+warn.\n */\nexport class HtmlBlockAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"html\";\n }\n\n plan(node: RootContent, _ctx: ConversionContext): ReadonlyArray<Candidate> {\n const html = node as Html;\n // details/summary must win over the Slack-entity path: a collapsible block\n // that also mentions <@U…> should stay a container, not flatten to rich_text.\n const details = DETAILS_RE.exec(html.value);\n if (details !== null) {\n const title = stripTags(details[1] ?? \"Details\").trim();\n const body = stripTags(details[2] ?? \"\").trim();\n return [\n {\n requires: [\"containerBlock\"],\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n const child: SectionBlock = {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: clampSectionText(body.length > 0 ? body : \" \", ctx, \"html.details.body\"),\n },\n };\n const block: ContainerBlock = {\n type: \"container\",\n title: {\n type: \"plain_text\",\n text: clampContainerTitle(title.length > 0 ? title : \"Details\", ctx),\n },\n child_blocks: [child].slice(0, CONTAINER_CHILDREN_MAX),\n is_collapsible: true,\n };\n return [block];\n },\n },\n {\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n ctx.degradations.add({\n nodeType: \"html.details\",\n from: \"container\",\n to: \"section\",\n reason: \"containerBlock unavailable\",\n path: ctx.path,\n });\n return [\n {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: clampSectionText(`*${title}*\\n${body}`, ctx, \"html.details.section\"),\n },\n },\n ];\n },\n },\n ];\n }\n\n // A line like \"<!here> deploying now\" parses as one block html node; Slack\n // entity tokens must survive as rich text elements, not be stripped as tags.\n const entityInlines = slackEntityRichTextInlines(html.value.trim(), {});\n if (entityInlines !== undefined) {\n return [\n {\n budget: { blocks: 1 },\n emit: (): ReadonlyArray<Block> => [\n {\n type: \"rich_text\",\n elements: [{ type: \"rich_text_section\", elements: entityInlines }],\n },\n ],\n },\n ];\n }\n\n return [\n {\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n ctx.degradations.add({\n nodeType: \"html\",\n from: \"html\",\n to: \"section\",\n reason: \"Unsupported block HTML stripped to text\",\n path: ctx.path,\n });\n const text = stripTags(html.value).trim();\n if (text.length === 0) {\n return [];\n }\n return [\n {\n type: \"section\",\n text: { type: \"mrkdwn\", text: clampSectionText(text, ctx, \"html.section\") },\n },\n ];\n },\n },\n ];\n }\n}\n\nfunction stripTags(html: string): string {\n return html.replace(/<[^>]{0,200}>/g, \"\");\n}\n\nfunction clampContainerTitle(text: string, ctx: ConversionContext): string {\n if (text.length <= CONTAINER_TITLE_MAX_CHARS) {\n return text;\n }\n ctx.degradations.add({\n nodeType: \"html.details\",\n from: \"container.title\",\n to: \"truncated\",\n reason: `Container title truncated to ${String(CONTAINER_TITLE_MAX_CHARS)} chars`,\n path: ctx.path,\n });\n return sliceSurrogateSafe(text, CONTAINER_TITLE_MAX_CHARS);\n}\n","import type { List, ListItem, PhrasingContent, RootContent } from \"mdast\";\nimport { toString } from \"mdast-util-to-string\";\n\nimport type { Block, RichTextBlock, RichTextList, RichTextSection } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport { RICH_TEXT_LIST_INDENT_MAX } from \"../constants.js\";\n\nimport {\n countHoistableImages,\n emitPhrasing,\n hoistedImageBlock,\n type HoistedImage,\n} from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * Non-task lists → rich_text_list with sibling-indent nesting.\n */\nexport class ListAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n if (node.type !== \"list\") {\n return false;\n }\n return !isTaskList(node);\n }\n\n plan(node: RootContent, ctx: ConversionContext): ReadonlyArray<Candidate> {\n const list = node as List;\n const hoistCount = countHoistableImagesInList(list, ctx);\n const candidates: Candidate[] = [\n {\n budget: { blocks: 1 + hoistCount },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n return emitListBlocks(list, emitCtx, true);\n },\n },\n ];\n if (hoistCount > 0) {\n candidates.push({\n budget: { blocks: 1 },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n emitCtx.degradations.add({\n nodeType: \"list\",\n from: \"rich_text+images\",\n to: \"rich_text\",\n reason: \"Budget exhausted for hoisted list images; emitting text only\",\n path: emitCtx.path,\n });\n return emitListBlocks(list, emitCtx, false);\n },\n });\n }\n return candidates;\n }\n}\n\nfunction emitListBlocks(\n list: List,\n emitCtx: ConversionContext,\n hoistImages: boolean,\n): ReadonlyArray<Block> {\n const { elements, hoistedImages } = emitListTree(list, 0, emitCtx);\n const block: RichTextBlock = { type: \"rich_text\", elements };\n const blocks: Block[] = [block];\n if (!hoistImages) {\n return blocks;\n }\n for (const h of hoistedImages) {\n blocks.push(hoistedImageBlock(h, emitCtx));\n }\n return blocks;\n}\n\nexport function isTaskList(list: List): boolean {\n return list.children.some((item) => item.checked === true || item.checked === false);\n}\n\nfunction countHoistableImagesInList(list: List, ctx: ConversionContext): number {\n let count = 0;\n for (const item of list.children) {\n count += countHoistableImages(collectListItemPhrasing(item), ctx);\n for (const child of item.children) {\n if (child.type === \"list\") {\n count += countHoistableImagesInList(child, ctx);\n }\n }\n }\n return count;\n}\n\nfunction emitListTree(\n list: List,\n indent: number,\n ctx: ConversionContext,\n): { elements: Array<RichTextList>; hoistedImages: HoistedImage[] } {\n let effectiveIndent = indent;\n if (effectiveIndent > RICH_TEXT_LIST_INDENT_MAX) {\n ctx.degradations.add({\n nodeType: \"list\",\n from: `indent:${String(effectiveIndent)}`,\n to: `indent:${String(RICH_TEXT_LIST_INDENT_MAX)}`,\n reason: \"List indent clamped at 6\",\n path: ctx.path,\n });\n effectiveIndent = RICH_TEXT_LIST_INDENT_MAX;\n }\n\n const ordered = list.ordered === true;\n const startOffset =\n ordered && list.start !== null && list.start !== undefined && list.start > 1\n ? list.start - 1\n : 0;\n\n // Slack nests a higher-indent rich_text_list under the *last* item of the\n // preceding same-indent chunk (see Block Kit rich_text examples). Keep\n // nest-free siblings in the buffer and flush only when an item has children\n // so that item is last in its chunk; ordered continuation chunks carry an\n // offset so numbering resumes where it left off.\n const out: RichTextList[] = [];\n const hoistedImages: HoistedImage[] = [];\n let pendingSections: RichTextSection[] = [];\n\n const flush = (lastIndex: number): void => {\n if (pendingSections.length === 0) {\n return;\n }\n const chunkStartIndex = lastIndex - pendingSections.length + 1;\n const offset = startOffset + chunkStartIndex;\n out.push({\n type: \"rich_text_list\",\n style: ordered ? \"ordered\" : \"bullet\",\n elements: pendingSections,\n indent: effectiveIndent,\n offset: ordered && offset > 0 ? offset : undefined,\n });\n pendingSections = [];\n };\n\n for (const [index, item] of list.children.entries()) {\n const { section, childLists, hoistedImages: itemImages } = emitListItem(item, ctx);\n pendingSections.push(section);\n hoistedImages.push(...itemImages);\n if (childLists.length === 0) {\n continue;\n }\n flush(index);\n for (const child of childLists) {\n const nestedResult = emitListTree(child, effectiveIndent + 1, ctx);\n out.push(...nestedResult.elements);\n hoistedImages.push(...nestedResult.hoistedImages);\n }\n }\n flush(list.children.length - 1);\n\n if (out.length === 0) {\n out.push({\n type: \"rich_text_list\",\n style: ordered ? \"ordered\" : \"bullet\",\n elements: [{ type: \"rich_text_section\", elements: [{ type: \"text\", text: \" \" }] }],\n indent: effectiveIndent,\n offset: undefined,\n });\n }\n\n return { elements: out, hoistedImages };\n}\n\n/** Phrasing content of a list item for hoist counting — no degradations emitted. */\nfunction collectListItemPhrasing(item: ListItem): PhrasingContent[] {\n const phrasing: PhrasingContent[] = [];\n let sawBlock = false;\n\n for (const child of item.children) {\n if (child.type === \"paragraph\") {\n if (sawBlock) {\n phrasing.push({ type: \"text\", value: \"\\n\" });\n }\n phrasing.push(...child.children);\n sawBlock = true;\n } else if (child.type !== \"list\") {\n sawBlock = true;\n }\n }\n return phrasing;\n}\n\nfunction emitListItem(\n item: ListItem,\n ctx: ConversionContext,\n): { section: RichTextSection; childLists: List[]; hoistedImages: HoistedImage[] } {\n const phrasing: PhrasingContent[] = [];\n const childLists: List[] = [];\n let sawBlock = false;\n\n for (const child of item.children) {\n if (child.type === \"paragraph\") {\n if (sawBlock) {\n phrasing.push({ type: \"text\", value: \"\\n\" });\n }\n phrasing.push(...child.children);\n sawBlock = true;\n } else if (child.type === \"list\") {\n childLists.push(child);\n } else {\n ctx.degradations.add({\n nodeType: \"listItem\",\n from: child.type,\n to: \"text\",\n reason: \"Block child of list item flattened into text\",\n path: ctx.path,\n });\n const text = toString(child);\n if (text.length > 0) {\n phrasing.push({ type: \"text\", value: text });\n }\n sawBlock = true;\n }\n }\n\n const inline = emitPhrasing(phrasing, ctx);\n return {\n section: {\n type: \"rich_text_section\",\n elements: inline.elements.length > 0 ? inline.elements : [{ type: \"text\", text: \" \" }],\n },\n childLists,\n hoistedImages: [...inline.hoistedImages],\n };\n}\n","import type { RootContent } from \"mdast\";\n\nimport type { Block, RichTextBlock } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\n\nimport { preformattedRichText } from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * Display math → preformatted TeX (renderer path is phase 2).\n */\nexport class MathBlockAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"math\";\n }\n\n plan(node: RootContent, _ctx: ConversionContext): ReadonlyArray<Candidate> {\n const value = \"value\" in node && typeof node.value === \"string\" ? node.value : \"\";\n return [\n {\n requires: [\"preformattedLanguage\"],\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n return [preformattedMath(value, true, ctx)];\n },\n },\n {\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n ctx.degradations.add({\n nodeType: \"math\",\n from: \"preformatted.language\",\n to: \"preformatted\",\n reason: \"preformattedLanguage capability unavailable; omitting language\",\n path: ctx.path,\n });\n return [preformattedMath(value, false, ctx)];\n },\n },\n ];\n }\n}\n\nfunction preformattedMath(value: string, withLang: boolean, ctx: ConversionContext): RichTextBlock {\n ctx.degradations.add({\n nodeType: \"math\",\n from: \"math\",\n to: \"rich_text_preformatted\",\n reason: \"No math renderer configured; emitting TeX source\",\n path: ctx.path,\n });\n return preformattedRichText(value, withLang ? \"latex\" : undefined);\n}\n","import type { Code, RootContent } from \"mdast\";\n\nimport type { Block, DataVisualizationBlock, ImageBlock, RichTextBlock } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport { RecordingDegradationCollector } from \"../budget/recording-degradation-collector.js\";\nimport {\n CHART_LABEL_MAX_CHARS,\n CHART_POINTS_MAX,\n CHART_SEGMENTS_MAX,\n CHART_SERIES_MAX,\n CHART_TITLE_MAX_CHARS,\n IMAGE_URL_MAX_CHARS,\n} from \"../constants.js\";\nimport type {\n ImageRenderer,\n MermaidChartParser,\n MermaidPieAst,\n MermaidXyChartAst,\n RenderRequest,\n SlackUploader,\n} from \"../types.js\";\n\nimport { clampImageText, preformattedRichText, truncateLabel } from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\nexport interface MermaidFenceAdapterDeps {\n readonly pieParser: MermaidChartParser;\n readonly xyParser: MermaidChartParser;\n}\n\n/**\n * Mermaid fences → data_visualization / image renderer / preformatted.\n */\nexport class MermaidFenceAdapter implements NodeAdapter {\n private readonly pieParser: MermaidChartParser;\n private readonly xyParser: MermaidChartParser;\n\n constructor(deps: MermaidFenceAdapterDeps) {\n this.pieParser = deps.pieParser;\n this.xyParser = deps.xyParser;\n }\n\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"code\" && (node.lang ?? \"\").toLowerCase() === \"mermaid\";\n }\n\n plan(node: RootContent, ctx: ConversionContext): ReadonlyArray<Candidate> {\n const code = node as Code;\n const source = code.value;\n const kind = detectMermaidKind(source);\n const candidates: Candidate[] = [];\n\n // Probe native chart viability with a throwaway collector so plan-time\n // parse/limit failures are not recorded unless the native candidate emits.\n const probeCtx = ctx.withDegradations(new RecordingDegradationCollector());\n\n if (kind === \"pie\") {\n const parsed = this.pieParser.parse(source);\n if (parsed.ok && parsed.value.kind === \"pie\") {\n const probe = tryPieBlock(parsed.value, probeCtx);\n if (probe !== undefined) {\n const ast = parsed.value;\n candidates.push({\n requires: [\"dataVisualization\"],\n budget: { blocks: 1, chart: true },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n const block = tryPieBlock(ast, emitCtx);\n return block !== undefined ? [block] : [];\n },\n });\n }\n }\n } else if (kind === \"xychart-beta\") {\n const parsed = this.xyParser.parse(source);\n if (parsed.ok && parsed.value.kind === \"xychart-beta\") {\n const probe = tryXyBlock(parsed.value, probeCtx);\n if (probe !== undefined) {\n const ast = parsed.value;\n candidates.push({\n requires: [\"dataVisualization\"],\n budget: { blocks: 1, chart: true },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n const block = tryXyBlock(ast, emitCtx);\n return block !== undefined ? [block] : [];\n },\n });\n }\n }\n }\n\n candidates.push({\n budget: { blocks: 1 },\n emit: async (emitCtx: ConversionContext): Promise<ReadonlyArray<Block>> => {\n const rendered = await tryRenderers(source, emitCtx);\n if (rendered !== undefined) {\n return [rendered];\n }\n emitCtx.degradations.add({\n nodeType: \"code.mermaid\",\n from: kind,\n to: \"rich_text_preformatted\",\n reason: \"No native chart / renderer image; emitting mermaid source\",\n path: emitCtx.path,\n });\n return [preformattedMermaid(source, emitCtx)];\n },\n });\n\n return candidates;\n }\n}\n\nfunction detectMermaidKind(source: string): \"pie\" | \"xychart-beta\" | \"other\" {\n const first = source\n .split(/\\r?\\n/)\n .map((l) => l.replace(/%%[^\\n]{0,500}/, \"\").trim())\n .find((l) => l.length > 0);\n if (first === undefined) {\n return \"other\";\n }\n if (/^pie\\b/i.test(first)) {\n return \"pie\";\n }\n if (/^xychart-beta\\b/i.test(first)) {\n return \"xychart-beta\";\n }\n return \"other\";\n}\n\nfunction tryPieBlock(\n ast: MermaidPieAst,\n ctx: ConversionContext,\n): DataVisualizationBlock | undefined {\n if (ast.segments.length > CHART_SEGMENTS_MAX) {\n ctx.degradations.add({\n nodeType: \"code.mermaid.pie\",\n from: \"data_visualization\",\n to: \"fallback\",\n reason: `Pie has ${String(ast.segments.length)} segments (max ${String(CHART_SEGMENTS_MAX)})`,\n path: ctx.path,\n });\n return undefined;\n }\n const segments = ast.segments.map((s) => {\n const t = truncateLabel(s.label, CHART_LABEL_MAX_CHARS);\n if (t.truncated) {\n ctx.degradations.add({\n nodeType: \"code.mermaid.pie\",\n from: s.label,\n to: t.text,\n reason: \"Pie label truncated to 20 chars\",\n path: ctx.path,\n });\n }\n return { label: t.text, value: s.value };\n });\n const titleRaw =\n ast.title ??\n (ctx.precedingHeading !== undefined && ctx.precedingHeading.length > 0\n ? ctx.precedingHeading\n : \"Chart\");\n return {\n type: \"data_visualization\",\n title: truncateChartTitle(titleRaw, ctx, \"code.mermaid.pie\"),\n chart: { type: \"pie\", segments },\n };\n}\n\nfunction tryXyBlock(\n ast: MermaidXyChartAst,\n ctx: ConversionContext,\n): DataVisualizationBlock | undefined {\n const categories = ast.categories.map((c) => {\n const t = truncateLabel(c, CHART_LABEL_MAX_CHARS);\n if (t.truncated) {\n ctx.degradations.add({\n nodeType: \"code.mermaid.xychart\",\n from: c,\n to: t.text,\n reason: \"Category label truncated to 20 chars\",\n path: ctx.path,\n });\n }\n return t.text;\n });\n\n if (categories.length > CHART_POINTS_MAX) {\n ctx.degradations.add({\n nodeType: \"code.mermaid.xychart\",\n from: \"data_visualization\",\n to: \"fallback\",\n reason: `xychart has ${String(categories.length)} points (max ${String(CHART_POINTS_MAX)})`,\n path: ctx.path,\n });\n return undefined;\n }\n\n let chartType: \"bar\" | \"line\" = \"bar\";\n let seriesValues = ast.bars;\n if (ast.bars.length > 0 && ast.lines.length > 0) {\n ctx.degradations.add({\n nodeType: \"code.mermaid.xychart\",\n from: \"mixed bar+line\",\n to: \"bar\",\n reason: \"Slack charts are single-type; preferring bar\",\n path: ctx.path,\n });\n } else if (ast.bars.length === 0) {\n chartType = \"line\";\n seriesValues = ast.lines;\n }\n\n if (seriesValues.length === 0 || seriesValues.length > CHART_SERIES_MAX) {\n ctx.degradations.add({\n nodeType: \"code.mermaid.xychart\",\n from: \"data_visualization\",\n to: \"fallback\",\n reason: `Invalid series count (${String(seriesValues.length)})`,\n path: ctx.path,\n });\n return undefined;\n }\n\n for (const [i, values] of seriesValues.entries()) {\n if (values.length !== categories.length) {\n ctx.degradations.add({\n nodeType: \"code.mermaid.xychart\",\n from: `series[${String(i)}].length=${String(values.length)}`,\n to: `categories.length=${String(categories.length)}`,\n reason: \"xychart series length mismatched categories; padded/truncated by index\",\n path: ctx.path,\n });\n }\n }\n const series = seriesValues.map((values, i) => ({\n name: truncateLabel(`Series ${String(i + 1)}`, CHART_LABEL_MAX_CHARS).text,\n data: categories.map((label, idx) => ({\n label,\n value: values[idx] ?? 0,\n })),\n }));\n\n const titleRaw =\n ast.title ??\n (ctx.precedingHeading !== undefined && ctx.precedingHeading.length > 0\n ? ctx.precedingHeading\n : \"Chart\");\n\n return {\n type: \"data_visualization\",\n title: truncateChartTitle(titleRaw, ctx, \"code.mermaid.xychart\"),\n chart: {\n type: chartType,\n series,\n axis_config: {\n categories,\n x_label:\n ast.xLabel !== undefined\n ? truncateChartTitle(ast.xLabel, ctx, \"code.mermaid.xychart\")\n : undefined,\n y_label:\n ast.yLabel !== undefined\n ? truncateChartTitle(ast.yLabel, ctx, \"code.mermaid.xychart\")\n : undefined,\n },\n },\n };\n}\n\nfunction truncateChartTitle(raw: string, ctx: ConversionContext, nodeType: string): string {\n const t = truncateLabel(raw, CHART_TITLE_MAX_CHARS);\n if (t.truncated) {\n ctx.degradations.add({\n nodeType,\n from: raw,\n to: t.text,\n reason: `Chart title truncated to ${String(CHART_TITLE_MAX_CHARS)} chars`,\n path: ctx.path,\n });\n }\n return t.text;\n}\n\nasync function tryRenderers(\n source: string,\n ctx: ConversionContext,\n): Promise<ImageBlock | undefined> {\n const req: RenderRequest = {\n lang: \"mermaid\",\n source,\n altText: \"mermaid diagram\",\n };\n for (const renderer of ctx.config.renderers) {\n if (!renderer.canRender(req)) {\n continue;\n }\n // Renderer/uploader failures must stay scoped to this node: without the\n // catch they propagate to the converter's top-level guard, which degrades\n // the ENTIRE document to a plain-text section.\n let result: Awaited<ReturnType<ImageRenderer[\"render\"]>>;\n try {\n result = await renderer.render(req);\n } catch (err) {\n ctx.degradations.add({\n nodeType: \"code.mermaid\",\n from: \"image.render\",\n to: \"skip\",\n reason: `Renderer failed: ${err instanceof Error ? err.message : String(err)}`,\n path: ctx.path,\n });\n continue;\n }\n if (result === null) {\n continue;\n }\n if (result.kind === \"url\") {\n if (result.imageUrl.length > IMAGE_URL_MAX_CHARS) {\n ctx.degradations.add({\n nodeType: \"code.mermaid\",\n from: \"image.url\",\n to: \"skip\",\n reason: \"Renderer URL exceeds 3000 chars\",\n path: ctx.path,\n });\n continue;\n }\n return {\n type: \"image\",\n image_url: result.imageUrl,\n alt_text: clampImageText(result.altText, ctx, \"alt_text\"),\n };\n }\n const uploader: SlackUploader | undefined = ctx.config.uploader;\n if (uploader === undefined) {\n ctx.degradations.add({\n nodeType: \"code.mermaid\",\n from: \"image.bytes\",\n to: \"skip\",\n reason: \"Bytes renderer requires options.uploader\",\n path: ctx.path,\n });\n continue;\n }\n let uploaded: { readonly fileId: string };\n try {\n uploaded = await uploader.upload(result);\n } catch (err) {\n ctx.degradations.add({\n nodeType: \"code.mermaid\",\n from: \"image.bytes\",\n to: \"skip\",\n reason: `Slack upload failed: ${err instanceof Error ? err.message : String(err)}`,\n path: ctx.path,\n });\n continue;\n }\n return {\n type: \"image\",\n alt_text: clampImageText(result.altText, ctx, \"alt_text\"),\n slack_file: { id: uploaded.fileId },\n };\n }\n return undefined;\n}\n\nfunction preformattedMermaid(source: string, ctx: ConversionContext): RichTextBlock {\n const withLang = ctx.config.capabilities.preformattedLanguage;\n if (!withLang) {\n ctx.degradations.add({\n nodeType: \"code.mermaid\",\n from: \"preformatted.language\",\n to: \"preformatted\",\n reason: \"preformattedLanguage capability unavailable; omitting language\",\n path: ctx.path,\n });\n }\n return preformattedRichText(source, withLang ? \"mermaid\" : undefined);\n}\n","import type { Paragraph, RootContent } from \"mdast\";\n\nimport type { Block, ImageBlock, RichTextBlock } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\n\nimport {\n clampImageText,\n clampSectionText,\n countHoistableImages,\n emitPhrasing,\n hoistedImageBlock,\n isPublicImageUrl,\n isValidLinkUrl,\n} from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * Paragraph → rich_text_section (coalesced later by assembler).\n */\nexport class ParagraphAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"paragraph\";\n }\n\n plan(node: RootContent, ctx: ConversionContext): ReadonlyArray<Candidate> {\n const paragraph = node as Paragraph;\n const loneImage =\n paragraph.children.length === 1 && paragraph.children[0]?.type === \"image\"\n ? paragraph.children[0]\n : undefined;\n const hoistCount = loneImage !== undefined ? 0 : countHoistableImages(paragraph.children, ctx);\n\n const candidates: Candidate[] = [\n {\n budget: { blocks: 1 + hoistCount },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n return emitParagraph(paragraph, emitCtx, loneImage, true);\n },\n },\n ];\n if (hoistCount > 0) {\n candidates.push({\n budget: { blocks: 1 },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n emitCtx.degradations.add({\n nodeType: \"paragraph\",\n from: \"rich_text+images\",\n to: \"rich_text\",\n reason: \"Budget exhausted for hoisted paragraph images; emitting text only\",\n path: emitCtx.path,\n });\n return emitParagraph(paragraph, emitCtx, loneImage, false);\n },\n });\n }\n return candidates;\n }\n}\n\nfunction emitParagraph(\n paragraph: Paragraph,\n emitCtx: ConversionContext,\n loneImage: Paragraph[\"children\"][number] | undefined,\n hoistImages: boolean,\n): ReadonlyArray<Block> {\n // Lone image paragraph → image block\n if (loneImage !== undefined && loneImage.type === \"image\") {\n const img = loneImage;\n if (isPublicImageUrl(img.url)) {\n const altRaw = img.alt ?? \"image\";\n const alt = clampImageText(altRaw.length > 0 ? altRaw : \"image\", emitCtx, \"alt_text\");\n const block: ImageBlock = {\n type: \"image\",\n image_url: img.url,\n alt_text: alt,\n title:\n img.title !== null && img.title !== undefined && img.title.length > 0\n ? {\n type: \"plain_text\",\n text: clampImageText(img.title, emitCtx, \"title\"),\n }\n : undefined,\n };\n return [block];\n }\n // mrkdwn <url|label> links share the rich text link URL rules; a relative\n // or non-http(s) URL renders as literal \"<…|…>\" garbage, so degrade those\n // to plain text with the URL preserved as a suffix.\n const linkable = isValidLinkUrl(img.url);\n emitCtx.degradations.add({\n nodeType: \"image\",\n from: \"image\",\n to: linkable ? \"section.link\" : \"section.text\",\n reason: \"Non-public or invalid image URL\",\n path: emitCtx.path,\n });\n const alt = img.alt ?? \"\";\n const label = alt.length > 0 ? alt : img.url.length > 0 ? img.url : \"image\";\n const fallbackText = linkable\n ? `<${img.url}|${label}>`\n : img.url.length > 0 && img.url !== label\n ? `${label} (${img.url})`\n : label;\n return [\n {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: clampSectionText(fallbackText, emitCtx, \"section\"),\n },\n },\n ];\n }\n\n const inline = emitPhrasing(paragraph.children, emitCtx);\n const blocks: Block[] = [];\n const rich: RichTextBlock = {\n type: \"rich_text\",\n elements: [\n {\n type: \"rich_text_section\",\n elements: inline.elements.length > 0 ? inline.elements : [{ type: \"text\", text: \" \" }],\n },\n ],\n };\n blocks.push(rich);\n if (!hoistImages) {\n return blocks;\n }\n for (const h of inline.hoistedImages) {\n blocks.push(hoistedImageBlock(h, emitCtx));\n }\n return blocks;\n}\n","import type { RootContent } from \"mdast\";\n\nimport type { Block } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\n\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * Consumes definition / yaml / toml nodes without emitting blocks.\n */\nexport class SkipAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n const t = node.type as string;\n return t === \"definition\" || t === \"yaml\" || t === \"toml\" || t === \"footnoteDefinition\";\n }\n\n plan(node: RootContent, _ctx: ConversionContext): ReadonlyArray<Candidate> {\n return [\n {\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n const t = node.type as string;\n if (t === \"yaml\" || t === \"toml\") {\n ctx.degradations.add({\n nodeType: t,\n from: \"frontmatter\",\n to: \"skip\",\n reason: \"Frontmatter skipped by default\",\n path: ctx.path,\n });\n }\n return [];\n },\n },\n ];\n }\n}\n","import type { AlignType, RootContent, Table, TableCell as MdastTableCell } from \"mdast\";\nimport { toString } from \"mdast-util-to-string\";\n\nimport type {\n Block,\n DataTableBlock,\n MarkdownBlock,\n RichTextBlock,\n TableBlock,\n TableCell,\n TableColumnSetting,\n} from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport { RecordingDegradationCollector } from \"../budget/recording-degradation-collector.js\";\nimport {\n DATA_TABLE_MAX_DATA_ROWS,\n TABLE_CELL_WRAP_THRESHOLD,\n TABLE_MAX_COLS,\n TABLE_PREFERRED_MAX_ROWS,\n} from \"../constants.js\";\nimport { sliceSurrogateSafe } from \"../utf16.js\";\n\nimport { emitPhrasing, preformattedRichText } from \"./inline.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * GFM tables → table / data_table / markdown / ASCII fallbacks.\n */\nexport class TableAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"table\";\n }\n\n plan(node: RootContent, ctx: ConversionContext): ReadonlyArray<Candidate> {\n const table = normalizeTableRows(node as Table, ctx);\n const rowCount = table.children.length;\n const colCount = table.children[0]?.children.length ?? 0;\n\n if (colCount > TABLE_MAX_COLS) {\n const cellChars = countEmittedCellChars(table, ctx, \"table\");\n return markdownThenAscii(table, cellChars, \"Table exceeds 20 columns\");\n }\n\n if (rowCount <= TABLE_PREFERRED_MAX_ROWS) {\n // Match validateBlocks measurement (JSON size for rich_text cells).\n const cellChars = countEmittedCellChars(table, ctx, \"table\");\n return [\n {\n requires: [\"tableBlock\"],\n budget: { blocks: 1, tableChars: cellChars },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n return [buildTableBlock(table, ctx)];\n },\n },\n ...markdownThenAscii(table, cellChars, \"tableBlock unavailable or char budget\"),\n ];\n }\n\n // >50 rows → data_table (≤200 data rows)\n const dataRows = Math.max(0, rowCount - 1);\n if (dataRows <= DATA_TABLE_MAX_DATA_ROWS) {\n const preferredTable = truncateRows(table, TABLE_PREFERRED_MAX_ROWS);\n const preferredChars = countEmittedCellChars(preferredTable, ctx, \"table\");\n // data_table headers stay raw_text — count with that mode so budget matches emit.\n const dataTableChars = countEmittedCellChars(table, ctx, \"data_table\");\n return [\n {\n requires: [\"dataTable\"],\n budget: { blocks: 1, dataTableChars },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n emitCtx.degradations.add({\n nodeType: \"table\",\n from: \"table\",\n to: \"data_table\",\n reason: `Table has ${String(rowCount)} rows (>${String(TABLE_PREFERRED_MAX_ROWS)}); using data_table`,\n path: emitCtx.path,\n });\n return [buildDataTable(table, emitCtx)];\n },\n },\n {\n requires: [\"tableBlock\"],\n budget: { blocks: 1, tableChars: preferredChars },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n emitCtx.degradations.add({\n nodeType: \"table\",\n from: \"data_table\",\n to: \"table\",\n reason: \"dataTable unavailable; truncating to table block capacity\",\n path: emitCtx.path,\n });\n return [buildTableBlock(preferredTable, emitCtx)];\n },\n },\n ...markdownThenAscii(table, dataTableChars, \"native table unavailable\"),\n ];\n }\n\n // >200 data rows → split warning + first chunk as data_table / table\n const dataChunk = truncateRows(table, DATA_TABLE_MAX_DATA_ROWS + 1);\n const dataChunkChars = countEmittedCellChars(dataChunk, ctx, \"data_table\");\n return [\n {\n requires: [\"dataTable\"],\n budget: { blocks: 1, dataTableChars: dataChunkChars },\n emit: (emitCtx: ConversionContext): ReadonlyArray<Block> => {\n emitCtx.degradations.add({\n nodeType: \"table\",\n from: \"table\",\n to: \"data_table.split\",\n reason: `Table has ${String(dataRows)} data rows; emitting first ${String(DATA_TABLE_MAX_DATA_ROWS)}`,\n path: emitCtx.path,\n });\n return [buildDataTable(dataChunk, emitCtx)];\n },\n },\n ...markdownThenAscii(table, dataChunkChars, \"oversized table\"),\n ];\n }\n}\n\n/**\n * GFM tables key column count off the header row: shorter rows get empty\n * cells inserted and excess cells are ignored\n * (https://github.github.com/gfm/#tables-extension-). remark preserves rows\n * as authored, so without this step ragged rows reach the Slack table block\n * misaligned against `column_settings`.\n */\nfunction normalizeTableRows(table: Table, ctx: ConversionContext): Table {\n const colCount = table.children[0]?.children.length ?? 0;\n if (colCount === 0 || table.children.every((row) => row.children.length === colCount)) {\n return table;\n }\n const children = table.children.map((row, rowIndex) => {\n if (row.children.length === colCount) {\n return row;\n }\n if (row.children.length > colCount) {\n ctx.degradations.add({\n nodeType: \"table\",\n from: `row[${String(rowIndex)}]: ${String(row.children.length)} cells`,\n to: `${String(colCount)} cells`,\n reason: \"Cells beyond the header column count dropped (GFM ignores the excess)\",\n path: ctx.path,\n });\n return { ...row, children: row.children.slice(0, colCount) };\n }\n const padding = Array.from(\n { length: colCount - row.children.length },\n (): MdastTableCell => ({ type: \"tableCell\", children: [] }),\n );\n return { ...row, children: [...row.children, ...padding] };\n });\n return { ...table, children };\n}\n\nfunction markdownThenAscii(table: Table, cellChars: number, reason: string): Candidate[] {\n const md = toPipeMarkdown(table);\n return [\n {\n requires: [\"markdownBlock\"],\n budget: { blocks: 1, markdownChars: md.length },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n ctx.degradations.add({\n nodeType: \"table\",\n from: \"native_table\",\n to: \"markdown\",\n reason,\n path: ctx.path,\n });\n const block: MarkdownBlock = { type: \"markdown\", text: md };\n return [block];\n },\n },\n {\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n ctx.degradations.add({\n nodeType: \"table\",\n from: \"markdown\",\n to: \"ascii_preformatted\",\n reason: `${reason}; markdown unavailable (chars≈${String(cellChars)})`,\n path: ctx.path,\n });\n return [asciiTableBlock(table)];\n },\n },\n ];\n}\n\nfunction buildTableBlock(table: Table, ctx: ConversionContext): TableBlock {\n const rows = table.children.map((row, rowIndex) =>\n row.children.map((cell) => cellToSlack(cell, ctx, rowIndex === 0)),\n );\n return {\n type: \"table\",\n rows,\n column_settings: columnSettings(table),\n };\n}\n\nfunction buildDataTable(table: Table, ctx: ConversionContext): DataTableBlock {\n const captionRaw =\n ctx.precedingHeading !== undefined && ctx.precedingHeading.length > 0\n ? ctx.precedingHeading\n : \"Table\";\n const caption = sliceSurrogateSafe(captionRaw, 150);\n if (captionRaw.length > 150) {\n ctx.degradations.add({\n nodeType: \"table\",\n from: \"data_table.caption\",\n to: \"truncated\",\n reason: \"data_table caption truncated to 150 chars\",\n path: ctx.path,\n });\n }\n const rows = table.children.map((row, rowIndex) =>\n row.children.map((cell) => cellForDataTable(cell, ctx, rowIndex)),\n );\n return {\n type: \"data_table\",\n caption,\n rows,\n page_size: 5,\n row_header_column_index: 0,\n };\n}\n\n/** Slack forbids rich_text in data_table headers; keep emission and budget counting aligned. */\nfunction cellForDataTable(\n cell: MdastTableCell,\n ctx: ConversionContext,\n rowIndex: number,\n): TableCell {\n if (rowIndex === 0) {\n return { type: \"raw_text\", text: toString(cell) };\n }\n return cellToSlack(cell, ctx, false);\n}\n\nfunction cellToSlack(cell: MdastTableCell, ctx: ConversionContext, header: boolean): TableCell {\n // Emit the cell through the shared inline pipeline so Slack entity tokens\n // (<@U…>, <!here>), emoji shortcodes, mention resolvers, and labeled links\n // are converted instead of landing in raw_text as literal source text. A\n // cell that reduces to one unstyled text element stays raw_text/raw_number.\n const inline = emitPhrasing(cell.children, ctx);\n const single = inline.elements.length === 1 ? inline.elements[0] : undefined;\n const isEmpty = inline.elements.length === 0;\n const isSingleUnstyledText = single?.type === \"text\" && single.style === undefined;\n const plainText = isEmpty ? toString(cell) : isSingleUnstyledText ? single.text : undefined;\n if (plainText !== undefined) {\n // Header row titles must stay text — numeric-looking labels like \"2024\" are not values.\n const trimmed = plainText.trim();\n if (!header && /^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n return { type: \"raw_number\", value: Number(trimmed), text: trimmed };\n }\n return { type: \"raw_text\", text: plainText };\n }\n const rich: RichTextBlock = {\n type: \"rich_text\",\n elements: [\n {\n type: \"rich_text_section\",\n elements: inline.elements,\n },\n ],\n };\n return rich;\n}\n\nfunction columnSettings(table: Table): ReadonlyArray<TableColumnSetting | null> {\n const align = table.align ?? [];\n const colCount = table.children[0]?.children.length ?? 0;\n const settings: Array<TableColumnSetting | null> = [];\n for (let i = 0; i < colCount; i += 1) {\n const a = align[i] as AlignType | null | undefined;\n const long = table.children.some(\n (row) =>\n toString(row.children[i] ?? { type: \"text\", value: \"\" }).length > TABLE_CELL_WRAP_THRESHOLD,\n );\n const alignVal = a === \"left\" || a === \"center\" || a === \"right\" ? a : undefined;\n if (alignVal === undefined && !long) {\n settings.push(null);\n } else {\n settings.push({\n align: alignVal,\n is_wrapped: long ? true : undefined,\n });\n }\n }\n return settings;\n}\n\nfunction countEmittedCellChars(\n table: Table,\n ctx: ConversionContext,\n mode: \"table\" | \"data_table\",\n): number {\n const probe = ctx.withDegradations(new RecordingDegradationCollector());\n let n = 0;\n for (const [rowIndex, row] of table.children.entries()) {\n for (const cell of row.children) {\n const emitted =\n mode === \"data_table\"\n ? cellForDataTable(cell, probe, rowIndex)\n : cellToSlack(cell, probe, rowIndex === 0);\n n += slackCellCharCount(emitted);\n }\n }\n return n;\n}\n\nfunction slackCellCharCount(cell: TableCell): number {\n if (cell.type === \"raw_text\" || cell.type === \"raw_number\") {\n return cell.text.length;\n }\n return JSON.stringify(cell).length;\n}\n\nfunction truncateRows(table: Table, maxRows: number): Table {\n return {\n ...table,\n children: table.children.slice(0, maxRows),\n };\n}\n\nfunction toPipeMarkdown(table: Table): string {\n const rows = table.children.map((row) =>\n row.children.map((c) => toString(c).replace(/\\|/g, \"\\\\|\")),\n );\n if (rows.length === 0) {\n return \"\";\n }\n const header = rows[0] ?? [];\n const align = table.align ?? [];\n const sep = header.map((_, i) => {\n const a = align[i];\n if (a === \"center\") return \":---:\";\n if (a === \"right\") return \"---:\";\n if (a === \"left\") return \":---\";\n return \"---\";\n });\n const lines = [\n `| ${header.join(\" | \")} |`,\n `| ${sep.join(\" | \")} |`,\n ...rows.slice(1).map((r) => `| ${r.join(\" | \")} |`),\n ];\n return lines.join(\"\\n\");\n}\n\nfunction asciiTableBlock(table: Table): RichTextBlock {\n return preformattedRichText(toPipeMarkdown(table), undefined);\n}\n","import type { List, ListItem, RootContent } from \"mdast\";\nimport { toString } from \"mdast-util-to-string\";\n\nimport type {\n Block,\n MarkdownBlock,\n RichTextBlock,\n RichTextList,\n RichTextSection,\n} from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\nimport { RICH_TEXT_LIST_INDENT_MAX } from \"../constants.js\";\n\nimport { isTaskList } from \"./list-adapter.js\";\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * Task lists → markdown block (checkboxes); fallback unicode in rich_text_list.\n */\nexport class TaskListAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"list\" && isTaskList(node);\n }\n\n plan(node: RootContent, _ctx: ConversionContext): ReadonlyArray<Candidate> {\n const list = node as List;\n const md = serializeTaskList(list);\n return [\n {\n requires: [\"markdownBlock\"],\n budget: { blocks: 1, markdownChars: md.length },\n emit: (): ReadonlyArray<Block> => {\n const block: MarkdownBlock = { type: \"markdown\", text: md };\n return [block];\n },\n },\n {\n budget: { blocks: 1 },\n emit: (ctx: ConversionContext): ReadonlyArray<Block> => {\n ctx.degradations.add({\n nodeType: \"list\",\n from: \"markdown.task_list\",\n to: \"rich_text_list.unicode_checkbox\",\n reason: \"markdownBlock unavailable or budget exhausted\",\n path: ctx.path,\n });\n return [unicodeTaskList(list, ctx)];\n },\n },\n ];\n }\n}\n\nfunction serializeTaskList(list: List, indent = 0): string {\n const pad = \" \".repeat(indent);\n const lines: string[] = [];\n for (const item of list.children) {\n const checked = item.checked === true;\n const box = checked ? \"[x]\" : \"[ ]\";\n const text = itemText(item);\n lines.push(`${pad}- ${box} ${text}`);\n for (const child of item.children) {\n if (child.type === \"list\") {\n lines.push(serializeTaskList(child, indent + 1));\n }\n }\n }\n return lines.join(\"\\n\");\n}\n\nfunction itemText(item: ListItem): string {\n const parts: string[] = [];\n for (const child of item.children) {\n if (child.type === \"paragraph\") {\n parts.push(toString(child));\n } else if (child.type !== \"list\") {\n parts.push(toString(child));\n }\n }\n return parts.join(\" \").trim();\n}\n\nfunction unicodeTaskList(list: List, ctx: ConversionContext): RichTextBlock {\n return {\n type: \"rich_text\",\n elements: emitUnicodeTaskTree(list, 0, ctx),\n };\n}\n\nfunction emitUnicodeTaskTree(\n list: List,\n indent: number,\n ctx: ConversionContext,\n): Array<RichTextList> {\n let effectiveIndent = indent;\n if (effectiveIndent > RICH_TEXT_LIST_INDENT_MAX) {\n ctx.degradations.add({\n nodeType: \"list\",\n from: `indent:${String(effectiveIndent)}`,\n to: `indent:${String(RICH_TEXT_LIST_INDENT_MAX)}`,\n reason: \"Task list indent clamped at 6\",\n path: ctx.path,\n });\n effectiveIndent = RICH_TEXT_LIST_INDENT_MAX;\n }\n\n // Same interleaving as the list adapter: nest under the last item of each\n // same-indent chunk (Slack's flat indent model).\n const out: RichTextList[] = [];\n let pendingSections: RichTextSection[] = [];\n\n const flush = (): void => {\n if (pendingSections.length === 0) {\n return;\n }\n out.push({\n type: \"rich_text_list\",\n style: \"bullet\",\n elements: pendingSections,\n indent: effectiveIndent,\n });\n pendingSections = [];\n };\n\n for (const item of list.children) {\n const prefix = item.checked === true ? \"☑ \" : item.checked === false ? \"☐ \" : \"\";\n pendingSections.push({\n type: \"rich_text_section\",\n elements: [{ type: \"text\", text: `${prefix}${itemText(item)}` }],\n });\n const childLists: List[] = [];\n for (const child of item.children) {\n if (child.type === \"list\") {\n childLists.push(child);\n }\n }\n if (childLists.length === 0) {\n continue;\n }\n flush();\n for (const child of childLists) {\n out.push(...emitUnicodeTaskTree(child, effectiveIndent + 1, ctx));\n }\n }\n flush();\n\n if (out.length === 0) {\n out.push({\n type: \"rich_text_list\",\n style: \"bullet\",\n elements: [{ type: \"rich_text_section\", elements: [{ type: \"text\", text: \" \" }] }],\n indent: effectiveIndent,\n });\n }\n\n return out;\n}\n","import type { RootContent } from \"mdast\";\n\nimport type { Block } from \"../blocks/types.js\";\nimport type { ConversionContext } from \"../budget/conversion-context.js\";\n\nimport type { Candidate, NodeAdapter } from \"./node-adapter.js\";\n\n/**\n * thematicBreak → divider.\n */\nexport class ThematicBreakAdapter implements NodeAdapter {\n match(node: RootContent, _ctx: ConversionContext): boolean {\n return node.type === \"thematicBreak\";\n }\n\n plan(_node: RootContent, _ctx: ConversionContext): ReadonlyArray<Candidate> {\n return [\n {\n budget: { blocks: 1 },\n emit: (_ctx: ConversionContext): ReadonlyArray<Block> => [{ type: \"divider\" }],\n },\n ];\n }\n}\n","import { BlockquoteAdapter } from \"../adapters/blockquote-adapter.js\";\nimport { CodeFenceAdapter } from \"../adapters/code-fence-adapter.js\";\nimport { HeadingAdapter } from \"../adapters/heading-adapter.js\";\nimport { HtmlBlockAdapter } from \"../adapters/html-block-adapter.js\";\nimport { ListAdapter } from \"../adapters/list-adapter.js\";\nimport { MathBlockAdapter } from \"../adapters/math-block-adapter.js\";\nimport { MermaidFenceAdapter } from \"../adapters/mermaid-fence-adapter.js\";\nimport type { NodeAdapter } from \"../adapters/node-adapter.js\";\nimport { ParagraphAdapter } from \"../adapters/paragraph-adapter.js\";\nimport { SkipAdapter } from \"../adapters/skip-adapter.js\";\nimport { TableAdapter } from \"../adapters/table-adapter.js\";\nimport { TaskListAdapter } from \"../adapters/task-list-adapter.js\";\nimport { ThematicBreakAdapter } from \"../adapters/thematic-break-adapter.js\";\nimport { MessageAssembler } from \"../assemble/message-assembler.js\";\nimport { DeterministicPlainTextRenderer } from \"../assemble/text-fallback.js\";\nimport { MermaidPieParser } from \"../mermaid/mermaid-pie-parser.js\";\nimport { MermaidXyChartParser } from \"../mermaid/mermaid-xychart-parser.js\";\nimport { RemarkMarkdownParser } from \"../parsers/remark-markdown-parser.js\";\nimport { AdapterRegistry } from \"../registry/adapter-registry.js\";\nimport type {\n ConversionMessagesResult,\n ConversionResult,\n ConvertOptions,\n MarkdownParser,\n PlainTextRenderer,\n} from \"../types.js\";\nimport { OverflowMode } from \"../types.js\";\n\nimport { SlackMarkConverter } from \"./slackmark-converter.js\";\n\n/**\n * Options for the composition root. Extends per-call {@link ConvertOptions}\n * with injectable collaborators and user adapters (prepended).\n */\nexport interface CreateConverterOptions extends ConvertOptions {\n readonly adapters?: ReadonlyArray<NodeAdapter>;\n readonly parser?: MarkdownParser;\n readonly plainText?: PlainTextRenderer;\n}\n\n/**\n * Single composition root — wires default implementations.\n */\nexport function createConverter(options: CreateConverterOptions = {}): SlackMarkConverter {\n const parser = options.parser ?? new RemarkMarkdownParser();\n const plainText = options.plainText ?? new DeterministicPlainTextRenderer();\n const pieParser = new MermaidPieParser();\n const xyParser = new MermaidXyChartParser();\n\n const builtIns: NodeAdapter[] = [\n new MermaidFenceAdapter({ pieParser, xyParser }),\n new MathBlockAdapter(),\n new TaskListAdapter(),\n new ListAdapter(),\n new TableAdapter(),\n new HeadingAdapter(),\n new ParagraphAdapter(),\n new BlockquoteAdapter(),\n new CodeFenceAdapter(),\n new ThematicBreakAdapter(),\n new HtmlBlockAdapter(),\n new SkipAdapter(),\n ];\n\n const registry = new AdapterRegistry([...(options.adapters ?? []), ...builtIns]);\n const assembler = new MessageAssembler({ plainText });\n\n const defaultOptions: ConvertOptions = {\n capabilities: options.capabilities,\n capabilityOverrides: options.capabilityOverrides,\n overflow: options.overflow ?? OverflowMode.Degrade,\n strategy: options.strategy,\n renderers: options.renderers ?? [],\n uploader: options.uploader,\n enableMath: options.enableMath,\n enableFrontmatter: options.enableFrontmatter,\n mentionResolvers: options.mentionResolvers,\n };\n\n return new SlackMarkConverter({\n parser,\n registry,\n assembler,\n plainText,\n defaultOptions,\n });\n}\n\n/**\n * Convenience API — creates a default converter per call.\n */\nexport function convert(markdown: string, options?: ConvertOptions): Promise<ConversionResult> {\n return createConverter(options).convert(markdown, options);\n}\n\n/**\n * Convenience multi-message API.\n */\nexport function convertToMessages(\n markdown: string,\n options?: ConvertOptions,\n): Promise<ConversionMessagesResult> {\n return createConverter(options).convertToMessages(markdown, options);\n}\n","import type { Block, TableCell } from \"../blocks/types.js\";\nimport {\n CHART_LABEL_MAX_CHARS,\n CHART_POINTS_MAX,\n CHART_SEGMENTS_MAX,\n CHART_SERIES_MAX,\n CHART_TITLE_MAX_CHARS,\n CONTAINER_CHILDREN_MAX,\n CONTAINER_TITLE_MAX_CHARS,\n CONTEXT_ELEMENTS_MAX,\n DATA_TABLE_CELL_CHARS_MAX,\n DATA_TABLE_MAX_DATA_ROWS,\n DATA_VISUALIZATION_MAX_PER_MESSAGE,\n HEADER_TEXT_MAX_CHARS,\n IMAGE_ALT_MAX_CHARS,\n IMAGE_URL_MAX_CHARS,\n MARKDOWN_CUMULATIVE_MAX_CHARS,\n MAX_BLOCKS_PER_MESSAGE,\n SECTION_TEXT_MAX_CHARS,\n TABLE_CELL_CHARS_MAX,\n TABLE_MAX_COLS,\n TABLE_MAX_ROWS,\n} from \"../constants.js\";\n\nexport interface ValidationIssue {\n readonly path: string;\n readonly message: string;\n}\n\ndeclare const validatedBlocksBrand: unique symbol;\n\n/**\n * Blocks that have passed {@link validateBlocks}.\n */\nexport type ValidatedBlocks = ReadonlyArray<Block> & {\n readonly [validatedBlocksBrand]: true;\n};\n\n/**\n * Assert every documented Block Kit limit from the research doc.\n */\nexport function validateBlocks(blocks: ReadonlyArray<Block>): ValidatedBlocks {\n const issues: ValidationIssue[] = [];\n if (blocks.length > MAX_BLOCKS_PER_MESSAGE) {\n issues.push({\n path: \"$\",\n message: `Too many blocks: ${String(blocks.length)} > ${String(MAX_BLOCKS_PER_MESSAGE)}`,\n });\n }\n\n let markdownChars = 0;\n let tableChars = 0;\n let dataTableChars = 0;\n let charts = 0;\n\n blocks.forEach((block, i) => {\n const path = `blocks[${String(i)}]`;\n switch (block.type) {\n case \"header\":\n if (block.text.text.length > HEADER_TEXT_MAX_CHARS) {\n issues.push({ path, message: \"header text > 150\" });\n }\n if (block.level !== undefined && (block.level < 1 || block.level > 4)) {\n issues.push({ path, message: \"header level out of 1–4\" });\n }\n break;\n case \"section\":\n if (block.text !== undefined && block.text.text.length > SECTION_TEXT_MAX_CHARS) {\n issues.push({ path, message: \"section text > 3000\" });\n }\n break;\n case \"image\":\n if (block.alt_text.length > IMAGE_ALT_MAX_CHARS) {\n issues.push({ path, message: \"image alt > 2000\" });\n }\n if (block.image_url !== undefined && block.image_url.length > IMAGE_URL_MAX_CHARS) {\n issues.push({ path, message: \"image_url > 3000\" });\n }\n break;\n case \"context\":\n if (block.elements.length > CONTEXT_ELEMENTS_MAX) {\n issues.push({ path, message: \"context elements > 10\" });\n }\n break;\n case \"markdown\":\n markdownChars += block.text.length;\n break;\n case \"table\": {\n if (block.rows.length > TABLE_MAX_ROWS) {\n issues.push({ path, message: \"table rows > 100\" });\n }\n for (const row of block.rows) {\n if (row.length > TABLE_MAX_COLS) {\n issues.push({ path, message: \"table cols > 20\" });\n }\n for (const cell of row) {\n tableChars += cellCharCount(cell);\n }\n }\n break;\n }\n case \"data_table\": {\n if (block.rows.length > DATA_TABLE_MAX_DATA_ROWS + 1) {\n issues.push({ path, message: \"data_table rows > 201\" });\n }\n for (const row of block.rows) {\n if (row.length > TABLE_MAX_COLS) {\n issues.push({ path, message: \"data_table cols > 20\" });\n }\n for (const cell of row) {\n dataTableChars += cellCharCount(cell);\n }\n }\n break;\n }\n case \"data_visualization\":\n charts += 1;\n if (block.title.length > CHART_TITLE_MAX_CHARS) {\n issues.push({ path, message: \"chart title > 50\" });\n }\n validateChart(block, path, issues);\n break;\n case \"container\":\n if (block.child_blocks.length > CONTAINER_CHILDREN_MAX) {\n issues.push({ path, message: \"container children > 10\" });\n }\n if (block.title !== undefined && block.title.text.length > CONTAINER_TITLE_MAX_CHARS) {\n issues.push({ path, message: \"container title > 150\" });\n }\n break;\n case \"divider\":\n case \"rich_text\":\n break;\n default: {\n const exhaustive: never = block;\n void exhaustive;\n break;\n }\n }\n });\n\n if (markdownChars > MARKDOWN_CUMULATIVE_MAX_CHARS) {\n issues.push({\n path: \"$\",\n message: `markdown cumulative ${String(markdownChars)} > 12000`,\n });\n }\n if (tableChars > TABLE_CELL_CHARS_MAX) {\n issues.push({\n path: \"$\",\n message: `table chars ${String(tableChars)} > 10000`,\n });\n }\n if (dataTableChars > DATA_TABLE_CELL_CHARS_MAX) {\n issues.push({\n path: \"$\",\n message: `data_table chars ${String(dataTableChars)} > 20000`,\n });\n }\n if (charts > DATA_VISUALIZATION_MAX_PER_MESSAGE) {\n issues.push({\n path: \"$\",\n message: `charts ${String(charts)} > ${String(DATA_VISUALIZATION_MAX_PER_MESSAGE)}`,\n });\n }\n\n if (issues.length > 0) {\n const detail = issues.map((x) => `${x.path}: ${x.message}`).join(\"; \");\n throw new Error(`validateBlocks failed: ${detail}`);\n }\n\n return blocks as ValidatedBlocks;\n}\n\nfunction cellCharCount(cell: TableCell): number {\n if (cell.type === \"raw_text\") {\n return cell.text.length;\n }\n if (cell.type === \"raw_number\") {\n return cell.text.length;\n }\n return JSON.stringify(cell).length;\n}\n\nfunction validateChart(\n block: Extract<Block, { type: \"data_visualization\" }>,\n path: string,\n issues: ValidationIssue[],\n): void {\n const chart = block.chart;\n if (chart.type === \"pie\") {\n if (chart.segments.length < 1 || chart.segments.length > CHART_SEGMENTS_MAX) {\n issues.push({ path, message: \"pie segments out of 1–12\" });\n }\n for (const s of chart.segments) {\n if (s.label.length > CHART_LABEL_MAX_CHARS) {\n issues.push({ path, message: \"pie label > 20\" });\n }\n if (!(s.value > 0)) {\n issues.push({ path, message: \"pie value must be > 0\" });\n }\n }\n return;\n }\n if (chart.series.length < 1 || chart.series.length > CHART_SERIES_MAX) {\n issues.push({ path, message: \"series out of 1–12\" });\n }\n if (chart.axis_config.categories.length > CHART_POINTS_MAX) {\n issues.push({ path, message: \"categories > 20\" });\n }\n for (const s of chart.series) {\n if (s.name.length > CHART_LABEL_MAX_CHARS) {\n issues.push({ path, message: \"series name > 20\" });\n }\n if (s.data.length < 1 || s.data.length > CHART_POINTS_MAX) {\n issues.push({ path, message: \"points out of 1–20\" });\n }\n for (const p of s.data) {\n if (p.label.length > CHART_LABEL_MAX_CHARS) {\n issues.push({ path, message: \"point label > 20\" });\n }\n if (!chart.axis_config.categories.includes(p.label)) {\n issues.push({ path, message: `point label ${p.label} missing from categories` });\n }\n }\n }\n}\n"],"mappings":";AAGO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAC1B;AAAA,EAElB,YAAY,SAAiB,SAAwC;AACnE,UAAM,SAAS,SAAS,UAAU,SAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,MAAS;AAClF,SAAK,OAAO;AAAA,EACd;AACF;;;ACSO,IAAM,uBAAuB;AAAA,EAClC,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AACZ;AAIA,IAAM,UAA2B;AAAA,EAC/B,UAAU;AAAA,EACV,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,gBAAgB;AAClB;AAEA,IAAM,eAAgC;AAAA,EACpC,GAAG;AAAA,EACH,UAAU;AACZ;AAEA,IAAM,YAA6B;AAAA,EACjC,GAAG;AAAA,EACH,eAAe;AACjB;AAEA,IAAM,YAA6B;AAAA,EACjC,GAAG;AAAA,EACH,YAAY;AACd;AAEA,IAAM,YAA6B;AAAA,EACjC,GAAG;AAAA,EACH,sBAAsB;AAAA,EACtB,aAAa;AACf;AAEA,IAAM,YAA6B;AAAA,EACjC,GAAG;AAAA,EACH,WAAW;AACb;AAEA,IAAM,YAA6B;AAAA,EACjC,GAAG;AAAA,EACH,mBAAmB;AAAA,EACnB,gBAAgB;AAClB;AAEA,IAAM,SAA0B,EAAE,GAAG,UAAU;AAExC,IAAM,qBAQT;AAAA,EACF,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AACb;AAWO,SAAS,oBACd,OACA,WACiB;AACjB,MAAI;AACJ,MAAI,UAAU,QAAW;AACvB,WAAO,mBAAmB;AAAA,EAC5B,WAAW,OAAO,UAAU,UAAU;AACpC,UAAM,SAAS,aAAa,KAAK,IAAI,mBAAmB,KAAK,IAAI;AACjE,QAAI,WAAW,QAAW;AACxB,YAAM,IAAI;AAAA,QACR,6BAA6B,KAAK,UAAU,KAAK,CAAC,iBAAiB,OAAO,KAAK,kBAAkB,EAAE,KAAK,IAAI,CAAC;AAAA,MAC/G;AAAA,IACF;AACA,WAAO;AAAA,EACT,WAAW,YAAY,KAAK,GAAG;AAC7B,WAAO;AAAA,EACT,OAAO;AACL,WAAO,EAAE,GAAG,mBAAmB,QAAQ,GAAG,MAAM;AAAA,EAClD;AACA,MAAI,cAAc,QAAW;AAC3B,WAAO,OAAO,OAAO,EAAE,GAAG,KAAK,CAAC;AAAA,EAClC;AACA,SAAO,OAAO,OAAO,EAAE,GAAG,MAAM,GAAG,UAAU,CAAC;AAChD;AAIA,SAAS,aAAa,OAA8C;AAClE,SAAO,OAAO,OAAO,oBAAoB,KAAK;AAChD;AAEA,SAAS,YAAY,OAA2E;AAC9F,SACE,OAAO,MAAM,aAAa,aAC1B,OAAO,MAAM,kBAAkB,aAC/B,OAAO,MAAM,eAAe,aAC5B,OAAO,MAAM,yBAAyB,aACtC,OAAO,MAAM,gBAAgB,aAC7B,OAAO,MAAM,cAAc,aAC3B,OAAO,MAAM,sBAAsB,aACnC,OAAO,MAAM,mBAAmB;AAEpC;;;AC5IO,IAAM,yBAAyB;AAG/B,IAAM,yBAAyB;AAG/B,IAAM,wBAAwB;AAG9B,IAAM,mBAAmB;AAGzB,IAAM,sBAAsB;AAG5B,IAAM,sBAAsB;AAG5B,IAAM,uBAAuB;AAG7B,IAAM,gCAAgC;AAGtC,IAAM,iBAAiB;AAGvB,IAAM,iBAAiB;AAGvB,IAAM,uBAAuB;AAG7B,IAAM,2BAA2B;AAGjC,IAAM,2BAA2B;AAGjC,IAAM,4BAA4B;AAGlC,IAAM,wBAAwB;AAG9B,IAAM,wBAAwB;AAG9B,IAAM,qBAAqB;AAG3B,IAAM,mBAAmB;AAGzB,IAAM,mBAAmB;AAMzB,IAAM,qCAAqC;AAG3C,IAAM,gCAAgC;AAGtC,IAAM,4BAA4B;AAGlC,IAAM,yBAAyB;AAG/B,IAAM,4BAA4B;AAGlC,IAAM,4BAA4B;AAElC,IAAM,WAAW;;;AC7DjB,IAAM,uBAAN,MAAmD;AAAA,EAC/C;AAAA,EACQ;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,YAAoB,wBAAwB,SAAuC;AAC7F,SAAK,YAAY;AACjB,SAAK,kBAAkB,SAAS,mBAAmB;AACnD,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,iBAAiB;AACtB,SAAK,gBAAgB;AACrB,SAAK,SAAS;AACd,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,gBAAgB,OAAyC;AACvD,QAAI,UAAU,QAAW;AACvB,aAAO;AAAA,IACT;AACA,UAAM,aAAa,KAAK,UAAU,MAAM,UAAU;AAClD,UAAM,YAAY,KAAK,cAAc,MAAM,cAAc;AACzD,UAAM,WAAW,KAAK,kBAAkB,MAAM,kBAAkB;AAChE,UAAM,SAAS,KAAK,iBAAiB,MAAM,iBAAiB;AAC5D,UAAM,aAAa,KAAK,UAAU,MAAM,UAAU,OAAO,IAAI;AAC7D,UAAM,YAAY,KAAK,cAAc,MAAM,cAAc;AAEzD,QAAI,aAAa,KAAK,UAAW,QAAO;AACxC,QAAI,YAAY,qBAAsB,QAAO;AAC7C,QAAI,WAAW,0BAA2B,QAAO;AACjD,QAAI,SAAS,8BAA+B,QAAO;AACnD,QAAI,KAAK,mBAAmB,aAAa,mCAAoC,QAAO;AACpF,QAAI,YAAY,8BAA+B,QAAO;AAEtD,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,iBAAiB;AACtB,SAAK,gBAAgB;AACrB,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,WAAO;AAAA,EACT;AAAA,EAEA,WAA2B;AACzB,WAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,MACjB,gBAAgB,KAAK;AAAA,MACrB,eAAe,KAAK;AAAA,MACpB,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,QAAQ,UAAgC;AACtC,SAAK,SAAS,SAAS;AACvB,SAAK,aAAa,SAAS;AAC3B,SAAK,iBAAiB,SAAS;AAC/B,SAAK,gBAAgB,SAAS;AAC9B,SAAK,SAAS,SAAS;AACvB,SAAK,aAAa,SAAS;AAAA,EAC7B;AAAA,EAEA,qBAA2B;AACzB,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,iBAAiB;AACtB,SAAK,gBAAgB;AACrB,SAAK,SAAS;AACd,SAAK,aAAa;AAAA,EACpB;AACF;;;AC7FO,IAAM,gCAAN,MAAoE;AAAA,EACxD;AAAA,EAEjB,cAAc;AACZ,SAAK,QAAQ,CAAC;AAAA,EAChB;AAAA,EAEA,IAAI,GAAsB;AACxB,SAAK,MAAM,KAAK,CAAC;AAAA,EACnB;AAAA,EAEA,MAAkC;AAChC,WAAO,KAAK,MAAM,MAAM;AAAA,EAC1B;AACF;;;ACsBO,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,MAA6B;AACvC,SAAK,SAAS,KAAK;AACnB,SAAK,SAAS,KAAK;AACnB,SAAK,eAAe,KAAK;AACzB,SAAK,cAAc,KAAK;AACxB,SAAK,YAAY,KAAK;AACtB,SAAK,gBAAgB,KAAK;AAC1B,SAAK,mBAAmB,KAAK;AAC7B,SAAK,OAAO,KAAK;AAAA,EACnB;AAAA,EAEA,iBAAiB,cAAuD;AACtE,WAAO,IAAI,mBAAkB;AAAA,MAC3B,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB,eAAe,KAAK;AAAA,MACpB,kBAAkB,KAAK;AAAA,MACvB,MAAM,KAAK;AAAA,IACb,CAAC;AAAA,EACH;AACF;;;AChEO,IAAM,kBAAN,MAAsB;AAAA,EACV;AAAA,EAEjB,YAAY,UAAsC;AAChD,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,KAAK,MAAmB,KAAuD;AACnF,eAAW,WAAW,KAAK,UAAU;AACnC,UAAI,CAAC,QAAQ,MAAM,MAAM,GAAG,GAAG;AAC7B;AAAA,MACF;AACA,YAAM,aAAa,QAAQ,KAAK,MAAM,GAAG;AACzC,UAAI,gBAAgB;AACpB,UAAI,eAAe;AACnB,iBAAW,aAAa,YAAY;AAClC,YAAI,CAAC,kBAAkB,UAAU,UAAU,GAAG,GAAG;AAC/C;AAAA,QACF;AACA,cAAM,cAAc,IAAI,OAAO,SAAS;AACxC,YAAI,CAAC,IAAI,OAAO,gBAAgB,UAAU,MAAM,GAAG;AACjD,0BAAgB;AAChB;AAAA,QACF;AACA,cAAM,SAAS,MAAM,UAAU,KAAK,GAAG;AACvC,YAAI,OAAO,WAAW,GAAG;AAEvB,cAAI,OAAO,QAAQ,WAAW;AAC9B,yBAAe;AACf;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAGA,UAAI,gBAAgB,CAAC,eAAe;AAClC,eAAO,CAAC;AAAA,MACV;AACA,UAAI,aAAa,IAAI;AAAA,QACnB,UAAU,KAAK;AAAA,QACf,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,QAAQ,gBACJ,oEACA;AAAA,QACJ,MAAM,IAAI;AAAA,MACZ,CAAC;AACD,aAAO,CAAC;AAAA,IACV;AAEA,QAAI,aAAa,IAAI;AAAA,MACnB,UAAU,KAAK;AAAA,MACf,MAAM,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,MAAM,IAAI;AAAA,IACZ,CAAC;AACD,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,kBACP,UACA,KACS;AACT,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AACA,aAAW,QAAQ,UAAU;AAC3B,QAAI,CAAC,IAAI,OAAO,aAAa,IAAI,GAAG;AAClC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;;;ACjFO,SAAS,YAAY,OAAc,SAAyB;AACjE,QAAM,SAAS,WAAW;AAC1B,QAAM,IAAI,MAAM,GAAG,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE;AACvD;;;ACIA,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAC3B,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAMnB,SAAS,iBAAiB,MAAc,KAAqB;AAClE,MAAI,OAAO,GAAG;AACZ,WAAO;AAAA,EACT;AACA,MAAI,OAAO,KAAK,QAAQ;AACtB,WAAO,KAAK;AAAA,EACd;AACA,QAAM,SAAS,KAAK,WAAW,MAAM,CAAC;AACtC,QAAM,QAAQ,KAAK,WAAW,GAAG;AACjC,MACE,UAAU,sBACV,UAAU,sBACV,SAAS,qBACT,SAAS,mBACT;AACA,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AACT;AAMO,SAAS,mBAAmB,MAAc,KAAqB;AACpE,SAAO,KAAK,MAAM,GAAG,iBAAiB,MAAM,GAAG,CAAC;AAClD;;;ACAO,IAAM,eAAe;AAAA,EAC1B,SAAS;AAAA,EACT,OAAO;AACT;AAIO,IAAM,qBAAqB;AAAA,EAChC,eAAe;AAAA,EACf,eAAe;AACjB;;;ACtBO,IAAM,mBAAN,MAAuB;AAAA,EACX;AAAA,EAEjB,YAAY,MAA4B;AACtC,SAAK,YAAY,KAAK;AAAA,EACxB;AAAA,EAEA,SACE,QACA,KACA,gBACkC;AAClC,UAAM,YAAY,iBAAiB,MAAM;AAEzC,QAAI,IAAI,OAAO,aAAa,aAAS,OAAO;AAC1C,aAAO,KAAK,cAAc,CAAC,GAAG,WAAW,GAAG,cAAc,GAAG,GAAG;AAAA,IAClE;AAGA,UAAM,YAAY,eAAe;AACjC,UAAM,UAAU,KAAK,IAAI,GAAG,yBAAyB,SAAS;AAC9D,UAAM,cAAc,UAAU,MAAM,GAAG,OAAO;AAC9C,QAAI,UAAU,SAAS,SAAS;AAC9B,UAAI,aAAa,IAAI;AAAA,QACnB,UAAU;AAAA,QACV,MAAM,GAAG,OAAO,UAAU,MAAM,CAAC;AAAA,QACjC,IAAI,GAAG,OAAO,OAAO,CAAC;AAAA,QACtB,QACE,YAAY,IACR,8CAA8C,OAAO,SAAS,CAAC,qBAC/D;AAAA,QACN,MAAM,IAAI;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ;AACZ,QAAI,MAAM,SAAS,wBAAwB;AACzC,cAAQ,eAAe,MAAM,GAAG,sBAAsB;AACtD,UAAI,aAAa,IAAI;AAAA,QACnB,UAAU;AAAA,QACV,MAAM,GAAG,OAAO,eAAe,MAAM,CAAC;AAAA,QACtC,IAAI,GAAG,OAAO,sBAAsB,CAAC;AAAA,QACrC,QAAQ;AAAA,QACR,MAAM,IAAI;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,UAAM,cAAc,CAAC,GAAG,aAAa,GAAG,KAAK;AAC7C,WAAO,CAAC,KAAK,UAAU,aAAa,GAAG,CAAC;AAAA,EAC1C;AAAA,EAEQ,cACN,QACA,KACkC;AAClC,UAAM,WAAgC,CAAC;AACvC,QAAI,UAAmB,CAAC;AACxB,QAAI,SAAS,IAAI,qBAAqB,sBAAsB;AAE5D,UAAM,QAAQ,MAAY;AACxB,UAAI,QAAQ,WAAW,GAAG;AACxB;AAAA,MACF;AACA,eAAS,KAAK,KAAK,UAAU,SAAS,GAAG,CAAC;AAC1C,gBAAU,CAAC;AACX,eAAS,IAAI,qBAAqB,sBAAsB;AAAA,IAC1D;AAEA,eAAW,SAAS,QAAQ;AAC1B,YAAM,QAAQ,cAAc,KAAK;AACjC,UAAI,CAAC,OAAO,gBAAgB,KAAK,GAAG;AAClC,cAAM;AACN,YAAI,CAAC,OAAO,gBAAgB,KAAK,GAAG;AAElC,cAAI,aAAa,IAAI;AAAA,YACnB,UAAU;AAAA,YACV,MAAM,MAAM;AAAA,YACZ,IAAI;AAAA,YACJ,QAAQ;AAAA,YACR,MAAM,IAAI;AAAA,UACZ,CAAC;AACD;AAAA,QACF;AAAA,MACF;AACA,cAAQ,KAAK,KAAK;AAAA,IACpB;AACA,UAAM;AAEN,QAAI,SAAS,SAAS,GAAG;AACvB,UAAI,aAAa,IAAI;AAAA,QACnB,UAAU;AAAA,QACV,MAAM;AAAA,QACN,IAAI,GAAG,OAAO,SAAS,MAAM,CAAC;AAAA,QAC9B,QAAQ;AAAA,QACR,MAAM,IAAI;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,WAAO,SAAS,SAAS,IAAI,WAAW,CAAC,EAAE,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EACpE;AAAA,EAEQ,UAAU,QAA8B,KAA2C;AACzF,UAAM,MAAM,KAAK,UAAU,iBAAiB,MAAM;AAClD,QAAI,IAAI,UAAU,+BAA+B;AAC/C,aAAO,EAAE,QAAQ,MAAM,IAAI;AAAA,IAC7B;AACA,QAAI,aAAa,IAAI;AAAA,MACnB,UAAU;AAAA,MACV,MAAM,GAAG,OAAO,IAAI,MAAM,CAAC;AAAA,MAC3B,IAAI,GAAG,OAAO,6BAA6B,CAAC;AAAA,MAC5C,QAAQ;AAAA,MACR,MAAM,IAAI;AAAA,IACZ,CAAC;AACD,WAAO,EAAE,QAAQ,MAAM,mBAAmB,KAAK,6BAA6B,EAAE;AAAA,EAChF;AACF;AAKO,SAAS,oBACd,SACA,cACsB;AACtB,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,SAAkB,CAAC,EAAE,MAAM,UAAU,CAAC;AAC5C,QAAM,WAAiC,CAAC;AACxC,aAAW,KAAK,SAAS;AACvB,UAAM,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI;AACvC,QAAI,KAAK,SAAS,wBAAwB;AACxC,oBAAc,IAAI;AAAA,QAChB,UAAU;AAAA,QACV,MAAM,GAAG,OAAO,KAAK,MAAM,CAAC;AAAA,QAC5B,IAAI,GAAG,OAAO,sBAAsB,CAAC;AAAA,QACrC,QAAQ;AAAA,QACR,MAAM;AAAA,MACR,CAAC;AACD,eAAS,KAAK,EAAE,MAAM,UAAU,MAAM,mBAAmB,MAAM,sBAAsB,EAAE,CAAC;AAAA,IAC1F,OAAO;AACL,eAAS,KAAK,EAAE,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA,IAC9C;AAAA,EACF;AACA,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,sBAAsB;AAC9D,UAAM,QAAQ,SAAS,MAAM,GAAG,IAAI,oBAAoB;AACxD,WAAO,KAAK,EAAE,MAAM,WAAW,UAAU,MAAM,CAAC;AAAA,EAClD;AACA,SAAO;AACT;AAIA,SAAS,cAAc,OAA2B;AAChD,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,EAAE,QAAQ,GAAG,OAAO,KAAK;AAAA,IAClC,KAAK;AACH,aAAO,EAAE,QAAQ,GAAG,eAAe,MAAM,KAAK,OAAO;AAAA,IACvD,KAAK;AACH,aAAO,EAAE,QAAQ,GAAG,YAAY,uBAAuB,KAAK,EAAE;AAAA,IAChE,KAAK;AACH,aAAO,EAAE,QAAQ,GAAG,gBAAgB,uBAAuB,KAAK,EAAE;AAAA,IACpE,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,QAAQ,EAAE;AAAA,IACrB;AACE,aAAO,YAAY,KAAK;AAAA,EAC5B;AACF;AAEA,SAAS,uBAAuB,OAA4C;AAC1E,MAAI,QAAQ;AACZ,aAAW,OAAO,MAAM,MAAM;AAC5B,eAAW,QAAQ,KAAK;AACtB,eAAS,eAAe,IAAI;AAAA,IAC9B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,MAAyB;AAC/C,MAAI,KAAK,SAAS,cAAc,KAAK,SAAS,cAAc;AAC1D,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,SAAO,KAAK,UAAU,IAAI,EAAE;AAC9B;AAEA,SAAS,iBAAiB,QAAuC;AAC/D,QAAM,MAAe,CAAC;AACtB,MAAI;AAEJ,QAAM,eAAe,MAAY;AAC/B,QAAI,YAAY,UAAa,QAAQ,WAAW,GAAG;AACjD,gBAAU;AACV;AAAA,IACF;AACA,UAAM,QAAuB,EAAE,MAAM,aAAa,UAAU,QAAQ;AACpE,QAAI,KAAK,KAAK;AACd,cAAU;AAAA,EACZ;AAEA,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,eAAe,cAAc,KAAK,GAAG;AACtD,UAAI,YAAY,QAAW;AACzB,kBAAU,CAAC,GAAG,MAAM,QAAQ;AAAA,MAC9B,OAAO;AACL,gBAAQ,KAAK,GAAG,MAAM,QAAQ;AAAA,MAChC;AAAA,IACF,OAAO;AACL,mBAAa;AACb,UAAI,KAAK,KAAK;AAAA,IAChB;AAAA,EACF;AACA,eAAa;AACb,SAAO;AACT;AAEA,SAAS,cAAc,OAA+B;AAEpD,SAAO,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,mBAAmB;AACnE;;;AC9PO,IAAM,iCAAN,MAAkE;AAAA,EACvE,OAAO,UAA0B;AAC/B,UAAM,QAAkB,CAAC;AAEzB,QAAI,IAAI;AACR,UAAM,MAAM;AACZ,WAAO,IAAI,IAAI,QAAQ;AACrB,UAAI,IAAI,WAAW,OAAO,CAAC,GAAG;AAC5B,cAAM,MAAM,IAAI,QAAQ,OAAO,IAAI,CAAC;AACpC,YAAI,QAAQ,IAAI;AACd,gBAAM,KAAK,IAAI,MAAM,IAAI,CAAC,CAAC;AAC3B;AAAA,QACF;AACA,cAAM,KAAK,IAAI,MAAM,IAAI,GAAG,GAAG,EAAE,KAAK,CAAC;AACvC,YAAI,MAAM;AACV;AAAA,MACF;AACA,YAAM,KAAK,IAAI,CAAC,KAAK,EAAE;AACvB,WAAK;AAAA,IACP;AACA,UAAM,MAAM,MACT,KAAK,EAAE,EACP,QAAQ,sCAAsC,GAAG,EACjD,QAAQ,uCAAuC,IAAI,EACnD,QAAQ,aAAa,EAAE,EACvB,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACR,WAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EAChC;AAAA,EAEA,iBAAiB,QAAsC;AACrD,UAAM,QAAkB,CAAC;AACzB,eAAW,SAAS,QAAQ;AAC1B,cAAQ,MAAM,MAAM;AAAA,QAClB,KAAK;AACH,gBAAM,KAAK,MAAM,KAAK,IAAI;AAC1B;AAAA,QACF,KAAK;AACH,cAAI,MAAM,SAAS,QAAW;AAC5B,kBAAM,KAAK,YAAY,MAAM,KAAK,IAAI,CAAC;AAAA,UACzC;AACA;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,gBAAgB,MAAM,QAAQ,CAAC;AAC1C;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,KAAK,OAAO,MAAM,IAAI,CAAC;AAClC;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,KAAK;AAChB;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,MAAM,QAAQ;AACzB;AAAA,QACF,KAAK;AACH,qBAAW,MAAM,MAAM,UAAU;AAC/B,gBAAI,GAAG,SAAS,YAAY,GAAG,SAAS,cAAc;AACpD,oBAAM,KAAK,YAAY,GAAG,IAAI,CAAC;AAAA,YACjC;AAAA,UACF;AACA;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,gBAAM,KAAK,aAAa,MAAM,IAAI,CAAC;AACnC;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,MAAM,KAAK;AACtB;AAAA,QACF,KAAK;AACH,cAAI,MAAM,UAAU,QAAW;AAC7B,kBAAM,KAAK,MAAM,MAAM,IAAI;AAAA,UAC7B;AACA,gBAAM,KAAK,KAAK,iBAAiB,MAAM,YAAY,CAAC;AACpD;AAAA,QACF;AACE;AAAA,MACJ;AAAA,IACF;AACA,UAAM,OAAO,MACV,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,KAAK,IAAI,EACT,KAAK;AACR,WAAO,KAAK,SAAS,IAAI,OAAO;AAAA,EAClC;AACF;AAEA,SAAS,YAAY,MAAsB;AACzC,SAAO,KACJ,QAAQ,qCAAqC,IAAI,EACjD,QAAQ,qBAAqB,IAAI,EACjC,QAAQ,WAAW,EAAE;AAC1B;AAEA,SAAS,gBAAgB,UAAkD;AACzE,QAAM,QAAkB,CAAC;AACzB,aAAW,MAAM,UAAU;AACzB,YAAQ,GAAG,MAAM;AAAA,MACf,KAAK;AAAA,MACL,KAAK;AACH,cAAM,KAAK,eAAe,GAAG,QAAQ,CAAC;AACtC;AAAA,MACF,KAAK;AACH,mBAAW,QAAQ,GAAG,UAAU;AAC9B,gBAAM,KAAK,UAAK,eAAe,KAAK,QAAQ,CAAC,EAAE;AAAA,QACjD;AACA;AAAA,MACF,KAAK;AACH,cAAM,KAAK,eAAe,GAAG,QAAQ,CAAC;AACtC;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,eAAe,UAAiD;AACvE,QAAM,QAAkB,CAAC;AACzB,aAAW,MAAM,UAAU;AACzB,YAAQ,GAAG,MAAM;AAAA,MACf,KAAK;AACH,cAAM,KAAK,GAAG,IAAI;AAClB;AAAA,MACF,KAAK;AACH,cAAM,KAAK,GAAG,QAAQ,GAAG,GAAG;AAC5B;AAAA,MACF,KAAK;AACH,cAAM,KAAK,IAAI,GAAG,IAAI,GAAG;AACzB;AAAA,MACF,KAAK;AACH,cAAM,KAAK,IAAI,GAAG,OAAO,EAAE;AAC3B;AAAA,MACF,KAAK;AACH,cAAM,KAAK,IAAI,GAAG,UAAU,EAAE;AAC9B;AAAA,MACF,KAAK;AACH,cAAM,KAAK,IAAI,GAAG,YAAY,EAAE;AAChC;AAAA,MACF,KAAK;AACH,cAAM,KAAK,IAAI,GAAG,KAAK,EAAE;AACzB;AAAA,MACF,KAAK;AACH,cAAM,KAAK,GAAG,YAAY,oBAAoB,GAAG,WAAW,GAAG,MAAM,CAAC;AACtE;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AACA,SAAO,MAAM,KAAK,EAAE;AACtB;AAEA,IAAM,gBAAgB;AAEtB,IAAM,SAAS;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,WAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,KAAK,OAAuB;AACnC,SAAO,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG;AACtC;AAEA,SAAS,QAAQ,OAAuB;AACtC,QAAM,YAAY,QAAQ;AAC1B,MAAI,aAAa,MAAM,aAAa,IAAI;AACtC,WAAO,GAAG,OAAO,KAAK,CAAC;AAAA,EACzB;AACA,UAAQ,QAAQ,IAAI;AAAA,IAClB,KAAK;AACH,aAAO,GAAG,OAAO,KAAK,CAAC;AAAA,IACzB,KAAK;AACH,aAAO,GAAG,OAAO,KAAK,CAAC;AAAA,IACzB,KAAK;AACH,aAAO,GAAG,OAAO,KAAK,CAAC;AAAA,IACzB;AACE,aAAO,GAAG,OAAO,KAAK,CAAC;AAAA,EAC3B;AACF;AAGA,SAAS,UAAU,OAAe,MAAgC;AAChE,QAAM,MAAM,KAAK,WAAW;AAC5B,QAAM,QAAQ,OAAO,KAAK,YAAY,CAAC,KAAK;AAC5C,QAAM,aAAa,MAAM,MAAM,GAAG,CAAC;AACnC,QAAM,UAAU,SAAS,KAAK,UAAU,CAAC,KAAK;AAC9C,QAAM,OAAO,KAAK,eAAe;AAEjC,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC;AAAA;AAAA;AAAA,IAGrE,KAAK;AACH,aAAO,GAAG,KAAK,KAAK,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC;AAAA,IACrE,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAG,OAAO,KAAK,KAAK,IAAI,QAAQ,GAAG,CAAC,KAAK,OAAO,IAAI,CAAC;AAAA,IAC9D,KAAK;AACH,aAAO,GAAG,KAAK,IAAI,OAAO,GAAG,CAAC,KAAK,OAAO,IAAI,CAAC;AAAA;AAAA,IAEjD,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAG,KAAK,IAAI,QAAQ,GAAG,CAAC,KAAK,OAAO,IAAI,CAAC;AAAA,IAClD,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAG,UAAU,IAAI,OAAO,GAAG,CAAC,KAAK,OAAO,IAAI,CAAC;AAAA,IACtD,KAAK;AACH,aAAO,GAAG,KAAK,KAAK,YAAY,CAAC,CAAC,IAAI,KAAK,KAAK,cAAc,CAAC,CAAC;AAAA,IAClE,KAAK;AACH,aAAO,GAAG,KAAK,KAAK,YAAY,CAAC,CAAC,IAAI,KAAK,KAAK,cAAc,CAAC,CAAC,IAAI,KAAK,KAAK,cAAc,CAAC,CAAC;AAAA,IAChG;AACE,aAAO;AAAA,EACX;AACF;AAUA,SAAS,oBAAoB,WAAmB,QAAwB;AACtE,QAAM,OAAO,IAAI,KAAK,YAAY,GAAI;AACtC,MAAI,CAAC,OAAO,SAAS,SAAS,KAAK,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG;AAC/D,WAAO,OAAO,SAAS;AAAA,EACzB;AACA,MAAI,cAAc;AAClB,QAAM,YAAY,OAAO,QAAQ,eAAe,CAAC,QAAQ,UAAkB;AACzE,UAAM,cAAc,UAAU,OAAO,IAAI;AACzC,QAAI,gBAAgB,QAAW;AAC7B,oBAAc;AACd,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AACD,MAAI,OAAO,WAAW,KAAK,aAAa;AACtC,WAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,EACvC;AACA,SAAO;AACT;AAEA,SAAS,aAAa,MAAqD;AACzE,QAAM,QAAkB,CAAC;AACzB,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,UAAU,IAAI,CAAC;AAC/C,UAAM,KAAK,MAAM,KAAK,KAAK,CAAC;AAAA,EAC9B;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,UAAU,MAAuB;AACxC,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,WAAO;AAAA,EACT;AACA,QAAM,IAAI;AACV,MAAI,EAAE,SAAS,cAAc,OAAO,EAAE,SAAS,UAAU;AACvD,WAAO,EAAE;AAAA,EACX;AACA,MAAI,EAAE,SAAS,cAAc;AAC3B,WAAO,OAAO,EAAE,SAAS,WAAW,EAAE,OAAO,OAAO,EAAE,SAAS,EAAE;AAAA,EACnE;AACA,MAAI,EAAE,SAAS,eAAe,MAAM,QAAQ,EAAE,QAAQ,GAAG;AACvD,WAAO,gBAAgB,EAAE,QAA6B;AAAA,EACxD;AACA,SAAO;AACT;;;ACrSA,OAAO,uBAAuB;AAC9B,OAAO,eAAe;AACtB,OAAO,gBAAgB;AACvB,OAAO,iBAAiB;AACxB,SAAS,eAAe;AAOjB,IAAM,uBAAN,MAAqD;AAAA,EAC1D,MAAM,MAAM,UAAkB,SAAuC;AACnE,UAAM,YAAY,QAAQ,EAAE,IAAI,WAAW,EAAE,IAAI,SAAS;AAC1D,QAAI,QAAQ,mBAAmB;AAC7B,gBAAU,IAAI,mBAAmB,CAAC,QAAQ,MAAM,CAAC;AAAA,IACnD;AACA,QAAI,QAAQ,YAAY;AACtB,gBAAU,IAAI,UAAU;AAAA,IAC1B;AACA,WAAO,UAAU,MAAM,QAAQ;AAAA,EACjC;AACF;;;ACrBA,IAAM,aAAa;AACnB,IAAM,WAAW;AACjB,IAAM,WAAW;AAKV,IAAM,mBAAN,MAAqD;AAAA,EAC1D,MAAM,QAAoC;AACxC,UAAM,UAAU,OAAO,QAAQ,YAAY,EAAE;AAC7C,UAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,QAAI;AACJ,UAAM,WAAoD,CAAC;AAC3D,QAAI,aAAa;AAEjB,eAAW,OAAO,OAAO;AACvB,YAAM,OAAO,IAAI,KAAK;AACtB,UAAI,KAAK,WAAW,GAAG;AACrB;AAAA,MACF;AACA,UAAI,CAAC,YAAY;AACf,YAAI,CAAC,aAAa,KAAK,IAAI,GAAG;AAC5B,iBAAO,EAAE,IAAI,OAAO,QAAQ,oBAAoB;AAAA,QAClD;AACA,qBAAa;AACb,cAAM,KAAK,SAAS,KAAK,IAAI;AAC7B,cAAM,YAAY,KAAK,CAAC,GAAG,KAAK;AAChC,YAAI,cAAc,UAAa,UAAU,SAAS,GAAG;AACnD,kBAAQ;AAAA,QACV;AACA;AAAA,MACF;AAGA,YAAM,YAAY,wBAAwB,KAAK,IAAI;AACnD,UAAI,cAAc,QAAQ,UAAU,QAAW;AAC7C,iBAAS,UAAU,CAAC,KAAK,IAAI,KAAK;AAClC;AAAA,MACF;AAEA,YAAM,KAAK,SAAS,KAAK,IAAI;AAC7B,UAAI,OAAO,MAAM;AACf,eAAO,EAAE,IAAI,OAAO,QAAQ,sBAAsB,IAAI,GAAG;AAAA,MAC3D;AACA,YAAM,QAAQ,GAAG,CAAC,KAAK;AACvB,YAAM,QAAQ,OAAO,GAAG,CAAC,CAAC;AAC1B,UAAI,EAAE,QAAQ,IAAI;AAChB,eAAO,EAAE,IAAI,OAAO,QAAQ,+BAA+B,OAAO,KAAK,CAAC,IAAI;AAAA,MAC9E;AACA,eAAS,KAAK,EAAE,OAAO,MAAM,CAAC;AAAA,IAChC;AAEA,QAAI,CAAC,YAAY;AACf,aAAO,EAAE,IAAI,OAAO,QAAQ,qBAAqB;AAAA,IACnD;AACA,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,EAAE,IAAI,OAAO,QAAQ,sBAAsB;AAAA,IACpD;AAEA,UAAM,MAAqB;AAAA,MACzB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AACA,WAAO,EAAE,IAAI,MAAM,OAAO,IAAI;AAAA,EAChC;AACF;;;ACjEA,IAAMA,cAAa;AACnB,IAAM,MAAM,OAAO;AACnB,IAAM,cAAc,IAAI,OAAO,OAAO,eAAe,GAAG,YAAY,GAAG,QAAQ;AAC/E,IAAM,cAAc;AAKb,IAAM,uBAAN,MAAyD;AAAA,EAC9D,MAAM,QAAoC;AACxC,UAAM,UAAU,OAAO,QAAQA,aAAY,EAAE;AAC7C,UAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,QAAI;AACJ,QAAI,aAAuB,CAAC;AAC5B,QAAI;AACJ,QAAI;AACJ,UAAM,OAAmB,CAAC;AAC1B,UAAM,cAA0B,CAAC;AACjC,QAAI,aAAa;AAEjB,eAAW,OAAO,OAAO;AACvB,YAAM,OAAO,IAAI,KAAK;AACtB,UAAI,KAAK,WAAW,GAAG;AACrB;AAAA,MACF;AACA,UAAI,CAAC,YAAY;AACf,YAAI,CAAC,sBAAsB,KAAK,IAAI,GAAG;AACrC,iBAAO,EAAE,IAAI,OAAO,QAAQ,8BAA8B;AAAA,QAC5D;AACA,qBAAa;AACb;AAAA,MACF;AAEA,YAAM,SACJ,mCAAmC,KAAK,IAAI,KAAK,wBAAwB,KAAK,IAAI;AACpF,UAAI,WAAW,MAAM;AACnB,iBAAS,OAAO,CAAC,KAAK,IAAI,KAAK;AAC/B;AAAA,MACF;AAEA,UAAI,gBAAgB,KAAK,IAAI,GAAG;AAC9B,cAAM,UAAU,YAAY,KAAK,IAAI;AACrC,YAAI,YAAY,MAAM;AACpB,uBAAa,gBAAgB,QAAQ,CAAC,KAAK,EAAE;AAC7C,gBAAM,SAAS,mCAAmC,KAAK,IAAI;AAC3D,cAAI,WAAW,MAAM;AACnB,qBAAS,OAAO,CAAC;AAAA,UACnB;AACA;AAAA,QACF;AACA,cAAM,SAAS,IAAI;AAAA,UACjB,OAAO,uCAAuC,GAAG,cAAc,GAAG;AAAA,UAClE;AAAA,QACF,EAAE,KAAK,IAAI;AACX,YAAI,WAAW,MAAM;AACnB,mBAAS,OAAO,CAAC;AACjB,gBAAM,MAAM,OAAO,OAAO,CAAC,CAAC;AAC5B,gBAAM,MAAM,OAAO,OAAO,CAAC,CAAC;AAC5B,cAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,MAAM,KAAK;AAC/D,mBAAO,EAAE,IAAI,OAAO,QAAQ,yBAAyB,IAAI,GAAG;AAAA,UAC9D;AACA,gBAAM,OAAO,MAAM,MAAM;AACzB,cAAI,OAAO,kBAAkB;AAC3B,mBAAO;AAAA,cACL,IAAI;AAAA,cACJ,QAAQ,oBAAoB,OAAO,IAAI,CAAC,gBAAgB,OAAO,gBAAgB,CAAC;AAAA,YAClF;AAAA,UACF;AACA,uBAAa,CAAC;AACd,mBAAS,IAAI,KAAK,KAAK,KAAK,KAAK,GAAG;AAClC,uBAAW,KAAK,OAAO,CAAC,CAAC;AAAA,UAC3B;AACA;AAAA,QACF;AACA,eAAO,EAAE,IAAI,OAAO,QAAQ,mBAAmB,IAAI,GAAG;AAAA,MACxD;AAEA,UAAI,gBAAgB,KAAK,IAAI,GAAG;AAC9B,cAAM,KAAK,IAAI;AAAA,UACb,OAAO,0CAA0C,GAAG,cAAc,GAAG;AAAA,UACrE;AAAA,QACF,EAAE,KAAK,IAAI;AACX,YAAI,OAAO,MAAM;AACf,mBAAS,GAAG,CAAC;AACb;AAAA,QACF;AACA,eAAO,EAAE,IAAI,OAAO,QAAQ,mBAAmB,IAAI,GAAG;AAAA,MACxD;AAEA,UAAI,aAAa,KAAK,IAAI,GAAG;AAC3B,cAAM,OAAO,YAAY,KAAK,IAAI;AAClC,YAAI,SAAS,MAAM;AACjB,iBAAO,EAAE,IAAI,OAAO,QAAQ,uBAAuB,IAAI,GAAG;AAAA,QAC5D;AACA,aAAK,KAAK,gBAAgB,KAAK,CAAC,KAAK,EAAE,CAAC;AACxC;AAAA,MACF;AAEA,UAAI,cAAc,KAAK,IAAI,GAAG;AAC5B,cAAM,OAAO,YAAY,KAAK,IAAI;AAClC,YAAI,SAAS,MAAM;AACjB,iBAAO,EAAE,IAAI,OAAO,QAAQ,wBAAwB,IAAI,GAAG;AAAA,QAC7D;AACA,oBAAY,KAAK,gBAAgB,KAAK,CAAC,KAAK,EAAE,CAAC;AAC/C;AAAA,MACF;AAEA,aAAO,EAAE,IAAI,OAAO,QAAQ,8BAA8B,IAAI,GAAG;AAAA,IACnE;AAEA,QAAI,CAAC,YAAY;AACf,aAAO,EAAE,IAAI,OAAO,QAAQ,8BAA8B;AAAA,IAC5D;AACA,QAAI,WAAW,WAAW,GAAG;AAC3B,aAAO,EAAE,IAAI,OAAO,QAAQ,6BAA6B;AAAA,IAC3D;AACA,QAAI,KAAK,WAAW,KAAK,YAAY,WAAW,GAAG;AACjD,aAAO,EAAE,IAAI,OAAO,QAAQ,wBAAwB;AAAA,IACtD;AAEA,UAAM,MAAyB;AAAA,MAC7B,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AACA,WAAO,EAAE,IAAI,MAAM,OAAO,IAAI;AAAA,EAChC;AACF;AAEA,SAAS,gBAAgB,OAAyB;AAChD,QAAM,MAAgB,CAAC;AACvB,QAAM,KAAK;AACX,MAAI,IAA4B,GAAG,KAAK,KAAK;AAC7C,SAAO,MAAM,MAAM;AACjB,QAAI,KAAK,EAAE,CAAC,KAAK,EAAE;AACnB,QAAI,GAAG,KAAK,KAAK;AAAA,EACnB;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAyB;AAChD,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;AACzB;;;ACxJA,SAAS,gBAAgB;;;ACYlB,SAAS,cACd,UACA,WACgB;AAChB,QAAM,SAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,qBAAqB;AAAA,MACnB,GAAG,SAAS;AAAA,MACZ,GAAG,WAAW;AAAA,IAChB;AAAA,IACA,WAAW,WAAW,aAAa,SAAS;AAAA,IAC5C,UAAU,WAAW,YAAY,SAAS;AAAA,IAC1C,kBAAkB,WAAW,oBAAoB,SAAS;AAAA,EAC5D;AAEA,QAAM,eAAe,oBAAoB,OAAO,cAAc,OAAO,mBAAmB;AAExF,QAAM,WAAW,OAAO,YAAY,aAAa;AACjD,MAAI,aAAa,aAAa,WAAW,aAAa,aAAa,OAAO;AACxE,UAAM,IAAI;AAAA,MACR,yBAAyB,KAAK,UAAU,QAAQ,CAAC;AAAA,IACnD;AAAA,EACF;AAEA,QAAM,WAAW,OAAO,YAAY,mBAAmB;AACvD,MACE,aAAa,mBAAmB,iBAChC,aAAa,mBAAmB,eAChC;AACA,UAAM,IAAI;AAAA,MACR,oBAAoB,KAAK,UAAU,QAAQ,CAAC;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,YAA0C,OAAO,aAAa,CAAC;AAErE,SAAO,OAAO,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,OAAO;AAAA,IACjB,YAAY,OAAO,eAAe;AAAA,IAClC,mBAAmB,OAAO,sBAAsB;AAAA,IAChD,kBAAkB,OAAO;AAAA,EAC3B,CAAC;AACH;;;ADtBO,IAAM,qBAAN,MAAyB;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,MAA8B;AACxC,SAAK,SAAS,KAAK;AACnB,SAAK,WAAW,KAAK;AACrB,SAAK,YAAY,KAAK;AACtB,SAAK,YAAY,KAAK;AACtB,SAAK,iBAAiB,KAAK;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAQ,UAAkB,SAAqD;AACnF,UAAM,QAAQ,MAAM,KAAK,kBAAkB,UAAU;AAAA,MACnD,GAAG;AAAA,MACH,UAAU,aAAa;AAAA,IACzB,CAAC;AACD,UAAM,QAAQ,MAAM,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,MAAM,IAAI;AAC3D,WAAO;AAAA,MACL,QAAQ,MAAM;AAAA,MACd,MAAM,MAAM;AAAA,MACZ,cAAc,MAAM;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBACJ,UACA,SACmC;AACnC,UAAM,SAAS,cAAc,KAAK,gBAAgB,OAAO;AACzD,UAAM,eAAe,IAAI,8BAA8B;AAIvD,UAAM,YAAY,OAAO,aAAa,aAAa;AACnD,UAAM,SAAS,IAAI;AAAA,MACjB,YAAY,OAAO,mBAAmB;AAAA,MACtC,EAAE,iBAAiB,CAAC,UAAU;AAAA,IAChC;AAEA,QAAI;AACF,UAAI,OAAO,aAAa,mBAAmB,eAAe;AACxD,eAAO,KAAK,qBAAqB,UAAU,QAAQ,cAAc,MAAM;AAAA,MACzE;AAEA,YAAM,OAAO,MAAM,KAAK,OAAO,MAAM,UAAU;AAAA,QAC7C,YAAY,OAAO;AAAA,QACnB,mBAAmB,OAAO;AAAA,MAC5B,CAAC;AAED,YAAM,EAAE,aAAa,WAAW,cAAc,IAAI,YAAY,MAAM,YAAY;AAChF,UAAI;AACJ,YAAM,UAAmB,CAAC;AAE1B,UAAI,QAAQ;AACZ,iBAAW,QAAQ,KAAK,UAAU;AAIhC,YAAI,WAAW;AACb,iBAAO,mBAAmB;AAAA,QAC5B;AACA,cAAM,MAAM,IAAI,kBAAkB;AAAA,UAChC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,MAAM,QAAQ,OAAO,KAAK,CAAC;AAAA,QAC7B,CAAC;AAED,YAAI,KAAK,SAAS,WAAW;AAC3B,6BAAmB,SAAS,IAAe;AAAA,QAC7C;AAEA,cAAM,SAAS,MAAM,KAAK,SAAS,KAAK,MAAqB,GAAG;AAChE,gBAAQ,KAAK,GAAG,MAAM;AACtB,iBAAS;AAAA,MACX;AAEA,YAAM,kBAAkB,oBAAI,IAAoB;AAChD,oBAAc,QAAQ,CAAC,IAAI,MAAM,gBAAgB,IAAI,IAAI,IAAI,CAAC,CAAC;AAC/D,YAAM,kBAAkB,cAAc,IAAI,CAAC,IAAI,MAAM;AACnD,cAAM,MAAM,UAAU,IAAI,EAAE;AAC5B,eAAO;AAAA,UACL,GAAG,IAAI;AAAA,UACP,MAAM,QAAQ,SAAY,iBAAiB,KAAK,eAAe,EAAE,KAAK,IAAI;AAAA,QAC5E;AAAA,MACF,CAAC;AACD,YAAM,iBAAiB,oBAAoB,iBAAiB,YAAY;AAExE,YAAM,cAAc,IAAI,kBAAkB;AAAA,QACxC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AACD,YAAM,WAAW,KAAK,UAAU,SAAS,SAAS,aAAa,cAAc;AAE7E,aAAO;AAAA,QACL;AAAA,QACA,cAAc,aAAa,IAAI;AAAA,MACjC;AAAA,IACF,SAAS,KAAK;AAEZ,mBAAa,IAAI;AAAA,QACf,UAAU;AAAA,QACV,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,QAAQ,eAAe,QAAQ,IAAI,UAAU;AAAA,QAC7C,MAAM;AAAA,MACR,CAAC;AACD,YAAM,OAAO,qBAAqB,KAAK,WAAW,UAAU,YAAY;AACxE,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,QAAQ;AAAA,cACN;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,EAAE,MAAM,UAAU,MAAM,qBAAqB,MAAM,YAAY,EAAE;AAAA,cACzE;AAAA,YACF;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA,cAAc,aAAa,IAAI;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBACN,UACA,QACA,cACA,QAC0B;AAC1B,UAAM,SAAS,cAAc,UAAU,IAAM;AAC7C,QAAI,SAAkB,CAAC;AACvB,QAAI,CAAC,OAAO,aAAa,eAAe;AACtC,mBAAa,IAAI;AAAA,QACf,UAAU;AAAA,QACV,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,MAAM;AAAA,MACR,CAAC;AACD,YAAM,OAAO,qBAAqB,KAAK,WAAW,UAAU,YAAY;AACxE,eAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,EAAE,MAAM,UAAU,MAAM,qBAAqB,MAAM,YAAY,EAAE;AAAA,QACzE;AAAA,MACF;AAAA,IACF,OAAO;AACL,iBAAW,SAAS,QAAQ;AAC1B,YAAI,OAAO,aAAa,aAAa,OAAO;AAC1C,iBAAO,mBAAmB;AAAA,QAC5B;AACA,YAAI,CAAC,OAAO,gBAAgB,EAAE,QAAQ,GAAG,eAAe,MAAM,OAAO,CAAC,GAAG;AACvE,uBAAa,IAAI;AAAA,YACf,UAAU;AAAA,YACV,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AACD;AAAA,QACF;AACA,eAAO,KAAK,EAAE,MAAM,YAAY,MAAM,MAAM,CAAC;AAAA,MAC/C;AAAA,IACF;AAEA,UAAM,cAAc,IAAI,kBAAkB;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,oBAAI,IAAI;AAAA,MACrB,WAAW,oBAAI,IAAI;AAAA,MACnB,eAAe,CAAC;AAAA,MAChB,kBAAkB;AAAA,MAClB,MAAM;AAAA,IACR,CAAC;AAED,UAAM,WAAW,KAAK,UAAU,SAAS,QAAQ,aAAa,CAAC,CAAC;AAChE,WAAO;AAAA,MACL;AAAA,MACA,cAAc,aAAa,IAAI;AAAA,IACjC;AAAA,EACF;AACF;AAEA,SAAS,qBACP,WACA,UACA,cACQ;AACR,QAAM,MAAM,UAAU,OAAO,QAAQ;AACrC,MAAI,IAAI,UAAU,+BAA+B;AAC/C,WAAO;AAAA,EACT;AACA,eAAa,IAAI;AAAA,IACf,UAAU;AAAA,IACV,MAAM,GAAG,OAAO,IAAI,MAAM,CAAC;AAAA,IAC3B,IAAI,GAAG,OAAO,6BAA6B,CAAC;AAAA,IAC5C,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AACD,SAAO,mBAAmB,KAAK,6BAA6B;AAC9D;AAEA,SAAS,qBAAqB,MAAc,cAA4C;AACtF,MAAI,KAAK,UAAU,wBAAwB;AACzC,WAAO;AAAA,EACT;AACA,eAAa,IAAI;AAAA,IACf,UAAU;AAAA,IACV,MAAM,GAAG,OAAO,KAAK,MAAM,CAAC;AAAA,IAC5B,IAAI,GAAG,OAAO,sBAAsB,CAAC;AAAA,IACrC,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AACD,SAAO,mBAAmB,MAAM,sBAAsB;AACxD;AAEA,SAAS,YACP,MACA,cAKA;AACA,QAAM,cAAc,oBAAI,IAAwB;AAChD,QAAM,YAAY,oBAAI,IAAgC;AAItD,aAAW,QAAQ,KAAK,UAAU;AAChC,QAAI,KAAK,SAAS,cAAc;AAC9B,YAAM,MAAM,KAAK,WAAW,YAAY;AACxC,UAAI,YAAY,IAAI,GAAG,GAAG;AACxB,qBAAa,IAAI;AAAA,UACf,UAAU;AAAA,UACV,MAAM,KAAK;AAAA,UACX,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH,OAAO;AACL,oBAAY,IAAI,KAAK,IAAI;AAAA,MAC3B;AAAA,IACF;AACA,QAAI,KAAK,SAAS,sBAAsB;AACtC,UAAI,UAAU,IAAI,KAAK,UAAU,GAAG;AAClC,qBAAa,IAAI;AAAA,UACf,UAAU;AAAA,UACV,MAAM,KAAK;AAAA,UACX,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH,OAAO;AACL,kBAAU,IAAI,KAAK,YAAY,IAAI;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAA0B,CAAC;AACjC,QAAM,OAAO,oBAAI,IAAY;AAC7B,yBAAuB,MAAM,CAAC,OAAO;AACnC,QAAI,CAAC,KAAK,IAAI,EAAE,GAAG;AACjB,WAAK,IAAI,EAAE;AACX,oBAAc,KAAK,EAAE;AAAA,IACvB;AAAA,EACF,CAAC;AAID,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK,GAAG;AAChD,UAAM,MAAM,UAAU,IAAI,cAAc,CAAC,KAAK,EAAE;AAChD,QAAI,QAAQ,QAAW;AACrB;AAAA,IACF;AACA,eAAW,SAAS,IAAI,UAAU;AAChC,6BAAuB,OAAO,CAAC,OAAO;AACpC,YAAI,CAAC,KAAK,IAAI,EAAE,GAAG;AACjB,eAAK,IAAI,EAAE;AACX,wBAAc,KAAK,EAAE;AAAA,QACvB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,EAAE,aAAa,WAAW,cAAc;AACjD;AAMA,SAAS,iBAAiB,MAAe,SAA8C;AACrF,MAAI,SAAS,QAAQ,OAAO,SAAS,UAAU;AAC7C,WAAO;AAAA,EACT;AACA,QAAM,SAAS;AAOf,MAAI,OAAO,SAAS,uBAAuB,OAAO,OAAO,eAAe,UAAU;AAChF,UAAM,IAAI,QAAQ,IAAI,OAAO,UAAU;AACvC,WAAO,MAAM,SAAY,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,OAAO,UAAU;AAAA,EACpE;AACA,MAAI,OAAO,OAAO,UAAU,UAAU;AACpC,WAAO,OAAO;AAAA,EAChB;AACA,MAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,WAAO,OAAO;AAAA,EAChB;AACA,MAAI,OAAO,aAAa,QAAW;AACjC,UAAM,QAAkB,CAAC;AACzB,eAAW,SAAS,OAAO,UAAU;AACnC,YAAM,KAAK,iBAAiB,OAAO,OAAO,CAAC;AAAA,IAC7C;AACA,WAAO,MAAM,KAAK,EAAE;AAAA,EACtB;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAe,OAAmC;AAChF,MAAI,SAAS,QAAQ,OAAO,SAAS,UAAU;AAC7C;AAAA,EACF;AACA,QAAM,SAAS;AAMf,MAAI,OAAO,SAAS,sBAAsB;AACxC;AAAA,EACF;AACA,MAAI,OAAO,SAAS,uBAAuB,OAAO,OAAO,eAAe,UAAU;AAChF,UAAM,OAAO,UAAU;AACvB;AAAA,EACF;AACA,MAAI,OAAO,aAAa,QAAW;AACjC,eAAW,SAAS,OAAO,UAAU;AACnC,6BAAuB,OAAO,KAAK;AAAA,IACrC;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAAc,KAAuB;AAC1D,MAAI,KAAK,UAAU,KAAK;AACtB,WAAO,CAAC,KAAK,SAAS,IAAI,OAAO,GAAG;AAAA,EACtC;AACA,QAAM,MAAgB,CAAC;AACvB,MAAI,IAAI;AACR,SAAO,IAAI,KAAK,QAAQ;AAEtB,UAAM,MAAM,iBAAiB,MAAM,IAAI,GAAG;AAC1C,QAAI,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC;AAC3B,QAAI;AAAA,EACN;AACA,SAAO;AACT;;;AEraA,SAAS,YAAAC,iBAAgB;;;ACAzB,SAAS,YAAAC,iBAAgB;AAyBzB,IAAM,qBAAqB;AAE3B,IAAM,cAAc;AACpB,IAAM,eAAe;AAgBd,SAAS,aACd,OACA,KACA,YAA2B,CAAC,GACV;AAClB,QAAM,WAA6B,CAAC;AACpC,QAAM,gBAAgC,CAAC;AAGvC,QAAM,OAA0B,CAAC,GAAG,KAAK;AAEzC,MAAI;AAIJ,QAAM,aAA8B,CAAC;AACrC,QAAM,cAAc,MAAqB,WAAW,WAAW,SAAS,CAAC,KAAK;AAE9E,QAAM,qBAAqB,MAAY;AACrC,QAAI,kBAAkB,QAAW;AAC/B;AAAA,IACF;AACA,aAAS,KAAK,aAAa,eAAe,GAAG,CAAC;AAC9C,oBAAgB;AAAA,EAClB;AAEA,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAM,OAAO,KAAK,CAAC;AACnB,QAAI,kBAAkB,QAAW;AAC/B,YAAM,cAAc,2BAA2B,MAAM,GAAG,YAAY,CAAC;AACrE,UAAI,gBAAgB,QAAW;AAC7B,YAAI,YAAY,YAAY,MAAM,SAAS,GAAG;AAC5C,mBAAS;AAAA,YACP,GAAG,6BAA6B,YAAY,aAAa,YAAY,GAAG,GAAG;AAAA,UAC7E;AAAA,QACF;AACA,iBAAS,KAAK,YAAY,IAAI;AAG9B,YAAI,YAAY,aAAa,MAAM,SAAS,GAAG;AAC7C,eAAK,OAAO,GAAG,GAAG,YAAY,YAAY;AAAA,QAC5C,OAAO;AACL,eAAK,OAAO,GAAG,CAAC;AAAA,QAClB;AACA,aAAK;AACL;AAAA,MACF;AAAA,IACF;AACA,QAAI,kBAAkB,QAAW;AAC/B,UAAI,KAAK,SAAS,UAAU,cAAc,KAAK,KAAK,MAAM,KAAK,CAAC,GAAG;AACjE,2BAAmB;AACnB;AAAA,MACF;AACA,UAAI,KAAK,SAAS,QAAQ;AACxB,sBAAc,UAAU,KAAK,KAAK,KAAK;AACvC;AAAA,MACF;AACA,UAAI,KAAK,SAAS,SAAS;AACzB,sBAAc,UAAU,KAAK,IAAI;AACjC;AAAA,MACF;AACA,oBAAc,UAAU,KAAKC,UAAS,IAAI,CAAC;AAC3C;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,QAAQ;AACxB,YAAM,UAAU,KAAK,MAAM,KAAK;AAGhC,YAAM,gBAAgB,2BAA2B,SAAS,YAAY,CAAC;AACvE,UAAI,kBAAkB,QAAW;AAC/B,iBAAS,KAAK,GAAG,aAAa;AAC9B;AAAA,MACF;AACA,YAAM,WAAW,2BAA2B,KAAK,OAAO;AACxD,UAAI,aAAa,MAAM;AACrB,cAAM,YAAY,sCAAsC,KAAK,SAAS,CAAC,KAAK,EAAE;AAC9E,cAAM,OAAO,YAAY,CAAC;AAC1B,YAAI,SAAS,QAAW;AAGtB,0BAAgB;AAAA,YACd;AAAA,YACA,OAAO,YAAY;AAAA,YACnB,WAAW,CAAC;AAAA,YACZ,OAAO,eAAe,IAAI;AAAA,UAC5B;AACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,UAAU,mBAAmB,KAAK,OAAO;AAC/C,UAAI,YAAY,MAAM;AACpB,mBAAW,KAAK,aAAa,YAAY,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC7D;AAAA,MACF;AACA,UAAI,oBAAoB,KAAK,OAAO,GAAG;AACrC,mBAAW,IAAI;AACf;AAAA,MACF;AACA,eAAS,KAAK,GAAG,eAAe,KAAK,OAAO,YAAY,GAAG,GAAG,CAAC;AAC/D;AAAA,IACF;AAEA,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK,QAAQ;AACX,iBAAS,KAAK,GAAG,6BAA6B,MAAc,YAAY,GAAG,GAAG,CAAC;AAC/E;AAAA,MACF;AAAA,MACA,KAAK,UAAU;AACb,cAAM,QAAQ,aAAc,KAAgB,UAAU,KAAK;AAAA,UACzD,GAAG,YAAY;AAAA,UACf,MAAM;AAAA,QACR,CAAC;AACD,iBAAS,KAAK,GAAG,MAAM,QAAQ;AAC/B,sBAAc,KAAK,GAAG,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,MACA,KAAK,YAAY;AACf,cAAM,QAAQ,aAAc,KAAkB,UAAU,KAAK;AAAA,UAC3D,GAAG,YAAY;AAAA,UACf,QAAQ;AAAA,QACV,CAAC;AACD,iBAAS,KAAK,GAAG,MAAM,QAAQ;AAC/B,sBAAc,KAAK,GAAG,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,MACA,KAAK,UAAU;AACb,cAAM,QAAQ,aAAa,KAAK,UAAU,KAAK,EAAE,GAAG,YAAY,GAAG,QAAQ,KAAK,CAAC;AACjF,iBAAS,KAAK,GAAG,MAAM,QAAQ;AAC/B,sBAAc,KAAK,GAAG,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,MACA,KAAK,cAAc;AACjB,cAAM,KAAmB;AAAA,UACvB,MAAM;AAAA,UACN,MAAM,KAAK;AAAA,UACX,OAAO,iBAAiB,EAAE,GAAG,YAAY,GAAG,MAAM,KAAK,CAAC;AAAA,QAC1D;AACA,iBAAS,KAAK,EAAE;AAChB;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,iBAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,OAAO,iBAAiB,YAAY,CAAC,EAAE,CAAC;AAClF;AAAA,MACF;AAAA,MACA,KAAK,QAAQ;AACX,iBAAS,KAAK,GAAG,SAAS,MAAM,KAAK,YAAY,CAAC,CAAC;AACnD;AAAA,MACF;AAAA,MACA,KAAK,iBAAiB;AACpB,iBAAS,KAAK,GAAG,kBAAkB,MAAM,KAAK,YAAY,CAAC,CAAC;AAC5D;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,MAAM,KAAK;AACjB,YAAI,iBAAiB,GAAG,GAAG;AACzB,wBAAc,KAAK;AAAA,YACjB;AAAA,YACA,KAAK,KAAK,OAAO;AAAA,YACjB,OAAO,KAAK,SAAS;AAAA,UACvB,CAAC;AACD,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN;AAAA,YACA,MAAM,KAAK,OAAO,KAAK,IAAI,SAAS,IAAI,KAAK,MAAM;AAAA,YACnD,OAAO,iBAAiB,YAAY,CAAC;AAAA,UACvC,CAAC;AAAA,QACH,OAAO;AAIL,gBAAM,WAAW,eAAe,GAAG;AACnC,cAAI,aAAa,IAAI;AAAA,YACnB,UAAU;AAAA,YACV,MAAM;AAAA,YACN,IAAI,WAAW,SAAS;AAAA,YACxB,QAAQ;AAAA,YACR,MAAM,IAAI;AAAA,UACZ,CAAC;AACD,gBAAM,QAAQ,KAAK,OAAO,KAAK,IAAI,SAAS,IAAI,KAAK,MAAM,IAAI,SAAS,IAAI,MAAM;AAClF,cAAI,UAAU;AACZ,qBAAS,KAAK;AAAA,cACZ,MAAM;AAAA,cACN;AAAA,cACA,MAAM;AAAA,cACN,OAAO,iBAAiB,YAAY,CAAC;AAAA,YACvC,CAAC;AAAA,UACH,OAAO;AACL,kBAAM,SAAS,IAAI,SAAS,KAAK,QAAQ,QAAQ,KAAK,GAAG,MAAM;AAC/D,qBAAS,KAAK;AAAA,cACZ,MAAM;AAAA,cACN,MAAM,GAAG,KAAK,GAAG,MAAM;AAAA,cACvB,OAAO,iBAAiB,YAAY,CAAC;AAAA,YACvC,CAAC;AAAA,UACH;AAAA,QACF;AACA;AAAA,MACF;AAAA,MACA,KAAK,kBAAkB;AACrB,cAAM,MAAM,IAAI,YAAY,IAAI,KAAK,WAAW,YAAY,CAAC;AAC7D,YAAI,QAAQ,QAAW;AACrB,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,MAAM,KAAK,OAAO,KAAK;AAAA,YACvB,OAAO,iBAAiB,YAAY,CAAC;AAAA,UACvC,CAAC;AACD;AAAA,QACF;AACA,cAAM,UAAU;AAAA,UACd;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,KAAK,IAAI;AAAA,cACT,KAAK,KAAK,OAAO;AAAA,cACjB,OAAO,IAAI,SAAS;AAAA,YACtB;AAAA,UACF;AAAA,UACA;AAAA,UACA,YAAY;AAAA,QACd;AACA,iBAAS,KAAK,GAAG,QAAQ,QAAQ;AACjC,sBAAc,KAAK,GAAG,QAAQ,aAAa;AAC3C;AAAA,MACF;AAAA,MACA,KAAK,qBAAqB;AACxB,cAAM,MAAM,IAAI,cAAc,QAAQ,KAAK,UAAU;AACrD,cAAM,IAAI,OAAO,IAAI,MAAM,IAAI;AAC/B,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,MAAM,IAAI,OAAO,CAAC,CAAC;AAAA,UACnB,OAAO,iBAAiB,YAAY,CAAC;AAAA,QACvC,CAAC;AACD;AAAA,MACF;AAAA,MACA,KAAK,cAAc;AACjB,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,MAAM,KAAK;AAAA,UACX,OAAO,iBAAiB,EAAE,GAAG,YAAY,GAAG,MAAM,KAAK,CAAC;AAAA,QAC1D,CAAC;AACD,YAAI,aAAa,IAAI;AAAA,UACnB,UAAU;AAAA,UACV,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,MAAM,IAAI;AAAA,QACZ,CAAC;AACD;AAAA,MACF;AAAA,MACA,SAAS;AACP,cAAM,OAAOA,UAAS,IAAI;AAC1B,YAAI,KAAK,SAAS,GAAG;AACnB,mBAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,OAAO,iBAAiB,YAAY,CAAC,EAAE,CAAC;AAAA,QAC9E;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,qBAAmB;AACnB,SAAO,EAAE,UAAU,aAAa,QAAQ,GAAG,cAAc;AAC3D;AAKO,SAAS,gBAAgB,OAA+C;AAC7E,SAAOA,UAAS,EAAE,MAAM,aAAa,UAAU,MAA2B,CAAC;AAC7E;AAEO,SAAS,iBAAiB,KAAsB;AACrD,MAAI,IAAI,WAAW,KAAK,IAAI,SAAS,qBAAqB;AACxD,WAAO;AAAA,EACT;AACA,MAAI,CAAC,YAAY,KAAK,GAAG,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,MACE,6FAA6F;AAAA,IAC3F;AAAA,EACF,GACA;AACA,WAAO;AAAA,EACT;AACA,SAAO,aAAa,KAAK,GAAG;AAC9B;AAKO,SAAS,qBACd,OACA,KACQ;AACR,MAAI,QAAQ;AACZ,aAAW,QAAQ,OAAO;AACxB,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK,SAAS;AACZ,YAAI,iBAAiB,KAAK,GAAG,GAAG;AAC9B,mBAAS;AAAA,QACX;AACA;AAAA,MACF;AAAA,MACA,KAAK,kBAAkB;AACrB,cAAM,MAAM,IAAI,YAAY,IAAI,KAAK,WAAW,YAAY,CAAC;AAC7D,YAAI,QAAQ,UAAa,iBAAiB,IAAI,GAAG,GAAG;AAClD,mBAAS;AAAA,QACX;AACA;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,UAAU;AACb,iBAAS,qBAAqB,KAAK,UAAU,GAAG;AAChD;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH;AAAA,MACF,SAAS;AAEP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,cAAc,OAAe,KAAmD;AAC9F,MAAI,MAAM,UAAU,KAAK;AACvB,WAAO,EAAE,MAAM,OAAO,WAAW,MAAM;AAAA,EACzC;AACA,SAAO,EAAE,MAAM,GAAG,mBAAmB,OAAO,KAAK,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,WAAW,KAAK;AAClG;AAGO,SAAS,kBAAkB,GAAiB,KAAoC;AACrF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,WAAW,EAAE;AAAA,IACb,UAAU,eAAe,EAAE,IAAI,SAAS,IAAI,EAAE,MAAM,SAAS,KAAK,UAAU;AAAA,IAC5E,OACE,EAAE,UAAU,UAAa,EAAE,MAAM,SAAS,IACtC,EAAE,MAAM,cAAc,MAAM,eAAe,EAAE,OAAO,KAAK,OAAO,EAAE,IAClE;AAAA,EACR;AACF;AAGO,SAAS,iBAAiB,MAAc,KAAwB,UAA0B;AAC/F,MAAI,KAAK,UAAU,wBAAwB;AACzC,WAAO;AAAA,EACT;AACA,MAAI,aAAa,IAAI;AAAA,IACnB;AAAA,IACA,MAAM,GAAG,OAAO,KAAK,MAAM,CAAC;AAAA,IAC5B,IAAI,GAAG,OAAO,sBAAsB,CAAC;AAAA,IACrC,QAAQ;AAAA,IACR,MAAM,IAAI;AAAA,EACZ,CAAC;AACD,SAAO,mBAAmB,MAAM,sBAAsB;AACxD;AAGO,SAAS,qBAAqB,MAAc,UAA6C;AAC9F,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC;AAAA,QAC/D,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,eACd,OACA,KACA,OACQ;AACR,MAAI,MAAM,UAAU,qBAAqB;AACvC,WAAO;AAAA,EACT;AACA,MAAI,aAAa,IAAI;AAAA,IACnB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,QAAQ,SAAS,KAAK,iBAAiB,OAAO,mBAAmB,CAAC;AAAA,IAClE,MAAM,IAAI;AAAA,EACZ,CAAC;AACD,SAAO,mBAAmB,OAAO,mBAAmB;AACtD;AAEA,SAAS,iBAAiB,OAAiD;AACzE,MACE,MAAM,SAAS,QACf,MAAM,WAAW,QACjB,MAAM,WAAW,QACjB,MAAM,SAAS,QACf,MAAM,cAAc,MACpB;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKA,IAAM,4BACJ;AACF,IAAM,gBAAgB;AACtB,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAC3B,IAAM,gBACJ;AACF,IAAM,gBAAgB;AAGtB,SAAS,mBAAmB,OAAe,OAAkD;AAC3F,QAAM,cAAc,cAAc,KAAK,KAAK;AAC5C,MAAI,cAAc,CAAC,MAAM,UAAa,YAAY,CAAC,MAAM,QAAW;AAClE,QAAI,CAAC,eAAe,YAAY,CAAC,CAAC,GAAG;AACnC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,YAAY,CAAC;AAAA,MAClB,MAAM,YAAY,CAAC;AAAA,MACnB,OAAO,iBAAiB,KAAK;AAAA,IAC/B;AAAA,EACF;AACA,QAAM,OAAO,cAAc,KAAK,KAAK;AACrC,MAAI,OAAO,CAAC,MAAM,QAAW;AAC3B,WAAO,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC,GAAG,OAAO,iBAAiB,KAAK,EAAE;AAAA,EAC1E;AACA,QAAM,UAAU,iBAAiB,KAAK,KAAK;AAC3C,MAAI,UAAU,CAAC,MAAM,QAAW;AAC9B,WAAO,EAAE,MAAM,WAAW,YAAY,QAAQ,CAAC,GAAG,OAAO,iBAAiB,KAAK,EAAE;AAAA,EACnF;AACA,QAAM,YAAY,mBAAmB,KAAK,KAAK;AAC/C,MAAI,YAAY,CAAC,MAAM,QAAW;AAChC,WAAO,EAAE,MAAM,aAAa,cAAc,UAAU,CAAC,GAAG,OAAO,iBAAiB,KAAK,EAAE;AAAA,EACzF;AACA,QAAM,YAAY,mBAAmB,KAAK,KAAK;AAC/C,MAAI,cAAc,MAAM;AACtB,UAAM,QAAQ,UAAU,CAAC;AACzB,QAAI,UAAU,UAAU,UAAU,aAAa,UAAU,YAAY;AACnE,aAAO,EAAE,MAAM,aAAa,OAAO,OAAO,iBAAiB,KAAK,EAAE;AAAA,IACpE;AAAA,EACF;AACA,QAAM,OAAO,cAAc,KAAK,KAAK;AACrC,MAAI,OAAO,CAAC,MAAM,UAAa,KAAK,CAAC,MAAM,QAAW;AACpD,UAAM,YAAY,OAAO,KAAK,CAAC,CAAC;AAChC,QAAI,OAAO,cAAc,SAAS,GAAG;AACnC,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,KAAK,CAAC;AAAA,QACd,KAAK,KAAK,CAAC;AAAA,QACX,UAAU,KAAK,CAAC;AAAA,QAChB,OAAO,iBAAiB,KAAK;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAOA,SAAS,iBACP,OACA,OACA,MAC8B;AAC9B,4BAA0B,YAAY;AACtC,MAAI,QAAgC,0BAA0B,KAAK,KAAK;AACxE,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,QAAM,MAAwB,CAAC;AAC/B,MAAI,OAAO;AACX,MAAI,YAAY;AAChB,SAAO,UAAU,MAAM;AACrB,UAAM,UAAU,mBAAmB,MAAM,CAAC,KAAK,IAAI,KAAK;AACxD,QAAI,YAAY,QAAW;AACzB,kBAAY;AACZ,UAAI,MAAM,QAAQ,MAAM;AACtB,YAAI,KAAK,GAAG,KAAK,MAAM,MAAM,MAAM,MAAM,KAAK,CAAC,CAAC;AAAA,MAClD;AACA,UAAI,KAAK,OAAO;AAChB,aAAO,MAAM,QAAQ,MAAM,CAAC,EAAE;AAAA,IAChC;AACA,YAAQ,0BAA0B,KAAK,KAAK;AAAA,EAC9C;AACA,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AACA,MAAI,OAAO,MAAM,QAAQ;AACvB,QAAI,KAAK,GAAG,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC;AAAA,EACrC;AACA,SAAO;AACT;AAMO,SAAS,2BACd,OACA,OAC2C;AAC3C,SAAO,iBAAiB,OAAO,OAAO,CAAC,UAAU,kBAAkB,OAAO,KAAK,CAAC;AAClF;AAMA,IAAM,aACJ;AAGK,SAAS,+BACd,OACA,KACS;AACT,QAAM,YAAY,IAAI,OAAO;AAC7B,MAAI,WAAW,gBAAgB,UAAa,WAAW,mBAAmB,QAAW;AACnF,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,gBAAgB,KAAK;AACnC,aAAW,YAAY;AACvB,SAAO,WAAW,KAAK,KAAK;AAC9B;AAEA,SAAS,6BACP,MACA,OACA,KACkB;AAGlB,QAAM,cAAc;AAAA,IAAiB,KAAK;AAAA,IAAO;AAAA,IAAO,CAAC,UACvD,qBAAqB,OAAO,OAAO,GAAG;AAAA,EACxC;AACA,MAAI,gBAAgB,QAAW;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,qBAAqB,KAAK,OAAO,OAAO,GAAG;AACpD;AAEA,SAAS,qBACP,OACA,OACA,KACkB;AAClB,QAAM,YAAY,IAAI,OAAO;AAC7B,QAAM,UAAU,WAAW,gBAAgB;AAC3C,QAAM,aAAa,WAAW,mBAAmB;AACjD,MAAI,CAAC,WAAW,CAAC,YAAY;AAC3B,WAAO,kBAAkB,OAAO,KAAK;AAAA,EACvC;AAEA,QAAM,MAAwB,CAAC;AAC/B,aAAW,YAAY;AACvB,MAAI,OAAO;AACX,MAAI,QAAgC,WAAW,KAAK,KAAK;AACzD,SAAO,UAAU,MAAM;AACrB,UAAM,QAAQ,MAAM;AACpB,QAAI,QAAQ,MAAM;AAChB,UAAI,KAAK,GAAG,kBAAkB,MAAM,MAAM,MAAM,KAAK,GAAG,KAAK,CAAC;AAAA,IAChE;AACA,UAAM,aAAa,MAAM,CAAC;AAC1B,UAAM,cAAc,MAAM,CAAC;AAC3B,QAAI,eAAe,UAAa,SAAS;AACvC,YAAM,SAAS,UAAU,cAAc,UAAU;AACjD,UAAI,WAAW,UAAa,OAAO,SAAS,GAAG;AAC7C,YAAI,KAAK,EAAE,MAAM,QAAQ,SAAS,QAAQ,OAAO,iBAAiB,KAAK,EAAE,CAAC;AAAA,MAC5E,OAAO;AACL,YAAI,KAAK,GAAG,kBAAkB,MAAM,CAAC,GAAG,KAAK,CAAC;AAAA,MAChD;AAAA,IACF,WAAW,gBAAgB,UAAa,YAAY;AAClD,YAAM,YAAY,UAAU,iBAAiB,WAAW;AACxD,UAAI,cAAc,UAAa,UAAU,SAAS,GAAG;AACnD,YAAI,KAAK,EAAE,MAAM,WAAW,YAAY,WAAW,OAAO,iBAAiB,KAAK,EAAE,CAAC;AAAA,MACrF,OAAO;AACL,YAAI,KAAK,GAAG,kBAAkB,MAAM,CAAC,GAAG,KAAK,CAAC;AAAA,MAChD;AAAA,IACF,OAAO;AACL,UAAI,KAAK,GAAG,kBAAkB,MAAM,CAAC,GAAG,KAAK,CAAC;AAAA,IAChD;AACA,WAAO,QAAQ,MAAM,CAAC,EAAE;AACxB,YAAQ,WAAW,KAAK,KAAK;AAAA,EAC/B;AACA,MAAI,OAAO,MAAM,QAAQ;AACvB,QAAI,KAAK,GAAG,kBAAkB,MAAM,MAAM,IAAI,GAAG,KAAK,CAAC;AAAA,EACzD;AACA,MAAI,IAAI,WAAW,GAAG;AACpB,QAAI,KAAK,GAAG,kBAAkB,OAAO,KAAK,CAAC;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAe,OAAwC;AAChF,QAAM,MAAwB,CAAC;AAC/B,qBAAmB,YAAY;AAC/B,MAAI,OAAO;AACX,MAAI,QAAgC,mBAAmB,KAAK,KAAK;AACjE,SAAO,UAAU,MAAM;AACrB,UAAM,QAAQ,MAAM;AACpB,QAAI,QAAQ,MAAM;AAChB,UAAI,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,MAAM,MAAM,KAAK,GAAG,OAAO,iBAAiB,KAAK,EAAE,CAAC;AAAA,IAC3F;AACA,UAAM,QAAuB,EAAE,MAAM,SAAS,MAAM,MAAM,CAAC,KAAK,GAAG;AACnE,QAAI,KAAK,KAAK;AACd,WAAO,QAAQ,MAAM,CAAC,EAAE;AACxB,YAAQ,mBAAmB,KAAK,KAAK;AAAA,EACvC;AACA,MAAI,OAAO,MAAM,QAAQ;AACvB,QAAI,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,MAAM,IAAI,GAAG,OAAO,iBAAiB,KAAK,EAAE,CAAC;AAAA,EACpF;AACA,MAAI,IAAI,WAAW,GAAG;AACpB,QAAI,KAAK,EAAE,MAAM,QAAQ,MAAM,OAAO,OAAO,iBAAiB,KAAK,EAAE,CAAC;AAAA,EACxE;AACA,SAAO;AACT;AAaA,SAAS,2BACP,MACA,GACA,OACkC;AAClC,QAAM,OAAO,KAAK,CAAC;AACnB,QAAM,WAAW,KAAK,IAAI,CAAC;AAC3B,QAAM,OAAO,KAAK,IAAI,CAAC;AACvB,MAAI,MAAM,SAAS,UAAU,CAAC,KAAK,MAAM,SAAS,GAAG,GAAG;AACtD,WAAO;AAAA,EACT;AACA,MAAI,UAAU,SAAS,UAAU,MAAM,SAAS,QAAQ;AACtD,WAAO;AAAA,EACT;AACA,QAAM,MAAM,SAAS;AACrB,QAAM,YAAY,IAAI,QAAQ,GAAG;AACjC,MAAI,aAAa,KAAK,CAAC,YAAY,KAAK,GAAG,GAAG;AAC5C,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB,SAAS,QAAQ,MAAM,KAAK;AAC9C,WAAO;AAAA,EACT;AACA,QAAM,aAAa,KAAK,MAAM,QAAQ,GAAG;AACzC,MAAI,eAAe,IAAI;AACrB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,IAAI,MAAM,GAAG,SAAS;AACtC,MAAI,CAAC,eAAe,OAAO,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,GAAG,IAAI,MAAM,YAAY,CAAC,CAAC,GAAG,KAAK,MAAM,MAAM,GAAG,UAAU,CAAC;AAC3E,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,aAAa,EAAE,MAAM,QAAQ,OAAO,KAAK,MAAM,MAAM,GAAG,EAAE,EAAE;AAAA,IAC5D,MAAM,EAAE,MAAM,QAAQ,KAAK,SAAS,MAAM,OAAO,OAAO,iBAAiB,KAAK,EAAE;AAAA,IAChF,cAAc,EAAE,MAAM,QAAQ,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC,EAAE;AAAA,EACxE;AACF;AAEA,SAAS,SAAS,MAAY,KAAwB,OAAwC;AAC5F,QAAM,MAAM,KAAK;AACjB,QAAM,OAAO,gBAAgB,KAAK,QAAQ;AAG1C,QAAM,YAAY,IAAI,QAAQ,GAAG;AACjC,MAAI,YAAY,KAAK,YAAY,KAAK,GAAG,KAAK,SAAS,KAAK;AAC1D,UAAM,UAAU,IAAI,MAAM,GAAG,SAAS;AACtC,UAAM,QAAQ,IAAI,MAAM,YAAY,CAAC;AACrC,QAAI,MAAM,SAAS,KAAK,eAAe,OAAO,GAAG;AAC/C,aAAO,CAAC,EAAE,MAAM,QAAQ,KAAK,SAAS,MAAM,OAAO,OAAO,iBAAiB,KAAK,EAAE,CAAC;AAAA,IACrF;AAAA,EACF;AACA,MAAI,CAAC,eAAe,GAAG,GAAG;AACxB,QAAI,aAAa,IAAI;AAAA,MACnB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,MAAM,IAAI;AAAA,IACZ,CAAC;AACD,UAAM,SAAS,IAAI,SAAS,KAAK,QAAQ,OAAO,KAAK,GAAG,MAAM;AAC9D,WAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,GAAG,IAAI,GAAG,MAAM,IAAI,OAAO,iBAAiB,KAAK,EAAE,CAAC;AAAA,EACpF;AACA,QAAM,OAAqB;AAAA,IACzB,MAAM;AAAA,IACN;AAAA,IACA,MAAM,KAAK,SAAS,IAAI,OAAO;AAAA,IAC/B,OAAO,iBAAiB,KAAK;AAAA,EAC/B;AACA,SAAO,CAAC,IAAI;AACd;AAEA,SAAS,kBACP,MACA,KACA,OACkB;AAClB,QAAM,MAAM,IAAI,YAAY,IAAI,KAAK,WAAW,YAAY,CAAC;AAC7D,MAAI,QAAQ,QAAW;AACrB,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM,gBAAgB,KAAK,QAAQ,KAAK,KAAK;AAAA,QAC7C,OAAO,iBAAiB,KAAK;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,KAAK,IAAI;AAAA,MACT,OAAO,IAAI,SAAS;AAAA,MACpB,UAAU,KAAK;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAOO,SAAS,eAAe,KAAsB;AACnD,MAAI,IAAI,WAAW,KAAK,IAAI,SAAS,qBAAqB;AACxD,WAAO;AAAA,EACT;AACA,SAAO,YAAY,KAAK,GAAG;AAC7B;AAWA,SAAS,aAAa,QAAoB,KAAwC;AAChF,QAAM,QAAQ,OAAO,UAAU,KAAK,EAAE;AACtC,MAAI,OAAO,OAAO;AAChB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,OAAO;AAAA,MACZ,MAAM,MAAM,SAAS,IAAI,QAAQ,OAAO;AAAA,MACxC,OAAO,iBAAiB,OAAO,KAAK;AAAA,IACtC;AAAA,EACF;AACA,MAAI,aAAa,IAAI;AAAA,IACnB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM,IAAI;AAAA,EACZ,CAAC;AACD,QAAM,OAAO,MAAM,SAAS,IAAI,QAAQ,OAAO;AAC/C,QAAM,SACJ,MAAM,SAAS,KAAK,OAAO,KAAK,SAAS,KAAK,OAAO,SAAS,QAAQ,KAAK,OAAO,IAAI,MAAM;AAC9F,SAAO,EAAE,MAAM,QAAQ,MAAM,GAAG,IAAI,GAAG,MAAM,IAAI,OAAO,iBAAiB,OAAO,KAAK,EAAE;AACzF;AAKA,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAE5B,SAAS,aAAa,MAAqB,KAA4B;AACrE,QAAM,IAAI,IAAI,YAAY;AAC1B,MAAI,MAAM,OAAO,MAAM,UAAU;AAC/B,WAAO,EAAE,GAAG,MAAM,MAAM,KAAK;AAAA,EAC/B;AACA,MAAI,MAAM,OAAO,MAAM,MAAM;AAC3B,WAAO,EAAE,GAAG,MAAM,QAAQ,KAAK;AAAA,EACjC;AACA,MAAI,MAAM,OAAO,MAAM,OAAO;AAC5B,WAAO,EAAE,GAAG,MAAM,QAAQ,KAAK;AAAA,EACjC;AACA,SAAO,EAAE,GAAG,MAAM,MAAM,KAAK;AAC/B;AAKA,IAAM,gBACJ;AAEF,SAAS,eACP,MACA,OACA,KACkB;AAClB,QAAM,MAAwB,CAAC;AAC/B,QAAM,QAAsD,CAAC;AAC7D,MAAI,UAAU;AACd,MAAI;AACJ,gBAAc,YAAY;AAC1B,MAAI,IAA4B,cAAc,KAAK,IAAI;AACvD,MAAI,kBAAkB;AACtB,SAAO,MAAM,MAAM;AACjB,UAAM,QAAQ,EAAE,CAAC;AACjB,QAAI,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,KAAK,EAAE,CAAC,MAAM,QAAW;AAEnE,wBAAkB;AAClB,UAAI,cAAc,KAAK,IAAI;AAC3B;AAAA,IACF;AACA,QAAI,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC,MAAM,QAAW;AAC/C,YAAM,OAAO,EAAE,CAAC,KAAK,IAAI,YAAY;AACrC,YAAM,UAAU,MAAM,WAAW,IAAI;AACrC,UAAI,QAAQ,MAAM;AAChB,YAAI,eAAe,QAAW;AAC5B,qBAAW,UAAU,KAAK,IAAI;AAAA,QAChC,OAAO;AACL,cAAI,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,OAAO,iBAAiB,OAAO,EAAE,CAAC;AAAA,QACzE;AAAA,MACF,WAAW,SAAS;AAClB,YAAI,QAAQ,OAAO,eAAe,QAAW;AAC3C,cAAI,KAAK,aAAa,YAAY,GAAG,CAAC;AACtC,uBAAa;AAAA,QACf;AACA,cAAM,IAAI;AACV,kBAAU,MAAM,SAAS,IAAK,MAAM,MAAM,SAAS,CAAC,GAAG,SAAS,QAAS;AAAA,MAC3E,WAAW,QAAQ,KAAK;AACtB,cAAM,YAAY,sCAAsC,KAAK,KAAK;AAClE,cAAM,OAAO,YAAY,CAAC;AAC1B,cAAM,KAAK,EAAE,KAAK,OAAO,QAAQ,CAAC;AAClC,YAAI,SAAS,QAAW;AAGtB,cAAI,eAAe,QAAW;AAC5B,gBAAI,KAAK,aAAa,YAAY,GAAG,CAAC;AAAA,UACxC;AACA,uBAAa,EAAE,MAAM,OAAO,SAAS,WAAW,CAAC,GAAG,OAAO,eAAe,IAAI,EAAE;AAAA,QAClF;AAAA,MACF,OAAO;AACL,cAAM,OAAO,EAAE,GAAG,QAAQ;AAC1B,YAAI,QAAQ,OAAO,QAAQ,SAAU,MAAK,OAAO;AACjD,YAAI,QAAQ,OAAO,QAAQ,KAAM,MAAK,SAAS;AAC/C,YAAI,QAAQ,OAAO,QAAQ,MAAO,MAAK,SAAS;AAChD,YAAI,QAAQ,OAAQ,MAAK,OAAO;AAChC,cAAM,KAAK,EAAE,KAAK,OAAO,KAAK,CAAC;AAC/B,kBAAU;AAAA,MACZ;AAAA,IACF,WAAW,MAAM,SAAS,GAAG;AAC3B,UAAI,eAAe,QAAW;AAC5B,mBAAW,UAAU,KAAK,KAAK;AAAA,MACjC,OAAO;AACL,YAAI,KAAK,EAAE,MAAM,QAAQ,MAAM,OAAO,OAAO,iBAAiB,OAAO,EAAE,CAAC;AAAA,MAC1E;AAAA,IACF;AACA,QAAI,cAAc,KAAK,IAAI;AAAA,EAC7B;AACA,MAAI,eAAe,QAAW;AAC5B,QAAI,KAAK,aAAa,YAAY,GAAG,CAAC;AAAA,EACxC;AACA,MAAI,iBAAiB;AACnB,QAAI,aAAa,IAAI;AAAA,MACnB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,MAAM,IAAI;AAAA,IACZ,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,aAAa,UAA2D;AAC/E,QAAM,MAAwB,CAAC;AAC/B,aAAW,MAAM,UAAU;AACzB,UAAM,OAAO,IAAI,IAAI,SAAS,CAAC;AAC/B,QACE,GAAG,SAAS,UACZ,SAAS,UACT,KAAK,SAAS,UACd,KAAK,UAAU,KAAK,KAAK,MAAM,KAAK,UAAU,GAAG,KAAK,GACtD;AACA,UAAI,IAAI,SAAS,CAAC,IAAI,EAAE,MAAM,QAAQ,MAAM,KAAK,OAAO,GAAG,MAAM,OAAO,KAAK,MAAM;AAAA,IACrF,OAAO;AACL,UAAI,KAAK,EAAE;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;;;AD97BA,IAAM,gBAAgB;AAEtB,IAAM,kBAAkB;AAAA,EACtB,MAAM,EAAE,OAAO,aAAM,OAAO,OAAO;AAAA,EACnC,KAAK,EAAE,OAAO,aAAM,OAAO,MAAM;AAAA,EACjC,WAAW,EAAE,OAAO,UAAK,OAAO,YAAY;AAAA,EAC5C,SAAS,EAAE,OAAO,gBAAM,OAAO,UAAU;AAAA,EACzC,SAAS,EAAE,OAAO,aAAM,OAAO,UAAU;AAC3C;AAKO,IAAM,oBAAN,MAA+C;AAAA,EACpD,MAAM,MAAmB,MAAkC;AACzD,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,KAAK,MAAmB,MAAmD;AACzE,UAAM,QAAQ;AACd,WAAO;AAAA,MACL;AAAA,QACE,QAAQ,EAAE,QAAQ,EAAE;AAAA,QACpB,MAAM,CAAC,QAAiD;AACtD,gBAAM,WAAW,aAAa,OAAO,GAAG;AACxC,gBAAM,QAAuB;AAAA,YAC3B,MAAM;AAAA,YACN,UAAU,CAAC,EAAE,MAAM,mBAAmB,UAAU,QAAQ,EAAE,CAAC;AAAA,UAC7D;AACA,iBAAO,CAAC,KAAK;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,aAAa,OAAmB,KAA0C;AACjF,QAAM,QAA0B,CAAC;AACjC,MAAI,QAAQ;AAEZ,aAAW,SAAS,MAAM,UAAU;AAClC,QAAI,MAAM,SAAS,aAAa;AAC9B,UAAI,WAAW,MAAM;AACrB,UAAI,SAAS,SAAS,CAAC,GAAG,SAAS,QAAQ;AACzC,cAAM,WAAW,SAAS,CAAC;AAC3B,cAAM,IAAI,cAAc,KAAK,SAAS,KAAK;AAC3C,YAAI,MAAM,MAAM;AACd,gBAAM,QAAQ,EAAE,CAAC,KAAK,QAAQ,YAAY;AAC1C,gBAAM,OAAO,gBAAgB,IAAI;AACjC,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,MAAM,GAAG,KAAK,KAAK,GAAG,KAAK,KAAK;AAAA;AAAA,YAChC,OAAO,EAAE,MAAM,KAAK;AAAA,UACtB,CAAC;AACD,gBAAM,OAAO,SAAS,MAAM,MAAM,EAAE,CAAC,EAAE,MAAM;AAC7C,qBAAW;AAAA,YACT,GAAI,KAAK,SAAS,IAAI,CAAC,EAAE,GAAG,UAAU,OAAO,KAAK,CAAC,IAAI,CAAC;AAAA,YACxD,GAAG,SAAS,MAAM,CAAC;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AACA,cAAQ;AACR,YAAM,SAAS,aAAa,UAAU,GAAG;AACzC,UAAI,MAAM,SAAS,KAAK,OAAO,SAAS,SAAS,GAAG;AAClD,cAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,MACzC;AACA,YAAM,KAAK,GAAG,OAAO,QAAQ;AAAA,IAC/B,WAAW,MAAM,SAAS,QAAQ;AAChC,UAAI,aAAa,IAAI;AAAA,QACnB,UAAU;AAAA,QACV,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,MAAM,IAAI;AAAA,MACZ,CAAC;AACD,UAAI,MAAM,SAAS,EAAG,OAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC;AAC7D,iBAAW,QAAQ,MAAM,UAAU;AACjC,cAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAKC,UAAS,IAAI,CAAC;AAAA,EAAK,CAAC;AAAA,MAC5D;AAAA,IACF,WAAW,MAAM,SAAS,QAAQ;AAChC,UAAI,aAAa,IAAI;AAAA,QACnB,UAAU;AAAA,QACV,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,MAAM,IAAI;AAAA,MACZ,CAAC;AACD,UAAI,MAAM,SAAS,EAAG,OAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC;AAC7D,YAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,OAAO,OAAO,EAAE,MAAM,KAAK,EAAE,CAAC;AAAA,IACvE,OAAO;AACL,UAAI,aAAa,IAAI;AAAA,QACnB,UAAU;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,MAAM,IAAI;AAAA,MACZ,CAAC;AACD,UAAI,MAAM,SAAS,EAAG,OAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC;AAC7D,YAAM,KAAK,EAAE,MAAM,QAAQ,MAAMA,UAAS,KAAK,EAAE,CAAC;AAAA,IACpD;AAAA,EACF;AAEA,SAAO,MAAM,SAAS,IAAI,QAAQ,CAAC,EAAE,MAAM,QAAQ,MAAM,IAAI,CAAC;AAChE;;;AEpGO,IAAM,mBAAN,MAA8C;AAAA,EACnD,MAAM,MAAmB,MAAkC;AACzD,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,KAAK,MAAmB,MAAmD;AACzE,UAAM,OAAO;AACb,UAAM,UAAU,KAAK,SAAS,QAAQ,KAAK,SAAS,UAAa,KAAK,KAAK,SAAS;AACpF,WAAO;AAAA,MACL;AAAA,QACE,UAAU,CAAC,sBAAsB;AAAA,QACjC,QAAQ,EAAE,QAAQ,EAAE;AAAA,QACpB,MAAM,MAA4B,CAAC,aAAa,MAAM,IAAI,CAAC;AAAA,MAC7D;AAAA,MACA;AAAA,QACE,QAAQ,EAAE,QAAQ,EAAE;AAAA,QACpB,MAAM,CAAC,YAAqD;AAC1D,cAAI,SAAS;AACX,oBAAQ,aAAa,IAAI;AAAA,cACvB,UAAU;AAAA,cACV,MAAM;AAAA,cACN,IAAI;AAAA,cACJ,QAAQ;AAAA,cACR,MAAM,QAAQ;AAAA,YAChB,CAAC;AAAA,UACH;AACA,iBAAO,CAAC,aAAa,MAAM,KAAK,CAAC;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,aAAa,MAAY,UAAkC;AAClE,QAAM,WACJ,YAAY,KAAK,SAAS,QAAQ,KAAK,SAAS,UAAa,KAAK,KAAK,SAAS,IAC5E,KAAK,KAAK,YAAY,IACtB;AACN,SAAO,qBAAqB,KAAK,OAAO,QAAQ;AAClD;;;ACjCO,IAAM,iBAAN,MAA4C;AAAA,EACjD,MAAM,MAAmB,MAAkC;AACzD,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,KAAK,MAAmB,KAAkD;AACxE,UAAM,UAAU;AAChB,UAAM,aAAa,qBAAqB,QAAQ,UAAU,GAAG;AAC7D,UAAM,YAAY,qBAAqB,SAAS,GAAG;AAEnD,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,QACL;AAAA,UACE,UAAU,CAAC,aAAa;AAAA,UACxB,QAAQ,EAAE,QAAQ,EAAE;AAAA,UACpB,MAAM,MAA4B;AAChC,mBAAO,gBAAgB,SAAS,IAAI;AAAA,UACtC;AAAA,QACF;AAAA,QACA;AAAA,UACE,QAAQ,EAAE,QAAQ,EAAE;AAAA,UACpB,MAAM,CAAC,YAAqD;AAC1D,oBAAQ,aAAa,IAAI;AAAA,cACvB,UAAU;AAAA,cACV,MAAM;AAAA,cACN,IAAI;AAAA,cACJ,QAAQ;AAAA,cACR,MAAM,QAAQ;AAAA,YAChB,CAAC;AACD,mBAAO,gBAAgB,SAAS,KAAK;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAA8B;AAAA,MAClC;AAAA,QACE,QAAQ,EAAE,QAAQ,IAAI,WAAW;AAAA,QACjC,MAAM,CAAC,YAAqD;AAC1D,iBAAO,gBAAgB,SAAS,SAAS,IAAI;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AACA,QAAI,aAAa,GAAG;AAClB,qBAAe,KAAK;AAAA,QAClB,QAAQ,EAAE,QAAQ,EAAE;AAAA,QACpB,MAAM,CAAC,YAAqD;AAC1D,kBAAQ,aAAa,IAAI;AAAA,YACvB,UAAU;AAAA,YACV,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,QAAQ;AAAA,YACR,MAAM,QAAQ;AAAA,UAChB,CAAC;AACD,iBAAO,gBAAgB,SAAS,SAAS,KAAK;AAAA,QAChD;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,SAAkB,KAAiC;AAC/E,MAAI,QAAQ,QAAQ,kBAAkB;AACpC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,gBAAgB,QAAQ,QAAQ;AAC9C,MAAI,MAAM,SAAS,uBAAuB;AACxC,WAAO;AAAA,EACT;AACA,MAAI,+BAA+B,QAAQ,UAAU,GAAG,GAAG;AACzD,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,SAAS;AAAA,IACtB,CAAC,MACC,EAAE,SAAS,UACX,EAAE,SAAS,gBACX,EAAE,SAAS,YACX,EAAE,SAAS,cACX,EAAE,SAAS,YACX,EAAE,SAAS,WACX,EAAE,SAAS,oBACX,EAAE,SAAS;AAAA,EACf;AACF;AAEA,SAAS,gBAAgB,SAAkB,WAA0C;AACnF,QAAM,QAAQ,gBAAgB,QAAQ,QAAQ;AAC9C,QAAM,QAAqB;AAAA,IACzB,MAAM;AAAA,IACN,MAAM,EAAE,MAAM,cAAc,MAAM,MAAM,SAAS,IAAI,QAAQ,IAAI;AAAA,IACjE,OAAO,YAAY,cAAc,QAAQ,KAAK,IAAI;AAAA,EACpD;AACA,SAAO,CAAC,KAAK;AACf;AAMA,SAAS,cAAc,OAA+C;AACpE,SAAO,UAAU,KAAK,UAAU,KAAK,UAAU,KAAK,UAAU,IAAI,QAAQ;AAC5E;AAEA,SAAS,gBACP,SACA,KACA,aACsB;AACtB,QAAM,QAAQ,gBAAgB,QAAQ,QAAQ;AAC9C,QAAM,QAAQ,QAAQ;AACtB,MAAI,QAAQ,kBAAkB;AAC5B,QAAI,aAAa,IAAI;AAAA,MACnB,UAAU;AAAA,MACV,MAAM,WAAW,OAAO,KAAK,CAAC;AAAA,MAC9B,IAAI;AAAA,MACJ,QAAQ,iBAAiB,OAAO,KAAK,CAAC,gBAAgB,OAAO,gBAAgB,CAAC;AAAA,MAC9E,MAAM,IAAI;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,MAAM,SAAS,uBAAuB;AAC/C,QAAI,aAAa,IAAI;AAAA,MACnB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,MAAM,IAAI;AAAA,IACZ,CAAC;AAAA,EACH,OAAO;AACL,QAAI,aAAa,IAAI;AAAA,MACnB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,QACE;AAAA,MACF,MAAM,IAAI;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,aAAa,QAAQ,UAAU,KAAK,EAAE,MAAM,KAAK,CAAC;AACjE,QAAM,OAAsB;AAAA,IAC1B,MAAM;AAAA,IACN,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,UACE,OAAO,SAAS,SAAS,IACrB,OAAO,WACP,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,OAAO,EAAE,MAAM,KAAK,EAAE,CAAC;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAkB,CAAC,IAAI;AAC7B,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AACA,aAAW,KAAK,OAAO,eAAe;AACpC,WAAO,KAAK,kBAAkB,GAAG,GAAG,CAAC;AAAA,EACvC;AACA,SAAO;AACT;;;ACvKA,IAAM,aACJ;AAKK,IAAM,mBAAN,MAA8C;AAAA,EACnD,MAAM,MAAmB,MAAkC;AACzD,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,KAAK,MAAmB,MAAmD;AACzE,UAAM,OAAO;AAGb,UAAM,UAAU,WAAW,KAAK,KAAK,KAAK;AAC1C,QAAI,YAAY,MAAM;AACpB,YAAM,QAAQ,UAAU,QAAQ,CAAC,KAAK,SAAS,EAAE,KAAK;AACtD,YAAM,OAAO,UAAU,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK;AAC9C,aAAO;AAAA,QACL;AAAA,UACE,UAAU,CAAC,gBAAgB;AAAA,UAC3B,QAAQ,EAAE,QAAQ,EAAE;AAAA,UACpB,MAAM,CAAC,QAAiD;AACtD,kBAAM,QAAsB;AAAA,cAC1B,MAAM;AAAA,cACN,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,MAAM,iBAAiB,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,mBAAmB;AAAA,cAC/E;AAAA,YACF;AACA,kBAAM,QAAwB;AAAA,cAC5B,MAAM;AAAA,cACN,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,MAAM,oBAAoB,MAAM,SAAS,IAAI,QAAQ,WAAW,GAAG;AAAA,cACrE;AAAA,cACA,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,sBAAsB;AAAA,cACrD,gBAAgB;AAAA,YAClB;AACA,mBAAO,CAAC,KAAK;AAAA,UACf;AAAA,QACF;AAAA,QACA;AAAA,UACE,QAAQ,EAAE,QAAQ,EAAE;AAAA,UACpB,MAAM,CAAC,QAAiD;AACtD,gBAAI,aAAa,IAAI;AAAA,cACnB,UAAU;AAAA,cACV,MAAM;AAAA,cACN,IAAI;AAAA,cACJ,QAAQ;AAAA,cACR,MAAM,IAAI;AAAA,YACZ,CAAC;AACD,mBAAO;AAAA,cACL;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,kBACJ,MAAM;AAAA,kBACN,MAAM,iBAAiB,IAAI,KAAK;AAAA,EAAM,IAAI,IAAI,KAAK,sBAAsB;AAAA,gBAC3E;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAIA,UAAM,gBAAgB,2BAA2B,KAAK,MAAM,KAAK,GAAG,CAAC,CAAC;AACtE,QAAI,kBAAkB,QAAW;AAC/B,aAAO;AAAA,QACL;AAAA,UACE,QAAQ,EAAE,QAAQ,EAAE;AAAA,UACpB,MAAM,MAA4B;AAAA,YAChC;AAAA,cACE,MAAM;AAAA,cACN,UAAU,CAAC,EAAE,MAAM,qBAAqB,UAAU,cAAc,CAAC;AAAA,YACnE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,QACE,QAAQ,EAAE,QAAQ,EAAE;AAAA,QACpB,MAAM,CAAC,QAAiD;AACtD,cAAI,aAAa,IAAI;AAAA,YACnB,UAAU;AAAA,YACV,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,QAAQ;AAAA,YACR,MAAM,IAAI;AAAA,UACZ,CAAC;AACD,gBAAM,OAAO,UAAU,KAAK,KAAK,EAAE,KAAK;AACxC,cAAI,KAAK,WAAW,GAAG;AACrB,mBAAO,CAAC;AAAA,UACV;AACA,iBAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,MAAM,EAAE,MAAM,UAAU,MAAM,iBAAiB,MAAM,KAAK,cAAc,EAAE;AAAA,YAC5E;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,KAAK,QAAQ,kBAAkB,EAAE;AAC1C;AAEA,SAAS,oBAAoB,MAAc,KAAgC;AACzE,MAAI,KAAK,UAAU,2BAA2B;AAC5C,WAAO;AAAA,EACT;AACA,MAAI,aAAa,IAAI;AAAA,IACnB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,QAAQ,gCAAgC,OAAO,yBAAyB,CAAC;AAAA,IACzE,MAAM,IAAI;AAAA,EACZ,CAAC;AACD,SAAO,mBAAmB,MAAM,yBAAyB;AAC3D;;;ACxIA,SAAS,YAAAC,iBAAgB;AAiBlB,IAAM,cAAN,MAAyC;AAAA,EAC9C,MAAM,MAAmB,MAAkC;AACzD,QAAI,KAAK,SAAS,QAAQ;AACxB,aAAO;AAAA,IACT;AACA,WAAO,CAAC,WAAW,IAAI;AAAA,EACzB;AAAA,EAEA,KAAK,MAAmB,KAAkD;AACxE,UAAM,OAAO;AACb,UAAM,aAAa,2BAA2B,MAAM,GAAG;AACvD,UAAM,aAA0B;AAAA,MAC9B;AAAA,QACE,QAAQ,EAAE,QAAQ,IAAI,WAAW;AAAA,QACjC,MAAM,CAAC,YAAqD;AAC1D,iBAAO,eAAe,MAAM,SAAS,IAAI;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AACA,QAAI,aAAa,GAAG;AAClB,iBAAW,KAAK;AAAA,QACd,QAAQ,EAAE,QAAQ,EAAE;AAAA,QACpB,MAAM,CAAC,YAAqD;AAC1D,kBAAQ,aAAa,IAAI;AAAA,YACvB,UAAU;AAAA,YACV,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,QAAQ;AAAA,YACR,MAAM,QAAQ;AAAA,UAChB,CAAC;AACD,iBAAO,eAAe,MAAM,SAAS,KAAK;AAAA,QAC5C;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eACP,MACA,SACA,aACsB;AACtB,QAAM,EAAE,UAAU,cAAc,IAAI,aAAa,MAAM,GAAG,OAAO;AACjE,QAAM,QAAuB,EAAE,MAAM,aAAa,SAAS;AAC3D,QAAM,SAAkB,CAAC,KAAK;AAC9B,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AACA,aAAW,KAAK,eAAe;AAC7B,WAAO,KAAK,kBAAkB,GAAG,OAAO,CAAC;AAAA,EAC3C;AACA,SAAO;AACT;AAEO,SAAS,WAAW,MAAqB;AAC9C,SAAO,KAAK,SAAS,KAAK,CAAC,SAAS,KAAK,YAAY,QAAQ,KAAK,YAAY,KAAK;AACrF;AAEA,SAAS,2BAA2B,MAAY,KAAgC;AAC9E,MAAI,QAAQ;AACZ,aAAW,QAAQ,KAAK,UAAU;AAChC,aAAS,qBAAqB,wBAAwB,IAAI,GAAG,GAAG;AAChE,eAAW,SAAS,KAAK,UAAU;AACjC,UAAI,MAAM,SAAS,QAAQ;AACzB,iBAAS,2BAA2B,OAAO,GAAG;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aACP,MACA,QACA,KACkE;AAClE,MAAI,kBAAkB;AACtB,MAAI,kBAAkB,2BAA2B;AAC/C,QAAI,aAAa,IAAI;AAAA,MACnB,UAAU;AAAA,MACV,MAAM,UAAU,OAAO,eAAe,CAAC;AAAA,MACvC,IAAI,UAAU,OAAO,yBAAyB,CAAC;AAAA,MAC/C,QAAQ;AAAA,MACR,MAAM,IAAI;AAAA,IACZ,CAAC;AACD,sBAAkB;AAAA,EACpB;AAEA,QAAM,UAAU,KAAK,YAAY;AACjC,QAAM,cACJ,WAAW,KAAK,UAAU,QAAQ,KAAK,UAAU,UAAa,KAAK,QAAQ,IACvE,KAAK,QAAQ,IACb;AAON,QAAM,MAAsB,CAAC;AAC7B,QAAM,gBAAgC,CAAC;AACvC,MAAI,kBAAqC,CAAC;AAE1C,QAAM,QAAQ,CAAC,cAA4B;AACzC,QAAI,gBAAgB,WAAW,GAAG;AAChC;AAAA,IACF;AACA,UAAM,kBAAkB,YAAY,gBAAgB,SAAS;AAC7D,UAAM,SAAS,cAAc;AAC7B,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,OAAO,UAAU,YAAY;AAAA,MAC7B,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ,WAAW,SAAS,IAAI,SAAS;AAAA,IAC3C,CAAC;AACD,sBAAkB,CAAC;AAAA,EACrB;AAEA,aAAW,CAAC,OAAO,IAAI,KAAK,KAAK,SAAS,QAAQ,GAAG;AACnD,UAAM,EAAE,SAAS,YAAY,eAAe,WAAW,IAAI,aAAa,MAAM,GAAG;AACjF,oBAAgB,KAAK,OAAO;AAC5B,kBAAc,KAAK,GAAG,UAAU;AAChC,QAAI,WAAW,WAAW,GAAG;AAC3B;AAAA,IACF;AACA,UAAM,KAAK;AACX,eAAW,SAAS,YAAY;AAC9B,YAAM,eAAe,aAAa,OAAO,kBAAkB,GAAG,GAAG;AACjE,UAAI,KAAK,GAAG,aAAa,QAAQ;AACjC,oBAAc,KAAK,GAAG,aAAa,aAAa;AAAA,IAClD;AAAA,EACF;AACA,QAAM,KAAK,SAAS,SAAS,CAAC;AAE9B,MAAI,IAAI,WAAW,GAAG;AACpB,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,OAAO,UAAU,YAAY;AAAA,MAC7B,UAAU,CAAC,EAAE,MAAM,qBAAqB,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,IAAI,CAAC,EAAE,CAAC;AAAA,MACjF,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,UAAU,KAAK,cAAc;AACxC;AAGA,SAAS,wBAAwB,MAAmC;AAClE,QAAM,WAA8B,CAAC;AACrC,MAAI,WAAW;AAEf,aAAW,SAAS,KAAK,UAAU;AACjC,QAAI,MAAM,SAAS,aAAa;AAC9B,UAAI,UAAU;AACZ,iBAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,KAAK,CAAC;AAAA,MAC7C;AACA,eAAS,KAAK,GAAG,MAAM,QAAQ;AAC/B,iBAAW;AAAA,IACb,WAAW,MAAM,SAAS,QAAQ;AAChC,iBAAW;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aACP,MACA,KACiF;AACjF,QAAM,WAA8B,CAAC;AACrC,QAAM,aAAqB,CAAC;AAC5B,MAAI,WAAW;AAEf,aAAW,SAAS,KAAK,UAAU;AACjC,QAAI,MAAM,SAAS,aAAa;AAC9B,UAAI,UAAU;AACZ,iBAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,KAAK,CAAC;AAAA,MAC7C;AACA,eAAS,KAAK,GAAG,MAAM,QAAQ;AAC/B,iBAAW;AAAA,IACb,WAAW,MAAM,SAAS,QAAQ;AAChC,iBAAW,KAAK,KAAK;AAAA,IACvB,OAAO;AACL,UAAI,aAAa,IAAI;AAAA,QACnB,UAAU;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,MAAM,IAAI;AAAA,MACZ,CAAC;AACD,YAAM,OAAOC,UAAS,KAAK;AAC3B,UAAI,KAAK,SAAS,GAAG;AACnB,iBAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,KAAK,CAAC;AAAA,MAC7C;AACA,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,SAAS,aAAa,UAAU,GAAG;AACzC,SAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAM;AAAA,MACN,UAAU,OAAO,SAAS,SAAS,IAAI,OAAO,WAAW,CAAC,EAAE,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,IACvF;AAAA,IACA;AAAA,IACA,eAAe,CAAC,GAAG,OAAO,aAAa;AAAA,EACzC;AACF;;;ACzNO,IAAM,mBAAN,MAA8C;AAAA,EACnD,MAAM,MAAmB,MAAkC;AACzD,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,KAAK,MAAmB,MAAmD;AACzE,UAAM,QAAQ,WAAW,QAAQ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAC/E,WAAO;AAAA,MACL;AAAA,QACE,UAAU,CAAC,sBAAsB;AAAA,QACjC,QAAQ,EAAE,QAAQ,EAAE;AAAA,QACpB,MAAM,CAAC,QAAiD;AACtD,iBAAO,CAAC,iBAAiB,OAAO,MAAM,GAAG,CAAC;AAAA,QAC5C;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ,EAAE,QAAQ,EAAE;AAAA,QACpB,MAAM,CAAC,QAAiD;AACtD,cAAI,aAAa,IAAI;AAAA,YACnB,UAAU;AAAA,YACV,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,QAAQ;AAAA,YACR,MAAM,IAAI;AAAA,UACZ,CAAC;AACD,iBAAO,CAAC,iBAAiB,OAAO,OAAO,GAAG,CAAC;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,OAAe,UAAmB,KAAuC;AACjG,MAAI,aAAa,IAAI;AAAA,IACnB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM,IAAI;AAAA,EACZ,CAAC;AACD,SAAO,qBAAqB,OAAO,WAAW,UAAU,MAAS;AACnE;;;ACnBO,IAAM,sBAAN,MAAiD;AAAA,EACrC;AAAA,EACA;AAAA,EAEjB,YAAY,MAA+B;AACzC,SAAK,YAAY,KAAK;AACtB,SAAK,WAAW,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,MAAmB,MAAkC;AACzD,WAAO,KAAK,SAAS,WAAW,KAAK,QAAQ,IAAI,YAAY,MAAM;AAAA,EACrE;AAAA,EAEA,KAAK,MAAmB,KAAkD;AACxE,UAAM,OAAO;AACb,UAAM,SAAS,KAAK;AACpB,UAAM,OAAO,kBAAkB,MAAM;AACrC,UAAM,aAA0B,CAAC;AAIjC,UAAM,WAAW,IAAI,iBAAiB,IAAI,8BAA8B,CAAC;AAEzE,QAAI,SAAS,OAAO;AAClB,YAAM,SAAS,KAAK,UAAU,MAAM,MAAM;AAC1C,UAAI,OAAO,MAAM,OAAO,MAAM,SAAS,OAAO;AAC5C,cAAM,QAAQ,YAAY,OAAO,OAAO,QAAQ;AAChD,YAAI,UAAU,QAAW;AACvB,gBAAM,MAAM,OAAO;AACnB,qBAAW,KAAK;AAAA,YACd,UAAU,CAAC,mBAAmB;AAAA,YAC9B,QAAQ,EAAE,QAAQ,GAAG,OAAO,KAAK;AAAA,YACjC,MAAM,CAAC,YAAqD;AAC1D,oBAAM,QAAQ,YAAY,KAAK,OAAO;AACtC,qBAAO,UAAU,SAAY,CAAC,KAAK,IAAI,CAAC;AAAA,YAC1C;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,WAAW,SAAS,gBAAgB;AAClC,YAAM,SAAS,KAAK,SAAS,MAAM,MAAM;AACzC,UAAI,OAAO,MAAM,OAAO,MAAM,SAAS,gBAAgB;AACrD,cAAM,QAAQ,WAAW,OAAO,OAAO,QAAQ;AAC/C,YAAI,UAAU,QAAW;AACvB,gBAAM,MAAM,OAAO;AACnB,qBAAW,KAAK;AAAA,YACd,UAAU,CAAC,mBAAmB;AAAA,YAC9B,QAAQ,EAAE,QAAQ,GAAG,OAAO,KAAK;AAAA,YACjC,MAAM,CAAC,YAAqD;AAC1D,oBAAM,QAAQ,WAAW,KAAK,OAAO;AACrC,qBAAO,UAAU,SAAY,CAAC,KAAK,IAAI,CAAC;AAAA,YAC1C;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,eAAW,KAAK;AAAA,MACd,QAAQ,EAAE,QAAQ,EAAE;AAAA,MACpB,MAAM,OAAO,YAA8D;AACzE,cAAM,WAAW,MAAM,aAAa,QAAQ,OAAO;AACnD,YAAI,aAAa,QAAW;AAC1B,iBAAO,CAAC,QAAQ;AAAA,QAClB;AACA,gBAAQ,aAAa,IAAI;AAAA,UACvB,UAAU;AAAA,UACV,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,MAAM,QAAQ;AAAA,QAChB,CAAC;AACD,eAAO,CAAC,oBAAoB,QAAQ,OAAO,CAAC;AAAA,MAC9C;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,QAAkD;AAC3E,QAAM,QAAQ,OACX,MAAM,OAAO,EACb,IAAI,CAAC,MAAM,EAAE,QAAQ,kBAAkB,EAAE,EAAE,KAAK,CAAC,EACjD,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;AAC3B,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,KAAK,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AACA,MAAI,mBAAmB,KAAK,KAAK,GAAG;AAClC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,YACP,KACA,KACoC;AACpC,MAAI,IAAI,SAAS,SAAS,oBAAoB;AAC5C,QAAI,aAAa,IAAI;AAAA,MACnB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,QAAQ,WAAW,OAAO,IAAI,SAAS,MAAM,CAAC,kBAAkB,OAAO,kBAAkB,CAAC;AAAA,MAC1F,MAAM,IAAI;AAAA,IACZ,CAAC;AACD,WAAO;AAAA,EACT;AACA,QAAM,WAAW,IAAI,SAAS,IAAI,CAAC,MAAM;AACvC,UAAM,IAAI,cAAc,EAAE,OAAO,qBAAqB;AACtD,QAAI,EAAE,WAAW;AACf,UAAI,aAAa,IAAI;AAAA,QACnB,UAAU;AAAA,QACV,MAAM,EAAE;AAAA,QACR,IAAI,EAAE;AAAA,QACN,QAAQ;AAAA,QACR,MAAM,IAAI;AAAA,MACZ,CAAC;AAAA,IACH;AACA,WAAO,EAAE,OAAO,EAAE,MAAM,OAAO,EAAE,MAAM;AAAA,EACzC,CAAC;AACD,QAAM,WACJ,IAAI,UACH,IAAI,qBAAqB,UAAa,IAAI,iBAAiB,SAAS,IACjE,IAAI,mBACJ;AACN,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,mBAAmB,UAAU,KAAK,kBAAkB;AAAA,IAC3D,OAAO,EAAE,MAAM,OAAO,SAAS;AAAA,EACjC;AACF;AAEA,SAAS,WACP,KACA,KACoC;AACpC,QAAM,aAAa,IAAI,WAAW,IAAI,CAAC,MAAM;AAC3C,UAAM,IAAI,cAAc,GAAG,qBAAqB;AAChD,QAAI,EAAE,WAAW;AACf,UAAI,aAAa,IAAI;AAAA,QACnB,UAAU;AAAA,QACV,MAAM;AAAA,QACN,IAAI,EAAE;AAAA,QACN,QAAQ;AAAA,QACR,MAAM,IAAI;AAAA,MACZ,CAAC;AAAA,IACH;AACA,WAAO,EAAE;AAAA,EACX,CAAC;AAED,MAAI,WAAW,SAAS,kBAAkB;AACxC,QAAI,aAAa,IAAI;AAAA,MACnB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,QAAQ,eAAe,OAAO,WAAW,MAAM,CAAC,gBAAgB,OAAO,gBAAgB,CAAC;AAAA,MACxF,MAAM,IAAI;AAAA,IACZ,CAAC;AACD,WAAO;AAAA,EACT;AAEA,MAAI,YAA4B;AAChC,MAAI,eAAe,IAAI;AACvB,MAAI,IAAI,KAAK,SAAS,KAAK,IAAI,MAAM,SAAS,GAAG;AAC/C,QAAI,aAAa,IAAI;AAAA,MACnB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,MAAM,IAAI;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,IAAI,KAAK,WAAW,GAAG;AAChC,gBAAY;AACZ,mBAAe,IAAI;AAAA,EACrB;AAEA,MAAI,aAAa,WAAW,KAAK,aAAa,SAAS,kBAAkB;AACvE,QAAI,aAAa,IAAI;AAAA,MACnB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,QAAQ,yBAAyB,OAAO,aAAa,MAAM,CAAC;AAAA,MAC5D,MAAM,IAAI;AAAA,IACZ,CAAC;AACD,WAAO;AAAA,EACT;AAEA,aAAW,CAAC,GAAG,MAAM,KAAK,aAAa,QAAQ,GAAG;AAChD,QAAI,OAAO,WAAW,WAAW,QAAQ;AACvC,UAAI,aAAa,IAAI;AAAA,QACnB,UAAU;AAAA,QACV,MAAM,UAAU,OAAO,CAAC,CAAC,YAAY,OAAO,OAAO,MAAM,CAAC;AAAA,QAC1D,IAAI,qBAAqB,OAAO,WAAW,MAAM,CAAC;AAAA,QAClD,QAAQ;AAAA,QACR,MAAM,IAAI;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,SAAS,aAAa,IAAI,CAAC,QAAQ,OAAO;AAAA,IAC9C,MAAM,cAAc,UAAU,OAAO,IAAI,CAAC,CAAC,IAAI,qBAAqB,EAAE;AAAA,IACtE,MAAM,WAAW,IAAI,CAAC,OAAO,SAAS;AAAA,MACpC;AAAA,MACA,OAAO,OAAO,GAAG,KAAK;AAAA,IACxB,EAAE;AAAA,EACJ,EAAE;AAEF,QAAM,WACJ,IAAI,UACH,IAAI,qBAAqB,UAAa,IAAI,iBAAiB,SAAS,IACjE,IAAI,mBACJ;AAEN,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,mBAAmB,UAAU,KAAK,sBAAsB;AAAA,IAC/D,OAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,aAAa;AAAA,QACX;AAAA,QACA,SACE,IAAI,WAAW,SACX,mBAAmB,IAAI,QAAQ,KAAK,sBAAsB,IAC1D;AAAA,QACN,SACE,IAAI,WAAW,SACX,mBAAmB,IAAI,QAAQ,KAAK,sBAAsB,IAC1D;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,KAAa,KAAwB,UAA0B;AACzF,QAAM,IAAI,cAAc,KAAK,qBAAqB;AAClD,MAAI,EAAE,WAAW;AACf,QAAI,aAAa,IAAI;AAAA,MACnB;AAAA,MACA,MAAM;AAAA,MACN,IAAI,EAAE;AAAA,MACN,QAAQ,4BAA4B,OAAO,qBAAqB,CAAC;AAAA,MACjE,MAAM,IAAI;AAAA,IACZ,CAAC;AAAA,EACH;AACA,SAAO,EAAE;AACX;AAEA,eAAe,aACb,QACA,KACiC;AACjC,QAAM,MAAqB;AAAA,IACzB,MAAM;AAAA,IACN;AAAA,IACA,SAAS;AAAA,EACX;AACA,aAAW,YAAY,IAAI,OAAO,WAAW;AAC3C,QAAI,CAAC,SAAS,UAAU,GAAG,GAAG;AAC5B;AAAA,IACF;AAIA,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,SAAS,OAAO,GAAG;AAAA,IACpC,SAAS,KAAK;AACZ,UAAI,aAAa,IAAI;AAAA,QACnB,UAAU;AAAA,QACV,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,QAAQ,oBAAoB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAC5E,MAAM,IAAI;AAAA,MACZ,CAAC;AACD;AAAA,IACF;AACA,QAAI,WAAW,MAAM;AACnB;AAAA,IACF;AACA,QAAI,OAAO,SAAS,OAAO;AACzB,UAAI,OAAO,SAAS,SAAS,qBAAqB;AAChD,YAAI,aAAa,IAAI;AAAA,UACnB,UAAU;AAAA,UACV,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,MAAM,IAAI;AAAA,QACZ,CAAC;AACD;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,OAAO;AAAA,QAClB,UAAU,eAAe,OAAO,SAAS,KAAK,UAAU;AAAA,MAC1D;AAAA,IACF;AACA,UAAM,WAAsC,IAAI,OAAO;AACvD,QAAI,aAAa,QAAW;AAC1B,UAAI,aAAa,IAAI;AAAA,QACnB,UAAU;AAAA,QACV,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,MAAM,IAAI;AAAA,MACZ,CAAC;AACD;AAAA,IACF;AACA,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,SAAS,OAAO,MAAM;AAAA,IACzC,SAAS,KAAK;AACZ,UAAI,aAAa,IAAI;AAAA,QACnB,UAAU;AAAA,QACV,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,QAAQ,wBAAwB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAChF,MAAM,IAAI;AAAA,MACZ,CAAC;AACD;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,eAAe,OAAO,SAAS,KAAK,UAAU;AAAA,MACxD,YAAY,EAAE,IAAI,SAAS,OAAO;AAAA,IACpC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,QAAgB,KAAuC;AAClF,QAAM,WAAW,IAAI,OAAO,aAAa;AACzC,MAAI,CAAC,UAAU;AACb,QAAI,aAAa,IAAI;AAAA,MACnB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,MAAM,IAAI;AAAA,IACZ,CAAC;AAAA,EACH;AACA,SAAO,qBAAqB,QAAQ,WAAW,YAAY,MAAS;AACtE;;;ACtWO,IAAM,mBAAN,MAA8C;AAAA,EACnD,MAAM,MAAmB,MAAkC;AACzD,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,KAAK,MAAmB,KAAkD;AACxE,UAAM,YAAY;AAClB,UAAM,YACJ,UAAU,SAAS,WAAW,KAAK,UAAU,SAAS,CAAC,GAAG,SAAS,UAC/D,UAAU,SAAS,CAAC,IACpB;AACN,UAAM,aAAa,cAAc,SAAY,IAAI,qBAAqB,UAAU,UAAU,GAAG;AAE7F,UAAM,aAA0B;AAAA,MAC9B;AAAA,QACE,QAAQ,EAAE,QAAQ,IAAI,WAAW;AAAA,QACjC,MAAM,CAAC,YAAqD;AAC1D,iBAAO,cAAc,WAAW,SAAS,WAAW,IAAI;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AACA,QAAI,aAAa,GAAG;AAClB,iBAAW,KAAK;AAAA,QACd,QAAQ,EAAE,QAAQ,EAAE;AAAA,QACpB,MAAM,CAAC,YAAqD;AAC1D,kBAAQ,aAAa,IAAI;AAAA,YACvB,UAAU;AAAA,YACV,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,QAAQ;AAAA,YACR,MAAM,QAAQ;AAAA,UAChB,CAAC;AACD,iBAAO,cAAc,WAAW,SAAS,WAAW,KAAK;AAAA,QAC3D;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cACP,WACA,SACA,WACA,aACsB;AAEtB,MAAI,cAAc,UAAa,UAAU,SAAS,SAAS;AACzD,UAAM,MAAM;AACZ,QAAI,iBAAiB,IAAI,GAAG,GAAG;AAC7B,YAAM,SAAS,IAAI,OAAO;AAC1B,YAAMC,OAAM,eAAe,OAAO,SAAS,IAAI,SAAS,SAAS,SAAS,UAAU;AACpF,YAAM,QAAoB;AAAA,QACxB,MAAM;AAAA,QACN,WAAW,IAAI;AAAA,QACf,UAAUA;AAAA,QACV,OACE,IAAI,UAAU,QAAQ,IAAI,UAAU,UAAa,IAAI,MAAM,SAAS,IAChE;AAAA,UACE,MAAM;AAAA,UACN,MAAM,eAAe,IAAI,OAAO,SAAS,OAAO;AAAA,QAClD,IACA;AAAA,MACR;AACA,aAAO,CAAC,KAAK;AAAA,IACf;AAIA,UAAM,WAAW,eAAe,IAAI,GAAG;AACvC,YAAQ,aAAa,IAAI;AAAA,MACvB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,IAAI,WAAW,iBAAiB;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,QAAQ;AAAA,IAChB,CAAC;AACD,UAAM,MAAM,IAAI,OAAO;AACvB,UAAM,QAAQ,IAAI,SAAS,IAAI,MAAM,IAAI,IAAI,SAAS,IAAI,IAAI,MAAM;AACpE,UAAM,eAAe,WACjB,IAAI,IAAI,GAAG,IAAI,KAAK,MACpB,IAAI,IAAI,SAAS,KAAK,IAAI,QAAQ,QAChC,GAAG,KAAK,KAAK,IAAI,GAAG,MACpB;AACN,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM,iBAAiB,cAAc,SAAS,SAAS;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,aAAa,UAAU,UAAU,OAAO;AACvD,QAAM,SAAkB,CAAC;AACzB,QAAM,OAAsB;AAAA,IAC1B,MAAM;AAAA,IACN,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,UAAU,OAAO,SAAS,SAAS,IAAI,OAAO,WAAW,CAAC,EAAE,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AACA,SAAO,KAAK,IAAI;AAChB,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AACA,aAAW,KAAK,OAAO,eAAe;AACpC,WAAO,KAAK,kBAAkB,GAAG,OAAO,CAAC;AAAA,EAC3C;AACA,SAAO;AACT;;;AC3HO,IAAM,cAAN,MAAyC;AAAA,EAC9C,MAAM,MAAmB,MAAkC;AACzD,UAAM,IAAI,KAAK;AACf,WAAO,MAAM,gBAAgB,MAAM,UAAU,MAAM,UAAU,MAAM;AAAA,EACrE;AAAA,EAEA,KAAK,MAAmB,MAAmD;AACzE,WAAO;AAAA,MACL;AAAA,QACE,MAAM,CAAC,QAAiD;AACtD,gBAAM,IAAI,KAAK;AACf,cAAI,MAAM,UAAU,MAAM,QAAQ;AAChC,gBAAI,aAAa,IAAI;AAAA,cACnB,UAAU;AAAA,cACV,MAAM;AAAA,cACN,IAAI;AAAA,cACJ,QAAQ;AAAA,cACR,MAAM,IAAI;AAAA,YACZ,CAAC;AAAA,UACH;AACA,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AClCA,SAAS,YAAAC,iBAAgB;AA2BlB,IAAM,eAAN,MAA0C;AAAA,EAC/C,MAAM,MAAmB,MAAkC;AACzD,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,KAAK,MAAmB,KAAkD;AACxE,UAAM,QAAQ,mBAAmB,MAAe,GAAG;AACnD,UAAM,WAAW,MAAM,SAAS;AAChC,UAAM,WAAW,MAAM,SAAS,CAAC,GAAG,SAAS,UAAU;AAEvD,QAAI,WAAW,gBAAgB;AAC7B,YAAM,YAAY,sBAAsB,OAAO,KAAK,OAAO;AAC3D,aAAO,kBAAkB,OAAO,WAAW,0BAA0B;AAAA,IACvE;AAEA,QAAI,YAAY,0BAA0B;AAExC,YAAM,YAAY,sBAAsB,OAAO,KAAK,OAAO;AAC3D,aAAO;AAAA,QACL;AAAA,UACE,UAAU,CAAC,YAAY;AAAA,UACvB,QAAQ,EAAE,QAAQ,GAAG,YAAY,UAAU;AAAA,UAC3C,MAAM,CAACC,SAAiD;AACtD,mBAAO,CAAC,gBAAgB,OAAOA,IAAG,CAAC;AAAA,UACrC;AAAA,QACF;AAAA,QACA,GAAG,kBAAkB,OAAO,WAAW,uCAAuC;AAAA,MAChF;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,IAAI,GAAG,WAAW,CAAC;AACzC,QAAI,YAAY,0BAA0B;AACxC,YAAM,iBAAiB,aAAa,OAAO,wBAAwB;AACnE,YAAM,iBAAiB,sBAAsB,gBAAgB,KAAK,OAAO;AAEzE,YAAM,iBAAiB,sBAAsB,OAAO,KAAK,YAAY;AACrE,aAAO;AAAA,QACL;AAAA,UACE,UAAU,CAAC,WAAW;AAAA,UACtB,QAAQ,EAAE,QAAQ,GAAG,eAAe;AAAA,UACpC,MAAM,CAAC,YAAqD;AAC1D,oBAAQ,aAAa,IAAI;AAAA,cACvB,UAAU;AAAA,cACV,MAAM;AAAA,cACN,IAAI;AAAA,cACJ,QAAQ,aAAa,OAAO,QAAQ,CAAC,WAAW,OAAO,wBAAwB,CAAC;AAAA,cAChF,MAAM,QAAQ;AAAA,YAChB,CAAC;AACD,mBAAO,CAAC,eAAe,OAAO,OAAO,CAAC;AAAA,UACxC;AAAA,QACF;AAAA,QACA;AAAA,UACE,UAAU,CAAC,YAAY;AAAA,UACvB,QAAQ,EAAE,QAAQ,GAAG,YAAY,eAAe;AAAA,UAChD,MAAM,CAAC,YAAqD;AAC1D,oBAAQ,aAAa,IAAI;AAAA,cACvB,UAAU;AAAA,cACV,MAAM;AAAA,cACN,IAAI;AAAA,cACJ,QAAQ;AAAA,cACR,MAAM,QAAQ;AAAA,YAChB,CAAC;AACD,mBAAO,CAAC,gBAAgB,gBAAgB,OAAO,CAAC;AAAA,UAClD;AAAA,QACF;AAAA,QACA,GAAG,kBAAkB,OAAO,gBAAgB,0BAA0B;AAAA,MACxE;AAAA,IACF;AAGA,UAAM,YAAY,aAAa,OAAO,2BAA2B,CAAC;AAClE,UAAM,iBAAiB,sBAAsB,WAAW,KAAK,YAAY;AACzE,WAAO;AAAA,MACL;AAAA,QACE,UAAU,CAAC,WAAW;AAAA,QACtB,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,eAAe;AAAA,QACpD,MAAM,CAAC,YAAqD;AAC1D,kBAAQ,aAAa,IAAI;AAAA,YACvB,UAAU;AAAA,YACV,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,QAAQ,aAAa,OAAO,QAAQ,CAAC,8BAA8B,OAAO,wBAAwB,CAAC;AAAA,YACnG,MAAM,QAAQ;AAAA,UAChB,CAAC;AACD,iBAAO,CAAC,eAAe,WAAW,OAAO,CAAC;AAAA,QAC5C;AAAA,MACF;AAAA,MACA,GAAG,kBAAkB,OAAO,gBAAgB,iBAAiB;AAAA,IAC/D;AAAA,EACF;AACF;AASA,SAAS,mBAAmB,OAAc,KAA+B;AACvE,QAAM,WAAW,MAAM,SAAS,CAAC,GAAG,SAAS,UAAU;AACvD,MAAI,aAAa,KAAK,MAAM,SAAS,MAAM,CAAC,QAAQ,IAAI,SAAS,WAAW,QAAQ,GAAG;AACrF,WAAO;AAAA,EACT;AACA,QAAM,WAAW,MAAM,SAAS,IAAI,CAAC,KAAK,aAAa;AACrD,QAAI,IAAI,SAAS,WAAW,UAAU;AACpC,aAAO;AAAA,IACT;AACA,QAAI,IAAI,SAAS,SAAS,UAAU;AAClC,UAAI,aAAa,IAAI;AAAA,QACnB,UAAU;AAAA,QACV,MAAM,OAAO,OAAO,QAAQ,CAAC,MAAM,OAAO,IAAI,SAAS,MAAM,CAAC;AAAA,QAC9D,IAAI,GAAG,OAAO,QAAQ,CAAC;AAAA,QACvB,QAAQ;AAAA,QACR,MAAM,IAAI;AAAA,MACZ,CAAC;AACD,aAAO,EAAE,GAAG,KAAK,UAAU,IAAI,SAAS,MAAM,GAAG,QAAQ,EAAE;AAAA,IAC7D;AACA,UAAM,UAAU,MAAM;AAAA,MACpB,EAAE,QAAQ,WAAW,IAAI,SAAS,OAAO;AAAA,MACzC,OAAuB,EAAE,MAAM,aAAa,UAAU,CAAC,EAAE;AAAA,IAC3D;AACA,WAAO,EAAE,GAAG,KAAK,UAAU,CAAC,GAAG,IAAI,UAAU,GAAG,OAAO,EAAE;AAAA,EAC3D,CAAC;AACD,SAAO,EAAE,GAAG,OAAO,SAAS;AAC9B;AAEA,SAAS,kBAAkB,OAAc,WAAmB,QAA6B;AACvF,QAAM,KAAK,eAAe,KAAK;AAC/B,SAAO;AAAA,IACL;AAAA,MACE,UAAU,CAAC,eAAe;AAAA,MAC1B,QAAQ,EAAE,QAAQ,GAAG,eAAe,GAAG,OAAO;AAAA,MAC9C,MAAM,CAAC,QAAiD;AACtD,YAAI,aAAa,IAAI;AAAA,UACnB,UAAU;AAAA,UACV,MAAM;AAAA,UACN,IAAI;AAAA,UACJ;AAAA,UACA,MAAM,IAAI;AAAA,QACZ,CAAC;AACD,cAAM,QAAuB,EAAE,MAAM,YAAY,MAAM,GAAG;AAC1D,eAAO,CAAC,KAAK;AAAA,MACf;AAAA,IACF;AAAA,IACA;AAAA,MACE,QAAQ,EAAE,QAAQ,EAAE;AAAA,MACpB,MAAM,CAAC,QAAiD;AACtD,YAAI,aAAa,IAAI;AAAA,UACnB,UAAU;AAAA,UACV,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,QAAQ,GAAG,MAAM,sCAAiC,OAAO,SAAS,CAAC;AAAA,UACnE,MAAM,IAAI;AAAA,QACZ,CAAC;AACD,eAAO,CAAC,gBAAgB,KAAK,CAAC;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAAc,KAAoC;AACzE,QAAM,OAAO,MAAM,SAAS;AAAA,IAAI,CAAC,KAAK,aACpC,IAAI,SAAS,IAAI,CAAC,SAAS,YAAY,MAAM,KAAK,aAAa,CAAC,CAAC;AAAA,EACnE;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,iBAAiB,eAAe,KAAK;AAAA,EACvC;AACF;AAEA,SAAS,eAAe,OAAc,KAAwC;AAC5E,QAAM,aACJ,IAAI,qBAAqB,UAAa,IAAI,iBAAiB,SAAS,IAChE,IAAI,mBACJ;AACN,QAAM,UAAU,mBAAmB,YAAY,GAAG;AAClD,MAAI,WAAW,SAAS,KAAK;AAC3B,QAAI,aAAa,IAAI;AAAA,MACnB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,MAAM,IAAI;AAAA,IACZ,CAAC;AAAA,EACH;AACA,QAAM,OAAO,MAAM,SAAS;AAAA,IAAI,CAAC,KAAK,aACpC,IAAI,SAAS,IAAI,CAAC,SAAS,iBAAiB,MAAM,KAAK,QAAQ,CAAC;AAAA,EAClE;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,yBAAyB;AAAA,EAC3B;AACF;AAGA,SAAS,iBACP,MACA,KACA,UACW;AACX,MAAI,aAAa,GAAG;AAClB,WAAO,EAAE,MAAM,YAAY,MAAMC,UAAS,IAAI,EAAE;AAAA,EAClD;AACA,SAAO,YAAY,MAAM,KAAK,KAAK;AACrC;AAEA,SAAS,YAAY,MAAsB,KAAwB,QAA4B;AAK7F,QAAM,SAAS,aAAa,KAAK,UAAU,GAAG;AAC9C,QAAM,SAAS,OAAO,SAAS,WAAW,IAAI,OAAO,SAAS,CAAC,IAAI;AACnE,QAAM,UAAU,OAAO,SAAS,WAAW;AAC3C,QAAM,uBAAuB,QAAQ,SAAS,UAAU,OAAO,UAAU;AACzE,QAAM,YAAY,UAAUA,UAAS,IAAI,IAAI,uBAAuB,OAAO,OAAO;AAClF,MAAI,cAAc,QAAW;AAE3B,UAAM,UAAU,UAAU,KAAK;AAC/B,QAAI,CAAC,UAAU,kBAAkB,KAAK,OAAO,GAAG;AAC9C,aAAO,EAAE,MAAM,cAAc,OAAO,OAAO,OAAO,GAAG,MAAM,QAAQ;AAAA,IACrE;AACA,WAAO,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,EAC7C;AACA,QAAM,OAAsB;AAAA,IAC1B,MAAM;AAAA,IACN,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,UAAU,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAwD;AAC9E,QAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,QAAM,WAAW,MAAM,SAAS,CAAC,GAAG,SAAS,UAAU;AACvD,QAAM,WAA6C,CAAC;AACpD,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK,GAAG;AACpC,UAAM,IAAI,MAAM,CAAC;AACjB,UAAM,OAAO,MAAM,SAAS;AAAA,MAC1B,CAAC,QACCA,UAAS,IAAI,SAAS,CAAC,KAAK,EAAE,MAAM,QAAQ,OAAO,GAAG,CAAC,EAAE,SAAS;AAAA,IACtE;AACA,UAAM,WAAW,MAAM,UAAU,MAAM,YAAY,MAAM,UAAU,IAAI;AACvE,QAAI,aAAa,UAAa,CAAC,MAAM;AACnC,eAAS,KAAK,IAAI;AAAA,IACpB,OAAO;AACL,eAAS,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,YAAY,OAAO,OAAO;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBACP,OACA,KACA,MACQ;AACR,QAAM,QAAQ,IAAI,iBAAiB,IAAI,8BAA8B,CAAC;AACtE,MAAI,IAAI;AACR,aAAW,CAAC,UAAU,GAAG,KAAK,MAAM,SAAS,QAAQ,GAAG;AACtD,eAAW,QAAQ,IAAI,UAAU;AAC/B,YAAM,UACJ,SAAS,eACL,iBAAiB,MAAM,OAAO,QAAQ,IACtC,YAAY,MAAM,OAAO,aAAa,CAAC;AAC7C,WAAK,mBAAmB,OAAO;AAAA,IACjC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAyB;AACnD,MAAI,KAAK,SAAS,cAAc,KAAK,SAAS,cAAc;AAC1D,WAAO,KAAK,KAAK;AAAA,EACnB;AACA,SAAO,KAAK,UAAU,IAAI,EAAE;AAC9B;AAEA,SAAS,aAAa,OAAc,SAAwB;AAC1D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,MAAM,SAAS,MAAM,GAAG,OAAO;AAAA,EAC3C;AACF;AAEA,SAAS,eAAe,OAAsB;AAC5C,QAAM,OAAO,MAAM,SAAS;AAAA,IAAI,CAAC,QAC/B,IAAI,SAAS,IAAI,CAAC,MAAMA,UAAS,CAAC,EAAE,QAAQ,OAAO,KAAK,CAAC;AAAA,EAC3D;AACA,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,KAAK,CAAC,KAAK,CAAC;AAC3B,QAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,QAAM,MAAM,OAAO,IAAI,CAAC,GAAG,MAAM;AAC/B,UAAM,IAAI,MAAM,CAAC;AACjB,QAAI,MAAM,SAAU,QAAO;AAC3B,QAAI,MAAM,QAAS,QAAO;AAC1B,QAAI,MAAM,OAAQ,QAAO;AACzB,WAAO;AAAA,EACT,CAAC;AACD,QAAM,QAAQ;AAAA,IACZ,KAAK,OAAO,KAAK,KAAK,CAAC;AAAA,IACvB,KAAK,IAAI,KAAK,KAAK,CAAC;AAAA,IACpB,GAAG,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI;AAAA,EACpD;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,gBAAgB,OAA6B;AACpD,SAAO,qBAAqB,eAAe,KAAK,GAAG,MAAS;AAC9D;;;AC/VA,SAAS,YAAAC,iBAAgB;AAkBlB,IAAM,kBAAN,MAA6C;AAAA,EAClD,MAAM,MAAmB,MAAkC;AACzD,WAAO,KAAK,SAAS,UAAU,WAAW,IAAI;AAAA,EAChD;AAAA,EAEA,KAAK,MAAmB,MAAmD;AACzE,UAAM,OAAO;AACb,UAAM,KAAK,kBAAkB,IAAI;AACjC,WAAO;AAAA,MACL;AAAA,QACE,UAAU,CAAC,eAAe;AAAA,QAC1B,QAAQ,EAAE,QAAQ,GAAG,eAAe,GAAG,OAAO;AAAA,QAC9C,MAAM,MAA4B;AAChC,gBAAM,QAAuB,EAAE,MAAM,YAAY,MAAM,GAAG;AAC1D,iBAAO,CAAC,KAAK;AAAA,QACf;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ,EAAE,QAAQ,EAAE;AAAA,QACpB,MAAM,CAAC,QAAiD;AACtD,cAAI,aAAa,IAAI;AAAA,YACnB,UAAU;AAAA,YACV,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,QAAQ;AAAA,YACR,MAAM,IAAI;AAAA,UACZ,CAAC;AACD,iBAAO,CAAC,gBAAgB,MAAM,GAAG,CAAC;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,MAAY,SAAS,GAAW;AACzD,QAAM,MAAM,KAAK,OAAO,MAAM;AAC9B,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,KAAK,UAAU;AAChC,UAAM,UAAU,KAAK,YAAY;AACjC,UAAM,MAAM,UAAU,QAAQ;AAC9B,UAAM,OAAO,SAAS,IAAI;AAC1B,UAAM,KAAK,GAAG,GAAG,KAAK,GAAG,IAAI,IAAI,EAAE;AACnC,eAAW,SAAS,KAAK,UAAU;AACjC,UAAI,MAAM,SAAS,QAAQ;AACzB,cAAM,KAAK,kBAAkB,OAAO,SAAS,CAAC,CAAC;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,SAAS,MAAwB;AACxC,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,KAAK,UAAU;AACjC,QAAI,MAAM,SAAS,aAAa;AAC9B,YAAM,KAAKC,UAAS,KAAK,CAAC;AAAA,IAC5B,WAAW,MAAM,SAAS,QAAQ;AAChC,YAAM,KAAKA,UAAS,KAAK,CAAC;AAAA,IAC5B;AAAA,EACF;AACA,SAAO,MAAM,KAAK,GAAG,EAAE,KAAK;AAC9B;AAEA,SAAS,gBAAgB,MAAY,KAAuC;AAC1E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,oBAAoB,MAAM,GAAG,GAAG;AAAA,EAC5C;AACF;AAEA,SAAS,oBACP,MACA,QACA,KACqB;AACrB,MAAI,kBAAkB;AACtB,MAAI,kBAAkB,2BAA2B;AAC/C,QAAI,aAAa,IAAI;AAAA,MACnB,UAAU;AAAA,MACV,MAAM,UAAU,OAAO,eAAe,CAAC;AAAA,MACvC,IAAI,UAAU,OAAO,yBAAyB,CAAC;AAAA,MAC/C,QAAQ;AAAA,MACR,MAAM,IAAI;AAAA,IACZ,CAAC;AACD,sBAAkB;AAAA,EACpB;AAIA,QAAM,MAAsB,CAAC;AAC7B,MAAI,kBAAqC,CAAC;AAE1C,QAAM,QAAQ,MAAY;AACxB,QAAI,gBAAgB,WAAW,GAAG;AAChC;AAAA,IACF;AACA,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,CAAC;AACD,sBAAkB,CAAC;AAAA,EACrB;AAEA,aAAW,QAAQ,KAAK,UAAU;AAChC,UAAM,SAAS,KAAK,YAAY,OAAO,YAAO,KAAK,YAAY,QAAQ,YAAO;AAC9E,oBAAgB,KAAK;AAAA,MACnB,MAAM;AAAA,MACN,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,GAAG,MAAM,GAAG,SAAS,IAAI,CAAC,GAAG,CAAC;AAAA,IACjE,CAAC;AACD,UAAM,aAAqB,CAAC;AAC5B,eAAW,SAAS,KAAK,UAAU;AACjC,UAAI,MAAM,SAAS,QAAQ;AACzB,mBAAW,KAAK,KAAK;AAAA,MACvB;AAAA,IACF;AACA,QAAI,WAAW,WAAW,GAAG;AAC3B;AAAA,IACF;AACA,UAAM;AACN,eAAW,SAAS,YAAY;AAC9B,UAAI,KAAK,GAAG,oBAAoB,OAAO,kBAAkB,GAAG,GAAG,CAAC;AAAA,IAClE;AAAA,EACF;AACA,QAAM;AAEN,MAAI,IAAI,WAAW,GAAG;AACpB,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU,CAAC,EAAE,MAAM,qBAAqB,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,IAAI,CAAC,EAAE,CAAC;AAAA,MACjF,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AClJO,IAAM,uBAAN,MAAkD;AAAA,EACvD,MAAM,MAAmB,MAAkC;AACzD,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,KAAK,OAAoB,MAAmD;AAC1E,WAAO;AAAA,MACL;AAAA,QACE,QAAQ,EAAE,QAAQ,EAAE;AAAA,QACpB,MAAM,CAACC,UAAkD,CAAC,EAAE,MAAM,UAAU,CAAC;AAAA,MAC/E;AAAA,IACF;AAAA,EACF;AACF;;;ACoBO,SAAS,gBAAgB,UAAkC,CAAC,GAAuB;AACxF,QAAM,SAAS,QAAQ,UAAU,IAAI,qBAAqB;AAC1D,QAAM,YAAY,QAAQ,aAAa,IAAI,+BAA+B;AAC1E,QAAM,YAAY,IAAI,iBAAiB;AACvC,QAAM,WAAW,IAAI,qBAAqB;AAE1C,QAAM,WAA0B;AAAA,IAC9B,IAAI,oBAAoB,EAAE,WAAW,SAAS,CAAC;AAAA,IAC/C,IAAI,iBAAiB;AAAA,IACrB,IAAI,gBAAgB;AAAA,IACpB,IAAI,YAAY;AAAA,IAChB,IAAI,aAAa;AAAA,IACjB,IAAI,eAAe;AAAA,IACnB,IAAI,iBAAiB;AAAA,IACrB,IAAI,kBAAkB;AAAA,IACtB,IAAI,iBAAiB;AAAA,IACrB,IAAI,qBAAqB;AAAA,IACzB,IAAI,iBAAiB;AAAA,IACrB,IAAI,YAAY;AAAA,EAClB;AAEA,QAAM,WAAW,IAAI,gBAAgB,CAAC,GAAI,QAAQ,YAAY,CAAC,GAAI,GAAG,QAAQ,CAAC;AAC/E,QAAM,YAAY,IAAI,iBAAiB,EAAE,UAAU,CAAC;AAEpD,QAAM,iBAAiC;AAAA,IACrC,cAAc,QAAQ;AAAA,IACtB,qBAAqB,QAAQ;AAAA,IAC7B,UAAU,QAAQ,YAAY,aAAa;AAAA,IAC3C,UAAU,QAAQ;AAAA,IAClB,WAAW,QAAQ,aAAa,CAAC;AAAA,IACjC,UAAU,QAAQ;AAAA,IAClB,YAAY,QAAQ;AAAA,IACpB,mBAAmB,QAAQ;AAAA,IAC3B,kBAAkB,QAAQ;AAAA,EAC5B;AAEA,SAAO,IAAI,mBAAmB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAKO,SAAS,QAAQ,UAAkB,SAAqD;AAC7F,SAAO,gBAAgB,OAAO,EAAE,QAAQ,UAAU,OAAO;AAC3D;AAKO,SAAS,kBACd,UACA,SACmC;AACnC,SAAO,gBAAgB,OAAO,EAAE,kBAAkB,UAAU,OAAO;AACrE;;;AC9DO,SAAS,eAAe,QAA+C;AAC5E,QAAM,SAA4B,CAAC;AACnC,MAAI,OAAO,SAAS,wBAAwB;AAC1C,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,oBAAoB,OAAO,OAAO,MAAM,CAAC,MAAM,OAAO,sBAAsB,CAAC;AAAA,IACxF,CAAC;AAAA,EACH;AAEA,MAAI,gBAAgB;AACpB,MAAI,aAAa;AACjB,MAAI,iBAAiB;AACrB,MAAI,SAAS;AAEb,SAAO,QAAQ,CAAC,OAAO,MAAM;AAC3B,UAAM,OAAO,UAAU,OAAO,CAAC,CAAC;AAChC,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,YAAI,MAAM,KAAK,KAAK,SAAS,uBAAuB;AAClD,iBAAO,KAAK,EAAE,MAAM,SAAS,oBAAoB,CAAC;AAAA,QACpD;AACA,YAAI,MAAM,UAAU,WAAc,MAAM,QAAQ,KAAK,MAAM,QAAQ,IAAI;AACrE,iBAAO,KAAK,EAAE,MAAM,SAAS,+BAA0B,CAAC;AAAA,QAC1D;AACA;AAAA,MACF,KAAK;AACH,YAAI,MAAM,SAAS,UAAa,MAAM,KAAK,KAAK,SAAS,wBAAwB;AAC/E,iBAAO,KAAK,EAAE,MAAM,SAAS,sBAAsB,CAAC;AAAA,QACtD;AACA;AAAA,MACF,KAAK;AACH,YAAI,MAAM,SAAS,SAAS,qBAAqB;AAC/C,iBAAO,KAAK,EAAE,MAAM,SAAS,mBAAmB,CAAC;AAAA,QACnD;AACA,YAAI,MAAM,cAAc,UAAa,MAAM,UAAU,SAAS,qBAAqB;AACjF,iBAAO,KAAK,EAAE,MAAM,SAAS,mBAAmB,CAAC;AAAA,QACnD;AACA;AAAA,MACF,KAAK;AACH,YAAI,MAAM,SAAS,SAAS,sBAAsB;AAChD,iBAAO,KAAK,EAAE,MAAM,SAAS,wBAAwB,CAAC;AAAA,QACxD;AACA;AAAA,MACF,KAAK;AACH,yBAAiB,MAAM,KAAK;AAC5B;AAAA,MACF,KAAK,SAAS;AACZ,YAAI,MAAM,KAAK,SAAS,gBAAgB;AACtC,iBAAO,KAAK,EAAE,MAAM,SAAS,mBAAmB,CAAC;AAAA,QACnD;AACA,mBAAW,OAAO,MAAM,MAAM;AAC5B,cAAI,IAAI,SAAS,gBAAgB;AAC/B,mBAAO,KAAK,EAAE,MAAM,SAAS,kBAAkB,CAAC;AAAA,UAClD;AACA,qBAAW,QAAQ,KAAK;AACtB,0BAAc,cAAc,IAAI;AAAA,UAClC;AAAA,QACF;AACA;AAAA,MACF;AAAA,MACA,KAAK,cAAc;AACjB,YAAI,MAAM,KAAK,SAAS,2BAA2B,GAAG;AACpD,iBAAO,KAAK,EAAE,MAAM,SAAS,wBAAwB,CAAC;AAAA,QACxD;AACA,mBAAW,OAAO,MAAM,MAAM;AAC5B,cAAI,IAAI,SAAS,gBAAgB;AAC/B,mBAAO,KAAK,EAAE,MAAM,SAAS,uBAAuB,CAAC;AAAA,UACvD;AACA,qBAAW,QAAQ,KAAK;AACtB,8BAAkB,cAAc,IAAI;AAAA,UACtC;AAAA,QACF;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,kBAAU;AACV,YAAI,MAAM,MAAM,SAAS,uBAAuB;AAC9C,iBAAO,KAAK,EAAE,MAAM,SAAS,mBAAmB,CAAC;AAAA,QACnD;AACA,sBAAc,OAAO,MAAM,MAAM;AACjC;AAAA,MACF,KAAK;AACH,YAAI,MAAM,aAAa,SAAS,wBAAwB;AACtD,iBAAO,KAAK,EAAE,MAAM,SAAS,0BAA0B,CAAC;AAAA,QAC1D;AACA,YAAI,MAAM,UAAU,UAAa,MAAM,MAAM,KAAK,SAAS,2BAA2B;AACpF,iBAAO,KAAK,EAAE,MAAM,SAAS,wBAAwB,CAAC;AAAA,QACxD;AACA;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH;AAAA,MACF,SAAS;AACP,cAAM,aAAoB;AAC1B,aAAK;AACL;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,gBAAgB,+BAA+B;AACjD,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,uBAAuB,OAAO,aAAa,CAAC;AAAA,IACvD,CAAC;AAAA,EACH;AACA,MAAI,aAAa,sBAAsB;AACrC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,eAAe,OAAO,UAAU,CAAC;AAAA,IAC5C,CAAC;AAAA,EACH;AACA,MAAI,iBAAiB,2BAA2B;AAC9C,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,oBAAoB,OAAO,cAAc,CAAC;AAAA,IACrD,CAAC;AAAA,EACH;AACA,MAAI,SAAS,oCAAoC;AAC/C,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,UAAU,OAAO,MAAM,CAAC,MAAM,OAAO,kCAAkC,CAAC;AAAA,IACnF,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,SAAS,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AACrE,UAAM,IAAI,MAAM,0BAA0B,MAAM,EAAE;AAAA,EACpD;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,MAAyB;AAC9C,MAAI,KAAK,SAAS,YAAY;AAC5B,WAAO,KAAK,KAAK;AAAA,EACnB;AACA,MAAI,KAAK,SAAS,cAAc;AAC9B,WAAO,KAAK,KAAK;AAAA,EACnB;AACA,SAAO,KAAK,UAAU,IAAI,EAAE;AAC9B;AAEA,SAAS,cACP,OACA,MACA,QACM;AACN,QAAM,QAAQ,MAAM;AACpB,MAAI,MAAM,SAAS,OAAO;AACxB,QAAI,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,SAAS,oBAAoB;AAC3E,aAAO,KAAK,EAAE,MAAM,SAAS,gCAA2B,CAAC;AAAA,IAC3D;AACA,eAAW,KAAK,MAAM,UAAU;AAC9B,UAAI,EAAE,MAAM,SAAS,uBAAuB;AAC1C,eAAO,KAAK,EAAE,MAAM,SAAS,iBAAiB,CAAC;AAAA,MACjD;AACA,UAAI,EAAE,EAAE,QAAQ,IAAI;AAClB,eAAO,KAAK,EAAE,MAAM,SAAS,wBAAwB,CAAC;AAAA,MACxD;AAAA,IACF;AACA;AAAA,EACF;AACA,MAAI,MAAM,OAAO,SAAS,KAAK,MAAM,OAAO,SAAS,kBAAkB;AACrE,WAAO,KAAK,EAAE,MAAM,SAAS,0BAAqB,CAAC;AAAA,EACrD;AACA,MAAI,MAAM,YAAY,WAAW,SAAS,kBAAkB;AAC1D,WAAO,KAAK,EAAE,MAAM,SAAS,kBAAkB,CAAC;AAAA,EAClD;AACA,aAAW,KAAK,MAAM,QAAQ;AAC5B,QAAI,EAAE,KAAK,SAAS,uBAAuB;AACzC,aAAO,KAAK,EAAE,MAAM,SAAS,mBAAmB,CAAC;AAAA,IACnD;AACA,QAAI,EAAE,KAAK,SAAS,KAAK,EAAE,KAAK,SAAS,kBAAkB;AACzD,aAAO,KAAK,EAAE,MAAM,SAAS,0BAAqB,CAAC;AAAA,IACrD;AACA,eAAW,KAAK,EAAE,MAAM;AACtB,UAAI,EAAE,MAAM,SAAS,uBAAuB;AAC1C,eAAO,KAAK,EAAE,MAAM,SAAS,mBAAmB,CAAC;AAAA,MACnD;AACA,UAAI,CAAC,MAAM,YAAY,WAAW,SAAS,EAAE,KAAK,GAAG;AACnD,eAAO,KAAK,EAAE,MAAM,SAAS,eAAe,EAAE,KAAK,2BAA2B,CAAC;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AACF;","names":["COMMENT_RE","toString","toString","toString","toString","toString","toString","alt","toString","ctx","toString","toString","toString","_ctx"]}