@coding01/docsjs 0.1.2 → 0.1.3

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vue.ts","../src/vue/WordFidelityEditorVue.ts","../src/lib/htmlSnapshot.ts","../src/lib/docxHtml.ts","../src/lib/pastePipeline.ts","../src/lib/htmlCompat.ts","../src/lib/styleProfile.ts","../src/lib/renderApply.ts","../src/core/DocsWordElement.ts"],"sourcesContent":["export { WordFidelityEditorVue } from \"./vue/WordFidelityEditorVue\";\nexport type {\n DocsWordEditorChangeDetail,\n DocsWordEditorElementApi,\n DocsWordEditorErrorDetail,\n DocsWordEditorReadyDetail\n} from \"./core/types\";\n","import { defineComponent, h, onBeforeUnmount, onMounted, ref } from \"vue\";\nimport { defineDocsWordElement } from \"../core/DocsWordElement\";\nimport type {\n DocsWordEditorChangeDetail,\n DocsWordEditorElementApi,\n DocsWordEditorErrorDetail,\n DocsWordEditorReadyDetail\n} from \"../core/types\";\n\ndefineDocsWordElement();\n\nexport const WordFidelityEditorVue = defineComponent({\n name: \"WordFidelityEditorVue\",\n props: {\n lang: {\n type: String as () => \"zh\" | \"en\",\n default: \"zh\"\n }\n },\n emits: [\"change\", \"error\", \"ready\"],\n setup(props, { emit }) {\n const elRef = ref<DocsWordEditorElementApi | null>(null);\n\n const onChange = (event: Event) => {\n emit(\"change\", (event as CustomEvent<DocsWordEditorChangeDetail>).detail);\n };\n const onError = (event: Event) => {\n emit(\"error\", (event as CustomEvent<DocsWordEditorErrorDetail>).detail);\n };\n const onReady = (event: Event) => {\n emit(\"ready\", (event as CustomEvent<DocsWordEditorReadyDetail>).detail);\n };\n\n onMounted(() => {\n elRef.value?.addEventListener(\"docsjs-change\", onChange);\n elRef.value?.addEventListener(\"docsjs-error\", onError);\n elRef.value?.addEventListener(\"docsjs-ready\", onReady);\n });\n\n onBeforeUnmount(() => {\n elRef.value?.removeEventListener(\"docsjs-change\", onChange);\n elRef.value?.removeEventListener(\"docsjs-error\", onError);\n elRef.value?.removeEventListener(\"docsjs-ready\", onReady);\n });\n\n return () => h(\"docs-word-editor\", { ref: elRef, lang: props.lang });\n }\n});\n","const SNAPSHOT_SHELL_START = \"<!DOCTYPE html><html><head><meta charset=\\\"utf-8\\\"/>\";\nconst SNAPSHOT_SHELL_END = \"</head><body></body></html>\";\n\nexport function buildHtmlSnapshot(rawHtml: string): string {\n if (!rawHtml.trim()) {\n return `${SNAPSHOT_SHELL_START}${SNAPSHOT_SHELL_END}`;\n }\n\n const hasHtmlTag = /<html[\\s>]/i.test(rawHtml);\n if (hasHtmlTag) {\n return rawHtml;\n }\n\n return `${SNAPSHOT_SHELL_START}${SNAPSHOT_SHELL_END}`.replace(\n \"<body></body>\",\n `<body>${rawHtml}</body>`\n );\n}\n\nexport async function readClipboardHtml(): Promise<string | null> {\n if (!navigator.clipboard?.read) {\n return null;\n }\n\n const items = await navigator.clipboard.read();\n for (const item of items) {\n if (item.types.includes(\"text/html\")) {\n const blob = await item.getType(\"text/html\");\n return blob.text();\n }\n }\n\n return null;\n}\n","import JSZip from \"jszip\";\nimport { buildHtmlSnapshot } from \"./htmlSnapshot\";\n\ninterface RelMap {\n [rid: string]: string;\n}\n\ninterface DrawingSizePx {\n widthPx: number | null;\n heightPx: number | null;\n}\n\ninterface FootnoteMap {\n [id: string]: string;\n}\n\ninterface CommentInfo {\n author: string | null;\n date: string | null;\n text: string;\n}\n\ninterface CommentMap {\n [id: string]: CommentInfo;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\");\n}\n\nfunction parseXml(xmlText: string): Document {\n const parser = new DOMParser();\n return parser.parseFromString(xmlText, \"application/xml\");\n}\n\nfunction queryAllByLocalName(root: ParentNode, localName: string): Element[] {\n return Array.from(root.querySelectorAll(\"*\")).filter((el) => el.localName === localName);\n}\n\nfunction queryByLocalName(root: ParentNode, localName: string): Element | null {\n return queryAllByLocalName(root, localName)[0] ?? null;\n}\n\nfunction directChildrenByLocalName(node: Element, localName: string): Element[] {\n return Array.from(node.children).filter((child) => child.localName === localName);\n}\n\nfunction getAttr(node: Element | null, name: string): string | null {\n if (!node) return null;\n return node.getAttribute(name);\n}\n\nfunction emuToPx(emu: number): number {\n return (emu * 96) / 914400;\n}\n\nfunction parseDrawingSizePx(drawing: Element): DrawingSizePx {\n const extentNode =\n queryAllByLocalName(drawing, \"extent\").find((node) => {\n const parent = node.parentElement;\n return parent?.localName === \"inline\" || parent?.localName === \"anchor\";\n }) ?? null;\n if (!extentNode) {\n return { widthPx: null, heightPx: null };\n }\n\n const rawCx = getAttr(extentNode, \"cx\");\n const rawCy = getAttr(extentNode, \"cy\");\n const cx = rawCx ? Number.parseInt(rawCx, 10) : Number.NaN;\n const cy = rawCy ? Number.parseInt(rawCy, 10) : Number.NaN;\n\n const widthPx = Number.isFinite(cx) && cx > 0 ? emuToPx(cx) : null;\n const heightPx = Number.isFinite(cy) && cy > 0 ? emuToPx(cy) : null;\n return { widthPx, heightPx };\n}\n\nfunction imageDimensionAttributes(sizePx: DrawingSizePx): string {\n const attrs: string[] = [];\n if (sizePx.widthPx !== null) attrs.push(`width=\"${Math.round(sizePx.widthPx)}\"`);\n if (sizePx.heightPx !== null) attrs.push(`height=\"${Math.round(sizePx.heightPx)}\"`);\n if (sizePx.widthPx !== null || sizePx.heightPx !== null) {\n const style: string[] = [\"max-width:100%\"];\n if (sizePx.widthPx !== null) style.push(`width:${sizePx.widthPx.toFixed(2)}px`);\n if (sizePx.heightPx !== null) style.push(`height:${sizePx.heightPx.toFixed(2)}px`);\n attrs.push(`style=\"${style.join(\";\")}\"`);\n }\n return attrs.length > 0 ? ` ${attrs.join(\" \")}` : \"\";\n}\n\ninterface AnchorPositionPx {\n leftPx: number | null;\n topPx: number | null;\n}\n\ntype AnchorWrapMode = \"square\" | \"tight\" | \"topAndBottom\" | \"none\" | null;\n\nfunction parseAnchorPositionPx(drawing: Element): AnchorPositionPx {\n const anchor = directChildrenByLocalName(drawing, \"anchor\")[0] ?? null;\n if (!anchor) return { leftPx: null, topPx: null };\n\n let leftPx: number | null = null;\n let topPx: number | null = null;\n\n const positionH = directChildrenByLocalName(anchor, \"positionH\")[0] ?? null;\n const positionV = directChildrenByLocalName(anchor, \"positionV\")[0] ?? null;\n const posH = positionH ? directChildrenByLocalName(positionH, \"posOffset\")[0] ?? null : null;\n const posV = positionV ? directChildrenByLocalName(positionV, \"posOffset\")[0] ?? null : null;\n\n const rawLeft = posH?.textContent?.trim() ?? \"\";\n const rawTop = posV?.textContent?.trim() ?? \"\";\n const left = rawLeft ? Number.parseFloat(rawLeft) : Number.NaN;\n const top = rawTop ? Number.parseFloat(rawTop) : Number.NaN;\n\n if (Number.isFinite(left)) leftPx = emuToPx(left);\n if (Number.isFinite(top)) topPx = emuToPx(top);\n return { leftPx, topPx };\n}\n\nfunction parseAnchorWrapMode(drawing: Element): AnchorWrapMode {\n const anchor = directChildrenByLocalName(drawing, \"anchor\")[0] ?? null;\n if (!anchor) return null;\n if (directChildrenByLocalName(anchor, \"wrapSquare\")[0]) return \"square\";\n if (directChildrenByLocalName(anchor, \"wrapTight\")[0]) return \"tight\";\n if (directChildrenByLocalName(anchor, \"wrapTopAndBottom\")[0]) return \"topAndBottom\";\n if (directChildrenByLocalName(anchor, \"wrapNone\")[0]) return \"none\";\n return null;\n}\n\nfunction mergeImageStyle(baseAttrs: string, anchorPos: AnchorPositionPx, wrapMode: AnchorWrapMode): string {\n if (anchorPos.leftPx === null && anchorPos.topPx === null) return baseAttrs;\n const styleParts = [\n \"position:absolute\",\n anchorPos.leftPx !== null ? `left:${anchorPos.leftPx.toFixed(2)}px` : \"\",\n anchorPos.topPx !== null ? `top:${anchorPos.topPx.toFixed(2)}px` : \"\",\n \"z-index:3\"\n ].filter((x) => x.length > 0);\n\n if (wrapMode === \"topAndBottom\") {\n styleParts.push(\"display:block\");\n }\n\n if (!baseAttrs.includes(\"style=\")) {\n const wrapAttr = wrapMode ? ` data-word-wrap=\"${wrapMode}\"` : \"\";\n return `${baseAttrs} style=\"${styleParts.join(\";\")}\" data-word-anchor=\"1\"${wrapAttr}`;\n }\n\n return baseAttrs.replace(/style=\"([^\"]*)\"/, (_m, styleText: string) => {\n const merged = [styleText, ...styleParts].filter((x) => x.length > 0).join(\";\");\n const wrapAttr = wrapMode ? ` data-word-wrap=\"${wrapMode}\"` : \"\";\n return `style=\"${merged}\" data-word-anchor=\"1\"${wrapAttr}`;\n });\n}\n\nfunction parseDocRelsMap(relsXmlText: string | null): RelMap {\n if (!relsXmlText) return {};\n const rels = parseXml(relsXmlText);\n const relationNodes = queryAllByLocalName(rels, \"Relationship\");\n const map: RelMap = {};\n for (const rel of relationNodes) {\n const id = getAttr(rel, \"Id\");\n const target = getAttr(rel, \"Target\");\n if (!id || !target) continue;\n map[id] = target;\n }\n return map;\n}\n\nfunction extToMime(ext: string): string {\n const lower = ext.toLowerCase();\n if (lower === \"png\") return \"image/png\";\n if (lower === \"jpg\" || lower === \"jpeg\") return \"image/jpeg\";\n if (lower === \"gif\") return \"image/gif\";\n if (lower === \"webp\") return \"image/webp\";\n if (lower === \"bmp\") return \"image/bmp\";\n if (lower === \"svg\") return \"image/svg+xml\";\n return \"application/octet-stream\";\n}\n\nasync function imageRidToDataUrl(zip: JSZip, relMap: RelMap, rid: string): Promise<string | null> {\n const relTarget = relMap[rid];\n if (!relTarget) return null;\n const normalized = relTarget.replace(/^\\/+/, \"\");\n const path = normalized.startsWith(\"word/\") ? normalized : `word/${normalized}`;\n const file = zip.file(path);\n if (!file) return null;\n const base64 = await file.async(\"base64\");\n const ext = path.split(\".\").pop() ?? \"bin\";\n const mime = extToMime(ext);\n return `data:${mime};base64,${base64}`;\n}\n\nfunction runStyleToCss(rPr: Element | null): string {\n if (!rPr) return \"\";\n const declarations: string[] = [];\n\n if (queryByLocalName(rPr, \"b\")) declarations.push(\"font-weight:700\");\n if (queryByLocalName(rPr, \"i\")) declarations.push(\"font-style:italic\");\n if (queryByLocalName(rPr, \"u\")) declarations.push(\"text-decoration:underline\");\n if (queryByLocalName(rPr, \"strike\")) declarations.push(\"text-decoration:line-through\");\n\n const color = queryByLocalName(rPr, \"color\");\n const colorVal = getAttr(color, \"w:val\") ?? getAttr(color, \"val\");\n if (colorVal && colorVal.toLowerCase() !== \"auto\") declarations.push(`color:#${colorVal}`);\n\n const highlight = queryByLocalName(rPr, \"highlight\");\n const highlightVal = (getAttr(highlight, \"w:val\") ?? getAttr(highlight, \"val\") ?? \"\").toLowerCase();\n if (highlightVal === \"yellow\") declarations.push(\"background-color:#fff200\");\n\n const vertAlign = queryByLocalName(rPr, \"vertAlign\");\n const vertVal = (getAttr(vertAlign, \"w:val\") ?? getAttr(vertAlign, \"val\") ?? \"\").toLowerCase();\n if (vertVal === \"superscript\") declarations.push(\"vertical-align:super;font-size:0.83em\");\n if (vertVal === \"subscript\") declarations.push(\"vertical-align:sub;font-size:0.83em\");\n\n return declarations.join(\";\");\n}\n\nfunction paragraphTag(paragraph: Element): \"p\" | \"h1\" | \"h2\" | \"h3\" {\n const pPr = queryByLocalName(paragraph, \"pPr\");\n const pStyle = pPr ? queryByLocalName(pPr, \"pStyle\") : null;\n const val = (getAttr(pStyle, \"w:val\") ?? getAttr(pStyle, \"val\") ?? \"\").toLowerCase();\n if (val.includes(\"heading1\") || val === \"1\" || val === \"heading 1\") return \"h1\";\n if (val.includes(\"heading2\") || val === \"2\" || val === \"heading 2\") return \"h2\";\n if (val.includes(\"heading3\") || val === \"3\" || val === \"heading 3\") return \"h3\";\n return \"p\";\n}\n\nfunction paragraphAlignStyle(paragraph: Element): string {\n const pPr = queryByLocalName(paragraph, \"pPr\");\n const jc = pPr ? queryByLocalName(pPr, \"jc\") : null;\n const align = (getAttr(jc, \"w:val\") ?? getAttr(jc, \"val\") ?? \"\").toLowerCase();\n if (align === \"center\" || align === \"right\" || align === \"left\") {\n return `text-align:${align};`;\n }\n return \"\";\n}\n\nfunction paragraphDataAttr(paragraphIndex: number | null): string {\n return paragraphIndex === null ? \"\" : ` data-word-p-index=\"${paragraphIndex}\"`;\n}\n\nfunction parseFootnotesMap(footnotesXmlText: string | null): FootnoteMap {\n if (!footnotesXmlText) return {};\n const footnotesDoc = parseXml(footnotesXmlText);\n const map: FootnoteMap = {};\n const footnotes = queryAllByLocalName(footnotesDoc, \"footnote\");\n for (const footnote of footnotes) {\n const idRaw = getAttr(footnote, \"w:id\") ?? getAttr(footnote, \"id\");\n const idNum = idRaw ? Number.parseInt(idRaw, 10) : Number.NaN;\n if (!Number.isFinite(idNum) || idNum <= 0) continue;\n\n const paragraphs = queryAllByLocalName(footnote, \"p\");\n const text = paragraphs.map((p) => paragraphText(p)).join(\"<br/>\").trim();\n if (!text) continue;\n map[String(idNum)] = text;\n }\n return map;\n}\n\nfunction parseCommentsMap(commentsXmlText: string | null): CommentMap {\n if (!commentsXmlText) return {};\n const commentsDoc = parseXml(commentsXmlText);\n const map: CommentMap = {};\n const comments = queryAllByLocalName(commentsDoc, \"comment\");\n for (const comment of comments) {\n const idRaw = getAttr(comment, \"w:id\") ?? getAttr(comment, \"id\");\n if (!idRaw) continue;\n const paragraphs = queryAllByLocalName(comment, \"p\");\n const text = paragraphs.map((p) => paragraphText(p)).join(\"<br/>\").trim();\n if (!text) continue;\n map[idRaw] = {\n author: getAttr(comment, \"w:author\") ?? getAttr(comment, \"author\"),\n date: getAttr(comment, \"w:date\") ?? getAttr(comment, \"date\"),\n text\n };\n }\n return map;\n}\n\nfunction parseEndnotesMap(endnotesXmlText: string | null): FootnoteMap {\n if (!endnotesXmlText) return {};\n const endnotesDoc = parseXml(endnotesXmlText);\n const map: FootnoteMap = {};\n const endnotes = queryAllByLocalName(endnotesDoc, \"endnote\");\n for (const endnote of endnotes) {\n const idRaw = getAttr(endnote, \"w:id\") ?? getAttr(endnote, \"id\");\n const idNum = idRaw ? Number.parseInt(idRaw, 10) : Number.NaN;\n if (!Number.isFinite(idNum) || idNum <= 0) continue;\n\n const paragraphs = queryAllByLocalName(endnote, \"p\");\n const text = paragraphs.map((p) => paragraphText(p)).join(\"<br/>\").trim();\n if (!text) continue;\n map[String(idNum)] = text;\n }\n return map;\n}\n\nfunction renderFootnotesSection(usedIds: string[], footnotesMap: FootnoteMap): string {\n const uniq = [...new Set(usedIds)].filter((id) => footnotesMap[id]);\n if (uniq.length === 0) return \"\";\n const items = uniq\n .map((id) => `<li id=\"word-footnote-${id}\" data-word-footnote-id=\"${id}\">${footnotesMap[id]}</li>`)\n .join(\"\");\n return `<section data-word-footnotes=\"1\"><hr/><ol>${items}</ol></section>`;\n}\n\nfunction renderCommentsSection(usedIds: string[], commentsMap: CommentMap): string {\n const uniq = [...new Set(usedIds)].filter((id) => commentsMap[id]);\n if (uniq.length === 0) return \"\";\n const items = uniq\n .map((id) => {\n const item = commentsMap[id];\n const meta = [item.author ?? \"\", item.date ?? \"\"].filter((x) => x.length > 0).join(\" · \");\n const metaHtml = meta ? `<div data-word-comment-meta=\"1\">${escapeHtml(meta)}</div>` : \"\";\n return `<li id=\"word-comment-${id}\" data-word-comment-id=\"${id}\">${metaHtml}<div>${item.text}</div></li>`;\n })\n .join(\"\");\n return `<section data-word-comments=\"1\"><hr/><ol>${items}</ol></section>`;\n}\n\nfunction renderEndnotesSection(usedIds: string[], endnotesMap: FootnoteMap): string {\n const uniq = [...new Set(usedIds)].filter((id) => endnotesMap[id]);\n if (uniq.length === 0) return \"\";\n const items = uniq\n .map((id) => `<li id=\"word-endnote-${id}\" data-word-endnote-id=\"${id}\">${endnotesMap[id]}</li>`)\n .join(\"\");\n return `<section data-word-endnotes=\"1\"><hr/><ol>${items}</ol></section>`;\n}\n\nasync function paragraphToHtml(\n zip: JSZip,\n relMap: RelMap,\n paragraph: Element,\n paragraphIndex: number | null,\n footnotesMap: FootnoteMap,\n usedFootnoteIds: string[],\n endnotesMap: FootnoteMap,\n usedEndnoteIds: string[],\n commentsMap: CommentMap,\n usedCommentIds: string[]\n): Promise<string> {\n const tag = paragraphTag(paragraph);\n const alignStyle = paragraphAlignStyle(paragraph);\n const dataAttr = paragraphDataAttr(paragraphIndex);\n const runs = queryAllByLocalName(paragraph, \"r\");\n if (runs.length === 0) {\n return `<${tag}${dataAttr}${alignStyle ? ` style=\"${alignStyle}\"` : \"\"}><br/></${tag}>`;\n }\n\n const parts: string[] = [];\n const renderedPageBreakCount = queryAllByLocalName(paragraph, \"lastRenderedPageBreak\").length;\n for (let i = 0; i < renderedPageBreakCount; i += 1) {\n parts.push(`<span data-word-page-break=\"1\" style=\"display:block;break-before:page\"></span>`);\n }\n for (const run of runs) {\n const rPr = queryByLocalName(run, \"rPr\");\n const css = runStyleToCss(rPr);\n\n const footnoteRef = queryByLocalName(run, \"footnoteReference\");\n const footnoteId = getAttr(footnoteRef, \"w:id\") ?? getAttr(footnoteRef, \"id\");\n if (footnoteId && footnotesMap[footnoteId]) {\n usedFootnoteIds.push(footnoteId);\n parts.push(\n `<sup data-word-footnote-ref=\"${footnoteId}\"><a href=\"#word-footnote-${footnoteId}\">[${footnoteId}]</a></sup>`\n );\n continue;\n }\n\n const endnoteRef = queryByLocalName(run, \"endnoteReference\");\n const endnoteId = getAttr(endnoteRef, \"w:id\") ?? getAttr(endnoteRef, \"id\");\n if (endnoteId && endnotesMap[endnoteId]) {\n usedEndnoteIds.push(endnoteId);\n parts.push(\n `<sup data-word-endnote-ref=\"${endnoteId}\"><a href=\"#word-endnote-${endnoteId}\">[${endnoteId}]</a></sup>`\n );\n continue;\n }\n\n const commentRef = queryByLocalName(run, \"commentReference\");\n const commentId = getAttr(commentRef, \"w:id\") ?? getAttr(commentRef, \"id\");\n if (commentId && commentsMap[commentId]) {\n usedCommentIds.push(commentId);\n parts.push(\n `<sup data-word-comment-ref=\"${commentId}\"><a href=\"#word-comment-${commentId}\">[c${commentId}]</a></sup>`\n );\n continue;\n }\n\n const drawing = queryByLocalName(run, \"drawing\");\n if (drawing) {\n const blip = queryByLocalName(drawing, \"blip\");\n const rid = getAttr(blip, \"r:embed\") ?? getAttr(blip, \"embed\");\n if (rid) {\n const src = await imageRidToDataUrl(zip, relMap, rid);\n if (src) {\n const imageSize = parseDrawingSizePx(drawing);\n const dimensionAttrs = imageDimensionAttributes(imageSize);\n const anchorPos = parseAnchorPositionPx(drawing);\n const wrapMode = parseAnchorWrapMode(drawing);\n const attrs = mergeImageStyle(dimensionAttrs, anchorPos, wrapMode);\n parts.push(`<img src=\"${src}\" alt=\"word-image\"${attrs}/>`);\n continue;\n }\n }\n }\n\n const texts = queryAllByLocalName(run, \"t\").map((t) => t.textContent ?? \"\").join(\"\");\n const delTexts = queryAllByLocalName(run, \"delText\").map((t) => t.textContent ?? \"\").join(\"\");\n const brNodes = queryAllByLocalName(run, \"br\");\n const pageBreakCount = brNodes.filter((node) => {\n const type = (getAttr(node, \"w:type\") ?? getAttr(node, \"type\") ?? \"\").toLowerCase();\n return type === \"page\";\n }).length;\n const lineBreakCount = Math.max(0, brNodes.length - pageBreakCount);\n const runText = `${escapeHtml(texts || delTexts)}${\"<br/>\".repeat(lineBreakCount)}`;\n if (!runText) continue;\n\n let revisionType: \"ins\" | \"del\" | null = null;\n let cursor: Element | null = run;\n while (cursor) {\n if (cursor.localName === \"ins\") {\n revisionType = \"ins\";\n break;\n }\n if (cursor.localName === \"del\") {\n revisionType = \"del\";\n break;\n }\n if (cursor.localName === \"p\") break;\n cursor = cursor.parentElement;\n }\n if (css) {\n const span = `<span style=\"${css}\">${runText}</span>`;\n if (revisionType) {\n const tag = revisionType === \"ins\" ? \"ins\" : \"del\";\n parts.push(`<${tag} data-word-revision=\"${revisionType}\">${span}</${tag}>`);\n } else {\n parts.push(span);\n }\n } else {\n if (revisionType) {\n const tag = revisionType === \"ins\" ? \"ins\" : \"del\";\n parts.push(`<${tag} data-word-revision=\"${revisionType}\">${runText}</${tag}>`);\n } else {\n parts.push(runText);\n }\n }\n\n for (let i = 0; i < pageBreakCount; i += 1) {\n parts.push(`<span data-word-page-break=\"1\" style=\"display:block;break-before:page\"></span>`);\n }\n }\n\n const content = parts.join(\"\") || \"<br/>\";\n return `<${tag}${dataAttr}${alignStyle ? ` style=\"${alignStyle}\"` : \"\"}>${content}</${tag}>`;\n}\n\nfunction runText(run: Element): string {\n const text = queryAllByLocalName(run, \"t\").map((t) => t.textContent ?? \"\").join(\"\");\n const delText = queryAllByLocalName(run, \"delText\").map((t) => t.textContent ?? \"\").join(\"\");\n const brCount = queryAllByLocalName(run, \"br\").length;\n return `${escapeHtml(text || delText)}${\"<br/>\".repeat(brCount)}`;\n}\n\nfunction paragraphText(paragraph: Element): string {\n const runs = queryAllByLocalName(paragraph, \"r\");\n const content = runs.map((run) => runText(run)).join(\"\");\n return content || \"<br/>\";\n}\n\nfunction parseTcGridSpan(tc: Element): number {\n const tcPr = directChildrenByLocalName(tc, \"tcPr\")[0] ?? null;\n const gridSpan = tcPr ? directChildrenByLocalName(tcPr, \"gridSpan\")[0] ?? null : null;\n const rawVal = getAttr(gridSpan, \"w:val\") ?? getAttr(gridSpan, \"val\");\n const parsed = rawVal ? Number.parseInt(rawVal, 10) : Number.NaN;\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 1;\n}\n\nfunction parseTcVMerge(tc: Element): \"none\" | \"restart\" | \"continue\" {\n const tcPr = directChildrenByLocalName(tc, \"tcPr\")[0] ?? null;\n const vMerge = tcPr ? directChildrenByLocalName(tcPr, \"vMerge\")[0] ?? null : null;\n if (!vMerge) return \"none\";\n const rawVal = (getAttr(vMerge, \"w:val\") ?? getAttr(vMerge, \"val\") ?? \"continue\").toLowerCase();\n return rawVal === \"restart\" ? \"restart\" : \"continue\";\n}\n\nfunction tableCellHtml(cell: Element, paragraphIndexMap: Map<Element, number>): string {\n const blocks: string[] = [];\n for (const child of Array.from(cell.children)) {\n if (child.localName === \"tcPr\") continue;\n if (child.localName === \"p\") {\n const paragraphIndex = paragraphIndexMap.get(child) ?? null;\n blocks.push(`<p${paragraphDataAttr(paragraphIndex)}>${paragraphText(child)}</p>`);\n continue;\n }\n if (child.localName === \"tbl\") {\n blocks.push(tableToHtml(child, paragraphIndexMap));\n continue;\n }\n }\n\n if (blocks.length > 0) return blocks.join(\"\");\n const text = queryAllByLocalName(cell, \"t\").map((t) => t.textContent ?? \"\").join(\"\").trim();\n return escapeHtml(text) || \"<br/>\";\n}\n\nfunction tableToHtml(table: Element, paragraphIndexMap: Map<Element, number>): string {\n const rows = directChildrenByLocalName(table, \"tr\");\n\n type MergeOrigin = {\n id: string;\n startCol: number;\n colSpan: number;\n rowSpan: number;\n startedRow: number;\n };\n\n const activeByCol = new Map<number, MergeOrigin>();\n const allOrigins: MergeOrigin[] = [];\n let nextOriginId = 1;\n\n const htmlRows = rows.map((row, rowIndex) => {\n const directCells = directChildrenByLocalName(row, \"tc\");\n const continued = new Set<MergeOrigin>();\n const emittedCells: string[] = [];\n let colCursor = 0;\n\n for (const cell of directCells) {\n const colSpan = parseTcGridSpan(cell);\n const vMerge = parseTcVMerge(cell);\n\n if (vMerge === \"continue\") {\n const activeOrigins = Array.from(new Set(activeByCol.values()))\n .filter((origin) => !continued.has(origin))\n .sort((a, b) => a.startCol - b.startCol);\n const origin =\n activeOrigins.find((item) => item.startCol >= colCursor) ??\n activeOrigins[0] ??\n null;\n if (origin) {\n origin.rowSpan += 1;\n continued.add(origin);\n colCursor = origin.startCol + origin.colSpan;\n }\n continue;\n }\n\n while (activeByCol.has(colCursor)) {\n colCursor += 1;\n }\n\n const html = tableCellHtml(cell, paragraphIndexMap);\n const attrs: string[] = [];\n if (vMerge === \"restart\") {\n const origin: MergeOrigin = {\n id: `m${nextOriginId}`,\n startCol: colCursor,\n colSpan,\n rowSpan: 1,\n startedRow: rowIndex\n };\n nextOriginId += 1;\n allOrigins.push(origin);\n for (let i = 0; i < colSpan; i += 1) {\n activeByCol.set(colCursor + i, origin);\n }\n attrs.push(`data-word-merge-id=\"${origin.id}\"`);\n }\n\n if (colSpan > 1) attrs.push(`colspan=\"${colSpan}\"`);\n emittedCells.push(\n `<td${attrs.length > 0 ? ` ${attrs.join(\" \")}` : \"\"} style=\"border:1px solid #222;vertical-align:top;\">${html}</td>`\n );\n colCursor += colSpan;\n }\n\n for (const origin of Array.from(new Set(activeByCol.values()))) {\n if (origin.startedRow < rowIndex && !continued.has(origin)) {\n for (let i = 0; i < origin.colSpan; i += 1) {\n activeByCol.delete(origin.startCol + i);\n }\n }\n }\n\n return `<tr>${emittedCells.join(\"\")}</tr>`;\n });\n\n let merged = htmlRows.join(\"\");\n for (const origin of allOrigins) {\n const marker = `data-word-merge-id=\"${origin.id}\"`;\n const replacement = origin.rowSpan > 1 ? `rowspan=\"${origin.rowSpan}\"` : \"\";\n merged = merged.replace(marker, replacement).replace(/\\s{2,}/g, \" \");\n }\n\n return `<table style=\"border-collapse:collapse;table-layout:fixed;width:100%;border:1px solid #222;\">${merged}</table>`;\n}\n\nexport async function parseDocxToHtmlSnapshot(file: File): Promise<string> {\n const maybeArrayBuffer = (file as unknown as { arrayBuffer?: () => Promise<ArrayBuffer> }).arrayBuffer;\n const buffer = maybeArrayBuffer ? await maybeArrayBuffer.call(file) : await new Response(file).arrayBuffer();\n const zip = await JSZip.loadAsync(buffer);\n\n const documentXmlText = await zip.file(\"word/document.xml\")?.async(\"string\");\n if (!documentXmlText) {\n throw new Error(\"DOCX missing document.xml\");\n }\n const relsText = await zip.file(\"word/_rels/document.xml.rels\")?.async(\"string\");\n const footnotesText = await zip.file(\"word/footnotes.xml\")?.async(\"string\");\n const endnotesText = await zip.file(\"word/endnotes.xml\")?.async(\"string\");\n const commentsText = await zip.file(\"word/comments.xml\")?.async(\"string\");\n const relMap = parseDocRelsMap(relsText ?? null);\n const footnotesMap = parseFootnotesMap(footnotesText ?? null);\n const endnotesMap = parseEndnotesMap(endnotesText ?? null);\n const commentsMap = parseCommentsMap(commentsText ?? null);\n const usedFootnoteIds: string[] = [];\n const usedEndnoteIds: string[] = [];\n const usedCommentIds: string[] = [];\n const documentXml = parseXml(documentXmlText);\n const body = queryByLocalName(documentXml, \"body\");\n if (!body) {\n throw new Error(\"DOCX missing body\");\n }\n\n const paragraphIndexMap = new Map<Element, number>();\n queryAllByLocalName(documentXml, \"p\").forEach((paragraph, index) => {\n paragraphIndexMap.set(paragraph, index);\n });\n\n const blockHtml: string[] = [];\n for (const child of Array.from(body.children)) {\n if (child.localName === \"sectPr\") continue;\n if (child.localName === \"p\") {\n const paragraphIndex = paragraphIndexMap.get(child) ?? null;\n blockHtml.push(\n await paragraphToHtml(\n zip,\n relMap,\n child,\n paragraphIndex,\n footnotesMap,\n usedFootnoteIds,\n endnotesMap,\n usedEndnoteIds,\n commentsMap,\n usedCommentIds\n )\n );\n continue;\n }\n if (child.localName === \"tbl\") {\n blockHtml.push(tableToHtml(child, paragraphIndexMap));\n continue;\n }\n }\n\n blockHtml.push(renderFootnotesSection(usedFootnoteIds, footnotesMap));\n blockHtml.push(renderEndnotesSection(usedEndnoteIds, endnotesMap));\n blockHtml.push(renderCommentsSection(usedCommentIds, commentsMap));\n return buildHtmlSnapshot(blockHtml.join(\"\\n\"));\n}\n","function escapeAttr(value: string): string {\n return value.replaceAll(\"&\", \"&amp;\").replaceAll('\"', \"&quot;\");\n}\n\nasync function fileToDataUrl(file: File): Promise<string> {\n const buffer = await new Response(file).arrayBuffer();\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (const b of bytes) binary += String.fromCharCode(b);\n const base64 = btoa(binary);\n const mime = file.type || \"application/octet-stream\";\n return `data:${mime};base64,${base64}`;\n}\n\nfunction isUnstableImageSrc(src: string): boolean {\n const normalized = src.trim().toLowerCase();\n return (\n normalized.startsWith(\"file:\") ||\n normalized.startsWith(\"blob:\") ||\n normalized.startsWith(\"cid:\") ||\n normalized.startsWith(\"mhtml:\") ||\n normalized.startsWith(\"ms-appx:\") ||\n normalized.startsWith(\"ms-appdata:\")\n );\n}\n\nasync function replaceUnstableImageSrc(rawHtml: string, imageFiles: File[]): Promise<string> {\n if (!rawHtml.trim() || imageFiles.length === 0) return rawHtml;\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(rawHtml, \"text/html\");\n const images = Array.from(doc.querySelectorAll(\"img\"));\n\n const replacementDataUrls = await Promise.all(imageFiles.map((file) => fileToDataUrl(file)));\n let replacementIndex = 0;\n\n for (const img of images) {\n const src = img.getAttribute(\"src\") ?? \"\";\n if (isUnstableImageSrc(src) && replacementIndex < replacementDataUrls.length) {\n img.setAttribute(\"src\", replacementDataUrls[replacementIndex]);\n replacementIndex += 1;\n }\n }\n\n return doc.body.innerHTML;\n}\n\nasync function buildImageOnlyHtml(imageFiles: File[]): Promise<string> {\n if (imageFiles.length === 0) return \"\";\n const urls = await Promise.all(imageFiles.map((f) => fileToDataUrl(f)));\n return urls.map((url) => `<p><img src=\"${escapeAttr(url)}\" alt=\"clipboard-image\" /></p>`).join(\"\\n\");\n}\n\nexport interface PastePayload {\n html: string;\n text: string;\n imageFiles: File[];\n}\n\nexport async function extractFromClipboardDataTransfer(dataTransfer: DataTransfer): Promise<PastePayload> {\n const html = dataTransfer.getData(\"text/html\") || \"\";\n const text = dataTransfer.getData(\"text/plain\") || \"\";\n\n const imageFiles = Array.from(dataTransfer.items)\n .filter((item) => item.kind === \"file\" && item.type.startsWith(\"image/\"))\n .map((item) => item.getAsFile())\n .filter((file): file is File => file !== null);\n\n const hydratedHtml = await replaceUnstableImageSrc(html, imageFiles);\n const finalHtml = hydratedHtml.trim() ? hydratedHtml : await buildImageOnlyHtml(imageFiles);\n\n return {\n html: finalHtml,\n text,\n imageFiles\n };\n}\n\nexport async function extractFromClipboardItems(items: ClipboardItem[]): Promise<PastePayload> {\n let html = \"\";\n let text = \"\";\n const imageFiles: File[] = [];\n\n for (const item of items) {\n if (item.types.includes(\"text/html\") && !html) {\n const blob = await item.getType(\"text/html\");\n html = await blob.text();\n }\n if (item.types.includes(\"text/plain\") && !text) {\n const blob = await item.getType(\"text/plain\");\n text = await blob.text();\n }\n\n for (const type of item.types) {\n if (!type.startsWith(\"image/\")) continue;\n const blob = await item.getType(type);\n const name = `clipboard-${Date.now()}-${imageFiles.length}.${type.split(\"/\")[1] ?? \"bin\"}`;\n imageFiles.push(new File([blob], name, { type }));\n }\n }\n\n const hydratedHtml = await replaceUnstableImageSrc(html, imageFiles);\n const finalHtml = hydratedHtml.trim() ? hydratedHtml : await buildImageOnlyHtml(imageFiles);\n\n return {\n html: finalHtml,\n text,\n imageFiles\n };\n}\n","export interface WordHtmlCompatOptions {\n forceBodyFontFamily?: string;\n forceHeadingFontFamily?: string;\n}\n\nfunction parseStyle(styleText: string): Map<string, string> {\n const map = new Map<string, string>();\n for (const seg of styleText.split(\";\")) {\n const [rawKey, ...rawValue] = seg.split(\":\");\n const key = rawKey?.trim().toLowerCase();\n const value = rawValue.join(\":\").trim();\n if (!key || !value) continue;\n map.set(key, value);\n }\n return map;\n}\n\nfunction serializeStyle(styleMap: Map<string, string>): string {\n return Array.from(styleMap.entries())\n .map(([k, v]) => `${k}: ${v}`)\n .join(\"; \");\n}\n\nfunction applyMsoMappings(styleMap: Map<string, string>): void {\n const mappingPairs: Array<[string, string]> = [\n [\"mso-ansi-font-size\", \"font-size\"],\n [\"mso-bidi-font-size\", \"font-size\"],\n [\"mso-hansi-font-size\", \"font-size\"],\n [\"mso-margin-top-alt\", \"margin-top\"],\n [\"mso-margin-bottom-alt\", \"margin-bottom\"],\n [\"mso-margin-left-alt\", \"margin-left\"],\n [\"mso-margin-right-alt\", \"margin-right\"],\n [\"mso-line-height-alt\", \"line-height\"]\n ];\n\n for (const [msoKey, cssKey] of mappingPairs) {\n const value = styleMap.get(msoKey);\n if (!value) continue;\n if (!styleMap.has(cssKey)) {\n styleMap.set(cssKey, value);\n }\n }\n\n const msoFore = styleMap.get(\"mso-foreground\");\n if (msoFore && !styleMap.has(\"color\")) {\n styleMap.set(\"color\", msoFore);\n }\n\n if (styleMap.get(\"mso-table-lspace\") && !styleMap.has(\"margin-left\")) {\n styleMap.set(\"margin-left\", \"0\");\n }\n if (styleMap.get(\"mso-table-rspace\") && !styleMap.has(\"margin-right\")) {\n styleMap.set(\"margin-right\", \"0\");\n }\n}\n\nfunction applyListFallback(el: HTMLElement, styleMap: Map<string, string>): void {\n const className = (el.getAttribute(\"class\") ?? \"\").toLowerCase();\n const msoList = styleMap.get(\"mso-list\") ?? \"\";\n const maybeList = className.includes(\"msolist\") || msoList.length > 0;\n if (!maybeList) return;\n\n if (!styleMap.has(\"text-indent\")) {\n styleMap.set(\"text-indent\", \"0\");\n }\n\n const marginLeft = styleMap.get(\"margin-left\");\n if (marginLeft && !styleMap.has(\"padding-left\")) {\n styleMap.set(\"padding-left\", marginLeft);\n }\n}\n\nfunction applyTagSpecificFallback(el: HTMLElement, styleMap: Map<string, string>): void {\n const tag = el.tagName.toLowerCase();\n\n if (tag === \"table\") {\n if (!styleMap.has(\"border-collapse\")) {\n styleMap.set(\"border-collapse\", \"collapse\");\n }\n if (!styleMap.has(\"border-spacing\")) {\n styleMap.set(\"border-spacing\", \"0\");\n }\n }\n\n if ((tag === \"td\" || tag === \"th\") && !styleMap.has(\"vertical-align\")) {\n styleMap.set(\"vertical-align\", \"top\");\n }\n\n if (tag === \"p\" && !styleMap.has(\"min-height\")) {\n styleMap.set(\"min-height\", \"1em\");\n }\n}\n\nfunction normalizeWordEmptyParagraphs(doc: Document): void {\n const paragraphs = Array.from(doc.querySelectorAll(\"p\"));\n for (const p of paragraphs) {\n const text = (p.textContent ?? \"\").replace(/\\u00a0/g, \" \").trim();\n const hasVisibleChildren = p.querySelector(\"img,table,svg,canvas,br\") !== null;\n if (!hasVisibleChildren && text.length === 0) {\n p.innerHTML = \"<br/>\";\n }\n }\n}\n\nfunction applyGlobalDocFixes(doc: Document, options?: WordHtmlCompatOptions): void {\n const body = doc.body;\n if (!body) return;\n\n if (options?.forceBodyFontFamily) {\n body.style.fontFamily = options.forceBodyFontFamily;\n }\n\n if (options?.forceHeadingFontFamily) {\n const headings = Array.from(doc.querySelectorAll(\"h1,h2,h3,h4,h5,h6\"));\n for (const heading of headings) {\n (heading as HTMLElement).style.fontFamily = options.forceHeadingFontFamily;\n }\n }\n}\n\nexport function applyWordHtmlCompatibility(doc: Document, options?: WordHtmlCompatOptions): void {\n const elements = Array.from(doc.querySelectorAll(\"[style], p, table, td, th, li, div, span\"));\n\n for (const el of elements) {\n const htmlEl = el as HTMLElement;\n const rawStyle = htmlEl.getAttribute(\"style\") ?? \"\";\n const styleMap = parseStyle(rawStyle);\n\n applyMsoMappings(styleMap);\n applyListFallback(htmlEl, styleMap);\n applyTagSpecificFallback(htmlEl, styleMap);\n\n if (styleMap.size > 0) {\n htmlEl.setAttribute(\"style\", serializeStyle(styleMap));\n }\n }\n\n normalizeWordEmptyParagraphs(doc);\n applyGlobalDocFixes(doc, options);\n}\n","import JSZip from \"jszip\";\n\nexport interface WordStyleProfile {\n sourceFileName: string;\n bodyFontPx: number;\n bodyLineHeightRatio: number;\n bodyLineHeightPx: number | null;\n bodyLineHeightRule: \"auto\" | \"exact\" | \"atLeast\";\n paragraphAfterPx: number;\n contentWidthPx: number;\n pageHeightPx: number;\n pageMarginTopPx: number;\n pageMarginBottomPx: number;\n titleFontPx: number;\n titleColor: string;\n titleAlign: \"left\" | \"center\" | \"right\";\n bodyFontFamily: string;\n titleFontFamily: string;\n discoveredFonts: string[];\n tableCellPaddingTopPx: number;\n tableCellPaddingLeftPx: number;\n tableCellPaddingBottomPx: number;\n tableCellPaddingRightPx: number;\n paragraphProfiles: ParagraphStyleProfile[];\n trailingDateText: string | null;\n trailingDateAlignedRight: boolean;\n trailingDateParagraphIndex: number | null;\n trailingEmptyParagraphCountBeforeDate: number;\n}\n\nexport interface ParagraphStyleProfile {\n index: number;\n text: string;\n isEmpty: boolean;\n align: \"left\" | \"center\" | \"right\";\n beforePx: number | null;\n afterPx: number | null;\n lineHeightRatio: number | null;\n lineHeightPx: number | null;\n lineHeightRule: \"auto\" | \"exact\" | \"atLeast\" | null;\n indentLeftPx: number | null;\n indentRightPx: number | null;\n firstLinePx: number | null;\n hangingPx: number | null;\n listNumId: number | null;\n listLevel: number | null;\n listFormat: string | null;\n listTextPattern: string | null;\n listStartAt: number;\n keepNext: boolean;\n keepLines: boolean;\n pageBreakBefore: boolean;\n sectionBreakBefore: boolean;\n runs: RunStyleProfile[];\n}\n\nexport interface RunStyleProfile {\n text: string;\n fontSizePx: number | null;\n color: string | null;\n highlightColor: string | null;\n shadingColor: string | null;\n charSpacingPx: number | null;\n shadow: boolean;\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strike: boolean;\n superscript: boolean;\n subscript: boolean;\n fontFamily: string | null;\n}\n\nconst FALLBACK_PROFILE: Omit<WordStyleProfile, \"sourceFileName\"> = {\n bodyFontPx: 14.6667,\n bodyLineHeightRatio: 1.158333,\n bodyLineHeightPx: null,\n bodyLineHeightRule: \"auto\",\n paragraphAfterPx: 10.67,\n contentWidthPx: 553.73,\n pageHeightPx: 1122.53,\n pageMarginTopPx: 96,\n pageMarginBottomPx: 96,\n titleFontPx: 32,\n titleColor: \"#0F4761\",\n titleAlign: \"center\",\n bodyFontFamily: \"\\\"Times New Roman\\\", \\\"Noto Serif SC\\\", serif\",\n titleFontFamily: \"DengXian, \\\"Noto Sans SC\\\", \\\"Microsoft YaHei\\\", sans-serif\",\n discoveredFonts: [],\n tableCellPaddingTopPx: 0,\n tableCellPaddingLeftPx: 7.2,\n tableCellPaddingBottomPx: 0,\n tableCellPaddingRightPx: 7.2,\n paragraphProfiles: [],\n trailingDateText: null,\n trailingDateAlignedRight: false,\n trailingDateParagraphIndex: null,\n trailingEmptyParagraphCountBeforeDate: 0\n};\n\nexport function createFallbackWordStyleProfile(sourceFileName = \"snapshot\"): WordStyleProfile {\n return {\n sourceFileName,\n ...FALLBACK_PROFILE,\n paragraphProfiles: []\n };\n}\n\nfunction twipToPx(twip: number): number {\n return twip / 15;\n}\n\nfunction getAttr(node: Element | null, attr: string): string | null {\n if (!node) return null;\n return node.getAttribute(attr);\n}\n\nfunction getTwipAttr(node: Element | null, attr: string): number | null {\n const raw = getAttr(node, attr);\n if (!raw) return null;\n const parsed = Number.parseFloat(raw);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction queryByLocalName(root: ParentNode, localName: string): Element | null {\n const all = Array.from(root.querySelectorAll(\"*\"));\n return all.find((el) => el.localName === localName) ?? null;\n}\n\nfunction queryAllByLocalName(root: ParentNode, localName: string): Element[] {\n const all = Array.from(root.querySelectorAll(\"*\"));\n return all.filter((el) => el.localName === localName);\n}\n\nfunction parseXml(xmlText: string): Document {\n const parser = new DOMParser();\n return parser.parseFromString(xmlText, \"application/xml\");\n}\n\nfunction parsePageGeometry(documentXml: Document): {\n contentWidthPx: number | null;\n pageHeightPx: number | null;\n marginTopPx: number | null;\n marginBottomPx: number | null;\n} {\n const sectPr = queryByLocalName(documentXml, \"sectPr\");\n if (!sectPr) {\n return {\n contentWidthPx: null,\n pageHeightPx: null,\n marginTopPx: null,\n marginBottomPx: null\n };\n }\n\n const pgSz = queryAllByLocalName(sectPr, \"pgSz\")[0] ?? null;\n const pgMar = queryAllByLocalName(sectPr, \"pgMar\")[0] ?? null;\n const pageW = getTwipAttr(pgSz, \"w:w\") ?? getTwipAttr(pgSz, \"w\") ?? null;\n const pageH = getTwipAttr(pgSz, \"w:h\") ?? getTwipAttr(pgSz, \"h\") ?? null;\n const left = getTwipAttr(pgMar, \"w:left\") ?? getTwipAttr(pgMar, \"left\") ?? 0;\n const right = getTwipAttr(pgMar, \"w:right\") ?? getTwipAttr(pgMar, \"right\") ?? 0;\n const top = getTwipAttr(pgMar, \"w:top\") ?? getTwipAttr(pgMar, \"top\") ?? null;\n const bottom = getTwipAttr(pgMar, \"w:bottom\") ?? getTwipAttr(pgMar, \"bottom\") ?? null;\n\n return {\n contentWidthPx: pageW === null ? null : twipToPx(pageW - left - right),\n pageHeightPx: pageH === null ? null : twipToPx(pageH),\n marginTopPx: top === null ? null : twipToPx(top),\n marginBottomPx: bottom === null ? null : twipToPx(bottom)\n };\n}\n\nfunction parseHeadingAlignFromDocument(documentXml: Document): \"left\" | \"center\" | \"right\" | null {\n const paragraphs = queryAllByLocalName(documentXml, \"p\");\n for (const paragraph of paragraphs) {\n const pPr = queryAllByLocalName(paragraph, \"pPr\")[0] ?? null;\n if (!pPr) continue;\n\n const pStyle = queryAllByLocalName(pPr, \"pStyle\")[0] ?? null;\n const styleVal = getAttr(pStyle, \"w:val\") ?? getAttr(pStyle, \"val\") ?? \"\";\n const isHeading = styleVal === \"1\" || styleVal.toLowerCase().includes(\"heading\");\n if (!isHeading) continue;\n\n const jc = queryAllByLocalName(pPr, \"jc\")[0] ?? null;\n const alignRaw = (getAttr(jc, \"w:val\") ?? getAttr(jc, \"val\") ?? \"\").toLowerCase();\n if (alignRaw === \"center\") return \"center\";\n if (alignRaw === \"right\") return \"right\";\n return \"left\";\n }\n\n return null;\n}\n\nfunction parseParagraphText(paragraph: Element): string {\n const textNodes = queryAllByLocalName(paragraph, \"t\");\n return textNodes.map((node) => node.textContent ?? \"\").join(\"\").trim();\n}\n\nfunction parseParagraphAlign(paragraph: Element): \"left\" | \"center\" | \"right\" {\n const pPr = queryAllByLocalName(paragraph, \"pPr\")[0] ?? null;\n const jc = pPr ? queryAllByLocalName(pPr, \"jc\")[0] ?? null : null;\n const alignRaw = (getAttr(jc, \"w:val\") ?? getAttr(jc, \"val\") ?? \"\").toLowerCase();\n if (alignRaw === \"center\") return \"center\";\n if (alignRaw === \"right\") return \"right\";\n return \"left\";\n}\n\nfunction parseTrailingDateAnchor(documentXml: Document): {\n trailingDateText: string | null;\n trailingDateAlignedRight: boolean;\n trailingDateParagraphIndex: number | null;\n trailingEmptyParagraphCountBeforeDate: number;\n} {\n const paragraphs = queryAllByLocalName(documentXml, \"p\");\n if (paragraphs.length === 0) {\n return {\n trailingDateText: null,\n trailingDateAlignedRight: false,\n trailingDateParagraphIndex: null,\n trailingEmptyParagraphCountBeforeDate: 0\n };\n }\n\n let lastNonEmptyIndex = -1;\n for (let i = paragraphs.length - 1; i >= 0; i -= 1) {\n if (parseParagraphText(paragraphs[i]).length > 0) {\n lastNonEmptyIndex = i;\n break;\n }\n }\n\n if (lastNonEmptyIndex < 0) {\n return {\n trailingDateText: null,\n trailingDateAlignedRight: false,\n trailingDateParagraphIndex: null,\n trailingEmptyParagraphCountBeforeDate: 0\n };\n }\n\n const dateParagraph = paragraphs[lastNonEmptyIndex];\n const dateText = parseParagraphText(dateParagraph);\n const looksLikeDate = /\\d{4}\\s*年\\s*\\d+\\s*月\\s*\\d+\\s*日/.test(dateText);\n const align = parseParagraphAlign(dateParagraph);\n\n let trailingEmpty = 0;\n for (let i = lastNonEmptyIndex - 1; i >= 0; i -= 1) {\n if (parseParagraphText(paragraphs[i]).length === 0) {\n trailingEmpty += 1;\n continue;\n }\n break;\n }\n\n return {\n trailingDateText: looksLikeDate ? dateText : null,\n trailingDateAlignedRight: looksLikeDate && align === \"right\",\n trailingDateParagraphIndex: looksLikeDate ? lastNonEmptyIndex : null,\n trailingEmptyParagraphCountBeforeDate: looksLikeDate ? trailingEmpty : 0\n };\n}\n\ntype NumberingLevelSpec = {\n numFmt: string | null;\n lvlText: string | null;\n startAt: number;\n};\n\nfunction toInt(value: string | null): number | null {\n if (!value) return null;\n const n = Number.parseInt(value, 10);\n return Number.isFinite(n) ? n : null;\n}\n\nfunction parseNumberingMap(numberingXml: Document | null): Map<string, NumberingLevelSpec> {\n const levelMap = new Map<string, NumberingLevelSpec>();\n if (!numberingXml) return levelMap;\n\n const abstractMap = new Map<number, Map<number, NumberingLevelSpec>>();\n const abstractNums = queryAllByLocalName(numberingXml, \"abstractNum\");\n for (const abs of abstractNums) {\n const absId = toInt(getAttr(abs, \"w:abstractNumId\") ?? getAttr(abs, \"abstractNumId\"));\n if (absId === null) continue;\n\n const lvlNodes = queryAllByLocalName(abs, \"lvl\");\n const lvlMap = new Map<number, NumberingLevelSpec>();\n for (const lvl of lvlNodes) {\n const ilvl = toInt(getAttr(lvl, \"w:ilvl\") ?? getAttr(lvl, \"ilvl\"));\n if (ilvl === null) continue;\n const numFmtNode = queryAllByLocalName(lvl, \"numFmt\")[0] ?? null;\n const lvlTextNode = queryAllByLocalName(lvl, \"lvlText\")[0] ?? null;\n lvlMap.set(ilvl, {\n numFmt: getAttr(numFmtNode, \"w:val\") ?? getAttr(numFmtNode, \"val\") ?? null,\n lvlText: getAttr(lvlTextNode, \"w:val\") ?? getAttr(lvlTextNode, \"val\") ?? null,\n startAt: toInt(getAttr(queryAllByLocalName(lvl, \"start\")[0] ?? null, \"w:val\") ?? getAttr(queryAllByLocalName(lvl, \"start\")[0] ?? null, \"val\")) ?? 1\n });\n }\n abstractMap.set(absId, lvlMap);\n }\n\n const nums = queryAllByLocalName(numberingXml, \"num\");\n for (const num of nums) {\n const numId = toInt(getAttr(num, \"w:numId\") ?? getAttr(num, \"numId\"));\n if (numId === null) continue;\n const abstractRefNode = queryAllByLocalName(num, \"abstractNumId\")[0] ?? null;\n const absId = toInt(getAttr(abstractRefNode, \"w:val\") ?? getAttr(abstractRefNode, \"val\"));\n if (absId === null) continue;\n const lvlMap = abstractMap.get(absId);\n if (!lvlMap) continue;\n for (const [lvl, spec] of lvlMap.entries()) {\n levelMap.set(`${numId}:${lvl}`, { ...spec });\n }\n\n const lvlOverrides = queryAllByLocalName(num, \"lvlOverride\");\n for (const override of lvlOverrides) {\n const ilvl = toInt(getAttr(override, \"w:ilvl\") ?? getAttr(override, \"ilvl\"));\n if (ilvl === null) continue;\n const key = `${numId}:${ilvl}`;\n const base = levelMap.get(key) ?? { numFmt: null, lvlText: null, startAt: 1 };\n\n const overrideStart = toInt(\n getAttr(queryAllByLocalName(override, \"startOverride\")[0] ?? null, \"w:val\") ??\n getAttr(queryAllByLocalName(override, \"startOverride\")[0] ?? null, \"val\")\n );\n\n const overrideLvl = queryAllByLocalName(override, \"lvl\")[0] ?? null;\n const overrideNumFmtNode = overrideLvl ? queryAllByLocalName(overrideLvl, \"numFmt\")[0] ?? null : null;\n const overrideLvlTextNode = overrideLvl ? queryAllByLocalName(overrideLvl, \"lvlText\")[0] ?? null : null;\n const overrideLvlStart = toInt(\n getAttr(queryAllByLocalName(overrideLvl ?? override, \"start\")[0] ?? null, \"w:val\") ??\n getAttr(queryAllByLocalName(overrideLvl ?? override, \"start\")[0] ?? null, \"val\")\n );\n\n levelMap.set(key, {\n numFmt: getAttr(overrideNumFmtNode, \"w:val\") ?? getAttr(overrideNumFmtNode, \"val\") ?? base.numFmt,\n lvlText: getAttr(overrideLvlTextNode, \"w:val\") ?? getAttr(overrideLvlTextNode, \"val\") ?? base.lvlText,\n startAt: overrideStart ?? overrideLvlStart ?? base.startAt\n });\n }\n }\n\n return levelMap;\n}\n\nfunction parseParagraphProfiles(documentXml: Document, numberingMap: Map<string, NumberingLevelSpec>): ParagraphStyleProfile[] {\n const paragraphs = queryAllByLocalName(documentXml, \"p\");\n return paragraphs.map((paragraph, index) => {\n const text = parseParagraphText(paragraph);\n const pPr = queryAllByLocalName(paragraph, \"pPr\")[0] ?? null;\n const spacing = pPr ? queryAllByLocalName(pPr, \"spacing\")[0] ?? null : null;\n const ind = pPr ? queryAllByLocalName(pPr, \"ind\")[0] ?? null : null;\n const numPr = pPr ? queryAllByLocalName(pPr, \"numPr\")[0] ?? null : null;\n const ilvlNode = numPr ? queryAllByLocalName(numPr, \"ilvl\")[0] ?? null : null;\n const numIdNode = numPr ? queryAllByLocalName(numPr, \"numId\")[0] ?? null : null;\n const listLevel = toInt(getAttr(ilvlNode, \"w:val\") ?? getAttr(ilvlNode, \"val\"));\n const listNumId = toInt(getAttr(numIdNode, \"w:val\") ?? getAttr(numIdNode, \"val\"));\n const listSpec = listNumId !== null && listLevel !== null ? numberingMap.get(`${listNumId}:${listLevel}`) : undefined;\n const keepNextNode = pPr ? queryAllByLocalName(pPr, \"keepNext\")[0] ?? null : null;\n const keepLinesNode = pPr ? queryAllByLocalName(pPr, \"keepLines\")[0] ?? null : null;\n const pageBreakBeforeNode = pPr ? queryAllByLocalName(pPr, \"pageBreakBefore\")[0] ?? null : null;\n const renderedPageBreakNode = queryAllByLocalName(paragraph, \"lastRenderedPageBreak\")[0] ?? null;\n const sectionBreakNode = pPr ? queryAllByLocalName(pPr, \"sectPr\")[0] ?? null : null;\n\n const before = getTwipAttr(spacing, \"w:before\") ?? getTwipAttr(spacing, \"before\") ?? null;\n const after = getTwipAttr(spacing, \"w:after\") ?? getTwipAttr(spacing, \"after\") ?? null;\n const line = getTwipAttr(spacing, \"w:line\") ?? getTwipAttr(spacing, \"line\") ?? null;\n const rawLineRule = (getAttr(spacing, \"w:lineRule\") ?? getAttr(spacing, \"lineRule\") ?? \"auto\").toLowerCase();\n const lineHeightRule: \"auto\" | \"exact\" | \"atLeast\" | null =\n line === null ? null : rawLineRule === \"exact\" ? \"exact\" : rawLineRule === \"atleast\" ? \"atLeast\" : \"auto\";\n\n const left = getTwipAttr(ind, \"w:left\") ?? getTwipAttr(ind, \"left\") ?? null;\n const right = getTwipAttr(ind, \"w:right\") ?? getTwipAttr(ind, \"right\") ?? null;\n const firstLine = getTwipAttr(ind, \"w:firstLine\") ?? getTwipAttr(ind, \"firstLine\") ?? null;\n const hanging = getTwipAttr(ind, \"w:hanging\") ?? getTwipAttr(ind, \"hanging\") ?? null;\n const runs = parseRunProfiles(paragraph);\n\n return {\n index,\n text,\n isEmpty: text.length === 0,\n align: parseParagraphAlign(paragraph),\n beforePx: before === null ? null : twipToPx(before),\n afterPx: after === null ? null : twipToPx(after),\n lineHeightRatio: line === null || lineHeightRule !== \"auto\" ? null : line / 240,\n lineHeightPx: line === null || lineHeightRule === \"auto\" ? null : twipToPx(line),\n lineHeightRule,\n indentLeftPx: left === null ? null : twipToPx(left),\n indentRightPx: right === null ? null : twipToPx(right),\n firstLinePx: firstLine === null ? null : twipToPx(firstLine),\n hangingPx: hanging === null ? null : twipToPx(hanging),\n listNumId,\n listLevel,\n listFormat: listSpec?.numFmt ?? null,\n listTextPattern: listSpec?.lvlText ?? null,\n listStartAt: listSpec?.startAt ?? 1,\n keepNext: keepNextNode !== null && (getAttr(keepNextNode, \"w:val\") ?? getAttr(keepNextNode, \"val\") ?? \"1\") !== \"0\",\n keepLines: keepLinesNode !== null && (getAttr(keepLinesNode, \"w:val\") ?? getAttr(keepLinesNode, \"val\") ?? \"1\") !== \"0\",\n pageBreakBefore:\n renderedPageBreakNode !== null ||\n (pageBreakBeforeNode !== null &&\n (getAttr(pageBreakBeforeNode, \"w:val\") ?? getAttr(pageBreakBeforeNode, \"val\") ?? \"1\") !== \"0\"),\n sectionBreakBefore: sectionBreakNode !== null,\n runs\n };\n });\n}\n\nfunction parseTableDefaults(stylesXml: Document): {\n topPx: number | null;\n leftPx: number | null;\n bottomPx: number | null;\n rightPx: number | null;\n} {\n const tableStyles = queryAllByLocalName(stylesXml, \"style\").filter((style) => {\n const type = (getAttr(style, \"w:type\") ?? getAttr(style, \"type\") ?? \"\").toLowerCase();\n return type === \"table\";\n });\n\n const targetStyle =\n tableStyles.find((style) => {\n const styleId = (getAttr(style, \"w:styleId\") ?? getAttr(style, \"styleId\") ?? \"\").toLowerCase();\n return styleId === \"a1\";\n }) ?? tableStyles[0] ?? null;\n\n if (!targetStyle) {\n return { topPx: null, leftPx: null, bottomPx: null, rightPx: null };\n }\n\n const tblPr = queryAllByLocalName(targetStyle, \"tblPr\")[0] ?? null;\n const tblCellMar = tblPr ? queryAllByLocalName(tblPr, \"tblCellMar\")[0] ?? null : null;\n const top = tblCellMar ? queryAllByLocalName(tblCellMar, \"top\")[0] ?? null : null;\n const left = tblCellMar ? queryAllByLocalName(tblCellMar, \"left\")[0] ?? null : null;\n const bottom = tblCellMar ? queryAllByLocalName(tblCellMar, \"bottom\")[0] ?? null : null;\n const right = tblCellMar ? queryAllByLocalName(tblCellMar, \"right\")[0] ?? null : null;\n\n return {\n topPx: (() => {\n const v = getTwipAttr(top, \"w:w\") ?? getTwipAttr(top, \"w\") ?? null;\n return v === null ? null : twipToPx(v);\n })(),\n leftPx: (() => {\n const v = getTwipAttr(left, \"w:w\") ?? getTwipAttr(left, \"w\") ?? null;\n return v === null ? null : twipToPx(v);\n })(),\n bottomPx: (() => {\n const v = getTwipAttr(bottom, \"w:w\") ?? getTwipAttr(bottom, \"w\") ?? null;\n return v === null ? null : twipToPx(v);\n })(),\n rightPx: (() => {\n const v = getTwipAttr(right, \"w:w\") ?? getTwipAttr(right, \"w\") ?? null;\n return v === null ? null : twipToPx(v);\n })()\n };\n}\n\nfunction parseRunProfiles(paragraph: Element): RunStyleProfile[] {\n const runNodes = queryAllByLocalName(paragraph, \"r\");\n return runNodes\n .map((run) => {\n const rPr = queryAllByLocalName(run, \"rPr\")[0] ?? null;\n const textNodes = queryAllByLocalName(run, \"t\");\n const breakNodes = queryAllByLocalName(run, \"br\");\n\n let text = textNodes.map((node) => node.textContent ?? \"\").join(\"\");\n if (breakNodes.length > 0) {\n text += \"\\n\".repeat(breakNodes.length);\n }\n\n if (!text) {\n return null;\n }\n\n const sz = rPr ? queryAllByLocalName(rPr, \"sz\")[0] ?? null : null;\n const halfPoints = getTwipAttr(sz, \"w:val\") ?? getTwipAttr(sz, \"val\") ?? null;\n const fontSizePx = halfPoints === null ? null : (halfPoints / 2) * (96 / 72);\n\n const colorNode = rPr ? queryAllByLocalName(rPr, \"color\")[0] ?? null : null;\n const colorRaw = getAttr(colorNode, \"w:val\") ?? getAttr(colorNode, \"val\") ?? null;\n const color = colorRaw && colorRaw.toLowerCase() !== \"auto\" ? `#${colorRaw}` : null;\n const highlightNode = rPr ? queryAllByLocalName(rPr, \"highlight\")[0] ?? null : null;\n const highlightRaw = (getAttr(highlightNode, \"w:val\") ?? getAttr(highlightNode, \"val\") ?? \"\").toLowerCase();\n const highlightMap: Record<string, string> = {\n yellow: \"#fff59d\",\n green: \"#b9f6ca\",\n cyan: \"#b2ebf2\",\n magenta: \"#f8bbd0\",\n blue: \"#bbdefb\",\n red: \"#ffcdd2\",\n darkyellow: \"#fbc02d\",\n darkgreen: \"#66bb6a\",\n darkblue: \"#64b5f6\",\n darkred: \"#e57373\",\n darkcyan: \"#4dd0e1\",\n darkmagenta: \"#ba68c8\",\n gray: \"#e0e0e0\",\n lightgray: \"#f5f5f5\"\n };\n const highlightColor = highlightRaw && highlightRaw !== \"none\" ? highlightMap[highlightRaw] ?? null : null;\n const shdNode = rPr ? queryAllByLocalName(rPr, \"shd\")[0] ?? null : null;\n const shdFill = (getAttr(shdNode, \"w:fill\") ?? getAttr(shdNode, \"fill\") ?? \"\").toLowerCase();\n const shadingColor = shdFill && shdFill !== \"auto\" ? `#${shdFill}` : null;\n const spacingNode = rPr ? queryAllByLocalName(rPr, \"spacing\")[0] ?? null : null;\n const spacingVal = getTwipAttr(spacingNode, \"w:val\") ?? getTwipAttr(spacingNode, \"val\") ?? null;\n const charSpacingPx = spacingVal === null ? null : (spacingVal / 20) * (96 / 72);\n\n const bNode = rPr ? queryAllByLocalName(rPr, \"b\")[0] ?? null : null;\n const iNode = rPr ? queryAllByLocalName(rPr, \"i\")[0] ?? null : null;\n const uNode = rPr ? queryAllByLocalName(rPr, \"u\")[0] ?? null : null;\n const strikeNode = rPr ? queryAllByLocalName(rPr, \"strike\")[0] ?? null : null;\n const shadowNode = rPr ? queryAllByLocalName(rPr, \"shadow\")[0] ?? null : null;\n const vertAlignNode = rPr ? queryAllByLocalName(rPr, \"vertAlign\")[0] ?? null : null;\n\n const bold = bNode !== null && (getAttr(bNode, \"w:val\") ?? getAttr(bNode, \"val\") ?? \"1\") !== \"0\";\n const italic = iNode !== null && (getAttr(iNode, \"w:val\") ?? getAttr(iNode, \"val\") ?? \"1\") !== \"0\";\n const underlineVal = (getAttr(uNode, \"w:val\") ?? getAttr(uNode, \"val\") ?? \"\").toLowerCase();\n const underline = uNode !== null && underlineVal !== \"none\";\n const strike = strikeNode !== null && (getAttr(strikeNode, \"w:val\") ?? getAttr(strikeNode, \"val\") ?? \"1\") !== \"0\";\n const shadow = shadowNode !== null && (getAttr(shadowNode, \"w:val\") ?? getAttr(shadowNode, \"val\") ?? \"1\") !== \"0\";\n const vertAlign = (getAttr(vertAlignNode, \"w:val\") ?? getAttr(vertAlignNode, \"val\") ?? \"\").toLowerCase();\n const superscript = vertAlign === \"superscript\";\n const subscript = vertAlign === \"subscript\";\n\n const rFonts = rPr ? queryAllByLocalName(rPr, \"rFonts\")[0] ?? null : null;\n const fontFamily =\n getAttr(rFonts, \"w:eastAsia\") ??\n getAttr(rFonts, \"eastAsia\") ??\n getAttr(rFonts, \"w:ascii\") ??\n getAttr(rFonts, \"ascii\") ??\n getAttr(rFonts, \"w:hAnsi\") ??\n getAttr(rFonts, \"hAnsi\") ??\n null;\n\n return {\n text,\n fontSizePx,\n color,\n highlightColor,\n shadingColor,\n charSpacingPx,\n shadow,\n bold,\n italic,\n underline,\n strike,\n superscript,\n subscript,\n fontFamily\n } satisfies RunStyleProfile;\n })\n .filter((run): run is RunStyleProfile => run !== null);\n}\n\nfunction parseDefaults(stylesXml: Document): {\n bodyFontPx: number | null;\n bodyLineHeightRatio: number | null;\n bodyLineHeightPx: number | null;\n bodyLineHeightRule: \"auto\" | \"exact\" | \"atLeast\";\n paragraphAfterPx: number | null;\n} {\n const docDefaults = queryByLocalName(stylesXml, \"docDefaults\");\n if (!docDefaults) {\n return { bodyFontPx: null, bodyLineHeightRatio: null, bodyLineHeightPx: null, bodyLineHeightRule: \"auto\", paragraphAfterPx: null };\n }\n\n const rPrDefault = queryByLocalName(docDefaults, \"rPrDefault\");\n const sz = rPrDefault ? queryByLocalName(rPrDefault, \"sz\") : null;\n const halfPoints = getTwipAttr(sz, \"w:val\") ?? getTwipAttr(sz, \"val\") ?? null;\n const bodyFontPx = halfPoints === null ? null : (halfPoints / 2) * (96 / 72);\n\n const pPrDefault = queryByLocalName(docDefaults, \"pPrDefault\");\n const spacing = pPrDefault ? queryByLocalName(pPrDefault, \"spacing\") : null;\n\n const line = getTwipAttr(spacing, \"w:line\") ?? getTwipAttr(spacing, \"line\") ?? null;\n const rawLineRule = (getAttr(spacing, \"w:lineRule\") ?? getAttr(spacing, \"lineRule\") ?? \"auto\").toLowerCase();\n const bodyLineHeightRule: \"auto\" | \"exact\" | \"atLeast\" =\n rawLineRule === \"exact\" ? \"exact\" : rawLineRule === \"atleast\" ? \"atLeast\" : \"auto\";\n const bodyLineHeightRatio = line === null || bodyLineHeightRule !== \"auto\" ? null : line / 240;\n const bodyLineHeightPx = line === null || bodyLineHeightRule === \"auto\" ? null : twipToPx(line);\n\n const after = getTwipAttr(spacing, \"w:after\") ?? getTwipAttr(spacing, \"after\") ?? null;\n const paragraphAfterPx = after === null ? null : twipToPx(after);\n\n return { bodyFontPx, bodyLineHeightRatio, bodyLineHeightPx, bodyLineHeightRule, paragraphAfterPx };\n}\n\nfunction parseHeading1Style(stylesXml: Document): {\n titleFontPx: number | null;\n titleColor: string | null;\n} {\n const styles = queryAllByLocalName(stylesXml, \"style\");\n const headingStyle = styles.find((style) => {\n const styleId = (getAttr(style, \"w:styleId\") ?? getAttr(style, \"styleId\") ?? \"\").toLowerCase();\n const nameNode = queryByLocalName(style, \"name\");\n const nameVal = (getAttr(nameNode, \"w:val\") ?? getAttr(nameNode, \"val\") ?? \"\").toLowerCase();\n return styleId === \"1\" || nameVal === \"heading 1\" || nameVal === \"标题 1\";\n });\n\n if (!headingStyle) {\n return { titleFontPx: null, titleColor: null };\n }\n\n const rPr = queryByLocalName(headingStyle, \"rPr\");\n const sz = rPr ? queryByLocalName(rPr, \"sz\") : null;\n const halfPoints = getTwipAttr(sz, \"w:val\") ?? getTwipAttr(sz, \"val\") ?? null;\n const titleFontPx = halfPoints === null ? null : (halfPoints / 2) * (96 / 72);\n\n const colorNode = rPr ? queryByLocalName(rPr, \"color\") : null;\n const colorRaw = getAttr(colorNode, \"w:val\") ?? getAttr(colorNode, \"val\") ?? null;\n const titleColor = colorRaw ? `#${colorRaw}` : null;\n\n return { titleFontPx, titleColor };\n}\n\nfunction parseFontTableFamilies(fontTableXml: Document | null): string[] {\n if (!fontTableXml) return [];\n const fontNodes = queryAllByLocalName(fontTableXml, \"font\");\n const families = fontNodes\n .map((node) => getAttr(node, \"w:name\") ?? getAttr(node, \"name\") ?? \"\")\n .map((name) => name.trim())\n .filter((name) => name.length > 0);\n return [...new Set(families)];\n}\n\nfunction hasFontLike(families: string[], candidates: string[]): boolean {\n return families.some((family) =>\n candidates.some((candidate) => family.toLowerCase().includes(candidate.toLowerCase()))\n );\n}\n\nfunction inferBodyFontFamily(families: string[]): string {\n if (hasFontLike(families, [\"times new roman\"])) {\n return \"\\\"Times New Roman\\\", \\\"Noto Serif SC\\\", serif\";\n }\n if (hasFontLike(families, [\"dengxian\", \"等线\", \"yahei\", \"hei\", \"song\"])) {\n return \"DengXian, \\\"Microsoft YaHei\\\", \\\"PingFang SC\\\", \\\"Noto Sans SC\\\", sans-serif\";\n }\n return FALLBACK_PROFILE.bodyFontFamily;\n}\n\nfunction inferTitleFontFamily(families: string[]): string {\n if (hasFontLike(families, [\"dengxian\", \"等线\"])) {\n return \"DengXian, \\\"Noto Sans SC\\\", \\\"Microsoft YaHei\\\", sans-serif\";\n }\n if (hasFontLike(families, [\"times new roman\"])) {\n return \"\\\"Times New Roman\\\", \\\"Noto Serif SC\\\", serif\";\n }\n return FALLBACK_PROFILE.titleFontFamily;\n}\n\nexport async function parseDocxStyleProfile(file: File): Promise<WordStyleProfile> {\n const maybeArrayBuffer = (file as unknown as { arrayBuffer?: () => Promise<ArrayBuffer> }).arrayBuffer;\n const buffer = maybeArrayBuffer ? await maybeArrayBuffer.call(file) : await new Response(file).arrayBuffer();\n const zip = await JSZip.loadAsync(buffer);\n\n const documentXmlText = await zip.file(\"word/document.xml\")?.async(\"string\");\n const stylesXmlText = await zip.file(\"word/styles.xml\")?.async(\"string\");\n const fontTableXmlText = await zip.file(\"word/fontTable.xml\")?.async(\"string\");\n const numberingXmlText = await zip.file(\"word/numbering.xml\")?.async(\"string\");\n\n if (!documentXmlText || !stylesXmlText) {\n throw new Error(\"DOCX missing document.xml or styles.xml\");\n }\n\n const documentXml = parseXml(documentXmlText);\n const stylesXml = parseXml(stylesXmlText);\n const fontTableXml = fontTableXmlText ? parseXml(fontTableXmlText) : null;\n const numberingXml = numberingXmlText ? parseXml(numberingXmlText) : null;\n const numberingMap = parseNumberingMap(numberingXml);\n\n const defaults = parseDefaults(stylesXml);\n const heading1 = parseHeading1Style(stylesXml);\n const tableDefaults = parseTableDefaults(stylesXml);\n const pageGeometry = parsePageGeometry(documentXml);\n const titleAlign = parseHeadingAlignFromDocument(documentXml);\n const trailingDate = parseTrailingDateAnchor(documentXml);\n const discoveredFonts = parseFontTableFamilies(fontTableXml);\n const bodyFontFamily = inferBodyFontFamily(discoveredFonts);\n const titleFontFamily = inferTitleFontFamily(discoveredFonts);\n const paragraphProfiles = parseParagraphProfiles(documentXml, numberingMap);\n\n return {\n sourceFileName: file.name,\n bodyFontPx: defaults.bodyFontPx ?? FALLBACK_PROFILE.bodyFontPx,\n bodyLineHeightRatio: defaults.bodyLineHeightRatio ?? FALLBACK_PROFILE.bodyLineHeightRatio,\n bodyLineHeightPx: defaults.bodyLineHeightPx ?? FALLBACK_PROFILE.bodyLineHeightPx,\n bodyLineHeightRule: defaults.bodyLineHeightRule ?? FALLBACK_PROFILE.bodyLineHeightRule,\n paragraphAfterPx: defaults.paragraphAfterPx ?? FALLBACK_PROFILE.paragraphAfterPx,\n contentWidthPx: pageGeometry.contentWidthPx ?? FALLBACK_PROFILE.contentWidthPx,\n pageHeightPx: pageGeometry.pageHeightPx ?? FALLBACK_PROFILE.pageHeightPx,\n pageMarginTopPx: pageGeometry.marginTopPx ?? FALLBACK_PROFILE.pageMarginTopPx,\n pageMarginBottomPx: pageGeometry.marginBottomPx ?? FALLBACK_PROFILE.pageMarginBottomPx,\n titleFontPx: heading1.titleFontPx ?? FALLBACK_PROFILE.titleFontPx,\n titleColor: heading1.titleColor ?? FALLBACK_PROFILE.titleColor,\n titleAlign: titleAlign ?? FALLBACK_PROFILE.titleAlign,\n bodyFontFamily,\n titleFontFamily,\n discoveredFonts,\n tableCellPaddingTopPx: tableDefaults.topPx ?? FALLBACK_PROFILE.tableCellPaddingTopPx,\n tableCellPaddingLeftPx: tableDefaults.leftPx ?? FALLBACK_PROFILE.tableCellPaddingLeftPx,\n tableCellPaddingBottomPx: tableDefaults.bottomPx ?? FALLBACK_PROFILE.tableCellPaddingBottomPx,\n tableCellPaddingRightPx: tableDefaults.rightPx ?? FALLBACK_PROFILE.tableCellPaddingRightPx,\n paragraphProfiles,\n trailingDateText: trailingDate.trailingDateText,\n trailingDateAlignedRight: trailingDate.trailingDateAlignedRight,\n trailingDateParagraphIndex: trailingDate.trailingDateParagraphIndex,\n trailingEmptyParagraphCountBeforeDate: trailingDate.trailingEmptyParagraphCountBeforeDate\n };\n}\n","import { applyWordHtmlCompatibility } from \"./htmlCompat\";\nimport { createFallbackWordStyleProfile, type ParagraphStyleProfile, type RunStyleProfile, type WordStyleProfile } from \"./styleProfile\";\n\ninterface ApplyWordRenderOptions {\n doc: Document;\n styleProfile: WordStyleProfile | null;\n showFormattingMarks: boolean;\n}\n\nfunction setImportantStyle(el: HTMLElement, prop: string, value: string): void {\n el.style.setProperty(prop, value, \"important\");\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\");\n}\n\nfunction runStyleToCss(run: RunStyleProfile): string {\n const declarations: string[] = [];\n if (run.fontSizePx !== null) declarations.push(`font-size:${run.fontSizePx.toFixed(2)}px`);\n if (run.color) declarations.push(`color:${run.color}`);\n if (run.highlightColor) declarations.push(`background-color:${run.highlightColor}`);\n if (run.shadingColor) declarations.push(`background-color:${run.shadingColor}`);\n if (run.charSpacingPx !== null) declarations.push(`letter-spacing:${run.charSpacingPx.toFixed(2)}px`);\n if (run.shadow) declarations.push(\"text-shadow:0.5px 0.5px 0 rgba(0,0,0,0.28)\");\n if (run.bold) declarations.push(\"font-weight:700\");\n if (run.italic) declarations.push(\"font-style:italic\");\n const textDecorations: string[] = [];\n if (run.underline) textDecorations.push(\"underline\");\n if (run.strike) textDecorations.push(\"line-through\");\n if (textDecorations.length > 0) declarations.push(`text-decoration:${textDecorations.join(\" \")}`);\n if (run.superscript) declarations.push(\"vertical-align:super\");\n if (run.subscript) declarations.push(\"vertical-align:sub\");\n if (run.superscript || run.subscript) declarations.push(\"font-size:0.83em\");\n if (run.fontFamily) declarations.push(`font-family:${run.fontFamily}`);\n return declarations.join(\";\");\n}\n\nfunction paragraphToRunHtml(runs: RunStyleProfile[]): string {\n return runs\n .map((run) => {\n const css = runStyleToCss(run);\n const parts = run.text.split(\"\\n\");\n const html = parts.map((part) => escapeHtml(part)).join(\"<br/>\");\n if (!css) return html;\n return `<span style=\"${css}\">${html}</span>`;\n })\n .join(\"\");\n}\n\nfunction toLowerLetter(n: number): string {\n const alphabet = \"abcdefghijklmnopqrstuvwxyz\";\n if (n <= 0) return \"a\";\n let x = n;\n let out = \"\";\n while (x > 0) {\n x -= 1;\n out = alphabet[x % 26] + out;\n x = Math.floor(x / 26);\n }\n return out;\n}\n\nfunction toRoman(num: number): string {\n if (num <= 0) return \"I\";\n const map: Array<[number, string]> = [\n [1000, \"M\"], [900, \"CM\"], [500, \"D\"], [400, \"CD\"],\n [100, \"C\"], [90, \"XC\"], [50, \"L\"], [40, \"XL\"],\n [10, \"X\"], [9, \"IX\"], [5, \"V\"], [4, \"IV\"], [1, \"I\"]\n ];\n let n = num;\n let result = \"\";\n for (const [v, s] of map) {\n while (n >= v) {\n result += s;\n n -= v;\n }\n }\n return result;\n}\n\nfunction formatListMarker(format: string | null, counter: number): string {\n switch ((format ?? \"\").toLowerCase()) {\n case \"decimal\":\n return `${counter}.`;\n case \"lowerletter\":\n return `${toLowerLetter(counter)}.`;\n case \"upperletter\":\n return `${toLowerLetter(counter).toUpperCase()}.`;\n case \"lowerroman\":\n return `${toRoman(counter).toLowerCase()}.`;\n case \"upperroman\":\n return `${toRoman(counter)}.`;\n case \"bullet\":\n default:\n return \"•\";\n }\n}\n\nfunction formatListMarkerByPattern(\n pattern: string | null,\n currentLevel: number,\n countersByLevel: number[],\n currentFormat: string | null\n): string {\n if (!pattern || pattern.trim().length === 0) {\n return formatListMarker(currentFormat, countersByLevel[currentLevel] ?? 1);\n }\n\n const replaced = pattern.replace(/%(\\d+)/g, (_, g1: string) => {\n const level1Based = Number.parseInt(g1, 10);\n if (!Number.isFinite(level1Based) || level1Based <= 0) return \"\";\n const levelIdx = level1Based - 1;\n const n = countersByLevel[levelIdx] ?? 0;\n if (n <= 0) return \"\";\n if (levelIdx === currentLevel) {\n return formatListMarker(currentFormat, n).replace(/\\.$/, \"\");\n }\n return String(n);\n });\n\n const normalized = replaced.trim();\n if (!normalized) {\n return formatListMarker(currentFormat, countersByLevel[currentLevel] ?? 1);\n }\n return normalized;\n}\n\nfunction ensureStyleTag(doc: Document, id: string): HTMLStyleElement {\n let styleEl = doc.getElementById(id) as HTMLStyleElement | null;\n if (!styleEl) {\n styleEl = doc.createElement(\"style\");\n styleEl.id = id;\n doc.head.appendChild(styleEl);\n }\n return styleEl;\n}\n\nfunction applyBaseProfileCss(doc: Document, styleProfile: WordStyleProfile): void {\n const styleEl = ensureStyleTag(doc, \"__word_style_profile__\");\n const targetWidthPx = styleProfile.contentWidthPx.toFixed(2);\n const topPaddingPx = styleProfile.pageMarginTopPx.toFixed(2);\n const bottomPaddingPx = styleProfile.pageMarginBottomPx.toFixed(2);\n const pageHeightPx = styleProfile.pageHeightPx.toFixed(2);\n\n const bodyLineHeightCss =\n styleProfile.bodyLineHeightRule === \"auto\" || styleProfile.bodyLineHeightPx === null\n ? styleProfile.bodyLineHeightRatio.toFixed(6)\n : `${styleProfile.bodyLineHeightPx.toFixed(2)}px`;\n\n styleEl.textContent = `\n @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;700&family=Noto+Serif+SC:wght@400;700&display=swap');\n html, body { box-sizing: border-box; }\n body {\n min-height: ${pageHeightPx}px !important;\n width: ${targetWidthPx}px !important;\n max-width: calc(100% - 24px) !important;\n margin-left: auto !important;\n margin-right: auto !important;\n padding-top: ${topPaddingPx}px !important;\n padding-bottom: ${bottomPaddingPx}px !important;\n padding-left: 0 !important;\n padding-right: 0 !important;\n font-family: ${styleProfile.bodyFontFamily} !important;\n }\n p {\n font-size: ${styleProfile.bodyFontPx.toFixed(4)}px !important;\n line-height: ${bodyLineHeightCss} !important;\n margin-bottom: ${styleProfile.paragraphAfterPx.toFixed(2)}px !important;\n }\n table { border-collapse: collapse !important; border-spacing: 0 !important; }\n td, th {\n padding-top: ${styleProfile.tableCellPaddingTopPx.toFixed(2)}px !important;\n padding-left: ${styleProfile.tableCellPaddingLeftPx.toFixed(2)}px !important;\n padding-bottom: ${styleProfile.tableCellPaddingBottomPx.toFixed(2)}px !important;\n padding-right: ${styleProfile.tableCellPaddingRightPx.toFixed(2)}px !important;\n vertical-align: top !important;\n }\n h1 {\n font-size: ${styleProfile.titleFontPx.toFixed(2)}px !important;\n color: ${styleProfile.titleColor} !important;\n text-align: ${styleProfile.titleAlign} !important;\n font-family: ${styleProfile.titleFontFamily} !important;\n }\n `;\n}\n\nfunction applyInlineLayoutGuards(doc: Document, styleProfile: WordStyleProfile): void {\n const body = doc.body as HTMLElement;\n const targetWidthPx = styleProfile.contentWidthPx.toFixed(2);\n const topPaddingPx = styleProfile.pageMarginTopPx.toFixed(2);\n const bottomPaddingPx = styleProfile.pageMarginBottomPx.toFixed(2);\n const pageHeightPx = styleProfile.pageHeightPx.toFixed(2);\n\n setImportantStyle(body, \"box-sizing\", \"border-box\");\n setImportantStyle(body, \"min-height\", `${pageHeightPx}px`);\n setImportantStyle(body, \"width\", `${targetWidthPx}px`);\n setImportantStyle(body, \"max-width\", `${targetWidthPx}px`);\n setImportantStyle(body, \"margin-left\", \"auto\");\n setImportantStyle(body, \"margin-right\", \"auto\");\n setImportantStyle(body, \"padding-top\", `${topPaddingPx}px`);\n setImportantStyle(body, \"padding-bottom\", `${bottomPaddingPx}px`);\n setImportantStyle(body, \"padding-left\", \"0\");\n setImportantStyle(body, \"padding-right\", \"0\");\n setImportantStyle(body, \"font-family\", styleProfile.bodyFontFamily);\n\n for (const child of Array.from(body.children)) {\n if (!(child instanceof HTMLElement)) continue;\n const tag = child.tagName.toLowerCase();\n if (tag === \"script\" || tag === \"style\") continue;\n setImportantStyle(child, \"box-sizing\", \"border-box\");\n setImportantStyle(child, \"max-width\", \"100%\");\n }\n\n for (const img of Array.from(doc.body.querySelectorAll(\"img\"))) {\n if (!(img instanceof HTMLElement)) continue;\n setImportantStyle(img, \"max-width\", \"100%\");\n setImportantStyle(img, \"height\", \"auto\");\n }\n}\n\nfunction normalizeEmptyParagraphMarkers(paragraphs: HTMLElement[]): void {\n for (const p of paragraphs) {\n const hasVisualContent = (p.textContent ?? \"\").trim().length > 0 || p.querySelector(\"img,table,svg,canvas\") !== null;\n if (!hasVisualContent) {\n p.setAttribute(\"data-word-empty\", \"1\");\n if (p.innerHTML.trim().length === 0) {\n p.innerHTML = \"<br/>\";\n }\n } else {\n p.removeAttribute(\"data-word-empty\");\n }\n }\n}\n\nfunction hasMeaningfulParagraphAfter(paragraphs: HTMLElement[], index: number): boolean {\n for (let i = index + 1; i < paragraphs.length; i += 1) {\n const p = paragraphs[i];\n const hasText = (p.textContent ?? \"\").trim().length > 0;\n const hasVisual = p.querySelector(\"img,table,svg,canvas\") !== null;\n if (hasText || hasVisual) return true;\n }\n return false;\n}\n\nfunction applyParagraphProfiles(doc: Document, styleProfile: WordStyleProfile): HTMLElement[] {\n const fallbackParagraphs = Array.from(doc.body.querySelectorAll(\"p\")) as HTMLElement[];\n fallbackParagraphs.forEach((p) => {\n p.classList.remove(\"__word-date-anchor\");\n p.querySelectorAll(\"span.__word-list-marker\").forEach((node) => node.remove());\n });\n\n const resolvedTargets = styleProfile.paragraphProfiles.map((profile, index) => {\n const byIndex =\n (doc.body.querySelector(`[data-word-p-index=\"${profile.index}\"]`) as HTMLElement | null) ?? null;\n const fallback = fallbackParagraphs[index] ?? null;\n return {\n profile,\n node: byIndex ?? fallback\n };\n });\n\n if (styleProfile.trailingDateAlignedRight && styleProfile.trailingDateText) {\n let dateParagraph: HTMLElement | null = null;\n if (\n styleProfile.trailingDateParagraphIndex !== null &&\n styleProfile.trailingDateParagraphIndex >= 0\n ) {\n dateParagraph =\n (doc.body.querySelector(\n `[data-word-p-index=\"${styleProfile.trailingDateParagraphIndex}\"]`\n ) as HTMLElement | null) ??\n fallbackParagraphs[styleProfile.trailingDateParagraphIndex] ??\n null;\n } else {\n dateParagraph =\n fallbackParagraphs\n .slice()\n .reverse()\n .find((p) => {\n const text = (p.textContent ?? \"\").replace(/\\s+/g, \"\");\n const target = styleProfile.trailingDateText?.replace(/\\s+/g, \"\") ?? \"\";\n return target.length > 0 && text.includes(target);\n }) ?? null;\n }\n\n const dateIndex = dateParagraph ? fallbackParagraphs.indexOf(dateParagraph) : -1;\n const hasContentAfterDate = dateIndex >= 0 ? hasMeaningfulParagraphAfter(fallbackParagraphs, dateIndex) : false;\n\n if (dateParagraph && !hasContentAfterDate) {\n let existingEmptyCount = 0;\n let cursor = dateParagraph.previousElementSibling;\n while (cursor && cursor.tagName.toLowerCase() === \"p\" && (cursor.textContent ?? \"\").trim().length === 0) {\n existingEmptyCount += 1;\n cursor = cursor.previousElementSibling;\n }\n\n const needed = Math.max(0, styleProfile.trailingEmptyParagraphCountBeforeDate - existingEmptyCount);\n for (let i = 0; i < needed; i += 1) {\n const spacer = doc.createElement(\"p\");\n spacer.innerHTML = \"<br/>\";\n dateParagraph.parentElement?.insertBefore(spacer, dateParagraph);\n }\n }\n }\n\n const paragraphs = Array.from(doc.body.querySelectorAll(\"p\")) as HTMLElement[];\n const listCounters = new Map<number, number[]>();\n const orderedTargets: HTMLElement[] = [];\n\n for (const target of resolvedTargets) {\n const para = target.node;\n const profile = target.profile;\n if (!para) continue;\n orderedTargets.push(para);\n para.removeAttribute(\"data-word-list\");\n\n para.style.textAlign = profile.align;\n if (profile.beforePx !== null) para.style.marginTop = `${profile.beforePx.toFixed(2)}px`;\n if (profile.afterPx !== null) para.style.marginBottom = `${profile.afterPx.toFixed(2)}px`;\n if (profile.lineHeightRule === \"auto\" && profile.lineHeightRatio !== null) {\n para.style.lineHeight = profile.lineHeightRatio.toFixed(6);\n } else if ((profile.lineHeightRule === \"exact\" || profile.lineHeightRule === \"atLeast\") && profile.lineHeightPx !== null) {\n para.style.lineHeight = `${profile.lineHeightPx.toFixed(2)}px`;\n }\n if (profile.indentLeftPx !== null) para.style.marginLeft = `${profile.indentLeftPx.toFixed(2)}px`;\n if (profile.indentRightPx !== null) para.style.marginRight = `${profile.indentRightPx.toFixed(2)}px`;\n if (profile.firstLinePx !== null) para.style.textIndent = `${profile.firstLinePx.toFixed(2)}px`;\n if (profile.hangingPx !== null) para.style.textIndent = `${(-profile.hangingPx).toFixed(2)}px`;\n\n if (profile.runs.length > 0 && para.querySelector(\"img,table,svg,canvas\") === null) {\n const currentTextNormalized = (para.textContent ?? \"\").replace(/\\s+/g, \"\");\n const runTextNormalized = profile.runs.map((run) => run.text).join(\"\").replace(/\\s+/g, \"\");\n if (runTextNormalized.length > 0 && currentTextNormalized === runTextNormalized) {\n para.innerHTML = paragraphToRunHtml(profile.runs);\n }\n }\n\n if (profile.listNumId !== null && profile.listLevel !== null) {\n para.setAttribute(\"data-word-list\", \"1\");\n if (profile.sectionBreakBefore) {\n listCounters.set(profile.listNumId, []);\n }\n const currentLevel = Math.max(0, profile.listLevel);\n const levels = listCounters.get(profile.listNumId) ?? [];\n const prevValue = levels[currentLevel] ?? (profile.listStartAt - 1);\n const nextValue = prevValue + 1;\n levels[currentLevel] = nextValue;\n for (let lv = currentLevel + 1; lv < levels.length; lv += 1) {\n levels[lv] = 0;\n }\n listCounters.set(profile.listNumId, levels);\n\n const markerText = formatListMarkerByPattern(profile.listTextPattern, currentLevel, levels, profile.listFormat);\n const plainText = (para.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n const alreadyHasMarker = plainText.startsWith(markerText);\n if (!alreadyHasMarker) {\n const marker = doc.createElement(\"span\");\n marker.className = \"__word-list-marker\";\n marker.setAttribute(\"data-word-list-marker\", \"1\");\n marker.textContent = `${markerText} `;\n marker.style.display = \"inline-block\";\n marker.style.minWidth = \"1.8em\";\n marker.style.marginLeft = currentLevel > 0 ? `${currentLevel * 1.2}em` : \"0\";\n marker.style.color = \"inherit\";\n marker.style.fontWeight = \"inherit\";\n para.prepend(marker);\n }\n }\n\n // Date anchoring is represented by explicit spacer insertion.\n // Avoid global flex/auto-margin layout because it distorts generic document flow.\n }\n\n normalizeEmptyParagraphMarkers(paragraphs);\n return orderedTargets;\n}\n\nfunction paragraphHeightPx(paragraph: HTMLElement): number {\n const rect = paragraph.getBoundingClientRect();\n if (rect.height > 0) return rect.height;\n const lh = Number.parseFloat(getComputedStyle(paragraph).lineHeight || \"0\");\n if (Number.isFinite(lh) && lh > 0) return lh;\n return 16;\n}\n\nfunction insertPageSpacerBefore(doc: Document, paragraph: HTMLElement, heightPx: number): void {\n if (heightPx <= 0.5) return;\n const spacer = doc.createElement(\"div\");\n spacer.dataset.wordPageSpacer = \"1\";\n spacer.style.height = `${heightPx.toFixed(2)}px`;\n spacer.style.width = \"100%\";\n spacer.style.pointerEvents = \"none\";\n spacer.style.userSelect = \"none\";\n paragraph.parentElement?.insertBefore(spacer, paragraph);\n}\n\nfunction removePaginationSpacers(doc: Document): void {\n doc.querySelectorAll(\"[data-word-page-spacer='1']\").forEach((node) => node.remove());\n}\n\nfunction estimateGroupHeight(paragraphs: HTMLElement[], idx: number, profile: ParagraphStyleProfile, contentHeight: number): number {\n const currentH = paragraphHeightPx(paragraphs[idx]);\n if (!profile.keepNext) return currentH;\n const next = paragraphs[idx + 1];\n if (!next) return currentH;\n const nextH = paragraphHeightPx(next);\n const sum = currentH + nextH;\n if (sum > contentHeight) return currentH;\n return sum;\n}\n\nfunction applyKeepPagination(doc: Document, styleProfile: WordStyleProfile, paragraphs: HTMLElement[]): void {\n removePaginationSpacers(doc);\n\n const contentHeight = Math.max(120, styleProfile.pageHeightPx - styleProfile.pageMarginTopPx - styleProfile.pageMarginBottomPx);\n const count = Math.min(styleProfile.paragraphProfiles.length, paragraphs.length);\n let used = 0;\n\n for (let i = 0; i < count; i += 1) {\n const p = paragraphs[i];\n const profile = styleProfile.paragraphProfiles[i];\n const h = paragraphHeightPx(p);\n\n const forceBreak = profile.pageBreakBefore;\n if (forceBreak && used > 0) {\n insertPageSpacerBefore(doc, p, contentHeight - used);\n used = 0;\n }\n\n const groupHeight = estimateGroupHeight(paragraphs, i, profile, contentHeight);\n if ((profile.keepLines || profile.keepNext) && used > 0 && used + groupHeight > contentHeight) {\n insertPageSpacerBefore(doc, p, contentHeight - used);\n used = 0;\n }\n\n if (used > 0 && used + h > contentHeight) {\n insertPageSpacerBefore(doc, p, contentHeight - used);\n used = 0;\n }\n\n used += h;\n if (used >= contentHeight) {\n used = used % contentHeight;\n }\n }\n}\n\nfunction applyFormattingMarks(doc: Document, showFormattingMarks: boolean): void {\n const styleEl = ensureStyleTag(doc, \"__word_view_options__\");\n styleEl.textContent = `\n p[data-word-empty=\"1\"]::before { content: \"\\\\00a0\"; }\n ${showFormattingMarks ? `\n p::after {\n content: \"↵\";\n color: #66aef9;\n font-size: 0.85em;\n margin-left: 3px;\n }\n br::after {\n content: \"↵\";\n color: #66aef9;\n }\n ` : \"\"}\n `;\n}\n\nexport function applyWordRenderModel({ doc, styleProfile, showFormattingMarks }: ApplyWordRenderOptions): void {\n const effectiveProfile = styleProfile ?? createFallbackWordStyleProfile(\"__default_a4__\");\n\n applyWordHtmlCompatibility(doc, {\n forceBodyFontFamily: effectiveProfile.bodyFontFamily,\n forceHeadingFontFamily: effectiveProfile.titleFontFamily\n });\n\n let paragraphs = Array.from(doc.body.querySelectorAll(\"p\")) as HTMLElement[];\n normalizeEmptyParagraphMarkers(paragraphs);\n\n applyBaseProfileCss(doc, effectiveProfile);\n applyInlineLayoutGuards(doc, effectiveProfile);\n\n if (styleProfile) {\n paragraphs = applyParagraphProfiles(doc, styleProfile);\n applyKeepPagination(doc, styleProfile, paragraphs);\n }\n\n applyFormattingMarks(doc, showFormattingMarks);\n}\n","import { buildHtmlSnapshot } from \"../lib/htmlSnapshot\";\nimport { parseDocxToHtmlSnapshot } from \"../lib/docxHtml\";\nimport { extractFromClipboardDataTransfer, extractFromClipboardItems } from \"../lib/pastePipeline\";\nimport { applyWordRenderModel } from \"../lib/renderApply\";\nimport { parseDocxStyleProfile, type WordStyleProfile } from \"../lib/styleProfile\";\n\nconst VERSION = \"0.1.2\";\n\ntype Locale = \"zh\" | \"en\";\ntype ChangeSource = \"paste\" | \"upload\" | \"api\" | \"clear\";\n\nconst MESSAGES: Record<Locale, {\n readClipboard: string;\n uploadWord: string;\n clear: string;\n pastePlaceholder: string;\n waitImport: string;\n loadedHtml: string;\n cleared: string;\n loadedWord: (name: string) => string;\n importedClipboard: string;\n noContent: string;\n noClipboardRead: string;\n parseFailed: string;\n clipboardReadFailed: string;\n errorPrefix: string;\n}> = {\n zh: {\n readClipboard: \"从系统剪贴板读取\",\n uploadWord: \"上传 Word\",\n clear: \"清空\",\n pastePlaceholder: \"在此处粘贴 Word/WPS/Google Docs 内容(Ctrl/Cmd+V)\",\n waitImport: \"等待内容导入\",\n loadedHtml: \"已加载 HTML 快照\",\n cleared: \"文档已清空\",\n loadedWord: (name) => `已加载 Word 文件: ${name}`,\n importedClipboard: \"已导入剪贴板内容\",\n noContent: \"未检测到可导入内容\",\n noClipboardRead: \"当前浏览器不支持 clipboard.read\",\n parseFailed: \"Word 解析失败\",\n clipboardReadFailed: \"读取剪贴板失败\",\n errorPrefix: \"错误: \"\n },\n en: {\n readClipboard: \"Read clipboard\",\n uploadWord: \"Upload Word\",\n clear: \"Clear\",\n pastePlaceholder: \"Paste Word/WPS/Google Docs content here (Ctrl/Cmd+V)\",\n waitImport: \"Waiting for input\",\n loadedHtml: \"HTML snapshot loaded\",\n cleared: \"Document cleared\",\n loadedWord: (name) => `Word file loaded: ${name}`,\n importedClipboard: \"Clipboard content imported\",\n noContent: \"No importable content detected\",\n noClipboardRead: \"navigator.clipboard.read is not supported in this browser\",\n parseFailed: \"Word parse failed\",\n clipboardReadFailed: \"Failed to read clipboard\",\n errorPrefix: \"Error: \"\n }\n};\n\nconst BASE_CSS = `\n:host{display:block;border:1px solid #d8deea;border-radius:12px;background:#fff;overflow:hidden;font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto}\n.toolbar{display:flex;gap:8px;flex-wrap:wrap;padding:10px;border-bottom:1px solid #e8edf6;background:#f8faff}\nbutton{border:1px solid #c8d2eb;background:#fff;border-radius:9px;padding:6px 10px;cursor:pointer}\n.paste{width:100%;min-height:40px;border:1px dashed #95acef;border-radius:10px;background:#edf3ff;padding:8px 10px;box-sizing:border-box;resize:vertical}\n.hint{display:block;padding:0 10px 10px;color:#4b5c82;font-size:12px}\niframe{width:100%;min-height:760px;border:0}\n`;\n\nexport class DocsWordElement extends HTMLElement {\n private rootRef: ShadowRoot;\n private toolbar: HTMLDivElement;\n private btnRead: HTMLButtonElement;\n private btnUpload: HTMLButtonElement;\n private btnClear: HTMLButtonElement;\n private frame: HTMLIFrameElement;\n private pasteArea: HTMLTextAreaElement;\n private fileInput: HTMLInputElement;\n private hint: HTMLSpanElement;\n private htmlSnapshot: string;\n private styleProfile: WordStyleProfile | null = null;\n private frameHeight = 0;\n private locale: Locale = \"zh\";\n\n constructor() {\n super();\n this.rootRef = this.attachShadow({ mode: \"open\" });\n this.locale = this.parseLocale(this.getAttribute(\"lang\"));\n this.htmlSnapshot = buildHtmlSnapshot(\"<p><br/></p>\");\n\n const style = document.createElement(\"style\");\n style.textContent = BASE_CSS;\n\n this.toolbar = document.createElement(\"div\");\n this.toolbar.className = \"toolbar\";\n\n this.btnRead = document.createElement(\"button\");\n this.btnRead.onclick = () => void this.loadClipboard();\n\n this.btnUpload = document.createElement(\"button\");\n this.btnUpload.onclick = () => this.fileInput.click();\n\n this.btnClear = document.createElement(\"button\");\n this.btnClear.onclick = () => this.clear();\n\n this.fileInput = document.createElement(\"input\");\n this.fileInput.type = \"file\";\n this.fileInput.accept = \".docx\";\n this.fileInput.style.display = \"none\";\n this.fileInput.onchange = () => void this.onUpload();\n\n this.toolbar.append(this.btnRead, this.btnUpload, this.btnClear, this.fileInput);\n\n this.pasteArea = document.createElement(\"textarea\");\n this.pasteArea.className = \"paste\";\n this.pasteArea.placeholder = \"\";\n this.pasteArea.onpaste = (event) => {\n event.preventDefault();\n void this.applyFromClipboardData(event.clipboardData);\n };\n\n this.hint = document.createElement(\"span\");\n this.hint.className = \"hint\";\n this.hint.textContent = \"\";\n\n this.frame = document.createElement(\"iframe\");\n this.frame.sandbox.add(\"allow-same-origin\", \"allow-scripts\");\n this.frame.onload = () => this.onFrameLoad();\n\n this.rootRef.append(style, this.toolbar, this.pasteArea, this.hint, this.frame);\n this.syncLocaleText();\n this.syncToolbarVisibility();\n }\n\n static get observedAttributes(): string[] {\n return [\"lang\", \"show-toolbar\"];\n }\n\n attributeChangedCallback(name: string, _: string | null, newValue: string | null): void {\n if (name === \"lang\") {\n this.locale = this.parseLocale(newValue);\n this.syncLocaleText();\n return;\n }\n if (name === \"show-toolbar\") {\n this.syncToolbarVisibility();\n }\n }\n\n connectedCallback(): void {\n this.renderSnapshot();\n this.dispatchEvent(new CustomEvent(\"docsjs-ready\", { detail: { version: VERSION } }));\n }\n\n public setSnapshot(rawHtml: string): void {\n this.loadHtml(rawHtml);\n }\n\n public loadHtml(rawHtml: string): void {\n this.styleProfile = null;\n this.htmlSnapshot = buildHtmlSnapshot(rawHtml);\n this.renderSnapshot();\n this.setHint(MESSAGES[this.locale].loadedHtml);\n this.emitChange(\"api\");\n }\n\n public getSnapshot(): string {\n return this.htmlSnapshot;\n }\n\n public clear(): void {\n this.styleProfile = null;\n this.htmlSnapshot = buildHtmlSnapshot(\"<p><br/></p>\");\n this.renderSnapshot();\n this.setHint(MESSAGES[this.locale].cleared);\n this.emitChange(\"clear\");\n }\n\n public async loadDocx(file: File): Promise<void> {\n await this.applyDocx(file);\n }\n\n private async onUpload(): Promise<void> {\n const file = this.fileInput.files?.[0];\n if (!file) return;\n await this.applyDocx(file);\n this.fileInput.value = \"\";\n }\n\n private async applyDocx(file: File): Promise<void> {\n try {\n const [snapshot, profile] = await Promise.all([\n parseDocxToHtmlSnapshot(file),\n parseDocxStyleProfile(file)\n ]);\n this.styleProfile = profile;\n this.htmlSnapshot = snapshot;\n this.renderSnapshot();\n this.setHint(MESSAGES[this.locale].loadedWord(profile.sourceFileName));\n this.emitChange(\"upload\", profile.sourceFileName);\n } catch (error) {\n this.emitError(error instanceof Error ? error.message : MESSAGES[this.locale].parseFailed);\n }\n }\n\n public async loadClipboard(): Promise<void> {\n if (!navigator.clipboard?.read) {\n this.emitError(MESSAGES[this.locale].noClipboardRead);\n return;\n }\n try {\n const items = await navigator.clipboard.read();\n const payload = await extractFromClipboardItems(items);\n this.applyPayload(payload.html, payload.text);\n } catch (error) {\n this.emitError(error instanceof Error ? error.message : MESSAGES[this.locale].clipboardReadFailed);\n }\n }\n\n private async applyFromClipboardData(data: DataTransfer | null): Promise<void> {\n if (!data) return;\n const payload = await extractFromClipboardDataTransfer(data);\n this.applyPayload(payload.html, payload.text);\n }\n\n private applyPayload(html: string, text: string): void {\n this.styleProfile = null;\n if (html.trim()) {\n this.htmlSnapshot = buildHtmlSnapshot(html);\n } else if (text.trim()) {\n this.htmlSnapshot = buildHtmlSnapshot(`<p>${text.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\")}</p>`);\n } else {\n this.setHint(MESSAGES[this.locale].noContent);\n return;\n }\n this.renderSnapshot();\n this.setHint(MESSAGES[this.locale].importedClipboard);\n this.emitChange(\"paste\");\n }\n\n private onFrameLoad(): void {\n const doc = this.frame.contentDocument;\n if (!doc) return;\n\n applyWordRenderModel({\n doc,\n styleProfile: this.styleProfile,\n showFormattingMarks: false\n });\n\n this.syncHeight();\n window.setTimeout(() => this.syncHeight(), 120);\n }\n\n private syncHeight(): void {\n const doc = this.frame.contentDocument;\n if (!doc) return;\n const measured = Math.max(760, doc.body.scrollHeight, doc.documentElement.scrollHeight);\n const next = measured + 24;\n if (Math.abs(next - this.frameHeight) < 2) return;\n this.frameHeight = next;\n this.frame.style.height = `${next}px`;\n }\n\n private renderSnapshot(): void {\n this.frame.srcdoc = this.htmlSnapshot;\n }\n\n private emitChange(source: ChangeSource, fileName?: string): void {\n this.dispatchEvent(new CustomEvent(\"docsjs-change\", { detail: { htmlSnapshot: this.htmlSnapshot, source, fileName } }));\n }\n\n private emitError(message: string): void {\n this.dispatchEvent(new CustomEvent(\"docsjs-error\", { detail: { message } }));\n this.setHint(`${MESSAGES[this.locale].errorPrefix}${message}`);\n }\n\n private setHint(text: string): void {\n this.hint.textContent = text;\n }\n\n private parseLocale(value: string | null): Locale {\n return value?.toLowerCase() === \"en\" ? \"en\" : \"zh\";\n }\n\n private syncToolbarVisibility(): void {\n const raw = this.getAttribute(\"show-toolbar\");\n const show = raw === null || raw === \"\" || raw === \"1\" || raw.toLowerCase() === \"true\";\n this.toolbar.style.display = show ? \"flex\" : \"none\";\n }\n\n private syncLocaleText(): void {\n const t = MESSAGES[this.locale];\n this.btnRead.textContent = t.readClipboard;\n this.btnUpload.textContent = t.uploadWord;\n this.btnClear.textContent = t.clear;\n this.pasteArea.placeholder = t.pastePlaceholder;\n if (!this.hint.textContent || this.hint.textContent === MESSAGES.en.waitImport || this.hint.textContent === MESSAGES.zh.waitImport) {\n this.hint.textContent = t.waitImport;\n }\n }\n}\n\nexport function defineDocsWordElement(): void {\n if (!customElements.get(\"docs-word-editor\")) {\n customElements.define(\"docs-word-editor\", DocsWordElement);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,iBAAoE;;;ACApE,IAAM,uBAAuB;AAC7B,IAAM,qBAAqB;AAEpB,SAAS,kBAAkB,SAAyB;AACzD,MAAI,CAAC,QAAQ,KAAK,GAAG;AACnB,WAAO,GAAG,oBAAoB,GAAG,kBAAkB;AAAA,EACrD;AAEA,QAAM,aAAa,cAAc,KAAK,OAAO;AAC7C,MAAI,YAAY;AACd,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,oBAAoB,GAAG,kBAAkB,GAAG;AAAA,IACpD;AAAA,IACA,SAAS,OAAO;AAAA,EAClB;AACF;;;ACjBA,mBAAkB;AA0BlB,SAAS,WAAW,MAAsB;AACxC,SAAO,KACJ,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,QAAQ;AAC7B;AAEA,SAAS,SAAS,SAA2B;AAC3C,QAAM,SAAS,IAAI,UAAU;AAC7B,SAAO,OAAO,gBAAgB,SAAS,iBAAiB;AAC1D;AAEA,SAAS,oBAAoB,MAAkB,WAA8B;AAC3E,SAAO,MAAM,KAAK,KAAK,iBAAiB,GAAG,CAAC,EAAE,OAAO,CAAC,OAAO,GAAG,cAAc,SAAS;AACzF;AAEA,SAAS,iBAAiB,MAAkB,WAAmC;AAC7E,SAAO,oBAAoB,MAAM,SAAS,EAAE,CAAC,KAAK;AACpD;AAEA,SAAS,0BAA0B,MAAe,WAA8B;AAC9E,SAAO,MAAM,KAAK,KAAK,QAAQ,EAAE,OAAO,CAAC,UAAU,MAAM,cAAc,SAAS;AAClF;AAEA,SAAS,QAAQ,MAAsB,MAA6B;AAClE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,aAAa,IAAI;AAC/B;AAEA,SAAS,QAAQ,KAAqB;AACpC,SAAQ,MAAM,KAAM;AACtB;AAEA,SAAS,mBAAmB,SAAiC;AAC3D,QAAM,aACJ,oBAAoB,SAAS,QAAQ,EAAE,KAAK,CAAC,SAAS;AACpD,UAAM,SAAS,KAAK;AACpB,WAAO,QAAQ,cAAc,YAAY,QAAQ,cAAc;AAAA,EACjE,CAAC,KAAK;AACR,MAAI,CAAC,YAAY;AACf,WAAO,EAAE,SAAS,MAAM,UAAU,KAAK;AAAA,EACzC;AAEA,QAAM,QAAQ,QAAQ,YAAY,IAAI;AACtC,QAAM,QAAQ,QAAQ,YAAY,IAAI;AACtC,QAAM,KAAK,QAAQ,OAAO,SAAS,OAAO,EAAE,IAAI,OAAO;AACvD,QAAM,KAAK,QAAQ,OAAO,SAAS,OAAO,EAAE,IAAI,OAAO;AAEvD,QAAM,UAAU,OAAO,SAAS,EAAE,KAAK,KAAK,IAAI,QAAQ,EAAE,IAAI;AAC9D,QAAM,WAAW,OAAO,SAAS,EAAE,KAAK,KAAK,IAAI,QAAQ,EAAE,IAAI;AAC/D,SAAO,EAAE,SAAS,SAAS;AAC7B;AAEA,SAAS,yBAAyB,QAA+B;AAC/D,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO,YAAY,KAAM,OAAM,KAAK,UAAU,KAAK,MAAM,OAAO,OAAO,CAAC,GAAG;AAC/E,MAAI,OAAO,aAAa,KAAM,OAAM,KAAK,WAAW,KAAK,MAAM,OAAO,QAAQ,CAAC,GAAG;AAClF,MAAI,OAAO,YAAY,QAAQ,OAAO,aAAa,MAAM;AACvD,UAAM,QAAkB,CAAC,gBAAgB;AACzC,QAAI,OAAO,YAAY,KAAM,OAAM,KAAK,SAAS,OAAO,QAAQ,QAAQ,CAAC,CAAC,IAAI;AAC9E,QAAI,OAAO,aAAa,KAAM,OAAM,KAAK,UAAU,OAAO,SAAS,QAAQ,CAAC,CAAC,IAAI;AACjF,UAAM,KAAK,UAAU,MAAM,KAAK,GAAG,CAAC,GAAG;AAAA,EACzC;AACA,SAAO,MAAM,SAAS,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC,KAAK;AACpD;AASA,SAAS,sBAAsB,SAAoC;AACjE,QAAM,SAAS,0BAA0B,SAAS,QAAQ,EAAE,CAAC,KAAK;AAClE,MAAI,CAAC,OAAQ,QAAO,EAAE,QAAQ,MAAM,OAAO,KAAK;AAEhD,MAAI,SAAwB;AAC5B,MAAI,QAAuB;AAE3B,QAAM,YAAY,0BAA0B,QAAQ,WAAW,EAAE,CAAC,KAAK;AACvE,QAAM,YAAY,0BAA0B,QAAQ,WAAW,EAAE,CAAC,KAAK;AACvE,QAAM,OAAO,YAAY,0BAA0B,WAAW,WAAW,EAAE,CAAC,KAAK,OAAO;AACxF,QAAM,OAAO,YAAY,0BAA0B,WAAW,WAAW,EAAE,CAAC,KAAK,OAAO;AAExF,QAAM,UAAU,MAAM,aAAa,KAAK,KAAK;AAC7C,QAAM,SAAS,MAAM,aAAa,KAAK,KAAK;AAC5C,QAAM,OAAO,UAAU,OAAO,WAAW,OAAO,IAAI,OAAO;AAC3D,QAAM,MAAM,SAAS,OAAO,WAAW,MAAM,IAAI,OAAO;AAExD,MAAI,OAAO,SAAS,IAAI,EAAG,UAAS,QAAQ,IAAI;AAChD,MAAI,OAAO,SAAS,GAAG,EAAG,SAAQ,QAAQ,GAAG;AAC7C,SAAO,EAAE,QAAQ,MAAM;AACzB;AAEA,SAAS,oBAAoB,SAAkC;AAC7D,QAAM,SAAS,0BAA0B,SAAS,QAAQ,EAAE,CAAC,KAAK;AAClE,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,0BAA0B,QAAQ,YAAY,EAAE,CAAC,EAAG,QAAO;AAC/D,MAAI,0BAA0B,QAAQ,WAAW,EAAE,CAAC,EAAG,QAAO;AAC9D,MAAI,0BAA0B,QAAQ,kBAAkB,EAAE,CAAC,EAAG,QAAO;AACrE,MAAI,0BAA0B,QAAQ,UAAU,EAAE,CAAC,EAAG,QAAO;AAC7D,SAAO;AACT;AAEA,SAAS,gBAAgB,WAAmB,WAA6B,UAAkC;AACzG,MAAI,UAAU,WAAW,QAAQ,UAAU,UAAU,KAAM,QAAO;AAClE,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,UAAU,WAAW,OAAO,QAAQ,UAAU,OAAO,QAAQ,CAAC,CAAC,OAAO;AAAA,IACtE,UAAU,UAAU,OAAO,OAAO,UAAU,MAAM,QAAQ,CAAC,CAAC,OAAO;AAAA,IACnE;AAAA,EACF,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAE5B,MAAI,aAAa,gBAAgB;AAC/B,eAAW,KAAK,eAAe;AAAA,EACjC;AAEA,MAAI,CAAC,UAAU,SAAS,QAAQ,GAAG;AACjC,UAAM,WAAW,WAAW,oBAAoB,QAAQ,MAAM;AAC9D,WAAO,GAAG,SAAS,WAAW,WAAW,KAAK,GAAG,CAAC,yBAAyB,QAAQ;AAAA,EACrF;AAEA,SAAO,UAAU,QAAQ,mBAAmB,CAAC,IAAI,cAAsB;AACrE,UAAM,SAAS,CAAC,WAAW,GAAG,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,GAAG;AAC9E,UAAM,WAAW,WAAW,oBAAoB,QAAQ,MAAM;AAC9D,WAAO,UAAU,MAAM,yBAAyB,QAAQ;AAAA,EAC1D,CAAC;AACH;AAEA,SAAS,gBAAgB,aAAoC;AAC3D,MAAI,CAAC,YAAa,QAAO,CAAC;AAC1B,QAAM,OAAO,SAAS,WAAW;AACjC,QAAM,gBAAgB,oBAAoB,MAAM,cAAc;AAC9D,QAAM,MAAc,CAAC;AACrB,aAAW,OAAO,eAAe;AAC/B,UAAM,KAAK,QAAQ,KAAK,IAAI;AAC5B,UAAM,SAAS,QAAQ,KAAK,QAAQ;AACpC,QAAI,CAAC,MAAM,CAAC,OAAQ;AACpB,QAAI,EAAE,IAAI;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,UAAU,KAAqB;AACtC,QAAM,QAAQ,IAAI,YAAY;AAC9B,MAAI,UAAU,MAAO,QAAO;AAC5B,MAAI,UAAU,SAAS,UAAU,OAAQ,QAAO;AAChD,MAAI,UAAU,MAAO,QAAO;AAC5B,MAAI,UAAU,OAAQ,QAAO;AAC7B,MAAI,UAAU,MAAO,QAAO;AAC5B,MAAI,UAAU,MAAO,QAAO;AAC5B,SAAO;AACT;AAEA,eAAe,kBAAkB,KAAY,QAAgB,KAAqC;AAChG,QAAM,YAAY,OAAO,GAAG;AAC5B,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,aAAa,UAAU,QAAQ,QAAQ,EAAE;AAC/C,QAAM,OAAO,WAAW,WAAW,OAAO,IAAI,aAAa,QAAQ,UAAU;AAC7E,QAAM,OAAO,IAAI,KAAK,IAAI;AAC1B,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,SAAS,MAAM,KAAK,MAAM,QAAQ;AACxC,QAAM,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AACrC,QAAM,OAAO,UAAU,GAAG;AAC1B,SAAO,QAAQ,IAAI,WAAW,MAAM;AACtC;AAEA,SAAS,cAAc,KAA6B;AAClD,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,eAAyB,CAAC;AAEhC,MAAI,iBAAiB,KAAK,GAAG,EAAG,cAAa,KAAK,iBAAiB;AACnE,MAAI,iBAAiB,KAAK,GAAG,EAAG,cAAa,KAAK,mBAAmB;AACrE,MAAI,iBAAiB,KAAK,GAAG,EAAG,cAAa,KAAK,2BAA2B;AAC7E,MAAI,iBAAiB,KAAK,QAAQ,EAAG,cAAa,KAAK,8BAA8B;AAErF,QAAM,QAAQ,iBAAiB,KAAK,OAAO;AAC3C,QAAM,WAAW,QAAQ,OAAO,OAAO,KAAK,QAAQ,OAAO,KAAK;AAChE,MAAI,YAAY,SAAS,YAAY,MAAM,OAAQ,cAAa,KAAK,UAAU,QAAQ,EAAE;AAEzF,QAAM,YAAY,iBAAiB,KAAK,WAAW;AACnD,QAAM,gBAAgB,QAAQ,WAAW,OAAO,KAAK,QAAQ,WAAW,KAAK,KAAK,IAAI,YAAY;AAClG,MAAI,iBAAiB,SAAU,cAAa,KAAK,0BAA0B;AAE3E,QAAM,YAAY,iBAAiB,KAAK,WAAW;AACnD,QAAM,WAAW,QAAQ,WAAW,OAAO,KAAK,QAAQ,WAAW,KAAK,KAAK,IAAI,YAAY;AAC7F,MAAI,YAAY,cAAe,cAAa,KAAK,uCAAuC;AACxF,MAAI,YAAY,YAAa,cAAa,KAAK,qCAAqC;AAEpF,SAAO,aAAa,KAAK,GAAG;AAC9B;AAEA,SAAS,aAAa,WAA8C;AAClE,QAAM,MAAM,iBAAiB,WAAW,KAAK;AAC7C,QAAM,SAAS,MAAM,iBAAiB,KAAK,QAAQ,IAAI;AACvD,QAAM,OAAO,QAAQ,QAAQ,OAAO,KAAK,QAAQ,QAAQ,KAAK,KAAK,IAAI,YAAY;AACnF,MAAI,IAAI,SAAS,UAAU,KAAK,QAAQ,OAAO,QAAQ,YAAa,QAAO;AAC3E,MAAI,IAAI,SAAS,UAAU,KAAK,QAAQ,OAAO,QAAQ,YAAa,QAAO;AAC3E,MAAI,IAAI,SAAS,UAAU,KAAK,QAAQ,OAAO,QAAQ,YAAa,QAAO;AAC3E,SAAO;AACT;AAEA,SAAS,oBAAoB,WAA4B;AACvD,QAAM,MAAM,iBAAiB,WAAW,KAAK;AAC7C,QAAM,KAAK,MAAM,iBAAiB,KAAK,IAAI,IAAI;AAC/C,QAAM,SAAS,QAAQ,IAAI,OAAO,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,YAAY;AAC7E,MAAI,UAAU,YAAY,UAAU,WAAW,UAAU,QAAQ;AAC/D,WAAO,cAAc,KAAK;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,gBAAuC;AAChE,SAAO,mBAAmB,OAAO,KAAK,uBAAuB,cAAc;AAC7E;AAEA,SAAS,kBAAkB,kBAA8C;AACvE,MAAI,CAAC,iBAAkB,QAAO,CAAC;AAC/B,QAAM,eAAe,SAAS,gBAAgB;AAC9C,QAAM,MAAmB,CAAC;AAC1B,QAAM,YAAY,oBAAoB,cAAc,UAAU;AAC9D,aAAW,YAAY,WAAW;AAChC,UAAM,QAAQ,QAAQ,UAAU,MAAM,KAAK,QAAQ,UAAU,IAAI;AACjE,UAAM,QAAQ,QAAQ,OAAO,SAAS,OAAO,EAAE,IAAI,OAAO;AAC1D,QAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,EAAG;AAE3C,UAAM,aAAa,oBAAoB,UAAU,GAAG;AACpD,UAAM,OAAO,WAAW,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC,EAAE,KAAK,OAAO,EAAE,KAAK;AACxE,QAAI,CAAC,KAAM;AACX,QAAI,OAAO,KAAK,CAAC,IAAI;AAAA,EACvB;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,iBAA4C;AACpE,MAAI,CAAC,gBAAiB,QAAO,CAAC;AAC9B,QAAM,cAAc,SAAS,eAAe;AAC5C,QAAM,MAAkB,CAAC;AACzB,QAAM,WAAW,oBAAoB,aAAa,SAAS;AAC3D,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,QAAQ,SAAS,MAAM,KAAK,QAAQ,SAAS,IAAI;AAC/D,QAAI,CAAC,MAAO;AACZ,UAAM,aAAa,oBAAoB,SAAS,GAAG;AACnD,UAAM,OAAO,WAAW,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC,EAAE,KAAK,OAAO,EAAE,KAAK;AACxE,QAAI,CAAC,KAAM;AACX,QAAI,KAAK,IAAI;AAAA,MACX,QAAQ,QAAQ,SAAS,UAAU,KAAK,QAAQ,SAAS,QAAQ;AAAA,MACjE,MAAM,QAAQ,SAAS,QAAQ,KAAK,QAAQ,SAAS,MAAM;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,iBAA6C;AACrE,MAAI,CAAC,gBAAiB,QAAO,CAAC;AAC9B,QAAM,cAAc,SAAS,eAAe;AAC5C,QAAM,MAAmB,CAAC;AAC1B,QAAM,WAAW,oBAAoB,aAAa,SAAS;AAC3D,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,QAAQ,SAAS,MAAM,KAAK,QAAQ,SAAS,IAAI;AAC/D,UAAM,QAAQ,QAAQ,OAAO,SAAS,OAAO,EAAE,IAAI,OAAO;AAC1D,QAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,EAAG;AAE3C,UAAM,aAAa,oBAAoB,SAAS,GAAG;AACnD,UAAM,OAAO,WAAW,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC,EAAE,KAAK,OAAO,EAAE,KAAK;AACxE,QAAI,CAAC,KAAM;AACX,QAAI,OAAO,KAAK,CAAC,IAAI;AAAA,EACvB;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,SAAmB,cAAmC;AACpF,QAAM,OAAO,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,aAAa,EAAE,CAAC;AAClE,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,QAAM,QAAQ,KACX,IAAI,CAAC,OAAO,yBAAyB,EAAE,4BAA4B,EAAE,KAAK,aAAa,EAAE,CAAC,OAAO,EACjG,KAAK,EAAE;AACV,SAAO,6CAA6C,KAAK;AAC3D;AAEA,SAAS,sBAAsB,SAAmB,aAAiC;AACjF,QAAM,OAAO,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,YAAY,EAAE,CAAC;AACjE,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,QAAM,QAAQ,KACX,IAAI,CAAC,OAAO;AACX,UAAM,OAAO,YAAY,EAAE;AAC3B,UAAM,OAAO,CAAC,KAAK,UAAU,IAAI,KAAK,QAAQ,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,QAAK;AACxF,UAAM,WAAW,OAAO,mCAAmC,WAAW,IAAI,CAAC,WAAW;AACtF,WAAO,wBAAwB,EAAE,2BAA2B,EAAE,KAAK,QAAQ,QAAQ,KAAK,IAAI;AAAA,EAC9F,CAAC,EACA,KAAK,EAAE;AACV,SAAO,4CAA4C,KAAK;AAC1D;AAEA,SAAS,sBAAsB,SAAmB,aAAkC;AAClF,QAAM,OAAO,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,YAAY,EAAE,CAAC;AACjE,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,QAAM,QAAQ,KACX,IAAI,CAAC,OAAO,wBAAwB,EAAE,2BAA2B,EAAE,KAAK,YAAY,EAAE,CAAC,OAAO,EAC9F,KAAK,EAAE;AACV,SAAO,4CAA4C,KAAK;AAC1D;AAEA,eAAe,gBACb,KACA,QACA,WACA,gBACA,cACA,iBACA,aACA,gBACA,aACA,gBACiB;AACjB,QAAM,MAAM,aAAa,SAAS;AAClC,QAAM,aAAa,oBAAoB,SAAS;AAChD,QAAM,WAAW,kBAAkB,cAAc;AACjD,QAAM,OAAO,oBAAoB,WAAW,GAAG;AAC/C,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,IAAI,GAAG,GAAG,QAAQ,GAAG,aAAa,WAAW,UAAU,MAAM,EAAE,WAAW,GAAG;AAAA,EACtF;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,yBAAyB,oBAAoB,WAAW,uBAAuB,EAAE;AACvF,WAAS,IAAI,GAAG,IAAI,wBAAwB,KAAK,GAAG;AAClD,UAAM,KAAK,gFAAgF;AAAA,EAC7F;AACA,aAAW,OAAO,MAAM;AACtB,UAAM,MAAM,iBAAiB,KAAK,KAAK;AACvC,UAAM,MAAM,cAAc,GAAG;AAE7B,UAAM,cAAc,iBAAiB,KAAK,mBAAmB;AAC7D,UAAM,aAAa,QAAQ,aAAa,MAAM,KAAK,QAAQ,aAAa,IAAI;AAC5E,QAAI,cAAc,aAAa,UAAU,GAAG;AAC1C,sBAAgB,KAAK,UAAU;AAC/B,YAAM;AAAA,QACJ,gCAAgC,UAAU,6BAA6B,UAAU,MAAM,UAAU;AAAA,MACnG;AACA;AAAA,IACF;AAEA,UAAM,aAAa,iBAAiB,KAAK,kBAAkB;AAC3D,UAAM,YAAY,QAAQ,YAAY,MAAM,KAAK,QAAQ,YAAY,IAAI;AACzE,QAAI,aAAa,YAAY,SAAS,GAAG;AACvC,qBAAe,KAAK,SAAS;AAC7B,YAAM;AAAA,QACJ,+BAA+B,SAAS,4BAA4B,SAAS,MAAM,SAAS;AAAA,MAC9F;AACA;AAAA,IACF;AAEA,UAAM,aAAa,iBAAiB,KAAK,kBAAkB;AAC3D,UAAM,YAAY,QAAQ,YAAY,MAAM,KAAK,QAAQ,YAAY,IAAI;AACzE,QAAI,aAAa,YAAY,SAAS,GAAG;AACvC,qBAAe,KAAK,SAAS;AAC7B,YAAM;AAAA,QACJ,+BAA+B,SAAS,4BAA4B,SAAS,OAAO,SAAS;AAAA,MAC/F;AACA;AAAA,IACF;AAEA,UAAM,UAAU,iBAAiB,KAAK,SAAS;AAC/C,QAAI,SAAS;AACX,YAAM,OAAO,iBAAiB,SAAS,MAAM;AAC7C,YAAM,MAAM,QAAQ,MAAM,SAAS,KAAK,QAAQ,MAAM,OAAO;AAC7D,UAAI,KAAK;AACP,cAAM,MAAM,MAAM,kBAAkB,KAAK,QAAQ,GAAG;AACpD,YAAI,KAAK;AACP,gBAAM,YAAY,mBAAmB,OAAO;AAC5C,gBAAM,iBAAiB,yBAAyB,SAAS;AACzD,gBAAM,YAAY,sBAAsB,OAAO;AAC/C,gBAAM,WAAW,oBAAoB,OAAO;AAC5C,gBAAM,QAAQ,gBAAgB,gBAAgB,WAAW,QAAQ;AACjE,gBAAM,KAAK,aAAa,GAAG,qBAAqB,KAAK,IAAI;AACzD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,oBAAoB,KAAK,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE;AACnF,UAAM,WAAW,oBAAoB,KAAK,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE;AAC5F,UAAM,UAAU,oBAAoB,KAAK,IAAI;AAC7C,UAAM,iBAAiB,QAAQ,OAAO,CAAC,SAAS;AAC9C,YAAM,QAAQ,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,MAAM,KAAK,IAAI,YAAY;AAClF,aAAO,SAAS;AAAA,IAClB,CAAC,EAAE;AACH,UAAM,iBAAiB,KAAK,IAAI,GAAG,QAAQ,SAAS,cAAc;AAClE,UAAMA,WAAU,GAAG,WAAW,SAAS,QAAQ,CAAC,GAAG,QAAQ,OAAO,cAAc,CAAC;AACjF,QAAI,CAACA,SAAS;AAEd,QAAI,eAAqC;AACzC,QAAI,SAAyB;AAC7B,WAAO,QAAQ;AACb,UAAI,OAAO,cAAc,OAAO;AAC9B,uBAAe;AACf;AAAA,MACF;AACA,UAAI,OAAO,cAAc,OAAO;AAC9B,uBAAe;AACf;AAAA,MACF;AACA,UAAI,OAAO,cAAc,IAAK;AAC9B,eAAS,OAAO;AAAA,IAClB;AACA,QAAI,KAAK;AACP,YAAM,OAAO,gBAAgB,GAAG,KAAKA,QAAO;AAC5C,UAAI,cAAc;AAChB,cAAMC,OAAM,iBAAiB,QAAQ,QAAQ;AAC7C,cAAM,KAAK,IAAIA,IAAG,wBAAwB,YAAY,KAAK,IAAI,KAAKA,IAAG,GAAG;AAAA,MAC5E,OAAO;AACL,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF,OAAO;AACL,UAAI,cAAc;AAChB,cAAMA,OAAM,iBAAiB,QAAQ,QAAQ;AAC7C,cAAM,KAAK,IAAIA,IAAG,wBAAwB,YAAY,KAAKD,QAAO,KAAKC,IAAG,GAAG;AAAA,MAC/E,OAAO;AACL,cAAM,KAAKD,QAAO;AAAA,MACpB;AAAA,IACF;AAEA,aAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK,GAAG;AAC1C,YAAM,KAAK,gFAAgF;AAAA,IAC7F;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,KAAK,EAAE,KAAK;AAClC,SAAO,IAAI,GAAG,GAAG,QAAQ,GAAG,aAAa,WAAW,UAAU,MAAM,EAAE,IAAI,OAAO,KAAK,GAAG;AAC3F;AAEA,SAAS,QAAQ,KAAsB;AACrC,QAAM,OAAO,oBAAoB,KAAK,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE;AAClF,QAAM,UAAU,oBAAoB,KAAK,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE;AAC3F,QAAM,UAAU,oBAAoB,KAAK,IAAI,EAAE;AAC/C,SAAO,GAAG,WAAW,QAAQ,OAAO,CAAC,GAAG,QAAQ,OAAO,OAAO,CAAC;AACjE;AAEA,SAAS,cAAc,WAA4B;AACjD,QAAM,OAAO,oBAAoB,WAAW,GAAG;AAC/C,QAAM,UAAU,KAAK,IAAI,CAAC,QAAQ,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE;AACvD,SAAO,WAAW;AACpB;AAEA,SAAS,gBAAgB,IAAqB;AAC5C,QAAM,OAAO,0BAA0B,IAAI,MAAM,EAAE,CAAC,KAAK;AACzD,QAAM,WAAW,OAAO,0BAA0B,MAAM,UAAU,EAAE,CAAC,KAAK,OAAO;AACjF,QAAM,SAAS,QAAQ,UAAU,OAAO,KAAK,QAAQ,UAAU,KAAK;AACpE,QAAM,SAAS,SAAS,OAAO,SAAS,QAAQ,EAAE,IAAI,OAAO;AAC7D,SAAO,OAAO,SAAS,MAAM,KAAK,SAAS,IAAI,SAAS;AAC1D;AAEA,SAAS,cAAc,IAA8C;AACnE,QAAM,OAAO,0BAA0B,IAAI,MAAM,EAAE,CAAC,KAAK;AACzD,QAAM,SAAS,OAAO,0BAA0B,MAAM,QAAQ,EAAE,CAAC,KAAK,OAAO;AAC7E,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,UAAU,QAAQ,QAAQ,OAAO,KAAK,QAAQ,QAAQ,KAAK,KAAK,YAAY,YAAY;AAC9F,SAAO,WAAW,YAAY,YAAY;AAC5C;AAEA,SAAS,cAAc,MAAe,mBAAiD;AACrF,QAAM,SAAmB,CAAC;AAC1B,aAAW,SAAS,MAAM,KAAK,KAAK,QAAQ,GAAG;AAC7C,QAAI,MAAM,cAAc,OAAQ;AAChC,QAAI,MAAM,cAAc,KAAK;AAC3B,YAAM,iBAAiB,kBAAkB,IAAI,KAAK,KAAK;AACvD,aAAO,KAAK,KAAK,kBAAkB,cAAc,CAAC,IAAI,cAAc,KAAK,CAAC,MAAM;AAChF;AAAA,IACF;AACA,QAAI,MAAM,cAAc,OAAO;AAC7B,aAAO,KAAK,YAAY,OAAO,iBAAiB,CAAC;AACjD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,EAAG,QAAO,OAAO,KAAK,EAAE;AAC5C,QAAM,OAAO,oBAAoB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK;AAC1F,SAAO,WAAW,IAAI,KAAK;AAC7B;AAEA,SAAS,YAAY,OAAgB,mBAAiD;AACpF,QAAM,OAAO,0BAA0B,OAAO,IAAI;AAUlD,QAAM,cAAc,oBAAI,IAAyB;AACjD,QAAM,aAA4B,CAAC;AACnC,MAAI,eAAe;AAEnB,QAAM,WAAW,KAAK,IAAI,CAAC,KAAK,aAAa;AAC3C,UAAM,cAAc,0BAA0B,KAAK,IAAI;AACvD,UAAM,YAAY,oBAAI,IAAiB;AACvC,UAAM,eAAyB,CAAC;AAChC,QAAI,YAAY;AAEhB,eAAW,QAAQ,aAAa;AAC9B,YAAM,UAAU,gBAAgB,IAAI;AACpC,YAAM,SAAS,cAAc,IAAI;AAEjC,UAAI,WAAW,YAAY;AACzB,cAAM,gBAAgB,MAAM,KAAK,IAAI,IAAI,YAAY,OAAO,CAAC,CAAC,EAC3D,OAAO,CAACE,YAAW,CAAC,UAAU,IAAIA,OAAM,CAAC,EACzC,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AACzC,cAAM,SACJ,cAAc,KAAK,CAAC,SAAS,KAAK,YAAY,SAAS,KACvD,cAAc,CAAC,KACf;AACF,YAAI,QAAQ;AACV,iBAAO,WAAW;AAClB,oBAAU,IAAI,MAAM;AACpB,sBAAY,OAAO,WAAW,OAAO;AAAA,QACvC;AACA;AAAA,MACF;AAEA,aAAO,YAAY,IAAI,SAAS,GAAG;AACjC,qBAAa;AAAA,MACf;AAEA,YAAM,OAAO,cAAc,MAAM,iBAAiB;AAClD,YAAM,QAAkB,CAAC;AACzB,UAAI,WAAW,WAAW;AACxB,cAAM,SAAsB;AAAA,UAC1B,IAAI,IAAI,YAAY;AAAA,UACpB,UAAU;AAAA,UACV;AAAA,UACA,SAAS;AAAA,UACT,YAAY;AAAA,QACd;AACA,wBAAgB;AAChB,mBAAW,KAAK,MAAM;AACtB,iBAAS,IAAI,GAAG,IAAI,SAAS,KAAK,GAAG;AACnC,sBAAY,IAAI,YAAY,GAAG,MAAM;AAAA,QACvC;AACA,cAAM,KAAK,uBAAuB,OAAO,EAAE,GAAG;AAAA,MAChD;AAEA,UAAI,UAAU,EAAG,OAAM,KAAK,YAAY,OAAO,GAAG;AAClD,mBAAa;AAAA,QACX,MAAM,MAAM,SAAS,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,sDAAsD,IAAI;AAAA,MAC/G;AACA,mBAAa;AAAA,IACf;AAEA,eAAW,UAAU,MAAM,KAAK,IAAI,IAAI,YAAY,OAAO,CAAC,CAAC,GAAG;AAC9D,UAAI,OAAO,aAAa,YAAY,CAAC,UAAU,IAAI,MAAM,GAAG;AAC1D,iBAAS,IAAI,GAAG,IAAI,OAAO,SAAS,KAAK,GAAG;AAC1C,sBAAY,OAAO,OAAO,WAAW,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,OAAO,aAAa,KAAK,EAAE,CAAC;AAAA,EACrC,CAAC;AAED,MAAI,SAAS,SAAS,KAAK,EAAE;AAC7B,aAAW,UAAU,YAAY;AAC/B,UAAM,SAAS,uBAAuB,OAAO,EAAE;AAC/C,UAAM,cAAc,OAAO,UAAU,IAAI,YAAY,OAAO,OAAO,MAAM;AACzE,aAAS,OAAO,QAAQ,QAAQ,WAAW,EAAE,QAAQ,WAAW,GAAG;AAAA,EACrE;AAEA,SAAO,gGAAgG,MAAM;AAC/G;AAEA,eAAsB,wBAAwB,MAA6B;AACzE,QAAM,mBAAoB,KAAiE;AAC3F,QAAM,SAAS,mBAAmB,MAAM,iBAAiB,KAAK,IAAI,IAAI,MAAM,IAAI,SAAS,IAAI,EAAE,YAAY;AAC3G,QAAM,MAAM,MAAM,aAAAC,QAAM,UAAU,MAAM;AAExC,QAAM,kBAAkB,MAAM,IAAI,KAAK,mBAAmB,GAAG,MAAM,QAAQ;AAC3E,MAAI,CAAC,iBAAiB;AACpB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACA,QAAM,WAAW,MAAM,IAAI,KAAK,8BAA8B,GAAG,MAAM,QAAQ;AAC/E,QAAM,gBAAgB,MAAM,IAAI,KAAK,oBAAoB,GAAG,MAAM,QAAQ;AAC1E,QAAM,eAAe,MAAM,IAAI,KAAK,mBAAmB,GAAG,MAAM,QAAQ;AACxE,QAAM,eAAe,MAAM,IAAI,KAAK,mBAAmB,GAAG,MAAM,QAAQ;AACxE,QAAM,SAAS,gBAAgB,YAAY,IAAI;AAC/C,QAAM,eAAe,kBAAkB,iBAAiB,IAAI;AAC5D,QAAM,cAAc,iBAAiB,gBAAgB,IAAI;AACzD,QAAM,cAAc,iBAAiB,gBAAgB,IAAI;AACzD,QAAM,kBAA4B,CAAC;AACnC,QAAM,iBAA2B,CAAC;AAClC,QAAM,iBAA2B,CAAC;AAClC,QAAM,cAAc,SAAS,eAAe;AAC5C,QAAM,OAAO,iBAAiB,aAAa,MAAM;AACjD,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,mBAAmB;AAAA,EACrC;AAEA,QAAM,oBAAoB,oBAAI,IAAqB;AACnD,sBAAoB,aAAa,GAAG,EAAE,QAAQ,CAAC,WAAW,UAAU;AAClE,sBAAkB,IAAI,WAAW,KAAK;AAAA,EACxC,CAAC;AAED,QAAM,YAAsB,CAAC;AAC7B,aAAW,SAAS,MAAM,KAAK,KAAK,QAAQ,GAAG;AAC7C,QAAI,MAAM,cAAc,SAAU;AAClC,QAAI,MAAM,cAAc,KAAK;AAC3B,YAAM,iBAAiB,kBAAkB,IAAI,KAAK,KAAK;AACvD,gBAAU;AAAA,QACR,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,MAAM,cAAc,OAAO;AAC7B,gBAAU,KAAK,YAAY,OAAO,iBAAiB,CAAC;AACpD;AAAA,IACF;AAAA,EACF;AAEA,YAAU,KAAK,uBAAuB,iBAAiB,YAAY,CAAC;AACpE,YAAU,KAAK,sBAAsB,gBAAgB,WAAW,CAAC;AACjE,YAAU,KAAK,sBAAsB,gBAAgB,WAAW,CAAC;AACjE,SAAO,kBAAkB,UAAU,KAAK,IAAI,CAAC;AAC/C;;;ACtpBA,SAAS,WAAW,OAAuB;AACzC,SAAO,MAAM,WAAW,KAAK,OAAO,EAAE,WAAW,KAAK,QAAQ;AAChE;AAEA,eAAe,cAAc,MAA6B;AACxD,QAAM,SAAS,MAAM,IAAI,SAAS,IAAI,EAAE,YAAY;AACpD,QAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,MAAI,SAAS;AACb,aAAW,KAAK,MAAO,WAAU,OAAO,aAAa,CAAC;AACtD,QAAM,SAAS,KAAK,MAAM;AAC1B,QAAM,OAAO,KAAK,QAAQ;AAC1B,SAAO,QAAQ,IAAI,WAAW,MAAM;AACtC;AAEA,SAAS,mBAAmB,KAAsB;AAChD,QAAM,aAAa,IAAI,KAAK,EAAE,YAAY;AAC1C,SACE,WAAW,WAAW,OAAO,KAC7B,WAAW,WAAW,OAAO,KAC7B,WAAW,WAAW,MAAM,KAC5B,WAAW,WAAW,QAAQ,KAC9B,WAAW,WAAW,UAAU,KAChC,WAAW,WAAW,aAAa;AAEvC;AAEA,eAAe,wBAAwB,SAAiB,YAAqC;AAC3F,MAAI,CAAC,QAAQ,KAAK,KAAK,WAAW,WAAW,EAAG,QAAO;AAEvD,QAAM,SAAS,IAAI,UAAU;AAC7B,QAAM,MAAM,OAAO,gBAAgB,SAAS,WAAW;AACvD,QAAM,SAAS,MAAM,KAAK,IAAI,iBAAiB,KAAK,CAAC;AAErD,QAAM,sBAAsB,MAAM,QAAQ,IAAI,WAAW,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC,CAAC;AAC3F,MAAI,mBAAmB;AAEvB,aAAW,OAAO,QAAQ;AACxB,UAAM,MAAM,IAAI,aAAa,KAAK,KAAK;AACvC,QAAI,mBAAmB,GAAG,KAAK,mBAAmB,oBAAoB,QAAQ;AAC5E,UAAI,aAAa,OAAO,oBAAoB,gBAAgB,CAAC;AAC7D,0BAAoB;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,IAAI,KAAK;AAClB;AAEA,eAAe,mBAAmB,YAAqC;AACrE,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,QAAM,OAAO,MAAM,QAAQ,IAAI,WAAW,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC,CAAC;AACtE,SAAO,KAAK,IAAI,CAAC,QAAQ,gBAAgB,WAAW,GAAG,CAAC,gCAAgC,EAAE,KAAK,IAAI;AACrG;AAQA,eAAsB,iCAAiC,cAAmD;AACxG,QAAM,OAAO,aAAa,QAAQ,WAAW,KAAK;AAClD,QAAM,OAAO,aAAa,QAAQ,YAAY,KAAK;AAEnD,QAAM,aAAa,MAAM,KAAK,aAAa,KAAK,EAC7C,OAAO,CAAC,SAAS,KAAK,SAAS,UAAU,KAAK,KAAK,WAAW,QAAQ,CAAC,EACvE,IAAI,CAAC,SAAS,KAAK,UAAU,CAAC,EAC9B,OAAO,CAAC,SAAuB,SAAS,IAAI;AAE/C,QAAM,eAAe,MAAM,wBAAwB,MAAM,UAAU;AACnE,QAAM,YAAY,aAAa,KAAK,IAAI,eAAe,MAAM,mBAAmB,UAAU;AAE1F,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,0BAA0B,OAA+C;AAC7F,MAAI,OAAO;AACX,MAAI,OAAO;AACX,QAAM,aAAqB,CAAC;AAE5B,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,MAAM,SAAS,WAAW,KAAK,CAAC,MAAM;AAC7C,YAAM,OAAO,MAAM,KAAK,QAAQ,WAAW;AAC3C,aAAO,MAAM,KAAK,KAAK;AAAA,IACzB;AACA,QAAI,KAAK,MAAM,SAAS,YAAY,KAAK,CAAC,MAAM;AAC9C,YAAM,OAAO,MAAM,KAAK,QAAQ,YAAY;AAC5C,aAAO,MAAM,KAAK,KAAK;AAAA,IACzB;AAEA,eAAW,QAAQ,KAAK,OAAO;AAC7B,UAAI,CAAC,KAAK,WAAW,QAAQ,EAAG;AAChC,YAAM,OAAO,MAAM,KAAK,QAAQ,IAAI;AACpC,YAAM,OAAO,aAAa,KAAK,IAAI,CAAC,IAAI,WAAW,MAAM,IAAI,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,KAAK;AACxF,iBAAW,KAAK,IAAI,KAAK,CAAC,IAAI,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,eAAe,MAAM,wBAAwB,MAAM,UAAU;AACnE,QAAM,YAAY,aAAa,KAAK,IAAI,eAAe,MAAM,mBAAmB,UAAU;AAE1F,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;;;ACxGA,SAAS,WAAW,WAAwC;AAC1D,QAAM,MAAM,oBAAI,IAAoB;AACpC,aAAW,OAAO,UAAU,MAAM,GAAG,GAAG;AACtC,UAAM,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,MAAM,GAAG;AAC3C,UAAM,MAAM,QAAQ,KAAK,EAAE,YAAY;AACvC,UAAM,QAAQ,SAAS,KAAK,GAAG,EAAE,KAAK;AACtC,QAAI,CAAC,OAAO,CAAC,MAAO;AACpB,QAAI,IAAI,KAAK,KAAK;AAAA,EACpB;AACA,SAAO;AACT;AAEA,SAAS,eAAe,UAAuC;AAC7D,SAAO,MAAM,KAAK,SAAS,QAAQ,CAAC,EACjC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,EAC5B,KAAK,IAAI;AACd;AAEA,SAAS,iBAAiB,UAAqC;AAC7D,QAAM,eAAwC;AAAA,IAC5C,CAAC,sBAAsB,WAAW;AAAA,IAClC,CAAC,sBAAsB,WAAW;AAAA,IAClC,CAAC,uBAAuB,WAAW;AAAA,IACnC,CAAC,sBAAsB,YAAY;AAAA,IACnC,CAAC,yBAAyB,eAAe;AAAA,IACzC,CAAC,uBAAuB,aAAa;AAAA,IACrC,CAAC,wBAAwB,cAAc;AAAA,IACvC,CAAC,uBAAuB,aAAa;AAAA,EACvC;AAEA,aAAW,CAAC,QAAQ,MAAM,KAAK,cAAc;AAC3C,UAAM,QAAQ,SAAS,IAAI,MAAM;AACjC,QAAI,CAAC,MAAO;AACZ,QAAI,CAAC,SAAS,IAAI,MAAM,GAAG;AACzB,eAAS,IAAI,QAAQ,KAAK;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,UAAU,SAAS,IAAI,gBAAgB;AAC7C,MAAI,WAAW,CAAC,SAAS,IAAI,OAAO,GAAG;AACrC,aAAS,IAAI,SAAS,OAAO;AAAA,EAC/B;AAEA,MAAI,SAAS,IAAI,kBAAkB,KAAK,CAAC,SAAS,IAAI,aAAa,GAAG;AACpE,aAAS,IAAI,eAAe,GAAG;AAAA,EACjC;AACA,MAAI,SAAS,IAAI,kBAAkB,KAAK,CAAC,SAAS,IAAI,cAAc,GAAG;AACrE,aAAS,IAAI,gBAAgB,GAAG;AAAA,EAClC;AACF;AAEA,SAAS,kBAAkB,IAAiB,UAAqC;AAC/E,QAAM,aAAa,GAAG,aAAa,OAAO,KAAK,IAAI,YAAY;AAC/D,QAAM,UAAU,SAAS,IAAI,UAAU,KAAK;AAC5C,QAAM,YAAY,UAAU,SAAS,SAAS,KAAK,QAAQ,SAAS;AACpE,MAAI,CAAC,UAAW;AAEhB,MAAI,CAAC,SAAS,IAAI,aAAa,GAAG;AAChC,aAAS,IAAI,eAAe,GAAG;AAAA,EACjC;AAEA,QAAM,aAAa,SAAS,IAAI,aAAa;AAC7C,MAAI,cAAc,CAAC,SAAS,IAAI,cAAc,GAAG;AAC/C,aAAS,IAAI,gBAAgB,UAAU;AAAA,EACzC;AACF;AAEA,SAAS,yBAAyB,IAAiB,UAAqC;AACtF,QAAM,MAAM,GAAG,QAAQ,YAAY;AAEnC,MAAI,QAAQ,SAAS;AACnB,QAAI,CAAC,SAAS,IAAI,iBAAiB,GAAG;AACpC,eAAS,IAAI,mBAAmB,UAAU;AAAA,IAC5C;AACA,QAAI,CAAC,SAAS,IAAI,gBAAgB,GAAG;AACnC,eAAS,IAAI,kBAAkB,GAAG;AAAA,IACpC;AAAA,EACF;AAEA,OAAK,QAAQ,QAAQ,QAAQ,SAAS,CAAC,SAAS,IAAI,gBAAgB,GAAG;AACrE,aAAS,IAAI,kBAAkB,KAAK;AAAA,EACtC;AAEA,MAAI,QAAQ,OAAO,CAAC,SAAS,IAAI,YAAY,GAAG;AAC9C,aAAS,IAAI,cAAc,KAAK;AAAA,EAClC;AACF;AAEA,SAAS,6BAA6B,KAAqB;AACzD,QAAM,aAAa,MAAM,KAAK,IAAI,iBAAiB,GAAG,CAAC;AACvD,aAAW,KAAK,YAAY;AAC1B,UAAM,QAAQ,EAAE,eAAe,IAAI,QAAQ,WAAW,GAAG,EAAE,KAAK;AAChE,UAAM,qBAAqB,EAAE,cAAc,yBAAyB,MAAM;AAC1E,QAAI,CAAC,sBAAsB,KAAK,WAAW,GAAG;AAC5C,QAAE,YAAY;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,KAAe,SAAuC;AACjF,QAAM,OAAO,IAAI;AACjB,MAAI,CAAC,KAAM;AAEX,MAAI,SAAS,qBAAqB;AAChC,SAAK,MAAM,aAAa,QAAQ;AAAA,EAClC;AAEA,MAAI,SAAS,wBAAwB;AACnC,UAAM,WAAW,MAAM,KAAK,IAAI,iBAAiB,mBAAmB,CAAC;AACrE,eAAW,WAAW,UAAU;AAC9B,MAAC,QAAwB,MAAM,aAAa,QAAQ;AAAA,IACtD;AAAA,EACF;AACF;AAEO,SAAS,2BAA2B,KAAe,SAAuC;AAC/F,QAAM,WAAW,MAAM,KAAK,IAAI,iBAAiB,0CAA0C,CAAC;AAE5F,aAAW,MAAM,UAAU;AACzB,UAAM,SAAS;AACf,UAAM,WAAW,OAAO,aAAa,OAAO,KAAK;AACjD,UAAM,WAAW,WAAW,QAAQ;AAEpC,qBAAiB,QAAQ;AACzB,sBAAkB,QAAQ,QAAQ;AAClC,6BAAyB,QAAQ,QAAQ;AAEzC,QAAI,SAAS,OAAO,GAAG;AACrB,aAAO,aAAa,SAAS,eAAe,QAAQ,CAAC;AAAA,IACvD;AAAA,EACF;AAEA,+BAA6B,GAAG;AAChC,sBAAoB,KAAK,OAAO;AAClC;;;AC3IA,IAAAC,gBAAkB;AAyElB,IAAM,mBAA6D;AAAA,EACjE,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,iBAAiB,CAAC;AAAA,EAClB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,mBAAmB,CAAC;AAAA,EACpB,kBAAkB;AAAA,EAClB,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,uCAAuC;AACzC;AAEO,SAAS,+BAA+B,iBAAiB,YAA8B;AAC5F,SAAO;AAAA,IACL;AAAA,IACA,GAAG;AAAA,IACH,mBAAmB,CAAC;AAAA,EACtB;AACF;AAEA,SAAS,SAAS,MAAsB;AACtC,SAAO,OAAO;AAChB;AAEA,SAASC,SAAQ,MAAsB,MAA6B;AAClE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,aAAa,IAAI;AAC/B;AAEA,SAAS,YAAY,MAAsB,MAA6B;AACtE,QAAM,MAAMA,SAAQ,MAAM,IAAI;AAC9B,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,OAAO,WAAW,GAAG;AACpC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAASC,kBAAiB,MAAkB,WAAmC;AAC7E,QAAM,MAAM,MAAM,KAAK,KAAK,iBAAiB,GAAG,CAAC;AACjD,SAAO,IAAI,KAAK,CAAC,OAAO,GAAG,cAAc,SAAS,KAAK;AACzD;AAEA,SAASC,qBAAoB,MAAkB,WAA8B;AAC3E,QAAM,MAAM,MAAM,KAAK,KAAK,iBAAiB,GAAG,CAAC;AACjD,SAAO,IAAI,OAAO,CAAC,OAAO,GAAG,cAAc,SAAS;AACtD;AAEA,SAASC,UAAS,SAA2B;AAC3C,QAAM,SAAS,IAAI,UAAU;AAC7B,SAAO,OAAO,gBAAgB,SAAS,iBAAiB;AAC1D;AAEA,SAAS,kBAAkB,aAKzB;AACA,QAAM,SAASF,kBAAiB,aAAa,QAAQ;AACrD,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,aAAa;AAAA,MACb,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,OAAOC,qBAAoB,QAAQ,MAAM,EAAE,CAAC,KAAK;AACvD,QAAM,QAAQA,qBAAoB,QAAQ,OAAO,EAAE,CAAC,KAAK;AACzD,QAAM,QAAQ,YAAY,MAAM,KAAK,KAAK,YAAY,MAAM,GAAG,KAAK;AACpE,QAAM,QAAQ,YAAY,MAAM,KAAK,KAAK,YAAY,MAAM,GAAG,KAAK;AACpE,QAAM,OAAO,YAAY,OAAO,QAAQ,KAAK,YAAY,OAAO,MAAM,KAAK;AAC3E,QAAM,QAAQ,YAAY,OAAO,SAAS,KAAK,YAAY,OAAO,OAAO,KAAK;AAC9E,QAAM,MAAM,YAAY,OAAO,OAAO,KAAK,YAAY,OAAO,KAAK,KAAK;AACxE,QAAM,SAAS,YAAY,OAAO,UAAU,KAAK,YAAY,OAAO,QAAQ,KAAK;AAEjF,SAAO;AAAA,IACL,gBAAgB,UAAU,OAAO,OAAO,SAAS,QAAQ,OAAO,KAAK;AAAA,IACrE,cAAc,UAAU,OAAO,OAAO,SAAS,KAAK;AAAA,IACpD,aAAa,QAAQ,OAAO,OAAO,SAAS,GAAG;AAAA,IAC/C,gBAAgB,WAAW,OAAO,OAAO,SAAS,MAAM;AAAA,EAC1D;AACF;AAEA,SAAS,8BAA8B,aAA2D;AAChG,QAAM,aAAaA,qBAAoB,aAAa,GAAG;AACvD,aAAW,aAAa,YAAY;AAClC,UAAM,MAAMA,qBAAoB,WAAW,KAAK,EAAE,CAAC,KAAK;AACxD,QAAI,CAAC,IAAK;AAEV,UAAM,SAASA,qBAAoB,KAAK,QAAQ,EAAE,CAAC,KAAK;AACxD,UAAM,WAAWF,SAAQ,QAAQ,OAAO,KAAKA,SAAQ,QAAQ,KAAK,KAAK;AACvE,UAAM,YAAY,aAAa,OAAO,SAAS,YAAY,EAAE,SAAS,SAAS;AAC/E,QAAI,CAAC,UAAW;AAEhB,UAAM,KAAKE,qBAAoB,KAAK,IAAI,EAAE,CAAC,KAAK;AAChD,UAAM,YAAYF,SAAQ,IAAI,OAAO,KAAKA,SAAQ,IAAI,KAAK,KAAK,IAAI,YAAY;AAChF,QAAI,aAAa,SAAU,QAAO;AAClC,QAAI,aAAa,QAAS,QAAO;AACjC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,WAA4B;AACtD,QAAM,YAAYE,qBAAoB,WAAW,GAAG;AACpD,SAAO,UAAU,IAAI,CAAC,SAAS,KAAK,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK;AACvE;AAEA,SAAS,oBAAoB,WAAiD;AAC5E,QAAM,MAAMA,qBAAoB,WAAW,KAAK,EAAE,CAAC,KAAK;AACxD,QAAM,KAAK,MAAMA,qBAAoB,KAAK,IAAI,EAAE,CAAC,KAAK,OAAO;AAC7D,QAAM,YAAYF,SAAQ,IAAI,OAAO,KAAKA,SAAQ,IAAI,KAAK,KAAK,IAAI,YAAY;AAChF,MAAI,aAAa,SAAU,QAAO;AAClC,MAAI,aAAa,QAAS,QAAO;AACjC,SAAO;AACT;AAEA,SAAS,wBAAwB,aAK/B;AACA,QAAM,aAAaE,qBAAoB,aAAa,GAAG;AACvD,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,MACL,kBAAkB;AAAA,MAClB,0BAA0B;AAAA,MAC1B,4BAA4B;AAAA,MAC5B,uCAAuC;AAAA,IACzC;AAAA,EACF;AAEA,MAAI,oBAAoB;AACxB,WAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAClD,QAAI,mBAAmB,WAAW,CAAC,CAAC,EAAE,SAAS,GAAG;AAChD,0BAAoB;AACpB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,oBAAoB,GAAG;AACzB,WAAO;AAAA,MACL,kBAAkB;AAAA,MAClB,0BAA0B;AAAA,MAC1B,4BAA4B;AAAA,MAC5B,uCAAuC;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,gBAAgB,WAAW,iBAAiB;AAClD,QAAM,WAAW,mBAAmB,aAAa;AACjD,QAAM,gBAAgB,gCAAgC,KAAK,QAAQ;AACnE,QAAM,QAAQ,oBAAoB,aAAa;AAE/C,MAAI,gBAAgB;AACpB,WAAS,IAAI,oBAAoB,GAAG,KAAK,GAAG,KAAK,GAAG;AAClD,QAAI,mBAAmB,WAAW,CAAC,CAAC,EAAE,WAAW,GAAG;AAClD,uBAAiB;AACjB;AAAA,IACF;AACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,kBAAkB,gBAAgB,WAAW;AAAA,IAC7C,0BAA0B,iBAAiB,UAAU;AAAA,IACrD,4BAA4B,gBAAgB,oBAAoB;AAAA,IAChE,uCAAuC,gBAAgB,gBAAgB;AAAA,EACzE;AACF;AAQA,SAAS,MAAM,OAAqC;AAClD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI,OAAO,SAAS,OAAO,EAAE;AACnC,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;AAEA,SAAS,kBAAkB,cAAgE;AACzF,QAAM,WAAW,oBAAI,IAAgC;AACrD,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,cAAc,oBAAI,IAA6C;AACrE,QAAM,eAAeA,qBAAoB,cAAc,aAAa;AACpE,aAAW,OAAO,cAAc;AAC9B,UAAM,QAAQ,MAAMF,SAAQ,KAAK,iBAAiB,KAAKA,SAAQ,KAAK,eAAe,CAAC;AACpF,QAAI,UAAU,KAAM;AAEpB,UAAM,WAAWE,qBAAoB,KAAK,KAAK;AAC/C,UAAM,SAAS,oBAAI,IAAgC;AACnD,eAAW,OAAO,UAAU;AAC1B,YAAM,OAAO,MAAMF,SAAQ,KAAK,QAAQ,KAAKA,SAAQ,KAAK,MAAM,CAAC;AACjE,UAAI,SAAS,KAAM;AACnB,YAAM,aAAaE,qBAAoB,KAAK,QAAQ,EAAE,CAAC,KAAK;AAC5D,YAAM,cAAcA,qBAAoB,KAAK,SAAS,EAAE,CAAC,KAAK;AAC9D,aAAO,IAAI,MAAM;AAAA,QACf,QAAQF,SAAQ,YAAY,OAAO,KAAKA,SAAQ,YAAY,KAAK,KAAK;AAAA,QACtE,SAASA,SAAQ,aAAa,OAAO,KAAKA,SAAQ,aAAa,KAAK,KAAK;AAAA,QACzE,SAAS,MAAMA,SAAQE,qBAAoB,KAAK,OAAO,EAAE,CAAC,KAAK,MAAM,OAAO,KAAKF,SAAQE,qBAAoB,KAAK,OAAO,EAAE,CAAC,KAAK,MAAM,KAAK,CAAC,KAAK;AAAA,MACpJ,CAAC;AAAA,IACH;AACA,gBAAY,IAAI,OAAO,MAAM;AAAA,EAC/B;AAEA,QAAM,OAAOA,qBAAoB,cAAc,KAAK;AACpD,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,MAAMF,SAAQ,KAAK,SAAS,KAAKA,SAAQ,KAAK,OAAO,CAAC;AACpE,QAAI,UAAU,KAAM;AACpB,UAAM,kBAAkBE,qBAAoB,KAAK,eAAe,EAAE,CAAC,KAAK;AACxE,UAAM,QAAQ,MAAMF,SAAQ,iBAAiB,OAAO,KAAKA,SAAQ,iBAAiB,KAAK,CAAC;AACxF,QAAI,UAAU,KAAM;AACpB,UAAM,SAAS,YAAY,IAAI,KAAK;AACpC,QAAI,CAAC,OAAQ;AACb,eAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,GAAG;AAC1C,eAAS,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;AAAA,IAC7C;AAEA,UAAM,eAAeE,qBAAoB,KAAK,aAAa;AAC3D,eAAW,YAAY,cAAc;AACnC,YAAM,OAAO,MAAMF,SAAQ,UAAU,QAAQ,KAAKA,SAAQ,UAAU,MAAM,CAAC;AAC3E,UAAI,SAAS,KAAM;AACnB,YAAM,MAAM,GAAG,KAAK,IAAI,IAAI;AAC5B,YAAM,OAAO,SAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,MAAM,SAAS,MAAM,SAAS,EAAE;AAE5E,YAAM,gBAAgB;AAAA,QACpBA,SAAQE,qBAAoB,UAAU,eAAe,EAAE,CAAC,KAAK,MAAM,OAAO,KAC1EF,SAAQE,qBAAoB,UAAU,eAAe,EAAE,CAAC,KAAK,MAAM,KAAK;AAAA,MAC1E;AAEA,YAAM,cAAcA,qBAAoB,UAAU,KAAK,EAAE,CAAC,KAAK;AAC/D,YAAM,qBAAqB,cAAcA,qBAAoB,aAAa,QAAQ,EAAE,CAAC,KAAK,OAAO;AACjG,YAAM,sBAAsB,cAAcA,qBAAoB,aAAa,SAAS,EAAE,CAAC,KAAK,OAAO;AACnG,YAAM,mBAAmB;AAAA,QACvBF,SAAQE,qBAAoB,eAAe,UAAU,OAAO,EAAE,CAAC,KAAK,MAAM,OAAO,KACjFF,SAAQE,qBAAoB,eAAe,UAAU,OAAO,EAAE,CAAC,KAAK,MAAM,KAAK;AAAA,MACjF;AAEA,eAAS,IAAI,KAAK;AAAA,QAChB,QAAQF,SAAQ,oBAAoB,OAAO,KAAKA,SAAQ,oBAAoB,KAAK,KAAK,KAAK;AAAA,QAC3F,SAASA,SAAQ,qBAAqB,OAAO,KAAKA,SAAQ,qBAAqB,KAAK,KAAK,KAAK;AAAA,QAC9F,SAAS,iBAAiB,oBAAoB,KAAK;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,aAAuB,cAAwE;AAC7H,QAAM,aAAaE,qBAAoB,aAAa,GAAG;AACvD,SAAO,WAAW,IAAI,CAAC,WAAW,UAAU;AAC1C,UAAM,OAAO,mBAAmB,SAAS;AACzC,UAAM,MAAMA,qBAAoB,WAAW,KAAK,EAAE,CAAC,KAAK;AACxD,UAAM,UAAU,MAAMA,qBAAoB,KAAK,SAAS,EAAE,CAAC,KAAK,OAAO;AACvE,UAAM,MAAM,MAAMA,qBAAoB,KAAK,KAAK,EAAE,CAAC,KAAK,OAAO;AAC/D,UAAM,QAAQ,MAAMA,qBAAoB,KAAK,OAAO,EAAE,CAAC,KAAK,OAAO;AACnE,UAAM,WAAW,QAAQA,qBAAoB,OAAO,MAAM,EAAE,CAAC,KAAK,OAAO;AACzE,UAAM,YAAY,QAAQA,qBAAoB,OAAO,OAAO,EAAE,CAAC,KAAK,OAAO;AAC3E,UAAM,YAAY,MAAMF,SAAQ,UAAU,OAAO,KAAKA,SAAQ,UAAU,KAAK,CAAC;AAC9E,UAAM,YAAY,MAAMA,SAAQ,WAAW,OAAO,KAAKA,SAAQ,WAAW,KAAK,CAAC;AAChF,UAAM,WAAW,cAAc,QAAQ,cAAc,OAAO,aAAa,IAAI,GAAG,SAAS,IAAI,SAAS,EAAE,IAAI;AAC5G,UAAM,eAAe,MAAME,qBAAoB,KAAK,UAAU,EAAE,CAAC,KAAK,OAAO;AAC7E,UAAM,gBAAgB,MAAMA,qBAAoB,KAAK,WAAW,EAAE,CAAC,KAAK,OAAO;AAC/E,UAAM,sBAAsB,MAAMA,qBAAoB,KAAK,iBAAiB,EAAE,CAAC,KAAK,OAAO;AAC3F,UAAM,wBAAwBA,qBAAoB,WAAW,uBAAuB,EAAE,CAAC,KAAK;AAC5F,UAAM,mBAAmB,MAAMA,qBAAoB,KAAK,QAAQ,EAAE,CAAC,KAAK,OAAO;AAE/E,UAAM,SAAS,YAAY,SAAS,UAAU,KAAK,YAAY,SAAS,QAAQ,KAAK;AACrF,UAAM,QAAQ,YAAY,SAAS,SAAS,KAAK,YAAY,SAAS,OAAO,KAAK;AAClF,UAAM,OAAO,YAAY,SAAS,QAAQ,KAAK,YAAY,SAAS,MAAM,KAAK;AAC/E,UAAM,eAAeF,SAAQ,SAAS,YAAY,KAAKA,SAAQ,SAAS,UAAU,KAAK,QAAQ,YAAY;AAC3G,UAAM,iBACJ,SAAS,OAAO,OAAO,gBAAgB,UAAU,UAAU,gBAAgB,YAAY,YAAY;AAErG,UAAM,OAAO,YAAY,KAAK,QAAQ,KAAK,YAAY,KAAK,MAAM,KAAK;AACvE,UAAM,QAAQ,YAAY,KAAK,SAAS,KAAK,YAAY,KAAK,OAAO,KAAK;AAC1E,UAAM,YAAY,YAAY,KAAK,aAAa,KAAK,YAAY,KAAK,WAAW,KAAK;AACtF,UAAM,UAAU,YAAY,KAAK,WAAW,KAAK,YAAY,KAAK,SAAS,KAAK;AAChF,UAAM,OAAO,iBAAiB,SAAS;AAEvC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,KAAK,WAAW;AAAA,MACzB,OAAO,oBAAoB,SAAS;AAAA,MACpC,UAAU,WAAW,OAAO,OAAO,SAAS,MAAM;AAAA,MAClD,SAAS,UAAU,OAAO,OAAO,SAAS,KAAK;AAAA,MAC/C,iBAAiB,SAAS,QAAQ,mBAAmB,SAAS,OAAO,OAAO;AAAA,MAC5E,cAAc,SAAS,QAAQ,mBAAmB,SAAS,OAAO,SAAS,IAAI;AAAA,MAC/E;AAAA,MACA,cAAc,SAAS,OAAO,OAAO,SAAS,IAAI;AAAA,MAClD,eAAe,UAAU,OAAO,OAAO,SAAS,KAAK;AAAA,MACrD,aAAa,cAAc,OAAO,OAAO,SAAS,SAAS;AAAA,MAC3D,WAAW,YAAY,OAAO,OAAO,SAAS,OAAO;AAAA,MACrD;AAAA,MACA;AAAA,MACA,YAAY,UAAU,UAAU;AAAA,MAChC,iBAAiB,UAAU,WAAW;AAAA,MACtC,aAAa,UAAU,WAAW;AAAA,MAClC,UAAU,iBAAiB,SAASA,SAAQ,cAAc,OAAO,KAAKA,SAAQ,cAAc,KAAK,KAAK,SAAS;AAAA,MAC/G,WAAW,kBAAkB,SAASA,SAAQ,eAAe,OAAO,KAAKA,SAAQ,eAAe,KAAK,KAAK,SAAS;AAAA,MACnH,iBACE,0BAA0B,QACzB,wBAAwB,SACtBA,SAAQ,qBAAqB,OAAO,KAAKA,SAAQ,qBAAqB,KAAK,KAAK,SAAS;AAAA,MAC9F,oBAAoB,qBAAqB;AAAA,MACzC;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,mBAAmB,WAK1B;AACA,QAAM,cAAcE,qBAAoB,WAAW,OAAO,EAAE,OAAO,CAAC,UAAU;AAC5E,UAAM,QAAQF,SAAQ,OAAO,QAAQ,KAAKA,SAAQ,OAAO,MAAM,KAAK,IAAI,YAAY;AACpF,WAAO,SAAS;AAAA,EAClB,CAAC;AAED,QAAM,cACJ,YAAY,KAAK,CAAC,UAAU;AAC1B,UAAM,WAAWA,SAAQ,OAAO,WAAW,KAAKA,SAAQ,OAAO,SAAS,KAAK,IAAI,YAAY;AAC7F,WAAO,YAAY;AAAA,EACrB,CAAC,KAAK,YAAY,CAAC,KAAK;AAE1B,MAAI,CAAC,aAAa;AAChB,WAAO,EAAE,OAAO,MAAM,QAAQ,MAAM,UAAU,MAAM,SAAS,KAAK;AAAA,EACpE;AAEA,QAAM,QAAQE,qBAAoB,aAAa,OAAO,EAAE,CAAC,KAAK;AAC9D,QAAM,aAAa,QAAQA,qBAAoB,OAAO,YAAY,EAAE,CAAC,KAAK,OAAO;AACjF,QAAM,MAAM,aAAaA,qBAAoB,YAAY,KAAK,EAAE,CAAC,KAAK,OAAO;AAC7E,QAAM,OAAO,aAAaA,qBAAoB,YAAY,MAAM,EAAE,CAAC,KAAK,OAAO;AAC/E,QAAM,SAAS,aAAaA,qBAAoB,YAAY,QAAQ,EAAE,CAAC,KAAK,OAAO;AACnF,QAAM,QAAQ,aAAaA,qBAAoB,YAAY,OAAO,EAAE,CAAC,KAAK,OAAO;AAEjF,SAAO;AAAA,IACL,QAAQ,MAAM;AACZ,YAAM,IAAI,YAAY,KAAK,KAAK,KAAK,YAAY,KAAK,GAAG,KAAK;AAC9D,aAAO,MAAM,OAAO,OAAO,SAAS,CAAC;AAAA,IACvC,GAAG;AAAA,IACH,SAAS,MAAM;AACb,YAAM,IAAI,YAAY,MAAM,KAAK,KAAK,YAAY,MAAM,GAAG,KAAK;AAChE,aAAO,MAAM,OAAO,OAAO,SAAS,CAAC;AAAA,IACvC,GAAG;AAAA,IACH,WAAW,MAAM;AACf,YAAM,IAAI,YAAY,QAAQ,KAAK,KAAK,YAAY,QAAQ,GAAG,KAAK;AACpE,aAAO,MAAM,OAAO,OAAO,SAAS,CAAC;AAAA,IACvC,GAAG;AAAA,IACH,UAAU,MAAM;AACd,YAAM,IAAI,YAAY,OAAO,KAAK,KAAK,YAAY,OAAO,GAAG,KAAK;AAClE,aAAO,MAAM,OAAO,OAAO,SAAS,CAAC;AAAA,IACvC,GAAG;AAAA,EACL;AACF;AAEA,SAAS,iBAAiB,WAAuC;AAC/D,QAAM,WAAWA,qBAAoB,WAAW,GAAG;AACnD,SAAO,SACJ,IAAI,CAAC,QAAQ;AACZ,UAAM,MAAMA,qBAAoB,KAAK,KAAK,EAAE,CAAC,KAAK;AAClD,UAAM,YAAYA,qBAAoB,KAAK,GAAG;AAC9C,UAAM,aAAaA,qBAAoB,KAAK,IAAI;AAEhD,QAAI,OAAO,UAAU,IAAI,CAAC,SAAS,KAAK,eAAe,EAAE,EAAE,KAAK,EAAE;AAClE,QAAI,WAAW,SAAS,GAAG;AACzB,cAAQ,KAAK,OAAO,WAAW,MAAM;AAAA,IACvC;AAEA,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,UAAM,KAAK,MAAMA,qBAAoB,KAAK,IAAI,EAAE,CAAC,KAAK,OAAO;AAC7D,UAAM,aAAa,YAAY,IAAI,OAAO,KAAK,YAAY,IAAI,KAAK,KAAK;AACzE,UAAM,aAAa,eAAe,OAAO,OAAQ,aAAa,KAAM,KAAK;AAEzE,UAAM,YAAY,MAAMA,qBAAoB,KAAK,OAAO,EAAE,CAAC,KAAK,OAAO;AACvE,UAAM,WAAWF,SAAQ,WAAW,OAAO,KAAKA,SAAQ,WAAW,KAAK,KAAK;AAC7E,UAAM,QAAQ,YAAY,SAAS,YAAY,MAAM,SAAS,IAAI,QAAQ,KAAK;AAC/E,UAAM,gBAAgB,MAAME,qBAAoB,KAAK,WAAW,EAAE,CAAC,KAAK,OAAO;AAC/E,UAAM,gBAAgBF,SAAQ,eAAe,OAAO,KAAKA,SAAQ,eAAe,KAAK,KAAK,IAAI,YAAY;AAC1G,UAAM,eAAuC;AAAA,MAC3C,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,MACN,KAAK;AAAA,MACL,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,UAAU;AAAA,MACV,SAAS;AAAA,MACT,UAAU;AAAA,MACV,aAAa;AAAA,MACb,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AACA,UAAM,iBAAiB,gBAAgB,iBAAiB,SAAS,aAAa,YAAY,KAAK,OAAO;AACtG,UAAM,UAAU,MAAME,qBAAoB,KAAK,KAAK,EAAE,CAAC,KAAK,OAAO;AACnE,UAAM,WAAWF,SAAQ,SAAS,QAAQ,KAAKA,SAAQ,SAAS,MAAM,KAAK,IAAI,YAAY;AAC3F,UAAM,eAAe,WAAW,YAAY,SAAS,IAAI,OAAO,KAAK;AACrE,UAAM,cAAc,MAAME,qBAAoB,KAAK,SAAS,EAAE,CAAC,KAAK,OAAO;AAC3E,UAAM,aAAa,YAAY,aAAa,OAAO,KAAK,YAAY,aAAa,KAAK,KAAK;AAC3F,UAAM,gBAAgB,eAAe,OAAO,OAAQ,aAAa,MAAO,KAAK;AAE7E,UAAM,QAAQ,MAAMA,qBAAoB,KAAK,GAAG,EAAE,CAAC,KAAK,OAAO;AAC/D,UAAM,QAAQ,MAAMA,qBAAoB,KAAK,GAAG,EAAE,CAAC,KAAK,OAAO;AAC/D,UAAM,QAAQ,MAAMA,qBAAoB,KAAK,GAAG,EAAE,CAAC,KAAK,OAAO;AAC/D,UAAM,aAAa,MAAMA,qBAAoB,KAAK,QAAQ,EAAE,CAAC,KAAK,OAAO;AACzE,UAAM,aAAa,MAAMA,qBAAoB,KAAK,QAAQ,EAAE,CAAC,KAAK,OAAO;AACzE,UAAM,gBAAgB,MAAMA,qBAAoB,KAAK,WAAW,EAAE,CAAC,KAAK,OAAO;AAE/E,UAAM,OAAO,UAAU,SAASF,SAAQ,OAAO,OAAO,KAAKA,SAAQ,OAAO,KAAK,KAAK,SAAS;AAC7F,UAAM,SAAS,UAAU,SAASA,SAAQ,OAAO,OAAO,KAAKA,SAAQ,OAAO,KAAK,KAAK,SAAS;AAC/F,UAAM,gBAAgBA,SAAQ,OAAO,OAAO,KAAKA,SAAQ,OAAO,KAAK,KAAK,IAAI,YAAY;AAC1F,UAAM,YAAY,UAAU,QAAQ,iBAAiB;AACrD,UAAM,SAAS,eAAe,SAASA,SAAQ,YAAY,OAAO,KAAKA,SAAQ,YAAY,KAAK,KAAK,SAAS;AAC9G,UAAM,SAAS,eAAe,SAASA,SAAQ,YAAY,OAAO,KAAKA,SAAQ,YAAY,KAAK,KAAK,SAAS;AAC9G,UAAM,aAAaA,SAAQ,eAAe,OAAO,KAAKA,SAAQ,eAAe,KAAK,KAAK,IAAI,YAAY;AACvG,UAAM,cAAc,cAAc;AAClC,UAAM,YAAY,cAAc;AAEhC,UAAM,SAAS,MAAME,qBAAoB,KAAK,QAAQ,EAAE,CAAC,KAAK,OAAO;AACrE,UAAM,aACJF,SAAQ,QAAQ,YAAY,KAC5BA,SAAQ,QAAQ,UAAU,KAC1BA,SAAQ,QAAQ,SAAS,KACzBA,SAAQ,QAAQ,OAAO,KACvBA,SAAQ,QAAQ,SAAS,KACzBA,SAAQ,QAAQ,OAAO,KACvB;AAEF,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC,EACA,OAAO,CAAC,QAAgC,QAAQ,IAAI;AACzD;AAEA,SAAS,cAAc,WAMrB;AACA,QAAM,cAAcC,kBAAiB,WAAW,aAAa;AAC7D,MAAI,CAAC,aAAa;AAChB,WAAO,EAAE,YAAY,MAAM,qBAAqB,MAAM,kBAAkB,MAAM,oBAAoB,QAAQ,kBAAkB,KAAK;AAAA,EACnI;AAEA,QAAM,aAAaA,kBAAiB,aAAa,YAAY;AAC7D,QAAM,KAAK,aAAaA,kBAAiB,YAAY,IAAI,IAAI;AAC7D,QAAM,aAAa,YAAY,IAAI,OAAO,KAAK,YAAY,IAAI,KAAK,KAAK;AACzE,QAAM,aAAa,eAAe,OAAO,OAAQ,aAAa,KAAM,KAAK;AAEzE,QAAM,aAAaA,kBAAiB,aAAa,YAAY;AAC7D,QAAM,UAAU,aAAaA,kBAAiB,YAAY,SAAS,IAAI;AAEvE,QAAM,OAAO,YAAY,SAAS,QAAQ,KAAK,YAAY,SAAS,MAAM,KAAK;AAC/E,QAAM,eAAeD,SAAQ,SAAS,YAAY,KAAKA,SAAQ,SAAS,UAAU,KAAK,QAAQ,YAAY;AAC3G,QAAM,qBACJ,gBAAgB,UAAU,UAAU,gBAAgB,YAAY,YAAY;AAC9E,QAAM,sBAAsB,SAAS,QAAQ,uBAAuB,SAAS,OAAO,OAAO;AAC3F,QAAM,mBAAmB,SAAS,QAAQ,uBAAuB,SAAS,OAAO,SAAS,IAAI;AAE9F,QAAM,QAAQ,YAAY,SAAS,SAAS,KAAK,YAAY,SAAS,OAAO,KAAK;AAClF,QAAM,mBAAmB,UAAU,OAAO,OAAO,SAAS,KAAK;AAE/D,SAAO,EAAE,YAAY,qBAAqB,kBAAkB,oBAAoB,iBAAiB;AACnG;AAEA,SAAS,mBAAmB,WAG1B;AACA,QAAM,SAASE,qBAAoB,WAAW,OAAO;AACrD,QAAM,eAAe,OAAO,KAAK,CAAC,UAAU;AAC1C,UAAM,WAAWF,SAAQ,OAAO,WAAW,KAAKA,SAAQ,OAAO,SAAS,KAAK,IAAI,YAAY;AAC7F,UAAM,WAAWC,kBAAiB,OAAO,MAAM;AAC/C,UAAM,WAAWD,SAAQ,UAAU,OAAO,KAAKA,SAAQ,UAAU,KAAK,KAAK,IAAI,YAAY;AAC3F,WAAO,YAAY,OAAO,YAAY,eAAe,YAAY;AAAA,EACnE,CAAC;AAED,MAAI,CAAC,cAAc;AACjB,WAAO,EAAE,aAAa,MAAM,YAAY,KAAK;AAAA,EAC/C;AAEA,QAAM,MAAMC,kBAAiB,cAAc,KAAK;AAChD,QAAM,KAAK,MAAMA,kBAAiB,KAAK,IAAI,IAAI;AAC/C,QAAM,aAAa,YAAY,IAAI,OAAO,KAAK,YAAY,IAAI,KAAK,KAAK;AACzE,QAAM,cAAc,eAAe,OAAO,OAAQ,aAAa,KAAM,KAAK;AAE1E,QAAM,YAAY,MAAMA,kBAAiB,KAAK,OAAO,IAAI;AACzD,QAAM,WAAWD,SAAQ,WAAW,OAAO,KAAKA,SAAQ,WAAW,KAAK,KAAK;AAC7E,QAAM,aAAa,WAAW,IAAI,QAAQ,KAAK;AAE/C,SAAO,EAAE,aAAa,WAAW;AACnC;AAEA,SAAS,uBAAuB,cAAyC;AACvE,MAAI,CAAC,aAAc,QAAO,CAAC;AAC3B,QAAM,YAAYE,qBAAoB,cAAc,MAAM;AAC1D,QAAM,WAAW,UACd,IAAI,CAAC,SAASF,SAAQ,MAAM,QAAQ,KAAKA,SAAQ,MAAM,MAAM,KAAK,EAAE,EACpE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACnC,SAAO,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AAC9B;AAEA,SAAS,YAAY,UAAoB,YAA+B;AACtE,SAAO,SAAS;AAAA,IAAK,CAAC,WACpB,WAAW,KAAK,CAAC,cAAc,OAAO,YAAY,EAAE,SAAS,UAAU,YAAY,CAAC,CAAC;AAAA,EACvF;AACF;AAEA,SAAS,oBAAoB,UAA4B;AACvD,MAAI,YAAY,UAAU,CAAC,iBAAiB,CAAC,GAAG;AAC9C,WAAO;AAAA,EACT;AACA,MAAI,YAAY,UAAU,CAAC,YAAY,gBAAM,SAAS,OAAO,MAAM,CAAC,GAAG;AACrE,WAAO;AAAA,EACT;AACA,SAAO,iBAAiB;AAC1B;AAEA,SAAS,qBAAqB,UAA4B;AACxD,MAAI,YAAY,UAAU,CAAC,YAAY,cAAI,CAAC,GAAG;AAC7C,WAAO;AAAA,EACT;AACA,MAAI,YAAY,UAAU,CAAC,iBAAiB,CAAC,GAAG;AAC9C,WAAO;AAAA,EACT;AACA,SAAO,iBAAiB;AAC1B;AAEA,eAAsB,sBAAsB,MAAuC;AACjF,QAAM,mBAAoB,KAAiE;AAC3F,QAAM,SAAS,mBAAmB,MAAM,iBAAiB,KAAK,IAAI,IAAI,MAAM,IAAI,SAAS,IAAI,EAAE,YAAY;AAC3G,QAAM,MAAM,MAAM,cAAAI,QAAM,UAAU,MAAM;AAExC,QAAM,kBAAkB,MAAM,IAAI,KAAK,mBAAmB,GAAG,MAAM,QAAQ;AAC3E,QAAM,gBAAgB,MAAM,IAAI,KAAK,iBAAiB,GAAG,MAAM,QAAQ;AACvE,QAAM,mBAAmB,MAAM,IAAI,KAAK,oBAAoB,GAAG,MAAM,QAAQ;AAC7E,QAAM,mBAAmB,MAAM,IAAI,KAAK,oBAAoB,GAAG,MAAM,QAAQ;AAE7E,MAAI,CAAC,mBAAmB,CAAC,eAAe;AACtC,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,QAAM,cAAcD,UAAS,eAAe;AAC5C,QAAM,YAAYA,UAAS,aAAa;AACxC,QAAM,eAAe,mBAAmBA,UAAS,gBAAgB,IAAI;AACrE,QAAM,eAAe,mBAAmBA,UAAS,gBAAgB,IAAI;AACrE,QAAM,eAAe,kBAAkB,YAAY;AAEnD,QAAM,WAAW,cAAc,SAAS;AACxC,QAAM,WAAW,mBAAmB,SAAS;AAC7C,QAAM,gBAAgB,mBAAmB,SAAS;AAClD,QAAM,eAAe,kBAAkB,WAAW;AAClD,QAAM,aAAa,8BAA8B,WAAW;AAC5D,QAAM,eAAe,wBAAwB,WAAW;AACxD,QAAM,kBAAkB,uBAAuB,YAAY;AAC3D,QAAM,iBAAiB,oBAAoB,eAAe;AAC1D,QAAM,kBAAkB,qBAAqB,eAAe;AAC5D,QAAM,oBAAoB,uBAAuB,aAAa,YAAY;AAE1E,SAAO;AAAA,IACL,gBAAgB,KAAK;AAAA,IACrB,YAAY,SAAS,cAAc,iBAAiB;AAAA,IACpD,qBAAqB,SAAS,uBAAuB,iBAAiB;AAAA,IACtE,kBAAkB,SAAS,oBAAoB,iBAAiB;AAAA,IAChE,oBAAoB,SAAS,sBAAsB,iBAAiB;AAAA,IACpE,kBAAkB,SAAS,oBAAoB,iBAAiB;AAAA,IAChE,gBAAgB,aAAa,kBAAkB,iBAAiB;AAAA,IAChE,cAAc,aAAa,gBAAgB,iBAAiB;AAAA,IAC5D,iBAAiB,aAAa,eAAe,iBAAiB;AAAA,IAC9D,oBAAoB,aAAa,kBAAkB,iBAAiB;AAAA,IACpE,aAAa,SAAS,eAAe,iBAAiB;AAAA,IACtD,YAAY,SAAS,cAAc,iBAAiB;AAAA,IACpD,YAAY,cAAc,iBAAiB;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA,uBAAuB,cAAc,SAAS,iBAAiB;AAAA,IAC/D,wBAAwB,cAAc,UAAU,iBAAiB;AAAA,IACjE,0BAA0B,cAAc,YAAY,iBAAiB;AAAA,IACrE,yBAAyB,cAAc,WAAW,iBAAiB;AAAA,IACnE;AAAA,IACA,kBAAkB,aAAa;AAAA,IAC/B,0BAA0B,aAAa;AAAA,IACvC,4BAA4B,aAAa;AAAA,IACzC,uCAAuC,aAAa;AAAA,EACtD;AACF;;;AC1rBA,SAAS,kBAAkB,IAAiB,MAAc,OAAqB;AAC7E,KAAG,MAAM,YAAY,MAAM,OAAO,WAAW;AAC/C;AAEA,SAASE,YAAW,MAAsB;AACxC,SAAO,KACJ,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,QAAQ;AAC7B;AAEA,SAASC,eAAc,KAA8B;AACnD,QAAM,eAAyB,CAAC;AAChC,MAAI,IAAI,eAAe,KAAM,cAAa,KAAK,aAAa,IAAI,WAAW,QAAQ,CAAC,CAAC,IAAI;AACzF,MAAI,IAAI,MAAO,cAAa,KAAK,SAAS,IAAI,KAAK,EAAE;AACrD,MAAI,IAAI,eAAgB,cAAa,KAAK,oBAAoB,IAAI,cAAc,EAAE;AAClF,MAAI,IAAI,aAAc,cAAa,KAAK,oBAAoB,IAAI,YAAY,EAAE;AAC9E,MAAI,IAAI,kBAAkB,KAAM,cAAa,KAAK,kBAAkB,IAAI,cAAc,QAAQ,CAAC,CAAC,IAAI;AACpG,MAAI,IAAI,OAAQ,cAAa,KAAK,4CAA4C;AAC9E,MAAI,IAAI,KAAM,cAAa,KAAK,iBAAiB;AACjD,MAAI,IAAI,OAAQ,cAAa,KAAK,mBAAmB;AACrD,QAAM,kBAA4B,CAAC;AACnC,MAAI,IAAI,UAAW,iBAAgB,KAAK,WAAW;AACnD,MAAI,IAAI,OAAQ,iBAAgB,KAAK,cAAc;AACnD,MAAI,gBAAgB,SAAS,EAAG,cAAa,KAAK,mBAAmB,gBAAgB,KAAK,GAAG,CAAC,EAAE;AAChG,MAAI,IAAI,YAAa,cAAa,KAAK,sBAAsB;AAC7D,MAAI,IAAI,UAAW,cAAa,KAAK,oBAAoB;AACzD,MAAI,IAAI,eAAe,IAAI,UAAW,cAAa,KAAK,kBAAkB;AAC1E,MAAI,IAAI,WAAY,cAAa,KAAK,eAAe,IAAI,UAAU,EAAE;AACrE,SAAO,aAAa,KAAK,GAAG;AAC9B;AAEA,SAAS,mBAAmB,MAAiC;AAC3D,SAAO,KACJ,IAAI,CAAC,QAAQ;AACZ,UAAM,MAAMA,eAAc,GAAG;AAC7B,UAAM,QAAQ,IAAI,KAAK,MAAM,IAAI;AACjC,UAAM,OAAO,MAAM,IAAI,CAAC,SAASD,YAAW,IAAI,CAAC,EAAE,KAAK,OAAO;AAC/D,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,gBAAgB,GAAG,KAAK,IAAI;AAAA,EACrC,CAAC,EACA,KAAK,EAAE;AACZ;AAEA,SAAS,cAAc,GAAmB;AACxC,QAAM,WAAW;AACjB,MAAI,KAAK,EAAG,QAAO;AACnB,MAAI,IAAI;AACR,MAAI,MAAM;AACV,SAAO,IAAI,GAAG;AACZ,SAAK;AACL,UAAM,SAAS,IAAI,EAAE,IAAI;AACzB,QAAI,KAAK,MAAM,IAAI,EAAE;AAAA,EACvB;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,KAAqB;AACpC,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,MAA+B;AAAA,IACnC,CAAC,KAAM,GAAG;AAAA,IAAG,CAAC,KAAK,IAAI;AAAA,IAAG,CAAC,KAAK,GAAG;AAAA,IAAG,CAAC,KAAK,IAAI;AAAA,IAChD,CAAC,KAAK,GAAG;AAAA,IAAG,CAAC,IAAI,IAAI;AAAA,IAAG,CAAC,IAAI,GAAG;AAAA,IAAG,CAAC,IAAI,IAAI;AAAA,IAC5C,CAAC,IAAI,GAAG;AAAA,IAAG,CAAC,GAAG,IAAI;AAAA,IAAG,CAAC,GAAG,GAAG;AAAA,IAAG,CAAC,GAAG,IAAI;AAAA,IAAG,CAAC,GAAG,GAAG;AAAA,EACpD;AACA,MAAI,IAAI;AACR,MAAI,SAAS;AACb,aAAW,CAAC,GAAG,CAAC,KAAK,KAAK;AACxB,WAAO,KAAK,GAAG;AACb,gBAAU;AACV,WAAK;AAAA,IACP;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAAuB,SAAyB;AACxE,WAAS,UAAU,IAAI,YAAY,GAAG;AAAA,IACpC,KAAK;AACH,aAAO,GAAG,OAAO;AAAA,IACnB,KAAK;AACH,aAAO,GAAG,cAAc,OAAO,CAAC;AAAA,IAClC,KAAK;AACH,aAAO,GAAG,cAAc,OAAO,EAAE,YAAY,CAAC;AAAA,IAChD,KAAK;AACH,aAAO,GAAG,QAAQ,OAAO,EAAE,YAAY,CAAC;AAAA,IAC1C,KAAK;AACH,aAAO,GAAG,QAAQ,OAAO,CAAC;AAAA,IAC5B,KAAK;AAAA,IACL;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,0BACP,SACA,cACA,iBACA,eACQ;AACR,MAAI,CAAC,WAAW,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC3C,WAAO,iBAAiB,eAAe,gBAAgB,YAAY,KAAK,CAAC;AAAA,EAC3E;AAEA,QAAM,WAAW,QAAQ,QAAQ,WAAW,CAAC,GAAG,OAAe;AAC7D,UAAM,cAAc,OAAO,SAAS,IAAI,EAAE;AAC1C,QAAI,CAAC,OAAO,SAAS,WAAW,KAAK,eAAe,EAAG,QAAO;AAC9D,UAAM,WAAW,cAAc;AAC/B,UAAM,IAAI,gBAAgB,QAAQ,KAAK;AACvC,QAAI,KAAK,EAAG,QAAO;AACnB,QAAI,aAAa,cAAc;AAC7B,aAAO,iBAAiB,eAAe,CAAC,EAAE,QAAQ,OAAO,EAAE;AAAA,IAC7D;AACA,WAAO,OAAO,CAAC;AAAA,EACjB,CAAC;AAED,QAAM,aAAa,SAAS,KAAK;AACjC,MAAI,CAAC,YAAY;AACf,WAAO,iBAAiB,eAAe,gBAAgB,YAAY,KAAK,CAAC;AAAA,EAC3E;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAe,IAA8B;AACnE,MAAI,UAAU,IAAI,eAAe,EAAE;AACnC,MAAI,CAAC,SAAS;AACZ,cAAU,IAAI,cAAc,OAAO;AACnC,YAAQ,KAAK;AACb,QAAI,KAAK,YAAY,OAAO;AAAA,EAC9B;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,KAAe,cAAsC;AAChF,QAAM,UAAU,eAAe,KAAK,wBAAwB;AAC5D,QAAM,gBAAgB,aAAa,eAAe,QAAQ,CAAC;AAC3D,QAAM,eAAe,aAAa,gBAAgB,QAAQ,CAAC;AAC3D,QAAM,kBAAkB,aAAa,mBAAmB,QAAQ,CAAC;AACjE,QAAM,eAAe,aAAa,aAAa,QAAQ,CAAC;AAExD,QAAM,oBACJ,aAAa,uBAAuB,UAAU,aAAa,qBAAqB,OAC5E,aAAa,oBAAoB,QAAQ,CAAC,IAC1C,GAAG,aAAa,iBAAiB,QAAQ,CAAC,CAAC;AAEjD,UAAQ,cAAc;AAAA;AAAA;AAAA;AAAA,oBAIJ,YAAY;AAAA,eACjB,aAAa;AAAA;AAAA;AAAA;AAAA,qBAIP,YAAY;AAAA,wBACT,eAAe;AAAA;AAAA;AAAA,qBAGlB,aAAa,cAAc;AAAA;AAAA;AAAA,mBAG7B,aAAa,WAAW,QAAQ,CAAC,CAAC;AAAA,qBAChC,iBAAiB;AAAA,uBACf,aAAa,iBAAiB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,qBAI1C,aAAa,sBAAsB,QAAQ,CAAC,CAAC;AAAA,sBAC5C,aAAa,uBAAuB,QAAQ,CAAC,CAAC;AAAA,wBAC5C,aAAa,yBAAyB,QAAQ,CAAC,CAAC;AAAA,uBACjD,aAAa,wBAAwB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,mBAInD,aAAa,YAAY,QAAQ,CAAC,CAAC;AAAA,eACvC,aAAa,UAAU;AAAA,oBAClB,aAAa,UAAU;AAAA,qBACtB,aAAa,eAAe;AAAA;AAAA;AAGjD;AAEA,SAAS,wBAAwB,KAAe,cAAsC;AACpF,QAAM,OAAO,IAAI;AACjB,QAAM,gBAAgB,aAAa,eAAe,QAAQ,CAAC;AAC3D,QAAM,eAAe,aAAa,gBAAgB,QAAQ,CAAC;AAC3D,QAAM,kBAAkB,aAAa,mBAAmB,QAAQ,CAAC;AACjE,QAAM,eAAe,aAAa,aAAa,QAAQ,CAAC;AAExD,oBAAkB,MAAM,cAAc,YAAY;AAClD,oBAAkB,MAAM,cAAc,GAAG,YAAY,IAAI;AACzD,oBAAkB,MAAM,SAAS,GAAG,aAAa,IAAI;AACrD,oBAAkB,MAAM,aAAa,GAAG,aAAa,IAAI;AACzD,oBAAkB,MAAM,eAAe,MAAM;AAC7C,oBAAkB,MAAM,gBAAgB,MAAM;AAC9C,oBAAkB,MAAM,eAAe,GAAG,YAAY,IAAI;AAC1D,oBAAkB,MAAM,kBAAkB,GAAG,eAAe,IAAI;AAChE,oBAAkB,MAAM,gBAAgB,GAAG;AAC3C,oBAAkB,MAAM,iBAAiB,GAAG;AAC5C,oBAAkB,MAAM,eAAe,aAAa,cAAc;AAElE,aAAW,SAAS,MAAM,KAAK,KAAK,QAAQ,GAAG;AAC7C,QAAI,EAAE,iBAAiB,aAAc;AACrC,UAAM,MAAM,MAAM,QAAQ,YAAY;AACtC,QAAI,QAAQ,YAAY,QAAQ,QAAS;AACzC,sBAAkB,OAAO,cAAc,YAAY;AACnD,sBAAkB,OAAO,aAAa,MAAM;AAAA,EAC9C;AAEA,aAAW,OAAO,MAAM,KAAK,IAAI,KAAK,iBAAiB,KAAK,CAAC,GAAG;AAC9D,QAAI,EAAE,eAAe,aAAc;AACnC,sBAAkB,KAAK,aAAa,MAAM;AAC1C,sBAAkB,KAAK,UAAU,MAAM;AAAA,EACzC;AACF;AAEA,SAAS,+BAA+B,YAAiC;AACvE,aAAW,KAAK,YAAY;AAC1B,UAAM,oBAAoB,EAAE,eAAe,IAAI,KAAK,EAAE,SAAS,KAAK,EAAE,cAAc,sBAAsB,MAAM;AAChH,QAAI,CAAC,kBAAkB;AACrB,QAAE,aAAa,mBAAmB,GAAG;AACrC,UAAI,EAAE,UAAU,KAAK,EAAE,WAAW,GAAG;AACnC,UAAE,YAAY;AAAA,MAChB;AAAA,IACF,OAAO;AACL,QAAE,gBAAgB,iBAAiB;AAAA,IACrC;AAAA,EACF;AACF;AAEA,SAAS,4BAA4B,YAA2B,OAAwB;AACtF,WAAS,IAAI,QAAQ,GAAG,IAAI,WAAW,QAAQ,KAAK,GAAG;AACrD,UAAM,IAAI,WAAW,CAAC;AACtB,UAAM,WAAW,EAAE,eAAe,IAAI,KAAK,EAAE,SAAS;AACtD,UAAM,YAAY,EAAE,cAAc,sBAAsB,MAAM;AAC9D,QAAI,WAAW,UAAW,QAAO;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,KAAe,cAA+C;AAC5F,QAAM,qBAAqB,MAAM,KAAK,IAAI,KAAK,iBAAiB,GAAG,CAAC;AACpE,qBAAmB,QAAQ,CAAC,MAAM;AAChC,MAAE,UAAU,OAAO,oBAAoB;AACvC,MAAE,iBAAiB,yBAAyB,EAAE,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC;AAAA,EAC/E,CAAC;AAED,QAAM,kBAAkB,aAAa,kBAAkB,IAAI,CAAC,SAAS,UAAU;AAC7E,UAAM,UACH,IAAI,KAAK,cAAc,uBAAuB,QAAQ,KAAK,IAAI,KAA4B;AAC9F,UAAM,WAAW,mBAAmB,KAAK,KAAK;AAC9C,WAAO;AAAA,MACL;AAAA,MACA,MAAM,WAAW;AAAA,IACnB;AAAA,EACF,CAAC;AAED,MAAI,aAAa,4BAA4B,aAAa,kBAAkB;AAC1E,QAAI,gBAAoC;AACxC,QACE,aAAa,+BAA+B,QAC5C,aAAa,8BAA8B,GAC3C;AACA,sBACG,IAAI,KAAK;AAAA,QACR,uBAAuB,aAAa,0BAA0B;AAAA,MAChE,KACA,mBAAmB,aAAa,0BAA0B,KAC1D;AAAA,IACJ,OAAO;AACL,sBACE,mBACG,MAAM,EACN,QAAQ,EACR,KAAK,CAAC,MAAM;AACX,cAAM,QAAQ,EAAE,eAAe,IAAI,QAAQ,QAAQ,EAAE;AACrD,cAAM,SAAS,aAAa,kBAAkB,QAAQ,QAAQ,EAAE,KAAK;AACrE,eAAO,OAAO,SAAS,KAAK,KAAK,SAAS,MAAM;AAAA,MAClD,CAAC,KAAK;AAAA,IACZ;AAEA,UAAM,YAAY,gBAAgB,mBAAmB,QAAQ,aAAa,IAAI;AAC9E,UAAM,sBAAsB,aAAa,IAAI,4BAA4B,oBAAoB,SAAS,IAAI;AAE1G,QAAI,iBAAiB,CAAC,qBAAqB;AACzC,UAAI,qBAAqB;AACzB,UAAI,SAAS,cAAc;AAC3B,aAAO,UAAU,OAAO,QAAQ,YAAY,MAAM,QAAQ,OAAO,eAAe,IAAI,KAAK,EAAE,WAAW,GAAG;AACvG,8BAAsB;AACtB,iBAAS,OAAO;AAAA,MAClB;AAEA,YAAM,SAAS,KAAK,IAAI,GAAG,aAAa,wCAAwC,kBAAkB;AAClG,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;AAClC,cAAM,SAAS,IAAI,cAAc,GAAG;AACpC,eAAO,YAAY;AACnB,sBAAc,eAAe,aAAa,QAAQ,aAAa;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,KAAK,IAAI,KAAK,iBAAiB,GAAG,CAAC;AAC5D,QAAM,eAAe,oBAAI,IAAsB;AAC/C,QAAM,iBAAgC,CAAC;AAEvC,aAAW,UAAU,iBAAiB;AACpC,UAAM,OAAO,OAAO;AACpB,UAAM,UAAU,OAAO;AACvB,QAAI,CAAC,KAAM;AACX,mBAAe,KAAK,IAAI;AACxB,SAAK,gBAAgB,gBAAgB;AAErC,SAAK,MAAM,YAAY,QAAQ;AAC/B,QAAI,QAAQ,aAAa,KAAM,MAAK,MAAM,YAAY,GAAG,QAAQ,SAAS,QAAQ,CAAC,CAAC;AACpF,QAAI,QAAQ,YAAY,KAAM,MAAK,MAAM,eAAe,GAAG,QAAQ,QAAQ,QAAQ,CAAC,CAAC;AACrF,QAAI,QAAQ,mBAAmB,UAAU,QAAQ,oBAAoB,MAAM;AACzE,WAAK,MAAM,aAAa,QAAQ,gBAAgB,QAAQ,CAAC;AAAA,IAC3D,YAAY,QAAQ,mBAAmB,WAAW,QAAQ,mBAAmB,cAAc,QAAQ,iBAAiB,MAAM;AACxH,WAAK,MAAM,aAAa,GAAG,QAAQ,aAAa,QAAQ,CAAC,CAAC;AAAA,IAC5D;AACA,QAAI,QAAQ,iBAAiB,KAAM,MAAK,MAAM,aAAa,GAAG,QAAQ,aAAa,QAAQ,CAAC,CAAC;AAC7F,QAAI,QAAQ,kBAAkB,KAAM,MAAK,MAAM,cAAc,GAAG,QAAQ,cAAc,QAAQ,CAAC,CAAC;AAChG,QAAI,QAAQ,gBAAgB,KAAM,MAAK,MAAM,aAAa,GAAG,QAAQ,YAAY,QAAQ,CAAC,CAAC;AAC3F,QAAI,QAAQ,cAAc,KAAM,MAAK,MAAM,aAAa,IAAI,CAAC,QAAQ,WAAW,QAAQ,CAAC,CAAC;AAE1F,QAAI,QAAQ,KAAK,SAAS,KAAK,KAAK,cAAc,sBAAsB,MAAM,MAAM;AAClF,YAAM,yBAAyB,KAAK,eAAe,IAAI,QAAQ,QAAQ,EAAE;AACzE,YAAM,oBAAoB,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,QAAQ,EAAE;AACzF,UAAI,kBAAkB,SAAS,KAAK,0BAA0B,mBAAmB;AAC/E,aAAK,YAAY,mBAAmB,QAAQ,IAAI;AAAA,MAClD;AAAA,IACF;AAEA,QAAI,QAAQ,cAAc,QAAQ,QAAQ,cAAc,MAAM;AAC5D,WAAK,aAAa,kBAAkB,GAAG;AACvC,UAAI,QAAQ,oBAAoB;AAC9B,qBAAa,IAAI,QAAQ,WAAW,CAAC,CAAC;AAAA,MACxC;AACA,YAAM,eAAe,KAAK,IAAI,GAAG,QAAQ,SAAS;AAClD,YAAM,SAAS,aAAa,IAAI,QAAQ,SAAS,KAAK,CAAC;AACvD,YAAM,YAAY,OAAO,YAAY,KAAM,QAAQ,cAAc;AACjE,YAAM,YAAY,YAAY;AAC9B,aAAO,YAAY,IAAI;AACvB,eAAS,KAAK,eAAe,GAAG,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3D,eAAO,EAAE,IAAI;AAAA,MACf;AACA,mBAAa,IAAI,QAAQ,WAAW,MAAM;AAE1C,YAAM,aAAa,0BAA0B,QAAQ,iBAAiB,cAAc,QAAQ,QAAQ,UAAU;AAC9G,YAAM,aAAa,KAAK,eAAe,IAAI,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACrE,YAAM,mBAAmB,UAAU,WAAW,UAAU;AACxD,UAAI,CAAC,kBAAkB;AACrB,cAAM,SAAS,IAAI,cAAc,MAAM;AACvC,eAAO,YAAY;AACnB,eAAO,aAAa,yBAAyB,GAAG;AAChD,eAAO,cAAc,GAAG,UAAU;AAClC,eAAO,MAAM,UAAU;AACvB,eAAO,MAAM,WAAW;AACxB,eAAO,MAAM,aAAa,eAAe,IAAI,GAAG,eAAe,GAAG,OAAO;AACzE,eAAO,MAAM,QAAQ;AACrB,eAAO,MAAM,aAAa;AAC1B,aAAK,QAAQ,MAAM;AAAA,MACrB;AAAA,IACF;AAAA,EAIF;AAEA,iCAA+B,UAAU;AACzC,SAAO;AACT;AAEA,SAAS,kBAAkB,WAAgC;AACzD,QAAM,OAAO,UAAU,sBAAsB;AAC7C,MAAI,KAAK,SAAS,EAAG,QAAO,KAAK;AACjC,QAAM,KAAK,OAAO,WAAW,iBAAiB,SAAS,EAAE,cAAc,GAAG;AAC1E,MAAI,OAAO,SAAS,EAAE,KAAK,KAAK,EAAG,QAAO;AAC1C,SAAO;AACT;AAEA,SAAS,uBAAuB,KAAe,WAAwB,UAAwB;AAC7F,MAAI,YAAY,IAAK;AACrB,QAAM,SAAS,IAAI,cAAc,KAAK;AACtC,SAAO,QAAQ,iBAAiB;AAChC,SAAO,MAAM,SAAS,GAAG,SAAS,QAAQ,CAAC,CAAC;AAC5C,SAAO,MAAM,QAAQ;AACrB,SAAO,MAAM,gBAAgB;AAC7B,SAAO,MAAM,aAAa;AAC1B,YAAU,eAAe,aAAa,QAAQ,SAAS;AACzD;AAEA,SAAS,wBAAwB,KAAqB;AACpD,MAAI,iBAAiB,6BAA6B,EAAE,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC;AACrF;AAEA,SAAS,oBAAoB,YAA2B,KAAa,SAAgC,eAA+B;AAClI,QAAM,WAAW,kBAAkB,WAAW,GAAG,CAAC;AAClD,MAAI,CAAC,QAAQ,SAAU,QAAO;AAC9B,QAAM,OAAO,WAAW,MAAM,CAAC;AAC/B,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,QAAQ,kBAAkB,IAAI;AACpC,QAAM,MAAM,WAAW;AACvB,MAAI,MAAM,cAAe,QAAO;AAChC,SAAO;AACT;AAEA,SAAS,oBAAoB,KAAe,cAAgC,YAAiC;AAC3G,0BAAwB,GAAG;AAE3B,QAAM,gBAAgB,KAAK,IAAI,KAAK,aAAa,eAAe,aAAa,kBAAkB,aAAa,kBAAkB;AAC9H,QAAM,QAAQ,KAAK,IAAI,aAAa,kBAAkB,QAAQ,WAAW,MAAM;AAC/E,MAAI,OAAO;AAEX,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK,GAAG;AACjC,UAAM,IAAI,WAAW,CAAC;AACtB,UAAM,UAAU,aAAa,kBAAkB,CAAC;AAChD,UAAME,KAAI,kBAAkB,CAAC;AAE7B,UAAM,aAAa,QAAQ;AAC3B,QAAI,cAAc,OAAO,GAAG;AAC1B,6BAAuB,KAAK,GAAG,gBAAgB,IAAI;AACnD,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,oBAAoB,YAAY,GAAG,SAAS,aAAa;AAC7E,SAAK,QAAQ,aAAa,QAAQ,aAAa,OAAO,KAAK,OAAO,cAAc,eAAe;AAC7F,6BAAuB,KAAK,GAAG,gBAAgB,IAAI;AACnD,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,KAAK,OAAOA,KAAI,eAAe;AACxC,6BAAuB,KAAK,GAAG,gBAAgB,IAAI;AACnD,aAAO;AAAA,IACT;AAEA,YAAQA;AACR,QAAI,QAAQ,eAAe;AACzB,aAAO,OAAO;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,KAAe,qBAAoC;AAC/E,QAAM,UAAU,eAAe,KAAK,uBAAuB;AAC3D,UAAQ,cAAc;AAAA;AAAA,MAElB,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAWpB,EAAE;AAAA;AAEV;AAEO,SAAS,qBAAqB,EAAE,KAAK,cAAc,oBAAoB,GAAiC;AAC7G,QAAM,mBAAmB,gBAAgB,+BAA+B,gBAAgB;AAExF,6BAA2B,KAAK;AAAA,IAC9B,qBAAqB,iBAAiB;AAAA,IACtC,wBAAwB,iBAAiB;AAAA,EAC3C,CAAC;AAED,MAAI,aAAa,MAAM,KAAK,IAAI,KAAK,iBAAiB,GAAG,CAAC;AAC1D,iCAA+B,UAAU;AAEzC,sBAAoB,KAAK,gBAAgB;AACzC,0BAAwB,KAAK,gBAAgB;AAE7C,MAAI,cAAc;AAChB,iBAAa,uBAAuB,KAAK,YAAY;AACrD,wBAAoB,KAAK,cAAc,UAAU;AAAA,EACnD;AAEA,uBAAqB,KAAK,mBAAmB;AAC/C;;;ACreA,IAAM,UAAU;AAKhB,IAAM,WAeD;AAAA,EACH,IAAI;AAAA,IACF,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,YAAY,CAAC,SAAS,yCAAgB,IAAI;AAAA,IAC1C,mBAAmB;AAAA,IACnB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,qBAAqB;AAAA,IACrB,aAAa;AAAA,EACf;AAAA,EACA,IAAI;AAAA,IACF,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,YAAY,CAAC,SAAS,qBAAqB,IAAI;AAAA,IAC/C,mBAAmB;AAAA,IACnB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,qBAAqB;AAAA,IACrB,aAAa;AAAA,EACf;AACF;AAEA,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASV,IAAM,kBAAN,cAA8B,YAAY;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAwC;AAAA,EACxC,cAAc;AAAA,EACd,SAAiB;AAAA,EAEzB,cAAc;AACZ,UAAM;AACN,SAAK,UAAU,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AACjD,SAAK,SAAS,KAAK,YAAY,KAAK,aAAa,MAAM,CAAC;AACxD,SAAK,eAAe,kBAAkB,cAAc;AAEpD,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,cAAc;AAEpB,SAAK,UAAU,SAAS,cAAc,KAAK;AAC3C,SAAK,QAAQ,YAAY;AAEzB,SAAK,UAAU,SAAS,cAAc,QAAQ;AAC9C,SAAK,QAAQ,UAAU,MAAM,KAAK,KAAK,cAAc;AAErD,SAAK,YAAY,SAAS,cAAc,QAAQ;AAChD,SAAK,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM;AAEpD,SAAK,WAAW,SAAS,cAAc,QAAQ;AAC/C,SAAK,SAAS,UAAU,MAAM,KAAK,MAAM;AAEzC,SAAK,YAAY,SAAS,cAAc,OAAO;AAC/C,SAAK,UAAU,OAAO;AACtB,SAAK,UAAU,SAAS;AACxB,SAAK,UAAU,MAAM,UAAU;AAC/B,SAAK,UAAU,WAAW,MAAM,KAAK,KAAK,SAAS;AAEnD,SAAK,QAAQ,OAAO,KAAK,SAAS,KAAK,WAAW,KAAK,UAAU,KAAK,SAAS;AAE/E,SAAK,YAAY,SAAS,cAAc,UAAU;AAClD,SAAK,UAAU,YAAY;AAC3B,SAAK,UAAU,cAAc;AAC7B,SAAK,UAAU,UAAU,CAAC,UAAU;AAClC,YAAM,eAAe;AACrB,WAAK,KAAK,uBAAuB,MAAM,aAAa;AAAA,IACtD;AAEA,SAAK,OAAO,SAAS,cAAc,MAAM;AACzC,SAAK,KAAK,YAAY;AACtB,SAAK,KAAK,cAAc;AAExB,SAAK,QAAQ,SAAS,cAAc,QAAQ;AAC5C,SAAK,MAAM,QAAQ,IAAI,qBAAqB,eAAe;AAC3D,SAAK,MAAM,SAAS,MAAM,KAAK,YAAY;AAE3C,SAAK,QAAQ,OAAO,OAAO,KAAK,SAAS,KAAK,WAAW,KAAK,MAAM,KAAK,KAAK;AAC9E,SAAK,eAAe;AACpB,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEA,WAAW,qBAA+B;AACxC,WAAO,CAAC,QAAQ,cAAc;AAAA,EAChC;AAAA,EAEA,yBAAyB,MAAc,GAAkB,UAA+B;AACtF,QAAI,SAAS,QAAQ;AACnB,WAAK,SAAS,KAAK,YAAY,QAAQ;AACvC,WAAK,eAAe;AACpB;AAAA,IACF;AACA,QAAI,SAAS,gBAAgB;AAC3B,WAAK,sBAAsB;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,oBAA0B;AACxB,SAAK,eAAe;AACpB,SAAK,cAAc,IAAI,YAAY,gBAAgB,EAAE,QAAQ,EAAE,SAAS,QAAQ,EAAE,CAAC,CAAC;AAAA,EACtF;AAAA,EAEO,YAAY,SAAuB;AACxC,SAAK,SAAS,OAAO;AAAA,EACvB;AAAA,EAEO,SAAS,SAAuB;AACrC,SAAK,eAAe;AACpB,SAAK,eAAe,kBAAkB,OAAO;AAC7C,SAAK,eAAe;AACpB,SAAK,QAAQ,SAAS,KAAK,MAAM,EAAE,UAAU;AAC7C,SAAK,WAAW,KAAK;AAAA,EACvB;AAAA,EAEO,cAAsB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,QAAc;AACnB,SAAK,eAAe;AACpB,SAAK,eAAe,kBAAkB,cAAc;AACpD,SAAK,eAAe;AACpB,SAAK,QAAQ,SAAS,KAAK,MAAM,EAAE,OAAO;AAC1C,SAAK,WAAW,OAAO;AAAA,EACzB;AAAA,EAEA,MAAa,SAAS,MAA2B;AAC/C,UAAM,KAAK,UAAU,IAAI;AAAA,EAC3B;AAAA,EAEA,MAAc,WAA0B;AACtC,UAAM,OAAO,KAAK,UAAU,QAAQ,CAAC;AACrC,QAAI,CAAC,KAAM;AACX,UAAM,KAAK,UAAU,IAAI;AACzB,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEA,MAAc,UAAU,MAA2B;AACjD,QAAI;AACF,YAAM,CAAC,UAAU,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC5C,wBAAwB,IAAI;AAAA,QAC5B,sBAAsB,IAAI;AAAA,MAC5B,CAAC;AACD,WAAK,eAAe;AACpB,WAAK,eAAe;AACpB,WAAK,eAAe;AACpB,WAAK,QAAQ,SAAS,KAAK,MAAM,EAAE,WAAW,QAAQ,cAAc,CAAC;AACrE,WAAK,WAAW,UAAU,QAAQ,cAAc;AAAA,IAClD,SAAS,OAAO;AACd,WAAK,UAAU,iBAAiB,QAAQ,MAAM,UAAU,SAAS,KAAK,MAAM,EAAE,WAAW;AAAA,IAC3F;AAAA,EACF;AAAA,EAEA,MAAa,gBAA+B;AAC1C,QAAI,CAAC,UAAU,WAAW,MAAM;AAC9B,WAAK,UAAU,SAAS,KAAK,MAAM,EAAE,eAAe;AACpD;AAAA,IACF;AACA,QAAI;AACF,YAAM,QAAQ,MAAM,UAAU,UAAU,KAAK;AAC7C,YAAM,UAAU,MAAM,0BAA0B,KAAK;AACrD,WAAK,aAAa,QAAQ,MAAM,QAAQ,IAAI;AAAA,IAC9C,SAAS,OAAO;AACd,WAAK,UAAU,iBAAiB,QAAQ,MAAM,UAAU,SAAS,KAAK,MAAM,EAAE,mBAAmB;AAAA,IACnG;AAAA,EACF;AAAA,EAEA,MAAc,uBAAuB,MAA0C;AAC7E,QAAI,CAAC,KAAM;AACX,UAAM,UAAU,MAAM,iCAAiC,IAAI;AAC3D,SAAK,aAAa,QAAQ,MAAM,QAAQ,IAAI;AAAA,EAC9C;AAAA,EAEQ,aAAa,MAAc,MAAoB;AACrD,SAAK,eAAe;AACpB,QAAI,KAAK,KAAK,GAAG;AACf,WAAK,eAAe,kBAAkB,IAAI;AAAA,IAC5C,WAAW,KAAK,KAAK,GAAG;AACtB,WAAK,eAAe,kBAAkB,MAAM,KAAK,WAAW,KAAK,OAAO,EAAE,WAAW,KAAK,MAAM,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM;AAAA,IACjI,OAAO;AACL,WAAK,QAAQ,SAAS,KAAK,MAAM,EAAE,SAAS;AAC5C;AAAA,IACF;AACA,SAAK,eAAe;AACpB,SAAK,QAAQ,SAAS,KAAK,MAAM,EAAE,iBAAiB;AACpD,SAAK,WAAW,OAAO;AAAA,EACzB;AAAA,EAEQ,cAAoB;AAC1B,UAAM,MAAM,KAAK,MAAM;AACvB,QAAI,CAAC,IAAK;AAEV,yBAAqB;AAAA,MACnB;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,qBAAqB;AAAA,IACvB,CAAC;AAED,SAAK,WAAW;AAChB,WAAO,WAAW,MAAM,KAAK,WAAW,GAAG,GAAG;AAAA,EAChD;AAAA,EAEQ,aAAmB;AACzB,UAAM,MAAM,KAAK,MAAM;AACvB,QAAI,CAAC,IAAK;AACV,UAAM,WAAW,KAAK,IAAI,KAAK,IAAI,KAAK,cAAc,IAAI,gBAAgB,YAAY;AACtF,UAAM,OAAO,WAAW;AACxB,QAAI,KAAK,IAAI,OAAO,KAAK,WAAW,IAAI,EAAG;AAC3C,SAAK,cAAc;AACnB,SAAK,MAAM,MAAM,SAAS,GAAG,IAAI;AAAA,EACnC;AAAA,EAEQ,iBAAuB;AAC7B,SAAK,MAAM,SAAS,KAAK;AAAA,EAC3B;AAAA,EAEQ,WAAW,QAAsB,UAAyB;AAChE,SAAK,cAAc,IAAI,YAAY,iBAAiB,EAAE,QAAQ,EAAE,cAAc,KAAK,cAAc,QAAQ,SAAS,EAAE,CAAC,CAAC;AAAA,EACxH;AAAA,EAEQ,UAAU,SAAuB;AACvC,SAAK,cAAc,IAAI,YAAY,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC3E,SAAK,QAAQ,GAAG,SAAS,KAAK,MAAM,EAAE,WAAW,GAAG,OAAO,EAAE;AAAA,EAC/D;AAAA,EAEQ,QAAQ,MAAoB;AAClC,SAAK,KAAK,cAAc;AAAA,EAC1B;AAAA,EAEQ,YAAY,OAA8B;AAChD,WAAO,OAAO,YAAY,MAAM,OAAO,OAAO;AAAA,EAChD;AAAA,EAEQ,wBAA8B;AACpC,UAAM,MAAM,KAAK,aAAa,cAAc;AAC5C,UAAM,OAAO,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,OAAO,IAAI,YAAY,MAAM;AAChF,SAAK,QAAQ,MAAM,UAAU,OAAO,SAAS;AAAA,EAC/C;AAAA,EAEQ,iBAAuB;AAC7B,UAAM,IAAI,SAAS,KAAK,MAAM;AAC9B,SAAK,QAAQ,cAAc,EAAE;AAC7B,SAAK,UAAU,cAAc,EAAE;AAC/B,SAAK,SAAS,cAAc,EAAE;AAC9B,SAAK,UAAU,cAAc,EAAE;AAC/B,QAAI,CAAC,KAAK,KAAK,eAAe,KAAK,KAAK,gBAAgB,SAAS,GAAG,cAAc,KAAK,KAAK,gBAAgB,SAAS,GAAG,YAAY;AAClI,WAAK,KAAK,cAAc,EAAE;AAAA,IAC5B;AAAA,EACF;AACF;AAEO,SAAS,wBAA8B;AAC5C,MAAI,CAAC,eAAe,IAAI,kBAAkB,GAAG;AAC3C,mBAAe,OAAO,oBAAoB,eAAe;AAAA,EAC3D;AACF;;;AP3SA,sBAAsB;AAEf,IAAM,4BAAwB,4BAAgB;AAAA,EACnD,MAAM;AAAA,EACN,OAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,OAAO,CAAC,UAAU,SAAS,OAAO;AAAA,EAClC,MAAM,OAAO,EAAE,KAAK,GAAG;AACrB,UAAM,YAAQ,gBAAqC,IAAI;AAEvD,UAAM,WAAW,CAAC,UAAiB;AACjC,WAAK,UAAW,MAAkD,MAAM;AAAA,IAC1E;AACA,UAAM,UAAU,CAAC,UAAiB;AAChC,WAAK,SAAU,MAAiD,MAAM;AAAA,IACxE;AACA,UAAM,UAAU,CAAC,UAAiB;AAChC,WAAK,SAAU,MAAiD,MAAM;AAAA,IACxE;AAEA,8BAAU,MAAM;AACd,YAAM,OAAO,iBAAiB,iBAAiB,QAAQ;AACvD,YAAM,OAAO,iBAAiB,gBAAgB,OAAO;AACrD,YAAM,OAAO,iBAAiB,gBAAgB,OAAO;AAAA,IACvD,CAAC;AAED,oCAAgB,MAAM;AACpB,YAAM,OAAO,oBAAoB,iBAAiB,QAAQ;AAC1D,YAAM,OAAO,oBAAoB,gBAAgB,OAAO;AACxD,YAAM,OAAO,oBAAoB,gBAAgB,OAAO;AAAA,IAC1D,CAAC;AAED,WAAO,UAAM,cAAE,oBAAoB,EAAE,KAAK,OAAO,MAAM,MAAM,KAAK,CAAC;AAAA,EACrE;AACF,CAAC;","names":["runText","tag","origin","JSZip","import_jszip","getAttr","queryByLocalName","queryAllByLocalName","parseXml","JSZip","escapeHtml","runStyleToCss","h"]}
package/dist/vue.d.cts ADDED
@@ -0,0 +1,24 @@
1
+ import * as vue from 'vue';
2
+ export { D as DocsWordEditorChangeDetail, a as DocsWordEditorElementApi, b as DocsWordEditorErrorDetail, c as DocsWordEditorReadyDetail } from './types-DF14w1ol.cjs';
3
+
4
+ declare const WordFidelityEditorVue: vue.DefineComponent<vue.ExtractPropTypes<{
5
+ lang: {
6
+ type: () => "zh" | "en";
7
+ default: string;
8
+ };
9
+ }>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
10
+ [key: string]: any;
11
+ }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, ("change" | "error" | "ready")[], "change" | "error" | "ready", vue.PublicProps, Readonly<vue.ExtractPropTypes<{
12
+ lang: {
13
+ type: () => "zh" | "en";
14
+ default: string;
15
+ };
16
+ }>> & Readonly<{
17
+ onChange?: ((...args: any[]) => any) | undefined;
18
+ onError?: ((...args: any[]) => any) | undefined;
19
+ onReady?: ((...args: any[]) => any) | undefined;
20
+ }>, {
21
+ lang: "zh" | "en";
22
+ }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
23
+
24
+ export { WordFidelityEditorVue };
package/dist/vue.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ import * as vue from 'vue';
2
+ export { D as DocsWordEditorChangeDetail, a as DocsWordEditorElementApi, b as DocsWordEditorErrorDetail, c as DocsWordEditorReadyDetail } from './types-DF14w1ol.js';
3
+
4
+ declare const WordFidelityEditorVue: vue.DefineComponent<vue.ExtractPropTypes<{
5
+ lang: {
6
+ type: () => "zh" | "en";
7
+ default: string;
8
+ };
9
+ }>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
10
+ [key: string]: any;
11
+ }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, ("change" | "error" | "ready")[], "change" | "error" | "ready", vue.PublicProps, Readonly<vue.ExtractPropTypes<{
12
+ lang: {
13
+ type: () => "zh" | "en";
14
+ default: string;
15
+ };
16
+ }>> & Readonly<{
17
+ onChange?: ((...args: any[]) => any) | undefined;
18
+ onError?: ((...args: any[]) => any) | undefined;
19
+ onReady?: ((...args: any[]) => any) | undefined;
20
+ }>, {
21
+ lang: "zh" | "en";
22
+ }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
23
+
24
+ export { WordFidelityEditorVue };
package/dist/vue.js ADDED
@@ -0,0 +1,44 @@
1
+ import {
2
+ defineDocsWordElement
3
+ } from "./chunk-PRPDJOB7.js";
4
+
5
+ // src/vue/WordFidelityEditorVue.ts
6
+ import { defineComponent, h, onBeforeUnmount, onMounted, ref } from "vue";
7
+ defineDocsWordElement();
8
+ var WordFidelityEditorVue = defineComponent({
9
+ name: "WordFidelityEditorVue",
10
+ props: {
11
+ lang: {
12
+ type: String,
13
+ default: "zh"
14
+ }
15
+ },
16
+ emits: ["change", "error", "ready"],
17
+ setup(props, { emit }) {
18
+ const elRef = ref(null);
19
+ const onChange = (event) => {
20
+ emit("change", event.detail);
21
+ };
22
+ const onError = (event) => {
23
+ emit("error", event.detail);
24
+ };
25
+ const onReady = (event) => {
26
+ emit("ready", event.detail);
27
+ };
28
+ onMounted(() => {
29
+ elRef.value?.addEventListener("docsjs-change", onChange);
30
+ elRef.value?.addEventListener("docsjs-error", onError);
31
+ elRef.value?.addEventListener("docsjs-ready", onReady);
32
+ });
33
+ onBeforeUnmount(() => {
34
+ elRef.value?.removeEventListener("docsjs-change", onChange);
35
+ elRef.value?.removeEventListener("docsjs-error", onError);
36
+ elRef.value?.removeEventListener("docsjs-ready", onReady);
37
+ });
38
+ return () => h("docs-word-editor", { ref: elRef, lang: props.lang });
39
+ }
40
+ });
41
+ export {
42
+ WordFidelityEditorVue
43
+ };
44
+ //# sourceMappingURL=vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vue/WordFidelityEditorVue.ts"],"sourcesContent":["import { defineComponent, h, onBeforeUnmount, onMounted, ref } from \"vue\";\nimport { defineDocsWordElement } from \"../core/DocsWordElement\";\nimport type {\n DocsWordEditorChangeDetail,\n DocsWordEditorElementApi,\n DocsWordEditorErrorDetail,\n DocsWordEditorReadyDetail\n} from \"../core/types\";\n\ndefineDocsWordElement();\n\nexport const WordFidelityEditorVue = defineComponent({\n name: \"WordFidelityEditorVue\",\n props: {\n lang: {\n type: String as () => \"zh\" | \"en\",\n default: \"zh\"\n }\n },\n emits: [\"change\", \"error\", \"ready\"],\n setup(props, { emit }) {\n const elRef = ref<DocsWordEditorElementApi | null>(null);\n\n const onChange = (event: Event) => {\n emit(\"change\", (event as CustomEvent<DocsWordEditorChangeDetail>).detail);\n };\n const onError = (event: Event) => {\n emit(\"error\", (event as CustomEvent<DocsWordEditorErrorDetail>).detail);\n };\n const onReady = (event: Event) => {\n emit(\"ready\", (event as CustomEvent<DocsWordEditorReadyDetail>).detail);\n };\n\n onMounted(() => {\n elRef.value?.addEventListener(\"docsjs-change\", onChange);\n elRef.value?.addEventListener(\"docsjs-error\", onError);\n elRef.value?.addEventListener(\"docsjs-ready\", onReady);\n });\n\n onBeforeUnmount(() => {\n elRef.value?.removeEventListener(\"docsjs-change\", onChange);\n elRef.value?.removeEventListener(\"docsjs-error\", onError);\n elRef.value?.removeEventListener(\"docsjs-ready\", onReady);\n });\n\n return () => h(\"docs-word-editor\", { ref: elRef, lang: props.lang });\n }\n});\n"],"mappings":";;;;;AAAA,SAAS,iBAAiB,GAAG,iBAAiB,WAAW,WAAW;AASpE,sBAAsB;AAEf,IAAM,wBAAwB,gBAAgB;AAAA,EACnD,MAAM;AAAA,EACN,OAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,OAAO,CAAC,UAAU,SAAS,OAAO;AAAA,EAClC,MAAM,OAAO,EAAE,KAAK,GAAG;AACrB,UAAM,QAAQ,IAAqC,IAAI;AAEvD,UAAM,WAAW,CAAC,UAAiB;AACjC,WAAK,UAAW,MAAkD,MAAM;AAAA,IAC1E;AACA,UAAM,UAAU,CAAC,UAAiB;AAChC,WAAK,SAAU,MAAiD,MAAM;AAAA,IACxE;AACA,UAAM,UAAU,CAAC,UAAiB;AAChC,WAAK,SAAU,MAAiD,MAAM;AAAA,IACxE;AAEA,cAAU,MAAM;AACd,YAAM,OAAO,iBAAiB,iBAAiB,QAAQ;AACvD,YAAM,OAAO,iBAAiB,gBAAgB,OAAO;AACrD,YAAM,OAAO,iBAAiB,gBAAgB,OAAO;AAAA,IACvD,CAAC;AAED,oBAAgB,MAAM;AACpB,YAAM,OAAO,oBAAoB,iBAAiB,QAAQ;AAC1D,YAAM,OAAO,oBAAoB,gBAAgB,OAAO;AACxD,YAAM,OAAO,oBAAoB,gBAAgB,OAAO;AAAA,IAC1D,CAAC;AAED,WAAO,MAAM,EAAE,oBAAoB,EAAE,KAAK,OAAO,MAAM,MAAM,KAAK,CAAC;AAAA,EACrE;AACF,CAAC;","names":[]}
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@coding01/docsjs",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Render-first Word fidelity component with Web Component core and React/Vue adapters",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
+ "sideEffects": false,
7
8
  "main": "dist/index.cjs",
