@codename/deck 0.1.1 → 0.2.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/deck.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/yaml.js", "../src/parse.js", "../src/kit.js", "../src/render.js", "../src/look.js", "../src/strings.js", "../node_modules/marked/src/defaults.ts", "../node_modules/marked/src/rules.ts", "../node_modules/marked/src/helpers.ts", "../node_modules/marked/src/Tokenizer.ts", "../node_modules/marked/src/Lexer.ts", "../node_modules/marked/src/Renderer.ts", "../node_modules/marked/src/TextRenderer.ts", "../node_modules/marked/src/Parser.ts", "../node_modules/marked/src/Hooks.ts", "../node_modules/marked/src/Instance.ts", "../node_modules/marked/src/marked.ts", "../src/deck.js", "../src/blocks.js", "../src/version.js", "../src/file.js", "../src/pptx.js", "../src/deck.css", "../src/standalone.js"],
4
- "sourcesContent": ["// Front matter as brains and Slidev write it: the YAML a deck needs, maps by their indent, lists\n// in blocks and in brackets, quoted and plain scalars, block scalars (| and >) and comments. What\n// it can't read stays a string, so a deck never fails to open over its settings. Pure.\n\n/** @param {string} text @returns {Record<string, any>} */\nexport function parseYaml(text) {\n const lines = text.replace(/\\r\\n?/g, '\\n').split('\\n').map((raw) => ({ indent: raw.length - raw.trimStart().length, text: uncomment(raw).trimEnd(), raw }))\n const at = { i: 0 }\n const value = block(lines, at, 0)\n return value && typeof value === 'object' && !Array.isArray(value) ? value : {}\n}\n\n/** A line without its comment: a # at its start or after a space, outside quotes. @param {string} line */\nfunction uncomment(line) {\n let quote = ''\n for (let i = 0; i < line.length; i++) {\n const c = line[i]\n if (quote) { if (c === quote) quote = '' }\n else if (c === '\"' || c === \"'\") quote = c\n else if (c === '#' && (i === 0 || /\\s/.test(line[i - 1]))) return line.slice(0, i)\n }\n return line\n}\n\n/** @param {{ indent: number, text: string, raw: string }[]} lines @param {{ i: number }} at @param {number} min @returns {any} */\nfunction block(lines, at, min) {\n while (at.i < lines.length && !lines[at.i].text.trim()) at.i++\n if (at.i >= lines.length || lines[at.i].indent < min) return null\n const indent = lines[at.i].indent\n if (/^-(\\s|$)/.test(lines[at.i].text.trim())) {\n const list = []\n while (at.i < lines.length) {\n const line = lines[at.i]\n if (!line.text.trim()) { at.i++; continue }\n if (line.indent !== indent || !/^-(\\s|$)/.test(line.text.trim())) break\n const rest = line.text.trim().slice(1).trim()\n at.i++\n if (!rest) list.push(block(lines, at, indent + 1))\n else if (/^[^'\"[{][^:]*:(\\s|$)/.test(rest)) {\n // A map that starts on the dash's line: its first key there, the rest below it.\n const width = line.raw.indexOf(rest)\n lines.splice(at.i, 0, { indent: width, text: ' '.repeat(width) + rest, raw: ' '.repeat(width) + rest })\n list.push(block(lines, at, width))\n } else list.push(scalar(rest))\n }\n return list\n }\n /** @type {Record<string, any>} */\n const map = {}\n while (at.i < lines.length) {\n const line = lines[at.i]\n if (!line.text.trim()) { at.i++; continue }\n if (line.indent !== indent) break\n const entry = /^(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^']|'')*'|[^:]+?)\\s*:(?:\\s+(.*))?$/.exec(line.text.trim())\n at.i++\n if (!entry) continue\n const key = String(scalar(entry[1]))\n const rest = (entry[2] ?? '').trim()\n if (rest === '|' || rest === '>' || /^[|>][+-]$/.test(rest)) map[key] = blockScalar(lines, at, indent, rest[0] === '>')\n else if (rest) map[key] = scalar(rest)\n else map[key] = block(lines, at, indent + 1)\n }\n return map\n}\n\n/** @param {{ indent: number, text: string, raw: string }[]} lines @param {{ i: number }} at @param {number} indent @param {boolean} folded */\nfunction blockScalar(lines, at, indent, folded) {\n const taken = []\n while (at.i < lines.length && (!lines[at.i].raw.trim() || lines[at.i].indent > indent)) taken.push(lines[at.i++].raw)\n while (taken.length && !taken.at(-1)?.trim()) taken.pop()\n const width = Math.min(...taken.filter((line) => line.trim()).map((line) => line.length - line.trimStart().length))\n const text = taken.map((line) => line.slice(width)).join('\\n')\n return folded ? text.replace(/([^\\n])\\n(?=[^\\n])/g, '$1 ') : text\n}\n\n/** A scalar, or a list or map in brackets. @param {string} text @returns {any} */\nfunction scalar(text) {\n const t = text.trim()\n if (t.startsWith('[') || t.startsWith('{')) {\n const read = flow(t, { i: 0 })\n if (read !== undefined) return read\n }\n if (/^\"(?:[^\"\\\\]|\\\\.)*\"$/.test(t)) {\n try { return JSON.parse(t) } catch { return t.slice(1, -1) }\n }\n if (/^'(?:[^']|'')*'$/.test(t)) return t.slice(1, -1).replace(/''/g, \"'\")\n if (/^(true|yes|on)$/i.test(t)) return true\n if (/^(false|no|off)$/i.test(t)) return false\n if (/^(null|~)$/i.test(t) || t === '') return null\n if (/^[-+]?(\\d+\\.?\\d*|\\.\\d+)(e[-+]?\\d+)?$/i.test(t)) return Number(t)\n return t\n}\n\n/** A list or map in brackets, or undefined when it isn't one. @param {string} text @param {{ i: number }} at @returns {any} */\nfunction flow(text, at) {\n const space = () => { while (/\\s/.test(text[at.i] ?? '')) at.i++ }\n const item = () => {\n space()\n if (text[at.i] === '[' || text[at.i] === '{') return flow(text, at)\n const start = at.i\n if (text[at.i] === '\"' || text[at.i] === \"'\") {\n const q = text[at.i++]\n while (at.i < text.length && !(text[at.i] === q && text[at.i - 1] !== '\\\\')) at.i++\n at.i++\n } else while (at.i < text.length && !/[,\\]}]/.test(text[at.i]) && !(text[at.i] === ':' && /^[\\s,\\]}]?$/.test(text[at.i + 1] ?? ''))) at.i++\n return scalar(text.slice(start, at.i))\n }\n const open = text[at.i++]\n space()\n if (open === '[') {\n const list = []\n while (at.i < text.length && text[at.i] !== ']') {\n list.push(item())\n space()\n if (text[at.i] === ',') at.i++\n else if (text[at.i] !== ']') return undefined\n space()\n }\n at.i++\n return list\n }\n /** @type {Record<string, any>} */\n const map = {}\n while (at.i < text.length && text[at.i] !== '}') {\n const key = item()\n space()\n if (text[at.i] !== ':') return undefined\n at.i++\n map[String(key)] = item()\n space()\n if (text[at.i] === ',') at.i++\n else if (text[at.i] !== '}') return undefined\n space()\n }\n at.i++\n return map\n}\n", "// A deck's Markdown read as Slidev reads it (@slidev/parser's rules): slides between `---` lines;\n// a `---` line followed by a line that isn't empty opens that slide's settings, YAML up to the next\n// `---` line (or a ```yaml block at the slide's top); the first slide's settings are the deck's\n// too (its headmatter); the last HTML comment at a slide's end is the speaker's notes; `::name::`\n// on its own line starts a layout's slot. Fenced code and comments never split a slide. Every slide\n// and slot keeps where it starts in the source, so an edit made on a slide goes back to its words.\n// Read too, as brains write them even when asked for Slidev: Pandoc's and Quarto's fenced divs,\n// `::: notes` as the notes, and `:::: columns` holding `::: column`s as slots (what is above them\n// the heading, each column a slot, what is under them the foot), never rewritten.\n// Pure: no DOM, no Markdown parser.\nimport { parseYaml } from './yaml.js'\n\n/** @typedef {{ name: string, text: string, start: number }} Slot */\n/** @typedef {{ index: number, start: number, end: number, settings: Record<string, any>, slots: Slot[], notes: string, title: string }} Slide */\n/** @typedef {{ settings: Record<string, any>, slides: Slide[] }} Deck */\n\nconst SLOT = /^::([\\w-]+)::\\s*$/\n\n/** @param {string} source @returns {Deck} */\nexport function parseDeck(source) {\n const text = source.replace(/\\r\\n?/g, '\\n')\n const lines = text.split('\\n')\n const offsets = [0]\n for (const line of lines) offsets.push(/** @type {number} */ (offsets.at(-1)) + line.length + 1)\n /** @type {{ start: number, end: number, matter: [number, number] | null }[]} */\n const ranges = []\n let start = 0, matter = /** @type {[number, number] | null} */ (null), comment = false\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trimEnd()\n if (comment) { comment = commentGoesOn(line, true); continue }\n if (line.startsWith('---') && !/^---\\s*-/.test(line)) {\n if (i > start || matter) ranges.push({ start, end: i, matter })\n matter = null\n start = i + 1\n // Settings only when settings follow (a `key:` line), not words: Slidev would take a heading\n // there for settings and lose the slide, as decks brains write often start `---`, `# Title`.\n if (line[3] !== '-' && lines[i + 1]?.trim() && /^\\s*([\\w-]+\\s*:|#\\s)/.test(lines[i + 1]) && !/^#{1,6}\\s/.test(lines[i + 1])) {\n let j = i + 1\n while (j < lines.length && lines[j].trimEnd() !== '---') j++\n matter = [i + 1, j]\n i = j\n start = j + 1\n }\n } else if (/^\\s*(`{3,}|~{3,})/.test(line)) {\n const fence = /** @type {RegExpExecArray} */ (/^\\s*(`{3,}|~{3,})/.exec(line))[1]\n let j = i + 1\n while (j < lines.length && !lines[j].trimStart().startsWith(fence)) j++\n if (j < lines.length) i = j\n } else comment = commentGoesOn(line, false)\n }\n if (start < lines.length || matter) ranges.push({ start, end: lines.length, matter })\n // No `---` at all, as a document or a Pandoc deck is written: a slide at each heading of the first\n // two levels, as Pandoc's slide level does, the headmatter staying with the first.\n const last = /** @type {{ start: number, end: number, matter: [number, number] | null }} */ (ranges.at(-1))\n if (ranges.length === 1 && last) {\n let fence = ''\n const heads = []\n for (let i = last.start; i < last.end; i++) {\n const mark = /^\\s*(`{3,}|~{3,})/.exec(lines[i])?.[1]\n if (fence) { if (mark && lines[i].trimStart().startsWith(fence)) fence = '' }\n else if (mark) fence = mark\n else if (/^#{1,2}\\s+\\S/.test(lines[i])) heads.push(i)\n }\n if (heads.length >= 2) {\n ranges.pop()\n const cuts = heads[0] > last.start && !lines.slice(last.start, heads[0]).some((line) => line.trim()) ? heads : [last.start, ...heads.slice(heads[0] === last.start ? 1 : 0)]\n cuts.forEach((at, k) => ranges.push({ start: k === 0 ? last.start : at, end: cuts[k + 1] ?? last.end, matter: k === 0 ? last.matter : null }))\n }\n }\n const slides = ranges.map(({ start, end, matter }, index) => slide(lines, offsets, start, end, matter, index))\n .filter((one, i) => i === 0 || one.slots.some((slot) => slot.text.trim()) || Object.keys(one.settings).length)\n slides.forEach((one, i) => { one.index = i })\n return { settings: slides[0]?.settings ?? {}, slides }\n}\n\n/**\n * Pandoc's columns, as the lines where each slot starts: the first column `left`, the next `right`\n * (or `middle`, then `right`, for three), the line after the columns `bottom`. The fences' own lines\n * are left as they are and drawn as nothing. @param {string[]} lines @returns {Map<number, string>}\n */\nfunction columnsOf(lines) {\n /** @type {Map<number, string>} */\n const starts = new Map()\n const open = lines.findIndex((line) => /^:{3,}[ \\t]*\\{?[ \\t]*\\.?columns\\b/.test(line))\n if (open < 0) return starts\n const fence = /** @type {RegExpExecArray} */ (/^:+/.exec(lines[open]))[0]\n const close = lines.findIndex((line, i) => i > open && line.trim() === fence)\n const cols = lines.map((line, i) => [line, i]).filter(([line, i]) => Number(i) > open && (close < 0 || Number(i) < close) && /^:{3,}[ \\t]*\\{?[ \\t]*\\.?col(umn)?\\b/.test(String(line))).map(([, i]) => Number(i))\n if (cols.length < 2) return starts\n const names = cols.length === 2 ? ['left', 'right'] : ['left', 'middle', 'right', ...cols.slice(3).map((_, k) => `col-${k + 4}`)]\n cols.forEach((at, k) => starts.set(at, names[k]))\n if (close > 0 && lines.slice(close + 1).some((line) => line.trim())) starts.set(close, 'bottom')\n return starts\n}\n\n/** Whether a comment is still open at this line's end. @param {string} line @param {boolean} open */\nfunction commentGoesOn(line, open) {\n let at = 0\n for (;;) {\n if (open) {\n const end = line.indexOf('-->', at)\n if (end < 0) return true\n open = false\n at = end + 3\n } else {\n const begin = line.indexOf('<!--', at)\n if (begin < 0) return false\n const end = line.indexOf('-->', begin + 4)\n if (end < 0) return true\n at = end + 3\n }\n }\n}\n\n/**\n * @param {string[]} lines @param {number[]} offsets @param {number} from @param {number} to\n * @param {[number, number] | null} matter @param {number} index @returns {Slide}\n */\nfunction slide(lines, offsets, from, to, matter, index) {\n let settings = matter ? parseYaml(lines.slice(matter[0], matter[1]).join('\\n')) : {}\n let top = from\n // Slidev's other way to write settings: a ```yaml block at the slide's top.\n while (top < to && !lines[top].trim()) top++\n if (!matter && /^```ya?ml\\s*$/.test(lines[top] ?? '')) {\n let j = top + 1\n while (j < to && !lines[j].startsWith('```')) j++\n settings = parseYaml(lines.slice(top + 1, j).join('\\n'))\n from = j + 1\n }\n let body = lines.slice(from, to).join('\\n')\n let notes = ''\n // remark's `???` and reveal.js's `Note:`: what follows, to the slide's end, is the notes.\n const after = /^(\\?\\?\\?|Notes?:)[ \\t]*(.*)$/m.exec(body)\n if (after && after.index !== undefined && !/^```/m.test(body.slice(after.index))) {\n notes = [after[2], body.slice(after.index + after[0].length)].join('\\n').trim()\n body = body.slice(0, after.index)\n }\n // reveal.js's <aside class=\"notes\">, wherever on the slide, as Pandoc's below.\n body = body.replace(/<aside\\b[^>]*class=[\"']?notes[\"']?[^>]*>([\\s\\S]*?)<\\/aside>/gi, (all, text) => {\n notes += (notes ? '\\n' : '') + text.replace(/<[^>]*>/g, ' ').replace(/[ \\t]+/g, ' ').trim()\n return all.replace(/[^\\n]/g, ' ')\n })\n // Pandoc's notes, wherever on the slide: kept as the notes, blanked in place so offsets stay.\n body = body.replace(/^(:{3,})[ \\t]*\\{?[ \\t]*\\.?notes[ \\t]*\\}?[ \\t]*\\n([\\s\\S]*?)\\n\\1[ \\t]*$/gm, (all, _, text) => {\n notes += (notes ? '\\n' : '') + text.trim()\n return all.replace(/[^\\n]/g, ' ')\n })\n const comments = [...body.matchAll(/<!--([\\s\\S]*?)-->/g)]\n const last = comments.at(-1)\n if (last && last.index !== undefined && !body.slice(last.index + last[0].length).trim()) {\n notes = [last[1].trim(), notes].filter(Boolean).join('\\n')\n body = body.slice(0, last.index)\n }\n // Each slot's text is the source's own, from where it starts, so offsets in it are the source's.\n /** @type {Slot[]} */\n const slots = []\n let name = 'default', first = from, fence = ''\n /** @type {string[]} */\n let taken = []\n const push = () => slots.push({ name, text: taken.join('\\n'), start: offsets[first] })\n const columns = columnsOf(body.split('\\n'))\n for (const [i, line] of body.split('\\n').entries()) {\n const mark = /^\\s*(`{3,}|~{3,})/.exec(line)?.[1]\n const marker = SLOT.exec(line) ?? (columns.has(i) ? [line, /** @type {string} */ (columns.get(i))] : null)\n if (fence) { if (mark && line.trimStart().startsWith(fence)) fence = '' }\n else if (mark) fence = mark\n else if (marker) {\n push()\n name = marker[1]\n taken = []\n first = from + i + 1\n continue\n }\n taken.push(line)\n }\n push()\n const kept = slots.filter((slot, i) => i > 0 || slot.text.trim() || slots.length === 1)\n const heading = /^#{1,6}\\s+(.+)$/m.exec(body.replace(/^```[\\s\\S]*?^```/gm, ''))\n return { index, start: offsets[matter ? matter[0] - 1 : from], end: offsets[to] - 1, settings, slots: kept, notes, title: String(settings.title ?? heading?.[1] ?? '').trim() }\n}\n", "// A kit: a design system and the layouts that go with it, as data and never as CSS or code, so a\n// person, an organisation or a brain can make one and no kit can do more than lay out a slide.\n// deck's own kit holds the usual layouts; a host's (an organisation's, a project's) and the deck\n// file's own `kit:` go over it, in that order. A layout is a grid: its slots by name, the areas\n// they take, its tracks, how its words sit, what paper it is on, and the PowerPoint layout it is\n// nearest to. Everything is checked against a small grammar; what fails is dropped, with a reason.\n// Pure.\n\n/** @typedef {{ required?: boolean, max_words?: number, max_chars?: number, items?: [number, number], item_max_words?: number, heading_max_words?: number, kind?: string }} Budget */\n/** @typedef {{ label?: Record<string, string> | string, intent?: string, use_when?: string, avoid_when?: string, slots: string[], budgets: Record<string, Budget>, areas: string[][], columns: string[], rows: string[], align: 'start' | 'center' | 'end', justify: 'start' | 'center' | 'end', paper: 'paper' | 'fill' | 'ink' | 'soft', title: 'normal' | 'large' | 'huge', pptx: string, numbered: boolean }} Layout */\n/** @typedef {{ name?: string, tokens: Record<string, any>, layouts: Record<string, Layout> }} Kit */\n\nconst NAME = /^[a-z][a-z0-9-]{0,31}$/\nconst TRACK = /^(auto|min-content|max-content|\\d{1,2}(\\.\\d)?fr|\\d{1,3}%)$/\nconst PPTX = ['Title Slide', 'Title and Content', 'Section Header', 'Two Content', 'Comparison', 'Title Only', 'Blank', 'Content with Caption', 'Picture with Caption']\nconst ENUMS = /** @type {const} */ ({ align: ['start', 'center', 'end'], justify: ['start', 'center', 'end'], paper: ['paper', 'fill', 'ink', 'soft'], title: ['normal', 'large', 'huge'] })\n\n/** The names brains give the usual layouts, for the ones deck has. */\nexport const ALIASES = /** @type {Record<string, string>} */ ({\n title: 'cover', 'title-slide': 'cover', 'two-columns': 'two-cols', 'two-column': 'two-cols', columns: 'two-cols', comparison: 'two-cols-header',\n 'three-columns': 'three-cols', 'section-header': 'section', divider: 'section', big: 'fact', number: 'fact', 'image-text': 'image-right', closing: 'end', thanks: 'end',\n})\n\n/** deck's own kit: the usual layouts, the ones Slidev names and the ones PowerPoint has, as data. */\nexport const STANDARD = /** @type {Kit} */ ({\n name: 'standard',\n tokens: {},\n layouts: Object.fromEntries(Object.entries(/** @type {Record<string, any>} */ ({\n default: { label: { en: 'Title and content', fr: 'Titre et contenu' }, pptx: 'Title and Content' },\n cover: { label: { en: 'Cover', fr: 'Couverture' }, justify: 'center', paper: 'fill', title: 'huge', pptx: 'Title Slide', numbered: false },\n intro: { label: { en: 'Introduction', fr: 'Introduction' }, justify: 'center', paper: 'fill', title: 'large', pptx: 'Title Slide', numbered: false },\n section: { label: { en: 'Section', fr: 'Section' }, justify: 'center', paper: 'ink', title: 'huge', pptx: 'Section Header', numbered: false },\n center: { label: { en: 'Centred', fr: 'Centré' }, justify: 'center', align: 'center', pptx: 'Title Only' },\n statement: { label: { en: 'Statement', fr: 'Affirmation' }, justify: 'center', align: 'center', title: 'large', pptx: 'Title Only' },\n fact: { label: { en: 'Big number', fr: 'Grand chiffre' }, justify: 'center', align: 'center', title: 'huge', pptx: 'Title Only' },\n quote: { label: { en: 'Quote', fr: 'Citation' }, justify: 'center', pptx: 'Title Only' },\n end: { label: { en: 'Closing', fr: 'Clôture' }, justify: 'center', align: 'center', paper: 'fill', title: 'large', pptx: 'Title Slide', numbered: false },\n full: { label: { en: 'Full', fr: 'Plein cadre' }, pptx: 'Blank', numbered: false },\n none: { label: { en: 'Blank', fr: 'Vide' }, pptx: 'Blank', numbered: false },\n 'two-cols': { label: { en: 'Two columns', fr: 'Deux colonnes' }, slots: ['default', 'right'], areas: 'default right', columns: '1fr 1fr', pptx: 'Two Content' },\n 'two-cols-header': { label: { en: 'Comparison', fr: 'Comparaison' }, slots: ['default', 'left', 'right', 'bottom'], areas: 'default default | left right | bottom bottom', columns: '1fr 1fr', rows: 'auto 1fr auto', pptx: 'Comparison' },\n 'three-cols': { label: { en: 'Three columns', fr: 'Trois colonnes' }, slots: ['default', 'left', 'middle', 'right'], areas: 'default default default | left middle right', columns: '1fr 1fr 1fr', rows: 'auto 1fr', pptx: 'Comparison' },\n 'image-left': { label: { en: 'Picture left', fr: 'Image à gauche' }, pptx: 'Picture with Caption', justify: 'center' },\n 'image-right': { label: { en: 'Picture right', fr: 'Image à droite' }, pptx: 'Picture with Caption', justify: 'center' },\n image: { label: { en: 'Picture', fr: 'Image' }, pptx: 'Blank', numbered: false },\n })).map(([name, given]) => [name, /** @type {Layout} */ (layoutOf(given).layout)])),\n})\n\n/**\n * A layout as given, checked: its slots, areas and tracks in the grammar, its words' place, paper\n * and size among their names. @param {any} given @returns {{ layout: Layout | null, problems: string[] }}\n */\nexport function layoutOf(given) {\n const problems = []\n if (!given || typeof given !== 'object') return { layout: null, problems: ['not a layout'] }\n // Slots as names, or as a catalog writes them: each a budget, `title` being the heading the\n // default slot opens with rather than a slot of its own.\n /** @type {Record<string, Budget>} */\n const budgets = {}\n const named = Array.isArray(given.slots) || typeof given.slots === 'string' ? [given.slots].flat().map(String)\n : given.slots && typeof given.slots === 'object' ? Object.entries(given.slots).map(([name, budget]) => {\n if (budget && typeof budget === 'object') budgets[name] = clean(budget)\n return name === 'title' ? 'default' : name\n }) : ['default']\n const slots = [...new Set(named)]\n if (!slots.every((slot) => NAME.test(slot))) return { layout: null, problems: ['a slot name is not a-z, 0-9 and -'] }\n if (!slots.includes('default')) slots.unshift('default')\n // Areas as Slidev's and CSS's grid write them, rows split by | or new lines.\n /** @type {string[]} */\n const lines = Array.isArray(given.areas) ? given.areas.map((/** @type {any} */ row) => [row].flat().join(' ')) : String(given.areas ?? slots.join(' ')).split(/\\||\\n/)\n const rows = lines.map((row) => row.trim().replace(/^\"|\"$/g, '').split(/\\s+/)).filter((row) => row.length && row[0])\n const width = rows[0]?.length ?? 0\n if (!rows.length || rows.some((row) => row.length !== width) || rows.flat().some((cell) => cell !== '.' && !slots.includes(cell))) return { layout: null, problems: ['areas are not a rectangle of its slots'] }\n for (const slot of slots) {\n const cells = rows.flatMap((row, y) => row.map((cell, x) => /** @type {[string, number, number]} */ ([cell, x, y]))).filter(([cell]) => cell === slot)\n if (!cells.length) { if (slot !== 'default') problems.push(`slot ${slot} has no area`); continue }\n const xs = cells.map((c) => c[1]), ys = cells.map((c) => c[2])\n if (cells.length !== (Math.max(...xs) - Math.min(...xs) + 1) * (Math.max(...ys) - Math.min(...ys) + 1)) return { layout: null, problems: [`slot ${slot} is not a rectangle`] }\n }\n const tracks = (/** @type {any} */ value, /** @type {number} */ count) => {\n const list = value === undefined ? Array(count).fill('1fr') : (Array.isArray(value) ? value : String(value).split(/\\s+/)).map(String)\n return list.length === count && list.every((t) => TRACK.test(t)) ? list : null\n }\n const columns = tracks(given.columns, width), rowTracks = tracks(given.rows, rows.length)\n if (!columns || !rowTracks) return { layout: null, problems: ['columns or rows are not tracks deck knows (auto, 1fr, 40%…), one per column or row'] }\n const pick = (/** @type {keyof typeof ENUMS} */ key, /** @type {string} */ fallback) => {\n const value = String(given[key] ?? fallback)\n if (!(/** @type {readonly string[]} */ (ENUMS[key])).includes(value)) { problems.push(`${key} ${value} is not one of ${ENUMS[key].join(', ')}`); return fallback }\n return value\n }\n const label = typeof given.label === 'string' || (given.label && typeof given.label === 'object') ? given.label : undefined\n const words = (/** @type {any} */ v) => (typeof v === 'string' ? v.slice(0, 300) : undefined)\n return {\n layout: /** @type {Layout} */ ({\n label, intent: words(given.intent), use_when: words(given.use_when), avoid_when: words(given.avoid_when), slots, budgets, areas: rows, columns, rows: rowTracks,\n align: pick('align', 'start'), justify: pick('justify', 'start'), paper: pick('paper', 'paper'), title: pick('title', 'normal'),\n pptx: PPTX.includes(given.pptx) ? given.pptx : slots.length > 1 ? 'Comparison' : 'Title and Content', numbered: given.numbered !== false,\n }),\n problems,\n }\n}\n\n/** A slot's budget, its numbers only. @param {Record<string, any>} given @returns {Budget} */\nfunction clean(given) {\n /** @type {Record<string, any>} */\n const kept = {}\n for (const key of ['max_words', 'max_chars', 'item_max_words', 'heading_max_words']) if (Number.isInteger(given[key]) && given[key] > 0) kept[key] = given[key]\n if (Array.isArray(given.items) && given.items.length === 2 && given.items.every(Number.isInteger)) kept.items = given.items\n if (typeof given.required === 'boolean') kept.required = given.required\n if (typeof given.kind === 'string' && /^[a-z-]{1,20}$/.test(given.kind)) kept.kind = given.kind\n return kept\n}\n\n/**\n * Design tokens as the W3C's Design Tokens format (DTCG 2025.10) writes them, read into a kit's:\n * `color.light` and `color.dark` groups (bg, surface, fg, muted, accent) or flat colours, `font.sans`\n * and the like; each `$value` a hex string or a colour object with its `hex`. Tokens already flat\n * pass through. @param {any} given @returns {Record<string, any>}\n */\nexport function tokensFrom(given) {\n if (!given || typeof given !== 'object') return {}\n if (!JSON.stringify(given).includes('\"$value\"')) return given\n const value = (/** @type {any} */ t) => (t && typeof t === 'object' && '$value' in t ? t.$value : t)\n const colour = (/** @type {any} */ t) => { const v = value(t); return typeof v === 'string' ? v : typeof v?.hex === 'string' ? v.hex : undefined }\n const face = (/** @type {any} */ t) => { const v = value(t); return Array.isArray(v) ? v.map(String) : typeof v === 'string' ? [v] : undefined }\n const NAMES = /** @type {const} */ ({ bg: 'paper', background: 'paper', paper: 'paper', fg: 'ink', text: 'ink', ink: 'ink', accent: 'primary', primary: 'primary', muted: 'muted', surface: 'soft', soft: 'soft' })\n const group = (/** @type {any} */ g) => Object.fromEntries(Object.entries(g ?? {}).filter(([k]) => k in NAMES).map(([k, t]) => [NAMES[/** @type {keyof typeof NAMES} */ (k)], colour(t)]).filter(([, v]) => v))\n const colours = given.color ?? given.colour ?? {}\n /** @type {Record<string, any>} */\n const tokens = { ...group(colours), ...group(colours.light) }\n const dark = group(colours.dark)\n if (Object.keys(dark).length) tokens.dark = dark\n const fonts = given.font ?? given.fontFamily ?? {}\n const heading = face(fonts.heading ?? fonts.display ?? fonts.sans), body = face(fonts.body ?? fonts.text ?? fonts.sans)\n if (heading || body) tokens.fonts = { heading: heading ?? body, body: body ?? heading }\n return tokens\n}\n\n/**\n * Kits merged, the later over the earlier: their tokens, and their layouts by name, each checked.\n * @param {...any} kits @returns {{ kit: Kit, problems: string[] }}\n */\nexport function mergeKits(...kits) {\n /** @type {Kit} */\n const kit = { name: 'standard', tokens: {}, layouts: { ...STANDARD.layouts } }\n const problems = []\n for (const given of kits) {\n if (!given || typeof given !== 'object') continue\n if (typeof given.name === 'string') kit.name = given.name\n if (given.tokens && typeof given.tokens === 'object') kit.tokens = { ...kit.tokens, ...tokensFrom(given.tokens) }\n for (const [name, definition] of Object.entries(given.layouts ?? given.types ?? {})) {\n if (!NAME.test(name)) { problems.push(`layout ${name}: not a-z, 0-9 and -`); continue }\n const { layout, problems: found } = layoutOf(definition)\n problems.push(...found.map((p) => `layout ${name}: ${p}`))\n if (layout) kit.layouts[name] = layout\n }\n }\n return { kit, problems }\n}\n\n/** A layout's name in a language, else its own name. @param {Layout} layout @param {string} name @param {string} lang */\nexport function labelOf(layout, name, lang) {\n if (typeof layout.label === 'string') return layout.label\n return layout.label?.[lang] ?? layout.label?.[lang.split('-')[0]] ?? layout.label?.en ?? name\n}\n\n/**\n * The layout a slide that names none is given, from what it holds, as Pandoc's PowerPoint writer\n * chooses: the first slide is the cover; a heading alone, a section; slots beyond the first, the\n * layout of two (or three) columns that has them; a number alone as its heading, a fact; a quote\n * alone, a quote; else the default. @param {{ index: number, slots: { name: string, text: string }[] }} slide\n */\nexport function inferLayout(slide) {\n const names = slide.slots.map((slot) => slot.name)\n if (names.includes('middle')) return 'three-cols'\n if (names.includes('left')) return 'two-cols-header'\n if (names.includes('right')) return 'two-cols'\n if (slide.index === 0) return 'cover'\n const text = slide.slots.map((slot) => slot.text).join('\\n').trim()\n const lines = text.split('\\n').filter((line) => line.trim())\n if (lines.length === 1 && /^#{1,2}\\s+\\S/.test(lines[0])) return 'section'\n if (/^#\\s+[^\\s]*\\d[\\d\\s.,%€$£¥]*\\S*\\s*$/u.test(lines[0] ?? '') && lines.length <= 3 && !/^\\s*[-*\\d]+[.)]?\\s/m.test(lines.slice(1).join('\\n'))) return 'fact'\n if (lines.length && lines.every((line, i) => line.startsWith('>') || (i === lines.length - 1 && !line.startsWith('#')))) return lines[0].startsWith('>') ? 'quote' : 'default'\n return 'default'\n}\n", "// A slide drawn from its Markdown: marked's tokens made into elements with the DOM's own calls, so\n// nothing here needs innerHTML, a style attribute or a Trusted Types policy, and a page under any\n// policy can draw a deck. Each block that can be changed by hand says where its words are in the\n// source (data-edit, offsets), so an edit made on the slide goes back into the Markdown. HTML a\n// deck holds is not drawn: Slidev's <v-click> and <v-clicks> become steps, <br> a line break, and\n// any other tag gives up its words alone. ```echarts and ```mermaid go to the host's drawers.\nimport { STANDARD, inferLayout, ALIASES } from './kit.js'\n\n/** @typedef {import('./parse.js').Slide} Slide */\n/** @typedef {import('./parse.js').Slot} Slot */\n/** @typedef {(element: HTMLElement, source: string) => void | Promise<void>} Drawer */\n/** @typedef {{ blocks: Record<string, Drawer>, resolve: (src: string) => string | null, headings: 'real' | 'aria', number: (n: number) => string, total: number, kit: import('./kit.js').Kit, lex: (markdown: string) => any[], slide: string }} Context */\n\n/**\n * @param {string} tag @param {Record<string, string | number | boolean | undefined>} [attributes]\n * @param {(Node | string | null | undefined | false)[]} [children]\n */\nexport function h(tag, attributes = {}, children = []) {\n const element = document.createElement(tag)\n for (const [name, value] of Object.entries(attributes)) if (value !== undefined && value !== false) element.setAttribute(name, value === true ? '' : String(value))\n for (const child of children) if (child || child === '') element.append(child)\n return element\n}\n\n/** An address a slide may show: the web's, a picture held in the file, or one beside it. @param {string} href */\nexport function safeUrl(href) {\n const url = String(href ?? '').trim()\n if (/^(https?:|mailto:|blob:|#)/i.test(url) || /^data:image\\/(png|jpe?g|gif|webp|avif|svg\\+xml);/i.test(url)) return url\n if (/^[a-z][\\w+.-]*:/i.test(url)) return null\n return url\n}\n\n/**\n * A slide, laid out by its layout, with its slots, steps and number.\n * @param {Slide} slide @param {Context} context @returns {{ element: HTMLElement, steps: number }}\n */\nexport function renderSlide(slide, context) {\n // The layout the slide names, by its name or a name brains give it, else the one its content suits.\n const asked = String(slide.settings.layout ?? '').trim().toLowerCase()\n const layout = context.kit.layouts[asked] ? asked : context.kit.layouts[ALIASES[asked]] ? ALIASES[asked] : inferLayout(slide)\n const definition = context.kit.layouts[layout] ?? STANDARD.layouts.default\n const classes = String(slide.settings.class ?? '').split(/\\s+/).filter((name) => ['invert', 'text-center', 'text-left'].includes(name))\n const counter = { step: 0 }\n const slots = new Map(slide.slots.map((slot) => [slot.name, slot]))\n const names = definition.slots\n const section = h('section', {\n class: ['deck-slide', `deck-layout-${layout}`, ...classes.map((name) => `deck-class-${name}`)].join(' '),\n 'data-index': slide.index, 'data-layout': layout, 'data-paper': definition.paper, 'data-align': definition.align, 'data-justify': definition.justify, 'data-title': definition.title,\n 'aria-roledescription': context.slide, role: 'group',\n })\n // Its grid, from the layout's definition, through the CSSOM: areas named s-<slot>, as `default` is no name CSS allows.\n const canvas = h('div', { class: 'deck-canvas' })\n canvas.style.setProperty('grid-template-areas', definition.areas.map((row) => `\"${row.map((cell) => (cell === '.' ? '.' : `s-${cell}`)).join(' ')}\"`).join(' '))\n canvas.style.setProperty('grid-template-columns', definition.columns.join(' '))\n canvas.style.setProperty('grid-template-rows', definition.rows.join(' '))\n section.append(canvas)\n const image = slide.settings.image ?? slide.settings.background\n if (typeof image === 'string' && ['image-left', 'image-right', 'image', 'cover'].includes(layout)) {\n const url = context.resolve(image)\n if (url) {\n const picture = h('div', { class: 'deck-image', role: 'img', 'aria-label': String(slide.settings.alt ?? '') || undefined })\n picture.style.setProperty('--deck-image', `url(\"${url.replace(/[\"\\\\\\n]/g, encodeURIComponent)}\")`)\n canvas.append(picture)\n section.classList.add('has-image')\n }\n }\n for (const name of names) {\n const slot = slots.get(name)\n const element = h('div', { class: 'deck-slot', 'data-slot': name }, slot ? blocks(slot, context, counter) : [])\n element.style.setProperty('grid-area', `s-${name}`)\n canvas.append(element)\n }\n // Slots a layout doesn't have still show, under the rest, rather than being lost.\n for (const slot of slide.slots) if (!names.includes(slot.name)) canvas.append(h('div', { class: 'deck-slot', 'data-slot': slot.name }, blocks(slot, context, counter)))\n if (definition.numbered && slide.settings.paginate !== false) section.append(h('span', { class: 'deck-number', 'aria-hidden': 'true' }, [context.number(slide.index + 1)]))\n return { element: section, steps: counter.step }\n}\n\n/** @param {Slot} slot @param {Context} context @param {{ step: number }} counter @returns {Node[]} */\nfunction blocks(slot, context, counter) {\n const tokens = context.lex(slot.text)\n /** @type {Node[]} */\n const out = []\n let at = slot.start, mode = /** @type {'' | 'click' | 'clicks'} */ ('')\n for (const token of tokens) {\n const start = at\n at += token.raw.length\n // Pandoc's fences: `::: incremental` shows its list a point a click, as <v-clicks> does; the others, nothing.\n const fences = token.type === 'paragraph' ? token.raw.trim().split('\\n').map((/** @type {string} */ line) => line.trim()) : []\n if (fences.length && fences.every((/** @type {string} */ line) => /^:{3,}/.test(line))) {\n for (const fence of fences) {\n if (/^:{3,}[ \\t]*\\{?[ \\t]*\\.?incremental\\b/.test(fence)) mode = 'clicks'\n else if (/^:{3,}\\s*$/.test(fence) && mode === 'clicks') mode = ''\n }\n continue\n }\n if (token.type === 'html') {\n const tag = /^\\s*<(\\/?)(v-clicks?|br)\\b[^>]*>\\s*$/i.exec(token.raw)\n if (tag && tag[2] === 'br') out.push(h('br'))\n else if (tag) mode = tag[1] ? '' : /** @type {'click' | 'clicks'} */ (tag[2].toLowerCase() === 'v-clicks' ? 'clicks' : 'click')\n else if (/<li\\b/i.test(token.raw)) {\n // A list written as HTML, as brains write Slidev's steps (<li v-click>): its items' words, each\n // a step when it asks to be one.\n const list = h(/<ol\\b/i.test(token.raw) ? 'ol' : 'ul', { dir: 'auto' })\n for (const [, attrs, inner] of token.raw.matchAll(/<li\\b([^>]*)>([\\s\\S]*?)(?=<\\/li>|<li\\b|<\\/[ou]l>|$)/gi)) {\n const words = inner.replace(/<!--[\\s\\S]*?-->/g, '').replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim()\n if (!words) continue\n const li = h('li', { dir: 'auto' }, [words])\n if (/\\bv-click\\b/.test(attrs) || mode === 'clicks') step(li, ++counter.step)\n list.append(li)\n }\n if (list.childElementCount) out.push(list)\n } else {\n const words = token.raw.replace(/<!--[\\s\\S]*?-->/g, '').replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim()\n if (words) out.push(h('p', {}, [words]))\n }\n continue\n }\n const element = block(token, start, context, mode === 'clicks' ? counter : null)\n if (!element) continue\n if (mode === 'click' || (mode === 'clicks' && token.type !== 'list')) step(element, ++counter.step)\n out.push(element)\n }\n return out\n}\n\n/** @param {Element} element @param {number} n */\nconst step = (element, n) => { element.classList.add('deck-step'); element.setAttribute('data-step', String(n)) }\n\n/**\n * @param {any} token @param {number} start where its raw starts in the source\n * @param {Context} context @param {{ step: number } | null} stepped list items each a step\n * @returns {HTMLElement | null}\n */\nfunction block(token, start, context, stepped) {\n switch (token.type) {\n case 'heading': {\n const head = /^\\s*#{1,6}[ \\t]+/.exec(token.raw)\n const edit = head ? range(start + head[0].length, start + token.raw.replace(/\\s*#*\\s*$/, '').length) : undefined\n return context.headings === 'real'\n ? h(`h${token.depth}`, { dir: 'auto', 'data-edit': edit }, inline(token.tokens, context))\n : h('p', { class: `deck-h deck-h${token.depth}`, role: 'heading', 'aria-level': Math.min(6, token.depth + 2), dir: 'auto', 'data-edit': edit }, inline(token.tokens, context))\n }\n case 'paragraph': {\n const lone = token.tokens.length === 1 && token.tokens[0].type === 'image'\n return h('p', { dir: 'auto', class: lone ? 'deck-picture' : undefined, 'data-edit': lone ? undefined : range(start, start + token.raw.trimEnd().length) }, inline(token.tokens, context))\n }\n case 'text': return h('p', { dir: 'auto' }, inline(token.tokens ?? [{ type: 'text', text: token.text }], context))\n // No dir=auto here: the browser would skip its paragraphs, which have their own, and find no letter.\n case 'blockquote': return h('blockquote', {}, children(token.tokens, start, token.raw, context))\n case 'list': {\n let from = 0\n const list = h(token.ordered ? 'ol' : 'ul', { start: token.ordered && token.start !== 1 ? token.start : undefined, class: token.items.some((/** @type {any} */ item) => item.task) ? 'deck-tasks' : undefined })\n for (const item of token.items) {\n const offset = token.raw.indexOf(item.raw, from)\n from = offset + item.raw.length\n const itemStart = start + Math.max(0, offset)\n const marker = /^\\s*(?:[-*+]|\\d+[.)])\\s+(?:\\[[ xX]\\]\\s+)?/.exec(item.raw)\n const simple = item.tokens.length === 1 && item.tokens[0].type === 'text' && !/\\n\\s*\\S/.test(item.raw.trim().split('\\n').slice(1).join('\\n'))\n const li = h('li', { dir: 'auto', 'data-edit': simple && marker ? range(itemStart + marker[0].length, itemStart + item.raw.trimEnd().length) : undefined }, [\n item.task ? h('input', { type: 'checkbox', checked: item.checked, disabled: true, 'aria-label': item.text }) : null,\n ...item.tokens.flatMap((/** @type {any} */ inner) => inner.type === 'text' ? inline(inner.tokens ?? [{ type: 'text', text: inner.text }], context)\n : [block(inner, itemStart + Math.max(0, item.raw.indexOf(inner.raw)), context, null)]),\n ])\n if (stepped) step(li, ++stepped.step)\n list.append(li)\n }\n return list\n }\n case 'code': {\n const info = /^(\\S*)\\s*(?:\\{([^}]*)\\})?/.exec(token.lang ?? '') ?? []\n const lang = (info[1] ?? '').toLowerCase()\n const drawer = context.blocks[lang]\n if (drawer) {\n const box = h('div', { class: `deck-block deck-${lang}`, 'data-source': token.text })\n box.append(h('pre', { class: 'deck-block-source', dir: 'ltr' }, [h('code', {}, [token.text])]))\n queueMicrotask(() => Promise.resolve(drawer(box, token.text)).catch(() => box.classList.add('is-failed')))\n return box\n }\n const marked = lines(info[2] ?? '')\n const code = h('code', { class: lang ? `language-${lang}` : undefined })\n for (const [i, line] of token.text.split('\\n').entries()) code.append(h('span', { class: marked.has(i + 1) ? 'deck-line is-marked' : 'deck-line' }, [line, '\\n']))\n return h('pre', { dir: 'ltr', class: marked.size ? 'has-marks' : undefined, tabindex: 0 }, [code])\n }\n case 'table': {\n const align = (/** @type {string | null} */ a) => a ?? undefined\n return h('div', { class: 'deck-table' }, [h('table', {}, [\n h('thead', {}, [h('tr', {}, token.header.map((/** @type {any} */ cell, /** @type {number} */ i) => h('th', { 'data-align': align(token.align[i]), dir: 'auto' }, inline(cell.tokens, context))))]),\n h('tbody', {}, token.rows.map((/** @type {any[]} */ row) => h('tr', {}, row.map((cell, i) => h('td', { 'data-align': align(token.align[i]), dir: 'auto' }, inline(cell.tokens, context)))))),\n ])])\n }\n default: return null\n }\n}\n\n/** @param {any[]} tokens @param {number} start @param {string} raw @param {Context} context */\nfunction children(tokens, start, raw, context) {\n let from = 0\n return tokens.map((token) => {\n const offset = raw.indexOf(token.raw, from)\n from = Math.max(from, offset + token.raw.length)\n return block(token, start + Math.max(0, offset), context, null)\n })\n}\n\n/** Line numbers as Slidev marks them, `{2,4-5}`; `|` steps are read as all their lines at once. @param {string} text */\nfunction lines(text) {\n const marked = new Set()\n for (const part of text.split(/[,|]/)) {\n const [a, b] = part.split('-').map((n) => parseInt(n, 10))\n if (Number.isFinite(a)) for (let n = a; n <= (Number.isFinite(b) ? b : a); n++) marked.add(n)\n }\n return marked\n}\n\n/** @param {number} from @param {number} to */\nconst range = (from, to) => (to > from ? `${from}-${to}` : undefined)\n\n/** @param {any[]} tokens @param {Context} context @returns {Node[]} */\nexport function inline(tokens = [], context) {\n return tokens.flatMap((token) => {\n switch (token.type) {\n case 'text': case 'escape': return token.tokens ? inline(token.tokens, context) : [token.text.replace(/&(amp|lt|gt|quot|#39);/g, (/** @type {string} */ _, /** @type {string} */ e) => ({ amp: '&', lt: '<', gt: '>', quot: '\"', '#39': \"'\" })[/** @type {'amp'} */ (e)])]\n case 'strong': return [h('strong', {}, inline(token.tokens, context))]\n case 'em': return [h('em', {}, inline(token.tokens, context))]\n case 'del': return [h('del', {}, inline(token.tokens, context))]\n case 'codespan': return [h('code', {}, [token.text.replace(/&(amp|lt|gt|quot|#39);/g, (/** @type {string} */ _, /** @type {string} */ e) => ({ amp: '&', lt: '<', gt: '>', quot: '\"', '#39': \"'\" })[/** @type {'amp'} */ (e)])])]\n case 'br': return [h('br')]\n case 'link': {\n const href = safeUrl(token.href)\n return href ? [h('a', { href, rel: 'noopener noreferrer', target: href.startsWith('#') ? undefined : '_blank' }, inline(token.tokens, context))] : inline(token.tokens, context)\n }\n case 'image': {\n const src = context.resolve(token.href)\n return src ? [h('img', { src, alt: token.text, loading: 'lazy' })] : [token.text]\n }\n case 'html': return /^<br\\s*\\/?>$/i.test(token.raw) ? [h('br')] : []\n default: return token.text ? [token.text] : []\n }\n })\n}\n", "// A deck's look: a design system's few tokens (paper, ink, primary, a voice for its type), from a\n// named look, then the project's, then the deck's own `themeConfig`, as Slidev names a theme's\n// settings. Light and dark are both worked out from them: each colour kept at its hue, deepened or\n// lightened until it reads at AA on the paper it sits on (4.5:1 for words, 3:1 for a chart's\n// marks), so a brain's or a person's colours can't make a slide unreadable. Pure.\n\n/** @typedef {{ paper: string, ink: string, primary: string, voice: string, radius: number, muted?: string, soft?: string, dark?: Record<string, string>, fonts?: { heading: string[], body: string[] } }} Tokens */\n/** @typedef {{ paper: string, ink: string, muted: string, line: string, primary: string, onPrimary: string, soft: string, series: string[] }} Scheme */\n\n/** Looks a deck can name (`theme:`), each a handful of tokens. */\nexport const LOOKS = /** @type {Record<string, Tokens>} */ ({\n default: { paper: '#fffdf8', ink: '#1d1b16', primary: '#f7c531', voice: 'calm', radius: 10 },\n ocean: { paper: '#f6fafb', ink: '#0d2530', primary: '#0f766e', voice: 'calm', radius: 6 },\n ember: { paper: '#fff8f3', ink: '#2a160c', primary: '#d9480f', voice: 'bold', radius: 2 },\n ink: { paper: '#ffffff', ink: '#111111', primary: '#3b5bdb', voice: 'elegant', radius: 0 },\n})\n\n/** Type for each voice: the device's faces, so a deck needs nothing to download to look right. */\nexport const VOICES = /** @type {Record<string, { heading: string, body: string }>} */ ({\n calm: { heading: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, \"Noto Sans\", sans-serif', body: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, \"Noto Sans\", sans-serif' },\n elegant: { heading: 'ui-serif, \"Iowan Old Style\", Georgia, \"Noto Serif\", serif', body: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, sans-serif' },\n bold: { heading: '\"Avenir Next Condensed\", \"Arial Narrow\", ui-sans-serif, system-ui, sans-serif', body: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, sans-serif' },\n friendly: { heading: 'ui-rounded, \"SF Pro Rounded\", \"Nunito\", system-ui, sans-serif', body: 'ui-rounded, \"SF Pro Rounded\", system-ui, sans-serif' },\n})\n\n/**\n * The tokens a deck's settings give, over the project's look and a named one.\n * @param {Record<string, any>} settings @param {Partial<Tokens>} [project]\n * @returns {Tokens}\n */\nexport function tokensOf(settings, project = {}) {\n const named = LOOKS[String(settings.theme ?? '')] ?? LOOKS.default\n const own = typeof settings.themeConfig === 'object' && settings.themeConfig ? settings.themeConfig : {}\n /** @type {Tokens} */\n const tokens = { ...named, ...clean(project), ...clean(own) }\n if (!VOICES[tokens.voice]) tokens.voice = 'calm'\n return tokens\n}\n\n/** @param {Record<string, any>} given @returns {Partial<Tokens>} */\nfunction clean(given) {\n /** @type {Partial<Tokens>} */\n const kept = {}\n for (const key of /** @type {const} */ (['paper', 'ink', 'primary', 'muted', 'soft'])) if (typeof given[key] === 'string' && hex(given[key])) kept[key] = given[key]\n if (given.dark && typeof given.dark === 'object') kept.dark = Object.fromEntries(Object.entries(given.dark).filter(([, v]) => typeof v === 'string' && hex(v)))\n if (given.fonts && Array.isArray(given.fonts.heading) && Array.isArray(given.fonts.body)) kept.fonts = { heading: given.fonts.heading.map(String), body: given.fonts.body.map(String) }\n if (typeof given.voice === 'string') kept.voice = given.voice\n if (typeof given.radius === 'number') kept.radius = given.radius\n return kept\n}\n\n/**\n * Light or dark, worked out from the tokens: dark swaps paper and ink and lifts the primary.\n * @param {Tokens} tokens @param {'light' | 'dark'} scheme @returns {Scheme}\n */\nexport function schemeOf(tokens, scheme) {\n const light = hex(tokens.paper) ?? [255, 253, 248], dark = hex(tokens.ink) ?? [29, 27, 22]\n // A kit's own dark colours where it gives them (a design system's dark mode), else worked out.\n const own = scheme === 'dark' ? tokens.dark ?? {} : {}\n const paper = round(hex(own.paper ?? '') ?? (scheme === 'dark' ? mix(dark, [0, 0, 0], 0.35) : light))\n const ink = round(hex(own.ink ?? '') ?? (scheme === 'dark' ? mix(light, [255, 255, 255], 0.2) : dark))\n const primary = hex(own.primary ?? tokens.primary) ?? [247, 197, 49]\n // The primary as a fill keeps its own colour; as words or marks it is made to read on the paper.\n const text = readable(primary, paper, 4.5)\n const onPrimary = contrast(ink, primary) >= contrast(paper, primary) ? ink : paper\n const series = [0, 1, 2, 3, 4, 5].map((n) => readable(rotate(primary, n * 57), paper, 3))\n return {\n paper: css(paper), ink: css(ink), muted: css(readable(round(hex(own.muted ?? (scheme === 'light' ? tokens.muted ?? '' : '')) ?? mix(ink, paper, 0.38)), paper, 4.5)), line: css(mix(ink, paper, 0.82)),\n primary: css(text), onPrimary: css(onPrimary), soft: css(hex(own.soft ?? (scheme === 'light' ? tokens.soft ?? '' : '')) ?? mix(primary, paper, 0.78)), series: series.map(css),\n }\n}\n\n/** @param {string} value @returns {[number, number, number] | null} */\nexport function hex(value) {\n const m = /^#?([\\da-f]{3}|[\\da-f]{6})$/i.exec(String(value).trim())\n if (!m) return null\n const h = m[1].length === 3 ? [...m[1]].map((c) => c + c).join('') : m[1]\n return /** @type {[number, number, number]} */ ([0, 2, 4].map((i) => parseInt(h.slice(i, i + 2), 16)))\n}\n\n/** @param {number[]} rgb */\nexport const css = (rgb) => `#${rgb.map((c) => Math.round(Math.max(0, Math.min(255, c))).toString(16).padStart(2, '0')).join('')}`\n\n/** A colour as it will be written: whole numbers, so that it reads at the ratio checked. @param {number[]} c */\nconst round = (c) => /** @type {[number, number, number]} */ (c.map((v) => Math.round(Math.max(0, Math.min(255, v)))))\n\n/** @param {number[]} a @param {number[]} b @param {number} t */\nconst mix = (a, b, t) => /** @type {[number, number, number]} */ (a.map((c, i) => c + (b[i] - c) * t))\n\n/** @param {number[]} rgb */\nfunction luminance(rgb) {\n const [r, g, b] = rgb.map((c) => { const s = c / 255; return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4 })\n return 0.2126 * r + 0.7152 * g + 0.0722 * b\n}\n\n/** WCAG's contrast ratio. @param {number[]} a @param {number[]} b */\nexport function contrast(a, b) {\n const [x, y] = [luminance(a), luminance(b)].sort((p, q) => q - p)\n return (x + 0.05) / (y + 0.05)\n}\n\n/**\n * The colour, its hue kept, deepened or lightened toward black or white until it reads at the\n * ratio on the paper. @param {number[]} colour @param {number[]} paper @param {number} ratio\n */\nexport function readable(colour, paper, ratio) {\n const toward = luminance(paper) > 0.18 ? [0, 0, 0] : [255, 255, 255]\n let t = 0, out = round(colour)\n while (contrast(out, paper) < ratio && t < 1) out = round(mix(colour, toward, (t = Math.min(1, t + 0.02))))\n return out\n}\n\n/** The colour turned round the colour wheel. @param {number[]} rgb @param {number} degrees */\nfunction rotate(rgb, degrees) {\n const [r, g, b] = rgb.map((c) => c / 255)\n const max = Math.max(r, g, b), min = Math.min(r, g, b), l = (max + min) / 2\n const d = max - min\n const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1))\n let h = d === 0 ? 0 : max === r ? ((g - b) / d) % 6 : max === g ? (b - r) / d + 2 : (r - g) / d + 4\n h = (h * 60 + degrees + 360) % 360\n const c = (1 - Math.abs(2 * l - 1)) * Math.max(s, 0.55), x = c * (1 - Math.abs(((h / 60) % 2) - 1)), m = l - c / 2\n const [p, q, u] = h < 60 ? [c, x, 0] : h < 120 ? [x, c, 0] : h < 180 ? [0, c, x] : h < 240 ? [0, x, c] : h < 300 ? [x, 0, c] : [c, 0, x]\n return [p + m, q + m, u + m].map((v) => v * 255)\n}\n", "// The deck's own words, for a deck opened on its own; a host gives its own instead (options.strings).\nconst STRINGS = /** @type {Record<string, Record<string, string>>} */ ({\n en: { deck: 'Slides', slide: 'slide', carousel: 'carousel', previous: 'Previous', next: 'Next', present: 'Present full screen', presenter: 'Presenter view', overview: 'All slides', edit: 'Change', scheme: 'Light or dark', export: 'Save as PowerPoint', source: 'The deck as text', notes: 'Notes', noNotes: 'No notes for this slide.', upNext: 'Next', last: 'Last slide', where: 'Slide {n} of {count}', saved: 'Saved' },\n fr: { deck: 'Diapositives', slide: 'diapositive', carousel: 'carrousel', previous: 'Précédente', next: 'Suivante', present: 'Présenter en plein écran', presenter: 'Vue présentateur', overview: 'Toutes les diapositives', edit: 'Modifier', scheme: 'Clair ou sombre', export: 'Enregistrer en PowerPoint', source: 'La présentation en texte', notes: 'Notes', noNotes: 'Pas de notes pour cette diapositive.', upNext: 'Ensuite', last: 'Dernière diapositive', where: 'Diapositive {n} sur {count}', saved: 'Enregistré' },\n ar: { deck: 'الشرائح', slide: 'شريحة', carousel: 'عرض شرائح', previous: 'السابقة', next: 'التالية', present: 'العرض بملء الشاشة', presenter: 'عرض المقدّم', overview: 'كل الشرائح', edit: 'تعديل', scheme: 'فاتح أو داكن', export: 'الحفظ بصيغة PowerPoint', source: 'العرض كنص', notes: 'الملاحظات', noNotes: 'لا ملاحظات لهذه الشريحة.', upNext: 'التالية', last: 'الشريحة الأخيرة', where: 'الشريحة {n} من {count}', saved: 'تم الحفظ' },\n ja: { deck: 'スライド', slide: 'スライド', carousel: 'カルーセル', previous: '前へ', next: '次へ', present: '全画面で発表', presenter: '発表者ビュー', overview: 'すべてのスライド', edit: '編集', scheme: 'ライトまたはダーク', export: 'PowerPoint で保存', source: 'テキストとしてのスライド', notes: 'メモ', noNotes: 'このスライドにメモはありません。', upNext: '次', last: '最後のスライド', where: 'スライド {n} / {count}', saved: '保存しました' },\n})\n\n/** @param {string} lang */\nexport const stringsFor = (lang) => STRINGS[lang.split('-')[0].toLowerCase()] ?? STRINGS.en\n", "import type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Gets the original marked default options.\n */\nexport function _getDefaults<ParserOutput = string, RendererOutput = string>(): MarkedOptions<ParserOutput, RendererOutput> {\n return {\n async: false,\n breaks: false,\n extensions: null,\n gfm: true,\n hooks: null,\n pedantic: false,\n renderer: null,\n silent: false,\n tokenizer: null,\n walkTokens: null,\n };\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport let _defaults: MarkedOptions<any, any> = _getDefaults();\n\nexport function changeDefaults<ParserOutput = string, RendererOutput = string>(newDefaults: MarkedOptions<ParserOutput, RendererOutput>) {\n _defaults = newDefaults;\n}\n", "const noopTest = { exec: () => null } as unknown as RegExp;\n\nfunction cachedIndentRegex(createRegex: (indent: number) => RegExp) {\n const cache: RegExp[] = [];\n return (indent: number) => {\n const cacheIndex = Math.max(0, Math.min(3, indent - 1));\n let regex = cache[cacheIndex];\n if (!regex) {\n regex = createRegex(cacheIndex);\n cache[cacheIndex] = regex;\n }\n return regex;\n };\n}\n\nfunction edit(regex: string | RegExp, opt = '') {\n let source = typeof regex === 'string' ? regex : regex.source;\n const obj = {\n replace: (name: string | RegExp, val: string | RegExp) => {\n let valSource = typeof val === 'string' ? val : val.source;\n valSource = valSource.replace(other.caret, '$1');\n source = source.replace(name, valSource);\n return obj;\n },\n getRegex: () => {\n return new RegExp(source, opt);\n },\n };\n return obj;\n}\n\n// use a default variable to ensure the regex is evaluated on client an not removed by minifiers\nconst supportsLookbehind = ((a = '') => {\ntry {\n return !!new RegExp('(?<=1)(?<!1)' + a);\n} catch {\n // See browser support here:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Lookbehind_assertion\n return false;\n}\n})();\n\nexport const other = {\n codeRemoveIndent: /^(?: {0,3}\\t| {1,4})/gm,\n outputLinkReplace: /\\\\([\\[\\]])/g,\n indentCodeCompensation: /^(\\s+)(?:```)/,\n beginningSpace: /^\\s+/,\n endingHash: /#$/,\n startingSpaceChar: /^ /,\n endingSpaceChar: / $/,\n endingSpaceTabChar: /[ \\t]$/,\n nonSpaceChar: /[^ ]/,\n newLineCharGlobal: /\\n/g,\n tabCharGlobal: /\\t/g,\n leadingSpaceTab: /^[ \\t]+/,\n multipleSpaceGlobal: /\\s+/g,\n blankLine: /^[ \\t]*$/,\n doubleBlankLine: /\\n[ \\t]*\\n[ \\t]*$/,\n blockquoteStart: /^ {0,3}>/,\n blockquoteSetextReplace: /\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,\n blockquoteSetextReplace2: /^ {0,3}>[ \\t]?/gm,\n listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,\n listIsTask: /^\\[[ xX]\\] +\\S/,\n listReplaceTask: /^\\[[ xX]\\] +/,\n listTaskCheckbox: /\\[[ xX]\\]/,\n anyLine: /\\n.*\\n/,\n hrefBrackets: /^<(.*)>$/,\n tableDelimiter: /[:|]/,\n tableAlignChars: /^\\||\\| *$/g,\n tableRowBlankLine: /\\n[ \\t]*$/,\n tableAlignRight: /^ *-+: *$/,\n tableAlignCenter: /^ *:-+: *$/,\n tableAlignLeft: /^ *:-+ *$/,\n startATag: /^<a /i,\n endATag: /^<\\/a>/i,\n startPreScriptTag: /^<(pre|code|kbd|script)(\\s|>)/i,\n endPreScriptTag: /^<\\/(pre|code|kbd|script)(\\s|>)/i,\n startAngleBracket: /^</,\n endAngleBracket: />$/,\n pedanticHrefTitle: /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,\n unicodeAlphaNumeric: /[\\p{L}\\p{N}]/u,\n numericCharacterReference: /&#(?:(\\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));/,\n numericCharacterReferenceOrAmpersand: /&#(?:(\\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,\n escapeTest: /[&<>\"']/,\n escapeReplace: /[&<>\"']/g,\n escapeTestNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,\n escapeReplaceNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,\n caret: /(^|[^\\[])\\^/g,\n percentDecode: /%25/g,\n findPipe: /\\|/g,\n splitPipe: / \\|/,\n slashPipe: /\\\\\\|/g,\n carriageReturn: /\\r\\n|\\r/g,\n spaceLine: /^ +$/gm,\n notSpaceStart: /^\\S*/,\n endingNewline: /\\n$/,\n listItemRegex: (bull: string) => new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`),\n nextBulletRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`)),\n hrRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}((?:-[ \\t]*){3,}|(?:_[ \\t]*){3,}|(?:\\\\*[ \\t]*){3,})(?:\\\\n+|$)`)),\n fencesBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}(?:\\`\\`\\`|~~~)`)),\n headingBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}#`)),\n // a list item ends where a paragraph would be interrupted, so this mirrors the\n // html start conditions in the paragraph rule below; type 7 is excluded there\n htmlBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}(?:</?(?:${_tag})(?: +|$|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\\\s>]|$)|!--)|<\\\\?|<![A-Za-z]|<!\\\\[CDATA\\\\[)`, 'i')),\n blockquoteBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}>`)),\n};\n\n/**\n * Block-Level Grammar\n */\n\nconst newline = /^(?:[ \\t]*(?:\\n|$))+/;\nconst blockCode = /^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/;\nconst fences = /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/;\nconst hr = /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/;\nconst heading = /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/;\nconst bullet = / {0,3}(?:[*+-]|\\d{1,9}[.)])/;\nconst lheadingCore = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |fences|blockquote|heading|hr|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/;\nconst lheading = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code can start a block but cannot interrupt a paragraph\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}(?:\\s|$)/) // ATX heading can interrupt\n .replace(/hr/g, / {0,3}(?:(?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/) // thematic break can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/\\|table/g, '') // table not in commonmark\n .getRegex();\nconst lheadingGfm = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code can start a block but cannot interrupt a paragraph\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}(?:\\s|$)/) // ATX heading can interrupt\n .replace(/hr/g, / {0,3}(?:(?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/) // thematic break can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/table/g, / {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/) // table can interrupt\n .getRegex();\nconst _paragraph = /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \\t]+\\n)[^\\n]+)*)/;\nconst blockText = /^[^\\n]+/;\nconst _blockLabel = /(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/;\nconst def = edit(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/)\n .replace('label', _blockLabel)\n .replace('title', /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/)\n .getRegex();\n\nconst list = edit(/^(bull)([ \\t][^\\n]*?)?(?:\\n|$)/)\n .replace(/bull/g, bullet)\n .getRegex();\n\nconst _tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title'\n + '|tr|track|ul';\nconst _comment = /<!--(?:-?>|[\\s\\S]*?(?:-->|$))/;\nconst html = edit(\n '^ {0,3}(?:' // optional indentation\n+ '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n*|$)' // (1)\n+ '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n+ '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>[^\\\\n]*\\\\n*|$)' // (3)\n+ '|<![A-Z][\\\\s\\\\S]*?(?:>[^\\\\n]*\\\\n*|$)' // (4)\n+ '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>[^\\\\n]*\\\\n*|$)' // (5)\n+ '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (6)\n+ '|<(?!(?:script|pre|style|textarea)(?![a-z0-9-]))([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) open tag\n+ '|</[a-z][a-z0-9-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) closing tag\n+ ')', 'i')\n .replace('comment', _comment)\n .replace('tag', _tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nconst createParagraph = (listInterrupt: RegExp) => edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)')\n .replace('list', listInterrupt)\n .replace('html', ' {0,3}(?:</?(?:tag)(?: +|\\\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\\\s>]|$)|!--)|<\\\\?|<![A-Za-z]|<!\\\\[CDATA\\\\[)')\n .replace('tag', _tag) // pars can be interrupted by html blocks of types (1) to (6)\n .getRegex();\n\n// only non-empty lists starting from 1 can interrupt paragraphs\nconst paragraph = createParagraph(/ {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]/);\n// inside a blockquote a bare list marker (any number) starts a sibling list,\n// so it must not be lazily continued as paragraph text (unlike a top level\n// paragraph, where an empty list cannot interrupt)\nconst blockquoteParagraph = createParagraph(/ {0,3}(?:[*+-]|\\d{1,9}[.)])(?:[ \\t]|\\n|$)/);\n\nconst blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/)\n .replace('paragraph', blockquoteParagraph)\n .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nconst blockNormal = {\n blockquote,\n code: blockCode,\n def,\n fences,\n heading,\n hr,\n html,\n lheading,\n list,\n newline,\n paragraph,\n table: noopTest,\n text: blockText,\n};\n\ntype BlockKeys = keyof typeof blockNormal;\n\n/**\n * GFM Block Grammar\n */\n\nconst gfmTable = edit(\n '^ *([^\\\\n ].*)\\\\n' // Header\n+ ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n+ '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)') // Cells\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('blockquote', ' {0,3}>')\n .replace('code', '(?: {4}| {0,3}\\t)[^\\\\n]')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)')\n .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]') // any bullet ends the table rows\n .replace('html', ' {0,3}(?:</?(?:tag)(?: +|\\\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\\\s>]|$)|!--)|<\\\\?|<![A-Za-z]|<!\\\\[CDATA\\\\[)')\n .replace('tag', _tag) // tables can be interrupted by html blocks of types (1) to (6)\n .getRegex();\n\nconst blockGfm: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n lheading: lheadingGfm,\n table: gfmTable,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('table', gfmTable) // interrupt paragraphs with table\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)')\n .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]+[^ \\\\t\\\\n]') // only non-empty lists starting from 1 can interrupt\n .replace('html', ' {0,3}(?:</?(?:tag)(?: +|\\\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\\\s>]|$)|!--)|<\\\\?|<![A-Za-z]|<!\\\\[CDATA\\\\[)')\n .replace('tag', _tag) // pars can be interrupted by html blocks of types (1) to (6)\n .getRegex(),\n};\n\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nconst blockPedantic: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n html: edit(\n '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', _comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n fences: noopTest, // fences not supported\n lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' *#{1,6} *[^\\n]')\n .replace('lheading', lheading)\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('|fences', '')\n .replace('|list', '')\n .replace('|html', '')\n .replace('|tag', '')\n .getRegex(),\n};\n\n/**\n * Inline-Level Grammar\n */\n\nconst escape = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nconst inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst br = /^( {2,}|\\\\)\\n(?!\\s*$)[ \\t]*/;\nconst inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\nconst _punctuation = /[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpace = /[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpace = /[^\\s\\p{P}\\p{S}]/u;\nconst punctuation = edit(/^((?![*_])punctSpace)/, 'u')\n .replace(/punctSpace/g, _punctuationOrSpace).getRegex();\n\n/**\n * Opening punct/quotes excluded from pedantic LDelim nextChar so\n * `aa**\"A\"**bb` / `aa**(A)**bb` can start strong (Pi + Ps + ASCII straight quotes).\n */\nconst _openQuote = /[\\p{Pi}\\p{Ps}\"']/u;\n\n// GFM allows ~ inside strong and em for strikethrough\nconst _punctuationGfmStrongEm = /(?!~)[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpaceGfmStrongEm = /(?!~)[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpaceGfmStrongEm = /(?:[^\\s\\p{P}\\p{S}]|~)/u;\n\n// sequences em should skip over [title](link), `code`, <html>\nconst blockSkip = edit(/link|precode-code|html/, 'g')\n .replace('link', /\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/)\n .replace('precode-', supportsLookbehind ? '(?<!`)()' : '(^^|[^`])')\n .replace('code', /(?<b>`+)[^`]+\\k<b>(?!`)/)\n .replace('html', /<(?! )[^<>]*?>/)\n .getRegex();\n\nconst emStrongLDelimCore = /^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/;\n\nconst emStrongLDelim = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongLDelimGfm = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\n// Pedantic: do not treat opening punct/quotes as left-delim punct (e.g. **( / **\").\nconst emStrongLDelimPedanticCore = /^(?:\\*+(?:((?!\\*)(?!openQuote)punct)|([^\\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\\s_]))?/;\n\nconst emStrongLDelimPedantic = edit(emStrongLDelimPedanticCore, 'u')\n .replace(/openQuote/g, _openQuote)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongRDelimAstCore =\n '^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n+ '|[^*]+(?=[^*])' // Consume to delim\n+ '|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)' // (2) a***#, a*** can only be a Right Delimiter\n+ '|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)' // (3) #***a, ***a can only be Left Delimiter\n+ '|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)' // (4) ***# can only be Left Delimiter\n+ '|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)' // (5) #***# can be either Left or Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?=notPunctSpace)'; // (6) a***a can be either Left or Right Delimiter\n\nconst emStrongRDelimAst = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongRDelimAstGfm = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmStrongEm)\n .replace(/punctSpace/g, _punctuationOrSpaceGfmStrongEm)\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\n// Pedantic: rule 3 requires whitespace before left delim; rule 6 allows punct before close (e.g. `:**bar`).\nconst emStrongRDelimAstPedanticCore =\n '^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n+ '|[^*]+(?=[^*])' // Consume to delim\n+ '|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)' // (2) a***#, a*** can only be a Right Delimiter\n+ '|(?!\\\\*)[\\\\s](\\\\*+)(?=notPunctSpace)' // (3) ***a can only be Left Delimiter (whitespace required; not #***a)\n+ '|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)' // (4) ***# can only be Left Delimiter\n+ '|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)' // (5) #***# can be either Left or Right Delimiter\n+ '|(?:(?!\\\\*)punct|notPunctSpace)(\\\\*+)(?!\\\\*)(?=notPunctSpace)'; // (6) a***a, #***a, and :** (e.g. **foo:**bar)\n\nconst emStrongRDelimAstPedantic = edit(emStrongRDelimAstPedanticCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// Normal: no rule 6 for _ (a___a cannot close as emphasis).\nconst emStrongRDelimUnd = edit(\n '^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n+ '|[^_]+(?=[^_])' // Consume to delim\n+ '|(?!_)punct(_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n+ '|notPunctSpace(_+)(?!_)(?=punctSpace|$)' // (2) a___#, a___ can only be a Right Delimiter\n+ '|(?!_)punctSpace(_+)(?=notPunctSpace)' // (3) #___a, ___a can only be Left Delimiter\n+ '|[\\\\s](_+)(?!_)(?=punct)' // (4) ___# can only be Left Delimiter\n+ '|(?!_)punct(_+)(?!_)(?=punct)', 'gu') // (5) #___# can be either Left or Right Delimiter\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// Pedantic: same rule 3/6 adjustments as emStrongRDelimAstPedantic (e.g. `_foo:_bar`).\nconst emStrongRDelimUndPedanticCore =\n '^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n+ '|[^_]+(?=[^_])' // Consume to delim\n+ '|(?!_)punct(_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n+ '|notPunctSpace(_+)(?!_)(?=punctSpace|$)' // (2) a___#, a___ can only be a Right Delimiter\n+ '|(?!_)[\\\\s](_+)(?=notPunctSpace)' // (3) ___a can only be Left Delimiter (whitespace required; not #___a)\n+ '|[\\\\s](_+)(?!_)(?=punct)' // (4) ___# can only be Left Delimiter\n+ '|(?!_)punct(_+)(?!_)(?=punct)' // (5) #___# can be either Left or Right Delimiter\n+ '|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)'; // (6) a___a, #___a, and :__ (e.g. _foo:_bar)\n\nconst emStrongRDelimUndPedantic = edit(emStrongRDelimUndPedanticCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// Tilde left delimiter for strikethrough (similar to emStrongLDelim for asterisk)\nconst delLDelim = edit(/^~~?(?:((?!~)punct)|[^\\s~])/, 'u')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// Tilde delimiter patterns for strikethrough (similar to asterisk)\nconst delRDelimCore =\n '^[^~]+(?=[^~])' // Consume to delim\n+ '|(?!~)punct(~~?)(?=[\\\\s]|$)' // (1) #~~ can only be a Right Delimiter\n+ '|notPunctSpace(~~?)(?!~)(?=punctSpace|$)' // (2) a~~#, a~~ can only be a Right Delimiter\n+ '|(?!~)punctSpace(~~?)(?=notPunctSpace)' // (3) #~~a, ~~a can only be Left Delimiter\n+ '|[\\\\s](~~?)(?!~)(?=punct)' // (4) ~~# can only be Left Delimiter\n+ '|(?!~)punct(~~?)(?!~)(?=punct)' // (5) #~~# can be either Left or Right Delimiter\n+ '|notPunctSpace(~~?)(?=notPunctSpace)'; // (6) a~~a can be either Left or Right Delimiter\n\nconst delRDelim = edit(delRDelimCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst anyPunctuation = edit(/\\\\(punct)/, 'gu')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// `anyPunctuation` for the em/strong mask. A backslash is literal inside a code\n// span, so a code span (matched like `inline.code`), or a backtick run that\n// opens none, is matched whole and kept; only the escapes outside code spans\n// are masked.\nconst anyPunctuationOutsideCode = edit(/(`+)(?:[^`]|[^`][\\s\\S]*?[^`])\\1(?!`)|`+|\\\\(punct)/, 'gu')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst autolink = edit(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/)\n .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/)\n .replace('email', /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/)\n .getRegex();\n\nconst _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();\nconst tag = edit(\n '^comment'\n + '|^</[a-zA-Z][a-zA-Z0-9-]*\\\\s*>' // self-closing tag\n + '|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>') // CDATA section\n .replace('comment', _inlineComment)\n .replace('attribute', /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/)\n .getRegex();\n\n// One matched pair of brackets, holding no bracket of its own.\nconst _inlineLabelBrackets = /\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]/;\n// CommonMark lets the brackets in a link label nest to any depth, which a regex\n// cannot follow, so it stops at a fixed one. Two levels is what the spec suite\n// asks for: a third and a fourth flip no further example.\nconst _inlineLabel = edit(/(?:\\[(?:brackets|\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/)\n .replace('brackets', _inlineLabelBrackets)\n .getRegex();\n\nconst link = edit(/^!?\\[(label)\\]\\([ \\t\\n]*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?[ \\t\\n]*\\)/)\n .replace('label', _inlineLabel)\n .replace('href', /<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]+|(?=\\))/)\n .replace('title', /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/)\n .getRegex();\n\nconst reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n .replace('label', _inlineLabel)\n .replace('ref', _blockLabel)\n .getRegex();\n\nconst nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n .replace('ref', _blockLabel)\n .getRegex();\n\n// `reflink` and `nolink` are anchored, so the tokenizer tries each of them at a\n// single position. `reflinkSearch` drops the anchors and runs with the global\n// flag, which makes every '[' in the source a start position. A label crosses a\n// bracket only by escaping it, and nothing caps how often it does, so a\n// candidate that can never match still scans to the end of the source and the\n// whole pass costs O(n^2).\n//\n// The labels below bound that scan. `_boundedInlineLabel` limits how many\n// escapes, code spans and nested brackets a link text may hold, leaving runs of\n// ordinary characters unbounded so link text of any length is still found.\n// `_boundedBlockLabel` limits the label itself to 999 items, which is every\n// label CommonMark allows: \"A link label can have at most 999 characters\n// inside the square brackets.\"\nconst _boundedBlockLabel = /(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\]){1,999}/;\nconst _boundedInlineLabel = edit(/(?:[^\\[\\]\\\\`]*(?:\\[(?:brackets|\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\]))){0,999}?[^\\[\\]\\\\`]*?/)\n .replace('brackets', _inlineLabelBrackets)\n .getRegex();\n\nconst reflinkSearch = edit('reflink|nolink(?!\\\\()', 'g')\n .replace('reflink', edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n .replace('label', _boundedInlineLabel)\n .replace('ref', _boundedBlockLabel)\n .getRegex())\n .replace('nolink', edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n .replace('ref', _boundedBlockLabel)\n .getRegex())\n .getRegex();\n\nconst _caseInsensitiveProtocol = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/;\nconst _extendedEmail = /[A-Za-z0-9._+-]+@[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\\w-])/;\nconst _extendedEmailProtocol = edit(/(?:mailto:email|xmpp:email(?:\\/[A-Za-z0-9@.]+)?)/)\n .replace(/email/g, _extendedEmail)\n .getRegex();\n\n/**\n * Normal Inline Grammar\n */\n\nconst inlineNormal = {\n _backpedal: noopTest, // only used for GFM url\n anyPunctuation,\n anyPunctuationOutsideCode,\n autolink,\n blockSkip,\n br,\n code: inlineCode,\n del: noopTest,\n delLDelim: noopTest,\n delRDelim: noopTest,\n emStrongLDelim,\n emStrongRDelimAst,\n emStrongRDelimUnd,\n escape,\n link,\n nolink,\n punctuation,\n reflink,\n reflinkSearch,\n tag,\n text: inlineText,\n url: noopTest,\n};\n\ntype InlineKeys = keyof typeof inlineNormal;\n\n/**\n * Pedantic Inline Grammar\n */\n\nconst inlinePedantic: Record<InlineKeys, RegExp> = {\n ...inlineNormal,\n emStrongLDelim: emStrongLDelimPedantic,\n emStrongRDelimAst: emStrongRDelimAstPedantic,\n emStrongRDelimUnd: emStrongRDelimUndPedantic,\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', _inlineLabel)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', _inlineLabel)\n .getRegex(),\n};\n\n/**\n * GFM Inline Grammar\n */\n\nconst inlineGfm: Record<InlineKeys, RegExp> = {\n ...inlineNormal,\n emStrongRDelimAst: emStrongRDelimAstGfm,\n emStrongLDelim: emStrongLDelimGfm,\n delLDelim,\n delRDelim,\n url: edit(/^emailProtocol|^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/)\n .replace('emailProtocol', _extendedEmailProtocol)\n .replace('protocol', _caseInsensitiveProtocol)\n .replace('email', /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\\w-])/)\n .getRegex(),\n _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n del: /^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,\n text: edit(/^(?:[^a-zA-Z0-9](?=emailProtocol)|(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9](?=emailProtocol)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@))))/)\n .replace('protocol', _caseInsensitiveProtocol)\n .replace(/emailProtocol/g, /(?:mailto|xmpp):/)\n .getRegex(),\n};\n\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\nconst inlineBreaks: Record<InlineKeys, RegExp> = {\n ...inlineGfm,\n br: edit(br).replace('{2,}', '*').getRegex(),\n text: edit(inlineGfm.text)\n .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n .replace(/\\{2,\\}/g, '*')\n .getRegex(),\n};\n\n/**\n * exports\n */\n\nexport const block = {\n normal: blockNormal,\n gfm: blockGfm,\n pedantic: blockPedantic,\n};\n\nexport const inline = {\n normal: inlineNormal,\n gfm: inlineGfm,\n breaks: inlineBreaks,\n pedantic: inlinePedantic,\n};\n\nexport interface Rules {\n other: typeof other\n block: Record<BlockKeys, RegExp>\n inline: Record<InlineKeys, RegExp>\n}\n", "import { other } from './rules.ts';\n\n/**\n * Helpers\n */\nconst escapeReplacements: { [index: string]: string } = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\nconst getEscapeReplacement = (ch: string) => escapeReplacements[ch];\n\nexport function escapeHtmlEntities(html: string, encode?: boolean) {\n if (encode) {\n if (other.escapeTest.test(html)) {\n return html.replace(other.escapeReplace, getEscapeReplacement);\n }\n } else {\n if (other.escapeTestNoEncode.test(html)) {\n return html.replace(other.escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n\n return html;\n}\n\n/**\n * Numeric character references are recognized outside code and are equivalent to the\n * character they name. Values that are zero, out of range, or a surrogate become the\n * replacement character.\n */\nexport function decodeNumericCharacterReferences(text: string) {\n if (!other.numericCharacterReference.test(text)) {\n return text;\n }\n // A decoded character must not join its neighbours into a new reference,\n // so every `&` that is not already one is escaped here.\n return text.replace(other.numericCharacterReferenceOrAmpersand, (ref: string, dec?: string, hex?: string) => {\n if (dec === undefined && hex === undefined) {\n return '&amp;';\n }\n const code = dec === undefined ? Number.parseInt(hex!, 16) : Number.parseInt(dec, 10);\n if (code === 0 || code > 0x10ffff || (code >= 0xd800 && code <= 0xdfff)) {\n return '\uFFFD';\n }\n return code === 38 ? '&amp;' : String.fromCodePoint(code);\n });\n}\n\nexport function cleanUrl(href: string) {\n try {\n href = encodeURI(href).replace(other.percentDecode, '%');\n } catch {\n return null;\n }\n return href;\n}\n\nexport function splitCells(tableRow: string, count?: number) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n const row = tableRow.replace(other.findPipe, (match, offset, str) => {\n let escaped = false;\n let curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n } else {\n // add space before unescaped |\n return ' |';\n }\n }),\n cells = row.split(other.splitPipe);\n let i = 0;\n\n // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n if (!cells[0].trim()) {\n cells.shift();\n }\n if (cells.length > 0 && !cells.at(-1)?.trim()) {\n cells.pop();\n }\n\n if (count) {\n if (cells.length > count) {\n cells.splice(count);\n } else {\n while (cells.length < count) cells.push('');\n }\n }\n\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(other.slashPipe, '|');\n }\n return cells;\n}\n\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nexport function rtrim(str: string, c: string, invert?: boolean) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n const currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n } else if (currChar !== c && invert) {\n suffLen++;\n } else {\n break;\n }\n }\n\n return str.slice(0, l - suffLen);\n}\n\nexport function trimTrailingBlankLines(str: string) {\n const lines = str.split('\\n');\n let end = lines.length - 1;\n while (end >= 0 && other.blankLine.test(lines[end])) {\n end--;\n }\n if (lines.length - end <= 2) {\n // we want to keep single trailing blank lines\n return str;\n }\n\n return lines.slice(0, end + 1).join('\\n');\n}\n\n/**\n * Normalizes a link label so definitions and references can be matched.\n * CommonMark asks for a Unicode case fold, which `toLowerCase()` does not\n * reach: `\u1E9E` lowercases to `\u00DF` and so never meets `SS`. Round-tripping\n * through upper case does, as in commonmark.js; the final `toLowerCase()`\n * keeps the folded label lower case, the form `def.tag` has always used.\n */\nexport function normalizeLabel(label: string) {\n // The spec also asks for leading and trailing spaces, tabs and line endings\n // to be stripped. Doing it here keeps every call site in agreement: the\n // definition and the reference have to normalize to the same key.\n return label.trim().toLowerCase().toUpperCase().toLowerCase();\n}\n\nexport function findClosingBracket(str: string, b: string) {\n // an opening bracket on its own is still unbalanced, so both have to be absent\n if (str.indexOf(b[0]) === -1 && str.indexOf(b[1]) === -1) {\n return -1;\n }\n\n let level = 0;\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '\\\\') {\n i++;\n } else if (str[i] === b[0]) {\n level++;\n } else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n if (level > 0) {\n return -2;\n }\n\n return -1;\n}\n\nexport function expandTabs(line: string, indent = 0) {\n let col = indent;\n let expanded = '';\n for (const char of line) {\n if (char === '\\t') {\n const added = 4 - (col % 4);\n expanded += ' '.repeat(added);\n col += added;\n } else {\n expanded += char;\n col++;\n }\n }\n\n return expanded;\n}\n", "import { _defaults } from './defaults.ts';\nimport {\n rtrim,\n splitCells,\n findClosingBracket,\n expandTabs,\n normalizeLabel,\n decodeNumericCharacterReferences,\n trimTrailingBlankLines,\n} from './helpers.ts';\nimport type { Rules } from './rules.ts';\nimport type { _Lexer } from './Lexer.ts';\nimport type { Links, Tokens, Token } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\nfunction outputLink(cap: string[], link: Pick<Tokens.Link, 'href' | 'title'>, raw: string, lexer: _Lexer, rules: Rules): Tokens.Link | Tokens.Image | undefined {\n const href = link.href;\n const title = link.title || null;\n const text = cap[1].replace(rules.other.outputLinkReplace, '$1');\n const isImage = cap[0].charAt(0) === '!';\n\n const outerInLink = lexer.state.inLink;\n const outerLinkEmitted = lexer.state.linkEmitted;\n const outerInRawBlock = lexer.state.inRawBlock;\n lexer.state.inLink = true;\n lexer.state.linkEmitted = false;\n const tokens = lexer.inlineTokens(text);\n const textHasLink = lexer.state.linkEmitted;\n lexer.state.linkEmitted = outerLinkEmitted;\n lexer.state.inLink = outerInLink;\n\n if (!isImage) {\n // CommonMark: \"Links may not contain other links, at any level of nesting.\"\n // Bail so the caller falls through to text and the inner link is the one kept.\n // Images are exempt: their text is flattened into an alt attribute.\n if (textHasLink) {\n // these tokens are discarded, so undo the raw-block state they opened;\n // leaving it set would suppress escaping for the text that is re-scanned\n lexer.state.inRawBlock = outerInRawBlock;\n return;\n }\n lexer.state.linkEmitted = true;\n }\n\n return {\n type: isImage ? 'image' : 'link',\n raw,\n href,\n title,\n text,\n tokens,\n };\n}\n\nfunction indentCodeCompensation(raw: string, text: string, rules: Rules) {\n const matchIndentToCode = raw.match(rules.other.indentCodeCompensation);\n\n if (matchIndentToCode === null) {\n return text;\n }\n\n const indentToCode = matchIndentToCode[1];\n\n return text\n .split('\\n')\n .map(node => {\n const matchIndentInNode = node.match(rules.other.beginningSpace);\n if (matchIndentInNode === null) {\n return node;\n }\n\n const [indentInNode] = matchIndentInNode;\n\n // Up to the fence's own indentation is removed from each line, so a line\n // indented less than the fence loses whatever indentation it has.\n return node.slice(Math.min(indentInNode.length, indentToCode.length));\n })\n .join('\\n');\n}\n\nfunction isLabelEndInsideToken(src: string, label: string, labelStart: number, rules: Rules) {\n if (!label.includes('<')) {\n return false;\n }\n\n for (let i = 0; i < label.length; i++) {\n if (label[i] === '\\\\') {\n i++;\n continue;\n }\n\n if (label[i] === '`') {\n const code = rules.inline.code.exec(label.slice(i));\n if (code) {\n i += code[0].length - 1;\n continue;\n }\n }\n\n if (label[i] !== '<') {\n continue;\n }\n\n const tokenSrc = src.slice(labelStart + i);\n const token = rules.inline.tag.exec(tokenSrc) || rules.inline.autolink.exec(tokenSrc);\n if (!token) {\n continue;\n }\n\n if (token[0].length > label.length - i) {\n return true;\n }\n i += token[0].length - 1;\n }\n return false;\n}\n\n/**\n * Tokenizer\n */\nexport class _Tokenizer<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n rules!: Rules; // set by the lexer\n lexer!: _Lexer<ParserOutput, RendererOutput>; // set by the lexer\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n space(src: string): Tokens.Space | undefined {\n const cap = this.rules.block.newline.exec(src);\n if (cap && cap[0].length > 0) {\n return {\n type: 'space',\n raw: cap[0],\n };\n }\n }\n\n code(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.code.exec(src);\n if (cap) {\n const raw = this.options.pedantic\n ? cap[0]\n : trimTrailingBlankLines(cap[0]);\n const text = raw.replace(this.rules.other.codeRemoveIndent, '');\n return {\n type: 'code',\n raw,\n codeBlockStyle: 'indented',\n text,\n };\n }\n }\n\n fences(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.fences.exec(src);\n if (cap) {\n const raw = cap[0];\n const text = indentCodeCompensation(raw, cap[3] || '', this.rules);\n\n return {\n type: 'code',\n raw,\n lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2],\n text,\n };\n }\n }\n\n heading(src: string): Tokens.Heading | undefined {\n const cap = this.rules.block.heading.exec(src);\n if (cap) {\n let text = cap[2].trim();\n\n // remove trailing #s\n if (this.rules.other.endingHash.test(text)) {\n const trimmed = rtrim(text, '#');\n if (this.options.pedantic) {\n text = trimmed.trim();\n } else if (!trimmed || this.rules.other.endingSpaceTabChar.test(trimmed)) {\n // CommonMark requires a space or tab before trailing #s\n text = trimmed.trim();\n }\n }\n\n return {\n type: 'heading',\n raw: rtrim(cap[0], '\\n'),\n depth: cap[1].length,\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n hr(src: string): Tokens.Hr | undefined {\n const cap = this.rules.block.hr.exec(src);\n if (cap) {\n return {\n type: 'hr',\n raw: rtrim(cap[0], '\\n'),\n };\n }\n }\n\n blockquote(src: string): Tokens.Blockquote | undefined {\n const cap = this.rules.block.blockquote.exec(src);\n if (cap) {\n let lines = rtrim(cap[0], '\\n').split('\\n');\n let raw = '';\n let text = '';\n const tokens: Token[] = [];\n\n while (lines.length > 0) {\n let inBlockquote = false;\n const currentLines = [];\n\n let i;\n for (i = 0; i < lines.length; i++) {\n // get lines up to a continuation\n if (this.rules.other.blockquoteStart.test(lines[i])) {\n currentLines.push(lines[i]);\n inBlockquote = true;\n } else if (!inBlockquote) {\n currentLines.push(lines[i]);\n } else {\n break;\n }\n }\n lines = lines.slice(i);\n\n const currentRaw = currentLines.join('\\n');\n const currentText = currentRaw\n // precede setext continuation with 4 spaces so it isn't a setext\n .replace(this.rules.other.blockquoteSetextReplace, '\\n $1')\n .replace(this.rules.other.blockquoteSetextReplace2, '');\n raw = raw ? `${raw}\\n${currentRaw}` : currentRaw;\n text = text ? `${text}\\n${currentText}` : currentText;\n\n // parse blockquote lines as top level tokens\n // merge paragraphs if this is a continuation\n const top = this.lexer.state.top;\n this.lexer.state.top = true;\n this.lexer.blockTokens(currentText, tokens, true);\n this.lexer.state.top = top;\n\n // if there is no continuation then we are done\n if (lines.length === 0) {\n break;\n }\n\n const lastToken = tokens.at(-1);\n\n if (lastToken?.type === 'code' || lastToken?.type === 'heading' || lastToken?.type === 'hr' || lastToken?.type === 'html') {\n // blockquote continuation cannot be preceded by a code block, heading, hr or html block\n break;\n } else if (lastToken?.type === 'blockquote') {\n // include continuation in nested blockquote\n const oldToken = lastToken as Tokens.Blockquote;\n // The continuation lines belong to the same nesting frame as the\n // nested blockquote, which already had one '>' marker stripped, so\n // strip one marker from them too. Otherwise a restated marker after a\n // lazy line is re-parsed as a spurious deeper blockquote.\n const continuation = lines.join('\\n');\n const newText = oldToken.raw + '\\n' + continuation.replace(this.rules.other.blockquoteSetextReplace2, '');\n const newToken = this.blockquote(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n // Only include continuation lines the nested blockquote actually\n // consumed. Unconsumed trailing lines must stay out of `raw` so the\n // lexer can still tokenize them (paragraph, next blockquote, etc.).\n const leftover = newText.substring(newToken.raw.length).replace(/^\\n/, '');\n const leftoverCount = leftover ? leftover.split('\\n').length : 0;\n const consumed = leftoverCount ? lines.slice(0, -leftoverCount) : lines;\n if (consumed.length > 0) {\n raw = `${raw}\\n${consumed.join('\\n')}`;\n }\n text = text.substring(0, text.length - oldToken.text.length) + newToken.text;\n break;\n } else if (lastToken?.type === 'list') {\n // include continuation in nested list\n const oldToken = lastToken as Tokens.List;\n const newText = oldToken.raw + '\\n' + lines.join('\\n');\n const newToken = this.list(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;\n text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;\n lines = newText.substring(tokens.at(-1)!.raw.length).split('\\n');\n continue;\n }\n }\n\n return {\n type: 'blockquote',\n raw,\n tokens,\n text,\n };\n }\n }\n\n list(src: string): Tokens.List | undefined {\n let cap = this.rules.block.list.exec(src);\n if (cap) {\n // src is only consumed from the front, so every raw below is a slice of\n // listSrc rather than a string built up line by line\n const listSrc = src;\n const taken = () => listSrc.length - src.length;\n let bull = cap[1].trim();\n const isordered = bull.length > 1;\n\n const list: Tokens.List = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: [],\n };\n\n bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n }\n\n // Get next list item\n const itemRegex = this.rules.other.listItemRegex(bull);\n let endsWithBlankLine = false;\n // Check if current bullet point can start a new List Item\n while (src) {\n let endEarly = false;\n let itemContents = '';\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n\n if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n break;\n }\n\n const itemStart = taken();\n src = src.substring(cap[0].length);\n\n const firstLine = cap[2].split('\\n', 1)[0];\n const bulletIndent = cap[1].length;\n let line = this.options.pedantic\n ? expandTabs(firstLine, bulletIndent)\n : firstLine.replace(this.rules.other.leadingSpaceTab, whitespace => expandTabs(whitespace, bulletIndent));\n let nextLine = src.split('\\n', 1)[0];\n let blankLine = !line.trim();\n\n let indent = 0;\n if (this.options.pedantic) {\n indent = 2;\n itemContents = line.trimStart();\n } else if (blankLine) {\n indent = bulletIndent + 1;\n } else {\n indent = line.search(this.rules.other.nonSpaceChar); // Find first non-space char\n indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n itemContents = line.slice(indent);\n indent += bulletIndent;\n }\n\n if (blankLine && this.rules.other.blankLine.test(nextLine)) { // Items begin with at most one blank line\n src = src.substring(nextLine.length + 1);\n endEarly = true;\n }\n\n if (!endEarly) {\n const nextBulletRegex = this.rules.other.nextBulletRegex(indent);\n const hrRegex = this.rules.other.hrRegex(indent);\n const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent);\n const headingBeginRegex = this.rules.other.headingBeginRegex(indent);\n const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent);\n const blockquoteBeginRegex = this.rules.other.blockquoteBeginRegex(indent);\n\n // Check if following lines should be included in List Item\n while (src) {\n const rawLine = src.split('\\n', 1)[0];\n let nextLineWithoutTabs;\n nextLine = rawLine;\n\n // Re-align to follow commonmark nesting rules\n if (this.options.pedantic) {\n nextLine = nextLine.replace(this.rules.other.listReplaceNesting, ' ');\n nextLineWithoutTabs = nextLine;\n } else {\n nextLineWithoutTabs = nextLine.replace(this.rules.other.leadingSpaceTab, whitespace => expandTabs(whitespace));\n }\n\n // End list item if found code fences\n if (fencesBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new heading\n if (headingBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of html block\n if (htmlBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of blockquote\n if (blockquoteBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new bullet\n if (nextBulletRegex.test(nextLine)) {\n break;\n }\n\n // Horizontal rule found\n if (hrRegex.test(nextLine)) {\n break;\n }\n\n if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) { // Dedent if possible\n itemContents += '\\n' + nextLineWithoutTabs.slice(indent);\n } else {\n // not enough indentation\n if (blankLine) {\n break;\n }\n\n // paragraph continuation unless last line was a different block level element\n if (line.replace(this.rules.other.tabCharGlobal, ' ').search(this.rules.other.nonSpaceChar) >= 4) { // indented code block\n break;\n }\n if (fencesBeginRegex.test(line)) {\n break;\n }\n if (headingBeginRegex.test(line)) {\n break;\n }\n if (hrRegex.test(line)) {\n break;\n }\n\n itemContents += '\\n' + nextLine;\n }\n\n blankLine = !nextLine.trim();\n\n src = src.substring(rawLine.length + 1);\n line = nextLineWithoutTabs.slice(indent);\n }\n }\n\n // The loops above appended a '\\n' the source may not have had. It could\n // only land on the item that exhausts src, whose raw is trimmed below,\n // and after which nothing reads endsWithBlankLine\n const raw = listSrc.slice(itemStart, taken());\n\n if (!list.loose) {\n // If the previous item ended with a blank line, the list is loose\n if (endsWithBlankLine) {\n list.loose = true;\n } else if (this.rules.other.doubleBlankLine.test(raw)) {\n endsWithBlankLine = true;\n }\n }\n\n list.items.push({\n type: 'list_item',\n raw,\n task: !!this.options.gfm && this.rules.other.listIsTask.test(itemContents),\n loose: false,\n text: itemContents,\n tokens: [],\n });\n }\n\n // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n const lastItem = list.items.at(-1);\n if (lastItem) {\n lastItem.raw = lastItem.raw.trimEnd();\n lastItem.text = lastItem.text.trimEnd();\n } else {\n // not a list since there were no items\n return;\n }\n list.raw = listSrc.slice(0, taken()).trimEnd();\n\n // Item child tokens handled here at end because we needed to have the final item to trim it first\n // First pass: tokenize items and finalize list.loose from spacers before placing checkboxes\n for (const item of list.items) {\n this.lexer.state.top = false;\n item.tokens = this.lexer.blockTokens(item.text, []);\n\n if (!list.loose) {\n // Check if list should be loose\n const spacers = item.tokens.filter(t => t.type === 'space');\n const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => this.rules.other.anyLine.test(t.raw));\n\n list.loose = hasMultipleLineBreaks;\n }\n }\n\n // Second pass: place task checkboxes using the final list.loose\n for (const item of list.items) {\n const itemToken = item.tokens[0];\n if (item.task && (itemToken?.type === 'text' || itemToken?.type === 'paragraph')) {\n // Remove checkbox markdown from item tokens\n item.text = item.text.replace(this.rules.other.listReplaceTask, '');\n itemToken.raw = itemToken.raw.replace(this.rules.other.listReplaceTask, '');\n itemToken.text = itemToken.text.replace(this.rules.other.listReplaceTask, '');\n for (let i = this.lexer.inlineQueue.length - 1; i >= 0; i--) {\n if (this.rules.other.listIsTask.test(this.lexer.inlineQueue[i].src)) {\n this.lexer.inlineQueue[i].src = this.lexer.inlineQueue[i].src.replace(this.rules.other.listReplaceTask, '');\n break;\n }\n }\n\n const taskRaw = this.rules.other.listTaskCheckbox.exec(item.raw);\n if (taskRaw) {\n const checkboxToken: Tokens.Checkbox = {\n type: 'checkbox',\n raw: taskRaw[0] + ' ',\n checked: taskRaw[0] !== '[ ]',\n };\n item.checked = checkboxToken.checked;\n if (list.loose) {\n if (item.tokens[0] && ['paragraph', 'text'].includes(item.tokens[0].type) && 'tokens' in item.tokens[0] && item.tokens[0].tokens) {\n item.tokens[0].raw = checkboxToken.raw + item.tokens[0].raw;\n item.tokens[0].text = checkboxToken.raw + item.tokens[0].text;\n item.tokens[0].tokens.unshift(checkboxToken);\n } else {\n item.tokens.unshift({\n type: 'paragraph',\n raw: checkboxToken.raw,\n text: checkboxToken.raw,\n tokens: [checkboxToken],\n });\n }\n } else {\n item.tokens.unshift(checkboxToken);\n }\n }\n } else if (item.task) {\n item.task = false;\n }\n }\n\n // Set all items to loose if list is loose\n if (list.loose) {\n for (const item of list.items) {\n item.loose = true;\n for (const token of item.tokens) {\n if (token.type === 'text') {\n token.type = 'paragraph';\n }\n }\n }\n }\n\n return list;\n }\n }\n\n html(src: string): Tokens.HTML | undefined {\n const cap = this.rules.block.html.exec(src);\n if (cap) {\n const raw = trimTrailingBlankLines(cap[0]);\n const token: Tokens.HTML = {\n type: 'html',\n block: true,\n raw,\n pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n text: raw,\n };\n return token;\n }\n }\n\n def(src: string): Tokens.Def | undefined {\n const cap = this.rules.block.def.exec(src);\n if (cap) {\n // outside angle brackets a link destination holds only balanced parentheses\n if (!this.rules.other.startAngleBracket.test(cap[2]) && findClosingBracket(cap[2], '()') !== -1) {\n return;\n }\n\n const tag = normalizeLabel(cap[1]).replace(this.rules.other.multipleSpaceGlobal, ' ');\n const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, '$1').replace(this.rules.inline.anyPunctuation, '$1') : '';\n const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3];\n return {\n type: 'def',\n tag,\n raw: rtrim(cap[0], '\\n'),\n href,\n title,\n };\n }\n }\n\n table(src: string): Tokens.Table | undefined {\n const cap = this.rules.block.table.exec(src);\n if (!cap) {\n return;\n }\n\n if (!this.rules.other.tableDelimiter.test(cap[2])) {\n // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n return;\n }\n\n const headers = splitCells(cap[1]);\n const aligns = cap[2].replace(this.rules.other.tableAlignChars, '').split('|');\n const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, '').split('\\n') : [];\n\n const item: Tokens.Table = {\n type: 'table',\n raw: rtrim(cap[0], '\\n'),\n header: [],\n align: [],\n rows: [],\n };\n\n if (headers.length !== aligns.length) {\n // header and align columns must be equal, rows can be different.\n return;\n }\n\n for (const align of aligns) {\n if (this.rules.other.tableAlignRight.test(align)) {\n item.align.push('right');\n } else if (this.rules.other.tableAlignCenter.test(align)) {\n item.align.push('center');\n } else if (this.rules.other.tableAlignLeft.test(align)) {\n item.align.push('left');\n } else {\n item.align.push(null);\n }\n }\n\n for (let i = 0; i < headers.length; i++) {\n item.header.push({\n text: headers[i],\n tokens: this.lexer.inline(headers[i]),\n header: true,\n align: item.align[i],\n });\n }\n\n for (const row of rows) {\n item.rows.push(splitCells(row, item.header.length).map((cell, i) => {\n return {\n text: cell,\n tokens: this.lexer.inline(cell),\n header: false,\n align: item.align[i],\n };\n }));\n }\n\n return item;\n }\n\n lheading(src: string): Tokens.Heading | undefined {\n const cap = this.rules.block.lheading.exec(src);\n if (cap) {\n const text = cap[1].trim();\n return {\n type: 'heading',\n raw: rtrim(cap[0], '\\n'),\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n paragraph(src: string): Tokens.Paragraph | undefined {\n const cap = this.rules.block.paragraph.exec(src);\n if (cap) {\n const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1];\n return {\n type: 'paragraph',\n raw: cap[0],\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n text(src: string): Tokens.Text | undefined {\n const cap = this.rules.block.text.exec(src);\n if (cap) {\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n tokens: this.lexer.inline(cap[0]),\n };\n }\n }\n\n escape(src: string): Tokens.Escape | undefined {\n const cap = this.rules.inline.escape.exec(src);\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: cap[1],\n };\n }\n }\n\n tag(src: string): Tokens.Tag | undefined {\n const cap = this.rules.inline.tag.exec(src);\n if (cap) {\n if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) {\n this.lexer.state.inLink = true;\n } else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n } else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\n\n return {\n type: 'html',\n raw: cap[0],\n inLink: this.lexer.state.inLink,\n inRawBlock: this.lexer.state.inRawBlock,\n block: false,\n text: cap[0],\n };\n }\n }\n\n link(src: string): Tokens.Link | Tokens.Image | undefined {\n // The link regex backtracks quadratically over unterminated-link inputs\n // like '[a](b'.repeat(n): at every '[' its greedy unquoted-href run\n // re-partitions the whole remainder while hunting for a ')' that never\n // comes. inlineTokens anchors one paren scan per run in\n // state.linkParenPossible; when it is false the regex cannot match, so\n // bail out before running it.\n if (this.lexer.state.linkParenPossible === false) {\n return undefined;\n }\n const cap = this.rules.inline.link.exec(src);\n if (cap) {\n const labelStart = cap[0].charAt(0) === '!' ? 2 : 1;\n if (!this.options.pedantic && isLabelEndInsideToken(src, cap[1], labelStart, this.rules)) {\n return;\n }\n\n const trimmedUrl = cap[2].trim();\n if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) {\n // commonmark requires matching angle brackets\n if (!(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n return;\n }\n\n // ending angle bracket cannot be escaped\n const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n return;\n }\n } else {\n // find closing parenthesis\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex === -2) {\n // more open parens than closed\n return;\n }\n\n if (lastParenIndex > -1) {\n const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n const linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n }\n let href = cap[2];\n let title = '';\n if (this.options.pedantic) {\n // split pedantic href and title\n const link = this.rules.other.pedanticHrefTitle.exec(href);\n\n if (link) {\n href = link[1];\n title = link[3];\n }\n } else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n\n href = href.trim();\n if (this.rules.other.startAngleBracket.test(href)) {\n if (this.options.pedantic && !(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\n } else {\n href = href.slice(1, -1);\n }\n }\n return outputLink(cap, {\n href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href,\n title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title,\n }, cap[0], this.lexer, this.rules);\n }\n }\n\n reflink(src: string, links: Links): Tokens.Link | Tokens.Image | Tokens.Text | undefined {\n let cap;\n if ((cap = this.rules.inline.reflink.exec(src))\n || (cap = this.rules.inline.nolink.exec(src))) {\n const labelStart = cap[0].charAt(0) === '!' ? 2 : 1;\n if (!this.options.pedantic && isLabelEndInsideToken(src, cap[1], labelStart, this.rules)) {\n return;\n }\n\n const linkString = (cap[2] || cap[1]).replace(this.rules.other.multipleSpaceGlobal, ' ');\n const link = links[normalizeLabel(linkString)];\n if (!link) {\n const text = cap[0].charAt(0);\n return {\n type: 'text',\n raw: text,\n text,\n };\n }\n return outputLink(cap, link, cap[0], this.lexer, this.rules);\n }\n }\n\n emStrong(src: string, maskedSrc: string, prevChar = ''): Tokens.Em | Tokens.Strong | undefined {\n let match = this.rules.inline.emStrongLDelim.exec(src);\n if (!match) return;\n if (!match[1] && !match[2] && !match[3] && !match[4]) return;\n\n // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n if (match[4] && prevChar.match(this.rules.other.unicodeAlphaNumeric)) return;\n\n const nextChar = match[1] || match[3] || '';\n\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n\n const delimChar = match[0][0];\n // A mid-run opener (for example the second star of an unmatched `**`) must\n // only pair with a delimiter that can only close, otherwise it steals the\n // opener of a later span (`**a*b*c` must be `**a<em>b</em>c`).\n const midRun = prevChar === delimChar;\n const endReg = delimChar === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src (move to lexer?)\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) !== null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue; // skip single * in __abc*abc__\n\n rLength = [...rDelim].length;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n } else if (match[5] || match[6]) { // either Left or Right Delim\n if (lLength % 3 && !((lLength + rLength) % 3)) {\n midDelimTotal += rLength;\n continue; // CommonMark Emphasis Rules 9-10\n }\n if (midRun) {\n // A mid-run opener cannot close against an ambiguous delimiter that\n // can also open; that delimiter opens its own emphasis span instead.\n break;\n }\n }\n\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters. *a*** -> *a*\n rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n // char length can be >1 for unicode characters;\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n\n // Create `em` if smallest delimiter has odd char count. *a***\n if (Math.min(lLength, rLength) % 2) {\n const text = raw.slice(1, -1);\n return {\n type: 'em',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n\n // Create 'strong' if smallest delimiter has even char count. **a***\n const text = raw.slice(2, -2);\n return {\n type: 'strong',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n }\n }\n\n codespan(src: string): Tokens.Codespan | undefined {\n const cap = this.rules.inline.code.exec(src);\n if (cap) {\n let text = cap[2].replace(this.rules.other.newLineCharGlobal, ' ');\n const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text);\n const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n return {\n type: 'codespan',\n raw: cap[0],\n text,\n };\n }\n }\n\n br(src: string): Tokens.Br | undefined {\n const cap = this.rules.inline.br.exec(src);\n if (cap) {\n return {\n type: 'br',\n raw: cap[0],\n };\n }\n }\n\n del(src: string, maskedSrc: string, prevChar = ''): Tokens.Del | undefined {\n let match = this.rules.inline.delLDelim.exec(src);\n if (!match) return;\n\n const nextChar = match[1] || '';\n\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength;\n\n const endReg = this.rules.inline.delRDelim;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) !== null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue;\n\n rLength = [...rDelim].length;\n\n if (rLength !== lLength) continue;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n }\n\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters\n rLength = Math.min(rLength, rLength + delimTotal);\n // char length can be >1 for unicode characters\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n\n // Create del token - only single ~ or double ~~ supported\n const text = raw.slice(lLength, -lLength);\n return {\n type: 'del',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n }\n }\n\n autolink(src: string): Tokens.Link | undefined {\n const cap = this.rules.inline.autolink.exec(src);\n if (cap) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[1];\n href = 'mailto:' + text;\n } else {\n text = cap[1];\n href = text;\n }\n\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n autolink: true,\n tokens: [\n {\n type: 'text',\n raw: text,\n text,\n },\n ],\n };\n }\n }\n\n url(src: string): Tokens.Link | undefined {\n let cap;\n if (cap = this.rules.inline.url.exec(src)) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[0];\n href = 'mailto:' + text;\n } else {\n // do extended autolink path validation\n let prevCapZero;\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';\n } while (prevCapZero !== cap[0]);\n text = cap[0];\n if (cap[1] === 'www.') {\n href = 'http://' + cap[0];\n } else {\n href = cap[0];\n }\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n autolink: true,\n tokens: [\n {\n type: 'text',\n raw: text,\n text,\n },\n ],\n };\n }\n }\n\n inlineText(src: string): Tokens.Text | undefined {\n const cap = this.rules.inline.text.exec(src);\n if (cap) {\n const escaped = this.lexer.state.inRawBlock;\n return {\n type: 'text',\n raw: cap[0],\n // raw HTML keeps whatever it was written with, everywhere else a numeric\n // character reference stands for the character itself\n text: escaped ? cap[0] : decodeNumericCharacterReferences(cap[0]),\n escaped,\n };\n }\n }\n}\n", "import { _Tokenizer } from './Tokenizer.ts';\nimport { _defaults } from './defaults.ts';\nimport { other, block, inline } from './rules.ts';\nimport { normalizeLabel } from './helpers.ts';\nimport type { Token, TokensList, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Block Lexer\n */\nexport class _Lexer<ParserOutput = string, RendererOutput = string> {\n tokens: TokensList;\n options: MarkedOptions<ParserOutput, RendererOutput>;\n state: {\n inLink: boolean;\n inRawBlock: boolean;\n /** a link was produced in the inline run currently being scanned */\n linkEmitted: boolean;\n /**\n * false while scanning an inline run whose source contains no ')',\n * letting Tokenizer.link bail out before its quadratic backtracking.\n * Anchored once per run by inlineTokens.\n */\n linkParenPossible: boolean;\n top: boolean;\n };\n\n public inlineQueue: { src: string, tokens: Token[] }[];\n\n private tokenizer: _Tokenizer<ParserOutput, RendererOutput>;\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n // TokenList cannot be created in one go\n this.tokens = [] as unknown as TokensList;\n this.tokens.links = Object.create(null);\n this.options = options || _defaults;\n this.options.tokenizer = this.options.tokenizer || new _Tokenizer<ParserOutput, RendererOutput>();\n this.tokenizer = this.options.tokenizer;\n this.tokenizer.options = this.options;\n this.tokenizer.lexer = this;\n this.inlineQueue = [];\n this.state = {\n inLink: false,\n inRawBlock: false,\n linkEmitted: false,\n linkParenPossible: true,\n top: true,\n };\n\n const rules = {\n other,\n block: block.normal,\n inline: inline.normal,\n };\n\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n } else if (this.options.gfm) {\n rules.block = block.gfm;\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n } else {\n rules.inline = inline.gfm;\n }\n }\n this.tokenizer.rules = rules;\n }\n\n /**\n * Expose Rules\n */\n static get rules() {\n return {\n block,\n inline,\n };\n }\n\n /**\n * Static Lex Method\n */\n static lex<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const lexer = new _Lexer<ParserOutput, RendererOutput>(options);\n return lexer.lex(src);\n }\n\n /**\n * Static Lex Inline Method\n */\n static lexInline<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const lexer = new _Lexer<ParserOutput, RendererOutput>(options);\n return lexer.inlineTokens(src);\n }\n\n /**\n * Preprocessing\n */\n lex(src: string) {\n src = src.replace(other.carriageReturn, '\\n');\n\n this.blockTokens(src, this.tokens);\n\n for (let i = 0; i < this.inlineQueue.length; i++) {\n const next = this.inlineQueue[i];\n this.inlineTokens(next.src, next.tokens);\n }\n this.inlineQueue = [];\n\n return this.tokens;\n }\n\n /**\n * Lexing\n */\n blockTokens(src: string, tokens?: Token[], lastParagraphClipped?: boolean): Token[];\n blockTokens(src: string, tokens?: TokensList, lastParagraphClipped?: boolean): TokensList;\n blockTokens(src: string, tokens: Token[] = [], lastParagraphClipped = false) {\n this.tokenizer.lexer = this;\n if (this.options.pedantic) {\n src = src.replace(other.tabCharGlobal, ' ').replace(other.spaceLine, '');\n }\n\n let srcLength = Infinity;\n while (src) {\n if (src.length < srcLength) {\n srcLength = src.length;\n } else {\n this.infiniteLoopError(src.charCodeAt(0));\n break;\n }\n\n let token: Tokens.Generic | undefined;\n\n if (this.options.extensions?.block?.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // newline\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.raw.length === 1 && lastToken !== undefined) {\n // if there's a single \\n as a spacer, it's terminating the last line,\n // so move it there so that we don't get unnecessary paragraph tags\n lastToken.raw += '\\n';\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // code\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n // An indented code block cannot interrupt a paragraph.\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // fences\n if (token = this.tokenizer.fences(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // heading\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // hr\n if (token = this.tokenizer.hr(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // blockquote\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // list\n if (token = this.tokenizer.list(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // html\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // def\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else if (!this.tokens.links[token.tag]) {\n this.tokens.links[token.tag] = {\n href: token.href,\n title: token.title,\n };\n tokens.push(token);\n }\n continue;\n }\n\n // table (gfm)\n if (token = this.tokenizer.table(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // lheading\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (this.options.extensions?.startBlock) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startBlock.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n const lastToken = tokens.at(-1);\n if (lastParagraphClipped && lastToken?.type === 'paragraph') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n lastParagraphClipped = cutSrc.length !== src.length;\n src = src.substring(token.raw.length);\n continue;\n }\n\n // text\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n this.infiniteLoopError(src.charCodeAt(0));\n break;\n }\n }\n\n this.state.top = true;\n return tokens;\n }\n\n inline(src: string, tokens: Token[] = []) {\n this.inlineQueue.push({ src, tokens });\n return tokens;\n }\n\n /**\n * Does this link text hold a link already? An image does not count: an image\n * may hold a link, a link may not.\n */\n private linkInText(text: string): boolean {\n if (!text.includes('[')) {\n return false;\n }\n\n const linkRule = this.tokenizer.rules.inline.link;\n for (const match of text.matchAll(this.tokenizer.rules.inline.blockSkip)) {\n // blockSkip also matches code spans and html, and the `!` of an image is\n // left out of the match, so read the character before it.\n if (linkRule.test(match[0]) && text.charAt(match.index - 1) !== '!') {\n return true;\n }\n }\n\n for (const match of text.matchAll(this.tokenizer.rules.inline.reflinkSearch)) {\n const match0 = match[0];\n const refStart = match0.lastIndexOf('[');\n if (match0.charAt(0) === '!' || !Object.hasOwn(this.tokens.links, normalizeLabel(match0.slice(refStart + 1, -1)))) {\n continue;\n }\n // a candidate holding a link is not a link either, so it does not count\n if (refStart > 1 && this.linkInText(match0.slice(1, refStart - 1))) {\n continue;\n }\n return true;\n }\n\n return false;\n }\n\n /**\n * Lexing/Compiling\n */\n inlineTokens(src: string, tokens: Token[] = []): Token[] {\n this.tokenizer.lexer = this;\n // One paren scan per inline run, shared with Tokenizer.link: without a\n // ')' ahead the link regex cannot match, and skipping it avoids its\n // quadratic backtracking over unterminated-link inputs like\n // `'[a](b'.repeat(n)`. A nested run receives a substring of the outer\n // run, so if the outer had no ')' neither does this substring \u2014 skip\n // the scan in that case.\n const prevLinkParenPossible = this.state.linkParenPossible;\n this.state.linkParenPossible = prevLinkParenPossible && src.includes(')');\n try {\n return this.#inlineTokensInner(src, tokens);\n } finally {\n // A nested run (e.g. a link label) anchored on its own substring;\n // restore the outer run's flag for the rest of its loop.\n this.state.linkParenPossible = prevLinkParenPossible;\n }\n }\n\n #inlineTokensInner(src: string, tokens: Token[]): Token[] {\n // String with links masked to avoid interference with em and strong\n let maskedSrc = src;\n\n // Mask out reflinks\n if (this.tokens.links && src.includes('[')) {\n const reflinkSearch = this.tokenizer.rules.inline.reflinkSearch;\n const maskReflink = (match0: string): string => {\n const refStart = match0.lastIndexOf('[');\n if (!Object.hasOwn(this.tokens.links, normalizeLabel(match0.slice(refStart + 1, -1)))) {\n return match0;\n }\n // CommonMark: \"Links may not contain other links, at any level of\n // nesting.\" A candidate whose text already holds one never becomes a\n // link, so flattening the whole span would hide the emphasis that\n // does still apply inside it. Mask the links it holds instead.\n // Images are exempt: their text is flattened into an alt attribute.\n if (refStart > 1 && match0.charAt(0) !== '!') {\n const text = match0.slice(1, refStart - 1);\n if (this.linkInText(text)) {\n return '[' + text.replace(reflinkSearch, maskReflink)\n + '][' + 'a'.repeat(match0.length - refStart - 2) + ']';\n }\n }\n return '[' + 'a'.repeat(match0.length - 2) + ']';\n };\n maskedSrc = maskedSrc.replace(reflinkSearch, maskReflink);\n }\n\n // Mask out escaped characters.\n // Every mask must keep the length it replaces: emStrong and del line\n // maskedSrc up with src by slicing from the end. `anyPunctuation` matches\n // unicode punctuation, so an escaped astral character is 3 code units.\n // A backslash inside a code span is literal, not an escape. Mask the\n // backticks inside the span instead, so blockSkip still skips all of it.\n maskedSrc = maskedSrc.replace(this.tokenizer.rules.inline.anyPunctuationOutsideCode, (match0, code, punct) => {\n if (punct) {\n return '+'.repeat(match0.length);\n }\n if (code) {\n return code + match0.slice(code.length, -code.length).replace(/`/g, '+') + code;\n }\n return match0;\n });\n\n // Mask out other blocks\n maskedSrc = maskedSrc.replace(this.tokenizer.rules.inline.blockSkip, (match0, _link, context) => {\n const offset = context ? context.length : 0;\n return match0.slice(0, offset) + '[' + 'a'.repeat(match0.length - offset - 2) + ']';\n });\n\n // Mask out blocks from extensions\n maskedSrc = this.options.hooks?.emStrongMask?.call({ lexer: this }, maskedSrc) ?? maskedSrc;\n\n let keepPrevChar = false;\n let prevChar = '';\n let srcLength = Infinity;\n while (src) {\n if (src.length < srcLength) {\n srcLength = src.length;\n } else {\n this.infiniteLoopError(src.charCodeAt(0));\n break;\n }\n\n if (!keepPrevChar) {\n prevChar = '';\n }\n keepPrevChar = false;\n\n let token: Tokens.Generic | undefined;\n\n // extensions\n if (this.options.extensions?.inline?.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // escape\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // tag\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // link\n if (token = this.tokenizer.link(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // reflink, nolink\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.type === 'text' && lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // em & strong\n if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // code\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // br\n if (token = this.tokenizer.br(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // del (gfm)\n if (token = this.tokenizer.del(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // autolink\n if (token = this.tokenizer.autolink(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // url (gfm)\n if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (this.options.extensions?.startInline) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startInline.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (token = this.tokenizer.inlineText(cutSrc)) {\n src = src.substring(token.raw.length);\n if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n prevChar = token.raw.slice(-1);\n }\n keepPrevChar = true;\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n this.infiniteLoopError(src.charCodeAt(0));\n break;\n }\n }\n\n return tokens;\n }\n\n private infiniteLoopError(byte: number) {\n const errMsg = 'Infinite loop on byte: ' + byte;\n if (this.options.silent) {\n console.error(errMsg);\n } else {\n throw new Error(errMsg);\n }\n }\n}\n", "import { _defaults } from './defaults.ts';\nimport {\n cleanUrl,\n escapeHtmlEntities,\n} from './helpers.ts';\nimport { other } from './rules.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Tokens } from './Tokens.ts';\nimport type { _Parser } from './Parser.ts';\n\n/**\n * Renderer\n */\nexport class _Renderer<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n parser!: _Parser<ParserOutput, RendererOutput>; // set by the parser\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n space(token: Tokens.Space): RendererOutput {\n return '' as RendererOutput;\n }\n\n code({ text, lang, escaped }: Tokens.Code): RendererOutput {\n const langString = (lang || '').match(other.notSpaceStart)?.[0];\n\n // An empty code block has no content, so it must not gain a newline.\n const code = text ? text.replace(other.endingNewline, '') + '\\n' : '';\n\n if (!langString) {\n return '<pre><code>'\n + (escaped ? code : escapeHtmlEntities(code, true))\n + '</code></pre>\\n' as RendererOutput;\n }\n\n return '<pre><code class=\"language-'\n + escapeHtmlEntities(langString)\n + '\">'\n + (escaped ? code : escapeHtmlEntities(code, true))\n + '</code></pre>\\n' as RendererOutput;\n }\n\n blockquote({ tokens }: Tokens.Blockquote): RendererOutput {\n const body = this.parser.parse(tokens);\n return `<blockquote>\\n${body}</blockquote>\\n` as RendererOutput;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n def(token: Tokens.Def): RendererOutput {\n return '' as RendererOutput;\n }\n\n heading({ tokens, depth }: Tokens.Heading): RendererOutput {\n return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>\\n` as RendererOutput;\n }\n\n hr(token: Tokens.Hr): RendererOutput {\n return '<hr>\\n' as RendererOutput;\n }\n\n list(token: Tokens.List): RendererOutput {\n const ordered = token.ordered;\n const start = token.start;\n\n let body = '';\n for (let j = 0; j < token.items.length; j++) {\n const item = token.items[j];\n body += this.listitem(item);\n }\n\n const type = ordered ? 'ol' : 'ul';\n const startAttr = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startAttr + '>\\n' + body + '</' + type + '>\\n' as RendererOutput;\n }\n\n listitem(item: Tokens.ListItem): RendererOutput {\n return `<li>${this.parser.parse(item.tokens)}</li>\\n` as RendererOutput;\n }\n\n checkbox({ checked }: Tokens.Checkbox): RendererOutput {\n return '<input '\n + (checked ? 'checked=\"\" ' : '')\n + 'disabled=\"\" type=\"checkbox\"> ' as RendererOutput;\n }\n\n paragraph({ tokens }: Tokens.Paragraph): RendererOutput {\n return `<p>${this.parser.parseInline(tokens)}</p>\\n` as RendererOutput;\n }\n\n table(token: Tokens.Table): RendererOutput {\n let header = '';\n\n // header\n let cell = '';\n for (let j = 0; j < token.header.length; j++) {\n cell += this.tablecell(token.header[j]);\n }\n header += this.tablerow({ text: cell as ParserOutput });\n\n let body = '';\n for (let j = 0; j < token.rows.length; j++) {\n const row = token.rows[j];\n\n cell = '';\n for (let k = 0; k < row.length; k++) {\n cell += this.tablecell(row[k]);\n }\n\n body += this.tablerow({ text: cell as ParserOutput });\n }\n if (body) body = `<tbody>${body}</tbody>`;\n\n return '<table>\\n'\n + '<thead>\\n'\n + header\n + '</thead>\\n'\n + body\n + '</table>\\n' as RendererOutput;\n }\n\n tablerow({ text }: Tokens.TableRow<ParserOutput>): RendererOutput {\n return `<tr>\\n${text}</tr>\\n` as RendererOutput;\n }\n\n tablecell(token: Tokens.TableCell): RendererOutput {\n const content = this.parser.parseInline(token.tokens);\n const type = token.header ? 'th' : 'td';\n const tag = token.align\n ? `<${type} align=\"${token.align}\">`\n : `<${type}>`;\n return tag + content + `</${type}>\\n` as RendererOutput;\n }\n\n /**\n * span level renderer\n */\n strong({ tokens }: Tokens.Strong): RendererOutput {\n return `<strong>${this.parser.parseInline(tokens)}</strong>` as RendererOutput;\n }\n\n em({ tokens }: Tokens.Em): RendererOutput {\n return `<em>${this.parser.parseInline(tokens)}</em>` as RendererOutput;\n }\n\n codespan({ text }: Tokens.Codespan): RendererOutput {\n return `<code>${escapeHtmlEntities(text, true)}</code>` as RendererOutput;\n }\n\n br(token: Tokens.Br): RendererOutput {\n return '<br>' as RendererOutput;\n }\n\n del({ tokens }: Tokens.Del): RendererOutput {\n return `<del>${this.parser.parseInline(tokens)}</del>` as RendererOutput;\n }\n\n link({ href, title, text, tokens, autolink }: Tokens.Link): RendererOutput {\n // References are not resolved inside an autolink, so every `&` there is\n // literal. Elsewhere only an `&` that cannot start one needs escaping.\n const parsedText = autolink\n ? escapeHtmlEntities(text, true)\n : this.parser.parseInline(tokens) as string;\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return parsedText as RendererOutput;\n }\n href = escapeHtmlEntities(cleanHref, autolink);\n let out = '<a href=\"' + href + '\"';\n if (title) {\n out += ' title=\"' + (escapeHtmlEntities(title)) + '\"';\n }\n out += '>' + parsedText + '</a>';\n return out as RendererOutput;\n }\n\n image({ href, title, text, tokens }: Tokens.Image): RendererOutput {\n if (tokens) {\n text = this.parser.parseInline(tokens, this.parser.textRenderer) as string;\n }\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return escapeHtmlEntities(text) as RendererOutput;\n }\n href = cleanHref;\n\n let out = `<img src=\"${escapeHtmlEntities(href)}\" alt=\"${escapeHtmlEntities(text)}\"`;\n if (title) {\n out += ` title=\"${escapeHtmlEntities(title)}\"`;\n }\n out += '>';\n return out as RendererOutput;\n }\n\n text(token: Tokens.Text | Tokens.Escape): RendererOutput {\n return 'tokens' in token && token.tokens\n ? this.parser.parseInline(token.tokens) as unknown as RendererOutput\n : ('escaped' in token && token.escaped ? token.text as RendererOutput : escapeHtmlEntities(token.text) as RendererOutput);\n }\n}\n", "import type { Tokens } from './Tokens.ts';\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nexport class _TextRenderer<RendererOutput = string> {\n // no need for block level renderers\n strong({ text }: Tokens.Strong): RendererOutput {\n return text as RendererOutput;\n }\n\n em({ text }: Tokens.Em): RendererOutput {\n return text as RendererOutput;\n }\n\n codespan({ text }: Tokens.Codespan): RendererOutput {\n return text as RendererOutput;\n }\n\n del({ text }: Tokens.Del): RendererOutput {\n return text as RendererOutput;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n text({ text }: Tokens.Text | Tokens.Escape | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n link({ text }: Tokens.Link): RendererOutput {\n return '' + text as RendererOutput;\n }\n\n image({ text }: Tokens.Image): RendererOutput {\n return '' + text as RendererOutput;\n }\n\n br(): RendererOutput {\n return '' as RendererOutput;\n }\n\n checkbox({ raw }: Tokens.Checkbox): RendererOutput {\n return raw as RendererOutput;\n }\n}\n", "import { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _defaults } from './defaults.ts';\nimport type { MarkedToken, Token, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Parsing & Compiling\n */\nexport class _Parser<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n renderer: _Renderer<ParserOutput, RendererOutput>;\n textRenderer: _TextRenderer<RendererOutput>;\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n this.options.renderer = this.options.renderer || new _Renderer<ParserOutput, RendererOutput>();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.renderer.parser = this;\n this.textRenderer = new _TextRenderer<RendererOutput>();\n }\n\n /**\n * Static Parse Method\n */\n static parse<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const parser = new _Parser<ParserOutput, RendererOutput>(options);\n return parser.parse(tokens);\n }\n\n /**\n * Static Parse Inline Method\n */\n static parseInline<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const parser = new _Parser<ParserOutput, RendererOutput>(options);\n return parser.parseInline(tokens);\n }\n\n /**\n * Parse Loop\n */\n parse(tokens: Token[]): ParserOutput {\n this.renderer.parser = this;\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const genericToken = anyToken as Tokens.Generic;\n const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'checkbox', 'html', 'def', 'paragraph', 'text'].includes(genericToken.type)) {\n out += ret || '';\n continue;\n }\n }\n\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'space': {\n out += this.renderer.space(token);\n break;\n }\n case 'hr': {\n out += this.renderer.hr(token);\n break;\n }\n case 'heading': {\n out += this.renderer.heading(token);\n break;\n }\n case 'code': {\n out += this.renderer.code(token);\n break;\n }\n case 'table': {\n out += this.renderer.table(token);\n break;\n }\n case 'blockquote': {\n out += this.renderer.blockquote(token);\n break;\n }\n case 'list': {\n out += this.renderer.list(token);\n break;\n }\n case 'checkbox': {\n out += this.renderer.checkbox(token);\n break;\n }\n case 'html': {\n out += this.renderer.html(token);\n break;\n }\n case 'def': {\n out += this.renderer.def(token);\n break;\n }\n case 'paragraph': {\n out += this.renderer.paragraph(token);\n break;\n }\n case 'text': {\n out += this.renderer.text(token);\n break;\n }\n\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '' as ParserOutput;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n\n return out as ParserOutput;\n }\n\n /**\n * Parse Inline Tokens\n */\n parseInline(tokens: Token[], renderer: _Renderer<ParserOutput, RendererOutput> | _TextRenderer<RendererOutput> = this.renderer): ParserOutput {\n this.renderer.parser = this;\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);\n if (ret !== false || !['escape', 'html', 'link', 'image', 'checkbox', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(anyToken.type)) {\n out += ret || '';\n continue;\n }\n }\n\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'escape': {\n out += renderer.text(token);\n break;\n }\n case 'html': {\n out += renderer.html(token);\n break;\n }\n case 'link': {\n out += renderer.link(token);\n break;\n }\n case 'image': {\n out += renderer.image(token);\n break;\n }\n case 'checkbox': {\n out += renderer.checkbox(token);\n break;\n }\n case 'strong': {\n out += renderer.strong(token);\n break;\n }\n case 'em': {\n out += renderer.em(token);\n break;\n }\n case 'codespan': {\n out += renderer.codespan(token);\n break;\n }\n case 'br': {\n out += renderer.br(token);\n break;\n }\n case 'del': {\n out += renderer.del(token);\n break;\n }\n case 'text': {\n out += renderer.text(token);\n break;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '' as ParserOutput;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out as ParserOutput;\n }\n}\n", "import { _defaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\n\nexport class _Hooks<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n block?: boolean;\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n static passThroughHooks = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens',\n 'emStrongMask',\n ]);\n\n static passThroughHooksRespectAsync = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens',\n ]);\n\n /**\n * Process markdown before marked\n */\n preprocess(markdown: string) {\n return markdown;\n }\n\n /**\n * Process HTML after marked is finished\n */\n postprocess(html: ParserOutput) {\n return html;\n }\n\n /**\n * Process all tokens before walk tokens\n */\n processAllTokens(tokens: Token[] | TokensList) {\n return tokens;\n }\n\n /**\n * Mask contents that should not be interpreted as em/strong delimiters\n */\n emStrongMask(src: string) {\n return src;\n }\n\n /**\n * Provide function to tokenize markdown\n */\n provideLexer(block = this.block) {\n return block ? _Lexer.lex : _Lexer.lexInline;\n }\n\n /**\n * Provide function to parse tokens\n */\n provideParser(block = this.block) {\n return block ? _Parser.parse<ParserOutput, RendererOutput> : _Parser.parseInline<ParserOutput, RendererOutput>;\n }\n}\n", "import { _getDefaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { escapeHtmlEntities } from './helpers.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, Tokens, TokensList } from './Tokens.ts';\n\nexport type MaybePromise = void | Promise<void>;\n\ntype UnknownFunction = (...args: unknown[]) => unknown;\ntype GenericRendererFunction = (...args: unknown[]) => string | false;\n\n/**\n * Append value(s) to values in place, flattening one level like concat\n */\nfunction pushValues(values: MaybePromise[], value: MaybePromise | MaybePromise[]) {\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n values.push(value[i]);\n }\n } else {\n values.push(value);\n }\n}\n\nexport class Marked<ParserOutput = string, RendererOutput = string> {\n defaults = _getDefaults<ParserOutput, RendererOutput>();\n options = this.setOptions;\n\n /**\n * Compiles markdown to HTML.\n *\n * To configure hooks, a renderer, or a tokenizer, create a separate `Marked`\n * instance and use `Marked#use` instead of passing them on each call.\n */\n parse = this.parseMarkdown(true);\n\n /**\n * Compiles inline markdown to HTML.\n *\n * To configure hooks, a renderer, or a tokenizer, create a separate `Marked`\n * instance and use `Marked#use` instead of passing them on each call.\n */\n parseInline = this.parseMarkdown(false);\n\n Parser = _Parser<ParserOutput, RendererOutput>;\n Renderer = _Renderer<ParserOutput, RendererOutput>;\n TextRenderer = _TextRenderer<RendererOutput>;\n Lexer = _Lexer;\n Tokenizer = _Tokenizer<ParserOutput, RendererOutput>;\n Hooks = _Hooks<ParserOutput, RendererOutput>;\n\n constructor(...args: MarkedExtension<ParserOutput, RendererOutput>[]) {\n this.use(...args);\n }\n\n /**\n * Run callback for every token\n */\n walkTokens(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n const values: MaybePromise[] = [];\n for (const token of tokens) {\n pushValues(values, callback.call(this, token));\n switch (token.type) {\n case 'table': {\n const tableToken = token as Tokens.Table;\n for (const cell of tableToken.header) {\n pushValues(values, this.walkTokens(cell.tokens, callback));\n }\n for (const row of tableToken.rows) {\n for (const cell of row) {\n pushValues(values, this.walkTokens(cell.tokens, callback));\n }\n }\n break;\n }\n case 'list': {\n const listToken = token as Tokens.List;\n pushValues(values, this.walkTokens(listToken.items, callback));\n break;\n }\n default: {\n const genericToken = token as Tokens.Generic;\n if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n const tokens = genericToken[childTokens].flat(Infinity) as Token[] | TokensList;\n pushValues(values, this.walkTokens(tokens, callback));\n });\n } else if (genericToken.tokens) {\n pushValues(values, this.walkTokens(genericToken.tokens, callback));\n }\n }\n }\n }\n return values;\n }\n\n /**\n * Registers extensions with this Marked instance.\n *\n * The `renderer`, `tokenizer`, and `hooks` objects may each contain only the\n * methods that should be overridden. Their methods are merged with built-in\n * behavior and extensions registered by earlier calls.\n *\n * Use this method when supplying only some hook methods.\n */\n use(...args: MarkedExtension<ParserOutput, RendererOutput>[]) {\n const extensions: MarkedOptions<ParserOutput, RendererOutput>['extensions'] = this.defaults.extensions || { renderers: {}, childTokens: {} };\n\n args.forEach((pack) => {\n // copy options to new object\n const opts = { ...pack } as MarkedOptions<ParserOutput, RendererOutput>;\n\n // set async to true if it was set to true before\n opts.async = this.defaults.async || opts.async || false;\n\n // ==-- Parse \"addon\" extensions --== //\n if (pack.extensions) {\n pack.extensions.forEach((ext) => {\n if (!ext.name) {\n throw new Error('extension name required');\n }\n if ('renderer' in ext) { // Renderer extensions\n const prevRenderer = extensions.renderers[ext.name];\n if (prevRenderer) {\n // Replace extension with func to run new extension but fall back if false\n extensions.renderers[ext.name] = function(...args) {\n let ret = ext.renderer.apply(this, args);\n if (ret === false) {\n ret = prevRenderer.apply(this, args);\n }\n return ret;\n };\n } else {\n extensions.renderers[ext.name] = ext.renderer;\n }\n }\n if ('tokenizer' in ext) { // Tokenizer Extensions\n if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n throw new Error(\"extension level must be 'block' or 'inline'\");\n }\n const extLevel = extensions[ext.level];\n if (extLevel) {\n extLevel.unshift(ext.tokenizer);\n } else {\n extensions[ext.level] = [ext.tokenizer];\n }\n if (ext.start) { // Function to check for start of token\n if (ext.level === 'block') {\n if (extensions.startBlock) {\n extensions.startBlock.push(ext.start);\n } else {\n extensions.startBlock = [ext.start];\n }\n } else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\n } else {\n extensions.startInline = [ext.start];\n }\n }\n }\n }\n if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n extensions.childTokens[ext.name] = ext.childTokens;\n }\n });\n opts.extensions = extensions;\n }\n\n // ==-- Parse \"overwrite\" extensions --== //\n if (pack.renderer) {\n const renderer = this.defaults.renderer || new _Renderer<ParserOutput, RendererOutput>(this.defaults);\n for (const prop in pack.renderer) {\n if (!(prop in renderer)) {\n throw new Error(`renderer '${prop}' does not exist`);\n }\n if (['options', 'parser'].includes(prop)) {\n // ignore options property\n continue;\n }\n const rendererProp = prop as Exclude<keyof _Renderer<ParserOutput, RendererOutput>, 'options' | 'parser'>;\n const rendererFunc = pack.renderer[rendererProp] as GenericRendererFunction;\n const prevRenderer = renderer[rendererProp] as GenericRendererFunction;\n // Replace renderer with func to run extension, but fall back if false\n renderer[rendererProp] = (...args: unknown[]) => {\n let ret = rendererFunc.apply(renderer, args);\n if (ret === false) {\n ret = prevRenderer.apply(renderer, args);\n }\n return (ret || '') as RendererOutput;\n };\n }\n opts.renderer = renderer;\n }\n if (pack.tokenizer) {\n const tokenizer = this.defaults.tokenizer || new _Tokenizer<ParserOutput, RendererOutput>(this.defaults);\n for (const prop in pack.tokenizer) {\n if (!(prop in tokenizer)) {\n throw new Error(`tokenizer '${prop}' does not exist`);\n }\n if (['options', 'rules', 'lexer'].includes(prop)) {\n // ignore options, rules, and lexer properties\n continue;\n }\n const tokenizerProp = prop as Exclude<keyof _Tokenizer<ParserOutput, RendererOutput>, 'options' | 'rules' | 'lexer'>;\n const tokenizerFunc = pack.tokenizer[tokenizerProp] as UnknownFunction;\n const prevTokenizer = tokenizer[tokenizerProp] as UnknownFunction;\n // Replace tokenizer with func to run extension, but fall back if false\n // @ts-expect-error cannot type tokenizer function dynamically\n tokenizer[tokenizerProp] = (...args: unknown[]) => {\n let ret = tokenizerFunc.apply(tokenizer, args);\n if (ret === false) {\n ret = prevTokenizer.apply(tokenizer, args);\n }\n return ret;\n };\n }\n opts.tokenizer = tokenizer;\n }\n\n // ==-- Parse Hooks extensions --== //\n if (pack.hooks) {\n const hooks = this.defaults.hooks || new _Hooks<ParserOutput, RendererOutput>();\n for (const prop in pack.hooks) {\n if (!(prop in hooks)) {\n throw new Error(`hook '${prop}' does not exist`);\n }\n if (['options', 'block'].includes(prop)) {\n // ignore options and block properties\n continue;\n }\n const hooksProp = prop as Exclude<keyof _Hooks<ParserOutput, RendererOutput>, 'options' | 'block'>;\n const hooksFunc = pack.hooks[hooksProp] as UnknownFunction;\n const prevHook = hooks[hooksProp] as UnknownFunction;\n if (_Hooks.passThroughHooks.has(prop)) {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (arg: unknown) => {\n if (this.defaults.async && _Hooks.passThroughHooksRespectAsync.has(prop)) {\n return (async() => {\n const ret = await hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n })();\n }\n\n const ret = hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n };\n } else {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (...args: unknown[]) => {\n if (this.defaults.async) {\n return (async() => {\n let ret = await hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = await prevHook.apply(hooks, args);\n }\n return ret;\n })();\n }\n\n let ret = hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = prevHook.apply(hooks, args);\n }\n return ret;\n };\n }\n }\n opts.hooks = hooks;\n }\n\n // ==-- Parse WalkTokens extensions --== //\n if (pack.walkTokens) {\n const walkTokens = this.defaults.walkTokens;\n const packWalktokens = pack.walkTokens;\n opts.walkTokens = function(token) {\n const values: MaybePromise[] = [];\n values.push(packWalktokens.call(this, token));\n if (walkTokens) {\n pushValues(values, walkTokens.call(this, token));\n }\n return values;\n };\n }\n\n this.defaults = { ...this.defaults, ...opts };\n });\n\n return this;\n }\n\n setOptions(opt: MarkedOptions<ParserOutput, RendererOutput>) {\n this.defaults = { ...this.defaults, ...opt };\n return this;\n }\n\n lexer(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n return _Lexer.lex(src, options ?? this.defaults);\n }\n\n parser(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n return _Parser.parse<ParserOutput, RendererOutput>(tokens, options ?? this.defaults);\n }\n\n private parseMarkdown(blockType: boolean) {\n type overloadedParse = {\n (src: string, options: MarkedOptions<ParserOutput, RendererOutput> & { async: true }): Promise<ParserOutput>;\n (src: string, options: MarkedOptions<ParserOutput, RendererOutput> & { async: false }): ParserOutput;\n (src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): ParserOutput | Promise<ParserOutput>;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const parse: overloadedParse = (src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): any => {\n const origOpt = { ...options };\n const opt = { ...this.defaults, ...origOpt };\n\n const throwError = this.onError(!!opt.silent, !!opt.async);\n\n // throw error if an extension set async to true but parse was called with async: false\n if (this.defaults.async === true && origOpt.async === false) {\n return throwError(new Error('marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.'));\n }\n\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n return throwError(new Error('marked(): input parameter is undefined or null'));\n }\n if (typeof src !== 'string') {\n return throwError(new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected'));\n }\n\n if (opt.hooks) {\n opt.hooks.options = opt;\n opt.hooks.block = blockType;\n }\n\n if (opt.async) {\n return (async() => {\n const processedSrc = opt.hooks ? await opt.hooks.preprocess(src) : src;\n const lexer = opt.hooks ? await opt.hooks.provideLexer(blockType) : (blockType ? _Lexer.lex : _Lexer.lexInline);\n const tokens = await lexer(processedSrc, opt);\n const processedTokens = opt.hooks ? await opt.hooks.processAllTokens(tokens) : tokens;\n if (opt.walkTokens) {\n await Promise.all(this.walkTokens(processedTokens, opt.walkTokens));\n }\n const parser = opt.hooks ? await opt.hooks.provideParser(blockType) : (blockType ? _Parser.parse : _Parser.parseInline);\n const html = await parser(processedTokens, opt);\n return opt.hooks ? await opt.hooks.postprocess(html) : html;\n })().catch(throwError);\n }\n\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src) as string;\n }\n const lexer = opt.hooks ? opt.hooks.provideLexer(blockType) : (blockType ? _Lexer.lex : _Lexer.lexInline);\n let tokens = lexer(src, opt);\n if (opt.hooks) {\n tokens = opt.hooks.processAllTokens(tokens);\n }\n if (opt.walkTokens) {\n this.walkTokens(tokens, opt.walkTokens);\n }\n const parser = opt.hooks ? opt.hooks.provideParser(blockType) : (blockType ? _Parser.parse : _Parser.parseInline);\n let html = parser(tokens, opt);\n if (opt.hooks) {\n html = opt.hooks.postprocess(html);\n }\n return html;\n } catch(e) {\n return throwError(e as Error);\n }\n };\n\n return parse;\n }\n\n private onError(silent: boolean, async: boolean) {\n return (e: Error): string | Promise<string> => {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n\n if (silent) {\n const msg = '<p>An error occurred:</p><pre>'\n + escapeHtmlEntities(e.message + '', true)\n + '</pre>';\n if (async) {\n return Promise.resolve(msg);\n }\n return msg;\n }\n\n if (async) {\n return Promise.reject(e);\n }\n throw e;\n };\n }\n}\n", "import { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { Marked } from './Instance.ts';\nimport {\n _getDefaults,\n changeDefaults,\n _defaults,\n} from './defaults.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\nimport type { MaybePromise } from './Instance.ts';\n\nconst markedInstance = new Marked();\n\n/**\n * Compiles markdown to HTML asynchronously.\n *\n * To configure hooks, a renderer, or a tokenizer, create a `Marked` instance\n * and use `Marked#use` instead of passing them as options on each call.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options, having async: true\n * @return Promise of string of compiled HTML\n */\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\n\n/**\n * Compiles markdown to HTML.\n *\n * To configure hooks, a renderer, or a tokenizer, create a `Marked` instance\n * and use `Marked#use` instead of passing them as options on each call.\n *\n * @param src String of markdown source to be compiled\n * @param options Optional hash of options\n * @return String of compiled HTML. Will be a Promise of string if async is set to true by any extensions.\n */\nexport function marked(src: string, options: MarkedOptions & { async: false }): string;\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\nexport function marked(src: string, options?: MarkedOptions | null): string | Promise<string>;\nexport function marked(src: string, opt?: MarkedOptions | null): string | Promise<string> {\n return markedInstance.parse(src, opt);\n}\n\nexport declare namespace marked {\n /**\n * Compiles inline markdown to HTML.\n *\n * To configure hooks, a renderer, or a tokenizer, create a `Marked` instance\n * and use `Marked#use` instead of passing them as options on each call.\n */\n let parseInline: typeof markedInstance.parseInline;\n\n /**\n * Registers extensions with the default Marked instance.\n *\n * The `renderer`, `tokenizer`, and `hooks` objects may each contain only the\n * methods that should be overridden. Their methods are merged with built-in\n * behavior and extensions registered by earlier calls.\n *\n * Use this function when supplying only some hook methods.\n */\n let use: (...args: MarkedExtension[]) => typeof marked;\n}\n\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\n marked.setOptions = function(options: MarkedOptions) {\n markedInstance.setOptions(options);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n };\n\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\n\nmarked.defaults = _defaults;\n\n/**\n * Registers extensions with the default Marked instance.\n *\n * The `renderer`, `tokenizer`, and `hooks` objects may each contain only the\n * methods that should be overridden. Their methods are merged with built-in\n * behavior and extensions registered by earlier calls.\n *\n * Use this function when supplying only some hook methods.\n *\n * @param args Extensions to register\n * @return The `marked` function\n */\nfunction useExtension(...args: MarkedExtension[]) {\n markedInstance.use(...args);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n}\n\nmarked.use = useExtension;\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n return markedInstance.walkTokens(tokens, callback);\n};\n\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * To configure hooks, a renderer, or a tokenizer, create a `Marked` instance\n * and use `Marked#use` instead of passing them as options on each call.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\n\nexport const options = marked.options;\nexport const setOptions = marked.setOptions;\nexport const walkTokens = marked.walkTokens;\n/**\n * Compiles inline markdown to HTML.\n *\n * To configure hooks, a renderer, or a tokenizer, create a `Marked` instance\n * and use `Marked#use` instead of passing them as options on each call.\n */\nexport const parseInline = marked.parseInline;\nexport const parse = marked;\nexport const parser = _Parser.parse;\nexport const lexer = _Lexer.lex;\nexport { _defaults as defaults, _getDefaults as getDefaults } from './defaults.ts';\nexport { _Lexer as Lexer } from './Lexer.ts';\nexport { _Parser as Parser } from './Parser.ts';\nexport { _Tokenizer as Tokenizer } from './Tokenizer.ts';\nexport { _Renderer as Renderer } from './Renderer.ts';\nexport { _TextRenderer as TextRenderer } from './TextRenderer.ts';\nexport { _Hooks as Hooks } from './Hooks.ts';\nexport { Marked } from './Instance.ts';\nexport { useExtension as use };\nexport type * from './MarkedOptions.ts';\nexport type * from './Tokens.ts';\n", "// A deck on a page: its slides drawn into the element given, paged with the bar, the keys a\n// presenter's clicker sends, a click or a swipe; each step shown in turn; moved between with the\n// transition its settings name, through the View Transitions API; presented full screen, with\n// the presenter's view (this slide, the next, the notes, the time) and all slides at once; light\n// or dark; changed as Markdown beside the slides, or in place on a slide, live. Host-agnostic:\n// the host gives the drawers of ```echarts and ```mermaid, how a picture's address resolves, its\n// words, how a slide's Markdown is read (its own marked, with its extensions), and what to do when\n// the deck changes or is saved.\nimport { parseDeck } from './parse.js'\nimport { renderSlide, h } from './render.js'\nimport { tokensOf, schemeOf, VOICES } from './look.js'\nimport { mergeKits } from './kit.js'\nimport { stringsFor } from './strings.js'\nimport { Lexer } from 'marked'\n\n/** @typedef {import('./parse.js').Deck} Deck */\n/**\n * @typedef {{\n * source: string, lang?: string, dir?: string, kit?: Record<string, any>, scheme?: 'light' | 'dark' | 'auto',\n * blocks?: Record<string, import('./render.js').Drawer>, resolve?: (src: string) => string | null,\n * strings?: Record<string, string>, headings?: 'real' | 'aria', editable?: boolean, lex?: (markdown: string) => any[],\n * onChange?: (source: string) => void, onSave?: (source: string) => void, onExport?: (deck: DeckView) => void,\n * }} Options\n */\n\nconst RTL = /^(ar|he|fa|ur|ps|sd|ug|yi|dv|ckb)\\b/i\nconst ICONS = {\n back: 'M15 5l-7 7 7 7', next: 'M9 5l7 7-7 7', present: 'M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5',\n presenter: 'M3 5h12v9H3zM18 8h3M18 12h3M6 19h6', grid: 'M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z',\n edit: 'M4 20h4L19 9l-4-4L4 16zM13.5 6.5l4 4', scheme: 'M12 3a9 9 0 1 0 9 9 7 7 0 0 1-9-9z', export: 'M12 4v11M7 10l5 5 5-5M5 20h14',\n}\n\n/** @param {string} name */\nfunction icon(name) {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 24 24')\n svg.setAttribute('aria-hidden', 'true')\n if (name === 'back' || name === 'next') svg.setAttribute('class', 'deck-flip')\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('d', ICONS[/** @type {keyof typeof ICONS} */ (name)])\n svg.append(path)\n return svg\n}\n\n/** @typedef {ReturnType<typeof createDeck>} DeckView */\n\n/** @param {HTMLElement} root @param {Options} options */\nexport function createDeck(root, options) {\n let source = options.source.replace(/\\r\\n?/g, '\\n')\n let deck = parseDeck(source)\n let at = 0, stepAt = 0\n /** @type {{ element: HTMLElement, steps: number }[]} */\n let drawn = []\n const lang = String(options.lang ?? deck.settings.lang ?? document.documentElement.lang ?? 'en') || 'en'\n const dir = String(options.dir ?? deck.settings.dir ?? (RTL.test(lang) ? 'rtl' : 'ltr'))\n const words = { ...stringsFor(lang), ...options.strings }\n const number = new Intl.NumberFormat(lang).format\n const dark = matchMedia('(prefers-color-scheme: dark)')\n let scheme = /** @type {'light' | 'dark'} */ ('light')\n const started = Date.now()\n\n root.classList.add('deck')\n root.lang = lang\n root.dir = dir\n const stage = h('div', { class: 'deck-stage', tabindex: 0, role: 'region', 'aria-roledescription': words.carousel, 'aria-label': words.deck })\n const where = h('span', { class: 'deck-where', 'aria-live': 'polite' })\n const button = (/** @type {string} */ name, /** @type {string} */ label, /** @type {() => void} */ act) => {\n const b = h('button', { type: 'button', 'aria-label': label, 'data-act': name }, [icon(name)])\n b.addEventListener('click', act)\n return b\n }\n const back = button('back', words.previous, () => move(-1))\n const next = button('next', words.next, () => move(1))\n const editButton = button('edit', words.edit, () => toggle('is-editing'))\n const presenterButton = button('presenter', words.presenter, () => toggle('is-presenting'))\n const overviewButton = button('grid', words.overview, () => toggle('is-overview'))\n const bar = h('div', { class: 'deck-bar' }, [back, where, next, h('span', { class: 'deck-gap' }),\n overviewButton, presenterButton, options.editable === false ? null : editButton,\n button('scheme', words.scheme, () => { scheme = scheme === 'dark' ? 'light' : 'dark'; paintLook() }),\n options.onExport ? button('export', words.export, () => options.onExport?.(view)) : null,\n document.fullscreenEnabled ? button('present', words.present, () => present()) : null])\n const sourceBox = /** @type {HTMLTextAreaElement} */ (h('textarea', { class: 'deck-source', spellcheck: 'false', 'aria-label': words.source, dir: 'auto' }))\n const nextBox = h('div', { class: 'deck-next' })\n const notes = h('div', { class: 'deck-notes', dir: 'auto', 'aria-label': words.notes })\n const clock = h('span', { class: 'deck-clock' })\n const presenter = h('div', { class: 'deck-presenter' }, [nextBox, notes])\n root.replaceChildren(sourceBox, stage, presenter, bar)\n bar.insertBefore(clock, bar.querySelector('.deck-gap'))\n\n // The kit: deck's own, under the host's (an organisation's, a project's), under the file's own.\n let kitProblems = /** @type {string[]} */ ([])\n const kitOf = () => {\n const merged = mergeKits(options.kit, deck.settings.kit)\n kitProblems = merged.problems\n return merged.kit\n }\n\n function paintLook() {\n context.kit = kitOf()\n const tokens = tokensOf(deck.settings, context.kit.tokens)\n const colours = schemeOf(tokens, scheme)\n const stack = (/** @type {string[]} */ faces) => faces.map((f) => (/^[\\w-]+$/.test(f) ? f : `\"${f.replace(/[\"\\\\]/g, '')}\"`)).join(', ')\n const voice = tokens.fonts ? { heading: stack(tokens.fonts.heading), body: stack(tokens.fonts.body) } : VOICES[tokens.voice]\n for (const [name, value] of Object.entries({\n paper: colours.paper, ink: colours.ink, muted: colours.muted, line: colours.line, primary: colours.primary,\n fill: tokens.primary, 'on-fill': colours.onPrimary, soft: colours.soft, heading: voice.heading, body: voice.body, radius: `${tokens.radius}px`,\n ...Object.fromEntries(colours.series.map((colour, n) => [`series-${n + 1}`, colour])),\n })) root.style.setProperty(`--deck-${name}`, value)\n root.dataset.scheme = scheme\n root.dispatchEvent(new CustomEvent('deck-scheme', { detail: { scheme, colours, tokens } }))\n }\n const chooseScheme = () => {\n const asked = options.scheme ?? deck.settings.colorSchema ?? 'auto'\n scheme = asked === 'dark' || (asked === 'auto' && dark.matches) ? 'dark' : 'light'\n }\n\n /** @type {import('./render.js').Context} */\n const context = {\n blocks: options.blocks ?? {}, resolve: options.resolve ?? ((src) => src), headings: options.headings ?? 'real', number: (n) => number(n), total: 0, kit: mergeKits().kit,\n lex: options.lex ?? ((markdown) => new Lexer({ gfm: true }).lex(markdown)), slide: words.slide,\n }\n\n function draw() {\n context.total = deck.slides.length\n drawn = deck.slides.map((slide) => renderSlide(slide, context))\n for (const [i, { element }] of drawn.entries()) {\n element.setAttribute('aria-label', words.where.replace('{n}', number(i + 1)).replace('{count}', number(drawn.length)))\n element.addEventListener('click', () => { if (root.classList.contains('is-overview')) { toggle('is-overview'); go(i, 0) } })\n }\n stage.replaceChildren(...drawn.map(({ element }) => element))\n at = Math.min(at, drawn.length - 1)\n show()\n requestAnimationFrame(() => fitAll())\n }\n\n /** Each slot's type shrunk, down to six tenths, until it holds what it says; a slide still over is marked. */\n function fitAll() {\n for (const { element } of drawn) fit(element)\n }\n /** @param {HTMLElement} slide */\n function fit(slide) {\n let over = false\n for (const slot of /** @type {NodeListOf<HTMLElement>} */ (slide.querySelectorAll('.deck-slot'))) {\n let scale = 1\n slot.style.setProperty('--deck-fit', '1')\n while (slot.scrollHeight > slot.clientHeight + 1 && scale > 0.6) slot.style.setProperty('--deck-fit', String((scale = Math.round((scale - 0.05) * 100) / 100)))\n if (slot.scrollHeight > slot.clientHeight + 1) over = true\n }\n if (over) slide.dataset.overflow = 'true'\n else delete slide.dataset.overflow\n }\n\n function show() {\n for (const [i, { element, steps }] of drawn.entries()) {\n element.classList.toggle('is-shown', i === at)\n element.inert = i !== at && !root.classList.contains('is-overview')\n for (const one of element.querySelectorAll('.deck-step')) one.classList.toggle('is-on', i < at || (i === at && Number(one.getAttribute('data-step')) <= stepAt) || steps === 0)\n }\n where.textContent = `${number(at + 1)} / ${number(drawn.length)}`\n back.toggleAttribute('disabled', at === 0 && stepAt === 0)\n next.toggleAttribute('disabled', at >= drawn.length - 1 && stepAt >= (drawn[at]?.steps ?? 0))\n notes.textContent = deck.slides[at]?.notes || words.noNotes\n const following = deck.slides[at + 1]\n nextBox.replaceChildren(h('span', {}, [following ? words.upNext : words.last]), ...(following ? [renderSlide(following, context).element] : []))\n root.dispatchEvent(new CustomEvent('deck-move', { detail: { at, step: stepAt } }))\n }\n\n /** A click on, or the next key: the next step, else the next slide. @param {number} by */\n function move(by) {\n const steps = drawn[at]?.steps ?? 0\n if (by > 0 && stepAt < steps) { stepAt++; show(); return }\n if (by < 0 && stepAt > 0) { stepAt--; show(); return }\n const to = at + by\n if (to < 0 || to >= drawn.length) return\n go(to, by > 0 ? 0 : drawn[to].steps)\n }\n\n /** @param {number} to @param {number} [toStep] */\n function go(to, toStep = 0) {\n if (to === at) { stepAt = toStep; show(); return }\n const forward = to > at\n const settings = deck.slides[forward ? to : at]?.settings ?? {}\n const named = String(settings.transition ?? deck.settings.transition ?? 'none')\n // Slidev's `a | b`: one going forward, the other going back.\n const [ahead, behind] = named.split('|').map((part) => part.trim())\n let kind = forward ? ahead : behind ?? ahead\n if (dir === 'rtl') kind = kind.replace(/-(left|right)$/, (_, side) => (side === 'left' ? '-right' : '-left'))\n if (kind === 'view-transition') kind = 'morph'\n const update = () => { at = to; stepAt = toStep; if (kind === 'morph') name(drawn[to].element); show() }\n const reduced = matchMedia('(prefers-reduced-motion: reduce)').matches\n if (!document.startViewTransition || kind === 'none' || reduced || root.classList.contains('is-overview')) return update()\n if (kind === 'morph') name(drawn[at].element, drawn[to].element)\n document.documentElement.dataset.deckTransition = kind\n const transition = document.startViewTransition(update)\n // A transition skipped by the next one, as a clicker pressed twice does, is no error.\n transition.ready.catch(() => {})\n transition.finished.finally(() => {\n delete document.documentElement.dataset.deckTransition\n for (const { element } of drawn) for (const one of element.querySelectorAll('[data-morph]')) { /** @type {HTMLElement} */ (one).style.removeProperty('view-transition-name'); one.removeAttribute('data-morph') }\n })\n }\n\n /**\n * Morph, as Keynote's Magic Move and PowerPoint's Morph do it, with nothing to write: what two\n * slides share (a heading's words, a list item's, a picture, a chart) gets one name on each,\n * so the browser moves it from where it was to where it goes. Called with the slide shown and\n * the next, then with the next alone once it shows. @param {HTMLElement} slide @param {HTMLElement} [toward]\n */\n function name(slide, toward) {\n const key = (/** @type {Element} */ el) => `${el.tagName}:${el.tagName === 'IMG' ? el.getAttribute('src') : (el.textContent ?? '').trim().slice(0, 80)}`\n const parts = (/** @type {HTMLElement} */ s) => /** @type {HTMLElement[]} */ ([...s.querySelectorAll('h1, h2, h3, h4, .deck-h, li, p, img, .deck-block, blockquote, .deck-image')])\n if (toward) {\n const there = new Map(parts(toward).map((el) => [key(el), el]))\n let n = 0\n for (const el of parts(slide)) {\n const match = there.get(key(el))\n if (!match || match.dataset.morph || el.closest('[data-morph]')) continue\n const id = `deck-m${n++}`\n el.dataset.morph = match.dataset.morph = id\n el.style.setProperty('view-transition-name', id)\n }\n return\n }\n for (const el of /** @type {NodeListOf<HTMLElement>} */ (slide.querySelectorAll('[data-morph]'))) {\n const id = /** @type {string} */ (el.dataset.morph)\n for (const old of /** @type {NodeListOf<HTMLElement>} */ (stage.querySelectorAll(`[data-morph=\"${id}\"]`))) if (old !== el) old.style.removeProperty('view-transition-name')\n el.style.setProperty('view-transition-name', id)\n }\n }\n\n /** @param {string} mode */\n function toggle(mode) {\n for (const other of ['is-editing', 'is-presenting', 'is-overview']) if (other !== mode) root.classList.remove(other)\n root.classList.toggle(mode)\n editButton.setAttribute('aria-pressed', String(root.classList.contains('is-editing')))\n presenterButton.setAttribute('aria-pressed', String(root.classList.contains('is-presenting')))\n overviewButton.setAttribute('aria-pressed', String(root.classList.contains('is-overview')))\n if (root.classList.contains('is-editing')) { sourceBox.value = source; sourceBox.focus() }\n show()\n requestAnimationFrame(() => fitAll())\n }\n\n function present() {\n stage.requestFullscreen?.().then(() => stage.focus(), () => {})\n }\n\n /** The source changed, by the Markdown or on a slide: read again, drawn again, where the user is. @param {string} text */\n function setSource(text) {\n source = text.replace(/\\r\\n?/g, '\\n')\n deck = parseDeck(source)\n paintLook()\n draw()\n options.onChange?.(source)\n }\n\n // Changed as Markdown: drawn again as the user types, the slide under the caret shown.\n let pending = 0\n sourceBox.addEventListener('input', (event) => {\n if (/** @type {InputEvent} */ (event).isComposing) return\n clearTimeout(pending)\n pending = setTimeout(() => setSource(sourceBox.value), 120)\n })\n const followCaret = () => {\n const caret = sourceBox.selectionStart\n const found = deck.slides.findIndex((slide) => caret >= slide.start && caret <= slide.end + 1)\n if (found >= 0 && found !== at) { at = found; stepAt = drawn[found]?.steps ?? 0; show() }\n }\n sourceBox.addEventListener('keyup', followCaret)\n sourceBox.addEventListener('click', followCaret)\n\n // Changed in place: a double click on words makes them editable; Enter or leaving keeps them.\n stage.addEventListener('dblclick', (event) => {\n if (options.editable === false || document.fullscreenElement) return\n const target = /** @type {HTMLElement | null} */ (/** @type {Element} */ (event.target).closest('[data-edit]'))\n if (!target) return\n const [from, to] = /** @type {string} */ (target.dataset.edit).split('-').map(Number)\n target.contentEditable = 'true'\n target.focus()\n const done = (/** @type {boolean} */ keep) => {\n target.removeEventListener('keydown', key)\n target.removeEventListener('blur', blur)\n target.contentEditable = 'false'\n const words = markdownOf(target)\n if (keep && words !== source.slice(from, to)) setSource(source.slice(0, from) + words + source.slice(to))\n else draw()\n }\n const key = (/** @type {KeyboardEvent} */ e) => {\n if (e.isComposing) return\n if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); done(true) }\n if (e.key === 'Escape') { e.preventDefault(); done(false) }\n }\n const blur = () => done(true)\n target.addEventListener('keydown', key)\n target.addEventListener('blur', blur)\n })\n\n // The keys a clicker sends, and the deck's own.\n root.addEventListener('keydown', (event) => {\n const target = /** @type {HTMLElement} */ (event.target)\n if (target.isContentEditable || target === sourceBox || (target.tagName === 'BUTTON' && (event.key === ' ' || event.key === 'Enter'))) {\n if ((event.metaKey || event.ctrlKey) && event.key === 's') { event.preventDefault(); options.onSave?.(source) }\n return\n }\n const forward = dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight', backward = dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft'\n if (event.altKey || event.ctrlKey || event.metaKey) {\n if ((event.metaKey || event.ctrlKey) && event.key === 's') { event.preventDefault(); options.onSave?.(source) }\n return\n }\n const acts = /** @type {Record<string, () => void>} */ ({\n [forward]: () => move(1), [backward]: () => move(-1), ArrowDown: () => move(1), ArrowUp: () => move(-1), PageDown: () => move(1), PageUp: () => move(-1), ' ': () => move(1),\n Home: () => go(0), End: () => go(drawn.length - 1, drawn.at(-1)?.steps ?? 0), f: present, p: () => toggle('is-presenting'), o: () => toggle('is-overview'), e: () => toggle('is-editing'),\n })\n const act = acts[event.key]\n if (!act) return\n event.preventDefault()\n act()\n })\n stage.addEventListener('click', (event) => {\n if (document.fullscreenElement && !(/** @type {Element} */ (event.target).closest('a, button, input'))) move(1)\n })\n let touch = 0\n stage.addEventListener('touchstart', (event) => { touch = event.touches[0].clientX }, { passive: true })\n stage.addEventListener('touchend', (event) => {\n const dx = event.changedTouches[0].clientX - touch\n if (Math.abs(dx) > 50) move((dx < 0) === (dir !== 'rtl') ? 1 : -1)\n })\n dark.addEventListener('change', () => { chooseScheme(); paintLook() })\n const tick = setInterval(() => {\n const s = Math.floor((Date.now() - started) / 1000)\n clock.textContent = root.classList.contains('is-presenting') ? `${String(Math.floor(s / 60)).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}` : ''\n }, 1000)\n\n chooseScheme()\n paintLook()\n draw()\n document.fonts?.ready.then(() => fitAll())\n\n const view = {\n root, stage, get source() { return source }, get deck() { return deck }, get at() { return at }, get scheme() { return scheme }, get kit() { return context.kit }, get kitProblems() { return kitProblems }, lang, dir,\n slides: () => drawn.map(({ element }) => element), setSource, go, toggle, present, fitAll,\n setScheme: (/** @type {'light' | 'dark'} */ value) => { scheme = value; paintLook() },\n destroy: () => clearInterval(tick),\n }\n return view\n}\n\n/** The Markdown of words changed in place: bold, italics, code and links kept as Markdown writes them. @param {Node} node @returns {string} */\nexport function markdownOf(node) {\n let out = ''\n for (const child of node.childNodes) {\n if (child.nodeType === Node.TEXT_NODE) out += (child.textContent ?? '').replace(/([*_`[\\]\\\\])/g, '\\\\$1')\n else if (child instanceof HTMLElement) {\n const inner = markdownOf(child)\n out += ({ STRONG: `**${inner}**`, B: `**${inner}**`, EM: `*${inner}*`, I: `*${inner}*`, CODE: `\\`${child.textContent}\\``, DEL: `~~${inner}~~`, BR: ' \\n',\n A: `[${inner}](${child.getAttribute('href') ?? ''})` })[child.tagName] ?? inner\n }\n }\n return out.replace(/ /g, ' ').replace(/\\n+$/, '')\n}\n", "// The drawers a deck opened on its own uses for ```echarts and ```mermaid, each library loaded\n// from `base` (a CDN by default) the first time a slide needs it, never before. A chart is data,\n// read with JSON.parse; it takes the deck's colours and type, light or dark, and is drawn as SVG.\n// A diagram is drawn by Pele from Mermaid's language as SVG, then shown as a picture, so nothing it\n// makes runs or joins the page; its words are its picture's text for whoever can't see it. A host (Jean) gives\n// its own drawers instead.\n\n/** @typedef {{ base: string, root: HTMLElement, versions?: { echarts?: string, pele?: string } }} Where */\n\n/** @type {Map<string, Promise<any>>} */\nconst loading = new Map()\n\n/** A classic script, loaded once: from a file:// page, modules from elsewhere are not always let in. @param {string} src @param {string} global */\nfunction script(src, global) {\n if (!loading.has(src)) loading.set(src, new Promise((resolve, reject) => {\n const tag = document.createElement('script')\n tag.src = src\n tag.onload = () => resolve(/** @type {any} */ (globalThis)[global])\n tag.onerror = reject\n document.head.append(tag)\n }))\n return /** @type {Promise<any>} */ (loading.get(src))\n}\n\n/**\n * A library's file: from a CDN's npm mirror, at its version (`https://…/npm/name@1.2.3/file`), or from a\n * node_modules folder, which holds one version (`…/node_modules/name/file`).\n * @param {string} base @param {string} name @param {string} version @param {string} file\n */\nexport const libraryAt = (base, name, version, file) => (/node_modules\\/$/.test(base) ? `${base}${name}/${file}` : `${base}${name}@${version}/${file}`)\n\n/** @param {Where} where */\nexport function defaultBlocks({ base, root, versions = {} }) {\n const { echarts: chartsAt = '6.1.0', pele: diagramsAt = '1.10.0' } = versions\n /** @type {Set<{ chart: any, option: any, box: HTMLElement }>} */\n const charts = new Set()\n /** @type {any} */\n let colours = null\n root.addEventListener('deck-scheme', (event) => {\n colours = /** @type {CustomEvent} */ (event).detail.colours\n for (const one of charts) one.chart.setOption(themed(one.option, one.box), true)\n })\n // Its type sized with the slide's, its category axis read from the right in a language written so.\n const themed = (/** @type {any} */ option, /** @type {HTMLElement} */ box) => {\n const size = parseFloat(getComputedStyle(box).fontSize) || 16\n const rtl = getComputedStyle(box).direction === 'rtl'\n const small = Math.round(size * 0.6)\n const axis = (/** @type {any} */ given, /** @type {boolean} */ across) => given === undefined ? undefined : [given].flat().map((one) => ({\n axisLabel: { color: colours?.muted, fontSize: small }, axisLine: { lineStyle: { color: colours?.line } }, splitLine: { lineStyle: { color: colours?.line } },\n nameTextStyle: { color: colours?.muted, fontSize: small }, ...(rtl && across && one.type === 'category' ? { inverse: true } : {}), ...(rtl && !across ? { position: 'right' } : {}), ...one,\n }))\n return {\n color: colours?.series, backgroundColor: 'transparent', animation: !matchMedia('(prefers-reduced-motion: reduce)').matches,\n textStyle: { fontFamily: getComputedStyle(root).getPropertyValue('--deck-body') || 'system-ui', color: colours?.ink, fontSize: small },\n ...option,\n title: option.title ? { ...option.title, textStyle: { color: colours?.ink, fontSize: Math.round(size * 0.8), ...option.title?.textStyle } } : undefined,\n legend: option.legend ? { itemWidth: small * 1.6, itemHeight: small, ...option.legend, textStyle: { color: colours?.ink, fontSize: small, ...option.legend?.textStyle } } : undefined,\n grid: { containLabel: true, left: small, right: small, top: option.title ? size * 1.8 : small, bottom: option.legend ? size * 1.6 : small, ...option.grid },\n xAxis: axis(option.xAxis, true), yAxis: axis(option.yAxis, false), toolbox: undefined,\n series: [option.series ?? []].flat().map((one) => (one.type === 'pie' ? { label: { color: colours?.ink, fontSize: small }, ...one } : one)),\n }\n }\n return {\n /** @param {HTMLElement} box @param {string} source */\n async echarts(box, source) {\n const option = JSON.parse(source)\n const echarts = await script(libraryAt(base, 'echarts', chartsAt, 'dist/echarts.min.js'), 'echarts')\n const place = document.createElement('div')\n place.className = 'deck-chart'\n place.setAttribute('role', 'img')\n place.setAttribute('aria-label', String(option.title?.text ?? ''))\n box.append(place)\n const chart = echarts.init(place, null, { renderer: 'svg', locale: document.documentElement.lang?.startsWith('ja') ? 'JA' : 'EN' })\n const one = { chart, option, box }\n charts.add(one)\n chart.setOption(themed(option, box))\n new ResizeObserver(() => { chart.resize(); chart.setOption(themed(option, box), true) }).observe(place)\n Object.assign(box, { chart })\n },\n /**\n * A diagram written in Mermaid's language, drawn by Pele (Obsidian's, MIT): every kind Mermaid\n * 12.1 has, no DOM needed, an SVG with no script or HTML in it. Shown as a picture, its colours\n * the deck's, set as Pele's variables inside it. @param {HTMLElement} box @param {string} source\n */\n async mermaid(box, source) {\n const pele = await script(libraryAt(base, 'pele', diagramsAt, 'dist/pele.global.js'), 'pele')\n const font = getComputedStyle(root).getPropertyValue('--deck-body') || 'system-ui, sans-serif'\n const { svg } = pele.render(source, { fontFamily: font, links: false, images: false, autoDirection: true, maxWidth: Math.max(320, box.clientWidth * 1.4) })\n const look = `--pele-bg:transparent;--pele-fg:${colours?.ink};--pele-muted:${colours?.muted};--pele-line:${colours?.muted};--pele-surface:${colours?.soft};--pele-surface-alt:${colours?.line};--pele-border:${colours?.primary};--pele-accent:${colours?.primary};--pele-font:${font.replace(/[<>\"]/g, '')}`\n const picture = document.createElement('img')\n picture.alt = source\n picture.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg.replace(/^(<svg\\b[^>]*>)/, `$1<style>svg{${look}}</style>`))}`\n const place = document.createElement('div')\n place.className = 'deck-diagram'\n place.append(picture)\n box.append(place)\n },\n }\n}\n", "// deck's version, which a linked file names in its renderer's address. Kept equal to package.json's by a test.\nexport const VERSION = '0.1.1'\n", "// A deck file, `.deck.html`: a web page any browser opens, whose Markdown sits whole in one\n// element, <script type=\"text/markdown\" id=\"deck\">, which no browser runs. Read and written here\n// as text, never parsed as HTML, so a host can read a deck without running anything in it.\n// The one escape: `<script` and `</script`, in any case, gain a backslash after their `<` (and\n// one more for each already there), which reading takes away again: the HTML parser ends the\n// element at `</script`, and a `<script` after `<!--` would keep it from ending. Pure.\n\nimport { VERSION } from './version.js'\n\nexport const OPEN = '<script type=\"text/markdown\" id=\"deck\">'\nconst CLOSE = '</script>'\n\n/** @param {string} markdown */\nexport const escape = (markdown) => markdown.replace(/<(\\\\*)(\\/?script)/gi, '<\\\\$1$2')\n/** @param {string} text */\nexport const unescape = (text) => text.replace(/<\\\\(\\\\*)(\\/?script)/gi, '<$1$2')\n\n/** @param {string} text */\nconst attribute = (text) => text.replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;')\n/** @param {string} text */\nconst content = (text) => text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n\n/**\n * Code held whole in the file: `</script`, `<script` and `<!--`, which only a string or a regular\n * expression of a bundle holds, written with `\\x3C` for their `<`, which reads the same there.\n * @param {string} code\n */\nexport function inlineCode(code) {\n if (/\\\\<(!--|\\/?script)/i.test(code)) throw new Error('This code cannot be held in a page as it is.')\n return code.replace(/<(!--|\\/?script)/gi, '\\\\x3C$1')\n}\n\n/**\n * A deck's Markdown, from a file's text, or null when it holds none.\n * @param {string} html @returns {string | null}\n */\nexport function readDeckFile(html) {\n const at = html.indexOf(OPEN)\n if (at < 0) return null\n const from = at + OPEN.length\n const end = html.slice(from).search(/<\\/script/i)\n if (end < 0) return null\n return unescape(html.slice(from, from + end).replace(/^\\n/, '').replace(/\\n$/, ''))\n}\n\n/** Where a linked file finds its renderer: this version of the package, on jsDelivr's npm mirror. @param {string} [version] */\nexport const rendererUrl = (version = VERSION) => `https://cdn.jsdelivr.net/npm/@codename/deck@${version}/dist/deck.js`\n\n/**\n * A deck file around its Markdown: its title, language and direction in the page's head for\n * whatever reads it before the renderer does, then the Markdown, in the body (the head is never shown), readable as it is when no\n * renderer comes, then the renderer: linked by default, to this version's address, or held whole;\n * `base` tells it where to load the libraries a slide needs (a CDN's npm mirror, or a node_modules).\n * @param {string} markdown\n * @param {{ title?: string, lang?: string, dir?: string, renderer?: { src: string } | { code: string }, base?: string, generator?: string }} [options]\n */\nexport function writeDeckFile(markdown, { title = '', lang = 'en', dir = 'auto', renderer = { src: rendererUrl() }, base, generator = `deck ${VERSION}` } = {}) {\n const data = base ? ` data-base=\"${attribute(base)}\"` : ''\n const script = 'src' in renderer ? `<script src=\"${attribute(renderer.src)}\"${data}></script>` : `<script${data}>${inlineCode(renderer.code)}</script>`\n return /* html */ `<!doctype html>\n<html lang=\"${attribute(lang)}\" dir=\"${attribute(dir)}\">\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"generator\" content=\"${attribute(generator)}\">\n<title>${content(title)}</title>\n<style>#deck{display:block;white-space:pre-wrap;overflow-wrap:anywhere;font:1rem/1.6 ui-monospace,Menlo,Consolas,monospace;max-width:72ch;margin:2rem auto;padding:0 1rem}</style>\n<body>\n${OPEN}\n${escape(markdown)}\n${CLOSE}\n${script}\n</html>\n`\n}\n", "// A deck as a PowerPoint file to change in PowerPoint, Keynote or Google Slides: each layout a\n// slide layout of its own (a master, in PptxGenJS's words) with a placeholder for its title and\n// each of its slots, so a slide added there looks like the deck's; words as PowerPoint's own text,\n// a list's levels as its levels; a table as a table; a chart of bars, lines, areas, pies, rings,\n// points or a radar as PowerPoint's own chart, its numbers in the file to change; anything else (a\n// diagram, another chart, a picture) as a picture; the speaker's notes as notes; each slide's\n// transition as PowerPoint's (Morph where it has one, a fade where it hasn't); the look's colours\n// as the file's theme. Read from the deck as drawn, each box where the browser put it, so the file\n// looks like the slides, in the scheme shown. PptxGenJS (with its JSZip) is the host's to load.\n\nimport { labelOf } from './kit.js'\n\nconst W = 13.333, H = 7.5\nconst TEXT = 'h1, h2, h3, h4, h5, h6, .deck-h, p, ul, ol, blockquote'\n\n/** @param {string} value rgb(…) or #… @returns {string} six hex digits */\nfunction hexOf(value) {\n const m = /rgba?\\(\\s*([\\d.]+)[,\\s]+([\\d.]+)[,\\s]+([\\d.]+)/.exec(value)\n if (m) return [m[1], m[2], m[3]].map((n) => Math.round(Number(n)).toString(16).padStart(2, '0')).join('').toUpperCase()\n return value.replace('#', '').toUpperCase().slice(0, 6) || '000000'\n}\n/** @param {string} value */\nconst opaque = (value) => !/rgba\\([^)]*,\\s*0\\)|transparent/.test(value)\n\n/**\n * @param {import('./deck.js').DeckView} view\n * @param {{ PptxGenJS: any, JSZip: any }} libraries\n * @returns {Promise<{ blob: Blob, report: { slides: number, charts: number, pictures: number, tables: number, placeholders: number } }>}\n */\nexport async function toPptx(view, { PptxGenJS, JSZip }) {\n const pres = new PptxGenJS()\n pres.layout = 'LAYOUT_WIDE'\n pres.title = view.deck.slides[0]?.title ?? ''\n pres.rtlMode = view.dir === 'rtl'\n const rootStyle = getComputedStyle(view.root)\n const firstFont = (/** @type {string} */ stack) => stack.split(',').map((f) => f.trim().replace(/^[\"']|[\"']$/g, '')).find((f) => !/^(ui-|system-ui|-apple|sans-serif|serif|monospace)/.test(f)) ?? 'Arial'\n pres.theme = { headFontFace: firstFont(rootStyle.getPropertyValue('--deck-heading')), bodyFontFace: firstFont(rootStyle.getPropertyValue('--deck-body')) }\n const report = { slides: 0, charts: 0, pictures: 0, tables: 0, placeholders: 0 }\n const rtl = view.dir === 'rtl'\n const slides = view.slides()\n const masters = new Map()\n const transitions = []\n\n for (const [i, element] of slides.entries()) {\n const box = element.getBoundingClientRect()\n const sx = W / box.width\n const place = (/** @type {Element} */ el) => {\n const r = el.getBoundingClientRect()\n return { x: (r.left - box.left) * sx, y: (r.top - box.top) * sx, w: r.width * sx, h: r.height * sx }\n }\n // Words as wide as their slot, never as their line: PowerPoint sets type a little wider than a browser.\n const across = (/** @type {Element} */ el) => {\n const slot = el.closest('.deck-slot') ?? el\n const { x, w } = place(slot), { y, h } = place(el)\n const pad = getComputedStyle(slot)\n const start = parseFloat(pad.paddingInlineStart) * sx, end = parseFloat(pad.paddingInlineEnd) * sx\n return { x: x + (rtl ? end : start), y, w: w - start - end, h: h * 1.08 }\n }\n // Where a layout centres its words, PowerPoint's box centres them too.\n const anchor = (/** @type {Element} */ slot) => (getComputedStyle(slot).justifyContent === 'center' ? 'middle' : 'top')\n const pt = (/** @type {number} */ px) => Math.round(px * sx * 72 * 10) / 10\n const style = getComputedStyle(element)\n const layout = element.dataset.layout ?? 'default'\n const slots = /** @type {HTMLElement[]} */ ([...element.querySelectorAll('.deck-slot')])\n const firstBlock = slots[0]?.firstElementChild\n const title = firstBlock && firstBlock.matches('h1, h2, h3, .deck-h') ? firstBlock : null\n\n // One master a layout, its placeholders where the first slide of it has its title and slots.\n // Named as the kit names the layout, in the deck's language, so PowerPoint's Layout menu reads it.\n const definition = view.kit.layouts[layout]\n const masterName = `${definition ? labelOf(definition, layout, view.lang) : layout}${element.classList.contains('deck-class-invert') ? ' (dark)' : ''}`\n if (!masters.has(masterName)) {\n const objects = []\n if (title) objects.push({ placeholder: { options: { name: 'title', type: 'title', ...across(title), valign: 'bottom', margin: 0, fontFace: pres.theme.headFontFace, color: hexOf(getComputedStyle(title).color), align: rtl ? 'right' : 'left' }, text: '' } })\n for (const slot of slots) {\n const r = place(slot)\n const top = title && slot === slots[0] ? place(title).y + place(title).h : r.y\n const inner = slot.firstElementChild && slot.firstElementChild !== title ? across(slot.firstElementChild) : { x: r.x, w: r.w }\n objects.push({ placeholder: { options: { name: `body-${slot.dataset.slot}`, type: 'body', x: inner.x, y: top + 0.08, w: inner.w, h: Math.max(0.3, r.y + r.h - top - 0.08), margin: 0, valign: anchor(slot), color: hexOf(getComputedStyle(slot).color) }, text: '' } })\n }\n pres.defineSlideMaster({\n title: masterName, background: { color: hexOf(style.backgroundColor) }, objects,\n slideNumber: definition?.numbered !== false ? { x: rtl ? 0.3 : W - 0.9, y: H - 0.55, w: 0.6, h: 0.3, fontSize: 10, color: hexOf(rootStyle.getPropertyValue('--deck-muted').trim() || '#666666') } : undefined,\n })\n masters.set(masterName, new Set(objects.map((o) => o.placeholder.options.name)))\n }\n const names = masters.get(masterName)\n const slide = pres.addSlide({ masterName })\n report.slides++\n\n const background = element.querySelector('.deck-image')\n if (background) {\n const url = /url\\(\"?(.*?)\"?\\)/.exec(getComputedStyle(background).backgroundImage)?.[1]\n const data = url && await pictureOf(url, background.clientWidth * 2, background.clientHeight * 2, true)\n if (data) { slide.addImage({ data, ...place(background) }); report.pictures++ }\n }\n if (title && names.has('title')) {\n slide.addText(runs(title, { pt, rtl, lang: view.lang }), { placeholder: 'title' })\n report.placeholders++\n }\n for (const slot of slots) {\n const blocks = [...slot.children].filter((child) => child !== title)\n const textOnly = blocks.length > 0 && blocks.every((child) => child.matches(TEXT))\n if (textOnly && names.has(`body-${slot.dataset.slot}`)) {\n slide.addText(blocks.flatMap((block) => runs(block, { pt, rtl, lang: view.lang })), { placeholder: `body-${slot.dataset.slot}`, valign: anchor(slot), ...(spaced(slot)) })\n report.placeholders++\n continue\n }\n for (const block of blocks) {\n const at = place(block)\n if (block.matches(TEXT)) slide.addText(runs(block, { pt, rtl, lang: view.lang }), { ...across(block), valign: 'top', margin: 0, ...(spaced(slot)) })\n else if (block.matches('pre')) {\n slide.addText(block.textContent?.replace(/\\n$/, '') ?? '', { ...at, fontFace: 'Consolas', fontSize: pt(parseFloat(getComputedStyle(block).fontSize)), color: hexOf(getComputedStyle(block).color), fill: { color: hexOf(getComputedStyle(block).backgroundColor) }, valign: 'top', margin: 6, rtlMode: false, align: 'left' })\n } else if (block.matches('.deck-table')) {\n table(slide, block, at, { pt, rtl, lang: view.lang })\n report.tables++\n } else if (block.matches('.deck-echarts') && /** @type {any} */ (block).chart) {\n const chart = /** @type {any} */ (block).chart\n if (nativeChart(pres, slide, chart, at, { pt, rtl, lang: view.lang, ink: hexOf(style.color) })) report.charts++\n else { slide.addImage({ data: await pictureOf(`data:image/svg+xml;charset=utf-8,${encodeURIComponent(chart.renderToSVGString())}`, at.w / sx * 2, at.h / sx * 2), ...at }); report.pictures++ }\n } else {\n const img = block.querySelector('img')\n if (img) {\n const data = await pictureOf(img.src, img.clientWidth * 2, img.clientHeight * 2)\n if (data) { slide.addImage({ data, ...place(img), altText: img.alt }); report.pictures++ }\n }\n }\n }\n }\n const notes = view.deck.slides[i]?.notes\n if (notes) slide.addNotes(notes)\n const settings = view.deck.slides[i]?.settings ?? {}\n transitions.push(String(settings.transition ?? view.deck.settings.transition ?? 'none').split('|')[0].trim())\n }\n\n // What PptxGenJS doesn't write: each slide's transition, and the look's colours as the theme.\n const zip = await JSZip.loadAsync(await pres.write({ outputType: 'arraybuffer', compression: true }))\n for (const [i, kind] of transitions.entries()) {\n const path = `ppt/slides/slide${i + 1}.xml`\n const xml = await zip.file(path)?.async('string')\n if (!xml || kind === 'none') continue\n zip.file(path, xml.replace(/<\\/p:clrMapOvr>|(?=<p:timing|<\\/p:sld>)/, (/** @type {string} */ found) => `${found}${transitionXml(kind, rtl)}`))\n }\n const theme = await zip.file('ppt/theme/theme1.xml')?.async('string')\n if (theme) {\n const colour = (/** @type {string} */ name) => hexOf(rootStyle.getPropertyValue(`--deck-${name}`).trim())\n const series = [colour('fill'), ...[2, 3, 4, 5, 6].map((n) => colour(`series-${n}`))]\n const scheme = `<a:clrScheme name=\"Deck\"><a:dk1><a:srgbClr val=\"${colour('ink')}\"/></a:dk1><a:lt1><a:srgbClr val=\"${colour('paper')}\"/></a:lt1><a:dk2><a:srgbClr val=\"${colour('ink')}\"/></a:dk2><a:lt2><a:srgbClr val=\"${colour('soft')}\"/></a:lt2>${series.map((c, n) => `<a:accent${n + 1}><a:srgbClr val=\"${c}\"/></a:accent${n + 1}>`).join('')}<a:hlink><a:srgbClr val=\"${colour('primary')}\"/></a:hlink><a:folHlink><a:srgbClr val=\"${colour('primary')}\"/></a:folHlink></a:clrScheme>`\n zip.file('ppt/theme/theme1.xml', theme.replace(/<a:clrScheme[\\s\\S]*?<\\/a:clrScheme>/, scheme))\n }\n const blob = await zip.generateAsync({ type: 'blob', compression: 'DEFLATE', mimeType: 'application/vnd.openxmlformats-officedocument.presentationml.presentation' })\n return { blob, report }\n}\n\n/** A slot's paragraphs' spacing, from the space under its first block. @param {HTMLElement} slot */\nfunction spaced(slot) {\n const first = slot.firstElementChild\n const after = first ? parseFloat(getComputedStyle(first).marginBlockEnd) : 0\n return { paraSpaceAfter: Math.round(after * 0.5) }\n}\n\n/**\n * A block's words as PowerPoint's runs: each paragraph or list item ends its line; bold, italics,\n * code and links kept; a list's level as its indent level.\n * @param {Element} block @param {{ pt: (px: number) => number, rtl: boolean, lang: string }} how @returns {any[]}\n */\nfunction runs(block, how) {\n /** @type {any[]} */\n const out = []\n const paragraph = (/** @type {Element} */ el, /** @type {Record<string, any>} */ extra) => {\n const style = getComputedStyle(el)\n const base = { fontSize: how.pt(parseFloat(style.fontSize)), color: hexOf(style.color), bold: Number(style.fontWeight) >= 600, lang: how.lang, rtlMode: how.rtl, align: style.textAlign === 'center' ? 'center' : how.rtl ? 'right' : 'left', ...extra }\n const pieces = inlineRuns(el, base)\n if (!pieces.length) return\n pieces[pieces.length - 1].options.breakLine = true\n out.push(...pieces)\n }\n const list = (/** @type {Element} */ el, /** @type {number} */ level) => {\n let n = 0\n for (const li of el.children) {\n n++\n const nested = [...li.children].filter((c) => c.matches('ul, ol'))\n const clone = /** @type {Element} */ (li.cloneNode(true))\n for (const c of [...clone.children]) if (c.matches('ul, ol, input')) c.remove()\n li.after(clone)\n paragraph(clone, { bullet: el.tagName === 'OL' ? { type: 'number', startAt: n === 1 ? Number(el.getAttribute('start') ?? 1) : undefined } : true, indentLevel: level })\n clone.remove()\n for (const sub of nested) list(sub, level + 1)\n }\n }\n if (block.matches('ul, ol')) list(block, 0)\n else if (block.matches('blockquote')) for (const p of block.children) paragraph(p, { italic: getComputedStyle(p).fontStyle === 'italic' })\n else paragraph(block, {})\n return out\n}\n\n/** @param {Node} node @param {Record<string, any>} base @returns {any[]} */\nfunction inlineRuns(node, base) {\n /** @type {any[]} */\n const out = []\n const walk = (/** @type {Node} */ n, /** @type {Record<string, any>} */ options) => {\n if (n.nodeType === Node.TEXT_NODE) {\n const text = (n.textContent ?? '').replace(/\\s+/g, ' ')\n if (text) out.push({ text, options: { ...options } })\n return\n }\n if (!(n instanceof HTMLElement)) return\n if (n.tagName === 'BR') { if (out.length) out[out.length - 1].options.breakLine = true; return }\n const own = { ...options }\n if (n.matches('strong, b')) { own.bold = true; own.color = hexOf(getComputedStyle(n).color) }\n if (n.matches('em, i')) own.italic = true\n if (n.matches('del, s')) own.strike = 'sngStrike'\n if (n.matches('code')) own.fontFace = 'Consolas'\n if (n.matches('a[href]')) own.hyperlink = { url: n.getAttribute('href') }\n for (const child of n.childNodes) walk(child, own)\n }\n for (const child of node.childNodes) walk(child, base)\n if (out.length) { out[0].text = out[0].text.trimStart(); out[out.length - 1].text = out[out.length - 1].text.trimEnd() }\n return out.filter((run) => run.text)\n}\n\n/** @param {any} slide @param {Element} block @param {{ x: number, y: number, w: number, h: number }} at @param {{ pt: (px: number) => number, rtl: boolean, lang: string }} how */\nfunction table(slide, block, at, how) {\n const rows = [...block.querySelectorAll('tr')].map((tr) => [...tr.children].map((cell) => {\n const style = getComputedStyle(cell)\n const align = cell.getAttribute('data-align')\n return { text: cell.textContent?.trim() ?? '', options: {\n bold: cell.tagName === 'TH', fontSize: how.pt(parseFloat(style.fontSize)), color: hexOf(style.color), lang: how.lang, rtlMode: how.rtl,\n align: align === 'center' ? 'center' : (align === 'right') !== how.rtl ? 'right' : 'left',\n border: [{ type: 'none' }, { type: 'none' }, { type: 'solid', pt: cell.tagName === 'TH' ? 1.5 : 0.75, color: hexOf(style.borderBlockEndColor) }, { type: 'none' }],\n } }\n }))\n const widths = [...(block.querySelector('tr')?.children ?? [])].map((cell) => cell.getBoundingClientRect().width)\n const total = widths.reduce((a, b) => a + b, 0) || 1\n slide.addTable(how.rtl ? rows.map((r) => r.reverse()) : rows, { ...at, colW: (how.rtl ? widths.reverse() : widths).map((w) => (w / total) * at.w), margin: 0.06 })\n}\n\n/**\n * An ECharts chart as PowerPoint's own, when it is one PowerPoint draws: bars, lines, areas, a pie\n * or a ring, points, a radar; false when it isn't. @returns {boolean}\n */\nfunction nativeChart(/** @type {any} */ pres, /** @type {any} */ slide, /** @type {any} */ chart, /** @type {{ x: number, y: number, w: number, h: number }} */ at, /** @type {{ pt: (px: number) => number, rtl: boolean, lang: string, ink: string }} */ how) {\n const option = chart.getOption()\n const series = /** @type {any[]} */ (option.series ?? [])\n if (!series.length) return false\n const types = new Set(series.map((s) => s.type))\n const colours = /** @type {string[]} */ (option.color ?? []).map(hexOf)\n const value = (/** @type {any} */ v) => (Array.isArray(v) ? Number(v.at(-1)) : typeof v === 'object' && v !== null ? Number(v.value) : Number(v))\n const common = { ...at, showLegend: series.length > 1 || types.has('pie'), legendPos: 'b', legendFontSize: 12, legendColor: how.ink, chartColors: colours, showTitle: Boolean(option.title?.[0]?.text), title: option.title?.[0]?.text, titleFontSize: 16, titleColor: how.ink, catAxisLabelColor: how.ink, valAxisLabelColor: how.ink, dataLabelColor: how.ink, lang: how.lang }\n if (types.size === 1 && (types.has('pie'))) {\n const pie = series[0]\n const ring = Array.isArray(pie.radius) && parseFloat(pie.radius[0]) > 0\n slide.addChart(ring ? pres.charts.DOUGHNUT : pres.charts.PIE, [{ name: pie.name ?? '', labels: pie.data.map((/** @type {any} */ d) => d.name), values: pie.data.map(value) }], { ...common, showPercent: true, showLegend: true, holeSize: ring ? 55 : undefined })\n return true\n }\n if ([...types].every((t) => t === 'bar' || t === 'line')) {\n const horizontal = option.yAxis?.[0]?.type === 'category'\n const labels = (horizontal ? option.yAxis : option.xAxis)?.[0]?.data ?? []\n const of = (/** @type {any} */ s) => [{ name: s.name ?? '', labels: labels.map(String), values: s.data.map(value) }]\n const kind = (/** @type {any} */ s) => (s.type === 'bar' ? pres.charts.BAR : s.areaStyle ? pres.charts.AREA : pres.charts.LINE)\n const axes = { catAxisLabelFontSize: 11, valAxisLabelFontSize: 11, valGridLine: { color: 'D9D9D9', size: 0.5 }, catAxisOrientation: how.rtl && !horizontal ? 'maxMin' : 'minMax', valAxisLabelFormatCode: '#,##0' }\n if (types.size === 1) {\n const data = series.flatMap(of)\n slide.addChart(kind(series[0]), data, { ...common, ...axes, barDir: horizontal ? 'bar' : 'col', barGrouping: series.some((s) => s.stack) ? 'stacked' : 'clustered', lineDataSymbol: 'circle', lineSize: 2 })\n } else slide.addChart(series.map((s) => ({ type: kind(s), data: of(s), options: { barDir: horizontal ? 'bar' : 'col', chartColors: [colours[series.indexOf(s) % colours.length]] } })), { ...common, ...axes })\n return true\n }\n if (types.size === 1 && types.has('scatter')) {\n const points = series[0].data.map((/** @type {any} */ d) => (Array.isArray(d) ? d : [d.value?.[0], d.value?.[1]]))\n slide.addChart(pres.charts.SCATTER, [{ name: 'X', values: points.map((/** @type {any[]} */ p) => p[0]) }, { name: series[0].name ?? 'Y', values: points.map((/** @type {any[]} */ p) => p[1]) }], { ...common, lineSize: 0, lineDataSymbolSize: 8 })\n return true\n }\n if (types.size === 1 && types.has('radar')) {\n const indicators = option.radar?.[0]?.indicator ?? []\n slide.addChart(pres.charts.RADAR, series[0].data.map((/** @type {any} */ d) => ({ name: d.name ?? '', labels: indicators.map((/** @type {any} */ i) => i.name), values: d.value })), { ...common, showLegend: true, radarStyle: 'standard' })\n return true\n }\n return false\n}\n\n/** PowerPoint's transition for Slidev's name: Morph (with a fade where it isn't known), a fade, a push. @param {string} kind @param {boolean} rtl */\nfunction transitionXml(kind, rtl) {\n const push = (/** @type {string} */ dir) => `<p:transition spd=\"med\"><p:push dir=\"${dir}\"/></p:transition>`\n if (kind === 'view-transition' || kind === 'morph') return '<mc:AlternateContent xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"><mc:Choice xmlns:p159=\"http://schemas.microsoft.com/office/powerpoint/2015/09/main\" Requires=\"p159\"><p:transition spd=\"slow\"><p159:morph option=\"byObject\"/></p:transition></mc:Choice><mc:Fallback><p:transition spd=\"slow\"><p:fade/></p:transition></mc:Fallback></mc:AlternateContent>'\n if (kind === 'slide-left') return push(rtl ? 'r' : 'l')\n if (kind === 'slide-right') return push(rtl ? 'l' : 'r')\n if (kind === 'slide-up') return push('u')\n if (kind === 'slide-down') return push('d')\n return '<p:transition spd=\"med\"><p:fade/></p:transition>'\n}\n\n/** A picture's data as PNG, drawn at a size; null when it can't be read (another site's, unshared). @param {string} src @param {number} w @param {number} h @param {boolean} [cover] */\nasync function pictureOf(src, w, h, cover = false) {\n try {\n const img = new Image()\n img.crossOrigin = 'anonymous'\n img.src = src\n await img.decode()\n const canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(w))\n canvas.height = Math.max(1, Math.round(h))\n const ctx = /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d'))\n const iw = img.naturalWidth || w, ih = img.naturalHeight || h\n const scale = cover ? Math.max(canvas.width / iw, canvas.height / ih) : Math.min(canvas.width / iw, canvas.height / ih)\n ctx.drawImage(img, (canvas.width - iw * scale) / 2, (canvas.height - ih * scale) / 2, iw * scale, ih * scale)\n return canvas.toDataURL('image/png')\n } catch {\n return null\n }\n}\n", "/* deck: a slide is a 16:9 box, a size container, whose canvas sizes its type and space with the\n slide's width (cqi), so it wraps the same at any size; its colours and faces are the look's tokens as custom properties; logical properties\n only, so a deck in Arabic mirrors. The others are laid out behind the one shown, unseen. */\n.deck { --deck-paper: #fffdf8; --deck-ink: #1d1b16; --deck-muted: #6b675e; --deck-line: #e4e0d6; --deck-primary: #8a6100; --deck-fill: #f7c531; --deck-on-fill: #1d1b16; --deck-soft: #fdf1c9;\n --deck-heading: system-ui, sans-serif; --deck-body: system-ui, sans-serif; --deck-radius: 10px;\n position: relative; display: grid; gap: 0.5rem; color: var(--deck-ink); font-family: var(--deck-body); }\n.deck *, .deck *::before, .deck *::after { box-sizing: border-box; }\n.deck-stage { position: relative; view-transition-name: deck-stage; }\n.deck-slide {\n container-type: inline-size; position: relative; aspect-ratio: 16 / 9; overflow: hidden; inline-size: 100%;\n background: var(--deck-paper); color: var(--deck-ink); border-radius: var(--deck-radius); box-shadow: 0 0 0 1px var(--deck-line);\n}\n.deck-canvas { position: absolute; inset: 0; display: grid; padding: 6cqi 7cqi 7cqi; gap: 0 4cqi; font-size: 2.6cqi; line-height: 1.4; }\n.deck-slide:not(.is-shown) { position: absolute; inset-block-start: 0; inset-inline-start: 0; visibility: hidden; }\n.deck-slot { --deck-fit: 1; min-block-size: 0; min-inline-size: 0; display: flex; flex-direction: column; justify-content: flex-start; font-size: calc(1em * var(--deck-fit)); overflow: hidden; }\n.deck-slot > :first-child { margin-block-start: 0; }\n.deck-slot > :last-child { margin-block-end: 0; }\n.deck-slide :is(h1, h2, h3, h4, .deck-h) { font-family: var(--deck-heading); font-weight: 700; line-height: 1.15; margin: 0 0 0.55em; text-wrap: balance; letter-spacing: -0.01em; }\n.deck-slide :is(h1, .deck-h1) { font-size: 2.1em; }\n.deck-slide :is(h2, .deck-h2) { font-size: 1.6em; }\n.deck-slide :is(h3, .deck-h3) { font-size: 1.25em; color: var(--deck-primary); }\n.deck-slide :is(p, ul, ol, blockquote, pre, .deck-table, .deck-block) { margin-block: 0 0.7em; }\n.deck-slide :is(ul, ol) { padding-inline-start: 1.2em; }\n.deck-slide li { margin-block-end: 0.3em; }\n.deck-slide li::marker { color: var(--deck-primary); }\n.deck-slide .deck-tasks { list-style: none; padding-inline-start: 0; }\n.deck-slide .deck-tasks input { font-size: inherit; inline-size: 0.8em; block-size: 0.8em; margin: 0; margin-inline-end: 0.5em; vertical-align: -0.05em; accent-color: var(--deck-primary); }\n.deck-slide strong { color: var(--deck-primary); }\n.deck-slide a { color: var(--deck-primary); }\n.deck-slide code { font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 0.85em; background: var(--deck-soft); padding: 0.05em 0.3em; border-radius: 0.2em; }\n.deck-slide pre { background: color-mix(in srgb, var(--deck-ink) 6%, var(--deck-paper)); padding: 0.8em 1em; border-radius: calc(var(--deck-radius) * 0.6); overflow: hidden; font-size: 0.75em; line-height: 1.45; text-align: start; }\n.deck-slide pre code { background: none; padding: 0; font-size: 1em; }\n.deck-slide pre.has-marks .deck-line:not(.is-marked) { opacity: 0.45; }\n.deck-slide blockquote { border-inline-start: 0.25em solid var(--deck-fill); padding-inline-start: 0.9em; margin-inline: 0; font-style: italic; }\n.deck-slide img { max-inline-size: 100%; max-block-size: 100%; object-fit: contain; }\n.deck-slide .deck-picture { flex: 1; min-block-size: 0; display: grid; place-items: center; }\n.deck-slide .deck-picture img { block-size: 100%; }\n.deck-table { overflow: hidden; }\n.deck-slide table { border-collapse: collapse; inline-size: 100%; font-size: 0.85em; }\n.deck-slide :is(th, td) { padding: 0.35em 0.7em; border-block-end: 1px solid var(--deck-line); text-align: start; }\n.deck-slide th { border-block-end: 2px solid var(--deck-primary); font-weight: 700; }\n.deck-slide [data-align=\"right\"] { text-align: end; font-variant-numeric: tabular-nums; }\n.deck-slide [data-align=\"center\"] { text-align: center; }\n.deck-block { position: relative; flex: 1 1 auto; min-block-size: 12cqi; overflow: hidden; }\n.deck-block .deck-chart, .deck-block .deck-diagram { position: absolute; inset: 0; display: grid; place-items: center; }\n.deck-block .deck-diagram img { max-inline-size: 100%; max-block-size: 100%; }\n.deck-block .deck-block-source { display: none; }\n.deck-block.is-failed .deck-block-source { display: block; }\n.deck-number { position: absolute; inset-block-end: 2.6cqi; inset-inline-end: 3cqi; font-size: 1.5cqi; color: var(--deck-muted); font-variant-numeric: tabular-nums; }\n\n/* Layouts from their kit's definition: the paper they are on, where their words sit, how big their heading is. */\n.deck-slide[data-paper=\"fill\"] { background: var(--deck-fill); color: var(--deck-on-fill); }\n.deck-slide[data-paper=\"ink\"] { background: var(--deck-ink); color: var(--deck-paper); }\n.deck-slide[data-paper=\"soft\"] { background: var(--deck-soft); }\n.deck-slide:is([data-paper=\"fill\"], [data-paper=\"ink\"]) :is(strong, a, h3, .deck-h3) { color: inherit; }\n.deck-slide[data-justify=\"center\"] .deck-slot { justify-content: center; }\n.deck-slide[data-justify=\"end\"] .deck-slot { justify-content: flex-end; }\n.deck-slide[data-align=\"center\"] .deck-slot { align-items: center; text-align: center; }\n.deck-slide[data-align=\"end\"] .deck-slot { align-items: flex-end; text-align: end; }\n.deck-slide[data-title=\"large\"] :is(h1, h2, .deck-h1, .deck-h2) { font-size: 2.4em; }\n.deck-slide[data-title=\"huge\"] :is(h1, .deck-h1) { font-size: 2.9em; }\n.deck-slide[data-title=\"huge\"] :is(h2, .deck-h2) { font-size: 2.4em; }\n/* What the usual layouts add to their definition: Slidev's looks for them. */\n.deck-layout-section .deck-slot::before { content: \"\"; display: block; inline-size: 3em; block-size: 0.3em; background: var(--deck-fill); margin-block-end: 0.8em; border-radius: 0.15em; }\n.deck-layout-statement :is(h1, h2, p, .deck-h1, .deck-h2) { font-size: 2.4em; font-family: var(--deck-heading); font-weight: 700; line-height: 1.2; }\n.deck-slide.deck-layout-fact :is(h1, .deck-h1) { font-size: 5em; color: var(--deck-primary); margin-block-end: 0.15em; }\n.deck-layout-quote blockquote { font-size: 1.7em; border: 0; padding: 0; font-family: var(--deck-heading); }\n/* Scripts without italics keep their upright letters. */\n.deck :is(blockquote, em):is(:lang(ar), :lang(fa), :lang(ur), :lang(he), :lang(ja), :lang(zh), :lang(ko), :lang(hi), :lang(th)) { font-style: normal; }\n.deck-layout-quote blockquote::before { content: \"\\201C\"; display: block; font-size: 2.4em; line-height: 0.6; color: var(--deck-primary); }\n.deck-layout-full .deck-canvas { padding: 0; }\n.deck-slide.has-image .deck-image { background: var(--deck-image) center / cover no-repeat, var(--deck-soft); }\n.deck-layout-image-left.has-image .deck-canvas, .deck-layout-image-right.has-image .deck-canvas { padding: 0; grid-template: \"image s-default\" 1fr / 1fr 1fr !important; gap: 0; }\n.deck-layout-image-right.has-image .deck-canvas { grid-template-areas: \"s-default image\" !important; }\n:is(.deck-layout-image-left, .deck-layout-image-right).has-image .deck-image { grid-area: image; }\n:is(.deck-layout-image-left, .deck-layout-image-right).has-image .deck-slot { padding: 6cqi 5cqi; justify-content: center; }\n:is(.deck-layout-image, .deck-layout-cover).has-image .deck-image { position: absolute; inset: 0; }\n:is(.deck-layout-image, .deck-layout-cover).has-image .deck-slot { position: relative; color: #fff; text-shadow: 0 0.05em 0.4em rgb(0 0 0 / 0.6); }\n.deck-layout-cover.has-image .deck-image::after { content: \"\"; position: absolute; inset: 0; background: linear-gradient(to top, rgb(0 0 0 / 0.65), rgb(0 0 0 / 0.1)); }\n.deck-class-invert { background: var(--deck-ink); color: var(--deck-paper); }\n.deck-class-text-center .deck-slot { text-align: center; align-items: center; }\n\n/* Steps: what a click shows next, there but unseen until then. */\n.deck-step { transition: opacity 0.3s, translate 0.3s; }\n.deck-step:not(.is-on) { opacity: 0; visibility: hidden; translate: 0 0.3em; }\n.deck.is-editing .deck-step:not(.is-on), .deck.is-overview .deck-step:not(.is-on), .deck-print .deck-step { opacity: 1; visibility: visible; translate: none; }\n\n/* Its bar. */\n.deck-bar { display: flex; align-items: center; gap: 0.25rem; font: 0.85rem/1 system-ui, sans-serif; color: var(--deck-muted); }\n.deck-bar button { display: inline-grid; place-items: center; min-inline-size: 2.25rem; min-block-size: 2.25rem; padding: 0 0.5rem; border: 0; border-radius: 0.5rem; background: none; color: var(--deck-ink); font: inherit; cursor: pointer; }\n.deck-bar button:hover { background: color-mix(in srgb, var(--deck-ink) 8%, transparent); }\n.deck-bar button:focus-visible { outline: 2px solid var(--deck-primary); outline-offset: 1px; }\n.deck-bar button:disabled { opacity: 0.35; cursor: default; }\n.deck-bar button[aria-pressed=\"true\"] { background: color-mix(in srgb, var(--deck-primary) 18%, transparent); }\n.deck-bar svg { inline-size: 1.15rem; block-size: 1.15rem; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }\n.deck-bar [dir=\"rtl\"] .deck-flip, .deck[dir=\"rtl\"] .deck-flip { scale: -1 1; }\n.deck-where { font-variant-numeric: tabular-nums; min-inline-size: 4.5em; text-align: center; }\n.deck-bar .deck-gap { flex: 1; }\n\n/* Presented: the stage fills the screen, black around it. */\n.deck-stage:fullscreen { display: grid; place-items: center; background: #000; }\n.deck-stage:fullscreen .deck-slide { inline-size: min(100vw, 100vh * 16 / 9); border-radius: 0; box-shadow: none; }\n.deck-stage:fullscreen .deck-slide:not(.is-shown) { inset-block-start: 50%; translate: 0 -50%; }\n\n/* The presenter's view: this slide, the next, the notes and the time. */\n.deck-presenter { display: none; }\n.deck.is-presenting { grid-template: \"stage next\" auto \"stage notes\" 1fr \"bar bar\" auto / 3fr 2fr; min-block-size: 70vh; }\n.deck.is-presenting .deck-stage { grid-area: stage; align-self: start; }\n.deck.is-presenting .deck-presenter { display: contents; }\n.deck.is-presenting .deck-bar { grid-area: bar; }\n.deck-next { grid-area: next; display: grid; gap: 0.3rem; font: 0.8rem system-ui, sans-serif; color: var(--deck-muted); }\n.deck-next .deck-slide { position: relative; visibility: visible; }\n.deck-notes { grid-area: notes; overflow: auto; padding: 0.8rem 1rem; border-radius: 0.6rem; background: color-mix(in srgb, var(--deck-ink) 5%, transparent); font: 1.1rem/1.5 system-ui, sans-serif; white-space: pre-wrap; }\n.deck-clock { font-variant-numeric: tabular-nums; font-size: 1.2rem; color: var(--deck-ink); }\n\n/* All the slides at once. */\n.deck.is-overview .deck-stage { display: grid; grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr)); gap: 0.8rem; view-transition-name: none; }\n.deck.is-overview .deck-slide { position: relative; visibility: visible; cursor: pointer; }\n.deck.is-overview .deck-slide.is-shown { box-shadow: 0 0 0 3px var(--deck-primary); }\n\n/* Changed by hand: the Markdown beside the slides, and words changed on a slide in place. */\n.deck.is-editing { grid-template: \"source stage\" auto \"source bar\" 1fr / minmax(18rem, 2fr) 3fr; align-items: start; }\n.deck.is-editing .deck-stage { grid-area: stage; }\n.deck.is-editing .deck-bar { grid-area: bar; }\n.deck-source { display: none; }\n.deck.is-editing .deck-source { display: block; grid-area: source; inline-size: 100%; block-size: min(80vh, 48rem); resize: vertical; padding: 0.8rem; border: 1px solid var(--deck-line); border-radius: 0.6rem; background: var(--deck-paper); color: var(--deck-ink); font: 0.85rem/1.55 ui-monospace, Menlo, Consolas, monospace; tab-size: 2; }\n.deck.is-editing [data-edit] { cursor: text; border-radius: 0.15em; }\n.deck.is-editing [data-edit]:hover { box-shadow: 0 0 0 0.12em color-mix(in srgb, var(--deck-primary) 45%, transparent); }\n.deck [data-edit][contenteditable] { outline: 0.12em solid var(--deck-primary); outline-offset: 0.1em; }\n.deck-slide[data-overflow] { box-shadow: 0 0 0 3px #c92a2a; }\n@media (max-width: 52rem) { .deck.is-editing, .deck.is-presenting { grid-template: none; display: grid; } .deck.is-editing .deck-source { block-size: 40vh; } .deck.is-presenting .deck-presenter { display: grid; } }\n\n/* Transitions between slides, as Slidev names them; none for those who'd rather not. */\n::view-transition-group(deck-stage) { animation-duration: 0.45s; animation-timing-function: cubic-bezier(0.2, 0.8, 0.2, 1); }\nhtml[data-deck-transition~=\"fade\"]::view-transition-old(deck-stage) { animation: 0.35s ease both deck-out-fade; }\nhtml[data-deck-transition~=\"fade\"]::view-transition-new(deck-stage) { animation: 0.35s ease both deck-in-fade; }\nhtml[data-deck-transition~=\"slide-left\"]::view-transition-old(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-out-start; }\nhtml[data-deck-transition~=\"slide-left\"]::view-transition-new(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-in-end; }\nhtml[data-deck-transition~=\"slide-right\"]::view-transition-old(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-out-end; }\nhtml[data-deck-transition~=\"slide-right\"]::view-transition-new(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-in-start; }\nhtml[data-deck-transition~=\"slide-up\"]::view-transition-old(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-out-up; }\nhtml[data-deck-transition~=\"slide-up\"]::view-transition-new(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-in-up; }\nhtml[data-deck-transition~=\"morph\"]::view-transition-old(deck-stage) { animation: 0.3s ease both deck-out-fade; }\nhtml[data-deck-transition~=\"morph\"]::view-transition-new(deck-stage) { animation: 0.3s ease both deck-in-fade; }\nhtml[data-deck-transition~=\"morph\"]::view-transition-group(*) { animation-duration: 0.6s; }\n@keyframes deck-out-fade { to { opacity: 0; } }\n@keyframes deck-in-fade { from { opacity: 0; } }\n@keyframes deck-out-start { to { translate: -30% 0; opacity: 0; } }\n@keyframes deck-in-end { from { translate: 30% 0; opacity: 0; } }\n@keyframes deck-out-end { to { translate: 30% 0; opacity: 0; } }\n@keyframes deck-in-start { from { translate: -30% 0; opacity: 0; } }\n@keyframes deck-out-up { to { translate: 0 -20%; opacity: 0; } }\n@keyframes deck-in-up { from { translate: 0 20%; opacity: 0; } }\n@media (prefers-reduced-motion: reduce) { ::view-transition-group(*), ::view-transition-old(*), ::view-transition-new(*) { animation: none !important; } .deck-step { transition: none; } }\n@media (forced-colors: active) { .deck-slide { border: 1px solid CanvasText; } .deck-step:not(.is-on) { visibility: hidden; } }\n\n/* On paper: every slide, one a page, every step shown, no bar. */\n@media print {\n @page { size: 13.333in 7.5in; margin: 0; }\n .deck-bar, .deck-source, .deck-presenter { display: none !important; }\n .deck, .deck.is-editing, .deck.is-presenting { display: block; }\n .deck-slide, .deck-slide:not(.is-shown) { position: relative; visibility: visible; break-after: page; border-radius: 0; box-shadow: none; inline-size: 100vw; }\n .deck-step:not(.is-on) { opacity: 1; visibility: visible; translate: none; }\n}\n", "// A .deck.html opened on its own, in any browser: the Markdown its page holds read and drawn as\n// slides; saved back as the same kind of file, the renderer as it came (linked or held whole);\n// saved as PowerPoint with PptxGenJS loaded only then. Libraries come from `data-base` on the\n// renderer's script, else jsDelivr's npm mirror.\nimport { createDeck } from './deck.js'\nimport { defaultBlocks, libraryAt } from './blocks.js'\nimport { readDeckFile, writeDeckFile, unescape } from './file.js'\nimport { toPptx } from './pptx.js'\nimport css from './deck.css'\n\nconst me = /** @type {HTMLScriptElement | null} */ (document.currentScript)\nconst base = me?.dataset.base ?? 'https://cdn.jsdelivr.net/npm/'\n\nconst PAGE = `html, body { margin: 0; } body { min-block-size: 100vh; }\nbody > .deck { min-block-size: 100vh; padding: clamp(0.5rem, 3vw, 2rem); align-content: center; justify-items: center; background: color-mix(in srgb, var(--deck-ink) 7%, var(--deck-paper)); }\nbody > .deck > .deck-stage, body > .deck > .deck-bar { inline-size: min(100%, (100vh - 7rem) * 16 / 9); }\nbody > .deck.is-editing { justify-items: stretch; align-content: start; }\nbody > .deck.is-editing > .deck-stage, body > .deck.is-editing > .deck-bar, body > .deck.is-presenting > .deck-stage, body > .deck.is-presenting > .deck-bar, body > .deck.is-overview > .deck-stage { inline-size: auto; }\nbody > .deck:is(.is-presenting, .is-overview) { justify-items: stretch; align-content: start; }`\n\nfunction boot() {\n const holder = document.getElementById('deck')\n if (!holder) return\n const source = unescape(holder.textContent ?? '').replace(/^\\n/, '').replace(/\\n$/, '')\n const sheet = new CSSStyleSheet()\n sheet.replaceSync(`${css}\\n${PAGE}`)\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet]\n holder.style.display = 'none'\n const root = document.createElement('main')\n document.body.append(root)\n const blocks = defaultBlocks({ base, root })\n /** @type {any} */\n let handle = null\n const view = createDeck(root, {\n source, blocks, lang: document.documentElement.lang || undefined,\n async onSave(text) {\n const settings = view.deck.settings\n const file = writeDeckFile(text, {\n title: String(settings.title ?? view.deck.slides[0]?.title ?? document.title), lang: view.lang, dir: view.dir,\n renderer: me?.src ? { src: me.src } : { code: me?.textContent ?? '' }, generator: document.querySelector('meta[name=generator]')?.getAttribute('content') ?? 'deck',\n })\n const name = decodeURIComponent(location.pathname.split('/').pop() || 'slides.deck.html')\n const picker = /** @type {any} */ (window).showSaveFilePicker\n if (picker) {\n try {\n handle ??= await picker({ suggestedName: name, types: [{ description: 'Deck', accept: { 'text/html': ['.deck.html', '.html'] } }] })\n const writable = await handle.createWritable()\n await writable.write(file)\n await writable.close()\n return\n } catch (error) { if (/** @type {Error} */ (error).name === 'AbortError') return }\n }\n download(new Blob([file], { type: 'text/html' }), name)\n },\n async onExport(deck) {\n const { PptxGenJS, JSZip } = await libraries()\n const { blob } = await toPptx(deck, { PptxGenJS, JSZip })\n download(blob, `${String(deck.deck.settings.title ?? deck.deck.slides[0]?.title ?? 'slides').replace(/[\\\\/:*?\"<>|]+/g, ' ').trim() || 'slides'}.pptx`)\n },\n })\n const title = view.deck.settings.title ?? view.deck.slides[0]?.title\n if (title) document.title = String(title)\n const stage = /** @type {HTMLElement | null} */ (root.querySelector('.deck-stage'))\n stage?.focus({ preventScroll: true })\n Object.assign(window, { deckView: view, deckTools: { toPptx, libraries, readDeckFile, writeDeckFile } })\n}\n\nasync function libraries() {\n if (!(/** @type {any} */ (window).PptxGenJS)) await new Promise((resolve, reject) => {\n const tag = document.createElement('script')\n tag.src = libraryAt(base, 'pptxgenjs', '4.0.1', 'dist/pptxgen.bundle.js')\n tag.onload = resolve\n tag.onerror = reject\n document.head.append(tag)\n })\n return { PptxGenJS: /** @type {any} */ (window).PptxGenJS, JSZip: /** @type {any} */ (window).JSZip }\n}\n\n/** @param {Blob} blob @param {string} name */\nfunction download(blob, name) {\n const a = Object.assign(document.createElement('a'), { href: URL.createObjectURL(blob), download: name })\n document.body.append(a)\n a.click()\n a.remove()\n setTimeout(() => URL.revokeObjectURL(a.href), 10_000)\n}\n\nif (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot)\nelse boot()\n"],
5
- "mappings": "mBAKO,SAASA,GAAUC,EAAM,CAC9B,IAAMC,EAAQD,EAAK,QAAQ,SAAU;AAAA,CAAI,EAAE,MAAM;AAAA,CAAI,EAAE,IAAKE,IAAS,CAAE,OAAQA,EAAI,OAASA,EAAI,UAAU,EAAE,OAAQ,KAAMC,GAAUD,CAAG,EAAE,QAAQ,EAAG,IAAAA,CAAI,EAAE,EAEpJE,EAAQC,GAAMJ,EADT,CAAE,EAAG,CAAE,EACa,CAAC,EAChC,OAAOG,GAAS,OAAOA,GAAU,UAAY,CAAC,MAAM,QAAQA,CAAK,EAAIA,EAAQ,CAAC,CAChF,CAGA,SAASD,GAAUG,EAAM,CACvB,IAAIC,EAAQ,GACZ,QAASC,EAAI,EAAGA,EAAIF,EAAK,OAAQE,IAAK,CACpC,IAAMC,EAAIH,EAAKE,CAAC,EAChB,GAAID,EAAaE,IAAMF,IAAOA,EAAQ,YAC7BE,IAAM,KAAOA,IAAM,IAAKF,EAAQE,UAChCA,IAAM,MAAQD,IAAM,GAAK,KAAK,KAAKF,EAAKE,EAAI,CAAC,CAAC,GAAI,OAAOF,EAAK,MAAM,EAAGE,CAAC,CACnF,CACA,OAAOF,CACT,CAGA,SAASD,GAAMJ,EAAOS,EAAIC,EAAK,CAC7B,KAAOD,EAAG,EAAIT,EAAM,QAAU,CAACA,EAAMS,EAAG,CAAC,EAAE,KAAK,KAAK,GAAGA,EAAG,IAC3D,GAAIA,EAAG,GAAKT,EAAM,QAAUA,EAAMS,EAAG,CAAC,EAAE,OAASC,EAAK,OAAO,KAC7D,IAAMC,EAASX,EAAMS,EAAG,CAAC,EAAE,OAC3B,GAAI,WAAW,KAAKT,EAAMS,EAAG,CAAC,EAAE,KAAK,KAAK,CAAC,EAAG,CAC5C,IAAMG,EAAO,CAAC,EACd,KAAOH,EAAG,EAAIT,EAAM,QAAQ,CAC1B,IAAMK,EAAOL,EAAMS,EAAG,CAAC,EACvB,GAAI,CAACJ,EAAK,KAAK,KAAK,EAAG,CAAEI,EAAG,IAAK,QAAS,CAC1C,GAAIJ,EAAK,SAAWM,GAAU,CAAC,WAAW,KAAKN,EAAK,KAAK,KAAK,CAAC,EAAG,MAClE,IAAMQ,EAAOR,EAAK,KAAK,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,EAE5C,GADAI,EAAG,IACC,CAACI,EAAMD,EAAK,KAAKR,GAAMJ,EAAOS,EAAIE,EAAS,CAAC,CAAC,UACxC,uBAAuB,KAAKE,CAAI,EAAG,CAE1C,IAAMC,EAAQT,EAAK,IAAI,QAAQQ,CAAI,EACnCb,EAAM,OAAOS,EAAG,EAAG,EAAG,CAAE,OAAQK,EAAO,KAAM,IAAI,OAAOA,CAAK,EAAID,EAAM,IAAK,IAAI,OAAOC,CAAK,EAAID,CAAK,CAAC,EACtGD,EAAK,KAAKR,GAAMJ,EAAOS,EAAIK,CAAK,CAAC,CACnC,MAAOF,EAAK,KAAKG,GAAOF,CAAI,CAAC,CAC/B,CACA,OAAOD,CACT,CAEA,IAAMI,EAAM,CAAC,EACb,KAAOP,EAAG,EAAIT,EAAM,QAAQ,CAC1B,IAAMK,EAAOL,EAAMS,EAAG,CAAC,EACvB,GAAI,CAACJ,EAAK,KAAK,KAAK,EAAG,CAAEI,EAAG,IAAK,QAAS,CAC1C,GAAIJ,EAAK,SAAWM,EAAQ,MAC5B,IAAMM,EAAQ,8DAA8D,KAAKZ,EAAK,KAAK,KAAK,CAAC,EAEjG,GADAI,EAAG,IACC,CAACQ,EAAO,SACZ,IAAMC,EAAM,OAAOH,GAAOE,EAAM,CAAC,CAAC,CAAC,EAC7BJ,GAAQI,EAAM,CAAC,GAAK,IAAI,KAAK,EAC/BJ,IAAS,KAAOA,IAAS,KAAO,aAAa,KAAKA,CAAI,EAAGG,EAAIE,CAAG,EAAIC,GAAYnB,EAAOS,EAAIE,EAAQE,EAAK,CAAC,IAAM,GAAG,EAC7GA,EAAMG,EAAIE,CAAG,EAAIH,GAAOF,CAAI,EAChCG,EAAIE,CAAG,EAAId,GAAMJ,EAAOS,EAAIE,EAAS,CAAC,CAC7C,CACA,OAAOK,CACT,CAGA,SAASG,GAAYnB,EAAOS,EAAIE,EAAQS,EAAQ,CAC9C,IAAMC,EAAQ,CAAC,EACf,KAAOZ,EAAG,EAAIT,EAAM,SAAW,CAACA,EAAMS,EAAG,CAAC,EAAE,IAAI,KAAK,GAAKT,EAAMS,EAAG,CAAC,EAAE,OAASE,IAASU,EAAM,KAAKrB,EAAMS,EAAG,GAAG,EAAE,GAAG,EACpH,KAAOY,EAAM,QAAU,CAACA,EAAM,GAAG,EAAE,GAAG,KAAK,GAAGA,EAAM,IAAI,EACxD,IAAMP,EAAQ,KAAK,IAAI,GAAGO,EAAM,OAAQhB,GAASA,EAAK,KAAK,CAAC,EAAE,IAAKA,GAASA,EAAK,OAASA,EAAK,UAAU,EAAE,MAAM,CAAC,EAC5GN,EAAOsB,EAAM,IAAKhB,GAASA,EAAK,MAAMS,CAAK,CAAC,EAAE,KAAK;AAAA,CAAI,EAC7D,OAAOM,EAASrB,EAAK,QAAQ,sBAAuB,KAAK,EAAIA,CAC/D,CAGA,SAASgB,GAAOhB,EAAM,CACpB,IAAMuB,EAAIvB,EAAK,KAAK,EACpB,GAAIuB,EAAE,WAAW,GAAG,GAAKA,EAAE,WAAW,GAAG,EAAG,CAC1C,IAAMC,EAAOC,GAAKF,EAAG,CAAE,EAAG,CAAE,CAAC,EAC7B,GAAIC,IAAS,OAAW,OAAOA,CACjC,CACA,GAAI,sBAAsB,KAAKD,CAAC,EAC9B,GAAI,CAAE,OAAO,KAAK,MAAMA,CAAC,CAAE,MAAQ,CAAE,OAAOA,EAAE,MAAM,EAAG,EAAE,CAAE,CAE7D,MAAI,mBAAmB,KAAKA,CAAC,EAAUA,EAAE,MAAM,EAAG,EAAE,EAAE,QAAQ,MAAO,GAAG,EACpE,mBAAmB,KAAKA,CAAC,EAAU,GACnC,oBAAoB,KAAKA,CAAC,EAAU,GACpC,cAAc,KAAKA,CAAC,GAAKA,IAAM,GAAW,KAC1C,wCAAwC,KAAKA,CAAC,EAAU,OAAOA,CAAC,EAC7DA,CACT,CAGA,SAASE,GAAKzB,EAAMU,EAAI,CACtB,IAAMgB,EAAQ,IAAM,CAAE,KAAO,KAAK,KAAK1B,EAAKU,EAAG,CAAC,GAAK,EAAE,GAAGA,EAAG,GAAI,EAC3DiB,EAAO,IAAM,CAEjB,GADAD,EAAM,EACF1B,EAAKU,EAAG,CAAC,IAAM,KAAOV,EAAKU,EAAG,CAAC,IAAM,IAAK,OAAOe,GAAKzB,EAAMU,CAAE,EAClE,IAAMkB,EAAQlB,EAAG,EACjB,GAAIV,EAAKU,EAAG,CAAC,IAAM,KAAOV,EAAKU,EAAG,CAAC,IAAM,IAAK,CAC5C,IAAMmB,EAAI7B,EAAKU,EAAG,GAAG,EACrB,KAAOA,EAAG,EAAIV,EAAK,QAAU,EAAEA,EAAKU,EAAG,CAAC,IAAMmB,GAAK7B,EAAKU,EAAG,EAAI,CAAC,IAAM,OAAOA,EAAG,IAChFA,EAAG,GACL,KAAO,MAAOA,EAAG,EAAIV,EAAK,QAAU,CAAC,SAAS,KAAKA,EAAKU,EAAG,CAAC,CAAC,GAAK,EAAEV,EAAKU,EAAG,CAAC,IAAM,KAAO,cAAc,KAAKV,EAAKU,EAAG,EAAI,CAAC,GAAK,EAAE,IAAIA,EAAG,IACxI,OAAOM,GAAOhB,EAAK,MAAM4B,EAAOlB,EAAG,CAAC,CAAC,CACvC,EACMoB,EAAO9B,EAAKU,EAAG,GAAG,EAExB,GADAgB,EAAM,EACFI,IAAS,IAAK,CAChB,IAAMjB,EAAO,CAAC,EACd,KAAOH,EAAG,EAAIV,EAAK,QAAUA,EAAKU,EAAG,CAAC,IAAM,KAAK,CAG/C,GAFAG,EAAK,KAAKc,EAAK,CAAC,EAChBD,EAAM,EACF1B,EAAKU,EAAG,CAAC,IAAM,IAAKA,EAAG,YAClBV,EAAKU,EAAG,CAAC,IAAM,IAAK,OAC7BgB,EAAM,CACR,CACA,OAAAhB,EAAG,IACIG,CACT,CAEA,IAAMI,EAAM,CAAC,EACb,KAAOP,EAAG,EAAIV,EAAK,QAAUA,EAAKU,EAAG,CAAC,IAAM,KAAK,CAC/C,IAAMS,EAAMQ,EAAK,EAEjB,GADAD,EAAM,EACF1B,EAAKU,EAAG,CAAC,IAAM,IAAK,OAIxB,GAHAA,EAAG,IACHO,EAAI,OAAOE,CAAG,CAAC,EAAIQ,EAAK,EACxBD,EAAM,EACF1B,EAAKU,EAAG,CAAC,IAAM,IAAKA,EAAG,YAClBV,EAAKU,EAAG,CAAC,IAAM,IAAK,OAC7BgB,EAAM,CACR,CACA,OAAAhB,EAAG,IACIO,CACT,CCxHA,IAAMc,GAAO,oBAGN,SAASC,GAAUC,EAAQ,CAEhC,IAAMC,EADOD,EAAO,QAAQ,SAAU;AAAA,CAAI,EACvB,MAAM;AAAA,CAAI,EACvBE,EAAU,CAAC,CAAC,EAClB,QAAWC,KAAQF,EAAOC,EAAQ,KAA4BA,EAAQ,GAAG,EAAE,EAAKC,EAAK,OAAS,CAAC,EAE/F,IAAMC,EAAS,CAAC,EACZC,EAAQ,EAAGC,EAAiD,KAAOC,EAAU,GACjF,QAASC,EAAI,EAAGA,EAAIP,EAAM,OAAQO,IAAK,CACrC,IAAML,EAAOF,EAAMO,CAAC,EAAE,QAAQ,EAC9B,GAAID,EAAS,CAAEA,EAAUE,GAAcN,EAAM,EAAI,EAAG,QAAS,CAC7D,GAAIA,EAAK,WAAW,KAAK,GAAK,CAAC,WAAW,KAAKA,CAAI,GAMjD,IALIK,EAAIH,GAASC,IAAQF,EAAO,KAAK,CAAE,MAAAC,EAAO,IAAKG,EAAG,OAAAF,CAAO,CAAC,EAC9DA,EAAS,KACTD,EAAQG,EAAI,EAGRL,EAAK,CAAC,IAAM,KAAOF,EAAMO,EAAI,CAAC,GAAG,KAAK,GAAK,uBAAuB,KAAKP,EAAMO,EAAI,CAAC,CAAC,GAAK,CAAC,YAAY,KAAKP,EAAMO,EAAI,CAAC,CAAC,EAAG,CAC3H,IAAIE,EAAIF,EAAI,EACZ,KAAOE,EAAIT,EAAM,QAAUA,EAAMS,CAAC,EAAE,QAAQ,IAAM,OAAOA,IACzDJ,EAAS,CAACE,EAAI,EAAGE,CAAC,EAClBF,EAAIE,EACJL,EAAQK,EAAI,CACd,UACS,oBAAoB,KAAKP,CAAI,EAAG,CACzC,IAAMQ,EAAwC,oBAAoB,KAAKR,CAAI,EAAG,CAAC,EAC3EO,EAAIF,EAAI,EACZ,KAAOE,EAAIT,EAAM,QAAU,CAACA,EAAMS,CAAC,EAAE,UAAU,EAAE,WAAWC,CAAK,GAAGD,IAChEA,EAAIT,EAAM,SAAQO,EAAIE,EAC5B,MAAOH,EAAUE,GAAcN,EAAM,EAAK,CAC5C,EACIE,EAAQJ,EAAM,QAAUK,IAAQF,EAAO,KAAK,CAAE,MAAAC,EAAO,IAAKJ,EAAM,OAAQ,OAAAK,CAAO,CAAC,EAGpF,IAAMM,EAAuFR,EAAO,GAAG,EAAE,EACzG,GAAIA,EAAO,SAAW,GAAKQ,EAAM,CAC/B,IAAID,EAAQ,GACNE,EAAQ,CAAC,EACf,QAASL,EAAII,EAAK,MAAOJ,EAAII,EAAK,IAAKJ,IAAK,CAC1C,IAAMM,EAAO,oBAAoB,KAAKb,EAAMO,CAAC,CAAC,IAAI,CAAC,EAC/CG,EAAaG,GAAQb,EAAMO,CAAC,EAAE,UAAU,EAAE,WAAWG,CAAK,IAAGA,EAAQ,IAChEG,EAAMH,EAAQG,EACd,eAAe,KAAKb,EAAMO,CAAC,CAAC,GAAGK,EAAM,KAAKL,CAAC,CACtD,CACA,GAAIK,EAAM,QAAU,EAAG,CACrBT,EAAO,IAAI,EACX,IAAMW,EAAOF,EAAM,CAAC,EAAID,EAAK,OAAS,CAACX,EAAM,MAAMW,EAAK,MAAOC,EAAM,CAAC,CAAC,EAAE,KAAMV,GAASA,EAAK,KAAK,CAAC,EAAIU,EAAQ,CAACD,EAAK,MAAO,GAAGC,EAAM,MAAMA,EAAM,CAAC,IAAMD,EAAK,MAAQ,EAAI,CAAC,CAAC,EAC3KG,EAAK,QAAQ,CAACC,EAAIC,IAAMb,EAAO,KAAK,CAAE,MAAOa,IAAM,EAAIL,EAAK,MAAQI,EAAI,IAAKD,EAAKE,EAAI,CAAC,GAAKL,EAAK,IAAK,OAAQK,IAAM,EAAIL,EAAK,OAAS,IAAK,CAAC,CAAC,CAC/I,CACF,CACA,IAAMM,EAASd,EAAO,IAAI,CAAC,CAAE,MAAAC,EAAO,IAAAc,EAAK,OAAAb,CAAO,EAAGc,IAAUC,GAAMpB,EAAOC,EAASG,EAAOc,EAAKb,EAAQc,CAAK,CAAC,EAC1G,OAAO,CAACE,EAAKd,IAAMA,IAAM,GAAKc,EAAI,MAAM,KAAMC,GAASA,EAAK,KAAK,KAAK,CAAC,GAAK,OAAO,KAAKD,EAAI,QAAQ,EAAE,MAAM,EAC/G,OAAAJ,EAAO,QAAQ,CAACI,EAAKd,IAAM,CAAEc,EAAI,MAAQd,CAAE,CAAC,EACrC,CAAE,SAAUU,EAAO,CAAC,GAAG,UAAY,CAAC,EAAG,OAAAA,CAAO,CACvD,CAOA,SAASM,GAAUvB,EAAO,CAExB,IAAMwB,EAAS,IAAI,IACbC,EAAOzB,EAAM,UAAWE,GAAS,oCAAoC,KAAKA,CAAI,CAAC,EACrF,GAAIuB,EAAO,EAAG,OAAOD,EACrB,IAAMd,EAAwC,MAAM,KAAKV,EAAMyB,CAAI,CAAC,EAAG,CAAC,EAClEC,EAAQ1B,EAAM,UAAU,CAACE,EAAMK,IAAMA,EAAIkB,GAAQvB,EAAK,KAAK,IAAMQ,CAAK,EACtEiB,EAAO3B,EAAM,IAAI,CAACE,EAAMK,IAAM,CAACL,EAAMK,CAAC,CAAC,EAAE,OAAO,CAAC,CAACL,EAAMK,CAAC,IAAM,OAAOA,CAAC,EAAIkB,IAASC,EAAQ,GAAK,OAAOnB,CAAC,EAAImB,IAAU,sCAAsC,KAAK,OAAOxB,CAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAEK,CAAC,IAAM,OAAOA,CAAC,CAAC,EAC/M,GAAIoB,EAAK,OAAS,EAAG,OAAOH,EAC5B,IAAMI,EAAQD,EAAK,SAAW,EAAI,CAAC,OAAQ,OAAO,EAAI,CAAC,OAAQ,SAAU,QAAS,GAAGA,EAAK,MAAM,CAAC,EAAE,IAAI,CAACE,EAAGb,IAAM,OAAOA,EAAI,CAAC,EAAE,CAAC,EAChI,OAAAW,EAAK,QAAQ,CAACZ,EAAIC,IAAMQ,EAAO,IAAIT,EAAIa,EAAMZ,CAAC,CAAC,CAAC,EAC5CU,EAAQ,GAAK1B,EAAM,MAAM0B,EAAQ,CAAC,EAAE,KAAMxB,GAASA,EAAK,KAAK,CAAC,GAAGsB,EAAO,IAAIE,EAAO,QAAQ,EACxFF,CACT,CAGA,SAAShB,GAAcN,EAAMuB,EAAM,CACjC,IAAIV,EAAK,EACT,OACE,GAAIU,EAAM,CACR,IAAMP,EAAMhB,EAAK,QAAQ,MAAOa,CAAE,EAClC,GAAIG,EAAM,EAAG,MAAO,GACpBO,EAAO,GACPV,EAAKG,EAAM,CACb,KAAO,CACL,IAAMY,EAAQ5B,EAAK,QAAQ,OAAQa,CAAE,EACrC,GAAIe,EAAQ,EAAG,MAAO,GACtB,IAAMZ,EAAMhB,EAAK,QAAQ,MAAO4B,EAAQ,CAAC,EACzC,GAAIZ,EAAM,EAAG,MAAO,GACpBH,EAAKG,EAAM,CACb,CAEJ,CAMA,SAASE,GAAMpB,EAAOC,EAAS8B,EAAMC,EAAI3B,EAAQc,EAAO,CACtD,IAAIc,EAAW5B,EAAS6B,GAAUlC,EAAM,MAAMK,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAAE,KAAK;AAAA,CAAI,CAAC,EAAI,CAAC,EAC/E8B,EAAMJ,EAEV,KAAOI,EAAMH,GAAM,CAAChC,EAAMmC,CAAG,EAAE,KAAK,GAAGA,IACvC,GAAI,CAAC9B,GAAU,gBAAgB,KAAKL,EAAMmC,CAAG,GAAK,EAAE,EAAG,CACrD,IAAI1B,EAAI0B,EAAM,EACd,KAAO1B,EAAIuB,GAAM,CAAChC,EAAMS,CAAC,EAAE,WAAW,KAAK,GAAGA,IAC9CwB,EAAWC,GAAUlC,EAAM,MAAMmC,EAAM,EAAG1B,CAAC,EAAE,KAAK;AAAA,CAAI,CAAC,EACvDsB,EAAOtB,EAAI,CACb,CACA,IAAI2B,EAAOpC,EAAM,MAAM+B,EAAMC,CAAE,EAAE,KAAK;AAAA,CAAI,EACtCK,EAAQ,GAENC,EAAQ,gCAAgC,KAAKF,CAAI,EACnDE,GAASA,EAAM,QAAU,QAAa,CAAC,QAAQ,KAAKF,EAAK,MAAME,EAAM,KAAK,CAAC,IAC7ED,EAAQ,CAACC,EAAM,CAAC,EAAGF,EAAK,MAAME,EAAM,MAAQA,EAAM,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK;AAAA,CAAI,EAAE,KAAK,EAC9EF,EAAOA,EAAK,MAAM,EAAGE,EAAM,KAAK,GAGlCF,EAAOA,EAAK,QAAQ,gEAAiE,CAACG,EAAKC,KACzFH,IAAUA,EAAQ;AAAA,EAAO,IAAMG,EAAK,QAAQ,WAAY,GAAG,EAAE,QAAQ,UAAW,GAAG,EAAE,KAAK,EACnFD,EAAI,QAAQ,SAAU,GAAG,EACjC,EAEDH,EAAOA,EAAK,QAAQ,0EAA2E,CAACG,EAAKV,EAAGW,KACtGH,IAAUA,EAAQ;AAAA,EAAO,IAAMG,EAAK,KAAK,EAClCD,EAAI,QAAQ,SAAU,GAAG,EACjC,EAED,IAAM5B,EADW,CAAC,GAAGyB,EAAK,SAAS,oBAAoB,CAAC,EAClC,GAAG,EAAE,EACvBzB,GAAQA,EAAK,QAAU,QAAa,CAACyB,EAAK,MAAMzB,EAAK,MAAQA,EAAK,CAAC,EAAE,MAAM,EAAE,KAAK,IACpF0B,EAAQ,CAAC1B,EAAK,CAAC,EAAE,KAAK,EAAG0B,CAAK,EAAE,OAAO,OAAO,EAAE,KAAK;AAAA,CAAI,EACzDD,EAAOA,EAAK,MAAM,EAAGzB,EAAK,KAAK,GAIjC,IAAM8B,EAAQ,CAAC,EACXC,EAAO,UAAWC,EAAQZ,EAAMrB,EAAQ,GAExCkC,EAAQ,CAAC,EACPC,EAAO,IAAMJ,EAAM,KAAK,CAAE,KAAAC,EAAM,KAAME,EAAM,KAAK;AAAA,CAAI,EAAG,MAAO3C,EAAQ0C,CAAK,CAAE,CAAC,EAC/EG,EAAUvB,GAAUa,EAAK,MAAM;AAAA,CAAI,CAAC,EAC1C,OAAW,CAAC7B,EAAGL,CAAI,IAAKkC,EAAK,MAAM;AAAA,CAAI,EAAE,QAAQ,EAAG,CAClD,IAAMvB,EAAO,oBAAoB,KAAKX,CAAI,IAAI,CAAC,EACzC6C,EAASlD,GAAK,KAAKK,CAAI,IAAM4C,EAAQ,IAAIvC,CAAC,EAAI,CAACL,EAA6B4C,EAAQ,IAAIvC,CAAC,CAAE,EAAI,MACrG,GAAIG,EAAaG,GAAQX,EAAK,UAAU,EAAE,WAAWQ,CAAK,IAAGA,EAAQ,YAC5DG,EAAMH,EAAQG,UACdkC,EAAQ,CACfF,EAAK,EACLH,EAAOK,EAAO,CAAC,EACfH,EAAQ,CAAC,EACTD,EAAQZ,EAAOxB,EAAI,EACnB,QACF,CACAqC,EAAM,KAAK1C,CAAI,CACjB,CACA2C,EAAK,EACL,IAAMG,EAAOP,EAAM,OAAO,CAACnB,EAAMf,IAAMA,EAAI,GAAKe,EAAK,KAAK,KAAK,GAAKmB,EAAM,SAAW,CAAC,EAChFQ,EAAU,mBAAmB,KAAKb,EAAK,QAAQ,qBAAsB,EAAE,CAAC,EAC9E,MAAO,CAAE,MAAAjB,EAAO,MAAOlB,EAAQI,EAASA,EAAO,CAAC,EAAI,EAAI0B,CAAI,EAAG,IAAK9B,EAAQ+B,CAAE,EAAI,EAAG,SAAAC,EAAU,MAAOe,EAAM,MAAAX,EAAO,MAAO,OAAOJ,EAAS,OAASgB,IAAU,CAAC,GAAK,EAAE,EAAE,KAAK,CAAE,CAChL,CCvKA,IAAMC,GAAO,yBACPC,GAAQ,6DACRC,GAAO,CAAC,cAAe,oBAAqB,iBAAkB,cAAe,aAAc,aAAc,QAAS,uBAAwB,sBAAsB,EAChKC,GAA8B,CAAE,MAAO,CAAC,QAAS,SAAU,KAAK,EAAG,QAAS,CAAC,QAAS,SAAU,KAAK,EAAG,MAAO,CAAC,QAAS,OAAQ,MAAO,MAAM,EAAG,MAAO,CAAC,SAAU,QAAS,MAAM,CAAE,EAG7KC,GAAiD,CAC5D,MAAO,QAAS,cAAe,QAAS,cAAe,WAAY,aAAc,WAAY,QAAS,WAAY,WAAY,kBAC9H,gBAAiB,aAAc,iBAAkB,UAAW,QAAS,UAAW,IAAK,OAAQ,OAAQ,OAAQ,aAAc,cAAe,QAAS,MAAO,OAAQ,KACpK,EAGaC,GAA+B,CAC1C,KAAM,WACN,OAAQ,CAAC,EACT,QAAS,OAAO,YAAY,OAAO,QAA4C,CAC7E,QAAS,CAAE,MAAO,CAAE,GAAI,oBAAqB,GAAI,kBAAmB,EAAG,KAAM,mBAAoB,EACjG,MAAO,CAAE,MAAO,CAAE,GAAI,QAAS,GAAI,YAAa,EAAG,QAAS,SAAU,MAAO,OAAQ,MAAO,OAAQ,KAAM,cAAe,SAAU,EAAM,EACzI,MAAO,CAAE,MAAO,CAAE,GAAI,eAAgB,GAAI,cAAe,EAAG,QAAS,SAAU,MAAO,OAAQ,MAAO,QAAS,KAAM,cAAe,SAAU,EAAM,EACnJ,QAAS,CAAE,MAAO,CAAE,GAAI,UAAW,GAAI,SAAU,EAAG,QAAS,SAAU,MAAO,MAAO,MAAO,OAAQ,KAAM,iBAAkB,SAAU,EAAM,EAC5I,OAAQ,CAAE,MAAO,CAAE,GAAI,UAAW,GAAI,QAAS,EAAG,QAAS,SAAU,MAAO,SAAU,KAAM,YAAa,EACzG,UAAW,CAAE,MAAO,CAAE,GAAI,YAAa,GAAI,aAAc,EAAG,QAAS,SAAU,MAAO,SAAU,MAAO,QAAS,KAAM,YAAa,EACnI,KAAM,CAAE,MAAO,CAAE,GAAI,aAAc,GAAI,eAAgB,EAAG,QAAS,SAAU,MAAO,SAAU,MAAO,OAAQ,KAAM,YAAa,EAChI,MAAO,CAAE,MAAO,CAAE,GAAI,QAAS,GAAI,UAAW,EAAG,QAAS,SAAU,KAAM,YAAa,EACvF,IAAK,CAAE,MAAO,CAAE,GAAI,UAAW,GAAI,SAAU,EAAG,QAAS,SAAU,MAAO,SAAU,MAAO,OAAQ,MAAO,QAAS,KAAM,cAAe,SAAU,EAAM,EACxJ,KAAM,CAAE,MAAO,CAAE,GAAI,OAAQ,GAAI,aAAc,EAAG,KAAM,QAAS,SAAU,EAAM,EACjF,KAAM,CAAE,MAAO,CAAE,GAAI,QAAS,GAAI,MAAO,EAAG,KAAM,QAAS,SAAU,EAAM,EAC3E,WAAY,CAAE,MAAO,CAAE,GAAI,cAAe,GAAI,eAAgB,EAAG,MAAO,CAAC,UAAW,OAAO,EAAG,MAAO,gBAAiB,QAAS,UAAW,KAAM,aAAc,EAC9J,kBAAmB,CAAE,MAAO,CAAE,GAAI,aAAc,GAAI,aAAc,EAAG,MAAO,CAAC,UAAW,OAAQ,QAAS,QAAQ,EAAG,MAAO,+CAAgD,QAAS,UAAW,KAAM,gBAAiB,KAAM,YAAa,EACzO,aAAc,CAAE,MAAO,CAAE,GAAI,gBAAiB,GAAI,gBAAiB,EAAG,MAAO,CAAC,UAAW,OAAQ,SAAU,OAAO,EAAG,MAAO,8CAA+C,QAAS,cAAe,KAAM,WAAY,KAAM,YAAa,EACxO,aAAc,CAAE,MAAO,CAAE,GAAI,eAAgB,GAAI,gBAAiB,EAAG,KAAM,uBAAwB,QAAS,QAAS,EACrH,cAAe,CAAE,MAAO,CAAE,GAAI,gBAAiB,GAAI,gBAAiB,EAAG,KAAM,uBAAwB,QAAS,QAAS,EACvH,MAAO,CAAE,MAAO,CAAE,GAAI,UAAW,GAAI,OAAQ,EAAG,KAAM,QAAS,SAAU,EAAM,CACjF,CAAE,EAAE,IAAI,CAAC,CAACC,EAAMC,CAAK,IAAM,CAACD,EAA6BE,GAASD,CAAK,EAAE,MAAO,CAAC,CAAC,CACpF,EAMO,SAASC,GAASD,EAAO,CAC9B,IAAME,EAAW,CAAC,EAClB,GAAI,CAACF,GAAS,OAAOA,GAAU,SAAU,MAAO,CAAE,OAAQ,KAAM,SAAU,CAAC,cAAc,CAAE,EAI3F,IAAMG,EAAU,CAAC,EACXC,EAAQ,MAAM,QAAQJ,EAAM,KAAK,GAAK,OAAOA,EAAM,OAAU,SAAW,CAACA,EAAM,KAAK,EAAE,KAAK,EAAE,IAAI,MAAM,EACzGA,EAAM,OAAS,OAAOA,EAAM,OAAU,SAAW,OAAO,QAAQA,EAAM,KAAK,EAAE,IAAI,CAAC,CAACD,EAAMM,CAAM,KAC3FA,GAAU,OAAOA,GAAW,WAAUF,EAAQJ,CAAI,EAAIO,GAAMD,CAAM,GAC/DN,IAAS,QAAU,UAAYA,EACvC,EAAI,CAAC,SAAS,EACXQ,EAAQ,CAAC,GAAG,IAAI,IAAIH,CAAK,CAAC,EAChC,GAAI,CAACG,EAAM,MAAOC,GAASf,GAAK,KAAKe,CAAI,CAAC,EAAG,MAAO,CAAE,OAAQ,KAAM,SAAU,CAAC,mCAAmC,CAAE,EAC/GD,EAAM,SAAS,SAAS,GAAGA,EAAM,QAAQ,SAAS,EAIvD,IAAME,GADQ,MAAM,QAAQT,EAAM,KAAK,EAAIA,EAAM,MAAM,IAAwBU,GAAQ,CAACA,CAAG,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAI,OAAOV,EAAM,OAASO,EAAM,KAAK,GAAG,CAAC,EAAE,MAAM,OAAO,GAClJ,IAAKG,GAAQA,EAAI,KAAK,EAAE,QAAQ,SAAU,EAAE,EAAE,MAAM,KAAK,CAAC,EAAE,OAAQA,GAAQA,EAAI,QAAUA,EAAI,CAAC,CAAC,EAC7GC,EAAQF,EAAK,CAAC,GAAG,QAAU,EACjC,GAAI,CAACA,EAAK,QAAUA,EAAK,KAAMC,GAAQA,EAAI,SAAWC,CAAK,GAAKF,EAAK,KAAK,EAAE,KAAMG,GAASA,IAAS,KAAO,CAACL,EAAM,SAASK,CAAI,CAAC,EAAG,MAAO,CAAE,OAAQ,KAAM,SAAU,CAAC,wCAAwC,CAAE,EAC/M,QAAWJ,KAAQD,EAAO,CACxB,IAAMM,EAAQJ,EAAK,QAAQ,CAACC,EAAKI,IAAMJ,EAAI,IAAI,CAACE,EAAMG,IAA+C,CAACH,EAAMG,EAAGD,CAAC,CAAE,CAAC,EAAE,OAAO,CAAC,CAACF,CAAI,IAAMA,IAASJ,CAAI,EACrJ,GAAI,CAACK,EAAM,OAAQ,CAAML,IAAS,WAAWN,EAAS,KAAK,QAAQM,CAAI,cAAc,EAAG,QAAS,CACjG,IAAMQ,EAAKH,EAAM,IAAKI,GAAMA,EAAE,CAAC,CAAC,EAAGC,EAAKL,EAAM,IAAKI,GAAMA,EAAE,CAAC,CAAC,EAC7D,GAAIJ,EAAM,UAAY,KAAK,IAAI,GAAGG,CAAE,EAAI,KAAK,IAAI,GAAGA,CAAE,EAAI,IAAM,KAAK,IAAI,GAAGE,CAAE,EAAI,KAAK,IAAI,GAAGA,CAAE,EAAI,GAAI,MAAO,CAAE,OAAQ,KAAM,SAAU,CAAC,QAAQV,CAAI,qBAAqB,CAAE,CAC/K,CACA,IAAMW,EAAS,CAAoBC,EAA6BC,IAAU,CACxE,IAAMC,EAAOF,IAAU,OAAY,MAAMC,CAAK,EAAE,KAAK,KAAK,GAAK,MAAM,QAAQD,CAAK,EAAIA,EAAQ,OAAOA,CAAK,EAAE,MAAM,KAAK,GAAG,IAAI,MAAM,EACpI,OAAOE,EAAK,SAAWD,GAASC,EAAK,MAAOC,GAAM7B,GAAM,KAAK6B,CAAC,CAAC,EAAID,EAAO,IAC5E,EACME,EAAUL,EAAOnB,EAAM,QAASW,CAAK,EAAGc,EAAYN,EAAOnB,EAAM,KAAMS,EAAK,MAAM,EACxF,GAAI,CAACe,GAAW,CAACC,EAAW,MAAO,CAAE,OAAQ,KAAM,SAAU,CAAC,oFAAoF,CAAE,EACpJ,IAAMC,EAAO,CAAmCC,EAA2BC,IAAa,CACtF,IAAMR,EAAQ,OAAOpB,EAAM2B,CAAG,GAAKC,CAAQ,EAC3C,OAAwChC,GAAM+B,CAAG,EAAI,SAASP,CAAK,EAC5DA,GADiElB,EAAS,KAAK,GAAGyB,CAAG,IAAIP,CAAK,kBAAkBxB,GAAM+B,CAAG,EAAE,KAAK,IAAI,CAAC,EAAE,EAAUC,EAE1J,EACMC,EAAQ,OAAO7B,EAAM,OAAU,UAAaA,EAAM,OAAS,OAAOA,EAAM,OAAU,SAAYA,EAAM,MAAQ,OAC5G8B,EAA4BC,GAAO,OAAOA,GAAM,SAAWA,EAAE,MAAM,EAAG,GAAG,EAAI,OACnF,MAAO,CACL,OAA+B,CAC7B,MAAAF,EAAO,OAAQC,EAAM9B,EAAM,MAAM,EAAG,SAAU8B,EAAM9B,EAAM,QAAQ,EAAG,WAAY8B,EAAM9B,EAAM,UAAU,EAAG,MAAAO,EAAO,QAAAJ,EAAS,MAAOM,EAAM,QAAAe,EAAS,KAAMC,EACtJ,MAAOC,EAAK,QAAS,OAAO,EAAG,QAASA,EAAK,UAAW,OAAO,EAAG,MAAOA,EAAK,QAAS,OAAO,EAAG,MAAOA,EAAK,QAAS,QAAQ,EAC9H,KAAM/B,GAAK,SAASK,EAAM,IAAI,EAAIA,EAAM,KAAOO,EAAM,OAAS,EAAI,aAAe,oBAAqB,SAAUP,EAAM,WAAa,EACrI,EACA,SAAAE,CACF,CACF,CAGA,SAASI,GAAMN,EAAO,CAEpB,IAAMgC,EAAO,CAAC,EACd,QAAWL,IAAO,CAAC,YAAa,YAAa,iBAAkB,mBAAmB,EAAO,OAAO,UAAU3B,EAAM2B,CAAG,CAAC,GAAK3B,EAAM2B,CAAG,EAAI,IAAGK,EAAKL,CAAG,EAAI3B,EAAM2B,CAAG,GAC9J,OAAI,MAAM,QAAQ3B,EAAM,KAAK,GAAKA,EAAM,MAAM,SAAW,GAAKA,EAAM,MAAM,MAAM,OAAO,SAAS,IAAGgC,EAAK,MAAQhC,EAAM,OAClH,OAAOA,EAAM,UAAa,YAAWgC,EAAK,SAAWhC,EAAM,UAC3D,OAAOA,EAAM,MAAS,UAAY,iBAAiB,KAAKA,EAAM,IAAI,IAAGgC,EAAK,KAAOhC,EAAM,MACpFgC,CACT,CAQO,SAASC,GAAWjC,EAAO,CAChC,GAAI,CAACA,GAAS,OAAOA,GAAU,SAAU,MAAO,CAAC,EACjD,GAAI,CAAC,KAAK,UAAUA,CAAK,EAAE,SAAS,UAAU,EAAG,OAAOA,EACxD,IAAMoB,EAA4BG,GAAOA,GAAK,OAAOA,GAAM,UAAY,WAAYA,EAAIA,EAAE,OAASA,EAC5FW,EAA6BX,GAAM,CAAE,IAAMQ,EAAIX,EAAMG,CAAC,EAAG,OAAO,OAAOQ,GAAM,SAAWA,EAAI,OAAOA,GAAG,KAAQ,SAAWA,EAAE,IAAM,MAAU,EAC3II,EAA2BZ,GAAM,CAAE,IAAMQ,EAAIX,EAAMG,CAAC,EAAG,OAAO,MAAM,QAAQQ,CAAC,EAAIA,EAAE,IAAI,MAAM,EAAI,OAAOA,GAAM,SAAW,CAACA,CAAC,EAAI,MAAU,EACzIK,EAA8B,CAAE,GAAI,QAAS,WAAY,QAAS,MAAO,QAAS,GAAI,MAAO,KAAM,MAAO,IAAK,MAAO,OAAQ,UAAW,QAAS,UAAW,MAAO,QAAS,QAAS,OAAQ,KAAM,MAAO,EAC3MC,EAA4BC,GAAM,OAAO,YAAY,OAAO,QAAQA,GAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAACC,CAAC,IAAMA,KAAKH,CAAK,EAAE,IAAI,CAAC,CAACG,EAAGhB,CAAC,IAAM,CAACa,EAAyCG,CAAE,EAAGL,EAAOX,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAEQ,CAAC,IAAMA,CAAC,CAAC,EACxMS,EAAUxC,EAAM,OAASA,EAAM,QAAU,CAAC,EAE1CyC,EAAS,CAAE,GAAGJ,EAAMG,CAAO,EAAG,GAAGH,EAAMG,EAAQ,KAAK,CAAE,EACtDE,EAAOL,EAAMG,EAAQ,IAAI,EAC3B,OAAO,KAAKE,CAAI,EAAE,SAAQD,EAAO,KAAOC,GAC5C,IAAMC,EAAQ3C,EAAM,MAAQA,EAAM,YAAc,CAAC,EAC3C4C,EAAUT,EAAKQ,EAAM,SAAWA,EAAM,SAAWA,EAAM,IAAI,EAAGE,EAAOV,EAAKQ,EAAM,MAAQA,EAAM,MAAQA,EAAM,IAAI,EACtH,OAAIC,GAAWC,KAAMJ,EAAO,MAAQ,CAAE,QAASG,GAAWC,EAAM,KAAMA,GAAQD,CAAQ,GAC/EH,CACT,CAMO,SAASK,MAAaC,EAAM,CAEjC,IAAMC,EAAM,CAAE,KAAM,WAAY,OAAQ,CAAC,EAAG,QAAS,CAAE,GAAGlD,GAAS,OAAQ,CAAE,EACvEI,EAAW,CAAC,EAClB,QAAWF,KAAS+C,EAClB,GAAI,GAAC/C,GAAS,OAAOA,GAAU,UAC/B,CAAI,OAAOA,EAAM,MAAS,WAAUgD,EAAI,KAAOhD,EAAM,MACjDA,EAAM,QAAU,OAAOA,EAAM,QAAW,WAAUgD,EAAI,OAAS,CAAE,GAAGA,EAAI,OAAQ,GAAGf,GAAWjC,EAAM,MAAM,CAAE,GAChH,OAAW,CAACD,EAAMkD,CAAU,IAAK,OAAO,QAAQjD,EAAM,SAAWA,EAAM,OAAS,CAAC,CAAC,EAAG,CACnF,GAAI,CAACP,GAAK,KAAKM,CAAI,EAAG,CAAEG,EAAS,KAAK,UAAUH,CAAI,sBAAsB,EAAG,QAAS,CACtF,GAAM,CAAE,OAAAmD,EAAQ,SAAUC,CAAM,EAAIlD,GAASgD,CAAU,EACvD/C,EAAS,KAAK,GAAGiD,EAAM,IAAKC,GAAM,UAAUrD,CAAI,KAAKqD,CAAC,EAAE,CAAC,EACrDF,IAAQF,EAAI,QAAQjD,CAAI,EAAImD,EAClC,EAEF,MAAO,CAAE,IAAAF,EAAK,SAAA9C,CAAS,CACzB,CAGO,SAASmD,GAAQH,EAAQnD,EAAMuD,EAAM,CAC1C,OAAI,OAAOJ,EAAO,OAAU,SAAiBA,EAAO,MAC7CA,EAAO,QAAQI,CAAI,GAAKJ,EAAO,QAAQI,EAAK,MAAM,GAAG,EAAE,CAAC,CAAC,GAAKJ,EAAO,OAAO,IAAMnD,CAC3F,CAQO,SAASwD,GAAYC,EAAO,CACjC,IAAMC,EAAQD,EAAM,MAAM,IAAKhD,GAASA,EAAK,IAAI,EACjD,GAAIiD,EAAM,SAAS,QAAQ,EAAG,MAAO,aACrC,GAAIA,EAAM,SAAS,MAAM,EAAG,MAAO,kBACnC,GAAIA,EAAM,SAAS,OAAO,EAAG,MAAO,WACpC,GAAID,EAAM,QAAU,EAAG,MAAO,QAE9B,IAAME,EADOF,EAAM,MAAM,IAAKhD,GAASA,EAAK,IAAI,EAAE,KAAK;AAAA,CAAI,EAAE,KAAK,EAC/C,MAAM;AAAA,CAAI,EAAE,OAAQmD,GAASA,EAAK,KAAK,CAAC,EAC3D,OAAID,EAAM,SAAW,GAAK,eAAe,KAAKA,EAAM,CAAC,CAAC,EAAU,UAC5D,sCAAsC,KAAKA,EAAM,CAAC,GAAK,EAAE,GAAKA,EAAM,QAAU,GAAK,CAAC,sBAAsB,KAAKA,EAAM,MAAM,CAAC,EAAE,KAAK;AAAA,CAAI,CAAC,EAAU,OAClJA,EAAM,QAAUA,EAAM,MAAM,CAACC,EAAM,IAAMA,EAAK,WAAW,GAAG,GAAM,IAAMD,EAAM,OAAS,GAAK,CAACC,EAAK,WAAW,GAAG,CAAE,GAAUD,EAAM,CAAC,EAAE,WAAW,GAAG,EAAI,QACpJ,SACT,CCvKO,SAASE,EAAEC,EAAKC,EAAa,CAAC,EAAGC,EAAW,CAAC,EAAG,CACrD,IAAMC,EAAU,SAAS,cAAcH,CAAG,EAC1C,OAAW,CAACI,EAAMC,CAAK,IAAK,OAAO,QAAQJ,CAAU,EAAOI,IAAU,QAAaA,IAAU,IAAOF,EAAQ,aAAaC,EAAMC,IAAU,GAAO,GAAK,OAAOA,CAAK,CAAC,EAClK,QAAWC,KAASJ,GAAcI,GAASA,IAAU,KAAIH,EAAQ,OAAOG,CAAK,EAC7E,OAAOH,CACT,CAGO,SAASI,GAAQC,EAAM,CAC5B,IAAMC,EAAM,OAAOD,GAAQ,EAAE,EAAE,KAAK,EACpC,MAAI,8BAA8B,KAAKC,CAAG,GAAK,oDAAoD,KAAKA,CAAG,EAAUA,EACjH,mBAAmB,KAAKA,CAAG,EAAU,KAClCA,CACT,CAMO,SAASC,GAAYC,EAAOC,EAAS,CAE1C,IAAMC,EAAQ,OAAOF,EAAM,SAAS,QAAU,EAAE,EAAE,KAAK,EAAE,YAAY,EAC/DG,EAASF,EAAQ,IAAI,QAAQC,CAAK,EAAIA,EAAQD,EAAQ,IAAI,QAAQG,GAAQF,CAAK,CAAC,EAAIE,GAAQF,CAAK,EAAIG,GAAYL,CAAK,EACtHM,EAAaL,EAAQ,IAAI,QAAQE,CAAM,GAAKI,GAAS,QAAQ,QAC7DC,EAAU,OAAOR,EAAM,SAAS,OAAS,EAAE,EAAE,MAAM,KAAK,EAAE,OAAQP,GAAS,CAAC,SAAU,cAAe,WAAW,EAAE,SAASA,CAAI,CAAC,EAChIgB,EAAU,CAAE,KAAM,CAAE,EACpBC,EAAQ,IAAI,IAAIV,EAAM,MAAM,IAAKW,GAAS,CAACA,EAAK,KAAMA,CAAI,CAAC,CAAC,EAC5DC,EAAQN,EAAW,MACnBO,EAAUzB,EAAE,UAAW,CAC3B,MAAO,CAAC,aAAc,eAAee,CAAM,GAAI,GAAGK,EAAQ,IAAKf,GAAS,cAAcA,CAAI,EAAE,CAAC,EAAE,KAAK,GAAG,EACvG,aAAcO,EAAM,MAAO,cAAeG,EAAQ,aAAcG,EAAW,MAAO,aAAcA,EAAW,MAAO,eAAgBA,EAAW,QAAS,aAAcA,EAAW,MAC/K,uBAAwBL,EAAQ,MAAO,KAAM,OAC/C,CAAC,EAEKa,EAAS1B,EAAE,MAAO,CAAE,MAAO,aAAc,CAAC,EAChD0B,EAAO,MAAM,YAAY,sBAAuBR,EAAW,MAAM,IAAKS,GAAQ,IAAIA,EAAI,IAAKC,GAAUA,IAAS,IAAM,IAAM,KAAKA,CAAI,EAAG,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,EAC/JF,EAAO,MAAM,YAAY,wBAAyBR,EAAW,QAAQ,KAAK,GAAG,CAAC,EAC9EQ,EAAO,MAAM,YAAY,qBAAsBR,EAAW,KAAK,KAAK,GAAG,CAAC,EACxEO,EAAQ,OAAOC,CAAM,EACrB,IAAMG,EAAQjB,EAAM,SAAS,OAASA,EAAM,SAAS,WACrD,GAAI,OAAOiB,GAAU,UAAY,CAAC,aAAc,cAAe,QAAS,OAAO,EAAE,SAASd,CAAM,EAAG,CACjG,IAAML,EAAMG,EAAQ,QAAQgB,CAAK,EACjC,GAAInB,EAAK,CACP,IAAMoB,EAAU9B,EAAE,MAAO,CAAE,MAAO,aAAc,KAAM,MAAO,aAAc,OAAOY,EAAM,SAAS,KAAO,EAAE,GAAK,MAAU,CAAC,EAC1HkB,EAAQ,MAAM,YAAY,eAAgB,QAAQpB,EAAI,QAAQ,WAAY,kBAAkB,CAAC,IAAI,EACjGgB,EAAO,OAAOI,CAAO,EACrBL,EAAQ,UAAU,IAAI,WAAW,CACnC,CACF,CACA,QAAWpB,KAAQmB,EAAO,CACxB,IAAMD,EAAOD,EAAM,IAAIjB,CAAI,EACrBD,EAAUJ,EAAE,MAAO,CAAE,MAAO,YAAa,YAAaK,CAAK,EAAGkB,EAAOQ,GAAOR,EAAMV,EAASQ,CAAO,EAAI,CAAC,CAAC,EAC9GjB,EAAQ,MAAM,YAAY,YAAa,KAAKC,CAAI,EAAE,EAClDqB,EAAO,OAAOtB,CAAO,CACvB,CAEA,QAAWmB,KAAQX,EAAM,MAAYY,EAAM,SAASD,EAAK,IAAI,GAAGG,EAAO,OAAO1B,EAAE,MAAO,CAAE,MAAO,YAAa,YAAauB,EAAK,IAAK,EAAGQ,GAAOR,EAAMV,EAASQ,CAAO,CAAC,CAAC,EACtK,OAAIH,EAAW,UAAYN,EAAM,SAAS,WAAa,IAAOa,EAAQ,OAAOzB,EAAE,OAAQ,CAAE,MAAO,cAAe,cAAe,MAAO,EAAG,CAACa,EAAQ,OAAOD,EAAM,MAAQ,CAAC,CAAC,CAAC,CAAC,EACnK,CAAE,QAASa,EAAS,MAAOJ,EAAQ,IAAK,CACjD,CAGA,SAASU,GAAOR,EAAMV,EAASQ,EAAS,CACtC,IAAMW,EAASnB,EAAQ,IAAIU,EAAK,IAAI,EAE9BU,EAAM,CAAC,EACTC,EAAKX,EAAK,MAAOY,EAA+C,GACpE,QAAWC,KAASJ,EAAQ,CAC1B,IAAMK,EAAQH,EACdA,GAAME,EAAM,IAAI,OAEhB,IAAME,EAASF,EAAM,OAAS,YAAcA,EAAM,IAAI,KAAK,EAAE,MAAM;AAAA,CAAI,EAAE,IAA2BG,GAASA,EAAK,KAAK,CAAC,EAAI,CAAC,EAC7H,GAAID,EAAO,QAAUA,EAAO,MAA6BC,GAAS,SAAS,KAAKA,CAAI,CAAC,EAAG,CACtF,QAAWC,KAASF,EACd,wCAAwC,KAAKE,CAAK,EAAGL,EAAO,SACvD,aAAa,KAAKK,CAAK,GAAKL,IAAS,WAAUA,EAAO,IAEjE,QACF,CACA,GAAIC,EAAM,OAAS,OAAQ,CACzB,IAAMnC,EAAM,wCAAwC,KAAKmC,EAAM,GAAG,EAClE,GAAInC,GAAOA,EAAI,CAAC,IAAM,KAAMgC,EAAI,KAAKjC,EAAE,IAAI,CAAC,UACnCC,EAAKkC,EAAOlC,EAAI,CAAC,EAAI,GAAwCA,EAAI,CAAC,EAAE,YAAY,IAAM,WAAa,SAAW,gBAC9G,SAAS,KAAKmC,EAAM,GAAG,EAAG,CAGjC,IAAMK,EAAOzC,EAAE,SAAS,KAAKoC,EAAM,GAAG,EAAI,KAAO,KAAM,CAAE,IAAK,MAAO,CAAC,EACtE,OAAW,CAAC,CAAEM,EAAOC,CAAK,IAAKP,EAAM,IAAI,SAAS,uDAAuD,EAAG,CAC1G,IAAMQ,EAAQD,EAAM,QAAQ,mBAAoB,EAAE,EAAE,QAAQ,WAAY,GAAG,EAAE,QAAQ,OAAQ,GAAG,EAAE,KAAK,EACvG,GAAI,CAACC,EAAO,SACZ,IAAMC,EAAK7C,EAAE,KAAM,CAAE,IAAK,MAAO,EAAG,CAAC4C,CAAK,CAAC,GACvC,cAAc,KAAKF,CAAK,GAAKP,IAAS,WAAUW,GAAKD,EAAI,EAAExB,EAAQ,IAAI,EAC3EoB,EAAK,OAAOI,CAAE,CAChB,CACIJ,EAAK,mBAAmBR,EAAI,KAAKQ,CAAI,CAC3C,KAAO,CACL,IAAMG,EAAQR,EAAM,IAAI,QAAQ,mBAAoB,EAAE,EAAE,QAAQ,WAAY,GAAG,EAAE,QAAQ,OAAQ,GAAG,EAAE,KAAK,EACvGQ,GAAOX,EAAI,KAAKjC,EAAE,IAAK,CAAC,EAAG,CAAC4C,CAAK,CAAC,CAAC,CACzC,CACA,QACF,CACA,IAAMxC,EAAU2C,GAAMX,EAAOC,EAAOxB,EAASsB,IAAS,SAAWd,EAAU,IAAI,EAC1EjB,KACD+B,IAAS,SAAYA,IAAS,UAAYC,EAAM,OAAS,SAASU,GAAK1C,EAAS,EAAEiB,EAAQ,IAAI,EAClGY,EAAI,KAAK7B,CAAO,EAClB,CACA,OAAO6B,CACT,CAGA,IAAMa,GAAO,CAAC1C,EAAS4C,IAAM,CAAE5C,EAAQ,UAAU,IAAI,WAAW,EAAGA,EAAQ,aAAa,YAAa,OAAO4C,CAAC,CAAC,CAAE,EAOhH,SAASD,GAAMX,EAAOC,EAAOxB,EAASoC,EAAS,CAC7C,OAAQb,EAAM,KAAM,CAClB,IAAK,UAAW,CACd,IAAMc,EAAO,mBAAmB,KAAKd,EAAM,GAAG,EACxCe,EAAOD,EAAOE,GAAMf,EAAQa,EAAK,CAAC,EAAE,OAAQb,EAAQD,EAAM,IAAI,QAAQ,YAAa,EAAE,EAAE,MAAM,EAAI,OACvG,OAAOvB,EAAQ,WAAa,OACxBb,EAAE,IAAIoC,EAAM,KAAK,GAAI,CAAE,IAAK,OAAQ,YAAae,CAAK,EAAGE,EAAOjB,EAAM,OAAQvB,CAAO,CAAC,EACtFb,EAAE,IAAK,CAAE,MAAO,gBAAgBoC,EAAM,KAAK,GAAI,KAAM,UAAW,aAAc,KAAK,IAAI,EAAGA,EAAM,MAAQ,CAAC,EAAG,IAAK,OAAQ,YAAae,CAAK,EAAGE,EAAOjB,EAAM,OAAQvB,CAAO,CAAC,CACjL,CACA,IAAK,YAAa,CAChB,IAAMyC,EAAOlB,EAAM,OAAO,SAAW,GAAKA,EAAM,OAAO,CAAC,EAAE,OAAS,QACnE,OAAOpC,EAAE,IAAK,CAAE,IAAK,OAAQ,MAAOsD,EAAO,eAAiB,OAAW,YAAaA,EAAO,OAAYF,GAAMf,EAAOA,EAAQD,EAAM,IAAI,QAAQ,EAAE,MAAM,CAAE,EAAGiB,EAAOjB,EAAM,OAAQvB,CAAO,CAAC,CAC1L,CACA,IAAK,OAAQ,OAAOb,EAAE,IAAK,CAAE,IAAK,MAAO,EAAGqD,EAAOjB,EAAM,QAAU,CAAC,CAAE,KAAM,OAAQ,KAAMA,EAAM,IAAK,CAAC,EAAGvB,CAAO,CAAC,EAEjH,IAAK,aAAc,OAAOb,EAAE,aAAc,CAAC,EAAGG,GAASiC,EAAM,OAAQC,EAAOD,EAAM,IAAKvB,CAAO,CAAC,EAC/F,IAAK,OAAQ,CACX,IAAI0C,EAAO,EACLd,EAAOzC,EAAEoC,EAAM,QAAU,KAAO,KAAM,CAAE,MAAOA,EAAM,SAAWA,EAAM,QAAU,EAAIA,EAAM,MAAQ,OAAW,MAAOA,EAAM,MAAM,KAAyBoB,GAASA,EAAK,IAAI,EAAI,aAAe,MAAU,CAAC,EAC/M,QAAWA,KAAQpB,EAAM,MAAO,CAC9B,IAAMqB,EAASrB,EAAM,IAAI,QAAQoB,EAAK,IAAKD,CAAI,EAC/CA,EAAOE,EAASD,EAAK,IAAI,OACzB,IAAME,EAAYrB,EAAQ,KAAK,IAAI,EAAGoB,CAAM,EACtCE,EAAS,4CAA4C,KAAKH,EAAK,GAAG,EAClEI,EAASJ,EAAK,OAAO,SAAW,GAAKA,EAAK,OAAO,CAAC,EAAE,OAAS,QAAU,CAAC,UAAU,KAAKA,EAAK,IAAI,KAAK,EAAE,MAAM;AAAA,CAAI,EAAE,MAAM,CAAC,EAAE,KAAK;AAAA,CAAI,CAAC,EACtIX,EAAK7C,EAAE,KAAM,CAAE,IAAK,OAAQ,YAAa4D,GAAUD,EAASP,GAAMM,EAAYC,EAAO,CAAC,EAAE,OAAQD,EAAYF,EAAK,IAAI,QAAQ,EAAE,MAAM,EAAI,MAAU,EAAG,CAC1JA,EAAK,KAAOxD,EAAE,QAAS,CAAE,KAAM,WAAY,QAASwD,EAAK,QAAS,SAAU,GAAM,aAAcA,EAAK,IAAK,CAAC,EAAI,KAC/G,GAAGA,EAAK,OAAO,QAA4Bb,GAAUA,EAAM,OAAS,OAASU,EAAOV,EAAM,QAAU,CAAC,CAAE,KAAM,OAAQ,KAAMA,EAAM,IAAK,CAAC,EAAG9B,CAAO,EAC7I,CAACkC,GAAMJ,EAAOe,EAAY,KAAK,IAAI,EAAGF,EAAK,IAAI,QAAQb,EAAM,GAAG,CAAC,EAAG9B,EAAS,IAAI,CAAC,CAAC,CACzF,CAAC,EACGoC,GAASH,GAAKD,EAAI,EAAEI,EAAQ,IAAI,EACpCR,EAAK,OAAOI,CAAE,CAChB,CACA,OAAOJ,CACT,CACA,IAAK,OAAQ,CACX,IAAMoB,EAAO,4BAA4B,KAAKzB,EAAM,MAAQ,EAAE,GAAK,CAAC,EAC9D0B,GAAQD,EAAK,CAAC,GAAK,IAAI,YAAY,EACnCE,EAASlD,EAAQ,OAAOiD,CAAI,EAClC,GAAIC,EAAQ,CACV,IAAMC,EAAMhE,EAAE,MAAO,CAAE,MAAO,mBAAmB8D,CAAI,GAAI,cAAe1B,EAAM,IAAK,CAAC,EACpF,OAAA4B,EAAI,OAAOhE,EAAE,MAAO,CAAE,MAAO,oBAAqB,IAAK,KAAM,EAAG,CAACA,EAAE,OAAQ,CAAC,EAAG,CAACoC,EAAM,IAAI,CAAC,CAAC,CAAC,CAAC,EAC9F,eAAe,IAAM,QAAQ,QAAQ2B,EAAOC,EAAK5B,EAAM,IAAI,CAAC,EAAE,MAAM,IAAM4B,EAAI,UAAU,IAAI,WAAW,CAAC,CAAC,EAClGA,CACT,CACA,IAAMC,EAASC,GAAML,EAAK,CAAC,GAAK,EAAE,EAC5BM,EAAOnE,EAAE,OAAQ,CAAE,MAAO8D,EAAO,YAAYA,CAAI,GAAK,MAAU,CAAC,EACvE,OAAW,CAACM,EAAG7B,CAAI,IAAKH,EAAM,KAAK,MAAM;AAAA,CAAI,EAAE,QAAQ,EAAG+B,EAAK,OAAOnE,EAAE,OAAQ,CAAE,MAAOiE,EAAO,IAAIG,EAAI,CAAC,EAAI,sBAAwB,WAAY,EAAG,CAAC7B,EAAM;AAAA,CAAI,CAAC,CAAC,EACjK,OAAOvC,EAAE,MAAO,CAAE,IAAK,MAAO,MAAOiE,EAAO,KAAO,YAAc,OAAW,SAAU,CAAE,EAAG,CAACE,CAAI,CAAC,CACnG,CACA,IAAK,QAAS,CACZ,IAAME,EAAsCC,GAAMA,GAAK,OACvD,OAAOtE,EAAE,MAAO,CAAE,MAAO,YAAa,EAAG,CAACA,EAAE,QAAS,CAAC,EAAG,CACvDA,EAAE,QAAS,CAAC,EAAG,CAACA,EAAE,KAAM,CAAC,EAAGoC,EAAM,OAAO,IAAI,CAAoBR,EAA4BwC,IAAMpE,EAAE,KAAM,CAAE,aAAcqE,EAAMjC,EAAM,MAAMgC,CAAC,CAAC,EAAG,IAAK,MAAO,EAAGf,EAAOzB,EAAK,OAAQf,CAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EACjMb,EAAE,QAAS,CAAC,EAAGoC,EAAM,KAAK,IAA0BT,GAAQ3B,EAAE,KAAM,CAAC,EAAG2B,EAAI,IAAI,CAACC,EAAMwC,IAAMpE,EAAE,KAAM,CAAE,aAAcqE,EAAMjC,EAAM,MAAMgC,CAAC,CAAC,EAAG,IAAK,MAAO,EAAGf,EAAOzB,EAAK,OAAQf,CAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAC7L,CAAC,CAAC,CAAC,CACL,CACA,QAAS,OAAO,IAClB,CACF,CAGA,SAASV,GAAS6B,EAAQK,EAAOkC,EAAK1D,EAAS,CAC7C,IAAI0C,EAAO,EACX,OAAOvB,EAAO,IAAKI,GAAU,CAC3B,IAAMqB,EAASc,EAAI,QAAQnC,EAAM,IAAKmB,CAAI,EAC1C,OAAAA,EAAO,KAAK,IAAIA,EAAME,EAASrB,EAAM,IAAI,MAAM,EACxCW,GAAMX,EAAOC,EAAQ,KAAK,IAAI,EAAGoB,CAAM,EAAG5C,EAAS,IAAI,CAChE,CAAC,CACH,CAGA,SAASqD,GAAMM,EAAM,CACnB,IAAMP,EAAS,IAAI,IACnB,QAAWQ,KAAQD,EAAK,MAAM,MAAM,EAAG,CACrC,GAAM,CAACF,EAAGI,CAAC,EAAID,EAAK,MAAM,GAAG,EAAE,IAAKzB,GAAM,SAASA,EAAG,EAAE,CAAC,EACzD,GAAI,OAAO,SAASsB,CAAC,EAAG,QAAStB,EAAIsB,EAAGtB,IAAM,OAAO,SAAS0B,CAAC,EAAIA,EAAIJ,GAAItB,IAAKiB,EAAO,IAAIjB,CAAC,CAC9F,CACA,OAAOiB,CACT,CAGA,IAAMb,GAAQ,CAACG,EAAMoB,IAAQA,EAAKpB,EAAO,GAAGA,CAAI,IAAIoB,CAAE,GAAK,OAGpD,SAAStB,EAAOrB,EAAS,CAAC,EAAGnB,EAAS,CAC3C,OAAOmB,EAAO,QAASI,GAAU,CAC/B,OAAQA,EAAM,KAAM,CAClB,IAAK,OAAQ,IAAK,SAAU,OAAOA,EAAM,OAASiB,EAAOjB,EAAM,OAAQvB,CAAO,EAAI,CAACuB,EAAM,KAAK,QAAQ,0BAA2B,CAAuBwC,EAAyBC,KAAO,CAAE,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,KAAM,IAAK,MAAO,GAAI,GAAyBA,CAAE,CAAC,CAAC,EACzQ,IAAK,SAAU,MAAO,CAAC7E,EAAE,SAAU,CAAC,EAAGqD,EAAOjB,EAAM,OAAQvB,CAAO,CAAC,CAAC,EACrE,IAAK,KAAM,MAAO,CAACb,EAAE,KAAM,CAAC,EAAGqD,EAAOjB,EAAM,OAAQvB,CAAO,CAAC,CAAC,EAC7D,IAAK,MAAO,MAAO,CAACb,EAAE,MAAO,CAAC,EAAGqD,EAAOjB,EAAM,OAAQvB,CAAO,CAAC,CAAC,EAC/D,IAAK,WAAY,MAAO,CAACb,EAAE,OAAQ,CAAC,EAAG,CAACoC,EAAM,KAAK,QAAQ,0BAA2B,CAAuBwC,EAAyBC,KAAO,CAAE,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,KAAM,IAAK,MAAO,GAAI,GAAyBA,CAAE,CAAC,CAAC,CAAC,CAAC,EAChO,IAAK,KAAM,MAAO,CAAC7E,EAAE,IAAI,CAAC,EAC1B,IAAK,OAAQ,CACX,IAAMS,EAAOD,GAAQ4B,EAAM,IAAI,EAC/B,OAAO3B,EAAO,CAACT,EAAE,IAAK,CAAE,KAAAS,EAAM,IAAK,sBAAuB,OAAQA,EAAK,WAAW,GAAG,EAAI,OAAY,QAAS,EAAG4C,EAAOjB,EAAM,OAAQvB,CAAO,CAAC,CAAC,EAAIwC,EAAOjB,EAAM,OAAQvB,CAAO,CACjL,CACA,IAAK,QAAS,CACZ,IAAMiE,EAAMjE,EAAQ,QAAQuB,EAAM,IAAI,EACtC,OAAO0C,EAAM,CAAC9E,EAAE,MAAO,CAAE,IAAA8E,EAAK,IAAK1C,EAAM,KAAM,QAAS,MAAO,CAAC,CAAC,EAAI,CAACA,EAAM,IAAI,CAClF,CACA,IAAK,OAAQ,MAAO,gBAAgB,KAAKA,EAAM,GAAG,EAAI,CAACpC,EAAE,IAAI,CAAC,EAAI,CAAC,EACnE,QAAS,OAAOoC,EAAM,KAAO,CAACA,EAAM,IAAI,EAAI,CAAC,CAC/C,CACF,CAAC,CACH,CCtOO,IAAM2C,GAA+C,CAC1D,QAAS,CAAE,MAAO,UAAW,IAAK,UAAW,QAAS,UAAW,MAAO,OAAQ,OAAQ,EAAG,EAC3F,MAAO,CAAE,MAAO,UAAW,IAAK,UAAW,QAAS,UAAW,MAAO,OAAQ,OAAQ,CAAE,EACxF,MAAO,CAAE,MAAO,UAAW,IAAK,UAAW,QAAS,UAAW,MAAO,OAAQ,OAAQ,CAAE,EACxF,IAAK,CAAE,MAAO,UAAW,IAAK,UAAW,QAAS,UAAW,MAAO,UAAW,OAAQ,CAAE,CAC3F,EAGaC,GAA2E,CACtF,KAAM,CAAE,QAAS,wEAAyE,KAAM,uEAAwE,EACxK,QAAS,CAAE,QAAS,4DAA6D,KAAM,0DAA2D,EAClJ,KAAM,CAAE,QAAS,gFAAiF,KAAM,0DAA2D,EACnK,SAAU,CAAE,QAAS,gEAAiE,KAAM,qDAAsD,CACpJ,EAOO,SAASC,GAASC,EAAUC,EAAU,CAAC,EAAG,CAC/C,IAAMC,EAAQL,GAAM,OAAOG,EAAS,OAAS,EAAE,CAAC,GAAKH,GAAM,QACrDM,EAAM,OAAOH,EAAS,aAAgB,UAAYA,EAAS,YAAcA,EAAS,YAAc,CAAC,EAEjGI,EAAS,CAAE,GAAGF,EAAO,GAAGG,GAAMJ,CAAO,EAAG,GAAGI,GAAMF,CAAG,CAAE,EAC5D,OAAKL,GAAOM,EAAO,KAAK,IAAGA,EAAO,MAAQ,QACnCA,CACT,CAGA,SAASC,GAAMC,EAAO,CAEpB,IAAMC,EAAO,CAAC,EACd,QAAWC,IAA6B,CAAC,QAAS,MAAO,UAAW,QAAS,MAAM,EAAQ,OAAOF,EAAME,CAAG,GAAM,UAAYC,GAAIH,EAAME,CAAG,CAAC,IAAGD,EAAKC,CAAG,EAAIF,EAAME,CAAG,GACnK,OAAIF,EAAM,MAAQ,OAAOA,EAAM,MAAS,WAAUC,EAAK,KAAO,OAAO,YAAY,OAAO,QAAQD,EAAM,IAAI,EAAE,OAAO,CAAC,CAAC,CAAEI,CAAC,IAAM,OAAOA,GAAM,UAAYD,GAAIC,CAAC,CAAC,CAAC,GAC1JJ,EAAM,OAAS,MAAM,QAAQA,EAAM,MAAM,OAAO,GAAK,MAAM,QAAQA,EAAM,MAAM,IAAI,IAAGC,EAAK,MAAQ,CAAE,QAASD,EAAM,MAAM,QAAQ,IAAI,MAAM,EAAG,KAAMA,EAAM,MAAM,KAAK,IAAI,MAAM,CAAE,GAClL,OAAOA,EAAM,OAAU,WAAUC,EAAK,MAAQD,EAAM,OACpD,OAAOA,EAAM,QAAW,WAAUC,EAAK,OAASD,EAAM,QACnDC,CACT,CAMO,SAASI,GAASP,EAAQQ,EAAQ,CACvC,IAAMC,EAAQJ,GAAIL,EAAO,KAAK,GAAK,CAAC,IAAK,IAAK,GAAG,EAAGU,EAAOL,GAAIL,EAAO,GAAG,GAAK,CAAC,GAAI,GAAI,EAAE,EAEnFD,EAAMS,IAAW,OAASR,EAAO,MAAQ,CAAC,EAAI,CAAC,EAC/CW,EAAQC,GAAMP,GAAIN,EAAI,OAAS,EAAE,IAAMS,IAAW,OAASK,GAAIH,EAAM,CAAC,EAAG,EAAG,CAAC,EAAG,GAAI,EAAID,EAAM,EAC9FK,EAAMF,GAAMP,GAAIN,EAAI,KAAO,EAAE,IAAMS,IAAW,OAASK,GAAIJ,EAAO,CAAC,IAAK,IAAK,GAAG,EAAG,EAAG,EAAIC,EAAK,EAC/FK,EAAUV,GAAIN,EAAI,SAAWC,EAAO,OAAO,GAAK,CAAC,IAAK,IAAK,EAAE,EAE7DgB,EAAOC,GAASF,EAASJ,EAAO,GAAG,EACnCO,EAAYC,GAASL,EAAKC,CAAO,GAAKI,GAASR,EAAOI,CAAO,EAAID,EAAMH,EACvES,EAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAAE,IAAKC,GAAMJ,GAASK,GAAOP,EAASM,EAAI,EAAE,EAAGV,EAAO,CAAC,CAAC,EACxF,MAAO,CACL,MAAOY,GAAIZ,CAAK,EAAG,IAAKY,GAAIT,CAAG,EAAG,MAAOS,GAAIN,GAASL,GAAMP,GAAIN,EAAI,QAAUS,IAAW,QAAUR,EAAO,OAAS,GAAK,GAAG,GAAKa,GAAIC,EAAKH,EAAO,GAAI,CAAC,EAAGA,EAAO,GAAG,CAAC,EAAG,KAAMY,GAAIV,GAAIC,EAAKH,EAAO,GAAI,CAAC,EACrM,QAASY,GAAIP,CAAI,EAAG,UAAWO,GAAIL,CAAS,EAAG,KAAMK,GAAIlB,GAAIN,EAAI,OAASS,IAAW,QAAUR,EAAO,MAAQ,GAAK,GAAG,GAAKa,GAAIE,EAASJ,EAAO,GAAI,CAAC,EAAG,OAAQS,EAAO,IAAIG,EAAG,CAC/K,CACF,CAGO,SAASlB,GAAImB,EAAO,CACzB,IAAMC,EAAI,+BAA+B,KAAK,OAAOD,CAAK,EAAE,KAAK,CAAC,EAClE,GAAI,CAACC,EAAG,OAAO,KACf,IAAMC,EAAID,EAAE,CAAC,EAAE,SAAW,EAAI,CAAC,GAAGA,EAAE,CAAC,CAAC,EAAE,IAAKE,GAAMA,EAAIA,CAAC,EAAE,KAAK,EAAE,EAAIF,EAAE,CAAC,EACxE,MAAgD,CAAC,EAAG,EAAG,CAAC,EAAE,IAAKG,GAAM,SAASF,EAAE,MAAME,EAAGA,EAAI,CAAC,EAAG,EAAE,CAAC,CACtG,CAGO,IAAML,GAAOM,GAAQ,IAAIA,EAAI,IAAKF,GAAM,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,IAAKA,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAG1Hf,GAASe,GAA+CA,EAAE,IAAKrB,GAAM,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,IAAKA,CAAC,CAAC,CAAC,CAAC,EAG9GO,GAAM,CAACiB,EAAGC,EAAGC,IAA+CF,EAAE,IAAI,CAACH,EAAGC,IAAMD,GAAKI,EAAEH,CAAC,EAAID,GAAKK,CAAC,EAGpG,SAASC,GAAUJ,EAAK,CACtB,GAAM,CAACK,EAAGC,EAAGJ,CAAC,EAAIF,EAAI,IAAKF,GAAM,CAAE,IAAMS,EAAIT,EAAI,IAAK,OAAOS,GAAK,OAAUA,EAAI,QAAUA,EAAI,MAAS,QAAU,GAAI,CAAC,EACtH,MAAO,OAASF,EAAI,MAASC,EAAI,MAASJ,CAC5C,CAGO,SAASZ,GAASW,EAAGC,EAAG,CAC7B,GAAM,CAACM,EAAGC,CAAC,EAAI,CAACL,GAAUH,CAAC,EAAGG,GAAUF,CAAC,CAAC,EAAE,KAAK,CAACQ,EAAGC,IAAMA,EAAID,CAAC,EAChE,OAAQF,EAAI,MAASC,EAAI,IAC3B,CAMO,SAASrB,GAASwB,EAAQ9B,EAAO+B,EAAO,CAC7C,IAAMC,EAASV,GAAUtB,CAAK,EAAI,IAAO,CAAC,EAAG,EAAG,CAAC,EAAI,CAAC,IAAK,IAAK,GAAG,EAC/DqB,EAAI,EAAGY,EAAMhC,GAAM6B,CAAM,EAC7B,KAAOtB,GAASyB,EAAKjC,CAAK,EAAI+B,GAASV,EAAI,GAAGY,EAAMhC,GAAMC,GAAI4B,EAAQE,EAASX,EAAI,KAAK,IAAI,EAAGA,EAAI,GAAI,CAAE,CAAC,EAC1G,OAAOY,CACT,CAGA,SAAStB,GAAOO,EAAKgB,EAAS,CAC5B,GAAM,CAACX,EAAGC,EAAGJ,CAAC,EAAIF,EAAI,IAAKF,GAAMA,EAAI,GAAG,EAClCmB,EAAM,KAAK,IAAIZ,EAAGC,EAAGJ,CAAC,EAAGgB,EAAM,KAAK,IAAIb,EAAGC,EAAGJ,CAAC,EAAG,GAAKe,EAAMC,GAAO,EACpEC,EAAIF,EAAMC,EACVX,EAAIY,IAAM,EAAI,EAAIA,GAAK,EAAI,KAAK,IAAI,EAAI,EAAI,CAAC,GAC/CtB,EAAIsB,IAAM,EAAI,EAAIF,IAAQZ,GAAMC,EAAIJ,GAAKiB,EAAK,EAAIF,IAAQX,GAAKJ,EAAIG,GAAKc,EAAI,GAAKd,EAAIC,GAAKa,EAAI,EAClGtB,GAAKA,EAAI,GAAKmB,EAAU,KAAO,IAC/B,IAAMlB,GAAK,EAAI,KAAK,IAAI,EAAI,EAAI,CAAC,GAAK,KAAK,IAAIS,EAAG,GAAI,EAAGC,EAAIV,GAAK,EAAI,KAAK,IAAMD,EAAI,GAAM,EAAK,CAAC,GAAID,EAAI,EAAIE,EAAI,EAC3G,CAACY,EAAGC,EAAGS,CAAC,EAAIvB,EAAI,GAAK,CAACC,EAAGU,EAAG,CAAC,EAAIX,EAAI,IAAM,CAACW,EAAGV,EAAG,CAAC,EAAID,EAAI,IAAM,CAAC,EAAGC,EAAGU,CAAC,EAAIX,EAAI,IAAM,CAAC,EAAGW,EAAGV,CAAC,EAAID,EAAI,IAAM,CAACW,EAAG,EAAGV,CAAC,EAAI,CAACA,EAAG,EAAGU,CAAC,EACvI,MAAO,CAACE,EAAId,EAAGe,EAAIf,EAAGwB,EAAIxB,CAAC,EAAE,IAAKnB,GAAMA,EAAI,GAAG,CACjD,CC1HA,IAAM4C,GAAiE,CACrE,GAAI,CAAE,KAAM,SAAU,MAAO,QAAS,SAAU,WAAY,SAAU,WAAY,KAAM,OAAQ,QAAS,sBAAuB,UAAW,iBAAkB,SAAU,aAAc,KAAM,SAAU,OAAQ,gBAAiB,OAAQ,qBAAsB,OAAQ,mBAAoB,MAAO,QAAS,QAAS,2BAA4B,OAAQ,OAAQ,KAAM,aAAc,MAAO,uBAAwB,MAAO,OAAQ,EAC/Z,GAAI,CAAE,KAAM,eAAgB,MAAO,cAAe,SAAU,YAAa,SAAU,aAAc,KAAM,WAAY,QAAS,2BAA4B,UAAW,mBAAoB,SAAU,0BAA2B,KAAM,WAAY,OAAQ,kBAAmB,OAAQ,4BAA6B,OAAQ,2BAA4B,MAAO,QAAS,QAAS,uCAAwC,OAAQ,UAAW,KAAM,uBAAwB,MAAO,8BAA+B,MAAO,YAAa,EAC9f,GAAI,CAAE,KAAM,UAAW,MAAO,QAAS,SAAU,YAAa,SAAU,UAAW,KAAM,UAAW,QAAS,oBAAqB,UAAW,cAAe,SAAU,aAAc,KAAM,QAAS,OAAQ,eAAgB,OAAQ,yBAA0B,OAAQ,YAAa,MAAO,YAAa,QAAS,2BAA4B,OAAQ,UAAW,KAAM,kBAAmB,MAAO,yBAA0B,MAAO,UAAW,EAC1a,GAAI,CAAE,KAAM,OAAQ,MAAO,OAAQ,SAAU,QAAS,SAAU,KAAM,KAAM,KAAM,QAAS,SAAU,UAAW,SAAU,SAAU,WAAY,KAAM,KAAM,OAAQ,YAAa,OAAQ,iBAAkB,OAAQ,eAAgB,MAAO,KAAM,QAAS,mBAAoB,OAAQ,IAAK,KAAM,UAAW,MAAO,qBAAsB,MAAO,QAAS,CAC1V,EAGaC,GAAcC,GAASF,GAAQE,EAAK,MAAM,GAAG,EAAE,CAAC,EAAE,YAAY,CAAC,GAAKF,GAAQ,GCJlF,SAASG,IAA4G,CAC1H,MAAO,CACL,MAAO,GACP,OAAQ,GACR,WAAY,KACZ,IAAK,GACL,MAAO,KACP,SAAU,GACV,SAAU,KACV,OAAQ,GACR,UAAW,KACX,WAAY,IACd,CACF,CAEO,IAAIC,GAAqCD,GAAa,EAEtD,SAASE,GAA+DC,EAA0D,CACvIF,GAAYE,CACd,CCxBA,IAAMC,GAAW,CAAE,KAAM,IAAM,IAAK,EAEpC,SAASC,GAAkBC,EAAyC,CAClE,IAAMC,EAAkB,CAAC,EACzB,OAAQC,GAAmB,CACzB,IAAMC,EAAa,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGD,EAAS,CAAC,CAAC,EAClDE,EAAQH,EAAME,CAAU,EAC5B,OAAKC,IACHA,EAAQJ,EAAYG,CAAU,EAC9BF,EAAME,CAAU,EAAIC,GAEfA,CACT,CACF,CAEA,SAASC,EAAKD,EAAwBE,EAAM,GAAI,CAC9C,IAAIC,EAAS,OAAOH,GAAU,SAAWA,EAAQA,EAAM,OACjDI,EAAM,CACV,QAAS,CAACC,EAAuBC,IAAyB,CACxD,IAAIC,EAAY,OAAOD,GAAQ,SAAWA,EAAMA,EAAI,OACpD,OAAAC,EAAYA,EAAU,QAAQC,EAAM,MAAO,IAAI,EAC/CL,EAASA,EAAO,QAAQE,EAAME,CAAS,EAChCH,CACT,EACA,SAAU,IACD,IAAI,OAAOD,EAAQD,CAAG,CAEjC,EACA,OAAOE,CACT,CAGA,IAAMK,IAAsB,CAACC,EAAI,KAAO,CACxC,GAAI,CACF,MAAO,CAAC,CAAC,IAAI,OAAO,eAAiBA,CAAC,CACxC,MAAQ,CAGN,MAAO,EACT,CACA,GAAG,EAEUF,EAAQ,CACnB,iBAAkB,yBAClB,kBAAmB,cACnB,uBAAwB,gBACxB,eAAgB,OAChB,WAAY,KACZ,kBAAmB,KACnB,gBAAiB,KACjB,mBAAoB,SACpB,aAAc,OACd,kBAAmB,MACnB,cAAe,MACf,gBAAiB,UACjB,oBAAqB,OACrB,UAAW,WACX,gBAAiB,oBACjB,gBAAiB,WACjB,wBAAyB,iCACzB,yBAA0B,mBAC1B,mBAAoB,0BACpB,WAAY,iBACZ,gBAAiB,eACjB,iBAAkB,YAClB,QAAS,SACT,aAAc,WACd,eAAgB,OAChB,gBAAiB,aACjB,kBAAmB,YACnB,gBAAiB,YACjB,iBAAkB,aAClB,eAAgB,YAChB,UAAW,QACX,QAAS,UACT,kBAAmB,iCACnB,gBAAiB,mCACjB,kBAAmB,KACnB,gBAAiB,KACjB,kBAAmB,gCACnB,oBAAqB,gBACrB,0BAA2B,0CAC3B,qCAAsC,sFACtC,WAAY,UACZ,cAAe,WACf,mBAAoB,oDACpB,sBAAuB,qDACvB,MAAO,eACP,cAAe,OACf,SAAU,MACV,UAAW,MACX,UAAW,QACX,eAAgB,WAChB,UAAW,SACX,cAAe,OACf,cAAe,MACf,cAAgBG,GAAiB,IAAI,OAAO,WAAWA,CAAI,8BAA+B,EAC1F,gBAAiBhB,GAAmBG,GAAmB,IAAI,OAAO,QAAQA,CAAM,oDAAqD,CAAC,EACtI,QAASH,GAAmBG,GAAmB,IAAI,OAAO,QAAQA,CAAM,6DAAgE,CAAC,EACzI,iBAAkBH,GAAmBG,GAAmB,IAAI,OAAO,QAAQA,CAAM,iBAAiB,CAAC,EACnG,kBAAmBH,GAAmBG,GAAmB,IAAI,OAAO,QAAQA,CAAM,IAAI,CAAC,EAGvF,eAAgBH,GAAmBG,GAAmB,IAAI,OAAO,QAAQA,CAAM,aAAac,EAAI,kGAAmG,GAAG,CAAC,EACvM,qBAAsBjB,GAAmBG,GAAmB,IAAI,OAAO,QAAQA,CAAM,IAAI,CAAC,CAC5F,EAMMe,GAAU,uBACVC,GAAY,wDACZC,GAAS,8GACTC,GAAK,qEACLC,GAAU,uCACVC,GAAS,8BACTC,GAAe,0JACfC,GAAWnB,EAAKkB,EAAY,EAC/B,QAAQ,QAASD,EAAM,EACvB,QAAQ,aAAc,mBAAmB,EACzC,QAAQ,UAAW,uBAAuB,EAC1C,QAAQ,cAAe,SAAS,EAChC,QAAQ,WAAY,sBAAsB,EAC1C,QAAQ,MAAO,qEAAqE,EACpF,QAAQ,QAAS,mBAAmB,EACpC,QAAQ,WAAY,EAAE,EACtB,SAAS,EACNG,GAAcpB,EAAKkB,EAAY,EAClC,QAAQ,QAASD,EAAM,EACvB,QAAQ,aAAc,mBAAmB,EACzC,QAAQ,UAAW,uBAAuB,EAC1C,QAAQ,cAAe,SAAS,EAChC,QAAQ,WAAY,sBAAsB,EAC1C,QAAQ,MAAO,qEAAqE,EACpF,QAAQ,QAAS,mBAAmB,EACpC,QAAQ,SAAU,mCAAmC,EACrD,SAAS,EACNI,GAAa,2FACbC,GAAY,UACZC,GAAc,mCACdC,GAAMxB,EAAK,6GAA6G,EAC3H,QAAQ,QAASuB,EAAW,EAC5B,QAAQ,QAAS,8DAA8D,EAC/E,SAAS,EAENE,GAAOzB,EAAK,gCAAgC,EAC/C,QAAQ,QAASiB,EAAM,EACvB,SAAS,EAENN,GAAO,gWAMPe,GAAW,gCACXC,GAAO3B,EACX,2eASK,GAAG,EACP,QAAQ,UAAW0B,EAAQ,EAC3B,QAAQ,MAAOf,EAAI,EACnB,QAAQ,YAAa,0EAA0E,EAC/F,SAAS,EAENiB,GAAmBC,GAA0B7B,EAAKqB,EAAU,EAC/D,QAAQ,KAAMN,EAAE,EAChB,QAAQ,UAAW,uBAAuB,EAC1C,QAAQ,YAAa,EAAE,EACvB,QAAQ,SAAU,EAAE,EACpB,QAAQ,aAAc,SAAS,EAC/B,QAAQ,SAAU,0DAA0D,EAC5E,QAAQ,OAAQc,CAAa,EAC7B,QAAQ,OAAQ,qHAAqH,EACrI,QAAQ,MAAOlB,EAAI,EACnB,SAAS,EAGNmB,GAAYF,GAAgB,qCAAqC,EAIjEG,GAAsBH,GAAgB,2CAA2C,EAEjFI,GAAahC,EAAK,yCAAyC,EAC9D,QAAQ,YAAa+B,EAAmB,EACxC,SAAS,EAMNE,GAAc,CAClB,WAAAD,GACA,KAAMnB,GACN,IAAAW,GACA,OAAAV,GACA,QAAAE,GACA,GAAAD,GACA,KAAAY,GACA,SAAAR,GACA,KAAAM,GACA,QAAAb,GACA,UAAAkB,GACA,MAAOrC,GACP,KAAM6B,EACR,EAQMY,GAAWlC,EACf,6JAEsF,EACrF,QAAQ,KAAMe,EAAE,EAChB,QAAQ,UAAW,uBAAuB,EAC1C,QAAQ,aAAc,SAAS,EAC/B,QAAQ,OAAQ,wBAAyB,EACzC,QAAQ,SAAU,0DAA0D,EAC5E,QAAQ,OAAQ,6BAA6B,EAC7C,QAAQ,OAAQ,qHAAqH,EACrI,QAAQ,MAAOJ,EAAI,EACnB,SAAS,EAENwB,GAAsC,CAC1C,GAAGF,GACH,SAAUb,GACV,MAAOc,GACP,UAAWlC,EAAKqB,EAAU,EACvB,QAAQ,KAAMN,EAAE,EAChB,QAAQ,UAAW,uBAAuB,EAC1C,QAAQ,YAAa,EAAE,EACvB,QAAQ,QAASmB,EAAQ,EACzB,QAAQ,aAAc,SAAS,EAC/B,QAAQ,SAAU,0DAA0D,EAC5E,QAAQ,OAAQ,wCAAwC,EACxD,QAAQ,OAAQ,qHAAqH,EACrI,QAAQ,MAAOvB,EAAI,EACnB,SAAS,CACd,EAMMyB,GAA2C,CAC/C,GAAGH,GACH,KAAMjC,EACJ,wIAEwE,EACvE,QAAQ,UAAW0B,EAAQ,EAC3B,QAAQ,OAAQ,mKAGkB,EAClC,SAAS,EACZ,IAAK,oEACL,QAAS,yBACT,OAAQjC,GACR,SAAU,mCACV,UAAWO,EAAKqB,EAAU,EACvB,QAAQ,KAAMN,EAAE,EAChB,QAAQ,UAAW;EAAiB,EACpC,QAAQ,WAAYI,EAAQ,EAC5B,QAAQ,SAAU,EAAE,EACpB,QAAQ,aAAc,SAAS,EAC/B,QAAQ,UAAW,EAAE,EACrB,QAAQ,QAAS,EAAE,EACnB,QAAQ,QAAS,EAAE,EACnB,QAAQ,OAAQ,EAAE,EAClB,SAAS,CACd,EAMMkB,GAAS,8CACTC,GAAa,sCACbC,GAAK,8BACLC,GAAa,8EAGbC,GAAe,gBACfC,GAAsB,kBACtBC,GAAyB,mBACzBC,GAAc5C,EAAK,wBAAyB,GAAG,EAClD,QAAQ,cAAe0C,EAAmB,EAAE,SAAS,EAMlDG,GAAa,oBAGbC,GAA0B,qBAC1BC,GAAiC,uBACjCC,GAAoC,yBAGpCC,GAAYjD,EAAK,yBAA0B,GAAG,EACjD,QAAQ,OAAQ,mGAAmG,EACnH,QAAQ,WAAYQ,GAAqB,WAAa,WAAW,EACjE,QAAQ,OAAQ,yBAAyB,EACzC,QAAQ,OAAQ,gBAAgB,EAChC,SAAS,EAEN0C,GAAqB,oEAErBC,GAAiBnD,EAAKkD,GAAoB,GAAG,EAChD,QAAQ,SAAUT,EAAY,EAC9B,SAAS,EAENW,GAAoBpD,EAAKkD,GAAoB,GAAG,EACnD,QAAQ,SAAUJ,EAAuB,EACzC,SAAS,EAGNO,GAA6B,8FAE7BC,GAAyBtD,EAAKqD,GAA4B,GAAG,EAChE,QAAQ,aAAcR,EAAU,EAChC,QAAQ,SAAUJ,EAAY,EAC9B,SAAS,EAENc,GACJ,wQASIC,GAAoBxD,EAAKuD,GAAuB,IAAI,EACvD,QAAQ,iBAAkBZ,EAAsB,EAChD,QAAQ,cAAeD,EAAmB,EAC1C,QAAQ,SAAUD,EAAY,EAC9B,SAAS,EAENgB,GAAuBzD,EAAKuD,GAAuB,IAAI,EAC1D,QAAQ,iBAAkBP,EAAiC,EAC3D,QAAQ,cAAeD,EAA8B,EACrD,QAAQ,SAAUD,EAAuB,EACzC,SAAS,EAGNY,GACJ,2RASIC,GAA4B3D,EAAK0D,GAA+B,IAAI,EACvE,QAAQ,iBAAkBf,EAAsB,EAChD,QAAQ,cAAeD,EAAmB,EAC1C,QAAQ,SAAUD,EAAY,EAC9B,SAAS,EAGNmB,GAAoB5D,EACxB,mNAMiC,IAAI,EACpC,QAAQ,iBAAkB2C,EAAsB,EAChD,QAAQ,cAAeD,EAAmB,EAC1C,QAAQ,SAAUD,EAAY,EAC9B,SAAS,EAGNoB,GACJ,qQASIC,GAA4B9D,EAAK6D,GAA+B,IAAI,EACvE,QAAQ,iBAAkBlB,EAAsB,EAChD,QAAQ,cAAeD,EAAmB,EAC1C,QAAQ,SAAUD,EAAY,EAC9B,SAAS,EAGNsB,GAAY/D,EAAK,8BAA+B,GAAG,EACtD,QAAQ,SAAUyC,EAAY,EAC9B,SAAS,EAGNuB,GACJ,qNAQIC,GAAYjE,EAAKgE,GAAe,IAAI,EACvC,QAAQ,iBAAkBrB,EAAsB,EAChD,QAAQ,cAAeD,EAAmB,EAC1C,QAAQ,SAAUD,EAAY,EAC9B,SAAS,EAENyB,GAAiBlE,EAAK,YAAa,IAAI,EAC1C,QAAQ,SAAUyC,EAAY,EAC9B,SAAS,EAMN0B,GAA4BnE,EAAK,oDAAqD,IAAI,EAC7F,QAAQ,SAAUyC,EAAY,EAC9B,SAAS,EAEN2B,GAAWpE,EAAK,qCAAqC,EACxD,QAAQ,SAAU,8BAA8B,EAChD,QAAQ,QAAS,8IAA8I,EAC/J,SAAS,EAENqE,GAAiBrE,EAAK0B,EAAQ,EAAE,QAAQ,YAAa,KAAK,EAAE,SAAS,EACrE4C,GAAMtE,EACV,qKAKsC,EACrC,QAAQ,UAAWqE,EAAc,EACjC,QAAQ,YAAa,6EAA6E,EAClG,SAAS,EAGNE,GAAuB,8BAIvBC,GAAexE,EAAK,+FAA+F,EACtH,QAAQ,WAAYuE,EAAoB,EACxC,SAAS,EAENE,GAAOzE,EAAK,sFAAsF,EACrG,QAAQ,QAASwE,EAAY,EAC7B,QAAQ,OAAQ,gDAAgD,EAChE,QAAQ,QAAS,6DAA6D,EAC9E,SAAS,EAENE,GAAU1E,EAAK,yBAAyB,EAC3C,QAAQ,QAASwE,EAAY,EAC7B,QAAQ,MAAOjD,EAAW,EAC1B,SAAS,EAENoD,GAAS3E,EAAK,uBAAuB,EACxC,QAAQ,MAAOuB,EAAW,EAC1B,SAAS,EAeNqD,GAAqB,yCACrBC,GAAsB7E,EAAK,qHAAqH,EACnJ,QAAQ,WAAYuE,EAAoB,EACxC,SAAS,EAENO,GAAgB9E,EAAK,wBAAyB,GAAG,EACpD,QAAQ,UAAWA,EAAK,yBAAyB,EAC/C,QAAQ,QAAS6E,EAAmB,EACpC,QAAQ,MAAOD,EAAkB,EACjC,SAAS,CAAC,EACZ,QAAQ,SAAU5E,EAAK,uBAAuB,EAC5C,QAAQ,MAAO4E,EAAkB,EACjC,SAAS,CAAC,EACZ,SAAS,EAENG,GAA2B,qCAC3BC,GAAiB,2EACjBC,GAAyBjF,EAAK,kDAAkD,EACnF,QAAQ,SAAUgF,EAAc,EAChC,SAAS,EAMNE,GAAe,CACnB,WAAYzF,GACZ,eAAAyE,GACA,0BAAAC,GACA,SAAAC,GACA,UAAAnB,GACA,GAAAV,GACA,KAAMD,GACN,IAAK7C,GACL,UAAWA,GACX,UAAWA,GACX,eAAA0D,GACA,kBAAAK,GACA,kBAAAI,GACA,OAAAvB,GACA,KAAAoC,GACA,OAAAE,GACA,YAAA/B,GACA,QAAA8B,GACA,cAAAI,GACA,IAAAR,GACA,KAAM9B,GACN,IAAK/C,EACP,EAQM0F,GAA6C,CACjD,GAAGD,GACH,eAAgB5B,GAChB,kBAAmBK,GACnB,kBAAmBG,GACnB,KAAM9D,EAAK,yBAAyB,EACjC,QAAQ,QAASwE,EAAY,EAC7B,SAAS,EACZ,QAASxE,EAAK,+BAA+B,EAC1C,QAAQ,QAASwE,EAAY,EAC7B,SAAS,CACd,EAMMY,GAAwC,CAC5C,GAAGF,GACH,kBAAmBzB,GACnB,eAAgBL,GAChB,UAAAW,GACA,UAAAE,GACA,IAAKjE,EAAK,+EAA+E,EACtF,QAAQ,gBAAiBiF,EAAsB,EAC/C,QAAQ,WAAYF,EAAwB,EAC5C,QAAQ,QAAS,4EAA4E,EAC7F,SAAS,EACZ,WAAY,6EACZ,IAAK,0EACL,KAAM/E,EAAK,8RAA8R,EACtS,QAAQ,WAAY+E,EAAwB,EAC5C,QAAQ,iBAAkB,kBAAkB,EAC5C,SAAS,CACd,EAMMM,GAA2C,CAC/C,GAAGD,GACH,GAAIpF,EAAKuC,EAAE,EAAE,QAAQ,OAAQ,GAAG,EAAE,SAAS,EAC3C,KAAMvC,EAAKoF,GAAU,IAAI,EACtB,QAAQ,OAAQ,eAAe,EAC/B,QAAQ,UAAW,GAAG,EACtB,SAAS,CACd,EAMaE,GAAQ,CACnB,OAAQrD,GACR,IAAKE,GACL,SAAUC,EACZ,EAEamD,GAAS,CACpB,OAAQL,GACR,IAAKE,GACL,OAAQC,GACR,SAAUF,EACZ,ECnmBMK,GAAkD,CACtD,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,OACP,EACMC,GAAwBC,GAAeF,GAAmBE,CAAE,EAE3D,SAASC,EAAmBhE,EAAciE,EAAkB,CACjE,GAAIA,GACF,GAAIrF,EAAM,WAAW,KAAKoB,CAAI,EAC5B,OAAOA,EAAK,QAAQpB,EAAM,cAAekF,EAAoB,UAG3DlF,EAAM,mBAAmB,KAAKoB,CAAI,EACpC,OAAOA,EAAK,QAAQpB,EAAM,sBAAuBkF,EAAoB,EAIzE,OAAO9D,CACT,CAOO,SAASkE,GAAiCC,EAAc,CAC7D,OAAKvF,EAAM,0BAA0B,KAAKuF,CAAI,EAKvCA,EAAK,QAAQvF,EAAM,qCAAsC,CAACwF,EAAaC,EAAcC,IAAiB,CAC3G,GAAID,IAAQ,QAAaC,IAAQ,OAC/B,MAAO,QAET,IAAMC,EAAOF,IAAQ,OAAY,OAAO,SAASC,EAAM,EAAE,EAAI,OAAO,SAASD,EAAK,EAAE,EACpF,OAAIE,IAAS,GAAKA,EAAO,SAAaA,GAAQ,OAAUA,GAAQ,MACvD,IAEFA,IAAS,GAAK,QAAU,OAAO,cAAcA,CAAI,CAC1D,CAAC,EAbQJ,CAcX,CAEO,SAASK,GAASC,EAAc,CACrC,GAAI,CACFA,EAAO,UAAUA,CAAI,EAAE,QAAQ7F,EAAM,cAAe,GAAG,CACzD,MAAQ,CACN,OAAO,IACT,CACA,OAAO6F,CACT,CAEO,SAASC,GAAWC,EAAkBC,EAAgB,CAG3D,IAAMC,EAAMF,EAAS,QAAQ/F,EAAM,SAAU,CAACkG,EAAOC,EAAQC,IAAQ,CACjE,IAAIC,EAAU,GACVC,EAAOH,EACX,KAAO,EAAEG,GAAQ,GAAKF,EAAIE,CAAI,IAAM,MAAMD,EAAU,CAACA,EACrD,OAAIA,EAGK,IAGA,IAEX,CAAC,EACDE,EAAQN,EAAI,MAAMjG,EAAM,SAAS,EAC/BwG,EAAI,EAUR,GAPKD,EAAM,CAAC,EAAE,KAAK,GACjBA,EAAM,MAAM,EAEVA,EAAM,OAAS,GAAK,CAACA,EAAM,GAAG,EAAE,GAAG,KAAK,GAC1CA,EAAM,IAAI,EAGRP,EACF,GAAIO,EAAM,OAASP,EACjBO,EAAM,OAAOP,CAAK,MAElB,MAAOO,EAAM,OAASP,GAAOO,EAAM,KAAK,EAAE,EAI9C,KAAOC,EAAID,EAAM,OAAQC,IAEvBD,EAAMC,CAAC,EAAID,EAAMC,CAAC,EAAE,KAAK,EAAE,QAAQxG,EAAM,UAAW,GAAG,EAEzD,OAAOuG,CACT,CAUO,SAASE,GAAML,EAAaM,EAAWC,EAAkB,CAC9D,IAAMC,EAAIR,EAAI,OACd,GAAIQ,IAAM,EACR,MAAO,GAIT,IAAIC,EAAU,EAGd,KAAOA,EAAUD,GAAG,CAClB,IAAME,EAAWV,EAAI,OAAOQ,EAAIC,EAAU,CAAC,EAC3C,GAAIC,IAAaJ,GAAK,CAACC,EACrBE,YACSC,IAAaJ,GAAKC,EAC3BE,QAEA,MAEJ,CAEA,OAAOT,EAAI,MAAM,EAAGQ,EAAIC,CAAO,CACjC,CAEO,SAASE,GAAuBX,EAAa,CAClD,IAAMY,EAAQZ,EAAI,MAAM;CAAI,EACxBa,EAAMD,EAAM,OAAS,EACzB,KAAOC,GAAO,GAAKjH,EAAM,UAAU,KAAKgH,EAAMC,CAAG,CAAC,GAChDA,IAEF,OAAID,EAAM,OAASC,GAAO,EAEjBb,EAGFY,EAAM,MAAM,EAAGC,EAAM,CAAC,EAAE,KAAK;CAAI,CAC1C,CASO,SAASC,GAAeC,EAAe,CAI5C,OAAOA,EAAM,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,CAC9D,CAEO,SAASC,GAAmBhB,EAAaiB,EAAW,CAEzD,GAAIjB,EAAI,QAAQiB,EAAE,CAAC,CAAC,IAAM,IAAMjB,EAAI,QAAQiB,EAAE,CAAC,CAAC,IAAM,GACpD,MAAO,GAGT,IAAIC,EAAQ,EACZ,QAASd,EAAI,EAAGA,EAAIJ,EAAI,OAAQI,IAC9B,GAAIJ,EAAII,CAAC,IAAM,KACbA,YACSJ,EAAII,CAAC,IAAMa,EAAE,CAAC,EACvBC,YACSlB,EAAII,CAAC,IAAMa,EAAE,CAAC,IACvBC,IACIA,EAAQ,GACV,OAAOd,EAIb,OAAIc,EAAQ,EACH,GAGF,EACT,CAEO,SAASC,GAAWC,EAAclI,EAAS,EAAG,CACnD,IAAImI,EAAMnI,EACNoI,EAAW,GACf,QAAWC,KAAQH,EACjB,GAAIG,IAAS,IAAM,CACjB,IAAMC,EAAQ,EAAKH,EAAM,EACzBC,GAAY,IAAI,OAAOE,CAAK,EAC5BH,GAAOG,CACT,MACEF,GAAYC,EACZF,IAIJ,OAAOC,CACT,CC5LA,SAASG,GAAWC,EAAe5D,EAA2C6D,EAAaC,EAAeC,EAAsD,CAC9J,IAAMpC,EAAO3B,EAAK,KACZgE,EAAQhE,EAAK,OAAS,KACtBqB,EAAOuC,EAAI,CAAC,EAAE,QAAQG,EAAM,MAAM,kBAAmB,IAAI,EACzDE,EAAUL,EAAI,CAAC,EAAE,OAAO,CAAC,IAAM,IAE/BM,EAAcJ,EAAM,MAAM,OAC1BK,EAAmBL,EAAM,MAAM,YAC/BM,EAAkBN,EAAM,MAAM,WACpCA,EAAM,MAAM,OAAS,GACrBA,EAAM,MAAM,YAAc,GAC1B,IAAMO,EAASP,EAAM,aAAazC,CAAI,EAChCiD,EAAcR,EAAM,MAAM,YAIhC,GAHAA,EAAM,MAAM,YAAcK,EAC1BL,EAAM,MAAM,OAASI,EAEjB,CAACD,EAAS,CAIZ,GAAIK,EAAa,CAGfR,EAAM,MAAM,WAAaM,EACzB,MACF,CACAN,EAAM,MAAM,YAAc,EAC5B,CAEA,MAAO,CACL,KAAMG,EAAU,QAAU,OAC1B,IAAAJ,EACA,KAAAlC,EACA,MAAAqC,EACA,KAAA3C,EACA,OAAAgD,CACF,CACF,CAEA,SAASE,GAAuBV,EAAaxC,EAAc0C,EAAc,CACvE,IAAMS,EAAoBX,EAAI,MAAME,EAAM,MAAM,sBAAsB,EAEtE,GAAIS,IAAsB,KACxB,OAAOnD,EAGT,IAAMoD,EAAeD,EAAkB,CAAC,EAExC,OAAOnD,EACJ,MAAM;CAAI,EACV,IAAIqD,GAAQ,CACX,IAAMC,EAAoBD,EAAK,MAAMX,EAAM,MAAM,cAAc,EAC/D,GAAIY,IAAsB,KACxB,OAAOD,EAGT,GAAM,CAACE,CAAY,EAAID,EAIvB,OAAOD,EAAK,MAAM,KAAK,IAAIE,EAAa,OAAQH,EAAa,MAAM,CAAC,CACtE,CAAC,EACA,KAAK;CAAI,CACd,CAEA,SAASI,GAAsBC,EAAa7B,EAAe8B,EAAoBhB,EAAc,CAC3F,GAAI,CAACd,EAAM,SAAS,GAAG,EACrB,MAAO,GAGT,QAASX,EAAI,EAAGA,EAAIW,EAAM,OAAQX,IAAK,CACrC,GAAIW,EAAMX,CAAC,IAAM,KAAM,CACrBA,IACA,QACF,CAEA,GAAIW,EAAMX,CAAC,IAAM,IAAK,CACpB,IAAMb,EAAOsC,EAAM,OAAO,KAAK,KAAKd,EAAM,MAAMX,CAAC,CAAC,EAClD,GAAIb,EAAM,CACRa,GAAKb,EAAK,CAAC,EAAE,OAAS,EACtB,QACF,CACF,CAEA,GAAIwB,EAAMX,CAAC,IAAM,IACf,SAGF,IAAM0C,EAAWF,EAAI,MAAMC,EAAazC,CAAC,EACnC2C,EAAQlB,EAAM,OAAO,IAAI,KAAKiB,CAAQ,GAAKjB,EAAM,OAAO,SAAS,KAAKiB,CAAQ,EACpF,GAAKC,EAIL,CAAA,GAAIA,EAAM,CAAC,EAAE,OAAShC,EAAM,OAASX,EACnC,MAAO,GAETA,GAAK2C,EAAM,CAAC,EAAE,OAAS,CAAA,CACzB,CACA,MAAO,EACT,CAKO,IAAMC,GAAN,KAAiE,CACtE,QACA,MACA,MAEA,YAAYC,EAAuD,CACjE,KAAK,QAAUA,GAAWtK,EAC5B,CAEA,MAAMiK,EAAuC,CAC3C,IAAMlB,EAAM,KAAK,MAAM,MAAM,QAAQ,KAAKkB,CAAG,EAC7C,GAAIlB,GAAOA,EAAI,CAAC,EAAE,OAAS,EACzB,MAAO,CACL,KAAM,QACN,IAAKA,EAAI,CAAC,CACZ,CAEJ,CAEA,KAAKkB,EAAsC,CACzC,IAAMlB,EAAM,KAAK,MAAM,MAAM,KAAK,KAAKkB,CAAG,EAC1C,GAAIlB,EAAK,CACP,IAAMC,EAAM,KAAK,QAAQ,SACrBD,EAAI,CAAC,EACLf,GAAuBe,EAAI,CAAC,CAAC,EAC3BvC,EAAOwC,EAAI,QAAQ,KAAK,MAAM,MAAM,iBAAkB,EAAE,EAC9D,MAAO,CACL,KAAM,OACN,IAAAA,EACA,eAAgB,WAChB,KAAAxC,CACF,CACF,CACF,CAEA,OAAOyD,EAAsC,CAC3C,IAAMlB,EAAM,KAAK,MAAM,MAAM,OAAO,KAAKkB,CAAG,EAC5C,GAAIlB,EAAK,CACP,IAAMC,EAAMD,EAAI,CAAC,EACXvC,EAAOkD,GAAuBV,EAAKD,EAAI,CAAC,GAAK,GAAI,KAAK,KAAK,EAEjE,MAAO,CACL,KAAM,OACN,IAAAC,EACA,KAAMD,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,KAAK,MAAM,OAAO,eAAgB,IAAI,EAAIA,EAAI,CAAC,EACpF,KAAAvC,CACF,CACF,CACF,CAEA,QAAQyD,EAAyC,CAC/C,IAAMlB,EAAM,KAAK,MAAM,MAAM,QAAQ,KAAKkB,CAAG,EAC7C,GAAIlB,EAAK,CACP,IAAIvC,EAAOuC,EAAI,CAAC,EAAE,KAAK,EAGvB,GAAI,KAAK,MAAM,MAAM,WAAW,KAAKvC,CAAI,EAAG,CAC1C,IAAM+D,EAAU7C,GAAMlB,EAAM,GAAG,GAC3B,KAAK,QAAQ,UAEN,CAAC+D,GAAW,KAAK,MAAM,MAAM,mBAAmB,KAAKA,CAAO,KAErE/D,EAAO+D,EAAQ,KAAK,EAExB,CAEA,MAAO,CACL,KAAM,UACN,IAAK7C,GAAMqB,EAAI,CAAC,EAAG;CAAI,EACvB,MAAOA,EAAI,CAAC,EAAE,OACd,KAAAvC,EACA,OAAQ,KAAK,MAAM,OAAOA,CAAI,CAChC,CACF,CACF,CAEA,GAAGyD,EAAoC,CACrC,IAAMlB,EAAM,KAAK,MAAM,MAAM,GAAG,KAAKkB,CAAG,EACxC,GAAIlB,EACF,MAAO,CACL,KAAM,KACN,IAAKrB,GAAMqB,EAAI,CAAC,EAAG;CAAI,CACzB,CAEJ,CAEA,WAAWkB,EAA4C,CACrD,IAAMlB,EAAM,KAAK,MAAM,MAAM,WAAW,KAAKkB,CAAG,EAChD,GAAIlB,EAAK,CACP,IAAId,EAAQP,GAAMqB,EAAI,CAAC,EAAG;CAAI,EAAE,MAAM;CAAI,EACtCC,EAAM,GACNxC,EAAO,GACLgD,EAAkB,CAAC,EAEzB,KAAOvB,EAAM,OAAS,GAAG,CACvB,IAAIuC,EAAe,GACbC,EAAe,CAAC,EAElBhD,EACJ,IAAKA,EAAI,EAAGA,EAAIQ,EAAM,OAAQR,IAE5B,GAAI,KAAK,MAAM,MAAM,gBAAgB,KAAKQ,EAAMR,CAAC,CAAC,EAChDgD,EAAa,KAAKxC,EAAMR,CAAC,CAAC,EAC1B+C,EAAe,WACN,CAACA,EACVC,EAAa,KAAKxC,EAAMR,CAAC,CAAC,MAE1B,OAGJQ,EAAQA,EAAM,MAAMR,CAAC,EAErB,IAAMiD,EAAaD,EAAa,KAAK;CAAI,EACnCE,EAAcD,EAEjB,QAAQ,KAAK,MAAM,MAAM,wBAAyB;OAAU,EAC5D,QAAQ,KAAK,MAAM,MAAM,yBAA0B,EAAE,EACxD1B,EAAMA,EAAM,GAAGA,CAAG;EAAK0B,CAAU,GAAKA,EACtClE,EAAOA,EAAO,GAAGA,CAAI;EAAKmE,CAAW,GAAKA,EAI1C,IAAMC,EAAM,KAAK,MAAM,MAAM,IAM7B,GALA,KAAK,MAAM,MAAM,IAAM,GACvB,KAAK,MAAM,YAAYD,EAAanB,EAAQ,EAAI,EAChD,KAAK,MAAM,MAAM,IAAMoB,EAGnB3C,EAAM,SAAW,EACnB,MAGF,IAAM4C,EAAYrB,EAAO,GAAG,EAAE,EAE9B,GAAIqB,GAAW,OAAS,QAAUA,GAAW,OAAS,WAAaA,GAAW,OAAS,MAAQA,GAAW,OAAS,OAEjH,MACK,GAAIA,GAAW,OAAS,aAAc,CAE3C,IAAMC,EAAWD,EAKXE,EAAe9C,EAAM,KAAK;CAAI,EAC9B+C,EAAUF,EAAS,IAAM;EAAOC,EAAa,QAAQ,KAAK,MAAM,MAAM,yBAA0B,EAAE,EAClGE,EAAW,KAAK,WAAWD,CAAO,EACxCxB,EAAOA,EAAO,OAAS,CAAC,EAAIyB,EAK5B,IAAMC,EAAWF,EAAQ,UAAUC,EAAS,IAAI,MAAM,EAAE,QAAQ,MAAO,EAAE,EACnEE,EAAgBD,EAAWA,EAAS,MAAM;CAAI,EAAE,OAAS,EACzDE,EAAWD,EAAgBlD,EAAM,MAAM,EAAG,CAACkD,CAAa,EAAIlD,EAC9DmD,EAAS,OAAS,IACpBpC,EAAM,GAAGA,CAAG;EAAKoC,EAAS,KAAK;CAAI,CAAC,IAEtC5E,EAAOA,EAAK,UAAU,EAAGA,EAAK,OAASsE,EAAS,KAAK,MAAM,EAAIG,EAAS,KACxE,KACF,SAAWJ,GAAW,OAAS,OAAQ,CAErC,IAAMC,EAAWD,EACXG,EAAUF,EAAS,IAAM;EAAO7C,EAAM,KAAK;CAAI,EAC/CgD,EAAW,KAAK,KAAKD,CAAO,EAClCxB,EAAOA,EAAO,OAAS,CAAC,EAAIyB,EAE5BjC,EAAMA,EAAI,UAAU,EAAGA,EAAI,OAAS6B,EAAU,IAAI,MAAM,EAAII,EAAS,IACrEzE,EAAOA,EAAK,UAAU,EAAGA,EAAK,OAASsE,EAAS,IAAI,MAAM,EAAIG,EAAS,IACvEhD,EAAQ+C,EAAQ,UAAUxB,EAAO,GAAG,EAAE,EAAG,IAAI,MAAM,EAAE,MAAM;CAAI,EAC/D,QACF,CACF,CAEA,MAAO,CACL,KAAM,aACN,IAAAR,EACA,OAAAQ,EACA,KAAAhD,CACF,CACF,CACF,CAEA,KAAKyD,EAAsC,CACzC,IAAIlB,EAAM,KAAK,MAAM,MAAM,KAAK,KAAKkB,CAAG,EACxC,GAAIlB,EAAK,CAGP,IAAMsC,EAAUpB,EACVqB,EAAQ,IAAMD,EAAQ,OAASpB,EAAI,OACrC7I,EAAO2H,EAAI,CAAC,EAAE,KAAK,EACjBwC,EAAYnK,EAAK,OAAS,EAE1Be,EAAoB,CACxB,KAAM,OACN,IAAK,GACL,QAASoJ,EACT,MAAOA,EAAY,CAACnK,EAAK,MAAM,EAAG,EAAE,EAAI,GACxC,MAAO,GACP,MAAO,CAAC,CACV,EAEAA,EAAOmK,EAAY,aAAanK,EAAK,MAAM,EAAE,CAAC,GAAK,KAAKA,CAAI,GAExD,KAAK,QAAQ,WACfA,EAAOmK,EAAYnK,EAAO,SAI5B,IAAMoK,EAAY,KAAK,MAAM,MAAM,cAAcpK,CAAI,EACjDqK,EAAoB,GAExB,KAAOxB,GAAK,CACV,IAAIyB,EAAW,GACXC,EAAe,GAKnB,GAJI,EAAE5C,EAAMyC,EAAU,KAAKvB,CAAG,IAI1B,KAAK,MAAM,MAAM,GAAG,KAAKA,CAAG,EAC9B,MAGF,IAAM2B,EAAYN,EAAM,EACxBrB,EAAMA,EAAI,UAAUlB,EAAI,CAAC,EAAE,MAAM,EAEjC,IAAM8C,EAAY9C,EAAI,CAAC,EAAE,MAAM;EAAM,CAAC,EAAE,CAAC,EACnC+C,EAAe/C,EAAI,CAAC,EAAE,OACxBN,EAAO,KAAK,QAAQ,SACpBD,GAAWqD,EAAWC,CAAY,EAClCD,EAAU,QAAQ,KAAK,MAAM,MAAM,gBAAiBE,GAAcvD,GAAWuD,EAAYD,CAAY,CAAC,EACtGE,EAAW/B,EAAI,MAAM;EAAM,CAAC,EAAE,CAAC,EAC/BgC,EAAY,CAACxD,EAAK,KAAK,EAEvBlI,EAAS,EAkBb,GAjBI,KAAK,QAAQ,UACfA,EAAS,EACToL,EAAelD,EAAK,UAAU,GACrBwD,EACT1L,EAASuL,EAAe,GAExBvL,EAASkI,EAAK,OAAO,KAAK,MAAM,MAAM,YAAY,EAClDlI,EAASA,EAAS,EAAI,EAAIA,EAC1BoL,EAAelD,EAAK,MAAMlI,CAAM,EAChCA,GAAUuL,GAGRG,GAAa,KAAK,MAAM,MAAM,UAAU,KAAKD,CAAQ,IACvD/B,EAAMA,EAAI,UAAU+B,EAAS,OAAS,CAAC,EACvCN,EAAW,IAGT,CAACA,EAAU,CACb,IAAMQ,EAAkB,KAAK,MAAM,MAAM,gBAAgB3L,CAAM,EACzD4L,EAAU,KAAK,MAAM,MAAM,QAAQ5L,CAAM,EACzC6L,EAAmB,KAAK,MAAM,MAAM,iBAAiB7L,CAAM,EAC3D8L,EAAoB,KAAK,MAAM,MAAM,kBAAkB9L,CAAM,EAC7D+L,EAAiB,KAAK,MAAM,MAAM,eAAe/L,CAAM,EACvDgM,EAAuB,KAAK,MAAM,MAAM,qBAAqBhM,CAAM,EAGzE,KAAO0J,GAAK,CACV,IAAMuC,EAAUvC,EAAI,MAAM;EAAM,CAAC,EAAE,CAAC,EAChCwC,EAqCJ,GApCAT,EAAWQ,EAGP,KAAK,QAAQ,UACfR,EAAWA,EAAS,QAAQ,KAAK,MAAM,MAAM,mBAAoB,IAAI,EACrES,EAAsBT,GAEtBS,EAAsBT,EAAS,QAAQ,KAAK,MAAM,MAAM,gBAAiBD,GAAcvD,GAAWuD,CAAU,CAAC,EAI3GK,EAAiB,KAAKJ,CAAQ,GAK9BK,EAAkB,KAAKL,CAAQ,GAK/BM,EAAe,KAAKN,CAAQ,GAK5BO,EAAqB,KAAKP,CAAQ,GAKlCE,EAAgB,KAAKF,CAAQ,GAK7BG,EAAQ,KAAKH,CAAQ,EACvB,MAGF,GAAIS,EAAoB,OAAO,KAAK,MAAM,MAAM,YAAY,GAAKlM,GAAU,CAACyL,EAAS,KAAK,EACxFL,GAAgB;EAAOc,EAAoB,MAAMlM,CAAM,MAClD,CAgBL,GAdI0L,GAKAxD,EAAK,QAAQ,KAAK,MAAM,MAAM,cAAe,MAAM,EAAE,OAAO,KAAK,MAAM,MAAM,YAAY,GAAK,GAG9F2D,EAAiB,KAAK3D,CAAI,GAG1B4D,EAAkB,KAAK5D,CAAI,GAG3B0D,EAAQ,KAAK1D,CAAI,EACnB,MAGFkD,GAAgB;EAAOK,CACzB,CAEAC,EAAY,CAACD,EAAS,KAAK,EAE3B/B,EAAMA,EAAI,UAAUuC,EAAQ,OAAS,CAAC,EACtC/D,EAAOgE,EAAoB,MAAMlM,CAAM,CACzC,CACF,CAKA,IAAMyI,EAAMqC,EAAQ,MAAMO,EAAWN,EAAM,CAAC,EAEvCnJ,EAAK,QAEJsJ,EACFtJ,EAAK,MAAQ,GACJ,KAAK,MAAM,MAAM,gBAAgB,KAAK6G,CAAG,IAClDyC,EAAoB,KAIxBtJ,EAAK,MAAM,KAAK,CACd,KAAM,YACN,IAAA6G,EACA,KAAM,CAAC,CAAC,KAAK,QAAQ,KAAO,KAAK,MAAM,MAAM,WAAW,KAAK2C,CAAY,EACzE,MAAO,GACP,KAAMA,EACN,OAAQ,CAAC,CACX,CAAC,CACH,CAGA,IAAMe,EAAWvK,EAAK,MAAM,GAAG,EAAE,EACjC,GAAIuK,EACFA,EAAS,IAAMA,EAAS,IAAI,QAAQ,EACpCA,EAAS,KAAOA,EAAS,KAAK,QAAQ,MAGtC,QAEFvK,EAAK,IAAMkJ,EAAQ,MAAM,EAAGC,EAAM,CAAC,EAAE,QAAQ,EAI7C,QAAWqB,KAAQxK,EAAK,MAItB,GAHA,KAAK,MAAM,MAAM,IAAM,GACvBwK,EAAK,OAAS,KAAK,MAAM,YAAYA,EAAK,KAAM,CAAC,CAAC,EAE9C,CAACxK,EAAK,MAAO,CAEf,IAAMyK,EAAUD,EAAK,OAAO,OAAOE,GAAKA,EAAE,OAAS,OAAO,EACpDC,EAAwBF,EAAQ,OAAS,GAAKA,EAAQ,KAAKC,GAAK,KAAK,MAAM,MAAM,QAAQ,KAAKA,EAAE,GAAG,CAAC,EAE1G1K,EAAK,MAAQ2K,CACf,CAIF,QAAWH,KAAQxK,EAAK,MAAO,CAC7B,IAAM4K,EAAYJ,EAAK,OAAO,CAAC,EAC/B,GAAIA,EAAK,OAASI,GAAW,OAAS,QAAUA,GAAW,OAAS,aAAc,CAEhFJ,EAAK,KAAOA,EAAK,KAAK,QAAQ,KAAK,MAAM,MAAM,gBAAiB,EAAE,EAClEI,EAAU,IAAMA,EAAU,IAAI,QAAQ,KAAK,MAAM,MAAM,gBAAiB,EAAE,EAC1EA,EAAU,KAAOA,EAAU,KAAK,QAAQ,KAAK,MAAM,MAAM,gBAAiB,EAAE,EAC5E,QAAStF,EAAI,KAAK,MAAM,YAAY,OAAS,EAAGA,GAAK,EAAGA,IACtD,GAAI,KAAK,MAAM,MAAM,WAAW,KAAK,KAAK,MAAM,YAAYA,CAAC,EAAE,GAAG,EAAG,CACnE,KAAK,MAAM,YAAYA,CAAC,EAAE,IAAM,KAAK,MAAM,YAAYA,CAAC,EAAE,IAAI,QAAQ,KAAK,MAAM,MAAM,gBAAiB,EAAE,EAC1G,KACF,CAGF,IAAMuF,EAAU,KAAK,MAAM,MAAM,iBAAiB,KAAKL,EAAK,GAAG,EAC/D,GAAIK,EAAS,CACX,IAAMC,EAAiC,CACrC,KAAM,WACN,IAAKD,EAAQ,CAAC,EAAI,IAClB,QAASA,EAAQ,CAAC,IAAM,KAC1B,EACAL,EAAK,QAAUM,EAAc,QACzB9K,EAAK,MACHwK,EAAK,OAAO,CAAC,GAAK,CAAC,YAAa,MAAM,EAAE,SAASA,EAAK,OAAO,CAAC,EAAE,IAAI,GAAK,WAAYA,EAAK,OAAO,CAAC,GAAKA,EAAK,OAAO,CAAC,EAAE,QACxHA,EAAK,OAAO,CAAC,EAAE,IAAMM,EAAc,IAAMN,EAAK,OAAO,CAAC,EAAE,IACxDA,EAAK,OAAO,CAAC,EAAE,KAAOM,EAAc,IAAMN,EAAK,OAAO,CAAC,EAAE,KACzDA,EAAK,OAAO,CAAC,EAAE,OAAO,QAAQM,CAAa,GAE3CN,EAAK,OAAO,QAAQ,CAClB,KAAM,YACN,IAAKM,EAAc,IACnB,KAAMA,EAAc,IACpB,OAAQ,CAACA,CAAa,CACxB,CAAC,EAGHN,EAAK,OAAO,QAAQM,CAAa,CAErC,CACF,MAAWN,EAAK,OACdA,EAAK,KAAO,GAEhB,CAGA,GAAIxK,EAAK,MACP,QAAWwK,KAAQxK,EAAK,MAAO,CAC7BwK,EAAK,MAAQ,GACb,QAAWvC,KAASuC,EAAK,OACnBvC,EAAM,OAAS,SACjBA,EAAM,KAAO,YAGnB,CAGF,OAAOjI,CACT,CACF,CAEA,KAAK8H,EAAsC,CACzC,IAAMlB,EAAM,KAAK,MAAM,MAAM,KAAK,KAAKkB,CAAG,EAC1C,GAAIlB,EAAK,CACP,IAAMC,EAAMhB,GAAuBe,EAAI,CAAC,CAAC,EAQzC,MAP2B,CACzB,KAAM,OACN,MAAO,GACP,IAAAC,EACA,IAAKD,EAAI,CAAC,IAAM,OAASA,EAAI,CAAC,IAAM,UAAYA,EAAI,CAAC,IAAM,QAC3D,KAAMC,CACR,CAEF,CACF,CAEA,IAAIiB,EAAqC,CACvC,IAAMlB,EAAM,KAAK,MAAM,MAAM,IAAI,KAAKkB,CAAG,EACzC,GAAIlB,EAAK,CAEP,GAAI,CAAC,KAAK,MAAM,MAAM,kBAAkB,KAAKA,EAAI,CAAC,CAAC,GAAKV,GAAmBU,EAAI,CAAC,EAAG,IAAI,IAAM,GAC3F,OAGF,IAAM/D,EAAMmD,GAAeY,EAAI,CAAC,CAAC,EAAE,QAAQ,KAAK,MAAM,MAAM,oBAAqB,GAAG,EAC9EjC,EAAOiC,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAE,QAAQ,KAAK,MAAM,MAAM,aAAc,IAAI,EAAE,QAAQ,KAAK,MAAM,OAAO,eAAgB,IAAI,EAAI,GACtHI,EAAQJ,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAE,UAAU,EAAGA,EAAI,CAAC,EAAE,OAAS,CAAC,EAAE,QAAQ,KAAK,MAAM,OAAO,eAAgB,IAAI,EAAIA,EAAI,CAAC,EACrH,MAAO,CACL,KAAM,MACN,IAAA/D,EACA,IAAK0C,GAAMqB,EAAI,CAAC,EAAG;CAAI,EACvB,KAAAjC,EACA,MAAAqC,CACF,CACF,CACF,CAEA,MAAMc,EAAuC,CAC3C,IAAMlB,EAAM,KAAK,MAAM,MAAM,MAAM,KAAKkB,CAAG,EAK3C,GAJI,CAAClB,GAID,CAAC,KAAK,MAAM,MAAM,eAAe,KAAKA,EAAI,CAAC,CAAC,EAE9C,OAGF,IAAMmE,EAAUnG,GAAWgC,EAAI,CAAC,CAAC,EAC3BoE,EAASpE,EAAI,CAAC,EAAE,QAAQ,KAAK,MAAM,MAAM,gBAAiB,EAAE,EAAE,MAAM,GAAG,EACvEqE,EAAOrE,EAAI,CAAC,GAAG,KAAK,EAAIA,EAAI,CAAC,EAAE,QAAQ,KAAK,MAAM,MAAM,kBAAmB,EAAE,EAAE,MAAM;CAAI,EAAI,CAAC,EAE9F4D,EAAqB,CACzB,KAAM,QACN,IAAKjF,GAAMqB,EAAI,CAAC,EAAG;CAAI,EACvB,OAAQ,CAAC,EACT,MAAO,CAAC,EACR,KAAM,CAAC,CACT,EAEA,GAAImE,EAAQ,SAAWC,EAAO,OAK9B,CAAA,QAAWE,KAASF,EACd,KAAK,MAAM,MAAM,gBAAgB,KAAKE,CAAK,EAC7CV,EAAK,MAAM,KAAK,OAAO,EACd,KAAK,MAAM,MAAM,iBAAiB,KAAKU,CAAK,EACrDV,EAAK,MAAM,KAAK,QAAQ,EACf,KAAK,MAAM,MAAM,eAAe,KAAKU,CAAK,EACnDV,EAAK,MAAM,KAAK,MAAM,EAEtBA,EAAK,MAAM,KAAK,IAAI,EAIxB,QAASlF,EAAI,EAAGA,EAAIyF,EAAQ,OAAQzF,IAClCkF,EAAK,OAAO,KAAK,CACf,KAAMO,EAAQzF,CAAC,EACf,OAAQ,KAAK,MAAM,OAAOyF,EAAQzF,CAAC,CAAC,EACpC,OAAQ,GACR,MAAOkF,EAAK,MAAMlF,CAAC,CACrB,CAAC,EAGH,QAAWP,KAAOkG,EAChBT,EAAK,KAAK,KAAK5F,GAAWG,EAAKyF,EAAK,OAAO,MAAM,EAAE,IAAI,CAACW,EAAM7F,KACrD,CACL,KAAM6F,EACN,OAAQ,KAAK,MAAM,OAAOA,CAAI,EAC9B,OAAQ,GACR,MAAOX,EAAK,MAAMlF,CAAC,CACrB,EACD,CAAC,EAGJ,OAAOkF,CAAAA,CACT,CAEA,SAAS1C,EAAyC,CAChD,IAAMlB,EAAM,KAAK,MAAM,MAAM,SAAS,KAAKkB,CAAG,EAC9C,GAAIlB,EAAK,CACP,IAAMvC,EAAOuC,EAAI,CAAC,EAAE,KAAK,EACzB,MAAO,CACL,KAAM,UACN,IAAKrB,GAAMqB,EAAI,CAAC,EAAG;CAAI,EACvB,MAAOA,EAAI,CAAC,EAAE,OAAO,CAAC,IAAM,IAAM,EAAI,EACtC,KAAAvC,EACA,OAAQ,KAAK,MAAM,OAAOA,CAAI,CAChC,CACF,CACF,CAEA,UAAUyD,EAA2C,CACnD,IAAMlB,EAAM,KAAK,MAAM,MAAM,UAAU,KAAKkB,CAAG,EAC/C,GAAIlB,EAAK,CACP,IAAMvC,EAAOuC,EAAI,CAAC,EAAE,OAAOA,EAAI,CAAC,EAAE,OAAS,CAAC,IAAM;EAC9CA,EAAI,CAAC,EAAE,MAAM,EAAG,EAAE,EAClBA,EAAI,CAAC,EACT,MAAO,CACL,KAAM,YACN,IAAKA,EAAI,CAAC,EACV,KAAAvC,EACA,OAAQ,KAAK,MAAM,OAAOA,CAAI,CAChC,CACF,CACF,CAEA,KAAKyD,EAAsC,CACzC,IAAMlB,EAAM,KAAK,MAAM,MAAM,KAAK,KAAKkB,CAAG,EAC1C,GAAIlB,EACF,MAAO,CACL,KAAM,OACN,IAAKA,EAAI,CAAC,EACV,KAAMA,EAAI,CAAC,EACX,OAAQ,KAAK,MAAM,OAAOA,EAAI,CAAC,CAAC,CAClC,CAEJ,CAEA,OAAOkB,EAAwC,CAC7C,IAAMlB,EAAM,KAAK,MAAM,OAAO,OAAO,KAAKkB,CAAG,EAC7C,GAAIlB,EACF,MAAO,CACL,KAAM,SACN,IAAKA,EAAI,CAAC,EACV,KAAMA,EAAI,CAAC,CACb,CAEJ,CAEA,IAAIkB,EAAqC,CACvC,IAAMlB,EAAM,KAAK,MAAM,OAAO,IAAI,KAAKkB,CAAG,EAC1C,GAAIlB,EACF,MAAI,CAAC,KAAK,MAAM,MAAM,QAAU,KAAK,MAAM,MAAM,UAAU,KAAKA,EAAI,CAAC,CAAC,EACpE,KAAK,MAAM,MAAM,OAAS,GACjB,KAAK,MAAM,MAAM,QAAU,KAAK,MAAM,MAAM,QAAQ,KAAKA,EAAI,CAAC,CAAC,IACxE,KAAK,MAAM,MAAM,OAAS,IAExB,CAAC,KAAK,MAAM,MAAM,YAAc,KAAK,MAAM,MAAM,kBAAkB,KAAKA,EAAI,CAAC,CAAC,EAChF,KAAK,MAAM,MAAM,WAAa,GACrB,KAAK,MAAM,MAAM,YAAc,KAAK,MAAM,MAAM,gBAAgB,KAAKA,EAAI,CAAC,CAAC,IACpF,KAAK,MAAM,MAAM,WAAa,IAGzB,CACL,KAAM,OACN,IAAKA,EAAI,CAAC,EACV,OAAQ,KAAK,MAAM,MAAM,OACzB,WAAY,KAAK,MAAM,MAAM,WAC7B,MAAO,GACP,KAAMA,EAAI,CAAC,CACb,CAEJ,CAEA,KAAKkB,EAAqD,CAOxD,GAAI,KAAK,MAAM,MAAM,oBAAsB,GACzC,OAEF,IAAMlB,EAAM,KAAK,MAAM,OAAO,KAAK,KAAKkB,CAAG,EAC3C,GAAIlB,EAAK,CACP,IAAMmB,EAAanB,EAAI,CAAC,EAAE,OAAO,CAAC,IAAM,IAAM,EAAI,EAClD,GAAI,CAAC,KAAK,QAAQ,UAAYiB,GAAsBC,EAAKlB,EAAI,CAAC,EAAGmB,EAAY,KAAK,KAAK,EACrF,OAGF,IAAMqD,EAAaxE,EAAI,CAAC,EAAE,KAAK,EAC/B,GAAI,CAAC,KAAK,QAAQ,UAAY,KAAK,MAAM,MAAM,kBAAkB,KAAKwE,CAAU,EAAG,CAEjF,GAAI,CAAE,KAAK,MAAM,MAAM,gBAAgB,KAAKA,CAAU,EACpD,OAIF,IAAMC,EAAa9F,GAAM6F,EAAW,MAAM,EAAG,EAAE,EAAG,IAAI,EACtD,IAAKA,EAAW,OAASC,EAAW,QAAU,IAAM,EAClD,MAEJ,KAAO,CAEL,IAAMC,EAAiBpF,GAAmBU,EAAI,CAAC,EAAG,IAAI,EACtD,GAAI0E,IAAmB,GAErB,OAGF,GAAIA,EAAiB,GAAI,CAEvB,IAAMC,GADQ3E,EAAI,CAAC,EAAE,QAAQ,GAAG,IAAM,EAAI,EAAI,GACtBA,EAAI,CAAC,EAAE,OAAS0E,EACxC1E,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAE,UAAU,EAAG0E,CAAc,EAC3C1E,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAE,UAAU,EAAG2E,CAAO,EAAE,KAAK,EAC3C3E,EAAI,CAAC,EAAI,EACX,CACF,CACA,IAAIjC,EAAOiC,EAAI,CAAC,EACZI,EAAQ,GACZ,GAAI,KAAK,QAAQ,SAAU,CAEzB,IAAMhE,EAAO,KAAK,MAAM,MAAM,kBAAkB,KAAK2B,CAAI,EAErD3B,IACF2B,EAAO3B,EAAK,CAAC,EACbgE,EAAQhE,EAAK,CAAC,EAElB,MACEgE,EAAQJ,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAE,MAAM,EAAG,EAAE,EAAI,GAGzC,OAAAjC,EAAOA,EAAK,KAAK,EACb,KAAK,MAAM,MAAM,kBAAkB,KAAKA,CAAI,IAC1C,KAAK,QAAQ,UAAY,CAAE,KAAK,MAAM,MAAM,gBAAgB,KAAKyG,CAAU,EAE7EzG,EAAOA,EAAK,MAAM,CAAC,EAEnBA,EAAOA,EAAK,MAAM,EAAG,EAAE,GAGpBgC,GAAWC,EAAK,CACrB,KAAMjC,GAAOA,EAAK,QAAQ,KAAK,MAAM,OAAO,eAAgB,IAAI,EAChE,MAAOqC,GAAQA,EAAM,QAAQ,KAAK,MAAM,OAAO,eAAgB,IAAI,CACrE,EAAGJ,EAAI,CAAC,EAAG,KAAK,MAAO,KAAK,KAAK,CACnC,CACF,CAEA,QAAQkB,EAAa0D,EAAoE,CACvF,IAAI5E,EACJ,IAAKA,EAAM,KAAK,MAAM,OAAO,QAAQ,KAAKkB,CAAG,KACvClB,EAAM,KAAK,MAAM,OAAO,OAAO,KAAKkB,CAAG,GAAI,CAC/C,IAAMC,EAAanB,EAAI,CAAC,EAAE,OAAO,CAAC,IAAM,IAAM,EAAI,EAClD,GAAI,CAAC,KAAK,QAAQ,UAAYiB,GAAsBC,EAAKlB,EAAI,CAAC,EAAGmB,EAAY,KAAK,KAAK,EACrF,OAGF,IAAM0D,GAAc7E,EAAI,CAAC,GAAKA,EAAI,CAAC,GAAG,QAAQ,KAAK,MAAM,MAAM,oBAAqB,GAAG,EACjF5D,EAAOwI,EAAMxF,GAAeyF,CAAU,CAAC,EAC7C,GAAI,CAACzI,EAAM,CACT,IAAMqB,EAAOuC,EAAI,CAAC,EAAE,OAAO,CAAC,EAC5B,MAAO,CACL,KAAM,OACN,IAAKvC,EACL,KAAAA,CACF,CACF,CACA,OAAOsC,GAAWC,EAAK5D,EAAM4D,EAAI,CAAC,EAAG,KAAK,MAAO,KAAK,KAAK,CAC7D,CACF,CAEA,SAASkB,EAAa4D,EAAmBC,EAAW,GAA2C,CAC7F,IAAI3G,EAAQ,KAAK,MAAM,OAAO,eAAe,KAAK8C,CAAG,EAKrD,GAJI,GAAC9C,GACD,CAACA,EAAM,CAAC,GAAK,CAACA,EAAM,CAAC,GAAK,CAACA,EAAM,CAAC,GAAK,CAACA,EAAM,CAAC,GAG/CA,EAAM,CAAC,GAAK2G,EAAS,MAAM,KAAK,MAAM,MAAM,mBAAmB,KAI/D,EAFa3G,EAAM,CAAC,GAAKA,EAAM,CAAC,IAEnB,CAAC2G,GAAY,KAAK,MAAM,OAAO,YAAY,KAAKA,CAAQ,GAAG,CAE1E,IAAMC,EAAU,CAAC,GAAG5G,EAAM,CAAC,CAAC,EAAE,OAAS,EACnC6G,EAAQC,EAASC,EAAaH,EAASI,EAAgB,EAErDC,EAAYjH,EAAM,CAAC,EAAE,CAAC,EAItBkH,EAASP,IAAaM,EACtBE,EAASF,IAAc,IAAM,KAAK,MAAM,OAAO,kBAAoB,KAAK,MAAM,OAAO,kBAM3F,IALAE,EAAO,UAAY,EAGnBT,EAAYA,EAAU,MAAM,GAAK5D,EAAI,OAAS8D,CAAO,GAE7C5G,EAAQmH,EAAO,KAAKT,CAAS,KAAO,MAAM,CAGhD,GAFAG,EAAS7G,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAKA,EAAM,CAAC,EAExE,CAAC6G,EAAQ,SAIb,GAFAC,EAAU,CAAC,GAAGD,CAAM,EAAE,OAElB7G,EAAM,CAAC,GAAKA,EAAM,CAAC,EAAG,CACxB+G,GAAcD,EACd,QACF,SAAW9G,EAAM,CAAC,GAAKA,EAAM,CAAC,EAAG,CAC/B,GAAI4G,EAAU,GAAK,GAAGA,EAAUE,GAAW,GAAI,CAC7CE,GAAiBF,EACjB,QACF,CACA,GAAII,EAGF,KAEJ,CAIA,GAFAH,GAAcD,EAEVC,EAAa,EAAG,SAGpBD,EAAU,KAAK,IAAIA,EAASA,EAAUC,EAAaC,CAAa,EAEhE,IAAMI,EAAiB,CAAC,GAAGpH,EAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAClC6B,EAAMiB,EAAI,MAAM,EAAG8D,EAAU5G,EAAM,MAAQoH,EAAiBN,CAAO,EAGzE,GAAI,KAAK,IAAIF,EAASE,CAAO,EAAI,EAAG,CAClC,IAAMzH,EAAOwC,EAAI,MAAM,EAAG,EAAE,EAC5B,MAAO,CACL,KAAM,KACN,IAAAA,EACA,KAAAxC,EACA,OAAQ,KAAK,MAAM,aAAaA,CAAI,CACtC,CACF,CAGA,IAAMA,EAAOwC,EAAI,MAAM,EAAG,EAAE,EAC5B,MAAO,CACL,KAAM,SACN,IAAAA,EACA,KAAAxC,EACA,OAAQ,KAAK,MAAM,aAAaA,CAAI,CACtC,CACF,CACF,CACF,CAEA,SAASyD,EAA0C,CACjD,IAAMlB,EAAM,KAAK,MAAM,OAAO,KAAK,KAAKkB,CAAG,EAC3C,GAAIlB,EAAK,CACP,IAAIvC,EAAOuC,EAAI,CAAC,EAAE,QAAQ,KAAK,MAAM,MAAM,kBAAmB,GAAG,EAC3DyF,EAAmB,KAAK,MAAM,MAAM,aAAa,KAAKhI,CAAI,EAC1DiI,EAA0B,KAAK,MAAM,MAAM,kBAAkB,KAAKjI,CAAI,GAAK,KAAK,MAAM,MAAM,gBAAgB,KAAKA,CAAI,EAC3H,OAAIgI,GAAoBC,IACtBjI,EAAOA,EAAK,UAAU,EAAGA,EAAK,OAAS,CAAC,GAEnC,CACL,KAAM,WACN,IAAKuC,EAAI,CAAC,EACV,KAAAvC,CACF,CACF,CACF,CAEA,GAAGyD,EAAoC,CACrC,IAAMlB,EAAM,KAAK,MAAM,OAAO,GAAG,KAAKkB,CAAG,EACzC,GAAIlB,EACF,MAAO,CACL,KAAM,KACN,IAAKA,EAAI,CAAC,CACZ,CAEJ,CAEA,IAAIkB,EAAa4D,EAAmBC,EAAW,GAA4B,CACzE,IAAI3G,EAAQ,KAAK,MAAM,OAAO,UAAU,KAAK8C,CAAG,EAChD,GAAK9C,IAID,CAFaA,EAAM,CAAC,GAEP,CAAC2G,GAAY,KAAK,MAAM,OAAO,YAAY,KAAKA,CAAQ,GAAG,CAE1E,IAAMC,EAAU,CAAC,GAAG5G,EAAM,CAAC,CAAC,EAAE,OAAS,EACnC6G,EAAQC,EAASC,EAAaH,EAE5BO,EAAS,KAAK,MAAM,OAAO,UAMjC,IALAA,EAAO,UAAY,EAGnBT,EAAYA,EAAU,MAAM,GAAK5D,EAAI,OAAS8D,CAAO,GAE7C5G,EAAQmH,EAAO,KAAKT,CAAS,KAAO,MAAM,CAOhD,GANAG,EAAS7G,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAKA,EAAM,CAAC,EAExE,CAAC6G,IAELC,EAAU,CAAC,GAAGD,CAAM,EAAE,OAElBC,IAAYF,GAAS,SAEzB,GAAI5G,EAAM,CAAC,GAAKA,EAAM,CAAC,EAAG,CACxB+G,GAAcD,EACd,QACF,CAIA,GAFAC,GAAcD,EAEVC,EAAa,EAAG,SAGpBD,EAAU,KAAK,IAAIA,EAASA,EAAUC,CAAU,EAEhD,IAAMK,EAAiB,CAAC,GAAGpH,EAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAClC6B,EAAMiB,EAAI,MAAM,EAAG8D,EAAU5G,EAAM,MAAQoH,EAAiBN,CAAO,EAGnEzH,EAAOwC,EAAI,MAAM+E,EAAS,CAACA,CAAO,EACxC,MAAO,CACL,KAAM,MACN,IAAA/E,EACA,KAAAxC,EACA,OAAQ,KAAK,MAAM,aAAaA,CAAI,CACtC,CACF,CACF,CACF,CAEA,SAASyD,EAAsC,CAC7C,IAAMlB,EAAM,KAAK,MAAM,OAAO,SAAS,KAAKkB,CAAG,EAC/C,GAAIlB,EAAK,CACP,IAAIvC,EAAMM,EACV,OAAIiC,EAAI,CAAC,IAAM,KACbvC,EAAOuC,EAAI,CAAC,EACZjC,EAAO,UAAYN,IAEnBA,EAAOuC,EAAI,CAAC,EACZjC,EAAON,GAGF,CACL,KAAM,OACN,IAAKuC,EAAI,CAAC,EACV,KAAAvC,EACA,KAAAM,EACA,SAAU,GACV,OAAQ,CACN,CACE,KAAM,OACN,IAAKN,EACL,KAAAA,CACF,CACF,CACF,CACF,CACF,CAEA,IAAIyD,EAAsC,CACxC,IAAIlB,EACJ,GAAIA,EAAM,KAAK,MAAM,OAAO,IAAI,KAAKkB,CAAG,EAAG,CACzC,IAAIzD,EAAMM,EACV,GAAIiC,EAAI,CAAC,IAAM,IACbvC,EAAOuC,EAAI,CAAC,EACZjC,EAAO,UAAYN,MACd,CAEL,IAAIkI,EACJ,GACEA,EAAc3F,EAAI,CAAC,EACnBA,EAAI,CAAC,EAAI,KAAK,MAAM,OAAO,WAAW,KAAKA,EAAI,CAAC,CAAC,IAAI,CAAC,GAAK,SACpD2F,IAAgB3F,EAAI,CAAC,GAC9BvC,EAAOuC,EAAI,CAAC,EACRA,EAAI,CAAC,IAAM,OACbjC,EAAO,UAAYiC,EAAI,CAAC,EAExBjC,EAAOiC,EAAI,CAAC,CAEhB,CACA,MAAO,CACL,KAAM,OACN,IAAKA,EAAI,CAAC,EACV,KAAAvC,EACA,KAAAM,EACA,SAAU,GACV,OAAQ,CACN,CACE,KAAM,OACN,IAAKN,EACL,KAAAA,CACF,CACF,CACF,CACF,CACF,CAEA,WAAWyD,EAAsC,CAC/C,IAAMlB,EAAM,KAAK,MAAM,OAAO,KAAK,KAAKkB,CAAG,EAC3C,GAAIlB,EAAK,CACP,IAAMzB,EAAU,KAAK,MAAM,MAAM,WACjC,MAAO,CACL,KAAM,OACN,IAAKyB,EAAI,CAAC,EAGV,KAAMzB,EAAUyB,EAAI,CAAC,EAAIxC,GAAiCwC,EAAI,CAAC,CAAC,EAChE,QAAAzB,CACF,CACF,CACF,CACF,ECjjCaqH,EAAN,MAAMC,EAAuD,CAClE,OACA,QACA,MAcO,YAEC,UAER,YAAYtE,EAAuD,CAEjE,KAAK,OAAS,CAAC,EACf,KAAK,OAAO,MAAQ,OAAO,OAAO,IAAI,EACtC,KAAK,QAAUA,GAAWtK,GAC1B,KAAK,QAAQ,UAAY,KAAK,QAAQ,WAAa,IAAIqK,GACvD,KAAK,UAAY,KAAK,QAAQ,UAC9B,KAAK,UAAU,QAAU,KAAK,QAC9B,KAAK,UAAU,MAAQ,KACvB,KAAK,YAAc,CAAC,EACpB,KAAK,MAAQ,CACX,OAAQ,GACR,WAAY,GACZ,YAAa,GACb,kBAAmB,GACnB,IAAK,EACP,EAEA,IAAMnB,EAAQ,CACZ,MAAAjI,EACA,MAAO+E,GAAM,OACb,OAAQC,GAAO,MACjB,EAEI,KAAK,QAAQ,UACfiD,EAAM,MAAQlD,GAAM,SACpBkD,EAAM,OAASjD,GAAO,UACb,KAAK,QAAQ,MACtBiD,EAAM,MAAQlD,GAAM,IAChB,KAAK,QAAQ,OACfkD,EAAM,OAASjD,GAAO,OAEtBiD,EAAM,OAASjD,GAAO,KAG1B,KAAK,UAAU,MAAQiD,CACzB,CAKA,WAAW,OAAQ,CACjB,MAAO,CACL,MAAAlD,GACA,OAAAC,EACF,CACF,CAKA,OAAO,IAAoDgE,EAAaK,EAAuD,CAE7H,OADc,IAAIsE,GAAqCtE,CAAO,EACjD,IAAIL,CAAG,CACtB,CAKA,OAAO,UAA0DA,EAAaK,EAAuD,CAEnI,OADc,IAAIsE,GAAqCtE,CAAO,EACjD,aAAaL,CAAG,CAC/B,CAKA,IAAIA,EAAa,CACfA,EAAMA,EAAI,QAAQhJ,EAAM,eAAgB;CAAI,EAE5C,KAAK,YAAYgJ,EAAK,KAAK,MAAM,EAEjC,QAASxC,EAAI,EAAGA,EAAI,KAAK,YAAY,OAAQA,IAAK,CAChD,IAAMoH,EAAO,KAAK,YAAYpH,CAAC,EAC/B,KAAK,aAAaoH,EAAK,IAAKA,EAAK,MAAM,CACzC,CACA,OAAA,KAAK,YAAc,CAAC,EAEb,KAAK,MACd,CAOA,YAAY5E,EAAaT,EAAkB,CAAC,EAAGsF,EAAuB,GAAO,CAC3E,KAAK,UAAU,MAAQ,KACnB,KAAK,QAAQ,WACf7E,EAAMA,EAAI,QAAQhJ,EAAM,cAAe,MAAM,EAAE,QAAQA,EAAM,UAAW,EAAE,GAG5E,IAAI8N,EAAY,IAChB,KAAO9E,GAAK,CACV,GAAIA,EAAI,OAAS8E,EACfA,EAAY9E,EAAI,WACX,CACL,KAAK,kBAAkBA,EAAI,WAAW,CAAC,CAAC,EACxC,KACF,CAEA,IAAIG,EAEJ,GAAI,KAAK,QAAQ,YAAY,OAAO,KAAM4E,IACpC5E,EAAQ4E,EAAa,KAAK,CAAE,MAAO,IAAK,EAAG/E,EAAKT,CAAM,IACxDS,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACV,IAEF,EACR,EACC,SAIF,GAAIA,EAAQ,KAAK,UAAU,MAAMH,CAAG,EAAG,CACrCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpC,IAAMS,EAAYrB,EAAO,GAAG,EAAE,EAC1BY,EAAM,IAAI,SAAW,GAAKS,IAAc,OAG1CA,EAAU,KAAO;EAEjBrB,EAAO,KAAKY,CAAK,EAEnB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,KAAKH,CAAG,EAAG,CACpCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpC,IAAMS,EAAYrB,EAAO,GAAG,EAAE,EAE1BqB,GAAW,OAAS,aAAeA,GAAW,OAAS,QACzDA,EAAU,MAAQA,EAAU,IAAI,SAAS;CAAI,EAAI,GAAK;GAAQT,EAAM,IACpES,EAAU,MAAQ;EAAOT,EAAM,KAC/B,KAAK,YAAY,GAAG,EAAE,EAAG,IAAMS,EAAU,MAEzCrB,EAAO,KAAKY,CAAK,EAEnB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,OAAOH,CAAG,EAAG,CACtCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,QAAQH,CAAG,EAAG,CACvCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,GAAGH,CAAG,EAAG,CAClCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,WAAWH,CAAG,EAAG,CAC1CA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,KAAKH,CAAG,EAAG,CACpCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,KAAKH,CAAG,EAAG,CACpCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,IAAIH,CAAG,EAAG,CACnCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpC,IAAMS,EAAYrB,EAAO,GAAG,EAAE,EAC1BqB,GAAW,OAAS,aAAeA,GAAW,OAAS,QACzDA,EAAU,MAAQA,EAAU,IAAI,SAAS;CAAI,EAAI,GAAK;GAAQT,EAAM,IACpES,EAAU,MAAQ;EAAOT,EAAM,IAC/B,KAAK,YAAY,GAAG,EAAE,EAAG,IAAMS,EAAU,MAC/B,KAAK,OAAO,MAAMT,EAAM,GAAG,IACrC,KAAK,OAAO,MAAMA,EAAM,GAAG,EAAI,CAC7B,KAAMA,EAAM,KACZ,MAAOA,EAAM,KACf,EACAZ,EAAO,KAAKY,CAAK,GAEnB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,MAAMH,CAAG,EAAG,CACrCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,SAASH,CAAG,EAAG,CACxCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAIA,IAAI6E,EAAShF,EACb,GAAI,KAAK,QAAQ,YAAY,WAAY,CACvC,IAAIiF,EAAa,IACXC,EAAUlF,EAAI,MAAM,CAAC,EACvBmF,EACJ,KAAK,QAAQ,WAAW,WAAW,QAASC,GAAkB,CAC5DD,EAAYC,EAAc,KAAK,CAAE,MAAO,IAAK,EAAGF,CAAO,EACnD,OAAOC,GAAc,UAAYA,GAAa,IAChDF,EAAa,KAAK,IAAIA,EAAYE,CAAS,EAE/C,CAAC,EACGF,EAAa,KAAYA,GAAc,IACzCD,EAAShF,EAAI,UAAU,EAAGiF,EAAa,CAAC,EAE5C,CACA,GAAI,KAAK,MAAM,MAAQ9E,EAAQ,KAAK,UAAU,UAAU6E,CAAM,GAAI,CAChE,IAAMpE,EAAYrB,EAAO,GAAG,EAAE,EAC1BsF,GAAwBjE,GAAW,OAAS,aAC9CA,EAAU,MAAQA,EAAU,IAAI,SAAS;CAAI,EAAI,GAAK;GAAQT,EAAM,IACpES,EAAU,MAAQ;EAAOT,EAAM,KAC/B,KAAK,YAAY,IAAI,EACrB,KAAK,YAAY,GAAG,EAAE,EAAG,IAAMS,EAAU,MAEzCrB,EAAO,KAAKY,CAAK,EAEnB0E,EAAuBG,EAAO,SAAWhF,EAAI,OAC7CA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpC,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,KAAKH,CAAG,EAAG,CACpCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpC,IAAMS,EAAYrB,EAAO,GAAG,EAAE,EAC1BqB,GAAW,OAAS,QACtBA,EAAU,MAAQA,EAAU,IAAI,SAAS;CAAI,EAAI,GAAK;GAAQT,EAAM,IACpES,EAAU,MAAQ;EAAOT,EAAM,KAC/B,KAAK,YAAY,IAAI,EACrB,KAAK,YAAY,GAAG,EAAE,EAAG,IAAMS,EAAU,MAEzCrB,EAAO,KAAKY,CAAK,EAEnB,QACF,CAEA,GAAIH,EAAK,CACP,KAAK,kBAAkBA,EAAI,WAAW,CAAC,CAAC,EACxC,KACF,CACF,CAEA,OAAA,KAAK,MAAM,IAAM,GACVT,CACT,CAEA,OAAOS,EAAaT,EAAkB,CAAC,EAAG,CACxC,OAAA,KAAK,YAAY,KAAK,CAAE,IAAAS,EAAK,OAAAT,CAAO,CAAC,EAC9BA,CACT,CAMQ,WAAWhD,EAAuB,CACxC,GAAI,CAACA,EAAK,SAAS,GAAG,EACpB,MAAO,GAGT,IAAM8I,EAAW,KAAK,UAAU,MAAM,OAAO,KAC7C,QAAWnI,KAASX,EAAK,SAAS,KAAK,UAAU,MAAM,OAAO,SAAS,EAGrE,GAAI8I,EAAS,KAAKnI,EAAM,CAAC,CAAC,GAAKX,EAAK,OAAOW,EAAM,MAAQ,CAAC,IAAM,IAC9D,MAAO,GAIX,QAAWA,KAASX,EAAK,SAAS,KAAK,UAAU,MAAM,OAAO,aAAa,EAAG,CAC5E,IAAM+I,EAASpI,EAAM,CAAC,EAChBqI,EAAWD,EAAO,YAAY,GAAG,EACvC,GAAI,EAAAA,EAAO,OAAO,CAAC,IAAM,KAAO,CAAC,OAAO,OAAO,KAAK,OAAO,MAAOpH,GAAeoH,EAAO,MAAMC,EAAW,EAAG,EAAE,CAAC,CAAC,IAI5G,EAAAA,EAAW,GAAK,KAAK,WAAWD,EAAO,MAAM,EAAGC,EAAW,CAAC,CAAC,GAGjE,MAAO,EACT,CAEA,MAAO,EACT,CAKA,aAAavF,EAAaT,EAAkB,CAAC,EAAY,CACvD,KAAK,UAAU,MAAQ,KAOvB,IAAMiG,EAAwB,KAAK,MAAM,kBACzC,KAAK,MAAM,kBAAoBA,GAAyBxF,EAAI,SAAS,GAAG,EACxE,GAAI,CACF,OAAO,KAAKyF,GAAmBzF,EAAKT,CAAM,CAC5C,QAAA,CAGE,KAAK,MAAM,kBAAoBiG,CACjC,CACF,CAEAC,GAAmBzF,EAAaT,EAA0B,CAExD,IAAIqE,EAAY5D,EAGhB,GAAI,KAAK,OAAO,OAASA,EAAI,SAAS,GAAG,EAAG,CAC1C,IAAMzE,EAAgB,KAAK,UAAU,MAAM,OAAO,cAC5CmK,EAAeJ,GAA2B,CAC9C,IAAMC,EAAWD,EAAO,YAAY,GAAG,EACvC,GAAI,CAAC,OAAO,OAAO,KAAK,OAAO,MAAOpH,GAAeoH,EAAO,MAAMC,EAAW,EAAG,EAAE,CAAC,CAAC,EAClF,OAAOD,EAOT,GAAIC,EAAW,GAAKD,EAAO,OAAO,CAAC,IAAM,IAAK,CAC5C,IAAM/I,EAAO+I,EAAO,MAAM,EAAGC,EAAW,CAAC,EACzC,GAAI,KAAK,WAAWhJ,CAAI,EACtB,MAAO,IAAMA,EAAK,QAAQhB,EAAemK,CAAW,EAChD,KAAO,IAAI,OAAOJ,EAAO,OAASC,EAAW,CAAC,EAAI,GAE1D,CACA,MAAO,IAAM,IAAI,OAAOD,EAAO,OAAS,CAAC,EAAI,GAC/C,EACA1B,EAAYA,EAAU,QAAQrI,EAAemK,CAAW,CAC1D,CAQA9B,EAAYA,EAAU,QAAQ,KAAK,UAAU,MAAM,OAAO,0BAA2B,CAAC0B,EAAQ3I,EAAMgJ,IAC9FA,EACK,IAAI,OAAOL,EAAO,MAAM,EAE7B3I,EACKA,EAAO2I,EAAO,MAAM3I,EAAK,OAAQ,CAACA,EAAK,MAAM,EAAE,QAAQ,KAAM,GAAG,EAAIA,EAEtE2I,CACR,EAGD1B,EAAYA,EAAU,QAAQ,KAAK,UAAU,MAAM,OAAO,UAAW,CAAC0B,EAAQM,EAAOC,IAAY,CAC/F,IAAM1I,EAAS0I,EAAUA,EAAQ,OAAS,EAC1C,OAAOP,EAAO,MAAM,EAAGnI,CAAM,EAAI,IAAM,IAAI,OAAOmI,EAAO,OAASnI,EAAS,CAAC,EAAI,GAClF,CAAC,EAGDyG,EAAY,KAAK,QAAQ,OAAO,cAAc,KAAK,CAAE,MAAO,IAAK,EAAGA,CAAS,GAAKA,EAElF,IAAIkC,EAAe,GACfjC,EAAW,GACXiB,EAAY,IAChB,KAAO9E,GAAK,CACV,GAAIA,EAAI,OAAS8E,EACfA,EAAY9E,EAAI,WACX,CACL,KAAK,kBAAkBA,EAAI,WAAW,CAAC,CAAC,EACxC,KACF,CAEK8F,IACHjC,EAAW,IAEbiC,EAAe,GAEf,IAAI3F,EAGJ,GAAI,KAAK,QAAQ,YAAY,QAAQ,KAAM4E,IACrC5E,EAAQ4E,EAAa,KAAK,CAAE,MAAO,IAAK,EAAG/E,EAAKT,CAAM,IACxDS,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACV,IAEF,EACR,EACC,SAIF,GAAIA,EAAQ,KAAK,UAAU,OAAOH,CAAG,EAAG,CACtCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,IAAIH,CAAG,EAAG,CACnCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,KAAKH,CAAG,EAAG,CACpCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,QAAQH,EAAK,KAAK,OAAO,KAAK,EAAG,CAC1DA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpC,IAAMS,EAAYrB,EAAO,GAAG,EAAE,EAC1BY,EAAM,OAAS,QAAUS,GAAW,OAAS,QAC/CA,EAAU,KAAOT,EAAM,IACvBS,EAAU,MAAQT,EAAM,MAExBZ,EAAO,KAAKY,CAAK,EAEnB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,SAASH,EAAK4D,EAAWC,CAAQ,EAAG,CAC7D7D,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,SAASH,CAAG,EAAG,CACxCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,GAAGH,CAAG,EAAG,CAClCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,IAAIH,EAAK4D,EAAWC,CAAQ,EAAG,CACxD7D,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAGA,GAAIA,EAAQ,KAAK,UAAU,SAASH,CAAG,EAAG,CACxCA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAGA,GAAI,CAAC,KAAK,MAAM,SAAWA,EAAQ,KAAK,UAAU,IAAIH,CAAG,GAAI,CAC3DA,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EACpCZ,EAAO,KAAKY,CAAK,EACjB,QACF,CAIA,IAAI6E,EAAShF,EACb,GAAI,KAAK,QAAQ,YAAY,YAAa,CACxC,IAAIiF,EAAa,IACXC,EAAUlF,EAAI,MAAM,CAAC,EACvBmF,EACJ,KAAK,QAAQ,WAAW,YAAY,QAASC,GAAkB,CAC7DD,EAAYC,EAAc,KAAK,CAAE,MAAO,IAAK,EAAGF,CAAO,EACnD,OAAOC,GAAc,UAAYA,GAAa,IAChDF,EAAa,KAAK,IAAIA,EAAYE,CAAS,EAE/C,CAAC,EACGF,EAAa,KAAYA,GAAc,IACzCD,EAAShF,EAAI,UAAU,EAAGiF,EAAa,CAAC,EAE5C,CACA,GAAI9E,EAAQ,KAAK,UAAU,WAAW6E,CAAM,EAAG,CAC7ChF,EAAMA,EAAI,UAAUG,EAAM,IAAI,MAAM,EAChCA,EAAM,IAAI,MAAM,EAAE,IAAM,MAC1B0D,EAAW1D,EAAM,IAAI,MAAM,EAAE,GAE/B2F,EAAe,GACf,IAAMlF,EAAYrB,EAAO,GAAG,EAAE,EAC1BqB,GAAW,OAAS,QACtBA,EAAU,KAAOT,EAAM,IACvBS,EAAU,MAAQT,EAAM,MAExBZ,EAAO,KAAKY,CAAK,EAEnB,QACF,CAEA,GAAIH,EAAK,CACP,KAAK,kBAAkBA,EAAI,WAAW,CAAC,CAAC,EACxC,KACF,CACF,CAEA,OAAOT,CACT,CAEQ,kBAAkBwG,EAAc,CACtC,IAAMC,EAAS,0BAA4BD,EAC3C,GAAI,KAAK,QAAQ,OACf,QAAQ,MAAMC,CAAM,MAEpB,OAAM,IAAI,MAAMA,CAAM,CAE1B,CACF,ECnjBaC,GAAN,KAAgE,CACrE,QACA,OACA,YAAY5F,EAAuD,CACjE,KAAK,QAAUA,GAAWtK,EAC5B,CAEA,MAAMoK,EAAqC,CACzC,MAAO,EACT,CAEA,KAAK,CAAE,KAAA5D,EAAM,KAAA2J,EAAM,QAAA7I,CAAQ,EAAgC,CACzD,IAAM8I,GAAcD,GAAQ,IAAI,MAAMlP,EAAM,aAAa,IAAI,CAAC,EAGxD2F,EAAOJ,EAAOA,EAAK,QAAQvF,EAAM,cAAe,EAAE,EAAI;EAAO,GAEnE,OAAKmP,EAME,8BACH/J,EAAmB+J,CAAU,EAC7B,MACC9I,EAAUV,EAAOP,EAAmBO,EAAM,EAAI,GAC/C;EATK,eACFU,EAAUV,EAAOP,EAAmBO,EAAM,EAAI,GAC/C;CAQR,CAEA,WAAW,CAAE,OAAA4C,CAAO,EAAsC,CAExD,MAAO;EADM,KAAK,OAAO,MAAMA,CAAM,CACT;CAC9B,CAEA,KAAK,CAAE,KAAAhD,CAAK,EAA6C,CACvD,OAAOA,CACT,CAEA,IAAI4D,EAAmC,CACrC,MAAO,EACT,CAEA,QAAQ,CAAE,OAAAZ,EAAQ,MAAA6G,CAAM,EAAmC,CACzD,MAAO,KAAKA,CAAK,IAAI,KAAK,OAAO,YAAY7G,CAAM,CAAC,MAAM6G,CAAK;CACjE,CAEA,GAAGjG,EAAkC,CACnC,MAAO;CACT,CAEA,KAAKA,EAAoC,CACvC,IAAMkG,EAAUlG,EAAM,QAChBmG,EAAQnG,EAAM,MAEhBoG,EAAO,GACX,QAASC,EAAI,EAAGA,EAAIrG,EAAM,MAAM,OAAQqG,IAAK,CAC3C,IAAM9D,EAAOvC,EAAM,MAAMqG,CAAC,EAC1BD,GAAQ,KAAK,SAAS7D,CAAI,CAC5B,CAEA,IAAM+D,EAAOJ,EAAU,KAAO,KACxBK,EAAaL,GAAWC,IAAU,EAAM,WAAaA,EAAQ,IAAO,GAC1E,MAAO,IAAMG,EAAOC,EAAY;EAAQH,EAAO,KAAOE,EAAO;CAC/D,CAEA,SAAS/D,EAAuC,CAC9C,MAAO,OAAO,KAAK,OAAO,MAAMA,EAAK,MAAM,CAAC;CAC9C,CAEA,SAAS,CAAE,QAAAiE,CAAQ,EAAoC,CACrD,MAAO,WACFA,EAAU,cAAgB,IAC3B,+BACN,CAEA,UAAU,CAAE,OAAApH,CAAO,EAAqC,CACtD,MAAO,MAAM,KAAK,OAAO,YAAYA,CAAM,CAAC;CAC9C,CAEA,MAAMY,EAAqC,CACzC,IAAIyG,EAAS,GAGTvD,EAAO,GACX,QAASmD,EAAI,EAAGA,EAAIrG,EAAM,OAAO,OAAQqG,IACvCnD,GAAQ,KAAK,UAAUlD,EAAM,OAAOqG,CAAC,CAAC,EAExCI,GAAU,KAAK,SAAS,CAAE,KAAMvD,CAAqB,CAAC,EAEtD,IAAIkD,EAAO,GACX,QAASC,EAAI,EAAGA,EAAIrG,EAAM,KAAK,OAAQqG,IAAK,CAC1C,IAAMvJ,EAAMkD,EAAM,KAAKqG,CAAC,EAExBnD,EAAO,GACP,QAASwD,EAAI,EAAGA,EAAI5J,EAAI,OAAQ4J,IAC9BxD,GAAQ,KAAK,UAAUpG,EAAI4J,CAAC,CAAC,EAG/BN,GAAQ,KAAK,SAAS,CAAE,KAAMlD,CAAqB,CAAC,CACtD,CACA,OAAIkD,IAAMA,EAAO,UAAUA,CAAI,YAExB;;EAEHK,EACA;EACAL,EACA;CACN,CAEA,SAAS,CAAE,KAAAhK,CAAK,EAAkD,CAChE,MAAO;EAASA,CAAI;CACtB,CAEA,UAAU4D,EAAyC,CACjD,IAAM2G,EAAU,KAAK,OAAO,YAAY3G,EAAM,MAAM,EAC9CsG,EAAOtG,EAAM,OAAS,KAAO,KAInC,OAHYA,EAAM,MACd,IAAIsG,CAAI,WAAWtG,EAAM,KAAK,KAC9B,IAAIsG,CAAI,KACCK,EAAU,KAAKL,CAAI;CAClC,CAKA,OAAO,CAAE,OAAAlH,CAAO,EAAkC,CAChD,MAAO,WAAW,KAAK,OAAO,YAAYA,CAAM,CAAC,WACnD,CAEA,GAAG,CAAE,OAAAA,CAAO,EAA8B,CACxC,MAAO,OAAO,KAAK,OAAO,YAAYA,CAAM,CAAC,OAC/C,CAEA,SAAS,CAAE,KAAAhD,CAAK,EAAoC,CAClD,MAAO,SAASH,EAAmBG,EAAM,EAAI,CAAC,SAChD,CAEA,GAAG4D,EAAkC,CACnC,MAAO,MACT,CAEA,IAAI,CAAE,OAAAZ,CAAO,EAA+B,CAC1C,MAAO,QAAQ,KAAK,OAAO,YAAYA,CAAM,CAAC,QAChD,CAEA,KAAK,CAAE,KAAA1C,EAAM,MAAAqC,EAAO,KAAA3C,EAAM,OAAAgD,EAAQ,SAAA1E,CAAS,EAAgC,CAGzE,IAAMkM,EAAalM,EACfuB,EAAmBG,EAAM,EAAI,EAC7B,KAAK,OAAO,YAAYgD,CAAM,EAC5ByH,EAAYpK,GAASC,CAAI,EAC/B,GAAImK,IAAc,KAChB,OAAOD,EAETlK,EAAOT,EAAmB4K,EAAWnM,CAAQ,EAC7C,IAAIoM,EAAM,YAAcpK,EAAO,IAC/B,OAAIqC,IACF+H,GAAO,WAAc7K,EAAmB8C,CAAK,EAAK,KAEpD+H,GAAO,IAAMF,EAAa,OACnBE,CACT,CAEA,MAAM,CAAE,KAAApK,EAAM,MAAAqC,EAAO,KAAA3C,EAAM,OAAAgD,CAAO,EAAiC,CAC7DA,IACFhD,EAAO,KAAK,OAAO,YAAYgD,EAAQ,KAAK,OAAO,YAAY,GAEjE,IAAMyH,EAAYpK,GAASC,CAAI,EAC/B,GAAImK,IAAc,KAChB,OAAO5K,EAAmBG,CAAI,EAEhCM,EAAOmK,EAEP,IAAIC,EAAM,aAAa7K,EAAmBS,CAAI,CAAC,UAAUT,EAAmBG,CAAI,CAAC,IACjF,OAAI2C,IACF+H,GAAO,WAAW7K,EAAmB8C,CAAK,CAAC,KAE7C+H,GAAO,IACAA,CACT,CAEA,KAAK9G,EAAoD,CACvD,MAAO,WAAYA,GAASA,EAAM,OAC9B,KAAK,OAAO,YAAYA,EAAM,MAAM,EACnC,YAAaA,GAASA,EAAM,QAAUA,EAAM,KAAyB/D,EAAmB+D,EAAM,IAAI,CACzG,CACF,ECpMa+G,GAAN,KAA6C,CAElD,OAAO,CAAE,KAAA3K,CAAK,EAAkC,CAC9C,OAAOA,CACT,CAEA,GAAG,CAAE,KAAAA,CAAK,EAA8B,CACtC,OAAOA,CACT,CAEA,SAAS,CAAE,KAAAA,CAAK,EAAoC,CAClD,OAAOA,CACT,CAEA,IAAI,CAAE,KAAAA,CAAK,EAA+B,CACxC,OAAOA,CACT,CAEA,KAAK,CAAE,KAAAA,CAAK,EAA6C,CACvD,OAAOA,CACT,CAEA,KAAK,CAAE,KAAAA,CAAK,EAA6D,CACvE,OAAOA,CACT,CAEA,KAAK,CAAE,KAAAA,CAAK,EAAgC,CAC1C,MAAO,GAAKA,CACd,CAEA,MAAM,CAAE,KAAAA,CAAK,EAAiC,CAC5C,MAAO,GAAKA,CACd,CAEA,IAAqB,CACnB,MAAO,EACT,CAEA,SAAS,CAAE,IAAAwC,CAAI,EAAoC,CACjD,OAAOA,CACT,CACF,ECtCaoI,EAAN,MAAMC,EAAwD,CACnE,QACA,SACA,aACA,YAAY/G,EAAuD,CACjE,KAAK,QAAUA,GAAWtK,GAC1B,KAAK,QAAQ,SAAW,KAAK,QAAQ,UAAY,IAAIkQ,GACrD,KAAK,SAAW,KAAK,QAAQ,SAC7B,KAAK,SAAS,QAAU,KAAK,QAC7B,KAAK,SAAS,OAAS,KACvB,KAAK,aAAe,IAAIiB,EAC1B,CAKA,OAAO,MAAsD3H,EAAiBc,EAAuD,CAEnI,OADe,IAAI+G,GAAsC/G,CAAO,EAClD,MAAMd,CAAM,CAC5B,CAKA,OAAO,YAA4DA,EAAiBc,EAAuD,CAEzI,OADe,IAAI+G,GAAsC/G,CAAO,EAClD,YAAYd,CAAM,CAClC,CAKA,MAAMA,EAA+B,CACnC,KAAK,SAAS,OAAS,KACvB,IAAI0H,EAAM,GAEV,QAASzJ,EAAI,EAAGA,EAAI+B,EAAO,OAAQ/B,IAAK,CACtC,IAAM6J,EAAW9H,EAAO/B,CAAC,EAGzB,GAAI,KAAK,QAAQ,YAAY,YAAY6J,EAAS,IAAI,EAAG,CACvD,IAAMC,EAAeD,EACfE,EAAM,KAAK,QAAQ,WAAW,UAAUD,EAAa,IAAI,EAAE,KAAK,CAAE,OAAQ,IAAK,EAAGA,CAAY,EACpG,GAAIC,IAAQ,IAAS,CAAC,CAAC,QAAS,KAAM,UAAW,OAAQ,QAAS,aAAc,OAAQ,WAAY,OAAQ,MAAO,YAAa,MAAM,EAAE,SAASD,EAAa,IAAI,EAAG,CACnKL,GAAOM,GAAO,GACd,QACF,CACF,CAEA,IAAMpH,EAAQkH,EAEd,OAAQlH,EAAM,KAAM,CAClB,IAAK,QAAS,CACZ8G,GAAO,KAAK,SAAS,MAAM9G,CAAK,EAChC,KACF,CACA,IAAK,KAAM,CACT8G,GAAO,KAAK,SAAS,GAAG9G,CAAK,EAC7B,KACF,CACA,IAAK,UAAW,CACd8G,GAAO,KAAK,SAAS,QAAQ9G,CAAK,EAClC,KACF,CACA,IAAK,OAAQ,CACX8G,GAAO,KAAK,SAAS,KAAK9G,CAAK,EAC/B,KACF,CACA,IAAK,QAAS,CACZ8G,GAAO,KAAK,SAAS,MAAM9G,CAAK,EAChC,KACF,CACA,IAAK,aAAc,CACjB8G,GAAO,KAAK,SAAS,WAAW9G,CAAK,EACrC,KACF,CACA,IAAK,OAAQ,CACX8G,GAAO,KAAK,SAAS,KAAK9G,CAAK,EAC/B,KACF,CACA,IAAK,WAAY,CACf8G,GAAO,KAAK,SAAS,SAAS9G,CAAK,EACnC,KACF,CACA,IAAK,OAAQ,CACX8G,GAAO,KAAK,SAAS,KAAK9G,CAAK,EAC/B,KACF,CACA,IAAK,MAAO,CACV8G,GAAO,KAAK,SAAS,IAAI9G,CAAK,EAC9B,KACF,CACA,IAAK,YAAa,CAChB8G,GAAO,KAAK,SAAS,UAAU9G,CAAK,EACpC,KACF,CACA,IAAK,OAAQ,CACX8G,GAAO,KAAK,SAAS,KAAK9G,CAAK,EAC/B,KACF,CAEA,QAAS,CACP,IAAM6F,EAAS,eAAiB7F,EAAM,KAAO,wBAC7C,GAAI,KAAK,QAAQ,OACf,OAAA,QAAQ,MAAM6F,CAAM,EACb,GAEP,MAAM,IAAI,MAAMA,CAAM,CAE1B,CACF,CACF,CAEA,OAAOiB,CACT,CAKA,YAAY1H,EAAiBiI,EAAoF,KAAK,SAAwB,CAC5I,KAAK,SAAS,OAAS,KACvB,IAAIP,EAAM,GAEV,QAASzJ,EAAI,EAAGA,EAAI+B,EAAO,OAAQ/B,IAAK,CACtC,IAAM6J,EAAW9H,EAAO/B,CAAC,EAGzB,GAAI,KAAK,QAAQ,YAAY,YAAY6J,EAAS,IAAI,EAAG,CACvD,IAAME,EAAM,KAAK,QAAQ,WAAW,UAAUF,EAAS,IAAI,EAAE,KAAK,CAAE,OAAQ,IAAK,EAAGA,CAAQ,EAC5F,GAAIE,IAAQ,IAAS,CAAC,CAAC,SAAU,OAAQ,OAAQ,QAAS,WAAY,SAAU,KAAM,WAAY,KAAM,MAAO,MAAM,EAAE,SAASF,EAAS,IAAI,EAAG,CAC9IJ,GAAOM,GAAO,GACd,QACF,CACF,CAEA,IAAMpH,EAAQkH,EAEd,OAAQlH,EAAM,KAAM,CAClB,IAAK,SAAU,CACb8G,GAAOO,EAAS,KAAKrH,CAAK,EAC1B,KACF,CACA,IAAK,OAAQ,CACX8G,GAAOO,EAAS,KAAKrH,CAAK,EAC1B,KACF,CACA,IAAK,OAAQ,CACX8G,GAAOO,EAAS,KAAKrH,CAAK,EAC1B,KACF,CACA,IAAK,QAAS,CACZ8G,GAAOO,EAAS,MAAMrH,CAAK,EAC3B,KACF,CACA,IAAK,WAAY,CACf8G,GAAOO,EAAS,SAASrH,CAAK,EAC9B,KACF,CACA,IAAK,SAAU,CACb8G,GAAOO,EAAS,OAAOrH,CAAK,EAC5B,KACF,CACA,IAAK,KAAM,CACT8G,GAAOO,EAAS,GAAGrH,CAAK,EACxB,KACF,CACA,IAAK,WAAY,CACf8G,GAAOO,EAAS,SAASrH,CAAK,EAC9B,KACF,CACA,IAAK,KAAM,CACT8G,GAAOO,EAAS,GAAGrH,CAAK,EACxB,KACF,CACA,IAAK,MAAO,CACV8G,GAAOO,EAAS,IAAIrH,CAAK,EACzB,KACF,CACA,IAAK,OAAQ,CACX8G,GAAOO,EAAS,KAAKrH,CAAK,EAC1B,KACF,CACA,QAAS,CACP,IAAM6F,EAAS,eAAiB7F,EAAM,KAAO,wBAC7C,GAAI,KAAK,QAAQ,OACf,OAAA,QAAQ,MAAM6F,CAAM,EACb,GAEP,MAAM,IAAI,MAAMA,CAAM,CAE1B,CACF,CACF,CACA,OAAOiB,CACT,CACF,ECtMaQ,GAAN,KAA6D,CAClE,QACA,MAEA,YAAYpH,EAAuD,CACjE,KAAK,QAAUA,GAAWtK,EAC5B,CAEA,OAAO,iBAAmB,IAAI,IAAI,CAChC,aACA,cACA,mBACA,cACF,CAAC,EAED,OAAO,6BAA+B,IAAI,IAAI,CAC5C,aACA,cACA,kBACF,CAAC,EAKD,WAAW2R,EAAkB,CAC3B,OAAOA,CACT,CAKA,YAAYtP,EAAoB,CAC9B,OAAOA,CACT,CAKA,iBAAiBmH,EAA8B,CAC7C,OAAOA,CACT,CAKA,aAAaS,EAAa,CACxB,OAAOA,CACT,CAKA,aAAajE,EAAQ,KAAK,MAAO,CAC/B,OAAOA,EAAQ2I,EAAO,IAAMA,EAAO,SACrC,CAKA,cAAc3I,EAAQ,KAAK,MAAO,CAChC,OAAOA,EAAQoL,EAAQ,MAAsCA,EAAQ,WACvE,CACF,ECjDA,SAASQ,GAAWC,EAAwBC,EAAsC,CAChF,GAAI,MAAM,QAAQA,CAAK,EACrB,QAASrK,EAAI,EAAGA,EAAIqK,EAAM,OAAQrK,IAChCoK,EAAO,KAAKC,EAAMrK,CAAC,CAAC,OAGtBoK,EAAO,KAAKC,CAAK,CAErB,CAEO,IAAMC,GAAN,KAA6D,CAClE,SAAWhS,GAA2C,EACtD,QAAU,KAAK,WAQf,MAAQ,KAAK,cAAc,EAAI,EAQ/B,YAAc,KAAK,cAAc,EAAK,EAEtC,OAASqR,EACT,SAAWlB,GACX,aAAeiB,GACf,MAAQxC,EACR,UAAYtE,GACZ,MAAQqH,GAER,eAAeM,EAAuD,CACpE,KAAK,IAAI,GAAGA,CAAI,CAClB,CAKA,WAAWxI,EAA8ByI,EAA2D,CAClG,IAAMJ,EAAyB,CAAC,EAChC,QAAWzH,KAASZ,EAElB,OADAoI,GAAWC,EAAQI,EAAS,KAAK,KAAM7H,CAAK,CAAC,EACrCA,EAAM,KAAM,CAClB,IAAK,QAAS,CACZ,IAAM8H,EAAa9H,EACnB,QAAWkD,KAAQ4E,EAAW,OAC5BN,GAAWC,EAAQ,KAAK,WAAWvE,EAAK,OAAQ2E,CAAQ,CAAC,EAE3D,QAAW/K,KAAOgL,EAAW,KAC3B,QAAW5E,KAAQpG,EACjB0K,GAAWC,EAAQ,KAAK,WAAWvE,EAAK,OAAQ2E,CAAQ,CAAC,EAG7D,KACF,CACA,IAAK,OAAQ,CACX,IAAME,EAAY/H,EAClBwH,GAAWC,EAAQ,KAAK,WAAWM,EAAU,MAAOF,CAAQ,CAAC,EAC7D,KACF,CACA,QAAS,CACP,IAAMV,EAAenH,EACjB,KAAK,SAAS,YAAY,cAAcmH,EAAa,IAAI,EAC3D,KAAK,SAAS,WAAW,YAAYA,EAAa,IAAI,EAAE,QAASa,GAAgB,CAC/E,IAAM5I,EAAS+H,EAAaa,CAAW,EAAE,KAAK,GAAQ,EACtDR,GAAWC,EAAQ,KAAK,WAAWrI,EAAQyI,CAAQ,CAAC,CACtD,CAAC,EACQV,EAAa,QACtBK,GAAWC,EAAQ,KAAK,WAAWN,EAAa,OAAQU,CAAQ,CAAC,CAErE,CACF,CAEF,OAAOJ,CACT,CAWA,OAAOG,EAAuD,CAC5D,IAAMK,EAAwE,KAAK,SAAS,YAAc,CAAE,UAAW,CAAC,EAAG,YAAa,CAAC,CAAE,EAE3I,OAAAL,EAAK,QAASM,GAAS,CAErB,IAAMC,EAAO,CAAE,GAAGD,CAAK,EA4DvB,GAzDAC,EAAK,MAAQ,KAAK,SAAS,OAASA,EAAK,OAAS,GAG9CD,EAAK,aACPA,EAAK,WAAW,QAASE,GAAQ,CAC/B,GAAI,CAACA,EAAI,KACP,MAAM,IAAI,MAAM,yBAAyB,EAE3C,GAAI,aAAcA,EAAK,CACrB,IAAMC,EAAeJ,EAAW,UAAUG,EAAI,IAAI,EAC9CC,EAEFJ,EAAW,UAAUG,EAAI,IAAI,EAAI,YAAYR,EAAM,CACjD,IAAIR,EAAMgB,EAAI,SAAS,MAAM,KAAMR,CAAI,EACvC,OAAIR,IAAQ,KACVA,EAAMiB,EAAa,MAAM,KAAMT,CAAI,GAE9BR,CACT,EAEAa,EAAW,UAAUG,EAAI,IAAI,EAAIA,EAAI,QAEzC,CACA,GAAI,cAAeA,EAAK,CACtB,GAAI,CAACA,EAAI,OAAUA,EAAI,QAAU,SAAWA,EAAI,QAAU,SACxD,MAAM,IAAI,MAAM,6CAA6C,EAE/D,IAAME,EAAWL,EAAWG,EAAI,KAAK,EACjCE,EACFA,EAAS,QAAQF,EAAI,SAAS,EAE9BH,EAAWG,EAAI,KAAK,EAAI,CAACA,EAAI,SAAS,EAEpCA,EAAI,QACFA,EAAI,QAAU,QACZH,EAAW,WACbA,EAAW,WAAW,KAAKG,EAAI,KAAK,EAEpCH,EAAW,WAAa,CAACG,EAAI,KAAK,EAE3BA,EAAI,QAAU,WACnBH,EAAW,YACbA,EAAW,YAAY,KAAKG,EAAI,KAAK,EAErCH,EAAW,YAAc,CAACG,EAAI,KAAK,GAI3C,CACI,gBAAiBA,GAAOA,EAAI,cAC9BH,EAAW,YAAYG,EAAI,IAAI,EAAIA,EAAI,YAE3C,CAAC,EACDD,EAAK,WAAaF,GAIhBC,EAAK,SAAU,CACjB,IAAMb,EAAW,KAAK,SAAS,UAAY,IAAIvB,GAAwC,KAAK,QAAQ,EACpG,QAAWyC,KAAQL,EAAK,SAAU,CAChC,GAAI,EAAEK,KAAQlB,GACZ,MAAM,IAAI,MAAM,aAAakB,CAAI,kBAAkB,EAErD,GAAI,CAAC,UAAW,QAAQ,EAAE,SAASA,CAAI,EAErC,SAEF,IAAMC,EAAeD,EACfE,EAAeP,EAAK,SAASM,CAAY,EACzCH,EAAehB,EAASmB,CAAY,EAE1CnB,EAASmB,CAAY,EAAI,IAAIZ,IAAoB,CAC/C,IAAIR,EAAMqB,EAAa,MAAMpB,EAAUO,CAAI,EAC3C,OAAIR,IAAQ,KACVA,EAAMiB,EAAa,MAAMhB,EAAUO,CAAI,GAEjCR,GAAO,EACjB,CACF,CACAe,EAAK,SAAWd,CAClB,CACA,GAAIa,EAAK,UAAW,CAClB,IAAMQ,EAAY,KAAK,SAAS,WAAa,IAAIzI,GAAyC,KAAK,QAAQ,EACvG,QAAWsI,KAAQL,EAAK,UAAW,CACjC,GAAI,EAAEK,KAAQG,GACZ,MAAM,IAAI,MAAM,cAAcH,CAAI,kBAAkB,EAEtD,GAAI,CAAC,UAAW,QAAS,OAAO,EAAE,SAASA,CAAI,EAE7C,SAEF,IAAMI,EAAgBJ,EAChBK,EAAgBV,EAAK,UAAUS,CAAa,EAC5CE,EAAgBH,EAAUC,CAAa,EAG7CD,EAAUC,CAAa,EAAI,IAAIf,IAAoB,CACjD,IAAIR,EAAMwB,EAAc,MAAMF,EAAWd,CAAI,EAC7C,OAAIR,IAAQ,KACVA,EAAMyB,EAAc,MAAMH,EAAWd,CAAI,GAEpCR,CACT,CACF,CACAe,EAAK,UAAYO,CACnB,CAGA,GAAIR,EAAK,MAAO,CACd,IAAMY,EAAQ,KAAK,SAAS,OAAS,IAAIxB,GACzC,QAAWiB,KAAQL,EAAK,MAAO,CAC7B,GAAI,EAAEK,KAAQO,GACZ,MAAM,IAAI,MAAM,SAASP,CAAI,kBAAkB,EAEjD,GAAI,CAAC,UAAW,OAAO,EAAE,SAASA,CAAI,EAEpC,SAEF,IAAMQ,EAAYR,EACZS,EAAYd,EAAK,MAAMa,CAAS,EAChCE,EAAWH,EAAMC,CAAS,EAC5BzB,GAAO,iBAAiB,IAAIiB,CAAI,EAElCO,EAAMC,CAAS,EAAKG,GAAiB,CACnC,GAAI,KAAK,SAAS,OAAS5B,GAAO,6BAA6B,IAAIiB,CAAI,EACrE,OAAQ,SAAW,CACjB,IAAMnB,EAAM,MAAM4B,EAAU,KAAKF,EAAOI,CAAG,EAC3C,OAAOD,EAAS,KAAKH,EAAO1B,CAAG,CACjC,GAAG,EAGL,IAAMA,EAAM4B,EAAU,KAAKF,EAAOI,CAAG,EACrC,OAAOD,EAAS,KAAKH,EAAO1B,CAAG,CACjC,EAGA0B,EAAMC,CAAS,EAAI,IAAInB,IAAoB,CACzC,GAAI,KAAK,SAAS,MAChB,OAAQ,SAAW,CACjB,IAAIR,EAAM,MAAM4B,EAAU,MAAMF,EAAOlB,CAAI,EAC3C,OAAIR,IAAQ,KACVA,EAAM,MAAM6B,EAAS,MAAMH,EAAOlB,CAAI,GAEjCR,CACT,GAAG,EAGL,IAAIA,EAAM4B,EAAU,MAAMF,EAAOlB,CAAI,EACrC,OAAIR,IAAQ,KACVA,EAAM6B,EAAS,MAAMH,EAAOlB,CAAI,GAE3BR,CACT,CAEJ,CACAe,EAAK,MAAQW,CACf,CAGA,GAAIZ,EAAK,WAAY,CACnB,IAAMiB,EAAa,KAAK,SAAS,WAC3BC,EAAiBlB,EAAK,WAC5BC,EAAK,WAAa,SAASnI,EAAO,CAChC,IAAMyH,EAAyB,CAAC,EAChC,OAAAA,EAAO,KAAK2B,EAAe,KAAK,KAAMpJ,CAAK,CAAC,EACxCmJ,GACF3B,GAAWC,EAAQ0B,EAAW,KAAK,KAAMnJ,CAAK,CAAC,EAE1CyH,CACT,CACF,CAEA,KAAK,SAAW,CAAE,GAAG,KAAK,SAAU,GAAGU,CAAK,CAC9C,CAAC,EAEM,IACT,CAEA,WAAW5R,EAAkD,CAC3D,OAAA,KAAK,SAAW,CAAE,GAAG,KAAK,SAAU,GAAGA,CAAI,EACpC,IACT,CAEA,MAAMsJ,EAAaK,EAAuD,CACxE,OAAOqE,EAAO,IAAI1E,EAAKK,GAAW,KAAK,QAAQ,CACjD,CAEA,OAAOd,EAAiBc,EAAuD,CAC7E,OAAO8G,EAAQ,MAAoC5H,EAAQc,GAAW,KAAK,QAAQ,CACrF,CAEQ,cAAcmJ,EAAoB,CAuExC,MA/D+B,CAACxJ,EAAaK,IAAsE,CACjH,IAAMoJ,EAAU,CAAE,GAAGpJ,CAAQ,EACvB3J,EAAM,CAAE,GAAG,KAAK,SAAU,GAAG+S,CAAQ,EAErCC,EAAa,KAAK,QAAQ,CAAC,CAAChT,EAAI,OAAQ,CAAC,CAACA,EAAI,KAAK,EAGzD,GAAI,KAAK,SAAS,QAAU,IAAQ+S,EAAQ,QAAU,GACpD,OAAOC,EAAW,IAAI,MAAM,oIAAoI,CAAC,EAInK,GAAI,OAAO1J,EAAQ,KAAeA,IAAQ,KACxC,OAAO0J,EAAW,IAAI,MAAM,gDAAgD,CAAC,EAE/E,GAAI,OAAO1J,GAAQ,SACjB,OAAO0J,EAAW,IAAI,MAAM,wCACxB,OAAO,UAAU,SAAS,KAAK1J,CAAG,EAAI,mBAAmB,CAAC,EAQhE,GALItJ,EAAI,QACNA,EAAI,MAAM,QAAUA,EACpBA,EAAI,MAAM,MAAQ8S,GAGhB9S,EAAI,MACN,OAAQ,SAAW,CACjB,IAAMiT,EAAejT,EAAI,MAAQ,MAAMA,EAAI,MAAM,WAAWsJ,CAAG,EAAIA,EAE7DT,EAAS,MADD7I,EAAI,MAAQ,MAAMA,EAAI,MAAM,aAAa8S,CAAS,EAAKA,EAAY9E,EAAO,IAAMA,EAAO,WAC1EiF,EAAcjT,CAAG,EACtCkT,EAAkBlT,EAAI,MAAQ,MAAMA,EAAI,MAAM,iBAAiB6I,CAAM,EAAIA,EAC3E7I,EAAI,YACN,MAAM,QAAQ,IAAI,KAAK,WAAWkT,EAAiBlT,EAAI,UAAU,CAAC,EAGpE,IAAM0B,EAAO,MADE1B,EAAI,MAAQ,MAAMA,EAAI,MAAM,cAAc8S,CAAS,EAAKA,EAAYrC,EAAQ,MAAQA,EAAQ,aACjFyC,EAAiBlT,CAAG,EAC9C,OAAOA,EAAI,MAAQ,MAAMA,EAAI,MAAM,YAAY0B,CAAI,EAAIA,CACzD,GAAG,EAAE,MAAMsR,CAAU,EAGvB,GAAI,CACEhT,EAAI,QACNsJ,EAAMtJ,EAAI,MAAM,WAAWsJ,CAAG,GAGhC,IAAIT,GADU7I,EAAI,MAAQA,EAAI,MAAM,aAAa8S,CAAS,EAAKA,EAAY9E,EAAO,IAAMA,EAAO,WAC5E1E,EAAKtJ,CAAG,EACvBA,EAAI,QACN6I,EAAS7I,EAAI,MAAM,iBAAiB6I,CAAM,GAExC7I,EAAI,YACN,KAAK,WAAW6I,EAAQ7I,EAAI,UAAU,EAGxC,IAAI0B,GADW1B,EAAI,MAAQA,EAAI,MAAM,cAAc8S,CAAS,EAAKA,EAAYrC,EAAQ,MAAQA,EAAQ,aACnF5H,EAAQ7I,CAAG,EAC7B,OAAIA,EAAI,QACN0B,EAAO1B,EAAI,MAAM,YAAY0B,CAAI,GAE5BA,CACT,OAAQyR,EAAG,CACT,OAAOH,EAAWG,CAAU,CAC9B,CACF,CAGF,CAEQ,QAAQC,EAAiBC,EAAgB,CAC/C,OAAQF,GAAuC,CAG7C,GAFAA,EAAE,SAAW;2DAETC,EAAQ,CACV,IAAME,EAAM,iCACR5N,EAAmByN,EAAE,QAAU,GAAI,EAAI,EACvC,SACJ,OAAIE,EACK,QAAQ,QAAQC,CAAG,EAErBA,CACT,CAEA,GAAID,EACF,OAAO,QAAQ,OAAOF,CAAC,EAEzB,MAAMA,CACR,CACF,CACF,ECnYMI,GAAiB,IAAInC,GA2BpB,SAASoC,EAAOlK,EAAatJ,EAAsD,CACxF,OAAOuT,GAAe,MAAMjK,EAAKtJ,CAAG,CACtC,CA4BAwT,EAAO,QACLA,EAAO,WAAa,SAAS7J,EAAwB,CACnD,OAAA4J,GAAe,WAAW5J,CAAO,EACjC6J,EAAO,SAAWD,GAAe,SACjCjU,GAAekU,EAAO,QAAQ,EACvBA,CACT,EAKFA,EAAO,YAAcpU,GAErBoU,EAAO,SAAWnU,GAclB,SAASoU,MAAgBpC,EAAyB,CAChD,OAAAkC,GAAe,IAAI,GAAGlC,CAAI,EAC1BmC,EAAO,SAAWD,GAAe,SACjCjU,GAAekU,EAAO,QAAQ,EACvBA,CACT,CAEAA,EAAO,IAAMC,GAMbD,EAAO,WAAa,SAAS3K,EAA8ByI,EAA2D,CACpH,OAAOiC,GAAe,WAAW1K,EAAQyI,CAAQ,CACnD,EAYAkC,EAAO,YAAcD,GAAe,YAKpCC,EAAO,OAAS/C,EAChB+C,EAAO,OAAS/C,EAAQ,MACxB+C,EAAO,SAAWjE,GAClBiE,EAAO,aAAehD,GACtBgD,EAAO,MAAQxF,EACfwF,EAAO,MAAQxF,EAAO,IACtBwF,EAAO,UAAY9J,GACnB8J,EAAO,MAAQzC,GACfyC,EAAO,MAAQA,EAER,IAAM7J,GAAU6J,EAAO,QACjBE,GAAaF,EAAO,WACpBZ,GAAaY,EAAO,WAOpBG,GAAcH,EAAO,YAT3B,IAWMI,GAASC,EAAQ,MACjBC,GAAQC,EAAO,ICjI5B,IAAMC,GAAM,uCACNC,GAAQ,CACZ,KAAM,iBAAkB,KAAM,eAAgB,QAAS,yCACvD,UAAW,qCAAsC,KAAM,qDACvD,KAAM,uCAAwC,OAAQ,qCAAsC,OAAQ,+BACtG,EAGA,SAASC,GAAKC,EAAM,CAClB,IAAMC,EAAM,SAAS,gBAAgB,6BAA8B,KAAK,EACxEA,EAAI,aAAa,UAAW,WAAW,EACvCA,EAAI,aAAa,cAAe,MAAM,GAClCD,IAAS,QAAUA,IAAS,SAAQC,EAAI,aAAa,QAAS,WAAW,EAC7E,IAAMC,EAAO,SAAS,gBAAgB,6BAA8B,MAAM,EAC1E,OAAAA,EAAK,aAAa,IAAKJ,GAAyCE,CAAK,CAAC,EACtEC,EAAI,OAAOC,CAAI,EACRD,CACT,CAKO,SAASE,GAAWC,EAAMC,EAAS,CACxC,IAAIC,EAASD,EAAQ,OAAO,QAAQ,SAAU;AAAA,CAAI,EAC9CE,EAAOC,GAAUF,CAAM,EACvBG,EAAK,EAAGC,EAAS,EAEjBC,EAAQ,CAAC,EACPC,EAAO,OAAOP,EAAQ,MAAQE,EAAK,SAAS,MAAQ,SAAS,gBAAgB,MAAQ,IAAI,GAAK,KAC9FM,EAAM,OAAOR,EAAQ,KAAOE,EAAK,SAAS,MAAQV,GAAI,KAAKe,CAAI,EAAI,MAAQ,MAAM,EACjFE,EAAQ,CAAE,GAAGC,GAAWH,CAAI,EAAG,GAAGP,EAAQ,OAAQ,EAClDW,EAAS,IAAI,KAAK,aAAaJ,CAAI,EAAE,OACrCK,EAAO,WAAW,8BAA8B,EAClDC,EAA0C,QACxCC,EAAU,KAAK,IAAI,EAEzBf,EAAK,UAAU,IAAI,MAAM,EACzBA,EAAK,KAAOQ,EACZR,EAAK,IAAMS,EACX,IAAMO,EAAQC,EAAE,MAAO,CAAE,MAAO,aAAc,SAAU,EAAG,KAAM,SAAU,uBAAwBP,EAAM,SAAU,aAAcA,EAAM,IAAK,CAAC,EACvIQ,EAAQD,EAAE,OAAQ,CAAE,MAAO,aAAc,YAAa,QAAS,CAAC,EAChEE,EAAS,CAAuBvB,EAA4BwB,EAAiCC,IAAQ,CACzG,IAAMC,EAAIL,EAAE,SAAU,CAAE,KAAM,SAAU,aAAcG,EAAO,WAAYxB,CAAK,EAAG,CAACD,GAAKC,CAAI,CAAC,CAAC,EAC7F,OAAA0B,EAAE,iBAAiB,QAASD,CAAG,EACxBC,CACT,EACMC,EAAOJ,EAAO,OAAQT,EAAM,SAAU,IAAMc,EAAK,EAAE,CAAC,EACpDC,EAAON,EAAO,OAAQT,EAAM,KAAM,IAAMc,EAAK,CAAC,CAAC,EAC/CE,EAAaP,EAAO,OAAQT,EAAM,KAAM,IAAMiB,EAAO,YAAY,CAAC,EAClEC,EAAkBT,EAAO,YAAaT,EAAM,UAAW,IAAMiB,EAAO,eAAe,CAAC,EACpFE,EAAiBV,EAAO,OAAQT,EAAM,SAAU,IAAMiB,EAAO,aAAa,CAAC,EAC3EG,EAAMb,EAAE,MAAO,CAAE,MAAO,UAAW,EAAG,CAACM,EAAML,EAAOO,EAAMR,EAAE,OAAQ,CAAE,MAAO,UAAW,CAAC,EAC7FY,EAAgBD,EAAiB3B,EAAQ,WAAa,GAAQ,KAAOyB,EACrEP,EAAO,SAAUT,EAAM,OAAQ,IAAM,CAAEI,EAASA,IAAW,OAAS,QAAU,OAAQiB,EAAU,CAAE,CAAC,EACnG9B,EAAQ,SAAWkB,EAAO,SAAUT,EAAM,OAAQ,IAAMT,EAAQ,WAAW+B,EAAI,CAAC,EAAI,KACpF,SAAS,kBAAoBb,EAAO,UAAWT,EAAM,QAAS,IAAMuB,GAAQ,CAAC,EAAI,IAAI,CAAC,EAClFC,EAAgDjB,EAAE,WAAY,CAAE,MAAO,cAAe,WAAY,QAAS,aAAcP,EAAM,OAAQ,IAAK,MAAO,CAAC,EACpJyB,EAAUlB,EAAE,MAAO,CAAE,MAAO,WAAY,CAAC,EACzCmB,EAAQnB,EAAE,MAAO,CAAE,MAAO,aAAc,IAAK,OAAQ,aAAcP,EAAM,KAAM,CAAC,EAChF2B,EAAQpB,EAAE,OAAQ,CAAE,MAAO,YAAa,CAAC,EACzCqB,EAAYrB,EAAE,MAAO,CAAE,MAAO,gBAAiB,EAAG,CAACkB,EAASC,CAAK,CAAC,EACxEpC,EAAK,gBAAgBkC,EAAWlB,EAAOsB,EAAWR,CAAG,EACrDA,EAAI,aAAaO,EAAOP,EAAI,cAAc,WAAW,CAAC,EAGtD,IAAIS,EAAuC,CAAC,EACtCC,GAAQ,IAAM,CAClB,IAAMC,EAASC,GAAUzC,EAAQ,IAAKE,EAAK,SAAS,GAAG,EACvD,OAAAoC,EAAcE,EAAO,SACdA,EAAO,GAChB,EAEA,SAASV,GAAY,CACnBY,GAAQ,IAAMH,GAAM,EACpB,IAAMI,EAASC,GAAS1C,EAAK,SAAUwC,GAAQ,IAAI,MAAM,EACnDG,EAAUC,GAASH,EAAQ9B,CAAM,EACjCkC,EAAiCC,GAAUA,EAAM,IAAKC,GAAO,WAAW,KAAKA,CAAC,EAAIA,EAAI,IAAIA,EAAE,QAAQ,SAAU,EAAE,CAAC,GAAI,EAAE,KAAK,IAAI,EAChIC,EAAQP,EAAO,MAAQ,CAAE,QAASI,EAAMJ,EAAO,MAAM,OAAO,EAAG,KAAMI,EAAMJ,EAAO,MAAM,IAAI,CAAE,EAAIQ,GAAOR,EAAO,KAAK,EAC3H,OAAW,CAAChD,EAAMyD,CAAK,IAAK,OAAO,QAAQ,CACzC,MAAOP,EAAQ,MAAO,IAAKA,EAAQ,IAAK,MAAOA,EAAQ,MAAO,KAAMA,EAAQ,KAAM,QAASA,EAAQ,QACnG,KAAMF,EAAO,QAAS,UAAWE,EAAQ,UAAW,KAAMA,EAAQ,KAAM,QAASK,EAAM,QAAS,KAAMA,EAAM,KAAM,OAAQ,GAAGP,EAAO,MAAM,KAC1I,GAAG,OAAO,YAAYE,EAAQ,OAAO,IAAI,CAACQ,EAAQC,IAAM,CAAC,UAAUA,EAAI,CAAC,GAAID,CAAM,CAAC,CAAC,CACtF,CAAC,EAAGtD,EAAK,MAAM,YAAY,UAAUJ,CAAI,GAAIyD,CAAK,EAClDrD,EAAK,QAAQ,OAASc,EACtBd,EAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQ,CAAE,OAAAc,EAAQ,QAAAgC,EAAS,OAAAF,CAAO,CAAE,CAAC,CAAC,CAC5F,CACA,IAAMY,GAAe,IAAM,CACzB,IAAMC,EAAQxD,EAAQ,QAAUE,EAAK,SAAS,aAAe,OAC7DW,EAAS2C,IAAU,QAAWA,IAAU,QAAU5C,EAAK,QAAW,OAAS,OAC7E,EAGM8B,GAAU,CACd,OAAQ1C,EAAQ,QAAU,CAAC,EAAG,QAASA,EAAQ,UAAayD,GAAQA,GAAM,SAAUzD,EAAQ,UAAY,OAAQ,OAASsD,GAAM3C,EAAO2C,CAAC,EAAG,MAAO,EAAG,IAAKb,GAAU,EAAE,IACrK,IAAKzC,EAAQ,MAAS0D,GAAa,IAAIC,EAAM,CAAE,IAAK,EAAK,CAAC,EAAE,IAAID,CAAQ,GAAI,MAAOjD,EAAM,KAC3F,EAEA,SAASmD,IAAO,CACdlB,GAAQ,MAAQxC,EAAK,OAAO,OAC5BI,EAAQJ,EAAK,OAAO,IAAK2D,GAAUC,GAAYD,EAAOnB,EAAO,CAAC,EAC9D,OAAW,CAACqB,EAAG,CAAE,QAAAC,CAAQ,CAAC,IAAK1D,EAAM,QAAQ,EAC3C0D,EAAQ,aAAa,aAAcvD,EAAM,MAAM,QAAQ,MAAOE,EAAOoD,EAAI,CAAC,CAAC,EAAE,QAAQ,UAAWpD,EAAOL,EAAM,MAAM,CAAC,CAAC,EACrH0D,EAAQ,iBAAiB,QAAS,IAAM,CAAMjE,EAAK,UAAU,SAAS,aAAa,IAAK2B,EAAO,aAAa,EAAGuC,EAAGF,EAAG,CAAC,EAAI,CAAC,EAE7HhD,EAAM,gBAAgB,GAAGT,EAAM,IAAI,CAAC,CAAE,QAAA0D,CAAQ,IAAMA,CAAO,CAAC,EAC5D5D,EAAK,KAAK,IAAIA,EAAIE,EAAM,OAAS,CAAC,EAClC4D,EAAK,EACL,sBAAsB,IAAMC,EAAO,CAAC,CACtC,CAGA,SAASA,GAAS,CAChB,OAAW,CAAE,QAAAH,CAAQ,IAAK1D,EAAO8D,EAAIJ,CAAO,CAC9C,CAEA,SAASI,EAAIP,EAAO,CAClB,IAAIQ,EAAO,GACX,QAAWC,KAAgDT,EAAM,iBAAiB,YAAY,EAAI,CAChG,IAAIU,EAAQ,EAEZ,IADAD,EAAK,MAAM,YAAY,aAAc,GAAG,EACjCA,EAAK,aAAeA,EAAK,aAAe,GAAKC,EAAQ,IAAKD,EAAK,MAAM,YAAY,aAAc,OAAQC,EAAQ,KAAK,OAAOA,EAAQ,KAAQ,GAAG,EAAI,GAAI,CAAC,EAC1JD,EAAK,aAAeA,EAAK,aAAe,IAAGD,EAAO,GACxD,CACIA,EAAMR,EAAM,QAAQ,SAAW,OAC9B,OAAOA,EAAM,QAAQ,QAC5B,CAEA,SAASK,GAAO,CACd,OAAW,CAACH,EAAG,CAAE,QAAAC,EAAS,MAAAQ,CAAM,CAAC,IAAKlE,EAAM,QAAQ,EAAG,CACrD0D,EAAQ,UAAU,OAAO,WAAYD,IAAM3D,CAAE,EAC7C4D,EAAQ,MAAQD,IAAM3D,GAAM,CAACL,EAAK,UAAU,SAAS,aAAa,EAClE,QAAW0E,KAAOT,EAAQ,iBAAiB,YAAY,EAAGS,EAAI,UAAU,OAAO,QAASV,EAAI3D,GAAO2D,IAAM3D,GAAM,OAAOqE,EAAI,aAAa,WAAW,CAAC,GAAKpE,GAAWmE,IAAU,CAAC,CAChL,CACAvD,EAAM,YAAc,GAAGN,EAAOP,EAAK,CAAC,CAAC,MAAMO,EAAOL,EAAM,MAAM,CAAC,GAC/DgB,EAAK,gBAAgB,WAAYlB,IAAO,GAAKC,IAAW,CAAC,EACzDmB,EAAK,gBAAgB,WAAYpB,GAAME,EAAM,OAAS,GAAKD,IAAWC,EAAMF,CAAE,GAAG,OAAS,EAAE,EAC5F+B,EAAM,YAAcjC,EAAK,OAAOE,CAAE,GAAG,OAASK,EAAM,QACpD,IAAMiE,EAAYxE,EAAK,OAAOE,EAAK,CAAC,EACpC8B,EAAQ,gBAAgBlB,EAAE,OAAQ,CAAC,EAAG,CAAC0D,EAAYjE,EAAM,OAASA,EAAM,IAAI,CAAC,EAAG,GAAIiE,EAAY,CAACZ,GAAYY,EAAWhC,EAAO,EAAE,OAAO,EAAI,CAAC,CAAE,EAC/I3C,EAAK,cAAc,IAAI,YAAY,YAAa,CAAE,OAAQ,CAAE,GAAAK,EAAI,KAAMC,CAAO,CAAE,CAAC,CAAC,CACnF,CAGA,SAASkB,EAAKoD,EAAI,CAChB,IAAMH,EAAQlE,EAAMF,CAAE,GAAG,OAAS,EAClC,GAAIuE,EAAK,GAAKtE,EAASmE,EAAO,CAAEnE,IAAU6D,EAAK,EAAG,MAAO,CACzD,GAAIS,EAAK,GAAKtE,EAAS,EAAG,CAAEA,IAAU6D,EAAK,EAAG,MAAO,CACrD,IAAMU,EAAKxE,EAAKuE,EACZC,EAAK,GAAKA,GAAMtE,EAAM,QAC1B2D,EAAGW,EAAID,EAAK,EAAI,EAAIrE,EAAMsE,CAAE,EAAE,KAAK,CACrC,CAGA,SAASX,EAAGW,EAAIC,EAAS,EAAG,CAC1B,GAAID,IAAOxE,EAAI,CAAEC,EAASwE,EAAQX,EAAK,EAAG,MAAO,CACjD,IAAMY,EAAUF,EAAKxE,EACf2E,EAAW7E,EAAK,OAAO4E,EAAUF,EAAKxE,CAAE,GAAG,UAAY,CAAC,EACxD4E,EAAQ,OAAOD,EAAS,YAAc7E,EAAK,SAAS,YAAc,MAAM,EAExE,CAAC+E,EAAOC,CAAM,EAAIF,EAAM,MAAM,GAAG,EAAE,IAAKG,IAASA,GAAK,KAAK,CAAC,EAC9DC,EAAON,EAAUG,EAAQC,GAAUD,EACnCzE,IAAQ,QAAO4E,EAAOA,EAAK,QAAQ,iBAAkB,CAACC,GAAGC,KAAUA,KAAS,OAAS,SAAW,OAAQ,GACxGF,IAAS,oBAAmBA,EAAO,SACvC,IAAMG,GAAS,IAAM,CAAEnF,EAAKwE,EAAIvE,EAASwE,EAAYO,IAAS,SAASzF,EAAKW,EAAMsE,CAAE,EAAE,OAAO,EAAGV,EAAK,CAAE,EACjGsB,GAAU,WAAW,kCAAkC,EAAE,QAC/D,GAAI,CAAC,SAAS,qBAAuBJ,IAAS,QAAUI,IAAWzF,EAAK,UAAU,SAAS,aAAa,EAAG,OAAOwF,GAAO,EACrHH,IAAS,SAASzF,EAAKW,EAAMF,CAAE,EAAE,QAASE,EAAMsE,CAAE,EAAE,OAAO,EAC/D,SAAS,gBAAgB,QAAQ,eAAiBQ,EAClD,IAAMK,GAAa,SAAS,oBAAoBF,EAAM,EAEtDE,GAAW,MAAM,MAAM,IAAM,CAAC,CAAC,EAC/BA,GAAW,SAAS,QAAQ,IAAM,CAChC,OAAO,SAAS,gBAAgB,QAAQ,eACxC,OAAW,CAAE,QAAAzB,EAAQ,IAAK1D,EAAO,QAAWmE,MAAOT,GAAQ,iBAAiB,cAAc,EAAiCS,GAAK,MAAM,eAAe,sBAAsB,EAAGA,GAAI,gBAAgB,YAAY,CAChN,CAAC,CACH,CAQA,SAAS9E,EAAKkE,EAAO6B,EAAQ,CAC3B,IAAMC,EAA8BC,GAAO,GAAGA,EAAG,OAAO,IAAIA,EAAG,UAAY,MAAQA,EAAG,aAAa,KAAK,GAAKA,EAAG,aAAe,IAAI,KAAK,EAAE,MAAM,EAAG,EAAE,CAAC,GAChJC,EAAoCC,GAAoC,CAAC,GAAGA,EAAE,iBAAiB,2EAA2E,CAAC,EACjL,GAAIJ,EAAQ,CACV,IAAMK,EAAQ,IAAI,IAAIF,EAAMH,CAAM,EAAE,IAAKE,GAAO,CAACD,EAAIC,CAAE,EAAGA,CAAE,CAAC,CAAC,EAC1DtC,EAAI,EACR,QAAWsC,KAAMC,EAAMhC,CAAK,EAAG,CAC7B,IAAMmC,EAAQD,EAAM,IAAIJ,EAAIC,CAAE,CAAC,EAC/B,GAAI,CAACI,GAASA,EAAM,QAAQ,OAASJ,EAAG,QAAQ,cAAc,EAAG,SACjE,IAAMK,GAAK,SAAS3C,GAAG,GACvBsC,EAAG,QAAQ,MAAQI,EAAM,QAAQ,MAAQC,GACzCL,EAAG,MAAM,YAAY,uBAAwBK,EAAE,CACjD,CACA,MACF,CACA,QAAWL,KAA8C/B,EAAM,iBAAiB,cAAc,EAAI,CAChG,IAAMoC,EAA4BL,EAAG,QAAQ,MAC7C,QAAWM,KAA+CnF,EAAM,iBAAiB,gBAAgBkF,CAAE,IAAI,EAAQC,IAAQN,GAAIM,EAAI,MAAM,eAAe,sBAAsB,EAC1KN,EAAG,MAAM,YAAY,uBAAwBK,CAAE,CACjD,CACF,CAGA,SAASvE,EAAOyE,EAAM,CACpB,QAAWC,IAAS,CAAC,aAAc,gBAAiB,aAAa,EAAOA,IAAUD,GAAMpG,EAAK,UAAU,OAAOqG,CAAK,EACnHrG,EAAK,UAAU,OAAOoG,CAAI,EAC1B1E,EAAW,aAAa,eAAgB,OAAO1B,EAAK,UAAU,SAAS,YAAY,CAAC,CAAC,EACrF4B,EAAgB,aAAa,eAAgB,OAAO5B,EAAK,UAAU,SAAS,eAAe,CAAC,CAAC,EAC7F6B,EAAe,aAAa,eAAgB,OAAO7B,EAAK,UAAU,SAAS,aAAa,CAAC,CAAC,EACtFA,EAAK,UAAU,SAAS,YAAY,IAAKkC,EAAU,MAAQhC,EAAQgC,EAAU,MAAM,GACvFiC,EAAK,EACL,sBAAsB,IAAMC,EAAO,CAAC,CACtC,CAEA,SAASnC,IAAU,CACjBjB,EAAM,oBAAoB,EAAE,KAAK,IAAMA,EAAM,MAAM,EAAG,IAAM,CAAC,CAAC,CAChE,CAGA,SAASsF,GAAUC,EAAM,CACvBrG,EAASqG,EAAK,QAAQ,SAAU;AAAA,CAAI,EACpCpG,EAAOC,GAAUF,CAAM,EACvB6B,EAAU,EACV8B,GAAK,EACL5D,EAAQ,WAAWC,CAAM,CAC3B,CAGA,IAAIsG,GAAU,EACdtE,EAAU,iBAAiB,QAAUuE,GAAU,CACdA,EAAO,cACtC,aAAaD,EAAO,EACpBA,GAAU,WAAW,IAAMF,GAAUpE,EAAU,KAAK,EAAG,GAAG,EAC5D,CAAC,EACD,IAAMwE,GAAc,IAAM,CACxB,IAAMC,EAAQzE,EAAU,eAClB0E,EAAQzG,EAAK,OAAO,UAAW2D,GAAU6C,GAAS7C,EAAM,OAAS6C,GAAS7C,EAAM,IAAM,CAAC,EACzF8C,GAAS,GAAKA,IAAUvG,IAAMA,EAAKuG,EAAOtG,EAASC,EAAMqG,CAAK,GAAG,OAAS,EAAGzC,EAAK,EACxF,EACAjC,EAAU,iBAAiB,QAASwE,EAAW,EAC/CxE,EAAU,iBAAiB,QAASwE,EAAW,EAG/C1F,EAAM,iBAAiB,WAAayF,GAAU,CAC5C,GAAIxG,EAAQ,WAAa,IAAS,SAAS,kBAAmB,OAC9D,IAAM4G,EAAoEJ,EAAM,OAAQ,QAAQ,aAAa,EAC7G,GAAI,CAACI,EAAQ,OACb,GAAM,CAACC,EAAMjC,CAAE,EAA2BgC,EAAO,QAAQ,KAAM,MAAM,GAAG,EAAE,IAAI,MAAM,EACpFA,EAAO,gBAAkB,OACzBA,EAAO,MAAM,EACb,IAAME,EAA+BC,GAAS,CAC5CH,EAAO,oBAAoB,UAAWjB,CAAG,EACzCiB,EAAO,oBAAoB,OAAQI,CAAI,EACvCJ,EAAO,gBAAkB,QACzB,IAAMnG,GAAQwG,GAAWL,CAAM,EAC3BG,GAAQtG,KAAUR,EAAO,MAAM4G,EAAMjC,CAAE,EAAGyB,GAAUpG,EAAO,MAAM,EAAG4G,CAAI,EAAIpG,GAAQR,EAAO,MAAM2E,CAAE,CAAC,EACnGhB,GAAK,CACZ,EACM+B,EAAoCuB,GAAM,CAC1CA,EAAE,cACFA,EAAE,MAAQ,SAAW,CAACA,EAAE,WAAYA,EAAE,eAAe,EAAGJ,EAAK,EAAI,GACjEI,EAAE,MAAQ,WAAYA,EAAE,eAAe,EAAGJ,EAAK,EAAK,GAC1D,EACME,EAAO,IAAMF,EAAK,EAAI,EAC5BF,EAAO,iBAAiB,UAAWjB,CAAG,EACtCiB,EAAO,iBAAiB,OAAQI,CAAI,CACtC,CAAC,EAGDjH,EAAK,iBAAiB,UAAYyG,GAAU,CAC1C,IAAMI,EAAqCJ,EAAM,OACjD,GAAII,EAAO,mBAAqBA,IAAW3E,GAAc2E,EAAO,UAAY,WAAaJ,EAAM,MAAQ,KAAOA,EAAM,MAAQ,SAAW,EAChIA,EAAM,SAAWA,EAAM,UAAYA,EAAM,MAAQ,MAAOA,EAAM,eAAe,EAAGxG,EAAQ,SAASC,CAAM,GAC5G,MACF,CACA,IAAM6E,EAAUtE,IAAQ,MAAQ,YAAc,aAAc2G,EAAW3G,IAAQ,MAAQ,aAAe,YACtG,GAAIgG,EAAM,QAAUA,EAAM,SAAWA,EAAM,QAAS,EAC7CA,EAAM,SAAWA,EAAM,UAAYA,EAAM,MAAQ,MAAOA,EAAM,eAAe,EAAGxG,EAAQ,SAASC,CAAM,GAC5G,MACF,CAKA,IAAMmB,EAJkD,CACtD,CAAC0D,CAAO,EAAG,IAAMvD,EAAK,CAAC,EAAG,CAAC4F,CAAQ,EAAG,IAAM5F,EAAK,EAAE,EAAG,UAAW,IAAMA,EAAK,CAAC,EAAG,QAAS,IAAMA,EAAK,EAAE,EAAG,SAAU,IAAMA,EAAK,CAAC,EAAG,OAAQ,IAAMA,EAAK,EAAE,EAAG,IAAK,IAAMA,EAAK,CAAC,EAC3K,KAAM,IAAM0C,EAAG,CAAC,EAAG,IAAK,IAAMA,EAAG3D,EAAM,OAAS,EAAGA,EAAM,GAAG,EAAE,GAAG,OAAS,CAAC,EAAG,EAAG0B,GAAS,EAAG,IAAMN,EAAO,eAAe,EAAG,EAAG,IAAMA,EAAO,aAAa,EAAG,EAAG,IAAMA,EAAO,YAAY,CAC1L,EACiB8E,EAAM,GAAG,EACrBpF,IACLoF,EAAM,eAAe,EACrBpF,EAAI,EACN,CAAC,EACDL,EAAM,iBAAiB,QAAUyF,GAAU,CACrC,SAAS,mBAAqB,CAA0BA,EAAM,OAAQ,QAAQ,kBAAkB,GAAIjF,EAAK,CAAC,CAChH,CAAC,EACD,IAAI6F,GAAQ,EACZrG,EAAM,iBAAiB,aAAeyF,GAAU,CAAEY,GAAQZ,EAAM,QAAQ,CAAC,EAAE,OAAQ,EAAG,CAAE,QAAS,EAAK,CAAC,EACvGzF,EAAM,iBAAiB,WAAayF,GAAU,CAC5C,IAAMa,EAAKb,EAAM,eAAe,CAAC,EAAE,QAAUY,GACzC,KAAK,IAAIC,CAAE,EAAI,IAAI9F,EAAM8F,EAAK,IAAQ7G,IAAQ,OAAS,EAAI,EAAE,CACnE,CAAC,EACDI,EAAK,iBAAiB,SAAU,IAAM,CAAE2C,GAAa,EAAGzB,EAAU,CAAE,CAAC,EACrE,IAAMwF,GAAO,YAAY,IAAM,CAC7B,IAAMxB,EAAI,KAAK,OAAO,KAAK,IAAI,EAAIhF,GAAW,GAAI,EAClDsB,EAAM,YAAcrC,EAAK,UAAU,SAAS,eAAe,EAAI,GAAG,OAAO,KAAK,MAAM+F,EAAI,EAAE,CAAC,EAAE,SAAS,EAAG,GAAG,CAAC,IAAI,OAAOA,EAAI,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,GAAK,EACvJ,EAAG,GAAI,EAEPvC,GAAa,EACbzB,EAAU,EACV8B,GAAK,EACL,SAAS,OAAO,MAAM,KAAK,IAAMO,EAAO,CAAC,EAEzC,IAAMpC,GAAO,CACX,KAAAhC,EAAM,MAAAgB,EAAO,IAAI,QAAS,CAAE,OAAOd,CAAO,EAAG,IAAI,MAAO,CAAE,OAAOC,CAAK,EAAG,IAAI,IAAK,CAAE,OAAOE,CAAG,EAAG,IAAI,QAAS,CAAE,OAAOS,CAAO,EAAG,IAAI,KAAM,CAAE,OAAO6B,GAAQ,GAAI,EAAG,IAAI,aAAc,CAAE,OAAOJ,CAAY,EAAG,KAAA/B,EAAM,IAAAC,EACnN,OAAQ,IAAMF,EAAM,IAAI,CAAC,CAAE,QAAA0D,CAAQ,IAAMA,CAAO,EAAG,UAAAqC,GAAW,GAAApC,EAAI,OAAAvC,EAAQ,QAAAM,GAAS,OAAAmC,EACnF,UAA4Cf,GAAU,CAAEvC,EAASuC,EAAOtB,EAAU,CAAE,EACpF,QAAS,IAAM,cAAcwF,EAAI,CACnC,EACA,OAAOvF,EACT,CAGO,SAASkF,GAAWM,EAAM,CAC/B,IAAIC,EAAM,GACV,QAAWC,KAASF,EAAK,WACvB,GAAIE,EAAM,WAAa,KAAK,UAAWD,IAAQC,EAAM,aAAe,IAAI,QAAQ,gBAAiB,MAAM,UAC9FA,aAAiB,YAAa,CACrC,IAAMC,EAAQT,GAAWQ,CAAK,EAC9BD,GAAQ,CAAE,OAAQ,KAAKE,CAAK,KAAM,EAAG,KAAKA,CAAK,KAAM,GAAI,IAAIA,CAAK,IAAK,EAAG,IAAIA,CAAK,IAAK,KAAM,KAAKD,EAAM,WAAW,KAAM,IAAK,KAAKC,CAAK,KAAM,GAAI;AAAA,EACjJ,EAAG,IAAIA,CAAK,KAAKD,EAAM,aAAa,MAAM,GAAK,EAAE,GAAI,EAAGA,EAAM,OAAO,GAAKC,CAC9E,CAEF,OAAOF,EAAI,QAAQ,KAAM,GAAG,EAAE,QAAQ,OAAQ,EAAE,CAClD,CC5VA,IAAMG,GAAU,IAAI,IAGpB,SAASC,GAAOC,EAAKC,EAAQ,CAC3B,OAAKH,GAAQ,IAAIE,CAAG,GAAGF,GAAQ,IAAIE,EAAK,IAAI,QAAQ,CAACE,EAASC,IAAW,CACvE,IAAMC,EAAM,SAAS,cAAc,QAAQ,EAC3CA,EAAI,IAAMJ,EACVI,EAAI,OAAS,IAAMF,EAA4B,WAAYD,CAAM,CAAC,EAClEG,EAAI,QAAUD,EACd,SAAS,KAAK,OAAOC,CAAG,CAC1B,CAAC,CAAC,EACkCN,GAAQ,IAAIE,CAAG,CACrD,CAOO,IAAMK,GAAY,CAACC,EAAMC,EAAMC,EAASC,IAAU,kBAAkB,KAAKH,CAAI,EAAI,GAAGA,CAAI,GAAGC,CAAI,IAAIE,CAAI,GAAK,GAAGH,CAAI,GAAGC,CAAI,IAAIC,CAAO,IAAIC,CAAI,GAG7I,SAASC,GAAc,CAAE,KAAAJ,EAAM,KAAAK,EAAM,SAAAC,EAAW,CAAC,CAAE,EAAG,CAC3D,GAAM,CAAE,QAASC,EAAW,QAAS,KAAMC,EAAa,QAAS,EAAIF,EAE/DG,EAAS,IAAI,IAEfC,EAAU,KACdL,EAAK,iBAAiB,cAAgBM,GAAU,CAC9CD,EAAsCC,EAAO,OAAO,QACpD,QAAWC,KAAOH,EAAQG,EAAI,MAAM,UAAUC,EAAOD,EAAI,OAAQA,EAAI,GAAG,EAAG,EAAI,CACjF,CAAC,EAED,IAAMC,EAAS,CAAoBC,EAAmCC,IAAQ,CAC5E,IAAMC,EAAO,WAAW,iBAAiBD,CAAG,EAAE,QAAQ,GAAK,GACrDE,EAAM,iBAAiBF,CAAG,EAAE,YAAc,MAC1CG,EAAQ,KAAK,MAAMF,EAAO,EAAG,EAC7BG,EAAO,CAAoBC,EAA8BC,IAAWD,IAAU,OAAY,OAAY,CAACA,CAAK,EAAE,KAAK,EAAE,IAAKR,IAAS,CACvI,UAAW,CAAE,MAAOF,GAAS,MAAO,SAAUQ,CAAM,EAAG,SAAU,CAAE,UAAW,CAAE,MAAOR,GAAS,IAAK,CAAE,EAAG,UAAW,CAAE,UAAW,CAAE,MAAOA,GAAS,IAAK,CAAE,EAC3J,cAAe,CAAE,MAAOA,GAAS,MAAO,SAAUQ,CAAM,EAAG,GAAID,GAAOI,GAAUT,EAAI,OAAS,WAAa,CAAE,QAAS,EAAK,EAAI,CAAC,EAAI,GAAIK,GAAO,CAACI,EAAS,CAAE,SAAU,OAAQ,EAAI,CAAC,EAAI,GAAGT,CAC1L,EAAE,EACF,MAAO,CACL,MAAOF,GAAS,OAAQ,gBAAiB,cAAe,UAAW,CAAC,WAAW,kCAAkC,EAAE,QACnH,UAAW,CAAE,WAAY,iBAAiBL,CAAI,EAAE,iBAAiB,aAAa,GAAK,YAAa,MAAOK,GAAS,IAAK,SAAUQ,CAAM,EACrI,GAAGJ,EACH,MAAOA,EAAO,MAAQ,CAAE,GAAGA,EAAO,MAAO,UAAW,CAAE,MAAOJ,GAAS,IAAK,SAAU,KAAK,MAAMM,EAAO,EAAG,EAAG,GAAGF,EAAO,OAAO,SAAU,CAAE,EAAI,OAC9I,OAAQA,EAAO,OAAS,CAAE,UAAWI,EAAQ,IAAK,WAAYA,EAAO,GAAGJ,EAAO,OAAQ,UAAW,CAAE,MAAOJ,GAAS,IAAK,SAAUQ,EAAO,GAAGJ,EAAO,QAAQ,SAAU,CAAE,EAAI,OAC5K,KAAM,CAAE,aAAc,GAAM,KAAMI,EAAO,MAAOA,EAAO,IAAKJ,EAAO,MAAQE,EAAO,IAAME,EAAO,OAAQJ,EAAO,OAASE,EAAO,IAAME,EAAO,GAAGJ,EAAO,IAAK,EAC1J,MAAOK,EAAKL,EAAO,MAAO,EAAI,EAAG,MAAOK,EAAKL,EAAO,MAAO,EAAK,EAAG,QAAS,OAC5E,OAAQ,CAACA,EAAO,QAAU,CAAC,CAAC,EAAE,KAAK,EAAE,IAAKF,GAASA,EAAI,OAAS,MAAQ,CAAE,MAAO,CAAE,MAAOF,GAAS,IAAK,SAAUQ,CAAM,EAAG,GAAGN,CAAI,EAAIA,CAAI,CAC5I,CACF,EACA,MAAO,CAEL,MAAM,QAAQG,EAAKO,EAAQ,CACzB,IAAMR,EAAS,KAAK,MAAMQ,CAAM,EAC1BC,EAAU,MAAM9B,GAAOM,GAAUC,EAAM,UAAWO,EAAU,qBAAqB,EAAG,SAAS,EAC7FiB,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,aAClBA,EAAM,aAAa,OAAQ,KAAK,EAChCA,EAAM,aAAa,aAAc,OAAOV,EAAO,OAAO,MAAQ,EAAE,CAAC,EACjEC,EAAI,OAAOS,CAAK,EAChB,IAAMC,EAAQF,EAAQ,KAAKC,EAAO,KAAM,CAAE,SAAU,MAAO,OAAQ,SAAS,gBAAgB,MAAM,WAAW,IAAI,EAAI,KAAO,IAAK,CAAC,EAC5HZ,EAAM,CAAE,MAAAa,EAAO,OAAAX,EAAQ,IAAAC,CAAI,EACjCN,EAAO,IAAIG,CAAG,EACda,EAAM,UAAUZ,EAAOC,EAAQC,CAAG,CAAC,EACnC,IAAI,eAAe,IAAM,CAAEU,EAAM,OAAO,EAAGA,EAAM,UAAUZ,EAAOC,EAAQC,CAAG,EAAG,EAAI,CAAE,CAAC,EAAE,QAAQS,CAAK,EACtG,OAAO,OAAOT,EAAK,CAAE,MAAAU,CAAM,CAAC,CAC9B,EAMA,MAAM,QAAQV,EAAKO,EAAQ,CACzB,IAAMI,EAAO,MAAMjC,GAAOM,GAAUC,EAAM,OAAQQ,EAAY,qBAAqB,EAAG,MAAM,EACtFmB,EAAO,iBAAiBtB,CAAI,EAAE,iBAAiB,aAAa,GAAK,wBACjE,CAAE,IAAAuB,CAAI,EAAIF,EAAK,OAAOJ,EAAQ,CAAE,WAAYK,EAAM,MAAO,GAAO,OAAQ,GAAO,cAAe,GAAM,SAAU,KAAK,IAAI,IAAKZ,EAAI,YAAc,GAAG,CAAE,CAAC,EACpJc,EAAO,mCAAmCnB,GAAS,GAAG,iBAAiBA,GAAS,KAAK,gBAAgBA,GAAS,KAAK,mBAAmBA,GAAS,IAAI,uBAAuBA,GAAS,IAAI,kBAAkBA,GAAS,OAAO,kBAAkBA,GAAS,OAAO,gBAAgBiB,EAAK,QAAQ,SAAU,EAAE,CAAC,GACrSG,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,IAAMR,EACdQ,EAAQ,IAAM,oCAAoC,mBAAmBF,EAAI,QAAQ,kBAAmB,gBAAgBC,CAAI,WAAW,CAAC,CAAC,GACrI,IAAML,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,eAClBA,EAAM,OAAOM,CAAO,EACpBf,EAAI,OAAOS,CAAK,CAClB,CACF,CACF,CCjGO,IAAMO,GAAU,QCQhB,IAAMC,GAAO,0CACdC,GAAQ,aAGDC,GAAUC,GAAaA,EAAS,QAAQ,sBAAuB,SAAS,EAExEC,GAAYC,GAASA,EAAK,QAAQ,wBAAyB,OAAO,EAGzEC,GAAaD,GAASA,EAAK,QAAQ,KAAM,OAAO,EAAE,QAAQ,KAAM,QAAQ,EAAE,QAAQ,KAAM,MAAM,EAE9FE,GAAWF,GAASA,EAAK,QAAQ,KAAM,OAAO,EAAE,QAAQ,KAAM,MAAM,EAAE,QAAQ,KAAM,MAAM,EAOzF,SAASG,GAAWC,EAAM,CAC/B,GAAI,sBAAsB,KAAKA,CAAI,EAAG,MAAM,IAAI,MAAM,8CAA8C,EACpG,OAAOA,EAAK,QAAQ,qBAAsB,SAAS,CACrD,CAMO,SAASC,GAAaC,EAAM,CACjC,IAAMC,EAAKD,EAAK,QAAQX,EAAI,EAC5B,GAAIY,EAAK,EAAG,OAAO,KACnB,IAAMC,EAAOD,EAAKZ,GAAK,OACjBc,EAAMH,EAAK,MAAME,CAAI,EAAE,OAAO,YAAY,EAChD,OAAIC,EAAM,EAAU,KACbV,GAASO,EAAK,MAAME,EAAMA,EAAOC,CAAG,EAAE,QAAQ,MAAO,EAAE,EAAE,QAAQ,MAAO,EAAE,CAAC,CACpF,CAGO,IAAMC,GAAc,CAACC,EAAUC,KAAY,+CAA+CD,CAAO,gBAUjG,SAASE,GAAcf,EAAU,CAAE,MAAAgB,EAAQ,GAAI,KAAAC,EAAO,KAAM,IAAAC,EAAM,OAAQ,SAAAC,EAAW,CAAE,IAAKP,GAAY,CAAE,EAAG,KAAAQ,EAAM,UAAAC,EAAY,QAAQP,EAAO,EAAG,EAAI,CAAC,EAAG,CAC9J,IAAMQ,EAAOF,EAAO,eAAejB,GAAUiB,CAAI,CAAC,IAAM,GAClDG,EAAS,QAASJ,EAAW,gBAAgBhB,GAAUgB,EAAS,GAAG,CAAC,IAAIG,CAAI,cAAe,UAAUA,CAAI,IAAIjB,GAAWc,EAAS,IAAI,CAAC,aAC5I,MAAkB;AAAA,cACNhB,GAAUc,CAAI,CAAC,UAAUd,GAAUe,CAAG,CAAC;AAAA;AAAA;AAAA,kCAGnBf,GAAUkB,CAAS,CAAC;AAAA,SAC7CjB,GAAQY,CAAK,CAAC;AAAA;AAAA;AAAA,EAGrBnB,EAAI;AAAA,EACJE,GAAOC,CAAQ,CAAC;AAAA,EAChBF,EAAK;AAAA,EACLyB,CAAM;AAAA;AAAA,CAGR,CC7DA,IAAMC,GAAI,OAAQC,GAAI,IAChBC,GAAO,yDAGb,SAASC,EAAMC,EAAO,CACpB,IAAMC,EAAI,iDAAiD,KAAKD,CAAK,EACrE,OAAIC,EAAU,CAACA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAAE,IAAK,GAAM,KAAK,MAAM,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAC/GD,EAAM,QAAQ,IAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAG,CAAC,GAAK,QAC7D,CASA,eAAsBE,GAAOC,EAAM,CAAE,UAAAC,EAAW,MAAAC,CAAM,EAAG,CACvD,IAAMC,EAAO,IAAIF,EACjBE,EAAK,OAAS,cACdA,EAAK,MAAQH,EAAK,KAAK,OAAO,CAAC,GAAG,OAAS,GAC3CG,EAAK,QAAUH,EAAK,MAAQ,MAC5B,IAAMI,EAAY,iBAAiBJ,EAAK,IAAI,EACtCK,EAAmCC,GAAUA,EAAM,MAAM,GAAG,EAAE,IAAKC,GAAMA,EAAE,KAAK,EAAE,QAAQ,eAAgB,EAAE,CAAC,EAAE,KAAMA,GAAM,CAAC,qDAAqD,KAAKA,CAAC,CAAC,GAAK,QACnMJ,EAAK,MAAQ,CAAE,aAAcE,EAAUD,EAAU,iBAAiB,gBAAgB,CAAC,EAAG,aAAcC,EAAUD,EAAU,iBAAiB,aAAa,CAAC,CAAE,EACzJ,IAAMI,EAAS,CAAE,OAAQ,EAAG,OAAQ,EAAG,SAAU,EAAG,OAAQ,EAAG,aAAc,CAAE,EACzEC,EAAMT,EAAK,MAAQ,MACnBU,EAASV,EAAK,OAAO,EACrBW,EAAU,IAAI,IACdC,EAAc,CAAC,EAErB,OAAW,CAACC,EAAGC,CAAO,IAAKJ,EAAO,QAAQ,EAAG,CAC3C,IAAMK,EAAMD,EAAQ,sBAAsB,EACpCE,EAAKC,GAAIF,EAAI,MACbG,EAAgCC,GAAO,CAC3C,IAAMC,EAAID,EAAG,sBAAsB,EACnC,MAAO,CAAE,GAAIC,EAAE,KAAOL,EAAI,MAAQC,EAAI,GAAII,EAAE,IAAML,EAAI,KAAOC,EAAI,EAAGI,EAAE,MAAQJ,EAAI,EAAGI,EAAE,OAASJ,CAAG,CACrG,EAEMK,EAAiCF,GAAO,CAC5C,IAAMG,EAAOH,EAAG,QAAQ,YAAY,GAAKA,EACnC,CAAE,EAAAI,EAAG,EAAAC,CAAE,EAAIN,EAAMI,CAAI,EAAG,CAAE,EAAAG,EAAG,EAAAC,CAAE,EAAIR,EAAMC,CAAE,EAC3CQ,EAAM,iBAAiBL,CAAI,EAC3BM,GAAQ,WAAWD,EAAI,kBAAkB,EAAIX,EAAIa,GAAM,WAAWF,EAAI,gBAAgB,EAAIX,EAChG,MAAO,CAAE,EAAGO,GAAKd,EAAMoB,GAAMD,IAAQ,EAAAH,EAAG,EAAGD,EAAII,GAAQC,GAAK,EAAGH,EAAI,IAAK,CAC1E,EAEMI,EAAiCR,GAAU,iBAAiBA,CAAI,EAAE,iBAAmB,SAAW,SAAW,MAC3GS,EAA4BC,GAAO,KAAK,MAAMA,EAAKhB,EAAK,GAAK,EAAE,EAAI,GACnEiB,EAAQ,iBAAiBnB,CAAO,EAChCoB,EAASpB,EAAQ,QAAQ,QAAU,UACnCqB,EAAsC,CAAC,GAAGrB,EAAQ,iBAAiB,YAAY,CAAC,EAChFsB,EAAaD,EAAM,CAAC,GAAG,kBACvBE,EAAQD,GAAcA,EAAW,QAAQ,qBAAqB,EAAIA,EAAa,KAI/EE,EAAatC,EAAK,IAAI,QAAQkC,CAAM,EACpCK,EAAa,GAAGD,EAAaE,GAAQF,EAAYJ,EAAQlC,EAAK,IAAI,EAAIkC,CAAM,GAAGpB,EAAQ,UAAU,SAAS,mBAAmB,EAAI,UAAY,EAAE,GACrJ,GAAI,CAACH,EAAQ,IAAI4B,CAAU,EAAG,CAC5B,IAAME,EAAU,CAAC,EACbJ,GAAOI,EAAQ,KAAK,CAAE,YAAa,CAAE,QAAS,CAAE,KAAM,QAAS,KAAM,QAAS,GAAGpB,EAAOgB,CAAK,EAAG,OAAQ,SAAU,OAAQ,EAAG,SAAUlC,EAAK,MAAM,aAAc,MAAOuC,EAAM,iBAAiBL,CAAK,EAAE,KAAK,EAAG,MAAO5B,EAAM,QAAU,MAAO,EAAG,KAAM,EAAG,CAAE,CAAC,EAC9P,QAAWa,KAAQa,EAAO,CACxB,IAAMf,EAAIF,EAAMI,CAAI,EACdqB,EAAMN,GAASf,IAASa,EAAM,CAAC,EAAIjB,EAAMmB,CAAK,EAAE,EAAInB,EAAMmB,CAAK,EAAE,EAAIjB,EAAE,EACvEwB,EAAQtB,EAAK,mBAAqBA,EAAK,oBAAsBe,EAAQhB,EAAOC,EAAK,iBAAiB,EAAI,CAAE,EAAGF,EAAE,EAAG,EAAGA,EAAE,CAAE,EAC7HqB,EAAQ,KAAK,CAAE,YAAa,CAAE,QAAS,CAAE,KAAM,QAAQnB,EAAK,QAAQ,IAAI,GAAI,KAAM,OAAQ,EAAGsB,EAAM,EAAG,EAAGD,EAAM,IAAM,EAAGC,EAAM,EAAG,EAAG,KAAK,IAAI,GAAKxB,EAAE,EAAIA,EAAE,EAAIuB,EAAM,GAAI,EAAG,OAAQ,EAAG,OAAQb,EAAOR,CAAI,EAAG,MAAOoB,EAAM,iBAAiBpB,CAAI,EAAE,KAAK,CAAE,EAAG,KAAM,EAAG,CAAE,CAAC,CACxQ,CACAnB,EAAK,kBAAkB,CACrB,MAAOoC,EAAY,WAAY,CAAE,MAAOG,EAAMT,EAAM,eAAe,CAAE,EAAG,QAAAQ,EACxE,YAAaH,GAAY,WAAa,GAAQ,CAAE,EAAG7B,EAAM,GAAMQ,GAAI,GAAK,EAAG4B,GAAI,IAAM,EAAG,GAAK,EAAG,GAAK,SAAU,GAAI,MAAOH,EAAMtC,EAAU,iBAAiB,cAAc,EAAE,KAAK,GAAK,SAAS,CAAE,EAAI,MACtM,CAAC,EACDO,EAAQ,IAAI4B,EAAY,IAAI,IAAIE,EAAQ,IAAKK,GAAMA,EAAE,YAAY,QAAQ,IAAI,CAAC,CAAC,CACjF,CACA,IAAMC,GAAQpC,EAAQ,IAAI4B,CAAU,EAC9BS,EAAQ7C,EAAK,SAAS,CAAE,WAAAoC,CAAW,CAAC,EAC1C/B,EAAO,SAEP,IAAMyC,GAAanC,EAAQ,cAAc,aAAa,EACtD,GAAImC,GAAY,CACd,IAAMC,EAAM,mBAAmB,KAAK,iBAAiBD,EAAU,EAAE,eAAe,IAAI,CAAC,EAC/EE,EAAOD,GAAO,MAAME,GAAUF,EAAKD,GAAW,YAAc,EAAGA,GAAW,aAAe,EAAG,EAAI,EAClGE,IAAQH,EAAM,SAAS,CAAE,KAAAG,EAAM,GAAGjC,EAAM+B,EAAU,CAAE,CAAC,EAAGzC,EAAO,WACrE,CACI6B,GAASU,GAAM,IAAI,OAAO,IAC5BC,EAAM,QAAQK,GAAKhB,EAAO,CAAE,GAAAN,EAAI,IAAAtB,EAAK,KAAMT,EAAK,IAAK,CAAC,EAAG,CAAE,YAAa,OAAQ,CAAC,EACjFQ,EAAO,gBAET,QAAWc,KAAQa,EAAO,CACxB,IAAMmB,EAAS,CAAC,GAAGhC,EAAK,QAAQ,EAAE,OAAQiC,GAAUA,IAAUlB,CAAK,EAEnE,GADiBiB,EAAO,OAAS,GAAKA,EAAO,MAAOC,GAAUA,EAAM,QAAQC,EAAI,CAAC,GACjET,GAAM,IAAI,QAAQzB,EAAK,QAAQ,IAAI,EAAE,EAAG,CACtD0B,EAAM,QAAQM,EAAO,QAASG,GAAUJ,GAAKI,EAAO,CAAE,GAAA1B,EAAI,IAAAtB,EAAK,KAAMT,EAAK,IAAK,CAAC,CAAC,EAAG,CAAE,YAAa,QAAQsB,EAAK,QAAQ,IAAI,GAAI,OAAQQ,EAAOR,CAAI,EAAG,GAAIoC,GAAOpC,CAAI,CAAG,CAAC,EACzKd,EAAO,eACP,QACF,CACA,QAAWiD,KAASH,EAAQ,CAC1B,IAAMK,EAAKzC,EAAMuC,CAAK,EACtB,GAAIA,EAAM,QAAQD,EAAI,EAAGR,EAAM,QAAQK,GAAKI,EAAO,CAAE,GAAA1B,EAAI,IAAAtB,EAAK,KAAMT,EAAK,IAAK,CAAC,EAAG,CAAE,GAAGqB,EAAOoC,CAAK,EAAG,OAAQ,MAAO,OAAQ,EAAG,GAAIC,GAAOpC,CAAI,CAAG,CAAC,UAC1ImC,EAAM,QAAQ,KAAK,EAC1BT,EAAM,QAAQS,EAAM,aAAa,QAAQ,MAAO,EAAE,GAAK,GAAI,CAAE,GAAGE,EAAI,SAAU,WAAY,SAAU5B,EAAG,WAAW,iBAAiB0B,CAAK,EAAE,QAAQ,CAAC,EAAG,MAAOf,EAAM,iBAAiBe,CAAK,EAAE,KAAK,EAAG,KAAM,CAAE,MAAOf,EAAM,iBAAiBe,CAAK,EAAE,eAAe,CAAE,EAAG,OAAQ,MAAO,OAAQ,EAAG,QAAS,GAAO,MAAO,MAAO,CAAC,UACpTA,EAAM,QAAQ,aAAa,EACpCG,GAAMZ,EAAOS,EAAOE,EAAI,CAAE,GAAA5B,EAAI,IAAAtB,EAAK,KAAMT,EAAK,IAAK,CAAC,EACpDQ,EAAO,iBACEiD,EAAM,QAAQ,eAAe,GAAyBA,EAAO,MAAO,CAC7E,IAAMI,EAA4BJ,EAAO,MACrCK,GAAY3D,EAAM6C,EAAOa,EAAOF,EAAI,CAAE,GAAA5B,EAAI,IAAAtB,EAAK,KAAMT,EAAK,KAAM,IAAK0C,EAAMT,EAAM,KAAK,CAAE,CAAC,EAAGzB,EAAO,UAChGwC,EAAM,SAAS,CAAE,KAAM,MAAMI,GAAU,oCAAoC,mBAAmBS,EAAM,kBAAkB,CAAC,CAAC,GAAIF,EAAG,EAAI3C,EAAK,EAAG2C,EAAG,EAAI3C,EAAK,CAAC,EAAG,GAAG2C,CAAG,CAAC,EAAGnD,EAAO,WACrL,KAAO,CACL,IAAMuD,EAAMN,EAAM,cAAc,KAAK,EACrC,GAAIM,EAAK,CACP,IAAMZ,EAAO,MAAMC,GAAUW,EAAI,IAAKA,EAAI,YAAc,EAAGA,EAAI,aAAe,CAAC,EAC3EZ,IAAQH,EAAM,SAAS,CAAE,KAAAG,EAAM,GAAGjC,EAAM6C,CAAG,EAAG,QAASA,EAAI,GAAI,CAAC,EAAGvD,EAAO,WAChF,CACF,CACF,CACF,CACA,IAAMwD,GAAQhE,EAAK,KAAK,OAAOa,CAAC,GAAG,MAC/BmD,IAAOhB,EAAM,SAASgB,EAAK,EAC/B,IAAMC,GAAWjE,EAAK,KAAK,OAAOa,CAAC,GAAG,UAAY,CAAC,EACnDD,EAAY,KAAK,OAAOqD,GAAS,YAAcjE,EAAK,KAAK,SAAS,YAAc,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAC9G,CAGA,IAAMkE,EAAM,MAAMhE,EAAM,UAAU,MAAMC,EAAK,MAAM,CAAE,WAAY,cAAe,YAAa,EAAK,CAAC,CAAC,EACpG,OAAW,CAACU,EAAGsD,CAAI,IAAKvD,EAAY,QAAQ,EAAG,CAC7C,IAAMwD,EAAO,mBAAmBvD,EAAI,CAAC,OAC/BwD,EAAM,MAAMH,EAAI,KAAKE,CAAI,GAAG,MAAM,QAAQ,EAC5C,CAACC,GAAOF,IAAS,QACrBD,EAAI,KAAKE,EAAMC,EAAI,QAAQ,0CAAkEC,GAAU,GAAGA,CAAK,GAAGC,GAAcJ,EAAM1D,CAAG,CAAC,EAAE,CAAC,CAC/I,CACA,IAAM+D,EAAQ,MAAMN,EAAI,KAAK,sBAAsB,GAAG,MAAM,QAAQ,EACpE,GAAIM,EAAO,CACT,IAAMC,EAAgCC,GAAShC,EAAMtC,EAAU,iBAAiB,UAAUsE,CAAI,EAAE,EAAE,KAAK,CAAC,EAClGC,EAAS,CAACF,EAAO,MAAM,EAAG,GAAG,CAAC,EAAG,EAAG,EAAG,EAAG,CAAC,EAAE,IAAKG,GAAMH,EAAO,UAAUG,CAAC,EAAE,CAAC,CAAC,EAC9EC,EAAS,mDAAmDJ,EAAO,KAAK,CAAC,qCAAqCA,EAAO,OAAO,CAAC,qCAAqCA,EAAO,KAAK,CAAC,qCAAqCA,EAAO,MAAM,CAAC,cAAcE,EAAO,IAAI,CAACG,EAAGF,IAAM,YAAYA,EAAI,CAAC,oBAAoBE,CAAC,gBAAgBF,EAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,4BAA4BH,EAAO,SAAS,CAAC,4CAA4CA,EAAO,SAAS,CAAC,iCAC7bP,EAAI,KAAK,uBAAwBM,EAAM,QAAQ,sCAAuCK,CAAM,CAAC,CAC/F,CAEA,MAAO,CAAE,KADI,MAAMX,EAAI,cAAc,CAAE,KAAM,OAAQ,YAAa,UAAW,SAAU,2EAA4E,CAAC,EACrJ,OAAA1D,CAAO,CACxB,CAGA,SAASkD,GAAOpC,EAAM,CACpB,IAAMyD,EAAQzD,EAAK,kBACb0D,EAAQD,EAAQ,WAAW,iBAAiBA,CAAK,EAAE,cAAc,EAAI,EAC3E,MAAO,CAAE,eAAgB,KAAK,MAAMC,EAAQ,EAAG,CAAE,CACnD,CAOA,SAAS3B,GAAKI,EAAOwB,EAAK,CAExB,IAAMC,EAAM,CAAC,EACPC,EAAY,CAAwBhE,EAAuCiE,IAAU,CACzF,IAAMnD,EAAQ,iBAAiBd,CAAE,EAC3BkE,EAAO,CAAE,SAAUJ,EAAI,GAAG,WAAWhD,EAAM,QAAQ,CAAC,EAAG,MAAOS,EAAMT,EAAM,KAAK,EAAG,KAAM,OAAOA,EAAM,UAAU,GAAK,IAAK,KAAMgD,EAAI,KAAM,QAASA,EAAI,IAAK,MAAOhD,EAAM,YAAc,SAAW,SAAWgD,EAAI,IAAM,QAAU,OAAQ,GAAGG,CAAM,EACjPE,EAASC,GAAWpE,EAAIkE,CAAI,EAC7BC,EAAO,SACZA,EAAOA,EAAO,OAAS,CAAC,EAAE,QAAQ,UAAY,GAC9CJ,EAAI,KAAK,GAAGI,CAAM,EACpB,EACME,EAAO,CAAwBrE,EAA0BsE,IAAU,CACvE,IAAIb,EAAI,EACR,QAAWc,KAAMvE,EAAG,SAAU,CAC5ByD,IACA,IAAMe,EAAS,CAAC,GAAGD,EAAG,QAAQ,EAAE,OAAQZ,GAAMA,EAAE,QAAQ,QAAQ,CAAC,EAC3Dc,EAAgCF,EAAG,UAAU,EAAI,EACvD,QAAWZ,IAAK,CAAC,GAAGc,EAAM,QAAQ,EAAOd,EAAE,QAAQ,eAAe,GAAGA,EAAE,OAAO,EAC9EY,EAAG,MAAME,CAAK,EACdT,EAAUS,EAAO,CAAE,OAAQzE,EAAG,UAAY,KAAO,CAAE,KAAM,SAAU,QAASyD,IAAM,EAAI,OAAOzD,EAAG,aAAa,OAAO,GAAK,CAAC,EAAI,MAAU,EAAI,GAAM,YAAasE,CAAM,CAAC,EACtKG,EAAM,OAAO,EACb,QAAWC,KAAOF,EAAQH,EAAKK,EAAKJ,EAAQ,CAAC,CAC/C,CACF,EACA,GAAIhC,EAAM,QAAQ,QAAQ,EAAG+B,EAAK/B,EAAO,CAAC,UACjCA,EAAM,QAAQ,YAAY,EAAG,QAAWqC,KAAKrC,EAAM,SAAU0B,EAAUW,EAAG,CAAE,OAAQ,iBAAiBA,CAAC,EAAE,YAAc,QAAS,CAAC,OACpIX,EAAU1B,EAAO,CAAC,CAAC,EACxB,OAAOyB,CACT,CAGA,SAASK,GAAWQ,EAAMV,EAAM,CAE9B,IAAMH,EAAM,CAAC,EACPc,EAAO,CAAqBpB,EAAsCqB,IAAY,CAClF,GAAIrB,EAAE,WAAa,KAAK,UAAW,CACjC,IAAMsB,GAAQtB,EAAE,aAAe,IAAI,QAAQ,OAAQ,GAAG,EAClDsB,GAAMhB,EAAI,KAAK,CAAE,KAAAgB,EAAM,QAAS,CAAE,GAAGD,CAAQ,CAAE,CAAC,EACpD,MACF,CACA,GAAI,EAAErB,aAAa,aAAc,OACjC,GAAIA,EAAE,UAAY,KAAM,CAAMM,EAAI,SAAQA,EAAIA,EAAI,OAAS,CAAC,EAAE,QAAQ,UAAY,IAAM,MAAO,CAC/F,IAAMiB,EAAM,CAAE,GAAGF,CAAQ,EACrBrB,EAAE,QAAQ,WAAW,IAAKuB,EAAI,KAAO,GAAMA,EAAI,MAAQzD,EAAM,iBAAiBkC,CAAC,EAAE,KAAK,GACtFA,EAAE,QAAQ,OAAO,IAAGuB,EAAI,OAAS,IACjCvB,EAAE,QAAQ,QAAQ,IAAGuB,EAAI,OAAS,aAClCvB,EAAE,QAAQ,MAAM,IAAGuB,EAAI,SAAW,YAClCvB,EAAE,QAAQ,SAAS,IAAGuB,EAAI,UAAY,CAAE,IAAKvB,EAAE,aAAa,MAAM,CAAE,GACxE,QAAWrB,KAASqB,EAAE,WAAYoB,EAAKzC,EAAO4C,CAAG,CACnD,EACA,QAAW5C,KAASwC,EAAK,WAAYC,EAAKzC,EAAO8B,CAAI,EACrD,OAAIH,EAAI,SAAUA,EAAI,CAAC,EAAE,KAAOA,EAAI,CAAC,EAAE,KAAK,UAAU,EAAGA,EAAIA,EAAI,OAAS,CAAC,EAAE,KAAOA,EAAIA,EAAI,OAAS,CAAC,EAAE,KAAK,QAAQ,GAC9GA,EAAI,OAAQkB,GAAQA,EAAI,IAAI,CACrC,CAGA,SAASxC,GAAMZ,EAAOS,EAAOE,EAAIsB,EAAK,CACpC,IAAMoB,EAAO,CAAC,GAAG5C,EAAM,iBAAiB,IAAI,CAAC,EAAE,IAAK6C,GAAO,CAAC,GAAGA,EAAG,QAAQ,EAAE,IAAKC,GAAS,CACxF,IAAMtE,EAAQ,iBAAiBsE,CAAI,EAC7BC,EAAQD,EAAK,aAAa,YAAY,EAC5C,MAAO,CAAE,KAAMA,EAAK,aAAa,KAAK,GAAK,GAAI,QAAS,CACtD,KAAMA,EAAK,UAAY,KAAM,SAAUtB,EAAI,GAAG,WAAWhD,EAAM,QAAQ,CAAC,EAAG,MAAOS,EAAMT,EAAM,KAAK,EAAG,KAAMgD,EAAI,KAAM,QAASA,EAAI,IACnI,MAAOuB,IAAU,SAAW,SAAYA,IAAU,UAAavB,EAAI,IAAM,QAAU,OACnF,OAAQ,CAAC,CAAE,KAAM,MAAO,EAAG,CAAE,KAAM,MAAO,EAAG,CAAE,KAAM,QAAS,GAAIsB,EAAK,UAAY,KAAO,IAAM,IAAM,MAAO7D,EAAMT,EAAM,mBAAmB,CAAE,EAAG,CAAE,KAAM,MAAO,CAAC,CACnK,CAAE,CACJ,CAAC,CAAC,EACIwE,EAAS,CAAC,GAAIhD,EAAM,cAAc,IAAI,GAAG,UAAY,CAAC,CAAE,EAAE,IAAK8C,GAASA,EAAK,sBAAsB,EAAE,KAAK,EAC1GG,EAAQD,EAAO,OAAO,CAACE,EAAGC,IAAMD,EAAIC,EAAG,CAAC,GAAK,EACnD5D,EAAM,SAASiC,EAAI,IAAMoB,EAAK,IAAKjF,GAAMA,EAAE,QAAQ,CAAC,EAAIiF,EAAM,CAAE,GAAG1C,EAAI,MAAOsB,EAAI,IAAMwB,EAAO,QAAQ,EAAIA,GAAQ,IAAKjF,GAAOA,EAAIkF,EAAS/C,EAAG,CAAC,EAAG,OAAQ,GAAK,CAAC,CACnK,CAMA,SAASG,GAA+B3D,EAAyB6C,EAA0Ba,EAAqEF,EAA2FsB,EAAK,CAC9P,IAAM4B,EAAShD,EAAM,UAAU,EACzBc,EAA+BkC,EAAO,QAAU,CAAC,EACvD,GAAI,CAAClC,EAAO,OAAQ,MAAO,GAC3B,IAAMmC,EAAQ,IAAI,IAAInC,EAAO,IAAKoC,GAAMA,EAAE,IAAI,CAAC,EACzCC,GAAmCH,EAAO,OAAS,CAAC,GAAG,IAAInE,CAAK,EAChEuE,EAA4BC,GAAO,MAAM,QAAQA,CAAC,EAAI,OAAOA,EAAE,GAAG,EAAE,CAAC,EAA0C,OAAtC,OAAOA,GAAM,UAAYA,IAAM,KAAcA,EAAE,MAAgBA,CAAX,EAC7HC,EAAS,CAAE,GAAGxD,EAAI,WAAYgB,EAAO,OAAS,GAAKmC,EAAM,IAAI,KAAK,EAAG,UAAW,IAAK,eAAgB,GAAI,YAAa7B,EAAI,IAAK,YAAa+B,EAAS,UAAW,EAAQH,EAAO,QAAQ,CAAC,GAAG,KAAO,MAAOA,EAAO,QAAQ,CAAC,GAAG,KAAM,cAAe,GAAI,WAAY5B,EAAI,IAAK,kBAAmBA,EAAI,IAAK,kBAAmBA,EAAI,IAAK,eAAgBA,EAAI,IAAK,KAAMA,EAAI,IAAK,EAChX,GAAI6B,EAAM,OAAS,GAAMA,EAAM,IAAI,KAAK,EAAI,CAC1C,IAAMM,EAAMzC,EAAO,CAAC,EACd0C,EAAO,MAAM,QAAQD,EAAI,MAAM,GAAK,WAAWA,EAAI,OAAO,CAAC,CAAC,EAAI,EACtE,OAAApE,EAAM,SAASqE,EAAOlH,EAAK,OAAO,SAAWA,EAAK,OAAO,IAAK,CAAC,CAAE,KAAMiH,EAAI,MAAQ,GAAI,OAAQA,EAAI,KAAK,IAAwBE,GAAMA,EAAE,IAAI,EAAG,OAAQF,EAAI,KAAK,IAAIH,CAAK,CAAE,CAAC,EAAG,CAAE,GAAGE,EAAQ,YAAa,GAAM,WAAY,GAAM,SAAUE,EAAO,GAAK,MAAU,CAAC,EAC3P,EACT,CACA,GAAI,CAAC,GAAGP,CAAK,EAAE,MAAOS,GAAMA,IAAM,OAASA,IAAM,MAAM,EAAG,CACxD,IAAMC,EAAaX,EAAO,QAAQ,CAAC,GAAG,OAAS,WACzCY,GAAUD,EAAaX,EAAO,MAAQA,EAAO,SAAS,CAAC,GAAG,MAAQ,CAAC,EACnEa,EAAyBX,GAAM,CAAC,CAAE,KAAMA,EAAE,MAAQ,GAAI,OAAQU,EAAO,IAAI,MAAM,EAAG,OAAQV,EAAE,KAAK,IAAIE,CAAK,CAAE,CAAC,EAC7G9C,EAA2B4C,GAAOA,EAAE,OAAS,MAAQ5G,EAAK,OAAO,IAAM4G,EAAE,UAAY5G,EAAK,OAAO,KAAOA,EAAK,OAAO,KACpHwH,EAAO,CAAE,qBAAsB,GAAI,qBAAsB,GAAI,YAAa,CAAE,MAAO,SAAU,KAAM,EAAI,EAAG,mBAAoB1C,EAAI,KAAO,CAACuC,EAAa,SAAW,SAAU,uBAAwB,OAAQ,EAClN,GAAIV,EAAM,OAAS,EAAG,CACpB,IAAM3D,EAAOwB,EAAO,QAAQ+C,CAAE,EAC9B1E,EAAM,SAASmB,EAAKQ,EAAO,CAAC,CAAC,EAAGxB,EAAM,CAAE,GAAGgE,EAAQ,GAAGQ,EAAM,OAAQH,EAAa,MAAQ,MAAO,YAAa7C,EAAO,KAAMoC,GAAMA,EAAE,KAAK,EAAI,UAAY,YAAa,eAAgB,SAAU,SAAU,CAAE,CAAC,CAC7M,MAAO/D,EAAM,SAAS2B,EAAO,IAAKoC,IAAO,CAAE,KAAM5C,EAAK4C,CAAC,EAAG,KAAMW,EAAGX,CAAC,EAAG,QAAS,CAAE,OAAQS,EAAa,MAAQ,MAAO,YAAa,CAACR,EAAQrC,EAAO,QAAQoC,CAAC,EAAIC,EAAQ,MAAM,CAAC,CAAE,CAAE,EAAE,EAAG,CAAE,GAAGG,EAAQ,GAAGQ,CAAK,CAAC,EAC9M,MAAO,EACT,CACA,GAAIb,EAAM,OAAS,GAAKA,EAAM,IAAI,SAAS,EAAG,CAC5C,IAAMc,EAASjD,EAAO,CAAC,EAAE,KAAK,IAAwB2C,GAAO,MAAM,QAAQA,CAAC,EAAIA,EAAI,CAACA,EAAE,QAAQ,CAAC,EAAGA,EAAE,QAAQ,CAAC,CAAC,CAAE,EACjH,OAAAtE,EAAM,SAAS7C,EAAK,OAAO,QAAS,CAAC,CAAE,KAAM,IAAK,OAAQyH,EAAO,IAA0B9B,GAAMA,EAAE,CAAC,CAAC,CAAE,EAAG,CAAE,KAAMnB,EAAO,CAAC,EAAE,MAAQ,IAAK,OAAQiD,EAAO,IAA0B9B,GAAMA,EAAE,CAAC,CAAC,CAAE,CAAC,EAAG,CAAE,GAAGqB,EAAQ,SAAU,EAAG,mBAAoB,CAAE,CAAC,EAC5O,EACT,CACA,GAAIL,EAAM,OAAS,GAAKA,EAAM,IAAI,OAAO,EAAG,CAC1C,IAAMe,EAAahB,EAAO,QAAQ,CAAC,GAAG,WAAa,CAAC,EACpD,OAAA7D,EAAM,SAAS7C,EAAK,OAAO,MAAOwE,EAAO,CAAC,EAAE,KAAK,IAAwB2C,IAAO,CAAE,KAAMA,EAAE,MAAQ,GAAI,OAAQO,EAAW,IAAwBhH,GAAMA,EAAE,IAAI,EAAG,OAAQyG,EAAE,KAAM,EAAE,EAAG,CAAE,GAAGH,EAAQ,WAAY,GAAM,WAAY,UAAW,CAAC,EACrO,EACT,CACA,MAAO,EACT,CAGA,SAAS5C,GAAcJ,EAAM1D,EAAK,CAChC,IAAMqH,EAA8BC,GAAQ,wCAAwCA,CAAG,qBACvF,OAAI5D,IAAS,mBAAqBA,IAAS,QAAgB,wXACvDA,IAAS,aAAqB2D,EAAKrH,EAAM,IAAM,GAAG,EAClD0D,IAAS,cAAsB2D,EAAKrH,EAAM,IAAM,GAAG,EACnD0D,IAAS,WAAmB2D,EAAK,GAAG,EACpC3D,IAAS,aAAqB2D,EAAK,GAAG,EACnC,kDACT,CAGA,eAAe1E,GAAU4E,EAAKxG,EAAGE,EAAGuG,EAAQ,GAAO,CACjD,GAAI,CACF,IAAMlE,EAAM,IAAI,MAChBA,EAAI,YAAc,YAClBA,EAAI,IAAMiE,EACV,MAAMjE,EAAI,OAAO,EACjB,IAAMmE,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,MAAQ,KAAK,IAAI,EAAG,KAAK,MAAM1G,CAAC,CAAC,EACxC0G,EAAO,OAAS,KAAK,IAAI,EAAG,KAAK,MAAMxG,CAAC,CAAC,EACzC,IAAMyG,EAA+CD,EAAO,WAAW,IAAI,EACrEE,EAAKrE,EAAI,cAAgBvC,EAAG6G,EAAKtE,EAAI,eAAiBrC,EACtD4G,EAAQL,EAAQ,KAAK,IAAIC,EAAO,MAAQE,EAAIF,EAAO,OAASG,CAAE,EAAI,KAAK,IAAIH,EAAO,MAAQE,EAAIF,EAAO,OAASG,CAAE,EACtH,OAAAF,EAAI,UAAUpE,GAAMmE,EAAO,MAAQE,EAAKE,GAAS,GAAIJ,EAAO,OAASG,EAAKC,GAAS,EAAGF,EAAKE,EAAOD,EAAKC,CAAK,EACrGJ,EAAO,UAAU,WAAW,CACrC,MAAQ,CACN,OAAO,IACT,CACF,CCrTA,IAAAK,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ECUA,IAAMC,GAA8C,SAAS,cACvDC,GAAOD,IAAI,QAAQ,MAAQ,gCAE3BE,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,iGAOb,SAASC,IAAO,CACd,IAAMC,EAAS,SAAS,eAAe,MAAM,EAC7C,GAAI,CAACA,EAAQ,OACb,IAAMC,EAASC,GAASF,EAAO,aAAe,EAAE,EAAE,QAAQ,MAAO,EAAE,EAAE,QAAQ,MAAO,EAAE,EAChFG,EAAQ,IAAI,cAClBA,EAAM,YAAY,GAAGC,EAAG;AAAA,EAAKN,EAAI,EAAE,EACnC,SAAS,mBAAqB,CAAC,GAAG,SAAS,mBAAoBK,CAAK,EACpEH,EAAO,MAAM,QAAU,OACvB,IAAMK,EAAO,SAAS,cAAc,MAAM,EAC1C,SAAS,KAAK,OAAOA,CAAI,EACzB,IAAMC,EAASC,GAAc,CAAE,KAAAV,GAAM,KAAAQ,CAAK,CAAC,EAEvCG,EAAS,KACPC,EAAOC,GAAWL,EAAM,CAC5B,OAAAJ,EAAQ,OAAAK,EAAQ,KAAM,SAAS,gBAAgB,MAAQ,OACvD,MAAM,OAAOK,EAAM,CACjB,IAAMC,EAAWH,EAAK,KAAK,SACrBI,EAAOC,GAAcH,EAAM,CAC/B,MAAO,OAAOC,EAAS,OAASH,EAAK,KAAK,OAAO,CAAC,GAAG,OAAS,SAAS,KAAK,EAAG,KAAMA,EAAK,KAAM,IAAKA,EAAK,IAC1G,SAAUb,IAAI,IAAM,CAAE,IAAKA,GAAG,GAAI,EAAI,CAAE,KAAMA,IAAI,aAAe,EAAG,EAAG,UAAW,SAAS,cAAc,sBAAsB,GAAG,aAAa,SAAS,GAAK,MAC/J,CAAC,EACKmB,EAAO,mBAAmB,SAAS,SAAS,MAAM,GAAG,EAAE,IAAI,GAAK,kBAAkB,EAClFC,EAA6B,OAAQ,mBAC3C,GAAIA,EACF,GAAI,CACFR,IAAW,MAAMQ,EAAO,CAAE,cAAeD,EAAM,MAAO,CAAC,CAAE,YAAa,OAAQ,OAAQ,CAAE,YAAa,CAAC,aAAc,OAAO,CAAE,CAAE,CAAC,CAAE,CAAC,EACnI,IAAME,EAAW,MAAMT,EAAO,eAAe,EAC7C,MAAMS,EAAS,MAAMJ,CAAI,EACzB,MAAMI,EAAS,MAAM,EACrB,MACF,OAASC,EAAO,CAAE,GAA0BA,EAAO,OAAS,aAAc,MAAO,CAEnFC,GAAS,IAAI,KAAK,CAACN,CAAI,EAAG,CAAE,KAAM,WAAY,CAAC,EAAGE,CAAI,CACxD,EACA,MAAM,SAASK,EAAM,CACnB,GAAM,CAAE,UAAAC,EAAW,MAAAC,CAAM,EAAI,MAAMC,GAAU,EACvC,CAAE,KAAAC,CAAK,EAAI,MAAMC,GAAOL,EAAM,CAAE,UAAAC,EAAW,MAAAC,CAAM,CAAC,EACxDH,GAASK,EAAM,GAAG,OAAOJ,EAAK,KAAK,SAAS,OAASA,EAAK,KAAK,OAAO,CAAC,GAAG,OAAS,QAAQ,EAAE,QAAQ,iBAAkB,GAAG,EAAE,KAAK,GAAK,QAAQ,OAAO,CACvJ,CACF,CAAC,EACKM,EAAQjB,EAAK,KAAK,SAAS,OAASA,EAAK,KAAK,OAAO,CAAC,GAAG,MAC3DiB,IAAO,SAAS,MAAQ,OAAOA,CAAK,GACSrB,EAAK,cAAc,aAAa,GAC1E,MAAM,CAAE,cAAe,EAAK,CAAC,EACpC,OAAO,OAAO,OAAQ,CAAE,SAAUI,EAAM,UAAW,CAAE,OAAAgB,GAAQ,UAAAF,GAAW,aAAAI,GAAc,cAAAb,EAAc,CAAE,CAAC,CACzG,CAEA,eAAeS,IAAY,CACzB,OAA0B,OAAQ,WAAY,MAAM,IAAI,QAAQ,CAACK,EAASC,IAAW,CACnF,IAAMC,EAAM,SAAS,cAAc,QAAQ,EAC3CA,EAAI,IAAMC,GAAUlC,GAAM,YAAa,QAAS,wBAAwB,EACxEiC,EAAI,OAASF,EACbE,EAAI,QAAUD,EACd,SAAS,KAAK,OAAOC,CAAG,CAC1B,CAAC,EACM,CAAE,UAA+B,OAAQ,UAAW,MAA2B,OAAQ,KAAM,CACtG,CAGA,SAASX,GAASK,EAAMT,EAAM,CAC5B,IAAMiB,EAAI,OAAO,OAAO,SAAS,cAAc,GAAG,EAAG,CAAE,KAAM,IAAI,gBAAgBR,CAAI,EAAG,SAAUT,CAAK,CAAC,EACxG,SAAS,KAAK,OAAOiB,CAAC,EACtBA,EAAE,MAAM,EACRA,EAAE,OAAO,EACT,WAAW,IAAM,IAAI,gBAAgBA,EAAE,IAAI,EAAG,GAAM,CACtD,CAEI,SAAS,aAAe,UAAW,SAAS,iBAAiB,mBAAoBjC,EAAI,EACpFA,GAAK",
6
- "names": ["parseYaml", "text", "lines", "raw", "uncomment", "value", "block", "line", "quote", "i", "c", "at", "min", "indent", "list", "rest", "width", "scalar", "map", "entry", "key", "blockScalar", "folded", "taken", "t", "read", "flow", "space", "item", "start", "q", "open", "SLOT", "parseDeck", "source", "lines", "offsets", "line", "ranges", "start", "matter", "comment", "i", "commentGoesOn", "j", "fence", "last", "heads", "mark", "cuts", "at", "k", "slides", "end", "index", "slide", "one", "slot", "columnsOf", "starts", "open", "close", "cols", "names", "_", "begin", "from", "to", "settings", "parseYaml", "top", "body", "notes", "after", "all", "text", "slots", "name", "first", "taken", "push", "columns", "marker", "kept", "heading", "NAME", "TRACK", "PPTX", "ENUMS", "ALIASES", "STANDARD", "name", "given", "layoutOf", "problems", "budgets", "named", "budget", "clean", "slots", "slot", "rows", "row", "width", "cell", "cells", "y", "x", "xs", "c", "ys", "tracks", "value", "count", "list", "t", "columns", "rowTracks", "pick", "key", "fallback", "label", "words", "v", "kept", "tokensFrom", "colour", "face", "NAMES", "group", "g", "k", "colours", "tokens", "dark", "fonts", "heading", "body", "mergeKits", "kits", "kit", "definition", "layout", "found", "p", "labelOf", "lang", "inferLayout", "slide", "names", "lines", "line", "h", "tag", "attributes", "children", "element", "name", "value", "child", "safeUrl", "href", "url", "renderSlide", "slide", "context", "asked", "layout", "ALIASES", "inferLayout", "definition", "STANDARD", "classes", "counter", "slots", "slot", "names", "section", "canvas", "row", "cell", "image", "picture", "blocks", "tokens", "out", "at", "mode", "token", "start", "fences", "line", "fence", "list", "attrs", "inner", "words", "li", "step", "block", "n", "stepped", "head", "edit", "range", "inline", "lone", "from", "item", "offset", "itemStart", "marker", "simple", "info", "lang", "drawer", "box", "marked", "lines", "code", "i", "align", "a", "raw", "text", "part", "b", "to", "_", "e", "src", "LOOKS", "VOICES", "tokensOf", "settings", "project", "named", "own", "tokens", "clean", "given", "kept", "key", "hex", "v", "schemeOf", "scheme", "light", "dark", "paper", "round", "mix", "ink", "primary", "text", "readable", "onPrimary", "contrast", "series", "n", "rotate", "css", "value", "m", "h", "c", "i", "rgb", "a", "b", "t", "luminance", "r", "g", "s", "x", "y", "p", "q", "colour", "ratio", "toward", "out", "degrees", "max", "min", "d", "u", "STRINGS", "stringsFor", "lang", "_getDefaults", "_defaults", "changeDefaults", "newDefaults", "noopTest", "cachedIndentRegex", "createRegex", "cache", "indent", "cacheIndex", "regex", "edit", "opt", "source", "obj", "name", "val", "valSource", "other", "supportsLookbehind", "a", "bull", "_tag", "newline", "blockCode", "fences", "hr", "heading", "bullet", "lheadingCore", "lheading", "lheadingGfm", "_paragraph", "blockText", "_blockLabel", "def", "list", "_comment", "html", "createParagraph", "listInterrupt", "paragraph", "blockquoteParagraph", "blockquote", "blockNormal", "gfmTable", "blockGfm", "blockPedantic", "escape", "inlineCode", "br", "inlineText", "_punctuation", "_punctuationOrSpace", "_notPunctuationOrSpace", "punctuation", "_openQuote", "_punctuationGfmStrongEm", "_punctuationOrSpaceGfmStrongEm", "_notPunctuationOrSpaceGfmStrongEm", "blockSkip", "emStrongLDelimCore", "emStrongLDelim", "emStrongLDelimGfm", "emStrongLDelimPedanticCore", "emStrongLDelimPedantic", "emStrongRDelimAstCore", "emStrongRDelimAst", "emStrongRDelimAstGfm", "emStrongRDelimAstPedanticCore", "emStrongRDelimAstPedantic", "emStrongRDelimUnd", "emStrongRDelimUndPedanticCore", "emStrongRDelimUndPedantic", "delLDelim", "delRDelimCore", "delRDelim", "anyPunctuation", "anyPunctuationOutsideCode", "autolink", "_inlineComment", "tag", "_inlineLabelBrackets", "_inlineLabel", "link", "reflink", "nolink", "_boundedBlockLabel", "_boundedInlineLabel", "reflinkSearch", "_caseInsensitiveProtocol", "_extendedEmail", "_extendedEmailProtocol", "inlineNormal", "inlinePedantic", "inlineGfm", "inlineBreaks", "block", "inline", "escapeReplacements", "getEscapeReplacement", "ch", "escapeHtmlEntities", "encode", "decodeNumericCharacterReferences", "text", "ref", "dec", "hex", "code", "cleanUrl", "href", "splitCells", "tableRow", "count", "row", "match", "offset", "str", "escaped", "curr", "cells", "i", "rtrim", "c", "invert", "l", "suffLen", "currChar", "trimTrailingBlankLines", "lines", "end", "normalizeLabel", "label", "findClosingBracket", "b", "level", "expandTabs", "line", "col", "expanded", "char", "added", "outputLink", "cap", "raw", "lexer", "rules", "title", "isImage", "outerInLink", "outerLinkEmitted", "outerInRawBlock", "tokens", "textHasLink", "indentCodeCompensation", "matchIndentToCode", "indentToCode", "node", "matchIndentInNode", "indentInNode", "isLabelEndInsideToken", "src", "labelStart", "tokenSrc", "token", "_Tokenizer", "options", "trimmed", "inBlockquote", "currentLines", "currentRaw", "currentText", "top", "lastToken", "oldToken", "continuation", "newText", "newToken", "leftover", "leftoverCount", "consumed", "listSrc", "taken", "isordered", "itemRegex", "endsWithBlankLine", "endEarly", "itemContents", "itemStart", "firstLine", "bulletIndent", "whitespace", "nextLine", "blankLine", "nextBulletRegex", "hrRegex", "fencesBeginRegex", "headingBeginRegex", "htmlBeginRegex", "blockquoteBeginRegex", "rawLine", "nextLineWithoutTabs", "lastItem", "item", "spacers", "t", "hasMultipleLineBreaks", "itemToken", "taskRaw", "checkboxToken", "headers", "aligns", "rows", "align", "cell", "trimmedUrl", "rtrimSlash", "lastParenIndex", "linkLen", "links", "linkString", "maskedSrc", "prevChar", "lLength", "rDelim", "rLength", "delimTotal", "midDelimTotal", "delimChar", "midRun", "endReg", "lastCharLength", "hasNonSpaceChars", "hasSpaceCharsOnBothEnds", "prevCapZero", "_Lexer", "__Lexer", "next", "lastParagraphClipped", "srcLength", "extTokenizer", "cutSrc", "startIndex", "tempSrc", "tempStart", "getStartIndex", "linkRule", "match0", "refStart", "prevLinkParenPossible", "#inlineTokensInner", "maskReflink", "punct", "_link", "context", "keepPrevChar", "byte", "errMsg", "_Renderer", "lang", "langString", "depth", "ordered", "start", "body", "j", "type", "startAttr", "checked", "header", "k", "content", "parsedText", "cleanHref", "out", "_TextRenderer", "_Parser", "__Parser", "anyToken", "genericToken", "ret", "renderer", "_Hooks", "markdown", "pushValues", "values", "value", "Marked", "args", "callback", "tableToken", "listToken", "childTokens", "extensions", "pack", "opts", "ext", "prevRenderer", "extLevel", "prop", "rendererProp", "rendererFunc", "tokenizer", "tokenizerProp", "tokenizerFunc", "prevTokenizer", "hooks", "hooksProp", "hooksFunc", "prevHook", "arg", "walkTokens", "packWalktokens", "blockType", "origOpt", "throwError", "processedSrc", "processedTokens", "e", "silent", "async", "msg", "markedInstance", "marked", "useExtension", "setOptions", "parseInline", "parser", "_Parser", "lexer", "_Lexer", "RTL", "ICONS", "icon", "name", "svg", "path", "createDeck", "root", "options", "source", "deck", "parseDeck", "at", "stepAt", "drawn", "lang", "dir", "words", "stringsFor", "number", "dark", "scheme", "started", "stage", "h", "where", "button", "label", "act", "b", "back", "move", "next", "editButton", "toggle", "presenterButton", "overviewButton", "bar", "paintLook", "view", "present", "sourceBox", "nextBox", "notes", "clock", "presenter", "kitProblems", "kitOf", "merged", "mergeKits", "context", "tokens", "tokensOf", "colours", "schemeOf", "stack", "faces", "f", "voice", "VOICES", "value", "colour", "n", "chooseScheme", "asked", "src", "markdown", "T", "draw", "slide", "renderSlide", "i", "element", "go", "show", "fitAll", "fit", "over", "slot", "scale", "steps", "one", "following", "by", "to", "toStep", "forward", "settings", "named", "ahead", "behind", "part", "kind", "_", "side", "update", "reduced", "transition", "toward", "key", "el", "parts", "s", "there", "match", "id", "old", "mode", "other", "setSource", "text", "pending", "event", "followCaret", "caret", "found", "target", "from", "done", "keep", "blur", "markdownOf", "e", "backward", "touch", "dx", "tick", "node", "out", "child", "inner", "loading", "script", "src", "global", "resolve", "reject", "tag", "libraryAt", "base", "name", "version", "file", "defaultBlocks", "root", "versions", "chartsAt", "diagramsAt", "charts", "colours", "event", "one", "themed", "option", "box", "size", "rtl", "small", "axis", "given", "across", "source", "echarts", "place", "chart", "pele", "font", "svg", "look", "picture", "VERSION", "OPEN", "CLOSE", "escape", "markdown", "unescape", "text", "attribute", "content", "inlineCode", "code", "readDeckFile", "html", "at", "from", "end", "rendererUrl", "version", "VERSION", "writeDeckFile", "title", "lang", "dir", "renderer", "base", "generator", "data", "script", "W", "H", "TEXT", "hexOf", "value", "m", "toPptx", "view", "PptxGenJS", "JSZip", "pres", "rootStyle", "firstFont", "stack", "f", "report", "rtl", "slides", "masters", "transitions", "i", "element", "box", "sx", "W", "place", "el", "r", "across", "slot", "x", "w", "y", "h", "pad", "start", "end", "anchor", "pt", "px", "style", "layout", "slots", "firstBlock", "title", "definition", "masterName", "labelOf", "objects", "hexOf", "top", "inner", "H", "o", "names", "slide", "background", "url", "data", "pictureOf", "runs", "blocks", "child", "TEXT", "block", "spaced", "at", "table", "chart", "nativeChart", "img", "notes", "settings", "zip", "kind", "path", "xml", "found", "transitionXml", "theme", "colour", "name", "series", "n", "scheme", "c", "first", "after", "how", "out", "paragraph", "extra", "base", "pieces", "inlineRuns", "list", "level", "li", "nested", "clone", "sub", "p", "node", "walk", "options", "text", "own", "run", "rows", "tr", "cell", "align", "widths", "total", "a", "b", "option", "types", "s", "colours", "value", "v", "common", "pie", "ring", "d", "t", "horizontal", "labels", "of", "axes", "points", "indicators", "push", "dir", "src", "cover", "canvas", "ctx", "iw", "ih", "scale", "deck_default", "me", "base", "PAGE", "boot", "holder", "source", "unescape", "sheet", "deck_default", "root", "blocks", "defaultBlocks", "handle", "view", "createDeck", "text", "settings", "file", "writeDeckFile", "name", "picker", "writable", "error", "download", "deck", "PptxGenJS", "JSZip", "libraries", "blob", "toPptx", "title", "readDeckFile", "resolve", "reject", "tag", "libraryAt", "a"]
4
+ "sourcesContent": ["// Front matter as brains and Slidev write it: the YAML a deck needs, maps by their indent, lists\n// in blocks and in brackets, quoted and plain scalars, block scalars (| and >) and comments. What\n// it can't read stays a string, so a deck never fails to open over its settings. Pure.\n\n/** @param {string} text @returns {Record<string, any>} */\nexport function parseYaml(text) {\n const lines = text.replace(/\\r\\n?/g, '\\n').split('\\n').map((raw) => ({ indent: raw.length - raw.trimStart().length, text: uncomment(raw).trimEnd(), raw }))\n const at = { i: 0 }\n const value = block(lines, at, 0)\n return value && typeof value === 'object' && !Array.isArray(value) ? value : {}\n}\n\n/** A line without its comment: a # at its start or after a space, outside quotes. @param {string} line */\nfunction uncomment(line) {\n let quote = ''\n for (let i = 0; i < line.length; i++) {\n const c = line[i]\n if (quote) { if (c === quote) quote = '' }\n else if (c === '\"' || c === \"'\") quote = c\n else if (c === '#' && (i === 0 || /\\s/.test(line[i - 1]))) return line.slice(0, i)\n }\n return line\n}\n\n/** @param {{ indent: number, text: string, raw: string }[]} lines @param {{ i: number }} at @param {number} min @returns {any} */\nfunction block(lines, at, min) {\n while (at.i < lines.length && !lines[at.i].text.trim()) at.i++\n if (at.i >= lines.length || lines[at.i].indent < min) return null\n const indent = lines[at.i].indent\n if (/^-(\\s|$)/.test(lines[at.i].text.trim())) {\n const list = []\n while (at.i < lines.length) {\n const line = lines[at.i]\n if (!line.text.trim()) { at.i++; continue }\n if (line.indent !== indent || !/^-(\\s|$)/.test(line.text.trim())) break\n const rest = line.text.trim().slice(1).trim()\n at.i++\n if (!rest) list.push(block(lines, at, indent + 1))\n else if (/^[^'\"[{][^:]*:(\\s|$)/.test(rest)) {\n // A map that starts on the dash's line: its first key there, the rest below it.\n const width = line.raw.indexOf(rest)\n lines.splice(at.i, 0, { indent: width, text: ' '.repeat(width) + rest, raw: ' '.repeat(width) + rest })\n list.push(block(lines, at, width))\n } else list.push(scalar(rest))\n }\n return list\n }\n /** @type {Record<string, any>} */\n const map = {}\n while (at.i < lines.length) {\n const line = lines[at.i]\n if (!line.text.trim()) { at.i++; continue }\n if (line.indent !== indent) break\n const entry = /^(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^']|'')*'|[^:]+?)\\s*:(?:\\s+(.*))?$/.exec(line.text.trim())\n at.i++\n if (!entry) continue\n const key = String(scalar(entry[1]))\n const rest = (entry[2] ?? '').trim()\n if (rest === '|' || rest === '>' || /^[|>][+-]$/.test(rest)) map[key] = blockScalar(lines, at, indent, rest[0] === '>')\n else if (rest) map[key] = scalar(rest)\n else map[key] = block(lines, at, indent + 1)\n }\n return map\n}\n\n/** @param {{ indent: number, text: string, raw: string }[]} lines @param {{ i: number }} at @param {number} indent @param {boolean} folded */\nfunction blockScalar(lines, at, indent, folded) {\n const taken = []\n while (at.i < lines.length && (!lines[at.i].raw.trim() || lines[at.i].indent > indent)) taken.push(lines[at.i++].raw)\n while (taken.length && !taken.at(-1)?.trim()) taken.pop()\n const width = Math.min(...taken.filter((line) => line.trim()).map((line) => line.length - line.trimStart().length))\n const text = taken.map((line) => line.slice(width)).join('\\n')\n return folded ? text.replace(/([^\\n])\\n(?=[^\\n])/g, '$1 ') : text\n}\n\n/** A scalar, or a list or map in brackets. @param {string} text @returns {any} */\nfunction scalar(text) {\n const t = text.trim()\n if (t.startsWith('[') || t.startsWith('{')) {\n const read = flow(t, { i: 0 })\n if (read !== undefined) return read\n }\n if (/^\"(?:[^\"\\\\]|\\\\.)*\"$/.test(t)) {\n try { return JSON.parse(t) } catch { return t.slice(1, -1) }\n }\n if (/^'(?:[^']|'')*'$/.test(t)) return t.slice(1, -1).replace(/''/g, \"'\")\n if (/^(true|yes|on)$/i.test(t)) return true\n if (/^(false|no|off)$/i.test(t)) return false\n if (/^(null|~)$/i.test(t) || t === '') return null\n if (/^[-+]?(\\d+\\.?\\d*|\\.\\d+)(e[-+]?\\d+)?$/i.test(t)) return Number(t)\n return t\n}\n\n/** A list or map in brackets, or undefined when it isn't one. @param {string} text @param {{ i: number }} at @returns {any} */\nfunction flow(text, at) {\n const space = () => { while (/\\s/.test(text[at.i] ?? '')) at.i++ }\n const item = () => {\n space()\n if (text[at.i] === '[' || text[at.i] === '{') return flow(text, at)\n const start = at.i\n if (text[at.i] === '\"' || text[at.i] === \"'\") {\n const q = text[at.i++]\n while (at.i < text.length && !(text[at.i] === q && text[at.i - 1] !== '\\\\')) at.i++\n at.i++\n } else while (at.i < text.length && !/[,\\]}]/.test(text[at.i]) && !(text[at.i] === ':' && /^[\\s,\\]}]?$/.test(text[at.i + 1] ?? ''))) at.i++\n return scalar(text.slice(start, at.i))\n }\n const open = text[at.i++]\n space()\n if (open === '[') {\n const list = []\n while (at.i < text.length && text[at.i] !== ']') {\n list.push(item())\n space()\n if (text[at.i] === ',') at.i++\n else if (text[at.i] !== ']') return undefined\n space()\n }\n at.i++\n return list\n }\n /** @type {Record<string, any>} */\n const map = {}\n while (at.i < text.length && text[at.i] !== '}') {\n const key = item()\n space()\n if (text[at.i] !== ':') return undefined\n at.i++\n map[String(key)] = item()\n space()\n if (text[at.i] === ',') at.i++\n else if (text[at.i] !== '}') return undefined\n space()\n }\n at.i++\n return map\n}\n", "// A deck's Markdown read as Slidev reads it (@slidev/parser's rules): slides between `---` lines;\n// a `---` line followed by a line that isn't empty opens that slide's settings, YAML up to the next\n// `---` line (or a ```yaml block at the slide's top); the first slide's settings are the deck's\n// too (its headmatter); the last HTML comment at a slide's end is the speaker's notes; `::name::`\n// on its own line starts a layout's slot. Fenced code and comments never split a slide. Every slide\n// and slot keeps where it starts in the source, so an edit made on a slide goes back to its words.\n// Read too, as brains write them even when asked for Slidev: Pandoc's and Quarto's fenced divs,\n// `::: notes` as the notes, and `:::: columns` holding `::: column`s as slots (what is above them\n// the heading, each column a slot, what is under them the foot), never rewritten.\n// Pure: no DOM, no Markdown parser.\nimport { parseYaml } from './yaml.js'\n\n/** @typedef {{ name: string, text: string, start: number }} Slot */\n/** @typedef {{ index: number, start: number, end: number, settings: Record<string, any>, slots: Slot[], notes: string, title: string }} Slide */\n/** @typedef {{ settings: Record<string, any>, slides: Slide[] }} Deck */\n\nconst SLOT = /^::([\\w-]+)::\\s*$/\n\n/** @param {string} source @returns {Deck} */\nexport function parseDeck(source) {\n const text = source.replace(/\\r\\n?/g, '\\n')\n const lines = text.split('\\n')\n const offsets = [0]\n for (const line of lines) offsets.push(/** @type {number} */ (offsets.at(-1)) + line.length + 1)\n /** @type {{ start: number, end: number, matter: [number, number] | null }[]} */\n const ranges = []\n let start = 0, matter = /** @type {[number, number] | null} */ (null), comment = false\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trimEnd()\n if (comment) { comment = commentGoesOn(line, true); continue }\n if (line.startsWith('---') && !/^---\\s*-/.test(line)) {\n if (i > start || matter) ranges.push({ start, end: i, matter })\n matter = null\n start = i + 1\n // Settings only when settings follow (a `key:` line), not words: Slidev would take a heading\n // there for settings and lose the slide, as decks brains write often start `---`, `# Title`.\n if (line[3] !== '-' && lines[i + 1]?.trim() && /^\\s*([\\w-]+\\s*:|#\\s)/.test(lines[i + 1]) && !/^#{1,6}\\s/.test(lines[i + 1])) {\n let j = i + 1\n while (j < lines.length && lines[j].trimEnd() !== '---') j++\n matter = [i + 1, j]\n i = j\n start = j + 1\n }\n } else if (/^\\s*(`{3,}|~{3,})/.test(line)) {\n const fence = /** @type {RegExpExecArray} */ (/^\\s*(`{3,}|~{3,})/.exec(line))[1]\n let j = i + 1\n while (j < lines.length && !lines[j].trimStart().startsWith(fence)) j++\n if (j < lines.length) i = j\n } else comment = commentGoesOn(line, false)\n }\n if (start < lines.length || matter) ranges.push({ start, end: lines.length, matter })\n // No `---` at all, as a document or a Pandoc deck is written: a slide at each heading of the first\n // two levels, as Pandoc's slide level does, the headmatter staying with the first.\n const last = /** @type {{ start: number, end: number, matter: [number, number] | null }} */ (ranges.at(-1))\n if (ranges.length === 1 && last) {\n let fence = ''\n const heads = []\n for (let i = last.start; i < last.end; i++) {\n const mark = /^\\s*(`{3,}|~{3,})/.exec(lines[i])?.[1]\n if (fence) { if (mark && lines[i].trimStart().startsWith(fence)) fence = '' }\n else if (mark) fence = mark\n else if (/^#{1,2}\\s+\\S/.test(lines[i])) heads.push(i)\n }\n if (heads.length >= 2) {\n ranges.pop()\n const cuts = heads[0] > last.start && !lines.slice(last.start, heads[0]).some((line) => line.trim()) ? heads : [last.start, ...heads.slice(heads[0] === last.start ? 1 : 0)]\n cuts.forEach((at, k) => ranges.push({ start: k === 0 ? last.start : at, end: cuts[k + 1] ?? last.end, matter: k === 0 ? last.matter : null }))\n }\n }\n const slides = ranges.map(({ start, end, matter }, index) => slide(lines, offsets, start, end, matter, index))\n .filter((one, i) => i === 0 || one.slots.some((slot) => slot.text.trim()) || Object.keys(one.settings).length)\n slides.forEach((one, i) => { one.index = i })\n return { settings: slides[0]?.settings ?? {}, slides }\n}\n\n/**\n * Pandoc's columns, as the lines where each slot starts: the first column `left`, the next `right`\n * (or `middle`, then `right`, for three), the line after the columns `bottom`. The fences' own lines\n * are left as they are and drawn as nothing. @param {string[]} lines @returns {Map<number, string>}\n */\nfunction columnsOf(lines) {\n /** @type {Map<number, string>} */\n const starts = new Map()\n const open = lines.findIndex((line) => /^:{3,}[ \\t]*\\{?[ \\t]*\\.?columns\\b/.test(line))\n if (open < 0) return starts\n const fence = /** @type {RegExpExecArray} */ (/^:+/.exec(lines[open]))[0]\n const close = lines.findIndex((line, i) => i > open && line.trim() === fence)\n const cols = lines.map((line, i) => [line, i]).filter(([line, i]) => Number(i) > open && (close < 0 || Number(i) < close) && /^:{3,}[ \\t]*\\{?[ \\t]*\\.?col(umn)?\\b/.test(String(line))).map(([, i]) => Number(i))\n if (cols.length < 2) return starts\n const names = cols.length === 2 ? ['left', 'right'] : ['left', 'middle', 'right', ...cols.slice(3).map((_, k) => `col-${k + 4}`)]\n cols.forEach((at, k) => starts.set(at, names[k]))\n if (close > 0 && lines.slice(close + 1).some((line) => line.trim())) starts.set(close, 'bottom')\n return starts\n}\n\n/** Whether a comment is still open at this line's end. @param {string} line @param {boolean} open */\nfunction commentGoesOn(line, open) {\n let at = 0\n for (;;) {\n if (open) {\n const end = line.indexOf('-->', at)\n if (end < 0) return true\n open = false\n at = end + 3\n } else {\n const begin = line.indexOf('<!--', at)\n if (begin < 0) return false\n const end = line.indexOf('-->', begin + 4)\n if (end < 0) return true\n at = end + 3\n }\n }\n}\n\n/**\n * @param {string[]} lines @param {number[]} offsets @param {number} from @param {number} to\n * @param {[number, number] | null} matter @param {number} index @returns {Slide}\n */\nfunction slide(lines, offsets, from, to, matter, index) {\n let settings = matter ? parseYaml(lines.slice(matter[0], matter[1]).join('\\n')) : {}\n let top = from\n // Slidev's other way to write settings: a ```yaml block at the slide's top.\n while (top < to && !lines[top].trim()) top++\n if (!matter && /^```ya?ml\\s*$/.test(lines[top] ?? '')) {\n let j = top + 1\n while (j < to && !lines[j].startsWith('```')) j++\n settings = parseYaml(lines.slice(top + 1, j).join('\\n'))\n from = j + 1\n }\n let body = lines.slice(from, to).join('\\n')\n let notes = ''\n // remark's `???` and reveal.js's `Note:`: what follows, to the slide's end, is the notes.\n const after = /^(\\?\\?\\?|Notes?:)[ \\t]*(.*)$/m.exec(body)\n if (after && after.index !== undefined && !/^```/m.test(body.slice(after.index))) {\n notes = [after[2], body.slice(after.index + after[0].length)].join('\\n').trim()\n body = body.slice(0, after.index)\n }\n // reveal.js's <aside class=\"notes\">, wherever on the slide, as Pandoc's below.\n body = body.replace(/<aside\\b[^>]*class=[\"']?notes[\"']?[^>]*>([\\s\\S]*?)<\\/aside>/gi, (all, text) => {\n notes += (notes ? '\\n' : '') + text.replace(/<[^>]*>/g, ' ').replace(/[ \\t]+/g, ' ').trim()\n return all.replace(/[^\\n]/g, ' ')\n })\n // Pandoc's notes, wherever on the slide: kept as the notes, blanked in place so offsets stay.\n body = body.replace(/^(:{3,})[ \\t]*\\{?[ \\t]*\\.?notes[ \\t]*\\}?[ \\t]*\\n([\\s\\S]*?)\\n\\1[ \\t]*$/gm, (all, _, text) => {\n notes += (notes ? '\\n' : '') + text.trim()\n return all.replace(/[^\\n]/g, ' ')\n })\n const comments = [...body.matchAll(/<!--([\\s\\S]*?)-->/g)]\n const last = comments.at(-1)\n if (last && last.index !== undefined && !body.slice(last.index + last[0].length).trim()) {\n notes = [last[1].trim(), notes].filter(Boolean).join('\\n')\n body = body.slice(0, last.index)\n }\n // Each slot's text is the source's own, from where it starts, so offsets in it are the source's.\n /** @type {Slot[]} */\n const slots = []\n let name = 'default', first = from, fence = ''\n /** @type {string[]} */\n let taken = []\n const push = () => slots.push({ name, text: taken.join('\\n'), start: offsets[first] })\n const columns = columnsOf(body.split('\\n'))\n for (const [i, line] of body.split('\\n').entries()) {\n const mark = /^\\s*(`{3,}|~{3,})/.exec(line)?.[1]\n const marker = SLOT.exec(line) ?? (columns.has(i) ? [line, /** @type {string} */ (columns.get(i))] : null)\n if (fence) { if (mark && line.trimStart().startsWith(fence)) fence = '' }\n else if (mark) fence = mark\n else if (marker) {\n push()\n name = marker[1]\n taken = []\n first = from + i + 1\n continue\n }\n taken.push(line)\n }\n push()\n const kept = slots.filter((slot, i) => i > 0 || slot.text.trim() || slots.length === 1)\n const heading = /^#{1,6}\\s+(.+)$/m.exec(body.replace(/^```[\\s\\S]*?^```/gm, ''))\n return { index, start: offsets[matter ? matter[0] - 1 : from], end: offsets[to] - 1, settings, slots: kept, notes, title: String(settings.title ?? heading?.[1] ?? '').trim() }\n}\n", "// A kit: a design system and the layouts that go with it, as data and never as CSS or code, so a\n// person, an organisation or a brain can make one and no kit can do more than lay out a slide.\n// deck's own kit holds the usual layouts; a host's (an organisation's, a project's) and the deck\n// file's own `kit:` go over it, in that order. A layout is a grid: its slots by name, the areas\n// they take, its tracks, how its words sit, what paper it is on, how big its logo shows, and the\n// PowerPoint layout it is nearest to; a kit may turn one of the usual layouts off. Its tokens may\n// hold a logo, a picture inside the kit and never an address. Everything is checked against a small\n// grammar; what fails is dropped, with a reason. Pure.\n\n/** @typedef {{ required?: boolean, max_words?: number, max_chars?: number, items?: [number, number], item_max_words?: number, heading_max_words?: number, kind?: string }} Budget */\n/** @typedef {{ label?: Record<string, string> | string, intent?: string, use_when?: string, avoid_when?: string, slots: string[], budgets: Record<string, Budget>, areas: string[][], columns: string[], rows: string[], align: 'start' | 'center' | 'end', justify: 'start' | 'center' | 'end', paper: 'paper' | 'fill' | 'ink' | 'soft', title: 'normal' | 'large' | 'huge', logo: 'big' | 'small' | 'none', pptx: string, numbered: boolean }} Layout */\n/** @typedef {{ name?: string, tokens: Record<string, any>, layouts: Record<string, Layout> }} Kit */\n\nconst NAME = /^[a-z][a-z0-9-]{0,31}$/\nconst TRACK = /^(auto|min-content|max-content|\\d{1,2}(\\.\\d)?fr|\\d{1,3}%)$/\nconst PPTX = ['Title Slide', 'Title and Content', 'Section Header', 'Two Content', 'Comparison', 'Title Only', 'Blank', 'Content with Caption', 'Picture with Caption']\nconst ENUMS = /** @type {const} */ ({ align: ['start', 'center', 'end'], justify: ['start', 'center', 'end'], paper: ['paper', 'fill', 'ink', 'soft'], title: ['normal', 'large', 'huge'], logo: ['small', 'big', 'none'] })\n/** The corners a logo sits in, as `logoAt` names them, the first by default. */\nexport const CORNERS = ['top-end', 'top-start', 'bottom-end', 'bottom-start']\n\n/**\n * A logo as a kit holds it: a picture inside the kit, PNG, JPEG, GIF, WebP or SVG as a data: address of 512 KB at most,\n * never an address to fetch; else null. @param {unknown} value\n */\nexport const logoOf = (value) => (typeof value === 'string' && value.length <= 700_000 && /^data:image\\/(png|jpeg|gif|webp|svg\\+xml);base64,[a-z0-9+/]+=*$/i.test(value) ? value : null)\n\n/** The names brains give the usual layouts, for the ones deck has. */\nexport const ALIASES = /** @type {Record<string, string>} */ ({\n title: 'cover', 'title-slide': 'cover', 'two-columns': 'two-cols', 'two-column': 'two-cols', columns: 'two-cols', comparison: 'two-cols-header',\n 'three-columns': 'three-cols', 'section-header': 'section', divider: 'section', big: 'fact', number: 'fact', 'image-text': 'image-right', closing: 'end', thanks: 'end',\n})\n\n/** deck's own kit: the usual layouts, the ones Slidev names and the ones PowerPoint has, as data. */\nexport const STANDARD = /** @type {Kit} */ ({\n name: 'standard',\n tokens: {},\n layouts: Object.fromEntries(Object.entries(/** @type {Record<string, any>} */ ({\n default: { label: { en: 'Title and content', fr: 'Titre et contenu' }, pptx: 'Title and Content' },\n cover: { label: { en: 'Cover', fr: 'Couverture' }, justify: 'center', paper: 'fill', title: 'huge', logo: 'big', pptx: 'Title Slide', numbered: false },\n intro: { label: { en: 'Introduction', fr: 'Introduction' }, justify: 'center', paper: 'fill', title: 'large', logo: 'big', pptx: 'Title Slide', numbered: false },\n section: { label: { en: 'Section', fr: 'Section' }, justify: 'center', paper: 'ink', title: 'huge', pptx: 'Section Header', numbered: false },\n center: { label: { en: 'Centred', fr: 'Centré' }, justify: 'center', align: 'center', pptx: 'Title Only' },\n statement: { label: { en: 'Statement', fr: 'Affirmation' }, justify: 'center', align: 'center', title: 'large', pptx: 'Title Only' },\n fact: { label: { en: 'Big number', fr: 'Grand chiffre' }, justify: 'center', align: 'center', title: 'huge', pptx: 'Title Only' },\n quote: { label: { en: 'Quote', fr: 'Citation' }, justify: 'center', pptx: 'Title Only' },\n end: { label: { en: 'Closing', fr: 'Clôture' }, justify: 'center', align: 'center', paper: 'fill', title: 'large', logo: 'big', pptx: 'Title Slide', numbered: false },\n full: { label: { en: 'Full', fr: 'Plein cadre' }, logo: 'none', pptx: 'Blank', numbered: false },\n none: { label: { en: 'Blank', fr: 'Vide' }, logo: 'none', pptx: 'Blank', numbered: false },\n 'two-cols': { label: { en: 'Two columns', fr: 'Deux colonnes' }, slots: ['default', 'right'], areas: 'default right', columns: '1fr 1fr', pptx: 'Two Content' },\n 'two-cols-header': { label: { en: 'Comparison', fr: 'Comparaison' }, slots: ['default', 'left', 'right', 'bottom'], areas: 'default default | left right | bottom bottom', columns: '1fr 1fr', rows: 'auto 1fr auto', pptx: 'Comparison' },\n 'three-cols': { label: { en: 'Three columns', fr: 'Trois colonnes' }, slots: ['default', 'left', 'middle', 'right'], areas: 'default default default | left middle right', columns: '1fr 1fr 1fr', rows: 'auto 1fr', pptx: 'Comparison' },\n 'image-left': { label: { en: 'Picture left', fr: 'Image à gauche' }, pptx: 'Picture with Caption', justify: 'center' },\n 'image-right': { label: { en: 'Picture right', fr: 'Image à droite' }, pptx: 'Picture with Caption', justify: 'center' },\n image: { label: { en: 'Picture', fr: 'Image' }, logo: 'none', pptx: 'Blank', numbered: false },\n })).map(([name, given]) => [name, /** @type {Layout} */ (layoutOf(given).layout)])),\n})\n\n/**\n * A layout as given, checked: its slots, areas and tracks in the grammar, its words' place, paper\n * and size among their names. @param {any} given @returns {{ layout: Layout | null, problems: string[] }}\n */\nexport function layoutOf(given) {\n const problems = []\n if (!given || typeof given !== 'object') return { layout: null, problems: ['not a layout'] }\n // Slots as names, or as a catalog writes them: each a budget, `title` being the heading the\n // default slot opens with rather than a slot of its own.\n /** @type {Record<string, Budget>} */\n const budgets = {}\n const named = Array.isArray(given.slots) || typeof given.slots === 'string' ? [given.slots].flat().map(String)\n : given.slots && typeof given.slots === 'object' ? Object.entries(given.slots).map(([name, budget]) => {\n if (budget && typeof budget === 'object') budgets[name] = clean(budget)\n return name === 'title' ? 'default' : name\n }) : ['default']\n const slots = [...new Set(named)]\n if (!slots.every((slot) => NAME.test(slot))) return { layout: null, problems: ['a slot name is not a-z, 0-9 and -'] }\n if (!slots.includes('default')) slots.unshift('default')\n // Areas as Slidev's and CSS's grid write them, rows split by | or new lines.\n /** @type {string[]} */\n const lines = Array.isArray(given.areas) ? given.areas.map((/** @type {any} */ row) => [row].flat().join(' ')) : String(given.areas ?? slots.join(' ')).split(/\\||\\n/)\n const rows = lines.map((row) => row.trim().replace(/^\"|\"$/g, '').split(/\\s+/)).filter((row) => row.length && row[0])\n const width = rows[0]?.length ?? 0\n if (!rows.length || rows.some((row) => row.length !== width) || rows.flat().some((cell) => cell !== '.' && !slots.includes(cell))) return { layout: null, problems: ['areas are not a rectangle of its slots'] }\n for (const slot of slots) {\n const cells = rows.flatMap((row, y) => row.map((cell, x) => /** @type {[string, number, number]} */ ([cell, x, y]))).filter(([cell]) => cell === slot)\n if (!cells.length) { if (slot !== 'default') problems.push(`slot ${slot} has no area`); continue }\n const xs = cells.map((c) => c[1]), ys = cells.map((c) => c[2])\n if (cells.length !== (Math.max(...xs) - Math.min(...xs) + 1) * (Math.max(...ys) - Math.min(...ys) + 1)) return { layout: null, problems: [`slot ${slot} is not a rectangle`] }\n }\n const tracks = (/** @type {any} */ value, /** @type {number} */ count) => {\n const list = value === undefined ? Array(count).fill('1fr') : (Array.isArray(value) ? value : String(value).split(/\\s+/)).map(String)\n return list.length === count && list.every((t) => TRACK.test(t)) ? list : null\n }\n const columns = tracks(given.columns, width), rowTracks = tracks(given.rows, rows.length)\n if (!columns || !rowTracks) return { layout: null, problems: ['columns or rows are not tracks deck knows (auto, 1fr, 40%…), one per column or row'] }\n const pick = (/** @type {keyof typeof ENUMS} */ key, /** @type {string} */ fallback) => {\n const value = String(given[key] ?? fallback)\n if (!(/** @type {readonly string[]} */ (ENUMS[key])).includes(value)) { problems.push(`${key} ${value} is not one of ${ENUMS[key].join(', ')}`); return fallback }\n return value\n }\n const label = typeof given.label === 'string' || (given.label && typeof given.label === 'object') ? given.label : undefined\n const words = (/** @type {any} */ v) => (typeof v === 'string' ? v.slice(0, 300) : undefined)\n return {\n layout: /** @type {Layout} */ ({\n label, intent: words(given.intent), use_when: words(given.use_when), avoid_when: words(given.avoid_when), slots, budgets, areas: rows, columns, rows: rowTracks,\n align: pick('align', 'start'), justify: pick('justify', 'start'), paper: pick('paper', 'paper'), title: pick('title', 'normal'), logo: pick('logo', 'small'),\n pptx: PPTX.includes(given.pptx) ? given.pptx : slots.length > 1 ? 'Comparison' : 'Title and Content', numbered: given.numbered !== false,\n }),\n problems,\n }\n}\n\n/** A slot's budget, its numbers only. @param {Record<string, any>} given @returns {Budget} */\nfunction clean(given) {\n /** @type {Record<string, any>} */\n const kept = {}\n for (const key of ['max_words', 'max_chars', 'item_max_words', 'heading_max_words']) if (Number.isInteger(given[key]) && given[key] > 0) kept[key] = given[key]\n if (Array.isArray(given.items) && given.items.length === 2 && given.items.every(Number.isInteger)) kept.items = given.items\n if (typeof given.required === 'boolean') kept.required = given.required\n if (typeof given.kind === 'string' && /^[a-z-]{1,20}$/.test(given.kind)) kept.kind = given.kind\n return kept\n}\n\n/**\n * Design tokens as the W3C's Design Tokens format (DTCG 2025.10) writes them, read into a kit's:\n * `color.light` and `color.dark` groups (bg, surface, fg, muted, accent) or flat colours, `font.sans`\n * and the like; each `$value` a hex string or a colour object with its `hex`. Tokens already flat\n * pass through. @param {any} given @returns {Record<string, any>}\n */\nexport function tokensFrom(given) {\n if (!given || typeof given !== 'object') return {}\n if (!JSON.stringify(given).includes('\"$value\"')) return given\n const value = (/** @type {any} */ t) => (t && typeof t === 'object' && '$value' in t ? t.$value : t)\n const colour = (/** @type {any} */ t) => { const v = value(t); return typeof v === 'string' ? v : typeof v?.hex === 'string' ? v.hex : undefined }\n const face = (/** @type {any} */ t) => { const v = value(t); return Array.isArray(v) ? v.map(String) : typeof v === 'string' ? [v] : undefined }\n const NAMES = /** @type {const} */ ({ bg: 'paper', background: 'paper', paper: 'paper', fg: 'ink', text: 'ink', ink: 'ink', accent: 'primary', primary: 'primary', muted: 'muted', surface: 'soft', soft: 'soft' })\n const group = (/** @type {any} */ g) => Object.fromEntries(Object.entries(g ?? {}).filter(([k]) => k in NAMES).map(([k, t]) => [NAMES[/** @type {keyof typeof NAMES} */ (k)], colour(t)]).filter(([, v]) => v))\n const colours = given.color ?? given.colour ?? {}\n /** @type {Record<string, any>} */\n const tokens = { ...group(colours), ...group(colours.light) }\n const dark = group(colours.dark)\n if (Object.keys(dark).length) tokens.dark = dark\n const fonts = given.font ?? given.fontFamily ?? {}\n const heading = face(fonts.heading ?? fonts.display ?? fonts.sans), body = face(fonts.body ?? fonts.text ?? fonts.sans)\n if (heading || body) tokens.fonts = { heading: heading ?? body, body: body ?? heading }\n return tokens\n}\n\n/**\n * Kits merged, the later over the earlier: their tokens, their dark ones within theirs, and their layouts by name, each\n * checked; a layout given as false is taken away, but the default. A logo that isn't a picture inside the kit is dropped.\n * @param {...any} kits @returns {{ kit: Kit, problems: string[] }}\n */\nexport function mergeKits(...kits) {\n /** @type {Kit} */\n const kit = { name: 'standard', tokens: {}, layouts: { ...STANDARD.layouts } }\n const problems = []\n for (const given of kits) {\n if (!given || typeof given !== 'object') continue\n if (typeof given.name === 'string') kit.name = given.name\n if (given.tokens && typeof given.tokens === 'object') {\n const next = tokensFrom(given.tokens), dark = next.dark && typeof next.dark === 'object' ? { ...kit.tokens.dark, ...next.dark } : kit.tokens.dark\n kit.tokens = { ...kit.tokens, ...next, ...(dark && { dark }) }\n }\n for (const [name, definition] of Object.entries(given.layouts ?? given.types ?? {})) {\n if (!NAME.test(name)) { problems.push(`layout ${name}: not a-z, 0-9 and -`); continue }\n if (definition === false) { if (name !== 'default') delete kit.layouts[name]; continue }\n const { layout, problems: found } = layoutOf(definition)\n problems.push(...found.map((p) => `layout ${name}: ${p}`))\n if (layout) kit.layouts[name] = layout\n }\n }\n for (const [where, tokens] of /** @type {[string, Record<string, any> | undefined][]} */ ([['logo', kit.tokens], ['dark logo', kit.tokens.dark]])) {\n if (tokens?.logo !== undefined && !logoOf(tokens.logo)) { problems.push(`${where}: not a picture inside the kit (PNG, JPEG, GIF, WebP or SVG as data:, 512 KB at most)`); delete tokens.logo }\n }\n if (kit.tokens.logoAt !== undefined && !CORNERS.includes(kit.tokens.logoAt)) { problems.push(`logoAt ${kit.tokens.logoAt} is not one of ${CORNERS.join(', ')}`); delete kit.tokens.logoAt }\n return { kit, problems }\n}\n\n/** A layout's name in a language, else its own name. @param {Layout} layout @param {string} name @param {string} lang */\nexport function labelOf(layout, name, lang) {\n if (typeof layout.label === 'string') return layout.label\n return layout.label?.[lang] ?? layout.label?.[lang.split('-')[0]] ?? layout.label?.en ?? name\n}\n\n/**\n * The layout a slide that names none is given, from what it holds, as Pandoc's PowerPoint writer\n * chooses: the first slide is the cover; a heading alone, a section; slots beyond the first, the\n * layout of two (or three) columns that has them; a number alone as its heading, a fact; a quote\n * alone, a quote; else the default. @param {{ index: number, slots: { name: string, text: string }[] }} slide\n */\nexport function inferLayout(slide) {\n const names = slide.slots.map((slot) => slot.name)\n if (names.includes('middle')) return 'three-cols'\n if (names.includes('left')) return 'two-cols-header'\n if (names.includes('right')) return 'two-cols'\n if (slide.index === 0) return 'cover'\n const text = slide.slots.map((slot) => slot.text).join('\\n').trim()\n const lines = text.split('\\n').filter((line) => line.trim())\n if (lines.length === 1 && /^#{1,2}\\s+\\S/.test(lines[0])) return 'section'\n if (/^#\\s+[^\\s]*\\d[\\d\\s.,%€$£¥]*\\S*\\s*$/u.test(lines[0] ?? '') && lines.length <= 3 && !/^\\s*[-*\\d]+[.)]?\\s/m.test(lines.slice(1).join('\\n'))) return 'fact'\n if (lines.length && lines.every((line, i) => line.startsWith('>') || (i === lines.length - 1 && !line.startsWith('#')))) return lines[0].startsWith('>') ? 'quote' : 'default'\n return 'default'\n}\n", "// A slide drawn from its Markdown: marked's tokens made into elements with the DOM's own calls, so\n// nothing here needs innerHTML, a style attribute or a Trusted Types policy, and a page under any\n// policy can draw a deck. Each block that can be changed by hand says where its words are in the\n// source (data-edit, offsets), so an edit made on the slide goes back into the Markdown. HTML a\n// deck holds is not drawn: Slidev's <v-click> and <v-clicks> become steps, <br> a line break, and\n// any other tag gives up its words alone. ```echarts and ```mermaid go to the host's drawers.\nimport { STANDARD, CORNERS, inferLayout, ALIASES } from './kit.js'\n\n/** @typedef {import('./parse.js').Slide} Slide */\n/** @typedef {import('./parse.js').Slot} Slot */\n/** @typedef {(element: HTMLElement, source: string) => void | Promise<void>} Drawer */\n/** @typedef {{ blocks: Record<string, Drawer>, resolve: (src: string) => string | null, headings: 'real' | 'aria', number: (n: number) => string, total: number, kit: import('./kit.js').Kit, lex: (markdown: string) => any[], slide: string }} Context */\n\n/**\n * @param {string} tag @param {Record<string, string | number | boolean | undefined>} [attributes]\n * @param {(Node | string | null | undefined | false)[]} [children]\n */\nexport function h(tag, attributes = {}, children = []) {\n const element = document.createElement(tag)\n for (const [name, value] of Object.entries(attributes)) if (value !== undefined && value !== false) element.setAttribute(name, value === true ? '' : String(value))\n for (const child of children) if (child || child === '') element.append(child)\n return element\n}\n\n/** An address a slide may show: the web's, a picture held in the file, or one beside it. @param {string} href */\nexport function safeUrl(href) {\n const url = String(href ?? '').trim()\n if (/^(https?:|mailto:|blob:|#)/i.test(url) || /^data:image\\/(png|jpe?g|gif|webp|avif|svg\\+xml);/i.test(url)) return url\n if (/^[a-z][\\w+.-]*:/i.test(url)) return null\n return url\n}\n\n/**\n * A slide, laid out by its layout, with its slots, steps and number.\n * @param {Slide} slide @param {Context} context @returns {{ element: HTMLElement, steps: number }}\n */\nexport function renderSlide(slide, context) {\n // The layout the slide names, by its name or a name brains give it, else the one its content suits.\n const asked = String(slide.settings.layout ?? '').trim().toLowerCase()\n const layout = context.kit.layouts[asked] ? asked : context.kit.layouts[ALIASES[asked]] ? ALIASES[asked] : inferLayout(slide)\n const definition = context.kit.layouts[layout] ?? STANDARD.layouts.default\n const classes = String(slide.settings.class ?? '').split(/\\s+/).filter((name) => ['invert', 'text-center', 'text-left'].includes(name))\n const counter = { step: 0 }\n const slots = new Map(slide.slots.map((slot) => [slot.name, slot]))\n const names = definition.slots\n const section = h('section', {\n class: ['deck-slide', `deck-layout-${layout}`, ...classes.map((name) => `deck-class-${name}`)].join(' '),\n 'data-index': slide.index, 'data-layout': layout, 'data-paper': definition.paper, 'data-align': definition.align, 'data-justify': definition.justify, 'data-title': definition.title,\n 'aria-roledescription': context.slide, role: 'group',\n })\n // Its grid, from the layout's definition, through the CSSOM: areas named s-<slot>, as `default` is no name CSS allows.\n const canvas = h('div', { class: 'deck-canvas' })\n canvas.style.setProperty('grid-template-areas', definition.areas.map((row) => `\"${row.map((cell) => (cell === '.' ? '.' : `s-${cell}`)).join(' ')}\"`).join(' '))\n canvas.style.setProperty('grid-template-columns', definition.columns.join(' '))\n canvas.style.setProperty('grid-template-rows', definition.rows.join(' '))\n section.append(canvas)\n const image = slide.settings.image ?? slide.settings.background\n if (typeof image === 'string' && ['image-left', 'image-right', 'image', 'cover'].includes(layout)) {\n const url = context.resolve(image)\n if (url) {\n const picture = h('div', { class: 'deck-image', role: 'img', 'aria-label': String(slide.settings.alt ?? '') || undefined })\n picture.style.setProperty('--deck-image', `url(\"${url.replace(/[\"\\\\\\n]/g, encodeURIComponent)}\")`)\n canvas.append(picture)\n section.classList.add('has-image')\n }\n }\n for (const name of names) {\n const slot = slots.get(name)\n const element = h('div', { class: 'deck-slot', 'data-slot': name }, slot ? blocks(slot, context, counter) : [])\n element.style.setProperty('grid-area', `s-${name}`)\n canvas.append(element)\n }\n // Slots a layout doesn't have still show, under the rest, rather than being lost.\n for (const slot of slide.slots) if (!names.includes(slot.name)) canvas.append(h('div', { class: 'deck-slot', 'data-slot': slot.name }, blocks(slot, context, counter)))\n if (definition.numbered && slide.settings.paginate !== false) section.append(h('span', { class: 'deck-number', 'aria-hidden': 'true' }, [context.number(slide.index + 1)]))\n // The kit's logo in its corner, small, or big where the layout says (a cover, the end); its dark one beside it, which the\n // stylesheet shows on dark paper, where without one the logo sits on a light plate.\n const { logo, logoAt, dark } = context.kit.tokens, at = CORNERS.includes(logoAt) ? logoAt : CORNERS[0]\n if (logo && definition.logo !== 'none') {\n for (const [src, kind] of [[logo, dark?.logo ? 'has-dark' : ''], [dark?.logo, 'is-dark']]) {\n if (src) section.append(h('img', { class: `deck-logo ${kind}`.trim(), src, alt: '', 'aria-hidden': 'true', 'data-size': definition.logo, 'data-at': at }))\n }\n }\n return { element: section, steps: counter.step }\n}\n\n/** @param {Slot} slot @param {Context} context @param {{ step: number }} counter @returns {Node[]} */\nfunction blocks(slot, context, counter) {\n const tokens = context.lex(slot.text)\n /** @type {Node[]} */\n const out = []\n let at = slot.start, mode = /** @type {'' | 'click' | 'clicks'} */ ('')\n for (const token of tokens) {\n const start = at\n at += token.raw.length\n // Pandoc's fences: `::: incremental` shows its list a point a click, as <v-clicks> does; the others, nothing.\n const fences = token.type === 'paragraph' ? token.raw.trim().split('\\n').map((/** @type {string} */ line) => line.trim()) : []\n if (fences.length && fences.every((/** @type {string} */ line) => /^:{3,}/.test(line))) {\n for (const fence of fences) {\n if (/^:{3,}[ \\t]*\\{?[ \\t]*\\.?incremental\\b/.test(fence)) mode = 'clicks'\n else if (/^:{3,}\\s*$/.test(fence) && mode === 'clicks') mode = ''\n }\n continue\n }\n if (token.type === 'html') {\n const tag = /^\\s*<(\\/?)(v-clicks?|br)\\b[^>]*>\\s*$/i.exec(token.raw)\n if (tag && tag[2] === 'br') out.push(h('br'))\n else if (tag) mode = tag[1] ? '' : /** @type {'click' | 'clicks'} */ (tag[2].toLowerCase() === 'v-clicks' ? 'clicks' : 'click')\n else if (/<li\\b/i.test(token.raw)) {\n // A list written as HTML, as brains write Slidev's steps (<li v-click>): its items' words, each\n // a step when it asks to be one.\n const list = h(/<ol\\b/i.test(token.raw) ? 'ol' : 'ul', { dir: 'auto' })\n for (const [, attrs, inner] of token.raw.matchAll(/<li\\b([^>]*)>([\\s\\S]*?)(?=<\\/li>|<li\\b|<\\/[ou]l>|$)/gi)) {\n const words = inner.replace(/<!--[\\s\\S]*?-->/g, '').replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim()\n if (!words) continue\n const li = h('li', { dir: 'auto' }, [words])\n if (/\\bv-click\\b/.test(attrs) || mode === 'clicks') step(li, ++counter.step)\n list.append(li)\n }\n if (list.childElementCount) out.push(list)\n } else {\n const words = token.raw.replace(/<!--[\\s\\S]*?-->/g, '').replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim()\n if (words) out.push(h('p', {}, [words]))\n }\n continue\n }\n const element = block(token, start, context, mode === 'clicks' ? counter : null)\n if (!element) continue\n if (mode === 'click' || (mode === 'clicks' && token.type !== 'list')) step(element, ++counter.step)\n out.push(element)\n }\n return out\n}\n\n/** @param {Element} element @param {number} n */\nconst step = (element, n) => { element.classList.add('deck-step'); element.setAttribute('data-step', String(n)) }\n\n/**\n * @param {any} token @param {number} start where its raw starts in the source\n * @param {Context} context @param {{ step: number } | null} stepped list items each a step\n * @returns {HTMLElement | null}\n */\nfunction block(token, start, context, stepped) {\n switch (token.type) {\n case 'heading': {\n const head = /^\\s*#{1,6}[ \\t]+/.exec(token.raw)\n const edit = head ? range(start + head[0].length, start + token.raw.replace(/\\s*#*\\s*$/, '').length) : undefined\n return context.headings === 'real'\n ? h(`h${token.depth}`, { dir: 'auto', 'data-edit': edit }, inline(token.tokens, context))\n : h('p', { class: `deck-h deck-h${token.depth}`, role: 'heading', 'aria-level': Math.min(6, token.depth + 2), dir: 'auto', 'data-edit': edit }, inline(token.tokens, context))\n }\n case 'paragraph': {\n const lone = token.tokens.length === 1 && token.tokens[0].type === 'image'\n return h('p', { dir: 'auto', class: lone ? 'deck-picture' : undefined, 'data-edit': lone ? undefined : range(start, start + token.raw.trimEnd().length) }, inline(token.tokens, context))\n }\n case 'text': return h('p', { dir: 'auto' }, inline(token.tokens ?? [{ type: 'text', text: token.text }], context))\n // No dir=auto here: the browser would skip its paragraphs, which have their own, and find no letter.\n case 'blockquote': return h('blockquote', {}, children(token.tokens, start, token.raw, context))\n case 'list': {\n let from = 0\n const list = h(token.ordered ? 'ol' : 'ul', { start: token.ordered && token.start !== 1 ? token.start : undefined, class: token.items.some((/** @type {any} */ item) => item.task) ? 'deck-tasks' : undefined })\n for (const item of token.items) {\n const offset = token.raw.indexOf(item.raw, from)\n from = offset + item.raw.length\n const itemStart = start + Math.max(0, offset)\n const marker = /^\\s*(?:[-*+]|\\d+[.)])\\s+(?:\\[[ xX]\\]\\s+)?/.exec(item.raw)\n const simple = item.tokens.length === 1 && item.tokens[0].type === 'text' && !/\\n\\s*\\S/.test(item.raw.trim().split('\\n').slice(1).join('\\n'))\n const li = h('li', { dir: 'auto', 'data-edit': simple && marker ? range(itemStart + marker[0].length, itemStart + item.raw.trimEnd().length) : undefined }, [\n item.task ? h('input', { type: 'checkbox', checked: item.checked, disabled: true, 'aria-label': item.text }) : null,\n ...item.tokens.flatMap((/** @type {any} */ inner) => inner.type === 'text' ? inline(inner.tokens ?? [{ type: 'text', text: inner.text }], context)\n : [block(inner, itemStart + Math.max(0, item.raw.indexOf(inner.raw)), context, null)]),\n ])\n if (stepped) step(li, ++stepped.step)\n list.append(li)\n }\n return list\n }\n case 'code': {\n const info = /^(\\S*)\\s*(?:\\{([^}]*)\\})?/.exec(token.lang ?? '') ?? []\n const lang = (info[1] ?? '').toLowerCase()\n const drawer = context.blocks[lang]\n if (drawer) {\n const box = h('div', { class: `deck-block deck-${lang}`, 'data-source': token.text })\n box.append(h('pre', { class: 'deck-block-source', dir: 'ltr' }, [h('code', {}, [token.text])]))\n queueMicrotask(() => Promise.resolve(drawer(box, token.text)).catch(() => box.classList.add('is-failed')))\n return box\n }\n const marked = lines(info[2] ?? '')\n const code = h('code', { class: lang ? `language-${lang}` : undefined })\n for (const [i, line] of token.text.split('\\n').entries()) code.append(h('span', { class: marked.has(i + 1) ? 'deck-line is-marked' : 'deck-line' }, [line, '\\n']))\n return h('pre', { dir: 'ltr', class: marked.size ? 'has-marks' : undefined, tabindex: 0 }, [code])\n }\n case 'table': {\n const align = (/** @type {string | null} */ a) => a ?? undefined\n return h('div', { class: 'deck-table' }, [h('table', {}, [\n h('thead', {}, [h('tr', {}, token.header.map((/** @type {any} */ cell, /** @type {number} */ i) => h('th', { 'data-align': align(token.align[i]), dir: 'auto' }, inline(cell.tokens, context))))]),\n h('tbody', {}, token.rows.map((/** @type {any[]} */ row) => h('tr', {}, row.map((cell, i) => h('td', { 'data-align': align(token.align[i]), dir: 'auto' }, inline(cell.tokens, context)))))),\n ])])\n }\n default: return null\n }\n}\n\n/** @param {any[]} tokens @param {number} start @param {string} raw @param {Context} context */\nfunction children(tokens, start, raw, context) {\n let from = 0\n return tokens.map((token) => {\n const offset = raw.indexOf(token.raw, from)\n from = Math.max(from, offset + token.raw.length)\n return block(token, start + Math.max(0, offset), context, null)\n })\n}\n\n/** Line numbers as Slidev marks them, `{2,4-5}`; `|` steps are read as all their lines at once. @param {string} text */\nfunction lines(text) {\n const marked = new Set()\n for (const part of text.split(/[,|]/)) {\n const [a, b] = part.split('-').map((n) => parseInt(n, 10))\n if (Number.isFinite(a)) for (let n = a; n <= (Number.isFinite(b) ? b : a); n++) marked.add(n)\n }\n return marked\n}\n\n/** @param {number} from @param {number} to */\nconst range = (from, to) => (to > from ? `${from}-${to}` : undefined)\n\n/** @param {any[]} tokens @param {Context} context @returns {Node[]} */\nexport function inline(tokens = [], context) {\n return tokens.flatMap((token) => {\n switch (token.type) {\n case 'text': case 'escape': return token.tokens ? inline(token.tokens, context) : [token.text.replace(/&(amp|lt|gt|quot|#39);/g, (/** @type {string} */ _, /** @type {string} */ e) => ({ amp: '&', lt: '<', gt: '>', quot: '\"', '#39': \"'\" })[/** @type {'amp'} */ (e)])]\n case 'strong': return [h('strong', {}, inline(token.tokens, context))]\n case 'em': return [h('em', {}, inline(token.tokens, context))]\n case 'del': return [h('del', {}, inline(token.tokens, context))]\n case 'codespan': return [h('code', {}, [token.text.replace(/&(amp|lt|gt|quot|#39);/g, (/** @type {string} */ _, /** @type {string} */ e) => ({ amp: '&', lt: '<', gt: '>', quot: '\"', '#39': \"'\" })[/** @type {'amp'} */ (e)])])]\n case 'br': return [h('br')]\n case 'link': {\n const href = safeUrl(token.href)\n return href ? [h('a', { href, rel: 'noopener noreferrer', target: href.startsWith('#') ? undefined : '_blank' }, inline(token.tokens, context))] : inline(token.tokens, context)\n }\n case 'image': {\n const src = context.resolve(token.href)\n return src ? [h('img', { src, alt: token.text, loading: 'lazy' })] : [token.text]\n }\n case 'html': return /^<br\\s*\\/?>$/i.test(token.raw) ? [h('br')] : []\n default: return token.text ? [token.text] : []\n }\n })\n}\n", "// A deck's look: a design system's few tokens (paper, ink, primary, a voice for its type), from a\n// named look, then the project's, then the deck's own `themeConfig`, as Slidev names a theme's\n// settings. Light and dark are both worked out from them: each colour kept at its hue, deepened or\n// lightened until it reads at AA on the paper it sits on (4.5:1 for words, 3:1 for a chart's\n// marks), so a brain's or a person's colours can't make a slide unreadable. Pure.\n\n/** @typedef {{ paper: string, ink: string, primary: string, voice: string, radius: number, muted?: string, soft?: string, series?: string[], dark?: Record<string, string>, fonts?: { heading: string[], body: string[] } }} Tokens */\n/** @typedef {{ paper: string, ink: string, muted: string, line: string, primary: string, onPrimary: string, soft: string, series: string[] }} Scheme */\n\n/** Looks a deck can name (`theme:`), each a handful of tokens. */\nexport const LOOKS = /** @type {Record<string, Tokens>} */ ({\n default: { paper: '#fffdf8', ink: '#1d1b16', primary: '#f7c531', voice: 'calm', radius: 10 },\n ocean: { paper: '#f6fafb', ink: '#0d2530', primary: '#0f766e', voice: 'calm', radius: 6 },\n ember: { paper: '#fff8f3', ink: '#2a160c', primary: '#d9480f', voice: 'bold', radius: 2 },\n ink: { paper: '#ffffff', ink: '#111111', primary: '#3b5bdb', voice: 'elegant', radius: 0 },\n})\n\n/** Type for each voice: the device's faces, so a deck needs nothing to download to look right. */\nexport const VOICES = /** @type {Record<string, { heading: string, body: string }>} */ ({\n calm: { heading: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, \"Noto Sans\", sans-serif', body: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, \"Noto Sans\", sans-serif' },\n elegant: { heading: 'ui-serif, \"Iowan Old Style\", Georgia, \"Noto Serif\", serif', body: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, sans-serif' },\n bold: { heading: '\"Avenir Next Condensed\", \"Arial Narrow\", ui-sans-serif, system-ui, sans-serif', body: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, sans-serif' },\n friendly: { heading: 'ui-rounded, \"SF Pro Rounded\", \"Nunito\", system-ui, sans-serif', body: 'ui-rounded, \"SF Pro Rounded\", system-ui, sans-serif' },\n})\n\n/**\n * The tokens a deck's settings give, over the project's look and a named one.\n * @param {Record<string, any>} settings @param {Partial<Tokens>} [project]\n * @returns {Tokens}\n */\nexport function tokensOf(settings, project = {}) {\n const named = LOOKS[String(settings.theme ?? '')] ?? LOOKS.default\n const own = typeof settings.themeConfig === 'object' && settings.themeConfig ? settings.themeConfig : {}\n /** @type {Tokens} */\n const tokens = { ...named, ...clean(project), ...clean(own) }\n if (!VOICES[tokens.voice]) tokens.voice = 'calm'\n return tokens\n}\n\n/** @param {Record<string, any>} given @returns {Partial<Tokens>} */\nfunction clean(given) {\n /** @type {Partial<Tokens>} */\n const kept = {}\n for (const key of /** @type {const} */ (['paper', 'ink', 'primary', 'muted', 'soft'])) if (typeof given[key] === 'string' && hex(given[key])) kept[key] = given[key]\n if (given.dark && typeof given.dark === 'object') kept.dark = Object.fromEntries(Object.entries(given.dark).filter(([, v]) => typeof v === 'string' && hex(v)))\n if (given.fonts && Array.isArray(given.fonts.heading) && Array.isArray(given.fonts.body)) kept.fonts = { heading: given.fonts.heading.map(String), body: given.fonts.body.map(String) }\n if (typeof given.voice === 'string') kept.voice = given.voice\n if (typeof given.radius === 'number') kept.radius = given.radius\n if (Array.isArray(given.series) && given.series.length && given.series.every((/** @type {unknown} */ c) => typeof c === 'string' && hex(c))) kept.series = given.series.slice(0, 6)\n return kept\n}\n\n/**\n * Light or dark, worked out from the tokens: dark swaps paper and ink and lifts the primary.\n * @param {Tokens} tokens @param {'light' | 'dark'} scheme @returns {Scheme}\n */\nexport function schemeOf(tokens, scheme) {\n const light = hex(tokens.paper) ?? [255, 253, 248], dark = hex(tokens.ink) ?? [29, 27, 22]\n // A kit's own dark colours where it gives them (a design system's dark mode), else worked out.\n const own = scheme === 'dark' ? tokens.dark ?? {} : {}\n const paper = round(hex(own.paper ?? '') ?? (scheme === 'dark' ? mix(dark, [0, 0, 0], 0.35) : light))\n const ink = round(hex(own.ink ?? '') ?? (scheme === 'dark' ? mix(light, [255, 255, 255], 0.2) : dark))\n const primary = hex(own.primary ?? tokens.primary) ?? [247, 197, 49]\n // The primary as a fill keeps its own colour; as words or marks it is made to read on the paper.\n const text = readable(primary, paper, 4.5)\n const onPrimary = contrast(ink, primary) >= contrast(paper, primary) ? ink : paper\n // A chart's colours: the kit's own (a template's accents), else the primary turned round the wheel; each made to read at 3:1.\n const given = (tokens.series ?? []).map(hex).filter((c) => c !== null)\n const series = [0, 1, 2, 3, 4, 5].map((n) => readable(/** @type {number[]} */ (given[n % (given.length || 1)] ?? rotate(primary, n * 57)), paper, 3))\n return {\n paper: css(paper), ink: css(ink), muted: css(readable(round(hex(own.muted ?? (scheme === 'light' ? tokens.muted ?? '' : '')) ?? mix(ink, paper, 0.38)), paper, 4.5)), line: css(mix(ink, paper, 0.82)),\n primary: css(text), onPrimary: css(onPrimary), soft: css(hex(own.soft ?? (scheme === 'light' ? tokens.soft ?? '' : '')) ?? mix(primary, paper, 0.78)), series: series.map(css),\n }\n}\n\n/** @param {string} value @returns {[number, number, number] | null} */\nexport function hex(value) {\n const m = /^#?([\\da-f]{3}|[\\da-f]{6})$/i.exec(String(value).trim())\n if (!m) return null\n const h = m[1].length === 3 ? [...m[1]].map((c) => c + c).join('') : m[1]\n return /** @type {[number, number, number]} */ ([0, 2, 4].map((i) => parseInt(h.slice(i, i + 2), 16)))\n}\n\n/** @param {number[]} rgb */\nexport const css = (rgb) => `#${rgb.map((c) => Math.round(Math.max(0, Math.min(255, c))).toString(16).padStart(2, '0')).join('')}`\n\n/** A colour as it will be written: whole numbers, so that it reads at the ratio checked. @param {number[]} c */\nconst round = (c) => /** @type {[number, number, number]} */ (c.map((v) => Math.round(Math.max(0, Math.min(255, v)))))\n\n/** @param {number[]} a @param {number[]} b @param {number} t */\nconst mix = (a, b, t) => /** @type {[number, number, number]} */ (a.map((c, i) => c + (b[i] - c) * t))\n\n/** @param {number[]} rgb */\nfunction luminance(rgb) {\n const [r, g, b] = rgb.map((c) => { const s = c / 255; return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4 })\n return 0.2126 * r + 0.7152 * g + 0.0722 * b\n}\n\n/** WCAG's contrast ratio. @param {number[]} a @param {number[]} b */\nexport function contrast(a, b) {\n const [x, y] = [luminance(a), luminance(b)].sort((p, q) => q - p)\n return (x + 0.05) / (y + 0.05)\n}\n\n/**\n * The colour, its hue kept, deepened or lightened toward black or white until it reads at the\n * ratio on the paper. @param {number[]} colour @param {number[]} paper @param {number} ratio\n */\nexport function readable(colour, paper, ratio) {\n const toward = luminance(paper) > 0.18 ? [0, 0, 0] : [255, 255, 255]\n let t = 0, out = round(colour)\n while (contrast(out, paper) < ratio && t < 1) out = round(mix(colour, toward, (t = Math.min(1, t + 0.02))))\n return out\n}\n\n/** The colour turned round the colour wheel. @param {number[]} rgb @param {number} degrees */\nfunction rotate(rgb, degrees) {\n const [r, g, b] = rgb.map((c) => c / 255)\n const max = Math.max(r, g, b), min = Math.min(r, g, b), l = (max + min) / 2\n const d = max - min\n const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1))\n let h = d === 0 ? 0 : max === r ? ((g - b) / d) % 6 : max === g ? (b - r) / d + 2 : (r - g) / d + 4\n h = (h * 60 + degrees + 360) % 360\n const c = (1 - Math.abs(2 * l - 1)) * Math.max(s, 0.55), x = c * (1 - Math.abs(((h / 60) % 2) - 1)), m = l - c / 2\n const [p, q, u] = h < 60 ? [c, x, 0] : h < 120 ? [x, c, 0] : h < 180 ? [0, c, x] : h < 240 ? [0, x, c] : h < 300 ? [x, 0, c] : [c, 0, x]\n return [p + m, q + m, u + m].map((v) => v * 255)\n}\n", "// The deck's own words, for a deck opened on its own; a host gives its own instead (options.strings).\nconst STRINGS = /** @type {Record<string, Record<string, string>>} */ ({\n en: { deck: 'Slides', slide: 'slide', carousel: 'carousel', previous: 'Previous', next: 'Next', present: 'Present full screen', presenter: 'Presenter view', overview: 'All slides', edit: 'Change', scheme: 'Light or dark', export: 'Save as PowerPoint', source: 'The deck as text', notes: 'Notes', noNotes: 'No notes for this slide.', upNext: 'Next', last: 'Last slide', where: 'Slide {n} of {count}', saved: 'Saved' },\n fr: { deck: 'Diapositives', slide: 'diapositive', carousel: 'carrousel', previous: 'Précédente', next: 'Suivante', present: 'Présenter en plein écran', presenter: 'Vue présentateur', overview: 'Toutes les diapositives', edit: 'Modifier', scheme: 'Clair ou sombre', export: 'Enregistrer en PowerPoint', source: 'La présentation en texte', notes: 'Notes', noNotes: 'Pas de notes pour cette diapositive.', upNext: 'Ensuite', last: 'Dernière diapositive', where: 'Diapositive {n} sur {count}', saved: 'Enregistré' },\n ar: { deck: 'الشرائح', slide: 'شريحة', carousel: 'عرض شرائح', previous: 'السابقة', next: 'التالية', present: 'العرض بملء الشاشة', presenter: 'عرض المقدّم', overview: 'كل الشرائح', edit: 'تعديل', scheme: 'فاتح أو داكن', export: 'الحفظ بصيغة PowerPoint', source: 'العرض كنص', notes: 'الملاحظات', noNotes: 'لا ملاحظات لهذه الشريحة.', upNext: 'التالية', last: 'الشريحة الأخيرة', where: 'الشريحة {n} من {count}', saved: 'تم الحفظ' },\n ja: { deck: 'スライド', slide: 'スライド', carousel: 'カルーセル', previous: '前へ', next: '次へ', present: '全画面で発表', presenter: '発表者ビュー', overview: 'すべてのスライド', edit: '編集', scheme: 'ライトまたはダーク', export: 'PowerPoint で保存', source: 'テキストとしてのスライド', notes: 'メモ', noNotes: 'このスライドにメモはありません。', upNext: '次', last: '最後のスライド', where: 'スライド {n} / {count}', saved: '保存しました' },\n})\n\n/** @param {string} lang */\nexport const stringsFor = (lang) => STRINGS[lang.split('-')[0].toLowerCase()] ?? STRINGS.en\n", "import type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Gets the original marked default options.\n */\nexport function _getDefaults<ParserOutput = string, RendererOutput = string>(): MarkedOptions<ParserOutput, RendererOutput> {\n return {\n async: false,\n breaks: false,\n extensions: null,\n gfm: true,\n hooks: null,\n pedantic: false,\n renderer: null,\n silent: false,\n tokenizer: null,\n walkTokens: null,\n };\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport let _defaults: MarkedOptions<any, any> = _getDefaults();\n\nexport function changeDefaults<ParserOutput = string, RendererOutput = string>(newDefaults: MarkedOptions<ParserOutput, RendererOutput>) {\n _defaults = newDefaults;\n}\n", "const noopTest = { exec: () => null } as unknown as RegExp;\n\nfunction cachedIndentRegex(createRegex: (indent: number) => RegExp) {\n const cache: RegExp[] = [];\n return (indent: number) => {\n const cacheIndex = Math.max(0, Math.min(3, indent - 1));\n let regex = cache[cacheIndex];\n if (!regex) {\n regex = createRegex(cacheIndex);\n cache[cacheIndex] = regex;\n }\n return regex;\n };\n}\n\nfunction edit(regex: string | RegExp, opt = '') {\n let source = typeof regex === 'string' ? regex : regex.source;\n const obj = {\n replace: (name: string | RegExp, val: string | RegExp) => {\n let valSource = typeof val === 'string' ? val : val.source;\n valSource = valSource.replace(other.caret, '$1');\n source = source.replace(name, valSource);\n return obj;\n },\n getRegex: () => {\n return new RegExp(source, opt);\n },\n };\n return obj;\n}\n\n// use a default variable to ensure the regex is evaluated on client an not removed by minifiers\nconst supportsLookbehind = ((a = '') => {\ntry {\n return !!new RegExp('(?<=1)(?<!1)' + a);\n} catch {\n // See browser support here:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Lookbehind_assertion\n return false;\n}\n})();\n\nexport const other = {\n codeRemoveIndent: /^(?: {0,3}\\t| {1,4})/gm,\n outputLinkReplace: /\\\\([\\[\\]])/g,\n indentCodeCompensation: /^(\\s+)(?:```)/,\n beginningSpace: /^\\s+/,\n endingHash: /#$/,\n startingSpaceChar: /^ /,\n endingSpaceChar: / $/,\n endingSpaceTabChar: /[ \\t]$/,\n nonSpaceChar: /[^ ]/,\n newLineCharGlobal: /\\n/g,\n tabCharGlobal: /\\t/g,\n leadingSpaceTab: /^[ \\t]+/,\n multipleSpaceGlobal: /\\s+/g,\n blankLine: /^[ \\t]*$/,\n doubleBlankLine: /\\n[ \\t]*\\n[ \\t]*$/,\n blockquoteStart: /^ {0,3}>/,\n blockquoteSetextReplace: /\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,\n blockquoteSetextReplace2: /^ {0,3}>[ \\t]?/gm,\n listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,\n listIsTask: /^\\[[ xX]\\] +\\S/,\n listReplaceTask: /^\\[[ xX]\\] +/,\n listTaskCheckbox: /\\[[ xX]\\]/,\n anyLine: /\\n.*\\n/,\n hrefBrackets: /^<(.*)>$/,\n tableDelimiter: /[:|]/,\n tableAlignChars: /^\\||\\| *$/g,\n tableRowBlankLine: /\\n[ \\t]*$/,\n tableAlignRight: /^ *-+: *$/,\n tableAlignCenter: /^ *:-+: *$/,\n tableAlignLeft: /^ *:-+ *$/,\n startATag: /^<a /i,\n endATag: /^<\\/a>/i,\n startPreScriptTag: /^<(pre|code|kbd|script)(\\s|>)/i,\n endPreScriptTag: /^<\\/(pre|code|kbd|script)(\\s|>)/i,\n startAngleBracket: /^</,\n endAngleBracket: />$/,\n pedanticHrefTitle: /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,\n unicodeAlphaNumeric: /[\\p{L}\\p{N}]/u,\n numericCharacterReference: /&#(?:(\\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));/,\n numericCharacterReferenceOrAmpersand: /&#(?:(\\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,\n escapeTest: /[&<>\"']/,\n escapeReplace: /[&<>\"']/g,\n escapeTestNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,\n escapeReplaceNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,\n caret: /(^|[^\\[])\\^/g,\n percentDecode: /%25/g,\n findPipe: /\\|/g,\n splitPipe: / \\|/,\n slashPipe: /\\\\\\|/g,\n carriageReturn: /\\r\\n|\\r/g,\n spaceLine: /^ +$/gm,\n notSpaceStart: /^\\S*/,\n endingNewline: /\\n$/,\n listItemRegex: (bull: string) => new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`),\n nextBulletRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`)),\n hrRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}((?:-[ \\t]*){3,}|(?:_[ \\t]*){3,}|(?:\\\\*[ \\t]*){3,})(?:\\\\n+|$)`)),\n fencesBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}(?:\\`\\`\\`|~~~)`)),\n headingBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}#`)),\n // a list item ends where a paragraph would be interrupted, so this mirrors the\n // html start conditions in the paragraph rule below; type 7 is excluded there\n htmlBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}(?:</?(?:${_tag})(?: +|$|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\\\s>]|$)|!--)|<\\\\?|<![A-Za-z]|<!\\\\[CDATA\\\\[)`, 'i')),\n blockquoteBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}>`)),\n};\n\n/**\n * Block-Level Grammar\n */\n\nconst newline = /^(?:[ \\t]*(?:\\n|$))+/;\nconst blockCode = /^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/;\nconst fences = /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/;\nconst hr = /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/;\nconst heading = /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/;\nconst bullet = / {0,3}(?:[*+-]|\\d{1,9}[.)])/;\nconst lheadingCore = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |fences|blockquote|heading|hr|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/;\nconst lheading = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code can start a block but cannot interrupt a paragraph\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}(?:\\s|$)/) // ATX heading can interrupt\n .replace(/hr/g, / {0,3}(?:(?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/) // thematic break can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/\\|table/g, '') // table not in commonmark\n .getRegex();\nconst lheadingGfm = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code can start a block but cannot interrupt a paragraph\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}(?:\\s|$)/) // ATX heading can interrupt\n .replace(/hr/g, / {0,3}(?:(?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/) // thematic break can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/table/g, / {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/) // table can interrupt\n .getRegex();\nconst _paragraph = /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \\t]+\\n)[^\\n]+)*)/;\nconst blockText = /^[^\\n]+/;\nconst _blockLabel = /(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/;\nconst def = edit(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/)\n .replace('label', _blockLabel)\n .replace('title', /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/)\n .getRegex();\n\nconst list = edit(/^(bull)([ \\t][^\\n]*?)?(?:\\n|$)/)\n .replace(/bull/g, bullet)\n .getRegex();\n\nconst _tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title'\n + '|tr|track|ul';\nconst _comment = /<!--(?:-?>|[\\s\\S]*?(?:-->|$))/;\nconst html = edit(\n '^ {0,3}(?:' // optional indentation\n+ '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n*|$)' // (1)\n+ '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n+ '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>[^\\\\n]*\\\\n*|$)' // (3)\n+ '|<![A-Z][\\\\s\\\\S]*?(?:>[^\\\\n]*\\\\n*|$)' // (4)\n+ '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>[^\\\\n]*\\\\n*|$)' // (5)\n+ '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (6)\n+ '|<(?!(?:script|pre|style|textarea)(?![a-z0-9-]))([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) open tag\n+ '|</[a-z][a-z0-9-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) closing tag\n+ ')', 'i')\n .replace('comment', _comment)\n .replace('tag', _tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nconst createParagraph = (listInterrupt: RegExp) => edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)')\n .replace('list', listInterrupt)\n .replace('html', ' {0,3}(?:</?(?:tag)(?: +|\\\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\\\s>]|$)|!--)|<\\\\?|<![A-Za-z]|<!\\\\[CDATA\\\\[)')\n .replace('tag', _tag) // pars can be interrupted by html blocks of types (1) to (6)\n .getRegex();\n\n// only non-empty lists starting from 1 can interrupt paragraphs\nconst paragraph = createParagraph(/ {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]/);\n// inside a blockquote a bare list marker (any number) starts a sibling list,\n// so it must not be lazily continued as paragraph text (unlike a top level\n// paragraph, where an empty list cannot interrupt)\nconst blockquoteParagraph = createParagraph(/ {0,3}(?:[*+-]|\\d{1,9}[.)])(?:[ \\t]|\\n|$)/);\n\nconst blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/)\n .replace('paragraph', blockquoteParagraph)\n .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nconst blockNormal = {\n blockquote,\n code: blockCode,\n def,\n fences,\n heading,\n hr,\n html,\n lheading,\n list,\n newline,\n paragraph,\n table: noopTest,\n text: blockText,\n};\n\ntype BlockKeys = keyof typeof blockNormal;\n\n/**\n * GFM Block Grammar\n */\n\nconst gfmTable = edit(\n '^ *([^\\\\n ].*)\\\\n' // Header\n+ ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n+ '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)') // Cells\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('blockquote', ' {0,3}>')\n .replace('code', '(?: {4}| {0,3}\\t)[^\\\\n]')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)')\n .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]') // any bullet ends the table rows\n .replace('html', ' {0,3}(?:</?(?:tag)(?: +|\\\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\\\s>]|$)|!--)|<\\\\?|<![A-Za-z]|<!\\\\[CDATA\\\\[)')\n .replace('tag', _tag) // tables can be interrupted by html blocks of types (1) to (6)\n .getRegex();\n\nconst blockGfm: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n lheading: lheadingGfm,\n table: gfmTable,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('table', gfmTable) // interrupt paragraphs with table\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)')\n .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]+[^ \\\\t\\\\n]') // only non-empty lists starting from 1 can interrupt\n .replace('html', ' {0,3}(?:</?(?:tag)(?: +|\\\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\\\s>]|$)|!--)|<\\\\?|<![A-Za-z]|<!\\\\[CDATA\\\\[)')\n .replace('tag', _tag) // pars can be interrupted by html blocks of types (1) to (6)\n .getRegex(),\n};\n\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nconst blockPedantic: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n html: edit(\n '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', _comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n fences: noopTest, // fences not supported\n lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' *#{1,6} *[^\\n]')\n .replace('lheading', lheading)\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('|fences', '')\n .replace('|list', '')\n .replace('|html', '')\n .replace('|tag', '')\n .getRegex(),\n};\n\n/**\n * Inline-Level Grammar\n */\n\nconst escape = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nconst inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst br = /^( {2,}|\\\\)\\n(?!\\s*$)[ \\t]*/;\nconst inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\nconst _punctuation = /[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpace = /[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpace = /[^\\s\\p{P}\\p{S}]/u;\nconst punctuation = edit(/^((?![*_])punctSpace)/, 'u')\n .replace(/punctSpace/g, _punctuationOrSpace).getRegex();\n\n/**\n * Opening punct/quotes excluded from pedantic LDelim nextChar so\n * `aa**\"A\"**bb` / `aa**(A)**bb` can start strong (Pi + Ps + ASCII straight quotes).\n */\nconst _openQuote = /[\\p{Pi}\\p{Ps}\"']/u;\n\n// GFM allows ~ inside strong and em for strikethrough\nconst _punctuationGfmStrongEm = /(?!~)[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpaceGfmStrongEm = /(?!~)[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpaceGfmStrongEm = /(?:[^\\s\\p{P}\\p{S}]|~)/u;\n\n// sequences em should skip over [title](link), `code`, <html>\nconst blockSkip = edit(/link|precode-code|html/, 'g')\n .replace('link', /\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/)\n .replace('precode-', supportsLookbehind ? '(?<!`)()' : '(^^|[^`])')\n .replace('code', /(?<b>`+)[^`]+\\k<b>(?!`)/)\n .replace('html', /<(?! )[^<>]*?>/)\n .getRegex();\n\nconst emStrongLDelimCore = /^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/;\n\nconst emStrongLDelim = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongLDelimGfm = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\n// Pedantic: do not treat opening punct/quotes as left-delim punct (e.g. **( / **\").\nconst emStrongLDelimPedanticCore = /^(?:\\*+(?:((?!\\*)(?!openQuote)punct)|([^\\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\\s_]))?/;\n\nconst emStrongLDelimPedantic = edit(emStrongLDelimPedanticCore, 'u')\n .replace(/openQuote/g, _openQuote)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongRDelimAstCore =\n '^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n+ '|[^*]+(?=[^*])' // Consume to delim\n+ '|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)' // (2) a***#, a*** can only be a Right Delimiter\n+ '|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)' // (3) #***a, ***a can only be Left Delimiter\n+ '|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)' // (4) ***# can only be Left Delimiter\n+ '|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)' // (5) #***# can be either Left or Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?=notPunctSpace)'; // (6) a***a can be either Left or Right Delimiter\n\nconst emStrongRDelimAst = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongRDelimAstGfm = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmStrongEm)\n .replace(/punctSpace/g, _punctuationOrSpaceGfmStrongEm)\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\n// Pedantic: rule 3 requires whitespace before left delim; rule 6 allows punct before close (e.g. `:**bar`).\nconst emStrongRDelimAstPedanticCore =\n '^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n+ '|[^*]+(?=[^*])' // Consume to delim\n+ '|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)' // (2) a***#, a*** can only be a Right Delimiter\n+ '|(?!\\\\*)[\\\\s](\\\\*+)(?=notPunctSpace)' // (3) ***a can only be Left Delimiter (whitespace required; not #***a)\n+ '|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)' // (4) ***# can only be Left Delimiter\n+ '|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)' // (5) #***# can be either Left or Right Delimiter\n+ '|(?:(?!\\\\*)punct|notPunctSpace)(\\\\*+)(?!\\\\*)(?=notPunctSpace)'; // (6) a***a, #***a, and :** (e.g. **foo:**bar)\n\nconst emStrongRDelimAstPedantic = edit(emStrongRDelimAstPedanticCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// Normal: no rule 6 for _ (a___a cannot close as emphasis).\nconst emStrongRDelimUnd = edit(\n '^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n+ '|[^_]+(?=[^_])' // Consume to delim\n+ '|(?!_)punct(_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n+ '|notPunctSpace(_+)(?!_)(?=punctSpace|$)' // (2) a___#, a___ can only be a Right Delimiter\n+ '|(?!_)punctSpace(_+)(?=notPunctSpace)' // (3) #___a, ___a can only be Left Delimiter\n+ '|[\\\\s](_+)(?!_)(?=punct)' // (4) ___# can only be Left Delimiter\n+ '|(?!_)punct(_+)(?!_)(?=punct)', 'gu') // (5) #___# can be either Left or Right Delimiter\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// Pedantic: same rule 3/6 adjustments as emStrongRDelimAstPedantic (e.g. `_foo:_bar`).\nconst emStrongRDelimUndPedanticCore =\n '^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n+ '|[^_]+(?=[^_])' // Consume to delim\n+ '|(?!_)punct(_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n+ '|notPunctSpace(_+)(?!_)(?=punctSpace|$)' // (2) a___#, a___ can only be a Right Delimiter\n+ '|(?!_)[\\\\s](_+)(?=notPunctSpace)' // (3) ___a can only be Left Delimiter (whitespace required; not #___a)\n+ '|[\\\\s](_+)(?!_)(?=punct)' // (4) ___# can only be Left Delimiter\n+ '|(?!_)punct(_+)(?!_)(?=punct)' // (5) #___# can be either Left or Right Delimiter\n+ '|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)'; // (6) a___a, #___a, and :__ (e.g. _foo:_bar)\n\nconst emStrongRDelimUndPedantic = edit(emStrongRDelimUndPedanticCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// Tilde left delimiter for strikethrough (similar to emStrongLDelim for asterisk)\nconst delLDelim = edit(/^~~?(?:((?!~)punct)|[^\\s~])/, 'u')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// Tilde delimiter patterns for strikethrough (similar to asterisk)\nconst delRDelimCore =\n '^[^~]+(?=[^~])' // Consume to delim\n+ '|(?!~)punct(~~?)(?=[\\\\s]|$)' // (1) #~~ can only be a Right Delimiter\n+ '|notPunctSpace(~~?)(?!~)(?=punctSpace|$)' // (2) a~~#, a~~ can only be a Right Delimiter\n+ '|(?!~)punctSpace(~~?)(?=notPunctSpace)' // (3) #~~a, ~~a can only be Left Delimiter\n+ '|[\\\\s](~~?)(?!~)(?=punct)' // (4) ~~# can only be Left Delimiter\n+ '|(?!~)punct(~~?)(?!~)(?=punct)' // (5) #~~# can be either Left or Right Delimiter\n+ '|notPunctSpace(~~?)(?=notPunctSpace)'; // (6) a~~a can be either Left or Right Delimiter\n\nconst delRDelim = edit(delRDelimCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst anyPunctuation = edit(/\\\\(punct)/, 'gu')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// `anyPunctuation` for the em/strong mask. A backslash is literal inside a code\n// span, so a code span (matched like `inline.code`), or a backtick run that\n// opens none, is matched whole and kept; only the escapes outside code spans\n// are masked.\nconst anyPunctuationOutsideCode = edit(/(`+)(?:[^`]|[^`][\\s\\S]*?[^`])\\1(?!`)|`+|\\\\(punct)/, 'gu')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst autolink = edit(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/)\n .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/)\n .replace('email', /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/)\n .getRegex();\n\nconst _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();\nconst tag = edit(\n '^comment'\n + '|^</[a-zA-Z][a-zA-Z0-9-]*\\\\s*>' // self-closing tag\n + '|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>') // CDATA section\n .replace('comment', _inlineComment)\n .replace('attribute', /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/)\n .getRegex();\n\n// One matched pair of brackets, holding no bracket of its own.\nconst _inlineLabelBrackets = /\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]/;\n// CommonMark lets the brackets in a link label nest to any depth, which a regex\n// cannot follow, so it stops at a fixed one. Two levels is what the spec suite\n// asks for: a third and a fourth flip no further example.\nconst _inlineLabel = edit(/(?:\\[(?:brackets|\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/)\n .replace('brackets', _inlineLabelBrackets)\n .getRegex();\n\nconst link = edit(/^!?\\[(label)\\]\\([ \\t\\n]*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?[ \\t\\n]*\\)/)\n .replace('label', _inlineLabel)\n .replace('href', /<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]+|(?=\\))/)\n .replace('title', /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/)\n .getRegex();\n\nconst reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n .replace('label', _inlineLabel)\n .replace('ref', _blockLabel)\n .getRegex();\n\nconst nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n .replace('ref', _blockLabel)\n .getRegex();\n\n// `reflink` and `nolink` are anchored, so the tokenizer tries each of them at a\n// single position. `reflinkSearch` drops the anchors and runs with the global\n// flag, which makes every '[' in the source a start position. A label crosses a\n// bracket only by escaping it, and nothing caps how often it does, so a\n// candidate that can never match still scans to the end of the source and the\n// whole pass costs O(n^2).\n//\n// The labels below bound that scan. `_boundedInlineLabel` limits how many\n// escapes, code spans and nested brackets a link text may hold, leaving runs of\n// ordinary characters unbounded so link text of any length is still found.\n// `_boundedBlockLabel` limits the label itself to 999 items, which is every\n// label CommonMark allows: \"A link label can have at most 999 characters\n// inside the square brackets.\"\nconst _boundedBlockLabel = /(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\]){1,999}/;\nconst _boundedInlineLabel = edit(/(?:[^\\[\\]\\\\`]*(?:\\[(?:brackets|\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\]))){0,999}?[^\\[\\]\\\\`]*?/)\n .replace('brackets', _inlineLabelBrackets)\n .getRegex();\n\nconst reflinkSearch = edit('reflink|nolink(?!\\\\()', 'g')\n .replace('reflink', edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n .replace('label', _boundedInlineLabel)\n .replace('ref', _boundedBlockLabel)\n .getRegex())\n .replace('nolink', edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n .replace('ref', _boundedBlockLabel)\n .getRegex())\n .getRegex();\n\nconst _caseInsensitiveProtocol = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/;\nconst _extendedEmail = /[A-Za-z0-9._+-]+@[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\\w-])/;\nconst _extendedEmailProtocol = edit(/(?:mailto:email|xmpp:email(?:\\/[A-Za-z0-9@.]+)?)/)\n .replace(/email/g, _extendedEmail)\n .getRegex();\n\n/**\n * Normal Inline Grammar\n */\n\nconst inlineNormal = {\n _backpedal: noopTest, // only used for GFM url\n anyPunctuation,\n anyPunctuationOutsideCode,\n autolink,\n blockSkip,\n br,\n code: inlineCode,\n del: noopTest,\n delLDelim: noopTest,\n delRDelim: noopTest,\n emStrongLDelim,\n emStrongRDelimAst,\n emStrongRDelimUnd,\n escape,\n link,\n nolink,\n punctuation,\n reflink,\n reflinkSearch,\n tag,\n text: inlineText,\n url: noopTest,\n};\n\ntype InlineKeys = keyof typeof inlineNormal;\n\n/**\n * Pedantic Inline Grammar\n */\n\nconst inlinePedantic: Record<InlineKeys, RegExp> = {\n ...inlineNormal,\n emStrongLDelim: emStrongLDelimPedantic,\n emStrongRDelimAst: emStrongRDelimAstPedantic,\n emStrongRDelimUnd: emStrongRDelimUndPedantic,\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', _inlineLabel)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', _inlineLabel)\n .getRegex(),\n};\n\n/**\n * GFM Inline Grammar\n */\n\nconst inlineGfm: Record<InlineKeys, RegExp> = {\n ...inlineNormal,\n emStrongRDelimAst: emStrongRDelimAstGfm,\n emStrongLDelim: emStrongLDelimGfm,\n delLDelim,\n delRDelim,\n url: edit(/^emailProtocol|^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/)\n .replace('emailProtocol', _extendedEmailProtocol)\n .replace('protocol', _caseInsensitiveProtocol)\n .replace('email', /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\\w-])/)\n .getRegex(),\n _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n del: /^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,\n text: edit(/^(?:[^a-zA-Z0-9](?=emailProtocol)|(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9](?=emailProtocol)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@))))/)\n .replace('protocol', _caseInsensitiveProtocol)\n .replace(/emailProtocol/g, /(?:mailto|xmpp):/)\n .getRegex(),\n};\n\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\nconst inlineBreaks: Record<InlineKeys, RegExp> = {\n ...inlineGfm,\n br: edit(br).replace('{2,}', '*').getRegex(),\n text: edit(inlineGfm.text)\n .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n .replace(/\\{2,\\}/g, '*')\n .getRegex(),\n};\n\n/**\n * exports\n */\n\nexport const block = {\n normal: blockNormal,\n gfm: blockGfm,\n pedantic: blockPedantic,\n};\n\nexport const inline = {\n normal: inlineNormal,\n gfm: inlineGfm,\n breaks: inlineBreaks,\n pedantic: inlinePedantic,\n};\n\nexport interface Rules {\n other: typeof other\n block: Record<BlockKeys, RegExp>\n inline: Record<InlineKeys, RegExp>\n}\n", "import { other } from './rules.ts';\n\n/**\n * Helpers\n */\nconst escapeReplacements: { [index: string]: string } = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\nconst getEscapeReplacement = (ch: string) => escapeReplacements[ch];\n\nexport function escapeHtmlEntities(html: string, encode?: boolean) {\n if (encode) {\n if (other.escapeTest.test(html)) {\n return html.replace(other.escapeReplace, getEscapeReplacement);\n }\n } else {\n if (other.escapeTestNoEncode.test(html)) {\n return html.replace(other.escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n\n return html;\n}\n\n/**\n * Numeric character references are recognized outside code and are equivalent to the\n * character they name. Values that are zero, out of range, or a surrogate become the\n * replacement character.\n */\nexport function decodeNumericCharacterReferences(text: string) {\n if (!other.numericCharacterReference.test(text)) {\n return text;\n }\n // A decoded character must not join its neighbours into a new reference,\n // so every `&` that is not already one is escaped here.\n return text.replace(other.numericCharacterReferenceOrAmpersand, (ref: string, dec?: string, hex?: string) => {\n if (dec === undefined && hex === undefined) {\n return '&amp;';\n }\n const code = dec === undefined ? Number.parseInt(hex!, 16) : Number.parseInt(dec, 10);\n if (code === 0 || code > 0x10ffff || (code >= 0xd800 && code <= 0xdfff)) {\n return '\uFFFD';\n }\n return code === 38 ? '&amp;' : String.fromCodePoint(code);\n });\n}\n\nexport function cleanUrl(href: string) {\n try {\n href = encodeURI(href).replace(other.percentDecode, '%');\n } catch {\n return null;\n }\n return href;\n}\n\nexport function splitCells(tableRow: string, count?: number) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n const row = tableRow.replace(other.findPipe, (match, offset, str) => {\n let escaped = false;\n let curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n } else {\n // add space before unescaped |\n return ' |';\n }\n }),\n cells = row.split(other.splitPipe);\n let i = 0;\n\n // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n if (!cells[0].trim()) {\n cells.shift();\n }\n if (cells.length > 0 && !cells.at(-1)?.trim()) {\n cells.pop();\n }\n\n if (count) {\n if (cells.length > count) {\n cells.splice(count);\n } else {\n while (cells.length < count) cells.push('');\n }\n }\n\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(other.slashPipe, '|');\n }\n return cells;\n}\n\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nexport function rtrim(str: string, c: string, invert?: boolean) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n const currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n } else if (currChar !== c && invert) {\n suffLen++;\n } else {\n break;\n }\n }\n\n return str.slice(0, l - suffLen);\n}\n\nexport function trimTrailingBlankLines(str: string) {\n const lines = str.split('\\n');\n let end = lines.length - 1;\n while (end >= 0 && other.blankLine.test(lines[end])) {\n end--;\n }\n if (lines.length - end <= 2) {\n // we want to keep single trailing blank lines\n return str;\n }\n\n return lines.slice(0, end + 1).join('\\n');\n}\n\n/**\n * Normalizes a link label so definitions and references can be matched.\n * CommonMark asks for a Unicode case fold, which `toLowerCase()` does not\n * reach: `\u1E9E` lowercases to `\u00DF` and so never meets `SS`. Round-tripping\n * through upper case does, as in commonmark.js; the final `toLowerCase()`\n * keeps the folded label lower case, the form `def.tag` has always used.\n */\nexport function normalizeLabel(label: string) {\n // The spec also asks for leading and trailing spaces, tabs and line endings\n // to be stripped. Doing it here keeps every call site in agreement: the\n // definition and the reference have to normalize to the same key.\n return label.trim().toLowerCase().toUpperCase().toLowerCase();\n}\n\nexport function findClosingBracket(str: string, b: string) {\n // an opening bracket on its own is still unbalanced, so both have to be absent\n if (str.indexOf(b[0]) === -1 && str.indexOf(b[1]) === -1) {\n return -1;\n }\n\n let level = 0;\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '\\\\') {\n i++;\n } else if (str[i] === b[0]) {\n level++;\n } else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n if (level > 0) {\n return -2;\n }\n\n return -1;\n}\n\nexport function expandTabs(line: string, indent = 0) {\n let col = indent;\n let expanded = '';\n for (const char of line) {\n if (char === '\\t') {\n const added = 4 - (col % 4);\n expanded += ' '.repeat(added);\n col += added;\n } else {\n expanded += char;\n col++;\n }\n }\n\n return expanded;\n}\n", "import { _defaults } from './defaults.ts';\nimport {\n rtrim,\n splitCells,\n findClosingBracket,\n expandTabs,\n normalizeLabel,\n decodeNumericCharacterReferences,\n trimTrailingBlankLines,\n} from './helpers.ts';\nimport type { Rules } from './rules.ts';\nimport type { _Lexer } from './Lexer.ts';\nimport type { Links, Tokens, Token } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\nfunction outputLink(cap: string[], link: Pick<Tokens.Link, 'href' | 'title'>, raw: string, lexer: _Lexer, rules: Rules): Tokens.Link | Tokens.Image | undefined {\n const href = link.href;\n const title = link.title || null;\n const text = cap[1].replace(rules.other.outputLinkReplace, '$1');\n const isImage = cap[0].charAt(0) === '!';\n\n const outerInLink = lexer.state.inLink;\n const outerLinkEmitted = lexer.state.linkEmitted;\n const outerInRawBlock = lexer.state.inRawBlock;\n lexer.state.inLink = true;\n lexer.state.linkEmitted = false;\n const tokens = lexer.inlineTokens(text);\n const textHasLink = lexer.state.linkEmitted;\n lexer.state.linkEmitted = outerLinkEmitted;\n lexer.state.inLink = outerInLink;\n\n if (!isImage) {\n // CommonMark: \"Links may not contain other links, at any level of nesting.\"\n // Bail so the caller falls through to text and the inner link is the one kept.\n // Images are exempt: their text is flattened into an alt attribute.\n if (textHasLink) {\n // these tokens are discarded, so undo the raw-block state they opened;\n // leaving it set would suppress escaping for the text that is re-scanned\n lexer.state.inRawBlock = outerInRawBlock;\n return;\n }\n lexer.state.linkEmitted = true;\n }\n\n return {\n type: isImage ? 'image' : 'link',\n raw,\n href,\n title,\n text,\n tokens,\n };\n}\n\nfunction indentCodeCompensation(raw: string, text: string, rules: Rules) {\n const matchIndentToCode = raw.match(rules.other.indentCodeCompensation);\n\n if (matchIndentToCode === null) {\n return text;\n }\n\n const indentToCode = matchIndentToCode[1];\n\n return text\n .split('\\n')\n .map(node => {\n const matchIndentInNode = node.match(rules.other.beginningSpace);\n if (matchIndentInNode === null) {\n return node;\n }\n\n const [indentInNode] = matchIndentInNode;\n\n // Up to the fence's own indentation is removed from each line, so a line\n // indented less than the fence loses whatever indentation it has.\n return node.slice(Math.min(indentInNode.length, indentToCode.length));\n })\n .join('\\n');\n}\n\nfunction isLabelEndInsideToken(src: string, label: string, labelStart: number, rules: Rules) {\n if (!label.includes('<')) {\n return false;\n }\n\n for (let i = 0; i < label.length; i++) {\n if (label[i] === '\\\\') {\n i++;\n continue;\n }\n\n if (label[i] === '`') {\n const code = rules.inline.code.exec(label.slice(i));\n if (code) {\n i += code[0].length - 1;\n continue;\n }\n }\n\n if (label[i] !== '<') {\n continue;\n }\n\n const tokenSrc = src.slice(labelStart + i);\n const token = rules.inline.tag.exec(tokenSrc) || rules.inline.autolink.exec(tokenSrc);\n if (!token) {\n continue;\n }\n\n if (token[0].length > label.length - i) {\n return true;\n }\n i += token[0].length - 1;\n }\n return false;\n}\n\n/**\n * Tokenizer\n */\nexport class _Tokenizer<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n rules!: Rules; // set by the lexer\n lexer!: _Lexer<ParserOutput, RendererOutput>; // set by the lexer\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n space(src: string): Tokens.Space | undefined {\n const cap = this.rules.block.newline.exec(src);\n if (cap && cap[0].length > 0) {\n return {\n type: 'space',\n raw: cap[0],\n };\n }\n }\n\n code(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.code.exec(src);\n if (cap) {\n const raw = this.options.pedantic\n ? cap[0]\n : trimTrailingBlankLines(cap[0]);\n const text = raw.replace(this.rules.other.codeRemoveIndent, '');\n return {\n type: 'code',\n raw,\n codeBlockStyle: 'indented',\n text,\n };\n }\n }\n\n fences(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.fences.exec(src);\n if (cap) {\n const raw = cap[0];\n const text = indentCodeCompensation(raw, cap[3] || '', this.rules);\n\n return {\n type: 'code',\n raw,\n lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2],\n text,\n };\n }\n }\n\n heading(src: string): Tokens.Heading | undefined {\n const cap = this.rules.block.heading.exec(src);\n if (cap) {\n let text = cap[2].trim();\n\n // remove trailing #s\n if (this.rules.other.endingHash.test(text)) {\n const trimmed = rtrim(text, '#');\n if (this.options.pedantic) {\n text = trimmed.trim();\n } else if (!trimmed || this.rules.other.endingSpaceTabChar.test(trimmed)) {\n // CommonMark requires a space or tab before trailing #s\n text = trimmed.trim();\n }\n }\n\n return {\n type: 'heading',\n raw: rtrim(cap[0], '\\n'),\n depth: cap[1].length,\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n hr(src: string): Tokens.Hr | undefined {\n const cap = this.rules.block.hr.exec(src);\n if (cap) {\n return {\n type: 'hr',\n raw: rtrim(cap[0], '\\n'),\n };\n }\n }\n\n blockquote(src: string): Tokens.Blockquote | undefined {\n const cap = this.rules.block.blockquote.exec(src);\n if (cap) {\n let lines = rtrim(cap[0], '\\n').split('\\n');\n let raw = '';\n let text = '';\n const tokens: Token[] = [];\n\n while (lines.length > 0) {\n let inBlockquote = false;\n const currentLines = [];\n\n let i;\n for (i = 0; i < lines.length; i++) {\n // get lines up to a continuation\n if (this.rules.other.blockquoteStart.test(lines[i])) {\n currentLines.push(lines[i]);\n inBlockquote = true;\n } else if (!inBlockquote) {\n currentLines.push(lines[i]);\n } else {\n break;\n }\n }\n lines = lines.slice(i);\n\n const currentRaw = currentLines.join('\\n');\n const currentText = currentRaw\n // precede setext continuation with 4 spaces so it isn't a setext\n .replace(this.rules.other.blockquoteSetextReplace, '\\n $1')\n .replace(this.rules.other.blockquoteSetextReplace2, '');\n raw = raw ? `${raw}\\n${currentRaw}` : currentRaw;\n text = text ? `${text}\\n${currentText}` : currentText;\n\n // parse blockquote lines as top level tokens\n // merge paragraphs if this is a continuation\n const top = this.lexer.state.top;\n this.lexer.state.top = true;\n this.lexer.blockTokens(currentText, tokens, true);\n this.lexer.state.top = top;\n\n // if there is no continuation then we are done\n if (lines.length === 0) {\n break;\n }\n\n const lastToken = tokens.at(-1);\n\n if (lastToken?.type === 'code' || lastToken?.type === 'heading' || lastToken?.type === 'hr' || lastToken?.type === 'html') {\n // blockquote continuation cannot be preceded by a code block, heading, hr or html block\n break;\n } else if (lastToken?.type === 'blockquote') {\n // include continuation in nested blockquote\n const oldToken = lastToken as Tokens.Blockquote;\n // The continuation lines belong to the same nesting frame as the\n // nested blockquote, which already had one '>' marker stripped, so\n // strip one marker from them too. Otherwise a restated marker after a\n // lazy line is re-parsed as a spurious deeper blockquote.\n const continuation = lines.join('\\n');\n const newText = oldToken.raw + '\\n' + continuation.replace(this.rules.other.blockquoteSetextReplace2, '');\n const newToken = this.blockquote(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n // Only include continuation lines the nested blockquote actually\n // consumed. Unconsumed trailing lines must stay out of `raw` so the\n // lexer can still tokenize them (paragraph, next blockquote, etc.).\n const leftover = newText.substring(newToken.raw.length).replace(/^\\n/, '');\n const leftoverCount = leftover ? leftover.split('\\n').length : 0;\n const consumed = leftoverCount ? lines.slice(0, -leftoverCount) : lines;\n if (consumed.length > 0) {\n raw = `${raw}\\n${consumed.join('\\n')}`;\n }\n text = text.substring(0, text.length - oldToken.text.length) + newToken.text;\n break;\n } else if (lastToken?.type === 'list') {\n // include continuation in nested list\n const oldToken = lastToken as Tokens.List;\n const newText = oldToken.raw + '\\n' + lines.join('\\n');\n const newToken = this.list(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;\n text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;\n lines = newText.substring(tokens.at(-1)!.raw.length).split('\\n');\n continue;\n }\n }\n\n return {\n type: 'blockquote',\n raw,\n tokens,\n text,\n };\n }\n }\n\n list(src: string): Tokens.List | undefined {\n let cap = this.rules.block.list.exec(src);\n if (cap) {\n // src is only consumed from the front, so every raw below is a slice of\n // listSrc rather than a string built up line by line\n const listSrc = src;\n const taken = () => listSrc.length - src.length;\n let bull = cap[1].trim();\n const isordered = bull.length > 1;\n\n const list: Tokens.List = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: [],\n };\n\n bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n }\n\n // Get next list item\n const itemRegex = this.rules.other.listItemRegex(bull);\n let endsWithBlankLine = false;\n // Check if current bullet point can start a new List Item\n while (src) {\n let endEarly = false;\n let itemContents = '';\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n\n if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n break;\n }\n\n const itemStart = taken();\n src = src.substring(cap[0].length);\n\n const firstLine = cap[2].split('\\n', 1)[0];\n const bulletIndent = cap[1].length;\n let line = this.options.pedantic\n ? expandTabs(firstLine, bulletIndent)\n : firstLine.replace(this.rules.other.leadingSpaceTab, whitespace => expandTabs(whitespace, bulletIndent));\n let nextLine = src.split('\\n', 1)[0];\n let blankLine = !line.trim();\n\n let indent = 0;\n if (this.options.pedantic) {\n indent = 2;\n itemContents = line.trimStart();\n } else if (blankLine) {\n indent = bulletIndent + 1;\n } else {\n indent = line.search(this.rules.other.nonSpaceChar); // Find first non-space char\n indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n itemContents = line.slice(indent);\n indent += bulletIndent;\n }\n\n if (blankLine && this.rules.other.blankLine.test(nextLine)) { // Items begin with at most one blank line\n src = src.substring(nextLine.length + 1);\n endEarly = true;\n }\n\n if (!endEarly) {\n const nextBulletRegex = this.rules.other.nextBulletRegex(indent);\n const hrRegex = this.rules.other.hrRegex(indent);\n const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent);\n const headingBeginRegex = this.rules.other.headingBeginRegex(indent);\n const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent);\n const blockquoteBeginRegex = this.rules.other.blockquoteBeginRegex(indent);\n\n // Check if following lines should be included in List Item\n while (src) {\n const rawLine = src.split('\\n', 1)[0];\n let nextLineWithoutTabs;\n nextLine = rawLine;\n\n // Re-align to follow commonmark nesting rules\n if (this.options.pedantic) {\n nextLine = nextLine.replace(this.rules.other.listReplaceNesting, ' ');\n nextLineWithoutTabs = nextLine;\n } else {\n nextLineWithoutTabs = nextLine.replace(this.rules.other.leadingSpaceTab, whitespace => expandTabs(whitespace));\n }\n\n // End list item if found code fences\n if (fencesBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new heading\n if (headingBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of html block\n if (htmlBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of blockquote\n if (blockquoteBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new bullet\n if (nextBulletRegex.test(nextLine)) {\n break;\n }\n\n // Horizontal rule found\n if (hrRegex.test(nextLine)) {\n break;\n }\n\n if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) { // Dedent if possible\n itemContents += '\\n' + nextLineWithoutTabs.slice(indent);\n } else {\n // not enough indentation\n if (blankLine) {\n break;\n }\n\n // paragraph continuation unless last line was a different block level element\n if (line.replace(this.rules.other.tabCharGlobal, ' ').search(this.rules.other.nonSpaceChar) >= 4) { // indented code block\n break;\n }\n if (fencesBeginRegex.test(line)) {\n break;\n }\n if (headingBeginRegex.test(line)) {\n break;\n }\n if (hrRegex.test(line)) {\n break;\n }\n\n itemContents += '\\n' + nextLine;\n }\n\n blankLine = !nextLine.trim();\n\n src = src.substring(rawLine.length + 1);\n line = nextLineWithoutTabs.slice(indent);\n }\n }\n\n // The loops above appended a '\\n' the source may not have had. It could\n // only land on the item that exhausts src, whose raw is trimmed below,\n // and after which nothing reads endsWithBlankLine\n const raw = listSrc.slice(itemStart, taken());\n\n if (!list.loose) {\n // If the previous item ended with a blank line, the list is loose\n if (endsWithBlankLine) {\n list.loose = true;\n } else if (this.rules.other.doubleBlankLine.test(raw)) {\n endsWithBlankLine = true;\n }\n }\n\n list.items.push({\n type: 'list_item',\n raw,\n task: !!this.options.gfm && this.rules.other.listIsTask.test(itemContents),\n loose: false,\n text: itemContents,\n tokens: [],\n });\n }\n\n // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n const lastItem = list.items.at(-1);\n if (lastItem) {\n lastItem.raw = lastItem.raw.trimEnd();\n lastItem.text = lastItem.text.trimEnd();\n } else {\n // not a list since there were no items\n return;\n }\n list.raw = listSrc.slice(0, taken()).trimEnd();\n\n // Item child tokens handled here at end because we needed to have the final item to trim it first\n // First pass: tokenize items and finalize list.loose from spacers before placing checkboxes\n for (const item of list.items) {\n this.lexer.state.top = false;\n item.tokens = this.lexer.blockTokens(item.text, []);\n\n if (!list.loose) {\n // Check if list should be loose\n const spacers = item.tokens.filter(t => t.type === 'space');\n const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => this.rules.other.anyLine.test(t.raw));\n\n list.loose = hasMultipleLineBreaks;\n }\n }\n\n // Second pass: place task checkboxes using the final list.loose\n for (const item of list.items) {\n const itemToken = item.tokens[0];\n if (item.task && (itemToken?.type === 'text' || itemToken?.type === 'paragraph')) {\n // Remove checkbox markdown from item tokens\n item.text = item.text.replace(this.rules.other.listReplaceTask, '');\n itemToken.raw = itemToken.raw.replace(this.rules.other.listReplaceTask, '');\n itemToken.text = itemToken.text.replace(this.rules.other.listReplaceTask, '');\n for (let i = this.lexer.inlineQueue.length - 1; i >= 0; i--) {\n if (this.rules.other.listIsTask.test(this.lexer.inlineQueue[i].src)) {\n this.lexer.inlineQueue[i].src = this.lexer.inlineQueue[i].src.replace(this.rules.other.listReplaceTask, '');\n break;\n }\n }\n\n const taskRaw = this.rules.other.listTaskCheckbox.exec(item.raw);\n if (taskRaw) {\n const checkboxToken: Tokens.Checkbox = {\n type: 'checkbox',\n raw: taskRaw[0] + ' ',\n checked: taskRaw[0] !== '[ ]',\n };\n item.checked = checkboxToken.checked;\n if (list.loose) {\n if (item.tokens[0] && ['paragraph', 'text'].includes(item.tokens[0].type) && 'tokens' in item.tokens[0] && item.tokens[0].tokens) {\n item.tokens[0].raw = checkboxToken.raw + item.tokens[0].raw;\n item.tokens[0].text = checkboxToken.raw + item.tokens[0].text;\n item.tokens[0].tokens.unshift(checkboxToken);\n } else {\n item.tokens.unshift({\n type: 'paragraph',\n raw: checkboxToken.raw,\n text: checkboxToken.raw,\n tokens: [checkboxToken],\n });\n }\n } else {\n item.tokens.unshift(checkboxToken);\n }\n }\n } else if (item.task) {\n item.task = false;\n }\n }\n\n // Set all items to loose if list is loose\n if (list.loose) {\n for (const item of list.items) {\n item.loose = true;\n for (const token of item.tokens) {\n if (token.type === 'text') {\n token.type = 'paragraph';\n }\n }\n }\n }\n\n return list;\n }\n }\n\n html(src: string): Tokens.HTML | undefined {\n const cap = this.rules.block.html.exec(src);\n if (cap) {\n const raw = trimTrailingBlankLines(cap[0]);\n const token: Tokens.HTML = {\n type: 'html',\n block: true,\n raw,\n pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n text: raw,\n };\n return token;\n }\n }\n\n def(src: string): Tokens.Def | undefined {\n const cap = this.rules.block.def.exec(src);\n if (cap) {\n // outside angle brackets a link destination holds only balanced parentheses\n if (!this.rules.other.startAngleBracket.test(cap[2]) && findClosingBracket(cap[2], '()') !== -1) {\n return;\n }\n\n const tag = normalizeLabel(cap[1]).replace(this.rules.other.multipleSpaceGlobal, ' ');\n const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, '$1').replace(this.rules.inline.anyPunctuation, '$1') : '';\n const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3];\n return {\n type: 'def',\n tag,\n raw: rtrim(cap[0], '\\n'),\n href,\n title,\n };\n }\n }\n\n table(src: string): Tokens.Table | undefined {\n const cap = this.rules.block.table.exec(src);\n if (!cap) {\n return;\n }\n\n if (!this.rules.other.tableDelimiter.test(cap[2])) {\n // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n return;\n }\n\n const headers = splitCells(cap[1]);\n const aligns = cap[2].replace(this.rules.other.tableAlignChars, '').split('|');\n const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, '').split('\\n') : [];\n\n const item: Tokens.Table = {\n type: 'table',\n raw: rtrim(cap[0], '\\n'),\n header: [],\n align: [],\n rows: [],\n };\n\n if (headers.length !== aligns.length) {\n // header and align columns must be equal, rows can be different.\n return;\n }\n\n for (const align of aligns) {\n if (this.rules.other.tableAlignRight.test(align)) {\n item.align.push('right');\n } else if (this.rules.other.tableAlignCenter.test(align)) {\n item.align.push('center');\n } else if (this.rules.other.tableAlignLeft.test(align)) {\n item.align.push('left');\n } else {\n item.align.push(null);\n }\n }\n\n for (let i = 0; i < headers.length; i++) {\n item.header.push({\n text: headers[i],\n tokens: this.lexer.inline(headers[i]),\n header: true,\n align: item.align[i],\n });\n }\n\n for (const row of rows) {\n item.rows.push(splitCells(row, item.header.length).map((cell, i) => {\n return {\n text: cell,\n tokens: this.lexer.inline(cell),\n header: false,\n align: item.align[i],\n };\n }));\n }\n\n return item;\n }\n\n lheading(src: string): Tokens.Heading | undefined {\n const cap = this.rules.block.lheading.exec(src);\n if (cap) {\n const text = cap[1].trim();\n return {\n type: 'heading',\n raw: rtrim(cap[0], '\\n'),\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n paragraph(src: string): Tokens.Paragraph | undefined {\n const cap = this.rules.block.paragraph.exec(src);\n if (cap) {\n const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1];\n return {\n type: 'paragraph',\n raw: cap[0],\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n text(src: string): Tokens.Text | undefined {\n const cap = this.rules.block.text.exec(src);\n if (cap) {\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n tokens: this.lexer.inline(cap[0]),\n };\n }\n }\n\n escape(src: string): Tokens.Escape | undefined {\n const cap = this.rules.inline.escape.exec(src);\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: cap[1],\n };\n }\n }\n\n tag(src: string): Tokens.Tag | undefined {\n const cap = this.rules.inline.tag.exec(src);\n if (cap) {\n if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) {\n this.lexer.state.inLink = true;\n } else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n } else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\n\n return {\n type: 'html',\n raw: cap[0],\n inLink: this.lexer.state.inLink,\n inRawBlock: this.lexer.state.inRawBlock,\n block: false,\n text: cap[0],\n };\n }\n }\n\n link(src: string): Tokens.Link | Tokens.Image | undefined {\n // The link regex backtracks quadratically over unterminated-link inputs\n // like '[a](b'.repeat(n): at every '[' its greedy unquoted-href run\n // re-partitions the whole remainder while hunting for a ')' that never\n // comes. inlineTokens anchors one paren scan per run in\n // state.linkParenPossible; when it is false the regex cannot match, so\n // bail out before running it.\n if (this.lexer.state.linkParenPossible === false) {\n return undefined;\n }\n const cap = this.rules.inline.link.exec(src);\n if (cap) {\n const labelStart = cap[0].charAt(0) === '!' ? 2 : 1;\n if (!this.options.pedantic && isLabelEndInsideToken(src, cap[1], labelStart, this.rules)) {\n return;\n }\n\n const trimmedUrl = cap[2].trim();\n if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) {\n // commonmark requires matching angle brackets\n if (!(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n return;\n }\n\n // ending angle bracket cannot be escaped\n const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n return;\n }\n } else {\n // find closing parenthesis\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex === -2) {\n // more open parens than closed\n return;\n }\n\n if (lastParenIndex > -1) {\n const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n const linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n }\n let href = cap[2];\n let title = '';\n if (this.options.pedantic) {\n // split pedantic href and title\n const link = this.rules.other.pedanticHrefTitle.exec(href);\n\n if (link) {\n href = link[1];\n title = link[3];\n }\n } else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n\n href = href.trim();\n if (this.rules.other.startAngleBracket.test(href)) {\n if (this.options.pedantic && !(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\n } else {\n href = href.slice(1, -1);\n }\n }\n return outputLink(cap, {\n href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href,\n title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title,\n }, cap[0], this.lexer, this.rules);\n }\n }\n\n reflink(src: string, links: Links): Tokens.Link | Tokens.Image | Tokens.Text | undefined {\n let cap;\n if ((cap = this.rules.inline.reflink.exec(src))\n || (cap = this.rules.inline.nolink.exec(src))) {\n const labelStart = cap[0].charAt(0) === '!' ? 2 : 1;\n if (!this.options.pedantic && isLabelEndInsideToken(src, cap[1], labelStart, this.rules)) {\n return;\n }\n\n const linkString = (cap[2] || cap[1]).replace(this.rules.other.multipleSpaceGlobal, ' ');\n const link = links[normalizeLabel(linkString)];\n if (!link) {\n const text = cap[0].charAt(0);\n return {\n type: 'text',\n raw: text,\n text,\n };\n }\n return outputLink(cap, link, cap[0], this.lexer, this.rules);\n }\n }\n\n emStrong(src: string, maskedSrc: string, prevChar = ''): Tokens.Em | Tokens.Strong | undefined {\n let match = this.rules.inline.emStrongLDelim.exec(src);\n if (!match) return;\n if (!match[1] && !match[2] && !match[3] && !match[4]) return;\n\n // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n if (match[4] && prevChar.match(this.rules.other.unicodeAlphaNumeric)) return;\n\n const nextChar = match[1] || match[3] || '';\n\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n\n const delimChar = match[0][0];\n // A mid-run opener (for example the second star of an unmatched `**`) must\n // only pair with a delimiter that can only close, otherwise it steals the\n // opener of a later span (`**a*b*c` must be `**a<em>b</em>c`).\n const midRun = prevChar === delimChar;\n const endReg = delimChar === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src (move to lexer?)\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) !== null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue; // skip single * in __abc*abc__\n\n rLength = [...rDelim].length;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n } else if (match[5] || match[6]) { // either Left or Right Delim\n if (lLength % 3 && !((lLength + rLength) % 3)) {\n midDelimTotal += rLength;\n continue; // CommonMark Emphasis Rules 9-10\n }\n if (midRun) {\n // A mid-run opener cannot close against an ambiguous delimiter that\n // can also open; that delimiter opens its own emphasis span instead.\n break;\n }\n }\n\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters. *a*** -> *a*\n rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n // char length can be >1 for unicode characters;\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n\n // Create `em` if smallest delimiter has odd char count. *a***\n if (Math.min(lLength, rLength) % 2) {\n const text = raw.slice(1, -1);\n return {\n type: 'em',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n\n // Create 'strong' if smallest delimiter has even char count. **a***\n const text = raw.slice(2, -2);\n return {\n type: 'strong',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n }\n }\n\n codespan(src: string): Tokens.Codespan | undefined {\n const cap = this.rules.inline.code.exec(src);\n if (cap) {\n let text = cap[2].replace(this.rules.other.newLineCharGlobal, ' ');\n const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text);\n const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n return {\n type: 'codespan',\n raw: cap[0],\n text,\n };\n }\n }\n\n br(src: string): Tokens.Br | undefined {\n const cap = this.rules.inline.br.exec(src);\n if (cap) {\n return {\n type: 'br',\n raw: cap[0],\n };\n }\n }\n\n del(src: string, maskedSrc: string, prevChar = ''): Tokens.Del | undefined {\n let match = this.rules.inline.delLDelim.exec(src);\n if (!match) return;\n\n const nextChar = match[1] || '';\n\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength;\n\n const endReg = this.rules.inline.delRDelim;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) !== null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue;\n\n rLength = [...rDelim].length;\n\n if (rLength !== lLength) continue;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n }\n\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters\n rLength = Math.min(rLength, rLength + delimTotal);\n // char length can be >1 for unicode characters\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n\n // Create del token - only single ~ or double ~~ supported\n const text = raw.slice(lLength, -lLength);\n return {\n type: 'del',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n }\n }\n\n autolink(src: string): Tokens.Link | undefined {\n const cap = this.rules.inline.autolink.exec(src);\n if (cap) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[1];\n href = 'mailto:' + text;\n } else {\n text = cap[1];\n href = text;\n }\n\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n autolink: true,\n tokens: [\n {\n type: 'text',\n raw: text,\n text,\n },\n ],\n };\n }\n }\n\n url(src: string): Tokens.Link | undefined {\n let cap;\n if (cap = this.rules.inline.url.exec(src)) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[0];\n href = 'mailto:' + text;\n } else {\n // do extended autolink path validation\n let prevCapZero;\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';\n } while (prevCapZero !== cap[0]);\n text = cap[0];\n if (cap[1] === 'www.') {\n href = 'http://' + cap[0];\n } else {\n href = cap[0];\n }\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n autolink: true,\n tokens: [\n {\n type: 'text',\n raw: text,\n text,\n },\n ],\n };\n }\n }\n\n inlineText(src: string): Tokens.Text | undefined {\n const cap = this.rules.inline.text.exec(src);\n if (cap) {\n const escaped = this.lexer.state.inRawBlock;\n return {\n type: 'text',\n raw: cap[0],\n // raw HTML keeps whatever it was written with, everywhere else a numeric\n // character reference stands for the character itself\n text: escaped ? cap[0] : decodeNumericCharacterReferences(cap[0]),\n escaped,\n };\n }\n }\n}\n", "import { _Tokenizer } from './Tokenizer.ts';\nimport { _defaults } from './defaults.ts';\nimport { other, block, inline } from './rules.ts';\nimport { normalizeLabel } from './helpers.ts';\nimport type { Token, TokensList, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Block Lexer\n */\nexport class _Lexer<ParserOutput = string, RendererOutput = string> {\n tokens: TokensList;\n options: MarkedOptions<ParserOutput, RendererOutput>;\n state: {\n inLink: boolean;\n inRawBlock: boolean;\n /** a link was produced in the inline run currently being scanned */\n linkEmitted: boolean;\n /**\n * false while scanning an inline run whose source contains no ')',\n * letting Tokenizer.link bail out before its quadratic backtracking.\n * Anchored once per run by inlineTokens.\n */\n linkParenPossible: boolean;\n top: boolean;\n };\n\n public inlineQueue: { src: string, tokens: Token[] }[];\n\n private tokenizer: _Tokenizer<ParserOutput, RendererOutput>;\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n // TokenList cannot be created in one go\n this.tokens = [] as unknown as TokensList;\n this.tokens.links = Object.create(null);\n this.options = options || _defaults;\n this.options.tokenizer = this.options.tokenizer || new _Tokenizer<ParserOutput, RendererOutput>();\n this.tokenizer = this.options.tokenizer;\n this.tokenizer.options = this.options;\n this.tokenizer.lexer = this;\n this.inlineQueue = [];\n this.state = {\n inLink: false,\n inRawBlock: false,\n linkEmitted: false,\n linkParenPossible: true,\n top: true,\n };\n\n const rules = {\n other,\n block: block.normal,\n inline: inline.normal,\n };\n\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n } else if (this.options.gfm) {\n rules.block = block.gfm;\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n } else {\n rules.inline = inline.gfm;\n }\n }\n this.tokenizer.rules = rules;\n }\n\n /**\n * Expose Rules\n */\n static get rules() {\n return {\n block,\n inline,\n };\n }\n\n /**\n * Static Lex Method\n */\n static lex<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const lexer = new _Lexer<ParserOutput, RendererOutput>(options);\n return lexer.lex(src);\n }\n\n /**\n * Static Lex Inline Method\n */\n static lexInline<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const lexer = new _Lexer<ParserOutput, RendererOutput>(options);\n return lexer.inlineTokens(src);\n }\n\n /**\n * Preprocessing\n */\n lex(src: string) {\n src = src.replace(other.carriageReturn, '\\n');\n\n this.blockTokens(src, this.tokens);\n\n for (let i = 0; i < this.inlineQueue.length; i++) {\n const next = this.inlineQueue[i];\n this.inlineTokens(next.src, next.tokens);\n }\n this.inlineQueue = [];\n\n return this.tokens;\n }\n\n /**\n * Lexing\n */\n blockTokens(src: string, tokens?: Token[], lastParagraphClipped?: boolean): Token[];\n blockTokens(src: string, tokens?: TokensList, lastParagraphClipped?: boolean): TokensList;\n blockTokens(src: string, tokens: Token[] = [], lastParagraphClipped = false) {\n this.tokenizer.lexer = this;\n if (this.options.pedantic) {\n src = src.replace(other.tabCharGlobal, ' ').replace(other.spaceLine, '');\n }\n\n let srcLength = Infinity;\n while (src) {\n if (src.length < srcLength) {\n srcLength = src.length;\n } else {\n this.infiniteLoopError(src.charCodeAt(0));\n break;\n }\n\n let token: Tokens.Generic | undefined;\n\n if (this.options.extensions?.block?.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // newline\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.raw.length === 1 && lastToken !== undefined) {\n // if there's a single \\n as a spacer, it's terminating the last line,\n // so move it there so that we don't get unnecessary paragraph tags\n lastToken.raw += '\\n';\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // code\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n // An indented code block cannot interrupt a paragraph.\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // fences\n if (token = this.tokenizer.fences(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // heading\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // hr\n if (token = this.tokenizer.hr(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // blockquote\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // list\n if (token = this.tokenizer.list(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // html\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // def\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else if (!this.tokens.links[token.tag]) {\n this.tokens.links[token.tag] = {\n href: token.href,\n title: token.title,\n };\n tokens.push(token);\n }\n continue;\n }\n\n // table (gfm)\n if (token = this.tokenizer.table(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // lheading\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (this.options.extensions?.startBlock) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startBlock.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n const lastToken = tokens.at(-1);\n if (lastParagraphClipped && lastToken?.type === 'paragraph') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n lastParagraphClipped = cutSrc.length !== src.length;\n src = src.substring(token.raw.length);\n continue;\n }\n\n // text\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n this.infiniteLoopError(src.charCodeAt(0));\n break;\n }\n }\n\n this.state.top = true;\n return tokens;\n }\n\n inline(src: string, tokens: Token[] = []) {\n this.inlineQueue.push({ src, tokens });\n return tokens;\n }\n\n /**\n * Does this link text hold a link already? An image does not count: an image\n * may hold a link, a link may not.\n */\n private linkInText(text: string): boolean {\n if (!text.includes('[')) {\n return false;\n }\n\n const linkRule = this.tokenizer.rules.inline.link;\n for (const match of text.matchAll(this.tokenizer.rules.inline.blockSkip)) {\n // blockSkip also matches code spans and html, and the `!` of an image is\n // left out of the match, so read the character before it.\n if (linkRule.test(match[0]) && text.charAt(match.index - 1) !== '!') {\n return true;\n }\n }\n\n for (const match of text.matchAll(this.tokenizer.rules.inline.reflinkSearch)) {\n const match0 = match[0];\n const refStart = match0.lastIndexOf('[');\n if (match0.charAt(0) === '!' || !Object.hasOwn(this.tokens.links, normalizeLabel(match0.slice(refStart + 1, -1)))) {\n continue;\n }\n // a candidate holding a link is not a link either, so it does not count\n if (refStart > 1 && this.linkInText(match0.slice(1, refStart - 1))) {\n continue;\n }\n return true;\n }\n\n return false;\n }\n\n /**\n * Lexing/Compiling\n */\n inlineTokens(src: string, tokens: Token[] = []): Token[] {\n this.tokenizer.lexer = this;\n // One paren scan per inline run, shared with Tokenizer.link: without a\n // ')' ahead the link regex cannot match, and skipping it avoids its\n // quadratic backtracking over unterminated-link inputs like\n // `'[a](b'.repeat(n)`. A nested run receives a substring of the outer\n // run, so if the outer had no ')' neither does this substring \u2014 skip\n // the scan in that case.\n const prevLinkParenPossible = this.state.linkParenPossible;\n this.state.linkParenPossible = prevLinkParenPossible && src.includes(')');\n try {\n return this.#inlineTokensInner(src, tokens);\n } finally {\n // A nested run (e.g. a link label) anchored on its own substring;\n // restore the outer run's flag for the rest of its loop.\n this.state.linkParenPossible = prevLinkParenPossible;\n }\n }\n\n #inlineTokensInner(src: string, tokens: Token[]): Token[] {\n // String with links masked to avoid interference with em and strong\n let maskedSrc = src;\n\n // Mask out reflinks\n if (this.tokens.links && src.includes('[')) {\n const reflinkSearch = this.tokenizer.rules.inline.reflinkSearch;\n const maskReflink = (match0: string): string => {\n const refStart = match0.lastIndexOf('[');\n if (!Object.hasOwn(this.tokens.links, normalizeLabel(match0.slice(refStart + 1, -1)))) {\n return match0;\n }\n // CommonMark: \"Links may not contain other links, at any level of\n // nesting.\" A candidate whose text already holds one never becomes a\n // link, so flattening the whole span would hide the emphasis that\n // does still apply inside it. Mask the links it holds instead.\n // Images are exempt: their text is flattened into an alt attribute.\n if (refStart > 1 && match0.charAt(0) !== '!') {\n const text = match0.slice(1, refStart - 1);\n if (this.linkInText(text)) {\n return '[' + text.replace(reflinkSearch, maskReflink)\n + '][' + 'a'.repeat(match0.length - refStart - 2) + ']';\n }\n }\n return '[' + 'a'.repeat(match0.length - 2) + ']';\n };\n maskedSrc = maskedSrc.replace(reflinkSearch, maskReflink);\n }\n\n // Mask out escaped characters.\n // Every mask must keep the length it replaces: emStrong and del line\n // maskedSrc up with src by slicing from the end. `anyPunctuation` matches\n // unicode punctuation, so an escaped astral character is 3 code units.\n // A backslash inside a code span is literal, not an escape. Mask the\n // backticks inside the span instead, so blockSkip still skips all of it.\n maskedSrc = maskedSrc.replace(this.tokenizer.rules.inline.anyPunctuationOutsideCode, (match0, code, punct) => {\n if (punct) {\n return '+'.repeat(match0.length);\n }\n if (code) {\n return code + match0.slice(code.length, -code.length).replace(/`/g, '+') + code;\n }\n return match0;\n });\n\n // Mask out other blocks\n maskedSrc = maskedSrc.replace(this.tokenizer.rules.inline.blockSkip, (match0, _link, context) => {\n const offset = context ? context.length : 0;\n return match0.slice(0, offset) + '[' + 'a'.repeat(match0.length - offset - 2) + ']';\n });\n\n // Mask out blocks from extensions\n maskedSrc = this.options.hooks?.emStrongMask?.call({ lexer: this }, maskedSrc) ?? maskedSrc;\n\n let keepPrevChar = false;\n let prevChar = '';\n let srcLength = Infinity;\n while (src) {\n if (src.length < srcLength) {\n srcLength = src.length;\n } else {\n this.infiniteLoopError(src.charCodeAt(0));\n break;\n }\n\n if (!keepPrevChar) {\n prevChar = '';\n }\n keepPrevChar = false;\n\n let token: Tokens.Generic | undefined;\n\n // extensions\n if (this.options.extensions?.inline?.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // escape\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // tag\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // link\n if (token = this.tokenizer.link(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // reflink, nolink\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.type === 'text' && lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // em & strong\n if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // code\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // br\n if (token = this.tokenizer.br(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // del (gfm)\n if (token = this.tokenizer.del(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // autolink\n if (token = this.tokenizer.autolink(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // url (gfm)\n if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (this.options.extensions?.startInline) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startInline.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (token = this.tokenizer.inlineText(cutSrc)) {\n src = src.substring(token.raw.length);\n if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n prevChar = token.raw.slice(-1);\n }\n keepPrevChar = true;\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n this.infiniteLoopError(src.charCodeAt(0));\n break;\n }\n }\n\n return tokens;\n }\n\n private infiniteLoopError(byte: number) {\n const errMsg = 'Infinite loop on byte: ' + byte;\n if (this.options.silent) {\n console.error(errMsg);\n } else {\n throw new Error(errMsg);\n }\n }\n}\n", "import { _defaults } from './defaults.ts';\nimport {\n cleanUrl,\n escapeHtmlEntities,\n} from './helpers.ts';\nimport { other } from './rules.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Tokens } from './Tokens.ts';\nimport type { _Parser } from './Parser.ts';\n\n/**\n * Renderer\n */\nexport class _Renderer<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n parser!: _Parser<ParserOutput, RendererOutput>; // set by the parser\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n space(token: Tokens.Space): RendererOutput {\n return '' as RendererOutput;\n }\n\n code({ text, lang, escaped }: Tokens.Code): RendererOutput {\n const langString = (lang || '').match(other.notSpaceStart)?.[0];\n\n // An empty code block has no content, so it must not gain a newline.\n const code = text ? text.replace(other.endingNewline, '') + '\\n' : '';\n\n if (!langString) {\n return '<pre><code>'\n + (escaped ? code : escapeHtmlEntities(code, true))\n + '</code></pre>\\n' as RendererOutput;\n }\n\n return '<pre><code class=\"language-'\n + escapeHtmlEntities(langString)\n + '\">'\n + (escaped ? code : escapeHtmlEntities(code, true))\n + '</code></pre>\\n' as RendererOutput;\n }\n\n blockquote({ tokens }: Tokens.Blockquote): RendererOutput {\n const body = this.parser.parse(tokens);\n return `<blockquote>\\n${body}</blockquote>\\n` as RendererOutput;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n def(token: Tokens.Def): RendererOutput {\n return '' as RendererOutput;\n }\n\n heading({ tokens, depth }: Tokens.Heading): RendererOutput {\n return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>\\n` as RendererOutput;\n }\n\n hr(token: Tokens.Hr): RendererOutput {\n return '<hr>\\n' as RendererOutput;\n }\n\n list(token: Tokens.List): RendererOutput {\n const ordered = token.ordered;\n const start = token.start;\n\n let body = '';\n for (let j = 0; j < token.items.length; j++) {\n const item = token.items[j];\n body += this.listitem(item);\n }\n\n const type = ordered ? 'ol' : 'ul';\n const startAttr = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startAttr + '>\\n' + body + '</' + type + '>\\n' as RendererOutput;\n }\n\n listitem(item: Tokens.ListItem): RendererOutput {\n return `<li>${this.parser.parse(item.tokens)}</li>\\n` as RendererOutput;\n }\n\n checkbox({ checked }: Tokens.Checkbox): RendererOutput {\n return '<input '\n + (checked ? 'checked=\"\" ' : '')\n + 'disabled=\"\" type=\"checkbox\"> ' as RendererOutput;\n }\n\n paragraph({ tokens }: Tokens.Paragraph): RendererOutput {\n return `<p>${this.parser.parseInline(tokens)}</p>\\n` as RendererOutput;\n }\n\n table(token: Tokens.Table): RendererOutput {\n let header = '';\n\n // header\n let cell = '';\n for (let j = 0; j < token.header.length; j++) {\n cell += this.tablecell(token.header[j]);\n }\n header += this.tablerow({ text: cell as ParserOutput });\n\n let body = '';\n for (let j = 0; j < token.rows.length; j++) {\n const row = token.rows[j];\n\n cell = '';\n for (let k = 0; k < row.length; k++) {\n cell += this.tablecell(row[k]);\n }\n\n body += this.tablerow({ text: cell as ParserOutput });\n }\n if (body) body = `<tbody>${body}</tbody>`;\n\n return '<table>\\n'\n + '<thead>\\n'\n + header\n + '</thead>\\n'\n + body\n + '</table>\\n' as RendererOutput;\n }\n\n tablerow({ text }: Tokens.TableRow<ParserOutput>): RendererOutput {\n return `<tr>\\n${text}</tr>\\n` as RendererOutput;\n }\n\n tablecell(token: Tokens.TableCell): RendererOutput {\n const content = this.parser.parseInline(token.tokens);\n const type = token.header ? 'th' : 'td';\n const tag = token.align\n ? `<${type} align=\"${token.align}\">`\n : `<${type}>`;\n return tag + content + `</${type}>\\n` as RendererOutput;\n }\n\n /**\n * span level renderer\n */\n strong({ tokens }: Tokens.Strong): RendererOutput {\n return `<strong>${this.parser.parseInline(tokens)}</strong>` as RendererOutput;\n }\n\n em({ tokens }: Tokens.Em): RendererOutput {\n return `<em>${this.parser.parseInline(tokens)}</em>` as RendererOutput;\n }\n\n codespan({ text }: Tokens.Codespan): RendererOutput {\n return `<code>${escapeHtmlEntities(text, true)}</code>` as RendererOutput;\n }\n\n br(token: Tokens.Br): RendererOutput {\n return '<br>' as RendererOutput;\n }\n\n del({ tokens }: Tokens.Del): RendererOutput {\n return `<del>${this.parser.parseInline(tokens)}</del>` as RendererOutput;\n }\n\n link({ href, title, text, tokens, autolink }: Tokens.Link): RendererOutput {\n // References are not resolved inside an autolink, so every `&` there is\n // literal. Elsewhere only an `&` that cannot start one needs escaping.\n const parsedText = autolink\n ? escapeHtmlEntities(text, true)\n : this.parser.parseInline(tokens) as string;\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return parsedText as RendererOutput;\n }\n href = escapeHtmlEntities(cleanHref, autolink);\n let out = '<a href=\"' + href + '\"';\n if (title) {\n out += ' title=\"' + (escapeHtmlEntities(title)) + '\"';\n }\n out += '>' + parsedText + '</a>';\n return out as RendererOutput;\n }\n\n image({ href, title, text, tokens }: Tokens.Image): RendererOutput {\n if (tokens) {\n text = this.parser.parseInline(tokens, this.parser.textRenderer) as string;\n }\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return escapeHtmlEntities(text) as RendererOutput;\n }\n href = cleanHref;\n\n let out = `<img src=\"${escapeHtmlEntities(href)}\" alt=\"${escapeHtmlEntities(text)}\"`;\n if (title) {\n out += ` title=\"${escapeHtmlEntities(title)}\"`;\n }\n out += '>';\n return out as RendererOutput;\n }\n\n text(token: Tokens.Text | Tokens.Escape): RendererOutput {\n return 'tokens' in token && token.tokens\n ? this.parser.parseInline(token.tokens) as unknown as RendererOutput\n : ('escaped' in token && token.escaped ? token.text as RendererOutput : escapeHtmlEntities(token.text) as RendererOutput);\n }\n}\n", "import type { Tokens } from './Tokens.ts';\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nexport class _TextRenderer<RendererOutput = string> {\n // no need for block level renderers\n strong({ text }: Tokens.Strong): RendererOutput {\n return text as RendererOutput;\n }\n\n em({ text }: Tokens.Em): RendererOutput {\n return text as RendererOutput;\n }\n\n codespan({ text }: Tokens.Codespan): RendererOutput {\n return text as RendererOutput;\n }\n\n del({ text }: Tokens.Del): RendererOutput {\n return text as RendererOutput;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n text({ text }: Tokens.Text | Tokens.Escape | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n link({ text }: Tokens.Link): RendererOutput {\n return '' + text as RendererOutput;\n }\n\n image({ text }: Tokens.Image): RendererOutput {\n return '' + text as RendererOutput;\n }\n\n br(): RendererOutput {\n return '' as RendererOutput;\n }\n\n checkbox({ raw }: Tokens.Checkbox): RendererOutput {\n return raw as RendererOutput;\n }\n}\n", "import { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _defaults } from './defaults.ts';\nimport type { MarkedToken, Token, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Parsing & Compiling\n */\nexport class _Parser<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n renderer: _Renderer<ParserOutput, RendererOutput>;\n textRenderer: _TextRenderer<RendererOutput>;\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n this.options.renderer = this.options.renderer || new _Renderer<ParserOutput, RendererOutput>();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.renderer.parser = this;\n this.textRenderer = new _TextRenderer<RendererOutput>();\n }\n\n /**\n * Static Parse Method\n */\n static parse<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const parser = new _Parser<ParserOutput, RendererOutput>(options);\n return parser.parse(tokens);\n }\n\n /**\n * Static Parse Inline Method\n */\n static parseInline<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const parser = new _Parser<ParserOutput, RendererOutput>(options);\n return parser.parseInline(tokens);\n }\n\n /**\n * Parse Loop\n */\n parse(tokens: Token[]): ParserOutput {\n this.renderer.parser = this;\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const genericToken = anyToken as Tokens.Generic;\n const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'checkbox', 'html', 'def', 'paragraph', 'text'].includes(genericToken.type)) {\n out += ret || '';\n continue;\n }\n }\n\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'space': {\n out += this.renderer.space(token);\n break;\n }\n case 'hr': {\n out += this.renderer.hr(token);\n break;\n }\n case 'heading': {\n out += this.renderer.heading(token);\n break;\n }\n case 'code': {\n out += this.renderer.code(token);\n break;\n }\n case 'table': {\n out += this.renderer.table(token);\n break;\n }\n case 'blockquote': {\n out += this.renderer.blockquote(token);\n break;\n }\n case 'list': {\n out += this.renderer.list(token);\n break;\n }\n case 'checkbox': {\n out += this.renderer.checkbox(token);\n break;\n }\n case 'html': {\n out += this.renderer.html(token);\n break;\n }\n case 'def': {\n out += this.renderer.def(token);\n break;\n }\n case 'paragraph': {\n out += this.renderer.paragraph(token);\n break;\n }\n case 'text': {\n out += this.renderer.text(token);\n break;\n }\n\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '' as ParserOutput;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n\n return out as ParserOutput;\n }\n\n /**\n * Parse Inline Tokens\n */\n parseInline(tokens: Token[], renderer: _Renderer<ParserOutput, RendererOutput> | _TextRenderer<RendererOutput> = this.renderer): ParserOutput {\n this.renderer.parser = this;\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);\n if (ret !== false || !['escape', 'html', 'link', 'image', 'checkbox', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(anyToken.type)) {\n out += ret || '';\n continue;\n }\n }\n\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'escape': {\n out += renderer.text(token);\n break;\n }\n case 'html': {\n out += renderer.html(token);\n break;\n }\n case 'link': {\n out += renderer.link(token);\n break;\n }\n case 'image': {\n out += renderer.image(token);\n break;\n }\n case 'checkbox': {\n out += renderer.checkbox(token);\n break;\n }\n case 'strong': {\n out += renderer.strong(token);\n break;\n }\n case 'em': {\n out += renderer.em(token);\n break;\n }\n case 'codespan': {\n out += renderer.codespan(token);\n break;\n }\n case 'br': {\n out += renderer.br(token);\n break;\n }\n case 'del': {\n out += renderer.del(token);\n break;\n }\n case 'text': {\n out += renderer.text(token);\n break;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '' as ParserOutput;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out as ParserOutput;\n }\n}\n", "import { _defaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\n\nexport class _Hooks<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n block?: boolean;\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n static passThroughHooks = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens',\n 'emStrongMask',\n ]);\n\n static passThroughHooksRespectAsync = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens',\n ]);\n\n /**\n * Process markdown before marked\n */\n preprocess(markdown: string) {\n return markdown;\n }\n\n /**\n * Process HTML after marked is finished\n */\n postprocess(html: ParserOutput) {\n return html;\n }\n\n /**\n * Process all tokens before walk tokens\n */\n processAllTokens(tokens: Token[] | TokensList) {\n return tokens;\n }\n\n /**\n * Mask contents that should not be interpreted as em/strong delimiters\n */\n emStrongMask(src: string) {\n return src;\n }\n\n /**\n * Provide function to tokenize markdown\n */\n provideLexer(block = this.block) {\n return block ? _Lexer.lex : _Lexer.lexInline;\n }\n\n /**\n * Provide function to parse tokens\n */\n provideParser(block = this.block) {\n return block ? _Parser.parse<ParserOutput, RendererOutput> : _Parser.parseInline<ParserOutput, RendererOutput>;\n }\n}\n", "import { _getDefaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { escapeHtmlEntities } from './helpers.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, Tokens, TokensList } from './Tokens.ts';\n\nexport type MaybePromise = void | Promise<void>;\n\ntype UnknownFunction = (...args: unknown[]) => unknown;\ntype GenericRendererFunction = (...args: unknown[]) => string | false;\n\n/**\n * Append value(s) to values in place, flattening one level like concat\n */\nfunction pushValues(values: MaybePromise[], value: MaybePromise | MaybePromise[]) {\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n values.push(value[i]);\n }\n } else {\n values.push(value);\n }\n}\n\nexport class Marked<ParserOutput = string, RendererOutput = string> {\n defaults = _getDefaults<ParserOutput, RendererOutput>();\n options = this.setOptions;\n\n /**\n * Compiles markdown to HTML.\n *\n * To configure hooks, a renderer, or a tokenizer, create a separate `Marked`\n * instance and use `Marked#use` instead of passing them on each call.\n */\n parse = this.parseMarkdown(true);\n\n /**\n * Compiles inline markdown to HTML.\n *\n * To configure hooks, a renderer, or a tokenizer, create a separate `Marked`\n * instance and use `Marked#use` instead of passing them on each call.\n */\n parseInline = this.parseMarkdown(false);\n\n Parser = _Parser<ParserOutput, RendererOutput>;\n Renderer = _Renderer<ParserOutput, RendererOutput>;\n TextRenderer = _TextRenderer<RendererOutput>;\n Lexer = _Lexer;\n Tokenizer = _Tokenizer<ParserOutput, RendererOutput>;\n Hooks = _Hooks<ParserOutput, RendererOutput>;\n\n constructor(...args: MarkedExtension<ParserOutput, RendererOutput>[]) {\n this.use(...args);\n }\n\n /**\n * Run callback for every token\n */\n walkTokens(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n const values: MaybePromise[] = [];\n for (const token of tokens) {\n pushValues(values, callback.call(this, token));\n switch (token.type) {\n case 'table': {\n const tableToken = token as Tokens.Table;\n for (const cell of tableToken.header) {\n pushValues(values, this.walkTokens(cell.tokens, callback));\n }\n for (const row of tableToken.rows) {\n for (const cell of row) {\n pushValues(values, this.walkTokens(cell.tokens, callback));\n }\n }\n break;\n }\n case 'list': {\n const listToken = token as Tokens.List;\n pushValues(values, this.walkTokens(listToken.items, callback));\n break;\n }\n default: {\n const genericToken = token as Tokens.Generic;\n if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n const tokens = genericToken[childTokens].flat(Infinity) as Token[] | TokensList;\n pushValues(values, this.walkTokens(tokens, callback));\n });\n } else if (genericToken.tokens) {\n pushValues(values, this.walkTokens(genericToken.tokens, callback));\n }\n }\n }\n }\n return values;\n }\n\n /**\n * Registers extensions with this Marked instance.\n *\n * The `renderer`, `tokenizer`, and `hooks` objects may each contain only the\n * methods that should be overridden. Their methods are merged with built-in\n * behavior and extensions registered by earlier calls.\n *\n * Use this method when supplying only some hook methods.\n */\n use(...args: MarkedExtension<ParserOutput, RendererOutput>[]) {\n const extensions: MarkedOptions<ParserOutput, RendererOutput>['extensions'] = this.defaults.extensions || { renderers: {}, childTokens: {} };\n\n args.forEach((pack) => {\n // copy options to new object\n const opts = { ...pack } as MarkedOptions<ParserOutput, RendererOutput>;\n\n // set async to true if it was set to true before\n opts.async = this.defaults.async || opts.async || false;\n\n // ==-- Parse \"addon\" extensions --== //\n if (pack.extensions) {\n pack.extensions.forEach((ext) => {\n if (!ext.name) {\n throw new Error('extension name required');\n }\n if ('renderer' in ext) { // Renderer extensions\n const prevRenderer = extensions.renderers[ext.name];\n if (prevRenderer) {\n // Replace extension with func to run new extension but fall back if false\n extensions.renderers[ext.name] = function(...args) {\n let ret = ext.renderer.apply(this, args);\n if (ret === false) {\n ret = prevRenderer.apply(this, args);\n }\n return ret;\n };\n } else {\n extensions.renderers[ext.name] = ext.renderer;\n }\n }\n if ('tokenizer' in ext) { // Tokenizer Extensions\n if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n throw new Error(\"extension level must be 'block' or 'inline'\");\n }\n const extLevel = extensions[ext.level];\n if (extLevel) {\n extLevel.unshift(ext.tokenizer);\n } else {\n extensions[ext.level] = [ext.tokenizer];\n }\n if (ext.start) { // Function to check for start of token\n if (ext.level === 'block') {\n if (extensions.startBlock) {\n extensions.startBlock.push(ext.start);\n } else {\n extensions.startBlock = [ext.start];\n }\n } else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\n } else {\n extensions.startInline = [ext.start];\n }\n }\n }\n }\n if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n extensions.childTokens[ext.name] = ext.childTokens;\n }\n });\n opts.extensions = extensions;\n }\n\n // ==-- Parse \"overwrite\" extensions --== //\n if (pack.renderer) {\n const renderer = this.defaults.renderer || new _Renderer<ParserOutput, RendererOutput>(this.defaults);\n for (const prop in pack.renderer) {\n if (!(prop in renderer)) {\n throw new Error(`renderer '${prop}' does not exist`);\n }\n if (['options', 'parser'].includes(prop)) {\n // ignore options property\n continue;\n }\n const rendererProp = prop as Exclude<keyof _Renderer<ParserOutput, RendererOutput>, 'options' | 'parser'>;\n const rendererFunc = pack.renderer[rendererProp] as GenericRendererFunction;\n const prevRenderer = renderer[rendererProp] as GenericRendererFunction;\n // Replace renderer with func to run extension, but fall back if false\n renderer[rendererProp] = (...args: unknown[]) => {\n let ret = rendererFunc.apply(renderer, args);\n if (ret === false) {\n ret = prevRenderer.apply(renderer, args);\n }\n return (ret || '') as RendererOutput;\n };\n }\n opts.renderer = renderer;\n }\n if (pack.tokenizer) {\n const tokenizer = this.defaults.tokenizer || new _Tokenizer<ParserOutput, RendererOutput>(this.defaults);\n for (const prop in pack.tokenizer) {\n if (!(prop in tokenizer)) {\n throw new Error(`tokenizer '${prop}' does not exist`);\n }\n if (['options', 'rules', 'lexer'].includes(prop)) {\n // ignore options, rules, and lexer properties\n continue;\n }\n const tokenizerProp = prop as Exclude<keyof _Tokenizer<ParserOutput, RendererOutput>, 'options' | 'rules' | 'lexer'>;\n const tokenizerFunc = pack.tokenizer[tokenizerProp] as UnknownFunction;\n const prevTokenizer = tokenizer[tokenizerProp] as UnknownFunction;\n // Replace tokenizer with func to run extension, but fall back if false\n // @ts-expect-error cannot type tokenizer function dynamically\n tokenizer[tokenizerProp] = (...args: unknown[]) => {\n let ret = tokenizerFunc.apply(tokenizer, args);\n if (ret === false) {\n ret = prevTokenizer.apply(tokenizer, args);\n }\n return ret;\n };\n }\n opts.tokenizer = tokenizer;\n }\n\n // ==-- Parse Hooks extensions --== //\n if (pack.hooks) {\n const hooks = this.defaults.hooks || new _Hooks<ParserOutput, RendererOutput>();\n for (const prop in pack.hooks) {\n if (!(prop in hooks)) {\n throw new Error(`hook '${prop}' does not exist`);\n }\n if (['options', 'block'].includes(prop)) {\n // ignore options and block properties\n continue;\n }\n const hooksProp = prop as Exclude<keyof _Hooks<ParserOutput, RendererOutput>, 'options' | 'block'>;\n const hooksFunc = pack.hooks[hooksProp] as UnknownFunction;\n const prevHook = hooks[hooksProp] as UnknownFunction;\n if (_Hooks.passThroughHooks.has(prop)) {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (arg: unknown) => {\n if (this.defaults.async && _Hooks.passThroughHooksRespectAsync.has(prop)) {\n return (async() => {\n const ret = await hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n })();\n }\n\n const ret = hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n };\n } else {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (...args: unknown[]) => {\n if (this.defaults.async) {\n return (async() => {\n let ret = await hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = await prevHook.apply(hooks, args);\n }\n return ret;\n })();\n }\n\n let ret = hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = prevHook.apply(hooks, args);\n }\n return ret;\n };\n }\n }\n opts.hooks = hooks;\n }\n\n // ==-- Parse WalkTokens extensions --== //\n if (pack.walkTokens) {\n const walkTokens = this.defaults.walkTokens;\n const packWalktokens = pack.walkTokens;\n opts.walkTokens = function(token) {\n const values: MaybePromise[] = [];\n values.push(packWalktokens.call(this, token));\n if (walkTokens) {\n pushValues(values, walkTokens.call(this, token));\n }\n return values;\n };\n }\n\n this.defaults = { ...this.defaults, ...opts };\n });\n\n return this;\n }\n\n setOptions(opt: MarkedOptions<ParserOutput, RendererOutput>) {\n this.defaults = { ...this.defaults, ...opt };\n return this;\n }\n\n lexer(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n return _Lexer.lex(src, options ?? this.defaults);\n }\n\n parser(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n return _Parser.parse<ParserOutput, RendererOutput>(tokens, options ?? this.defaults);\n }\n\n private parseMarkdown(blockType: boolean) {\n type overloadedParse = {\n (src: string, options: MarkedOptions<ParserOutput, RendererOutput> & { async: true }): Promise<ParserOutput>;\n (src: string, options: MarkedOptions<ParserOutput, RendererOutput> & { async: false }): ParserOutput;\n (src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): ParserOutput | Promise<ParserOutput>;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const parse: overloadedParse = (src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): any => {\n const origOpt = { ...options };\n const opt = { ...this.defaults, ...origOpt };\n\n const throwError = this.onError(!!opt.silent, !!opt.async);\n\n // throw error if an extension set async to true but parse was called with async: false\n if (this.defaults.async === true && origOpt.async === false) {\n return throwError(new Error('marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.'));\n }\n\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n return throwError(new Error('marked(): input parameter is undefined or null'));\n }\n if (typeof src !== 'string') {\n return throwError(new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected'));\n }\n\n if (opt.hooks) {\n opt.hooks.options = opt;\n opt.hooks.block = blockType;\n }\n\n if (opt.async) {\n return (async() => {\n const processedSrc = opt.hooks ? await opt.hooks.preprocess(src) : src;\n const lexer = opt.hooks ? await opt.hooks.provideLexer(blockType) : (blockType ? _Lexer.lex : _Lexer.lexInline);\n const tokens = await lexer(processedSrc, opt);\n const processedTokens = opt.hooks ? await opt.hooks.processAllTokens(tokens) : tokens;\n if (opt.walkTokens) {\n await Promise.all(this.walkTokens(processedTokens, opt.walkTokens));\n }\n const parser = opt.hooks ? await opt.hooks.provideParser(blockType) : (blockType ? _Parser.parse : _Parser.parseInline);\n const html = await parser(processedTokens, opt);\n return opt.hooks ? await opt.hooks.postprocess(html) : html;\n })().catch(throwError);\n }\n\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src) as string;\n }\n const lexer = opt.hooks ? opt.hooks.provideLexer(blockType) : (blockType ? _Lexer.lex : _Lexer.lexInline);\n let tokens = lexer(src, opt);\n if (opt.hooks) {\n tokens = opt.hooks.processAllTokens(tokens);\n }\n if (opt.walkTokens) {\n this.walkTokens(tokens, opt.walkTokens);\n }\n const parser = opt.hooks ? opt.hooks.provideParser(blockType) : (blockType ? _Parser.parse : _Parser.parseInline);\n let html = parser(tokens, opt);\n if (opt.hooks) {\n html = opt.hooks.postprocess(html);\n }\n return html;\n } catch(e) {\n return throwError(e as Error);\n }\n };\n\n return parse;\n }\n\n private onError(silent: boolean, async: boolean) {\n return (e: Error): string | Promise<string> => {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n\n if (silent) {\n const msg = '<p>An error occurred:</p><pre>'\n + escapeHtmlEntities(e.message + '', true)\n + '</pre>';\n if (async) {\n return Promise.resolve(msg);\n }\n return msg;\n }\n\n if (async) {\n return Promise.reject(e);\n }\n throw e;\n };\n }\n}\n", "import { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { Marked } from './Instance.ts';\nimport {\n _getDefaults,\n changeDefaults,\n _defaults,\n} from './defaults.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\nimport type { MaybePromise } from './Instance.ts';\n\nconst markedInstance = new Marked();\n\n/**\n * Compiles markdown to HTML asynchronously.\n *\n * To configure hooks, a renderer, or a tokenizer, create a `Marked` instance\n * and use `Marked#use` instead of passing them as options on each call.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options, having async: true\n * @return Promise of string of compiled HTML\n */\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\n\n/**\n * Compiles markdown to HTML.\n *\n * To configure hooks, a renderer, or a tokenizer, create a `Marked` instance\n * and use `Marked#use` instead of passing them as options on each call.\n *\n * @param src String of markdown source to be compiled\n * @param options Optional hash of options\n * @return String of compiled HTML. Will be a Promise of string if async is set to true by any extensions.\n */\nexport function marked(src: string, options: MarkedOptions & { async: false }): string;\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\nexport function marked(src: string, options?: MarkedOptions | null): string | Promise<string>;\nexport function marked(src: string, opt?: MarkedOptions | null): string | Promise<string> {\n return markedInstance.parse(src, opt);\n}\n\nexport declare namespace marked {\n /**\n * Compiles inline markdown to HTML.\n *\n * To configure hooks, a renderer, or a tokenizer, create a `Marked` instance\n * and use `Marked#use` instead of passing them as options on each call.\n */\n let parseInline: typeof markedInstance.parseInline;\n\n /**\n * Registers extensions with the default Marked instance.\n *\n * The `renderer`, `tokenizer`, and `hooks` objects may each contain only the\n * methods that should be overridden. Their methods are merged with built-in\n * behavior and extensions registered by earlier calls.\n *\n * Use this function when supplying only some hook methods.\n */\n let use: (...args: MarkedExtension[]) => typeof marked;\n}\n\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\n marked.setOptions = function(options: MarkedOptions) {\n markedInstance.setOptions(options);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n };\n\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\n\nmarked.defaults = _defaults;\n\n/**\n * Registers extensions with the default Marked instance.\n *\n * The `renderer`, `tokenizer`, and `hooks` objects may each contain only the\n * methods that should be overridden. Their methods are merged with built-in\n * behavior and extensions registered by earlier calls.\n *\n * Use this function when supplying only some hook methods.\n *\n * @param args Extensions to register\n * @return The `marked` function\n */\nfunction useExtension(...args: MarkedExtension[]) {\n markedInstance.use(...args);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n}\n\nmarked.use = useExtension;\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n return markedInstance.walkTokens(tokens, callback);\n};\n\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * To configure hooks, a renderer, or a tokenizer, create a `Marked` instance\n * and use `Marked#use` instead of passing them as options on each call.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\n\nexport const options = marked.options;\nexport const setOptions = marked.setOptions;\nexport const walkTokens = marked.walkTokens;\n/**\n * Compiles inline markdown to HTML.\n *\n * To configure hooks, a renderer, or a tokenizer, create a `Marked` instance\n * and use `Marked#use` instead of passing them as options on each call.\n */\nexport const parseInline = marked.parseInline;\nexport const parse = marked;\nexport const parser = _Parser.parse;\nexport const lexer = _Lexer.lex;\nexport { _defaults as defaults, _getDefaults as getDefaults } from './defaults.ts';\nexport { _Lexer as Lexer } from './Lexer.ts';\nexport { _Parser as Parser } from './Parser.ts';\nexport { _Tokenizer as Tokenizer } from './Tokenizer.ts';\nexport { _Renderer as Renderer } from './Renderer.ts';\nexport { _TextRenderer as TextRenderer } from './TextRenderer.ts';\nexport { _Hooks as Hooks } from './Hooks.ts';\nexport { Marked } from './Instance.ts';\nexport { useExtension as use };\nexport type * from './MarkedOptions.ts';\nexport type * from './Tokens.ts';\n", "// A deck on a page: its slides drawn into the element given, paged with the bar, the keys a\n// presenter's clicker sends, a click or a swipe; each step shown in turn; moved between with the\n// transition its settings name, through the View Transitions API; presented full screen, with\n// the presenter's view (this slide, the next, the notes, the time) and all slides at once; light\n// or dark; changed as Markdown beside the slides, or in place on a slide, live. Host-agnostic:\n// the host gives the drawers of ```echarts and ```mermaid, how a picture's address resolves, its\n// words, how a slide's Markdown is read (its own marked, with its extensions), and what to do when\n// the deck changes or is saved.\nimport { parseDeck } from './parse.js'\nimport { renderSlide, h } from './render.js'\nimport { tokensOf, schemeOf, VOICES, hex, contrast } from './look.js'\nimport { mergeKits } from './kit.js'\nimport { stringsFor } from './strings.js'\nimport { Lexer } from 'marked'\n\n/** @typedef {import('./parse.js').Deck} Deck */\n/**\n * @typedef {{\n * source: string, lang?: string, dir?: string, kit?: Record<string, any>, scheme?: 'light' | 'dark' | 'auto',\n * blocks?: Record<string, import('./render.js').Drawer>, resolve?: (src: string) => string | null,\n * strings?: Record<string, string>, headings?: 'real' | 'aria', editable?: boolean, lex?: (markdown: string) => any[],\n * onChange?: (source: string) => void, onSave?: (source: string) => void, onExport?: (deck: DeckView) => void,\n * }} Options\n */\n\nconst RTL = /^(ar|he|fa|ur|ps|sd|ug|yi|dv|ckb)\\b/i\nconst ICONS = {\n back: 'M15 5l-7 7 7 7', next: 'M9 5l7 7-7 7', present: 'M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5',\n presenter: 'M3 5h12v9H3zM18 8h3M18 12h3M6 19h6', grid: 'M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z',\n edit: 'M4 20h4L19 9l-4-4L4 16zM13.5 6.5l4 4', scheme: 'M12 3a9 9 0 1 0 9 9 7 7 0 0 1-9-9z', export: 'M12 4v11M7 10l5 5 5-5M5 20h14',\n}\n\n/** @param {string} name */\nfunction icon(name) {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 24 24')\n svg.setAttribute('aria-hidden', 'true')\n if (name === 'back' || name === 'next') svg.setAttribute('class', 'deck-flip')\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('d', ICONS[/** @type {keyof typeof ICONS} */ (name)])\n svg.append(path)\n return svg\n}\n\n/** @typedef {ReturnType<typeof createDeck>} DeckView */\n\n/** @param {HTMLElement} root @param {Options} options */\nexport function createDeck(root, options) {\n let source = options.source.replace(/\\r\\n?/g, '\\n')\n let deck = parseDeck(source)\n let at = 0, stepAt = 0\n /** @type {{ element: HTMLElement, steps: number }[]} */\n let drawn = []\n const lang = String(options.lang ?? deck.settings.lang ?? document.documentElement.lang ?? 'en') || 'en'\n const dir = String(options.dir ?? deck.settings.dir ?? (RTL.test(lang) ? 'rtl' : 'ltr'))\n const words = { ...stringsFor(lang), ...options.strings }\n const number = new Intl.NumberFormat(lang).format\n const dark = matchMedia('(prefers-color-scheme: dark)')\n let scheme = /** @type {'light' | 'dark'} */ ('light')\n const started = Date.now()\n\n root.classList.add('deck')\n root.lang = lang\n root.dir = dir\n const stage = h('div', { class: 'deck-stage', tabindex: 0, role: 'region', 'aria-roledescription': words.carousel, 'aria-label': words.deck })\n const where = h('span', { class: 'deck-where', 'aria-live': 'polite' })\n const button = (/** @type {string} */ name, /** @type {string} */ label, /** @type {() => void} */ act) => {\n const b = h('button', { type: 'button', 'aria-label': label, 'data-act': name }, [icon(name)])\n b.addEventListener('click', act)\n return b\n }\n const back = button('back', words.previous, () => move(-1))\n const next = button('next', words.next, () => move(1))\n const editButton = button('edit', words.edit, () => toggle('is-editing'))\n const presenterButton = button('presenter', words.presenter, () => toggle('is-presenting'))\n const overviewButton = button('grid', words.overview, () => toggle('is-overview'))\n const bar = h('div', { class: 'deck-bar' }, [back, where, next, h('span', { class: 'deck-gap' }),\n overviewButton, presenterButton, options.editable === false ? null : editButton,\n button('scheme', words.scheme, () => { scheme = scheme === 'dark' ? 'light' : 'dark'; paintLook() }),\n options.onExport ? button('export', words.export, () => options.onExport?.(view)) : null,\n document.fullscreenEnabled ? button('present', words.present, () => present()) : null])\n const sourceBox = /** @type {HTMLTextAreaElement} */ (h('textarea', { class: 'deck-source', spellcheck: 'false', 'aria-label': words.source, dir: 'auto' }))\n const nextBox = h('div', { class: 'deck-next' })\n const notes = h('div', { class: 'deck-notes', dir: 'auto', 'aria-label': words.notes })\n const clock = h('span', { class: 'deck-clock' })\n const presenter = h('div', { class: 'deck-presenter' }, [nextBox, notes])\n root.replaceChildren(sourceBox, stage, presenter, bar)\n bar.insertBefore(clock, bar.querySelector('.deck-gap'))\n\n // The kit: deck's own, under the host's (an organisation's, a project's), under the file's own.\n let kitProblems = /** @type {string[]} */ ([])\n const kitOf = () => {\n const merged = mergeKits(options.kit, deck.settings.kit)\n kitProblems = merged.problems\n return merged.kit\n }\n\n function paintLook() {\n context.kit = kitOf()\n const tokens = tokensOf(deck.settings, context.kit.tokens)\n const colours = schemeOf(tokens, scheme)\n const stack = (/** @type {string[]} */ faces) => faces.map((f) => (/^[\\w-]+$/.test(f) ? f : `\"${f.replace(/[\"\\\\]/g, '')}\"`)).join(', ')\n const voice = tokens.fonts ? { heading: stack(tokens.fonts.heading), body: stack(tokens.fonts.body) } : VOICES[tokens.voice]\n for (const [name, value] of Object.entries({\n paper: colours.paper, ink: colours.ink, muted: colours.muted, line: colours.line, primary: colours.primary,\n fill: tokens.primary, 'on-fill': colours.onPrimary, soft: colours.soft, heading: voice.heading, body: voice.body, radius: `${tokens.radius}px`,\n ...Object.fromEntries(colours.series.map((colour, n) => [`series-${n + 1}`, colour])),\n })) root.style.setProperty(`--deck-${name}`, value)\n root.dataset.scheme = scheme\n // Whether the primary as a fill is dark, for a logo's dark one there.\n root.dataset.fill = ((fill) => (contrast(fill, [255, 255, 255]) > contrast(fill, [0, 0, 0]) ? 'dark' : 'light'))(hex(tokens.primary) ?? [247, 197, 49])\n root.dispatchEvent(new CustomEvent('deck-scheme', { detail: { scheme, colours, tokens } }))\n }\n const chooseScheme = () => {\n const asked = options.scheme ?? deck.settings.colorSchema ?? 'auto'\n scheme = asked === 'dark' || (asked === 'auto' && dark.matches) ? 'dark' : 'light'\n }\n\n /** @type {import('./render.js').Context} */\n const context = {\n blocks: options.blocks ?? {}, resolve: options.resolve ?? ((src) => src), headings: options.headings ?? 'real', number: (n) => number(n), total: 0, kit: mergeKits().kit,\n lex: options.lex ?? ((markdown) => new Lexer({ gfm: true }).lex(markdown)), slide: words.slide,\n }\n\n function draw() {\n context.total = deck.slides.length\n drawn = deck.slides.map((slide) => renderSlide(slide, context))\n for (const [i, { element }] of drawn.entries()) {\n element.setAttribute('aria-label', words.where.replace('{n}', number(i + 1)).replace('{count}', number(drawn.length)))\n element.addEventListener('click', () => { if (root.classList.contains('is-overview')) { toggle('is-overview'); go(i, 0) } })\n }\n stage.replaceChildren(...drawn.map(({ element }) => element))\n at = Math.min(at, drawn.length - 1)\n show()\n requestAnimationFrame(() => fitAll())\n }\n\n /** Each slot's type shrunk, down to six tenths, until it holds what it says; a slide still over is marked. */\n function fitAll() {\n for (const { element } of drawn) fit(element)\n }\n /** @param {HTMLElement} slide */\n function fit(slide) {\n let over = false\n for (const slot of /** @type {NodeListOf<HTMLElement>} */ (slide.querySelectorAll('.deck-slot'))) {\n let scale = 1\n slot.style.setProperty('--deck-fit', '1')\n while (slot.scrollHeight > slot.clientHeight + 1 && scale > 0.6) slot.style.setProperty('--deck-fit', String((scale = Math.round((scale - 0.05) * 100) / 100)))\n if (slot.scrollHeight > slot.clientHeight + 1) over = true\n }\n if (over) slide.dataset.overflow = 'true'\n else delete slide.dataset.overflow\n }\n\n function show() {\n for (const [i, { element, steps }] of drawn.entries()) {\n element.classList.toggle('is-shown', i === at)\n element.inert = i !== at && !root.classList.contains('is-overview')\n for (const one of element.querySelectorAll('.deck-step')) one.classList.toggle('is-on', i < at || (i === at && Number(one.getAttribute('data-step')) <= stepAt) || steps === 0)\n }\n where.textContent = `${number(at + 1)} / ${number(drawn.length)}`\n back.toggleAttribute('disabled', at === 0 && stepAt === 0)\n next.toggleAttribute('disabled', at >= drawn.length - 1 && stepAt >= (drawn[at]?.steps ?? 0))\n notes.textContent = deck.slides[at]?.notes || words.noNotes\n const following = deck.slides[at + 1]\n nextBox.replaceChildren(h('span', {}, [following ? words.upNext : words.last]), ...(following ? [renderSlide(following, context).element] : []))\n root.dispatchEvent(new CustomEvent('deck-move', { detail: { at, step: stepAt } }))\n }\n\n /** A click on, or the next key: the next step, else the next slide. @param {number} by */\n function move(by) {\n const steps = drawn[at]?.steps ?? 0\n if (by > 0 && stepAt < steps) { stepAt++; show(); return }\n if (by < 0 && stepAt > 0) { stepAt--; show(); return }\n const to = at + by\n if (to < 0 || to >= drawn.length) return\n go(to, by > 0 ? 0 : drawn[to].steps)\n }\n\n /** @param {number} to @param {number} [toStep] */\n function go(to, toStep = 0) {\n if (to === at) { stepAt = toStep; show(); return }\n const forward = to > at\n const settings = deck.slides[forward ? to : at]?.settings ?? {}\n const named = String(settings.transition ?? deck.settings.transition ?? 'none')\n // Slidev's `a | b`: one going forward, the other going back.\n const [ahead, behind] = named.split('|').map((part) => part.trim())\n let kind = forward ? ahead : behind ?? ahead\n if (dir === 'rtl') kind = kind.replace(/-(left|right)$/, (_, side) => (side === 'left' ? '-right' : '-left'))\n if (kind === 'view-transition') kind = 'morph'\n const update = () => { at = to; stepAt = toStep; if (kind === 'morph') name(drawn[to].element); show() }\n const reduced = matchMedia('(prefers-reduced-motion: reduce)').matches\n if (!document.startViewTransition || kind === 'none' || reduced || root.classList.contains('is-overview')) return update()\n if (kind === 'morph') name(drawn[at].element, drawn[to].element)\n document.documentElement.dataset.deckTransition = kind\n const transition = document.startViewTransition(update)\n // A transition skipped by the next one, as a clicker pressed twice does, is no error.\n transition.ready.catch(() => {})\n transition.finished.finally(() => {\n delete document.documentElement.dataset.deckTransition\n for (const { element } of drawn) for (const one of element.querySelectorAll('[data-morph]')) { /** @type {HTMLElement} */ (one).style.removeProperty('view-transition-name'); one.removeAttribute('data-morph') }\n })\n }\n\n /**\n * Morph, as Keynote's Magic Move and PowerPoint's Morph do it, with nothing to write: what two\n * slides share (a heading's words, a list item's, a picture, a chart) gets one name on each,\n * so the browser moves it from where it was to where it goes. Called with the slide shown and\n * the next, then with the next alone once it shows. @param {HTMLElement} slide @param {HTMLElement} [toward]\n */\n function name(slide, toward) {\n const key = (/** @type {Element} */ el) => `${el.tagName}:${el.tagName === 'IMG' ? el.getAttribute('src') : (el.textContent ?? '').trim().slice(0, 80)}`\n const parts = (/** @type {HTMLElement} */ s) => /** @type {HTMLElement[]} */ ([...s.querySelectorAll('h1, h2, h3, h4, .deck-h, li, p, img, .deck-block, blockquote, .deck-image')])\n if (toward) {\n const there = new Map(parts(toward).map((el) => [key(el), el]))\n let n = 0\n for (const el of parts(slide)) {\n const match = there.get(key(el))\n if (!match || match.dataset.morph || el.closest('[data-morph]')) continue\n const id = `deck-m${n++}`\n el.dataset.morph = match.dataset.morph = id\n el.style.setProperty('view-transition-name', id)\n }\n return\n }\n for (const el of /** @type {NodeListOf<HTMLElement>} */ (slide.querySelectorAll('[data-morph]'))) {\n const id = /** @type {string} */ (el.dataset.morph)\n for (const old of /** @type {NodeListOf<HTMLElement>} */ (stage.querySelectorAll(`[data-morph=\"${id}\"]`))) if (old !== el) old.style.removeProperty('view-transition-name')\n el.style.setProperty('view-transition-name', id)\n }\n }\n\n /** @param {string} mode */\n function toggle(mode) {\n for (const other of ['is-editing', 'is-presenting', 'is-overview']) if (other !== mode) root.classList.remove(other)\n root.classList.toggle(mode)\n editButton.setAttribute('aria-pressed', String(root.classList.contains('is-editing')))\n presenterButton.setAttribute('aria-pressed', String(root.classList.contains('is-presenting')))\n overviewButton.setAttribute('aria-pressed', String(root.classList.contains('is-overview')))\n if (root.classList.contains('is-editing')) { sourceBox.value = source; sourceBox.focus() }\n show()\n requestAnimationFrame(() => fitAll())\n }\n\n function present() {\n stage.requestFullscreen?.().then(() => stage.focus(), () => {})\n }\n\n /** The source changed, by the Markdown or on a slide: read again, drawn again, where the user is. @param {string} text */\n function setSource(text) {\n source = text.replace(/\\r\\n?/g, '\\n')\n deck = parseDeck(source)\n paintLook()\n draw()\n options.onChange?.(source)\n }\n\n // Changed as Markdown: drawn again as the user types, the slide under the caret shown.\n let pending = 0\n sourceBox.addEventListener('input', (event) => {\n if (/** @type {InputEvent} */ (event).isComposing) return\n clearTimeout(pending)\n pending = setTimeout(() => setSource(sourceBox.value), 120)\n })\n const followCaret = () => {\n const caret = sourceBox.selectionStart\n const found = deck.slides.findIndex((slide) => caret >= slide.start && caret <= slide.end + 1)\n if (found >= 0 && found !== at) { at = found; stepAt = drawn[found]?.steps ?? 0; show() }\n }\n sourceBox.addEventListener('keyup', followCaret)\n sourceBox.addEventListener('click', followCaret)\n\n // Changed in place: a double click on words makes them editable; Enter or leaving keeps them.\n stage.addEventListener('dblclick', (event) => {\n if (options.editable === false || document.fullscreenElement) return\n const target = /** @type {HTMLElement | null} */ (/** @type {Element} */ (event.target).closest('[data-edit]'))\n if (!target) return\n const [from, to] = /** @type {string} */ (target.dataset.edit).split('-').map(Number)\n target.contentEditable = 'true'\n target.focus()\n const done = (/** @type {boolean} */ keep) => {\n target.removeEventListener('keydown', key)\n target.removeEventListener('blur', blur)\n target.contentEditable = 'false'\n const words = markdownOf(target)\n if (keep && words !== source.slice(from, to)) setSource(source.slice(0, from) + words + source.slice(to))\n else draw()\n }\n const key = (/** @type {KeyboardEvent} */ e) => {\n if (e.isComposing) return\n if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); done(true) }\n if (e.key === 'Escape') { e.preventDefault(); done(false) }\n }\n const blur = () => done(true)\n target.addEventListener('keydown', key)\n target.addEventListener('blur', blur)\n })\n\n // The keys a clicker sends, and the deck's own.\n root.addEventListener('keydown', (event) => {\n const target = /** @type {HTMLElement} */ (event.target)\n if (target.isContentEditable || target === sourceBox || (target.tagName === 'BUTTON' && (event.key === ' ' || event.key === 'Enter'))) {\n if ((event.metaKey || event.ctrlKey) && event.key === 's') { event.preventDefault(); options.onSave?.(source) }\n return\n }\n const forward = dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight', backward = dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft'\n if (event.altKey || event.ctrlKey || event.metaKey) {\n if ((event.metaKey || event.ctrlKey) && event.key === 's') { event.preventDefault(); options.onSave?.(source) }\n return\n }\n const acts = /** @type {Record<string, () => void>} */ ({\n [forward]: () => move(1), [backward]: () => move(-1), ArrowDown: () => move(1), ArrowUp: () => move(-1), PageDown: () => move(1), PageUp: () => move(-1), ' ': () => move(1),\n Home: () => go(0), End: () => go(drawn.length - 1, drawn.at(-1)?.steps ?? 0), f: present, p: () => toggle('is-presenting'), o: () => toggle('is-overview'), e: () => toggle('is-editing'),\n })\n const act = acts[event.key]\n if (!act) return\n event.preventDefault()\n act()\n })\n stage.addEventListener('click', (event) => {\n if (document.fullscreenElement && !(/** @type {Element} */ (event.target).closest('a, button, input'))) move(1)\n })\n let touch = 0\n stage.addEventListener('touchstart', (event) => { touch = event.touches[0].clientX }, { passive: true })\n stage.addEventListener('touchend', (event) => {\n const dx = event.changedTouches[0].clientX - touch\n if (Math.abs(dx) > 50) move((dx < 0) === (dir !== 'rtl') ? 1 : -1)\n })\n dark.addEventListener('change', () => { chooseScheme(); paintLook() })\n const tick = setInterval(() => {\n const s = Math.floor((Date.now() - started) / 1000)\n clock.textContent = root.classList.contains('is-presenting') ? `${String(Math.floor(s / 60)).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}` : ''\n }, 1000)\n\n chooseScheme()\n paintLook()\n draw()\n document.fonts?.ready.then(() => fitAll())\n\n const view = {\n root, stage, get source() { return source }, get deck() { return deck }, get at() { return at }, get scheme() { return scheme }, get kit() { return context.kit }, get kitProblems() { return kitProblems }, lang, dir,\n slides: () => drawn.map(({ element }) => element), setSource, go, toggle, present, fitAll,\n setScheme: (/** @type {'light' | 'dark'} */ value) => { scheme = value; paintLook() },\n destroy: () => clearInterval(tick),\n }\n return view\n}\n\n/** The Markdown of words changed in place: bold, italics, code and links kept as Markdown writes them. @param {Node} node @returns {string} */\nexport function markdownOf(node) {\n let out = ''\n for (const child of node.childNodes) {\n if (child.nodeType === Node.TEXT_NODE) out += (child.textContent ?? '').replace(/([*_`[\\]\\\\])/g, '\\\\$1')\n else if (child instanceof HTMLElement) {\n const inner = markdownOf(child)\n out += ({ STRONG: `**${inner}**`, B: `**${inner}**`, EM: `*${inner}*`, I: `*${inner}*`, CODE: `\\`${child.textContent}\\``, DEL: `~~${inner}~~`, BR: ' \\n',\n A: `[${inner}](${child.getAttribute('href') ?? ''})` })[child.tagName] ?? inner\n }\n }\n return out.replace(/ /g, ' ').replace(/\\n+$/, '')\n}\n", "// The drawers a deck opened on its own uses for ```echarts and ```mermaid, each library loaded\n// from `base` (a CDN by default) the first time a slide needs it, never before. A chart is data,\n// read with JSON.parse; it takes the deck's colours and type, light or dark, and is drawn as SVG.\n// A diagram is drawn by Pele from Mermaid's language as SVG, then shown as a picture, so nothing it\n// makes runs or joins the page; its words are its picture's text for whoever can't see it. A host gives\n// its own drawers instead.\n\n/** @typedef {{ base: string, root: HTMLElement, versions?: { echarts?: string, pele?: string } }} Where */\n\n/** @type {Map<string, Promise<any>>} */\nconst loading = new Map()\n\n/** A classic script, loaded once: from a file:// page, modules from elsewhere are not always let in. @param {string} src @param {string} global */\nfunction script(src, global) {\n if (!loading.has(src)) loading.set(src, new Promise((resolve, reject) => {\n const tag = document.createElement('script')\n tag.src = src\n tag.onload = () => resolve(/** @type {any} */ (globalThis)[global])\n tag.onerror = reject\n document.head.append(tag)\n }))\n return /** @type {Promise<any>} */ (loading.get(src))\n}\n\n/**\n * A library's file: from a CDN's npm mirror, at its version (`https://…/npm/name@1.2.3/file`), or from a\n * node_modules folder, which holds one version (`…/node_modules/name/file`).\n * @param {string} base @param {string} name @param {string} version @param {string} file\n */\nexport const libraryAt = (base, name, version, file) => (/node_modules\\/$/.test(base) ? `${base}${name}/${file}` : `${base}${name}@${version}/${file}`)\n\n/** @param {Where} where */\nexport function defaultBlocks({ base, root, versions = {} }) {\n const { echarts: chartsAt = '6.1.0', pele: diagramsAt = '1.10.0' } = versions\n /** @type {Set<{ chart: any, option: any, box: HTMLElement }>} */\n const charts = new Set()\n /** @type {any} */\n let colours = null\n root.addEventListener('deck-scheme', (event) => {\n colours = /** @type {CustomEvent} */ (event).detail.colours\n for (const one of charts) one.chart.setOption(themed(one.option, one.box), true)\n })\n // Its type sized with the slide's, its category axis read from the right in a language written so.\n const themed = (/** @type {any} */ option, /** @type {HTMLElement} */ box) => {\n const size = parseFloat(getComputedStyle(box).fontSize) || 16\n const rtl = getComputedStyle(box).direction === 'rtl'\n const small = Math.round(size * 0.6)\n const axis = (/** @type {any} */ given, /** @type {boolean} */ across) => given === undefined ? undefined : [given].flat().map((one) => ({\n axisLabel: { color: colours?.muted, fontSize: small }, axisLine: { lineStyle: { color: colours?.line } }, splitLine: { lineStyle: { color: colours?.line } },\n nameTextStyle: { color: colours?.muted, fontSize: small }, ...(rtl && across && one.type === 'category' ? { inverse: true } : {}), ...(rtl && !across ? { position: 'right' } : {}), ...one,\n }))\n return {\n color: colours?.series, backgroundColor: 'transparent', animation: !matchMedia('(prefers-reduced-motion: reduce)').matches,\n textStyle: { fontFamily: getComputedStyle(root).getPropertyValue('--deck-body') || 'system-ui', color: colours?.ink, fontSize: small },\n ...option,\n title: option.title ? { ...option.title, textStyle: { color: colours?.ink, fontSize: Math.round(size * 0.8), ...option.title?.textStyle } } : undefined,\n legend: option.legend ? { itemWidth: small * 1.6, itemHeight: small, ...option.legend, textStyle: { color: colours?.ink, fontSize: small, ...option.legend?.textStyle } } : undefined,\n grid: { containLabel: true, left: small, right: small, top: option.title ? size * 1.8 : small, bottom: option.legend ? size * 1.6 : small, ...option.grid },\n xAxis: axis(option.xAxis, true), yAxis: axis(option.yAxis, false), toolbox: undefined,\n series: [option.series ?? []].flat().map((one) => (one.type === 'pie' ? { label: { color: colours?.ink, fontSize: small }, ...one } : one)),\n }\n }\n return {\n /** @param {HTMLElement} box @param {string} source */\n async echarts(box, source) {\n const option = JSON.parse(source)\n const echarts = await script(libraryAt(base, 'echarts', chartsAt, 'dist/echarts.min.js'), 'echarts')\n const place = document.createElement('div')\n place.className = 'deck-chart'\n place.setAttribute('role', 'img')\n place.setAttribute('aria-label', String(option.title?.text ?? ''))\n box.append(place)\n const chart = echarts.init(place, null, { renderer: 'svg', locale: document.documentElement.lang?.startsWith('ja') ? 'JA' : 'EN' })\n const one = { chart, option, box }\n charts.add(one)\n chart.setOption(themed(option, box))\n new ResizeObserver(() => { chart.resize(); chart.setOption(themed(option, box), true) }).observe(place)\n Object.assign(box, { chart })\n },\n /**\n * A diagram written in Mermaid's language, drawn by Pele (Obsidian's, MIT): every kind Mermaid\n * 12.1 has, no DOM needed, an SVG with no script or HTML in it. Shown as a picture, its colours\n * the deck's, set as Pele's variables inside it. @param {HTMLElement} box @param {string} source\n */\n async mermaid(box, source) {\n const pele = await script(libraryAt(base, 'pele', diagramsAt, 'dist/pele.global.js'), 'pele')\n const font = getComputedStyle(root).getPropertyValue('--deck-body') || 'system-ui, sans-serif'\n const { svg } = pele.render(source, { fontFamily: font, links: false, images: false, autoDirection: true, maxWidth: Math.max(320, box.clientWidth * 1.4) })\n const look = `--pele-bg:transparent;--pele-fg:${colours?.ink};--pele-muted:${colours?.muted};--pele-line:${colours?.muted};--pele-surface:${colours?.soft};--pele-surface-alt:${colours?.line};--pele-border:${colours?.primary};--pele-accent:${colours?.primary};--pele-font:${font.replace(/[<>\"]/g, '')}`\n const picture = document.createElement('img')\n picture.alt = source\n picture.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg.replace(/^(<svg\\b[^>]*>)/, `$1<style>svg{${look}}</style>`))}`\n const place = document.createElement('div')\n place.className = 'deck-diagram'\n place.append(picture)\n box.append(place)\n },\n }\n}\n", "// deck's version, which a linked file names in its renderer's address. Kept equal to package.json's by a test.\nexport const VERSION = '0.2.0'\n", "// A deck file, `.deck.html`: a web page any browser opens, whose Markdown sits whole in one\n// element, <script type=\"text/markdown\" id=\"deck\">, which no browser runs. Read and written here\n// as text, never parsed as HTML, so a host can read a deck without running anything in it.\n// The one escape: `<script` and `</script`, in any case, gain a backslash after their `<` (and\n// one more for each already there), which reading takes away again: the HTML parser ends the\n// element at `</script`, and a `<script` after `<!--` would keep it from ending. Pure.\n\nimport { VERSION } from './version.js'\n\nexport const OPEN = '<script type=\"text/markdown\" id=\"deck\">'\nconst CLOSE = '</script>'\n\n/** @param {string} markdown */\nexport const escape = (markdown) => markdown.replace(/<(\\\\*)(\\/?script)/gi, '<\\\\$1$2')\n/** @param {string} text */\nexport const unescape = (text) => text.replace(/<\\\\(\\\\*)(\\/?script)/gi, '<$1$2')\n\n/** @param {string} text */\nconst attribute = (text) => text.replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;')\n/** @param {string} text */\nconst content = (text) => text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n\n/**\n * Code held whole in the file: `</script`, `<script` and `<!--`, which only a string or a regular\n * expression of a bundle holds, written with `\\x3C` for their `<`, which reads the same there.\n * @param {string} code\n */\nexport function inlineCode(code) {\n if (/\\\\<(!--|\\/?script)/i.test(code)) throw new Error('This code cannot be held in a page as it is.')\n return code.replace(/<(!--|\\/?script)/gi, '\\\\x3C$1')\n}\n\n/**\n * A deck's Markdown, from a file's text, or null when it holds none.\n * @param {string} html @returns {string | null}\n */\nexport function readDeckFile(html) {\n const at = html.indexOf(OPEN)\n if (at < 0) return null\n const from = at + OPEN.length\n const end = html.slice(from).search(/<\\/script/i)\n if (end < 0) return null\n return unescape(html.slice(from, from + end).replace(/^\\n/, '').replace(/\\n$/, ''))\n}\n\n/** Where a linked file finds its renderer: this version of the package, on jsDelivr's npm mirror. @param {string} [version] */\nexport const rendererUrl = (version = VERSION) => `https://cdn.jsdelivr.net/npm/@codename/deck@${version}/dist/deck.js`\n\n/**\n * A deck file around its Markdown: its title, language and direction in the page's head for\n * whatever reads it before the renderer does, then the Markdown, in the body (the head is never shown), readable as it is when no\n * renderer comes, then the renderer: linked by default, to this version's address, or held whole;\n * `base` tells it where to load the libraries a slide needs (a CDN's npm mirror, or a node_modules).\n * @param {string} markdown\n * @param {{ title?: string, lang?: string, dir?: string, renderer?: { src: string } | { code: string }, base?: string, generator?: string }} [options]\n */\nexport function writeDeckFile(markdown, { title = '', lang = 'en', dir = 'auto', renderer = { src: rendererUrl() }, base, generator = `deck ${VERSION}` } = {}) {\n const data = base ? ` data-base=\"${attribute(base)}\"` : ''\n const script = 'src' in renderer ? `<script src=\"${attribute(renderer.src)}\"${data}></script>` : `<script${data}>${inlineCode(renderer.code)}</script>`\n return /* html */ `<!doctype html>\n<html lang=\"${attribute(lang)}\" dir=\"${attribute(dir)}\">\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"generator\" content=\"${attribute(generator)}\">\n<title>${content(title)}</title>\n<style>#deck{display:block;white-space:pre-wrap;overflow-wrap:anywhere;font:1rem/1.6 ui-monospace,Menlo,Consolas,monospace;max-width:72ch;margin:2rem auto;padding:0 1rem}</style>\n<body>\n${OPEN}\n${escape(markdown)}\n${CLOSE}\n${script}\n</html>\n`\n}\n", "// A deck as a PowerPoint file to change in PowerPoint, Keynote or Google Slides: each layout a\n// slide layout of its own (a master, in PptxGenJS's words) with a placeholder for its title and\n// each of its slots, so a slide added there looks like the deck's; words as PowerPoint's own text,\n// a list's levels as its levels; a table as a table; a chart of bars, lines, areas, pies, rings,\n// points or a radar as PowerPoint's own chart, its numbers in the file to change; anything else (a\n// diagram, another chart, a picture) as a picture; the speaker's notes as notes; each slide's\n// transition as PowerPoint's (Morph where it has one, a fade where it hasn't); the look's colours\n// as the file's theme. Read from the deck as drawn, each box where the browser put it, so the file\n// looks like the slides, in the scheme shown. PptxGenJS (with its JSZip) is the host's to load.\n\nimport { labelOf } from './kit.js'\n\nconst W = 13.333, H = 7.5\n// Words: a paragraph that is a picture alone on its line is the picture.\nconst TEXT = 'h1, h2, h3, h4, h5, h6, .deck-h, p:not(.deck-picture), ul, ol, blockquote'\n\n/** @param {string} value rgb(…) or #… @returns {string} six hex digits */\nfunction hexOf(value) {\n const m = /rgba?\\(\\s*([\\d.]+)[,\\s]+([\\d.]+)[,\\s]+([\\d.]+)/.exec(value)\n if (m) return [m[1], m[2], m[3]].map((n) => Math.round(Number(n)).toString(16).padStart(2, '0')).join('').toUpperCase()\n return value.replace('#', '').toUpperCase().slice(0, 6) || '000000'\n}\n/** @param {string} value */\nconst opaque = (value) => !/rgba\\([^)]*,\\s*0\\)|transparent/.test(value)\n\n/**\n * @param {import('./deck.js').DeckView} view\n * @param {{ PptxGenJS: any, JSZip: any }} libraries\n * @returns {Promise<{ blob: Blob, report: { slides: number, charts: number, pictures: number, tables: number, placeholders: number } }>}\n */\nexport async function toPptx(view, { PptxGenJS, JSZip }) {\n const pres = new PptxGenJS()\n pres.layout = 'LAYOUT_WIDE'\n pres.title = view.deck.slides[0]?.title ?? ''\n pres.rtlMode = view.dir === 'rtl'\n const rootStyle = getComputedStyle(view.root)\n const firstFont = (/** @type {string} */ stack) => stack.split(',').map((f) => f.trim().replace(/^[\"']|[\"']$/g, '')).find((f) => !/^(ui-|system-ui|-apple|sans-serif|serif|monospace)/.test(f)) ?? 'Arial'\n pres.theme = { headFontFace: firstFont(rootStyle.getPropertyValue('--deck-heading')), bodyFontFace: firstFont(rootStyle.getPropertyValue('--deck-body')) }\n const report = { slides: 0, charts: 0, pictures: 0, tables: 0, placeholders: 0 }\n const rtl = view.dir === 'rtl'\n const slides = view.slides()\n const masters = new Map()\n const transitions = []\n\n for (const [i, element] of slides.entries()) {\n const box = element.getBoundingClientRect()\n const sx = W / box.width\n const place = (/** @type {Element} */ el) => {\n const r = el.getBoundingClientRect()\n return { x: (r.left - box.left) * sx, y: (r.top - box.top) * sx, w: r.width * sx, h: r.height * sx }\n }\n // Words as wide as their slot, never as their line: PowerPoint sets type a little wider than a browser.\n const across = (/** @type {Element} */ el) => {\n const slot = el.closest('.deck-slot') ?? el\n const { x, w } = place(slot), { y, h } = place(el)\n const pad = getComputedStyle(slot)\n const start = parseFloat(pad.paddingInlineStart) * sx, end = parseFloat(pad.paddingInlineEnd) * sx\n return { x: x + (rtl ? end : start), y, w: w - start - end, h: h * 1.08 }\n }\n // Where a layout centres its words, PowerPoint's box centres them too.\n const anchor = (/** @type {Element} */ slot) => (getComputedStyle(slot).justifyContent === 'center' ? 'middle' : 'top')\n const pt = (/** @type {number} */ px) => Math.round(px * sx * 72 * 10) / 10\n const style = getComputedStyle(element)\n const layout = element.dataset.layout ?? 'default'\n const slots = /** @type {HTMLElement[]} */ ([...element.querySelectorAll('.deck-slot')])\n const firstBlock = slots[0]?.firstElementChild\n const title = firstBlock && firstBlock.matches('h1, h2, h3, .deck-h') ? firstBlock : null\n\n // One master a layout, its placeholders where the first slide of it has its title and slots.\n // Named as the kit names the layout, in the deck's language, so PowerPoint's Layout menu reads it.\n const definition = view.kit.layouts[layout]\n const masterName = `${definition ? labelOf(definition, layout, view.lang) : layout}${element.classList.contains('deck-class-invert') ? ' (dark)' : ''}`\n if (!masters.has(masterName)) {\n const objects = []\n if (title) objects.push({ placeholder: { options: { name: 'title', type: 'title', ...across(title), valign: 'bottom', margin: 0, fontFace: pres.theme.headFontFace, color: hexOf(getComputedStyle(title).color), align: rtl ? 'right' : 'left' }, text: '' } })\n for (const slot of slots) {\n const r = place(slot)\n const top = title && slot === slots[0] ? place(title).y + place(title).h : r.y\n const inner = slot.firstElementChild && slot.firstElementChild !== title ? across(slot.firstElementChild) : { x: r.x, w: r.w }\n objects.push({ placeholder: { options: { name: `body-${slot.dataset.slot}`, type: 'body', x: inner.x, y: top + 0.08, w: inner.w, h: Math.max(0.3, r.y + r.h - top - 0.08), margin: 0, valign: anchor(slot), color: hexOf(getComputedStyle(slot).color) }, text: '' } })\n }\n // The kit's logo as the slide shows it, the one that reads on its paper, on the master: a slide added in PowerPoint has it too.\n const logo = /** @type {HTMLImageElement | undefined} */ ([...element.querySelectorAll('.deck-logo')].find((one) => getComputedStyle(one).display !== 'none'))\n const mark = logo && await pictureOf(logo.src, logo.clientWidth * 3, logo.clientHeight * 3)\n if (logo && mark) { objects.push({ image: { data: mark, ...place(logo) } }); report.pictures++ }\n pres.defineSlideMaster({\n title: masterName, background: { color: hexOf(style.backgroundColor) }, objects,\n slideNumber: definition?.numbered !== false ? { x: rtl ? 0.3 : W - 0.9, y: H - 0.55, w: 0.6, h: 0.3, fontSize: 10, color: hexOf(rootStyle.getPropertyValue('--deck-muted').trim() || '#666666') } : undefined,\n })\n masters.set(masterName, new Set(objects.flatMap((o) => (o.placeholder ? [o.placeholder.options.name] : []))))\n }\n const names = masters.get(masterName)\n const slide = pres.addSlide({ masterName })\n report.slides++\n\n const background = element.querySelector('.deck-image')\n if (background) {\n const url = /url\\(\"?(.*?)\"?\\)/.exec(getComputedStyle(background).backgroundImage)?.[1]\n const data = url && await pictureOf(url, background.clientWidth * 2, background.clientHeight * 2, true)\n if (data) { slide.addImage({ data, ...place(background) }); report.pictures++ }\n }\n if (title && names.has('title')) {\n slide.addText(runs(title, { pt, rtl, lang: view.lang }), { placeholder: 'title' })\n report.placeholders++\n }\n for (const slot of slots) {\n const blocks = [...slot.children].filter((child) => child !== title)\n const textOnly = blocks.length > 0 && blocks.every((child) => child.matches(TEXT))\n if (textOnly && names.has(`body-${slot.dataset.slot}`)) {\n slide.addText(blocks.flatMap((block) => runs(block, { pt, rtl, lang: view.lang })), { placeholder: `body-${slot.dataset.slot}`, valign: anchor(slot), ...(spaced(slot)) })\n report.placeholders++\n continue\n }\n for (const block of blocks) {\n const at = place(block)\n if (block.matches(TEXT)) slide.addText(runs(block, { pt, rtl, lang: view.lang }), { ...across(block), valign: 'top', margin: 0, ...(spaced(slot)) })\n else if (block.matches('pre')) {\n slide.addText(block.textContent?.replace(/\\n$/, '') ?? '', { ...at, fontFace: 'Consolas', fontSize: pt(parseFloat(getComputedStyle(block).fontSize)), color: hexOf(getComputedStyle(block).color), fill: { color: hexOf(getComputedStyle(block).backgroundColor) }, valign: 'top', margin: 6, rtlMode: false, align: 'left' })\n } else if (block.matches('.deck-table')) {\n table(slide, block, at, { pt, rtl, lang: view.lang })\n report.tables++\n } else if (block.matches('.deck-echarts') && /** @type {any} */ (block).chart) {\n const chart = /** @type {any} */ (block).chart\n if (nativeChart(pres, slide, chart, at, { pt, rtl, lang: view.lang, ink: hexOf(style.color) })) report.charts++\n else { slide.addImage({ data: await pictureOf(`data:image/svg+xml;charset=utf-8,${encodeURIComponent(chart.renderToSVGString())}`, at.w / sx * 2, at.h / sx * 2), ...at }); report.pictures++ }\n } else {\n const img = block.querySelector('img')\n if (img) {\n // A slide's pictures are read as they come near the screen: one not read yet is read now, so that it has its size.\n if (!img.complete) { img.loading = 'eager'; await img.decode().catch(() => {}) }\n const data = await pictureOf(img.src, img.clientWidth * 2, img.clientHeight * 2)\n if (data) { slide.addImage({ data, ...place(img), altText: img.alt }); report.pictures++ }\n }\n }\n }\n }\n const notes = view.deck.slides[i]?.notes\n if (notes) slide.addNotes(notes)\n const settings = view.deck.slides[i]?.settings ?? {}\n transitions.push(String(settings.transition ?? view.deck.settings.transition ?? 'none').split('|')[0].trim())\n }\n\n // What PptxGenJS doesn't write: each slide's transition, and the look's colours as the theme.\n const zip = await JSZip.loadAsync(await pres.write({ outputType: 'arraybuffer', compression: true }))\n for (const [i, kind] of transitions.entries()) {\n const path = `ppt/slides/slide${i + 1}.xml`\n const xml = await zip.file(path)?.async('string')\n if (!xml || kind === 'none') continue\n zip.file(path, xml.replace(/<\\/p:clrMapOvr>|(?=<p:timing|<\\/p:sld>)/, (/** @type {string} */ found) => `${found}${transitionXml(kind, rtl)}`))\n }\n const theme = await zip.file('ppt/theme/theme1.xml')?.async('string')\n if (theme) {\n const colour = (/** @type {string} */ name) => hexOf(rootStyle.getPropertyValue(`--deck-${name}`).trim())\n const series = [colour('fill'), ...[2, 3, 4, 5, 6].map((n) => colour(`series-${n}`))]\n const scheme = /* xml */ `<a:clrScheme name=\"Deck\"><a:dk1><a:srgbClr val=\"${colour('ink')}\"/></a:dk1><a:lt1><a:srgbClr val=\"${colour('paper')}\"/></a:lt1><a:dk2><a:srgbClr val=\"${colour('ink')}\"/></a:dk2><a:lt2><a:srgbClr val=\"${colour('soft')}\"/></a:lt2>${series.map((c, n) => `<a:accent${n + 1}><a:srgbClr val=\"${c}\"/></a:accent${n + 1}>`).join('')}<a:hlink><a:srgbClr val=\"${colour('primary')}\"/></a:hlink><a:folHlink><a:srgbClr val=\"${colour('primary')}\"/></a:folHlink></a:clrScheme>`\n zip.file('ppt/theme/theme1.xml', theme.replace(/<a:clrScheme[\\s\\S]*?<\\/a:clrScheme>/, scheme))\n }\n const blob = await zip.generateAsync({ type: 'blob', compression: 'DEFLATE', mimeType: 'application/vnd.openxmlformats-officedocument.presentationml.presentation' })\n return { blob, report }\n}\n\n/** A slot's paragraphs' spacing, from the space under its first block. @param {HTMLElement} slot */\nfunction spaced(slot) {\n const first = slot.firstElementChild\n const after = first ? parseFloat(getComputedStyle(first).marginBlockEnd) : 0\n return { paraSpaceAfter: Math.round(after * 0.5) }\n}\n\n/**\n * A block's words as PowerPoint's runs: each paragraph or list item ends its line; bold, italics,\n * code and links kept; a list's level as its indent level.\n * @param {Element} block @param {{ pt: (px: number) => number, rtl: boolean, lang: string }} how @returns {any[]}\n */\nfunction runs(block, how) {\n /** @type {any[]} */\n const out = []\n const paragraph = (/** @type {Element} */ el, /** @type {Record<string, any>} */ extra) => {\n const style = getComputedStyle(el)\n const base = { fontSize: how.pt(parseFloat(style.fontSize)), color: hexOf(style.color), bold: Number(style.fontWeight) >= 600, lang: how.lang, rtlMode: how.rtl, align: style.textAlign === 'center' ? 'center' : how.rtl ? 'right' : 'left', ...extra }\n const pieces = inlineRuns(el, base)\n if (!pieces.length) return\n pieces[pieces.length - 1].options.breakLine = true\n out.push(...pieces)\n }\n const list = (/** @type {Element} */ el, /** @type {number} */ level) => {\n let n = 0\n for (const li of el.children) {\n n++\n const nested = [...li.children].filter((c) => c.matches('ul, ol'))\n const clone = /** @type {Element} */ (li.cloneNode(true))\n for (const c of [...clone.children]) if (c.matches('ul, ol, input')) c.remove()\n li.after(clone)\n paragraph(clone, { bullet: el.tagName === 'OL' ? { type: 'number', startAt: n === 1 ? Number(el.getAttribute('start') ?? 1) : undefined } : true, indentLevel: level })\n clone.remove()\n for (const sub of nested) list(sub, level + 1)\n }\n }\n if (block.matches('ul, ol')) list(block, 0)\n else if (block.matches('blockquote')) for (const p of block.children) paragraph(p, { italic: getComputedStyle(p).fontStyle === 'italic' })\n else paragraph(block, {})\n return out\n}\n\n/** @param {Node} node @param {Record<string, any>} base @returns {any[]} */\nfunction inlineRuns(node, base) {\n /** @type {any[]} */\n const out = []\n const walk = (/** @type {Node} */ n, /** @type {Record<string, any>} */ options) => {\n if (n.nodeType === Node.TEXT_NODE) {\n const text = (n.textContent ?? '').replace(/\\s+/g, ' ')\n if (text) out.push({ text, options: { ...options } })\n return\n }\n if (!(n instanceof HTMLElement)) return\n if (n.tagName === 'BR') { if (out.length) out[out.length - 1].options.breakLine = true; return }\n const own = { ...options }\n if (n.matches('strong, b')) { own.bold = true; own.color = hexOf(getComputedStyle(n).color) }\n if (n.matches('em, i')) own.italic = true\n if (n.matches('del, s')) own.strike = 'sngStrike'\n if (n.matches('code')) own.fontFace = 'Consolas'\n if (n.matches('a[href]')) own.hyperlink = { url: n.getAttribute('href') }\n for (const child of n.childNodes) walk(child, own)\n }\n for (const child of node.childNodes) walk(child, base)\n if (out.length) { out[0].text = out[0].text.trimStart(); out[out.length - 1].text = out[out.length - 1].text.trimEnd() }\n return out.filter((run) => run.text)\n}\n\n/** @param {any} slide @param {Element} block @param {{ x: number, y: number, w: number, h: number }} at @param {{ pt: (px: number) => number, rtl: boolean, lang: string }} how */\nfunction table(slide, block, at, how) {\n const rows = [...block.querySelectorAll('tr')].map((tr) => [...tr.children].map((cell) => {\n const style = getComputedStyle(cell)\n const align = cell.getAttribute('data-align')\n return { text: cell.textContent?.trim() ?? '', options: {\n bold: cell.tagName === 'TH', fontSize: how.pt(parseFloat(style.fontSize)), color: hexOf(style.color), lang: how.lang, rtlMode: how.rtl,\n align: align === 'center' ? 'center' : (align === 'right') !== how.rtl ? 'right' : 'left',\n border: [{ type: 'none' }, { type: 'none' }, { type: 'solid', pt: cell.tagName === 'TH' ? 1.5 : 0.75, color: hexOf(style.borderBlockEndColor) }, { type: 'none' }],\n } }\n }))\n const widths = [...(block.querySelector('tr')?.children ?? [])].map((cell) => cell.getBoundingClientRect().width)\n const total = widths.reduce((a, b) => a + b, 0) || 1\n slide.addTable(how.rtl ? rows.map((r) => r.reverse()) : rows, { ...at, colW: (how.rtl ? widths.reverse() : widths).map((w) => (w / total) * at.w), margin: 0.06 })\n}\n\n/**\n * An ECharts chart as PowerPoint's own, when it is one PowerPoint draws: bars, lines, areas, a pie\n * or a ring, points, a radar; false when it isn't. @returns {boolean}\n */\nfunction nativeChart(/** @type {any} */ pres, /** @type {any} */ slide, /** @type {any} */ chart, /** @type {{ x: number, y: number, w: number, h: number }} */ at, /** @type {{ pt: (px: number) => number, rtl: boolean, lang: string, ink: string }} */ how) {\n const option = chart.getOption()\n const series = /** @type {any[]} */ (option.series ?? [])\n if (!series.length) return false\n const types = new Set(series.map((s) => s.type))\n const colours = /** @type {string[]} */ (option.color ?? []).map(hexOf)\n const value = (/** @type {any} */ v) => (Array.isArray(v) ? Number(v.at(-1)) : typeof v === 'object' && v !== null ? Number(v.value) : Number(v))\n const common = { ...at, showLegend: series.length > 1 || types.has('pie'), legendPos: 'b', legendFontSize: 12, legendColor: how.ink, chartColors: colours, showTitle: Boolean(option.title?.[0]?.text), title: option.title?.[0]?.text, titleFontSize: 16, titleColor: how.ink, catAxisLabelColor: how.ink, valAxisLabelColor: how.ink, dataLabelColor: how.ink, lang: how.lang }\n if (types.size === 1 && (types.has('pie'))) {\n const pie = series[0]\n const ring = Array.isArray(pie.radius) && parseFloat(pie.radius[0]) > 0\n slide.addChart(ring ? pres.charts.DOUGHNUT : pres.charts.PIE, [{ name: pie.name ?? '', labels: pie.data.map((/** @type {any} */ d) => d.name), values: pie.data.map(value) }], { ...common, showPercent: true, showLegend: true, holeSize: ring ? 55 : undefined })\n return true\n }\n if ([...types].every((t) => t === 'bar' || t === 'line')) {\n const horizontal = option.yAxis?.[0]?.type === 'category'\n const labels = (horizontal ? option.yAxis : option.xAxis)?.[0]?.data ?? []\n const of = (/** @type {any} */ s) => [{ name: s.name ?? '', labels: labels.map(String), values: s.data.map(value) }]\n const kind = (/** @type {any} */ s) => (s.type === 'bar' ? pres.charts.BAR : s.areaStyle ? pres.charts.AREA : pres.charts.LINE)\n const axes = { catAxisLabelFontSize: 11, valAxisLabelFontSize: 11, valGridLine: { color: 'D9D9D9', size: 0.5 }, catAxisOrientation: how.rtl && !horizontal ? 'maxMin' : 'minMax', valAxisLabelFormatCode: '#,##0' }\n if (types.size === 1) {\n const data = series.flatMap(of)\n slide.addChart(kind(series[0]), data, { ...common, ...axes, barDir: horizontal ? 'bar' : 'col', barGrouping: series.some((s) => s.stack) ? 'stacked' : 'clustered', lineDataSymbol: 'circle', lineSize: 2 })\n } else slide.addChart(series.map((s) => ({ type: kind(s), data: of(s), options: { barDir: horizontal ? 'bar' : 'col', chartColors: [colours[series.indexOf(s) % colours.length]] } })), { ...common, ...axes })\n return true\n }\n if (types.size === 1 && types.has('scatter')) {\n const points = series[0].data.map((/** @type {any} */ d) => (Array.isArray(d) ? d : [d.value?.[0], d.value?.[1]]))\n slide.addChart(pres.charts.SCATTER, [{ name: 'X', values: points.map((/** @type {any[]} */ p) => p[0]) }, { name: series[0].name ?? 'Y', values: points.map((/** @type {any[]} */ p) => p[1]) }], { ...common, lineSize: 0, lineDataSymbolSize: 8 })\n return true\n }\n if (types.size === 1 && types.has('radar')) {\n const indicators = option.radar?.[0]?.indicator ?? []\n slide.addChart(pres.charts.RADAR, series[0].data.map((/** @type {any} */ d) => ({ name: d.name ?? '', labels: indicators.map((/** @type {any} */ i) => i.name), values: d.value })), { ...common, showLegend: true, radarStyle: 'standard' })\n return true\n }\n return false\n}\n\n/** PowerPoint's transition for Slidev's name: Morph (with a fade where it isn't known), a fade, a push. @param {string} kind @param {boolean} rtl */\nfunction transitionXml(kind, rtl) {\n const push = (/** @type {string} */ dir) => `<p:transition spd=\"med\"><p:push dir=\"${dir}\"/></p:transition>`\n if (kind === 'view-transition' || kind === 'morph') return '<mc:AlternateContent xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"><mc:Choice xmlns:p159=\"http://schemas.microsoft.com/office/powerpoint/2015/09/main\" Requires=\"p159\"><p:transition spd=\"slow\"><p159:morph option=\"byObject\"/></p:transition></mc:Choice><mc:Fallback><p:transition spd=\"slow\"><p:fade/></p:transition></mc:Fallback></mc:AlternateContent>'\n if (kind === 'slide-left') return push(rtl ? 'r' : 'l')\n if (kind === 'slide-right') return push(rtl ? 'l' : 'r')\n if (kind === 'slide-up') return push('u')\n if (kind === 'slide-down') return push('d')\n return '<p:transition spd=\"med\"><p:fade/></p:transition>'\n}\n\n/** A picture's data as PNG, drawn at a size; null when it can't be read (another site's, unshared). @param {string} src @param {number} w @param {number} h @param {boolean} [cover] */\nasync function pictureOf(src, w, h, cover = false) {\n try {\n const img = new Image()\n img.crossOrigin = 'anonymous'\n img.src = src\n await img.decode()\n const canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(w))\n canvas.height = Math.max(1, Math.round(h))\n const ctx = /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d'))\n const iw = img.naturalWidth || w, ih = img.naturalHeight || h\n const scale = cover ? Math.max(canvas.width / iw, canvas.height / ih) : Math.min(canvas.width / iw, canvas.height / ih)\n ctx.drawImage(img, (canvas.width - iw * scale) / 2, (canvas.height - ih * scale) / 2, iw * scale, ih * scale)\n return canvas.toDataURL('image/png')\n } catch {\n return null\n }\n}\n", "/* deck: a slide is a 16:9 box, a size container, whose canvas sizes its type and space with the\n slide's width (cqi), so it wraps the same at any size; its colours and faces are the look's tokens as custom properties; logical properties\n only, so a deck in Arabic mirrors. The others are laid out behind the one shown, unseen. */\n.deck { --deck-paper: #fffdf8; --deck-ink: #1d1b16; --deck-muted: #6b675e; --deck-line: #e4e0d6; --deck-primary: #8a6100; --deck-fill: #f7c531; --deck-on-fill: #1d1b16; --deck-soft: #fdf1c9;\n --deck-heading: system-ui, sans-serif; --deck-body: system-ui, sans-serif; --deck-radius: 10px;\n position: relative; display: grid; gap: 0.5rem; color: var(--deck-ink); font-family: var(--deck-body); }\n.deck *, .deck *::before, .deck *::after { box-sizing: border-box; }\n.deck-stage { position: relative; view-transition-name: deck-stage; }\n.deck-slide {\n container-type: inline-size; position: relative; aspect-ratio: 16 / 9; overflow: hidden; inline-size: 100%;\n background: var(--deck-paper); color: var(--deck-ink); border-radius: var(--deck-radius); box-shadow: 0 0 0 1px var(--deck-line);\n}\n.deck-canvas { position: absolute; inset: 0; display: grid; padding: 6cqi 7cqi 7cqi; gap: 0 4cqi; font-size: 2.6cqi; line-height: 1.4; }\n.deck-slide:not(.is-shown) { position: absolute; inset-block-start: 0; inset-inline-start: 0; visibility: hidden; }\n.deck-slot { --deck-fit: 1; min-block-size: 0; min-inline-size: 0; display: flex; flex-direction: column; justify-content: flex-start; font-size: calc(1em * var(--deck-fit)); overflow: hidden; }\n.deck-slot > :first-child { margin-block-start: 0; }\n.deck-slot > :last-child { margin-block-end: 0; }\n.deck-slide :is(h1, h2, h3, h4, .deck-h) { font-family: var(--deck-heading); font-weight: 700; line-height: 1.15; margin: 0 0 0.55em; text-wrap: balance; letter-spacing: -0.01em; }\n.deck-slide :is(h1, .deck-h1) { font-size: 2.1em; }\n.deck-slide :is(h2, .deck-h2) { font-size: 1.6em; }\n.deck-slide :is(h3, .deck-h3) { font-size: 1.25em; color: var(--deck-primary); }\n.deck-slide :is(p, ul, ol, blockquote, pre, .deck-table, .deck-block) { margin-block: 0 0.7em; }\n.deck-slide :is(ul, ol) { padding-inline-start: 1.2em; }\n.deck-slide li { margin-block-end: 0.3em; }\n.deck-slide li::marker { color: var(--deck-primary); }\n.deck-slide .deck-tasks { list-style: none; padding-inline-start: 0; }\n.deck-slide .deck-tasks input { font-size: inherit; inline-size: 0.8em; block-size: 0.8em; margin: 0; margin-inline-end: 0.5em; vertical-align: -0.05em; accent-color: var(--deck-primary); }\n.deck-slide strong { color: var(--deck-primary); }\n.deck-slide a { color: var(--deck-primary); }\n.deck-slide code { font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 0.85em; background: var(--deck-soft); padding: 0.05em 0.3em; border-radius: 0.2em; }\n.deck-slide pre { background: color-mix(in srgb, var(--deck-ink) 6%, var(--deck-paper)); padding: 0.8em 1em; border-radius: calc(var(--deck-radius) * 0.6); overflow: hidden; font-size: 0.75em; line-height: 1.45; text-align: start; }\n.deck-slide pre code { background: none; padding: 0; font-size: 1em; }\n.deck-slide pre.has-marks .deck-line:not(.is-marked) { opacity: 0.45; }\n.deck-slide blockquote { border-inline-start: 0.25em solid var(--deck-fill); padding-inline-start: 0.9em; margin-inline: 0; font-style: italic; }\n.deck-slide img { max-inline-size: 100%; max-block-size: 100%; object-fit: contain; }\n.deck-slide .deck-picture { flex: 1; min-block-size: 0; display: grid; grid-template: minmax(0, 1fr) / minmax(0, 1fr); place-items: center; }\n.deck-slide .deck-picture img { block-size: 100%; }\n.deck-table { overflow: hidden; }\n.deck-slide table { border-collapse: collapse; inline-size: 100%; font-size: 0.85em; }\n.deck-slide :is(th, td) { padding: 0.35em 0.7em; border-block-end: 1px solid var(--deck-line); text-align: start; }\n.deck-slide th { border-block-end: 2px solid var(--deck-primary); font-weight: 700; }\n.deck-slide [data-align=\"right\"] { text-align: end; font-variant-numeric: tabular-nums; }\n.deck-slide [data-align=\"center\"] { text-align: center; }\n.deck-block { position: relative; flex: 1 1 auto; min-block-size: 12cqi; overflow: hidden; }\n.deck-block .deck-chart, .deck-block .deck-diagram { position: absolute; inset: 0; display: grid; place-items: center; }\n.deck-block .deck-diagram img { max-inline-size: 100%; max-block-size: 100%; }\n.deck-block .deck-block-source { display: none; }\n.deck-block.is-failed .deck-block-source { display: block; }\n.deck-number { position: absolute; inset-block-end: 2.6cqi; inset-inline-end: 3cqi; font-size: 1.5cqi; color: var(--deck-muted); font-variant-numeric: tabular-nums; }\n/* The kit's logo (docs/kits.md): in its corner, small, or big on a cover and at the end; on dark paper its dark one, else on a light plate. */\n.deck-logo { position: absolute; z-index: 1; inset-block-start: 3.2cqi; inset-inline-end: 3.5cqi; block-size: 4.5cqi; inline-size: auto; max-inline-size: 20cqi; object-fit: contain; pointer-events: none; }\n.deck-logo[data-size=\"big\"] { block-size: 8cqi; max-inline-size: 32cqi; }\n.deck-logo[data-at$=\"start\"] { inset-inline: 3.5cqi auto; }\n.deck-logo[data-at^=\"bottom\"] { inset-block: auto 3.2cqi; }\n.deck-slide:has(.deck-logo[data-at=\"bottom-end\"]) .deck-number { inset-inline: 3cqi auto; }\n.deck-logo.is-dark { display: none; }\n:is(.deck[data-scheme=\"light\"] :is(.deck-slide[data-paper=\"ink\"], .deck-class-invert), .deck[data-scheme=\"dark\"] .deck-slide:is([data-paper=\"paper\"], [data-paper=\"soft\"]):not(.deck-class-invert), .deck[data-fill=\"dark\"] .deck-slide[data-paper=\"fill\"]) .deck-logo.has-dark { display: none; }\n:is(.deck[data-scheme=\"light\"] :is(.deck-slide[data-paper=\"ink\"], .deck-class-invert), .deck[data-scheme=\"dark\"] .deck-slide:is([data-paper=\"paper\"], [data-paper=\"soft\"]):not(.deck-class-invert), .deck[data-fill=\"dark\"] .deck-slide[data-paper=\"fill\"]) .deck-logo.is-dark { display: block; }\n:is(.deck[data-scheme=\"light\"] :is(.deck-slide[data-paper=\"ink\"], .deck-class-invert), .deck[data-scheme=\"dark\"] .deck-slide:is([data-paper=\"paper\"], [data-paper=\"soft\"]):not(.deck-class-invert), .deck[data-fill=\"dark\"] .deck-slide[data-paper=\"fill\"]) .deck-logo:not(.has-dark, .is-dark) { background: #fff; padding: 0.5cqi; border-radius: 0.5cqi; }\n\n/* Layouts from their kit's definition: the paper they are on, where their words sit, how big their heading is. */\n.deck-slide[data-paper=\"fill\"] { background: var(--deck-fill); color: var(--deck-on-fill); }\n.deck-slide[data-paper=\"ink\"] { background: var(--deck-ink); color: var(--deck-paper); }\n.deck-slide[data-paper=\"soft\"] { background: var(--deck-soft); }\n.deck-slide:is([data-paper=\"fill\"], [data-paper=\"ink\"]) :is(strong, a, h3, .deck-h3) { color: inherit; }\n.deck-slide[data-justify=\"center\"] .deck-slot { justify-content: center; }\n.deck-slide[data-justify=\"end\"] .deck-slot { justify-content: flex-end; }\n.deck-slide[data-align=\"center\"] .deck-slot { align-items: center; text-align: center; }\n.deck-slide[data-align=\"end\"] .deck-slot { align-items: flex-end; text-align: end; }\n.deck-slide[data-title=\"large\"] :is(h1, h2, .deck-h1, .deck-h2) { font-size: 2.4em; }\n.deck-slide[data-title=\"huge\"] :is(h1, .deck-h1) { font-size: 2.9em; }\n.deck-slide[data-title=\"huge\"] :is(h2, .deck-h2) { font-size: 2.4em; }\n/* What the usual layouts add to their definition: Slidev's looks for them. */\n.deck-layout-section .deck-slot::before { content: \"\"; display: block; inline-size: 3em; block-size: 0.3em; background: var(--deck-fill); margin-block-end: 0.8em; border-radius: 0.15em; }\n.deck-layout-statement :is(h1, h2, p, .deck-h1, .deck-h2) { font-size: 2.4em; font-family: var(--deck-heading); font-weight: 700; line-height: 1.2; }\n.deck-slide.deck-layout-fact :is(h1, .deck-h1) { font-size: 5em; color: var(--deck-primary); margin-block-end: 0.15em; }\n.deck-layout-quote blockquote { font-size: 1.7em; border: 0; padding: 0; font-family: var(--deck-heading); }\n/* Scripts without italics keep their upright letters. */\n.deck :is(blockquote, em):is(:lang(ar), :lang(fa), :lang(ur), :lang(he), :lang(ja), :lang(zh), :lang(ko), :lang(hi), :lang(th)) { font-style: normal; }\n.deck-layout-quote blockquote::before { content: \"\\201C\"; display: block; font-size: 2.4em; line-height: 0.6; color: var(--deck-primary); }\n.deck-layout-full .deck-canvas { padding: 0; }\n.deck-slide.has-image .deck-image { background: var(--deck-image) center / cover no-repeat, var(--deck-soft); }\n.deck-layout-image-left.has-image .deck-canvas, .deck-layout-image-right.has-image .deck-canvas { padding: 0; grid-template: \"image s-default\" 1fr / 1fr 1fr !important; gap: 0; }\n.deck-layout-image-right.has-image .deck-canvas { grid-template-areas: \"s-default image\" !important; }\n:is(.deck-layout-image-left, .deck-layout-image-right).has-image .deck-image { grid-area: image; }\n:is(.deck-layout-image-left, .deck-layout-image-right).has-image .deck-slot { padding: 6cqi 5cqi; justify-content: center; }\n:is(.deck-layout-image, .deck-layout-cover).has-image .deck-image { position: absolute; inset: 0; }\n:is(.deck-layout-image, .deck-layout-cover).has-image .deck-slot { position: relative; color: #fff; text-shadow: 0 0.05em 0.4em rgb(0 0 0 / 0.6); }\n.deck-layout-cover.has-image .deck-image::after { content: \"\"; position: absolute; inset: 0; background: linear-gradient(to top, rgb(0 0 0 / 0.65), rgb(0 0 0 / 0.1)); }\n.deck-class-invert { background: var(--deck-ink); color: var(--deck-paper); }\n.deck-class-text-center .deck-slot { text-align: center; align-items: center; }\n\n/* Steps: what a click shows next, there but unseen until then. */\n.deck-step { transition: opacity 0.3s, translate 0.3s; }\n.deck-step:not(.is-on) { opacity: 0; visibility: hidden; translate: 0 0.3em; }\n.deck.is-editing .deck-step:not(.is-on), .deck.is-overview .deck-step:not(.is-on), .deck-print .deck-step { opacity: 1; visibility: visible; translate: none; }\n\n/* Its bar. */\n.deck-bar { display: flex; align-items: center; gap: 0.25rem; font: 0.85rem/1 system-ui, sans-serif; color: var(--deck-muted); }\n.deck-bar button { display: inline-grid; place-items: center; min-inline-size: 2.25rem; min-block-size: 2.25rem; padding: 0 0.5rem; border: 0; border-radius: 0.5rem; background: none; color: var(--deck-ink); font: inherit; cursor: pointer; }\n.deck-bar button:hover { background: color-mix(in srgb, var(--deck-ink) 8%, transparent); }\n.deck-bar button:focus-visible { outline: 2px solid var(--deck-primary); outline-offset: 1px; }\n.deck-bar button:disabled { opacity: 0.35; cursor: default; }\n.deck-bar button[aria-pressed=\"true\"] { background: color-mix(in srgb, var(--deck-primary) 18%, transparent); }\n.deck-bar svg { inline-size: 1.15rem; block-size: 1.15rem; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }\n.deck-bar [dir=\"rtl\"] .deck-flip, .deck[dir=\"rtl\"] .deck-flip { scale: -1 1; }\n.deck-where { font-variant-numeric: tabular-nums; min-inline-size: 4.5em; text-align: center; }\n.deck-bar .deck-gap { flex: 1; }\n\n/* Presented: the stage fills the screen, black around it. */\n.deck-stage:fullscreen { display: grid; place-items: center; background: #000; }\n.deck-stage:fullscreen .deck-slide { inline-size: min(100vw, 100vh * 16 / 9); border-radius: 0; box-shadow: none; }\n.deck-stage:fullscreen .deck-slide:not(.is-shown) { inset-block-start: 50%; translate: 0 -50%; }\n\n/* The presenter's view: this slide, the next, the notes and the time. */\n.deck-presenter { display: none; }\n.deck.is-presenting { grid-template: \"stage next\" auto \"stage notes\" 1fr \"bar bar\" auto / 3fr 2fr; min-block-size: 70vh; }\n.deck.is-presenting .deck-stage { grid-area: stage; align-self: start; }\n.deck.is-presenting .deck-presenter { display: contents; }\n.deck.is-presenting .deck-bar { grid-area: bar; }\n.deck-next { grid-area: next; display: grid; gap: 0.3rem; font: 0.8rem system-ui, sans-serif; color: var(--deck-muted); }\n.deck-next .deck-slide { position: relative; visibility: visible; }\n.deck-notes { grid-area: notes; overflow: auto; padding: 0.8rem 1rem; border-radius: 0.6rem; background: color-mix(in srgb, var(--deck-ink) 5%, transparent); font: 1.1rem/1.5 system-ui, sans-serif; white-space: pre-wrap; }\n.deck-clock { font-variant-numeric: tabular-nums; font-size: 1.2rem; color: var(--deck-ink); }\n\n/* All the slides at once. */\n.deck.is-overview .deck-stage { display: grid; grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr)); gap: 0.8rem; view-transition-name: none; }\n.deck.is-overview .deck-slide { position: relative; visibility: visible; cursor: pointer; }\n.deck.is-overview .deck-slide.is-shown { box-shadow: 0 0 0 3px var(--deck-primary); }\n\n/* Changed by hand: the Markdown beside the slides, and words changed on a slide in place. */\n.deck.is-editing { grid-template: \"source stage\" auto \"source bar\" 1fr / minmax(18rem, 2fr) 3fr; align-items: start; }\n.deck.is-editing .deck-stage { grid-area: stage; }\n.deck.is-editing .deck-bar { grid-area: bar; }\n.deck-source { display: none; }\n.deck.is-editing .deck-source { display: block; grid-area: source; inline-size: 100%; block-size: min(80vh, 48rem); resize: vertical; padding: 0.8rem; border: 1px solid var(--deck-line); border-radius: 0.6rem; background: var(--deck-paper); color: var(--deck-ink); font: 0.85rem/1.55 ui-monospace, Menlo, Consolas, monospace; tab-size: 2; }\n.deck.is-editing [data-edit] { cursor: text; border-radius: 0.15em; }\n.deck.is-editing [data-edit]:hover { box-shadow: 0 0 0 0.12em color-mix(in srgb, var(--deck-primary) 45%, transparent); }\n.deck [data-edit][contenteditable] { outline: 0.12em solid var(--deck-primary); outline-offset: 0.1em; }\n.deck-slide[data-overflow] { box-shadow: 0 0 0 3px #c92a2a; }\n@media (max-width: 52rem) { .deck.is-editing, .deck.is-presenting { grid-template: none; display: grid; } .deck.is-editing .deck-source { block-size: 40vh; } .deck.is-presenting .deck-presenter { display: grid; } }\n\n/* Transitions between slides, as Slidev names them; none for those who'd rather not. */\n::view-transition-group(deck-stage) { animation-duration: 0.45s; animation-timing-function: cubic-bezier(0.2, 0.8, 0.2, 1); }\nhtml[data-deck-transition~=\"fade\"]::view-transition-old(deck-stage) { animation: 0.35s ease both deck-out-fade; }\nhtml[data-deck-transition~=\"fade\"]::view-transition-new(deck-stage) { animation: 0.35s ease both deck-in-fade; }\nhtml[data-deck-transition~=\"slide-left\"]::view-transition-old(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-out-start; }\nhtml[data-deck-transition~=\"slide-left\"]::view-transition-new(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-in-end; }\nhtml[data-deck-transition~=\"slide-right\"]::view-transition-old(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-out-end; }\nhtml[data-deck-transition~=\"slide-right\"]::view-transition-new(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-in-start; }\nhtml[data-deck-transition~=\"slide-up\"]::view-transition-old(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-out-up; }\nhtml[data-deck-transition~=\"slide-up\"]::view-transition-new(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-in-up; }\nhtml[data-deck-transition~=\"morph\"]::view-transition-old(deck-stage) { animation: 0.3s ease both deck-out-fade; }\nhtml[data-deck-transition~=\"morph\"]::view-transition-new(deck-stage) { animation: 0.3s ease both deck-in-fade; }\nhtml[data-deck-transition~=\"morph\"]::view-transition-group(*) { animation-duration: 0.6s; }\n@keyframes deck-out-fade { to { opacity: 0; } }\n@keyframes deck-in-fade { from { opacity: 0; } }\n@keyframes deck-out-start { to { translate: -30% 0; opacity: 0; } }\n@keyframes deck-in-end { from { translate: 30% 0; opacity: 0; } }\n@keyframes deck-out-end { to { translate: 30% 0; opacity: 0; } }\n@keyframes deck-in-start { from { translate: -30% 0; opacity: 0; } }\n@keyframes deck-out-up { to { translate: 0 -20%; opacity: 0; } }\n@keyframes deck-in-up { from { translate: 0 20%; opacity: 0; } }\n@media (prefers-reduced-motion: reduce) { ::view-transition-group(*), ::view-transition-old(*), ::view-transition-new(*) { animation: none !important; } .deck-step { transition: none; } }\n@media (forced-colors: active) { .deck-slide { border: 1px solid CanvasText; } .deck-step:not(.is-on) { visibility: hidden; } }\n\n/* On paper: every slide, one a page, every step shown, no bar. */\n@media print {\n @page { size: 13.333in 7.5in; margin: 0; }\n .deck-bar, .deck-source, .deck-presenter { display: none !important; }\n .deck, .deck.is-editing, .deck.is-presenting { display: block; }\n .deck-slide, .deck-slide:not(.is-shown) { position: relative; visibility: visible; break-after: page; border-radius: 0; box-shadow: none; inline-size: 100vw; }\n .deck-step:not(.is-on) { opacity: 1; visibility: visible; translate: none; }\n}\n", "// A .deck.html opened on its own, in any browser: the Markdown its page holds read and drawn as\n// slides; saved back as the same kind of file, the renderer as it came (linked or held whole);\n// saved as PowerPoint with PptxGenJS loaded only then. Libraries come from `data-base` on the\n// renderer's script, else jsDelivr's npm mirror.\nimport { createDeck } from './deck.js'\nimport { defaultBlocks, libraryAt } from './blocks.js'\nimport { readDeckFile, writeDeckFile, unescape } from './file.js'\nimport { toPptx } from './pptx.js'\nimport css from './deck.css'\n\nconst me = /** @type {HTMLScriptElement | null} */ (document.currentScript)\nconst base = me?.dataset.base ?? 'https://cdn.jsdelivr.net/npm/'\n\nconst PAGE = /* css */ `html, body { margin: 0; } body { min-block-size: 100vh; }\nbody > .deck { min-block-size: 100vh; padding: clamp(0.5rem, 3vw, 2rem); align-content: center; justify-items: center; background: color-mix(in srgb, var(--deck-ink) 7%, var(--deck-paper)); }\nbody > .deck > .deck-stage, body > .deck > .deck-bar { inline-size: min(100%, (100vh - 7rem) * 16 / 9); }\nbody > .deck.is-editing { justify-items: stretch; align-content: start; }\nbody > .deck.is-editing > .deck-stage, body > .deck.is-editing > .deck-bar, body > .deck.is-presenting > .deck-stage, body > .deck.is-presenting > .deck-bar, body > .deck.is-overview > .deck-stage { inline-size: auto; }\nbody > .deck:is(.is-presenting, .is-overview) { justify-items: stretch; align-content: start; }`\n\nfunction boot() {\n const holder = document.getElementById('deck')\n if (!holder) return\n const source = unescape(holder.textContent ?? '').replace(/^\\n/, '').replace(/\\n$/, '')\n const sheet = new CSSStyleSheet()\n sheet.replaceSync(`${css}\\n${PAGE}`)\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet]\n holder.style.display = 'none'\n const root = document.createElement('main')\n document.body.append(root)\n const blocks = defaultBlocks({ base, root })\n /** @type {any} */\n let handle = null\n const view = createDeck(root, {\n source, blocks, lang: document.documentElement.lang || undefined,\n async onSave(text) {\n const settings = view.deck.settings\n const file = writeDeckFile(text, {\n title: String(settings.title ?? view.deck.slides[0]?.title ?? document.title), lang: view.lang, dir: view.dir,\n renderer: me?.src ? { src: me.src } : { code: me?.textContent ?? '' }, generator: document.querySelector('meta[name=generator]')?.getAttribute('content') ?? 'deck',\n })\n const name = decodeURIComponent(location.pathname.split('/').pop() || 'slides.deck.html')\n const picker = /** @type {any} */ (window).showSaveFilePicker\n if (picker) {\n try {\n handle ??= await picker({ suggestedName: name, types: [{ description: 'Deck', accept: { 'text/html': ['.deck.html', '.html'] } }] })\n const writable = await handle.createWritable()\n await writable.write(file)\n await writable.close()\n return\n } catch (error) { if (/** @type {Error} */ (error).name === 'AbortError') return }\n }\n download(new Blob([file], { type: 'text/html' }), name)\n },\n async onExport(deck) {\n const { PptxGenJS, JSZip } = await libraries()\n const { blob } = await toPptx(deck, { PptxGenJS, JSZip })\n download(blob, `${String(deck.deck.settings.title ?? deck.deck.slides[0]?.title ?? 'slides').replace(/[\\\\/:*?\"<>|]+/g, ' ').trim() || 'slides'}.pptx`)\n },\n })\n const title = view.deck.settings.title ?? view.deck.slides[0]?.title\n if (title) document.title = String(title)\n const stage = /** @type {HTMLElement | null} */ (root.querySelector('.deck-stage'))\n stage?.focus({ preventScroll: true })\n Object.assign(window, { deckView: view, deckTools: { toPptx, libraries, readDeckFile, writeDeckFile } })\n}\n\nasync function libraries() {\n if (!(/** @type {any} */ (window).PptxGenJS)) await new Promise((resolve, reject) => {\n const tag = document.createElement('script')\n tag.src = libraryAt(base, 'pptxgenjs', '4.0.1', 'dist/pptxgen.bundle.js')\n tag.onload = resolve\n tag.onerror = reject\n document.head.append(tag)\n })\n return { PptxGenJS: /** @type {any} */ (window).PptxGenJS, JSZip: /** @type {any} */ (window).JSZip }\n}\n\n/** @param {Blob} blob @param {string} name */\nfunction download(blob, name) {\n const a = Object.assign(document.createElement('a'), { href: URL.createObjectURL(blob), download: name })\n document.body.append(a)\n a.click()\n a.remove()\n setTimeout(() => URL.revokeObjectURL(a.href), 10_000)\n}\n\nif (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot)\nelse boot()\n"],
5
+ "mappings": "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",
6
+ "names": ["parseYaml", "text", "lines", "raw", "uncomment", "value", "block", "line", "quote", "i", "c", "at", "min", "indent", "list", "rest", "width", "scalar", "map", "entry", "key", "blockScalar", "folded", "taken", "t", "read", "flow", "space", "item", "start", "q", "open", "SLOT", "parseDeck", "source", "lines", "offsets", "line", "ranges", "start", "matter", "comment", "i", "commentGoesOn", "j", "fence", "last", "heads", "mark", "cuts", "at", "k", "slides", "end", "index", "slide", "one", "slot", "columnsOf", "starts", "open", "close", "cols", "names", "_", "begin", "from", "to", "settings", "parseYaml", "top", "body", "notes", "after", "all", "text", "slots", "name", "first", "taken", "push", "columns", "marker", "kept", "heading", "NAME", "TRACK", "PPTX", "ENUMS", "CORNERS", "logoOf", "value", "ALIASES", "STANDARD", "name", "given", "layoutOf", "problems", "budgets", "named", "budget", "clean", "slots", "slot", "rows", "row", "width", "cell", "cells", "y", "x", "xs", "c", "ys", "tracks", "count", "list", "t", "columns", "rowTracks", "pick", "key", "fallback", "label", "words", "v", "kept", "tokensFrom", "colour", "face", "NAMES", "group", "g", "k", "colours", "tokens", "dark", "fonts", "heading", "body", "mergeKits", "kits", "kit", "next", "definition", "layout", "found", "p", "where", "labelOf", "lang", "inferLayout", "slide", "names", "lines", "line", "h", "tag", "attributes", "children", "element", "name", "value", "child", "safeUrl", "href", "url", "renderSlide", "slide", "context", "asked", "layout", "ALIASES", "inferLayout", "definition", "STANDARD", "classes", "counter", "slots", "slot", "names", "section", "canvas", "row", "cell", "image", "picture", "blocks", "logo", "logoAt", "dark", "at", "CORNERS", "src", "kind", "tokens", "out", "mode", "token", "start", "fences", "line", "fence", "list", "attrs", "inner", "words", "li", "step", "block", "n", "stepped", "head", "edit", "range", "inline", "lone", "from", "item", "offset", "itemStart", "marker", "simple", "info", "lang", "drawer", "box", "marked", "lines", "code", "i", "align", "a", "raw", "text", "part", "b", "to", "_", "e", "LOOKS", "VOICES", "tokensOf", "settings", "project", "named", "own", "tokens", "clean", "given", "kept", "key", "hex", "v", "c", "schemeOf", "scheme", "light", "dark", "paper", "round", "mix", "ink", "primary", "text", "readable", "onPrimary", "contrast", "series", "n", "rotate", "css", "value", "m", "h", "i", "rgb", "a", "b", "t", "luminance", "r", "g", "s", "x", "y", "p", "q", "colour", "ratio", "toward", "out", "degrees", "max", "min", "l", "d", "u", "STRINGS", "stringsFor", "lang", "_getDefaults", "_defaults", "changeDefaults", "newDefaults", "noopTest", "cachedIndentRegex", "createRegex", "cache", "indent", "cacheIndex", "regex", "edit", "opt", "source", "obj", "name", "val", "valSource", "other", "supportsLookbehind", "a", "bull", "_tag", "newline", "blockCode", "fences", "hr", "heading", "bullet", "lheadingCore", "lheading", "lheadingGfm", "_paragraph", "blockText", "_blockLabel", "def", "list", "_comment", "html", "createParagraph", "listInterrupt", "paragraph", "blockquoteParagraph", "blockquote", "blockNormal", "gfmTable", "blockGfm", "blockPedantic", "escape", "inlineCode", "br", "inlineText", "_punctuation", "_punctuationOrSpace", "_notPunctuationOrSpace", "punctuation", "_openQuote", "_punctuationGfmStrongEm", "_punctuationOrSpaceGfmStrongEm", "_notPunctuationOrSpaceGfmStrongEm", "blockSkip", "emStrongLDelimCore", "emStrongLDelim", "emStrongLDelimGfm", "emStrongLDelimPedanticCore", "emStrongLDelimPedantic", "emStrongRDelimAstCore", "emStrongRDelimAst", "emStrongRDelimAstGfm", "emStrongRDelimAstPedanticCore", "emStrongRDelimAstPedantic", "emStrongRDelimUnd", "emStrongRDelimUndPedanticCore", "emStrongRDelimUndPedantic", "delLDelim", "delRDelimCore", "delRDelim", "anyPunctuation", "anyPunctuationOutsideCode", "autolink", "_inlineComment", "tag", "_inlineLabelBrackets", "_inlineLabel", "link", "reflink", "nolink", "_boundedBlockLabel", "_boundedInlineLabel", "reflinkSearch", "_caseInsensitiveProtocol", "_extendedEmail", "_extendedEmailProtocol", "inlineNormal", "inlinePedantic", "inlineGfm", "inlineBreaks", "block", "inline", "escapeReplacements", "getEscapeReplacement", "ch", "escapeHtmlEntities", "encode", "decodeNumericCharacterReferences", "text", "ref", "dec", "hex", "code", "cleanUrl", "href", "splitCells", "tableRow", "count", "row", "match", "offset", "str", "escaped", "curr", "cells", "i", "rtrim", "c", "invert", "l", "suffLen", "currChar", "trimTrailingBlankLines", "lines", "end", "normalizeLabel", "label", "findClosingBracket", "b", "level", "expandTabs", "line", "col", "expanded", "char", "added", "outputLink", "cap", "raw", "lexer", "rules", "title", "isImage", "outerInLink", "outerLinkEmitted", "outerInRawBlock", "tokens", "textHasLink", "indentCodeCompensation", "matchIndentToCode", "indentToCode", "node", "matchIndentInNode", "indentInNode", "isLabelEndInsideToken", "src", "labelStart", "tokenSrc", "token", "_Tokenizer", "options", "trimmed", "inBlockquote", "currentLines", "currentRaw", "currentText", "top", "lastToken", "oldToken", "continuation", "newText", "newToken", "leftover", "leftoverCount", "consumed", "listSrc", "taken", "isordered", "itemRegex", "endsWithBlankLine", "endEarly", "itemContents", "itemStart", "firstLine", "bulletIndent", "whitespace", "nextLine", "blankLine", "nextBulletRegex", "hrRegex", "fencesBeginRegex", "headingBeginRegex", "htmlBeginRegex", "blockquoteBeginRegex", "rawLine", "nextLineWithoutTabs", "lastItem", "item", "spacers", "t", "hasMultipleLineBreaks", "itemToken", "taskRaw", "checkboxToken", "headers", "aligns", "rows", "align", "cell", "trimmedUrl", "rtrimSlash", "lastParenIndex", "linkLen", "links", "linkString", "maskedSrc", "prevChar", "lLength", "rDelim", "rLength", "delimTotal", "midDelimTotal", "delimChar", "midRun", "endReg", "lastCharLength", "hasNonSpaceChars", "hasSpaceCharsOnBothEnds", "prevCapZero", "_Lexer", "__Lexer", "next", "lastParagraphClipped", "srcLength", "extTokenizer", "cutSrc", "startIndex", "tempSrc", "tempStart", "getStartIndex", "linkRule", "match0", "refStart", "prevLinkParenPossible", "#inlineTokensInner", "maskReflink", "punct", "_link", "context", "keepPrevChar", "byte", "errMsg", "_Renderer", "lang", "langString", "depth", "ordered", "start", "body", "j", "type", "startAttr", "checked", "header", "k", "content", "parsedText", "cleanHref", "out", "_TextRenderer", "_Parser", "__Parser", "anyToken", "genericToken", "ret", "renderer", "_Hooks", "markdown", "pushValues", "values", "value", "Marked", "args", "callback", "tableToken", "listToken", "childTokens", "extensions", "pack", "opts", "ext", "prevRenderer", "extLevel", "prop", "rendererProp", "rendererFunc", "tokenizer", "tokenizerProp", "tokenizerFunc", "prevTokenizer", "hooks", "hooksProp", "hooksFunc", "prevHook", "arg", "walkTokens", "packWalktokens", "blockType", "origOpt", "throwError", "processedSrc", "processedTokens", "e", "silent", "async", "msg", "markedInstance", "marked", "useExtension", "setOptions", "parseInline", "parser", "_Parser", "lexer", "_Lexer", "RTL", "ICONS", "icon", "name", "svg", "path", "createDeck", "root", "options", "source", "deck", "parseDeck", "at", "stepAt", "drawn", "lang", "dir", "words", "stringsFor", "number", "dark", "scheme", "started", "stage", "h", "where", "button", "label", "act", "b", "back", "move", "next", "editButton", "toggle", "presenterButton", "overviewButton", "bar", "paintLook", "view", "present", "sourceBox", "nextBox", "notes", "clock", "presenter", "kitProblems", "kitOf", "merged", "mergeKits", "context", "tokens", "tokensOf", "colours", "schemeOf", "stack", "faces", "f", "voice", "VOICES", "value", "colour", "n", "fill", "contrast", "hex", "chooseScheme", "asked", "src", "markdown", "T", "draw", "slide", "renderSlide", "i", "element", "go", "show", "fitAll", "fit", "over", "slot", "scale", "steps", "one", "following", "by", "to", "toStep", "forward", "settings", "named", "ahead", "behind", "part", "kind", "_", "side", "update", "reduced", "transition", "toward", "key", "el", "parts", "s", "there", "match", "id", "old", "mode", "other", "setSource", "text", "pending", "event", "followCaret", "caret", "found", "target", "from", "done", "keep", "blur", "markdownOf", "e", "backward", "touch", "dx", "tick", "node", "out", "child", "inner", "loading", "script", "src", "global", "resolve", "reject", "tag", "libraryAt", "base", "name", "version", "file", "defaultBlocks", "root", "versions", "chartsAt", "diagramsAt", "charts", "colours", "event", "one", "themed", "option", "box", "size", "rtl", "small", "axis", "given", "across", "source", "echarts", "place", "chart", "pele", "font", "svg", "look", "picture", "VERSION", "OPEN", "CLOSE", "escape", "markdown", "unescape", "text", "attribute", "content", "inlineCode", "code", "readDeckFile", "html", "at", "from", "end", "rendererUrl", "version", "VERSION", "writeDeckFile", "title", "lang", "dir", "renderer", "base", "generator", "data", "script", "W", "H", "TEXT", "hexOf", "value", "m", "toPptx", "view", "PptxGenJS", "JSZip", "pres", "rootStyle", "firstFont", "stack", "f", "report", "rtl", "slides", "masters", "transitions", "i", "element", "box", "sx", "W", "place", "el", "r", "across", "slot", "x", "w", "y", "h", "pad", "start", "end", "anchor", "pt", "px", "style", "layout", "slots", "firstBlock", "title", "definition", "masterName", "labelOf", "objects", "hexOf", "top", "inner", "logo", "one", "mark", "pictureOf", "H", "o", "names", "slide", "background", "url", "data", "runs", "blocks", "child", "TEXT", "block", "spaced", "at", "table", "chart", "nativeChart", "img", "notes", "settings", "zip", "kind", "path", "xml", "found", "transitionXml", "theme", "colour", "name", "series", "n", "scheme", "c", "first", "after", "how", "out", "paragraph", "extra", "base", "pieces", "inlineRuns", "list", "level", "li", "nested", "clone", "sub", "p", "node", "walk", "options", "text", "own", "run", "rows", "tr", "cell", "align", "widths", "total", "a", "b", "option", "types", "s", "colours", "value", "v", "common", "pie", "ring", "d", "t", "horizontal", "labels", "of", "axes", "points", "indicators", "push", "dir", "src", "cover", "canvas", "ctx", "iw", "ih", "scale", "deck_default", "me", "base", "PAGE", "boot", "holder", "source", "unescape", "sheet", "deck_default", "root", "blocks", "defaultBlocks", "handle", "view", "createDeck", "text", "settings", "file", "writeDeckFile", "name", "picker", "writable", "error", "download", "deck", "PptxGenJS", "JSZip", "libraries", "blob", "toPptx", "title", "readDeckFile", "resolve", "reject", "tag", "libraryAt", "a"]
7
7
  }