8
9
  "module": "dist/index.js",
9
10
  "types": "dist/index.d.ts",
@@ -12,15 +13,32 @@
12
13
  "types": "./dist/index.d.ts",
13
14
  "import": "./dist/index.js",
14
15
  "require": "./dist/index.cjs"
16
+ },
17
+ "./react": {
18
+ "types": "./dist/react.d.ts",
19
+ "import": "./dist/react.js",
20
+ "require": "./dist/react.cjs"
21
+ },
22
+ "./vue": {
23
+ "types": "./dist/vue.d.ts",
24
+ "import": "./dist/vue.js",
25
+ "require": "./dist/vue.cjs"
15
26
  }
16
27
  },
17
28
  "files": [
18
29
  "dist"
19
30
  ],
20
31
  "scripts": {
32
+ "lint": "eslint .",
21
33
  "build": "tsup",
34
+ "test": "vitest run",
22
35
  "typecheck": "tsc --noEmit",
23
- "prepublishOnly": "npm run typecheck && npm run build"
36
+ "sizecheck": "node scripts/check-dist-size.mjs",
37
+ "status:report": "node scripts/report_status.mjs",
38
+ "visual:update": "node scripts/visual-regression.mjs --update",
39
+ "visual:test": "node scripts/visual-regression.mjs",
40
+ "verify": "npm run lint && npm run typecheck && npm run test && npm run build && npm run sizecheck",
41
+ "prepublishOnly": "npm run verify"
24
42
  },
25
43
  "keywords": [
26
44
  "word",
@@ -52,11 +70,20 @@
52
70
  "jszip": "^3.10.1"
53
71
  },
54
72
  "devDependencies": {
73
+ "@eslint/js": "^9.18.0",
55
74
  "@types/node": "^22.10.5",
56
75
  "@types/react": "^19.0.2",
57
76
  "@types/react-dom": "^19.0.2",
77
+ "eslint": "^9.18.0",
78
+ "globals": "^15.14.0",
79
+ "pixelmatch": "^6.0.0",
80
+ "playwright": "^1.51.1",
81
+ "pngjs": "^7.0.0",
58
82
  "tsup": "^8.3.5",
83
+ "typescript-eslint": "^8.20.0",
59
84
  "typescript": "^5.7.3",
85
+ "vitest": "^3.2.4",
86
+ "jsdom": "^26.0.0",
60
87
  "vue": "^3.5.13"
61
88
  },
62
89
  "peerDependenciesMeta": {