@open-file-viewer/core 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.
- package/README.md +2 -1
- package/dist/index.cjs +484 -181
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +484 -181
- package/dist/index.js.map +1 -1
- package/dist/style.css +452 -55
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/detect.ts","../src/dom.ts","../src/plugins/fallback.ts","../src/viewer.ts","../src/plugins/image.ts","../src/plugins/video.ts","../src/plugins/audio.ts","../src/plugins/text.ts","../src/plugins/pdf.ts","../src/plugins/epub.ts","../src/plugins/utils.ts","../src/plugins/xps.ts","../src/plugins/office.ts","../src/plugins/ofd.ts","../src/plugins/archive.ts","../src/plugins/email.ts","../src/plugins/drawing.ts","../src/plugins/cad.ts","../src/plugins/model3d.ts","../src/plugins/gis.ts","../src/plugins/asset.ts"],"sourcesContent":["export { createViewer } from \"./viewer\";\nexport { imagePlugin } from \"./plugins/image\";\nexport { videoPlugin } from \"./plugins/video\";\nexport { audioPlugin } from \"./plugins/audio\";\nexport { textPlugin } from \"./plugins/text\";\nexport { pdfPlugin } from \"./plugins/pdf\";\nexport { epubPlugin } from \"./plugins/epub\";\nexport { xpsPlugin } from \"./plugins/xps\";\nexport { officePlugin } from \"./plugins/office\";\nexport { ofdPlugin } from \"./plugins/ofd\";\nexport { archivePlugin } from \"./plugins/archive\";\nexport { emailPlugin } from \"./plugins/email\";\nexport { drawingPlugin } from \"./plugins/drawing\";\nexport { cadPlugin } from \"./plugins/cad\";\nexport { model3dPlugin } from \"./plugins/model3d\";\nexport { gisPlugin } from \"./plugins/gis\";\nexport { assetPlugin } from \"./plugins/asset\";\nexport { fallbackPlugin } from \"./plugins/fallback\";\nexport type {\n FileViewer,\n PreviewCommand,\n PreviewContext,\n PreviewFallback,\n PreviewFile,\n PreviewFit,\n PreviewInstance,\n PreviewItem,\n PreviewOptions,\n PreviewPlugin,\n PreviewSize,\n PreviewSource,\n PreviewTheme,\n PreviewToolbarActionId,\n PreviewToolbarBuiltInAction,\n PreviewToolbarCustomAction,\n PreviewToolbarOptions,\n PreviewToolbarRenderContext\n} from \"./types\";\n","import type { PreviewFile, PreviewSource } from \"./types\";\n\nconst extensionMimeMap: Record<string, string> = {\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n jfif: \"image/jpeg\",\n pjpe: \"image/pjpeg\",\n pjpeg: \"image/pjpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n jxl: \"image/jxl\",\n svg: \"image/svg+xml\",\n bmp: \"image/bmp\",\n ico: \"image/x-icon\",\n cur: \"image/x-icon\",\n tif: \"image/tiff\",\n tiff: \"image/tiff\",\n apng: \"image/apng\",\n heic: \"image/heic\",\n heif: \"image/heif\",\n mp4: \"video/mp4\",\n mpg: \"video/mpeg\",\n mpeg: \"video/mpeg\",\n mpe: \"video/mpeg\",\n mpv: \"video/mpv\",\n webm: \"video/webm\",\n ogg: \"audio/ogg\",\n ogv: \"video/ogg\",\n mov: \"video/quicktime\",\n m4v: \"video/x-m4v\",\n avi: \"video/x-msvideo\",\n mkv: \"video/x-matroska\",\n flv: \"video/x-flv\",\n wmv: \"video/x-ms-wmv\",\n \"3gp\": \"video/3gpp\",\n \"3g2\": \"video/3gpp2\",\n m2ts: \"video/mp2t\",\n m3u8: \"application/vnd.apple.mpegurl\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n aif: \"audio/aiff\",\n aiff: \"audio/aiff\",\n aifc: \"audio/aiff\",\n aac: \"audio/aac\",\n m4a: \"audio/mp4\",\n flac: \"audio/flac\",\n opus: \"audio/opus\",\n oga: \"audio/ogg\",\n weba: \"audio/webm\",\n amr: \"audio/amr\",\n mid: \"audio/midi\",\n midi: \"audio/midi\",\n caf: \"audio/x-caf\",\n au: \"audio/basic\",\n snd: \"audio/basic\",\n wma: \"audio/x-ms-wma\",\n pdf: \"application/pdf\",\n epub: \"application/epub+zip\",\n xps: \"application/vnd.ms-xpsdocument\",\n oxps: \"application/oxps\",\n txt: \"text/plain\",\n log: \"text/plain\",\n env: \"text/plain\",\n gitignore: \"text/plain\",\n dockerignore: \"text/plain\",\n npmrc: \"text/plain\",\n yarnrc: \"text/plain\",\n pnpmrc: \"text/plain\",\n editorconfig: \"text/plain\",\n browserslistrc: \"text/plain\",\n prettierrc: \"application/json\",\n eslintrc: \"application/json\",\n stylelintrc: \"application/json\",\n conf: \"text/plain\",\n config: \"text/plain\",\n properties: \"text/plain\",\n lock: \"text/plain\",\n json: \"application/json\",\n jsonc: \"application/json\",\n json5: \"application/json5\",\n ipynb: \"application/x-ipynb+json\",\n jsonl: \"application/x-ndjson\",\n ndjson: \"application/x-ndjson\",\n xml: \"application/xml\",\n yaml: \"text/yaml\",\n yml: \"text/yaml\",\n csv: \"text/csv\",\n tsv: \"text/tab-separated-values\",\n md: \"text/markdown\",\n markdown: \"text/markdown\",\n toml: \"application/toml\",\n ini: \"text/plain\",\n proto: \"text/x-protobuf\",\n tf: \"text/x-hcl\",\n tfvars: \"text/x-hcl\",\n hcl: \"text/x-hcl\",\n tex: \"application/x-tex\",\n latex: \"application/x-tex\",\n bib: \"text/x-bibtex\",\n gv: \"text/vnd.graphviz\",\n http: \"message/http\",\n css: \"text/css\",\n scss: \"text/css\",\n less: \"text/css\",\n js: \"text/javascript\",\n mjs: \"text/javascript\",\n cjs: \"text/javascript\",\n ts: \"text/typescript\",\n tsx: \"text/typescript\",\n jsx: \"text/javascript\",\n htm: \"text/html\",\n html: \"text/html\",\n vue: \"text/plain\",\n py: \"text/x-python\",\n java: \"text/x-java-source\",\n go: \"text/x-go\",\n rs: \"text/rust\",\n rb: \"text/x-ruby\",\n swift: \"text/x-swift\",\n kt: \"text/x-kotlin\",\n kts: \"text/x-kotlin\",\n scala: \"text/x-scala\",\n lua: \"text/x-lua\",\n r: \"text/x-r\",\n dart: \"text/x-dart\",\n svelte: \"text/plain\",\n astro: \"text/plain\",\n elm: \"text/x-elm\",\n ex: \"text/x-elixir\",\n exs: \"text/x-elixir\",\n clj: \"text/x-clojure\",\n cljs: \"text/x-clojure\",\n erl: \"text/x-erlang\",\n hrl: \"text/x-erlang\",\n fs: \"text/x-fsharp\",\n fsx: \"text/x-fsharp\",\n hs: \"text/x-haskell\",\n lhs: \"text/x-haskell\",\n php: \"application/x-httpd-php\",\n c: \"text/x-c\",\n cpp: \"text/x-c++src\",\n h: \"text/x-c\",\n hpp: \"text/x-c++hdr\",\n cs: \"text/x-csharp\",\n sql: \"application/sql\",\n sh: \"application/x-sh\",\n bash: \"application/x-sh\",\n zsh: \"application/x-sh\",\n fish: \"application/x-sh\",\n ps1: \"text/plain\",\n bat: \"text/plain\",\n cmd: \"text/plain\",\n dockerfile: \"text/plain\",\n nginxconf: \"text/plain\",\n gradle: \"text/plain\",\n graphql: \"application/graphql\",\n gql: \"application/graphql\",\n pem: \"application/x-pem-file\",\n crt: \"application/x-x509-ca-cert\",\n cer: \"application/pkix-cert\",\n ics: \"text/calendar\",\n vcf: \"text/vcard\",\n diff: \"text/x-diff\",\n patch: \"text/x-diff\",\n geojson: \"application/geo+json\",\n topojson: \"application/topo+json\",\n kml: \"application/vnd.google-earth.kml+xml\",\n kmz: \"application/vnd.google-earth.kmz\",\n gpx: \"application/gpx+xml\",\n shp: \"application/octet-stream\",\n drawio: \"application/vnd.jgraph.mxfile\",\n dio: \"application/vnd.jgraph.mxfile\",\n excalidraw: \"application/vnd.excalidraw+json\",\n tldraw: \"application/json\",\n zip: \"application/zip\",\n rar: \"application/vnd.rar\",\n \"7z\": \"application/x-7z-compressed\",\n tar: \"application/x-tar\",\n gz: \"application/gzip\",\n tgz: \"application/gzip\",\n bz2: \"application/x-bzip2\",\n xz: \"application/x-xz\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n docm: \"application/vnd.ms-word.document.macroenabled.12\",\n dotx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\",\n dotm: \"application/vnd.ms-word.template.macroenabled.12\",\n dot: \"application/msword\",\n doc: \"application/msword\",\n rtf: \"application/rtf\",\n odt: \"application/vnd.oasis.opendocument.text\",\n fodt: \"application/vnd.oasis.opendocument.text-flat-xml\",\n wps: \"application/vnd.ms-works\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n xltx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\",\n xls: \"application/vnd.ms-excel\",\n xlsm: \"application/vnd.ms-excel.sheet.macroenabled.12\",\n xltm: \"application/vnd.ms-excel.template.macroenabled.12\",\n xlsb: \"application/vnd.ms-excel.sheet.binary.macroenabled.12\",\n ods: \"application/vnd.oasis.opendocument.spreadsheet\",\n fods: \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\",\n numbers: \"application/vnd.apple.numbers\",\n et: \"application/vnd.ms-excel\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n pptm: \"application/vnd.ms-powerpoint.presentation.macroenabled.12\",\n ppsx: \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\",\n ppsm: \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\",\n potx: \"application/vnd.openxmlformats-officedocument.presentationml.template\",\n potm: \"application/vnd.ms-powerpoint.template.macroenabled.12\",\n ppt: \"application/vnd.ms-powerpoint\",\n pps: \"application/vnd.ms-powerpoint\",\n odp: \"application/vnd.oasis.opendocument.presentation\",\n fodp: \"application/vnd.oasis.opendocument.presentation-flat-xml\",\n key: \"application/vnd.apple.keynote\",\n dps: \"application/vnd.ms-powerpoint\",\n eml: \"message/rfc822\",\n msg: \"application/vnd.ms-outlook\",\n mbox: \"application/mbox\",\n ofd: \"application/ofd\",\n gltf: \"model/gltf+json\",\n glb: \"model/gltf-binary\",\n stl: \"model/stl\",\n obj: \"model/obj\",\n \"3ds\": \"model/3ds\",\n fbx: \"application/vnd.autodesk.fbx\",\n dae: \"model/vnd.collada+xml\",\n ply: \"application/ply\",\n \"3mf\": \"model/3mf\",\n usdz: \"model/vnd.usdz+zip\",\n usdc: \"model/vnd.usd\",\n usda: \"model/vnd.usd\",\n usd: \"model/vnd.usd\",\n wrl: \"model/vrml\",\n vrml: \"model/vrml\",\n dxf: \"image/vnd.dxf\",\n dwg: \"application/acad\",\n dwf: \"model/vnd.dwf\",\n step: \"model/step\",\n stp: \"model/step\",\n iges: \"application/iges\",\n igs: \"application/iges\",\n ifc: \"application/x-step\",\n sat: \"application/sat\",\n sab: \"application/sab\",\n \"x_t\": \"application/x-parasolid\",\n \"x_b\": \"application/x-parasolid\",\n \"3dm\": \"model/vnd.3dm\",\n skp: \"application/vnd.sketchup.skp\",\n sldprt: \"application/sldworks\",\n sldasm: \"application/sldworks\",\n ttf: \"font/ttf\",\n otf: \"font/otf\",\n woff: \"font/woff\",\n woff2: \"font/woff2\",\n eot: \"application/vnd.ms-fontobject\",\n psd: \"image/vnd.adobe.photoshop\",\n psb: \"image/vnd.adobe.photoshop\",\n ai: \"application/postscript\",\n eps: \"application/postscript\",\n ps: \"application/postscript\",\n webarchive: \"application/x-webarchive\",\n sqlite: \"application/vnd.sqlite3\",\n sqlite3: \"application/vnd.sqlite3\",\n db: \"application/vnd.sqlite3\",\n wasm: \"application/wasm\",\n parquet: \"application/vnd.apache.parquet\",\n avro: \"application/avro\"\n};\n\nexport async function normalizeFile(\n source: PreviewSource,\n fileName?: string,\n mimeType?: string\n): Promise<PreviewFile> {\n if (typeof source === \"string\") {\n const name = fileName || source.split(\"?\")[0]?.split(\"/\").pop() || \"remote-file\";\n const extension = getExtension(name);\n return {\n source,\n name,\n extension,\n mimeType: mimeType || extensionMimeMap[extension] || \"\",\n url: source\n };\n }\n\n if (source instanceof File) {\n const extension = getExtension(fileName || source.name);\n return {\n source,\n name: fileName || source.name,\n extension,\n mimeType: mimeType || source.type || extensionMimeMap[extension] || \"\",\n size: source.size,\n blob: source\n };\n }\n\n if (source instanceof Blob) {\n const name = fileName || \"blob\";\n const extension = getExtension(name);\n return {\n source,\n name,\n extension,\n mimeType: mimeType || source.type || extensionMimeMap[extension] || \"\",\n size: source.size,\n blob: source\n };\n }\n\n const name = fileName || \"buffer\";\n const extension = getExtension(name);\n const blob = new Blob([source], { type: mimeType || extensionMimeMap[extension] || \"\" });\n return {\n source,\n name,\n extension,\n mimeType: blob.type,\n size: blob.size,\n blob\n };\n}\n\nexport function getExtension(name: string): string {\n const clean = name.split(\"?\")[0]?.split(\"#\")[0] || \"\";\n const index = clean.lastIndexOf(\".\");\n return index >= 0 ? clean.slice(index + 1).toLowerCase() : \"\";\n}\n\nexport function isTextLike(file: PreviewFile): boolean {\n const textFileName = normalizeFileName(file.name);\n const textFileStem = textFileName.split(\".\")[0];\n return (\n file.mimeType.startsWith(\"text/\") ||\n [\n \"application/json\",\n \"application/json5\",\n \"application/x-ipynb+json\",\n \"application/xml\",\n \"application/yaml\",\n \"application/x-yaml\",\n \"application/sql\",\n \"application/x-sh\",\n \"application/x-httpd-php\",\n \"application/javascript\",\n \"application/x-javascript\",\n \"application/typescript\",\n \"application/x-typescript\",\n \"application/toml\",\n \"application/x-toml\",\n \"application/x-ndjson\",\n \"application/graphql\",\n \"application/x-pem-file\",\n \"application/x-x509-ca-cert\",\n \"application/pkix-cert\",\n \"application/x-tex\",\n \"message/http\",\n \"text/calendar\",\n \"text/vcard\",\n \"text/x-bibtex\",\n \"text/x-hcl\",\n \"text/x-protobuf\",\n \"text/vnd.graphviz\"\n ].includes(file.mimeType) ||\n [\n \"txt\",\n \"json\",\n \"jsonc\",\n \"json5\",\n \"ipynb\",\n \"jsonl\",\n \"ndjson\",\n \"xml\",\n \"yaml\",\n \"yml\",\n \"csv\",\n \"log\",\n \"env\",\n \"gitignore\",\n \"dockerignore\",\n \"npmrc\",\n \"yarnrc\",\n \"pnpmrc\",\n \"editorconfig\",\n \"browserslistrc\",\n \"prettierrc\",\n \"eslintrc\",\n \"stylelintrc\",\n \"conf\",\n \"config\",\n \"properties\",\n \"lock\",\n \"md\",\n \"markdown\",\n \"js\",\n \"mjs\",\n \"cjs\",\n \"ts\",\n \"tsx\",\n \"jsx\",\n \"vue\",\n \"css\",\n \"scss\",\n \"less\",\n \"html\",\n \"htm\",\n \"toml\",\n \"ini\",\n \"proto\",\n \"tf\",\n \"tfvars\",\n \"hcl\",\n \"tex\",\n \"latex\",\n \"bib\",\n \"gv\",\n \"http\",\n \"java\",\n \"py\",\n \"go\",\n \"rs\",\n \"rb\",\n \"swift\",\n \"kt\",\n \"kts\",\n \"scala\",\n \"lua\",\n \"r\",\n \"dart\",\n \"svelte\",\n \"astro\",\n \"elm\",\n \"ex\",\n \"exs\",\n \"clj\",\n \"cljs\",\n \"erl\",\n \"hrl\",\n \"fs\",\n \"fsx\",\n \"hs\",\n \"lhs\",\n \"php\",\n \"c\",\n \"cpp\",\n \"h\",\n \"hpp\",\n \"cs\",\n \"sql\",\n \"sh\",\n \"bash\",\n \"zsh\",\n \"fish\",\n \"ps1\",\n \"bat\",\n \"cmd\",\n \"dockerfile\",\n \"nginxconf\",\n \"gradle\",\n \"graphql\",\n \"gql\",\n \"pem\",\n \"crt\",\n \"cer\",\n \"ics\",\n \"vcf\",\n \"diff\",\n \"patch\"\n ].includes(file.extension) ||\n [\n \"dockerfile\",\n \"makefile\",\n \"rakefile\",\n \"gemfile\",\n \"procfile\",\n \"jenkinsfile\",\n \"vagrantfile\",\n \"brewfile\",\n \"podfile\",\n \"go.mod\",\n \"go.sum\",\n \"cargo.toml\",\n \"cargo.lock\",\n \".gitignore\",\n \".dockerignore\",\n \".npmrc\",\n \".yarnrc\",\n \".pnpmrc\",\n \".editorconfig\",\n \".browserslistrc\",\n \".prettierrc\",\n \".eslintrc\",\n \".stylelintrc\"\n ].includes(textFileName) ||\n [\n \"readme\",\n \"changelog\",\n \"changes\",\n \"history\",\n \"license\",\n \"licence\",\n \"copying\",\n \"notice\",\n \"authors\",\n \"contributors\",\n \"codeowners\"\n ].includes(textFileStem)\n );\n}\n\nfunction normalizeFileName(name: string): string {\n const baseName = name.split(/[\\\\/]/).pop() || name;\n return baseName.toLowerCase();\n}\n","import type { PreviewSize } from \"./types\";\n\nexport function resolveContainer(container: HTMLElement | string): HTMLElement {\n if (typeof container !== \"string\") {\n return container;\n }\n\n const element = document.querySelector<HTMLElement>(container);\n if (!element) {\n throw new Error(`File viewer container not found: ${container}`);\n }\n return element;\n}\n\nexport function applyBoxSize(\n element: HTMLElement,\n width?: number | string,\n height?: number | string\n): void {\n if (width !== undefined) {\n element.style.width = typeof width === \"number\" ? `${width}px` : width;\n }\n if (height !== undefined) {\n element.style.height = typeof height === \"number\" ? `${height}px` : height;\n }\n}\n\nexport function getElementSize(element: HTMLElement): PreviewSize {\n const rect = element.getBoundingClientRect();\n return {\n width: Math.max(0, Math.round(rect.width)),\n height: Math.max(0, Math.round(rect.height))\n };\n}\n\nexport function createObjectUrl(file: { url?: string; blob?: Blob }): string {\n if (file.url) {\n return file.url;\n }\n if (!file.blob) {\n throw new Error(\"File source cannot be converted to an object URL.\");\n }\n return URL.createObjectURL(file.blob);\n}\n\nexport function revokeObjectUrl(url: string, isExternal: boolean): void {\n if (!isExternal) {\n URL.revokeObjectURL(url);\n }\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\n\nexport function fallbackPlugin(): PreviewPlugin {\n return {\n name: \"fallback\",\n match() {\n return true;\n },\n render(ctx) {\n ctx.options.onUnsupported?.(ctx.file);\n if (ctx.options.fallback === \"custom\" && ctx.options.renderFallback) {\n return ctx.options.renderFallback(ctx);\n }\n\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent =\n ctx.options.fallback === \"download\"\n ? \"当前文件可下载后查看\"\n : \"当前文件暂不支持在线预览\";\n\n const meta = createFallbackMeta(ctx.file);\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n\n panel.append(title, meta, download);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(panel);\n\n if (ctx.options.fallback === \"download\") {\n download.focus();\n }\n\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\nfunction createFallbackMeta(file: { name: string; extension: string; mimeType: string; size?: number; url?: string }): HTMLElement {\n const meta = document.createElement(\"dl\");\n meta.className = \"ofv-fallback-meta\";\n appendFallbackMeta(meta, \"文件\", file.name || \"未命名文件\");\n appendFallbackMeta(meta, \"格式\", file.extension ? `.${file.extension}` : \"未知\");\n appendFallbackMeta(meta, \"MIME\", file.mimeType || \"未声明\");\n appendFallbackMeta(meta, \"大小\", file.size === undefined ? \"未知\" : formatFallbackBytes(file.size));\n appendFallbackMeta(meta, \"来源\", file.url ? \"远程 URL\" : \"本地/内存文件\");\n return meta;\n}\n\nfunction appendFallbackMeta(parent: HTMLElement, label: string, value: string): void {\n const key = document.createElement(\"dt\");\n key.textContent = label;\n const content = document.createElement(\"dd\");\n content.textContent = value;\n parent.append(key, content);\n}\n\nfunction formatFallbackBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n","import { normalizeFile } from \"./detect\";\nimport { applyBoxSize, createObjectUrl, getElementSize, resolveContainer, revokeObjectUrl } from \"./dom\";\nimport { fallbackPlugin } from \"./plugins/fallback\";\nimport type {\n FileViewer,\n PreviewFile,\n PreviewCommand,\n PreviewInstance,\n PreviewItem,\n PreviewOptions,\n PreviewPlugin,\n PreviewSource,\n PreviewToolbarActionId,\n PreviewToolbarBuiltInAction,\n PreviewToolbarCustomAction,\n PreviewToolbarOptions\n} from \"./types\";\n\nexport function createViewer(options: PreviewOptions): FileViewer {\n const container = resolveContainer(options.container);\n applyBoxSize(container, options.width, options.height);\n\n container.classList.add(\"ofv-root\");\n if (options.className) {\n container.classList.add(options.className);\n }\n const theme = applyTheme(container, options.theme || \"light\");\n\n const host = document.createElement(\"div\");\n host.className = \"ofv-host\";\n\n const status = document.createElement(\"div\");\n status.className = \"ofv-status\";\n status.hidden = true;\n\n const viewport = document.createElement(\"div\");\n viewport.className = \"ofv-viewport\";\n\n const queue = normalizeQueue(options);\n let currentIndex = clampIndex(options.initialIndex || 0, queue.length);\n let currentInstance: PreviewInstance | undefined;\n\n const goTo = async (index: number) => {\n if (destroyed || queue.length === 0) {\n return;\n }\n currentIndex = clampIndex(index, queue.length);\n await renderQueueItem(currentIndex);\n };\n\n const toolbar = createToolbar(options.toolbar, viewport, {\n getLength: () => queue.length,\n next: () => goTo(currentIndex + 1),\n previous: () => goTo(currentIndex - 1),\n command: (command) => currentInstance?.command?.(command)\n });\n if (toolbar) {\n host.append(toolbar.element);\n }\n\n host.append(status, viewport);\n container.replaceChildren(host);\n\n const normalizedOptions = {\n fit: options.fit || \"contain\",\n fallback: options.fallback || \"inline\",\n ...options\n };\n\n let destroyed = false;\n let renderToken = 0;\n\n const setLoading = (loading: boolean) => {\n status.hidden = !loading;\n status.textContent = loading ? \"Loading preview...\" : \"\";\n };\n\n const setError = (error: Error | string) => {\n status.hidden = false;\n status.textContent = typeof error === \"string\" ? error : error.message;\n };\n\n const resize = () => {\n if (destroyed) {\n return;\n }\n const size = getElementSize(viewport);\n currentInstance?.resize?.(size);\n };\n\n const resizeObserver = observeResize(container, resize);\n\n const renderFile = async (file: PreviewFile) => {\n const token = (renderToken += 1);\n currentInstance?.destroy();\n currentInstance = undefined;\n viewport.replaceChildren();\n setLoading(true);\n toolbar?.update(file, currentIndex, queue.length);\n\n const plugins = [...(options.plugins || []), fallbackPlugin()];\n const plugin = await findPlugin(plugins, file);\n if (destroyed || token !== renderToken) {\n return;\n }\n\n try {\n const nextInstance = await plugin.render({\n host,\n viewport,\n file,\n size: getElementSize(viewport),\n options: normalizedOptions,\n toolbar: toolbar?.getContext(),\n setLoading,\n setError\n });\n if (destroyed || token !== renderToken) {\n nextInstance.destroy();\n return;\n }\n currentInstance = nextInstance;\n setLoading(false);\n toolbar?.setCommandSupport((command) =>\n Boolean(nextInstance.command) && (nextInstance.canCommand ? nextInstance.canCommand(command) : true)\n );\n options.onLoad?.(file);\n resize();\n } catch (error) {\n if (destroyed || token !== renderToken) {\n return;\n }\n const normalizedError = error instanceof Error ? error : new Error(String(error));\n setLoading(false);\n setError(normalizedError);\n options.onError?.(normalizedError, file);\n }\n };\n\n async function renderQueueItem(index: number) {\n const item = queue[index];\n const file = await normalizeFile(item.file, item.fileName, item.mimeType);\n await renderFile(file);\n }\n\n void goTo(currentIndex);\n\n return {\n async reload(file) {\n if (destroyed) {\n return;\n }\n if (file !== undefined) {\n const currentItem = queue[currentIndex];\n queue.splice(currentIndex, 1, createReloadItem(file, currentItem, options));\n }\n await renderQueueItem(currentIndex);\n },\n async next() {\n await goTo(currentIndex + 1);\n },\n async previous() {\n await goTo(currentIndex - 1);\n },\n goTo,\n getCurrentIndex() {\n return currentIndex;\n },\n resize,\n destroy() {\n destroyed = true;\n renderToken += 1;\n resizeObserver.destroy();\n currentInstance?.destroy();\n toolbar?.destroy();\n theme.destroy();\n container.replaceChildren();\n container.classList.remove(\"ofv-root\");\n if (options.className) {\n container.classList.remove(options.className);\n }\n }\n };\n}\n\nfunction normalizeQueue(options: PreviewOptions): PreviewItem[] {\n if (options.files && options.files.length > 0) {\n return options.files.map((item) =>\n isPreviewItem(item)\n ? item\n : {\n file: item\n }\n );\n }\n if (options.file === undefined) {\n throw new Error(\"File viewer requires either file or files.\");\n }\n return [\n {\n file: options.file,\n fileName: options.fileName,\n mimeType: options.mimeType\n }\n ];\n}\n\nfunction isPreviewItem(item: PreviewSource | PreviewItem): item is PreviewItem {\n return typeof item === \"object\" && item !== null && \"file\" in item;\n}\n\nfunction createReloadItem(\n file: PreviewSource,\n currentItem: PreviewItem | undefined,\n options: PreviewOptions\n): PreviewItem {\n if (typeof File !== \"undefined\" && file instanceof File) {\n return { file };\n }\n return {\n file,\n fileName: currentItem?.fileName || options.fileName,\n mimeType: currentItem?.mimeType || options.mimeType\n };\n}\n\nfunction clampIndex(index: number, length: number): number {\n if (length <= 0) {\n return 0;\n }\n return Math.min(Math.max(index, 0), length - 1);\n}\n\nfunction applyTheme(\n container: HTMLElement,\n theme: NonNullable<PreviewOptions[\"theme\"]>\n): { destroy: () => void } {\n const media = window.matchMedia?.(\"(prefers-color-scheme: dark)\");\n const classes = [\"ofv-theme-light\", \"ofv-theme-dark\"];\n\n const setThemeClass = () => {\n container.classList.remove(...classes);\n const resolvedTheme = theme === \"auto\" && media?.matches ? \"dark\" : theme === \"auto\" ? \"light\" : theme;\n container.classList.add(`ofv-theme-${resolvedTheme}`);\n };\n\n setThemeClass();\n if (theme === \"auto\") {\n addMediaListener(media, setThemeClass);\n }\n\n return {\n destroy() {\n if (theme === \"auto\") {\n removeMediaListener(media, setThemeClass);\n }\n container.classList.remove(...classes);\n }\n };\n}\n\nfunction observeResize(element: HTMLElement, callback: () => void): { destroy: () => void } {\n if (typeof ResizeObserver !== \"undefined\") {\n const observer = new ResizeObserver(callback);\n observer.observe(element);\n return {\n destroy() {\n observer.disconnect();\n }\n };\n }\n\n window.addEventListener(\"resize\", callback);\n return {\n destroy() {\n window.removeEventListener(\"resize\", callback);\n }\n };\n}\n\ntype CompatibleMediaQueryList = MediaQueryList & {\n addListener?: (listener: () => void) => void;\n removeListener?: (listener: () => void) => void;\n};\n\nfunction addMediaListener(media: CompatibleMediaQueryList | undefined, listener: () => void): void {\n if (!media) {\n return;\n }\n if (typeof media.addEventListener === \"function\") {\n media.addEventListener(\"change\", listener);\n return;\n }\n media.addListener?.(listener);\n}\n\nfunction removeMediaListener(media: CompatibleMediaQueryList | undefined, listener: () => void): void {\n if (!media) {\n return;\n }\n if (typeof media.removeEventListener === \"function\") {\n media.removeEventListener(\"change\", listener);\n return;\n }\n media.removeListener?.(listener);\n}\n\nfunction createToolbar(\n toolbar: PreviewOptions[\"toolbar\"],\n viewport: HTMLElement,\n queue: {\n getLength: () => number;\n next: () => void | Promise<void>;\n previous: () => void | Promise<void>;\n command: (command: PreviewCommand) => void | boolean | undefined;\n }\n):\n | {\n element: HTMLElement;\n update: (file: PreviewFile, index: number, length: number) => void;\n setCommandSupport: (isSupported: (command: PreviewCommand) => boolean) => void;\n getContext: () => ReturnType<typeof createToolbarContext>;\n destroy: () => void;\n }\n | undefined {\n if (!toolbar) {\n return undefined;\n }\n\n const options: PreviewToolbarOptions =\n typeof toolbar === \"boolean\"\n ? { zoom: true, rotate: true, download: true, fullscreen: true, print: true, search: true }\n : toolbar;\n\n const element = document.createElement(\"div\");\n element.className = \"ofv-toolbar\";\n element.setAttribute(\"role\", \"toolbar\");\n element.setAttribute(\"aria-label\", \"File preview toolbar\");\n\n let file: PreviewFile | undefined;\n let currentIndex = 0;\n let currentLength = queue.getLength();\n let queueLabel: HTMLSpanElement | undefined;\n let previousButton: HTMLButtonElement | undefined;\n let nextButton: HTMLButtonElement | undefined;\n const commandButtons: Array<{ button: HTMLButtonElement; command: PreviewCommand }> = [];\n const customButtons: Array<{ button: HTMLButtonElement; action: PreviewToolbarCustomAction }> = [];\n const disposers: Array<() => void> = [];\n const search = createSearchController(viewport);\n let searchInput: HTMLInputElement | undefined;\n let searchCount: HTMLSpanElement | undefined;\n let canRunCommand = (_command: PreviewCommand) => false;\n\n const getContext = () =>\n createToolbarContext({\n file,\n index: currentIndex,\n length: currentLength,\n viewport,\n queue,\n element,\n search,\n canCommand: canRunCommand\n });\n\n const addButton = (\n label: string,\n title: string,\n action: () => void,\n className?: string,\n icon?: string | HTMLElement | SVGElement\n ) => {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n setToolbarButtonContent(button, label, icon);\n button.title = title;\n button.setAttribute(\"aria-label\", title);\n if (className) {\n button.className = className;\n }\n button.addEventListener(\"click\", action);\n element.append(button);\n disposers.push(() => button.removeEventListener(\"click\", action));\n return button;\n };\n\n const addCommandButton = (\n id: PreviewToolbarBuiltInAction,\n label: string,\n title: string,\n command: PreviewCommand\n ) => {\n const button = addButton(label, title, () => {\n queue.command(command);\n }, undefined, options.icons?.[id]);\n button.disabled = true;\n commandButtons.push({ button, command });\n };\n\n const renderDefaultAction = (id: PreviewToolbarActionId) => {\n if (!isBuiltInToolbarAction(id)) {\n const customAction = options.actions?.find((action) => action.id === id);\n if (customAction) {\n renderCustomAction(customAction);\n }\n return;\n }\n\n if (id === \"previous\" && queue.getLength() > 1) {\n previousButton = addButton(\n getToolbarLabel(options, \"previous\"),\n getToolbarTitle(options, \"previous\"),\n () => void queue.previous(),\n undefined,\n options.icons?.previous\n );\n return;\n }\n if (id === \"next\" && queue.getLength() > 1) {\n nextButton = addButton(\n getToolbarLabel(options, \"next\"),\n getToolbarTitle(options, \"next\"),\n () => void queue.next(),\n undefined,\n options.icons?.next\n );\n return;\n }\n if (id === \"queue\" && queue.getLength() > 1) {\n queueLabel = document.createElement(\"span\");\n queueLabel.className = \"ofv-toolbar-queue\";\n element.append(queueLabel);\n return;\n }\n if (id === \"zoom-out\" && options.zoom) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"zoom-out\");\n return;\n }\n if (id === \"zoom-in\" && options.zoom) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"zoom-in\");\n return;\n }\n if (id === \"zoom-reset\" && options.zoom) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"zoom-reset\");\n return;\n }\n if (id === \"rotate-right\" && options.rotate) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"rotate-right\");\n return;\n }\n if (id === \"download\" && options.download !== false) {\n addButton(\n getToolbarLabel(options, id),\n getToolbarTitle(options, id),\n () => getContext().download(),\n undefined,\n options.icons?.download\n );\n return;\n }\n if (id === \"fullscreen\" && options.fullscreen !== false) {\n addButton(\n getToolbarLabel(options, id),\n getToolbarTitle(options, id),\n () => getContext().fullscreen(),\n undefined,\n options.icons?.fullscreen\n );\n return;\n }\n if (id === \"print\" && options.print) {\n addButton(\n getToolbarLabel(options, id),\n getToolbarTitle(options, id),\n () => getContext().print(),\n undefined,\n options.icons?.print\n );\n return;\n }\n if (id === \"search\" && options.search !== false) {\n renderSearchControl();\n return;\n }\n\n };\n\n const renderCustomAction = (action: PreviewToolbarCustomAction) => {\n const button = addButton(\n action.label,\n action.title || action.label,\n () => void action.onClick(getContext()),\n action.className,\n action.icon\n );\n button.dataset.ofvToolbarAction = action.id;\n customButtons.push({ button, action });\n };\n\n const renderSearchControl = () => {\n const searchGroup = document.createElement(\"div\");\n searchGroup.className = \"ofv-toolbar-search\";\n searchGroup.title = getToolbarTitle(options, \"search\");\n const nextSearchInput = document.createElement(\"input\");\n nextSearchInput.type = \"search\";\n nextSearchInput.placeholder = getToolbarLabel(options, \"search\");\n nextSearchInput.setAttribute(\"aria-label\", getToolbarTitle(options, \"search\"));\n const nextSearchCount = document.createElement(\"span\");\n nextSearchCount.className = \"ofv-toolbar-search-count\";\n searchInput = nextSearchInput;\n searchCount = nextSearchCount;\n\n const runSearch = () => {\n const count = search.search(nextSearchInput.value);\n nextSearchCount.textContent = nextSearchInput.value ? String(count) : \"\";\n };\n\n nextSearchInput.addEventListener(\"input\", runSearch);\n searchGroup.append(nextSearchInput, nextSearchCount);\n element.append(searchGroup);\n disposers.push(() => nextSearchInput.removeEventListener(\"input\", runSearch));\n };\n\n const renderToolbar = () => {\n if (options.render) {\n element.replaceChildren();\n const customElement = options.render(getContext());\n if (customElement) {\n element.append(customElement);\n }\n return;\n }\n getToolbarOrder(options, queue.getLength()).forEach(renderDefaultAction);\n getImplicitCustomActions(options).forEach(renderCustomAction);\n };\n\n renderToolbar();\n\n const updateCustomButtons = () => {\n const context = getContext();\n for (const { button, action } of customButtons) {\n button.disabled = evaluateToolbarFlag(action.disabled, context);\n button.hidden = evaluateToolbarFlag(action.hidden, context);\n }\n };\n\n const resetSearch = () => {\n search.clear();\n if (searchInput) {\n searchInput.value = \"\";\n }\n if (searchCount) {\n searchCount.textContent = \"\";\n }\n };\n\n const refreshCustomRender = () => {\n if (!options.render) {\n return;\n }\n element.replaceChildren();\n const customElement = options.render(getContext());\n if (customElement) {\n element.append(customElement);\n }\n };\n\n return {\n element,\n update(nextFile, index, length) {\n file = nextFile;\n currentIndex = index;\n currentLength = length;\n resetSearch();\n commandButtons.forEach(({ button }) => {\n button.disabled = true;\n });\n if (queueLabel) {\n queueLabel.textContent = `${index + 1} / ${length}`;\n }\n if (previousButton) {\n previousButton.disabled = index <= 0;\n }\n if (nextButton) {\n nextButton.disabled = index >= length - 1;\n }\n updateCustomButtons();\n refreshCustomRender();\n },\n setCommandSupport(isSupported) {\n canRunCommand = isSupported;\n commandButtons.forEach(({ button, command }) => {\n button.disabled = !isSupported(command);\n });\n updateCustomButtons();\n refreshCustomRender();\n },\n getContext,\n destroy() {\n search.clear();\n for (const dispose of disposers) {\n dispose();\n }\n element.replaceChildren();\n },\n };\n}\n\nfunction createToolbarContext({\n file,\n index,\n length,\n viewport,\n queue,\n element,\n search,\n canCommand\n}: {\n file?: PreviewFile;\n index: number;\n length: number;\n viewport: HTMLElement;\n queue: {\n next: () => void | Promise<void>;\n previous: () => void | Promise<void>;\n command: (command: PreviewCommand) => void | boolean | undefined;\n };\n element: HTMLElement;\n search: ReturnType<typeof createSearchController>;\n canCommand: (command: PreviewCommand) => boolean;\n}) {\n return {\n file,\n index,\n length,\n viewport,\n canPrevious: index > 0,\n canNext: index < length - 1,\n async previous() {\n await queue.previous();\n },\n async next() {\n await queue.next();\n },\n command: queue.command,\n canCommand,\n download() {\n if (file) {\n downloadFile(file);\n }\n },\n fullscreen() {\n void element.parentElement?.requestFullscreen?.();\n },\n print() {\n printPreview(viewport);\n },\n search: search.search,\n clearSearch: search.clear\n };\n}\n\nconst defaultToolbarLabels: Record<PreviewToolbarBuiltInAction, string> = {\n previous: \"Prev\",\n next: \"Next\",\n queue: \"\",\n \"zoom-out\": \"-\",\n \"zoom-in\": \"+\",\n \"zoom-reset\": \"100%\",\n \"rotate-right\": \"Rotate\",\n download: \"Download\",\n fullscreen: \"Fullscreen\",\n print: \"Print\",\n search: \"Search\"\n};\n\nconst defaultToolbarTitles: Record<PreviewToolbarBuiltInAction, string> = {\n previous: \"Previous file\",\n next: \"Next file\",\n queue: \"Current file position\",\n \"zoom-out\": \"Zoom out\",\n \"zoom-in\": \"Zoom in\",\n \"zoom-reset\": \"Reset zoom\",\n \"rotate-right\": \"Rotate right\",\n download: \"Download file\",\n fullscreen: \"Open preview fullscreen\",\n print: \"Print preview\",\n search: \"Search preview text\"\n};\n\nfunction getToolbarLabel(options: PreviewToolbarOptions, id: PreviewToolbarBuiltInAction): string {\n return options.labels?.[id] ?? defaultToolbarLabels[id];\n}\n\nfunction getToolbarTitle(options: PreviewToolbarOptions, id: PreviewToolbarBuiltInAction): string {\n return options.titles?.[id] ?? options.labels?.[id] ?? defaultToolbarTitles[id];\n}\n\nfunction getToolbarOrder(options: PreviewToolbarOptions, queueLength: number): PreviewToolbarActionId[] {\n if (options.order) {\n return options.order;\n }\n\n const actions: PreviewToolbarActionId[] = [];\n if (queueLength > 1) {\n actions.push(\"previous\", \"next\", \"queue\");\n }\n if (options.zoom) {\n actions.push(\"zoom-out\", \"zoom-in\", \"zoom-reset\");\n }\n if (options.rotate) {\n actions.push(\"rotate-right\");\n }\n if (options.download !== false) {\n actions.push(\"download\");\n }\n if (options.fullscreen !== false) {\n actions.push(\"fullscreen\");\n }\n if (options.print) {\n actions.push(\"print\");\n }\n if (options.search !== false) {\n actions.push(\"search\");\n }\n return actions;\n}\n\nfunction getImplicitCustomActions(options: PreviewToolbarOptions): PreviewToolbarCustomAction[] {\n if (options.order || !options.actions) {\n return [];\n }\n return [...options.actions].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n}\n\nfunction evaluateToolbarFlag(\n value: boolean | ((ctx: ReturnType<typeof createToolbarContext>) => boolean) | undefined,\n context: ReturnType<typeof createToolbarContext>\n): boolean {\n return typeof value === \"function\" ? value(context) : Boolean(value);\n}\n\nfunction setToolbarButtonContent(\n button: HTMLButtonElement,\n label: string,\n icon?: string | HTMLElement | SVGElement\n): void {\n button.replaceChildren();\n if (!icon) {\n button.textContent = label;\n return;\n }\n\n const iconElement = document.createElement(\"span\");\n iconElement.className = \"ofv-toolbar-icon\";\n iconElement.setAttribute(\"aria-hidden\", \"true\");\n if (typeof icon === \"string\") {\n iconElement.innerHTML = icon;\n } else {\n iconElement.append(icon.cloneNode(true));\n }\n\n const labelElement = document.createElement(\"span\");\n labelElement.className = \"ofv-toolbar-label\";\n labelElement.textContent = label;\n button.append(iconElement, labelElement);\n}\n\nfunction isBuiltInToolbarAction(id: PreviewToolbarActionId): id is PreviewToolbarBuiltInAction {\n return id in defaultToolbarLabels;\n}\n\nfunction createSearchController(root: HTMLElement): {\n search: (query: string) => number;\n clear: () => void;\n} {\n const markerClass = \"ofv-search-match\";\n\n const clear = () => {\n const markers = collectSearchRoots(root).flatMap((searchRoot) => [\n ...searchRoot.querySelectorAll(`mark.${markerClass}`)\n ]);\n for (const marker of markers) {\n marker.replaceWith(document.createTextNode(marker.textContent || \"\"));\n }\n collectSearchRoots(root).forEach((searchRoot) => searchRoot.normalize());\n };\n\n const search = (query: string): number => {\n clear();\n const normalizedQuery = query.trim();\n if (!normalizedQuery) {\n return 0;\n }\n\n const textNodes = collectSearchRoots(root).flatMap((searchRoot) => collectSearchableTextNodes(searchRoot));\n let count = 0;\n let firstMatch: HTMLElement | undefined;\n\n for (const node of textNodes) {\n const text = node.nodeValue || \"\";\n const lowerText = text.toLowerCase();\n const lowerQuery = normalizedQuery.toLowerCase();\n let start = 0;\n let index = lowerText.indexOf(lowerQuery, start);\n if (index < 0) {\n continue;\n }\n\n const fragment = document.createDocumentFragment();\n while (index >= 0) {\n if (index > start) {\n fragment.append(document.createTextNode(text.slice(start, index)));\n }\n const marker = document.createElement(\"mark\");\n marker.className = markerClass;\n marker.textContent = text.slice(index, index + normalizedQuery.length);\n fragment.append(marker);\n firstMatch ||= marker;\n count += 1;\n start = index + normalizedQuery.length;\n index = lowerText.indexOf(lowerQuery, start);\n }\n if (start < text.length) {\n fragment.append(document.createTextNode(text.slice(start)));\n }\n node.replaceWith(fragment);\n }\n\n firstMatch?.scrollIntoView?.({ block: \"center\", inline: \"nearest\" });\n return count;\n };\n\n return { search, clear };\n}\n\nfunction collectSearchRoots(root: HTMLElement): HTMLElement[] {\n const roots = [root];\n for (const iframe of root.querySelectorAll<HTMLIFrameElement>(\"iframe\")) {\n try {\n const body = iframe.contentDocument?.body;\n if (body) {\n roots.push(body);\n }\n } catch {\n // Cross-origin or sandboxed frames without DOM access are skipped.\n }\n }\n return roots;\n}\n\nfunction collectSearchableTextNodes(root: HTMLElement): Text[] {\n const nodes: Text[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {\n acceptNode(node) {\n const parent = node.parentElement;\n if (!parent || !node.nodeValue?.trim()) {\n return NodeFilter.FILTER_REJECT;\n }\n if ([\"SCRIPT\", \"STYLE\", \"TEXTAREA\", \"INPUT\", \"BUTTON\"].includes(parent.tagName)) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n }\n });\n\n let current = walker.nextNode();\n while (current) {\n nodes.push(current as Text);\n current = walker.nextNode();\n }\n return nodes;\n}\n\nfunction printPreview(viewport: HTMLElement): void {\n const frame = document.createElement(\"iframe\");\n frame.className = \"ofv-print-frame\";\n frame.setAttribute(\"aria-hidden\", \"true\");\n document.body.append(frame);\n\n const clone = viewport.cloneNode(true) as HTMLElement;\n copyCanvasContent(viewport, clone);\n clone.classList.add(\"ofv-print-root\", \"ofv-root\"); // Add ofv-root class so CSS variables can resolve\n\n // Handle PPTX printing layout adaptation\n const pptxViewer = clone.querySelector(\".ofv-pptx-viewer\") || (clone.classList.contains(\"ofv-pptx-viewer\") ? clone : null);\n let intrinsicWidth = 960;\n let intrinsicHeight = 540;\n let hasSlides = false;\n\n if (pptxViewer) {\n const slides = pptxViewer.querySelectorAll(\"[data-slide-index]\");\n if (slides.length > 0) {\n hasSlides = true;\n const firstWrapper = slides[0].firstElementChild as HTMLElement | null;\n const firstSlide = firstWrapper?.firstElementChild as HTMLElement | null;\n if (firstSlide) {\n intrinsicWidth = parseInt(firstSlide.style.width) || 960;\n intrinsicHeight = parseInt(firstSlide.style.height) || 540;\n }\n\n slides.forEach((slideEl) => {\n const item = slideEl as HTMLElement;\n item.style.width = \"100%\";\n item.style.margin = \"0 0 20px 0\";\n\n const wrapper = item.firstElementChild as HTMLElement | null;\n if (wrapper) {\n wrapper.style.width = `${intrinsicWidth}px`;\n wrapper.style.height = `${intrinsicHeight}px`;\n wrapper.style.boxShadow = \"none\";\n wrapper.style.margin = \"0 auto\";\n\n const slideContent = wrapper.firstElementChild as HTMLElement | null;\n if (slideContent) {\n slideContent.style.transform = \"none\";\n slideContent.style.width = `${intrinsicWidth}px`;\n slideContent.style.height = `${intrinsicHeight}px`;\n }\n }\n });\n }\n }\n\n const doc = frame.contentDocument;\n if (!doc) {\n frame.remove();\n return;\n }\n\n // 1. Write the basic HTML skeleton\n doc.open();\n doc.write(`<!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\" />\n <title>Print preview</title>\n </head>\n <body></body>\n </html>`);\n doc.close();\n\n // 2. Copy all stylesheets from parent document to print iframe\n Array.from(document.querySelectorAll(\"style, link[rel='stylesheet']\")).forEach((el) => {\n doc.head.appendChild(el.cloneNode(true));\n });\n\n // 3. Inject our base print style override element AFTER parent stylesheets\n const baseStyle = doc.createElement(\"style\");\n baseStyle.textContent = `\n * { box-sizing: border-box; }\n html, body {\n margin: 0;\n padding: 0;\n background: #fff;\n color: #111827;\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n }\n body { padding: 16px; }\n img, video, canvas, svg { max-width: 100%; }\n pre {\n white-space: pre-wrap;\n word-break: break-word;\n font: 12px/1.5 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n }\n .ofv-viewport, .ofv-print-root {\n width: 100% !important;\n height: auto !important;\n overflow: visible !important;\n background: #fff !important;\n color: #111827 !important;\n border: none !important;\n box-shadow: none !important;\n }\n .ofv-pdf {\n padding: 0;\n overflow: visible;\n background: #fff;\n }\n .ofv-pdf-page {\n display: block;\n max-width: 100%;\n height: auto;\n margin: 0 auto 16px;\n box-shadow: none;\n }\n .ofv-panel,\n .ofv-text,\n .ofv-text-block,\n .ofv-file-list {\n max-height: none;\n min-height: 0;\n overflow: visible;\n }\n .ofv-section {\n break-inside: avoid;\n page-break-inside: avoid;\n }\n `;\n doc.head.appendChild(baseStyle);\n\n // 4. Inject PPTX-specific style overrides if slides are present\n if (hasSlides) {\n const pptxStyle = doc.createElement(\"style\");\n pptxStyle.textContent = `\n @media print {\n @page {\n size: ${intrinsicWidth > intrinsicHeight ? \"landscape\" : \"portrait\"};\n margin: 0;\n }\n html, body {\n background: #fff;\n }\n body {\n width: ${intrinsicWidth}px !important;\n margin: 0 !important;\n padding: 0 !important;\n }\n .ofv-print-root {\n width: ${intrinsicWidth}px !important;\n padding: 0 !important;\n }\n .ofv-pptx-viewer {\n width: ${intrinsicWidth}px !important;\n padding: 0 !important;\n background: #fff !important;\n overflow: visible !important;\n }\n .ofv-pptx-viewer > div[data-slide-index] {\n page-break-after: always;\n break-after: page;\n break-inside: avoid;\n page-break-inside: avoid;\n margin: 0 !important;\n padding: 0 !important;\n overflow: visible !important;\n }\n .ofv-pptx-viewer > div[data-slide-index]:last-child {\n page-break-after: avoid;\n break-after: avoid;\n }\n }\n `;\n doc.head.appendChild(pptxStyle);\n }\n\n doc.body.append(clone);\n\n let printed = false;\n const printAndCleanup = () => {\n if (printed) {\n return;\n }\n printed = true;\n frame.contentWindow?.focus();\n frame.contentWindow?.print();\n window.setTimeout(() => frame.remove(), 1000);\n };\n\n frame.onload = () => {\n printAndCleanup();\n };\n\n window.setTimeout(() => {\n printAndCleanup();\n }, 100);\n}\n\nfunction copyCanvasContent(sourceRoot: HTMLElement, targetRoot: HTMLElement): void {\n const sourceCanvases = [...sourceRoot.querySelectorAll(\"canvas\")];\n const targetCanvases = [...targetRoot.querySelectorAll(\"canvas\")];\n\n sourceCanvases.forEach((sourceCanvas, index) => {\n const targetCanvas = targetCanvases[index];\n if (!targetCanvas) {\n return;\n }\n const image = document.createElement(\"img\");\n image.className = targetCanvas.className;\n image.alt = \"Canvas preview page\";\n try {\n image.src = sourceCanvas.toDataURL(\"image/png\");\n } catch {\n return;\n }\n image.width = sourceCanvas.width;\n image.height = sourceCanvas.height;\n targetCanvas.replaceWith(image);\n });\n}\n\nfunction downloadFile(file: PreviewFile): void {\n const url = createObjectUrl(file);\n const isExternal = Boolean(file.url);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = file.name;\n link.rel = \"noopener\";\n link.hidden = true;\n document.body.append(link);\n link.click();\n window.setTimeout(() => {\n link.remove();\n revokeObjectUrl(url, isExternal);\n }, 0);\n}\n\nasync function findPlugin(plugins: PreviewPlugin[], file: PreviewFile): Promise<PreviewPlugin> {\n for (const plugin of plugins) {\n if (await plugin.match(file)) {\n return plugin;\n }\n }\n return fallbackPlugin();\n}\n","/// <reference path=\"../shims-heic.d.ts\" />\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin, PreviewSize } from \"../types\";\n\nconst imageExtensions = new Set([\n \"jpg\",\n \"jpeg\",\n \"jfif\",\n \"pjpe\",\n \"pjpeg\",\n \"png\",\n \"gif\",\n \"webp\",\n \"avif\",\n \"jxl\",\n \"svg\",\n \"bmp\",\n \"ico\",\n \"cur\",\n \"tif\",\n \"tiff\",\n \"apng\",\n \"heic\",\n \"heif\"\n]);\nconst nonRasterImageExtensions = new Set([\"dxf\"]);\nconst nonRasterImageMimeTypes = new Set([\"image/vnd.dxf\", \"image/vnd.adobe.photoshop\"]);\nconst heicMimeTypes = new Set([\"image/heic\", \"image/heif\", \"image/heic-sequence\", \"image/heif-sequence\"]);\n\nexport function imagePlugin(): PreviewPlugin {\n return {\n name: \"image\",\n match(file) {\n if (nonRasterImageExtensions.has(file.extension) || nonRasterImageMimeTypes.has(file.mimeType)) {\n return false;\n }\n return file.mimeType.startsWith(\"image/\") || imageExtensions.has(file.extension);\n },\n async render(ctx) {\n const ext = ctx.file.extension.toLowerCase();\n const isHeic = ext === \"heic\" || ext === \"heif\" || heicMimeTypes.has(ctx.file.mimeType.toLowerCase());\n const sourceBytesPromise = readImageBytes(ctx.file.blob);\n\n let url = \"\";\n let convertedBlob: Blob | null = null;\n let isExternal = Boolean(ctx.file.url);\n\n if (isHeic) {\n ctx.setLoading(true);\n try {\n let blob = ctx.file.blob;\n if (!blob && typeof ctx.file.source === \"string\") {\n const res = await fetch(ctx.file.source);\n if (!res.ok) {\n throw new Error(`Failed to fetch HEIC file: ${res.status}`);\n }\n blob = await res.blob();\n }\n if (!blob) {\n throw new Error(\"HEIC file source cannot be resolved to a Blob.\");\n }\n\n const heic2anyModule = await import(\"heic2any\");\n const heic2any = heic2anyModule.default || heic2anyModule;\n const converted = await heic2any({\n blob,\n toType: \"image/jpeg\",\n quality: 0.8\n });\n\n convertedBlob = Array.isArray(converted) ? converted[0] : converted;\n url = URL.createObjectURL(convertedBlob);\n isExternal = false;\n } catch (err: any) {\n console.error(\"HEIC image conversion failed:\", err);\n // Fallback to raw object URL\n url = createObjectUrl(ctx.file);\n isExternal = Boolean(ctx.file.url);\n } finally {\n ctx.setLoading(false);\n }\n } else {\n url = createObjectUrl(ctx.file);\n }\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-image-viewer\";\n\n const showInlineControls = !ctx.options.toolbar;\n const controls = document.createElement(\"div\");\n controls.className = \"ofv-image-controls\";\n\n const stage = document.createElement(\"div\");\n stage.className = \"ofv-image-stage\";\n const infoBar = createImageInfoBar(await sourceBytesPromise, ext, ctx.file.mimeType, ctx.file.name);\n\n const image = document.createElement(\"img\");\n image.className = \"ofv-media ofv-image-content\";\n image.alt = ctx.file.name;\n image.draggable = false;\n image.src = url;\n image.style.objectFit = objectFit(ctx.options.fit);\n\n let scale = 1;\n let rotation = 0;\n let offsetX = 0;\n let offsetY = 0;\n let dragging = false;\n let dragStartX = 0;\n let dragStartY = 0;\n let startOffsetX = 0;\n let startOffsetY = 0;\n\n const zoomLabel = document.createElement(\"span\");\n zoomLabel.className = \"ofv-image-zoom\";\n\n const updateTransform = () => {\n image.style.transform = `translate(${offsetX}px, ${offsetY}px) scale(${scale}) rotate(${rotation}deg)`;\n zoomLabel.textContent = `${Math.round(scale * 100)}%`;\n };\n\n const showImageFallback = () => {\n stage.replaceChildren(createImageFallback(ctx.file.name, url));\n };\n\n const setScale = (nextScale: number) => {\n scale = Math.min(8, Math.max(0.1, nextScale));\n updateTransform();\n };\n\n const reset = () => {\n scale = 1;\n rotation = 0;\n offsetX = 0;\n offsetY = 0;\n updateTransform();\n };\n\n const addButton = (label: string, title: string, action: () => void) => {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.textContent = label;\n button.title = title;\n button.setAttribute(\"aria-label\", title);\n button.addEventListener(\"click\", action);\n controls.append(button);\n return () => button.removeEventListener(\"click\", action);\n };\n\n const disposers = showInlineControls\n ? [\n addButton(\"-\", \"Zoom out\", () => setScale(scale - 0.25)),\n addButton(\"+\", \"Zoom in\", () => setScale(scale + 0.25)),\n addButton(\"Rotate\", \"Rotate image\", () => {\n rotation += 90;\n updateTransform();\n }),\n addButton(\"Reset\", \"Reset image view\", reset)\n ]\n : [];\n if (showInlineControls) {\n controls.append(zoomLabel);\n }\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) {\n return;\n }\n dragging = true;\n dragStartX = event.clientX;\n dragStartY = event.clientY;\n startOffsetX = offsetX;\n startOffsetY = offsetY;\n stage.classList.add(\"is-dragging\");\n stage.setPointerCapture(event.pointerId);\n };\n\n const onPointerMove = (event: PointerEvent) => {\n if (!dragging) {\n return;\n }\n offsetX = startOffsetX + event.clientX - dragStartX;\n offsetY = startOffsetY + event.clientY - dragStartY;\n updateTransform();\n };\n\n const onPointerUp = (event: PointerEvent) => {\n dragging = false;\n stage.classList.remove(\"is-dragging\");\n if (stage.hasPointerCapture(event.pointerId)) {\n stage.releasePointerCapture(event.pointerId);\n }\n };\n\n const onWheel = (event: WheelEvent) => {\n if (!event.ctrlKey && !event.metaKey) {\n return;\n }\n event.preventDefault();\n setScale(scale + (event.deltaY > 0 ? -0.1 : 0.1));\n };\n\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerUp);\n stage.addEventListener(\"wheel\", onWheel, { passive: false });\n image.addEventListener(\"error\", showImageFallback);\n\n stage.append(image);\n wrapper.append(...(showInlineControls ? [controls, stage, infoBar] : [stage, infoBar]));\n ctx.viewport.append(wrapper);\n updateTransform();\n\n return {\n canCommand(command) {\n return (\n command === \"zoom-in\" ||\n command === \"zoom-out\" ||\n command === \"zoom-reset\" ||\n command === \"rotate-right\" ||\n command === \"rotate-left\"\n );\n },\n command(command) {\n if (command === \"zoom-in\") {\n setScale(scale + 0.25);\n return true;\n }\n if (command === \"zoom-out\") {\n setScale(scale - 0.25);\n return true;\n }\n if (command === \"zoom-reset\") {\n reset();\n return true;\n }\n if (command === \"rotate-right\") {\n rotation += 90;\n updateTransform();\n return true;\n }\n if (command === \"rotate-left\") {\n rotation -= 90;\n updateTransform();\n return true;\n }\n return false;\n },\n resize(size: PreviewSize) {\n image.style.maxWidth = `${size.width}px`;\n image.style.maxHeight = `${Math.max(0, size.height - controls.offsetHeight)}px`;\n },\n destroy() {\n for (const dispose of disposers) {\n dispose();\n }\n stage.removeEventListener(\"pointerdown\", onPointerDown);\n stage.removeEventListener(\"pointermove\", onPointerMove);\n stage.removeEventListener(\"pointerup\", onPointerUp);\n stage.removeEventListener(\"pointercancel\", onPointerUp);\n stage.removeEventListener(\"wheel\", onWheel);\n image.removeEventListener(\"error\", showImageFallback);\n wrapper.remove();\n if (convertedBlob) {\n URL.revokeObjectURL(url);\n } else {\n revokeObjectUrl(url, isExternal);\n }\n }\n };\n }\n };\n}\n\nfunction createImageFallback(fileName: string, url: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"图片预览失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = \"当前浏览器无法直接显示该图片,文件可能已损坏或编码暂不受支持。\";\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载图片\";\n\n fallback.append(title, meta, download);\n return fallback;\n}\n\ntype ImageInfo = {\n format: string;\n width?: number;\n height?: number;\n bitDepth?: string;\n color?: string;\n frames?: number;\n count?: number;\n note?: string;\n};\n\nasync function readImageBytes(blob?: Blob): Promise<Uint8Array> {\n if (!blob) {\n return new Uint8Array();\n }\n return new Uint8Array(await blob.arrayBuffer().catch(() => new ArrayBuffer(0)));\n}\n\nfunction createImageInfoBar(bytes: Uint8Array, extension: string, mimeType: string, fileName: string): HTMLElement {\n const info = parseImageInfo(bytes, extension, mimeType, fileName);\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-image-info\";\n appendImageInfo(bar, \"格式\", info.format);\n if (info.width && info.height) {\n appendImageInfo(bar, \"尺寸\", `${info.width} x ${info.height}px`);\n }\n if (info.bitDepth) {\n appendImageInfo(bar, \"位深\", info.bitDepth);\n }\n if (info.color) {\n appendImageInfo(bar, \"颜色\", info.color);\n }\n if (info.frames !== undefined) {\n appendImageInfo(bar, \"帧\", String(info.frames));\n }\n if (info.count !== undefined) {\n appendImageInfo(bar, \"图像\", String(info.count));\n }\n if (info.note) {\n appendImageInfo(bar, \"说明\", info.note);\n }\n return bar;\n}\n\nfunction appendImageInfo(parent: HTMLElement, label: string, value: string): void {\n const row = document.createElement(\"span\");\n row.className = \"ofv-image-info-item\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n row.append(key, content);\n parent.append(row);\n}\n\nfunction parseImageInfo(bytes: Uint8Array, extension: string, mimeType: string, fileName: string): ImageInfo {\n const fallbackFormat = (extension || mimeType || fileName.split(\".\").pop() || \"image\").toUpperCase();\n if (bytes.length === 0) {\n return { format: fallbackFormat, note: \"无法读取本地头信息\" };\n }\n return (\n parsePngInfo(bytes) ||\n parseJpegInfo(bytes) ||\n parseGifInfo(bytes) ||\n parseWebpInfo(bytes) ||\n parseAvifInfo(bytes) ||\n parseBmpInfo(bytes) ||\n parseIcoInfo(bytes) ||\n parseSvgInfo(bytes) ||\n { format: fallbackFormat, note: \"暂未识别图片头结构\" }\n );\n}\n\nfunction parsePngInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 33 || !bytesMatch(bytes, 0, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) {\n return null;\n }\n const view = dataView(bytes);\n const frames = countPngChunks(bytes, \"fcTL\");\n return {\n format: frames > 0 ? \"APNG\" : \"PNG\",\n width: view.getUint32(16, false),\n height: view.getUint32(20, false),\n bitDepth: `${bytes[24]} bit`,\n color: pngColorType(bytes[25]),\n frames: frames > 0 ? frames : undefined\n };\n}\n\nfunction parseJpegInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 4 || bytes[0] !== 0xff || bytes[1] !== 0xd8) {\n return null;\n }\n let offset = 2;\n while (offset + 9 < bytes.length) {\n if (bytes[offset] !== 0xff) {\n offset++;\n continue;\n }\n const marker = bytes[offset + 1];\n offset += 2;\n while (bytes[offset] === 0xff) {\n offset++;\n }\n if (marker === 0xd9 || marker === 0xda) {\n break;\n }\n if (offset + 2 > bytes.length) {\n break;\n }\n const length = (bytes[offset] << 8) | bytes[offset + 1];\n if (length < 2 || offset + length > bytes.length) {\n break;\n }\n if ((marker >= 0xc0 && marker <= 0xc3) || (marker >= 0xc5 && marker <= 0xc7) || (marker >= 0xc9 && marker <= 0xcb) || (marker >= 0xcd && marker <= 0xcf)) {\n return {\n format: \"JPEG\",\n width: (bytes[offset + 5] << 8) | bytes[offset + 6],\n height: (bytes[offset + 3] << 8) | bytes[offset + 4],\n bitDepth: `${bytes[offset + 2]} bit`,\n color: `${bytes[offset + 7]} component`\n };\n }\n offset += length;\n }\n return { format: \"JPEG\", note: \"未在头部扫描到 SOF 尺寸段\" };\n}\n\nfunction parseGifInfo(bytes: Uint8Array): ImageInfo | null {\n const header = asciiAt(bytes, 0, 6);\n if (header !== \"GIF87a\" && header !== \"GIF89a\") {\n return null;\n }\n const packed = bytes[10] || 0;\n return {\n format: header,\n width: readUint16Le(bytes, 6),\n height: readUint16Le(bytes, 8),\n bitDepth: `${(packed & 0x07) + 1} bit`,\n color: (packed & 0x80) ? \"Global color table\" : \"No global color table\",\n frames: countGifFrames(bytes)\n };\n}\n\nfunction parseWebpInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 16 || asciiAt(bytes, 0, 4) !== \"RIFF\" || asciiAt(bytes, 8, 4) !== \"WEBP\") {\n return null;\n }\n const chunk = asciiAt(bytes, 12, 4);\n if (chunk === \"VP8X\" && bytes.length >= 30) {\n const flags = bytes[20];\n return {\n format: \"WebP\",\n width: 1 + readUint24Le(bytes, 24),\n height: 1 + readUint24Le(bytes, 27),\n frames: (flags & 0x02) !== 0 ? countWebpAnimationFrames(bytes) : undefined,\n color: (flags & 0x10) !== 0 ? \"Alpha\" : undefined\n };\n }\n if (chunk === \"VP8 \" && bytes.length >= 30) {\n const start = 20;\n if (bytes[start + 3] === 0x9d && bytes[start + 4] === 0x01 && bytes[start + 5] === 0x2a) {\n return {\n format: \"WebP\",\n width: readUint16Le(bytes, start + 6) & 0x3fff,\n height: readUint16Le(bytes, start + 8) & 0x3fff\n };\n }\n }\n if (chunk === \"VP8L\" && bytes.length >= 25) {\n const b0 = bytes[21];\n const b1 = bytes[22];\n const b2 = bytes[23];\n const b3 = bytes[24];\n return {\n format: \"WebP\",\n width: 1 + (((b1 & 0x3f) << 8) | b0),\n height: 1 + (((b3 & 0x0f) << 10) | (b2 << 2) | ((b1 & 0xc0) >> 6)),\n color: \"Lossless\"\n };\n }\n return { format: \"WebP\", note: `未知 ${chunk || \"chunk\"} 头` };\n}\n\nfunction parseAvifInfo(bytes: Uint8Array): ImageInfo | null {\n const boxes = collectBmffBoxes(bytes, 0, bytes.length);\n const ftyp = boxes.find((box) => box.type === \"ftyp\");\n if (!ftyp) {\n return null;\n }\n const majorBrand = asciiAt(bytes, ftyp.dataStart, 4);\n const compatibleBrands = asciiAt(bytes, ftyp.dataStart + 8, Math.max(0, ftyp.dataEnd - ftyp.dataStart - 8));\n if (!/\\b(avif|avis|mif1|msf1|heic|heix|hevc|hevx)\\b/.test(`${majorBrand} ${compatibleBrands}`)) {\n return null;\n }\n const ispe = findBmffBox(bytes, boxes, \"ispe\");\n return {\n format: majorBrand === \"avis\" || compatibleBrands.includes(\"avis\") ? \"AVIF Sequence\" : majorBrand.startsWith(\"hei\") ? \"HEIF\" : \"AVIF\",\n width: ispe && ispe.dataStart + 12 <= ispe.dataEnd ? readUint32Be(bytes, ispe.dataStart + 4) : undefined,\n height: ispe && ispe.dataStart + 12 <= ispe.dataEnd ? readUint32Be(bytes, ispe.dataStart + 8) : undefined,\n note: `brand ${majorBrand}${compatibleBrands.trim() ? ` · ${formatBmffBrands(compatibleBrands)}` : \"\"}`\n };\n}\n\ntype BmffBox = {\n type: string;\n start: number;\n dataStart: number;\n dataEnd: number;\n end: number;\n};\n\nfunction collectBmffBoxes(bytes: Uint8Array, start: number, end: number): BmffBox[] {\n const boxes: BmffBox[] = [];\n let offset = start;\n while (offset + 8 <= end && boxes.length < 512) {\n let size = readUint32Be(bytes, offset);\n const type = asciiAt(bytes, offset + 4, 4);\n let headerSize = 8;\n if (!/^[A-Za-z0-9 _-]{4}$/.test(type)) {\n break;\n }\n if (size === 1 && offset + 16 <= end) {\n const high = readUint32Be(bytes, offset + 8);\n const low = readUint32Be(bytes, offset + 12);\n size = high > 0 ? end - offset : low;\n headerSize = 16;\n } else if (size === 0) {\n size = end - offset;\n }\n if (size < headerSize || offset + size > end) {\n break;\n }\n boxes.push({\n type,\n start: offset,\n dataStart: offset + headerSize,\n dataEnd: offset + size,\n end: offset + size\n });\n offset += size;\n }\n return boxes;\n}\n\nfunction findBmffBox(bytes: Uint8Array, boxes: BmffBox[], type: string): BmffBox | undefined {\n for (const box of boxes) {\n if (box.type === type) {\n return box;\n }\n if ([\"meta\", \"iprp\", \"ipco\", \"moov\", \"trak\", \"mdia\", \"minf\", \"stbl\"].includes(box.type)) {\n const childStart = box.type === \"meta\" ? box.dataStart + 4 : box.dataStart;\n const found = findBmffBox(bytes, collectBmffBoxes(bytes, childStart, box.dataEnd), type);\n if (found) {\n return found;\n }\n }\n }\n return undefined;\n}\n\nfunction formatBmffBrands(value: string): string {\n const brands = value.match(/.{1,4}/g)?.map((brand) => brand.trim()).filter(Boolean) || [];\n return brands.slice(0, 6).join(\", \");\n}\n\nfunction parseBmpInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 30 || asciiAt(bytes, 0, 2) !== \"BM\") {\n return null;\n }\n const dibSize = readUint32Le(bytes, 14);\n if (dibSize < 12) {\n return { format: \"BMP\", note: \"DIB header 太短\" };\n }\n if (dibSize === 12 && bytes.length >= 26) {\n return {\n format: \"BMP\",\n width: readUint16Le(bytes, 18),\n height: readUint16Le(bytes, 20),\n bitDepth: `${readUint16Le(bytes, 24)} bit`\n };\n }\n return {\n format: \"BMP\",\n width: readInt32Le(bytes, 18),\n height: Math.abs(readInt32Le(bytes, 22)),\n bitDepth: `${readUint16Le(bytes, 28)} bit`\n };\n}\n\nfunction parseIcoInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 6 || readUint16Le(bytes, 0) !== 0 || ![1, 2].includes(readUint16Le(bytes, 2))) {\n return null;\n }\n const count = readUint16Le(bytes, 4);\n if (count < 1 || bytes.length < 6 + count * 16) {\n return { format: \"ICO/CUR\", count };\n }\n const width = bytes[6] || 256;\n const height = bytes[7] || 256;\n return {\n format: readUint16Le(bytes, 2) === 1 ? \"ICO\" : \"CUR\",\n width,\n height,\n bitDepth: `${readUint16Le(bytes, 12)} bit`,\n count\n };\n}\n\nfunction parseSvgInfo(bytes: Uint8Array): ImageInfo | null {\n const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(0, Math.min(bytes.length, 8192)));\n if (!/<svg[\\s>]/i.test(text)) {\n return null;\n }\n const tag = text.match(/<svg\\b[^>]*>/i)?.[0] || \"\";\n const width = numberAttribute(tag, \"width\");\n const height = numberAttribute(tag, \"height\");\n const viewBox = tag.match(/\\bviewBox=[\"']([^\"']+)[\"']/i)?.[1]?.trim();\n const viewBoxParts = viewBox?.split(/[\\s,]+/).map(Number).filter(Number.isFinite);\n return {\n format: \"SVG\",\n width: width || (viewBoxParts?.length === 4 ? viewBoxParts[2] : undefined),\n height: height || (viewBoxParts?.length === 4 ? viewBoxParts[3] : undefined),\n note: viewBox ? `viewBox ${viewBox}` : undefined\n };\n}\n\nfunction countPngChunks(bytes: Uint8Array, chunkType: string): number {\n let offset = 8;\n let count = 0;\n while (offset + 12 <= bytes.length) {\n const length = readUint32Be(bytes, offset);\n const type = asciiAt(bytes, offset + 4, 4);\n if (type === chunkType) {\n count++;\n }\n offset += 12 + length;\n }\n return count;\n}\n\nfunction countGifFrames(bytes: Uint8Array): number {\n let count = 0;\n for (let index = 13; index < bytes.length; index++) {\n if (bytes[index] === 0x2c) {\n count++;\n }\n }\n return count || 1;\n}\n\nfunction countWebpAnimationFrames(bytes: Uint8Array): number {\n let count = 0;\n for (let offset = 12; offset + 8 <= bytes.length; ) {\n const type = asciiAt(bytes, offset, 4);\n const size = readUint32Le(bytes, offset + 4);\n if (type === \"ANMF\") {\n count++;\n }\n offset += 8 + size + (size % 2);\n }\n return count || 1;\n}\n\nfunction pngColorType(value: number): string {\n const colors: Record<number, string> = {\n 0: \"Grayscale\",\n 2: \"Truecolor\",\n 3: \"Indexed color\",\n 4: \"Grayscale + alpha\",\n 6: \"Truecolor + alpha\"\n };\n return colors[value] || `Unknown (${value})`;\n}\n\nfunction numberAttribute(tag: string, name: string): number | undefined {\n const value = tag.match(new RegExp(`\\\\b${name}=[\"']([0-9.]+)`, \"i\"))?.[1];\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction bytesMatch(bytes: Uint8Array, offset: number, expected: number[]): boolean {\n return expected.every((byte, index) => bytes[offset + index] === byte);\n}\n\nfunction dataView(bytes: Uint8Array): DataView {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"ascii\").decode(bytes.slice(offset, offset + length));\n}\n\nfunction readUint16Le(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getUint16(offset, true);\n}\n\nfunction readUint24Le(bytes: Uint8Array, offset: number): number {\n return bytes[offset] | (bytes[offset + 1] << 8) | (bytes[offset + 2] << 16);\n}\n\nfunction readUint32Le(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getUint32(offset, true);\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getUint32(offset, false);\n}\n\nfunction readInt32Le(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getInt32(offset, true);\n}\n\nfunction objectFit(fit: string): string {\n if (fit === \"cover\") {\n return \"cover\";\n }\n if (fit === \"actual\") {\n return \"none\";\n }\n if (fit === \"scale-down\") {\n return \"scale-down\";\n }\n return \"contain\";\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\n\nconst videoExtensions = new Set([\n \"mp4\",\n \"mpg\",\n \"mpeg\",\n \"mpe\",\n \"mpv\",\n \"webm\",\n \"ogv\",\n \"mov\",\n \"m4v\",\n \"avi\",\n \"mkv\",\n \"flv\",\n \"wmv\",\n \"3gp\",\n \"3g2\",\n \"m2ts\",\n \"m3u8\"\n]);\nconst videoMimeTypes = new Set([\n \"application/vnd.apple.mpegurl\",\n \"application/x-mpegurl\",\n \"application/mpegurl\",\n \"application/dash+xml\"\n]);\nconst hlsMimeTypes = new Set([\"application/vnd.apple.mpegurl\", \"application/x-mpegurl\", \"application/mpegurl\"]);\n\nexport function videoPlugin(): PreviewPlugin {\n return {\n name: \"video\",\n match(file) {\n return file.mimeType.startsWith(\"video/\") || videoMimeTypes.has(file.mimeType) || videoExtensions.has(file.extension);\n },\n async render(ctx) {\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const mimeType = ctx.file.mimeType.toLowerCase();\n const bytes = await readVideoBytes(ctx.file.blob);\n \n const container = document.createElement(\"div\");\n container.className = \"ofv-video-container\";\n const stage = document.createElement(\"div\");\n stage.className = \"ofv-video-stage\";\n\n const video = document.createElement(\"video\");\n video.className = \"ofv-media\";\n video.controls = true;\n video.playsInline = true;\n video.preload = \"metadata\";\n video.style.objectFit = ctx.options.fit === \"cover\" ? \"cover\" : \"contain\";\n \n const ext = ctx.file.extension.toLowerCase();\n const infoBar = createVideoInfo(parseVideoInfo(bytes, ext, mimeType, ctx.file.name));\n stage.append(video);\n container.append(stage, infoBar);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(container);\n\n let hlsInstance: any = null;\n let mpegtsPlayer: any = null;\n const isHls = ext === \"m3u8\" || hlsMimeTypes.has(mimeType);\n const isMpegTs = ext === \"m2ts\" || mimeType === \"video/mp2t\";\n const isDash = mimeType === \"application/dash+xml\";\n const isFlv = ext === \"flv\" || mimeType === \"video/x-flv\";\n const formatLabel = (ctx.file.extension || ctx.file.mimeType || \"video\").toUpperCase();\n\n const showTranscodeFallback = () => {\n video.style.display = \"none\";\n video.pause();\n \n // Remove any existing fallback UI first\n const oldFallback = stage.querySelector(\".ofv-fallback\");\n if (oldFallback) {\n oldFallback.remove();\n }\n\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n \n const title = document.createElement(\"strong\");\n title.textContent = `当前浏览器不支持直接播放该视频格式 (${formatLabel})`;\n \n const meta = document.createElement(\"span\");\n meta.textContent = \"建议转换为 MP4 格式播放,或直接下载在本地播放。\";\n \n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载视频\";\n \n fallback.append(title, meta, download);\n stage.append(fallback);\n };\n\n const onVideoError = () => {\n showTranscodeFallback();\n };\n\n video.addEventListener(\"error\", onVideoError);\n\n try {\n if (isDash) {\n showTranscodeFallback();\n } else if (isHls) {\n const Hls = (await import(\"hls.js\")).default;\n if (Hls.isSupported()) {\n hlsInstance = new Hls();\n hlsInstance.loadSource(url);\n hlsInstance.attachMedia(video);\n hlsInstance.on(Hls.Events.ERROR, (_event: any, data: any) => {\n if (data.fatal) {\n showTranscodeFallback();\n }\n });\n } else if (video.canPlayType(\"application/vnd.apple.mpegurl\")) {\n video.src = url;\n } else {\n showTranscodeFallback();\n }\n } else if (isFlv || isMpegTs) {\n const mpegts = (await import(\"mpegts.js\")).default;\n if (mpegts.isSupported()) {\n mpegtsPlayer = mpegts.createPlayer({\n type: isFlv ? \"flv\" : \"mpegts\",\n url: url\n });\n mpegtsPlayer.attachMediaElement(video);\n mpegtsPlayer.load();\n mpegtsPlayer.on(mpegts.Events.ERROR, () => {\n showTranscodeFallback();\n });\n } else {\n showTranscodeFallback();\n }\n } else {\n // Native playback for mp4, webm, mov, ogg, etc.\n video.src = url;\n }\n } catch (err) {\n showTranscodeFallback();\n }\n\n return {\n resize() {\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n },\n destroy() {\n video.removeEventListener(\"error\", onVideoError);\n video.pause();\n \n if (hlsInstance) {\n hlsInstance.destroy();\n }\n if (mpegtsPlayer) {\n mpegtsPlayer.unload();\n mpegtsPlayer.destroy();\n }\n\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n container.remove();\n }\n };\n }\n };\n}\n\ntype VideoInfo = {\n format: string;\n codec?: string;\n width?: number;\n height?: number;\n duration?: string;\n bitrate?: string;\n tracks?: number;\n variants?: number;\n segments?: number;\n note?: string;\n};\n\nasync function readVideoBytes(blob?: Blob): Promise<Uint8Array> {\n if (!blob) {\n return new Uint8Array();\n }\n return new Uint8Array(await blob.arrayBuffer().catch(() => new ArrayBuffer(0)));\n}\n\nfunction createVideoInfo(info: VideoInfo): HTMLElement {\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-media-info\";\n appendMediaInfo(bar, \"格式\", info.format);\n if (info.codec) {\n appendMediaInfo(bar, \"编码\", info.codec);\n }\n if (info.width && info.height) {\n appendMediaInfo(bar, \"尺寸\", `${info.width} x ${info.height}px`);\n }\n if (info.duration) {\n appendMediaInfo(bar, \"时长\", info.duration);\n }\n if (info.bitrate) {\n appendMediaInfo(bar, \"码率\", info.bitrate);\n }\n if (info.tracks !== undefined) {\n appendMediaInfo(bar, \"轨道\", String(info.tracks));\n }\n if (info.variants !== undefined) {\n appendMediaInfo(bar, \"变体\", String(info.variants));\n }\n if (info.segments !== undefined) {\n appendMediaInfo(bar, \"片段\", String(info.segments));\n }\n if (info.note) {\n appendMediaInfo(bar, \"说明\", info.note);\n }\n return bar;\n}\n\nfunction appendMediaInfo(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n item.className = \"ofv-media-info-item\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction parseVideoInfo(bytes: Uint8Array, extension: string, mimeType: string, fileName: string): VideoInfo {\n const fallback = (extension || mimeType || fileName.split(\".\").pop() || \"video\").toUpperCase();\n if (bytes.length === 0) {\n return { format: fallback, note: \"无法读取本地头信息\" };\n }\n return parseHlsInfo(bytes) || parseDashInfo(bytes) || parseMp4Info(bytes) || parseAviInfo(bytes) || parseEbmlInfo(bytes) || {\n format: fallback,\n note: \"暂未识别视频头结构\"\n };\n}\n\nfunction parseMp4Info(bytes: Uint8Array): VideoInfo | null {\n if (bytes.length < 12 || asciiAt(bytes, 4, 4) !== \"ftyp\") {\n return null;\n }\n const majorBrand = asciiAt(bytes, 8, 4);\n const info: VideoInfo = { format: [\"qt \"].includes(majorBrand) ? \"MOV\" : \"MP4\", codec: majorBrand };\n const atoms = collectMp4Atoms(bytes, 0, bytes.length);\n const moov = atoms.find((atom) => atom.type === \"moov\");\n if (moov) {\n const children = collectMp4Atoms(bytes, moov.start + moov.headerSize, moov.end);\n const mvhd = children.find((atom) => atom.type === \"mvhd\");\n if (mvhd) {\n const duration = readMp4MvhdDuration(bytes, mvhd.start + mvhd.headerSize);\n if (duration !== undefined) {\n info.duration = formatDuration(duration);\n }\n }\n const tracks = children.filter((atom) => atom.type === \"trak\");\n info.tracks = tracks.length;\n for (const track of tracks) {\n const tkhd = collectMp4Atoms(bytes, track.start + track.headerSize, track.end).find((atom) => atom.type === \"tkhd\");\n if (tkhd) {\n const size = readMp4TkhdSize(bytes, tkhd.start + tkhd.headerSize);\n if (size.width && size.height) {\n info.width = size.width;\n info.height = size.height;\n break;\n }\n }\n }\n }\n return info;\n}\n\ntype Mp4Atom = {\n type: string;\n start: number;\n end: number;\n headerSize: number;\n};\n\nfunction collectMp4Atoms(bytes: Uint8Array, start: number, end: number): Mp4Atom[] {\n const atoms: Mp4Atom[] = [];\n let offset = start;\n while (offset + 8 <= end) {\n let size = readUint32Be(bytes, offset);\n const type = asciiAt(bytes, offset + 4, 4);\n let headerSize = 8;\n if (size === 1 && offset + 16 <= end) {\n size = Number(readUint64Be(bytes, offset + 8));\n headerSize = 16;\n }\n if (size < headerSize || offset + size > end || !/^[\\w ]{4}$/.test(type)) {\n break;\n }\n atoms.push({ type, start: offset, end: offset + size, headerSize });\n offset += size;\n }\n return atoms;\n}\n\nfunction readMp4MvhdDuration(bytes: Uint8Array, offset: number): number | undefined {\n if (offset + 20 > bytes.length) {\n return undefined;\n }\n const version = bytes[offset];\n if (version === 1 && offset + 32 <= bytes.length) {\n const timescale = readUint32Be(bytes, offset + 20);\n const duration = readUint64Be(bytes, offset + 24);\n return timescale ? Number(duration) / timescale : undefined;\n }\n const timescale = readUint32Be(bytes, offset + 12);\n const duration = readUint32Be(bytes, offset + 16);\n return timescale ? duration / timescale : undefined;\n}\n\nfunction readMp4TkhdSize(bytes: Uint8Array, offset: number): { width?: number; height?: number } {\n const version = bytes[offset];\n const sizeOffset = version === 1 ? offset + 84 : offset + 72;\n if (sizeOffset + 8 > bytes.length) {\n return {};\n }\n return {\n width: readUint32Be(bytes, sizeOffset) / 65536,\n height: readUint32Be(bytes, sizeOffset + 4) / 65536\n };\n}\n\nfunction parseAviInfo(bytes: Uint8Array): VideoInfo | null {\n if (bytes.length < 64 || asciiAt(bytes, 0, 4) !== \"RIFF\" || asciiAt(bytes, 8, 4) !== \"AVI \") {\n return null;\n }\n const avihOffset = findAscii(bytes, \"avih\", 12);\n if (avihOffset < 0 || avihOffset + 56 > bytes.length) {\n return { format: \"AVI\", note: \"未找到 avih header\" };\n }\n const microSecPerFrame = readUint32Le(bytes, avihOffset + 8);\n const maxBytesPerSec = readUint32Le(bytes, avihOffset + 16);\n const totalFrames = readUint32Le(bytes, avihOffset + 24);\n const streams = readUint32Le(bytes, avihOffset + 32);\n const width = readUint32Le(bytes, avihOffset + 40);\n const height = readUint32Le(bytes, avihOffset + 44);\n return {\n format: \"AVI\",\n width,\n height,\n tracks: streams,\n bitrate: maxBytesPerSec ? `${Math.round((maxBytesPerSec * 8) / 1000)} kbps` : undefined,\n duration: microSecPerFrame && totalFrames ? formatDuration((microSecPerFrame * totalFrames) / 1_000_000) : undefined\n };\n}\n\nfunction parseEbmlInfo(bytes: Uint8Array): VideoInfo | null {\n if (bytes.length < 8 || bytes[0] !== 0x1a || bytes[1] !== 0x45 || bytes[2] !== 0xdf || bytes[3] !== 0xa3) {\n return null;\n }\n const root = collectEbmlElements(bytes, 0, bytes.length);\n const header = root.find((element) => element.id === 0x1a45dfa3);\n const headerChildren = header ? collectEbmlElements(bytes, header.dataStart, header.dataEnd) : [];\n const docTypeValue = readEbmlString(bytes, headerChildren.find((element) => element.id === 0x4282));\n const segment = root.find((element) => element.id === 0x18538067);\n const segmentChildren = segment ? collectEbmlElements(bytes, segment.dataStart, segment.dataEnd) : [];\n const info = parseEbmlSegmentInfo(bytes, segmentChildren.find((element) => element.id === 0x1549a966));\n const tracks = parseEbmlTracks(bytes, segmentChildren.find((element) => element.id === 0x1654ae6b));\n const docType = docTypeValue?.toLowerCase().includes(\"webm\")\n ? \"WebM\"\n : docTypeValue?.toLowerCase().includes(\"matroska\")\n ? \"Matroska\"\n : \"EBML\";\n return {\n format: docType,\n codec: tracks.codecs.length > 0 ? tracks.codecs.slice(0, 4).join(\", \") : undefined,\n width: tracks.width,\n height: tracks.height,\n duration: info.duration === undefined ? undefined : formatDuration(info.duration),\n tracks: tracks.count || undefined,\n note: docTypeValue ? `EBML DocType ${docTypeValue}` : \"已识别 EBML 容器\"\n };\n}\n\ntype EbmlElement = {\n id: number;\n start: number;\n dataStart: number;\n dataEnd: number;\n end: number;\n};\n\nfunction collectEbmlElements(bytes: Uint8Array, start: number, end: number, limit = 256): EbmlElement[] {\n const elements: EbmlElement[] = [];\n let offset = start;\n while (offset < end && elements.length < limit) {\n const id = readEbmlId(bytes, offset, end);\n if (!id) {\n break;\n }\n const size = readEbmlSize(bytes, id.offset, end);\n if (!size) {\n break;\n }\n const dataStart = size.offset;\n const dataEnd = size.unknown ? end : dataStart + size.value;\n if (dataEnd < dataStart || dataEnd > end) {\n break;\n }\n elements.push({\n id: id.value,\n start: offset,\n dataStart,\n dataEnd,\n end: dataEnd\n });\n offset = dataEnd;\n }\n return elements;\n}\n\nfunction readEbmlId(bytes: Uint8Array, offset: number, end: number): { value: number; offset: number } | undefined {\n const length = ebmlVintLength(bytes[offset]);\n if (!length || length > 4 || offset + length > end) {\n return undefined;\n }\n let value = 0;\n for (let index = 0; index < length; index++) {\n value = value * 256 + bytes[offset + index];\n }\n return { value, offset: offset + length };\n}\n\nfunction readEbmlSize(bytes: Uint8Array, offset: number, end: number): { value: number; offset: number; unknown: boolean } | undefined {\n const length = ebmlVintLength(bytes[offset]);\n if (!length || length > 8 || offset + length > end) {\n return undefined;\n }\n const firstMask = 0xff >> length;\n let value = bytes[offset] & firstMask;\n let max = firstMask;\n for (let index = 1; index < length; index++) {\n value = value * 256 + bytes[offset + index];\n max = max * 256 + 0xff;\n }\n return { value, offset: offset + length, unknown: value === max };\n}\n\nfunction ebmlVintLength(firstByte: number | undefined): number {\n if (!firstByte) {\n return 0;\n }\n for (let length = 1; length <= 8; length++) {\n if (firstByte & (0x80 >> (length - 1))) {\n return length;\n }\n }\n return 0;\n}\n\nfunction parseEbmlSegmentInfo(bytes: Uint8Array, element?: EbmlElement): { duration?: number } {\n if (!element) {\n return {};\n }\n const children = collectEbmlElements(bytes, element.dataStart, element.dataEnd);\n const timecodeScale = readEbmlUInt(bytes, children.find((child) => child.id === 0x2ad7b1)) || 1_000_000;\n const duration = readEbmlFloat(bytes, children.find((child) => child.id === 0x4489));\n return {\n duration: duration === undefined ? undefined : (duration * timecodeScale) / 1_000_000_000\n };\n}\n\nfunction parseEbmlTracks(bytes: Uint8Array, element?: EbmlElement): { count: number; codecs: string[]; width?: number; height?: number } {\n if (!element) {\n return { count: 0, codecs: [] };\n }\n const trackEntries = collectEbmlElements(bytes, element.dataStart, element.dataEnd).filter((child) => child.id === 0xae);\n const codecs: string[] = [];\n let width: number | undefined;\n let height: number | undefined;\n for (const track of trackEntries) {\n const children = collectEbmlElements(bytes, track.dataStart, track.dataEnd);\n const codec = readEbmlString(bytes, children.find((child) => child.id === 0x86));\n if (codec && !codecs.includes(codec)) {\n codecs.push(codec);\n }\n const type = readEbmlUInt(bytes, children.find((child) => child.id === 0x83));\n const video = children.find((child) => child.id === 0xe0);\n if (type === 1 && video) {\n const videoChildren = collectEbmlElements(bytes, video.dataStart, video.dataEnd);\n width = readEbmlUInt(bytes, videoChildren.find((child) => child.id === 0xb0)) || width;\n height = readEbmlUInt(bytes, videoChildren.find((child) => child.id === 0xba)) || height;\n }\n }\n return { count: trackEntries.length, codecs, width, height };\n}\n\nfunction readEbmlString(bytes: Uint8Array, element?: EbmlElement): string | undefined {\n if (!element || element.dataEnd <= element.dataStart || element.dataEnd - element.dataStart > 4096) {\n return undefined;\n }\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(element.dataStart, element.dataEnd)).replace(/\\0+$/g, \"\").trim();\n}\n\nfunction readEbmlUInt(bytes: Uint8Array, element?: EbmlElement): number | undefined {\n if (!element || element.dataEnd <= element.dataStart || element.dataEnd - element.dataStart > 6) {\n return undefined;\n }\n let value = 0;\n for (let offset = element.dataStart; offset < element.dataEnd; offset++) {\n value = value * 256 + bytes[offset];\n }\n return value;\n}\n\nfunction readEbmlFloat(bytes: Uint8Array, element?: EbmlElement): number | undefined {\n if (!element) {\n return undefined;\n }\n const data = view(bytes);\n if (element.dataEnd - element.dataStart === 4) {\n return data.getFloat32(element.dataStart, false);\n }\n if (element.dataEnd - element.dataStart === 8) {\n return data.getFloat64(element.dataStart, false);\n }\n return undefined;\n}\n\nfunction parseHlsInfo(bytes: Uint8Array): VideoInfo | null {\n const text = decodeTextHead(bytes);\n if (!text.startsWith(\"#EXTM3U\")) {\n return null;\n }\n const segments = countMatches(text, /^#EXTINF:/gm);\n const variants = countMatches(text, /^#EXT-X-STREAM-INF:/gm);\n const durations = [...text.matchAll(/^#EXTINF:([0-9.]+)/gm)].map((match) => Number(match[1])).filter(Number.isFinite);\n const bandwidth = text.match(/BANDWIDTH=(\\d+)/i)?.[1];\n return {\n format: \"HLS\",\n variants,\n segments,\n duration: durations.length > 0 ? formatDuration(durations.reduce((sum, value) => sum + value, 0)) : undefined,\n bitrate: bandwidth ? `${Math.round(Number(bandwidth) / 1000)} kbps` : undefined\n };\n}\n\nfunction parseDashInfo(bytes: Uint8Array): VideoInfo | null {\n const text = decodeTextHead(bytes);\n if (!/<MPD[\\s>]/i.test(text)) {\n return null;\n }\n return {\n format: \"DASH\",\n duration: isoDurationToClock(text.match(/mediaPresentationDuration=[\"']([^\"']+)[\"']/i)?.[1]),\n variants: countMatches(text, /<Representation\\b/gi),\n segments: countMatches(text, /<SegmentURL\\b|<S\\b/gi)\n };\n}\n\nfunction decodeTextHead(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(0, Math.min(bytes.length, 65536))).trim();\n}\n\nfunction countMatches(value: string, pattern: RegExp): number {\n return [...value.matchAll(pattern)].length;\n}\n\nfunction isoDurationToClock(value?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n const match = value.match(/^PT(?:(\\d+(?:\\.\\d+)?)H)?(?:(\\d+(?:\\.\\d+)?)M)?(?:(\\d+(?:\\.\\d+)?)S)?$/i);\n if (!match) {\n return value;\n }\n const seconds = Number(match[1] || 0) * 3600 + Number(match[2] || 0) * 60 + Number(match[3] || 0);\n return formatDuration(seconds);\n}\n\nfunction formatDuration(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds <= 0) {\n return \"\";\n }\n const total = Math.round(seconds);\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const rest = total % 60;\n return hours > 0 ? `${hours}:${String(minutes).padStart(2, \"0\")}:${String(rest).padStart(2, \"0\")}` : `${minutes}:${String(rest).padStart(2, \"0\")}`;\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"latin1\").decode(bytes.slice(offset, offset + length));\n}\n\nfunction findAscii(bytes: Uint8Array, value: string, start = 0): number {\n const encoded = new TextEncoder().encode(value);\n for (let offset = start; offset + encoded.length <= bytes.length; offset++) {\n if (encoded.every((byte, index) => bytes[offset + index] === byte)) {\n return offset;\n }\n }\n return -1;\n}\n\nfunction view(bytes: Uint8Array): DataView {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction readUint32Le(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, true);\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, false);\n}\n\nfunction readUint64Be(bytes: Uint8Array, offset: number): bigint {\n return (BigInt(readUint32Be(bytes, offset)) << 32n) | BigInt(readUint32Be(bytes, offset + 4));\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\n\nconst audioExtensions = new Set([\n \"mp3\",\n \"wav\",\n \"aif\",\n \"aiff\",\n \"aifc\",\n \"ogg\",\n \"oga\",\n \"aac\",\n \"m4a\",\n \"flac\",\n \"opus\",\n \"weba\",\n \"amr\",\n \"mid\",\n \"midi\",\n \"caf\",\n \"au\",\n \"snd\",\n \"wma\"\n]);\n\nexport function audioPlugin(): PreviewPlugin {\n return {\n name: \"audio\",\n match(file) {\n return file.mimeType.startsWith(\"audio/\") || audioExtensions.has(file.extension);\n },\n async render(ctx) {\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-audio\";\n const bytes = await readAudioBytes(ctx.file.blob);\n\n const title = document.createElement(\"div\");\n title.className = \"ofv-audio-title\";\n title.textContent = ctx.file.name;\n\n const audio = document.createElement(\"audio\");\n audio.src = url;\n audio.controls = true;\n audio.preload = \"metadata\";\n\n wrapper.append(title, audio, createAudioInfo(parseAudioInfo(bytes, ctx.file.extension, ctx.file.mimeType)));\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(wrapper);\n\n const formatLabel = (ctx.file.extension || ctx.file.mimeType || \"audio\").toUpperCase();\n const showPlaybackFallback = () => {\n audio.pause();\n audio.remove();\n\n if (wrapper.querySelector(\".ofv-fallback\")) {\n return;\n }\n\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const fallbackTitle = document.createElement(\"strong\");\n fallbackTitle.textContent = `当前浏览器不支持直接播放该音频格式 (${formatLabel})`;\n\n const meta = document.createElement(\"span\");\n meta.textContent = \"建议转换为 MP3/AAC/OGG 等浏览器兼容格式,或直接下载在本地播放。\";\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载音频\";\n\n fallback.append(fallbackTitle, meta, download);\n wrapper.append(fallback);\n };\n\n audio.addEventListener(\"error\", showPlaybackFallback);\n\n return {\n destroy() {\n audio.removeEventListener(\"error\", showPlaybackFallback);\n audio.pause();\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\ntype AudioInfo = {\n format: string;\n codec?: string;\n sampleRate?: number;\n channels?: number;\n bitDepth?: number;\n bitrate?: string;\n duration?: string;\n tags?: string;\n note?: string;\n};\n\nasync function readAudioBytes(blob?: Blob): Promise<Uint8Array> {\n if (!blob) {\n return new Uint8Array();\n }\n return new Uint8Array(await blob.arrayBuffer().catch(() => new ArrayBuffer(0)));\n}\n\nfunction createAudioInfo(info: AudioInfo): HTMLElement {\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-media-info\";\n appendMediaInfo(bar, \"格式\", info.format);\n if (info.codec) {\n appendMediaInfo(bar, \"编码\", info.codec);\n }\n if (info.sampleRate) {\n appendMediaInfo(bar, \"采样率\", `${info.sampleRate} Hz`);\n }\n if (info.channels) {\n appendMediaInfo(bar, \"声道\", String(info.channels));\n }\n if (info.bitDepth) {\n appendMediaInfo(bar, \"位深\", `${info.bitDepth} bit`);\n }\n if (info.bitrate) {\n appendMediaInfo(bar, \"码率\", info.bitrate);\n }\n if (info.duration) {\n appendMediaInfo(bar, \"时长\", info.duration);\n }\n if (info.tags) {\n appendMediaInfo(bar, \"标签\", info.tags);\n }\n if (info.note) {\n appendMediaInfo(bar, \"说明\", info.note);\n }\n return bar;\n}\n\nfunction appendMediaInfo(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n item.className = \"ofv-media-info-item\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction parseAudioInfo(bytes: Uint8Array, extension: string, mimeType: string): AudioInfo {\n const fallback = (extension || mimeType || \"audio\").toUpperCase();\n if (bytes.length === 0) {\n return { format: fallback, note: \"无法读取本地头信息\" };\n }\n return parseWaveInfo(bytes) || parseFlacInfo(bytes) || parseOggInfo(bytes) || parseAiffInfo(bytes) || parseAuInfo(bytes) || parseMidiInfo(bytes) || parseId3Mp3Info(bytes) || {\n format: fallback,\n note: \"暂未识别音频头结构\"\n };\n}\n\nfunction parseWaveInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 44 || asciiAt(bytes, 0, 4) !== \"RIFF\" || asciiAt(bytes, 8, 4) !== \"WAVE\") {\n return null;\n }\n let offset = 12;\n let channels = 0;\n let sampleRate = 0;\n let bitDepth = 0;\n let byteRate = 0;\n let dataBytes = 0;\n while (offset + 8 <= bytes.length) {\n const chunk = asciiAt(bytes, offset, 4);\n const size = readUint32Le(bytes, offset + 4);\n const dataOffset = offset + 8;\n if (chunk === \"fmt \" && dataOffset + 16 <= bytes.length) {\n channels = readUint16Le(bytes, dataOffset + 2);\n sampleRate = readUint32Le(bytes, dataOffset + 4);\n byteRate = readUint32Le(bytes, dataOffset + 8);\n bitDepth = readUint16Le(bytes, dataOffset + 14);\n }\n if (chunk === \"data\") {\n dataBytes = size;\n }\n offset += 8 + size + (size % 2);\n }\n return {\n format: \"WAV\",\n codec: \"PCM\",\n sampleRate,\n channels,\n bitDepth,\n bitrate: byteRate ? `${Math.round((byteRate * 8) / 1000)} kbps` : undefined,\n duration: byteRate && dataBytes ? formatDuration(dataBytes / byteRate) : undefined\n };\n}\n\nfunction parseFlacInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 42 || asciiAt(bytes, 0, 4) !== \"fLaC\") {\n return null;\n }\n let offset = 4;\n while (offset + 4 <= bytes.length) {\n const type = bytes[offset] & 0x7f;\n const length = (bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3];\n const dataOffset = offset + 4;\n if (type === 0 && dataOffset + 34 <= bytes.length) {\n const b10 = bytes[dataOffset + 10];\n const b11 = bytes[dataOffset + 11];\n const b12 = bytes[dataOffset + 12];\n const b13 = bytes[dataOffset + 13];\n const b14 = bytes[dataOffset + 14];\n const b15 = bytes[dataOffset + 15];\n const b16 = bytes[dataOffset + 16];\n const b17 = bytes[dataOffset + 17];\n const sampleRate = (b10 << 12) | (b11 << 4) | ((b12 & 0xf0) >> 4);\n const channels = ((b12 & 0x0e) >> 1) + 1;\n const bitDepth = (((b12 & 0x01) << 4) | ((b13 & 0xf0) >> 4)) + 1;\n const totalSamples = ((BigInt(b13 & 0x0f) << 32n) | (BigInt(b14) << 24n) | (BigInt(b15) << 16n) | (BigInt(b16) << 8n) | BigInt(b17));\n return {\n format: \"FLAC\",\n codec: \"FLAC\",\n sampleRate,\n channels,\n bitDepth,\n duration: sampleRate && totalSamples > 0n ? formatDuration(Number(totalSamples) / sampleRate) : undefined\n };\n }\n offset += 4 + length;\n }\n return { format: \"FLAC\", codec: \"FLAC\", note: \"未找到 STREAMINFO metadata block\" };\n}\n\nfunction parseId3Mp3Info(bytes: Uint8Array): AudioInfo | null {\n let offset = 0;\n let tags: string | undefined;\n if (bytes.length >= 10 && asciiAt(bytes, 0, 3) === \"ID3\") {\n tags = `ID3v2.${bytes[3]}.${bytes[4]}`;\n offset = 10 + readSynchsafe(bytes, 6);\n }\n for (let index = offset; index + 3 < Math.min(bytes.length, offset + 4096); index++) {\n if (bytes[index] === 0xff && (bytes[index + 1] & 0xe0) === 0xe0) {\n const versionBits = (bytes[index + 1] >> 3) & 0x03;\n const layerBits = (bytes[index + 1] >> 1) & 0x03;\n const bitrateIndex = (bytes[index + 2] >> 4) & 0x0f;\n const sampleIndex = (bytes[index + 2] >> 2) & 0x03;\n const channelMode = (bytes[index + 3] >> 6) & 0x03;\n return {\n format: \"MP3\",\n codec: `${mpegVersion(versionBits)} Layer ${mpegLayer(layerBits)}`,\n sampleRate: mp3SampleRate(versionBits, sampleIndex),\n channels: channelMode === 3 ? 1 : 2,\n bitrate: mp3Bitrate(versionBits, layerBits, bitrateIndex),\n tags\n };\n }\n }\n return tags ? { format: \"MP3\", tags, note: \"未在头部扫描到 MPEG frame\" } : null;\n}\n\nfunction parseOggInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 36 || asciiAt(bytes, 0, 4) !== \"OggS\") {\n return null;\n }\n const pages = collectOggPages(bytes);\n const firstPacket = pages[0]?.packets[0];\n const lastGranule = [...pages].reverse().find((page) => page.granule > 0n)?.granule;\n if (firstPacket && asciiAt(firstPacket, 0, 8) === \"OpusHead\") {\n const preSkip = firstPacket.length >= 12 ? readUint16Le(firstPacket, 10) : 0;\n const sampleRate = firstPacket.length >= 16 ? readUint32Le(firstPacket, 12) : 48000;\n const totalSamples = lastGranule === undefined ? undefined : lastGranule - BigInt(preSkip);\n return {\n format: \"Ogg\",\n codec: \"Opus\",\n channels: firstPacket[9],\n sampleRate,\n duration: totalSamples !== undefined && totalSamples > 0n ? formatDuration(Number(totalSamples) / 48000) : undefined,\n note: `${pages.length} 页`\n };\n }\n if (firstPacket && firstPacket[0] === 0x01 && asciiAt(firstPacket, 1, 6) === \"vorbis\") {\n const sampleRate = firstPacket.length >= 16 ? readUint32Le(firstPacket, 12) : undefined;\n return {\n format: \"Ogg\",\n codec: \"Vorbis\",\n channels: firstPacket[11],\n sampleRate,\n bitrate: firstPacket.length >= 28 ? oggVorbisBitrate(firstPacket) : undefined,\n duration: sampleRate && lastGranule !== undefined && lastGranule > 0n ? formatDuration(Number(lastGranule) / sampleRate) : undefined,\n note: `${pages.length} 页`\n };\n }\n return { format: \"Ogg\", note: pages.length > 0 ? `未识别 Ogg codec header,${pages.length} 页` : \"未识别 Ogg codec header\" };\n}\n\ntype OggPage = {\n granule: bigint;\n packets: Uint8Array[];\n};\n\nfunction collectOggPages(bytes: Uint8Array): OggPage[] {\n const pages: OggPage[] = [];\n let offset = 0;\n let continuedPacket: number[] = [];\n while (offset + 27 <= bytes.length && asciiAt(bytes, offset, 4) === \"OggS\") {\n const segmentCount = bytes[offset + 26];\n const segmentTableOffset = offset + 27;\n const dataOffset = segmentTableOffset + segmentCount;\n if (dataOffset > bytes.length) {\n break;\n }\n const sizes = Array.from(bytes.slice(segmentTableOffset, dataOffset));\n const payloadLength = sizes.reduce((sum, value) => sum + value, 0);\n const payloadEnd = dataOffset + payloadLength;\n if (payloadEnd > bytes.length) {\n break;\n }\n const pagePackets: Uint8Array[] = [];\n let packetOffset = dataOffset;\n for (const size of sizes) {\n continuedPacket.push(...bytes.slice(packetOffset, packetOffset + size));\n packetOffset += size;\n if (size < 255) {\n pagePackets.push(new Uint8Array(continuedPacket));\n continuedPacket = [];\n }\n }\n pages.push({\n granule: readUint64Le(bytes, offset + 6),\n packets: pagePackets\n });\n offset = payloadEnd;\n }\n return pages;\n}\n\nfunction oggVorbisBitrate(packet: Uint8Array): string | undefined {\n const nominal = readUint32Le(packet, 20);\n if (nominal > 0) {\n return `${Math.round(nominal / 1000)} kbps`;\n }\n const upper = readUint32Le(packet, 16);\n const lower = readUint32Le(packet, 24);\n if (upper > 0 && lower > 0) {\n return `${Math.round(((upper + lower) / 2) / 1000)} kbps`;\n }\n return undefined;\n}\n\nfunction parseAiffInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 12 || asciiAt(bytes, 0, 4) !== \"FORM\" || ![\"AIFF\", \"AIFC\"].includes(asciiAt(bytes, 8, 4))) {\n return null;\n }\n const format = asciiAt(bytes, 8, 4);\n let offset = 12;\n while (offset + 26 <= bytes.length) {\n const chunk = asciiAt(bytes, offset, 4);\n const size = readUint32Be(bytes, offset + 4);\n if (chunk === \"COMM\") {\n return {\n format,\n channels: readUint16Be(bytes, offset + 8),\n bitDepth: readUint16Be(bytes, offset + 14),\n sampleRate: Math.round(readAiffExtended(bytes, offset + 16))\n };\n }\n offset += 8 + size + (size % 2);\n }\n return { format, note: \"未找到 COMM chunk\" };\n}\n\nfunction parseAuInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 24 || asciiAt(bytes, 0, 4) !== \".snd\") {\n return null;\n }\n const dataOffset = readUint32Be(bytes, 4);\n const dataSize = readUint32Be(bytes, 8);\n const encoding = readUint32Be(bytes, 12);\n const sampleRate = readUint32Be(bytes, 16);\n const channels = readUint32Be(bytes, 20);\n const bitDepth = auBitDepth(encoding);\n const bytesPerSample = bitDepth ? bitDepth / 8 : 0;\n const resolvedDataSize = dataSize === 0xffffffff ? Math.max(0, bytes.length - dataOffset) : dataSize;\n return {\n format: \"AU/SND\",\n codec: auEncodingName(encoding),\n sampleRate,\n channels,\n bitDepth,\n duration: sampleRate && channels && bytesPerSample && resolvedDataSize ? formatDuration(resolvedDataSize / (sampleRate * channels * bytesPerSample)) : undefined,\n note: `data @ ${dataOffset} B`\n };\n}\n\nfunction auEncodingName(value: number): string {\n const names: Record<number, string> = {\n 1: \"8-bit μ-law\",\n 2: \"8-bit linear PCM\",\n 3: \"16-bit linear PCM\",\n 4: \"24-bit linear PCM\",\n 5: \"32-bit linear PCM\",\n 6: \"32-bit float\",\n 7: \"64-bit float\",\n 23: \"G.721 ADPCM\",\n 24: \"G.722 ADPCM\",\n 25: \"G.723 3-bit ADPCM\",\n 26: \"G.723 5-bit ADPCM\",\n 27: \"8-bit A-law\"\n };\n return names[value] || `encoding ${value}`;\n}\n\nfunction auBitDepth(value: number): number | undefined {\n const depths: Record<number, number> = {\n 1: 8,\n 2: 8,\n 3: 16,\n 4: 24,\n 5: 32,\n 6: 32,\n 7: 64,\n 27: 8\n };\n return depths[value];\n}\n\nfunction parseMidiInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 14 || asciiAt(bytes, 0, 4) !== \"MThd\") {\n return null;\n }\n return {\n format: \"MIDI\",\n codec: `SMF ${readUint16Be(bytes, 8)}`,\n channels: readUint16Be(bytes, 10),\n note: `${readUint16Be(bytes, 12)} ticks/quarter`\n };\n}\n\nfunction formatDuration(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds <= 0) {\n return \"\";\n }\n const total = Math.round(seconds);\n const minutes = Math.floor(total / 60);\n const rest = total % 60;\n return `${minutes}:${String(rest).padStart(2, \"0\")}`;\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"ascii\").decode(bytes.slice(offset, offset + length));\n}\n\nfunction view(bytes: Uint8Array): DataView {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction readUint16Le(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint16(offset, true);\n}\n\nfunction readUint16Be(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint16(offset, false);\n}\n\nfunction readUint32Le(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, true);\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, false);\n}\n\nfunction readUint64Le(bytes: Uint8Array, offset: number): bigint {\n return (BigInt(readUint32Le(bytes, offset + 4)) << 32n) | BigInt(readUint32Le(bytes, offset));\n}\n\nfunction readSynchsafe(bytes: Uint8Array, offset: number): number {\n return ((bytes[offset] & 0x7f) << 21) | ((bytes[offset + 1] & 0x7f) << 14) | ((bytes[offset + 2] & 0x7f) << 7) | (bytes[offset + 3] & 0x7f);\n}\n\nfunction mpegVersion(bits: number): string {\n return bits === 3 ? \"MPEG-1\" : bits === 2 ? \"MPEG-2\" : bits === 0 ? \"MPEG-2.5\" : \"MPEG\";\n}\n\nfunction mpegLayer(bits: number): string {\n return bits === 3 ? \"I\" : bits === 2 ? \"II\" : bits === 1 ? \"III\" : \"?\";\n}\n\nfunction mp3SampleRate(versionBits: number, index: number): number | undefined {\n const rates = versionBits === 3 ? [44100, 48000, 32000] : versionBits === 2 ? [22050, 24000, 16000] : [11025, 12000, 8000];\n return rates[index];\n}\n\nfunction mp3Bitrate(versionBits: number, layerBits: number, index: number): string | undefined {\n const mpeg1Layer3 = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320];\n const mpeg2Layer3 = [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160];\n if (index <= 0 || index >= 15 || layerBits !== 1) {\n return undefined;\n }\n return `${(versionBits === 3 ? mpeg1Layer3 : mpeg2Layer3)[index]} kbps`;\n}\n\nfunction readAiffExtended(bytes: Uint8Array, offset: number): number {\n const exponent = readUint16Be(bytes, offset) & 0x7fff;\n let mantissa = 0;\n for (let index = 0; index < 8; index++) {\n mantissa = mantissa * 256 + bytes[offset + 2 + index];\n }\n return mantissa * Math.pow(2, exponent - 16383 - 63);\n}\n","/// <reference path=\"../shims-text.d.ts\" />\nimport { isTextLike } from \"../detect\";\nimport type { PreviewPlugin } from \"../types\";\n\nconst langMap: Record<string, string> = {\n js: \"javascript\",\n mjs: \"javascript\",\n cjs: \"javascript\",\n ts: \"typescript\",\n tsx: \"tsx\",\n jsx: \"jsx\",\n html: \"markup\",\n htm: \"markup\",\n vue: \"markup\",\n xml: \"markup\",\n css: \"css\",\n scss: \"scss\",\n less: \"less\",\n json: \"json\",\n jsonc: \"json\",\n json5: \"json5\",\n ipynb: \"json\",\n jsonl: \"json\",\n ndjson: \"json\",\n toml: \"toml\",\n ini: \"ini\",\n properties: \"properties\",\n proto: \"protobuf\",\n tf: \"hcl\",\n tfvars: \"hcl\",\n hcl: \"hcl\",\n tex: \"latex\",\n latex: \"latex\",\n bib: \"latex\",\n gv: \"dot\",\n http: \"http\",\n py: \"python\",\n java: \"java\",\n cpp: \"cpp\",\n c: \"c\",\n h: \"c\",\n hpp: \"cpp\",\n cs: \"csharp\",\n go: \"go\",\n rs: \"rust\",\n rb: \"ruby\",\n swift: \"swift\",\n kt: \"kotlin\",\n kts: \"kotlin\",\n scala: \"scala\",\n lua: \"lua\",\n r: \"r\",\n dart: \"dart\",\n svelte: \"markup\",\n astro: \"markup\",\n elm: \"elm\",\n ex: \"elixir\",\n exs: \"elixir\",\n clj: \"clojure\",\n cljs: \"clojure\",\n erl: \"erlang\",\n hrl: \"erlang\",\n fs: \"fsharp\",\n fsx: \"fsharp\",\n hs: \"haskell\",\n lhs: \"haskell\",\n sql: \"sql\",\n sh: \"bash\",\n bash: \"bash\",\n zsh: \"bash\",\n fish: \"bash\",\n ps1: \"powershell\",\n bat: \"batch\",\n cmd: \"batch\",\n dockerfile: \"docker\",\n nginxconf: \"nginx\",\n gradle: \"groovy\",\n graphql: \"graphql\",\n gql: \"graphql\",\n yaml: \"yaml\",\n yml: \"yaml\",\n diff: \"diff\",\n patch: \"diff\",\n php: \"php\",\n md: \"markdown\",\n markdown: \"markdown\"\n};\nconst filenameLangMap: Record<string, string> = {\n dockerfile: \"docker\",\n makefile: \"makefile\",\n gemfile: \"ruby\",\n rakefile: \"ruby\",\n procfile: \"bash\",\n jenkinsfile: \"groovy\",\n vagrantfile: \"ruby\",\n brewfile: \"ruby\",\n podfile: \"ruby\",\n \"go.mod\": \"go\",\n \"go.sum\": \"go\",\n \"cargo.toml\": \"toml\",\n \"cargo.lock\": \"toml\",\n \".gitignore\": \"none\",\n \".dockerignore\": \"ignore\",\n \".npmrc\": \"none\",\n \".yarnrc\": \"none\",\n \".pnpmrc\": \"none\",\n \".editorconfig\": \"editorconfig\",\n \".browserslistrc\": \"none\",\n \".prettierrc\": \"json\",\n \".eslintrc\": \"json\",\n \".stylelintrc\": \"json\",\n readme: \"markdown\",\n changelog: \"markdown\",\n changes: \"markdown\",\n history: \"markdown\",\n license: \"none\",\n licence: \"none\",\n copying: \"none\",\n notice: \"none\",\n authors: \"none\",\n contributors: \"none\",\n codeowners: \"none\"\n};\nconst mimeLangMap: Record<string, string> = {\n \"text/markdown\": \"markdown\",\n \"text/html\": \"markup\",\n \"application/xml\": \"markup\",\n \"text/xml\": \"markup\",\n \"application/json\": \"json\",\n \"application/json5\": \"json5\",\n \"application/x-ipynb+json\": \"json\",\n \"application/x-ndjson\": \"json\",\n \"application/yaml\": \"yaml\",\n \"application/x-yaml\": \"yaml\",\n \"text/yaml\": \"yaml\",\n \"application/javascript\": \"javascript\",\n \"application/x-javascript\": \"javascript\",\n \"text/javascript\": \"javascript\",\n \"application/typescript\": \"typescript\",\n \"application/x-typescript\": \"typescript\",\n \"text/typescript\": \"typescript\",\n \"application/sql\": \"sql\",\n \"application/x-sh\": \"bash\",\n \"application/graphql\": \"graphql\",\n \"text/calendar\": \"none\",\n \"text/vcard\": \"none\",\n \"application/x-pem-file\": \"none\",\n \"application/x-x509-ca-cert\": \"none\",\n \"application/pkix-cert\": \"none\",\n \"application/x-httpd-php\": \"php\",\n \"application/x-tex\": \"latex\",\n \"message/http\": \"http\",\n \"text/x-bibtex\": \"latex\",\n \"text/x-hcl\": \"hcl\",\n \"text/x-protobuf\": \"protobuf\",\n \"text/vnd.graphviz\": \"dot\",\n \"text/css\": \"css\"\n};\n\nconst MAX_HIGHLIGHT_CHARS = 180_000;\nconst MAX_RENDER_CHARS = 600_000;\nconst MONACO_LOADER_KEY = \"__OFV_MONACO_LOADER__\";\n\ntype MonacoModel = {\n dispose?: () => void;\n};\n\ntype MonacoEditor = {\n dispose?: () => void;\n layout?: () => void;\n updateOptions?: (options: Record<string, unknown>) => void;\n};\n\ntype MonacoModule = {\n editor?: {\n create?: (container: HTMLElement, options: Record<string, unknown>) => MonacoEditor;\n createModel?: (value: string, language?: string) => MonacoModel;\n setTheme?: (theme: string) => void;\n };\n};\n\nfunction loadPrismCss(theme: \"light\" | \"dark\"): Promise<void> {\n const lightId = \"ofv-prism-css-light\";\n const darkId = \"ofv-prism-css-dark\";\n\n const activeId = theme === \"dark\" ? darkId : lightId;\n const inactiveId = theme === \"dark\" ? lightId : darkId;\n\n document.getElementById(inactiveId)?.remove();\n\n if (document.getElementById(activeId)) {\n return Promise.resolve();\n }\n\n const href =\n theme === \"dark\"\n ? \"https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism-tomorrow.min.css\"\n : \"https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism.min.css\";\n\n return new Promise((resolve, reject) => {\n const link = document.createElement(\"link\");\n link.id = activeId;\n link.rel = \"stylesheet\";\n link.href = href;\n link.onload = () => resolve();\n link.onerror = () => reject(new Error(`Failed to load Prism CSS: ${href}`));\n document.head.appendChild(link);\n });\n}\n\nexport function textPlugin(): PreviewPlugin {\n return {\n name: \"text\",\n match(file) {\n return isTextLike(file);\n },\n async render(ctx) {\n const ext = ctx.file.extension.toLowerCase();\n const lang = getTextLanguage(ctx.file.name, ext, ctx.file.mimeType);\n const defaultWrapped = lang === \"none\";\n const isMarkdown = lang === \"markdown\";\n const text = await readText(ctx.file.source).catch((error: unknown) => undefined);\n if (text === undefined) {\n const fallback = createTextFallback(ctx.file.name, ctx.file.url);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(fallback);\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n fallback.remove();\n }\n };\n }\n\n // Detect dark theme active state\n const isDark =\n ctx.host.parentElement?.classList.contains(\"ofv-theme-dark\") ||\n document.body.classList.contains(\"ofv-theme-dark\") ||\n (ctx.options.theme === \"auto\" && window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches) ||\n ctx.options.theme === \"dark\";\n\n // 1. Markdown path\n if (isMarkdown) {\n const [markedModule, PrismModule, DOMPurifyModule] = await Promise.all([\n import(\"marked\"),\n import(\"prismjs\"),\n import(\"dompurify\")\n ]);\n\n const parseMarkdown =\n markedModule.marked?.parse || markedModule.parse || (markedModule as any).default?.parse;\n const Prism = PrismModule.default || PrismModule;\n const DOMPurify = DOMPurifyModule.default || DOMPurifyModule;\n\n const container = document.createElement(\"div\");\n container.className = \"ofv-markdown-body\";\n container.innerHTML = DOMPurify.sanitize(parseMarkdown(text), {\n USE_PROFILES: { html: true },\n ADD_ATTR: [\"target\"]\n });\n secureMarkdownLinks(container);\n ctx.viewport.appendChild(container);\n\n // Highlight code blocks inside markdown\n try {\n const codeBlocks = container.querySelectorAll(\"pre code\");\n if (codeBlocks.length > 0) {\n await loadPrismCss(isDark ? \"dark\" : \"light\");\n codeBlocks.forEach((block) => {\n const parent = block.parentElement;\n if (parent && !parent.className.includes(\"language-\")) {\n parent.className = \"language-none\";\n }\n Prism.highlightElement(block);\n });\n }\n } catch (e) {\n console.warn(\"Prism highlight for markdown failed:\", e);\n }\n\n return {\n destroy() {\n container.remove();\n }\n };\n }\n\n // 2. Syntax-highlighted code path\n const [PrismModule] = await Promise.all([import(\"prismjs\")]);\n const Prism = PrismModule.default || PrismModule;\n\n // Load specific language component dynamically if needed\n if (lang !== \"none\") {\n try {\n if (lang === \"typescript\" || lang === \"tsx\") {\n await import(\"prismjs/components/prism-typescript\");\n } else if (lang === \"python\") {\n await import(\"prismjs/components/prism-python\");\n } else if (lang === \"json\") {\n await import(\"prismjs/components/prism-json\");\n } else if (lang === \"json5\") {\n await import(\"prismjs/components/prism-json5\");\n } else if (lang === \"yaml\") {\n await import(\"prismjs/components/prism-yaml\");\n } else if (lang === \"toml\") {\n await import(\"prismjs/components/prism-toml\");\n } else if (lang === \"ini\") {\n await import(\"prismjs/components/prism-ini\");\n } else if (lang === \"properties\") {\n await import(\"prismjs/components/prism-properties\");\n } else if (lang === \"editorconfig\") {\n await import(\"prismjs/components/prism-editorconfig\");\n } else if (lang === \"ignore\") {\n await import(\"prismjs/components/prism-ignore\");\n } else if (lang === \"protobuf\") {\n await import(\"prismjs/components/prism-protobuf\");\n } else if (lang === \"hcl\") {\n await import(\"prismjs/components/prism-hcl\");\n } else if (lang === \"latex\") {\n await import(\"prismjs/components/prism-latex\");\n } else if (lang === \"dot\") {\n await import(\"prismjs/components/prism-dot\");\n } else if (lang === \"http\") {\n await import(\"prismjs/components/prism-http\");\n } else if (lang === \"bash\") {\n await import(\"prismjs/components/prism-bash\");\n } else if (lang === \"powershell\") {\n await import(\"prismjs/components/prism-powershell\");\n } else if (lang === \"batch\") {\n await import(\"prismjs/components/prism-batch\");\n } else if (lang === \"docker\") {\n await import(\"prismjs/components/prism-docker\");\n } else if (lang === \"makefile\") {\n await import(\"prismjs/components/prism-makefile\");\n } else if (lang === \"ruby\") {\n await import(\"prismjs/components/prism-ruby\");\n } else if (lang === \"nginx\") {\n await import(\"prismjs/components/prism-nginx\");\n } else if (lang === \"groovy\") {\n await import(\"prismjs/components/prism-groovy\");\n } else if (lang === \"graphql\") {\n await import(\"prismjs/components/prism-graphql\");\n } else if (lang === \"csharp\") {\n await import(\"prismjs/components/prism-csharp\");\n } else if (lang === \"rust\") {\n await import(\"prismjs/components/prism-rust\");\n } else if (lang === \"go\") {\n await import(\"prismjs/components/prism-go\");\n } else if (lang === \"ruby\") {\n await import(\"prismjs/components/prism-ruby\");\n } else if (lang === \"swift\") {\n await import(\"prismjs/components/prism-swift\");\n } else if (lang === \"kotlin\") {\n await import(\"prismjs/components/prism-kotlin\");\n } else if (lang === \"scala\") {\n await import(\"prismjs/components/prism-scala\");\n } else if (lang === \"lua\") {\n await import(\"prismjs/components/prism-lua\");\n } else if (lang === \"r\") {\n await import(\"prismjs/components/prism-r\");\n } else if (lang === \"dart\") {\n await import(\"prismjs/components/prism-dart\");\n } else if (lang === \"elm\") {\n await import(\"prismjs/components/prism-elm\");\n } else if (lang === \"elixir\") {\n await import(\"prismjs/components/prism-elixir\");\n } else if (lang === \"clojure\") {\n await import(\"prismjs/components/prism-clojure\");\n } else if (lang === \"erlang\") {\n await import(\"prismjs/components/prism-erlang\");\n } else if (lang === \"fsharp\") {\n await import(\"prismjs/components/prism-fsharp\");\n } else if (lang === \"haskell\") {\n await import(\"prismjs/components/prism-haskell\");\n } else if (lang === \"sql\") {\n await import(\"prismjs/components/prism-sql\");\n } else if (lang === \"cpp\") {\n await import(\"prismjs/components/prism-c\");\n await import(\"prismjs/components/prism-cpp\");\n } else if (lang === \"java\") {\n await import(\"prismjs/components/prism-java\");\n } else if (lang === \"php\") {\n await import(\"prismjs/components/prism-markup-templating\");\n await import(\"prismjs/components/prism-php\");\n }\n } catch (e) {\n console.warn(`Prism failed to load language component for: ${lang}`, e);\n }\n }\n\n await loadPrismCss(isDark ? \"dark\" : \"light\").catch((error) => {\n console.warn(\"Prism CSS failed to load; rendering code without external theme:\", error);\n });\n\n const codeText = text.length > MAX_RENDER_CHARS ? text.slice(0, MAX_RENDER_CHARS) : text;\n const totalLines = countLines(text);\n const shownLines = countLines(codeText);\n const truncated = codeText.length < text.length;\n const shouldHighlight = codeText.length <= MAX_HIGHLIGHT_CHARS;\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-code-container\";\n if (truncated) {\n wrapper.classList.add(\"is-truncated\");\n }\n if (defaultWrapped) {\n wrapper.classList.add(\"is-wrapped\");\n }\n\n const header = document.createElement(\"div\");\n header.className = \"ofv-code-header\";\n\n const title = document.createElement(\"div\");\n title.className = \"ofv-code-title\";\n const fileName = document.createElement(\"strong\");\n fileName.textContent = ctx.file.name;\n const meta = document.createElement(\"span\");\n meta.textContent = [\n lang === \"none\" ? \"plain text\" : lang,\n `${totalLines.toLocaleString()} lines`,\n formatBytes(ctx.file.size ?? (ctx.file.source instanceof Blob ? ctx.file.source.size : text.length))\n ].join(\" · \");\n title.append(fileName, meta);\n\n const actions = document.createElement(\"div\");\n actions.className = \"ofv-code-actions\";\n\n const status = document.createElement(\"span\");\n status.className = \"ofv-code-status\";\n status.setAttribute(\"role\", \"status\");\n\n const wrapButton = document.createElement(\"button\");\n wrapButton.type = \"button\";\n wrapButton.className = \"ofv-code-action\";\n wrapButton.textContent = \"Wrap\";\n wrapButton.setAttribute(\"aria-pressed\", String(defaultWrapped));\n wrapButton.addEventListener(\"click\", () => {\n const wrapped = wrapper.classList.toggle(\"is-wrapped\");\n wrapButton.setAttribute(\"aria-pressed\", String(wrapped));\n monacoEditor?.updateOptions?.({ wordWrap: wrapped ? \"on\" : \"off\" });\n if (fallbackEditor) {\n fallbackEditor.wrap = wrapped ? \"soft\" : \"off\";\n }\n });\n\n const copyButton = document.createElement(\"button\");\n copyButton.type = \"button\";\n copyButton.className = \"ofv-code-action\";\n copyButton.textContent = \"Copy\";\n copyButton.addEventListener(\"click\", async () => {\n copyButton.disabled = true;\n try {\n await copyToClipboard(text);\n status.textContent = \"Copied\";\n } catch {\n status.textContent = \"Copy failed\";\n } finally {\n copyButton.disabled = false;\n }\n });\n\n const downloadButton = document.createElement(\"button\");\n downloadButton.type = \"button\";\n downloadButton.className = \"ofv-code-action\";\n downloadButton.textContent = \"Download\";\n downloadButton.addEventListener(\"click\", () => {\n downloadText(ctx.file.name, text);\n status.textContent = \"Download ready\";\n });\n\n const editorButton = document.createElement(\"button\");\n editorButton.type = \"button\";\n editorButton.className = \"ofv-code-action\";\n editorButton.textContent = \"Editor\";\n editorButton.setAttribute(\"aria-pressed\", \"false\");\n\n actions.append(status, editorButton, wrapButton, copyButton, downloadButton);\n header.append(title, actions);\n const structureSummary = createTextStructureSummary(text, ext, lang, ctx.file.mimeType);\n\n const body = document.createElement(\"div\");\n body.className = \"ofv-code-body\";\n\n const gutter = document.createElement(\"pre\");\n gutter.className = \"ofv-code-gutter\";\n gutter.setAttribute(\"aria-hidden\", \"true\");\n gutter.textContent = createLineNumbers(shownLines);\n\n const pre = document.createElement(\"pre\");\n pre.className = `language-${lang}`;\n\n const code = document.createElement(\"code\");\n code.className = `language-${lang}`;\n code.textContent = codeText;\n\n pre.appendChild(code);\n body.append(gutter, pre);\n const editorHost = document.createElement(\"div\");\n editorHost.className = \"ofv-code-editor\";\n editorHost.hidden = true;\n\n let monacoEditor: MonacoEditor | undefined;\n let monacoModel: MonacoModel | undefined;\n let fallbackEditor: HTMLTextAreaElement | undefined;\n let editorReady = false;\n let editorLoading: Promise<void> | undefined;\n\n const showReader = () => {\n editorHost.hidden = true;\n body.hidden = false;\n wrapper.classList.remove(\"is-editor\");\n editorButton.textContent = \"Editor\";\n editorButton.setAttribute(\"aria-pressed\", \"false\");\n };\n\n const showEditor = async () => {\n if (text.length > MAX_RENDER_CHARS) {\n status.textContent = \"Editor skipped for large file\";\n return;\n }\n if (editorReady) {\n body.hidden = true;\n editorHost.hidden = false;\n wrapper.classList.add(\"is-editor\");\n editorButton.textContent = \"Reader\";\n editorButton.setAttribute(\"aria-pressed\", \"true\");\n monacoEditor?.layout?.();\n return;\n }\n if (!editorLoading) {\n editorLoading = (async () => {\n editorButton.disabled = true;\n status.textContent = \"Loading editor\";\n try {\n const monaco = await loadMonaco();\n if (!monaco.editor?.create) {\n throw new Error(\"Monaco editor API is unavailable.\");\n }\n const monacoLanguage = toMonacoLanguage(ext, lang);\n monaco.editor.setTheme?.(isDark ? \"vs-dark\" : \"vs\");\n monacoModel = monaco.editor.createModel?.(text, monacoLanguage);\n monacoEditor = monaco.editor.create(editorHost, {\n ...(monacoModel ? { model: monacoModel } : { value: text, language: monacoLanguage }),\n automaticLayout: true,\n fontFamily: \"var(--ofv-font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace)\",\n fontSize: 13,\n lineNumbers: \"on\",\n minimap: { enabled: text.length <= 80_000 },\n readOnly: true,\n renderLineHighlight: \"line\",\n scrollBeyondLastLine: false,\n wordWrap: wrapper.classList.contains(\"is-wrapped\") ? \"on\" : \"off\"\n });\n editorReady = true;\n status.textContent = \"Editor ready\";\n body.hidden = true;\n editorHost.hidden = false;\n wrapper.classList.add(\"is-editor\");\n editorButton.textContent = \"Reader\";\n editorButton.setAttribute(\"aria-pressed\", \"true\");\n monacoEditor.layout?.();\n } catch (error) {\n console.warn(\"Monaco editor failed to load; using built-in code editor fallback:\", error);\n fallbackEditor = createBasicCodeEditor(text, wrapper.classList.contains(\"is-wrapped\"));\n editorHost.replaceChildren(fallbackEditor);\n editorReady = true;\n status.textContent = \"Basic editor\";\n body.hidden = true;\n editorHost.hidden = false;\n wrapper.classList.add(\"is-editor\");\n editorButton.textContent = \"Reader\";\n editorButton.setAttribute(\"aria-pressed\", \"true\");\n } finally {\n editorButton.disabled = false;\n }\n })();\n }\n await editorLoading;\n };\n\n editorButton.addEventListener(\"click\", () => {\n if (editorHost.hidden) {\n void showEditor();\n } else {\n showReader();\n status.textContent = \"Reader mode\";\n }\n });\n\n wrapper.append(header);\n if (structureSummary) {\n wrapper.append(structureSummary);\n }\n if (truncated) {\n const notice = document.createElement(\"div\");\n notice.className = \"ofv-code-notice\";\n notice.textContent = `文件较大,当前展示前 ${formatBytes(codeText.length)},复制和下载仍会使用完整内容。`;\n wrapper.append(notice);\n }\n if (!shouldHighlight) {\n const notice = document.createElement(\"div\");\n notice.className = \"ofv-code-notice\";\n notice.textContent = \"内容较大,已跳过语法高亮以保持滚动流畅。\";\n wrapper.append(notice);\n }\n wrapper.appendChild(body);\n wrapper.appendChild(editorHost);\n ctx.viewport.appendChild(wrapper);\n\n if (shouldHighlight) {\n try {\n Prism.highlightElement(code);\n } catch (err) {\n console.error(\"Prism syntax highlighting failed:\", err);\n }\n }\n\n return {\n resize() {\n monacoEditor?.layout?.();\n },\n destroy() {\n monacoEditor?.dispose?.();\n monacoModel?.dispose?.();\n wrapper.remove();\n }\n };\n }\n };\n}\n\nfunction getTextLanguage(fileName: string, extension: string, mimeType: string): string {\n const normalizedFileName = normalizeFileName(fileName);\n return (\n langMap[extension] ||\n filenameLangMap[normalizedFileName] ||\n filenameLangMap[normalizedFileName.split(\".\")[0]] ||\n mimeLangMap[mimeType.toLowerCase()] ||\n \"none\"\n );\n}\n\nfunction normalizeFileName(name: string): string {\n const baseName = name.split(/[\\\\/]/).pop() || name;\n return baseName.toLowerCase();\n}\n\nasync function loadMonaco(): Promise<MonacoModule> {\n const injectedLoader = (globalThis as Record<string, unknown>)[MONACO_LOADER_KEY];\n if (typeof injectedLoader === \"function\") {\n return (await (injectedLoader as () => Promise<MonacoModule> | MonacoModule)()) as MonacoModule;\n }\n const importer = new Function(\"specifier\", \"return import(specifier)\") as (specifier: string) => Promise<MonacoModule>;\n return importer(\"monaco-editor\");\n}\n\nfunction toMonacoLanguage(ext: string, prismLanguage: string): string {\n if (ext === \"vue\") {\n return \"html\";\n }\n if (ext === \"tsx\") {\n return \"typescript\";\n }\n if (ext === \"jsx\") {\n return \"javascript\";\n }\n if (prismLanguage === \"markup\") {\n return ext === \"xml\" ? \"xml\" : \"html\";\n }\n if (prismLanguage === \"bash\") {\n return \"shell\";\n }\n if (prismLanguage === \"none\") {\n return \"plaintext\";\n }\n return prismLanguage;\n}\n\nfunction createBasicCodeEditor(text: string, wrapped: boolean): HTMLTextAreaElement {\n const textarea = document.createElement(\"textarea\");\n textarea.className = \"ofv-code-editor-fallback\";\n textarea.readOnly = true;\n textarea.spellcheck = false;\n textarea.wrap = wrapped ? \"soft\" : \"off\";\n textarea.value = text;\n textarea.setAttribute(\"aria-label\", \"Code editor preview\");\n return textarea;\n}\n\nfunction createTextFallback(fileName: string, url?: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"文本预览失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = \"无法读取该文本内容,可能是远程文件不可访问或响应状态异常。\";\n\n fallback.append(title, meta);\n if (url) {\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"打开原文件\";\n fallback.append(download);\n }\n return fallback;\n}\n\nfunction secureMarkdownLinks(container: HTMLElement): void {\n for (const link of container.querySelectorAll<HTMLAnchorElement>(\"a[href]\")) {\n const href = link.getAttribute(\"href\") || \"\";\n if (!isSafeMarkdownHref(href)) {\n link.removeAttribute(\"href\");\n link.removeAttribute(\"target\");\n link.removeAttribute(\"rel\");\n continue;\n }\n if (/^(https?:)?\\/\\//i.test(href)) {\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n }\n }\n}\n\nfunction isSafeMarkdownHref(href: string): boolean {\n const trimmed = href.trim();\n return (\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"/\") ||\n trimmed.startsWith(\"./\") ||\n trimmed.startsWith(\"../\") ||\n /^(https?:|mailto:|tel:)/i.test(trimmed)\n );\n}\n\nfunction countLines(text: string): number {\n if (!text) {\n return 1;\n }\n return text.split(/\\r\\n|\\r|\\n/).length;\n}\n\nfunction createTextStructureSummary(text: string, extension: string, language: string, mimeType: string): HTMLElement | null {\n if (text.length > MAX_RENDER_CHARS) {\n return null;\n }\n const items = summarizeTextStructure(text, extension, language, mimeType);\n if (items.length === 0) {\n return null;\n }\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-text-structure\";\n for (const item of items) {\n const row = document.createElement(\"span\");\n const label = document.createElement(\"span\");\n label.textContent = item.label;\n const value = document.createElement(\"strong\");\n value.textContent = item.value;\n row.append(label, value);\n summary.append(row);\n }\n return summary;\n}\n\nfunction summarizeTextStructure(\n text: string,\n extension: string,\n language: string,\n mimeType: string\n): Array<{ label: string; value: string }> {\n if (extension === \"ipynb\" || mimeType === \"application/x-ipynb+json\") {\n return summarizeNotebook(text);\n }\n if (extension === \"ndjson\" || extension === \"jsonl\" || mimeType === \"application/x-ndjson\") {\n return summarizeNdjson(text);\n }\n if (language === \"json\" || language === \"json5\") {\n return summarizeJson(text);\n }\n return [];\n}\n\nfunction summarizeJson(text: string): Array<{ label: string; value: string }> {\n try {\n const data = JSON.parse(text) as unknown;\n if (Array.isArray(data)) {\n return [\n { label: \"结构\", value: \"Array\" },\n { label: \"条目\", value: String(data.length) }\n ];\n }\n if (data && typeof data === \"object\") {\n const keys = Object.keys(data as Record<string, unknown>);\n return [\n { label: \"结构\", value: \"Object\" },\n { label: \"键\", value: String(keys.length) },\n { label: \"预览\", value: keys.slice(0, 8).join(\", \") || \"无键\" }\n ];\n }\n return [{ label: \"结构\", value: typeof data }];\n } catch {\n return [];\n }\n}\n\nfunction summarizeNotebook(text: string): Array<{ label: string; value: string }> {\n try {\n const notebook = JSON.parse(text) as {\n cells?: Array<{ cell_type?: string; source?: string | string[] }>;\n metadata?: { kernelspec?: { display_name?: string; name?: string }; language_info?: { name?: string } };\n };\n if (!Array.isArray(notebook.cells)) {\n return summarizeJson(text);\n }\n const counts = new Map<string, number>();\n for (const cell of notebook.cells) {\n const type = cell.cell_type || \"unknown\";\n counts.set(type, (counts.get(type) || 0) + 1);\n }\n const kernel = notebook.metadata?.kernelspec?.display_name || notebook.metadata?.kernelspec?.name || notebook.metadata?.language_info?.name;\n return [\n { label: \"Notebook\", value: `${notebook.cells.length} cells` },\n { label: \"类型\", value: [...counts.entries()].map(([type, count]) => `${type} ${count}`).join(\", \") || \"未知\" },\n ...(kernel ? [{ label: \"Kernel\", value: kernel }] : [])\n ];\n } catch {\n return [];\n }\n}\n\nfunction summarizeNdjson(text: string): Array<{ label: string; value: string }> {\n const lines = text.split(/\\r\\n|\\r|\\n/).filter((line) => line.trim());\n let parsed = 0;\n let objects = 0;\n let arrays = 0;\n for (const line of lines.slice(0, 1000)) {\n try {\n const value = JSON.parse(line);\n parsed++;\n if (Array.isArray(value)) {\n arrays++;\n } else if (value && typeof value === \"object\") {\n objects++;\n }\n } catch {\n // keep counting valid rows only\n }\n }\n return [\n { label: \"NDJSON\", value: `${lines.length} lines` },\n { label: \"可解析\", value: String(parsed) },\n { label: \"类型\", value: `object ${objects}, array ${arrays}` }\n ];\n}\n\nfunction createLineNumbers(lines: number): string {\n return Array.from({ length: Math.max(lines, 1) }, (_, index) => String(index + 1)).join(\"\\n\");\n}\n\nfunction formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) {\n return \"0 B\";\n }\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const units = [\"KB\", \"MB\", \"GB\"];\n let value = bytes / 1024;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex += 1;\n }\n return `${value.toFixed(value >= 10 ? 1 : 2)} ${units[unitIndex]}`;\n}\n\nasync function copyToClipboard(text: string): Promise<void> {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.setAttribute(\"readonly\", \"\");\n textarea.style.position = \"fixed\";\n textarea.style.left = \"-9999px\";\n document.body.append(textarea);\n textarea.select();\n const copied = document.execCommand?.(\"copy\");\n textarea.remove();\n if (!copied) {\n throw new Error(\"Clipboard API is not available.\");\n }\n}\n\nfunction downloadText(fileName: string, text: string): void {\n const blob = new Blob([text], { type: \"text/plain;charset=utf-8\" });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = fileName;\n document.body.append(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n}\n\nasync function readText(source: unknown): Promise<string> {\n if (typeof source === \"string\") {\n const response = await fetch(source);\n if (!response.ok) {\n throw new Error(`Failed to fetch text file: ${response.status}`);\n }\n return response.text();\n }\n if (source instanceof Blob) {\n return source.text();\n }\n if (source instanceof ArrayBuffer) {\n return new TextDecoder().decode(source);\n }\n return String(source);\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin, PreviewSize } from \"../types\";\n\ntype PdfJsModule = typeof import(\"pdfjs-dist\");\n\nexport interface PdfPluginOptions {\n pdfjs?: PdfJsModule;\n workerSrc?: string;\n}\n\n// 2D affine transform matrix multiplication helper\nfunction multiplyMatrices(m1: number[], m2: number[]): number[] {\n return [\n m1[0] * m2[0] + m1[2] * m2[1],\n m1[1] * m2[0] + m1[3] * m2[1],\n m1[0] * m2[2] + m1[2] * m2[3],\n m1[1] * m2[2] + m1[3] * m2[3],\n m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n m1[1] * m2[4] + m1[3] * m2[5] + m1[5]\n ];\n}\n\nexport function pdfPlugin(options: PdfJsModule | PdfPluginOptions = {}): PreviewPlugin {\n return {\n name: \"pdf\",\n match(file) {\n return file.mimeType === \"application/pdf\" || file.extension === \"pdf\";\n },\n async render(ctx) {\n const normalizedOptions = normalizePdfOptions(options);\n const pdf = normalizedOptions.pdfjs || (await import(\"pdfjs-dist\"));\n configurePdfWorker(pdf, normalizedOptions.workerSrc);\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n\n const viewer = document.createElement(\"div\");\n viewer.className = \"ofv-pdf-viewer\";\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-pdf-summary\";\n const scroller = document.createElement(\"div\");\n scroller.className = \"ofv-pdf ofv-pdf-pages\";\n viewer.append(summary, scroller);\n ctx.viewport.append(viewer);\n\n const documentTask = pdf.getDocument(url);\n const doc = await documentTask.promise.catch((error: unknown) => {\n viewer.remove();\n ctx.viewport.classList.add(\"ofv-center\");\n const fallback = createPdfFallback(ctx.file.name, url, normalizePdfError(error));\n ctx.viewport.append(fallback);\n return undefined;\n });\n if (!doc) {\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n documentTask.destroy?.();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n\n // Fast-extract page dimensions\n const pagesMeta: Array<{ width: number; height: number }> = [];\n for (let pageNumber = 1; pageNumber <= doc.numPages; pageNumber += 1) {\n try {\n const page = await doc.getPage(pageNumber);\n const baseViewport = page.getViewport({ scale: 1 });\n pagesMeta.push({\n width: baseViewport.width,\n height: baseViewport.height\n });\n } catch {\n pagesMeta.push({ width: 612, height: 792 });\n }\n }\n\n const pageStates: Array<{\n wrapper: HTMLDivElement;\n canvas: HTMLCanvasElement | null;\n renderTask: any | null;\n rendered: boolean;\n }> = [];\n\n let observer: IntersectionObserver | null = null;\n let currentSize = ctx.size;\n let zoomFactor = 1;\n\n const updateSummary = () => {\n renderPdfSummary(summary, doc.numPages, pagesMeta, ctx.options.fit, zoomFactor);\n };\n\n // Cancel page rendering and free canvas memory\n const clearPage = (pageIdx: number) => {\n const state = pageStates[pageIdx];\n if (!state || !state.rendered) return;\n\n if (state.renderTask) {\n try {\n state.renderTask.cancel();\n } catch (e) {\n // Ignore cancel errors\n }\n state.renderTask = null;\n }\n\n state.canvas = null;\n state.rendered = false;\n state.wrapper.replaceChildren();\n state.wrapper.append(createPageStatus(\"ofv-pdf-skeleton\", `页面 ${pageIdx + 1} 加载中...`));\n };\n\n // Perform actual on-demand rendering on canvas and build text layer\n const renderPage = async (pageIdx: number, size: PreviewSize) => {\n const state = pageStates[pageIdx];\n if (!state || state.rendered) return;\n\n state.rendered = true;\n\n try {\n const page = await doc.getPage(pageIdx + 1);\n const meta = pagesMeta[pageIdx];\n const scale =\n ctx.options.fit === \"actual\"\n ? zoomFactor\n : Math.max(0.1, Math.min(5, ((size.width - 32) / meta.width) * zoomFactor));\n \n const viewport = page.getViewport({ scale });\n\n const canvas = document.createElement(\"canvas\");\n canvas.className = \"ofv-pdf-page\";\n canvas.width = Math.floor(viewport.width);\n canvas.height = Math.floor(viewport.height);\n\n const context = canvas.getContext(\"2d\");\n if (!context) {\n throw new Error(\"Canvas 2D context is not available.\");\n }\n\n state.wrapper.replaceChildren(canvas);\n state.canvas = canvas;\n\n const renderTask = page.render({\n canvasContext: context,\n viewport\n });\n state.renderTask = renderTask;\n \n await renderTask.promise;\n state.renderTask = null;\n\n // Build absolute-positioned selectable text layer overlay\n const textContent = await page.getTextContent();\n const textLayer = document.createElement(\"div\");\n textLayer.className = \"ofv-pdf-text-layer\";\n textLayer.style.width = `${Math.floor(viewport.width)}px`;\n textLayer.style.height = `${Math.floor(viewport.height)}px`;\n state.wrapper.appendChild(textLayer);\n\n for (const item of textContent.items) {\n if (!(\"str\" in item)) continue;\n const str = (item as any).str;\n if (!str.trim()) continue;\n\n const tx = multiplyMatrices(viewport.transform, (item as any).transform);\n const fontHeight = Math.sqrt(tx[2] * tx[2] + tx[3] * tx[3]);\n\n const span = document.createElement(\"span\");\n span.textContent = str;\n span.style.fontSize = `${fontHeight}px`;\n span.style.fontFamily = (item as any).fontName || \"sans-serif\";\n span.style.left = `${tx[4]}px`;\n span.style.top = `${tx[5] - fontHeight}px`;\n span.style.transformOrigin = \"0% 0%\";\n\n textLayer.appendChild(span);\n\n // Scale text width horizontally if specified to match visual width perfectly\n if ((item as any).width) {\n const itemWidth = (item as any).width * scale;\n const actualWidth = span.offsetWidth || span.getBoundingClientRect().width;\n if (actualWidth > 0 && Math.abs(actualWidth - itemWidth) > 1) {\n span.style.transform = `scaleX(${itemWidth / actualWidth})`;\n }\n }\n }\n } catch (err) {\n console.error(`Failed to render PDF page ${pageIdx + 1}:`, err);\n state.rendered = false;\n state.wrapper.replaceChildren(createPageStatus(\"ofv-pdf-error\", \"无法渲染该页面\"));\n }\n };\n\n const renderLayout = (size: PreviewSize) => {\n observer?.disconnect();\n updateSummary();\n scroller.replaceChildren();\n pageStates.length = 0;\n\n if (typeof IntersectionObserver !== \"undefined\") {\n observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const pageIdx = parseInt(entry.target.getAttribute(\"data-page-index\") || \"0\", 10);\n const state = pageStates[pageIdx];\n if (!state) return;\n\n if (entry.isIntersecting) {\n if (!state.rendered) {\n void renderPage(pageIdx, size);\n }\n } else {\n if (state.rendered && doc.numPages > 8) {\n clearPage(pageIdx);\n }\n }\n });\n },\n {\n root: scroller,\n rootMargin: \"400px 0px 400px 0px\"\n }\n );\n }\n\n for (let i = 0; i < doc.numPages; i++) {\n const meta = pagesMeta[i];\n const scale =\n ctx.options.fit === \"actual\"\n ? zoomFactor\n : Math.max(0.1, Math.min(5, ((size.width - 32) / meta.width) * zoomFactor));\n \n const w = Math.floor(meta.width * scale);\n const h = Math.floor(meta.height * scale);\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-pdf-page-wrapper\";\n wrapper.setAttribute(\"data-page-index\", String(i));\n wrapper.style.width = `${w}px`;\n wrapper.style.height = `${h}px`;\n wrapper.append(createPageStatus(\"ofv-pdf-skeleton\", `页面 ${i + 1} 加载中...`));\n\n scroller.appendChild(wrapper);\n\n pageStates.push({\n wrapper,\n canvas: null,\n renderTask: null,\n rendered: false\n });\n\n if (observer) {\n observer.observe(wrapper);\n } else {\n void renderPage(i, size);\n }\n }\n };\n\n renderLayout(ctx.size);\n\n let resizeTimer: number | undefined;\n return {\n canCommand(command) {\n return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n },\n command(command) {\n if (command === \"zoom-in\") {\n zoomFactor = Math.min(4, zoomFactor + 0.15);\n renderLayout(currentSize);\n return true;\n }\n if (command === \"zoom-out\") {\n zoomFactor = Math.max(0.25, zoomFactor - 0.15);\n renderLayout(currentSize);\n return true;\n }\n if (command === \"zoom-reset\") {\n zoomFactor = 1;\n renderLayout(currentSize);\n return true;\n }\n return false;\n },\n resize(size) {\n currentSize = size;\n window.clearTimeout(resizeTimer);\n resizeTimer = window.setTimeout(() => {\n renderLayout(size);\n }, 120);\n },\n destroy() {\n window.clearTimeout(resizeTimer);\n observer?.disconnect();\n \n pageStates.forEach((state) => {\n if (state.renderTask) {\n try {\n state.renderTask.cancel();\n } catch (e) {\n // Ignore\n }\n }\n });\n pageStates.length = 0;\n\n revokeObjectUrl(url, isExternal);\n void doc.destroy();\n }\n };\n }\n };\n}\n\nfunction renderPdfSummary(\n summary: HTMLElement,\n pages: number,\n pagesMeta: Array<{ width: number; height: number }>,\n fit: string,\n zoomFactor: number\n): void {\n summary.replaceChildren();\n appendPdfSummary(summary, \"页数\", String(pages));\n const pageSizes = formatPdfPageSizes(pagesMeta);\n if (pageSizes) {\n appendPdfSummary(summary, \"页面尺寸\", pageSizes);\n }\n appendPdfSummary(summary, \"适配\", fit === \"actual\" ? \"原始大小\" : \"适合宽度\");\n appendPdfSummary(summary, \"缩放\", `${Math.round(zoomFactor * 100)}%`);\n}\n\nfunction appendPdfSummary(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction formatPdfPageSizes(pagesMeta: Array<{ width: number; height: number }>): string {\n const counts = new Map<string, number>();\n for (const page of pagesMeta) {\n const key = `${Math.round(page.width)} x ${Math.round(page.height)}`;\n counts.set(key, (counts.get(key) || 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 4)\n .map(([size, count]) => (count > 1 ? `${size} (${count})` : size))\n .join(\", \");\n}\n\nfunction normalizePdfOptions(options: PdfJsModule | PdfPluginOptions): PdfPluginOptions {\n if (\"getDocument\" in options) {\n return { pdfjs: options };\n }\n return options;\n}\n\nfunction createPageStatus(className: string, text: string): HTMLDivElement {\n const status = document.createElement(\"div\");\n status.className = className;\n status.textContent = text;\n return status;\n}\n\nfunction createPdfFallback(fileName: string, url: string, message: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"PDF 预览失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = `${message} ${fileName}`;\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载 PDF\";\n\n fallback.append(title, meta, download);\n return fallback;\n}\n\nfunction normalizePdfError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error || \"\");\n const name = typeof error === \"object\" && error !== null && \"name\" in error ? String((error as { name?: unknown }).name) : \"\";\n const lower = `${name} ${message}`.toLowerCase();\n if (lower.includes(\"password\")) {\n return \"该 PDF 受密码保护,当前无法在浏览器内直接预览。\";\n }\n if (lower.includes(\"invalid\") || lower.includes(\"missing\") || lower.includes(\"corrupt\")) {\n return \"该 PDF 文件可能已损坏或格式无效。\";\n }\n return \"当前浏览器无法加载该 PDF。\";\n}\n\nfunction configurePdfWorker(pdf: PdfJsModule, workerSrc?: string): void {\n if (workerSrc) {\n pdf.GlobalWorkerOptions.workerSrc = workerSrc;\n return;\n }\n\n if (!pdf.GlobalWorkerOptions.workerSrc && typeof window !== \"undefined\") {\n pdf.GlobalWorkerOptions.workerSrc = `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdf.version}/build/pdf.worker.mjs`;\n }\n}\n","import JSZip from \"jszip\";\nimport DOMPurify from \"dompurify\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer } from \"./utils\";\n\nconst epubMimeTypes = new Set([\"application/epub+zip\", \"application/x-epub+zip\"]);\n\ntype EpubManifestItem = {\n id: string;\n href: string;\n mediaType: string;\n properties: string;\n};\n\ntype EpubMetadata = {\n title: string;\n creator: string;\n language: string;\n identifier: string;\n publisher: string;\n modified: string;\n};\n\ntype EpubStructureSummary = {\n manifestItems: number;\n spineItems: number;\n chapters: number;\n images: number;\n styles: number;\n fonts: number;\n audio: number;\n video: number;\n navItems: number;\n tocItems: number;\n coverItems: number;\n otherItems: number;\n missingSpineItems: number;\n};\n\nexport function epubPlugin(): PreviewPlugin {\n return {\n name: \"epub\",\n match(file) {\n return file.extension === \"epub\" || epubMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-epub\");\n ctx.viewport.append(panel);\n\n try {\n const zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n await renderEpub(panel, zip);\n } catch (error) {\n renderEpubFallback(panel, error);\n }\n\n return {\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\nasync function renderEpub(panel: HTMLElement, zip: JSZip): Promise<void> {\n const opfPath = await resolvePackagePath(zip);\n const opfText = await zip.file(opfPath)?.async(\"text\");\n if (!opfText) {\n throw new Error(\"EPUB 缺少 OPF package 文件。\");\n }\n\n const opf = parseXml(opfText, \"EPUB package 文件解析失败。\");\n const basePath = directoryName(opfPath);\n const manifest = readManifest(opf);\n const spine = readSpine(opf, manifest);\n const metadata = readMetadata(opf);\n const structure = summarizeEpubStructure(opf, manifest, spine);\n const assets = await readEpubAssets(zip, basePath, manifest);\n\n const summary = createSection(\"EPUB 图书信息\");\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-epub-meta\";\n appendMeta(meta, \"标题\", metadata.title || \"未命名 EPUB\");\n appendMeta(meta, \"作者\", metadata.creator || \"未知\");\n appendMeta(meta, \"语言\", metadata.language || \"未声明\");\n if (metadata.publisher) {\n appendMeta(meta, \"出版方\", metadata.publisher);\n }\n if (metadata.identifier) {\n appendMeta(meta, \"标识\", metadata.identifier);\n }\n if (metadata.modified) {\n appendMeta(meta, \"修改时间\", metadata.modified);\n }\n appendMeta(meta, \"章节\", spine.length || \"未解析到阅读顺序\");\n appendMeta(meta, \"Manifest\", structure.manifestItems);\n appendMeta(meta, \"Spine\", structure.spineItems);\n appendMeta(meta, \"导航\", structure.navItems + structure.tocItems);\n appendMeta(meta, \"封面\", structure.coverItems);\n appendMeta(meta, \"图片\", structure.images);\n appendMeta(meta, \"样式\", structure.styles);\n appendMeta(meta, \"字体\", structure.fonts);\n if (structure.audio || structure.video) {\n appendMeta(meta, \"音视频\", `${structure.audio} / ${structure.video}`);\n }\n if (structure.otherItems) {\n appendMeta(meta, \"其他资源\", structure.otherItems);\n }\n if (structure.missingSpineItems) {\n appendMeta(meta, \"缺失章节引用\", structure.missingSpineItems);\n }\n summary.append(meta);\n panel.append(summary);\n\n const chapters = createSection(\"EPUB 正文预览\");\n const article = document.createElement(\"article\");\n article.className = \"ofv-epub-reader\";\n\n if (spine.length === 0) {\n const empty = document.createElement(\"p\");\n empty.textContent = \"未解析到可展示章节。\";\n article.append(empty);\n } else {\n for (const [index, item] of spine.slice(0, 40).entries()) {\n const chapterPath = joinZipPath(basePath, item.href);\n const chapterText = await zip.file(chapterPath)?.async(\"text\");\n if (!chapterText) {\n continue;\n }\n const section = document.createElement(\"section\");\n section.className = \"ofv-epub-chapter\";\n const heading = document.createElement(\"h3\");\n heading.textContent = chapterTitle(chapterText) || `章节 ${index + 1}`;\n const content = document.createElement(\"div\");\n content.className = \"ofv-epub-content\";\n content.innerHTML = sanitizeChapterHtml(rewriteAssetReferences(chapterText, assets, directoryName(chapterPath)));\n section.append(heading, content);\n article.append(section);\n }\n }\n\n chapters.append(article);\n panel.append(chapters);\n}\n\nasync function resolvePackagePath(zip: JSZip): Promise<string> {\n const containerXml = await zip.file(\"META-INF/container.xml\")?.async(\"text\");\n if (containerXml) {\n const container = parseXml(containerXml, \"EPUB container.xml 解析失败。\");\n const rootfile = Array.from(container.getElementsByTagName(\"*\")).find(\n (element) => element.localName === \"rootfile\" && getXmlAttribute(element, \"full-path\")\n );\n const fullPath = rootfile ? getXmlAttribute(rootfile, \"full-path\") : null;\n if (fullPath && zip.file(fullPath)) {\n return fullPath;\n }\n }\n\n const fallback = Object.values(zip.files).find((entry) => !entry.dir && entry.name.endsWith(\".opf\"));\n if (!fallback) {\n throw new Error(\"EPUB 未找到 package OPF 文件。\");\n }\n return fallback.name;\n}\n\nfunction readManifest(opf: Document): Map<string, EpubManifestItem> {\n const manifest = new Map<string, EpubManifestItem>();\n for (const item of Array.from(opf.getElementsByTagName(\"*\")).filter((element) => element.localName === \"item\")) {\n const id = getXmlAttribute(item, \"id\");\n const href = getXmlAttribute(item, \"href\");\n if (!id || !href) {\n continue;\n }\n manifest.set(id, {\n id,\n href,\n mediaType: getXmlAttribute(item, \"media-type\") || \"\",\n properties: getXmlAttribute(item, \"properties\") || \"\"\n });\n }\n return manifest;\n}\n\nfunction readSpine(opf: Document, manifest: Map<string, EpubManifestItem>): EpubManifestItem[] {\n const items: EpubManifestItem[] = [];\n for (const itemref of Array.from(opf.getElementsByTagName(\"*\")).filter((element) => element.localName === \"itemref\")) {\n const idref = getXmlAttribute(itemref, \"idref\");\n const item = idref ? manifest.get(idref) : undefined;\n if (item && isChapterMediaType(item.mediaType)) {\n items.push(item);\n }\n }\n if (items.length > 0) {\n return items;\n }\n return Array.from(manifest.values()).filter((item) => isChapterMediaType(item.mediaType));\n}\n\nfunction readMetadata(opf: Document): EpubMetadata {\n return {\n title: textByLocalName(opf, \"title\"),\n creator: textByLocalName(opf, \"creator\"),\n language: textByLocalName(opf, \"language\"),\n identifier: textByLocalName(opf, \"identifier\"),\n publisher: textByLocalName(opf, \"publisher\"),\n modified: metaPropertyText(opf, \"dcterms:modified\")\n };\n}\n\nfunction summarizeEpubStructure(opf: Document, manifest: Map<string, EpubManifestItem>, spine: EpubManifestItem[]): EpubStructureSummary {\n const items = Array.from(manifest.values());\n const chapters = spine.length;\n const images = items.filter((item) => item.mediaType.startsWith(\"image/\")).length;\n const styles = items.filter((item) => item.mediaType === \"text/css\").length;\n const fonts = items.filter((item) => item.mediaType.startsWith(\"font/\") || /font|opentype|truetype/i.test(item.mediaType)).length;\n const audio = items.filter((item) => item.mediaType.startsWith(\"audio/\")).length;\n const video = items.filter((item) => item.mediaType.startsWith(\"video/\")).length;\n const navItems = items.filter((item) => propertyTokens(item.properties).has(\"nav\")).length;\n const tocItems = items.filter((item) => item.mediaType === \"application/x-dtbncx+xml\" || propertyTokens(item.properties).has(\"toc\")).length;\n const coverItems = items.filter((item) => item.id.toLowerCase().includes(\"cover\") || propertyTokens(item.properties).has(\"cover-image\")).length;\n const otherItems = items.filter((item) => !isKnownEpubResource(item)).length;\n return {\n manifestItems: items.length,\n spineItems: spine.length,\n chapters,\n images,\n styles,\n fonts,\n audio,\n video,\n navItems,\n tocItems,\n coverItems,\n otherItems,\n missingSpineItems: Math.max(0, readSpineRefCount(opf) - spine.length)\n };\n}\n\nfunction isKnownEpubResource(item: EpubManifestItem): boolean {\n const properties = propertyTokens(item.properties);\n return (\n isChapterMediaType(item.mediaType) ||\n item.mediaType.startsWith(\"image/\") ||\n item.mediaType === \"text/css\" ||\n item.mediaType.startsWith(\"font/\") ||\n /font|opentype|truetype/i.test(item.mediaType) ||\n item.mediaType.startsWith(\"audio/\") ||\n item.mediaType.startsWith(\"video/\") ||\n item.mediaType === \"application/x-dtbncx+xml\" ||\n properties.has(\"nav\") ||\n properties.has(\"toc\")\n );\n}\n\nasync function readEpubAssets(\n zip: JSZip,\n basePath: string,\n manifest: Map<string, EpubManifestItem>\n): Promise<Map<string, string>> {\n const assets = new Map<string, string>();\n for (const item of manifest.values()) {\n if (!item.mediaType.startsWith(\"image/\")) {\n continue;\n }\n const path = joinZipPath(basePath, item.href);\n const entry = zip.file(path);\n if (!entry) {\n continue;\n }\n assets.set(path, `data:${item.mediaType};base64,${await entry.async(\"base64\")}`);\n }\n return assets;\n}\n\nfunction rewriteAssetReferences(html: string, assets: Map<string, string>, chapterDir: string): string {\n const documentHtml = new DOMParser().parseFromString(html, \"text/html\");\n for (const image of Array.from(documentHtml.querySelectorAll<HTMLImageElement>(\"img[src], image[href], image[xlink\\\\:href]\"))) {\n const raw = image.getAttribute(\"src\") || image.getAttribute(\"href\") || image.getAttribute(\"xlink:href\") || \"\";\n const path = joinZipPath(chapterDir, raw.split(\"#\")[0] || raw);\n const src = assets.get(path);\n if (!src) {\n continue;\n }\n image.setAttribute(\"src\", src);\n image.setAttribute(\"href\", src);\n image.setAttribute(\"xlink:href\", src);\n }\n return documentHtml.body.innerHTML;\n}\n\nfunction sanitizeChapterHtml(html: string): string {\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true, svg: true, svgFilters: false },\n ADD_ATTR: [\"target\", \"xlink:href\"]\n });\n}\n\nfunction chapterTitle(html: string): string {\n const documentHtml = new DOMParser().parseFromString(html, \"text/html\");\n const heading = documentHtml.querySelector(\"h1, h2, h3, title\");\n return heading?.textContent?.trim() || \"\";\n}\n\nfunction renderEpubFallback(panel: HTMLElement, error: unknown): void {\n panel.replaceChildren();\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = \"EPUB 解析失败\";\n const meta = document.createElement(\"span\");\n meta.textContent = error instanceof Error ? error.message : \"文件可能已损坏,或不是有效的 EPUB。\";\n fallback.append(title, meta);\n panel.append(fallback);\n}\n\nfunction parseXml(xml: string, message: string): Document {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n throw new Error(message);\n }\n return doc;\n}\n\nfunction appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nfunction textByLocalName(doc: Document, localName: string): string {\n return (\n Array.from(doc.getElementsByTagName(\"*\"))\n .find((element) => element.localName === localName)\n ?.textContent?.trim() || \"\"\n );\n}\n\nfunction metaPropertyText(doc: Document, property: string): string {\n return (\n Array.from(doc.getElementsByTagName(\"*\"))\n .find((element) => element.localName === \"meta\" && getXmlAttribute(element, \"property\") === property)\n ?.textContent?.trim() || \"\"\n );\n}\n\nfunction propertyTokens(value: string): Set<string> {\n return new Set(value.split(/\\s+/).map((item) => item.trim()).filter(Boolean));\n}\n\nfunction readSpineRefCount(opf: Document): number {\n return Array.from(opf.getElementsByTagName(\"*\")).filter((element) => element.localName === \"itemref\").length;\n}\n\nfunction getXmlAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction isChapterMediaType(mediaType: string): boolean {\n return mediaType === \"application/xhtml+xml\" || mediaType === \"text/html\" || mediaType === \"application/xml\";\n}\n\nfunction directoryName(path: string): string {\n const index = path.lastIndexOf(\"/\");\n return index >= 0 ? path.slice(0, index + 1) : \"\";\n}\n\nfunction joinZipPath(basePath: string, path: string): string {\n const parts = `${basePath}${path}`.split(\"/\");\n const normalized: string[] = [];\n for (const part of parts) {\n if (!part || part === \".\") {\n continue;\n }\n if (part === \"..\") {\n normalized.pop();\n } else {\n normalized.push(part);\n }\n }\n return normalized.join(\"/\");\n}\n","import type { PreviewFile } from \"../types\";\n\nexport async function readArrayBuffer(file: PreviewFile): Promise<ArrayBuffer> {\n if (file.source instanceof ArrayBuffer) {\n return file.source;\n }\n if (file.blob) {\n return file.blob.arrayBuffer();\n }\n if (typeof file.source === \"string\") {\n const response = await fetch(file.source);\n if (!response.ok) {\n throw new Error(`Failed to fetch file: ${response.status}`);\n }\n return response.arrayBuffer();\n }\n throw new Error(\"Unsupported file source.\");\n}\n\nexport async function readTextFile(file: PreviewFile): Promise<string> {\n if (typeof file.source === \"string\") {\n const response = await fetch(file.source);\n if (!response.ok) {\n throw new Error(`Failed to fetch text file: ${response.status}`);\n }\n return response.text();\n }\n if (file.blob) {\n return file.blob.text();\n }\n if (file.source instanceof ArrayBuffer) {\n return new TextDecoder().decode(file.source);\n }\n return String(file.source);\n}\n\nexport function createPanel(className = \"\"): HTMLElement {\n const panel = document.createElement(\"div\");\n panel.className = `ofv-panel ${className}`.trim();\n return panel;\n}\n\nexport function createSection(title: string): HTMLElement {\n const section = document.createElement(\"section\");\n section.className = \"ofv-section\";\n const heading = document.createElement(\"h3\");\n heading.textContent = title;\n section.append(heading);\n return section;\n}\n\nexport function appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nexport function escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n\nexport function bytesToText(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes);\n}\n\nexport function resolveFormat(\n file: Pick<PreviewFile, \"extension\" | \"mimeType\">,\n mimeMap: Record<string, string>\n): string {\n return file.extension || mimeMap[file.mimeType] || \"\";\n}\n","import JSZip from \"jszip\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer } from \"./utils\";\n\nconst xpsMimeTypes = new Set([\n \"application/oxps\",\n \"application/vnd.ms-xpsdocument\"\n]);\n\nexport function xpsPlugin(): PreviewPlugin {\n return {\n name: \"xps\",\n match(file) {\n return file.extension === \"xps\" || file.extension === \"oxps\" || xpsMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-xps\");\n ctx.viewport.append(panel);\n\n try {\n const zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n await renderXps(panel, zip);\n } catch (error) {\n renderXpsFallback(panel, error);\n }\n\n return {\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\nasync function renderXps(panel: HTMLElement, zip: JSZip): Promise<void> {\n const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n const fixedPages = entries\n .filter((entry) => /(?:^|\\/)Pages\\/[^/]+\\.fpage$/i.test(entry.name) || entry.name.endsWith(\".fpage\"))\n .sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true }));\n const resourceEntries = entries.filter((entry) => /\\.(?:png|jpe?g|tiff?|wdp|bmp|gif|odttf|ttf)$/i.test(entry.name));\n const pagePreviews = await Promise.all(\n fixedPages.slice(0, 80).map(async (entry, index) => {\n const xml = await entry.async(\"text\");\n return {\n entry,\n index,\n xml,\n info: parseXpsPageInfo(xml)\n };\n })\n );\n\n const summary = createSection(\"XPS 基础预览\");\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 XPS/OXPS 包内 FixedPage 文本、页面顺序和资源结构。完整版式渲染可后续接入专用渲染器。\";\n summary.append(note);\n summary.append(createXpsSummary(entries, fixedPages, resourceEntries, pagePreviews.map((page) => page.info)));\n panel.append(summary);\n\n const pages = createSection(`页面文本 ${fixedPages.length}`);\n const reader = document.createElement(\"div\");\n reader.className = \"ofv-xps-pages\";\n\n if (fixedPages.length === 0) {\n const empty = document.createElement(\"p\");\n empty.textContent = \"未解析到 FixedPage 页面。\";\n reader.append(empty);\n } else {\n for (const page of pagePreviews) {\n reader.append(renderXpsPage(page.xml, page.entry.name, page.index));\n }\n }\n pages.append(reader);\n panel.append(pages);\n\n const structure = createSection(`文件结构 ${entries.length}`);\n const list = document.createElement(\"ul\");\n for (const entry of entries.slice(0, 240)) {\n const item = document.createElement(\"li\");\n item.textContent = entry.name;\n list.append(item);\n }\n structure.append(list);\n panel.append(structure);\n}\n\ntype XpsPageInfo = {\n width?: number;\n height?: number;\n glyphs: number;\n imageBrushes: number;\n canvases: number;\n paths: number;\n};\n\nfunction createXpsSummary(\n entries: JSZip.JSZipObject[],\n fixedPages: JSZip.JSZipObject[],\n resourceEntries: JSZip.JSZipObject[],\n pageInfos: XpsPageInfo[]\n): HTMLElement {\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-xps-meta ofv-xps-summary\";\n appendMeta(meta, \"页面\", fixedPages.length);\n appendMeta(meta, \"文件\", entries.length);\n appendMeta(meta, \"FixedDocument\", entries.filter((entry) => /\\.fdoc$/i.test(entry.name)).length);\n appendMeta(meta, \"FixedDocSeq\", entries.filter((entry) => /\\.fdseq$/i.test(entry.name)).length);\n appendMeta(meta, \"关系文件\", entries.filter((entry) => /(?:^|\\/)_rels\\/[^/]+\\.rels$/i.test(entry.name) || entry.name.endsWith(\".rels\")).length);\n appendMeta(meta, \"资源\", resourceEntries.length);\n appendMeta(meta, \"图片资源\", resourceEntries.filter((entry) => /\\.(?:png|jpe?g|tiff?|wdp|bmp|gif)$/i.test(entry.name)).length);\n appendMeta(meta, \"字体资源\", resourceEntries.filter((entry) => /\\.(?:odttf|ttf)$/i.test(entry.name)).length);\n const glyphs = pageInfos.reduce((count, page) => count + page.glyphs, 0);\n appendMeta(meta, \"Glyphs\", glyphs);\n const pageSizes = formatXpsPageSizes(pageInfos);\n if (pageSizes) {\n appendMeta(meta, \"页面尺寸\", pageSizes);\n }\n const pageObjects = formatXpsPageObjects(pageInfos);\n if (pageObjects) {\n appendMeta(meta, \"页面对象\", pageObjects);\n }\n return meta;\n}\n\nfunction parseXpsPageInfo(xml: string): XpsPageInfo {\n const fallback = parseXpsPageInfoByRegex(xml);\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return fallback;\n }\n const root = doc.documentElement;\n const elements = Array.from(doc.getElementsByTagName(\"*\"));\n return {\n width: finiteNumber(getXmlAttribute(root, \"Width\"), fallback.width),\n height: finiteNumber(getXmlAttribute(root, \"Height\"), fallback.height),\n glyphs: elements.filter((element) => element.localName === \"Glyphs\").length,\n imageBrushes: elements.filter((element) => element.localName === \"ImageBrush\").length,\n canvases: elements.filter((element) => element.localName === \"Canvas\").length,\n paths: elements.filter((element) => element.localName === \"Path\").length\n };\n}\n\nfunction parseXpsPageInfoByRegex(xml: string): XpsPageInfo {\n return {\n width: finiteNumber(firstAttributeValue(xml, \"Width\"), undefined),\n height: finiteNumber(firstAttributeValue(xml, \"Height\"), undefined),\n glyphs: countMatches(xml, /<[\\w:.-]*Glyphs\\b/g),\n imageBrushes: countMatches(xml, /<[\\w:.-]*ImageBrush\\b/g),\n canvases: countMatches(xml, /<[\\w:.-]*Canvas\\b/g),\n paths: countMatches(xml, /<[\\w:.-]*Path\\b/g)\n };\n}\n\nfunction formatXpsPageSizes(pageInfos: XpsPageInfo[]): string {\n const counts = new Map<string, number>();\n for (const page of pageInfos) {\n if (!Number.isFinite(page.width) || !Number.isFinite(page.height)) {\n continue;\n }\n const key = `${Math.round(page.width as number)} x ${Math.round(page.height as number)}`;\n counts.set(key, (counts.get(key) || 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 4)\n .map(([size, count]) => (count > 1 ? `${size} (${count})` : size))\n .join(\", \");\n}\n\nfunction formatXpsPageObjects(pageInfos: XpsPageInfo[]): string {\n const totals = pageInfos.reduce(\n (result, page) => ({\n imageBrushes: result.imageBrushes + page.imageBrushes,\n canvases: result.canvases + page.canvases,\n paths: result.paths + page.paths\n }),\n { imageBrushes: 0, canvases: 0, paths: 0 }\n );\n return [\n totals.imageBrushes ? `ImageBrush ${totals.imageBrushes}` : \"\",\n totals.canvases ? `Canvas ${totals.canvases}` : \"\",\n totals.paths ? `Path ${totals.paths}` : \"\"\n ].filter(Boolean).join(\", \");\n}\n\nfunction renderXpsPage(xml: string, path: string, index: number): HTMLElement {\n const page = document.createElement(\"article\");\n page.className = \"ofv-xps-page\";\n const heading = document.createElement(\"h4\");\n heading.textContent = `Page ${index + 1}`;\n const pathMeta = document.createElement(\"span\");\n pathMeta.textContent = path;\n\n const text = document.createElement(\"div\");\n text.className = \"ofv-xps-text\";\n const fragments = extractXpsText(xml);\n if (fragments.length > 0) {\n for (const fragment of fragments) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = fragment;\n text.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"这一页未提取到 Glyphs 文本。\";\n text.append(empty);\n }\n\n page.append(heading, pathMeta, text);\n return page;\n}\n\nfunction extractXpsText(xml: string): string[] {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return extractXpsTextByRegex(xml);\n }\n return Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"Glyphs\")\n .map((glyph) => getXmlAttribute(glyph, \"UnicodeString\") || \"\")\n .map((value) => value.replace(/\\s+/g, \" \").trim())\n .filter(Boolean);\n}\n\nfunction extractXpsTextByRegex(xml: string): string[] {\n return [...xml.matchAll(/\\bUnicodeString=(?:\"([^\"]*)\"|'([^']*)')/g)]\n .map((match) => decodeXml(match[1] || match[2] || \"\"))\n .map((value) => value.replace(/\\s+/g, \" \").trim())\n .filter(Boolean);\n}\n\nfunction firstAttributeValue(xml: string, name: string): string | undefined {\n const match = xml.match(new RegExp(`\\\\b${name}=(?:\"([^\"]*)\"|'([^']*)')`));\n return match?.[1] || match?.[2];\n}\n\nfunction countMatches(value: string, pattern: RegExp): number {\n return [...value.matchAll(pattern)].length;\n}\n\nfunction renderXpsFallback(panel: HTMLElement, error: unknown): void {\n panel.replaceChildren();\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = \"XPS 解析失败\";\n const meta = document.createElement(\"span\");\n meta.textContent = error instanceof Error ? error.message : \"文件可能已损坏,或不是有效的 XPS/OXPS 包。\";\n fallback.append(title, meta);\n panel.append(fallback);\n}\n\nfunction appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nfunction getXmlAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction finiteNumber(value: unknown, fallback: number | undefined): number | undefined {\n const parsed = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction decodeXml(value: string): string {\n return value\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll(\"&\", \"&\")\n .replaceAll(\""\", '\"')\n .replaceAll(\"'\", \"'\");\n}\n","import JSZip from \"jszip\";\nimport DOMPurify from \"dompurify\";\nimport type { WorkBook } from \"xlsx\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst wordExtensions = new Set([\"docx\", \"docm\", \"doc\", \"dotx\", \"dotm\", \"dot\", \"rtf\", \"odt\", \"fodt\", \"wps\"]);\nconst sheetExtensions = new Set([\"xlsx\", \"xls\", \"xlsm\", \"xlsb\", \"xlt\", \"xltx\", \"xltm\", \"csv\", \"tsv\", \"ods\", \"fods\", \"numbers\", \"et\"]);\nconst presentationExtensions = new Set([\"pptx\", \"pptm\", \"ppt\", \"pps\", \"ppsx\", \"ppsm\", \"potx\", \"potm\", \"odp\", \"fodp\", \"key\", \"dps\"]);\nconst packagedOfficeCandidates = new Set([\"wps\", \"et\", \"dps\", \"numbers\", \"key\"]);\nconst SHEET_WINDOW_ROWS = 200;\nconst SHEET_WINDOW_COLUMNS = 80;\nconst PPTX_REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst officeMimeTypes = new Set([\n \"application/msword\",\n \"application/rtf\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/vnd.ms-word.document.macroenabled.12\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\",\n \"application/vnd.ms-word.template.macroenabled.12\",\n \"application/vnd.oasis.opendocument.text\",\n \"application/vnd.oasis.opendocument.text-flat-xml\",\n \"application/vnd.ms-works\",\n \"application/vnd.ms-excel\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\",\n \"application/vnd.ms-excel.sheet.macroenabled.12\",\n \"application/vnd.ms-excel.sheet.binary.macroenabled.12\",\n \"application/vnd.ms-excel.template.macroenabled.12\",\n \"application/vnd.oasis.opendocument.spreadsheet\",\n \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\",\n \"application/vnd.apple.numbers\",\n \"application/vnd.ms-powerpoint\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \"application/vnd.ms-powerpoint.presentation.macroenabled.12\",\n \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\",\n \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\",\n \"application/vnd.openxmlformats-officedocument.presentationml.template\",\n \"application/vnd.ms-powerpoint.template.macroenabled.12\",\n \"application/vnd.oasis.opendocument.presentation\",\n \"application/vnd.oasis.opendocument.presentation-flat-xml\",\n \"application/vnd.apple.keynote\"\n]);\nconst officeMimeFormatMap: Record<string, string> = {\n \"application/msword\": \"doc\",\n \"application/rtf\": \"rtf\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": \"docx\",\n \"application/vnd.ms-word.document.macroenabled.12\": \"docm\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\": \"dotx\",\n \"application/vnd.ms-word.template.macroenabled.12\": \"dotm\",\n \"application/vnd.oasis.opendocument.text\": \"odt\",\n \"application/vnd.oasis.opendocument.text-flat-xml\": \"fodt\",\n \"application/vnd.ms-works\": \"wps\",\n \"application/vnd.ms-excel\": \"xls\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\": \"xltx\",\n \"application/vnd.ms-excel.sheet.macroenabled.12\": \"xlsm\",\n \"application/vnd.ms-excel.sheet.binary.macroenabled.12\": \"xlsb\",\n \"application/vnd.ms-excel.template.macroenabled.12\": \"xltm\",\n \"application/vnd.oasis.opendocument.spreadsheet\": \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\": \"fods\",\n \"application/vnd.apple.numbers\": \"numbers\",\n \"application/vnd.ms-powerpoint\": \"ppt\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\": \"pptx\",\n \"application/vnd.ms-powerpoint.presentation.macroenabled.12\": \"pptm\",\n \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\": \"ppsx\",\n \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\": \"ppsm\",\n \"application/vnd.openxmlformats-officedocument.presentationml.template\": \"potx\",\n \"application/vnd.ms-powerpoint.template.macroenabled.12\": \"potm\",\n \"application/vnd.oasis.opendocument.presentation\": \"odp\",\n \"application/vnd.oasis.opendocument.presentation-flat-xml\": \"fodp\",\n \"application/vnd.apple.keynote\": \"key\"\n};\n\ntype PresentationSlideInsight = {\n title: string;\n layout?: string;\n textCount: number;\n imageCount: number;\n notesCount: number;\n hasTransition: boolean;\n animationCount: number;\n sampleTexts: string[];\n};\n\ntype PresentationInsight = {\n title: string;\n slideCount: number;\n imageCount: number;\n notesCount: number;\n transitionCount: number;\n animationCount: number;\n layouts: string[];\n slides: PresentationSlideInsight[];\n};\n\ntype IWorkMetadata = {\n title?: string;\n author?: string;\n company?: string;\n subject?: string;\n keywords?: string[];\n created?: string;\n modified?: string;\n};\n\nexport function officePlugin(): PreviewPlugin {\n return {\n name: \"office\",\n match(file) {\n return (\n wordExtensions.has(file.extension) ||\n sheetExtensions.has(file.extension) ||\n presentationExtensions.has(file.extension) ||\n officeMimeTypes.has(file.mimeType)\n );\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-office\");\n ctx.viewport.append(panel);\n const extension = resolveFormat(ctx.file, officeMimeFormatMap);\n const arrayBuffer = await readArrayBuffer(ctx.file);\n\n if (fileIsDocx(extension)) {\n await renderDocx(panel, arrayBuffer);\n } else if (extension === \"rtf\") {\n renderPlainDocument(panel, \"RTF 文档\", rtfToText(await readTextFromBuffer(arrayBuffer)));\n } else if (extension === \"odt\") {\n await renderOdt(panel, arrayBuffer);\n } else if (extension === \"fodt\") {\n renderOpenDocumentXml(panel, \"FODT 文档\", await readTextFromBuffer(arrayBuffer));\n } else if (extension === \"fods\") {\n renderFlatOds(panel, await readTextFromBuffer(arrayBuffer));\n } else if (packagedOfficeCandidates.has(extension) && (await renderPackagedOfficePreview(panel, arrayBuffer, extension))) {\n // Rendered by package sniffing.\n } else if (sheetExtensions.has(extension)) {\n await renderSheet(panel, arrayBuffer, extension);\n } else if ([\"pptx\", \"pptm\", \"ppsx\", \"ppsm\", \"potx\", \"potm\"].includes(extension)) {\n await renderPptx(panel, arrayBuffer);\n } else if (extension === \"odp\") {\n await renderOdp(panel, arrayBuffer);\n } else if (extension === \"fodp\") {\n renderOpenDocumentPresentationXml(panel, await readTextFromBuffer(arrayBuffer));\n } else if (isLegacyOfficeBinary(extension)) {\n renderLegacyOfficeBinary(panel, extension, arrayBuffer);\n } else {\n renderUnsupportedOffice(panel, extension || ctx.file.extension || \"office\");\n }\n\n return {\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction fileIsDocx(extension: string): boolean {\n return extension === \"docx\" || extension === \"docm\" || extension === \"dotx\" || extension === \"dotm\";\n}\n\nasync function renderDocx(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const section = createSection(\"Word 文档\");\n const content = document.createElement(\"div\");\n content.className = \"ofv-docx-document\";\n section.append(content);\n panel.append(section);\n\n try {\n const docxPreview = await import(\"docx-preview\");\n await docxPreview.renderAsync(arrayBuffer, content, content, {\n className: \"ofv-docx\",\n inWrapper: true,\n breakPages: true,\n ignoreWidth: false,\n ignoreHeight: false,\n ignoreFonts: false,\n renderHeaders: true,\n renderFooters: true,\n renderFootnotes: true,\n renderEndnotes: true,\n renderComments: true,\n renderAltChunks: true,\n experimental: true,\n useBase64URL: true\n });\n } catch (error) {\n content.replaceChildren();\n const fallbackNote = document.createElement(\"div\");\n fallbackNote.className = \"ofv-docx-fallback-note\";\n fallbackNote.textContent = \"高保真 DOCX 渲染失败,已切换为基础内容预览。\";\n content.append(fallbackNote);\n try {\n await renderDocxWithMammoth(content, arrayBuffer);\n } catch (fallbackError) {\n await renderDocxTextFallback(content, arrayBuffer);\n console.warn(\"DOCX content fallback failed, used raw OpenXML text extraction:\", fallbackError);\n }\n console.warn(\"DOCX layout preview failed, fell back to Mammoth:\", error);\n }\n\n}\n\nasync function renderDocxTextFallback(container: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const article = document.createElement(\"article\");\n article.className = \"ofv-document\";\n\n try {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const documentXml = await zip.file(\"word/document.xml\")?.async(\"text\");\n const paragraphs = documentXml ? extractWordParagraphs(documentXml) : [];\n if (paragraphs.length > 0) {\n for (const paragraphText of paragraphs) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = paragraphText;\n article.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"DOCX 内容解析失败,未提取到可展示文本。\";\n article.append(empty);\n }\n } catch {\n const empty = document.createElement(\"p\");\n empty.textContent = \"DOCX 内容解析失败,文件可能已损坏或不是有效的 DOCX。\";\n article.append(empty);\n }\n\n container.append(article);\n}\n\nasync function renderDocxWithMammoth(container: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const mammoth = await import(\"mammoth\");\n const result = await mammoth.convertToHtml(\n { arrayBuffer },\n {\n convertImage: mammoth.images.imgElement(async (image) => ({\n src: `data:${image.contentType};base64,${await image.read(\"base64\")}`\n }))\n }\n );\n const content = document.createElement(\"article\");\n content.className = \"ofv-document\";\n content.innerHTML = sanitizeHtml(result.value || \"<p>未解析到可展示内容。</p>\");\n container.append(content);\n\n if (result.messages.length > 0) {\n const notes = document.createElement(\"details\");\n notes.className = \"ofv-details\";\n const summary = document.createElement(\"summary\");\n summary.textContent = `解析提示 ${result.messages.length}`;\n const list = document.createElement(\"ul\");\n for (const message of result.messages) {\n const item = document.createElement(\"li\");\n item.textContent = message.message;\n list.append(item);\n }\n notes.append(summary, list);\n container.append(notes);\n }\n}\n\nasync function renderOdt(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const content = zip.file(\"content.xml\");\n if (!content) {\n renderPlainDocument(panel, \"ODT 文档\", \"未找到 content.xml。\");\n return;\n }\n renderOpenDocumentXml(panel, \"ODT 文档\", await content.async(\"text\"));\n}\n\nfunction renderOpenDocumentXml(panel: HTMLElement, title: string, xml: string): void {\n const section = createSection(title);\n const article = document.createElement(\"article\");\n article.className = \"ofv-document\";\n const blocks = extractOpenDocumentBlocks(xml);\n if (blocks.length > 0) {\n for (const block of blocks) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = block;\n article.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"未提取到可展示文本。\";\n article.append(empty);\n }\n section.append(article);\n panel.append(section);\n}\n\nfunction renderPlainDocument(panel: HTMLElement, title: string, text: string): void {\n const section = createSection(title);\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = text || \"未提取到可展示文本。\";\n section.append(pre);\n panel.append(section);\n}\n\nasync function renderSheet(\n panel: HTMLElement,\n arrayBuffer: ArrayBuffer,\n extension: string\n): Promise<void> {\n const xlsx = await import(\"xlsx\");\n let workbook: WorkBook;\n try {\n workbook = xlsx.read(arrayBuffer, { type: \"array\" }) as WorkBook;\n } catch (error) {\n if (isLegacyOfficeBinary(extension)) {\n renderLegacyOfficeBinary(panel, extension, arrayBuffer, normalizeOfficeError(error));\n return;\n }\n renderSheetFallback(panel, extension, normalizeOfficeError(error));\n return;\n }\n const chartPreviews = await readWorkbookCharts(arrayBuffer).catch(() => []);\n const tabs = document.createElement(\"div\");\n tabs.className = \"ofv-tabs\";\n tabs.setAttribute(\"role\", \"tablist\");\n const content = document.createElement(\"div\");\n content.className = \"ofv-sheet\";\n content.setAttribute(\"role\", \"tabpanel\");\n const buttons = new Map<string, HTMLButtonElement>();\n\n const renderSheetByName = (sheetName: string, sheetIndex: number) => {\n content.replaceChildren();\n buttons.forEach((button, name) => {\n const active = name === sheetName;\n button.classList.toggle(\"is-active\", active);\n button.setAttribute(\"aria-selected\", String(active));\n });\n content.setAttribute(\"aria-label\", sheetName);\n\n const heading = document.createElement(\"h3\");\n heading.textContent = sheetName;\n const sheet = workbook.Sheets[sheetName];\n const range = xlsx.utils.decode_range(sheet[\"!ref\"] || \"A1:A1\");\n const rowCount = range.e.r - range.s.r + 1;\n const columnCount = range.e.c - range.s.c + 1;\n const formulaRows = collectFormulaRows(sheet, range, xlsx.utils.encode_cell);\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-sheet-summary\";\n summary.textContent = `${rowCount} 行 x ${columnCount} 列${\n formulaRows.length > 0 ? `,包含 ${formulaRows.length} 个公式单元格` : \"\"\n }`;\n\n const tableWrapper = document.createElement(\"div\");\n tableWrapper.className = \"ofv-table-scroll\";\n const viewport = createSheetViewport(rowCount, columnCount);\n const windowControls = createSheetWindowControls(viewport, () => renderTableWindow());\n const renderTableWindow = () => {\n tableWrapper.replaceChildren(\n createWorkbookSheetTable(\n sheet,\n range,\n sheetIndex,\n viewport,\n xlsx.utils.encode_cell,\n xlsx.utils.format_cell\n )\n );\n windowControls?.update();\n };\n\n content.append(heading, summary);\n if (windowControls) {\n content.append(windowControls.element);\n }\n content.append(tableWrapper);\n renderTableWindow();\n\n if (formulaRows.length > 0) {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-formula-list\";\n const detailsSummary = document.createElement(\"summary\");\n detailsSummary.textContent = \"公式明细\";\n const list = document.createElement(\"ul\");\n for (const item of formulaRows.slice(0, 200)) {\n const row = document.createElement(\"li\");\n row.textContent = `${item.address}: ${item.formula}`;\n list.append(row);\n }\n if (formulaRows.length > 200) {\n const row = document.createElement(\"li\");\n row.textContent = `还有 ${formulaRows.length - 200} 个公式未展示。`;\n list.append(row);\n }\n details.append(detailsSummary, list);\n content.append(details);\n }\n };\n\n if (workbook.SheetNames.length === 0) {\n content.textContent = extension === \"numbers\" ? \"Numbers 文件需要服务端转换后高保真预览。\" : \"未解析到表格。\";\n } else {\n for (const [index, sheetName] of workbook.SheetNames.entries()) {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.setAttribute(\"role\", \"tab\");\n button.setAttribute(\"aria-selected\", \"false\");\n button.textContent = sheetName;\n button.title = sheetName;\n button.addEventListener(\"click\", () => renderSheetByName(sheetName, index));\n buttons.set(sheetName, button);\n tabs.append(button);\n if (index === 0) {\n renderSheetByName(sheetName, index);\n }\n }\n }\n\n panel.append(tabs, content);\n if (chartPreviews.length > 0) {\n panel.append(renderChartPreviewSection(chartPreviews));\n }\n}\n\nfunction renderSheetFallback(panel: HTMLElement, extension: string, detail: string): void {\n const section = createSection(\"表格解析失败\");\n const title = document.createElement(\"p\");\n title.textContent = `.${extension || \"sheet\"} 文件无法解析为可预览表格。`;\n const meta = document.createElement(\"p\");\n meta.textContent = detail;\n const support = document.createElement(\"p\");\n support.textContent = \"请确认文件未加密、未损坏,或先转换为 XLSX/CSV/ODS 后再预览。\";\n section.append(title, meta, support);\n panel.append(section);\n}\n\ntype ChartPreview = {\n name: string;\n type: string;\n title: string;\n categories: string[];\n series: Array<{ name: string; values: number[] }>;\n};\n\ntype ParsedSheet = {\n name: string;\n rows: string[][];\n formulas: Array<{ address: string; formula: string }>;\n};\n\nfunction renderFlatOds(panel: HTMLElement, xml: string): void {\n const sheets = parseFlatOds(xml);\n renderParsedSheets(panel, sheets, \"FODS 文件未解析到表格。\");\n}\n\nfunction renderParsedSheets(panel: HTMLElement, sheets: ParsedSheet[], emptyMessage: string): void {\n const tabs = document.createElement(\"div\");\n tabs.className = \"ofv-tabs\";\n tabs.setAttribute(\"role\", \"tablist\");\n const content = document.createElement(\"div\");\n content.className = \"ofv-sheet\";\n content.setAttribute(\"role\", \"tabpanel\");\n const buttons = new Map<string, HTMLButtonElement>();\n\n const renderSheetByIndex = (sheet: ParsedSheet, sheetIndex: number) => {\n content.replaceChildren();\n buttons.forEach((button, name) => {\n const active = name === sheet.name;\n button.classList.toggle(\"is-active\", active);\n button.setAttribute(\"aria-selected\", String(active));\n });\n content.setAttribute(\"aria-label\", sheet.name);\n\n const heading = document.createElement(\"h3\");\n heading.textContent = sheet.name;\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-sheet-summary\";\n const rowCount = sheet.rows.length;\n const columnCount = Math.max(0, ...sheet.rows.map((row) => row.length));\n summary.textContent = `${rowCount} 行 x ${columnCount} 列${\n sheet.formulas.length > 0 ? `,包含 ${sheet.formulas.length} 个公式单元格` : \"\"\n }`;\n\n const tableWrapper = document.createElement(\"div\");\n tableWrapper.className = \"ofv-table-scroll\";\n const viewport = createSheetViewport(rowCount, columnCount);\n const windowControls = createSheetWindowControls(viewport, () => renderTableWindow());\n const renderTableWindow = () => {\n tableWrapper.replaceChildren(createParsedSheetTable(sheet, sheetIndex, viewport));\n windowControls?.update();\n };\n\n content.append(heading, summary);\n if (windowControls) {\n content.append(windowControls.element);\n }\n content.append(tableWrapper);\n renderTableWindow();\n\n if (sheet.formulas.length > 0) {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-formula-list\";\n const detailsSummary = document.createElement(\"summary\");\n detailsSummary.textContent = \"公式明细\";\n const list = document.createElement(\"ul\");\n for (const item of sheet.formulas.slice(0, 200)) {\n const row = document.createElement(\"li\");\n row.textContent = `${item.address}: ${item.formula}`;\n list.append(row);\n }\n if (sheet.formulas.length > 200) {\n const row = document.createElement(\"li\");\n row.textContent = `还有 ${sheet.formulas.length - 200} 个公式未展示。`;\n list.append(row);\n }\n details.append(detailsSummary, list);\n content.append(details);\n }\n };\n\n if (sheets.length === 0) {\n content.textContent = emptyMessage;\n } else {\n for (const [index, sheet] of sheets.entries()) {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.setAttribute(\"role\", \"tab\");\n button.setAttribute(\"aria-selected\", \"false\");\n button.textContent = sheet.name;\n button.title = sheet.name;\n button.addEventListener(\"click\", () => renderSheetByIndex(sheet, index));\n buttons.set(sheet.name, button);\n tabs.append(button);\n if (index === 0) {\n renderSheetByIndex(sheet, index);\n }\n }\n }\n\n panel.append(tabs, content);\n}\n\nasync function readWorkbookCharts(arrayBuffer: ArrayBuffer): Promise<ChartPreview[]> {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const chartEntries = Object.values(zip.files)\n .filter((entry) => !entry.dir && /^xl\\/charts\\/chart\\d+\\.xml$/i.test(entry.name))\n .sort((a, b) => a.name.localeCompare(b.name));\n const charts: ChartPreview[] = [];\n for (const [index, entry] of chartEntries.entries()) {\n const xml = await entry.async(\"text\");\n const chart = parseChartXml(xml, entry.name.split(\"/\").pop() || `chart${index + 1}.xml`);\n if (chart) {\n charts.push(chart);\n }\n }\n return charts;\n}\n\nfunction parseChartXml(xml: string, fallbackName: string): ChartPreview | null {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return null;\n }\n\n const type = detectChartType(doc);\n const title = textFromFirst(doc, \"title\") || fallbackName.replace(/\\.xml$/i, \"\");\n const seriesElements = Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"ser\");\n const series = seriesElements\n .map((element, index) => parseChartSeries(element, index))\n .filter((item): item is { name: string; values: number[]; categories: string[] } => item.values.length > 0);\n\n if (series.length === 0) {\n return null;\n }\n\n return {\n name: fallbackName,\n type,\n title,\n categories: series.find((item) => item.categories.length > 0)?.categories || [],\n series: series.map((item) => ({ name: item.name, values: item.values }))\n };\n}\n\nfunction detectChartType(doc: Document): string {\n const chartType = Array.from(doc.getElementsByTagName(\"*\")).find(\n (element) => element.localName.endsWith(\"Chart\") && element.localName !== \"chart\"\n )?.localName;\n if (!chartType) {\n return \"chart\";\n }\n return chartType.replace(/Chart$/i, \"\").toLowerCase();\n}\n\nfunction parseChartSeries(\n element: Element,\n index: number\n): { name: string; values: number[]; categories: string[] } {\n return {\n name: textFromFirst(element, \"tx\") || `Series ${index + 1}`,\n values: numbersFromFirst(element, \"val\"),\n categories: stringsFromFirst(element, \"cat\")\n };\n}\n\nfunction renderChartPreviewSection(charts: ChartPreview[]): HTMLElement {\n const section = createSection(\"表格图表预览\");\n const grid = document.createElement(\"div\");\n grid.className = \"ofv-chart-grid\";\n for (const chart of charts) {\n grid.append(renderChartCard(chart));\n }\n section.append(grid);\n return section;\n}\n\nfunction renderChartCard(chart: ChartPreview): HTMLElement {\n const card = document.createElement(\"article\");\n card.className = \"ofv-chart-card\";\n\n const header = document.createElement(\"header\");\n const title = document.createElement(\"h4\");\n title.textContent = chart.title;\n const meta = document.createElement(\"span\");\n meta.textContent = `${chart.type} · ${chart.series.length} 个系列`;\n header.append(title, meta);\n\n const svg = renderChartSvg(chart);\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-chart-data\";\n const summary = document.createElement(\"summary\");\n summary.textContent = \"数据摘要\";\n const list = document.createElement(\"ul\");\n for (const item of chart.series) {\n const row = document.createElement(\"li\");\n row.textContent = `${item.name}: ${item.values.slice(0, 12).join(\", \")}${\n item.values.length > 12 ? ` ... 共 ${item.values.length} 项` : \"\"\n }`;\n list.append(row);\n }\n details.append(summary, list);\n card.append(header, svg, details);\n return card;\n}\n\nfunction renderChartSvg(chart: ChartPreview): SVGSVGElement {\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 640 260\");\n svg.setAttribute(\"role\", \"img\");\n svg.setAttribute(\"aria-label\", chart.title);\n svg.classList.add(\"ofv-chart-svg\");\n\n const allValues = chart.series.flatMap((item) => item.values).filter((value) => Number.isFinite(value));\n const max = Math.max(1, ...allValues);\n const min = Math.min(0, ...allValues);\n const span = max - min || 1;\n const colors = [\"#2563eb\", \"#059669\", \"#d97706\", \"#dc2626\", \"#7c3aed\"];\n const plot = { x: 48, y: 24, width: 552, height: 178 };\n\n appendSvg(svg, \"line\", { x1: plot.x, y1: plot.y, x2: plot.x, y2: plot.y + plot.height, class: \"ofv-chart-axis\" });\n appendSvg(svg, \"line\", {\n x1: plot.x,\n y1: plot.y + plot.height,\n x2: plot.x + plot.width,\n y2: plot.y + plot.height,\n class: \"ofv-chart-axis\"\n });\n\n chart.series.forEach((series, seriesIndex) => {\n const color = colors[seriesIndex % colors.length];\n const step = series.values.length > 1 ? plot.width / (series.values.length - 1) : plot.width;\n const points = series.values.map((value, index) => ({\n x: plot.x + index * step,\n y: plot.y + plot.height - ((value - min) / span) * plot.height\n }));\n\n if (chart.type.includes(\"bar\") || chart.type.includes(\"col\")) {\n const barWidth = Math.max(4, Math.min(28, step * 0.6)) / Math.max(1, chart.series.length);\n points.forEach((point, index) => {\n const zeroY = plot.y + plot.height - ((0 - min) / span) * plot.height;\n const x = point.x - (barWidth * chart.series.length) / 2 + seriesIndex * barWidth;\n appendSvg(svg, \"rect\", {\n x,\n y: Math.min(point.y, zeroY),\n width: barWidth,\n height: Math.max(1, Math.abs(zeroY - point.y)),\n fill: color,\n \"data-index\": index\n });\n });\n } else {\n appendSvg(svg, \"polyline\", {\n points: points.map((point) => `${point.x.toFixed(1)},${point.y.toFixed(1)}`).join(\" \"),\n fill: \"none\",\n stroke: color,\n \"stroke-width\": 3,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n });\n for (const point of points.slice(0, 80)) {\n appendSvg(svg, \"circle\", { cx: point.x, cy: point.y, r: 3, fill: color });\n }\n }\n\n appendLegend(svg, series.name, color, 52 + seriesIndex * 118, 236);\n });\n\n return svg;\n}\n\nfunction appendLegend(svg: SVGSVGElement, label: string, color: string, x: number, y: number): void {\n appendSvg(svg, \"rect\", { x, y: y - 10, width: 12, height: 12, rx: 2, fill: color });\n const text = appendSvg(svg, \"text\", { x: x + 18, y, class: \"ofv-chart-label\" });\n text.textContent = label.length > 16 ? `${label.slice(0, 16)}...` : label;\n}\n\nfunction appendSvg<K extends keyof SVGElementTagNameMap>(\n parent: SVGElement,\n tag: K,\n attributes: Record<string, string | number>\n): SVGElementTagNameMap[K] {\n const element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n for (const [key, value] of Object.entries(attributes)) {\n element.setAttribute(key, String(value));\n }\n parent.append(element);\n return element;\n}\n\nfunction textFromFirst(root: ParentNode, localName: string): string {\n const element = Array.from(root.querySelectorAll(\"*\")).find((item) => item.localName === localName);\n return element ? chartText(element) : \"\";\n}\n\nfunction stringsFromFirst(root: ParentNode, localName: string): string[] {\n const element = Array.from(root.querySelectorAll(\"*\")).find((item) => item.localName === localName);\n if (!element) {\n return [];\n }\n return chartStringValues(element);\n}\n\nfunction numbersFromFirst(root: ParentNode, localName: string): number[] {\n const element = Array.from(root.querySelectorAll(\"*\")).find((item) => item.localName === localName);\n if (!element) {\n return [];\n }\n return Array.from(element.querySelectorAll(\"*\"))\n .filter((item) => item.localName === \"v\")\n .map((item) => Number(item.textContent || \"\"))\n .filter((value) => Number.isFinite(value));\n}\n\nfunction chartText(element: Element): string {\n return (\n Array.from(element.querySelectorAll(\"*\"))\n .filter((item) => item.localName === \"v\" || item.localName === \"t\")\n .map((item) => item.textContent?.trim() || \"\")\n .find(Boolean) || \"\"\n );\n}\n\nfunction chartStringValues(element: Element): string[] {\n return Array.from(element.querySelectorAll(\"*\"))\n .filter((item) => item.localName === \"v\" || item.localName === \"t\")\n .map((item) => item.textContent?.trim() || \"\")\n .filter(Boolean);\n}\n\ntype SheetViewport = {\n rowStart: number;\n columnStart: number;\n rowCount: number;\n columnCount: number;\n};\n\ntype SheetWindowControls = {\n element: HTMLElement;\n update: () => void;\n};\n\nfunction createSheetViewport(rowCount: number, columnCount: number): SheetViewport {\n return {\n rowStart: 0,\n columnStart: 0,\n rowCount,\n columnCount\n };\n}\n\nfunction createSheetWindowControls(viewport: SheetViewport, render: () => void): SheetWindowControls | null {\n const needsRows = viewport.rowCount > SHEET_WINDOW_ROWS;\n const needsColumns = viewport.columnCount > SHEET_WINDOW_COLUMNS;\n if (!needsRows && !needsColumns) {\n return null;\n }\n\n const controls = document.createElement(\"div\");\n controls.className = \"ofv-sheet-window\";\n\n const note = document.createElement(\"span\");\n note.className = \"ofv-sheet-window-note\";\n\n const rowBack = createWindowButton(\"上 200 行\", () => {\n viewport.rowStart = Math.max(0, viewport.rowStart - SHEET_WINDOW_ROWS);\n render();\n });\n const rowNext = createWindowButton(\"下 200 行\", () => {\n viewport.rowStart = Math.min(maxStart(viewport.rowCount, SHEET_WINDOW_ROWS), viewport.rowStart + SHEET_WINDOW_ROWS);\n render();\n });\n const colBack = createWindowButton(\"左 80 列\", () => {\n viewport.columnStart = Math.max(0, viewport.columnStart - SHEET_WINDOW_COLUMNS);\n render();\n });\n const colNext = createWindowButton(\"右 80 列\", () => {\n viewport.columnStart = Math.min(\n maxStart(viewport.columnCount, SHEET_WINDOW_COLUMNS),\n viewport.columnStart + SHEET_WINDOW_COLUMNS\n );\n render();\n });\n\n controls.append(note, rowBack, rowNext, colBack, colNext);\n\n const update = () => {\n const rowEnd = Math.min(viewport.rowStart + SHEET_WINDOW_ROWS, viewport.rowCount);\n const columnEnd = Math.min(viewport.columnStart + SHEET_WINDOW_COLUMNS, viewport.columnCount);\n note.textContent = `大表格窗口化渲染:当前 ${viewport.rowStart + 1}-${rowEnd} 行,${viewport.columnStart + 1}-${columnEnd} 列`;\n rowBack.disabled = viewport.rowStart === 0;\n rowNext.disabled = viewport.rowStart >= maxStart(viewport.rowCount, SHEET_WINDOW_ROWS);\n colBack.disabled = viewport.columnStart === 0;\n colNext.disabled = viewport.columnStart >= maxStart(viewport.columnCount, SHEET_WINDOW_COLUMNS);\n rowBack.hidden = rowNext.hidden = !needsRows;\n colBack.hidden = colNext.hidden = !needsColumns;\n };\n\n update();\n return { element: controls, update };\n}\n\nfunction createWindowButton(label: string, onClick: () => void): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.textContent = label;\n button.addEventListener(\"click\", onClick);\n return button;\n}\n\nfunction maxStart(total: number, size: number): number {\n return Math.max(0, total - size);\n}\n\nfunction createWorkbookSheetTable(\n sheet: Record<string, any>,\n range: { s: { r: number; c: number }; e: { r: number; c: number } },\n sheetIndex: number,\n viewport: SheetViewport,\n encodeCell: (cell: { r: number; c: number }) => string,\n formatCell: (cell: any) => string\n): HTMLTableElement {\n const table = document.createElement(\"table\");\n table.id = `ofv-sheet-${sheetIndex + 1}`;\n const rowEnd = Math.min(range.s.r + viewport.rowStart + SHEET_WINDOW_ROWS - 1, range.e.r);\n const columnEnd = Math.min(range.s.c + viewport.columnStart + SHEET_WINDOW_COLUMNS - 1, range.e.c);\n\n for (let rowIndex = range.s.r + viewport.rowStart; rowIndex <= rowEnd; rowIndex += 1) {\n const row = document.createElement(\"tr\");\n for (let columnIndex = range.s.c + viewport.columnStart; columnIndex <= columnEnd; columnIndex += 1) {\n const cell = document.createElement(rowIndex === range.s.r ? \"th\" : \"td\");\n const address = encodeCell({ r: rowIndex, c: columnIndex });\n const sourceCell = sheet[address];\n cell.dataset.cell = address;\n const text = sourceCell ? formatCell(sourceCell) : \"\";\n cell.textContent = text;\n if (text) {\n cell.title = text;\n }\n if (sourceCell?.f) {\n cell.classList.add(\"ofv-cell-formula\");\n cell.title = `=${sourceCell.f}`;\n }\n row.append(cell);\n }\n table.append(row);\n }\n\n return table;\n}\n\nfunction createParsedSheetTable(sheet: ParsedSheet, sheetIndex: number, viewport: SheetViewport): HTMLTableElement {\n const table = document.createElement(\"table\");\n table.id = `ofv-sheet-${sheetIndex + 1}`;\n const formulaMap = new Map(sheet.formulas.map((item) => [item.address, item.formula]));\n const rowEnd = Math.min(viewport.rowStart + SHEET_WINDOW_ROWS, sheet.rows.length);\n for (let rowIndex = viewport.rowStart; rowIndex < rowEnd; rowIndex += 1) {\n const sourceRow = sheet.rows[rowIndex] || [];\n const row = document.createElement(\"tr\");\n const columnEnd = Math.min(viewport.columnStart + SHEET_WINDOW_COLUMNS, viewport.columnCount);\n for (let columnIndex = viewport.columnStart; columnIndex < columnEnd; columnIndex += 1) {\n const value = sourceRow[columnIndex] || \"\";\n const cell = document.createElement(rowIndex === 0 ? \"th\" : \"td\");\n const address = encodeA1(rowIndex, columnIndex);\n cell.dataset.cell = address;\n cell.textContent = value;\n if (value) {\n cell.title = value;\n }\n const formula = formulaMap.get(address);\n if (formula) {\n cell.classList.add(\"ofv-cell-formula\");\n cell.title = formula;\n }\n row.append(cell);\n }\n table.append(row);\n }\n return table;\n}\n\nfunction parseFlatOds(xml: string): ParsedSheet[] {\n const documentXml = new DOMParser().parseFromString(xml, \"application/xml\");\n if (documentXml.querySelector(\"parsererror\")) {\n return [];\n }\n\n return Array.from(documentXml.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"table\")\n .map((tableElement, tableIndex) => parseFlatOdsTable(tableElement, tableIndex))\n .filter((sheet) => sheet.rows.length > 0);\n}\n\nfunction parseFlatOdsTable(tableElement: Element, tableIndex: number): ParsedSheet {\n const rows: string[][] = [];\n const formulas: Array<{ address: string; formula: string }> = [];\n const sheetName = getXmlAttribute(tableElement, \"name\") || `Sheet ${tableIndex + 1}`;\n for (const rowElement of Array.from(tableElement.children).filter((element) => element.localName === \"table-row\")) {\n const repeatRows = clampRepeat(getXmlAttribute(rowElement, \"number-rows-repeated\"), 200);\n const parsedRow = parseFlatOdsRow(rowElement, rows.length, formulas);\n for (let index = 0; index < repeatRows; index += 1) {\n rows.push([...parsedRow]);\n }\n }\n trimEmptyTrailingRows(rows);\n return { name: sheetName, rows, formulas };\n}\n\nfunction parseFlatOdsRow(\n rowElement: Element,\n rowIndex: number,\n formulas: Array<{ address: string; formula: string }>\n): string[] {\n const row: string[] = [];\n for (const cellElement of Array.from(rowElement.children).filter(\n (element) => element.localName === \"table-cell\" || element.localName === \"covered-table-cell\"\n )) {\n const repeatColumns = clampRepeat(getXmlAttribute(cellElement, \"number-columns-repeated\"), 256);\n const value = extractFlatOdsCellValue(cellElement);\n const formula = getXmlAttribute(cellElement, \"formula\");\n for (let index = 0; index < repeatColumns; index += 1) {\n const columnIndex = row.length;\n row.push(value);\n if (formula) {\n formulas.push({ address: encodeA1(rowIndex, columnIndex), formula });\n }\n }\n }\n trimEmptyTrailingCells(row);\n return row;\n}\n\nfunction extractFlatOdsCellValue(cellElement: Element): string {\n const text = extractOpenDocumentTextFromElement(cellElement);\n if (text) {\n return text;\n }\n return (\n getXmlAttribute(cellElement, \"value\") ||\n getXmlAttribute(cellElement, \"date-value\") ||\n getXmlAttribute(cellElement, \"time-value\") ||\n getXmlAttribute(cellElement, \"boolean-value\") ||\n \"\"\n );\n}\n\nfunction extractOpenDocumentTextFromElement(element: Element): string {\n const fragments: string[] = [];\n const visit = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n fragments.push(node.textContent || \"\");\n return;\n }\n if (!(node instanceof Element)) {\n return;\n }\n if (node.localName === \"s\") {\n fragments.push(\" \".repeat(clampRepeat(getXmlAttribute(node, \"c\"), 64)));\n return;\n }\n if (node.localName === \"tab\") {\n fragments.push(\"\\t\");\n return;\n }\n if (node.localName === \"line-break\") {\n fragments.push(\"\\n\");\n return;\n }\n for (const child of Array.from(node.childNodes)) {\n visit(child);\n }\n if (node.localName === \"p\" || node.localName === \"h\") {\n fragments.push(\"\\n\");\n }\n };\n visit(element);\n return fragments.join(\"\").replace(/\\n+$/g, \"\").trim();\n}\n\nfunction getXmlAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction clampRepeat(value: string | null, max: number): number {\n const parsed = value ? Number.parseInt(value, 10) : 1;\n if (!Number.isFinite(parsed) || parsed < 1) {\n return 1;\n }\n return Math.min(parsed, max);\n}\n\nfunction trimEmptyTrailingRows(rows: string[][]): void {\n while (rows.length > 0 && rows[rows.length - 1].every((cell) => cell === \"\")) {\n rows.pop();\n }\n}\n\nfunction trimEmptyTrailingCells(row: string[]): void {\n while (row.length > 0 && row[row.length - 1] === \"\") {\n row.pop();\n }\n}\n\nfunction collectFormulaRows(\n sheet: Record<string, any>,\n range: { s: { r: number; c: number }; e: { r: number; c: number } },\n encodeCell: (cell: { r: number; c: number }) => string\n): Array<{ address: string; formula: string }> {\n const formulas: Array<{ address: string; formula: string }> = [];\n for (let row = range.s.r; row <= range.e.r; row += 1) {\n for (let column = range.s.c; column <= range.e.c; column += 1) {\n const address = encodeCell({ r: row, c: column });\n const cell = sheet[address];\n if (cell?.f) {\n formulas.push({ address, formula: `=${cell.f}` });\n }\n }\n }\n return formulas;\n}\n\nfunction encodeA1(rowIndex: number, columnIndex: number): string {\n let column = \"\";\n let value = columnIndex + 1;\n while (value > 0) {\n const remainder = (value - 1) % 26;\n column = String.fromCharCode(65 + remainder) + column;\n value = Math.floor((value - 1) / 26);\n }\n return `${column}${rowIndex + 1}`;\n}\n\nasync function renderPptx(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const container = document.createElement(\"div\");\n container.className = \"ofv-pptx-viewer\";\n\n try {\n const zip = await JSZip.loadAsync(arrayBuffer);\n await renderPresentationInsight(panel, await inspectPptxPresentation(zip));\n } catch (error) {\n console.warn(\"PPTX structure insight extraction failed:\", error);\n }\n\n panel.append(container);\n try {\n const { PptxViewer } = await import(\"@aiden0z/pptx-renderer\");\n await PptxViewer.open(arrayBuffer, container);\n } catch {\n container.textContent = \"PPTX 渲染失败,请检查文件是否损坏。\";\n }\n}\n\nasync function renderOdp(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const content = zip.file(\"content.xml\");\n if (!content) {\n panel.textContent = \"未解析到 ODP 内容。\";\n return;\n }\n const xml = await content.async(\"text\");\n const images = await extractZipImages(zip, /^Pictures\\//);\n renderPresentationInsight(panel, inspectOpenDocumentPresentation(titleFromOdf(xml, \"ODP 演示文稿\"), xml, images.length));\n renderOpenDocumentPresentation(panel, \"ODP 演示文稿\", xml, images);\n}\n\nfunction renderOpenDocumentPresentationXml(panel: HTMLElement, xml: string): void {\n renderPresentationInsight(panel, inspectOpenDocumentPresentation(\"FODP 演示文稿\", xml, 0));\n renderOpenDocumentPresentation(panel, \"FODP 演示文稿\", xml, []);\n}\n\nasync function renderPackagedOfficePreview(\n panel: HTMLElement,\n arrayBuffer: ArrayBuffer,\n extension: string\n): Promise<boolean> {\n let zip: JSZip;\n try {\n zip = await JSZip.loadAsync(arrayBuffer);\n } catch {\n return false;\n }\n\n const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n const hasEntry = (path: string) => entries.some((entry) => entry.name.toLowerCase() === path.toLowerCase());\n const contentXml = zip.file(/(^|\\/)content\\.xml$/i)[0];\n\n if (hasEntry(\"word/document.xml\")) {\n renderOfficePackageNotice(panel, extension, \"检测到 OOXML Word 包结构,已按 DOCX 兼容路径预览。\");\n await renderDocx(panel, arrayBuffer);\n return true;\n }\n\n if (hasEntry(\"xl/workbook.xml\")) {\n renderOfficePackageNotice(panel, extension, \"检测到 OOXML Workbook 包结构,已按 XLSX 兼容路径预览。\");\n await renderSheet(panel, arrayBuffer, extension);\n return true;\n }\n\n if (hasEntry(\"ppt/presentation.xml\")) {\n renderOfficePackageNotice(panel, extension, \"检测到 OOXML Presentation 包结构,已按 PPTX 兼容路径预览。\");\n await renderPptx(panel, arrayBuffer);\n return true;\n }\n\n if (contentXml) {\n const xml = await contentXml.async(\"text\");\n if (/<office:spreadsheet\\b|<table:table\\b/i.test(xml)) {\n renderOfficePackageNotice(panel, extension, \"检测到 OpenDocument Spreadsheet 包结构,已按 ODS 兼容路径预览。\");\n renderParsedSheets(panel, parseFlatOds(xml), `${extension.toUpperCase()} 文件未解析到表格。`);\n return true;\n }\n if (/<office:presentation\\b|<draw:page\\b/i.test(xml)) {\n renderOfficePackageNotice(panel, extension, \"检测到 OpenDocument Presentation 包结构,已按 ODP 兼容路径预览。\");\n renderOpenDocumentPresentation(panel, `${extension.toUpperCase()} 演示文稿`, xml, await extractZipImages(zip, /^Pictures\\//));\n return true;\n }\n if (/<office:text\\b|<text:p\\b/i.test(xml)) {\n renderOfficePackageNotice(panel, extension, \"检测到 OpenDocument Text 包结构,已按 ODT 兼容路径预览。\");\n renderOpenDocumentXml(panel, `${extension.toUpperCase()} 文档`, xml);\n return true;\n }\n }\n\n if (entries.some((entry) => /^index\\//i.test(entry.name) || /\\.iwa$/i.test(entry.name))) {\n renderOfficePackageStructure(\n panel,\n extension,\n entries.map((entry) => entry.name),\n \"检测到 Apple iWork 包结构。当前解析包内 plist 元数据并展示 IWA/资源结构;正文 IWA 数据可后续接入专用解析器增强。\",\n await extractIWorkMetadata(entries)\n );\n return true;\n }\n\n if (entries.length > 0) {\n renderOfficePackageStructure(\n panel,\n extension,\n entries.map((entry) => entry.name),\n \"检测到 ZIP 包结构,但未发现标准 OOXML/ODF 入口。可后续接入对应厂商格式解析器或服务端转换。\"\n );\n return true;\n }\n\n return false;\n}\n\nfunction renderOfficePackageNotice(panel: HTMLElement, extension: string, message: string): void {\n const section = createSection(\"兼容包识别\");\n const note = document.createElement(\"p\");\n note.className = \"ofv-office-package-note\";\n note.textContent = `.${extension} ${message}`;\n section.append(note);\n panel.append(section);\n}\n\nfunction renderOfficePackageStructure(\n panel: HTMLElement,\n extension: string,\n entries: string[],\n message: string,\n metadata?: IWorkMetadata\n): void {\n const section = createSection(\"Office 包结构预览\");\n const note = document.createElement(\"p\");\n note.className = \"ofv-office-package-note\";\n note.textContent = `.${extension} ${message}`;\n\n if (metadata && Object.keys(metadata).length > 0) {\n section.append(createIWorkMetadataSummary(metadata));\n }\n\n const list = document.createElement(\"ul\");\n list.className = \"ofv-office-package-list\";\n for (const name of entries.slice(0, 120)) {\n const item = document.createElement(\"li\");\n item.textContent = name;\n list.append(item);\n }\n if (entries.length > 120) {\n const item = document.createElement(\"li\");\n item.textContent = `还有 ${entries.length - 120} 个文件未展示。`;\n list.append(item);\n }\n\n section.append(note, list);\n panel.append(section);\n}\n\nasync function extractIWorkMetadata(entries: JSZip.JSZipObject[]): Promise<IWorkMetadata> {\n const metadataEntries = entries.filter((entry) => /^metadata\\/.*\\.plist$/i.test(entry.name) || /properties\\.plist$/i.test(entry.name));\n const metadata: IWorkMetadata = {};\n for (const entry of metadataEntries.slice(0, 6)) {\n const text = await entry.async(\"text\").catch(() => \"\");\n if (!text || !/<plist[\\s>]/i.test(text)) {\n continue;\n }\n const plist = parsePlistDict(text);\n mergeIWorkMetadata(metadata, plist);\n }\n return metadata;\n}\n\nfunction createIWorkMetadataSummary(metadata: IWorkMetadata): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-iwork-meta\";\n const title = document.createElement(\"strong\");\n title.textContent = \"iWork 元数据\";\n const grid = document.createElement(\"div\");\n grid.className = \"ofv-iwork-meta-grid\";\n appendIWorkMeta(grid, \"标题\", metadata.title);\n appendIWorkMeta(grid, \"作者\", metadata.author);\n appendIWorkMeta(grid, \"公司\", metadata.company);\n appendIWorkMeta(grid, \"主题\", metadata.subject);\n appendIWorkMeta(grid, \"关键词\", metadata.keywords?.join(\", \"));\n appendIWorkMeta(grid, \"创建时间\", metadata.created);\n appendIWorkMeta(grid, \"修改时间\", metadata.modified);\n wrapper.append(title, grid);\n return wrapper;\n}\n\nfunction appendIWorkMeta(parent: HTMLElement, label: string, value?: string): void {\n if (!value) {\n return;\n }\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n row.append(key, content);\n parent.append(row);\n}\n\nfunction mergeIWorkMetadata(metadata: IWorkMetadata, plist: Record<string, unknown>): void {\n metadata.title ||= plistText(plist, [\"Title\", \"title\", \"DocumentTitle\", \"SFDocumentTitle\", \"kMDItemTitle\"]);\n metadata.author ||= plistText(plist, [\"Author\", \"author\", \"Authors\", \"kMDItemAuthors\", \"creator\"]);\n metadata.company ||= plistText(plist, [\"Company\", \"company\", \"Organization\"]);\n metadata.subject ||= plistText(plist, [\"Subject\", \"subject\", \"Description\", \"comment\"]);\n metadata.created ||= plistText(plist, [\"CreationDate\", \"created\", \"kMDItemFSCreationDate\"]);\n metadata.modified ||= plistText(plist, [\"ModificationDate\", \"modified\", \"kMDItemFSContentChangeDate\"]);\n metadata.keywords ||= plistArray(plist, [\"Keywords\", \"keywords\", \"kMDItemKeywords\"]);\n}\n\nfunction parsePlistDict(xml: string): Record<string, unknown> {\n if (typeof DOMParser === \"undefined\") {\n return {};\n }\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return {};\n }\n const dict = Array.from(doc.documentElement.children).find((child) => child.tagName === \"dict\");\n const value = dict ? parsePlistValue(dict) : undefined;\n return value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : {};\n}\n\nfunction parsePlistValue(element: Element): unknown {\n switch (element.tagName) {\n case \"dict\": {\n const result: Record<string, unknown> = {};\n const children = Array.from(element.children);\n for (let index = 0; index < children.length; index++) {\n const key = children[index];\n if (key.tagName !== \"key\") {\n continue;\n }\n const value = children[index + 1];\n if (value) {\n result[key.textContent || \"\"] = parsePlistValue(value);\n index++;\n }\n }\n return result;\n }\n case \"array\":\n return Array.from(element.children).map(parsePlistValue);\n case \"true\":\n return true;\n case \"false\":\n return false;\n case \"integer\":\n case \"real\":\n return Number(element.textContent || 0);\n case \"string\":\n case \"date\":\n default:\n return element.textContent?.trim() || \"\";\n }\n}\n\nfunction plistText(plist: Record<string, unknown>, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = plist[key];\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n if (Array.isArray(value)) {\n const text = value.filter((item): item is string => typeof item === \"string\" && Boolean(item.trim())).join(\", \");\n if (text) {\n return text;\n }\n }\n }\n return undefined;\n}\n\nfunction plistArray(plist: Record<string, unknown>, keys: string[]): string[] | undefined {\n for (const key of keys) {\n const value = plist[key];\n if (Array.isArray(value)) {\n const items = value.filter((item): item is string => typeof item === \"string\" && Boolean(item.trim()));\n if (items.length > 0) {\n return items;\n }\n }\n if (typeof value === \"string\" && value.trim()) {\n return value.split(/[,;]/).map((item) => item.trim()).filter(Boolean);\n }\n }\n return undefined;\n}\n\nfunction renderOpenDocumentPresentation(\n panel: HTMLElement,\n title: string,\n xml: string,\n images: Array<{ name: string; src: string }>\n): void {\n const pages = xml.split(/<draw:page\\b/).slice(1);\n const pageSources = pages.length > 0 ? pages : [xml];\n for (const [index, pageXml] of pageSources.entries()) {\n const section = createSection(`${title} ${index + 1}`);\n const body = document.createElement(\"div\");\n body.className = \"ofv-slide\";\n const texts = extractOpenDocumentBlocks(pageXml);\n if (texts.length > 0) {\n for (const text of texts) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = text;\n body.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"这一页没有可提取文本。\";\n body.append(empty);\n }\n for (const image of images.slice(index === 0 ? 0 : images.length, index === 0 ? images.length : images.length)) {\n const figure = document.createElement(\"figure\");\n figure.className = \"ofv-slide-image\";\n const img = document.createElement(\"img\");\n img.src = image.src;\n img.alt = image.name;\n const caption = document.createElement(\"figcaption\");\n caption.textContent = image.name;\n figure.append(img, caption);\n body.append(figure);\n }\n section.append(body);\n panel.append(section);\n }\n}\n\nasync function inspectPptxPresentation(zip: JSZip): Promise<PresentationInsight> {\n const slideEntries = Object.values(zip.files)\n .filter((entry) => !entry.dir && /^ppt\\/slides\\/slide\\d+\\.xml$/i.test(entry.name))\n .sort((a, b) => slideNumberFromPath(a.name) - slideNumberFromPath(b.name));\n\n const slides: PresentationSlideInsight[] = [];\n let imageCount = 0;\n let notesCount = 0;\n let transitionCount = 0;\n let animationCount = 0;\n const layouts = new Set<string>();\n\n for (const entry of slideEntries) {\n const xml = await entry.async(\"text\");\n const texts = extractOpenXmlText(xml);\n const rels = await readPptxRelationships(zip, entry.name);\n const layout = await resolvePptxSlideLayout(zip, entry.name, rels);\n if (layout) {\n layouts.add(layout);\n }\n\n const slideImageCount = countPptxSlideImages(xml, rels);\n const notesPath = resolvePptxRelationshipTarget(entry.name, rels.find((rel) => /\\/notesSlide$/i.test(rel.type))?.target);\n const notesXml = notesPath ? await zip.file(notesPath)?.async(\"text\") : undefined;\n const slideNotesCount = notesXml ? extractOpenXmlText(notesXml).length : 0;\n const hasTransition = /<p:transition\\b/i.test(xml);\n const slideAnimationCount = countMatches(xml, /<p:(?:anim|animEffect|animMotion|animRot|animScale|cmd|set)\\b/gi);\n\n imageCount += slideImageCount;\n notesCount += slideNotesCount;\n transitionCount += hasTransition ? 1 : 0;\n animationCount += slideAnimationCount;\n slides.push({\n title: texts[0] || `Slide ${slides.length + 1}`,\n layout,\n textCount: texts.length,\n imageCount: slideImageCount,\n notesCount: slideNotesCount,\n hasTransition,\n animationCount: slideAnimationCount,\n sampleTexts: texts.slice(0, 4)\n });\n }\n\n return {\n title: \"PPTX 演示文稿结构\",\n slideCount: slides.length,\n imageCount,\n notesCount,\n transitionCount,\n animationCount,\n layouts: Array.from(layouts),\n slides\n };\n}\n\nfunction inspectOpenDocumentPresentation(title: string, xml: string, totalImages: number): PresentationInsight {\n const pages = xml.split(/<draw:page\\b/).slice(1);\n const pageSources = pages.length > 0 ? pages : [xml];\n const slides = pageSources.map((pageXml, index) => {\n const texts = extractOpenDocumentBlocks(pageXml);\n const layout =\n matchXmlAttribute(pageXml, /presentation:class=\"([^\"]+)\"/i) ||\n matchXmlAttribute(pageXml, /draw:style-name=\"([^\"]+)\"/i) ||\n undefined;\n const imageCount = countMatches(pageXml, /<draw:image\\b/gi);\n const hasTransition = /presentation:transition-type=|presentation:transition-style=|smil:type=/i.test(pageXml);\n const animationCount = countMatches(pageXml, /<anim:|<presentation:animations\\b|<presentation:show-shape\\b/gi);\n return {\n title: texts[0] || `Slide ${index + 1}`,\n layout,\n textCount: texts.length,\n imageCount,\n notesCount: countMatches(pageXml, /<presentation:notes\\b/gi),\n hasTransition,\n animationCount,\n sampleTexts: texts.slice(0, 4)\n };\n });\n\n const layouts = new Set(slides.map((slide) => slide.layout).filter(Boolean) as string[]);\n return {\n title,\n slideCount: slides.length,\n imageCount: Math.max(totalImages, slides.reduce((sum, slide) => sum + slide.imageCount, 0)),\n notesCount: slides.reduce((sum, slide) => sum + slide.notesCount, 0),\n transitionCount: slides.filter((slide) => slide.hasTransition).length,\n animationCount: slides.reduce((sum, slide) => sum + slide.animationCount, 0),\n layouts: Array.from(layouts),\n slides\n };\n}\n\nasync function renderPresentationInsight(panel: HTMLElement, insight: PresentationInsight): Promise<void> {\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-presentation-summary\";\n summary.hidden = true;\n summary.setAttribute(\"aria-hidden\", \"true\");\n summary.dataset.slideCount = String(insight.slideCount);\n summary.dataset.imageCount = String(insight.imageCount);\n summary.dataset.notesCount = String(insight.notesCount);\n summary.dataset.transitionCount = String(insight.transitionCount);\n summary.dataset.animationCount = String(insight.animationCount);\n const stats = [\n `${insight.slideCount} 页`,\n `${insight.layouts.length || 0} 种布局`,\n `${insight.imageCount} 张图片`,\n `${insight.notesCount} 条备注`,\n `${insight.transitionCount} 页切换`,\n `${insight.animationCount} 个动画标记`\n ];\n summary.append(createPresentationMetric(insight.title, stats.join(\" · \")));\n\n if (insight.layouts.length > 0) {\n summary.append(createPresentationMetric(\"布局\", insight.layouts.join(\"、\")));\n }\n panel.append(summary);\n}\n\nfunction createPresentationMetric(label: string, value: string): HTMLElement {\n const metric = document.createElement(\"p\");\n const strong = document.createElement(\"strong\");\n strong.textContent = label;\n const span = document.createElement(\"span\");\n span.textContent = value;\n metric.append(strong, span);\n return metric;\n}\n\ntype PptxRelationship = {\n id: string;\n type: string;\n target: string;\n};\n\nasync function readPptxRelationships(zip: JSZip, partPath: string): Promise<PptxRelationship[]> {\n const relsPath = relationshipPathForPart(partPath);\n const xml = await zip.file(relsPath)?.async(\"text\");\n if (!xml) {\n return [];\n }\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return [];\n }\n return Array.from(doc.getElementsByTagNameNS(PPTX_REL_NS, \"Relationship\")).map((element) => ({\n id: element.getAttribute(\"Id\") || \"\",\n type: element.getAttribute(\"Type\") || \"\",\n target: element.getAttribute(\"Target\") || \"\"\n }));\n}\n\nasync function resolvePptxSlideLayout(zip: JSZip, slidePath: string, rels: PptxRelationship[]): Promise<string | undefined> {\n const layoutRel = rels.find((rel) => /\\/slideLayout$/i.test(rel.type));\n const layoutPath = resolvePptxRelationshipTarget(slidePath, layoutRel?.target);\n const xml = layoutPath ? await zip.file(layoutPath)?.async(\"text\") : undefined;\n if (!xml) {\n return layoutPath?.split(\"/\").pop()?.replace(/\\.xml$/i, \"\");\n }\n return matchXmlAttribute(xml, /<p:cSld\\b[^>]*name=\"([^\"]+)\"/i) || layoutPath?.split(\"/\").pop()?.replace(/\\.xml$/i, \"\");\n}\n\nfunction countPptxSlideImages(xml: string, rels: PptxRelationship[]): number {\n const relImageIds = new Set(rels.filter((rel) => /\\/image$/i.test(rel.type)).map((rel) => rel.id));\n const embeddedIds = [...xml.matchAll(/<a:blip\\b[^>]*(?:r:embed|r:link)=\"([^\"]+)\"/gi)].map((match) => match[1]);\n if (embeddedIds.length > 0) {\n return embeddedIds.filter((id) => relImageIds.size === 0 || relImageIds.has(id)).length;\n }\n return relImageIds.size;\n}\n\nfunction relationshipPathForPart(partPath: string): string {\n const parts = partPath.split(\"/\");\n const fileName = parts.pop() || partPath;\n return `${parts.join(\"/\")}/_rels/${fileName}.rels`;\n}\n\nfunction resolvePptxRelationshipTarget(sourcePath: string, target?: string): string | undefined {\n if (!target || /^[a-z]+:/i.test(target)) {\n return undefined;\n }\n if (target.startsWith(\"/\")) {\n return target.slice(1);\n }\n const base = sourcePath.split(\"/\").slice(0, -1);\n for (const segment of target.split(\"/\")) {\n if (!segment || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n base.pop();\n } else {\n base.push(segment);\n }\n }\n return base.join(\"/\");\n}\n\nfunction slideNumberFromPath(path: string): number {\n return Number(path.match(/slide(\\d+)\\.xml$/i)?.[1] || \"0\");\n}\n\nfunction countMatches(value: string, pattern: RegExp): number {\n return [...value.matchAll(pattern)].length;\n}\n\nfunction matchXmlAttribute(value: string, pattern: RegExp): string | null {\n const match = value.match(pattern);\n return match ? decodeXml(match[1] || \"\") : null;\n}\n\nfunction titleFromOdf(xml: string, fallback: string): string {\n return matchXmlAttribute(xml, /<office:meta[\\s\\S]*?<dc:title[^>]*>([\\s\\S]*?)<\\/dc:title>/i) || fallback;\n}\n\nfunction isLegacyOfficeBinary(extension: string): boolean {\n return [\"doc\", \"dot\", \"xls\", \"xlt\", \"ppt\", \"pps\"].includes(extension);\n}\n\nfunction legacyOfficeFormatLabel(extension: string): string {\n if (extension === \"doc\" || extension === \"dot\") {\n return \"Word Binary File Format\";\n }\n if (extension === \"xls\" || extension === \"xlt\") {\n return \"Excel Binary File Format\";\n }\n return \"PowerPoint Binary File Format\";\n}\n\nfunction renderLegacyOfficeBinary(panel: HTMLElement, extension: string, arrayBuffer: ArrayBuffer, parseError?: string): void {\n const fragments = extractLegacyOfficeText(arrayBuffer);\n panel.replaceChildren();\n const section = createSection(\"Office 二进制基础预览\");\n const format = document.createElement(\"p\");\n const strong = document.createElement(\"strong\");\n strong.textContent = `.${extension}`;\n format.append(\n strong,\n document.createTextNode(\n \" 属于旧版 Microsoft Office 二进制格式,浏览器内无法高保真解析;当前先提取可读文本片段和结构指纹,完整版式建议接入 LibreOffice/OnlyOffice 服务端转换。\"\n )\n );\n\n const meta = document.createElement(\"dl\");\n meta.className = \"ofv-office-binary-meta\";\n appendOfficeBinaryMeta(meta, \"格式类型\", legacyOfficeFormatLabel(extension));\n appendOfficeBinaryMeta(meta, \"文件结构\", hasOleSignature(arrayBuffer) ? \"检测到 OLE Compound File 签名\" : \"未检测到标准 OLE 签名,按原始二进制尝试提取\");\n appendOfficeBinaryMeta(meta, \"文本片段\", `${fragments.length} 段`);\n if (parseError) {\n appendOfficeBinaryMeta(meta, \"表格解析\", `xlsx 读取失败,已切换二进制指纹:${parseError}`);\n }\n\n section.append(format, meta);\n\n if (fragments.length > 0) {\n const article = document.createElement(\"article\");\n article.className = \"ofv-document\";\n for (const fragment of fragments.slice(0, 80)) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = fragment;\n article.append(paragraph);\n }\n section.append(article);\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"未提取到稳定可读文本。该文件可能经过压缩、加密,或需要完整二进制解析器。\";\n section.append(empty);\n }\n\n panel.append(section);\n}\n\nfunction appendOfficeBinaryMeta(list: HTMLDListElement, label: string, value: string): void {\n const term = document.createElement(\"dt\");\n term.textContent = label;\n const detail = document.createElement(\"dd\");\n detail.textContent = value;\n list.append(term, detail);\n}\n\nfunction renderUnsupportedOffice(panel: HTMLElement, extension: string): void {\n const legacyBinary = new Set([\"doc\", \"dot\", \"wps\", \"ppt\", \"pps\", \"key\", \"dps\"]);\n const message = legacyBinary.has(extension)\n ? \"该格式属于老二进制或专有格式,浏览器内无法可靠解析;建议接入 LibreOffice/OnlyOffice 服务端转换为 PDF/HTML 后预览。\"\n : \"该格式通常需要服务端转换或专用解析器才能高保真预览。\";\n panel.replaceChildren();\n const section = createSection(\"Office 基础预览\");\n const format = document.createElement(\"p\");\n const strong = document.createElement(\"strong\");\n strong.textContent = `.${extension}`;\n format.append(strong, document.createTextNode(` 已进入 Office 插件。${message}`));\n\n const support = document.createElement(\"p\");\n support.textContent = \"当前版本优先支持 docx、rtf、odt/fodt、xlsx/xls/csv/ods、pptx/ppsx、odp/fodp 的基础内容预览。\";\n\n section.append(format, support);\n panel.append(section);\n}\n\nfunction normalizeOfficeError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error || \"\");\n return message ? `解析器返回:${message}` : \"解析器未返回具体错误信息。\";\n}\n\nfunction extractLegacyOfficeText(arrayBuffer: ArrayBuffer): string[] {\n const bytes = new Uint8Array(arrayBuffer);\n const fragments = [\n ...extractPrintableRuns(bytes),\n ...extractUtf16Runs(bytes)\n ]\n .map((fragment) => normalizeLegacyText(fragment))\n .filter((fragment) => fragment.length >= 3 && /[\\p{L}\\p{N}]/u.test(fragment));\n const unique: string[] = [];\n const seen = new Set<string>();\n for (const fragment of fragments) {\n const key = fragment.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n unique.push(fragment);\n }\n }\n return unique.slice(0, 160);\n}\n\nfunction extractPrintableRuns(bytes: Uint8Array): string[] {\n const fragments: string[] = [];\n let current = \"\";\n for (const byte of bytes) {\n if ((byte >= 32 && byte <= 126) || byte === 9) {\n current += String.fromCharCode(byte);\n } else {\n if (current.length >= 4) {\n fragments.push(current);\n }\n current = \"\";\n }\n }\n if (current.length >= 4) {\n fragments.push(current);\n }\n return fragments;\n}\n\nfunction extractUtf16Runs(bytes: Uint8Array): string[] {\n const fragments: string[] = [];\n let current = \"\";\n for (let index = 0; index < bytes.length - 1; index += 2) {\n const code = bytes[index] | (bytes[index + 1] << 8);\n if ((code >= 32 && code <= 0xd7ff) || code === 9) {\n current += String.fromCharCode(code);\n } else {\n if (current.length >= 3) {\n fragments.push(current);\n }\n current = \"\";\n }\n }\n if (current.length >= 3) {\n fragments.push(current);\n }\n return fragments;\n}\n\nfunction normalizeLegacyText(value: string): string {\n return value.replace(/[\\u0000-\\u001f]+/g, \" \").replace(/\\s+/g, \" \").trim();\n}\n\nfunction hasOleSignature(arrayBuffer: ArrayBuffer): boolean {\n const signature = Array.from(new Uint8Array(arrayBuffer.slice(0, 8)));\n return signature.join(\",\") === \"208,207,17,224,161,177,26,225\";\n}\n\nasync function extractZipImages(\n zip: JSZip,\n pattern: RegExp\n): Promise<Array<{ name: string; src: string }>> {\n const images: Array<{ name: string; src: string }> = [];\n for (const entry of Object.values(zip.files).filter((item) => !item.dir && pattern.test(item.name))) {\n const mimeType = mimeTypeFromPath(entry.name);\n if (!mimeType.startsWith(\"image/\")) {\n continue;\n }\n images.push({\n name: entry.name.split(\"/\").pop() || entry.name,\n src: `data:${mimeType};base64,${await entry.async(\"base64\")}`\n });\n }\n return images;\n}\n\nfunction extractOpenXmlText(xml: string): string[] {\n return [...xml.matchAll(/<a:t>([\\s\\S]*?)<\\/a:t>|<w:t[^>]*>([\\s\\S]*?)<\\/w:t>/g)]\n .map((match) => decodeXml(match[1] || match[2] || \"\").trim())\n .filter(Boolean);\n}\n\nfunction extractWordParagraphs(xml: string): string[] {\n return [...xml.matchAll(/<w:p\\b[\\s\\S]*?<\\/w:p>/g)]\n .map((match) => extractOpenXmlText(match[0]).join(\"\"))\n .map((text) => text.trim())\n .filter(Boolean);\n}\n\nfunction extractOpenDocumentBlocks(xml: string): string[] {\n return [...xml.matchAll(/<(?:text:p|text:h)[^>]*>([\\s\\S]*?)<\\/(?:text:p|text:h)>/g)]\n .map((match) => stripXmlTags(match[1] || \"\"))\n .map((text) => decodeXml(text).trim())\n .filter(Boolean);\n}\n\nfunction stripXmlTags(value: string): string {\n return value\n .replace(/<text:line-break\\s*\\/>/g, \"\\n\")\n .replace(/<text:tab\\s*\\/>/g, \"\\t\")\n .replace(/<[^>]+>/g, \"\");\n}\n\nfunction rtfToText(rtf: string): string {\n return rtf\n .replace(/\\\\'[0-9a-fA-F]{2}/g, \"\")\n .replace(/\\\\par[d]?/g, \"\\n\")\n .replace(/\\\\tab/g, \"\\t\")\n .replace(/\\\\[a-zA-Z]+\\d* ?/g, \"\")\n .replace(/[{}]/g, \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nasync function readTextFromBuffer(arrayBuffer: ArrayBuffer): Promise<string> {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(arrayBuffer);\n}\n\n\nfunction mimeTypeFromPath(path: string): string {\n const extension = path.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n bmp: \"image/bmp\",\n svg: \"image/svg+xml\",\n webp: \"image/webp\"\n };\n return extension ? map[extension] || \"application/octet-stream\" : \"application/octet-stream\";\n}\n\nfunction decodeXml(value: string): string {\n return value\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll(\"&\", \"&\")\n .replaceAll(\""\", '\"')\n .replaceAll(\"'\", \"'\");\n}\n\nfunction sanitizeHtml(html: string): string {\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true },\n ADD_ATTR: [\"target\"]\n });\n}\n","import JSZip from \"jszip\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer } from \"./utils\";\n\nexport function ofdPlugin(): PreviewPlugin {\n return {\n name: \"ofd\",\n match(file) {\n return file.extension === \"ofd\" || file.mimeType === \"application/ofd\";\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-ofd\");\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n ctx.viewport.append(panel);\n let zip: JSZip;\n try {\n zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n } catch (error) {\n panel.append(createOfdFallback(ctx.file.name, url, normalizeOfdError(error)));\n return {\n destroy() {\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n\n const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n const textFragments: string[] = [];\n\n try {\n for (const entry of entries.filter((item) => item.name.endsWith(\".xml\")).slice(0, 40)) {\n const xml = await entry.async(\"text\");\n const matches = [...xml.matchAll(/>([^<>]{2,})</g)]\n .map((match) => match[1]?.trim())\n .filter(Boolean) as string[];\n textFragments.push(...matches);\n }\n } catch (error) {\n panel.append(createOfdFallback(ctx.file.name, url, normalizeOfdError(error)));\n return {\n destroy() {\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n\n const images = await readOfdImages(entries);\n const pages = await readOfdPages(entries, images);\n const section = createSection(\"OFD 基础预览\");\n const note = document.createElement(\"p\");\n note.textContent = pages.length > 0\n ? \"当前版本提取 OFD 页面文本、路径、直线和图片对象,并按 Boundary 坐标生成轻量 SVG 版式预览。复杂字体、签章和颜色空间可后续接入专用 OFD 渲染器。\"\n : \"当前版本提取 OFD 包内 XML 文本和文件结构。版式级渲染可在后续接入专用 OFD 渲染器。\";\n section.append(note);\n section.append(createOfdSummary(entries, pages, images));\n\n if (pages.length > 0) {\n const pagesWrap = document.createElement(\"div\");\n pagesWrap.className = \"ofv-ofd-pages\";\n for (const page of pages) {\n pagesWrap.append(renderOfdPage(page));\n }\n section.append(pagesWrap);\n }\n\n const content = document.createElement(\"pre\");\n content.className = \"ofv-text-block\";\n content.textContent = textFragments.slice(0, 300).join(\"\\n\") || \"未提取到可读文本。\";\n section.append(content);\n\n const list = createSection(`文件结构 ${entries.length}`);\n const ul = document.createElement(\"ul\");\n for (const entry of entries.slice(0, 200)) {\n const li = document.createElement(\"li\");\n li.textContent = entry.name;\n ul.append(li);\n }\n list.append(ul);\n panel.append(section, list);\n\n return {\n destroy() {\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\ntype OfdTextObject = {\n text: string;\n x: number;\n y: number;\n width: number;\n height: number;\n size: number;\n color: string;\n weight: string;\n letterSpacing?: number;\n};\n\ntype OfdPathObject = {\n d: string;\n x: number;\n y: number;\n width: number;\n height: number;\n stroke: string;\n fill: string;\n strokeWidth: number;\n};\n\ntype OfdLineObject = {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n stroke: string;\n strokeWidth: number;\n};\n\ntype OfdImageObject = {\n x: number;\n y: number;\n width: number;\n height: number;\n resourceId: string;\n href?: string;\n};\n\ntype OfdPagePreview = {\n name: string;\n width: number;\n height: number;\n texts: OfdTextObject[];\n paths: OfdPathObject[];\n lines: OfdLineObject[];\n images: OfdImageObject[];\n};\n\nfunction createOfdSummary(entries: JSZip.JSZipObject[], pages: OfdPagePreview[], images: Map<string, string>): HTMLElement {\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-ofd-summary\";\n const xmlEntries = entries.filter((entry) => entry.name.endsWith(\".xml\")).length;\n const textCount = pages.reduce((count, page) => count + page.texts.length, 0);\n const pathCount = pages.reduce((count, page) => count + page.paths.length, 0);\n const lineCount = pages.reduce((count, page) => count + page.lines.length, 0);\n const imageCount = pages.reduce((count, page) => count + page.images.length, 0);\n const textLength = pages.reduce((count, page) => count + page.texts.reduce((inner, item) => inner + item.text.length, 0), 0);\n appendOfdSummary(summary, \"文件\", String(entries.length));\n appendOfdSummary(summary, \"XML\", String(xmlEntries));\n appendOfdSummary(summary, \"页面\", String(pages.length));\n appendOfdSummary(summary, \"文本\", String(textCount));\n appendOfdSummary(summary, \"路径\", String(pathCount));\n appendOfdSummary(summary, \"线条\", String(lineCount));\n appendOfdSummary(summary, \"图片对象\", String(imageCount));\n appendOfdSummary(summary, \"图片资源\", String(uniqueOfdImageResources(images)));\n if (textLength > 0) {\n appendOfdSummary(summary, \"文字长度\", String(textLength));\n }\n const sizes = formatOfdPageSizes(pages);\n if (sizes) {\n appendOfdSummary(summary, \"页面尺寸\", sizes);\n }\n return summary;\n}\n\nfunction appendOfdSummary(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction uniqueOfdImageResources(images: Map<string, string>): number {\n return new Set(images.values()).size;\n}\n\nfunction formatOfdPageSizes(pages: OfdPagePreview[]): string {\n const counts = new Map<string, number>();\n for (const page of pages) {\n const key = `${Math.round(page.width)} x ${Math.round(page.height)}`;\n counts.set(key, (counts.get(key) || 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 4)\n .map(([size, count]) => (count > 1 ? `${size} (${count})` : size))\n .join(\", \");\n}\n\nasync function readOfdPages(\n entries: JSZip.JSZipObject[],\n images: Map<string, string>\n): Promise<OfdPagePreview[]> {\n const pages: OfdPagePreview[] = [];\n const pageEntries = entries\n .filter((entry) => /(^|\\/)Pages\\/Page_[^/]+\\/Content\\.xml$/i.test(entry.name) || /(^|\\/)Page_[^/]+\\/Content\\.xml$/i.test(entry.name))\n .slice(0, 80);\n for (const entry of pageEntries) {\n const xml = await entry.async(\"text\");\n const page = parseOfdPage(entry.name, xml, images);\n if (page.texts.length > 0 || page.paths.length > 0 || page.lines.length > 0 || page.images.length > 0) {\n pages.push(page);\n }\n }\n return pages;\n}\n\nfunction parseOfdPage(name: string, xml: string, images: Map<string, string>): OfdPagePreview {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return { name, width: 210, height: 297, texts: [], paths: [], lines: [], images: [] };\n }\n const pageSize = parseOfdPageSize(doc);\n const textObjects = Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"TextObject\");\n const texts = textObjects.flatMap((element) => parseOfdTextObject(element));\n const paths = Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"PathObject\")\n .flatMap((element) => parseOfdPathObject(element));\n const lines = Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"LineObject\")\n .flatMap((element) => parseOfdLineObject(element));\n const imageObjects = Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"ImageObject\")\n .flatMap((element) => parseOfdImageObject(element, images));\n const bounds = [\n ...texts.map((item) => ({ x: item.x, y: item.y, width: item.width, height: item.height })),\n ...paths.map((item) => ({ x: item.x, y: item.y, width: item.width, height: item.height })),\n ...lines.map((item) => ({\n x: Math.min(item.x1, item.x2),\n y: Math.min(item.y1, item.y2),\n width: Math.abs(item.x2 - item.x1),\n height: Math.abs(item.y2 - item.y1)\n })),\n ...imageObjects.map((item) => ({ x: item.x, y: item.y, width: item.width, height: item.height }))\n ];\n const width = Math.max(pageSize.width, ...bounds.map((item) => item.x + item.width + 12));\n const height = Math.max(pageSize.height, ...bounds.map((item) => item.y + item.height + 12));\n return { name, width, height, texts, paths, lines, images: imageObjects };\n}\n\nfunction parseOfdTextObject(element: Element): OfdTextObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const size = finiteNumber(getOfdAttribute(element, \"Size\"), Math.max(4, boundary.height || 5));\n const color = parseOfdColor(element, \"#111827\");\n const weight = finiteNumber(getOfdAttribute(element, \"Weight\"), 400) >= 600 ? \"700\" : \"400\";\n const letterSpacing = getOfdAttribute(element, \"DeltaX\") ? 0.5 : undefined;\n const textCodes = Array.from(element.getElementsByTagName(\"*\")).filter((child) => child.localName === \"TextCode\");\n if (textCodes.length === 0) {\n return [];\n }\n return textCodes.map((code) => {\n const x = boundary.x + finiteNumber(getOfdAttribute(code, \"X\"), 0);\n const y = boundary.y + finiteNumber(getOfdAttribute(code, \"Y\"), 0);\n return {\n text: code.textContent?.trim() || \"\",\n x,\n y,\n width: boundary.width,\n height: boundary.height,\n size,\n color,\n weight,\n letterSpacing\n };\n }).filter((item) => item.text);\n}\n\nfunction parseOfdPathObject(element: Element): OfdPathObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const commands = Array.from(element.getElementsByTagName(\"*\")).filter(\n (child) => child.localName === \"AbbreviatedData\" || child.localName === \"PathData\"\n );\n const raw = commands.map((child) => child.textContent || \"\").join(\" \").trim();\n if (!raw) {\n return [];\n }\n return [\n {\n d: normalizeOfdPathData(raw),\n x: boundary.x,\n y: boundary.y,\n width: boundary.width,\n height: boundary.height,\n stroke: parseOfdColor(element, \"#334155\", \"StrokeColor\"),\n fill: parseOfdFill(element),\n strokeWidth: finiteNumber(getOfdAttribute(element, \"LineWidth\"), 1)\n }\n ];\n}\n\nfunction parseOfdLineObject(element: Element): OfdLineObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const start = parsePoint(getOfdAttribute(element, \"StartPoint\"), { x: 0, y: 0 });\n const end = parsePoint(getOfdAttribute(element, \"EndPoint\"), {\n x: boundary.width,\n y: boundary.height\n });\n return [\n {\n x1: boundary.x + start.x,\n y1: boundary.y + start.y,\n x2: boundary.x + end.x,\n y2: boundary.y + end.y,\n stroke: parseOfdColor(element, \"#334155\"),\n strokeWidth: finiteNumber(getOfdAttribute(element, \"LineWidth\"), 1)\n }\n ];\n}\n\nfunction parseOfdImageObject(element: Element, images: Map<string, string>): OfdImageObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const resourceId = getOfdAttribute(element, \"ResourceID\") || getOfdAttribute(element, \"ResourceId\") || \"\";\n return [\n {\n x: boundary.x,\n y: boundary.y,\n width: boundary.width || 32,\n height: boundary.height || 32,\n resourceId,\n href: images.get(resourceId)\n }\n ];\n}\n\nfunction renderOfdPage(page: OfdPagePreview): HTMLElement {\n const figure = document.createElement(\"figure\");\n figure.className = \"ofv-ofd-page\";\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"viewBox\", `0 0 ${page.width} ${page.height}`);\n svg.setAttribute(\"role\", \"img\");\n svg.setAttribute(\"aria-label\", page.name);\n\n const paper = document.createElementNS(svg.namespaceURI, \"rect\");\n paper.setAttribute(\"x\", \"0\");\n paper.setAttribute(\"y\", \"0\");\n paper.setAttribute(\"width\", String(page.width));\n paper.setAttribute(\"height\", String(page.height));\n paper.setAttribute(\"fill\", \"white\");\n svg.append(paper);\n\n for (const item of page.images) {\n if (item.href) {\n const image = document.createElementNS(svg.namespaceURI, \"image\");\n image.setAttribute(\"x\", String(item.x));\n image.setAttribute(\"y\", String(item.y));\n image.setAttribute(\"width\", String(item.width));\n image.setAttribute(\"height\", String(item.height));\n image.setAttribute(\"href\", item.href);\n image.setAttribute(\"preserveAspectRatio\", \"xMidYMid meet\");\n svg.append(image);\n } else {\n const placeholder = document.createElementNS(svg.namespaceURI, \"rect\");\n placeholder.setAttribute(\"x\", String(item.x));\n placeholder.setAttribute(\"y\", String(item.y));\n placeholder.setAttribute(\"width\", String(item.width));\n placeholder.setAttribute(\"height\", String(item.height));\n placeholder.setAttribute(\"fill\", \"#f8fafc\");\n placeholder.setAttribute(\"stroke\", \"#94a3b8\");\n placeholder.setAttribute(\"stroke-dasharray\", \"4 3\");\n svg.append(placeholder);\n }\n }\n\n for (const item of page.paths) {\n const path = document.createElementNS(svg.namespaceURI, \"path\");\n path.setAttribute(\"d\", item.d);\n path.setAttribute(\"transform\", `translate(${item.x} ${item.y})`);\n path.setAttribute(\"fill\", item.fill);\n path.setAttribute(\"stroke\", item.stroke);\n path.setAttribute(\"stroke-width\", String(item.strokeWidth));\n svg.append(path);\n }\n\n for (const item of page.lines) {\n const line = document.createElementNS(svg.namespaceURI, \"line\");\n line.setAttribute(\"x1\", String(item.x1));\n line.setAttribute(\"y1\", String(item.y1));\n line.setAttribute(\"x2\", String(item.x2));\n line.setAttribute(\"y2\", String(item.y2));\n line.setAttribute(\"stroke\", item.stroke);\n line.setAttribute(\"stroke-width\", String(item.strokeWidth));\n line.setAttribute(\"stroke-linecap\", \"round\");\n svg.append(line);\n }\n\n for (const item of page.texts) {\n const text = document.createElementNS(svg.namespaceURI, \"text\");\n text.setAttribute(\"x\", String(item.x));\n text.setAttribute(\"y\", String(item.y + item.size));\n text.setAttribute(\"font-size\", String(item.size));\n text.setAttribute(\"fill\", item.color);\n text.setAttribute(\"font-weight\", item.weight);\n if (item.letterSpacing !== undefined) {\n text.setAttribute(\"letter-spacing\", String(item.letterSpacing));\n }\n text.textContent = item.text;\n svg.append(text);\n }\n\n const caption = document.createElement(\"figcaption\");\n caption.textContent = `${page.name} · ${page.texts.length} text · ${page.paths.length} path · ${page.lines.length} line · ${page.images.length} image`;\n figure.append(svg, caption);\n return figure;\n}\n\nasync function readOfdImages(entries: JSZip.JSZipObject[]): Promise<Map<string, string>> {\n const images = new Map<string, string>();\n for (const entry of entries.filter((item) => /\\.(?:png|jpe?g|gif|bmp|webp)$/i.test(item.name)).slice(0, 80)) {\n const id = entry.name.split(\"/\").pop()?.replace(/\\.[^.]+$/, \"\") || entry.name;\n const mimeType = mimeTypeFromPath(entry.name);\n if (!mimeType.startsWith(\"image/\")) {\n continue;\n }\n const base64 = await entry.async(\"base64\");\n const href = `data:${mimeType};base64,${base64}`;\n images.set(id, href);\n images.set(entry.name, href);\n images.set(entry.name.split(\"/\").pop() || entry.name, href);\n }\n return images;\n}\n\nfunction parseOfdPageSize(doc: Document): { width: number; height: number } {\n const physicalBox = Array.from(doc.getElementsByTagName(\"*\")).find((element) => element.localName === \"PhysicalBox\");\n if (physicalBox?.textContent) {\n const box = parseBoundary(physicalBox.textContent);\n if (box.width > 0 && box.height > 0) {\n return { width: box.width, height: box.height };\n }\n }\n return { width: 210, height: 297 };\n}\n\nfunction parseOfdColor(element: Element, fallback: string, preferredLocalName = \"FillColor\"): string {\n const colorElement = findOfdChild(element, preferredLocalName) || findOfdChild(element, \"StrokeColor\") || findOfdChild(element, \"FillColor\");\n const value = colorElement ? getOfdAttribute(colorElement, \"Value\") : null;\n if (!value) {\n return fallback;\n }\n const parts = value.trim().split(/\\s+/).map((part) => Number(part));\n if (parts.length >= 3 && parts.every((part) => Number.isFinite(part))) {\n return `rgb(${parts.slice(0, 3).map((part) => Math.max(0, Math.min(255, part))).join(\" \")})`;\n }\n return fallback;\n}\n\nfunction parseOfdFill(element: Element): string {\n const fillElement = findOfdChild(element, \"FillColor\");\n return fillElement ? parseOfdColor(element, \"transparent\", \"FillColor\") : \"transparent\";\n}\n\nfunction findOfdChild(element: Element, localName: string): Element | undefined {\n return Array.from(element.children).find((child) => child.localName === localName);\n}\n\nfunction parsePoint(value: string | null, fallback: { x: number; y: number }): { x: number; y: number } {\n const parts = (value || \"\").trim().split(/\\s+/).map((part) => Number(part));\n return {\n x: Number.isFinite(parts[0]) ? parts[0] : fallback.x,\n y: Number.isFinite(parts[1]) ? parts[1] : fallback.y\n };\n}\n\nfunction normalizeOfdPathData(value: string): string {\n return value\n .replace(/\\bM\\s+/gi, \"M \")\n .replace(/\\bL\\s+/gi, \"L \")\n .replace(/\\bC\\s+/gi, \"C \")\n .replace(/\\bQ\\s+/gi, \"Q \")\n .replace(/\\bA\\s+/gi, \"A \")\n .replace(/\\bB\\s+/gi, \"C \")\n .replace(/\\bZ\\b/gi, \"Z\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction mimeTypeFromPath(path: string): string {\n const extension = path.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n bmp: \"image/bmp\",\n webp: \"image/webp\"\n };\n return extension ? map[extension] || \"application/octet-stream\" : \"application/octet-stream\";\n}\n\nfunction parseBoundary(value: string | null): { x: number; y: number; width: number; height: number } {\n const parts = (value || \"\").trim().split(/\\s+/).map((part) => Number(part));\n return {\n x: Number.isFinite(parts[0]) ? parts[0] : 0,\n y: Number.isFinite(parts[1]) ? parts[1] : 0,\n width: Number.isFinite(parts[2]) ? parts[2] : 0,\n height: Number.isFinite(parts[3]) ? parts[3] : 0\n };\n}\n\nfunction getOfdAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction finiteNumber(value: string | null, fallback: number): number {\n const parsed = value === null ? Number.NaN : Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction createOfdFallback(fileName: string, url: string, detail: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"OFD 解析失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = `${detail}。可下载 ${fileName} 后使用本地 OFD 阅读器查看。`;\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载 OFD\";\n\n fallback.append(title, meta, download);\n return fallback;\n}\n\nfunction normalizeOfdError(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return \"文件可能已损坏,或不是有效的 OFD 包\";\n}\n","import JSZip from \"jszip\";\nimport pako from \"pako\";\nimport type { PreviewPlugin, PreviewFile } from \"../types\";\nimport { normalizeFile } from \"../detect\";\nimport { fallbackPlugin } from \"./fallback\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport { appendMeta, createPanel, createSection, readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst archiveExtensions = new Set([\"zip\", \"rar\", \"7z\", \"tar\", \"gz\", \"tgz\", \"bz2\", \"xz\"]);\nconst archiveMimeTypes = new Set([\n \"application/zip\",\n \"application/x-zip-compressed\",\n \"application/vnd.rar\",\n \"application/x-rar-compressed\",\n \"application/x-7z-compressed\",\n \"application/x-tar\",\n \"application/gzip\",\n \"application/x-gzip\",\n \"application/x-bzip2\",\n \"application/x-xz\"\n]);\nconst archiveMimeFormatMap: Record<string, string> = {\n \"application/zip\": \"zip\",\n \"application/x-zip-compressed\": \"zip\",\n \"application/vnd.rar\": \"rar\",\n \"application/x-rar-compressed\": \"rar\",\n \"application/x-7z-compressed\": \"7z\",\n \"application/x-tar\": \"tar\",\n \"application/gzip\": \"gz\",\n \"application/x-gzip\": \"gz\",\n \"application/x-bzip2\": \"bz2\",\n \"application/x-xz\": \"xz\"\n};\n\ninterface ArchiveEntry {\n name: string;\n unsafeName?: string;\n size: number;\n dir: boolean;\n read: () => Promise<ArrayBuffer>;\n}\n\ninterface ArchiveProbe {\n format: string;\n valid: boolean;\n error?: string;\n meta: Array<{ label: string; value: string }>;\n entries: Array<{ name: string; size?: number; packedSize?: number }>;\n note: string;\n}\n\nexport function archivePlugin(): PreviewPlugin {\n return {\n name: \"archive\",\n match(file) {\n return archiveExtensions.has(file.extension) || archiveMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const panel = createPanel(\"ofv-archive\");\n ctx.viewport.append(panel);\n\n const ext = resolveFormat(ctx.file, archiveMimeFormatMap).toLowerCase();\n let archiveEntries: ArchiveEntry[] = [];\n let isEncrypted = false;\n let parseError: string | null = null;\n let archiveProbe: ArchiveProbe | null = null;\n\n // 1. Parse different archive formats\n try {\n if (ext === \"zip\") {\n try {\n const zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n archiveEntries = Object.values(zip.files).map((entry) => ({\n name: entry.name,\n unsafeName: (entry as any).unsafeOriginalName,\n size: (entry as any)._data?.uncompressedSize || 0,\n dir: entry.dir,\n read: () => entry.async(\"arraybuffer\")\n }));\n } catch (zipErr: any) {\n // Check for encryption errors\n if (\n zipErr.message &&\n (zipErr.message.includes(\"encrypted\") ||\n zipErr.message.includes(\"password\") ||\n zipErr.message.includes(\"protected\"))\n ) {\n isEncrypted = true;\n } else {\n throw zipErr;\n }\n }\n } else if (ext === \"tar\") {\n archiveEntries = untar(await readArrayBuffer(ctx.file));\n } else if (ext === \"gz\" || ext === \"tgz\" || ext === \"tar.gz\") {\n const u8 = new Uint8Array(await readArrayBuffer(ctx.file));\n const decompressed = pako.ungzip(u8);\n const originalName = ctx.file.name.endsWith(\".gz\")\n ? ctx.file.name.slice(0, -3)\n : ctx.file.name.endsWith(\".tgz\")\n ? ctx.file.name.slice(0, -4) + \".tar\"\n : ctx.file.name;\n\n if (ext === \"tgz\" || ext === \"tar.gz\" || originalName.endsWith(\".tar\")) {\n archiveEntries = untar(decompressed.buffer);\n } else {\n // Single decompressed file\n archiveEntries = [\n {\n name: originalName,\n size: decompressed.byteLength,\n dir: false,\n read: async () => decompressed.buffer\n }\n ];\n }\n } else if ([\"rar\", \"7z\", \"bz2\", \"xz\"].includes(ext)) {\n archiveProbe = probeArchiveHeader(await readArrayBuffer(ctx.file), ext);\n } else {\n parseError = `该格式 (.${ext.toUpperCase()}) 目前暂不支持直接在浏览器端在线解压和目录预览。`;\n }\n } catch (err: any) {\n parseError = `压缩包解析失败:${err.message || err}`;\n }\n\n // 2. Encrypted Archive Prompt UI\n if (isEncrypted) {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n \n const title = document.createElement(\"strong\");\n title.textContent = \"该压缩包已被加密保护\";\n \n const meta = document.createElement(\"span\");\n meta.textContent = \"为了您的数据安全,本预览器不支持直接在线解密。请下载文件后在本地输入密码解压。\";\n \n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n \n fallback.append(title, meta, download);\n panel.append(fallback);\n ctx.viewport.classList.add(\"ofv-center\");\n \n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n\n if (archiveProbe) {\n renderArchiveProbe(panel, archiveProbe, ctx.file.name, url);\n return {\n destroy() {\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n\n // 3. Fallback Unsupported message (RAR, 7z, etc.)\n if (parseError) {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n \n const title = document.createElement(\"strong\");\n title.textContent = parseError;\n \n const meta = document.createElement(\"span\");\n meta.textContent = \"建议下载视频/文档等文件至本地查看,或使用原生解压工具提取内容。\";\n \n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载压缩包\";\n \n fallback.append(title, meta, download);\n panel.append(fallback);\n ctx.viewport.classList.add(\"ofv-center\");\n\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n\n // 4. Split Layout UI for interactive preview\n const layout = document.createElement(\"div\");\n layout.className = \"ofv-archive-layout\";\n\n const sidebar = document.createElement(\"div\");\n sidebar.className = \"ofv-archive-sidebar\";\n\n const header = document.createElement(\"div\");\n header.className = \"ofv-archive-header\";\n header.textContent = `文件列表 (${archiveEntries.filter(e => !e.dir).length})`;\n sidebar.append(header);\n\n const tree = document.createElement(\"div\");\n tree.className = \"ofv-archive-tree\";\n sidebar.append(tree);\n\n const mainPanel = document.createElement(\"div\");\n mainPanel.className = \"ofv-archive-main\";\n\n layout.append(sidebar, mainPanel);\n panel.append(layout);\n\n let currentSubInstance: any = null;\n\n // Render default metadata summary\n const showDefaultSummary = () => {\n mainPanel.replaceChildren();\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-archive-info\";\n \n const heading = document.createElement(\"h3\");\n heading.textContent = ctx.file.name;\n\n const info = document.createElement(\"div\");\n info.className = \"ofv-archive-info-meta\";\n \n const fileCount = archiveEntries.filter(e => !e.dir).length;\n const dirCount = archiveEntries.filter(e => e.dir).length;\n \n appendArchiveInfo(info, \"格式类型\", `.${ext.toUpperCase()} 压缩文件`);\n appendArchiveInfo(info, \"包含文件数\", `${fileCount} 个`);\n appendArchiveInfo(info, \"包含目录数\", `${dirCount} 个`);\n appendArchiveInfo(info, \"操作提示\", \"请点击左侧栏中的文件进行联动预览。\");\n \n summary.append(heading, info, createArchiveSummary(archiveEntries));\n mainPanel.append(summary);\n };\n\n showDefaultSummary();\n\n // Filter and render items (max 500 to keep DOM lightweight)\n const visibleEntries = archiveEntries.filter(e => !e.dir).slice(0, 500);\n let destroyed = false;\n let renderToken = 0;\n\n visibleEntries.forEach((entry) => {\n const item = document.createElement(\"button\");\n item.className = \"ofv-archive-item\";\n item.type = \"button\";\n item.title = entry.name;\n\n const icon = document.createElement(\"span\");\n icon.className = \"ofv-archive-item-icon\";\n icon.textContent = getIcon(entry.name, entry.dir);\n\n const name = document.createElement(\"span\");\n name.className = \"ofv-archive-item-name\";\n name.textContent = entry.name;\n name.title = entry.name;\n\n item.append(icon, name);\n tree.append(item);\n\n item.addEventListener(\"click\", async () => {\n if (destroyed) {\n return;\n }\n const token = ++renderToken;\n // Highlight active item\n sidebar.querySelectorAll(\".ofv-archive-item\").forEach((el) => {\n el.classList.remove(\"is-active\");\n el.removeAttribute(\"aria-current\");\n });\n item.classList.add(\"is-active\");\n item.setAttribute(\"aria-current\", \"true\");\n\n // Cleanup previous sub-preview\n if (currentSubInstance) {\n currentSubInstance.destroy();\n currentSubInstance = null;\n }\n\n // Show loading state\n mainPanel.replaceChildren(createArchiveLoading(entry.name.split(\"/\").pop() || entry.name));\n\n try {\n let buffer = await entry.read();\n if (destroyed || token !== renderToken) {\n return;\n }\n const subName = entry.name.split(\"/\").pop() || entry.name;\n const subExt = subName.split(\".\").pop()?.toLowerCase() || \"\";\n\n // Shapefile components linkage mechanism:\n // Combine adjacent .dbf, .shx, and .prj files into a single ZIP buffer in memory\n if (subExt === \"shp\") {\n const basePath = entry.name.slice(0, -4);\n const dbfEntry = archiveEntries.find(\n (e) => e.name.toLowerCase() === basePath.toLowerCase() + \".dbf\"\n );\n const shxEntry = archiveEntries.find(\n (e) => e.name.toLowerCase() === basePath.toLowerCase() + \".shx\"\n );\n if (dbfEntry && shxEntry) {\n const prjEntry = archiveEntries.find(\n (e) => e.name.toLowerCase() === basePath.toLowerCase() + \".prj\"\n );\n const newZip = new JSZip();\n newZip.file(subName, buffer);\n newZip.file(dbfEntry.name.split(\"/\").pop()!, await dbfEntry.read());\n newZip.file(shxEntry.name.split(\"/\").pop()!, await shxEntry.read());\n if (prjEntry) {\n newZip.file(prjEntry.name.split(\"/\").pop()!, await prjEntry.read());\n }\n buffer = await newZip.generateAsync({ type: \"arraybuffer\" });\n if (destroyed || token !== renderToken) {\n return;\n }\n }\n }\n\n const subContainer = document.createElement(\"div\");\n subContainer.style.cssText = \"width: 100%; height: 100%; position: relative; display: flex; flex-direction: column;\";\n mainPanel.replaceChildren(subContainer);\n\n const subViewport = document.createElement(\"div\");\n subViewport.className = \"ofv-viewport\";\n subViewport.style.cssText = \"flex: 1; width: 100%; height: 100%; position: relative; overflow: auto;\";\n subContainer.append(subViewport);\n\n const subFile: PreviewFile = await normalizeFile(buffer, subName);\n\n const plugins = [...(ctx.options.plugins || []), fallbackPlugin()];\n let matchedPlugin = await findSubPreviewPlugin(plugins, subFile);\n if (destroyed || token !== renderToken) {\n return;\n }\n if (matchedPlugin.name === \"archive\") {\n matchedPlugin = fallbackPlugin();\n }\n\n let previewError: Error | undefined;\n const nextSubInstance = await Promise.resolve()\n .then(() =>\n matchedPlugin.render({\n host: ctx.host,\n viewport: subViewport,\n file: subFile,\n size: { width: subViewport.clientWidth || 600, height: subViewport.clientHeight || 400 },\n options: ctx.options,\n setLoading: () => {},\n setError: (err) => {\n previewError = err instanceof Error ? err : new Error(String(err));\n subViewport.replaceChildren(createInlineError(\"文件预览失败\", previewError.message));\n }\n })\n )\n .catch((error: unknown) => {\n previewError = error instanceof Error ? error : new Error(String(error));\n subViewport.replaceChildren(createInlineError(\"文件预览失败\", previewError.message));\n return undefined;\n });\n if (destroyed || token !== renderToken) {\n nextSubInstance?.destroy();\n return;\n }\n if (nextSubInstance && !previewError) {\n currentSubInstance = nextSubInstance;\n } else if (nextSubInstance) {\n nextSubInstance.destroy();\n }\n } catch (err: any) {\n if (destroyed || token !== renderToken) {\n return;\n }\n mainPanel.replaceChildren(createInlineError(\"解压加载失败\", String(err.message || err)));\n }\n });\n });\n\n return {\n resize(size) {\n currentSubInstance?.resize?.(size);\n },\n destroy() {\n destroyed = true;\n renderToken += 1;\n if (currentSubInstance) {\n currentSubInstance.destroy();\n }\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n };\n}\n\nasync function findSubPreviewPlugin(plugins: PreviewPlugin[], file: PreviewFile): Promise<PreviewPlugin> {\n for (const plugin of plugins) {\n if (await plugin.match(file)) {\n return plugin;\n }\n }\n return fallbackPlugin();\n}\n\nfunction createInlineError(titleText: string, detailText: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = titleText;\n const detail = document.createElement(\"span\");\n detail.textContent = detailText;\n fallback.append(title, detail);\n return fallback;\n}\n\nfunction appendArchiveInfo(parent: HTMLElement, label: string, value: string): void {\n const row = document.createElement(\"div\");\n const key = document.createElement(\"strong\");\n key.textContent = `${label}:`;\n row.append(key, document.createTextNode(value));\n parent.append(row);\n}\n\nfunction createArchiveSummary(entries: ArchiveEntry[]): HTMLElement {\n const files = entries.filter((entry) => !entry.dir);\n const summary = document.createElement(\"dl\");\n summary.className = \"ofv-archive-summary\";\n const totalSize = files.reduce((sum, entry) => sum + entry.size, 0);\n const largest = files.reduce<ArchiveEntry | undefined>((current, entry) => (!current || entry.size > current.size ? entry : current), undefined);\n appendArchiveSummary(summary, \"总解压大小\", formatBytes(totalSize));\n appendArchiveSummary(summary, \"最大文件\", largest ? `${largest.name} · ${formatBytes(largest.size)}` : \"无\");\n appendArchiveSummary(summary, \"类型分布\", formatArchiveExtensions(files));\n appendArchiveSummary(summary, \"可预览条目\", String(files.slice(0, 500).length));\n appendArchiveSummary(summary, \"风险路径\", String(files.filter((entry) => isRiskyArchivePath(entry.unsafeName || entry.name)).length));\n return summary;\n}\n\nfunction appendArchiveSummary(parent: HTMLElement, label: string, value: string): void {\n const key = document.createElement(\"dt\");\n key.textContent = label;\n const content = document.createElement(\"dd\");\n content.textContent = value;\n parent.append(key, content);\n}\n\nfunction formatArchiveExtensions(entries: ArchiveEntry[]): string {\n const counts = new Map<string, number>();\n for (const entry of entries) {\n const name = entry.name.split(\"/\").pop() || entry.name;\n const index = name.lastIndexOf(\".\");\n const extension = index > 0 ? name.slice(index + 1).toLowerCase() : \"(无扩展名)\";\n counts.set(extension, (counts.get(extension) || 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, 6)\n .map(([extension, count]) => `${extension} ${count}`)\n .join(\", \") || \"无\";\n}\n\nfunction isRiskyArchivePath(name: string): boolean {\n return name.startsWith(\"/\") || /^[A-Za-z]:[\\\\/]/.test(name) || name.split(/[\\\\/]+/).includes(\"..\");\n}\n\nfunction createArchiveLoading(fileName: string): HTMLElement {\n const loading = document.createElement(\"div\");\n loading.className = \"ofv-archive-loading\";\n const spinner = document.createElement(\"div\");\n spinner.className = \"ofv-archive-loading-spinner\";\n const text = document.createElement(\"span\");\n text.textContent = `正在解压并加载 [${fileName}]...`;\n loading.append(spinner, text);\n return loading;\n}\n\nfunction renderArchiveProbe(panel: HTMLElement, probe: ArchiveProbe, fileName: string, url: string): void {\n const section = createSection(`${probe.format} 结构预览`);\n const note = document.createElement(\"p\");\n note.textContent = probe.note;\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-archive-probe-meta\";\n appendArchiveInfo(meta, \"文件\", fileName);\n appendArchiveInfo(meta, \"格式\", probe.format);\n for (const item of probe.meta) {\n appendArchiveInfo(meta, item.label, item.value);\n }\n\n const download = document.createElement(\"a\");\n download.className = \"ofv-asset-download\";\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载压缩包\";\n\n section.append(note, meta, download);\n\n if (!probe.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = probe.error || \"压缩包头信息无法识别。\";\n section.append(error);\n }\n\n if (probe.entries.length > 0) {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-table-scroll ofv-archive-probe-table\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"文件\", \"原始大小\", \"压缩大小\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const entry of probe.entries.slice(0, 200)) {\n const tr = document.createElement(\"tr\");\n for (const value of [\n entry.name,\n entry.size === undefined ? \"未知\" : formatBytes(entry.size),\n entry.packedSize === undefined ? \"未知\" : formatBytes(entry.packedSize)\n ]) {\n const td = document.createElement(\"td\");\n td.textContent = value;\n tr.append(td);\n }\n tbody.append(tr);\n }\n table.append(thead, tbody);\n wrapper.append(table);\n section.append(wrapper);\n }\n\n panel.append(section);\n}\n\nfunction probeArchiveHeader(arrayBuffer: ArrayBuffer, extension: string): ArchiveProbe {\n const bytes = new Uint8Array(arrayBuffer);\n if (extension === \"rar\") {\n return probeRar(bytes);\n }\n if (extension === \"7z\") {\n return probe7z(bytes);\n }\n if (extension === \"bz2\") {\n return probeBzip2(bytes);\n }\n if (extension === \"xz\") {\n return probeXz(bytes);\n }\n return {\n format: extension.toUpperCase(),\n valid: false,\n error: \"暂不支持该压缩格式的头信息解析。\",\n meta: [],\n entries: [],\n note: \"当前仅提供压缩包识别和下载入口。\"\n };\n}\n\nfunction probeRar(bytes: Uint8Array): ArchiveProbe {\n const rar4 = bytes.length >= 7 && bytes[0] === 0x52 && bytes[1] === 0x61 && bytes[2] === 0x72 && bytes[3] === 0x21 && bytes[4] === 0x1a && bytes[5] === 0x07 && bytes[6] === 0x00;\n const rar5 = bytes.length >= 8 && bytes[0] === 0x52 && bytes[1] === 0x61 && bytes[2] === 0x72 && bytes[3] === 0x21 && bytes[4] === 0x1a && bytes[5] === 0x07 && bytes[6] === 0x01 && bytes[7] === 0x00;\n const entries = rar4 ? parseRar4Entries(bytes) : [];\n return {\n format: \"RAR\",\n valid: rar4 || rar5,\n error: rar4 || rar5 ? undefined : \"缺少 RAR signature。\",\n meta: [\n { label: \"版本\", value: rar5 ? \"RAR5\" : rar4 ? \"RAR4\" : \"未知\" },\n { label: \"签名\", value: byteSignature(bytes) },\n { label: \"可见条目\", value: String(entries.length) }\n ],\n entries,\n note: rar4\n ? \"当前轻量读取 RAR4 未加密文件头,用于目录确认;实际解压仍建议接入 unrar WASM 或本地工具。\"\n : \"当前识别 RAR 容器和版本;RAR5 目录解析需要专用解码器。\"\n };\n}\n\nfunction parseRar4Entries(bytes: Uint8Array): ArchiveProbe[\"entries\"] {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const entries: ArchiveProbe[\"entries\"] = [];\n let offset = 7;\n while (offset + 7 <= bytes.length && entries.length < 200) {\n const type = bytes[offset + 2];\n const flags = view.getUint16(offset + 3, true);\n let headerSize = view.getUint16(offset + 5, true);\n if (headerSize < 7 || offset + headerSize > bytes.length) {\n break;\n }\n if ((flags & 0x8000) !== 0) {\n if (offset + 11 > bytes.length) {\n break;\n }\n headerSize += view.getUint32(offset + 7, true);\n }\n if (type === 0x74 && offset + 32 <= bytes.length) {\n const packedSize = view.getUint32(offset + 7, true);\n const unpackedSize = view.getUint32(offset + 11, true);\n const nameSize = view.getUint16(offset + 26, true);\n const nameOffset = offset + 32;\n const nameEnd = Math.min(nameOffset + nameSize, offset + headerSize, bytes.length);\n const nameBytes = bytes.slice(nameOffset, nameEnd);\n const name = new TextDecoder(\"latin1\").decode(nameBytes).replace(/\\0.*$/, \"\");\n if (name) {\n entries.push({ name, size: unpackedSize, packedSize });\n }\n }\n offset += headerSize;\n }\n return entries;\n}\n\nfunction probe7z(bytes: Uint8Array): ArchiveProbe {\n const valid = bytes.length >= 32 && bytes[0] === 0x37 && bytes[1] === 0x7a && bytes[2] === 0xbc && bytes[3] === 0xaf && bytes[4] === 0x27 && bytes[5] === 0x1c;\n const meta: ArchiveProbe[\"meta\"] = [{ label: \"签名\", value: byteSignature(bytes) }];\n if (valid) {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n meta.push({ label: \"版本\", value: `${bytes[6]}.${bytes[7]}` });\n meta.push({ label: \"Next header offset\", value: String(readUint64Le(view, 12)) });\n meta.push({ label: \"Next header size\", value: String(readUint64Le(view, 20)) });\n meta.push({ label: \"Next header CRC\", value: `0x${view.getUint32(28, true).toString(16).toUpperCase()}` });\n }\n return {\n format: \"7Z\",\n valid,\n error: valid ? undefined : \"缺少 7z signature。\",\n meta,\n entries: [],\n note: \"当前识别 7z 容器和 next header 边界;目录和解压需要 LZMA/7z 专用解码器。\"\n };\n}\n\nfunction probeBzip2(bytes: Uint8Array): ArchiveProbe {\n const valid = bytes.length >= 4 && bytes[0] === 0x42 && bytes[1] === 0x5a && bytes[2] === 0x68 && bytes[3] >= 0x31 && bytes[3] <= 0x39;\n return {\n format: \"BZIP2\",\n valid,\n error: valid ? undefined : \"缺少 BZh magic header。\",\n meta: [\n { label: \"签名\", value: byteSignature(bytes) },\n { label: \"块大小\", value: valid ? `${String.fromCharCode(bytes[3])}00 KB` : \"未知\" }\n ],\n entries: [],\n note: \"BZIP2 通常是单文件压缩流,本预览器当前展示容器头信息;解压可后续接入 bzip2 解码器。\"\n };\n}\n\nfunction probeXz(bytes: Uint8Array): ArchiveProbe {\n const valid = bytes.length >= 6 && bytes[0] === 0xfd && bytes[1] === 0x37 && bytes[2] === 0x7a && bytes[3] === 0x58 && bytes[4] === 0x5a && bytes[5] === 0x00;\n return {\n format: \"XZ\",\n valid,\n error: valid ? undefined : \"缺少 XZ magic header。\",\n meta: [\n { label: \"签名\", value: byteSignature(bytes) },\n { label: \"Stream flags\", value: bytes.length >= 8 ? `0x${bytes[6].toString(16).padStart(2, \"0\").toUpperCase()} 0x${bytes[7].toString(16).padStart(2, \"0\").toUpperCase()}` : \"未知\" }\n ],\n entries: [],\n note: \"XZ 通常是单文件 LZMA2 压缩流,本预览器当前展示容器头信息;解压可后续接入 xz/lzma 解码器。\"\n };\n}\n\nfunction readUint64Le(view: DataView, offset: number): bigint {\n return BigInt(view.getUint32(offset, true)) | (BigInt(view.getUint32(offset + 4, true)) << 32n);\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction byteSignature(bytes: Uint8Array): string {\n if (bytes.length === 0) {\n return \"空文件\";\n }\n const ascii = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 16))).replace(/[^\\x20-\\x7E]/g, \".\");\n const hex = Array.from(bytes.slice(0, Math.min(bytes.length, 8)))\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \");\n return `${ascii} (${hex})`;\n}\n\n// 5. Lightweight TAR parser\nfunction untar(arrayBuffer: ArrayBuffer): ArchiveEntry[] {\n const entries: ArchiveEntry[] = [];\n const u8 = new Uint8Array(arrayBuffer);\n let offset = 0;\n\n const readString = (start: number, length: number): string => {\n let end = start;\n while (end < start + length && u8[end] !== 0) {\n end++;\n }\n return new TextDecoder().decode(u8.subarray(start, end)).trim();\n };\n\n while (offset + 512 <= arrayBuffer.byteLength) {\n const magic = readString(offset + 257, 6);\n if (magic !== \"ustar\" && magic !== \"ustar\\0\") {\n let allZero = true;\n for (let i = 0; i < 512; i++) {\n if (u8[offset + i] !== 0) {\n allZero = false;\n break;\n }\n }\n if (allZero) {\n break; // End of archive\n }\n break;\n }\n\n const name = readString(offset, 100);\n const prefix = readString(offset + 345, 155);\n const fullName = prefix ? `${prefix}/${name}` : name;\n\n const sizeStr = readString(offset + 124, 12);\n const size = parseInt(sizeStr, 8) || 0;\n const typeflag = readString(offset + 156, 1);\n const dir = typeflag === \"5\" || fullName.endsWith(\"/\");\n\n const contentOffset = offset + 512;\n entries.push({\n name: fullName,\n size,\n dir,\n read: async () => arrayBuffer.slice(contentOffset, contentOffset + size)\n });\n\n offset += 512 + Math.ceil(size / 512) * 512;\n }\n\n return entries;\n}\n\n// 6. UI Helpers\nfunction getIcon(name: string, dir: boolean): string {\n if (dir) return \"📁\";\n const ext = name.split(\".\").pop()?.toLowerCase();\n switch (ext) {\n case \"png\":\n case \"jpg\":\n case \"jpeg\":\n case \"gif\":\n case \"svg\":\n case \"webp\":\n return \"🖼️\";\n case \"pdf\":\n return \"📕\";\n case \"doc\":\n case \"docx\":\n return \"📘\";\n case \"xls\":\n case \"xlsx\":\n return \"📗\";\n case \"ppt\":\n case \"pptx\":\n return \"📙\";\n case \"zip\":\n case \"rar\":\n case \"7z\":\n case \"tar\":\n case \"gz\":\n return \"📦\";\n case \"mp4\":\n case \"mkv\":\n case \"avi\":\n case \"webm\":\n return \"🎥\";\n case \"mp3\":\n case \"wav\":\n case \"ogg\":\n return \"🎵\";\n case \"txt\":\n case \"md\":\n case \"html\":\n case \"js\":\n case \"ts\":\n case \"json\":\n case \"css\":\n return \"📄\";\n default:\n return \"📄\";\n }\n}\n","import DOMPurify from \"dompurify\";\nimport type { PreviewPlugin } from \"../types\";\nimport { appendMeta, createPanel, createSection, readArrayBuffer, readTextFile, resolveFormat } from \"./utils\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\n\nconst emailExtensions = new Set([\"eml\", \"msg\", \"mbox\"]);\nconst emailMimeTypes = new Set([\"message/rfc822\", \"application/vnd.ms-outlook\", \"application/mbox\"]);\nconst emailMimeFormatMap: Record<string, string> = {\n \"message/rfc822\": \"eml\",\n \"application/vnd.ms-outlook\": \"msg\",\n \"application/mbox\": \"mbox\"\n};\n\ninterface EmailAttachment {\n name: string;\n mimeType: string;\n content: Uint8Array;\n contentId?: string;\n}\n\ninterface EmailData {\n from: string;\n to: string;\n cc?: string;\n subject: string;\n date: string;\n bodyText?: string;\n bodyHtml?: string;\n attachments: EmailAttachment[];\n}\n\ninterface MboxMessageSummary {\n from: string;\n subject: string;\n date: string;\n}\n\nexport function emailPlugin(): PreviewPlugin {\n return {\n name: \"email\",\n match(file) {\n return emailExtensions.has(file.extension) || emailMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-email\");\n ctx.viewport.append(panel);\n\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const ext = resolveFormat(ctx.file, emailMimeFormatMap).toLowerCase();\n let emailData: EmailData;\n const objectUrlsToRevoke: string[] = [];\n const attachmentObjectUrls = new Map<EmailAttachment, string>();\n const timersToClear: number[] = [];\n let mboxSummary: MboxMessageSummary[] = [];\n\n try {\n if (ext === \"msg\") {\n // Parse Outlook binary MSG format\n const MsgReader = (await import(\"@kenjiuno/msgreader\")).default;\n const buffer = await readArrayBuffer(ctx.file);\n const reader = new MsgReader(buffer);\n const parsed = reader.getFileData();\n\n if (parsed.error) {\n throw new Error(parsed.error);\n }\n\n const from = parsed.senderName\n ? `${parsed.senderName} <${parsed.senderEmail || parsed.senderSmtpAddress || \"\"}>`.trim()\n : parsed.senderEmail || parsed.senderSmtpAddress || \"\";\n\n const recipients = parsed.recipients || [];\n const to = recipients\n .filter((r) => r.recipType === \"to\")\n .map((r) => `${r.name || \"\"} <${r.email || r.smtpAddress || \"\"}>`.trim())\n .join(\"; \");\n const cc = recipients\n .filter((r) => r.recipType === \"cc\")\n .map((r) => `${r.name || \"\"} <${r.email || r.smtpAddress || \"\"}>`.trim())\n .join(\"; \");\n\n const attachments: EmailAttachment[] = [];\n if (Array.isArray(parsed.attachments)) {\n parsed.attachments.forEach((att) => {\n try {\n const fullAtt = reader.getAttachment(att);\n attachments.push({\n name: fullAtt.fileName || \"未命名附件\",\n mimeType: getAttachmentMimeType(fullAtt, att),\n content: fullAtt.content,\n contentId: att.pidContentId\n });\n } catch (attErr) {\n console.warn(\"Failed to parse attachment:\", attErr);\n }\n });\n }\n\n let bodyHtml = parsed.bodyHtml;\n if (!bodyHtml && parsed.html instanceof Uint8Array) {\n bodyHtml = new TextDecoder(\"utf-8\").decode(parsed.html);\n }\n\n emailData = {\n from: from || \"-\",\n to: to || \"-\",\n cc: cc || \"\",\n subject: parsed.subject || \"(无主题)\",\n date: parsed.messageDeliveryTime || parsed.clientSubmitTime || parsed.creationTime || \"-\",\n bodyText: parsed.body,\n bodyHtml,\n attachments\n };\n } else {\n // Parse EML or MBOX text formats\n const PostalMime = (await import(\"postal-mime\")).default;\n const parser = new PostalMime();\n \n let rawText = await readTextFile(ctx.file);\n if (ext === \"mbox\") {\n const messages = splitMboxMessages(rawText);\n mboxSummary = messages.map(summarizeMboxMessage);\n rawText = messages[0] || rawText;\n }\n\n const parsed = await parser.parse(rawText);\n\n const from = parsed.from ? `${parsed.from.name || \"\"} <${parsed.from.address || \"\"}>`.trim() : \"\";\n const to = Array.isArray(parsed.to)\n ? parsed.to.map((t) => `${t.name || \"\"} <${t.address || \"\"}>`.trim()).join(\"; \")\n : \"\";\n const cc = Array.isArray(parsed.cc)\n ? parsed.cc.map((c) => `${c.name || \"\"} <${c.address || \"\"}>`.trim()).join(\"; \")\n : \"\";\n\n emailData = {\n from: from || \"-\",\n to: to || \"-\",\n cc: cc || \"\",\n subject: parsed.subject || \"(无主题)\",\n date: parsed.date || \"-\",\n bodyText: parsed.text,\n bodyHtml: parsed.html,\n attachments: (parsed.attachments || []).map((att) => ({\n name: att.filename || \"未命名附件\",\n mimeType: att.mimeType || \"application/octet-stream\",\n content: att.content instanceof Uint8Array ? att.content : new Uint8Array(att.content as any),\n contentId: att.contentId\n }))\n };\n }\n\n if (mboxSummary.length > 0) {\n panel.append(createMboxSummarySection(mboxSummary));\n }\n\n // 1. Render Header information section\n const headerSection = createSection(\"邮件信息\");\n appendMeta(headerSection, \"Subject\", emailData.subject);\n appendMeta(headerSection, \"From\", emailData.from);\n appendMeta(headerSection, \"To\", emailData.to);\n if (emailData.cc) {\n appendMeta(headerSection, \"Cc\", emailData.cc);\n }\n appendMeta(headerSection, \"Date\", emailData.date);\n panel.append(headerSection);\n\n // 2. Render Attachments section if present\n if (emailData.attachments.length > 0) {\n const attachmentsSection = createSection(\"附件列表\");\n const container = document.createElement(\"div\");\n container.className = \"ofv-email-attachments\";\n\n emailData.attachments.forEach((att) => {\n const blobUrl = getAttachmentObjectUrl(att, attachmentObjectUrls, objectUrlsToRevoke);\n\n const item = document.createElement(\"a\");\n item.className = \"ofv-email-attachment-item\";\n item.href = blobUrl;\n item.download = att.name;\n item.rel = \"noopener noreferrer\";\n \n // Format attachment size helper\n const sizeKB = Math.round(att.content.byteLength / 1024);\n item.textContent = `Attachment: ${att.name} (${sizeKB} KB)`;\n container.append(item);\n });\n \n attachmentsSection.append(container);\n panel.append(attachmentsSection);\n }\n\n // 3. Render Body section (support inline cid images)\n const bodySection = createSection(\"正文\");\n panel.append(bodySection);\n\n let html = emailData.bodyHtml;\n if (html) {\n // Replace inline cid: content IDs with local blob URLs\n let nextHtml = html;\n emailData.attachments.forEach((att) => {\n const contentId = att.contentId;\n if (contentId) {\n const blobUrl = getAttachmentObjectUrl(att, attachmentObjectUrls, objectUrlsToRevoke);\n\n const cleanCid = contentId.replace(/[<>]/g, \"\");\n nextHtml = replaceCidResourceUrls(nextHtml, contentId, blobUrl);\n if (cleanCid !== contentId) {\n nextHtml = replaceCidResourceUrls(nextHtml, cleanCid, blobUrl);\n }\n }\n });\n html = nextHtml;\n const sanitizedHtml = sanitizeEmailHtml(html);\n\n // Render in a sandboxed iframe to prevent styles leaking\n const iframe = document.createElement(\"iframe\");\n iframe.className = \"ofv-email-body-iframe\";\n iframe.setAttribute(\"sandbox\", \"allow-popups allow-popups-to-escape-sandbox\");\n iframe.style.cssText = \"width: 100%; border: none; background: #fff; min-height: 200px;\";\n bodySection.append(iframe);\n\n iframe.onload = () => {\n try {\n const idoc = iframe.contentDocument || iframe.contentWindow?.document;\n if (idoc) {\n idoc.open();\n idoc.write(`\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\" />\n <style>\n body {\n margin: 16px;\n padding: 0;\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n font-size: 14px;\n line-height: 1.6;\n color: #1f2937;\n }\n img { max-width: 100%; height: auto; display: block; margin: 12px 0; }\n a { color: #2563eb; }\n blockquote {\n margin: 12px 0;\n padding-left: 12px;\n border-left: 3px solid #d1d5db;\n color: #4b5563;\n }\n </style>\n </head>\n <body>${sanitizedHtml}</body>\n </html>\n `);\n idoc.close();\n secureEmailLinks(idoc);\n\n // Auto-adjust height to avoid double scrolling\n const resize = () => {\n const body = idoc.body;\n const docEl = idoc.documentElement;\n const height = Math.max(\n body.scrollHeight,\n body.offsetHeight,\n docEl.clientHeight,\n docEl.scrollHeight,\n docEl.offsetHeight\n );\n iframe.style.height = `${height + 32}px`;\n };\n\n resize();\n timersToClear.push(window.setTimeout(resize, 300));\n timersToClear.push(window.setTimeout(resize, 1000));\n }\n } catch (err) {\n console.error(\"Failed to write html body to email iframe:\", err);\n }\n };\n } else {\n // Render plain text body\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = emailData.bodyText || \"未解析到正文。\";\n bodySection.append(pre);\n }\n\n } catch (err: any) {\n panel.replaceChildren();\n const errorSection = createSection(\"邮件解析出错\");\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.style.color = \"#ef4444\";\n pre.textContent = `解析邮件时发生错误:\\n${err.message || err}`;\n errorSection.append(pre);\n panel.append(errorSection);\n }\n\n return {\n destroy() {\n timersToClear.forEach((timer) => window.clearTimeout(timer));\n objectUrlsToRevoke.forEach((u) => {\n URL.revokeObjectURL(u);\n });\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction getAttachmentObjectUrl(\n attachment: EmailAttachment,\n cache: Map<EmailAttachment, string>,\n urlsToRevoke: string[]\n): string {\n const cached = cache.get(attachment);\n if (cached) {\n return cached;\n }\n const blob = new Blob([attachment.content as BlobPart], { type: attachment.mimeType });\n const url = URL.createObjectURL(blob);\n cache.set(attachment, url);\n urlsToRevoke.push(url);\n return url;\n}\n\nfunction getAttachmentMimeType(fullAttachment: unknown, attachmentMeta?: unknown): string {\n const candidates = [fullAttachment, attachmentMeta];\n for (const candidate of candidates) {\n if (!candidate || typeof candidate !== \"object\") {\n continue;\n }\n const record = candidate as Record<string, unknown>;\n const explicitMime =\n normalizeMimeValue(record.attachMimeTag) ||\n normalizeMimeValue(record.mimeType) ||\n normalizeMimeValue(record.contentType) ||\n normalizeMimeValue(record.mime) ||\n normalizeMimeValue(record[\"content-type\"]);\n if (explicitMime) {\n return explicitMime;\n }\n }\n\n const fileName =\n (fullAttachment && typeof fullAttachment === \"object\" ? (fullAttachment as { fileName?: unknown }).fileName : undefined) ||\n (attachmentMeta && typeof attachmentMeta === \"object\" ? (attachmentMeta as { fileName?: unknown }).fileName : undefined);\n return getMimeType(typeof fileName === \"string\" ? fileName : \"\");\n}\n\nfunction normalizeMimeValue(value: unknown): string {\n if (typeof value !== \"string\") {\n return \"\";\n }\n const mimeType = value.split(\";\")[0]?.trim().toLowerCase() || \"\";\n return mimeType.includes(\"/\") ? mimeType : \"\";\n}\n\nfunction replaceCidResourceUrls(html: string, contentId: string, blobUrl: string): string {\n const escapedCid = escapeRegExp(contentId);\n return html.replace(\n new RegExp(`\\\\b(src|poster|background)=([\"'])cid:${escapedCid}\\\\2`, \"gi\"),\n (_match, attribute: string, quote: string) => `${attribute}=${quote}${blobUrl}${quote}`\n );\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction createMboxSummarySection(messages: MboxMessageSummary[]): HTMLElement {\n const section = createSection(\"MBOX 邮箱摘要\");\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-email-mbox-meta\";\n appendMeta(meta, \"邮件数\", String(messages.length));\n appendMeta(meta, \"预览\", \"当前正文显示第一封邮件\");\n\n const tableWrap = document.createElement(\"div\");\n tableWrap.className = \"ofv-table-scroll ofv-email-mbox-table\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"#\", \"Subject\", \"From\", \"Date\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n messages.slice(0, 100).forEach((message, index) => {\n const row = document.createElement(\"tr\");\n for (const value of [String(index + 1), message.subject || \"(无主题)\", message.from || \"-\", message.date || \"-\"]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n row.append(cell);\n }\n tbody.append(row);\n });\n table.append(thead, tbody);\n tableWrap.append(table);\n section.append(meta, tableWrap);\n return section;\n}\n\nfunction splitMboxMessages(mboxText: string): string[] {\n const lines = mboxText.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n const messages: string[][] = [];\n let current: string[] | null = null;\n let foundFirstFrom = false;\n\n for (const line of lines) {\n if (line.startsWith(\"From \")) {\n if (current && current.length > 0) {\n messages.push(current);\n }\n current = [];\n foundFirstFrom = true;\n continue;\n }\n if (foundFirstFrom && current) {\n current.push(line.startsWith(\">From \") ? line.slice(1) : line);\n }\n }\n if (current && current.length > 0) {\n messages.push(current);\n }\n return messages.length > 0 ? messages.map((message) => message.join(\"\\n\")) : [mboxText];\n}\n\nfunction summarizeMboxMessage(message: string): MboxMessageSummary {\n return {\n from: unfoldHeader(readHeaderValue(message, \"From\")),\n subject: unfoldHeader(readHeaderValue(message, \"Subject\")),\n date: unfoldHeader(readHeaderValue(message, \"Date\"))\n };\n}\n\nfunction readHeaderValue(message: string, name: string): string {\n const headers = message.split(/\\n\\s*\\n/, 1)[0] || \"\";\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = headers.match(new RegExp(`^${escaped}:\\\\s*([\\\\s\\\\S]*?)(?=\\\\n[^\\\\s:]+:|\\\\n\\\\s*\\\\n|$)`, \"im\"));\n return match?.[1]?.trim() || \"\";\n}\n\nfunction unfoldHeader(value: string): string {\n return value.replace(/\\n[ \\t]+/g, \" \").trim();\n}\n\n// File extension to MIME type helper for attachment previews\nfunction getMimeType(name: string): string {\n const ext = name.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n pdf: \"application/pdf\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n html: \"text/html\",\n mp4: \"video/mp4\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\"\n };\n return ext ? map[ext] || \"application/octet-stream\" : \"application/octet-stream\";\n}\n\nfunction sanitizeEmailHtml(html: string): string {\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true },\n ADD_ATTR: [\"target\"],\n ALLOWED_URI_REGEXP: /^(?:(?:https?|mailto|tel|blob|cid):|[^a-z]|[a-z+.-]+(?:[^a-z+.-:]|$))/i\n });\n}\n\nfunction secureEmailLinks(document: Document): void {\n for (const link of document.querySelectorAll<HTMLAnchorElement>(\"a[href]\")) {\n const href = link.getAttribute(\"href\") || \"\";\n if (!isSafeEmailHref(href)) {\n link.removeAttribute(\"href\");\n link.removeAttribute(\"target\");\n link.removeAttribute(\"rel\");\n continue;\n }\n if (/^(https?:)?\\/\\//i.test(href)) {\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n }\n }\n}\n\nfunction isSafeEmailHref(href: string): boolean {\n const trimmed = href.trim();\n return (\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"/\") ||\n trimmed.startsWith(\"./\") ||\n trimmed.startsWith(\"../\") ||\n trimmed.startsWith(\"blob:\") ||\n /^(https?:|mailto:|tel:)/i.test(trimmed)\n );\n}\n","import pako from \"pako\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readTextFile, resolveFormat } from \"./utils\";\n\nconst drawingExtensions = new Set([\"drawio\", \"dio\", \"excalidraw\", \"tldraw\"]);\nconst drawingMimeFormatMap: Record<string, string> = {\n \"application/vnd.jgraph.mxfile\": \"drawio\",\n \"application/vnd.excalidraw+json\": \"excalidraw\",\n \"application/x-excalidraw+json\": \"excalidraw\"\n};\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nexport function drawingPlugin(): PreviewPlugin {\n return {\n name: \"drawing\",\n match(file) {\n return drawingExtensions.has(file.extension) || Boolean(drawingMimeFormatMap[file.mimeType]);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-drawing\");\n ctx.viewport.append(panel);\n const text = await readTextFile(ctx.file);\n const extension = resolveFormat(ctx.file, drawingMimeFormatMap);\n\n try {\n if (extension === \"excalidraw\") {\n renderExcalidraw(panel, text);\n } else if (extension === \"tldraw\") {\n renderTldraw(panel, text);\n } else if (extension === \"drawio\" || extension === \"dio\") {\n renderDrawio(panel, text);\n } else {\n renderRawDrawing(panel, extension || \"drawing\", text);\n }\n } catch (error) {\n renderDrawingParseFallback(panel, extension || \"drawing\", text, error);\n }\n\n return {\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\ntype DrawingSummaryItem = {\n type: string;\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n text?: string;\n image?: boolean;\n embed?: boolean;\n edge?: boolean;\n};\n\nfunction createDrawingSummary(items: DrawingSummaryItem[]): HTMLElement {\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-drawing-summary\";\n const typeCounts = countDrawingTypes(items);\n appendDrawingSummary(summary, \"对象\", String(items.length));\n appendDrawingSummary(summary, \"类型\", formatDrawingTypes(typeCounts));\n appendDrawingSummary(summary, \"文本\", String(items.filter((item) => item.text && item.text.trim()).length));\n appendDrawingSummary(summary, \"连线\", String(items.filter((item) => item.edge).length));\n const media = items.filter((item) => item.image || item.embed).length;\n if (media > 0) {\n appendDrawingSummary(summary, \"媒体/嵌入\", String(media));\n }\n const bounds = drawingBounds(items);\n if (bounds) {\n appendDrawingSummary(summary, \"范围\", `${Math.round(bounds[0])}, ${Math.round(bounds[1])}, ${Math.round(bounds[2])}, ${Math.round(bounds[3])}`);\n }\n return summary;\n}\n\nfunction appendDrawingSummary(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction countDrawingTypes(items: DrawingSummaryItem[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of items) {\n counts.set(item.type, (counts.get(item.type) || 0) + 1);\n }\n return counts;\n}\n\nfunction formatDrawingTypes(counts: Map<string, number>): string {\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 6)\n .map(([type, count]) => `${type} ${count}`)\n .join(\", \") || \"无\";\n}\n\nfunction drawingBounds(items: DrawingSummaryItem[]): [number, number, number, number] | undefined {\n const boxes = items\n .map((item) => {\n if (!Number.isFinite(item.x) || !Number.isFinite(item.y)) {\n return undefined;\n }\n const x = item.x as number;\n const y = item.y as number;\n const width = Math.max(0, finiteNumber(item.width, 0));\n const height = Math.max(0, finiteNumber(item.height, 0));\n return [x, y, x + width, y + height] as [number, number, number, number];\n })\n .filter((item): item is [number, number, number, number] => Boolean(item));\n if (boxes.length === 0) {\n return undefined;\n }\n return [\n Math.min(...boxes.map((box) => box[0])),\n Math.min(...boxes.map((box) => box[1])),\n Math.max(...boxes.map((box) => box[2])),\n Math.max(...boxes.map((box) => box[3]))\n ];\n}\n\nfunction excalidrawSummaryItem(element: Record<string, unknown>): DrawingSummaryItem {\n return {\n type: String(element.type || \"unknown\"),\n x: finiteNumber(element.x, 0),\n y: finiteNumber(element.y, 0),\n width: finiteNumber(element.width, 0),\n height: finiteNumber(element.height, 0),\n text: String(element.text || element.name || \"\"),\n image: element.type === \"image\",\n embed: element.type === \"embeddable\",\n edge: element.type === \"arrow\" || element.type === \"line\"\n };\n}\n\nfunction tldrawSummaryItem(shape: TldrawShape): DrawingSummaryItem {\n const props = shape.props || {};\n return {\n type: String(shape.type || props.type || \"unknown\"),\n x: finiteNumber(shape.x, 0),\n y: finiteNumber(shape.y, 0),\n width: finiteNumber(props.w, finiteNumber(props.width, 0)),\n height: finiteNumber(props.h, finiteNumber(props.height, 0)),\n text: String(props.text || \"\"),\n edge: shape.type === \"arrow\" || shape.type === \"line\"\n };\n}\n\nfunction drawioSummaryItem(shape: DrawioShape): DrawingSummaryItem {\n return {\n type: shape.edge ? \"edge\" : drawioShapeName(shape.style),\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n text: shape.value,\n image: drawioShapeName(shape.style) === \"image\",\n edge: shape.edge\n };\n}\n\nfunction renderExcalidraw(panel: HTMLElement, text: string): void {\n const data = JSON.parse(text) as {\n elements?: Array<Record<string, unknown>>;\n files?: Record<string, { dataURL?: string; mimeType?: string; id?: string }>;\n };\n const files = data.files || {};\n const elements = (data.elements || []).filter((element) => !element.isDeleted);\n const section = createSection(`Excalidraw ${elements.length} elements`);\n section.append(createDrawingSummary(elements.map(excalidrawSummaryItem)));\n const svg = document.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n svg.setAttribute(\"viewBox\", createExcalidrawViewBox(elements));\n const defs = document.createElementNS(SVG_NS, \"defs\");\n svg.append(defs);\n\n for (const element of elements) {\n const type = String(element.type || \"\");\n const x = Number(element.x || 0);\n const y = Number(element.y || 0);\n const width = Number(element.width || 80);\n const height = Number(element.height || 40);\n const stroke = String(element.strokeColor || \"#111827\");\n const fill = excalidrawFill(svg, defs, element, stroke);\n const common = getExcalidrawCommonAttrs(element);\n const transform = excalidrawTransform(element, x, y, width, height);\n\n if (type === \"frame\") {\n const frame = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(frame, {\n x,\n y,\n width,\n height,\n rx: 4,\n fill: \"transparent\",\n stroke: \"#94a3b8\",\n \"stroke-width\": 2,\n \"stroke-dasharray\": \"8 6\",\n opacity: common.opacity,\n transform\n });\n svg.append(frame);\n appendSvgMultilineText(svg, String(element.name || \"Frame\"), x + 12, y + 24, \"#64748b\", {\n fontSize: 14,\n transform\n });\n } else if (type === \"image\") {\n renderExcalidrawImage(svg, element, files, x, y, width, height, common, transform);\n } else if (type === \"embeddable\") {\n renderExcalidrawEmbeddable(svg, element, x, y, width, height, common, transform);\n } else if (type === \"rectangle\" || type === \"diamond\") {\n if (type === \"diamond\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n polygon.setAttribute(\n \"points\",\n `${x + width / 2},${y} ${x + width},${y + height / 2} ${x + width / 2},${y + height} ${x},${y + height / 2}`\n );\n applySvgAttrs(polygon, { fill, stroke, ...common, transform });\n svg.append(polygon);\n } else {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x,\n y,\n width,\n height,\n rx: finiteNumber(element.roundness && typeof element.roundness === \"object\" ? (element.roundness as Record<string, unknown>).value : undefined, 0),\n fill,\n stroke,\n ...common,\n transform\n });\n svg.append(rect);\n }\n } else if (type === \"ellipse\") {\n const ellipse = document.createElementNS(SVG_NS, \"ellipse\");\n applySvgAttrs(ellipse, {\n cx: x + width / 2,\n cy: y + height / 2,\n rx: Math.abs(width / 2),\n ry: Math.abs(height / 2),\n fill,\n stroke,\n ...common,\n transform\n });\n svg.append(ellipse);\n } else if (type === \"line\" || type === \"arrow\") {\n const points = excalidrawPoints(element, x, y, width, height);\n if (points.length > 2) {\n const polyline = document.createElementNS(SVG_NS, \"polyline\");\n applySvgAttrs(polyline, {\n points: points.map((point) => `${point.x},${point.y}`).join(\" \"),\n fill: \"none\",\n stroke,\n ...common,\n transform\n });\n svg.append(polyline);\n appendExcalidrawArrowHeads(svg, element, points, stroke);\n } else {\n const start = points[0] || { x, y };\n const end = points[points.length - 1] || { x: x + width, y: y + height };\n const line = document.createElementNS(SVG_NS, \"line\");\n applySvgAttrs(line, {\n x1: start.x,\n y1: start.y,\n x2: end.x,\n y2: end.y,\n stroke,\n ...common,\n transform\n });\n svg.append(line);\n appendExcalidrawArrowHeads(svg, element, [start, end], stroke);\n }\n } else if (type === \"freedraw\") {\n const path = createExcalidrawFreedrawPath(element, x, y);\n if (path) {\n applySvgAttrs(path, { fill: \"none\", stroke, ...common, transform });\n svg.append(path);\n }\n } else if (type === \"text\") {\n const fontSize = finiteNumber(element.fontSize, 18);\n const lines = String(element.text || \"\").split(/\\r?\\n/);\n const textAlign = String(element.textAlign || \"left\");\n const verticalAlign = String(element.verticalAlign || \"top\");\n const anchor = textAlign === \"center\" ? \"middle\" : textAlign === \"right\" ? \"end\" : \"start\";\n const textX = textAlign === \"center\" ? x + width / 2 : textAlign === \"right\" ? x + width : x;\n const textY =\n verticalAlign === \"middle\"\n ? y + height / 2 - ((lines.length - 1) * fontSize * 1.25) / 2\n : verticalAlign === \"bottom\"\n ? y + height - (lines.length - 1) * fontSize * 1.25\n : y + fontSize;\n appendSvgMultilineText(svg, String(element.text || \"\"), textX, textY, stroke, {\n fontSize,\n fontFamily: String(element.fontFamily || \"Inter, ui-sans-serif, system-ui, sans-serif\"),\n anchor,\n dominantBaseline: verticalAlign === \"middle\" ? \"middle\" : \"auto\",\n opacity: common.opacity,\n transform\n });\n }\n }\n\n section.append(svg);\n panel.append(section);\n}\n\nfunction renderExcalidrawImage(\n svg: SVGSVGElement,\n element: Record<string, unknown>,\n files: Record<string, { dataURL?: string; mimeType?: string; id?: string }>,\n x: number,\n y: number,\n width: number,\n height: number,\n common: Record<string, string | number>,\n transform: string\n): void {\n const fileId = String(element.fileId || \"\");\n const file = fileId ? files[fileId] : undefined;\n const dataUrl = file?.dataURL || \"\";\n if (isSafeExcalidrawImageDataUrl(dataUrl)) {\n const image = document.createElementNS(SVG_NS, \"image\");\n applySvgAttrs(image, {\n x,\n y,\n width,\n height,\n href: dataUrl,\n preserveAspectRatio: \"xMidYMid meet\",\n opacity: common.opacity,\n transform\n });\n svg.append(image);\n return;\n }\n\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x,\n y,\n width,\n height,\n rx: 8,\n fill: \"#f8fafc\",\n stroke: \"#94a3b8\",\n \"stroke-width\": 1.5,\n \"stroke-dasharray\": \"6 4\",\n opacity: common.opacity,\n transform\n });\n svg.append(rect);\n appendSvgMultilineText(svg, fileId ? `Image\\n${fileId}` : \"Image\", x + width / 2, y + height / 2 - 8, \"#64748b\", {\n fontSize: 13,\n anchor: \"middle\",\n transform\n });\n}\n\nfunction renderExcalidrawEmbeddable(\n svg: SVGSVGElement,\n element: Record<string, unknown>,\n x: number,\n y: number,\n width: number,\n height: number,\n common: Record<string, string | number>,\n transform: string\n): void {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x,\n y,\n width,\n height,\n rx: 10,\n fill: \"#eef2ff\",\n stroke: \"#6366f1\",\n \"stroke-width\": 1.5,\n \"stroke-dasharray\": \"8 5\",\n opacity: common.opacity,\n transform\n });\n svg.append(rect);\n const link = String(element.link || element.url || \"Embedded content\");\n appendSvgMultilineText(svg, `Embed\\n${shortenText(link, 48)}`, x + width / 2, y + height / 2 - 10, \"#4338ca\", {\n fontSize: 13,\n anchor: \"middle\",\n transform\n });\n}\n\nfunction appendSvgMultilineText(\n svg: SVGSVGElement,\n text: string,\n x: number,\n y: number,\n fill: string,\n options: {\n fontSize?: number;\n fontFamily?: string;\n anchor?: string;\n dominantBaseline?: string;\n opacity?: string | number;\n transform?: string;\n } = {}\n): SVGTextElement {\n const textNode = document.createElementNS(SVG_NS, \"text\");\n applySvgAttrs(textNode, {\n x,\n y,\n fill,\n \"font-size\": options.fontSize || 18,\n \"font-family\": options.fontFamily || \"Inter, ui-sans-serif, system-ui, sans-serif\",\n \"text-anchor\": options.anchor,\n \"dominant-baseline\": options.dominantBaseline,\n opacity: options.opacity,\n transform: options.transform\n });\n for (const [index, line] of text.split(/\\r?\\n/).entries()) {\n const span = document.createElementNS(SVG_NS, \"tspan\");\n span.setAttribute(\"x\", String(x));\n span.setAttribute(\"dy\", index === 0 ? \"0\" : \"1.25em\");\n span.textContent = line;\n textNode.append(span);\n }\n svg.append(textNode);\n return textNode;\n}\n\nfunction isSafeExcalidrawImageDataUrl(value: string): boolean {\n return /^data:image\\/(?:png|jpe?g|gif|webp|bmp);base64,/i.test(value);\n}\n\nfunction shortenText(value: string, maxLength: number): string {\n return value.length > maxLength ? `${value.slice(0, Math.max(0, maxLength - 3))}...` : value;\n}\n\nfunction createExcalidrawViewBox(elements: Array<Record<string, unknown>>): string {\n if (elements.length === 0) {\n return \"0 0 1200 800\";\n }\n const bounds = elements.map((element) => {\n const x = finiteNumber(element.x, 0);\n const y = finiteNumber(element.y, 0);\n const points = Array.isArray(element.points) ? element.points.map((point) => pointFromValue(point, { x: 0, y: 0 })) : [];\n const width = Math.max(1, finiteNumber(element.width, Math.max(80, ...points.map((point) => point.x))));\n const height = Math.max(1, finiteNumber(element.height, Math.max(40, ...points.map((point) => point.y))));\n return { x, y, width, height };\n });\n const minX = Math.min(...bounds.map((bound) => bound.x)) - 40;\n const minY = Math.min(...bounds.map((bound) => bound.y)) - 40;\n const maxX = Math.max(...bounds.map((bound) => bound.x + bound.width)) + 40;\n const maxY = Math.max(...bounds.map((bound) => bound.y + bound.height)) + 40;\n return `${minX} ${minY} ${Math.max(320, maxX - minX)} ${Math.max(240, maxY - minY)}`;\n}\n\nfunction getExcalidrawCommonAttrs(element: Record<string, unknown>): Record<string, string | number> {\n const strokeWidth = finiteNumber(element.strokeWidth, 1.5);\n const opacity = Math.max(0, Math.min(1, finiteNumber(element.opacity, 100) / 100));\n const style = String(element.strokeStyle || \"solid\");\n return {\n \"stroke-width\": strokeWidth,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"stroke-dasharray\": style === \"dashed\" ? `${strokeWidth * 6} ${strokeWidth * 4}` : style === \"dotted\" ? `${strokeWidth} ${strokeWidth * 4}` : \"\",\n opacity\n };\n}\n\nfunction excalidrawFill(\n svg: SVGSVGElement,\n defs: SVGDefsElement,\n element: Record<string, unknown>,\n stroke: string\n): string {\n const value = String(element.backgroundColor || \"transparent\");\n if (!value || value === \"transparent\") {\n return \"transparent\";\n }\n const fillStyle = String(element.fillStyle || \"solid\");\n if (fillStyle === \"solid\") {\n return value;\n }\n const id = `ofv-excalidraw-${fillStyle}-${defs.children.length}`;\n const pattern = document.createElementNS(SVG_NS, \"pattern\");\n applySvgAttrs(pattern, {\n id,\n width: 10,\n height: 10,\n patternUnits: \"userSpaceOnUse\"\n });\n const background = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(background, { width: 10, height: 10, fill: value, opacity: 0.35 });\n pattern.append(background);\n if (fillStyle === \"cross-hatch\") {\n pattern.append(createPatternLine(svg, \"M 0 10 L 10 0\", stroke));\n pattern.append(createPatternLine(svg, \"M 0 0 L 10 10\", stroke));\n } else if (fillStyle === \"dots\") {\n const dot = document.createElementNS(SVG_NS, \"circle\");\n applySvgAttrs(dot, { cx: 5, cy: 5, r: 1.2, fill: stroke, opacity: 0.48 });\n pattern.append(dot);\n } else {\n pattern.append(createPatternLine(svg, \"M 0 10 L 10 0\", stroke));\n }\n defs.append(pattern);\n return `url(#${id})`;\n}\n\nfunction createPatternLine(svg: SVGSVGElement, d: string, stroke: string): SVGPathElement {\n const path = document.createElementNS(SVG_NS, \"path\");\n applySvgAttrs(path, {\n d,\n stroke,\n \"stroke-width\": 1,\n \"stroke-linecap\": \"round\",\n opacity: 0.42\n });\n return path;\n}\n\nfunction excalidrawTransform(\n element: Record<string, unknown>,\n x: number,\n y: number,\n width: number,\n height: number\n): string {\n const angle = finiteNumber(element.angle, 0);\n if (!angle) {\n return \"\";\n }\n return `rotate(${(angle * 180) / Math.PI} ${x + width / 2} ${y + height / 2})`;\n}\n\nfunction excalidrawPoints(\n element: Record<string, unknown>,\n x: number,\n y: number,\n width: number,\n height: number\n): Array<{ x: number; y: number }> {\n if (!Array.isArray(element.points)) {\n return [\n { x, y },\n { x: x + width, y: y + height }\n ];\n }\n return element.points.map((point) => {\n const parsed = pointFromValue(point, { x: 0, y: 0 });\n return { x: x + parsed.x, y: y + parsed.y };\n });\n}\n\nfunction createExcalidrawFreedrawPath(element: Record<string, unknown>, x: number, y: number): SVGPathElement | null {\n const points = excalidrawPoints(element, x, y, 0, 0);\n if (points.length < 2) {\n return null;\n }\n const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n path.setAttribute(\n \"d\",\n points\n .map((point, index) => `${index === 0 ? \"M\" : \"L\"} ${point.x} ${point.y}`)\n .join(\" \")\n );\n return path;\n}\n\nfunction appendExcalidrawArrowHeads(\n svg: SVGSVGElement,\n element: Record<string, unknown>,\n points: Array<{ x: number; y: number }>,\n stroke: string\n): void {\n if (String(element.type || \"\") !== \"arrow\" || points.length < 2) {\n return;\n }\n const startHead = String(element.startArrowhead || \"\");\n const endHead = String(element.endArrowhead || \"arrow\");\n if (startHead && startHead !== \"none\") {\n appendArrowHead(svg, points[1].x, points[1].y, points[0].x, points[0].y, stroke, startHead);\n }\n if (endHead && endHead !== \"none\") {\n const previous = points[points.length - 2];\n const end = points[points.length - 1];\n appendArrowHead(svg, previous.x, previous.y, end.x, end.y, stroke, endHead);\n }\n}\n\nfunction applySvgAttrs(element: SVGElement, attributes: Record<string, string | number | undefined>): void {\n for (const [key, value] of Object.entries(attributes)) {\n if (value === undefined || value === \"\") {\n continue;\n }\n element.setAttribute(key, String(value));\n }\n}\n\ntype TldrawShape = Record<string, unknown> & {\n props?: Record<string, unknown>;\n};\n\nfunction renderTldraw(panel: HTMLElement, text: string): void {\n const data = JSON.parse(text) as unknown;\n const shapes = extractTldrawShapes(data);\n const section = createSection(`tldraw 基础预览 ${shapes.length} shapes`);\n section.append(createDrawingSummary(shapes.map(tldrawSummaryItem)));\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n svg.setAttribute(\"viewBox\", createTldrawViewBox(shapes));\n\n if (shapes.length === 0) {\n const empty = document.createElementNS(svg.namespaceURI, \"text\");\n empty.setAttribute(\"x\", \"24\");\n empty.setAttribute(\"y\", \"40\");\n empty.setAttribute(\"fill\", \"#64748b\");\n empty.textContent = \"未解析到可展示的 tldraw 图形。\";\n svg.append(empty);\n } else {\n for (const shape of shapes) {\n renderTldrawShape(svg, shape);\n }\n }\n\n section.append(svg);\n panel.append(section);\n}\n\nfunction extractTldrawShapes(data: unknown): TldrawShape[] {\n if (!data || typeof data !== \"object\") {\n return [];\n }\n const source = data as Record<string, unknown>;\n const candidates: unknown[] = [];\n if (Array.isArray(source.records)) {\n candidates.push(...source.records);\n }\n if (Array.isArray(source.shapes)) {\n candidates.push(...source.shapes);\n }\n if (source.store && typeof source.store === \"object\") {\n candidates.push(...Object.values(source.store as Record<string, unknown>));\n }\n if (source.document && typeof source.document === \"object\") {\n const documentRecord = source.document as Record<string, unknown>;\n if (Array.isArray(documentRecord.shapes)) {\n candidates.push(...documentRecord.shapes);\n }\n }\n\n return candidates.filter((item): item is TldrawShape => {\n if (!item || typeof item !== \"object\") {\n return false;\n }\n const record = item as Record<string, unknown>;\n return record.typeName === \"shape\" || String(record.id || \"\").startsWith(\"shape:\");\n });\n}\n\nfunction renderTldrawShape(svg: SVGSVGElement, shape: TldrawShape): void {\n const props = shape.props || {};\n const type = String(shape.type || props.type || \"\");\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const width = Math.max(1, finiteNumber(props.w, finiteNumber(props.width, 120)));\n const height = Math.max(1, finiteNumber(props.h, finiteNumber(props.height, 80)));\n const stroke = tldrawColor(String(props.color || shape.color || \"black\"));\n const fill = tldrawFill(String(props.fill || \"none\"), stroke);\n\n if (type === \"geo\" || type === \"frame\" || type === \"highlight\") {\n const geo = String(props.geo || (type === \"frame\" ? \"rectangle\" : \"rectangle\"));\n if (geo === \"ellipse\" || geo === \"oval\") {\n const ellipse = document.createElementNS(svg.namespaceURI, \"ellipse\");\n ellipse.setAttribute(\"cx\", String(x + width / 2));\n ellipse.setAttribute(\"cy\", String(y + height / 2));\n ellipse.setAttribute(\"rx\", String(width / 2));\n ellipse.setAttribute(\"ry\", String(height / 2));\n ellipse.setAttribute(\"fill\", fill);\n ellipse.setAttribute(\"stroke\", stroke);\n ellipse.setAttribute(\"stroke-width\", \"2\");\n svg.append(ellipse);\n } else if (geo === \"diamond\") {\n const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n polygon.setAttribute(\n \"points\",\n `${x + width / 2},${y} ${x + width},${y + height / 2} ${x + width / 2},${y + height} ${x},${y + height / 2}`\n );\n polygon.setAttribute(\"fill\", fill);\n polygon.setAttribute(\"stroke\", stroke);\n polygon.setAttribute(\"stroke-width\", \"2\");\n svg.append(polygon);\n } else if (geo === \"triangle\") {\n const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n polygon.setAttribute(\"points\", `${x + width / 2},${y} ${x + width},${y + height} ${x},${y + height}`);\n polygon.setAttribute(\"fill\", fill);\n polygon.setAttribute(\"stroke\", stroke);\n polygon.setAttribute(\"stroke-width\", \"2\");\n svg.append(polygon);\n } else {\n const rect = document.createElementNS(svg.namespaceURI, \"rect\");\n rect.setAttribute(\"x\", String(x));\n rect.setAttribute(\"y\", String(y));\n rect.setAttribute(\"width\", String(width));\n rect.setAttribute(\"height\", String(height));\n rect.setAttribute(\"rx\", type === \"frame\" ? \"0\" : \"8\");\n rect.setAttribute(\"fill\", fill);\n rect.setAttribute(\"stroke\", stroke);\n rect.setAttribute(\"stroke-width\", \"2\");\n svg.append(rect);\n }\n appendTldrawText(svg, String(props.text || \"\"), x + 12, y + 24, stroke);\n } else if (type === \"text\" || type === \"note\") {\n if (type === \"note\") {\n const note = document.createElementNS(svg.namespaceURI, \"rect\");\n note.setAttribute(\"x\", String(x));\n note.setAttribute(\"y\", String(y));\n note.setAttribute(\"width\", String(width));\n note.setAttribute(\"height\", String(height));\n note.setAttribute(\"rx\", \"6\");\n note.setAttribute(\"fill\", tldrawColor(String(props.color || \"yellow\"), 0.24));\n note.setAttribute(\"stroke\", stroke);\n svg.append(note);\n }\n appendTldrawText(svg, String(props.text || \"\"), x, y + 18, stroke);\n } else if (type === \"arrow\" || type === \"line\") {\n renderTldrawLine(svg, shape, stroke);\n } else if (type === \"draw\") {\n renderTldrawDraw(svg, shape, stroke);\n } else {\n const rect = document.createElementNS(svg.namespaceURI, \"rect\");\n rect.setAttribute(\"x\", String(x));\n rect.setAttribute(\"y\", String(y));\n rect.setAttribute(\"width\", String(width));\n rect.setAttribute(\"height\", String(height));\n rect.setAttribute(\"fill\", \"transparent\");\n rect.setAttribute(\"stroke\", stroke);\n rect.setAttribute(\"stroke-dasharray\", \"6 4\");\n svg.append(rect);\n appendTldrawText(svg, type || \"shape\", x + 8, y + 20, stroke);\n }\n}\n\nfunction renderTldrawLine(svg: SVGSVGElement, shape: TldrawShape, stroke: string): void {\n const props = shape.props || {};\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const start = pointFromValue(props.start, { x: 0, y: 0 });\n const end = pointFromValue(props.end, {\n x: finiteNumber(props.w, finiteNumber(props.width, 120)),\n y: finiteNumber(props.h, finiteNumber(props.height, 0))\n });\n const line = document.createElementNS(svg.namespaceURI, \"line\");\n line.setAttribute(\"x1\", String(x + start.x));\n line.setAttribute(\"y1\", String(y + start.y));\n line.setAttribute(\"x2\", String(x + end.x));\n line.setAttribute(\"y2\", String(y + end.y));\n line.setAttribute(\"stroke\", stroke);\n line.setAttribute(\"stroke-width\", \"3\");\n line.setAttribute(\"stroke-linecap\", \"round\");\n svg.append(line);\n if (String(shape.type || \"\") === \"arrow\") {\n appendArrowHead(svg, x + start.x, y + start.y, x + end.x, y + end.y, stroke);\n }\n}\n\nfunction renderTldrawDraw(svg: SVGSVGElement, shape: TldrawShape, stroke: string): void {\n const props = shape.props || {};\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const points = extractTldrawDrawPoints(props.segments);\n if (points.length < 2) {\n return;\n }\n const polyline = document.createElementNS(svg.namespaceURI, \"polyline\");\n polyline.setAttribute(\"points\", points.map((point) => `${x + point.x},${y + point.y}`).join(\" \"));\n polyline.setAttribute(\"fill\", \"none\");\n polyline.setAttribute(\"stroke\", stroke);\n polyline.setAttribute(\"stroke-width\", \"3\");\n polyline.setAttribute(\"stroke-linecap\", \"round\");\n polyline.setAttribute(\"stroke-linejoin\", \"round\");\n svg.append(polyline);\n}\n\nfunction appendTldrawText(svg: SVGSVGElement, text: string, x: number, y: number, fill: string): void {\n if (!text.trim()) {\n return;\n }\n const textNode = document.createElementNS(svg.namespaceURI, \"text\");\n textNode.setAttribute(\"x\", String(x));\n textNode.setAttribute(\"y\", String(y));\n textNode.setAttribute(\"fill\", fill);\n textNode.setAttribute(\"font-size\", \"16\");\n textNode.setAttribute(\"font-family\", \"Inter, ui-sans-serif, system-ui, sans-serif\");\n for (const [index, line] of text.split(/\\r?\\n/).entries()) {\n const span = document.createElementNS(svg.namespaceURI, \"tspan\");\n span.setAttribute(\"x\", String(x));\n span.setAttribute(\"dy\", index === 0 ? \"0\" : \"1.3em\");\n span.textContent = line;\n textNode.append(span);\n }\n svg.append(textNode);\n}\n\nfunction appendArrowHead(\n svg: SVGSVGElement,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n fill: string,\n type = \"arrow\"\n): void {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n const size = 10;\n if (type === \"bar\") {\n const line = document.createElementNS(SVG_NS, \"line\");\n const dx = Math.sin(angle) * size * 0.65;\n const dy = Math.cos(angle) * size * 0.65;\n applySvgAttrs(line, {\n x1: x2 - dx,\n y1: y2 + dy,\n x2: x2 + dx,\n y2: y2 - dy,\n stroke: fill,\n \"stroke-width\": 2,\n \"stroke-linecap\": \"round\"\n });\n svg.append(line);\n return;\n }\n if (type === \"dot\" || type === \"circle\") {\n const circle = document.createElementNS(SVG_NS, \"circle\");\n applySvgAttrs(circle, { cx: x2, cy: y2, r: size * 0.42, fill });\n svg.append(circle);\n return;\n }\n const points = [\n [x2, y2],\n [x2 - size * Math.cos(angle - Math.PI / 6), y2 - size * Math.sin(angle - Math.PI / 6)],\n [x2 - size * Math.cos(angle + Math.PI / 6), y2 - size * Math.sin(angle + Math.PI / 6)]\n ];\n const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n polygon.setAttribute(\"points\", points.map((point) => point.join(\",\")).join(\" \"));\n polygon.setAttribute(\"fill\", type === \"triangle_outline\" || type === \"arrow_outline\" ? \"transparent\" : fill);\n polygon.setAttribute(\"stroke\", fill);\n svg.append(polygon);\n}\n\nfunction createTldrawViewBox(shapes: TldrawShape[]): string {\n if (shapes.length === 0) {\n return \"0 0 800 500\";\n }\n const bounds = shapes.map((shape) => {\n const props = shape.props || {};\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const width = Math.max(1, finiteNumber(props.w, finiteNumber(props.width, 120)));\n const height = Math.max(1, finiteNumber(props.h, finiteNumber(props.height, 80)));\n return { x, y, width, height };\n });\n const minX = Math.min(...bounds.map((bound) => bound.x)) - 40;\n const minY = Math.min(...bounds.map((bound) => bound.y)) - 40;\n const maxX = Math.max(...bounds.map((bound) => bound.x + bound.width)) + 40;\n const maxY = Math.max(...bounds.map((bound) => bound.y + bound.height)) + 40;\n return `${minX} ${minY} ${Math.max(240, maxX - minX)} ${Math.max(180, maxY - minY)}`;\n}\n\nfunction extractTldrawDrawPoints(value: unknown): Array<{ x: number; y: number }> {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((segment) => {\n if (!segment || typeof segment !== \"object\") {\n return [];\n }\n const points = (segment as Record<string, unknown>).points;\n if (!Array.isArray(points)) {\n return [];\n }\n return points.map((point) => pointFromValue(point, { x: 0, y: 0 }));\n });\n}\n\nfunction pointFromValue(value: unknown, fallback: { x: number; y: number }): { x: number; y: number } {\n if (Array.isArray(value)) {\n return {\n x: finiteNumber(value[0], fallback.x),\n y: finiteNumber(value[1], fallback.y)\n };\n }\n if (!value || typeof value !== \"object\") {\n return fallback;\n }\n const point = value as Record<string, unknown>;\n return {\n x: finiteNumber(point.x, fallback.x),\n y: finiteNumber(point.y, fallback.y)\n };\n}\n\nfunction finiteNumber(value: unknown, fallback: number): number {\n const parsed = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction tldrawFill(fill: string, stroke: string): string {\n return fill === \"solid\" || fill === \"semi\" || fill === \"pattern\" ? tldrawColor(stroke, 0.14) : \"transparent\";\n}\n\nfunction tldrawColor(value: string, alpha = 1): string {\n const colors: Record<string, [number, number, number]> = {\n black: [17, 24, 39],\n grey: [100, 116, 139],\n light: [203, 213, 225],\n red: [220, 38, 38],\n orange: [234, 88, 12],\n yellow: [202, 138, 4],\n green: [22, 163, 74],\n blue: [37, 99, 235],\n violet: [124, 58, 237],\n purple: [147, 51, 234],\n pink: [219, 39, 119]\n };\n if (value.startsWith(\"#\") || value.startsWith(\"rgb\")) {\n return value;\n }\n const color = colors[value] || colors.black;\n return alpha >= 1 ? `rgb(${color.join(\" \")})` : `rgb(${color.join(\" \")} / ${alpha})`;\n}\n\nfunction renderDrawio(panel: HTMLElement, text: string): void {\n const diagrams = extractDrawioDiagrams(text);\n if (diagrams.length === 0) {\n renderRawDrawing(panel, \"Draw.io\", text);\n return;\n }\n\n for (const [index, diagram] of diagrams.entries()) {\n const section = createSection(`Draw.io 图形预览 ${index + 1}`);\n const shapes = parseDrawioShapes(diagram);\n if (shapes.length > 0) {\n section.append(createDrawingSummary(shapes.map(drawioSummaryItem)));\n const svg = document.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n svg.setAttribute(\"viewBox\", createDrawioViewBox(shapes));\n for (const shape of shapes) {\n renderDrawioShape(svg, shape);\n }\n section.append(svg);\n }\n\n const details = document.createElement(\"details\");\n details.className = \"ofv-details\";\n const summary = document.createElement(\"summary\");\n summary.textContent = shapes.length > 0 ? `原始 XML 摘要(${shapes.length} cells)` : \"Draw.io 原始内容\";\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = diagram.slice(0, 30000);\n details.append(summary, pre);\n section.append(details);\n panel.append(section);\n }\n}\n\ntype DrawioShape = {\n id: string;\n value: string;\n style: Record<string, string>;\n vertex: boolean;\n edge: boolean;\n x: number;\n y: number;\n width: number;\n height: number;\n source?: string;\n target?: string;\n points?: Array<{ x: number; y: number }>;\n};\n\nfunction extractDrawioDiagrams(text: string): string[] {\n const matches = [...text.matchAll(/<diagram[^>]*>([\\s\\S]*?)<\\/diagram>/g)].map((match) => decodeDrawioDiagram(match[1] || \"\"));\n if (matches.length > 0) {\n return matches;\n }\n return text.includes(\"<mxGraphModel\") ? [text] : [];\n}\n\nfunction parseDrawioShapes(xml: string): DrawioShape[] {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return [];\n }\n return Array.from(doc.querySelectorAll(\"mxCell\")).flatMap((cell) => {\n const geometry = Array.from(cell.children).find((child) => child.localName === \"mxGeometry\");\n const vertex = cell.getAttribute(\"vertex\") === \"1\";\n const edge = cell.getAttribute(\"edge\") === \"1\";\n if (!vertex && !edge) {\n return [];\n }\n const shape: DrawioShape = {\n id: cell.getAttribute(\"id\") || \"\",\n value: decodeXmlText(cell.getAttribute(\"value\") || \"\"),\n style: parseDrawioStyle(cell.getAttribute(\"style\") || \"\"),\n vertex,\n edge,\n x: finiteNumber(geometry?.getAttribute(\"x\"), 0),\n y: finiteNumber(geometry?.getAttribute(\"y\"), 0),\n width: Math.max(1, finiteNumber(geometry?.getAttribute(\"width\"), 120)),\n height: Math.max(1, finiteNumber(geometry?.getAttribute(\"height\"), edge ? 1 : 60)),\n source: cell.getAttribute(\"source\") || undefined,\n target: cell.getAttribute(\"target\") || undefined\n };\n\n if (edge && geometry) {\n const points = Array.from(geometry.children)\n .filter((child) => child.localName === \"mxPoint\")\n .map((point) => ({\n x: finiteNumber(point.getAttribute(\"x\"), 0),\n y: finiteNumber(point.getAttribute(\"y\"), 0)\n }));\n if (points.length >= 2) {\n shape.x = points[0].x;\n shape.y = points[0].y;\n shape.width = points[points.length - 1].x - points[0].x;\n shape.height = points[points.length - 1].y - points[0].y;\n shape.points = points;\n }\n }\n return [shape];\n });\n}\n\nfunction parseDrawioStyle(style: string): Record<string, string> {\n const result: Record<string, string> = {};\n const imageMatch = style.match(/(?:^|;)image=(data:image\\/[^;]+;base64,[^;]+)/i);\n const protectedStyle = imageMatch ? style.replace(imageMatch[0], imageMatch[0].startsWith(\";\") ? \";image=__OFV_IMAGE__\" : \"image=__OFV_IMAGE__\") : style;\n for (const part of protectedStyle.split(\";\")) {\n if (!part) {\n continue;\n }\n const separator = part.indexOf(\"=\");\n const key = separator >= 0 ? part.slice(0, separator) : part;\n const value = separator >= 0 ? part.slice(separator + 1) : \"1\";\n if (key) {\n result[key] = value === \"__OFV_IMAGE__\" && imageMatch ? imageMatch[1] : value;\n }\n }\n return result;\n}\n\nfunction createDrawioViewBox(shapes: DrawioShape[]): string {\n const bounds = shapes.map((shape) => ({\n x: Math.min(shape.x, shape.x + shape.width),\n y: Math.min(shape.y, shape.y + shape.height),\n width: Math.abs(shape.width),\n height: Math.abs(shape.height)\n }));\n const minX = Math.min(...bounds.map((bound) => bound.x)) - 40;\n const minY = Math.min(...bounds.map((bound) => bound.y)) - 40;\n const maxX = Math.max(...bounds.map((bound) => bound.x + bound.width)) + 40;\n const maxY = Math.max(...bounds.map((bound) => bound.y + bound.height)) + 40;\n return `${minX} ${minY} ${Math.max(320, maxX - minX)} ${Math.max(240, maxY - minY)}`;\n}\n\nfunction renderDrawioShape(svg: SVGSVGElement, shape: DrawioShape): void {\n const stroke = drawioColor(shape.style.strokeColor, \"#334155\");\n const fill = shape.style.fillColor === \"none\" ? \"transparent\" : drawioColor(shape.style.fillColor, \"#f8fafc\");\n const strokeWidth = finiteNumber(shape.style.strokeWidth, 1.5);\n const opacity = Math.max(0, Math.min(1, finiteNumber(shape.style.opacity, 100) / 100));\n const strokeAttrs = drawioStrokeAttrs(shape.style, strokeWidth);\n const transform = drawioTransform(shape);\n\n if (shape.edge) {\n const points = shape.points || [\n { x: shape.x, y: shape.y },\n { x: shape.x + shape.width, y: shape.y + shape.height }\n ];\n if (points.length > 2) {\n const polyline = document.createElementNS(SVG_NS, \"polyline\");\n applySvgAttrs(polyline, {\n points: points.map((point) => `${point.x},${point.y}`).join(\" \"),\n fill: \"none\",\n stroke,\n ...strokeAttrs,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n opacity\n });\n svg.append(polyline);\n } else {\n const line = document.createElementNS(SVG_NS, \"line\");\n applySvgAttrs(line, {\n x1: points[0].x,\n y1: points[0].y,\n x2: points[1].x,\n y2: points[1].y,\n stroke,\n ...strokeAttrs,\n \"stroke-linecap\": \"round\",\n opacity\n });\n svg.append(line);\n }\n if (shape.style.endArrow && shape.style.endArrow !== \"none\") {\n const tail = points[Math.max(0, points.length - 2)];\n const head = points[points.length - 1];\n appendArrowHead(svg, tail.x, tail.y, head.x, head.y, stroke);\n }\n return;\n }\n\n const shapeName = drawioShapeName(shape.style);\n if (shapeName === \"image\") {\n renderDrawioImage(svg, shape, opacity, transform);\n } else if (shapeName === \"ellipse\") {\n const ellipse = document.createElementNS(SVG_NS, \"ellipse\");\n applySvgAttrs(ellipse, {\n cx: shape.x + shape.width / 2,\n cy: shape.y + shape.height / 2,\n rx: shape.width / 2,\n ry: shape.height / 2,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(ellipse);\n } else if (shapeName === \"rhombus\" || shapeName === \"diamond\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n applySvgAttrs(polygon, {\n points: `${shape.x + shape.width / 2},${shape.y} ${shape.x + shape.width},${shape.y + shape.height / 2} ${shape.x + shape.width / 2},${shape.y + shape.height} ${shape.x},${shape.y + shape.height / 2}`,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(polygon);\n } else if (shapeName === \"hexagon\" || shapeName === \"process\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n const inset = shapeName === \"process\" ? shape.width * 0.12 : shape.width * 0.22;\n applySvgAttrs(polygon, {\n points:\n shapeName === \"process\"\n ? `${shape.x},${shape.y} ${shape.x + shape.width - inset},${shape.y} ${shape.x + shape.width},${shape.y + shape.height / 2} ${shape.x + shape.width - inset},${shape.y + shape.height} ${shape.x},${shape.y + shape.height}`\n : `${shape.x + inset},${shape.y} ${shape.x + shape.width - inset},${shape.y} ${shape.x + shape.width},${shape.y + shape.height / 2} ${shape.x + shape.width - inset},${shape.y + shape.height} ${shape.x + inset},${shape.y + shape.height} ${shape.x},${shape.y + shape.height / 2}`,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(polygon);\n } else if (shapeName === \"triangle\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n applySvgAttrs(polygon, {\n points: `${shape.x + shape.width / 2},${shape.y} ${shape.x + shape.width},${shape.y + shape.height} ${shape.x},${shape.y + shape.height}`,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(polygon);\n } else if (shapeName === \"actor\" || shapeName === \"umlActor\") {\n renderDrawioActor(svg, shape, stroke, strokeAttrs, opacity, transform);\n } else if (shapeName === \"document\") {\n const path = document.createElementNS(SVG_NS, \"path\");\n applySvgAttrs(path, {\n d: createDrawioDocumentPath(shape.x, shape.y, shape.width, shape.height),\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(path);\n } else if (shapeName === \"cylinder\") {\n const group = document.createElementNS(SVG_NS, \"g\");\n applySvgAttrs(group, { transform });\n const body = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(body, {\n x: shape.x,\n y: shape.y + Math.min(18, shape.height * 0.18) / 2,\n width: shape.width,\n height: shape.height - Math.min(18, shape.height * 0.18),\n fill,\n stroke,\n ...strokeAttrs,\n opacity\n });\n const top = document.createElementNS(SVG_NS, \"ellipse\");\n const bottom = document.createElementNS(SVG_NS, \"ellipse\");\n const capHeight = Math.min(18, shape.height * 0.18);\n applySvgAttrs(top, {\n cx: shape.x + shape.width / 2,\n cy: shape.y + capHeight / 2,\n rx: shape.width / 2,\n ry: capHeight / 2,\n fill,\n stroke,\n ...strokeAttrs,\n opacity\n });\n applySvgAttrs(bottom, {\n cx: shape.x + shape.width / 2,\n cy: shape.y + shape.height - capHeight / 2,\n rx: shape.width / 2,\n ry: capHeight / 2,\n fill: \"none\",\n stroke,\n ...strokeAttrs,\n opacity\n });\n group.append(body, top, bottom);\n svg.append(group);\n } else if (shapeName === \"cloud\") {\n const path = document.createElementNS(SVG_NS, \"path\");\n applySvgAttrs(path, {\n d: createDrawioCloudPath(shape.x, shape.y, shape.width, shape.height),\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(path);\n } else if (shapeName === \"swimlane\") {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rx: shape.style.rounded === \"1\" ? Math.min(12, shape.height / 5) : 0,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n const header = document.createElementNS(SVG_NS, \"rect\");\n const headerHeight = Math.min(shape.height, finiteNumber(shape.style.startSize, 30));\n applySvgAttrs(header, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: headerHeight,\n rx: shape.style.rounded === \"1\" ? Math.min(12, headerHeight / 3) : 0,\n fill: drawioColor(shape.style.swimlaneFillColor || shape.style.fillColor, \"#e2e8f0\"),\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(rect, header);\n } else {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rx: shape.style.rounded === \"1\" ? Math.min(12, shape.height / 5) : 0,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(rect);\n }\n\n appendDrawioText(\n svg,\n shape.value,\n shape.x + shape.width / 2,\n shape.y + shape.height / 2,\n drawioColor(shape.style.fontColor, \"#111827\"),\n shape.style,\n transform\n );\n}\n\nfunction drawioShapeName(style: Record<string, string>): string {\n if (style.shape) {\n return style.shape;\n }\n if (style.image) {\n return \"image\";\n }\n if (style.ellipse === \"1\") {\n return \"ellipse\";\n }\n if (style.rhombus === \"1\") {\n return \"rhombus\";\n }\n if (style.swimlane === \"1\") {\n return \"swimlane\";\n }\n if (style.text === \"1\") {\n return \"text\";\n }\n return \"rectangle\";\n}\n\nfunction renderDrawioImage(svg: SVGSVGElement, shape: DrawioShape, opacity: number, transform: string): void {\n const src = shape.style.image || \"\";\n if (/^data:image\\/(?:png|jpe?g|gif|webp|svg\\+xml);base64,/i.test(src)) {\n const image = document.createElementNS(SVG_NS, \"image\");\n applySvgAttrs(image, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n href: src,\n preserveAspectRatio: \"xMidYMid meet\",\n opacity,\n transform\n });\n svg.append(image);\n return;\n }\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rx: 6,\n fill: \"#f8fafc\",\n stroke: \"#94a3b8\",\n \"stroke-dasharray\": \"6 4\",\n opacity,\n transform\n });\n svg.append(rect);\n}\n\nfunction renderDrawioActor(\n svg: SVGSVGElement,\n shape: DrawioShape,\n stroke: string,\n strokeAttrs: Record<string, string | number>,\n opacity: number,\n transform: string\n): void {\n const group = document.createElementNS(SVG_NS, \"g\");\n applySvgAttrs(group, { opacity, transform });\n const cx = shape.x + shape.width / 2;\n const headRadius = Math.min(shape.width, shape.height) * 0.15;\n const head = document.createElementNS(SVG_NS, \"circle\");\n applySvgAttrs(head, {\n cx,\n cy: shape.y + headRadius * 1.4,\n r: headRadius,\n fill: \"transparent\",\n stroke,\n ...strokeAttrs\n });\n const body = createSvgLine(cx, shape.y + headRadius * 2.4, cx, shape.y + shape.height * 0.68, stroke, strokeAttrs);\n const arms = createSvgLine(shape.x + shape.width * 0.22, shape.y + shape.height * 0.42, shape.x + shape.width * 0.78, shape.y + shape.height * 0.42, stroke, strokeAttrs);\n const leftLeg = createSvgLine(cx, shape.y + shape.height * 0.68, shape.x + shape.width * 0.25, shape.y + shape.height, stroke, strokeAttrs);\n const rightLeg = createSvgLine(cx, shape.y + shape.height * 0.68, shape.x + shape.width * 0.75, shape.y + shape.height, stroke, strokeAttrs);\n group.append(head, body, arms, leftLeg, rightLeg);\n svg.append(group);\n}\n\nfunction createSvgLine(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n stroke: string,\n strokeAttrs: Record<string, string | number>\n): SVGLineElement {\n const line = document.createElementNS(SVG_NS, \"line\");\n applySvgAttrs(line, {\n x1,\n y1,\n x2,\n y2,\n stroke,\n ...strokeAttrs,\n \"stroke-linecap\": \"round\"\n });\n return line;\n}\n\nfunction createDrawioDocumentPath(x: number, y: number, width: number, height: number): string {\n const wave = Math.min(18, height * 0.18);\n return [\n `M ${x} ${y}`,\n `H ${x + width}`,\n `V ${y + height - wave}`,\n `C ${x + width * 0.72} ${y + height - wave * 2}, ${x + width * 0.58} ${y + height + wave * 0.5}, ${x + width * 0.34} ${y + height - wave * 0.4}`,\n `C ${x + width * 0.18} ${y + height - wave}, ${x + width * 0.08} ${y + height - wave * 0.2}, ${x} ${y + height - wave * 0.45}`,\n \"Z\"\n ].join(\" \");\n}\n\nfunction drawioStrokeAttrs(style: Record<string, string>, strokeWidth: number): Record<string, string | number> {\n const attrs: Record<string, string | number> = {\n \"stroke-width\": strokeWidth\n };\n if (style.dashed === \"1\") {\n attrs[\"stroke-dasharray\"] = style.dashPattern || `${strokeWidth * 4} ${strokeWidth * 3}`;\n }\n return attrs;\n}\n\nfunction drawioTransform(shape: DrawioShape): string {\n const rotation = finiteNumber(shape.style.rotation, 0);\n if (!rotation) {\n return \"\";\n }\n return `rotate(${rotation} ${shape.x + shape.width / 2} ${shape.y + shape.height / 2})`;\n}\n\nfunction createDrawioCloudPath(x: number, y: number, width: number, height: number): string {\n const cx = x + width / 2;\n const cy = y + height / 2;\n return [\n `M ${x + width * 0.24} ${y + height * 0.72}`,\n `C ${x - width * 0.02} ${y + height * 0.68}, ${x + width * 0.02} ${y + height * 0.34}, ${x + width * 0.28} ${y + height * 0.38}`,\n `C ${x + width * 0.32} ${y + height * 0.12}, ${cx} ${y + height * 0.06}, ${x + width * 0.62} ${y + height * 0.26}`,\n `C ${x + width * 0.86} ${y + height * 0.2}, ${x + width * 1.02} ${y + height * 0.42}, ${x + width * 0.88} ${y + height * 0.62}`,\n `C ${x + width * 0.86} ${y + height * 0.84}, ${x + width * 0.42} ${y + height * 0.9}, ${x + width * 0.24} ${y + height * 0.72}`,\n \"Z\"\n ].join(\" \");\n}\n\nfunction appendDrawioText(\n svg: SVGSVGElement,\n text: string,\n x: number,\n y: number,\n fill: string,\n style: Record<string, string> = {},\n transform = \"\"\n): void {\n if (!text.trim()) {\n return;\n }\n const lines = normalizeDrawioLabel(text).split(/\\r?\\n/).filter(Boolean);\n if (lines.length === 0) {\n return;\n }\n const textNode = document.createElementNS(SVG_NS, \"text\");\n const align = style.align || \"center\";\n const fontStyle = Number.parseInt(style.fontStyle || \"0\", 10);\n applySvgAttrs(textNode, {\n x: align === \"left\" ? x - finiteNumber(style.spacingLeft, 0) : align === \"right\" ? x + finiteNumber(style.spacingRight, 0) : x,\n y,\n fill,\n \"font-size\": finiteNumber(style.fontSize, 14),\n \"font-family\": \"Inter, ui-sans-serif, system-ui, sans-serif\",\n \"font-weight\": fontStyle & 1 ? \"700\" : undefined,\n \"font-style\": fontStyle & 2 ? \"italic\" : undefined,\n \"text-decoration\": fontStyle & 4 ? \"underline\" : undefined,\n \"text-anchor\": align === \"left\" ? \"start\" : align === \"right\" ? \"end\" : \"middle\",\n \"dominant-baseline\": \"middle\",\n transform\n });\n const firstDy = lines.length > 1 ? `${-0.55 * (lines.length - 1)}em` : \"0\";\n for (const [index, line] of lines.entries()) {\n const span = document.createElementNS(SVG_NS, \"tspan\");\n span.setAttribute(\"x\", String(x));\n span.setAttribute(\"dy\", index === 0 ? firstDy : \"1.2em\");\n span.textContent = line;\n textNode.append(span);\n }\n svg.append(textNode);\n}\n\nfunction normalizeDrawioLabel(text: string): string {\n const decoded = decodeXmlText(text);\n return decoded\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<\\/(?:div|p|li|h\\d)>/gi, \"\\n\")\n .replace(/<[^>]+>/g, \"\")\n .split(/\\r?\\n/)\n .map((line) => decodeXmlText(line).replace(/\\u00a0/g, \" \").replace(/[ \\t]+/g, \" \").trim())\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nfunction drawioColor(value: string | undefined, fallback: string): string {\n if (!value || value === \"default\") {\n return fallback;\n }\n return value.startsWith(\"#\") ? value : `#${value}`;\n}\n\nfunction decodeXmlText(value: string): string {\n const textarea = document.createElement(\"textarea\");\n textarea.innerHTML = value;\n return textarea.value;\n}\n\nfunction renderRawDrawing(panel: HTMLElement, extension: string, text: string): void {\n const section = createSection(`${extension} 基础预览`);\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = text.slice(0, 30000);\n section.append(pre);\n panel.append(section);\n}\n\nfunction renderDrawingParseFallback(panel: HTMLElement, extension: string, text: string, error: unknown): void {\n panel.replaceChildren();\n const section = createSection(`${extension} 解析失败`);\n const message = document.createElement(\"p\");\n message.textContent = error instanceof Error ? error.message : String(error);\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = text.slice(0, 30000) || \"文件内容为空。\";\n section.append(message, pre);\n panel.append(section);\n}\n\nfunction decodeDrawioDiagram(value: string): string {\n try {\n const decoded = decodeURIComponent(escape(atob(value)));\n return pako.inflateRaw(Uint8Array.from(decoded, (char) => char.charCodeAt(0)), {\n to: \"string\"\n }) as string;\n } catch {\n return value;\n }\n}\n","import type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer, readTextFile, resolveFormat } from \"./utils\";\n\ninterface LayeredValue<T> {\n layer: string;\n value: T;\n}\n\nconst cadExtensions = new Set([\n \"dxf\",\n \"dwg\",\n \"dwf\",\n \"step\",\n \"stp\",\n \"iges\",\n \"igs\",\n \"ifc\",\n \"sat\",\n \"sab\",\n \"x_t\",\n \"x_b\",\n \"3dm\",\n \"skp\",\n \"sldprt\",\n \"sldasm\"\n]);\nconst cadMimeTypes = new Set([\n \"application/acad\",\n \"application/dxf\",\n \"application/x-dxf\",\n \"image/vnd.dxf\",\n \"model/vnd.dwf\",\n \"model/step\",\n \"application/step\",\n \"application/iges\",\n \"application/x-step\",\n \"application/sat\",\n \"application/sab\",\n \"application/x-parasolid\",\n \"model/vnd.3dm\",\n \"application/vnd.sketchup.skp\",\n \"application/sldworks\"\n]);\nconst cadMimeFormatMap: Record<string, string> = {\n \"application/acad\": \"dwg\",\n \"application/dxf\": \"dxf\",\n \"application/x-dxf\": \"dxf\",\n \"image/vnd.dxf\": \"dxf\",\n \"model/vnd.dwf\": \"dwf\",\n \"model/step\": \"step\",\n \"application/step\": \"step\",\n \"application/iges\": \"iges\",\n \"application/x-step\": \"ifc\",\n \"application/sat\": \"sat\",\n \"application/sab\": \"sab\",\n \"application/x-parasolid\": \"x_t\",\n \"model/vnd.3dm\": \"3dm\",\n \"application/vnd.sketchup.skp\": \"skp\",\n \"application/sldworks\": \"sldprt\"\n};\n\nexport function cadPlugin(): PreviewPlugin {\n return {\n name: \"cad\",\n match(file) {\n return cadExtensions.has(file.extension) || cadMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-cad\");\n ctx.viewport.append(panel);\n\n const extension = resolveFormat(ctx.file, cadMimeFormatMap);\n if (extension === \"step\" || extension === \"stp\") {\n renderStep(panel, await readTextFile(ctx.file), extension);\n return { destroy: () => panel.remove() };\n }\n if (extension === \"iges\" || extension === \"igs\") {\n renderIges(panel, await readTextFile(ctx.file), extension);\n return { destroy: () => panel.remove() };\n }\n if (extension === \"ifc\") {\n renderIfc(panel, await readTextFile(ctx.file));\n return { destroy: () => panel.remove() };\n }\n if (extension === \"dwg\" || extension === \"dwf\") {\n renderBinaryCad(panel, await readArrayBuffer(ctx.file), extension, ctx.file.name);\n return { destroy: () => panel.remove() };\n }\n if (extension !== \"dxf\") {\n const section = createSection(\"CAD 基础预览\");\n section.append(`.${extension || \"cad\"} 已识别为图纸/工程格式,当前前端插件优先渲染 DXF。该格式建议接入服务端转换或 WASM 专用引擎。`);\n panel.append(section);\n return { destroy: () => panel.remove() };\n }\n\n const dxf = await readTextFile(ctx.file);\n const viewer = renderDxf(panel, dxf);\n return {\n canCommand(command) {\n return viewer.canCommand(command);\n },\n command(command) {\n return viewer.command(command);\n },\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction renderStep(panel: HTMLElement, text: string, extension: string): void {\n const records = parseStepRecords(text);\n const typeCounts = countBy(records.map((record) => record.type));\n const section = createSection(`${extension.toUpperCase()} 结构预览`);\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 STEP 文本实体、类型统计和关键几何参数。精确 B-Rep/曲面渲染建议后续接入 CAD 内核或服务端转换。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"实体\", records.length);\n appendMeta(meta, \"类型\", typeCounts.size);\n appendMeta(meta, \"点\", typeCounts.get(\"CARTESIAN_POINT\") || 0);\n appendMeta(meta, \"方向\", typeCounts.get(\"DIRECTION\") || 0);\n section.append(note, meta, createCadTypeList(typeCounts));\n\n const table = createCadEntityTable(\n records.slice(0, 200).map((record) => ({\n id: record.id,\n type: record.type,\n detail: summarizeStepRecord(record)\n }))\n );\n section.append(table);\n panel.append(section);\n}\n\nfunction renderIges(panel: HTMLElement, text: string, extension: string): void {\n const records = parseIgesRecords(text);\n const typeCounts = countBy(records.map((record) => record.type));\n const section = createSection(`${extension.toUpperCase()} 结构预览`);\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 IGES 参数区实体、类型统计和基础参数。精确曲线/曲面渲染建议后续接入 CAD 内核或服务端转换。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"实体\", records.length);\n appendMeta(meta, \"类型\", typeCounts.size);\n appendMeta(meta, \"点实体\", typeCounts.get(\"116\") || 0);\n appendMeta(meta, \"线实体\", typeCounts.get(\"110\") || 0);\n section.append(note, meta, createCadTypeList(typeCounts, \"类型号统计\"));\n\n const table = createCadEntityTable(\n records.slice(0, 200).map((record, index) => ({\n id: String(index + 1),\n type: igesTypeName(record.type),\n detail: record.params.slice(0, 8).join(\", \")\n }))\n );\n section.append(table);\n panel.append(section);\n}\n\nfunction renderIfc(panel: HTMLElement, text: string): void {\n const records = parseStepRecords(text);\n const typeCounts = countBy(records.map((record) => record.type));\n const section = createSection(\"IFC BIM 结构预览\");\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 IFC STEP 实体、BIM 层级和常见构件统计。几何网格、材质和属性集可后续接入 IfcOpenShell/IFC.js 增强。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"实体\", records.length);\n appendMeta(meta, \"类型\", typeCounts.size);\n appendMeta(meta, \"项目\", typeCounts.get(\"IFCPROJECT\") || 0);\n appendMeta(meta, \"建筑\", typeCounts.get(\"IFCBUILDING\") || 0);\n appendMeta(meta, \"楼层\", typeCounts.get(\"IFCBUILDINGSTOREY\") || 0);\n appendMeta(meta, \"空间\", typeCounts.get(\"IFCSPACE\") || 0);\n appendMeta(meta, \"构件\", countIfcElements(typeCounts));\n section.append(note, meta, createCadTypeList(typeCounts, \"IFC 实体统计\"));\n\n const hierarchy = createIfcHierarchy(records);\n if (hierarchy) {\n section.append(hierarchy);\n }\n\n const table = createCadEntityTable(\n records.slice(0, 240).map((record) => ({\n id: record.id,\n type: record.type,\n detail: summarizeIfcRecord(record)\n }))\n );\n section.append(table);\n panel.append(section);\n}\n\ntype StepRecord = {\n id: string;\n type: string;\n args: string;\n};\n\ntype IgesRecord = {\n type: string;\n params: string[];\n};\n\nfunction renderBinaryCad(panel: HTMLElement, arrayBuffer: ArrayBuffer, extension: string, fileName: string): void {\n const bytes = new Uint8Array(arrayBuffer);\n const section = createSection(`${extension.toUpperCase()} 文件预览`);\n const note = document.createElement(\"p\");\n note.textContent =\n extension === \"dwg\"\n ? \"DWG 是 AutoCAD 专有二进制格式,当前前端插件提供文件识别、版本提示和转换建议;几何渲染建议接入 ODA/LibreDWG/服务端转换。\"\n : \"DWF 是发布用图纸格式,当前前端插件提供容器识别和转换建议;高保真页面渲染建议接入专用解析器或服务端转换。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"文件\", fileName);\n appendMeta(meta, \"格式\", extension.toUpperCase());\n appendMeta(meta, \"大小\", formatBytes(bytes.byteLength));\n appendMeta(meta, \"签名\", byteSignature(bytes));\n appendMeta(meta, \"版本\", detectCadVersion(bytes, extension));\n appendMeta(meta, \"容器\", detectCadContainer(bytes));\n\n const actions = document.createElement(\"ol\");\n actions.className = \"ofv-cad-conversion\";\n const suggestions =\n extension === \"dwg\"\n ? [\n \"服务端使用 ODA File Converter / Teigha 将 DWG 转为 DXF、SVG 或 PDF。\",\n \"浏览器端可后续接入 LibreDWG WASM,但需处理字体、块参照、外部参照和许可证。\",\n \"若业务只需预览,建议转换为 PDF/SVG 后走现有 PDF 或图像预览链路。\"\n ]\n : [\n \"优先在服务端转换为 PDF/SVG,保留图层、页面和标注信息。\",\n \"若 DWF 为压缩容器,可后续读取 manifest/descriptor 再还原页面资源。\",\n \"若业务只需下载/归档,保留当前文件元信息和转换提示即可。\"\n ];\n for (const suggestion of suggestions) {\n const item = document.createElement(\"li\");\n item.textContent = suggestion;\n actions.append(item);\n }\n\n const preview = document.createElement(\"pre\");\n preview.className = \"ofv-text-block\";\n preview.textContent = hexPreview(bytes);\n\n section.append(note, meta, createBinaryCadProbe(bytes, extension), actions, preview);\n panel.append(section);\n}\n\nfunction createBinaryCadProbe(bytes: Uint8Array, extension: string): HTMLElement {\n const probe = probeBinaryCad(bytes);\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-cad-binary-probe\";\n details.open = true;\n const summary = document.createElement(\"summary\");\n summary.textContent = \"二进制结构探测\";\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-archive-probe-meta\";\n appendMeta(meta, \"可读片段\", probe.tokens.length);\n appendMeta(meta, \"实体关键词\", formatCadKeywordCounts(probe.entityCounts));\n appendMeta(meta, \"图层线索\", String(probe.layerHints.length));\n appendMeta(meta, \"块/引用线索\", String(probe.blockHints.length));\n appendMeta(meta, \"外部引用\", String(probe.externalRefs.length));\n appendMeta(meta, \"解析级别\", extension === \"dwg\" ? \"启发式扫描\" : \"容器/文本扫描\");\n details.append(summary, meta);\n\n const hints = [...probe.layerHints, ...probe.blockHints, ...probe.externalRefs].slice(0, 18);\n if (hints.length > 0) {\n const list = document.createElement(\"ul\");\n list.className = \"ofv-cad-probe-list\";\n for (const hint of hints) {\n const item = document.createElement(\"li\");\n item.textContent = hint;\n list.append(item);\n }\n details.append(list);\n }\n\n if (probe.tokens.length > 0) {\n const preview = document.createElement(\"pre\");\n preview.className = \"ofv-text-block\";\n preview.textContent = probe.tokens.slice(0, 80).join(\"\\n\");\n details.append(preview);\n }\n return details;\n}\n\ntype BinaryCadProbe = {\n tokens: string[];\n entityCounts: Map<string, number>;\n layerHints: string[];\n blockHints: string[];\n externalRefs: string[];\n};\n\nfunction probeBinaryCad(bytes: Uint8Array): BinaryCadProbe {\n const text = extractAsciiRuns(bytes.slice(0, Math.min(bytes.length, 65536)));\n const tokens = text\n .map((item) => item.trim())\n .filter((item) => item.length >= 3)\n .slice(0, 240);\n const entityKeywords = [\"LINE\", \"CIRCLE\", \"ARC\", \"LWPOLYLINE\", \"POLYLINE\", \"TEXT\", \"MTEXT\", \"INSERT\", \"BLOCK\", \"LAYER\", \"XREF\", \"DIMENSION\"];\n const entityCounts = new Map<string, number>();\n for (const token of tokens) {\n const normalized = token.toUpperCase();\n for (const keyword of entityKeywords) {\n if (normalized.includes(keyword)) {\n entityCounts.set(keyword, (entityCounts.get(keyword) || 0) + 1);\n }\n }\n }\n return {\n tokens,\n entityCounts,\n layerHints: uniqueHints(tokens.filter((item) => /layer|图层/i.test(item))),\n blockHints: uniqueHints(tokens.filter((item) => /block|insert|块/i.test(item))),\n externalRefs: uniqueHints(tokens.filter((item) => /xref|\\.dwg|\\.dxf|\\.pdf|\\.png|\\.jpe?g/i.test(item)))\n };\n}\n\nfunction extractAsciiRuns(bytes: Uint8Array): string[] {\n const result: string[] = [];\n let current = \"\";\n for (const byte of bytes) {\n if (byte >= 32 && byte <= 126) {\n current += String.fromCharCode(byte);\n continue;\n }\n if (current.length >= 3) {\n result.push(current);\n }\n current = \"\";\n }\n if (current.length >= 3) {\n result.push(current);\n }\n return result;\n}\n\nfunction uniqueHints(values: string[]): string[] {\n return Array.from(new Set(values.map((value) => value.trim()).filter(Boolean))).slice(0, 12);\n}\n\nfunction formatCadKeywordCounts(counts: Map<string, number>): string {\n const text = [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 6)\n .map(([type, count]) => `${type} ${count}`)\n .join(\", \");\n return text || \"未发现\";\n}\n\nfunction parseStepRecords(text: string): StepRecord[] {\n return [...text.matchAll(/#(\\d+)\\s*=\\s*([A-Z0-9_]+)\\s*\\(([\\s\\S]*?)\\)\\s*;/gi)].map((match) => ({\n id: `#${match[1]}`,\n type: (match[2] || \"\").toUpperCase(),\n args: (match[3] || \"\").replace(/\\s+/g, \" \").trim()\n }));\n}\n\nfunction parseIgesRecords(text: string): IgesRecord[] {\n const parameterText = text\n .split(/\\r?\\n/)\n .filter((line) => line.slice(72, 73).toUpperCase() === \"P\" || /^\\s*\\d+\\s*,/.test(line))\n .map((line) => line.slice(0, 72).trim())\n .join(\"\");\n if (!parameterText) {\n return [];\n }\n return parameterText\n .split(\";\")\n .map((record) => record.trim())\n .filter(Boolean)\n .map((record) => {\n const params = record.split(\",\").map((part) => part.trim()).filter(Boolean);\n return { type: params[0] || \"UNKNOWN\", params };\n });\n}\n\nfunction summarizeStepRecord(record: StepRecord): string {\n if (record.type === \"CARTESIAN_POINT\") {\n const point = record.args.match(/\\(([-+0-9., E]+)\\)/i)?.[1];\n return point ? `坐标 ${point.replace(/\\s+/g, \"\")}` : record.args;\n }\n if (record.type === \"DIRECTION\" || record.type === \"VECTOR\") {\n const direction = record.args.match(/\\(([-+0-9., E]+)\\)/i)?.[1];\n return direction ? `向量 ${direction.replace(/\\s+/g, \"\")}` : record.args;\n }\n if (record.type === \"LINE\" || record.type === \"CIRCLE\" || record.type === \"ADVANCED_FACE\") {\n return record.args.slice(0, 180);\n }\n return record.args.slice(0, 120);\n}\n\nfunction summarizeIfcRecord(record: StepRecord): string {\n const strings = extractStepStrings(record.args);\n const globalId = strings[0];\n const name = strings[2] || strings[1];\n const label = [globalId, name].filter(Boolean).join(\" · \");\n if (label) {\n return label;\n }\n return summarizeStepRecord(record);\n}\n\nfunction createIfcHierarchy(records: StepRecord[]): HTMLElement | null {\n const rows = records\n .filter((record) => [\"IFCPROJECT\", \"IFCSITE\", \"IFCBUILDING\", \"IFCBUILDINGSTOREY\", \"IFCSPACE\"].includes(record.type))\n .slice(0, 80)\n .map((record) => ({\n id: record.id,\n type: ifcTypeName(record.type),\n detail: summarizeIfcRecord(record)\n }));\n if (rows.length === 0) {\n return null;\n }\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-table-scroll ofv-cad-entities\";\n const title = document.createElement(\"strong\");\n title.textContent = \"BIM 层级\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"ID\", \"层级\", \"名称\"]) {\n const cell = document.createElement(\"th\");\n cell.textContent = label;\n header.append(cell);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const row of rows) {\n const tr = document.createElement(\"tr\");\n for (const value of [row.id, row.type, row.detail]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n tr.append(cell);\n }\n tbody.append(tr);\n }\n table.append(thead, tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\nfunction extractStepStrings(args: string): string[] {\n const values: string[] = [];\n const pattern = /'((?:''|[^'])*)'/g;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(args))) {\n values.push((match[1] || \"\").replace(/''/g, \"'\"));\n }\n return values;\n}\n\nfunction countIfcElements(counts: Map<string, number>): number {\n const elementTypes = [\n \"IFCBEAM\",\n \"IFCBUILDINGELEMENTPROXY\",\n \"IFCCOLUMN\",\n \"IFCCOVERING\",\n \"IFCCURTAINWALL\",\n \"IFCDOOR\",\n \"IFCFLOWSEGMENT\",\n \"IFCFURNISHINGELEMENT\",\n \"IFCMEMBER\",\n \"IFCPLATE\",\n \"IFCRAILING\",\n \"IFCRAMP\",\n \"IFCRAMPFLIGHT\",\n \"IFCROOF\",\n \"IFCSLAB\",\n \"IFCSTAIR\",\n \"IFCSTAIRFLIGHT\",\n \"IFCWALL\",\n \"IFCWALLSTANDARDCASE\",\n \"IFCWINDOW\"\n ];\n return elementTypes.reduce((sum, type) => sum + (counts.get(type) || 0), 0);\n}\n\nfunction ifcTypeName(type: string): string {\n const names: Record<string, string> = {\n IFCPROJECT: \"项目\",\n IFCSITE: \"场地\",\n IFCBUILDING: \"建筑\",\n IFCBUILDINGSTOREY: \"楼层\",\n IFCSPACE: \"空间\"\n };\n return names[type] || type;\n}\n\nfunction igesTypeName(type: string): string {\n const names: Record<string, string> = {\n \"100\": \"100 Circular Arc\",\n \"110\": \"110 Line\",\n \"112\": \"112 Parametric Spline Curve\",\n \"114\": \"114 Parametric Spline Surface\",\n \"116\": \"116 Point\",\n \"118\": \"118 Ruled Surface\",\n \"120\": \"120 Surface of Revolution\",\n \"126\": \"126 Rational B-Spline Curve\",\n \"128\": \"128 Rational B-Spline Surface\",\n \"144\": \"144 Trimmed Surface\"\n };\n return names[type] || type;\n}\n\nfunction createCadTypeList(counts: Map<string, number>, titleText = \"类型统计\"): HTMLElement {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-cad-types\";\n details.open = true;\n const summary = document.createElement(\"summary\");\n summary.textContent = titleText;\n const list = document.createElement(\"ul\");\n for (const [type, count] of [...counts.entries()].sort((a, b) => b[1] - a[1]).slice(0, 80)) {\n const item = document.createElement(\"li\");\n item.textContent = `${type}: ${count}`;\n list.append(item);\n }\n details.append(summary, list);\n return details;\n}\n\nfunction createCadEntityTable(rows: Array<{ id: string; type: string; detail: string }>): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-table-scroll ofv-cad-entities\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"ID\", \"类型\", \"摘要\"]) {\n const cell = document.createElement(\"th\");\n cell.textContent = label;\n header.append(cell);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const row of rows) {\n const tr = document.createElement(\"tr\");\n for (const value of [row.id, row.type, row.detail]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n tr.append(cell);\n }\n tbody.append(tr);\n }\n table.append(thead, tbody);\n wrapper.append(table);\n return wrapper;\n}\n\nfunction countBy(values: string[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const value of values) {\n counts.set(value, (counts.get(value) || 0) + 1);\n }\n return counts;\n}\n\nfunction appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction byteSignature(bytes: Uint8Array): string {\n if (bytes.length === 0) {\n return \"空文件\";\n }\n const ascii = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 16))).replace(/[^\\x20-\\x7E]/g, \".\");\n const hex = Array.from(bytes.slice(0, Math.min(bytes.length, 8)))\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \");\n return `${ascii} (${hex})`;\n}\n\nfunction detectCadVersion(bytes: Uint8Array, extension: string): string {\n const header = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 32)));\n if (extension === \"dwg\") {\n const match = header.match(/AC\\d{4}/);\n if (!match) {\n return \"未知 DWG 版本\";\n }\n const names: Record<string, string> = {\n AC1009: \"AutoCAD R12\",\n AC1012: \"AutoCAD R13\",\n AC1014: \"AutoCAD R14\",\n AC1015: \"AutoCAD 2000/2002\",\n AC1018: \"AutoCAD 2004/2005/2006\",\n AC1021: \"AutoCAD 2007/2008/2009\",\n AC1024: \"AutoCAD 2010/2011/2012\",\n AC1027: \"AutoCAD 2013/2014/2015/2016/2017\",\n AC1032: \"AutoCAD 2018+\"\n };\n return `${match[0]}${names[match[0]] ? ` · ${names[match[0]]}` : \"\"}`;\n }\n if (header.startsWith(\"(DWF\") || header.includes(\"DWF\")) {\n return header.split(/\\s+/)[0] || \"DWF\";\n }\n return \"未知版本\";\n}\n\nfunction detectCadContainer(bytes: Uint8Array): string {\n if (bytes[0] === 0x50 && bytes[1] === 0x4b) {\n return \"ZIP/PK 压缩容器\";\n }\n if (bytes[0] === 0x1f && bytes[1] === 0x8b) {\n return \"GZIP 压缩流\";\n }\n if (bytes[0] === 0x28 && bytes[1] === 0x44 && bytes[2] === 0x57 && bytes[3] === 0x46) {\n return \"DWF ASCII 头\";\n }\n return \"二进制流\";\n}\n\nfunction hexPreview(bytes: Uint8Array): string {\n const rows: string[] = [];\n const limit = Math.min(bytes.length, 256);\n for (let offset = 0; offset < limit; offset += 16) {\n const slice = bytes.slice(offset, offset + 16);\n const hex = Array.from(slice)\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \")\n .padEnd(47, \" \");\n const ascii = Array.from(slice)\n .map((byte) => (byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : \".\"))\n .join(\"\");\n rows.push(`${offset.toString(16).padStart(8, \"0\").toUpperCase()} ${hex} ${ascii}`);\n }\n if (bytes.length > limit) {\n rows.push(`... 仅展示前 ${limit} 字节,共 ${bytes.length} 字节`);\n }\n return rows.join(\"\\n\") || \"无可展示字节。\";\n}\n\nfunction renderDxf(\n panel: HTMLElement,\n dxf: string\n): {\n canCommand: (command: string) => boolean;\n command: (command: string) => boolean;\n} {\n const pairs = dxf.split(/\\r?\\n/).map((line) => line.trim());\n const lines: Array<LayeredValue<[number, number, number, number]>> = [];\n const circles: Array<LayeredValue<[number, number, number]>> = [];\n const arcs: Array<LayeredValue<[number, number, number, number, number]>> = [];\n const points: Array<LayeredValue<[number, number]>> = [];\n const polylines: Array<LayeredValue<Array<[number, number]>>> = [];\n const texts: Array<LayeredValue<[number, number, string, number]>> = [];\n\n for (let index = 0; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\" && value === \"LINE\") {\n const entity = readEntity(pairs, index + 2);\n lines.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n Number(entity[\"11\"] || 0),\n Number(entity[\"21\"] || 0)\n ]\n });\n }\n if (code === \"0\" && value === \"CIRCLE\") {\n const entity = readEntity(pairs, index + 2);\n circles.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n Number(entity[\"40\"] || 0)\n ]\n });\n }\n if (code === \"0\" && value === \"ARC\") {\n const entity = readEntity(pairs, index + 2);\n arcs.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n Number(entity[\"40\"] || 0),\n Number(entity[\"50\"] || 0),\n Number(entity[\"51\"] || 0)\n ]\n });\n }\n if (code === \"0\" && value === \"POINT\") {\n const entity = readEntity(pairs, index + 2);\n points.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [Number(entity[\"10\"] || 0), Number(entity[\"20\"] || 0)]\n });\n }\n if (code === \"0\" && value === \"LWPOLYLINE\") {\n const entity = readEntity(pairs, index + 2);\n const entityPairs = readEntityPairs(pairs, index + 2);\n const polyline = readPolylinePoints(entityPairs);\n if (polyline.length > 1) {\n polylines.push({ layer: normalizeLayerName(entity[\"8\"]), value: polyline });\n }\n }\n if (code === \"0\" && value === \"POLYLINE\") {\n const result = readLegacyPolyline(pairs, index + 2);\n if (result.points.length > 1) {\n polylines.push({ layer: result.layer, value: result.points });\n }\n index = Math.max(index, result.endIndex - 2);\n }\n if (code === \"0\" && (value === \"TEXT\" || value === \"MTEXT\")) {\n const entity = readEntity(pairs, index + 2);\n const text = normalizeDxfText(entity[\"1\"] || entity[\"3\"] || \"\");\n if (text) {\n texts.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n text,\n Math.max(1, Number(entity[\"40\"] || 12))\n ]\n });\n }\n }\n }\n\n const section = createSection(`DXF 基础预览`);\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n\n const bounds = computeBounds(lines, circles, arcs, points, polylines, texts);\n const initialViewBox = {\n x: bounds.minX,\n y: bounds.minY,\n width: bounds.width,\n height: bounds.height\n };\n let currentViewBox = { ...initialViewBox };\n const applyViewBox = () => {\n svg.setAttribute(\n \"viewBox\",\n `${currentViewBox.x} ${currentViewBox.y} ${currentViewBox.width} ${currentViewBox.height}`\n );\n };\n applyViewBox();\n\n for (const item of lines.slice(0, 3000)) {\n const [x1, y1, x2, y2] = item.value;\n const line = document.createElementNS(svg.namespaceURI, \"line\");\n line.setAttribute(\"x1\", String(x1));\n line.setAttribute(\"y1\", String(-y1));\n line.setAttribute(\"x2\", String(x2));\n line.setAttribute(\"y2\", String(-y2));\n line.setAttribute(\"stroke\", \"#111827\");\n line.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(line, item.layer);\n svg.append(line);\n }\n\n for (const item of circles.slice(0, 1000)) {\n const [cx, cy, radius] = item.value;\n const circle = document.createElementNS(svg.namespaceURI, \"circle\");\n circle.setAttribute(\"cx\", String(cx));\n circle.setAttribute(\"cy\", String(-cy));\n circle.setAttribute(\"r\", String(Math.abs(radius)));\n circle.setAttribute(\"fill\", \"none\");\n circle.setAttribute(\"stroke\", \"#2563eb\");\n circle.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(circle, item.layer);\n svg.append(circle);\n }\n\n for (const item of arcs.slice(0, 1000)) {\n const [cx, cy, radius, startAngle, endAngle] = item.value;\n const path = document.createElementNS(svg.namespaceURI, \"path\");\n path.setAttribute(\"d\", arcPath(cx, -cy, Math.abs(radius), -startAngle, -endAngle));\n path.setAttribute(\"fill\", \"none\");\n path.setAttribute(\"stroke\", \"#7c3aed\");\n path.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(path, item.layer);\n svg.append(path);\n }\n\n for (const item of polylines.slice(0, 2000)) {\n const polyline = item.value;\n const path = document.createElementNS(svg.namespaceURI, \"polyline\");\n path.setAttribute(\"points\", polyline.map(([x, y]) => `${x},${-y}`).join(\" \"));\n path.setAttribute(\"fill\", \"none\");\n path.setAttribute(\"stroke\", \"#0f766e\");\n path.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(path, item.layer);\n svg.append(path);\n }\n\n for (const item of points.slice(0, 3000)) {\n const [x, y] = item.value;\n const point = document.createElementNS(svg.namespaceURI, \"circle\");\n point.setAttribute(\"cx\", String(x));\n point.setAttribute(\"cy\", String(-y));\n point.setAttribute(\"r\", String(bounds.stroke * 2));\n point.setAttribute(\"fill\", \"#dc2626\");\n applyLayer(point, item.layer);\n svg.append(point);\n }\n\n for (const item of texts.slice(0, 500)) {\n const [x, y, text, height] = item.value;\n const label = document.createElementNS(svg.namespaceURI, \"text\");\n label.setAttribute(\"x\", String(x));\n label.setAttribute(\"y\", String(-y));\n label.setAttribute(\"font-size\", String(Math.max(height, bounds.stroke * 8)));\n label.setAttribute(\"fill\", \"currentColor\");\n label.textContent = text;\n applyLayer(label, item.layer);\n svg.append(label);\n }\n\n const layers = Array.from(\n new Set([...lines, ...circles, ...arcs, ...points, ...polylines, ...texts].map((item) => item.layer))\n ).sort((a, b) => a.localeCompare(b));\n if (layers.length > 0) {\n section.append(createLayerControls(svg, layers));\n }\n\n const note = document.createElement(\"p\");\n note.textContent =\n `已提取 LINE ${lines.length} 个、CIRCLE ${circles.length} 个、ARC ${arcs.length} 个、POLYLINE ${polylines.length} 个、POINT ${points.length} 个、TEXT ${texts.length} 个。`\n section.append(note, svg);\n panel.append(section);\n\n return {\n canCommand(command) {\n return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n },\n command(command) {\n if (command === \"zoom-in\" || command === \"zoom-out\") {\n const factor = command === \"zoom-in\" ? 0.82 : 1.18;\n const centerX = currentViewBox.x + currentViewBox.width / 2;\n const centerY = currentViewBox.y + currentViewBox.height / 2;\n currentViewBox.width *= factor;\n currentViewBox.height *= factor;\n currentViewBox.x = centerX - currentViewBox.width / 2;\n currentViewBox.y = centerY - currentViewBox.height / 2;\n applyViewBox();\n return true;\n }\n if (command === \"zoom-reset\") {\n currentViewBox = { ...initialViewBox };\n applyViewBox();\n return true;\n }\n return false;\n }\n };\n}\n\nfunction applyLayer(element: Element, layer: string): void {\n element.setAttribute(\"data-layer\", layer);\n}\n\nfunction createLayerControls(svg: SVGSVGElement, layers: string[]): HTMLElement {\n const controls = document.createElement(\"div\");\n controls.className = \"ofv-cad-layers\";\n const title = document.createElement(\"strong\");\n title.textContent = `图层 ${layers.length}`;\n controls.append(title);\n\n for (const layer of layers) {\n const label = document.createElement(\"label\");\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.checked = true;\n checkbox.addEventListener(\"change\", () => {\n for (const element of svg.querySelectorAll<SVGElement>(`[data-layer=\"${escapeCssAttribute(layer)}\"]`)) {\n element.style.display = checkbox.checked ? \"\" : \"none\";\n }\n });\n const name = document.createElement(\"span\");\n name.textContent = layer;\n label.append(checkbox, name);\n controls.append(label);\n }\n return controls;\n}\n\nfunction readEntity(pairs: string[], start: number): Record<string, string> {\n const entity: Record<string, string> = {};\n for (let index = start; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\") {\n break;\n }\n entity[code] = value;\n }\n return entity;\n}\n\nfunction readEntityPairs(pairs: string[], start: number): Array<[string, string]> {\n const entityPairs: Array<[string, string]> = [];\n for (let index = start; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\") {\n break;\n }\n entityPairs.push([code, value]);\n }\n return entityPairs;\n}\n\nfunction readPolylinePoints(entityPairs: Array<[string, string]>): Array<[number, number]> {\n const points: Array<[number, number]> = [];\n let x: number | undefined;\n for (const [code, value] of entityPairs) {\n if (code === \"10\") {\n x = Number(value);\n }\n if (code === \"20\" && x !== undefined) {\n points.push([x, Number(value)]);\n x = undefined;\n }\n }\n return points;\n}\n\nfunction readLegacyPolyline(\n pairs: string[],\n start: number\n): { layer: string; points: Array<[number, number]>; endIndex: number } {\n let layer = \"0\";\n const points: Array<[number, number]> = [];\n for (let index = start; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\" && value === \"SEQEND\") {\n return { layer, points, endIndex: index + 2 };\n }\n if (code === \"8\") {\n layer = normalizeLayerName(value);\n }\n if (code === \"0\" && value === \"VERTEX\") {\n const entity = readEntity(pairs, index + 2);\n points.push([Number(entity[\"10\"] || 0), Number(entity[\"20\"] || 0)]);\n }\n }\n return { layer, points, endIndex: pairs.length };\n}\n\nfunction normalizeLayerName(layer: string | undefined): string {\n return layer?.trim() || \"0\";\n}\n\nfunction escapeCssAttribute(value: string): string {\n if (typeof CSS !== \"undefined\" && CSS.escape) {\n return CSS.escape(value);\n }\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nfunction normalizeDxfText(text: string): string {\n return text\n .replace(/\\\\P/g, \"\\n\")\n .replace(/\\{\\\\[^;]+;/g, \"\")\n .replace(/[{}]/g, \"\")\n .trim();\n}\n\nfunction arcPath(cx: number, cy: number, radius: number, startAngle: number, endAngle: number): string {\n const start = polarToCartesian(cx, cy, radius, endAngle);\n const end = polarToCartesian(cx, cy, radius, startAngle);\n const delta = Math.abs(endAngle - startAngle);\n const largeArc = delta <= 180 ? \"0\" : \"1\";\n return `M ${start.x} ${start.y} A ${radius} ${radius} 0 ${largeArc} 0 ${end.x} ${end.y}`;\n}\n\nfunction polarToCartesian(cx: number, cy: number, radius: number, angleDegrees: number): { x: number; y: number } {\n const angle = (angleDegrees * Math.PI) / 180;\n return {\n x: cx + radius * Math.cos(angle),\n y: cy + radius * Math.sin(angle)\n };\n}\n\nfunction computeBounds(\n lines: Array<LayeredValue<[number, number, number, number]>>,\n circles: Array<LayeredValue<[number, number, number]>>,\n arcs: Array<LayeredValue<[number, number, number, number, number]>>,\n points: Array<LayeredValue<[number, number]>>,\n polylines: Array<LayeredValue<Array<[number, number]>>>,\n texts: Array<LayeredValue<[number, number, string, number]>>\n): { minX: number; minY: number; width: number; height: number; stroke: number } {\n const xs = lines.flatMap(({ value: [x1, , x2] }) => [x1, x2]);\n const ys = lines.flatMap(({ value: [, y1, , y2] }) => [-y1, -y2]);\n for (const { value: [cx, cy, radius] } of circles) {\n xs.push(cx - radius, cx + radius);\n ys.push(-cy - radius, -cy + radius);\n }\n for (const { value: [cx, cy, radius] } of arcs) {\n xs.push(cx - radius, cx + radius);\n ys.push(-cy - radius, -cy + radius);\n }\n for (const { value: [x, y] } of points) {\n xs.push(x);\n ys.push(-y);\n }\n for (const { value: polyline } of polylines) {\n for (const [x, y] of polyline) {\n xs.push(x);\n ys.push(-y);\n }\n }\n for (const { value: [x, y, text, height] } of texts) {\n xs.push(x, x + text.length * height * 0.6);\n ys.push(-y, -y - height);\n }\n const minX = Math.min(...xs, 0);\n const maxX = Math.max(...xs, 100);\n const minY = Math.min(...ys, 0);\n const maxY = Math.max(...ys, 100);\n const width = Math.max(1, maxX - minX);\n const height = Math.max(1, maxY - minY);\n return {\n minX,\n minY,\n width,\n height,\n stroke: Math.max(width, height) / 600\n };\n}\n","import type { PreviewContext, PreviewInstance, PreviewPlugin, PreviewSize } from \"../types\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport { resolveFormat } from \"./utils\";\n\nconst modelExtensions = new Set([\n \"gltf\",\n \"glb\",\n \"obj\",\n \"stl\",\n \"fbx\",\n \"dae\",\n \"ply\",\n \"3mf\",\n \"3ds\",\n \"usd\",\n \"usda\",\n \"usdc\",\n \"usdz\",\n \"wrl\",\n \"vrml\"\n]);\nconst modelMimeTypes = new Set([\n \"model/gltf+json\",\n \"model/gltf-binary\",\n \"model/stl\",\n \"model/obj\",\n \"model/vnd.collada+xml\",\n \"model/3mf\",\n \"model/3ds\",\n \"model/vnd.usd\",\n \"model/vnd.usdz+zip\",\n \"model/vrml\",\n \"application/sla\",\n \"application/vnd.ms-pki.stl\",\n \"application/ply\",\n \"application/vnd.autodesk.fbx\"\n]);\nconst modelMimeFormatMap: Record<string, string> = {\n \"model/gltf+json\": \"gltf\",\n \"model/gltf-binary\": \"glb\",\n \"model/stl\": \"stl\",\n \"model/obj\": \"obj\",\n \"model/vnd.collada+xml\": \"dae\",\n \"model/3mf\": \"3mf\",\n \"model/3ds\": \"3ds\",\n \"model/vnd.usd\": \"usd\",\n \"model/vnd.usdz+zip\": \"usdz\",\n \"model/vrml\": \"wrl\",\n \"application/sla\": \"stl\",\n \"application/vnd.ms-pki.stl\": \"stl\",\n \"application/ply\": \"ply\",\n \"application/vnd.autodesk.fbx\": \"fbx\"\n};\nconst textLikeExtensions = new Set([\"json\", \"txt\", \"md\", \"xml\", \"yaml\", \"yml\", \"csv\", \"tsv\", \"js\", \"ts\", \"tsx\", \"jsx\", \"html\", \"css\"]);\n\nexport function model3dPlugin(): PreviewPlugin {\n return {\n name: \"model3d\",\n match(file) {\n return (\n modelExtensions.has(file.extension) ||\n (modelMimeTypes.has(file.mimeType) && (file.extension === \"\" || file.extension === \"bin\" || !textLikeExtensions.has(file.extension)))\n );\n },\n async render(ctx) {\n const THREE = await import(\"three\");\n const { OrbitControls } = await import(\"three/examples/jsm/controls/OrbitControls.js\");\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n\n const stage = document.createElement(\"div\");\n stage.className = \"ofv-model-stage\";\n ctx.viewport.append(stage);\n\n const scene = new THREE.Scene();\n scene.background = new THREE.Color(0xf3f4f6);\n\n const camera = new THREE.PerspectiveCamera(45, 1, 0.1, 10000);\n camera.position.set(2.5, 2, 3.5);\n\n let renderer: import(\"three\").WebGLRenderer;\n try {\n renderer = new THREE.WebGLRenderer({ antialias: true });\n } catch {\n stage.remove();\n return renderModelFallback(ctx, url, isExternal, \"当前浏览器或设备不支持 WebGL,无法直接渲染 3D 模型。\");\n }\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n renderer.outputColorSpace = THREE.SRGBColorSpace;\n renderer.toneMapping = THREE.ACESFilmicToneMapping;\n renderer.toneMappingExposure = 1.08;\n stage.append(renderer.domElement);\n\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n\n scene.add(new THREE.HemisphereLight(0xffffff, 0x94a3b8, 2.8));\n const directional = new THREE.DirectionalLight(0xffffff, 2);\n directional.position.set(4, 6, 5);\n scene.add(directional);\n scene.add(new THREE.GridHelper(10, 10, 0xcbd5e1, 0xe5e7eb));\n\n const extension = resolveFormat(ctx.file, modelMimeFormatMap);\n const loaded = await loadModel(extension, url, THREE).catch(() => undefined);\n if (!loaded) {\n controls.dispose();\n renderer.dispose();\n stage.remove();\n return renderModelFallback(ctx, url, isExternal, \"无法解析当前 3D 模型内容。\");\n }\n if (loaded.message) {\n const message = document.createElement(\"div\");\n message.className = \"ofv-model-message\";\n message.textContent = loaded.message;\n stage.append(message);\n }\n const object = loaded.object;\n scene.add(object);\n const initialFrame = frameObject(object, camera, controls, THREE);\n const measurement = measureObject(object, THREE);\n stage.append(createMeasurementPanel(measurement));\n stage.append(createMaterialPanel(collectMaterialStats(object)));\n\n let animationFrame = 0;\n const animate = () => {\n controls.update();\n renderer.render(scene, camera);\n animationFrame = window.requestAnimationFrame(animate);\n };\n animate();\n\n const resize = (size: PreviewSize) => {\n const width = Math.max(1, size.width);\n const height = Math.max(1, size.height);\n camera.aspect = width / height;\n camera.updateProjectionMatrix();\n renderer.setSize(width, height, false);\n };\n resize(ctx.size);\n\n return {\n canCommand(command) {\n return (\n command === \"zoom-in\" ||\n command === \"zoom-out\" ||\n command === \"zoom-reset\" ||\n command === \"rotate-right\" ||\n command === \"rotate-left\"\n );\n },\n command(command) {\n if (command === \"zoom-in\" || command === \"zoom-out\") {\n const factor = command === \"zoom-in\" ? 0.82 : 1.18;\n camera.position.sub(controls.target).multiplyScalar(factor).add(controls.target);\n camera.updateProjectionMatrix();\n controls.update();\n return true;\n }\n if (command === \"zoom-reset\") {\n camera.position.copy(initialFrame.cameraPosition);\n controls.target.copy(initialFrame.target);\n camera.near = initialFrame.near;\n camera.far = initialFrame.far;\n camera.updateProjectionMatrix();\n controls.update();\n return true;\n }\n if (command === \"rotate-right\" || command === \"rotate-left\") {\n object.rotateY(command === \"rotate-right\" ? Math.PI / 8 : -Math.PI / 8);\n return true;\n }\n return false;\n },\n resize,\n destroy() {\n window.cancelAnimationFrame(animationFrame);\n controls.dispose();\n renderer.dispose();\n disposeObject(object, THREE);\n stage.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\nfunction renderModelFallback(\n ctx: PreviewContext,\n url: string,\n isExternal: boolean,\n message: string\n): PreviewInstance {\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"3D 预览不可用\";\n\n const detail = document.createElement(\"span\");\n detail.textContent = `${message} ${ctx.file.name}`;\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n\n panel.append(title, detail, download);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(panel);\n\n return {\n canCommand() {\n return false;\n },\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n}\n\nasync function loadModel(\n extension: string,\n url: string,\n THREE: typeof import(\"three\")\n): Promise<{ object: import(\"three\").Object3D; message?: string }> {\n if (extension === \"gltf\" || extension === \"glb\") {\n const { GLTFLoader } = await import(\"three/examples/jsm/loaders/GLTFLoader.js\");\n const gltf = await new GLTFLoader().loadAsync(url);\n return { object: gltf.scene };\n }\n if (extension === \"obj\") {\n const { OBJLoader } = await import(\"three/examples/jsm/loaders/OBJLoader.js\");\n return { object: await new OBJLoader().loadAsync(url) };\n }\n if (extension === \"fbx\") {\n const { FBXLoader } = await import(\"three/examples/jsm/loaders/FBXLoader.js\");\n return { object: await new FBXLoader().loadAsync(url) };\n }\n if (extension === \"dae\") {\n const { ColladaLoader } = await import(\"three/examples/jsm/loaders/ColladaLoader.js\");\n const collada = await new ColladaLoader().loadAsync(url);\n if (!collada) {\n throw new Error(\"Collada loader returned no scene.\");\n }\n return { object: collada.scene };\n }\n if (extension === \"stl\") {\n const { STLLoader } = await import(\"three/examples/jsm/loaders/STLLoader.js\");\n const geometry = await new STLLoader().loadAsync(url);\n const material = new THREE.MeshStandardMaterial({ color: 0x64748b, roughness: 0.55 });\n return { object: new THREE.Mesh(geometry, material) };\n }\n if (extension === \"ply\") {\n const { PLYLoader } = await import(\"three/examples/jsm/loaders/PLYLoader.js\");\n const geometry = await new PLYLoader().loadAsync(url);\n const material = new THREE.MeshStandardMaterial({ color: 0x64748b, roughness: 0.55 });\n return { object: new THREE.Mesh(geometry, material) };\n }\n if (extension === \"3mf\") {\n const { ThreeMFLoader } = await import(\"three/examples/jsm/loaders/3MFLoader.js\");\n return { object: await new ThreeMFLoader().loadAsync(url) };\n }\n if (extension === \"3ds\") {\n const { TDSLoader } = await import(\"three/examples/jsm/loaders/TDSLoader.js\");\n return { object: await new TDSLoader().loadAsync(url) };\n }\n if (extension === \"usd\" || extension === \"usda\" || extension === \"usdc\" || extension === \"usdz\") {\n const { USDLoader } = await import(\"three/examples/jsm/loaders/USDLoader.js\");\n return { object: await new USDLoader().loadAsync(url) };\n }\n if (extension === \"wrl\" || extension === \"vrml\") {\n const { VRMLLoader } = await import(\"three/examples/jsm/loaders/VRMLLoader.js\");\n return { object: await new VRMLLoader().loadAsync(url) };\n }\n const group = new THREE.Group();\n const geometry = new THREE.BoxGeometry(1, 1, 1);\n const material = new THREE.MeshStandardMaterial({ color: 0x64748b });\n const mesh = new THREE.Mesh(geometry, material);\n group.add(mesh);\n return {\n object: group,\n message: `.${extension} 已识别为 3D 格式,当前内置渲染优先支持 gltf/glb/obj/stl/fbx/dae/ply/3mf/3ds/usd/usdz/vrml。`\n };\n}\n\nfunction frameObject(\n object: import(\"three\").Object3D,\n camera: import(\"three\").PerspectiveCamera,\n controls: { target: import(\"three\").Vector3; update: () => void },\n THREE: typeof import(\"three\")\n): {\n cameraPosition: import(\"three\").Vector3;\n target: import(\"three\").Vector3;\n near: number;\n far: number;\n} {\n const box = new THREE.Box3().setFromObject(object);\n const size = box.getSize(new THREE.Vector3());\n const center = box.getCenter(new THREE.Vector3());\n const maxSize = Math.max(size.x, size.y, size.z, 1);\n const distance = maxSize * 2.4;\n camera.position.set(center.x + distance, center.y + distance * 0.7, center.z + distance);\n camera.near = Math.max(distance / 1000, 0.01);\n camera.far = distance * 1000;\n camera.updateProjectionMatrix();\n controls.target.copy(center);\n controls.update();\n return {\n cameraPosition: camera.position.clone(),\n target: controls.target.clone(),\n near: camera.near,\n far: camera.far\n };\n}\n\ntype ModelMeasurement = {\n width: number;\n height: number;\n depth: number;\n diagonal: number;\n center: { x: number; y: number; z: number };\n};\n\ntype MaterialStats = {\n meshes: number;\n materials: number;\n textures: number;\n slots: string[];\n names: string[];\n};\n\nfunction measureObject(object: import(\"three\").Object3D, THREE: typeof import(\"three\")): ModelMeasurement {\n const box = new THREE.Box3().setFromObject(object);\n const size = box.getSize(new THREE.Vector3());\n const center = box.getCenter(new THREE.Vector3());\n return {\n width: size.x,\n height: size.y,\n depth: size.z,\n diagonal: Math.sqrt(size.x ** 2 + size.y ** 2 + size.z ** 2),\n center: { x: center.x, y: center.y, z: center.z }\n };\n}\n\nfunction createMeasurementPanel(measurement: ModelMeasurement): HTMLElement {\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-model-measure\";\n const title = document.createElement(\"strong\");\n title.textContent = \"模型测量\";\n const list = document.createElement(\"dl\");\n appendMeasure(list, \"宽\", measurement.width);\n appendMeasure(list, \"高\", measurement.height);\n appendMeasure(list, \"深\", measurement.depth);\n appendMeasure(list, \"对角线\", measurement.diagonal);\n appendMeasure(\n list,\n \"中心\",\n `${formatMeasure(measurement.center.x)}, ${formatMeasure(measurement.center.y)}, ${formatMeasure(measurement.center.z)}`\n );\n panel.append(title, list);\n return panel;\n}\n\nfunction appendMeasure(list: HTMLDListElement, label: string, value: number | string): void {\n const term = document.createElement(\"dt\");\n term.textContent = label;\n const detail = document.createElement(\"dd\");\n detail.textContent = typeof value === \"number\" ? formatMeasure(value) : value;\n list.append(term, detail);\n}\n\nfunction formatMeasure(value: number): string {\n if (!Number.isFinite(value)) {\n return \"-\";\n }\n const rounded = Math.abs(value) >= 100 ? value.toFixed(1) : value.toFixed(3);\n return rounded.replace(/\\.?0+$/, \"\");\n}\n\nfunction collectMaterialStats(object: import(\"three\").Object3D): MaterialStats {\n const materials = new Set<import(\"three\").Material>();\n const textures = new Set<unknown>();\n const slots = new Set<string>();\n const names = new Set<string>();\n let meshes = 0;\n\n object.traverse((child) => {\n const mesh = child as import(\"three\").Mesh;\n if (!mesh.geometry || !mesh.material) {\n return;\n }\n meshes += 1;\n for (const material of normalizeMaterials(mesh.material)) {\n materials.add(material);\n if (material.name) {\n names.add(material.name);\n }\n for (const slot of textureSlots) {\n const texture = (material as unknown as Record<string, unknown>)[slot];\n if (texture) {\n textures.add(texture);\n slots.add(slot);\n }\n }\n }\n });\n\n return {\n meshes,\n materials: materials.size,\n textures: textures.size,\n slots: [...slots],\n names: [...names].slice(0, 6)\n };\n}\n\nfunction createMaterialPanel(stats: MaterialStats): HTMLElement {\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-model-materials\";\n const title = document.createElement(\"strong\");\n title.textContent = \"材质贴图\";\n\n const list = document.createElement(\"dl\");\n appendMaterialStat(list, \"网格\", stats.meshes);\n appendMaterialStat(list, \"材质\", stats.materials);\n appendMaterialStat(list, \"贴图\", stats.textures);\n appendMaterialStat(list, \"槽位\", stats.slots.length > 0 ? stats.slots.join(\", \") : \"-\");\n if (stats.names.length > 0) {\n appendMaterialStat(list, \"名称\", stats.names.join(\", \"));\n }\n\n panel.append(title, list);\n return panel;\n}\n\nfunction appendMaterialStat(list: HTMLDListElement, label: string, value: number | string): void {\n const term = document.createElement(\"dt\");\n term.textContent = label;\n const detail = document.createElement(\"dd\");\n detail.textContent = String(value);\n list.append(term, detail);\n}\n\nfunction disposeObject(object: import(\"three\").Object3D, THREE: typeof import(\"three\")): void {\n object.traverse((child) => {\n const mesh = child as import(\"three\").Mesh;\n if (mesh.geometry) {\n mesh.geometry.dispose();\n }\n const material = mesh.material;\n for (const item of normalizeMaterials(material)) {\n disposeMaterialTextures(item);\n item.dispose();\n }\n });\n}\n\nconst textureSlots = [\n \"map\",\n \"aoMap\",\n \"alphaMap\",\n \"bumpMap\",\n \"displacementMap\",\n \"emissiveMap\",\n \"envMap\",\n \"lightMap\",\n \"metalnessMap\",\n \"normalMap\",\n \"roughnessMap\"\n];\n\nfunction normalizeMaterials(\n material: import(\"three\").Material | import(\"three\").Material[] | undefined\n): import(\"three\").Material[] {\n if (!material) {\n return [];\n }\n return Array.isArray(material) ? material : [material];\n}\n\nfunction disposeMaterialTextures(material: import(\"three\").Material): void {\n for (const slot of textureSlots) {\n const texture = (material as unknown as Record<string, { dispose?: () => void } | undefined>)[slot];\n texture?.dispose?.();\n }\n}\n","/// <reference path=\"../shims-gis.d.ts\" />\nimport type { PreviewPlugin, PreviewFile } from \"../types\";\nimport { readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst gisExtensions = new Set([\"geojson\", \"topojson\", \"kml\", \"kmz\", \"gpx\", \"shp\"]);\nconst gisMimeFormatMap: Record<string, string> = {\n \"application/geo+json\": \"geojson\",\n \"application/vnd.geo+json\": \"geojson\",\n \"application/topo+json\": \"topojson\",\n \"application/vnd.google-earth.kml+xml\": \"kml\",\n \"application/vnd.google-earth.kmz\": \"kmz\",\n \"application/gpx+xml\": \"gpx\"\n};\n\nfunction loadLeafletCss(): Promise<void> {\n const id = \"ofv-leaflet-css\";\n if (document.getElementById(id)) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n const link = document.createElement(\"link\");\n let settled = false;\n const done = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n link.id = id;\n link.rel = \"stylesheet\";\n link.href = \"https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.css\";\n link.onload = done;\n link.onerror = done;\n document.head.appendChild(link);\n window.setTimeout(done, 0);\n });\n}\n\nexport function gisPlugin(): PreviewPlugin {\n return {\n name: \"gis\",\n match(file) {\n return gisExtensions.has(file.extension) || Boolean(gisMimeFormatMap[file.mimeType]);\n },\n async render(ctx) {\n // 1. Load Leaflet CSS and dynamic imports\n await loadLeafletCss();\n\n const [L, topojson, toGeoJSON, shpjs, JSZip] = await Promise.all([\n import(\"leaflet\"),\n import(\"topojson-client\"),\n import(\"@mapbox/togeojson\"),\n import(\"shpjs\"),\n import(\"jszip\")\n ]);\n\n const Leaflet = L.default || L;\n const topojsonClient = topojson.default || topojson;\n const togeojsonLib = toGeoJSON.default || toGeoJSON;\n const shpLib = shpjs.default || shpjs;\n const JSZipLib = JSZip.default || JSZip;\n\n // Fix default marker icon paths using inline SVG to avoid asset 404 errors\n const DefaultIcon = Leaflet.icon({\n iconUrl: \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"32\" height=\"32\">\n <path fill=\"#3b82f6\" d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/>\n </svg>\n `),\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowUrl: \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"32\" height=\"32\">\n <ellipse cx=\"12\" cy=\"20\" rx=\"6\" ry=\"2\" fill=\"#000000\" opacity=\"0.2\"/>\n </svg>\n `),\n shadowSize: [41, 41],\n shadowAnchor: [12, 41]\n });\n Leaflet.Marker.prototype.options.icon = DefaultIcon;\n\n // 2. Read file as ArrayBuffer and Parse to GeoJSON\n const buffer = await readArrayBuffer(ctx.file);\n const geojson = await parseToGeoJson(\n ctx.file,\n buffer,\n togeojsonLib,\n topojsonClient,\n shpLib,\n JSZipLib\n ).catch((error: unknown) => {\n const fallback = createGisFallback(\"GIS 数据解析失败\", normalizeGisError(error, ctx.file.name));\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(fallback);\n return { fallback };\n });\n\n if (isGisFallback(geojson)) {\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n geojson.fallback.remove();\n }\n };\n }\n\n // Handle raw unzipped shapefile warning UI\n if (geojson === null && resolveFormat(ctx.file, gisMimeFormatMap) === \"shp\") {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"无法直接预览单个 .shp 文件\";\n\n const desc = document.createElement(\"span\");\n desc.textContent = \"Shapefile 格式需要包含配套的 .dbf 和 .shx 数据文件。请将它们打包为 .zip 文件后上传预览,或在压缩包列表中直接查看。\";\n\n fallback.append(title, desc);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(fallback);\n\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n fallback.remove();\n }\n };\n }\n\n // 3. Render Leaflet Map\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-gis-viewer\";\n wrapper.append(createGisSummary(geojson));\n ctx.viewport.appendChild(wrapper);\n\n const mapContainer = document.createElement(\"div\");\n mapContainer.className = \"ofv-map-stage\";\n wrapper.appendChild(mapContainer);\n\n const map = Leaflet.map(mapContainer).setView([0, 0], 2);\n\n Leaflet.tileLayer(\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\", {\n attribution: '© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n }).addTo(map);\n\n // Render GeoJSON elements with premium blue color styles\n const geojsonLayer = Leaflet.geoJSON(geojson, {\n style: () => ({\n color: \"#3b82f6\",\n weight: 2,\n opacity: 0.8,\n fillColor: \"#93c5fd\",\n fillOpacity: 0.35\n }),\n pointToLayer: (feature: any, latlng: any) => {\n return Leaflet.circleMarker(latlng, {\n radius: 6,\n fillColor: \"#3b82f6\",\n color: \"#ffffff\",\n weight: 1.5,\n opacity: 1,\n fillOpacity: 0.8\n });\n },\n onEachFeature: (feature: any, layer: any) => {\n if (feature.properties) {\n const props = feature.properties;\n const keys = Object.keys(props);\n if (keys.length > 0) {\n const popupContent = document.createElement(\"div\");\n popupContent.className = \"ofv-map-popup\";\n\n const popupTitle = document.createElement(\"h4\");\n popupTitle.textContent = \"属性信息\";\n popupContent.appendChild(popupTitle);\n\n const table = document.createElement(\"table\");\n table.className = \"ofv-map-popup-table\";\n\n for (const key of keys) {\n const val = props[key];\n if (val === null || val === undefined) continue;\n\n const row = document.createElement(\"tr\");\n const cellKey = document.createElement(\"td\");\n cellKey.className = \"ofv-map-popup-key\";\n cellKey.textContent = key;\n\n const cellVal = document.createElement(\"td\");\n cellVal.className = \"ofv-map-popup-val\";\n cellVal.textContent = typeof val === \"object\" ? JSON.stringify(val) : String(val);\n\n row.append(cellKey, cellVal);\n table.appendChild(row);\n }\n\n popupContent.appendChild(table);\n layer.bindPopup(popupContent);\n }\n }\n }\n }).addTo(map);\n\n // Zoom map to dataset bounds\n try {\n const bounds = geojsonLayer.getBounds();\n if (bounds.isValid()) {\n map.fitBounds(bounds, { padding: [20, 20] });\n }\n } catch (e) {\n console.warn(\"Could not fit bounds for GeoJSON data:\", e);\n }\n\n return {\n resize() {\n map.invalidateSize();\n },\n destroy() {\n map.remove();\n wrapper.remove();\n }\n };\n }\n };\n}\n\nfunction createGisFallback(titleText: string, detailText: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = titleText;\n const detail = document.createElement(\"span\");\n detail.textContent = detailText;\n fallback.append(title, detail);\n return fallback;\n}\n\nfunction normalizeGisError(error: unknown, fileName: string): string {\n const message = error instanceof Error ? error.message : String(error || \"\");\n return message ? `${fileName}: ${message}` : `${fileName}: 文件内容无法转换为地图数据。`;\n}\n\nfunction isGisFallback(value: unknown): value is { fallback: HTMLElement } {\n return typeof value === \"object\" && value !== null && \"fallback\" in value;\n}\n\ntype GisSummary = {\n features: number;\n geometryCounts: Map<string, number>;\n propertyKeys: Set<string>;\n bounds?: [number, number, number, number];\n};\n\nfunction createGisSummary(geojson: any): HTMLElement {\n const summary = summarizeGeoJson(geojson);\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-gis-summary\";\n appendSummaryItem(bar, \"要素\", String(summary.features));\n appendSummaryItem(bar, \"几何\", formatGeometryCounts(summary.geometryCounts));\n appendSummaryItem(bar, \"属性字段\", String(summary.propertyKeys.size));\n if (summary.propertyKeys.size > 0) {\n appendSummaryItem(bar, \"字段预览\", [...summary.propertyKeys].slice(0, 8).join(\", \"));\n }\n if (summary.bounds) {\n appendSummaryItem(bar, \"范围\", formatBounds(summary.bounds));\n }\n return bar;\n}\n\nfunction appendSummaryItem(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction summarizeGeoJson(geojson: any): GisSummary {\n const summary: GisSummary = {\n features: 0,\n geometryCounts: new Map(),\n propertyKeys: new Set()\n };\n for (const feature of collectFeatures(geojson)) {\n summary.features++;\n if (feature.properties && typeof feature.properties === \"object\") {\n Object.keys(feature.properties).forEach((key) => summary.propertyKeys.add(key));\n }\n summarizeGeometry(feature.geometry, summary);\n }\n return summary;\n}\n\nfunction collectFeatures(value: any): any[] {\n if (!value) {\n return [];\n }\n if (value.type === \"FeatureCollection\" && Array.isArray(value.features)) {\n return value.features;\n }\n if (value.type === \"Feature\") {\n return [value];\n }\n if (value.type && value.coordinates) {\n return [{ type: \"Feature\", properties: {}, geometry: value }];\n }\n return [];\n}\n\nfunction summarizeGeometry(geometry: any, summary: GisSummary): void {\n if (!geometry) {\n summary.geometryCounts.set(\"None\", (summary.geometryCounts.get(\"None\") || 0) + 1);\n return;\n }\n const type = String(geometry.type || \"Unknown\");\n summary.geometryCounts.set(type, (summary.geometryCounts.get(type) || 0) + 1);\n if (type === \"GeometryCollection\" && Array.isArray(geometry.geometries)) {\n for (const child of geometry.geometries) {\n summarizeGeometry(child, summary);\n }\n return;\n }\n updateBounds(summary, geometry.coordinates);\n}\n\nfunction updateBounds(summary: GisSummary, coordinates: unknown): void {\n if (!Array.isArray(coordinates)) {\n return;\n }\n if (typeof coordinates[0] === \"number\" && typeof coordinates[1] === \"number\") {\n const lon = coordinates[0];\n const lat = coordinates[1];\n if (!Number.isFinite(lon) || !Number.isFinite(lat)) {\n return;\n }\n const bounds = summary.bounds || [lon, lat, lon, lat];\n bounds[0] = Math.min(bounds[0], lon);\n bounds[1] = Math.min(bounds[1], lat);\n bounds[2] = Math.max(bounds[2], lon);\n bounds[3] = Math.max(bounds[3], lat);\n summary.bounds = bounds;\n return;\n }\n for (const item of coordinates) {\n updateBounds(summary, item);\n }\n}\n\nfunction formatGeometryCounts(counts: Map<string, number>): string {\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([type, count]) => `${type} ${count}`)\n .join(\", \") || \"无\";\n}\n\nfunction formatBounds(bounds: [number, number, number, number]): string {\n return bounds.map((value) => Number(value.toFixed(5))).join(\", \");\n}\n\nasync function parseToGeoJson(\n file: PreviewFile,\n buffer: ArrayBuffer,\n togeojsonLib: any,\n topojsonClient: any,\n shpLib: any,\n JSZipLib: any\n): Promise<any> {\n const ext = resolveFormat(file, gisMimeFormatMap).toLowerCase();\n\n if (ext === \"geojson\") {\n const text = new TextDecoder().decode(buffer);\n return JSON.parse(text);\n }\n\n if (ext === \"topojson\") {\n const text = new TextDecoder().decode(buffer);\n const topology = JSON.parse(text);\n const geojsonFeatures: any[] = [];\n for (const key of Object.keys(topology.objects)) {\n const feature = topojsonClient.feature(topology, topology.objects[key]);\n if (feature.type === \"FeatureCollection\") {\n geojsonFeatures.push(...feature.features);\n } else {\n geojsonFeatures.push(feature);\n }\n }\n return {\n type: \"FeatureCollection\",\n features: geojsonFeatures\n };\n }\n\n if (ext === \"kml\") {\n const text = new TextDecoder().decode(buffer);\n const dom = new DOMParser().parseFromString(text, \"text/xml\");\n return togeojsonLib.kml(dom);\n }\n\n if (ext === \"gpx\") {\n const text = new TextDecoder().decode(buffer);\n const dom = new DOMParser().parseFromString(text, \"text/xml\");\n return togeojsonLib.gpx(dom);\n }\n\n if (ext === \"kmz\") {\n const zip = await JSZipLib.loadAsync(buffer);\n const kmlFile: any = Object.values(zip.files).find((f: any) => f.name.toLowerCase().endsWith(\".kml\"));\n if (!kmlFile) {\n throw new Error(\"No KML file found inside KMZ archive.\");\n }\n const kmlText = await kmlFile.async(\"text\");\n const dom = new DOMParser().parseFromString(kmlText, \"text/xml\");\n return togeojsonLib.kml(dom);\n }\n\n if (ext === \"shp\") {\n const u8 = new Uint8Array(buffer);\n const isZip = u8[0] === 0x50 && u8[1] === 0x4b && u8[2] === 0x03 && u8[3] === 0x04;\n if (!isZip) {\n return null; // Signals raw shapefile\n }\n const parsed = await shpLib(buffer);\n if (Array.isArray(parsed)) {\n const features: any[] = [];\n for (const item of parsed) {\n if (item.type === \"FeatureCollection\") {\n features.push(...item.features);\n } else if (item.type === \"Feature\") {\n features.push(item);\n }\n }\n return {\n type: \"FeatureCollection\",\n features\n };\n }\n return parsed;\n }\n\n // Mime type match fallback\n try {\n const text = new TextDecoder().decode(buffer);\n return JSON.parse(text);\n } catch {\n throw new Error(`Unsupported GIS format: ${ext}`);\n }\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\nimport { appendMeta, createPanel, createSection, readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst assetExtensions = new Set([\n \"ttf\",\n \"otf\",\n \"woff\",\n \"woff2\",\n \"eot\",\n \"psd\",\n \"psb\",\n \"ai\",\n \"eps\",\n \"ps\",\n \"webarchive\",\n \"sqlite\",\n \"sqlite3\",\n \"db\",\n \"wasm\",\n \"parquet\",\n \"avro\"\n]);\n\nconst assetMimeFormatMap: Record<string, string> = {\n \"font/ttf\": \"ttf\",\n \"font/otf\": \"otf\",\n \"font/woff\": \"woff\",\n \"font/woff2\": \"woff2\",\n \"application/vnd.ms-fontobject\": \"eot\",\n \"image/vnd.adobe.photoshop\": \"psd\",\n \"application/postscript\": \"ps\",\n \"application/x-webarchive\": \"webarchive\",\n \"application/vnd.sqlite3\": \"sqlite\",\n \"application/x-sqlite3\": \"sqlite\",\n \"application/wasm\": \"wasm\",\n \"application/vnd.apache.parquet\": \"parquet\",\n \"application/avro\": \"avro\"\n};\n\nconst assetMimeTypes = new Set(Object.keys(assetMimeFormatMap));\n\nexport function assetPlugin(): PreviewPlugin {\n return {\n name: \"asset\",\n match(file) {\n return assetExtensions.has(file.extension) || assetMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-asset\");\n ctx.viewport.append(panel);\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const extension = resolveFormat(ctx.file, assetMimeFormatMap).toLowerCase();\n const bytes = new Uint8Array(await readArrayBuffer(ctx.file).catch(() => new ArrayBuffer(0)));\n\n const section = createSection(assetTitle(extension));\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-asset-summary\";\n appendMeta(summary, \"文件\", ctx.file.name);\n appendMeta(summary, \"格式\", extension ? `.${extension}` : ctx.file.mimeType || \"未知\");\n appendMeta(summary, \"大小\", formatBytes(ctx.file.size ?? bytes.byteLength));\n appendMeta(summary, \"签名\", byteSignature(bytes));\n\n const note = document.createElement(\"p\");\n note.textContent = assetGuidance(extension);\n\n const download = document.createElement(\"a\");\n download.className = \"ofv-asset-download\";\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n\n section.append(summary, note, download);\n if (isFontAsset(extension)) {\n section.append(await createFontPreview(extension, url, ctx.file.name, bytes));\n }\n if (extension === \"wasm\") {\n section.append(createWasmPreview(bytes));\n }\n if (extension === \"psd\" || extension === \"psb\") {\n section.append(createPhotoshopPreview(bytes));\n }\n if (extension === \"sqlite\" || extension === \"sqlite3\" || extension === \"db\") {\n section.append(createSqlitePreview(bytes));\n }\n if (extension === \"parquet\") {\n section.append(createParquetPreview(bytes));\n }\n if (extension === \"avro\") {\n section.append(createAvroPreview(bytes));\n }\n if (extension === \"webarchive\") {\n section.append(createWebArchivePreview(bytes));\n }\n if (extension === \"ai\" || extension === \"eps\" || extension === \"ps\") {\n section.append(createPostScriptPreview(bytes));\n }\n const preview = createHexPreview(bytes);\n if (preview) {\n section.append(preview);\n }\n panel.append(section);\n\n return {\n destroy() {\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction assetTitle(extension: string): string {\n if (isFontAsset(extension)) {\n return \"字体文件预览\";\n }\n if ([\"psd\", \"psb\", \"ai\", \"eps\", \"ps\"].includes(extension)) {\n return \"设计文件预览\";\n }\n if ([\"sqlite\", \"sqlite3\", \"db\", \"parquet\", \"avro\"].includes(extension)) {\n return \"数据文件预览\";\n }\n if (extension === \"wasm\") {\n return \"WebAssembly 文件预览\";\n }\n if (extension === \"webarchive\") {\n return \"网页归档预览\";\n }\n return \"资产文件预览\";\n}\n\nfunction assetGuidance(extension: string): string {\n if (isFontAsset(extension)) {\n return \"字体文件已识别,当前会使用 FontFace 展示字形样张,并解析 sfnt/WOFF 表目录和 name 元信息。\";\n }\n if (extension === \"psd\" || extension === \"psb\") {\n return \"PSD/PSB 已识别,当前会解析基础画布、通道、位深和颜色模式;图层缩略图可后续接入 psd.js/WASM 或服务端转换。\";\n }\n if ([\"ai\", \"eps\", \"ps\"].includes(extension)) {\n return \"PostScript/Illustrator 文件已识别,当前会解析文档头、BoundingBox 和常见 DSC 元信息;高保真图形可后续接入 Ghostscript/Illustrator 转换。\";\n }\n if ([\"sqlite\", \"sqlite3\", \"db\"].includes(extension)) {\n return \"SQLite 数据库已识别,当前会解析数据库头和 sqlite_schema 摘要;抽样数据可后续接入 sqlite-wasm 增强。\";\n }\n if (extension === \"parquet\" || extension === \"avro\") {\n return \"列式/序列化数据文件已识别,当前会解析容器头、元信息和 schema 摘要;抽样记录可后续接入专用解析器增强。\";\n }\n if (extension === \"wasm\") {\n return \"WASM 模块已识别,当前会解析版本、section 分布、imports、exports 和自定义 section 摘要。\";\n }\n if (extension === \"webarchive\") {\n return \"WebArchive 已识别,当前会解析 XML plist 主资源、MIME、编码和子资源数量;完整网页还原可后续接入资源包转换。\";\n }\n return \"该资产文件已识别,当前提供文件指纹和下载入口,后续可接入专用解析器增强。\";\n}\n\nfunction isFontAsset(extension: string): boolean {\n return [\"ttf\", \"otf\", \"woff\", \"woff2\", \"eot\"].includes(extension);\n}\n\nasync function createFontPreview(extension: string, url: string, fileName: string, bytes: Uint8Array): Promise<HTMLElement> {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-font-preview\";\n\n const heading = document.createElement(\"strong\");\n heading.textContent = \"字体样张\";\n\n const sample = document.createElement(\"div\");\n sample.className = \"ofv-font-sample\";\n sample.textContent = \"Open File Viewer 预览 1234567890\";\n\n const pangram = document.createElement(\"div\");\n pangram.className = \"ofv-font-pangram\";\n pangram.textContent = \"The quick brown fox jumps over the lazy dog.\";\n\n const meta = document.createElement(\"span\");\n meta.className = \"ofv-font-status\";\n\n preview.append(heading, sample, pangram, meta);\n\n if (!(\"FontFace\" in window) || !document.fonts) {\n meta.textContent = \"当前浏览器不支持 FontFace API,无法生成实时字形样张。\";\n preview.append(createFontInfoPreview(bytes, extension));\n return preview;\n }\n\n const family = `ofv-${fileName.replace(/[^a-z0-9_-]/gi, \"-\")}-${Date.now()}`;\n const format = fontFaceFormat(extension);\n const source = format ? `url(\"${url}\") format(\"${format}\")` : `url(\"${url}\")`;\n\n try {\n const fontFace = new FontFace(family, source);\n const loaded = await fontFace.load();\n document.fonts.add(loaded);\n sample.style.fontFamily = `\"${family}\", sans-serif`;\n pangram.style.fontFamily = `\"${family}\", sans-serif`;\n meta.textContent = \"已使用浏览器 FontFace API 加载字体样张。\";\n } catch (error) {\n meta.textContent = `字体样张加载失败:${error instanceof Error ? error.message : \"当前字体编码暂不受浏览器支持。\"}`;\n }\n\n preview.append(createFontInfoPreview(bytes, extension));\n return preview;\n}\n\nfunction fontFaceFormat(extension: string): string {\n const map: Record<string, string> = {\n ttf: \"truetype\",\n otf: \"opentype\",\n woff: \"woff\",\n woff2: \"woff2\",\n eot: \"embedded-opentype\"\n };\n return map[extension] || \"\";\n}\n\ntype FontTableEntry = {\n tag: string;\n checksum?: number;\n offset: number;\n length: number;\n compressedLength?: number;\n};\n\ntype FontNameRecord = {\n id: number;\n label: string;\n value: string;\n};\n\ntype FontContainerMeta = {\n label: string;\n value: string | number;\n};\n\ntype FontInfo = {\n valid: boolean;\n error?: string;\n container?: string;\n flavor?: string;\n tables: FontTableEntry[];\n names: FontNameRecord[];\n totalSfntSize?: number;\n meta?: FontContainerMeta[];\n};\n\nfunction createFontInfoPreview(bytes: Uint8Array, extension: string): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-font-info\";\n\n const heading = document.createElement(\"strong\");\n heading.textContent = \"字体结构\";\n wrapper.append(heading);\n\n const parsed = parseFontInfo(bytes, extension);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"无法解析字体结构。\";\n wrapper.append(error);\n return wrapper;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"容器\", parsed.container || \"sfnt\");\n appendMeta(summary, \"Flavor\", parsed.flavor || \"未知\");\n appendMeta(summary, \"表数量\", parsed.tables.length);\n if (parsed.totalSfntSize !== undefined) {\n appendMeta(summary, \"展开大小\", formatBytes(parsed.totalSfntSize));\n }\n for (const item of parsed.meta || []) {\n appendMeta(summary, item.label, item.value);\n }\n wrapper.append(summary);\n\n if (parsed.error) {\n const note = document.createElement(\"p\");\n note.className = \"ofv-data-note\";\n note.textContent = parsed.error;\n wrapper.append(note);\n }\n\n if (parsed.names.length > 0) {\n wrapper.append(createKeyValueTable(\"Name\", parsed.names.map((item) => ({ key: item.label, value: item.value }))));\n }\n\n if (parsed.tables.length > 0) {\n wrapper.append(createFontTablePreview(parsed.tables));\n }\n return wrapper;\n}\n\nfunction createFontTablePreview(tables: FontTableEntry[]): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-font-tables\";\n const title = document.createElement(\"strong\");\n title.textContent = \"Tables\";\n\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const headRow = document.createElement(\"tr\");\n for (const label of [\"Tag\", \"Offset\", \"Length\", \"Compressed\", \"Checksum\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n headRow.append(th);\n }\n thead.append(headRow);\n\n const tbody = document.createElement(\"tbody\");\n for (const entry of tables.slice(0, 80)) {\n const row = document.createElement(\"tr\");\n for (const value of [\n entry.tag,\n `0x${entry.offset.toString(16).toUpperCase()}`,\n formatBytes(entry.length),\n entry.compressedLength === undefined ? \"-\" : formatBytes(entry.compressedLength),\n entry.checksum === undefined ? \"-\" : `0x${entry.checksum.toString(16).padStart(8, \"0\").toUpperCase()}`\n ]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n row.append(cell);\n }\n tbody.append(row);\n }\n table.append(thead, tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\nfunction parseFontInfo(bytes: Uint8Array, extension: string): FontInfo {\n if (bytes.length < 4) {\n return { valid: false, error: \"文件太短,无法读取字体头。\", tables: [], names: [] };\n }\n const signature = asciiAt(bytes, 0, 4);\n if (signature === \"wOFF\") {\n return parseWoffFont(bytes);\n }\n if (signature === \"wOF2\") {\n return parseWoff2Font(bytes);\n }\n if (extension === \"eot\") {\n return parseEotFont(bytes);\n }\n return parseSfntFont(bytes, 0, \"sfnt\");\n}\n\nfunction parseSfntFont(bytes: Uint8Array, offset: number, container: string): FontInfo {\n if (offset + 12 > bytes.length) {\n return { valid: false, error: \"文件太短,无法读取 sfnt offset table。\", tables: [], names: [] };\n }\n const flavor = fontFlavor(bytes, offset);\n if (!flavor) {\n return { valid: false, error: \"缺少有效的 TrueType/OpenType sfnt 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const tableCount = view.getUint16(offset + 4, false);\n const directoryEnd = offset + 12 + tableCount * 16;\n if (tableCount <= 0 || directoryEnd > bytes.length) {\n return { valid: false, error: \"sfnt 表目录超出文件边界。\", tables: [], names: [] };\n }\n const tables: FontTableEntry[] = [];\n for (let index = 0; index < tableCount; index++) {\n const entryOffset = offset + 12 + index * 16;\n tables.push({\n tag: asciiAt(bytes, entryOffset, 4),\n checksum: view.getUint32(entryOffset + 4, false),\n offset: view.getUint32(entryOffset + 8, false),\n length: view.getUint32(entryOffset + 12, false)\n });\n }\n return {\n valid: true,\n container,\n flavor,\n tables,\n names: parseFontNameTable(bytes, tables.find((table) => table.tag === \"name\"))\n };\n}\n\nfunction parseWoffFont(bytes: Uint8Array): FontInfo {\n if (bytes.length < 44) {\n return { valid: false, error: \"文件太短,无法读取 WOFF 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const tableCount = view.getUint16(12, false);\n const directoryEnd = 44 + tableCount * 20;\n if (tableCount <= 0 || directoryEnd > bytes.length) {\n return { valid: false, error: \"WOFF 表目录超出文件边界。\", tables: [], names: [] };\n }\n const tables: FontTableEntry[] = [];\n for (let index = 0; index < tableCount; index++) {\n const entryOffset = 44 + index * 20;\n tables.push({\n tag: asciiAt(bytes, entryOffset, 4),\n offset: view.getUint32(entryOffset + 4, false),\n compressedLength: view.getUint32(entryOffset + 8, false),\n length: view.getUint32(entryOffset + 12, false),\n checksum: view.getUint32(entryOffset + 16, false)\n });\n }\n return {\n valid: true,\n container: \"WOFF\",\n flavor: fontFlavor(bytes, 4) || asciiAt(bytes, 4, 4),\n tables,\n names: parseFontNameTable(bytes, tables.find((table) => table.tag === \"name\" && table.compressedLength === table.length)),\n totalSfntSize: view.getUint32(16, false)\n };\n}\n\nfunction parseWoff2Font(bytes: Uint8Array): FontInfo {\n if (bytes.length < 48) {\n return { valid: false, error: \"文件太短,无法读取 WOFF2 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const tableCount = view.getUint16(12, false);\n let offset = 48;\n const tables: FontTableEntry[] = [];\n for (let index = 0; index < tableCount; index++) {\n if (offset >= bytes.length) {\n return { valid: false, error: \"WOFF2 表目录超出文件边界。\", tables: [], names: [] };\n }\n const flags = bytes[offset++];\n const knownTag = flags & 0x3f;\n let tag = woff2KnownTableTag(knownTag);\n if (knownTag === 0x3f) {\n if (offset + 4 > bytes.length) {\n return { valid: false, error: \"WOFF2 自定义表 tag 超出文件边界。\", tables: [], names: [] };\n }\n tag = asciiAt(bytes, offset, 4);\n offset += 4;\n }\n const originalLength = read255UInt16(bytes, offset);\n if (!originalLength) {\n return { valid: false, error: \"WOFF2 表目录长度字段不完整。\", tables: [], names: [] };\n }\n offset = originalLength.offset;\n let transformedLength: number | undefined;\n const hasTransform = (flags & 0xc0) !== 0 || (tag === \"glyf\" && (flags & 0xc0) !== 0) || (tag === \"loca\" && (flags & 0xc0) !== 0);\n if (hasTransform && tag !== \"loca\") {\n const transformed = read255UInt16(bytes, offset);\n if (!transformed) {\n return { valid: false, error: \"WOFF2 transformLength 字段不完整。\", tables: [], names: [] };\n }\n transformedLength = transformed.value;\n offset = transformed.offset;\n }\n tables.push({\n tag,\n offset: 0,\n length: originalLength.value,\n compressedLength: transformedLength\n });\n }\n return {\n valid: true,\n container: \"WOFF2\",\n flavor: fontFlavor(bytes, 4) || asciiAt(bytes, 4, 4),\n tables,\n names: [],\n totalSfntSize: view.getUint32(16, false),\n meta: [\n { label: \"压缩数据\", value: formatBytes(view.getUint32(20, false)) },\n { label: \"Meta\", value: view.getUint32(32, false) > 0 ? `${formatBytes(view.getUint32(36, false))} @ 0x${view.getUint32(32, false).toString(16).toUpperCase()}` : \"无\" },\n { label: \"Private\", value: view.getUint32(40, false) > 0 ? `${formatBytes(view.getUint32(44, false))} @ 0x${view.getUint32(40, false).toString(16).toUpperCase()}` : \"无\" }\n ],\n error: \"WOFF2 已解析容器头和压缩表目录;name 表内容需 Brotli 解压后才能展开。\"\n };\n}\n\nfunction parseEotFont(bytes: Uint8Array): FontInfo {\n if (bytes.length < 82) {\n return { valid: false, error: \"文件太短,无法读取 EOT 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const eotSize = view.getUint32(0, true);\n const fontDataSize = view.getUint32(4, true);\n const version = view.getUint32(8, true);\n const flags = view.getUint32(12, true);\n const panose = Array.from(bytes.slice(16, 26)).map((item) => item.toString(16).padStart(2, \"0\")).join(\" \");\n const charset = bytes[26];\n const italic = bytes[27];\n const weight = view.getUint32(28, true);\n let offset = 68;\n const names: FontNameRecord[] = [];\n const fields: Array<{ id: number; label: string; padded: boolean }> = [\n { id: 1, label: \"Family\", padded: true },\n { id: 2, label: \"Subfamily\", padded: true },\n { id: 5, label: \"Version\", padded: true },\n { id: 4, label: \"Full name\", padded: true },\n { id: 0, label: \"Root strings\", padded: false }\n ];\n for (const field of fields) {\n const fieldValue = readEotStringField(bytes, offset, field.padded);\n if (!fieldValue) {\n break;\n }\n offset = fieldValue.offset;\n if (field.id > 0 && fieldValue.value) {\n names.push({ id: field.id, label: field.label, value: fieldValue.value });\n }\n }\n if (offset + 4 <= bytes.length) {\n offset += 4;\n }\n const sfntOffset = findEmbeddedSfntOffset(bytes, offset);\n const embedded = sfntOffset === undefined ? undefined : parseSfntFont(bytes, sfntOffset, \"EOT embedded sfnt\");\n return {\n valid: true,\n container: \"EOT\",\n flavor: embedded?.valid ? embedded.flavor : \"Embedded OpenType\",\n tables: embedded?.valid ? embedded.tables : [],\n names: embedded?.valid && embedded.names.length > 0 ? embedded.names : names,\n totalSfntSize: fontDataSize || undefined,\n meta: [\n { label: \"EOT 大小\", value: eotSize ? formatBytes(eotSize) : \"未声明\" },\n { label: \"版本\", value: `0x${version.toString(16).toUpperCase()}` },\n { label: \"Flags\", value: `0x${flags.toString(16).toUpperCase()}` },\n { label: \"Weight\", value: weight || \"未声明\" },\n { label: \"Italic\", value: italic ? \"是\" : \"否\" },\n { label: \"Charset\", value: charset },\n { label: \"PANOSE\", value: panose },\n { label: \"sfnt 偏移\", value: sfntOffset === undefined ? \"未找到\" : `0x${sfntOffset.toString(16).toUpperCase()}` }\n ],\n error: embedded?.valid ? undefined : \"已解析 EOT 容器头和名称字段,但未找到可展开的内嵌 sfnt 表目录。\"\n };\n}\n\nfunction readEotStringField(bytes: Uint8Array, offset: number, padded: boolean): { value: string; offset: number } | undefined {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n if (padded) {\n if (offset + 2 > bytes.length) {\n return undefined;\n }\n offset += 2;\n }\n if (offset + 2 > bytes.length) {\n return undefined;\n }\n const length = view.getUint16(offset, true);\n offset += 2;\n if (offset + length > bytes.length) {\n return undefined;\n }\n const value = length > 0 ? decodeEotString(bytes.slice(offset, offset + length)) : \"\";\n return { value, offset: offset + length };\n}\n\nfunction woff2KnownTableTag(index: number): string {\n const tags = [\n \"cmap\",\n \"head\",\n \"hhea\",\n \"hmtx\",\n \"maxp\",\n \"name\",\n \"OS/2\",\n \"post\",\n \"cvt \",\n \"fpgm\",\n \"glyf\",\n \"loca\",\n \"prep\",\n \"CFF \",\n \"VORG\",\n \"EBDT\",\n \"EBLC\",\n \"gasp\",\n \"hdmx\",\n \"kern\",\n \"LTSH\",\n \"PCLT\",\n \"VDMX\",\n \"vhea\",\n \"vmtx\",\n \"BASE\",\n \"GDEF\",\n \"GPOS\",\n \"GSUB\",\n \"EBSC\",\n \"JSTF\",\n \"MATH\",\n \"CBDT\",\n \"CBLC\",\n \"COLR\",\n \"CPAL\",\n \"SVG \",\n \"sbix\",\n \"acnt\",\n \"avar\",\n \"bdat\",\n \"bloc\",\n \"bsln\",\n \"cvar\",\n \"fdsc\",\n \"feat\",\n \"fmtx\",\n \"fvar\",\n \"gvar\",\n \"hsty\",\n \"just\",\n \"lcar\",\n \"mort\",\n \"morx\",\n \"opbd\",\n \"prop\",\n \"trak\",\n \"Zapf\",\n \"Silf\",\n \"Glat\",\n \"Gloc\",\n \"Feat\",\n \"Sill\"\n ];\n return tags[index] || `table-${index}`;\n}\n\nfunction read255UInt16(bytes: Uint8Array, offset: number): { value: number; offset: number } | undefined {\n if (offset >= bytes.length) {\n return undefined;\n }\n const code = bytes[offset++];\n if (code === 253) {\n if (offset + 2 > bytes.length) {\n return undefined;\n }\n return { value: (bytes[offset] << 8) | bytes[offset + 1], offset: offset + 2 };\n }\n if (code === 254) {\n if (offset >= bytes.length) {\n return undefined;\n }\n return { value: bytes[offset] + 506, offset: offset + 1 };\n }\n if (code === 255) {\n if (offset >= bytes.length) {\n return undefined;\n }\n return { value: bytes[offset] + 253, offset: offset + 1 };\n }\n return { value: code, offset };\n}\n\nfunction decodeEotString(bytes: Uint8Array): string {\n const text = decodeUtf16Le(bytes).replace(/\\0+$/g, \"\").trim();\n return text || new TextDecoder(\"latin1\").decode(bytes).replace(/\\0+$/g, \"\").trim();\n}\n\nfunction decodeUtf16Le(bytes: Uint8Array): string {\n let value = \"\";\n for (let index = 0; index + 1 < bytes.length; index += 2) {\n value += String.fromCharCode(bytes[index] | (bytes[index + 1] << 8));\n }\n return value;\n}\n\nfunction findEmbeddedSfntOffset(bytes: Uint8Array, start: number): number | undefined {\n for (let offset = Math.max(0, start); offset + 12 <= bytes.length; offset++) {\n const flavor = fontFlavor(bytes, offset);\n if (!flavor) {\n continue;\n }\n const tableCount = (bytes[offset + 4] << 8) | bytes[offset + 5];\n const directoryEnd = offset + 12 + tableCount * 16;\n if (tableCount > 0 && directoryEnd <= bytes.length) {\n return offset;\n }\n }\n return undefined;\n}\n\nfunction fontFlavor(bytes: Uint8Array, offset: number): string | undefined {\n if (offset + 4 > bytes.length) {\n return undefined;\n }\n const ascii = asciiAt(bytes, offset, 4);\n if (ascii === \"OTTO\") {\n return \"OpenType/CFF\";\n }\n if (ascii === \"true\") {\n return \"Apple TrueType\";\n }\n if (ascii === \"typ1\") {\n return \"Type 1 sfnt\";\n }\n if (bytes[offset] === 0x00 && bytes[offset + 1] === 0x01 && bytes[offset + 2] === 0x00 && bytes[offset + 3] === 0x00) {\n return \"TrueType\";\n }\n return undefined;\n}\n\nfunction parseFontNameTable(bytes: Uint8Array, table?: FontTableEntry): FontNameRecord[] {\n if (!table || table.offset + table.length > bytes.length || table.length < 6) {\n return [];\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const offset = table.offset;\n const count = view.getUint16(offset + 2, false);\n const storageOffset = view.getUint16(offset + 4, false);\n const recordsEnd = offset + 6 + count * 12;\n if (recordsEnd > bytes.length || storageOffset > table.length) {\n return [];\n }\n const wanted = new Map<number, string>([\n [1, \"Family\"],\n [2, \"Subfamily\"],\n [4, \"Full name\"],\n [5, \"Version\"],\n [6, \"PostScript name\"],\n [8, \"Manufacturer\"],\n [13, \"License\"],\n [16, \"Typographic family\"],\n [17, \"Typographic subfamily\"]\n ]);\n const names = new Map<number, FontNameRecord>();\n for (let index = 0; index < count; index++) {\n const recordOffset = offset + 6 + index * 12;\n const platformId = view.getUint16(recordOffset, false);\n const encodingId = view.getUint16(recordOffset + 2, false);\n const languageId = view.getUint16(recordOffset + 4, false);\n const nameId = view.getUint16(recordOffset + 6, false);\n const length = view.getUint16(recordOffset + 8, false);\n const stringOffset = view.getUint16(recordOffset + 10, false);\n const label = wanted.get(nameId);\n if (!label || names.has(nameId)) {\n continue;\n }\n const start = offset + storageOffset + stringOffset;\n const end = start + length;\n if (end > bytes.length || end > offset + table.length) {\n continue;\n }\n const value = decodeFontName(bytes.slice(start, end), platformId, encodingId).trim();\n if (value) {\n names.set(nameId, { id: nameId, label: languageId ? `${label} (${languageId.toString(16).toUpperCase()})` : label, value });\n }\n }\n return [...names.values()];\n}\n\nfunction decodeFontName(bytes: Uint8Array, platformId: number, encodingId: number): string {\n if (platformId === 0 || platformId === 3 || (platformId === 2 && encodingId === 1)) {\n return decodeUtf16Be(bytes);\n }\n return new TextDecoder(\"latin1\").decode(bytes);\n}\n\nfunction decodeUtf16Be(bytes: Uint8Array): string {\n let value = \"\";\n for (let index = 0; index + 1 < bytes.length; index += 2) {\n value += String.fromCharCode((bytes[index] << 8) | bytes[index + 1]);\n }\n return value;\n}\n\ntype WasmSection = {\n id: number;\n name: string;\n size: number;\n offset: number;\n customName?: string;\n};\n\ntype WasmImport = {\n module: string;\n name: string;\n kind: string;\n};\n\ntype WasmExport = {\n name: string;\n kind: string;\n index: number;\n};\n\ntype WasmPreview = {\n valid: boolean;\n version?: number;\n error?: string;\n sections: WasmSection[];\n imports: WasmImport[];\n exports: WasmExport[];\n};\n\nfunction createWasmPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-wasm-preview\";\n const parsed = parseWasm(bytes);\n\n const heading = document.createElement(\"strong\");\n heading.textContent = \"WASM 结构\";\n preview.append(heading);\n\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-wasm-error\";\n error.textContent = parsed.error || \"不是有效的 WebAssembly 二进制模块。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-wasm-summary\";\n appendMeta(summary, \"版本\", parsed.version ?? \"未知\");\n appendMeta(summary, \"Sections\", parsed.sections.length);\n appendMeta(summary, \"Imports\", parsed.imports.length);\n appendMeta(summary, \"Exports\", parsed.exports.length);\n preview.append(summary);\n\n preview.append(createWasmSectionTable(parsed.sections));\n if (parsed.imports.length > 0) {\n preview.append(createWasmList(\"导入\", parsed.imports.map((item) => `${item.module}.${item.name} · ${item.kind}`)));\n }\n if (parsed.exports.length > 0) {\n preview.append(createWasmList(\"导出\", parsed.exports.map((item) => `${item.name} · ${item.kind} #${item.index}`)));\n }\n\n return preview;\n}\n\nfunction createWasmSectionTable(sections: WasmSection[]): HTMLElement {\n const table = document.createElement(\"table\");\n table.className = \"ofv-wasm-sections\";\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"Section\", \"大小\", \"偏移\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const section of sections.slice(0, 80)) {\n const row = document.createElement(\"tr\");\n const name = document.createElement(\"td\");\n name.textContent = section.customName ? `${section.name} (${section.customName})` : section.name;\n const size = document.createElement(\"td\");\n size.textContent = formatBytes(section.size);\n const offset = document.createElement(\"td\");\n offset.textContent = `0x${section.offset.toString(16).toUpperCase()}`;\n row.append(name, size, offset);\n tbody.append(row);\n }\n table.append(thead, tbody);\n return table;\n}\n\nfunction createWasmList(titleText: string, rows: string[]): HTMLElement {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-wasm-list\";\n details.open = true;\n const summary = document.createElement(\"summary\");\n summary.textContent = `${titleText} ${rows.length}`;\n const list = document.createElement(\"ul\");\n for (const row of rows.slice(0, 120)) {\n const item = document.createElement(\"li\");\n item.textContent = row;\n list.append(item);\n }\n if (rows.length > 120) {\n const item = document.createElement(\"li\");\n item.textContent = `还有 ${rows.length - 120} 项未展示。`;\n list.append(item);\n }\n details.append(summary, list);\n return details;\n}\n\nfunction parseWasm(bytes: Uint8Array): WasmPreview {\n if (bytes.length < 8 || bytes[0] !== 0x00 || bytes[1] !== 0x61 || bytes[2] !== 0x73 || bytes[3] !== 0x6d) {\n return { valid: false, error: \"缺少 WebAssembly magic header。\", sections: [], imports: [], exports: [] };\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const version = view.getUint32(4, true);\n const sections: WasmSection[] = [];\n const imports: WasmImport[] = [];\n const exports: WasmExport[] = [];\n let offset = 8;\n\n try {\n while (offset < bytes.length) {\n const sectionOffset = offset;\n const id = bytes[offset++];\n const sizeInfo = readVarUint(bytes, offset);\n offset = sizeInfo.offset;\n const payloadOffset = offset;\n const payloadEnd = payloadOffset + sizeInfo.value;\n if (payloadEnd > bytes.length) {\n throw new Error(\"section 长度超过文件边界。\");\n }\n\n const section: WasmSection = {\n id,\n name: wasmSectionName(id),\n size: sizeInfo.value,\n offset: sectionOffset\n };\n if (id === 0) {\n const customName = readWasmName(bytes, payloadOffset, payloadEnd);\n section.customName = customName.value || undefined;\n } else if (id === 2) {\n imports.push(...parseWasmImports(bytes, payloadOffset, payloadEnd));\n } else if (id === 7) {\n exports.push(...parseWasmExports(bytes, payloadOffset, payloadEnd));\n }\n sections.push(section);\n offset = payloadEnd;\n }\n } catch (error) {\n return {\n valid: false,\n version,\n error: error instanceof Error ? error.message : \"WASM section 解析失败。\",\n sections,\n imports,\n exports\n };\n }\n\n return { valid: true, version, sections, imports, exports };\n}\n\nfunction parseWasmImports(bytes: Uint8Array, offset: number, end: number): WasmImport[] {\n const imports: WasmImport[] = [];\n const count = readVarUint(bytes, offset);\n offset = count.offset;\n for (let index = 0; index < count.value && offset < end; index++) {\n const moduleName = readWasmName(bytes, offset, end);\n offset = moduleName.offset;\n const importName = readWasmName(bytes, offset, end);\n offset = importName.offset;\n const kind = bytes[offset++];\n offset = skipWasmImportDescriptor(bytes, offset, end, kind);\n imports.push({ module: moduleName.value, name: importName.value, kind: wasmExternalKind(kind) });\n }\n return imports;\n}\n\nfunction parseWasmExports(bytes: Uint8Array, offset: number, end: number): WasmExport[] {\n const exports: WasmExport[] = [];\n const count = readVarUint(bytes, offset);\n offset = count.offset;\n for (let index = 0; index < count.value && offset < end; index++) {\n const exportName = readWasmName(bytes, offset, end);\n offset = exportName.offset;\n const kind = bytes[offset++];\n const itemIndex = readVarUint(bytes, offset);\n offset = itemIndex.offset;\n exports.push({ name: exportName.value, kind: wasmExternalKind(kind), index: itemIndex.value });\n }\n return exports;\n}\n\nfunction skipWasmImportDescriptor(bytes: Uint8Array, offset: number, end: number, kind: number): number {\n if (kind === 0x00) {\n return readVarUint(bytes, offset).offset;\n }\n if (kind === 0x01) {\n const elementTypeOffset = offset + 1;\n return skipWasmLimits(bytes, elementTypeOffset, end);\n }\n if (kind === 0x02) {\n return skipWasmLimits(bytes, offset, end);\n }\n if (kind === 0x03) {\n return Math.min(end, offset + 2);\n }\n return offset;\n}\n\nfunction skipWasmLimits(bytes: Uint8Array, offset: number, end: number): number {\n const flags = bytes[offset++];\n offset = readVarUint(bytes, offset).offset;\n if ((flags & 0x01) === 0x01 && offset < end) {\n offset = readVarUint(bytes, offset).offset;\n }\n return offset;\n}\n\nfunction readVarUint(bytes: Uint8Array, offset: number): { value: number; offset: number } {\n let result = 0;\n let shift = 0;\n for (let index = 0; index < 5; index++) {\n if (offset >= bytes.length) {\n throw new Error(\"LEB128 数据不完整。\");\n }\n const byte = bytes[offset++];\n result |= (byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) {\n return { value: result >>> 0, offset };\n }\n shift += 7;\n }\n throw new Error(\"LEB128 数据过长。\");\n}\n\nfunction readWasmName(bytes: Uint8Array, offset: number, end: number): { value: string; offset: number } {\n const length = readVarUint(bytes, offset);\n offset = length.offset;\n const nameEnd = offset + length.value;\n if (nameEnd > end) {\n throw new Error(\"字符串长度超过 section 边界。\");\n }\n return { value: new TextDecoder().decode(bytes.slice(offset, nameEnd)), offset: nameEnd };\n}\n\nfunction wasmSectionName(id: number): string {\n const names: Record<number, string> = {\n 0: \"custom\",\n 1: \"type\",\n 2: \"import\",\n 3: \"function\",\n 4: \"table\",\n 5: \"memory\",\n 6: \"global\",\n 7: \"export\",\n 8: \"start\",\n 9: \"element\",\n 10: \"code\",\n 11: \"data\",\n 12: \"data-count\"\n };\n return names[id] || `unknown ${id}`;\n}\n\nfunction wasmExternalKind(kind: number): string {\n const names: Record<number, string> = {\n 0x00: \"function\",\n 0x01: \"table\",\n 0x02: \"memory\",\n 0x03: \"global\"\n };\n return names[kind] || `unknown ${kind}`;\n}\n\ntype PhotoshopHeader = {\n valid: boolean;\n error?: string;\n signature?: string;\n version?: number;\n channels?: number;\n width?: number;\n height?: number;\n depth?: number;\n colorMode?: number;\n};\n\nfunction createPhotoshopPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-psd-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"Photoshop 结构\";\n preview.append(heading);\n\n const header = parsePhotoshopHeader(bytes);\n if (!header.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-psd-error\";\n error.textContent = header.error || \"不是有效的 Photoshop 文档头。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-psd-summary\";\n appendMeta(summary, \"版本\", header.version === 2 ? \"PSB 大文档\" : \"PSD\");\n appendMeta(summary, \"画布\", `${header.width} x ${header.height}px`);\n appendMeta(summary, \"通道\", header.channels ?? \"未知\");\n appendMeta(summary, \"位深\", `${header.depth ?? \"未知\"} bit`);\n appendMeta(summary, \"颜色模式\", photoshopColorMode(header.colorMode ?? -1));\n preview.append(summary);\n\n return preview;\n}\n\nfunction parsePhotoshopHeader(bytes: Uint8Array): PhotoshopHeader {\n if (bytes.length < 26) {\n return { valid: false, error: \"文件太短,无法读取 PSD/PSB 头信息。\" };\n }\n const signature = new TextDecoder(\"ascii\").decode(bytes.slice(0, 4));\n if (signature !== \"8BPS\") {\n return { valid: false, signature, error: \"缺少 8BPS Photoshop 签名。\" };\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const version = view.getUint16(4, false);\n if (version !== 1 && version !== 2) {\n return { valid: false, signature, version, error: `未知 Photoshop 文件版本:${version}。` };\n }\n\n const reserved = bytes.slice(6, 12);\n if (reserved.some((byte) => byte !== 0)) {\n return { valid: false, signature, version, error: \"PSD/PSB 保留字段不为 0,文件头可能已损坏。\" };\n }\n\n return {\n valid: true,\n signature,\n version,\n channels: view.getUint16(12, false),\n height: view.getUint32(14, false),\n width: view.getUint32(18, false),\n depth: view.getUint16(22, false),\n colorMode: view.getUint16(24, false)\n };\n}\n\nfunction photoshopColorMode(mode: number): string {\n const modes: Record<number, string> = {\n 0: \"Bitmap\",\n 1: \"Grayscale\",\n 2: \"Indexed\",\n 3: \"RGB\",\n 4: \"CMYK\",\n 7: \"Multichannel\",\n 8: \"Duotone\",\n 9: \"Lab\"\n };\n return modes[mode] ? `${modes[mode]} (${mode})` : `未知 (${mode})`;\n}\n\ntype SqliteHeader = {\n valid: boolean;\n error?: string;\n pageSize?: number;\n writeVersion?: number;\n readVersion?: number;\n pageCount?: number;\n schemaVersion?: number;\n textEncoding?: number;\n userVersion?: number;\n};\n\ntype SqliteSchemaEntry = {\n type: string;\n name: string;\n tableName: string;\n rootPage: number;\n sql: string;\n};\n\nfunction createSqlitePreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-sqlite-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"SQLite 结构\";\n preview.append(heading);\n\n const header = parseSqliteHeader(bytes);\n if (!header.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-sqlite-error\";\n error.textContent = header.error || \"不是有效的 SQLite 数据库文件。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-sqlite-summary\";\n appendMeta(summary, \"页大小\", `${header.pageSize} B`);\n appendMeta(summary, \"页数\", header.pageCount ?? \"未知\");\n appendMeta(summary, \"读写版本\", `${sqliteJournalMode(header.readVersion)} / ${sqliteJournalMode(header.writeVersion)}`);\n appendMeta(summary, \"Schema\", header.schemaVersion ?? \"未知\");\n appendMeta(summary, \"编码\", sqliteEncoding(header.textEncoding));\n appendMeta(summary, \"User version\", header.userVersion ?? 0);\n preview.append(summary);\n\n const schema = parseSqliteSchema(bytes, header);\n if (schema.length > 0) {\n preview.append(createSqliteSchemaTable(schema));\n } else {\n const empty = document.createElement(\"p\");\n empty.className = \"ofv-sqlite-empty\";\n empty.textContent = \"未从第一页 sqlite_schema 叶子页提取到结构定义;复杂数据库可后续接入 sqlite-wasm 完整读取。\";\n preview.append(empty);\n }\n\n return preview;\n}\n\nfunction parseSqliteHeader(bytes: Uint8Array): SqliteHeader {\n if (bytes.length < 100) {\n return { valid: false, error: \"文件太短,无法读取 SQLite 数据库头。\" };\n }\n const signature = new TextDecoder(\"ascii\").decode(bytes.slice(0, 16));\n if (signature !== \"SQLite format 3\\0\") {\n return { valid: false, error: \"缺少 SQLite format 3 文件签名。\" };\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const rawPageSize = view.getUint16(16, false);\n const pageSize = rawPageSize === 1 ? 65536 : rawPageSize;\n if (pageSize < 512 || pageSize > 65536 || (pageSize & (pageSize - 1)) !== 0) {\n return { valid: false, error: `SQLite 页大小无效:${pageSize}。` };\n }\n\n return {\n valid: true,\n pageSize,\n writeVersion: bytes[18],\n readVersion: bytes[19],\n pageCount: view.getUint32(28, false),\n schemaVersion: view.getUint32(40, false),\n textEncoding: view.getUint32(56, false),\n userVersion: view.getUint32(60, false)\n };\n}\n\nfunction parseSqliteSchema(bytes: Uint8Array, header: SqliteHeader): SqliteSchemaEntry[] {\n const pageSize = header.pageSize || 0;\n if (pageSize <= 0 || bytes.length < Math.min(pageSize, 100)) {\n return [];\n }\n const pageStart = 0;\n const btreeStart = 100;\n if (bytes[btreeStart] !== 0x0d) {\n return [];\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const cellCount = view.getUint16(btreeStart + 3, false);\n const entries: SqliteSchemaEntry[] = [];\n for (let index = 0; index < Math.min(cellCount, 80); index++) {\n const pointerOffset = btreeStart + 8 + index * 2;\n if (pointerOffset + 2 > bytes.length) {\n break;\n }\n const cellOffset = pageStart + view.getUint16(pointerOffset, false);\n const entry = parseSqliteSchemaCell(bytes, cellOffset, pageStart + pageSize);\n if (entry) {\n entries.push(entry);\n }\n }\n return entries;\n}\n\nfunction parseSqliteSchemaCell(bytes: Uint8Array, offset: number, pageEnd: number): SqliteSchemaEntry | null {\n try {\n let cursor = offset;\n const payloadLength = readSqliteVarint(bytes, cursor);\n cursor = payloadLength.offset;\n const rowId = readSqliteVarint(bytes, cursor);\n cursor = rowId.offset;\n const payloadEnd = Math.min(pageEnd, cursor + Number(payloadLength.value));\n if (payloadEnd > bytes.length) {\n return null;\n }\n const record = parseSqliteRecord(bytes, cursor, payloadEnd);\n if (record.length < 5) {\n return null;\n }\n return {\n type: String(record[0] ?? \"\"),\n name: String(record[1] ?? \"\"),\n tableName: String(record[2] ?? \"\"),\n rootPage: Number(record[3] ?? 0),\n sql: String(record[4] ?? \"\")\n };\n } catch {\n return null;\n }\n}\n\nfunction parseSqliteRecord(bytes: Uint8Array, offset: number, end: number): Array<string | number | null> {\n const headerSize = readSqliteVarint(bytes, offset);\n let headerCursor = headerSize.offset;\n const bodyStart = offset + Number(headerSize.value);\n let bodyCursor = bodyStart;\n const serialTypes: bigint[] = [];\n while (headerCursor < bodyStart && headerCursor < end) {\n const serial = readSqliteVarint(bytes, headerCursor);\n serialTypes.push(serial.value);\n headerCursor = serial.offset;\n }\n return serialTypes.map((serialType) => {\n const value = readSqliteValue(bytes, bodyCursor, end, serialType);\n bodyCursor = value.offset;\n return value.value;\n });\n}\n\nfunction readSqliteValue(\n bytes: Uint8Array,\n offset: number,\n end: number,\n serialType: bigint\n): { value: string | number | null; offset: number } {\n const type = Number(serialType);\n if (type === 0) {\n return { value: null, offset };\n }\n if (type === 1) {\n return { value: signedInteger(bytes, offset, 1), offset: offset + 1 };\n }\n if (type === 2) {\n return { value: signedInteger(bytes, offset, 2), offset: offset + 2 };\n }\n if (type === 3) {\n return { value: signedInteger(bytes, offset, 3), offset: offset + 3 };\n }\n if (type === 4) {\n return { value: signedInteger(bytes, offset, 4), offset: offset + 4 };\n }\n if (type === 5) {\n return { value: signedInteger(bytes, offset, 6), offset: offset + 6 };\n }\n if (type === 6) {\n return { value: signedInteger(bytes, offset, 8), offset: offset + 8 };\n }\n if (type === 8) {\n return { value: 0, offset };\n }\n if (type === 9) {\n return { value: 1, offset };\n }\n if (type >= 12) {\n const length = Math.floor((type - 12) / 2);\n const valueEnd = Math.min(end, offset + length);\n if (type % 2 === 1) {\n return { value: new TextDecoder().decode(bytes.slice(offset, valueEnd)), offset: offset + length };\n }\n return { value: `<blob ${length} B>`, offset: offset + length };\n }\n return { value: null, offset };\n}\n\nfunction readSqliteVarint(bytes: Uint8Array, offset: number): { value: bigint; offset: number } {\n let value = 0n;\n for (let index = 0; index < 9; index++) {\n if (offset >= bytes.length) {\n throw new Error(\"SQLite varint 数据不完整。\");\n }\n const byte = bytes[offset++];\n if (index === 8) {\n value = (value << 8n) | BigInt(byte);\n return { value, offset };\n }\n value = (value << 7n) | BigInt(byte & 0x7f);\n if ((byte & 0x80) === 0) {\n return { value, offset };\n }\n }\n return { value, offset };\n}\n\nfunction signedInteger(bytes: Uint8Array, offset: number, length: number): number {\n let value = 0n;\n for (let index = 0; index < length; index++) {\n value = (value << 8n) | BigInt(bytes[offset + index] || 0);\n }\n const bits = BigInt(length * 8);\n const signBit = 1n << (bits - 1n);\n if ((value & signBit) !== 0n) {\n value -= 1n << bits;\n }\n return Number(value);\n}\n\nfunction createSqliteSchemaTable(entries: SqliteSchemaEntry[]): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-sqlite-schema\";\n const title = document.createElement(\"strong\");\n title.textContent = `Schema 对象 ${entries.length}`;\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"类型\", \"名称\", \"表\", \"Root\", \"SQL\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const entry of entries) {\n const row = document.createElement(\"tr\");\n for (const value of [entry.type, entry.name, entry.tableName, String(entry.rootPage), entry.sql]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n row.append(cell);\n }\n tbody.append(row);\n }\n table.append(thead, tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\nfunction sqliteJournalMode(value?: number): string {\n if (value === 1) {\n return \"rollback\";\n }\n if (value === 2) {\n return \"WAL\";\n }\n return value === undefined ? \"未知\" : String(value);\n}\n\nfunction sqliteEncoding(value?: number): string {\n const encodings: Record<number, string> = {\n 0: \"未声明\",\n 1: \"UTF-8\",\n 2: \"UTF-16le\",\n 3: \"UTF-16be\"\n };\n return value === undefined ? \"未知\" : encodings[value] || `未知 (${value})`;\n}\n\ntype ParquetPreview = {\n valid: boolean;\n error?: string;\n footerLength?: number;\n footerOffset?: number;\n dataBytes?: number;\n};\n\nfunction createParquetPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"Parquet 结构\";\n preview.append(heading);\n\n const parsed = parseParquet(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 Parquet 文件。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"Magic\", \"PAR1\");\n appendMeta(summary, \"Footer\", `${parsed.footerLength} B`);\n appendMeta(summary, \"Footer offset\", `0x${(parsed.footerOffset || 0).toString(16).toUpperCase()}`);\n appendMeta(summary, \"数据区\", formatBytes(parsed.dataBytes || 0));\n preview.append(summary);\n\n const note = document.createElement(\"p\");\n note.className = \"ofv-data-note\";\n note.textContent = \"Parquet footer 使用 Thrift 编码;当前先展示容器边界,schema/row group 可后续接入 Arrow/Parquet 解码器。\";\n preview.append(note);\n return preview;\n}\n\nfunction parseParquet(bytes: Uint8Array): ParquetPreview {\n if (bytes.length < 12) {\n return { valid: false, error: \"文件太短,无法读取 Parquet 头尾信息。\" };\n }\n if (asciiAt(bytes, 0, 4) !== \"PAR1\" || asciiAt(bytes, bytes.length - 4, 4) !== \"PAR1\") {\n return { valid: false, error: \"缺少 Parquet PAR1 magic header/footer。\" };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const footerLength = view.getUint32(bytes.length - 8, true);\n const footerOffset = bytes.length - 8 - footerLength;\n if (footerOffset < 4) {\n return { valid: false, error: \"Parquet footer 长度超过文件边界。\" };\n }\n return {\n valid: true,\n footerLength,\n footerOffset,\n dataBytes: Math.max(0, footerOffset - 4)\n };\n}\n\ntype AvroMetadata = {\n key: string;\n value: string;\n};\n\ntype AvroPreview = {\n valid: boolean;\n error?: string;\n metadata: AvroMetadata[];\n schema?: {\n type?: string;\n name?: string;\n namespace?: string;\n fields: string[];\n };\n codec?: string;\n syncMarker?: string;\n};\n\nfunction createAvroPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"Avro 结构\";\n preview.append(heading);\n\n const parsed = parseAvro(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 Avro Object Container 文件。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"Magic\", \"Obj\\\\x01\");\n appendMeta(summary, \"Codec\", parsed.codec || \"null\");\n appendMeta(summary, \"Metadata\", parsed.metadata.length);\n appendMeta(summary, \"Sync marker\", parsed.syncMarker || \"未知\");\n preview.append(summary);\n\n if (parsed.schema) {\n const schema = document.createElement(\"div\");\n schema.className = \"ofv-avro-schema\";\n const title = document.createElement(\"strong\");\n title.textContent = \"Schema\";\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-data-summary\";\n appendMeta(meta, \"类型\", parsed.schema.type || \"未知\");\n appendMeta(meta, \"名称\", [parsed.schema.namespace, parsed.schema.name].filter(Boolean).join(\".\") || \"未知\");\n appendMeta(meta, \"字段\", parsed.schema.fields.length);\n schema.append(title, meta);\n if (parsed.schema.fields.length > 0) {\n const list = document.createElement(\"ul\");\n for (const field of parsed.schema.fields.slice(0, 80)) {\n const item = document.createElement(\"li\");\n item.textContent = field;\n list.append(item);\n }\n schema.append(list);\n }\n preview.append(schema);\n }\n\n if (parsed.metadata.length > 0) {\n preview.append(createKeyValueTable(\"Metadata\", parsed.metadata));\n }\n\n return preview;\n}\n\nfunction parseAvro(bytes: Uint8Array): AvroPreview {\n if (bytes.length < 4 || bytes[0] !== 0x4f || bytes[1] !== 0x62 || bytes[2] !== 0x6a || bytes[3] !== 0x01) {\n return { valid: false, error: \"缺少 Avro Object Container magic header。\", metadata: [] };\n }\n let offset = 4;\n const metadata: AvroMetadata[] = [];\n try {\n while (true) {\n const blockCount = readAvroLong(bytes, offset);\n offset = blockCount.offset;\n let count = blockCount.value;\n if (count === 0n) {\n break;\n }\n if (count < 0n) {\n count = -count;\n const blockSize = readAvroLong(bytes, offset);\n offset = blockSize.offset;\n }\n for (let index = 0; index < Number(count); index++) {\n const key = readAvroBytes(bytes, offset);\n offset = key.offset;\n const value = readAvroBytes(bytes, offset);\n offset = value.offset;\n metadata.push({\n key: new TextDecoder().decode(key.value),\n value: decodeAvroMetadataValue(key.value, value.value)\n });\n }\n }\n if (offset + 16 > bytes.length) {\n throw new Error(\"Avro sync marker 缺失。\");\n }\n const syncMarker = Array.from(bytes.slice(offset, offset + 16))\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n const schemaText = metadata.find((item) => item.key === \"avro.schema\")?.value;\n return {\n valid: true,\n metadata,\n codec: metadata.find((item) => item.key === \"avro.codec\")?.value,\n syncMarker,\n schema: schemaText ? summarizeAvroSchema(schemaText) : undefined\n };\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : \"Avro metadata 解析失败。\",\n metadata\n };\n }\n}\n\nfunction readAvroLong(bytes: Uint8Array, offset: number): { value: bigint; offset: number } {\n let result = 0n;\n let shift = 0n;\n for (let index = 0; index < 10; index++) {\n if (offset >= bytes.length) {\n throw new Error(\"Avro long 数据不完整。\");\n }\n const byte = bytes[offset++];\n result |= BigInt(byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) {\n const value = (result >> 1n) ^ -(result & 1n);\n return { value, offset };\n }\n shift += 7n;\n }\n throw new Error(\"Avro long 数据过长。\");\n}\n\nfunction readAvroBytes(bytes: Uint8Array, offset: number): { value: Uint8Array; offset: number } {\n const length = readAvroLong(bytes, offset);\n offset = length.offset;\n if (length.value < 0n) {\n throw new Error(\"Avro bytes 长度无效。\");\n }\n const size = Number(length.value);\n const end = offset + size;\n if (end > bytes.length) {\n throw new Error(\"Avro bytes 超出文件边界。\");\n }\n return { value: bytes.slice(offset, end), offset: end };\n}\n\nfunction decodeAvroMetadataValue(keyBytes: Uint8Array, valueBytes: Uint8Array): string {\n const key = new TextDecoder().decode(keyBytes);\n if (key === \"avro.schema\" || key === \"avro.codec\" || /^[a-z0-9_.-]+$/i.test(key)) {\n return new TextDecoder().decode(valueBytes);\n }\n return `<${valueBytes.length} B>`;\n}\n\nfunction summarizeAvroSchema(schemaText: string): AvroPreview[\"schema\"] {\n try {\n const schema = JSON.parse(schemaText) as {\n type?: string;\n name?: string;\n namespace?: string;\n fields?: Array<{ name?: string; type?: unknown }>;\n };\n return {\n type: typeof schema.type === \"string\" ? schema.type : undefined,\n name: typeof schema.name === \"string\" ? schema.name : undefined,\n namespace: typeof schema.namespace === \"string\" ? schema.namespace : undefined,\n fields: Array.isArray(schema.fields)\n ? schema.fields.map((field) => `${field.name || \"field\"}: ${formatAvroType(field.type)}`)\n : []\n };\n } catch {\n return { fields: [] };\n }\n}\n\nfunction formatAvroType(type: unknown): string {\n if (typeof type === \"string\") {\n return type;\n }\n if (Array.isArray(type)) {\n return type.map(formatAvroType).join(\" | \");\n }\n if (type && typeof type === \"object\") {\n const value = type as { type?: unknown; name?: unknown; items?: unknown; values?: unknown };\n if (typeof value.name === \"string\") {\n return value.name;\n }\n if (value.type === \"array\") {\n return `array<${formatAvroType(value.items)}>`;\n }\n if (value.type === \"map\") {\n return `map<${formatAvroType(value.values)}>`;\n }\n return formatAvroType(value.type);\n }\n return \"unknown\";\n}\n\nfunction createKeyValueTable(titleText: string, rows: AvroMetadata[]): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-data-kv\";\n const title = document.createElement(\"strong\");\n title.textContent = titleText;\n const table = document.createElement(\"table\");\n const tbody = document.createElement(\"tbody\");\n for (const row of rows.slice(0, 80)) {\n const tr = document.createElement(\"tr\");\n const key = document.createElement(\"th\");\n key.textContent = row.key;\n const value = document.createElement(\"td\");\n value.textContent = row.value;\n tr.append(key, value);\n tbody.append(tr);\n }\n table.append(tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\ntype PlistValue =\n | string\n | Uint8Array\n | PlistValue[]\n | { [key: string]: PlistValue }\n | boolean\n | number\n | null;\n\ntype WebArchivePreview = {\n valid: boolean;\n error?: string;\n binary?: boolean;\n url?: string;\n mimeType?: string;\n encoding?: string;\n mainBytes?: number;\n subresources?: number;\n subframeArchives?: number;\n snippet?: string;\n};\n\nfunction createWebArchivePreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview ofv-webarchive-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"WebArchive 结构\";\n preview.append(heading);\n\n const parsed = parseWebArchive(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 WebArchive plist。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"格式\", parsed.binary ? \"Binary plist\" : \"XML plist\");\n appendMeta(summary, \"主资源\", parsed.url || \"未声明\");\n appendMeta(summary, \"MIME\", parsed.mimeType || \"未知\");\n appendMeta(summary, \"编码\", parsed.encoding || \"未声明\");\n appendMeta(summary, \"主资源大小\", parsed.mainBytes !== undefined ? formatBytes(parsed.mainBytes) : \"未知\");\n appendMeta(summary, \"子资源\", String(parsed.subresources ?? 0));\n appendMeta(summary, \"子归档\", String(parsed.subframeArchives ?? 0));\n preview.append(summary);\n\n if (parsed.binary) {\n const note = document.createElement(\"p\");\n note.className = \"ofv-data-note\";\n note.textContent = \"已识别 binary plist WebArchive;浏览器端需要 binary plist 解码器后才能展开主资源。\";\n preview.append(note);\n }\n\n if (parsed.snippet) {\n const snippet = document.createElement(\"pre\");\n snippet.className = \"ofv-text-block ofv-webarchive-snippet\";\n snippet.textContent = parsed.snippet;\n preview.append(snippet);\n }\n return preview;\n}\n\nfunction parseWebArchive(bytes: Uint8Array): WebArchivePreview {\n if (bytes.length >= 8 && asciiAt(bytes, 0, 8) === \"bplist00\") {\n return { valid: true, binary: true };\n }\n\n const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(0, Math.min(bytes.length, 1024 * 1024)));\n if (!/<plist[\\s>]/i.test(text) || !text.includes(\"WebMainResource\")) {\n return { valid: false, error: \"缺少 XML plist 或 WebMainResource 标记。\" };\n }\n if (typeof DOMParser === \"undefined\") {\n return { valid: false, error: \"当前环境缺少 DOMParser,无法解析 XML WebArchive。\" };\n }\n\n const documentXml = new DOMParser().parseFromString(text, \"application/xml\");\n if (documentXml.querySelector(\"parsererror\")) {\n return { valid: false, error: \"XML plist 解析失败。\" };\n }\n const rootDict = Array.from(documentXml.documentElement.children).find((child) => child.tagName === \"dict\");\n if (!rootDict) {\n return { valid: false, error: \"XML plist 缺少根 dict。\" };\n }\n\n const plist = parsePlistElement(rootDict);\n if (!isPlistDict(plist)) {\n return { valid: false, error: \"XML plist 根节点不是 dict。\" };\n }\n const mainResource = plist.WebMainResource;\n if (!isPlistDict(mainResource)) {\n return { valid: false, error: \"WebArchive 缺少 WebMainResource dict。\" };\n }\n\n const resourceData = mainResource.WebResourceData;\n const mimeType = plistString(mainResource.WebResourceMIMEType);\n const mainBytes = resourceData instanceof Uint8Array ? resourceData.length : undefined;\n return {\n valid: true,\n url: plistString(mainResource.WebResourceURL),\n mimeType,\n encoding: plistString(mainResource.WebResourceTextEncodingName),\n mainBytes,\n subresources: Array.isArray(plist.WebSubresources) ? plist.WebSubresources.length : 0,\n subframeArchives: Array.isArray(plist.WebSubframeArchives) ? plist.WebSubframeArchives.length : 0,\n snippet: createWebArchiveSnippet(resourceData, mimeType)\n };\n}\n\nfunction parsePlistElement(element: Element): PlistValue {\n switch (element.tagName) {\n case \"dict\": {\n const result: Record<string, PlistValue> = {};\n const children = Array.from(element.children);\n for (let index = 0; index < children.length; index++) {\n const key = children[index];\n if (key.tagName !== \"key\") {\n continue;\n }\n const value = children[index + 1];\n if (value) {\n result[key.textContent || \"\"] = parsePlistElement(value);\n index++;\n }\n }\n return result;\n }\n case \"array\":\n return Array.from(element.children).map(parsePlistElement);\n case \"data\":\n return decodeBase64Data(element.textContent || \"\");\n case \"integer\":\n case \"real\":\n return Number(element.textContent || 0);\n case \"true\":\n return true;\n case \"false\":\n return false;\n case \"string\":\n case \"date\":\n default:\n return element.textContent || \"\";\n }\n}\n\nfunction decodeBase64Data(value: string): Uint8Array {\n const normalized = value.replace(/\\s+/g, \"\");\n if (!normalized) {\n return new Uint8Array();\n }\n const binary = atob(normalized);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nfunction createWebArchiveSnippet(value: PlistValue | undefined, mimeType?: string): string | undefined {\n if (!(value instanceof Uint8Array) || value.length === 0) {\n return undefined;\n }\n if (!mimeType || !/^(text\\/|application\\/(xhtml\\+xml|xml|json)|image\\/svg\\+xml)/i.test(mimeType)) {\n return undefined;\n }\n const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n return text.replace(/\\s+/g, \" \").trim().slice(0, 1600);\n}\n\nfunction isPlistDict(value: PlistValue | undefined): value is { [key: string]: PlistValue } {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof Uint8Array);\n}\n\nfunction plistString(value: PlistValue | undefined): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"ascii\").decode(bytes.slice(offset, offset + length));\n}\n\ntype PostScriptPreview = {\n valid: boolean;\n error?: string;\n format?: string;\n title?: string;\n creator?: string;\n creationDate?: string;\n pages?: string;\n boundingBox?: string;\n documentData?: string;\n};\n\nfunction createPostScriptPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"PostScript 结构\";\n preview.append(heading);\n\n const parsed = parsePostScript(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 PostScript/Illustrator 文档头。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"格式\", parsed.format || \"PostScript\");\n appendMeta(summary, \"Title\", parsed.title || \"未声明\");\n appendMeta(summary, \"Creator\", parsed.creator || \"未声明\");\n appendMeta(summary, \"Pages\", parsed.pages || \"未知\");\n appendMeta(summary, \"BoundingBox\", parsed.boundingBox || \"未声明\");\n appendMeta(summary, \"Created\", parsed.creationDate || \"未声明\");\n if (parsed.documentData) {\n appendMeta(summary, \"Data\", parsed.documentData);\n }\n preview.append(summary);\n return preview;\n}\n\nfunction parsePostScript(bytes: Uint8Array): PostScriptPreview {\n const head = new TextDecoder(\"latin1\").decode(bytes.slice(0, Math.min(bytes.length, 8192)));\n const firstLine = head.split(/\\r?\\n/, 1)[0] || \"\";\n const isPdfCompatible = firstLine.startsWith(\"%PDF-\");\n const isPostScript = firstLine.startsWith(\"%!\");\n if (!isPdfCompatible && !isPostScript) {\n return { valid: false, error: \"缺少 PostScript %! 或 PDF-compatible %PDF 文件头。\" };\n }\n\n const boundingBox = dscValue(head, \"BoundingBox\") || dscValue(head, \"HiResBoundingBox\");\n return {\n valid: true,\n format: isPdfCompatible ? `PDF-compatible Illustrator (${firstLine.replace(/^%/, \"\")})` : firstLine.replace(/^%!/, \"PostScript \"),\n title: dscValue(head, \"Title\"),\n creator: dscValue(head, \"Creator\") || dscValue(head, \"For\"),\n creationDate: dscValue(head, \"CreationDate\"),\n pages: dscValue(head, \"Pages\"),\n boundingBox: normalizeBoundingBox(boundingBox),\n documentData: dscValue(head, \"DocumentData\")\n };\n}\n\nfunction dscValue(text: string, key: string): string | undefined {\n const escaped = key.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = text.match(new RegExp(`^%%${escaped}:\\\\s*(.+)$`, \"im\"));\n return match?.[1]?.trim();\n}\n\nfunction normalizeBoundingBox(value?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n const parts = value.trim().split(/\\s+/).map((part) => Number(part));\n if (parts.length < 4 || parts.some((part) => !Number.isFinite(part))) {\n return value;\n }\n const [x1, y1, x2, y2] = parts;\n return `${x1}, ${y1}, ${x2}, ${y2} (${Math.max(0, x2 - x1)} x ${Math.max(0, y2 - y1)} pt)`;\n}\n\nfunction createHexPreview(bytes: Uint8Array): HTMLElement | null {\n if (bytes.length === 0) {\n return null;\n }\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block ofv-asset-hex\";\n pre.textContent = hexPreview(bytes);\n return pre;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction byteSignature(bytes: Uint8Array): string {\n if (bytes.length === 0) {\n return \"空文件\";\n }\n const ascii = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 16))).replace(/[^\\x20-\\x7E]/g, \".\");\n const hex = Array.from(bytes.slice(0, Math.min(bytes.length, 8)))\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \");\n return `${ascii} (${hex})`;\n}\n\nfunction hexPreview(bytes: Uint8Array): string {\n const rows: string[] = [];\n const limit = Math.min(bytes.length, 256);\n for (let offset = 0; offset < limit; offset += 16) {\n const slice = bytes.slice(offset, offset + 16);\n const hex = Array.from(slice)\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \")\n .padEnd(47, \" \");\n const ascii = Array.from(slice)\n .map((byte) => (byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : \".\"))\n .join(\"\");\n rows.push(`${offset.toString(16).padStart(8, \"0\").toUpperCase()} ${hex} ${ascii}`);\n }\n if (bytes.length > limit) {\n rows.push(`... 仅展示前 ${limit} 字节,共 ${bytes.length} 字节`);\n }\n return rows.join(\"\\n\");\n}\n"],"mappings":"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A,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,SAAS,KAAK,SAAS,KACzB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,SAAS,YAAY,KACvB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,SAAS,YAAY;AAE3B;AAEA,SAAS,kBAAkB,MAAsB;AAC/C,QAAM,WAAW,KAAK,MAAM,OAAO,EAAE,IAAI,KAAK;AAC9C,SAAO,SAAS,YAAY;AAC9B;;;ACjgBO,SAAS,iBAAiB,WAA8C;AAC7E,MAAI,OAAO,cAAc,UAAU;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAA2B,SAAS;AAC7D,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,oCAAoC,SAAS,EAAE;AAAA,EACjE;AACA,SAAO;AACT;AAEO,SAAS,aACd,SACA,OACA,QACM;AACN,MAAI,UAAU,QAAW;AACvB,YAAQ,MAAM,QAAQ,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAAA,EACnE;AACA,MAAI,WAAW,QAAW;AACxB,YAAQ,MAAM,SAAS,OAAO,WAAW,WAAW,GAAG,MAAM,OAAO;AAAA,EACtE;AACF;AAEO,SAAS,eAAe,SAAmC;AAChE,QAAM,OAAO,QAAQ,sBAAsB;AAC3C,SAAO;AAAA,IACL,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,CAAC;AAAA,IACzC,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAM,CAAC;AAAA,EAC7C;AACF;AAEO,SAAS,gBAAgB,MAA6C;AAC3E,MAAI,KAAK,KAAK;AACZ,WAAO,KAAK;AAAA,EACd;AACA,MAAI,CAAC,KAAK,MAAM;AACd,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,SAAO,IAAI,gBAAgB,KAAK,IAAI;AACtC;AAEO,SAAS,gBAAgB,KAAa,YAA2B;AACtE,MAAI,CAAC,YAAY;AACf,QAAI,gBAAgB,GAAG;AAAA,EACzB;AACF;;;AC9CO,SAAS,iBAAgC;AAC9C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,IACA,OAAO,KAAK;AACV,UAAI,QAAQ,gBAAgB,IAAI,IAAI;AACpC,UAAI,IAAI,QAAQ,aAAa,YAAY,IAAI,QAAQ,gBAAgB;AACnE,eAAO,IAAI,QAAQ,eAAe,GAAG;AAAA,MACvC;AAEA,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AACvC,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAElB,YAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,YAAM,cACJ,IAAI,QAAQ,aAAa,aACrB,iEACA;AAEN,YAAM,OAAO,mBAAmB,IAAI,IAAI;AAExC,YAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,eAAS,OAAO;AAChB,eAAS,WAAW,IAAI,KAAK;AAC7B,eAAS,cAAc;AAEvB,YAAM,OAAO,OAAO,MAAM,QAAQ;AAClC,UAAI,SAAS,UAAU,IAAI,YAAY;AACvC,UAAI,SAAS,OAAO,KAAK;AAEzB,UAAI,IAAI,QAAQ,aAAa,YAAY;AACvC,iBAAS,MAAM;AAAA,MACjB;AAEA,aAAO;AAAA,QACL,UAAU;AACR,cAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,0BAAgB,KAAK,UAAU;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAAuG;AACjI,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,OAAK,YAAY;AACjB,qBAAmB,MAAM,gBAAM,KAAK,QAAQ,gCAAO;AACnD,qBAAmB,MAAM,gBAAM,KAAK,YAAY,IAAI,KAAK,SAAS,KAAK,cAAI;AAC3E,qBAAmB,MAAM,QAAQ,KAAK,YAAY,oBAAK;AACvD,qBAAmB,MAAM,gBAAM,KAAK,SAAS,SAAY,iBAAO,oBAAoB,KAAK,IAAI,CAAC;AAC9F,qBAAmB,MAAM,gBAAM,KAAK,MAAM,qBAAW,uCAAS;AAC9D,SAAO;AACT;AAEA,SAAS,mBAAmB,QAAqB,OAAe,OAAqB;AACnF,QAAM,MAAM,SAAS,cAAc,IAAI;AACvC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,UAAQ,cAAc;AACtB,SAAO,OAAO,KAAK,OAAO;AAC5B;AAEA,SAAS,oBAAoB,OAAuB;AAClD,MAAI,QAAQ,MAAM;AAChB,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,MAAI,QAAQ,OAAO,MAAM;AACvB,WAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAAA,EACrC;AACA,SAAO,IAAI,QAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC;AAC5C;;;AC5DO,SAAS,aAAa,SAAqC;AAChE,QAAM,YAAY,iBAAiB,QAAQ,SAAS;AACpD,eAAa,WAAW,QAAQ,OAAO,QAAQ,MAAM;AAErD,YAAU,UAAU,IAAI,UAAU;AAClC,MAAI,QAAQ,WAAW;AACrB,cAAU,UAAU,IAAI,QAAQ,SAAS;AAAA,EAC3C;AACA,QAAM,QAAQ,WAAW,WAAW,QAAQ,SAAS,OAAO;AAE5D,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AAEjB,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,SAAO,YAAY;AACnB,SAAO,SAAS;AAEhB,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AAErB,QAAM,QAAQ,eAAe,OAAO;AACpC,MAAI,eAAe,WAAW,QAAQ,gBAAgB,GAAG,MAAM,MAAM;AACrE,MAAI;AAEJ,QAAM,OAAO,OAAO,UAAkB;AACpC,QAAI,aAAa,MAAM,WAAW,GAAG;AACnC;AAAA,IACF;AACA,mBAAe,WAAW,OAAO,MAAM,MAAM;AAC7C,UAAM,gBAAgB,YAAY;AAAA,EACpC;AAEA,QAAM,UAAU,cAAc,QAAQ,SAAS,UAAU;AAAA,IACvD,WAAW,MAAM,MAAM;AAAA,IACvB,MAAM,MAAM,KAAK,eAAe,CAAC;AAAA,IACjC,UAAU,MAAM,KAAK,eAAe,CAAC;AAAA,IACrC,SAAS,CAAC,YAAY,iBAAiB,UAAU,OAAO;AAAA,EAC1D,CAAC;AACD,MAAI,SAAS;AACX,SAAK,OAAO,QAAQ,OAAO;AAAA,EAC7B;AAEA,OAAK,OAAO,QAAQ,QAAQ;AAC5B,YAAU,gBAAgB,IAAI;AAE9B,QAAM,oBAAoB;AAAA,IACxB,KAAK,QAAQ,OAAO;AAAA,IACpB,UAAU,QAAQ,YAAY;AAAA,IAC9B,GAAG;AAAA,EACL;AAEA,MAAI,YAAY;AAChB,MAAI,cAAc;AAElB,QAAM,aAAa,CAAC,YAAqB;AACvC,WAAO,SAAS,CAAC;AACjB,WAAO,cAAc,UAAU,uBAAuB;AAAA,EACxD;AAEA,QAAM,WAAW,CAAC,UAA0B;AAC1C,WAAO,SAAS;AAChB,WAAO,cAAc,OAAO,UAAU,WAAW,QAAQ,MAAM;AAAA,EACjE;AAEA,QAAM,SAAS,MAAM;AACnB,QAAI,WAAW;AACb;AAAA,IACF;AACA,UAAM,OAAO,eAAe,QAAQ;AACpC,qBAAiB,SAAS,IAAI;AAAA,EAChC;AAEA,QAAM,iBAAiB,cAAc,WAAW,MAAM;AAEtD,QAAM,aAAa,OAAO,SAAsB;AAC9C,UAAM,QAAS,eAAe;AAC9B,qBAAiB,QAAQ;AACzB,sBAAkB;AAClB,aAAS,gBAAgB;AACzB,eAAW,IAAI;AACf,aAAS,OAAO,MAAM,cAAc,MAAM,MAAM;AAEhD,UAAM,UAAU,CAAC,GAAI,QAAQ,WAAW,CAAC,GAAI,eAAe,CAAC;AAC7D,UAAM,SAAS,MAAM,WAAW,SAAS,IAAI;AAC7C,QAAI,aAAa,UAAU,aAAa;AACtC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,eAAe,MAAM,OAAO,OAAO;AAAA,QACvC;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,eAAe,QAAQ;AAAA,QAC7B,SAAS;AAAA,QACT,SAAS,SAAS,WAAW;AAAA,QAC7B;AAAA,QACA;AAAA,MACF,CAAC;AACD,UAAI,aAAa,UAAU,aAAa;AACtC,qBAAa,QAAQ;AACrB;AAAA,MACF;AACA,wBAAkB;AAClB,iBAAW,KAAK;AAChB,eAAS;AAAA,QAAkB,CAAC,YAC1B,QAAQ,aAAa,OAAO,MAAM,aAAa,aAAa,aAAa,WAAW,OAAO,IAAI;AAAA,MACjG;AACA,cAAQ,SAAS,IAAI;AACrB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,aAAa,UAAU,aAAa;AACtC;AAAA,MACF;AACA,YAAM,kBAAkB,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAChF,iBAAW,KAAK;AAChB,eAAS,eAAe;AACxB,cAAQ,UAAU,iBAAiB,IAAI;AAAA,IACzC;AAAA,EACF;AAEA,iBAAe,gBAAgB,OAAe;AAC5C,UAAM,OAAO,MAAM,KAAK;AACxB,UAAM,OAAO,MAAM,cAAc,KAAK,MAAM,KAAK,UAAU,KAAK,QAAQ;AACxE,UAAM,WAAW,IAAI;AAAA,EACvB;AAEA,OAAK,KAAK,YAAY;AAEtB,SAAO;AAAA,IACL,MAAM,OAAO,MAAM;AACjB,UAAI,WAAW;AACb;AAAA,MACF;AACA,UAAI,SAAS,QAAW;AACtB,cAAM,cAAc,MAAM,YAAY;AACtC,cAAM,OAAO,cAAc,GAAG,iBAAiB,MAAM,aAAa,OAAO,CAAC;AAAA,MAC5E;AACA,YAAM,gBAAgB,YAAY;AAAA,IACpC;AAAA,IACA,MAAM,OAAO;AACX,YAAM,KAAK,eAAe,CAAC;AAAA,IAC7B;AAAA,IACA,MAAM,WAAW;AACf,YAAM,KAAK,eAAe,CAAC;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,kBAAkB;AAChB,aAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA,UAAU;AACR,kBAAY;AACZ,qBAAe;AACf,qBAAe,QAAQ;AACvB,uBAAiB,QAAQ;AACzB,eAAS,QAAQ;AACjB,YAAM,QAAQ;AACd,gBAAU,gBAAgB;AAC1B,gBAAU,UAAU,OAAO,UAAU;AACrC,UAAI,QAAQ,WAAW;AACrB,kBAAU,UAAU,OAAO,QAAQ,SAAS;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,SAAwC;AAC9D,MAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG;AAC7C,WAAO,QAAQ,MAAM;AAAA,MAAI,CAAC,SACxB,cAAc,IAAI,IACd,OACA;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACN;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,QAAW;AAC9B,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO;AAAA,IACL;AAAA,MACE,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAAwD;AAC7E,SAAO,OAAO,SAAS,YAAY,SAAS,QAAQ,UAAU;AAChE;AAEA,SAAS,iBACP,MACA,aACA,SACa;AACb,MAAI,OAAO,SAAS,eAAe,gBAAgB,MAAM;AACvD,WAAO,EAAE,KAAK;AAAA,EAChB;AACA,SAAO;AAAA,IACL;AAAA,IACA,UAAU,aAAa,YAAY,QAAQ;AAAA,IAC3C,UAAU,aAAa,YAAY,QAAQ;AAAA,EAC7C;AACF;AAEA,SAAS,WAAW,OAAe,QAAwB;AACzD,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,SAAS,CAAC;AAChD;AAEA,SAAS,WACP,WACA,OACyB;AACzB,QAAM,QAAQ,OAAO,aAAa,8BAA8B;AAChE,QAAM,UAAU,CAAC,mBAAmB,gBAAgB;AAEpD,QAAM,gBAAgB,MAAM;AAC1B,cAAU,UAAU,OAAO,GAAG,OAAO;AACrC,UAAM,gBAAgB,UAAU,UAAU,OAAO,UAAU,SAAS,UAAU,SAAS,UAAU;AACjG,cAAU,UAAU,IAAI,aAAa,aAAa,EAAE;AAAA,EACtD;AAEA,gBAAc;AACd,MAAI,UAAU,QAAQ;AACpB,qBAAiB,OAAO,aAAa;AAAA,EACvC;AAEA,SAAO;AAAA,IACL,UAAU;AACR,UAAI,UAAU,QAAQ;AACpB,4BAAoB,OAAO,aAAa;AAAA,MAC1C;AACA,gBAAU,UAAU,OAAO,GAAG,OAAO;AAAA,IACvC;AAAA,EACF;AACF;AAEA,SAAS,cAAc,SAAsB,UAA+C;AAC1F,MAAI,OAAO,mBAAmB,aAAa;AACzC,UAAM,WAAW,IAAI,eAAe,QAAQ;AAC5C,aAAS,QAAQ,OAAO;AACxB,WAAO;AAAA,MACL,UAAU;AACR,iBAAS,WAAW;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,iBAAiB,UAAU,QAAQ;AAC1C,SAAO;AAAA,IACL,UAAU;AACR,aAAO,oBAAoB,UAAU,QAAQ;AAAA,IAC/C;AAAA,EACF;AACF;AAOA,SAAS,iBAAiB,OAA6C,UAA4B;AACjG,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AACA,MAAI,OAAO,MAAM,qBAAqB,YAAY;AAChD,UAAM,iBAAiB,UAAU,QAAQ;AACzC;AAAA,EACF;AACA,QAAM,cAAc,QAAQ;AAC9B;AAEA,SAAS,oBAAoB,OAA6C,UAA4B;AACpG,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AACA,MAAI,OAAO,MAAM,wBAAwB,YAAY;AACnD,UAAM,oBAAoB,UAAU,QAAQ;AAC5C;AAAA,EACF;AACA,QAAM,iBAAiB,QAAQ;AACjC;AAEA,SAAS,cACP,SACA,UACA,OAcY;AACZ,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,UACJ,OAAO,YAAY,YACf,EAAE,MAAM,MAAM,QAAQ,MAAM,UAAU,MAAM,YAAY,MAAM,OAAO,MAAM,QAAQ,KAAK,IACxF;AAEN,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,aAAa,QAAQ,SAAS;AACtC,UAAQ,aAAa,cAAc,sBAAsB;AAEzD,MAAI;AACJ,MAAI,eAAe;AACnB,MAAI,gBAAgB,MAAM,UAAU;AACpC,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,QAAM,iBAAgF,CAAC;AACvF,QAAM,gBAA0F,CAAC;AACjG,QAAM,YAA+B,CAAC;AACtC,QAAM,SAAS,uBAAuB,QAAQ;AAC9C,MAAI;AACJ,MAAI;AACJ,MAAI,gBAAgB,CAAC,aAA6B;AAElD,QAAM,aAAa,MACjB,qBAAqB;AAAA,IACnB;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd,CAAC;AAEH,QAAM,YAAY,CAChB,OACA,OACA,QACA,WACA,SACG;AACH,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,OAAO;AACd,4BAAwB,QAAQ,OAAO,IAAI;AAC3C,WAAO,QAAQ;AACf,WAAO,aAAa,cAAc,KAAK;AACvC,QAAI,WAAW;AACb,aAAO,YAAY;AAAA,IACrB;AACA,WAAO,iBAAiB,SAAS,MAAM;AACvC,YAAQ,OAAO,MAAM;AACrB,cAAU,KAAK,MAAM,OAAO,oBAAoB,SAAS,MAAM,CAAC;AAChE,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,CACvB,IACA,OACA,OACA,YACG;AACH,UAAM,SAAS,UAAU,OAAO,OAAO,MAAM;AAC3C,YAAM,QAAQ,OAAO;AAAA,IACvB,GAAG,QAAW,QAAQ,QAAQ,EAAE,CAAC;AACjC,WAAO,WAAW;AAClB,mBAAe,KAAK,EAAE,QAAQ,QAAQ,CAAC;AAAA,EACzC;AAEA,QAAM,sBAAsB,CAAC,OAA+B;AAC1D,QAAI,CAAC,uBAAuB,EAAE,GAAG;AAC/B,YAAM,eAAe,QAAQ,SAAS,KAAK,CAAC,WAAW,OAAO,OAAO,EAAE;AACvE,UAAI,cAAc;AAChB,2BAAmB,YAAY;AAAA,MACjC;AACA;AAAA,IACF;AAEA,QAAI,OAAO,cAAc,MAAM,UAAU,IAAI,GAAG;AAC9C,uBAAiB;AAAA,QACf,gBAAgB,SAAS,UAAU;AAAA,QACnC,gBAAgB,SAAS,UAAU;AAAA,QACnC,MAAM,KAAK,MAAM,SAAS;AAAA,QAC1B;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB;AACA;AAAA,IACF;AACA,QAAI,OAAO,UAAU,MAAM,UAAU,IAAI,GAAG;AAC1C,mBAAa;AAAA,QACX,gBAAgB,SAAS,MAAM;AAAA,QAC/B,gBAAgB,SAAS,MAAM;AAAA,QAC/B,MAAM,KAAK,MAAM,KAAK;AAAA,QACtB;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB;AACA;AAAA,IACF;AACA,QAAI,OAAO,WAAW,MAAM,UAAU,IAAI,GAAG;AAC3C,mBAAa,SAAS,cAAc,MAAM;AAC1C,iBAAW,YAAY;AACvB,cAAQ,OAAO,UAAU;AACzB;AAAA,IACF;AACA,QAAI,OAAO,cAAc,QAAQ,MAAM;AACrC,uBAAiB,IAAI,gBAAgB,SAAS,EAAE,GAAG,gBAAgB,SAAS,EAAE,GAAG,UAAU;AAC3F;AAAA,IACF;AACA,QAAI,OAAO,aAAa,QAAQ,MAAM;AACpC,uBAAiB,IAAI,gBAAgB,SAAS,EAAE,GAAG,gBAAgB,SAAS,EAAE,GAAG,SAAS;AAC1F;AAAA,IACF;AACA,QAAI,OAAO,gBAAgB,QAAQ,MAAM;AACvC,uBAAiB,IAAI,gBAAgB,SAAS,EAAE,GAAG,gBAAgB,SAAS,EAAE,GAAG,YAAY;AAC7F;AAAA,IACF;AACA,QAAI,OAAO,kBAAkB,QAAQ,QAAQ;AAC3C,uBAAiB,IAAI,gBAAgB,SAAS,EAAE,GAAG,gBAAgB,SAAS,EAAE,GAAG,cAAc;AAC/F;AAAA,IACF;AACA,QAAI,OAAO,cAAc,QAAQ,aAAa,OAAO;AACnD;AAAA,QACE,gBAAgB,SAAS,EAAE;AAAA,QAC3B,gBAAgB,SAAS,EAAE;AAAA,QAC3B,MAAM,WAAW,EAAE,SAAS;AAAA,QAC5B;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB;AACA;AAAA,IACF;AACA,QAAI,OAAO,gBAAgB,QAAQ,eAAe,OAAO;AACvD;AAAA,QACE,gBAAgB,SAAS,EAAE;AAAA,QAC3B,gBAAgB,SAAS,EAAE;AAAA,QAC3B,MAAM,WAAW,EAAE,WAAW;AAAA,QAC9B;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB;AACA;AAAA,IACF;AACA,QAAI,OAAO,WAAW,QAAQ,OAAO;AACnC;AAAA,QACE,gBAAgB,SAAS,EAAE;AAAA,QAC3B,gBAAgB,SAAS,EAAE;AAAA,QAC3B,MAAM,WAAW,EAAE,MAAM;AAAA,QACzB;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB;AACA;AAAA,IACF;AACA,QAAI,OAAO,YAAY,QAAQ,WAAW,OAAO;AAC/C,0BAAoB;AACpB;AAAA,IACF;AAAA,EAEF;AAEA,QAAM,qBAAqB,CAAC,WAAuC;AACjE,UAAM,SAAS;AAAA,MACb,OAAO;AAAA,MACP,OAAO,SAAS,OAAO;AAAA,MACvB,MAAM,KAAK,OAAO,QAAQ,WAAW,CAAC;AAAA,MACtC,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AACA,WAAO,QAAQ,mBAAmB,OAAO;AACzC,kBAAc,KAAK,EAAE,QAAQ,OAAO,CAAC;AAAA,EACvC;AAEA,QAAM,sBAAsB,MAAM;AAChC,UAAM,cAAc,SAAS,cAAc,KAAK;AAChD,gBAAY,YAAY;AACxB,gBAAY,QAAQ,gBAAgB,SAAS,QAAQ;AACrD,UAAM,kBAAkB,SAAS,cAAc,OAAO;AACtD,oBAAgB,OAAO;AACvB,oBAAgB,cAAc,gBAAgB,SAAS,QAAQ;AAC/D,oBAAgB,aAAa,cAAc,gBAAgB,SAAS,QAAQ,CAAC;AAC7E,UAAM,kBAAkB,SAAS,cAAc,MAAM;AACrD,oBAAgB,YAAY;AAC5B,kBAAc;AACd,kBAAc;AAEd,UAAM,YAAY,MAAM;AACtB,YAAM,QAAQ,OAAO,OAAO,gBAAgB,KAAK;AACjD,sBAAgB,cAAc,gBAAgB,QAAQ,OAAO,KAAK,IAAI;AAAA,IACxE;AAEA,oBAAgB,iBAAiB,SAAS,SAAS;AACnD,gBAAY,OAAO,iBAAiB,eAAe;AACnD,YAAQ,OAAO,WAAW;AAC1B,cAAU,KAAK,MAAM,gBAAgB,oBAAoB,SAAS,SAAS,CAAC;AAAA,EAC9E;AAEA,QAAM,gBAAgB,MAAM;AAC1B,QAAI,QAAQ,QAAQ;AAClB,cAAQ,gBAAgB;AACxB,YAAM,gBAAgB,QAAQ,OAAO,WAAW,CAAC;AACjD,UAAI,eAAe;AACjB,gBAAQ,OAAO,aAAa;AAAA,MAC9B;AACA;AAAA,IACF;AACA,oBAAgB,SAAS,MAAM,UAAU,CAAC,EAAE,QAAQ,mBAAmB;AACvE,6BAAyB,OAAO,EAAE,QAAQ,kBAAkB;AAAA,EAC9D;AAEA,gBAAc;AAEd,QAAM,sBAAsB,MAAM;AAChC,UAAM,UAAU,WAAW;AAC3B,eAAW,EAAE,QAAQ,OAAO,KAAK,eAAe;AAC9C,aAAO,WAAW,oBAAoB,OAAO,UAAU,OAAO;AAC9D,aAAO,SAAS,oBAAoB,OAAO,QAAQ,OAAO;AAAA,IAC5D;AAAA,EACF;AAEA,QAAM,cAAc,MAAM;AACxB,WAAO,MAAM;AACb,QAAI,aAAa;AACf,kBAAY,QAAQ;AAAA,IACtB;AACA,QAAI,aAAa;AACf,kBAAY,cAAc;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,QAAI,CAAC,QAAQ,QAAQ;AACnB;AAAA,IACF;AACA,YAAQ,gBAAgB;AACxB,UAAM,gBAAgB,QAAQ,OAAO,WAAW,CAAC;AACjD,QAAI,eAAe;AACjB,cAAQ,OAAO,aAAa;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,UAAU,OAAO,QAAQ;AAC9B,aAAO;AACP,qBAAe;AACf,sBAAgB;AAChB,kBAAY;AACZ,qBAAe,QAAQ,CAAC,EAAE,OAAO,MAAM;AACrC,eAAO,WAAW;AAAA,MACpB,CAAC;AACD,UAAI,YAAY;AACd,mBAAW,cAAc,GAAG,QAAQ,CAAC,MAAM,MAAM;AAAA,MACnD;AACA,UAAI,gBAAgB;AAClB,uBAAe,WAAW,SAAS;AAAA,MACrC;AACA,UAAI,YAAY;AACd,mBAAW,WAAW,SAAS,SAAS;AAAA,MAC1C;AACA,0BAAoB;AACpB,0BAAoB;AAAA,IACtB;AAAA,IACA,kBAAkB,aAAa;AAC7B,sBAAgB;AAChB,qBAAe,QAAQ,CAAC,EAAE,QAAQ,QAAQ,MAAM;AAC9C,eAAO,WAAW,CAAC,YAAY,OAAO;AAAA,MACxC,CAAC;AACD,0BAAoB;AACpB,0BAAoB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,UAAU;AACR,aAAO,MAAM;AACb,iBAAW,WAAW,WAAW;AAC/B,gBAAQ;AAAA,MACV;AACA,cAAQ,gBAAgB;AAAA,IAC1B;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAaG;AACD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB,SAAS,QAAQ,SAAS;AAAA,IAC1B,MAAM,WAAW;AACf,YAAM,MAAM,SAAS;AAAA,IACvB;AAAA,IACA,MAAM,OAAO;AACX,YAAM,MAAM,KAAK;AAAA,IACnB;AAAA,IACA,SAAS,MAAM;AAAA,IACf;AAAA,IACA,WAAW;AACT,UAAI,MAAM;AACR,qBAAa,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,IACA,aAAa;AACX,WAAK,QAAQ,eAAe,oBAAoB;AAAA,IAClD;AAAA,IACA,QAAQ;AACN,mBAAa,QAAQ;AAAA,IACvB;AAAA,IACA,QAAQ,OAAO;AAAA,IACf,aAAa,OAAO;AAAA,EACtB;AACF;AAEA,IAAM,uBAAoE;AAAA,EACxE,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,IAAM,uBAAoE;AAAA,EACxE,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,SAAS,gBAAgB,SAAgC,IAAyC;AAChG,SAAO,QAAQ,SAAS,EAAE,KAAK,qBAAqB,EAAE;AACxD;AAEA,SAAS,gBAAgB,SAAgC,IAAyC;AAChG,SAAO,QAAQ,SAAS,EAAE,KAAK,QAAQ,SAAS,EAAE,KAAK,qBAAqB,EAAE;AAChF;AAEA,SAAS,gBAAgB,SAAgC,aAA+C;AACtG,MAAI,QAAQ,OAAO;AACjB,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,UAAoC,CAAC;AAC3C,MAAI,cAAc,GAAG;AACnB,YAAQ,KAAK,YAAY,QAAQ,OAAO;AAAA,EAC1C;AACA,MAAI,QAAQ,MAAM;AAChB,YAAQ,KAAK,YAAY,WAAW,YAAY;AAAA,EAClD;AACA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,KAAK,cAAc;AAAA,EAC7B;AACA,MAAI,QAAQ,aAAa,OAAO;AAC9B,YAAQ,KAAK,UAAU;AAAA,EACzB;AACA,MAAI,QAAQ,eAAe,OAAO;AAChC,YAAQ,KAAK,YAAY;AAAA,EAC3B;AACA,MAAI,QAAQ,OAAO;AACjB,YAAQ,KAAK,OAAO;AAAA,EACtB;AACA,MAAI,QAAQ,WAAW,OAAO;AAC5B,YAAQ,KAAK,QAAQ;AAAA,EACvB;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,SAA8D;AAC9F,MAAI,QAAQ,SAAS,CAAC,QAAQ,SAAS;AACrC,WAAO,CAAC;AAAA,EACV;AACA,SAAO,CAAC,GAAG,QAAQ,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,EAAE;AAC5E;AAEA,SAAS,oBACP,OACA,SACS;AACT,SAAO,OAAO,UAAU,aAAa,MAAM,OAAO,IAAI,QAAQ,KAAK;AACrE;AAEA,SAAS,wBACP,QACA,OACA,MACM;AACN,SAAO,gBAAgB;AACvB,MAAI,CAAC,MAAM;AACT,WAAO,cAAc;AACrB;AAAA,EACF;AAEA,QAAM,cAAc,SAAS,cAAc,MAAM;AACjD,cAAY,YAAY;AACxB,cAAY,aAAa,eAAe,MAAM;AAC9C,MAAI,OAAO,SAAS,UAAU;AAC5B,gBAAY,YAAY;AAAA,EAC1B,OAAO;AACL,gBAAY,OAAO,KAAK,UAAU,IAAI,CAAC;AAAA,EACzC;AAEA,QAAM,eAAe,SAAS,cAAc,MAAM;AAClD,eAAa,YAAY;AACzB,eAAa,cAAc;AAC3B,SAAO,OAAO,aAAa,YAAY;AACzC;AAEA,SAAS,uBAAuB,IAA+D;AAC7F,SAAO,MAAM;AACf;AAEA,SAAS,uBAAuB,MAG9B;AACA,QAAM,cAAc;AAEpB,QAAM,QAAQ,MAAM;AAClB,UAAM,UAAU,mBAAmB,IAAI,EAAE,QAAQ,CAAC,eAAe;AAAA,MAC/D,GAAG,WAAW,iBAAiB,QAAQ,WAAW,EAAE;AAAA,IACtD,CAAC;AACD,eAAW,UAAU,SAAS;AAC5B,aAAO,YAAY,SAAS,eAAe,OAAO,eAAe,EAAE,CAAC;AAAA,IACtE;AACA,uBAAmB,IAAI,EAAE,QAAQ,CAAC,eAAe,WAAW,UAAU,CAAC;AAAA,EACzE;AAEA,QAAM,SAAS,CAAC,UAA0B;AACxC,UAAM;AACN,UAAM,kBAAkB,MAAM,KAAK;AACnC,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,mBAAmB,IAAI,EAAE,QAAQ,CAAC,eAAe,2BAA2B,UAAU,CAAC;AACzG,QAAI,QAAQ;AACZ,QAAI;AAEJ,eAAW,QAAQ,WAAW;AAC5B,YAAM,OAAO,KAAK,aAAa;AAC/B,YAAM,YAAY,KAAK,YAAY;AACnC,YAAM,aAAa,gBAAgB,YAAY;AAC/C,UAAI,QAAQ;AACZ,UAAI,QAAQ,UAAU,QAAQ,YAAY,KAAK;AAC/C,UAAI,QAAQ,GAAG;AACb;AAAA,MACF;AAEA,YAAM,WAAW,SAAS,uBAAuB;AACjD,aAAO,SAAS,GAAG;AACjB,YAAI,QAAQ,OAAO;AACjB,mBAAS,OAAO,SAAS,eAAe,KAAK,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,QACnE;AACA,cAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,eAAO,YAAY;AACnB,eAAO,cAAc,KAAK,MAAM,OAAO,QAAQ,gBAAgB,MAAM;AACrE,iBAAS,OAAO,MAAM;AACtB,uBAAe;AACf,iBAAS;AACT,gBAAQ,QAAQ,gBAAgB;AAChC,gBAAQ,UAAU,QAAQ,YAAY,KAAK;AAAA,MAC7C;AACA,UAAI,QAAQ,KAAK,QAAQ;AACvB,iBAAS,OAAO,SAAS,eAAe,KAAK,MAAM,KAAK,CAAC,CAAC;AAAA,MAC5D;AACA,WAAK,YAAY,QAAQ;AAAA,IAC3B;AAEA,gBAAY,iBAAiB,EAAE,OAAO,UAAU,QAAQ,UAAU,CAAC;AACnE,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,QAAQ,MAAM;AACzB;AAEA,SAAS,mBAAmB,MAAkC;AAC5D,QAAM,QAAQ,CAAC,IAAI;AACnB,aAAW,UAAU,KAAK,iBAAoC,QAAQ,GAAG;AACvE,QAAI;AACF,YAAM,OAAO,OAAO,iBAAiB;AACrC,UAAI,MAAM;AACR,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,MAA2B;AAC7D,QAAM,QAAgB,CAAC;AACvB,QAAM,SAAS,SAAS,iBAAiB,MAAM,WAAW,WAAW;AAAA,IACnE,WAAW,MAAM;AACf,YAAM,SAAS,KAAK;AACpB,UAAI,CAAC,UAAU,CAAC,KAAK,WAAW,KAAK,GAAG;AACtC,eAAO,WAAW;AAAA,MACpB;AACA,UAAI,CAAC,UAAU,SAAS,YAAY,SAAS,QAAQ,EAAE,SAAS,OAAO,OAAO,GAAG;AAC/E,eAAO,WAAW;AAAA,MACpB;AACA,aAAO,WAAW;AAAA,IACpB;AAAA,EACF,CAAC;AAED,MAAI,UAAU,OAAO,SAAS;AAC9B,SAAO,SAAS;AACd,UAAM,KAAK,OAAe;AAC1B,cAAU,OAAO,SAAS;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,SAAS,aAAa,UAA6B;AACjD,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,YAAY;AAClB,QAAM,aAAa,eAAe,MAAM;AACxC,WAAS,KAAK,OAAO,KAAK;AAE1B,QAAM,QAAQ,SAAS,UAAU,IAAI;AACrC,oBAAkB,UAAU,KAAK;AACjC,QAAM,UAAU,IAAI,kBAAkB,UAAU;AAGhD,QAAM,aAAa,MAAM,cAAc,kBAAkB,MAAM,MAAM,UAAU,SAAS,iBAAiB,IAAI,QAAQ;AACrH,MAAI,iBAAiB;AACrB,MAAI,kBAAkB;AACtB,MAAI,YAAY;AAEhB,MAAI,YAAY;AACd,UAAM,SAAS,WAAW,iBAAiB,oBAAoB;AAC/D,QAAI,OAAO,SAAS,GAAG;AACrB,kBAAY;AACZ,YAAM,eAAe,OAAO,CAAC,EAAE;AAC/B,YAAM,aAAa,cAAc;AACjC,UAAI,YAAY;AACd,yBAAiB,SAAS,WAAW,MAAM,KAAK,KAAK;AACrD,0BAAkB,SAAS,WAAW,MAAM,MAAM,KAAK;AAAA,MACzD;AAEA,aAAO,QAAQ,CAAC,YAAY;AAC1B,cAAM,OAAO;AACb,aAAK,MAAM,QAAQ;AACnB,aAAK,MAAM,SAAS;AAEpB,cAAM,UAAU,KAAK;AACrB,YAAI,SAAS;AACX,kBAAQ,MAAM,QAAQ,GAAG,cAAc;AACvC,kBAAQ,MAAM,SAAS,GAAG,eAAe;AACzC,kBAAQ,MAAM,YAAY;AAC1B,kBAAQ,MAAM,SAAS;AAEvB,gBAAM,eAAe,QAAQ;AAC7B,cAAI,cAAc;AAChB,yBAAa,MAAM,YAAY;AAC/B,yBAAa,MAAM,QAAQ,GAAG,cAAc;AAC5C,yBAAa,MAAM,SAAS,GAAG,eAAe;AAAA,UAChD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,MAAM,MAAM;AAClB,MAAI,CAAC,KAAK;AACR,UAAM,OAAO;AACb;AAAA,EACF;AAGA,MAAI,KAAK;AACT,MAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAOA;AACV,MAAI,MAAM;AAGV,QAAM,KAAK,SAAS,iBAAiB,+BAA+B,CAAC,EAAE,QAAQ,CAAC,OAAO;AACrF,QAAI,KAAK,YAAY,GAAG,UAAU,IAAI,CAAC;AAAA,EACzC,CAAC;AAGD,QAAM,YAAY,IAAI,cAAc,OAAO;AAC3C,YAAU,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkDxB,MAAI,KAAK,YAAY,SAAS;AAG9B,MAAI,WAAW;AACb,UAAM,YAAY,IAAI,cAAc,OAAO;AAC3C,cAAU,cAAc;AAAA;AAAA;AAAA,kBAGV,iBAAiB,kBAAkB,cAAc,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAO1D,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKd,cAAc;AAAA;AAAA;AAAA;AAAA,mBAId,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoB7B,QAAI,KAAK,YAAY,SAAS;AAAA,EAChC;AAEA,MAAI,KAAK,OAAO,KAAK;AAErB,MAAI,UAAU;AACd,QAAM,kBAAkB,MAAM;AAC5B,QAAI,SAAS;AACX;AAAA,IACF;AACA,cAAU;AACV,UAAM,eAAe,MAAM;AAC3B,UAAM,eAAe,MAAM;AAC3B,WAAO,WAAW,MAAM,MAAM,OAAO,GAAG,GAAI;AAAA,EAC9C;AAEA,QAAM,SAAS,MAAM;AACnB,oBAAgB;AAAA,EAClB;AAEA,SAAO,WAAW,MAAM;AACtB,oBAAgB;AAAA,EAClB,GAAG,GAAG;AACR;AAEA,SAAS,kBAAkB,YAAyB,YAA+B;AACjF,QAAM,iBAAiB,CAAC,GAAG,WAAW,iBAAiB,QAAQ,CAAC;AAChE,QAAM,iBAAiB,CAAC,GAAG,WAAW,iBAAiB,QAAQ,CAAC;AAEhE,iBAAe,QAAQ,CAAC,cAAc,UAAU;AAC9C,UAAM,eAAe,eAAe,KAAK;AACzC,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AACA,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY,aAAa;AAC/B,UAAM,MAAM;AACZ,QAAI;AACF,YAAM,MAAM,aAAa,UAAU,WAAW;AAAA,IAChD,QAAQ;AACN;AAAA,IACF;AACA,UAAM,QAAQ,aAAa;AAC3B,UAAM,SAAS,aAAa;AAC5B,iBAAa,YAAY,KAAK;AAAA,EAChC,CAAC;AACH;AAEA,SAAS,aAAa,MAAyB;AAC7C,QAAM,MAAM,gBAAgB,IAAI;AAChC,QAAM,aAAa,QAAQ,KAAK,GAAG;AACnC,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,OAAO;AACZ,OAAK,WAAW,KAAK;AACrB,OAAK,MAAM;AACX,OAAK,SAAS;AACd,WAAS,KAAK,OAAO,IAAI;AACzB,OAAK,MAAM;AACX,SAAO,WAAW,MAAM;AACtB,SAAK,OAAO;AACZ,oBAAgB,KAAK,UAAU;AAAA,EACjC,GAAG,CAAC;AACN;AAEA,eAAe,WAAW,SAA0B,MAA2C;AAC7F,aAAW,UAAU,SAAS;AAC5B,QAAI,MAAM,OAAO,MAAM,IAAI,GAAG;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,eAAe;AACxB;;;ACtlCA,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,2BAA2B,oBAAI,IAAI,CAAC,KAAK,CAAC;AAChD,IAAM,0BAA0B,oBAAI,IAAI,CAAC,iBAAiB,2BAA2B,CAAC;AACtF,IAAM,gBAAgB,oBAAI,IAAI,CAAC,cAAc,cAAc,uBAAuB,qBAAqB,CAAC;AAEjG,SAAS,cAA6B;AAC3C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,UAAI,yBAAyB,IAAI,KAAK,SAAS,KAAK,wBAAwB,IAAI,KAAK,QAAQ,GAAG;AAC9F,eAAO;AAAA,MACT;AACA,aAAO,KAAK,SAAS,WAAW,QAAQ,KAAK,gBAAgB,IAAI,KAAK,SAAS;AAAA,IACjF;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,MAAM,IAAI,KAAK,UAAU,YAAY;AAC3C,YAAM,SAAS,QAAQ,UAAU,QAAQ,UAAU,cAAc,IAAI,IAAI,KAAK,SAAS,YAAY,CAAC;AACpG,YAAM,qBAAqB,eAAe,IAAI,KAAK,IAAI;AAEvD,UAAI,MAAM;AACV,UAAI,gBAA6B;AACjC,UAAI,aAAa,QAAQ,IAAI,KAAK,GAAG;AAErC,UAAI,QAAQ;AACV,YAAI,WAAW,IAAI;AACnB,YAAI;AACF,cAAI,OAAO,IAAI,KAAK;AACpB,cAAI,CAAC,QAAQ,OAAO,IAAI,KAAK,WAAW,UAAU;AAChD,kBAAM,MAAM,MAAM,MAAM,IAAI,KAAK,MAAM;AACvC,gBAAI,CAAC,IAAI,IAAI;AACX,oBAAM,IAAI,MAAM,8BAA8B,IAAI,MAAM,EAAE;AAAA,YAC5D;AACA,mBAAO,MAAM,IAAI,KAAK;AAAA,UACxB;AACA,cAAI,CAAC,MAAM;AACT,kBAAM,IAAI,MAAM,gDAAgD;AAAA,UAClE;AAEA,gBAAM,iBAAiB,MAAM,OAAO,UAAU;AAC9C,gBAAM,WAAW,eAAe,WAAW;AAC3C,gBAAM,YAAY,MAAM,SAAS;AAAA,YAC/B;AAAA,YACA,QAAQ;AAAA,YACR,SAAS;AAAA,UACX,CAAC;AAED,0BAAgB,MAAM,QAAQ,SAAS,IAAI,UAAU,CAAC,IAAI;AAC1D,gBAAM,IAAI,gBAAgB,aAAa;AACvC,uBAAa;AAAA,QACf,SAAS,KAAU;AACjB,kBAAQ,MAAM,iCAAiC,GAAG;AAElD,gBAAM,gBAAgB,IAAI,IAAI;AAC9B,uBAAa,QAAQ,IAAI,KAAK,GAAG;AAAA,QACnC,UAAE;AACA,cAAI,WAAW,KAAK;AAAA,QACtB;AAAA,MACF,OAAO;AACL,cAAM,gBAAgB,IAAI,IAAI;AAAA,MAChC;AAEA,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AAEpB,YAAM,qBAAqB,CAAC,IAAI,QAAQ;AACxC,YAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,eAAS,YAAY;AAErB,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,UAAU,mBAAmB,MAAM,oBAAoB,KAAK,IAAI,KAAK,UAAU,IAAI,KAAK,IAAI;AAElG,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,MAAM,IAAI,KAAK;AACrB,YAAM,YAAY;AAClB,YAAM,MAAM;AACZ,YAAM,MAAM,YAAY,UAAU,IAAI,QAAQ,GAAG;AAEjD,UAAI,QAAQ;AACZ,UAAI,WAAW;AACf,UAAI,UAAU;AACd,UAAI,UAAU;AACd,UAAI,WAAW;AACf,UAAI,aAAa;AACjB,UAAI,aAAa;AACjB,UAAI,eAAe;AACnB,UAAI,eAAe;AAEnB,YAAM,YAAY,SAAS,cAAc,MAAM;AAC/C,gBAAU,YAAY;AAEtB,YAAM,kBAAkB,MAAM;AAC5B,cAAM,MAAM,YAAY,aAAa,OAAO,OAAO,OAAO,aAAa,KAAK,YAAY,QAAQ;AAChG,kBAAU,cAAc,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC;AAAA,MACpD;AAEA,YAAM,oBAAoB,MAAM;AAC9B,cAAM,gBAAgB,oBAAoB,IAAI,KAAK,MAAM,GAAG,CAAC;AAAA,MAC/D;AAEA,YAAM,WAAW,CAAC,cAAsB;AACtC,gBAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,SAAS,CAAC;AAC5C,wBAAgB;AAAA,MAClB;AAEA,YAAM,QAAQ,MAAM;AAClB,gBAAQ;AACR,mBAAW;AACX,kBAAU;AACV,kBAAU;AACV,wBAAgB;AAAA,MAClB;AAEA,YAAM,YAAY,CAAC,OAAe,OAAe,WAAuB;AACtE,cAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,eAAO,OAAO;AACd,eAAO,cAAc;AACrB,eAAO,QAAQ;AACf,eAAO,aAAa,cAAc,KAAK;AACvC,eAAO,iBAAiB,SAAS,MAAM;AACvC,iBAAS,OAAO,MAAM;AACtB,eAAO,MAAM,OAAO,oBAAoB,SAAS,MAAM;AAAA,MACzD;AAEA,YAAM,YAAY,qBACd;AAAA,QACE,UAAU,KAAK,YAAY,MAAM,SAAS,QAAQ,IAAI,CAAC;AAAA,QACvD,UAAU,KAAK,WAAW,MAAM,SAAS,QAAQ,IAAI,CAAC;AAAA,QACtD,UAAU,UAAU,gBAAgB,MAAM;AACxC,sBAAY;AACZ,0BAAgB;AAAA,QAClB,CAAC;AAAA,QACD,UAAU,SAAS,oBAAoB,KAAK;AAAA,MAC9C,IACA,CAAC;AACL,UAAI,oBAAoB;AACtB,iBAAS,OAAO,SAAS;AAAA,MAC3B;AAEA,YAAM,gBAAgB,CAAC,UAAwB;AAC7C,YAAI,MAAM,WAAW,GAAG;AACtB;AAAA,QACF;AACA,mBAAW;AACX,qBAAa,MAAM;AACnB,qBAAa,MAAM;AACnB,uBAAe;AACf,uBAAe;AACf,cAAM,UAAU,IAAI,aAAa;AACjC,cAAM,kBAAkB,MAAM,SAAS;AAAA,MACzC;AAEA,YAAM,gBAAgB,CAAC,UAAwB;AAC7C,YAAI,CAAC,UAAU;AACb;AAAA,QACF;AACA,kBAAU,eAAe,MAAM,UAAU;AACzC,kBAAU,eAAe,MAAM,UAAU;AACzC,wBAAgB;AAAA,MAClB;AAEA,YAAM,cAAc,CAAC,UAAwB;AAC3C,mBAAW;AACX,cAAM,UAAU,OAAO,aAAa;AACpC,YAAI,MAAM,kBAAkB,MAAM,SAAS,GAAG;AAC5C,gBAAM,sBAAsB,MAAM,SAAS;AAAA,QAC7C;AAAA,MACF;AAEA,YAAM,UAAU,CAAC,UAAsB;AACrC,YAAI,CAAC,MAAM,WAAW,CAAC,MAAM,SAAS;AACpC;AAAA,QACF;AACA,cAAM,eAAe;AACrB,iBAAS,SAAS,MAAM,SAAS,IAAI,OAAO,IAAI;AAAA,MAClD;AAEA,YAAM,iBAAiB,eAAe,aAAa;AACnD,YAAM,iBAAiB,eAAe,aAAa;AACnD,YAAM,iBAAiB,aAAa,WAAW;AAC/C,YAAM,iBAAiB,iBAAiB,WAAW;AACnD,YAAM,iBAAiB,SAAS,SAAS,EAAE,SAAS,MAAM,CAAC;AAC3D,YAAM,iBAAiB,SAAS,iBAAiB;AAEjD,YAAM,OAAO,KAAK;AAClB,cAAQ,OAAO,GAAI,qBAAqB,CAAC,UAAU,OAAO,OAAO,IAAI,CAAC,OAAO,OAAO,CAAE;AACtF,UAAI,SAAS,OAAO,OAAO;AAC3B,sBAAgB;AAEhB,aAAO;AAAA,QACL,WAAW,SAAS;AAClB,iBACE,YAAY,aACZ,YAAY,cACZ,YAAY,gBACZ,YAAY,kBACZ,YAAY;AAAA,QAEhB;AAAA,QACA,QAAQ,SAAS;AACf,cAAI,YAAY,WAAW;AACzB,qBAAS,QAAQ,IAAI;AACrB,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,YAAY;AAC1B,qBAAS,QAAQ,IAAI;AACrB,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,cAAc;AAC5B,kBAAM;AACN,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,gBAAgB;AAC9B,wBAAY;AACZ,4BAAgB;AAChB,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,eAAe;AAC7B,wBAAY;AACZ,4BAAgB;AAChB,mBAAO;AAAA,UACT;AACA,iBAAO;AAAA,QACT;AAAA,QACA,OAAO,MAAmB;AACxB,gBAAM,MAAM,WAAW,GAAG,KAAK,KAAK;AACpC,gBAAM,MAAM,YAAY,GAAG,KAAK,IAAI,GAAG,KAAK,SAAS,SAAS,YAAY,CAAC;AAAA,QAC7E;AAAA,QACA,UAAU;AACR,qBAAW,WAAW,WAAW;AAC/B,oBAAQ;AAAA,UACV;AACA,gBAAM,oBAAoB,eAAe,aAAa;AACtD,gBAAM,oBAAoB,eAAe,aAAa;AACtD,gBAAM,oBAAoB,aAAa,WAAW;AAClD,gBAAM,oBAAoB,iBAAiB,WAAW;AACtD,gBAAM,oBAAoB,SAAS,OAAO;AAC1C,gBAAM,oBAAoB,SAAS,iBAAiB;AACpD,kBAAQ,OAAO;AACf,cAAI,eAAe;AACjB,gBAAI,gBAAgB,GAAG;AAAA,UACzB,OAAO;AACL,4BAAgB,KAAK,UAAU;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,UAAkB,KAA0B;AACvE,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AAErB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AAEpB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc;AAEnB,QAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,WAAS,OAAO;AAChB,WAAS,WAAW;AACpB,WAAS,cAAc;AAEvB,WAAS,OAAO,OAAO,MAAM,QAAQ;AACrC,SAAO;AACT;AAaA,eAAe,eAAe,MAAkC;AAC9D,MAAI,CAAC,MAAM;AACT,WAAO,IAAI,WAAW;AAAA,EACxB;AACA,SAAO,IAAI,WAAW,MAAM,KAAK,YAAY,EAAE,MAAM,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC;AAChF;AAEA,SAAS,mBAAmB,OAAmB,WAAmB,UAAkB,UAA+B;AACjH,QAAM,OAAO,eAAe,OAAO,WAAW,UAAU,QAAQ;AAChE,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,kBAAgB,KAAK,gBAAM,KAAK,MAAM;AACtC,MAAI,KAAK,SAAS,KAAK,QAAQ;AAC7B,oBAAgB,KAAK,gBAAM,GAAG,KAAK,KAAK,MAAM,KAAK,MAAM,IAAI;AAAA,EAC/D;AACA,MAAI,KAAK,UAAU;AACjB,oBAAgB,KAAK,gBAAM,KAAK,QAAQ;AAAA,EAC1C;AACA,MAAI,KAAK,OAAO;AACd,oBAAgB,KAAK,gBAAM,KAAK,KAAK;AAAA,EACvC;AACA,MAAI,KAAK,WAAW,QAAW;AAC7B,oBAAgB,KAAK,UAAK,OAAO,KAAK,MAAM,CAAC;AAAA,EAC/C;AACA,MAAI,KAAK,UAAU,QAAW;AAC5B,oBAAgB,KAAK,gBAAM,OAAO,KAAK,KAAK,CAAC;AAAA,EAC/C;AACA,MAAI,KAAK,MAAM;AACb,oBAAgB,KAAK,gBAAM,KAAK,IAAI;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,QAAqB,OAAe,OAAqB;AAChF,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,YAAY;AAChB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,MAAI,OAAO,KAAK,OAAO;AACvB,SAAO,OAAO,GAAG;AACnB;AAEA,SAAS,eAAe,OAAmB,WAAmB,UAAkB,UAA6B;AAC3G,QAAM,kBAAkB,aAAa,YAAY,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK,SAAS,YAAY;AACnG,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,QAAQ,gBAAgB,MAAM,yDAAY;AAAA,EACrD;AACA,SACE,aAAa,KAAK,KAClB,cAAc,KAAK,KACnB,aAAa,KAAK,KAClB,cAAc,KAAK,KACnB,cAAc,KAAK,KACnB,aAAa,KAAK,KAClB,aAAa,KAAK,KAClB,aAAa,KAAK,KAClB,EAAE,QAAQ,gBAAgB,MAAM,yDAAY;AAEhD;AAEA,SAAS,aAAa,OAAqC;AACzD,MAAI,MAAM,SAAS,MAAM,CAAC,WAAW,OAAO,GAAG,CAAC,KAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,EAAI,CAAC,GAAG;AAChG,WAAO;AAAA,EACT;AACA,QAAMC,QAAO,SAAS,KAAK;AAC3B,QAAM,SAAS,eAAe,OAAO,MAAM;AAC3C,SAAO;AAAA,IACL,QAAQ,SAAS,IAAI,SAAS;AAAA,IAC9B,OAAOA,MAAK,UAAU,IAAI,KAAK;AAAA,IAC/B,QAAQA,MAAK,UAAU,IAAI,KAAK;AAAA,IAChC,UAAU,GAAG,MAAM,EAAE,CAAC;AAAA,IACtB,OAAO,aAAa,MAAM,EAAE,CAAC;AAAA,IAC7B,QAAQ,SAAS,IAAI,SAAS;AAAA,EAChC;AACF;AAEA,SAAS,cAAc,OAAqC;AAC1D,MAAI,MAAM,SAAS,KAAK,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,KAAM;AAC9D,WAAO;AAAA,EACT;AACA,MAAI,SAAS;AACb,SAAO,SAAS,IAAI,MAAM,QAAQ;AAChC,QAAI,MAAM,MAAM,MAAM,KAAM;AAC1B;AACA;AAAA,IACF;AACA,UAAM,SAAS,MAAM,SAAS,CAAC;AAC/B,cAAU;AACV,WAAO,MAAM,MAAM,MAAM,KAAM;AAC7B;AAAA,IACF;AACA,QAAI,WAAW,OAAQ,WAAW,KAAM;AACtC;AAAA,IACF;AACA,QAAI,SAAS,IAAI,MAAM,QAAQ;AAC7B;AAAA,IACF;AACA,UAAM,SAAU,MAAM,MAAM,KAAK,IAAK,MAAM,SAAS,CAAC;AACtD,QAAI,SAAS,KAAK,SAAS,SAAS,MAAM,QAAQ;AAChD;AAAA,IACF;AACA,QAAK,UAAU,OAAQ,UAAU,OAAU,UAAU,OAAQ,UAAU,OAAU,UAAU,OAAQ,UAAU,OAAU,UAAU,OAAQ,UAAU,KAAO;AACxJ,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAQ,MAAM,SAAS,CAAC,KAAK,IAAK,MAAM,SAAS,CAAC;AAAA,QAClD,QAAS,MAAM,SAAS,CAAC,KAAK,IAAK,MAAM,SAAS,CAAC;AAAA,QACnD,UAAU,GAAG,MAAM,SAAS,CAAC,CAAC;AAAA,QAC9B,OAAO,GAAG,MAAM,SAAS,CAAC,CAAC;AAAA,MAC7B;AAAA,IACF;AACA,cAAU;AAAA,EACZ;AACA,SAAO,EAAE,QAAQ,QAAQ,MAAM,oEAAkB;AACnD;AAEA,SAAS,aAAa,OAAqC;AACzD,QAAM,SAAS,QAAQ,OAAO,GAAG,CAAC;AAClC,MAAI,WAAW,YAAY,WAAW,UAAU;AAC9C,WAAO;AAAA,EACT;AACA,QAAM,SAAS,MAAM,EAAE,KAAK;AAC5B,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,aAAa,OAAO,CAAC;AAAA,IAC5B,QAAQ,aAAa,OAAO,CAAC;AAAA,IAC7B,UAAU,IAAI,SAAS,KAAQ,CAAC;AAAA,IAChC,OAAQ,SAAS,MAAQ,uBAAuB;AAAA,IAChD,QAAQ,eAAe,KAAK;AAAA,EAC9B;AACF;AAEA,SAAS,cAAc,OAAqC;AAC1D,MAAI,MAAM,SAAS,MAAM,QAAQ,OAAO,GAAG,CAAC,MAAM,UAAU,QAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AAC3F,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAClC,MAAI,UAAU,UAAU,MAAM,UAAU,IAAI;AAC1C,UAAM,QAAQ,MAAM,EAAE;AACtB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,IAAI,aAAa,OAAO,EAAE;AAAA,MACjC,QAAQ,IAAI,aAAa,OAAO,EAAE;AAAA,MAClC,SAAS,QAAQ,OAAU,IAAI,yBAAyB,KAAK,IAAI;AAAA,MACjE,QAAQ,QAAQ,QAAU,IAAI,UAAU;AAAA,IAC1C;AAAA,EACF;AACA,MAAI,UAAU,UAAU,MAAM,UAAU,IAAI;AAC1C,UAAM,QAAQ;AACd,QAAI,MAAM,QAAQ,CAAC,MAAM,OAAQ,MAAM,QAAQ,CAAC,MAAM,KAAQ,MAAM,QAAQ,CAAC,MAAM,IAAM;AACvF,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO,aAAa,OAAO,QAAQ,CAAC,IAAI;AAAA,QACxC,QAAQ,aAAa,OAAO,QAAQ,CAAC,IAAI;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACA,MAAI,UAAU,UAAU,MAAM,UAAU,IAAI;AAC1C,UAAM,KAAK,MAAM,EAAE;AACnB,UAAM,KAAK,MAAM,EAAE;AACnB,UAAM,KAAK,MAAM,EAAE;AACnB,UAAM,KAAK,MAAM,EAAE;AACnB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,MAAO,KAAK,OAAS,IAAK;AAAA,MACjC,QAAQ,MAAO,KAAK,OAAS,KAAO,MAAM,KAAO,KAAK,QAAS;AAAA,MAC/D,OAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,QAAQ,MAAM,gBAAM,SAAS,OAAO,UAAK;AAC5D;AAEA,SAAS,cAAc,OAAqC;AAC1D,QAAM,QAAQ,iBAAiB,OAAO,GAAG,MAAM,MAAM;AACrD,QAAM,OAAO,MAAM,KAAK,CAAC,QAAQ,IAAI,SAAS,MAAM;AACpD,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,QAAM,aAAa,QAAQ,OAAO,KAAK,WAAW,CAAC;AACnD,QAAM,mBAAmB,QAAQ,OAAO,KAAK,YAAY,GAAG,KAAK,IAAI,GAAG,KAAK,UAAU,KAAK,YAAY,CAAC,CAAC;AAC1G,MAAI,CAAC,gDAAgD,KAAK,GAAG,UAAU,IAAI,gBAAgB,EAAE,GAAG;AAC9F,WAAO;AAAA,EACT;AACA,QAAM,OAAO,YAAY,OAAO,OAAO,MAAM;AAC7C,SAAO;AAAA,IACL,QAAQ,eAAe,UAAU,iBAAiB,SAAS,MAAM,IAAI,kBAAkB,WAAW,WAAW,KAAK,IAAI,SAAS;AAAA,IAC/H,OAAO,QAAQ,KAAK,YAAY,MAAM,KAAK,UAAU,aAAa,OAAO,KAAK,YAAY,CAAC,IAAI;AAAA,IAC/F,QAAQ,QAAQ,KAAK,YAAY,MAAM,KAAK,UAAU,aAAa,OAAO,KAAK,YAAY,CAAC,IAAI;AAAA,IAChG,MAAM,SAAS,UAAU,GAAG,iBAAiB,KAAK,IAAI,SAAM,iBAAiB,gBAAgB,CAAC,KAAK,EAAE;AAAA,EACvG;AACF;AAUA,SAAS,iBAAiB,OAAmB,OAAe,KAAwB;AAClF,QAAM,QAAmB,CAAC;AAC1B,MAAI,SAAS;AACb,SAAO,SAAS,KAAK,OAAO,MAAM,SAAS,KAAK;AAC9C,QAAI,OAAO,aAAa,OAAO,MAAM;AACrC,UAAM,OAAO,QAAQ,OAAO,SAAS,GAAG,CAAC;AACzC,QAAI,aAAa;AACjB,QAAI,CAAC,sBAAsB,KAAK,IAAI,GAAG;AACrC;AAAA,IACF;AACA,QAAI,SAAS,KAAK,SAAS,MAAM,KAAK;AACpC,YAAM,OAAO,aAAa,OAAO,SAAS,CAAC;AAC3C,YAAM,MAAM,aAAa,OAAO,SAAS,EAAE;AAC3C,aAAO,OAAO,IAAI,MAAM,SAAS;AACjC,mBAAa;AAAA,IACf,WAAW,SAAS,GAAG;AACrB,aAAO,MAAM;AAAA,IACf;AACA,QAAI,OAAO,cAAc,SAAS,OAAO,KAAK;AAC5C;AAAA,IACF;AACA,UAAM,KAAK;AAAA,MACT;AAAA,MACA,OAAO;AAAA,MACP,WAAW,SAAS;AAAA,MACpB,SAAS,SAAS;AAAA,MAClB,KAAK,SAAS;AAAA,IAChB,CAAC;AACD,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAmB,OAAkB,MAAmC;AAC3F,aAAW,OAAO,OAAO;AACvB,QAAI,IAAI,SAAS,MAAM;AACrB,aAAO;AAAA,IACT;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM,EAAE,SAAS,IAAI,IAAI,GAAG;AACvF,YAAM,aAAa,IAAI,SAAS,SAAS,IAAI,YAAY,IAAI,IAAI;AACjE,YAAM,QAAQ,YAAY,OAAO,iBAAiB,OAAO,YAAY,IAAI,OAAO,GAAG,IAAI;AACvF,UAAI,OAAO;AACT,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,QAAM,SAAS,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO,KAAK,CAAC;AACxF,SAAO,OAAO,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AACrC;AAEA,SAAS,aAAa,OAAqC;AACzD,MAAI,MAAM,SAAS,MAAM,QAAQ,OAAO,GAAG,CAAC,MAAM,MAAM;AACtD,WAAO;AAAA,EACT;AACA,QAAM,UAAU,aAAa,OAAO,EAAE;AACtC,MAAI,UAAU,IAAI;AAChB,WAAO,EAAE,QAAQ,OAAO,MAAM,0BAAgB;AAAA,EAChD;AACA,MAAI,YAAY,MAAM,MAAM,UAAU,IAAI;AACxC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,aAAa,OAAO,EAAE;AAAA,MAC7B,QAAQ,aAAa,OAAO,EAAE;AAAA,MAC9B,UAAU,GAAG,aAAa,OAAO,EAAE,CAAC;AAAA,IACtC;AAAA,EACF;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,YAAY,OAAO,EAAE;AAAA,IAC5B,QAAQ,KAAK,IAAI,YAAY,OAAO,EAAE,CAAC;AAAA,IACvC,UAAU,GAAG,aAAa,OAAO,EAAE,CAAC;AAAA,EACtC;AACF;AAEA,SAAS,aAAa,OAAqC;AACzD,MAAI,MAAM,SAAS,KAAK,aAAa,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,SAAS,aAAa,OAAO,CAAC,CAAC,GAAG;AAChG,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,aAAa,OAAO,CAAC;AACnC,MAAI,QAAQ,KAAK,MAAM,SAAS,IAAI,QAAQ,IAAI;AAC9C,WAAO,EAAE,QAAQ,WAAW,MAAM;AAAA,EACpC;AACA,QAAM,QAAQ,MAAM,CAAC,KAAK;AAC1B,QAAM,SAAS,MAAM,CAAC,KAAK;AAC3B,SAAO;AAAA,IACL,QAAQ,aAAa,OAAO,CAAC,MAAM,IAAI,QAAQ;AAAA,IAC/C;AAAA,IACA;AAAA,IACA,UAAU,GAAG,aAAa,OAAO,EAAE,CAAC;AAAA,IACpC;AAAA,EACF;AACF;AAEA,SAAS,aAAa,OAAqC;AACzD,QAAM,OAAO,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,IAAI,CAAC,CAAC;AAC3G,MAAI,CAAC,aAAa,KAAK,IAAI,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,QAAM,MAAM,KAAK,MAAM,eAAe,IAAI,CAAC,KAAK;AAChD,QAAM,QAAQ,gBAAgB,KAAK,OAAO;AAC1C,QAAM,SAAS,gBAAgB,KAAK,QAAQ;AAC5C,QAAM,UAAU,IAAI,MAAM,6BAA6B,IAAI,CAAC,GAAG,KAAK;AACpE,QAAM,eAAe,SAAS,MAAM,QAAQ,EAAE,IAAI,MAAM,EAAE,OAAO,OAAO,QAAQ;AAChF,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,UAAU,cAAc,WAAW,IAAI,aAAa,CAAC,IAAI;AAAA,IAChE,QAAQ,WAAW,cAAc,WAAW,IAAI,aAAa,CAAC,IAAI;AAAA,IAClE,MAAM,UAAU,WAAW,OAAO,KAAK;AAAA,EACzC;AACF;AAEA,SAAS,eAAe,OAAmB,WAA2B;AACpE,MAAI,SAAS;AACb,MAAI,QAAQ;AACZ,SAAO,SAAS,MAAM,MAAM,QAAQ;AAClC,UAAM,SAAS,aAAa,OAAO,MAAM;AACzC,UAAM,OAAO,QAAQ,OAAO,SAAS,GAAG,CAAC;AACzC,QAAI,SAAS,WAAW;AACtB;AAAA,IACF;AACA,cAAU,KAAK;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAA2B;AACjD,MAAI,QAAQ;AACZ,WAAS,QAAQ,IAAI,QAAQ,MAAM,QAAQ,SAAS;AAClD,QAAI,MAAM,KAAK,MAAM,IAAM;AACzB;AAAA,IACF;AAAA,EACF;AACA,SAAO,SAAS;AAClB;AAEA,SAAS,yBAAyB,OAA2B;AAC3D,MAAI,QAAQ;AACZ,WAAS,SAAS,IAAI,SAAS,KAAK,MAAM,UAAU;AAClD,UAAM,OAAO,QAAQ,OAAO,QAAQ,CAAC;AACrC,UAAM,OAAO,aAAa,OAAO,SAAS,CAAC;AAC3C,QAAI,SAAS,QAAQ;AACnB;AAAA,IACF;AACA,cAAU,IAAI,OAAQ,OAAO;AAAA,EAC/B;AACA,SAAO,SAAS;AAClB;AAEA,SAAS,aAAa,OAAuB;AAC3C,QAAM,SAAiC;AAAA,IACrC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,SAAO,OAAO,KAAK,KAAK,YAAY,KAAK;AAC3C;AAEA,SAAS,gBAAgB,KAAa,MAAkC;AACtE,QAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,MAAM,IAAI,kBAAkB,GAAG,CAAC,IAAI,CAAC;AACxE,QAAM,SAAS,OAAO,KAAK;AAC3B,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,WAAW,OAAmB,QAAgB,UAA6B;AAClF,SAAO,SAAS,MAAM,CAAC,MAAM,UAAU,MAAM,SAAS,KAAK,MAAM,IAAI;AACvE;AAEA,SAAS,SAAS,OAA6B;AAC7C,SAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AACtE;AAEA,SAAS,QAAQ,OAAmB,QAAgB,QAAwB;AAC1E,MAAI,SAAS,KAAK,SAAS,SAAS,MAAM,QAAQ;AAChD,WAAO;AAAA,EACT;AACA,SAAO,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,QAAQ,SAAS,MAAM,CAAC;AAC7E;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAO,SAAS,KAAK,EAAE,UAAU,QAAQ,IAAI;AAC/C;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAO,MAAM,MAAM,IAAK,MAAM,SAAS,CAAC,KAAK,IAAM,MAAM,SAAS,CAAC,KAAK;AAC1E;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAO,SAAS,KAAK,EAAE,UAAU,QAAQ,IAAI;AAC/C;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAO,SAAS,KAAK,EAAE,UAAU,QAAQ,KAAK;AAChD;AAEA,SAAS,YAAY,OAAmB,QAAwB;AAC9D,SAAO,SAAS,KAAK,EAAE,SAAS,QAAQ,IAAI;AAC9C;AAEA,SAAS,UAAU,KAAqB;AACtC,MAAI,QAAQ,SAAS;AACnB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,UAAU;AACpB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,cAAc;AACxB,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AC9sBA,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,eAAe,oBAAI,IAAI,CAAC,iCAAiC,yBAAyB,qBAAqB,CAAC;AAEvG,SAAS,cAA6B;AAC3C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,KAAK,SAAS,WAAW,QAAQ,KAAK,eAAe,IAAI,KAAK,QAAQ,KAAK,gBAAgB,IAAI,KAAK,SAAS;AAAA,IACtH;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AACvC,YAAM,WAAW,IAAI,KAAK,SAAS,YAAY;AAC/C,YAAM,QAAQ,MAAM,eAAe,IAAI,KAAK,IAAI;AAEhD,YAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,gBAAU,YAAY;AACtB,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAElB,YAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,YAAM,YAAY;AAClB,YAAM,WAAW;AACjB,YAAM,cAAc;AACpB,YAAM,UAAU;AAChB,YAAM,MAAM,YAAY,IAAI,QAAQ,QAAQ,UAAU,UAAU;AAEhE,YAAM,MAAM,IAAI,KAAK,UAAU,YAAY;AAC3C,YAAM,UAAU,gBAAgB,eAAe,OAAO,KAAK,UAAU,IAAI,KAAK,IAAI,CAAC;AACnF,YAAM,OAAO,KAAK;AAClB,gBAAU,OAAO,OAAO,OAAO;AAC/B,UAAI,SAAS,UAAU,IAAI,YAAY;AACvC,UAAI,SAAS,OAAO,SAAS;AAE7B,UAAI,cAAmB;AACvB,UAAI,eAAoB;AACxB,YAAM,QAAQ,QAAQ,UAAU,aAAa,IAAI,QAAQ;AACzD,YAAM,WAAW,QAAQ,UAAU,aAAa;AAChD,YAAM,SAAS,aAAa;AAC5B,YAAM,QAAQ,QAAQ,SAAS,aAAa;AAC5C,YAAM,eAAe,IAAI,KAAK,aAAa,IAAI,KAAK,YAAY,SAAS,YAAY;AAErF,YAAM,wBAAwB,MAAM;AAClC,cAAM,MAAM,UAAU;AACtB,cAAM,MAAM;AAGZ,cAAM,cAAc,MAAM,cAAc,eAAe;AACvD,YAAI,aAAa;AACf,sBAAY,OAAO;AAAA,QACrB;AAEA,cAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,iBAAS,YAAY;AAErB,cAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,cAAM,cAAc,2GAAsB,WAAW;AAErD,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,cAAc;AAEnB,cAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,iBAAS,OAAO;AAChB,iBAAS,WAAW,IAAI,KAAK;AAC7B,iBAAS,cAAc;AAEvB,iBAAS,OAAO,OAAO,MAAM,QAAQ;AACrC,cAAM,OAAO,QAAQ;AAAA,MACvB;AAEA,YAAM,eAAe,MAAM;AACzB,8BAAsB;AAAA,MACxB;AAEA,YAAM,iBAAiB,SAAS,YAAY;AAE5C,UAAI;AACF,YAAI,QAAQ;AACV,gCAAsB;AAAA,QACxB,WAAW,OAAO;AAChB,gBAAM,OAAO,MAAM,OAAO,QAAQ,GAAG;AACrC,cAAI,IAAI,YAAY,GAAG;AACrB,0BAAc,IAAI,IAAI;AACtB,wBAAY,WAAW,GAAG;AAC1B,wBAAY,YAAY,KAAK;AAC7B,wBAAY,GAAG,IAAI,OAAO,OAAO,CAAC,QAAa,SAAc;AAC3D,kBAAI,KAAK,OAAO;AACd,sCAAsB;AAAA,cACxB;AAAA,YACF,CAAC;AAAA,UACH,WAAW,MAAM,YAAY,+BAA+B,GAAG;AAC7D,kBAAM,MAAM;AAAA,UACd,OAAO;AACL,kCAAsB;AAAA,UACxB;AAAA,QACF,WAAW,SAAS,UAAU;AAC5B,gBAAM,UAAU,MAAM,OAAO,WAAW,GAAG;AAC3C,cAAI,OAAO,YAAY,GAAG;AACxB,2BAAe,OAAO,aAAa;AAAA,cACjC,MAAM,QAAQ,QAAQ;AAAA,cACtB;AAAA,YACF,CAAC;AACD,yBAAa,mBAAmB,KAAK;AACrC,yBAAa,KAAK;AAClB,yBAAa,GAAG,OAAO,OAAO,OAAO,MAAM;AACzC,oCAAsB;AAAA,YACxB,CAAC;AAAA,UACH,OAAO;AACL,kCAAsB;AAAA,UACxB;AAAA,QACF,OAAO;AAEL,gBAAM,MAAM;AAAA,QACd;AAAA,MACF,SAAS,KAAK;AACZ,8BAAsB;AAAA,MACxB;AAEA,aAAO;AAAA,QACL,SAAS;AACP,gBAAM,MAAM,QAAQ;AACpB,gBAAM,MAAM,SAAS;AAAA,QACvB;AAAA,QACA,UAAU;AACR,gBAAM,oBAAoB,SAAS,YAAY;AAC/C,gBAAM,MAAM;AAEZ,cAAI,aAAa;AACf,wBAAY,QAAQ;AAAA,UACtB;AACA,cAAI,cAAc;AAChB,yBAAa,OAAO;AACpB,yBAAa,QAAQ;AAAA,UACvB;AAEA,cAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,0BAAgB,KAAK,UAAU;AAC/B,oBAAU,OAAO;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAeA,eAAe,eAAe,MAAkC;AAC9D,MAAI,CAAC,MAAM;AACT,WAAO,IAAI,WAAW;AAAA,EACxB;AACA,SAAO,IAAI,WAAW,MAAM,KAAK,YAAY,EAAE,MAAM,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC;AAChF;AAEA,SAAS,gBAAgB,MAA8B;AACrD,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,kBAAgB,KAAK,gBAAM,KAAK,MAAM;AACtC,MAAI,KAAK,OAAO;AACd,oBAAgB,KAAK,gBAAM,KAAK,KAAK;AAAA,EACvC;AACA,MAAI,KAAK,SAAS,KAAK,QAAQ;AAC7B,oBAAgB,KAAK,gBAAM,GAAG,KAAK,KAAK,MAAM,KAAK,MAAM,IAAI;AAAA,EAC/D;AACA,MAAI,KAAK,UAAU;AACjB,oBAAgB,KAAK,gBAAM,KAAK,QAAQ;AAAA,EAC1C;AACA,MAAI,KAAK,SAAS;AAChB,oBAAgB,KAAK,gBAAM,KAAK,OAAO;AAAA,EACzC;AACA,MAAI,KAAK,WAAW,QAAW;AAC7B,oBAAgB,KAAK,gBAAM,OAAO,KAAK,MAAM,CAAC;AAAA,EAChD;AACA,MAAI,KAAK,aAAa,QAAW;AAC/B,oBAAgB,KAAK,gBAAM,OAAO,KAAK,QAAQ,CAAC;AAAA,EAClD;AACA,MAAI,KAAK,aAAa,QAAW;AAC/B,oBAAgB,KAAK,gBAAM,OAAO,KAAK,QAAQ,CAAC;AAAA,EAClD;AACA,MAAI,KAAK,MAAM;AACb,oBAAgB,KAAK,gBAAM,KAAK,IAAI;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,QAAqB,OAAe,OAAqB;AAChF,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,YAAY;AACjB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,OAAK,OAAO,KAAK,OAAO;AACxB,SAAO,OAAO,IAAI;AACpB;AAEA,SAAS,eAAe,OAAmB,WAAmB,UAAkB,UAA6B;AAC3G,QAAM,YAAY,aAAa,YAAY,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK,SAAS,YAAY;AAC7F,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,QAAQ,UAAU,MAAM,yDAAY;AAAA,EAC/C;AACA,SAAO,aAAa,KAAK,KAAK,cAAc,KAAK,KAAK,aAAa,KAAK,KAAK,aAAa,KAAK,KAAK,cAAc,KAAK,KAAK;AAAA,IAC1H,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AACF;AAEA,SAAS,aAAa,OAAqC;AACzD,MAAI,MAAM,SAAS,MAAMC,SAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AACxD,WAAO;AAAA,EACT;AACA,QAAM,aAAaA,SAAQ,OAAO,GAAG,CAAC;AACtC,QAAM,OAAkB,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,IAAI,QAAQ,OAAO,OAAO,WAAW;AACnG,QAAM,QAAQ,gBAAgB,OAAO,GAAG,MAAM,MAAM;AACpD,QAAM,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM;AACtD,MAAI,MAAM;AACR,UAAM,WAAW,gBAAgB,OAAO,KAAK,QAAQ,KAAK,YAAY,KAAK,GAAG;AAC9E,UAAM,OAAO,SAAS,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM;AACzD,QAAI,MAAM;AACR,YAAM,WAAW,oBAAoB,OAAO,KAAK,QAAQ,KAAK,UAAU;AACxE,UAAI,aAAa,QAAW;AAC1B,aAAK,WAAW,eAAe,QAAQ;AAAA,MACzC;AAAA,IACF;AACA,UAAM,SAAS,SAAS,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM;AAC7D,SAAK,SAAS,OAAO;AACrB,eAAW,SAAS,QAAQ;AAC1B,YAAM,OAAO,gBAAgB,OAAO,MAAM,QAAQ,MAAM,YAAY,MAAM,GAAG,EAAE,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM;AAClH,UAAI,MAAM;AACR,cAAM,OAAO,gBAAgB,OAAO,KAAK,QAAQ,KAAK,UAAU;AAChE,YAAI,KAAK,SAAS,KAAK,QAAQ;AAC7B,eAAK,QAAQ,KAAK;AAClB,eAAK,SAAS,KAAK;AACnB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AASA,SAAS,gBAAgB,OAAmB,OAAe,KAAwB;AACjF,QAAM,QAAmB,CAAC;AAC1B,MAAI,SAAS;AACb,SAAO,SAAS,KAAK,KAAK;AACxB,QAAI,OAAOC,cAAa,OAAO,MAAM;AACrC,UAAM,OAAOD,SAAQ,OAAO,SAAS,GAAG,CAAC;AACzC,QAAI,aAAa;AACjB,QAAI,SAAS,KAAK,SAAS,MAAM,KAAK;AACpC,aAAO,OAAO,aAAa,OAAO,SAAS,CAAC,CAAC;AAC7C,mBAAa;AAAA,IACf;AACA,QAAI,OAAO,cAAc,SAAS,OAAO,OAAO,CAAC,aAAa,KAAK,IAAI,GAAG;AACxE;AAAA,IACF;AACA,UAAM,KAAK,EAAE,MAAM,OAAO,QAAQ,KAAK,SAAS,MAAM,WAAW,CAAC;AAClE,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAmB,QAAoC;AAClF,MAAI,SAAS,KAAK,MAAM,QAAQ;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,MAAM;AAC5B,MAAI,YAAY,KAAK,SAAS,MAAM,MAAM,QAAQ;AAChD,UAAME,aAAYD,cAAa,OAAO,SAAS,EAAE;AACjD,UAAME,YAAW,aAAa,OAAO,SAAS,EAAE;AAChD,WAAOD,aAAY,OAAOC,SAAQ,IAAID,aAAY;AAAA,EACpD;AACA,QAAM,YAAYD,cAAa,OAAO,SAAS,EAAE;AACjD,QAAM,WAAWA,cAAa,OAAO,SAAS,EAAE;AAChD,SAAO,YAAY,WAAW,YAAY;AAC5C;AAEA,SAAS,gBAAgB,OAAmB,QAAqD;AAC/F,QAAM,UAAU,MAAM,MAAM;AAC5B,QAAM,aAAa,YAAY,IAAI,SAAS,KAAK,SAAS;AAC1D,MAAI,aAAa,IAAI,MAAM,QAAQ;AACjC,WAAO,CAAC;AAAA,EACV;AACA,SAAO;AAAA,IACL,OAAOA,cAAa,OAAO,UAAU,IAAI;AAAA,IACzC,QAAQA,cAAa,OAAO,aAAa,CAAC,IAAI;AAAA,EAChD;AACF;AAEA,SAAS,aAAa,OAAqC;AACzD,MAAI,MAAM,SAAS,MAAMD,SAAQ,OAAO,GAAG,CAAC,MAAM,UAAUA,SAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AAC3F,WAAO;AAAA,EACT;AACA,QAAM,aAAa,UAAU,OAAO,QAAQ,EAAE;AAC9C,MAAI,aAAa,KAAK,aAAa,KAAK,MAAM,QAAQ;AACpD,WAAO,EAAE,QAAQ,OAAO,MAAM,iCAAkB;AAAA,EAClD;AACA,QAAM,mBAAmBI,cAAa,OAAO,aAAa,CAAC;AAC3D,QAAM,iBAAiBA,cAAa,OAAO,aAAa,EAAE;AAC1D,QAAM,cAAcA,cAAa,OAAO,aAAa,EAAE;AACvD,QAAM,UAAUA,cAAa,OAAO,aAAa,EAAE;AACnD,QAAM,QAAQA,cAAa,OAAO,aAAa,EAAE;AACjD,QAAM,SAASA,cAAa,OAAO,aAAa,EAAE;AAClD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,SAAS,iBAAiB,GAAG,KAAK,MAAO,iBAAiB,IAAK,GAAI,CAAC,UAAU;AAAA,IAC9E,UAAU,oBAAoB,cAAc,eAAgB,mBAAmB,cAAe,GAAS,IAAI;AAAA,EAC7G;AACF;AAEA,SAAS,cAAc,OAAqC;AAC1D,MAAI,MAAM,SAAS,KAAK,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,KAAM;AACxG,WAAO;AAAA,EACT;AACA,QAAM,OAAO,oBAAoB,OAAO,GAAG,MAAM,MAAM;AACvD,QAAM,SAAS,KAAK,KAAK,CAAC,YAAY,QAAQ,OAAO,SAAU;AAC/D,QAAM,iBAAiB,SAAS,oBAAoB,OAAO,OAAO,WAAW,OAAO,OAAO,IAAI,CAAC;AAChG,QAAM,eAAe,eAAe,OAAO,eAAe,KAAK,CAAC,YAAY,QAAQ,OAAO,KAAM,CAAC;AAClG,QAAM,UAAU,KAAK,KAAK,CAAC,YAAY,QAAQ,OAAO,SAAU;AAChE,QAAM,kBAAkB,UAAU,oBAAoB,OAAO,QAAQ,WAAW,QAAQ,OAAO,IAAI,CAAC;AACpG,QAAM,OAAO,qBAAqB,OAAO,gBAAgB,KAAK,CAAC,YAAY,QAAQ,OAAO,SAAU,CAAC;AACrG,QAAM,SAAS,gBAAgB,OAAO,gBAAgB,KAAK,CAAC,YAAY,QAAQ,OAAO,SAAU,CAAC;AAClG,QAAM,UAAU,cAAc,YAAY,EAAE,SAAS,MAAM,IACvD,SACA,cAAc,YAAY,EAAE,SAAS,UAAU,IAC7C,aACA;AACN,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,OAAO,OAAO,SAAS,IAAI,OAAO,OAAO,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,IAAI;AAAA,IACzE,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,UAAU,KAAK,aAAa,SAAY,SAAY,eAAe,KAAK,QAAQ;AAAA,IAChF,QAAQ,OAAO,SAAS;AAAA,IACxB,MAAM,eAAe,gBAAgB,YAAY,KAAK;AAAA,EACxD;AACF;AAUA,SAAS,oBAAoB,OAAmB,OAAe,KAAa,QAAQ,KAAoB;AACtG,QAAM,WAA0B,CAAC;AACjC,MAAI,SAAS;AACb,SAAO,SAAS,OAAO,SAAS,SAAS,OAAO;AAC9C,UAAM,KAAK,WAAW,OAAO,QAAQ,GAAG;AACxC,QAAI,CAAC,IAAI;AACP;AAAA,IACF;AACA,UAAM,OAAO,aAAa,OAAO,GAAG,QAAQ,GAAG;AAC/C,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,UAAM,YAAY,KAAK;AACvB,UAAM,UAAU,KAAK,UAAU,MAAM,YAAY,KAAK;AACtD,QAAI,UAAU,aAAa,UAAU,KAAK;AACxC;AAAA,IACF;AACA,aAAS,KAAK;AAAA,MACZ,IAAI,GAAG;AAAA,MACP,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACP,CAAC;AACD,aAAS;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAmB,QAAgB,KAA4D;AACjH,QAAM,SAAS,eAAe,MAAM,MAAM,CAAC;AAC3C,MAAI,CAAC,UAAU,SAAS,KAAK,SAAS,SAAS,KAAK;AAClD,WAAO;AAAA,EACT;AACA,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,QAAQ,SAAS;AAC3C,YAAQ,QAAQ,MAAM,MAAM,SAAS,KAAK;AAAA,EAC5C;AACA,SAAO,EAAE,OAAO,QAAQ,SAAS,OAAO;AAC1C;AAEA,SAAS,aAAa,OAAmB,QAAgB,KAA8E;AACrI,QAAM,SAAS,eAAe,MAAM,MAAM,CAAC;AAC3C,MAAI,CAAC,UAAU,SAAS,KAAK,SAAS,SAAS,KAAK;AAClD,WAAO;AAAA,EACT;AACA,QAAM,YAAY,OAAQ;AAC1B,MAAI,QAAQ,MAAM,MAAM,IAAI;AAC5B,MAAI,MAAM;AACV,WAAS,QAAQ,GAAG,QAAQ,QAAQ,SAAS;AAC3C,YAAQ,QAAQ,MAAM,MAAM,SAAS,KAAK;AAC1C,UAAM,MAAM,MAAM;AAAA,EACpB;AACA,SAAO,EAAE,OAAO,QAAQ,SAAS,QAAQ,SAAS,UAAU,IAAI;AAClE;AAEA,SAAS,eAAe,WAAuC;AAC7D,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AACA,WAAS,SAAS,GAAG,UAAU,GAAG,UAAU;AAC1C,QAAI,YAAa,OAAS,SAAS,GAAK;AACtC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAmB,SAA8C;AAC7F,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AACA,QAAM,WAAW,oBAAoB,OAAO,QAAQ,WAAW,QAAQ,OAAO;AAC9E,QAAM,gBAAgB,aAAa,OAAO,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,OAAQ,CAAC,KAAK;AAC9F,QAAM,WAAW,cAAc,OAAO,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,KAAM,CAAC;AACnF,SAAO;AAAA,IACL,UAAU,aAAa,SAAY,SAAa,WAAW,gBAAiB;AAAA,EAC9E;AACF;AAEA,SAAS,gBAAgB,OAAmB,SAA6F;AACvI,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,EAAE;AAAA,EAChC;AACA,QAAM,eAAe,oBAAoB,OAAO,QAAQ,WAAW,QAAQ,OAAO,EAAE,OAAO,CAAC,UAAU,MAAM,OAAO,GAAI;AACvH,QAAM,SAAmB,CAAC;AAC1B,MAAI;AACJ,MAAI;AACJ,aAAW,SAAS,cAAc;AAChC,UAAM,WAAW,oBAAoB,OAAO,MAAM,WAAW,MAAM,OAAO;AAC1E,UAAM,QAAQ,eAAe,OAAO,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,GAAI,CAAC;AAC/E,QAAI,SAAS,CAAC,OAAO,SAAS,KAAK,GAAG;AACpC,aAAO,KAAK,KAAK;AAAA,IACnB;AACA,UAAM,OAAO,aAAa,OAAO,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,GAAI,CAAC;AAC5E,UAAM,QAAQ,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,GAAI;AACxD,QAAI,SAAS,KAAK,OAAO;AACvB,YAAM,gBAAgB,oBAAoB,OAAO,MAAM,WAAW,MAAM,OAAO;AAC/E,cAAQ,aAAa,OAAO,cAAc,KAAK,CAAC,UAAU,MAAM,OAAO,GAAI,CAAC,KAAK;AACjF,eAAS,aAAa,OAAO,cAAc,KAAK,CAAC,UAAU,MAAM,OAAO,GAAI,CAAC,KAAK;AAAA,IACpF;AAAA,EACF;AACA,SAAO,EAAE,OAAO,aAAa,QAAQ,QAAQ,OAAO,OAAO;AAC7D;AAEA,SAAS,eAAe,OAAmB,SAA2C;AACpF,MAAI,CAAC,WAAW,QAAQ,WAAW,QAAQ,aAAa,QAAQ,UAAU,QAAQ,YAAY,MAAM;AAClG,WAAO;AAAA,EACT;AACA,SAAO,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC,EAAE,OAAO,MAAM,MAAM,QAAQ,WAAW,QAAQ,OAAO,CAAC,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK;AACtI;AAEA,SAAS,aAAa,OAAmB,SAA2C;AAClF,MAAI,CAAC,WAAW,QAAQ,WAAW,QAAQ,aAAa,QAAQ,UAAU,QAAQ,YAAY,GAAG;AAC/F,WAAO;AAAA,EACT;AACA,MAAI,QAAQ;AACZ,WAAS,SAAS,QAAQ,WAAW,SAAS,QAAQ,SAAS,UAAU;AACvE,YAAQ,QAAQ,MAAM,MAAM,MAAM;AAAA,EACpC;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAmB,SAA2C;AACnF,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,OAAO,KAAK,KAAK;AACvB,MAAI,QAAQ,UAAU,QAAQ,cAAc,GAAG;AAC7C,WAAO,KAAK,WAAW,QAAQ,WAAW,KAAK;AAAA,EACjD;AACA,MAAI,QAAQ,UAAU,QAAQ,cAAc,GAAG;AAC7C,WAAO,KAAK,WAAW,QAAQ,WAAW,KAAK;AAAA,EACjD;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAqC;AACzD,QAAM,OAAO,eAAe,KAAK;AACjC,MAAI,CAAC,KAAK,WAAW,SAAS,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,QAAM,WAAW,aAAa,MAAM,aAAa;AACjD,QAAM,WAAW,aAAa,MAAM,uBAAuB;AAC3D,QAAM,YAAY,CAAC,GAAG,KAAK,SAAS,sBAAsB,CAAC,EAAE,IAAI,CAAC,UAAU,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,OAAO,QAAQ;AACpH,QAAM,YAAY,KAAK,MAAM,kBAAkB,IAAI,CAAC;AACpD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,UAAU,UAAU,SAAS,IAAI,eAAe,UAAU,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,CAAC,IAAI;AAAA,IACpG,SAAS,YAAY,GAAG,KAAK,MAAM,OAAO,SAAS,IAAI,GAAI,CAAC,UAAU;AAAA,EACxE;AACF;AAEA,SAAS,cAAc,OAAqC;AAC1D,QAAM,OAAO,eAAe,KAAK;AACjC,MAAI,CAAC,aAAa,KAAK,IAAI,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU,mBAAmB,KAAK,MAAM,6CAA6C,IAAI,CAAC,CAAC;AAAA,IAC3F,UAAU,aAAa,MAAM,qBAAqB;AAAA,IAClD,UAAU,aAAa,MAAM,sBAAsB;AAAA,EACrD;AACF;AAEA,SAAS,eAAe,OAA2B;AACjD,SAAO,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,KAAK,CAAC,CAAC,EAAE,KAAK;AAC/G;AAEA,SAAS,aAAa,OAAe,SAAyB;AAC5D,SAAO,CAAC,GAAG,MAAM,SAAS,OAAO,CAAC,EAAE;AACtC;AAEA,SAAS,mBAAmB,OAAoC;AAC9D,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,MAAM,MAAM,sEAAsE;AAChG,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,UAAU,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,MAAM,CAAC,KAAK,CAAC;AAChG,SAAO,eAAe,OAAO;AAC/B;AAEA,SAAS,eAAe,SAAyB;AAC/C,MAAI,CAAC,OAAO,SAAS,OAAO,KAAK,WAAW,GAAG;AAC7C,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,QAAM,QAAQ,KAAK,MAAM,QAAQ,IAAI;AACrC,QAAM,UAAU,KAAK,MAAO,QAAQ,OAAQ,EAAE;AAC9C,QAAM,OAAO,QAAQ;AACrB,SAAO,QAAQ,IAAI,GAAG,KAAK,IAAI,OAAO,OAAO,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC,KAAK,GAAG,OAAO,IAAI,OAAO,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC;AAClJ;AAEA,SAASJ,SAAQ,OAAmB,QAAgB,QAAwB;AAC1E,MAAI,SAAS,KAAK,SAAS,SAAS,MAAM,QAAQ;AAChD,WAAO;AAAA,EACT;AACA,SAAO,IAAI,YAAY,QAAQ,EAAE,OAAO,MAAM,MAAM,QAAQ,SAAS,MAAM,CAAC;AAC9E;AAEA,SAAS,UAAU,OAAmB,OAAe,QAAQ,GAAW;AACtE,QAAM,UAAU,IAAI,YAAY,EAAE,OAAO,KAAK;AAC9C,WAAS,SAAS,OAAO,SAAS,QAAQ,UAAU,MAAM,QAAQ,UAAU;AAC1E,QAAI,QAAQ,MAAM,CAAC,MAAM,UAAU,MAAM,SAAS,KAAK,MAAM,IAAI,GAAG;AAClE,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,KAAK,OAA6B;AACzC,SAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AACtE;AAEA,SAASI,cAAa,OAAmB,QAAwB;AAC/D,SAAO,KAAK,KAAK,EAAE,UAAU,QAAQ,IAAI;AAC3C;AAEA,SAASH,cAAa,OAAmB,QAAwB;AAC/D,SAAO,KAAK,KAAK,EAAE,UAAU,QAAQ,KAAK;AAC5C;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAQ,OAAOA,cAAa,OAAO,MAAM,CAAC,KAAK,MAAO,OAAOA,cAAa,OAAO,SAAS,CAAC,CAAC;AAC9F;;;AC3mBA,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,cAA6B;AAC3C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,KAAK,SAAS,WAAW,QAAQ,KAAK,gBAAgB,IAAI,KAAK,SAAS;AAAA,IACjF;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AACvC,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AACpB,YAAM,QAAQ,MAAM,eAAe,IAAI,KAAK,IAAI;AAEhD,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,cAAc,IAAI,KAAK;AAE7B,YAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,YAAM,MAAM;AACZ,YAAM,WAAW;AACjB,YAAM,UAAU;AAEhB,cAAQ,OAAO,OAAO,OAAO,gBAAgB,eAAe,OAAO,IAAI,KAAK,WAAW,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC1G,UAAI,SAAS,UAAU,IAAI,YAAY;AACvC,UAAI,SAAS,OAAO,OAAO;AAE3B,YAAM,eAAe,IAAI,KAAK,aAAa,IAAI,KAAK,YAAY,SAAS,YAAY;AACrF,YAAM,uBAAuB,MAAM;AACjC,cAAM,MAAM;AACZ,cAAM,OAAO;AAEb,YAAI,QAAQ,cAAc,eAAe,GAAG;AAC1C;AAAA,QACF;AAEA,cAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,iBAAS,YAAY;AAErB,cAAM,gBAAgB,SAAS,cAAc,QAAQ;AACrD,sBAAc,cAAc,2GAAsB,WAAW;AAE7D,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,cAAc;AAEnB,cAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,iBAAS,OAAO;AAChB,iBAAS,WAAW,IAAI,KAAK;AAC7B,iBAAS,cAAc;AAEvB,iBAAS,OAAO,eAAe,MAAM,QAAQ;AAC7C,gBAAQ,OAAO,QAAQ;AAAA,MACzB;AAEA,YAAM,iBAAiB,SAAS,oBAAoB;AAEpD,aAAO;AAAA,QACL,UAAU;AACR,gBAAM,oBAAoB,SAAS,oBAAoB;AACvD,gBAAM,MAAM;AACZ,cAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,0BAAgB,KAAK,UAAU;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAcA,eAAe,eAAe,MAAkC;AAC9D,MAAI,CAAC,MAAM;AACT,WAAO,IAAI,WAAW;AAAA,EACxB;AACA,SAAO,IAAI,WAAW,MAAM,KAAK,YAAY,EAAE,MAAM,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC;AAChF;AAEA,SAAS,gBAAgB,MAA8B;AACrD,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,EAAAI,iBAAgB,KAAK,gBAAM,KAAK,MAAM;AACtC,MAAI,KAAK,OAAO;AACd,IAAAA,iBAAgB,KAAK,gBAAM,KAAK,KAAK;AAAA,EACvC;AACA,MAAI,KAAK,YAAY;AACnB,IAAAA,iBAAgB,KAAK,sBAAO,GAAG,KAAK,UAAU,KAAK;AAAA,EACrD;AACA,MAAI,KAAK,UAAU;AACjB,IAAAA,iBAAgB,KAAK,gBAAM,OAAO,KAAK,QAAQ,CAAC;AAAA,EAClD;AACA,MAAI,KAAK,UAAU;AACjB,IAAAA,iBAAgB,KAAK,gBAAM,GAAG,KAAK,QAAQ,MAAM;AAAA,EACnD;AACA,MAAI,KAAK,SAAS;AAChB,IAAAA,iBAAgB,KAAK,gBAAM,KAAK,OAAO;AAAA,EACzC;AACA,MAAI,KAAK,UAAU;AACjB,IAAAA,iBAAgB,KAAK,gBAAM,KAAK,QAAQ;AAAA,EAC1C;AACA,MAAI,KAAK,MAAM;AACb,IAAAA,iBAAgB,KAAK,gBAAM,KAAK,IAAI;AAAA,EACtC;AACA,MAAI,KAAK,MAAM;AACb,IAAAA,iBAAgB,KAAK,gBAAM,KAAK,IAAI;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAASA,iBAAgB,QAAqB,OAAe,OAAqB;AAChF,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,YAAY;AACjB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,OAAK,OAAO,KAAK,OAAO;AACxB,SAAO,OAAO,IAAI;AACpB;AAEA,SAAS,eAAe,OAAmB,WAAmB,UAA6B;AACzF,QAAM,YAAY,aAAa,YAAY,SAAS,YAAY;AAChE,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,QAAQ,UAAU,MAAM,yDAAY;AAAA,EAC/C;AACA,SAAO,cAAc,KAAK,KAAK,cAAc,KAAK,KAAK,aAAa,KAAK,KAAK,cAAc,KAAK,KAAK,YAAY,KAAK,KAAK,cAAc,KAAK,KAAK,gBAAgB,KAAK,KAAK;AAAA,IAC5K,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AACF;AAEA,SAAS,cAAc,OAAqC;AAC1D,MAAI,MAAM,SAAS,MAAMC,SAAQ,OAAO,GAAG,CAAC,MAAM,UAAUA,SAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AAC3F,WAAO;AAAA,EACT;AACA,MAAI,SAAS;AACb,MAAI,WAAW;AACf,MAAI,aAAa;AACjB,MAAI,WAAW;AACf,MAAI,WAAW;AACf,MAAI,YAAY;AAChB,SAAO,SAAS,KAAK,MAAM,QAAQ;AACjC,UAAM,QAAQA,SAAQ,OAAO,QAAQ,CAAC;AACtC,UAAM,OAAOC,cAAa,OAAO,SAAS,CAAC;AAC3C,UAAM,aAAa,SAAS;AAC5B,QAAI,UAAU,UAAU,aAAa,MAAM,MAAM,QAAQ;AACvD,iBAAWC,cAAa,OAAO,aAAa,CAAC;AAC7C,mBAAaD,cAAa,OAAO,aAAa,CAAC;AAC/C,iBAAWA,cAAa,OAAO,aAAa,CAAC;AAC7C,iBAAWC,cAAa,OAAO,aAAa,EAAE;AAAA,IAChD;AACA,QAAI,UAAU,QAAQ;AACpB,kBAAY;AAAA,IACd;AACA,cAAU,IAAI,OAAQ,OAAO;AAAA,EAC/B;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,WAAW,GAAG,KAAK,MAAO,WAAW,IAAK,GAAI,CAAC,UAAU;AAAA,IAClE,UAAU,YAAY,YAAYC,gBAAe,YAAY,QAAQ,IAAI;AAAA,EAC3E;AACF;AAEA,SAAS,cAAc,OAAqC;AAC1D,MAAI,MAAM,SAAS,MAAMH,SAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AACxD,WAAO;AAAA,EACT;AACA,MAAI,SAAS;AACb,SAAO,SAAS,KAAK,MAAM,QAAQ;AACjC,UAAM,OAAO,MAAM,MAAM,IAAI;AAC7B,UAAM,SAAU,MAAM,SAAS,CAAC,KAAK,KAAO,MAAM,SAAS,CAAC,KAAK,IAAK,MAAM,SAAS,CAAC;AACtF,UAAM,aAAa,SAAS;AAC5B,QAAI,SAAS,KAAK,aAAa,MAAM,MAAM,QAAQ;AACjD,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,aAAc,OAAO,KAAO,OAAO,KAAO,MAAM,QAAS;AAC/D,YAAM,aAAa,MAAM,OAAS,KAAK;AACvC,YAAM,aAAc,MAAM,MAAS,KAAO,MAAM,QAAS,KAAM;AAC/D,YAAM,eAAiB,OAAO,MAAM,EAAI,KAAK,MAAQ,OAAO,GAAG,KAAK,MAAQ,OAAO,GAAG,KAAK,MAAQ,OAAO,GAAG,KAAK,KAAM,OAAO,GAAG;AAClI,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,cAAc,eAAe,KAAKG,gBAAe,OAAO,YAAY,IAAI,UAAU,IAAI;AAAA,MAClG;AAAA,IACF;AACA,cAAU,IAAI;AAAA,EAChB;AACA,SAAO,EAAE,QAAQ,QAAQ,OAAO,QAAQ,MAAM,+CAAgC;AAChF;AAEA,SAAS,gBAAgB,OAAqC;AAC5D,MAAI,SAAS;AACb,MAAI;AACJ,MAAI,MAAM,UAAU,MAAMH,SAAQ,OAAO,GAAG,CAAC,MAAM,OAAO;AACxD,WAAO,SAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AACpC,aAAS,KAAK,cAAc,OAAO,CAAC;AAAA,EACtC;AACA,WAAS,QAAQ,QAAQ,QAAQ,IAAI,KAAK,IAAI,MAAM,QAAQ,SAAS,IAAI,GAAG,SAAS;AACnF,QAAI,MAAM,KAAK,MAAM,QAAS,MAAM,QAAQ,CAAC,IAAI,SAAU,KAAM;AAC/D,YAAM,cAAe,MAAM,QAAQ,CAAC,KAAK,IAAK;AAC9C,YAAM,YAAa,MAAM,QAAQ,CAAC,KAAK,IAAK;AAC5C,YAAM,eAAgB,MAAM,QAAQ,CAAC,KAAK,IAAK;AAC/C,YAAM,cAAe,MAAM,QAAQ,CAAC,KAAK,IAAK;AAC9C,YAAM,cAAe,MAAM,QAAQ,CAAC,KAAK,IAAK;AAC9C,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO,GAAG,YAAY,WAAW,CAAC,UAAU,UAAU,SAAS,CAAC;AAAA,QAChE,YAAY,cAAc,aAAa,WAAW;AAAA,QAClD,UAAU,gBAAgB,IAAI,IAAI;AAAA,QAClC,SAAS,WAAW,aAAa,WAAW,YAAY;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,OAAO,EAAE,QAAQ,OAAO,MAAM,MAAM,wDAAqB,IAAI;AACtE;AAEA,SAAS,aAAa,OAAqC;AACzD,MAAI,MAAM,SAAS,MAAMA,SAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AACxD,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,gBAAgB,KAAK;AACnC,QAAM,cAAc,MAAM,CAAC,GAAG,QAAQ,CAAC;AACvC,QAAM,cAAc,CAAC,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE,GAAG;AAC5E,MAAI,eAAeA,SAAQ,aAAa,GAAG,CAAC,MAAM,YAAY;AAC5D,UAAM,UAAU,YAAY,UAAU,KAAKE,cAAa,aAAa,EAAE,IAAI;AAC3E,UAAM,aAAa,YAAY,UAAU,KAAKD,cAAa,aAAa,EAAE,IAAI;AAC9E,UAAM,eAAe,gBAAgB,SAAY,SAAY,cAAc,OAAO,OAAO;AACzF,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU,YAAY,CAAC;AAAA,MACvB;AAAA,MACA,UAAU,iBAAiB,UAAa,eAAe,KAAKE,gBAAe,OAAO,YAAY,IAAI,IAAK,IAAI;AAAA,MAC3G,MAAM,GAAG,MAAM,MAAM;AAAA,IACvB;AAAA,EACF;AACA,MAAI,eAAe,YAAY,CAAC,MAAM,KAAQH,SAAQ,aAAa,GAAG,CAAC,MAAM,UAAU;AACrF,UAAM,aAAa,YAAY,UAAU,KAAKC,cAAa,aAAa,EAAE,IAAI;AAC9E,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU,YAAY,EAAE;AAAA,MACxB;AAAA,MACA,SAAS,YAAY,UAAU,KAAK,iBAAiB,WAAW,IAAI;AAAA,MACpE,UAAU,cAAc,gBAAgB,UAAa,cAAc,KAAKE,gBAAe,OAAO,WAAW,IAAI,UAAU,IAAI;AAAA,MAC3H,MAAM,GAAG,MAAM,MAAM;AAAA,IACvB;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,OAAO,MAAM,MAAM,SAAS,IAAI,4CAAwB,MAAM,MAAM,YAAO,sCAAuB;AACrH;AAOA,SAAS,gBAAgB,OAA8B;AACrD,QAAM,QAAmB,CAAC;AAC1B,MAAI,SAAS;AACb,MAAI,kBAA4B,CAAC;AACjC,SAAO,SAAS,MAAM,MAAM,UAAUH,SAAQ,OAAO,QAAQ,CAAC,MAAM,QAAQ;AAC1E,UAAM,eAAe,MAAM,SAAS,EAAE;AACtC,UAAM,qBAAqB,SAAS;AACpC,UAAM,aAAa,qBAAqB;AACxC,QAAI,aAAa,MAAM,QAAQ;AAC7B;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,oBAAoB,UAAU,CAAC;AACpE,UAAM,gBAAgB,MAAM,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AACjE,UAAM,aAAa,aAAa;AAChC,QAAI,aAAa,MAAM,QAAQ;AAC7B;AAAA,IACF;AACA,UAAM,cAA4B,CAAC;AACnC,QAAI,eAAe;AACnB,eAAW,QAAQ,OAAO;AACxB,sBAAgB,KAAK,GAAG,MAAM,MAAM,cAAc,eAAe,IAAI,CAAC;AACtE,sBAAgB;AAChB,UAAI,OAAO,KAAK;AACd,oBAAY,KAAK,IAAI,WAAW,eAAe,CAAC;AAChD,0BAAkB,CAAC;AAAA,MACrB;AAAA,IACF;AACA,UAAM,KAAK;AAAA,MACT,SAAS,aAAa,OAAO,SAAS,CAAC;AAAA,MACvC,SAAS;AAAA,IACX,CAAC;AACD,aAAS;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAAwC;AAChE,QAAM,UAAUC,cAAa,QAAQ,EAAE;AACvC,MAAI,UAAU,GAAG;AACf,WAAO,GAAG,KAAK,MAAM,UAAU,GAAI,CAAC;AAAA,EACtC;AACA,QAAM,QAAQA,cAAa,QAAQ,EAAE;AACrC,QAAM,QAAQA,cAAa,QAAQ,EAAE;AACrC,MAAI,QAAQ,KAAK,QAAQ,GAAG;AAC1B,WAAO,GAAG,KAAK,OAAQ,QAAQ,SAAS,IAAK,GAAI,CAAC;AAAA,EACpD;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAqC;AAC1D,MAAI,MAAM,SAAS,MAAMD,SAAQ,OAAO,GAAG,CAAC,MAAM,UAAU,CAAC,CAAC,QAAQ,MAAM,EAAE,SAASA,SAAQ,OAAO,GAAG,CAAC,CAAC,GAAG;AAC5G,WAAO;AAAA,EACT;AACA,QAAM,SAASA,SAAQ,OAAO,GAAG,CAAC;AAClC,MAAI,SAAS;AACb,SAAO,SAAS,MAAM,MAAM,QAAQ;AAClC,UAAM,QAAQA,SAAQ,OAAO,QAAQ,CAAC;AACtC,UAAM,OAAOI,cAAa,OAAO,SAAS,CAAC;AAC3C,QAAI,UAAU,QAAQ;AACpB,aAAO;AAAA,QACL;AAAA,QACA,UAAU,aAAa,OAAO,SAAS,CAAC;AAAA,QACxC,UAAU,aAAa,OAAO,SAAS,EAAE;AAAA,QACzC,YAAY,KAAK,MAAM,iBAAiB,OAAO,SAAS,EAAE,CAAC;AAAA,MAC7D;AAAA,IACF;AACA,cAAU,IAAI,OAAQ,OAAO;AAAA,EAC/B;AACA,SAAO,EAAE,QAAQ,MAAM,gCAAiB;AAC1C;AAEA,SAAS,YAAY,OAAqC;AACxD,MAAI,MAAM,SAAS,MAAMJ,SAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AACxD,WAAO;AAAA,EACT;AACA,QAAM,aAAaI,cAAa,OAAO,CAAC;AACxC,QAAM,WAAWA,cAAa,OAAO,CAAC;AACtC,QAAM,WAAWA,cAAa,OAAO,EAAE;AACvC,QAAM,aAAaA,cAAa,OAAO,EAAE;AACzC,QAAM,WAAWA,cAAa,OAAO,EAAE;AACvC,QAAM,WAAW,WAAW,QAAQ;AACpC,QAAM,iBAAiB,WAAW,WAAW,IAAI;AACjD,QAAM,mBAAmB,aAAa,aAAa,KAAK,IAAI,GAAG,MAAM,SAAS,UAAU,IAAI;AAC5F,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,eAAe,QAAQ;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,cAAc,YAAY,kBAAkB,mBAAmBD,gBAAe,oBAAoB,aAAa,WAAW,eAAe,IAAI;AAAA,IACvJ,MAAM,UAAU,UAAU;AAAA,EAC5B;AACF;AAEA,SAAS,eAAe,OAAuB;AAC7C,QAAM,QAAgC;AAAA,IACpC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AACA,SAAO,MAAM,KAAK,KAAK,YAAY,KAAK;AAC1C;AAEA,SAAS,WAAW,OAAmC;AACrD,QAAM,SAAiC;AAAA,IACrC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,EACN;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,cAAc,OAAqC;AAC1D,MAAI,MAAM,SAAS,MAAMH,SAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AACxD,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,OAAO,aAAa,OAAO,CAAC,CAAC;AAAA,IACpC,UAAU,aAAa,OAAO,EAAE;AAAA,IAChC,MAAM,GAAG,aAAa,OAAO,EAAE,CAAC;AAAA,EAClC;AACF;AAEA,SAASG,gBAAe,SAAyB;AAC/C,MAAI,CAAC,OAAO,SAAS,OAAO,KAAK,WAAW,GAAG;AAC7C,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,QAAM,UAAU,KAAK,MAAM,QAAQ,EAAE;AACrC,QAAM,OAAO,QAAQ;AACrB,SAAO,GAAG,OAAO,IAAI,OAAO,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC;AACpD;AAEA,SAASH,SAAQ,OAAmB,QAAgB,QAAwB;AAC1E,MAAI,SAAS,KAAK,SAAS,SAAS,MAAM,QAAQ;AAChD,WAAO;AAAA,EACT;AACA,SAAO,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,QAAQ,SAAS,MAAM,CAAC;AAC7E;AAEA,SAASK,MAAK,OAA6B;AACzC,SAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AACtE;AAEA,SAASH,cAAa,OAAmB,QAAwB;AAC/D,SAAOG,MAAK,KAAK,EAAE,UAAU,QAAQ,IAAI;AAC3C;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAOA,MAAK,KAAK,EAAE,UAAU,QAAQ,KAAK;AAC5C;AAEA,SAASJ,cAAa,OAAmB,QAAwB;AAC/D,SAAOI,MAAK,KAAK,EAAE,UAAU,QAAQ,IAAI;AAC3C;AAEA,SAASD,cAAa,OAAmB,QAAwB;AAC/D,SAAOC,MAAK,KAAK,EAAE,UAAU,QAAQ,KAAK;AAC5C;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAQ,OAAOJ,cAAa,OAAO,SAAS,CAAC,CAAC,KAAK,MAAO,OAAOA,cAAa,OAAO,MAAM,CAAC;AAC9F;AAEA,SAAS,cAAc,OAAmB,QAAwB;AAChE,UAAS,MAAM,MAAM,IAAI,QAAS,MAAQ,MAAM,SAAS,CAAC,IAAI,QAAS,MAAQ,MAAM,SAAS,CAAC,IAAI,QAAS,IAAM,MAAM,SAAS,CAAC,IAAI;AACxI;AAEA,SAAS,YAAY,MAAsB;AACzC,SAAO,SAAS,IAAI,WAAW,SAAS,IAAI,WAAW,SAAS,IAAI,aAAa;AACnF;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,SAAS,IAAI,MAAM,SAAS,IAAI,OAAO,SAAS,IAAI,QAAQ;AACrE;AAEA,SAAS,cAAc,aAAqB,OAAmC;AAC7E,QAAM,QAAQ,gBAAgB,IAAI,CAAC,OAAO,MAAO,IAAK,IAAI,gBAAgB,IAAI,CAAC,OAAO,MAAO,IAAK,IAAI,CAAC,OAAO,MAAO,GAAI;AACzH,SAAO,MAAM,KAAK;AACpB;AAEA,SAAS,WAAW,aAAqB,WAAmB,OAAmC;AAC7F,QAAM,cAAc,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AACrF,QAAM,cAAc,CAAC,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,GAAG;AACjF,MAAI,SAAS,KAAK,SAAS,MAAM,cAAc,GAAG;AAChD,WAAO;AAAA,EACT;AACA,SAAO,IAAI,gBAAgB,IAAI,cAAc,aAAa,KAAK,CAAC;AAClE;AAEA,SAAS,iBAAiB,OAAmB,QAAwB;AACnE,QAAM,WAAW,aAAa,OAAO,MAAM,IAAI;AAC/C,MAAI,WAAW;AACf,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS;AACtC,eAAW,WAAW,MAAM,MAAM,SAAS,IAAI,KAAK;AAAA,EACtD;AACA,SAAO,WAAW,KAAK,IAAI,GAAG,WAAW,QAAQ,EAAE;AACrD;;;AC/fA,IAAM,UAAkC;AAAA,EACtC,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AAAA,EACH,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,GAAG;AAAA,EACH,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,UAAU;AACZ;AACA,IAAM,kBAA0C;AAAA,EAC9C,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA,EACb,aAAa;AAAA,EACb,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AACd;AACA,IAAM,cAAsC;AAAA,EAC1C,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,mBAAmB;AAAA,EACnB,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,YAAY;AACd;AAEA,IAAM,sBAAsB;AAC5B,IAAM,mBAAmB;AACzB,IAAM,oBAAoB;AAoB1B,SAAS,aAAa,OAAwC;AAC5D,QAAM,UAAU;AAChB,QAAM,SAAS;AAEf,QAAM,WAAW,UAAU,SAAS,SAAS;AAC7C,QAAM,aAAa,UAAU,SAAS,UAAU;AAEhD,WAAS,eAAe,UAAU,GAAG,OAAO;AAE5C,MAAI,SAAS,eAAe,QAAQ,GAAG;AACrC,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAEA,QAAM,OACJ,UAAU,SACN,8EACA;AAEN,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,KAAK;AACV,SAAK,MAAM;AACX,SAAK,OAAO;AACZ,SAAK,SAAS,MAAM,QAAQ;AAC5B,SAAK,UAAU,MAAM,OAAO,IAAI,MAAM,6BAA6B,IAAI,EAAE,CAAC;AAC1E,aAAS,KAAK,YAAY,IAAI;AAAA,EAChC,CAAC;AACH;AAEO,SAAS,aAA4B;AAC1C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,WAAW,IAAI;AAAA,IACxB;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,MAAM,IAAI,KAAK,UAAU,YAAY;AAC3C,YAAM,OAAO,gBAAgB,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,QAAQ;AAClE,YAAM,iBAAiB,SAAS;AAChC,YAAM,aAAa,SAAS;AAC5B,YAAM,OAAO,MAAM,SAAS,IAAI,KAAK,MAAM,EAAE,MAAM,CAAC,UAAmB,MAAS;AAChF,UAAI,SAAS,QAAW;AACtB,cAAM,WAAW,mBAAmB,IAAI,KAAK,MAAM,IAAI,KAAK,GAAG;AAC/D,YAAI,SAAS,UAAU,IAAI,YAAY;AACvC,YAAI,SAAS,OAAO,QAAQ;AAC5B,eAAO;AAAA,UACL,UAAU;AACR,gBAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,qBAAS,OAAO;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAGA,YAAM,SACJ,IAAI,KAAK,eAAe,UAAU,SAAS,gBAAgB,KAC3D,SAAS,KAAK,UAAU,SAAS,gBAAgB,KAChD,IAAI,QAAQ,UAAU,UAAU,OAAO,aAAa,8BAA8B,EAAE,WACrF,IAAI,QAAQ,UAAU;AAGxB,UAAI,YAAY;AACd,cAAM,CAAC,cAAcK,cAAa,eAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,UACrE,OAAO,QAAQ;AAAA,UACf,OAAO,SAAS;AAAA,UAChB,OAAO,WAAW;AAAA,QACpB,CAAC;AAED,cAAM,gBACJ,aAAa,QAAQ,SAAS,aAAa,SAAU,aAAqB,SAAS;AACrF,cAAMC,SAAQD,aAAY,WAAWA;AACrC,cAAME,aAAY,gBAAgB,WAAW;AAE7C,cAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,kBAAU,YAAY;AACtB,kBAAU,YAAYA,WAAU,SAAS,cAAc,IAAI,GAAG;AAAA,UAC5D,cAAc,EAAE,MAAM,KAAK;AAAA,UAC3B,UAAU,CAAC,QAAQ;AAAA,QACrB,CAAC;AACD,4BAAoB,SAAS;AAC7B,YAAI,SAAS,YAAY,SAAS;AAGlC,YAAI;AACF,gBAAM,aAAa,UAAU,iBAAiB,UAAU;AACxD,cAAI,WAAW,SAAS,GAAG;AACzB,kBAAM,aAAa,SAAS,SAAS,OAAO;AAC5C,uBAAW,QAAQ,CAAC,UAAU;AAC5B,oBAAM,SAAS,MAAM;AACrB,kBAAI,UAAU,CAAC,OAAO,UAAU,SAAS,WAAW,GAAG;AACrD,uBAAO,YAAY;AAAA,cACrB;AACA,cAAAD,OAAM,iBAAiB,KAAK;AAAA,YAC9B,CAAC;AAAA,UACH;AAAA,QACF,SAAS,GAAG;AACV,kBAAQ,KAAK,wCAAwC,CAAC;AAAA,QACxD;AAEA,eAAO;AAAA,UACL,UAAU;AACR,sBAAU,OAAO;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAGA,YAAM,CAAC,WAAW,IAAI,MAAM,QAAQ,IAAI,CAAC,OAAO,SAAS,CAAC,CAAC;AAC3D,YAAM,QAAQ,YAAY,WAAW;AAGrC,UAAI,SAAS,QAAQ;AACnB,YAAI;AACF,cAAI,SAAS,gBAAgB,SAAS,OAAO;AAC3C,kBAAM,OAAO,qCAAqC;AAAA,UACpD,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,SAAS;AAC3B,kBAAM,OAAO,gCAAgC;AAAA,UAC/C,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,8BAA8B;AAAA,UAC7C,WAAW,SAAS,cAAc;AAChC,kBAAM,OAAO,qCAAqC;AAAA,UACpD,WAAW,SAAS,gBAAgB;AAClC,kBAAM,OAAO,uCAAuC;AAAA,UACtD,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,YAAY;AAC9B,kBAAM,OAAO,mCAAmC;AAAA,UAClD,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,8BAA8B;AAAA,UAC7C,WAAW,SAAS,SAAS;AAC3B,kBAAM,OAAO,gCAAgC;AAAA,UAC/C,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,8BAA8B;AAAA,UAC7C,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,cAAc;AAChC,kBAAM,OAAO,qCAAqC;AAAA,UACpD,WAAW,SAAS,SAAS;AAC3B,kBAAM,OAAO,gCAAgC;AAAA,UAC/C,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,YAAY;AAC9B,kBAAM,OAAO,mCAAmC;AAAA,UAClD,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,SAAS;AAC3B,kBAAM,OAAO,gCAAgC;AAAA,UAC/C,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,WAAW;AAC7B,kBAAM,OAAO,kCAAkC;AAAA,UACjD,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,MAAM;AACxB,kBAAM,OAAO,6BAA6B;AAAA,UAC5C,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,SAAS;AAC3B,kBAAM,OAAO,gCAAgC;AAAA,UAC/C,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,SAAS;AAC3B,kBAAM,OAAO,gCAAgC;AAAA,UAC/C,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,8BAA8B;AAAA,UAC7C,WAAW,SAAS,KAAK;AACvB,kBAAM,OAAO,4BAA4B;AAAA,UAC3C,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,8BAA8B;AAAA,UAC7C,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,WAAW;AAC7B,kBAAM,OAAO,kCAAkC;AAAA,UACjD,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,WAAW;AAC7B,kBAAM,OAAO,kCAAkC;AAAA,UACjD,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,8BAA8B;AAAA,UAC7C,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,4BAA4B;AACzC,kBAAM,OAAO,8BAA8B;AAAA,UAC7C,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,4CAA4C;AACzD,kBAAM,OAAO,8BAA8B;AAAA,UAC7C;AAAA,QACF,SAAS,GAAG;AACV,kBAAQ,KAAK,gDAAgD,IAAI,IAAI,CAAC;AAAA,QACxE;AAAA,MACF;AAEA,YAAM,aAAa,SAAS,SAAS,OAAO,EAAE,MAAM,CAAC,UAAU;AAC7D,gBAAQ,KAAK,oEAAoE,KAAK;AAAA,MACxF,CAAC;AAED,YAAM,WAAW,KAAK,SAAS,mBAAmB,KAAK,MAAM,GAAG,gBAAgB,IAAI;AACpF,YAAM,aAAa,WAAW,IAAI;AAClC,YAAM,aAAa,WAAW,QAAQ;AACtC,YAAM,YAAY,SAAS,SAAS,KAAK;AACzC,YAAM,kBAAkB,SAAS,UAAU;AAC3C,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AACpB,UAAI,WAAW;AACb,gBAAQ,UAAU,IAAI,cAAc;AAAA,MACtC;AACA,UAAI,gBAAgB;AAClB,gBAAQ,UAAU,IAAI,YAAY;AAAA,MACpC;AAEA,YAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,aAAO,YAAY;AAEnB,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,WAAW,SAAS,cAAc,QAAQ;AAChD,eAAS,cAAc,IAAI,KAAK;AAChC,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,cAAc;AAAA,QACjB,SAAS,SAAS,eAAe;AAAA,QACjC,GAAG,WAAW,eAAe,CAAC;AAAA,QAC9B,YAAY,IAAI,KAAK,SAAS,IAAI,KAAK,kBAAkB,OAAO,IAAI,KAAK,OAAO,OAAO,KAAK,OAAO;AAAA,MACrG,EAAE,KAAK,QAAK;AACZ,YAAM,OAAO,UAAU,IAAI;AAE3B,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AAEpB,YAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,aAAO,YAAY;AACnB,aAAO,aAAa,QAAQ,QAAQ;AAEpC,YAAM,aAAa,SAAS,cAAc,QAAQ;AAClD,iBAAW,OAAO;AAClB,iBAAW,YAAY;AACvB,iBAAW,cAAc;AACzB,iBAAW,aAAa,gBAAgB,OAAO,cAAc,CAAC;AAC9D,iBAAW,iBAAiB,SAAS,MAAM;AACzC,cAAM,UAAU,QAAQ,UAAU,OAAO,YAAY;AACrD,mBAAW,aAAa,gBAAgB,OAAO,OAAO,CAAC;AACvD,sBAAc,gBAAgB,EAAE,UAAU,UAAU,OAAO,MAAM,CAAC;AAClE,YAAI,gBAAgB;AAClB,yBAAe,OAAO,UAAU,SAAS;AAAA,QAC3C;AAAA,MACF,CAAC;AAED,YAAM,aAAa,SAAS,cAAc,QAAQ;AAClD,iBAAW,OAAO;AAClB,iBAAW,YAAY;AACvB,iBAAW,cAAc;AACzB,iBAAW,iBAAiB,SAAS,YAAY;AAC/C,mBAAW,WAAW;AACtB,YAAI;AACF,gBAAM,gBAAgB,IAAI;AAC1B,iBAAO,cAAc;AAAA,QACvB,QAAQ;AACN,iBAAO,cAAc;AAAA,QACvB,UAAE;AACA,qBAAW,WAAW;AAAA,QACxB;AAAA,MACF,CAAC;AAED,YAAM,iBAAiB,SAAS,cAAc,QAAQ;AACtD,qBAAe,OAAO;AACtB,qBAAe,YAAY;AAC3B,qBAAe,cAAc;AAC7B,qBAAe,iBAAiB,SAAS,MAAM;AAC7C,qBAAa,IAAI,KAAK,MAAM,IAAI;AAChC,eAAO,cAAc;AAAA,MACvB,CAAC;AAED,YAAM,eAAe,SAAS,cAAc,QAAQ;AACpD,mBAAa,OAAO;AACpB,mBAAa,YAAY;AACzB,mBAAa,cAAc;AAC3B,mBAAa,aAAa,gBAAgB,OAAO;AAEjD,cAAQ,OAAO,QAAQ,cAAc,YAAY,YAAY,cAAc;AAC3E,aAAO,OAAO,OAAO,OAAO;AAC5B,YAAM,mBAAmB,2BAA2B,MAAM,KAAK,MAAM,IAAI,KAAK,QAAQ;AAEtF,YAAM,OAAO,SAAS,cAAc,KAAK;AACzC,WAAK,YAAY;AAEjB,YAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,aAAO,YAAY;AACnB,aAAO,aAAa,eAAe,MAAM;AACzC,aAAO,cAAc,kBAAkB,UAAU;AAEjD,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,YAAY,YAAY,IAAI;AAEhC,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,YAAY,YAAY,IAAI;AACjC,WAAK,cAAc;AAEnB,UAAI,YAAY,IAAI;AACpB,WAAK,OAAO,QAAQ,GAAG;AACvB,YAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,iBAAW,YAAY;AACvB,iBAAW,SAAS;AAEpB,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI,cAAc;AAClB,UAAI;AAEJ,YAAM,aAAa,MAAM;AACvB,mBAAW,SAAS;AACpB,aAAK,SAAS;AACd,gBAAQ,UAAU,OAAO,WAAW;AACpC,qBAAa,cAAc;AAC3B,qBAAa,aAAa,gBAAgB,OAAO;AAAA,MACnD;AAEA,YAAM,aAAa,YAAY;AAC7B,YAAI,KAAK,SAAS,kBAAkB;AAClC,iBAAO,cAAc;AACrB;AAAA,QACF;AACA,YAAI,aAAa;AACf,eAAK,SAAS;AACd,qBAAW,SAAS;AACpB,kBAAQ,UAAU,IAAI,WAAW;AACjC,uBAAa,cAAc;AAC3B,uBAAa,aAAa,gBAAgB,MAAM;AAChD,wBAAc,SAAS;AACvB;AAAA,QACF;AACA,YAAI,CAAC,eAAe;AAClB,2BAAiB,YAAY;AAC3B,yBAAa,WAAW;AACxB,mBAAO,cAAc;AACrB,gBAAI;AACF,oBAAM,SAAS,MAAM,WAAW;AAChC,kBAAI,CAAC,OAAO,QAAQ,QAAQ;AAC1B,sBAAM,IAAI,MAAM,mCAAmC;AAAA,cACrD;AACA,oBAAM,iBAAiB,iBAAiB,KAAK,IAAI;AACjD,qBAAO,OAAO,WAAW,SAAS,YAAY,IAAI;AAClD,4BAAc,OAAO,OAAO,cAAc,MAAM,cAAc;AAC9D,6BAAe,OAAO,OAAO,OAAO,YAAY;AAAA,gBAC9C,GAAI,cAAc,EAAE,OAAO,YAAY,IAAI,EAAE,OAAO,MAAM,UAAU,eAAe;AAAA,gBACnF,iBAAiB;AAAA,gBACjB,YAAY;AAAA,gBACZ,UAAU;AAAA,gBACV,aAAa;AAAA,gBACb,SAAS,EAAE,SAAS,KAAK,UAAU,IAAO;AAAA,gBAC1C,UAAU;AAAA,gBACV,qBAAqB;AAAA,gBACrB,sBAAsB;AAAA,gBACtB,UAAU,QAAQ,UAAU,SAAS,YAAY,IAAI,OAAO;AAAA,cAC9D,CAAC;AACD,4BAAc;AACd,qBAAO,cAAc;AACrB,mBAAK,SAAS;AACd,yBAAW,SAAS;AACpB,sBAAQ,UAAU,IAAI,WAAW;AACjC,2BAAa,cAAc;AAC3B,2BAAa,aAAa,gBAAgB,MAAM;AAChD,2BAAa,SAAS;AAAA,YACxB,SAAS,OAAO;AACd,sBAAQ,KAAK,sEAAsE,KAAK;AACxF,+BAAiB,sBAAsB,MAAM,QAAQ,UAAU,SAAS,YAAY,CAAC;AACrF,yBAAW,gBAAgB,cAAc;AACzC,4BAAc;AACd,qBAAO,cAAc;AACrB,mBAAK,SAAS;AACd,yBAAW,SAAS;AACpB,sBAAQ,UAAU,IAAI,WAAW;AACjC,2BAAa,cAAc;AAC3B,2BAAa,aAAa,gBAAgB,MAAM;AAAA,YAClD,UAAE;AACA,2BAAa,WAAW;AAAA,YAC1B;AAAA,UACF,GAAG;AAAA,QACL;AACA,cAAM;AAAA,MACR;AAEA,mBAAa,iBAAiB,SAAS,MAAM;AAC3C,YAAI,WAAW,QAAQ;AACrB,eAAK,WAAW;AAAA,QAClB,OAAO;AACL,qBAAW;AACX,iBAAO,cAAc;AAAA,QACvB;AAAA,MACF,CAAC;AAED,cAAQ,OAAO,MAAM;AACrB,UAAI,kBAAkB;AACpB,gBAAQ,OAAO,gBAAgB;AAAA,MACjC;AACA,UAAI,WAAW;AACb,cAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,eAAO,YAAY;AACnB,eAAO,cAAc,gEAAc,YAAY,SAAS,MAAM,CAAC;AAC/D,gBAAQ,OAAO,MAAM;AAAA,MACvB;AACA,UAAI,CAAC,iBAAiB;AACpB,cAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,eAAO,YAAY;AACnB,eAAO,cAAc;AACrB,gBAAQ,OAAO,MAAM;AAAA,MACvB;AACA,cAAQ,YAAY,IAAI;AACxB,cAAQ,YAAY,UAAU;AAC9B,UAAI,SAAS,YAAY,OAAO;AAEhC,UAAI,iBAAiB;AACnB,YAAI;AACF,gBAAM,iBAAiB,IAAI;AAAA,QAC7B,SAAS,KAAK;AACZ,kBAAQ,MAAM,qCAAqC,GAAG;AAAA,QACxD;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AACP,wBAAc,SAAS;AAAA,QACzB;AAAA,QACA,UAAU;AACR,wBAAc,UAAU;AACxB,uBAAa,UAAU;AACvB,kBAAQ,OAAO;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,UAAkB,WAAmB,UAA0B;AACtF,QAAM,qBAAqBE,mBAAkB,QAAQ;AACrD,SACE,QAAQ,SAAS,KACjB,gBAAgB,kBAAkB,KAClC,gBAAgB,mBAAmB,MAAM,GAAG,EAAE,CAAC,CAAC,KAChD,YAAY,SAAS,YAAY,CAAC,KAClC;AAEJ;AAEA,SAASA,mBAAkB,MAAsB;AAC/C,QAAM,WAAW,KAAK,MAAM,OAAO,EAAE,IAAI,KAAK;AAC9C,SAAO,SAAS,YAAY;AAC9B;AAEA,eAAe,aAAoC;AACjD,QAAM,iBAAkB,WAAuC,iBAAiB;AAChF,MAAI,OAAO,mBAAmB,YAAY;AACxC,WAAQ,MAAO,eAA8D;AAAA,EAC/E;AACA,QAAM,WAAW,IAAI,SAAS,aAAa,0BAA0B;AACrE,SAAO,SAAS,eAAe;AACjC;AAEA,SAAS,iBAAiB,KAAa,eAA+B;AACpE,MAAI,QAAQ,OAAO;AACjB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,OAAO;AACjB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,OAAO;AACjB,WAAO;AAAA,EACT;AACA,MAAI,kBAAkB,UAAU;AAC9B,WAAO,QAAQ,QAAQ,QAAQ;AAAA,EACjC;AACA,MAAI,kBAAkB,QAAQ;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,kBAAkB,QAAQ;AAC5B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,MAAc,SAAuC;AAClF,QAAM,WAAW,SAAS,cAAc,UAAU;AAClD,WAAS,YAAY;AACrB,WAAS,WAAW;AACpB,WAAS,aAAa;AACtB,WAAS,OAAO,UAAU,SAAS;AACnC,WAAS,QAAQ;AACjB,WAAS,aAAa,cAAc,qBAAqB;AACzD,SAAO;AACT;AAEA,SAAS,mBAAmB,UAAkB,KAA2B;AACvE,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AAErB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AAEpB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc;AAEnB,WAAS,OAAO,OAAO,IAAI;AAC3B,MAAI,KAAK;AACP,UAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,aAAS,OAAO;AAChB,aAAS,WAAW;AACpB,aAAS,cAAc;AACvB,aAAS,OAAO,QAAQ;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,WAA8B;AACzD,aAAW,QAAQ,UAAU,iBAAoC,SAAS,GAAG;AAC3E,UAAM,OAAO,KAAK,aAAa,MAAM,KAAK;AAC1C,QAAI,CAAC,mBAAmB,IAAI,GAAG;AAC7B,WAAK,gBAAgB,MAAM;AAC3B,WAAK,gBAAgB,QAAQ;AAC7B,WAAK,gBAAgB,KAAK;AAC1B;AAAA,IACF;AACA,QAAI,mBAAmB,KAAK,IAAI,GAAG;AACjC,WAAK,SAAS;AACd,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAAuB;AACjD,QAAM,UAAU,KAAK,KAAK;AAC1B,SACE,QAAQ,WAAW,GAAG,KACtB,QAAQ,WAAW,GAAG,KACtB,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,KAAK,KACxB,2BAA2B,KAAK,OAAO;AAE3C;AAEA,SAAS,WAAW,MAAsB;AACxC,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,SAAO,KAAK,MAAM,YAAY,EAAE;AAClC;AAEA,SAAS,2BAA2B,MAAc,WAAmB,UAAkB,UAAsC;AAC3H,MAAI,KAAK,SAAS,kBAAkB;AAClC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,uBAAuB,MAAM,WAAW,UAAU,QAAQ;AACxE,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,SAAS,cAAc,MAAM;AACzC,UAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,cAAc,KAAK;AACzB,UAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,UAAM,cAAc,KAAK;AACzB,QAAI,OAAO,OAAO,KAAK;AACvB,YAAQ,OAAO,GAAG;AAAA,EACpB;AACA,SAAO;AACT;AAEA,SAAS,uBACP,MACA,WACA,UACA,UACyC;AACzC,MAAI,cAAc,WAAW,aAAa,4BAA4B;AACpE,WAAO,kBAAkB,IAAI;AAAA,EAC/B;AACA,MAAI,cAAc,YAAY,cAAc,WAAW,aAAa,wBAAwB;AAC1F,WAAO,gBAAgB,IAAI;AAAA,EAC7B;AACA,MAAI,aAAa,UAAU,aAAa,SAAS;AAC/C,WAAO,cAAc,IAAI;AAAA,EAC3B;AACA,SAAO,CAAC;AACV;AAEA,SAAS,cAAc,MAAuD;AAC5E,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,aAAO;AAAA,QACL,EAAE,OAAO,gBAAM,OAAO,QAAQ;AAAA,QAC9B,EAAE,OAAO,gBAAM,OAAO,OAAO,KAAK,MAAM,EAAE;AAAA,MAC5C;AAAA,IACF;AACA,QAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,YAAM,OAAO,OAAO,KAAK,IAA+B;AACxD,aAAO;AAAA,QACL,EAAE,OAAO,gBAAM,OAAO,SAAS;AAAA,QAC/B,EAAE,OAAO,UAAK,OAAO,OAAO,KAAK,MAAM,EAAE;AAAA,QACzC,EAAE,OAAO,gBAAM,OAAO,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,KAAK,eAAK;AAAA,MAC5D;AAAA,IACF;AACA,WAAO,CAAC,EAAE,OAAO,gBAAM,OAAO,OAAO,KAAK,CAAC;AAAA,EAC7C,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,kBAAkB,MAAuD;AAChF,MAAI;AACF,UAAM,WAAW,KAAK,MAAM,IAAI;AAIhC,QAAI,CAAC,MAAM,QAAQ,SAAS,KAAK,GAAG;AAClC,aAAO,cAAc,IAAI;AAAA,IAC3B;AACA,UAAM,SAAS,oBAAI,IAAoB;AACvC,eAAW,QAAQ,SAAS,OAAO;AACjC,YAAM,OAAO,KAAK,aAAa;AAC/B,aAAO,IAAI,OAAO,OAAO,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,IAC9C;AACA,UAAM,SAAS,SAAS,UAAU,YAAY,gBAAgB,SAAS,UAAU,YAAY,QAAQ,SAAS,UAAU,eAAe;AACvI,WAAO;AAAA,MACL,EAAE,OAAO,YAAY,OAAO,GAAG,SAAS,MAAM,MAAM,SAAS;AAAA,MAC7D,EAAE,OAAO,gBAAM,OAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,KAAK,IAAI,KAAK,eAAK;AAAA,MAC1G,GAAI,SAAS,CAAC,EAAE,OAAO,UAAU,OAAO,OAAO,CAAC,IAAI,CAAC;AAAA,IACvD;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,gBAAgB,MAAuD;AAC9E,QAAM,QAAQ,KAAK,MAAM,YAAY,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;AACnE,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,SAAS;AACb,aAAW,QAAQ,MAAM,MAAM,GAAG,GAAI,GAAG;AACvC,QAAI;AACF,YAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B;AACA,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB;AAAA,MACF,WAAW,SAAS,OAAO,UAAU,UAAU;AAC7C;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AAAA,IACL,EAAE,OAAO,UAAU,OAAO,GAAG,MAAM,MAAM,SAAS;AAAA,IAClD,EAAE,OAAO,sBAAO,OAAO,OAAO,MAAM,EAAE;AAAA,IACtC,EAAE,OAAO,gBAAM,OAAO,UAAU,OAAO,WAAW,MAAM,GAAG;AAAA,EAC7D;AACF;AAEA,SAAS,kBAAkB,OAAuB;AAChD,SAAO,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,UAAU,OAAO,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI;AAC9F;AAEA,SAAS,YAAY,OAAuB;AAC1C,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AACxC,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,MAAM;AAChB,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,QAAM,QAAQ,CAAC,MAAM,MAAM,IAAI;AAC/B,MAAI,QAAQ,QAAQ;AACpB,MAAI,YAAY;AAChB,SAAO,SAAS,QAAQ,YAAY,MAAM,SAAS,GAAG;AACpD,aAAS;AACT,iBAAa;AAAA,EACf;AACA,SAAO,GAAG,MAAM,QAAQ,SAAS,KAAK,IAAI,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC;AAClE;AAEA,eAAe,gBAAgB,MAA6B;AAC1D,MAAI,UAAU,WAAW,WAAW;AAClC,UAAM,UAAU,UAAU,UAAU,IAAI;AACxC;AAAA,EACF;AAEA,QAAM,WAAW,SAAS,cAAc,UAAU;AAClD,WAAS,QAAQ;AACjB,WAAS,aAAa,YAAY,EAAE;AACpC,WAAS,MAAM,WAAW;AAC1B,WAAS,MAAM,OAAO;AACtB,WAAS,KAAK,OAAO,QAAQ;AAC7B,WAAS,OAAO;AAChB,QAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,WAAS,OAAO;AAChB,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AACF;AAEA,SAAS,aAAa,UAAkB,MAAoB;AAC1D,QAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAClE,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,OAAO;AACZ,OAAK,WAAW;AAChB,WAAS,KAAK,OAAO,IAAI;AACzB,OAAK,MAAM;AACX,OAAK,OAAO;AACZ,MAAI,gBAAgB,GAAG;AACzB;AAEA,eAAe,SAAS,QAAkC;AACxD,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,WAAW,MAAM,MAAM,MAAM;AACnC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,8BAA8B,SAAS,MAAM,EAAE;AAAA,IACjE;AACA,WAAO,SAAS,KAAK;AAAA,EACvB;AACA,MAAI,kBAAkB,MAAM;AAC1B,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,MAAI,kBAAkB,aAAa;AACjC,WAAO,IAAI,YAAY,EAAE,OAAO,MAAM;AAAA,EACxC;AACA,SAAO,OAAO,MAAM;AACtB;;;ACj5BA,SAAS,iBAAiB,IAAc,IAAwB;AAC9D,SAAO;AAAA,IACL,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,IAC5B,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,IAC5B,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,IAC5B,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,IAC5B,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,IACpC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,EACtC;AACF;AAEO,SAAS,UAAU,UAA0C,CAAC,GAAkB;AACrF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,KAAK,aAAa,qBAAqB,KAAK,cAAc;AAAA,IACnE;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,oBAAoB,oBAAoB,OAAO;AACrD,YAAM,MAAM,kBAAkB,SAAU,MAAM,OAAO,YAAY;AACjE,yBAAmB,KAAK,kBAAkB,SAAS;AACnD,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AAEvC,YAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,aAAO,YAAY;AACnB,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AACpB,YAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,eAAS,YAAY;AACrB,aAAO,OAAO,SAAS,QAAQ;AAC/B,UAAI,SAAS,OAAO,MAAM;AAE1B,YAAM,eAAe,IAAI,YAAY,GAAG;AACxC,YAAM,MAAM,MAAM,aAAa,QAAQ,MAAM,CAAC,UAAmB;AAC/D,eAAO,OAAO;AACd,YAAI,SAAS,UAAU,IAAI,YAAY;AACvC,cAAM,WAAW,kBAAkB,IAAI,KAAK,MAAM,KAAK,kBAAkB,KAAK,CAAC;AAC/E,YAAI,SAAS,OAAO,QAAQ;AAC5B,eAAO;AAAA,MACT,CAAC;AACD,UAAI,CAAC,KAAK;AACR,eAAO;AAAA,UACL,UAAU;AACR,gBAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,yBAAa,UAAU;AACvB,4BAAgB,KAAK,UAAU;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAGA,YAAM,YAAsD,CAAC;AAC7D,eAAS,aAAa,GAAG,cAAc,IAAI,UAAU,cAAc,GAAG;AACpE,YAAI;AACF,gBAAM,OAAO,MAAM,IAAI,QAAQ,UAAU;AACzC,gBAAM,eAAe,KAAK,YAAY,EAAE,OAAO,EAAE,CAAC;AAClD,oBAAU,KAAK;AAAA,YACb,OAAO,aAAa;AAAA,YACpB,QAAQ,aAAa;AAAA,UACvB,CAAC;AAAA,QACH,QAAQ;AACN,oBAAU,KAAK,EAAE,OAAO,KAAK,QAAQ,IAAI,CAAC;AAAA,QAC5C;AAAA,MACF;AAEA,YAAM,aAKD,CAAC;AAEN,UAAI,WAAwC;AAC5C,UAAI,cAAc,IAAI;AACtB,UAAI,aAAa;AAEjB,YAAM,gBAAgB,MAAM;AAC1B,yBAAiB,SAAS,IAAI,UAAU,WAAW,IAAI,QAAQ,KAAK,UAAU;AAAA,MAChF;AAGA,YAAM,YAAY,CAAC,YAAoB;AACrC,cAAM,QAAQ,WAAW,OAAO;AAChC,YAAI,CAAC,SAAS,CAAC,MAAM,SAAU;AAE/B,YAAI,MAAM,YAAY;AACpB,cAAI;AACF,kBAAM,WAAW,OAAO;AAAA,UAC1B,SAAS,GAAG;AAAA,UAEZ;AACA,gBAAM,aAAa;AAAA,QACrB;AAEA,cAAM,SAAS;AACf,cAAM,WAAW;AACjB,cAAM,QAAQ,gBAAgB;AAC9B,cAAM,QAAQ,OAAO,iBAAiB,oBAAoB,gBAAM,UAAU,CAAC,wBAAS,CAAC;AAAA,MACvF;AAGA,YAAM,aAAa,OAAO,SAAiB,SAAsB;AAC/D,cAAM,QAAQ,WAAW,OAAO;AAChC,YAAI,CAAC,SAAS,MAAM,SAAU;AAE9B,cAAM,WAAW;AAEjB,YAAI;AACF,gBAAM,OAAO,MAAM,IAAI,QAAQ,UAAU,CAAC;AAC1C,gBAAM,OAAO,UAAU,OAAO;AAC9B,gBAAM,QACJ,IAAI,QAAQ,QAAQ,WAChB,aACA,KAAK,IAAI,KAAK,KAAK,IAAI,IAAK,KAAK,QAAQ,MAAM,KAAK,QAAS,UAAU,CAAC;AAE9E,gBAAM,WAAW,KAAK,YAAY,EAAE,MAAM,CAAC;AAE3C,gBAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,iBAAO,YAAY;AACnB,iBAAO,QAAQ,KAAK,MAAM,SAAS,KAAK;AACxC,iBAAO,SAAS,KAAK,MAAM,SAAS,MAAM;AAE1C,gBAAM,UAAU,OAAO,WAAW,IAAI;AACtC,cAAI,CAAC,SAAS;AACZ,kBAAM,IAAI,MAAM,qCAAqC;AAAA,UACvD;AAEA,gBAAM,QAAQ,gBAAgB,MAAM;AACpC,gBAAM,SAAS;AAEf,gBAAM,aAAa,KAAK,OAAO;AAAA,YAC7B,eAAe;AAAA,YACf;AAAA,UACF,CAAC;AACD,gBAAM,aAAa;AAEnB,gBAAM,WAAW;AACjB,gBAAM,aAAa;AAGnB,gBAAM,cAAc,MAAM,KAAK,eAAe;AAC9C,gBAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,oBAAU,YAAY;AACtB,oBAAU,MAAM,QAAQ,GAAG,KAAK,MAAM,SAAS,KAAK,CAAC;AACrD,oBAAU,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,MAAM,CAAC;AACvD,gBAAM,QAAQ,YAAY,SAAS;AAEnC,qBAAW,QAAQ,YAAY,OAAO;AACpC,gBAAI,EAAE,SAAS,MAAO;AACtB,kBAAM,MAAO,KAAa;AAC1B,gBAAI,CAAC,IAAI,KAAK,EAAG;AAEjB,kBAAM,KAAK,iBAAiB,SAAS,WAAY,KAAa,SAAS;AACvE,kBAAM,aAAa,KAAK,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;AAE1D,kBAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,iBAAK,cAAc;AACnB,iBAAK,MAAM,WAAW,GAAG,UAAU;AACnC,iBAAK,MAAM,aAAc,KAAa,YAAY;AAClD,iBAAK,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC;AAC1B,iBAAK,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,UAAU;AACtC,iBAAK,MAAM,kBAAkB;AAE7B,sBAAU,YAAY,IAAI;AAG1B,gBAAK,KAAa,OAAO;AACvB,oBAAM,YAAa,KAAa,QAAQ;AACxC,oBAAM,cAAc,KAAK,eAAe,KAAK,sBAAsB,EAAE;AACrE,kBAAI,cAAc,KAAK,KAAK,IAAI,cAAc,SAAS,IAAI,GAAG;AAC5D,qBAAK,MAAM,YAAY,UAAU,YAAY,WAAW;AAAA,cAC1D;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,KAAK;AACZ,kBAAQ,MAAM,6BAA6B,UAAU,CAAC,KAAK,GAAG;AAC9D,gBAAM,WAAW;AACjB,gBAAM,QAAQ,gBAAgB,iBAAiB,iBAAiB,4CAAS,CAAC;AAAA,QAC5E;AAAA,MACF;AAEA,YAAM,eAAe,CAAC,SAAsB;AAC1C,kBAAU,WAAW;AACrB,sBAAc;AACd,iBAAS,gBAAgB;AACzB,mBAAW,SAAS;AAEpB,YAAI,OAAO,yBAAyB,aAAa;AAC/C,qBAAW,IAAI;AAAA,YACb,CAAC,YAAY;AACX,sBAAQ,QAAQ,CAAC,UAAU;AACzB,sBAAM,UAAU,SAAS,MAAM,OAAO,aAAa,iBAAiB,KAAK,KAAK,EAAE;AAChF,sBAAM,QAAQ,WAAW,OAAO;AAChC,oBAAI,CAAC,MAAO;AAEZ,oBAAI,MAAM,gBAAgB;AACxB,sBAAI,CAAC,MAAM,UAAU;AACnB,yBAAK,WAAW,SAAS,IAAI;AAAA,kBAC/B;AAAA,gBACF,OAAO;AACL,sBAAI,MAAM,YAAY,IAAI,WAAW,GAAG;AACtC,8BAAU,OAAO;AAAA,kBACnB;AAAA,gBACF;AAAA,cACF,CAAC;AAAA,YACH;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,YAAY;AAAA,YACd;AAAA,UACF;AAAA,QACF;AAEA,iBAAS,IAAI,GAAG,IAAI,IAAI,UAAU,KAAK;AACrC,gBAAM,OAAO,UAAU,CAAC;AACxB,gBAAM,QACJ,IAAI,QAAQ,QAAQ,WAChB,aACA,KAAK,IAAI,KAAK,KAAK,IAAI,IAAK,KAAK,QAAQ,MAAM,KAAK,QAAS,UAAU,CAAC;AAE9E,gBAAM,IAAI,KAAK,MAAM,KAAK,QAAQ,KAAK;AACvC,gBAAM,IAAI,KAAK,MAAM,KAAK,SAAS,KAAK;AAExC,gBAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,kBAAQ,YAAY;AACpB,kBAAQ,aAAa,mBAAmB,OAAO,CAAC,CAAC;AACjD,kBAAQ,MAAM,QAAQ,GAAG,CAAC;AAC1B,kBAAQ,MAAM,SAAS,GAAG,CAAC;AAC3B,kBAAQ,OAAO,iBAAiB,oBAAoB,gBAAM,IAAI,CAAC,wBAAS,CAAC;AAEzE,mBAAS,YAAY,OAAO;AAE5B,qBAAW,KAAK;AAAA,YACd;AAAA,YACA,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,UAAU;AAAA,UACZ,CAAC;AAED,cAAI,UAAU;AACZ,qBAAS,QAAQ,OAAO;AAAA,UAC1B,OAAO;AACL,iBAAK,WAAW,GAAG,IAAI;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAEA,mBAAa,IAAI,IAAI;AAErB,UAAI;AACJ,aAAO;AAAA,QACL,WAAW,SAAS;AAClB,iBAAO,YAAY,aAAa,YAAY,cAAc,YAAY;AAAA,QACxE;AAAA,QACA,QAAQ,SAAS;AACf,cAAI,YAAY,WAAW;AACzB,yBAAa,KAAK,IAAI,GAAG,aAAa,IAAI;AAC1C,yBAAa,WAAW;AACxB,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,YAAY;AAC1B,yBAAa,KAAK,IAAI,MAAM,aAAa,IAAI;AAC7C,yBAAa,WAAW;AACxB,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,cAAc;AAC5B,yBAAa;AACb,yBAAa,WAAW;AACxB,mBAAO;AAAA,UACT;AACA,iBAAO;AAAA,QACT;AAAA,QACA,OAAO,MAAM;AACX,wBAAc;AACd,iBAAO,aAAa,WAAW;AAC/B,wBAAc,OAAO,WAAW,MAAM;AACpC,yBAAa,IAAI;AAAA,UACnB,GAAG,GAAG;AAAA,QACR;AAAA,QACA,UAAU;AACR,iBAAO,aAAa,WAAW;AAC/B,oBAAU,WAAW;AAErB,qBAAW,QAAQ,CAAC,UAAU;AAC5B,gBAAI,MAAM,YAAY;AACpB,kBAAI;AACF,sBAAM,WAAW,OAAO;AAAA,cAC1B,SAAS,GAAG;AAAA,cAEZ;AAAA,YACF;AAAA,UACF,CAAC;AACD,qBAAW,SAAS;AAEpB,0BAAgB,KAAK,UAAU;AAC/B,eAAK,IAAI,QAAQ;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBACP,SACA,OACA,WACA,KACA,YACM;AACN,UAAQ,gBAAgB;AACxB,mBAAiB,SAAS,gBAAM,OAAO,KAAK,CAAC;AAC7C,QAAM,YAAY,mBAAmB,SAAS;AAC9C,MAAI,WAAW;AACb,qBAAiB,SAAS,4BAAQ,SAAS;AAAA,EAC7C;AACA,mBAAiB,SAAS,gBAAM,QAAQ,WAAW,6BAAS,0BAAM;AAClE,mBAAiB,SAAS,gBAAM,GAAG,KAAK,MAAM,aAAa,GAAG,CAAC,GAAG;AACpE;AAEA,SAAS,iBAAiB,QAAqB,OAAe,OAAqB;AACjF,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,OAAK,OAAO,KAAK,OAAO;AACxB,SAAO,OAAO,IAAI;AACpB;AAEA,SAAS,mBAAmB,WAA6D;AACvF,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,WAAW;AAC5B,UAAM,MAAM,GAAG,KAAK,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,MAAM,KAAK,MAAM,CAAC;AAClE,WAAO,IAAI,MAAM,OAAO,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,EAC5C;AACA,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,MAAM,KAAK,MAAO,QAAQ,IAAI,GAAG,IAAI,KAAK,KAAK,MAAM,IAAK,EAChE,KAAK,IAAI;AACd;AAEA,SAAS,oBAAoB,SAA2D;AACtF,MAAI,iBAAiB,SAAS;AAC5B,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,WAAmB,MAA8B;AACzE,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,SAAO,YAAY;AACnB,SAAO,cAAc;AACrB,SAAO;AACT;AAEA,SAAS,kBAAkB,UAAkB,KAAa,SAA8B;AACtF,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AAErB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AAEpB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc,GAAG,OAAO,IAAI,QAAQ;AAEzC,QAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,WAAS,OAAO;AAChB,WAAS,WAAW;AACpB,WAAS,cAAc;AAEvB,WAAS,OAAO,OAAO,MAAM,QAAQ;AACrC,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAwB;AACjD,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,EAAE;AAC3E,QAAM,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,QAAQ,OAAQ,MAA6B,IAAI,IAAI;AAC3H,QAAM,QAAQ,GAAG,IAAI,IAAI,OAAO,GAAG,YAAY;AAC/C,MAAI,MAAM,SAAS,UAAU,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,SAAS,GAAG;AACvF,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,KAAkB,WAA0B;AACtE,MAAI,WAAW;AACb,QAAI,oBAAoB,YAAY;AACpC;AAAA,EACF;AAEA,MAAI,CAAC,IAAI,oBAAoB,aAAa,OAAO,WAAW,aAAa;AACvE,QAAI,oBAAoB,YAAY,2CAA2C,IAAI,OAAO;AAAA,EAC5F;AACF;;;ACzZA,mBAAkB;AAClB,uBAAsB;;;ACCtB,eAAsB,gBAAgB,MAAyC;AAC7E,MAAI,KAAK,kBAAkB,aAAa;AACtC,WAAO,KAAK;AAAA,EACd;AACA,MAAI,KAAK,MAAM;AACb,WAAO,KAAK,KAAK,YAAY;AAAA,EAC/B;AACA,MAAI,OAAO,KAAK,WAAW,UAAU;AACnC,UAAM,WAAW,MAAM,MAAM,KAAK,MAAM;AACxC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,yBAAyB,SAAS,MAAM,EAAE;AAAA,IAC5D;AACA,WAAO,SAAS,YAAY;AAAA,EAC9B;AACA,QAAM,IAAI,MAAM,0BAA0B;AAC5C;AAEA,eAAsB,aAAa,MAAoC;AACrE,MAAI,OAAO,KAAK,WAAW,UAAU;AACnC,UAAM,WAAW,MAAM,MAAM,KAAK,MAAM;AACxC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,8BAA8B,SAAS,MAAM,EAAE;AAAA,IACjE;AACA,WAAO,SAAS,KAAK;AAAA,EACvB;AACA,MAAI,KAAK,MAAM;AACb,WAAO,KAAK,KAAK,KAAK;AAAA,EACxB;AACA,MAAI,KAAK,kBAAkB,aAAa;AACtC,WAAO,IAAI,YAAY,EAAE,OAAO,KAAK,MAAM;AAAA,EAC7C;AACA,SAAO,OAAO,KAAK,MAAM;AAC3B;AAEO,SAAS,YAAY,YAAY,IAAiB;AACvD,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY,aAAa,SAAS,GAAG,KAAK;AAChD,SAAO;AACT;AAEO,SAAS,cAAc,OAA4B;AACxD,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AACtB,SAAO;AACT;AAEO,SAAS,WAAW,QAAqB,OAAe,OAA8B;AAC3F,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc,OAAO,KAAK;AAClC,MAAI,OAAO,KAAK,OAAO;AACvB,SAAO,OAAO,GAAG;AACnB;AAeO,SAAS,cACd,MACA,SACQ;AACR,SAAO,KAAK,aAAa,QAAQ,KAAK,QAAQ,KAAK;AACrD;;;AD3EA,IAAM,gBAAgB,oBAAI,IAAI,CAAC,wBAAwB,wBAAwB,CAAC;AAkCzE,SAAS,aAA4B;AAC1C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,KAAK,cAAc,UAAU,cAAc,IAAI,KAAK,QAAQ;AAAA,IACrE;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,UAAU;AACpC,UAAI,SAAS,OAAO,KAAK;AAEzB,UAAI;AACF,cAAM,MAAM,MAAM,aAAAC,QAAM,UAAU,MAAM,gBAAgB,IAAI,IAAI,CAAC;AACjE,cAAM,WAAW,OAAO,GAAG;AAAA,MAC7B,SAAS,OAAO;AACd,2BAAmB,OAAO,KAAK;AAAA,MACjC;AAEA,aAAO;AAAA,QACL,UAAU;AACR,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,WAAW,OAAoB,KAA2B;AACvE,QAAM,UAAU,MAAM,mBAAmB,GAAG;AAC5C,QAAM,UAAU,MAAM,IAAI,KAAK,OAAO,GAAG,MAAM,MAAM;AACrD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,kDAAyB;AAAA,EAC3C;AAEA,QAAM,MAAM,SAAS,SAAS,yDAAsB;AACpD,QAAM,WAAW,cAAc,OAAO;AACtC,QAAM,WAAW,aAAa,GAAG;AACjC,QAAM,QAAQ,UAAU,KAAK,QAAQ;AACrC,QAAM,WAAW,aAAa,GAAG;AACjC,QAAM,YAAY,uBAAuB,KAAK,UAAU,KAAK;AAC7D,QAAM,SAAS,MAAM,eAAe,KAAK,UAAU,QAAQ;AAE3D,QAAM,UAAU,cAAc,+BAAW;AACzC,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,EAAAC,YAAW,MAAM,gBAAM,SAAS,SAAS,yBAAU;AACnD,EAAAA,YAAW,MAAM,gBAAM,SAAS,WAAW,cAAI;AAC/C,EAAAA,YAAW,MAAM,gBAAM,SAAS,YAAY,oBAAK;AACjD,MAAI,SAAS,WAAW;AACtB,IAAAA,YAAW,MAAM,sBAAO,SAAS,SAAS;AAAA,EAC5C;AACA,MAAI,SAAS,YAAY;AACvB,IAAAA,YAAW,MAAM,gBAAM,SAAS,UAAU;AAAA,EAC5C;AACA,MAAI,SAAS,UAAU;AACrB,IAAAA,YAAW,MAAM,4BAAQ,SAAS,QAAQ;AAAA,EAC5C;AACA,EAAAA,YAAW,MAAM,gBAAM,MAAM,UAAU,kDAAU;AACjD,EAAAA,YAAW,MAAM,YAAY,UAAU,aAAa;AACpD,EAAAA,YAAW,MAAM,SAAS,UAAU,UAAU;AAC9C,EAAAA,YAAW,MAAM,gBAAM,UAAU,WAAW,UAAU,QAAQ;AAC9D,EAAAA,YAAW,MAAM,gBAAM,UAAU,UAAU;AAC3C,EAAAA,YAAW,MAAM,gBAAM,UAAU,MAAM;AACvC,EAAAA,YAAW,MAAM,gBAAM,UAAU,MAAM;AACvC,EAAAA,YAAW,MAAM,gBAAM,UAAU,KAAK;AACtC,MAAI,UAAU,SAAS,UAAU,OAAO;AACtC,IAAAA,YAAW,MAAM,sBAAO,GAAG,UAAU,KAAK,MAAM,UAAU,KAAK,EAAE;AAAA,EACnE;AACA,MAAI,UAAU,YAAY;AACxB,IAAAA,YAAW,MAAM,4BAAQ,UAAU,UAAU;AAAA,EAC/C;AACA,MAAI,UAAU,mBAAmB;AAC/B,IAAAA,YAAW,MAAM,wCAAU,UAAU,iBAAiB;AAAA,EACxD;AACA,UAAQ,OAAO,IAAI;AACnB,QAAM,OAAO,OAAO;AAEpB,QAAM,WAAW,cAAc,+BAAW;AAC1C,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AAEpB,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,cAAc;AACpB,YAAQ,OAAO,KAAK;AAAA,EACtB,OAAO;AACL,eAAW,CAAC,OAAO,IAAI,KAAK,MAAM,MAAM,GAAG,EAAE,EAAE,QAAQ,GAAG;AACxD,YAAM,cAAc,YAAY,UAAU,KAAK,IAAI;AACnD,YAAM,cAAc,MAAM,IAAI,KAAK,WAAW,GAAG,MAAM,MAAM;AAC7D,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AACA,YAAM,UAAU,SAAS,cAAc,SAAS;AAChD,cAAQ,YAAY;AACpB,YAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,cAAQ,cAAc,aAAa,WAAW,KAAK,gBAAM,QAAQ,CAAC;AAClE,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AACpB,cAAQ,YAAY,oBAAoB,uBAAuB,aAAa,QAAQ,cAAc,WAAW,CAAC,CAAC;AAC/G,cAAQ,OAAO,SAAS,OAAO;AAC/B,cAAQ,OAAO,OAAO;AAAA,IACxB;AAAA,EACF;AAEA,WAAS,OAAO,OAAO;AACvB,QAAM,OAAO,QAAQ;AACvB;AAEA,eAAe,mBAAmB,KAA6B;AAC7D,QAAM,eAAe,MAAM,IAAI,KAAK,wBAAwB,GAAG,MAAM,MAAM;AAC3E,MAAI,cAAc;AAChB,UAAM,YAAY,SAAS,cAAc,mDAA0B;AACnE,UAAM,WAAW,MAAM,KAAK,UAAU,qBAAqB,GAAG,CAAC,EAAE;AAAA,MAC/D,CAAC,YAAY,QAAQ,cAAc,cAAc,gBAAgB,SAAS,WAAW;AAAA,IACvF;AACA,UAAM,WAAW,WAAW,gBAAgB,UAAU,WAAW,IAAI;AACrE,QAAI,YAAY,IAAI,KAAK,QAAQ,GAAG;AAClC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,WAAW,OAAO,OAAO,IAAI,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,OAAO,MAAM,KAAK,SAAS,MAAM,CAAC;AACnG,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,wDAA0B;AAAA,EAC5C;AACA,SAAO,SAAS;AAClB;AAEA,SAAS,aAAa,KAA8C;AAClE,QAAM,WAAW,oBAAI,IAA8B;AACnD,aAAW,QAAQ,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,QAAQ,cAAc,MAAM,GAAG;AAC9G,UAAM,KAAK,gBAAgB,MAAM,IAAI;AACrC,UAAM,OAAO,gBAAgB,MAAM,MAAM;AACzC,QAAI,CAAC,MAAM,CAAC,MAAM;AAChB;AAAA,IACF;AACA,aAAS,IAAI,IAAI;AAAA,MACf;AAAA,MACA;AAAA,MACA,WAAW,gBAAgB,MAAM,YAAY,KAAK;AAAA,MAClD,YAAY,gBAAgB,MAAM,YAAY,KAAK;AAAA,IACrD,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,UAAU,KAAe,UAA6D;AAC7F,QAAM,QAA4B,CAAC;AACnC,aAAW,WAAW,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,QAAQ,cAAc,SAAS,GAAG;AACpH,UAAM,QAAQ,gBAAgB,SAAS,OAAO;AAC9C,UAAM,OAAO,QAAQ,SAAS,IAAI,KAAK,IAAI;AAC3C,QAAI,QAAQ,mBAAmB,KAAK,SAAS,GAAG;AAC9C,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AACA,SAAO,MAAM,KAAK,SAAS,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,mBAAmB,KAAK,SAAS,CAAC;AAC1F;AAEA,SAAS,aAAa,KAA6B;AACjD,SAAO;AAAA,IACL,OAAO,gBAAgB,KAAK,OAAO;AAAA,IACnC,SAAS,gBAAgB,KAAK,SAAS;AAAA,IACvC,UAAU,gBAAgB,KAAK,UAAU;AAAA,IACzC,YAAY,gBAAgB,KAAK,YAAY;AAAA,IAC7C,WAAW,gBAAgB,KAAK,WAAW;AAAA,IAC3C,UAAU,iBAAiB,KAAK,kBAAkB;AAAA,EACpD;AACF;AAEA,SAAS,uBAAuB,KAAe,UAAyC,OAAiD;AACvI,QAAM,QAAQ,MAAM,KAAK,SAAS,OAAO,CAAC;AAC1C,QAAM,WAAW,MAAM;AACvB,QAAM,SAAS,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,WAAW,QAAQ,CAAC,EAAE;AAC3E,QAAM,SAAS,MAAM,OAAO,CAAC,SAAS,KAAK,cAAc,UAAU,EAAE;AACrE,QAAM,QAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,WAAW,OAAO,KAAK,0BAA0B,KAAK,KAAK,SAAS,CAAC,EAAE;AAC3H,QAAM,QAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,WAAW,QAAQ,CAAC,EAAE;AAC1E,QAAM,QAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,WAAW,QAAQ,CAAC,EAAE;AAC1E,QAAM,WAAW,MAAM,OAAO,CAAC,SAAS,eAAe,KAAK,UAAU,EAAE,IAAI,KAAK,CAAC,EAAE;AACpF,QAAM,WAAW,MAAM,OAAO,CAAC,SAAS,KAAK,cAAc,8BAA8B,eAAe,KAAK,UAAU,EAAE,IAAI,KAAK,CAAC,EAAE;AACrI,QAAM,aAAa,MAAM,OAAO,CAAC,SAAS,KAAK,GAAG,YAAY,EAAE,SAAS,OAAO,KAAK,eAAe,KAAK,UAAU,EAAE,IAAI,aAAa,CAAC,EAAE;AACzI,QAAM,aAAa,MAAM,OAAO,CAAC,SAAS,CAAC,oBAAoB,IAAI,CAAC,EAAE;AACtE,SAAO;AAAA,IACL,eAAe,MAAM;AAAA,IACrB,YAAY,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,KAAK,IAAI,GAAG,kBAAkB,GAAG,IAAI,MAAM,MAAM;AAAA,EACtE;AACF;AAEA,SAAS,oBAAoB,MAAiC;AAC5D,QAAM,aAAa,eAAe,KAAK,UAAU;AACjD,SACE,mBAAmB,KAAK,SAAS,KACjC,KAAK,UAAU,WAAW,QAAQ,KAClC,KAAK,cAAc,cACnB,KAAK,UAAU,WAAW,OAAO,KACjC,0BAA0B,KAAK,KAAK,SAAS,KAC7C,KAAK,UAAU,WAAW,QAAQ,KAClC,KAAK,UAAU,WAAW,QAAQ,KAClC,KAAK,cAAc,8BACnB,WAAW,IAAI,KAAK,KACpB,WAAW,IAAI,KAAK;AAExB;AAEA,eAAe,eACb,KACA,UACA,UAC8B;AAC9B,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,SAAS,OAAO,GAAG;AACpC,QAAI,CAAC,KAAK,UAAU,WAAW,QAAQ,GAAG;AACxC;AAAA,IACF;AACA,UAAM,OAAO,YAAY,UAAU,KAAK,IAAI;AAC5C,UAAM,QAAQ,IAAI,KAAK,IAAI;AAC3B,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,WAAO,IAAI,MAAM,QAAQ,KAAK,SAAS,WAAW,MAAM,MAAM,MAAM,QAAQ,CAAC,EAAE;AAAA,EACjF;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAc,QAA6B,YAA4B;AACrG,QAAM,eAAe,IAAI,UAAU,EAAE,gBAAgB,MAAM,WAAW;AACtE,aAAW,SAAS,MAAM,KAAK,aAAa,iBAAmC,4CAA4C,CAAC,GAAG;AAC7H,UAAM,MAAM,MAAM,aAAa,KAAK,KAAK,MAAM,aAAa,MAAM,KAAK,MAAM,aAAa,YAAY,KAAK;AAC3G,UAAM,OAAO,YAAY,YAAY,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK,GAAG;AAC7D,UAAM,MAAM,OAAO,IAAI,IAAI;AAC3B,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AACA,UAAM,aAAa,OAAO,GAAG;AAC7B,UAAM,aAAa,QAAQ,GAAG;AAC9B,UAAM,aAAa,cAAc,GAAG;AAAA,EACtC;AACA,SAAO,aAAa,KAAK;AAC3B;AAEA,SAAS,oBAAoB,MAAsB;AACjD,SAAO,iBAAAC,QAAU,SAAS,MAAM;AAAA,IAC9B,cAAc,EAAE,MAAM,MAAM,KAAK,MAAM,YAAY,MAAM;AAAA,IACzD,UAAU,CAAC,UAAU,YAAY;AAAA,EACnC,CAAC;AACH;AAEA,SAAS,aAAa,MAAsB;AAC1C,QAAM,eAAe,IAAI,UAAU,EAAE,gBAAgB,MAAM,WAAW;AACtE,QAAM,UAAU,aAAa,cAAc,mBAAmB;AAC9D,SAAO,SAAS,aAAa,KAAK,KAAK;AACzC;AAEA,SAAS,mBAAmB,OAAoB,OAAsB;AACpE,QAAM,gBAAgB;AACtB,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AACrB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc,iBAAiB,QAAQ,MAAM,UAAU;AAC5D,WAAS,OAAO,OAAO,IAAI;AAC3B,QAAM,OAAO,QAAQ;AACvB;AAEA,SAAS,SAAS,KAAa,SAA2B;AACxD,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AACA,SAAO;AACT;AAEA,SAASD,YAAW,QAAqB,OAAe,OAA8B;AACpF,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc,OAAO,KAAK;AAClC,MAAI,OAAO,KAAK,OAAO;AACvB,SAAO,OAAO,GAAG;AACnB;AAEA,SAAS,gBAAgB,KAAe,WAA2B;AACjE,SACE,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EACrC,KAAK,CAAC,YAAY,QAAQ,cAAc,SAAS,GAChD,aAAa,KAAK,KAAK;AAE/B;AAEA,SAAS,iBAAiB,KAAe,UAA0B;AACjE,SACE,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EACrC,KAAK,CAAC,YAAY,QAAQ,cAAc,UAAU,gBAAgB,SAAS,UAAU,MAAM,QAAQ,GAClG,aAAa,KAAK,KAAK;AAE/B;AAEA,SAAS,eAAe,OAA4B;AAClD,SAAO,IAAI,IAAI,MAAM,MAAM,KAAK,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC;AAC9E;AAEA,SAAS,kBAAkB,KAAuB;AAChD,SAAO,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,QAAQ,cAAc,SAAS,EAAE;AACxG;AAEA,SAAS,gBAAgB,SAAkB,WAAkC;AAC3E,QAAM,SAAS,QAAQ,aAAa,SAAS;AAC7C,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AACA,aAAW,aAAa,MAAM,KAAK,QAAQ,UAAU,GAAG;AACtD,QAAI,UAAU,cAAc,WAAW;AACrC,aAAO,UAAU;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,WAA4B;AACtD,SAAO,cAAc,2BAA2B,cAAc,eAAe,cAAc;AAC7F;AAEA,SAAS,cAAc,MAAsB;AAC3C,QAAM,QAAQ,KAAK,YAAY,GAAG;AAClC,SAAO,SAAS,IAAI,KAAK,MAAM,GAAG,QAAQ,CAAC,IAAI;AACjD;AAEA,SAAS,YAAY,UAAkB,MAAsB;AAC3D,QAAM,QAAQ,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG;AAC5C,QAAM,aAAuB,CAAC;AAC9B,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,QAAQ,SAAS,KAAK;AACzB;AAAA,IACF;AACA,QAAI,SAAS,MAAM;AACjB,iBAAW,IAAI;AAAA,IACjB,OAAO;AACL,iBAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AACA,SAAO,WAAW,KAAK,GAAG;AAC5B;;;AE3YA,IAAAE,gBAAkB;AAIlB,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AACF,CAAC;AAEM,SAAS,YAA2B;AACzC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,KAAK,cAAc,SAAS,KAAK,cAAc,UAAU,aAAa,IAAI,KAAK,QAAQ;AAAA,IAChG;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,SAAS;AACnC,UAAI,SAAS,OAAO,KAAK;AAEzB,UAAI;AACF,cAAM,MAAM,MAAM,cAAAC,QAAM,UAAU,MAAM,gBAAgB,IAAI,IAAI,CAAC;AACjE,cAAM,UAAU,OAAO,GAAG;AAAA,MAC5B,SAAS,OAAO;AACd,0BAAkB,OAAO,KAAK;AAAA,MAChC;AAEA,aAAO;AAAA,QACL,UAAU;AACR,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,UAAU,OAAoB,KAA2B;AACtE,QAAM,UAAU,OAAO,OAAO,IAAI,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG;AACrE,QAAM,aAAa,QAChB,OAAO,CAAC,UAAU,gCAAgC,KAAK,MAAM,IAAI,KAAK,MAAM,KAAK,SAAS,QAAQ,CAAC,EACnG,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,QAAW,EAAE,SAAS,KAAK,CAAC,CAAC;AAC5E,QAAM,kBAAkB,QAAQ,OAAO,CAAC,UAAU,gDAAgD,KAAK,MAAM,IAAI,CAAC;AAClH,QAAM,eAAe,MAAM,QAAQ;AAAA,IACjC,WAAW,MAAM,GAAG,EAAE,EAAE,IAAI,OAAO,OAAO,UAAU;AAClD,YAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AACpC,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,iBAAiB,GAAG;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,cAAc,8BAAU;AACxC,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cAAc;AACnB,UAAQ,OAAO,IAAI;AACnB,UAAQ,OAAO,iBAAiB,SAAS,YAAY,iBAAiB,aAAa,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC;AAC5G,QAAM,OAAO,OAAO;AAEpB,QAAM,QAAQ,cAAc,4BAAQ,WAAW,MAAM,EAAE;AACvD,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,SAAO,YAAY;AAEnB,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,cAAc;AACpB,WAAO,OAAO,KAAK;AAAA,EACrB,OAAO;AACL,eAAW,QAAQ,cAAc;AAC/B,aAAO,OAAO,cAAc,KAAK,KAAK,KAAK,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,IACpE;AAAA,EACF;AACA,QAAM,OAAO,MAAM;AACnB,QAAM,OAAO,KAAK;AAElB,QAAM,YAAY,cAAc,4BAAQ,QAAQ,MAAM,EAAE;AACxD,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,aAAW,SAAS,QAAQ,MAAM,GAAG,GAAG,GAAG;AACzC,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc,MAAM;AACzB,SAAK,OAAO,IAAI;AAAA,EAClB;AACA,YAAU,OAAO,IAAI;AACrB,QAAM,OAAO,SAAS;AACxB;AAWA,SAAS,iBACP,SACA,YACA,iBACA,WACa;AACb,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,EAAAC,YAAW,MAAM,gBAAM,WAAW,MAAM;AACxC,EAAAA,YAAW,MAAM,gBAAM,QAAQ,MAAM;AACrC,EAAAA,YAAW,MAAM,iBAAiB,QAAQ,OAAO,CAAC,UAAU,WAAW,KAAK,MAAM,IAAI,CAAC,EAAE,MAAM;AAC/F,EAAAA,YAAW,MAAM,eAAe,QAAQ,OAAO,CAAC,UAAU,YAAY,KAAK,MAAM,IAAI,CAAC,EAAE,MAAM;AAC9F,EAAAA,YAAW,MAAM,4BAAQ,QAAQ,OAAO,CAAC,UAAU,+BAA+B,KAAK,MAAM,IAAI,KAAK,MAAM,KAAK,SAAS,OAAO,CAAC,EAAE,MAAM;AAC1I,EAAAA,YAAW,MAAM,gBAAM,gBAAgB,MAAM;AAC7C,EAAAA,YAAW,MAAM,4BAAQ,gBAAgB,OAAO,CAAC,UAAU,sCAAsC,KAAK,MAAM,IAAI,CAAC,EAAE,MAAM;AACzH,EAAAA,YAAW,MAAM,4BAAQ,gBAAgB,OAAO,CAAC,UAAU,oBAAoB,KAAK,MAAM,IAAI,CAAC,EAAE,MAAM;AACvG,QAAM,SAAS,UAAU,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,QAAQ,CAAC;AACvE,EAAAA,YAAW,MAAM,UAAU,MAAM;AACjC,QAAM,YAAY,mBAAmB,SAAS;AAC9C,MAAI,WAAW;AACb,IAAAA,YAAW,MAAM,4BAAQ,SAAS;AAAA,EACpC;AACA,QAAM,cAAc,qBAAqB,SAAS;AAClD,MAAI,aAAa;AACf,IAAAA,YAAW,MAAM,4BAAQ,WAAW;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,KAA0B;AAClD,QAAM,WAAW,wBAAwB,GAAG;AAC5C,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,WAAO;AAAA,EACT;AACA,QAAM,OAAO,IAAI;AACjB,QAAM,WAAW,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC;AACzD,SAAO;AAAA,IACL,OAAO,aAAaC,iBAAgB,MAAM,OAAO,GAAG,SAAS,KAAK;AAAA,IAClE,QAAQ,aAAaA,iBAAgB,MAAM,QAAQ,GAAG,SAAS,MAAM;AAAA,IACrE,QAAQ,SAAS,OAAO,CAAC,YAAY,QAAQ,cAAc,QAAQ,EAAE;AAAA,IACrE,cAAc,SAAS,OAAO,CAAC,YAAY,QAAQ,cAAc,YAAY,EAAE;AAAA,IAC/E,UAAU,SAAS,OAAO,CAAC,YAAY,QAAQ,cAAc,QAAQ,EAAE;AAAA,IACvE,OAAO,SAAS,OAAO,CAAC,YAAY,QAAQ,cAAc,MAAM,EAAE;AAAA,EACpE;AACF;AAEA,SAAS,wBAAwB,KAA0B;AACzD,SAAO;AAAA,IACL,OAAO,aAAa,oBAAoB,KAAK,OAAO,GAAG,MAAS;AAAA,IAChE,QAAQ,aAAa,oBAAoB,KAAK,QAAQ,GAAG,MAAS;AAAA,IAClE,QAAQC,cAAa,KAAK,oBAAoB;AAAA,IAC9C,cAAcA,cAAa,KAAK,wBAAwB;AAAA,IACxD,UAAUA,cAAa,KAAK,oBAAoB;AAAA,IAChD,OAAOA,cAAa,KAAK,kBAAkB;AAAA,EAC7C;AACF;AAEA,SAAS,mBAAmB,WAAkC;AAC5D,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,WAAW;AAC5B,QAAI,CAAC,OAAO,SAAS,KAAK,KAAK,KAAK,CAAC,OAAO,SAAS,KAAK,MAAM,GAAG;AACjE;AAAA,IACF;AACA,UAAM,MAAM,GAAG,KAAK,MAAM,KAAK,KAAe,CAAC,MAAM,KAAK,MAAM,KAAK,MAAgB,CAAC;AACtF,WAAO,IAAI,MAAM,OAAO,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,EAC5C;AACA,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,MAAM,KAAK,MAAO,QAAQ,IAAI,GAAG,IAAI,KAAK,KAAK,MAAM,IAAK,EAChE,KAAK,IAAI;AACd;AAEA,SAAS,qBAAqB,WAAkC;AAC9D,QAAM,SAAS,UAAU;AAAA,IACvB,CAAC,QAAQ,UAAU;AAAA,MACjB,cAAc,OAAO,eAAe,KAAK;AAAA,MACzC,UAAU,OAAO,WAAW,KAAK;AAAA,MACjC,OAAO,OAAO,QAAQ,KAAK;AAAA,IAC7B;AAAA,IACA,EAAE,cAAc,GAAG,UAAU,GAAG,OAAO,EAAE;AAAA,EAC3C;AACA,SAAO;AAAA,IACL,OAAO,eAAe,cAAc,OAAO,YAAY,KAAK;AAAA,IAC5D,OAAO,WAAW,UAAU,OAAO,QAAQ,KAAK;AAAA,IAChD,OAAO,QAAQ,QAAQ,OAAO,KAAK,KAAK;AAAA,EAC1C,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAC7B;AAEA,SAAS,cAAc,KAAa,MAAc,OAA4B;AAC5E,QAAM,OAAO,SAAS,cAAc,SAAS;AAC7C,OAAK,YAAY;AACjB,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,UAAQ,cAAc,QAAQ,QAAQ,CAAC;AACvC,QAAM,WAAW,SAAS,cAAc,MAAM;AAC9C,WAAS,cAAc;AAEvB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,QAAM,YAAY,eAAe,GAAG;AACpC,MAAI,UAAU,SAAS,GAAG;AACxB,eAAW,YAAY,WAAW;AAChC,YAAM,YAAY,SAAS,cAAc,GAAG;AAC5C,gBAAU,cAAc;AACxB,WAAK,OAAO,SAAS;AAAA,IACvB;AAAA,EACF,OAAO;AACL,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,cAAc;AACpB,SAAK,OAAO,KAAK;AAAA,EACnB;AAEA,OAAK,OAAO,SAAS,UAAU,IAAI;AACnC,SAAO;AACT;AAEA,SAAS,eAAe,KAAuB;AAC7C,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,WAAO,sBAAsB,GAAG;AAAA,EAClC;AACA,SAAO,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAC5C,OAAO,CAAC,YAAY,QAAQ,cAAc,QAAQ,EAClD,IAAI,CAAC,UAAUD,iBAAgB,OAAO,eAAe,KAAK,EAAE,EAC5D,IAAI,CAAC,UAAU,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC,EAChD,OAAO,OAAO;AACnB;AAEA,SAAS,sBAAsB,KAAuB;AACpD,SAAO,CAAC,GAAG,IAAI,SAAS,0CAA0C,CAAC,EAChE,IAAI,CAAC,UAAU,UAAU,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,EACpD,IAAI,CAAC,UAAU,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC,EAChD,OAAO,OAAO;AACnB;AAEA,SAAS,oBAAoB,KAAa,MAAkC;AAC1E,QAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,MAAM,IAAI,0BAA0B,CAAC;AACxE,SAAO,QAAQ,CAAC,KAAK,QAAQ,CAAC;AAChC;AAEA,SAASC,cAAa,OAAe,SAAyB;AAC5D,SAAO,CAAC,GAAG,MAAM,SAAS,OAAO,CAAC,EAAE;AACtC;AAEA,SAAS,kBAAkB,OAAoB,OAAsB;AACnE,QAAM,gBAAgB;AACtB,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AACrB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc,iBAAiB,QAAQ,MAAM,UAAU;AAC5D,WAAS,OAAO,OAAO,IAAI;AAC3B,QAAM,OAAO,QAAQ;AACvB;AAEA,SAASF,YAAW,QAAqB,OAAe,OAA8B;AACpF,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc,OAAO,KAAK;AAClC,MAAI,OAAO,KAAK,OAAO;AACvB,SAAO,OAAO,GAAG;AACnB;AAEA,SAASC,iBAAgB,SAAkB,WAAkC;AAC3E,QAAM,SAAS,QAAQ,aAAa,SAAS;AAC7C,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AACA,aAAW,aAAa,MAAM,KAAK,QAAQ,UAAU,GAAG;AACtD,QAAI,UAAU,cAAc,WAAW;AACrC,aAAO,UAAU;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAgB,UAAkD;AACtF,QAAM,SAAS,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC/D,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO,MACJ,WAAW,QAAQ,GAAG,EACtB,WAAW,QAAQ,GAAG,EACtB,WAAW,SAAS,GAAG,EACvB,WAAW,UAAU,GAAG,EACxB,WAAW,UAAU,GAAG;AAC7B;;;ACjSA,IAAAE,gBAAkB;AAClB,IAAAC,oBAAsB;AAKtB,IAAM,iBAAiB,oBAAI,IAAI,CAAC,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO,OAAO,QAAQ,KAAK,CAAC;AAC1G,IAAM,kBAAkB,oBAAI,IAAI,CAAC,QAAQ,OAAO,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO,OAAO,QAAQ,WAAW,IAAI,CAAC;AACpI,IAAM,yBAAyB,oBAAI,IAAI,CAAC,QAAQ,QAAQ,OAAO,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,QAAQ,OAAO,KAAK,CAAC;AAClI,IAAM,2BAA2B,oBAAI,IAAI,CAAC,OAAO,MAAM,OAAO,WAAW,KAAK,CAAC;AAC/E,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;AAC7B,IAAM,cAAc;AACpB,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,sBAA8C;AAAA,EAClD,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,2EAA2E;AAAA,EAC3E,oDAAoD;AAAA,EACpD,2EAA2E;AAAA,EAC3E,oDAAoD;AAAA,EACpD,2CAA2C;AAAA,EAC3C,oDAAoD;AAAA,EACpD,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,qEAAqE;AAAA,EACrE,wEAAwE;AAAA,EACxE,kDAAkD;AAAA,EAClD,yDAAyD;AAAA,EACzD,qDAAqD;AAAA,EACrD,kDAAkD;AAAA,EAClD,2DAA2D;AAAA,EAC3D,iCAAiC;AAAA,EACjC,iCAAiC;AAAA,EACjC,6EAA6E;AAAA,EAC7E,8DAA8D;AAAA,EAC9D,0EAA0E;AAAA,EAC1E,2DAA2D;AAAA,EAC3D,yEAAyE;AAAA,EACzE,0DAA0D;AAAA,EAC1D,mDAAmD;AAAA,EACnD,4DAA4D;AAAA,EAC5D,iCAAiC;AACnC;AAkCO,SAAS,eAA8B;AAC5C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aACE,eAAe,IAAI,KAAK,SAAS,KACjC,gBAAgB,IAAI,KAAK,SAAS,KAClC,uBAAuB,IAAI,KAAK,SAAS,KACzC,gBAAgB,IAAI,KAAK,QAAQ;AAAA,IAErC;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,YAAY;AACtC,UAAI,SAAS,OAAO,KAAK;AACzB,YAAM,YAAY,cAAc,IAAI,MAAM,mBAAmB;AAC7D,YAAM,cAAc,MAAM,gBAAgB,IAAI,IAAI;AAElD,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,WAAW,OAAO,WAAW;AAAA,MACrC,WAAW,cAAc,OAAO;AAC9B,4BAAoB,OAAO,oBAAU,UAAU,MAAM,mBAAmB,WAAW,CAAC,CAAC;AAAA,MACvF,WAAW,cAAc,OAAO;AAC9B,cAAM,UAAU,OAAO,WAAW;AAAA,MACpC,WAAW,cAAc,QAAQ;AAC/B,8BAAsB,OAAO,qBAAW,MAAM,mBAAmB,WAAW,CAAC;AAAA,MAC/E,WAAW,cAAc,QAAQ;AAC/B,sBAAc,OAAO,MAAM,mBAAmB,WAAW,CAAC;AAAA,MAC5D,WAAW,yBAAyB,IAAI,SAAS,KAAM,MAAM,4BAA4B,OAAO,aAAa,SAAS,GAAI;AAAA,MAE1H,WAAW,gBAAgB,IAAI,SAAS,GAAG;AACzC,cAAM,YAAY,OAAO,aAAa,SAAS;AAAA,MACjD,WAAW,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM,EAAE,SAAS,SAAS,GAAG;AAC/E,cAAM,WAAW,OAAO,WAAW;AAAA,MACrC,WAAW,cAAc,OAAO;AAC9B,cAAM,UAAU,OAAO,WAAW;AAAA,MACpC,WAAW,cAAc,QAAQ;AAC/B,0CAAkC,OAAO,MAAM,mBAAmB,WAAW,CAAC;AAAA,MAChF,WAAW,qBAAqB,SAAS,GAAG;AAC1C,iCAAyB,OAAO,WAAW,WAAW;AAAA,MACxD,OAAO;AACL,gCAAwB,OAAO,aAAa,IAAI,KAAK,aAAa,QAAQ;AAAA,MAC5E;AAEA,aAAO;AAAA,QACL,UAAU;AACR,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,WAAW,WAA4B;AAC9C,SAAO,cAAc,UAAU,cAAc,UAAU,cAAc,UAAU,cAAc;AAC/F;AAEA,eAAe,WAAW,OAAoB,aAAyC;AACrF,QAAM,UAAU,cAAc,mBAAS;AACvC,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,OAAO,OAAO;AACtB,QAAM,OAAO,OAAO;AAEpB,MAAI;AACF,UAAM,cAAc,MAAM,OAAO,cAAc;AAC/C,UAAM,YAAY,YAAY,aAAa,SAAS,SAAS;AAAA,MAC3D,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,cAAc;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,cAAc;AAAA,IAChB,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,gBAAgB;AACxB,UAAM,eAAe,SAAS,cAAc,KAAK;AACjD,iBAAa,YAAY;AACzB,iBAAa,cAAc;AAC3B,YAAQ,OAAO,YAAY;AAC3B,QAAI;AACF,YAAM,sBAAsB,SAAS,WAAW;AAAA,IAClD,SAAS,eAAe;AACtB,YAAM,uBAAuB,SAAS,WAAW;AACjD,cAAQ,KAAK,mEAAmE,aAAa;AAAA,IAC/F;AACA,YAAQ,KAAK,qDAAqD,KAAK;AAAA,EACzE;AAEF;AAEA,eAAe,uBAAuB,WAAwB,aAAyC;AACrG,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AAEpB,MAAI;AACF,UAAM,MAAM,MAAM,cAAAC,QAAM,UAAU,WAAW;AAC7C,UAAM,cAAc,MAAM,IAAI,KAAK,mBAAmB,GAAG,MAAM,MAAM;AACrE,UAAM,aAAa,cAAc,sBAAsB,WAAW,IAAI,CAAC;AACvE,QAAI,WAAW,SAAS,GAAG;AACzB,iBAAW,iBAAiB,YAAY;AACtC,cAAM,YAAY,SAAS,cAAc,GAAG;AAC5C,kBAAU,cAAc;AACxB,gBAAQ,OAAO,SAAS;AAAA,MAC1B;AAAA,IACF,OAAO;AACL,YAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,YAAM,cAAc;AACpB,cAAQ,OAAO,KAAK;AAAA,IACtB;AAAA,EACF,QAAQ;AACN,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,cAAc;AACpB,YAAQ,OAAO,KAAK;AAAA,EACtB;AAEA,YAAU,OAAO,OAAO;AAC1B;AAEA,eAAe,sBAAsB,WAAwB,aAAyC;AACpG,QAAM,UAAU,MAAM,OAAO,SAAS;AACtC,QAAM,SAAS,MAAM,QAAQ;AAAA,IAC3B,EAAE,YAAY;AAAA,IACd;AAAA,MACE,cAAc,QAAQ,OAAO,WAAW,OAAO,WAAW;AAAA,QACxD,KAAK,QAAQ,MAAM,WAAW,WAAW,MAAM,MAAM,KAAK,QAAQ,CAAC;AAAA,MACrE,EAAE;AAAA,IACJ;AAAA,EACF;AACA,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,UAAQ,YAAY,aAAa,OAAO,SAAS,qEAAmB;AACpE,YAAU,OAAO,OAAO;AAExB,MAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,UAAM,QAAQ,SAAS,cAAc,SAAS;AAC9C,UAAM,YAAY;AAClB,UAAM,UAAU,SAAS,cAAc,SAAS;AAChD,YAAQ,cAAc,4BAAQ,OAAO,SAAS,MAAM;AACpD,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,eAAW,WAAW,OAAO,UAAU;AACrC,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,WAAK,cAAc,QAAQ;AAC3B,WAAK,OAAO,IAAI;AAAA,IAClB;AACA,UAAM,OAAO,SAAS,IAAI;AAC1B,cAAU,OAAO,KAAK;AAAA,EACxB;AACF;AAEA,eAAe,UAAU,OAAoB,aAAyC;AACpF,QAAM,MAAM,MAAM,cAAAA,QAAM,UAAU,WAAW;AAC7C,QAAM,UAAU,IAAI,KAAK,aAAa;AACtC,MAAI,CAAC,SAAS;AACZ,wBAAoB,OAAO,oBAAU,sCAAkB;AACvD;AAAA,EACF;AACA,wBAAsB,OAAO,oBAAU,MAAM,QAAQ,MAAM,MAAM,CAAC;AACpE;AAEA,SAAS,sBAAsB,OAAoB,OAAe,KAAmB;AACnF,QAAM,UAAU,cAAc,KAAK;AACnC,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,QAAM,SAAS,0BAA0B,GAAG;AAC5C,MAAI,OAAO,SAAS,GAAG;AACrB,eAAW,SAAS,QAAQ;AAC1B,YAAM,YAAY,SAAS,cAAc,GAAG;AAC5C,gBAAU,cAAc;AACxB,cAAQ,OAAO,SAAS;AAAA,IAC1B;AAAA,EACF,OAAO;AACL,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,cAAc;AACpB,YAAQ,OAAO,KAAK;AAAA,EACtB;AACA,UAAQ,OAAO,OAAO;AACtB,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,oBAAoB,OAAoB,OAAe,MAAoB;AAClF,QAAM,UAAU,cAAc,KAAK;AACnC,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,MAAI,cAAc,QAAQ;AAC1B,UAAQ,OAAO,GAAG;AAClB,QAAM,OAAO,OAAO;AACtB;AAEA,eAAe,YACb,OACA,aACA,WACe;AACf,QAAM,OAAO,MAAM,OAAO,MAAM;AAChC,MAAI;AACJ,MAAI;AACF,eAAW,KAAK,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AAAA,EACrD,SAAS,OAAO;AACd,QAAI,qBAAqB,SAAS,GAAG;AACnC,+BAAyB,OAAO,WAAW,aAAa,qBAAqB,KAAK,CAAC;AACnF;AAAA,IACF;AACA,wBAAoB,OAAO,WAAW,qBAAqB,KAAK,CAAC;AACjE;AAAA,EACF;AACA,QAAM,gBAAgB,MAAM,mBAAmB,WAAW,EAAE,MAAM,MAAM,CAAC,CAAC;AAC1E,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,OAAK,aAAa,QAAQ,SAAS;AACnC,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,aAAa,QAAQ,UAAU;AACvC,QAAM,UAAU,oBAAI,IAA+B;AAEnD,QAAM,oBAAoB,CAAC,WAAmB,eAAuB;AACnE,YAAQ,gBAAgB;AACxB,YAAQ,QAAQ,CAAC,QAAQ,SAAS;AAChC,YAAM,SAAS,SAAS;AACxB,aAAO,UAAU,OAAO,aAAa,MAAM;AAC3C,aAAO,aAAa,iBAAiB,OAAO,MAAM,CAAC;AAAA,IACrD,CAAC;AACD,YAAQ,aAAa,cAAc,SAAS;AAE5C,UAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,YAAQ,cAAc;AACtB,UAAM,QAAQ,SAAS,OAAO,SAAS;AACvC,UAAM,QAAQ,KAAK,MAAM,aAAa,MAAM,MAAM,KAAK,OAAO;AAC9D,UAAM,WAAW,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI;AACzC,UAAM,cAAc,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI;AAC5C,UAAM,cAAc,mBAAmB,OAAO,OAAO,KAAK,MAAM,WAAW;AAE3E,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AACpB,YAAQ,cAAc,GAAG,QAAQ,aAAQ,WAAW,UAClD,YAAY,SAAS,IAAI,sBAAO,YAAY,MAAM,0CAAY,EAChE;AAEA,UAAM,eAAe,SAAS,cAAc,KAAK;AACjD,iBAAa,YAAY;AACzB,UAAM,WAAW,oBAAoB,UAAU,WAAW;AAC1D,UAAM,iBAAiB,0BAA0B,UAAU,MAAM,kBAAkB,CAAC;AACpF,UAAM,oBAAoB,MAAM;AAC9B,mBAAa;AAAA,QACX;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK,MAAM;AAAA,UACX,KAAK,MAAM;AAAA,QACb;AAAA,MACF;AACA,sBAAgB,OAAO;AAAA,IACzB;AAEA,YAAQ,OAAO,SAAS,OAAO;AAC/B,QAAI,gBAAgB;AAClB,cAAQ,OAAO,eAAe,OAAO;AAAA,IACvC;AACA,YAAQ,OAAO,YAAY;AAC3B,sBAAkB;AAElB,QAAI,YAAY,SAAS,GAAG;AAC1B,YAAM,UAAU,SAAS,cAAc,SAAS;AAChD,cAAQ,YAAY;AACpB,YAAM,iBAAiB,SAAS,cAAc,SAAS;AACvD,qBAAe,cAAc;AAC7B,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,iBAAW,QAAQ,YAAY,MAAM,GAAG,GAAG,GAAG;AAC5C,cAAM,MAAM,SAAS,cAAc,IAAI;AACvC,YAAI,cAAc,GAAG,KAAK,OAAO,KAAK,KAAK,OAAO;AAClD,aAAK,OAAO,GAAG;AAAA,MACjB;AACA,UAAI,YAAY,SAAS,KAAK;AAC5B,cAAM,MAAM,SAAS,cAAc,IAAI;AACvC,YAAI,cAAc,gBAAM,YAAY,SAAS,GAAG;AAChD,aAAK,OAAO,GAAG;AAAA,MACjB;AACA,cAAQ,OAAO,gBAAgB,IAAI;AACnC,cAAQ,OAAO,OAAO;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,WAAW,GAAG;AACpC,YAAQ,cAAc,cAAc,YAAY,6GAA6B;AAAA,EAC/E,OAAO;AACL,eAAW,CAAC,OAAO,SAAS,KAAK,SAAS,WAAW,QAAQ,GAAG;AAC9D,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,OAAO;AACd,aAAO,aAAa,QAAQ,KAAK;AACjC,aAAO,aAAa,iBAAiB,OAAO;AAC5C,aAAO,cAAc;AACrB,aAAO,QAAQ;AACf,aAAO,iBAAiB,SAAS,MAAM,kBAAkB,WAAW,KAAK,CAAC;AAC1E,cAAQ,IAAI,WAAW,MAAM;AAC7B,WAAK,OAAO,MAAM;AAClB,UAAI,UAAU,GAAG;AACf,0BAAkB,WAAW,KAAK;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,OAAO;AAC1B,MAAI,cAAc,SAAS,GAAG;AAC5B,UAAM,OAAO,0BAA0B,aAAa,CAAC;AAAA,EACvD;AACF;AAEA,SAAS,oBAAoB,OAAoB,WAAmB,QAAsB;AACxF,QAAM,UAAU,cAAc,sCAAQ;AACtC,QAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,QAAM,cAAc,IAAI,aAAa,OAAO;AAC5C,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cAAc;AACnB,QAAM,UAAU,SAAS,cAAc,GAAG;AAC1C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO,MAAM,OAAO;AACnC,QAAM,OAAO,OAAO;AACtB;AAgBA,SAAS,cAAc,OAAoB,KAAmB;AAC5D,QAAM,SAAS,aAAa,GAAG;AAC/B,qBAAmB,OAAO,QAAQ,6DAAgB;AACpD;AAEA,SAAS,mBAAmB,OAAoB,QAAuB,cAA4B;AACjG,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,OAAK,aAAa,QAAQ,SAAS;AACnC,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,aAAa,QAAQ,UAAU;AACvC,QAAM,UAAU,oBAAI,IAA+B;AAEnD,QAAM,qBAAqB,CAAC,OAAoB,eAAuB;AACrE,YAAQ,gBAAgB;AACxB,YAAQ,QAAQ,CAAC,QAAQ,SAAS;AAChC,YAAM,SAAS,SAAS,MAAM;AAC9B,aAAO,UAAU,OAAO,aAAa,MAAM;AAC3C,aAAO,aAAa,iBAAiB,OAAO,MAAM,CAAC;AAAA,IACrD,CAAC;AACD,YAAQ,aAAa,cAAc,MAAM,IAAI;AAE7C,UAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,YAAQ,cAAc,MAAM;AAC5B,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AACpB,UAAM,WAAW,MAAM,KAAK;AAC5B,UAAM,cAAc,KAAK,IAAI,GAAG,GAAG,MAAM,KAAK,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;AACtE,YAAQ,cAAc,GAAG,QAAQ,aAAQ,WAAW,UAClD,MAAM,SAAS,SAAS,IAAI,sBAAO,MAAM,SAAS,MAAM,0CAAY,EACtE;AAEA,UAAM,eAAe,SAAS,cAAc,KAAK;AACjD,iBAAa,YAAY;AACzB,UAAM,WAAW,oBAAoB,UAAU,WAAW;AAC1D,UAAM,iBAAiB,0BAA0B,UAAU,MAAM,kBAAkB,CAAC;AACpF,UAAM,oBAAoB,MAAM;AAC9B,mBAAa,gBAAgB,uBAAuB,OAAO,YAAY,QAAQ,CAAC;AAChF,sBAAgB,OAAO;AAAA,IACzB;AAEA,YAAQ,OAAO,SAAS,OAAO;AAC/B,QAAI,gBAAgB;AAClB,cAAQ,OAAO,eAAe,OAAO;AAAA,IACvC;AACA,YAAQ,OAAO,YAAY;AAC3B,sBAAkB;AAElB,QAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,YAAM,UAAU,SAAS,cAAc,SAAS;AAChD,cAAQ,YAAY;AACpB,YAAM,iBAAiB,SAAS,cAAc,SAAS;AACvD,qBAAe,cAAc;AAC7B,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,iBAAW,QAAQ,MAAM,SAAS,MAAM,GAAG,GAAG,GAAG;AAC/C,cAAM,MAAM,SAAS,cAAc,IAAI;AACvC,YAAI,cAAc,GAAG,KAAK,OAAO,KAAK,KAAK,OAAO;AAClD,aAAK,OAAO,GAAG;AAAA,MACjB;AACA,UAAI,MAAM,SAAS,SAAS,KAAK;AAC/B,cAAM,MAAM,SAAS,cAAc,IAAI;AACvC,YAAI,cAAc,gBAAM,MAAM,SAAS,SAAS,GAAG;AACnD,aAAK,OAAO,GAAG;AAAA,MACjB;AACA,cAAQ,OAAO,gBAAgB,IAAI;AACnC,cAAQ,OAAO,OAAO;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,YAAQ,cAAc;AAAA,EACxB,OAAO;AACL,eAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC7C,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,OAAO;AACd,aAAO,aAAa,QAAQ,KAAK;AACjC,aAAO,aAAa,iBAAiB,OAAO;AAC5C,aAAO,cAAc,MAAM;AAC3B,aAAO,QAAQ,MAAM;AACrB,aAAO,iBAAiB,SAAS,MAAM,mBAAmB,OAAO,KAAK,CAAC;AACvE,cAAQ,IAAI,MAAM,MAAM,MAAM;AAC9B,WAAK,OAAO,MAAM;AAClB,UAAI,UAAU,GAAG;AACf,2BAAmB,OAAO,KAAK;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,OAAO;AAC5B;AAEA,eAAe,mBAAmB,aAAmD;AACnF,QAAM,MAAM,MAAM,cAAAA,QAAM,UAAU,WAAW;AAC7C,QAAM,eAAe,OAAO,OAAO,IAAI,KAAK,EACzC,OAAO,CAAC,UAAU,CAAC,MAAM,OAAO,+BAA+B,KAAK,MAAM,IAAI,CAAC,EAC/E,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAC9C,QAAM,SAAyB,CAAC;AAChC,aAAW,CAAC,OAAO,KAAK,KAAK,aAAa,QAAQ,GAAG;AACnD,UAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AACpC,UAAM,QAAQ,cAAc,KAAK,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,QAAQ,QAAQ,CAAC,MAAM;AACvF,QAAI,OAAO;AACT,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,KAAa,cAA2C;AAC7E,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,gBAAgB,GAAG;AAChC,QAAM,QAAQ,cAAc,KAAK,OAAO,KAAK,aAAa,QAAQ,WAAW,EAAE;AAC/E,QAAM,iBAAiB,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,QAAQ,cAAc,KAAK;AAChH,QAAM,SAAS,eACZ,IAAI,CAAC,SAAS,UAAU,iBAAiB,SAAS,KAAK,CAAC,EACxD,OAAO,CAAC,SAA2E,KAAK,OAAO,SAAS,CAAC;AAE5G,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,YAAY,OAAO,KAAK,CAAC,SAAS,KAAK,WAAW,SAAS,CAAC,GAAG,cAAc,CAAC;AAAA,IAC9E,QAAQ,OAAO,IAAI,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,QAAQ,KAAK,OAAO,EAAE;AAAA,EACzE;AACF;AAEA,SAAS,gBAAgB,KAAuB;AAC9C,QAAM,YAAY,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAAE;AAAA,IAC1D,CAAC,YAAY,QAAQ,UAAU,SAAS,OAAO,KAAK,QAAQ,cAAc;AAAA,EAC5E,GAAG;AACH,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AACA,SAAO,UAAU,QAAQ,WAAW,EAAE,EAAE,YAAY;AACtD;AAEA,SAAS,iBACP,SACA,OAC0D;AAC1D,SAAO;AAAA,IACL,MAAM,cAAc,SAAS,IAAI,KAAK,UAAU,QAAQ,CAAC;AAAA,IACzD,QAAQ,iBAAiB,SAAS,KAAK;AAAA,IACvC,YAAY,iBAAiB,SAAS,KAAK;AAAA,EAC7C;AACF;AAEA,SAAS,0BAA0B,QAAqC;AACtE,QAAM,UAAU,cAAc,sCAAQ;AACtC,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,aAAW,SAAS,QAAQ;AAC1B,SAAK,OAAO,gBAAgB,KAAK,CAAC;AAAA,EACpC;AACA,UAAQ,OAAO,IAAI;AACnB,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAkC;AACzD,QAAM,OAAO,SAAS,cAAc,SAAS;AAC7C,OAAK,YAAY;AAEjB,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,QAAM,QAAQ,SAAS,cAAc,IAAI;AACzC,QAAM,cAAc,MAAM;AAC1B,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc,GAAG,MAAM,IAAI,SAAM,MAAM,OAAO,MAAM;AACzD,SAAO,OAAO,OAAO,IAAI;AAEzB,QAAM,MAAM,eAAe,KAAK;AAChC,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,cAAc;AACtB,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,aAAW,QAAQ,MAAM,QAAQ;AAC/B,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,QAAI,cAAc,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,GACpE,KAAK,OAAO,SAAS,KAAK,eAAU,KAAK,OAAO,MAAM,YAAO,EAC/D;AACA,SAAK,OAAO,GAAG;AAAA,EACjB;AACA,UAAQ,OAAO,SAAS,IAAI;AAC5B,OAAK,OAAO,QAAQ,KAAK,OAAO;AAChC,SAAO;AACT;AAEA,SAAS,eAAe,OAAoC;AAC1D,QAAM,MAAM,SAAS,gBAAgB,8BAA8B,KAAK;AACxE,MAAI,aAAa,WAAW,aAAa;AACzC,MAAI,aAAa,QAAQ,KAAK;AAC9B,MAAI,aAAa,cAAc,MAAM,KAAK;AAC1C,MAAI,UAAU,IAAI,eAAe;AAEjC,QAAM,YAAY,MAAM,OAAO,QAAQ,CAAC,SAAS,KAAK,MAAM,EAAE,OAAO,CAAC,UAAU,OAAO,SAAS,KAAK,CAAC;AACtG,QAAM,MAAM,KAAK,IAAI,GAAG,GAAG,SAAS;AACpC,QAAM,MAAM,KAAK,IAAI,GAAG,GAAG,SAAS;AACpC,QAAM,OAAO,MAAM,OAAO;AAC1B,QAAM,SAAS,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;AACrE,QAAM,OAAO,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,KAAK,QAAQ,IAAI;AAErD,YAAU,KAAK,QAAQ,EAAE,IAAI,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,QAAQ,OAAO,iBAAiB,CAAC;AAChH,YAAU,KAAK,QAAQ;AAAA,IACrB,IAAI,KAAK;AAAA,IACT,IAAI,KAAK,IAAI,KAAK;AAAA,IAClB,IAAI,KAAK,IAAI,KAAK;AAAA,IAClB,IAAI,KAAK,IAAI,KAAK;AAAA,IAClB,OAAO;AAAA,EACT,CAAC;AAED,QAAM,OAAO,QAAQ,CAAC,QAAQ,gBAAgB;AAC5C,UAAM,QAAQ,OAAO,cAAc,OAAO,MAAM;AAChD,UAAM,OAAO,OAAO,OAAO,SAAS,IAAI,KAAK,SAAS,OAAO,OAAO,SAAS,KAAK,KAAK;AACvF,UAAM,SAAS,OAAO,OAAO,IAAI,CAAC,OAAO,WAAW;AAAA,MAClD,GAAG,KAAK,IAAI,QAAQ;AAAA,MACpB,GAAG,KAAK,IAAI,KAAK,UAAW,QAAQ,OAAO,OAAQ,KAAK;AAAA,IAC1D,EAAE;AAEF,QAAI,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,KAAK,SAAS,KAAK,GAAG;AAC5D,YAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG,MAAM,OAAO,MAAM;AACxF,aAAO,QAAQ,CAAC,OAAO,UAAU;AAC/B,cAAM,QAAQ,KAAK,IAAI,KAAK,UAAW,IAAI,OAAO,OAAQ,KAAK;AAC/D,cAAM,IAAI,MAAM,IAAK,WAAW,MAAM,OAAO,SAAU,IAAI,cAAc;AACzE,kBAAU,KAAK,QAAQ;AAAA,UACrB;AAAA,UACA,GAAG,KAAK,IAAI,MAAM,GAAG,KAAK;AAAA,UAC1B,OAAO;AAAA,UACP,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,MAAM,CAAC,CAAC;AAAA,UAC7C,MAAM;AAAA,UACN,cAAc;AAAA,QAChB,CAAC;AAAA,MACH,CAAC;AAAA,IACH,OAAO;AACL,gBAAU,KAAK,YAAY;AAAA,QACzB,QAAQ,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAAA,QACrF,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,MACrB,CAAC;AACD,iBAAW,SAAS,OAAO,MAAM,GAAG,EAAE,GAAG;AACvC,kBAAU,KAAK,UAAU,EAAE,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,GAAG,GAAG,MAAM,MAAM,CAAC;AAAA,MAC1E;AAAA,IACF;AAEA,iBAAa,KAAK,OAAO,MAAM,OAAO,KAAK,cAAc,KAAK,GAAG;AAAA,EACnE,CAAC;AAED,SAAO;AACT;AAEA,SAAS,aAAa,KAAoB,OAAe,OAAe,GAAW,GAAiB;AAClG,YAAU,KAAK,QAAQ,EAAE,GAAG,GAAG,IAAI,IAAI,OAAO,IAAI,QAAQ,IAAI,IAAI,GAAG,MAAM,MAAM,CAAC;AAClF,QAAM,OAAO,UAAU,KAAK,QAAQ,EAAE,GAAG,IAAI,IAAI,GAAG,OAAO,kBAAkB,CAAC;AAC9E,OAAK,cAAc,MAAM,SAAS,KAAK,GAAG,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ;AACtE;AAEA,SAAS,UACP,QACA,KACA,YACyB;AACzB,QAAM,UAAU,SAAS,gBAAgB,8BAA8B,GAAG;AAC1E,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,YAAQ,aAAa,KAAK,OAAO,KAAK,CAAC;AAAA,EACzC;AACA,SAAO,OAAO,OAAO;AACrB,SAAO;AACT;AAEA,SAAS,cAAc,MAAkB,WAA2B;AAClE,QAAM,UAAU,MAAM,KAAK,KAAK,iBAAiB,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,cAAc,SAAS;AAClG,SAAO,UAAU,UAAU,OAAO,IAAI;AACxC;AAEA,SAAS,iBAAiB,MAAkB,WAA6B;AACvE,QAAM,UAAU,MAAM,KAAK,KAAK,iBAAiB,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,cAAc,SAAS;AAClG,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AACA,SAAO,kBAAkB,OAAO;AAClC;AAEA,SAAS,iBAAiB,MAAkB,WAA6B;AACvE,QAAM,UAAU,MAAM,KAAK,KAAK,iBAAiB,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,cAAc,SAAS;AAClG,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AACA,SAAO,MAAM,KAAK,QAAQ,iBAAiB,GAAG,CAAC,EAC5C,OAAO,CAAC,SAAS,KAAK,cAAc,GAAG,EACvC,IAAI,CAAC,SAAS,OAAO,KAAK,eAAe,EAAE,CAAC,EAC5C,OAAO,CAAC,UAAU,OAAO,SAAS,KAAK,CAAC;AAC7C;AAEA,SAAS,UAAU,SAA0B;AAC3C,SACE,MAAM,KAAK,QAAQ,iBAAiB,GAAG,CAAC,EACrC,OAAO,CAAC,SAAS,KAAK,cAAc,OAAO,KAAK,cAAc,GAAG,EACjE,IAAI,CAAC,SAAS,KAAK,aAAa,KAAK,KAAK,EAAE,EAC5C,KAAK,OAAO,KAAK;AAExB;AAEA,SAAS,kBAAkB,SAA4B;AACrD,SAAO,MAAM,KAAK,QAAQ,iBAAiB,GAAG,CAAC,EAC5C,OAAO,CAAC,SAAS,KAAK,cAAc,OAAO,KAAK,cAAc,GAAG,EACjE,IAAI,CAAC,SAAS,KAAK,aAAa,KAAK,KAAK,EAAE,EAC5C,OAAO,OAAO;AACnB;AAcA,SAAS,oBAAoB,UAAkB,aAAoC;AACjF,SAAO;AAAA,IACL,UAAU;AAAA,IACV,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,UAAyB,QAAgD;AAC1G,QAAM,YAAY,SAAS,WAAW;AACtC,QAAM,eAAe,SAAS,cAAc;AAC5C,MAAI,CAAC,aAAa,CAAC,cAAc;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AAErB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,YAAY;AAEjB,QAAM,UAAU,mBAAmB,qBAAW,MAAM;AAClD,aAAS,WAAW,KAAK,IAAI,GAAG,SAAS,WAAW,iBAAiB;AACrE,WAAO;AAAA,EACT,CAAC;AACD,QAAM,UAAU,mBAAmB,qBAAW,MAAM;AAClD,aAAS,WAAW,KAAK,IAAI,SAAS,SAAS,UAAU,iBAAiB,GAAG,SAAS,WAAW,iBAAiB;AAClH,WAAO;AAAA,EACT,CAAC;AACD,QAAM,UAAU,mBAAmB,oBAAU,MAAM;AACjD,aAAS,cAAc,KAAK,IAAI,GAAG,SAAS,cAAc,oBAAoB;AAC9E,WAAO;AAAA,EACT,CAAC;AACD,QAAM,UAAU,mBAAmB,oBAAU,MAAM;AACjD,aAAS,cAAc,KAAK;AAAA,MAC1B,SAAS,SAAS,aAAa,oBAAoB;AAAA,MACnD,SAAS,cAAc;AAAA,IACzB;AACA,WAAO;AAAA,EACT,CAAC;AAED,WAAS,OAAO,MAAM,SAAS,SAAS,SAAS,OAAO;AAExD,QAAM,SAAS,MAAM;AACnB,UAAM,SAAS,KAAK,IAAI,SAAS,WAAW,mBAAmB,SAAS,QAAQ;AAChF,UAAM,YAAY,KAAK,IAAI,SAAS,cAAc,sBAAsB,SAAS,WAAW;AAC5F,SAAK,cAAc,sEAAe,SAAS,WAAW,CAAC,IAAI,MAAM,gBAAM,SAAS,cAAc,CAAC,IAAI,SAAS;AAC5G,YAAQ,WAAW,SAAS,aAAa;AACzC,YAAQ,WAAW,SAAS,YAAY,SAAS,SAAS,UAAU,iBAAiB;AACrF,YAAQ,WAAW,SAAS,gBAAgB;AAC5C,YAAQ,WAAW,SAAS,eAAe,SAAS,SAAS,aAAa,oBAAoB;AAC9F,YAAQ,SAAS,QAAQ,SAAS,CAAC;AACnC,YAAQ,SAAS,QAAQ,SAAS,CAAC;AAAA,EACrC;AAEA,SAAO;AACP,SAAO,EAAE,SAAS,UAAU,OAAO;AACrC;AAEA,SAAS,mBAAmB,OAAe,SAAwC;AACjF,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,OAAO;AACd,SAAO,cAAc;AACrB,SAAO,iBAAiB,SAAS,OAAO;AACxC,SAAO;AACT;AAEA,SAAS,SAAS,OAAe,MAAsB;AACrD,SAAO,KAAK,IAAI,GAAG,QAAQ,IAAI;AACjC;AAEA,SAAS,yBACP,OACA,OACA,YACA,UACA,YACA,YACkB;AAClB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,KAAK,aAAa,aAAa,CAAC;AACtC,QAAM,SAAS,KAAK,IAAI,MAAM,EAAE,IAAI,SAAS,WAAW,oBAAoB,GAAG,MAAM,EAAE,CAAC;AACxF,QAAM,YAAY,KAAK,IAAI,MAAM,EAAE,IAAI,SAAS,cAAc,uBAAuB,GAAG,MAAM,EAAE,CAAC;AAEjG,WAAS,WAAW,MAAM,EAAE,IAAI,SAAS,UAAU,YAAY,QAAQ,YAAY,GAAG;AACpF,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,aAAS,cAAc,MAAM,EAAE,IAAI,SAAS,aAAa,eAAe,WAAW,eAAe,GAAG;AACnG,YAAM,OAAO,SAAS,cAAc,aAAa,MAAM,EAAE,IAAI,OAAO,IAAI;AACxE,YAAM,UAAU,WAAW,EAAE,GAAG,UAAU,GAAG,YAAY,CAAC;AAC1D,YAAM,aAAa,MAAM,OAAO;AAChC,WAAK,QAAQ,OAAO;AACpB,YAAM,OAAO,aAAa,WAAW,UAAU,IAAI;AACnD,WAAK,cAAc;AACnB,UAAI,MAAM;AACR,aAAK,QAAQ;AAAA,MACf;AACA,UAAI,YAAY,GAAG;AACjB,aAAK,UAAU,IAAI,kBAAkB;AACrC,aAAK,QAAQ,IAAI,WAAW,CAAC;AAAA,MAC/B;AACA,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,UAAM,OAAO,GAAG;AAAA,EAClB;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAoB,YAAoB,UAA2C;AACjH,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,KAAK,aAAa,aAAa,CAAC;AACtC,QAAM,aAAa,IAAI,IAAI,MAAM,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC;AACrF,QAAM,SAAS,KAAK,IAAI,SAAS,WAAW,mBAAmB,MAAM,KAAK,MAAM;AAChF,WAAS,WAAW,SAAS,UAAU,WAAW,QAAQ,YAAY,GAAG;AACvE,UAAM,YAAY,MAAM,KAAK,QAAQ,KAAK,CAAC;AAC3C,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,UAAM,YAAY,KAAK,IAAI,SAAS,cAAc,sBAAsB,SAAS,WAAW;AAC5F,aAAS,cAAc,SAAS,aAAa,cAAc,WAAW,eAAe,GAAG;AACtF,YAAM,QAAQ,UAAU,WAAW,KAAK;AACxC,YAAM,OAAO,SAAS,cAAc,aAAa,IAAI,OAAO,IAAI;AAChE,YAAM,UAAU,SAAS,UAAU,WAAW;AAC9C,WAAK,QAAQ,OAAO;AACpB,WAAK,cAAc;AACnB,UAAI,OAAO;AACT,aAAK,QAAQ;AAAA,MACf;AACA,YAAM,UAAU,WAAW,IAAI,OAAO;AACtC,UAAI,SAAS;AACX,aAAK,UAAU,IAAI,kBAAkB;AACrC,aAAK,QAAQ;AAAA,MACf;AACA,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,UAAM,OAAO,GAAG;AAAA,EAClB;AACA,SAAO;AACT;AAEA,SAAS,aAAa,KAA4B;AAChD,QAAM,cAAc,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAC1E,MAAI,YAAY,cAAc,aAAa,GAAG;AAC5C,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,MAAM,KAAK,YAAY,qBAAqB,GAAG,CAAC,EACpD,OAAO,CAAC,YAAY,QAAQ,cAAc,OAAO,EACjD,IAAI,CAAC,cAAc,eAAe,kBAAkB,cAAc,UAAU,CAAC,EAC7E,OAAO,CAAC,UAAU,MAAM,KAAK,SAAS,CAAC;AAC5C;AAEA,SAAS,kBAAkB,cAAuB,YAAiC;AACjF,QAAM,OAAmB,CAAC;AAC1B,QAAM,WAAwD,CAAC;AAC/D,QAAM,YAAYC,iBAAgB,cAAc,MAAM,KAAK,SAAS,aAAa,CAAC;AAClF,aAAW,cAAc,MAAM,KAAK,aAAa,QAAQ,EAAE,OAAO,CAAC,YAAY,QAAQ,cAAc,WAAW,GAAG;AACjH,UAAM,aAAa,YAAYA,iBAAgB,YAAY,sBAAsB,GAAG,GAAG;AACvF,UAAM,YAAY,gBAAgB,YAAY,KAAK,QAAQ,QAAQ;AACnE,aAAS,QAAQ,GAAG,QAAQ,YAAY,SAAS,GAAG;AAClD,WAAK,KAAK,CAAC,GAAG,SAAS,CAAC;AAAA,IAC1B;AAAA,EACF;AACA,wBAAsB,IAAI;AAC1B,SAAO,EAAE,MAAM,WAAW,MAAM,SAAS;AAC3C;AAEA,SAAS,gBACP,YACA,UACA,UACU;AACV,QAAM,MAAgB,CAAC;AACvB,aAAW,eAAe,MAAM,KAAK,WAAW,QAAQ,EAAE;AAAA,IACxD,CAAC,YAAY,QAAQ,cAAc,gBAAgB,QAAQ,cAAc;AAAA,EAC3E,GAAG;AACD,UAAM,gBAAgB,YAAYA,iBAAgB,aAAa,yBAAyB,GAAG,GAAG;AAC9F,UAAM,QAAQ,wBAAwB,WAAW;AACjD,UAAM,UAAUA,iBAAgB,aAAa,SAAS;AACtD,aAAS,QAAQ,GAAG,QAAQ,eAAe,SAAS,GAAG;AACrD,YAAM,cAAc,IAAI;AACxB,UAAI,KAAK,KAAK;AACd,UAAI,SAAS;AACX,iBAAS,KAAK,EAAE,SAAS,SAAS,UAAU,WAAW,GAAG,QAAQ,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACA,yBAAuB,GAAG;AAC1B,SAAO;AACT;AAEA,SAAS,wBAAwB,aAA8B;AAC7D,QAAM,OAAO,mCAAmC,WAAW;AAC3D,MAAI,MAAM;AACR,WAAO;AAAA,EACT;AACA,SACEA,iBAAgB,aAAa,OAAO,KACpCA,iBAAgB,aAAa,YAAY,KACzCA,iBAAgB,aAAa,YAAY,KACzCA,iBAAgB,aAAa,eAAe,KAC5C;AAEJ;AAEA,SAAS,mCAAmC,SAA0B;AACpE,QAAM,YAAsB,CAAC;AAC7B,QAAM,QAAQ,CAAC,SAAe;AAC5B,QAAI,KAAK,aAAa,KAAK,WAAW;AACpC,gBAAU,KAAK,KAAK,eAAe,EAAE;AACrC;AAAA,IACF;AACA,QAAI,EAAE,gBAAgB,UAAU;AAC9B;AAAA,IACF;AACA,QAAI,KAAK,cAAc,KAAK;AAC1B,gBAAU,KAAK,IAAI,OAAO,YAAYA,iBAAgB,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC;AACtE;AAAA,IACF;AACA,QAAI,KAAK,cAAc,OAAO;AAC5B,gBAAU,KAAK,GAAI;AACnB;AAAA,IACF;AACA,QAAI,KAAK,cAAc,cAAc;AACnC,gBAAU,KAAK,IAAI;AACnB;AAAA,IACF;AACA,eAAW,SAAS,MAAM,KAAK,KAAK,UAAU,GAAG;AAC/C,YAAM,KAAK;AAAA,IACb;AACA,QAAI,KAAK,cAAc,OAAO,KAAK,cAAc,KAAK;AACpD,gBAAU,KAAK,IAAI;AAAA,IACrB;AAAA,EACF;AACA,QAAM,OAAO;AACb,SAAO,UAAU,KAAK,EAAE,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK;AACtD;AAEA,SAASA,iBAAgB,SAAkB,WAAkC;AAC3E,QAAM,SAAS,QAAQ,aAAa,SAAS;AAC7C,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AACA,aAAW,aAAa,MAAM,KAAK,QAAQ,UAAU,GAAG;AACtD,QAAI,UAAU,cAAc,WAAW;AACrC,aAAO,UAAU;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAsB,KAAqB;AAC9D,QAAM,SAAS,QAAQ,OAAO,SAAS,OAAO,EAAE,IAAI;AACpD,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,SAAS,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,QAAQ,GAAG;AAC7B;AAEA,SAAS,sBAAsB,MAAwB;AACrD,SAAO,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,CAAC,EAAE,MAAM,CAAC,SAAS,SAAS,EAAE,GAAG;AAC5E,SAAK,IAAI;AAAA,EACX;AACF;AAEA,SAAS,uBAAuB,KAAqB;AACnD,SAAO,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,IAAI;AACnD,QAAI,IAAI;AAAA,EACV;AACF;AAEA,SAAS,mBACP,OACA,OACA,YAC6C;AAC7C,QAAM,WAAwD,CAAC;AAC/D,WAAS,MAAM,MAAM,EAAE,GAAG,OAAO,MAAM,EAAE,GAAG,OAAO,GAAG;AACpD,aAAS,SAAS,MAAM,EAAE,GAAG,UAAU,MAAM,EAAE,GAAG,UAAU,GAAG;AAC7D,YAAM,UAAU,WAAW,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;AAChD,YAAM,OAAO,MAAM,OAAO;AAC1B,UAAI,MAAM,GAAG;AACX,iBAAS,KAAK,EAAE,SAAS,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,SAAS,UAAkB,aAA6B;AAC/D,MAAI,SAAS;AACb,MAAI,QAAQ,cAAc;AAC1B,SAAO,QAAQ,GAAG;AAChB,UAAM,aAAa,QAAQ,KAAK;AAChC,aAAS,OAAO,aAAa,KAAK,SAAS,IAAI;AAC/C,YAAQ,KAAK,OAAO,QAAQ,KAAK,EAAE;AAAA,EACrC;AACA,SAAO,GAAG,MAAM,GAAG,WAAW,CAAC;AACjC;AAEA,eAAe,WAAW,OAAoB,aAAyC;AACrF,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,YAAY;AAEtB,MAAI;AACF,UAAM,MAAM,MAAM,cAAAD,QAAM,UAAU,WAAW;AAC7C,UAAM,0BAA0B,OAAO,MAAM,wBAAwB,GAAG,CAAC;AAAA,EAC3E,SAAS,OAAO;AACd,YAAQ,KAAK,6CAA6C,KAAK;AAAA,EACjE;AAEA,QAAM,OAAO,SAAS;AACtB,MAAI;AACF,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,wBAAwB;AAC5D,UAAM,WAAW,KAAK,aAAa,SAAS;AAAA,EAC9C,QAAQ;AACN,cAAU,cAAc;AAAA,EAC1B;AACF;AAEA,eAAe,UAAU,OAAoB,aAAyC;AACpF,QAAM,MAAM,MAAM,cAAAA,QAAM,UAAU,WAAW;AAC7C,QAAM,UAAU,IAAI,KAAK,aAAa;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,cAAc;AACpB;AAAA,EACF;AACA,QAAM,MAAM,MAAM,QAAQ,MAAM,MAAM;AACtC,QAAM,SAAS,MAAM,iBAAiB,KAAK,aAAa;AACxD,4BAA0B,OAAO,gCAAgC,aAAa,KAAK,8BAAU,GAAG,KAAK,OAAO,MAAM,CAAC;AACnH,iCAA+B,OAAO,gCAAY,KAAK,MAAM;AAC/D;AAEA,SAAS,kCAAkC,OAAoB,KAAmB;AAChF,4BAA0B,OAAO,gCAAgC,iCAAa,KAAK,CAAC,CAAC;AACrF,iCAA+B,OAAO,iCAAa,KAAK,CAAC,CAAC;AAC5D;AAEA,eAAe,4BACb,OACA,aACA,WACkB;AAClB,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,cAAAA,QAAM,UAAU,WAAW;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,OAAO,IAAI,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG;AACrE,QAAM,WAAW,CAAC,SAAiB,QAAQ,KAAK,CAAC,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,CAAC;AAC1G,QAAM,aAAa,IAAI,KAAK,sBAAsB,EAAE,CAAC;AAErD,MAAI,SAAS,mBAAmB,GAAG;AACjC,8BAA0B,OAAO,WAAW,oHAAoC;AAChF,UAAM,WAAW,OAAO,WAAW;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,iBAAiB,GAAG;AAC/B,8BAA0B,OAAO,WAAW,wHAAwC;AACpF,UAAM,YAAY,OAAO,aAAa,SAAS;AAC/C,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,sBAAsB,GAAG;AACpC,8BAA0B,OAAO,WAAW,4HAA4C;AACxF,UAAM,WAAW,OAAO,WAAW;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,YAAY;AACd,UAAM,MAAM,MAAM,WAAW,MAAM,MAAM;AACzC,QAAI,wCAAwC,KAAK,GAAG,GAAG;AACrD,gCAA0B,OAAO,WAAW,iIAAiD;AAC7F,yBAAmB,OAAO,aAAa,GAAG,GAAG,GAAG,UAAU,YAAY,CAAC,yDAAY;AACnF,aAAO;AAAA,IACT;AACA,QAAI,uCAAuC,KAAK,GAAG,GAAG;AACpD,gCAA0B,OAAO,WAAW,kIAAkD;AAC9F,qCAA+B,OAAO,GAAG,UAAU,YAAY,CAAC,6BAAS,KAAK,MAAM,iBAAiB,KAAK,aAAa,CAAC;AACxH,aAAO;AAAA,IACT;AACA,QAAI,4BAA4B,KAAK,GAAG,GAAG;AACzC,gCAA0B,OAAO,WAAW,0HAA0C;AACtF,4BAAsB,OAAO,GAAG,UAAU,YAAY,CAAC,iBAAO,GAAG;AACjE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,QAAQ,KAAK,CAAC,UAAU,YAAY,KAAK,MAAM,IAAI,KAAK,UAAU,KAAK,MAAM,IAAI,CAAC,GAAG;AACvF;AAAA,MACE;AAAA,MACA;AAAA,MACA,QAAQ,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,MACjC;AAAA,MACA,MAAM,qBAAqB,OAAO;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB;AAAA,MACE;AAAA,MACA;AAAA,MACA,QAAQ,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,MACjC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,0BAA0B,OAAoB,WAAmB,SAAuB;AAC/F,QAAM,UAAU,cAAc,gCAAO;AACrC,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,YAAY;AACjB,OAAK,cAAc,IAAI,SAAS,IAAI,OAAO;AAC3C,UAAQ,OAAO,IAAI;AACnB,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,6BACP,OACA,WACA,SACA,SACA,UACM;AACN,QAAM,UAAU,cAAc,uCAAc;AAC5C,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,YAAY;AACjB,OAAK,cAAc,IAAI,SAAS,IAAI,OAAO;AAE3C,MAAI,YAAY,OAAO,KAAK,QAAQ,EAAE,SAAS,GAAG;AAChD,YAAQ,OAAO,2BAA2B,QAAQ,CAAC;AAAA,EACrD;AAEA,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,OAAK,YAAY;AACjB,aAAW,QAAQ,QAAQ,MAAM,GAAG,GAAG,GAAG;AACxC,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc;AACnB,SAAK,OAAO,IAAI;AAAA,EAClB;AACA,MAAI,QAAQ,SAAS,KAAK;AACxB,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc,gBAAM,QAAQ,SAAS,GAAG;AAC7C,SAAK,OAAO,IAAI;AAAA,EAClB;AAEA,UAAQ,OAAO,MAAM,IAAI;AACzB,QAAM,OAAO,OAAO;AACtB;AAEA,eAAe,qBAAqB,SAAsD;AACxF,QAAM,kBAAkB,QAAQ,OAAO,CAAC,UAAU,yBAAyB,KAAK,MAAM,IAAI,KAAK,sBAAsB,KAAK,MAAM,IAAI,CAAC;AACrI,QAAM,WAA0B,CAAC;AACjC,aAAW,SAAS,gBAAgB,MAAM,GAAG,CAAC,GAAG;AAC/C,UAAM,OAAO,MAAM,MAAM,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE;AACrD,QAAI,CAAC,QAAQ,CAAC,eAAe,KAAK,IAAI,GAAG;AACvC;AAAA,IACF;AACA,UAAM,QAAQ,eAAe,IAAI;AACjC,uBAAmB,UAAU,KAAK;AAAA,EACpC;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,UAAsC;AACxE,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,kBAAgB,MAAM,gBAAM,SAAS,KAAK;AAC1C,kBAAgB,MAAM,gBAAM,SAAS,MAAM;AAC3C,kBAAgB,MAAM,gBAAM,SAAS,OAAO;AAC5C,kBAAgB,MAAM,gBAAM,SAAS,OAAO;AAC5C,kBAAgB,MAAM,sBAAO,SAAS,UAAU,KAAK,IAAI,CAAC;AAC1D,kBAAgB,MAAM,4BAAQ,SAAS,OAAO;AAC9C,kBAAgB,MAAM,4BAAQ,SAAS,QAAQ;AAC/C,UAAQ,OAAO,OAAO,IAAI;AAC1B,SAAO;AACT;AAEA,SAAS,gBAAgB,QAAqB,OAAe,OAAsB;AACjF,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AACA,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,MAAI,OAAO,KAAK,OAAO;AACvB,SAAO,OAAO,GAAG;AACnB;AAEA,SAAS,mBAAmB,UAAyB,OAAsC;AACzF,WAAS,UAAU,UAAU,OAAO,CAAC,SAAS,SAAS,iBAAiB,mBAAmB,cAAc,CAAC;AAC1G,WAAS,WAAW,UAAU,OAAO,CAAC,UAAU,UAAU,WAAW,kBAAkB,SAAS,CAAC;AACjG,WAAS,YAAY,UAAU,OAAO,CAAC,WAAW,WAAW,cAAc,CAAC;AAC5E,WAAS,YAAY,UAAU,OAAO,CAAC,WAAW,WAAW,eAAe,SAAS,CAAC;AACtF,WAAS,YAAY,UAAU,OAAO,CAAC,gBAAgB,WAAW,uBAAuB,CAAC;AAC1F,WAAS,aAAa,UAAU,OAAO,CAAC,oBAAoB,YAAY,4BAA4B,CAAC;AACrG,WAAS,aAAa,WAAW,OAAO,CAAC,YAAY,YAAY,iBAAiB,CAAC;AACrF;AAEA,SAAS,eAAe,KAAsC;AAC5D,MAAI,OAAO,cAAc,aAAa;AACpC,WAAO,CAAC;AAAA,EACV;AACA,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,WAAO,CAAC;AAAA,EACV;AACA,QAAM,OAAO,MAAM,KAAK,IAAI,gBAAgB,QAAQ,EAAE,KAAK,CAAC,UAAU,MAAM,YAAY,MAAM;AAC9F,QAAM,QAAQ,OAAO,gBAAgB,IAAI,IAAI;AAC7C,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAAK,QAAoC,CAAC;AAC7G;AAEA,SAAS,gBAAgB,SAA2B;AAClD,UAAQ,QAAQ,SAAS;AAAA,IACvB,KAAK,QAAQ;AACX,YAAM,SAAkC,CAAC;AACzC,YAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ;AAC5C,eAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS;AACpD,cAAM,MAAM,SAAS,KAAK;AAC1B,YAAI,IAAI,YAAY,OAAO;AACzB;AAAA,QACF;AACA,cAAM,QAAQ,SAAS,QAAQ,CAAC;AAChC,YAAI,OAAO;AACT,iBAAO,IAAI,eAAe,EAAE,IAAI,gBAAgB,KAAK;AACrD;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AACH,aAAO,MAAM,KAAK,QAAQ,QAAQ,EAAE,IAAI,eAAe;AAAA,IACzD,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,QAAQ,eAAe,CAAC;AAAA,IACxC,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACE,aAAO,QAAQ,aAAa,KAAK,KAAK;AAAA,EAC1C;AACF;AAEA,SAAS,UAAU,OAAgC,MAAoC;AACrF,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,MAAM,GAAG;AACvB,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG;AAC7C,aAAO,MAAM,KAAK;AAAA,IACpB;AACA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,OAAO,MAAM,OAAO,CAAC,SAAyB,OAAO,SAAS,YAAY,QAAQ,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAC/G,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAgC,MAAsC;AACxF,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,MAAM,GAAG;AACvB,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,QAAQ,MAAM,OAAO,CAAC,SAAyB,OAAO,SAAS,YAAY,QAAQ,KAAK,KAAK,CAAC,CAAC;AACrG,UAAI,MAAM,SAAS,GAAG;AACpB,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG;AAC7C,aAAO,MAAM,MAAM,MAAM,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AAAA,IACtE;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,+BACP,OACA,OACA,KACA,QACM;AACN,QAAM,QAAQ,IAAI,MAAM,cAAc,EAAE,MAAM,CAAC;AAC/C,QAAM,cAAc,MAAM,SAAS,IAAI,QAAQ,CAAC,GAAG;AACnD,aAAW,CAAC,OAAO,OAAO,KAAK,YAAY,QAAQ,GAAG;AACpD,UAAM,UAAU,cAAc,GAAG,KAAK,IAAI,QAAQ,CAAC,EAAE;AACrD,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY;AACjB,UAAM,QAAQ,0BAA0B,OAAO;AAC/C,QAAI,MAAM,SAAS,GAAG;AACpB,iBAAW,QAAQ,OAAO;AACxB,cAAM,YAAY,SAAS,cAAc,GAAG;AAC5C,kBAAU,cAAc;AACxB,aAAK,OAAO,SAAS;AAAA,MACvB;AAAA,IACF,OAAO;AACL,YAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,YAAM,cAAc;AACpB,WAAK,OAAO,KAAK;AAAA,IACnB;AACA,eAAW,SAAS,OAAO,MAAM,UAAU,IAAI,IAAI,OAAO,QAAQ,UAAU,IAAI,OAAO,SAAS,OAAO,MAAM,GAAG;AAC9G,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,YAAY;AACnB,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,MAAM,MAAM;AAChB,UAAI,MAAM,MAAM;AAChB,YAAM,UAAU,SAAS,cAAc,YAAY;AACnD,cAAQ,cAAc,MAAM;AAC5B,aAAO,OAAO,KAAK,OAAO;AAC1B,WAAK,OAAO,MAAM;AAAA,IACpB;AACA,YAAQ,OAAO,IAAI;AACnB,UAAM,OAAO,OAAO;AAAA,EACtB;AACF;AAEA,eAAe,wBAAwB,KAA0C;AAC/E,QAAM,eAAe,OAAO,OAAO,IAAI,KAAK,EACzC,OAAO,CAAC,UAAU,CAAC,MAAM,OAAO,gCAAgC,KAAK,MAAM,IAAI,CAAC,EAChF,KAAK,CAAC,GAAG,MAAM,oBAAoB,EAAE,IAAI,IAAI,oBAAoB,EAAE,IAAI,CAAC;AAE3E,QAAM,SAAqC,CAAC;AAC5C,MAAI,aAAa;AACjB,MAAI,aAAa;AACjB,MAAI,kBAAkB;AACtB,MAAI,iBAAiB;AACrB,QAAM,UAAU,oBAAI,IAAY;AAEhC,aAAW,SAAS,cAAc;AAChC,UAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AACpC,UAAM,QAAQ,mBAAmB,GAAG;AACpC,UAAM,OAAO,MAAM,sBAAsB,KAAK,MAAM,IAAI;AACxD,UAAM,SAAS,MAAM,uBAAuB,KAAK,MAAM,MAAM,IAAI;AACjE,QAAI,QAAQ;AACV,cAAQ,IAAI,MAAM;AAAA,IACpB;AAEA,UAAM,kBAAkB,qBAAqB,KAAK,IAAI;AACtD,UAAM,YAAY,8BAA8B,MAAM,MAAM,KAAK,KAAK,CAAC,QAAQ,iBAAiB,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM;AACvH,UAAM,WAAW,YAAY,MAAM,IAAI,KAAK,SAAS,GAAG,MAAM,MAAM,IAAI;AACxE,UAAM,kBAAkB,WAAW,mBAAmB,QAAQ,EAAE,SAAS;AACzE,UAAM,gBAAgB,mBAAmB,KAAK,GAAG;AACjD,UAAM,sBAAsBE,cAAa,KAAK,iEAAiE;AAE/G,kBAAc;AACd,kBAAc;AACd,uBAAmB,gBAAgB,IAAI;AACvC,sBAAkB;AAClB,WAAO,KAAK;AAAA,MACV,OAAO,MAAM,CAAC,KAAK,SAAS,OAAO,SAAS,CAAC;AAAA,MAC7C;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ;AAAA,MACA,gBAAgB;AAAA,MAChB,aAAa,MAAM,MAAM,GAAG,CAAC;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,YAAY,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,MAAM,KAAK,OAAO;AAAA,IAC3B;AAAA,EACF;AACF;AAEA,SAAS,gCAAgC,OAAe,KAAa,aAA0C;AAC7G,QAAM,QAAQ,IAAI,MAAM,cAAc,EAAE,MAAM,CAAC;AAC/C,QAAM,cAAc,MAAM,SAAS,IAAI,QAAQ,CAAC,GAAG;AACnD,QAAM,SAAS,YAAY,IAAI,CAAC,SAAS,UAAU;AACjD,UAAM,QAAQ,0BAA0B,OAAO;AAC/C,UAAM,SACJ,kBAAkB,SAAS,+BAA+B,KAC1D,kBAAkB,SAAS,4BAA4B,KACvD;AACF,UAAM,aAAaA,cAAa,SAAS,iBAAiB;AAC1D,UAAM,gBAAgB,2EAA2E,KAAK,OAAO;AAC7G,UAAM,iBAAiBA,cAAa,SAAS,gEAAgE;AAC7G,WAAO;AAAA,MACL,OAAO,MAAM,CAAC,KAAK,SAAS,QAAQ,CAAC;AAAA,MACrC;AAAA,MACA,WAAW,MAAM;AAAA,MACjB;AAAA,MACA,YAAYA,cAAa,SAAS,yBAAyB;AAAA,MAC3D;AAAA,MACA;AAAA,MACA,aAAa,MAAM,MAAM,GAAG,CAAC;AAAA,IAC/B;AAAA,EACF,CAAC;AAED,QAAM,UAAU,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,MAAM,MAAM,EAAE,OAAO,OAAO,CAAa;AACvF,SAAO;AAAA,IACL;AAAA,IACA,YAAY,OAAO;AAAA,IACnB,YAAY,KAAK,IAAI,aAAa,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,YAAY,CAAC,CAAC;AAAA,IAC1F,YAAY,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,YAAY,CAAC;AAAA,IACnE,iBAAiB,OAAO,OAAO,CAAC,UAAU,MAAM,aAAa,EAAE;AAAA,IAC/D,gBAAgB,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,gBAAgB,CAAC;AAAA,IAC3E,SAAS,MAAM,KAAK,OAAO;AAAA,IAC3B;AAAA,EACF;AACF;AAEA,eAAe,0BAA0B,OAAoB,SAA6C;AACxG,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,SAAS;AACjB,UAAQ,aAAa,eAAe,MAAM;AAC1C,UAAQ,QAAQ,aAAa,OAAO,QAAQ,UAAU;AACtD,UAAQ,QAAQ,aAAa,OAAO,QAAQ,UAAU;AACtD,UAAQ,QAAQ,aAAa,OAAO,QAAQ,UAAU;AACtD,UAAQ,QAAQ,kBAAkB,OAAO,QAAQ,eAAe;AAChE,UAAQ,QAAQ,iBAAiB,OAAO,QAAQ,cAAc;AAC9D,QAAM,QAAQ;AAAA,IACZ,GAAG,QAAQ,UAAU;AAAA,IACrB,GAAG,QAAQ,QAAQ,UAAU,CAAC;AAAA,IAC9B,GAAG,QAAQ,UAAU;AAAA,IACrB,GAAG,QAAQ,UAAU;AAAA,IACrB,GAAG,QAAQ,eAAe;AAAA,IAC1B,GAAG,QAAQ,cAAc;AAAA,EAC3B;AACA,UAAQ,OAAO,yBAAyB,QAAQ,OAAO,MAAM,KAAK,QAAK,CAAC,CAAC;AAEzE,MAAI,QAAQ,QAAQ,SAAS,GAAG;AAC9B,YAAQ,OAAO,yBAAyB,gBAAM,QAAQ,QAAQ,KAAK,QAAG,CAAC,CAAC;AAAA,EAC1E;AACA,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,yBAAyB,OAAe,OAA4B;AAC3E,QAAM,SAAS,SAAS,cAAc,GAAG;AACzC,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,cAAc;AACrB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc;AACnB,SAAO,OAAO,QAAQ,IAAI;AAC1B,SAAO;AACT;AAQA,eAAe,sBAAsB,KAAY,UAA+C;AAC9F,QAAM,WAAW,wBAAwB,QAAQ;AACjD,QAAM,MAAM,MAAM,IAAI,KAAK,QAAQ,GAAG,MAAM,MAAM;AAClD,MAAI,CAAC,KAAK;AACR,WAAO,CAAC;AAAA,EACV;AACA,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,WAAO,CAAC;AAAA,EACV;AACA,SAAO,MAAM,KAAK,IAAI,uBAAuB,aAAa,cAAc,CAAC,EAAE,IAAI,CAAC,aAAa;AAAA,IAC3F,IAAI,QAAQ,aAAa,IAAI,KAAK;AAAA,IAClC,MAAM,QAAQ,aAAa,MAAM,KAAK;AAAA,IACtC,QAAQ,QAAQ,aAAa,QAAQ,KAAK;AAAA,EAC5C,EAAE;AACJ;AAEA,eAAe,uBAAuB,KAAY,WAAmB,MAAuD;AAC1H,QAAM,YAAY,KAAK,KAAK,CAAC,QAAQ,kBAAkB,KAAK,IAAI,IAAI,CAAC;AACrE,QAAM,aAAa,8BAA8B,WAAW,WAAW,MAAM;AAC7E,QAAM,MAAM,aAAa,MAAM,IAAI,KAAK,UAAU,GAAG,MAAM,MAAM,IAAI;AACrE,MAAI,CAAC,KAAK;AACR,WAAO,YAAY,MAAM,GAAG,EAAE,IAAI,GAAG,QAAQ,WAAW,EAAE;AAAA,EAC5D;AACA,SAAO,kBAAkB,KAAK,+BAA+B,KAAK,YAAY,MAAM,GAAG,EAAE,IAAI,GAAG,QAAQ,WAAW,EAAE;AACvH;AAEA,SAAS,qBAAqB,KAAa,MAAkC;AAC3E,QAAM,cAAc,IAAI,IAAI,KAAK,OAAO,CAAC,QAAQ,YAAY,KAAK,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;AACjG,QAAM,cAAc,CAAC,GAAG,IAAI,SAAS,8CAA8C,CAAC,EAAE,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AAC7G,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO,YAAY,OAAO,CAAC,OAAO,YAAY,SAAS,KAAK,YAAY,IAAI,EAAE,CAAC,EAAE;AAAA,EACnF;AACA,SAAO,YAAY;AACrB;AAEA,SAAS,wBAAwB,UAA0B;AACzD,QAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,QAAM,WAAW,MAAM,IAAI,KAAK;AAChC,SAAO,GAAG,MAAM,KAAK,GAAG,CAAC,UAAU,QAAQ;AAC7C;AAEA,SAAS,8BAA8B,YAAoB,QAAqC;AAC9F,MAAI,CAAC,UAAU,YAAY,KAAK,MAAM,GAAG;AACvC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,GAAG,GAAG;AAC1B,WAAO,OAAO,MAAM,CAAC;AAAA,EACvB;AACA,QAAM,OAAO,WAAW,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE;AAC9C,aAAW,WAAW,OAAO,MAAM,GAAG,GAAG;AACvC,QAAI,CAAC,WAAW,YAAY,KAAK;AAC/B;AAAA,IACF;AACA,QAAI,YAAY,MAAM;AACpB,WAAK,IAAI;AAAA,IACX,OAAO;AACL,WAAK,KAAK,OAAO;AAAA,IACnB;AAAA,EACF;AACA,SAAO,KAAK,KAAK,GAAG;AACtB;AAEA,SAAS,oBAAoB,MAAsB;AACjD,SAAO,OAAO,KAAK,MAAM,mBAAmB,IAAI,CAAC,KAAK,GAAG;AAC3D;AAEA,SAASA,cAAa,OAAe,SAAyB;AAC5D,SAAO,CAAC,GAAG,MAAM,SAAS,OAAO,CAAC,EAAE;AACtC;AAEA,SAAS,kBAAkB,OAAe,SAAgC;AACxE,QAAM,QAAQ,MAAM,MAAM,OAAO;AACjC,SAAO,QAAQC,WAAU,MAAM,CAAC,KAAK,EAAE,IAAI;AAC7C;AAEA,SAAS,aAAa,KAAa,UAA0B;AAC3D,SAAO,kBAAkB,KAAK,4DAA4D,KAAK;AACjG;AAEA,SAAS,qBAAqB,WAA4B;AACxD,SAAO,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,SAAS;AACtE;AAEA,SAAS,wBAAwB,WAA2B;AAC1D,MAAI,cAAc,SAAS,cAAc,OAAO;AAC9C,WAAO;AAAA,EACT;AACA,MAAI,cAAc,SAAS,cAAc,OAAO;AAC9C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,OAAoB,WAAmB,aAA0B,YAA2B;AAC5H,QAAM,YAAY,wBAAwB,WAAW;AACrD,QAAM,gBAAgB;AACtB,QAAM,UAAU,cAAc,mDAAgB;AAC9C,QAAM,SAAS,SAAS,cAAc,GAAG;AACzC,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,cAAc,IAAI,SAAS;AAClC,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,OAAK,YAAY;AACjB,yBAAuB,MAAM,4BAAQ,wBAAwB,SAAS,CAAC;AACvE,yBAAuB,MAAM,4BAAQ,gBAAgB,WAAW,IAAI,sDAA6B,yHAA0B;AAC3H,yBAAuB,MAAM,4BAAQ,GAAG,UAAU,MAAM,SAAI;AAC5D,MAAI,YAAY;AACd,2BAAuB,MAAM,4BAAQ,4FAAsB,UAAU,EAAE;AAAA,EACzE;AAEA,UAAQ,OAAO,QAAQ,IAAI;AAE3B,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,UAAU,SAAS,cAAc,SAAS;AAChD,YAAQ,YAAY;AACpB,eAAW,YAAY,UAAU,MAAM,GAAG,EAAE,GAAG;AAC7C,YAAM,YAAY,SAAS,cAAc,GAAG;AAC5C,gBAAU,cAAc;AACxB,cAAQ,OAAO,SAAS;AAAA,IAC1B;AACA,YAAQ,OAAO,OAAO;AAAA,EACxB,OAAO;AACL,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,cAAc;AACpB,YAAQ,OAAO,KAAK;AAAA,EACtB;AAEA,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,uBAAuB,MAAwB,OAAe,OAAqB;AAC1F,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,OAAK,cAAc;AACnB,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,SAAO,cAAc;AACrB,OAAK,OAAO,MAAM,MAAM;AAC1B;AAEA,SAAS,wBAAwB,OAAoB,WAAyB;AAC5E,QAAM,eAAe,oBAAI,IAAI,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,CAAC;AAC9E,QAAM,UAAU,aAAa,IAAI,SAAS,IACtC,uRACA;AACJ,QAAM,gBAAgB;AACtB,QAAM,UAAU,cAAc,iCAAa;AAC3C,QAAM,SAAS,SAAS,cAAc,GAAG;AACzC,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,cAAc,IAAI,SAAS;AAClC,SAAO,OAAO,QAAQ,SAAS,eAAe,gDAAkB,OAAO,EAAE,CAAC;AAE1E,QAAM,UAAU,SAAS,cAAc,GAAG;AAC1C,UAAQ,cAAc;AAEtB,UAAQ,OAAO,QAAQ,OAAO;AAC9B,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,qBAAqB,OAAwB;AACpD,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,EAAE;AAC3E,SAAO,UAAU,uCAAS,OAAO,KAAK;AACxC;AAEA,SAAS,wBAAwB,aAAoC;AACnE,QAAM,QAAQ,IAAI,WAAW,WAAW;AACxC,QAAM,YAAY;AAAA,IAChB,GAAG,qBAAqB,KAAK;AAAA,IAC7B,GAAG,iBAAiB,KAAK;AAAA,EAC3B,EACG,IAAI,CAAC,aAAa,oBAAoB,QAAQ,CAAC,EAC/C,OAAO,CAAC,aAAa,SAAS,UAAU,KAAK,gBAAgB,KAAK,QAAQ,CAAC;AAC9E,QAAM,SAAmB,CAAC;AAC1B,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,YAAY,WAAW;AAChC,UAAM,MAAM,SAAS,YAAY;AACjC,QAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AAClB,WAAK,IAAI,GAAG;AACZ,aAAO,KAAK,QAAQ;AAAA,IACtB;AAAA,EACF;AACA,SAAO,OAAO,MAAM,GAAG,GAAG;AAC5B;AAEA,SAAS,qBAAqB,OAA6B;AACzD,QAAM,YAAsB,CAAC;AAC7B,MAAI,UAAU;AACd,aAAW,QAAQ,OAAO;AACxB,QAAK,QAAQ,MAAM,QAAQ,OAAQ,SAAS,GAAG;AAC7C,iBAAW,OAAO,aAAa,IAAI;AAAA,IACrC,OAAO;AACL,UAAI,QAAQ,UAAU,GAAG;AACvB,kBAAU,KAAK,OAAO;AAAA,MACxB;AACA,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,MAAI,QAAQ,UAAU,GAAG;AACvB,cAAU,KAAK,OAAO;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAA6B;AACrD,QAAM,YAAsB,CAAC;AAC7B,MAAI,UAAU;AACd,WAAS,QAAQ,GAAG,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG;AACxD,UAAM,OAAO,MAAM,KAAK,IAAK,MAAM,QAAQ,CAAC,KAAK;AACjD,QAAK,QAAQ,MAAM,QAAQ,SAAW,SAAS,GAAG;AAChD,iBAAW,OAAO,aAAa,IAAI;AAAA,IACrC,OAAO;AACL,UAAI,QAAQ,UAAU,GAAG;AACvB,kBAAU,KAAK,OAAO;AAAA,MACxB;AACA,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,MAAI,QAAQ,UAAU,GAAG;AACvB,cAAU,KAAK,OAAO;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAuB;AAClD,SAAO,MAAM,QAAQ,qBAAqB,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC3E;AAEA,SAAS,gBAAgB,aAAmC;AAC1D,QAAM,YAAY,MAAM,KAAK,IAAI,WAAW,YAAY,MAAM,GAAG,CAAC,CAAC,CAAC;AACpE,SAAO,UAAU,KAAK,GAAG,MAAM;AACjC;AAEA,eAAe,iBACb,KACA,SAC+C;AAC/C,QAAM,SAA+C,CAAC;AACtD,aAAW,SAAS,OAAO,OAAO,IAAI,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,OAAO,QAAQ,KAAK,KAAK,IAAI,CAAC,GAAG;AACnG,UAAM,WAAW,iBAAiB,MAAM,IAAI;AAC5C,QAAI,CAAC,SAAS,WAAW,QAAQ,GAAG;AAClC;AAAA,IACF;AACA,WAAO,KAAK;AAAA,MACV,MAAM,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,MAAM;AAAA,MAC3C,KAAK,QAAQ,QAAQ,WAAW,MAAM,MAAM,MAAM,QAAQ,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,KAAuB;AACjD,SAAO,CAAC,GAAG,IAAI,SAAS,qDAAqD,CAAC,EAC3E,IAAI,CAAC,UAAUA,WAAU,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,EAC3D,OAAO,OAAO;AACnB;AAEA,SAAS,sBAAsB,KAAuB;AACpD,SAAO,CAAC,GAAG,IAAI,SAAS,wBAAwB,CAAC,EAC9C,IAAI,CAAC,UAAU,mBAAmB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EACpD,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACnB;AAEA,SAAS,0BAA0B,KAAuB;AACxD,SAAO,CAAC,GAAG,IAAI,SAAS,0DAA0D,CAAC,EAChF,IAAI,CAAC,UAAU,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC,EAC3C,IAAI,CAAC,SAASA,WAAU,IAAI,EAAE,KAAK,CAAC,EACpC,OAAO,OAAO;AACnB;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MACJ,QAAQ,2BAA2B,IAAI,EACvC,QAAQ,oBAAoB,GAAI,EAChC,QAAQ,YAAY,EAAE;AAC3B;AAEA,SAAS,UAAU,KAAqB;AACtC,SAAO,IACJ,QAAQ,sBAAsB,EAAE,EAChC,QAAQ,cAAc,IAAI,EAC1B,QAAQ,UAAU,GAAI,EACtB,QAAQ,qBAAqB,EAAE,EAC/B,QAAQ,SAAS,EAAE,EACnB,QAAQ,WAAW,MAAM,EACzB,KAAK;AACV;AAEA,eAAe,mBAAmB,aAA2C;AAC3E,SAAO,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC,EAAE,OAAO,WAAW;AACtE;AAGA,SAAS,iBAAiB,MAAsB;AAC9C,QAAM,YAAY,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AACrD,QAAM,MAA8B;AAAA,IAClC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AACA,SAAO,YAAY,IAAI,SAAS,KAAK,6BAA6B;AACpE;AAEA,SAASA,WAAU,OAAuB;AACxC,SAAO,MACJ,WAAW,QAAQ,GAAG,EACtB,WAAW,QAAQ,GAAG,EACtB,WAAW,SAAS,GAAG,EACvB,WAAW,UAAU,GAAG,EACxB,WAAW,UAAU,GAAG;AAC7B;AAEA,SAAS,aAAa,MAAsB;AAC1C,SAAO,kBAAAC,QAAU,SAAS,MAAM;AAAA,IAC9B,cAAc,EAAE,MAAM,KAAK;AAAA,IAC3B,UAAU,CAAC,QAAQ;AAAA,EACrB,CAAC;AACH;;;AC/0DA,IAAAC,gBAAkB;AAKX,SAAS,YAA2B;AACzC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,KAAK,cAAc,SAAS,KAAK,aAAa;AAAA,IACvD;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,SAAS;AACnC,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AACvC,UAAI,SAAS,OAAO,KAAK;AACzB,UAAI;AACJ,UAAI;AACF,cAAM,MAAM,cAAAC,QAAM,UAAU,MAAM,gBAAgB,IAAI,IAAI,CAAC;AAAA,MAC7D,SAAS,OAAO;AACd,cAAM,OAAO,kBAAkB,IAAI,KAAK,MAAM,KAAK,kBAAkB,KAAK,CAAC,CAAC;AAC5E,eAAO;AAAA,UACL,UAAU;AACR,kBAAM,OAAO;AACb,4BAAgB,KAAK,UAAU;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,OAAO,OAAO,IAAI,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG;AACrE,YAAM,gBAA0B,CAAC;AAEjC,UAAI;AACF,mBAAW,SAAS,QAAQ,OAAO,CAAC,SAAS,KAAK,KAAK,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,GAAG;AACrF,gBAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AACpC,gBAAM,UAAU,CAAC,GAAG,IAAI,SAAS,gBAAgB,CAAC,EAC/C,IAAI,CAAC,UAAU,MAAM,CAAC,GAAG,KAAK,CAAC,EAC/B,OAAO,OAAO;AACjB,wBAAc,KAAK,GAAG,OAAO;AAAA,QAC/B;AAAA,MACF,SAAS,OAAO;AACd,cAAM,OAAO,kBAAkB,IAAI,KAAK,MAAM,KAAK,kBAAkB,KAAK,CAAC,CAAC;AAC5E,eAAO;AAAA,UACL,UAAU;AACR,kBAAM,OAAO;AACb,4BAAgB,KAAK,UAAU;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,cAAc,OAAO;AAC1C,YAAM,QAAQ,MAAM,aAAa,SAAS,MAAM;AAChD,YAAM,UAAU,cAAc,8BAAU;AACxC,YAAM,OAAO,SAAS,cAAc,GAAG;AACvC,WAAK,cAAc,MAAM,SAAS,IAC9B,0XACA;AACJ,cAAQ,OAAO,IAAI;AACnB,cAAQ,OAAO,iBAAiB,SAAS,OAAO,MAAM,CAAC;AAEvD,UAAI,MAAM,SAAS,GAAG;AACpB,cAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,kBAAU,YAAY;AACtB,mBAAW,QAAQ,OAAO;AACxB,oBAAU,OAAO,cAAc,IAAI,CAAC;AAAA,QACtC;AACA,gBAAQ,OAAO,SAAS;AAAA,MAC1B;AAEA,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AACpB,cAAQ,cAAc,cAAc,MAAM,GAAG,GAAG,EAAE,KAAK,IAAI,KAAK;AAChE,cAAQ,OAAO,OAAO;AAEtB,YAAM,OAAO,cAAc,4BAAQ,QAAQ,MAAM,EAAE;AACnD,YAAM,KAAK,SAAS,cAAc,IAAI;AACtC,iBAAW,SAAS,QAAQ,MAAM,GAAG,GAAG,GAAG;AACzC,cAAM,KAAK,SAAS,cAAc,IAAI;AACtC,WAAG,cAAc,MAAM;AACvB,WAAG,OAAO,EAAE;AAAA,MACd;AACA,WAAK,OAAO,EAAE;AACd,YAAM,OAAO,SAAS,IAAI;AAE1B,aAAO;AAAA,QACL,UAAU;AACR,gBAAM,OAAO;AACb,0BAAgB,KAAK,UAAU;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAqDA,SAAS,iBAAiB,SAA8B,OAAyB,QAA0C;AACzH,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,aAAa,QAAQ,OAAO,CAAC,UAAU,MAAM,KAAK,SAAS,MAAM,CAAC,EAAE;AAC1E,QAAM,YAAY,MAAM,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,MAAM,QAAQ,CAAC;AAC5E,QAAM,YAAY,MAAM,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,MAAM,QAAQ,CAAC;AAC5E,QAAM,YAAY,MAAM,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,MAAM,QAAQ,CAAC;AAC5E,QAAM,aAAa,MAAM,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,OAAO,QAAQ,CAAC;AAC9E,QAAM,aAAa,MAAM,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,MAAM,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,KAAK,QAAQ,CAAC,GAAG,CAAC;AAC3H,mBAAiB,SAAS,gBAAM,OAAO,QAAQ,MAAM,CAAC;AACtD,mBAAiB,SAAS,OAAO,OAAO,UAAU,CAAC;AACnD,mBAAiB,SAAS,gBAAM,OAAO,MAAM,MAAM,CAAC;AACpD,mBAAiB,SAAS,gBAAM,OAAO,SAAS,CAAC;AACjD,mBAAiB,SAAS,gBAAM,OAAO,SAAS,CAAC;AACjD,mBAAiB,SAAS,gBAAM,OAAO,SAAS,CAAC;AACjD,mBAAiB,SAAS,4BAAQ,OAAO,UAAU,CAAC;AACpD,mBAAiB,SAAS,4BAAQ,OAAO,wBAAwB,MAAM,CAAC,CAAC;AACzE,MAAI,aAAa,GAAG;AAClB,qBAAiB,SAAS,4BAAQ,OAAO,UAAU,CAAC;AAAA,EACtD;AACA,QAAM,QAAQ,mBAAmB,KAAK;AACtC,MAAI,OAAO;AACT,qBAAiB,SAAS,4BAAQ,KAAK;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAAqB,OAAe,OAAqB;AACjF,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,OAAK,OAAO,KAAK,OAAO;AACxB,SAAO,OAAO,IAAI;AACpB;AAEA,SAAS,wBAAwB,QAAqC;AACpE,SAAO,IAAI,IAAI,OAAO,OAAO,CAAC,EAAE;AAClC;AAEA,SAAS,mBAAmB,OAAiC;AAC3D,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,GAAG,KAAK,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,MAAM,KAAK,MAAM,CAAC;AAClE,WAAO,IAAI,MAAM,OAAO,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,EAC5C;AACA,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,MAAM,KAAK,MAAO,QAAQ,IAAI,GAAG,IAAI,KAAK,KAAK,MAAM,IAAK,EAChE,KAAK,IAAI;AACd;AAEA,eAAe,aACb,SACA,QAC2B;AAC3B,QAAM,QAA0B,CAAC;AACjC,QAAM,cAAc,QACjB,OAAO,CAAC,UAAU,0CAA0C,KAAK,MAAM,IAAI,KAAK,mCAAmC,KAAK,MAAM,IAAI,CAAC,EACnI,MAAM,GAAG,EAAE;AACd,aAAW,SAAS,aAAa;AAC/B,UAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AACpC,UAAM,OAAO,aAAa,MAAM,MAAM,KAAK,MAAM;AACjD,QAAI,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,OAAO,SAAS,GAAG;AACrG,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,MAAc,KAAa,QAA6C;AAC5F,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,WAAO,EAAE,MAAM,OAAO,KAAK,QAAQ,KAAK,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EACtF;AACA,QAAM,WAAW,iBAAiB,GAAG;AACrC,QAAM,cAAc,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,QAAQ,cAAc,YAAY;AACpH,QAAM,QAAQ,YAAY,QAAQ,CAAC,YAAY,mBAAmB,OAAO,CAAC;AAC1E,QAAM,QAAQ,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EACnD,OAAO,CAAC,YAAY,QAAQ,cAAc,YAAY,EACtD,QAAQ,CAAC,YAAY,mBAAmB,OAAO,CAAC;AACnD,QAAM,QAAQ,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EACnD,OAAO,CAAC,YAAY,QAAQ,cAAc,YAAY,EACtD,QAAQ,CAAC,YAAY,mBAAmB,OAAO,CAAC;AACnD,QAAM,eAAe,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAC1D,OAAO,CAAC,YAAY,QAAQ,cAAc,aAAa,EACvD,QAAQ,CAAC,YAAY,oBAAoB,SAAS,MAAM,CAAC;AAC5D,QAAM,SAAS;AAAA,IACb,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,EAAE;AAAA,IACzF,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,EAAE;AAAA,IACzF,GAAG,MAAM,IAAI,CAAC,UAAU;AAAA,MACtB,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE;AAAA,MAC5B,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE;AAAA,MAC5B,OAAO,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE;AAAA,MACjC,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE;AAAA,IACpC,EAAE;AAAA,IACF,GAAG,aAAa,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,EAAE;AAAA,EAClG;AACA,QAAM,QAAQ,KAAK,IAAI,SAAS,OAAO,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,KAAK,QAAQ,EAAE,CAAC;AACxF,QAAM,SAAS,KAAK,IAAI,SAAS,QAAQ,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,KAAK,SAAS,EAAE,CAAC;AAC3F,SAAO,EAAE,MAAM,OAAO,QAAQ,OAAO,OAAO,OAAO,QAAQ,aAAa;AAC1E;AAEA,SAAS,mBAAmB,SAAmC;AAC7D,QAAM,WAAW,cAAc,gBAAgB,SAAS,UAAU,CAAC;AACnE,QAAM,OAAOC,cAAa,gBAAgB,SAAS,MAAM,GAAG,KAAK,IAAI,GAAG,SAAS,UAAU,CAAC,CAAC;AAC7F,QAAM,QAAQ,cAAc,SAAS,SAAS;AAC9C,QAAM,SAASA,cAAa,gBAAgB,SAAS,QAAQ,GAAG,GAAG,KAAK,MAAM,QAAQ;AACtF,QAAM,gBAAgB,gBAAgB,SAAS,QAAQ,IAAI,MAAM;AACjE,QAAM,YAAY,MAAM,KAAK,QAAQ,qBAAqB,GAAG,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,cAAc,UAAU;AAChH,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO,CAAC;AAAA,EACV;AACA,SAAO,UAAU,IAAI,CAAC,SAAS;AAC7B,UAAM,IAAI,SAAS,IAAIA,cAAa,gBAAgB,MAAM,GAAG,GAAG,CAAC;AACjE,UAAM,IAAI,SAAS,IAAIA,cAAa,gBAAgB,MAAM,GAAG,GAAG,CAAC;AACjE,WAAO;AAAA,MACL,MAAM,KAAK,aAAa,KAAK,KAAK;AAAA,MAClC;AAAA,MACA;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC,EAAE,OAAO,CAAC,SAAS,KAAK,IAAI;AAC/B;AAEA,SAAS,mBAAmB,SAAmC;AAC7D,QAAM,WAAW,cAAc,gBAAgB,SAAS,UAAU,CAAC;AACnE,QAAM,WAAW,MAAM,KAAK,QAAQ,qBAAqB,GAAG,CAAC,EAAE;AAAA,IAC7D,CAAC,UAAU,MAAM,cAAc,qBAAqB,MAAM,cAAc;AAAA,EAC1E;AACA,QAAM,MAAM,SAAS,IAAI,CAAC,UAAU,MAAM,eAAe,EAAE,EAAE,KAAK,GAAG,EAAE,KAAK;AAC5E,MAAI,CAAC,KAAK;AACR,WAAO,CAAC;AAAA,EACV;AACA,SAAO;AAAA,IACL;AAAA,MACE,GAAG,qBAAqB,GAAG;AAAA,MAC3B,GAAG,SAAS;AAAA,MACZ,GAAG,SAAS;AAAA,MACZ,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,MACjB,QAAQ,cAAc,SAAS,WAAW,aAAa;AAAA,MACvD,MAAM,aAAa,OAAO;AAAA,MAC1B,aAAaA,cAAa,gBAAgB,SAAS,WAAW,GAAG,CAAC;AAAA,IACpE;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,SAAmC;AAC7D,QAAM,WAAW,cAAc,gBAAgB,SAAS,UAAU,CAAC;AACnE,QAAM,QAAQ,WAAW,gBAAgB,SAAS,YAAY,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AAC/E,QAAM,MAAM,WAAW,gBAAgB,SAAS,UAAU,GAAG;AAAA,IAC3D,GAAG,SAAS;AAAA,IACZ,GAAG,SAAS;AAAA,EACd,CAAC;AACD,SAAO;AAAA,IACL;AAAA,MACE,IAAI,SAAS,IAAI,MAAM;AAAA,MACvB,IAAI,SAAS,IAAI,MAAM;AAAA,MACvB,IAAI,SAAS,IAAI,IAAI;AAAA,MACrB,IAAI,SAAS,IAAI,IAAI;AAAA,MACrB,QAAQ,cAAc,SAAS,SAAS;AAAA,MACxC,aAAaA,cAAa,gBAAgB,SAAS,WAAW,GAAG,CAAC;AAAA,IACpE;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,SAAkB,QAA+C;AAC5F,QAAM,WAAW,cAAc,gBAAgB,SAAS,UAAU,CAAC;AACnE,QAAM,aAAa,gBAAgB,SAAS,YAAY,KAAK,gBAAgB,SAAS,YAAY,KAAK;AACvG,SAAO;AAAA,IACL;AAAA,MACE,GAAG,SAAS;AAAA,MACZ,GAAG,SAAS;AAAA,MACZ,OAAO,SAAS,SAAS;AAAA,MACzB,QAAQ,SAAS,UAAU;AAAA,MAC3B;AAAA,MACA,MAAM,OAAO,IAAI,UAAU;AAAA,IAC7B;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAAmC;AACxD,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,YAAY;AACnB,QAAM,MAAM,SAAS,gBAAgB,8BAA8B,KAAK;AACxE,MAAI,aAAa,WAAW,OAAO,KAAK,KAAK,IAAI,KAAK,MAAM,EAAE;AAC9D,MAAI,aAAa,QAAQ,KAAK;AAC9B,MAAI,aAAa,cAAc,KAAK,IAAI;AAExC,QAAM,QAAQ,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC/D,QAAM,aAAa,KAAK,GAAG;AAC3B,QAAM,aAAa,KAAK,GAAG;AAC3B,QAAM,aAAa,SAAS,OAAO,KAAK,KAAK,CAAC;AAC9C,QAAM,aAAa,UAAU,OAAO,KAAK,MAAM,CAAC;AAChD,QAAM,aAAa,QAAQ,OAAO;AAClC,MAAI,OAAO,KAAK;AAEhB,aAAW,QAAQ,KAAK,QAAQ;AAC9B,QAAI,KAAK,MAAM;AACb,YAAM,QAAQ,SAAS,gBAAgB,IAAI,cAAc,OAAO;AAChE,YAAM,aAAa,KAAK,OAAO,KAAK,CAAC,CAAC;AACtC,YAAM,aAAa,KAAK,OAAO,KAAK,CAAC,CAAC;AACtC,YAAM,aAAa,SAAS,OAAO,KAAK,KAAK,CAAC;AAC9C,YAAM,aAAa,UAAU,OAAO,KAAK,MAAM,CAAC;AAChD,YAAM,aAAa,QAAQ,KAAK,IAAI;AACpC,YAAM,aAAa,uBAAuB,eAAe;AACzD,UAAI,OAAO,KAAK;AAAA,IAClB,OAAO;AACL,YAAM,cAAc,SAAS,gBAAgB,IAAI,cAAc,MAAM;AACrE,kBAAY,aAAa,KAAK,OAAO,KAAK,CAAC,CAAC;AAC5C,kBAAY,aAAa,KAAK,OAAO,KAAK,CAAC,CAAC;AAC5C,kBAAY,aAAa,SAAS,OAAO,KAAK,KAAK,CAAC;AACpD,kBAAY,aAAa,UAAU,OAAO,KAAK,MAAM,CAAC;AACtD,kBAAY,aAAa,QAAQ,SAAS;AAC1C,kBAAY,aAAa,UAAU,SAAS;AAC5C,kBAAY,aAAa,oBAAoB,KAAK;AAClD,UAAI,OAAO,WAAW;AAAA,IACxB;AAAA,EACF;AAEA,aAAW,QAAQ,KAAK,OAAO;AAC7B,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,SAAK,aAAa,KAAK,KAAK,CAAC;AAC7B,SAAK,aAAa,aAAa,aAAa,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG;AAC/D,SAAK,aAAa,QAAQ,KAAK,IAAI;AACnC,SAAK,aAAa,UAAU,KAAK,MAAM;AACvC,SAAK,aAAa,gBAAgB,OAAO,KAAK,WAAW,CAAC;AAC1D,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA,aAAW,QAAQ,KAAK,OAAO;AAC7B,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,SAAK,aAAa,MAAM,OAAO,KAAK,EAAE,CAAC;AACvC,SAAK,aAAa,MAAM,OAAO,KAAK,EAAE,CAAC;AACvC,SAAK,aAAa,MAAM,OAAO,KAAK,EAAE,CAAC;AACvC,SAAK,aAAa,MAAM,OAAO,KAAK,EAAE,CAAC;AACvC,SAAK,aAAa,UAAU,KAAK,MAAM;AACvC,SAAK,aAAa,gBAAgB,OAAO,KAAK,WAAW,CAAC;AAC1D,SAAK,aAAa,kBAAkB,OAAO;AAC3C,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA,aAAW,QAAQ,KAAK,OAAO;AAC7B,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,SAAK,aAAa,KAAK,OAAO,KAAK,CAAC,CAAC;AACrC,SAAK,aAAa,KAAK,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;AACjD,SAAK,aAAa,aAAa,OAAO,KAAK,IAAI,CAAC;AAChD,SAAK,aAAa,QAAQ,KAAK,KAAK;AACpC,SAAK,aAAa,eAAe,KAAK,MAAM;AAC5C,QAAI,KAAK,kBAAkB,QAAW;AACpC,WAAK,aAAa,kBAAkB,OAAO,KAAK,aAAa,CAAC;AAAA,IAChE;AACA,SAAK,cAAc,KAAK;AACxB,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA,QAAM,UAAU,SAAS,cAAc,YAAY;AACnD,UAAQ,cAAc,GAAG,KAAK,IAAI,SAAM,KAAK,MAAM,MAAM,cAAW,KAAK,MAAM,MAAM,cAAW,KAAK,MAAM,MAAM,cAAW,KAAK,OAAO,MAAM;AAC9I,SAAO,OAAO,KAAK,OAAO;AAC1B,SAAO;AACT;AAEA,eAAe,cAAc,SAA4D;AACvF,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,SAAS,QAAQ,OAAO,CAAC,SAAS,iCAAiC,KAAK,KAAK,IAAI,CAAC,EAAE,MAAM,GAAG,EAAE,GAAG;AAC3G,UAAM,KAAK,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,QAAQ,YAAY,EAAE,KAAK,MAAM;AACzE,UAAM,WAAWC,kBAAiB,MAAM,IAAI;AAC5C,QAAI,CAAC,SAAS,WAAW,QAAQ,GAAG;AAClC;AAAA,IACF;AACA,UAAM,SAAS,MAAM,MAAM,MAAM,QAAQ;AACzC,UAAM,OAAO,QAAQ,QAAQ,WAAW,MAAM;AAC9C,WAAO,IAAI,IAAI,IAAI;AACnB,WAAO,IAAI,MAAM,MAAM,IAAI;AAC3B,WAAO,IAAI,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,MAAM,MAAM,IAAI;AAAA,EAC5D;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,KAAkD;AAC1E,QAAM,cAAc,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAAE,KAAK,CAAC,YAAY,QAAQ,cAAc,aAAa;AACnH,MAAI,aAAa,aAAa;AAC5B,UAAM,MAAM,cAAc,YAAY,WAAW;AACjD,QAAI,IAAI,QAAQ,KAAK,IAAI,SAAS,GAAG;AACnC,aAAO,EAAE,OAAO,IAAI,OAAO,QAAQ,IAAI,OAAO;AAAA,IAChD;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK,QAAQ,IAAI;AACnC;AAEA,SAAS,cAAc,SAAkB,UAAkB,qBAAqB,aAAqB;AACnG,QAAM,eAAe,aAAa,SAAS,kBAAkB,KAAK,aAAa,SAAS,aAAa,KAAK,aAAa,SAAS,WAAW;AAC3I,QAAM,QAAQ,eAAe,gBAAgB,cAAc,OAAO,IAAI;AACtE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,MAAM,KAAK,EAAE,MAAM,KAAK,EAAE,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAClE,MAAI,MAAM,UAAU,KAAK,MAAM,MAAM,CAAC,SAAS,OAAO,SAAS,IAAI,CAAC,GAAG;AACrE,WAAO,OAAO,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,EAC3F;AACA,SAAO;AACT;AAEA,SAAS,aAAa,SAA0B;AAC9C,QAAM,cAAc,aAAa,SAAS,WAAW;AACrD,SAAO,cAAc,cAAc,SAAS,eAAe,WAAW,IAAI;AAC5E;AAEA,SAAS,aAAa,SAAkB,WAAwC;AAC9E,SAAO,MAAM,KAAK,QAAQ,QAAQ,EAAE,KAAK,CAAC,UAAU,MAAM,cAAc,SAAS;AACnF;AAEA,SAAS,WAAW,OAAsB,UAA8D;AACtG,QAAM,SAAS,SAAS,IAAI,KAAK,EAAE,MAAM,KAAK,EAAE,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAC1E,SAAO;AAAA,IACL,GAAG,OAAO,SAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,SAAS;AAAA,IACnD,GAAG,OAAO,SAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,SAAS;AAAA,EACrD;AACF;AAEA,SAAS,qBAAqB,OAAuB;AACnD,SAAO,MACJ,QAAQ,YAAY,IAAI,EACxB,QAAQ,YAAY,IAAI,EACxB,QAAQ,YAAY,IAAI,EACxB,QAAQ,YAAY,IAAI,EACxB,QAAQ,YAAY,IAAI,EACxB,QAAQ,YAAY,IAAI,EACxB,QAAQ,WAAW,GAAG,EACtB,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAEA,SAASA,kBAAiB,MAAsB;AAC9C,QAAM,YAAY,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AACrD,QAAM,MAA8B;AAAA,IAClC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AACA,SAAO,YAAY,IAAI,SAAS,KAAK,6BAA6B;AACpE;AAEA,SAAS,cAAc,OAA+E;AACpG,QAAM,SAAS,SAAS,IAAI,KAAK,EAAE,MAAM,KAAK,EAAE,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAC1E,SAAO;AAAA,IACL,GAAG,OAAO,SAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI;AAAA,IAC1C,GAAG,OAAO,SAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI;AAAA,IAC1C,OAAO,OAAO,SAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI;AAAA,IAC9C,QAAQ,OAAO,SAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI;AAAA,EACjD;AACF;AAEA,SAAS,gBAAgB,SAAkB,WAAkC;AAC3E,QAAM,SAAS,QAAQ,aAAa,SAAS;AAC7C,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AACA,aAAW,aAAa,MAAM,KAAK,QAAQ,UAAU,GAAG;AACtD,QAAI,UAAU,cAAc,WAAW;AACrC,aAAO,UAAU;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASD,cAAa,OAAsB,UAA0B;AACpE,QAAM,SAAS,UAAU,OAAO,OAAO,MAAM,OAAO,KAAK;AACzD,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,kBAAkB,UAAkB,KAAa,QAA6B;AACrF,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AAErB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AAEpB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc,GAAG,MAAM,4BAAQ,QAAQ;AAE5C,QAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,WAAS,OAAO;AAChB,WAAS,WAAW;AACpB,WAAS,cAAc;AAEvB,WAAS,OAAO,OAAO,MAAM,QAAQ;AACrC,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAwB;AACjD,MAAI,iBAAiB,SAAS,MAAM,SAAS;AAC3C,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AACT;;;ACviBA,IAAAE,gBAAkB;AAClB,kBAAiB;AAOjB,IAAM,oBAAoB,oBAAI,IAAI,CAAC,OAAO,OAAO,MAAM,OAAO,MAAM,OAAO,OAAO,IAAI,CAAC;AACvF,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,uBAA+C;AAAA,EACnD,mBAAmB;AAAA,EACnB,gCAAgC;AAAA,EAChC,uBAAuB;AAAA,EACvB,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,oBAAoB;AACtB;AAmBO,SAAS,gBAA+B;AAC7C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,kBAAkB,IAAI,KAAK,SAAS,KAAK,iBAAiB,IAAI,KAAK,QAAQ;AAAA,IACpF;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AACvC,YAAM,QAAQ,YAAY,aAAa;AACvC,UAAI,SAAS,OAAO,KAAK;AAEzB,YAAM,MAAM,cAAc,IAAI,MAAM,oBAAoB,EAAE,YAAY;AACtE,UAAI,iBAAiC,CAAC;AACtC,UAAI,cAAc;AAClB,UAAI,aAA4B;AAChC,UAAI,eAAoC;AAGxC,UAAI;AACF,YAAI,QAAQ,OAAO;AACjB,cAAI;AACF,kBAAM,MAAM,MAAM,cAAAC,QAAM,UAAU,MAAM,gBAAgB,IAAI,IAAI,CAAC;AACjE,6BAAiB,OAAO,OAAO,IAAI,KAAK,EAAE,IAAI,CAAC,WAAW;AAAA,cACxD,MAAM,MAAM;AAAA,cACZ,YAAa,MAAc;AAAA,cAC3B,MAAO,MAAc,OAAO,oBAAoB;AAAA,cAChD,KAAK,MAAM;AAAA,cACX,MAAM,MAAM,MAAM,MAAM,aAAa;AAAA,YACvC,EAAE;AAAA,UACJ,SAAS,QAAa;AAEpB,gBACE,OAAO,YACN,OAAO,QAAQ,SAAS,WAAW,KAClC,OAAO,QAAQ,SAAS,UAAU,KAClC,OAAO,QAAQ,SAAS,WAAW,IACrC;AACA,4BAAc;AAAA,YAChB,OAAO;AACL,oBAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF,WAAW,QAAQ,OAAO;AACxB,2BAAiB,MAAM,MAAM,gBAAgB,IAAI,IAAI,CAAC;AAAA,QACxD,WAAW,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,UAAU;AAC5D,gBAAM,KAAK,IAAI,WAAW,MAAM,gBAAgB,IAAI,IAAI,CAAC;AACzD,gBAAM,eAAe,YAAAC,QAAK,OAAO,EAAE;AACnC,gBAAM,eAAe,IAAI,KAAK,KAAK,SAAS,KAAK,IAC7C,IAAI,KAAK,KAAK,MAAM,GAAG,EAAE,IACzB,IAAI,KAAK,KAAK,SAAS,MAAM,IAC7B,IAAI,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,SAC7B,IAAI,KAAK;AAEb,cAAI,QAAQ,SAAS,QAAQ,YAAY,aAAa,SAAS,MAAM,GAAG;AACtE,6BAAiB,MAAM,aAAa,MAAM;AAAA,UAC5C,OAAO;AAEL,6BAAiB;AAAA,cACf;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,aAAa;AAAA,gBACnB,KAAK;AAAA,gBACL,MAAM,YAAY,aAAa;AAAA,cACjC;AAAA,YACF;AAAA,UACF;AAAA,QACF,WAAW,CAAC,OAAO,MAAM,OAAO,IAAI,EAAE,SAAS,GAAG,GAAG;AACnD,yBAAe,mBAAmB,MAAM,gBAAgB,IAAI,IAAI,GAAG,GAAG;AAAA,QACxE,OAAO;AACL,uBAAa,wBAAS,IAAI,YAAY,CAAC;AAAA,QACzC;AAAA,MACF,SAAS,KAAU;AACjB,qBAAa,mDAAW,IAAI,WAAW,GAAG;AAAA,MAC5C;AAGA,UAAI,aAAa;AACf,cAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,iBAAS,YAAY;AAErB,cAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,cAAM,cAAc;AAEpB,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,cAAc;AAEnB,cAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,iBAAS,OAAO;AAChB,iBAAS,WAAW,IAAI,KAAK;AAC7B,iBAAS,cAAc;AAEvB,iBAAS,OAAO,OAAO,MAAM,QAAQ;AACrC,cAAM,OAAO,QAAQ;AACrB,YAAI,SAAS,UAAU,IAAI,YAAY;AAEvC,eAAO;AAAA,UACL,UAAU;AACR,gBAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,4BAAgB,KAAK,UAAU;AAC/B,kBAAM,OAAO;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,2BAAmB,OAAO,cAAc,IAAI,KAAK,MAAM,GAAG;AAC1D,eAAO;AAAA,UACL,UAAU;AACR,4BAAgB,KAAK,UAAU;AAC/B,kBAAM,OAAO;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAGA,UAAI,YAAY;AACd,cAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,iBAAS,YAAY;AAErB,cAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,cAAM,cAAc;AAEpB,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,cAAc;AAEnB,cAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,iBAAS,OAAO;AAChB,iBAAS,WAAW,IAAI,KAAK;AAC7B,iBAAS,cAAc;AAEvB,iBAAS,OAAO,OAAO,MAAM,QAAQ;AACrC,cAAM,OAAO,QAAQ;AACrB,YAAI,SAAS,UAAU,IAAI,YAAY;AAEvC,eAAO;AAAA,UACL,UAAU;AACR,gBAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,4BAAgB,KAAK,UAAU;AAC/B,kBAAM,OAAO;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAGA,YAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,aAAO,YAAY;AAEnB,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AAEpB,YAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,aAAO,YAAY;AACnB,aAAO,cAAc,6BAAS,eAAe,OAAO,OAAK,CAAC,EAAE,GAAG,EAAE,MAAM;AACvE,cAAQ,OAAO,MAAM;AAErB,YAAM,OAAO,SAAS,cAAc,KAAK;AACzC,WAAK,YAAY;AACjB,cAAQ,OAAO,IAAI;AAEnB,YAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,gBAAU,YAAY;AAEtB,aAAO,OAAO,SAAS,SAAS;AAChC,YAAM,OAAO,MAAM;AAEnB,UAAI,qBAA0B;AAG9B,YAAM,qBAAqB,MAAM;AAC/B,kBAAU,gBAAgB;AAC1B,cAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,gBAAQ,YAAY;AAEpB,cAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,gBAAQ,cAAc,IAAI,KAAK;AAE/B,cAAM,OAAO,SAAS,cAAc,KAAK;AACzC,aAAK,YAAY;AAEjB,cAAM,YAAY,eAAe,OAAO,OAAK,CAAC,EAAE,GAAG,EAAE;AACrD,cAAM,WAAW,eAAe,OAAO,OAAK,EAAE,GAAG,EAAE;AAEnD,0BAAkB,MAAM,4BAAQ,IAAI,IAAI,YAAY,CAAC,2BAAO;AAC5D,0BAAkB,MAAM,kCAAS,GAAG,SAAS,SAAI;AACjD,0BAAkB,MAAM,kCAAS,GAAG,QAAQ,SAAI;AAChD,0BAAkB,MAAM,4BAAQ,wGAAmB;AAEnD,gBAAQ,OAAO,SAAS,MAAM,qBAAqB,cAAc,CAAC;AAClE,kBAAU,OAAO,OAAO;AAAA,MAC1B;AAEA,yBAAmB;AAGnB,YAAM,iBAAiB,eAAe,OAAO,OAAK,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG;AACtE,UAAI,YAAY;AAChB,UAAI,cAAc;AAElB,qBAAe,QAAQ,CAAC,UAAU;AAChC,cAAM,OAAO,SAAS,cAAc,QAAQ;AAC5C,aAAK,YAAY;AACjB,aAAK,OAAO;AACZ,aAAK,QAAQ,MAAM;AAEnB,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,YAAY;AACjB,aAAK,cAAc,QAAQ,MAAM,MAAM,MAAM,GAAG;AAEhD,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,YAAY;AACjB,aAAK,cAAc,MAAM;AACzB,aAAK,QAAQ,MAAM;AAEnB,aAAK,OAAO,MAAM,IAAI;AACtB,aAAK,OAAO,IAAI;AAEhB,aAAK,iBAAiB,SAAS,YAAY;AACzC,cAAI,WAAW;AACb;AAAA,UACF;AACA,gBAAM,QAAQ,EAAE;AAEhB,kBAAQ,iBAAiB,mBAAmB,EAAE,QAAQ,CAAC,OAAO;AAC5D,eAAG,UAAU,OAAO,WAAW;AAC/B,eAAG,gBAAgB,cAAc;AAAA,UACnC,CAAC;AACD,eAAK,UAAU,IAAI,WAAW;AAC9B,eAAK,aAAa,gBAAgB,MAAM;AAGxC,cAAI,oBAAoB;AACtB,+BAAmB,QAAQ;AAC3B,iCAAqB;AAAA,UACvB;AAGA,oBAAU,gBAAgB,qBAAqB,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC;AAEzF,cAAI;AACF,gBAAI,SAAS,MAAM,MAAM,KAAK;AAC9B,gBAAI,aAAa,UAAU,aAAa;AACtC;AAAA,YACF;AACA,kBAAM,UAAU,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,MAAM;AACrD,kBAAM,SAAS,QAAQ,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY,KAAK;AAI1D,gBAAI,WAAW,OAAO;AACpB,oBAAM,WAAW,MAAM,KAAK,MAAM,GAAG,EAAE;AACvC,oBAAM,WAAW,eAAe;AAAA,gBAC9B,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,SAAS,YAAY,IAAI;AAAA,cAC3D;AACA,oBAAM,WAAW,eAAe;AAAA,gBAC9B,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,SAAS,YAAY,IAAI;AAAA,cAC3D;AACA,kBAAI,YAAY,UAAU;AACxB,sBAAM,WAAW,eAAe;AAAA,kBAC9B,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,SAAS,YAAY,IAAI;AAAA,gBAC3D;AACA,sBAAM,SAAS,IAAI,cAAAD,QAAM;AACzB,uBAAO,KAAK,SAAS,MAAM;AAC3B,uBAAO,KAAK,SAAS,KAAK,MAAM,GAAG,EAAE,IAAI,GAAI,MAAM,SAAS,KAAK,CAAC;AAClE,uBAAO,KAAK,SAAS,KAAK,MAAM,GAAG,EAAE,IAAI,GAAI,MAAM,SAAS,KAAK,CAAC;AAClE,oBAAI,UAAU;AACZ,yBAAO,KAAK,SAAS,KAAK,MAAM,GAAG,EAAE,IAAI,GAAI,MAAM,SAAS,KAAK,CAAC;AAAA,gBACpE;AACA,yBAAS,MAAM,OAAO,cAAc,EAAE,MAAM,cAAc,CAAC;AAC3D,oBAAI,aAAa,UAAU,aAAa;AACtC;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAEA,kBAAM,eAAe,SAAS,cAAc,KAAK;AACjD,yBAAa,MAAM,UAAU;AAC7B,sBAAU,gBAAgB,YAAY;AAEtC,kBAAM,cAAc,SAAS,cAAc,KAAK;AAChD,wBAAY,YAAY;AACxB,wBAAY,MAAM,UAAU;AAC5B,yBAAa,OAAO,WAAW;AAE/B,kBAAM,UAAuB,MAAM,cAAc,QAAQ,OAAO;AAEhE,kBAAM,UAAU,CAAC,GAAI,IAAI,QAAQ,WAAW,CAAC,GAAI,eAAe,CAAC;AACjE,gBAAI,gBAAgB,MAAM,qBAAqB,SAAS,OAAO;AAC/D,gBAAI,aAAa,UAAU,aAAa;AACtC;AAAA,YACF;AACA,gBAAI,cAAc,SAAS,WAAW;AACpC,8BAAgB,eAAe;AAAA,YACjC;AAEA,gBAAI;AACJ,kBAAM,kBAAkB,MAAM,QAAQ,QAAQ,EAC3C;AAAA,cAAK,MACJ,cAAc,OAAO;AAAA,gBACrB,MAAM,IAAI;AAAA,gBACV,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,MAAM,EAAE,OAAO,YAAY,eAAe,KAAK,QAAQ,YAAY,gBAAgB,IAAI;AAAA,gBACvF,SAAS,IAAI;AAAA,gBACb,YAAY,MAAM;AAAA,gBAAC;AAAA,gBACnB,UAAU,CAAC,QAAQ;AACjB,iCAAe,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACjE,8BAAY,gBAAgB,kBAAkB,wCAAU,aAAa,OAAO,CAAC;AAAA,gBAC/E;AAAA,cACA,CAAC;AAAA,YACH,EACC,MAAM,CAAC,UAAmB;AACzB,6BAAe,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACvE,0BAAY,gBAAgB,kBAAkB,wCAAU,aAAa,OAAO,CAAC;AAC7E,qBAAO;AAAA,YACT,CAAC;AACH,gBAAI,aAAa,UAAU,aAAa;AACtC,+BAAiB,QAAQ;AACzB;AAAA,YACF;AACA,gBAAI,mBAAmB,CAAC,cAAc;AACpC,mCAAqB;AAAA,YACvB,WAAW,iBAAiB;AAC1B,8BAAgB,QAAQ;AAAA,YAC1B;AAAA,UACF,SAAS,KAAU;AACjB,gBAAI,aAAa,UAAU,aAAa;AACtC;AAAA,YACF;AACA,sBAAU,gBAAgB,kBAAkB,wCAAU,OAAO,IAAI,WAAW,GAAG,CAAC,CAAC;AAAA,UACnF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAED,aAAO;AAAA,QACL,OAAO,MAAM;AACX,8BAAoB,SAAS,IAAI;AAAA,QACnC;AAAA,QACA,UAAU;AACR,sBAAY;AACZ,yBAAe;AACf,cAAI,oBAAoB;AACtB,+BAAmB,QAAQ;AAAA,UAC7B;AACA,0BAAgB,KAAK,UAAU;AAC/B,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,qBAAqB,SAA0B,MAA2C;AACvG,aAAW,UAAU,SAAS;AAC5B,QAAI,MAAM,OAAO,MAAM,IAAI,GAAG;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,eAAe;AACxB;AAEA,SAAS,kBAAkB,WAAmB,YAAiC;AAC7E,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AACrB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,SAAO,cAAc;AACrB,WAAS,OAAO,OAAO,MAAM;AAC7B,SAAO;AACT;AAEA,SAAS,kBAAkB,QAAqB,OAAe,OAAqB;AAClF,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,MAAI,cAAc,GAAG,KAAK;AAC1B,MAAI,OAAO,KAAK,SAAS,eAAe,KAAK,CAAC;AAC9C,SAAO,OAAO,GAAG;AACnB;AAEA,SAAS,qBAAqB,SAAsC;AAClE,QAAM,QAAQ,QAAQ,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG;AAClD,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,UAAQ,YAAY;AACpB,QAAM,YAAY,MAAM,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,MAAM,CAAC;AAClE,QAAM,UAAU,MAAM,OAAiC,CAAC,SAAS,UAAW,CAAC,WAAW,MAAM,OAAO,QAAQ,OAAO,QAAQ,SAAU,MAAS;AAC/I,uBAAqB,SAAS,kCAASE,aAAY,SAAS,CAAC;AAC7D,uBAAqB,SAAS,4BAAQ,UAAU,GAAG,QAAQ,IAAI,SAAMA,aAAY,QAAQ,IAAI,CAAC,KAAK,QAAG;AACtG,uBAAqB,SAAS,4BAAQ,wBAAwB,KAAK,CAAC;AACpE,uBAAqB,SAAS,kCAAS,OAAO,MAAM,MAAM,GAAG,GAAG,EAAE,MAAM,CAAC;AACzE,uBAAqB,SAAS,4BAAQ,OAAO,MAAM,OAAO,CAAC,UAAU,mBAAmB,MAAM,cAAc,MAAM,IAAI,CAAC,EAAE,MAAM,CAAC;AAChI,SAAO;AACT;AAEA,SAAS,qBAAqB,QAAqB,OAAe,OAAqB;AACrF,QAAM,MAAM,SAAS,cAAc,IAAI;AACvC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,UAAQ,cAAc;AACtB,SAAO,OAAO,KAAK,OAAO;AAC5B;AAEA,SAAS,wBAAwB,SAAiC;AAChE,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,SAAS,SAAS;AAC3B,UAAM,OAAO,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,MAAM;AAClD,UAAM,QAAQ,KAAK,YAAY,GAAG;AAClC,UAAM,YAAY,QAAQ,IAAI,KAAK,MAAM,QAAQ,CAAC,EAAE,YAAY,IAAI;AACpE,WAAO,IAAI,YAAY,OAAO,IAAI,SAAS,KAAK,KAAK,CAAC;AAAA,EACxD;AACA,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EACtD,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM,GAAG,SAAS,IAAI,KAAK,EAAE,EACnD,KAAK,IAAI,KAAK;AACnB;AAEA,SAAS,mBAAmB,MAAuB;AACjD,SAAO,KAAK,WAAW,GAAG,KAAK,kBAAkB,KAAK,IAAI,KAAK,KAAK,MAAM,QAAQ,EAAE,SAAS,IAAI;AACnG;AAEA,SAAS,qBAAqB,UAA+B;AAC3D,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc,+CAAY,QAAQ;AACvC,UAAQ,OAAO,SAAS,IAAI;AAC5B,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAoB,OAAqB,UAAkB,KAAmB;AACxG,QAAM,UAAU,cAAc,GAAG,MAAM,MAAM,2BAAO;AACpD,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cAAc,MAAM;AAEzB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,oBAAkB,MAAM,gBAAM,QAAQ;AACtC,oBAAkB,MAAM,gBAAM,MAAM,MAAM;AAC1C,aAAW,QAAQ,MAAM,MAAM;AAC7B,sBAAkB,MAAM,KAAK,OAAO,KAAK,KAAK;AAAA,EAChD;AAEA,QAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,WAAS,YAAY;AACrB,WAAS,OAAO;AAChB,WAAS,WAAW;AACpB,WAAS,cAAc;AAEvB,UAAQ,OAAO,MAAM,MAAM,QAAQ;AAEnC,MAAI,CAAC,MAAM,OAAO;AAChB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,MAAM,SAAS;AACnC,YAAQ,OAAO,KAAK;AAAA,EACtB;AAEA,MAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AACpB,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,eAAW,SAAS,CAAC,gBAAM,4BAAQ,0BAAM,GAAG;AAC1C,YAAM,KAAK,SAAS,cAAc,IAAI;AACtC,SAAG,cAAc;AACjB,aAAO,OAAO,EAAE;AAAA,IAClB;AACA,UAAM,OAAO,MAAM;AACnB,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,eAAW,SAAS,MAAM,QAAQ,MAAM,GAAG,GAAG,GAAG;AAC/C,YAAM,KAAK,SAAS,cAAc,IAAI;AACtC,iBAAW,SAAS;AAAA,QAClB,MAAM;AAAA,QACN,MAAM,SAAS,SAAY,iBAAOA,aAAY,MAAM,IAAI;AAAA,QACxD,MAAM,eAAe,SAAY,iBAAOA,aAAY,MAAM,UAAU;AAAA,MACtE,GAAG;AACD,cAAM,KAAK,SAAS,cAAc,IAAI;AACtC,WAAG,cAAc;AACjB,WAAG,OAAO,EAAE;AAAA,MACd;AACA,YAAM,OAAO,EAAE;AAAA,IACjB;AACA,UAAM,OAAO,OAAO,KAAK;AACzB,YAAQ,OAAO,KAAK;AACpB,YAAQ,OAAO,OAAO;AAAA,EACxB;AAEA,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,mBAAmB,aAA0B,WAAiC;AACrF,QAAM,QAAQ,IAAI,WAAW,WAAW;AACxC,MAAI,cAAc,OAAO;AACvB,WAAO,SAAS,KAAK;AAAA,EACvB;AACA,MAAI,cAAc,MAAM;AACtB,WAAO,QAAQ,KAAK;AAAA,EACtB;AACA,MAAI,cAAc,OAAO;AACvB,WAAO,WAAW,KAAK;AAAA,EACzB;AACA,MAAI,cAAc,MAAM;AACtB,WAAO,QAAQ,KAAK;AAAA,EACtB;AACA,SAAO;AAAA,IACL,QAAQ,UAAU,YAAY;AAAA,IAC9B,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM,CAAC;AAAA,IACP,SAAS,CAAC;AAAA,IACV,MAAM;AAAA,EACR;AACF;AAEA,SAAS,SAAS,OAAiC;AACjD,QAAM,OAAO,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,KAAQ,MAAM,CAAC,MAAM;AAC7K,QAAM,OAAO,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,KAAQ,MAAM,CAAC,MAAM,KAAQ,MAAM,CAAC,MAAM;AAClM,QAAM,UAAU,OAAO,iBAAiB,KAAK,IAAI,CAAC;AAClD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ,OAAO,SAAY;AAAA,IAClC,MAAM;AAAA,MACJ,EAAE,OAAO,gBAAM,OAAO,OAAO,SAAS,OAAO,SAAS,eAAK;AAAA,MAC3D,EAAE,OAAO,gBAAM,OAAO,cAAc,KAAK,EAAE;AAAA,MAC3C,EAAE,OAAO,4BAAQ,OAAO,OAAO,QAAQ,MAAM,EAAE;AAAA,IACjD;AAAA,IACA;AAAA,IACA,MAAM,OACF,yOACA;AAAA,EACN;AACF;AAEA,SAAS,iBAAiB,OAA4C;AACpE,QAAMC,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,UAAmC,CAAC;AAC1C,MAAI,SAAS;AACb,SAAO,SAAS,KAAK,MAAM,UAAU,QAAQ,SAAS,KAAK;AACzD,UAAM,OAAO,MAAM,SAAS,CAAC;AAC7B,UAAM,QAAQA,MAAK,UAAU,SAAS,GAAG,IAAI;AAC7C,QAAI,aAAaA,MAAK,UAAU,SAAS,GAAG,IAAI;AAChD,QAAI,aAAa,KAAK,SAAS,aAAa,MAAM,QAAQ;AACxD;AAAA,IACF;AACA,SAAK,QAAQ,WAAY,GAAG;AAC1B,UAAI,SAAS,KAAK,MAAM,QAAQ;AAC9B;AAAA,MACF;AACA,oBAAcA,MAAK,UAAU,SAAS,GAAG,IAAI;AAAA,IAC/C;AACA,QAAI,SAAS,OAAQ,SAAS,MAAM,MAAM,QAAQ;AAChD,YAAM,aAAaA,MAAK,UAAU,SAAS,GAAG,IAAI;AAClD,YAAM,eAAeA,MAAK,UAAU,SAAS,IAAI,IAAI;AACrD,YAAM,WAAWA,MAAK,UAAU,SAAS,IAAI,IAAI;AACjD,YAAM,aAAa,SAAS;AAC5B,YAAM,UAAU,KAAK,IAAI,aAAa,UAAU,SAAS,YAAY,MAAM,MAAM;AACjF,YAAM,YAAY,MAAM,MAAM,YAAY,OAAO;AACjD,YAAM,OAAO,IAAI,YAAY,QAAQ,EAAE,OAAO,SAAS,EAAE,QAAQ,SAAS,EAAE;AAC5E,UAAI,MAAM;AACR,gBAAQ,KAAK,EAAE,MAAM,MAAM,cAAc,WAAW,CAAC;AAAA,MACvD;AAAA,IACF;AACA,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,OAAiC;AAChD,QAAM,QAAQ,MAAM,UAAU,MAAM,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM;AAC1J,QAAM,OAA6B,CAAC,EAAE,OAAO,gBAAM,OAAO,cAAc,KAAK,EAAE,CAAC;AAChF,MAAI,OAAO;AACT,UAAMA,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,SAAK,KAAK,EAAE,OAAO,gBAAM,OAAO,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC;AAC3D,SAAK,KAAK,EAAE,OAAO,sBAAsB,OAAO,OAAOC,cAAaD,OAAM,EAAE,CAAC,EAAE,CAAC;AAChF,SAAK,KAAK,EAAE,OAAO,oBAAoB,OAAO,OAAOC,cAAaD,OAAM,EAAE,CAAC,EAAE,CAAC;AAC9E,SAAK,KAAK,EAAE,OAAO,mBAAmB,OAAO,KAAKA,MAAK,UAAU,IAAI,IAAI,EAAE,SAAS,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC;AAAA,EAC3G;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,QAAQ,SAAY;AAAA,IAC3B;AAAA,IACA,SAAS,CAAC;AAAA,IACV,MAAM;AAAA,EACR;AACF;AAEA,SAAS,WAAW,OAAiC;AACnD,QAAM,QAAQ,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,KAAK,MAAQ,MAAM,CAAC,KAAK;AAClI,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,QAAQ,SAAY;AAAA,IAC3B,MAAM;AAAA,MACJ,EAAE,OAAO,gBAAM,OAAO,cAAc,KAAK,EAAE;AAAA,MAC3C,EAAE,OAAO,sBAAO,OAAO,QAAQ,GAAG,OAAO,aAAa,MAAM,CAAC,CAAC,CAAC,UAAU,eAAK;AAAA,IAChF;AAAA,IACA,SAAS,CAAC;AAAA,IACV,MAAM;AAAA,EACR;AACF;AAEA,SAAS,QAAQ,OAAiC;AAChD,QAAM,QAAQ,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM;AACzJ,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,QAAQ,SAAY;AAAA,IAC3B,MAAM;AAAA,MACJ,EAAE,OAAO,gBAAM,OAAO,cAAc,KAAK,EAAE;AAAA,MAC3C,EAAE,OAAO,gBAAgB,OAAO,MAAM,UAAU,IAAI,KAAK,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,MAAM,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,KAAK,eAAK;AAAA,IACnL;AAAA,IACA,SAAS,CAAC;AAAA,IACV,MAAM;AAAA,EACR;AACF;AAEA,SAASC,cAAaD,OAAgB,QAAwB;AAC5D,SAAO,OAAOA,MAAK,UAAU,QAAQ,IAAI,CAAC,IAAK,OAAOA,MAAK,UAAU,SAAS,GAAG,IAAI,CAAC,KAAK;AAC7F;AAEA,SAASD,aAAY,OAAuB;AAC1C,MAAI,QAAQ,MAAM;AAChB,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,MAAI,QAAQ,OAAO,MAAM;AACvB,WAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAAA,EACrC;AACA,SAAO,IAAI,QAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC;AAC5C;AAEA,SAAS,cAAc,OAA2B;AAChD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,iBAAiB,GAAG;AACtH,QAAM,MAAM,MAAM,KAAK,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,EAC7D,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,EAC9D,KAAK,GAAG;AACX,SAAO,GAAG,KAAK,KAAK,GAAG;AACzB;AAGA,SAAS,MAAM,aAA0C;AACvD,QAAM,UAA0B,CAAC;AACjC,QAAM,KAAK,IAAI,WAAW,WAAW;AACrC,MAAI,SAAS;AAEb,QAAM,aAAa,CAAC,OAAe,WAA2B;AAC5D,QAAI,MAAM;AACV,WAAO,MAAM,QAAQ,UAAU,GAAG,GAAG,MAAM,GAAG;AAC5C;AAAA,IACF;AACA,WAAO,IAAI,YAAY,EAAE,OAAO,GAAG,SAAS,OAAO,GAAG,CAAC,EAAE,KAAK;AAAA,EAChE;AAEA,SAAO,SAAS,OAAO,YAAY,YAAY;AAC7C,UAAM,QAAQ,WAAW,SAAS,KAAK,CAAC;AACxC,QAAI,UAAU,WAAW,UAAU,WAAW;AAC5C,UAAI,UAAU;AACd,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,YAAI,GAAG,SAAS,CAAC,MAAM,GAAG;AACxB,oBAAU;AACV;AAAA,QACF;AAAA,MACF;AACA,UAAI,SAAS;AACX;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,OAAO,WAAW,QAAQ,GAAG;AACnC,UAAM,SAAS,WAAW,SAAS,KAAK,GAAG;AAC3C,UAAM,WAAW,SAAS,GAAG,MAAM,IAAI,IAAI,KAAK;AAEhD,UAAM,UAAU,WAAW,SAAS,KAAK,EAAE;AAC3C,UAAM,OAAO,SAAS,SAAS,CAAC,KAAK;AACrC,UAAM,WAAW,WAAW,SAAS,KAAK,CAAC;AAC3C,UAAM,MAAM,aAAa,OAAO,SAAS,SAAS,GAAG;AAErD,UAAM,gBAAgB,SAAS;AAC/B,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,MAAM,YAAY,YAAY,MAAM,eAAe,gBAAgB,IAAI;AAAA,IACzE,CAAC;AAED,cAAU,MAAM,KAAK,KAAK,OAAO,GAAG,IAAI;AAAA,EAC1C;AAEA,SAAO;AACT;AAGA,SAAS,QAAQ,MAAc,KAAsB;AACnD,MAAI,IAAK,QAAO;AAChB,QAAM,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AAC/C,UAAQ,KAAK;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;AChyBA,IAAAG,oBAAsB;AAKtB,IAAM,kBAAkB,oBAAI,IAAI,CAAC,OAAO,OAAO,MAAM,CAAC;AACtD,IAAM,iBAAiB,oBAAI,IAAI,CAAC,kBAAkB,8BAA8B,kBAAkB,CAAC;AACnG,IAAM,qBAA6C;AAAA,EACjD,kBAAkB;AAAA,EAClB,8BAA8B;AAAA,EAC9B,oBAAoB;AACtB;AA0BO,SAAS,cAA6B;AAC3C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,gBAAgB,IAAI,KAAK,SAAS,KAAK,eAAe,IAAI,KAAK,QAAQ;AAAA,IAChF;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,WAAW;AACrC,UAAI,SAAS,OAAO,KAAK;AAEzB,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AACvC,YAAM,MAAM,cAAc,IAAI,MAAM,kBAAkB,EAAE,YAAY;AACpE,UAAI;AACJ,YAAM,qBAA+B,CAAC;AACtC,YAAM,uBAAuB,oBAAI,IAA6B;AAC9D,YAAM,gBAA0B,CAAC;AACjC,UAAI,cAAoC,CAAC;AAEzC,UAAI;AACF,YAAI,QAAQ,OAAO;AAEjB,gBAAM,aAAa,MAAM,OAAO,qBAAqB,GAAG;AACxD,gBAAM,SAAS,MAAM,gBAAgB,IAAI,IAAI;AAC7C,gBAAM,SAAS,IAAI,UAAU,MAAM;AACnC,gBAAM,SAAS,OAAO,YAAY;AAElC,cAAI,OAAO,OAAO;AAChB,kBAAM,IAAI,MAAM,OAAO,KAAK;AAAA,UAC9B;AAEA,gBAAM,OAAO,OAAO,aAChB,GAAG,OAAO,UAAU,KAAK,OAAO,eAAe,OAAO,qBAAqB,EAAE,IAAI,KAAK,IACtF,OAAO,eAAe,OAAO,qBAAqB;AAEtD,gBAAM,aAAa,OAAO,cAAc,CAAC;AACzC,gBAAM,KAAK,WACR,OAAO,CAAC,MAAM,EAAE,cAAc,IAAI,EAClC,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,KAAK,CAAC,EACvE,KAAK,IAAI;AACZ,gBAAM,KAAK,WACR,OAAO,CAAC,MAAM,EAAE,cAAc,IAAI,EAClC,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,KAAK,CAAC,EACvE,KAAK,IAAI;AAEZ,gBAAM,cAAiC,CAAC;AACxC,cAAI,MAAM,QAAQ,OAAO,WAAW,GAAG;AACrC,mBAAO,YAAY,QAAQ,CAAC,QAAQ;AAClC,kBAAI;AACF,sBAAM,UAAU,OAAO,cAAc,GAAG;AACxC,4BAAY,KAAK;AAAA,kBACf,MAAM,QAAQ,YAAY;AAAA,kBAC1B,UAAU,sBAAsB,SAAS,GAAG;AAAA,kBAC5C,SAAS,QAAQ;AAAA,kBACjB,WAAW,IAAI;AAAA,gBACjB,CAAC;AAAA,cACH,SAAS,QAAQ;AACf,wBAAQ,KAAK,+BAA+B,MAAM;AAAA,cACpD;AAAA,YACF,CAAC;AAAA,UACH;AAEA,cAAI,WAAW,OAAO;AACtB,cAAI,CAAC,YAAY,OAAO,gBAAgB,YAAY;AAClD,uBAAW,IAAI,YAAY,OAAO,EAAE,OAAO,OAAO,IAAI;AAAA,UACxD;AAEA,sBAAY;AAAA,YACV,MAAM,QAAQ;AAAA,YACd,IAAI,MAAM;AAAA,YACV,IAAI,MAAM;AAAA,YACV,SAAS,OAAO,WAAW;AAAA,YAC3B,MAAM,OAAO,uBAAuB,OAAO,oBAAoB,OAAO,gBAAgB;AAAA,YACtF,UAAU,OAAO;AAAA,YACjB;AAAA,YACA;AAAA,UACF;AAAA,QACF,OAAO;AAEL,gBAAM,cAAc,MAAM,OAAO,aAAa,GAAG;AACjD,gBAAM,SAAS,IAAI,WAAW;AAE9B,cAAI,UAAU,MAAM,aAAa,IAAI,IAAI;AACzC,cAAI,QAAQ,QAAQ;AAClB,kBAAM,WAAW,kBAAkB,OAAO;AAC1C,0BAAc,SAAS,IAAI,oBAAoB;AAC/C,sBAAU,SAAS,CAAC,KAAK;AAAA,UAC3B;AAEA,gBAAM,SAAS,MAAM,OAAO,MAAM,OAAO;AAEzC,gBAAM,OAAO,OAAO,OAAO,GAAG,OAAO,KAAK,QAAQ,EAAE,KAAK,OAAO,KAAK,WAAW,EAAE,IAAI,KAAK,IAAI;AAC/F,gBAAM,KAAK,MAAM,QAAQ,OAAO,EAAE,IAC9B,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,IAC7E;AACJ,gBAAM,KAAK,MAAM,QAAQ,OAAO,EAAE,IAC9B,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,IAC7E;AAEJ,sBAAY;AAAA,YACV,MAAM,QAAQ;AAAA,YACd,IAAI,MAAM;AAAA,YACV,IAAI,MAAM;AAAA,YACV,SAAS,OAAO,WAAW;AAAA,YAC3B,MAAM,OAAO,QAAQ;AAAA,YACrB,UAAU,OAAO;AAAA,YACjB,UAAU,OAAO;AAAA,YACjB,cAAc,OAAO,eAAe,CAAC,GAAG,IAAI,CAAC,SAAS;AAAA,cACpD,MAAM,IAAI,YAAY;AAAA,cACtB,UAAU,IAAI,YAAY;AAAA,cAC1B,SAAS,IAAI,mBAAmB,aAAa,IAAI,UAAU,IAAI,WAAW,IAAI,OAAc;AAAA,cAC5F,WAAW,IAAI;AAAA,YACjB,EAAE;AAAA,UACJ;AAAA,QACF;AAEA,YAAI,YAAY,SAAS,GAAG;AAC1B,gBAAM,OAAO,yBAAyB,WAAW,CAAC;AAAA,QACpD;AAGA,cAAM,gBAAgB,cAAc,0BAAM;AAC1C,mBAAW,eAAe,WAAW,UAAU,OAAO;AACtD,mBAAW,eAAe,QAAQ,UAAU,IAAI;AAChD,mBAAW,eAAe,MAAM,UAAU,EAAE;AAC5C,YAAI,UAAU,IAAI;AAChB,qBAAW,eAAe,MAAM,UAAU,EAAE;AAAA,QAC9C;AACA,mBAAW,eAAe,QAAQ,UAAU,IAAI;AAChD,cAAM,OAAO,aAAa;AAG1B,YAAI,UAAU,YAAY,SAAS,GAAG;AACpC,gBAAM,qBAAqB,cAAc,0BAAM;AAC/C,gBAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,oBAAU,YAAY;AAEtB,oBAAU,YAAY,QAAQ,CAAC,QAAQ;AACrC,kBAAM,UAAU,uBAAuB,KAAK,sBAAsB,kBAAkB;AAEpF,kBAAM,OAAO,SAAS,cAAc,GAAG;AACvC,iBAAK,YAAY;AACjB,iBAAK,OAAO;AACZ,iBAAK,WAAW,IAAI;AACpB,iBAAK,MAAM;AAGX,kBAAM,SAAS,KAAK,MAAM,IAAI,QAAQ,aAAa,IAAI;AACvD,iBAAK,cAAc,eAAe,IAAI,IAAI,KAAK,MAAM;AACrD,sBAAU,OAAO,IAAI;AAAA,UACvB,CAAC;AAED,6BAAmB,OAAO,SAAS;AACnC,gBAAM,OAAO,kBAAkB;AAAA,QACjC;AAGA,cAAM,cAAc,cAAc,cAAI;AACtC,cAAM,OAAO,WAAW;AAExB,YAAI,OAAO,UAAU;AACrB,YAAI,MAAM;AAER,cAAI,WAAW;AACf,oBAAU,YAAY,QAAQ,CAAC,QAAQ;AACrC,kBAAM,YAAY,IAAI;AACtB,gBAAI,WAAW;AACb,oBAAM,UAAU,uBAAuB,KAAK,sBAAsB,kBAAkB;AAEpF,oBAAM,WAAW,UAAU,QAAQ,SAAS,EAAE;AAC9C,yBAAW,uBAAuB,UAAU,WAAW,OAAO;AAC9D,kBAAI,aAAa,WAAW;AAC1B,2BAAW,uBAAuB,UAAU,UAAU,OAAO;AAAA,cAC/D;AAAA,YACF;AAAA,UACF,CAAC;AACD,iBAAO;AACP,gBAAM,gBAAgB,kBAAkB,IAAI;AAG5C,gBAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,iBAAO,YAAY;AACnB,iBAAO,aAAa,WAAW,6CAA6C;AAC5E,iBAAO,MAAM,UAAU;AACvB,sBAAY,OAAO,MAAM;AAEzB,iBAAO,SAAS,MAAM;AACpB,gBAAI;AACF,oBAAM,OAAO,OAAO,mBAAmB,OAAO,eAAe;AAC7D,kBAAI,MAAM;AACR,qBAAK,KAAK;AACV,qBAAK,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAwBC,aAAa;AAAA;AAAA,iBAExB;AACD,qBAAK,MAAM;AACX,iCAAiB,IAAI;AAGrB,sBAAM,SAAS,MAAM;AACnB,wBAAM,OAAO,KAAK;AAClB,wBAAM,QAAQ,KAAK;AACnB,wBAAM,SAAS,KAAK;AAAA,oBAClB,KAAK;AAAA,oBACL,KAAK;AAAA,oBACL,MAAM;AAAA,oBACN,MAAM;AAAA,oBACN,MAAM;AAAA,kBACR;AACA,yBAAO,MAAM,SAAS,GAAG,SAAS,EAAE;AAAA,gBACtC;AAEA,uBAAO;AACP,8BAAc,KAAK,OAAO,WAAW,QAAQ,GAAG,CAAC;AACjD,8BAAc,KAAK,OAAO,WAAW,QAAQ,GAAI,CAAC;AAAA,cACpD;AAAA,YACF,SAAS,KAAK;AACZ,sBAAQ,MAAM,8CAA8C,GAAG;AAAA,YACjE;AAAA,UACF;AAAA,QACF,OAAO;AAEL,gBAAM,MAAM,SAAS,cAAc,KAAK;AACxC,cAAI,YAAY;AAChB,cAAI,cAAc,UAAU,YAAY;AACxC,sBAAY,OAAO,GAAG;AAAA,QACxB;AAAA,MAEF,SAAS,KAAU;AACjB,cAAM,gBAAgB;AACtB,cAAM,eAAe,cAAc,sCAAQ;AAC3C,cAAM,MAAM,SAAS,cAAc,KAAK;AACxC,YAAI,YAAY;AAChB,YAAI,MAAM,QAAQ;AAClB,YAAI,cAAc;AAAA,EAAe,IAAI,WAAW,GAAG;AACnD,qBAAa,OAAO,GAAG;AACvB,cAAM,OAAO,YAAY;AAAA,MAC3B;AAEA,aAAO;AAAA,QACL,UAAU;AACR,wBAAc,QAAQ,CAAC,UAAU,OAAO,aAAa,KAAK,CAAC;AAC3D,6BAAmB,QAAQ,CAAC,MAAM;AAChC,gBAAI,gBAAgB,CAAC;AAAA,UACvB,CAAC;AACD,0BAAgB,KAAK,UAAU;AAC/B,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,uBACP,YACA,OACA,cACQ;AACR,QAAM,SAAS,MAAM,IAAI,UAAU;AACnC,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AACA,QAAM,OAAO,IAAI,KAAK,CAAC,WAAW,OAAmB,GAAG,EAAE,MAAM,WAAW,SAAS,CAAC;AACrF,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAM,IAAI,YAAY,GAAG;AACzB,eAAa,KAAK,GAAG;AACrB,SAAO;AACT;AAEA,SAAS,sBAAsB,gBAAyB,gBAAkC;AACxF,QAAM,aAAa,CAAC,gBAAgB,cAAc;AAClD,aAAW,aAAa,YAAY;AAClC,QAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C;AAAA,IACF;AACA,UAAM,SAAS;AACf,UAAM,eACJ,mBAAmB,OAAO,aAAa,KACvC,mBAAmB,OAAO,QAAQ,KAClC,mBAAmB,OAAO,WAAW,KACrC,mBAAmB,OAAO,IAAI,KAC9B,mBAAmB,OAAO,cAAc,CAAC;AAC3C,QAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,YACH,kBAAkB,OAAO,mBAAmB,WAAY,eAA0C,WAAW,YAC7G,kBAAkB,OAAO,mBAAmB,WAAY,eAA0C,WAAW;AAChH,SAAO,YAAY,OAAO,aAAa,WAAW,WAAW,EAAE;AACjE;AAEA,SAAS,mBAAmB,OAAwB;AAClD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,WAAW,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,EAAE,YAAY,KAAK;AAC9D,SAAO,SAAS,SAAS,GAAG,IAAI,WAAW;AAC7C;AAEA,SAAS,uBAAuB,MAAc,WAAmB,SAAyB;AACxF,QAAM,aAAa,aAAa,SAAS;AACzC,SAAO,KAAK;AAAA,IACV,IAAI,OAAO,wCAAwC,UAAU,OAAO,IAAI;AAAA,IACxE,CAAC,QAAQ,WAAmB,UAAkB,GAAG,SAAS,IAAI,KAAK,GAAG,OAAO,GAAG,KAAK;AAAA,EACvF;AACF;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAEA,SAAS,yBAAyB,UAA6C;AAC7E,QAAM,UAAU,cAAc,+BAAW;AACzC,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,aAAW,MAAM,sBAAO,OAAO,SAAS,MAAM,CAAC;AAC/C,aAAW,MAAM,gBAAM,oEAAa;AAEpC,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,YAAY;AACtB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,aAAW,SAAS,CAAC,KAAK,WAAW,QAAQ,MAAM,GAAG;AACpD,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,cAAc;AACjB,WAAO,OAAO,EAAE;AAAA,EAClB;AACA,QAAM,OAAO,MAAM;AACnB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,WAAS,MAAM,GAAG,GAAG,EAAE,QAAQ,CAAC,SAAS,UAAU;AACjD,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,eAAW,SAAS,CAAC,OAAO,QAAQ,CAAC,GAAG,QAAQ,WAAW,wBAAS,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,GAAG,GAAG;AAC7G,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,WAAK,cAAc;AACnB,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,UAAM,OAAO,GAAG;AAAA,EAClB,CAAC;AACD,QAAM,OAAO,OAAO,KAAK;AACzB,YAAU,OAAO,KAAK;AACtB,UAAQ,OAAO,MAAM,SAAS;AAC9B,SAAO;AACT;AAEA,SAAS,kBAAkB,UAA4B;AACrD,QAAM,QAAQ,SAAS,QAAQ,SAAS,IAAI,EAAE,MAAM,IAAI;AACxD,QAAM,WAAuB,CAAC;AAC9B,MAAI,UAA2B;AAC/B,MAAI,iBAAiB;AAErB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,UAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,iBAAS,KAAK,OAAO;AAAA,MACvB;AACA,gBAAU,CAAC;AACX,uBAAiB;AACjB;AAAA,IACF;AACA,QAAI,kBAAkB,SAAS;AAC7B,cAAQ,KAAK,KAAK,WAAW,QAAQ,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI;AAAA,IAC/D;AAAA,EACF;AACA,MAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,aAAS,KAAK,OAAO;AAAA,EACvB;AACA,SAAO,SAAS,SAAS,IAAI,SAAS,IAAI,CAAC,YAAY,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ;AACxF;AAEA,SAAS,qBAAqB,SAAqC;AACjE,SAAO;AAAA,IACL,MAAM,aAAa,gBAAgB,SAAS,MAAM,CAAC;AAAA,IACnD,SAAS,aAAa,gBAAgB,SAAS,SAAS,CAAC;AAAA,IACzD,MAAM,aAAa,gBAAgB,SAAS,MAAM,CAAC;AAAA,EACrD;AACF;AAEA,SAAS,gBAAgB,SAAiB,MAAsB;AAC9D,QAAM,UAAU,QAAQ,MAAM,WAAW,CAAC,EAAE,CAAC,KAAK;AAClD,QAAM,UAAU,KAAK,QAAQ,uBAAuB,MAAM;AAC1D,QAAM,QAAQ,QAAQ,MAAM,IAAI,OAAO,IAAI,OAAO,kDAAkD,IAAI,CAAC;AACzG,SAAO,QAAQ,CAAC,GAAG,KAAK,KAAK;AAC/B;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,aAAa,GAAG,EAAE,KAAK;AAC9C;AAGA,SAAS,YAAY,MAAsB;AACzC,QAAM,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AAC/C,QAAM,MAA8B;AAAA,IAClC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACA,SAAO,MAAM,IAAI,GAAG,KAAK,6BAA6B;AACxD;AAEA,SAAS,kBAAkB,MAAsB;AAC/C,SAAO,kBAAAC,QAAU,SAAS,MAAM;AAAA,IAC9B,cAAc,EAAE,MAAM,KAAK;AAAA,IAC3B,UAAU,CAAC,QAAQ;AAAA,IACnB,oBAAoB;AAAA,EACtB,CAAC;AACH;AAEA,SAAS,iBAAiBC,WAA0B;AAClD,aAAW,QAAQA,UAAS,iBAAoC,SAAS,GAAG;AAC1E,UAAM,OAAO,KAAK,aAAa,MAAM,KAAK;AAC1C,QAAI,CAAC,gBAAgB,IAAI,GAAG;AAC1B,WAAK,gBAAgB,MAAM;AAC3B,WAAK,gBAAgB,QAAQ;AAC7B,WAAK,gBAAgB,KAAK;AAC1B;AAAA,IACF;AACA,QAAI,mBAAmB,KAAK,IAAI,GAAG;AACjC,WAAK,SAAS;AACd,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,MAAuB;AAC9C,QAAM,UAAU,KAAK,KAAK;AAC1B,SACE,QAAQ,WAAW,GAAG,KACtB,QAAQ,WAAW,GAAG,KACtB,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,KAAK,KACxB,QAAQ,WAAW,OAAO,KAC1B,2BAA2B,KAAK,OAAO;AAE3C;;;AC7fA,IAAAC,eAAiB;AAIjB,IAAM,oBAAoB,oBAAI,IAAI,CAAC,UAAU,OAAO,cAAc,QAAQ,CAAC;AAC3E,IAAM,uBAA+C;AAAA,EACnD,iCAAiC;AAAA,EACjC,mCAAmC;AAAA,EACnC,iCAAiC;AACnC;AACA,IAAM,SAAS;AAER,SAAS,gBAA+B;AAC7C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,kBAAkB,IAAI,KAAK,SAAS,KAAK,QAAQ,qBAAqB,KAAK,QAAQ,CAAC;AAAA,IAC7F;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,aAAa;AACvC,UAAI,SAAS,OAAO,KAAK;AACzB,YAAM,OAAO,MAAM,aAAa,IAAI,IAAI;AACxC,YAAM,YAAY,cAAc,IAAI,MAAM,oBAAoB;AAE9D,UAAI;AACF,YAAI,cAAc,cAAc;AAC9B,2BAAiB,OAAO,IAAI;AAAA,QAC9B,WAAW,cAAc,UAAU;AACjC,uBAAa,OAAO,IAAI;AAAA,QAC1B,WAAW,cAAc,YAAY,cAAc,OAAO;AACxD,uBAAa,OAAO,IAAI;AAAA,QAC1B,OAAO;AACL,2BAAiB,OAAO,aAAa,WAAW,IAAI;AAAA,QACtD;AAAA,MACF,SAAS,OAAO;AACd,mCAA2B,OAAO,aAAa,WAAW,MAAM,KAAK;AAAA,MACvE;AAEA,aAAO;AAAA,QACL,UAAU;AACR,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAcA,SAAS,qBAAqB,OAA0C;AACtE,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,aAAa,kBAAkB,KAAK;AAC1C,uBAAqB,SAAS,gBAAM,OAAO,MAAM,MAAM,CAAC;AACxD,uBAAqB,SAAS,gBAAM,mBAAmB,UAAU,CAAC;AAClE,uBAAqB,SAAS,gBAAM,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,QAAQ,KAAK,KAAK,KAAK,CAAC,EAAE,MAAM,CAAC;AACxG,uBAAqB,SAAS,gBAAM,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,IAAI,EAAE,MAAM,CAAC;AACpF,QAAM,QAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,KAAK,EAAE;AAC/D,MAAI,QAAQ,GAAG;AACb,yBAAqB,SAAS,6BAAS,OAAO,KAAK,CAAC;AAAA,EACtD;AACA,QAAM,SAAS,cAAc,KAAK;AAClC,MAAI,QAAQ;AACV,yBAAqB,SAAS,gBAAM,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE;AAAA,EAC9I;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,QAAqB,OAAe,OAAqB;AACrF,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,OAAK,OAAO,KAAK,OAAO;AACxB,SAAO,OAAO,IAAI;AACpB;AAEA,SAAS,kBAAkB,OAAkD;AAC3E,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,OAAO;AACxB,WAAO,IAAI,KAAK,OAAO,OAAO,IAAI,KAAK,IAAI,KAAK,KAAK,CAAC;AAAA,EACxD;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,QAAqC;AAC/D,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE,EACzC,KAAK,IAAI,KAAK;AACnB;AAEA,SAAS,cAAc,OAA2E;AAChG,QAAM,QAAQ,MACX,IAAI,CAAC,SAAS;AACb,QAAI,CAAC,OAAO,SAAS,KAAK,CAAC,KAAK,CAAC,OAAO,SAAS,KAAK,CAAC,GAAG;AACxD,aAAO;AAAA,IACT;AACA,UAAM,IAAI,KAAK;AACf,UAAM,IAAI,KAAK;AACf,UAAM,QAAQ,KAAK,IAAI,GAAGC,cAAa,KAAK,OAAO,CAAC,CAAC;AACrD,UAAM,SAAS,KAAK,IAAI,GAAGA,cAAa,KAAK,QAAQ,CAAC,CAAC;AACvD,WAAO,CAAC,GAAG,GAAG,IAAI,OAAO,IAAI,MAAM;AAAA,EACrC,CAAC,EACA,OAAO,CAAC,SAAmD,QAAQ,IAAI,CAAC;AAC3E,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;AAAA,IACtC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;AAAA,IACtC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;AAAA,IACtC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;AAAA,EACxC;AACF;AAEA,SAAS,sBAAsB,SAAsD;AACnF,SAAO;AAAA,IACL,MAAM,OAAO,QAAQ,QAAQ,SAAS;AAAA,IACtC,GAAGA,cAAa,QAAQ,GAAG,CAAC;AAAA,IAC5B,GAAGA,cAAa,QAAQ,GAAG,CAAC;AAAA,IAC5B,OAAOA,cAAa,QAAQ,OAAO,CAAC;AAAA,IACpC,QAAQA,cAAa,QAAQ,QAAQ,CAAC;AAAA,IACtC,MAAM,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AAAA,IAC/C,OAAO,QAAQ,SAAS;AAAA,IACxB,OAAO,QAAQ,SAAS;AAAA,IACxB,MAAM,QAAQ,SAAS,WAAW,QAAQ,SAAS;AAAA,EACrD;AACF;AAEA,SAAS,kBAAkB,OAAwC;AACjE,QAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,SAAO;AAAA,IACL,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,SAAS;AAAA,IAClD,GAAGA,cAAa,MAAM,GAAG,CAAC;AAAA,IAC1B,GAAGA,cAAa,MAAM,GAAG,CAAC;AAAA,IAC1B,OAAOA,cAAa,MAAM,GAAGA,cAAa,MAAM,OAAO,CAAC,CAAC;AAAA,IACzD,QAAQA,cAAa,MAAM,GAAGA,cAAa,MAAM,QAAQ,CAAC,CAAC;AAAA,IAC3D,MAAM,OAAO,MAAM,QAAQ,EAAE;AAAA,IAC7B,MAAM,MAAM,SAAS,WAAW,MAAM,SAAS;AAAA,EACjD;AACF;AAEA,SAAS,kBAAkB,OAAwC;AACjE,SAAO;AAAA,IACL,MAAM,MAAM,OAAO,SAAS,gBAAgB,MAAM,KAAK;AAAA,IACvD,GAAG,MAAM;AAAA,IACT,GAAG,MAAM;AAAA,IACT,OAAO,MAAM;AAAA,IACb,QAAQ,MAAM;AAAA,IACd,MAAM,MAAM;AAAA,IACZ,OAAO,gBAAgB,MAAM,KAAK,MAAM;AAAA,IACxC,MAAM,MAAM;AAAA,EACd;AACF;AAEA,SAAS,iBAAiB,OAAoB,MAAoB;AAChE,QAAM,OAAO,KAAK,MAAM,IAAI;AAI5B,QAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,QAAM,YAAY,KAAK,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,QAAQ,SAAS;AAC7E,QAAM,UAAU,cAAc,cAAc,SAAS,MAAM,WAAW;AACtE,UAAQ,OAAO,qBAAqB,SAAS,IAAI,qBAAqB,CAAC,CAAC;AACxE,QAAM,MAAM,SAAS,gBAAgB,QAAQ,KAAK;AAClD,MAAI,aAAa,SAAS,eAAe;AACzC,MAAI,aAAa,WAAW,wBAAwB,QAAQ,CAAC;AAC7D,QAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,MAAI,OAAO,IAAI;AAEf,aAAW,WAAW,UAAU;AAC9B,UAAM,OAAO,OAAO,QAAQ,QAAQ,EAAE;AACtC,UAAM,IAAI,OAAO,QAAQ,KAAK,CAAC;AAC/B,UAAM,IAAI,OAAO,QAAQ,KAAK,CAAC;AAC/B,UAAM,QAAQ,OAAO,QAAQ,SAAS,EAAE;AACxC,UAAM,SAAS,OAAO,QAAQ,UAAU,EAAE;AAC1C,UAAM,SAAS,OAAO,QAAQ,eAAe,SAAS;AACtD,UAAM,OAAO,eAAe,KAAK,MAAM,SAAS,MAAM;AACtD,UAAM,SAAS,yBAAyB,OAAO;AAC/C,UAAM,YAAY,oBAAoB,SAAS,GAAG,GAAG,OAAO,MAAM;AAElE,QAAI,SAAS,SAAS;AACpB,YAAM,QAAQ,SAAS,gBAAgB,QAAQ,MAAM;AACrD,oBAAc,OAAO;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,QACpB,SAAS,OAAO;AAAA,QAChB;AAAA,MACF,CAAC;AACD,UAAI,OAAO,KAAK;AAChB,6BAAuB,KAAK,OAAO,QAAQ,QAAQ,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW;AAAA,QACtF,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH,WAAW,SAAS,SAAS;AAC3B,4BAAsB,KAAK,SAAS,OAAO,GAAG,GAAG,OAAO,QAAQ,QAAQ,SAAS;AAAA,IACnF,WAAW,SAAS,cAAc;AAChC,iCAA2B,KAAK,SAAS,GAAG,GAAG,OAAO,QAAQ,QAAQ,SAAS;AAAA,IACjF,WAAW,SAAS,eAAe,SAAS,WAAW;AACrD,UAAI,SAAS,WAAW;AACtB,cAAM,UAAU,SAAS,gBAAgB,QAAQ,SAAS;AAC1D,gBAAQ;AAAA,UACN;AAAA,UACA,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,SAAS,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,IAAI,MAAM,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;AAAA,QAC5G;AACA,sBAAc,SAAS,EAAE,MAAM,QAAQ,GAAG,QAAQ,UAAU,CAAC;AAC7D,YAAI,OAAO,OAAO;AAAA,MACpB,OAAO;AACL,cAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,sBAAc,MAAM;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,IAAIA,cAAa,QAAQ,aAAa,OAAO,QAAQ,cAAc,WAAY,QAAQ,UAAsC,QAAQ,QAAW,CAAC;AAAA,UACjJ;AAAA,UACA;AAAA,UACA,GAAG;AAAA,UACH;AAAA,QACF,CAAC;AACD,YAAI,OAAO,IAAI;AAAA,MACjB;AAAA,IACF,WAAW,SAAS,WAAW;AAC7B,YAAM,UAAU,SAAS,gBAAgB,QAAQ,SAAS;AAC1D,oBAAc,SAAS;AAAA,QACrB,IAAI,IAAI,QAAQ;AAAA,QAChB,IAAI,IAAI,SAAS;AAAA,QACjB,IAAI,KAAK,IAAI,QAAQ,CAAC;AAAA,QACtB,IAAI,KAAK,IAAI,SAAS,CAAC;AAAA,QACvB;AAAA,QACA;AAAA,QACA,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AACD,UAAI,OAAO,OAAO;AAAA,IACpB,WAAW,SAAS,UAAU,SAAS,SAAS;AAC9C,YAAM,SAAS,iBAAiB,SAAS,GAAG,GAAG,OAAO,MAAM;AAC5D,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,WAAW,SAAS,gBAAgB,QAAQ,UAAU;AAC5D,sBAAc,UAAU;AAAA,UACtB,QAAQ,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,EAAE,KAAK,GAAG;AAAA,UAC/D,MAAM;AAAA,UACN;AAAA,UACA,GAAG;AAAA,UACH;AAAA,QACF,CAAC;AACD,YAAI,OAAO,QAAQ;AACnB,mCAA2B,KAAK,SAAS,QAAQ,MAAM;AAAA,MACzD,OAAO;AACL,cAAM,QAAQ,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE;AAClC,cAAM,MAAM,OAAO,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,IAAI,OAAO,GAAG,IAAI,OAAO;AACvE,cAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,sBAAc,MAAM;AAAA,UAClB,IAAI,MAAM;AAAA,UACV,IAAI,MAAM;AAAA,UACV,IAAI,IAAI;AAAA,UACR,IAAI,IAAI;AAAA,UACR;AAAA,UACA,GAAG;AAAA,UACH;AAAA,QACF,CAAC;AACD,YAAI,OAAO,IAAI;AACf,mCAA2B,KAAK,SAAS,CAAC,OAAO,GAAG,GAAG,MAAM;AAAA,MAC/D;AAAA,IACF,WAAW,SAAS,YAAY;AAC9B,YAAM,OAAO,6BAA6B,SAAS,GAAG,CAAC;AACvD,UAAI,MAAM;AACR,sBAAc,MAAM,EAAE,MAAM,QAAQ,QAAQ,GAAG,QAAQ,UAAU,CAAC;AAClE,YAAI,OAAO,IAAI;AAAA,MACjB;AAAA,IACF,WAAW,SAAS,QAAQ;AAC1B,YAAM,WAAWA,cAAa,QAAQ,UAAU,EAAE;AAClD,YAAM,QAAQ,OAAO,QAAQ,QAAQ,EAAE,EAAE,MAAM,OAAO;AACtD,YAAM,YAAY,OAAO,QAAQ,aAAa,MAAM;AACpD,YAAM,gBAAgB,OAAO,QAAQ,iBAAiB,KAAK;AAC3D,YAAM,SAAS,cAAc,WAAW,WAAW,cAAc,UAAU,QAAQ;AACnF,YAAM,QAAQ,cAAc,WAAW,IAAI,QAAQ,IAAI,cAAc,UAAU,IAAI,QAAQ;AAC3F,YAAM,QACJ,kBAAkB,WACd,IAAI,SAAS,KAAM,MAAM,SAAS,KAAK,WAAW,OAAQ,IAC1D,kBAAkB,WAChB,IAAI,UAAU,MAAM,SAAS,KAAK,WAAW,OAC7C,IAAI;AACZ,6BAAuB,KAAK,OAAO,QAAQ,QAAQ,EAAE,GAAG,OAAO,OAAO,QAAQ;AAAA,QAC5E;AAAA,QACA,YAAY,OAAO,QAAQ,cAAc,6CAA6C;AAAA,QACtF;AAAA,QACA,kBAAkB,kBAAkB,WAAW,WAAW;AAAA,QAC1D,SAAS,OAAO;AAAA,QAChB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,UAAQ,OAAO,GAAG;AAClB,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,sBACP,KACA,SACA,OACA,GACA,GACA,OACA,QACA,QACA,WACM;AACN,QAAM,SAAS,OAAO,QAAQ,UAAU,EAAE;AAC1C,QAAM,OAAO,SAAS,MAAM,MAAM,IAAI;AACtC,QAAM,UAAU,MAAM,WAAW;AACjC,MAAI,6BAA6B,OAAO,GAAG;AACzC,UAAM,QAAQ,SAAS,gBAAgB,QAAQ,OAAO;AACtD,kBAAc,OAAO;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,qBAAqB;AAAA,MACrB,SAAS,OAAO;AAAA,MAChB;AAAA,IACF,CAAC;AACD,QAAI,OAAO,KAAK;AAChB;AAAA,EACF;AAEA,QAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,gBAAc,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,SAAS,OAAO;AAAA,IAChB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,IAAI;AACf,yBAAuB,KAAK,SAAS;AAAA,EAAU,MAAM,KAAK,SAAS,IAAI,QAAQ,GAAG,IAAI,SAAS,IAAI,GAAG,WAAW;AAAA,IAC/G,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACH;AAEA,SAAS,2BACP,KACA,SACA,GACA,GACA,OACA,QACA,QACA,WACM;AACN,QAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,gBAAc,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,SAAS,OAAO;AAAA,IAChB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,IAAI;AACf,QAAM,OAAO,OAAO,QAAQ,QAAQ,QAAQ,OAAO,kBAAkB;AACrE,yBAAuB,KAAK;AAAA,EAAU,YAAY,MAAM,EAAE,CAAC,IAAI,IAAI,QAAQ,GAAG,IAAI,SAAS,IAAI,IAAI,WAAW;AAAA,IAC5G,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACH;AAEA,SAAS,uBACP,KACA,MACA,GACA,GACA,MACA,UAOI,CAAC,GACW;AAChB,QAAM,WAAW,SAAS,gBAAgB,QAAQ,MAAM;AACxD,gBAAc,UAAU;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,QAAQ,YAAY;AAAA,IACjC,eAAe,QAAQ,cAAc;AAAA,IACrC,eAAe,QAAQ;AAAA,IACvB,qBAAqB,QAAQ;AAAA,IAC7B,SAAS,QAAQ;AAAA,IACjB,WAAW,QAAQ;AAAA,EACrB,CAAC;AACD,aAAW,CAAC,OAAO,IAAI,KAAK,KAAK,MAAM,OAAO,EAAE,QAAQ,GAAG;AACzD,UAAM,OAAO,SAAS,gBAAgB,QAAQ,OAAO;AACrD,SAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,SAAK,aAAa,MAAM,UAAU,IAAI,MAAM,QAAQ;AACpD,SAAK,cAAc;AACnB,aAAS,OAAO,IAAI;AAAA,EACtB;AACA,MAAI,OAAO,QAAQ;AACnB,SAAO;AACT;AAEA,SAAS,6BAA6B,OAAwB;AAC5D,SAAO,mDAAmD,KAAK,KAAK;AACtE;AAEA,SAAS,YAAY,OAAe,WAA2B;AAC7D,SAAO,MAAM,SAAS,YAAY,GAAG,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ;AACzF;AAEA,SAAS,wBAAwB,UAAkD;AACjF,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,SAAS,IAAI,CAAC,YAAY;AACvC,UAAM,IAAIA,cAAa,QAAQ,GAAG,CAAC;AACnC,UAAM,IAAIA,cAAa,QAAQ,GAAG,CAAC;AACnC,UAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,OAAO,IAAI,CAAC,UAAU,eAAe,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC;AACvH,UAAM,QAAQ,KAAK,IAAI,GAAGA,cAAa,QAAQ,OAAO,KAAK,IAAI,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC;AACtG,UAAM,SAAS,KAAK,IAAI,GAAGA,cAAa,QAAQ,QAAQ,KAAK,IAAI,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC;AACxG,WAAO,EAAE,GAAG,GAAG,OAAO,OAAO;AAAA,EAC/B,CAAC;AACD,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,IAAI;AAC3D,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,IAAI;AAC3D,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,KAAK,CAAC,IAAI;AACzE,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,MAAM,CAAC,IAAI;AAC1E,SAAO,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,KAAK,OAAO,IAAI,CAAC;AACpF;AAEA,SAAS,yBAAyB,SAAmE;AACnG,QAAM,cAAcA,cAAa,QAAQ,aAAa,GAAG;AACzD,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,cAAa,QAAQ,SAAS,GAAG,IAAI,GAAG,CAAC;AACjF,QAAM,QAAQ,OAAO,QAAQ,eAAe,OAAO;AACnD,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,oBAAoB,UAAU,WAAW,GAAG,cAAc,CAAC,IAAI,cAAc,CAAC,KAAK,UAAU,WAAW,GAAG,WAAW,IAAI,cAAc,CAAC,KAAK;AAAA,IAC9I;AAAA,EACF;AACF;AAEA,SAAS,eACP,KACA,MACA,SACA,QACQ;AACR,QAAM,QAAQ,OAAO,QAAQ,mBAAmB,aAAa;AAC7D,MAAI,CAAC,SAAS,UAAU,eAAe;AACrC,WAAO;AAAA,EACT;AACA,QAAM,YAAY,OAAO,QAAQ,aAAa,OAAO;AACrD,MAAI,cAAc,SAAS;AACzB,WAAO;AAAA,EACT;AACA,QAAM,KAAK,kBAAkB,SAAS,IAAI,KAAK,SAAS,MAAM;AAC9D,QAAM,UAAU,SAAS,gBAAgB,QAAQ,SAAS;AAC1D,gBAAc,SAAS;AAAA,IACrB;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,aAAa,SAAS,gBAAgB,QAAQ,MAAM;AAC1D,gBAAc,YAAY,EAAE,OAAO,IAAI,QAAQ,IAAI,MAAM,OAAO,SAAS,KAAK,CAAC;AAC/E,UAAQ,OAAO,UAAU;AACzB,MAAI,cAAc,eAAe;AAC/B,YAAQ,OAAO,kBAAkB,KAAK,iBAAiB,MAAM,CAAC;AAC9D,YAAQ,OAAO,kBAAkB,KAAK,iBAAiB,MAAM,CAAC;AAAA,EAChE,WAAW,cAAc,QAAQ;AAC/B,UAAM,MAAM,SAAS,gBAAgB,QAAQ,QAAQ;AACrD,kBAAc,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,KAAK,MAAM,QAAQ,SAAS,KAAK,CAAC;AACxE,YAAQ,OAAO,GAAG;AAAA,EACpB,OAAO;AACL,YAAQ,OAAO,kBAAkB,KAAK,iBAAiB,MAAM,CAAC;AAAA,EAChE;AACA,OAAK,OAAO,OAAO;AACnB,SAAO,QAAQ,EAAE;AACnB;AAEA,SAAS,kBAAkB,KAAoB,GAAW,QAAgC;AACxF,QAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,gBAAc,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,SAAS;AAAA,EACX,CAAC;AACD,SAAO;AACT;AAEA,SAAS,oBACP,SACA,GACA,GACA,OACA,QACQ;AACR,QAAM,QAAQA,cAAa,QAAQ,OAAO,CAAC;AAC3C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,SAAO,UAAW,QAAQ,MAAO,KAAK,EAAE,IAAI,IAAI,QAAQ,CAAC,IAAI,IAAI,SAAS,CAAC;AAC7E;AAEA,SAAS,iBACP,SACA,GACA,GACA,OACA,QACiC;AACjC,MAAI,CAAC,MAAM,QAAQ,QAAQ,MAAM,GAAG;AAClC,WAAO;AAAA,MACL,EAAE,GAAG,EAAE;AAAA,MACP,EAAE,GAAG,IAAI,OAAO,GAAG,IAAI,OAAO;AAAA,IAChC;AAAA,EACF;AACA,SAAO,QAAQ,OAAO,IAAI,CAAC,UAAU;AACnC,UAAM,SAAS,eAAe,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACnD,WAAO,EAAE,GAAG,IAAI,OAAO,GAAG,GAAG,IAAI,OAAO,EAAE;AAAA,EAC5C,CAAC;AACH;AAEA,SAAS,6BAA6B,SAAkC,GAAW,GAAkC;AACnH,QAAM,SAAS,iBAAiB,SAAS,GAAG,GAAG,GAAG,CAAC;AACnD,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO;AAAA,EACT;AACA,QAAM,OAAO,SAAS,gBAAgB,8BAA8B,MAAM;AAC1E,OAAK;AAAA,IACH;AAAA,IACA,OACG,IAAI,CAAC,OAAO,UAAU,GAAG,UAAU,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,EACxE,KAAK,GAAG;AAAA,EACb;AACA,SAAO;AACT;AAEA,SAAS,2BACP,KACA,SACA,QACA,QACM;AACN,MAAI,OAAO,QAAQ,QAAQ,EAAE,MAAM,WAAW,OAAO,SAAS,GAAG;AAC/D;AAAA,EACF;AACA,QAAM,YAAY,OAAO,QAAQ,kBAAkB,EAAE;AACrD,QAAM,UAAU,OAAO,QAAQ,gBAAgB,OAAO;AACtD,MAAI,aAAa,cAAc,QAAQ;AACrC,oBAAgB,KAAK,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,QAAQ,SAAS;AAAA,EAC5F;AACA,MAAI,WAAW,YAAY,QAAQ;AACjC,UAAM,WAAW,OAAO,OAAO,SAAS,CAAC;AACzC,UAAM,MAAM,OAAO,OAAO,SAAS,CAAC;AACpC,oBAAgB,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,QAAQ,OAAO;AAAA,EAC5E;AACF;AAEA,SAAS,cAAc,SAAqB,YAA+D;AACzG,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,QAAI,UAAU,UAAa,UAAU,IAAI;AACvC;AAAA,IACF;AACA,YAAQ,aAAa,KAAK,OAAO,KAAK,CAAC;AAAA,EACzC;AACF;AAMA,SAAS,aAAa,OAAoB,MAAoB;AAC5D,QAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,QAAM,SAAS,oBAAoB,IAAI;AACvC,QAAM,UAAU,cAAc,mCAAe,OAAO,MAAM,SAAS;AACnE,UAAQ,OAAO,qBAAqB,OAAO,IAAI,iBAAiB,CAAC,CAAC;AAClE,QAAM,MAAM,SAAS,gBAAgB,8BAA8B,KAAK;AACxE,MAAI,aAAa,SAAS,eAAe;AACzC,MAAI,aAAa,WAAW,oBAAoB,MAAM,CAAC;AAEvD,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,QAAQ,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC/D,UAAM,aAAa,KAAK,IAAI;AAC5B,UAAM,aAAa,KAAK,IAAI;AAC5B,UAAM,aAAa,QAAQ,SAAS;AACpC,UAAM,cAAc;AACpB,QAAI,OAAO,KAAK;AAAA,EAClB,OAAO;AACL,eAAW,SAAS,QAAQ;AAC1B,wBAAkB,KAAK,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,UAAQ,OAAO,GAAG;AAClB,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,oBAAoB,MAA8B;AACzD,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO,CAAC;AAAA,EACV;AACA,QAAM,SAAS;AACf,QAAM,aAAwB,CAAC;AAC/B,MAAI,MAAM,QAAQ,OAAO,OAAO,GAAG;AACjC,eAAW,KAAK,GAAG,OAAO,OAAO;AAAA,EACnC;AACA,MAAI,MAAM,QAAQ,OAAO,MAAM,GAAG;AAChC,eAAW,KAAK,GAAG,OAAO,MAAM;AAAA,EAClC;AACA,MAAI,OAAO,SAAS,OAAO,OAAO,UAAU,UAAU;AACpD,eAAW,KAAK,GAAG,OAAO,OAAO,OAAO,KAAgC,CAAC;AAAA,EAC3E;AACA,MAAI,OAAO,YAAY,OAAO,OAAO,aAAa,UAAU;AAC1D,UAAM,iBAAiB,OAAO;AAC9B,QAAI,MAAM,QAAQ,eAAe,MAAM,GAAG;AACxC,iBAAW,KAAK,GAAG,eAAe,MAAM;AAAA,IAC1C;AAAA,EACF;AAEA,SAAO,WAAW,OAAO,CAAC,SAA8B;AACtD,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,aAAO;AAAA,IACT;AACA,UAAM,SAAS;AACf,WAAO,OAAO,aAAa,WAAW,OAAO,OAAO,MAAM,EAAE,EAAE,WAAW,QAAQ;AAAA,EACnF,CAAC;AACH;AAEA,SAAS,kBAAkB,KAAoB,OAA0B;AACvE,QAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,QAAM,OAAO,OAAO,MAAM,QAAQ,MAAM,QAAQ,EAAE;AAClD,QAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,QAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,QAAM,QAAQ,KAAK,IAAI,GAAGA,cAAa,MAAM,GAAGA,cAAa,MAAM,OAAO,GAAG,CAAC,CAAC;AAC/E,QAAM,SAAS,KAAK,IAAI,GAAGA,cAAa,MAAM,GAAGA,cAAa,MAAM,QAAQ,EAAE,CAAC,CAAC;AAChF,QAAM,SAAS,YAAY,OAAO,MAAM,SAAS,MAAM,SAAS,OAAO,CAAC;AACxE,QAAM,OAAO,WAAW,OAAO,MAAM,QAAQ,MAAM,GAAG,MAAM;AAE5D,MAAI,SAAS,SAAS,SAAS,WAAW,SAAS,aAAa;AAC9D,UAAM,MAAM,OAAO,MAAM,QAAQ,SAAS,UAAU,cAAc,YAAY;AAC9E,QAAI,QAAQ,aAAa,QAAQ,QAAQ;AACvC,YAAM,UAAU,SAAS,gBAAgB,IAAI,cAAc,SAAS;AACpE,cAAQ,aAAa,MAAM,OAAO,IAAI,QAAQ,CAAC,CAAC;AAChD,cAAQ,aAAa,MAAM,OAAO,IAAI,SAAS,CAAC,CAAC;AACjD,cAAQ,aAAa,MAAM,OAAO,QAAQ,CAAC,CAAC;AAC5C,cAAQ,aAAa,MAAM,OAAO,SAAS,CAAC,CAAC;AAC7C,cAAQ,aAAa,QAAQ,IAAI;AACjC,cAAQ,aAAa,UAAU,MAAM;AACrC,cAAQ,aAAa,gBAAgB,GAAG;AACxC,UAAI,OAAO,OAAO;AAAA,IACpB,WAAW,QAAQ,WAAW;AAC5B,YAAM,UAAU,SAAS,gBAAgB,IAAI,cAAc,SAAS;AACpE,cAAQ;AAAA,QACN;AAAA,QACA,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,SAAS,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,IAAI,MAAM,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;AAAA,MAC5G;AACA,cAAQ,aAAa,QAAQ,IAAI;AACjC,cAAQ,aAAa,UAAU,MAAM;AACrC,cAAQ,aAAa,gBAAgB,GAAG;AACxC,UAAI,OAAO,OAAO;AAAA,IACpB,WAAW,QAAQ,YAAY;AAC7B,YAAM,UAAU,SAAS,gBAAgB,IAAI,cAAc,SAAS;AACpE,cAAQ,aAAa,UAAU,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE;AACpG,cAAQ,aAAa,QAAQ,IAAI;AACjC,cAAQ,aAAa,UAAU,MAAM;AACrC,cAAQ,aAAa,gBAAgB,GAAG;AACxC,UAAI,OAAO,OAAO;AAAA,IACpB,OAAO;AACL,YAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,WAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,WAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,WAAK,aAAa,SAAS,OAAO,KAAK,CAAC;AACxC,WAAK,aAAa,UAAU,OAAO,MAAM,CAAC;AAC1C,WAAK,aAAa,MAAM,SAAS,UAAU,MAAM,GAAG;AACpD,WAAK,aAAa,QAAQ,IAAI;AAC9B,WAAK,aAAa,UAAU,MAAM;AAClC,WAAK,aAAa,gBAAgB,GAAG;AACrC,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,qBAAiB,KAAK,OAAO,MAAM,QAAQ,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,MAAM;AAAA,EACxE,WAAW,SAAS,UAAU,SAAS,QAAQ;AAC7C,QAAI,SAAS,QAAQ;AACnB,YAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,WAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,WAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,WAAK,aAAa,SAAS,OAAO,KAAK,CAAC;AACxC,WAAK,aAAa,UAAU,OAAO,MAAM,CAAC;AAC1C,WAAK,aAAa,MAAM,GAAG;AAC3B,WAAK,aAAa,QAAQ,YAAY,OAAO,MAAM,SAAS,QAAQ,GAAG,IAAI,CAAC;AAC5E,WAAK,aAAa,UAAU,MAAM;AAClC,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,qBAAiB,KAAK,OAAO,MAAM,QAAQ,EAAE,GAAG,GAAG,IAAI,IAAI,MAAM;AAAA,EACnE,WAAW,SAAS,WAAW,SAAS,QAAQ;AAC9C,qBAAiB,KAAK,OAAO,MAAM;AAAA,EACrC,WAAW,SAAS,QAAQ;AAC1B,qBAAiB,KAAK,OAAO,MAAM;AAAA,EACrC,OAAO;AACL,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,SAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,SAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,SAAK,aAAa,SAAS,OAAO,KAAK,CAAC;AACxC,SAAK,aAAa,UAAU,OAAO,MAAM,CAAC;AAC1C,SAAK,aAAa,QAAQ,aAAa;AACvC,SAAK,aAAa,UAAU,MAAM;AAClC,SAAK,aAAa,oBAAoB,KAAK;AAC3C,QAAI,OAAO,IAAI;AACf,qBAAiB,KAAK,QAAQ,SAAS,IAAI,GAAG,IAAI,IAAI,MAAM;AAAA,EAC9D;AACF;AAEA,SAAS,iBAAiB,KAAoB,OAAoB,QAAsB;AACtF,QAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,QAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,QAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,QAAM,QAAQ,eAAe,MAAM,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACxD,QAAM,MAAM,eAAe,MAAM,KAAK;AAAA,IACpC,GAAGA,cAAa,MAAM,GAAGA,cAAa,MAAM,OAAO,GAAG,CAAC;AAAA,IACvD,GAAGA,cAAa,MAAM,GAAGA,cAAa,MAAM,QAAQ,CAAC,CAAC;AAAA,EACxD,CAAC;AACD,QAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,OAAK,aAAa,MAAM,OAAO,IAAI,MAAM,CAAC,CAAC;AAC3C,OAAK,aAAa,MAAM,OAAO,IAAI,MAAM,CAAC,CAAC;AAC3C,OAAK,aAAa,MAAM,OAAO,IAAI,IAAI,CAAC,CAAC;AACzC,OAAK,aAAa,MAAM,OAAO,IAAI,IAAI,CAAC,CAAC;AACzC,OAAK,aAAa,UAAU,MAAM;AAClC,OAAK,aAAa,gBAAgB,GAAG;AACrC,OAAK,aAAa,kBAAkB,OAAO;AAC3C,MAAI,OAAO,IAAI;AACf,MAAI,OAAO,MAAM,QAAQ,EAAE,MAAM,SAAS;AACxC,oBAAgB,KAAK,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,MAAM;AAAA,EAC7E;AACF;AAEA,SAAS,iBAAiB,KAAoB,OAAoB,QAAsB;AACtF,QAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,QAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,QAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,QAAM,SAAS,wBAAwB,MAAM,QAAQ;AACrD,MAAI,OAAO,SAAS,GAAG;AACrB;AAAA,EACF;AACA,QAAM,WAAW,SAAS,gBAAgB,IAAI,cAAc,UAAU;AACtE,WAAS,aAAa,UAAU,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AAChG,WAAS,aAAa,QAAQ,MAAM;AACpC,WAAS,aAAa,UAAU,MAAM;AACtC,WAAS,aAAa,gBAAgB,GAAG;AACzC,WAAS,aAAa,kBAAkB,OAAO;AAC/C,WAAS,aAAa,mBAAmB,OAAO;AAChD,MAAI,OAAO,QAAQ;AACrB;AAEA,SAAS,iBAAiB,KAAoB,MAAc,GAAW,GAAW,MAAoB;AACpG,MAAI,CAAC,KAAK,KAAK,GAAG;AAChB;AAAA,EACF;AACA,QAAM,WAAW,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAClE,WAAS,aAAa,KAAK,OAAO,CAAC,CAAC;AACpC,WAAS,aAAa,KAAK,OAAO,CAAC,CAAC;AACpC,WAAS,aAAa,QAAQ,IAAI;AAClC,WAAS,aAAa,aAAa,IAAI;AACvC,WAAS,aAAa,eAAe,6CAA6C;AAClF,aAAW,CAAC,OAAO,IAAI,KAAK,KAAK,MAAM,OAAO,EAAE,QAAQ,GAAG;AACzD,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,OAAO;AAC/D,SAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,SAAK,aAAa,MAAM,UAAU,IAAI,MAAM,OAAO;AACnD,SAAK,cAAc;AACnB,aAAS,OAAO,IAAI;AAAA,EACtB;AACA,MAAI,OAAO,QAAQ;AACrB;AAEA,SAAS,gBACP,KACA,IACA,IACA,IACA,IACA,MACA,OAAO,SACD;AACN,QAAM,QAAQ,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE;AACzC,QAAM,OAAO;AACb,MAAI,SAAS,OAAO;AAClB,UAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,UAAM,KAAK,KAAK,IAAI,KAAK,IAAI,OAAO;AACpC,UAAM,KAAK,KAAK,IAAI,KAAK,IAAI,OAAO;AACpC,kBAAc,MAAM;AAAA,MAClB,IAAI,KAAK;AAAA,MACT,IAAI,KAAK;AAAA,MACT,IAAI,KAAK;AAAA,MACT,IAAI,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,IACpB,CAAC;AACD,QAAI,OAAO,IAAI;AACf;AAAA,EACF;AACA,MAAI,SAAS,SAAS,SAAS,UAAU;AACvC,UAAM,SAAS,SAAS,gBAAgB,QAAQ,QAAQ;AACxD,kBAAc,QAAQ,EAAE,IAAI,IAAI,IAAI,IAAI,GAAG,OAAO,MAAM,KAAK,CAAC;AAC9D,QAAI,OAAO,MAAM;AACjB;AAAA,EACF;AACA,QAAM,SAAS;AAAA,IACb,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,KAAK,OAAO,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,GAAG,KAAK,OAAO,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,CAAC;AAAA,IACrF,CAAC,KAAK,OAAO,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,GAAG,KAAK,OAAO,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,CAAC;AAAA,EACvF;AACA,QAAM,UAAU,SAAS,gBAAgB,IAAI,cAAc,SAAS;AACpE,UAAQ,aAAa,UAAU,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;AAC/E,UAAQ,aAAa,QAAQ,SAAS,sBAAsB,SAAS,kBAAkB,gBAAgB,IAAI;AAC3G,UAAQ,aAAa,UAAU,IAAI;AACnC,MAAI,OAAO,OAAO;AACpB;AAEA,SAAS,oBAAoB,QAA+B;AAC1D,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,OAAO,IAAI,CAAC,UAAU;AACnC,UAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,UAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,UAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,UAAM,QAAQ,KAAK,IAAI,GAAGA,cAAa,MAAM,GAAGA,cAAa,MAAM,OAAO,GAAG,CAAC,CAAC;AAC/E,UAAM,SAAS,KAAK,IAAI,GAAGA,cAAa,MAAM,GAAGA,cAAa,MAAM,QAAQ,EAAE,CAAC,CAAC;AAChF,WAAO,EAAE,GAAG,GAAG,OAAO,OAAO;AAAA,EAC/B,CAAC;AACD,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,IAAI;AAC3D,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,IAAI;AAC3D,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,KAAK,CAAC,IAAI;AACzE,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,MAAM,CAAC,IAAI;AAC1E,SAAO,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,KAAK,OAAO,IAAI,CAAC;AACpF;AAEA,SAAS,wBAAwB,OAAiD;AAChF,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,MAAM,QAAQ,CAAC,YAAY;AAChC,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,aAAO,CAAC;AAAA,IACV;AACA,UAAM,SAAU,QAAoC;AACpD,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,CAAC;AAAA,IACV;AACA,WAAO,OAAO,IAAI,CAAC,UAAU,eAAe,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;AAAA,EACpE,CAAC;AACH;AAEA,SAAS,eAAe,OAAgB,UAA8D;AACpG,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO;AAAA,MACL,GAAGA,cAAa,MAAM,CAAC,GAAG,SAAS,CAAC;AAAA,MACpC,GAAGA,cAAa,MAAM,CAAC,GAAG,SAAS,CAAC;AAAA,IACtC;AAAA,EACF;AACA,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ;AACd,SAAO;AAAA,IACL,GAAGA,cAAa,MAAM,GAAG,SAAS,CAAC;AAAA,IACnC,GAAGA,cAAa,MAAM,GAAG,SAAS,CAAC;AAAA,EACrC;AACF;AAEA,SAASA,cAAa,OAAgB,UAA0B;AAC9D,QAAM,SAAS,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC/D,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,WAAW,MAAc,QAAwB;AACxD,SAAO,SAAS,WAAW,SAAS,UAAU,SAAS,YAAY,YAAY,QAAQ,IAAI,IAAI;AACjG;AAEA,SAAS,YAAY,OAAe,QAAQ,GAAW;AACrD,QAAM,SAAmD;AAAA,IACvD,OAAO,CAAC,IAAI,IAAI,EAAE;AAAA,IAClB,MAAM,CAAC,KAAK,KAAK,GAAG;AAAA,IACpB,OAAO,CAAC,KAAK,KAAK,GAAG;AAAA,IACrB,KAAK,CAAC,KAAK,IAAI,EAAE;AAAA,IACjB,QAAQ,CAAC,KAAK,IAAI,EAAE;AAAA,IACpB,QAAQ,CAAC,KAAK,KAAK,CAAC;AAAA,IACpB,OAAO,CAAC,IAAI,KAAK,EAAE;AAAA,IACnB,MAAM,CAAC,IAAI,IAAI,GAAG;AAAA,IAClB,QAAQ,CAAC,KAAK,IAAI,GAAG;AAAA,IACrB,QAAQ,CAAC,KAAK,IAAI,GAAG;AAAA,IACrB,MAAM,CAAC,KAAK,IAAI,GAAG;AAAA,EACrB;AACA,MAAI,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,KAAK,GAAG;AACpD,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO,KAAK,KAAK,OAAO;AACtC,SAAO,SAAS,IAAI,OAAO,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,MAAM,KAAK,GAAG,CAAC,MAAM,KAAK;AACnF;AAEA,SAAS,aAAa,OAAoB,MAAoB;AAC5D,QAAM,WAAW,sBAAsB,IAAI;AAC3C,MAAI,SAAS,WAAW,GAAG;AACzB,qBAAiB,OAAO,WAAW,IAAI;AACvC;AAAA,EACF;AAEA,aAAW,CAAC,OAAO,OAAO,KAAK,SAAS,QAAQ,GAAG;AACjD,UAAM,UAAU,cAAc,oCAAgB,QAAQ,CAAC,EAAE;AACzD,UAAM,SAAS,kBAAkB,OAAO;AACxC,QAAI,OAAO,SAAS,GAAG;AACrB,cAAQ,OAAO,qBAAqB,OAAO,IAAI,iBAAiB,CAAC,CAAC;AAClE,YAAM,MAAM,SAAS,gBAAgB,QAAQ,KAAK;AAClD,UAAI,aAAa,SAAS,eAAe;AACzC,UAAI,aAAa,WAAW,oBAAoB,MAAM,CAAC;AACvD,iBAAW,SAAS,QAAQ;AAC1B,0BAAkB,KAAK,KAAK;AAAA,MAC9B;AACA,cAAQ,OAAO,GAAG;AAAA,IACpB;AAEA,UAAM,UAAU,SAAS,cAAc,SAAS;AAChD,YAAQ,YAAY;AACpB,UAAM,UAAU,SAAS,cAAc,SAAS;AAChD,YAAQ,cAAc,OAAO,SAAS,IAAI,sCAAa,OAAO,MAAM,iBAAY;AAChF,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,YAAY;AAChB,QAAI,cAAc,QAAQ,MAAM,GAAG,GAAK;AACxC,YAAQ,OAAO,SAAS,GAAG;AAC3B,YAAQ,OAAO,OAAO;AACtB,UAAM,OAAO,OAAO;AAAA,EACtB;AACF;AAiBA,SAAS,sBAAsB,MAAwB;AACrD,QAAM,UAAU,CAAC,GAAG,KAAK,SAAS,sCAAsC,CAAC,EAAE,IAAI,CAAC,UAAU,oBAAoB,MAAM,CAAC,KAAK,EAAE,CAAC;AAC7H,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO;AAAA,EACT;AACA,SAAO,KAAK,SAAS,eAAe,IAAI,CAAC,IAAI,IAAI,CAAC;AACpD;AAEA,SAAS,kBAAkB,KAA4B;AACrD,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,WAAO,CAAC;AAAA,EACV;AACA,SAAO,MAAM,KAAK,IAAI,iBAAiB,QAAQ,CAAC,EAAE,QAAQ,CAAC,SAAS;AAClE,UAAM,WAAW,MAAM,KAAK,KAAK,QAAQ,EAAE,KAAK,CAAC,UAAU,MAAM,cAAc,YAAY;AAC3F,UAAM,SAAS,KAAK,aAAa,QAAQ,MAAM;AAC/C,UAAM,OAAO,KAAK,aAAa,MAAM,MAAM;AAC3C,QAAI,CAAC,UAAU,CAAC,MAAM;AACpB,aAAO,CAAC;AAAA,IACV;AACA,UAAM,QAAqB;AAAA,MACzB,IAAI,KAAK,aAAa,IAAI,KAAK;AAAA,MAC/B,OAAO,cAAc,KAAK,aAAa,OAAO,KAAK,EAAE;AAAA,MACrD,OAAO,iBAAiB,KAAK,aAAa,OAAO,KAAK,EAAE;AAAA,MACxD;AAAA,MACA;AAAA,MACA,GAAGA,cAAa,UAAU,aAAa,GAAG,GAAG,CAAC;AAAA,MAC9C,GAAGA,cAAa,UAAU,aAAa,GAAG,GAAG,CAAC;AAAA,MAC9C,OAAO,KAAK,IAAI,GAAGA,cAAa,UAAU,aAAa,OAAO,GAAG,GAAG,CAAC;AAAA,MACrE,QAAQ,KAAK,IAAI,GAAGA,cAAa,UAAU,aAAa,QAAQ,GAAG,OAAO,IAAI,EAAE,CAAC;AAAA,MACjF,QAAQ,KAAK,aAAa,QAAQ,KAAK;AAAA,MACvC,QAAQ,KAAK,aAAa,QAAQ,KAAK;AAAA,IACzC;AAEA,QAAI,QAAQ,UAAU;AACpB,YAAM,SAAS,MAAM,KAAK,SAAS,QAAQ,EACxC,OAAO,CAAC,UAAU,MAAM,cAAc,SAAS,EAC/C,IAAI,CAAC,WAAW;AAAA,QACf,GAAGA,cAAa,MAAM,aAAa,GAAG,GAAG,CAAC;AAAA,QAC1C,GAAGA,cAAa,MAAM,aAAa,GAAG,GAAG,CAAC;AAAA,MAC5C,EAAE;AACJ,UAAI,OAAO,UAAU,GAAG;AACtB,cAAM,IAAI,OAAO,CAAC,EAAE;AACpB,cAAM,IAAI,OAAO,CAAC,EAAE;AACpB,cAAM,QAAQ,OAAO,OAAO,SAAS,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE;AACtD,cAAM,SAAS,OAAO,OAAO,SAAS,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE;AACvD,cAAM,SAAS;AAAA,MACjB;AAAA,IACF;AACA,WAAO,CAAC,KAAK;AAAA,EACf,CAAC;AACH;AAEA,SAAS,iBAAiB,OAAuC;AAC/D,QAAM,SAAiC,CAAC;AACxC,QAAM,aAAa,MAAM,MAAM,gDAAgD;AAC/E,QAAM,iBAAiB,aAAa,MAAM,QAAQ,WAAW,CAAC,GAAG,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,yBAAyB,qBAAqB,IAAI;AACnJ,aAAW,QAAQ,eAAe,MAAM,GAAG,GAAG;AAC5C,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,UAAM,YAAY,KAAK,QAAQ,GAAG;AAClC,UAAM,MAAM,aAAa,IAAI,KAAK,MAAM,GAAG,SAAS,IAAI;AACxD,UAAM,QAAQ,aAAa,IAAI,KAAK,MAAM,YAAY,CAAC,IAAI;AAC3D,QAAI,KAAK;AACP,aAAO,GAAG,IAAI,UAAU,mBAAmB,aAAa,WAAW,CAAC,IAAI;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,QAA+B;AAC1D,QAAM,SAAS,OAAO,IAAI,CAAC,WAAW;AAAA,IACpC,GAAG,KAAK,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,KAAK;AAAA,IAC1C,GAAG,KAAK,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,MAAM;AAAA,IAC3C,OAAO,KAAK,IAAI,MAAM,KAAK;AAAA,IAC3B,QAAQ,KAAK,IAAI,MAAM,MAAM;AAAA,EAC/B,EAAE;AACF,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,IAAI;AAC3D,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,IAAI;AAC3D,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,KAAK,CAAC,IAAI;AACzE,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,MAAM,CAAC,IAAI;AAC1E,SAAO,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,KAAK,OAAO,IAAI,CAAC;AACpF;AAEA,SAAS,kBAAkB,KAAoB,OAA0B;AACvE,QAAM,SAAS,YAAY,MAAM,MAAM,aAAa,SAAS;AAC7D,QAAM,OAAO,MAAM,MAAM,cAAc,SAAS,gBAAgB,YAAY,MAAM,MAAM,WAAW,SAAS;AAC5G,QAAM,cAAcA,cAAa,MAAM,MAAM,aAAa,GAAG;AAC7D,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,cAAa,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;AACrF,QAAM,cAAc,kBAAkB,MAAM,OAAO,WAAW;AAC9D,QAAM,YAAY,gBAAgB,KAAK;AAEvC,MAAI,MAAM,MAAM;AACd,UAAM,SAAS,MAAM,UAAU;AAAA,MAC7B,EAAE,GAAG,MAAM,GAAG,GAAG,MAAM,EAAE;AAAA,MACzB,EAAE,GAAG,MAAM,IAAI,MAAM,OAAO,GAAG,MAAM,IAAI,MAAM,OAAO;AAAA,IACxD;AACA,QAAI,OAAO,SAAS,GAAG;AACrB,YAAM,WAAW,SAAS,gBAAgB,QAAQ,UAAU;AAC5D,oBAAc,UAAU;AAAA,QACtB,QAAQ,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,EAAE,KAAK,GAAG;AAAA,QAC/D,MAAM;AAAA,QACN;AAAA,QACA,GAAG;AAAA,QACH,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB;AAAA,MACF,CAAC;AACD,UAAI,OAAO,QAAQ;AAAA,IACrB,OAAO;AACL,YAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,oBAAc,MAAM;AAAA,QAClB,IAAI,OAAO,CAAC,EAAE;AAAA,QACd,IAAI,OAAO,CAAC,EAAE;AAAA,QACd,IAAI,OAAO,CAAC,EAAE;AAAA,QACd,IAAI,OAAO,CAAC,EAAE;AAAA,QACd;AAAA,QACA,GAAG;AAAA,QACH,kBAAkB;AAAA,QAClB;AAAA,MACF,CAAC;AACD,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,QAAI,MAAM,MAAM,YAAY,MAAM,MAAM,aAAa,QAAQ;AAC3D,YAAM,OAAO,OAAO,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,CAAC;AAClD,YAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,sBAAgB,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM;AAAA,IAC7D;AACA;AAAA,EACF;AAEA,QAAM,YAAY,gBAAgB,MAAM,KAAK;AAC7C,MAAI,cAAc,SAAS;AACzB,sBAAkB,KAAK,OAAO,SAAS,SAAS;AAAA,EAClD,WAAW,cAAc,WAAW;AAClC,UAAM,UAAU,SAAS,gBAAgB,QAAQ,SAAS;AAC1D,kBAAc,SAAS;AAAA,MACrB,IAAI,MAAM,IAAI,MAAM,QAAQ;AAAA,MAC5B,IAAI,MAAM,IAAI,MAAM,SAAS;AAAA,MAC7B,IAAI,MAAM,QAAQ;AAAA,MAClB,IAAI,MAAM,SAAS;AAAA,MACnB;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,OAAO;AAAA,EACpB,WAAW,cAAc,aAAa,cAAc,WAAW;AAC7D,UAAM,UAAU,SAAS,gBAAgB,QAAQ,SAAS;AAC1D,kBAAc,SAAS;AAAA,MACrB,QAAQ,GAAG,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,MAAM,IAAI,MAAM,SAAS,CAAC,IAAI,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,SAAS,CAAC;AAAA,MACtM;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,OAAO;AAAA,EACpB,WAAW,cAAc,aAAa,cAAc,WAAW;AAC7D,UAAM,UAAU,SAAS,gBAAgB,QAAQ,SAAS;AAC1D,UAAM,QAAQ,cAAc,YAAY,MAAM,QAAQ,OAAO,MAAM,QAAQ;AAC3E,kBAAc,SAAS;AAAA,MACrB,QACE,cAAc,YACV,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,MAAM,IAAI,MAAM,SAAS,CAAC,IAAI,MAAM,IAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,MAAM,KACxN,GAAG,MAAM,IAAI,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,MAAM,IAAI,MAAM,SAAS,CAAC,IAAI,MAAM,IAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,SAAS,CAAC;AAAA,MACvR;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,OAAO;AAAA,EACpB,WAAW,cAAc,YAAY;AACnC,UAAM,UAAU,SAAS,gBAAgB,QAAQ,SAAS;AAC1D,kBAAc,SAAS;AAAA,MACrB,QAAQ,GAAG,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,MAAM;AAAA,MACvI;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,OAAO;AAAA,EACpB,WAAW,cAAc,WAAW,cAAc,YAAY;AAC5D,sBAAkB,KAAK,OAAO,QAAQ,aAAa,SAAS,SAAS;AAAA,EACvE,WAAW,cAAc,YAAY;AACnC,UAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,kBAAc,MAAM;AAAA,MAClB,GAAG,yBAAyB,MAAM,GAAG,MAAM,GAAG,MAAM,OAAO,MAAM,MAAM;AAAA,MACvE;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,IAAI;AAAA,EACjB,WAAW,cAAc,YAAY;AACnC,UAAM,QAAQ,SAAS,gBAAgB,QAAQ,GAAG;AAClD,kBAAc,OAAO,EAAE,UAAU,CAAC;AAClC,UAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,kBAAc,MAAM;AAAA,MAClB,GAAG,MAAM;AAAA,MACT,GAAG,MAAM,IAAI,KAAK,IAAI,IAAI,MAAM,SAAS,IAAI,IAAI;AAAA,MACjD,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM,SAAS,KAAK,IAAI,IAAI,MAAM,SAAS,IAAI;AAAA,MACvD;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AACD,UAAM,MAAM,SAAS,gBAAgB,QAAQ,SAAS;AACtD,UAAM,SAAS,SAAS,gBAAgB,QAAQ,SAAS;AACzD,UAAM,YAAY,KAAK,IAAI,IAAI,MAAM,SAAS,IAAI;AAClD,kBAAc,KAAK;AAAA,MACjB,IAAI,MAAM,IAAI,MAAM,QAAQ;AAAA,MAC5B,IAAI,MAAM,IAAI,YAAY;AAAA,MAC1B,IAAI,MAAM,QAAQ;AAAA,MAClB,IAAI,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AACD,kBAAc,QAAQ;AAAA,MACpB,IAAI,MAAM,IAAI,MAAM,QAAQ;AAAA,MAC5B,IAAI,MAAM,IAAI,MAAM,SAAS,YAAY;AAAA,MACzC,IAAI,MAAM,QAAQ;AAAA,MAClB,IAAI,YAAY;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,MACA,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AACD,UAAM,OAAO,MAAM,KAAK,MAAM;AAC9B,QAAI,OAAO,KAAK;AAAA,EAClB,WAAW,cAAc,SAAS;AAChC,UAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,kBAAc,MAAM;AAAA,MAClB,GAAG,sBAAsB,MAAM,GAAG,MAAM,GAAG,MAAM,OAAO,MAAM,MAAM;AAAA,MACpE;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,IAAI;AAAA,EACjB,WAAW,cAAc,YAAY;AACnC,UAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,kBAAc,MAAM;AAAA,MAClB,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,IAAI,MAAM,MAAM,YAAY,MAAM,KAAK,IAAI,IAAI,MAAM,SAAS,CAAC,IAAI;AAAA,MACnE;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,SAAS,SAAS,gBAAgB,QAAQ,MAAM;AACtD,UAAM,eAAe,KAAK,IAAI,MAAM,QAAQA,cAAa,MAAM,MAAM,WAAW,EAAE,CAAC;AACnF,kBAAc,QAAQ;AAAA,MACpB,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,OAAO,MAAM;AAAA,MACb,QAAQ;AAAA,MACR,IAAI,MAAM,MAAM,YAAY,MAAM,KAAK,IAAI,IAAI,eAAe,CAAC,IAAI;AAAA,MACnE,MAAM,YAAY,MAAM,MAAM,qBAAqB,MAAM,MAAM,WAAW,SAAS;AAAA,MACnF;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,MAAM,MAAM;AAAA,EACzB,OAAO;AACL,UAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,kBAAc,MAAM;AAAA,MAClB,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,IAAI,MAAM,MAAM,YAAY,MAAM,KAAK,IAAI,IAAI,MAAM,SAAS,CAAC,IAAI;AAAA,MACnE;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA;AAAA,IACE;AAAA,IACA,MAAM;AAAA,IACN,MAAM,IAAI,MAAM,QAAQ;AAAA,IACxB,MAAM,IAAI,MAAM,SAAS;AAAA,IACzB,YAAY,MAAM,MAAM,WAAW,SAAS;AAAA,IAC5C,MAAM;AAAA,IACN;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAAuC;AAC9D,MAAI,MAAM,OAAO;AACf,WAAO,MAAM;AAAA,EACf;AACA,MAAI,MAAM,OAAO;AACf,WAAO;AAAA,EACT;AACA,MAAI,MAAM,YAAY,KAAK;AACzB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,YAAY,KAAK;AACzB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,aAAa,KAAK;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,KAAK;AACtB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,KAAoB,OAAoB,SAAiB,WAAyB;AAC3G,QAAM,MAAM,MAAM,MAAM,SAAS;AACjC,MAAI,wDAAwD,KAAK,GAAG,GAAG;AACrE,UAAM,QAAQ,SAAS,gBAAgB,QAAQ,OAAO;AACtD,kBAAc,OAAO;AAAA,MACnB,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,MAAM;AAAA,MACN,qBAAqB;AAAA,MACrB;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,KAAK;AAChB;AAAA,EACF;AACA,QAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,gBAAc,MAAM;AAAA,IAClB,GAAG,MAAM;AAAA,IACT,GAAG,MAAM;AAAA,IACT,OAAO,MAAM;AAAA,IACb,QAAQ,MAAM;AAAA,IACd,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,oBAAoB;AAAA,IACpB;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,OAAO,IAAI;AACjB;AAEA,SAAS,kBACP,KACA,OACA,QACA,aACA,SACA,WACM;AACN,QAAM,QAAQ,SAAS,gBAAgB,QAAQ,GAAG;AAClD,gBAAc,OAAO,EAAE,SAAS,UAAU,CAAC;AAC3C,QAAM,KAAK,MAAM,IAAI,MAAM,QAAQ;AACnC,QAAM,aAAa,KAAK,IAAI,MAAM,OAAO,MAAM,MAAM,IAAI;AACzD,QAAM,OAAO,SAAS,gBAAgB,QAAQ,QAAQ;AACtD,gBAAc,MAAM;AAAA,IAClB;AAAA,IACA,IAAI,MAAM,IAAI,aAAa;AAAA,IAC3B,GAAG;AAAA,IACH,MAAM;AAAA,IACN;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AACD,QAAM,OAAO,cAAc,IAAI,MAAM,IAAI,aAAa,KAAK,IAAI,MAAM,IAAI,MAAM,SAAS,MAAM,QAAQ,WAAW;AACjH,QAAM,OAAO,cAAc,MAAM,IAAI,MAAM,QAAQ,MAAM,MAAM,IAAI,MAAM,SAAS,MAAM,MAAM,IAAI,MAAM,QAAQ,MAAM,MAAM,IAAI,MAAM,SAAS,MAAM,QAAQ,WAAW;AACxK,QAAM,UAAU,cAAc,IAAI,MAAM,IAAI,MAAM,SAAS,MAAM,MAAM,IAAI,MAAM,QAAQ,MAAM,MAAM,IAAI,MAAM,QAAQ,QAAQ,WAAW;AAC1I,QAAM,WAAW,cAAc,IAAI,MAAM,IAAI,MAAM,SAAS,MAAM,MAAM,IAAI,MAAM,QAAQ,MAAM,MAAM,IAAI,MAAM,QAAQ,QAAQ,WAAW;AAC3I,QAAM,OAAO,MAAM,MAAM,MAAM,SAAS,QAAQ;AAChD,MAAI,OAAO,KAAK;AAClB;AAEA,SAAS,cACP,IACA,IACA,IACA,IACA,QACA,aACgB;AAChB,QAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,gBAAc,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH,kBAAkB;AAAA,EACpB,CAAC;AACD,SAAO;AACT;AAEA,SAAS,yBAAyB,GAAW,GAAW,OAAe,QAAwB;AAC7F,QAAM,OAAO,KAAK,IAAI,IAAI,SAAS,IAAI;AACvC,SAAO;AAAA,IACL,KAAK,CAAC,IAAI,CAAC;AAAA,IACX,KAAK,IAAI,KAAK;AAAA,IACd,KAAK,IAAI,SAAS,IAAI;AAAA,IACtB,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,OAAO,CAAC,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,OAAO,GAAG,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,OAAO,GAAG;AAAA,IAC9I,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,SAAS,OAAO,IAAI;AAAA,IAC5H;AAAA,EACF,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,kBAAkB,OAA+B,aAAsD;AAC9G,QAAM,QAAyC;AAAA,IAC7C,gBAAgB;AAAA,EAClB;AACA,MAAI,MAAM,WAAW,KAAK;AACxB,UAAM,kBAAkB,IAAI,MAAM,eAAe,GAAG,cAAc,CAAC,IAAI,cAAc,CAAC;AAAA,EACxF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA4B;AACnD,QAAM,WAAWA,cAAa,MAAM,MAAM,UAAU,CAAC;AACrD,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO,UAAU,QAAQ,IAAI,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,MAAM,IAAI,MAAM,SAAS,CAAC;AACtF;AAEA,SAAS,sBAAsB,GAAW,GAAW,OAAe,QAAwB;AAC1F,QAAM,KAAK,IAAI,QAAQ;AACvB,QAAM,KAAK,IAAI,SAAS;AACxB,SAAO;AAAA,IACL,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI;AAAA,IAC1C,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI;AAAA,IAC9H,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,EAAE,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI;AAAA,IAChH,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,GAAG,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI;AAAA,IAC7H,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,GAAG,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI;AAAA,IAC7H;AAAA,EACF,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,iBACP,KACA,MACA,GACA,GACA,MACA,QAAgC,CAAC,GACjC,YAAY,IACN;AACN,MAAI,CAAC,KAAK,KAAK,GAAG;AAChB;AAAA,EACF;AACA,QAAM,QAAQ,qBAAqB,IAAI,EAAE,MAAM,OAAO,EAAE,OAAO,OAAO;AACtE,MAAI,MAAM,WAAW,GAAG;AACtB;AAAA,EACF;AACA,QAAM,WAAW,SAAS,gBAAgB,QAAQ,MAAM;AACxD,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,YAAY,OAAO,SAAS,MAAM,aAAa,KAAK,EAAE;AAC5D,gBAAc,UAAU;AAAA,IACtB,GAAG,UAAU,SAAS,IAAIA,cAAa,MAAM,aAAa,CAAC,IAAI,UAAU,UAAU,IAAIA,cAAa,MAAM,cAAc,CAAC,IAAI;AAAA,IAC7H;AAAA,IACA;AAAA,IACA,aAAaA,cAAa,MAAM,UAAU,EAAE;AAAA,IAC5C,eAAe;AAAA,IACf,eAAe,YAAY,IAAI,QAAQ;AAAA,IACvC,cAAc,YAAY,IAAI,WAAW;AAAA,IACzC,mBAAmB,YAAY,IAAI,cAAc;AAAA,IACjD,eAAe,UAAU,SAAS,UAAU,UAAU,UAAU,QAAQ;AAAA,IACxE,qBAAqB;AAAA,IACrB;AAAA,EACF,CAAC;AACD,QAAM,UAAU,MAAM,SAAS,IAAI,GAAG,SAAS,MAAM,SAAS,EAAE,OAAO;AACvE,aAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC3C,UAAM,OAAO,SAAS,gBAAgB,QAAQ,OAAO;AACrD,SAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,SAAK,aAAa,MAAM,UAAU,IAAI,UAAU,OAAO;AACvD,SAAK,cAAc;AACnB,aAAS,OAAO,IAAI;AAAA,EACtB;AACA,MAAI,OAAO,QAAQ;AACrB;AAEA,SAAS,qBAAqB,MAAsB;AAClD,QAAM,UAAU,cAAc,IAAI;AAClC,SAAO,QACJ,QAAQ,gBAAgB,IAAI,EAC5B,QAAQ,0BAA0B,IAAI,EACtC,QAAQ,YAAY,EAAE,EACtB,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,cAAc,IAAI,EAAE,QAAQ,WAAW,GAAG,EAAE,QAAQ,WAAW,GAAG,EAAE,KAAK,CAAC,EACxF,OAAO,OAAO,EACd,KAAK,IAAI;AACd;AAEA,SAAS,YAAY,OAA2B,UAA0B;AACxE,MAAI,CAAC,SAAS,UAAU,WAAW;AACjC,WAAO;AAAA,EACT;AACA,SAAO,MAAM,WAAW,GAAG,IAAI,QAAQ,IAAI,KAAK;AAClD;AAEA,SAAS,cAAc,OAAuB;AAC5C,QAAM,WAAW,SAAS,cAAc,UAAU;AAClD,WAAS,YAAY;AACrB,SAAO,SAAS;AAClB;AAEA,SAAS,iBAAiB,OAAoB,WAAmB,MAAoB;AACnF,QAAM,UAAU,cAAc,GAAG,SAAS,2BAAO;AACjD,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,MAAI,cAAc,KAAK,MAAM,GAAG,GAAK;AACrC,UAAQ,OAAO,GAAG;AAClB,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,2BAA2B,OAAoB,WAAmB,MAAc,OAAsB;AAC7G,QAAM,gBAAgB;AACtB,QAAM,UAAU,cAAc,GAAG,SAAS,2BAAO;AACjD,QAAM,UAAU,SAAS,cAAc,GAAG;AAC1C,UAAQ,cAAc,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC3E,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,MAAI,cAAc,KAAK,MAAM,GAAG,GAAK,KAAK;AAC1C,UAAQ,OAAO,SAAS,GAAG;AAC3B,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,oBAAoB,OAAuB;AAClD,MAAI;AACF,UAAM,UAAU,mBAAmB,OAAO,KAAK,KAAK,CAAC,CAAC;AACtD,WAAO,aAAAC,QAAK,WAAW,WAAW,KAAK,SAAS,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,GAAG;AAAA,MAC7E,IAAI;AAAA,IACN,CAAC;AAAA,EACH,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC//CA,IAAM,gBAAgB,oBAAI,IAAI;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,mBAA2C;AAAA,EAC/C,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,2BAA2B;AAAA,EAC3B,iBAAiB;AAAA,EACjB,gCAAgC;AAAA,EAChC,wBAAwB;AAC1B;AAEO,SAAS,YAA2B;AACzC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,cAAc,IAAI,KAAK,SAAS,KAAK,aAAa,IAAI,KAAK,QAAQ;AAAA,IAC5E;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,SAAS;AACnC,UAAI,SAAS,OAAO,KAAK;AAEzB,YAAM,YAAY,cAAc,IAAI,MAAM,gBAAgB;AAC1D,UAAI,cAAc,UAAU,cAAc,OAAO;AAC/C,mBAAW,OAAO,MAAM,aAAa,IAAI,IAAI,GAAG,SAAS;AACzD,eAAO,EAAE,SAAS,MAAM,MAAM,OAAO,EAAE;AAAA,MACzC;AACA,UAAI,cAAc,UAAU,cAAc,OAAO;AAC/C,mBAAW,OAAO,MAAM,aAAa,IAAI,IAAI,GAAG,SAAS;AACzD,eAAO,EAAE,SAAS,MAAM,MAAM,OAAO,EAAE;AAAA,MACzC;AACA,UAAI,cAAc,OAAO;AACvB,kBAAU,OAAO,MAAM,aAAa,IAAI,IAAI,CAAC;AAC7C,eAAO,EAAE,SAAS,MAAM,MAAM,OAAO,EAAE;AAAA,MACzC;AACA,UAAI,cAAc,SAAS,cAAc,OAAO;AAC9C,wBAAgB,OAAO,MAAM,gBAAgB,IAAI,IAAI,GAAG,WAAW,IAAI,KAAK,IAAI;AAChF,eAAO,EAAE,SAAS,MAAM,MAAM,OAAO,EAAE;AAAA,MACzC;AACA,UAAI,cAAc,OAAO;AACvB,cAAM,UAAU,cAAc,8BAAU;AACxC,gBAAQ,OAAO,IAAI,aAAa,KAAK,8PAAsD;AAC3F,cAAM,OAAO,OAAO;AACpB,eAAO,EAAE,SAAS,MAAM,MAAM,OAAO,EAAE;AAAA,MACzC;AAEA,YAAM,MAAM,MAAM,aAAa,IAAI,IAAI;AACvC,YAAM,SAAS,UAAU,OAAO,GAAG;AACnC,aAAO;AAAA,QACL,WAAW,SAAS;AAClB,iBAAO,OAAO,WAAW,OAAO;AAAA,QAClC;AAAA,QACA,QAAQ,SAAS;AACf,iBAAO,OAAO,QAAQ,OAAO;AAAA,QAC/B;AAAA,QACA,UAAU;AACR,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,WAAW,OAAoB,MAAc,WAAyB;AAC7E,QAAM,UAAU,iBAAiB,IAAI;AACrC,QAAM,aAAa,QAAQ,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC;AAC/D,QAAM,UAAU,cAAc,GAAG,UAAU,YAAY,CAAC,2BAAO;AAC/D,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cAAc;AAEnB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,EAAAC,YAAW,MAAM,gBAAM,QAAQ,MAAM;AACrC,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI;AACtC,EAAAA,YAAW,MAAM,UAAK,WAAW,IAAI,iBAAiB,KAAK,CAAC;AAC5D,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI,WAAW,KAAK,CAAC;AACvD,UAAQ,OAAO,MAAM,MAAM,kBAAkB,UAAU,CAAC;AAExD,QAAM,QAAQ;AAAA,IACZ,QAAQ,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,YAAY;AAAA,MACrC,IAAI,OAAO;AAAA,MACX,MAAM,OAAO;AAAA,MACb,QAAQ,oBAAoB,MAAM;AAAA,IACpC,EAAE;AAAA,EACJ;AACA,UAAQ,OAAO,KAAK;AACpB,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,WAAW,OAAoB,MAAc,WAAyB;AAC7E,QAAM,UAAU,iBAAiB,IAAI;AACrC,QAAM,aAAa,QAAQ,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC;AAC/D,QAAM,UAAU,cAAc,GAAG,UAAU,YAAY,CAAC,2BAAO;AAC/D,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cAAc;AAEnB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,EAAAA,YAAW,MAAM,gBAAM,QAAQ,MAAM;AACrC,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI;AACtC,EAAAA,YAAW,MAAM,sBAAO,WAAW,IAAI,KAAK,KAAK,CAAC;AAClD,EAAAA,YAAW,MAAM,sBAAO,WAAW,IAAI,KAAK,KAAK,CAAC;AAClD,UAAQ,OAAO,MAAM,MAAM,kBAAkB,YAAY,gCAAO,CAAC;AAEjE,QAAM,QAAQ;AAAA,IACZ,QAAQ,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,QAAQ,WAAW;AAAA,MAC5C,IAAI,OAAO,QAAQ,CAAC;AAAA,MACpB,MAAM,aAAa,OAAO,IAAI;AAAA,MAC9B,QAAQ,OAAO,OAAO,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AAAA,IAC7C,EAAE;AAAA,EACJ;AACA,UAAQ,OAAO,KAAK;AACpB,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,UAAU,OAAoB,MAAoB;AACzD,QAAM,UAAU,iBAAiB,IAAI;AACrC,QAAM,aAAa,QAAQ,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC;AAC/D,QAAM,UAAU,cAAc,kCAAc;AAC5C,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cAAc;AAEnB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,EAAAA,YAAW,MAAM,gBAAM,QAAQ,MAAM;AACrC,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI;AACtC,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI,YAAY,KAAK,CAAC;AACxD,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI,aAAa,KAAK,CAAC;AACzD,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI,mBAAmB,KAAK,CAAC;AAC/D,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI,UAAU,KAAK,CAAC;AACtD,EAAAA,YAAW,MAAM,gBAAM,iBAAiB,UAAU,CAAC;AACnD,UAAQ,OAAO,MAAM,MAAM,kBAAkB,YAAY,8BAAU,CAAC;AAEpE,QAAM,YAAY,mBAAmB,OAAO;AAC5C,MAAI,WAAW;AACb,YAAQ,OAAO,SAAS;AAAA,EAC1B;AAEA,QAAM,QAAQ;AAAA,IACZ,QAAQ,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,YAAY;AAAA,MACrC,IAAI,OAAO;AAAA,MACX,MAAM,OAAO;AAAA,MACb,QAAQ,mBAAmB,MAAM;AAAA,IACnC,EAAE;AAAA,EACJ;AACA,UAAQ,OAAO,KAAK;AACpB,QAAM,OAAO,OAAO;AACtB;AAaA,SAAS,gBAAgB,OAAoB,aAA0B,WAAmB,UAAwB;AAChH,QAAM,QAAQ,IAAI,WAAW,WAAW;AACxC,QAAM,UAAU,cAAc,GAAG,UAAU,YAAY,CAAC,2BAAO;AAC/D,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cACH,cAAc,QACV,oTACA;AAEN,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,EAAAA,YAAW,MAAM,gBAAM,QAAQ;AAC/B,EAAAA,YAAW,MAAM,gBAAM,UAAU,YAAY,CAAC;AAC9C,EAAAA,YAAW,MAAM,gBAAMC,aAAY,MAAM,UAAU,CAAC;AACpD,EAAAD,YAAW,MAAM,gBAAME,eAAc,KAAK,CAAC;AAC3C,EAAAF,YAAW,MAAM,gBAAM,iBAAiB,OAAO,SAAS,CAAC;AACzD,EAAAA,YAAW,MAAM,gBAAM,mBAAmB,KAAK,CAAC;AAEhD,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,UAAQ,YAAY;AACpB,QAAM,cACJ,cAAc,QACV;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF,IACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACN,aAAW,cAAc,aAAa;AACpC,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc;AACnB,YAAQ,OAAO,IAAI;AAAA,EACrB;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,cAAc,WAAW,KAAK;AAEtC,UAAQ,OAAO,MAAM,MAAM,qBAAqB,OAAO,SAAS,GAAG,SAAS,OAAO;AACnF,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,qBAAqB,OAAmB,WAAgC;AAC/E,QAAM,QAAQ,eAAe,KAAK;AAClC,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,UAAQ,OAAO;AACf,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,cAAc;AACtB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,EAAAA,YAAW,MAAM,4BAAQ,MAAM,OAAO,MAAM;AAC5C,EAAAA,YAAW,MAAM,kCAAS,uBAAuB,MAAM,YAAY,CAAC;AACpE,EAAAA,YAAW,MAAM,4BAAQ,OAAO,MAAM,WAAW,MAAM,CAAC;AACxD,EAAAA,YAAW,MAAM,mCAAU,OAAO,MAAM,WAAW,MAAM,CAAC;AAC1D,EAAAA,YAAW,MAAM,4BAAQ,OAAO,MAAM,aAAa,MAAM,CAAC;AAC1D,EAAAA,YAAW,MAAM,4BAAQ,cAAc,QAAQ,mCAAU,uCAAS;AAClE,UAAQ,OAAO,SAAS,IAAI;AAE5B,QAAM,QAAQ,CAAC,GAAG,MAAM,YAAY,GAAG,MAAM,YAAY,GAAG,MAAM,YAAY,EAAE,MAAM,GAAG,EAAE;AAC3F,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,YAAY;AACjB,eAAW,QAAQ,OAAO;AACxB,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,WAAK,cAAc;AACnB,WAAK,OAAO,IAAI;AAAA,IAClB;AACA,YAAQ,OAAO,IAAI;AAAA,EACrB;AAEA,MAAI,MAAM,OAAO,SAAS,GAAG;AAC3B,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AACpB,YAAQ,cAAc,MAAM,OAAO,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI;AACzD,YAAQ,OAAO,OAAO;AAAA,EACxB;AACA,SAAO;AACT;AAUA,SAAS,eAAe,OAAmC;AACzD,QAAM,OAAO,iBAAiB,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,KAAK,CAAC,CAAC;AAC3E,QAAM,SAAS,KACZ,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC,EACjC,MAAM,GAAG,GAAG;AACf,QAAM,iBAAiB,CAAC,QAAQ,UAAU,OAAO,cAAc,YAAY,QAAQ,SAAS,UAAU,SAAS,SAAS,QAAQ,WAAW;AAC3I,QAAM,eAAe,oBAAI,IAAoB;AAC7C,aAAW,SAAS,QAAQ;AAC1B,UAAM,aAAa,MAAM,YAAY;AACrC,eAAW,WAAW,gBAAgB;AACpC,UAAI,WAAW,SAAS,OAAO,GAAG;AAChC,qBAAa,IAAI,UAAU,aAAa,IAAI,OAAO,KAAK,KAAK,CAAC;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,YAAY,OAAO,OAAO,CAAC,SAAS,YAAY,KAAK,IAAI,CAAC,CAAC;AAAA,IACvE,YAAY,YAAY,OAAO,OAAO,CAAC,SAAS,kBAAkB,KAAK,IAAI,CAAC,CAAC;AAAA,IAC7E,cAAc,YAAY,OAAO,OAAO,CAAC,SAAS,wCAAwC,KAAK,IAAI,CAAC,CAAC;AAAA,EACvG;AACF;AAEA,SAAS,iBAAiB,OAA6B;AACrD,QAAM,SAAmB,CAAC;AAC1B,MAAI,UAAU;AACd,aAAW,QAAQ,OAAO;AACxB,QAAI,QAAQ,MAAM,QAAQ,KAAK;AAC7B,iBAAW,OAAO,aAAa,IAAI;AACnC;AAAA,IACF;AACA,QAAI,QAAQ,UAAU,GAAG;AACvB,aAAO,KAAK,OAAO;AAAA,IACrB;AACA,cAAU;AAAA,EACZ;AACA,MAAI,QAAQ,UAAU,GAAG;AACvB,WAAO,KAAK,OAAO;AAAA,EACrB;AACA,SAAO;AACT;AAEA,SAAS,YAAY,QAA4B;AAC/C,SAAO,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,EAAE;AAC7F;AAEA,SAAS,uBAAuB,QAAqC;AACnE,QAAM,OAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EAC9B,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE,EACzC,KAAK,IAAI;AACZ,SAAO,QAAQ;AACjB;AAEA,SAAS,iBAAiB,MAA4B;AACpD,SAAO,CAAC,GAAG,KAAK,SAAS,kDAAkD,CAAC,EAAE,IAAI,CAAC,WAAW;AAAA,IAC5F,IAAI,IAAI,MAAM,CAAC,CAAC;AAAA,IAChB,OAAO,MAAM,CAAC,KAAK,IAAI,YAAY;AAAA,IACnC,OAAO,MAAM,CAAC,KAAK,IAAI,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAAA,EACnD,EAAE;AACJ;AAEA,SAAS,iBAAiB,MAA4B;AACpD,QAAM,gBAAgB,KACnB,MAAM,OAAO,EACb,OAAO,CAAC,SAAS,KAAK,MAAM,IAAI,EAAE,EAAE,YAAY,MAAM,OAAO,cAAc,KAAK,IAAI,CAAC,EACrF,IAAI,CAAC,SAAS,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,CAAC,EACtC,KAAK,EAAE;AACV,MAAI,CAAC,eAAe;AAClB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,cACJ,MAAM,GAAG,EACT,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC,EAC7B,OAAO,OAAO,EACd,IAAI,CAAC,WAAW;AACf,UAAM,SAAS,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AAC1E,WAAO,EAAE,MAAM,OAAO,CAAC,KAAK,WAAW,OAAO;AAAA,EAChD,CAAC;AACL;AAEA,SAAS,oBAAoB,QAA4B;AACvD,MAAI,OAAO,SAAS,mBAAmB;AACrC,UAAM,QAAQ,OAAO,KAAK,MAAM,qBAAqB,IAAI,CAAC;AAC1D,WAAO,QAAQ,gBAAM,MAAM,QAAQ,QAAQ,EAAE,CAAC,KAAK,OAAO;AAAA,EAC5D;AACA,MAAI,OAAO,SAAS,eAAe,OAAO,SAAS,UAAU;AAC3D,UAAM,YAAY,OAAO,KAAK,MAAM,qBAAqB,IAAI,CAAC;AAC9D,WAAO,YAAY,gBAAM,UAAU,QAAQ,QAAQ,EAAE,CAAC,KAAK,OAAO;AAAA,EACpE;AACA,MAAI,OAAO,SAAS,UAAU,OAAO,SAAS,YAAY,OAAO,SAAS,iBAAiB;AACzF,WAAO,OAAO,KAAK,MAAM,GAAG,GAAG;AAAA,EACjC;AACA,SAAO,OAAO,KAAK,MAAM,GAAG,GAAG;AACjC;AAEA,SAAS,mBAAmB,QAA4B;AACtD,QAAM,UAAU,mBAAmB,OAAO,IAAI;AAC9C,QAAM,WAAW,QAAQ,CAAC;AAC1B,QAAM,OAAO,QAAQ,CAAC,KAAK,QAAQ,CAAC;AACpC,QAAM,QAAQ,CAAC,UAAU,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK;AACzD,MAAI,OAAO;AACT,WAAO;AAAA,EACT;AACA,SAAO,oBAAoB,MAAM;AACnC;AAEA,SAAS,mBAAmB,SAA2C;AACrE,QAAM,OAAO,QACV,OAAO,CAAC,WAAW,CAAC,cAAc,WAAW,eAAe,qBAAqB,UAAU,EAAE,SAAS,OAAO,IAAI,CAAC,EAClH,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,YAAY;AAAA,IAChB,IAAI,OAAO;AAAA,IACX,MAAM,YAAY,OAAO,IAAI;AAAA,IAC7B,QAAQ,mBAAmB,MAAM;AAAA,EACnC,EAAE;AACJ,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,aAAW,SAAS,CAAC,MAAM,gBAAM,cAAI,GAAG;AACtC,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc;AACnB,WAAO,OAAO,IAAI;AAAA,EACpB;AACA,QAAM,OAAO,MAAM;AACnB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,aAAW,OAAO,MAAM;AACtB,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,eAAW,SAAS,CAAC,IAAI,IAAI,IAAI,MAAM,IAAI,MAAM,GAAG;AAClD,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,WAAK,cAAc;AACnB,SAAG,OAAO,IAAI;AAAA,IAChB;AACA,UAAM,OAAO,EAAE;AAAA,EACjB;AACA,QAAM,OAAO,OAAO,KAAK;AACzB,UAAQ,OAAO,OAAO,KAAK;AAC3B,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAwB;AAClD,QAAM,SAAmB,CAAC;AAC1B,QAAM,UAAU;AAChB,MAAI;AACJ,SAAQ,QAAQ,QAAQ,KAAK,IAAI,GAAI;AACnC,WAAO,MAAM,MAAM,CAAC,KAAK,IAAI,QAAQ,OAAO,GAAG,CAAC;AAAA,EAClD;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAAqC;AAC7D,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,aAAa,OAAO,CAAC,KAAK,SAAS,OAAO,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC;AAC5E;AAEA,SAAS,YAAY,MAAsB;AACzC,QAAM,QAAgC;AAAA,IACpC,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,UAAU;AAAA,EACZ;AACA,SAAO,MAAM,IAAI,KAAK;AACxB;AAEA,SAAS,aAAa,MAAsB;AAC1C,QAAM,QAAgC;AAAA,IACpC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACA,SAAO,MAAM,IAAI,KAAK;AACxB;AAEA,SAAS,kBAAkB,QAA6B,YAAY,4BAAqB;AACvF,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,UAAQ,OAAO;AACf,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,cAAc;AACtB,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,aAAW,CAAC,MAAM,KAAK,KAAK,CAAC,GAAG,OAAO,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,EAAE,GAAG;AAC1F,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc,GAAG,IAAI,KAAK,KAAK;AACpC,SAAK,OAAO,IAAI;AAAA,EAClB;AACA,UAAQ,OAAO,SAAS,IAAI;AAC5B,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAwE;AACpG,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,aAAW,SAAS,CAAC,MAAM,gBAAM,cAAI,GAAG;AACtC,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc;AACnB,WAAO,OAAO,IAAI;AAAA,EACpB;AACA,QAAM,OAAO,MAAM;AACnB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,aAAW,OAAO,MAAM;AACtB,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,eAAW,SAAS,CAAC,IAAI,IAAI,IAAI,MAAM,IAAI,MAAM,GAAG;AAClD,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,WAAK,cAAc;AACnB,SAAG,OAAO,IAAI;AAAA,IAChB;AACA,UAAM,OAAO,EAAE;AAAA,EACjB;AACA,QAAM,OAAO,OAAO,KAAK;AACzB,UAAQ,OAAO,KAAK;AACpB,SAAO;AACT;AAEA,SAAS,QAAQ,QAAuC;AACtD,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,SAAS,QAAQ;AAC1B,WAAO,IAAI,QAAQ,OAAO,IAAI,KAAK,KAAK,KAAK,CAAC;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAASA,YAAW,QAAqB,OAAe,OAA8B;AACpF,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc,OAAO,KAAK;AAClC,MAAI,OAAO,KAAK,OAAO;AACvB,SAAO,OAAO,GAAG;AACnB;AAEA,SAASC,aAAY,OAAuB;AAC1C,MAAI,QAAQ,MAAM;AAChB,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,MAAI,QAAQ,OAAO,MAAM;AACvB,WAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAAA,EACrC;AACA,SAAO,IAAI,QAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC;AAC5C;AAEA,SAASC,eAAc,OAA2B;AAChD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,iBAAiB,GAAG;AACtH,QAAM,MAAM,MAAM,KAAK,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,EAC7D,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,EAC9D,KAAK,GAAG;AACX,SAAO,GAAG,KAAK,KAAK,GAAG;AACzB;AAEA,SAAS,iBAAiB,OAAmB,WAA2B;AACtE,QAAM,SAAS,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,EAAE,CAAC,CAAC;AACzF,MAAI,cAAc,OAAO;AACvB,UAAM,QAAQ,OAAO,MAAM,SAAS;AACpC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AACA,UAAM,QAAgC;AAAA,MACpC,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AACA,WAAO,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC,IAAI,SAAM,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE;AAAA,EACrE;AACA,MAAI,OAAO,WAAW,MAAM,KAAK,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO,OAAO,MAAM,KAAK,EAAE,CAAC,KAAK;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAA2B;AACrD,MAAI,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,IAAM;AAC1C,WAAO;AAAA,EACT;AACA,MAAI,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,KAAM;AAC1C,WAAO;AAAA,EACT;AACA,MAAI,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,IAAM;AACpF,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAA2B;AAC7C,QAAM,OAAiB,CAAC;AACxB,QAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,GAAG;AACxC,WAAS,SAAS,GAAG,SAAS,OAAO,UAAU,IAAI;AACjD,UAAM,QAAQ,MAAM,MAAM,QAAQ,SAAS,EAAE;AAC7C,UAAM,MAAM,MAAM,KAAK,KAAK,EACzB,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,EAC9D,KAAK,GAAG,EACR,OAAO,IAAI,GAAG;AACjB,UAAM,QAAQ,MAAM,KAAK,KAAK,EAC3B,IAAI,CAAC,SAAU,QAAQ,MAAM,QAAQ,MAAM,OAAO,aAAa,IAAI,IAAI,GAAI,EAC3E,KAAK,EAAE;AACV,SAAK,KAAK,GAAG,OAAO,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,KAAK,GAAG,KAAK,KAAK,EAAE;AAAA,EACrF;AACA,MAAI,MAAM,SAAS,OAAO;AACxB,SAAK,KAAK,gCAAY,KAAK,6BAAS,MAAM,MAAM,eAAK;AAAA,EACvD;AACA,SAAO,KAAK,KAAK,IAAI,KAAK;AAC5B;AAEA,SAAS,UACP,OACA,KAIA;AACA,QAAM,QAAQ,IAAI,MAAM,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AAC1D,QAAM,QAA+D,CAAC;AACtE,QAAM,UAAyD,CAAC;AAChE,QAAM,OAAsE,CAAC;AAC7E,QAAM,SAAgD,CAAC;AACvD,QAAM,YAA0D,CAAC;AACjE,QAAM,QAA+D,CAAC;AAEtE,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,UAAM,OAAO,MAAM,KAAK;AACxB,UAAM,QAAQ,MAAM,QAAQ,CAAC;AAC7B,QAAI,SAAS,OAAO,UAAU,QAAQ;AACpC,YAAM,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC1C,YAAM,KAAK;AAAA,QACT,OAAO,mBAAmB,OAAO,GAAG,CAAC;AAAA,QACrC,OAAO;AAAA,UACL,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,YAAM,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC1C,cAAQ,KAAK;AAAA,QACX,OAAO,mBAAmB,OAAO,GAAG,CAAC;AAAA,QACrC,OAAO;AAAA,UACL,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,SAAS,OAAO,UAAU,OAAO;AACnC,YAAM,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC1C,WAAK,KAAK;AAAA,QACR,OAAO,mBAAmB,OAAO,GAAG,CAAC;AAAA,QACrC,OAAO;AAAA,UACL,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,SAAS,OAAO,UAAU,SAAS;AACrC,YAAM,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC1C,aAAO,KAAK;AAAA,QACV,OAAO,mBAAmB,OAAO,GAAG,CAAC;AAAA,QACrC,OAAO,CAAC,OAAO,OAAO,IAAI,KAAK,CAAC,GAAG,OAAO,OAAO,IAAI,KAAK,CAAC,CAAC;AAAA,MAC9D,CAAC;AAAA,IACH;AACA,QAAI,SAAS,OAAO,UAAU,cAAc;AAC1C,YAAM,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC1C,YAAM,cAAc,gBAAgB,OAAO,QAAQ,CAAC;AACpD,YAAM,WAAW,mBAAmB,WAAW;AAC/C,UAAI,SAAS,SAAS,GAAG;AACvB,kBAAU,KAAK,EAAE,OAAO,mBAAmB,OAAO,GAAG,CAAC,GAAG,OAAO,SAAS,CAAC;AAAA,MAC5E;AAAA,IACF;AACA,QAAI,SAAS,OAAO,UAAU,YAAY;AACxC,YAAM,SAAS,mBAAmB,OAAO,QAAQ,CAAC;AAClD,UAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,kBAAU,KAAK,EAAE,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,CAAC;AAAA,MAC9D;AACA,cAAQ,KAAK,IAAI,OAAO,OAAO,WAAW,CAAC;AAAA,IAC7C;AACA,QAAI,SAAS,QAAQ,UAAU,UAAU,UAAU,UAAU;AAC3D,YAAM,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC1C,YAAM,OAAO,iBAAiB,OAAO,GAAG,KAAK,OAAO,GAAG,KAAK,EAAE;AAC9D,UAAI,MAAM;AACR,cAAM,KAAK;AAAA,UACT,OAAO,mBAAmB,OAAO,GAAG,CAAC;AAAA,UACrC,OAAO;AAAA,YACL,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,YACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,YACxB;AAAA,YACA,KAAK,IAAI,GAAG,OAAO,OAAO,IAAI,KAAK,EAAE,CAAC;AAAA,UACxC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,cAAc,8BAAU;AACxC,QAAM,MAAM,SAAS,gBAAgB,8BAA8B,KAAK;AACxE,MAAI,aAAa,SAAS,eAAe;AAEzC,QAAM,SAAS,cAAc,OAAO,SAAS,MAAM,QAAQ,WAAW,KAAK;AAC3E,QAAM,iBAAiB;AAAA,IACrB,GAAG,OAAO;AAAA,IACV,GAAG,OAAO;AAAA,IACV,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,EACjB;AACA,MAAI,iBAAiB,EAAE,GAAG,eAAe;AACzC,QAAM,eAAe,MAAM;AACzB,QAAI;AAAA,MACF;AAAA,MACA,GAAG,eAAe,CAAC,IAAI,eAAe,CAAC,IAAI,eAAe,KAAK,IAAI,eAAe,MAAM;AAAA,IAC1F;AAAA,EACF;AACA,eAAa;AAEb,aAAW,QAAQ,MAAM,MAAM,GAAG,GAAI,GAAG;AACvC,UAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,KAAK;AAC9B,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,SAAK,aAAa,MAAM,OAAO,EAAE,CAAC;AAClC,SAAK,aAAa,MAAM,OAAO,CAAC,EAAE,CAAC;AACnC,SAAK,aAAa,MAAM,OAAO,EAAE,CAAC;AAClC,SAAK,aAAa,MAAM,OAAO,CAAC,EAAE,CAAC;AACnC,SAAK,aAAa,UAAU,SAAS;AACrC,SAAK,aAAa,gBAAgB,OAAO,OAAO,MAAM,CAAC;AACvD,eAAW,MAAM,KAAK,KAAK;AAC3B,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA,aAAW,QAAQ,QAAQ,MAAM,GAAG,GAAI,GAAG;AACzC,UAAM,CAAC,IAAI,IAAI,MAAM,IAAI,KAAK;AAC9B,UAAM,SAAS,SAAS,gBAAgB,IAAI,cAAc,QAAQ;AAClE,WAAO,aAAa,MAAM,OAAO,EAAE,CAAC;AACpC,WAAO,aAAa,MAAM,OAAO,CAAC,EAAE,CAAC;AACrC,WAAO,aAAa,KAAK,OAAO,KAAK,IAAI,MAAM,CAAC,CAAC;AACjD,WAAO,aAAa,QAAQ,MAAM;AAClC,WAAO,aAAa,UAAU,SAAS;AACvC,WAAO,aAAa,gBAAgB,OAAO,OAAO,MAAM,CAAC;AACzD,eAAW,QAAQ,KAAK,KAAK;AAC7B,QAAI,OAAO,MAAM;AAAA,EACnB;AAEA,aAAW,QAAQ,KAAK,MAAM,GAAG,GAAI,GAAG;AACtC,UAAM,CAAC,IAAI,IAAI,QAAQ,YAAY,QAAQ,IAAI,KAAK;AACpD,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,SAAK,aAAa,KAAK,QAAQ,IAAI,CAAC,IAAI,KAAK,IAAI,MAAM,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;AACjF,SAAK,aAAa,QAAQ,MAAM;AAChC,SAAK,aAAa,UAAU,SAAS;AACrC,SAAK,aAAa,gBAAgB,OAAO,OAAO,MAAM,CAAC;AACvD,eAAW,MAAM,KAAK,KAAK;AAC3B,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA,aAAW,QAAQ,UAAU,MAAM,GAAG,GAAI,GAAG;AAC3C,UAAM,WAAW,KAAK;AACtB,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,UAAU;AAClE,SAAK,aAAa,UAAU,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AAC5E,SAAK,aAAa,QAAQ,MAAM;AAChC,SAAK,aAAa,UAAU,SAAS;AACrC,SAAK,aAAa,gBAAgB,OAAO,OAAO,MAAM,CAAC;AACvD,eAAW,MAAM,KAAK,KAAK;AAC3B,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA,aAAW,QAAQ,OAAO,MAAM,GAAG,GAAI,GAAG;AACxC,UAAM,CAAC,GAAG,CAAC,IAAI,KAAK;AACpB,UAAM,QAAQ,SAAS,gBAAgB,IAAI,cAAc,QAAQ;AACjE,UAAM,aAAa,MAAM,OAAO,CAAC,CAAC;AAClC,UAAM,aAAa,MAAM,OAAO,CAAC,CAAC,CAAC;AACnC,UAAM,aAAa,KAAK,OAAO,OAAO,SAAS,CAAC,CAAC;AACjD,UAAM,aAAa,QAAQ,SAAS;AACpC,eAAW,OAAO,KAAK,KAAK;AAC5B,QAAI,OAAO,KAAK;AAAA,EAClB;AAEA,aAAW,QAAQ,MAAM,MAAM,GAAG,GAAG,GAAG;AACtC,UAAM,CAAC,GAAG,GAAG,MAAM,MAAM,IAAI,KAAK;AAClC,UAAM,QAAQ,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC/D,UAAM,aAAa,KAAK,OAAO,CAAC,CAAC;AACjC,UAAM,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC;AAClC,UAAM,aAAa,aAAa,OAAO,KAAK,IAAI,QAAQ,OAAO,SAAS,CAAC,CAAC,CAAC;AAC3E,UAAM,aAAa,QAAQ,cAAc;AACzC,UAAM,cAAc;AACpB,eAAW,OAAO,KAAK,KAAK;AAC5B,QAAI,OAAO,KAAK;AAAA,EAClB;AAEA,QAAM,SAAS,MAAM;AAAA,IACnB,IAAI,IAAI,CAAC,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,KAAK,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AAAA,EACtG,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACnC,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ,OAAO,oBAAoB,KAAK,MAAM,CAAC;AAAA,EACjD;AAEA,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cACH,2BAAY,MAAM,MAAM,uBAAa,QAAQ,MAAM,oBAAU,KAAK,MAAM,yBAAe,UAAU,MAAM,sBAAY,OAAO,MAAM,qBAAW,MAAM,MAAM;AACzJ,UAAQ,OAAO,MAAM,GAAG;AACxB,QAAM,OAAO,OAAO;AAEpB,SAAO;AAAA,IACL,WAAW,SAAS;AAClB,aAAO,YAAY,aAAa,YAAY,cAAc,YAAY;AAAA,IACxE;AAAA,IACA,QAAQ,SAAS;AACf,UAAI,YAAY,aAAa,YAAY,YAAY;AACnD,cAAM,SAAS,YAAY,YAAY,OAAO;AAC9C,cAAM,UAAU,eAAe,IAAI,eAAe,QAAQ;AAC1D,cAAM,UAAU,eAAe,IAAI,eAAe,SAAS;AAC3D,uBAAe,SAAS;AACxB,uBAAe,UAAU;AACzB,uBAAe,IAAI,UAAU,eAAe,QAAQ;AACpD,uBAAe,IAAI,UAAU,eAAe,SAAS;AACrD,qBAAa;AACb,eAAO;AAAA,MACT;AACA,UAAI,YAAY,cAAc;AAC5B,yBAAiB,EAAE,GAAG,eAAe;AACrC,qBAAa;AACb,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,WAAW,SAAkB,OAAqB;AACzD,UAAQ,aAAa,cAAc,KAAK;AAC1C;AAEA,SAAS,oBAAoB,KAAoB,QAA+B;AAC9E,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AACrB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc,gBAAM,OAAO,MAAM;AACvC,WAAS,OAAO,KAAK;AAErB,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,WAAW,SAAS,cAAc,OAAO;AAC/C,aAAS,OAAO;AAChB,aAAS,UAAU;AACnB,aAAS,iBAAiB,UAAU,MAAM;AACxC,iBAAW,WAAW,IAAI,iBAA6B,gBAAgB,mBAAmB,KAAK,CAAC,IAAI,GAAG;AACrG,gBAAQ,MAAM,UAAU,SAAS,UAAU,KAAK;AAAA,MAClD;AAAA,IACF,CAAC;AACD,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,cAAc;AACnB,UAAM,OAAO,UAAU,IAAI;AAC3B,aAAS,OAAO,KAAK;AAAA,EACvB;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAiB,OAAuC;AAC1E,QAAM,SAAiC,CAAC;AACxC,WAAS,QAAQ,OAAO,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACxD,UAAM,OAAO,MAAM,KAAK;AACxB,UAAM,QAAQ,MAAM,QAAQ,CAAC;AAC7B,QAAI,SAAS,KAAK;AAChB;AAAA,IACF;AACA,WAAO,IAAI,IAAI;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAiB,OAAwC;AAChF,QAAM,cAAuC,CAAC;AAC9C,WAAS,QAAQ,OAAO,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACxD,UAAM,OAAO,MAAM,KAAK;AACxB,UAAM,QAAQ,MAAM,QAAQ,CAAC;AAC7B,QAAI,SAAS,KAAK;AAChB;AAAA,IACF;AACA,gBAAY,KAAK,CAAC,MAAM,KAAK,CAAC;AAAA,EAChC;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,aAA+D;AACzF,QAAM,SAAkC,CAAC;AACzC,MAAI;AACJ,aAAW,CAAC,MAAM,KAAK,KAAK,aAAa;AACvC,QAAI,SAAS,MAAM;AACjB,UAAI,OAAO,KAAK;AAAA,IAClB;AACA,QAAI,SAAS,QAAQ,MAAM,QAAW;AACpC,aAAO,KAAK,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC;AAC9B,UAAI;AAAA,IACN;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBACP,OACA,OACsE;AACtE,MAAI,QAAQ;AACZ,QAAM,SAAkC,CAAC;AACzC,WAAS,QAAQ,OAAO,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACxD,UAAM,OAAO,MAAM,KAAK;AACxB,UAAM,QAAQ,MAAM,QAAQ,CAAC;AAC7B,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,aAAO,EAAE,OAAO,QAAQ,UAAU,QAAQ,EAAE;AAAA,IAC9C;AACA,QAAI,SAAS,KAAK;AAChB,cAAQ,mBAAmB,KAAK;AAAA,IAClC;AACA,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,YAAM,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC1C,aAAO,KAAK,CAAC,OAAO,OAAO,IAAI,KAAK,CAAC,GAAG,OAAO,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC;AAAA,IACpE;AAAA,EACF;AACA,SAAO,EAAE,OAAO,QAAQ,UAAU,MAAM,OAAO;AACjD;AAEA,SAAS,mBAAmB,OAAmC;AAC7D,SAAO,OAAO,KAAK,KAAK;AAC1B;AAEA,SAAS,mBAAmB,OAAuB;AACjD,MAAI,OAAO,QAAQ,eAAe,IAAI,QAAQ;AAC5C,WAAO,IAAI,OAAO,KAAK;AAAA,EACzB;AACA,SAAO,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK;AACzD;AAEA,SAAS,iBAAiB,MAAsB;AAC9C,SAAO,KACJ,QAAQ,QAAQ,IAAI,EACpB,QAAQ,eAAe,EAAE,EACzB,QAAQ,SAAS,EAAE,EACnB,KAAK;AACV;AAEA,SAAS,QAAQ,IAAY,IAAY,QAAgB,YAAoB,UAA0B;AACrG,QAAM,QAAQ,iBAAiB,IAAI,IAAI,QAAQ,QAAQ;AACvD,QAAM,MAAM,iBAAiB,IAAI,IAAI,QAAQ,UAAU;AACvD,QAAM,QAAQ,KAAK,IAAI,WAAW,UAAU;AAC5C,QAAM,WAAW,SAAS,MAAM,MAAM;AACtC,SAAO,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,MAAM,IAAI,MAAM,MAAM,QAAQ,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC;AACxF;AAEA,SAAS,iBAAiB,IAAY,IAAY,QAAgB,cAAgD;AAChH,QAAM,QAAS,eAAe,KAAK,KAAM;AACzC,SAAO;AAAA,IACL,GAAG,KAAK,SAAS,KAAK,IAAI,KAAK;AAAA,IAC/B,GAAG,KAAK,SAAS,KAAK,IAAI,KAAK;AAAA,EACjC;AACF;AAEA,SAAS,cACP,OACA,SACA,MACA,QACA,WACA,OAC+E;AAC/E,QAAM,KAAK,MAAM,QAAQ,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AAC5D,QAAM,KAAK,MAAM,QAAQ,CAAC,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AAChE,aAAW,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,KAAK,SAAS;AACjD,OAAG,KAAK,KAAK,QAAQ,KAAK,MAAM;AAChC,OAAG,KAAK,CAAC,KAAK,QAAQ,CAAC,KAAK,MAAM;AAAA,EACpC;AACA,aAAW,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,KAAK,MAAM;AAC9C,OAAG,KAAK,KAAK,QAAQ,KAAK,MAAM;AAChC,OAAG,KAAK,CAAC,KAAK,QAAQ,CAAC,KAAK,MAAM;AAAA,EACpC;AACA,aAAW,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,QAAQ;AACtC,OAAG,KAAK,CAAC;AACT,OAAG,KAAK,CAAC,CAAC;AAAA,EACZ;AACA,aAAW,EAAE,OAAO,SAAS,KAAK,WAAW;AAC3C,eAAW,CAAC,GAAG,CAAC,KAAK,UAAU;AAC7B,SAAG,KAAK,CAAC;AACT,SAAG,KAAK,CAAC,CAAC;AAAA,IACZ;AAAA,EACF;AACA,aAAW,EAAE,OAAO,CAAC,GAAG,GAAG,MAAMC,OAAM,EAAE,KAAK,OAAO;AACnD,OAAG,KAAK,GAAG,IAAI,KAAK,SAASA,UAAS,GAAG;AACzC,OAAG,KAAK,CAAC,GAAG,CAAC,IAAIA,OAAM;AAAA,EACzB;AACA,QAAM,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;AAC9B,QAAM,OAAO,KAAK,IAAI,GAAG,IAAI,GAAG;AAChC,QAAM,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;AAC9B,QAAM,OAAO,KAAK,IAAI,GAAG,IAAI,GAAG;AAChC,QAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,IAAI;AACrC,QAAM,SAAS,KAAK,IAAI,GAAG,OAAO,IAAI;AACtC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,KAAK,IAAI,OAAO,MAAM,IAAI;AAAA,EACpC;AACF;;;ACzhCA,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,qBAA6C;AAAA,EACjD,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,yBAAyB;AAAA,EACzB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,8BAA8B;AAAA,EAC9B,mBAAmB;AAAA,EACnB,gCAAgC;AAClC;AACA,IAAM,qBAAqB,oBAAI,IAAI,CAAC,QAAQ,OAAO,MAAM,OAAO,QAAQ,OAAO,OAAO,OAAO,MAAM,MAAM,OAAO,OAAO,QAAQ,KAAK,CAAC;AAE9H,SAAS,gBAA+B;AAC7C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aACE,gBAAgB,IAAI,KAAK,SAAS,KACjC,eAAe,IAAI,KAAK,QAAQ,MAAM,KAAK,cAAc,MAAM,KAAK,cAAc,SAAS,CAAC,mBAAmB,IAAI,KAAK,SAAS;AAAA,IAEtI;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,MAAM,OAAO,OAAO;AAClC,YAAM,EAAE,cAAc,IAAI,MAAM,OAAO,8CAA8C;AACrF,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AAEvC,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,UAAI,SAAS,OAAO,KAAK;AAEzB,YAAM,QAAQ,IAAI,MAAM,MAAM;AAC9B,YAAM,aAAa,IAAI,MAAM,MAAM,QAAQ;AAE3C,YAAM,SAAS,IAAI,MAAM,kBAAkB,IAAI,GAAG,KAAK,GAAK;AAC5D,aAAO,SAAS,IAAI,KAAK,GAAG,GAAG;AAE/B,UAAI;AACJ,UAAI;AACF,mBAAW,IAAI,MAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,MACxD,QAAQ;AACN,cAAM,OAAO;AACb,eAAO,oBAAoB,KAAK,KAAK,YAAY,0IAAiC;AAAA,MACpF;AACA,eAAS,cAAc,KAAK,IAAI,OAAO,kBAAkB,CAAC,CAAC;AAC3D,eAAS,mBAAmB,MAAM;AAClC,eAAS,cAAc,MAAM;AAC7B,eAAS,sBAAsB;AAC/B,YAAM,OAAO,SAAS,UAAU;AAEhC,YAAM,WAAW,IAAI,cAAc,QAAQ,SAAS,UAAU;AAC9D,eAAS,gBAAgB;AAEzB,YAAM,IAAI,IAAI,MAAM,gBAAgB,UAAU,SAAU,GAAG,CAAC;AAC5D,YAAM,cAAc,IAAI,MAAM,iBAAiB,UAAU,CAAC;AAC1D,kBAAY,SAAS,IAAI,GAAG,GAAG,CAAC;AAChC,YAAM,IAAI,WAAW;AACrB,YAAM,IAAI,IAAI,MAAM,WAAW,IAAI,IAAI,UAAU,QAAQ,CAAC;AAE1D,YAAM,YAAY,cAAc,IAAI,MAAM,kBAAkB;AAC5D,YAAM,SAAS,MAAM,UAAU,WAAW,KAAK,KAAK,EAAE,MAAM,MAAM,MAAS;AAC3E,UAAI,CAAC,QAAQ;AACX,iBAAS,QAAQ;AACjB,iBAAS,QAAQ;AACjB,cAAM,OAAO;AACb,eAAO,oBAAoB,KAAK,KAAK,YAAY,wEAAiB;AAAA,MACpE;AACA,UAAI,OAAO,SAAS;AAClB,cAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,gBAAQ,YAAY;AACpB,gBAAQ,cAAc,OAAO;AAC7B,cAAM,OAAO,OAAO;AAAA,MACtB;AACA,YAAM,SAAS,OAAO;AACtB,YAAM,IAAI,MAAM;AAChB,YAAM,eAAe,YAAY,QAAQ,QAAQ,UAAU,KAAK;AAChE,YAAM,cAAc,cAAc,QAAQ,KAAK;AAC/C,YAAM,OAAO,uBAAuB,WAAW,CAAC;AAChD,YAAM,OAAO,oBAAoB,qBAAqB,MAAM,CAAC,CAAC;AAE9D,UAAI,iBAAiB;AACrB,YAAM,UAAU,MAAM;AACpB,iBAAS,OAAO;AAChB,iBAAS,OAAO,OAAO,MAAM;AAC7B,yBAAiB,OAAO,sBAAsB,OAAO;AAAA,MACvD;AACA,cAAQ;AAER,YAAM,SAAS,CAAC,SAAsB;AACpC,cAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK;AACpC,cAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM;AACtC,eAAO,SAAS,QAAQ;AACxB,eAAO,uBAAuB;AAC9B,iBAAS,QAAQ,OAAO,QAAQ,KAAK;AAAA,MACvC;AACA,aAAO,IAAI,IAAI;AAEf,aAAO;AAAA,QACL,WAAW,SAAS;AAClB,iBACE,YAAY,aACZ,YAAY,cACZ,YAAY,gBACZ,YAAY,kBACZ,YAAY;AAAA,QAEhB;AAAA,QACA,QAAQ,SAAS;AACf,cAAI,YAAY,aAAa,YAAY,YAAY;AACnD,kBAAM,SAAS,YAAY,YAAY,OAAO;AAC9C,mBAAO,SAAS,IAAI,SAAS,MAAM,EAAE,eAAe,MAAM,EAAE,IAAI,SAAS,MAAM;AAC/E,mBAAO,uBAAuB;AAC9B,qBAAS,OAAO;AAChB,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,cAAc;AAC5B,mBAAO,SAAS,KAAK,aAAa,cAAc;AAChD,qBAAS,OAAO,KAAK,aAAa,MAAM;AACxC,mBAAO,OAAO,aAAa;AAC3B,mBAAO,MAAM,aAAa;AAC1B,mBAAO,uBAAuB;AAC9B,qBAAS,OAAO;AAChB,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,kBAAkB,YAAY,eAAe;AAC3D,mBAAO,QAAQ,YAAY,iBAAiB,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,CAAC;AACtE,mBAAO;AAAA,UACT;AACA,iBAAO;AAAA,QACT;AAAA,QACA;AAAA,QACA,UAAU;AACR,iBAAO,qBAAqB,cAAc;AAC1C,mBAAS,QAAQ;AACjB,mBAAS,QAAQ;AACjB,wBAAc,QAAQ,KAAK;AAC3B,gBAAM,OAAO;AACb,0BAAgB,KAAK,UAAU;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBACP,KACA,KACA,YACA,SACiB;AACjB,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAElB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AAEpB,QAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,SAAO,cAAc,GAAG,OAAO,IAAI,IAAI,KAAK,IAAI;AAEhD,QAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,WAAS,OAAO;AAChB,WAAS,WAAW,IAAI,KAAK;AAC7B,WAAS,cAAc;AAEvB,QAAM,OAAO,OAAO,QAAQ,QAAQ;AACpC,MAAI,SAAS,UAAU,IAAI,YAAY;AACvC,MAAI,SAAS,OAAO,KAAK;AAEzB,SAAO;AAAA,IACL,aAAa;AACX,aAAO;AAAA,IACT;AAAA,IACA,UAAU;AACR,UAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,YAAM,OAAO;AACb,sBAAgB,KAAK,UAAU;AAAA,IACjC;AAAA,EACF;AACF;AAEA,eAAe,UACb,WACA,KACA,OACiE;AACjE,MAAI,cAAc,UAAU,cAAc,OAAO;AAC/C,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,0CAA0C;AAC9E,UAAM,OAAO,MAAM,IAAI,WAAW,EAAE,UAAU,GAAG;AACjD,WAAO,EAAE,QAAQ,KAAK,MAAM;AAAA,EAC9B;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,yCAAyC;AAC5E,WAAO,EAAE,QAAQ,MAAM,IAAI,UAAU,EAAE,UAAU,GAAG,EAAE;AAAA,EACxD;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,yCAAyC;AAC5E,WAAO,EAAE,QAAQ,MAAM,IAAI,UAAU,EAAE,UAAU,GAAG,EAAE;AAAA,EACxD;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,6CAA6C;AACpF,UAAM,UAAU,MAAM,IAAI,cAAc,EAAE,UAAU,GAAG;AACvD,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AACA,WAAO,EAAE,QAAQ,QAAQ,MAAM;AAAA,EACjC;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,yCAAyC;AAC5E,UAAMC,YAAW,MAAM,IAAI,UAAU,EAAE,UAAU,GAAG;AACpD,UAAMC,YAAW,IAAI,MAAM,qBAAqB,EAAE,OAAO,SAAU,WAAW,KAAK,CAAC;AACpF,WAAO,EAAE,QAAQ,IAAI,MAAM,KAAKD,WAAUC,SAAQ,EAAE;AAAA,EACtD;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,yCAAyC;AAC5E,UAAMD,YAAW,MAAM,IAAI,UAAU,EAAE,UAAU,GAAG;AACpD,UAAMC,YAAW,IAAI,MAAM,qBAAqB,EAAE,OAAO,SAAU,WAAW,KAAK,CAAC;AACpF,WAAO,EAAE,QAAQ,IAAI,MAAM,KAAKD,WAAUC,SAAQ,EAAE;AAAA,EACtD;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,yCAAyC;AAChF,WAAO,EAAE,QAAQ,MAAM,IAAI,cAAc,EAAE,UAAU,GAAG,EAAE;AAAA,EAC5D;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,yCAAyC;AAC5E,WAAO,EAAE,QAAQ,MAAM,IAAI,UAAU,EAAE,UAAU,GAAG,EAAE;AAAA,EACxD;AACA,MAAI,cAAc,SAAS,cAAc,UAAU,cAAc,UAAU,cAAc,QAAQ;AAC/F,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,yCAAyC;AAC5E,WAAO,EAAE,QAAQ,MAAM,IAAI,UAAU,EAAE,UAAU,GAAG,EAAE;AAAA,EACxD;AACA,MAAI,cAAc,SAAS,cAAc,QAAQ;AAC/C,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,0CAA0C;AAC9E,WAAO,EAAE,QAAQ,MAAM,IAAI,WAAW,EAAE,UAAU,GAAG,EAAE;AAAA,EACzD;AACA,QAAM,QAAQ,IAAI,MAAM,MAAM;AAC9B,QAAM,WAAW,IAAI,MAAM,YAAY,GAAG,GAAG,CAAC;AAC9C,QAAM,WAAW,IAAI,MAAM,qBAAqB,EAAE,OAAO,QAAS,CAAC;AACnE,QAAM,OAAO,IAAI,MAAM,KAAK,UAAU,QAAQ;AAC9C,QAAM,IAAI,IAAI;AACd,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS,IAAI,SAAS;AAAA,EACxB;AACF;AAEA,SAAS,YACP,QACA,QACA,UACA,OAMA;AACA,QAAM,MAAM,IAAI,MAAM,KAAK,EAAE,cAAc,MAAM;AACjD,QAAM,OAAO,IAAI,QAAQ,IAAI,MAAM,QAAQ,CAAC;AAC5C,QAAM,SAAS,IAAI,UAAU,IAAI,MAAM,QAAQ,CAAC;AAChD,QAAM,UAAU,KAAK,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC;AAClD,QAAM,WAAW,UAAU;AAC3B,SAAO,SAAS,IAAI,OAAO,IAAI,UAAU,OAAO,IAAI,WAAW,KAAK,OAAO,IAAI,QAAQ;AACvF,SAAO,OAAO,KAAK,IAAI,WAAW,KAAM,IAAI;AAC5C,SAAO,MAAM,WAAW;AACxB,SAAO,uBAAuB;AAC9B,WAAS,OAAO,KAAK,MAAM;AAC3B,WAAS,OAAO;AAChB,SAAO;AAAA,IACL,gBAAgB,OAAO,SAAS,MAAM;AAAA,IACtC,QAAQ,SAAS,OAAO,MAAM;AAAA,IAC9B,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,EACd;AACF;AAkBA,SAAS,cAAc,QAAkC,OAAiD;AACxG,QAAM,MAAM,IAAI,MAAM,KAAK,EAAE,cAAc,MAAM;AACjD,QAAM,OAAO,IAAI,QAAQ,IAAI,MAAM,QAAQ,CAAC;AAC5C,QAAM,SAAS,IAAI,UAAU,IAAI,MAAM,QAAQ,CAAC;AAChD,SAAO;AAAA,IACL,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,UAAU,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAAA,IAC3D,QAAQ,EAAE,GAAG,OAAO,GAAG,GAAG,OAAO,GAAG,GAAG,OAAO,EAAE;AAAA,EAClD;AACF;AAEA,SAAS,uBAAuB,aAA4C;AAC1E,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAClB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,gBAAc,MAAM,UAAK,YAAY,KAAK;AAC1C,gBAAc,MAAM,UAAK,YAAY,MAAM;AAC3C,gBAAc,MAAM,UAAK,YAAY,KAAK;AAC1C,gBAAc,MAAM,sBAAO,YAAY,QAAQ;AAC/C;AAAA,IACE;AAAA,IACA;AAAA,IACA,GAAG,cAAc,YAAY,OAAO,CAAC,CAAC,KAAK,cAAc,YAAY,OAAO,CAAC,CAAC,KAAK,cAAc,YAAY,OAAO,CAAC,CAAC;AAAA,EACxH;AACA,QAAM,OAAO,OAAO,IAAI;AACxB,SAAO;AACT;AAEA,SAAS,cAAc,MAAwB,OAAe,OAA8B;AAC1F,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,OAAK,cAAc;AACnB,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,SAAO,cAAc,OAAO,UAAU,WAAW,cAAc,KAAK,IAAI;AACxE,OAAK,OAAO,MAAM,MAAM;AAC1B;AAEA,SAAS,cAAc,OAAuB;AAC5C,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,KAAK,IAAI,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC;AAC3E,SAAO,QAAQ,QAAQ,UAAU,EAAE;AACrC;AAEA,SAAS,qBAAqB,QAAiD;AAC7E,QAAM,YAAY,oBAAI,IAA8B;AACpD,QAAM,WAAW,oBAAI,IAAa;AAClC,QAAM,QAAQ,oBAAI,IAAY;AAC9B,QAAM,QAAQ,oBAAI,IAAY;AAC9B,MAAI,SAAS;AAEb,SAAO,SAAS,CAAC,UAAU;AACzB,UAAM,OAAO;AACb,QAAI,CAAC,KAAK,YAAY,CAAC,KAAK,UAAU;AACpC;AAAA,IACF;AACA,cAAU;AACV,eAAW,YAAY,mBAAmB,KAAK,QAAQ,GAAG;AACxD,gBAAU,IAAI,QAAQ;AACtB,UAAI,SAAS,MAAM;AACjB,cAAM,IAAI,SAAS,IAAI;AAAA,MACzB;AACA,iBAAW,QAAQ,cAAc;AAC/B,cAAM,UAAW,SAAgD,IAAI;AACrE,YAAI,SAAS;AACX,mBAAS,IAAI,OAAO;AACpB,gBAAM,IAAI,IAAI;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,WAAW,UAAU;AAAA,IACrB,UAAU,SAAS;AAAA,IACnB,OAAO,CAAC,GAAG,KAAK;AAAA,IAChB,OAAO,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC;AAAA,EAC9B;AACF;AAEA,SAAS,oBAAoB,OAAmC;AAC9D,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAClB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AAEpB,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,qBAAmB,MAAM,gBAAM,MAAM,MAAM;AAC3C,qBAAmB,MAAM,gBAAM,MAAM,SAAS;AAC9C,qBAAmB,MAAM,gBAAM,MAAM,QAAQ;AAC7C,qBAAmB,MAAM,gBAAM,MAAM,MAAM,SAAS,IAAI,MAAM,MAAM,KAAK,IAAI,IAAI,GAAG;AACpF,MAAI,MAAM,MAAM,SAAS,GAAG;AAC1B,uBAAmB,MAAM,gBAAM,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,EACvD;AAEA,QAAM,OAAO,OAAO,IAAI;AACxB,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAwB,OAAe,OAA8B;AAC/F,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,OAAK,cAAc;AACnB,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,SAAO,cAAc,OAAO,KAAK;AACjC,OAAK,OAAO,MAAM,MAAM;AAC1B;AAEA,SAAS,cAAc,QAAkC,OAAqC;AAC5F,SAAO,SAAS,CAAC,UAAU;AACzB,UAAM,OAAO;AACb,QAAI,KAAK,UAAU;AACjB,WAAK,SAAS,QAAQ;AAAA,IACxB;AACA,UAAM,WAAW,KAAK;AACtB,eAAW,QAAQ,mBAAmB,QAAQ,GAAG;AAC/C,8BAAwB,IAAI;AAC5B,WAAK,QAAQ;AAAA,IACf;AAAA,EACF,CAAC;AACH;AAEA,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,mBACP,UAC4B;AAC5B,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;AAAA,EACV;AACA,SAAO,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ;AACvD;AAEA,SAAS,wBAAwB,UAA0C;AACzE,aAAW,QAAQ,cAAc;AAC/B,UAAM,UAAW,SAA6E,IAAI;AAClG,aAAS,UAAU;AAAA,EACrB;AACF;;;ACpeA,IAAM,gBAAgB,oBAAI,IAAI,CAAC,WAAW,YAAY,OAAO,OAAO,OAAO,KAAK,CAAC;AACjF,IAAM,mBAA2C;AAAA,EAC/C,wBAAwB;AAAA,EACxB,4BAA4B;AAAA,EAC5B,yBAAyB;AAAA,EACzB,wCAAwC;AAAA,EACxC,oCAAoC;AAAA,EACpC,uBAAuB;AACzB;AAEA,SAAS,iBAAgC;AACvC,QAAM,KAAK;AACX,MAAI,SAAS,eAAe,EAAE,GAAG;AAC/B,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACA,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAI,UAAU;AACd,UAAM,OAAO,MAAM;AACjB,UAAI,CAAC,SAAS;AACZ,kBAAU;AACV,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,SAAK,KAAK;AACV,SAAK,MAAM;AACX,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,UAAU;AACf,aAAS,KAAK,YAAY,IAAI;AAC9B,WAAO,WAAW,MAAM,CAAC;AAAA,EAC3B,CAAC;AACH;AAEO,SAAS,YAA2B;AACzC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,cAAc,IAAI,KAAK,SAAS,KAAK,QAAQ,iBAAiB,KAAK,QAAQ,CAAC;AAAA,IACrF;AAAA,IACA,MAAM,OAAO,KAAK;AAEhB,YAAM,eAAe;AAErB,YAAM,CAAC,GAAG,UAAU,WAAW,OAAOC,MAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC/D,OAAO,SAAS;AAAA,QAChB,OAAO,iBAAiB;AAAA,QACxB,OAAO,mBAAmB;AAAA,QAC1B,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,MAChB,CAAC;AAED,YAAM,UAAU,EAAE,WAAW;AAC7B,YAAM,iBAAiB,SAAS,WAAW;AAC3C,YAAM,eAAe,UAAU,WAAW;AAC1C,YAAM,SAAS,MAAM,WAAW;AAChC,YAAM,WAAWA,OAAM,WAAWA;AAGlC,YAAM,cAAc,QAAQ,KAAK;AAAA,QAC/B,SAAS,sCAAsC,mBAAmB;AAAA;AAAA;AAAA;AAAA,SAIjE;AAAA,QACD,UAAU,CAAC,IAAI,EAAE;AAAA,QACjB,YAAY,CAAC,IAAI,EAAE;AAAA,QACnB,aAAa,CAAC,GAAG,GAAG;AAAA,QACpB,WAAW,sCAAsC,mBAAmB;AAAA;AAAA;AAAA;AAAA,SAInE;AAAA,QACD,YAAY,CAAC,IAAI,EAAE;AAAA,QACnB,cAAc,CAAC,IAAI,EAAE;AAAA,MACvB,CAAC;AACD,cAAQ,OAAO,UAAU,QAAQ,OAAO;AAGxC,YAAM,SAAS,MAAM,gBAAgB,IAAI,IAAI;AAC7C,YAAM,UAAU,MAAM;AAAA,QACpB,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,MAAM,CAAC,UAAmB;AAC1B,cAAM,WAAW,kBAAkB,4CAAc,kBAAkB,OAAO,IAAI,KAAK,IAAI,CAAC;AACxF,YAAI,SAAS,UAAU,IAAI,YAAY;AACvC,YAAI,SAAS,OAAO,QAAQ;AAC5B,eAAO,EAAE,SAAS;AAAA,MACpB,CAAC;AAED,UAAI,cAAc,OAAO,GAAG;AAC1B,eAAO;AAAA,UACL,UAAU;AACR,gBAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,oBAAQ,SAAS,OAAO;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAGA,UAAI,YAAY,QAAQ,cAAc,IAAI,MAAM,gBAAgB,MAAM,OAAO;AAC3E,cAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,iBAAS,YAAY;AAErB,cAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,cAAM,cAAc;AAEpB,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,cAAc;AAEnB,iBAAS,OAAO,OAAO,IAAI;AAC3B,YAAI,SAAS,UAAU,IAAI,YAAY;AACvC,YAAI,SAAS,OAAO,QAAQ;AAE5B,eAAO;AAAA,UACL,UAAU;AACR,gBAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,qBAAS,OAAO;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAGA,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AACpB,cAAQ,OAAO,iBAAiB,OAAO,CAAC;AACxC,UAAI,SAAS,YAAY,OAAO;AAEhC,YAAM,eAAe,SAAS,cAAc,KAAK;AACjD,mBAAa,YAAY;AACzB,cAAQ,YAAY,YAAY;AAEhC,YAAM,MAAM,QAAQ,IAAI,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;AAEvD,cAAQ,UAAU,sDAAsD;AAAA,QACtE,aAAa;AAAA,MACf,CAAC,EAAE,MAAM,GAAG;AAGZ,YAAM,eAAe,QAAQ,QAAQ,SAAS;AAAA,QAC5C,OAAO,OAAO;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,WAAW;AAAA,UACX,aAAa;AAAA,QACf;AAAA,QACA,cAAc,CAAC,SAAc,WAAgB;AAC3C,iBAAO,QAAQ,aAAa,QAAQ;AAAA,YAClC,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,QACA,eAAe,CAAC,SAAc,UAAe;AAC3C,cAAI,QAAQ,YAAY;AACtB,kBAAM,QAAQ,QAAQ;AACtB,kBAAM,OAAO,OAAO,KAAK,KAAK;AAC9B,gBAAI,KAAK,SAAS,GAAG;AACnB,oBAAM,eAAe,SAAS,cAAc,KAAK;AACjD,2BAAa,YAAY;AAEzB,oBAAM,aAAa,SAAS,cAAc,IAAI;AAC9C,yBAAW,cAAc;AACzB,2BAAa,YAAY,UAAU;AAEnC,oBAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,oBAAM,YAAY;AAElB,yBAAW,OAAO,MAAM;AACtB,sBAAM,MAAM,MAAM,GAAG;AACrB,oBAAI,QAAQ,QAAQ,QAAQ,OAAW;AAEvC,sBAAM,MAAM,SAAS,cAAc,IAAI;AACvC,sBAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,wBAAQ,YAAY;AACpB,wBAAQ,cAAc;AAEtB,sBAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,wBAAQ,YAAY;AACpB,wBAAQ,cAAc,OAAO,QAAQ,WAAW,KAAK,UAAU,GAAG,IAAI,OAAO,GAAG;AAEhF,oBAAI,OAAO,SAAS,OAAO;AAC3B,sBAAM,YAAY,GAAG;AAAA,cACvB;AAEA,2BAAa,YAAY,KAAK;AAC9B,oBAAM,UAAU,YAAY;AAAA,YAC9B;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC,EAAE,MAAM,GAAG;AAGZ,UAAI;AACF,cAAM,SAAS,aAAa,UAAU;AACtC,YAAI,OAAO,QAAQ,GAAG;AACpB,cAAI,UAAU,QAAQ,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;AAAA,QAC7C;AAAA,MACF,SAAS,GAAG;AACV,gBAAQ,KAAK,0CAA0C,CAAC;AAAA,MAC1D;AAEA,aAAO;AAAA,QACL,SAAS;AACP,cAAI,eAAe;AAAA,QACrB;AAAA,QACA,UAAU;AACR,cAAI,OAAO;AACX,kBAAQ,OAAO;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,WAAmB,YAAiC;AAC7E,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AACrB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,SAAO,cAAc;AACrB,WAAS,OAAO,OAAO,MAAM;AAC7B,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAgB,UAA0B;AACnE,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,EAAE;AAC3E,SAAO,UAAU,GAAG,QAAQ,KAAK,OAAO,KAAK,GAAG,QAAQ;AAC1D;AAEA,SAAS,cAAc,OAAoD;AACzE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,cAAc;AACtE;AASA,SAAS,iBAAiB,SAA2B;AACnD,QAAM,UAAU,iBAAiB,OAAO;AACxC,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,oBAAkB,KAAK,gBAAM,OAAO,QAAQ,QAAQ,CAAC;AACrD,oBAAkB,KAAK,gBAAM,qBAAqB,QAAQ,cAAc,CAAC;AACzE,oBAAkB,KAAK,4BAAQ,OAAO,QAAQ,aAAa,IAAI,CAAC;AAChE,MAAI,QAAQ,aAAa,OAAO,GAAG;AACjC,sBAAkB,KAAK,4BAAQ,CAAC,GAAG,QAAQ,YAAY,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,EACjF;AACA,MAAI,QAAQ,QAAQ;AAClB,sBAAkB,KAAK,gBAAM,aAAa,QAAQ,MAAM,CAAC;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,QAAqB,OAAe,OAAqB;AAClF,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,OAAK,OAAO,KAAK,OAAO;AACxB,SAAO,OAAO,IAAI;AACpB;AAEA,SAAS,iBAAiB,SAA0B;AAClD,QAAM,UAAsB;AAAA,IAC1B,UAAU;AAAA,IACV,gBAAgB,oBAAI,IAAI;AAAA,IACxB,cAAc,oBAAI,IAAI;AAAA,EACxB;AACA,aAAW,WAAW,gBAAgB,OAAO,GAAG;AAC9C,YAAQ;AACR,QAAI,QAAQ,cAAc,OAAO,QAAQ,eAAe,UAAU;AAChE,aAAO,KAAK,QAAQ,UAAU,EAAE,QAAQ,CAAC,QAAQ,QAAQ,aAAa,IAAI,GAAG,CAAC;AAAA,IAChF;AACA,sBAAkB,QAAQ,UAAU,OAAO;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAmB;AAC1C,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AACA,MAAI,MAAM,SAAS,uBAAuB,MAAM,QAAQ,MAAM,QAAQ,GAAG;AACvE,WAAO,MAAM;AAAA,EACf;AACA,MAAI,MAAM,SAAS,WAAW;AAC5B,WAAO,CAAC,KAAK;AAAA,EACf;AACA,MAAI,MAAM,QAAQ,MAAM,aAAa;AACnC,WAAO,CAAC,EAAE,MAAM,WAAW,YAAY,CAAC,GAAG,UAAU,MAAM,CAAC;AAAA,EAC9D;AACA,SAAO,CAAC;AACV;AAEA,SAAS,kBAAkB,UAAe,SAA2B;AACnE,MAAI,CAAC,UAAU;AACb,YAAQ,eAAe,IAAI,SAAS,QAAQ,eAAe,IAAI,MAAM,KAAK,KAAK,CAAC;AAChF;AAAA,EACF;AACA,QAAM,OAAO,OAAO,SAAS,QAAQ,SAAS;AAC9C,UAAQ,eAAe,IAAI,OAAO,QAAQ,eAAe,IAAI,IAAI,KAAK,KAAK,CAAC;AAC5E,MAAI,SAAS,wBAAwB,MAAM,QAAQ,SAAS,UAAU,GAAG;AACvE,eAAW,SAAS,SAAS,YAAY;AACvC,wBAAkB,OAAO,OAAO;AAAA,IAClC;AACA;AAAA,EACF;AACA,eAAa,SAAS,SAAS,WAAW;AAC5C;AAEA,SAAS,aAAa,SAAqB,aAA4B;AACrE,MAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/B;AAAA,EACF;AACA,MAAI,OAAO,YAAY,CAAC,MAAM,YAAY,OAAO,YAAY,CAAC,MAAM,UAAU;AAC5E,UAAM,MAAM,YAAY,CAAC;AACzB,UAAM,MAAM,YAAY,CAAC;AACzB,QAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,GAAG,GAAG;AAClD;AAAA,IACF;AACA,UAAM,SAAS,QAAQ,UAAU,CAAC,KAAK,KAAK,KAAK,GAAG;AACpD,WAAO,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG;AACnC,WAAO,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG;AACnC,WAAO,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG;AACnC,WAAO,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG;AACnC,YAAQ,SAAS;AACjB;AAAA,EACF;AACA,aAAW,QAAQ,aAAa;AAC9B,iBAAa,SAAS,IAAI;AAAA,EAC5B;AACF;AAEA,SAAS,qBAAqB,QAAqC;AACjE,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE,EACzC,KAAK,IAAI,KAAK;AACnB;AAEA,SAAS,aAAa,QAAkD;AACtE,SAAO,OAAO,IAAI,CAAC,UAAU,OAAO,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI;AAClE;AAEA,eAAe,eACb,MACA,QACA,cACA,gBACA,QACA,UACc;AACd,QAAM,MAAM,cAAc,MAAM,gBAAgB,EAAE,YAAY;AAE9D,MAAI,QAAQ,WAAW;AACrB,UAAM,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM;AAC5C,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AAEA,MAAI,QAAQ,YAAY;AACtB,UAAM,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM;AAC5C,UAAM,WAAW,KAAK,MAAM,IAAI;AAChC,UAAM,kBAAyB,CAAC;AAChC,eAAW,OAAO,OAAO,KAAK,SAAS,OAAO,GAAG;AAC/C,YAAM,UAAU,eAAe,QAAQ,UAAU,SAAS,QAAQ,GAAG,CAAC;AACtE,UAAI,QAAQ,SAAS,qBAAqB;AACxC,wBAAgB,KAAK,GAAG,QAAQ,QAAQ;AAAA,MAC1C,OAAO;AACL,wBAAgB,KAAK,OAAO;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,QAAQ,OAAO;AACjB,UAAM,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM;AAC5C,UAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,MAAM,UAAU;AAC5D,WAAO,aAAa,IAAI,GAAG;AAAA,EAC7B;AAEA,MAAI,QAAQ,OAAO;AACjB,UAAM,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM;AAC5C,UAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,MAAM,UAAU;AAC5D,WAAO,aAAa,IAAI,GAAG;AAAA,EAC7B;AAEA,MAAI,QAAQ,OAAO;AACjB,UAAM,MAAM,MAAM,SAAS,UAAU,MAAM;AAC3C,UAAM,UAAe,OAAO,OAAO,IAAI,KAAK,EAAE,KAAK,CAAC,MAAW,EAAE,KAAK,YAAY,EAAE,SAAS,MAAM,CAAC;AACpG,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AACA,UAAM,UAAU,MAAM,QAAQ,MAAM,MAAM;AAC1C,UAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,SAAS,UAAU;AAC/D,WAAO,aAAa,IAAI,GAAG;AAAA,EAC7B;AAEA,MAAI,QAAQ,OAAO;AACjB,UAAM,KAAK,IAAI,WAAW,MAAM;AAChC,UAAM,QAAQ,GAAG,CAAC,MAAM,MAAQ,GAAG,CAAC,MAAM,MAAQ,GAAG,CAAC,MAAM,KAAQ,GAAG,CAAC,MAAM;AAC9E,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AACA,UAAM,SAAS,MAAM,OAAO,MAAM;AAClC,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,YAAM,WAAkB,CAAC;AACzB,iBAAW,QAAQ,QAAQ;AACzB,YAAI,KAAK,SAAS,qBAAqB;AACrC,mBAAS,KAAK,GAAG,KAAK,QAAQ;AAAA,QAChC,WAAW,KAAK,SAAS,WAAW;AAClC,mBAAS,KAAK,IAAI;AAAA,QACpB;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,MAAI;AACF,UAAM,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM;AAC5C,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,UAAM,IAAI,MAAM,2BAA2B,GAAG,EAAE;AAAA,EAClD;AACF;;;AC9bA,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,qBAA6C;AAAA,EACjD,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,cAAc;AAAA,EACd,iCAAiC;AAAA,EACjC,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,oBAAoB;AAAA,EACpB,kCAAkC;AAAA,EAClC,oBAAoB;AACtB;AAEA,IAAM,iBAAiB,IAAI,IAAI,OAAO,KAAK,kBAAkB,CAAC;AAEvD,SAAS,cAA6B;AAC3C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,gBAAgB,IAAI,KAAK,SAAS,KAAK,eAAe,IAAI,KAAK,QAAQ;AAAA,IAChF;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,WAAW;AACrC,UAAI,SAAS,OAAO,KAAK;AACzB,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AACvC,YAAM,YAAY,cAAc,IAAI,MAAM,kBAAkB,EAAE,YAAY;AAC1E,YAAM,QAAQ,IAAI,WAAW,MAAM,gBAAgB,IAAI,IAAI,EAAE,MAAM,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC;AAE5F,YAAM,UAAU,cAAc,WAAW,SAAS,CAAC;AACnD,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AACpB,iBAAW,SAAS,gBAAM,IAAI,KAAK,IAAI;AACvC,iBAAW,SAAS,gBAAM,YAAY,IAAI,SAAS,KAAK,IAAI,KAAK,YAAY,cAAI;AACjF,iBAAW,SAAS,gBAAMC,aAAY,IAAI,KAAK,QAAQ,MAAM,UAAU,CAAC;AACxE,iBAAW,SAAS,gBAAMC,eAAc,KAAK,CAAC;AAE9C,YAAM,OAAO,SAAS,cAAc,GAAG;AACvC,WAAK,cAAc,cAAc,SAAS;AAE1C,YAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,eAAS,YAAY;AACrB,eAAS,OAAO;AAChB,eAAS,WAAW,IAAI,KAAK;AAC7B,eAAS,cAAc;AAEvB,cAAQ,OAAO,SAAS,MAAM,QAAQ;AACtC,UAAI,YAAY,SAAS,GAAG;AAC1B,gBAAQ,OAAO,MAAM,kBAAkB,WAAW,KAAK,IAAI,KAAK,MAAM,KAAK,CAAC;AAAA,MAC9E;AACA,UAAI,cAAc,QAAQ;AACxB,gBAAQ,OAAO,kBAAkB,KAAK,CAAC;AAAA,MACzC;AACA,UAAI,cAAc,SAAS,cAAc,OAAO;AAC9C,gBAAQ,OAAO,uBAAuB,KAAK,CAAC;AAAA,MAC9C;AACA,UAAI,cAAc,YAAY,cAAc,aAAa,cAAc,MAAM;AAC3E,gBAAQ,OAAO,oBAAoB,KAAK,CAAC;AAAA,MAC3C;AACA,UAAI,cAAc,WAAW;AAC3B,gBAAQ,OAAO,qBAAqB,KAAK,CAAC;AAAA,MAC5C;AACA,UAAI,cAAc,QAAQ;AACxB,gBAAQ,OAAO,kBAAkB,KAAK,CAAC;AAAA,MACzC;AACA,UAAI,cAAc,cAAc;AAC9B,gBAAQ,OAAO,wBAAwB,KAAK,CAAC;AAAA,MAC/C;AACA,UAAI,cAAc,QAAQ,cAAc,SAAS,cAAc,MAAM;AACnE,gBAAQ,OAAO,wBAAwB,KAAK,CAAC;AAAA,MAC/C;AACA,YAAM,UAAU,iBAAiB,KAAK;AACtC,UAAI,SAAS;AACX,gBAAQ,OAAO,OAAO;AAAA,MACxB;AACA,YAAM,OAAO,OAAO;AAEpB,aAAO;AAAA,QACL,UAAU;AACR,0BAAgB,KAAK,UAAU;AAC/B,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,WAAW,WAA2B;AAC7C,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,CAAC,OAAO,OAAO,MAAM,OAAO,IAAI,EAAE,SAAS,SAAS,GAAG;AACzD,WAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU,WAAW,MAAM,WAAW,MAAM,EAAE,SAAS,SAAS,GAAG;AACtE,WAAO;AAAA,EACT;AACA,MAAI,cAAc,QAAQ;AACxB,WAAO;AAAA,EACT;AACA,MAAI,cAAc,cAAc;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,cAAc,WAA2B;AAChD,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,cAAc,SAAS,cAAc,OAAO;AAC9C,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,OAAO,IAAI,EAAE,SAAS,SAAS,GAAG;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU,WAAW,IAAI,EAAE,SAAS,SAAS,GAAG;AACnD,WAAO;AAAA,EACT;AACA,MAAI,cAAc,aAAa,cAAc,QAAQ;AACnD,WAAO;AAAA,EACT;AACA,MAAI,cAAc,QAAQ;AACxB,WAAO;AAAA,EACT;AACA,MAAI,cAAc,cAAc;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,YAAY,WAA4B;AAC/C,SAAO,CAAC,OAAO,OAAO,QAAQ,SAAS,KAAK,EAAE,SAAS,SAAS;AAClE;AAEA,eAAe,kBAAkB,WAAmB,KAAa,UAAkB,OAAyC;AAC1H,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AAEpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AAEtB,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,SAAO,YAAY;AACnB,SAAO,cAAc;AAErB,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,cAAc;AAEtB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,YAAY;AAEjB,UAAQ,OAAO,SAAS,QAAQ,SAAS,IAAI;AAE7C,MAAI,EAAE,cAAc,WAAW,CAAC,SAAS,OAAO;AAC9C,SAAK,cAAc;AACnB,YAAQ,OAAO,sBAAsB,OAAO,SAAS,CAAC;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,SAAS,QAAQ,iBAAiB,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;AAC1E,QAAM,SAAS,eAAe,SAAS;AACvC,QAAM,SAAS,SAAS,QAAQ,GAAG,cAAc,MAAM,OAAO,QAAQ,GAAG;AAEzE,MAAI;AACF,UAAM,WAAW,IAAI,SAAS,QAAQ,MAAM;AAC5C,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,aAAS,MAAM,IAAI,MAAM;AACzB,WAAO,MAAM,aAAa,IAAI,MAAM;AACpC,YAAQ,MAAM,aAAa,IAAI,MAAM;AACrC,SAAK,cAAc;AAAA,EACrB,SAAS,OAAO;AACd,SAAK,cAAc,yDAAY,iBAAiB,QAAQ,MAAM,UAAU,4FAAiB;AAAA,EAC3F;AAEA,UAAQ,OAAO,sBAAsB,OAAO,SAAS,CAAC;AACtD,SAAO;AACT;AAEA,SAAS,eAAe,WAA2B;AACjD,QAAM,MAA8B;AAAA,IAClC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP;AACA,SAAO,IAAI,SAAS,KAAK;AAC3B;AAgCA,SAAS,sBAAsB,OAAmB,WAAgC;AAChF,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AAEpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,cAAc,OAAO,SAAS;AAC7C,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,gBAAM,OAAO,aAAa,MAAM;AACpD,aAAW,SAAS,UAAU,OAAO,UAAU,cAAI;AACnD,aAAW,SAAS,sBAAO,OAAO,OAAO,MAAM;AAC/C,MAAI,OAAO,kBAAkB,QAAW;AACtC,eAAW,SAAS,4BAAQD,aAAY,OAAO,aAAa,CAAC;AAAA,EAC/D;AACA,aAAW,QAAQ,OAAO,QAAQ,CAAC,GAAG;AACpC,eAAW,SAAS,KAAK,OAAO,KAAK,KAAK;AAAA,EAC5C;AACA,UAAQ,OAAO,OAAO;AAEtB,MAAI,OAAO,OAAO;AAChB,UAAM,OAAO,SAAS,cAAc,GAAG;AACvC,SAAK,YAAY;AACjB,SAAK,cAAc,OAAO;AAC1B,YAAQ,OAAO,IAAI;AAAA,EACrB;AAEA,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,YAAQ,OAAO,oBAAoB,QAAQ,OAAO,MAAM,IAAI,CAAC,UAAU,EAAE,KAAK,KAAK,OAAO,OAAO,KAAK,MAAM,EAAE,CAAC,CAAC;AAAA,EAClH;AAEA,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,YAAQ,OAAO,uBAAuB,OAAO,MAAM,CAAC;AAAA,EACtD;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,QAAuC;AACrE,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AAEpB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,aAAW,SAAS,CAAC,OAAO,UAAU,UAAU,cAAc,UAAU,GAAG;AACzE,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,cAAc;AACjB,YAAQ,OAAO,EAAE;AAAA,EACnB;AACA,QAAM,OAAO,OAAO;AAEpB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,aAAW,SAAS,OAAO,MAAM,GAAG,EAAE,GAAG;AACvC,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,eAAW,SAAS;AAAA,MAClB,MAAM;AAAA,MACN,KAAK,MAAM,OAAO,SAAS,EAAE,EAAE,YAAY,CAAC;AAAA,MAC5CA,aAAY,MAAM,MAAM;AAAA,MACxB,MAAM,qBAAqB,SAAY,MAAMA,aAAY,MAAM,gBAAgB;AAAA,MAC/E,MAAM,aAAa,SAAY,MAAM,KAAK,MAAM,SAAS,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC;AAAA,IACtG,GAAG;AACD,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,WAAK,cAAc;AACnB,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,UAAM,OAAO,GAAG;AAAA,EAClB;AACA,QAAM,OAAO,OAAO,KAAK;AACzB,UAAQ,OAAO,OAAO,KAAK;AAC3B,SAAO;AACT;AAEA,SAAS,cAAc,OAAmB,WAA6B;AACrE,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO,EAAE,OAAO,OAAO,OAAO,kFAAiB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EACvE;AACA,QAAM,YAAYE,SAAQ,OAAO,GAAG,CAAC;AACrC,MAAI,cAAc,QAAQ;AACxB,WAAO,cAAc,KAAK;AAAA,EAC5B;AACA,MAAI,cAAc,QAAQ;AACxB,WAAO,eAAe,KAAK;AAAA,EAC7B;AACA,MAAI,cAAc,OAAO;AACvB,WAAO,aAAa,KAAK;AAAA,EAC3B;AACA,SAAO,cAAc,OAAO,GAAG,MAAM;AACvC;AAEA,SAAS,cAAc,OAAmB,QAAgB,WAA6B;AACrF,MAAI,SAAS,KAAK,MAAM,QAAQ;AAC9B,WAAO,EAAE,OAAO,OAAO,OAAO,kFAAgC,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EACtF;AACA,QAAM,SAAS,WAAW,OAAO,MAAM;AACvC,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,OAAO,OAAO,OAAO,sEAAmC,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EACzF;AACA,QAAMC,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,aAAaA,MAAK,UAAU,SAAS,GAAG,KAAK;AACnD,QAAM,eAAe,SAAS,KAAK,aAAa;AAChD,MAAI,cAAc,KAAK,eAAe,MAAM,QAAQ;AAClD,WAAO,EAAE,OAAO,OAAO,OAAO,qEAAmB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EACzE;AACA,QAAM,SAA2B,CAAC;AAClC,WAAS,QAAQ,GAAG,QAAQ,YAAY,SAAS;AAC/C,UAAM,cAAc,SAAS,KAAK,QAAQ;AAC1C,WAAO,KAAK;AAAA,MACV,KAAKD,SAAQ,OAAO,aAAa,CAAC;AAAA,MAClC,UAAUC,MAAK,UAAU,cAAc,GAAG,KAAK;AAAA,MAC/C,QAAQA,MAAK,UAAU,cAAc,GAAG,KAAK;AAAA,MAC7C,QAAQA,MAAK,UAAU,cAAc,IAAI,KAAK;AAAA,IAChD,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,mBAAmB,OAAO,OAAO,KAAK,CAAC,UAAU,MAAM,QAAQ,MAAM,CAAC;AAAA,EAC/E;AACF;AAEA,SAAS,cAAc,OAA6B;AAClD,MAAI,MAAM,SAAS,IAAI;AACrB,WAAO,EAAE,OAAO,OAAO,OAAO,4EAAqB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EAC3E;AACA,QAAMA,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,aAAaA,MAAK,UAAU,IAAI,KAAK;AAC3C,QAAM,eAAe,KAAK,aAAa;AACvC,MAAI,cAAc,KAAK,eAAe,MAAM,QAAQ;AAClD,WAAO,EAAE,OAAO,OAAO,OAAO,qEAAmB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EACzE;AACA,QAAM,SAA2B,CAAC;AAClC,WAAS,QAAQ,GAAG,QAAQ,YAAY,SAAS;AAC/C,UAAM,cAAc,KAAK,QAAQ;AACjC,WAAO,KAAK;AAAA,MACV,KAAKD,SAAQ,OAAO,aAAa,CAAC;AAAA,MAClC,QAAQC,MAAK,UAAU,cAAc,GAAG,KAAK;AAAA,MAC7C,kBAAkBA,MAAK,UAAU,cAAc,GAAG,KAAK;AAAA,MACvD,QAAQA,MAAK,UAAU,cAAc,IAAI,KAAK;AAAA,MAC9C,UAAUA,MAAK,UAAU,cAAc,IAAI,KAAK;AAAA,IAClD,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,WAAW;AAAA,IACX,QAAQ,WAAW,OAAO,CAAC,KAAKD,SAAQ,OAAO,GAAG,CAAC;AAAA,IACnD;AAAA,IACA,OAAO,mBAAmB,OAAO,OAAO,KAAK,CAAC,UAAU,MAAM,QAAQ,UAAU,MAAM,qBAAqB,MAAM,MAAM,CAAC;AAAA,IACxH,eAAeC,MAAK,UAAU,IAAI,KAAK;AAAA,EACzC;AACF;AAEA,SAAS,eAAe,OAA6B;AACnD,MAAI,MAAM,SAAS,IAAI;AACrB,WAAO,EAAE,OAAO,OAAO,OAAO,6EAAsB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EAC5E;AACA,QAAMA,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,aAAaA,MAAK,UAAU,IAAI,KAAK;AAC3C,MAAI,SAAS;AACb,QAAM,SAA2B,CAAC;AAClC,WAAS,QAAQ,GAAG,QAAQ,YAAY,SAAS;AAC/C,QAAI,UAAU,MAAM,QAAQ;AAC1B,aAAO,EAAE,OAAO,OAAO,OAAO,sEAAoB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,IAC1E;AACA,UAAM,QAAQ,MAAM,QAAQ;AAC5B,UAAM,WAAW,QAAQ;AACzB,QAAI,MAAM,mBAAmB,QAAQ;AACrC,QAAI,aAAa,IAAM;AACrB,UAAI,SAAS,IAAI,MAAM,QAAQ;AAC7B,eAAO,EAAE,OAAO,OAAO,OAAO,iFAA0B,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,MAChF;AACA,YAAMD,SAAQ,OAAO,QAAQ,CAAC;AAC9B,gBAAU;AAAA,IACZ;AACA,UAAM,iBAAiB,cAAc,OAAO,MAAM;AAClD,QAAI,CAAC,gBAAgB;AACnB,aAAO,EAAE,OAAO,OAAO,OAAO,4EAAqB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,IAC3E;AACA,aAAS,eAAe;AACxB,QAAI;AACJ,UAAM,gBAAgB,QAAQ,SAAU,KAAM,QAAQ,WAAW,QAAQ,SAAU,KAAO,QAAQ,WAAW,QAAQ,SAAU;AAC/H,QAAI,gBAAgB,QAAQ,QAAQ;AAClC,YAAM,cAAc,cAAc,OAAO,MAAM;AAC/C,UAAI,CAAC,aAAa;AAChB,eAAO,EAAE,OAAO,OAAO,OAAO,8DAAgC,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,MACtF;AACA,0BAAoB,YAAY;AAChC,eAAS,YAAY;AAAA,IACvB;AACA,WAAO,KAAK;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,eAAe;AAAA,MACvB,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,WAAW;AAAA,IACX,QAAQ,WAAW,OAAO,CAAC,KAAKA,SAAQ,OAAO,GAAG,CAAC;AAAA,IACnD;AAAA,IACA,OAAO,CAAC;AAAA,IACR,eAAeC,MAAK,UAAU,IAAI,KAAK;AAAA,IACvC,MAAM;AAAA,MACJ,EAAE,OAAO,4BAAQ,OAAOH,aAAYG,MAAK,UAAU,IAAI,KAAK,CAAC,EAAE;AAAA,MAC/D,EAAE,OAAO,QAAQ,OAAOA,MAAK,UAAU,IAAI,KAAK,IAAI,IAAI,GAAGH,aAAYG,MAAK,UAAU,IAAI,KAAK,CAAC,CAAC,QAAQA,MAAK,UAAU,IAAI,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,CAAC,KAAK,SAAI;AAAA,MACtK,EAAE,OAAO,WAAW,OAAOA,MAAK,UAAU,IAAI,KAAK,IAAI,IAAI,GAAGH,aAAYG,MAAK,UAAU,IAAI,KAAK,CAAC,CAAC,QAAQA,MAAK,UAAU,IAAI,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,CAAC,KAAK,SAAI;AAAA,IAC3K;AAAA,IACA,OAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,OAA6B;AACjD,MAAI,MAAM,SAAS,IAAI;AACrB,WAAO,EAAE,OAAO,OAAO,OAAO,2EAAoB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EAC1E;AACA,QAAMA,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,UAAUA,MAAK,UAAU,GAAG,IAAI;AACtC,QAAM,eAAeA,MAAK,UAAU,GAAG,IAAI;AAC3C,QAAM,UAAUA,MAAK,UAAU,GAAG,IAAI;AACtC,QAAM,QAAQA,MAAK,UAAU,IAAI,IAAI;AACrC,QAAM,SAAS,MAAM,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG;AACzG,QAAM,UAAU,MAAM,EAAE;AACxB,QAAM,SAAS,MAAM,EAAE;AACvB,QAAM,SAASA,MAAK,UAAU,IAAI,IAAI;AACtC,MAAI,SAAS;AACb,QAAM,QAA0B,CAAC;AACjC,QAAM,SAAgE;AAAA,IACpE,EAAE,IAAI,GAAG,OAAO,UAAU,QAAQ,KAAK;AAAA,IACvC,EAAE,IAAI,GAAG,OAAO,aAAa,QAAQ,KAAK;AAAA,IAC1C,EAAE,IAAI,GAAG,OAAO,WAAW,QAAQ,KAAK;AAAA,IACxC,EAAE,IAAI,GAAG,OAAO,aAAa,QAAQ,KAAK;AAAA,IAC1C,EAAE,IAAI,GAAG,OAAO,gBAAgB,QAAQ,MAAM;AAAA,EAChD;AACA,aAAW,SAAS,QAAQ;AAC1B,UAAM,aAAa,mBAAmB,OAAO,QAAQ,MAAM,MAAM;AACjE,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AACA,aAAS,WAAW;AACpB,QAAI,MAAM,KAAK,KAAK,WAAW,OAAO;AACpC,YAAM,KAAK,EAAE,IAAI,MAAM,IAAI,OAAO,MAAM,OAAO,OAAO,WAAW,MAAM,CAAC;AAAA,IAC1E;AAAA,EACF;AACA,MAAI,SAAS,KAAK,MAAM,QAAQ;AAC9B,cAAU;AAAA,EACZ;AACA,QAAM,aAAa,uBAAuB,OAAO,MAAM;AACvD,QAAM,WAAW,eAAe,SAAY,SAAY,cAAc,OAAO,YAAY,mBAAmB;AAC5G,SAAO;AAAA,IACL,OAAO;AAAA,IACP,WAAW;AAAA,IACX,QAAQ,UAAU,QAAQ,SAAS,SAAS;AAAA,IAC5C,QAAQ,UAAU,QAAQ,SAAS,SAAS,CAAC;AAAA,IAC7C,OAAO,UAAU,SAAS,SAAS,MAAM,SAAS,IAAI,SAAS,QAAQ;AAAA,IACvE,eAAe,gBAAgB;AAAA,IAC/B,MAAM;AAAA,MACJ,EAAE,OAAO,oBAAU,OAAO,UAAUH,aAAY,OAAO,IAAI,qBAAM;AAAA,MACjE,EAAE,OAAO,gBAAM,OAAO,KAAK,QAAQ,SAAS,EAAE,EAAE,YAAY,CAAC,GAAG;AAAA,MAChE,EAAE,OAAO,SAAS,OAAO,KAAK,MAAM,SAAS,EAAE,EAAE,YAAY,CAAC,GAAG;AAAA,MACjE,EAAE,OAAO,UAAU,OAAO,UAAU,qBAAM;AAAA,MAC1C,EAAE,OAAO,UAAU,OAAO,SAAS,WAAM,SAAI;AAAA,MAC7C,EAAE,OAAO,WAAW,OAAO,QAAQ;AAAA,MACnC,EAAE,OAAO,UAAU,OAAO,OAAO;AAAA,MACjC,EAAE,OAAO,qBAAW,OAAO,eAAe,SAAY,uBAAQ,KAAK,WAAW,SAAS,EAAE,EAAE,YAAY,CAAC,GAAG;AAAA,IAC7G;AAAA,IACA,OAAO,UAAU,QAAQ,SAAY;AAAA,EACvC;AACF;AAEA,SAAS,mBAAmB,OAAmB,QAAgB,QAAgE;AAC7H,QAAMG,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,MAAI,QAAQ;AACV,QAAI,SAAS,IAAI,MAAM,QAAQ;AAC7B,aAAO;AAAA,IACT;AACA,cAAU;AAAA,EACZ;AACA,MAAI,SAAS,IAAI,MAAM,QAAQ;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,SAASA,MAAK,UAAU,QAAQ,IAAI;AAC1C,YAAU;AACV,MAAI,SAAS,SAAS,MAAM,QAAQ;AAClC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,SAAS,IAAI,gBAAgB,MAAM,MAAM,QAAQ,SAAS,MAAM,CAAC,IAAI;AACnF,SAAO,EAAE,OAAO,QAAQ,SAAS,OAAO;AAC1C;AAEA,SAAS,mBAAmB,OAAuB;AACjD,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,KAAK,KAAK,KAAK,SAAS,KAAK;AACtC;AAEA,SAAS,cAAc,OAAmB,QAA+D;AACvG,MAAI,UAAU,MAAM,QAAQ;AAC1B,WAAO;AAAA,EACT;AACA,QAAM,OAAO,MAAM,QAAQ;AAC3B,MAAI,SAAS,KAAK;AAChB,QAAI,SAAS,IAAI,MAAM,QAAQ;AAC7B,aAAO;AAAA,IACT;AACA,WAAO,EAAE,OAAQ,MAAM,MAAM,KAAK,IAAK,MAAM,SAAS,CAAC,GAAG,QAAQ,SAAS,EAAE;AAAA,EAC/E;AACA,MAAI,SAAS,KAAK;AAChB,QAAI,UAAU,MAAM,QAAQ;AAC1B,aAAO;AAAA,IACT;AACA,WAAO,EAAE,OAAO,MAAM,MAAM,IAAI,KAAK,QAAQ,SAAS,EAAE;AAAA,EAC1D;AACA,MAAI,SAAS,KAAK;AAChB,QAAI,UAAU,MAAM,QAAQ;AAC1B,aAAO;AAAA,IACT;AACA,WAAO,EAAE,OAAO,MAAM,MAAM,IAAI,KAAK,QAAQ,SAAS,EAAE;AAAA,EAC1D;AACA,SAAO,EAAE,OAAO,MAAM,OAAO;AAC/B;AAEA,SAAS,gBAAgB,OAA2B;AAClD,QAAM,OAAO,cAAc,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK;AAC5D,SAAO,QAAQ,IAAI,YAAY,QAAQ,EAAE,OAAO,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK;AACnF;AAEA,SAAS,cAAc,OAA2B;AAChD,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,IAAI,MAAM,QAAQ,SAAS,GAAG;AACxD,aAAS,OAAO,aAAa,MAAM,KAAK,IAAK,MAAM,QAAQ,CAAC,KAAK,CAAE;AAAA,EACrE;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAmB,OAAmC;AACpF,WAAS,SAAS,KAAK,IAAI,GAAG,KAAK,GAAG,SAAS,MAAM,MAAM,QAAQ,UAAU;AAC3E,UAAM,SAAS,WAAW,OAAO,MAAM;AACvC,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,UAAM,aAAc,MAAM,SAAS,CAAC,KAAK,IAAK,MAAM,SAAS,CAAC;AAC9D,UAAM,eAAe,SAAS,KAAK,aAAa;AAChD,QAAI,aAAa,KAAK,gBAAgB,MAAM,QAAQ;AAClD,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAmB,QAAoC;AACzE,MAAI,SAAS,IAAI,MAAM,QAAQ;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,QAAQD,SAAQ,OAAO,QAAQ,CAAC;AACtC,MAAI,UAAU,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,MAAM,MAAM,KAAQ,MAAM,SAAS,CAAC,MAAM,KAAQ,MAAM,SAAS,CAAC,MAAM,KAAQ,MAAM,SAAS,CAAC,MAAM,GAAM;AACpH,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAmB,OAA0C;AACvF,MAAI,CAAC,SAAS,MAAM,SAAS,MAAM,SAAS,MAAM,UAAU,MAAM,SAAS,GAAG;AAC5E,WAAO,CAAC;AAAA,EACV;AACA,QAAMC,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,SAAS,MAAM;AACrB,QAAM,QAAQA,MAAK,UAAU,SAAS,GAAG,KAAK;AAC9C,QAAM,gBAAgBA,MAAK,UAAU,SAAS,GAAG,KAAK;AACtD,QAAM,aAAa,SAAS,IAAI,QAAQ;AACxC,MAAI,aAAa,MAAM,UAAU,gBAAgB,MAAM,QAAQ;AAC7D,WAAO,CAAC;AAAA,EACV;AACA,QAAM,SAAS,oBAAI,IAAoB;AAAA,IACrC,CAAC,GAAG,QAAQ;AAAA,IACZ,CAAC,GAAG,WAAW;AAAA,IACf,CAAC,GAAG,WAAW;AAAA,IACf,CAAC,GAAG,SAAS;AAAA,IACb,CAAC,GAAG,iBAAiB;AAAA,IACrB,CAAC,GAAG,cAAc;AAAA,IAClB,CAAC,IAAI,SAAS;AAAA,IACd,CAAC,IAAI,oBAAoB;AAAA,IACzB,CAAC,IAAI,uBAAuB;AAAA,EAC9B,CAAC;AACD,QAAM,QAAQ,oBAAI,IAA4B;AAC9C,WAAS,QAAQ,GAAG,QAAQ,OAAO,SAAS;AAC1C,UAAM,eAAe,SAAS,IAAI,QAAQ;AAC1C,UAAM,aAAaA,MAAK,UAAU,cAAc,KAAK;AACrD,UAAM,aAAaA,MAAK,UAAU,eAAe,GAAG,KAAK;AACzD,UAAM,aAAaA,MAAK,UAAU,eAAe,GAAG,KAAK;AACzD,UAAM,SAASA,MAAK,UAAU,eAAe,GAAG,KAAK;AACrD,UAAM,SAASA,MAAK,UAAU,eAAe,GAAG,KAAK;AACrD,UAAM,eAAeA,MAAK,UAAU,eAAe,IAAI,KAAK;AAC5D,UAAM,QAAQ,OAAO,IAAI,MAAM;AAC/B,QAAI,CAAC,SAAS,MAAM,IAAI,MAAM,GAAG;AAC/B;AAAA,IACF;AACA,UAAM,QAAQ,SAAS,gBAAgB;AACvC,UAAM,MAAM,QAAQ;AACpB,QAAI,MAAM,MAAM,UAAU,MAAM,SAAS,MAAM,QAAQ;AACrD;AAAA,IACF;AACA,UAAM,QAAQ,eAAe,MAAM,MAAM,OAAO,GAAG,GAAG,YAAY,UAAU,EAAE,KAAK;AACnF,QAAI,OAAO;AACT,YAAM,IAAI,QAAQ,EAAE,IAAI,QAAQ,OAAO,aAAa,GAAG,KAAK,KAAK,WAAW,SAAS,EAAE,EAAE,YAAY,CAAC,MAAM,OAAO,MAAM,CAAC;AAAA,IAC5H;AAAA,EACF;AACA,SAAO,CAAC,GAAG,MAAM,OAAO,CAAC;AAC3B;AAEA,SAAS,eAAe,OAAmB,YAAoB,YAA4B;AACzF,MAAI,eAAe,KAAK,eAAe,KAAM,eAAe,KAAK,eAAe,GAAI;AAClF,WAAO,cAAc,KAAK;AAAA,EAC5B;AACA,SAAO,IAAI,YAAY,QAAQ,EAAE,OAAO,KAAK;AAC/C;AAEA,SAAS,cAAc,OAA2B;AAChD,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,IAAI,MAAM,QAAQ,SAAS,GAAG;AACxD,aAAS,OAAO,aAAc,MAAM,KAAK,KAAK,IAAK,MAAM,QAAQ,CAAC,CAAC;AAAA,EACrE;AACA,SAAO;AACT;AA+BA,SAAS,kBAAkB,OAAgC;AACzD,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,SAAS,UAAU,KAAK;AAE9B,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,gBAAM,OAAO,WAAW,cAAI;AAChD,aAAW,SAAS,YAAY,OAAO,SAAS,MAAM;AACtD,aAAW,SAAS,WAAW,OAAO,QAAQ,MAAM;AACpD,aAAW,SAAS,WAAW,OAAO,QAAQ,MAAM;AACpD,UAAQ,OAAO,OAAO;AAEtB,UAAQ,OAAO,uBAAuB,OAAO,QAAQ,CAAC;AACtD,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,YAAQ,OAAO,eAAe,gBAAM,OAAO,QAAQ,IAAI,CAAC,SAAS,GAAG,KAAK,MAAM,IAAI,KAAK,IAAI,SAAM,KAAK,IAAI,EAAE,CAAC,CAAC;AAAA,EACjH;AACA,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,YAAQ,OAAO,eAAe,gBAAM,OAAO,QAAQ,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,SAAM,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;AAAA,EACjH;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,UAAsC;AACpE,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,YAAY;AAClB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,aAAW,SAAS,CAAC,WAAW,gBAAM,cAAI,GAAG;AAC3C,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,cAAc;AACjB,WAAO,OAAO,EAAE;AAAA,EAClB;AACA,QAAM,OAAO,MAAM;AACnB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,aAAW,WAAW,SAAS,MAAM,GAAG,EAAE,GAAG;AAC3C,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc,QAAQ,aAAa,GAAG,QAAQ,IAAI,KAAK,QAAQ,UAAU,MAAM,QAAQ;AAC5F,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAcH,aAAY,QAAQ,IAAI;AAC3C,UAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,WAAO,cAAc,KAAK,QAAQ,OAAO,SAAS,EAAE,EAAE,YAAY,CAAC;AACnE,QAAI,OAAO,MAAM,MAAM,MAAM;AAC7B,UAAM,OAAO,GAAG;AAAA,EAClB;AACA,QAAM,OAAO,OAAO,KAAK;AACzB,SAAO;AACT;AAEA,SAAS,eAAe,WAAmB,MAA6B;AACtE,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,UAAQ,OAAO;AACf,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,cAAc,GAAG,SAAS,IAAI,KAAK,MAAM;AACjD,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,aAAW,OAAO,KAAK,MAAM,GAAG,GAAG,GAAG;AACpC,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc;AACnB,SAAK,OAAO,IAAI;AAAA,EAClB;AACA,MAAI,KAAK,SAAS,KAAK;AACrB,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc,gBAAM,KAAK,SAAS,GAAG;AAC1C,SAAK,OAAO,IAAI;AAAA,EAClB;AACA,UAAQ,OAAO,SAAS,IAAI;AAC5B,SAAO;AACT;AAEA,SAAS,UAAU,OAAgC;AACjD,MAAI,MAAM,SAAS,KAAK,MAAM,CAAC,MAAM,KAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,KAAM;AACxG,WAAO,EAAE,OAAO,OAAO,OAAO,+CAAgC,UAAU,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,EACvG;AAEA,QAAMG,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,UAAUA,MAAK,UAAU,GAAG,IAAI;AACtC,QAAM,WAA0B,CAAC;AACjC,QAAM,UAAwB,CAAC;AAC/B,QAAMC,WAAwB,CAAC;AAC/B,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,SAAS,MAAM,QAAQ;AAC5B,YAAM,gBAAgB;AACtB,YAAM,KAAK,MAAM,QAAQ;AACzB,YAAM,WAAW,YAAY,OAAO,MAAM;AAC1C,eAAS,SAAS;AAClB,YAAM,gBAAgB;AACtB,YAAM,aAAa,gBAAgB,SAAS;AAC5C,UAAI,aAAa,MAAM,QAAQ;AAC7B,cAAM,IAAI,MAAM,gEAAmB;AAAA,MACrC;AAEA,YAAM,UAAuB;AAAA,QAC3B;AAAA,QACA,MAAM,gBAAgB,EAAE;AAAA,QACxB,MAAM,SAAS;AAAA,QACf,QAAQ;AAAA,MACV;AACA,UAAI,OAAO,GAAG;AACZ,cAAM,aAAa,aAAa,OAAO,eAAe,UAAU;AAChE,gBAAQ,aAAa,WAAW,SAAS;AAAA,MAC3C,WAAW,OAAO,GAAG;AACnB,gBAAQ,KAAK,GAAG,iBAAiB,OAAO,eAAe,UAAU,CAAC;AAAA,MACpE,WAAW,OAAO,GAAG;AACnB,QAAAA,SAAQ,KAAK,GAAG,iBAAiB,OAAO,eAAe,UAAU,CAAC;AAAA,MACpE;AACA,eAAS,KAAK,OAAO;AACrB,eAAS;AAAA,IACX;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAChD;AAAA,MACA;AAAA,MACA,SAAAA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,MAAM,SAAS,UAAU,SAAS,SAAAA,SAAQ;AAC5D;AAEA,SAAS,iBAAiB,OAAmB,QAAgB,KAA2B;AACtF,QAAM,UAAwB,CAAC;AAC/B,QAAM,QAAQ,YAAY,OAAO,MAAM;AACvC,WAAS,MAAM;AACf,WAAS,QAAQ,GAAG,QAAQ,MAAM,SAAS,SAAS,KAAK,SAAS;AAChE,UAAM,aAAa,aAAa,OAAO,QAAQ,GAAG;AAClD,aAAS,WAAW;AACpB,UAAM,aAAa,aAAa,OAAO,QAAQ,GAAG;AAClD,aAAS,WAAW;AACpB,UAAM,OAAO,MAAM,QAAQ;AAC3B,aAAS,yBAAyB,OAAO,QAAQ,KAAK,IAAI;AAC1D,YAAQ,KAAK,EAAE,QAAQ,WAAW,OAAO,MAAM,WAAW,OAAO,MAAM,iBAAiB,IAAI,EAAE,CAAC;AAAA,EACjG;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAmB,QAAgB,KAA2B;AACtF,QAAMA,WAAwB,CAAC;AAC/B,QAAM,QAAQ,YAAY,OAAO,MAAM;AACvC,WAAS,MAAM;AACf,WAAS,QAAQ,GAAG,QAAQ,MAAM,SAAS,SAAS,KAAK,SAAS;AAChE,UAAM,aAAa,aAAa,OAAO,QAAQ,GAAG;AAClD,aAAS,WAAW;AACpB,UAAM,OAAO,MAAM,QAAQ;AAC3B,UAAM,YAAY,YAAY,OAAO,MAAM;AAC3C,aAAS,UAAU;AACnB,IAAAA,SAAQ,KAAK,EAAE,MAAM,WAAW,OAAO,MAAM,iBAAiB,IAAI,GAAG,OAAO,UAAU,MAAM,CAAC;AAAA,EAC/F;AACA,SAAOA;AACT;AAEA,SAAS,yBAAyB,OAAmB,QAAgB,KAAa,MAAsB;AACtG,MAAI,SAAS,GAAM;AACjB,WAAO,YAAY,OAAO,MAAM,EAAE;AAAA,EACpC;AACA,MAAI,SAAS,GAAM;AACjB,UAAM,oBAAoB,SAAS;AACnC,WAAO,eAAe,OAAO,mBAAmB,GAAG;AAAA,EACrD;AACA,MAAI,SAAS,GAAM;AACjB,WAAO,eAAe,OAAO,QAAQ,GAAG;AAAA,EAC1C;AACA,MAAI,SAAS,GAAM;AACjB,WAAO,KAAK,IAAI,KAAK,SAAS,CAAC;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAmB,QAAgB,KAAqB;AAC9E,QAAM,QAAQ,MAAM,QAAQ;AAC5B,WAAS,YAAY,OAAO,MAAM,EAAE;AACpC,OAAK,QAAQ,OAAU,KAAQ,SAAS,KAAK;AAC3C,aAAS,YAAY,OAAO,MAAM,EAAE;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAmB,QAAmD;AACzF,MAAI,SAAS;AACb,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS;AACtC,QAAI,UAAU,MAAM,QAAQ;AAC1B,YAAM,IAAI,MAAM,6CAAe;AAAA,IACjC;AACA,UAAM,OAAO,MAAM,QAAQ;AAC3B,eAAW,OAAO,QAAS;AAC3B,SAAK,OAAO,SAAU,GAAG;AACvB,aAAO,EAAE,OAAO,WAAW,GAAG,OAAO;AAAA,IACvC;AACA,aAAS;AAAA,EACX;AACA,QAAM,IAAI,MAAM,uCAAc;AAChC;AAEA,SAAS,aAAa,OAAmB,QAAgB,KAAgD;AACvG,QAAM,SAAS,YAAY,OAAO,MAAM;AACxC,WAAS,OAAO;AAChB,QAAM,UAAU,SAAS,OAAO;AAChC,MAAI,UAAU,KAAK;AACjB,UAAM,IAAI,MAAM,uEAAqB;AAAA,EACvC;AACA,SAAO,EAAE,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM,MAAM,QAAQ,OAAO,CAAC,GAAG,QAAQ,QAAQ;AAC1F;AAEA,SAAS,gBAAgB,IAAoB;AAC3C,QAAM,QAAgC;AAAA,IACpC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AACA,SAAO,MAAM,EAAE,KAAK,WAAW,EAAE;AACnC;AAEA,SAAS,iBAAiB,MAAsB;AAC9C,QAAM,QAAgC;AAAA,IACpC,GAAM;AAAA,IACN,GAAM;AAAA,IACN,GAAM;AAAA,IACN,GAAM;AAAA,EACR;AACA,SAAO,MAAM,IAAI,KAAK,WAAW,IAAI;AACvC;AAcA,SAAS,uBAAuB,OAAgC;AAC9D,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,qBAAqB,KAAK;AACzC,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,gBAAM,OAAO,YAAY,IAAI,2BAAY,KAAK;AAClE,aAAW,SAAS,gBAAM,GAAG,OAAO,KAAK,MAAM,OAAO,MAAM,IAAI;AAChE,aAAW,SAAS,gBAAM,OAAO,YAAY,cAAI;AACjD,aAAW,SAAS,gBAAM,GAAG,OAAO,SAAS,cAAI,MAAM;AACvD,aAAW,SAAS,4BAAQ,mBAAmB,OAAO,aAAa,EAAE,CAAC;AACtE,UAAQ,OAAO,OAAO;AAEtB,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAoC;AAChE,MAAI,MAAM,SAAS,IAAI;AACrB,WAAO,EAAE,OAAO,OAAO,OAAO,0FAAyB;AAAA,EACzD;AACA,QAAM,YAAY,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC;AACnE,MAAI,cAAc,QAAQ;AACxB,WAAO,EAAE,OAAO,OAAO,WAAW,OAAO,iDAAwB;AAAA,EACnE;AAEA,QAAMD,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,UAAUA,MAAK,UAAU,GAAG,KAAK;AACvC,MAAI,YAAY,KAAK,YAAY,GAAG;AAClC,WAAO,EAAE,OAAO,OAAO,WAAW,SAAS,OAAO,wDAAqB,OAAO,SAAI;AAAA,EACpF;AAEA,QAAM,WAAW,MAAM,MAAM,GAAG,EAAE;AAClC,MAAI,SAAS,KAAK,CAAC,SAAS,SAAS,CAAC,GAAG;AACvC,WAAO,EAAE,OAAO,OAAO,WAAW,SAAS,OAAO,6GAA6B;AAAA,EACjF;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,UAAUA,MAAK,UAAU,IAAI,KAAK;AAAA,IAClC,QAAQA,MAAK,UAAU,IAAI,KAAK;AAAA,IAChC,OAAOA,MAAK,UAAU,IAAI,KAAK;AAAA,IAC/B,OAAOA,MAAK,UAAU,IAAI,KAAK;AAAA,IAC/B,WAAWA,MAAK,UAAU,IAAI,KAAK;AAAA,EACrC;AACF;AAEA,SAAS,mBAAmB,MAAsB;AAChD,QAAM,QAAgC;AAAA,IACpC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,SAAO,MAAM,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,IAAI,MAAM,iBAAO,IAAI;AAC/D;AAsBA,SAAS,oBAAoB,OAAgC;AAC3D,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,kBAAkB,KAAK;AACtC,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,sBAAO,GAAG,OAAO,QAAQ,IAAI;AACjD,aAAW,SAAS,gBAAM,OAAO,aAAa,cAAI;AAClD,aAAW,SAAS,4BAAQ,GAAG,kBAAkB,OAAO,WAAW,CAAC,MAAM,kBAAkB,OAAO,YAAY,CAAC,EAAE;AAClH,aAAW,SAAS,UAAU,OAAO,iBAAiB,cAAI;AAC1D,aAAW,SAAS,gBAAM,eAAe,OAAO,YAAY,CAAC;AAC7D,aAAW,SAAS,gBAAgB,OAAO,eAAe,CAAC;AAC3D,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,kBAAkB,OAAO,MAAM;AAC9C,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ,OAAO,wBAAwB,MAAM,CAAC;AAAA,EAChD,OAAO;AACL,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc;AACpB,YAAQ,OAAO,KAAK;AAAA,EACtB;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAiC;AAC1D,MAAI,MAAM,SAAS,KAAK;AACtB,WAAO,EAAE,OAAO,OAAO,OAAO,+FAAyB;AAAA,EACzD;AACA,QAAM,YAAY,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,GAAG,EAAE,CAAC;AACpE,MAAI,cAAc,qBAAqB;AACrC,WAAO,EAAE,OAAO,OAAO,OAAO,8DAA2B;AAAA,EAC3D;AAEA,QAAMA,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,cAAcA,MAAK,UAAU,IAAI,KAAK;AAC5C,QAAM,WAAW,gBAAgB,IAAI,QAAQ;AAC7C,MAAI,WAAW,OAAO,WAAW,UAAU,WAAY,WAAW,OAAQ,GAAG;AAC3E,WAAO,EAAE,OAAO,OAAO,OAAO,8CAAgB,QAAQ,SAAI;AAAA,EAC5D;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA,cAAc,MAAM,EAAE;AAAA,IACtB,aAAa,MAAM,EAAE;AAAA,IACrB,WAAWA,MAAK,UAAU,IAAI,KAAK;AAAA,IACnC,eAAeA,MAAK,UAAU,IAAI,KAAK;AAAA,IACvC,cAAcA,MAAK,UAAU,IAAI,KAAK;AAAA,IACtC,aAAaA,MAAK,UAAU,IAAI,KAAK;AAAA,EACvC;AACF;AAEA,SAAS,kBAAkB,OAAmB,QAA2C;AACvF,QAAM,WAAW,OAAO,YAAY;AACpC,MAAI,YAAY,KAAK,MAAM,SAAS,KAAK,IAAI,UAAU,GAAG,GAAG;AAC3D,WAAO,CAAC;AAAA,EACV;AACA,QAAM,YAAY;AAClB,QAAM,aAAa;AACnB,MAAI,MAAM,UAAU,MAAM,IAAM;AAC9B,WAAO,CAAC;AAAA,EACV;AACA,QAAMA,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,YAAYA,MAAK,UAAU,aAAa,GAAG,KAAK;AACtD,QAAM,UAA+B,CAAC;AACtC,WAAS,QAAQ,GAAG,QAAQ,KAAK,IAAI,WAAW,EAAE,GAAG,SAAS;AAC5D,UAAM,gBAAgB,aAAa,IAAI,QAAQ;AAC/C,QAAI,gBAAgB,IAAI,MAAM,QAAQ;AACpC;AAAA,IACF;AACA,UAAM,aAAa,YAAYA,MAAK,UAAU,eAAe,KAAK;AAClE,UAAM,QAAQ,sBAAsB,OAAO,YAAY,YAAY,QAAQ;AAC3E,QAAI,OAAO;AACT,cAAQ,KAAK,KAAK;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAmB,QAAgB,SAA2C;AAC3G,MAAI;AACF,QAAI,SAAS;AACb,UAAM,gBAAgB,iBAAiB,OAAO,MAAM;AACpD,aAAS,cAAc;AACvB,UAAM,QAAQ,iBAAiB,OAAO,MAAM;AAC5C,aAAS,MAAM;AACf,UAAM,aAAa,KAAK,IAAI,SAAS,SAAS,OAAO,cAAc,KAAK,CAAC;AACzE,QAAI,aAAa,MAAM,QAAQ;AAC7B,aAAO;AAAA,IACT;AACA,UAAM,SAAS,kBAAkB,OAAO,QAAQ,UAAU;AAC1D,QAAI,OAAO,SAAS,GAAG;AACrB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,MAAM,OAAO,OAAO,CAAC,KAAK,EAAE;AAAA,MAC5B,MAAM,OAAO,OAAO,CAAC,KAAK,EAAE;AAAA,MAC5B,WAAW,OAAO,OAAO,CAAC,KAAK,EAAE;AAAA,MACjC,UAAU,OAAO,OAAO,CAAC,KAAK,CAAC;AAAA,MAC/B,KAAK,OAAO,OAAO,CAAC,KAAK,EAAE;AAAA,IAC7B;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,OAAmB,QAAgB,KAA4C;AACxG,QAAM,aAAa,iBAAiB,OAAO,MAAM;AACjD,MAAI,eAAe,WAAW;AAC9B,QAAM,YAAY,SAAS,OAAO,WAAW,KAAK;AAClD,MAAI,aAAa;AACjB,QAAM,cAAwB,CAAC;AAC/B,SAAO,eAAe,aAAa,eAAe,KAAK;AACrD,UAAM,SAAS,iBAAiB,OAAO,YAAY;AACnD,gBAAY,KAAK,OAAO,KAAK;AAC7B,mBAAe,OAAO;AAAA,EACxB;AACA,SAAO,YAAY,IAAI,CAAC,eAAe;AACrC,UAAM,QAAQ,gBAAgB,OAAO,YAAY,KAAK,UAAU;AAChE,iBAAa,MAAM;AACnB,WAAO,MAAM;AAAA,EACf,CAAC;AACH;AAEA,SAAS,gBACP,OACA,QACA,KACA,YACmD;AACnD,QAAM,OAAO,OAAO,UAAU;AAC9B,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,MAAM,OAAO;AAAA,EAC/B;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,cAAc,OAAO,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE;AAAA,EACtE;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,cAAc,OAAO,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE;AAAA,EACtE;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,cAAc,OAAO,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE;AAAA,EACtE;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,cAAc,OAAO,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE;AAAA,EACtE;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,cAAc,OAAO,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE;AAAA,EACtE;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,cAAc,OAAO,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE;AAAA,EACtE;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,GAAG,OAAO;AAAA,EAC5B;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,GAAG,OAAO;AAAA,EAC5B;AACA,MAAI,QAAQ,IAAI;AACd,UAAM,SAAS,KAAK,OAAO,OAAO,MAAM,CAAC;AACzC,UAAM,WAAW,KAAK,IAAI,KAAK,SAAS,MAAM;AAC9C,QAAI,OAAO,MAAM,GAAG;AAClB,aAAO,EAAE,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM,MAAM,QAAQ,QAAQ,CAAC,GAAG,QAAQ,SAAS,OAAO;AAAA,IACnG;AACA,WAAO,EAAE,OAAO,SAAS,MAAM,OAAO,QAAQ,SAAS,OAAO;AAAA,EAChE;AACA,SAAO,EAAE,OAAO,MAAM,OAAO;AAC/B;AAEA,SAAS,iBAAiB,OAAmB,QAAmD;AAC9F,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS;AACtC,QAAI,UAAU,MAAM,QAAQ;AAC1B,YAAM,IAAI,MAAM,oDAAsB;AAAA,IACxC;AACA,UAAM,OAAO,MAAM,QAAQ;AAC3B,QAAI,UAAU,GAAG;AACf,cAAS,SAAS,KAAM,OAAO,IAAI;AACnC,aAAO,EAAE,OAAO,OAAO;AAAA,IACzB;AACA,YAAS,SAAS,KAAM,OAAO,OAAO,GAAI;AAC1C,SAAK,OAAO,SAAU,GAAG;AACvB,aAAO,EAAE,OAAO,OAAO;AAAA,IACzB;AAAA,EACF;AACA,SAAO,EAAE,OAAO,OAAO;AACzB;AAEA,SAAS,cAAc,OAAmB,QAAgB,QAAwB;AAChF,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,QAAQ,SAAS;AAC3C,YAAS,SAAS,KAAM,OAAO,MAAM,SAAS,KAAK,KAAK,CAAC;AAAA,EAC3D;AACA,QAAM,OAAO,OAAO,SAAS,CAAC;AAC9B,QAAM,UAAU,MAAO,OAAO;AAC9B,OAAK,QAAQ,aAAa,IAAI;AAC5B,aAAS,MAAM;AAAA,EACjB;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,wBAAwB,SAA2C;AAC1E,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc,uBAAa,QAAQ,MAAM;AAC/C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,aAAW,SAAS,CAAC,gBAAM,gBAAM,UAAK,QAAQ,KAAK,GAAG;AACpD,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,cAAc;AACjB,WAAO,OAAO,EAAE;AAAA,EAClB;AACA,QAAM,OAAO,MAAM;AACnB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,aAAW,SAAS,SAAS;AAC3B,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,eAAW,SAAS,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,WAAW,OAAO,MAAM,QAAQ,GAAG,MAAM,GAAG,GAAG;AAChG,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,WAAK,cAAc;AACnB,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,UAAM,OAAO,GAAG;AAAA,EAClB;AACA,QAAM,OAAO,OAAO,KAAK;AACzB,UAAQ,OAAO,OAAO,KAAK;AAC3B,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAwB;AACjD,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AACA,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AACA,SAAO,UAAU,SAAY,iBAAO,OAAO,KAAK;AAClD;AAEA,SAAS,eAAe,OAAwB;AAC9C,QAAM,YAAoC;AAAA,IACxC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,SAAO,UAAU,SAAY,iBAAO,UAAU,KAAK,KAAK,iBAAO,KAAK;AACtE;AAUA,SAAS,qBAAqB,OAAgC;AAC5D,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,aAAa,KAAK;AACjC,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,SAAS,MAAM;AACnC,aAAW,SAAS,UAAU,GAAG,OAAO,YAAY,IAAI;AACxD,aAAW,SAAS,iBAAiB,MAAM,OAAO,gBAAgB,GAAG,SAAS,EAAE,EAAE,YAAY,CAAC,EAAE;AACjG,aAAW,SAAS,sBAAOH,aAAY,OAAO,aAAa,CAAC,CAAC;AAC7D,UAAQ,OAAO,OAAO;AAEtB,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,YAAY;AACjB,OAAK,cAAc;AACnB,UAAQ,OAAO,IAAI;AACnB,SAAO;AACT;AAEA,SAAS,aAAa,OAAmC;AACvD,MAAI,MAAM,SAAS,IAAI;AACrB,WAAO,EAAE,OAAO,OAAO,OAAO,gGAA0B;AAAA,EAC1D;AACA,MAAIE,SAAQ,OAAO,GAAG,CAAC,MAAM,UAAUA,SAAQ,OAAO,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ;AACrF,WAAO,EAAE,OAAO,OAAO,OAAO,sDAAuC;AAAA,EACvE;AACA,QAAMC,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,eAAeA,MAAK,UAAU,MAAM,SAAS,GAAG,IAAI;AAC1D,QAAM,eAAe,MAAM,SAAS,IAAI;AACxC,MAAI,eAAe,GAAG;AACpB,WAAO,EAAE,OAAO,OAAO,OAAO,wEAA2B;AAAA,EAC3D;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,WAAW,KAAK,IAAI,GAAG,eAAe,CAAC;AAAA,EACzC;AACF;AAqBA,SAAS,kBAAkB,OAAgC;AACzD,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,UAAU,KAAK;AAC9B,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,SAAS,UAAU;AACvC,aAAW,SAAS,SAAS,OAAO,SAAS,MAAM;AACnD,aAAW,SAAS,YAAY,OAAO,SAAS,MAAM;AACtD,aAAW,SAAS,eAAe,OAAO,cAAc,cAAI;AAC5D,UAAQ,OAAO,OAAO;AAEtB,MAAI,OAAO,QAAQ;AACjB,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AACnB,UAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,UAAM,cAAc;AACpB,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY;AACjB,eAAW,MAAM,gBAAM,OAAO,OAAO,QAAQ,cAAI;AACjD,eAAW,MAAM,gBAAM,CAAC,OAAO,OAAO,WAAW,OAAO,OAAO,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK,cAAI;AACtG,eAAW,MAAM,gBAAM,OAAO,OAAO,OAAO,MAAM;AAClD,WAAO,OAAO,OAAO,IAAI;AACzB,QAAI,OAAO,OAAO,OAAO,SAAS,GAAG;AACnC,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,iBAAW,SAAS,OAAO,OAAO,OAAO,MAAM,GAAG,EAAE,GAAG;AACrD,cAAM,OAAO,SAAS,cAAc,IAAI;AACxC,aAAK,cAAc;AACnB,aAAK,OAAO,IAAI;AAAA,MAClB;AACA,aAAO,OAAO,IAAI;AAAA,IACpB;AACA,YAAQ,OAAO,MAAM;AAAA,EACvB;AAEA,MAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,YAAQ,OAAO,oBAAoB,YAAY,OAAO,QAAQ,CAAC;AAAA,EACjE;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,OAAgC;AACjD,MAAI,MAAM,SAAS,KAAK,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,GAAM;AACxG,WAAO,EAAE,OAAO,OAAO,OAAO,yDAA0C,UAAU,CAAC,EAAE;AAAA,EACvF;AACA,MAAI,SAAS;AACb,QAAM,WAA2B,CAAC;AAClC,MAAI;AACF,WAAO,MAAM;AACX,YAAM,aAAa,aAAa,OAAO,MAAM;AAC7C,eAAS,WAAW;AACpB,UAAI,QAAQ,WAAW;AACvB,UAAI,UAAU,IAAI;AAChB;AAAA,MACF;AACA,UAAI,QAAQ,IAAI;AACd,gBAAQ,CAAC;AACT,cAAM,YAAY,aAAa,OAAO,MAAM;AAC5C,iBAAS,UAAU;AAAA,MACrB;AACA,eAAS,QAAQ,GAAG,QAAQ,OAAO,KAAK,GAAG,SAAS;AAClD,cAAM,MAAM,cAAc,OAAO,MAAM;AACvC,iBAAS,IAAI;AACb,cAAM,QAAQ,cAAc,OAAO,MAAM;AACzC,iBAAS,MAAM;AACf,iBAAS,KAAK;AAAA,UACZ,KAAK,IAAI,YAAY,EAAE,OAAO,IAAI,KAAK;AAAA,UACvC,OAAO,wBAAwB,IAAI,OAAO,MAAM,KAAK;AAAA,QACvD,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,SAAS,KAAK,MAAM,QAAQ;AAC9B,YAAM,IAAI,MAAM,qCAAsB;AAAA,IACxC;AACA,UAAM,aAAa,MAAM,KAAK,MAAM,MAAM,QAAQ,SAAS,EAAE,CAAC,EAC3D,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAChD,KAAK,EAAE;AACV,UAAM,aAAa,SAAS,KAAK,CAAC,SAAS,KAAK,QAAQ,aAAa,GAAG;AACxE,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,OAAO,SAAS,KAAK,CAAC,SAAS,KAAK,QAAQ,YAAY,GAAG;AAAA,MAC3D;AAAA,MACA,QAAQ,aAAa,oBAAoB,UAAU,IAAI;AAAA,IACzD;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,aAAa,OAAmB,QAAmD;AAC1F,MAAI,SAAS;AACb,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,IAAI,SAAS;AACvC,QAAI,UAAU,MAAM,QAAQ;AAC1B,YAAM,IAAI,MAAM,gDAAkB;AAAA,IACpC;AACA,UAAM,OAAO,MAAM,QAAQ;AAC3B,cAAU,OAAO,OAAO,GAAI,KAAK;AACjC,SAAK,OAAO,SAAU,GAAG;AACvB,YAAM,QAAS,UAAU,KAAM,EAAE,SAAS;AAC1C,aAAO,EAAE,OAAO,OAAO;AAAA,IACzB;AACA,aAAS;AAAA,EACX;AACA,QAAM,IAAI,MAAM,0CAAiB;AACnC;AAEA,SAAS,cAAc,OAAmB,QAAuD;AAC/F,QAAM,SAAS,aAAa,OAAO,MAAM;AACzC,WAAS,OAAO;AAChB,MAAI,OAAO,QAAQ,IAAI;AACrB,UAAM,IAAI,MAAM,2CAAkB;AAAA,EACpC;AACA,QAAM,OAAO,OAAO,OAAO,KAAK;AAChC,QAAM,MAAM,SAAS;AACrB,MAAI,MAAM,MAAM,QAAQ;AACtB,UAAM,IAAI,MAAM,uDAAoB;AAAA,EACtC;AACA,SAAO,EAAE,OAAO,MAAM,MAAM,QAAQ,GAAG,GAAG,QAAQ,IAAI;AACxD;AAEA,SAAS,wBAAwB,UAAsB,YAAgC;AACrF,QAAM,MAAM,IAAI,YAAY,EAAE,OAAO,QAAQ;AAC7C,MAAI,QAAQ,iBAAiB,QAAQ,gBAAgB,kBAAkB,KAAK,GAAG,GAAG;AAChF,WAAO,IAAI,YAAY,EAAE,OAAO,UAAU;AAAA,EAC5C;AACA,SAAO,IAAI,WAAW,MAAM;AAC9B;AAEA,SAAS,oBAAoB,YAA2C;AACtE,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,UAAU;AAMpC,WAAO;AAAA,MACL,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,MACtD,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,MACtD,WAAW,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AAAA,MACrE,QAAQ,MAAM,QAAQ,OAAO,MAAM,IAC/B,OAAO,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM,QAAQ,OAAO,KAAK,eAAe,MAAM,IAAI,CAAC,EAAE,IACtF,CAAC;AAAA,IACP;AAAA,EACF,QAAQ;AACN,WAAO,EAAE,QAAQ,CAAC,EAAE;AAAA,EACtB;AACF;AAEA,SAAS,eAAe,MAAuB;AAC7C,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,IAAI,cAAc,EAAE,KAAK,KAAK;AAAA,EAC5C;AACA,MAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,UAAM,QAAQ;AACd,QAAI,OAAO,MAAM,SAAS,UAAU;AAClC,aAAO,MAAM;AAAA,IACf;AACA,QAAI,MAAM,SAAS,SAAS;AAC1B,aAAO,SAAS,eAAe,MAAM,KAAK,CAAC;AAAA,IAC7C;AACA,QAAI,MAAM,SAAS,OAAO;AACxB,aAAO,OAAO,eAAe,MAAM,MAAM,CAAC;AAAA,IAC5C;AACA,WAAO,eAAe,MAAM,IAAI;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,WAAmB,MAAmC;AACjF,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,aAAW,OAAO,KAAK,MAAM,GAAG,EAAE,GAAG;AACnC,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,QAAI,cAAc,IAAI;AACtB,UAAM,QAAQ,SAAS,cAAc,IAAI;AACzC,UAAM,cAAc,IAAI;AACxB,OAAG,OAAO,KAAK,KAAK;AACpB,UAAM,OAAO,EAAE;AAAA,EACjB;AACA,QAAM,OAAO,KAAK;AAClB,UAAQ,OAAO,OAAO,KAAK;AAC3B,SAAO;AACT;AAwBA,SAAS,wBAAwB,OAAgC;AAC/D,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,gBAAgB,KAAK;AACpC,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,gBAAM,OAAO,SAAS,iBAAiB,WAAW;AACtE,aAAW,SAAS,sBAAO,OAAO,OAAO,oBAAK;AAC9C,aAAW,SAAS,QAAQ,OAAO,YAAY,cAAI;AACnD,aAAW,SAAS,gBAAM,OAAO,YAAY,oBAAK;AAClD,aAAW,SAAS,kCAAS,OAAO,cAAc,SAAYH,aAAY,OAAO,SAAS,IAAI,cAAI;AAClG,aAAW,SAAS,sBAAO,OAAO,OAAO,gBAAgB,CAAC,CAAC;AAC3D,aAAW,SAAS,sBAAO,OAAO,OAAO,oBAAoB,CAAC,CAAC;AAC/D,UAAQ,OAAO,OAAO;AAEtB,MAAI,OAAO,QAAQ;AACjB,UAAM,OAAO,SAAS,cAAc,GAAG;AACvC,SAAK,YAAY;AACjB,SAAK,cAAc;AACnB,YAAQ,OAAO,IAAI;AAAA,EACrB;AAEA,MAAI,OAAO,SAAS;AAClB,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AACpB,YAAQ,cAAc,OAAO;AAC7B,YAAQ,OAAO,OAAO;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAsC;AAC7D,MAAI,MAAM,UAAU,KAAKE,SAAQ,OAAO,GAAG,CAAC,MAAM,YAAY;AAC5D,WAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,EACrC;AAEA,QAAM,OAAO,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,OAAO,IAAI,CAAC,CAAC;AAClH,MAAI,CAAC,eAAe,KAAK,IAAI,KAAK,CAAC,KAAK,SAAS,iBAAiB,GAAG;AACnE,WAAO,EAAE,OAAO,OAAO,OAAO,mEAAqC;AAAA,EACrE;AACA,MAAI,OAAO,cAAc,aAAa;AACpC,WAAO,EAAE,OAAO,OAAO,OAAO,oGAAwC;AAAA,EACxE;AAEA,QAAM,cAAc,IAAI,UAAU,EAAE,gBAAgB,MAAM,iBAAiB;AAC3E,MAAI,YAAY,cAAc,aAAa,GAAG;AAC5C,WAAO,EAAE,OAAO,OAAO,OAAO,2CAAkB;AAAA,EAClD;AACA,QAAM,WAAW,MAAM,KAAK,YAAY,gBAAgB,QAAQ,EAAE,KAAK,CAAC,UAAU,MAAM,YAAY,MAAM;AAC1G,MAAI,CAAC,UAAU;AACb,WAAO,EAAE,OAAO,OAAO,OAAO,0CAAsB;AAAA,EACtD;AAEA,QAAM,QAAQ,kBAAkB,QAAQ;AACxC,MAAI,CAAC,YAAY,KAAK,GAAG;AACvB,WAAO,EAAE,OAAO,OAAO,OAAO,sDAAwB;AAAA,EACxD;AACA,QAAM,eAAe,MAAM;AAC3B,MAAI,CAAC,YAAY,YAAY,GAAG;AAC9B,WAAO,EAAE,OAAO,OAAO,OAAO,qDAAsC;AAAA,EACtE;AAEA,QAAM,eAAe,aAAa;AAClC,QAAM,WAAW,YAAY,aAAa,mBAAmB;AAC7D,QAAM,YAAY,wBAAwB,aAAa,aAAa,SAAS;AAC7E,SAAO;AAAA,IACL,OAAO;AAAA,IACP,KAAK,YAAY,aAAa,cAAc;AAAA,IAC5C;AAAA,IACA,UAAU,YAAY,aAAa,2BAA2B;AAAA,IAC9D;AAAA,IACA,cAAc,MAAM,QAAQ,MAAM,eAAe,IAAI,MAAM,gBAAgB,SAAS;AAAA,IACpF,kBAAkB,MAAM,QAAQ,MAAM,mBAAmB,IAAI,MAAM,oBAAoB,SAAS;AAAA,IAChG,SAAS,wBAAwB,cAAc,QAAQ;AAAA,EACzD;AACF;AAEA,SAAS,kBAAkB,SAA8B;AACvD,UAAQ,QAAQ,SAAS;AAAA,IACvB,KAAK,QAAQ;AACX,YAAM,SAAqC,CAAC;AAC5C,YAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ;AAC5C,eAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS;AACpD,cAAM,MAAM,SAAS,KAAK;AAC1B,YAAI,IAAI,YAAY,OAAO;AACzB;AAAA,QACF;AACA,cAAM,QAAQ,SAAS,QAAQ,CAAC;AAChC,YAAI,OAAO;AACT,iBAAO,IAAI,eAAe,EAAE,IAAI,kBAAkB,KAAK;AACvD;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AACH,aAAO,MAAM,KAAK,QAAQ,QAAQ,EAAE,IAAI,iBAAiB;AAAA,IAC3D,KAAK;AACH,aAAO,iBAAiB,QAAQ,eAAe,EAAE;AAAA,IACnD,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,QAAQ,eAAe,CAAC;AAAA,IACxC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACE,aAAO,QAAQ,eAAe;AAAA,EAClC;AACF;AAEA,SAAS,iBAAiB,OAA2B;AACnD,QAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE;AAC3C,MAAI,CAAC,YAAY;AACf,WAAO,IAAI,WAAW;AAAA,EACxB;AACA,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAC1C,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS;AAClD,UAAM,KAAK,IAAI,OAAO,WAAW,KAAK;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAA+B,UAAuC;AACrG,MAAI,EAAE,iBAAiB,eAAe,MAAM,WAAW,GAAG;AACxD,WAAO;AAAA,EACT;AACA,MAAI,CAAC,YAAY,CAAC,gEAAgE,KAAK,QAAQ,GAAG;AAChG,WAAO;AAAA,EACT;AACA,QAAM,OAAO,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC,EAAE,OAAO,KAAK;AACpE,SAAO,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;AACvD;AAEA,SAAS,YAAY,OAAuE;AAC1F,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,KAAK,EAAE,iBAAiB;AACpG;AAEA,SAAS,YAAY,OAAmD;AACtE,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAASA,SAAQ,OAAmB,QAAgB,QAAwB;AAC1E,MAAI,SAAS,KAAK,SAAS,SAAS,MAAM,QAAQ;AAChD,WAAO;AAAA,EACT;AACA,SAAO,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,QAAQ,SAAS,MAAM,CAAC;AAC7E;AAcA,SAAS,wBAAwB,OAAgC;AAC/D,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,gBAAgB,KAAK;AACpC,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,gBAAM,OAAO,UAAU,YAAY;AACvD,aAAW,SAAS,SAAS,OAAO,SAAS,oBAAK;AAClD,aAAW,SAAS,WAAW,OAAO,WAAW,oBAAK;AACtD,aAAW,SAAS,SAAS,OAAO,SAAS,cAAI;AACjD,aAAW,SAAS,eAAe,OAAO,eAAe,oBAAK;AAC9D,aAAW,SAAS,WAAW,OAAO,gBAAgB,oBAAK;AAC3D,MAAI,OAAO,cAAc;AACvB,eAAW,SAAS,QAAQ,OAAO,YAAY;AAAA,EACjD;AACA,UAAQ,OAAO,OAAO;AACtB,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAsC;AAC7D,QAAM,OAAO,IAAI,YAAY,QAAQ,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,IAAI,CAAC,CAAC;AAC1F,QAAM,YAAY,KAAK,MAAM,SAAS,CAAC,EAAE,CAAC,KAAK;AAC/C,QAAM,kBAAkB,UAAU,WAAW,OAAO;AACpD,QAAM,eAAe,UAAU,WAAW,IAAI;AAC9C,MAAI,CAAC,mBAAmB,CAAC,cAAc;AACrC,WAAO,EAAE,OAAO,OAAO,OAAO,iFAA8C;AAAA,EAC9E;AAEA,QAAM,cAAc,SAAS,MAAM,aAAa,KAAK,SAAS,MAAM,kBAAkB;AACtF,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ,kBAAkB,+BAA+B,UAAU,QAAQ,MAAM,EAAE,CAAC,MAAM,UAAU,QAAQ,OAAO,aAAa;AAAA,IAChI,OAAO,SAAS,MAAM,OAAO;AAAA,IAC7B,SAAS,SAAS,MAAM,SAAS,KAAK,SAAS,MAAM,KAAK;AAAA,IAC1D,cAAc,SAAS,MAAM,cAAc;AAAA,IAC3C,OAAO,SAAS,MAAM,OAAO;AAAA,IAC7B,aAAa,qBAAqB,WAAW;AAAA,IAC7C,cAAc,SAAS,MAAM,cAAc;AAAA,EAC7C;AACF;AAEA,SAAS,SAAS,MAAc,KAAiC;AAC/D,QAAM,UAAU,IAAI,QAAQ,uBAAuB,MAAM;AACzD,QAAM,QAAQ,KAAK,MAAM,IAAI,OAAO,MAAM,OAAO,cAAc,IAAI,CAAC;AACpE,SAAO,QAAQ,CAAC,GAAG,KAAK;AAC1B;AAEA,SAAS,qBAAqB,OAAoC;AAChE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,MAAM,KAAK,EAAE,MAAM,KAAK,EAAE,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAClE,MAAI,MAAM,SAAS,KAAK,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,SAAS,IAAI,CAAC,GAAG;AACpE,WAAO;AAAA,EACT;AACA,QAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI;AACzB,SAAO,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,KAAK,EAAE,CAAC,MAAM,KAAK,IAAI,GAAG,KAAK,EAAE,CAAC;AACtF;AAEA,SAAS,iBAAiB,OAAuC;AAC/D,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,MAAI,cAAcG,YAAW,KAAK;AAClC,SAAO;AACT;AAEA,SAASL,aAAY,OAAuB;AAC1C,MAAI,QAAQ,MAAM;AAChB,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,MAAI,QAAQ,OAAO,MAAM;AACvB,WAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAAA,EACrC;AACA,SAAO,IAAI,QAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC;AAC5C;AAEA,SAASC,eAAc,OAA2B;AAChD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,iBAAiB,GAAG;AACtH,QAAM,MAAM,MAAM,KAAK,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,EAC7D,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,EAC9D,KAAK,GAAG;AACX,SAAO,GAAG,KAAK,KAAK,GAAG;AACzB;AAEA,SAASI,YAAW,OAA2B;AAC7C,QAAM,OAAiB,CAAC;AACxB,QAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,GAAG;AACxC,WAAS,SAAS,GAAG,SAAS,OAAO,UAAU,IAAI;AACjD,UAAM,QAAQ,MAAM,MAAM,QAAQ,SAAS,EAAE;AAC7C,UAAM,MAAM,MAAM,KAAK,KAAK,EACzB,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,EAC9D,KAAK,GAAG,EACR,OAAO,IAAI,GAAG;AACjB,UAAM,QAAQ,MAAM,KAAK,KAAK,EAC3B,IAAI,CAAC,SAAU,QAAQ,MAAM,QAAQ,MAAM,OAAO,aAAa,IAAI,IAAI,GAAI,EAC3E,KAAK,EAAE;AACV,SAAK,KAAK,GAAG,OAAO,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,KAAK,GAAG,KAAK,KAAK,EAAE;AAAA,EACrF;AACA,MAAI,MAAM,SAAS,OAAO;AACxB,SAAK,KAAK,gCAAY,KAAK,6BAAS,MAAM,MAAM,eAAK;AAAA,EACvD;AACA,SAAO,KAAK,KAAK,IAAI;AACvB;","names":["name","extension","view","asciiAt","readUint32Be","timescale","duration","readUint32Le","appendMediaInfo","asciiAt","readUint32Le","readUint16Le","formatDuration","readUint32Be","view","PrismModule","Prism","DOMPurify","normalizeFileName","JSZip","appendMeta","DOMPurify","import_jszip","JSZip","appendMeta","getXmlAttribute","countMatches","import_jszip","import_dompurify","JSZip","getXmlAttribute","countMatches","decodeXml","DOMPurify","import_jszip","JSZip","finiteNumber","mimeTypeFromPath","import_jszip","JSZip","pako","formatBytes","view","readUint64Le","import_dompurify","DOMPurify","document","import_pako","finiteNumber","pako","appendMeta","formatBytes","byteSignature","height","geometry","material","JSZip","formatBytes","byteSignature","asciiAt","view","exports","hexPreview"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/detect.ts","../src/dom.ts","../src/plugins/fallback.ts","../src/viewer.ts","../src/plugins/image.ts","../src/plugins/video.ts","../src/plugins/audio.ts","../src/plugins/text.ts","../src/plugins/pdf.ts","../src/plugins/epub.ts","../src/plugins/utils.ts","../src/plugins/xps.ts","../src/plugins/office.ts","../src/plugins/ofd.ts","../src/plugins/archive.ts","../src/plugins/email.ts","../src/plugins/drawing.ts","../src/plugins/cad.ts","../src/plugins/model3d.ts","../src/plugins/gis.ts","../src/plugins/asset.ts"],"sourcesContent":["export { createViewer } from \"./viewer\";\nexport { imagePlugin } from \"./plugins/image\";\nexport { videoPlugin } from \"./plugins/video\";\nexport { audioPlugin } from \"./plugins/audio\";\nexport { textPlugin } from \"./plugins/text\";\nexport { pdfPlugin } from \"./plugins/pdf\";\nexport { epubPlugin } from \"./plugins/epub\";\nexport { xpsPlugin } from \"./plugins/xps\";\nexport { officePlugin } from \"./plugins/office\";\nexport { ofdPlugin } from \"./plugins/ofd\";\nexport { archivePlugin } from \"./plugins/archive\";\nexport { emailPlugin } from \"./plugins/email\";\nexport { drawingPlugin } from \"./plugins/drawing\";\nexport { cadPlugin } from \"./plugins/cad\";\nexport { model3dPlugin } from \"./plugins/model3d\";\nexport { gisPlugin } from \"./plugins/gis\";\nexport { assetPlugin } from \"./plugins/asset\";\nexport { fallbackPlugin } from \"./plugins/fallback\";\nexport type {\n FileViewer,\n PreviewCommand,\n PreviewContext,\n PreviewFallback,\n PreviewFile,\n PreviewFit,\n PreviewInstance,\n PreviewItem,\n PreviewOptions,\n PreviewPlugin,\n PreviewSize,\n PreviewSource,\n PreviewTheme,\n PreviewToolbarActionId,\n PreviewToolbarBuiltInAction,\n PreviewToolbarCustomAction,\n PreviewToolbarOptions,\n PreviewToolbarRenderContext\n} from \"./types\";\n","import type { PreviewFile, PreviewSource } from \"./types\";\n\nconst extensionMimeMap: Record<string, string> = {\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n jfif: \"image/jpeg\",\n pjpe: \"image/pjpeg\",\n pjpeg: \"image/pjpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n jxl: \"image/jxl\",\n svg: \"image/svg+xml\",\n bmp: \"image/bmp\",\n ico: \"image/x-icon\",\n cur: \"image/x-icon\",\n tif: \"image/tiff\",\n tiff: \"image/tiff\",\n apng: \"image/apng\",\n heic: \"image/heic\",\n heif: \"image/heif\",\n mp4: \"video/mp4\",\n mpg: \"video/mpeg\",\n mpeg: \"video/mpeg\",\n mpe: \"video/mpeg\",\n mpv: \"video/mpv\",\n webm: \"video/webm\",\n ogg: \"audio/ogg\",\n ogv: \"video/ogg\",\n mov: \"video/quicktime\",\n m4v: \"video/x-m4v\",\n avi: \"video/x-msvideo\",\n mkv: \"video/x-matroska\",\n flv: \"video/x-flv\",\n wmv: \"video/x-ms-wmv\",\n \"3gp\": \"video/3gpp\",\n \"3g2\": \"video/3gpp2\",\n m2ts: \"video/mp2t\",\n m3u8: \"application/vnd.apple.mpegurl\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n aif: \"audio/aiff\",\n aiff: \"audio/aiff\",\n aifc: \"audio/aiff\",\n aac: \"audio/aac\",\n m4a: \"audio/mp4\",\n flac: \"audio/flac\",\n opus: \"audio/opus\",\n oga: \"audio/ogg\",\n weba: \"audio/webm\",\n amr: \"audio/amr\",\n mid: \"audio/midi\",\n midi: \"audio/midi\",\n caf: \"audio/x-caf\",\n au: \"audio/basic\",\n snd: \"audio/basic\",\n wma: \"audio/x-ms-wma\",\n pdf: \"application/pdf\",\n epub: \"application/epub+zip\",\n xps: \"application/vnd.ms-xpsdocument\",\n oxps: \"application/oxps\",\n txt: \"text/plain\",\n log: \"text/plain\",\n env: \"text/plain\",\n gitignore: \"text/plain\",\n dockerignore: \"text/plain\",\n npmrc: \"text/plain\",\n yarnrc: \"text/plain\",\n pnpmrc: \"text/plain\",\n editorconfig: \"text/plain\",\n browserslistrc: \"text/plain\",\n prettierrc: \"application/json\",\n eslintrc: \"application/json\",\n stylelintrc: \"application/json\",\n conf: \"text/plain\",\n config: \"text/plain\",\n properties: \"text/plain\",\n lock: \"text/plain\",\n json: \"application/json\",\n jsonc: \"application/json\",\n json5: \"application/json5\",\n ipynb: \"application/x-ipynb+json\",\n jsonl: \"application/x-ndjson\",\n ndjson: \"application/x-ndjson\",\n xml: \"application/xml\",\n yaml: \"text/yaml\",\n yml: \"text/yaml\",\n csv: \"text/csv\",\n tsv: \"text/tab-separated-values\",\n md: \"text/markdown\",\n markdown: \"text/markdown\",\n toml: \"application/toml\",\n ini: \"text/plain\",\n proto: \"text/x-protobuf\",\n tf: \"text/x-hcl\",\n tfvars: \"text/x-hcl\",\n hcl: \"text/x-hcl\",\n tex: \"application/x-tex\",\n latex: \"application/x-tex\",\n bib: \"text/x-bibtex\",\n gv: \"text/vnd.graphviz\",\n http: \"message/http\",\n css: \"text/css\",\n scss: \"text/css\",\n less: \"text/css\",\n js: \"text/javascript\",\n mjs: \"text/javascript\",\n cjs: \"text/javascript\",\n ts: \"text/typescript\",\n tsx: \"text/typescript\",\n jsx: \"text/javascript\",\n htm: \"text/html\",\n html: \"text/html\",\n vue: \"text/plain\",\n py: \"text/x-python\",\n java: \"text/x-java-source\",\n go: \"text/x-go\",\n rs: \"text/rust\",\n rb: \"text/x-ruby\",\n swift: \"text/x-swift\",\n kt: \"text/x-kotlin\",\n kts: \"text/x-kotlin\",\n scala: \"text/x-scala\",\n lua: \"text/x-lua\",\n r: \"text/x-r\",\n dart: \"text/x-dart\",\n svelte: \"text/plain\",\n astro: \"text/plain\",\n elm: \"text/x-elm\",\n ex: \"text/x-elixir\",\n exs: \"text/x-elixir\",\n clj: \"text/x-clojure\",\n cljs: \"text/x-clojure\",\n erl: \"text/x-erlang\",\n hrl: \"text/x-erlang\",\n fs: \"text/x-fsharp\",\n fsx: \"text/x-fsharp\",\n hs: \"text/x-haskell\",\n lhs: \"text/x-haskell\",\n php: \"application/x-httpd-php\",\n c: \"text/x-c\",\n cpp: \"text/x-c++src\",\n h: \"text/x-c\",\n hpp: \"text/x-c++hdr\",\n cs: \"text/x-csharp\",\n sql: \"application/sql\",\n sh: \"application/x-sh\",\n bash: \"application/x-sh\",\n zsh: \"application/x-sh\",\n fish: \"application/x-sh\",\n ps1: \"text/plain\",\n bat: \"text/plain\",\n cmd: \"text/plain\",\n dockerfile: \"text/plain\",\n nginxconf: \"text/plain\",\n gradle: \"text/plain\",\n graphql: \"application/graphql\",\n gql: \"application/graphql\",\n pem: \"application/x-pem-file\",\n crt: \"application/x-x509-ca-cert\",\n cer: \"application/pkix-cert\",\n ics: \"text/calendar\",\n vcf: \"text/vcard\",\n diff: \"text/x-diff\",\n patch: \"text/x-diff\",\n geojson: \"application/geo+json\",\n topojson: \"application/topo+json\",\n kml: \"application/vnd.google-earth.kml+xml\",\n kmz: \"application/vnd.google-earth.kmz\",\n gpx: \"application/gpx+xml\",\n shp: \"application/octet-stream\",\n drawio: \"application/vnd.jgraph.mxfile\",\n dio: \"application/vnd.jgraph.mxfile\",\n excalidraw: \"application/vnd.excalidraw+json\",\n tldraw: \"application/json\",\n zip: \"application/zip\",\n rar: \"application/vnd.rar\",\n \"7z\": \"application/x-7z-compressed\",\n tar: \"application/x-tar\",\n gz: \"application/gzip\",\n tgz: \"application/gzip\",\n bz2: \"application/x-bzip2\",\n xz: \"application/x-xz\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n docm: \"application/vnd.ms-word.document.macroenabled.12\",\n dotx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\",\n dotm: \"application/vnd.ms-word.template.macroenabled.12\",\n dot: \"application/msword\",\n doc: \"application/msword\",\n rtf: \"application/rtf\",\n odt: \"application/vnd.oasis.opendocument.text\",\n fodt: \"application/vnd.oasis.opendocument.text-flat-xml\",\n wps: \"application/vnd.ms-works\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n xltx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\",\n xls: \"application/vnd.ms-excel\",\n xlsm: \"application/vnd.ms-excel.sheet.macroenabled.12\",\n xltm: \"application/vnd.ms-excel.template.macroenabled.12\",\n xlsb: \"application/vnd.ms-excel.sheet.binary.macroenabled.12\",\n ods: \"application/vnd.oasis.opendocument.spreadsheet\",\n fods: \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\",\n numbers: \"application/vnd.apple.numbers\",\n et: \"application/vnd.ms-excel\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n pptm: \"application/vnd.ms-powerpoint.presentation.macroenabled.12\",\n ppsx: \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\",\n ppsm: \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\",\n potx: \"application/vnd.openxmlformats-officedocument.presentationml.template\",\n potm: \"application/vnd.ms-powerpoint.template.macroenabled.12\",\n ppt: \"application/vnd.ms-powerpoint\",\n pps: \"application/vnd.ms-powerpoint\",\n odp: \"application/vnd.oasis.opendocument.presentation\",\n fodp: \"application/vnd.oasis.opendocument.presentation-flat-xml\",\n key: \"application/vnd.apple.keynote\",\n dps: \"application/vnd.ms-powerpoint\",\n eml: \"message/rfc822\",\n msg: \"application/vnd.ms-outlook\",\n mbox: \"application/mbox\",\n ofd: \"application/ofd\",\n gltf: \"model/gltf+json\",\n glb: \"model/gltf-binary\",\n stl: \"model/stl\",\n obj: \"model/obj\",\n \"3ds\": \"model/3ds\",\n fbx: \"application/vnd.autodesk.fbx\",\n dae: \"model/vnd.collada+xml\",\n ply: \"application/ply\",\n \"3mf\": \"model/3mf\",\n usdz: \"model/vnd.usdz+zip\",\n usdc: \"model/vnd.usd\",\n usda: \"model/vnd.usd\",\n usd: \"model/vnd.usd\",\n wrl: \"model/vrml\",\n vrml: \"model/vrml\",\n dxf: \"image/vnd.dxf\",\n dwg: \"application/acad\",\n dwf: \"model/vnd.dwf\",\n step: \"model/step\",\n stp: \"model/step\",\n iges: \"application/iges\",\n igs: \"application/iges\",\n ifc: \"application/x-step\",\n sat: \"application/sat\",\n sab: \"application/sab\",\n \"x_t\": \"application/x-parasolid\",\n \"x_b\": \"application/x-parasolid\",\n \"3dm\": \"model/vnd.3dm\",\n skp: \"application/vnd.sketchup.skp\",\n sldprt: \"application/sldworks\",\n sldasm: \"application/sldworks\",\n ttf: \"font/ttf\",\n otf: \"font/otf\",\n woff: \"font/woff\",\n woff2: \"font/woff2\",\n eot: \"application/vnd.ms-fontobject\",\n psd: \"image/vnd.adobe.photoshop\",\n psb: \"image/vnd.adobe.photoshop\",\n ai: \"application/postscript\",\n eps: \"application/postscript\",\n ps: \"application/postscript\",\n webarchive: \"application/x-webarchive\",\n sqlite: \"application/vnd.sqlite3\",\n sqlite3: \"application/vnd.sqlite3\",\n db: \"application/vnd.sqlite3\",\n wasm: \"application/wasm\",\n parquet: \"application/vnd.apache.parquet\",\n avro: \"application/avro\"\n};\n\nexport async function normalizeFile(\n source: PreviewSource,\n fileName?: string,\n mimeType?: string\n): Promise<PreviewFile> {\n if (typeof source === \"string\") {\n const name = fileName || source.split(\"?\")[0]?.split(\"/\").pop() || \"remote-file\";\n const extension = getExtension(name);\n return {\n source,\n name,\n extension,\n mimeType: mimeType || extensionMimeMap[extension] || \"\",\n url: source\n };\n }\n\n if (source instanceof File) {\n const extension = getExtension(fileName || source.name);\n return {\n source,\n name: fileName || source.name,\n extension,\n mimeType: mimeType || source.type || extensionMimeMap[extension] || \"\",\n size: source.size,\n blob: source\n };\n }\n\n if (source instanceof Blob) {\n const name = fileName || \"blob\";\n const extension = getExtension(name);\n return {\n source,\n name,\n extension,\n mimeType: mimeType || source.type || extensionMimeMap[extension] || \"\",\n size: source.size,\n blob: source\n };\n }\n\n const name = fileName || \"buffer\";\n const extension = getExtension(name);\n const blob = new Blob([source], { type: mimeType || extensionMimeMap[extension] || \"\" });\n return {\n source,\n name,\n extension,\n mimeType: blob.type,\n size: blob.size,\n blob\n };\n}\n\nexport function getExtension(name: string): string {\n const clean = name.split(\"?\")[0]?.split(\"#\")[0] || \"\";\n const index = clean.lastIndexOf(\".\");\n return index >= 0 ? clean.slice(index + 1).toLowerCase() : \"\";\n}\n\nexport function isTextLike(file: PreviewFile): boolean {\n const textFileName = normalizeFileName(file.name);\n const textFileStem = textFileName.split(\".\")[0];\n return (\n file.mimeType.startsWith(\"text/\") ||\n [\n \"application/json\",\n \"application/json5\",\n \"application/x-ipynb+json\",\n \"application/xml\",\n \"application/yaml\",\n \"application/x-yaml\",\n \"application/sql\",\n \"application/x-sh\",\n \"application/x-httpd-php\",\n \"application/javascript\",\n \"application/x-javascript\",\n \"application/typescript\",\n \"application/x-typescript\",\n \"application/toml\",\n \"application/x-toml\",\n \"application/x-ndjson\",\n \"application/graphql\",\n \"application/x-pem-file\",\n \"application/x-x509-ca-cert\",\n \"application/pkix-cert\",\n \"application/x-tex\",\n \"message/http\",\n \"text/calendar\",\n \"text/vcard\",\n \"text/x-bibtex\",\n \"text/x-hcl\",\n \"text/x-protobuf\",\n \"text/vnd.graphviz\"\n ].includes(file.mimeType) ||\n [\n \"txt\",\n \"json\",\n \"jsonc\",\n \"json5\",\n \"ipynb\",\n \"jsonl\",\n \"ndjson\",\n \"xml\",\n \"yaml\",\n \"yml\",\n \"csv\",\n \"log\",\n \"env\",\n \"gitignore\",\n \"dockerignore\",\n \"npmrc\",\n \"yarnrc\",\n \"pnpmrc\",\n \"editorconfig\",\n \"browserslistrc\",\n \"prettierrc\",\n \"eslintrc\",\n \"stylelintrc\",\n \"conf\",\n \"config\",\n \"properties\",\n \"lock\",\n \"md\",\n \"markdown\",\n \"js\",\n \"mjs\",\n \"cjs\",\n \"ts\",\n \"tsx\",\n \"jsx\",\n \"vue\",\n \"css\",\n \"scss\",\n \"less\",\n \"html\",\n \"htm\",\n \"toml\",\n \"ini\",\n \"proto\",\n \"tf\",\n \"tfvars\",\n \"hcl\",\n \"tex\",\n \"latex\",\n \"bib\",\n \"gv\",\n \"http\",\n \"java\",\n \"py\",\n \"go\",\n \"rs\",\n \"rb\",\n \"swift\",\n \"kt\",\n \"kts\",\n \"scala\",\n \"lua\",\n \"r\",\n \"dart\",\n \"svelte\",\n \"astro\",\n \"elm\",\n \"ex\",\n \"exs\",\n \"clj\",\n \"cljs\",\n \"erl\",\n \"hrl\",\n \"fs\",\n \"fsx\",\n \"hs\",\n \"lhs\",\n \"php\",\n \"c\",\n \"cpp\",\n \"h\",\n \"hpp\",\n \"cs\",\n \"sql\",\n \"sh\",\n \"bash\",\n \"zsh\",\n \"fish\",\n \"ps1\",\n \"bat\",\n \"cmd\",\n \"dockerfile\",\n \"nginxconf\",\n \"gradle\",\n \"graphql\",\n \"gql\",\n \"pem\",\n \"crt\",\n \"cer\",\n \"ics\",\n \"vcf\",\n \"diff\",\n \"patch\"\n ].includes(file.extension) ||\n [\n \"dockerfile\",\n \"makefile\",\n \"rakefile\",\n \"gemfile\",\n \"procfile\",\n \"jenkinsfile\",\n \"vagrantfile\",\n \"brewfile\",\n \"podfile\",\n \"go.mod\",\n \"go.sum\",\n \"cargo.toml\",\n \"cargo.lock\",\n \".gitignore\",\n \".dockerignore\",\n \".npmrc\",\n \".yarnrc\",\n \".pnpmrc\",\n \".editorconfig\",\n \".browserslistrc\",\n \".prettierrc\",\n \".eslintrc\",\n \".stylelintrc\"\n ].includes(textFileName) ||\n [\n \"readme\",\n \"changelog\",\n \"changes\",\n \"history\",\n \"license\",\n \"licence\",\n \"copying\",\n \"notice\",\n \"authors\",\n \"contributors\",\n \"codeowners\"\n ].includes(textFileStem)\n );\n}\n\nfunction normalizeFileName(name: string): string {\n const baseName = name.split(/[\\\\/]/).pop() || name;\n return baseName.toLowerCase();\n}\n","import type { PreviewSize } from \"./types\";\n\nexport function resolveContainer(container: HTMLElement | string): HTMLElement {\n if (typeof container !== \"string\") {\n return container;\n }\n\n const element = document.querySelector<HTMLElement>(container);\n if (!element) {\n throw new Error(`File viewer container not found: ${container}`);\n }\n return element;\n}\n\nexport function applyBoxSize(\n element: HTMLElement,\n width?: number | string,\n height?: number | string\n): void {\n if (width !== undefined) {\n element.style.width = typeof width === \"number\" ? `${width}px` : width;\n }\n if (height !== undefined) {\n element.style.height = typeof height === \"number\" ? `${height}px` : height;\n }\n}\n\nexport function getElementSize(element: HTMLElement): PreviewSize {\n const rect = element.getBoundingClientRect();\n return {\n width: Math.max(0, Math.round(rect.width)),\n height: Math.max(0, Math.round(rect.height))\n };\n}\n\nexport function createObjectUrl(file: { url?: string; blob?: Blob }): string {\n if (file.url) {\n return file.url;\n }\n if (!file.blob) {\n throw new Error(\"File source cannot be converted to an object URL.\");\n }\n return URL.createObjectURL(file.blob);\n}\n\nexport function revokeObjectUrl(url: string, isExternal: boolean): void {\n if (!isExternal) {\n URL.revokeObjectURL(url);\n }\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\n\nexport function fallbackPlugin(): PreviewPlugin {\n return {\n name: \"fallback\",\n match() {\n return true;\n },\n render(ctx) {\n ctx.options.onUnsupported?.(ctx.file);\n if (ctx.options.fallback === \"custom\" && ctx.options.renderFallback) {\n return ctx.options.renderFallback(ctx);\n }\n\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent =\n ctx.options.fallback === \"download\"\n ? \"当前文件可下载后查看\"\n : \"当前文件暂不支持在线预览\";\n\n const meta = createFallbackMeta(ctx.file);\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n\n panel.append(title, meta, download);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(panel);\n\n if (ctx.options.fallback === \"download\") {\n download.focus();\n }\n\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\nfunction createFallbackMeta(file: { name: string; extension: string; mimeType: string; size?: number; url?: string }): HTMLElement {\n const meta = document.createElement(\"dl\");\n meta.className = \"ofv-fallback-meta\";\n appendFallbackMeta(meta, \"文件\", file.name || \"未命名文件\");\n appendFallbackMeta(meta, \"格式\", file.extension ? `.${file.extension}` : \"未知\");\n appendFallbackMeta(meta, \"MIME\", file.mimeType || \"未声明\");\n appendFallbackMeta(meta, \"大小\", file.size === undefined ? \"未知\" : formatFallbackBytes(file.size));\n appendFallbackMeta(meta, \"来源\", file.url ? \"远程 URL\" : \"本地/内存文件\");\n return meta;\n}\n\nfunction appendFallbackMeta(parent: HTMLElement, label: string, value: string): void {\n const key = document.createElement(\"dt\");\n key.textContent = label;\n const content = document.createElement(\"dd\");\n content.textContent = value;\n parent.append(key, content);\n}\n\nfunction formatFallbackBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n","import { normalizeFile } from \"./detect\";\nimport { applyBoxSize, createObjectUrl, getElementSize, resolveContainer, revokeObjectUrl } from \"./dom\";\nimport { fallbackPlugin } from \"./plugins/fallback\";\nimport type {\n FileViewer,\n PreviewFile,\n PreviewCommand,\n PreviewInstance,\n PreviewItem,\n PreviewOptions,\n PreviewPlugin,\n PreviewSource,\n PreviewToolbarActionId,\n PreviewToolbarBuiltInAction,\n PreviewToolbarCustomAction,\n PreviewToolbarOptions\n} from \"./types\";\n\nexport function createViewer(options: PreviewOptions): FileViewer {\n const container = resolveContainer(options.container);\n applyBoxSize(container, options.width, options.height);\n\n container.classList.add(\"ofv-root\");\n if (options.className) {\n container.classList.add(options.className);\n }\n const theme = applyTheme(container, options.theme || \"light\");\n\n const host = document.createElement(\"div\");\n host.className = \"ofv-host\";\n\n const status = document.createElement(\"div\");\n status.className = \"ofv-status\";\n status.hidden = true;\n\n const viewport = document.createElement(\"div\");\n viewport.className = \"ofv-viewport\";\n\n const queue = normalizeQueue(options);\n let currentIndex = clampIndex(options.initialIndex || 0, queue.length);\n let currentInstance: PreviewInstance | undefined;\n\n const goTo = async (index: number) => {\n if (destroyed || queue.length === 0) {\n return;\n }\n currentIndex = clampIndex(index, queue.length);\n await renderQueueItem(currentIndex);\n };\n\n const toolbar = createToolbar(options.toolbar, viewport, {\n getLength: () => queue.length,\n next: () => goTo(currentIndex + 1),\n previous: () => goTo(currentIndex - 1),\n command: (command) => currentInstance?.command?.(command)\n });\n if (toolbar) {\n host.append(toolbar.element);\n }\n\n host.append(status, viewport);\n container.replaceChildren(host);\n\n const normalizedOptions = {\n fit: options.fit || \"contain\",\n fallback: options.fallback || \"inline\",\n ...options\n };\n\n let destroyed = false;\n let renderToken = 0;\n\n const setLoading = (loading: boolean) => {\n status.hidden = !loading;\n status.textContent = loading ? \"Loading preview...\" : \"\";\n };\n\n const setError = (error: Error | string) => {\n status.hidden = false;\n status.textContent = typeof error === \"string\" ? error : error.message;\n };\n\n const resize = () => {\n if (destroyed) {\n return;\n }\n const size = getElementSize(viewport);\n currentInstance?.resize?.(size);\n };\n\n const resizeObserver = observeResize(container, resize);\n\n const renderFile = async (file: PreviewFile) => {\n const token = (renderToken += 1);\n currentInstance?.destroy();\n currentInstance = undefined;\n viewport.replaceChildren();\n setLoading(true);\n toolbar?.update(file, currentIndex, queue.length);\n\n const plugins = [...(options.plugins || []), fallbackPlugin()];\n const plugin = await findPlugin(plugins, file);\n if (destroyed || token !== renderToken) {\n return;\n }\n\n try {\n const nextInstance = await plugin.render({\n host,\n viewport,\n file,\n size: getElementSize(viewport),\n options: normalizedOptions,\n toolbar: toolbar?.getContext(),\n setLoading,\n setError\n });\n if (destroyed || token !== renderToken) {\n nextInstance.destroy();\n return;\n }\n currentInstance = nextInstance;\n setLoading(false);\n toolbar?.setCommandSupport((command) =>\n Boolean(nextInstance.command) && (nextInstance.canCommand ? nextInstance.canCommand(command) : true)\n );\n options.onLoad?.(file);\n resize();\n } catch (error) {\n if (destroyed || token !== renderToken) {\n return;\n }\n const normalizedError = error instanceof Error ? error : new Error(String(error));\n setLoading(false);\n setError(normalizedError);\n options.onError?.(normalizedError, file);\n }\n };\n\n async function renderQueueItem(index: number) {\n const item = queue[index];\n const file = await normalizeFile(item.file, item.fileName, item.mimeType);\n await renderFile(file);\n }\n\n void goTo(currentIndex);\n\n return {\n async reload(file) {\n if (destroyed) {\n return;\n }\n if (file !== undefined) {\n const currentItem = queue[currentIndex];\n queue.splice(currentIndex, 1, createReloadItem(file, currentItem, options));\n }\n await renderQueueItem(currentIndex);\n },\n async next() {\n await goTo(currentIndex + 1);\n },\n async previous() {\n await goTo(currentIndex - 1);\n },\n goTo,\n getCurrentIndex() {\n return currentIndex;\n },\n resize,\n destroy() {\n destroyed = true;\n renderToken += 1;\n resizeObserver.destroy();\n currentInstance?.destroy();\n toolbar?.destroy();\n theme.destroy();\n container.replaceChildren();\n container.classList.remove(\"ofv-root\");\n if (options.className) {\n container.classList.remove(options.className);\n }\n }\n };\n}\n\nfunction normalizeQueue(options: PreviewOptions): PreviewItem[] {\n if (options.files && options.files.length > 0) {\n return options.files.map((item) =>\n isPreviewItem(item)\n ? item\n : {\n file: item\n }\n );\n }\n if (options.file === undefined) {\n throw new Error(\"File viewer requires either file or files.\");\n }\n return [\n {\n file: options.file,\n fileName: options.fileName,\n mimeType: options.mimeType\n }\n ];\n}\n\nfunction isPreviewItem(item: PreviewSource | PreviewItem): item is PreviewItem {\n return typeof item === \"object\" && item !== null && \"file\" in item;\n}\n\nfunction createReloadItem(\n file: PreviewSource,\n currentItem: PreviewItem | undefined,\n options: PreviewOptions\n): PreviewItem {\n if (typeof File !== \"undefined\" && file instanceof File) {\n return { file };\n }\n return {\n file,\n fileName: currentItem?.fileName || options.fileName,\n mimeType: currentItem?.mimeType || options.mimeType\n };\n}\n\nfunction clampIndex(index: number, length: number): number {\n if (length <= 0) {\n return 0;\n }\n return Math.min(Math.max(index, 0), length - 1);\n}\n\nfunction applyTheme(\n container: HTMLElement,\n theme: NonNullable<PreviewOptions[\"theme\"]>\n): { destroy: () => void } {\n const media = window.matchMedia?.(\"(prefers-color-scheme: dark)\");\n const classes = [\"ofv-theme-light\", \"ofv-theme-dark\"];\n\n const setThemeClass = () => {\n container.classList.remove(...classes);\n const resolvedTheme = theme === \"auto\" && media?.matches ? \"dark\" : theme === \"auto\" ? \"light\" : theme;\n container.classList.add(`ofv-theme-${resolvedTheme}`);\n };\n\n setThemeClass();\n if (theme === \"auto\") {\n addMediaListener(media, setThemeClass);\n }\n\n return {\n destroy() {\n if (theme === \"auto\") {\n removeMediaListener(media, setThemeClass);\n }\n container.classList.remove(...classes);\n }\n };\n}\n\nfunction observeResize(element: HTMLElement, callback: () => void): { destroy: () => void } {\n if (typeof ResizeObserver !== \"undefined\") {\n const observer = new ResizeObserver(callback);\n observer.observe(element);\n return {\n destroy() {\n observer.disconnect();\n }\n };\n }\n\n window.addEventListener(\"resize\", callback);\n return {\n destroy() {\n window.removeEventListener(\"resize\", callback);\n }\n };\n}\n\ntype CompatibleMediaQueryList = MediaQueryList & {\n addListener?: (listener: () => void) => void;\n removeListener?: (listener: () => void) => void;\n};\n\nfunction addMediaListener(media: CompatibleMediaQueryList | undefined, listener: () => void): void {\n if (!media) {\n return;\n }\n if (typeof media.addEventListener === \"function\") {\n media.addEventListener(\"change\", listener);\n return;\n }\n media.addListener?.(listener);\n}\n\nfunction removeMediaListener(media: CompatibleMediaQueryList | undefined, listener: () => void): void {\n if (!media) {\n return;\n }\n if (typeof media.removeEventListener === \"function\") {\n media.removeEventListener(\"change\", listener);\n return;\n }\n media.removeListener?.(listener);\n}\n\nfunction createToolbar(\n toolbar: PreviewOptions[\"toolbar\"],\n viewport: HTMLElement,\n queue: {\n getLength: () => number;\n next: () => void | Promise<void>;\n previous: () => void | Promise<void>;\n command: (command: PreviewCommand) => void | boolean | undefined;\n }\n):\n | {\n element: HTMLElement;\n update: (file: PreviewFile, index: number, length: number) => void;\n setCommandSupport: (isSupported: (command: PreviewCommand) => boolean) => void;\n getContext: () => ReturnType<typeof createToolbarContext>;\n setZoom: (zoom?: number) => void;\n destroy: () => void;\n }\n | undefined {\n if (!toolbar) {\n return undefined;\n }\n\n const options: PreviewToolbarOptions =\n typeof toolbar === \"boolean\"\n ? { zoom: true, rotate: true, download: true, fullscreen: true, print: true, search: true }\n : toolbar;\n\n const element = document.createElement(\"div\");\n element.className = \"ofv-toolbar\";\n element.setAttribute(\"role\", \"toolbar\");\n element.setAttribute(\"aria-label\", \"File preview toolbar\");\n\n let file: PreviewFile | undefined;\n let currentIndex = 0;\n let currentLength = queue.getLength();\n let queueLabel: HTMLSpanElement | undefined;\n let previousButton: HTMLButtonElement | undefined;\n let nextButton: HTMLButtonElement | undefined;\n let zoomResetButton: HTMLButtonElement | undefined;\n let currentZoom: number | undefined;\n const commandButtons: Array<{ button: HTMLButtonElement; command: PreviewCommand }> = [];\n const customButtons: Array<{ button: HTMLButtonElement; action: PreviewToolbarCustomAction }> = [];\n const disposers: Array<() => void> = [];\n const search = createSearchController(viewport);\n let searchInput: HTMLInputElement | undefined;\n let searchCount: HTMLSpanElement | undefined;\n let canRunCommand = (_command: PreviewCommand) => false;\n\n const getContext = () =>\n createToolbarContext({\n file,\n index: currentIndex,\n length: currentLength,\n viewport,\n queue,\n element,\n search,\n canCommand: canRunCommand,\n zoom: currentZoom,\n setZoom\n });\n\n const addButton = (\n label: string,\n title: string,\n action: () => void,\n className?: string,\n icon?: string | HTMLElement | SVGElement\n ) => {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n setToolbarButtonContent(button, label, icon);\n button.title = title;\n button.setAttribute(\"aria-label\", title);\n if (className) {\n button.className = className;\n }\n button.addEventListener(\"click\", action);\n element.append(button);\n disposers.push(() => button.removeEventListener(\"click\", action));\n return button;\n };\n\n const addCommandButton = (\n id: PreviewToolbarBuiltInAction,\n label: string,\n title: string,\n command: PreviewCommand\n ) => {\n const button = addButton(label, title, () => {\n queue.command(command);\n }, undefined, options.icons?.[id]);\n button.disabled = true;\n commandButtons.push({ button, command });\n };\n\n const renderDefaultAction = (id: PreviewToolbarActionId) => {\n if (!isBuiltInToolbarAction(id)) {\n const customAction = options.actions?.find((action) => action.id === id);\n if (customAction) {\n renderCustomAction(customAction);\n }\n return;\n }\n\n if (id === \"previous\" && queue.getLength() > 1) {\n previousButton = addButton(\n getToolbarLabel(options, \"previous\"),\n getToolbarTitle(options, \"previous\"),\n () => void queue.previous(),\n undefined,\n options.icons?.previous\n );\n return;\n }\n if (id === \"next\" && queue.getLength() > 1) {\n nextButton = addButton(\n getToolbarLabel(options, \"next\"),\n getToolbarTitle(options, \"next\"),\n () => void queue.next(),\n undefined,\n options.icons?.next\n );\n return;\n }\n if (id === \"queue\" && queue.getLength() > 1) {\n queueLabel = document.createElement(\"span\");\n queueLabel.className = \"ofv-toolbar-queue\";\n element.append(queueLabel);\n return;\n }\n if (id === \"zoom-out\" && options.zoom) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"zoom-out\");\n return;\n }\n if (id === \"zoom-in\" && options.zoom) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"zoom-in\");\n return;\n }\n if (id === \"zoom-reset\" && options.zoom) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"zoom-reset\");\n zoomResetButton = commandButtons[commandButtons.length - 1]?.button;\n updateZoomLabel();\n return;\n }\n if (id === \"rotate-right\" && options.rotate) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"rotate-right\");\n return;\n }\n if (id === \"download\" && options.download !== false) {\n addButton(\n getToolbarLabel(options, id),\n getToolbarTitle(options, id),\n () => getContext().download(),\n undefined,\n options.icons?.download\n );\n return;\n }\n if (id === \"fullscreen\" && options.fullscreen !== false) {\n addButton(\n getToolbarLabel(options, id),\n getToolbarTitle(options, id),\n () => getContext().fullscreen(),\n undefined,\n options.icons?.fullscreen\n );\n return;\n }\n if (id === \"print\" && options.print) {\n addButton(\n getToolbarLabel(options, id),\n getToolbarTitle(options, id),\n () => getContext().print(),\n undefined,\n options.icons?.print\n );\n return;\n }\n if (id === \"search\" && options.search !== false) {\n renderSearchControl();\n return;\n }\n\n };\n\n const renderCustomAction = (action: PreviewToolbarCustomAction) => {\n const button = addButton(\n action.label,\n action.title || action.label,\n () => void action.onClick(getContext()),\n action.className,\n action.icon\n );\n button.dataset.ofvToolbarAction = action.id;\n customButtons.push({ button, action });\n };\n\n const renderSearchControl = () => {\n const searchGroup = document.createElement(\"div\");\n searchGroup.className = \"ofv-toolbar-search\";\n searchGroup.title = getToolbarTitle(options, \"search\");\n const nextSearchInput = document.createElement(\"input\");\n nextSearchInput.type = \"search\";\n nextSearchInput.placeholder = getToolbarLabel(options, \"search\");\n nextSearchInput.setAttribute(\"aria-label\", getToolbarTitle(options, \"search\"));\n const nextSearchCount = document.createElement(\"span\");\n nextSearchCount.className = \"ofv-toolbar-search-count\";\n searchInput = nextSearchInput;\n searchCount = nextSearchCount;\n\n const runSearch = () => {\n const count = search.search(nextSearchInput.value);\n nextSearchCount.textContent = nextSearchInput.value ? String(count) : \"\";\n };\n\n nextSearchInput.addEventListener(\"input\", runSearch);\n searchGroup.append(nextSearchInput, nextSearchCount);\n element.append(searchGroup);\n disposers.push(() => nextSearchInput.removeEventListener(\"input\", runSearch));\n };\n\n const renderToolbar = () => {\n if (options.render) {\n element.replaceChildren();\n const customElement = options.render(getContext());\n if (customElement) {\n element.append(customElement);\n }\n return;\n }\n getToolbarOrder(options, queue.getLength()).forEach(renderDefaultAction);\n getImplicitCustomActions(options).forEach(renderCustomAction);\n };\n\n renderToolbar();\n\n const updateCustomButtons = () => {\n const context = getContext();\n for (const { button, action } of customButtons) {\n button.disabled = evaluateToolbarFlag(action.disabled, context);\n button.hidden = evaluateToolbarFlag(action.hidden, context);\n }\n };\n\n const resetSearch = () => {\n search.clear();\n if (searchInput) {\n searchInput.value = \"\";\n }\n if (searchCount) {\n searchCount.textContent = \"\";\n }\n };\n\n function setZoom(zoom?: number) {\n currentZoom = typeof zoom === \"number\" && Number.isFinite(zoom) && zoom > 0 ? zoom : undefined;\n updateZoomLabel();\n updateCustomButtons();\n refreshCustomRender();\n }\n\n function updateZoomLabel() {\n if (!zoomResetButton) {\n return;\n }\n setToolbarButtonContent(\n zoomResetButton,\n currentZoom === undefined ? getToolbarLabel(options, \"zoom-reset\") : formatToolbarZoom(currentZoom),\n options.icons?.[\"zoom-reset\"]\n );\n }\n\n const refreshCustomRender = () => {\n if (!options.render) {\n return;\n }\n element.replaceChildren();\n const customElement = options.render(getContext());\n if (customElement) {\n element.append(customElement);\n }\n };\n\n return {\n element,\n update(nextFile, index, length) {\n file = nextFile;\n currentIndex = index;\n currentLength = length;\n currentZoom = undefined;\n updateZoomLabel();\n resetSearch();\n commandButtons.forEach(({ button }) => {\n button.disabled = true;\n });\n if (queueLabel) {\n queueLabel.textContent = `${index + 1} / ${length}`;\n }\n if (previousButton) {\n previousButton.disabled = index <= 0;\n }\n if (nextButton) {\n nextButton.disabled = index >= length - 1;\n }\n updateCustomButtons();\n refreshCustomRender();\n },\n setCommandSupport(isSupported) {\n canRunCommand = isSupported;\n commandButtons.forEach(({ button, command }) => {\n button.disabled = !isSupported(command);\n });\n updateCustomButtons();\n refreshCustomRender();\n },\n getContext,\n setZoom,\n destroy() {\n search.clear();\n for (const dispose of disposers) {\n dispose();\n }\n element.replaceChildren();\n }\n };\n}\n\nfunction createToolbarContext({\n file,\n index,\n length,\n viewport,\n queue,\n element,\n search,\n canCommand,\n zoom,\n setZoom\n}: {\n file?: PreviewFile;\n index: number;\n length: number;\n viewport: HTMLElement;\n queue: {\n next: () => void | Promise<void>;\n previous: () => void | Promise<void>;\n command: (command: PreviewCommand) => void | boolean | undefined;\n };\n element: HTMLElement;\n search: ReturnType<typeof createSearchController>;\n canCommand: (command: PreviewCommand) => boolean;\n zoom?: number;\n setZoom: (zoom?: number) => void;\n}) {\n return {\n file,\n index,\n length,\n viewport,\n canPrevious: index > 0,\n canNext: index < length - 1,\n zoom,\n zoomLabel: zoom === undefined ? undefined : formatToolbarZoom(zoom),\n async previous() {\n await queue.previous();\n },\n async next() {\n await queue.next();\n },\n command: queue.command,\n canCommand,\n setZoom,\n download() {\n if (file) {\n downloadFile(file);\n }\n },\n fullscreen() {\n void element.parentElement?.requestFullscreen?.();\n },\n print() {\n printPreview(viewport);\n },\n search: search.search,\n clearSearch: search.clear\n };\n}\n\nconst defaultToolbarLabels: Record<PreviewToolbarBuiltInAction, string> = {\n previous: \"Prev\",\n next: \"Next\",\n queue: \"\",\n \"zoom-out\": \"-\",\n \"zoom-in\": \"+\",\n \"zoom-reset\": \"100%\",\n \"rotate-right\": \"Rotate\",\n download: \"Download\",\n fullscreen: \"Fullscreen\",\n print: \"Print\",\n search: \"Search\"\n};\n\nconst defaultToolbarTitles: Record<PreviewToolbarBuiltInAction, string> = {\n previous: \"Previous file\",\n next: \"Next file\",\n queue: \"Current file position\",\n \"zoom-out\": \"Zoom out\",\n \"zoom-in\": \"Zoom in\",\n \"zoom-reset\": \"Reset zoom\",\n \"rotate-right\": \"Rotate right\",\n download: \"Download file\",\n fullscreen: \"Open preview fullscreen\",\n print: \"Print preview\",\n search: \"Search preview text\"\n};\n\nfunction getToolbarLabel(options: PreviewToolbarOptions, id: PreviewToolbarBuiltInAction): string {\n return options.labels?.[id] ?? defaultToolbarLabels[id];\n}\n\nfunction getToolbarTitle(options: PreviewToolbarOptions, id: PreviewToolbarBuiltInAction): string {\n return options.titles?.[id] ?? options.labels?.[id] ?? defaultToolbarTitles[id];\n}\n\nfunction formatToolbarZoom(zoom: number): string {\n return `${Math.round(zoom * 100)}%`;\n}\n\nfunction getToolbarOrder(options: PreviewToolbarOptions, queueLength: number): PreviewToolbarActionId[] {\n if (options.order) {\n return options.order;\n }\n\n const actions: PreviewToolbarActionId[] = [];\n if (queueLength > 1) {\n actions.push(\"previous\", \"next\", \"queue\");\n }\n if (options.zoom) {\n actions.push(\"zoom-out\", \"zoom-in\", \"zoom-reset\");\n }\n if (options.rotate) {\n actions.push(\"rotate-right\");\n }\n if (options.download !== false) {\n actions.push(\"download\");\n }\n if (options.fullscreen !== false) {\n actions.push(\"fullscreen\");\n }\n if (options.print) {\n actions.push(\"print\");\n }\n if (options.search !== false) {\n actions.push(\"search\");\n }\n return actions;\n}\n\nfunction getImplicitCustomActions(options: PreviewToolbarOptions): PreviewToolbarCustomAction[] {\n if (options.order || !options.actions) {\n return [];\n }\n return [...options.actions].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n}\n\nfunction evaluateToolbarFlag(\n value: boolean | ((ctx: ReturnType<typeof createToolbarContext>) => boolean) | undefined,\n context: ReturnType<typeof createToolbarContext>\n): boolean {\n return typeof value === \"function\" ? value(context) : Boolean(value);\n}\n\nfunction setToolbarButtonContent(\n button: HTMLButtonElement,\n label: string,\n icon?: string | HTMLElement | SVGElement\n): void {\n button.replaceChildren();\n if (!icon) {\n button.textContent = label;\n return;\n }\n\n const iconElement = document.createElement(\"span\");\n iconElement.className = \"ofv-toolbar-icon\";\n iconElement.setAttribute(\"aria-hidden\", \"true\");\n if (typeof icon === \"string\") {\n iconElement.append(sanitizeToolbarIcon(icon));\n } else {\n iconElement.append(icon.cloneNode(true));\n }\n\n const labelElement = document.createElement(\"span\");\n labelElement.className = \"ofv-toolbar-label\";\n labelElement.textContent = label;\n button.append(iconElement, labelElement);\n}\n\nconst allowedToolbarIconTags = new Set([\n \"svg\",\n \"g\",\n \"path\",\n \"circle\",\n \"rect\",\n \"line\",\n \"polyline\",\n \"polygon\",\n \"ellipse\",\n \"defs\",\n \"title\",\n \"desc\"\n]);\n\nconst allowedToolbarIconAttrs = new Set([\n \"aria-hidden\",\n \"class\",\n \"cx\",\n \"cy\",\n \"d\",\n \"fill\",\n \"focusable\",\n \"height\",\n \"id\",\n \"points\",\n \"r\",\n \"rx\",\n \"ry\",\n \"stroke\",\n \"stroke-linecap\",\n \"stroke-linejoin\",\n \"stroke-width\",\n \"transform\",\n \"viewBox\",\n \"width\",\n \"x\",\n \"x1\",\n \"x2\",\n \"y\",\n \"y1\",\n \"y2\"\n]);\n\nfunction sanitizeToolbarIcon(icon: string): Node {\n const template = document.createElement(\"template\");\n template.innerHTML = icon.trim();\n const fragment = document.createDocumentFragment();\n for (const child of Array.from(template.content.childNodes)) {\n const sanitized = sanitizeToolbarIconNode(child);\n if (sanitized) {\n fragment.append(sanitized);\n }\n }\n return fragment;\n}\n\nfunction sanitizeToolbarIconNode(node: Node): Node | null {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent || \"\";\n return text.trim() ? document.createTextNode(text) : null;\n }\n\n if (!(node instanceof Element)) {\n return null;\n }\n\n const tagName = node.tagName.toLowerCase();\n if (!allowedToolbarIconTags.has(tagName)) {\n return null;\n }\n\n const sanitized = document.createElementNS(\"http://www.w3.org/2000/svg\", tagName);\n for (const attr of Array.from(node.attributes)) {\n if (isSafeToolbarIconAttribute(attr.name, attr.value)) {\n sanitized.setAttribute(attr.name, attr.value);\n }\n }\n\n for (const child of Array.from(node.childNodes)) {\n const sanitizedChild = sanitizeToolbarIconNode(child);\n if (sanitizedChild) {\n sanitized.append(sanitizedChild);\n }\n }\n\n return sanitized;\n}\n\nfunction isSafeToolbarIconAttribute(name: string, value: string): boolean {\n const attrName = name.toLowerCase();\n if (attrName.startsWith(\"on\") || attrName.includes(\":\")) {\n return false;\n }\n if (!allowedToolbarIconAttrs.has(name) && !allowedToolbarIconAttrs.has(attrName) && !attrName.startsWith(\"data-\")) {\n return false;\n }\n return !/^\\s*(?:javascript|data:text\\/html|vbscript):/i.test(value);\n}\n\nfunction isBuiltInToolbarAction(id: PreviewToolbarActionId): id is PreviewToolbarBuiltInAction {\n return id in defaultToolbarLabels;\n}\n\nfunction createSearchController(root: HTMLElement): {\n search: (query: string) => number;\n clear: () => void;\n} {\n const markerClass = \"ofv-search-match\";\n\n const clear = () => {\n const markers = collectSearchRoots(root).flatMap((searchRoot) => [\n ...searchRoot.querySelectorAll(`mark.${markerClass}`)\n ]);\n for (const marker of markers) {\n marker.replaceWith(document.createTextNode(marker.textContent || \"\"));\n }\n collectSearchRoots(root).forEach((searchRoot) => searchRoot.normalize());\n };\n\n const search = (query: string): number => {\n clear();\n const normalizedQuery = query.trim();\n if (!normalizedQuery) {\n return 0;\n }\n\n const textNodes = collectSearchRoots(root).flatMap((searchRoot) => collectSearchableTextNodes(searchRoot));\n let count = 0;\n let firstMatch: HTMLElement | undefined;\n\n for (const node of textNodes) {\n const text = node.nodeValue || \"\";\n const lowerText = text.toLowerCase();\n const lowerQuery = normalizedQuery.toLowerCase();\n let start = 0;\n let index = lowerText.indexOf(lowerQuery, start);\n if (index < 0) {\n continue;\n }\n\n const fragment = document.createDocumentFragment();\n while (index >= 0) {\n if (index > start) {\n fragment.append(document.createTextNode(text.slice(start, index)));\n }\n const marker = document.createElement(\"mark\");\n marker.className = markerClass;\n marker.textContent = text.slice(index, index + normalizedQuery.length);\n fragment.append(marker);\n firstMatch ||= marker;\n count += 1;\n start = index + normalizedQuery.length;\n index = lowerText.indexOf(lowerQuery, start);\n }\n if (start < text.length) {\n fragment.append(document.createTextNode(text.slice(start)));\n }\n node.replaceWith(fragment);\n }\n\n firstMatch?.scrollIntoView?.({ block: \"center\", inline: \"nearest\" });\n return count;\n };\n\n return { search, clear };\n}\n\nfunction collectSearchRoots(root: HTMLElement): HTMLElement[] {\n const roots = [root];\n for (const iframe of root.querySelectorAll<HTMLIFrameElement>(\"iframe\")) {\n try {\n const body = iframe.contentDocument?.body;\n if (body) {\n roots.push(body);\n }\n } catch {\n // Cross-origin or sandboxed frames without DOM access are skipped.\n }\n }\n return roots;\n}\n\nfunction collectSearchableTextNodes(root: HTMLElement): Text[] {\n const nodes: Text[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {\n acceptNode(node) {\n const parent = node.parentElement;\n if (!parent || !node.nodeValue?.trim()) {\n return NodeFilter.FILTER_REJECT;\n }\n if ([\"SCRIPT\", \"STYLE\", \"TEXTAREA\", \"INPUT\", \"BUTTON\"].includes(parent.tagName)) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n }\n });\n\n let current = walker.nextNode();\n while (current) {\n nodes.push(current as Text);\n current = walker.nextNode();\n }\n return nodes;\n}\n\nfunction printPreview(viewport: HTMLElement): void {\n const frame = document.createElement(\"iframe\");\n frame.className = \"ofv-print-frame\";\n frame.setAttribute(\"aria-hidden\", \"true\");\n document.body.append(frame);\n\n const clone = viewport.cloneNode(true) as HTMLElement;\n copyCanvasContent(viewport, clone);\n clone.classList.add(\"ofv-print-root\", \"ofv-root\"); // Add ofv-root class so CSS variables can resolve\n\n // Handle PPTX printing layout adaptation\n const pptxViewer = clone.querySelector(\".ofv-pptx-viewer\") || (clone.classList.contains(\"ofv-pptx-viewer\") ? clone : null);\n let intrinsicWidth = 960;\n let intrinsicHeight = 540;\n let hasSlides = false;\n\n if (pptxViewer) {\n const slides = pptxViewer.querySelectorAll(\"[data-slide-index]\");\n if (slides.length > 0) {\n hasSlides = true;\n const firstWrapper = slides[0].firstElementChild as HTMLElement | null;\n const firstSlide = firstWrapper?.firstElementChild as HTMLElement | null;\n if (firstSlide) {\n intrinsicWidth = parseInt(firstSlide.style.width) || 960;\n intrinsicHeight = parseInt(firstSlide.style.height) || 540;\n }\n\n slides.forEach((slideEl) => {\n const item = slideEl as HTMLElement;\n item.style.width = \"100%\";\n item.style.margin = \"0 0 20px 0\";\n\n const wrapper = item.firstElementChild as HTMLElement | null;\n if (wrapper) {\n wrapper.style.width = `${intrinsicWidth}px`;\n wrapper.style.height = `${intrinsicHeight}px`;\n wrapper.style.boxShadow = \"none\";\n wrapper.style.margin = \"0 auto\";\n\n const slideContent = wrapper.firstElementChild as HTMLElement | null;\n if (slideContent) {\n slideContent.style.transform = \"none\";\n slideContent.style.width = `${intrinsicWidth}px`;\n slideContent.style.height = `${intrinsicHeight}px`;\n }\n }\n });\n }\n }\n\n const doc = frame.contentDocument;\n if (!doc) {\n frame.remove();\n return;\n }\n\n // 1. Write the basic HTML skeleton\n doc.open();\n doc.write(`<!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\" />\n <title>Print preview</title>\n </head>\n <body></body>\n </html>`);\n doc.close();\n\n // 2. Copy all stylesheets from parent document to print iframe\n Array.from(document.querySelectorAll(\"style, link[rel='stylesheet']\")).forEach((el) => {\n doc.head.appendChild(el.cloneNode(true));\n });\n\n // 3. Inject our base print style override element AFTER parent stylesheets\n const baseStyle = doc.createElement(\"style\");\n baseStyle.textContent = `\n * { box-sizing: border-box; }\n html, body {\n margin: 0;\n padding: 0;\n background: #fff;\n color: #111827;\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n }\n body { padding: 16px; }\n img, video, canvas, svg { max-width: 100%; }\n pre {\n white-space: pre-wrap;\n word-break: break-word;\n font: 12px/1.5 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n }\n .ofv-viewport, .ofv-print-root {\n width: 100% !important;\n height: auto !important;\n overflow: visible !important;\n background: #fff !important;\n color: #111827 !important;\n border: none !important;\n box-shadow: none !important;\n }\n .ofv-pdf {\n padding: 0;\n overflow: visible;\n background: #fff;\n }\n .ofv-pdf-page {\n display: block;\n max-width: 100%;\n height: auto;\n margin: 0 auto 16px;\n box-shadow: none;\n }\n .ofv-panel,\n .ofv-text,\n .ofv-text-block,\n .ofv-file-list {\n max-height: none;\n min-height: 0;\n overflow: visible;\n }\n .ofv-section {\n break-inside: avoid;\n page-break-inside: avoid;\n }\n `;\n doc.head.appendChild(baseStyle);\n\n // 4. Inject PPTX-specific style overrides if slides are present\n if (hasSlides) {\n const pptxStyle = doc.createElement(\"style\");\n pptxStyle.textContent = `\n @media print {\n @page {\n size: ${intrinsicWidth > intrinsicHeight ? \"landscape\" : \"portrait\"};\n margin: 0;\n }\n html, body {\n background: #fff;\n }\n body {\n width: ${intrinsicWidth}px !important;\n margin: 0 !important;\n padding: 0 !important;\n }\n .ofv-print-root {\n width: ${intrinsicWidth}px !important;\n padding: 0 !important;\n }\n .ofv-pptx-viewer {\n width: ${intrinsicWidth}px !important;\n padding: 0 !important;\n background: #fff !important;\n overflow: visible !important;\n }\n .ofv-pptx-viewer > div[data-slide-index] {\n page-break-after: always;\n break-after: page;\n break-inside: avoid;\n page-break-inside: avoid;\n margin: 0 !important;\n padding: 0 !important;\n overflow: visible !important;\n }\n .ofv-pptx-viewer > div[data-slide-index]:last-child {\n page-break-after: avoid;\n break-after: avoid;\n }\n }\n `;\n doc.head.appendChild(pptxStyle);\n }\n\n doc.body.append(clone);\n\n let printed = false;\n const printAndCleanup = () => {\n if (printed) {\n return;\n }\n printed = true;\n frame.contentWindow?.focus();\n frame.contentWindow?.print();\n window.setTimeout(() => frame.remove(), 1000);\n };\n\n frame.onload = () => {\n printAndCleanup();\n };\n\n window.setTimeout(() => {\n printAndCleanup();\n }, 100);\n}\n\nfunction copyCanvasContent(sourceRoot: HTMLElement, targetRoot: HTMLElement): void {\n const sourceCanvases = [...sourceRoot.querySelectorAll(\"canvas\")];\n const targetCanvases = [...targetRoot.querySelectorAll(\"canvas\")];\n\n sourceCanvases.forEach((sourceCanvas, index) => {\n const targetCanvas = targetCanvases[index];\n if (!targetCanvas) {\n return;\n }\n const image = document.createElement(\"img\");\n image.className = targetCanvas.className;\n image.alt = \"Canvas preview page\";\n try {\n image.src = sourceCanvas.toDataURL(\"image/png\");\n } catch {\n return;\n }\n image.width = sourceCanvas.width;\n image.height = sourceCanvas.height;\n targetCanvas.replaceWith(image);\n });\n}\n\nfunction downloadFile(file: PreviewFile): void {\n const url = createObjectUrl(file);\n const isExternal = Boolean(file.url);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = file.name;\n link.rel = \"noopener\";\n link.hidden = true;\n document.body.append(link);\n link.click();\n window.setTimeout(() => {\n link.remove();\n revokeObjectUrl(url, isExternal);\n }, 0);\n}\n\nasync function findPlugin(plugins: PreviewPlugin[], file: PreviewFile): Promise<PreviewPlugin> {\n for (const plugin of plugins) {\n if (await plugin.match(file)) {\n return plugin;\n }\n }\n return fallbackPlugin();\n}\n","/// <reference path=\"../shims-heic.d.ts\" />\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin, PreviewSize } from \"../types\";\n\nconst imageExtensions = new Set([\n \"jpg\",\n \"jpeg\",\n \"jfif\",\n \"pjpe\",\n \"pjpeg\",\n \"png\",\n \"gif\",\n \"webp\",\n \"avif\",\n \"jxl\",\n \"svg\",\n \"bmp\",\n \"ico\",\n \"cur\",\n \"tif\",\n \"tiff\",\n \"apng\",\n \"heic\",\n \"heif\"\n]);\nconst nonRasterImageExtensions = new Set([\"dxf\"]);\nconst nonRasterImageMimeTypes = new Set([\"image/vnd.dxf\", \"image/vnd.adobe.photoshop\"]);\nconst heicMimeTypes = new Set([\"image/heic\", \"image/heif\", \"image/heic-sequence\", \"image/heif-sequence\"]);\n\nexport function imagePlugin(): PreviewPlugin {\n return {\n name: \"image\",\n match(file) {\n if (nonRasterImageExtensions.has(file.extension) || nonRasterImageMimeTypes.has(file.mimeType)) {\n return false;\n }\n return file.mimeType.startsWith(\"image/\") || imageExtensions.has(file.extension);\n },\n async render(ctx) {\n const ext = ctx.file.extension.toLowerCase();\n const isHeic = ext === \"heic\" || ext === \"heif\" || heicMimeTypes.has(ctx.file.mimeType.toLowerCase());\n const sourceBytesPromise = readImageBytes(ctx.file.blob);\n\n let url = \"\";\n let convertedBlob: Blob | null = null;\n let isExternal = Boolean(ctx.file.url);\n\n if (isHeic) {\n ctx.setLoading(true);\n try {\n let blob = ctx.file.blob;\n if (!blob && typeof ctx.file.source === \"string\") {\n const res = await fetch(ctx.file.source);\n if (!res.ok) {\n throw new Error(`Failed to fetch HEIC file: ${res.status}`);\n }\n blob = await res.blob();\n }\n if (!blob) {\n throw new Error(\"HEIC file source cannot be resolved to a Blob.\");\n }\n\n const heic2anyModule = await import(\"heic2any\");\n const heic2any = heic2anyModule.default || heic2anyModule;\n const converted = await heic2any({\n blob,\n toType: \"image/jpeg\",\n quality: 0.8\n });\n\n convertedBlob = Array.isArray(converted) ? converted[0] : converted;\n url = URL.createObjectURL(convertedBlob);\n isExternal = false;\n } catch (err: any) {\n console.error(\"HEIC image conversion failed:\", err);\n // Fallback to raw object URL\n url = createObjectUrl(ctx.file);\n isExternal = Boolean(ctx.file.url);\n } finally {\n ctx.setLoading(false);\n }\n } else {\n url = createObjectUrl(ctx.file);\n }\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-image-viewer\";\n\n const showInlineControls = !ctx.options.toolbar;\n const controls = document.createElement(\"div\");\n controls.className = \"ofv-image-controls\";\n\n const stage = document.createElement(\"div\");\n stage.className = \"ofv-image-stage\";\n const infoBar = createImageInfoBar(await sourceBytesPromise, ext, ctx.file.mimeType, ctx.file.name);\n\n const image = document.createElement(\"img\");\n image.className = \"ofv-media ofv-image-content\";\n image.alt = ctx.file.name;\n image.draggable = false;\n image.src = url;\n image.style.objectFit = objectFit(ctx.options.fit);\n\n let scale = 1;\n let rotation = 0;\n let offsetX = 0;\n let offsetY = 0;\n let dragging = false;\n let dragStartX = 0;\n let dragStartY = 0;\n let startOffsetX = 0;\n let startOffsetY = 0;\n\n const zoomLabel = document.createElement(\"span\");\n zoomLabel.className = \"ofv-image-zoom\";\n\n const updateTransform = () => {\n image.style.transform = `translate(${offsetX}px, ${offsetY}px) scale(${scale}) rotate(${rotation}deg)`;\n zoomLabel.textContent = `${Math.round(scale * 100)}%`;\n ctx.toolbar?.setZoom(scale);\n };\n\n const showImageFallback = () => {\n stage.replaceChildren(createImageFallback(ctx.file.name, url));\n };\n\n const setScale = (nextScale: number) => {\n scale = Math.min(8, Math.max(0.1, nextScale));\n updateTransform();\n };\n\n const reset = () => {\n scale = 1;\n rotation = 0;\n offsetX = 0;\n offsetY = 0;\n updateTransform();\n };\n\n const addButton = (label: string, title: string, action: () => void) => {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.textContent = label;\n button.title = title;\n button.setAttribute(\"aria-label\", title);\n button.addEventListener(\"click\", action);\n controls.append(button);\n return () => button.removeEventListener(\"click\", action);\n };\n\n const disposers = showInlineControls\n ? [\n addButton(\"-\", \"Zoom out\", () => setScale(scale - 0.25)),\n addButton(\"+\", \"Zoom in\", () => setScale(scale + 0.25)),\n addButton(\"Rotate\", \"Rotate image\", () => {\n rotation += 90;\n updateTransform();\n }),\n addButton(\"Reset\", \"Reset image view\", reset)\n ]\n : [];\n if (showInlineControls) {\n controls.append(zoomLabel);\n }\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) {\n return;\n }\n dragging = true;\n dragStartX = event.clientX;\n dragStartY = event.clientY;\n startOffsetX = offsetX;\n startOffsetY = offsetY;\n stage.classList.add(\"is-dragging\");\n stage.setPointerCapture(event.pointerId);\n };\n\n const onPointerMove = (event: PointerEvent) => {\n if (!dragging) {\n return;\n }\n offsetX = startOffsetX + event.clientX - dragStartX;\n offsetY = startOffsetY + event.clientY - dragStartY;\n updateTransform();\n };\n\n const onPointerUp = (event: PointerEvent) => {\n dragging = false;\n stage.classList.remove(\"is-dragging\");\n if (stage.hasPointerCapture(event.pointerId)) {\n stage.releasePointerCapture(event.pointerId);\n }\n };\n\n const onWheel = (event: WheelEvent) => {\n if (!event.ctrlKey && !event.metaKey) {\n return;\n }\n event.preventDefault();\n setScale(scale + (event.deltaY > 0 ? -0.1 : 0.1));\n };\n\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerUp);\n stage.addEventListener(\"wheel\", onWheel, { passive: false });\n image.addEventListener(\"error\", showImageFallback);\n\n stage.append(image);\n wrapper.append(...(showInlineControls ? [controls, stage, infoBar] : [stage, infoBar]));\n ctx.viewport.append(wrapper);\n updateTransform();\n\n return {\n canCommand(command) {\n return (\n command === \"zoom-in\" ||\n command === \"zoom-out\" ||\n command === \"zoom-reset\" ||\n command === \"rotate-right\" ||\n command === \"rotate-left\"\n );\n },\n command(command) {\n if (command === \"zoom-in\") {\n setScale(scale + 0.25);\n return true;\n }\n if (command === \"zoom-out\") {\n setScale(scale - 0.25);\n return true;\n }\n if (command === \"zoom-reset\") {\n reset();\n return true;\n }\n if (command === \"rotate-right\") {\n rotation += 90;\n updateTransform();\n return true;\n }\n if (command === \"rotate-left\") {\n rotation -= 90;\n updateTransform();\n return true;\n }\n return false;\n },\n resize(size: PreviewSize) {\n image.style.maxWidth = `${size.width}px`;\n image.style.maxHeight = `${Math.max(0, size.height - controls.offsetHeight)}px`;\n },\n destroy() {\n ctx.toolbar?.setZoom(undefined);\n for (const dispose of disposers) {\n dispose();\n }\n stage.removeEventListener(\"pointerdown\", onPointerDown);\n stage.removeEventListener(\"pointermove\", onPointerMove);\n stage.removeEventListener(\"pointerup\", onPointerUp);\n stage.removeEventListener(\"pointercancel\", onPointerUp);\n stage.removeEventListener(\"wheel\", onWheel);\n image.removeEventListener(\"error\", showImageFallback);\n wrapper.remove();\n if (convertedBlob) {\n URL.revokeObjectURL(url);\n } else {\n revokeObjectUrl(url, isExternal);\n }\n }\n };\n }\n };\n}\n\nfunction createImageFallback(fileName: string, url: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"图片预览失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = \"当前浏览器无法直接显示该图片,文件可能已损坏或编码暂不受支持。\";\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载图片\";\n\n fallback.append(title, meta, download);\n return fallback;\n}\n\ntype ImageInfo = {\n format: string;\n width?: number;\n height?: number;\n bitDepth?: string;\n color?: string;\n frames?: number;\n count?: number;\n note?: string;\n};\n\nasync function readImageBytes(blob?: Blob): Promise<Uint8Array> {\n if (!blob) {\n return new Uint8Array();\n }\n return new Uint8Array(await blob.arrayBuffer().catch(() => new ArrayBuffer(0)));\n}\n\nfunction createImageInfoBar(bytes: Uint8Array, extension: string, mimeType: string, fileName: string): HTMLElement {\n const info = parseImageInfo(bytes, extension, mimeType, fileName);\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-image-info\";\n appendImageInfo(bar, \"格式\", info.format);\n if (info.width && info.height) {\n appendImageInfo(bar, \"尺寸\", `${info.width} x ${info.height}px`);\n }\n if (info.bitDepth) {\n appendImageInfo(bar, \"位深\", info.bitDepth);\n }\n if (info.color) {\n appendImageInfo(bar, \"颜色\", info.color);\n }\n if (info.frames !== undefined) {\n appendImageInfo(bar, \"帧\", String(info.frames));\n }\n if (info.count !== undefined) {\n appendImageInfo(bar, \"图像\", String(info.count));\n }\n if (info.note) {\n appendImageInfo(bar, \"说明\", info.note);\n }\n return bar;\n}\n\nfunction appendImageInfo(parent: HTMLElement, label: string, value: string): void {\n const row = document.createElement(\"span\");\n row.className = \"ofv-image-info-item\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n row.append(key, content);\n parent.append(row);\n}\n\nfunction parseImageInfo(bytes: Uint8Array, extension: string, mimeType: string, fileName: string): ImageInfo {\n const fallbackFormat = (extension || mimeType || fileName.split(\".\").pop() || \"image\").toUpperCase();\n if (bytes.length === 0) {\n return { format: fallbackFormat, note: \"无法读取本地头信息\" };\n }\n return (\n parsePngInfo(bytes) ||\n parseJpegInfo(bytes) ||\n parseGifInfo(bytes) ||\n parseWebpInfo(bytes) ||\n parseAvifInfo(bytes) ||\n parseBmpInfo(bytes) ||\n parseIcoInfo(bytes) ||\n parseSvgInfo(bytes) ||\n { format: fallbackFormat, note: \"暂未识别图片头结构\" }\n );\n}\n\nfunction parsePngInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 33 || !bytesMatch(bytes, 0, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) {\n return null;\n }\n const view = dataView(bytes);\n const frames = countPngChunks(bytes, \"fcTL\");\n return {\n format: frames > 0 ? \"APNG\" : \"PNG\",\n width: view.getUint32(16, false),\n height: view.getUint32(20, false),\n bitDepth: `${bytes[24]} bit`,\n color: pngColorType(bytes[25]),\n frames: frames > 0 ? frames : undefined\n };\n}\n\nfunction parseJpegInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 4 || bytes[0] !== 0xff || bytes[1] !== 0xd8) {\n return null;\n }\n let offset = 2;\n while (offset + 9 < bytes.length) {\n if (bytes[offset] !== 0xff) {\n offset++;\n continue;\n }\n const marker = bytes[offset + 1];\n offset += 2;\n while (bytes[offset] === 0xff) {\n offset++;\n }\n if (marker === 0xd9 || marker === 0xda) {\n break;\n }\n if (offset + 2 > bytes.length) {\n break;\n }\n const length = (bytes[offset] << 8) | bytes[offset + 1];\n if (length < 2 || offset + length > bytes.length) {\n break;\n }\n if ((marker >= 0xc0 && marker <= 0xc3) || (marker >= 0xc5 && marker <= 0xc7) || (marker >= 0xc9 && marker <= 0xcb) || (marker >= 0xcd && marker <= 0xcf)) {\n return {\n format: \"JPEG\",\n width: (bytes[offset + 5] << 8) | bytes[offset + 6],\n height: (bytes[offset + 3] << 8) | bytes[offset + 4],\n bitDepth: `${bytes[offset + 2]} bit`,\n color: `${bytes[offset + 7]} component`\n };\n }\n offset += length;\n }\n return { format: \"JPEG\", note: \"未在头部扫描到 SOF 尺寸段\" };\n}\n\nfunction parseGifInfo(bytes: Uint8Array): ImageInfo | null {\n const header = asciiAt(bytes, 0, 6);\n if (header !== \"GIF87a\" && header !== \"GIF89a\") {\n return null;\n }\n const packed = bytes[10] || 0;\n return {\n format: header,\n width: readUint16Le(bytes, 6),\n height: readUint16Le(bytes, 8),\n bitDepth: `${(packed & 0x07) + 1} bit`,\n color: (packed & 0x80) ? \"Global color table\" : \"No global color table\",\n frames: countGifFrames(bytes)\n };\n}\n\nfunction parseWebpInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 16 || asciiAt(bytes, 0, 4) !== \"RIFF\" || asciiAt(bytes, 8, 4) !== \"WEBP\") {\n return null;\n }\n const chunk = asciiAt(bytes, 12, 4);\n if (chunk === \"VP8X\" && bytes.length >= 30) {\n const flags = bytes[20];\n return {\n format: \"WebP\",\n width: 1 + readUint24Le(bytes, 24),\n height: 1 + readUint24Le(bytes, 27),\n frames: (flags & 0x02) !== 0 ? countWebpAnimationFrames(bytes) : undefined,\n color: (flags & 0x10) !== 0 ? \"Alpha\" : undefined\n };\n }\n if (chunk === \"VP8 \" && bytes.length >= 30) {\n const start = 20;\n if (bytes[start + 3] === 0x9d && bytes[start + 4] === 0x01 && bytes[start + 5] === 0x2a) {\n return {\n format: \"WebP\",\n width: readUint16Le(bytes, start + 6) & 0x3fff,\n height: readUint16Le(bytes, start + 8) & 0x3fff\n };\n }\n }\n if (chunk === \"VP8L\" && bytes.length >= 25) {\n const b0 = bytes[21];\n const b1 = bytes[22];\n const b2 = bytes[23];\n const b3 = bytes[24];\n return {\n format: \"WebP\",\n width: 1 + (((b1 & 0x3f) << 8) | b0),\n height: 1 + (((b3 & 0x0f) << 10) | (b2 << 2) | ((b1 & 0xc0) >> 6)),\n color: \"Lossless\"\n };\n }\n return { format: \"WebP\", note: `未知 ${chunk || \"chunk\"} 头` };\n}\n\nfunction parseAvifInfo(bytes: Uint8Array): ImageInfo | null {\n const boxes = collectBmffBoxes(bytes, 0, bytes.length);\n const ftyp = boxes.find((box) => box.type === \"ftyp\");\n if (!ftyp) {\n return null;\n }\n const majorBrand = asciiAt(bytes, ftyp.dataStart, 4);\n const compatibleBrands = asciiAt(bytes, ftyp.dataStart + 8, Math.max(0, ftyp.dataEnd - ftyp.dataStart - 8));\n if (!/\\b(avif|avis|mif1|msf1|heic|heix|hevc|hevx)\\b/.test(`${majorBrand} ${compatibleBrands}`)) {\n return null;\n }\n const ispe = findBmffBox(bytes, boxes, \"ispe\");\n return {\n format: majorBrand === \"avis\" || compatibleBrands.includes(\"avis\") ? \"AVIF Sequence\" : majorBrand.startsWith(\"hei\") ? \"HEIF\" : \"AVIF\",\n width: ispe && ispe.dataStart + 12 <= ispe.dataEnd ? readUint32Be(bytes, ispe.dataStart + 4) : undefined,\n height: ispe && ispe.dataStart + 12 <= ispe.dataEnd ? readUint32Be(bytes, ispe.dataStart + 8) : undefined,\n note: `brand ${majorBrand}${compatibleBrands.trim() ? ` · ${formatBmffBrands(compatibleBrands)}` : \"\"}`\n };\n}\n\ntype BmffBox = {\n type: string;\n start: number;\n dataStart: number;\n dataEnd: number;\n end: number;\n};\n\nfunction collectBmffBoxes(bytes: Uint8Array, start: number, end: number): BmffBox[] {\n const boxes: BmffBox[] = [];\n let offset = start;\n while (offset + 8 <= end && boxes.length < 512) {\n let size = readUint32Be(bytes, offset);\n const type = asciiAt(bytes, offset + 4, 4);\n let headerSize = 8;\n if (!/^[A-Za-z0-9 _-]{4}$/.test(type)) {\n break;\n }\n if (size === 1 && offset + 16 <= end) {\n const high = readUint32Be(bytes, offset + 8);\n const low = readUint32Be(bytes, offset + 12);\n size = high > 0 ? end - offset : low;\n headerSize = 16;\n } else if (size === 0) {\n size = end - offset;\n }\n if (size < headerSize || offset + size > end) {\n break;\n }\n boxes.push({\n type,\n start: offset,\n dataStart: offset + headerSize,\n dataEnd: offset + size,\n end: offset + size\n });\n offset += size;\n }\n return boxes;\n}\n\nfunction findBmffBox(bytes: Uint8Array, boxes: BmffBox[], type: string): BmffBox | undefined {\n for (const box of boxes) {\n if (box.type === type) {\n return box;\n }\n if ([\"meta\", \"iprp\", \"ipco\", \"moov\", \"trak\", \"mdia\", \"minf\", \"stbl\"].includes(box.type)) {\n const childStart = box.type === \"meta\" ? box.dataStart + 4 : box.dataStart;\n const found = findBmffBox(bytes, collectBmffBoxes(bytes, childStart, box.dataEnd), type);\n if (found) {\n return found;\n }\n }\n }\n return undefined;\n}\n\nfunction formatBmffBrands(value: string): string {\n const brands = value.match(/.{1,4}/g)?.map((brand) => brand.trim()).filter(Boolean) || [];\n return brands.slice(0, 6).join(\", \");\n}\n\nfunction parseBmpInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 30 || asciiAt(bytes, 0, 2) !== \"BM\") {\n return null;\n }\n const dibSize = readUint32Le(bytes, 14);\n if (dibSize < 12) {\n return { format: \"BMP\", note: \"DIB header 太短\" };\n }\n if (dibSize === 12 && bytes.length >= 26) {\n return {\n format: \"BMP\",\n width: readUint16Le(bytes, 18),\n height: readUint16Le(bytes, 20),\n bitDepth: `${readUint16Le(bytes, 24)} bit`\n };\n }\n return {\n format: \"BMP\",\n width: readInt32Le(bytes, 18),\n height: Math.abs(readInt32Le(bytes, 22)),\n bitDepth: `${readUint16Le(bytes, 28)} bit`\n };\n}\n\nfunction parseIcoInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 6 || readUint16Le(bytes, 0) !== 0 || ![1, 2].includes(readUint16Le(bytes, 2))) {\n return null;\n }\n const count = readUint16Le(bytes, 4);\n if (count < 1 || bytes.length < 6 + count * 16) {\n return { format: \"ICO/CUR\", count };\n }\n const width = bytes[6] || 256;\n const height = bytes[7] || 256;\n return {\n format: readUint16Le(bytes, 2) === 1 ? \"ICO\" : \"CUR\",\n width,\n height,\n bitDepth: `${readUint16Le(bytes, 12)} bit`,\n count\n };\n}\n\nfunction parseSvgInfo(bytes: Uint8Array): ImageInfo | null {\n const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(0, Math.min(bytes.length, 8192)));\n if (!/<svg[\\s>]/i.test(text)) {\n return null;\n }\n const tag = text.match(/<svg\\b[^>]*>/i)?.[0] || \"\";\n const width = numberAttribute(tag, \"width\");\n const height = numberAttribute(tag, \"height\");\n const viewBox = tag.match(/\\bviewBox=[\"']([^\"']+)[\"']/i)?.[1]?.trim();\n const viewBoxParts = viewBox?.split(/[\\s,]+/).map(Number).filter(Number.isFinite);\n return {\n format: \"SVG\",\n width: width || (viewBoxParts?.length === 4 ? viewBoxParts[2] : undefined),\n height: height || (viewBoxParts?.length === 4 ? viewBoxParts[3] : undefined),\n note: viewBox ? `viewBox ${viewBox}` : undefined\n };\n}\n\nfunction countPngChunks(bytes: Uint8Array, chunkType: string): number {\n let offset = 8;\n let count = 0;\n while (offset + 12 <= bytes.length) {\n const length = readUint32Be(bytes, offset);\n const type = asciiAt(bytes, offset + 4, 4);\n if (type === chunkType) {\n count++;\n }\n offset += 12 + length;\n }\n return count;\n}\n\nfunction countGifFrames(bytes: Uint8Array): number {\n let count = 0;\n for (let index = 13; index < bytes.length; index++) {\n if (bytes[index] === 0x2c) {\n count++;\n }\n }\n return count || 1;\n}\n\nfunction countWebpAnimationFrames(bytes: Uint8Array): number {\n let count = 0;\n for (let offset = 12; offset + 8 <= bytes.length; ) {\n const type = asciiAt(bytes, offset, 4);\n const size = readUint32Le(bytes, offset + 4);\n if (type === \"ANMF\") {\n count++;\n }\n offset += 8 + size + (size % 2);\n }\n return count || 1;\n}\n\nfunction pngColorType(value: number): string {\n const colors: Record<number, string> = {\n 0: \"Grayscale\",\n 2: \"Truecolor\",\n 3: \"Indexed color\",\n 4: \"Grayscale + alpha\",\n 6: \"Truecolor + alpha\"\n };\n return colors[value] || `Unknown (${value})`;\n}\n\nfunction numberAttribute(tag: string, name: string): number | undefined {\n const value = tag.match(new RegExp(`\\\\b${name}=[\"']([0-9.]+)`, \"i\"))?.[1];\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction bytesMatch(bytes: Uint8Array, offset: number, expected: number[]): boolean {\n return expected.every((byte, index) => bytes[offset + index] === byte);\n}\n\nfunction dataView(bytes: Uint8Array): DataView {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"ascii\").decode(bytes.slice(offset, offset + length));\n}\n\nfunction readUint16Le(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getUint16(offset, true);\n}\n\nfunction readUint24Le(bytes: Uint8Array, offset: number): number {\n return bytes[offset] | (bytes[offset + 1] << 8) | (bytes[offset + 2] << 16);\n}\n\nfunction readUint32Le(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getUint32(offset, true);\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getUint32(offset, false);\n}\n\nfunction readInt32Le(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getInt32(offset, true);\n}\n\nfunction objectFit(fit: string): string {\n if (fit === \"cover\") {\n return \"cover\";\n }\n if (fit === \"actual\") {\n return \"none\";\n }\n if (fit === \"scale-down\") {\n return \"scale-down\";\n }\n return \"contain\";\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\n\nconst videoExtensions = new Set([\n \"mp4\",\n \"mpg\",\n \"mpeg\",\n \"mpe\",\n \"mpv\",\n \"webm\",\n \"ogv\",\n \"mov\",\n \"m4v\",\n \"avi\",\n \"mkv\",\n \"flv\",\n \"wmv\",\n \"3gp\",\n \"3g2\",\n \"m2ts\",\n \"m3u8\"\n]);\nconst videoMimeTypes = new Set([\n \"application/vnd.apple.mpegurl\",\n \"application/x-mpegurl\",\n \"application/mpegurl\",\n \"application/dash+xml\"\n]);\nconst hlsMimeTypes = new Set([\"application/vnd.apple.mpegurl\", \"application/x-mpegurl\", \"application/mpegurl\"]);\n\nexport function videoPlugin(): PreviewPlugin {\n return {\n name: \"video\",\n match(file) {\n return file.mimeType.startsWith(\"video/\") || videoMimeTypes.has(file.mimeType) || videoExtensions.has(file.extension);\n },\n async render(ctx) {\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const mimeType = ctx.file.mimeType.toLowerCase();\n const bytes = await readVideoBytes(ctx.file.blob);\n \n const container = document.createElement(\"div\");\n container.className = \"ofv-video-container\";\n const stage = document.createElement(\"div\");\n stage.className = \"ofv-video-stage\";\n\n const video = document.createElement(\"video\");\n video.className = \"ofv-media\";\n video.controls = true;\n video.playsInline = true;\n video.preload = \"metadata\";\n video.style.objectFit = ctx.options.fit === \"cover\" ? \"cover\" : \"contain\";\n \n const ext = ctx.file.extension.toLowerCase();\n const infoBar = createVideoInfo(parseVideoInfo(bytes, ext, mimeType, ctx.file.name));\n stage.append(video);\n container.append(stage, infoBar);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(container);\n\n let hlsInstance: any = null;\n let mpegtsPlayer: any = null;\n const isHls = ext === \"m3u8\" || hlsMimeTypes.has(mimeType);\n const isMpegTs = ext === \"m2ts\" || mimeType === \"video/mp2t\";\n const isDash = mimeType === \"application/dash+xml\";\n const isFlv = ext === \"flv\" || mimeType === \"video/x-flv\";\n const formatLabel = (ctx.file.extension || ctx.file.mimeType || \"video\").toUpperCase();\n\n const showTranscodeFallback = () => {\n video.style.display = \"none\";\n video.pause();\n \n // Remove any existing fallback UI first\n const oldFallback = stage.querySelector(\".ofv-fallback\");\n if (oldFallback) {\n oldFallback.remove();\n }\n\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n \n const title = document.createElement(\"strong\");\n title.textContent = `当前浏览器不支持直接播放该视频格式 (${formatLabel})`;\n \n const meta = document.createElement(\"span\");\n meta.textContent = \"建议转换为 MP4 格式播放,或直接下载在本地播放。\";\n \n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载视频\";\n \n fallback.append(title, meta, download);\n stage.append(fallback);\n };\n\n const onVideoError = () => {\n showTranscodeFallback();\n };\n\n video.addEventListener(\"error\", onVideoError);\n\n try {\n if (isDash) {\n showTranscodeFallback();\n } else if (isHls) {\n const Hls = (await import(\"hls.js\")).default;\n if (Hls.isSupported()) {\n hlsInstance = new Hls();\n hlsInstance.loadSource(url);\n hlsInstance.attachMedia(video);\n hlsInstance.on(Hls.Events.ERROR, (_event: any, data: any) => {\n if (data.fatal) {\n showTranscodeFallback();\n }\n });\n } else if (video.canPlayType(\"application/vnd.apple.mpegurl\")) {\n video.src = url;\n } else {\n showTranscodeFallback();\n }\n } else if (isFlv || isMpegTs) {\n const mpegts = (await import(\"mpegts.js\")).default;\n if (mpegts.isSupported()) {\n mpegtsPlayer = mpegts.createPlayer({\n type: isFlv ? \"flv\" : \"mpegts\",\n url: url\n });\n mpegtsPlayer.attachMediaElement(video);\n mpegtsPlayer.load();\n mpegtsPlayer.on(mpegts.Events.ERROR, () => {\n showTranscodeFallback();\n });\n } else {\n showTranscodeFallback();\n }\n } else {\n // Native playback for mp4, webm, mov, ogg, etc.\n video.src = url;\n }\n } catch (err) {\n showTranscodeFallback();\n }\n\n return {\n resize() {\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n },\n destroy() {\n video.removeEventListener(\"error\", onVideoError);\n video.pause();\n \n if (hlsInstance) {\n hlsInstance.destroy();\n }\n if (mpegtsPlayer) {\n mpegtsPlayer.unload();\n mpegtsPlayer.destroy();\n }\n\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n container.remove();\n }\n };\n }\n };\n}\n\ntype VideoInfo = {\n format: string;\n codec?: string;\n width?: number;\n height?: number;\n duration?: string;\n bitrate?: string;\n tracks?: number;\n variants?: number;\n segments?: number;\n note?: string;\n};\n\nasync function readVideoBytes(blob?: Blob): Promise<Uint8Array> {\n if (!blob) {\n return new Uint8Array();\n }\n return new Uint8Array(await blob.arrayBuffer().catch(() => new ArrayBuffer(0)));\n}\n\nfunction createVideoInfo(info: VideoInfo): HTMLElement {\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-media-info\";\n appendMediaInfo(bar, \"格式\", info.format);\n if (info.codec) {\n appendMediaInfo(bar, \"编码\", info.codec);\n }\n if (info.width && info.height) {\n appendMediaInfo(bar, \"尺寸\", `${info.width} x ${info.height}px`);\n }\n if (info.duration) {\n appendMediaInfo(bar, \"时长\", info.duration);\n }\n if (info.bitrate) {\n appendMediaInfo(bar, \"码率\", info.bitrate);\n }\n if (info.tracks !== undefined) {\n appendMediaInfo(bar, \"轨道\", String(info.tracks));\n }\n if (info.variants !== undefined) {\n appendMediaInfo(bar, \"变体\", String(info.variants));\n }\n if (info.segments !== undefined) {\n appendMediaInfo(bar, \"片段\", String(info.segments));\n }\n if (info.note) {\n appendMediaInfo(bar, \"说明\", info.note);\n }\n return bar;\n}\n\nfunction appendMediaInfo(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n item.className = \"ofv-media-info-item\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction parseVideoInfo(bytes: Uint8Array, extension: string, mimeType: string, fileName: string): VideoInfo {\n const fallback = (extension || mimeType || fileName.split(\".\").pop() || \"video\").toUpperCase();\n if (bytes.length === 0) {\n return { format: fallback, note: \"无法读取本地头信息\" };\n }\n return parseHlsInfo(bytes) || parseDashInfo(bytes) || parseMp4Info(bytes) || parseAviInfo(bytes) || parseEbmlInfo(bytes) || {\n format: fallback,\n note: \"暂未识别视频头结构\"\n };\n}\n\nfunction parseMp4Info(bytes: Uint8Array): VideoInfo | null {\n if (bytes.length < 12 || asciiAt(bytes, 4, 4) !== \"ftyp\") {\n return null;\n }\n const majorBrand = asciiAt(bytes, 8, 4);\n const info: VideoInfo = { format: [\"qt \"].includes(majorBrand) ? \"MOV\" : \"MP4\", codec: majorBrand };\n const atoms = collectMp4Atoms(bytes, 0, bytes.length);\n const moov = atoms.find((atom) => atom.type === \"moov\");\n if (moov) {\n const children = collectMp4Atoms(bytes, moov.start + moov.headerSize, moov.end);\n const mvhd = children.find((atom) => atom.type === \"mvhd\");\n if (mvhd) {\n const duration = readMp4MvhdDuration(bytes, mvhd.start + mvhd.headerSize);\n if (duration !== undefined) {\n info.duration = formatDuration(duration);\n }\n }\n const tracks = children.filter((atom) => atom.type === \"trak\");\n info.tracks = tracks.length;\n for (const track of tracks) {\n const tkhd = collectMp4Atoms(bytes, track.start + track.headerSize, track.end).find((atom) => atom.type === \"tkhd\");\n if (tkhd) {\n const size = readMp4TkhdSize(bytes, tkhd.start + tkhd.headerSize);\n if (size.width && size.height) {\n info.width = size.width;\n info.height = size.height;\n break;\n }\n }\n }\n }\n return info;\n}\n\ntype Mp4Atom = {\n type: string;\n start: number;\n end: number;\n headerSize: number;\n};\n\nfunction collectMp4Atoms(bytes: Uint8Array, start: number, end: number): Mp4Atom[] {\n const atoms: Mp4Atom[] = [];\n let offset = start;\n while (offset + 8 <= end) {\n let size = readUint32Be(bytes, offset);\n const type = asciiAt(bytes, offset + 4, 4);\n let headerSize = 8;\n if (size === 1 && offset + 16 <= end) {\n size = Number(readUint64Be(bytes, offset + 8));\n headerSize = 16;\n }\n if (size < headerSize || offset + size > end || !/^[\\w ]{4}$/.test(type)) {\n break;\n }\n atoms.push({ type, start: offset, end: offset + size, headerSize });\n offset += size;\n }\n return atoms;\n}\n\nfunction readMp4MvhdDuration(bytes: Uint8Array, offset: number): number | undefined {\n if (offset + 20 > bytes.length) {\n return undefined;\n }\n const version = bytes[offset];\n if (version === 1 && offset + 32 <= bytes.length) {\n const timescale = readUint32Be(bytes, offset + 20);\n const duration = readUint64Be(bytes, offset + 24);\n return timescale ? Number(duration) / timescale : undefined;\n }\n const timescale = readUint32Be(bytes, offset + 12);\n const duration = readUint32Be(bytes, offset + 16);\n return timescale ? duration / timescale : undefined;\n}\n\nfunction readMp4TkhdSize(bytes: Uint8Array, offset: number): { width?: number; height?: number } {\n const version = bytes[offset];\n const sizeOffset = version === 1 ? offset + 84 : offset + 72;\n if (sizeOffset + 8 > bytes.length) {\n return {};\n }\n return {\n width: readUint32Be(bytes, sizeOffset) / 65536,\n height: readUint32Be(bytes, sizeOffset + 4) / 65536\n };\n}\n\nfunction parseAviInfo(bytes: Uint8Array): VideoInfo | null {\n if (bytes.length < 64 || asciiAt(bytes, 0, 4) !== \"RIFF\" || asciiAt(bytes, 8, 4) !== \"AVI \") {\n return null;\n }\n const avihOffset = findAscii(bytes, \"avih\", 12);\n if (avihOffset < 0 || avihOffset + 56 > bytes.length) {\n return { format: \"AVI\", note: \"未找到 avih header\" };\n }\n const microSecPerFrame = readUint32Le(bytes, avihOffset + 8);\n const maxBytesPerSec = readUint32Le(bytes, avihOffset + 16);\n const totalFrames = readUint32Le(bytes, avihOffset + 24);\n const streams = readUint32Le(bytes, avihOffset + 32);\n const width = readUint32Le(bytes, avihOffset + 40);\n const height = readUint32Le(bytes, avihOffset + 44);\n return {\n format: \"AVI\",\n width,\n height,\n tracks: streams,\n bitrate: maxBytesPerSec ? `${Math.round((maxBytesPerSec * 8) / 1000)} kbps` : undefined,\n duration: microSecPerFrame && totalFrames ? formatDuration((microSecPerFrame * totalFrames) / 1_000_000) : undefined\n };\n}\n\nfunction parseEbmlInfo(bytes: Uint8Array): VideoInfo | null {\n if (bytes.length < 8 || bytes[0] !== 0x1a || bytes[1] !== 0x45 || bytes[2] !== 0xdf || bytes[3] !== 0xa3) {\n return null;\n }\n const root = collectEbmlElements(bytes, 0, bytes.length);\n const header = root.find((element) => element.id === 0x1a45dfa3);\n const headerChildren = header ? collectEbmlElements(bytes, header.dataStart, header.dataEnd) : [];\n const docTypeValue = readEbmlString(bytes, headerChildren.find((element) => element.id === 0x4282));\n const segment = root.find((element) => element.id === 0x18538067);\n const segmentChildren = segment ? collectEbmlElements(bytes, segment.dataStart, segment.dataEnd) : [];\n const info = parseEbmlSegmentInfo(bytes, segmentChildren.find((element) => element.id === 0x1549a966));\n const tracks = parseEbmlTracks(bytes, segmentChildren.find((element) => element.id === 0x1654ae6b));\n const docType = docTypeValue?.toLowerCase().includes(\"webm\")\n ? \"WebM\"\n : docTypeValue?.toLowerCase().includes(\"matroska\")\n ? \"Matroska\"\n : \"EBML\";\n return {\n format: docType,\n codec: tracks.codecs.length > 0 ? tracks.codecs.slice(0, 4).join(\", \") : undefined,\n width: tracks.width,\n height: tracks.height,\n duration: info.duration === undefined ? undefined : formatDuration(info.duration),\n tracks: tracks.count || undefined,\n note: docTypeValue ? `EBML DocType ${docTypeValue}` : \"已识别 EBML 容器\"\n };\n}\n\ntype EbmlElement = {\n id: number;\n start: number;\n dataStart: number;\n dataEnd: number;\n end: number;\n};\n\nfunction collectEbmlElements(bytes: Uint8Array, start: number, end: number, limit = 256): EbmlElement[] {\n const elements: EbmlElement[] = [];\n let offset = start;\n while (offset < end && elements.length < limit) {\n const id = readEbmlId(bytes, offset, end);\n if (!id) {\n break;\n }\n const size = readEbmlSize(bytes, id.offset, end);\n if (!size) {\n break;\n }\n const dataStart = size.offset;\n const dataEnd = size.unknown ? end : dataStart + size.value;\n if (dataEnd < dataStart || dataEnd > end) {\n break;\n }\n elements.push({\n id: id.value,\n start: offset,\n dataStart,\n dataEnd,\n end: dataEnd\n });\n offset = dataEnd;\n }\n return elements;\n}\n\nfunction readEbmlId(bytes: Uint8Array, offset: number, end: number): { value: number; offset: number } | undefined {\n const length = ebmlVintLength(bytes[offset]);\n if (!length || length > 4 || offset + length > end) {\n return undefined;\n }\n let value = 0;\n for (let index = 0; index < length; index++) {\n value = value * 256 + bytes[offset + index];\n }\n return { value, offset: offset + length };\n}\n\nfunction readEbmlSize(bytes: Uint8Array, offset: number, end: number): { value: number; offset: number; unknown: boolean } | undefined {\n const length = ebmlVintLength(bytes[offset]);\n if (!length || length > 8 || offset + length > end) {\n return undefined;\n }\n const firstMask = 0xff >> length;\n let value = bytes[offset] & firstMask;\n let max = firstMask;\n for (let index = 1; index < length; index++) {\n value = value * 256 + bytes[offset + index];\n max = max * 256 + 0xff;\n }\n return { value, offset: offset + length, unknown: value === max };\n}\n\nfunction ebmlVintLength(firstByte: number | undefined): number {\n if (!firstByte) {\n return 0;\n }\n for (let length = 1; length <= 8; length++) {\n if (firstByte & (0x80 >> (length - 1))) {\n return length;\n }\n }\n return 0;\n}\n\nfunction parseEbmlSegmentInfo(bytes: Uint8Array, element?: EbmlElement): { duration?: number } {\n if (!element) {\n return {};\n }\n const children = collectEbmlElements(bytes, element.dataStart, element.dataEnd);\n const timecodeScale = readEbmlUInt(bytes, children.find((child) => child.id === 0x2ad7b1)) || 1_000_000;\n const duration = readEbmlFloat(bytes, children.find((child) => child.id === 0x4489));\n return {\n duration: duration === undefined ? undefined : (duration * timecodeScale) / 1_000_000_000\n };\n}\n\nfunction parseEbmlTracks(bytes: Uint8Array, element?: EbmlElement): { count: number; codecs: string[]; width?: number; height?: number } {\n if (!element) {\n return { count: 0, codecs: [] };\n }\n const trackEntries = collectEbmlElements(bytes, element.dataStart, element.dataEnd).filter((child) => child.id === 0xae);\n const codecs: string[] = [];\n let width: number | undefined;\n let height: number | undefined;\n for (const track of trackEntries) {\n const children = collectEbmlElements(bytes, track.dataStart, track.dataEnd);\n const codec = readEbmlString(bytes, children.find((child) => child.id === 0x86));\n if (codec && !codecs.includes(codec)) {\n codecs.push(codec);\n }\n const type = readEbmlUInt(bytes, children.find((child) => child.id === 0x83));\n const video = children.find((child) => child.id === 0xe0);\n if (type === 1 && video) {\n const videoChildren = collectEbmlElements(bytes, video.dataStart, video.dataEnd);\n width = readEbmlUInt(bytes, videoChildren.find((child) => child.id === 0xb0)) || width;\n height = readEbmlUInt(bytes, videoChildren.find((child) => child.id === 0xba)) || height;\n }\n }\n return { count: trackEntries.length, codecs, width, height };\n}\n\nfunction readEbmlString(bytes: Uint8Array, element?: EbmlElement): string | undefined {\n if (!element || element.dataEnd <= element.dataStart || element.dataEnd - element.dataStart > 4096) {\n return undefined;\n }\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(element.dataStart, element.dataEnd)).replace(/\\0+$/g, \"\").trim();\n}\n\nfunction readEbmlUInt(bytes: Uint8Array, element?: EbmlElement): number | undefined {\n if (!element || element.dataEnd <= element.dataStart || element.dataEnd - element.dataStart > 6) {\n return undefined;\n }\n let value = 0;\n for (let offset = element.dataStart; offset < element.dataEnd; offset++) {\n value = value * 256 + bytes[offset];\n }\n return value;\n}\n\nfunction readEbmlFloat(bytes: Uint8Array, element?: EbmlElement): number | undefined {\n if (!element) {\n return undefined;\n }\n const data = view(bytes);\n if (element.dataEnd - element.dataStart === 4) {\n return data.getFloat32(element.dataStart, false);\n }\n if (element.dataEnd - element.dataStart === 8) {\n return data.getFloat64(element.dataStart, false);\n }\n return undefined;\n}\n\nfunction parseHlsInfo(bytes: Uint8Array): VideoInfo | null {\n const text = decodeTextHead(bytes);\n if (!text.startsWith(\"#EXTM3U\")) {\n return null;\n }\n const segments = countMatches(text, /^#EXTINF:/gm);\n const variants = countMatches(text, /^#EXT-X-STREAM-INF:/gm);\n const durations = [...text.matchAll(/^#EXTINF:([0-9.]+)/gm)].map((match) => Number(match[1])).filter(Number.isFinite);\n const bandwidth = text.match(/BANDWIDTH=(\\d+)/i)?.[1];\n return {\n format: \"HLS\",\n variants,\n segments,\n duration: durations.length > 0 ? formatDuration(durations.reduce((sum, value) => sum + value, 0)) : undefined,\n bitrate: bandwidth ? `${Math.round(Number(bandwidth) / 1000)} kbps` : undefined\n };\n}\n\nfunction parseDashInfo(bytes: Uint8Array): VideoInfo | null {\n const text = decodeTextHead(bytes);\n if (!/<MPD[\\s>]/i.test(text)) {\n return null;\n }\n return {\n format: \"DASH\",\n duration: isoDurationToClock(text.match(/mediaPresentationDuration=[\"']([^\"']+)[\"']/i)?.[1]),\n variants: countMatches(text, /<Representation\\b/gi),\n segments: countMatches(text, /<SegmentURL\\b|<S\\b/gi)\n };\n}\n\nfunction decodeTextHead(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(0, Math.min(bytes.length, 65536))).trim();\n}\n\nfunction countMatches(value: string, pattern: RegExp): number {\n return [...value.matchAll(pattern)].length;\n}\n\nfunction isoDurationToClock(value?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n const match = value.match(/^PT(?:(\\d+(?:\\.\\d+)?)H)?(?:(\\d+(?:\\.\\d+)?)M)?(?:(\\d+(?:\\.\\d+)?)S)?$/i);\n if (!match) {\n return value;\n }\n const seconds = Number(match[1] || 0) * 3600 + Number(match[2] || 0) * 60 + Number(match[3] || 0);\n return formatDuration(seconds);\n}\n\nfunction formatDuration(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds <= 0) {\n return \"\";\n }\n const total = Math.round(seconds);\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const rest = total % 60;\n return hours > 0 ? `${hours}:${String(minutes).padStart(2, \"0\")}:${String(rest).padStart(2, \"0\")}` : `${minutes}:${String(rest).padStart(2, \"0\")}`;\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"latin1\").decode(bytes.slice(offset, offset + length));\n}\n\nfunction findAscii(bytes: Uint8Array, value: string, start = 0): number {\n const encoded = new TextEncoder().encode(value);\n for (let offset = start; offset + encoded.length <= bytes.length; offset++) {\n if (encoded.every((byte, index) => bytes[offset + index] === byte)) {\n return offset;\n }\n }\n return -1;\n}\n\nfunction view(bytes: Uint8Array): DataView {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction readUint32Le(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, true);\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, false);\n}\n\nfunction readUint64Be(bytes: Uint8Array, offset: number): bigint {\n return (BigInt(readUint32Be(bytes, offset)) << 32n) | BigInt(readUint32Be(bytes, offset + 4));\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\n\nconst audioExtensions = new Set([\n \"mp3\",\n \"wav\",\n \"aif\",\n \"aiff\",\n \"aifc\",\n \"ogg\",\n \"oga\",\n \"aac\",\n \"m4a\",\n \"flac\",\n \"opus\",\n \"weba\",\n \"amr\",\n \"mid\",\n \"midi\",\n \"caf\",\n \"au\",\n \"snd\",\n \"wma\"\n]);\n\nexport function audioPlugin(): PreviewPlugin {\n return {\n name: \"audio\",\n match(file) {\n return file.mimeType.startsWith(\"audio/\") || audioExtensions.has(file.extension);\n },\n async render(ctx) {\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-audio\";\n const bytes = await readAudioBytes(ctx.file.blob);\n\n const title = document.createElement(\"div\");\n title.className = \"ofv-audio-title\";\n title.textContent = ctx.file.name;\n\n const audio = document.createElement(\"audio\");\n audio.src = url;\n audio.controls = true;\n audio.preload = \"metadata\";\n\n wrapper.append(title, audio, createAudioInfo(parseAudioInfo(bytes, ctx.file.extension, ctx.file.mimeType)));\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(wrapper);\n\n const formatLabel = (ctx.file.extension || ctx.file.mimeType || \"audio\").toUpperCase();\n const showPlaybackFallback = () => {\n audio.pause();\n audio.remove();\n\n if (wrapper.querySelector(\".ofv-fallback\")) {\n return;\n }\n\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const fallbackTitle = document.createElement(\"strong\");\n fallbackTitle.textContent = `当前浏览器不支持直接播放该音频格式 (${formatLabel})`;\n\n const meta = document.createElement(\"span\");\n meta.textContent = \"建议转换为 MP3/AAC/OGG 等浏览器兼容格式,或直接下载在本地播放。\";\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载音频\";\n\n fallback.append(fallbackTitle, meta, download);\n wrapper.append(fallback);\n };\n\n audio.addEventListener(\"error\", showPlaybackFallback);\n\n return {\n destroy() {\n audio.removeEventListener(\"error\", showPlaybackFallback);\n audio.pause();\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\ntype AudioInfo = {\n format: string;\n codec?: string;\n sampleRate?: number;\n channels?: number;\n bitDepth?: number;\n bitrate?: string;\n duration?: string;\n tags?: string;\n note?: string;\n};\n\nasync function readAudioBytes(blob?: Blob): Promise<Uint8Array> {\n if (!blob) {\n return new Uint8Array();\n }\n return new Uint8Array(await blob.arrayBuffer().catch(() => new ArrayBuffer(0)));\n}\n\nfunction createAudioInfo(info: AudioInfo): HTMLElement {\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-media-info\";\n appendMediaInfo(bar, \"格式\", info.format);\n if (info.codec) {\n appendMediaInfo(bar, \"编码\", info.codec);\n }\n if (info.sampleRate) {\n appendMediaInfo(bar, \"采样率\", `${info.sampleRate} Hz`);\n }\n if (info.channels) {\n appendMediaInfo(bar, \"声道\", String(info.channels));\n }\n if (info.bitDepth) {\n appendMediaInfo(bar, \"位深\", `${info.bitDepth} bit`);\n }\n if (info.bitrate) {\n appendMediaInfo(bar, \"码率\", info.bitrate);\n }\n if (info.duration) {\n appendMediaInfo(bar, \"时长\", info.duration);\n }\n if (info.tags) {\n appendMediaInfo(bar, \"标签\", info.tags);\n }\n if (info.note) {\n appendMediaInfo(bar, \"说明\", info.note);\n }\n return bar;\n}\n\nfunction appendMediaInfo(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n item.className = \"ofv-media-info-item\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction parseAudioInfo(bytes: Uint8Array, extension: string, mimeType: string): AudioInfo {\n const fallback = (extension || mimeType || \"audio\").toUpperCase();\n if (bytes.length === 0) {\n return { format: fallback, note: \"无法读取本地头信息\" };\n }\n return parseWaveInfo(bytes) || parseFlacInfo(bytes) || parseOggInfo(bytes) || parseAiffInfo(bytes) || parseAuInfo(bytes) || parseMidiInfo(bytes) || parseId3Mp3Info(bytes) || {\n format: fallback,\n note: \"暂未识别音频头结构\"\n };\n}\n\nfunction parseWaveInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 44 || asciiAt(bytes, 0, 4) !== \"RIFF\" || asciiAt(bytes, 8, 4) !== \"WAVE\") {\n return null;\n }\n let offset = 12;\n let channels = 0;\n let sampleRate = 0;\n let bitDepth = 0;\n let byteRate = 0;\n let dataBytes = 0;\n while (offset + 8 <= bytes.length) {\n const chunk = asciiAt(bytes, offset, 4);\n const size = readUint32Le(bytes, offset + 4);\n const dataOffset = offset + 8;\n if (chunk === \"fmt \" && dataOffset + 16 <= bytes.length) {\n channels = readUint16Le(bytes, dataOffset + 2);\n sampleRate = readUint32Le(bytes, dataOffset + 4);\n byteRate = readUint32Le(bytes, dataOffset + 8);\n bitDepth = readUint16Le(bytes, dataOffset + 14);\n }\n if (chunk === \"data\") {\n dataBytes = size;\n }\n offset += 8 + size + (size % 2);\n }\n return {\n format: \"WAV\",\n codec: \"PCM\",\n sampleRate,\n channels,\n bitDepth,\n bitrate: byteRate ? `${Math.round((byteRate * 8) / 1000)} kbps` : undefined,\n duration: byteRate && dataBytes ? formatDuration(dataBytes / byteRate) : undefined\n };\n}\n\nfunction parseFlacInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 42 || asciiAt(bytes, 0, 4) !== \"fLaC\") {\n return null;\n }\n let offset = 4;\n while (offset + 4 <= bytes.length) {\n const type = bytes[offset] & 0x7f;\n const length = (bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3];\n const dataOffset = offset + 4;\n if (type === 0 && dataOffset + 34 <= bytes.length) {\n const b10 = bytes[dataOffset + 10];\n const b11 = bytes[dataOffset + 11];\n const b12 = bytes[dataOffset + 12];\n const b13 = bytes[dataOffset + 13];\n const b14 = bytes[dataOffset + 14];\n const b15 = bytes[dataOffset + 15];\n const b16 = bytes[dataOffset + 16];\n const b17 = bytes[dataOffset + 17];\n const sampleRate = (b10 << 12) | (b11 << 4) | ((b12 & 0xf0) >> 4);\n const channels = ((b12 & 0x0e) >> 1) + 1;\n const bitDepth = (((b12 & 0x01) << 4) | ((b13 & 0xf0) >> 4)) + 1;\n const totalSamples = ((BigInt(b13 & 0x0f) << 32n) | (BigInt(b14) << 24n) | (BigInt(b15) << 16n) | (BigInt(b16) << 8n) | BigInt(b17));\n return {\n format: \"FLAC\",\n codec: \"FLAC\",\n sampleRate,\n channels,\n bitDepth,\n duration: sampleRate && totalSamples > 0n ? formatDuration(Number(totalSamples) / sampleRate) : undefined\n };\n }\n offset += 4 + length;\n }\n return { format: \"FLAC\", codec: \"FLAC\", note: \"未找到 STREAMINFO metadata block\" };\n}\n\nfunction parseId3Mp3Info(bytes: Uint8Array): AudioInfo | null {\n let offset = 0;\n let tags: string | undefined;\n if (bytes.length >= 10 && asciiAt(bytes, 0, 3) === \"ID3\") {\n tags = `ID3v2.${bytes[3]}.${bytes[4]}`;\n offset = 10 + readSynchsafe(bytes, 6);\n }\n for (let index = offset; index + 3 < Math.min(bytes.length, offset + 4096); index++) {\n if (bytes[index] === 0xff && (bytes[index + 1] & 0xe0) === 0xe0) {\n const versionBits = (bytes[index + 1] >> 3) & 0x03;\n const layerBits = (bytes[index + 1] >> 1) & 0x03;\n const bitrateIndex = (bytes[index + 2] >> 4) & 0x0f;\n const sampleIndex = (bytes[index + 2] >> 2) & 0x03;\n const channelMode = (bytes[index + 3] >> 6) & 0x03;\n return {\n format: \"MP3\",\n codec: `${mpegVersion(versionBits)} Layer ${mpegLayer(layerBits)}`,\n sampleRate: mp3SampleRate(versionBits, sampleIndex),\n channels: channelMode === 3 ? 1 : 2,\n bitrate: mp3Bitrate(versionBits, layerBits, bitrateIndex),\n tags\n };\n }\n }\n return tags ? { format: \"MP3\", tags, note: \"未在头部扫描到 MPEG frame\" } : null;\n}\n\nfunction parseOggInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 36 || asciiAt(bytes, 0, 4) !== \"OggS\") {\n return null;\n }\n const pages = collectOggPages(bytes);\n const firstPacket = pages[0]?.packets[0];\n const lastGranule = [...pages].reverse().find((page) => page.granule > 0n)?.granule;\n if (firstPacket && asciiAt(firstPacket, 0, 8) === \"OpusHead\") {\n const preSkip = firstPacket.length >= 12 ? readUint16Le(firstPacket, 10) : 0;\n const sampleRate = firstPacket.length >= 16 ? readUint32Le(firstPacket, 12) : 48000;\n const totalSamples = lastGranule === undefined ? undefined : lastGranule - BigInt(preSkip);\n return {\n format: \"Ogg\",\n codec: \"Opus\",\n channels: firstPacket[9],\n sampleRate,\n duration: totalSamples !== undefined && totalSamples > 0n ? formatDuration(Number(totalSamples) / 48000) : undefined,\n note: `${pages.length} 页`\n };\n }\n if (firstPacket && firstPacket[0] === 0x01 && asciiAt(firstPacket, 1, 6) === \"vorbis\") {\n const sampleRate = firstPacket.length >= 16 ? readUint32Le(firstPacket, 12) : undefined;\n return {\n format: \"Ogg\",\n codec: \"Vorbis\",\n channels: firstPacket[11],\n sampleRate,\n bitrate: firstPacket.length >= 28 ? oggVorbisBitrate(firstPacket) : undefined,\n duration: sampleRate && lastGranule !== undefined && lastGranule > 0n ? formatDuration(Number(lastGranule) / sampleRate) : undefined,\n note: `${pages.length} 页`\n };\n }\n return { format: \"Ogg\", note: pages.length > 0 ? `未识别 Ogg codec header,${pages.length} 页` : \"未识别 Ogg codec header\" };\n}\n\ntype OggPage = {\n granule: bigint;\n packets: Uint8Array[];\n};\n\nfunction collectOggPages(bytes: Uint8Array): OggPage[] {\n const pages: OggPage[] = [];\n let offset = 0;\n let continuedPacket: number[] = [];\n while (offset + 27 <= bytes.length && asciiAt(bytes, offset, 4) === \"OggS\") {\n const segmentCount = bytes[offset + 26];\n const segmentTableOffset = offset + 27;\n const dataOffset = segmentTableOffset + segmentCount;\n if (dataOffset > bytes.length) {\n break;\n }\n const sizes = Array.from(bytes.slice(segmentTableOffset, dataOffset));\n const payloadLength = sizes.reduce((sum, value) => sum + value, 0);\n const payloadEnd = dataOffset + payloadLength;\n if (payloadEnd > bytes.length) {\n break;\n }\n const pagePackets: Uint8Array[] = [];\n let packetOffset = dataOffset;\n for (const size of sizes) {\n continuedPacket.push(...bytes.slice(packetOffset, packetOffset + size));\n packetOffset += size;\n if (size < 255) {\n pagePackets.push(new Uint8Array(continuedPacket));\n continuedPacket = [];\n }\n }\n pages.push({\n granule: readUint64Le(bytes, offset + 6),\n packets: pagePackets\n });\n offset = payloadEnd;\n }\n return pages;\n}\n\nfunction oggVorbisBitrate(packet: Uint8Array): string | undefined {\n const nominal = readUint32Le(packet, 20);\n if (nominal > 0) {\n return `${Math.round(nominal / 1000)} kbps`;\n }\n const upper = readUint32Le(packet, 16);\n const lower = readUint32Le(packet, 24);\n if (upper > 0 && lower > 0) {\n return `${Math.round(((upper + lower) / 2) / 1000)} kbps`;\n }\n return undefined;\n}\n\nfunction parseAiffInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 12 || asciiAt(bytes, 0, 4) !== \"FORM\" || ![\"AIFF\", \"AIFC\"].includes(asciiAt(bytes, 8, 4))) {\n return null;\n }\n const format = asciiAt(bytes, 8, 4);\n let offset = 12;\n while (offset + 26 <= bytes.length) {\n const chunk = asciiAt(bytes, offset, 4);\n const size = readUint32Be(bytes, offset + 4);\n if (chunk === \"COMM\") {\n return {\n format,\n channels: readUint16Be(bytes, offset + 8),\n bitDepth: readUint16Be(bytes, offset + 14),\n sampleRate: Math.round(readAiffExtended(bytes, offset + 16))\n };\n }\n offset += 8 + size + (size % 2);\n }\n return { format, note: \"未找到 COMM chunk\" };\n}\n\nfunction parseAuInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 24 || asciiAt(bytes, 0, 4) !== \".snd\") {\n return null;\n }\n const dataOffset = readUint32Be(bytes, 4);\n const dataSize = readUint32Be(bytes, 8);\n const encoding = readUint32Be(bytes, 12);\n const sampleRate = readUint32Be(bytes, 16);\n const channels = readUint32Be(bytes, 20);\n const bitDepth = auBitDepth(encoding);\n const bytesPerSample = bitDepth ? bitDepth / 8 : 0;\n const resolvedDataSize = dataSize === 0xffffffff ? Math.max(0, bytes.length - dataOffset) : dataSize;\n return {\n format: \"AU/SND\",\n codec: auEncodingName(encoding),\n sampleRate,\n channels,\n bitDepth,\n duration: sampleRate && channels && bytesPerSample && resolvedDataSize ? formatDuration(resolvedDataSize / (sampleRate * channels * bytesPerSample)) : undefined,\n note: `data @ ${dataOffset} B`\n };\n}\n\nfunction auEncodingName(value: number): string {\n const names: Record<number, string> = {\n 1: \"8-bit μ-law\",\n 2: \"8-bit linear PCM\",\n 3: \"16-bit linear PCM\",\n 4: \"24-bit linear PCM\",\n 5: \"32-bit linear PCM\",\n 6: \"32-bit float\",\n 7: \"64-bit float\",\n 23: \"G.721 ADPCM\",\n 24: \"G.722 ADPCM\",\n 25: \"G.723 3-bit ADPCM\",\n 26: \"G.723 5-bit ADPCM\",\n 27: \"8-bit A-law\"\n };\n return names[value] || `encoding ${value}`;\n}\n\nfunction auBitDepth(value: number): number | undefined {\n const depths: Record<number, number> = {\n 1: 8,\n 2: 8,\n 3: 16,\n 4: 24,\n 5: 32,\n 6: 32,\n 7: 64,\n 27: 8\n };\n return depths[value];\n}\n\nfunction parseMidiInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 14 || asciiAt(bytes, 0, 4) !== \"MThd\") {\n return null;\n }\n return {\n format: \"MIDI\",\n codec: `SMF ${readUint16Be(bytes, 8)}`,\n channels: readUint16Be(bytes, 10),\n note: `${readUint16Be(bytes, 12)} ticks/quarter`\n };\n}\n\nfunction formatDuration(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds <= 0) {\n return \"\";\n }\n const total = Math.round(seconds);\n const minutes = Math.floor(total / 60);\n const rest = total % 60;\n return `${minutes}:${String(rest).padStart(2, \"0\")}`;\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"ascii\").decode(bytes.slice(offset, offset + length));\n}\n\nfunction view(bytes: Uint8Array): DataView {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction readUint16Le(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint16(offset, true);\n}\n\nfunction readUint16Be(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint16(offset, false);\n}\n\nfunction readUint32Le(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, true);\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, false);\n}\n\nfunction readUint64Le(bytes: Uint8Array, offset: number): bigint {\n return (BigInt(readUint32Le(bytes, offset + 4)) << 32n) | BigInt(readUint32Le(bytes, offset));\n}\n\nfunction readSynchsafe(bytes: Uint8Array, offset: number): number {\n return ((bytes[offset] & 0x7f) << 21) | ((bytes[offset + 1] & 0x7f) << 14) | ((bytes[offset + 2] & 0x7f) << 7) | (bytes[offset + 3] & 0x7f);\n}\n\nfunction mpegVersion(bits: number): string {\n return bits === 3 ? \"MPEG-1\" : bits === 2 ? \"MPEG-2\" : bits === 0 ? \"MPEG-2.5\" : \"MPEG\";\n}\n\nfunction mpegLayer(bits: number): string {\n return bits === 3 ? \"I\" : bits === 2 ? \"II\" : bits === 1 ? \"III\" : \"?\";\n}\n\nfunction mp3SampleRate(versionBits: number, index: number): number | undefined {\n const rates = versionBits === 3 ? [44100, 48000, 32000] : versionBits === 2 ? [22050, 24000, 16000] : [11025, 12000, 8000];\n return rates[index];\n}\n\nfunction mp3Bitrate(versionBits: number, layerBits: number, index: number): string | undefined {\n const mpeg1Layer3 = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320];\n const mpeg2Layer3 = [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160];\n if (index <= 0 || index >= 15 || layerBits !== 1) {\n return undefined;\n }\n return `${(versionBits === 3 ? mpeg1Layer3 : mpeg2Layer3)[index]} kbps`;\n}\n\nfunction readAiffExtended(bytes: Uint8Array, offset: number): number {\n const exponent = readUint16Be(bytes, offset) & 0x7fff;\n let mantissa = 0;\n for (let index = 0; index < 8; index++) {\n mantissa = mantissa * 256 + bytes[offset + 2 + index];\n }\n return mantissa * Math.pow(2, exponent - 16383 - 63);\n}\n","/// <reference path=\"../shims-text.d.ts\" />\nimport { isTextLike } from \"../detect\";\nimport type { PreviewPlugin } from \"../types\";\n\nconst langMap: Record<string, string> = {\n js: \"javascript\",\n mjs: \"javascript\",\n cjs: \"javascript\",\n ts: \"typescript\",\n tsx: \"tsx\",\n jsx: \"jsx\",\n html: \"markup\",\n htm: \"markup\",\n vue: \"markup\",\n xml: \"markup\",\n css: \"css\",\n scss: \"scss\",\n less: \"less\",\n json: \"json\",\n jsonc: \"json\",\n json5: \"json5\",\n ipynb: \"json\",\n jsonl: \"json\",\n ndjson: \"json\",\n toml: \"toml\",\n ini: \"ini\",\n properties: \"properties\",\n proto: \"protobuf\",\n tf: \"hcl\",\n tfvars: \"hcl\",\n hcl: \"hcl\",\n tex: \"latex\",\n latex: \"latex\",\n bib: \"latex\",\n gv: \"dot\",\n http: \"http\",\n py: \"python\",\n java: \"java\",\n cpp: \"cpp\",\n c: \"c\",\n h: \"c\",\n hpp: \"cpp\",\n cs: \"csharp\",\n go: \"go\",\n rs: \"rust\",\n rb: \"ruby\",\n swift: \"swift\",\n kt: \"kotlin\",\n kts: \"kotlin\",\n scala: \"scala\",\n lua: \"lua\",\n r: \"r\",\n dart: \"dart\",\n svelte: \"markup\",\n astro: \"markup\",\n elm: \"elm\",\n ex: \"elixir\",\n exs: \"elixir\",\n clj: \"clojure\",\n cljs: \"clojure\",\n erl: \"erlang\",\n hrl: \"erlang\",\n fs: \"fsharp\",\n fsx: \"fsharp\",\n hs: \"haskell\",\n lhs: \"haskell\",\n sql: \"sql\",\n sh: \"bash\",\n bash: \"bash\",\n zsh: \"bash\",\n fish: \"bash\",\n ps1: \"powershell\",\n bat: \"batch\",\n cmd: \"batch\",\n dockerfile: \"docker\",\n nginxconf: \"nginx\",\n gradle: \"groovy\",\n graphql: \"graphql\",\n gql: \"graphql\",\n yaml: \"yaml\",\n yml: \"yaml\",\n diff: \"diff\",\n patch: \"diff\",\n php: \"php\",\n md: \"markdown\",\n markdown: \"markdown\"\n};\nconst filenameLangMap: Record<string, string> = {\n dockerfile: \"docker\",\n makefile: \"makefile\",\n gemfile: \"ruby\",\n rakefile: \"ruby\",\n procfile: \"bash\",\n jenkinsfile: \"groovy\",\n vagrantfile: \"ruby\",\n brewfile: \"ruby\",\n podfile: \"ruby\",\n \"go.mod\": \"go\",\n \"go.sum\": \"go\",\n \"cargo.toml\": \"toml\",\n \"cargo.lock\": \"toml\",\n \".gitignore\": \"none\",\n \".dockerignore\": \"ignore\",\n \".npmrc\": \"none\",\n \".yarnrc\": \"none\",\n \".pnpmrc\": \"none\",\n \".editorconfig\": \"editorconfig\",\n \".browserslistrc\": \"none\",\n \".prettierrc\": \"json\",\n \".eslintrc\": \"json\",\n \".stylelintrc\": \"json\",\n readme: \"markdown\",\n changelog: \"markdown\",\n changes: \"markdown\",\n history: \"markdown\",\n license: \"none\",\n licence: \"none\",\n copying: \"none\",\n notice: \"none\",\n authors: \"none\",\n contributors: \"none\",\n codeowners: \"none\"\n};\nconst mimeLangMap: Record<string, string> = {\n \"text/markdown\": \"markdown\",\n \"text/html\": \"markup\",\n \"application/xml\": \"markup\",\n \"text/xml\": \"markup\",\n \"application/json\": \"json\",\n \"application/json5\": \"json5\",\n \"application/x-ipynb+json\": \"json\",\n \"application/x-ndjson\": \"json\",\n \"application/yaml\": \"yaml\",\n \"application/x-yaml\": \"yaml\",\n \"text/yaml\": \"yaml\",\n \"application/javascript\": \"javascript\",\n \"application/x-javascript\": \"javascript\",\n \"text/javascript\": \"javascript\",\n \"application/typescript\": \"typescript\",\n \"application/x-typescript\": \"typescript\",\n \"text/typescript\": \"typescript\",\n \"application/sql\": \"sql\",\n \"application/x-sh\": \"bash\",\n \"application/graphql\": \"graphql\",\n \"text/calendar\": \"none\",\n \"text/vcard\": \"none\",\n \"application/x-pem-file\": \"none\",\n \"application/x-x509-ca-cert\": \"none\",\n \"application/pkix-cert\": \"none\",\n \"application/x-httpd-php\": \"php\",\n \"application/x-tex\": \"latex\",\n \"message/http\": \"http\",\n \"text/x-bibtex\": \"latex\",\n \"text/x-hcl\": \"hcl\",\n \"text/x-protobuf\": \"protobuf\",\n \"text/vnd.graphviz\": \"dot\",\n \"text/css\": \"css\"\n};\n\nconst MAX_HIGHLIGHT_CHARS = 180_000;\nconst MAX_RENDER_CHARS = 600_000;\n\nfunction loadPrismCss(theme: \"light\" | \"dark\"): Promise<void> {\n const lightId = \"ofv-prism-css-light\";\n const darkId = \"ofv-prism-css-dark\";\n\n const activeId = theme === \"dark\" ? darkId : lightId;\n const inactiveId = theme === \"dark\" ? lightId : darkId;\n\n document.getElementById(inactiveId)?.remove();\n\n if (document.getElementById(activeId)) {\n return Promise.resolve();\n }\n\n const href =\n theme === \"dark\"\n ? \"https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism-tomorrow.min.css\"\n : \"https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism.min.css\";\n\n return new Promise((resolve, reject) => {\n const link = document.createElement(\"link\");\n link.id = activeId;\n link.rel = \"stylesheet\";\n link.href = href;\n link.onload = () => resolve();\n link.onerror = () => reject(new Error(`Failed to load Prism CSS: ${href}`));\n document.head.appendChild(link);\n });\n}\n\nexport function textPlugin(): PreviewPlugin {\n return {\n name: \"text\",\n match(file) {\n return isTextLike(file);\n },\n async render(ctx) {\n const ext = ctx.file.extension.toLowerCase();\n const lang = getTextLanguage(ctx.file.name, ext, ctx.file.mimeType);\n const defaultWrapped = lang === \"none\";\n const isMarkdown = lang === \"markdown\";\n const text = await readText(ctx.file.source).catch((error: unknown) => undefined);\n if (text === undefined) {\n const fallback = createTextFallback(ctx.file.name, ctx.file.url);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(fallback);\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n fallback.remove();\n }\n };\n }\n\n // Detect dark theme active state\n const isDark =\n ctx.host.parentElement?.classList.contains(\"ofv-theme-dark\") ||\n document.body.classList.contains(\"ofv-theme-dark\") ||\n (ctx.options.theme === \"auto\" && window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches) ||\n ctx.options.theme === \"dark\";\n\n // 1. Markdown path\n if (isMarkdown) {\n const [markedModule, PrismModule, DOMPurifyModule] = await Promise.all([\n import(\"marked\"),\n import(\"prismjs\"),\n import(\"dompurify\")\n ]);\n\n const parseMarkdown =\n markedModule.marked?.parse || markedModule.parse || (markedModule as any).default?.parse;\n const Prism = PrismModule.default || PrismModule;\n const DOMPurify = DOMPurifyModule.default || DOMPurifyModule;\n\n const container = document.createElement(\"div\");\n container.className = \"ofv-markdown-body\";\n container.innerHTML = DOMPurify.sanitize(parseMarkdown(text), {\n USE_PROFILES: { html: true },\n ADD_ATTR: [\"target\"]\n });\n secureMarkdownLinks(container);\n ctx.viewport.appendChild(container);\n\n // Highlight code blocks inside markdown\n try {\n const codeBlocks = container.querySelectorAll(\"pre code\");\n if (codeBlocks.length > 0) {\n await loadPrismCss(isDark ? \"dark\" : \"light\");\n codeBlocks.forEach((block) => {\n const parent = block.parentElement;\n if (parent && !parent.className.includes(\"language-\")) {\n parent.className = \"language-none\";\n }\n Prism.highlightElement(block);\n });\n }\n } catch (e) {\n console.warn(\"Prism highlight for markdown failed:\", e);\n }\n\n return {\n destroy() {\n container.remove();\n }\n };\n }\n\n // 2. Syntax-highlighted code path\n const [PrismModule] = await Promise.all([import(\"prismjs\")]);\n const Prism = PrismModule.default || PrismModule;\n\n // Load specific language component dynamically if needed\n if (lang !== \"none\") {\n try {\n if (lang === \"typescript\" || lang === \"tsx\") {\n await import(\"prismjs/components/prism-typescript\");\n } else if (lang === \"python\") {\n await import(\"prismjs/components/prism-python\");\n } else if (lang === \"json\") {\n await import(\"prismjs/components/prism-json\");\n } else if (lang === \"json5\") {\n await import(\"prismjs/components/prism-json5\");\n } else if (lang === \"yaml\") {\n await import(\"prismjs/components/prism-yaml\");\n } else if (lang === \"toml\") {\n await import(\"prismjs/components/prism-toml\");\n } else if (lang === \"ini\") {\n await import(\"prismjs/components/prism-ini\");\n } else if (lang === \"properties\") {\n await import(\"prismjs/components/prism-properties\");\n } else if (lang === \"editorconfig\") {\n await import(\"prismjs/components/prism-editorconfig\");\n } else if (lang === \"ignore\") {\n await import(\"prismjs/components/prism-ignore\");\n } else if (lang === \"protobuf\") {\n await import(\"prismjs/components/prism-protobuf\");\n } else if (lang === \"hcl\") {\n await import(\"prismjs/components/prism-hcl\");\n } else if (lang === \"latex\") {\n await import(\"prismjs/components/prism-latex\");\n } else if (lang === \"dot\") {\n await import(\"prismjs/components/prism-dot\");\n } else if (lang === \"http\") {\n await import(\"prismjs/components/prism-http\");\n } else if (lang === \"bash\") {\n await import(\"prismjs/components/prism-bash\");\n } else if (lang === \"powershell\") {\n await import(\"prismjs/components/prism-powershell\");\n } else if (lang === \"batch\") {\n await import(\"prismjs/components/prism-batch\");\n } else if (lang === \"docker\") {\n await import(\"prismjs/components/prism-docker\");\n } else if (lang === \"makefile\") {\n await import(\"prismjs/components/prism-makefile\");\n } else if (lang === \"ruby\") {\n await import(\"prismjs/components/prism-ruby\");\n } else if (lang === \"nginx\") {\n await import(\"prismjs/components/prism-nginx\");\n } else if (lang === \"groovy\") {\n await import(\"prismjs/components/prism-groovy\");\n } else if (lang === \"graphql\") {\n await import(\"prismjs/components/prism-graphql\");\n } else if (lang === \"csharp\") {\n await import(\"prismjs/components/prism-csharp\");\n } else if (lang === \"rust\") {\n await import(\"prismjs/components/prism-rust\");\n } else if (lang === \"go\") {\n await import(\"prismjs/components/prism-go\");\n } else if (lang === \"ruby\") {\n await import(\"prismjs/components/prism-ruby\");\n } else if (lang === \"swift\") {\n await import(\"prismjs/components/prism-swift\");\n } else if (lang === \"kotlin\") {\n await import(\"prismjs/components/prism-kotlin\");\n } else if (lang === \"scala\") {\n await import(\"prismjs/components/prism-scala\");\n } else if (lang === \"lua\") {\n await import(\"prismjs/components/prism-lua\");\n } else if (lang === \"r\") {\n await import(\"prismjs/components/prism-r\");\n } else if (lang === \"dart\") {\n await import(\"prismjs/components/prism-dart\");\n } else if (lang === \"elm\") {\n await import(\"prismjs/components/prism-elm\");\n } else if (lang === \"elixir\") {\n await import(\"prismjs/components/prism-elixir\");\n } else if (lang === \"clojure\") {\n await import(\"prismjs/components/prism-clojure\");\n } else if (lang === \"erlang\") {\n await import(\"prismjs/components/prism-erlang\");\n } else if (lang === \"fsharp\") {\n await import(\"prismjs/components/prism-fsharp\");\n } else if (lang === \"haskell\") {\n await import(\"prismjs/components/prism-haskell\");\n } else if (lang === \"sql\") {\n await import(\"prismjs/components/prism-sql\");\n } else if (lang === \"cpp\") {\n await import(\"prismjs/components/prism-c\");\n await import(\"prismjs/components/prism-cpp\");\n } else if (lang === \"java\") {\n await import(\"prismjs/components/prism-java\");\n } else if (lang === \"php\") {\n await import(\"prismjs/components/prism-markup-templating\");\n await import(\"prismjs/components/prism-php\");\n }\n } catch (e) {\n console.warn(`Prism failed to load language component for: ${lang}`, e);\n }\n }\n\n await loadPrismCss(isDark ? \"dark\" : \"light\").catch((error) => {\n console.warn(\"Prism CSS failed to load; rendering code without external theme:\", error);\n });\n\n const codeText = text.length > MAX_RENDER_CHARS ? text.slice(0, MAX_RENDER_CHARS) : text;\n const totalLines = countLines(text);\n const shownLines = countLines(codeText);\n const truncated = codeText.length < text.length;\n const shouldHighlight = codeText.length <= MAX_HIGHLIGHT_CHARS;\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-code-container\";\n if (truncated) {\n wrapper.classList.add(\"is-truncated\");\n }\n if (defaultWrapped) {\n wrapper.classList.add(\"is-wrapped\");\n }\n\n const header = document.createElement(\"div\");\n header.className = \"ofv-code-header\";\n\n const title = document.createElement(\"div\");\n title.className = \"ofv-code-title\";\n const fileName = document.createElement(\"strong\");\n fileName.textContent = ctx.file.name;\n const meta = document.createElement(\"span\");\n meta.textContent = [\n lang === \"none\" ? \"plain text\" : lang,\n `${totalLines.toLocaleString()} lines`,\n formatBytes(ctx.file.size ?? (ctx.file.source instanceof Blob ? ctx.file.source.size : text.length))\n ].join(\" · \");\n title.append(fileName, meta);\n\n const actions = document.createElement(\"div\");\n actions.className = \"ofv-code-actions\";\n\n const status = document.createElement(\"span\");\n status.className = \"ofv-code-status\";\n status.setAttribute(\"role\", \"status\");\n\n const wrapButton = document.createElement(\"button\");\n wrapButton.type = \"button\";\n wrapButton.className = \"ofv-code-action\";\n wrapButton.textContent = \"Wrap\";\n wrapButton.setAttribute(\"aria-pressed\", String(defaultWrapped));\n wrapButton.addEventListener(\"click\", () => {\n const wrapped = wrapper.classList.toggle(\"is-wrapped\");\n wrapButton.setAttribute(\"aria-pressed\", String(wrapped));\n });\n\n const copyButton = document.createElement(\"button\");\n copyButton.type = \"button\";\n copyButton.className = \"ofv-code-action\";\n copyButton.textContent = \"Copy\";\n copyButton.addEventListener(\"click\", async () => {\n copyButton.disabled = true;\n try {\n await copyToClipboard(text);\n status.textContent = \"Copied\";\n } catch {\n status.textContent = \"Copy failed\";\n } finally {\n copyButton.disabled = false;\n }\n });\n\n const downloadButton = document.createElement(\"button\");\n downloadButton.type = \"button\";\n downloadButton.className = \"ofv-code-action\";\n downloadButton.textContent = \"Download\";\n downloadButton.addEventListener(\"click\", () => {\n downloadText(ctx.file.name, text);\n status.textContent = \"Download ready\";\n });\n\n actions.append(wrapButton, copyButton, downloadButton, status);\n header.append(title, actions);\n const structureSummary = createTextStructureSummary(text, ext, lang, ctx.file.mimeType);\n\n const body = document.createElement(\"div\");\n body.className = \"ofv-code-body\";\n\n const gutter = document.createElement(\"pre\");\n gutter.className = \"ofv-code-gutter\";\n gutter.setAttribute(\"aria-hidden\", \"true\");\n gutter.textContent = createLineNumbers(shownLines);\n\n const pre = document.createElement(\"pre\");\n pre.className = `language-${lang}`;\n\n const code = document.createElement(\"code\");\n code.className = `language-${lang}`;\n code.textContent = codeText;\n\n pre.appendChild(code);\n body.append(gutter, pre);\n wrapper.append(header);\n if (structureSummary) {\n wrapper.append(structureSummary);\n }\n if (truncated) {\n const notice = document.createElement(\"div\");\n notice.className = \"ofv-code-notice\";\n notice.textContent = `文件较大,当前展示前 ${formatBytes(codeText.length)},复制和下载仍会使用完整内容。`;\n wrapper.append(notice);\n }\n if (!shouldHighlight) {\n const notice = document.createElement(\"div\");\n notice.className = \"ofv-code-notice\";\n notice.textContent = \"内容较大,已跳过语法高亮以保持滚动流畅。\";\n wrapper.append(notice);\n }\n wrapper.appendChild(body);\n ctx.viewport.appendChild(wrapper);\n\n if (shouldHighlight) {\n try {\n Prism.highlightElement(code);\n } catch (err) {\n console.error(\"Prism syntax highlighting failed:\", err);\n }\n }\n\n return {\n destroy() {\n wrapper.remove();\n }\n };\n }\n };\n}\n\nfunction getTextLanguage(fileName: string, extension: string, mimeType: string): string {\n const normalizedFileName = normalizeFileName(fileName);\n return (\n langMap[extension] ||\n filenameLangMap[normalizedFileName] ||\n filenameLangMap[normalizedFileName.split(\".\")[0]] ||\n mimeLangMap[mimeType.toLowerCase()] ||\n \"none\"\n );\n}\n\nfunction normalizeFileName(name: string): string {\n const baseName = name.split(/[\\\\/]/).pop() || name;\n return baseName.toLowerCase();\n}\n\nfunction createTextFallback(fileName: string, url?: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"文本预览失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = \"无法读取该文本内容,可能是远程文件不可访问或响应状态异常。\";\n\n fallback.append(title, meta);\n if (url) {\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"打开原文件\";\n fallback.append(download);\n }\n return fallback;\n}\n\nfunction secureMarkdownLinks(container: HTMLElement): void {\n for (const link of container.querySelectorAll<HTMLAnchorElement>(\"a[href]\")) {\n const href = link.getAttribute(\"href\") || \"\";\n if (!isSafeMarkdownHref(href)) {\n link.removeAttribute(\"href\");\n link.removeAttribute(\"target\");\n link.removeAttribute(\"rel\");\n continue;\n }\n if (/^(https?:)?\\/\\//i.test(href)) {\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n }\n }\n}\n\nfunction isSafeMarkdownHref(href: string): boolean {\n const trimmed = href.trim();\n return (\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"/\") ||\n trimmed.startsWith(\"./\") ||\n trimmed.startsWith(\"../\") ||\n /^(https?:|mailto:|tel:)/i.test(trimmed)\n );\n}\n\nfunction countLines(text: string): number {\n if (!text) {\n return 1;\n }\n return text.split(/\\r\\n|\\r|\\n/).length;\n}\n\nfunction createTextStructureSummary(text: string, extension: string, language: string, mimeType: string): HTMLElement | null {\n if (text.length > MAX_RENDER_CHARS) {\n return null;\n }\n const items = summarizeTextStructure(text, extension, language, mimeType);\n if (items.length === 0) {\n return null;\n }\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-text-structure\";\n for (const item of items) {\n const row = document.createElement(\"span\");\n const label = document.createElement(\"span\");\n label.textContent = item.label;\n const value = document.createElement(\"strong\");\n value.textContent = item.value;\n row.append(label, value);\n summary.append(row);\n }\n return summary;\n}\n\nfunction summarizeTextStructure(\n text: string,\n extension: string,\n language: string,\n mimeType: string\n): Array<{ label: string; value: string }> {\n if (extension === \"ipynb\" || mimeType === \"application/x-ipynb+json\") {\n return summarizeNotebook(text);\n }\n if (extension === \"ndjson\" || extension === \"jsonl\" || mimeType === \"application/x-ndjson\") {\n return summarizeNdjson(text);\n }\n if (language === \"json\" || language === \"json5\") {\n return summarizeJson(text);\n }\n return [];\n}\n\nfunction summarizeJson(text: string): Array<{ label: string; value: string }> {\n try {\n const data = JSON.parse(text) as unknown;\n if (Array.isArray(data)) {\n return [\n { label: \"结构\", value: \"Array\" },\n { label: \"条目\", value: String(data.length) }\n ];\n }\n if (data && typeof data === \"object\") {\n const keys = Object.keys(data as Record<string, unknown>);\n return [\n { label: \"结构\", value: \"Object\" },\n { label: \"键\", value: String(keys.length) },\n { label: \"预览\", value: keys.slice(0, 8).join(\", \") || \"无键\" }\n ];\n }\n return [{ label: \"结构\", value: typeof data }];\n } catch {\n return [];\n }\n}\n\nfunction summarizeNotebook(text: string): Array<{ label: string; value: string }> {\n try {\n const notebook = JSON.parse(text) as {\n cells?: Array<{ cell_type?: string; source?: string | string[] }>;\n metadata?: { kernelspec?: { display_name?: string; name?: string }; language_info?: { name?: string } };\n };\n if (!Array.isArray(notebook.cells)) {\n return summarizeJson(text);\n }\n const counts = new Map<string, number>();\n for (const cell of notebook.cells) {\n const type = cell.cell_type || \"unknown\";\n counts.set(type, (counts.get(type) || 0) + 1);\n }\n const kernel = notebook.metadata?.kernelspec?.display_name || notebook.metadata?.kernelspec?.name || notebook.metadata?.language_info?.name;\n return [\n { label: \"Notebook\", value: `${notebook.cells.length} cells` },\n { label: \"类型\", value: [...counts.entries()].map(([type, count]) => `${type} ${count}`).join(\", \") || \"未知\" },\n ...(kernel ? [{ label: \"Kernel\", value: kernel }] : [])\n ];\n } catch {\n return [];\n }\n}\n\nfunction summarizeNdjson(text: string): Array<{ label: string; value: string }> {\n const lines = text.split(/\\r\\n|\\r|\\n/).filter((line) => line.trim());\n let parsed = 0;\n let objects = 0;\n let arrays = 0;\n for (const line of lines.slice(0, 1000)) {\n try {\n const value = JSON.parse(line);\n parsed++;\n if (Array.isArray(value)) {\n arrays++;\n } else if (value && typeof value === \"object\") {\n objects++;\n }\n } catch {\n // keep counting valid rows only\n }\n }\n return [\n { label: \"NDJSON\", value: `${lines.length} lines` },\n { label: \"可解析\", value: String(parsed) },\n { label: \"类型\", value: `object ${objects}, array ${arrays}` }\n ];\n}\n\nfunction createLineNumbers(lines: number): string {\n return Array.from({ length: Math.max(lines, 1) }, (_, index) => String(index + 1)).join(\"\\n\");\n}\n\nfunction formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) {\n return \"0 B\";\n }\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const units = [\"KB\", \"MB\", \"GB\"];\n let value = bytes / 1024;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex += 1;\n }\n return `${value.toFixed(value >= 10 ? 1 : 2)} ${units[unitIndex]}`;\n}\n\nasync function copyToClipboard(text: string): Promise<void> {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.setAttribute(\"readonly\", \"\");\n textarea.style.position = \"fixed\";\n textarea.style.left = \"-9999px\";\n document.body.append(textarea);\n textarea.select();\n const copied = document.execCommand?.(\"copy\");\n textarea.remove();\n if (!copied) {\n throw new Error(\"Clipboard API is not available.\");\n }\n}\n\nfunction downloadText(fileName: string, text: string): void {\n const blob = new Blob([text], { type: \"text/plain;charset=utf-8\" });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = fileName;\n document.body.append(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n}\n\nasync function readText(source: unknown): Promise<string> {\n if (typeof source === \"string\") {\n const response = await fetch(source);\n if (!response.ok) {\n throw new Error(`Failed to fetch text file: ${response.status}`);\n }\n return response.text();\n }\n if (source instanceof Blob) {\n return source.text();\n }\n if (source instanceof ArrayBuffer) {\n return new TextDecoder().decode(source);\n }\n return String(source);\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin, PreviewSize } from \"../types\";\n\ntype PdfJsModule = typeof import(\"pdfjs-dist\");\n\nexport interface PdfPluginOptions {\n pdfjs?: PdfJsModule;\n workerSrc?: string;\n cMapUrl?: string;\n cMapPacked?: boolean;\n standardFontDataUrl?: string;\n useSystemFonts?: boolean;\n}\n\n// 2D affine transform matrix multiplication helper\nfunction multiplyMatrices(m1: number[], m2: number[]): number[] {\n return [\n m1[0] * m2[0] + m1[2] * m2[1],\n m1[1] * m2[0] + m1[3] * m2[1],\n m1[0] * m2[2] + m1[2] * m2[3],\n m1[1] * m2[2] + m1[3] * m2[3],\n m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n m1[1] * m2[4] + m1[3] * m2[5] + m1[5]\n ];\n}\n\nexport function pdfPlugin(options: PdfJsModule | PdfPluginOptions = {}): PreviewPlugin {\n return {\n name: \"pdf\",\n match(file) {\n return file.mimeType === \"application/pdf\" || file.extension === \"pdf\";\n },\n async render(ctx) {\n const normalizedOptions = normalizePdfOptions(options);\n const pdf = normalizedOptions.pdfjs || (await import(\"pdfjs-dist\"));\n configurePdfWorker(pdf, normalizedOptions.workerSrc);\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n\n const viewer = document.createElement(\"div\");\n viewer.className = \"ofv-pdf-viewer\";\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-pdf-summary\";\n const scroller = document.createElement(\"div\");\n scroller.className = \"ofv-pdf ofv-pdf-pages\";\n viewer.append(summary, scroller);\n ctx.viewport.append(viewer);\n\n const documentTask = pdf.getDocument({\n url,\n cMapUrl: normalizedOptions.cMapUrl ?? `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdf.version}/cmaps/`,\n cMapPacked: normalizedOptions.cMapPacked ?? true,\n standardFontDataUrl:\n normalizedOptions.standardFontDataUrl ??\n `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdf.version}/standard_fonts/`,\n useSystemFonts: normalizedOptions.useSystemFonts ?? true\n });\n const doc = await documentTask.promise.catch((error: unknown) => {\n viewer.remove();\n ctx.viewport.classList.add(\"ofv-center\");\n const fallback = createPdfFallback(ctx.file.name, url, normalizePdfError(error));\n ctx.viewport.append(fallback);\n return undefined;\n });\n if (!doc) {\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n documentTask.destroy?.();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n\n // Fast-extract page dimensions\n const pagesMeta: Array<{ width: number; height: number }> = [];\n for (let pageNumber = 1; pageNumber <= doc.numPages; pageNumber += 1) {\n try {\n const page = await doc.getPage(pageNumber);\n const baseViewport = page.getViewport({ scale: 1 });\n pagesMeta.push({\n width: baseViewport.width,\n height: baseViewport.height\n });\n } catch {\n pagesMeta.push({ width: 612, height: 792 });\n }\n }\n\n const pageStates: Array<{\n wrapper: HTMLDivElement;\n canvas: HTMLCanvasElement | null;\n renderTask: any | null;\n rendered: boolean;\n }> = [];\n\n let observer: IntersectionObserver | null = null;\n let currentSize = ctx.size;\n let zoomFactor = 1;\n\n const updateSummary = () => {\n renderPdfSummary(summary, doc.numPages, pagesMeta, ctx.options.fit, zoomFactor);\n ctx.toolbar?.setZoom(zoomFactor);\n };\n\n // Cancel page rendering and free canvas memory\n const clearPage = (pageIdx: number) => {\n const state = pageStates[pageIdx];\n if (!state || !state.rendered) return;\n\n if (state.renderTask) {\n try {\n state.renderTask.cancel();\n } catch (e) {\n // Ignore cancel errors\n }\n state.renderTask = null;\n }\n\n state.canvas = null;\n state.rendered = false;\n state.wrapper.replaceChildren();\n state.wrapper.append(createPageStatus(\"ofv-pdf-skeleton\", `页面 ${pageIdx + 1} 加载中...`));\n };\n\n // Perform actual on-demand rendering on canvas and build text layer\n const renderPage = async (pageIdx: number, size: PreviewSize) => {\n const state = pageStates[pageIdx];\n if (!state || state.rendered) return;\n\n state.rendered = true;\n\n try {\n const page = await doc.getPage(pageIdx + 1);\n const meta = pagesMeta[pageIdx];\n const scale =\n ctx.options.fit === \"actual\"\n ? zoomFactor\n : Math.max(0.05, Math.min(5, (getPdfAvailableWidth(size.width) / meta.width) * zoomFactor));\n \n const viewport = page.getViewport({ scale });\n const outputScale = getPdfOutputScale();\n const cssWidth = Math.floor(viewport.width);\n const cssHeight = Math.floor(viewport.height);\n\n const canvas = document.createElement(\"canvas\");\n canvas.className = \"ofv-pdf-page\";\n canvas.width = Math.floor(cssWidth * outputScale);\n canvas.height = Math.floor(cssHeight * outputScale);\n canvas.style.width = `${cssWidth}px`;\n canvas.style.height = `${cssHeight}px`;\n\n const context = canvas.getContext(\"2d\");\n if (!context) {\n throw new Error(\"Canvas 2D context is not available.\");\n }\n\n state.wrapper.replaceChildren(canvas);\n state.canvas = canvas;\n\n const renderTask = page.render({\n canvasContext: context,\n viewport,\n transform: outputScale === 1 ? undefined : [outputScale, 0, 0, outputScale, 0, 0]\n });\n state.renderTask = renderTask;\n \n await renderTask.promise;\n state.renderTask = null;\n\n // Build absolute-positioned selectable text layer overlay\n const textContent = await page.getTextContent();\n const textLayer = document.createElement(\"div\");\n textLayer.className = \"ofv-pdf-text-layer\";\n textLayer.style.width = `${cssWidth}px`;\n textLayer.style.height = `${cssHeight}px`;\n state.wrapper.appendChild(textLayer);\n\n for (const item of textContent.items) {\n if (!(\"str\" in item)) continue;\n const str = (item as any).str;\n if (!str.trim()) continue;\n\n const tx = multiplyMatrices(viewport.transform, (item as any).transform);\n const fontHeight = Math.sqrt(tx[2] * tx[2] + tx[3] * tx[3]);\n\n const span = document.createElement(\"span\");\n span.textContent = str;\n span.style.fontSize = `${fontHeight}px`;\n span.style.fontFamily = (item as any).fontName || \"sans-serif\";\n span.style.left = `${tx[4]}px`;\n span.style.top = `${tx[5] - fontHeight}px`;\n span.style.transformOrigin = \"0% 0%\";\n\n textLayer.appendChild(span);\n\n // Scale text width horizontally if specified to match visual width perfectly\n if ((item as any).width) {\n const itemWidth = (item as any).width * scale;\n const actualWidth = span.offsetWidth || span.getBoundingClientRect().width;\n if (actualWidth > 0 && Math.abs(actualWidth - itemWidth) > 1) {\n span.style.transform = `scaleX(${itemWidth / actualWidth})`;\n }\n }\n }\n } catch (err) {\n console.error(`Failed to render PDF page ${pageIdx + 1}:`, err);\n state.rendered = false;\n state.wrapper.replaceChildren(createPageStatus(\"ofv-pdf-error\", \"无法渲染该页面\"));\n }\n };\n\n const renderLayout = (size: PreviewSize) => {\n observer?.disconnect();\n updateSummary();\n scroller.replaceChildren();\n pageStates.length = 0;\n\n if (typeof IntersectionObserver !== \"undefined\") {\n observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const pageIdx = parseInt(entry.target.getAttribute(\"data-page-index\") || \"0\", 10);\n const state = pageStates[pageIdx];\n if (!state) return;\n\n if (entry.isIntersecting) {\n if (!state.rendered) {\n void renderPage(pageIdx, size);\n }\n } else {\n if (state.rendered && doc.numPages > 8) {\n clearPage(pageIdx);\n }\n }\n });\n },\n {\n root: scroller,\n rootMargin: \"400px 0px 400px 0px\"\n }\n );\n }\n\n for (let i = 0; i < doc.numPages; i++) {\n const meta = pagesMeta[i];\n const scale =\n ctx.options.fit === \"actual\"\n ? zoomFactor\n : Math.max(0.05, Math.min(5, (getPdfAvailableWidth(size.width) / meta.width) * zoomFactor));\n \n const w = Math.floor(meta.width * scale);\n const h = Math.floor(meta.height * scale);\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-pdf-page-wrapper\";\n wrapper.setAttribute(\"data-page-index\", String(i));\n wrapper.style.width = `${w}px`;\n wrapper.style.height = `${h}px`;\n wrapper.append(createPageStatus(\"ofv-pdf-skeleton\", `页面 ${i + 1} 加载中...`));\n\n scroller.appendChild(wrapper);\n\n pageStates.push({\n wrapper,\n canvas: null,\n renderTask: null,\n rendered: false\n });\n\n if (observer) {\n observer.observe(wrapper);\n } else {\n void renderPage(i, size);\n }\n }\n };\n\n renderLayout(ctx.size);\n\n let resizeTimer: number | undefined;\n return {\n canCommand(command) {\n return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n },\n command(command) {\n if (command === \"zoom-in\") {\n zoomFactor = Math.min(4, zoomFactor + 0.15);\n renderLayout(currentSize);\n return true;\n }\n if (command === \"zoom-out\") {\n zoomFactor = Math.max(0.25, zoomFactor - 0.15);\n renderLayout(currentSize);\n return true;\n }\n if (command === \"zoom-reset\") {\n zoomFactor = 1;\n renderLayout(currentSize);\n return true;\n }\n return false;\n },\n resize(size) {\n currentSize = size;\n window.clearTimeout(resizeTimer);\n resizeTimer = window.setTimeout(() => {\n renderLayout(size);\n }, 120);\n },\n destroy() {\n ctx.toolbar?.setZoom(undefined);\n window.clearTimeout(resizeTimer);\n observer?.disconnect();\n \n pageStates.forEach((state) => {\n if (state.renderTask) {\n try {\n state.renderTask.cancel();\n } catch (e) {\n // Ignore\n }\n }\n });\n pageStates.length = 0;\n\n revokeObjectUrl(url, isExternal);\n void doc.destroy();\n }\n };\n }\n };\n}\n\nfunction getPdfOutputScale(): number {\n if (typeof window === \"undefined\") {\n return 1;\n }\n return Math.max(1, Math.min(window.devicePixelRatio || 1, 2.5));\n}\n\nfunction getPdfAvailableWidth(width: number): number {\n if (!Number.isFinite(width) || width <= 0) {\n return 1;\n }\n const gutter = width < 160 ? 16 : 32;\n return Math.max(1, width - gutter);\n}\n\nfunction renderPdfSummary(\n summary: HTMLElement,\n pages: number,\n pagesMeta: Array<{ width: number; height: number }>,\n fit: string,\n zoomFactor: number\n): void {\n summary.replaceChildren();\n appendPdfSummary(summary, \"页数\", String(pages));\n const pageSizes = formatPdfPageSizes(pagesMeta);\n if (pageSizes) {\n appendPdfSummary(summary, \"页面尺寸\", pageSizes);\n }\n appendPdfSummary(summary, \"适配\", fit === \"actual\" ? \"原始大小\" : \"适合宽度\");\n appendPdfSummary(summary, \"缩放\", `${Math.round(zoomFactor * 100)}%`);\n}\n\nfunction appendPdfSummary(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction formatPdfPageSizes(pagesMeta: Array<{ width: number; height: number }>): string {\n const counts = new Map<string, number>();\n for (const page of pagesMeta) {\n const key = `${Math.round(page.width)} x ${Math.round(page.height)}`;\n counts.set(key, (counts.get(key) || 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 4)\n .map(([size, count]) => (count > 1 ? `${size} (${count})` : size))\n .join(\", \");\n}\n\nfunction normalizePdfOptions(options: PdfJsModule | PdfPluginOptions): PdfPluginOptions {\n if (\"getDocument\" in options) {\n return { pdfjs: options };\n }\n return options;\n}\n\nfunction createPageStatus(className: string, text: string): HTMLDivElement {\n const status = document.createElement(\"div\");\n status.className = className;\n status.textContent = text;\n return status;\n}\n\nfunction createPdfFallback(fileName: string, url: string, message: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"PDF 预览失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = `${message} ${fileName}`;\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载 PDF\";\n\n fallback.append(title, meta, download);\n return fallback;\n}\n\nfunction normalizePdfError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error || \"\");\n const name = typeof error === \"object\" && error !== null && \"name\" in error ? String((error as { name?: unknown }).name) : \"\";\n const lower = `${name} ${message}`.toLowerCase();\n if (lower.includes(\"password\")) {\n return \"该 PDF 受密码保护,当前无法在浏览器内直接预览。\";\n }\n if (lower.includes(\"invalid\") || lower.includes(\"missing\") || lower.includes(\"corrupt\")) {\n return \"该 PDF 文件可能已损坏或格式无效。\";\n }\n return \"当前浏览器无法加载该 PDF。\";\n}\n\nfunction configurePdfWorker(pdf: PdfJsModule, workerSrc?: string): void {\n if (workerSrc) {\n pdf.GlobalWorkerOptions.workerSrc = workerSrc;\n return;\n }\n\n if (!pdf.GlobalWorkerOptions.workerSrc && typeof window !== \"undefined\") {\n pdf.GlobalWorkerOptions.workerSrc = `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdf.version}/build/pdf.worker.mjs`;\n }\n}\n","import JSZip from \"jszip\";\nimport DOMPurify from \"dompurify\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer } from \"./utils\";\n\nconst epubMimeTypes = new Set([\"application/epub+zip\", \"application/x-epub+zip\"]);\n\ntype EpubManifestItem = {\n id: string;\n href: string;\n mediaType: string;\n properties: string;\n};\n\ntype EpubMetadata = {\n title: string;\n creator: string;\n language: string;\n identifier: string;\n publisher: string;\n modified: string;\n};\n\ntype EpubStructureSummary = {\n manifestItems: number;\n spineItems: number;\n chapters: number;\n images: number;\n styles: number;\n fonts: number;\n audio: number;\n video: number;\n navItems: number;\n tocItems: number;\n coverItems: number;\n otherItems: number;\n missingSpineItems: number;\n};\n\nexport function epubPlugin(): PreviewPlugin {\n return {\n name: \"epub\",\n match(file) {\n return file.extension === \"epub\" || epubMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-epub\");\n ctx.viewport.append(panel);\n\n try {\n const zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n await renderEpub(panel, zip);\n } catch (error) {\n renderEpubFallback(panel, error);\n }\n\n return {\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\nasync function renderEpub(panel: HTMLElement, zip: JSZip): Promise<void> {\n const opfPath = await resolvePackagePath(zip);\n const opfText = await zip.file(opfPath)?.async(\"text\");\n if (!opfText) {\n throw new Error(\"EPUB 缺少 OPF package 文件。\");\n }\n\n const opf = parseXml(opfText, \"EPUB package 文件解析失败。\");\n const basePath = directoryName(opfPath);\n const manifest = readManifest(opf);\n const spine = readSpine(opf, manifest);\n const metadata = readMetadata(opf);\n const structure = summarizeEpubStructure(opf, manifest, spine);\n const assets = await readEpubAssets(zip, basePath, manifest);\n\n const summary = createSection(\"EPUB 图书信息\");\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-epub-meta\";\n appendMeta(meta, \"标题\", metadata.title || \"未命名 EPUB\");\n appendMeta(meta, \"作者\", metadata.creator || \"未知\");\n appendMeta(meta, \"语言\", metadata.language || \"未声明\");\n if (metadata.publisher) {\n appendMeta(meta, \"出版方\", metadata.publisher);\n }\n if (metadata.identifier) {\n appendMeta(meta, \"标识\", metadata.identifier);\n }\n if (metadata.modified) {\n appendMeta(meta, \"修改时间\", metadata.modified);\n }\n appendMeta(meta, \"章节\", spine.length || \"未解析到阅读顺序\");\n appendMeta(meta, \"Manifest\", structure.manifestItems);\n appendMeta(meta, \"Spine\", structure.spineItems);\n appendMeta(meta, \"导航\", structure.navItems + structure.tocItems);\n appendMeta(meta, \"封面\", structure.coverItems);\n appendMeta(meta, \"图片\", structure.images);\n appendMeta(meta, \"样式\", structure.styles);\n appendMeta(meta, \"字体\", structure.fonts);\n if (structure.audio || structure.video) {\n appendMeta(meta, \"音视频\", `${structure.audio} / ${structure.video}`);\n }\n if (structure.otherItems) {\n appendMeta(meta, \"其他资源\", structure.otherItems);\n }\n if (structure.missingSpineItems) {\n appendMeta(meta, \"缺失章节引用\", structure.missingSpineItems);\n }\n summary.append(meta);\n panel.append(summary);\n\n const chapters = createSection(\"EPUB 正文预览\");\n const article = document.createElement(\"article\");\n article.className = \"ofv-epub-reader\";\n\n if (spine.length === 0) {\n const empty = document.createElement(\"p\");\n empty.textContent = \"未解析到可展示章节。\";\n article.append(empty);\n } else {\n for (const [index, item] of spine.slice(0, 40).entries()) {\n const chapterPath = joinZipPath(basePath, item.href);\n const chapterText = await zip.file(chapterPath)?.async(\"text\");\n if (!chapterText) {\n continue;\n }\n const section = document.createElement(\"section\");\n section.className = \"ofv-epub-chapter\";\n const heading = document.createElement(\"h3\");\n heading.textContent = chapterTitle(chapterText) || `章节 ${index + 1}`;\n const content = document.createElement(\"div\");\n content.className = \"ofv-epub-content\";\n content.innerHTML = sanitizeChapterHtml(rewriteAssetReferences(chapterText, assets, directoryName(chapterPath)));\n section.append(heading, content);\n article.append(section);\n }\n }\n\n chapters.append(article);\n panel.append(chapters);\n}\n\nasync function resolvePackagePath(zip: JSZip): Promise<string> {\n const containerXml = await zip.file(\"META-INF/container.xml\")?.async(\"text\");\n if (containerXml) {\n const container = parseXml(containerXml, \"EPUB container.xml 解析失败。\");\n const rootfile = Array.from(container.getElementsByTagName(\"*\")).find(\n (element) => element.localName === \"rootfile\" && getXmlAttribute(element, \"full-path\")\n );\n const fullPath = rootfile ? getXmlAttribute(rootfile, \"full-path\") : null;\n if (fullPath && zip.file(fullPath)) {\n return fullPath;\n }\n }\n\n const fallback = Object.values(zip.files).find((entry) => !entry.dir && entry.name.endsWith(\".opf\"));\n if (!fallback) {\n throw new Error(\"EPUB 未找到 package OPF 文件。\");\n }\n return fallback.name;\n}\n\nfunction readManifest(opf: Document): Map<string, EpubManifestItem> {\n const manifest = new Map<string, EpubManifestItem>();\n for (const item of Array.from(opf.getElementsByTagName(\"*\")).filter((element) => element.localName === \"item\")) {\n const id = getXmlAttribute(item, \"id\");\n const href = getXmlAttribute(item, \"href\");\n if (!id || !href) {\n continue;\n }\n manifest.set(id, {\n id,\n href,\n mediaType: getXmlAttribute(item, \"media-type\") || \"\",\n properties: getXmlAttribute(item, \"properties\") || \"\"\n });\n }\n return manifest;\n}\n\nfunction readSpine(opf: Document, manifest: Map<string, EpubManifestItem>): EpubManifestItem[] {\n const items: EpubManifestItem[] = [];\n for (const itemref of Array.from(opf.getElementsByTagName(\"*\")).filter((element) => element.localName === \"itemref\")) {\n const idref = getXmlAttribute(itemref, \"idref\");\n const item = idref ? manifest.get(idref) : undefined;\n if (item && isChapterMediaType(item.mediaType)) {\n items.push(item);\n }\n }\n if (items.length > 0) {\n return items;\n }\n return Array.from(manifest.values()).filter((item) => isChapterMediaType(item.mediaType));\n}\n\nfunction readMetadata(opf: Document): EpubMetadata {\n return {\n title: textByLocalName(opf, \"title\"),\n creator: textByLocalName(opf, \"creator\"),\n language: textByLocalName(opf, \"language\"),\n identifier: textByLocalName(opf, \"identifier\"),\n publisher: textByLocalName(opf, \"publisher\"),\n modified: metaPropertyText(opf, \"dcterms:modified\")\n };\n}\n\nfunction summarizeEpubStructure(opf: Document, manifest: Map<string, EpubManifestItem>, spine: EpubManifestItem[]): EpubStructureSummary {\n const items = Array.from(manifest.values());\n const chapters = spine.length;\n const images = items.filter((item) => item.mediaType.startsWith(\"image/\")).length;\n const styles = items.filter((item) => item.mediaType === \"text/css\").length;\n const fonts = items.filter((item) => item.mediaType.startsWith(\"font/\") || /font|opentype|truetype/i.test(item.mediaType)).length;\n const audio = items.filter((item) => item.mediaType.startsWith(\"audio/\")).length;\n const video = items.filter((item) => item.mediaType.startsWith(\"video/\")).length;\n const navItems = items.filter((item) => propertyTokens(item.properties).has(\"nav\")).length;\n const tocItems = items.filter((item) => item.mediaType === \"application/x-dtbncx+xml\" || propertyTokens(item.properties).has(\"toc\")).length;\n const coverItems = items.filter((item) => item.id.toLowerCase().includes(\"cover\") || propertyTokens(item.properties).has(\"cover-image\")).length;\n const otherItems = items.filter((item) => !isKnownEpubResource(item)).length;\n return {\n manifestItems: items.length,\n spineItems: spine.length,\n chapters,\n images,\n styles,\n fonts,\n audio,\n video,\n navItems,\n tocItems,\n coverItems,\n otherItems,\n missingSpineItems: Math.max(0, readSpineRefCount(opf) - spine.length)\n };\n}\n\nfunction isKnownEpubResource(item: EpubManifestItem): boolean {\n const properties = propertyTokens(item.properties);\n return (\n isChapterMediaType(item.mediaType) ||\n item.mediaType.startsWith(\"image/\") ||\n item.mediaType === \"text/css\" ||\n item.mediaType.startsWith(\"font/\") ||\n /font|opentype|truetype/i.test(item.mediaType) ||\n item.mediaType.startsWith(\"audio/\") ||\n item.mediaType.startsWith(\"video/\") ||\n item.mediaType === \"application/x-dtbncx+xml\" ||\n properties.has(\"nav\") ||\n properties.has(\"toc\")\n );\n}\n\nasync function readEpubAssets(\n zip: JSZip,\n basePath: string,\n manifest: Map<string, EpubManifestItem>\n): Promise<Map<string, string>> {\n const assets = new Map<string, string>();\n for (const item of manifest.values()) {\n if (!item.mediaType.startsWith(\"image/\")) {\n continue;\n }\n const path = joinZipPath(basePath, item.href);\n const entry = zip.file(path);\n if (!entry) {\n continue;\n }\n assets.set(path, `data:${item.mediaType};base64,${await entry.async(\"base64\")}`);\n }\n return assets;\n}\n\nfunction rewriteAssetReferences(html: string, assets: Map<string, string>, chapterDir: string): string {\n const documentHtml = new DOMParser().parseFromString(html, \"text/html\");\n for (const image of Array.from(documentHtml.querySelectorAll<HTMLImageElement>(\"img[src], image[href], image[xlink\\\\:href]\"))) {\n const raw = image.getAttribute(\"src\") || image.getAttribute(\"href\") || image.getAttribute(\"xlink:href\") || \"\";\n const path = joinZipPath(chapterDir, raw.split(\"#\")[0] || raw);\n const src = assets.get(path);\n if (!src) {\n continue;\n }\n image.setAttribute(\"src\", src);\n image.setAttribute(\"href\", src);\n image.setAttribute(\"xlink:href\", src);\n }\n return documentHtml.body.innerHTML;\n}\n\nfunction sanitizeChapterHtml(html: string): string {\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true, svg: true, svgFilters: false },\n ADD_ATTR: [\"target\", \"xlink:href\"]\n });\n}\n\nfunction chapterTitle(html: string): string {\n const documentHtml = new DOMParser().parseFromString(html, \"text/html\");\n const heading = documentHtml.querySelector(\"h1, h2, h3, title\");\n return heading?.textContent?.trim() || \"\";\n}\n\nfunction renderEpubFallback(panel: HTMLElement, error: unknown): void {\n panel.replaceChildren();\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = \"EPUB 解析失败\";\n const meta = document.createElement(\"span\");\n meta.textContent = error instanceof Error ? error.message : \"文件可能已损坏,或不是有效的 EPUB。\";\n fallback.append(title, meta);\n panel.append(fallback);\n}\n\nfunction parseXml(xml: string, message: string): Document {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n throw new Error(message);\n }\n return doc;\n}\n\nfunction appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nfunction textByLocalName(doc: Document, localName: string): string {\n return (\n Array.from(doc.getElementsByTagName(\"*\"))\n .find((element) => element.localName === localName)\n ?.textContent?.trim() || \"\"\n );\n}\n\nfunction metaPropertyText(doc: Document, property: string): string {\n return (\n Array.from(doc.getElementsByTagName(\"*\"))\n .find((element) => element.localName === \"meta\" && getXmlAttribute(element, \"property\") === property)\n ?.textContent?.trim() || \"\"\n );\n}\n\nfunction propertyTokens(value: string): Set<string> {\n return new Set(value.split(/\\s+/).map((item) => item.trim()).filter(Boolean));\n}\n\nfunction readSpineRefCount(opf: Document): number {\n return Array.from(opf.getElementsByTagName(\"*\")).filter((element) => element.localName === \"itemref\").length;\n}\n\nfunction getXmlAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction isChapterMediaType(mediaType: string): boolean {\n return mediaType === \"application/xhtml+xml\" || mediaType === \"text/html\" || mediaType === \"application/xml\";\n}\n\nfunction directoryName(path: string): string {\n const index = path.lastIndexOf(\"/\");\n return index >= 0 ? path.slice(0, index + 1) : \"\";\n}\n\nfunction joinZipPath(basePath: string, path: string): string {\n const parts = `${basePath}${path}`.split(\"/\");\n const normalized: string[] = [];\n for (const part of parts) {\n if (!part || part === \".\") {\n continue;\n }\n if (part === \"..\") {\n normalized.pop();\n } else {\n normalized.push(part);\n }\n }\n return normalized.join(\"/\");\n}\n","import type { PreviewFile } from \"../types\";\n\nexport async function readArrayBuffer(file: PreviewFile): Promise<ArrayBuffer> {\n if (file.source instanceof ArrayBuffer) {\n return file.source;\n }\n if (file.blob) {\n return file.blob.arrayBuffer();\n }\n if (typeof file.source === \"string\") {\n const response = await fetch(file.source);\n if (!response.ok) {\n throw new Error(`Failed to fetch file: ${response.status}`);\n }\n return response.arrayBuffer();\n }\n throw new Error(\"Unsupported file source.\");\n}\n\nexport async function readTextFile(file: PreviewFile): Promise<string> {\n if (typeof file.source === \"string\") {\n const response = await fetch(file.source);\n if (!response.ok) {\n throw new Error(`Failed to fetch text file: ${response.status}`);\n }\n return response.text();\n }\n if (file.blob) {\n return file.blob.text();\n }\n if (file.source instanceof ArrayBuffer) {\n return new TextDecoder().decode(file.source);\n }\n return String(file.source);\n}\n\nexport function createPanel(className = \"\"): HTMLElement {\n const panel = document.createElement(\"div\");\n panel.className = `ofv-panel ${className}`.trim();\n return panel;\n}\n\nexport function createSection(title: string): HTMLElement {\n const section = document.createElement(\"section\");\n section.className = \"ofv-section\";\n const heading = document.createElement(\"h3\");\n heading.textContent = title;\n section.append(heading);\n return section;\n}\n\nexport function appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nexport function escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n\nexport function bytesToText(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes);\n}\n\nexport function resolveFormat(\n file: Pick<PreviewFile, \"extension\" | \"mimeType\">,\n mimeMap: Record<string, string>\n): string {\n return file.extension || mimeMap[file.mimeType] || \"\";\n}\n","import JSZip from \"jszip\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer } from \"./utils\";\n\nconst xpsMimeTypes = new Set([\n \"application/oxps\",\n \"application/vnd.ms-xpsdocument\"\n]);\n\nexport function xpsPlugin(): PreviewPlugin {\n return {\n name: \"xps\",\n match(file) {\n return file.extension === \"xps\" || file.extension === \"oxps\" || xpsMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-xps\");\n ctx.viewport.append(panel);\n\n try {\n const zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n await renderXps(panel, zip);\n } catch (error) {\n renderXpsFallback(panel, error);\n }\n\n return {\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\nasync function renderXps(panel: HTMLElement, zip: JSZip): Promise<void> {\n const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n const fixedPages = entries\n .filter((entry) => /(?:^|\\/)Pages\\/[^/]+\\.fpage$/i.test(entry.name) || entry.name.endsWith(\".fpage\"))\n .sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true }));\n const resourceEntries = entries.filter((entry) => /\\.(?:png|jpe?g|tiff?|wdp|bmp|gif|odttf|ttf)$/i.test(entry.name));\n const pagePreviews = await Promise.all(\n fixedPages.slice(0, 80).map(async (entry, index) => {\n const xml = await entry.async(\"text\");\n return {\n entry,\n index,\n xml,\n info: parseXpsPageInfo(xml)\n };\n })\n );\n\n const summary = createSection(\"XPS 基础预览\");\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 XPS/OXPS 包内 FixedPage 文本、页面顺序和资源结构。完整版式渲染可后续接入专用渲染器。\";\n summary.append(note);\n summary.append(createXpsSummary(entries, fixedPages, resourceEntries, pagePreviews.map((page) => page.info)));\n panel.append(summary);\n\n const pages = createSection(`页面文本 ${fixedPages.length}`);\n const reader = document.createElement(\"div\");\n reader.className = \"ofv-xps-pages\";\n\n if (fixedPages.length === 0) {\n const empty = document.createElement(\"p\");\n empty.textContent = \"未解析到 FixedPage 页面。\";\n reader.append(empty);\n } else {\n for (const page of pagePreviews) {\n reader.append(renderXpsPage(page.xml, page.entry.name, page.index));\n }\n }\n pages.append(reader);\n panel.append(pages);\n\n const structure = createSection(`文件结构 ${entries.length}`);\n const list = document.createElement(\"ul\");\n for (const entry of entries.slice(0, 240)) {\n const item = document.createElement(\"li\");\n item.textContent = entry.name;\n list.append(item);\n }\n structure.append(list);\n panel.append(structure);\n}\n\ntype XpsPageInfo = {\n width?: number;\n height?: number;\n glyphs: number;\n imageBrushes: number;\n canvases: number;\n paths: number;\n};\n\nfunction createXpsSummary(\n entries: JSZip.JSZipObject[],\n fixedPages: JSZip.JSZipObject[],\n resourceEntries: JSZip.JSZipObject[],\n pageInfos: XpsPageInfo[]\n): HTMLElement {\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-xps-meta ofv-xps-summary\";\n appendMeta(meta, \"页面\", fixedPages.length);\n appendMeta(meta, \"文件\", entries.length);\n appendMeta(meta, \"FixedDocument\", entries.filter((entry) => /\\.fdoc$/i.test(entry.name)).length);\n appendMeta(meta, \"FixedDocSeq\", entries.filter((entry) => /\\.fdseq$/i.test(entry.name)).length);\n appendMeta(meta, \"关系文件\", entries.filter((entry) => /(?:^|\\/)_rels\\/[^/]+\\.rels$/i.test(entry.name) || entry.name.endsWith(\".rels\")).length);\n appendMeta(meta, \"资源\", resourceEntries.length);\n appendMeta(meta, \"图片资源\", resourceEntries.filter((entry) => /\\.(?:png|jpe?g|tiff?|wdp|bmp|gif)$/i.test(entry.name)).length);\n appendMeta(meta, \"字体资源\", resourceEntries.filter((entry) => /\\.(?:odttf|ttf)$/i.test(entry.name)).length);\n const glyphs = pageInfos.reduce((count, page) => count + page.glyphs, 0);\n appendMeta(meta, \"Glyphs\", glyphs);\n const pageSizes = formatXpsPageSizes(pageInfos);\n if (pageSizes) {\n appendMeta(meta, \"页面尺寸\", pageSizes);\n }\n const pageObjects = formatXpsPageObjects(pageInfos);\n if (pageObjects) {\n appendMeta(meta, \"页面对象\", pageObjects);\n }\n return meta;\n}\n\nfunction parseXpsPageInfo(xml: string): XpsPageInfo {\n const fallback = parseXpsPageInfoByRegex(xml);\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return fallback;\n }\n const root = doc.documentElement;\n const elements = Array.from(doc.getElementsByTagName(\"*\"));\n return {\n width: finiteNumber(getXmlAttribute(root, \"Width\"), fallback.width),\n height: finiteNumber(getXmlAttribute(root, \"Height\"), fallback.height),\n glyphs: elements.filter((element) => element.localName === \"Glyphs\").length,\n imageBrushes: elements.filter((element) => element.localName === \"ImageBrush\").length,\n canvases: elements.filter((element) => element.localName === \"Canvas\").length,\n paths: elements.filter((element) => element.localName === \"Path\").length\n };\n}\n\nfunction parseXpsPageInfoByRegex(xml: string): XpsPageInfo {\n return {\n width: finiteNumber(firstAttributeValue(xml, \"Width\"), undefined),\n height: finiteNumber(firstAttributeValue(xml, \"Height\"), undefined),\n glyphs: countMatches(xml, /<[\\w:.-]*Glyphs\\b/g),\n imageBrushes: countMatches(xml, /<[\\w:.-]*ImageBrush\\b/g),\n canvases: countMatches(xml, /<[\\w:.-]*Canvas\\b/g),\n paths: countMatches(xml, /<[\\w:.-]*Path\\b/g)\n };\n}\n\nfunction formatXpsPageSizes(pageInfos: XpsPageInfo[]): string {\n const counts = new Map<string, number>();\n for (const page of pageInfos) {\n if (!Number.isFinite(page.width) || !Number.isFinite(page.height)) {\n continue;\n }\n const key = `${Math.round(page.width as number)} x ${Math.round(page.height as number)}`;\n counts.set(key, (counts.get(key) || 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 4)\n .map(([size, count]) => (count > 1 ? `${size} (${count})` : size))\n .join(\", \");\n}\n\nfunction formatXpsPageObjects(pageInfos: XpsPageInfo[]): string {\n const totals = pageInfos.reduce(\n (result, page) => ({\n imageBrushes: result.imageBrushes + page.imageBrushes,\n canvases: result.canvases + page.canvases,\n paths: result.paths + page.paths\n }),\n { imageBrushes: 0, canvases: 0, paths: 0 }\n );\n return [\n totals.imageBrushes ? `ImageBrush ${totals.imageBrushes}` : \"\",\n totals.canvases ? `Canvas ${totals.canvases}` : \"\",\n totals.paths ? `Path ${totals.paths}` : \"\"\n ].filter(Boolean).join(\", \");\n}\n\nfunction renderXpsPage(xml: string, path: string, index: number): HTMLElement {\n const page = document.createElement(\"article\");\n page.className = \"ofv-xps-page\";\n const heading = document.createElement(\"h4\");\n heading.textContent = `Page ${index + 1}`;\n const pathMeta = document.createElement(\"span\");\n pathMeta.textContent = path;\n\n const text = document.createElement(\"div\");\n text.className = \"ofv-xps-text\";\n const fragments = extractXpsText(xml);\n if (fragments.length > 0) {\n for (const fragment of fragments) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = fragment;\n text.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"这一页未提取到 Glyphs 文本。\";\n text.append(empty);\n }\n\n page.append(heading, pathMeta, text);\n return page;\n}\n\nfunction extractXpsText(xml: string): string[] {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return extractXpsTextByRegex(xml);\n }\n return Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"Glyphs\")\n .map((glyph) => getXmlAttribute(glyph, \"UnicodeString\") || \"\")\n .map((value) => value.replace(/\\s+/g, \" \").trim())\n .filter(Boolean);\n}\n\nfunction extractXpsTextByRegex(xml: string): string[] {\n return [...xml.matchAll(/\\bUnicodeString=(?:\"([^\"]*)\"|'([^']*)')/g)]\n .map((match) => decodeXml(match[1] || match[2] || \"\"))\n .map((value) => value.replace(/\\s+/g, \" \").trim())\n .filter(Boolean);\n}\n\nfunction firstAttributeValue(xml: string, name: string): string | undefined {\n const match = xml.match(new RegExp(`\\\\b${name}=(?:\"([^\"]*)\"|'([^']*)')`));\n return match?.[1] || match?.[2];\n}\n\nfunction countMatches(value: string, pattern: RegExp): number {\n return [...value.matchAll(pattern)].length;\n}\n\nfunction renderXpsFallback(panel: HTMLElement, error: unknown): void {\n panel.replaceChildren();\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = \"XPS 解析失败\";\n const meta = document.createElement(\"span\");\n meta.textContent = error instanceof Error ? error.message : \"文件可能已损坏,或不是有效的 XPS/OXPS 包。\";\n fallback.append(title, meta);\n panel.append(fallback);\n}\n\nfunction appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nfunction getXmlAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction finiteNumber(value: unknown, fallback: number | undefined): number | undefined {\n const parsed = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction decodeXml(value: string): string {\n return value\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll(\"&\", \"&\")\n .replaceAll(\""\", '\"')\n .replaceAll(\"'\", \"'\");\n}\n","import JSZip from \"jszip\";\nimport DOMPurify from \"dompurify\";\nimport type { WorkBook } from \"xlsx\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst wordExtensions = new Set([\"docx\", \"docm\", \"doc\", \"dotx\", \"dotm\", \"dot\", \"rtf\", \"odt\", \"fodt\", \"wps\"]);\nconst sheetExtensions = new Set([\"xlsx\", \"xls\", \"xlsm\", \"xlsb\", \"xlt\", \"xltx\", \"xltm\", \"csv\", \"tsv\", \"ods\", \"fods\", \"numbers\", \"et\"]);\nconst presentationExtensions = new Set([\"pptx\", \"pptm\", \"ppt\", \"pps\", \"ppsx\", \"ppsm\", \"potx\", \"potm\", \"odp\", \"fodp\", \"key\", \"dps\"]);\nconst packagedOfficeCandidates = new Set([\"wps\", \"et\", \"dps\", \"numbers\", \"key\"]);\nconst SHEET_WINDOW_ROWS = 200;\nconst SHEET_WINDOW_COLUMNS = 80;\nconst PPTX_REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst officeMimeTypes = new Set([\n \"application/msword\",\n \"application/rtf\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/vnd.ms-word.document.macroenabled.12\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\",\n \"application/vnd.ms-word.template.macroenabled.12\",\n \"application/vnd.oasis.opendocument.text\",\n \"application/vnd.oasis.opendocument.text-flat-xml\",\n \"application/vnd.ms-works\",\n \"application/vnd.ms-excel\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\",\n \"application/vnd.ms-excel.sheet.macroenabled.12\",\n \"application/vnd.ms-excel.sheet.binary.macroenabled.12\",\n \"application/vnd.ms-excel.template.macroenabled.12\",\n \"application/vnd.oasis.opendocument.spreadsheet\",\n \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\",\n \"application/vnd.apple.numbers\",\n \"application/vnd.ms-powerpoint\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \"application/vnd.ms-powerpoint.presentation.macroenabled.12\",\n \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\",\n \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\",\n \"application/vnd.openxmlformats-officedocument.presentationml.template\",\n \"application/vnd.ms-powerpoint.template.macroenabled.12\",\n \"application/vnd.oasis.opendocument.presentation\",\n \"application/vnd.oasis.opendocument.presentation-flat-xml\",\n \"application/vnd.apple.keynote\"\n]);\nconst officeMimeFormatMap: Record<string, string> = {\n \"application/msword\": \"doc\",\n \"application/rtf\": \"rtf\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": \"docx\",\n \"application/vnd.ms-word.document.macroenabled.12\": \"docm\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\": \"dotx\",\n \"application/vnd.ms-word.template.macroenabled.12\": \"dotm\",\n \"application/vnd.oasis.opendocument.text\": \"odt\",\n \"application/vnd.oasis.opendocument.text-flat-xml\": \"fodt\",\n \"application/vnd.ms-works\": \"wps\",\n \"application/vnd.ms-excel\": \"xls\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\": \"xltx\",\n \"application/vnd.ms-excel.sheet.macroenabled.12\": \"xlsm\",\n \"application/vnd.ms-excel.sheet.binary.macroenabled.12\": \"xlsb\",\n \"application/vnd.ms-excel.template.macroenabled.12\": \"xltm\",\n \"application/vnd.oasis.opendocument.spreadsheet\": \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\": \"fods\",\n \"application/vnd.apple.numbers\": \"numbers\",\n \"application/vnd.ms-powerpoint\": \"ppt\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\": \"pptx\",\n \"application/vnd.ms-powerpoint.presentation.macroenabled.12\": \"pptm\",\n \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\": \"ppsx\",\n \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\": \"ppsm\",\n \"application/vnd.openxmlformats-officedocument.presentationml.template\": \"potx\",\n \"application/vnd.ms-powerpoint.template.macroenabled.12\": \"potm\",\n \"application/vnd.oasis.opendocument.presentation\": \"odp\",\n \"application/vnd.oasis.opendocument.presentation-flat-xml\": \"fodp\",\n \"application/vnd.apple.keynote\": \"key\"\n};\n\ntype LegacyOfficeTextSource = \"ascii\" | \"utf16\";\n\ntype PresentationSlideInsight = {\n title: string;\n layout?: string;\n textCount: number;\n imageCount: number;\n notesCount: number;\n hasTransition: boolean;\n animationCount: number;\n sampleTexts: string[];\n};\n\ntype PresentationInsight = {\n title: string;\n slideCount: number;\n imageCount: number;\n notesCount: number;\n transitionCount: number;\n animationCount: number;\n layouts: string[];\n slides: PresentationSlideInsight[];\n};\n\ntype IWorkMetadata = {\n title?: string;\n author?: string;\n company?: string;\n subject?: string;\n keywords?: string[];\n created?: string;\n modified?: string;\n};\n\nexport function officePlugin(): PreviewPlugin {\n return {\n name: \"office\",\n match(file) {\n return (\n wordExtensions.has(file.extension) ||\n sheetExtensions.has(file.extension) ||\n presentationExtensions.has(file.extension) ||\n officeMimeTypes.has(file.mimeType)\n );\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-office\");\n ctx.viewport.append(panel);\n const extension = resolveFormat(ctx.file, officeMimeFormatMap);\n const arrayBuffer = await readArrayBuffer(ctx.file);\n let disposeDocxFit: (() => void) | undefined;\n\n if (fileIsDocx(extension)) {\n disposeDocxFit = await renderDocx(panel, arrayBuffer);\n } else if (extension === \"rtf\") {\n renderPlainDocument(panel, \"RTF 文档\", rtfToText(await readTextFromBuffer(arrayBuffer)));\n } else if (extension === \"odt\") {\n await renderOdt(panel, arrayBuffer);\n } else if (extension === \"fodt\") {\n renderOpenDocumentXml(panel, \"FODT 文档\", await readTextFromBuffer(arrayBuffer));\n } else if (extension === \"fods\") {\n renderFlatOds(panel, await readTextFromBuffer(arrayBuffer));\n } else if (packagedOfficeCandidates.has(extension) && (await renderPackagedOfficePreview(panel, arrayBuffer, extension))) {\n // Rendered by package sniffing.\n } else if (sheetExtensions.has(extension)) {\n await renderSheet(panel, arrayBuffer, extension);\n } else if ([\"pptx\", \"pptm\", \"ppsx\", \"ppsm\", \"potx\", \"potm\"].includes(extension)) {\n await renderPptx(panel, arrayBuffer);\n } else if (extension === \"odp\") {\n await renderOdp(panel, arrayBuffer);\n } else if (extension === \"fodp\") {\n renderOpenDocumentPresentationXml(panel, await readTextFromBuffer(arrayBuffer));\n } else if (isLegacyOfficeBinary(extension)) {\n renderLegacyOfficeBinary(panel, extension, arrayBuffer);\n } else {\n renderUnsupportedOffice(panel, extension || ctx.file.extension || \"office\");\n }\n\n return {\n destroy() {\n disposeDocxFit?.();\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction fileIsDocx(extension: string): boolean {\n return extension === \"docx\" || extension === \"docm\" || extension === \"dotx\" || extension === \"dotm\";\n}\n\nasync function renderDocx(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<() => void> {\n const section = createSection(\"Word 文档\");\n const content = document.createElement(\"div\");\n content.className = \"ofv-docx-document\";\n section.append(content);\n panel.append(section);\n\n try {\n const docxPreview = await import(\"docx-preview\");\n await docxPreview.renderAsync(arrayBuffer, content, content, {\n className: \"ofv-docx\",\n inWrapper: true,\n breakPages: true,\n ignoreWidth: false,\n ignoreHeight: false,\n ignoreFonts: false,\n renderHeaders: true,\n renderFooters: true,\n renderFootnotes: true,\n renderEndnotes: true,\n renderComments: true,\n renderAltChunks: true,\n experimental: true,\n useBase64URL: true\n });\n return fitDocxPages(content);\n } catch (error) {\n content.replaceChildren();\n const fallbackNote = document.createElement(\"div\");\n fallbackNote.className = \"ofv-docx-fallback-note\";\n fallbackNote.textContent = \"高保真 DOCX 渲染失败,已切换为基础内容预览。\";\n content.append(fallbackNote);\n try {\n await renderDocxWithMammoth(content, arrayBuffer);\n } catch (fallbackError) {\n await renderDocxTextFallback(content, arrayBuffer);\n console.warn(\"DOCX content fallback failed, used raw OpenXML text extraction:\", fallbackError);\n }\n console.warn(\"DOCX layout preview failed, fell back to Mammoth:\", error);\n }\n return () => undefined;\n}\n\nfunction fitDocxPages(container: HTMLElement): () => void {\n const wrapper = container.querySelector<HTMLElement>(\".ofv-docx-wrapper\");\n if (!wrapper) {\n return () => undefined;\n }\n\n const update = () => {\n const frames = ensureDocxPageFrames(wrapper);\n if (frames.length === 0) {\n wrapper.style.removeProperty(\"--ofv-docx-scale\");\n return;\n }\n\n const availableWidth = Math.max(1, container.clientWidth - 48);\n const pageWidth = Math.max(\n 1,\n ...frames.map(({ page }) => {\n const rectWidth = page.getBoundingClientRect().width;\n return page.offsetWidth || rectWidth || parseCssPixelValue(page.style.width) || 794;\n })\n );\n const scale = Math.min(1, Math.max(0.35, availableWidth / pageWidth));\n wrapper.style.setProperty(\"--ofv-docx-scale\", formatCssNumber(scale));\n wrapper.style.setProperty(\"--ofv-docx-page-width\", `${pageWidth}px`);\n\n for (const { frame, page } of frames) {\n const pageHeight = page.offsetHeight || page.getBoundingClientRect().height || parseCssPixelValue(page.style.height);\n if (pageHeight > 0) {\n frame.style.height = `${Math.ceil(pageHeight * scale)}px`;\n }\n }\n };\n\n update();\n const timers = [0, 80, 240].map((delay) => window.setTimeout(update, delay));\n\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", update);\n return () => {\n timers.forEach((timer) => window.clearTimeout(timer));\n window.removeEventListener(\"resize\", update);\n };\n }\n\n const observer = new ResizeObserver(update);\n observer.observe(container);\n observer.observe(wrapper);\n return () => {\n timers.forEach((timer) => window.clearTimeout(timer));\n observer.disconnect();\n };\n}\n\nfunction ensureDocxPageFrames(wrapper: HTMLElement): Array<{ frame: HTMLElement; page: HTMLElement }> {\n const pages = Array.from(wrapper.querySelectorAll<HTMLElement>(\"section.ofv-docx\"));\n return pages.map((page) => {\n const parent = page.parentElement;\n if (parent?.classList.contains(\"ofv-docx-page-frame\")) {\n return { frame: parent, page };\n }\n const frame = document.createElement(\"div\");\n frame.className = \"ofv-docx-page-frame\";\n page.before(frame);\n frame.append(page);\n return { frame, page };\n });\n}\n\nfunction parseCssPixelValue(value: string): number {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction formatCssNumber(value: number): string {\n return Number.isFinite(value) ? value.toFixed(4).replace(/0+$/, \"\").replace(/\\.$/, \"\") : \"1\";\n}\n\nasync function renderDocxTextFallback(container: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const article = document.createElement(\"article\");\n article.className = \"ofv-document\";\n\n try {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const documentXml = await zip.file(\"word/document.xml\")?.async(\"text\");\n const paragraphs = documentXml ? extractWordParagraphs(documentXml) : [];\n if (paragraphs.length > 0) {\n for (const paragraphText of paragraphs) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = paragraphText;\n article.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"DOCX 内容解析失败,未提取到可展示文本。\";\n article.append(empty);\n }\n } catch {\n const empty = document.createElement(\"p\");\n empty.textContent = \"DOCX 内容解析失败,文件可能已损坏或不是有效的 DOCX。\";\n article.append(empty);\n }\n\n container.append(article);\n}\n\nasync function renderDocxWithMammoth(container: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const mammoth = await import(\"mammoth\");\n const result = await mammoth.convertToHtml(\n { arrayBuffer },\n {\n convertImage: mammoth.images.imgElement(async (image) => ({\n src: `data:${image.contentType};base64,${await image.read(\"base64\")}`\n }))\n }\n );\n const content = document.createElement(\"article\");\n content.className = \"ofv-document\";\n content.innerHTML = sanitizeHtml(result.value || \"<p>未解析到可展示内容。</p>\");\n container.append(content);\n\n if (result.messages.length > 0) {\n const notes = document.createElement(\"details\");\n notes.className = \"ofv-details\";\n const summary = document.createElement(\"summary\");\n summary.textContent = `解析提示 ${result.messages.length}`;\n const list = document.createElement(\"ul\");\n for (const message of result.messages) {\n const item = document.createElement(\"li\");\n item.textContent = message.message;\n list.append(item);\n }\n notes.append(summary, list);\n container.append(notes);\n }\n}\n\nasync function renderOdt(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const content = zip.file(\"content.xml\");\n if (!content) {\n renderPlainDocument(panel, \"ODT 文档\", \"未找到 content.xml。\");\n return;\n }\n renderOpenDocumentXml(panel, \"ODT 文档\", await content.async(\"text\"));\n}\n\nfunction renderOpenDocumentXml(panel: HTMLElement, title: string, xml: string): void {\n const section = createSection(title);\n const article = document.createElement(\"article\");\n article.className = \"ofv-document\";\n const blocks = extractOpenDocumentBlocks(xml);\n if (blocks.length > 0) {\n for (const block of blocks) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = block;\n article.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"未提取到可展示文本。\";\n article.append(empty);\n }\n section.append(article);\n panel.append(section);\n}\n\nfunction renderPlainDocument(panel: HTMLElement, title: string, text: string): void {\n const section = createSection(title);\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = text || \"未提取到可展示文本。\";\n section.append(pre);\n panel.append(section);\n}\n\nasync function renderSheet(\n panel: HTMLElement,\n arrayBuffer: ArrayBuffer,\n extension: string\n): Promise<void> {\n const xlsx = await import(\"xlsx\");\n let workbook: WorkBook;\n try {\n workbook = xlsx.read(arrayBuffer, { type: \"array\" }) as WorkBook;\n } catch (error) {\n if (isLegacyOfficeBinary(extension)) {\n renderLegacyOfficeBinary(panel, extension, arrayBuffer, `表格解析失败:${normalizeOfficeError(error)}`);\n return;\n }\n renderSheetFallback(panel, extension, normalizeOfficeError(error));\n return;\n }\n const chartPreviews = await readWorkbookCharts(arrayBuffer).catch(() => []);\n const tabs = document.createElement(\"div\");\n tabs.className = \"ofv-tabs\";\n tabs.setAttribute(\"role\", \"tablist\");\n const content = document.createElement(\"div\");\n content.className = \"ofv-sheet\";\n content.setAttribute(\"role\", \"tabpanel\");\n const buttons = new Map<string, HTMLButtonElement>();\n\n const renderSheetByName = (sheetName: string, sheetIndex: number) => {\n content.replaceChildren();\n buttons.forEach((button, name) => {\n const active = name === sheetName;\n button.classList.toggle(\"is-active\", active);\n button.setAttribute(\"aria-selected\", String(active));\n });\n content.setAttribute(\"aria-label\", sheetName);\n\n const heading = document.createElement(\"h3\");\n heading.textContent = sheetName;\n const sheet = workbook.Sheets[sheetName];\n const range = xlsx.utils.decode_range(sheet[\"!ref\"] || \"A1:A1\");\n const rowCount = range.e.r - range.s.r + 1;\n const columnCount = range.e.c - range.s.c + 1;\n const formulaRows = collectFormulaRows(sheet, range, xlsx.utils.encode_cell);\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-sheet-summary\";\n summary.textContent = `${rowCount} 行 x ${columnCount} 列${\n formulaRows.length > 0 ? `,包含 ${formulaRows.length} 个公式单元格` : \"\"\n }`;\n\n const tableWrapper = document.createElement(\"div\");\n tableWrapper.className = \"ofv-table-scroll\";\n const viewport = createSheetViewport(rowCount, columnCount);\n const windowControls = createSheetWindowControls(viewport, () => renderTableWindow());\n const renderTableWindow = () => {\n tableWrapper.replaceChildren(\n createWorkbookSheetTable(\n sheet,\n range,\n sheetIndex,\n viewport,\n xlsx.utils.encode_cell,\n xlsx.utils.format_cell\n )\n );\n windowControls?.update();\n };\n\n content.append(heading, summary);\n if (windowControls) {\n content.append(windowControls.element);\n }\n content.append(tableWrapper);\n renderTableWindow();\n\n if (formulaRows.length > 0) {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-formula-list\";\n const detailsSummary = document.createElement(\"summary\");\n detailsSummary.textContent = \"公式明细\";\n const list = document.createElement(\"ul\");\n for (const item of formulaRows.slice(0, 200)) {\n const row = document.createElement(\"li\");\n row.textContent = `${item.address}: ${item.formula}`;\n list.append(row);\n }\n if (formulaRows.length > 200) {\n const row = document.createElement(\"li\");\n row.textContent = `还有 ${formulaRows.length - 200} 个公式未展示。`;\n list.append(row);\n }\n details.append(detailsSummary, list);\n content.append(details);\n }\n };\n\n if (workbook.SheetNames.length === 0) {\n content.textContent = extension === \"numbers\" ? \"Numbers 文件需要服务端转换后高保真预览。\" : \"未解析到表格。\";\n } else {\n for (const [index, sheetName] of workbook.SheetNames.entries()) {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.setAttribute(\"role\", \"tab\");\n button.setAttribute(\"aria-selected\", \"false\");\n button.textContent = sheetName;\n button.title = sheetName;\n button.addEventListener(\"click\", () => renderSheetByName(sheetName, index));\n buttons.set(sheetName, button);\n tabs.append(button);\n if (index === 0) {\n renderSheetByName(sheetName, index);\n }\n }\n }\n\n panel.append(tabs, content);\n if (chartPreviews.length > 0) {\n panel.append(renderChartPreviewSection(chartPreviews));\n }\n}\n\nfunction renderSheetFallback(panel: HTMLElement, extension: string, detail: string): void {\n const section = createSection(\"表格解析失败\");\n const title = document.createElement(\"p\");\n title.textContent = `.${extension || \"sheet\"} 文件无法解析为可预览表格。`;\n const meta = document.createElement(\"p\");\n meta.textContent = detail;\n const support = document.createElement(\"p\");\n support.textContent = \"请确认文件未加密、未损坏,或先转换为 XLSX/CSV/ODS 后再预览。\";\n section.append(title, meta, support);\n panel.append(section);\n}\n\ntype ChartPreview = {\n name: string;\n type: string;\n title: string;\n categories: string[];\n series: Array<{ name: string; values: number[] }>;\n};\n\ntype ParsedSheet = {\n name: string;\n rows: string[][];\n formulas: Array<{ address: string; formula: string }>;\n};\n\nfunction renderFlatOds(panel: HTMLElement, xml: string): void {\n const sheets = parseFlatOds(xml);\n renderParsedSheets(panel, sheets, \"FODS 文件未解析到表格。\");\n}\n\nfunction renderParsedSheets(panel: HTMLElement, sheets: ParsedSheet[], emptyMessage: string): void {\n const tabs = document.createElement(\"div\");\n tabs.className = \"ofv-tabs\";\n tabs.setAttribute(\"role\", \"tablist\");\n const content = document.createElement(\"div\");\n content.className = \"ofv-sheet\";\n content.setAttribute(\"role\", \"tabpanel\");\n const buttons = new Map<string, HTMLButtonElement>();\n\n const renderSheetByIndex = (sheet: ParsedSheet, sheetIndex: number) => {\n content.replaceChildren();\n buttons.forEach((button, name) => {\n const active = name === sheet.name;\n button.classList.toggle(\"is-active\", active);\n button.setAttribute(\"aria-selected\", String(active));\n });\n content.setAttribute(\"aria-label\", sheet.name);\n\n const heading = document.createElement(\"h3\");\n heading.textContent = sheet.name;\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-sheet-summary\";\n const rowCount = sheet.rows.length;\n const columnCount = Math.max(0, ...sheet.rows.map((row) => row.length));\n summary.textContent = `${rowCount} 行 x ${columnCount} 列${\n sheet.formulas.length > 0 ? `,包含 ${sheet.formulas.length} 个公式单元格` : \"\"\n }`;\n\n const tableWrapper = document.createElement(\"div\");\n tableWrapper.className = \"ofv-table-scroll\";\n const viewport = createSheetViewport(rowCount, columnCount);\n const windowControls = createSheetWindowControls(viewport, () => renderTableWindow());\n const renderTableWindow = () => {\n tableWrapper.replaceChildren(createParsedSheetTable(sheet, sheetIndex, viewport));\n windowControls?.update();\n };\n\n content.append(heading, summary);\n if (windowControls) {\n content.append(windowControls.element);\n }\n content.append(tableWrapper);\n renderTableWindow();\n\n if (sheet.formulas.length > 0) {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-formula-list\";\n const detailsSummary = document.createElement(\"summary\");\n detailsSummary.textContent = \"公式明细\";\n const list = document.createElement(\"ul\");\n for (const item of sheet.formulas.slice(0, 200)) {\n const row = document.createElement(\"li\");\n row.textContent = `${item.address}: ${item.formula}`;\n list.append(row);\n }\n if (sheet.formulas.length > 200) {\n const row = document.createElement(\"li\");\n row.textContent = `还有 ${sheet.formulas.length - 200} 个公式未展示。`;\n list.append(row);\n }\n details.append(detailsSummary, list);\n content.append(details);\n }\n };\n\n if (sheets.length === 0) {\n content.textContent = emptyMessage;\n } else {\n for (const [index, sheet] of sheets.entries()) {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.setAttribute(\"role\", \"tab\");\n button.setAttribute(\"aria-selected\", \"false\");\n button.textContent = sheet.name;\n button.title = sheet.name;\n button.addEventListener(\"click\", () => renderSheetByIndex(sheet, index));\n buttons.set(sheet.name, button);\n tabs.append(button);\n if (index === 0) {\n renderSheetByIndex(sheet, index);\n }\n }\n }\n\n panel.append(tabs, content);\n}\n\nasync function readWorkbookCharts(arrayBuffer: ArrayBuffer): Promise<ChartPreview[]> {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const chartEntries = Object.values(zip.files)\n .filter((entry) => !entry.dir && /^xl\\/charts\\/chart\\d+\\.xml$/i.test(entry.name))\n .sort((a, b) => a.name.localeCompare(b.name));\n const charts: ChartPreview[] = [];\n for (const [index, entry] of chartEntries.entries()) {\n const xml = await entry.async(\"text\");\n const chart = parseChartXml(xml, entry.name.split(\"/\").pop() || `chart${index + 1}.xml`);\n if (chart) {\n charts.push(chart);\n }\n }\n return charts;\n}\n\nfunction parseChartXml(xml: string, fallbackName: string): ChartPreview | null {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return null;\n }\n\n const type = detectChartType(doc);\n const title = textFromFirst(doc, \"title\") || fallbackName.replace(/\\.xml$/i, \"\");\n const seriesElements = Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"ser\");\n const series = seriesElements\n .map((element, index) => parseChartSeries(element, index))\n .filter((item): item is { name: string; values: number[]; categories: string[] } => item.values.length > 0);\n\n if (series.length === 0) {\n return null;\n }\n\n return {\n name: fallbackName,\n type,\n title,\n categories: series.find((item) => item.categories.length > 0)?.categories || [],\n series: series.map((item) => ({ name: item.name, values: item.values }))\n };\n}\n\nfunction detectChartType(doc: Document): string {\n const chartType = Array.from(doc.getElementsByTagName(\"*\")).find(\n (element) => element.localName.endsWith(\"Chart\") && element.localName !== \"chart\"\n )?.localName;\n if (!chartType) {\n return \"chart\";\n }\n return chartType.replace(/Chart$/i, \"\").toLowerCase();\n}\n\nfunction parseChartSeries(\n element: Element,\n index: number\n): { name: string; values: number[]; categories: string[] } {\n return {\n name: textFromFirst(element, \"tx\") || `Series ${index + 1}`,\n values: numbersFromFirst(element, \"val\"),\n categories: stringsFromFirst(element, \"cat\")\n };\n}\n\nfunction renderChartPreviewSection(charts: ChartPreview[]): HTMLElement {\n const section = createSection(\"表格图表预览\");\n const grid = document.createElement(\"div\");\n grid.className = \"ofv-chart-grid\";\n for (const chart of charts) {\n grid.append(renderChartCard(chart));\n }\n section.append(grid);\n return section;\n}\n\nfunction renderChartCard(chart: ChartPreview): HTMLElement {\n const card = document.createElement(\"article\");\n card.className = \"ofv-chart-card\";\n\n const header = document.createElement(\"header\");\n const title = document.createElement(\"h4\");\n title.textContent = chart.title;\n const meta = document.createElement(\"span\");\n meta.textContent = `${chart.type} · ${chart.series.length} 个系列`;\n header.append(title, meta);\n\n const svg = renderChartSvg(chart);\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-chart-data\";\n const summary = document.createElement(\"summary\");\n summary.textContent = \"数据摘要\";\n const list = document.createElement(\"ul\");\n for (const item of chart.series) {\n const row = document.createElement(\"li\");\n row.textContent = `${item.name}: ${item.values.slice(0, 12).join(\", \")}${\n item.values.length > 12 ? ` ... 共 ${item.values.length} 项` : \"\"\n }`;\n list.append(row);\n }\n details.append(summary, list);\n card.append(header, svg, details);\n return card;\n}\n\nfunction renderChartSvg(chart: ChartPreview): SVGSVGElement {\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 640 260\");\n svg.setAttribute(\"role\", \"img\");\n svg.setAttribute(\"aria-label\", chart.title);\n svg.classList.add(\"ofv-chart-svg\");\n\n const allValues = chart.series.flatMap((item) => item.values).filter((value) => Number.isFinite(value));\n const max = Math.max(1, ...allValues);\n const min = Math.min(0, ...allValues);\n const span = max - min || 1;\n const colors = [\"#2563eb\", \"#059669\", \"#d97706\", \"#dc2626\", \"#7c3aed\"];\n const plot = { x: 48, y: 24, width: 552, height: 178 };\n\n appendSvg(svg, \"line\", { x1: plot.x, y1: plot.y, x2: plot.x, y2: plot.y + plot.height, class: \"ofv-chart-axis\" });\n appendSvg(svg, \"line\", {\n x1: plot.x,\n y1: plot.y + plot.height,\n x2: plot.x + plot.width,\n y2: plot.y + plot.height,\n class: \"ofv-chart-axis\"\n });\n\n chart.series.forEach((series, seriesIndex) => {\n const color = colors[seriesIndex % colors.length];\n const step = series.values.length > 1 ? plot.width / (series.values.length - 1) : plot.width;\n const points = series.values.map((value, index) => ({\n x: plot.x + index * step,\n y: plot.y + plot.height - ((value - min) / span) * plot.height\n }));\n\n if (chart.type.includes(\"bar\") || chart.type.includes(\"col\")) {\n const barWidth = Math.max(4, Math.min(28, step * 0.6)) / Math.max(1, chart.series.length);\n points.forEach((point, index) => {\n const zeroY = plot.y + plot.height - ((0 - min) / span) * plot.height;\n const x = point.x - (barWidth * chart.series.length) / 2 + seriesIndex * barWidth;\n appendSvg(svg, \"rect\", {\n x,\n y: Math.min(point.y, zeroY),\n width: barWidth,\n height: Math.max(1, Math.abs(zeroY - point.y)),\n fill: color,\n \"data-index\": index\n });\n });\n } else {\n appendSvg(svg, \"polyline\", {\n points: points.map((point) => `${point.x.toFixed(1)},${point.y.toFixed(1)}`).join(\" \"),\n fill: \"none\",\n stroke: color,\n \"stroke-width\": 3,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n });\n for (const point of points.slice(0, 80)) {\n appendSvg(svg, \"circle\", { cx: point.x, cy: point.y, r: 3, fill: color });\n }\n }\n\n appendLegend(svg, series.name, color, 52 + seriesIndex * 118, 236);\n });\n\n return svg;\n}\n\nfunction appendLegend(svg: SVGSVGElement, label: string, color: string, x: number, y: number): void {\n appendSvg(svg, \"rect\", { x, y: y - 10, width: 12, height: 12, rx: 2, fill: color });\n const text = appendSvg(svg, \"text\", { x: x + 18, y, class: \"ofv-chart-label\" });\n text.textContent = label.length > 16 ? `${label.slice(0, 16)}...` : label;\n}\n\nfunction appendSvg<K extends keyof SVGElementTagNameMap>(\n parent: SVGElement,\n tag: K,\n attributes: Record<string, string | number>\n): SVGElementTagNameMap[K] {\n const element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n for (const [key, value] of Object.entries(attributes)) {\n element.setAttribute(key, String(value));\n }\n parent.append(element);\n return element;\n}\n\nfunction textFromFirst(root: ParentNode, localName: string): string {\n const element = Array.from(root.querySelectorAll(\"*\")).find((item) => item.localName === localName);\n return element ? chartText(element) : \"\";\n}\n\nfunction stringsFromFirst(root: ParentNode, localName: string): string[] {\n const element = Array.from(root.querySelectorAll(\"*\")).find((item) => item.localName === localName);\n if (!element) {\n return [];\n }\n return chartStringValues(element);\n}\n\nfunction numbersFromFirst(root: ParentNode, localName: string): number[] {\n const element = Array.from(root.querySelectorAll(\"*\")).find((item) => item.localName === localName);\n if (!element) {\n return [];\n }\n return Array.from(element.querySelectorAll(\"*\"))\n .filter((item) => item.localName === \"v\")\n .map((item) => Number(item.textContent || \"\"))\n .filter((value) => Number.isFinite(value));\n}\n\nfunction chartText(element: Element): string {\n return (\n Array.from(element.querySelectorAll(\"*\"))\n .filter((item) => item.localName === \"v\" || item.localName === \"t\")\n .map((item) => item.textContent?.trim() || \"\")\n .find(Boolean) || \"\"\n );\n}\n\nfunction chartStringValues(element: Element): string[] {\n return Array.from(element.querySelectorAll(\"*\"))\n .filter((item) => item.localName === \"v\" || item.localName === \"t\")\n .map((item) => item.textContent?.trim() || \"\")\n .filter(Boolean);\n}\n\ntype SheetViewport = {\n rowStart: number;\n columnStart: number;\n rowCount: number;\n columnCount: number;\n};\n\ntype SheetWindowControls = {\n element: HTMLElement;\n update: () => void;\n};\n\nfunction createSheetViewport(rowCount: number, columnCount: number): SheetViewport {\n return {\n rowStart: 0,\n columnStart: 0,\n rowCount,\n columnCount\n };\n}\n\nfunction createSheetWindowControls(viewport: SheetViewport, render: () => void): SheetWindowControls | null {\n const needsRows = viewport.rowCount > SHEET_WINDOW_ROWS;\n const needsColumns = viewport.columnCount > SHEET_WINDOW_COLUMNS;\n if (!needsRows && !needsColumns) {\n return null;\n }\n\n const controls = document.createElement(\"div\");\n controls.className = \"ofv-sheet-window\";\n\n const note = document.createElement(\"span\");\n note.className = \"ofv-sheet-window-note\";\n\n const rowBack = createWindowButton(\"上 200 行\", () => {\n viewport.rowStart = Math.max(0, viewport.rowStart - SHEET_WINDOW_ROWS);\n render();\n });\n const rowNext = createWindowButton(\"下 200 行\", () => {\n viewport.rowStart = Math.min(maxStart(viewport.rowCount, SHEET_WINDOW_ROWS), viewport.rowStart + SHEET_WINDOW_ROWS);\n render();\n });\n const colBack = createWindowButton(\"左 80 列\", () => {\n viewport.columnStart = Math.max(0, viewport.columnStart - SHEET_WINDOW_COLUMNS);\n render();\n });\n const colNext = createWindowButton(\"右 80 列\", () => {\n viewport.columnStart = Math.min(\n maxStart(viewport.columnCount, SHEET_WINDOW_COLUMNS),\n viewport.columnStart + SHEET_WINDOW_COLUMNS\n );\n render();\n });\n\n controls.append(note, rowBack, rowNext, colBack, colNext);\n\n const update = () => {\n const rowEnd = Math.min(viewport.rowStart + SHEET_WINDOW_ROWS, viewport.rowCount);\n const columnEnd = Math.min(viewport.columnStart + SHEET_WINDOW_COLUMNS, viewport.columnCount);\n note.textContent = `大表格窗口化渲染:当前 ${viewport.rowStart + 1}-${rowEnd} 行,${viewport.columnStart + 1}-${columnEnd} 列`;\n rowBack.disabled = viewport.rowStart === 0;\n rowNext.disabled = viewport.rowStart >= maxStart(viewport.rowCount, SHEET_WINDOW_ROWS);\n colBack.disabled = viewport.columnStart === 0;\n colNext.disabled = viewport.columnStart >= maxStart(viewport.columnCount, SHEET_WINDOW_COLUMNS);\n rowBack.hidden = rowNext.hidden = !needsRows;\n colBack.hidden = colNext.hidden = !needsColumns;\n };\n\n update();\n return { element: controls, update };\n}\n\nfunction createWindowButton(label: string, onClick: () => void): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.textContent = label;\n button.addEventListener(\"click\", onClick);\n return button;\n}\n\nfunction maxStart(total: number, size: number): number {\n return Math.max(0, total - size);\n}\n\nfunction createWorkbookSheetTable(\n sheet: Record<string, any>,\n range: { s: { r: number; c: number }; e: { r: number; c: number } },\n sheetIndex: number,\n viewport: SheetViewport,\n encodeCell: (cell: { r: number; c: number }) => string,\n formatCell: (cell: any) => string\n): HTMLTableElement {\n const table = document.createElement(\"table\");\n table.id = `ofv-sheet-${sheetIndex + 1}`;\n const rowEnd = Math.min(range.s.r + viewport.rowStart + SHEET_WINDOW_ROWS - 1, range.e.r);\n const columnEnd = Math.min(range.s.c + viewport.columnStart + SHEET_WINDOW_COLUMNS - 1, range.e.c);\n\n for (let rowIndex = range.s.r + viewport.rowStart; rowIndex <= rowEnd; rowIndex += 1) {\n const row = document.createElement(\"tr\");\n for (let columnIndex = range.s.c + viewport.columnStart; columnIndex <= columnEnd; columnIndex += 1) {\n const cell = document.createElement(rowIndex === range.s.r ? \"th\" : \"td\");\n const address = encodeCell({ r: rowIndex, c: columnIndex });\n const sourceCell = sheet[address];\n cell.dataset.cell = address;\n const text = sourceCell ? formatCell(sourceCell) : \"\";\n cell.textContent = text;\n if (text) {\n cell.title = text;\n }\n if (sourceCell?.f) {\n cell.classList.add(\"ofv-cell-formula\");\n cell.title = `=${sourceCell.f}`;\n }\n row.append(cell);\n }\n table.append(row);\n }\n\n return table;\n}\n\nfunction createParsedSheetTable(sheet: ParsedSheet, sheetIndex: number, viewport: SheetViewport): HTMLTableElement {\n const table = document.createElement(\"table\");\n table.id = `ofv-sheet-${sheetIndex + 1}`;\n const formulaMap = new Map(sheet.formulas.map((item) => [item.address, item.formula]));\n const rowEnd = Math.min(viewport.rowStart + SHEET_WINDOW_ROWS, sheet.rows.length);\n for (let rowIndex = viewport.rowStart; rowIndex < rowEnd; rowIndex += 1) {\n const sourceRow = sheet.rows[rowIndex] || [];\n const row = document.createElement(\"tr\");\n const columnEnd = Math.min(viewport.columnStart + SHEET_WINDOW_COLUMNS, viewport.columnCount);\n for (let columnIndex = viewport.columnStart; columnIndex < columnEnd; columnIndex += 1) {\n const value = sourceRow[columnIndex] || \"\";\n const cell = document.createElement(rowIndex === 0 ? \"th\" : \"td\");\n const address = encodeA1(rowIndex, columnIndex);\n cell.dataset.cell = address;\n cell.textContent = value;\n if (value) {\n cell.title = value;\n }\n const formula = formulaMap.get(address);\n if (formula) {\n cell.classList.add(\"ofv-cell-formula\");\n cell.title = formula;\n }\n row.append(cell);\n }\n table.append(row);\n }\n return table;\n}\n\nfunction parseFlatOds(xml: string): ParsedSheet[] {\n const documentXml = new DOMParser().parseFromString(xml, \"application/xml\");\n if (documentXml.querySelector(\"parsererror\")) {\n return [];\n }\n\n return Array.from(documentXml.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"table\")\n .map((tableElement, tableIndex) => parseFlatOdsTable(tableElement, tableIndex))\n .filter((sheet) => sheet.rows.length > 0);\n}\n\nfunction parseFlatOdsTable(tableElement: Element, tableIndex: number): ParsedSheet {\n const rows: string[][] = [];\n const formulas: Array<{ address: string; formula: string }> = [];\n const sheetName = getXmlAttribute(tableElement, \"name\") || `Sheet ${tableIndex + 1}`;\n for (const rowElement of Array.from(tableElement.children).filter((element) => element.localName === \"table-row\")) {\n const repeatRows = clampRepeat(getXmlAttribute(rowElement, \"number-rows-repeated\"), 200);\n const parsedRow = parseFlatOdsRow(rowElement, rows.length, formulas);\n for (let index = 0; index < repeatRows; index += 1) {\n rows.push([...parsedRow]);\n }\n }\n trimEmptyTrailingRows(rows);\n return { name: sheetName, rows, formulas };\n}\n\nfunction parseFlatOdsRow(\n rowElement: Element,\n rowIndex: number,\n formulas: Array<{ address: string; formula: string }>\n): string[] {\n const row: string[] = [];\n for (const cellElement of Array.from(rowElement.children).filter(\n (element) => element.localName === \"table-cell\" || element.localName === \"covered-table-cell\"\n )) {\n const repeatColumns = clampRepeat(getXmlAttribute(cellElement, \"number-columns-repeated\"), 256);\n const value = extractFlatOdsCellValue(cellElement);\n const formula = getXmlAttribute(cellElement, \"formula\");\n for (let index = 0; index < repeatColumns; index += 1) {\n const columnIndex = row.length;\n row.push(value);\n if (formula) {\n formulas.push({ address: encodeA1(rowIndex, columnIndex), formula });\n }\n }\n }\n trimEmptyTrailingCells(row);\n return row;\n}\n\nfunction extractFlatOdsCellValue(cellElement: Element): string {\n const text = extractOpenDocumentTextFromElement(cellElement);\n if (text) {\n return text;\n }\n return (\n getXmlAttribute(cellElement, \"value\") ||\n getXmlAttribute(cellElement, \"date-value\") ||\n getXmlAttribute(cellElement, \"time-value\") ||\n getXmlAttribute(cellElement, \"boolean-value\") ||\n \"\"\n );\n}\n\nfunction extractOpenDocumentTextFromElement(element: Element): string {\n const fragments: string[] = [];\n const visit = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n fragments.push(node.textContent || \"\");\n return;\n }\n if (!(node instanceof Element)) {\n return;\n }\n if (node.localName === \"s\") {\n fragments.push(\" \".repeat(clampRepeat(getXmlAttribute(node, \"c\"), 64)));\n return;\n }\n if (node.localName === \"tab\") {\n fragments.push(\"\\t\");\n return;\n }\n if (node.localName === \"line-break\") {\n fragments.push(\"\\n\");\n return;\n }\n for (const child of Array.from(node.childNodes)) {\n visit(child);\n }\n if (node.localName === \"p\" || node.localName === \"h\") {\n fragments.push(\"\\n\");\n }\n };\n visit(element);\n return fragments.join(\"\").replace(/\\n+$/g, \"\").trim();\n}\n\nfunction getXmlAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction clampRepeat(value: string | null, max: number): number {\n const parsed = value ? Number.parseInt(value, 10) : 1;\n if (!Number.isFinite(parsed) || parsed < 1) {\n return 1;\n }\n return Math.min(parsed, max);\n}\n\nfunction trimEmptyTrailingRows(rows: string[][]): void {\n while (rows.length > 0 && rows[rows.length - 1].every((cell) => cell === \"\")) {\n rows.pop();\n }\n}\n\nfunction trimEmptyTrailingCells(row: string[]): void {\n while (row.length > 0 && row[row.length - 1] === \"\") {\n row.pop();\n }\n}\n\nfunction collectFormulaRows(\n sheet: Record<string, any>,\n range: { s: { r: number; c: number }; e: { r: number; c: number } },\n encodeCell: (cell: { r: number; c: number }) => string\n): Array<{ address: string; formula: string }> {\n const formulas: Array<{ address: string; formula: string }> = [];\n for (let row = range.s.r; row <= range.e.r; row += 1) {\n for (let column = range.s.c; column <= range.e.c; column += 1) {\n const address = encodeCell({ r: row, c: column });\n const cell = sheet[address];\n if (cell?.f) {\n formulas.push({ address, formula: `=${cell.f}` });\n }\n }\n }\n return formulas;\n}\n\nfunction encodeA1(rowIndex: number, columnIndex: number): string {\n let column = \"\";\n let value = columnIndex + 1;\n while (value > 0) {\n const remainder = (value - 1) % 26;\n column = String.fromCharCode(65 + remainder) + column;\n value = Math.floor((value - 1) / 26);\n }\n return `${column}${rowIndex + 1}`;\n}\n\nasync function renderPptx(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const container = document.createElement(\"div\");\n container.className = \"ofv-pptx-viewer\";\n\n try {\n const zip = await JSZip.loadAsync(arrayBuffer);\n await renderPresentationInsight(panel, await inspectPptxPresentation(zip));\n } catch (error) {\n console.warn(\"PPTX structure insight extraction failed:\", error);\n }\n\n panel.append(container);\n try {\n const { PptxViewer } = await import(\"@aiden0z/pptx-renderer\");\n await PptxViewer.open(arrayBuffer, container);\n } catch {\n container.textContent = \"PPTX 渲染失败,请检查文件是否损坏。\";\n }\n}\n\nasync function renderOdp(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const content = zip.file(\"content.xml\");\n if (!content) {\n panel.textContent = \"未解析到 ODP 内容。\";\n return;\n }\n const xml = await content.async(\"text\");\n const images = await extractZipImages(zip, /^Pictures\\//);\n renderPresentationInsight(panel, inspectOpenDocumentPresentation(titleFromOdf(xml, \"ODP 演示文稿\"), xml, images.length));\n renderOpenDocumentPresentation(panel, \"ODP 演示文稿\", xml, images);\n}\n\nfunction renderOpenDocumentPresentationXml(panel: HTMLElement, xml: string): void {\n renderPresentationInsight(panel, inspectOpenDocumentPresentation(\"FODP 演示文稿\", xml, 0));\n renderOpenDocumentPresentation(panel, \"FODP 演示文稿\", xml, []);\n}\n\nasync function renderPackagedOfficePreview(\n panel: HTMLElement,\n arrayBuffer: ArrayBuffer,\n extension: string\n): Promise<boolean> {\n let zip: JSZip;\n try {\n zip = await JSZip.loadAsync(arrayBuffer);\n } catch {\n return false;\n }\n\n const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n const hasEntry = (path: string) => entries.some((entry) => entry.name.toLowerCase() === path.toLowerCase());\n const contentXml = zip.file(/(^|\\/)content\\.xml$/i)[0];\n\n if (hasEntry(\"word/document.xml\")) {\n renderOfficePackageNotice(panel, extension, \"检测到 OOXML Word 包结构,已按 DOCX 兼容路径预览。\");\n await renderDocx(panel, arrayBuffer);\n return true;\n }\n\n if (hasEntry(\"xl/workbook.xml\")) {\n renderOfficePackageNotice(panel, extension, \"检测到 OOXML Workbook 包结构,已按 XLSX 兼容路径预览。\");\n await renderSheet(panel, arrayBuffer, extension);\n return true;\n }\n\n if (hasEntry(\"ppt/presentation.xml\")) {\n renderOfficePackageNotice(panel, extension, \"检测到 OOXML Presentation 包结构,已按 PPTX 兼容路径预览。\");\n await renderPptx(panel, arrayBuffer);\n return true;\n }\n\n if (contentXml) {\n const xml = await contentXml.async(\"text\");\n if (/<office:spreadsheet\\b|<table:table\\b/i.test(xml)) {\n renderOfficePackageNotice(panel, extension, \"检测到 OpenDocument Spreadsheet 包结构,已按 ODS 兼容路径预览。\");\n renderParsedSheets(panel, parseFlatOds(xml), `${extension.toUpperCase()} 文件未解析到表格。`);\n return true;\n }\n if (/<office:presentation\\b|<draw:page\\b/i.test(xml)) {\n renderOfficePackageNotice(panel, extension, \"检测到 OpenDocument Presentation 包结构,已按 ODP 兼容路径预览。\");\n renderOpenDocumentPresentation(panel, `${extension.toUpperCase()} 演示文稿`, xml, await extractZipImages(zip, /^Pictures\\//));\n return true;\n }\n if (/<office:text\\b|<text:p\\b/i.test(xml)) {\n renderOfficePackageNotice(panel, extension, \"检测到 OpenDocument Text 包结构,已按 ODT 兼容路径预览。\");\n renderOpenDocumentXml(panel, `${extension.toUpperCase()} 文档`, xml);\n return true;\n }\n }\n\n if (entries.some((entry) => /^index\\//i.test(entry.name) || /\\.iwa$/i.test(entry.name))) {\n renderOfficePackageStructure(\n panel,\n extension,\n entries.map((entry) => entry.name),\n \"检测到 Apple iWork 包结构。当前解析包内 plist 元数据并展示 IWA/资源结构;正文 IWA 数据可后续接入专用解析器增强。\",\n await extractIWorkMetadata(entries)\n );\n return true;\n }\n\n if (entries.length > 0) {\n renderOfficePackageStructure(\n panel,\n extension,\n entries.map((entry) => entry.name),\n \"检测到 ZIP 包结构,但未发现标准 OOXML/ODF 入口。可后续接入对应厂商格式解析器或服务端转换。\"\n );\n return true;\n }\n\n return false;\n}\n\nfunction renderOfficePackageNotice(panel: HTMLElement, extension: string, message: string): void {\n const section = createSection(\"兼容包识别\");\n const note = document.createElement(\"p\");\n note.className = \"ofv-office-package-note\";\n note.textContent = `.${extension} ${message}`;\n section.append(note);\n panel.append(section);\n}\n\nfunction renderOfficePackageStructure(\n panel: HTMLElement,\n extension: string,\n entries: string[],\n message: string,\n metadata?: IWorkMetadata\n): void {\n const section = createSection(\"Office 包结构预览\");\n const note = document.createElement(\"p\");\n note.className = \"ofv-office-package-note\";\n note.textContent = `.${extension} ${message}`;\n\n if (metadata && Object.keys(metadata).length > 0) {\n section.append(createIWorkMetadataSummary(metadata));\n }\n\n const list = document.createElement(\"ul\");\n list.className = \"ofv-office-package-list\";\n for (const name of entries.slice(0, 120)) {\n const item = document.createElement(\"li\");\n item.textContent = name;\n list.append(item);\n }\n if (entries.length > 120) {\n const item = document.createElement(\"li\");\n item.textContent = `还有 ${entries.length - 120} 个文件未展示。`;\n list.append(item);\n }\n\n section.append(note, list);\n panel.append(section);\n}\n\nasync function extractIWorkMetadata(entries: JSZip.JSZipObject[]): Promise<IWorkMetadata> {\n const metadataEntries = entries.filter((entry) => /^metadata\\/.*\\.plist$/i.test(entry.name) || /properties\\.plist$/i.test(entry.name));\n const metadata: IWorkMetadata = {};\n for (const entry of metadataEntries.slice(0, 6)) {\n const text = await entry.async(\"text\").catch(() => \"\");\n if (!text || !/<plist[\\s>]/i.test(text)) {\n continue;\n }\n const plist = parsePlistDict(text);\n mergeIWorkMetadata(metadata, plist);\n }\n return metadata;\n}\n\nfunction createIWorkMetadataSummary(metadata: IWorkMetadata): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-iwork-meta\";\n const title = document.createElement(\"strong\");\n title.textContent = \"iWork 元数据\";\n const grid = document.createElement(\"div\");\n grid.className = \"ofv-iwork-meta-grid\";\n appendIWorkMeta(grid, \"标题\", metadata.title);\n appendIWorkMeta(grid, \"作者\", metadata.author);\n appendIWorkMeta(grid, \"公司\", metadata.company);\n appendIWorkMeta(grid, \"主题\", metadata.subject);\n appendIWorkMeta(grid, \"关键词\", metadata.keywords?.join(\", \"));\n appendIWorkMeta(grid, \"创建时间\", metadata.created);\n appendIWorkMeta(grid, \"修改时间\", metadata.modified);\n wrapper.append(title, grid);\n return wrapper;\n}\n\nfunction appendIWorkMeta(parent: HTMLElement, label: string, value?: string): void {\n if (!value) {\n return;\n }\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n row.append(key, content);\n parent.append(row);\n}\n\nfunction mergeIWorkMetadata(metadata: IWorkMetadata, plist: Record<string, unknown>): void {\n metadata.title ||= plistText(plist, [\"Title\", \"title\", \"DocumentTitle\", \"SFDocumentTitle\", \"kMDItemTitle\"]);\n metadata.author ||= plistText(plist, [\"Author\", \"author\", \"Authors\", \"kMDItemAuthors\", \"creator\"]);\n metadata.company ||= plistText(plist, [\"Company\", \"company\", \"Organization\"]);\n metadata.subject ||= plistText(plist, [\"Subject\", \"subject\", \"Description\", \"comment\"]);\n metadata.created ||= plistText(plist, [\"CreationDate\", \"created\", \"kMDItemFSCreationDate\"]);\n metadata.modified ||= plistText(plist, [\"ModificationDate\", \"modified\", \"kMDItemFSContentChangeDate\"]);\n metadata.keywords ||= plistArray(plist, [\"Keywords\", \"keywords\", \"kMDItemKeywords\"]);\n}\n\nfunction parsePlistDict(xml: string): Record<string, unknown> {\n if (typeof DOMParser === \"undefined\") {\n return {};\n }\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return {};\n }\n const dict = Array.from(doc.documentElement.children).find((child) => child.tagName === \"dict\");\n const value = dict ? parsePlistValue(dict) : undefined;\n return value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : {};\n}\n\nfunction parsePlistValue(element: Element): unknown {\n switch (element.tagName) {\n case \"dict\": {\n const result: Record<string, unknown> = {};\n const children = Array.from(element.children);\n for (let index = 0; index < children.length; index++) {\n const key = children[index];\n if (key.tagName !== \"key\") {\n continue;\n }\n const value = children[index + 1];\n if (value) {\n result[key.textContent || \"\"] = parsePlistValue(value);\n index++;\n }\n }\n return result;\n }\n case \"array\":\n return Array.from(element.children).map(parsePlistValue);\n case \"true\":\n return true;\n case \"false\":\n return false;\n case \"integer\":\n case \"real\":\n return Number(element.textContent || 0);\n case \"string\":\n case \"date\":\n default:\n return element.textContent?.trim() || \"\";\n }\n}\n\nfunction plistText(plist: Record<string, unknown>, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = plist[key];\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n if (Array.isArray(value)) {\n const text = value.filter((item): item is string => typeof item === \"string\" && Boolean(item.trim())).join(\", \");\n if (text) {\n return text;\n }\n }\n }\n return undefined;\n}\n\nfunction plistArray(plist: Record<string, unknown>, keys: string[]): string[] | undefined {\n for (const key of keys) {\n const value = plist[key];\n if (Array.isArray(value)) {\n const items = value.filter((item): item is string => typeof item === \"string\" && Boolean(item.trim()));\n if (items.length > 0) {\n return items;\n }\n }\n if (typeof value === \"string\" && value.trim()) {\n return value.split(/[,;]/).map((item) => item.trim()).filter(Boolean);\n }\n }\n return undefined;\n}\n\nfunction renderOpenDocumentPresentation(\n panel: HTMLElement,\n title: string,\n xml: string,\n images: Array<{ name: string; src: string }>\n): void {\n const pages = xml.split(/<draw:page\\b/).slice(1);\n const pageSources = pages.length > 0 ? pages : [xml];\n for (const [index, pageXml] of pageSources.entries()) {\n const section = createSection(`${title} ${index + 1}`);\n const body = document.createElement(\"div\");\n body.className = \"ofv-slide\";\n const texts = extractOpenDocumentBlocks(pageXml);\n if (texts.length > 0) {\n for (const text of texts) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = text;\n body.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"这一页没有可提取文本。\";\n body.append(empty);\n }\n for (const image of images.slice(index === 0 ? 0 : images.length, index === 0 ? images.length : images.length)) {\n const figure = document.createElement(\"figure\");\n figure.className = \"ofv-slide-image\";\n const img = document.createElement(\"img\");\n img.src = image.src;\n img.alt = image.name;\n const caption = document.createElement(\"figcaption\");\n caption.textContent = image.name;\n figure.append(img, caption);\n body.append(figure);\n }\n section.append(body);\n panel.append(section);\n }\n}\n\nasync function inspectPptxPresentation(zip: JSZip): Promise<PresentationInsight> {\n const slideEntries = Object.values(zip.files)\n .filter((entry) => !entry.dir && /^ppt\\/slides\\/slide\\d+\\.xml$/i.test(entry.name))\n .sort((a, b) => slideNumberFromPath(a.name) - slideNumberFromPath(b.name));\n\n const slides: PresentationSlideInsight[] = [];\n let imageCount = 0;\n let notesCount = 0;\n let transitionCount = 0;\n let animationCount = 0;\n const layouts = new Set<string>();\n\n for (const entry of slideEntries) {\n const xml = await entry.async(\"text\");\n const texts = extractOpenXmlText(xml);\n const rels = await readPptxRelationships(zip, entry.name);\n const layout = await resolvePptxSlideLayout(zip, entry.name, rels);\n if (layout) {\n layouts.add(layout);\n }\n\n const slideImageCount = countPptxSlideImages(xml, rels);\n const notesPath = resolvePptxRelationshipTarget(entry.name, rels.find((rel) => /\\/notesSlide$/i.test(rel.type))?.target);\n const notesXml = notesPath ? await zip.file(notesPath)?.async(\"text\") : undefined;\n const slideNotesCount = notesXml ? extractOpenXmlText(notesXml).length : 0;\n const hasTransition = /<p:transition\\b/i.test(xml);\n const slideAnimationCount = countMatches(xml, /<p:(?:anim|animEffect|animMotion|animRot|animScale|cmd|set)\\b/gi);\n\n imageCount += slideImageCount;\n notesCount += slideNotesCount;\n transitionCount += hasTransition ? 1 : 0;\n animationCount += slideAnimationCount;\n slides.push({\n title: texts[0] || `Slide ${slides.length + 1}`,\n layout,\n textCount: texts.length,\n imageCount: slideImageCount,\n notesCount: slideNotesCount,\n hasTransition,\n animationCount: slideAnimationCount,\n sampleTexts: texts.slice(0, 4)\n });\n }\n\n return {\n title: \"PPTX 演示文稿结构\",\n slideCount: slides.length,\n imageCount,\n notesCount,\n transitionCount,\n animationCount,\n layouts: Array.from(layouts),\n slides\n };\n}\n\nfunction inspectOpenDocumentPresentation(title: string, xml: string, totalImages: number): PresentationInsight {\n const pages = xml.split(/<draw:page\\b/).slice(1);\n const pageSources = pages.length > 0 ? pages : [xml];\n const slides = pageSources.map((pageXml, index) => {\n const texts = extractOpenDocumentBlocks(pageXml);\n const layout =\n matchXmlAttribute(pageXml, /presentation:class=\"([^\"]+)\"/i) ||\n matchXmlAttribute(pageXml, /draw:style-name=\"([^\"]+)\"/i) ||\n undefined;\n const imageCount = countMatches(pageXml, /<draw:image\\b/gi);\n const hasTransition = /presentation:transition-type=|presentation:transition-style=|smil:type=/i.test(pageXml);\n const animationCount = countMatches(pageXml, /<anim:|<presentation:animations\\b|<presentation:show-shape\\b/gi);\n return {\n title: texts[0] || `Slide ${index + 1}`,\n layout,\n textCount: texts.length,\n imageCount,\n notesCount: countMatches(pageXml, /<presentation:notes\\b/gi),\n hasTransition,\n animationCount,\n sampleTexts: texts.slice(0, 4)\n };\n });\n\n const layouts = new Set(slides.map((slide) => slide.layout).filter(Boolean) as string[]);\n return {\n title,\n slideCount: slides.length,\n imageCount: Math.max(totalImages, slides.reduce((sum, slide) => sum + slide.imageCount, 0)),\n notesCount: slides.reduce((sum, slide) => sum + slide.notesCount, 0),\n transitionCount: slides.filter((slide) => slide.hasTransition).length,\n animationCount: slides.reduce((sum, slide) => sum + slide.animationCount, 0),\n layouts: Array.from(layouts),\n slides\n };\n}\n\nasync function renderPresentationInsight(panel: HTMLElement, insight: PresentationInsight): Promise<void> {\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-presentation-summary\";\n summary.hidden = true;\n summary.setAttribute(\"aria-hidden\", \"true\");\n summary.dataset.slideCount = String(insight.slideCount);\n summary.dataset.imageCount = String(insight.imageCount);\n summary.dataset.notesCount = String(insight.notesCount);\n summary.dataset.transitionCount = String(insight.transitionCount);\n summary.dataset.animationCount = String(insight.animationCount);\n const stats = [\n `${insight.slideCount} 页`,\n `${insight.layouts.length || 0} 种布局`,\n `${insight.imageCount} 张图片`,\n `${insight.notesCount} 条备注`,\n `${insight.transitionCount} 页切换`,\n `${insight.animationCount} 个动画标记`\n ];\n summary.append(createPresentationMetric(insight.title, stats.join(\" · \")));\n\n if (insight.layouts.length > 0) {\n summary.append(createPresentationMetric(\"布局\", insight.layouts.join(\"、\")));\n }\n panel.append(summary);\n}\n\nfunction createPresentationMetric(label: string, value: string): HTMLElement {\n const metric = document.createElement(\"p\");\n const strong = document.createElement(\"strong\");\n strong.textContent = label;\n const span = document.createElement(\"span\");\n span.textContent = value;\n metric.append(strong, span);\n return metric;\n}\n\ntype PptxRelationship = {\n id: string;\n type: string;\n target: string;\n};\n\nasync function readPptxRelationships(zip: JSZip, partPath: string): Promise<PptxRelationship[]> {\n const relsPath = relationshipPathForPart(partPath);\n const xml = await zip.file(relsPath)?.async(\"text\");\n if (!xml) {\n return [];\n }\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return [];\n }\n return Array.from(doc.getElementsByTagNameNS(PPTX_REL_NS, \"Relationship\")).map((element) => ({\n id: element.getAttribute(\"Id\") || \"\",\n type: element.getAttribute(\"Type\") || \"\",\n target: element.getAttribute(\"Target\") || \"\"\n }));\n}\n\nasync function resolvePptxSlideLayout(zip: JSZip, slidePath: string, rels: PptxRelationship[]): Promise<string | undefined> {\n const layoutRel = rels.find((rel) => /\\/slideLayout$/i.test(rel.type));\n const layoutPath = resolvePptxRelationshipTarget(slidePath, layoutRel?.target);\n const xml = layoutPath ? await zip.file(layoutPath)?.async(\"text\") : undefined;\n if (!xml) {\n return layoutPath?.split(\"/\").pop()?.replace(/\\.xml$/i, \"\");\n }\n return matchXmlAttribute(xml, /<p:cSld\\b[^>]*name=\"([^\"]+)\"/i) || layoutPath?.split(\"/\").pop()?.replace(/\\.xml$/i, \"\");\n}\n\nfunction countPptxSlideImages(xml: string, rels: PptxRelationship[]): number {\n const relImageIds = new Set(rels.filter((rel) => /\\/image$/i.test(rel.type)).map((rel) => rel.id));\n const embeddedIds = [...xml.matchAll(/<a:blip\\b[^>]*(?:r:embed|r:link)=\"([^\"]+)\"/gi)].map((match) => match[1]);\n if (embeddedIds.length > 0) {\n return embeddedIds.filter((id) => relImageIds.size === 0 || relImageIds.has(id)).length;\n }\n return relImageIds.size;\n}\n\nfunction relationshipPathForPart(partPath: string): string {\n const parts = partPath.split(\"/\");\n const fileName = parts.pop() || partPath;\n return `${parts.join(\"/\")}/_rels/${fileName}.rels`;\n}\n\nfunction resolvePptxRelationshipTarget(sourcePath: string, target?: string): string | undefined {\n if (!target || /^[a-z]+:/i.test(target)) {\n return undefined;\n }\n if (target.startsWith(\"/\")) {\n return target.slice(1);\n }\n const base = sourcePath.split(\"/\").slice(0, -1);\n for (const segment of target.split(\"/\")) {\n if (!segment || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n base.pop();\n } else {\n base.push(segment);\n }\n }\n return base.join(\"/\");\n}\n\nfunction slideNumberFromPath(path: string): number {\n return Number(path.match(/slide(\\d+)\\.xml$/i)?.[1] || \"0\");\n}\n\nfunction countMatches(value: string, pattern: RegExp): number {\n return [...value.matchAll(pattern)].length;\n}\n\nfunction matchXmlAttribute(value: string, pattern: RegExp): string | null {\n const match = value.match(pattern);\n return match ? decodeXml(match[1] || \"\") : null;\n}\n\nfunction titleFromOdf(xml: string, fallback: string): string {\n return matchXmlAttribute(xml, /<office:meta[\\s\\S]*?<dc:title[^>]*>([\\s\\S]*?)<\\/dc:title>/i) || fallback;\n}\n\nfunction isLegacyOfficeBinary(extension: string): boolean {\n return [\"doc\", \"dot\", \"xls\", \"xlt\", \"ppt\", \"pps\"].includes(extension);\n}\n\nfunction legacyOfficeFormatLabel(extension: string): string {\n if (extension === \"doc\" || extension === \"dot\") {\n return \"Word Binary File Format\";\n }\n if (extension === \"xls\" || extension === \"xlt\") {\n return \"Excel Binary File Format\";\n }\n return \"PowerPoint Binary File Format\";\n}\n\nfunction renderLegacyOfficeBinary(panel: HTMLElement, extension: string, arrayBuffer: ArrayBuffer, parseError?: string): void {\n const fragments = extractLegacyOfficeText(arrayBuffer);\n panel.replaceChildren();\n const section = createSection(\"Office 转换提示\");\n section.classList.add(\"ofv-office-conversion\");\n const format = document.createElement(\"p\");\n const strong = document.createElement(\"strong\");\n strong.textContent = `.${extension}`;\n format.append(\n strong,\n document.createTextNode(\n \" 属于旧版 Microsoft Office 二进制格式,浏览器内无法高保真解析;当前仅展示可信文本片段和结构指纹,完整排版建议接入 LibreOffice/OnlyOffice 服务端转换为 PDF/HTML。\"\n )\n );\n\n const meta = document.createElement(\"dl\");\n meta.className = \"ofv-office-binary-meta\";\n appendOfficeBinaryMeta(meta, \"格式类型\", legacyOfficeFormatLabel(extension));\n appendOfficeBinaryMeta(meta, \"文件结构\", hasOleSignature(arrayBuffer) ? \"检测到 OLE Compound File 签名\" : \"未检测到标准 OLE 签名,按原始二进制尝试提取\");\n appendOfficeBinaryMeta(meta, \"文本片段\", `${fragments.length} 段`);\n if (parseError) {\n appendOfficeBinaryMeta(meta, \"解析状态\", parseError);\n }\n\n section.append(format, meta);\n\n if (fragments.length > 0) {\n const article = document.createElement(\"article\");\n article.className = \"ofv-document ofv-office-binary-fragments\";\n const heading = document.createElement(\"h4\");\n heading.textContent = \"可读文本片段\";\n article.append(heading);\n for (const fragment of fragments.slice(0, 80)) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = fragment;\n article.append(paragraph);\n }\n section.append(article);\n } else {\n const empty = document.createElement(\"p\");\n empty.className = \"ofv-office-binary-empty\";\n empty.textContent = \"未提取到稳定可读文本。该文件可能经过压缩、加密,或文本编码无法在浏览器端可靠识别;请使用服务端 LibreOffice/OnlyOffice 转换后预览。\";\n section.append(empty);\n }\n\n panel.append(section);\n}\n\nfunction appendOfficeBinaryMeta(list: HTMLDListElement, label: string, value: string): void {\n const term = document.createElement(\"dt\");\n term.textContent = label;\n const detail = document.createElement(\"dd\");\n detail.textContent = value;\n list.append(term, detail);\n}\n\nfunction renderUnsupportedOffice(panel: HTMLElement, extension: string): void {\n const legacyBinary = new Set([\"doc\", \"dot\", \"wps\", \"ppt\", \"pps\", \"key\", \"dps\"]);\n const message = legacyBinary.has(extension)\n ? \"该格式属于老二进制或专有格式,浏览器内无法可靠解析;建议接入 LibreOffice/OnlyOffice 服务端转换为 PDF/HTML 后预览。\"\n : \"该格式通常需要服务端转换或专用解析器才能高保真预览。\";\n panel.replaceChildren();\n const section = createSection(\"Office 基础预览\");\n const format = document.createElement(\"p\");\n const strong = document.createElement(\"strong\");\n strong.textContent = `.${extension}`;\n format.append(strong, document.createTextNode(` 已进入 Office 插件。${message}`));\n\n const support = document.createElement(\"p\");\n support.textContent = \"当前版本优先支持 docx、rtf、odt/fodt、xlsx/xls/csv/ods、pptx/ppsx、odp/fodp 的基础内容预览。\";\n\n section.append(format, support);\n panel.append(section);\n}\n\nfunction normalizeOfficeError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error || \"\");\n return message ? `解析器返回:${message}` : \"解析器未返回具体错误信息。\";\n}\n\nfunction extractLegacyOfficeText(arrayBuffer: ArrayBuffer): string[] {\n const bytes = new Uint8Array(arrayBuffer);\n const fragments = [\n ...extractPrintableRuns(bytes).map((text) => ({ text, source: \"ascii\" as const })),\n ...extractUtf16Runs(bytes).map((text) => ({ text, source: \"utf16\" as const }))\n ]\n .map(({ text, source }) => ({ text: normalizeLegacyText(text), source }))\n .filter(({ text, source }) => isReadableLegacyTextFragment(text, source));\n const unique: string[] = [];\n const seen = new Set<string>();\n for (const { text: fragment } of fragments) {\n const key = fragment.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n unique.push(fragment);\n }\n }\n return unique.slice(0, 160);\n}\n\nfunction isReadableLegacyTextFragment(fragment: string, source: LegacyOfficeTextSource): boolean {\n if (fragment.length > 600) {\n return false;\n }\n if (isLegacyOfficeMetadataNoise(fragment)) {\n return false;\n }\n if (!/[\\p{L}\\p{N}]/u.test(fragment)) {\n return false;\n }\n const chars = Array.from(fragment);\n const letters = chars.filter((char) => /\\p{L}/u.test(char)).length;\n const digits = chars.filter((char) => /\\p{N}/u.test(char)).length;\n const spaces = chars.filter((char) => /\\s/u.test(char)).length;\n const asciiLetters = chars.filter((char) => /[A-Za-z]/.test(char)).length;\n const cjkLetters = chars.filter((char) => /[\\u3400-\\u9fff]/u.test(char)).length;\n const punctuation = chars.filter((char) => /[^\\p{L}\\p{N}\\s]/u.test(char)).length;\n const alphaNumeric = letters + digits;\n const readableRatio = alphaNumeric / chars.length;\n const punctuationRatio = punctuation / chars.length;\n\n if (fragment.length < 4 || readableRatio < 0.55 || punctuationRatio > 0.24) {\n return false;\n }\n if (/([\\p{L}\\p{N}])\\1{4,}/u.test(fragment)) {\n return false;\n }\n if (cjkLetters >= 2) {\n const suspiciousCjk = chars.filter((char) => isAsciiBytePairCjk(char)).length;\n if (suspiciousCjk / cjkLetters > 0.65) {\n return false;\n }\n if (isLikelyCjkHeading(fragment)) {\n return true;\n }\n if (punctuation > 0 && fragment.length < 12) {\n return false;\n }\n return cjkLetters >= 8 || (cjkLetters >= 4 && spaces > 0);\n }\n if (asciiLetters >= 4) {\n if (punctuation > 0 && spaces === 0) {\n return false;\n }\n if (source === \"ascii\" && /^[A-Z]{2,8}$/.test(fragment)) {\n return false;\n }\n if (spaces > 0) {\n return letters >= 3;\n }\n return fragment.length >= 6;\n }\n if (spaces > 0 && letters >= 3) {\n return true;\n }\n return false;\n}\n\nfunction isLegacyOfficeMetadataNoise(fragment: string): boolean {\n if (/[$�\\uFFFD]/u.test(fragment)) {\n return true;\n }\n if (/^(?:Root Entry|WordDocument|Workbook|Book|SummaryInformation|DocumentSummaryInformation|CompObj|ObjectPool|Data|PowerPoint Document|Pictures)$/i.test(fragment)) {\n return true;\n }\n if (/\\.(dotm?|docm?|pptx?|ppsx?|xlsm?|xlsx?)\\b/i.test(fragment)) {\n return true;\n }\n if (/^(?:默认段落字体|普通表格|正文|标题|副标题|目录|页眉|页脚|批注|超链接)(?:\\s*\\d+)?$/.test(fragment)) {\n return true;\n }\n if (/\\b(?:Normal|Default|Calibri|Times New Roman|WPS Office|Microsoft Office|KSOP?ProductBuildVer)\\b/i.test(fragment)) {\n return true;\n }\n if (/^\\d+(?:Table|List|Heading|Title|Style)$/i.test(fragment)) {\n return true;\n }\n if (/[{(]?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}[})]?/i.test(fragment)) {\n return true;\n }\n if (/^[A-Z_]{3,}$/.test(fragment) || /^[A-Za-z]+(?:Information|Document|Storage|Stream|Table|Data|Pool|Obj|Props)$/i.test(fragment)) {\n return true;\n }\n return false;\n}\n\nfunction isLikelyCjkHeading(fragment: string): boolean {\n return /^(?:标题|第[一二三四五六七八九十\\d]+[章节条]|[一二三四五六七八九十\\d]+[、..])\\s*[\\p{L}\\p{N}\\s-]*$/u.test(fragment);\n}\n\nfunction isAsciiBytePairCjk(char: string): boolean {\n const code = char.codePointAt(0) || 0;\n if (code < 0x3400 || code > 0x9fff) {\n return false;\n }\n const low = code & 0xff;\n const high = code >> 8;\n return isPrintableAsciiByte(low) && isPrintableAsciiByte(high);\n}\n\nfunction isPrintableAsciiByte(value: number): boolean {\n return value >= 0x20 && value <= 0x7e;\n}\n\nfunction extractPrintableRuns(bytes: Uint8Array): string[] {\n const fragments: string[] = [];\n let current = \"\";\n for (const byte of bytes) {\n if ((byte >= 32 && byte <= 126) || byte === 9) {\n current += String.fromCharCode(byte);\n } else {\n if (current.length >= 4) {\n fragments.push(current);\n }\n current = \"\";\n }\n }\n if (current.length >= 4) {\n fragments.push(current);\n }\n return fragments;\n}\n\nfunction extractUtf16Runs(bytes: Uint8Array): string[] {\n const fragments: string[] = [];\n let current = \"\";\n for (let index = 0; index < bytes.length - 1; index += 2) {\n if (looksLikeMisalignedAsciiUtf16(bytes[index], bytes[index + 1])) {\n if (current.length >= 3) {\n fragments.push(current);\n }\n current = \"\";\n continue;\n }\n const code = bytes[index] | (bytes[index + 1] << 8);\n if ((code >= 32 && code <= 0xd7ff) || code === 9) {\n current += String.fromCharCode(code);\n } else {\n if (current.length >= 3) {\n fragments.push(current);\n }\n current = \"\";\n }\n }\n if (current.length >= 3) {\n fragments.push(current);\n }\n return fragments;\n}\n\nfunction looksLikeMisalignedAsciiUtf16(lowByte: number, highByte: number): boolean {\n return lowByte === 0 && ((highByte >= 48 && highByte <= 57) || (highByte >= 65 && highByte <= 90) || (highByte >= 97 && highByte <= 122));\n}\n\nfunction normalizeLegacyText(value: string): string {\n return value.replace(/[\\u0000-\\u001f]+/g, \" \").replace(/\\s+/g, \" \").trim();\n}\n\nfunction hasOleSignature(arrayBuffer: ArrayBuffer): boolean {\n const signature = Array.from(new Uint8Array(arrayBuffer.slice(0, 8)));\n return signature.join(\",\") === \"208,207,17,224,161,177,26,225\";\n}\n\nasync function extractZipImages(\n zip: JSZip,\n pattern: RegExp\n): Promise<Array<{ name: string; src: string }>> {\n const images: Array<{ name: string; src: string }> = [];\n for (const entry of Object.values(zip.files).filter((item) => !item.dir && pattern.test(item.name))) {\n const mimeType = mimeTypeFromPath(entry.name);\n if (!mimeType.startsWith(\"image/\")) {\n continue;\n }\n images.push({\n name: entry.name.split(\"/\").pop() || entry.name,\n src: `data:${mimeType};base64,${await entry.async(\"base64\")}`\n });\n }\n return images;\n}\n\nfunction extractOpenXmlText(xml: string): string[] {\n return [...xml.matchAll(/<a:t>([\\s\\S]*?)<\\/a:t>|<w:t[^>]*>([\\s\\S]*?)<\\/w:t>/g)]\n .map((match) => decodeXml(match[1] || match[2] || \"\").trim())\n .filter(Boolean);\n}\n\nfunction extractWordParagraphs(xml: string): string[] {\n return [...xml.matchAll(/<w:p\\b[\\s\\S]*?<\\/w:p>/g)]\n .map((match) => extractOpenXmlText(match[0]).join(\"\"))\n .map((text) => text.trim())\n .filter(Boolean);\n}\n\nfunction extractOpenDocumentBlocks(xml: string): string[] {\n return [...xml.matchAll(/<(?:text:p|text:h)[^>]*>([\\s\\S]*?)<\\/(?:text:p|text:h)>/g)]\n .map((match) => stripXmlTags(match[1] || \"\"))\n .map((text) => decodeXml(text).trim())\n .filter(Boolean);\n}\n\nfunction stripXmlTags(value: string): string {\n return value\n .replace(/<text:line-break\\s*\\/>/g, \"\\n\")\n .replace(/<text:tab\\s*\\/>/g, \"\\t\")\n .replace(/<[^>]+>/g, \"\");\n}\n\nfunction rtfToText(rtf: string): string {\n return rtf\n .replace(/\\\\'[0-9a-fA-F]{2}/g, \"\")\n .replace(/\\\\par[d]?/g, \"\\n\")\n .replace(/\\\\tab/g, \"\\t\")\n .replace(/\\\\[a-zA-Z]+\\d* ?/g, \"\")\n .replace(/[{}]/g, \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nasync function readTextFromBuffer(arrayBuffer: ArrayBuffer): Promise<string> {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(arrayBuffer);\n}\n\n\nfunction mimeTypeFromPath(path: string): string {\n const extension = path.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n bmp: \"image/bmp\",\n svg: \"image/svg+xml\",\n webp: \"image/webp\"\n };\n return extension ? map[extension] || \"application/octet-stream\" : \"application/octet-stream\";\n}\n\nfunction decodeXml(value: string): string {\n return value\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll(\"&\", \"&\")\n .replaceAll(\""\", '\"')\n .replaceAll(\"'\", \"'\");\n}\n\nfunction sanitizeHtml(html: string): string {\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true },\n ADD_ATTR: [\"target\"]\n });\n}\n","import JSZip from \"jszip\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer } from \"./utils\";\n\nexport function ofdPlugin(): PreviewPlugin {\n return {\n name: \"ofd\",\n match(file) {\n return file.extension === \"ofd\" || file.mimeType === \"application/ofd\";\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-ofd\");\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n ctx.viewport.append(panel);\n let zip: JSZip;\n try {\n zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n } catch (error) {\n panel.append(createOfdFallback(ctx.file.name, url, normalizeOfdError(error)));\n return {\n destroy() {\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n\n const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n const textFragments: string[] = [];\n\n try {\n for (const entry of entries.filter((item) => item.name.endsWith(\".xml\")).slice(0, 40)) {\n const xml = await entry.async(\"text\");\n const matches = [...xml.matchAll(/>([^<>]{2,})</g)]\n .map((match) => match[1]?.trim())\n .filter(Boolean) as string[];\n textFragments.push(...matches);\n }\n } catch (error) {\n panel.append(createOfdFallback(ctx.file.name, url, normalizeOfdError(error)));\n return {\n destroy() {\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n\n const images = await readOfdImages(entries);\n const pages = await readOfdPages(entries, images);\n const section = createSection(\"OFD 基础预览\");\n const note = document.createElement(\"p\");\n note.textContent = pages.length > 0\n ? \"当前版本提取 OFD 页面文本、路径、直线和图片对象,并按 Boundary 坐标生成轻量 SVG 版式预览。复杂字体、签章和颜色空间可后续接入专用 OFD 渲染器。\"\n : \"当前版本提取 OFD 包内 XML 文本和文件结构。版式级渲染可在后续接入专用 OFD 渲染器。\";\n section.append(note);\n section.append(createOfdSummary(entries, pages, images));\n\n if (pages.length > 0) {\n const pagesWrap = document.createElement(\"div\");\n pagesWrap.className = \"ofv-ofd-pages\";\n for (const page of pages) {\n pagesWrap.append(renderOfdPage(page));\n }\n section.append(pagesWrap);\n }\n\n const content = document.createElement(\"pre\");\n content.className = \"ofv-text-block\";\n content.textContent = textFragments.slice(0, 300).join(\"\\n\") || \"未提取到可读文本。\";\n section.append(content);\n\n const list = createSection(`文件结构 ${entries.length}`);\n const ul = document.createElement(\"ul\");\n for (const entry of entries.slice(0, 200)) {\n const li = document.createElement(\"li\");\n li.textContent = entry.name;\n ul.append(li);\n }\n list.append(ul);\n panel.append(section, list);\n\n return {\n destroy() {\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\ntype OfdTextObject = {\n text: string;\n x: number;\n y: number;\n width: number;\n height: number;\n size: number;\n color: string;\n weight: string;\n letterSpacing?: number;\n};\n\ntype OfdPathObject = {\n d: string;\n x: number;\n y: number;\n width: number;\n height: number;\n stroke: string;\n fill: string;\n strokeWidth: number;\n};\n\ntype OfdLineObject = {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n stroke: string;\n strokeWidth: number;\n};\n\ntype OfdImageObject = {\n x: number;\n y: number;\n width: number;\n height: number;\n resourceId: string;\n href?: string;\n};\n\ntype OfdPagePreview = {\n name: string;\n width: number;\n height: number;\n texts: OfdTextObject[];\n paths: OfdPathObject[];\n lines: OfdLineObject[];\n images: OfdImageObject[];\n};\n\nfunction createOfdSummary(entries: JSZip.JSZipObject[], pages: OfdPagePreview[], images: Map<string, string>): HTMLElement {\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-ofd-summary\";\n const xmlEntries = entries.filter((entry) => entry.name.endsWith(\".xml\")).length;\n const textCount = pages.reduce((count, page) => count + page.texts.length, 0);\n const pathCount = pages.reduce((count, page) => count + page.paths.length, 0);\n const lineCount = pages.reduce((count, page) => count + page.lines.length, 0);\n const imageCount = pages.reduce((count, page) => count + page.images.length, 0);\n const textLength = pages.reduce((count, page) => count + page.texts.reduce((inner, item) => inner + item.text.length, 0), 0);\n appendOfdSummary(summary, \"文件\", String(entries.length));\n appendOfdSummary(summary, \"XML\", String(xmlEntries));\n appendOfdSummary(summary, \"页面\", String(pages.length));\n appendOfdSummary(summary, \"文本\", String(textCount));\n appendOfdSummary(summary, \"路径\", String(pathCount));\n appendOfdSummary(summary, \"线条\", String(lineCount));\n appendOfdSummary(summary, \"图片对象\", String(imageCount));\n appendOfdSummary(summary, \"图片资源\", String(uniqueOfdImageResources(images)));\n if (textLength > 0) {\n appendOfdSummary(summary, \"文字长度\", String(textLength));\n }\n const sizes = formatOfdPageSizes(pages);\n if (sizes) {\n appendOfdSummary(summary, \"页面尺寸\", sizes);\n }\n return summary;\n}\n\nfunction appendOfdSummary(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction uniqueOfdImageResources(images: Map<string, string>): number {\n return new Set(images.values()).size;\n}\n\nfunction formatOfdPageSizes(pages: OfdPagePreview[]): string {\n const counts = new Map<string, number>();\n for (const page of pages) {\n const key = `${Math.round(page.width)} x ${Math.round(page.height)}`;\n counts.set(key, (counts.get(key) || 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 4)\n .map(([size, count]) => (count > 1 ? `${size} (${count})` : size))\n .join(\", \");\n}\n\nasync function readOfdPages(\n entries: JSZip.JSZipObject[],\n images: Map<string, string>\n): Promise<OfdPagePreview[]> {\n const pages: OfdPagePreview[] = [];\n const pageEntries = entries\n .filter((entry) => /(^|\\/)Pages\\/Page_[^/]+\\/Content\\.xml$/i.test(entry.name) || /(^|\\/)Page_[^/]+\\/Content\\.xml$/i.test(entry.name))\n .slice(0, 80);\n for (const entry of pageEntries) {\n const xml = await entry.async(\"text\");\n const page = parseOfdPage(entry.name, xml, images);\n if (page.texts.length > 0 || page.paths.length > 0 || page.lines.length > 0 || page.images.length > 0) {\n pages.push(page);\n }\n }\n return pages;\n}\n\nfunction parseOfdPage(name: string, xml: string, images: Map<string, string>): OfdPagePreview {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return { name, width: 210, height: 297, texts: [], paths: [], lines: [], images: [] };\n }\n const pageSize = parseOfdPageSize(doc);\n const textObjects = Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"TextObject\");\n const texts = textObjects.flatMap((element) => parseOfdTextObject(element));\n const paths = Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"PathObject\")\n .flatMap((element) => parseOfdPathObject(element));\n const lines = Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"LineObject\")\n .flatMap((element) => parseOfdLineObject(element));\n const imageObjects = Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"ImageObject\")\n .flatMap((element) => parseOfdImageObject(element, images));\n const bounds = [\n ...texts.map((item) => ({ x: item.x, y: item.y, width: item.width, height: item.height })),\n ...paths.map((item) => ({ x: item.x, y: item.y, width: item.width, height: item.height })),\n ...lines.map((item) => ({\n x: Math.min(item.x1, item.x2),\n y: Math.min(item.y1, item.y2),\n width: Math.abs(item.x2 - item.x1),\n height: Math.abs(item.y2 - item.y1)\n })),\n ...imageObjects.map((item) => ({ x: item.x, y: item.y, width: item.width, height: item.height }))\n ];\n const width = Math.max(pageSize.width, ...bounds.map((item) => item.x + item.width + 12));\n const height = Math.max(pageSize.height, ...bounds.map((item) => item.y + item.height + 12));\n return { name, width, height, texts, paths, lines, images: imageObjects };\n}\n\nfunction parseOfdTextObject(element: Element): OfdTextObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const size = finiteNumber(getOfdAttribute(element, \"Size\"), Math.max(4, boundary.height || 5));\n const color = parseOfdColor(element, \"#111827\");\n const weight = finiteNumber(getOfdAttribute(element, \"Weight\"), 400) >= 600 ? \"700\" : \"400\";\n const letterSpacing = getOfdAttribute(element, \"DeltaX\") ? 0.5 : undefined;\n const textCodes = Array.from(element.getElementsByTagName(\"*\")).filter((child) => child.localName === \"TextCode\");\n if (textCodes.length === 0) {\n return [];\n }\n return textCodes.map((code) => {\n const x = boundary.x + finiteNumber(getOfdAttribute(code, \"X\"), 0);\n const y = boundary.y + finiteNumber(getOfdAttribute(code, \"Y\"), 0);\n return {\n text: code.textContent?.trim() || \"\",\n x,\n y,\n width: boundary.width,\n height: boundary.height,\n size,\n color,\n weight,\n letterSpacing\n };\n }).filter((item) => item.text);\n}\n\nfunction parseOfdPathObject(element: Element): OfdPathObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const commands = Array.from(element.getElementsByTagName(\"*\")).filter(\n (child) => child.localName === \"AbbreviatedData\" || child.localName === \"PathData\"\n );\n const raw = commands.map((child) => child.textContent || \"\").join(\" \").trim();\n if (!raw) {\n return [];\n }\n return [\n {\n d: normalizeOfdPathData(raw),\n x: boundary.x,\n y: boundary.y,\n width: boundary.width,\n height: boundary.height,\n stroke: parseOfdColor(element, \"#334155\", \"StrokeColor\"),\n fill: parseOfdFill(element),\n strokeWidth: finiteNumber(getOfdAttribute(element, \"LineWidth\"), 1)\n }\n ];\n}\n\nfunction parseOfdLineObject(element: Element): OfdLineObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const start = parsePoint(getOfdAttribute(element, \"StartPoint\"), { x: 0, y: 0 });\n const end = parsePoint(getOfdAttribute(element, \"EndPoint\"), {\n x: boundary.width,\n y: boundary.height\n });\n return [\n {\n x1: boundary.x + start.x,\n y1: boundary.y + start.y,\n x2: boundary.x + end.x,\n y2: boundary.y + end.y,\n stroke: parseOfdColor(element, \"#334155\"),\n strokeWidth: finiteNumber(getOfdAttribute(element, \"LineWidth\"), 1)\n }\n ];\n}\n\nfunction parseOfdImageObject(element: Element, images: Map<string, string>): OfdImageObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const resourceId = getOfdAttribute(element, \"ResourceID\") || getOfdAttribute(element, \"ResourceId\") || \"\";\n return [\n {\n x: boundary.x,\n y: boundary.y,\n width: boundary.width || 32,\n height: boundary.height || 32,\n resourceId,\n href: images.get(resourceId)\n }\n ];\n}\n\nfunction renderOfdPage(page: OfdPagePreview): HTMLElement {\n const figure = document.createElement(\"figure\");\n figure.className = \"ofv-ofd-page\";\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"viewBox\", `0 0 ${page.width} ${page.height}`);\n svg.setAttribute(\"role\", \"img\");\n svg.setAttribute(\"aria-label\", page.name);\n\n const paper = document.createElementNS(svg.namespaceURI, \"rect\");\n paper.setAttribute(\"x\", \"0\");\n paper.setAttribute(\"y\", \"0\");\n paper.setAttribute(\"width\", String(page.width));\n paper.setAttribute(\"height\", String(page.height));\n paper.setAttribute(\"fill\", \"white\");\n svg.append(paper);\n\n for (const item of page.images) {\n if (item.href) {\n const image = document.createElementNS(svg.namespaceURI, \"image\");\n image.setAttribute(\"x\", String(item.x));\n image.setAttribute(\"y\", String(item.y));\n image.setAttribute(\"width\", String(item.width));\n image.setAttribute(\"height\", String(item.height));\n image.setAttribute(\"href\", item.href);\n image.setAttribute(\"preserveAspectRatio\", \"xMidYMid meet\");\n svg.append(image);\n } else {\n const placeholder = document.createElementNS(svg.namespaceURI, \"rect\");\n placeholder.setAttribute(\"x\", String(item.x));\n placeholder.setAttribute(\"y\", String(item.y));\n placeholder.setAttribute(\"width\", String(item.width));\n placeholder.setAttribute(\"height\", String(item.height));\n placeholder.setAttribute(\"fill\", \"#f8fafc\");\n placeholder.setAttribute(\"stroke\", \"#94a3b8\");\n placeholder.setAttribute(\"stroke-dasharray\", \"4 3\");\n svg.append(placeholder);\n }\n }\n\n for (const item of page.paths) {\n const path = document.createElementNS(svg.namespaceURI, \"path\");\n path.setAttribute(\"d\", item.d);\n path.setAttribute(\"transform\", `translate(${item.x} ${item.y})`);\n path.setAttribute(\"fill\", item.fill);\n path.setAttribute(\"stroke\", item.stroke);\n path.setAttribute(\"stroke-width\", String(item.strokeWidth));\n svg.append(path);\n }\n\n for (const item of page.lines) {\n const line = document.createElementNS(svg.namespaceURI, \"line\");\n line.setAttribute(\"x1\", String(item.x1));\n line.setAttribute(\"y1\", String(item.y1));\n line.setAttribute(\"x2\", String(item.x2));\n line.setAttribute(\"y2\", String(item.y2));\n line.setAttribute(\"stroke\", item.stroke);\n line.setAttribute(\"stroke-width\", String(item.strokeWidth));\n line.setAttribute(\"stroke-linecap\", \"round\");\n svg.append(line);\n }\n\n for (const item of page.texts) {\n const text = document.createElementNS(svg.namespaceURI, \"text\");\n text.setAttribute(\"x\", String(item.x));\n text.setAttribute(\"y\", String(item.y + item.size));\n text.setAttribute(\"font-size\", String(item.size));\n text.setAttribute(\"fill\", item.color);\n text.setAttribute(\"font-weight\", item.weight);\n if (item.letterSpacing !== undefined) {\n text.setAttribute(\"letter-spacing\", String(item.letterSpacing));\n }\n text.textContent = item.text;\n svg.append(text);\n }\n\n const caption = document.createElement(\"figcaption\");\n caption.textContent = `${page.name} · ${page.texts.length} text · ${page.paths.length} path · ${page.lines.length} line · ${page.images.length} image`;\n figure.append(svg, caption);\n return figure;\n}\n\nasync function readOfdImages(entries: JSZip.JSZipObject[]): Promise<Map<string, string>> {\n const images = new Map<string, string>();\n for (const entry of entries.filter((item) => /\\.(?:png|jpe?g|gif|bmp|webp)$/i.test(item.name)).slice(0, 80)) {\n const id = entry.name.split(\"/\").pop()?.replace(/\\.[^.]+$/, \"\") || entry.name;\n const mimeType = mimeTypeFromPath(entry.name);\n if (!mimeType.startsWith(\"image/\")) {\n continue;\n }\n const base64 = await entry.async(\"base64\");\n const href = `data:${mimeType};base64,${base64}`;\n images.set(id, href);\n images.set(entry.name, href);\n images.set(entry.name.split(\"/\").pop() || entry.name, href);\n }\n return images;\n}\n\nfunction parseOfdPageSize(doc: Document): { width: number; height: number } {\n const physicalBox = Array.from(doc.getElementsByTagName(\"*\")).find((element) => element.localName === \"PhysicalBox\");\n if (physicalBox?.textContent) {\n const box = parseBoundary(physicalBox.textContent);\n if (box.width > 0 && box.height > 0) {\n return { width: box.width, height: box.height };\n }\n }\n return { width: 210, height: 297 };\n}\n\nfunction parseOfdColor(element: Element, fallback: string, preferredLocalName = \"FillColor\"): string {\n const colorElement = findOfdChild(element, preferredLocalName) || findOfdChild(element, \"StrokeColor\") || findOfdChild(element, \"FillColor\");\n const value = colorElement ? getOfdAttribute(colorElement, \"Value\") : null;\n if (!value) {\n return fallback;\n }\n const parts = value.trim().split(/\\s+/).map((part) => Number(part));\n if (parts.length >= 3 && parts.every((part) => Number.isFinite(part))) {\n return `rgb(${parts.slice(0, 3).map((part) => Math.max(0, Math.min(255, part))).join(\" \")})`;\n }\n return fallback;\n}\n\nfunction parseOfdFill(element: Element): string {\n const fillElement = findOfdChild(element, \"FillColor\");\n return fillElement ? parseOfdColor(element, \"transparent\", \"FillColor\") : \"transparent\";\n}\n\nfunction findOfdChild(element: Element, localName: string): Element | undefined {\n return Array.from(element.children).find((child) => child.localName === localName);\n}\n\nfunction parsePoint(value: string | null, fallback: { x: number; y: number }): { x: number; y: number } {\n const parts = (value || \"\").trim().split(/\\s+/).map((part) => Number(part));\n return {\n x: Number.isFinite(parts[0]) ? parts[0] : fallback.x,\n y: Number.isFinite(parts[1]) ? parts[1] : fallback.y\n };\n}\n\nfunction normalizeOfdPathData(value: string): string {\n return value\n .replace(/\\bM\\s+/gi, \"M \")\n .replace(/\\bL\\s+/gi, \"L \")\n .replace(/\\bC\\s+/gi, \"C \")\n .replace(/\\bQ\\s+/gi, \"Q \")\n .replace(/\\bA\\s+/gi, \"A \")\n .replace(/\\bB\\s+/gi, \"C \")\n .replace(/\\bZ\\b/gi, \"Z\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction mimeTypeFromPath(path: string): string {\n const extension = path.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n bmp: \"image/bmp\",\n webp: \"image/webp\"\n };\n return extension ? map[extension] || \"application/octet-stream\" : \"application/octet-stream\";\n}\n\nfunction parseBoundary(value: string | null): { x: number; y: number; width: number; height: number } {\n const parts = (value || \"\").trim().split(/\\s+/).map((part) => Number(part));\n return {\n x: Number.isFinite(parts[0]) ? parts[0] : 0,\n y: Number.isFinite(parts[1]) ? parts[1] : 0,\n width: Number.isFinite(parts[2]) ? parts[2] : 0,\n height: Number.isFinite(parts[3]) ? parts[3] : 0\n };\n}\n\nfunction getOfdAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction finiteNumber(value: string | null, fallback: number): number {\n const parsed = value === null ? Number.NaN : Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction createOfdFallback(fileName: string, url: string, detail: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"OFD 解析失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = `${detail}。可下载 ${fileName} 后使用本地 OFD 阅读器查看。`;\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载 OFD\";\n\n fallback.append(title, meta, download);\n return fallback;\n}\n\nfunction normalizeOfdError(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return \"文件可能已损坏,或不是有效的 OFD 包\";\n}\n","import JSZip from \"jszip\";\nimport pako from \"pako\";\nimport type { PreviewPlugin, PreviewFile } from \"../types\";\nimport { normalizeFile } from \"../detect\";\nimport { fallbackPlugin } from \"./fallback\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport { appendMeta, createPanel, createSection, readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst archiveExtensions = new Set([\"zip\", \"rar\", \"7z\", \"tar\", \"gz\", \"tgz\", \"bz2\", \"xz\"]);\nconst archiveMimeTypes = new Set([\n \"application/zip\",\n \"application/x-zip-compressed\",\n \"application/vnd.rar\",\n \"application/x-rar-compressed\",\n \"application/x-7z-compressed\",\n \"application/x-tar\",\n \"application/gzip\",\n \"application/x-gzip\",\n \"application/x-bzip2\",\n \"application/x-xz\"\n]);\nconst archiveMimeFormatMap: Record<string, string> = {\n \"application/zip\": \"zip\",\n \"application/x-zip-compressed\": \"zip\",\n \"application/vnd.rar\": \"rar\",\n \"application/x-rar-compressed\": \"rar\",\n \"application/x-7z-compressed\": \"7z\",\n \"application/x-tar\": \"tar\",\n \"application/gzip\": \"gz\",\n \"application/x-gzip\": \"gz\",\n \"application/x-bzip2\": \"bz2\",\n \"application/x-xz\": \"xz\"\n};\n\ninterface ArchiveEntry {\n name: string;\n unsafeName?: string;\n size: number;\n dir: boolean;\n read: () => Promise<ArrayBuffer>;\n}\n\ninterface ArchiveProbe {\n format: string;\n valid: boolean;\n error?: string;\n meta: Array<{ label: string; value: string }>;\n entries: Array<{ name: string; size?: number; packedSize?: number }>;\n note: string;\n}\n\nexport function archivePlugin(): PreviewPlugin {\n return {\n name: \"archive\",\n match(file) {\n return archiveExtensions.has(file.extension) || archiveMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const panel = createPanel(\"ofv-archive\");\n ctx.viewport.append(panel);\n\n const ext = resolveFormat(ctx.file, archiveMimeFormatMap).toLowerCase();\n let archiveEntries: ArchiveEntry[] = [];\n let isEncrypted = false;\n let parseError: string | null = null;\n let archiveProbe: ArchiveProbe | null = null;\n\n // 1. Parse different archive formats\n try {\n if (ext === \"zip\") {\n try {\n const zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n archiveEntries = Object.values(zip.files).map((entry) => ({\n name: entry.name,\n unsafeName: (entry as any).unsafeOriginalName,\n size: (entry as any)._data?.uncompressedSize || 0,\n dir: entry.dir,\n read: () => entry.async(\"arraybuffer\")\n }));\n } catch (zipErr: any) {\n // Check for encryption errors\n if (\n zipErr.message &&\n (zipErr.message.includes(\"encrypted\") ||\n zipErr.message.includes(\"password\") ||\n zipErr.message.includes(\"protected\"))\n ) {\n isEncrypted = true;\n } else {\n throw zipErr;\n }\n }\n } else if (ext === \"tar\") {\n archiveEntries = untar(await readArrayBuffer(ctx.file));\n } else if (ext === \"gz\" || ext === \"tgz\" || ext === \"tar.gz\") {\n const u8 = new Uint8Array(await readArrayBuffer(ctx.file));\n const decompressed = pako.ungzip(u8);\n const originalName = ctx.file.name.endsWith(\".gz\")\n ? ctx.file.name.slice(0, -3)\n : ctx.file.name.endsWith(\".tgz\")\n ? ctx.file.name.slice(0, -4) + \".tar\"\n : ctx.file.name;\n\n if (ext === \"tgz\" || ext === \"tar.gz\" || originalName.endsWith(\".tar\")) {\n archiveEntries = untar(decompressed.buffer);\n } else {\n // Single decompressed file\n archiveEntries = [\n {\n name: originalName,\n size: decompressed.byteLength,\n dir: false,\n read: async () => decompressed.buffer\n }\n ];\n }\n } else if ([\"rar\", \"7z\", \"bz2\", \"xz\"].includes(ext)) {\n archiveProbe = probeArchiveHeader(await readArrayBuffer(ctx.file), ext);\n } else {\n parseError = `该格式 (.${ext.toUpperCase()}) 目前暂不支持直接在浏览器端在线解压和目录预览。`;\n }\n } catch (err: any) {\n parseError = `压缩包解析失败:${err.message || err}`;\n }\n\n // 2. Encrypted Archive Prompt UI\n if (isEncrypted) {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n \n const title = document.createElement(\"strong\");\n title.textContent = \"该压缩包已被加密保护\";\n \n const meta = document.createElement(\"span\");\n meta.textContent = \"为了您的数据安全,本预览器不支持直接在线解密。请下载文件后在本地输入密码解压。\";\n \n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n \n fallback.append(title, meta, download);\n panel.append(fallback);\n ctx.viewport.classList.add(\"ofv-center\");\n \n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n\n if (archiveProbe) {\n renderArchiveProbe(panel, archiveProbe, ctx.file.name, url);\n return {\n destroy() {\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n\n // 3. Fallback Unsupported message (RAR, 7z, etc.)\n if (parseError) {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n \n const title = document.createElement(\"strong\");\n title.textContent = parseError;\n \n const meta = document.createElement(\"span\");\n meta.textContent = \"建议下载视频/文档等文件至本地查看,或使用原生解压工具提取内容。\";\n \n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载压缩包\";\n \n fallback.append(title, meta, download);\n panel.append(fallback);\n ctx.viewport.classList.add(\"ofv-center\");\n\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n\n // 4. Split Layout UI for interactive preview\n const layout = document.createElement(\"div\");\n layout.className = \"ofv-archive-layout\";\n\n const sidebar = document.createElement(\"div\");\n sidebar.className = \"ofv-archive-sidebar\";\n const sidebarPanel = document.createElement(\"div\");\n sidebarPanel.className = \"ofv-archive-sidebar-panel\";\n\n const header = document.createElement(\"div\");\n header.className = \"ofv-archive-header\";\n const sidebarTitle = document.createElement(\"span\");\n sidebarTitle.className = \"ofv-archive-header-title\";\n sidebarTitle.textContent = `文件列表 (${archiveEntries.filter(e => !e.dir).length})`;\n const sidebarToggle = document.createElement(\"button\");\n sidebarToggle.className = \"ofv-archive-sidebar-toggle\";\n sidebarToggle.type = \"button\";\n sidebarToggle.setAttribute(\"aria-label\", \"展开文件列表\");\n sidebarToggle.setAttribute(\"aria-expanded\", \"false\");\n sidebarToggle.title = \"展开文件列表\";\n sidebarToggle.textContent = \"‹\";\n header.append(sidebarToggle, sidebarTitle);\n sidebarPanel.append(header);\n\n const tree = document.createElement(\"div\");\n tree.className = \"ofv-archive-tree\";\n sidebarPanel.append(tree);\n sidebar.append(sidebarPanel);\n\n const mainPanel = document.createElement(\"div\");\n mainPanel.className = \"ofv-archive-main\";\n\n layout.append(sidebar, mainPanel);\n panel.append(layout);\n\n let currentSubInstance: any = null;\n const getSidebarViewportWidth = () => ctx.viewport.clientWidth || ctx.size.width;\n const shouldAutoCollapseSidebar = () => getSidebarViewportWidth() <= 520;\n const setSidebarCollapsed = (collapsed: boolean) => {\n layout.classList.toggle(\"is-sidebar-collapsed\", collapsed);\n sidebarToggle.setAttribute(\"aria-expanded\", String(!collapsed));\n const label = collapsed ? \"展开文件列表\" : \"收起文件列表\";\n sidebarToggle.setAttribute(\"aria-label\", label);\n sidebarToggle.title = label;\n sidebarToggle.textContent = collapsed ? \"›\" : \"‹\";\n };\n setSidebarCollapsed(false);\n sidebarToggle.addEventListener(\"click\", () => {\n setSidebarCollapsed(!layout.classList.contains(\"is-sidebar-collapsed\"));\n });\n\n // Render default metadata summary\n const showDefaultSummary = () => {\n mainPanel.replaceChildren();\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-archive-info\";\n \n const heading = document.createElement(\"h3\");\n heading.textContent = ctx.file.name;\n\n const info = document.createElement(\"div\");\n info.className = \"ofv-archive-info-meta\";\n \n const fileCount = archiveEntries.filter(e => !e.dir).length;\n const dirCount = archiveEntries.filter(e => e.dir).length;\n \n appendArchiveInfo(info, \"格式类型\", `.${ext.toUpperCase()} 压缩文件`);\n appendArchiveInfo(info, \"包含文件数\", `${fileCount} 个`);\n appendArchiveInfo(info, \"包含目录数\", `${dirCount} 个`);\n appendArchiveInfo(info, \"操作提示\", \"请点击左侧栏中的文件进行联动预览。\");\n \n summary.append(heading, info, createArchiveSummary(archiveEntries));\n mainPanel.append(summary);\n };\n\n showDefaultSummary();\n\n // Filter and render items (max 500 to keep DOM lightweight)\n const visibleEntries = archiveEntries.filter(e => !e.dir).slice(0, 500);\n let destroyed = false;\n let renderToken = 0;\n\n visibleEntries.forEach((entry) => {\n const item = document.createElement(\"button\");\n item.className = \"ofv-archive-item\";\n item.type = \"button\";\n item.title = entry.name;\n\n const icon = document.createElement(\"span\");\n icon.className = \"ofv-archive-item-icon\";\n icon.textContent = getIcon(entry.name, entry.dir);\n\n const name = document.createElement(\"span\");\n name.className = \"ofv-archive-item-name\";\n name.textContent = entry.name;\n name.title = entry.name;\n\n item.append(icon, name);\n tree.append(item);\n\n item.addEventListener(\"click\", async () => {\n if (destroyed) {\n return;\n }\n if (shouldAutoCollapseSidebar()) {\n setSidebarCollapsed(true);\n }\n const token = ++renderToken;\n // Highlight active item\n sidebar.querySelectorAll(\".ofv-archive-item\").forEach((el) => {\n el.classList.remove(\"is-active\");\n el.removeAttribute(\"aria-current\");\n });\n item.classList.add(\"is-active\");\n item.setAttribute(\"aria-current\", \"true\");\n\n // Cleanup previous sub-preview\n if (currentSubInstance) {\n currentSubInstance.destroy();\n currentSubInstance = null;\n }\n\n // Show loading state\n mainPanel.replaceChildren(createArchiveLoading(entry.name.split(\"/\").pop() || entry.name));\n\n try {\n let buffer = await entry.read();\n if (destroyed || token !== renderToken) {\n return;\n }\n const subName = entry.name.split(\"/\").pop() || entry.name;\n const subExt = subName.split(\".\").pop()?.toLowerCase() || \"\";\n\n // Shapefile components linkage mechanism:\n // Combine adjacent .dbf, .shx, and .prj files into a single ZIP buffer in memory\n if (subExt === \"shp\") {\n const basePath = entry.name.slice(0, -4);\n const dbfEntry = archiveEntries.find(\n (e) => e.name.toLowerCase() === basePath.toLowerCase() + \".dbf\"\n );\n const shxEntry = archiveEntries.find(\n (e) => e.name.toLowerCase() === basePath.toLowerCase() + \".shx\"\n );\n if (dbfEntry && shxEntry) {\n const prjEntry = archiveEntries.find(\n (e) => e.name.toLowerCase() === basePath.toLowerCase() + \".prj\"\n );\n const newZip = new JSZip();\n newZip.file(subName, buffer);\n newZip.file(dbfEntry.name.split(\"/\").pop()!, await dbfEntry.read());\n newZip.file(shxEntry.name.split(\"/\").pop()!, await shxEntry.read());\n if (prjEntry) {\n newZip.file(prjEntry.name.split(\"/\").pop()!, await prjEntry.read());\n }\n buffer = await newZip.generateAsync({ type: \"arraybuffer\" });\n if (destroyed || token !== renderToken) {\n return;\n }\n }\n }\n\n const subContainer = document.createElement(\"div\");\n subContainer.style.cssText = \"width: 100%; height: 100%; position: relative; display: flex; flex-direction: column;\";\n mainPanel.replaceChildren(subContainer);\n\n const subViewport = document.createElement(\"div\");\n subViewport.className = \"ofv-viewport\";\n subViewport.style.cssText = \"flex: 1; width: 100%; height: 100%; position: relative; overflow: auto;\";\n subContainer.append(subViewport);\n\n const subFile: PreviewFile = await normalizeFile(buffer, subName);\n\n const plugins = [...(ctx.options.plugins || []), fallbackPlugin()];\n let matchedPlugin = await findSubPreviewPlugin(plugins, subFile);\n if (destroyed || token !== renderToken) {\n return;\n }\n if (matchedPlugin.name === \"archive\") {\n matchedPlugin = fallbackPlugin();\n }\n\n let previewError: Error | undefined;\n const nextSubInstance = await Promise.resolve()\n .then(() =>\n matchedPlugin.render({\n host: ctx.host,\n viewport: subViewport,\n file: subFile,\n size: { width: subViewport.clientWidth || 600, height: subViewport.clientHeight || 400 },\n options: ctx.options,\n setLoading: () => {},\n setError: (err) => {\n previewError = err instanceof Error ? err : new Error(String(err));\n subViewport.replaceChildren(createInlineError(\"文件预览失败\", previewError.message));\n }\n })\n )\n .catch((error: unknown) => {\n previewError = error instanceof Error ? error : new Error(String(error));\n subViewport.replaceChildren(createInlineError(\"文件预览失败\", previewError.message));\n return undefined;\n });\n if (destroyed || token !== renderToken) {\n nextSubInstance?.destroy();\n return;\n }\n if (nextSubInstance && !previewError) {\n currentSubInstance = nextSubInstance;\n } else if (nextSubInstance) {\n nextSubInstance.destroy();\n }\n } catch (err: any) {\n if (destroyed || token !== renderToken) {\n return;\n }\n mainPanel.replaceChildren(createInlineError(\"解压加载失败\", String(err.message || err)));\n }\n });\n });\n\n return {\n resize(size) {\n currentSubInstance?.resize?.(size);\n },\n destroy() {\n destroyed = true;\n renderToken += 1;\n if (currentSubInstance) {\n currentSubInstance.destroy();\n }\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n };\n}\n\nasync function findSubPreviewPlugin(plugins: PreviewPlugin[], file: PreviewFile): Promise<PreviewPlugin> {\n for (const plugin of plugins) {\n if (await plugin.match(file)) {\n return plugin;\n }\n }\n return fallbackPlugin();\n}\n\nfunction createInlineError(titleText: string, detailText: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = titleText;\n const detail = document.createElement(\"span\");\n detail.textContent = detailText;\n fallback.append(title, detail);\n return fallback;\n}\n\nfunction appendArchiveInfo(parent: HTMLElement, label: string, value: string): void {\n const row = document.createElement(\"div\");\n const key = document.createElement(\"strong\");\n key.textContent = `${label}:`;\n row.append(key, document.createTextNode(value));\n parent.append(row);\n}\n\nfunction createArchiveSummary(entries: ArchiveEntry[]): HTMLElement {\n const files = entries.filter((entry) => !entry.dir);\n const summary = document.createElement(\"dl\");\n summary.className = \"ofv-archive-summary\";\n const totalSize = files.reduce((sum, entry) => sum + entry.size, 0);\n const largest = files.reduce<ArchiveEntry | undefined>((current, entry) => (!current || entry.size > current.size ? entry : current), undefined);\n appendArchiveSummary(summary, \"总解压大小\", formatBytes(totalSize));\n appendArchiveSummary(summary, \"最大文件\", largest ? `${largest.name} · ${formatBytes(largest.size)}` : \"无\");\n appendArchiveSummary(summary, \"类型分布\", formatArchiveExtensions(files));\n appendArchiveSummary(summary, \"可预览条目\", String(files.slice(0, 500).length));\n appendArchiveSummary(summary, \"风险路径\", String(files.filter((entry) => isRiskyArchivePath(entry.unsafeName || entry.name)).length));\n return summary;\n}\n\nfunction appendArchiveSummary(parent: HTMLElement, label: string, value: string): void {\n const key = document.createElement(\"dt\");\n key.textContent = label;\n const content = document.createElement(\"dd\");\n content.textContent = value;\n parent.append(key, content);\n}\n\nfunction formatArchiveExtensions(entries: ArchiveEntry[]): string {\n const counts = new Map<string, number>();\n for (const entry of entries) {\n const name = entry.name.split(\"/\").pop() || entry.name;\n const index = name.lastIndexOf(\".\");\n const extension = index > 0 ? name.slice(index + 1).toLowerCase() : \"(无扩展名)\";\n counts.set(extension, (counts.get(extension) || 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, 6)\n .map(([extension, count]) => `${extension} ${count}`)\n .join(\", \") || \"无\";\n}\n\nfunction isRiskyArchivePath(name: string): boolean {\n return name.startsWith(\"/\") || /^[A-Za-z]:[\\\\/]/.test(name) || name.split(/[\\\\/]+/).includes(\"..\");\n}\n\nfunction createArchiveLoading(fileName: string): HTMLElement {\n const loading = document.createElement(\"div\");\n loading.className = \"ofv-archive-loading\";\n const spinner = document.createElement(\"div\");\n spinner.className = \"ofv-archive-loading-spinner\";\n const text = document.createElement(\"span\");\n text.textContent = `正在解压并加载 [${fileName}]...`;\n loading.append(spinner, text);\n return loading;\n}\n\nfunction renderArchiveProbe(panel: HTMLElement, probe: ArchiveProbe, fileName: string, url: string): void {\n const section = createSection(`${probe.format} 结构预览`);\n const note = document.createElement(\"p\");\n note.textContent = probe.note;\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-archive-probe-meta\";\n appendArchiveInfo(meta, \"文件\", fileName);\n appendArchiveInfo(meta, \"格式\", probe.format);\n for (const item of probe.meta) {\n appendArchiveInfo(meta, item.label, item.value);\n }\n\n const download = document.createElement(\"a\");\n download.className = \"ofv-asset-download\";\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载压缩包\";\n\n section.append(note, meta, download);\n\n if (!probe.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = probe.error || \"压缩包头信息无法识别。\";\n section.append(error);\n }\n\n if (probe.entries.length > 0) {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-table-scroll ofv-archive-probe-table\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"文件\", \"原始大小\", \"压缩大小\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const entry of probe.entries.slice(0, 200)) {\n const tr = document.createElement(\"tr\");\n for (const value of [\n entry.name,\n entry.size === undefined ? \"未知\" : formatBytes(entry.size),\n entry.packedSize === undefined ? \"未知\" : formatBytes(entry.packedSize)\n ]) {\n const td = document.createElement(\"td\");\n td.textContent = value;\n tr.append(td);\n }\n tbody.append(tr);\n }\n table.append(thead, tbody);\n wrapper.append(table);\n section.append(wrapper);\n }\n\n panel.append(section);\n}\n\nfunction probeArchiveHeader(arrayBuffer: ArrayBuffer, extension: string): ArchiveProbe {\n const bytes = new Uint8Array(arrayBuffer);\n if (extension === \"rar\") {\n return probeRar(bytes);\n }\n if (extension === \"7z\") {\n return probe7z(bytes);\n }\n if (extension === \"bz2\") {\n return probeBzip2(bytes);\n }\n if (extension === \"xz\") {\n return probeXz(bytes);\n }\n return {\n format: extension.toUpperCase(),\n valid: false,\n error: \"暂不支持该压缩格式的头信息解析。\",\n meta: [],\n entries: [],\n note: \"当前仅提供压缩包识别和下载入口。\"\n };\n}\n\nfunction probeRar(bytes: Uint8Array): ArchiveProbe {\n const rar4 = bytes.length >= 7 && bytes[0] === 0x52 && bytes[1] === 0x61 && bytes[2] === 0x72 && bytes[3] === 0x21 && bytes[4] === 0x1a && bytes[5] === 0x07 && bytes[6] === 0x00;\n const rar5 = bytes.length >= 8 && bytes[0] === 0x52 && bytes[1] === 0x61 && bytes[2] === 0x72 && bytes[3] === 0x21 && bytes[4] === 0x1a && bytes[5] === 0x07 && bytes[6] === 0x01 && bytes[7] === 0x00;\n const entries = rar4 ? parseRar4Entries(bytes) : [];\n return {\n format: \"RAR\",\n valid: rar4 || rar5,\n error: rar4 || rar5 ? undefined : \"缺少 RAR signature。\",\n meta: [\n { label: \"版本\", value: rar5 ? \"RAR5\" : rar4 ? \"RAR4\" : \"未知\" },\n { label: \"签名\", value: byteSignature(bytes) },\n { label: \"可见条目\", value: String(entries.length) }\n ],\n entries,\n note: rar4\n ? \"当前轻量读取 RAR4 未加密文件头,用于目录确认;实际解压仍建议接入 unrar WASM 或本地工具。\"\n : \"当前识别 RAR 容器和版本;RAR5 目录解析需要专用解码器。\"\n };\n}\n\nfunction parseRar4Entries(bytes: Uint8Array): ArchiveProbe[\"entries\"] {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const entries: ArchiveProbe[\"entries\"] = [];\n let offset = 7;\n while (offset + 7 <= bytes.length && entries.length < 200) {\n const type = bytes[offset + 2];\n const flags = view.getUint16(offset + 3, true);\n let headerSize = view.getUint16(offset + 5, true);\n if (headerSize < 7 || offset + headerSize > bytes.length) {\n break;\n }\n if ((flags & 0x8000) !== 0) {\n if (offset + 11 > bytes.length) {\n break;\n }\n headerSize += view.getUint32(offset + 7, true);\n }\n if (type === 0x74 && offset + 32 <= bytes.length) {\n const packedSize = view.getUint32(offset + 7, true);\n const unpackedSize = view.getUint32(offset + 11, true);\n const nameSize = view.getUint16(offset + 26, true);\n const nameOffset = offset + 32;\n const nameEnd = Math.min(nameOffset + nameSize, offset + headerSize, bytes.length);\n const nameBytes = bytes.slice(nameOffset, nameEnd);\n const name = new TextDecoder(\"latin1\").decode(nameBytes).replace(/\\0.*$/, \"\");\n if (name) {\n entries.push({ name, size: unpackedSize, packedSize });\n }\n }\n offset += headerSize;\n }\n return entries;\n}\n\nfunction probe7z(bytes: Uint8Array): ArchiveProbe {\n const valid = bytes.length >= 32 && bytes[0] === 0x37 && bytes[1] === 0x7a && bytes[2] === 0xbc && bytes[3] === 0xaf && bytes[4] === 0x27 && bytes[5] === 0x1c;\n const meta: ArchiveProbe[\"meta\"] = [{ label: \"签名\", value: byteSignature(bytes) }];\n if (valid) {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n meta.push({ label: \"版本\", value: `${bytes[6]}.${bytes[7]}` });\n meta.push({ label: \"Next header offset\", value: String(readUint64Le(view, 12)) });\n meta.push({ label: \"Next header size\", value: String(readUint64Le(view, 20)) });\n meta.push({ label: \"Next header CRC\", value: `0x${view.getUint32(28, true).toString(16).toUpperCase()}` });\n }\n return {\n format: \"7Z\",\n valid,\n error: valid ? undefined : \"缺少 7z signature。\",\n meta,\n entries: [],\n note: \"当前识别 7z 容器和 next header 边界;目录和解压需要 LZMA/7z 专用解码器。\"\n };\n}\n\nfunction probeBzip2(bytes: Uint8Array): ArchiveProbe {\n const valid = bytes.length >= 4 && bytes[0] === 0x42 && bytes[1] === 0x5a && bytes[2] === 0x68 && bytes[3] >= 0x31 && bytes[3] <= 0x39;\n return {\n format: \"BZIP2\",\n valid,\n error: valid ? undefined : \"缺少 BZh magic header。\",\n meta: [\n { label: \"签名\", value: byteSignature(bytes) },\n { label: \"块大小\", value: valid ? `${String.fromCharCode(bytes[3])}00 KB` : \"未知\" }\n ],\n entries: [],\n note: \"BZIP2 通常是单文件压缩流,本预览器当前展示容器头信息;解压可后续接入 bzip2 解码器。\"\n };\n}\n\nfunction probeXz(bytes: Uint8Array): ArchiveProbe {\n const valid = bytes.length >= 6 && bytes[0] === 0xfd && bytes[1] === 0x37 && bytes[2] === 0x7a && bytes[3] === 0x58 && bytes[4] === 0x5a && bytes[5] === 0x00;\n return {\n format: \"XZ\",\n valid,\n error: valid ? undefined : \"缺少 XZ magic header。\",\n meta: [\n { label: \"签名\", value: byteSignature(bytes) },\n { label: \"Stream flags\", value: bytes.length >= 8 ? `0x${bytes[6].toString(16).padStart(2, \"0\").toUpperCase()} 0x${bytes[7].toString(16).padStart(2, \"0\").toUpperCase()}` : \"未知\" }\n ],\n entries: [],\n note: \"XZ 通常是单文件 LZMA2 压缩流,本预览器当前展示容器头信息;解压可后续接入 xz/lzma 解码器。\"\n };\n}\n\nfunction readUint64Le(view: DataView, offset: number): bigint {\n return BigInt(view.getUint32(offset, true)) | (BigInt(view.getUint32(offset + 4, true)) << 32n);\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction byteSignature(bytes: Uint8Array): string {\n if (bytes.length === 0) {\n return \"空文件\";\n }\n const ascii = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 16))).replace(/[^\\x20-\\x7E]/g, \".\");\n const hex = Array.from(bytes.slice(0, Math.min(bytes.length, 8)))\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \");\n return `${ascii} (${hex})`;\n}\n\n// 5. Lightweight TAR parser\nfunction untar(arrayBuffer: ArrayBuffer): ArchiveEntry[] {\n const entries: ArchiveEntry[] = [];\n const u8 = new Uint8Array(arrayBuffer);\n let offset = 0;\n\n const readString = (start: number, length: number): string => {\n let end = start;\n while (end < start + length && u8[end] !== 0) {\n end++;\n }\n return new TextDecoder().decode(u8.subarray(start, end)).trim();\n };\n\n while (offset + 512 <= arrayBuffer.byteLength) {\n const magic = readString(offset + 257, 6);\n if (magic !== \"ustar\" && magic !== \"ustar\\0\") {\n let allZero = true;\n for (let i = 0; i < 512; i++) {\n if (u8[offset + i] !== 0) {\n allZero = false;\n break;\n }\n }\n if (allZero) {\n break; // End of archive\n }\n break;\n }\n\n const name = readString(offset, 100);\n const prefix = readString(offset + 345, 155);\n const fullName = prefix ? `${prefix}/${name}` : name;\n\n const sizeStr = readString(offset + 124, 12);\n const size = parseInt(sizeStr, 8) || 0;\n const typeflag = readString(offset + 156, 1);\n const dir = typeflag === \"5\" || fullName.endsWith(\"/\");\n\n const contentOffset = offset + 512;\n entries.push({\n name: fullName,\n size,\n dir,\n read: async () => arrayBuffer.slice(contentOffset, contentOffset + size)\n });\n\n offset += 512 + Math.ceil(size / 512) * 512;\n }\n\n return entries;\n}\n\n// 6. UI Helpers\nfunction getIcon(name: string, dir: boolean): string {\n if (dir) return \"📁\";\n const ext = name.split(\".\").pop()?.toLowerCase();\n switch (ext) {\n case \"png\":\n case \"jpg\":\n case \"jpeg\":\n case \"gif\":\n case \"svg\":\n case \"webp\":\n return \"🖼️\";\n case \"pdf\":\n return \"📕\";\n case \"doc\":\n case \"docx\":\n return \"📘\";\n case \"xls\":\n case \"xlsx\":\n return \"📗\";\n case \"ppt\":\n case \"pptx\":\n return \"📙\";\n case \"zip\":\n case \"rar\":\n case \"7z\":\n case \"tar\":\n case \"gz\":\n return \"📦\";\n case \"mp4\":\n case \"mkv\":\n case \"avi\":\n case \"webm\":\n return \"🎥\";\n case \"mp3\":\n case \"wav\":\n case \"ogg\":\n return \"🎵\";\n case \"txt\":\n case \"md\":\n case \"html\":\n case \"js\":\n case \"ts\":\n case \"json\":\n case \"css\":\n return \"📄\";\n default:\n return \"📄\";\n }\n}\n","import DOMPurify from \"dompurify\";\nimport type { PreviewPlugin } from \"../types\";\nimport { appendMeta, createPanel, createSection, readArrayBuffer, readTextFile, resolveFormat } from \"./utils\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\n\nconst emailExtensions = new Set([\"eml\", \"msg\", \"mbox\"]);\nconst emailMimeTypes = new Set([\"message/rfc822\", \"application/vnd.ms-outlook\", \"application/mbox\"]);\nconst emailMimeFormatMap: Record<string, string> = {\n \"message/rfc822\": \"eml\",\n \"application/vnd.ms-outlook\": \"msg\",\n \"application/mbox\": \"mbox\"\n};\n\ninterface EmailAttachment {\n name: string;\n mimeType: string;\n content: Uint8Array;\n contentId?: string;\n}\n\ninterface EmailData {\n from: string;\n to: string;\n cc?: string;\n subject: string;\n date: string;\n bodyText?: string;\n bodyHtml?: string;\n attachments: EmailAttachment[];\n}\n\ninterface MboxMessageSummary {\n from: string;\n subject: string;\n date: string;\n}\n\nexport function emailPlugin(): PreviewPlugin {\n return {\n name: \"email\",\n match(file) {\n return emailExtensions.has(file.extension) || emailMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-email\");\n ctx.viewport.append(panel);\n\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const ext = resolveFormat(ctx.file, emailMimeFormatMap).toLowerCase();\n let emailData: EmailData;\n const objectUrlsToRevoke: string[] = [];\n const attachmentObjectUrls = new Map<EmailAttachment, string>();\n const timersToClear: number[] = [];\n let mboxSummary: MboxMessageSummary[] = [];\n\n try {\n if (ext === \"msg\") {\n // Parse Outlook binary MSG format\n const MsgReader = (await import(\"@kenjiuno/msgreader\")).default;\n const buffer = await readArrayBuffer(ctx.file);\n const reader = new MsgReader(buffer);\n const parsed = reader.getFileData();\n\n if (parsed.error) {\n throw new Error(parsed.error);\n }\n\n const from = parsed.senderName\n ? `${parsed.senderName} <${parsed.senderEmail || parsed.senderSmtpAddress || \"\"}>`.trim()\n : parsed.senderEmail || parsed.senderSmtpAddress || \"\";\n\n const recipients = parsed.recipients || [];\n const to = recipients\n .filter((r) => r.recipType === \"to\")\n .map((r) => `${r.name || \"\"} <${r.email || r.smtpAddress || \"\"}>`.trim())\n .join(\"; \");\n const cc = recipients\n .filter((r) => r.recipType === \"cc\")\n .map((r) => `${r.name || \"\"} <${r.email || r.smtpAddress || \"\"}>`.trim())\n .join(\"; \");\n\n const attachments: EmailAttachment[] = [];\n if (Array.isArray(parsed.attachments)) {\n parsed.attachments.forEach((att) => {\n try {\n const fullAtt = reader.getAttachment(att);\n attachments.push({\n name: fullAtt.fileName || \"未命名附件\",\n mimeType: getAttachmentMimeType(fullAtt, att),\n content: fullAtt.content,\n contentId: att.pidContentId\n });\n } catch (attErr) {\n console.warn(\"Failed to parse attachment:\", attErr);\n }\n });\n }\n\n let bodyHtml = parsed.bodyHtml;\n if (!bodyHtml && parsed.html instanceof Uint8Array) {\n bodyHtml = new TextDecoder(\"utf-8\").decode(parsed.html);\n }\n\n emailData = {\n from: from || \"-\",\n to: to || \"-\",\n cc: cc || \"\",\n subject: parsed.subject || \"(无主题)\",\n date: parsed.messageDeliveryTime || parsed.clientSubmitTime || parsed.creationTime || \"-\",\n bodyText: parsed.body,\n bodyHtml,\n attachments\n };\n } else {\n // Parse EML or MBOX text formats\n const PostalMime = (await import(\"postal-mime\")).default;\n const parser = new PostalMime();\n \n let rawText = await readTextFile(ctx.file);\n if (ext === \"mbox\") {\n const messages = splitMboxMessages(rawText);\n mboxSummary = messages.map(summarizeMboxMessage);\n rawText = messages[0] || rawText;\n }\n\n const parsed = await parser.parse(rawText);\n\n const from = parsed.from ? `${parsed.from.name || \"\"} <${parsed.from.address || \"\"}>`.trim() : \"\";\n const to = Array.isArray(parsed.to)\n ? parsed.to.map((t) => `${t.name || \"\"} <${t.address || \"\"}>`.trim()).join(\"; \")\n : \"\";\n const cc = Array.isArray(parsed.cc)\n ? parsed.cc.map((c) => `${c.name || \"\"} <${c.address || \"\"}>`.trim()).join(\"; \")\n : \"\";\n\n emailData = {\n from: from || \"-\",\n to: to || \"-\",\n cc: cc || \"\",\n subject: parsed.subject || \"(无主题)\",\n date: parsed.date || \"-\",\n bodyText: parsed.text,\n bodyHtml: parsed.html,\n attachments: (parsed.attachments || []).map((att) => ({\n name: att.filename || \"未命名附件\",\n mimeType: att.mimeType || \"application/octet-stream\",\n content: att.content instanceof Uint8Array ? att.content : new Uint8Array(att.content as any),\n contentId: att.contentId\n }))\n };\n }\n\n if (mboxSummary.length > 0) {\n panel.append(createMboxSummarySection(mboxSummary));\n }\n\n // 1. Render Header information section\n const headerSection = createSection(\"邮件信息\");\n appendMeta(headerSection, \"Subject\", emailData.subject);\n appendMeta(headerSection, \"From\", emailData.from);\n appendMeta(headerSection, \"To\", emailData.to);\n if (emailData.cc) {\n appendMeta(headerSection, \"Cc\", emailData.cc);\n }\n appendMeta(headerSection, \"Date\", emailData.date);\n panel.append(headerSection);\n\n // 2. Render Attachments section if present\n if (emailData.attachments.length > 0) {\n const attachmentsSection = createSection(\"附件列表\");\n const container = document.createElement(\"div\");\n container.className = \"ofv-email-attachments\";\n\n emailData.attachments.forEach((att) => {\n const blobUrl = getAttachmentObjectUrl(att, attachmentObjectUrls, objectUrlsToRevoke);\n\n const item = document.createElement(\"a\");\n item.className = \"ofv-email-attachment-item\";\n item.href = blobUrl;\n item.download = att.name;\n item.rel = \"noopener noreferrer\";\n \n // Format attachment size helper\n const sizeKB = Math.round(att.content.byteLength / 1024);\n item.textContent = `Attachment: ${att.name} (${sizeKB} KB)`;\n container.append(item);\n });\n \n attachmentsSection.append(container);\n panel.append(attachmentsSection);\n }\n\n // 3. Render Body section (support inline cid images)\n const bodySection = createSection(\"正文\");\n panel.append(bodySection);\n\n let html = emailData.bodyHtml;\n if (html) {\n // Replace inline cid: content IDs with local blob URLs\n let nextHtml = html;\n emailData.attachments.forEach((att) => {\n const contentId = att.contentId;\n if (contentId) {\n const blobUrl = getAttachmentObjectUrl(att, attachmentObjectUrls, objectUrlsToRevoke);\n\n const cleanCid = contentId.replace(/[<>]/g, \"\");\n nextHtml = replaceCidResourceUrls(nextHtml, contentId, blobUrl);\n if (cleanCid !== contentId) {\n nextHtml = replaceCidResourceUrls(nextHtml, cleanCid, blobUrl);\n }\n }\n });\n html = nextHtml;\n const sanitizedHtml = sanitizeEmailHtml(html);\n\n // Render in a sandboxed iframe to prevent styles leaking\n const iframe = document.createElement(\"iframe\");\n iframe.className = \"ofv-email-body-iframe\";\n iframe.setAttribute(\"sandbox\", \"allow-popups allow-popups-to-escape-sandbox\");\n iframe.style.cssText = \"width: 100%; border: none; background: #fff; min-height: 200px;\";\n bodySection.append(iframe);\n\n iframe.onload = () => {\n try {\n const idoc = iframe.contentDocument || iframe.contentWindow?.document;\n if (idoc) {\n idoc.open();\n idoc.write(`\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\" />\n <style>\n body {\n margin: 16px;\n padding: 0;\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n font-size: 14px;\n line-height: 1.6;\n color: #1f2937;\n }\n img { max-width: 100%; height: auto; display: block; margin: 12px 0; }\n a { color: #2563eb; }\n blockquote {\n margin: 12px 0;\n padding-left: 12px;\n border-left: 3px solid #d1d5db;\n color: #4b5563;\n }\n </style>\n </head>\n <body>${sanitizedHtml}</body>\n </html>\n `);\n idoc.close();\n secureEmailLinks(idoc);\n\n // Auto-adjust height to avoid double scrolling\n const resize = () => {\n const body = idoc.body;\n const docEl = idoc.documentElement;\n const height = Math.max(\n body.scrollHeight,\n body.offsetHeight,\n docEl.clientHeight,\n docEl.scrollHeight,\n docEl.offsetHeight\n );\n iframe.style.height = `${height + 32}px`;\n };\n\n resize();\n timersToClear.push(window.setTimeout(resize, 300));\n timersToClear.push(window.setTimeout(resize, 1000));\n }\n } catch (err) {\n console.error(\"Failed to write html body to email iframe:\", err);\n }\n };\n } else {\n // Render plain text body\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = emailData.bodyText || \"未解析到正文。\";\n bodySection.append(pre);\n }\n\n } catch (err: any) {\n panel.replaceChildren();\n const errorSection = createSection(\"邮件解析出错\");\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.style.color = \"#ef4444\";\n pre.textContent = `解析邮件时发生错误:\\n${err.message || err}`;\n errorSection.append(pre);\n panel.append(errorSection);\n }\n\n return {\n destroy() {\n timersToClear.forEach((timer) => window.clearTimeout(timer));\n objectUrlsToRevoke.forEach((u) => {\n URL.revokeObjectURL(u);\n });\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction getAttachmentObjectUrl(\n attachment: EmailAttachment,\n cache: Map<EmailAttachment, string>,\n urlsToRevoke: string[]\n): string {\n const cached = cache.get(attachment);\n if (cached) {\n return cached;\n }\n const blob = new Blob([attachment.content as BlobPart], { type: attachment.mimeType });\n const url = URL.createObjectURL(blob);\n cache.set(attachment, url);\n urlsToRevoke.push(url);\n return url;\n}\n\nfunction getAttachmentMimeType(fullAttachment: unknown, attachmentMeta?: unknown): string {\n const candidates = [fullAttachment, attachmentMeta];\n for (const candidate of candidates) {\n if (!candidate || typeof candidate !== \"object\") {\n continue;\n }\n const record = candidate as Record<string, unknown>;\n const explicitMime =\n normalizeMimeValue(record.attachMimeTag) ||\n normalizeMimeValue(record.mimeType) ||\n normalizeMimeValue(record.contentType) ||\n normalizeMimeValue(record.mime) ||\n normalizeMimeValue(record[\"content-type\"]);\n if (explicitMime) {\n return explicitMime;\n }\n }\n\n const fileName =\n (fullAttachment && typeof fullAttachment === \"object\" ? (fullAttachment as { fileName?: unknown }).fileName : undefined) ||\n (attachmentMeta && typeof attachmentMeta === \"object\" ? (attachmentMeta as { fileName?: unknown }).fileName : undefined);\n return getMimeType(typeof fileName === \"string\" ? fileName : \"\");\n}\n\nfunction normalizeMimeValue(value: unknown): string {\n if (typeof value !== \"string\") {\n return \"\";\n }\n const mimeType = value.split(\";\")[0]?.trim().toLowerCase() || \"\";\n return mimeType.includes(\"/\") ? mimeType : \"\";\n}\n\nfunction replaceCidResourceUrls(html: string, contentId: string, blobUrl: string): string {\n const escapedCid = escapeRegExp(contentId);\n return html.replace(\n new RegExp(`\\\\b(src|poster|background)=([\"'])cid:${escapedCid}\\\\2`, \"gi\"),\n (_match, attribute: string, quote: string) => `${attribute}=${quote}${blobUrl}${quote}`\n );\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction createMboxSummarySection(messages: MboxMessageSummary[]): HTMLElement {\n const section = createSection(\"MBOX 邮箱摘要\");\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-email-mbox-meta\";\n appendMeta(meta, \"邮件数\", String(messages.length));\n appendMeta(meta, \"预览\", \"当前正文显示第一封邮件\");\n\n const tableWrap = document.createElement(\"div\");\n tableWrap.className = \"ofv-table-scroll ofv-email-mbox-table\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"#\", \"Subject\", \"From\", \"Date\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n messages.slice(0, 100).forEach((message, index) => {\n const row = document.createElement(\"tr\");\n for (const value of [String(index + 1), message.subject || \"(无主题)\", message.from || \"-\", message.date || \"-\"]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n row.append(cell);\n }\n tbody.append(row);\n });\n table.append(thead, tbody);\n tableWrap.append(table);\n section.append(meta, tableWrap);\n return section;\n}\n\nfunction splitMboxMessages(mboxText: string): string[] {\n const lines = mboxText.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n const messages: string[][] = [];\n let current: string[] | null = null;\n let foundFirstFrom = false;\n\n for (const line of lines) {\n if (line.startsWith(\"From \")) {\n if (current && current.length > 0) {\n messages.push(current);\n }\n current = [];\n foundFirstFrom = true;\n continue;\n }\n if (foundFirstFrom && current) {\n current.push(line.startsWith(\">From \") ? line.slice(1) : line);\n }\n }\n if (current && current.length > 0) {\n messages.push(current);\n }\n return messages.length > 0 ? messages.map((message) => message.join(\"\\n\")) : [mboxText];\n}\n\nfunction summarizeMboxMessage(message: string): MboxMessageSummary {\n return {\n from: unfoldHeader(readHeaderValue(message, \"From\")),\n subject: unfoldHeader(readHeaderValue(message, \"Subject\")),\n date: unfoldHeader(readHeaderValue(message, \"Date\"))\n };\n}\n\nfunction readHeaderValue(message: string, name: string): string {\n const headers = message.split(/\\n\\s*\\n/, 1)[0] || \"\";\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = headers.match(new RegExp(`^${escaped}:\\\\s*([\\\\s\\\\S]*?)(?=\\\\n[^\\\\s:]+:|\\\\n\\\\s*\\\\n|$)`, \"im\"));\n return match?.[1]?.trim() || \"\";\n}\n\nfunction unfoldHeader(value: string): string {\n return value.replace(/\\n[ \\t]+/g, \" \").trim();\n}\n\n// File extension to MIME type helper for attachment previews\nfunction getMimeType(name: string): string {\n const ext = name.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n pdf: \"application/pdf\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n html: \"text/html\",\n mp4: \"video/mp4\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\"\n };\n return ext ? map[ext] || \"application/octet-stream\" : \"application/octet-stream\";\n}\n\nfunction sanitizeEmailHtml(html: string): string {\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true },\n ADD_ATTR: [\"target\"],\n ALLOWED_URI_REGEXP: /^(?:(?:https?|mailto|tel|blob|cid):|[^a-z]|[a-z+.-]+(?:[^a-z+.-:]|$))/i\n });\n}\n\nfunction secureEmailLinks(document: Document): void {\n for (const link of document.querySelectorAll<HTMLAnchorElement>(\"a[href]\")) {\n const href = link.getAttribute(\"href\") || \"\";\n if (!isSafeEmailHref(href)) {\n link.removeAttribute(\"href\");\n link.removeAttribute(\"target\");\n link.removeAttribute(\"rel\");\n continue;\n }\n if (/^(https?:)?\\/\\//i.test(href)) {\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n }\n }\n}\n\nfunction isSafeEmailHref(href: string): boolean {\n const trimmed = href.trim();\n return (\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"/\") ||\n trimmed.startsWith(\"./\") ||\n trimmed.startsWith(\"../\") ||\n trimmed.startsWith(\"blob:\") ||\n /^(https?:|mailto:|tel:)/i.test(trimmed)\n );\n}\n","import pako from \"pako\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readTextFile, resolveFormat } from \"./utils\";\n\nconst drawingExtensions = new Set([\"drawio\", \"dio\", \"excalidraw\", \"tldraw\"]);\nconst drawingMimeFormatMap: Record<string, string> = {\n \"application/vnd.jgraph.mxfile\": \"drawio\",\n \"application/vnd.excalidraw+json\": \"excalidraw\",\n \"application/x-excalidraw+json\": \"excalidraw\"\n};\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nexport function drawingPlugin(): PreviewPlugin {\n return {\n name: \"drawing\",\n match(file) {\n return drawingExtensions.has(file.extension) || Boolean(drawingMimeFormatMap[file.mimeType]);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-drawing\");\n ctx.viewport.append(panel);\n const text = await readTextFile(ctx.file);\n const extension = resolveFormat(ctx.file, drawingMimeFormatMap);\n\n try {\n if (extension === \"excalidraw\") {\n renderExcalidraw(panel, text);\n } else if (extension === \"tldraw\") {\n renderTldraw(panel, text);\n } else if (extension === \"drawio\" || extension === \"dio\") {\n renderDrawio(panel, text);\n } else {\n renderRawDrawing(panel, extension || \"drawing\", text);\n }\n } catch (error) {\n renderDrawingParseFallback(panel, extension || \"drawing\", text, error);\n }\n\n return {\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\ntype DrawingSummaryItem = {\n type: string;\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n text?: string;\n image?: boolean;\n embed?: boolean;\n edge?: boolean;\n};\n\nfunction createDrawingSummary(items: DrawingSummaryItem[]): HTMLElement {\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-drawing-summary\";\n const typeCounts = countDrawingTypes(items);\n appendDrawingSummary(summary, \"对象\", String(items.length));\n appendDrawingSummary(summary, \"类型\", formatDrawingTypes(typeCounts));\n appendDrawingSummary(summary, \"文本\", String(items.filter((item) => item.text && item.text.trim()).length));\n appendDrawingSummary(summary, \"连线\", String(items.filter((item) => item.edge).length));\n const media = items.filter((item) => item.image || item.embed).length;\n if (media > 0) {\n appendDrawingSummary(summary, \"媒体/嵌入\", String(media));\n }\n const bounds = drawingBounds(items);\n if (bounds) {\n appendDrawingSummary(summary, \"范围\", `${Math.round(bounds[0])}, ${Math.round(bounds[1])}, ${Math.round(bounds[2])}, ${Math.round(bounds[3])}`);\n }\n return summary;\n}\n\nfunction appendDrawingSummary(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction countDrawingTypes(items: DrawingSummaryItem[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of items) {\n counts.set(item.type, (counts.get(item.type) || 0) + 1);\n }\n return counts;\n}\n\nfunction formatDrawingTypes(counts: Map<string, number>): string {\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 6)\n .map(([type, count]) => `${type} ${count}`)\n .join(\", \") || \"无\";\n}\n\nfunction drawingBounds(items: DrawingSummaryItem[]): [number, number, number, number] | undefined {\n const boxes = items\n .map((item) => {\n if (!Number.isFinite(item.x) || !Number.isFinite(item.y)) {\n return undefined;\n }\n const x = item.x as number;\n const y = item.y as number;\n const width = Math.max(0, finiteNumber(item.width, 0));\n const height = Math.max(0, finiteNumber(item.height, 0));\n return [x, y, x + width, y + height] as [number, number, number, number];\n })\n .filter((item): item is [number, number, number, number] => Boolean(item));\n if (boxes.length === 0) {\n return undefined;\n }\n return [\n Math.min(...boxes.map((box) => box[0])),\n Math.min(...boxes.map((box) => box[1])),\n Math.max(...boxes.map((box) => box[2])),\n Math.max(...boxes.map((box) => box[3]))\n ];\n}\n\nfunction excalidrawSummaryItem(element: Record<string, unknown>): DrawingSummaryItem {\n return {\n type: String(element.type || \"unknown\"),\n x: finiteNumber(element.x, 0),\n y: finiteNumber(element.y, 0),\n width: finiteNumber(element.width, 0),\n height: finiteNumber(element.height, 0),\n text: String(element.text || element.name || \"\"),\n image: element.type === \"image\",\n embed: element.type === \"embeddable\",\n edge: element.type === \"arrow\" || element.type === \"line\"\n };\n}\n\nfunction tldrawSummaryItem(shape: TldrawShape): DrawingSummaryItem {\n const props = shape.props || {};\n return {\n type: String(shape.type || props.type || \"unknown\"),\n x: finiteNumber(shape.x, 0),\n y: finiteNumber(shape.y, 0),\n width: finiteNumber(props.w, finiteNumber(props.width, 0)),\n height: finiteNumber(props.h, finiteNumber(props.height, 0)),\n text: String(props.text || \"\"),\n edge: shape.type === \"arrow\" || shape.type === \"line\"\n };\n}\n\nfunction drawioSummaryItem(shape: DrawioShape): DrawingSummaryItem {\n return {\n type: shape.edge ? \"edge\" : drawioShapeName(shape.style),\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n text: shape.value,\n image: drawioShapeName(shape.style) === \"image\",\n edge: shape.edge\n };\n}\n\nfunction renderExcalidraw(panel: HTMLElement, text: string): void {\n const data = JSON.parse(text) as {\n elements?: Array<Record<string, unknown>>;\n files?: Record<string, { dataURL?: string; mimeType?: string; id?: string }>;\n };\n const files = data.files || {};\n const elements = (data.elements || []).filter((element) => !element.isDeleted);\n const section = createSection(`Excalidraw ${elements.length} elements`);\n section.append(createDrawingSummary(elements.map(excalidrawSummaryItem)));\n const svg = document.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n svg.setAttribute(\"viewBox\", createExcalidrawViewBox(elements));\n const defs = document.createElementNS(SVG_NS, \"defs\");\n svg.append(defs);\n\n for (const element of elements) {\n const type = String(element.type || \"\");\n const x = Number(element.x || 0);\n const y = Number(element.y || 0);\n const width = Number(element.width || 80);\n const height = Number(element.height || 40);\n const stroke = String(element.strokeColor || \"#111827\");\n const fill = excalidrawFill(svg, defs, element, stroke);\n const common = getExcalidrawCommonAttrs(element);\n const transform = excalidrawTransform(element, x, y, width, height);\n\n if (type === \"frame\") {\n const frame = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(frame, {\n x,\n y,\n width,\n height,\n rx: 4,\n fill: \"transparent\",\n stroke: \"#94a3b8\",\n \"stroke-width\": 2,\n \"stroke-dasharray\": \"8 6\",\n opacity: common.opacity,\n transform\n });\n svg.append(frame);\n appendSvgMultilineText(svg, String(element.name || \"Frame\"), x + 12, y + 24, \"#64748b\", {\n fontSize: 14,\n transform\n });\n } else if (type === \"image\") {\n renderExcalidrawImage(svg, element, files, x, y, width, height, common, transform);\n } else if (type === \"embeddable\") {\n renderExcalidrawEmbeddable(svg, element, x, y, width, height, common, transform);\n } else if (type === \"rectangle\" || type === \"diamond\") {\n if (type === \"diamond\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n polygon.setAttribute(\n \"points\",\n `${x + width / 2},${y} ${x + width},${y + height / 2} ${x + width / 2},${y + height} ${x},${y + height / 2}`\n );\n applySvgAttrs(polygon, { fill, stroke, ...common, transform });\n svg.append(polygon);\n } else {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x,\n y,\n width,\n height,\n rx: finiteNumber(element.roundness && typeof element.roundness === \"object\" ? (element.roundness as Record<string, unknown>).value : undefined, 0),\n fill,\n stroke,\n ...common,\n transform\n });\n svg.append(rect);\n }\n } else if (type === \"ellipse\") {\n const ellipse = document.createElementNS(SVG_NS, \"ellipse\");\n applySvgAttrs(ellipse, {\n cx: x + width / 2,\n cy: y + height / 2,\n rx: Math.abs(width / 2),\n ry: Math.abs(height / 2),\n fill,\n stroke,\n ...common,\n transform\n });\n svg.append(ellipse);\n } else if (type === \"line\" || type === \"arrow\") {\n const points = excalidrawPoints(element, x, y, width, height);\n if (points.length > 2) {\n const polyline = document.createElementNS(SVG_NS, \"polyline\");\n applySvgAttrs(polyline, {\n points: points.map((point) => `${point.x},${point.y}`).join(\" \"),\n fill: \"none\",\n stroke,\n ...common,\n transform\n });\n svg.append(polyline);\n appendExcalidrawArrowHeads(svg, element, points, stroke);\n } else {\n const start = points[0] || { x, y };\n const end = points[points.length - 1] || { x: x + width, y: y + height };\n const line = document.createElementNS(SVG_NS, \"line\");\n applySvgAttrs(line, {\n x1: start.x,\n y1: start.y,\n x2: end.x,\n y2: end.y,\n stroke,\n ...common,\n transform\n });\n svg.append(line);\n appendExcalidrawArrowHeads(svg, element, [start, end], stroke);\n }\n } else if (type === \"freedraw\") {\n const path = createExcalidrawFreedrawPath(element, x, y);\n if (path) {\n applySvgAttrs(path, { fill: \"none\", stroke, ...common, transform });\n svg.append(path);\n }\n } else if (type === \"text\") {\n const fontSize = finiteNumber(element.fontSize, 18);\n const lines = String(element.text || \"\").split(/\\r?\\n/);\n const textAlign = String(element.textAlign || \"left\");\n const verticalAlign = String(element.verticalAlign || \"top\");\n const anchor = textAlign === \"center\" ? \"middle\" : textAlign === \"right\" ? \"end\" : \"start\";\n const textX = textAlign === \"center\" ? x + width / 2 : textAlign === \"right\" ? x + width : x;\n const textY =\n verticalAlign === \"middle\"\n ? y + height / 2 - ((lines.length - 1) * fontSize * 1.25) / 2\n : verticalAlign === \"bottom\"\n ? y + height - (lines.length - 1) * fontSize * 1.25\n : y + fontSize;\n appendSvgMultilineText(svg, String(element.text || \"\"), textX, textY, stroke, {\n fontSize,\n fontFamily: String(element.fontFamily || \"Inter, ui-sans-serif, system-ui, sans-serif\"),\n anchor,\n dominantBaseline: verticalAlign === \"middle\" ? \"middle\" : \"auto\",\n opacity: common.opacity,\n transform\n });\n }\n }\n\n section.append(svg);\n panel.append(section);\n}\n\nfunction renderExcalidrawImage(\n svg: SVGSVGElement,\n element: Record<string, unknown>,\n files: Record<string, { dataURL?: string; mimeType?: string; id?: string }>,\n x: number,\n y: number,\n width: number,\n height: number,\n common: Record<string, string | number>,\n transform: string\n): void {\n const fileId = String(element.fileId || \"\");\n const file = fileId ? files[fileId] : undefined;\n const dataUrl = file?.dataURL || \"\";\n if (isSafeExcalidrawImageDataUrl(dataUrl)) {\n const image = document.createElementNS(SVG_NS, \"image\");\n applySvgAttrs(image, {\n x,\n y,\n width,\n height,\n href: dataUrl,\n preserveAspectRatio: \"xMidYMid meet\",\n opacity: common.opacity,\n transform\n });\n svg.append(image);\n return;\n }\n\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x,\n y,\n width,\n height,\n rx: 8,\n fill: \"#f8fafc\",\n stroke: \"#94a3b8\",\n \"stroke-width\": 1.5,\n \"stroke-dasharray\": \"6 4\",\n opacity: common.opacity,\n transform\n });\n svg.append(rect);\n appendSvgMultilineText(svg, fileId ? `Image\\n${fileId}` : \"Image\", x + width / 2, y + height / 2 - 8, \"#64748b\", {\n fontSize: 13,\n anchor: \"middle\",\n transform\n });\n}\n\nfunction renderExcalidrawEmbeddable(\n svg: SVGSVGElement,\n element: Record<string, unknown>,\n x: number,\n y: number,\n width: number,\n height: number,\n common: Record<string, string | number>,\n transform: string\n): void {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x,\n y,\n width,\n height,\n rx: 10,\n fill: \"#eef2ff\",\n stroke: \"#6366f1\",\n \"stroke-width\": 1.5,\n \"stroke-dasharray\": \"8 5\",\n opacity: common.opacity,\n transform\n });\n svg.append(rect);\n const link = String(element.link || element.url || \"Embedded content\");\n appendSvgMultilineText(svg, `Embed\\n${shortenText(link, 48)}`, x + width / 2, y + height / 2 - 10, \"#4338ca\", {\n fontSize: 13,\n anchor: \"middle\",\n transform\n });\n}\n\nfunction appendSvgMultilineText(\n svg: SVGSVGElement,\n text: string,\n x: number,\n y: number,\n fill: string,\n options: {\n fontSize?: number;\n fontFamily?: string;\n anchor?: string;\n dominantBaseline?: string;\n opacity?: string | number;\n transform?: string;\n } = {}\n): SVGTextElement {\n const textNode = document.createElementNS(SVG_NS, \"text\");\n applySvgAttrs(textNode, {\n x,\n y,\n fill,\n \"font-size\": options.fontSize || 18,\n \"font-family\": options.fontFamily || \"Inter, ui-sans-serif, system-ui, sans-serif\",\n \"text-anchor\": options.anchor,\n \"dominant-baseline\": options.dominantBaseline,\n opacity: options.opacity,\n transform: options.transform\n });\n for (const [index, line] of text.split(/\\r?\\n/).entries()) {\n const span = document.createElementNS(SVG_NS, \"tspan\");\n span.setAttribute(\"x\", String(x));\n span.setAttribute(\"dy\", index === 0 ? \"0\" : \"1.25em\");\n span.textContent = line;\n textNode.append(span);\n }\n svg.append(textNode);\n return textNode;\n}\n\nfunction isSafeExcalidrawImageDataUrl(value: string): boolean {\n return /^data:image\\/(?:png|jpe?g|gif|webp|bmp);base64,/i.test(value);\n}\n\nfunction shortenText(value: string, maxLength: number): string {\n return value.length > maxLength ? `${value.slice(0, Math.max(0, maxLength - 3))}...` : value;\n}\n\nfunction createExcalidrawViewBox(elements: Array<Record<string, unknown>>): string {\n if (elements.length === 0) {\n return \"0 0 1200 800\";\n }\n const bounds = elements.map((element) => {\n const x = finiteNumber(element.x, 0);\n const y = finiteNumber(element.y, 0);\n const points = Array.isArray(element.points) ? element.points.map((point) => pointFromValue(point, { x: 0, y: 0 })) : [];\n const width = Math.max(1, finiteNumber(element.width, Math.max(80, ...points.map((point) => point.x))));\n const height = Math.max(1, finiteNumber(element.height, Math.max(40, ...points.map((point) => point.y))));\n return { x, y, width, height };\n });\n const minX = Math.min(...bounds.map((bound) => bound.x)) - 40;\n const minY = Math.min(...bounds.map((bound) => bound.y)) - 40;\n const maxX = Math.max(...bounds.map((bound) => bound.x + bound.width)) + 40;\n const maxY = Math.max(...bounds.map((bound) => bound.y + bound.height)) + 40;\n return `${minX} ${minY} ${Math.max(320, maxX - minX)} ${Math.max(240, maxY - minY)}`;\n}\n\nfunction getExcalidrawCommonAttrs(element: Record<string, unknown>): Record<string, string | number> {\n const strokeWidth = finiteNumber(element.strokeWidth, 1.5);\n const opacity = Math.max(0, Math.min(1, finiteNumber(element.opacity, 100) / 100));\n const style = String(element.strokeStyle || \"solid\");\n return {\n \"stroke-width\": strokeWidth,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"stroke-dasharray\": style === \"dashed\" ? `${strokeWidth * 6} ${strokeWidth * 4}` : style === \"dotted\" ? `${strokeWidth} ${strokeWidth * 4}` : \"\",\n opacity\n };\n}\n\nfunction excalidrawFill(\n svg: SVGSVGElement,\n defs: SVGDefsElement,\n element: Record<string, unknown>,\n stroke: string\n): string {\n const value = String(element.backgroundColor || \"transparent\");\n if (!value || value === \"transparent\") {\n return \"transparent\";\n }\n const fillStyle = String(element.fillStyle || \"solid\");\n if (fillStyle === \"solid\") {\n return value;\n }\n const id = `ofv-excalidraw-${fillStyle}-${defs.children.length}`;\n const pattern = document.createElementNS(SVG_NS, \"pattern\");\n applySvgAttrs(pattern, {\n id,\n width: 10,\n height: 10,\n patternUnits: \"userSpaceOnUse\"\n });\n const background = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(background, { width: 10, height: 10, fill: value, opacity: 0.35 });\n pattern.append(background);\n if (fillStyle === \"cross-hatch\") {\n pattern.append(createPatternLine(svg, \"M 0 10 L 10 0\", stroke));\n pattern.append(createPatternLine(svg, \"M 0 0 L 10 10\", stroke));\n } else if (fillStyle === \"dots\") {\n const dot = document.createElementNS(SVG_NS, \"circle\");\n applySvgAttrs(dot, { cx: 5, cy: 5, r: 1.2, fill: stroke, opacity: 0.48 });\n pattern.append(dot);\n } else {\n pattern.append(createPatternLine(svg, \"M 0 10 L 10 0\", stroke));\n }\n defs.append(pattern);\n return `url(#${id})`;\n}\n\nfunction createPatternLine(svg: SVGSVGElement, d: string, stroke: string): SVGPathElement {\n const path = document.createElementNS(SVG_NS, \"path\");\n applySvgAttrs(path, {\n d,\n stroke,\n \"stroke-width\": 1,\n \"stroke-linecap\": \"round\",\n opacity: 0.42\n });\n return path;\n}\n\nfunction excalidrawTransform(\n element: Record<string, unknown>,\n x: number,\n y: number,\n width: number,\n height: number\n): string {\n const angle = finiteNumber(element.angle, 0);\n if (!angle) {\n return \"\";\n }\n return `rotate(${(angle * 180) / Math.PI} ${x + width / 2} ${y + height / 2})`;\n}\n\nfunction excalidrawPoints(\n element: Record<string, unknown>,\n x: number,\n y: number,\n width: number,\n height: number\n): Array<{ x: number; y: number }> {\n if (!Array.isArray(element.points)) {\n return [\n { x, y },\n { x: x + width, y: y + height }\n ];\n }\n return element.points.map((point) => {\n const parsed = pointFromValue(point, { x: 0, y: 0 });\n return { x: x + parsed.x, y: y + parsed.y };\n });\n}\n\nfunction createExcalidrawFreedrawPath(element: Record<string, unknown>, x: number, y: number): SVGPathElement | null {\n const points = excalidrawPoints(element, x, y, 0, 0);\n if (points.length < 2) {\n return null;\n }\n const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n path.setAttribute(\n \"d\",\n points\n .map((point, index) => `${index === 0 ? \"M\" : \"L\"} ${point.x} ${point.y}`)\n .join(\" \")\n );\n return path;\n}\n\nfunction appendExcalidrawArrowHeads(\n svg: SVGSVGElement,\n element: Record<string, unknown>,\n points: Array<{ x: number; y: number }>,\n stroke: string\n): void {\n if (String(element.type || \"\") !== \"arrow\" || points.length < 2) {\n return;\n }\n const startHead = String(element.startArrowhead || \"\");\n const endHead = String(element.endArrowhead || \"arrow\");\n if (startHead && startHead !== \"none\") {\n appendArrowHead(svg, points[1].x, points[1].y, points[0].x, points[0].y, stroke, startHead);\n }\n if (endHead && endHead !== \"none\") {\n const previous = points[points.length - 2];\n const end = points[points.length - 1];\n appendArrowHead(svg, previous.x, previous.y, end.x, end.y, stroke, endHead);\n }\n}\n\nfunction applySvgAttrs(element: SVGElement, attributes: Record<string, string | number | undefined>): void {\n for (const [key, value] of Object.entries(attributes)) {\n if (value === undefined || value === \"\") {\n continue;\n }\n element.setAttribute(key, String(value));\n }\n}\n\ntype TldrawShape = Record<string, unknown> & {\n props?: Record<string, unknown>;\n};\n\nfunction renderTldraw(panel: HTMLElement, text: string): void {\n const data = JSON.parse(text) as unknown;\n const shapes = extractTldrawShapes(data);\n const section = createSection(`tldraw 基础预览 ${shapes.length} shapes`);\n section.append(createDrawingSummary(shapes.map(tldrawSummaryItem)));\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n svg.setAttribute(\"viewBox\", createTldrawViewBox(shapes));\n\n if (shapes.length === 0) {\n const empty = document.createElementNS(svg.namespaceURI, \"text\");\n empty.setAttribute(\"x\", \"24\");\n empty.setAttribute(\"y\", \"40\");\n empty.setAttribute(\"fill\", \"#64748b\");\n empty.textContent = \"未解析到可展示的 tldraw 图形。\";\n svg.append(empty);\n } else {\n for (const shape of shapes) {\n renderTldrawShape(svg, shape);\n }\n }\n\n section.append(svg);\n panel.append(section);\n}\n\nfunction extractTldrawShapes(data: unknown): TldrawShape[] {\n if (!data || typeof data !== \"object\") {\n return [];\n }\n const source = data as Record<string, unknown>;\n const candidates: unknown[] = [];\n if (Array.isArray(source.records)) {\n candidates.push(...source.records);\n }\n if (Array.isArray(source.shapes)) {\n candidates.push(...source.shapes);\n }\n if (source.store && typeof source.store === \"object\") {\n candidates.push(...Object.values(source.store as Record<string, unknown>));\n }\n if (source.document && typeof source.document === \"object\") {\n const documentRecord = source.document as Record<string, unknown>;\n if (Array.isArray(documentRecord.shapes)) {\n candidates.push(...documentRecord.shapes);\n }\n }\n\n return candidates.filter((item): item is TldrawShape => {\n if (!item || typeof item !== \"object\") {\n return false;\n }\n const record = item as Record<string, unknown>;\n return record.typeName === \"shape\" || String(record.id || \"\").startsWith(\"shape:\");\n });\n}\n\nfunction renderTldrawShape(svg: SVGSVGElement, shape: TldrawShape): void {\n const props = shape.props || {};\n const type = String(shape.type || props.type || \"\");\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const width = Math.max(1, finiteNumber(props.w, finiteNumber(props.width, 120)));\n const height = Math.max(1, finiteNumber(props.h, finiteNumber(props.height, 80)));\n const stroke = tldrawColor(String(props.color || shape.color || \"black\"));\n const fill = tldrawFill(String(props.fill || \"none\"), stroke);\n\n if (type === \"geo\" || type === \"frame\" || type === \"highlight\") {\n const geo = String(props.geo || (type === \"frame\" ? \"rectangle\" : \"rectangle\"));\n if (geo === \"ellipse\" || geo === \"oval\") {\n const ellipse = document.createElementNS(svg.namespaceURI, \"ellipse\");\n ellipse.setAttribute(\"cx\", String(x + width / 2));\n ellipse.setAttribute(\"cy\", String(y + height / 2));\n ellipse.setAttribute(\"rx\", String(width / 2));\n ellipse.setAttribute(\"ry\", String(height / 2));\n ellipse.setAttribute(\"fill\", fill);\n ellipse.setAttribute(\"stroke\", stroke);\n ellipse.setAttribute(\"stroke-width\", \"2\");\n svg.append(ellipse);\n } else if (geo === \"diamond\") {\n const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n polygon.setAttribute(\n \"points\",\n `${x + width / 2},${y} ${x + width},${y + height / 2} ${x + width / 2},${y + height} ${x},${y + height / 2}`\n );\n polygon.setAttribute(\"fill\", fill);\n polygon.setAttribute(\"stroke\", stroke);\n polygon.setAttribute(\"stroke-width\", \"2\");\n svg.append(polygon);\n } else if (geo === \"triangle\") {\n const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n polygon.setAttribute(\"points\", `${x + width / 2},${y} ${x + width},${y + height} ${x},${y + height}`);\n polygon.setAttribute(\"fill\", fill);\n polygon.setAttribute(\"stroke\", stroke);\n polygon.setAttribute(\"stroke-width\", \"2\");\n svg.append(polygon);\n } else {\n const rect = document.createElementNS(svg.namespaceURI, \"rect\");\n rect.setAttribute(\"x\", String(x));\n rect.setAttribute(\"y\", String(y));\n rect.setAttribute(\"width\", String(width));\n rect.setAttribute(\"height\", String(height));\n rect.setAttribute(\"rx\", type === \"frame\" ? \"0\" : \"8\");\n rect.setAttribute(\"fill\", fill);\n rect.setAttribute(\"stroke\", stroke);\n rect.setAttribute(\"stroke-width\", \"2\");\n svg.append(rect);\n }\n appendTldrawText(svg, String(props.text || \"\"), x + 12, y + 24, stroke);\n } else if (type === \"text\" || type === \"note\") {\n if (type === \"note\") {\n const note = document.createElementNS(svg.namespaceURI, \"rect\");\n note.setAttribute(\"x\", String(x));\n note.setAttribute(\"y\", String(y));\n note.setAttribute(\"width\", String(width));\n note.setAttribute(\"height\", String(height));\n note.setAttribute(\"rx\", \"6\");\n note.setAttribute(\"fill\", tldrawColor(String(props.color || \"yellow\"), 0.24));\n note.setAttribute(\"stroke\", stroke);\n svg.append(note);\n }\n appendTldrawText(svg, String(props.text || \"\"), x, y + 18, stroke);\n } else if (type === \"arrow\" || type === \"line\") {\n renderTldrawLine(svg, shape, stroke);\n } else if (type === \"draw\") {\n renderTldrawDraw(svg, shape, stroke);\n } else {\n const rect = document.createElementNS(svg.namespaceURI, \"rect\");\n rect.setAttribute(\"x\", String(x));\n rect.setAttribute(\"y\", String(y));\n rect.setAttribute(\"width\", String(width));\n rect.setAttribute(\"height\", String(height));\n rect.setAttribute(\"fill\", \"transparent\");\n rect.setAttribute(\"stroke\", stroke);\n rect.setAttribute(\"stroke-dasharray\", \"6 4\");\n svg.append(rect);\n appendTldrawText(svg, type || \"shape\", x + 8, y + 20, stroke);\n }\n}\n\nfunction renderTldrawLine(svg: SVGSVGElement, shape: TldrawShape, stroke: string): void {\n const props = shape.props || {};\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const start = pointFromValue(props.start, { x: 0, y: 0 });\n const end = pointFromValue(props.end, {\n x: finiteNumber(props.w, finiteNumber(props.width, 120)),\n y: finiteNumber(props.h, finiteNumber(props.height, 0))\n });\n const line = document.createElementNS(svg.namespaceURI, \"line\");\n line.setAttribute(\"x1\", String(x + start.x));\n line.setAttribute(\"y1\", String(y + start.y));\n line.setAttribute(\"x2\", String(x + end.x));\n line.setAttribute(\"y2\", String(y + end.y));\n line.setAttribute(\"stroke\", stroke);\n line.setAttribute(\"stroke-width\", \"3\");\n line.setAttribute(\"stroke-linecap\", \"round\");\n svg.append(line);\n if (String(shape.type || \"\") === \"arrow\") {\n appendArrowHead(svg, x + start.x, y + start.y, x + end.x, y + end.y, stroke);\n }\n}\n\nfunction renderTldrawDraw(svg: SVGSVGElement, shape: TldrawShape, stroke: string): void {\n const props = shape.props || {};\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const points = extractTldrawDrawPoints(props.segments);\n if (points.length < 2) {\n return;\n }\n const polyline = document.createElementNS(svg.namespaceURI, \"polyline\");\n polyline.setAttribute(\"points\", points.map((point) => `${x + point.x},${y + point.y}`).join(\" \"));\n polyline.setAttribute(\"fill\", \"none\");\n polyline.setAttribute(\"stroke\", stroke);\n polyline.setAttribute(\"stroke-width\", \"3\");\n polyline.setAttribute(\"stroke-linecap\", \"round\");\n polyline.setAttribute(\"stroke-linejoin\", \"round\");\n svg.append(polyline);\n}\n\nfunction appendTldrawText(svg: SVGSVGElement, text: string, x: number, y: number, fill: string): void {\n if (!text.trim()) {\n return;\n }\n const textNode = document.createElementNS(svg.namespaceURI, \"text\");\n textNode.setAttribute(\"x\", String(x));\n textNode.setAttribute(\"y\", String(y));\n textNode.setAttribute(\"fill\", fill);\n textNode.setAttribute(\"font-size\", \"16\");\n textNode.setAttribute(\"font-family\", \"Inter, ui-sans-serif, system-ui, sans-serif\");\n for (const [index, line] of text.split(/\\r?\\n/).entries()) {\n const span = document.createElementNS(svg.namespaceURI, \"tspan\");\n span.setAttribute(\"x\", String(x));\n span.setAttribute(\"dy\", index === 0 ? \"0\" : \"1.3em\");\n span.textContent = line;\n textNode.append(span);\n }\n svg.append(textNode);\n}\n\nfunction appendArrowHead(\n svg: SVGSVGElement,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n fill: string,\n type = \"arrow\"\n): void {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n const size = 10;\n if (type === \"bar\") {\n const line = document.createElementNS(SVG_NS, \"line\");\n const dx = Math.sin(angle) * size * 0.65;\n const dy = Math.cos(angle) * size * 0.65;\n applySvgAttrs(line, {\n x1: x2 - dx,\n y1: y2 + dy,\n x2: x2 + dx,\n y2: y2 - dy,\n stroke: fill,\n \"stroke-width\": 2,\n \"stroke-linecap\": \"round\"\n });\n svg.append(line);\n return;\n }\n if (type === \"dot\" || type === \"circle\") {\n const circle = document.createElementNS(SVG_NS, \"circle\");\n applySvgAttrs(circle, { cx: x2, cy: y2, r: size * 0.42, fill });\n svg.append(circle);\n return;\n }\n const points = [\n [x2, y2],\n [x2 - size * Math.cos(angle - Math.PI / 6), y2 - size * Math.sin(angle - Math.PI / 6)],\n [x2 - size * Math.cos(angle + Math.PI / 6), y2 - size * Math.sin(angle + Math.PI / 6)]\n ];\n const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n polygon.setAttribute(\"points\", points.map((point) => point.join(\",\")).join(\" \"));\n polygon.setAttribute(\"fill\", type === \"triangle_outline\" || type === \"arrow_outline\" ? \"transparent\" : fill);\n polygon.setAttribute(\"stroke\", fill);\n svg.append(polygon);\n}\n\nfunction createTldrawViewBox(shapes: TldrawShape[]): string {\n if (shapes.length === 0) {\n return \"0 0 800 500\";\n }\n const bounds = shapes.map((shape) => {\n const props = shape.props || {};\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const width = Math.max(1, finiteNumber(props.w, finiteNumber(props.width, 120)));\n const height = Math.max(1, finiteNumber(props.h, finiteNumber(props.height, 80)));\n return { x, y, width, height };\n });\n const minX = Math.min(...bounds.map((bound) => bound.x)) - 40;\n const minY = Math.min(...bounds.map((bound) => bound.y)) - 40;\n const maxX = Math.max(...bounds.map((bound) => bound.x + bound.width)) + 40;\n const maxY = Math.max(...bounds.map((bound) => bound.y + bound.height)) + 40;\n return `${minX} ${minY} ${Math.max(240, maxX - minX)} ${Math.max(180, maxY - minY)}`;\n}\n\nfunction extractTldrawDrawPoints(value: unknown): Array<{ x: number; y: number }> {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((segment) => {\n if (!segment || typeof segment !== \"object\") {\n return [];\n }\n const points = (segment as Record<string, unknown>).points;\n if (!Array.isArray(points)) {\n return [];\n }\n return points.map((point) => pointFromValue(point, { x: 0, y: 0 }));\n });\n}\n\nfunction pointFromValue(value: unknown, fallback: { x: number; y: number }): { x: number; y: number } {\n if (Array.isArray(value)) {\n return {\n x: finiteNumber(value[0], fallback.x),\n y: finiteNumber(value[1], fallback.y)\n };\n }\n if (!value || typeof value !== \"object\") {\n return fallback;\n }\n const point = value as Record<string, unknown>;\n return {\n x: finiteNumber(point.x, fallback.x),\n y: finiteNumber(point.y, fallback.y)\n };\n}\n\nfunction finiteNumber(value: unknown, fallback: number): number {\n const parsed = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction tldrawFill(fill: string, stroke: string): string {\n return fill === \"solid\" || fill === \"semi\" || fill === \"pattern\" ? tldrawColor(stroke, 0.14) : \"transparent\";\n}\n\nfunction tldrawColor(value: string, alpha = 1): string {\n const colors: Record<string, [number, number, number]> = {\n black: [17, 24, 39],\n grey: [100, 116, 139],\n light: [203, 213, 225],\n red: [220, 38, 38],\n orange: [234, 88, 12],\n yellow: [202, 138, 4],\n green: [22, 163, 74],\n blue: [37, 99, 235],\n violet: [124, 58, 237],\n purple: [147, 51, 234],\n pink: [219, 39, 119]\n };\n if (value.startsWith(\"#\") || value.startsWith(\"rgb\")) {\n return value;\n }\n const color = colors[value] || colors.black;\n return alpha >= 1 ? `rgb(${color.join(\" \")})` : `rgb(${color.join(\" \")} / ${alpha})`;\n}\n\nfunction renderDrawio(panel: HTMLElement, text: string): void {\n const diagrams = extractDrawioDiagrams(text);\n if (diagrams.length === 0) {\n renderRawDrawing(panel, \"Draw.io\", text);\n return;\n }\n\n for (const [index, diagram] of diagrams.entries()) {\n const section = createSection(`Draw.io 图形预览 ${index + 1}`);\n const shapes = parseDrawioShapes(diagram);\n if (shapes.length > 0) {\n section.append(createDrawingSummary(shapes.map(drawioSummaryItem)));\n const svg = document.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n svg.setAttribute(\"viewBox\", createDrawioViewBox(shapes));\n for (const shape of shapes) {\n renderDrawioShape(svg, shape);\n }\n section.append(svg);\n }\n\n const details = document.createElement(\"details\");\n details.className = \"ofv-details\";\n const summary = document.createElement(\"summary\");\n summary.textContent = shapes.length > 0 ? `原始 XML 摘要(${shapes.length} cells)` : \"Draw.io 原始内容\";\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = diagram.slice(0, 30000);\n details.append(summary, pre);\n section.append(details);\n panel.append(section);\n }\n}\n\ntype DrawioShape = {\n id: string;\n value: string;\n style: Record<string, string>;\n vertex: boolean;\n edge: boolean;\n x: number;\n y: number;\n width: number;\n height: number;\n source?: string;\n target?: string;\n points?: Array<{ x: number; y: number }>;\n};\n\nfunction extractDrawioDiagrams(text: string): string[] {\n const matches = [...text.matchAll(/<diagram[^>]*>([\\s\\S]*?)<\\/diagram>/g)].map((match) => decodeDrawioDiagram(match[1] || \"\"));\n if (matches.length > 0) {\n return matches;\n }\n return text.includes(\"<mxGraphModel\") ? [text] : [];\n}\n\nfunction parseDrawioShapes(xml: string): DrawioShape[] {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return [];\n }\n return Array.from(doc.querySelectorAll(\"mxCell\")).flatMap((cell) => {\n const geometry = Array.from(cell.children).find((child) => child.localName === \"mxGeometry\");\n const vertex = cell.getAttribute(\"vertex\") === \"1\";\n const edge = cell.getAttribute(\"edge\") === \"1\";\n if (!vertex && !edge) {\n return [];\n }\n const shape: DrawioShape = {\n id: cell.getAttribute(\"id\") || \"\",\n value: decodeXmlText(cell.getAttribute(\"value\") || \"\"),\n style: parseDrawioStyle(cell.getAttribute(\"style\") || \"\"),\n vertex,\n edge,\n x: finiteNumber(geometry?.getAttribute(\"x\"), 0),\n y: finiteNumber(geometry?.getAttribute(\"y\"), 0),\n width: Math.max(1, finiteNumber(geometry?.getAttribute(\"width\"), 120)),\n height: Math.max(1, finiteNumber(geometry?.getAttribute(\"height\"), edge ? 1 : 60)),\n source: cell.getAttribute(\"source\") || undefined,\n target: cell.getAttribute(\"target\") || undefined\n };\n\n if (edge && geometry) {\n const points = Array.from(geometry.children)\n .filter((child) => child.localName === \"mxPoint\")\n .map((point) => ({\n x: finiteNumber(point.getAttribute(\"x\"), 0),\n y: finiteNumber(point.getAttribute(\"y\"), 0)\n }));\n if (points.length >= 2) {\n shape.x = points[0].x;\n shape.y = points[0].y;\n shape.width = points[points.length - 1].x - points[0].x;\n shape.height = points[points.length - 1].y - points[0].y;\n shape.points = points;\n }\n }\n return [shape];\n });\n}\n\nfunction parseDrawioStyle(style: string): Record<string, string> {\n const result: Record<string, string> = {};\n const imageMatch = style.match(/(?:^|;)image=(data:image\\/[^;]+;base64,[^;]+)/i);\n const protectedStyle = imageMatch ? style.replace(imageMatch[0], imageMatch[0].startsWith(\";\") ? \";image=__OFV_IMAGE__\" : \"image=__OFV_IMAGE__\") : style;\n for (const part of protectedStyle.split(\";\")) {\n if (!part) {\n continue;\n }\n const separator = part.indexOf(\"=\");\n const key = separator >= 0 ? part.slice(0, separator) : part;\n const value = separator >= 0 ? part.slice(separator + 1) : \"1\";\n if (key) {\n result[key] = value === \"__OFV_IMAGE__\" && imageMatch ? imageMatch[1] : value;\n }\n }\n return result;\n}\n\nfunction createDrawioViewBox(shapes: DrawioShape[]): string {\n const bounds = shapes.map((shape) => ({\n x: Math.min(shape.x, shape.x + shape.width),\n y: Math.min(shape.y, shape.y + shape.height),\n width: Math.abs(shape.width),\n height: Math.abs(shape.height)\n }));\n const minX = Math.min(...bounds.map((bound) => bound.x)) - 40;\n const minY = Math.min(...bounds.map((bound) => bound.y)) - 40;\n const maxX = Math.max(...bounds.map((bound) => bound.x + bound.width)) + 40;\n const maxY = Math.max(...bounds.map((bound) => bound.y + bound.height)) + 40;\n return `${minX} ${minY} ${Math.max(320, maxX - minX)} ${Math.max(240, maxY - minY)}`;\n}\n\nfunction renderDrawioShape(svg: SVGSVGElement, shape: DrawioShape): void {\n const stroke = drawioColor(shape.style.strokeColor, \"#334155\");\n const fill = shape.style.fillColor === \"none\" ? \"transparent\" : drawioColor(shape.style.fillColor, \"#f8fafc\");\n const strokeWidth = finiteNumber(shape.style.strokeWidth, 1.5);\n const opacity = Math.max(0, Math.min(1, finiteNumber(shape.style.opacity, 100) / 100));\n const strokeAttrs = drawioStrokeAttrs(shape.style, strokeWidth);\n const transform = drawioTransform(shape);\n\n if (shape.edge) {\n const points = shape.points || [\n { x: shape.x, y: shape.y },\n { x: shape.x + shape.width, y: shape.y + shape.height }\n ];\n if (points.length > 2) {\n const polyline = document.createElementNS(SVG_NS, \"polyline\");\n applySvgAttrs(polyline, {\n points: points.map((point) => `${point.x},${point.y}`).join(\" \"),\n fill: \"none\",\n stroke,\n ...strokeAttrs,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n opacity\n });\n svg.append(polyline);\n } else {\n const line = document.createElementNS(SVG_NS, \"line\");\n applySvgAttrs(line, {\n x1: points[0].x,\n y1: points[0].y,\n x2: points[1].x,\n y2: points[1].y,\n stroke,\n ...strokeAttrs,\n \"stroke-linecap\": \"round\",\n opacity\n });\n svg.append(line);\n }\n if (shape.style.endArrow && shape.style.endArrow !== \"none\") {\n const tail = points[Math.max(0, points.length - 2)];\n const head = points[points.length - 1];\n appendArrowHead(svg, tail.x, tail.y, head.x, head.y, stroke);\n }\n return;\n }\n\n const shapeName = drawioShapeName(shape.style);\n if (shapeName === \"image\") {\n renderDrawioImage(svg, shape, opacity, transform);\n } else if (shapeName === \"ellipse\") {\n const ellipse = document.createElementNS(SVG_NS, \"ellipse\");\n applySvgAttrs(ellipse, {\n cx: shape.x + shape.width / 2,\n cy: shape.y + shape.height / 2,\n rx: shape.width / 2,\n ry: shape.height / 2,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(ellipse);\n } else if (shapeName === \"rhombus\" || shapeName === \"diamond\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n applySvgAttrs(polygon, {\n points: `${shape.x + shape.width / 2},${shape.y} ${shape.x + shape.width},${shape.y + shape.height / 2} ${shape.x + shape.width / 2},${shape.y + shape.height} ${shape.x},${shape.y + shape.height / 2}`,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(polygon);\n } else if (shapeName === \"hexagon\" || shapeName === \"process\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n const inset = shapeName === \"process\" ? shape.width * 0.12 : shape.width * 0.22;\n applySvgAttrs(polygon, {\n points:\n shapeName === \"process\"\n ? `${shape.x},${shape.y} ${shape.x + shape.width - inset},${shape.y} ${shape.x + shape.width},${shape.y + shape.height / 2} ${shape.x + shape.width - inset},${shape.y + shape.height} ${shape.x},${shape.y + shape.height}`\n : `${shape.x + inset},${shape.y} ${shape.x + shape.width - inset},${shape.y} ${shape.x + shape.width},${shape.y + shape.height / 2} ${shape.x + shape.width - inset},${shape.y + shape.height} ${shape.x + inset},${shape.y + shape.height} ${shape.x},${shape.y + shape.height / 2}`,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(polygon);\n } else if (shapeName === \"triangle\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n applySvgAttrs(polygon, {\n points: `${shape.x + shape.width / 2},${shape.y} ${shape.x + shape.width},${shape.y + shape.height} ${shape.x},${shape.y + shape.height}`,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(polygon);\n } else if (shapeName === \"actor\" || shapeName === \"umlActor\") {\n renderDrawioActor(svg, shape, stroke, strokeAttrs, opacity, transform);\n } else if (shapeName === \"document\") {\n const path = document.createElementNS(SVG_NS, \"path\");\n applySvgAttrs(path, {\n d: createDrawioDocumentPath(shape.x, shape.y, shape.width, shape.height),\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(path);\n } else if (shapeName === \"cylinder\") {\n const group = document.createElementNS(SVG_NS, \"g\");\n applySvgAttrs(group, { transform });\n const body = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(body, {\n x: shape.x,\n y: shape.y + Math.min(18, shape.height * 0.18) / 2,\n width: shape.width,\n height: shape.height - Math.min(18, shape.height * 0.18),\n fill,\n stroke,\n ...strokeAttrs,\n opacity\n });\n const top = document.createElementNS(SVG_NS, \"ellipse\");\n const bottom = document.createElementNS(SVG_NS, \"ellipse\");\n const capHeight = Math.min(18, shape.height * 0.18);\n applySvgAttrs(top, {\n cx: shape.x + shape.width / 2,\n cy: shape.y + capHeight / 2,\n rx: shape.width / 2,\n ry: capHeight / 2,\n fill,\n stroke,\n ...strokeAttrs,\n opacity\n });\n applySvgAttrs(bottom, {\n cx: shape.x + shape.width / 2,\n cy: shape.y + shape.height - capHeight / 2,\n rx: shape.width / 2,\n ry: capHeight / 2,\n fill: \"none\",\n stroke,\n ...strokeAttrs,\n opacity\n });\n group.append(body, top, bottom);\n svg.append(group);\n } else if (shapeName === \"cloud\") {\n const path = document.createElementNS(SVG_NS, \"path\");\n applySvgAttrs(path, {\n d: createDrawioCloudPath(shape.x, shape.y, shape.width, shape.height),\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(path);\n } else if (shapeName === \"swimlane\") {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rx: shape.style.rounded === \"1\" ? Math.min(12, shape.height / 5) : 0,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n const header = document.createElementNS(SVG_NS, \"rect\");\n const headerHeight = Math.min(shape.height, finiteNumber(shape.style.startSize, 30));\n applySvgAttrs(header, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: headerHeight,\n rx: shape.style.rounded === \"1\" ? Math.min(12, headerHeight / 3) : 0,\n fill: drawioColor(shape.style.swimlaneFillColor || shape.style.fillColor, \"#e2e8f0\"),\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(rect, header);\n } else {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rx: shape.style.rounded === \"1\" ? Math.min(12, shape.height / 5) : 0,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(rect);\n }\n\n appendDrawioText(\n svg,\n shape.value,\n shape.x + shape.width / 2,\n shape.y + shape.height / 2,\n drawioColor(shape.style.fontColor, \"#111827\"),\n shape.style,\n transform\n );\n}\n\nfunction drawioShapeName(style: Record<string, string>): string {\n if (style.shape) {\n return style.shape;\n }\n if (style.image) {\n return \"image\";\n }\n if (style.ellipse === \"1\") {\n return \"ellipse\";\n }\n if (style.rhombus === \"1\") {\n return \"rhombus\";\n }\n if (style.swimlane === \"1\") {\n return \"swimlane\";\n }\n if (style.text === \"1\") {\n return \"text\";\n }\n return \"rectangle\";\n}\n\nfunction renderDrawioImage(svg: SVGSVGElement, shape: DrawioShape, opacity: number, transform: string): void {\n const src = shape.style.image || \"\";\n if (/^data:image\\/(?:png|jpe?g|gif|webp|svg\\+xml);base64,/i.test(src)) {\n const image = document.createElementNS(SVG_NS, \"image\");\n applySvgAttrs(image, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n href: src,\n preserveAspectRatio: \"xMidYMid meet\",\n opacity,\n transform\n });\n svg.append(image);\n return;\n }\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rx: 6,\n fill: \"#f8fafc\",\n stroke: \"#94a3b8\",\n \"stroke-dasharray\": \"6 4\",\n opacity,\n transform\n });\n svg.append(rect);\n}\n\nfunction renderDrawioActor(\n svg: SVGSVGElement,\n shape: DrawioShape,\n stroke: string,\n strokeAttrs: Record<string, string | number>,\n opacity: number,\n transform: string\n): void {\n const group = document.createElementNS(SVG_NS, \"g\");\n applySvgAttrs(group, { opacity, transform });\n const cx = shape.x + shape.width / 2;\n const headRadius = Math.min(shape.width, shape.height) * 0.15;\n const head = document.createElementNS(SVG_NS, \"circle\");\n applySvgAttrs(head, {\n cx,\n cy: shape.y + headRadius * 1.4,\n r: headRadius,\n fill: \"transparent\",\n stroke,\n ...strokeAttrs\n });\n const body = createSvgLine(cx, shape.y + headRadius * 2.4, cx, shape.y + shape.height * 0.68, stroke, strokeAttrs);\n const arms = createSvgLine(shape.x + shape.width * 0.22, shape.y + shape.height * 0.42, shape.x + shape.width * 0.78, shape.y + shape.height * 0.42, stroke, strokeAttrs);\n const leftLeg = createSvgLine(cx, shape.y + shape.height * 0.68, shape.x + shape.width * 0.25, shape.y + shape.height, stroke, strokeAttrs);\n const rightLeg = createSvgLine(cx, shape.y + shape.height * 0.68, shape.x + shape.width * 0.75, shape.y + shape.height, stroke, strokeAttrs);\n group.append(head, body, arms, leftLeg, rightLeg);\n svg.append(group);\n}\n\nfunction createSvgLine(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n stroke: string,\n strokeAttrs: Record<string, string | number>\n): SVGLineElement {\n const line = document.createElementNS(SVG_NS, \"line\");\n applySvgAttrs(line, {\n x1,\n y1,\n x2,\n y2,\n stroke,\n ...strokeAttrs,\n \"stroke-linecap\": \"round\"\n });\n return line;\n}\n\nfunction createDrawioDocumentPath(x: number, y: number, width: number, height: number): string {\n const wave = Math.min(18, height * 0.18);\n return [\n `M ${x} ${y}`,\n `H ${x + width}`,\n `V ${y + height - wave}`,\n `C ${x + width * 0.72} ${y + height - wave * 2}, ${x + width * 0.58} ${y + height + wave * 0.5}, ${x + width * 0.34} ${y + height - wave * 0.4}`,\n `C ${x + width * 0.18} ${y + height - wave}, ${x + width * 0.08} ${y + height - wave * 0.2}, ${x} ${y + height - wave * 0.45}`,\n \"Z\"\n ].join(\" \");\n}\n\nfunction drawioStrokeAttrs(style: Record<string, string>, strokeWidth: number): Record<string, string | number> {\n const attrs: Record<string, string | number> = {\n \"stroke-width\": strokeWidth\n };\n if (style.dashed === \"1\") {\n attrs[\"stroke-dasharray\"] = style.dashPattern || `${strokeWidth * 4} ${strokeWidth * 3}`;\n }\n return attrs;\n}\n\nfunction drawioTransform(shape: DrawioShape): string {\n const rotation = finiteNumber(shape.style.rotation, 0);\n if (!rotation) {\n return \"\";\n }\n return `rotate(${rotation} ${shape.x + shape.width / 2} ${shape.y + shape.height / 2})`;\n}\n\nfunction createDrawioCloudPath(x: number, y: number, width: number, height: number): string {\n const cx = x + width / 2;\n const cy = y + height / 2;\n return [\n `M ${x + width * 0.24} ${y + height * 0.72}`,\n `C ${x - width * 0.02} ${y + height * 0.68}, ${x + width * 0.02} ${y + height * 0.34}, ${x + width * 0.28} ${y + height * 0.38}`,\n `C ${x + width * 0.32} ${y + height * 0.12}, ${cx} ${y + height * 0.06}, ${x + width * 0.62} ${y + height * 0.26}`,\n `C ${x + width * 0.86} ${y + height * 0.2}, ${x + width * 1.02} ${y + height * 0.42}, ${x + width * 0.88} ${y + height * 0.62}`,\n `C ${x + width * 0.86} ${y + height * 0.84}, ${x + width * 0.42} ${y + height * 0.9}, ${x + width * 0.24} ${y + height * 0.72}`,\n \"Z\"\n ].join(\" \");\n}\n\nfunction appendDrawioText(\n svg: SVGSVGElement,\n text: string,\n x: number,\n y: number,\n fill: string,\n style: Record<string, string> = {},\n transform = \"\"\n): void {\n if (!text.trim()) {\n return;\n }\n const lines = normalizeDrawioLabel(text).split(/\\r?\\n/).filter(Boolean);\n if (lines.length === 0) {\n return;\n }\n const textNode = document.createElementNS(SVG_NS, \"text\");\n const align = style.align || \"center\";\n const fontStyle = Number.parseInt(style.fontStyle || \"0\", 10);\n applySvgAttrs(textNode, {\n x: align === \"left\" ? x - finiteNumber(style.spacingLeft, 0) : align === \"right\" ? x + finiteNumber(style.spacingRight, 0) : x,\n y,\n fill,\n \"font-size\": finiteNumber(style.fontSize, 14),\n \"font-family\": \"Inter, ui-sans-serif, system-ui, sans-serif\",\n \"font-weight\": fontStyle & 1 ? \"700\" : undefined,\n \"font-style\": fontStyle & 2 ? \"italic\" : undefined,\n \"text-decoration\": fontStyle & 4 ? \"underline\" : undefined,\n \"text-anchor\": align === \"left\" ? \"start\" : align === \"right\" ? \"end\" : \"middle\",\n \"dominant-baseline\": \"middle\",\n transform\n });\n const firstDy = lines.length > 1 ? `${-0.55 * (lines.length - 1)}em` : \"0\";\n for (const [index, line] of lines.entries()) {\n const span = document.createElementNS(SVG_NS, \"tspan\");\n span.setAttribute(\"x\", String(x));\n span.setAttribute(\"dy\", index === 0 ? firstDy : \"1.2em\");\n span.textContent = line;\n textNode.append(span);\n }\n svg.append(textNode);\n}\n\nfunction normalizeDrawioLabel(text: string): string {\n const decoded = decodeXmlText(text);\n return decoded\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<\\/(?:div|p|li|h\\d)>/gi, \"\\n\")\n .replace(/<[^>]+>/g, \"\")\n .split(/\\r?\\n/)\n .map((line) => decodeXmlText(line).replace(/\\u00a0/g, \" \").replace(/[ \\t]+/g, \" \").trim())\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nfunction drawioColor(value: string | undefined, fallback: string): string {\n if (!value || value === \"default\") {\n return fallback;\n }\n return value.startsWith(\"#\") ? value : `#${value}`;\n}\n\nfunction decodeXmlText(value: string): string {\n const textarea = document.createElement(\"textarea\");\n textarea.innerHTML = value;\n return textarea.value;\n}\n\nfunction renderRawDrawing(panel: HTMLElement, extension: string, text: string): void {\n const section = createSection(`${extension} 基础预览`);\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = text.slice(0, 30000);\n section.append(pre);\n panel.append(section);\n}\n\nfunction renderDrawingParseFallback(panel: HTMLElement, extension: string, text: string, error: unknown): void {\n panel.replaceChildren();\n const section = createSection(`${extension} 解析失败`);\n const message = document.createElement(\"p\");\n message.textContent = error instanceof Error ? error.message : String(error);\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = text.slice(0, 30000) || \"文件内容为空。\";\n section.append(message, pre);\n panel.append(section);\n}\n\nfunction decodeDrawioDiagram(value: string): string {\n try {\n const decoded = decodeURIComponent(escape(atob(value)));\n return pako.inflateRaw(Uint8Array.from(decoded, (char) => char.charCodeAt(0)), {\n to: \"string\"\n }) as string;\n } catch {\n return value;\n }\n}\n","import type { PreviewContext, PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer, readTextFile, resolveFormat } from \"./utils\";\n\ninterface LayeredValue<T> {\n layer: string;\n value: T;\n}\n\nconst cadExtensions = new Set([\n \"dxf\",\n \"dwg\",\n \"dwf\",\n \"step\",\n \"stp\",\n \"iges\",\n \"igs\",\n \"ifc\",\n \"sat\",\n \"sab\",\n \"x_t\",\n \"x_b\",\n \"3dm\",\n \"skp\",\n \"sldprt\",\n \"sldasm\"\n]);\nconst cadMimeTypes = new Set([\n \"application/acad\",\n \"application/dxf\",\n \"application/x-dxf\",\n \"image/vnd.dxf\",\n \"model/vnd.dwf\",\n \"model/step\",\n \"application/step\",\n \"application/iges\",\n \"application/x-step\",\n \"application/sat\",\n \"application/sab\",\n \"application/x-parasolid\",\n \"model/vnd.3dm\",\n \"application/vnd.sketchup.skp\",\n \"application/sldworks\"\n]);\nconst cadMimeFormatMap: Record<string, string> = {\n \"application/acad\": \"dwg\",\n \"application/dxf\": \"dxf\",\n \"application/x-dxf\": \"dxf\",\n \"image/vnd.dxf\": \"dxf\",\n \"model/vnd.dwf\": \"dwf\",\n \"model/step\": \"step\",\n \"application/step\": \"step\",\n \"application/iges\": \"iges\",\n \"application/x-step\": \"ifc\",\n \"application/sat\": \"sat\",\n \"application/sab\": \"sab\",\n \"application/x-parasolid\": \"x_t\",\n \"model/vnd.3dm\": \"3dm\",\n \"application/vnd.sketchup.skp\": \"skp\",\n \"application/sldworks\": \"sldprt\"\n};\n\nexport function cadPlugin(): PreviewPlugin {\n return {\n name: \"cad\",\n match(file) {\n return cadExtensions.has(file.extension) || cadMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-cad\");\n ctx.viewport.append(panel);\n\n const extension = resolveFormat(ctx.file, cadMimeFormatMap);\n if (extension === \"step\" || extension === \"stp\") {\n renderStep(panel, await readTextFile(ctx.file), extension);\n return { destroy: () => panel.remove() };\n }\n if (extension === \"iges\" || extension === \"igs\") {\n renderIges(panel, await readTextFile(ctx.file), extension);\n return { destroy: () => panel.remove() };\n }\n if (extension === \"ifc\") {\n renderIfc(panel, await readTextFile(ctx.file));\n return { destroy: () => panel.remove() };\n }\n if (extension === \"dwg\" || extension === \"dwf\") {\n renderBinaryCad(panel, await readArrayBuffer(ctx.file), extension, ctx.file.name);\n return { destroy: () => panel.remove() };\n }\n if (extension !== \"dxf\") {\n const section = createSection(\"CAD 基础预览\");\n section.append(`.${extension || \"cad\"} 已识别为图纸/工程格式,当前前端插件优先渲染 DXF。该格式建议接入服务端转换或 WASM 专用引擎。`);\n panel.append(section);\n return { destroy: () => panel.remove() };\n }\n\n const dxf = await readTextFile(ctx.file);\n const viewer = renderDxf(panel, dxf, ctx);\n return {\n canCommand(command) {\n return viewer.canCommand(command);\n },\n command(command) {\n return viewer.command(command);\n },\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction renderStep(panel: HTMLElement, text: string, extension: string): void {\n const records = parseStepRecords(text);\n const typeCounts = countBy(records.map((record) => record.type));\n const section = createSection(`${extension.toUpperCase()} 结构预览`);\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 STEP 文本实体、类型统计和关键几何参数。精确 B-Rep/曲面渲染建议后续接入 CAD 内核或服务端转换。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"实体\", records.length);\n appendMeta(meta, \"类型\", typeCounts.size);\n appendMeta(meta, \"点\", typeCounts.get(\"CARTESIAN_POINT\") || 0);\n appendMeta(meta, \"方向\", typeCounts.get(\"DIRECTION\") || 0);\n section.append(note, meta, createCadTypeList(typeCounts));\n\n const table = createCadEntityTable(\n records.slice(0, 200).map((record) => ({\n id: record.id,\n type: record.type,\n detail: summarizeStepRecord(record)\n }))\n );\n section.append(table);\n panel.append(section);\n}\n\nfunction renderIges(panel: HTMLElement, text: string, extension: string): void {\n const records = parseIgesRecords(text);\n const typeCounts = countBy(records.map((record) => record.type));\n const section = createSection(`${extension.toUpperCase()} 结构预览`);\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 IGES 参数区实体、类型统计和基础参数。精确曲线/曲面渲染建议后续接入 CAD 内核或服务端转换。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"实体\", records.length);\n appendMeta(meta, \"类型\", typeCounts.size);\n appendMeta(meta, \"点实体\", typeCounts.get(\"116\") || 0);\n appendMeta(meta, \"线实体\", typeCounts.get(\"110\") || 0);\n section.append(note, meta, createCadTypeList(typeCounts, \"类型号统计\"));\n\n const table = createCadEntityTable(\n records.slice(0, 200).map((record, index) => ({\n id: String(index + 1),\n type: igesTypeName(record.type),\n detail: record.params.slice(0, 8).join(\", \")\n }))\n );\n section.append(table);\n panel.append(section);\n}\n\nfunction renderIfc(panel: HTMLElement, text: string): void {\n const records = parseStepRecords(text);\n const typeCounts = countBy(records.map((record) => record.type));\n const section = createSection(\"IFC BIM 结构预览\");\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 IFC STEP 实体、BIM 层级和常见构件统计。几何网格、材质和属性集可后续接入 IfcOpenShell/IFC.js 增强。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"实体\", records.length);\n appendMeta(meta, \"类型\", typeCounts.size);\n appendMeta(meta, \"项目\", typeCounts.get(\"IFCPROJECT\") || 0);\n appendMeta(meta, \"建筑\", typeCounts.get(\"IFCBUILDING\") || 0);\n appendMeta(meta, \"楼层\", typeCounts.get(\"IFCBUILDINGSTOREY\") || 0);\n appendMeta(meta, \"空间\", typeCounts.get(\"IFCSPACE\") || 0);\n appendMeta(meta, \"构件\", countIfcElements(typeCounts));\n section.append(note, meta, createCadTypeList(typeCounts, \"IFC 实体统计\"));\n\n const hierarchy = createIfcHierarchy(records);\n if (hierarchy) {\n section.append(hierarchy);\n }\n\n const table = createCadEntityTable(\n records.slice(0, 240).map((record) => ({\n id: record.id,\n type: record.type,\n detail: summarizeIfcRecord(record)\n }))\n );\n section.append(table);\n panel.append(section);\n}\n\ntype StepRecord = {\n id: string;\n type: string;\n args: string;\n};\n\ntype IgesRecord = {\n type: string;\n params: string[];\n};\n\nfunction renderBinaryCad(panel: HTMLElement, arrayBuffer: ArrayBuffer, extension: string, fileName: string): void {\n const bytes = new Uint8Array(arrayBuffer);\n const section = createSection(`${extension.toUpperCase()} 文件预览`);\n const note = document.createElement(\"p\");\n note.textContent =\n extension === \"dwg\"\n ? \"DWG 是 AutoCAD 专有二进制格式,当前前端插件提供文件识别、版本提示和转换建议;几何渲染建议接入 ODA/LibreDWG/服务端转换。\"\n : \"DWF 是发布用图纸格式,当前前端插件提供容器识别和转换建议;高保真页面渲染建议接入专用解析器或服务端转换。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"文件\", fileName);\n appendMeta(meta, \"格式\", extension.toUpperCase());\n appendMeta(meta, \"大小\", formatBytes(bytes.byteLength));\n appendMeta(meta, \"签名\", byteSignature(bytes));\n appendMeta(meta, \"版本\", detectCadVersion(bytes, extension));\n appendMeta(meta, \"容器\", detectCadContainer(bytes));\n\n const actions = document.createElement(\"ol\");\n actions.className = \"ofv-cad-conversion\";\n const suggestions =\n extension === \"dwg\"\n ? [\n \"服务端使用 ODA File Converter / Teigha 将 DWG 转为 DXF、SVG 或 PDF。\",\n \"浏览器端可后续接入 LibreDWG WASM,但需处理字体、块参照、外部参照和许可证。\",\n \"若业务只需预览,建议转换为 PDF/SVG 后走现有 PDF 或图像预览链路。\"\n ]\n : [\n \"优先在服务端转换为 PDF/SVG,保留图层、页面和标注信息。\",\n \"若 DWF 为压缩容器,可后续读取 manifest/descriptor 再还原页面资源。\",\n \"若业务只需下载/归档,保留当前文件元信息和转换提示即可。\"\n ];\n for (const suggestion of suggestions) {\n const item = document.createElement(\"li\");\n item.textContent = suggestion;\n actions.append(item);\n }\n\n const preview = document.createElement(\"pre\");\n preview.className = \"ofv-text-block\";\n preview.textContent = hexPreview(bytes);\n\n section.append(note, meta, createBinaryCadProbe(bytes, extension), actions, preview);\n panel.append(section);\n}\n\nfunction createBinaryCadProbe(bytes: Uint8Array, extension: string): HTMLElement {\n const probe = probeBinaryCad(bytes);\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-cad-binary-probe\";\n details.open = true;\n const summary = document.createElement(\"summary\");\n summary.textContent = \"二进制结构探测\";\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-archive-probe-meta\";\n appendMeta(meta, \"可读片段\", probe.tokens.length);\n appendMeta(meta, \"实体关键词\", formatCadKeywordCounts(probe.entityCounts));\n appendMeta(meta, \"图层线索\", String(probe.layerHints.length));\n appendMeta(meta, \"块/引用线索\", String(probe.blockHints.length));\n appendMeta(meta, \"外部引用\", String(probe.externalRefs.length));\n appendMeta(meta, \"解析级别\", extension === \"dwg\" ? \"启发式扫描\" : \"容器/文本扫描\");\n details.append(summary, meta);\n\n const hints = [...probe.layerHints, ...probe.blockHints, ...probe.externalRefs].slice(0, 18);\n if (hints.length > 0) {\n const list = document.createElement(\"ul\");\n list.className = \"ofv-cad-probe-list\";\n for (const hint of hints) {\n const item = document.createElement(\"li\");\n item.textContent = hint;\n list.append(item);\n }\n details.append(list);\n }\n\n if (probe.tokens.length > 0) {\n const preview = document.createElement(\"pre\");\n preview.className = \"ofv-text-block\";\n preview.textContent = probe.tokens.slice(0, 80).join(\"\\n\");\n details.append(preview);\n }\n return details;\n}\n\ntype BinaryCadProbe = {\n tokens: string[];\n entityCounts: Map<string, number>;\n layerHints: string[];\n blockHints: string[];\n externalRefs: string[];\n};\n\nfunction probeBinaryCad(bytes: Uint8Array): BinaryCadProbe {\n const text = extractAsciiRuns(bytes.slice(0, Math.min(bytes.length, 65536)));\n const tokens = text\n .map((item) => item.trim())\n .filter((item) => item.length >= 3)\n .slice(0, 240);\n const entityKeywords = [\"LINE\", \"CIRCLE\", \"ARC\", \"LWPOLYLINE\", \"POLYLINE\", \"TEXT\", \"MTEXT\", \"INSERT\", \"BLOCK\", \"LAYER\", \"XREF\", \"DIMENSION\"];\n const entityCounts = new Map<string, number>();\n for (const token of tokens) {\n const normalized = token.toUpperCase();\n for (const keyword of entityKeywords) {\n if (normalized.includes(keyword)) {\n entityCounts.set(keyword, (entityCounts.get(keyword) || 0) + 1);\n }\n }\n }\n return {\n tokens,\n entityCounts,\n layerHints: uniqueHints(tokens.filter((item) => /layer|图层/i.test(item))),\n blockHints: uniqueHints(tokens.filter((item) => /block|insert|块/i.test(item))),\n externalRefs: uniqueHints(tokens.filter((item) => /xref|\\.dwg|\\.dxf|\\.pdf|\\.png|\\.jpe?g/i.test(item)))\n };\n}\n\nfunction extractAsciiRuns(bytes: Uint8Array): string[] {\n const result: string[] = [];\n let current = \"\";\n for (const byte of bytes) {\n if (byte >= 32 && byte <= 126) {\n current += String.fromCharCode(byte);\n continue;\n }\n if (current.length >= 3) {\n result.push(current);\n }\n current = \"\";\n }\n if (current.length >= 3) {\n result.push(current);\n }\n return result;\n}\n\nfunction uniqueHints(values: string[]): string[] {\n return Array.from(new Set(values.map((value) => value.trim()).filter(Boolean))).slice(0, 12);\n}\n\nfunction formatCadKeywordCounts(counts: Map<string, number>): string {\n const text = [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 6)\n .map(([type, count]) => `${type} ${count}`)\n .join(\", \");\n return text || \"未发现\";\n}\n\nfunction parseStepRecords(text: string): StepRecord[] {\n return [...text.matchAll(/#(\\d+)\\s*=\\s*([A-Z0-9_]+)\\s*\\(([\\s\\S]*?)\\)\\s*;/gi)].map((match) => ({\n id: `#${match[1]}`,\n type: (match[2] || \"\").toUpperCase(),\n args: (match[3] || \"\").replace(/\\s+/g, \" \").trim()\n }));\n}\n\nfunction parseIgesRecords(text: string): IgesRecord[] {\n const parameterText = text\n .split(/\\r?\\n/)\n .filter((line) => line.slice(72, 73).toUpperCase() === \"P\" || /^\\s*\\d+\\s*,/.test(line))\n .map((line) => line.slice(0, 72).trim())\n .join(\"\");\n if (!parameterText) {\n return [];\n }\n return parameterText\n .split(\";\")\n .map((record) => record.trim())\n .filter(Boolean)\n .map((record) => {\n const params = record.split(\",\").map((part) => part.trim()).filter(Boolean);\n return { type: params[0] || \"UNKNOWN\", params };\n });\n}\n\nfunction summarizeStepRecord(record: StepRecord): string {\n if (record.type === \"CARTESIAN_POINT\") {\n const point = record.args.match(/\\(([-+0-9., E]+)\\)/i)?.[1];\n return point ? `坐标 ${point.replace(/\\s+/g, \"\")}` : record.args;\n }\n if (record.type === \"DIRECTION\" || record.type === \"VECTOR\") {\n const direction = record.args.match(/\\(([-+0-9., E]+)\\)/i)?.[1];\n return direction ? `向量 ${direction.replace(/\\s+/g, \"\")}` : record.args;\n }\n if (record.type === \"LINE\" || record.type === \"CIRCLE\" || record.type === \"ADVANCED_FACE\") {\n return record.args.slice(0, 180);\n }\n return record.args.slice(0, 120);\n}\n\nfunction summarizeIfcRecord(record: StepRecord): string {\n const strings = extractStepStrings(record.args);\n const globalId = strings[0];\n const name = strings[2] || strings[1];\n const label = [globalId, name].filter(Boolean).join(\" · \");\n if (label) {\n return label;\n }\n return summarizeStepRecord(record);\n}\n\nfunction createIfcHierarchy(records: StepRecord[]): HTMLElement | null {\n const rows = records\n .filter((record) => [\"IFCPROJECT\", \"IFCSITE\", \"IFCBUILDING\", \"IFCBUILDINGSTOREY\", \"IFCSPACE\"].includes(record.type))\n .slice(0, 80)\n .map((record) => ({\n id: record.id,\n type: ifcTypeName(record.type),\n detail: summarizeIfcRecord(record)\n }));\n if (rows.length === 0) {\n return null;\n }\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-table-scroll ofv-cad-entities\";\n const title = document.createElement(\"strong\");\n title.textContent = \"BIM 层级\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"ID\", \"层级\", \"名称\"]) {\n const cell = document.createElement(\"th\");\n cell.textContent = label;\n header.append(cell);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const row of rows) {\n const tr = document.createElement(\"tr\");\n for (const value of [row.id, row.type, row.detail]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n tr.append(cell);\n }\n tbody.append(tr);\n }\n table.append(thead, tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\nfunction extractStepStrings(args: string): string[] {\n const values: string[] = [];\n const pattern = /'((?:''|[^'])*)'/g;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(args))) {\n values.push((match[1] || \"\").replace(/''/g, \"'\"));\n }\n return values;\n}\n\nfunction countIfcElements(counts: Map<string, number>): number {\n const elementTypes = [\n \"IFCBEAM\",\n \"IFCBUILDINGELEMENTPROXY\",\n \"IFCCOLUMN\",\n \"IFCCOVERING\",\n \"IFCCURTAINWALL\",\n \"IFCDOOR\",\n \"IFCFLOWSEGMENT\",\n \"IFCFURNISHINGELEMENT\",\n \"IFCMEMBER\",\n \"IFCPLATE\",\n \"IFCRAILING\",\n \"IFCRAMP\",\n \"IFCRAMPFLIGHT\",\n \"IFCROOF\",\n \"IFCSLAB\",\n \"IFCSTAIR\",\n \"IFCSTAIRFLIGHT\",\n \"IFCWALL\",\n \"IFCWALLSTANDARDCASE\",\n \"IFCWINDOW\"\n ];\n return elementTypes.reduce((sum, type) => sum + (counts.get(type) || 0), 0);\n}\n\nfunction ifcTypeName(type: string): string {\n const names: Record<string, string> = {\n IFCPROJECT: \"项目\",\n IFCSITE: \"场地\",\n IFCBUILDING: \"建筑\",\n IFCBUILDINGSTOREY: \"楼层\",\n IFCSPACE: \"空间\"\n };\n return names[type] || type;\n}\n\nfunction igesTypeName(type: string): string {\n const names: Record<string, string> = {\n \"100\": \"100 Circular Arc\",\n \"110\": \"110 Line\",\n \"112\": \"112 Parametric Spline Curve\",\n \"114\": \"114 Parametric Spline Surface\",\n \"116\": \"116 Point\",\n \"118\": \"118 Ruled Surface\",\n \"120\": \"120 Surface of Revolution\",\n \"126\": \"126 Rational B-Spline Curve\",\n \"128\": \"128 Rational B-Spline Surface\",\n \"144\": \"144 Trimmed Surface\"\n };\n return names[type] || type;\n}\n\nfunction createCadTypeList(counts: Map<string, number>, titleText = \"类型统计\"): HTMLElement {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-cad-types\";\n details.open = true;\n const summary = document.createElement(\"summary\");\n summary.textContent = titleText;\n const list = document.createElement(\"ul\");\n for (const [type, count] of [...counts.entries()].sort((a, b) => b[1] - a[1]).slice(0, 80)) {\n const item = document.createElement(\"li\");\n item.textContent = `${type}: ${count}`;\n list.append(item);\n }\n details.append(summary, list);\n return details;\n}\n\nfunction createCadEntityTable(rows: Array<{ id: string; type: string; detail: string }>): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-table-scroll ofv-cad-entities\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"ID\", \"类型\", \"摘要\"]) {\n const cell = document.createElement(\"th\");\n cell.textContent = label;\n header.append(cell);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const row of rows) {\n const tr = document.createElement(\"tr\");\n for (const value of [row.id, row.type, row.detail]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n tr.append(cell);\n }\n tbody.append(tr);\n }\n table.append(thead, tbody);\n wrapper.append(table);\n return wrapper;\n}\n\nfunction countBy(values: string[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const value of values) {\n counts.set(value, (counts.get(value) || 0) + 1);\n }\n return counts;\n}\n\nfunction appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction byteSignature(bytes: Uint8Array): string {\n if (bytes.length === 0) {\n return \"空文件\";\n }\n const ascii = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 16))).replace(/[^\\x20-\\x7E]/g, \".\");\n const hex = Array.from(bytes.slice(0, Math.min(bytes.length, 8)))\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \");\n return `${ascii} (${hex})`;\n}\n\nfunction detectCadVersion(bytes: Uint8Array, extension: string): string {\n const header = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 32)));\n if (extension === \"dwg\") {\n const match = header.match(/AC\\d{4}/);\n if (!match) {\n return \"未知 DWG 版本\";\n }\n const names: Record<string, string> = {\n AC1009: \"AutoCAD R12\",\n AC1012: \"AutoCAD R13\",\n AC1014: \"AutoCAD R14\",\n AC1015: \"AutoCAD 2000/2002\",\n AC1018: \"AutoCAD 2004/2005/2006\",\n AC1021: \"AutoCAD 2007/2008/2009\",\n AC1024: \"AutoCAD 2010/2011/2012\",\n AC1027: \"AutoCAD 2013/2014/2015/2016/2017\",\n AC1032: \"AutoCAD 2018+\"\n };\n return `${match[0]}${names[match[0]] ? ` · ${names[match[0]]}` : \"\"}`;\n }\n if (header.startsWith(\"(DWF\") || header.includes(\"DWF\")) {\n return header.split(/\\s+/)[0] || \"DWF\";\n }\n return \"未知版本\";\n}\n\nfunction detectCadContainer(bytes: Uint8Array): string {\n if (bytes[0] === 0x50 && bytes[1] === 0x4b) {\n return \"ZIP/PK 压缩容器\";\n }\n if (bytes[0] === 0x1f && bytes[1] === 0x8b) {\n return \"GZIP 压缩流\";\n }\n if (bytes[0] === 0x28 && bytes[1] === 0x44 && bytes[2] === 0x57 && bytes[3] === 0x46) {\n return \"DWF ASCII 头\";\n }\n return \"二进制流\";\n}\n\nfunction hexPreview(bytes: Uint8Array): string {\n const rows: string[] = [];\n const limit = Math.min(bytes.length, 256);\n for (let offset = 0; offset < limit; offset += 16) {\n const slice = bytes.slice(offset, offset + 16);\n const hex = Array.from(slice)\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \")\n .padEnd(47, \" \");\n const ascii = Array.from(slice)\n .map((byte) => (byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : \".\"))\n .join(\"\");\n rows.push(`${offset.toString(16).padStart(8, \"0\").toUpperCase()} ${hex} ${ascii}`);\n }\n if (bytes.length > limit) {\n rows.push(`... 仅展示前 ${limit} 字节,共 ${bytes.length} 字节`);\n }\n return rows.join(\"\\n\") || \"无可展示字节。\";\n}\n\nfunction renderDxf(\n panel: HTMLElement,\n dxf: string,\n ctx: Pick<PreviewContext, \"toolbar\">\n): {\n canCommand: (command: string) => boolean;\n command: (command: string) => boolean;\n destroy: () => void;\n} {\n const pairs = dxf.split(/\\r?\\n/).map((line) => line.trim());\n const lines: Array<LayeredValue<[number, number, number, number]>> = [];\n const circles: Array<LayeredValue<[number, number, number]>> = [];\n const arcs: Array<LayeredValue<[number, number, number, number, number]>> = [];\n const points: Array<LayeredValue<[number, number]>> = [];\n const polylines: Array<LayeredValue<Array<[number, number]>>> = [];\n const texts: Array<LayeredValue<[number, number, string, number]>> = [];\n\n for (let index = 0; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\" && value === \"LINE\") {\n const entity = readEntity(pairs, index + 2);\n lines.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n Number(entity[\"11\"] || 0),\n Number(entity[\"21\"] || 0)\n ]\n });\n }\n if (code === \"0\" && value === \"CIRCLE\") {\n const entity = readEntity(pairs, index + 2);\n circles.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n Number(entity[\"40\"] || 0)\n ]\n });\n }\n if (code === \"0\" && value === \"ARC\") {\n const entity = readEntity(pairs, index + 2);\n arcs.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n Number(entity[\"40\"] || 0),\n Number(entity[\"50\"] || 0),\n Number(entity[\"51\"] || 0)\n ]\n });\n }\n if (code === \"0\" && value === \"POINT\") {\n const entity = readEntity(pairs, index + 2);\n points.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [Number(entity[\"10\"] || 0), Number(entity[\"20\"] || 0)]\n });\n }\n if (code === \"0\" && value === \"LWPOLYLINE\") {\n const entity = readEntity(pairs, index + 2);\n const entityPairs = readEntityPairs(pairs, index + 2);\n const polyline = readPolylinePoints(entityPairs);\n if (polyline.length > 1) {\n polylines.push({ layer: normalizeLayerName(entity[\"8\"]), value: polyline });\n }\n }\n if (code === \"0\" && value === \"POLYLINE\") {\n const result = readLegacyPolyline(pairs, index + 2);\n if (result.points.length > 1) {\n polylines.push({ layer: result.layer, value: result.points });\n }\n index = Math.max(index, result.endIndex - 2);\n }\n if (code === \"0\" && (value === \"TEXT\" || value === \"MTEXT\")) {\n const entity = readEntity(pairs, index + 2);\n const text = normalizeDxfText(entity[\"1\"] || entity[\"3\"] || \"\");\n if (text) {\n texts.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n text,\n Math.max(1, Number(entity[\"40\"] || 12))\n ]\n });\n }\n }\n }\n\n const section = createSection(`DXF 基础预览`);\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n\n const bounds = computeBounds(lines, circles, arcs, points, polylines, texts);\n const initialViewBox = {\n x: bounds.minX,\n y: bounds.minY,\n width: bounds.width,\n height: bounds.height\n };\n let currentViewBox = { ...initialViewBox };\n const applyViewBox = () => {\n svg.setAttribute(\n \"viewBox\",\n `${currentViewBox.x} ${currentViewBox.y} ${currentViewBox.width} ${currentViewBox.height}`\n );\n };\n applyViewBox();\n\n for (const item of lines.slice(0, 3000)) {\n const [x1, y1, x2, y2] = item.value;\n const line = document.createElementNS(svg.namespaceURI, \"line\");\n line.setAttribute(\"x1\", String(x1));\n line.setAttribute(\"y1\", String(-y1));\n line.setAttribute(\"x2\", String(x2));\n line.setAttribute(\"y2\", String(-y2));\n line.setAttribute(\"stroke\", \"#111827\");\n line.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(line, item.layer);\n svg.append(line);\n }\n\n for (const item of circles.slice(0, 1000)) {\n const [cx, cy, radius] = item.value;\n const circle = document.createElementNS(svg.namespaceURI, \"circle\");\n circle.setAttribute(\"cx\", String(cx));\n circle.setAttribute(\"cy\", String(-cy));\n circle.setAttribute(\"r\", String(Math.abs(radius)));\n circle.setAttribute(\"fill\", \"none\");\n circle.setAttribute(\"stroke\", \"#2563eb\");\n circle.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(circle, item.layer);\n svg.append(circle);\n }\n\n for (const item of arcs.slice(0, 1000)) {\n const [cx, cy, radius, startAngle, endAngle] = item.value;\n const path = document.createElementNS(svg.namespaceURI, \"path\");\n path.setAttribute(\"d\", arcPath(cx, -cy, Math.abs(radius), -startAngle, -endAngle));\n path.setAttribute(\"fill\", \"none\");\n path.setAttribute(\"stroke\", \"#7c3aed\");\n path.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(path, item.layer);\n svg.append(path);\n }\n\n for (const item of polylines.slice(0, 2000)) {\n const polyline = item.value;\n const path = document.createElementNS(svg.namespaceURI, \"polyline\");\n path.setAttribute(\"points\", polyline.map(([x, y]) => `${x},${-y}`).join(\" \"));\n path.setAttribute(\"fill\", \"none\");\n path.setAttribute(\"stroke\", \"#0f766e\");\n path.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(path, item.layer);\n svg.append(path);\n }\n\n for (const item of points.slice(0, 3000)) {\n const [x, y] = item.value;\n const point = document.createElementNS(svg.namespaceURI, \"circle\");\n point.setAttribute(\"cx\", String(x));\n point.setAttribute(\"cy\", String(-y));\n point.setAttribute(\"r\", String(bounds.stroke * 2));\n point.setAttribute(\"fill\", \"#dc2626\");\n applyLayer(point, item.layer);\n svg.append(point);\n }\n\n for (const item of texts.slice(0, 500)) {\n const [x, y, text, height] = item.value;\n const label = document.createElementNS(svg.namespaceURI, \"text\");\n label.setAttribute(\"x\", String(x));\n label.setAttribute(\"y\", String(-y));\n label.setAttribute(\"font-size\", String(Math.max(height, bounds.stroke * 8)));\n label.setAttribute(\"fill\", \"currentColor\");\n label.textContent = text;\n applyLayer(label, item.layer);\n svg.append(label);\n }\n\n const layers = Array.from(\n new Set([...lines, ...circles, ...arcs, ...points, ...polylines, ...texts].map((item) => item.layer))\n ).sort((a, b) => a.localeCompare(b));\n if (layers.length > 0) {\n section.append(createLayerControls(svg, layers));\n }\n\n const note = document.createElement(\"p\");\n note.textContent =\n `已提取 LINE ${lines.length} 个、CIRCLE ${circles.length} 个、ARC ${arcs.length} 个、POLYLINE ${polylines.length} 个、POINT ${points.length} 个、TEXT ${texts.length} 个。`\n section.append(note, svg);\n panel.append(section);\n const updateToolbarZoom = () => {\n ctx.toolbar?.setZoom(initialViewBox.width / currentViewBox.width);\n };\n updateToolbarZoom();\n\n return {\n canCommand(command) {\n return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n },\n command(command) {\n if (command === \"zoom-in\" || command === \"zoom-out\") {\n const factor = command === \"zoom-in\" ? 0.82 : 1.18;\n const centerX = currentViewBox.x + currentViewBox.width / 2;\n const centerY = currentViewBox.y + currentViewBox.height / 2;\n currentViewBox.width *= factor;\n currentViewBox.height *= factor;\n currentViewBox.x = centerX - currentViewBox.width / 2;\n currentViewBox.y = centerY - currentViewBox.height / 2;\n applyViewBox();\n updateToolbarZoom();\n return true;\n }\n if (command === \"zoom-reset\") {\n currentViewBox = { ...initialViewBox };\n applyViewBox();\n updateToolbarZoom();\n return true;\n }\n return false;\n },\n destroy() {\n ctx.toolbar?.setZoom(undefined);\n }\n };\n}\n\nfunction applyLayer(element: Element, layer: string): void {\n element.setAttribute(\"data-layer\", layer);\n}\n\nfunction createLayerControls(svg: SVGSVGElement, layers: string[]): HTMLElement {\n const controls = document.createElement(\"div\");\n controls.className = \"ofv-cad-layers\";\n const title = document.createElement(\"strong\");\n title.textContent = `图层 ${layers.length}`;\n controls.append(title);\n\n for (const layer of layers) {\n const label = document.createElement(\"label\");\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.checked = true;\n checkbox.addEventListener(\"change\", () => {\n for (const element of svg.querySelectorAll<SVGElement>(`[data-layer=\"${escapeCssAttribute(layer)}\"]`)) {\n element.style.display = checkbox.checked ? \"\" : \"none\";\n }\n });\n const name = document.createElement(\"span\");\n name.textContent = layer;\n label.append(checkbox, name);\n controls.append(label);\n }\n return controls;\n}\n\nfunction readEntity(pairs: string[], start: number): Record<string, string> {\n const entity: Record<string, string> = {};\n for (let index = start; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\") {\n break;\n }\n entity[code] = value;\n }\n return entity;\n}\n\nfunction readEntityPairs(pairs: string[], start: number): Array<[string, string]> {\n const entityPairs: Array<[string, string]> = [];\n for (let index = start; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\") {\n break;\n }\n entityPairs.push([code, value]);\n }\n return entityPairs;\n}\n\nfunction readPolylinePoints(entityPairs: Array<[string, string]>): Array<[number, number]> {\n const points: Array<[number, number]> = [];\n let x: number | undefined;\n for (const [code, value] of entityPairs) {\n if (code === \"10\") {\n x = Number(value);\n }\n if (code === \"20\" && x !== undefined) {\n points.push([x, Number(value)]);\n x = undefined;\n }\n }\n return points;\n}\n\nfunction readLegacyPolyline(\n pairs: string[],\n start: number\n): { layer: string; points: Array<[number, number]>; endIndex: number } {\n let layer = \"0\";\n const points: Array<[number, number]> = [];\n for (let index = start; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\" && value === \"SEQEND\") {\n return { layer, points, endIndex: index + 2 };\n }\n if (code === \"8\") {\n layer = normalizeLayerName(value);\n }\n if (code === \"0\" && value === \"VERTEX\") {\n const entity = readEntity(pairs, index + 2);\n points.push([Number(entity[\"10\"] || 0), Number(entity[\"20\"] || 0)]);\n }\n }\n return { layer, points, endIndex: pairs.length };\n}\n\nfunction normalizeLayerName(layer: string | undefined): string {\n return layer?.trim() || \"0\";\n}\n\nfunction escapeCssAttribute(value: string): string {\n if (typeof CSS !== \"undefined\" && CSS.escape) {\n return CSS.escape(value);\n }\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nfunction normalizeDxfText(text: string): string {\n return text\n .replace(/\\\\P/g, \"\\n\")\n .replace(/\\{\\\\[^;]+;/g, \"\")\n .replace(/[{}]/g, \"\")\n .trim();\n}\n\nfunction arcPath(cx: number, cy: number, radius: number, startAngle: number, endAngle: number): string {\n const start = polarToCartesian(cx, cy, radius, endAngle);\n const end = polarToCartesian(cx, cy, radius, startAngle);\n const delta = Math.abs(endAngle - startAngle);\n const largeArc = delta <= 180 ? \"0\" : \"1\";\n return `M ${start.x} ${start.y} A ${radius} ${radius} 0 ${largeArc} 0 ${end.x} ${end.y}`;\n}\n\nfunction polarToCartesian(cx: number, cy: number, radius: number, angleDegrees: number): { x: number; y: number } {\n const angle = (angleDegrees * Math.PI) / 180;\n return {\n x: cx + radius * Math.cos(angle),\n y: cy + radius * Math.sin(angle)\n };\n}\n\nfunction computeBounds(\n lines: Array<LayeredValue<[number, number, number, number]>>,\n circles: Array<LayeredValue<[number, number, number]>>,\n arcs: Array<LayeredValue<[number, number, number, number, number]>>,\n points: Array<LayeredValue<[number, number]>>,\n polylines: Array<LayeredValue<Array<[number, number]>>>,\n texts: Array<LayeredValue<[number, number, string, number]>>\n): { minX: number; minY: number; width: number; height: number; stroke: number } {\n const xs = lines.flatMap(({ value: [x1, , x2] }) => [x1, x2]);\n const ys = lines.flatMap(({ value: [, y1, , y2] }) => [-y1, -y2]);\n for (const { value: [cx, cy, radius] } of circles) {\n xs.push(cx - radius, cx + radius);\n ys.push(-cy - radius, -cy + radius);\n }\n for (const { value: [cx, cy, radius] } of arcs) {\n xs.push(cx - radius, cx + radius);\n ys.push(-cy - radius, -cy + radius);\n }\n for (const { value: [x, y] } of points) {\n xs.push(x);\n ys.push(-y);\n }\n for (const { value: polyline } of polylines) {\n for (const [x, y] of polyline) {\n xs.push(x);\n ys.push(-y);\n }\n }\n for (const { value: [x, y, text, height] } of texts) {\n xs.push(x, x + text.length * height * 0.6);\n ys.push(-y, -y - height);\n }\n const minX = Math.min(...xs, 0);\n const maxX = Math.max(...xs, 100);\n const minY = Math.min(...ys, 0);\n const maxY = Math.max(...ys, 100);\n const width = Math.max(1, maxX - minX);\n const height = Math.max(1, maxY - minY);\n return {\n minX,\n minY,\n width,\n height,\n stroke: Math.max(width, height) / 600\n };\n}\n","import type { PreviewContext, PreviewInstance, PreviewPlugin, PreviewSize } from \"../types\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport { resolveFormat } from \"./utils\";\n\nconst modelExtensions = new Set([\n \"gltf\",\n \"glb\",\n \"obj\",\n \"stl\",\n \"fbx\",\n \"dae\",\n \"ply\",\n \"3mf\",\n \"3ds\",\n \"usd\",\n \"usda\",\n \"usdc\",\n \"usdz\",\n \"wrl\",\n \"vrml\"\n]);\nconst modelMimeTypes = new Set([\n \"model/gltf+json\",\n \"model/gltf-binary\",\n \"model/stl\",\n \"model/obj\",\n \"model/vnd.collada+xml\",\n \"model/3mf\",\n \"model/3ds\",\n \"model/vnd.usd\",\n \"model/vnd.usdz+zip\",\n \"model/vrml\",\n \"application/sla\",\n \"application/vnd.ms-pki.stl\",\n \"application/ply\",\n \"application/vnd.autodesk.fbx\"\n]);\nconst modelMimeFormatMap: Record<string, string> = {\n \"model/gltf+json\": \"gltf\",\n \"model/gltf-binary\": \"glb\",\n \"model/stl\": \"stl\",\n \"model/obj\": \"obj\",\n \"model/vnd.collada+xml\": \"dae\",\n \"model/3mf\": \"3mf\",\n \"model/3ds\": \"3ds\",\n \"model/vnd.usd\": \"usd\",\n \"model/vnd.usdz+zip\": \"usdz\",\n \"model/vrml\": \"wrl\",\n \"application/sla\": \"stl\",\n \"application/vnd.ms-pki.stl\": \"stl\",\n \"application/ply\": \"ply\",\n \"application/vnd.autodesk.fbx\": \"fbx\"\n};\nconst textLikeExtensions = new Set([\"json\", \"txt\", \"md\", \"xml\", \"yaml\", \"yml\", \"csv\", \"tsv\", \"js\", \"ts\", \"tsx\", \"jsx\", \"html\", \"css\"]);\n\nexport function model3dPlugin(): PreviewPlugin {\n return {\n name: \"model3d\",\n match(file) {\n return (\n modelExtensions.has(file.extension) ||\n (modelMimeTypes.has(file.mimeType) && (file.extension === \"\" || file.extension === \"bin\" || !textLikeExtensions.has(file.extension)))\n );\n },\n async render(ctx) {\n const THREE = await import(\"three\");\n const { OrbitControls } = await import(\"three/examples/jsm/controls/OrbitControls.js\");\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n\n const stage = document.createElement(\"div\");\n stage.className = \"ofv-model-stage\";\n ctx.viewport.append(stage);\n\n const scene = new THREE.Scene();\n scene.background = new THREE.Color(0xf3f4f6);\n\n const camera = new THREE.PerspectiveCamera(45, 1, 0.1, 10000);\n camera.position.set(2.5, 2, 3.5);\n\n let renderer: import(\"three\").WebGLRenderer;\n try {\n renderer = new THREE.WebGLRenderer({ antialias: true });\n } catch {\n stage.remove();\n return renderModelFallback(ctx, url, isExternal, \"当前浏览器或设备不支持 WebGL,无法直接渲染 3D 模型。\");\n }\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n renderer.outputColorSpace = THREE.SRGBColorSpace;\n renderer.toneMapping = THREE.ACESFilmicToneMapping;\n renderer.toneMappingExposure = 1.08;\n stage.append(renderer.domElement);\n\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n\n scene.add(new THREE.HemisphereLight(0xffffff, 0x94a3b8, 2.8));\n const directional = new THREE.DirectionalLight(0xffffff, 2);\n directional.position.set(4, 6, 5);\n scene.add(directional);\n scene.add(new THREE.GridHelper(10, 10, 0xcbd5e1, 0xe5e7eb));\n\n const extension = resolveFormat(ctx.file, modelMimeFormatMap);\n const loaded = await loadModel(extension, url, THREE).catch(() => undefined);\n if (!loaded) {\n controls.dispose();\n renderer.dispose();\n stage.remove();\n return renderModelFallback(ctx, url, isExternal, \"无法解析当前 3D 模型内容。\");\n }\n if (loaded.message) {\n const message = document.createElement(\"div\");\n message.className = \"ofv-model-message\";\n message.textContent = loaded.message;\n stage.append(message);\n }\n const object = loaded.object;\n scene.add(object);\n const initialFrame = frameObject(object, camera, controls, THREE);\n const measurement = measureObject(object, THREE);\n stage.append(createMeasurementPanel(measurement));\n stage.append(createMaterialPanel(collectMaterialStats(object)));\n\n let animationFrame = 0;\n const animate = () => {\n controls.update();\n renderer.render(scene, camera);\n animationFrame = window.requestAnimationFrame(animate);\n };\n animate();\n\n const resize = (size: PreviewSize) => {\n const width = Math.max(1, size.width);\n const height = Math.max(1, size.height);\n camera.aspect = width / height;\n camera.updateProjectionMatrix();\n renderer.setSize(width, height, false);\n };\n resize(ctx.size);\n const updateToolbarZoom = () => {\n const currentDistance = vectorDistance(camera.position, controls.target);\n const initialDistance = vectorDistance(initialFrame.cameraPosition, initialFrame.target);\n ctx.toolbar?.setZoom(initialDistance > 0 ? initialDistance / currentDistance : undefined);\n };\n updateToolbarZoom();\n\n return {\n canCommand(command) {\n return (\n command === \"zoom-in\" ||\n command === \"zoom-out\" ||\n command === \"zoom-reset\" ||\n command === \"rotate-right\" ||\n command === \"rotate-left\"\n );\n },\n command(command) {\n if (command === \"zoom-in\" || command === \"zoom-out\") {\n const factor = command === \"zoom-in\" ? 0.82 : 1.18;\n camera.position.sub(controls.target).multiplyScalar(factor).add(controls.target);\n camera.updateProjectionMatrix();\n controls.update();\n updateToolbarZoom();\n return true;\n }\n if (command === \"zoom-reset\") {\n camera.position.copy(initialFrame.cameraPosition);\n controls.target.copy(initialFrame.target);\n camera.near = initialFrame.near;\n camera.far = initialFrame.far;\n camera.updateProjectionMatrix();\n controls.update();\n updateToolbarZoom();\n return true;\n }\n if (command === \"rotate-right\" || command === \"rotate-left\") {\n object.rotateY(command === \"rotate-right\" ? Math.PI / 8 : -Math.PI / 8);\n return true;\n }\n return false;\n },\n resize,\n destroy() {\n ctx.toolbar?.setZoom(undefined);\n window.cancelAnimationFrame(animationFrame);\n controls.dispose();\n renderer.dispose();\n disposeObject(object, THREE);\n stage.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\nfunction vectorDistance(\n a: { x: number; y: number; z: number; distanceTo?: (value: { x: number; y: number; z: number }) => number },\n b: { x: number; y: number; z: number }\n): number {\n if (typeof a.distanceTo === \"function\") {\n return a.distanceTo(b);\n }\n return Math.hypot(a.x - b.x, a.y - b.y, a.z - b.z);\n}\n\nfunction renderModelFallback(\n ctx: PreviewContext,\n url: string,\n isExternal: boolean,\n message: string\n): PreviewInstance {\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"3D 预览不可用\";\n\n const detail = document.createElement(\"span\");\n detail.textContent = `${message} ${ctx.file.name}`;\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n\n panel.append(title, detail, download);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(panel);\n\n return {\n canCommand() {\n return false;\n },\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n}\n\nasync function loadModel(\n extension: string,\n url: string,\n THREE: typeof import(\"three\")\n): Promise<{ object: import(\"three\").Object3D; message?: string }> {\n if (extension === \"gltf\" || extension === \"glb\") {\n const { GLTFLoader } = await import(\"three/examples/jsm/loaders/GLTFLoader.js\");\n const gltf = await new GLTFLoader().loadAsync(url);\n return { object: gltf.scene };\n }\n if (extension === \"obj\") {\n const { OBJLoader } = await import(\"three/examples/jsm/loaders/OBJLoader.js\");\n return { object: await new OBJLoader().loadAsync(url) };\n }\n if (extension === \"fbx\") {\n const { FBXLoader } = await import(\"three/examples/jsm/loaders/FBXLoader.js\");\n return { object: await new FBXLoader().loadAsync(url) };\n }\n if (extension === \"dae\") {\n const { ColladaLoader } = await import(\"three/examples/jsm/loaders/ColladaLoader.js\");\n const collada = await new ColladaLoader().loadAsync(url);\n if (!collada) {\n throw new Error(\"Collada loader returned no scene.\");\n }\n return { object: collada.scene };\n }\n if (extension === \"stl\") {\n const { STLLoader } = await import(\"three/examples/jsm/loaders/STLLoader.js\");\n const geometry = await new STLLoader().loadAsync(url);\n const material = new THREE.MeshStandardMaterial({ color: 0x64748b, roughness: 0.55 });\n return { object: new THREE.Mesh(geometry, material) };\n }\n if (extension === \"ply\") {\n const { PLYLoader } = await import(\"three/examples/jsm/loaders/PLYLoader.js\");\n const geometry = await new PLYLoader().loadAsync(url);\n const material = new THREE.MeshStandardMaterial({ color: 0x64748b, roughness: 0.55 });\n return { object: new THREE.Mesh(geometry, material) };\n }\n if (extension === \"3mf\") {\n const { ThreeMFLoader } = await import(\"three/examples/jsm/loaders/3MFLoader.js\");\n return { object: await new ThreeMFLoader().loadAsync(url) };\n }\n if (extension === \"3ds\") {\n const { TDSLoader } = await import(\"three/examples/jsm/loaders/TDSLoader.js\");\n return { object: await new TDSLoader().loadAsync(url) };\n }\n if (extension === \"usd\" || extension === \"usda\" || extension === \"usdc\" || extension === \"usdz\") {\n const { USDLoader } = await import(\"three/examples/jsm/loaders/USDLoader.js\");\n return { object: await new USDLoader().loadAsync(url) };\n }\n if (extension === \"wrl\" || extension === \"vrml\") {\n const { VRMLLoader } = await import(\"three/examples/jsm/loaders/VRMLLoader.js\");\n return { object: await new VRMLLoader().loadAsync(url) };\n }\n const group = new THREE.Group();\n const geometry = new THREE.BoxGeometry(1, 1, 1);\n const material = new THREE.MeshStandardMaterial({ color: 0x64748b });\n const mesh = new THREE.Mesh(geometry, material);\n group.add(mesh);\n return {\n object: group,\n message: `.${extension} 已识别为 3D 格式,当前内置渲染优先支持 gltf/glb/obj/stl/fbx/dae/ply/3mf/3ds/usd/usdz/vrml。`\n };\n}\n\nfunction frameObject(\n object: import(\"three\").Object3D,\n camera: import(\"three\").PerspectiveCamera,\n controls: { target: import(\"three\").Vector3; update: () => void },\n THREE: typeof import(\"three\")\n): {\n cameraPosition: import(\"three\").Vector3;\n target: import(\"three\").Vector3;\n near: number;\n far: number;\n} {\n const box = new THREE.Box3().setFromObject(object);\n const size = box.getSize(new THREE.Vector3());\n const center = box.getCenter(new THREE.Vector3());\n const maxSize = Math.max(size.x, size.y, size.z, 1);\n const distance = maxSize * 2.4;\n camera.position.set(center.x + distance, center.y + distance * 0.7, center.z + distance);\n camera.near = Math.max(distance / 1000, 0.01);\n camera.far = distance * 1000;\n camera.updateProjectionMatrix();\n controls.target.copy(center);\n controls.update();\n return {\n cameraPosition: camera.position.clone(),\n target: controls.target.clone(),\n near: camera.near,\n far: camera.far\n };\n}\n\ntype ModelMeasurement = {\n width: number;\n height: number;\n depth: number;\n diagonal: number;\n center: { x: number; y: number; z: number };\n};\n\ntype MaterialStats = {\n meshes: number;\n materials: number;\n textures: number;\n slots: string[];\n names: string[];\n};\n\nfunction measureObject(object: import(\"three\").Object3D, THREE: typeof import(\"three\")): ModelMeasurement {\n const box = new THREE.Box3().setFromObject(object);\n const size = box.getSize(new THREE.Vector3());\n const center = box.getCenter(new THREE.Vector3());\n return {\n width: size.x,\n height: size.y,\n depth: size.z,\n diagonal: Math.sqrt(size.x ** 2 + size.y ** 2 + size.z ** 2),\n center: { x: center.x, y: center.y, z: center.z }\n };\n}\n\nfunction createMeasurementPanel(measurement: ModelMeasurement): HTMLElement {\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-model-measure\";\n const title = document.createElement(\"strong\");\n title.textContent = \"模型测量\";\n const list = document.createElement(\"dl\");\n appendMeasure(list, \"宽\", measurement.width);\n appendMeasure(list, \"高\", measurement.height);\n appendMeasure(list, \"深\", measurement.depth);\n appendMeasure(list, \"对角线\", measurement.diagonal);\n appendMeasure(\n list,\n \"中心\",\n `${formatMeasure(measurement.center.x)}, ${formatMeasure(measurement.center.y)}, ${formatMeasure(measurement.center.z)}`\n );\n panel.append(title, list);\n return panel;\n}\n\nfunction appendMeasure(list: HTMLDListElement, label: string, value: number | string): void {\n const term = document.createElement(\"dt\");\n term.textContent = label;\n const detail = document.createElement(\"dd\");\n detail.textContent = typeof value === \"number\" ? formatMeasure(value) : value;\n list.append(term, detail);\n}\n\nfunction formatMeasure(value: number): string {\n if (!Number.isFinite(value)) {\n return \"-\";\n }\n const rounded = Math.abs(value) >= 100 ? value.toFixed(1) : value.toFixed(3);\n return rounded.replace(/\\.?0+$/, \"\");\n}\n\nfunction collectMaterialStats(object: import(\"three\").Object3D): MaterialStats {\n const materials = new Set<import(\"three\").Material>();\n const textures = new Set<unknown>();\n const slots = new Set<string>();\n const names = new Set<string>();\n let meshes = 0;\n\n object.traverse((child) => {\n const mesh = child as import(\"three\").Mesh;\n if (!mesh.geometry || !mesh.material) {\n return;\n }\n meshes += 1;\n for (const material of normalizeMaterials(mesh.material)) {\n materials.add(material);\n if (material.name) {\n names.add(material.name);\n }\n for (const slot of textureSlots) {\n const texture = (material as unknown as Record<string, unknown>)[slot];\n if (texture) {\n textures.add(texture);\n slots.add(slot);\n }\n }\n }\n });\n\n return {\n meshes,\n materials: materials.size,\n textures: textures.size,\n slots: [...slots],\n names: [...names].slice(0, 6)\n };\n}\n\nfunction createMaterialPanel(stats: MaterialStats): HTMLElement {\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-model-materials\";\n const title = document.createElement(\"strong\");\n title.textContent = \"材质贴图\";\n\n const list = document.createElement(\"dl\");\n appendMaterialStat(list, \"网格\", stats.meshes);\n appendMaterialStat(list, \"材质\", stats.materials);\n appendMaterialStat(list, \"贴图\", stats.textures);\n appendMaterialStat(list, \"槽位\", stats.slots.length > 0 ? stats.slots.join(\", \") : \"-\");\n if (stats.names.length > 0) {\n appendMaterialStat(list, \"名称\", stats.names.join(\", \"));\n }\n\n panel.append(title, list);\n return panel;\n}\n\nfunction appendMaterialStat(list: HTMLDListElement, label: string, value: number | string): void {\n const term = document.createElement(\"dt\");\n term.textContent = label;\n const detail = document.createElement(\"dd\");\n detail.textContent = String(value);\n list.append(term, detail);\n}\n\nfunction disposeObject(object: import(\"three\").Object3D, THREE: typeof import(\"three\")): void {\n object.traverse((child) => {\n const mesh = child as import(\"three\").Mesh;\n if (mesh.geometry) {\n mesh.geometry.dispose();\n }\n const material = mesh.material;\n for (const item of normalizeMaterials(material)) {\n disposeMaterialTextures(item);\n item.dispose();\n }\n });\n}\n\nconst textureSlots = [\n \"map\",\n \"aoMap\",\n \"alphaMap\",\n \"bumpMap\",\n \"displacementMap\",\n \"emissiveMap\",\n \"envMap\",\n \"lightMap\",\n \"metalnessMap\",\n \"normalMap\",\n \"roughnessMap\"\n];\n\nfunction normalizeMaterials(\n material: import(\"three\").Material | import(\"three\").Material[] | undefined\n): import(\"three\").Material[] {\n if (!material) {\n return [];\n }\n return Array.isArray(material) ? material : [material];\n}\n\nfunction disposeMaterialTextures(material: import(\"three\").Material): void {\n for (const slot of textureSlots) {\n const texture = (material as unknown as Record<string, { dispose?: () => void } | undefined>)[slot];\n texture?.dispose?.();\n }\n}\n","/// <reference path=\"../shims-gis.d.ts\" />\nimport type { PreviewPlugin, PreviewFile } from \"../types\";\nimport { readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst gisExtensions = new Set([\"geojson\", \"topojson\", \"kml\", \"kmz\", \"gpx\", \"shp\"]);\nconst gisMimeFormatMap: Record<string, string> = {\n \"application/geo+json\": \"geojson\",\n \"application/vnd.geo+json\": \"geojson\",\n \"application/topo+json\": \"topojson\",\n \"application/vnd.google-earth.kml+xml\": \"kml\",\n \"application/vnd.google-earth.kmz\": \"kmz\",\n \"application/gpx+xml\": \"gpx\"\n};\n\nfunction loadLeafletCss(): Promise<void> {\n const id = \"ofv-leaflet-css\";\n if (document.getElementById(id)) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n const link = document.createElement(\"link\");\n let settled = false;\n const done = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n link.id = id;\n link.rel = \"stylesheet\";\n link.href = \"https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.css\";\n link.onload = done;\n link.onerror = done;\n document.head.appendChild(link);\n window.setTimeout(done, 0);\n });\n}\n\nexport function gisPlugin(): PreviewPlugin {\n return {\n name: \"gis\",\n match(file) {\n return gisExtensions.has(file.extension) || Boolean(gisMimeFormatMap[file.mimeType]);\n },\n async render(ctx) {\n // 1. Load Leaflet CSS and dynamic imports\n await loadLeafletCss();\n\n const [L, topojson, toGeoJSON, shpjs, JSZip] = await Promise.all([\n import(\"leaflet\"),\n import(\"topojson-client\"),\n import(\"@mapbox/togeojson\"),\n import(\"shpjs\"),\n import(\"jszip\")\n ]);\n\n const Leaflet = L.default || L;\n const topojsonClient = topojson.default || topojson;\n const togeojsonLib = toGeoJSON.default || toGeoJSON;\n const shpLib = shpjs.default || shpjs;\n const JSZipLib = JSZip.default || JSZip;\n\n // Fix default marker icon paths using inline SVG to avoid asset 404 errors\n const DefaultIcon = Leaflet.icon({\n iconUrl: \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"32\" height=\"32\">\n <path fill=\"#3b82f6\" d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/>\n </svg>\n `),\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowUrl: \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"32\" height=\"32\">\n <ellipse cx=\"12\" cy=\"20\" rx=\"6\" ry=\"2\" fill=\"#000000\" opacity=\"0.2\"/>\n </svg>\n `),\n shadowSize: [41, 41],\n shadowAnchor: [12, 41]\n });\n Leaflet.Marker.prototype.options.icon = DefaultIcon;\n\n // 2. Read file as ArrayBuffer and Parse to GeoJSON\n const buffer = await readArrayBuffer(ctx.file);\n const geojson = await parseToGeoJson(\n ctx.file,\n buffer,\n togeojsonLib,\n topojsonClient,\n shpLib,\n JSZipLib\n ).catch((error: unknown) => {\n const fallback = createGisFallback(\"GIS 数据解析失败\", normalizeGisError(error, ctx.file.name));\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(fallback);\n return { fallback };\n });\n\n if (isGisFallback(geojson)) {\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n geojson.fallback.remove();\n }\n };\n }\n\n // Handle raw unzipped shapefile warning UI\n if (geojson === null && resolveFormat(ctx.file, gisMimeFormatMap) === \"shp\") {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"无法直接预览单个 .shp 文件\";\n\n const desc = document.createElement(\"span\");\n desc.textContent = \"Shapefile 格式需要包含配套的 .dbf 和 .shx 数据文件。请将它们打包为 .zip 文件后上传预览,或在压缩包列表中直接查看。\";\n\n fallback.append(title, desc);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(fallback);\n\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n fallback.remove();\n }\n };\n }\n\n // 3. Render Leaflet Map\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-gis-viewer\";\n const summary = summarizeGeoJson(geojson);\n wrapper.append(createGisSummary(summary));\n ctx.viewport.appendChild(wrapper);\n\n const mapContainer = document.createElement(\"div\");\n mapContainer.className = \"ofv-map-stage\";\n wrapper.appendChild(mapContainer);\n if (summary.features === 0) {\n mapContainer.append(createEmptyMapState());\n } else {\n mapContainer.append(createMapLegend(summary));\n }\n\n const map = Leaflet.map(mapContainer).setView([0, 0], 2);\n\n Leaflet.tileLayer(\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\", {\n attribution: '© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n }).addTo(map);\n\n // Render GeoJSON elements with premium blue color styles\n const geojsonLayer = Leaflet.geoJSON(geojson, {\n style: () => ({\n className: \"ofv-map-feature\",\n color: \"#e11d48\",\n weight: 2,\n opacity: 0.92,\n fillColor: \"#fb923c\",\n fillOpacity: 0.3,\n lineCap: \"round\",\n lineJoin: \"round\"\n }),\n pointToLayer: (feature: any, latlng: any) => {\n return Leaflet.circleMarker(latlng, {\n className: \"ofv-map-feature ofv-map-point\",\n radius: 7,\n fillColor: \"#e11d48\",\n color: \"#ffffff\",\n weight: 2.5,\n opacity: 1,\n fillOpacity: 0.9\n });\n },\n onEachFeature: (feature: any, layer: any) => {\n const label = feature.properties?.name || feature.properties?.title || feature.properties?.label;\n if (label) {\n layer.bindTooltip?.(String(label), {\n className: \"ofv-map-tooltip\",\n direction: \"top\",\n sticky: true\n });\n }\n layer.on?.({\n mouseover(event: any) {\n event.target?.setStyle?.({\n weight: 4,\n opacity: 1,\n fillOpacity: 0.4\n });\n event.target?.bringToFront?.();\n },\n mouseout(event: any) {\n geojsonLayer.resetStyle?.(event.target);\n }\n });\n if (feature.properties) {\n const props = feature.properties;\n const keys = Object.keys(props);\n if (keys.length > 0) {\n const popupContent = document.createElement(\"div\");\n popupContent.className = \"ofv-map-popup\";\n\n const popupTitle = document.createElement(\"h4\");\n popupTitle.textContent = \"属性信息\";\n popupContent.appendChild(popupTitle);\n\n const table = document.createElement(\"table\");\n table.className = \"ofv-map-popup-table\";\n\n for (const key of keys) {\n const val = props[key];\n if (val === null || val === undefined) continue;\n\n const row = document.createElement(\"tr\");\n const cellKey = document.createElement(\"td\");\n cellKey.className = \"ofv-map-popup-key\";\n cellKey.textContent = key;\n\n const cellVal = document.createElement(\"td\");\n cellVal.className = \"ofv-map-popup-val\";\n cellVal.textContent = typeof val === \"object\" ? JSON.stringify(val) : String(val);\n\n row.append(cellKey, cellVal);\n table.appendChild(row);\n }\n\n popupContent.appendChild(table);\n layer.bindPopup(popupContent);\n }\n }\n }\n }).addTo(map);\n\n // Zoom map to dataset bounds\n try {\n const bounds = geojsonLayer.getBounds();\n if (bounds.isValid()) {\n map.fitBounds(bounds, { padding: [20, 20] });\n map.invalidateSize();\n }\n } catch (e) {\n console.warn(\"Could not fit bounds for GeoJSON data:\", e);\n }\n\n const resizeTimers = [0, 80, 240].map((delay) => window.setTimeout(() => {\n map.invalidateSize();\n }, delay));\n\n return {\n resize() {\n map.invalidateSize();\n },\n destroy() {\n resizeTimers.forEach((timer) => window.clearTimeout(timer));\n map.remove();\n wrapper.remove();\n }\n };\n }\n };\n}\n\nfunction createGisFallback(titleText: string, detailText: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = titleText;\n const detail = document.createElement(\"span\");\n detail.textContent = detailText;\n fallback.append(title, detail);\n return fallback;\n}\n\nfunction normalizeGisError(error: unknown, fileName: string): string {\n const message = error instanceof Error ? error.message : String(error || \"\");\n return message ? `${fileName}: ${message}` : `${fileName}: 文件内容无法转换为地图数据。`;\n}\n\nfunction isGisFallback(value: unknown): value is { fallback: HTMLElement } {\n return typeof value === \"object\" && value !== null && \"fallback\" in value;\n}\n\ntype GisSummary = {\n features: number;\n geometryCounts: Map<string, number>;\n propertyKeys: Set<string>;\n bounds?: [number, number, number, number];\n};\n\nfunction createGisSummary(summary: GisSummary): HTMLElement {\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-gis-summary\";\n appendSummaryItem(bar, \"要素\", String(summary.features));\n appendSummaryItem(bar, \"几何\", formatGeometryCounts(summary.geometryCounts));\n appendSummaryItem(bar, \"属性字段\", String(summary.propertyKeys.size));\n if (summary.propertyKeys.size > 0) {\n appendSummaryItem(bar, \"字段预览\", [...summary.propertyKeys].slice(0, 8).join(\", \"));\n }\n if (summary.bounds) {\n appendSummaryItem(bar, \"范围\", formatBounds(summary.bounds));\n }\n return bar;\n}\n\nfunction createEmptyMapState(): HTMLElement {\n const empty = document.createElement(\"div\");\n empty.className = \"ofv-map-empty\";\n const title = document.createElement(\"strong\");\n title.textContent = \"暂无可展示的地图要素\";\n const detail = document.createElement(\"span\");\n detail.textContent = \"GeoJSON 已识别,但 features 为空。\";\n empty.append(title, detail);\n return empty;\n}\n\nfunction createMapLegend(summary: GisSummary): HTMLElement {\n const legend = document.createElement(\"div\");\n legend.className = \"ofv-map-legend\";\n const title = document.createElement(\"strong\");\n title.textContent = \"GeoJSON\";\n const detail = document.createElement(\"span\");\n detail.textContent = `${summary.features} 个要素 · ${formatGeometryCounts(summary.geometryCounts)}`;\n legend.append(title, detail);\n return legend;\n}\n\nfunction appendSummaryItem(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction summarizeGeoJson(geojson: any): GisSummary {\n const summary: GisSummary = {\n features: 0,\n geometryCounts: new Map(),\n propertyKeys: new Set()\n };\n for (const feature of collectFeatures(geojson)) {\n summary.features++;\n if (feature.properties && typeof feature.properties === \"object\") {\n Object.keys(feature.properties).forEach((key) => summary.propertyKeys.add(key));\n }\n summarizeGeometry(feature.geometry, summary);\n }\n return summary;\n}\n\nfunction collectFeatures(value: any): any[] {\n if (!value) {\n return [];\n }\n if (value.type === \"FeatureCollection\" && Array.isArray(value.features)) {\n return value.features;\n }\n if (value.type === \"Feature\") {\n return [value];\n }\n if (value.type && value.coordinates) {\n return [{ type: \"Feature\", properties: {}, geometry: value }];\n }\n return [];\n}\n\nfunction summarizeGeometry(geometry: any, summary: GisSummary): void {\n if (!geometry) {\n summary.geometryCounts.set(\"None\", (summary.geometryCounts.get(\"None\") || 0) + 1);\n return;\n }\n const type = String(geometry.type || \"Unknown\");\n summary.geometryCounts.set(type, (summary.geometryCounts.get(type) || 0) + 1);\n if (type === \"GeometryCollection\" && Array.isArray(geometry.geometries)) {\n for (const child of geometry.geometries) {\n summarizeGeometry(child, summary);\n }\n return;\n }\n updateBounds(summary, geometry.coordinates);\n}\n\nfunction updateBounds(summary: GisSummary, coordinates: unknown): void {\n if (!Array.isArray(coordinates)) {\n return;\n }\n if (typeof coordinates[0] === \"number\" && typeof coordinates[1] === \"number\") {\n const lon = coordinates[0];\n const lat = coordinates[1];\n if (!Number.isFinite(lon) || !Number.isFinite(lat)) {\n return;\n }\n const bounds = summary.bounds || [lon, lat, lon, lat];\n bounds[0] = Math.min(bounds[0], lon);\n bounds[1] = Math.min(bounds[1], lat);\n bounds[2] = Math.max(bounds[2], lon);\n bounds[3] = Math.max(bounds[3], lat);\n summary.bounds = bounds;\n return;\n }\n for (const item of coordinates) {\n updateBounds(summary, item);\n }\n}\n\nfunction formatGeometryCounts(counts: Map<string, number>): string {\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([type, count]) => `${type} ${count}`)\n .join(\", \") || \"无\";\n}\n\nfunction formatBounds(bounds: [number, number, number, number]): string {\n return bounds.map((value) => Number(value.toFixed(5))).join(\", \");\n}\n\nasync function parseToGeoJson(\n file: PreviewFile,\n buffer: ArrayBuffer,\n togeojsonLib: any,\n topojsonClient: any,\n shpLib: any,\n JSZipLib: any\n): Promise<any> {\n const ext = resolveFormat(file, gisMimeFormatMap).toLowerCase();\n\n if (ext === \"geojson\") {\n const text = new TextDecoder().decode(buffer);\n return JSON.parse(text);\n }\n\n if (ext === \"topojson\") {\n const text = new TextDecoder().decode(buffer);\n const topology = JSON.parse(text);\n const geojsonFeatures: any[] = [];\n for (const key of Object.keys(topology.objects)) {\n const feature = topojsonClient.feature(topology, topology.objects[key]);\n if (feature.type === \"FeatureCollection\") {\n geojsonFeatures.push(...feature.features);\n } else {\n geojsonFeatures.push(feature);\n }\n }\n return {\n type: \"FeatureCollection\",\n features: geojsonFeatures\n };\n }\n\n if (ext === \"kml\") {\n const text = new TextDecoder().decode(buffer);\n const dom = new DOMParser().parseFromString(text, \"text/xml\");\n return togeojsonLib.kml(dom);\n }\n\n if (ext === \"gpx\") {\n const text = new TextDecoder().decode(buffer);\n const dom = new DOMParser().parseFromString(text, \"text/xml\");\n return togeojsonLib.gpx(dom);\n }\n\n if (ext === \"kmz\") {\n const zip = await JSZipLib.loadAsync(buffer);\n const kmlFile: any = Object.values(zip.files).find((f: any) => f.name.toLowerCase().endsWith(\".kml\"));\n if (!kmlFile) {\n throw new Error(\"No KML file found inside KMZ archive.\");\n }\n const kmlText = await kmlFile.async(\"text\");\n const dom = new DOMParser().parseFromString(kmlText, \"text/xml\");\n return togeojsonLib.kml(dom);\n }\n\n if (ext === \"shp\") {\n const u8 = new Uint8Array(buffer);\n const isZip = u8[0] === 0x50 && u8[1] === 0x4b && u8[2] === 0x03 && u8[3] === 0x04;\n if (!isZip) {\n return null; // Signals raw shapefile\n }\n const parsed = await shpLib(buffer);\n if (Array.isArray(parsed)) {\n const features: any[] = [];\n for (const item of parsed) {\n if (item.type === \"FeatureCollection\") {\n features.push(...item.features);\n } else if (item.type === \"Feature\") {\n features.push(item);\n }\n }\n return {\n type: \"FeatureCollection\",\n features\n };\n }\n return parsed;\n }\n\n // Mime type match fallback\n try {\n const text = new TextDecoder().decode(buffer);\n return JSON.parse(text);\n } catch {\n throw new Error(`Unsupported GIS format: ${ext}`);\n }\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\nimport { appendMeta, createPanel, createSection, readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst assetExtensions = new Set([\n \"ttf\",\n \"otf\",\n \"woff\",\n \"woff2\",\n \"eot\",\n \"psd\",\n \"psb\",\n \"ai\",\n \"eps\",\n \"ps\",\n \"webarchive\",\n \"sqlite\",\n \"sqlite3\",\n \"db\",\n \"wasm\",\n \"parquet\",\n \"avro\"\n]);\n\nconst assetMimeFormatMap: Record<string, string> = {\n \"font/ttf\": \"ttf\",\n \"font/otf\": \"otf\",\n \"font/woff\": \"woff\",\n \"font/woff2\": \"woff2\",\n \"application/vnd.ms-fontobject\": \"eot\",\n \"image/vnd.adobe.photoshop\": \"psd\",\n \"application/postscript\": \"ps\",\n \"application/x-webarchive\": \"webarchive\",\n \"application/vnd.sqlite3\": \"sqlite\",\n \"application/x-sqlite3\": \"sqlite\",\n \"application/wasm\": \"wasm\",\n \"application/vnd.apache.parquet\": \"parquet\",\n \"application/avro\": \"avro\"\n};\n\nconst assetMimeTypes = new Set(Object.keys(assetMimeFormatMap));\n\nexport function assetPlugin(): PreviewPlugin {\n return {\n name: \"asset\",\n match(file) {\n return assetExtensions.has(file.extension) || assetMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-asset\");\n ctx.viewport.append(panel);\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const extension = resolveFormat(ctx.file, assetMimeFormatMap).toLowerCase();\n const bytes = new Uint8Array(await readArrayBuffer(ctx.file).catch(() => new ArrayBuffer(0)));\n\n const section = createSection(assetTitle(extension));\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-asset-summary\";\n appendMeta(summary, \"文件\", ctx.file.name);\n appendMeta(summary, \"格式\", extension ? `.${extension}` : ctx.file.mimeType || \"未知\");\n appendMeta(summary, \"大小\", formatBytes(ctx.file.size ?? bytes.byteLength));\n appendMeta(summary, \"签名\", byteSignature(bytes));\n\n const note = document.createElement(\"p\");\n note.textContent = assetGuidance(extension);\n\n const download = document.createElement(\"a\");\n download.className = \"ofv-asset-download\";\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n\n section.append(summary, note, download);\n if (isFontAsset(extension)) {\n section.append(await createFontPreview(extension, url, ctx.file.name, bytes));\n }\n if (extension === \"wasm\") {\n section.append(createWasmPreview(bytes));\n }\n if (extension === \"psd\" || extension === \"psb\") {\n section.append(createPhotoshopPreview(bytes));\n }\n if (extension === \"sqlite\" || extension === \"sqlite3\" || extension === \"db\") {\n section.append(createSqlitePreview(bytes));\n }\n if (extension === \"parquet\") {\n section.append(createParquetPreview(bytes));\n }\n if (extension === \"avro\") {\n section.append(createAvroPreview(bytes));\n }\n if (extension === \"webarchive\") {\n section.append(createWebArchivePreview(bytes));\n }\n if (extension === \"ai\" || extension === \"eps\" || extension === \"ps\") {\n section.append(createPostScriptPreview(bytes));\n }\n const preview = createHexPreview(bytes);\n if (preview) {\n section.append(preview);\n }\n panel.append(section);\n\n return {\n destroy() {\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction assetTitle(extension: string): string {\n if (isFontAsset(extension)) {\n return \"字体文件预览\";\n }\n if ([\"psd\", \"psb\", \"ai\", \"eps\", \"ps\"].includes(extension)) {\n return \"设计文件预览\";\n }\n if ([\"sqlite\", \"sqlite3\", \"db\", \"parquet\", \"avro\"].includes(extension)) {\n return \"数据文件预览\";\n }\n if (extension === \"wasm\") {\n return \"WebAssembly 文件预览\";\n }\n if (extension === \"webarchive\") {\n return \"网页归档预览\";\n }\n return \"资产文件预览\";\n}\n\nfunction assetGuidance(extension: string): string {\n if (isFontAsset(extension)) {\n return \"字体文件已识别,当前会使用 FontFace 展示字形样张,并解析 sfnt/WOFF 表目录和 name 元信息。\";\n }\n if (extension === \"psd\" || extension === \"psb\") {\n return \"PSD/PSB 已识别,当前会解析基础画布、通道、位深和颜色模式;图层缩略图可后续接入 psd.js/WASM 或服务端转换。\";\n }\n if ([\"ai\", \"eps\", \"ps\"].includes(extension)) {\n return \"PostScript/Illustrator 文件已识别,当前会解析文档头、BoundingBox 和常见 DSC 元信息;高保真图形可后续接入 Ghostscript/Illustrator 转换。\";\n }\n if ([\"sqlite\", \"sqlite3\", \"db\"].includes(extension)) {\n return \"SQLite 数据库已识别,当前会解析数据库头和 sqlite_schema 摘要;抽样数据可后续接入 sqlite-wasm 增强。\";\n }\n if (extension === \"parquet\" || extension === \"avro\") {\n return \"列式/序列化数据文件已识别,当前会解析容器头、元信息和 schema 摘要;抽样记录可后续接入专用解析器增强。\";\n }\n if (extension === \"wasm\") {\n return \"WASM 模块已识别,当前会解析版本、section 分布、imports、exports 和自定义 section 摘要。\";\n }\n if (extension === \"webarchive\") {\n return \"WebArchive 已识别,当前会解析 XML plist 主资源、MIME、编码和子资源数量;完整网页还原可后续接入资源包转换。\";\n }\n return \"该资产文件已识别,当前提供文件指纹和下载入口,后续可接入专用解析器增强。\";\n}\n\nfunction isFontAsset(extension: string): boolean {\n return [\"ttf\", \"otf\", \"woff\", \"woff2\", \"eot\"].includes(extension);\n}\n\nasync function createFontPreview(extension: string, url: string, fileName: string, bytes: Uint8Array): Promise<HTMLElement> {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-font-preview\";\n\n const heading = document.createElement(\"strong\");\n heading.textContent = \"字体样张\";\n\n const sample = document.createElement(\"div\");\n sample.className = \"ofv-font-sample\";\n sample.textContent = \"Open File Viewer 预览 1234567890\";\n\n const pangram = document.createElement(\"div\");\n pangram.className = \"ofv-font-pangram\";\n pangram.textContent = \"The quick brown fox jumps over the lazy dog.\";\n\n const meta = document.createElement(\"span\");\n meta.className = \"ofv-font-status\";\n\n preview.append(heading, sample, pangram, meta);\n\n if (!(\"FontFace\" in window) || !document.fonts) {\n meta.textContent = \"当前浏览器不支持 FontFace API,无法生成实时字形样张。\";\n preview.append(createFontInfoPreview(bytes, extension));\n return preview;\n }\n\n const family = `ofv-${fileName.replace(/[^a-z0-9_-]/gi, \"-\")}-${Date.now()}`;\n const format = fontFaceFormat(extension);\n const source = format ? `url(\"${url}\") format(\"${format}\")` : `url(\"${url}\")`;\n\n try {\n const fontFace = new FontFace(family, source);\n const loaded = await fontFace.load();\n document.fonts.add(loaded);\n sample.style.fontFamily = `\"${family}\", sans-serif`;\n pangram.style.fontFamily = `\"${family}\", sans-serif`;\n meta.textContent = \"已使用浏览器 FontFace API 加载字体样张。\";\n } catch (error) {\n meta.textContent = `字体样张加载失败:${error instanceof Error ? error.message : \"当前字体编码暂不受浏览器支持。\"}`;\n }\n\n preview.append(createFontInfoPreview(bytes, extension));\n return preview;\n}\n\nfunction fontFaceFormat(extension: string): string {\n const map: Record<string, string> = {\n ttf: \"truetype\",\n otf: \"opentype\",\n woff: \"woff\",\n woff2: \"woff2\",\n eot: \"embedded-opentype\"\n };\n return map[extension] || \"\";\n}\n\ntype FontTableEntry = {\n tag: string;\n checksum?: number;\n offset: number;\n length: number;\n compressedLength?: number;\n};\n\ntype FontNameRecord = {\n id: number;\n label: string;\n value: string;\n};\n\ntype FontContainerMeta = {\n label: string;\n value: string | number;\n};\n\ntype FontInfo = {\n valid: boolean;\n error?: string;\n container?: string;\n flavor?: string;\n tables: FontTableEntry[];\n names: FontNameRecord[];\n totalSfntSize?: number;\n meta?: FontContainerMeta[];\n};\n\nfunction createFontInfoPreview(bytes: Uint8Array, extension: string): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-font-info\";\n\n const heading = document.createElement(\"strong\");\n heading.textContent = \"字体结构\";\n wrapper.append(heading);\n\n const parsed = parseFontInfo(bytes, extension);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"无法解析字体结构。\";\n wrapper.append(error);\n return wrapper;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"容器\", parsed.container || \"sfnt\");\n appendMeta(summary, \"Flavor\", parsed.flavor || \"未知\");\n appendMeta(summary, \"表数量\", parsed.tables.length);\n if (parsed.totalSfntSize !== undefined) {\n appendMeta(summary, \"展开大小\", formatBytes(parsed.totalSfntSize));\n }\n for (const item of parsed.meta || []) {\n appendMeta(summary, item.label, item.value);\n }\n wrapper.append(summary);\n\n if (parsed.error) {\n const note = document.createElement(\"p\");\n note.className = \"ofv-data-note\";\n note.textContent = parsed.error;\n wrapper.append(note);\n }\n\n if (parsed.names.length > 0) {\n wrapper.append(createKeyValueTable(\"Name\", parsed.names.map((item) => ({ key: item.label, value: item.value }))));\n }\n\n if (parsed.tables.length > 0) {\n wrapper.append(createFontTablePreview(parsed.tables));\n }\n return wrapper;\n}\n\nfunction createFontTablePreview(tables: FontTableEntry[]): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-font-tables\";\n const title = document.createElement(\"strong\");\n title.textContent = \"Tables\";\n\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const headRow = document.createElement(\"tr\");\n for (const label of [\"Tag\", \"Offset\", \"Length\", \"Compressed\", \"Checksum\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n headRow.append(th);\n }\n thead.append(headRow);\n\n const tbody = document.createElement(\"tbody\");\n for (const entry of tables.slice(0, 80)) {\n const row = document.createElement(\"tr\");\n for (const value of [\n entry.tag,\n `0x${entry.offset.toString(16).toUpperCase()}`,\n formatBytes(entry.length),\n entry.compressedLength === undefined ? \"-\" : formatBytes(entry.compressedLength),\n entry.checksum === undefined ? \"-\" : `0x${entry.checksum.toString(16).padStart(8, \"0\").toUpperCase()}`\n ]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n row.append(cell);\n }\n tbody.append(row);\n }\n table.append(thead, tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\nfunction parseFontInfo(bytes: Uint8Array, extension: string): FontInfo {\n if (bytes.length < 4) {\n return { valid: false, error: \"文件太短,无法读取字体头。\", tables: [], names: [] };\n }\n const signature = asciiAt(bytes, 0, 4);\n if (signature === \"wOFF\") {\n return parseWoffFont(bytes);\n }\n if (signature === \"wOF2\") {\n return parseWoff2Font(bytes);\n }\n if (extension === \"eot\") {\n return parseEotFont(bytes);\n }\n return parseSfntFont(bytes, 0, \"sfnt\");\n}\n\nfunction parseSfntFont(bytes: Uint8Array, offset: number, container: string): FontInfo {\n if (offset + 12 > bytes.length) {\n return { valid: false, error: \"文件太短,无法读取 sfnt offset table。\", tables: [], names: [] };\n }\n const flavor = fontFlavor(bytes, offset);\n if (!flavor) {\n return { valid: false, error: \"缺少有效的 TrueType/OpenType sfnt 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const tableCount = view.getUint16(offset + 4, false);\n const directoryEnd = offset + 12 + tableCount * 16;\n if (tableCount <= 0 || directoryEnd > bytes.length) {\n return { valid: false, error: \"sfnt 表目录超出文件边界。\", tables: [], names: [] };\n }\n const tables: FontTableEntry[] = [];\n for (let index = 0; index < tableCount; index++) {\n const entryOffset = offset + 12 + index * 16;\n tables.push({\n tag: asciiAt(bytes, entryOffset, 4),\n checksum: view.getUint32(entryOffset + 4, false),\n offset: view.getUint32(entryOffset + 8, false),\n length: view.getUint32(entryOffset + 12, false)\n });\n }\n return {\n valid: true,\n container,\n flavor,\n tables,\n names: parseFontNameTable(bytes, tables.find((table) => table.tag === \"name\"))\n };\n}\n\nfunction parseWoffFont(bytes: Uint8Array): FontInfo {\n if (bytes.length < 44) {\n return { valid: false, error: \"文件太短,无法读取 WOFF 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const tableCount = view.getUint16(12, false);\n const directoryEnd = 44 + tableCount * 20;\n if (tableCount <= 0 || directoryEnd > bytes.length) {\n return { valid: false, error: \"WOFF 表目录超出文件边界。\", tables: [], names: [] };\n }\n const tables: FontTableEntry[] = [];\n for (let index = 0; index < tableCount; index++) {\n const entryOffset = 44 + index * 20;\n tables.push({\n tag: asciiAt(bytes, entryOffset, 4),\n offset: view.getUint32(entryOffset + 4, false),\n compressedLength: view.getUint32(entryOffset + 8, false),\n length: view.getUint32(entryOffset + 12, false),\n checksum: view.getUint32(entryOffset + 16, false)\n });\n }\n return {\n valid: true,\n container: \"WOFF\",\n flavor: fontFlavor(bytes, 4) || asciiAt(bytes, 4, 4),\n tables,\n names: parseFontNameTable(bytes, tables.find((table) => table.tag === \"name\" && table.compressedLength === table.length)),\n totalSfntSize: view.getUint32(16, false)\n };\n}\n\nfunction parseWoff2Font(bytes: Uint8Array): FontInfo {\n if (bytes.length < 48) {\n return { valid: false, error: \"文件太短,无法读取 WOFF2 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const tableCount = view.getUint16(12, false);\n let offset = 48;\n const tables: FontTableEntry[] = [];\n for (let index = 0; index < tableCount; index++) {\n if (offset >= bytes.length) {\n return { valid: false, error: \"WOFF2 表目录超出文件边界。\", tables: [], names: [] };\n }\n const flags = bytes[offset++];\n const knownTag = flags & 0x3f;\n let tag = woff2KnownTableTag(knownTag);\n if (knownTag === 0x3f) {\n if (offset + 4 > bytes.length) {\n return { valid: false, error: \"WOFF2 自定义表 tag 超出文件边界。\", tables: [], names: [] };\n }\n tag = asciiAt(bytes, offset, 4);\n offset += 4;\n }\n const originalLength = read255UInt16(bytes, offset);\n if (!originalLength) {\n return { valid: false, error: \"WOFF2 表目录长度字段不完整。\", tables: [], names: [] };\n }\n offset = originalLength.offset;\n let transformedLength: number | undefined;\n const hasTransform = (flags & 0xc0) !== 0 || (tag === \"glyf\" && (flags & 0xc0) !== 0) || (tag === \"loca\" && (flags & 0xc0) !== 0);\n if (hasTransform && tag !== \"loca\") {\n const transformed = read255UInt16(bytes, offset);\n if (!transformed) {\n return { valid: false, error: \"WOFF2 transformLength 字段不完整。\", tables: [], names: [] };\n }\n transformedLength = transformed.value;\n offset = transformed.offset;\n }\n tables.push({\n tag,\n offset: 0,\n length: originalLength.value,\n compressedLength: transformedLength\n });\n }\n return {\n valid: true,\n container: \"WOFF2\",\n flavor: fontFlavor(bytes, 4) || asciiAt(bytes, 4, 4),\n tables,\n names: [],\n totalSfntSize: view.getUint32(16, false),\n meta: [\n { label: \"压缩数据\", value: formatBytes(view.getUint32(20, false)) },\n { label: \"Meta\", value: view.getUint32(32, false) > 0 ? `${formatBytes(view.getUint32(36, false))} @ 0x${view.getUint32(32, false).toString(16).toUpperCase()}` : \"无\" },\n { label: \"Private\", value: view.getUint32(40, false) > 0 ? `${formatBytes(view.getUint32(44, false))} @ 0x${view.getUint32(40, false).toString(16).toUpperCase()}` : \"无\" }\n ],\n error: \"WOFF2 已解析容器头和压缩表目录;name 表内容需 Brotli 解压后才能展开。\"\n };\n}\n\nfunction parseEotFont(bytes: Uint8Array): FontInfo {\n if (bytes.length < 82) {\n return { valid: false, error: \"文件太短,无法读取 EOT 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const eotSize = view.getUint32(0, true);\n const fontDataSize = view.getUint32(4, true);\n const version = view.getUint32(8, true);\n const flags = view.getUint32(12, true);\n const panose = Array.from(bytes.slice(16, 26)).map((item) => item.toString(16).padStart(2, \"0\")).join(\" \");\n const charset = bytes[26];\n const italic = bytes[27];\n const weight = view.getUint32(28, true);\n let offset = 68;\n const names: FontNameRecord[] = [];\n const fields: Array<{ id: number; label: string; padded: boolean }> = [\n { id: 1, label: \"Family\", padded: true },\n { id: 2, label: \"Subfamily\", padded: true },\n { id: 5, label: \"Version\", padded: true },\n { id: 4, label: \"Full name\", padded: true },\n { id: 0, label: \"Root strings\", padded: false }\n ];\n for (const field of fields) {\n const fieldValue = readEotStringField(bytes, offset, field.padded);\n if (!fieldValue) {\n break;\n }\n offset = fieldValue.offset;\n if (field.id > 0 && fieldValue.value) {\n names.push({ id: field.id, label: field.label, value: fieldValue.value });\n }\n }\n if (offset + 4 <= bytes.length) {\n offset += 4;\n }\n const sfntOffset = findEmbeddedSfntOffset(bytes, offset);\n const embedded = sfntOffset === undefined ? undefined : parseSfntFont(bytes, sfntOffset, \"EOT embedded sfnt\");\n return {\n valid: true,\n container: \"EOT\",\n flavor: embedded?.valid ? embedded.flavor : \"Embedded OpenType\",\n tables: embedded?.valid ? embedded.tables : [],\n names: embedded?.valid && embedded.names.length > 0 ? embedded.names : names,\n totalSfntSize: fontDataSize || undefined,\n meta: [\n { label: \"EOT 大小\", value: eotSize ? formatBytes(eotSize) : \"未声明\" },\n { label: \"版本\", value: `0x${version.toString(16).toUpperCase()}` },\n { label: \"Flags\", value: `0x${flags.toString(16).toUpperCase()}` },\n { label: \"Weight\", value: weight || \"未声明\" },\n { label: \"Italic\", value: italic ? \"是\" : \"否\" },\n { label: \"Charset\", value: charset },\n { label: \"PANOSE\", value: panose },\n { label: \"sfnt 偏移\", value: sfntOffset === undefined ? \"未找到\" : `0x${sfntOffset.toString(16).toUpperCase()}` }\n ],\n error: embedded?.valid ? undefined : \"已解析 EOT 容器头和名称字段,但未找到可展开的内嵌 sfnt 表目录。\"\n };\n}\n\nfunction readEotStringField(bytes: Uint8Array, offset: number, padded: boolean): { value: string; offset: number } | undefined {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n if (padded) {\n if (offset + 2 > bytes.length) {\n return undefined;\n }\n offset += 2;\n }\n if (offset + 2 > bytes.length) {\n return undefined;\n }\n const length = view.getUint16(offset, true);\n offset += 2;\n if (offset + length > bytes.length) {\n return undefined;\n }\n const value = length > 0 ? decodeEotString(bytes.slice(offset, offset + length)) : \"\";\n return { value, offset: offset + length };\n}\n\nfunction woff2KnownTableTag(index: number): string {\n const tags = [\n \"cmap\",\n \"head\",\n \"hhea\",\n \"hmtx\",\n \"maxp\",\n \"name\",\n \"OS/2\",\n \"post\",\n \"cvt \",\n \"fpgm\",\n \"glyf\",\n \"loca\",\n \"prep\",\n \"CFF \",\n \"VORG\",\n \"EBDT\",\n \"EBLC\",\n \"gasp\",\n \"hdmx\",\n \"kern\",\n \"LTSH\",\n \"PCLT\",\n \"VDMX\",\n \"vhea\",\n \"vmtx\",\n \"BASE\",\n \"GDEF\",\n \"GPOS\",\n \"GSUB\",\n \"EBSC\",\n \"JSTF\",\n \"MATH\",\n \"CBDT\",\n \"CBLC\",\n \"COLR\",\n \"CPAL\",\n \"SVG \",\n \"sbix\",\n \"acnt\",\n \"avar\",\n \"bdat\",\n \"bloc\",\n \"bsln\",\n \"cvar\",\n \"fdsc\",\n \"feat\",\n \"fmtx\",\n \"fvar\",\n \"gvar\",\n \"hsty\",\n \"just\",\n \"lcar\",\n \"mort\",\n \"morx\",\n \"opbd\",\n \"prop\",\n \"trak\",\n \"Zapf\",\n \"Silf\",\n \"Glat\",\n \"Gloc\",\n \"Feat\",\n \"Sill\"\n ];\n return tags[index] || `table-${index}`;\n}\n\nfunction read255UInt16(bytes: Uint8Array, offset: number): { value: number; offset: number } | undefined {\n if (offset >= bytes.length) {\n return undefined;\n }\n const code = bytes[offset++];\n if (code === 253) {\n if (offset + 2 > bytes.length) {\n return undefined;\n }\n return { value: (bytes[offset] << 8) | bytes[offset + 1], offset: offset + 2 };\n }\n if (code === 254) {\n if (offset >= bytes.length) {\n return undefined;\n }\n return { value: bytes[offset] + 506, offset: offset + 1 };\n }\n if (code === 255) {\n if (offset >= bytes.length) {\n return undefined;\n }\n return { value: bytes[offset] + 253, offset: offset + 1 };\n }\n return { value: code, offset };\n}\n\nfunction decodeEotString(bytes: Uint8Array): string {\n const text = decodeUtf16Le(bytes).replace(/\\0+$/g, \"\").trim();\n return text || new TextDecoder(\"latin1\").decode(bytes).replace(/\\0+$/g, \"\").trim();\n}\n\nfunction decodeUtf16Le(bytes: Uint8Array): string {\n let value = \"\";\n for (let index = 0; index + 1 < bytes.length; index += 2) {\n value += String.fromCharCode(bytes[index] | (bytes[index + 1] << 8));\n }\n return value;\n}\n\nfunction findEmbeddedSfntOffset(bytes: Uint8Array, start: number): number | undefined {\n for (let offset = Math.max(0, start); offset + 12 <= bytes.length; offset++) {\n const flavor = fontFlavor(bytes, offset);\n if (!flavor) {\n continue;\n }\n const tableCount = (bytes[offset + 4] << 8) | bytes[offset + 5];\n const directoryEnd = offset + 12 + tableCount * 16;\n if (tableCount > 0 && directoryEnd <= bytes.length) {\n return offset;\n }\n }\n return undefined;\n}\n\nfunction fontFlavor(bytes: Uint8Array, offset: number): string | undefined {\n if (offset + 4 > bytes.length) {\n return undefined;\n }\n const ascii = asciiAt(bytes, offset, 4);\n if (ascii === \"OTTO\") {\n return \"OpenType/CFF\";\n }\n if (ascii === \"true\") {\n return \"Apple TrueType\";\n }\n if (ascii === \"typ1\") {\n return \"Type 1 sfnt\";\n }\n if (bytes[offset] === 0x00 && bytes[offset + 1] === 0x01 && bytes[offset + 2] === 0x00 && bytes[offset + 3] === 0x00) {\n return \"TrueType\";\n }\n return undefined;\n}\n\nfunction parseFontNameTable(bytes: Uint8Array, table?: FontTableEntry): FontNameRecord[] {\n if (!table || table.offset + table.length > bytes.length || table.length < 6) {\n return [];\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const offset = table.offset;\n const count = view.getUint16(offset + 2, false);\n const storageOffset = view.getUint16(offset + 4, false);\n const recordsEnd = offset + 6 + count * 12;\n if (recordsEnd > bytes.length || storageOffset > table.length) {\n return [];\n }\n const wanted = new Map<number, string>([\n [1, \"Family\"],\n [2, \"Subfamily\"],\n [4, \"Full name\"],\n [5, \"Version\"],\n [6, \"PostScript name\"],\n [8, \"Manufacturer\"],\n [13, \"License\"],\n [16, \"Typographic family\"],\n [17, \"Typographic subfamily\"]\n ]);\n const names = new Map<number, FontNameRecord>();\n for (let index = 0; index < count; index++) {\n const recordOffset = offset + 6 + index * 12;\n const platformId = view.getUint16(recordOffset, false);\n const encodingId = view.getUint16(recordOffset + 2, false);\n const languageId = view.getUint16(recordOffset + 4, false);\n const nameId = view.getUint16(recordOffset + 6, false);\n const length = view.getUint16(recordOffset + 8, false);\n const stringOffset = view.getUint16(recordOffset + 10, false);\n const label = wanted.get(nameId);\n if (!label || names.has(nameId)) {\n continue;\n }\n const start = offset + storageOffset + stringOffset;\n const end = start + length;\n if (end > bytes.length || end > offset + table.length) {\n continue;\n }\n const value = decodeFontName(bytes.slice(start, end), platformId, encodingId).trim();\n if (value) {\n names.set(nameId, { id: nameId, label: languageId ? `${label} (${languageId.toString(16).toUpperCase()})` : label, value });\n }\n }\n return [...names.values()];\n}\n\nfunction decodeFontName(bytes: Uint8Array, platformId: number, encodingId: number): string {\n if (platformId === 0 || platformId === 3 || (platformId === 2 && encodingId === 1)) {\n return decodeUtf16Be(bytes);\n }\n return new TextDecoder(\"latin1\").decode(bytes);\n}\n\nfunction decodeUtf16Be(bytes: Uint8Array): string {\n let value = \"\";\n for (let index = 0; index + 1 < bytes.length; index += 2) {\n value += String.fromCharCode((bytes[index] << 8) | bytes[index + 1]);\n }\n return value;\n}\n\ntype WasmSection = {\n id: number;\n name: string;\n size: number;\n offset: number;\n customName?: string;\n};\n\ntype WasmImport = {\n module: string;\n name: string;\n kind: string;\n};\n\ntype WasmExport = {\n name: string;\n kind: string;\n index: number;\n};\n\ntype WasmPreview = {\n valid: boolean;\n version?: number;\n error?: string;\n sections: WasmSection[];\n imports: WasmImport[];\n exports: WasmExport[];\n};\n\nfunction createWasmPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-wasm-preview\";\n const parsed = parseWasm(bytes);\n\n const heading = document.createElement(\"strong\");\n heading.textContent = \"WASM 结构\";\n preview.append(heading);\n\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-wasm-error\";\n error.textContent = parsed.error || \"不是有效的 WebAssembly 二进制模块。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-wasm-summary\";\n appendMeta(summary, \"版本\", parsed.version ?? \"未知\");\n appendMeta(summary, \"Sections\", parsed.sections.length);\n appendMeta(summary, \"Imports\", parsed.imports.length);\n appendMeta(summary, \"Exports\", parsed.exports.length);\n preview.append(summary);\n\n preview.append(createWasmSectionTable(parsed.sections));\n if (parsed.imports.length > 0) {\n preview.append(createWasmList(\"导入\", parsed.imports.map((item) => `${item.module}.${item.name} · ${item.kind}`)));\n }\n if (parsed.exports.length > 0) {\n preview.append(createWasmList(\"导出\", parsed.exports.map((item) => `${item.name} · ${item.kind} #${item.index}`)));\n }\n\n return preview;\n}\n\nfunction createWasmSectionTable(sections: WasmSection[]): HTMLElement {\n const table = document.createElement(\"table\");\n table.className = \"ofv-wasm-sections\";\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"Section\", \"大小\", \"偏移\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const section of sections.slice(0, 80)) {\n const row = document.createElement(\"tr\");\n const name = document.createElement(\"td\");\n name.textContent = section.customName ? `${section.name} (${section.customName})` : section.name;\n const size = document.createElement(\"td\");\n size.textContent = formatBytes(section.size);\n const offset = document.createElement(\"td\");\n offset.textContent = `0x${section.offset.toString(16).toUpperCase()}`;\n row.append(name, size, offset);\n tbody.append(row);\n }\n table.append(thead, tbody);\n return table;\n}\n\nfunction createWasmList(titleText: string, rows: string[]): HTMLElement {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-wasm-list\";\n details.open = true;\n const summary = document.createElement(\"summary\");\n summary.textContent = `${titleText} ${rows.length}`;\n const list = document.createElement(\"ul\");\n for (const row of rows.slice(0, 120)) {\n const item = document.createElement(\"li\");\n item.textContent = row;\n list.append(item);\n }\n if (rows.length > 120) {\n const item = document.createElement(\"li\");\n item.textContent = `还有 ${rows.length - 120} 项未展示。`;\n list.append(item);\n }\n details.append(summary, list);\n return details;\n}\n\nfunction parseWasm(bytes: Uint8Array): WasmPreview {\n if (bytes.length < 8 || bytes[0] !== 0x00 || bytes[1] !== 0x61 || bytes[2] !== 0x73 || bytes[3] !== 0x6d) {\n return { valid: false, error: \"缺少 WebAssembly magic header。\", sections: [], imports: [], exports: [] };\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const version = view.getUint32(4, true);\n const sections: WasmSection[] = [];\n const imports: WasmImport[] = [];\n const exports: WasmExport[] = [];\n let offset = 8;\n\n try {\n while (offset < bytes.length) {\n const sectionOffset = offset;\n const id = bytes[offset++];\n const sizeInfo = readVarUint(bytes, offset);\n offset = sizeInfo.offset;\n const payloadOffset = offset;\n const payloadEnd = payloadOffset + sizeInfo.value;\n if (payloadEnd > bytes.length) {\n throw new Error(\"section 长度超过文件边界。\");\n }\n\n const section: WasmSection = {\n id,\n name: wasmSectionName(id),\n size: sizeInfo.value,\n offset: sectionOffset\n };\n if (id === 0) {\n const customName = readWasmName(bytes, payloadOffset, payloadEnd);\n section.customName = customName.value || undefined;\n } else if (id === 2) {\n imports.push(...parseWasmImports(bytes, payloadOffset, payloadEnd));\n } else if (id === 7) {\n exports.push(...parseWasmExports(bytes, payloadOffset, payloadEnd));\n }\n sections.push(section);\n offset = payloadEnd;\n }\n } catch (error) {\n return {\n valid: false,\n version,\n error: error instanceof Error ? error.message : \"WASM section 解析失败。\",\n sections,\n imports,\n exports\n };\n }\n\n return { valid: true, version, sections, imports, exports };\n}\n\nfunction parseWasmImports(bytes: Uint8Array, offset: number, end: number): WasmImport[] {\n const imports: WasmImport[] = [];\n const count = readVarUint(bytes, offset);\n offset = count.offset;\n for (let index = 0; index < count.value && offset < end; index++) {\n const moduleName = readWasmName(bytes, offset, end);\n offset = moduleName.offset;\n const importName = readWasmName(bytes, offset, end);\n offset = importName.offset;\n const kind = bytes[offset++];\n offset = skipWasmImportDescriptor(bytes, offset, end, kind);\n imports.push({ module: moduleName.value, name: importName.value, kind: wasmExternalKind(kind) });\n }\n return imports;\n}\n\nfunction parseWasmExports(bytes: Uint8Array, offset: number, end: number): WasmExport[] {\n const exports: WasmExport[] = [];\n const count = readVarUint(bytes, offset);\n offset = count.offset;\n for (let index = 0; index < count.value && offset < end; index++) {\n const exportName = readWasmName(bytes, offset, end);\n offset = exportName.offset;\n const kind = bytes[offset++];\n const itemIndex = readVarUint(bytes, offset);\n offset = itemIndex.offset;\n exports.push({ name: exportName.value, kind: wasmExternalKind(kind), index: itemIndex.value });\n }\n return exports;\n}\n\nfunction skipWasmImportDescriptor(bytes: Uint8Array, offset: number, end: number, kind: number): number {\n if (kind === 0x00) {\n return readVarUint(bytes, offset).offset;\n }\n if (kind === 0x01) {\n const elementTypeOffset = offset + 1;\n return skipWasmLimits(bytes, elementTypeOffset, end);\n }\n if (kind === 0x02) {\n return skipWasmLimits(bytes, offset, end);\n }\n if (kind === 0x03) {\n return Math.min(end, offset + 2);\n }\n return offset;\n}\n\nfunction skipWasmLimits(bytes: Uint8Array, offset: number, end: number): number {\n const flags = bytes[offset++];\n offset = readVarUint(bytes, offset).offset;\n if ((flags & 0x01) === 0x01 && offset < end) {\n offset = readVarUint(bytes, offset).offset;\n }\n return offset;\n}\n\nfunction readVarUint(bytes: Uint8Array, offset: number): { value: number; offset: number } {\n let result = 0;\n let shift = 0;\n for (let index = 0; index < 5; index++) {\n if (offset >= bytes.length) {\n throw new Error(\"LEB128 数据不完整。\");\n }\n const byte = bytes[offset++];\n result |= (byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) {\n return { value: result >>> 0, offset };\n }\n shift += 7;\n }\n throw new Error(\"LEB128 数据过长。\");\n}\n\nfunction readWasmName(bytes: Uint8Array, offset: number, end: number): { value: string; offset: number } {\n const length = readVarUint(bytes, offset);\n offset = length.offset;\n const nameEnd = offset + length.value;\n if (nameEnd > end) {\n throw new Error(\"字符串长度超过 section 边界。\");\n }\n return { value: new TextDecoder().decode(bytes.slice(offset, nameEnd)), offset: nameEnd };\n}\n\nfunction wasmSectionName(id: number): string {\n const names: Record<number, string> = {\n 0: \"custom\",\n 1: \"type\",\n 2: \"import\",\n 3: \"function\",\n 4: \"table\",\n 5: \"memory\",\n 6: \"global\",\n 7: \"export\",\n 8: \"start\",\n 9: \"element\",\n 10: \"code\",\n 11: \"data\",\n 12: \"data-count\"\n };\n return names[id] || `unknown ${id}`;\n}\n\nfunction wasmExternalKind(kind: number): string {\n const names: Record<number, string> = {\n 0x00: \"function\",\n 0x01: \"table\",\n 0x02: \"memory\",\n 0x03: \"global\"\n };\n return names[kind] || `unknown ${kind}`;\n}\n\ntype PhotoshopHeader = {\n valid: boolean;\n error?: string;\n signature?: string;\n version?: number;\n channels?: number;\n width?: number;\n height?: number;\n depth?: number;\n colorMode?: number;\n};\n\nfunction createPhotoshopPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-psd-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"Photoshop 结构\";\n preview.append(heading);\n\n const header = parsePhotoshopHeader(bytes);\n if (!header.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-psd-error\";\n error.textContent = header.error || \"不是有效的 Photoshop 文档头。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-psd-summary\";\n appendMeta(summary, \"版本\", header.version === 2 ? \"PSB 大文档\" : \"PSD\");\n appendMeta(summary, \"画布\", `${header.width} x ${header.height}px`);\n appendMeta(summary, \"通道\", header.channels ?? \"未知\");\n appendMeta(summary, \"位深\", `${header.depth ?? \"未知\"} bit`);\n appendMeta(summary, \"颜色模式\", photoshopColorMode(header.colorMode ?? -1));\n preview.append(summary);\n\n return preview;\n}\n\nfunction parsePhotoshopHeader(bytes: Uint8Array): PhotoshopHeader {\n if (bytes.length < 26) {\n return { valid: false, error: \"文件太短,无法读取 PSD/PSB 头信息。\" };\n }\n const signature = new TextDecoder(\"ascii\").decode(bytes.slice(0, 4));\n if (signature !== \"8BPS\") {\n return { valid: false, signature, error: \"缺少 8BPS Photoshop 签名。\" };\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const version = view.getUint16(4, false);\n if (version !== 1 && version !== 2) {\n return { valid: false, signature, version, error: `未知 Photoshop 文件版本:${version}。` };\n }\n\n const reserved = bytes.slice(6, 12);\n if (reserved.some((byte) => byte !== 0)) {\n return { valid: false, signature, version, error: \"PSD/PSB 保留字段不为 0,文件头可能已损坏。\" };\n }\n\n return {\n valid: true,\n signature,\n version,\n channels: view.getUint16(12, false),\n height: view.getUint32(14, false),\n width: view.getUint32(18, false),\n depth: view.getUint16(22, false),\n colorMode: view.getUint16(24, false)\n };\n}\n\nfunction photoshopColorMode(mode: number): string {\n const modes: Record<number, string> = {\n 0: \"Bitmap\",\n 1: \"Grayscale\",\n 2: \"Indexed\",\n 3: \"RGB\",\n 4: \"CMYK\",\n 7: \"Multichannel\",\n 8: \"Duotone\",\n 9: \"Lab\"\n };\n return modes[mode] ? `${modes[mode]} (${mode})` : `未知 (${mode})`;\n}\n\ntype SqliteHeader = {\n valid: boolean;\n error?: string;\n pageSize?: number;\n writeVersion?: number;\n readVersion?: number;\n pageCount?: number;\n schemaVersion?: number;\n textEncoding?: number;\n userVersion?: number;\n};\n\ntype SqliteSchemaEntry = {\n type: string;\n name: string;\n tableName: string;\n rootPage: number;\n sql: string;\n};\n\nfunction createSqlitePreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-sqlite-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"SQLite 结构\";\n preview.append(heading);\n\n const header = parseSqliteHeader(bytes);\n if (!header.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-sqlite-error\";\n error.textContent = header.error || \"不是有效的 SQLite 数据库文件。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-sqlite-summary\";\n appendMeta(summary, \"页大小\", `${header.pageSize} B`);\n appendMeta(summary, \"页数\", header.pageCount ?? \"未知\");\n appendMeta(summary, \"读写版本\", `${sqliteJournalMode(header.readVersion)} / ${sqliteJournalMode(header.writeVersion)}`);\n appendMeta(summary, \"Schema\", header.schemaVersion ?? \"未知\");\n appendMeta(summary, \"编码\", sqliteEncoding(header.textEncoding));\n appendMeta(summary, \"User version\", header.userVersion ?? 0);\n preview.append(summary);\n\n const schema = parseSqliteSchema(bytes, header);\n if (schema.length > 0) {\n preview.append(createSqliteSchemaTable(schema));\n } else {\n const empty = document.createElement(\"p\");\n empty.className = \"ofv-sqlite-empty\";\n empty.textContent = \"未从第一页 sqlite_schema 叶子页提取到结构定义;复杂数据库可后续接入 sqlite-wasm 完整读取。\";\n preview.append(empty);\n }\n\n return preview;\n}\n\nfunction parseSqliteHeader(bytes: Uint8Array): SqliteHeader {\n if (bytes.length < 100) {\n return { valid: false, error: \"文件太短,无法读取 SQLite 数据库头。\" };\n }\n const signature = new TextDecoder(\"ascii\").decode(bytes.slice(0, 16));\n if (signature !== \"SQLite format 3\\0\") {\n return { valid: false, error: \"缺少 SQLite format 3 文件签名。\" };\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const rawPageSize = view.getUint16(16, false);\n const pageSize = rawPageSize === 1 ? 65536 : rawPageSize;\n if (pageSize < 512 || pageSize > 65536 || (pageSize & (pageSize - 1)) !== 0) {\n return { valid: false, error: `SQLite 页大小无效:${pageSize}。` };\n }\n\n return {\n valid: true,\n pageSize,\n writeVersion: bytes[18],\n readVersion: bytes[19],\n pageCount: view.getUint32(28, false),\n schemaVersion: view.getUint32(40, false),\n textEncoding: view.getUint32(56, false),\n userVersion: view.getUint32(60, false)\n };\n}\n\nfunction parseSqliteSchema(bytes: Uint8Array, header: SqliteHeader): SqliteSchemaEntry[] {\n const pageSize = header.pageSize || 0;\n if (pageSize <= 0 || bytes.length < Math.min(pageSize, 100)) {\n return [];\n }\n const pageStart = 0;\n const btreeStart = 100;\n if (bytes[btreeStart] !== 0x0d) {\n return [];\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const cellCount = view.getUint16(btreeStart + 3, false);\n const entries: SqliteSchemaEntry[] = [];\n for (let index = 0; index < Math.min(cellCount, 80); index++) {\n const pointerOffset = btreeStart + 8 + index * 2;\n if (pointerOffset + 2 > bytes.length) {\n break;\n }\n const cellOffset = pageStart + view.getUint16(pointerOffset, false);\n const entry = parseSqliteSchemaCell(bytes, cellOffset, pageStart + pageSize);\n if (entry) {\n entries.push(entry);\n }\n }\n return entries;\n}\n\nfunction parseSqliteSchemaCell(bytes: Uint8Array, offset: number, pageEnd: number): SqliteSchemaEntry | null {\n try {\n let cursor = offset;\n const payloadLength = readSqliteVarint(bytes, cursor);\n cursor = payloadLength.offset;\n const rowId = readSqliteVarint(bytes, cursor);\n cursor = rowId.offset;\n const payloadEnd = Math.min(pageEnd, cursor + Number(payloadLength.value));\n if (payloadEnd > bytes.length) {\n return null;\n }\n const record = parseSqliteRecord(bytes, cursor, payloadEnd);\n if (record.length < 5) {\n return null;\n }\n return {\n type: String(record[0] ?? \"\"),\n name: String(record[1] ?? \"\"),\n tableName: String(record[2] ?? \"\"),\n rootPage: Number(record[3] ?? 0),\n sql: String(record[4] ?? \"\")\n };\n } catch {\n return null;\n }\n}\n\nfunction parseSqliteRecord(bytes: Uint8Array, offset: number, end: number): Array<string | number | null> {\n const headerSize = readSqliteVarint(bytes, offset);\n let headerCursor = headerSize.offset;\n const bodyStart = offset + Number(headerSize.value);\n let bodyCursor = bodyStart;\n const serialTypes: bigint[] = [];\n while (headerCursor < bodyStart && headerCursor < end) {\n const serial = readSqliteVarint(bytes, headerCursor);\n serialTypes.push(serial.value);\n headerCursor = serial.offset;\n }\n return serialTypes.map((serialType) => {\n const value = readSqliteValue(bytes, bodyCursor, end, serialType);\n bodyCursor = value.offset;\n return value.value;\n });\n}\n\nfunction readSqliteValue(\n bytes: Uint8Array,\n offset: number,\n end: number,\n serialType: bigint\n): { value: string | number | null; offset: number } {\n const type = Number(serialType);\n if (type === 0) {\n return { value: null, offset };\n }\n if (type === 1) {\n return { value: signedInteger(bytes, offset, 1), offset: offset + 1 };\n }\n if (type === 2) {\n return { value: signedInteger(bytes, offset, 2), offset: offset + 2 };\n }\n if (type === 3) {\n return { value: signedInteger(bytes, offset, 3), offset: offset + 3 };\n }\n if (type === 4) {\n return { value: signedInteger(bytes, offset, 4), offset: offset + 4 };\n }\n if (type === 5) {\n return { value: signedInteger(bytes, offset, 6), offset: offset + 6 };\n }\n if (type === 6) {\n return { value: signedInteger(bytes, offset, 8), offset: offset + 8 };\n }\n if (type === 8) {\n return { value: 0, offset };\n }\n if (type === 9) {\n return { value: 1, offset };\n }\n if (type >= 12) {\n const length = Math.floor((type - 12) / 2);\n const valueEnd = Math.min(end, offset + length);\n if (type % 2 === 1) {\n return { value: new TextDecoder().decode(bytes.slice(offset, valueEnd)), offset: offset + length };\n }\n return { value: `<blob ${length} B>`, offset: offset + length };\n }\n return { value: null, offset };\n}\n\nfunction readSqliteVarint(bytes: Uint8Array, offset: number): { value: bigint; offset: number } {\n let value = 0n;\n for (let index = 0; index < 9; index++) {\n if (offset >= bytes.length) {\n throw new Error(\"SQLite varint 数据不完整。\");\n }\n const byte = bytes[offset++];\n if (index === 8) {\n value = (value << 8n) | BigInt(byte);\n return { value, offset };\n }\n value = (value << 7n) | BigInt(byte & 0x7f);\n if ((byte & 0x80) === 0) {\n return { value, offset };\n }\n }\n return { value, offset };\n}\n\nfunction signedInteger(bytes: Uint8Array, offset: number, length: number): number {\n let value = 0n;\n for (let index = 0; index < length; index++) {\n value = (value << 8n) | BigInt(bytes[offset + index] || 0);\n }\n const bits = BigInt(length * 8);\n const signBit = 1n << (bits - 1n);\n if ((value & signBit) !== 0n) {\n value -= 1n << bits;\n }\n return Number(value);\n}\n\nfunction createSqliteSchemaTable(entries: SqliteSchemaEntry[]): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-sqlite-schema\";\n const title = document.createElement(\"strong\");\n title.textContent = `Schema 对象 ${entries.length}`;\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"类型\", \"名称\", \"表\", \"Root\", \"SQL\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const entry of entries) {\n const row = document.createElement(\"tr\");\n for (const value of [entry.type, entry.name, entry.tableName, String(entry.rootPage), entry.sql]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n row.append(cell);\n }\n tbody.append(row);\n }\n table.append(thead, tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\nfunction sqliteJournalMode(value?: number): string {\n if (value === 1) {\n return \"rollback\";\n }\n if (value === 2) {\n return \"WAL\";\n }\n return value === undefined ? \"未知\" : String(value);\n}\n\nfunction sqliteEncoding(value?: number): string {\n const encodings: Record<number, string> = {\n 0: \"未声明\",\n 1: \"UTF-8\",\n 2: \"UTF-16le\",\n 3: \"UTF-16be\"\n };\n return value === undefined ? \"未知\" : encodings[value] || `未知 (${value})`;\n}\n\ntype ParquetPreview = {\n valid: boolean;\n error?: string;\n footerLength?: number;\n footerOffset?: number;\n dataBytes?: number;\n};\n\nfunction createParquetPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"Parquet 结构\";\n preview.append(heading);\n\n const parsed = parseParquet(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 Parquet 文件。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"Magic\", \"PAR1\");\n appendMeta(summary, \"Footer\", `${parsed.footerLength} B`);\n appendMeta(summary, \"Footer offset\", `0x${(parsed.footerOffset || 0).toString(16).toUpperCase()}`);\n appendMeta(summary, \"数据区\", formatBytes(parsed.dataBytes || 0));\n preview.append(summary);\n\n const note = document.createElement(\"p\");\n note.className = \"ofv-data-note\";\n note.textContent = \"Parquet footer 使用 Thrift 编码;当前先展示容器边界,schema/row group 可后续接入 Arrow/Parquet 解码器。\";\n preview.append(note);\n return preview;\n}\n\nfunction parseParquet(bytes: Uint8Array): ParquetPreview {\n if (bytes.length < 12) {\n return { valid: false, error: \"文件太短,无法读取 Parquet 头尾信息。\" };\n }\n if (asciiAt(bytes, 0, 4) !== \"PAR1\" || asciiAt(bytes, bytes.length - 4, 4) !== \"PAR1\") {\n return { valid: false, error: \"缺少 Parquet PAR1 magic header/footer。\" };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const footerLength = view.getUint32(bytes.length - 8, true);\n const footerOffset = bytes.length - 8 - footerLength;\n if (footerOffset < 4) {\n return { valid: false, error: \"Parquet footer 长度超过文件边界。\" };\n }\n return {\n valid: true,\n footerLength,\n footerOffset,\n dataBytes: Math.max(0, footerOffset - 4)\n };\n}\n\ntype AvroMetadata = {\n key: string;\n value: string;\n};\n\ntype AvroPreview = {\n valid: boolean;\n error?: string;\n metadata: AvroMetadata[];\n schema?: {\n type?: string;\n name?: string;\n namespace?: string;\n fields: string[];\n };\n codec?: string;\n syncMarker?: string;\n};\n\nfunction createAvroPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"Avro 结构\";\n preview.append(heading);\n\n const parsed = parseAvro(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 Avro Object Container 文件。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"Magic\", \"Obj\\\\x01\");\n appendMeta(summary, \"Codec\", parsed.codec || \"null\");\n appendMeta(summary, \"Metadata\", parsed.metadata.length);\n appendMeta(summary, \"Sync marker\", parsed.syncMarker || \"未知\");\n preview.append(summary);\n\n if (parsed.schema) {\n const schema = document.createElement(\"div\");\n schema.className = \"ofv-avro-schema\";\n const title = document.createElement(\"strong\");\n title.textContent = \"Schema\";\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-data-summary\";\n appendMeta(meta, \"类型\", parsed.schema.type || \"未知\");\n appendMeta(meta, \"名称\", [parsed.schema.namespace, parsed.schema.name].filter(Boolean).join(\".\") || \"未知\");\n appendMeta(meta, \"字段\", parsed.schema.fields.length);\n schema.append(title, meta);\n if (parsed.schema.fields.length > 0) {\n const list = document.createElement(\"ul\");\n for (const field of parsed.schema.fields.slice(0, 80)) {\n const item = document.createElement(\"li\");\n item.textContent = field;\n list.append(item);\n }\n schema.append(list);\n }\n preview.append(schema);\n }\n\n if (parsed.metadata.length > 0) {\n preview.append(createKeyValueTable(\"Metadata\", parsed.metadata));\n }\n\n return preview;\n}\n\nfunction parseAvro(bytes: Uint8Array): AvroPreview {\n if (bytes.length < 4 || bytes[0] !== 0x4f || bytes[1] !== 0x62 || bytes[2] !== 0x6a || bytes[3] !== 0x01) {\n return { valid: false, error: \"缺少 Avro Object Container magic header。\", metadata: [] };\n }\n let offset = 4;\n const metadata: AvroMetadata[] = [];\n try {\n while (true) {\n const blockCount = readAvroLong(bytes, offset);\n offset = blockCount.offset;\n let count = blockCount.value;\n if (count === 0n) {\n break;\n }\n if (count < 0n) {\n count = -count;\n const blockSize = readAvroLong(bytes, offset);\n offset = blockSize.offset;\n }\n for (let index = 0; index < Number(count); index++) {\n const key = readAvroBytes(bytes, offset);\n offset = key.offset;\n const value = readAvroBytes(bytes, offset);\n offset = value.offset;\n metadata.push({\n key: new TextDecoder().decode(key.value),\n value: decodeAvroMetadataValue(key.value, value.value)\n });\n }\n }\n if (offset + 16 > bytes.length) {\n throw new Error(\"Avro sync marker 缺失。\");\n }\n const syncMarker = Array.from(bytes.slice(offset, offset + 16))\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n const schemaText = metadata.find((item) => item.key === \"avro.schema\")?.value;\n return {\n valid: true,\n metadata,\n codec: metadata.find((item) => item.key === \"avro.codec\")?.value,\n syncMarker,\n schema: schemaText ? summarizeAvroSchema(schemaText) : undefined\n };\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : \"Avro metadata 解析失败。\",\n metadata\n };\n }\n}\n\nfunction readAvroLong(bytes: Uint8Array, offset: number): { value: bigint; offset: number } {\n let result = 0n;\n let shift = 0n;\n for (let index = 0; index < 10; index++) {\n if (offset >= bytes.length) {\n throw new Error(\"Avro long 数据不完整。\");\n }\n const byte = bytes[offset++];\n result |= BigInt(byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) {\n const value = (result >> 1n) ^ -(result & 1n);\n return { value, offset };\n }\n shift += 7n;\n }\n throw new Error(\"Avro long 数据过长。\");\n}\n\nfunction readAvroBytes(bytes: Uint8Array, offset: number): { value: Uint8Array; offset: number } {\n const length = readAvroLong(bytes, offset);\n offset = length.offset;\n if (length.value < 0n) {\n throw new Error(\"Avro bytes 长度无效。\");\n }\n const size = Number(length.value);\n const end = offset + size;\n if (end > bytes.length) {\n throw new Error(\"Avro bytes 超出文件边界。\");\n }\n return { value: bytes.slice(offset, end), offset: end };\n}\n\nfunction decodeAvroMetadataValue(keyBytes: Uint8Array, valueBytes: Uint8Array): string {\n const key = new TextDecoder().decode(keyBytes);\n if (key === \"avro.schema\" || key === \"avro.codec\" || /^[a-z0-9_.-]+$/i.test(key)) {\n return new TextDecoder().decode(valueBytes);\n }\n return `<${valueBytes.length} B>`;\n}\n\nfunction summarizeAvroSchema(schemaText: string): AvroPreview[\"schema\"] {\n try {\n const schema = JSON.parse(schemaText) as {\n type?: string;\n name?: string;\n namespace?: string;\n fields?: Array<{ name?: string; type?: unknown }>;\n };\n return {\n type: typeof schema.type === \"string\" ? schema.type : undefined,\n name: typeof schema.name === \"string\" ? schema.name : undefined,\n namespace: typeof schema.namespace === \"string\" ? schema.namespace : undefined,\n fields: Array.isArray(schema.fields)\n ? schema.fields.map((field) => `${field.name || \"field\"}: ${formatAvroType(field.type)}`)\n : []\n };\n } catch {\n return { fields: [] };\n }\n}\n\nfunction formatAvroType(type: unknown): string {\n if (typeof type === \"string\") {\n return type;\n }\n if (Array.isArray(type)) {\n return type.map(formatAvroType).join(\" | \");\n }\n if (type && typeof type === \"object\") {\n const value = type as { type?: unknown; name?: unknown; items?: unknown; values?: unknown };\n if (typeof value.name === \"string\") {\n return value.name;\n }\n if (value.type === \"array\") {\n return `array<${formatAvroType(value.items)}>`;\n }\n if (value.type === \"map\") {\n return `map<${formatAvroType(value.values)}>`;\n }\n return formatAvroType(value.type);\n }\n return \"unknown\";\n}\n\nfunction createKeyValueTable(titleText: string, rows: AvroMetadata[]): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-data-kv\";\n const title = document.createElement(\"strong\");\n title.textContent = titleText;\n const table = document.createElement(\"table\");\n const tbody = document.createElement(\"tbody\");\n for (const row of rows.slice(0, 80)) {\n const tr = document.createElement(\"tr\");\n const key = document.createElement(\"th\");\n key.textContent = row.key;\n const value = document.createElement(\"td\");\n value.textContent = row.value;\n tr.append(key, value);\n tbody.append(tr);\n }\n table.append(tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\ntype PlistValue =\n | string\n | Uint8Array\n | PlistValue[]\n | { [key: string]: PlistValue }\n | boolean\n | number\n | null;\n\ntype WebArchivePreview = {\n valid: boolean;\n error?: string;\n binary?: boolean;\n url?: string;\n mimeType?: string;\n encoding?: string;\n mainBytes?: number;\n subresources?: number;\n subframeArchives?: number;\n snippet?: string;\n};\n\nfunction createWebArchivePreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview ofv-webarchive-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"WebArchive 结构\";\n preview.append(heading);\n\n const parsed = parseWebArchive(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 WebArchive plist。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"格式\", parsed.binary ? \"Binary plist\" : \"XML plist\");\n appendMeta(summary, \"主资源\", parsed.url || \"未声明\");\n appendMeta(summary, \"MIME\", parsed.mimeType || \"未知\");\n appendMeta(summary, \"编码\", parsed.encoding || \"未声明\");\n appendMeta(summary, \"主资源大小\", parsed.mainBytes !== undefined ? formatBytes(parsed.mainBytes) : \"未知\");\n appendMeta(summary, \"子资源\", String(parsed.subresources ?? 0));\n appendMeta(summary, \"子归档\", String(parsed.subframeArchives ?? 0));\n preview.append(summary);\n\n if (parsed.binary) {\n const note = document.createElement(\"p\");\n note.className = \"ofv-data-note\";\n note.textContent = \"已识别 binary plist WebArchive;浏览器端需要 binary plist 解码器后才能展开主资源。\";\n preview.append(note);\n }\n\n if (parsed.snippet) {\n const snippet = document.createElement(\"pre\");\n snippet.className = \"ofv-text-block ofv-webarchive-snippet\";\n snippet.textContent = parsed.snippet;\n preview.append(snippet);\n }\n return preview;\n}\n\nfunction parseWebArchive(bytes: Uint8Array): WebArchivePreview {\n if (bytes.length >= 8 && asciiAt(bytes, 0, 8) === \"bplist00\") {\n return { valid: true, binary: true };\n }\n\n const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(0, Math.min(bytes.length, 1024 * 1024)));\n if (!/<plist[\\s>]/i.test(text) || !text.includes(\"WebMainResource\")) {\n return { valid: false, error: \"缺少 XML plist 或 WebMainResource 标记。\" };\n }\n if (typeof DOMParser === \"undefined\") {\n return { valid: false, error: \"当前环境缺少 DOMParser,无法解析 XML WebArchive。\" };\n }\n\n const documentXml = new DOMParser().parseFromString(text, \"application/xml\");\n if (documentXml.querySelector(\"parsererror\")) {\n return { valid: false, error: \"XML plist 解析失败。\" };\n }\n const rootDict = Array.from(documentXml.documentElement.children).find((child) => child.tagName === \"dict\");\n if (!rootDict) {\n return { valid: false, error: \"XML plist 缺少根 dict。\" };\n }\n\n const plist = parsePlistElement(rootDict);\n if (!isPlistDict(plist)) {\n return { valid: false, error: \"XML plist 根节点不是 dict。\" };\n }\n const mainResource = plist.WebMainResource;\n if (!isPlistDict(mainResource)) {\n return { valid: false, error: \"WebArchive 缺少 WebMainResource dict。\" };\n }\n\n const resourceData = mainResource.WebResourceData;\n const mimeType = plistString(mainResource.WebResourceMIMEType);\n const mainBytes = resourceData instanceof Uint8Array ? resourceData.length : undefined;\n return {\n valid: true,\n url: plistString(mainResource.WebResourceURL),\n mimeType,\n encoding: plistString(mainResource.WebResourceTextEncodingName),\n mainBytes,\n subresources: Array.isArray(plist.WebSubresources) ? plist.WebSubresources.length : 0,\n subframeArchives: Array.isArray(plist.WebSubframeArchives) ? plist.WebSubframeArchives.length : 0,\n snippet: createWebArchiveSnippet(resourceData, mimeType)\n };\n}\n\nfunction parsePlistElement(element: Element): PlistValue {\n switch (element.tagName) {\n case \"dict\": {\n const result: Record<string, PlistValue> = {};\n const children = Array.from(element.children);\n for (let index = 0; index < children.length; index++) {\n const key = children[index];\n if (key.tagName !== \"key\") {\n continue;\n }\n const value = children[index + 1];\n if (value) {\n result[key.textContent || \"\"] = parsePlistElement(value);\n index++;\n }\n }\n return result;\n }\n case \"array\":\n return Array.from(element.children).map(parsePlistElement);\n case \"data\":\n return decodeBase64Data(element.textContent || \"\");\n case \"integer\":\n case \"real\":\n return Number(element.textContent || 0);\n case \"true\":\n return true;\n case \"false\":\n return false;\n case \"string\":\n case \"date\":\n default:\n return element.textContent || \"\";\n }\n}\n\nfunction decodeBase64Data(value: string): Uint8Array {\n const normalized = value.replace(/\\s+/g, \"\");\n if (!normalized) {\n return new Uint8Array();\n }\n const binary = atob(normalized);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nfunction createWebArchiveSnippet(value: PlistValue | undefined, mimeType?: string): string | undefined {\n if (!(value instanceof Uint8Array) || value.length === 0) {\n return undefined;\n }\n if (!mimeType || !/^(text\\/|application\\/(xhtml\\+xml|xml|json)|image\\/svg\\+xml)/i.test(mimeType)) {\n return undefined;\n }\n const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n return text.replace(/\\s+/g, \" \").trim().slice(0, 1600);\n}\n\nfunction isPlistDict(value: PlistValue | undefined): value is { [key: string]: PlistValue } {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof Uint8Array);\n}\n\nfunction plistString(value: PlistValue | undefined): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"ascii\").decode(bytes.slice(offset, offset + length));\n}\n\ntype PostScriptPreview = {\n valid: boolean;\n error?: string;\n format?: string;\n title?: string;\n creator?: string;\n creationDate?: string;\n pages?: string;\n boundingBox?: string;\n documentData?: string;\n};\n\nfunction createPostScriptPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"PostScript 结构\";\n preview.append(heading);\n\n const parsed = parsePostScript(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 PostScript/Illustrator 文档头。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"格式\", parsed.format || \"PostScript\");\n appendMeta(summary, \"Title\", parsed.title || \"未声明\");\n appendMeta(summary, \"Creator\", parsed.creator || \"未声明\");\n appendMeta(summary, \"Pages\", parsed.pages || \"未知\");\n appendMeta(summary, \"BoundingBox\", parsed.boundingBox || \"未声明\");\n appendMeta(summary, \"Created\", parsed.creationDate || \"未声明\");\n if (parsed.documentData) {\n appendMeta(summary, \"Data\", parsed.documentData);\n }\n preview.append(summary);\n return preview;\n}\n\nfunction parsePostScript(bytes: Uint8Array): PostScriptPreview {\n const head = new TextDecoder(\"latin1\").decode(bytes.slice(0, Math.min(bytes.length, 8192)));\n const firstLine = head.split(/\\r?\\n/, 1)[0] || \"\";\n const isPdfCompatible = firstLine.startsWith(\"%PDF-\");\n const isPostScript = firstLine.startsWith(\"%!\");\n if (!isPdfCompatible && !isPostScript) {\n return { valid: false, error: \"缺少 PostScript %! 或 PDF-compatible %PDF 文件头。\" };\n }\n\n const boundingBox = dscValue(head, \"BoundingBox\") || dscValue(head, \"HiResBoundingBox\");\n return {\n valid: true,\n format: isPdfCompatible ? `PDF-compatible Illustrator (${firstLine.replace(/^%/, \"\")})` : firstLine.replace(/^%!/, \"PostScript \"),\n title: dscValue(head, \"Title\"),\n creator: dscValue(head, \"Creator\") || dscValue(head, \"For\"),\n creationDate: dscValue(head, \"CreationDate\"),\n pages: dscValue(head, \"Pages\"),\n boundingBox: normalizeBoundingBox(boundingBox),\n documentData: dscValue(head, \"DocumentData\")\n };\n}\n\nfunction dscValue(text: string, key: string): string | undefined {\n const escaped = key.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = text.match(new RegExp(`^%%${escaped}:\\\\s*(.+)$`, \"im\"));\n return match?.[1]?.trim();\n}\n\nfunction normalizeBoundingBox(value?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n const parts = value.trim().split(/\\s+/).map((part) => Number(part));\n if (parts.length < 4 || parts.some((part) => !Number.isFinite(part))) {\n return value;\n }\n const [x1, y1, x2, y2] = parts;\n return `${x1}, ${y1}, ${x2}, ${y2} (${Math.max(0, x2 - x1)} x ${Math.max(0, y2 - y1)} pt)`;\n}\n\nfunction createHexPreview(bytes: Uint8Array): HTMLElement | null {\n if (bytes.length === 0) {\n return null;\n }\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block ofv-asset-hex\";\n pre.textContent = hexPreview(bytes);\n return pre;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction byteSignature(bytes: Uint8Array): string {\n if (bytes.length === 0) {\n return \"空文件\";\n }\n const ascii = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 16))).replace(/[^\\x20-\\x7E]/g, \".\");\n const hex = Array.from(bytes.slice(0, Math.min(bytes.length, 8)))\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \");\n return `${ascii} (${hex})`;\n}\n\nfunction hexPreview(bytes: Uint8Array): string {\n const rows: string[] = [];\n const limit = Math.min(bytes.length, 256);\n for (let offset = 0; offset < limit; offset += 16) {\n const slice = bytes.slice(offset, offset + 16);\n const hex = Array.from(slice)\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \")\n .padEnd(47, \" \");\n const ascii = Array.from(slice)\n .map((byte) => (byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : \".\"))\n .join(\"\");\n rows.push(`${offset.toString(16).padStart(8, \"0\").toUpperCase()} ${hex} ${ascii}`);\n }\n if (bytes.length > limit) {\n rows.push(`... 仅展示前 ${limit} 字节,共 ${bytes.length} 字节`);\n }\n return rows.join(\"\\n\");\n}\n"],"mappings":"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A,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,SAAS,KAAK,SAAS,KACzB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,SAAS,YAAY,KACvB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,SAAS,YAAY;AAE3B;AAEA,SAAS,kBAAkB,MAAsB;AAC/C,QAAM,WAAW,KAAK,MAAM,OAAO,EAAE,IAAI,KAAK;AAC9C,SAAO,SAAS,YAAY;AAC9B;;;ACjgBO,SAAS,iBAAiB,WAA8C;AAC7E,MAAI,OAAO,cAAc,UAAU;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAA2B,SAAS;AAC7D,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,oCAAoC,SAAS,EAAE;AAAA,EACjE;AACA,SAAO;AACT;AAEO,SAAS,aACd,SACA,OACA,QACM;AACN,MAAI,UAAU,QAAW;AACvB,YAAQ,MAAM,QAAQ,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAAA,EACnE;AACA,MAAI,WAAW,QAAW;AACxB,YAAQ,MAAM,SAAS,OAAO,WAAW,WAAW,GAAG,MAAM,OAAO;AAAA,EACtE;AACF;AAEO,SAAS,eAAe,SAAmC;AAChE,QAAM,OAAO,QAAQ,sBAAsB;AAC3C,SAAO;AAAA,IACL,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,CAAC;AAAA,IACzC,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAM,CAAC;AAAA,EAC7C;AACF;AAEO,SAAS,gBAAgB,MAA6C;AAC3E,MAAI,KAAK,KAAK;AACZ,WAAO,KAAK;AAAA,EACd;AACA,MAAI,CAAC,KAAK,MAAM;AACd,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,SAAO,IAAI,gBAAgB,KAAK,IAAI;AACtC;AAEO,SAAS,gBAAgB,KAAa,YAA2B;AACtE,MAAI,CAAC,YAAY;AACf,QAAI,gBAAgB,GAAG;AAAA,EACzB;AACF;;;AC9CO,SAAS,iBAAgC;AAC9C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,IACA,OAAO,KAAK;AACV,UAAI,QAAQ,gBAAgB,IAAI,IAAI;AACpC,UAAI,IAAI,QAAQ,aAAa,YAAY,IAAI,QAAQ,gBAAgB;AACnE,eAAO,IAAI,QAAQ,eAAe,GAAG;AAAA,MACvC;AAEA,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AACvC,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAElB,YAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,YAAM,cACJ,IAAI,QAAQ,aAAa,aACrB,iEACA;AAEN,YAAM,OAAO,mBAAmB,IAAI,IAAI;AAExC,YAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,eAAS,OAAO;AAChB,eAAS,WAAW,IAAI,KAAK;AAC7B,eAAS,cAAc;AAEvB,YAAM,OAAO,OAAO,MAAM,QAAQ;AAClC,UAAI,SAAS,UAAU,IAAI,YAAY;AACvC,UAAI,SAAS,OAAO,KAAK;AAEzB,UAAI,IAAI,QAAQ,aAAa,YAAY;AACvC,iBAAS,MAAM;AAAA,MACjB;AAEA,aAAO;AAAA,QACL,UAAU;AACR,cAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,0BAAgB,KAAK,UAAU;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAAuG;AACjI,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,OAAK,YAAY;AACjB,qBAAmB,MAAM,gBAAM,KAAK,QAAQ,gCAAO;AACnD,qBAAmB,MAAM,gBAAM,KAAK,YAAY,IAAI,KAAK,SAAS,KAAK,cAAI;AAC3E,qBAAmB,MAAM,QAAQ,KAAK,YAAY,oBAAK;AACvD,qBAAmB,MAAM,gBAAM,KAAK,SAAS,SAAY,iBAAO,oBAAoB,KAAK,IAAI,CAAC;AAC9F,qBAAmB,MAAM,gBAAM,KAAK,MAAM,qBAAW,uCAAS;AAC9D,SAAO;AACT;AAEA,SAAS,mBAAmB,QAAqB,OAAe,OAAqB;AACnF,QAAM,MAAM,SAAS,cAAc,IAAI;AACvC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,UAAQ,cAAc;AACtB,SAAO,OAAO,KAAK,OAAO;AAC5B;AAEA,SAAS,oBAAoB,OAAuB;AAClD,MAAI,QAAQ,MAAM;AAChB,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,MAAI,QAAQ,OAAO,MAAM;AACvB,WAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAAA,EACrC;AACA,SAAO,IAAI,QAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC;AAC5C;;;AC5DO,SAAS,aAAa,SAAqC;AAChE,QAAM,YAAY,iBAAiB,QAAQ,SAAS;AACpD,eAAa,WAAW,QAAQ,OAAO,QAAQ,MAAM;AAErD,YAAU,UAAU,IAAI,UAAU;AAClC,MAAI,QAAQ,WAAW;AACrB,cAAU,UAAU,IAAI,QAAQ,SAAS;AAAA,EAC3C;AACA,QAAM,QAAQ,WAAW,WAAW,QAAQ,SAAS,OAAO;AAE5D,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AAEjB,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,SAAO,YAAY;AACnB,SAAO,SAAS;AAEhB,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AAErB,QAAM,QAAQ,eAAe,OAAO;AACpC,MAAI,eAAe,WAAW,QAAQ,gBAAgB,GAAG,MAAM,MAAM;AACrE,MAAI;AAEJ,QAAM,OAAO,OAAO,UAAkB;AACpC,QAAI,aAAa,MAAM,WAAW,GAAG;AACnC;AAAA,IACF;AACA,mBAAe,WAAW,OAAO,MAAM,MAAM;AAC7C,UAAM,gBAAgB,YAAY;AAAA,EACpC;AAEA,QAAM,UAAU,cAAc,QAAQ,SAAS,UAAU;AAAA,IACvD,WAAW,MAAM,MAAM;AAAA,IACvB,MAAM,MAAM,KAAK,eAAe,CAAC;AAAA,IACjC,UAAU,MAAM,KAAK,eAAe,CAAC;AAAA,IACrC,SAAS,CAAC,YAAY,iBAAiB,UAAU,OAAO;AAAA,EAC1D,CAAC;AACD,MAAI,SAAS;AACX,SAAK,OAAO,QAAQ,OAAO;AAAA,EAC7B;AAEA,OAAK,OAAO,QAAQ,QAAQ;AAC5B,YAAU,gBAAgB,IAAI;AAE9B,QAAM,oBAAoB;AAAA,IACxB,KAAK,QAAQ,OAAO;AAAA,IACpB,UAAU,QAAQ,YAAY;AAAA,IAC9B,GAAG;AAAA,EACL;AAEA,MAAI,YAAY;AAChB,MAAI,cAAc;AAElB,QAAM,aAAa,CAAC,YAAqB;AACvC,WAAO,SAAS,CAAC;AACjB,WAAO,cAAc,UAAU,uBAAuB;AAAA,EACxD;AAEA,QAAM,WAAW,CAAC,UAA0B;AAC1C,WAAO,SAAS;AAChB,WAAO,cAAc,OAAO,UAAU,WAAW,QAAQ,MAAM;AAAA,EACjE;AAEA,QAAM,SAAS,MAAM;AACnB,QAAI,WAAW;AACb;AAAA,IACF;AACA,UAAM,OAAO,eAAe,QAAQ;AACpC,qBAAiB,SAAS,IAAI;AAAA,EAChC;AAEA,QAAM,iBAAiB,cAAc,WAAW,MAAM;AAEtD,QAAM,aAAa,OAAO,SAAsB;AAC9C,UAAM,QAAS,eAAe;AAC9B,qBAAiB,QAAQ;AACzB,sBAAkB;AAClB,aAAS,gBAAgB;AACzB,eAAW,IAAI;AACf,aAAS,OAAO,MAAM,cAAc,MAAM,MAAM;AAEhD,UAAM,UAAU,CAAC,GAAI,QAAQ,WAAW,CAAC,GAAI,eAAe,CAAC;AAC7D,UAAM,SAAS,MAAM,WAAW,SAAS,IAAI;AAC7C,QAAI,aAAa,UAAU,aAAa;AACtC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,eAAe,MAAM,OAAO,OAAO;AAAA,QACvC;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,eAAe,QAAQ;AAAA,QAC7B,SAAS;AAAA,QACT,SAAS,SAAS,WAAW;AAAA,QAC7B;AAAA,QACA;AAAA,MACF,CAAC;AACD,UAAI,aAAa,UAAU,aAAa;AACtC,qBAAa,QAAQ;AACrB;AAAA,MACF;AACA,wBAAkB;AAClB,iBAAW,KAAK;AAChB,eAAS;AAAA,QAAkB,CAAC,YAC1B,QAAQ,aAAa,OAAO,MAAM,aAAa,aAAa,aAAa,WAAW,OAAO,IAAI;AAAA,MACjG;AACA,cAAQ,SAAS,IAAI;AACrB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,aAAa,UAAU,aAAa;AACtC;AAAA,MACF;AACA,YAAM,kBAAkB,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAChF,iBAAW,KAAK;AAChB,eAAS,eAAe;AACxB,cAAQ,UAAU,iBAAiB,IAAI;AAAA,IACzC;AAAA,EACF;AAEA,iBAAe,gBAAgB,OAAe;AAC5C,UAAM,OAAO,MAAM,KAAK;AACxB,UAAM,OAAO,MAAM,cAAc,KAAK,MAAM,KAAK,UAAU,KAAK,QAAQ;AACxE,UAAM,WAAW,IAAI;AAAA,EACvB;AAEA,OAAK,KAAK,YAAY;AAEtB,SAAO;AAAA,IACL,MAAM,OAAO,MAAM;AACjB,UAAI,WAAW;AACb;AAAA,MACF;AACA,UAAI,SAAS,QAAW;AACtB,cAAM,cAAc,MAAM,YAAY;AACtC,cAAM,OAAO,cAAc,GAAG,iBAAiB,MAAM,aAAa,OAAO,CAAC;AAAA,MAC5E;AACA,YAAM,gBAAgB,YAAY;AAAA,IACpC;AAAA,IACA,MAAM,OAAO;AACX,YAAM,KAAK,eAAe,CAAC;AAAA,IAC7B;AAAA,IACA,MAAM,WAAW;AACf,YAAM,KAAK,eAAe,CAAC;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,kBAAkB;AAChB,aAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA,UAAU;AACR,kBAAY;AACZ,qBAAe;AACf,qBAAe,QAAQ;AACvB,uBAAiB,QAAQ;AACzB,eAAS,QAAQ;AACjB,YAAM,QAAQ;AACd,gBAAU,gBAAgB;AAC1B,gBAAU,UAAU,OAAO,UAAU;AACrC,UAAI,QAAQ,WAAW;AACrB,kBAAU,UAAU,OAAO,QAAQ,SAAS;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,SAAwC;AAC9D,MAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG;AAC7C,WAAO,QAAQ,MAAM;AAAA,MAAI,CAAC,SACxB,cAAc,IAAI,IACd,OACA;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACN;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,QAAW;AAC9B,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO;AAAA,IACL;AAAA,MACE,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAAwD;AAC7E,SAAO,OAAO,SAAS,YAAY,SAAS,QAAQ,UAAU;AAChE;AAEA,SAAS,iBACP,MACA,aACA,SACa;AACb,MAAI,OAAO,SAAS,eAAe,gBAAgB,MAAM;AACvD,WAAO,EAAE,KAAK;AAAA,EAChB;AACA,SAAO;AAAA,IACL;AAAA,IACA,UAAU,aAAa,YAAY,QAAQ;AAAA,IAC3C,UAAU,aAAa,YAAY,QAAQ;AAAA,EAC7C;AACF;AAEA,SAAS,WAAW,OAAe,QAAwB;AACzD,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,SAAS,CAAC;AAChD;AAEA,SAAS,WACP,WACA,OACyB;AACzB,QAAM,QAAQ,OAAO,aAAa,8BAA8B;AAChE,QAAM,UAAU,CAAC,mBAAmB,gBAAgB;AAEpD,QAAM,gBAAgB,MAAM;AAC1B,cAAU,UAAU,OAAO,GAAG,OAAO;AACrC,UAAM,gBAAgB,UAAU,UAAU,OAAO,UAAU,SAAS,UAAU,SAAS,UAAU;AACjG,cAAU,UAAU,IAAI,aAAa,aAAa,EAAE;AAAA,EACtD;AAEA,gBAAc;AACd,MAAI,UAAU,QAAQ;AACpB,qBAAiB,OAAO,aAAa;AAAA,EACvC;AAEA,SAAO;AAAA,IACL,UAAU;AACR,UAAI,UAAU,QAAQ;AACpB,4BAAoB,OAAO,aAAa;AAAA,MAC1C;AACA,gBAAU,UAAU,OAAO,GAAG,OAAO;AAAA,IACvC;AAAA,EACF;AACF;AAEA,SAAS,cAAc,SAAsB,UAA+C;AAC1F,MAAI,OAAO,mBAAmB,aAAa;AACzC,UAAM,WAAW,IAAI,eAAe,QAAQ;AAC5C,aAAS,QAAQ,OAAO;AACxB,WAAO;AAAA,MACL,UAAU;AACR,iBAAS,WAAW;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,iBAAiB,UAAU,QAAQ;AAC1C,SAAO;AAAA,IACL,UAAU;AACR,aAAO,oBAAoB,UAAU,QAAQ;AAAA,IAC/C;AAAA,EACF;AACF;AAOA,SAAS,iBAAiB,OAA6C,UAA4B;AACjG,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AACA,MAAI,OAAO,MAAM,qBAAqB,YAAY;AAChD,UAAM,iBAAiB,UAAU,QAAQ;AACzC;AAAA,EACF;AACA,QAAM,cAAc,QAAQ;AAC9B;AAEA,SAAS,oBAAoB,OAA6C,UAA4B;AACpG,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AACA,MAAI,OAAO,MAAM,wBAAwB,YAAY;AACnD,UAAM,oBAAoB,UAAU,QAAQ;AAC5C;AAAA,EACF;AACA,QAAM,iBAAiB,QAAQ;AACjC;AAEA,SAAS,cACP,SACA,UACA,OAeY;AACZ,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,UACJ,OAAO,YAAY,YACf,EAAE,MAAM,MAAM,QAAQ,MAAM,UAAU,MAAM,YAAY,MAAM,OAAO,MAAM,QAAQ,KAAK,IACxF;AAEN,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,aAAa,QAAQ,SAAS;AACtC,UAAQ,aAAa,cAAc,sBAAsB;AAEzD,MAAI;AACJ,MAAI,eAAe;AACnB,MAAI,gBAAgB,MAAM,UAAU;AACpC,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,QAAM,iBAAgF,CAAC;AACvF,QAAM,gBAA0F,CAAC;AACjG,QAAM,YAA+B,CAAC;AACtC,QAAM,SAAS,uBAAuB,QAAQ;AAC9C,MAAI;AACJ,MAAI;AACJ,MAAI,gBAAgB,CAAC,aAA6B;AAElD,QAAM,aAAa,MACjB,qBAAqB;AAAA,IACnB;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AAEH,QAAM,YAAY,CAChB,OACA,OACA,QACA,WACA,SACG;AACH,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,OAAO;AACd,4BAAwB,QAAQ,OAAO,IAAI;AAC3C,WAAO,QAAQ;AACf,WAAO,aAAa,cAAc,KAAK;AACvC,QAAI,WAAW;AACb,aAAO,YAAY;AAAA,IACrB;AACA,WAAO,iBAAiB,SAAS,MAAM;AACvC,YAAQ,OAAO,MAAM;AACrB,cAAU,KAAK,MAAM,OAAO,oBAAoB,SAAS,MAAM,CAAC;AAChE,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,CACvB,IACA,OACA,OACA,YACG;AACH,UAAM,SAAS,UAAU,OAAO,OAAO,MAAM;AAC3C,YAAM,QAAQ,OAAO;AAAA,IACvB,GAAG,QAAW,QAAQ,QAAQ,EAAE,CAAC;AACjC,WAAO,WAAW;AAClB,mBAAe,KAAK,EAAE,QAAQ,QAAQ,CAAC;AAAA,EACzC;AAEA,QAAM,sBAAsB,CAAC,OAA+B;AAC1D,QAAI,CAAC,uBAAuB,EAAE,GAAG;AAC/B,YAAM,eAAe,QAAQ,SAAS,KAAK,CAAC,WAAW,OAAO,OAAO,EAAE;AACvE,UAAI,cAAc;AAChB,2BAAmB,YAAY;AAAA,MACjC;AACA;AAAA,IACF;AAEA,QAAI,OAAO,cAAc,MAAM,UAAU,IAAI,GAAG;AAC9C,uBAAiB;AAAA,QACf,gBAAgB,SAAS,UAAU;AAAA,QACnC,gBAAgB,SAAS,UAAU;AAAA,QACnC,MAAM,KAAK,MAAM,SAAS;AAAA,QAC1B;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB;AACA;AAAA,IACF;AACA,QAAI,OAAO,UAAU,MAAM,UAAU,IAAI,GAAG;AAC1C,mBAAa;AAAA,QACX,gBAAgB,SAAS,MAAM;AAAA,QAC/B,gBAAgB,SAAS,MAAM;AAAA,QAC/B,MAAM,KAAK,MAAM,KAAK;AAAA,QACtB;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB;AACA;AAAA,IACF;AACA,QAAI,OAAO,WAAW,MAAM,UAAU,IAAI,GAAG;AAC3C,mBAAa,SAAS,cAAc,MAAM;AAC1C,iBAAW,YAAY;AACvB,cAAQ,OAAO,UAAU;AACzB;AAAA,IACF;AACA,QAAI,OAAO,cAAc,QAAQ,MAAM;AACrC,uBAAiB,IAAI,gBAAgB,SAAS,EAAE,GAAG,gBAAgB,SAAS,EAAE,GAAG,UAAU;AAC3F;AAAA,IACF;AACA,QAAI,OAAO,aAAa,QAAQ,MAAM;AACpC,uBAAiB,IAAI,gBAAgB,SAAS,EAAE,GAAG,gBAAgB,SAAS,EAAE,GAAG,SAAS;AAC1F;AAAA,IACF;AACA,QAAI,OAAO,gBAAgB,QAAQ,MAAM;AACvC,uBAAiB,IAAI,gBAAgB,SAAS,EAAE,GAAG,gBAAgB,SAAS,EAAE,GAAG,YAAY;AAC7F,wBAAkB,eAAe,eAAe,SAAS,CAAC,GAAG;AAC7D,sBAAgB;AAChB;AAAA,IACF;AACA,QAAI,OAAO,kBAAkB,QAAQ,QAAQ;AAC3C,uBAAiB,IAAI,gBAAgB,SAAS,EAAE,GAAG,gBAAgB,SAAS,EAAE,GAAG,cAAc;AAC/F;AAAA,IACF;AACA,QAAI,OAAO,cAAc,QAAQ,aAAa,OAAO;AACnD;AAAA,QACE,gBAAgB,SAAS,EAAE;AAAA,QAC3B,gBAAgB,SAAS,EAAE;AAAA,QAC3B,MAAM,WAAW,EAAE,SAAS;AAAA,QAC5B;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB;AACA;AAAA,IACF;AACA,QAAI,OAAO,gBAAgB,QAAQ,eAAe,OAAO;AACvD;AAAA,QACE,gBAAgB,SAAS,EAAE;AAAA,QAC3B,gBAAgB,SAAS,EAAE;AAAA,QAC3B,MAAM,WAAW,EAAE,WAAW;AAAA,QAC9B;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB;AACA;AAAA,IACF;AACA,QAAI,OAAO,WAAW,QAAQ,OAAO;AACnC;AAAA,QACE,gBAAgB,SAAS,EAAE;AAAA,QAC3B,gBAAgB,SAAS,EAAE;AAAA,QAC3B,MAAM,WAAW,EAAE,MAAM;AAAA,QACzB;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB;AACA;AAAA,IACF;AACA,QAAI,OAAO,YAAY,QAAQ,WAAW,OAAO;AAC/C,0BAAoB;AACpB;AAAA,IACF;AAAA,EAEF;AAEA,QAAM,qBAAqB,CAAC,WAAuC;AACjE,UAAM,SAAS;AAAA,MACb,OAAO;AAAA,MACP,OAAO,SAAS,OAAO;AAAA,MACvB,MAAM,KAAK,OAAO,QAAQ,WAAW,CAAC;AAAA,MACtC,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AACA,WAAO,QAAQ,mBAAmB,OAAO;AACzC,kBAAc,KAAK,EAAE,QAAQ,OAAO,CAAC;AAAA,EACvC;AAEA,QAAM,sBAAsB,MAAM;AAChC,UAAM,cAAc,SAAS,cAAc,KAAK;AAChD,gBAAY,YAAY;AACxB,gBAAY,QAAQ,gBAAgB,SAAS,QAAQ;AACrD,UAAM,kBAAkB,SAAS,cAAc,OAAO;AACtD,oBAAgB,OAAO;AACvB,oBAAgB,cAAc,gBAAgB,SAAS,QAAQ;AAC/D,oBAAgB,aAAa,cAAc,gBAAgB,SAAS,QAAQ,CAAC;AAC7E,UAAM,kBAAkB,SAAS,cAAc,MAAM;AACrD,oBAAgB,YAAY;AAC5B,kBAAc;AACd,kBAAc;AAEd,UAAM,YAAY,MAAM;AACtB,YAAM,QAAQ,OAAO,OAAO,gBAAgB,KAAK;AACjD,sBAAgB,cAAc,gBAAgB,QAAQ,OAAO,KAAK,IAAI;AAAA,IACxE;AAEA,oBAAgB,iBAAiB,SAAS,SAAS;AACnD,gBAAY,OAAO,iBAAiB,eAAe;AACnD,YAAQ,OAAO,WAAW;AAC1B,cAAU,KAAK,MAAM,gBAAgB,oBAAoB,SAAS,SAAS,CAAC;AAAA,EAC9E;AAEA,QAAM,gBAAgB,MAAM;AAC1B,QAAI,QAAQ,QAAQ;AAClB,cAAQ,gBAAgB;AACxB,YAAM,gBAAgB,QAAQ,OAAO,WAAW,CAAC;AACjD,UAAI,eAAe;AACjB,gBAAQ,OAAO,aAAa;AAAA,MAC9B;AACA;AAAA,IACF;AACA,oBAAgB,SAAS,MAAM,UAAU,CAAC,EAAE,QAAQ,mBAAmB;AACvE,6BAAyB,OAAO,EAAE,QAAQ,kBAAkB;AAAA,EAC9D;AAEA,gBAAc;AAEd,QAAM,sBAAsB,MAAM;AAChC,UAAM,UAAU,WAAW;AAC3B,eAAW,EAAE,QAAQ,OAAO,KAAK,eAAe;AAC9C,aAAO,WAAW,oBAAoB,OAAO,UAAU,OAAO;AAC9D,aAAO,SAAS,oBAAoB,OAAO,QAAQ,OAAO;AAAA,IAC5D;AAAA,EACF;AAEA,QAAM,cAAc,MAAM;AACxB,WAAO,MAAM;AACb,QAAI,aAAa;AACf,kBAAY,QAAQ;AAAA,IACtB;AACA,QAAI,aAAa;AACf,kBAAY,cAAc;AAAA,IAC5B;AAAA,EACF;AAEA,WAAS,QAAQ,MAAe;AAC9B,kBAAc,OAAO,SAAS,YAAY,OAAO,SAAS,IAAI,KAAK,OAAO,IAAI,OAAO;AACrF,oBAAgB;AAChB,wBAAoB;AACpB,wBAAoB;AAAA,EACtB;AAEA,WAAS,kBAAkB;AACzB,QAAI,CAAC,iBAAiB;AACpB;AAAA,IACF;AACA;AAAA,MACE;AAAA,MACA,gBAAgB,SAAY,gBAAgB,SAAS,YAAY,IAAI,kBAAkB,WAAW;AAAA,MAClG,QAAQ,QAAQ,YAAY;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,QAAI,CAAC,QAAQ,QAAQ;AACnB;AAAA,IACF;AACA,YAAQ,gBAAgB;AACxB,UAAM,gBAAgB,QAAQ,OAAO,WAAW,CAAC;AACjD,QAAI,eAAe;AACjB,cAAQ,OAAO,aAAa;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,UAAU,OAAO,QAAQ;AAC9B,aAAO;AACP,qBAAe;AACf,sBAAgB;AAChB,oBAAc;AACd,sBAAgB;AAChB,kBAAY;AACZ,qBAAe,QAAQ,CAAC,EAAE,OAAO,MAAM;AACrC,eAAO,WAAW;AAAA,MACpB,CAAC;AACD,UAAI,YAAY;AACd,mBAAW,cAAc,GAAG,QAAQ,CAAC,MAAM,MAAM;AAAA,MACnD;AACA,UAAI,gBAAgB;AAClB,uBAAe,WAAW,SAAS;AAAA,MACrC;AACA,UAAI,YAAY;AACd,mBAAW,WAAW,SAAS,SAAS;AAAA,MAC1C;AACA,0BAAoB;AACpB,0BAAoB;AAAA,IACtB;AAAA,IACA,kBAAkB,aAAa;AAC7B,sBAAgB;AAChB,qBAAe,QAAQ,CAAC,EAAE,QAAQ,QAAQ,MAAM;AAC9C,eAAO,WAAW,CAAC,YAAY,OAAO;AAAA,MACxC,CAAC;AACD,0BAAoB;AACpB,0BAAoB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AACR,aAAO,MAAM;AACb,iBAAW,WAAW,WAAW;AAC/B,gBAAQ;AAAA,MACV;AACA,cAAQ,gBAAgB;AAAA,IAC1B;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAeG;AACD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB,SAAS,QAAQ,SAAS;AAAA,IAC1B;AAAA,IACA,WAAW,SAAS,SAAY,SAAY,kBAAkB,IAAI;AAAA,IAClE,MAAM,WAAW;AACf,YAAM,MAAM,SAAS;AAAA,IACvB;AAAA,IACA,MAAM,OAAO;AACX,YAAM,MAAM,KAAK;AAAA,IACnB;AAAA,IACA,SAAS,MAAM;AAAA,IACf;AAAA,IACA;AAAA,IACA,WAAW;AACT,UAAI,MAAM;AACR,qBAAa,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,IACA,aAAa;AACX,WAAK,QAAQ,eAAe,oBAAoB;AAAA,IAClD;AAAA,IACA,QAAQ;AACN,mBAAa,QAAQ;AAAA,IACvB;AAAA,IACA,QAAQ,OAAO;AAAA,IACf,aAAa,OAAO;AAAA,EACtB;AACF;AAEA,IAAM,uBAAoE;AAAA,EACxE,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,IAAM,uBAAoE;AAAA,EACxE,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,SAAS,gBAAgB,SAAgC,IAAyC;AAChG,SAAO,QAAQ,SAAS,EAAE,KAAK,qBAAqB,EAAE;AACxD;AAEA,SAAS,gBAAgB,SAAgC,IAAyC;AAChG,SAAO,QAAQ,SAAS,EAAE,KAAK,QAAQ,SAAS,EAAE,KAAK,qBAAqB,EAAE;AAChF;AAEA,SAAS,kBAAkB,MAAsB;AAC/C,SAAO,GAAG,KAAK,MAAM,OAAO,GAAG,CAAC;AAClC;AAEA,SAAS,gBAAgB,SAAgC,aAA+C;AACtG,MAAI,QAAQ,OAAO;AACjB,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,UAAoC,CAAC;AAC3C,MAAI,cAAc,GAAG;AACnB,YAAQ,KAAK,YAAY,QAAQ,OAAO;AAAA,EAC1C;AACA,MAAI,QAAQ,MAAM;AAChB,YAAQ,KAAK,YAAY,WAAW,YAAY;AAAA,EAClD;AACA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,KAAK,cAAc;AAAA,EAC7B;AACA,MAAI,QAAQ,aAAa,OAAO;AAC9B,YAAQ,KAAK,UAAU;AAAA,EACzB;AACA,MAAI,QAAQ,eAAe,OAAO;AAChC,YAAQ,KAAK,YAAY;AAAA,EAC3B;AACA,MAAI,QAAQ,OAAO;AACjB,YAAQ,KAAK,OAAO;AAAA,EACtB;AACA,MAAI,QAAQ,WAAW,OAAO;AAC5B,YAAQ,KAAK,QAAQ;AAAA,EACvB;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,SAA8D;AAC9F,MAAI,QAAQ,SAAS,CAAC,QAAQ,SAAS;AACrC,WAAO,CAAC;AAAA,EACV;AACA,SAAO,CAAC,GAAG,QAAQ,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,EAAE;AAC5E;AAEA,SAAS,oBACP,OACA,SACS;AACT,SAAO,OAAO,UAAU,aAAa,MAAM,OAAO,IAAI,QAAQ,KAAK;AACrE;AAEA,SAAS,wBACP,QACA,OACA,MACM;AACN,SAAO,gBAAgB;AACvB,MAAI,CAAC,MAAM;AACT,WAAO,cAAc;AACrB;AAAA,EACF;AAEA,QAAM,cAAc,SAAS,cAAc,MAAM;AACjD,cAAY,YAAY;AACxB,cAAY,aAAa,eAAe,MAAM;AAC9C,MAAI,OAAO,SAAS,UAAU;AAC5B,gBAAY,OAAO,oBAAoB,IAAI,CAAC;AAAA,EAC9C,OAAO;AACL,gBAAY,OAAO,KAAK,UAAU,IAAI,CAAC;AAAA,EACzC;AAEA,QAAM,eAAe,SAAS,cAAc,MAAM;AAClD,eAAa,YAAY;AACzB,eAAa,cAAc;AAC3B,SAAO,OAAO,aAAa,YAAY;AACzC;AAEA,IAAM,yBAAyB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,0BAA0B,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,oBAAoB,MAAoB;AAC/C,QAAM,WAAW,SAAS,cAAc,UAAU;AAClD,WAAS,YAAY,KAAK,KAAK;AAC/B,QAAM,WAAW,SAAS,uBAAuB;AACjD,aAAW,SAAS,MAAM,KAAK,SAAS,QAAQ,UAAU,GAAG;AAC3D,UAAM,YAAY,wBAAwB,KAAK;AAC/C,QAAI,WAAW;AACb,eAAS,OAAO,SAAS;AAAA,IAC3B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,MAAyB;AACxD,MAAI,KAAK,aAAa,KAAK,WAAW;AACpC,UAAM,OAAO,KAAK,eAAe;AACjC,WAAO,KAAK,KAAK,IAAI,SAAS,eAAe,IAAI,IAAI;AAAA,EACvD;AAEA,MAAI,EAAE,gBAAgB,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,KAAK,QAAQ,YAAY;AACzC,MAAI,CAAC,uBAAuB,IAAI,OAAO,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,SAAS,gBAAgB,8BAA8B,OAAO;AAChF,aAAW,QAAQ,MAAM,KAAK,KAAK,UAAU,GAAG;AAC9C,QAAI,2BAA2B,KAAK,MAAM,KAAK,KAAK,GAAG;AACrD,gBAAU,aAAa,KAAK,MAAM,KAAK,KAAK;AAAA,IAC9C;AAAA,EACF;AAEA,aAAW,SAAS,MAAM,KAAK,KAAK,UAAU,GAAG;AAC/C,UAAM,iBAAiB,wBAAwB,KAAK;AACpD,QAAI,gBAAgB;AAClB,gBAAU,OAAO,cAAc;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,2BAA2B,MAAc,OAAwB;AACxE,QAAM,WAAW,KAAK,YAAY;AAClC,MAAI,SAAS,WAAW,IAAI,KAAK,SAAS,SAAS,GAAG,GAAG;AACvD,WAAO;AAAA,EACT;AACA,MAAI,CAAC,wBAAwB,IAAI,IAAI,KAAK,CAAC,wBAAwB,IAAI,QAAQ,KAAK,CAAC,SAAS,WAAW,OAAO,GAAG;AACjH,WAAO;AAAA,EACT;AACA,SAAO,CAAC,gDAAgD,KAAK,KAAK;AACpE;AAEA,SAAS,uBAAuB,IAA+D;AAC7F,SAAO,MAAM;AACf;AAEA,SAAS,uBAAuB,MAG9B;AACA,QAAM,cAAc;AAEpB,QAAM,QAAQ,MAAM;AAClB,UAAM,UAAU,mBAAmB,IAAI,EAAE,QAAQ,CAAC,eAAe;AAAA,MAC/D,GAAG,WAAW,iBAAiB,QAAQ,WAAW,EAAE;AAAA,IACtD,CAAC;AACD,eAAW,UAAU,SAAS;AAC5B,aAAO,YAAY,SAAS,eAAe,OAAO,eAAe,EAAE,CAAC;AAAA,IACtE;AACA,uBAAmB,IAAI,EAAE,QAAQ,CAAC,eAAe,WAAW,UAAU,CAAC;AAAA,EACzE;AAEA,QAAM,SAAS,CAAC,UAA0B;AACxC,UAAM;AACN,UAAM,kBAAkB,MAAM,KAAK;AACnC,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,mBAAmB,IAAI,EAAE,QAAQ,CAAC,eAAe,2BAA2B,UAAU,CAAC;AACzG,QAAI,QAAQ;AACZ,QAAI;AAEJ,eAAW,QAAQ,WAAW;AAC5B,YAAM,OAAO,KAAK,aAAa;AAC/B,YAAM,YAAY,KAAK,YAAY;AACnC,YAAM,aAAa,gBAAgB,YAAY;AAC/C,UAAI,QAAQ;AACZ,UAAI,QAAQ,UAAU,QAAQ,YAAY,KAAK;AAC/C,UAAI,QAAQ,GAAG;AACb;AAAA,MACF;AAEA,YAAM,WAAW,SAAS,uBAAuB;AACjD,aAAO,SAAS,GAAG;AACjB,YAAI,QAAQ,OAAO;AACjB,mBAAS,OAAO,SAAS,eAAe,KAAK,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,QACnE;AACA,cAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,eAAO,YAAY;AACnB,eAAO,cAAc,KAAK,MAAM,OAAO,QAAQ,gBAAgB,MAAM;AACrE,iBAAS,OAAO,MAAM;AACtB,uBAAe;AACf,iBAAS;AACT,gBAAQ,QAAQ,gBAAgB;AAChC,gBAAQ,UAAU,QAAQ,YAAY,KAAK;AAAA,MAC7C;AACA,UAAI,QAAQ,KAAK,QAAQ;AACvB,iBAAS,OAAO,SAAS,eAAe,KAAK,MAAM,KAAK,CAAC,CAAC;AAAA,MAC5D;AACA,WAAK,YAAY,QAAQ;AAAA,IAC3B;AAEA,gBAAY,iBAAiB,EAAE,OAAO,UAAU,QAAQ,UAAU,CAAC;AACnE,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,QAAQ,MAAM;AACzB;AAEA,SAAS,mBAAmB,MAAkC;AAC5D,QAAM,QAAQ,CAAC,IAAI;AACnB,aAAW,UAAU,KAAK,iBAAoC,QAAQ,GAAG;AACvE,QAAI;AACF,YAAM,OAAO,OAAO,iBAAiB;AACrC,UAAI,MAAM;AACR,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,MAA2B;AAC7D,QAAM,QAAgB,CAAC;AACvB,QAAM,SAAS,SAAS,iBAAiB,MAAM,WAAW,WAAW;AAAA,IACnE,WAAW,MAAM;AACf,YAAM,SAAS,KAAK;AACpB,UAAI,CAAC,UAAU,CAAC,KAAK,WAAW,KAAK,GAAG;AACtC,eAAO,WAAW;AAAA,MACpB;AACA,UAAI,CAAC,UAAU,SAAS,YAAY,SAAS,QAAQ,EAAE,SAAS,OAAO,OAAO,GAAG;AAC/E,eAAO,WAAW;AAAA,MACpB;AACA,aAAO,WAAW;AAAA,IACpB;AAAA,EACF,CAAC;AAED,MAAI,UAAU,OAAO,SAAS;AAC9B,SAAO,SAAS;AACd,UAAM,KAAK,OAAe;AAC1B,cAAU,OAAO,SAAS;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,SAAS,aAAa,UAA6B;AACjD,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,YAAY;AAClB,QAAM,aAAa,eAAe,MAAM;AACxC,WAAS,KAAK,OAAO,KAAK;AAE1B,QAAM,QAAQ,SAAS,UAAU,IAAI;AACrC,oBAAkB,UAAU,KAAK;AACjC,QAAM,UAAU,IAAI,kBAAkB,UAAU;AAGhD,QAAM,aAAa,MAAM,cAAc,kBAAkB,MAAM,MAAM,UAAU,SAAS,iBAAiB,IAAI,QAAQ;AACrH,MAAI,iBAAiB;AACrB,MAAI,kBAAkB;AACtB,MAAI,YAAY;AAEhB,MAAI,YAAY;AACd,UAAM,SAAS,WAAW,iBAAiB,oBAAoB;AAC/D,QAAI,OAAO,SAAS,GAAG;AACrB,kBAAY;AACZ,YAAM,eAAe,OAAO,CAAC,EAAE;AAC/B,YAAM,aAAa,cAAc;AACjC,UAAI,YAAY;AACd,yBAAiB,SAAS,WAAW,MAAM,KAAK,KAAK;AACrD,0BAAkB,SAAS,WAAW,MAAM,MAAM,KAAK;AAAA,MACzD;AAEA,aAAO,QAAQ,CAAC,YAAY;AAC1B,cAAM,OAAO;AACb,aAAK,MAAM,QAAQ;AACnB,aAAK,MAAM,SAAS;AAEpB,cAAM,UAAU,KAAK;AACrB,YAAI,SAAS;AACX,kBAAQ,MAAM,QAAQ,GAAG,cAAc;AACvC,kBAAQ,MAAM,SAAS,GAAG,eAAe;AACzC,kBAAQ,MAAM,YAAY;AAC1B,kBAAQ,MAAM,SAAS;AAEvB,gBAAM,eAAe,QAAQ;AAC7B,cAAI,cAAc;AAChB,yBAAa,MAAM,YAAY;AAC/B,yBAAa,MAAM,QAAQ,GAAG,cAAc;AAC5C,yBAAa,MAAM,SAAS,GAAG,eAAe;AAAA,UAChD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,MAAM,MAAM;AAClB,MAAI,CAAC,KAAK;AACR,UAAM,OAAO;AACb;AAAA,EACF;AAGA,MAAI,KAAK;AACT,MAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAOA;AACV,MAAI,MAAM;AAGV,QAAM,KAAK,SAAS,iBAAiB,+BAA+B,CAAC,EAAE,QAAQ,CAAC,OAAO;AACrF,QAAI,KAAK,YAAY,GAAG,UAAU,IAAI,CAAC;AAAA,EACzC,CAAC;AAGD,QAAM,YAAY,IAAI,cAAc,OAAO;AAC3C,YAAU,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkDxB,MAAI,KAAK,YAAY,SAAS;AAG9B,MAAI,WAAW;AACb,UAAM,YAAY,IAAI,cAAc,OAAO;AAC3C,cAAU,cAAc;AAAA;AAAA;AAAA,kBAGV,iBAAiB,kBAAkB,cAAc,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAO1D,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKd,cAAc;AAAA;AAAA;AAAA;AAAA,mBAId,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoB7B,QAAI,KAAK,YAAY,SAAS;AAAA,EAChC;AAEA,MAAI,KAAK,OAAO,KAAK;AAErB,MAAI,UAAU;AACd,QAAM,kBAAkB,MAAM;AAC5B,QAAI,SAAS;AACX;AAAA,IACF;AACA,cAAU;AACV,UAAM,eAAe,MAAM;AAC3B,UAAM,eAAe,MAAM;AAC3B,WAAO,WAAW,MAAM,MAAM,OAAO,GAAG,GAAI;AAAA,EAC9C;AAEA,QAAM,SAAS,MAAM;AACnB,oBAAgB;AAAA,EAClB;AAEA,SAAO,WAAW,MAAM;AACtB,oBAAgB;AAAA,EAClB,GAAG,GAAG;AACR;AAEA,SAAS,kBAAkB,YAAyB,YAA+B;AACjF,QAAM,iBAAiB,CAAC,GAAG,WAAW,iBAAiB,QAAQ,CAAC;AAChE,QAAM,iBAAiB,CAAC,GAAG,WAAW,iBAAiB,QAAQ,CAAC;AAEhE,iBAAe,QAAQ,CAAC,cAAc,UAAU;AAC9C,UAAM,eAAe,eAAe,KAAK;AACzC,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AACA,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY,aAAa;AAC/B,UAAM,MAAM;AACZ,QAAI;AACF,YAAM,MAAM,aAAa,UAAU,WAAW;AAAA,IAChD,QAAQ;AACN;AAAA,IACF;AACA,UAAM,QAAQ,aAAa;AAC3B,UAAM,SAAS,aAAa;AAC5B,iBAAa,YAAY,KAAK;AAAA,EAChC,CAAC;AACH;AAEA,SAAS,aAAa,MAAyB;AAC7C,QAAM,MAAM,gBAAgB,IAAI;AAChC,QAAM,aAAa,QAAQ,KAAK,GAAG;AACnC,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,OAAO;AACZ,OAAK,WAAW,KAAK;AACrB,OAAK,MAAM;AACX,OAAK,SAAS;AACd,WAAS,KAAK,OAAO,IAAI;AACzB,OAAK,MAAM;AACX,SAAO,WAAW,MAAM;AACtB,SAAK,OAAO;AACZ,oBAAgB,KAAK,UAAU;AAAA,EACjC,GAAG,CAAC;AACN;AAEA,eAAe,WAAW,SAA0B,MAA2C;AAC7F,aAAW,UAAU,SAAS;AAC5B,QAAI,MAAM,OAAO,MAAM,IAAI,GAAG;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,eAAe;AACxB;;;ACjuCA,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,2BAA2B,oBAAI,IAAI,CAAC,KAAK,CAAC;AAChD,IAAM,0BAA0B,oBAAI,IAAI,CAAC,iBAAiB,2BAA2B,CAAC;AACtF,IAAM,gBAAgB,oBAAI,IAAI,CAAC,cAAc,cAAc,uBAAuB,qBAAqB,CAAC;AAEjG,SAAS,cAA6B;AAC3C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,UAAI,yBAAyB,IAAI,KAAK,SAAS,KAAK,wBAAwB,IAAI,KAAK,QAAQ,GAAG;AAC9F,eAAO;AAAA,MACT;AACA,aAAO,KAAK,SAAS,WAAW,QAAQ,KAAK,gBAAgB,IAAI,KAAK,SAAS;AAAA,IACjF;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,MAAM,IAAI,KAAK,UAAU,YAAY;AAC3C,YAAM,SAAS,QAAQ,UAAU,QAAQ,UAAU,cAAc,IAAI,IAAI,KAAK,SAAS,YAAY,CAAC;AACpG,YAAM,qBAAqB,eAAe,IAAI,KAAK,IAAI;AAEvD,UAAI,MAAM;AACV,UAAI,gBAA6B;AACjC,UAAI,aAAa,QAAQ,IAAI,KAAK,GAAG;AAErC,UAAI,QAAQ;AACV,YAAI,WAAW,IAAI;AACnB,YAAI;AACF,cAAI,OAAO,IAAI,KAAK;AACpB,cAAI,CAAC,QAAQ,OAAO,IAAI,KAAK,WAAW,UAAU;AAChD,kBAAM,MAAM,MAAM,MAAM,IAAI,KAAK,MAAM;AACvC,gBAAI,CAAC,IAAI,IAAI;AACX,oBAAM,IAAI,MAAM,8BAA8B,IAAI,MAAM,EAAE;AAAA,YAC5D;AACA,mBAAO,MAAM,IAAI,KAAK;AAAA,UACxB;AACA,cAAI,CAAC,MAAM;AACT,kBAAM,IAAI,MAAM,gDAAgD;AAAA,UAClE;AAEA,gBAAM,iBAAiB,MAAM,OAAO,UAAU;AAC9C,gBAAM,WAAW,eAAe,WAAW;AAC3C,gBAAM,YAAY,MAAM,SAAS;AAAA,YAC/B;AAAA,YACA,QAAQ;AAAA,YACR,SAAS;AAAA,UACX,CAAC;AAED,0BAAgB,MAAM,QAAQ,SAAS,IAAI,UAAU,CAAC,IAAI;AAC1D,gBAAM,IAAI,gBAAgB,aAAa;AACvC,uBAAa;AAAA,QACf,SAAS,KAAU;AACjB,kBAAQ,MAAM,iCAAiC,GAAG;AAElD,gBAAM,gBAAgB,IAAI,IAAI;AAC9B,uBAAa,QAAQ,IAAI,KAAK,GAAG;AAAA,QACnC,UAAE;AACA,cAAI,WAAW,KAAK;AAAA,QACtB;AAAA,MACF,OAAO;AACL,cAAM,gBAAgB,IAAI,IAAI;AAAA,MAChC;AAEA,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AAEpB,YAAM,qBAAqB,CAAC,IAAI,QAAQ;AACxC,YAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,eAAS,YAAY;AAErB,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,UAAU,mBAAmB,MAAM,oBAAoB,KAAK,IAAI,KAAK,UAAU,IAAI,KAAK,IAAI;AAElG,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,MAAM,IAAI,KAAK;AACrB,YAAM,YAAY;AAClB,YAAM,MAAM;AACZ,YAAM,MAAM,YAAY,UAAU,IAAI,QAAQ,GAAG;AAEjD,UAAI,QAAQ;AACZ,UAAI,WAAW;AACf,UAAI,UAAU;AACd,UAAI,UAAU;AACd,UAAI,WAAW;AACf,UAAI,aAAa;AACjB,UAAI,aAAa;AACjB,UAAI,eAAe;AACnB,UAAI,eAAe;AAEnB,YAAM,YAAY,SAAS,cAAc,MAAM;AAC/C,gBAAU,YAAY;AAEtB,YAAM,kBAAkB,MAAM;AAC5B,cAAM,MAAM,YAAY,aAAa,OAAO,OAAO,OAAO,aAAa,KAAK,YAAY,QAAQ;AAChG,kBAAU,cAAc,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC;AAClD,YAAI,SAAS,QAAQ,KAAK;AAAA,MAC5B;AAEA,YAAM,oBAAoB,MAAM;AAC9B,cAAM,gBAAgB,oBAAoB,IAAI,KAAK,MAAM,GAAG,CAAC;AAAA,MAC/D;AAEA,YAAM,WAAW,CAAC,cAAsB;AACtC,gBAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,SAAS,CAAC;AAC5C,wBAAgB;AAAA,MAClB;AAEA,YAAM,QAAQ,MAAM;AAClB,gBAAQ;AACR,mBAAW;AACX,kBAAU;AACV,kBAAU;AACV,wBAAgB;AAAA,MAClB;AAEA,YAAM,YAAY,CAAC,OAAe,OAAe,WAAuB;AACtE,cAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,eAAO,OAAO;AACd,eAAO,cAAc;AACrB,eAAO,QAAQ;AACf,eAAO,aAAa,cAAc,KAAK;AACvC,eAAO,iBAAiB,SAAS,MAAM;AACvC,iBAAS,OAAO,MAAM;AACtB,eAAO,MAAM,OAAO,oBAAoB,SAAS,MAAM;AAAA,MACzD;AAEA,YAAM,YAAY,qBACd;AAAA,QACE,UAAU,KAAK,YAAY,MAAM,SAAS,QAAQ,IAAI,CAAC;AAAA,QACvD,UAAU,KAAK,WAAW,MAAM,SAAS,QAAQ,IAAI,CAAC;AAAA,QACtD,UAAU,UAAU,gBAAgB,MAAM;AACxC,sBAAY;AACZ,0BAAgB;AAAA,QAClB,CAAC;AAAA,QACD,UAAU,SAAS,oBAAoB,KAAK;AAAA,MAC9C,IACA,CAAC;AACL,UAAI,oBAAoB;AACtB,iBAAS,OAAO,SAAS;AAAA,MAC3B;AAEA,YAAM,gBAAgB,CAAC,UAAwB;AAC7C,YAAI,MAAM,WAAW,GAAG;AACtB;AAAA,QACF;AACA,mBAAW;AACX,qBAAa,MAAM;AACnB,qBAAa,MAAM;AACnB,uBAAe;AACf,uBAAe;AACf,cAAM,UAAU,IAAI,aAAa;AACjC,cAAM,kBAAkB,MAAM,SAAS;AAAA,MACzC;AAEA,YAAM,gBAAgB,CAAC,UAAwB;AAC7C,YAAI,CAAC,UAAU;AACb;AAAA,QACF;AACA,kBAAU,eAAe,MAAM,UAAU;AACzC,kBAAU,eAAe,MAAM,UAAU;AACzC,wBAAgB;AAAA,MAClB;AAEA,YAAM,cAAc,CAAC,UAAwB;AAC3C,mBAAW;AACX,cAAM,UAAU,OAAO,aAAa;AACpC,YAAI,MAAM,kBAAkB,MAAM,SAAS,GAAG;AAC5C,gBAAM,sBAAsB,MAAM,SAAS;AAAA,QAC7C;AAAA,MACF;AAEA,YAAM,UAAU,CAAC,UAAsB;AACrC,YAAI,CAAC,MAAM,WAAW,CAAC,MAAM,SAAS;AACpC;AAAA,QACF;AACA,cAAM,eAAe;AACrB,iBAAS,SAAS,MAAM,SAAS,IAAI,OAAO,IAAI;AAAA,MAClD;AAEA,YAAM,iBAAiB,eAAe,aAAa;AACnD,YAAM,iBAAiB,eAAe,aAAa;AACnD,YAAM,iBAAiB,aAAa,WAAW;AAC/C,YAAM,iBAAiB,iBAAiB,WAAW;AACnD,YAAM,iBAAiB,SAAS,SAAS,EAAE,SAAS,MAAM,CAAC;AAC3D,YAAM,iBAAiB,SAAS,iBAAiB;AAEjD,YAAM,OAAO,KAAK;AAClB,cAAQ,OAAO,GAAI,qBAAqB,CAAC,UAAU,OAAO,OAAO,IAAI,CAAC,OAAO,OAAO,CAAE;AACtF,UAAI,SAAS,OAAO,OAAO;AAC3B,sBAAgB;AAEhB,aAAO;AAAA,QACL,WAAW,SAAS;AAClB,iBACE,YAAY,aACZ,YAAY,cACZ,YAAY,gBACZ,YAAY,kBACZ,YAAY;AAAA,QAEhB;AAAA,QACA,QAAQ,SAAS;AACf,cAAI,YAAY,WAAW;AACzB,qBAAS,QAAQ,IAAI;AACrB,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,YAAY;AAC1B,qBAAS,QAAQ,IAAI;AACrB,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,cAAc;AAC5B,kBAAM;AACN,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,gBAAgB;AAC9B,wBAAY;AACZ,4BAAgB;AAChB,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,eAAe;AAC7B,wBAAY;AACZ,4BAAgB;AAChB,mBAAO;AAAA,UACT;AACA,iBAAO;AAAA,QACT;AAAA,QACA,OAAO,MAAmB;AACxB,gBAAM,MAAM,WAAW,GAAG,KAAK,KAAK;AACpC,gBAAM,MAAM,YAAY,GAAG,KAAK,IAAI,GAAG,KAAK,SAAS,SAAS,YAAY,CAAC;AAAA,QAC7E;AAAA,QACA,UAAU;AACR,cAAI,SAAS,QAAQ,MAAS;AAC9B,qBAAW,WAAW,WAAW;AAC/B,oBAAQ;AAAA,UACV;AACA,gBAAM,oBAAoB,eAAe,aAAa;AACtD,gBAAM,oBAAoB,eAAe,aAAa;AACtD,gBAAM,oBAAoB,aAAa,WAAW;AAClD,gBAAM,oBAAoB,iBAAiB,WAAW;AACtD,gBAAM,oBAAoB,SAAS,OAAO;AAC1C,gBAAM,oBAAoB,SAAS,iBAAiB;AACpD,kBAAQ,OAAO;AACf,cAAI,eAAe;AACjB,gBAAI,gBAAgB,GAAG;AAAA,UACzB,OAAO;AACL,4BAAgB,KAAK,UAAU;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,UAAkB,KAA0B;AACvE,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AAErB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AAEpB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc;AAEnB,QAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,WAAS,OAAO;AAChB,WAAS,WAAW;AACpB,WAAS,cAAc;AAEvB,WAAS,OAAO,OAAO,MAAM,QAAQ;AACrC,SAAO;AACT;AAaA,eAAe,eAAe,MAAkC;AAC9D,MAAI,CAAC,MAAM;AACT,WAAO,IAAI,WAAW;AAAA,EACxB;AACA,SAAO,IAAI,WAAW,MAAM,KAAK,YAAY,EAAE,MAAM,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC;AAChF;AAEA,SAAS,mBAAmB,OAAmB,WAAmB,UAAkB,UAA+B;AACjH,QAAM,OAAO,eAAe,OAAO,WAAW,UAAU,QAAQ;AAChE,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,kBAAgB,KAAK,gBAAM,KAAK,MAAM;AACtC,MAAI,KAAK,SAAS,KAAK,QAAQ;AAC7B,oBAAgB,KAAK,gBAAM,GAAG,KAAK,KAAK,MAAM,KAAK,MAAM,IAAI;AAAA,EAC/D;AACA,MAAI,KAAK,UAAU;AACjB,oBAAgB,KAAK,gBAAM,KAAK,QAAQ;AAAA,EAC1C;AACA,MAAI,KAAK,OAAO;AACd,oBAAgB,KAAK,gBAAM,KAAK,KAAK;AAAA,EACvC;AACA,MAAI,KAAK,WAAW,QAAW;AAC7B,oBAAgB,KAAK,UAAK,OAAO,KAAK,MAAM,CAAC;AAAA,EAC/C;AACA,MAAI,KAAK,UAAU,QAAW;AAC5B,oBAAgB,KAAK,gBAAM,OAAO,KAAK,KAAK,CAAC;AAAA,EAC/C;AACA,MAAI,KAAK,MAAM;AACb,oBAAgB,KAAK,gBAAM,KAAK,IAAI;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,QAAqB,OAAe,OAAqB;AAChF,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,YAAY;AAChB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,MAAI,OAAO,KAAK,OAAO;AACvB,SAAO,OAAO,GAAG;AACnB;AAEA,SAAS,eAAe,OAAmB,WAAmB,UAAkB,UAA6B;AAC3G,QAAM,kBAAkB,aAAa,YAAY,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK,SAAS,YAAY;AACnG,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,QAAQ,gBAAgB,MAAM,yDAAY;AAAA,EACrD;AACA,SACE,aAAa,KAAK,KAClB,cAAc,KAAK,KACnB,aAAa,KAAK,KAClB,cAAc,KAAK,KACnB,cAAc,KAAK,KACnB,aAAa,KAAK,KAClB,aAAa,KAAK,KAClB,aAAa,KAAK,KAClB,EAAE,QAAQ,gBAAgB,MAAM,yDAAY;AAEhD;AAEA,SAAS,aAAa,OAAqC;AACzD,MAAI,MAAM,SAAS,MAAM,CAAC,WAAW,OAAO,GAAG,CAAC,KAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,EAAI,CAAC,GAAG;AAChG,WAAO;AAAA,EACT;AACA,QAAMC,QAAO,SAAS,KAAK;AAC3B,QAAM,SAAS,eAAe,OAAO,MAAM;AAC3C,SAAO;AAAA,IACL,QAAQ,SAAS,IAAI,SAAS;AAAA,IAC9B,OAAOA,MAAK,UAAU,IAAI,KAAK;AAAA,IAC/B,QAAQA,MAAK,UAAU,IAAI,KAAK;AAAA,IAChC,UAAU,GAAG,MAAM,EAAE,CAAC;AAAA,IACtB,OAAO,aAAa,MAAM,EAAE,CAAC;AAAA,IAC7B,QAAQ,SAAS,IAAI,SAAS;AAAA,EAChC;AACF;AAEA,SAAS,cAAc,OAAqC;AAC1D,MAAI,MAAM,SAAS,KAAK,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,KAAM;AAC9D,WAAO;AAAA,EACT;AACA,MAAI,SAAS;AACb,SAAO,SAAS,IAAI,MAAM,QAAQ;AAChC,QAAI,MAAM,MAAM,MAAM,KAAM;AAC1B;AACA;AAAA,IACF;AACA,UAAM,SAAS,MAAM,SAAS,CAAC;AAC/B,cAAU;AACV,WAAO,MAAM,MAAM,MAAM,KAAM;AAC7B;AAAA,IACF;AACA,QAAI,WAAW,OAAQ,WAAW,KAAM;AACtC;AAAA,IACF;AACA,QAAI,SAAS,IAAI,MAAM,QAAQ;AAC7B;AAAA,IACF;AACA,UAAM,SAAU,MAAM,MAAM,KAAK,IAAK,MAAM,SAAS,CAAC;AACtD,QAAI,SAAS,KAAK,SAAS,SAAS,MAAM,QAAQ;AAChD;AAAA,IACF;AACA,QAAK,UAAU,OAAQ,UAAU,OAAU,UAAU,OAAQ,UAAU,OAAU,UAAU,OAAQ,UAAU,OAAU,UAAU,OAAQ,UAAU,KAAO;AACxJ,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAQ,MAAM,SAAS,CAAC,KAAK,IAAK,MAAM,SAAS,CAAC;AAAA,QAClD,QAAS,MAAM,SAAS,CAAC,KAAK,IAAK,MAAM,SAAS,CAAC;AAAA,QACnD,UAAU,GAAG,MAAM,SAAS,CAAC,CAAC;AAAA,QAC9B,OAAO,GAAG,MAAM,SAAS,CAAC,CAAC;AAAA,MAC7B;AAAA,IACF;AACA,cAAU;AAAA,EACZ;AACA,SAAO,EAAE,QAAQ,QAAQ,MAAM,oEAAkB;AACnD;AAEA,SAAS,aAAa,OAAqC;AACzD,QAAM,SAAS,QAAQ,OAAO,GAAG,CAAC;AAClC,MAAI,WAAW,YAAY,WAAW,UAAU;AAC9C,WAAO;AAAA,EACT;AACA,QAAM,SAAS,MAAM,EAAE,KAAK;AAC5B,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,aAAa,OAAO,CAAC;AAAA,IAC5B,QAAQ,aAAa,OAAO,CAAC;AAAA,IAC7B,UAAU,IAAI,SAAS,KAAQ,CAAC;AAAA,IAChC,OAAQ,SAAS,MAAQ,uBAAuB;AAAA,IAChD,QAAQ,eAAe,KAAK;AAAA,EAC9B;AACF;AAEA,SAAS,cAAc,OAAqC;AAC1D,MAAI,MAAM,SAAS,MAAM,QAAQ,OAAO,GAAG,CAAC,MAAM,UAAU,QAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AAC3F,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAClC,MAAI,UAAU,UAAU,MAAM,UAAU,IAAI;AAC1C,UAAM,QAAQ,MAAM,EAAE;AACtB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,IAAI,aAAa,OAAO,EAAE;AAAA,MACjC,QAAQ,IAAI,aAAa,OAAO,EAAE;AAAA,MAClC,SAAS,QAAQ,OAAU,IAAI,yBAAyB,KAAK,IAAI;AAAA,MACjE,QAAQ,QAAQ,QAAU,IAAI,UAAU;AAAA,IAC1C;AAAA,EACF;AACA,MAAI,UAAU,UAAU,MAAM,UAAU,IAAI;AAC1C,UAAM,QAAQ;AACd,QAAI,MAAM,QAAQ,CAAC,MAAM,OAAQ,MAAM,QAAQ,CAAC,MAAM,KAAQ,MAAM,QAAQ,CAAC,MAAM,IAAM;AACvF,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO,aAAa,OAAO,QAAQ,CAAC,IAAI;AAAA,QACxC,QAAQ,aAAa,OAAO,QAAQ,CAAC,IAAI;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACA,MAAI,UAAU,UAAU,MAAM,UAAU,IAAI;AAC1C,UAAM,KAAK,MAAM,EAAE;AACnB,UAAM,KAAK,MAAM,EAAE;AACnB,UAAM,KAAK,MAAM,EAAE;AACnB,UAAM,KAAK,MAAM,EAAE;AACnB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,MAAO,KAAK,OAAS,IAAK;AAAA,MACjC,QAAQ,MAAO,KAAK,OAAS,KAAO,MAAM,KAAO,KAAK,QAAS;AAAA,MAC/D,OAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,QAAQ,MAAM,gBAAM,SAAS,OAAO,UAAK;AAC5D;AAEA,SAAS,cAAc,OAAqC;AAC1D,QAAM,QAAQ,iBAAiB,OAAO,GAAG,MAAM,MAAM;AACrD,QAAM,OAAO,MAAM,KAAK,CAAC,QAAQ,IAAI,SAAS,MAAM;AACpD,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,QAAM,aAAa,QAAQ,OAAO,KAAK,WAAW,CAAC;AACnD,QAAM,mBAAmB,QAAQ,OAAO,KAAK,YAAY,GAAG,KAAK,IAAI,GAAG,KAAK,UAAU,KAAK,YAAY,CAAC,CAAC;AAC1G,MAAI,CAAC,gDAAgD,KAAK,GAAG,UAAU,IAAI,gBAAgB,EAAE,GAAG;AAC9F,WAAO;AAAA,EACT;AACA,QAAM,OAAO,YAAY,OAAO,OAAO,MAAM;AAC7C,SAAO;AAAA,IACL,QAAQ,eAAe,UAAU,iBAAiB,SAAS,MAAM,IAAI,kBAAkB,WAAW,WAAW,KAAK,IAAI,SAAS;AAAA,IAC/H,OAAO,QAAQ,KAAK,YAAY,MAAM,KAAK,UAAU,aAAa,OAAO,KAAK,YAAY,CAAC,IAAI;AAAA,IAC/F,QAAQ,QAAQ,KAAK,YAAY,MAAM,KAAK,UAAU,aAAa,OAAO,KAAK,YAAY,CAAC,IAAI;AAAA,IAChG,MAAM,SAAS,UAAU,GAAG,iBAAiB,KAAK,IAAI,SAAM,iBAAiB,gBAAgB,CAAC,KAAK,EAAE;AAAA,EACvG;AACF;AAUA,SAAS,iBAAiB,OAAmB,OAAe,KAAwB;AAClF,QAAM,QAAmB,CAAC;AAC1B,MAAI,SAAS;AACb,SAAO,SAAS,KAAK,OAAO,MAAM,SAAS,KAAK;AAC9C,QAAI,OAAO,aAAa,OAAO,MAAM;AACrC,UAAM,OAAO,QAAQ,OAAO,SAAS,GAAG,CAAC;AACzC,QAAI,aAAa;AACjB,QAAI,CAAC,sBAAsB,KAAK,IAAI,GAAG;AACrC;AAAA,IACF;AACA,QAAI,SAAS,KAAK,SAAS,MAAM,KAAK;AACpC,YAAM,OAAO,aAAa,OAAO,SAAS,CAAC;AAC3C,YAAM,MAAM,aAAa,OAAO,SAAS,EAAE;AAC3C,aAAO,OAAO,IAAI,MAAM,SAAS;AACjC,mBAAa;AAAA,IACf,WAAW,SAAS,GAAG;AACrB,aAAO,MAAM;AAAA,IACf;AACA,QAAI,OAAO,cAAc,SAAS,OAAO,KAAK;AAC5C;AAAA,IACF;AACA,UAAM,KAAK;AAAA,MACT;AAAA,MACA,OAAO;AAAA,MACP,WAAW,SAAS;AAAA,MACpB,SAAS,SAAS;AAAA,MAClB,KAAK,SAAS;AAAA,IAChB,CAAC;AACD,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAmB,OAAkB,MAAmC;AAC3F,aAAW,OAAO,OAAO;AACvB,QAAI,IAAI,SAAS,MAAM;AACrB,aAAO;AAAA,IACT;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM,EAAE,SAAS,IAAI,IAAI,GAAG;AACvF,YAAM,aAAa,IAAI,SAAS,SAAS,IAAI,YAAY,IAAI,IAAI;AACjE,YAAM,QAAQ,YAAY,OAAO,iBAAiB,OAAO,YAAY,IAAI,OAAO,GAAG,IAAI;AACvF,UAAI,OAAO;AACT,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,QAAM,SAAS,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO,KAAK,CAAC;AACxF,SAAO,OAAO,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AACrC;AAEA,SAAS,aAAa,OAAqC;AACzD,MAAI,MAAM,SAAS,MAAM,QAAQ,OAAO,GAAG,CAAC,MAAM,MAAM;AACtD,WAAO;AAAA,EACT;AACA,QAAM,UAAU,aAAa,OAAO,EAAE;AACtC,MAAI,UAAU,IAAI;AAChB,WAAO,EAAE,QAAQ,OAAO,MAAM,0BAAgB;AAAA,EAChD;AACA,MAAI,YAAY,MAAM,MAAM,UAAU,IAAI;AACxC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,aAAa,OAAO,EAAE;AAAA,MAC7B,QAAQ,aAAa,OAAO,EAAE;AAAA,MAC9B,UAAU,GAAG,aAAa,OAAO,EAAE,CAAC;AAAA,IACtC;AAAA,EACF;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,YAAY,OAAO,EAAE;AAAA,IAC5B,QAAQ,KAAK,IAAI,YAAY,OAAO,EAAE,CAAC;AAAA,IACvC,UAAU,GAAG,aAAa,OAAO,EAAE,CAAC;AAAA,EACtC;AACF;AAEA,SAAS,aAAa,OAAqC;AACzD,MAAI,MAAM,SAAS,KAAK,aAAa,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,SAAS,aAAa,OAAO,CAAC,CAAC,GAAG;AAChG,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,aAAa,OAAO,CAAC;AACnC,MAAI,QAAQ,KAAK,MAAM,SAAS,IAAI,QAAQ,IAAI;AAC9C,WAAO,EAAE,QAAQ,WAAW,MAAM;AAAA,EACpC;AACA,QAAM,QAAQ,MAAM,CAAC,KAAK;AAC1B,QAAM,SAAS,MAAM,CAAC,KAAK;AAC3B,SAAO;AAAA,IACL,QAAQ,aAAa,OAAO,CAAC,MAAM,IAAI,QAAQ;AAAA,IAC/C;AAAA,IACA;AAAA,IACA,UAAU,GAAG,aAAa,OAAO,EAAE,CAAC;AAAA,IACpC;AAAA,EACF;AACF;AAEA,SAAS,aAAa,OAAqC;AACzD,QAAM,OAAO,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,IAAI,CAAC,CAAC;AAC3G,MAAI,CAAC,aAAa,KAAK,IAAI,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,QAAM,MAAM,KAAK,MAAM,eAAe,IAAI,CAAC,KAAK;AAChD,QAAM,QAAQ,gBAAgB,KAAK,OAAO;AAC1C,QAAM,SAAS,gBAAgB,KAAK,QAAQ;AAC5C,QAAM,UAAU,IAAI,MAAM,6BAA6B,IAAI,CAAC,GAAG,KAAK;AACpE,QAAM,eAAe,SAAS,MAAM,QAAQ,EAAE,IAAI,MAAM,EAAE,OAAO,OAAO,QAAQ;AAChF,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,UAAU,cAAc,WAAW,IAAI,aAAa,CAAC,IAAI;AAAA,IAChE,QAAQ,WAAW,cAAc,WAAW,IAAI,aAAa,CAAC,IAAI;AAAA,IAClE,MAAM,UAAU,WAAW,OAAO,KAAK;AAAA,EACzC;AACF;AAEA,SAAS,eAAe,OAAmB,WAA2B;AACpE,MAAI,SAAS;AACb,MAAI,QAAQ;AACZ,SAAO,SAAS,MAAM,MAAM,QAAQ;AAClC,UAAM,SAAS,aAAa,OAAO,MAAM;AACzC,UAAM,OAAO,QAAQ,OAAO,SAAS,GAAG,CAAC;AACzC,QAAI,SAAS,WAAW;AACtB;AAAA,IACF;AACA,cAAU,KAAK;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAA2B;AACjD,MAAI,QAAQ;AACZ,WAAS,QAAQ,IAAI,QAAQ,MAAM,QAAQ,SAAS;AAClD,QAAI,MAAM,KAAK,MAAM,IAAM;AACzB;AAAA,IACF;AAAA,EACF;AACA,SAAO,SAAS;AAClB;AAEA,SAAS,yBAAyB,OAA2B;AAC3D,MAAI,QAAQ;AACZ,WAAS,SAAS,IAAI,SAAS,KAAK,MAAM,UAAU;AAClD,UAAM,OAAO,QAAQ,OAAO,QAAQ,CAAC;AACrC,UAAM,OAAO,aAAa,OAAO,SAAS,CAAC;AAC3C,QAAI,SAAS,QAAQ;AACnB;AAAA,IACF;AACA,cAAU,IAAI,OAAQ,OAAO;AAAA,EAC/B;AACA,SAAO,SAAS;AAClB;AAEA,SAAS,aAAa,OAAuB;AAC3C,QAAM,SAAiC;AAAA,IACrC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,SAAO,OAAO,KAAK,KAAK,YAAY,KAAK;AAC3C;AAEA,SAAS,gBAAgB,KAAa,MAAkC;AACtE,QAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,MAAM,IAAI,kBAAkB,GAAG,CAAC,IAAI,CAAC;AACxE,QAAM,SAAS,OAAO,KAAK;AAC3B,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,WAAW,OAAmB,QAAgB,UAA6B;AAClF,SAAO,SAAS,MAAM,CAAC,MAAM,UAAU,MAAM,SAAS,KAAK,MAAM,IAAI;AACvE;AAEA,SAAS,SAAS,OAA6B;AAC7C,SAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AACtE;AAEA,SAAS,QAAQ,OAAmB,QAAgB,QAAwB;AAC1E,MAAI,SAAS,KAAK,SAAS,SAAS,MAAM,QAAQ;AAChD,WAAO;AAAA,EACT;AACA,SAAO,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,QAAQ,SAAS,MAAM,CAAC;AAC7E;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAO,SAAS,KAAK,EAAE,UAAU,QAAQ,IAAI;AAC/C;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAO,MAAM,MAAM,IAAK,MAAM,SAAS,CAAC,KAAK,IAAM,MAAM,SAAS,CAAC,KAAK;AAC1E;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAO,SAAS,KAAK,EAAE,UAAU,QAAQ,IAAI;AAC/C;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAO,SAAS,KAAK,EAAE,UAAU,QAAQ,KAAK;AAChD;AAEA,SAAS,YAAY,OAAmB,QAAwB;AAC9D,SAAO,SAAS,KAAK,EAAE,SAAS,QAAQ,IAAI;AAC9C;AAEA,SAAS,UAAU,KAAqB;AACtC,MAAI,QAAQ,SAAS;AACnB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,UAAU;AACpB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,cAAc;AACxB,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AChtBA,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,eAAe,oBAAI,IAAI,CAAC,iCAAiC,yBAAyB,qBAAqB,CAAC;AAEvG,SAAS,cAA6B;AAC3C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,KAAK,SAAS,WAAW,QAAQ,KAAK,eAAe,IAAI,KAAK,QAAQ,KAAK,gBAAgB,IAAI,KAAK,SAAS;AAAA,IACtH;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AACvC,YAAM,WAAW,IAAI,KAAK,SAAS,YAAY;AAC/C,YAAM,QAAQ,MAAM,eAAe,IAAI,KAAK,IAAI;AAEhD,YAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,gBAAU,YAAY;AACtB,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAElB,YAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,YAAM,YAAY;AAClB,YAAM,WAAW;AACjB,YAAM,cAAc;AACpB,YAAM,UAAU;AAChB,YAAM,MAAM,YAAY,IAAI,QAAQ,QAAQ,UAAU,UAAU;AAEhE,YAAM,MAAM,IAAI,KAAK,UAAU,YAAY;AAC3C,YAAM,UAAU,gBAAgB,eAAe,OAAO,KAAK,UAAU,IAAI,KAAK,IAAI,CAAC;AACnF,YAAM,OAAO,KAAK;AAClB,gBAAU,OAAO,OAAO,OAAO;AAC/B,UAAI,SAAS,UAAU,IAAI,YAAY;AACvC,UAAI,SAAS,OAAO,SAAS;AAE7B,UAAI,cAAmB;AACvB,UAAI,eAAoB;AACxB,YAAM,QAAQ,QAAQ,UAAU,aAAa,IAAI,QAAQ;AACzD,YAAM,WAAW,QAAQ,UAAU,aAAa;AAChD,YAAM,SAAS,aAAa;AAC5B,YAAM,QAAQ,QAAQ,SAAS,aAAa;AAC5C,YAAM,eAAe,IAAI,KAAK,aAAa,IAAI,KAAK,YAAY,SAAS,YAAY;AAErF,YAAM,wBAAwB,MAAM;AAClC,cAAM,MAAM,UAAU;AACtB,cAAM,MAAM;AAGZ,cAAM,cAAc,MAAM,cAAc,eAAe;AACvD,YAAI,aAAa;AACf,sBAAY,OAAO;AAAA,QACrB;AAEA,cAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,iBAAS,YAAY;AAErB,cAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,cAAM,cAAc,2GAAsB,WAAW;AAErD,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,cAAc;AAEnB,cAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,iBAAS,OAAO;AAChB,iBAAS,WAAW,IAAI,KAAK;AAC7B,iBAAS,cAAc;AAEvB,iBAAS,OAAO,OAAO,MAAM,QAAQ;AACrC,cAAM,OAAO,QAAQ;AAAA,MACvB;AAEA,YAAM,eAAe,MAAM;AACzB,8BAAsB;AAAA,MACxB;AAEA,YAAM,iBAAiB,SAAS,YAAY;AAE5C,UAAI;AACF,YAAI,QAAQ;AACV,gCAAsB;AAAA,QACxB,WAAW,OAAO;AAChB,gBAAM,OAAO,MAAM,OAAO,QAAQ,GAAG;AACrC,cAAI,IAAI,YAAY,GAAG;AACrB,0BAAc,IAAI,IAAI;AACtB,wBAAY,WAAW,GAAG;AAC1B,wBAAY,YAAY,KAAK;AAC7B,wBAAY,GAAG,IAAI,OAAO,OAAO,CAAC,QAAa,SAAc;AAC3D,kBAAI,KAAK,OAAO;AACd,sCAAsB;AAAA,cACxB;AAAA,YACF,CAAC;AAAA,UACH,WAAW,MAAM,YAAY,+BAA+B,GAAG;AAC7D,kBAAM,MAAM;AAAA,UACd,OAAO;AACL,kCAAsB;AAAA,UACxB;AAAA,QACF,WAAW,SAAS,UAAU;AAC5B,gBAAM,UAAU,MAAM,OAAO,WAAW,GAAG;AAC3C,cAAI,OAAO,YAAY,GAAG;AACxB,2BAAe,OAAO,aAAa;AAAA,cACjC,MAAM,QAAQ,QAAQ;AAAA,cACtB;AAAA,YACF,CAAC;AACD,yBAAa,mBAAmB,KAAK;AACrC,yBAAa,KAAK;AAClB,yBAAa,GAAG,OAAO,OAAO,OAAO,MAAM;AACzC,oCAAsB;AAAA,YACxB,CAAC;AAAA,UACH,OAAO;AACL,kCAAsB;AAAA,UACxB;AAAA,QACF,OAAO;AAEL,gBAAM,MAAM;AAAA,QACd;AAAA,MACF,SAAS,KAAK;AACZ,8BAAsB;AAAA,MACxB;AAEA,aAAO;AAAA,QACL,SAAS;AACP,gBAAM,MAAM,QAAQ;AACpB,gBAAM,MAAM,SAAS;AAAA,QACvB;AAAA,QACA,UAAU;AACR,gBAAM,oBAAoB,SAAS,YAAY;AAC/C,gBAAM,MAAM;AAEZ,cAAI,aAAa;AACf,wBAAY,QAAQ;AAAA,UACtB;AACA,cAAI,cAAc;AAChB,yBAAa,OAAO;AACpB,yBAAa,QAAQ;AAAA,UACvB;AAEA,cAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,0BAAgB,KAAK,UAAU;AAC/B,oBAAU,OAAO;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAeA,eAAe,eAAe,MAAkC;AAC9D,MAAI,CAAC,MAAM;AACT,WAAO,IAAI,WAAW;AAAA,EACxB;AACA,SAAO,IAAI,WAAW,MAAM,KAAK,YAAY,EAAE,MAAM,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC;AAChF;AAEA,SAAS,gBAAgB,MAA8B;AACrD,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,kBAAgB,KAAK,gBAAM,KAAK,MAAM;AACtC,MAAI,KAAK,OAAO;AACd,oBAAgB,KAAK,gBAAM,KAAK,KAAK;AAAA,EACvC;AACA,MAAI,KAAK,SAAS,KAAK,QAAQ;AAC7B,oBAAgB,KAAK,gBAAM,GAAG,KAAK,KAAK,MAAM,KAAK,MAAM,IAAI;AAAA,EAC/D;AACA,MAAI,KAAK,UAAU;AACjB,oBAAgB,KAAK,gBAAM,KAAK,QAAQ;AAAA,EAC1C;AACA,MAAI,KAAK,SAAS;AAChB,oBAAgB,KAAK,gBAAM,KAAK,OAAO;AAAA,EACzC;AACA,MAAI,KAAK,WAAW,QAAW;AAC7B,oBAAgB,KAAK,gBAAM,OAAO,KAAK,MAAM,CAAC;AAAA,EAChD;AACA,MAAI,KAAK,aAAa,QAAW;AAC/B,oBAAgB,KAAK,gBAAM,OAAO,KAAK,QAAQ,CAAC;AAAA,EAClD;AACA,MAAI,KAAK,aAAa,QAAW;AAC/B,oBAAgB,KAAK,gBAAM,OAAO,KAAK,QAAQ,CAAC;AAAA,EAClD;AACA,MAAI,KAAK,MAAM;AACb,oBAAgB,KAAK,gBAAM,KAAK,IAAI;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,QAAqB,OAAe,OAAqB;AAChF,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,YAAY;AACjB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,OAAK,OAAO,KAAK,OAAO;AACxB,SAAO,OAAO,IAAI;AACpB;AAEA,SAAS,eAAe,OAAmB,WAAmB,UAAkB,UAA6B;AAC3G,QAAM,YAAY,aAAa,YAAY,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK,SAAS,YAAY;AAC7F,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,QAAQ,UAAU,MAAM,yDAAY;AAAA,EAC/C;AACA,SAAO,aAAa,KAAK,KAAK,cAAc,KAAK,KAAK,aAAa,KAAK,KAAK,aAAa,KAAK,KAAK,cAAc,KAAK,KAAK;AAAA,IAC1H,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AACF;AAEA,SAAS,aAAa,OAAqC;AACzD,MAAI,MAAM,SAAS,MAAMC,SAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AACxD,WAAO;AAAA,EACT;AACA,QAAM,aAAaA,SAAQ,OAAO,GAAG,CAAC;AACtC,QAAM,OAAkB,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,IAAI,QAAQ,OAAO,OAAO,WAAW;AACnG,QAAM,QAAQ,gBAAgB,OAAO,GAAG,MAAM,MAAM;AACpD,QAAM,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM;AACtD,MAAI,MAAM;AACR,UAAM,WAAW,gBAAgB,OAAO,KAAK,QAAQ,KAAK,YAAY,KAAK,GAAG;AAC9E,UAAM,OAAO,SAAS,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM;AACzD,QAAI,MAAM;AACR,YAAM,WAAW,oBAAoB,OAAO,KAAK,QAAQ,KAAK,UAAU;AACxE,UAAI,aAAa,QAAW;AAC1B,aAAK,WAAW,eAAe,QAAQ;AAAA,MACzC;AAAA,IACF;AACA,UAAM,SAAS,SAAS,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM;AAC7D,SAAK,SAAS,OAAO;AACrB,eAAW,SAAS,QAAQ;AAC1B,YAAM,OAAO,gBAAgB,OAAO,MAAM,QAAQ,MAAM,YAAY,MAAM,GAAG,EAAE,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM;AAClH,UAAI,MAAM;AACR,cAAM,OAAO,gBAAgB,OAAO,KAAK,QAAQ,KAAK,UAAU;AAChE,YAAI,KAAK,SAAS,KAAK,QAAQ;AAC7B,eAAK,QAAQ,KAAK;AAClB,eAAK,SAAS,KAAK;AACnB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AASA,SAAS,gBAAgB,OAAmB,OAAe,KAAwB;AACjF,QAAM,QAAmB,CAAC;AAC1B,MAAI,SAAS;AACb,SAAO,SAAS,KAAK,KAAK;AACxB,QAAI,OAAOC,cAAa,OAAO,MAAM;AACrC,UAAM,OAAOD,SAAQ,OAAO,SAAS,GAAG,CAAC;AACzC,QAAI,aAAa;AACjB,QAAI,SAAS,KAAK,SAAS,MAAM,KAAK;AACpC,aAAO,OAAO,aAAa,OAAO,SAAS,CAAC,CAAC;AAC7C,mBAAa;AAAA,IACf;AACA,QAAI,OAAO,cAAc,SAAS,OAAO,OAAO,CAAC,aAAa,KAAK,IAAI,GAAG;AACxE;AAAA,IACF;AACA,UAAM,KAAK,EAAE,MAAM,OAAO,QAAQ,KAAK,SAAS,MAAM,WAAW,CAAC;AAClE,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAmB,QAAoC;AAClF,MAAI,SAAS,KAAK,MAAM,QAAQ;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,MAAM;AAC5B,MAAI,YAAY,KAAK,SAAS,MAAM,MAAM,QAAQ;AAChD,UAAME,aAAYD,cAAa,OAAO,SAAS,EAAE;AACjD,UAAME,YAAW,aAAa,OAAO,SAAS,EAAE;AAChD,WAAOD,aAAY,OAAOC,SAAQ,IAAID,aAAY;AAAA,EACpD;AACA,QAAM,YAAYD,cAAa,OAAO,SAAS,EAAE;AACjD,QAAM,WAAWA,cAAa,OAAO,SAAS,EAAE;AAChD,SAAO,YAAY,WAAW,YAAY;AAC5C;AAEA,SAAS,gBAAgB,OAAmB,QAAqD;AAC/F,QAAM,UAAU,MAAM,MAAM;AAC5B,QAAM,aAAa,YAAY,IAAI,SAAS,KAAK,SAAS;AAC1D,MAAI,aAAa,IAAI,MAAM,QAAQ;AACjC,WAAO,CAAC;AAAA,EACV;AACA,SAAO;AAAA,IACL,OAAOA,cAAa,OAAO,UAAU,IAAI;AAAA,IACzC,QAAQA,cAAa,OAAO,aAAa,CAAC,IAAI;AAAA,EAChD;AACF;AAEA,SAAS,aAAa,OAAqC;AACzD,MAAI,MAAM,SAAS,MAAMD,SAAQ,OAAO,GAAG,CAAC,MAAM,UAAUA,SAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AAC3F,WAAO;AAAA,EACT;AACA,QAAM,aAAa,UAAU,OAAO,QAAQ,EAAE;AAC9C,MAAI,aAAa,KAAK,aAAa,KAAK,MAAM,QAAQ;AACpD,WAAO,EAAE,QAAQ,OAAO,MAAM,iCAAkB;AAAA,EAClD;AACA,QAAM,mBAAmBI,cAAa,OAAO,aAAa,CAAC;AAC3D,QAAM,iBAAiBA,cAAa,OAAO,aAAa,EAAE;AAC1D,QAAM,cAAcA,cAAa,OAAO,aAAa,EAAE;AACvD,QAAM,UAAUA,cAAa,OAAO,aAAa,EAAE;AACnD,QAAM,QAAQA,cAAa,OAAO,aAAa,EAAE;AACjD,QAAM,SAASA,cAAa,OAAO,aAAa,EAAE;AAClD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,SAAS,iBAAiB,GAAG,KAAK,MAAO,iBAAiB,IAAK,GAAI,CAAC,UAAU;AAAA,IAC9E,UAAU,oBAAoB,cAAc,eAAgB,mBAAmB,cAAe,GAAS,IAAI;AAAA,EAC7G;AACF;AAEA,SAAS,cAAc,OAAqC;AAC1D,MAAI,MAAM,SAAS,KAAK,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,KAAM;AACxG,WAAO;AAAA,EACT;AACA,QAAM,OAAO,oBAAoB,OAAO,GAAG,MAAM,MAAM;AACvD,QAAM,SAAS,KAAK,KAAK,CAAC,YAAY,QAAQ,OAAO,SAAU;AAC/D,QAAM,iBAAiB,SAAS,oBAAoB,OAAO,OAAO,WAAW,OAAO,OAAO,IAAI,CAAC;AAChG,QAAM,eAAe,eAAe,OAAO,eAAe,KAAK,CAAC,YAAY,QAAQ,OAAO,KAAM,CAAC;AAClG,QAAM,UAAU,KAAK,KAAK,CAAC,YAAY,QAAQ,OAAO,SAAU;AAChE,QAAM,kBAAkB,UAAU,oBAAoB,OAAO,QAAQ,WAAW,QAAQ,OAAO,IAAI,CAAC;AACpG,QAAM,OAAO,qBAAqB,OAAO,gBAAgB,KAAK,CAAC,YAAY,QAAQ,OAAO,SAAU,CAAC;AACrG,QAAM,SAAS,gBAAgB,OAAO,gBAAgB,KAAK,CAAC,YAAY,QAAQ,OAAO,SAAU,CAAC;AAClG,QAAM,UAAU,cAAc,YAAY,EAAE,SAAS,MAAM,IACvD,SACA,cAAc,YAAY,EAAE,SAAS,UAAU,IAC7C,aACA;AACN,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,OAAO,OAAO,SAAS,IAAI,OAAO,OAAO,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,IAAI;AAAA,IACzE,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,UAAU,KAAK,aAAa,SAAY,SAAY,eAAe,KAAK,QAAQ;AAAA,IAChF,QAAQ,OAAO,SAAS;AAAA,IACxB,MAAM,eAAe,gBAAgB,YAAY,KAAK;AAAA,EACxD;AACF;AAUA,SAAS,oBAAoB,OAAmB,OAAe,KAAa,QAAQ,KAAoB;AACtG,QAAM,WAA0B,CAAC;AACjC,MAAI,SAAS;AACb,SAAO,SAAS,OAAO,SAAS,SAAS,OAAO;AAC9C,UAAM,KAAK,WAAW,OAAO,QAAQ,GAAG;AACxC,QAAI,CAAC,IAAI;AACP;AAAA,IACF;AACA,UAAM,OAAO,aAAa,OAAO,GAAG,QAAQ,GAAG;AAC/C,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,UAAM,YAAY,KAAK;AACvB,UAAM,UAAU,KAAK,UAAU,MAAM,YAAY,KAAK;AACtD,QAAI,UAAU,aAAa,UAAU,KAAK;AACxC;AAAA,IACF;AACA,aAAS,KAAK;AAAA,MACZ,IAAI,GAAG;AAAA,MACP,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACP,CAAC;AACD,aAAS;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAmB,QAAgB,KAA4D;AACjH,QAAM,SAAS,eAAe,MAAM,MAAM,CAAC;AAC3C,MAAI,CAAC,UAAU,SAAS,KAAK,SAAS,SAAS,KAAK;AAClD,WAAO;AAAA,EACT;AACA,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,QAAQ,SAAS;AAC3C,YAAQ,QAAQ,MAAM,MAAM,SAAS,KAAK;AAAA,EAC5C;AACA,SAAO,EAAE,OAAO,QAAQ,SAAS,OAAO;AAC1C;AAEA,SAAS,aAAa,OAAmB,QAAgB,KAA8E;AACrI,QAAM,SAAS,eAAe,MAAM,MAAM,CAAC;AAC3C,MAAI,CAAC,UAAU,SAAS,KAAK,SAAS,SAAS,KAAK;AAClD,WAAO;AAAA,EACT;AACA,QAAM,YAAY,OAAQ;AAC1B,MAAI,QAAQ,MAAM,MAAM,IAAI;AAC5B,MAAI,MAAM;AACV,WAAS,QAAQ,GAAG,QAAQ,QAAQ,SAAS;AAC3C,YAAQ,QAAQ,MAAM,MAAM,SAAS,KAAK;AAC1C,UAAM,MAAM,MAAM;AAAA,EACpB;AACA,SAAO,EAAE,OAAO,QAAQ,SAAS,QAAQ,SAAS,UAAU,IAAI;AAClE;AAEA,SAAS,eAAe,WAAuC;AAC7D,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AACA,WAAS,SAAS,GAAG,UAAU,GAAG,UAAU;AAC1C,QAAI,YAAa,OAAS,SAAS,GAAK;AACtC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAmB,SAA8C;AAC7F,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AACA,QAAM,WAAW,oBAAoB,OAAO,QAAQ,WAAW,QAAQ,OAAO;AAC9E,QAAM,gBAAgB,aAAa,OAAO,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,OAAQ,CAAC,KAAK;AAC9F,QAAM,WAAW,cAAc,OAAO,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,KAAM,CAAC;AACnF,SAAO;AAAA,IACL,UAAU,aAAa,SAAY,SAAa,WAAW,gBAAiB;AAAA,EAC9E;AACF;AAEA,SAAS,gBAAgB,OAAmB,SAA6F;AACvI,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,EAAE;AAAA,EAChC;AACA,QAAM,eAAe,oBAAoB,OAAO,QAAQ,WAAW,QAAQ,OAAO,EAAE,OAAO,CAAC,UAAU,MAAM,OAAO,GAAI;AACvH,QAAM,SAAmB,CAAC;AAC1B,MAAI;AACJ,MAAI;AACJ,aAAW,SAAS,cAAc;AAChC,UAAM,WAAW,oBAAoB,OAAO,MAAM,WAAW,MAAM,OAAO;AAC1E,UAAM,QAAQ,eAAe,OAAO,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,GAAI,CAAC;AAC/E,QAAI,SAAS,CAAC,OAAO,SAAS,KAAK,GAAG;AACpC,aAAO,KAAK,KAAK;AAAA,IACnB;AACA,UAAM,OAAO,aAAa,OAAO,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,GAAI,CAAC;AAC5E,UAAM,QAAQ,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,GAAI;AACxD,QAAI,SAAS,KAAK,OAAO;AACvB,YAAM,gBAAgB,oBAAoB,OAAO,MAAM,WAAW,MAAM,OAAO;AAC/E,cAAQ,aAAa,OAAO,cAAc,KAAK,CAAC,UAAU,MAAM,OAAO,GAAI,CAAC,KAAK;AACjF,eAAS,aAAa,OAAO,cAAc,KAAK,CAAC,UAAU,MAAM,OAAO,GAAI,CAAC,KAAK;AAAA,IACpF;AAAA,EACF;AACA,SAAO,EAAE,OAAO,aAAa,QAAQ,QAAQ,OAAO,OAAO;AAC7D;AAEA,SAAS,eAAe,OAAmB,SAA2C;AACpF,MAAI,CAAC,WAAW,QAAQ,WAAW,QAAQ,aAAa,QAAQ,UAAU,QAAQ,YAAY,MAAM;AAClG,WAAO;AAAA,EACT;AACA,SAAO,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC,EAAE,OAAO,MAAM,MAAM,QAAQ,WAAW,QAAQ,OAAO,CAAC,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK;AACtI;AAEA,SAAS,aAAa,OAAmB,SAA2C;AAClF,MAAI,CAAC,WAAW,QAAQ,WAAW,QAAQ,aAAa,QAAQ,UAAU,QAAQ,YAAY,GAAG;AAC/F,WAAO;AAAA,EACT;AACA,MAAI,QAAQ;AACZ,WAAS,SAAS,QAAQ,WAAW,SAAS,QAAQ,SAAS,UAAU;AACvE,YAAQ,QAAQ,MAAM,MAAM,MAAM;AAAA,EACpC;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAmB,SAA2C;AACnF,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,OAAO,KAAK,KAAK;AACvB,MAAI,QAAQ,UAAU,QAAQ,cAAc,GAAG;AAC7C,WAAO,KAAK,WAAW,QAAQ,WAAW,KAAK;AAAA,EACjD;AACA,MAAI,QAAQ,UAAU,QAAQ,cAAc,GAAG;AAC7C,WAAO,KAAK,WAAW,QAAQ,WAAW,KAAK;AAAA,EACjD;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAqC;AACzD,QAAM,OAAO,eAAe,KAAK;AACjC,MAAI,CAAC,KAAK,WAAW,SAAS,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,QAAM,WAAW,aAAa,MAAM,aAAa;AACjD,QAAM,WAAW,aAAa,MAAM,uBAAuB;AAC3D,QAAM,YAAY,CAAC,GAAG,KAAK,SAAS,sBAAsB,CAAC,EAAE,IAAI,CAAC,UAAU,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,OAAO,QAAQ;AACpH,QAAM,YAAY,KAAK,MAAM,kBAAkB,IAAI,CAAC;AACpD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,UAAU,UAAU,SAAS,IAAI,eAAe,UAAU,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,CAAC,IAAI;AAAA,IACpG,SAAS,YAAY,GAAG,KAAK,MAAM,OAAO,SAAS,IAAI,GAAI,CAAC,UAAU;AAAA,EACxE;AACF;AAEA,SAAS,cAAc,OAAqC;AAC1D,QAAM,OAAO,eAAe,KAAK;AACjC,MAAI,CAAC,aAAa,KAAK,IAAI,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU,mBAAmB,KAAK,MAAM,6CAA6C,IAAI,CAAC,CAAC;AAAA,IAC3F,UAAU,aAAa,MAAM,qBAAqB;AAAA,IAClD,UAAU,aAAa,MAAM,sBAAsB;AAAA,EACrD;AACF;AAEA,SAAS,eAAe,OAA2B;AACjD,SAAO,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,KAAK,CAAC,CAAC,EAAE,KAAK;AAC/G;AAEA,SAAS,aAAa,OAAe,SAAyB;AAC5D,SAAO,CAAC,GAAG,MAAM,SAAS,OAAO,CAAC,EAAE;AACtC;AAEA,SAAS,mBAAmB,OAAoC;AAC9D,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,MAAM,MAAM,sEAAsE;AAChG,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,UAAU,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,MAAM,CAAC,KAAK,CAAC;AAChG,SAAO,eAAe,OAAO;AAC/B;AAEA,SAAS,eAAe,SAAyB;AAC/C,MAAI,CAAC,OAAO,SAAS,OAAO,KAAK,WAAW,GAAG;AAC7C,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,QAAM,QAAQ,KAAK,MAAM,QAAQ,IAAI;AACrC,QAAM,UAAU,KAAK,MAAO,QAAQ,OAAQ,EAAE;AAC9C,QAAM,OAAO,QAAQ;AACrB,SAAO,QAAQ,IAAI,GAAG,KAAK,IAAI,OAAO,OAAO,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC,KAAK,GAAG,OAAO,IAAI,OAAO,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC;AAClJ;AAEA,SAASJ,SAAQ,OAAmB,QAAgB,QAAwB;AAC1E,MAAI,SAAS,KAAK,SAAS,SAAS,MAAM,QAAQ;AAChD,WAAO;AAAA,EACT;AACA,SAAO,IAAI,YAAY,QAAQ,EAAE,OAAO,MAAM,MAAM,QAAQ,SAAS,MAAM,CAAC;AAC9E;AAEA,SAAS,UAAU,OAAmB,OAAe,QAAQ,GAAW;AACtE,QAAM,UAAU,IAAI,YAAY,EAAE,OAAO,KAAK;AAC9C,WAAS,SAAS,OAAO,SAAS,QAAQ,UAAU,MAAM,QAAQ,UAAU;AAC1E,QAAI,QAAQ,MAAM,CAAC,MAAM,UAAU,MAAM,SAAS,KAAK,MAAM,IAAI,GAAG;AAClE,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,KAAK,OAA6B;AACzC,SAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AACtE;AAEA,SAASI,cAAa,OAAmB,QAAwB;AAC/D,SAAO,KAAK,KAAK,EAAE,UAAU,QAAQ,IAAI;AAC3C;AAEA,SAASH,cAAa,OAAmB,QAAwB;AAC/D,SAAO,KAAK,KAAK,EAAE,UAAU,QAAQ,KAAK;AAC5C;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAQ,OAAOA,cAAa,OAAO,MAAM,CAAC,KAAK,MAAO,OAAOA,cAAa,OAAO,SAAS,CAAC,CAAC;AAC9F;;;AC3mBA,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,cAA6B;AAC3C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,KAAK,SAAS,WAAW,QAAQ,KAAK,gBAAgB,IAAI,KAAK,SAAS;AAAA,IACjF;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AACvC,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AACpB,YAAM,QAAQ,MAAM,eAAe,IAAI,KAAK,IAAI;AAEhD,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,cAAc,IAAI,KAAK;AAE7B,YAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,YAAM,MAAM;AACZ,YAAM,WAAW;AACjB,YAAM,UAAU;AAEhB,cAAQ,OAAO,OAAO,OAAO,gBAAgB,eAAe,OAAO,IAAI,KAAK,WAAW,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC1G,UAAI,SAAS,UAAU,IAAI,YAAY;AACvC,UAAI,SAAS,OAAO,OAAO;AAE3B,YAAM,eAAe,IAAI,KAAK,aAAa,IAAI,KAAK,YAAY,SAAS,YAAY;AACrF,YAAM,uBAAuB,MAAM;AACjC,cAAM,MAAM;AACZ,cAAM,OAAO;AAEb,YAAI,QAAQ,cAAc,eAAe,GAAG;AAC1C;AAAA,QACF;AAEA,cAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,iBAAS,YAAY;AAErB,cAAM,gBAAgB,SAAS,cAAc,QAAQ;AACrD,sBAAc,cAAc,2GAAsB,WAAW;AAE7D,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,cAAc;AAEnB,cAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,iBAAS,OAAO;AAChB,iBAAS,WAAW,IAAI,KAAK;AAC7B,iBAAS,cAAc;AAEvB,iBAAS,OAAO,eAAe,MAAM,QAAQ;AAC7C,gBAAQ,OAAO,QAAQ;AAAA,MACzB;AAEA,YAAM,iBAAiB,SAAS,oBAAoB;AAEpD,aAAO;AAAA,QACL,UAAU;AACR,gBAAM,oBAAoB,SAAS,oBAAoB;AACvD,gBAAM,MAAM;AACZ,cAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,0BAAgB,KAAK,UAAU;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAcA,eAAe,eAAe,MAAkC;AAC9D,MAAI,CAAC,MAAM;AACT,WAAO,IAAI,WAAW;AAAA,EACxB;AACA,SAAO,IAAI,WAAW,MAAM,KAAK,YAAY,EAAE,MAAM,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC;AAChF;AAEA,SAAS,gBAAgB,MAA8B;AACrD,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,EAAAI,iBAAgB,KAAK,gBAAM,KAAK,MAAM;AACtC,MAAI,KAAK,OAAO;AACd,IAAAA,iBAAgB,KAAK,gBAAM,KAAK,KAAK;AAAA,EACvC;AACA,MAAI,KAAK,YAAY;AACnB,IAAAA,iBAAgB,KAAK,sBAAO,GAAG,KAAK,UAAU,KAAK;AAAA,EACrD;AACA,MAAI,KAAK,UAAU;AACjB,IAAAA,iBAAgB,KAAK,gBAAM,OAAO,KAAK,QAAQ,CAAC;AAAA,EAClD;AACA,MAAI,KAAK,UAAU;AACjB,IAAAA,iBAAgB,KAAK,gBAAM,GAAG,KAAK,QAAQ,MAAM;AAAA,EACnD;AACA,MAAI,KAAK,SAAS;AAChB,IAAAA,iBAAgB,KAAK,gBAAM,KAAK,OAAO;AAAA,EACzC;AACA,MAAI,KAAK,UAAU;AACjB,IAAAA,iBAAgB,KAAK,gBAAM,KAAK,QAAQ;AAAA,EAC1C;AACA,MAAI,KAAK,MAAM;AACb,IAAAA,iBAAgB,KAAK,gBAAM,KAAK,IAAI;AAAA,EACtC;AACA,MAAI,KAAK,MAAM;AACb,IAAAA,iBAAgB,KAAK,gBAAM,KAAK,IAAI;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAASA,iBAAgB,QAAqB,OAAe,OAAqB;AAChF,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,YAAY;AACjB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,OAAK,OAAO,KAAK,OAAO;AACxB,SAAO,OAAO,IAAI;AACpB;AAEA,SAAS,eAAe,OAAmB,WAAmB,UAA6B;AACzF,QAAM,YAAY,aAAa,YAAY,SAAS,YAAY;AAChE,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,QAAQ,UAAU,MAAM,yDAAY;AAAA,EAC/C;AACA,SAAO,cAAc,KAAK,KAAK,cAAc,KAAK,KAAK,aAAa,KAAK,KAAK,cAAc,KAAK,KAAK,YAAY,KAAK,KAAK,cAAc,KAAK,KAAK,gBAAgB,KAAK,KAAK;AAAA,IAC5K,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AACF;AAEA,SAAS,cAAc,OAAqC;AAC1D,MAAI,MAAM,SAAS,MAAMC,SAAQ,OAAO,GAAG,CAAC,MAAM,UAAUA,SAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AAC3F,WAAO;AAAA,EACT;AACA,MAAI,SAAS;AACb,MAAI,WAAW;AACf,MAAI,aAAa;AACjB,MAAI,WAAW;AACf,MAAI,WAAW;AACf,MAAI,YAAY;AAChB,SAAO,SAAS,KAAK,MAAM,QAAQ;AACjC,UAAM,QAAQA,SAAQ,OAAO,QAAQ,CAAC;AACtC,UAAM,OAAOC,cAAa,OAAO,SAAS,CAAC;AAC3C,UAAM,aAAa,SAAS;AAC5B,QAAI,UAAU,UAAU,aAAa,MAAM,MAAM,QAAQ;AACvD,iBAAWC,cAAa,OAAO,aAAa,CAAC;AAC7C,mBAAaD,cAAa,OAAO,aAAa,CAAC;AAC/C,iBAAWA,cAAa,OAAO,aAAa,CAAC;AAC7C,iBAAWC,cAAa,OAAO,aAAa,EAAE;AAAA,IAChD;AACA,QAAI,UAAU,QAAQ;AACpB,kBAAY;AAAA,IACd;AACA,cAAU,IAAI,OAAQ,OAAO;AAAA,EAC/B;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,WAAW,GAAG,KAAK,MAAO,WAAW,IAAK,GAAI,CAAC,UAAU;AAAA,IAClE,UAAU,YAAY,YAAYC,gBAAe,YAAY,QAAQ,IAAI;AAAA,EAC3E;AACF;AAEA,SAAS,cAAc,OAAqC;AAC1D,MAAI,MAAM,SAAS,MAAMH,SAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AACxD,WAAO;AAAA,EACT;AACA,MAAI,SAAS;AACb,SAAO,SAAS,KAAK,MAAM,QAAQ;AACjC,UAAM,OAAO,MAAM,MAAM,IAAI;AAC7B,UAAM,SAAU,MAAM,SAAS,CAAC,KAAK,KAAO,MAAM,SAAS,CAAC,KAAK,IAAK,MAAM,SAAS,CAAC;AACtF,UAAM,aAAa,SAAS;AAC5B,QAAI,SAAS,KAAK,aAAa,MAAM,MAAM,QAAQ;AACjD,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,MAAM,MAAM,aAAa,EAAE;AACjC,YAAM,aAAc,OAAO,KAAO,OAAO,KAAO,MAAM,QAAS;AAC/D,YAAM,aAAa,MAAM,OAAS,KAAK;AACvC,YAAM,aAAc,MAAM,MAAS,KAAO,MAAM,QAAS,KAAM;AAC/D,YAAM,eAAiB,OAAO,MAAM,EAAI,KAAK,MAAQ,OAAO,GAAG,KAAK,MAAQ,OAAO,GAAG,KAAK,MAAQ,OAAO,GAAG,KAAK,KAAM,OAAO,GAAG;AAClI,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,cAAc,eAAe,KAAKG,gBAAe,OAAO,YAAY,IAAI,UAAU,IAAI;AAAA,MAClG;AAAA,IACF;AACA,cAAU,IAAI;AAAA,EAChB;AACA,SAAO,EAAE,QAAQ,QAAQ,OAAO,QAAQ,MAAM,+CAAgC;AAChF;AAEA,SAAS,gBAAgB,OAAqC;AAC5D,MAAI,SAAS;AACb,MAAI;AACJ,MAAI,MAAM,UAAU,MAAMH,SAAQ,OAAO,GAAG,CAAC,MAAM,OAAO;AACxD,WAAO,SAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AACpC,aAAS,KAAK,cAAc,OAAO,CAAC;AAAA,EACtC;AACA,WAAS,QAAQ,QAAQ,QAAQ,IAAI,KAAK,IAAI,MAAM,QAAQ,SAAS,IAAI,GAAG,SAAS;AACnF,QAAI,MAAM,KAAK,MAAM,QAAS,MAAM,QAAQ,CAAC,IAAI,SAAU,KAAM;AAC/D,YAAM,cAAe,MAAM,QAAQ,CAAC,KAAK,IAAK;AAC9C,YAAM,YAAa,MAAM,QAAQ,CAAC,KAAK,IAAK;AAC5C,YAAM,eAAgB,MAAM,QAAQ,CAAC,KAAK,IAAK;AAC/C,YAAM,cAAe,MAAM,QAAQ,CAAC,KAAK,IAAK;AAC9C,YAAM,cAAe,MAAM,QAAQ,CAAC,KAAK,IAAK;AAC9C,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO,GAAG,YAAY,WAAW,CAAC,UAAU,UAAU,SAAS,CAAC;AAAA,QAChE,YAAY,cAAc,aAAa,WAAW;AAAA,QAClD,UAAU,gBAAgB,IAAI,IAAI;AAAA,QAClC,SAAS,WAAW,aAAa,WAAW,YAAY;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,OAAO,EAAE,QAAQ,OAAO,MAAM,MAAM,wDAAqB,IAAI;AACtE;AAEA,SAAS,aAAa,OAAqC;AACzD,MAAI,MAAM,SAAS,MAAMA,SAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AACxD,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,gBAAgB,KAAK;AACnC,QAAM,cAAc,MAAM,CAAC,GAAG,QAAQ,CAAC;AACvC,QAAM,cAAc,CAAC,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE,GAAG;AAC5E,MAAI,eAAeA,SAAQ,aAAa,GAAG,CAAC,MAAM,YAAY;AAC5D,UAAM,UAAU,YAAY,UAAU,KAAKE,cAAa,aAAa,EAAE,IAAI;AAC3E,UAAM,aAAa,YAAY,UAAU,KAAKD,cAAa,aAAa,EAAE,IAAI;AAC9E,UAAM,eAAe,gBAAgB,SAAY,SAAY,cAAc,OAAO,OAAO;AACzF,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU,YAAY,CAAC;AAAA,MACvB;AAAA,MACA,UAAU,iBAAiB,UAAa,eAAe,KAAKE,gBAAe,OAAO,YAAY,IAAI,IAAK,IAAI;AAAA,MAC3G,MAAM,GAAG,MAAM,MAAM;AAAA,IACvB;AAAA,EACF;AACA,MAAI,eAAe,YAAY,CAAC,MAAM,KAAQH,SAAQ,aAAa,GAAG,CAAC,MAAM,UAAU;AACrF,UAAM,aAAa,YAAY,UAAU,KAAKC,cAAa,aAAa,EAAE,IAAI;AAC9E,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU,YAAY,EAAE;AAAA,MACxB;AAAA,MACA,SAAS,YAAY,UAAU,KAAK,iBAAiB,WAAW,IAAI;AAAA,MACpE,UAAU,cAAc,gBAAgB,UAAa,cAAc,KAAKE,gBAAe,OAAO,WAAW,IAAI,UAAU,IAAI;AAAA,MAC3H,MAAM,GAAG,MAAM,MAAM;AAAA,IACvB;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,OAAO,MAAM,MAAM,SAAS,IAAI,4CAAwB,MAAM,MAAM,YAAO,sCAAuB;AACrH;AAOA,SAAS,gBAAgB,OAA8B;AACrD,QAAM,QAAmB,CAAC;AAC1B,MAAI,SAAS;AACb,MAAI,kBAA4B,CAAC;AACjC,SAAO,SAAS,MAAM,MAAM,UAAUH,SAAQ,OAAO,QAAQ,CAAC,MAAM,QAAQ;AAC1E,UAAM,eAAe,MAAM,SAAS,EAAE;AACtC,UAAM,qBAAqB,SAAS;AACpC,UAAM,aAAa,qBAAqB;AACxC,QAAI,aAAa,MAAM,QAAQ;AAC7B;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,oBAAoB,UAAU,CAAC;AACpE,UAAM,gBAAgB,MAAM,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AACjE,UAAM,aAAa,aAAa;AAChC,QAAI,aAAa,MAAM,QAAQ;AAC7B;AAAA,IACF;AACA,UAAM,cAA4B,CAAC;AACnC,QAAI,eAAe;AACnB,eAAW,QAAQ,OAAO;AACxB,sBAAgB,KAAK,GAAG,MAAM,MAAM,cAAc,eAAe,IAAI,CAAC;AACtE,sBAAgB;AAChB,UAAI,OAAO,KAAK;AACd,oBAAY,KAAK,IAAI,WAAW,eAAe,CAAC;AAChD,0BAAkB,CAAC;AAAA,MACrB;AAAA,IACF;AACA,UAAM,KAAK;AAAA,MACT,SAAS,aAAa,OAAO,SAAS,CAAC;AAAA,MACvC,SAAS;AAAA,IACX,CAAC;AACD,aAAS;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAAwC;AAChE,QAAM,UAAUC,cAAa,QAAQ,EAAE;AACvC,MAAI,UAAU,GAAG;AACf,WAAO,GAAG,KAAK,MAAM,UAAU,GAAI,CAAC;AAAA,EACtC;AACA,QAAM,QAAQA,cAAa,QAAQ,EAAE;AACrC,QAAM,QAAQA,cAAa,QAAQ,EAAE;AACrC,MAAI,QAAQ,KAAK,QAAQ,GAAG;AAC1B,WAAO,GAAG,KAAK,OAAQ,QAAQ,SAAS,IAAK,GAAI,CAAC;AAAA,EACpD;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAqC;AAC1D,MAAI,MAAM,SAAS,MAAMD,SAAQ,OAAO,GAAG,CAAC,MAAM,UAAU,CAAC,CAAC,QAAQ,MAAM,EAAE,SAASA,SAAQ,OAAO,GAAG,CAAC,CAAC,GAAG;AAC5G,WAAO;AAAA,EACT;AACA,QAAM,SAASA,SAAQ,OAAO,GAAG,CAAC;AAClC,MAAI,SAAS;AACb,SAAO,SAAS,MAAM,MAAM,QAAQ;AAClC,UAAM,QAAQA,SAAQ,OAAO,QAAQ,CAAC;AACtC,UAAM,OAAOI,cAAa,OAAO,SAAS,CAAC;AAC3C,QAAI,UAAU,QAAQ;AACpB,aAAO;AAAA,QACL;AAAA,QACA,UAAU,aAAa,OAAO,SAAS,CAAC;AAAA,QACxC,UAAU,aAAa,OAAO,SAAS,EAAE;AAAA,QACzC,YAAY,KAAK,MAAM,iBAAiB,OAAO,SAAS,EAAE,CAAC;AAAA,MAC7D;AAAA,IACF;AACA,cAAU,IAAI,OAAQ,OAAO;AAAA,EAC/B;AACA,SAAO,EAAE,QAAQ,MAAM,gCAAiB;AAC1C;AAEA,SAAS,YAAY,OAAqC;AACxD,MAAI,MAAM,SAAS,MAAMJ,SAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AACxD,WAAO;AAAA,EACT;AACA,QAAM,aAAaI,cAAa,OAAO,CAAC;AACxC,QAAM,WAAWA,cAAa,OAAO,CAAC;AACtC,QAAM,WAAWA,cAAa,OAAO,EAAE;AACvC,QAAM,aAAaA,cAAa,OAAO,EAAE;AACzC,QAAM,WAAWA,cAAa,OAAO,EAAE;AACvC,QAAM,WAAW,WAAW,QAAQ;AACpC,QAAM,iBAAiB,WAAW,WAAW,IAAI;AACjD,QAAM,mBAAmB,aAAa,aAAa,KAAK,IAAI,GAAG,MAAM,SAAS,UAAU,IAAI;AAC5F,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,eAAe,QAAQ;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,cAAc,YAAY,kBAAkB,mBAAmBD,gBAAe,oBAAoB,aAAa,WAAW,eAAe,IAAI;AAAA,IACvJ,MAAM,UAAU,UAAU;AAAA,EAC5B;AACF;AAEA,SAAS,eAAe,OAAuB;AAC7C,QAAM,QAAgC;AAAA,IACpC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AACA,SAAO,MAAM,KAAK,KAAK,YAAY,KAAK;AAC1C;AAEA,SAAS,WAAW,OAAmC;AACrD,QAAM,SAAiC;AAAA,IACrC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,EACN;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,cAAc,OAAqC;AAC1D,MAAI,MAAM,SAAS,MAAMH,SAAQ,OAAO,GAAG,CAAC,MAAM,QAAQ;AACxD,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,OAAO,aAAa,OAAO,CAAC,CAAC;AAAA,IACpC,UAAU,aAAa,OAAO,EAAE;AAAA,IAChC,MAAM,GAAG,aAAa,OAAO,EAAE,CAAC;AAAA,EAClC;AACF;AAEA,SAASG,gBAAe,SAAyB;AAC/C,MAAI,CAAC,OAAO,SAAS,OAAO,KAAK,WAAW,GAAG;AAC7C,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,QAAM,UAAU,KAAK,MAAM,QAAQ,EAAE;AACrC,QAAM,OAAO,QAAQ;AACrB,SAAO,GAAG,OAAO,IAAI,OAAO,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC;AACpD;AAEA,SAASH,SAAQ,OAAmB,QAAgB,QAAwB;AAC1E,MAAI,SAAS,KAAK,SAAS,SAAS,MAAM,QAAQ;AAChD,WAAO;AAAA,EACT;AACA,SAAO,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,QAAQ,SAAS,MAAM,CAAC;AAC7E;AAEA,SAASK,MAAK,OAA6B;AACzC,SAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AACtE;AAEA,SAASH,cAAa,OAAmB,QAAwB;AAC/D,SAAOG,MAAK,KAAK,EAAE,UAAU,QAAQ,IAAI;AAC3C;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAOA,MAAK,KAAK,EAAE,UAAU,QAAQ,KAAK;AAC5C;AAEA,SAASJ,cAAa,OAAmB,QAAwB;AAC/D,SAAOI,MAAK,KAAK,EAAE,UAAU,QAAQ,IAAI;AAC3C;AAEA,SAASD,cAAa,OAAmB,QAAwB;AAC/D,SAAOC,MAAK,KAAK,EAAE,UAAU,QAAQ,KAAK;AAC5C;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAQ,OAAOJ,cAAa,OAAO,SAAS,CAAC,CAAC,KAAK,MAAO,OAAOA,cAAa,OAAO,MAAM,CAAC;AAC9F;AAEA,SAAS,cAAc,OAAmB,QAAwB;AAChE,UAAS,MAAM,MAAM,IAAI,QAAS,MAAQ,MAAM,SAAS,CAAC,IAAI,QAAS,MAAQ,MAAM,SAAS,CAAC,IAAI,QAAS,IAAM,MAAM,SAAS,CAAC,IAAI;AACxI;AAEA,SAAS,YAAY,MAAsB;AACzC,SAAO,SAAS,IAAI,WAAW,SAAS,IAAI,WAAW,SAAS,IAAI,aAAa;AACnF;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,SAAS,IAAI,MAAM,SAAS,IAAI,OAAO,SAAS,IAAI,QAAQ;AACrE;AAEA,SAAS,cAAc,aAAqB,OAAmC;AAC7E,QAAM,QAAQ,gBAAgB,IAAI,CAAC,OAAO,MAAO,IAAK,IAAI,gBAAgB,IAAI,CAAC,OAAO,MAAO,IAAK,IAAI,CAAC,OAAO,MAAO,GAAI;AACzH,SAAO,MAAM,KAAK;AACpB;AAEA,SAAS,WAAW,aAAqB,WAAmB,OAAmC;AAC7F,QAAM,cAAc,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AACrF,QAAM,cAAc,CAAC,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,GAAG;AACjF,MAAI,SAAS,KAAK,SAAS,MAAM,cAAc,GAAG;AAChD,WAAO;AAAA,EACT;AACA,SAAO,IAAI,gBAAgB,IAAI,cAAc,aAAa,KAAK,CAAC;AAClE;AAEA,SAAS,iBAAiB,OAAmB,QAAwB;AACnE,QAAM,WAAW,aAAa,OAAO,MAAM,IAAI;AAC/C,MAAI,WAAW;AACf,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS;AACtC,eAAW,WAAW,MAAM,MAAM,SAAS,IAAI,KAAK;AAAA,EACtD;AACA,SAAO,WAAW,KAAK,IAAI,GAAG,WAAW,QAAQ,EAAE;AACrD;;;AC/fA,IAAM,UAAkC;AAAA,EACtC,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AAAA,EACH,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,GAAG;AAAA,EACH,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,UAAU;AACZ;AACA,IAAM,kBAA0C;AAAA,EAC9C,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA,EACb,aAAa;AAAA,EACb,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AACd;AACA,IAAM,cAAsC;AAAA,EAC1C,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,mBAAmB;AAAA,EACnB,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,YAAY;AACd;AAEA,IAAM,sBAAsB;AAC5B,IAAM,mBAAmB;AAEzB,SAAS,aAAa,OAAwC;AAC5D,QAAM,UAAU;AAChB,QAAM,SAAS;AAEf,QAAM,WAAW,UAAU,SAAS,SAAS;AAC7C,QAAM,aAAa,UAAU,SAAS,UAAU;AAEhD,WAAS,eAAe,UAAU,GAAG,OAAO;AAE5C,MAAI,SAAS,eAAe,QAAQ,GAAG;AACrC,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAEA,QAAM,OACJ,UAAU,SACN,8EACA;AAEN,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,KAAK;AACV,SAAK,MAAM;AACX,SAAK,OAAO;AACZ,SAAK,SAAS,MAAM,QAAQ;AAC5B,SAAK,UAAU,MAAM,OAAO,IAAI,MAAM,6BAA6B,IAAI,EAAE,CAAC;AAC1E,aAAS,KAAK,YAAY,IAAI;AAAA,EAChC,CAAC;AACH;AAEO,SAAS,aAA4B;AAC1C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,WAAW,IAAI;AAAA,IACxB;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,MAAM,IAAI,KAAK,UAAU,YAAY;AAC3C,YAAM,OAAO,gBAAgB,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,QAAQ;AAClE,YAAM,iBAAiB,SAAS;AAChC,YAAM,aAAa,SAAS;AAC5B,YAAM,OAAO,MAAM,SAAS,IAAI,KAAK,MAAM,EAAE,MAAM,CAAC,UAAmB,MAAS;AAChF,UAAI,SAAS,QAAW;AACtB,cAAM,WAAW,mBAAmB,IAAI,KAAK,MAAM,IAAI,KAAK,GAAG;AAC/D,YAAI,SAAS,UAAU,IAAI,YAAY;AACvC,YAAI,SAAS,OAAO,QAAQ;AAC5B,eAAO;AAAA,UACL,UAAU;AACR,gBAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,qBAAS,OAAO;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAGA,YAAM,SACJ,IAAI,KAAK,eAAe,UAAU,SAAS,gBAAgB,KAC3D,SAAS,KAAK,UAAU,SAAS,gBAAgB,KAChD,IAAI,QAAQ,UAAU,UAAU,OAAO,aAAa,8BAA8B,EAAE,WACrF,IAAI,QAAQ,UAAU;AAGxB,UAAI,YAAY;AACd,cAAM,CAAC,cAAcK,cAAa,eAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,UACrE,OAAO,QAAQ;AAAA,UACf,OAAO,SAAS;AAAA,UAChB,OAAO,WAAW;AAAA,QACpB,CAAC;AAED,cAAM,gBACJ,aAAa,QAAQ,SAAS,aAAa,SAAU,aAAqB,SAAS;AACrF,cAAMC,SAAQD,aAAY,WAAWA;AACrC,cAAME,aAAY,gBAAgB,WAAW;AAE7C,cAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,kBAAU,YAAY;AACtB,kBAAU,YAAYA,WAAU,SAAS,cAAc,IAAI,GAAG;AAAA,UAC5D,cAAc,EAAE,MAAM,KAAK;AAAA,UAC3B,UAAU,CAAC,QAAQ;AAAA,QACrB,CAAC;AACD,4BAAoB,SAAS;AAC7B,YAAI,SAAS,YAAY,SAAS;AAGlC,YAAI;AACF,gBAAM,aAAa,UAAU,iBAAiB,UAAU;AACxD,cAAI,WAAW,SAAS,GAAG;AACzB,kBAAM,aAAa,SAAS,SAAS,OAAO;AAC5C,uBAAW,QAAQ,CAAC,UAAU;AAC5B,oBAAM,SAAS,MAAM;AACrB,kBAAI,UAAU,CAAC,OAAO,UAAU,SAAS,WAAW,GAAG;AACrD,uBAAO,YAAY;AAAA,cACrB;AACA,cAAAD,OAAM,iBAAiB,KAAK;AAAA,YAC9B,CAAC;AAAA,UACH;AAAA,QACF,SAAS,GAAG;AACV,kBAAQ,KAAK,wCAAwC,CAAC;AAAA,QACxD;AAEA,eAAO;AAAA,UACL,UAAU;AACR,sBAAU,OAAO;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAGA,YAAM,CAAC,WAAW,IAAI,MAAM,QAAQ,IAAI,CAAC,OAAO,SAAS,CAAC,CAAC;AAC3D,YAAM,QAAQ,YAAY,WAAW;AAGrC,UAAI,SAAS,QAAQ;AACnB,YAAI;AACF,cAAI,SAAS,gBAAgB,SAAS,OAAO;AAC3C,kBAAM,OAAO,qCAAqC;AAAA,UACpD,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,SAAS;AAC3B,kBAAM,OAAO,gCAAgC;AAAA,UAC/C,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,8BAA8B;AAAA,UAC7C,WAAW,SAAS,cAAc;AAChC,kBAAM,OAAO,qCAAqC;AAAA,UACpD,WAAW,SAAS,gBAAgB;AAClC,kBAAM,OAAO,uCAAuC;AAAA,UACtD,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,YAAY;AAC9B,kBAAM,OAAO,mCAAmC;AAAA,UAClD,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,8BAA8B;AAAA,UAC7C,WAAW,SAAS,SAAS;AAC3B,kBAAM,OAAO,gCAAgC;AAAA,UAC/C,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,8BAA8B;AAAA,UAC7C,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,cAAc;AAChC,kBAAM,OAAO,qCAAqC;AAAA,UACpD,WAAW,SAAS,SAAS;AAC3B,kBAAM,OAAO,gCAAgC;AAAA,UAC/C,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,YAAY;AAC9B,kBAAM,OAAO,mCAAmC;AAAA,UAClD,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,SAAS;AAC3B,kBAAM,OAAO,gCAAgC;AAAA,UAC/C,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,WAAW;AAC7B,kBAAM,OAAO,kCAAkC;AAAA,UACjD,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,MAAM;AACxB,kBAAM,OAAO,6BAA6B;AAAA,UAC5C,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,SAAS;AAC3B,kBAAM,OAAO,gCAAgC;AAAA,UAC/C,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,SAAS;AAC3B,kBAAM,OAAO,gCAAgC;AAAA,UAC/C,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,8BAA8B;AAAA,UAC7C,WAAW,SAAS,KAAK;AACvB,kBAAM,OAAO,4BAA4B;AAAA,UAC3C,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,8BAA8B;AAAA,UAC7C,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,WAAW;AAC7B,kBAAM,OAAO,kCAAkC;AAAA,UACjD,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,UAAU;AAC5B,kBAAM,OAAO,iCAAiC;AAAA,UAChD,WAAW,SAAS,WAAW;AAC7B,kBAAM,OAAO,kCAAkC;AAAA,UACjD,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,8BAA8B;AAAA,UAC7C,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,4BAA4B;AACzC,kBAAM,OAAO,8BAA8B;AAAA,UAC7C,WAAW,SAAS,QAAQ;AAC1B,kBAAM,OAAO,+BAA+B;AAAA,UAC9C,WAAW,SAAS,OAAO;AACzB,kBAAM,OAAO,4CAA4C;AACzD,kBAAM,OAAO,8BAA8B;AAAA,UAC7C;AAAA,QACF,SAAS,GAAG;AACV,kBAAQ,KAAK,gDAAgD,IAAI,IAAI,CAAC;AAAA,QACxE;AAAA,MACF;AAEA,YAAM,aAAa,SAAS,SAAS,OAAO,EAAE,MAAM,CAAC,UAAU;AAC7D,gBAAQ,KAAK,oEAAoE,KAAK;AAAA,MACxF,CAAC;AAED,YAAM,WAAW,KAAK,SAAS,mBAAmB,KAAK,MAAM,GAAG,gBAAgB,IAAI;AACpF,YAAM,aAAa,WAAW,IAAI;AAClC,YAAM,aAAa,WAAW,QAAQ;AACtC,YAAM,YAAY,SAAS,SAAS,KAAK;AACzC,YAAM,kBAAkB,SAAS,UAAU;AAC3C,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AACpB,UAAI,WAAW;AACb,gBAAQ,UAAU,IAAI,cAAc;AAAA,MACtC;AACA,UAAI,gBAAgB;AAClB,gBAAQ,UAAU,IAAI,YAAY;AAAA,MACpC;AAEA,YAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,aAAO,YAAY;AAEnB,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,WAAW,SAAS,cAAc,QAAQ;AAChD,eAAS,cAAc,IAAI,KAAK;AAChC,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,cAAc;AAAA,QACjB,SAAS,SAAS,eAAe;AAAA,QACjC,GAAG,WAAW,eAAe,CAAC;AAAA,QAC9B,YAAY,IAAI,KAAK,SAAS,IAAI,KAAK,kBAAkB,OAAO,IAAI,KAAK,OAAO,OAAO,KAAK,OAAO;AAAA,MACrG,EAAE,KAAK,QAAK;AACZ,YAAM,OAAO,UAAU,IAAI;AAE3B,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AAEpB,YAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,aAAO,YAAY;AACnB,aAAO,aAAa,QAAQ,QAAQ;AAEpC,YAAM,aAAa,SAAS,cAAc,QAAQ;AAClD,iBAAW,OAAO;AAClB,iBAAW,YAAY;AACvB,iBAAW,cAAc;AACzB,iBAAW,aAAa,gBAAgB,OAAO,cAAc,CAAC;AAC9D,iBAAW,iBAAiB,SAAS,MAAM;AACzC,cAAM,UAAU,QAAQ,UAAU,OAAO,YAAY;AACrD,mBAAW,aAAa,gBAAgB,OAAO,OAAO,CAAC;AAAA,MACzD,CAAC;AAED,YAAM,aAAa,SAAS,cAAc,QAAQ;AAClD,iBAAW,OAAO;AAClB,iBAAW,YAAY;AACvB,iBAAW,cAAc;AACzB,iBAAW,iBAAiB,SAAS,YAAY;AAC/C,mBAAW,WAAW;AACtB,YAAI;AACF,gBAAM,gBAAgB,IAAI;AAC1B,iBAAO,cAAc;AAAA,QACvB,QAAQ;AACN,iBAAO,cAAc;AAAA,QACvB,UAAE;AACA,qBAAW,WAAW;AAAA,QACxB;AAAA,MACF,CAAC;AAED,YAAM,iBAAiB,SAAS,cAAc,QAAQ;AACtD,qBAAe,OAAO;AACtB,qBAAe,YAAY;AAC3B,qBAAe,cAAc;AAC7B,qBAAe,iBAAiB,SAAS,MAAM;AAC7C,qBAAa,IAAI,KAAK,MAAM,IAAI;AAChC,eAAO,cAAc;AAAA,MACvB,CAAC;AAED,cAAQ,OAAO,YAAY,YAAY,gBAAgB,MAAM;AAC7D,aAAO,OAAO,OAAO,OAAO;AAC5B,YAAM,mBAAmB,2BAA2B,MAAM,KAAK,MAAM,IAAI,KAAK,QAAQ;AAEtF,YAAM,OAAO,SAAS,cAAc,KAAK;AACzC,WAAK,YAAY;AAEjB,YAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,aAAO,YAAY;AACnB,aAAO,aAAa,eAAe,MAAM;AACzC,aAAO,cAAc,kBAAkB,UAAU;AAEjD,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,YAAY,YAAY,IAAI;AAEhC,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,YAAY,YAAY,IAAI;AACjC,WAAK,cAAc;AAEnB,UAAI,YAAY,IAAI;AACpB,WAAK,OAAO,QAAQ,GAAG;AACvB,cAAQ,OAAO,MAAM;AACrB,UAAI,kBAAkB;AACpB,gBAAQ,OAAO,gBAAgB;AAAA,MACjC;AACA,UAAI,WAAW;AACb,cAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,eAAO,YAAY;AACnB,eAAO,cAAc,gEAAc,YAAY,SAAS,MAAM,CAAC;AAC/D,gBAAQ,OAAO,MAAM;AAAA,MACvB;AACA,UAAI,CAAC,iBAAiB;AACpB,cAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,eAAO,YAAY;AACnB,eAAO,cAAc;AACrB,gBAAQ,OAAO,MAAM;AAAA,MACvB;AACA,cAAQ,YAAY,IAAI;AACxB,UAAI,SAAS,YAAY,OAAO;AAEhC,UAAI,iBAAiB;AACnB,YAAI;AACF,gBAAM,iBAAiB,IAAI;AAAA,QAC7B,SAAS,KAAK;AACZ,kBAAQ,MAAM,qCAAqC,GAAG;AAAA,QACxD;AAAA,MACF;AAEA,aAAO;AAAA,QACL,UAAU;AACR,kBAAQ,OAAO;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,UAAkB,WAAmB,UAA0B;AACtF,QAAM,qBAAqBE,mBAAkB,QAAQ;AACrD,SACE,QAAQ,SAAS,KACjB,gBAAgB,kBAAkB,KAClC,gBAAgB,mBAAmB,MAAM,GAAG,EAAE,CAAC,CAAC,KAChD,YAAY,SAAS,YAAY,CAAC,KAClC;AAEJ;AAEA,SAASA,mBAAkB,MAAsB;AAC/C,QAAM,WAAW,KAAK,MAAM,OAAO,EAAE,IAAI,KAAK;AAC9C,SAAO,SAAS,YAAY;AAC9B;AAEA,SAAS,mBAAmB,UAAkB,KAA2B;AACvE,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AAErB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AAEpB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc;AAEnB,WAAS,OAAO,OAAO,IAAI;AAC3B,MAAI,KAAK;AACP,UAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,aAAS,OAAO;AAChB,aAAS,WAAW;AACpB,aAAS,cAAc;AACvB,aAAS,OAAO,QAAQ;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,WAA8B;AACzD,aAAW,QAAQ,UAAU,iBAAoC,SAAS,GAAG;AAC3E,UAAM,OAAO,KAAK,aAAa,MAAM,KAAK;AAC1C,QAAI,CAAC,mBAAmB,IAAI,GAAG;AAC7B,WAAK,gBAAgB,MAAM;AAC3B,WAAK,gBAAgB,QAAQ;AAC7B,WAAK,gBAAgB,KAAK;AAC1B;AAAA,IACF;AACA,QAAI,mBAAmB,KAAK,IAAI,GAAG;AACjC,WAAK,SAAS;AACd,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAAuB;AACjD,QAAM,UAAU,KAAK,KAAK;AAC1B,SACE,QAAQ,WAAW,GAAG,KACtB,QAAQ,WAAW,GAAG,KACtB,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,KAAK,KACxB,2BAA2B,KAAK,OAAO;AAE3C;AAEA,SAAS,WAAW,MAAsB;AACxC,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,SAAO,KAAK,MAAM,YAAY,EAAE;AAClC;AAEA,SAAS,2BAA2B,MAAc,WAAmB,UAAkB,UAAsC;AAC3H,MAAI,KAAK,SAAS,kBAAkB;AAClC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,uBAAuB,MAAM,WAAW,UAAU,QAAQ;AACxE,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,SAAS,cAAc,MAAM;AACzC,UAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,cAAc,KAAK;AACzB,UAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,UAAM,cAAc,KAAK;AACzB,QAAI,OAAO,OAAO,KAAK;AACvB,YAAQ,OAAO,GAAG;AAAA,EACpB;AACA,SAAO;AACT;AAEA,SAAS,uBACP,MACA,WACA,UACA,UACyC;AACzC,MAAI,cAAc,WAAW,aAAa,4BAA4B;AACpE,WAAO,kBAAkB,IAAI;AAAA,EAC/B;AACA,MAAI,cAAc,YAAY,cAAc,WAAW,aAAa,wBAAwB;AAC1F,WAAO,gBAAgB,IAAI;AAAA,EAC7B;AACA,MAAI,aAAa,UAAU,aAAa,SAAS;AAC/C,WAAO,cAAc,IAAI;AAAA,EAC3B;AACA,SAAO,CAAC;AACV;AAEA,SAAS,cAAc,MAAuD;AAC5E,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,aAAO;AAAA,QACL,EAAE,OAAO,gBAAM,OAAO,QAAQ;AAAA,QAC9B,EAAE,OAAO,gBAAM,OAAO,OAAO,KAAK,MAAM,EAAE;AAAA,MAC5C;AAAA,IACF;AACA,QAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,YAAM,OAAO,OAAO,KAAK,IAA+B;AACxD,aAAO;AAAA,QACL,EAAE,OAAO,gBAAM,OAAO,SAAS;AAAA,QAC/B,EAAE,OAAO,UAAK,OAAO,OAAO,KAAK,MAAM,EAAE;AAAA,QACzC,EAAE,OAAO,gBAAM,OAAO,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,KAAK,eAAK;AAAA,MAC5D;AAAA,IACF;AACA,WAAO,CAAC,EAAE,OAAO,gBAAM,OAAO,OAAO,KAAK,CAAC;AAAA,EAC7C,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,kBAAkB,MAAuD;AAChF,MAAI;AACF,UAAM,WAAW,KAAK,MAAM,IAAI;AAIhC,QAAI,CAAC,MAAM,QAAQ,SAAS,KAAK,GAAG;AAClC,aAAO,cAAc,IAAI;AAAA,IAC3B;AACA,UAAM,SAAS,oBAAI,IAAoB;AACvC,eAAW,QAAQ,SAAS,OAAO;AACjC,YAAM,OAAO,KAAK,aAAa;AAC/B,aAAO,IAAI,OAAO,OAAO,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,IAC9C;AACA,UAAM,SAAS,SAAS,UAAU,YAAY,gBAAgB,SAAS,UAAU,YAAY,QAAQ,SAAS,UAAU,eAAe;AACvI,WAAO;AAAA,MACL,EAAE,OAAO,YAAY,OAAO,GAAG,SAAS,MAAM,MAAM,SAAS;AAAA,MAC7D,EAAE,OAAO,gBAAM,OAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,KAAK,IAAI,KAAK,eAAK;AAAA,MAC1G,GAAI,SAAS,CAAC,EAAE,OAAO,UAAU,OAAO,OAAO,CAAC,IAAI,CAAC;AAAA,IACvD;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,gBAAgB,MAAuD;AAC9E,QAAM,QAAQ,KAAK,MAAM,YAAY,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;AACnE,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,SAAS;AACb,aAAW,QAAQ,MAAM,MAAM,GAAG,GAAI,GAAG;AACvC,QAAI;AACF,YAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B;AACA,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB;AAAA,MACF,WAAW,SAAS,OAAO,UAAU,UAAU;AAC7C;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AAAA,IACL,EAAE,OAAO,UAAU,OAAO,GAAG,MAAM,MAAM,SAAS;AAAA,IAClD,EAAE,OAAO,sBAAO,OAAO,OAAO,MAAM,EAAE;AAAA,IACtC,EAAE,OAAO,gBAAM,OAAO,UAAU,OAAO,WAAW,MAAM,GAAG;AAAA,EAC7D;AACF;AAEA,SAAS,kBAAkB,OAAuB;AAChD,SAAO,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,UAAU,OAAO,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI;AAC9F;AAEA,SAAS,YAAY,OAAuB;AAC1C,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AACxC,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,MAAM;AAChB,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,QAAM,QAAQ,CAAC,MAAM,MAAM,IAAI;AAC/B,MAAI,QAAQ,QAAQ;AACpB,MAAI,YAAY;AAChB,SAAO,SAAS,QAAQ,YAAY,MAAM,SAAS,GAAG;AACpD,aAAS;AACT,iBAAa;AAAA,EACf;AACA,SAAO,GAAG,MAAM,QAAQ,SAAS,KAAK,IAAI,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC;AAClE;AAEA,eAAe,gBAAgB,MAA6B;AAC1D,MAAI,UAAU,WAAW,WAAW;AAClC,UAAM,UAAU,UAAU,UAAU,IAAI;AACxC;AAAA,EACF;AAEA,QAAM,WAAW,SAAS,cAAc,UAAU;AAClD,WAAS,QAAQ;AACjB,WAAS,aAAa,YAAY,EAAE;AACpC,WAAS,MAAM,WAAW;AAC1B,WAAS,MAAM,OAAO;AACtB,WAAS,KAAK,OAAO,QAAQ;AAC7B,WAAS,OAAO;AAChB,QAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,WAAS,OAAO;AAChB,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AACF;AAEA,SAAS,aAAa,UAAkB,MAAoB;AAC1D,QAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAClE,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,OAAO;AACZ,OAAK,WAAW;AAChB,WAAS,KAAK,OAAO,IAAI;AACzB,OAAK,MAAM;AACX,OAAK,OAAO;AACZ,MAAI,gBAAgB,GAAG;AACzB;AAEA,eAAe,SAAS,QAAkC;AACxD,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,WAAW,MAAM,MAAM,MAAM;AACnC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,8BAA8B,SAAS,MAAM,EAAE;AAAA,IACjE;AACA,WAAO,SAAS,KAAK;AAAA,EACvB;AACA,MAAI,kBAAkB,MAAM;AAC1B,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,MAAI,kBAAkB,aAAa;AACjC,WAAO,IAAI,YAAY,EAAE,OAAO,MAAM;AAAA,EACxC;AACA,SAAO,OAAO,MAAM;AACtB;;;ACpuBA,SAAS,iBAAiB,IAAc,IAAwB;AAC9D,SAAO;AAAA,IACL,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,IAC5B,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,IAC5B,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,IAC5B,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,IAC5B,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,IACpC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,EACtC;AACF;AAEO,SAAS,UAAU,UAA0C,CAAC,GAAkB;AACrF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,KAAK,aAAa,qBAAqB,KAAK,cAAc;AAAA,IACnE;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,oBAAoB,oBAAoB,OAAO;AACrD,YAAM,MAAM,kBAAkB,SAAU,MAAM,OAAO,YAAY;AACjE,yBAAmB,KAAK,kBAAkB,SAAS;AACnD,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AAEvC,YAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,aAAO,YAAY;AACnB,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AACpB,YAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,eAAS,YAAY;AACrB,aAAO,OAAO,SAAS,QAAQ;AAC/B,UAAI,SAAS,OAAO,MAAM;AAE1B,YAAM,eAAe,IAAI,YAAY;AAAA,QACnC;AAAA,QACA,SAAS,kBAAkB,WAAW,2CAA2C,IAAI,OAAO;AAAA,QAC5F,YAAY,kBAAkB,cAAc;AAAA,QAC5C,qBACE,kBAAkB,uBAClB,2CAA2C,IAAI,OAAO;AAAA,QACxD,gBAAgB,kBAAkB,kBAAkB;AAAA,MACtD,CAAC;AACD,YAAM,MAAM,MAAM,aAAa,QAAQ,MAAM,CAAC,UAAmB;AAC/D,eAAO,OAAO;AACd,YAAI,SAAS,UAAU,IAAI,YAAY;AACvC,cAAM,WAAW,kBAAkB,IAAI,KAAK,MAAM,KAAK,kBAAkB,KAAK,CAAC;AAC/E,YAAI,SAAS,OAAO,QAAQ;AAC5B,eAAO;AAAA,MACT,CAAC;AACD,UAAI,CAAC,KAAK;AACR,eAAO;AAAA,UACL,UAAU;AACR,gBAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,yBAAa,UAAU;AACvB,4BAAgB,KAAK,UAAU;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAGA,YAAM,YAAsD,CAAC;AAC7D,eAAS,aAAa,GAAG,cAAc,IAAI,UAAU,cAAc,GAAG;AACpE,YAAI;AACF,gBAAM,OAAO,MAAM,IAAI,QAAQ,UAAU;AACzC,gBAAM,eAAe,KAAK,YAAY,EAAE,OAAO,EAAE,CAAC;AAClD,oBAAU,KAAK;AAAA,YACb,OAAO,aAAa;AAAA,YACpB,QAAQ,aAAa;AAAA,UACvB,CAAC;AAAA,QACH,QAAQ;AACN,oBAAU,KAAK,EAAE,OAAO,KAAK,QAAQ,IAAI,CAAC;AAAA,QAC5C;AAAA,MACF;AAEA,YAAM,aAKD,CAAC;AAEN,UAAI,WAAwC;AAC5C,UAAI,cAAc,IAAI;AACtB,UAAI,aAAa;AAEjB,YAAM,gBAAgB,MAAM;AAC1B,yBAAiB,SAAS,IAAI,UAAU,WAAW,IAAI,QAAQ,KAAK,UAAU;AAC9E,YAAI,SAAS,QAAQ,UAAU;AAAA,MACjC;AAGA,YAAM,YAAY,CAAC,YAAoB;AACrC,cAAM,QAAQ,WAAW,OAAO;AAChC,YAAI,CAAC,SAAS,CAAC,MAAM,SAAU;AAE/B,YAAI,MAAM,YAAY;AACpB,cAAI;AACF,kBAAM,WAAW,OAAO;AAAA,UAC1B,SAAS,GAAG;AAAA,UAEZ;AACA,gBAAM,aAAa;AAAA,QACrB;AAEA,cAAM,SAAS;AACf,cAAM,WAAW;AACjB,cAAM,QAAQ,gBAAgB;AAC9B,cAAM,QAAQ,OAAO,iBAAiB,oBAAoB,gBAAM,UAAU,CAAC,wBAAS,CAAC;AAAA,MACvF;AAGA,YAAM,aAAa,OAAO,SAAiB,SAAsB;AAC/D,cAAM,QAAQ,WAAW,OAAO;AAChC,YAAI,CAAC,SAAS,MAAM,SAAU;AAE9B,cAAM,WAAW;AAEjB,YAAI;AACF,gBAAM,OAAO,MAAM,IAAI,QAAQ,UAAU,CAAC;AAC1C,gBAAM,OAAO,UAAU,OAAO;AAC9B,gBAAM,QACJ,IAAI,QAAQ,QAAQ,WAChB,aACA,KAAK,IAAI,MAAM,KAAK,IAAI,GAAI,qBAAqB,KAAK,KAAK,IAAI,KAAK,QAAS,UAAU,CAAC;AAE9F,gBAAM,WAAW,KAAK,YAAY,EAAE,MAAM,CAAC;AAC3C,gBAAM,cAAc,kBAAkB;AACtC,gBAAM,WAAW,KAAK,MAAM,SAAS,KAAK;AAC1C,gBAAM,YAAY,KAAK,MAAM,SAAS,MAAM;AAE5C,gBAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,iBAAO,YAAY;AACnB,iBAAO,QAAQ,KAAK,MAAM,WAAW,WAAW;AAChD,iBAAO,SAAS,KAAK,MAAM,YAAY,WAAW;AAClD,iBAAO,MAAM,QAAQ,GAAG,QAAQ;AAChC,iBAAO,MAAM,SAAS,GAAG,SAAS;AAElC,gBAAM,UAAU,OAAO,WAAW,IAAI;AACtC,cAAI,CAAC,SAAS;AACZ,kBAAM,IAAI,MAAM,qCAAqC;AAAA,UACvD;AAEA,gBAAM,QAAQ,gBAAgB,MAAM;AACpC,gBAAM,SAAS;AAEf,gBAAM,aAAa,KAAK,OAAO;AAAA,YAC7B,eAAe;AAAA,YACf;AAAA,YACA,WAAW,gBAAgB,IAAI,SAAY,CAAC,aAAa,GAAG,GAAG,aAAa,GAAG,CAAC;AAAA,UAClF,CAAC;AACD,gBAAM,aAAa;AAEnB,gBAAM,WAAW;AACjB,gBAAM,aAAa;AAGnB,gBAAM,cAAc,MAAM,KAAK,eAAe;AAC9C,gBAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,oBAAU,YAAY;AACtB,oBAAU,MAAM,QAAQ,GAAG,QAAQ;AACnC,oBAAU,MAAM,SAAS,GAAG,SAAS;AACrC,gBAAM,QAAQ,YAAY,SAAS;AAEnC,qBAAW,QAAQ,YAAY,OAAO;AACpC,gBAAI,EAAE,SAAS,MAAO;AACtB,kBAAM,MAAO,KAAa;AAC1B,gBAAI,CAAC,IAAI,KAAK,EAAG;AAEjB,kBAAM,KAAK,iBAAiB,SAAS,WAAY,KAAa,SAAS;AACvE,kBAAM,aAAa,KAAK,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;AAE1D,kBAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,iBAAK,cAAc;AACnB,iBAAK,MAAM,WAAW,GAAG,UAAU;AACnC,iBAAK,MAAM,aAAc,KAAa,YAAY;AAClD,iBAAK,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC;AAC1B,iBAAK,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,UAAU;AACtC,iBAAK,MAAM,kBAAkB;AAE7B,sBAAU,YAAY,IAAI;AAG1B,gBAAK,KAAa,OAAO;AACvB,oBAAM,YAAa,KAAa,QAAQ;AACxC,oBAAM,cAAc,KAAK,eAAe,KAAK,sBAAsB,EAAE;AACrE,kBAAI,cAAc,KAAK,KAAK,IAAI,cAAc,SAAS,IAAI,GAAG;AAC5D,qBAAK,MAAM,YAAY,UAAU,YAAY,WAAW;AAAA,cAC1D;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,KAAK;AACZ,kBAAQ,MAAM,6BAA6B,UAAU,CAAC,KAAK,GAAG;AAC9D,gBAAM,WAAW;AACjB,gBAAM,QAAQ,gBAAgB,iBAAiB,iBAAiB,4CAAS,CAAC;AAAA,QAC5E;AAAA,MACF;AAEA,YAAM,eAAe,CAAC,SAAsB;AAC1C,kBAAU,WAAW;AACrB,sBAAc;AACd,iBAAS,gBAAgB;AACzB,mBAAW,SAAS;AAEpB,YAAI,OAAO,yBAAyB,aAAa;AAC/C,qBAAW,IAAI;AAAA,YACb,CAAC,YAAY;AACX,sBAAQ,QAAQ,CAAC,UAAU;AACzB,sBAAM,UAAU,SAAS,MAAM,OAAO,aAAa,iBAAiB,KAAK,KAAK,EAAE;AAChF,sBAAM,QAAQ,WAAW,OAAO;AAChC,oBAAI,CAAC,MAAO;AAEZ,oBAAI,MAAM,gBAAgB;AACxB,sBAAI,CAAC,MAAM,UAAU;AACnB,yBAAK,WAAW,SAAS,IAAI;AAAA,kBAC/B;AAAA,gBACF,OAAO;AACL,sBAAI,MAAM,YAAY,IAAI,WAAW,GAAG;AACtC,8BAAU,OAAO;AAAA,kBACnB;AAAA,gBACF;AAAA,cACF,CAAC;AAAA,YACH;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,YAAY;AAAA,YACd;AAAA,UACF;AAAA,QACF;AAEA,iBAAS,IAAI,GAAG,IAAI,IAAI,UAAU,KAAK;AACrC,gBAAM,OAAO,UAAU,CAAC;AACxB,gBAAM,QACJ,IAAI,QAAQ,QAAQ,WAChB,aACA,KAAK,IAAI,MAAM,KAAK,IAAI,GAAI,qBAAqB,KAAK,KAAK,IAAI,KAAK,QAAS,UAAU,CAAC;AAE9F,gBAAM,IAAI,KAAK,MAAM,KAAK,QAAQ,KAAK;AACvC,gBAAM,IAAI,KAAK,MAAM,KAAK,SAAS,KAAK;AAExC,gBAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,kBAAQ,YAAY;AACpB,kBAAQ,aAAa,mBAAmB,OAAO,CAAC,CAAC;AACjD,kBAAQ,MAAM,QAAQ,GAAG,CAAC;AAC1B,kBAAQ,MAAM,SAAS,GAAG,CAAC;AAC3B,kBAAQ,OAAO,iBAAiB,oBAAoB,gBAAM,IAAI,CAAC,wBAAS,CAAC;AAEzE,mBAAS,YAAY,OAAO;AAE5B,qBAAW,KAAK;AAAA,YACd;AAAA,YACA,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,UAAU;AAAA,UACZ,CAAC;AAED,cAAI,UAAU;AACZ,qBAAS,QAAQ,OAAO;AAAA,UAC1B,OAAO;AACL,iBAAK,WAAW,GAAG,IAAI;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAEA,mBAAa,IAAI,IAAI;AAErB,UAAI;AACJ,aAAO;AAAA,QACL,WAAW,SAAS;AAClB,iBAAO,YAAY,aAAa,YAAY,cAAc,YAAY;AAAA,QACxE;AAAA,QACA,QAAQ,SAAS;AACf,cAAI,YAAY,WAAW;AACzB,yBAAa,KAAK,IAAI,GAAG,aAAa,IAAI;AAC1C,yBAAa,WAAW;AACxB,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,YAAY;AAC1B,yBAAa,KAAK,IAAI,MAAM,aAAa,IAAI;AAC7C,yBAAa,WAAW;AACxB,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,cAAc;AAC5B,yBAAa;AACb,yBAAa,WAAW;AACxB,mBAAO;AAAA,UACT;AACA,iBAAO;AAAA,QACT;AAAA,QACA,OAAO,MAAM;AACX,wBAAc;AACd,iBAAO,aAAa,WAAW;AAC/B,wBAAc,OAAO,WAAW,MAAM;AACpC,yBAAa,IAAI;AAAA,UACnB,GAAG,GAAG;AAAA,QACR;AAAA,QACA,UAAU;AACR,cAAI,SAAS,QAAQ,MAAS;AAC9B,iBAAO,aAAa,WAAW;AAC/B,oBAAU,WAAW;AAErB,qBAAW,QAAQ,CAAC,UAAU;AAC5B,gBAAI,MAAM,YAAY;AACpB,kBAAI;AACF,sBAAM,WAAW,OAAO;AAAA,cAC1B,SAAS,GAAG;AAAA,cAEZ;AAAA,YACF;AAAA,UACF,CAAC;AACD,qBAAW,SAAS;AAEpB,0BAAgB,KAAK,UAAU;AAC/B,eAAK,IAAI,QAAQ;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBAA4B;AACnC,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,oBAAoB,GAAG,GAAG,CAAC;AAChE;AAEA,SAAS,qBAAqB,OAAuB;AACnD,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACzC,WAAO;AAAA,EACT;AACA,QAAM,SAAS,QAAQ,MAAM,KAAK;AAClC,SAAO,KAAK,IAAI,GAAG,QAAQ,MAAM;AACnC;AAEA,SAAS,iBACP,SACA,OACA,WACA,KACA,YACM;AACN,UAAQ,gBAAgB;AACxB,mBAAiB,SAAS,gBAAM,OAAO,KAAK,CAAC;AAC7C,QAAM,YAAY,mBAAmB,SAAS;AAC9C,MAAI,WAAW;AACb,qBAAiB,SAAS,4BAAQ,SAAS;AAAA,EAC7C;AACA,mBAAiB,SAAS,gBAAM,QAAQ,WAAW,6BAAS,0BAAM;AAClE,mBAAiB,SAAS,gBAAM,GAAG,KAAK,MAAM,aAAa,GAAG,CAAC,GAAG;AACpE;AAEA,SAAS,iBAAiB,QAAqB,OAAe,OAAqB;AACjF,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,OAAK,OAAO,KAAK,OAAO;AACxB,SAAO,OAAO,IAAI;AACpB;AAEA,SAAS,mBAAmB,WAA6D;AACvF,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,WAAW;AAC5B,UAAM,MAAM,GAAG,KAAK,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,MAAM,KAAK,MAAM,CAAC;AAClE,WAAO,IAAI,MAAM,OAAO,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,EAC5C;AACA,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,MAAM,KAAK,MAAO,QAAQ,IAAI,GAAG,IAAI,KAAK,KAAK,MAAM,IAAK,EAChE,KAAK,IAAI;AACd;AAEA,SAAS,oBAAoB,SAA2D;AACtF,MAAI,iBAAiB,SAAS;AAC5B,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,WAAmB,MAA8B;AACzE,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,SAAO,YAAY;AACnB,SAAO,cAAc;AACrB,SAAO;AACT;AAEA,SAAS,kBAAkB,UAAkB,KAAa,SAA8B;AACtF,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AAErB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AAEpB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc,GAAG,OAAO,IAAI,QAAQ;AAEzC,QAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,WAAS,OAAO;AAChB,WAAS,WAAW;AACpB,WAAS,cAAc;AAEvB,WAAS,OAAO,OAAO,MAAM,QAAQ;AACrC,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAwB;AACjD,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,EAAE;AAC3E,QAAM,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,QAAQ,OAAQ,MAA6B,IAAI,IAAI;AAC3H,QAAM,QAAQ,GAAG,IAAI,IAAI,OAAO,GAAG,YAAY;AAC/C,MAAI,MAAM,SAAS,UAAU,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,SAAS,GAAG;AACvF,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,KAAkB,WAA0B;AACtE,MAAI,WAAW;AACb,QAAI,oBAAoB,YAAY;AACpC;AAAA,EACF;AAEA,MAAI,CAAC,IAAI,oBAAoB,aAAa,OAAO,WAAW,aAAa;AACvE,QAAI,oBAAoB,YAAY,2CAA2C,IAAI,OAAO;AAAA,EAC5F;AACF;;;AC5bA,mBAAkB;AAClB,uBAAsB;;;ACCtB,eAAsB,gBAAgB,MAAyC;AAC7E,MAAI,KAAK,kBAAkB,aAAa;AACtC,WAAO,KAAK;AAAA,EACd;AACA,MAAI,KAAK,MAAM;AACb,WAAO,KAAK,KAAK,YAAY;AAAA,EAC/B;AACA,MAAI,OAAO,KAAK,WAAW,UAAU;AACnC,UAAM,WAAW,MAAM,MAAM,KAAK,MAAM;AACxC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,yBAAyB,SAAS,MAAM,EAAE;AAAA,IAC5D;AACA,WAAO,SAAS,YAAY;AAAA,EAC9B;AACA,QAAM,IAAI,MAAM,0BAA0B;AAC5C;AAEA,eAAsB,aAAa,MAAoC;AACrE,MAAI,OAAO,KAAK,WAAW,UAAU;AACnC,UAAM,WAAW,MAAM,MAAM,KAAK,MAAM;AACxC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,8BAA8B,SAAS,MAAM,EAAE;AAAA,IACjE;AACA,WAAO,SAAS,KAAK;AAAA,EACvB;AACA,MAAI,KAAK,MAAM;AACb,WAAO,KAAK,KAAK,KAAK;AAAA,EACxB;AACA,MAAI,KAAK,kBAAkB,aAAa;AACtC,WAAO,IAAI,YAAY,EAAE,OAAO,KAAK,MAAM;AAAA,EAC7C;AACA,SAAO,OAAO,KAAK,MAAM;AAC3B;AAEO,SAAS,YAAY,YAAY,IAAiB;AACvD,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY,aAAa,SAAS,GAAG,KAAK;AAChD,SAAO;AACT;AAEO,SAAS,cAAc,OAA4B;AACxD,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AACtB,SAAO;AACT;AAEO,SAAS,WAAW,QAAqB,OAAe,OAA8B;AAC3F,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc,OAAO,KAAK;AAClC,MAAI,OAAO,KAAK,OAAO;AACvB,SAAO,OAAO,GAAG;AACnB;AAeO,SAAS,cACd,MACA,SACQ;AACR,SAAO,KAAK,aAAa,QAAQ,KAAK,QAAQ,KAAK;AACrD;;;AD3EA,IAAM,gBAAgB,oBAAI,IAAI,CAAC,wBAAwB,wBAAwB,CAAC;AAkCzE,SAAS,aAA4B;AAC1C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,KAAK,cAAc,UAAU,cAAc,IAAI,KAAK,QAAQ;AAAA,IACrE;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,UAAU;AACpC,UAAI,SAAS,OAAO,KAAK;AAEzB,UAAI;AACF,cAAM,MAAM,MAAM,aAAAC,QAAM,UAAU,MAAM,gBAAgB,IAAI,IAAI,CAAC;AACjE,cAAM,WAAW,OAAO,GAAG;AAAA,MAC7B,SAAS,OAAO;AACd,2BAAmB,OAAO,KAAK;AAAA,MACjC;AAEA,aAAO;AAAA,QACL,UAAU;AACR,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,WAAW,OAAoB,KAA2B;AACvE,QAAM,UAAU,MAAM,mBAAmB,GAAG;AAC5C,QAAM,UAAU,MAAM,IAAI,KAAK,OAAO,GAAG,MAAM,MAAM;AACrD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,kDAAyB;AAAA,EAC3C;AAEA,QAAM,MAAM,SAAS,SAAS,yDAAsB;AACpD,QAAM,WAAW,cAAc,OAAO;AACtC,QAAM,WAAW,aAAa,GAAG;AACjC,QAAM,QAAQ,UAAU,KAAK,QAAQ;AACrC,QAAM,WAAW,aAAa,GAAG;AACjC,QAAM,YAAY,uBAAuB,KAAK,UAAU,KAAK;AAC7D,QAAM,SAAS,MAAM,eAAe,KAAK,UAAU,QAAQ;AAE3D,QAAM,UAAU,cAAc,+BAAW;AACzC,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,EAAAC,YAAW,MAAM,gBAAM,SAAS,SAAS,yBAAU;AACnD,EAAAA,YAAW,MAAM,gBAAM,SAAS,WAAW,cAAI;AAC/C,EAAAA,YAAW,MAAM,gBAAM,SAAS,YAAY,oBAAK;AACjD,MAAI,SAAS,WAAW;AACtB,IAAAA,YAAW,MAAM,sBAAO,SAAS,SAAS;AAAA,EAC5C;AACA,MAAI,SAAS,YAAY;AACvB,IAAAA,YAAW,MAAM,gBAAM,SAAS,UAAU;AAAA,EAC5C;AACA,MAAI,SAAS,UAAU;AACrB,IAAAA,YAAW,MAAM,4BAAQ,SAAS,QAAQ;AAAA,EAC5C;AACA,EAAAA,YAAW,MAAM,gBAAM,MAAM,UAAU,kDAAU;AACjD,EAAAA,YAAW,MAAM,YAAY,UAAU,aAAa;AACpD,EAAAA,YAAW,MAAM,SAAS,UAAU,UAAU;AAC9C,EAAAA,YAAW,MAAM,gBAAM,UAAU,WAAW,UAAU,QAAQ;AAC9D,EAAAA,YAAW,MAAM,gBAAM,UAAU,UAAU;AAC3C,EAAAA,YAAW,MAAM,gBAAM,UAAU,MAAM;AACvC,EAAAA,YAAW,MAAM,gBAAM,UAAU,MAAM;AACvC,EAAAA,YAAW,MAAM,gBAAM,UAAU,KAAK;AACtC,MAAI,UAAU,SAAS,UAAU,OAAO;AACtC,IAAAA,YAAW,MAAM,sBAAO,GAAG,UAAU,KAAK,MAAM,UAAU,KAAK,EAAE;AAAA,EACnE;AACA,MAAI,UAAU,YAAY;AACxB,IAAAA,YAAW,MAAM,4BAAQ,UAAU,UAAU;AAAA,EAC/C;AACA,MAAI,UAAU,mBAAmB;AAC/B,IAAAA,YAAW,MAAM,wCAAU,UAAU,iBAAiB;AAAA,EACxD;AACA,UAAQ,OAAO,IAAI;AACnB,QAAM,OAAO,OAAO;AAEpB,QAAM,WAAW,cAAc,+BAAW;AAC1C,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AAEpB,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,cAAc;AACpB,YAAQ,OAAO,KAAK;AAAA,EACtB,OAAO;AACL,eAAW,CAAC,OAAO,IAAI,KAAK,MAAM,MAAM,GAAG,EAAE,EAAE,QAAQ,GAAG;AACxD,YAAM,cAAc,YAAY,UAAU,KAAK,IAAI;AACnD,YAAM,cAAc,MAAM,IAAI,KAAK,WAAW,GAAG,MAAM,MAAM;AAC7D,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AACA,YAAM,UAAU,SAAS,cAAc,SAAS;AAChD,cAAQ,YAAY;AACpB,YAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,cAAQ,cAAc,aAAa,WAAW,KAAK,gBAAM,QAAQ,CAAC;AAClE,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AACpB,cAAQ,YAAY,oBAAoB,uBAAuB,aAAa,QAAQ,cAAc,WAAW,CAAC,CAAC;AAC/G,cAAQ,OAAO,SAAS,OAAO;AAC/B,cAAQ,OAAO,OAAO;AAAA,IACxB;AAAA,EACF;AAEA,WAAS,OAAO,OAAO;AACvB,QAAM,OAAO,QAAQ;AACvB;AAEA,eAAe,mBAAmB,KAA6B;AAC7D,QAAM,eAAe,MAAM,IAAI,KAAK,wBAAwB,GAAG,MAAM,MAAM;AAC3E,MAAI,cAAc;AAChB,UAAM,YAAY,SAAS,cAAc,mDAA0B;AACnE,UAAM,WAAW,MAAM,KAAK,UAAU,qBAAqB,GAAG,CAAC,EAAE;AAAA,MAC/D,CAAC,YAAY,QAAQ,cAAc,cAAc,gBAAgB,SAAS,WAAW;AAAA,IACvF;AACA,UAAM,WAAW,WAAW,gBAAgB,UAAU,WAAW,IAAI;AACrE,QAAI,YAAY,IAAI,KAAK,QAAQ,GAAG;AAClC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,WAAW,OAAO,OAAO,IAAI,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,OAAO,MAAM,KAAK,SAAS,MAAM,CAAC;AACnG,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,wDAA0B;AAAA,EAC5C;AACA,SAAO,SAAS;AAClB;AAEA,SAAS,aAAa,KAA8C;AAClE,QAAM,WAAW,oBAAI,IAA8B;AACnD,aAAW,QAAQ,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,QAAQ,cAAc,MAAM,GAAG;AAC9G,UAAM,KAAK,gBAAgB,MAAM,IAAI;AACrC,UAAM,OAAO,gBAAgB,MAAM,MAAM;AACzC,QAAI,CAAC,MAAM,CAAC,MAAM;AAChB;AAAA,IACF;AACA,aAAS,IAAI,IAAI;AAAA,MACf;AAAA,MACA;AAAA,MACA,WAAW,gBAAgB,MAAM,YAAY,KAAK;AAAA,MAClD,YAAY,gBAAgB,MAAM,YAAY,KAAK;AAAA,IACrD,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,UAAU,KAAe,UAA6D;AAC7F,QAAM,QAA4B,CAAC;AACnC,aAAW,WAAW,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,QAAQ,cAAc,SAAS,GAAG;AACpH,UAAM,QAAQ,gBAAgB,SAAS,OAAO;AAC9C,UAAM,OAAO,QAAQ,SAAS,IAAI,KAAK,IAAI;AAC3C,QAAI,QAAQ,mBAAmB,KAAK,SAAS,GAAG;AAC9C,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AACA,SAAO,MAAM,KAAK,SAAS,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,mBAAmB,KAAK,SAAS,CAAC;AAC1F;AAEA,SAAS,aAAa,KAA6B;AACjD,SAAO;AAAA,IACL,OAAO,gBAAgB,KAAK,OAAO;AAAA,IACnC,SAAS,gBAAgB,KAAK,SAAS;AAAA,IACvC,UAAU,gBAAgB,KAAK,UAAU;AAAA,IACzC,YAAY,gBAAgB,KAAK,YAAY;AAAA,IAC7C,WAAW,gBAAgB,KAAK,WAAW;AAAA,IAC3C,UAAU,iBAAiB,KAAK,kBAAkB;AAAA,EACpD;AACF;AAEA,SAAS,uBAAuB,KAAe,UAAyC,OAAiD;AACvI,QAAM,QAAQ,MAAM,KAAK,SAAS,OAAO,CAAC;AAC1C,QAAM,WAAW,MAAM;AACvB,QAAM,SAAS,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,WAAW,QAAQ,CAAC,EAAE;AAC3E,QAAM,SAAS,MAAM,OAAO,CAAC,SAAS,KAAK,cAAc,UAAU,EAAE;AACrE,QAAM,QAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,WAAW,OAAO,KAAK,0BAA0B,KAAK,KAAK,SAAS,CAAC,EAAE;AAC3H,QAAM,QAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,WAAW,QAAQ,CAAC,EAAE;AAC1E,QAAM,QAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,WAAW,QAAQ,CAAC,EAAE;AAC1E,QAAM,WAAW,MAAM,OAAO,CAAC,SAAS,eAAe,KAAK,UAAU,EAAE,IAAI,KAAK,CAAC,EAAE;AACpF,QAAM,WAAW,MAAM,OAAO,CAAC,SAAS,KAAK,cAAc,8BAA8B,eAAe,KAAK,UAAU,EAAE,IAAI,KAAK,CAAC,EAAE;AACrI,QAAM,aAAa,MAAM,OAAO,CAAC,SAAS,KAAK,GAAG,YAAY,EAAE,SAAS,OAAO,KAAK,eAAe,KAAK,UAAU,EAAE,IAAI,aAAa,CAAC,EAAE;AACzI,QAAM,aAAa,MAAM,OAAO,CAAC,SAAS,CAAC,oBAAoB,IAAI,CAAC,EAAE;AACtE,SAAO;AAAA,IACL,eAAe,MAAM;AAAA,IACrB,YAAY,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,KAAK,IAAI,GAAG,kBAAkB,GAAG,IAAI,MAAM,MAAM;AAAA,EACtE;AACF;AAEA,SAAS,oBAAoB,MAAiC;AAC5D,QAAM,aAAa,eAAe,KAAK,UAAU;AACjD,SACE,mBAAmB,KAAK,SAAS,KACjC,KAAK,UAAU,WAAW,QAAQ,KAClC,KAAK,cAAc,cACnB,KAAK,UAAU,WAAW,OAAO,KACjC,0BAA0B,KAAK,KAAK,SAAS,KAC7C,KAAK,UAAU,WAAW,QAAQ,KAClC,KAAK,UAAU,WAAW,QAAQ,KAClC,KAAK,cAAc,8BACnB,WAAW,IAAI,KAAK,KACpB,WAAW,IAAI,KAAK;AAExB;AAEA,eAAe,eACb,KACA,UACA,UAC8B;AAC9B,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,SAAS,OAAO,GAAG;AACpC,QAAI,CAAC,KAAK,UAAU,WAAW,QAAQ,GAAG;AACxC;AAAA,IACF;AACA,UAAM,OAAO,YAAY,UAAU,KAAK,IAAI;AAC5C,UAAM,QAAQ,IAAI,KAAK,IAAI;AAC3B,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,WAAO,IAAI,MAAM,QAAQ,KAAK,SAAS,WAAW,MAAM,MAAM,MAAM,QAAQ,CAAC,EAAE;AAAA,EACjF;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAc,QAA6B,YAA4B;AACrG,QAAM,eAAe,IAAI,UAAU,EAAE,gBAAgB,MAAM,WAAW;AACtE,aAAW,SAAS,MAAM,KAAK,aAAa,iBAAmC,4CAA4C,CAAC,GAAG;AAC7H,UAAM,MAAM,MAAM,aAAa,KAAK,KAAK,MAAM,aAAa,MAAM,KAAK,MAAM,aAAa,YAAY,KAAK;AAC3G,UAAM,OAAO,YAAY,YAAY,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK,GAAG;AAC7D,UAAM,MAAM,OAAO,IAAI,IAAI;AAC3B,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AACA,UAAM,aAAa,OAAO,GAAG;AAC7B,UAAM,aAAa,QAAQ,GAAG;AAC9B,UAAM,aAAa,cAAc,GAAG;AAAA,EACtC;AACA,SAAO,aAAa,KAAK;AAC3B;AAEA,SAAS,oBAAoB,MAAsB;AACjD,SAAO,iBAAAC,QAAU,SAAS,MAAM;AAAA,IAC9B,cAAc,EAAE,MAAM,MAAM,KAAK,MAAM,YAAY,MAAM;AAAA,IACzD,UAAU,CAAC,UAAU,YAAY;AAAA,EACnC,CAAC;AACH;AAEA,SAAS,aAAa,MAAsB;AAC1C,QAAM,eAAe,IAAI,UAAU,EAAE,gBAAgB,MAAM,WAAW;AACtE,QAAM,UAAU,aAAa,cAAc,mBAAmB;AAC9D,SAAO,SAAS,aAAa,KAAK,KAAK;AACzC;AAEA,SAAS,mBAAmB,OAAoB,OAAsB;AACpE,QAAM,gBAAgB;AACtB,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AACrB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc,iBAAiB,QAAQ,MAAM,UAAU;AAC5D,WAAS,OAAO,OAAO,IAAI;AAC3B,QAAM,OAAO,QAAQ;AACvB;AAEA,SAAS,SAAS,KAAa,SAA2B;AACxD,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AACA,SAAO;AACT;AAEA,SAASD,YAAW,QAAqB,OAAe,OAA8B;AACpF,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc,OAAO,KAAK;AAClC,MAAI,OAAO,KAAK,OAAO;AACvB,SAAO,OAAO,GAAG;AACnB;AAEA,SAAS,gBAAgB,KAAe,WAA2B;AACjE,SACE,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EACrC,KAAK,CAAC,YAAY,QAAQ,cAAc,SAAS,GAChD,aAAa,KAAK,KAAK;AAE/B;AAEA,SAAS,iBAAiB,KAAe,UAA0B;AACjE,SACE,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EACrC,KAAK,CAAC,YAAY,QAAQ,cAAc,UAAU,gBAAgB,SAAS,UAAU,MAAM,QAAQ,GAClG,aAAa,KAAK,KAAK;AAE/B;AAEA,SAAS,eAAe,OAA4B;AAClD,SAAO,IAAI,IAAI,MAAM,MAAM,KAAK,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC;AAC9E;AAEA,SAAS,kBAAkB,KAAuB;AAChD,SAAO,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,QAAQ,cAAc,SAAS,EAAE;AACxG;AAEA,SAAS,gBAAgB,SAAkB,WAAkC;AAC3E,QAAM,SAAS,QAAQ,aAAa,SAAS;AAC7C,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AACA,aAAW,aAAa,MAAM,KAAK,QAAQ,UAAU,GAAG;AACtD,QAAI,UAAU,cAAc,WAAW;AACrC,aAAO,UAAU;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,WAA4B;AACtD,SAAO,cAAc,2BAA2B,cAAc,eAAe,cAAc;AAC7F;AAEA,SAAS,cAAc,MAAsB;AAC3C,QAAM,QAAQ,KAAK,YAAY,GAAG;AAClC,SAAO,SAAS,IAAI,KAAK,MAAM,GAAG,QAAQ,CAAC,IAAI;AACjD;AAEA,SAAS,YAAY,UAAkB,MAAsB;AAC3D,QAAM,QAAQ,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG;AAC5C,QAAM,aAAuB,CAAC;AAC9B,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,QAAQ,SAAS,KAAK;AACzB;AAAA,IACF;AACA,QAAI,SAAS,MAAM;AACjB,iBAAW,IAAI;AAAA,IACjB,OAAO;AACL,iBAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AACA,SAAO,WAAW,KAAK,GAAG;AAC5B;;;AE3YA,IAAAE,gBAAkB;AAIlB,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AACF,CAAC;AAEM,SAAS,YAA2B;AACzC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,KAAK,cAAc,SAAS,KAAK,cAAc,UAAU,aAAa,IAAI,KAAK,QAAQ;AAAA,IAChG;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,SAAS;AACnC,UAAI,SAAS,OAAO,KAAK;AAEzB,UAAI;AACF,cAAM,MAAM,MAAM,cAAAC,QAAM,UAAU,MAAM,gBAAgB,IAAI,IAAI,CAAC;AACjE,cAAM,UAAU,OAAO,GAAG;AAAA,MAC5B,SAAS,OAAO;AACd,0BAAkB,OAAO,KAAK;AAAA,MAChC;AAEA,aAAO;AAAA,QACL,UAAU;AACR,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,UAAU,OAAoB,KAA2B;AACtE,QAAM,UAAU,OAAO,OAAO,IAAI,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG;AACrE,QAAM,aAAa,QAChB,OAAO,CAAC,UAAU,gCAAgC,KAAK,MAAM,IAAI,KAAK,MAAM,KAAK,SAAS,QAAQ,CAAC,EACnG,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,QAAW,EAAE,SAAS,KAAK,CAAC,CAAC;AAC5E,QAAM,kBAAkB,QAAQ,OAAO,CAAC,UAAU,gDAAgD,KAAK,MAAM,IAAI,CAAC;AAClH,QAAM,eAAe,MAAM,QAAQ;AAAA,IACjC,WAAW,MAAM,GAAG,EAAE,EAAE,IAAI,OAAO,OAAO,UAAU;AAClD,YAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AACpC,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,iBAAiB,GAAG;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,cAAc,8BAAU;AACxC,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cAAc;AACnB,UAAQ,OAAO,IAAI;AACnB,UAAQ,OAAO,iBAAiB,SAAS,YAAY,iBAAiB,aAAa,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC;AAC5G,QAAM,OAAO,OAAO;AAEpB,QAAM,QAAQ,cAAc,4BAAQ,WAAW,MAAM,EAAE;AACvD,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,SAAO,YAAY;AAEnB,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,cAAc;AACpB,WAAO,OAAO,KAAK;AAAA,EACrB,OAAO;AACL,eAAW,QAAQ,cAAc;AAC/B,aAAO,OAAO,cAAc,KAAK,KAAK,KAAK,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,IACpE;AAAA,EACF;AACA,QAAM,OAAO,MAAM;AACnB,QAAM,OAAO,KAAK;AAElB,QAAM,YAAY,cAAc,4BAAQ,QAAQ,MAAM,EAAE;AACxD,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,aAAW,SAAS,QAAQ,MAAM,GAAG,GAAG,GAAG;AACzC,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc,MAAM;AACzB,SAAK,OAAO,IAAI;AAAA,EAClB;AACA,YAAU,OAAO,IAAI;AACrB,QAAM,OAAO,SAAS;AACxB;AAWA,SAAS,iBACP,SACA,YACA,iBACA,WACa;AACb,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,EAAAC,YAAW,MAAM,gBAAM,WAAW,MAAM;AACxC,EAAAA,YAAW,MAAM,gBAAM,QAAQ,MAAM;AACrC,EAAAA,YAAW,MAAM,iBAAiB,QAAQ,OAAO,CAAC,UAAU,WAAW,KAAK,MAAM,IAAI,CAAC,EAAE,MAAM;AAC/F,EAAAA,YAAW,MAAM,eAAe,QAAQ,OAAO,CAAC,UAAU,YAAY,KAAK,MAAM,IAAI,CAAC,EAAE,MAAM;AAC9F,EAAAA,YAAW,MAAM,4BAAQ,QAAQ,OAAO,CAAC,UAAU,+BAA+B,KAAK,MAAM,IAAI,KAAK,MAAM,KAAK,SAAS,OAAO,CAAC,EAAE,MAAM;AAC1I,EAAAA,YAAW,MAAM,gBAAM,gBAAgB,MAAM;AAC7C,EAAAA,YAAW,MAAM,4BAAQ,gBAAgB,OAAO,CAAC,UAAU,sCAAsC,KAAK,MAAM,IAAI,CAAC,EAAE,MAAM;AACzH,EAAAA,YAAW,MAAM,4BAAQ,gBAAgB,OAAO,CAAC,UAAU,oBAAoB,KAAK,MAAM,IAAI,CAAC,EAAE,MAAM;AACvG,QAAM,SAAS,UAAU,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,QAAQ,CAAC;AACvE,EAAAA,YAAW,MAAM,UAAU,MAAM;AACjC,QAAM,YAAY,mBAAmB,SAAS;AAC9C,MAAI,WAAW;AACb,IAAAA,YAAW,MAAM,4BAAQ,SAAS;AAAA,EACpC;AACA,QAAM,cAAc,qBAAqB,SAAS;AAClD,MAAI,aAAa;AACf,IAAAA,YAAW,MAAM,4BAAQ,WAAW;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,KAA0B;AAClD,QAAM,WAAW,wBAAwB,GAAG;AAC5C,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,WAAO;AAAA,EACT;AACA,QAAM,OAAO,IAAI;AACjB,QAAM,WAAW,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC;AACzD,SAAO;AAAA,IACL,OAAO,aAAaC,iBAAgB,MAAM,OAAO,GAAG,SAAS,KAAK;AAAA,IAClE,QAAQ,aAAaA,iBAAgB,MAAM,QAAQ,GAAG,SAAS,MAAM;AAAA,IACrE,QAAQ,SAAS,OAAO,CAAC,YAAY,QAAQ,cAAc,QAAQ,EAAE;AAAA,IACrE,cAAc,SAAS,OAAO,CAAC,YAAY,QAAQ,cAAc,YAAY,EAAE;AAAA,IAC/E,UAAU,SAAS,OAAO,CAAC,YAAY,QAAQ,cAAc,QAAQ,EAAE;AAAA,IACvE,OAAO,SAAS,OAAO,CAAC,YAAY,QAAQ,cAAc,MAAM,EAAE;AAAA,EACpE;AACF;AAEA,SAAS,wBAAwB,KAA0B;AACzD,SAAO;AAAA,IACL,OAAO,aAAa,oBAAoB,KAAK,OAAO,GAAG,MAAS;AAAA,IAChE,QAAQ,aAAa,oBAAoB,KAAK,QAAQ,GAAG,MAAS;AAAA,IAClE,QAAQC,cAAa,KAAK,oBAAoB;AAAA,IAC9C,cAAcA,cAAa,KAAK,wBAAwB;AAAA,IACxD,UAAUA,cAAa,KAAK,oBAAoB;AAAA,IAChD,OAAOA,cAAa,KAAK,kBAAkB;AAAA,EAC7C;AACF;AAEA,SAAS,mBAAmB,WAAkC;AAC5D,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,WAAW;AAC5B,QAAI,CAAC,OAAO,SAAS,KAAK,KAAK,KAAK,CAAC,OAAO,SAAS,KAAK,MAAM,GAAG;AACjE;AAAA,IACF;AACA,UAAM,MAAM,GAAG,KAAK,MAAM,KAAK,KAAe,CAAC,MAAM,KAAK,MAAM,KAAK,MAAgB,CAAC;AACtF,WAAO,IAAI,MAAM,OAAO,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,EAC5C;AACA,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,MAAM,KAAK,MAAO,QAAQ,IAAI,GAAG,IAAI,KAAK,KAAK,MAAM,IAAK,EAChE,KAAK,IAAI;AACd;AAEA,SAAS,qBAAqB,WAAkC;AAC9D,QAAM,SAAS,UAAU;AAAA,IACvB,CAAC,QAAQ,UAAU;AAAA,MACjB,cAAc,OAAO,eAAe,KAAK;AAAA,MACzC,UAAU,OAAO,WAAW,KAAK;AAAA,MACjC,OAAO,OAAO,QAAQ,KAAK;AAAA,IAC7B;AAAA,IACA,EAAE,cAAc,GAAG,UAAU,GAAG,OAAO,EAAE;AAAA,EAC3C;AACA,SAAO;AAAA,IACL,OAAO,eAAe,cAAc,OAAO,YAAY,KAAK;AAAA,IAC5D,OAAO,WAAW,UAAU,OAAO,QAAQ,KAAK;AAAA,IAChD,OAAO,QAAQ,QAAQ,OAAO,KAAK,KAAK;AAAA,EAC1C,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAC7B;AAEA,SAAS,cAAc,KAAa,MAAc,OAA4B;AAC5E,QAAM,OAAO,SAAS,cAAc,SAAS;AAC7C,OAAK,YAAY;AACjB,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,UAAQ,cAAc,QAAQ,QAAQ,CAAC;AACvC,QAAM,WAAW,SAAS,cAAc,MAAM;AAC9C,WAAS,cAAc;AAEvB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,QAAM,YAAY,eAAe,GAAG;AACpC,MAAI,UAAU,SAAS,GAAG;AACxB,eAAW,YAAY,WAAW;AAChC,YAAM,YAAY,SAAS,cAAc,GAAG;AAC5C,gBAAU,cAAc;AACxB,WAAK,OAAO,SAAS;AAAA,IACvB;AAAA,EACF,OAAO;AACL,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,cAAc;AACpB,SAAK,OAAO,KAAK;AAAA,EACnB;AAEA,OAAK,OAAO,SAAS,UAAU,IAAI;AACnC,SAAO;AACT;AAEA,SAAS,eAAe,KAAuB;AAC7C,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,WAAO,sBAAsB,GAAG;AAAA,EAClC;AACA,SAAO,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAC5C,OAAO,CAAC,YAAY,QAAQ,cAAc,QAAQ,EAClD,IAAI,CAAC,UAAUD,iBAAgB,OAAO,eAAe,KAAK,EAAE,EAC5D,IAAI,CAAC,UAAU,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC,EAChD,OAAO,OAAO;AACnB;AAEA,SAAS,sBAAsB,KAAuB;AACpD,SAAO,CAAC,GAAG,IAAI,SAAS,0CAA0C,CAAC,EAChE,IAAI,CAAC,UAAU,UAAU,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,EACpD,IAAI,CAAC,UAAU,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC,EAChD,OAAO,OAAO;AACnB;AAEA,SAAS,oBAAoB,KAAa,MAAkC;AAC1E,QAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,MAAM,IAAI,0BAA0B,CAAC;AACxE,SAAO,QAAQ,CAAC,KAAK,QAAQ,CAAC;AAChC;AAEA,SAASC,cAAa,OAAe,SAAyB;AAC5D,SAAO,CAAC,GAAG,MAAM,SAAS,OAAO,CAAC,EAAE;AACtC;AAEA,SAAS,kBAAkB,OAAoB,OAAsB;AACnE,QAAM,gBAAgB;AACtB,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AACrB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc,iBAAiB,QAAQ,MAAM,UAAU;AAC5D,WAAS,OAAO,OAAO,IAAI;AAC3B,QAAM,OAAO,QAAQ;AACvB;AAEA,SAASF,YAAW,QAAqB,OAAe,OAA8B;AACpF,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc,OAAO,KAAK;AAClC,MAAI,OAAO,KAAK,OAAO;AACvB,SAAO,OAAO,GAAG;AACnB;AAEA,SAASC,iBAAgB,SAAkB,WAAkC;AAC3E,QAAM,SAAS,QAAQ,aAAa,SAAS;AAC7C,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AACA,aAAW,aAAa,MAAM,KAAK,QAAQ,UAAU,GAAG;AACtD,QAAI,UAAU,cAAc,WAAW;AACrC,aAAO,UAAU;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAgB,UAAkD;AACtF,QAAM,SAAS,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC/D,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO,MACJ,WAAW,QAAQ,GAAG,EACtB,WAAW,QAAQ,GAAG,EACtB,WAAW,SAAS,GAAG,EACvB,WAAW,UAAU,GAAG,EACxB,WAAW,UAAU,GAAG;AAC7B;;;ACjSA,IAAAE,gBAAkB;AAClB,IAAAC,oBAAsB;AAKtB,IAAM,iBAAiB,oBAAI,IAAI,CAAC,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO,OAAO,QAAQ,KAAK,CAAC;AAC1G,IAAM,kBAAkB,oBAAI,IAAI,CAAC,QAAQ,OAAO,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO,OAAO,QAAQ,WAAW,IAAI,CAAC;AACpI,IAAM,yBAAyB,oBAAI,IAAI,CAAC,QAAQ,QAAQ,OAAO,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,QAAQ,OAAO,KAAK,CAAC;AAClI,IAAM,2BAA2B,oBAAI,IAAI,CAAC,OAAO,MAAM,OAAO,WAAW,KAAK,CAAC;AAC/E,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;AAC7B,IAAM,cAAc;AACpB,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,sBAA8C;AAAA,EAClD,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,2EAA2E;AAAA,EAC3E,oDAAoD;AAAA,EACpD,2EAA2E;AAAA,EAC3E,oDAAoD;AAAA,EACpD,2CAA2C;AAAA,EAC3C,oDAAoD;AAAA,EACpD,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,qEAAqE;AAAA,EACrE,wEAAwE;AAAA,EACxE,kDAAkD;AAAA,EAClD,yDAAyD;AAAA,EACzD,qDAAqD;AAAA,EACrD,kDAAkD;AAAA,EAClD,2DAA2D;AAAA,EAC3D,iCAAiC;AAAA,EACjC,iCAAiC;AAAA,EACjC,6EAA6E;AAAA,EAC7E,8DAA8D;AAAA,EAC9D,0EAA0E;AAAA,EAC1E,2DAA2D;AAAA,EAC3D,yEAAyE;AAAA,EACzE,0DAA0D;AAAA,EAC1D,mDAAmD;AAAA,EACnD,4DAA4D;AAAA,EAC5D,iCAAiC;AACnC;AAoCO,SAAS,eAA8B;AAC5C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aACE,eAAe,IAAI,KAAK,SAAS,KACjC,gBAAgB,IAAI,KAAK,SAAS,KAClC,uBAAuB,IAAI,KAAK,SAAS,KACzC,gBAAgB,IAAI,KAAK,QAAQ;AAAA,IAErC;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,YAAY;AACtC,UAAI,SAAS,OAAO,KAAK;AACzB,YAAM,YAAY,cAAc,IAAI,MAAM,mBAAmB;AAC7D,YAAM,cAAc,MAAM,gBAAgB,IAAI,IAAI;AAClD,UAAI;AAEJ,UAAI,WAAW,SAAS,GAAG;AACzB,yBAAiB,MAAM,WAAW,OAAO,WAAW;AAAA,MACtD,WAAW,cAAc,OAAO;AAC9B,4BAAoB,OAAO,oBAAU,UAAU,MAAM,mBAAmB,WAAW,CAAC,CAAC;AAAA,MACvF,WAAW,cAAc,OAAO;AAC9B,cAAM,UAAU,OAAO,WAAW;AAAA,MACpC,WAAW,cAAc,QAAQ;AAC/B,8BAAsB,OAAO,qBAAW,MAAM,mBAAmB,WAAW,CAAC;AAAA,MAC/E,WAAW,cAAc,QAAQ;AAC/B,sBAAc,OAAO,MAAM,mBAAmB,WAAW,CAAC;AAAA,MAC5D,WAAW,yBAAyB,IAAI,SAAS,KAAM,MAAM,4BAA4B,OAAO,aAAa,SAAS,GAAI;AAAA,MAE1H,WAAW,gBAAgB,IAAI,SAAS,GAAG;AACzC,cAAM,YAAY,OAAO,aAAa,SAAS;AAAA,MACjD,WAAW,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM,EAAE,SAAS,SAAS,GAAG;AAC/E,cAAM,WAAW,OAAO,WAAW;AAAA,MACrC,WAAW,cAAc,OAAO;AAC9B,cAAM,UAAU,OAAO,WAAW;AAAA,MACpC,WAAW,cAAc,QAAQ;AAC/B,0CAAkC,OAAO,MAAM,mBAAmB,WAAW,CAAC;AAAA,MAChF,WAAW,qBAAqB,SAAS,GAAG;AAC1C,iCAAyB,OAAO,WAAW,WAAW;AAAA,MACxD,OAAO;AACL,gCAAwB,OAAO,aAAa,IAAI,KAAK,aAAa,QAAQ;AAAA,MAC5E;AAEA,aAAO;AAAA,QACL,UAAU;AACR,2BAAiB;AACjB,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,WAAW,WAA4B;AAC9C,SAAO,cAAc,UAAU,cAAc,UAAU,cAAc,UAAU,cAAc;AAC/F;AAEA,eAAe,WAAW,OAAoB,aAA+C;AAC3F,QAAM,UAAU,cAAc,mBAAS;AACvC,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,OAAO,OAAO;AACtB,QAAM,OAAO,OAAO;AAEpB,MAAI;AACF,UAAM,cAAc,MAAM,OAAO,cAAc;AAC/C,UAAM,YAAY,YAAY,aAAa,SAAS,SAAS;AAAA,MAC3D,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,cAAc;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,cAAc;AAAA,IAChB,CAAC;AACD,WAAO,aAAa,OAAO;AAAA,EAC7B,SAAS,OAAO;AACd,YAAQ,gBAAgB;AACxB,UAAM,eAAe,SAAS,cAAc,KAAK;AACjD,iBAAa,YAAY;AACzB,iBAAa,cAAc;AAC3B,YAAQ,OAAO,YAAY;AAC3B,QAAI;AACF,YAAM,sBAAsB,SAAS,WAAW;AAAA,IAClD,SAAS,eAAe;AACtB,YAAM,uBAAuB,SAAS,WAAW;AACjD,cAAQ,KAAK,mEAAmE,aAAa;AAAA,IAC/F;AACA,YAAQ,KAAK,qDAAqD,KAAK;AAAA,EACzE;AACA,SAAO,MAAM;AACf;AAEA,SAAS,aAAa,WAAoC;AACxD,QAAM,UAAU,UAAU,cAA2B,mBAAmB;AACxE,MAAI,CAAC,SAAS;AACZ,WAAO,MAAM;AAAA,EACf;AAEA,QAAM,SAAS,MAAM;AACnB,UAAM,SAAS,qBAAqB,OAAO;AAC3C,QAAI,OAAO,WAAW,GAAG;AACvB,cAAQ,MAAM,eAAe,kBAAkB;AAC/C;AAAA,IACF;AAEA,UAAM,iBAAiB,KAAK,IAAI,GAAG,UAAU,cAAc,EAAE;AAC7D,UAAM,YAAY,KAAK;AAAA,MACrB;AAAA,MACA,GAAG,OAAO,IAAI,CAAC,EAAE,KAAK,MAAM;AAC1B,cAAM,YAAY,KAAK,sBAAsB,EAAE;AAC/C,eAAO,KAAK,eAAe,aAAa,mBAAmB,KAAK,MAAM,KAAK,KAAK;AAAA,MAClF,CAAC;AAAA,IACH;AACA,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,iBAAiB,SAAS,CAAC;AACpE,YAAQ,MAAM,YAAY,oBAAoB,gBAAgB,KAAK,CAAC;AACpE,YAAQ,MAAM,YAAY,yBAAyB,GAAG,SAAS,IAAI;AAEnE,eAAW,EAAE,OAAO,KAAK,KAAK,QAAQ;AACpC,YAAM,aAAa,KAAK,gBAAgB,KAAK,sBAAsB,EAAE,UAAU,mBAAmB,KAAK,MAAM,MAAM;AACnH,UAAI,aAAa,GAAG;AAClB,cAAM,MAAM,SAAS,GAAG,KAAK,KAAK,aAAa,KAAK,CAAC;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACP,QAAM,SAAS,CAAC,GAAG,IAAI,GAAG,EAAE,IAAI,CAAC,UAAU,OAAO,WAAW,QAAQ,KAAK,CAAC;AAE3E,MAAI,OAAO,mBAAmB,aAAa;AACzC,WAAO,iBAAiB,UAAU,MAAM;AACxC,WAAO,MAAM;AACX,aAAO,QAAQ,CAAC,UAAU,OAAO,aAAa,KAAK,CAAC;AACpD,aAAO,oBAAoB,UAAU,MAAM;AAAA,IAC7C;AAAA,EACF;AAEA,QAAM,WAAW,IAAI,eAAe,MAAM;AAC1C,WAAS,QAAQ,SAAS;AAC1B,WAAS,QAAQ,OAAO;AACxB,SAAO,MAAM;AACX,WAAO,QAAQ,CAAC,UAAU,OAAO,aAAa,KAAK,CAAC;AACpD,aAAS,WAAW;AAAA,EACtB;AACF;AAEA,SAAS,qBAAqB,SAAwE;AACpG,QAAM,QAAQ,MAAM,KAAK,QAAQ,iBAA8B,kBAAkB,CAAC;AAClF,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,UAAM,SAAS,KAAK;AACpB,QAAI,QAAQ,UAAU,SAAS,qBAAqB,GAAG;AACrD,aAAO,EAAE,OAAO,QAAQ,KAAK;AAAA,IAC/B;AACA,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,SAAK,OAAO,KAAK;AACjB,UAAM,OAAO,IAAI;AACjB,WAAO,EAAE,OAAO,KAAK;AAAA,EACvB,CAAC;AACH;AAEA,SAAS,mBAAmB,OAAuB;AACjD,QAAM,SAAS,OAAO,WAAW,KAAK;AACtC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,SAAO,OAAO,SAAS,KAAK,IAAI,MAAM,QAAQ,CAAC,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE,IAAI;AAC3F;AAEA,eAAe,uBAAuB,WAAwB,aAAyC;AACrG,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AAEpB,MAAI;AACF,UAAM,MAAM,MAAM,cAAAC,QAAM,UAAU,WAAW;AAC7C,UAAM,cAAc,MAAM,IAAI,KAAK,mBAAmB,GAAG,MAAM,MAAM;AACrE,UAAM,aAAa,cAAc,sBAAsB,WAAW,IAAI,CAAC;AACvE,QAAI,WAAW,SAAS,GAAG;AACzB,iBAAW,iBAAiB,YAAY;AACtC,cAAM,YAAY,SAAS,cAAc,GAAG;AAC5C,kBAAU,cAAc;AACxB,gBAAQ,OAAO,SAAS;AAAA,MAC1B;AAAA,IACF,OAAO;AACL,YAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,YAAM,cAAc;AACpB,cAAQ,OAAO,KAAK;AAAA,IACtB;AAAA,EACF,QAAQ;AACN,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,cAAc;AACpB,YAAQ,OAAO,KAAK;AAAA,EACtB;AAEA,YAAU,OAAO,OAAO;AAC1B;AAEA,eAAe,sBAAsB,WAAwB,aAAyC;AACpG,QAAM,UAAU,MAAM,OAAO,SAAS;AACtC,QAAM,SAAS,MAAM,QAAQ;AAAA,IAC3B,EAAE,YAAY;AAAA,IACd;AAAA,MACE,cAAc,QAAQ,OAAO,WAAW,OAAO,WAAW;AAAA,QACxD,KAAK,QAAQ,MAAM,WAAW,WAAW,MAAM,MAAM,KAAK,QAAQ,CAAC;AAAA,MACrE,EAAE;AAAA,IACJ;AAAA,EACF;AACA,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,UAAQ,YAAY,aAAa,OAAO,SAAS,qEAAmB;AACpE,YAAU,OAAO,OAAO;AAExB,MAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,UAAM,QAAQ,SAAS,cAAc,SAAS;AAC9C,UAAM,YAAY;AAClB,UAAM,UAAU,SAAS,cAAc,SAAS;AAChD,YAAQ,cAAc,4BAAQ,OAAO,SAAS,MAAM;AACpD,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,eAAW,WAAW,OAAO,UAAU;AACrC,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,WAAK,cAAc,QAAQ;AAC3B,WAAK,OAAO,IAAI;AAAA,IAClB;AACA,UAAM,OAAO,SAAS,IAAI;AAC1B,cAAU,OAAO,KAAK;AAAA,EACxB;AACF;AAEA,eAAe,UAAU,OAAoB,aAAyC;AACpF,QAAM,MAAM,MAAM,cAAAA,QAAM,UAAU,WAAW;AAC7C,QAAM,UAAU,IAAI,KAAK,aAAa;AACtC,MAAI,CAAC,SAAS;AACZ,wBAAoB,OAAO,oBAAU,sCAAkB;AACvD;AAAA,EACF;AACA,wBAAsB,OAAO,oBAAU,MAAM,QAAQ,MAAM,MAAM,CAAC;AACpE;AAEA,SAAS,sBAAsB,OAAoB,OAAe,KAAmB;AACnF,QAAM,UAAU,cAAc,KAAK;AACnC,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,QAAM,SAAS,0BAA0B,GAAG;AAC5C,MAAI,OAAO,SAAS,GAAG;AACrB,eAAW,SAAS,QAAQ;AAC1B,YAAM,YAAY,SAAS,cAAc,GAAG;AAC5C,gBAAU,cAAc;AACxB,cAAQ,OAAO,SAAS;AAAA,IAC1B;AAAA,EACF,OAAO;AACL,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,cAAc;AACpB,YAAQ,OAAO,KAAK;AAAA,EACtB;AACA,UAAQ,OAAO,OAAO;AACtB,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,oBAAoB,OAAoB,OAAe,MAAoB;AAClF,QAAM,UAAU,cAAc,KAAK;AACnC,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,MAAI,cAAc,QAAQ;AAC1B,UAAQ,OAAO,GAAG;AAClB,QAAM,OAAO,OAAO;AACtB;AAEA,eAAe,YACb,OACA,aACA,WACe;AACf,QAAM,OAAO,MAAM,OAAO,MAAM;AAChC,MAAI;AACJ,MAAI;AACF,eAAW,KAAK,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AAAA,EACrD,SAAS,OAAO;AACd,QAAI,qBAAqB,SAAS,GAAG;AACnC,+BAAyB,OAAO,WAAW,aAAa,6CAAU,qBAAqB,KAAK,CAAC,EAAE;AAC/F;AAAA,IACF;AACA,wBAAoB,OAAO,WAAW,qBAAqB,KAAK,CAAC;AACjE;AAAA,EACF;AACA,QAAM,gBAAgB,MAAM,mBAAmB,WAAW,EAAE,MAAM,MAAM,CAAC,CAAC;AAC1E,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,OAAK,aAAa,QAAQ,SAAS;AACnC,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,aAAa,QAAQ,UAAU;AACvC,QAAM,UAAU,oBAAI,IAA+B;AAEnD,QAAM,oBAAoB,CAAC,WAAmB,eAAuB;AACnE,YAAQ,gBAAgB;AACxB,YAAQ,QAAQ,CAAC,QAAQ,SAAS;AAChC,YAAM,SAAS,SAAS;AACxB,aAAO,UAAU,OAAO,aAAa,MAAM;AAC3C,aAAO,aAAa,iBAAiB,OAAO,MAAM,CAAC;AAAA,IACrD,CAAC;AACD,YAAQ,aAAa,cAAc,SAAS;AAE5C,UAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,YAAQ,cAAc;AACtB,UAAM,QAAQ,SAAS,OAAO,SAAS;AACvC,UAAM,QAAQ,KAAK,MAAM,aAAa,MAAM,MAAM,KAAK,OAAO;AAC9D,UAAM,WAAW,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI;AACzC,UAAM,cAAc,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI;AAC5C,UAAM,cAAc,mBAAmB,OAAO,OAAO,KAAK,MAAM,WAAW;AAE3E,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AACpB,YAAQ,cAAc,GAAG,QAAQ,aAAQ,WAAW,UAClD,YAAY,SAAS,IAAI,sBAAO,YAAY,MAAM,0CAAY,EAChE;AAEA,UAAM,eAAe,SAAS,cAAc,KAAK;AACjD,iBAAa,YAAY;AACzB,UAAM,WAAW,oBAAoB,UAAU,WAAW;AAC1D,UAAM,iBAAiB,0BAA0B,UAAU,MAAM,kBAAkB,CAAC;AACpF,UAAM,oBAAoB,MAAM;AAC9B,mBAAa;AAAA,QACX;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK,MAAM;AAAA,UACX,KAAK,MAAM;AAAA,QACb;AAAA,MACF;AACA,sBAAgB,OAAO;AAAA,IACzB;AAEA,YAAQ,OAAO,SAAS,OAAO;AAC/B,QAAI,gBAAgB;AAClB,cAAQ,OAAO,eAAe,OAAO;AAAA,IACvC;AACA,YAAQ,OAAO,YAAY;AAC3B,sBAAkB;AAElB,QAAI,YAAY,SAAS,GAAG;AAC1B,YAAM,UAAU,SAAS,cAAc,SAAS;AAChD,cAAQ,YAAY;AACpB,YAAM,iBAAiB,SAAS,cAAc,SAAS;AACvD,qBAAe,cAAc;AAC7B,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,iBAAW,QAAQ,YAAY,MAAM,GAAG,GAAG,GAAG;AAC5C,cAAM,MAAM,SAAS,cAAc,IAAI;AACvC,YAAI,cAAc,GAAG,KAAK,OAAO,KAAK,KAAK,OAAO;AAClD,aAAK,OAAO,GAAG;AAAA,MACjB;AACA,UAAI,YAAY,SAAS,KAAK;AAC5B,cAAM,MAAM,SAAS,cAAc,IAAI;AACvC,YAAI,cAAc,gBAAM,YAAY,SAAS,GAAG;AAChD,aAAK,OAAO,GAAG;AAAA,MACjB;AACA,cAAQ,OAAO,gBAAgB,IAAI;AACnC,cAAQ,OAAO,OAAO;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,WAAW,GAAG;AACpC,YAAQ,cAAc,cAAc,YAAY,6GAA6B;AAAA,EAC/E,OAAO;AACL,eAAW,CAAC,OAAO,SAAS,KAAK,SAAS,WAAW,QAAQ,GAAG;AAC9D,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,OAAO;AACd,aAAO,aAAa,QAAQ,KAAK;AACjC,aAAO,aAAa,iBAAiB,OAAO;AAC5C,aAAO,cAAc;AACrB,aAAO,QAAQ;AACf,aAAO,iBAAiB,SAAS,MAAM,kBAAkB,WAAW,KAAK,CAAC;AAC1E,cAAQ,IAAI,WAAW,MAAM;AAC7B,WAAK,OAAO,MAAM;AAClB,UAAI,UAAU,GAAG;AACf,0BAAkB,WAAW,KAAK;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,OAAO;AAC1B,MAAI,cAAc,SAAS,GAAG;AAC5B,UAAM,OAAO,0BAA0B,aAAa,CAAC;AAAA,EACvD;AACF;AAEA,SAAS,oBAAoB,OAAoB,WAAmB,QAAsB;AACxF,QAAM,UAAU,cAAc,sCAAQ;AACtC,QAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,QAAM,cAAc,IAAI,aAAa,OAAO;AAC5C,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cAAc;AACnB,QAAM,UAAU,SAAS,cAAc,GAAG;AAC1C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO,MAAM,OAAO;AACnC,QAAM,OAAO,OAAO;AACtB;AAgBA,SAAS,cAAc,OAAoB,KAAmB;AAC5D,QAAM,SAAS,aAAa,GAAG;AAC/B,qBAAmB,OAAO,QAAQ,6DAAgB;AACpD;AAEA,SAAS,mBAAmB,OAAoB,QAAuB,cAA4B;AACjG,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,OAAK,aAAa,QAAQ,SAAS;AACnC,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,aAAa,QAAQ,UAAU;AACvC,QAAM,UAAU,oBAAI,IAA+B;AAEnD,QAAM,qBAAqB,CAAC,OAAoB,eAAuB;AACrE,YAAQ,gBAAgB;AACxB,YAAQ,QAAQ,CAAC,QAAQ,SAAS;AAChC,YAAM,SAAS,SAAS,MAAM;AAC9B,aAAO,UAAU,OAAO,aAAa,MAAM;AAC3C,aAAO,aAAa,iBAAiB,OAAO,MAAM,CAAC;AAAA,IACrD,CAAC;AACD,YAAQ,aAAa,cAAc,MAAM,IAAI;AAE7C,UAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,YAAQ,cAAc,MAAM;AAC5B,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AACpB,UAAM,WAAW,MAAM,KAAK;AAC5B,UAAM,cAAc,KAAK,IAAI,GAAG,GAAG,MAAM,KAAK,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;AACtE,YAAQ,cAAc,GAAG,QAAQ,aAAQ,WAAW,UAClD,MAAM,SAAS,SAAS,IAAI,sBAAO,MAAM,SAAS,MAAM,0CAAY,EACtE;AAEA,UAAM,eAAe,SAAS,cAAc,KAAK;AACjD,iBAAa,YAAY;AACzB,UAAM,WAAW,oBAAoB,UAAU,WAAW;AAC1D,UAAM,iBAAiB,0BAA0B,UAAU,MAAM,kBAAkB,CAAC;AACpF,UAAM,oBAAoB,MAAM;AAC9B,mBAAa,gBAAgB,uBAAuB,OAAO,YAAY,QAAQ,CAAC;AAChF,sBAAgB,OAAO;AAAA,IACzB;AAEA,YAAQ,OAAO,SAAS,OAAO;AAC/B,QAAI,gBAAgB;AAClB,cAAQ,OAAO,eAAe,OAAO;AAAA,IACvC;AACA,YAAQ,OAAO,YAAY;AAC3B,sBAAkB;AAElB,QAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,YAAM,UAAU,SAAS,cAAc,SAAS;AAChD,cAAQ,YAAY;AACpB,YAAM,iBAAiB,SAAS,cAAc,SAAS;AACvD,qBAAe,cAAc;AAC7B,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,iBAAW,QAAQ,MAAM,SAAS,MAAM,GAAG,GAAG,GAAG;AAC/C,cAAM,MAAM,SAAS,cAAc,IAAI;AACvC,YAAI,cAAc,GAAG,KAAK,OAAO,KAAK,KAAK,OAAO;AAClD,aAAK,OAAO,GAAG;AAAA,MACjB;AACA,UAAI,MAAM,SAAS,SAAS,KAAK;AAC/B,cAAM,MAAM,SAAS,cAAc,IAAI;AACvC,YAAI,cAAc,gBAAM,MAAM,SAAS,SAAS,GAAG;AACnD,aAAK,OAAO,GAAG;AAAA,MACjB;AACA,cAAQ,OAAO,gBAAgB,IAAI;AACnC,cAAQ,OAAO,OAAO;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,YAAQ,cAAc;AAAA,EACxB,OAAO;AACL,eAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC7C,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,OAAO;AACd,aAAO,aAAa,QAAQ,KAAK;AACjC,aAAO,aAAa,iBAAiB,OAAO;AAC5C,aAAO,cAAc,MAAM;AAC3B,aAAO,QAAQ,MAAM;AACrB,aAAO,iBAAiB,SAAS,MAAM,mBAAmB,OAAO,KAAK,CAAC;AACvE,cAAQ,IAAI,MAAM,MAAM,MAAM;AAC9B,WAAK,OAAO,MAAM;AAClB,UAAI,UAAU,GAAG;AACf,2BAAmB,OAAO,KAAK;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,OAAO;AAC5B;AAEA,eAAe,mBAAmB,aAAmD;AACnF,QAAM,MAAM,MAAM,cAAAA,QAAM,UAAU,WAAW;AAC7C,QAAM,eAAe,OAAO,OAAO,IAAI,KAAK,EACzC,OAAO,CAAC,UAAU,CAAC,MAAM,OAAO,+BAA+B,KAAK,MAAM,IAAI,CAAC,EAC/E,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAC9C,QAAM,SAAyB,CAAC;AAChC,aAAW,CAAC,OAAO,KAAK,KAAK,aAAa,QAAQ,GAAG;AACnD,UAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AACpC,UAAM,QAAQ,cAAc,KAAK,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,QAAQ,QAAQ,CAAC,MAAM;AACvF,QAAI,OAAO;AACT,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,KAAa,cAA2C;AAC7E,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,gBAAgB,GAAG;AAChC,QAAM,QAAQ,cAAc,KAAK,OAAO,KAAK,aAAa,QAAQ,WAAW,EAAE;AAC/E,QAAM,iBAAiB,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,QAAQ,cAAc,KAAK;AAChH,QAAM,SAAS,eACZ,IAAI,CAAC,SAAS,UAAU,iBAAiB,SAAS,KAAK,CAAC,EACxD,OAAO,CAAC,SAA2E,KAAK,OAAO,SAAS,CAAC;AAE5G,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,YAAY,OAAO,KAAK,CAAC,SAAS,KAAK,WAAW,SAAS,CAAC,GAAG,cAAc,CAAC;AAAA,IAC9E,QAAQ,OAAO,IAAI,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,QAAQ,KAAK,OAAO,EAAE;AAAA,EACzE;AACF;AAEA,SAAS,gBAAgB,KAAuB;AAC9C,QAAM,YAAY,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAAE;AAAA,IAC1D,CAAC,YAAY,QAAQ,UAAU,SAAS,OAAO,KAAK,QAAQ,cAAc;AAAA,EAC5E,GAAG;AACH,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AACA,SAAO,UAAU,QAAQ,WAAW,EAAE,EAAE,YAAY;AACtD;AAEA,SAAS,iBACP,SACA,OAC0D;AAC1D,SAAO;AAAA,IACL,MAAM,cAAc,SAAS,IAAI,KAAK,UAAU,QAAQ,CAAC;AAAA,IACzD,QAAQ,iBAAiB,SAAS,KAAK;AAAA,IACvC,YAAY,iBAAiB,SAAS,KAAK;AAAA,EAC7C;AACF;AAEA,SAAS,0BAA0B,QAAqC;AACtE,QAAM,UAAU,cAAc,sCAAQ;AACtC,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,aAAW,SAAS,QAAQ;AAC1B,SAAK,OAAO,gBAAgB,KAAK,CAAC;AAAA,EACpC;AACA,UAAQ,OAAO,IAAI;AACnB,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAkC;AACzD,QAAM,OAAO,SAAS,cAAc,SAAS;AAC7C,OAAK,YAAY;AAEjB,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,QAAM,QAAQ,SAAS,cAAc,IAAI;AACzC,QAAM,cAAc,MAAM;AAC1B,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc,GAAG,MAAM,IAAI,SAAM,MAAM,OAAO,MAAM;AACzD,SAAO,OAAO,OAAO,IAAI;AAEzB,QAAM,MAAM,eAAe,KAAK;AAChC,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,cAAc;AACtB,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,aAAW,QAAQ,MAAM,QAAQ;AAC/B,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,QAAI,cAAc,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,GACpE,KAAK,OAAO,SAAS,KAAK,eAAU,KAAK,OAAO,MAAM,YAAO,EAC/D;AACA,SAAK,OAAO,GAAG;AAAA,EACjB;AACA,UAAQ,OAAO,SAAS,IAAI;AAC5B,OAAK,OAAO,QAAQ,KAAK,OAAO;AAChC,SAAO;AACT;AAEA,SAAS,eAAe,OAAoC;AAC1D,QAAM,MAAM,SAAS,gBAAgB,8BAA8B,KAAK;AACxE,MAAI,aAAa,WAAW,aAAa;AACzC,MAAI,aAAa,QAAQ,KAAK;AAC9B,MAAI,aAAa,cAAc,MAAM,KAAK;AAC1C,MAAI,UAAU,IAAI,eAAe;AAEjC,QAAM,YAAY,MAAM,OAAO,QAAQ,CAAC,SAAS,KAAK,MAAM,EAAE,OAAO,CAAC,UAAU,OAAO,SAAS,KAAK,CAAC;AACtG,QAAM,MAAM,KAAK,IAAI,GAAG,GAAG,SAAS;AACpC,QAAM,MAAM,KAAK,IAAI,GAAG,GAAG,SAAS;AACpC,QAAM,OAAO,MAAM,OAAO;AAC1B,QAAM,SAAS,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;AACrE,QAAM,OAAO,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,KAAK,QAAQ,IAAI;AAErD,YAAU,KAAK,QAAQ,EAAE,IAAI,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,QAAQ,OAAO,iBAAiB,CAAC;AAChH,YAAU,KAAK,QAAQ;AAAA,IACrB,IAAI,KAAK;AAAA,IACT,IAAI,KAAK,IAAI,KAAK;AAAA,IAClB,IAAI,KAAK,IAAI,KAAK;AAAA,IAClB,IAAI,KAAK,IAAI,KAAK;AAAA,IAClB,OAAO;AAAA,EACT,CAAC;AAED,QAAM,OAAO,QAAQ,CAAC,QAAQ,gBAAgB;AAC5C,UAAM,QAAQ,OAAO,cAAc,OAAO,MAAM;AAChD,UAAM,OAAO,OAAO,OAAO,SAAS,IAAI,KAAK,SAAS,OAAO,OAAO,SAAS,KAAK,KAAK;AACvF,UAAM,SAAS,OAAO,OAAO,IAAI,CAAC,OAAO,WAAW;AAAA,MAClD,GAAG,KAAK,IAAI,QAAQ;AAAA,MACpB,GAAG,KAAK,IAAI,KAAK,UAAW,QAAQ,OAAO,OAAQ,KAAK;AAAA,IAC1D,EAAE;AAEF,QAAI,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,KAAK,SAAS,KAAK,GAAG;AAC5D,YAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG,MAAM,OAAO,MAAM;AACxF,aAAO,QAAQ,CAAC,OAAO,UAAU;AAC/B,cAAM,QAAQ,KAAK,IAAI,KAAK,UAAW,IAAI,OAAO,OAAQ,KAAK;AAC/D,cAAM,IAAI,MAAM,IAAK,WAAW,MAAM,OAAO,SAAU,IAAI,cAAc;AACzE,kBAAU,KAAK,QAAQ;AAAA,UACrB;AAAA,UACA,GAAG,KAAK,IAAI,MAAM,GAAG,KAAK;AAAA,UAC1B,OAAO;AAAA,UACP,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,MAAM,CAAC,CAAC;AAAA,UAC7C,MAAM;AAAA,UACN,cAAc;AAAA,QAChB,CAAC;AAAA,MACH,CAAC;AAAA,IACH,OAAO;AACL,gBAAU,KAAK,YAAY;AAAA,QACzB,QAAQ,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAAA,QACrF,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,MACrB,CAAC;AACD,iBAAW,SAAS,OAAO,MAAM,GAAG,EAAE,GAAG;AACvC,kBAAU,KAAK,UAAU,EAAE,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,GAAG,GAAG,MAAM,MAAM,CAAC;AAAA,MAC1E;AAAA,IACF;AAEA,iBAAa,KAAK,OAAO,MAAM,OAAO,KAAK,cAAc,KAAK,GAAG;AAAA,EACnE,CAAC;AAED,SAAO;AACT;AAEA,SAAS,aAAa,KAAoB,OAAe,OAAe,GAAW,GAAiB;AAClG,YAAU,KAAK,QAAQ,EAAE,GAAG,GAAG,IAAI,IAAI,OAAO,IAAI,QAAQ,IAAI,IAAI,GAAG,MAAM,MAAM,CAAC;AAClF,QAAM,OAAO,UAAU,KAAK,QAAQ,EAAE,GAAG,IAAI,IAAI,GAAG,OAAO,kBAAkB,CAAC;AAC9E,OAAK,cAAc,MAAM,SAAS,KAAK,GAAG,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ;AACtE;AAEA,SAAS,UACP,QACA,KACA,YACyB;AACzB,QAAM,UAAU,SAAS,gBAAgB,8BAA8B,GAAG;AAC1E,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,YAAQ,aAAa,KAAK,OAAO,KAAK,CAAC;AAAA,EACzC;AACA,SAAO,OAAO,OAAO;AACrB,SAAO;AACT;AAEA,SAAS,cAAc,MAAkB,WAA2B;AAClE,QAAM,UAAU,MAAM,KAAK,KAAK,iBAAiB,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,cAAc,SAAS;AAClG,SAAO,UAAU,UAAU,OAAO,IAAI;AACxC;AAEA,SAAS,iBAAiB,MAAkB,WAA6B;AACvE,QAAM,UAAU,MAAM,KAAK,KAAK,iBAAiB,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,cAAc,SAAS;AAClG,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AACA,SAAO,kBAAkB,OAAO;AAClC;AAEA,SAAS,iBAAiB,MAAkB,WAA6B;AACvE,QAAM,UAAU,MAAM,KAAK,KAAK,iBAAiB,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,cAAc,SAAS;AAClG,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AACA,SAAO,MAAM,KAAK,QAAQ,iBAAiB,GAAG,CAAC,EAC5C,OAAO,CAAC,SAAS,KAAK,cAAc,GAAG,EACvC,IAAI,CAAC,SAAS,OAAO,KAAK,eAAe,EAAE,CAAC,EAC5C,OAAO,CAAC,UAAU,OAAO,SAAS,KAAK,CAAC;AAC7C;AAEA,SAAS,UAAU,SAA0B;AAC3C,SACE,MAAM,KAAK,QAAQ,iBAAiB,GAAG,CAAC,EACrC,OAAO,CAAC,SAAS,KAAK,cAAc,OAAO,KAAK,cAAc,GAAG,EACjE,IAAI,CAAC,SAAS,KAAK,aAAa,KAAK,KAAK,EAAE,EAC5C,KAAK,OAAO,KAAK;AAExB;AAEA,SAAS,kBAAkB,SAA4B;AACrD,SAAO,MAAM,KAAK,QAAQ,iBAAiB,GAAG,CAAC,EAC5C,OAAO,CAAC,SAAS,KAAK,cAAc,OAAO,KAAK,cAAc,GAAG,EACjE,IAAI,CAAC,SAAS,KAAK,aAAa,KAAK,KAAK,EAAE,EAC5C,OAAO,OAAO;AACnB;AAcA,SAAS,oBAAoB,UAAkB,aAAoC;AACjF,SAAO;AAAA,IACL,UAAU;AAAA,IACV,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,UAAyB,QAAgD;AAC1G,QAAM,YAAY,SAAS,WAAW;AACtC,QAAM,eAAe,SAAS,cAAc;AAC5C,MAAI,CAAC,aAAa,CAAC,cAAc;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AAErB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,YAAY;AAEjB,QAAM,UAAU,mBAAmB,qBAAW,MAAM;AAClD,aAAS,WAAW,KAAK,IAAI,GAAG,SAAS,WAAW,iBAAiB;AACrE,WAAO;AAAA,EACT,CAAC;AACD,QAAM,UAAU,mBAAmB,qBAAW,MAAM;AAClD,aAAS,WAAW,KAAK,IAAI,SAAS,SAAS,UAAU,iBAAiB,GAAG,SAAS,WAAW,iBAAiB;AAClH,WAAO;AAAA,EACT,CAAC;AACD,QAAM,UAAU,mBAAmB,oBAAU,MAAM;AACjD,aAAS,cAAc,KAAK,IAAI,GAAG,SAAS,cAAc,oBAAoB;AAC9E,WAAO;AAAA,EACT,CAAC;AACD,QAAM,UAAU,mBAAmB,oBAAU,MAAM;AACjD,aAAS,cAAc,KAAK;AAAA,MAC1B,SAAS,SAAS,aAAa,oBAAoB;AAAA,MACnD,SAAS,cAAc;AAAA,IACzB;AACA,WAAO;AAAA,EACT,CAAC;AAED,WAAS,OAAO,MAAM,SAAS,SAAS,SAAS,OAAO;AAExD,QAAM,SAAS,MAAM;AACnB,UAAM,SAAS,KAAK,IAAI,SAAS,WAAW,mBAAmB,SAAS,QAAQ;AAChF,UAAM,YAAY,KAAK,IAAI,SAAS,cAAc,sBAAsB,SAAS,WAAW;AAC5F,SAAK,cAAc,sEAAe,SAAS,WAAW,CAAC,IAAI,MAAM,gBAAM,SAAS,cAAc,CAAC,IAAI,SAAS;AAC5G,YAAQ,WAAW,SAAS,aAAa;AACzC,YAAQ,WAAW,SAAS,YAAY,SAAS,SAAS,UAAU,iBAAiB;AACrF,YAAQ,WAAW,SAAS,gBAAgB;AAC5C,YAAQ,WAAW,SAAS,eAAe,SAAS,SAAS,aAAa,oBAAoB;AAC9F,YAAQ,SAAS,QAAQ,SAAS,CAAC;AACnC,YAAQ,SAAS,QAAQ,SAAS,CAAC;AAAA,EACrC;AAEA,SAAO;AACP,SAAO,EAAE,SAAS,UAAU,OAAO;AACrC;AAEA,SAAS,mBAAmB,OAAe,SAAwC;AACjF,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,OAAO;AACd,SAAO,cAAc;AACrB,SAAO,iBAAiB,SAAS,OAAO;AACxC,SAAO;AACT;AAEA,SAAS,SAAS,OAAe,MAAsB;AACrD,SAAO,KAAK,IAAI,GAAG,QAAQ,IAAI;AACjC;AAEA,SAAS,yBACP,OACA,OACA,YACA,UACA,YACA,YACkB;AAClB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,KAAK,aAAa,aAAa,CAAC;AACtC,QAAM,SAAS,KAAK,IAAI,MAAM,EAAE,IAAI,SAAS,WAAW,oBAAoB,GAAG,MAAM,EAAE,CAAC;AACxF,QAAM,YAAY,KAAK,IAAI,MAAM,EAAE,IAAI,SAAS,cAAc,uBAAuB,GAAG,MAAM,EAAE,CAAC;AAEjG,WAAS,WAAW,MAAM,EAAE,IAAI,SAAS,UAAU,YAAY,QAAQ,YAAY,GAAG;AACpF,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,aAAS,cAAc,MAAM,EAAE,IAAI,SAAS,aAAa,eAAe,WAAW,eAAe,GAAG;AACnG,YAAM,OAAO,SAAS,cAAc,aAAa,MAAM,EAAE,IAAI,OAAO,IAAI;AACxE,YAAM,UAAU,WAAW,EAAE,GAAG,UAAU,GAAG,YAAY,CAAC;AAC1D,YAAM,aAAa,MAAM,OAAO;AAChC,WAAK,QAAQ,OAAO;AACpB,YAAM,OAAO,aAAa,WAAW,UAAU,IAAI;AACnD,WAAK,cAAc;AACnB,UAAI,MAAM;AACR,aAAK,QAAQ;AAAA,MACf;AACA,UAAI,YAAY,GAAG;AACjB,aAAK,UAAU,IAAI,kBAAkB;AACrC,aAAK,QAAQ,IAAI,WAAW,CAAC;AAAA,MAC/B;AACA,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,UAAM,OAAO,GAAG;AAAA,EAClB;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAoB,YAAoB,UAA2C;AACjH,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,KAAK,aAAa,aAAa,CAAC;AACtC,QAAM,aAAa,IAAI,IAAI,MAAM,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC;AACrF,QAAM,SAAS,KAAK,IAAI,SAAS,WAAW,mBAAmB,MAAM,KAAK,MAAM;AAChF,WAAS,WAAW,SAAS,UAAU,WAAW,QAAQ,YAAY,GAAG;AACvE,UAAM,YAAY,MAAM,KAAK,QAAQ,KAAK,CAAC;AAC3C,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,UAAM,YAAY,KAAK,IAAI,SAAS,cAAc,sBAAsB,SAAS,WAAW;AAC5F,aAAS,cAAc,SAAS,aAAa,cAAc,WAAW,eAAe,GAAG;AACtF,YAAM,QAAQ,UAAU,WAAW,KAAK;AACxC,YAAM,OAAO,SAAS,cAAc,aAAa,IAAI,OAAO,IAAI;AAChE,YAAM,UAAU,SAAS,UAAU,WAAW;AAC9C,WAAK,QAAQ,OAAO;AACpB,WAAK,cAAc;AACnB,UAAI,OAAO;AACT,aAAK,QAAQ;AAAA,MACf;AACA,YAAM,UAAU,WAAW,IAAI,OAAO;AACtC,UAAI,SAAS;AACX,aAAK,UAAU,IAAI,kBAAkB;AACrC,aAAK,QAAQ;AAAA,MACf;AACA,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,UAAM,OAAO,GAAG;AAAA,EAClB;AACA,SAAO;AACT;AAEA,SAAS,aAAa,KAA4B;AAChD,QAAM,cAAc,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAC1E,MAAI,YAAY,cAAc,aAAa,GAAG;AAC5C,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,MAAM,KAAK,YAAY,qBAAqB,GAAG,CAAC,EACpD,OAAO,CAAC,YAAY,QAAQ,cAAc,OAAO,EACjD,IAAI,CAAC,cAAc,eAAe,kBAAkB,cAAc,UAAU,CAAC,EAC7E,OAAO,CAAC,UAAU,MAAM,KAAK,SAAS,CAAC;AAC5C;AAEA,SAAS,kBAAkB,cAAuB,YAAiC;AACjF,QAAM,OAAmB,CAAC;AAC1B,QAAM,WAAwD,CAAC;AAC/D,QAAM,YAAYC,iBAAgB,cAAc,MAAM,KAAK,SAAS,aAAa,CAAC;AAClF,aAAW,cAAc,MAAM,KAAK,aAAa,QAAQ,EAAE,OAAO,CAAC,YAAY,QAAQ,cAAc,WAAW,GAAG;AACjH,UAAM,aAAa,YAAYA,iBAAgB,YAAY,sBAAsB,GAAG,GAAG;AACvF,UAAM,YAAY,gBAAgB,YAAY,KAAK,QAAQ,QAAQ;AACnE,aAAS,QAAQ,GAAG,QAAQ,YAAY,SAAS,GAAG;AAClD,WAAK,KAAK,CAAC,GAAG,SAAS,CAAC;AAAA,IAC1B;AAAA,EACF;AACA,wBAAsB,IAAI;AAC1B,SAAO,EAAE,MAAM,WAAW,MAAM,SAAS;AAC3C;AAEA,SAAS,gBACP,YACA,UACA,UACU;AACV,QAAM,MAAgB,CAAC;AACvB,aAAW,eAAe,MAAM,KAAK,WAAW,QAAQ,EAAE;AAAA,IACxD,CAAC,YAAY,QAAQ,cAAc,gBAAgB,QAAQ,cAAc;AAAA,EAC3E,GAAG;AACD,UAAM,gBAAgB,YAAYA,iBAAgB,aAAa,yBAAyB,GAAG,GAAG;AAC9F,UAAM,QAAQ,wBAAwB,WAAW;AACjD,UAAM,UAAUA,iBAAgB,aAAa,SAAS;AACtD,aAAS,QAAQ,GAAG,QAAQ,eAAe,SAAS,GAAG;AACrD,YAAM,cAAc,IAAI;AACxB,UAAI,KAAK,KAAK;AACd,UAAI,SAAS;AACX,iBAAS,KAAK,EAAE,SAAS,SAAS,UAAU,WAAW,GAAG,QAAQ,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACA,yBAAuB,GAAG;AAC1B,SAAO;AACT;AAEA,SAAS,wBAAwB,aAA8B;AAC7D,QAAM,OAAO,mCAAmC,WAAW;AAC3D,MAAI,MAAM;AACR,WAAO;AAAA,EACT;AACA,SACEA,iBAAgB,aAAa,OAAO,KACpCA,iBAAgB,aAAa,YAAY,KACzCA,iBAAgB,aAAa,YAAY,KACzCA,iBAAgB,aAAa,eAAe,KAC5C;AAEJ;AAEA,SAAS,mCAAmC,SAA0B;AACpE,QAAM,YAAsB,CAAC;AAC7B,QAAM,QAAQ,CAAC,SAAe;AAC5B,QAAI,KAAK,aAAa,KAAK,WAAW;AACpC,gBAAU,KAAK,KAAK,eAAe,EAAE;AACrC;AAAA,IACF;AACA,QAAI,EAAE,gBAAgB,UAAU;AAC9B;AAAA,IACF;AACA,QAAI,KAAK,cAAc,KAAK;AAC1B,gBAAU,KAAK,IAAI,OAAO,YAAYA,iBAAgB,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC;AACtE;AAAA,IACF;AACA,QAAI,KAAK,cAAc,OAAO;AAC5B,gBAAU,KAAK,GAAI;AACnB;AAAA,IACF;AACA,QAAI,KAAK,cAAc,cAAc;AACnC,gBAAU,KAAK,IAAI;AACnB;AAAA,IACF;AACA,eAAW,SAAS,MAAM,KAAK,KAAK,UAAU,GAAG;AAC/C,YAAM,KAAK;AAAA,IACb;AACA,QAAI,KAAK,cAAc,OAAO,KAAK,cAAc,KAAK;AACpD,gBAAU,KAAK,IAAI;AAAA,IACrB;AAAA,EACF;AACA,QAAM,OAAO;AACb,SAAO,UAAU,KAAK,EAAE,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK;AACtD;AAEA,SAASA,iBAAgB,SAAkB,WAAkC;AAC3E,QAAM,SAAS,QAAQ,aAAa,SAAS;AAC7C,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AACA,aAAW,aAAa,MAAM,KAAK,QAAQ,UAAU,GAAG;AACtD,QAAI,UAAU,cAAc,WAAW;AACrC,aAAO,UAAU;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAsB,KAAqB;AAC9D,QAAM,SAAS,QAAQ,OAAO,SAAS,OAAO,EAAE,IAAI;AACpD,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,SAAS,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,QAAQ,GAAG;AAC7B;AAEA,SAAS,sBAAsB,MAAwB;AACrD,SAAO,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,CAAC,EAAE,MAAM,CAAC,SAAS,SAAS,EAAE,GAAG;AAC5E,SAAK,IAAI;AAAA,EACX;AACF;AAEA,SAAS,uBAAuB,KAAqB;AACnD,SAAO,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,IAAI;AACnD,QAAI,IAAI;AAAA,EACV;AACF;AAEA,SAAS,mBACP,OACA,OACA,YAC6C;AAC7C,QAAM,WAAwD,CAAC;AAC/D,WAAS,MAAM,MAAM,EAAE,GAAG,OAAO,MAAM,EAAE,GAAG,OAAO,GAAG;AACpD,aAAS,SAAS,MAAM,EAAE,GAAG,UAAU,MAAM,EAAE,GAAG,UAAU,GAAG;AAC7D,YAAM,UAAU,WAAW,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;AAChD,YAAM,OAAO,MAAM,OAAO;AAC1B,UAAI,MAAM,GAAG;AACX,iBAAS,KAAK,EAAE,SAAS,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,SAAS,UAAkB,aAA6B;AAC/D,MAAI,SAAS;AACb,MAAI,QAAQ,cAAc;AAC1B,SAAO,QAAQ,GAAG;AAChB,UAAM,aAAa,QAAQ,KAAK;AAChC,aAAS,OAAO,aAAa,KAAK,SAAS,IAAI;AAC/C,YAAQ,KAAK,OAAO,QAAQ,KAAK,EAAE;AAAA,EACrC;AACA,SAAO,GAAG,MAAM,GAAG,WAAW,CAAC;AACjC;AAEA,eAAe,WAAW,OAAoB,aAAyC;AACrF,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,YAAY;AAEtB,MAAI;AACF,UAAM,MAAM,MAAM,cAAAD,QAAM,UAAU,WAAW;AAC7C,UAAM,0BAA0B,OAAO,MAAM,wBAAwB,GAAG,CAAC;AAAA,EAC3E,SAAS,OAAO;AACd,YAAQ,KAAK,6CAA6C,KAAK;AAAA,EACjE;AAEA,QAAM,OAAO,SAAS;AACtB,MAAI;AACF,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,wBAAwB;AAC5D,UAAM,WAAW,KAAK,aAAa,SAAS;AAAA,EAC9C,QAAQ;AACN,cAAU,cAAc;AAAA,EAC1B;AACF;AAEA,eAAe,UAAU,OAAoB,aAAyC;AACpF,QAAM,MAAM,MAAM,cAAAA,QAAM,UAAU,WAAW;AAC7C,QAAM,UAAU,IAAI,KAAK,aAAa;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,cAAc;AACpB;AAAA,EACF;AACA,QAAM,MAAM,MAAM,QAAQ,MAAM,MAAM;AACtC,QAAM,SAAS,MAAM,iBAAiB,KAAK,aAAa;AACxD,4BAA0B,OAAO,gCAAgC,aAAa,KAAK,8BAAU,GAAG,KAAK,OAAO,MAAM,CAAC;AACnH,iCAA+B,OAAO,gCAAY,KAAK,MAAM;AAC/D;AAEA,SAAS,kCAAkC,OAAoB,KAAmB;AAChF,4BAA0B,OAAO,gCAAgC,iCAAa,KAAK,CAAC,CAAC;AACrF,iCAA+B,OAAO,iCAAa,KAAK,CAAC,CAAC;AAC5D;AAEA,eAAe,4BACb,OACA,aACA,WACkB;AAClB,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,cAAAA,QAAM,UAAU,WAAW;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,OAAO,IAAI,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG;AACrE,QAAM,WAAW,CAAC,SAAiB,QAAQ,KAAK,CAAC,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,CAAC;AAC1G,QAAM,aAAa,IAAI,KAAK,sBAAsB,EAAE,CAAC;AAErD,MAAI,SAAS,mBAAmB,GAAG;AACjC,8BAA0B,OAAO,WAAW,oHAAoC;AAChF,UAAM,WAAW,OAAO,WAAW;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,iBAAiB,GAAG;AAC/B,8BAA0B,OAAO,WAAW,wHAAwC;AACpF,UAAM,YAAY,OAAO,aAAa,SAAS;AAC/C,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,sBAAsB,GAAG;AACpC,8BAA0B,OAAO,WAAW,4HAA4C;AACxF,UAAM,WAAW,OAAO,WAAW;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,YAAY;AACd,UAAM,MAAM,MAAM,WAAW,MAAM,MAAM;AACzC,QAAI,wCAAwC,KAAK,GAAG,GAAG;AACrD,gCAA0B,OAAO,WAAW,iIAAiD;AAC7F,yBAAmB,OAAO,aAAa,GAAG,GAAG,GAAG,UAAU,YAAY,CAAC,yDAAY;AACnF,aAAO;AAAA,IACT;AACA,QAAI,uCAAuC,KAAK,GAAG,GAAG;AACpD,gCAA0B,OAAO,WAAW,kIAAkD;AAC9F,qCAA+B,OAAO,GAAG,UAAU,YAAY,CAAC,6BAAS,KAAK,MAAM,iBAAiB,KAAK,aAAa,CAAC;AACxH,aAAO;AAAA,IACT;AACA,QAAI,4BAA4B,KAAK,GAAG,GAAG;AACzC,gCAA0B,OAAO,WAAW,0HAA0C;AACtF,4BAAsB,OAAO,GAAG,UAAU,YAAY,CAAC,iBAAO,GAAG;AACjE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,QAAQ,KAAK,CAAC,UAAU,YAAY,KAAK,MAAM,IAAI,KAAK,UAAU,KAAK,MAAM,IAAI,CAAC,GAAG;AACvF;AAAA,MACE;AAAA,MACA;AAAA,MACA,QAAQ,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,MACjC;AAAA,MACA,MAAM,qBAAqB,OAAO;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB;AAAA,MACE;AAAA,MACA;AAAA,MACA,QAAQ,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,MACjC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,0BAA0B,OAAoB,WAAmB,SAAuB;AAC/F,QAAM,UAAU,cAAc,gCAAO;AACrC,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,YAAY;AACjB,OAAK,cAAc,IAAI,SAAS,IAAI,OAAO;AAC3C,UAAQ,OAAO,IAAI;AACnB,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,6BACP,OACA,WACA,SACA,SACA,UACM;AACN,QAAM,UAAU,cAAc,uCAAc;AAC5C,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,YAAY;AACjB,OAAK,cAAc,IAAI,SAAS,IAAI,OAAO;AAE3C,MAAI,YAAY,OAAO,KAAK,QAAQ,EAAE,SAAS,GAAG;AAChD,YAAQ,OAAO,2BAA2B,QAAQ,CAAC;AAAA,EACrD;AAEA,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,OAAK,YAAY;AACjB,aAAW,QAAQ,QAAQ,MAAM,GAAG,GAAG,GAAG;AACxC,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc;AACnB,SAAK,OAAO,IAAI;AAAA,EAClB;AACA,MAAI,QAAQ,SAAS,KAAK;AACxB,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc,gBAAM,QAAQ,SAAS,GAAG;AAC7C,SAAK,OAAO,IAAI;AAAA,EAClB;AAEA,UAAQ,OAAO,MAAM,IAAI;AACzB,QAAM,OAAO,OAAO;AACtB;AAEA,eAAe,qBAAqB,SAAsD;AACxF,QAAM,kBAAkB,QAAQ,OAAO,CAAC,UAAU,yBAAyB,KAAK,MAAM,IAAI,KAAK,sBAAsB,KAAK,MAAM,IAAI,CAAC;AACrI,QAAM,WAA0B,CAAC;AACjC,aAAW,SAAS,gBAAgB,MAAM,GAAG,CAAC,GAAG;AAC/C,UAAM,OAAO,MAAM,MAAM,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE;AACrD,QAAI,CAAC,QAAQ,CAAC,eAAe,KAAK,IAAI,GAAG;AACvC;AAAA,IACF;AACA,UAAM,QAAQ,eAAe,IAAI;AACjC,uBAAmB,UAAU,KAAK;AAAA,EACpC;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,UAAsC;AACxE,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,kBAAgB,MAAM,gBAAM,SAAS,KAAK;AAC1C,kBAAgB,MAAM,gBAAM,SAAS,MAAM;AAC3C,kBAAgB,MAAM,gBAAM,SAAS,OAAO;AAC5C,kBAAgB,MAAM,gBAAM,SAAS,OAAO;AAC5C,kBAAgB,MAAM,sBAAO,SAAS,UAAU,KAAK,IAAI,CAAC;AAC1D,kBAAgB,MAAM,4BAAQ,SAAS,OAAO;AAC9C,kBAAgB,MAAM,4BAAQ,SAAS,QAAQ;AAC/C,UAAQ,OAAO,OAAO,IAAI;AAC1B,SAAO;AACT;AAEA,SAAS,gBAAgB,QAAqB,OAAe,OAAsB;AACjF,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AACA,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,MAAI,OAAO,KAAK,OAAO;AACvB,SAAO,OAAO,GAAG;AACnB;AAEA,SAAS,mBAAmB,UAAyB,OAAsC;AACzF,WAAS,UAAU,UAAU,OAAO,CAAC,SAAS,SAAS,iBAAiB,mBAAmB,cAAc,CAAC;AAC1G,WAAS,WAAW,UAAU,OAAO,CAAC,UAAU,UAAU,WAAW,kBAAkB,SAAS,CAAC;AACjG,WAAS,YAAY,UAAU,OAAO,CAAC,WAAW,WAAW,cAAc,CAAC;AAC5E,WAAS,YAAY,UAAU,OAAO,CAAC,WAAW,WAAW,eAAe,SAAS,CAAC;AACtF,WAAS,YAAY,UAAU,OAAO,CAAC,gBAAgB,WAAW,uBAAuB,CAAC;AAC1F,WAAS,aAAa,UAAU,OAAO,CAAC,oBAAoB,YAAY,4BAA4B,CAAC;AACrG,WAAS,aAAa,WAAW,OAAO,CAAC,YAAY,YAAY,iBAAiB,CAAC;AACrF;AAEA,SAAS,eAAe,KAAsC;AAC5D,MAAI,OAAO,cAAc,aAAa;AACpC,WAAO,CAAC;AAAA,EACV;AACA,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,WAAO,CAAC;AAAA,EACV;AACA,QAAM,OAAO,MAAM,KAAK,IAAI,gBAAgB,QAAQ,EAAE,KAAK,CAAC,UAAU,MAAM,YAAY,MAAM;AAC9F,QAAM,QAAQ,OAAO,gBAAgB,IAAI,IAAI;AAC7C,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAAK,QAAoC,CAAC;AAC7G;AAEA,SAAS,gBAAgB,SAA2B;AAClD,UAAQ,QAAQ,SAAS;AAAA,IACvB,KAAK,QAAQ;AACX,YAAM,SAAkC,CAAC;AACzC,YAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ;AAC5C,eAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS;AACpD,cAAM,MAAM,SAAS,KAAK;AAC1B,YAAI,IAAI,YAAY,OAAO;AACzB;AAAA,QACF;AACA,cAAM,QAAQ,SAAS,QAAQ,CAAC;AAChC,YAAI,OAAO;AACT,iBAAO,IAAI,eAAe,EAAE,IAAI,gBAAgB,KAAK;AACrD;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AACH,aAAO,MAAM,KAAK,QAAQ,QAAQ,EAAE,IAAI,eAAe;AAAA,IACzD,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,QAAQ,eAAe,CAAC;AAAA,IACxC,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACE,aAAO,QAAQ,aAAa,KAAK,KAAK;AAAA,EAC1C;AACF;AAEA,SAAS,UAAU,OAAgC,MAAoC;AACrF,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,MAAM,GAAG;AACvB,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG;AAC7C,aAAO,MAAM,KAAK;AAAA,IACpB;AACA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,OAAO,MAAM,OAAO,CAAC,SAAyB,OAAO,SAAS,YAAY,QAAQ,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAC/G,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAgC,MAAsC;AACxF,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,MAAM,GAAG;AACvB,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,QAAQ,MAAM,OAAO,CAAC,SAAyB,OAAO,SAAS,YAAY,QAAQ,KAAK,KAAK,CAAC,CAAC;AACrG,UAAI,MAAM,SAAS,GAAG;AACpB,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG;AAC7C,aAAO,MAAM,MAAM,MAAM,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AAAA,IACtE;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,+BACP,OACA,OACA,KACA,QACM;AACN,QAAM,QAAQ,IAAI,MAAM,cAAc,EAAE,MAAM,CAAC;AAC/C,QAAM,cAAc,MAAM,SAAS,IAAI,QAAQ,CAAC,GAAG;AACnD,aAAW,CAAC,OAAO,OAAO,KAAK,YAAY,QAAQ,GAAG;AACpD,UAAM,UAAU,cAAc,GAAG,KAAK,IAAI,QAAQ,CAAC,EAAE;AACrD,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY;AACjB,UAAM,QAAQ,0BAA0B,OAAO;AAC/C,QAAI,MAAM,SAAS,GAAG;AACpB,iBAAW,QAAQ,OAAO;AACxB,cAAM,YAAY,SAAS,cAAc,GAAG;AAC5C,kBAAU,cAAc;AACxB,aAAK,OAAO,SAAS;AAAA,MACvB;AAAA,IACF,OAAO;AACL,YAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,YAAM,cAAc;AACpB,WAAK,OAAO,KAAK;AAAA,IACnB;AACA,eAAW,SAAS,OAAO,MAAM,UAAU,IAAI,IAAI,OAAO,QAAQ,UAAU,IAAI,OAAO,SAAS,OAAO,MAAM,GAAG;AAC9G,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,YAAY;AACnB,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,MAAM,MAAM;AAChB,UAAI,MAAM,MAAM;AAChB,YAAM,UAAU,SAAS,cAAc,YAAY;AACnD,cAAQ,cAAc,MAAM;AAC5B,aAAO,OAAO,KAAK,OAAO;AAC1B,WAAK,OAAO,MAAM;AAAA,IACpB;AACA,YAAQ,OAAO,IAAI;AACnB,UAAM,OAAO,OAAO;AAAA,EACtB;AACF;AAEA,eAAe,wBAAwB,KAA0C;AAC/E,QAAM,eAAe,OAAO,OAAO,IAAI,KAAK,EACzC,OAAO,CAAC,UAAU,CAAC,MAAM,OAAO,gCAAgC,KAAK,MAAM,IAAI,CAAC,EAChF,KAAK,CAAC,GAAG,MAAM,oBAAoB,EAAE,IAAI,IAAI,oBAAoB,EAAE,IAAI,CAAC;AAE3E,QAAM,SAAqC,CAAC;AAC5C,MAAI,aAAa;AACjB,MAAI,aAAa;AACjB,MAAI,kBAAkB;AACtB,MAAI,iBAAiB;AACrB,QAAM,UAAU,oBAAI,IAAY;AAEhC,aAAW,SAAS,cAAc;AAChC,UAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AACpC,UAAM,QAAQ,mBAAmB,GAAG;AACpC,UAAM,OAAO,MAAM,sBAAsB,KAAK,MAAM,IAAI;AACxD,UAAM,SAAS,MAAM,uBAAuB,KAAK,MAAM,MAAM,IAAI;AACjE,QAAI,QAAQ;AACV,cAAQ,IAAI,MAAM;AAAA,IACpB;AAEA,UAAM,kBAAkB,qBAAqB,KAAK,IAAI;AACtD,UAAM,YAAY,8BAA8B,MAAM,MAAM,KAAK,KAAK,CAAC,QAAQ,iBAAiB,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM;AACvH,UAAM,WAAW,YAAY,MAAM,IAAI,KAAK,SAAS,GAAG,MAAM,MAAM,IAAI;AACxE,UAAM,kBAAkB,WAAW,mBAAmB,QAAQ,EAAE,SAAS;AACzE,UAAM,gBAAgB,mBAAmB,KAAK,GAAG;AACjD,UAAM,sBAAsBE,cAAa,KAAK,iEAAiE;AAE/G,kBAAc;AACd,kBAAc;AACd,uBAAmB,gBAAgB,IAAI;AACvC,sBAAkB;AAClB,WAAO,KAAK;AAAA,MACV,OAAO,MAAM,CAAC,KAAK,SAAS,OAAO,SAAS,CAAC;AAAA,MAC7C;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ;AAAA,MACA,gBAAgB;AAAA,MAChB,aAAa,MAAM,MAAM,GAAG,CAAC;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,YAAY,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,MAAM,KAAK,OAAO;AAAA,IAC3B;AAAA,EACF;AACF;AAEA,SAAS,gCAAgC,OAAe,KAAa,aAA0C;AAC7G,QAAM,QAAQ,IAAI,MAAM,cAAc,EAAE,MAAM,CAAC;AAC/C,QAAM,cAAc,MAAM,SAAS,IAAI,QAAQ,CAAC,GAAG;AACnD,QAAM,SAAS,YAAY,IAAI,CAAC,SAAS,UAAU;AACjD,UAAM,QAAQ,0BAA0B,OAAO;AAC/C,UAAM,SACJ,kBAAkB,SAAS,+BAA+B,KAC1D,kBAAkB,SAAS,4BAA4B,KACvD;AACF,UAAM,aAAaA,cAAa,SAAS,iBAAiB;AAC1D,UAAM,gBAAgB,2EAA2E,KAAK,OAAO;AAC7G,UAAM,iBAAiBA,cAAa,SAAS,gEAAgE;AAC7G,WAAO;AAAA,MACL,OAAO,MAAM,CAAC,KAAK,SAAS,QAAQ,CAAC;AAAA,MACrC;AAAA,MACA,WAAW,MAAM;AAAA,MACjB;AAAA,MACA,YAAYA,cAAa,SAAS,yBAAyB;AAAA,MAC3D;AAAA,MACA;AAAA,MACA,aAAa,MAAM,MAAM,GAAG,CAAC;AAAA,IAC/B;AAAA,EACF,CAAC;AAED,QAAM,UAAU,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,MAAM,MAAM,EAAE,OAAO,OAAO,CAAa;AACvF,SAAO;AAAA,IACL;AAAA,IACA,YAAY,OAAO;AAAA,IACnB,YAAY,KAAK,IAAI,aAAa,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,YAAY,CAAC,CAAC;AAAA,IAC1F,YAAY,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,YAAY,CAAC;AAAA,IACnE,iBAAiB,OAAO,OAAO,CAAC,UAAU,MAAM,aAAa,EAAE;AAAA,IAC/D,gBAAgB,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,gBAAgB,CAAC;AAAA,IAC3E,SAAS,MAAM,KAAK,OAAO;AAAA,IAC3B;AAAA,EACF;AACF;AAEA,eAAe,0BAA0B,OAAoB,SAA6C;AACxG,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,SAAS;AACjB,UAAQ,aAAa,eAAe,MAAM;AAC1C,UAAQ,QAAQ,aAAa,OAAO,QAAQ,UAAU;AACtD,UAAQ,QAAQ,aAAa,OAAO,QAAQ,UAAU;AACtD,UAAQ,QAAQ,aAAa,OAAO,QAAQ,UAAU;AACtD,UAAQ,QAAQ,kBAAkB,OAAO,QAAQ,eAAe;AAChE,UAAQ,QAAQ,iBAAiB,OAAO,QAAQ,cAAc;AAC9D,QAAM,QAAQ;AAAA,IACZ,GAAG,QAAQ,UAAU;AAAA,IACrB,GAAG,QAAQ,QAAQ,UAAU,CAAC;AAAA,IAC9B,GAAG,QAAQ,UAAU;AAAA,IACrB,GAAG,QAAQ,UAAU;AAAA,IACrB,GAAG,QAAQ,eAAe;AAAA,IAC1B,GAAG,QAAQ,cAAc;AAAA,EAC3B;AACA,UAAQ,OAAO,yBAAyB,QAAQ,OAAO,MAAM,KAAK,QAAK,CAAC,CAAC;AAEzE,MAAI,QAAQ,QAAQ,SAAS,GAAG;AAC9B,YAAQ,OAAO,yBAAyB,gBAAM,QAAQ,QAAQ,KAAK,QAAG,CAAC,CAAC;AAAA,EAC1E;AACA,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,yBAAyB,OAAe,OAA4B;AAC3E,QAAM,SAAS,SAAS,cAAc,GAAG;AACzC,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,cAAc;AACrB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc;AACnB,SAAO,OAAO,QAAQ,IAAI;AAC1B,SAAO;AACT;AAQA,eAAe,sBAAsB,KAAY,UAA+C;AAC9F,QAAM,WAAW,wBAAwB,QAAQ;AACjD,QAAM,MAAM,MAAM,IAAI,KAAK,QAAQ,GAAG,MAAM,MAAM;AAClD,MAAI,CAAC,KAAK;AACR,WAAO,CAAC;AAAA,EACV;AACA,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,WAAO,CAAC;AAAA,EACV;AACA,SAAO,MAAM,KAAK,IAAI,uBAAuB,aAAa,cAAc,CAAC,EAAE,IAAI,CAAC,aAAa;AAAA,IAC3F,IAAI,QAAQ,aAAa,IAAI,KAAK;AAAA,IAClC,MAAM,QAAQ,aAAa,MAAM,KAAK;AAAA,IACtC,QAAQ,QAAQ,aAAa,QAAQ,KAAK;AAAA,EAC5C,EAAE;AACJ;AAEA,eAAe,uBAAuB,KAAY,WAAmB,MAAuD;AAC1H,QAAM,YAAY,KAAK,KAAK,CAAC,QAAQ,kBAAkB,KAAK,IAAI,IAAI,CAAC;AACrE,QAAM,aAAa,8BAA8B,WAAW,WAAW,MAAM;AAC7E,QAAM,MAAM,aAAa,MAAM,IAAI,KAAK,UAAU,GAAG,MAAM,MAAM,IAAI;AACrE,MAAI,CAAC,KAAK;AACR,WAAO,YAAY,MAAM,GAAG,EAAE,IAAI,GAAG,QAAQ,WAAW,EAAE;AAAA,EAC5D;AACA,SAAO,kBAAkB,KAAK,+BAA+B,KAAK,YAAY,MAAM,GAAG,EAAE,IAAI,GAAG,QAAQ,WAAW,EAAE;AACvH;AAEA,SAAS,qBAAqB,KAAa,MAAkC;AAC3E,QAAM,cAAc,IAAI,IAAI,KAAK,OAAO,CAAC,QAAQ,YAAY,KAAK,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;AACjG,QAAM,cAAc,CAAC,GAAG,IAAI,SAAS,8CAA8C,CAAC,EAAE,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AAC7G,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO,YAAY,OAAO,CAAC,OAAO,YAAY,SAAS,KAAK,YAAY,IAAI,EAAE,CAAC,EAAE;AAAA,EACnF;AACA,SAAO,YAAY;AACrB;AAEA,SAAS,wBAAwB,UAA0B;AACzD,QAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,QAAM,WAAW,MAAM,IAAI,KAAK;AAChC,SAAO,GAAG,MAAM,KAAK,GAAG,CAAC,UAAU,QAAQ;AAC7C;AAEA,SAAS,8BAA8B,YAAoB,QAAqC;AAC9F,MAAI,CAAC,UAAU,YAAY,KAAK,MAAM,GAAG;AACvC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,GAAG,GAAG;AAC1B,WAAO,OAAO,MAAM,CAAC;AAAA,EACvB;AACA,QAAM,OAAO,WAAW,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE;AAC9C,aAAW,WAAW,OAAO,MAAM,GAAG,GAAG;AACvC,QAAI,CAAC,WAAW,YAAY,KAAK;AAC/B;AAAA,IACF;AACA,QAAI,YAAY,MAAM;AACpB,WAAK,IAAI;AAAA,IACX,OAAO;AACL,WAAK,KAAK,OAAO;AAAA,IACnB;AAAA,EACF;AACA,SAAO,KAAK,KAAK,GAAG;AACtB;AAEA,SAAS,oBAAoB,MAAsB;AACjD,SAAO,OAAO,KAAK,MAAM,mBAAmB,IAAI,CAAC,KAAK,GAAG;AAC3D;AAEA,SAASA,cAAa,OAAe,SAAyB;AAC5D,SAAO,CAAC,GAAG,MAAM,SAAS,OAAO,CAAC,EAAE;AACtC;AAEA,SAAS,kBAAkB,OAAe,SAAgC;AACxE,QAAM,QAAQ,MAAM,MAAM,OAAO;AACjC,SAAO,QAAQC,WAAU,MAAM,CAAC,KAAK,EAAE,IAAI;AAC7C;AAEA,SAAS,aAAa,KAAa,UAA0B;AAC3D,SAAO,kBAAkB,KAAK,4DAA4D,KAAK;AACjG;AAEA,SAAS,qBAAqB,WAA4B;AACxD,SAAO,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,SAAS;AACtE;AAEA,SAAS,wBAAwB,WAA2B;AAC1D,MAAI,cAAc,SAAS,cAAc,OAAO;AAC9C,WAAO;AAAA,EACT;AACA,MAAI,cAAc,SAAS,cAAc,OAAO;AAC9C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,OAAoB,WAAmB,aAA0B,YAA2B;AAC5H,QAAM,YAAY,wBAAwB,WAAW;AACrD,QAAM,gBAAgB;AACtB,QAAM,UAAU,cAAc,iCAAa;AAC3C,UAAQ,UAAU,IAAI,uBAAuB;AAC7C,QAAM,SAAS,SAAS,cAAc,GAAG;AACzC,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,cAAc,IAAI,SAAS;AAClC,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,OAAK,YAAY;AACjB,yBAAuB,MAAM,4BAAQ,wBAAwB,SAAS,CAAC;AACvE,yBAAuB,MAAM,4BAAQ,gBAAgB,WAAW,IAAI,sDAA6B,yHAA0B;AAC3H,yBAAuB,MAAM,4BAAQ,GAAG,UAAU,MAAM,SAAI;AAC5D,MAAI,YAAY;AACd,2BAAuB,MAAM,4BAAQ,UAAU;AAAA,EACjD;AAEA,UAAQ,OAAO,QAAQ,IAAI;AAE3B,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,UAAU,SAAS,cAAc,SAAS;AAChD,YAAQ,YAAY;AACpB,UAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,YAAQ,cAAc;AACtB,YAAQ,OAAO,OAAO;AACtB,eAAW,YAAY,UAAU,MAAM,GAAG,EAAE,GAAG;AAC7C,YAAM,YAAY,SAAS,cAAc,GAAG;AAC5C,gBAAU,cAAc;AACxB,cAAQ,OAAO,SAAS;AAAA,IAC1B;AACA,YAAQ,OAAO,OAAO;AAAA,EACxB,OAAO;AACL,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc;AACpB,YAAQ,OAAO,KAAK;AAAA,EACtB;AAEA,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,uBAAuB,MAAwB,OAAe,OAAqB;AAC1F,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,OAAK,cAAc;AACnB,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,SAAO,cAAc;AACrB,OAAK,OAAO,MAAM,MAAM;AAC1B;AAEA,SAAS,wBAAwB,OAAoB,WAAyB;AAC5E,QAAM,eAAe,oBAAI,IAAI,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,CAAC;AAC9E,QAAM,UAAU,aAAa,IAAI,SAAS,IACtC,uRACA;AACJ,QAAM,gBAAgB;AACtB,QAAM,UAAU,cAAc,iCAAa;AAC3C,QAAM,SAAS,SAAS,cAAc,GAAG;AACzC,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,cAAc,IAAI,SAAS;AAClC,SAAO,OAAO,QAAQ,SAAS,eAAe,gDAAkB,OAAO,EAAE,CAAC;AAE1E,QAAM,UAAU,SAAS,cAAc,GAAG;AAC1C,UAAQ,cAAc;AAEtB,UAAQ,OAAO,QAAQ,OAAO;AAC9B,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,qBAAqB,OAAwB;AACpD,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,EAAE;AAC3E,SAAO,UAAU,uCAAS,OAAO,KAAK;AACxC;AAEA,SAAS,wBAAwB,aAAoC;AACnE,QAAM,QAAQ,IAAI,WAAW,WAAW;AACxC,QAAM,YAAY;AAAA,IAChB,GAAG,qBAAqB,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,QAAQ,QAAiB,EAAE;AAAA,IACjF,GAAG,iBAAiB,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,QAAQ,QAAiB,EAAE;AAAA,EAC/E,EACG,IAAI,CAAC,EAAE,MAAM,OAAO,OAAO,EAAE,MAAM,oBAAoB,IAAI,GAAG,OAAO,EAAE,EACvE,OAAO,CAAC,EAAE,MAAM,OAAO,MAAM,6BAA6B,MAAM,MAAM,CAAC;AAC1E,QAAM,SAAmB,CAAC;AAC1B,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,EAAE,MAAM,SAAS,KAAK,WAAW;AAC1C,UAAM,MAAM,SAAS,YAAY;AACjC,QAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AAClB,WAAK,IAAI,GAAG;AACZ,aAAO,KAAK,QAAQ;AAAA,IACtB;AAAA,EACF;AACA,SAAO,OAAO,MAAM,GAAG,GAAG;AAC5B;AAEA,SAAS,6BAA6B,UAAkB,QAAyC;AAC/F,MAAI,SAAS,SAAS,KAAK;AACzB,WAAO;AAAA,EACT;AACA,MAAI,4BAA4B,QAAQ,GAAG;AACzC,WAAO;AAAA,EACT;AACA,MAAI,CAAC,gBAAgB,KAAK,QAAQ,GAAG;AACnC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC,QAAM,UAAU,MAAM,OAAO,CAAC,SAAS,SAAS,KAAK,IAAI,CAAC,EAAE;AAC5D,QAAM,SAAS,MAAM,OAAO,CAAC,SAAS,SAAS,KAAK,IAAI,CAAC,EAAE;AAC3D,QAAM,SAAS,MAAM,OAAO,CAAC,SAAS,MAAM,KAAK,IAAI,CAAC,EAAE;AACxD,QAAM,eAAe,MAAM,OAAO,CAAC,SAAS,WAAW,KAAK,IAAI,CAAC,EAAE;AACnE,QAAM,aAAa,MAAM,OAAO,CAAC,SAAS,mBAAmB,KAAK,IAAI,CAAC,EAAE;AACzE,QAAM,cAAc,MAAM,OAAO,CAAC,SAAS,mBAAmB,KAAK,IAAI,CAAC,EAAE;AAC1E,QAAM,eAAe,UAAU;AAC/B,QAAM,gBAAgB,eAAe,MAAM;AAC3C,QAAM,mBAAmB,cAAc,MAAM;AAE7C,MAAI,SAAS,SAAS,KAAK,gBAAgB,QAAQ,mBAAmB,MAAM;AAC1E,WAAO;AAAA,EACT;AACA,MAAI,wBAAwB,KAAK,QAAQ,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,MAAI,cAAc,GAAG;AACnB,UAAM,gBAAgB,MAAM,OAAO,CAAC,SAAS,mBAAmB,IAAI,CAAC,EAAE;AACvE,QAAI,gBAAgB,aAAa,MAAM;AACrC,aAAO;AAAA,IACT;AACA,QAAI,mBAAmB,QAAQ,GAAG;AAChC,aAAO;AAAA,IACT;AACA,QAAI,cAAc,KAAK,SAAS,SAAS,IAAI;AAC3C,aAAO;AAAA,IACT;AACA,WAAO,cAAc,KAAM,cAAc,KAAK,SAAS;AAAA,EACzD;AACA,MAAI,gBAAgB,GAAG;AACrB,QAAI,cAAc,KAAK,WAAW,GAAG;AACnC,aAAO;AAAA,IACT;AACA,QAAI,WAAW,WAAW,eAAe,KAAK,QAAQ,GAAG;AACvD,aAAO;AAAA,IACT;AACA,QAAI,SAAS,GAAG;AACd,aAAO,WAAW;AAAA,IACpB;AACA,WAAO,SAAS,UAAU;AAAA,EAC5B;AACA,MAAI,SAAS,KAAK,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,4BAA4B,UAA2B;AAC9D,MAAI,cAAc,KAAK,QAAQ,GAAG;AAChC,WAAO;AAAA,EACT;AACA,MAAI,kJAAkJ,KAAK,QAAQ,GAAG;AACpK,WAAO;AAAA,EACT;AACA,MAAI,6CAA6C,KAAK,QAAQ,GAAG;AAC/D,WAAO;AAAA,EACT;AACA,MAAI,yDAAyD,KAAK,QAAQ,GAAG;AAC3E,WAAO;AAAA,EACT;AACA,MAAI,mGAAmG,KAAK,QAAQ,GAAG;AACrH,WAAO;AAAA,EACT;AACA,MAAI,2CAA2C,KAAK,QAAQ,GAAG;AAC7D,WAAO;AAAA,EACT;AACA,MAAI,0EAA0E,KAAK,QAAQ,GAAG;AAC5F,WAAO;AAAA,EACT;AACA,MAAI,eAAe,KAAK,QAAQ,KAAK,gFAAgF,KAAK,QAAQ,GAAG;AACnI,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,UAA2B;AACrD,SAAO,0EAA0E,KAAK,QAAQ;AAChG;AAEA,SAAS,mBAAmB,MAAuB;AACjD,QAAM,OAAO,KAAK,YAAY,CAAC,KAAK;AACpC,MAAI,OAAO,SAAU,OAAO,OAAQ;AAClC,WAAO;AAAA,EACT;AACA,QAAM,MAAM,OAAO;AACnB,QAAM,OAAO,QAAQ;AACrB,SAAO,qBAAqB,GAAG,KAAK,qBAAqB,IAAI;AAC/D;AAEA,SAAS,qBAAqB,OAAwB;AACpD,SAAO,SAAS,MAAQ,SAAS;AACnC;AAEA,SAAS,qBAAqB,OAA6B;AACzD,QAAM,YAAsB,CAAC;AAC7B,MAAI,UAAU;AACd,aAAW,QAAQ,OAAO;AACxB,QAAK,QAAQ,MAAM,QAAQ,OAAQ,SAAS,GAAG;AAC7C,iBAAW,OAAO,aAAa,IAAI;AAAA,IACrC,OAAO;AACL,UAAI,QAAQ,UAAU,GAAG;AACvB,kBAAU,KAAK,OAAO;AAAA,MACxB;AACA,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,MAAI,QAAQ,UAAU,GAAG;AACvB,cAAU,KAAK,OAAO;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAA6B;AACrD,QAAM,YAAsB,CAAC;AAC7B,MAAI,UAAU;AACd,WAAS,QAAQ,GAAG,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG;AACxD,QAAI,8BAA8B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,CAAC,GAAG;AACjE,UAAI,QAAQ,UAAU,GAAG;AACvB,kBAAU,KAAK,OAAO;AAAA,MACxB;AACA,gBAAU;AACV;AAAA,IACF;AACA,UAAM,OAAO,MAAM,KAAK,IAAK,MAAM,QAAQ,CAAC,KAAK;AACjD,QAAK,QAAQ,MAAM,QAAQ,SAAW,SAAS,GAAG;AAChD,iBAAW,OAAO,aAAa,IAAI;AAAA,IACrC,OAAO;AACL,UAAI,QAAQ,UAAU,GAAG;AACvB,kBAAU,KAAK,OAAO;AAAA,MACxB;AACA,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,MAAI,QAAQ,UAAU,GAAG;AACvB,cAAU,KAAK,OAAO;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,8BAA8B,SAAiB,UAA2B;AACjF,SAAO,YAAY,MAAO,YAAY,MAAM,YAAY,MAAQ,YAAY,MAAM,YAAY,MAAQ,YAAY,MAAM,YAAY;AACtI;AAEA,SAAS,oBAAoB,OAAuB;AAClD,SAAO,MAAM,QAAQ,qBAAqB,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC3E;AAEA,SAAS,gBAAgB,aAAmC;AAC1D,QAAM,YAAY,MAAM,KAAK,IAAI,WAAW,YAAY,MAAM,GAAG,CAAC,CAAC,CAAC;AACpE,SAAO,UAAU,KAAK,GAAG,MAAM;AACjC;AAEA,eAAe,iBACb,KACA,SAC+C;AAC/C,QAAM,SAA+C,CAAC;AACtD,aAAW,SAAS,OAAO,OAAO,IAAI,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,OAAO,QAAQ,KAAK,KAAK,IAAI,CAAC,GAAG;AACnG,UAAM,WAAW,iBAAiB,MAAM,IAAI;AAC5C,QAAI,CAAC,SAAS,WAAW,QAAQ,GAAG;AAClC;AAAA,IACF;AACA,WAAO,KAAK;AAAA,MACV,MAAM,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,MAAM;AAAA,MAC3C,KAAK,QAAQ,QAAQ,WAAW,MAAM,MAAM,MAAM,QAAQ,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,KAAuB;AACjD,SAAO,CAAC,GAAG,IAAI,SAAS,qDAAqD,CAAC,EAC3E,IAAI,CAAC,UAAUA,WAAU,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,EAC3D,OAAO,OAAO;AACnB;AAEA,SAAS,sBAAsB,KAAuB;AACpD,SAAO,CAAC,GAAG,IAAI,SAAS,wBAAwB,CAAC,EAC9C,IAAI,CAAC,UAAU,mBAAmB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EACpD,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACnB;AAEA,SAAS,0BAA0B,KAAuB;AACxD,SAAO,CAAC,GAAG,IAAI,SAAS,0DAA0D,CAAC,EAChF,IAAI,CAAC,UAAU,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC,EAC3C,IAAI,CAAC,SAASA,WAAU,IAAI,EAAE,KAAK,CAAC,EACpC,OAAO,OAAO;AACnB;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MACJ,QAAQ,2BAA2B,IAAI,EACvC,QAAQ,oBAAoB,GAAI,EAChC,QAAQ,YAAY,EAAE;AAC3B;AAEA,SAAS,UAAU,KAAqB;AACtC,SAAO,IACJ,QAAQ,sBAAsB,EAAE,EAChC,QAAQ,cAAc,IAAI,EAC1B,QAAQ,UAAU,GAAI,EACtB,QAAQ,qBAAqB,EAAE,EAC/B,QAAQ,SAAS,EAAE,EACnB,QAAQ,WAAW,MAAM,EACzB,KAAK;AACV;AAEA,eAAe,mBAAmB,aAA2C;AAC3E,SAAO,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC,EAAE,OAAO,WAAW;AACtE;AAGA,SAAS,iBAAiB,MAAsB;AAC9C,QAAM,YAAY,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AACrD,QAAM,MAA8B;AAAA,IAClC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AACA,SAAO,YAAY,IAAI,SAAS,KAAK,6BAA6B;AACpE;AAEA,SAASA,WAAU,OAAuB;AACxC,SAAO,MACJ,WAAW,QAAQ,GAAG,EACtB,WAAW,QAAQ,GAAG,EACtB,WAAW,SAAS,GAAG,EACvB,WAAW,UAAU,GAAG,EACxB,WAAW,UAAU,GAAG;AAC7B;AAEA,SAAS,aAAa,MAAsB;AAC1C,SAAO,kBAAAC,QAAU,SAAS,MAAM;AAAA,IAC9B,cAAc,EAAE,MAAM,KAAK;AAAA,IAC3B,UAAU,CAAC,QAAQ;AAAA,EACrB,CAAC;AACH;;;ACzhEA,IAAAC,gBAAkB;AAKX,SAAS,YAA2B;AACzC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,KAAK,cAAc,SAAS,KAAK,aAAa;AAAA,IACvD;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,SAAS;AACnC,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AACvC,UAAI,SAAS,OAAO,KAAK;AACzB,UAAI;AACJ,UAAI;AACF,cAAM,MAAM,cAAAC,QAAM,UAAU,MAAM,gBAAgB,IAAI,IAAI,CAAC;AAAA,MAC7D,SAAS,OAAO;AACd,cAAM,OAAO,kBAAkB,IAAI,KAAK,MAAM,KAAK,kBAAkB,KAAK,CAAC,CAAC;AAC5E,eAAO;AAAA,UACL,UAAU;AACR,kBAAM,OAAO;AACb,4BAAgB,KAAK,UAAU;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,OAAO,OAAO,IAAI,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG;AACrE,YAAM,gBAA0B,CAAC;AAEjC,UAAI;AACF,mBAAW,SAAS,QAAQ,OAAO,CAAC,SAAS,KAAK,KAAK,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,GAAG;AACrF,gBAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AACpC,gBAAM,UAAU,CAAC,GAAG,IAAI,SAAS,gBAAgB,CAAC,EAC/C,IAAI,CAAC,UAAU,MAAM,CAAC,GAAG,KAAK,CAAC,EAC/B,OAAO,OAAO;AACjB,wBAAc,KAAK,GAAG,OAAO;AAAA,QAC/B;AAAA,MACF,SAAS,OAAO;AACd,cAAM,OAAO,kBAAkB,IAAI,KAAK,MAAM,KAAK,kBAAkB,KAAK,CAAC,CAAC;AAC5E,eAAO;AAAA,UACL,UAAU;AACR,kBAAM,OAAO;AACb,4BAAgB,KAAK,UAAU;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,cAAc,OAAO;AAC1C,YAAM,QAAQ,MAAM,aAAa,SAAS,MAAM;AAChD,YAAM,UAAU,cAAc,8BAAU;AACxC,YAAM,OAAO,SAAS,cAAc,GAAG;AACvC,WAAK,cAAc,MAAM,SAAS,IAC9B,0XACA;AACJ,cAAQ,OAAO,IAAI;AACnB,cAAQ,OAAO,iBAAiB,SAAS,OAAO,MAAM,CAAC;AAEvD,UAAI,MAAM,SAAS,GAAG;AACpB,cAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,kBAAU,YAAY;AACtB,mBAAW,QAAQ,OAAO;AACxB,oBAAU,OAAO,cAAc,IAAI,CAAC;AAAA,QACtC;AACA,gBAAQ,OAAO,SAAS;AAAA,MAC1B;AAEA,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AACpB,cAAQ,cAAc,cAAc,MAAM,GAAG,GAAG,EAAE,KAAK,IAAI,KAAK;AAChE,cAAQ,OAAO,OAAO;AAEtB,YAAM,OAAO,cAAc,4BAAQ,QAAQ,MAAM,EAAE;AACnD,YAAM,KAAK,SAAS,cAAc,IAAI;AACtC,iBAAW,SAAS,QAAQ,MAAM,GAAG,GAAG,GAAG;AACzC,cAAM,KAAK,SAAS,cAAc,IAAI;AACtC,WAAG,cAAc,MAAM;AACvB,WAAG,OAAO,EAAE;AAAA,MACd;AACA,WAAK,OAAO,EAAE;AACd,YAAM,OAAO,SAAS,IAAI;AAE1B,aAAO;AAAA,QACL,UAAU;AACR,gBAAM,OAAO;AACb,0BAAgB,KAAK,UAAU;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAqDA,SAAS,iBAAiB,SAA8B,OAAyB,QAA0C;AACzH,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,aAAa,QAAQ,OAAO,CAAC,UAAU,MAAM,KAAK,SAAS,MAAM,CAAC,EAAE;AAC1E,QAAM,YAAY,MAAM,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,MAAM,QAAQ,CAAC;AAC5E,QAAM,YAAY,MAAM,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,MAAM,QAAQ,CAAC;AAC5E,QAAM,YAAY,MAAM,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,MAAM,QAAQ,CAAC;AAC5E,QAAM,aAAa,MAAM,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,OAAO,QAAQ,CAAC;AAC9E,QAAM,aAAa,MAAM,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,MAAM,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,KAAK,QAAQ,CAAC,GAAG,CAAC;AAC3H,mBAAiB,SAAS,gBAAM,OAAO,QAAQ,MAAM,CAAC;AACtD,mBAAiB,SAAS,OAAO,OAAO,UAAU,CAAC;AACnD,mBAAiB,SAAS,gBAAM,OAAO,MAAM,MAAM,CAAC;AACpD,mBAAiB,SAAS,gBAAM,OAAO,SAAS,CAAC;AACjD,mBAAiB,SAAS,gBAAM,OAAO,SAAS,CAAC;AACjD,mBAAiB,SAAS,gBAAM,OAAO,SAAS,CAAC;AACjD,mBAAiB,SAAS,4BAAQ,OAAO,UAAU,CAAC;AACpD,mBAAiB,SAAS,4BAAQ,OAAO,wBAAwB,MAAM,CAAC,CAAC;AACzE,MAAI,aAAa,GAAG;AAClB,qBAAiB,SAAS,4BAAQ,OAAO,UAAU,CAAC;AAAA,EACtD;AACA,QAAM,QAAQ,mBAAmB,KAAK;AACtC,MAAI,OAAO;AACT,qBAAiB,SAAS,4BAAQ,KAAK;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAAqB,OAAe,OAAqB;AACjF,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,OAAK,OAAO,KAAK,OAAO;AACxB,SAAO,OAAO,IAAI;AACpB;AAEA,SAAS,wBAAwB,QAAqC;AACpE,SAAO,IAAI,IAAI,OAAO,OAAO,CAAC,EAAE;AAClC;AAEA,SAAS,mBAAmB,OAAiC;AAC3D,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,GAAG,KAAK,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,MAAM,KAAK,MAAM,CAAC;AAClE,WAAO,IAAI,MAAM,OAAO,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,EAC5C;AACA,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,MAAM,KAAK,MAAO,QAAQ,IAAI,GAAG,IAAI,KAAK,KAAK,MAAM,IAAK,EAChE,KAAK,IAAI;AACd;AAEA,eAAe,aACb,SACA,QAC2B;AAC3B,QAAM,QAA0B,CAAC;AACjC,QAAM,cAAc,QACjB,OAAO,CAAC,UAAU,0CAA0C,KAAK,MAAM,IAAI,KAAK,mCAAmC,KAAK,MAAM,IAAI,CAAC,EACnI,MAAM,GAAG,EAAE;AACd,aAAW,SAAS,aAAa;AAC/B,UAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AACpC,UAAM,OAAO,aAAa,MAAM,MAAM,KAAK,MAAM;AACjD,QAAI,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,OAAO,SAAS,GAAG;AACrG,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,MAAc,KAAa,QAA6C;AAC5F,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,WAAO,EAAE,MAAM,OAAO,KAAK,QAAQ,KAAK,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EACtF;AACA,QAAM,WAAW,iBAAiB,GAAG;AACrC,QAAM,cAAc,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,QAAQ,cAAc,YAAY;AACpH,QAAM,QAAQ,YAAY,QAAQ,CAAC,YAAY,mBAAmB,OAAO,CAAC;AAC1E,QAAM,QAAQ,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EACnD,OAAO,CAAC,YAAY,QAAQ,cAAc,YAAY,EACtD,QAAQ,CAAC,YAAY,mBAAmB,OAAO,CAAC;AACnD,QAAM,QAAQ,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EACnD,OAAO,CAAC,YAAY,QAAQ,cAAc,YAAY,EACtD,QAAQ,CAAC,YAAY,mBAAmB,OAAO,CAAC;AACnD,QAAM,eAAe,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAC1D,OAAO,CAAC,YAAY,QAAQ,cAAc,aAAa,EACvD,QAAQ,CAAC,YAAY,oBAAoB,SAAS,MAAM,CAAC;AAC5D,QAAM,SAAS;AAAA,IACb,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,EAAE;AAAA,IACzF,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,EAAE;AAAA,IACzF,GAAG,MAAM,IAAI,CAAC,UAAU;AAAA,MACtB,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE;AAAA,MAC5B,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE;AAAA,MAC5B,OAAO,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE;AAAA,MACjC,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE;AAAA,IACpC,EAAE;AAAA,IACF,GAAG,aAAa,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,EAAE;AAAA,EAClG;AACA,QAAM,QAAQ,KAAK,IAAI,SAAS,OAAO,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,KAAK,QAAQ,EAAE,CAAC;AACxF,QAAM,SAAS,KAAK,IAAI,SAAS,QAAQ,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,KAAK,SAAS,EAAE,CAAC;AAC3F,SAAO,EAAE,MAAM,OAAO,QAAQ,OAAO,OAAO,OAAO,QAAQ,aAAa;AAC1E;AAEA,SAAS,mBAAmB,SAAmC;AAC7D,QAAM,WAAW,cAAc,gBAAgB,SAAS,UAAU,CAAC;AACnE,QAAM,OAAOC,cAAa,gBAAgB,SAAS,MAAM,GAAG,KAAK,IAAI,GAAG,SAAS,UAAU,CAAC,CAAC;AAC7F,QAAM,QAAQ,cAAc,SAAS,SAAS;AAC9C,QAAM,SAASA,cAAa,gBAAgB,SAAS,QAAQ,GAAG,GAAG,KAAK,MAAM,QAAQ;AACtF,QAAM,gBAAgB,gBAAgB,SAAS,QAAQ,IAAI,MAAM;AACjE,QAAM,YAAY,MAAM,KAAK,QAAQ,qBAAqB,GAAG,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,cAAc,UAAU;AAChH,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO,CAAC;AAAA,EACV;AACA,SAAO,UAAU,IAAI,CAAC,SAAS;AAC7B,UAAM,IAAI,SAAS,IAAIA,cAAa,gBAAgB,MAAM,GAAG,GAAG,CAAC;AACjE,UAAM,IAAI,SAAS,IAAIA,cAAa,gBAAgB,MAAM,GAAG,GAAG,CAAC;AACjE,WAAO;AAAA,MACL,MAAM,KAAK,aAAa,KAAK,KAAK;AAAA,MAClC;AAAA,MACA;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC,EAAE,OAAO,CAAC,SAAS,KAAK,IAAI;AAC/B;AAEA,SAAS,mBAAmB,SAAmC;AAC7D,QAAM,WAAW,cAAc,gBAAgB,SAAS,UAAU,CAAC;AACnE,QAAM,WAAW,MAAM,KAAK,QAAQ,qBAAqB,GAAG,CAAC,EAAE;AAAA,IAC7D,CAAC,UAAU,MAAM,cAAc,qBAAqB,MAAM,cAAc;AAAA,EAC1E;AACA,QAAM,MAAM,SAAS,IAAI,CAAC,UAAU,MAAM,eAAe,EAAE,EAAE,KAAK,GAAG,EAAE,KAAK;AAC5E,MAAI,CAAC,KAAK;AACR,WAAO,CAAC;AAAA,EACV;AACA,SAAO;AAAA,IACL;AAAA,MACE,GAAG,qBAAqB,GAAG;AAAA,MAC3B,GAAG,SAAS;AAAA,MACZ,GAAG,SAAS;AAAA,MACZ,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,MACjB,QAAQ,cAAc,SAAS,WAAW,aAAa;AAAA,MACvD,MAAM,aAAa,OAAO;AAAA,MAC1B,aAAaA,cAAa,gBAAgB,SAAS,WAAW,GAAG,CAAC;AAAA,IACpE;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,SAAmC;AAC7D,QAAM,WAAW,cAAc,gBAAgB,SAAS,UAAU,CAAC;AACnE,QAAM,QAAQ,WAAW,gBAAgB,SAAS,YAAY,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AAC/E,QAAM,MAAM,WAAW,gBAAgB,SAAS,UAAU,GAAG;AAAA,IAC3D,GAAG,SAAS;AAAA,IACZ,GAAG,SAAS;AAAA,EACd,CAAC;AACD,SAAO;AAAA,IACL;AAAA,MACE,IAAI,SAAS,IAAI,MAAM;AAAA,MACvB,IAAI,SAAS,IAAI,MAAM;AAAA,MACvB,IAAI,SAAS,IAAI,IAAI;AAAA,MACrB,IAAI,SAAS,IAAI,IAAI;AAAA,MACrB,QAAQ,cAAc,SAAS,SAAS;AAAA,MACxC,aAAaA,cAAa,gBAAgB,SAAS,WAAW,GAAG,CAAC;AAAA,IACpE;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,SAAkB,QAA+C;AAC5F,QAAM,WAAW,cAAc,gBAAgB,SAAS,UAAU,CAAC;AACnE,QAAM,aAAa,gBAAgB,SAAS,YAAY,KAAK,gBAAgB,SAAS,YAAY,KAAK;AACvG,SAAO;AAAA,IACL;AAAA,MACE,GAAG,SAAS;AAAA,MACZ,GAAG,SAAS;AAAA,MACZ,OAAO,SAAS,SAAS;AAAA,MACzB,QAAQ,SAAS,UAAU;AAAA,MAC3B;AAAA,MACA,MAAM,OAAO,IAAI,UAAU;AAAA,IAC7B;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAAmC;AACxD,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,YAAY;AACnB,QAAM,MAAM,SAAS,gBAAgB,8BAA8B,KAAK;AACxE,MAAI,aAAa,WAAW,OAAO,KAAK,KAAK,IAAI,KAAK,MAAM,EAAE;AAC9D,MAAI,aAAa,QAAQ,KAAK;AAC9B,MAAI,aAAa,cAAc,KAAK,IAAI;AAExC,QAAM,QAAQ,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC/D,QAAM,aAAa,KAAK,GAAG;AAC3B,QAAM,aAAa,KAAK,GAAG;AAC3B,QAAM,aAAa,SAAS,OAAO,KAAK,KAAK,CAAC;AAC9C,QAAM,aAAa,UAAU,OAAO,KAAK,MAAM,CAAC;AAChD,QAAM,aAAa,QAAQ,OAAO;AAClC,MAAI,OAAO,KAAK;AAEhB,aAAW,QAAQ,KAAK,QAAQ;AAC9B,QAAI,KAAK,MAAM;AACb,YAAM,QAAQ,SAAS,gBAAgB,IAAI,cAAc,OAAO;AAChE,YAAM,aAAa,KAAK,OAAO,KAAK,CAAC,CAAC;AACtC,YAAM,aAAa,KAAK,OAAO,KAAK,CAAC,CAAC;AACtC,YAAM,aAAa,SAAS,OAAO,KAAK,KAAK,CAAC;AAC9C,YAAM,aAAa,UAAU,OAAO,KAAK,MAAM,CAAC;AAChD,YAAM,aAAa,QAAQ,KAAK,IAAI;AACpC,YAAM,aAAa,uBAAuB,eAAe;AACzD,UAAI,OAAO,KAAK;AAAA,IAClB,OAAO;AACL,YAAM,cAAc,SAAS,gBAAgB,IAAI,cAAc,MAAM;AACrE,kBAAY,aAAa,KAAK,OAAO,KAAK,CAAC,CAAC;AAC5C,kBAAY,aAAa,KAAK,OAAO,KAAK,CAAC,CAAC;AAC5C,kBAAY,aAAa,SAAS,OAAO,KAAK,KAAK,CAAC;AACpD,kBAAY,aAAa,UAAU,OAAO,KAAK,MAAM,CAAC;AACtD,kBAAY,aAAa,QAAQ,SAAS;AAC1C,kBAAY,aAAa,UAAU,SAAS;AAC5C,kBAAY,aAAa,oBAAoB,KAAK;AAClD,UAAI,OAAO,WAAW;AAAA,IACxB;AAAA,EACF;AAEA,aAAW,QAAQ,KAAK,OAAO;AAC7B,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,SAAK,aAAa,KAAK,KAAK,CAAC;AAC7B,SAAK,aAAa,aAAa,aAAa,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG;AAC/D,SAAK,aAAa,QAAQ,KAAK,IAAI;AACnC,SAAK,aAAa,UAAU,KAAK,MAAM;AACvC,SAAK,aAAa,gBAAgB,OAAO,KAAK,WAAW,CAAC;AAC1D,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA,aAAW,QAAQ,KAAK,OAAO;AAC7B,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,SAAK,aAAa,MAAM,OAAO,KAAK,EAAE,CAAC;AACvC,SAAK,aAAa,MAAM,OAAO,KAAK,EAAE,CAAC;AACvC,SAAK,aAAa,MAAM,OAAO,KAAK,EAAE,CAAC;AACvC,SAAK,aAAa,MAAM,OAAO,KAAK,EAAE,CAAC;AACvC,SAAK,aAAa,UAAU,KAAK,MAAM;AACvC,SAAK,aAAa,gBAAgB,OAAO,KAAK,WAAW,CAAC;AAC1D,SAAK,aAAa,kBAAkB,OAAO;AAC3C,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA,aAAW,QAAQ,KAAK,OAAO;AAC7B,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,SAAK,aAAa,KAAK,OAAO,KAAK,CAAC,CAAC;AACrC,SAAK,aAAa,KAAK,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;AACjD,SAAK,aAAa,aAAa,OAAO,KAAK,IAAI,CAAC;AAChD,SAAK,aAAa,QAAQ,KAAK,KAAK;AACpC,SAAK,aAAa,eAAe,KAAK,MAAM;AAC5C,QAAI,KAAK,kBAAkB,QAAW;AACpC,WAAK,aAAa,kBAAkB,OAAO,KAAK,aAAa,CAAC;AAAA,IAChE;AACA,SAAK,cAAc,KAAK;AACxB,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA,QAAM,UAAU,SAAS,cAAc,YAAY;AACnD,UAAQ,cAAc,GAAG,KAAK,IAAI,SAAM,KAAK,MAAM,MAAM,cAAW,KAAK,MAAM,MAAM,cAAW,KAAK,MAAM,MAAM,cAAW,KAAK,OAAO,MAAM;AAC9I,SAAO,OAAO,KAAK,OAAO;AAC1B,SAAO;AACT;AAEA,eAAe,cAAc,SAA4D;AACvF,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,SAAS,QAAQ,OAAO,CAAC,SAAS,iCAAiC,KAAK,KAAK,IAAI,CAAC,EAAE,MAAM,GAAG,EAAE,GAAG;AAC3G,UAAM,KAAK,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,QAAQ,YAAY,EAAE,KAAK,MAAM;AACzE,UAAM,WAAWC,kBAAiB,MAAM,IAAI;AAC5C,QAAI,CAAC,SAAS,WAAW,QAAQ,GAAG;AAClC;AAAA,IACF;AACA,UAAM,SAAS,MAAM,MAAM,MAAM,QAAQ;AACzC,UAAM,OAAO,QAAQ,QAAQ,WAAW,MAAM;AAC9C,WAAO,IAAI,IAAI,IAAI;AACnB,WAAO,IAAI,MAAM,MAAM,IAAI;AAC3B,WAAO,IAAI,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,MAAM,MAAM,IAAI;AAAA,EAC5D;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,KAAkD;AAC1E,QAAM,cAAc,MAAM,KAAK,IAAI,qBAAqB,GAAG,CAAC,EAAE,KAAK,CAAC,YAAY,QAAQ,cAAc,aAAa;AACnH,MAAI,aAAa,aAAa;AAC5B,UAAM,MAAM,cAAc,YAAY,WAAW;AACjD,QAAI,IAAI,QAAQ,KAAK,IAAI,SAAS,GAAG;AACnC,aAAO,EAAE,OAAO,IAAI,OAAO,QAAQ,IAAI,OAAO;AAAA,IAChD;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK,QAAQ,IAAI;AACnC;AAEA,SAAS,cAAc,SAAkB,UAAkB,qBAAqB,aAAqB;AACnG,QAAM,eAAe,aAAa,SAAS,kBAAkB,KAAK,aAAa,SAAS,aAAa,KAAK,aAAa,SAAS,WAAW;AAC3I,QAAM,QAAQ,eAAe,gBAAgB,cAAc,OAAO,IAAI;AACtE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,MAAM,KAAK,EAAE,MAAM,KAAK,EAAE,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAClE,MAAI,MAAM,UAAU,KAAK,MAAM,MAAM,CAAC,SAAS,OAAO,SAAS,IAAI,CAAC,GAAG;AACrE,WAAO,OAAO,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,EAC3F;AACA,SAAO;AACT;AAEA,SAAS,aAAa,SAA0B;AAC9C,QAAM,cAAc,aAAa,SAAS,WAAW;AACrD,SAAO,cAAc,cAAc,SAAS,eAAe,WAAW,IAAI;AAC5E;AAEA,SAAS,aAAa,SAAkB,WAAwC;AAC9E,SAAO,MAAM,KAAK,QAAQ,QAAQ,EAAE,KAAK,CAAC,UAAU,MAAM,cAAc,SAAS;AACnF;AAEA,SAAS,WAAW,OAAsB,UAA8D;AACtG,QAAM,SAAS,SAAS,IAAI,KAAK,EAAE,MAAM,KAAK,EAAE,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAC1E,SAAO;AAAA,IACL,GAAG,OAAO,SAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,SAAS;AAAA,IACnD,GAAG,OAAO,SAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,SAAS;AAAA,EACrD;AACF;AAEA,SAAS,qBAAqB,OAAuB;AACnD,SAAO,MACJ,QAAQ,YAAY,IAAI,EACxB,QAAQ,YAAY,IAAI,EACxB,QAAQ,YAAY,IAAI,EACxB,QAAQ,YAAY,IAAI,EACxB,QAAQ,YAAY,IAAI,EACxB,QAAQ,YAAY,IAAI,EACxB,QAAQ,WAAW,GAAG,EACtB,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAEA,SAASA,kBAAiB,MAAsB;AAC9C,QAAM,YAAY,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AACrD,QAAM,MAA8B;AAAA,IAClC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AACA,SAAO,YAAY,IAAI,SAAS,KAAK,6BAA6B;AACpE;AAEA,SAAS,cAAc,OAA+E;AACpG,QAAM,SAAS,SAAS,IAAI,KAAK,EAAE,MAAM,KAAK,EAAE,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAC1E,SAAO;AAAA,IACL,GAAG,OAAO,SAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI;AAAA,IAC1C,GAAG,OAAO,SAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI;AAAA,IAC1C,OAAO,OAAO,SAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI;AAAA,IAC9C,QAAQ,OAAO,SAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI;AAAA,EACjD;AACF;AAEA,SAAS,gBAAgB,SAAkB,WAAkC;AAC3E,QAAM,SAAS,QAAQ,aAAa,SAAS;AAC7C,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AACA,aAAW,aAAa,MAAM,KAAK,QAAQ,UAAU,GAAG;AACtD,QAAI,UAAU,cAAc,WAAW;AACrC,aAAO,UAAU;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASD,cAAa,OAAsB,UAA0B;AACpE,QAAM,SAAS,UAAU,OAAO,OAAO,MAAM,OAAO,KAAK;AACzD,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,kBAAkB,UAAkB,KAAa,QAA6B;AACrF,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AAErB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AAEpB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc,GAAG,MAAM,4BAAQ,QAAQ;AAE5C,QAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,WAAS,OAAO;AAChB,WAAS,WAAW;AACpB,WAAS,cAAc;AAEvB,WAAS,OAAO,OAAO,MAAM,QAAQ;AACrC,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAwB;AACjD,MAAI,iBAAiB,SAAS,MAAM,SAAS;AAC3C,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AACT;;;ACviBA,IAAAE,gBAAkB;AAClB,kBAAiB;AAOjB,IAAM,oBAAoB,oBAAI,IAAI,CAAC,OAAO,OAAO,MAAM,OAAO,MAAM,OAAO,OAAO,IAAI,CAAC;AACvF,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,uBAA+C;AAAA,EACnD,mBAAmB;AAAA,EACnB,gCAAgC;AAAA,EAChC,uBAAuB;AAAA,EACvB,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,oBAAoB;AACtB;AAmBO,SAAS,gBAA+B;AAC7C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,kBAAkB,IAAI,KAAK,SAAS,KAAK,iBAAiB,IAAI,KAAK,QAAQ;AAAA,IACpF;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AACvC,YAAM,QAAQ,YAAY,aAAa;AACvC,UAAI,SAAS,OAAO,KAAK;AAEzB,YAAM,MAAM,cAAc,IAAI,MAAM,oBAAoB,EAAE,YAAY;AACtE,UAAI,iBAAiC,CAAC;AACtC,UAAI,cAAc;AAClB,UAAI,aAA4B;AAChC,UAAI,eAAoC;AAGxC,UAAI;AACF,YAAI,QAAQ,OAAO;AACjB,cAAI;AACF,kBAAM,MAAM,MAAM,cAAAC,QAAM,UAAU,MAAM,gBAAgB,IAAI,IAAI,CAAC;AACjE,6BAAiB,OAAO,OAAO,IAAI,KAAK,EAAE,IAAI,CAAC,WAAW;AAAA,cACxD,MAAM,MAAM;AAAA,cACZ,YAAa,MAAc;AAAA,cAC3B,MAAO,MAAc,OAAO,oBAAoB;AAAA,cAChD,KAAK,MAAM;AAAA,cACX,MAAM,MAAM,MAAM,MAAM,aAAa;AAAA,YACvC,EAAE;AAAA,UACJ,SAAS,QAAa;AAEpB,gBACE,OAAO,YACN,OAAO,QAAQ,SAAS,WAAW,KAClC,OAAO,QAAQ,SAAS,UAAU,KAClC,OAAO,QAAQ,SAAS,WAAW,IACrC;AACA,4BAAc;AAAA,YAChB,OAAO;AACL,oBAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF,WAAW,QAAQ,OAAO;AACxB,2BAAiB,MAAM,MAAM,gBAAgB,IAAI,IAAI,CAAC;AAAA,QACxD,WAAW,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,UAAU;AAC5D,gBAAM,KAAK,IAAI,WAAW,MAAM,gBAAgB,IAAI,IAAI,CAAC;AACzD,gBAAM,eAAe,YAAAC,QAAK,OAAO,EAAE;AACnC,gBAAM,eAAe,IAAI,KAAK,KAAK,SAAS,KAAK,IAC7C,IAAI,KAAK,KAAK,MAAM,GAAG,EAAE,IACzB,IAAI,KAAK,KAAK,SAAS,MAAM,IAC7B,IAAI,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,SAC7B,IAAI,KAAK;AAEb,cAAI,QAAQ,SAAS,QAAQ,YAAY,aAAa,SAAS,MAAM,GAAG;AACtE,6BAAiB,MAAM,aAAa,MAAM;AAAA,UAC5C,OAAO;AAEL,6BAAiB;AAAA,cACf;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,aAAa;AAAA,gBACnB,KAAK;AAAA,gBACL,MAAM,YAAY,aAAa;AAAA,cACjC;AAAA,YACF;AAAA,UACF;AAAA,QACF,WAAW,CAAC,OAAO,MAAM,OAAO,IAAI,EAAE,SAAS,GAAG,GAAG;AACnD,yBAAe,mBAAmB,MAAM,gBAAgB,IAAI,IAAI,GAAG,GAAG;AAAA,QACxE,OAAO;AACL,uBAAa,wBAAS,IAAI,YAAY,CAAC;AAAA,QACzC;AAAA,MACF,SAAS,KAAU;AACjB,qBAAa,mDAAW,IAAI,WAAW,GAAG;AAAA,MAC5C;AAGA,UAAI,aAAa;AACf,cAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,iBAAS,YAAY;AAErB,cAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,cAAM,cAAc;AAEpB,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,cAAc;AAEnB,cAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,iBAAS,OAAO;AAChB,iBAAS,WAAW,IAAI,KAAK;AAC7B,iBAAS,cAAc;AAEvB,iBAAS,OAAO,OAAO,MAAM,QAAQ;AACrC,cAAM,OAAO,QAAQ;AACrB,YAAI,SAAS,UAAU,IAAI,YAAY;AAEvC,eAAO;AAAA,UACL,UAAU;AACR,gBAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,4BAAgB,KAAK,UAAU;AAC/B,kBAAM,OAAO;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,2BAAmB,OAAO,cAAc,IAAI,KAAK,MAAM,GAAG;AAC1D,eAAO;AAAA,UACL,UAAU;AACR,4BAAgB,KAAK,UAAU;AAC/B,kBAAM,OAAO;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAGA,UAAI,YAAY;AACd,cAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,iBAAS,YAAY;AAErB,cAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,cAAM,cAAc;AAEpB,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,cAAc;AAEnB,cAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,iBAAS,OAAO;AAChB,iBAAS,WAAW,IAAI,KAAK;AAC7B,iBAAS,cAAc;AAEvB,iBAAS,OAAO,OAAO,MAAM,QAAQ;AACrC,cAAM,OAAO,QAAQ;AACrB,YAAI,SAAS,UAAU,IAAI,YAAY;AAEvC,eAAO;AAAA,UACL,UAAU;AACR,gBAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,4BAAgB,KAAK,UAAU;AAC/B,kBAAM,OAAO;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAGA,YAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,aAAO,YAAY;AAEnB,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AACpB,YAAM,eAAe,SAAS,cAAc,KAAK;AACjD,mBAAa,YAAY;AAEzB,YAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,aAAO,YAAY;AACnB,YAAM,eAAe,SAAS,cAAc,MAAM;AAClD,mBAAa,YAAY;AACzB,mBAAa,cAAc,6BAAS,eAAe,OAAO,OAAK,CAAC,EAAE,GAAG,EAAE,MAAM;AAC7E,YAAM,gBAAgB,SAAS,cAAc,QAAQ;AACrD,oBAAc,YAAY;AAC1B,oBAAc,OAAO;AACrB,oBAAc,aAAa,cAAc,sCAAQ;AACjD,oBAAc,aAAa,iBAAiB,OAAO;AACnD,oBAAc,QAAQ;AACtB,oBAAc,cAAc;AAC5B,aAAO,OAAO,eAAe,YAAY;AACzC,mBAAa,OAAO,MAAM;AAE1B,YAAM,OAAO,SAAS,cAAc,KAAK;AACzC,WAAK,YAAY;AACjB,mBAAa,OAAO,IAAI;AACxB,cAAQ,OAAO,YAAY;AAE3B,YAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,gBAAU,YAAY;AAEtB,aAAO,OAAO,SAAS,SAAS;AAChC,YAAM,OAAO,MAAM;AAEnB,UAAI,qBAA0B;AAC9B,YAAM,0BAA0B,MAAM,IAAI,SAAS,eAAe,IAAI,KAAK;AAC3E,YAAM,4BAA4B,MAAM,wBAAwB,KAAK;AACrE,YAAM,sBAAsB,CAAC,cAAuB;AAClD,eAAO,UAAU,OAAO,wBAAwB,SAAS;AACzD,sBAAc,aAAa,iBAAiB,OAAO,CAAC,SAAS,CAAC;AAC9D,cAAM,QAAQ,YAAY,yCAAW;AACrC,sBAAc,aAAa,cAAc,KAAK;AAC9C,sBAAc,QAAQ;AACtB,sBAAc,cAAc,YAAY,WAAM;AAAA,MAChD;AACA,0BAAoB,KAAK;AACzB,oBAAc,iBAAiB,SAAS,MAAM;AAC5C,4BAAoB,CAAC,OAAO,UAAU,SAAS,sBAAsB,CAAC;AAAA,MACxE,CAAC;AAGD,YAAM,qBAAqB,MAAM;AAC/B,kBAAU,gBAAgB;AAC1B,cAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,gBAAQ,YAAY;AAEpB,cAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,gBAAQ,cAAc,IAAI,KAAK;AAE/B,cAAM,OAAO,SAAS,cAAc,KAAK;AACzC,aAAK,YAAY;AAEjB,cAAM,YAAY,eAAe,OAAO,OAAK,CAAC,EAAE,GAAG,EAAE;AACrD,cAAM,WAAW,eAAe,OAAO,OAAK,EAAE,GAAG,EAAE;AAEnD,0BAAkB,MAAM,4BAAQ,IAAI,IAAI,YAAY,CAAC,2BAAO;AAC5D,0BAAkB,MAAM,kCAAS,GAAG,SAAS,SAAI;AACjD,0BAAkB,MAAM,kCAAS,GAAG,QAAQ,SAAI;AAChD,0BAAkB,MAAM,4BAAQ,wGAAmB;AAEnD,gBAAQ,OAAO,SAAS,MAAM,qBAAqB,cAAc,CAAC;AAClE,kBAAU,OAAO,OAAO;AAAA,MAC1B;AAEA,yBAAmB;AAGnB,YAAM,iBAAiB,eAAe,OAAO,OAAK,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG;AACtE,UAAI,YAAY;AAChB,UAAI,cAAc;AAElB,qBAAe,QAAQ,CAAC,UAAU;AAChC,cAAM,OAAO,SAAS,cAAc,QAAQ;AAC5C,aAAK,YAAY;AACjB,aAAK,OAAO;AACZ,aAAK,QAAQ,MAAM;AAEnB,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,YAAY;AACjB,aAAK,cAAc,QAAQ,MAAM,MAAM,MAAM,GAAG;AAEhD,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,YAAY;AACjB,aAAK,cAAc,MAAM;AACzB,aAAK,QAAQ,MAAM;AAEnB,aAAK,OAAO,MAAM,IAAI;AACtB,aAAK,OAAO,IAAI;AAEhB,aAAK,iBAAiB,SAAS,YAAY;AACzC,cAAI,WAAW;AACb;AAAA,UACF;AACA,cAAI,0BAA0B,GAAG;AAC/B,gCAAoB,IAAI;AAAA,UAC1B;AACA,gBAAM,QAAQ,EAAE;AAEhB,kBAAQ,iBAAiB,mBAAmB,EAAE,QAAQ,CAAC,OAAO;AAC5D,eAAG,UAAU,OAAO,WAAW;AAC/B,eAAG,gBAAgB,cAAc;AAAA,UACnC,CAAC;AACD,eAAK,UAAU,IAAI,WAAW;AAC9B,eAAK,aAAa,gBAAgB,MAAM;AAGxC,cAAI,oBAAoB;AACtB,+BAAmB,QAAQ;AAC3B,iCAAqB;AAAA,UACvB;AAGA,oBAAU,gBAAgB,qBAAqB,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC;AAEzF,cAAI;AACF,gBAAI,SAAS,MAAM,MAAM,KAAK;AAC9B,gBAAI,aAAa,UAAU,aAAa;AACtC;AAAA,YACF;AACA,kBAAM,UAAU,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,MAAM;AACrD,kBAAM,SAAS,QAAQ,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY,KAAK;AAI1D,gBAAI,WAAW,OAAO;AACpB,oBAAM,WAAW,MAAM,KAAK,MAAM,GAAG,EAAE;AACvC,oBAAM,WAAW,eAAe;AAAA,gBAC9B,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,SAAS,YAAY,IAAI;AAAA,cAC3D;AACA,oBAAM,WAAW,eAAe;AAAA,gBAC9B,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,SAAS,YAAY,IAAI;AAAA,cAC3D;AACA,kBAAI,YAAY,UAAU;AACxB,sBAAM,WAAW,eAAe;AAAA,kBAC9B,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,SAAS,YAAY,IAAI;AAAA,gBAC3D;AACA,sBAAM,SAAS,IAAI,cAAAD,QAAM;AACzB,uBAAO,KAAK,SAAS,MAAM;AAC3B,uBAAO,KAAK,SAAS,KAAK,MAAM,GAAG,EAAE,IAAI,GAAI,MAAM,SAAS,KAAK,CAAC;AAClE,uBAAO,KAAK,SAAS,KAAK,MAAM,GAAG,EAAE,IAAI,GAAI,MAAM,SAAS,KAAK,CAAC;AAClE,oBAAI,UAAU;AACZ,yBAAO,KAAK,SAAS,KAAK,MAAM,GAAG,EAAE,IAAI,GAAI,MAAM,SAAS,KAAK,CAAC;AAAA,gBACpE;AACA,yBAAS,MAAM,OAAO,cAAc,EAAE,MAAM,cAAc,CAAC;AAC3D,oBAAI,aAAa,UAAU,aAAa;AACtC;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAEA,kBAAM,eAAe,SAAS,cAAc,KAAK;AACjD,yBAAa,MAAM,UAAU;AAC7B,sBAAU,gBAAgB,YAAY;AAEtC,kBAAM,cAAc,SAAS,cAAc,KAAK;AAChD,wBAAY,YAAY;AACxB,wBAAY,MAAM,UAAU;AAC5B,yBAAa,OAAO,WAAW;AAE/B,kBAAM,UAAuB,MAAM,cAAc,QAAQ,OAAO;AAEhE,kBAAM,UAAU,CAAC,GAAI,IAAI,QAAQ,WAAW,CAAC,GAAI,eAAe,CAAC;AACjE,gBAAI,gBAAgB,MAAM,qBAAqB,SAAS,OAAO;AAC/D,gBAAI,aAAa,UAAU,aAAa;AACtC;AAAA,YACF;AACA,gBAAI,cAAc,SAAS,WAAW;AACpC,8BAAgB,eAAe;AAAA,YACjC;AAEA,gBAAI;AACJ,kBAAM,kBAAkB,MAAM,QAAQ,QAAQ,EAC3C;AAAA,cAAK,MACJ,cAAc,OAAO;AAAA,gBACrB,MAAM,IAAI;AAAA,gBACV,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,MAAM,EAAE,OAAO,YAAY,eAAe,KAAK,QAAQ,YAAY,gBAAgB,IAAI;AAAA,gBACvF,SAAS,IAAI;AAAA,gBACb,YAAY,MAAM;AAAA,gBAAC;AAAA,gBACnB,UAAU,CAAC,QAAQ;AACjB,iCAAe,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACjE,8BAAY,gBAAgB,kBAAkB,wCAAU,aAAa,OAAO,CAAC;AAAA,gBAC/E;AAAA,cACA,CAAC;AAAA,YACH,EACC,MAAM,CAAC,UAAmB;AACzB,6BAAe,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACvE,0BAAY,gBAAgB,kBAAkB,wCAAU,aAAa,OAAO,CAAC;AAC7E,qBAAO;AAAA,YACT,CAAC;AACH,gBAAI,aAAa,UAAU,aAAa;AACtC,+BAAiB,QAAQ;AACzB;AAAA,YACF;AACA,gBAAI,mBAAmB,CAAC,cAAc;AACpC,mCAAqB;AAAA,YACvB,WAAW,iBAAiB;AAC1B,8BAAgB,QAAQ;AAAA,YAC1B;AAAA,UACF,SAAS,KAAU;AACjB,gBAAI,aAAa,UAAU,aAAa;AACtC;AAAA,YACF;AACA,sBAAU,gBAAgB,kBAAkB,wCAAU,OAAO,IAAI,WAAW,GAAG,CAAC,CAAC;AAAA,UACnF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAED,aAAO;AAAA,QACL,OAAO,MAAM;AACX,8BAAoB,SAAS,IAAI;AAAA,QACnC;AAAA,QACA,UAAU;AACR,sBAAY;AACZ,yBAAe;AACf,cAAI,oBAAoB;AACtB,+BAAmB,QAAQ;AAAA,UAC7B;AACA,0BAAgB,KAAK,UAAU;AAC/B,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,qBAAqB,SAA0B,MAA2C;AACvG,aAAW,UAAU,SAAS;AAC5B,QAAI,MAAM,OAAO,MAAM,IAAI,GAAG;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,eAAe;AACxB;AAEA,SAAS,kBAAkB,WAAmB,YAAiC;AAC7E,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AACrB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,SAAO,cAAc;AACrB,WAAS,OAAO,OAAO,MAAM;AAC7B,SAAO;AACT;AAEA,SAAS,kBAAkB,QAAqB,OAAe,OAAqB;AAClF,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,MAAI,cAAc,GAAG,KAAK;AAC1B,MAAI,OAAO,KAAK,SAAS,eAAe,KAAK,CAAC;AAC9C,SAAO,OAAO,GAAG;AACnB;AAEA,SAAS,qBAAqB,SAAsC;AAClE,QAAM,QAAQ,QAAQ,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG;AAClD,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,UAAQ,YAAY;AACpB,QAAM,YAAY,MAAM,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,MAAM,CAAC;AAClE,QAAM,UAAU,MAAM,OAAiC,CAAC,SAAS,UAAW,CAAC,WAAW,MAAM,OAAO,QAAQ,OAAO,QAAQ,SAAU,MAAS;AAC/I,uBAAqB,SAAS,kCAASE,aAAY,SAAS,CAAC;AAC7D,uBAAqB,SAAS,4BAAQ,UAAU,GAAG,QAAQ,IAAI,SAAMA,aAAY,QAAQ,IAAI,CAAC,KAAK,QAAG;AACtG,uBAAqB,SAAS,4BAAQ,wBAAwB,KAAK,CAAC;AACpE,uBAAqB,SAAS,kCAAS,OAAO,MAAM,MAAM,GAAG,GAAG,EAAE,MAAM,CAAC;AACzE,uBAAqB,SAAS,4BAAQ,OAAO,MAAM,OAAO,CAAC,UAAU,mBAAmB,MAAM,cAAc,MAAM,IAAI,CAAC,EAAE,MAAM,CAAC;AAChI,SAAO;AACT;AAEA,SAAS,qBAAqB,QAAqB,OAAe,OAAqB;AACrF,QAAM,MAAM,SAAS,cAAc,IAAI;AACvC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,UAAQ,cAAc;AACtB,SAAO,OAAO,KAAK,OAAO;AAC5B;AAEA,SAAS,wBAAwB,SAAiC;AAChE,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,SAAS,SAAS;AAC3B,UAAM,OAAO,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,MAAM;AAClD,UAAM,QAAQ,KAAK,YAAY,GAAG;AAClC,UAAM,YAAY,QAAQ,IAAI,KAAK,MAAM,QAAQ,CAAC,EAAE,YAAY,IAAI;AACpE,WAAO,IAAI,YAAY,OAAO,IAAI,SAAS,KAAK,KAAK,CAAC;AAAA,EACxD;AACA,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EACtD,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM,GAAG,SAAS,IAAI,KAAK,EAAE,EACnD,KAAK,IAAI,KAAK;AACnB;AAEA,SAAS,mBAAmB,MAAuB;AACjD,SAAO,KAAK,WAAW,GAAG,KAAK,kBAAkB,KAAK,IAAI,KAAK,KAAK,MAAM,QAAQ,EAAE,SAAS,IAAI;AACnG;AAEA,SAAS,qBAAqB,UAA+B;AAC3D,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,cAAc,+CAAY,QAAQ;AACvC,UAAQ,OAAO,SAAS,IAAI;AAC5B,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAoB,OAAqB,UAAkB,KAAmB;AACxG,QAAM,UAAU,cAAc,GAAG,MAAM,MAAM,2BAAO;AACpD,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cAAc,MAAM;AAEzB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,oBAAkB,MAAM,gBAAM,QAAQ;AACtC,oBAAkB,MAAM,gBAAM,MAAM,MAAM;AAC1C,aAAW,QAAQ,MAAM,MAAM;AAC7B,sBAAkB,MAAM,KAAK,OAAO,KAAK,KAAK;AAAA,EAChD;AAEA,QAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,WAAS,YAAY;AACrB,WAAS,OAAO;AAChB,WAAS,WAAW;AACpB,WAAS,cAAc;AAEvB,UAAQ,OAAO,MAAM,MAAM,QAAQ;AAEnC,MAAI,CAAC,MAAM,OAAO;AAChB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,MAAM,SAAS;AACnC,YAAQ,OAAO,KAAK;AAAA,EACtB;AAEA,MAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AACpB,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,eAAW,SAAS,CAAC,gBAAM,4BAAQ,0BAAM,GAAG;AAC1C,YAAM,KAAK,SAAS,cAAc,IAAI;AACtC,SAAG,cAAc;AACjB,aAAO,OAAO,EAAE;AAAA,IAClB;AACA,UAAM,OAAO,MAAM;AACnB,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,eAAW,SAAS,MAAM,QAAQ,MAAM,GAAG,GAAG,GAAG;AAC/C,YAAM,KAAK,SAAS,cAAc,IAAI;AACtC,iBAAW,SAAS;AAAA,QAClB,MAAM;AAAA,QACN,MAAM,SAAS,SAAY,iBAAOA,aAAY,MAAM,IAAI;AAAA,QACxD,MAAM,eAAe,SAAY,iBAAOA,aAAY,MAAM,UAAU;AAAA,MACtE,GAAG;AACD,cAAM,KAAK,SAAS,cAAc,IAAI;AACtC,WAAG,cAAc;AACjB,WAAG,OAAO,EAAE;AAAA,MACd;AACA,YAAM,OAAO,EAAE;AAAA,IACjB;AACA,UAAM,OAAO,OAAO,KAAK;AACzB,YAAQ,OAAO,KAAK;AACpB,YAAQ,OAAO,OAAO;AAAA,EACxB;AAEA,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,mBAAmB,aAA0B,WAAiC;AACrF,QAAM,QAAQ,IAAI,WAAW,WAAW;AACxC,MAAI,cAAc,OAAO;AACvB,WAAO,SAAS,KAAK;AAAA,EACvB;AACA,MAAI,cAAc,MAAM;AACtB,WAAO,QAAQ,KAAK;AAAA,EACtB;AACA,MAAI,cAAc,OAAO;AACvB,WAAO,WAAW,KAAK;AAAA,EACzB;AACA,MAAI,cAAc,MAAM;AACtB,WAAO,QAAQ,KAAK;AAAA,EACtB;AACA,SAAO;AAAA,IACL,QAAQ,UAAU,YAAY;AAAA,IAC9B,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM,CAAC;AAAA,IACP,SAAS,CAAC;AAAA,IACV,MAAM;AAAA,EACR;AACF;AAEA,SAAS,SAAS,OAAiC;AACjD,QAAM,OAAO,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,KAAQ,MAAM,CAAC,MAAM;AAC7K,QAAM,OAAO,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,KAAQ,MAAM,CAAC,MAAM,KAAQ,MAAM,CAAC,MAAM;AAClM,QAAM,UAAU,OAAO,iBAAiB,KAAK,IAAI,CAAC;AAClD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ,OAAO,SAAY;AAAA,IAClC,MAAM;AAAA,MACJ,EAAE,OAAO,gBAAM,OAAO,OAAO,SAAS,OAAO,SAAS,eAAK;AAAA,MAC3D,EAAE,OAAO,gBAAM,OAAO,cAAc,KAAK,EAAE;AAAA,MAC3C,EAAE,OAAO,4BAAQ,OAAO,OAAO,QAAQ,MAAM,EAAE;AAAA,IACjD;AAAA,IACA;AAAA,IACA,MAAM,OACF,yOACA;AAAA,EACN;AACF;AAEA,SAAS,iBAAiB,OAA4C;AACpE,QAAMC,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,UAAmC,CAAC;AAC1C,MAAI,SAAS;AACb,SAAO,SAAS,KAAK,MAAM,UAAU,QAAQ,SAAS,KAAK;AACzD,UAAM,OAAO,MAAM,SAAS,CAAC;AAC7B,UAAM,QAAQA,MAAK,UAAU,SAAS,GAAG,IAAI;AAC7C,QAAI,aAAaA,MAAK,UAAU,SAAS,GAAG,IAAI;AAChD,QAAI,aAAa,KAAK,SAAS,aAAa,MAAM,QAAQ;AACxD;AAAA,IACF;AACA,SAAK,QAAQ,WAAY,GAAG;AAC1B,UAAI,SAAS,KAAK,MAAM,QAAQ;AAC9B;AAAA,MACF;AACA,oBAAcA,MAAK,UAAU,SAAS,GAAG,IAAI;AAAA,IAC/C;AACA,QAAI,SAAS,OAAQ,SAAS,MAAM,MAAM,QAAQ;AAChD,YAAM,aAAaA,MAAK,UAAU,SAAS,GAAG,IAAI;AAClD,YAAM,eAAeA,MAAK,UAAU,SAAS,IAAI,IAAI;AACrD,YAAM,WAAWA,MAAK,UAAU,SAAS,IAAI,IAAI;AACjD,YAAM,aAAa,SAAS;AAC5B,YAAM,UAAU,KAAK,IAAI,aAAa,UAAU,SAAS,YAAY,MAAM,MAAM;AACjF,YAAM,YAAY,MAAM,MAAM,YAAY,OAAO;AACjD,YAAM,OAAO,IAAI,YAAY,QAAQ,EAAE,OAAO,SAAS,EAAE,QAAQ,SAAS,EAAE;AAC5E,UAAI,MAAM;AACR,gBAAQ,KAAK,EAAE,MAAM,MAAM,cAAc,WAAW,CAAC;AAAA,MACvD;AAAA,IACF;AACA,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,OAAiC;AAChD,QAAM,QAAQ,MAAM,UAAU,MAAM,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM;AAC1J,QAAM,OAA6B,CAAC,EAAE,OAAO,gBAAM,OAAO,cAAc,KAAK,EAAE,CAAC;AAChF,MAAI,OAAO;AACT,UAAMA,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,SAAK,KAAK,EAAE,OAAO,gBAAM,OAAO,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC;AAC3D,SAAK,KAAK,EAAE,OAAO,sBAAsB,OAAO,OAAOC,cAAaD,OAAM,EAAE,CAAC,EAAE,CAAC;AAChF,SAAK,KAAK,EAAE,OAAO,oBAAoB,OAAO,OAAOC,cAAaD,OAAM,EAAE,CAAC,EAAE,CAAC;AAC9E,SAAK,KAAK,EAAE,OAAO,mBAAmB,OAAO,KAAKA,MAAK,UAAU,IAAI,IAAI,EAAE,SAAS,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC;AAAA,EAC3G;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,QAAQ,SAAY;AAAA,IAC3B;AAAA,IACA,SAAS,CAAC;AAAA,IACV,MAAM;AAAA,EACR;AACF;AAEA,SAAS,WAAW,OAAiC;AACnD,QAAM,QAAQ,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,KAAK,MAAQ,MAAM,CAAC,KAAK;AAClI,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,QAAQ,SAAY;AAAA,IAC3B,MAAM;AAAA,MACJ,EAAE,OAAO,gBAAM,OAAO,cAAc,KAAK,EAAE;AAAA,MAC3C,EAAE,OAAO,sBAAO,OAAO,QAAQ,GAAG,OAAO,aAAa,MAAM,CAAC,CAAC,CAAC,UAAU,eAAK;AAAA,IAChF;AAAA,IACA,SAAS,CAAC;AAAA,IACV,MAAM;AAAA,EACR;AACF;AAEA,SAAS,QAAQ,OAAiC;AAChD,QAAM,QAAQ,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM;AACzJ,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,QAAQ,SAAY;AAAA,IAC3B,MAAM;AAAA,MACJ,EAAE,OAAO,gBAAM,OAAO,cAAc,KAAK,EAAE;AAAA,MAC3C,EAAE,OAAO,gBAAgB,OAAO,MAAM,UAAU,IAAI,KAAK,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,MAAM,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,KAAK,eAAK;AAAA,IACnL;AAAA,IACA,SAAS,CAAC;AAAA,IACV,MAAM;AAAA,EACR;AACF;AAEA,SAASC,cAAaD,OAAgB,QAAwB;AAC5D,SAAO,OAAOA,MAAK,UAAU,QAAQ,IAAI,CAAC,IAAK,OAAOA,MAAK,UAAU,SAAS,GAAG,IAAI,CAAC,KAAK;AAC7F;AAEA,SAASD,aAAY,OAAuB;AAC1C,MAAI,QAAQ,MAAM;AAChB,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,MAAI,QAAQ,OAAO,MAAM;AACvB,WAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAAA,EACrC;AACA,SAAO,IAAI,QAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC;AAC5C;AAEA,SAAS,cAAc,OAA2B;AAChD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,iBAAiB,GAAG;AACtH,QAAM,MAAM,MAAM,KAAK,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,EAC7D,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,EAC9D,KAAK,GAAG;AACX,SAAO,GAAG,KAAK,KAAK,GAAG;AACzB;AAGA,SAAS,MAAM,aAA0C;AACvD,QAAM,UAA0B,CAAC;AACjC,QAAM,KAAK,IAAI,WAAW,WAAW;AACrC,MAAI,SAAS;AAEb,QAAM,aAAa,CAAC,OAAe,WAA2B;AAC5D,QAAI,MAAM;AACV,WAAO,MAAM,QAAQ,UAAU,GAAG,GAAG,MAAM,GAAG;AAC5C;AAAA,IACF;AACA,WAAO,IAAI,YAAY,EAAE,OAAO,GAAG,SAAS,OAAO,GAAG,CAAC,EAAE,KAAK;AAAA,EAChE;AAEA,SAAO,SAAS,OAAO,YAAY,YAAY;AAC7C,UAAM,QAAQ,WAAW,SAAS,KAAK,CAAC;AACxC,QAAI,UAAU,WAAW,UAAU,WAAW;AAC5C,UAAI,UAAU;AACd,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,YAAI,GAAG,SAAS,CAAC,MAAM,GAAG;AACxB,oBAAU;AACV;AAAA,QACF;AAAA,MACF;AACA,UAAI,SAAS;AACX;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,OAAO,WAAW,QAAQ,GAAG;AACnC,UAAM,SAAS,WAAW,SAAS,KAAK,GAAG;AAC3C,UAAM,WAAW,SAAS,GAAG,MAAM,IAAI,IAAI,KAAK;AAEhD,UAAM,UAAU,WAAW,SAAS,KAAK,EAAE;AAC3C,UAAM,OAAO,SAAS,SAAS,CAAC,KAAK;AACrC,UAAM,WAAW,WAAW,SAAS,KAAK,CAAC;AAC3C,UAAM,MAAM,aAAa,OAAO,SAAS,SAAS,GAAG;AAErD,UAAM,gBAAgB,SAAS;AAC/B,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,MAAM,YAAY,YAAY,MAAM,eAAe,gBAAgB,IAAI;AAAA,IACzE,CAAC;AAED,cAAU,MAAM,KAAK,KAAK,OAAO,GAAG,IAAI;AAAA,EAC1C;AAEA,SAAO;AACT;AAGA,SAAS,QAAQ,MAAc,KAAsB;AACnD,MAAI,IAAK,QAAO;AAChB,QAAM,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AAC/C,UAAQ,KAAK;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;AC9zBA,IAAAG,oBAAsB;AAKtB,IAAM,kBAAkB,oBAAI,IAAI,CAAC,OAAO,OAAO,MAAM,CAAC;AACtD,IAAM,iBAAiB,oBAAI,IAAI,CAAC,kBAAkB,8BAA8B,kBAAkB,CAAC;AACnG,IAAM,qBAA6C;AAAA,EACjD,kBAAkB;AAAA,EAClB,8BAA8B;AAAA,EAC9B,oBAAoB;AACtB;AA0BO,SAAS,cAA6B;AAC3C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,gBAAgB,IAAI,KAAK,SAAS,KAAK,eAAe,IAAI,KAAK,QAAQ;AAAA,IAChF;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,WAAW;AACrC,UAAI,SAAS,OAAO,KAAK;AAEzB,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AACvC,YAAM,MAAM,cAAc,IAAI,MAAM,kBAAkB,EAAE,YAAY;AACpE,UAAI;AACJ,YAAM,qBAA+B,CAAC;AACtC,YAAM,uBAAuB,oBAAI,IAA6B;AAC9D,YAAM,gBAA0B,CAAC;AACjC,UAAI,cAAoC,CAAC;AAEzC,UAAI;AACF,YAAI,QAAQ,OAAO;AAEjB,gBAAM,aAAa,MAAM,OAAO,qBAAqB,GAAG;AACxD,gBAAM,SAAS,MAAM,gBAAgB,IAAI,IAAI;AAC7C,gBAAM,SAAS,IAAI,UAAU,MAAM;AACnC,gBAAM,SAAS,OAAO,YAAY;AAElC,cAAI,OAAO,OAAO;AAChB,kBAAM,IAAI,MAAM,OAAO,KAAK;AAAA,UAC9B;AAEA,gBAAM,OAAO,OAAO,aAChB,GAAG,OAAO,UAAU,KAAK,OAAO,eAAe,OAAO,qBAAqB,EAAE,IAAI,KAAK,IACtF,OAAO,eAAe,OAAO,qBAAqB;AAEtD,gBAAM,aAAa,OAAO,cAAc,CAAC;AACzC,gBAAM,KAAK,WACR,OAAO,CAAC,MAAM,EAAE,cAAc,IAAI,EAClC,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,KAAK,CAAC,EACvE,KAAK,IAAI;AACZ,gBAAM,KAAK,WACR,OAAO,CAAC,MAAM,EAAE,cAAc,IAAI,EAClC,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,KAAK,CAAC,EACvE,KAAK,IAAI;AAEZ,gBAAM,cAAiC,CAAC;AACxC,cAAI,MAAM,QAAQ,OAAO,WAAW,GAAG;AACrC,mBAAO,YAAY,QAAQ,CAAC,QAAQ;AAClC,kBAAI;AACF,sBAAM,UAAU,OAAO,cAAc,GAAG;AACxC,4BAAY,KAAK;AAAA,kBACf,MAAM,QAAQ,YAAY;AAAA,kBAC1B,UAAU,sBAAsB,SAAS,GAAG;AAAA,kBAC5C,SAAS,QAAQ;AAAA,kBACjB,WAAW,IAAI;AAAA,gBACjB,CAAC;AAAA,cACH,SAAS,QAAQ;AACf,wBAAQ,KAAK,+BAA+B,MAAM;AAAA,cACpD;AAAA,YACF,CAAC;AAAA,UACH;AAEA,cAAI,WAAW,OAAO;AACtB,cAAI,CAAC,YAAY,OAAO,gBAAgB,YAAY;AAClD,uBAAW,IAAI,YAAY,OAAO,EAAE,OAAO,OAAO,IAAI;AAAA,UACxD;AAEA,sBAAY;AAAA,YACV,MAAM,QAAQ;AAAA,YACd,IAAI,MAAM;AAAA,YACV,IAAI,MAAM;AAAA,YACV,SAAS,OAAO,WAAW;AAAA,YAC3B,MAAM,OAAO,uBAAuB,OAAO,oBAAoB,OAAO,gBAAgB;AAAA,YACtF,UAAU,OAAO;AAAA,YACjB;AAAA,YACA;AAAA,UACF;AAAA,QACF,OAAO;AAEL,gBAAM,cAAc,MAAM,OAAO,aAAa,GAAG;AACjD,gBAAM,SAAS,IAAI,WAAW;AAE9B,cAAI,UAAU,MAAM,aAAa,IAAI,IAAI;AACzC,cAAI,QAAQ,QAAQ;AAClB,kBAAM,WAAW,kBAAkB,OAAO;AAC1C,0BAAc,SAAS,IAAI,oBAAoB;AAC/C,sBAAU,SAAS,CAAC,KAAK;AAAA,UAC3B;AAEA,gBAAM,SAAS,MAAM,OAAO,MAAM,OAAO;AAEzC,gBAAM,OAAO,OAAO,OAAO,GAAG,OAAO,KAAK,QAAQ,EAAE,KAAK,OAAO,KAAK,WAAW,EAAE,IAAI,KAAK,IAAI;AAC/F,gBAAM,KAAK,MAAM,QAAQ,OAAO,EAAE,IAC9B,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,IAC7E;AACJ,gBAAM,KAAK,MAAM,QAAQ,OAAO,EAAE,IAC9B,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,IAC7E;AAEJ,sBAAY;AAAA,YACV,MAAM,QAAQ;AAAA,YACd,IAAI,MAAM;AAAA,YACV,IAAI,MAAM;AAAA,YACV,SAAS,OAAO,WAAW;AAAA,YAC3B,MAAM,OAAO,QAAQ;AAAA,YACrB,UAAU,OAAO;AAAA,YACjB,UAAU,OAAO;AAAA,YACjB,cAAc,OAAO,eAAe,CAAC,GAAG,IAAI,CAAC,SAAS;AAAA,cACpD,MAAM,IAAI,YAAY;AAAA,cACtB,UAAU,IAAI,YAAY;AAAA,cAC1B,SAAS,IAAI,mBAAmB,aAAa,IAAI,UAAU,IAAI,WAAW,IAAI,OAAc;AAAA,cAC5F,WAAW,IAAI;AAAA,YACjB,EAAE;AAAA,UACJ;AAAA,QACF;AAEA,YAAI,YAAY,SAAS,GAAG;AAC1B,gBAAM,OAAO,yBAAyB,WAAW,CAAC;AAAA,QACpD;AAGA,cAAM,gBAAgB,cAAc,0BAAM;AAC1C,mBAAW,eAAe,WAAW,UAAU,OAAO;AACtD,mBAAW,eAAe,QAAQ,UAAU,IAAI;AAChD,mBAAW,eAAe,MAAM,UAAU,EAAE;AAC5C,YAAI,UAAU,IAAI;AAChB,qBAAW,eAAe,MAAM,UAAU,EAAE;AAAA,QAC9C;AACA,mBAAW,eAAe,QAAQ,UAAU,IAAI;AAChD,cAAM,OAAO,aAAa;AAG1B,YAAI,UAAU,YAAY,SAAS,GAAG;AACpC,gBAAM,qBAAqB,cAAc,0BAAM;AAC/C,gBAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,oBAAU,YAAY;AAEtB,oBAAU,YAAY,QAAQ,CAAC,QAAQ;AACrC,kBAAM,UAAU,uBAAuB,KAAK,sBAAsB,kBAAkB;AAEpF,kBAAM,OAAO,SAAS,cAAc,GAAG;AACvC,iBAAK,YAAY;AACjB,iBAAK,OAAO;AACZ,iBAAK,WAAW,IAAI;AACpB,iBAAK,MAAM;AAGX,kBAAM,SAAS,KAAK,MAAM,IAAI,QAAQ,aAAa,IAAI;AACvD,iBAAK,cAAc,eAAe,IAAI,IAAI,KAAK,MAAM;AACrD,sBAAU,OAAO,IAAI;AAAA,UACvB,CAAC;AAED,6BAAmB,OAAO,SAAS;AACnC,gBAAM,OAAO,kBAAkB;AAAA,QACjC;AAGA,cAAM,cAAc,cAAc,cAAI;AACtC,cAAM,OAAO,WAAW;AAExB,YAAI,OAAO,UAAU;AACrB,YAAI,MAAM;AAER,cAAI,WAAW;AACf,oBAAU,YAAY,QAAQ,CAAC,QAAQ;AACrC,kBAAM,YAAY,IAAI;AACtB,gBAAI,WAAW;AACb,oBAAM,UAAU,uBAAuB,KAAK,sBAAsB,kBAAkB;AAEpF,oBAAM,WAAW,UAAU,QAAQ,SAAS,EAAE;AAC9C,yBAAW,uBAAuB,UAAU,WAAW,OAAO;AAC9D,kBAAI,aAAa,WAAW;AAC1B,2BAAW,uBAAuB,UAAU,UAAU,OAAO;AAAA,cAC/D;AAAA,YACF;AAAA,UACF,CAAC;AACD,iBAAO;AACP,gBAAM,gBAAgB,kBAAkB,IAAI;AAG5C,gBAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,iBAAO,YAAY;AACnB,iBAAO,aAAa,WAAW,6CAA6C;AAC5E,iBAAO,MAAM,UAAU;AACvB,sBAAY,OAAO,MAAM;AAEzB,iBAAO,SAAS,MAAM;AACpB,gBAAI;AACF,oBAAM,OAAO,OAAO,mBAAmB,OAAO,eAAe;AAC7D,kBAAI,MAAM;AACR,qBAAK,KAAK;AACV,qBAAK,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAwBC,aAAa;AAAA;AAAA,iBAExB;AACD,qBAAK,MAAM;AACX,iCAAiB,IAAI;AAGrB,sBAAM,SAAS,MAAM;AACnB,wBAAM,OAAO,KAAK;AAClB,wBAAM,QAAQ,KAAK;AACnB,wBAAM,SAAS,KAAK;AAAA,oBAClB,KAAK;AAAA,oBACL,KAAK;AAAA,oBACL,MAAM;AAAA,oBACN,MAAM;AAAA,oBACN,MAAM;AAAA,kBACR;AACA,yBAAO,MAAM,SAAS,GAAG,SAAS,EAAE;AAAA,gBACtC;AAEA,uBAAO;AACP,8BAAc,KAAK,OAAO,WAAW,QAAQ,GAAG,CAAC;AACjD,8BAAc,KAAK,OAAO,WAAW,QAAQ,GAAI,CAAC;AAAA,cACpD;AAAA,YACF,SAAS,KAAK;AACZ,sBAAQ,MAAM,8CAA8C,GAAG;AAAA,YACjE;AAAA,UACF;AAAA,QACF,OAAO;AAEL,gBAAM,MAAM,SAAS,cAAc,KAAK;AACxC,cAAI,YAAY;AAChB,cAAI,cAAc,UAAU,YAAY;AACxC,sBAAY,OAAO,GAAG;AAAA,QACxB;AAAA,MAEF,SAAS,KAAU;AACjB,cAAM,gBAAgB;AACtB,cAAM,eAAe,cAAc,sCAAQ;AAC3C,cAAM,MAAM,SAAS,cAAc,KAAK;AACxC,YAAI,YAAY;AAChB,YAAI,MAAM,QAAQ;AAClB,YAAI,cAAc;AAAA,EAAe,IAAI,WAAW,GAAG;AACnD,qBAAa,OAAO,GAAG;AACvB,cAAM,OAAO,YAAY;AAAA,MAC3B;AAEA,aAAO;AAAA,QACL,UAAU;AACR,wBAAc,QAAQ,CAAC,UAAU,OAAO,aAAa,KAAK,CAAC;AAC3D,6BAAmB,QAAQ,CAAC,MAAM;AAChC,gBAAI,gBAAgB,CAAC;AAAA,UACvB,CAAC;AACD,0BAAgB,KAAK,UAAU;AAC/B,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,uBACP,YACA,OACA,cACQ;AACR,QAAM,SAAS,MAAM,IAAI,UAAU;AACnC,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AACA,QAAM,OAAO,IAAI,KAAK,CAAC,WAAW,OAAmB,GAAG,EAAE,MAAM,WAAW,SAAS,CAAC;AACrF,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAM,IAAI,YAAY,GAAG;AACzB,eAAa,KAAK,GAAG;AACrB,SAAO;AACT;AAEA,SAAS,sBAAsB,gBAAyB,gBAAkC;AACxF,QAAM,aAAa,CAAC,gBAAgB,cAAc;AAClD,aAAW,aAAa,YAAY;AAClC,QAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C;AAAA,IACF;AACA,UAAM,SAAS;AACf,UAAM,eACJ,mBAAmB,OAAO,aAAa,KACvC,mBAAmB,OAAO,QAAQ,KAClC,mBAAmB,OAAO,WAAW,KACrC,mBAAmB,OAAO,IAAI,KAC9B,mBAAmB,OAAO,cAAc,CAAC;AAC3C,QAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,YACH,kBAAkB,OAAO,mBAAmB,WAAY,eAA0C,WAAW,YAC7G,kBAAkB,OAAO,mBAAmB,WAAY,eAA0C,WAAW;AAChH,SAAO,YAAY,OAAO,aAAa,WAAW,WAAW,EAAE;AACjE;AAEA,SAAS,mBAAmB,OAAwB;AAClD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,WAAW,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,EAAE,YAAY,KAAK;AAC9D,SAAO,SAAS,SAAS,GAAG,IAAI,WAAW;AAC7C;AAEA,SAAS,uBAAuB,MAAc,WAAmB,SAAyB;AACxF,QAAM,aAAa,aAAa,SAAS;AACzC,SAAO,KAAK;AAAA,IACV,IAAI,OAAO,wCAAwC,UAAU,OAAO,IAAI;AAAA,IACxE,CAAC,QAAQ,WAAmB,UAAkB,GAAG,SAAS,IAAI,KAAK,GAAG,OAAO,GAAG,KAAK;AAAA,EACvF;AACF;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAEA,SAAS,yBAAyB,UAA6C;AAC7E,QAAM,UAAU,cAAc,+BAAW;AACzC,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,aAAW,MAAM,sBAAO,OAAO,SAAS,MAAM,CAAC;AAC/C,aAAW,MAAM,gBAAM,oEAAa;AAEpC,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,YAAY;AACtB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,aAAW,SAAS,CAAC,KAAK,WAAW,QAAQ,MAAM,GAAG;AACpD,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,cAAc;AACjB,WAAO,OAAO,EAAE;AAAA,EAClB;AACA,QAAM,OAAO,MAAM;AACnB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,WAAS,MAAM,GAAG,GAAG,EAAE,QAAQ,CAAC,SAAS,UAAU;AACjD,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,eAAW,SAAS,CAAC,OAAO,QAAQ,CAAC,GAAG,QAAQ,WAAW,wBAAS,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,GAAG,GAAG;AAC7G,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,WAAK,cAAc;AACnB,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,UAAM,OAAO,GAAG;AAAA,EAClB,CAAC;AACD,QAAM,OAAO,OAAO,KAAK;AACzB,YAAU,OAAO,KAAK;AACtB,UAAQ,OAAO,MAAM,SAAS;AAC9B,SAAO;AACT;AAEA,SAAS,kBAAkB,UAA4B;AACrD,QAAM,QAAQ,SAAS,QAAQ,SAAS,IAAI,EAAE,MAAM,IAAI;AACxD,QAAM,WAAuB,CAAC;AAC9B,MAAI,UAA2B;AAC/B,MAAI,iBAAiB;AAErB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,UAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,iBAAS,KAAK,OAAO;AAAA,MACvB;AACA,gBAAU,CAAC;AACX,uBAAiB;AACjB;AAAA,IACF;AACA,QAAI,kBAAkB,SAAS;AAC7B,cAAQ,KAAK,KAAK,WAAW,QAAQ,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI;AAAA,IAC/D;AAAA,EACF;AACA,MAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,aAAS,KAAK,OAAO;AAAA,EACvB;AACA,SAAO,SAAS,SAAS,IAAI,SAAS,IAAI,CAAC,YAAY,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ;AACxF;AAEA,SAAS,qBAAqB,SAAqC;AACjE,SAAO;AAAA,IACL,MAAM,aAAa,gBAAgB,SAAS,MAAM,CAAC;AAAA,IACnD,SAAS,aAAa,gBAAgB,SAAS,SAAS,CAAC;AAAA,IACzD,MAAM,aAAa,gBAAgB,SAAS,MAAM,CAAC;AAAA,EACrD;AACF;AAEA,SAAS,gBAAgB,SAAiB,MAAsB;AAC9D,QAAM,UAAU,QAAQ,MAAM,WAAW,CAAC,EAAE,CAAC,KAAK;AAClD,QAAM,UAAU,KAAK,QAAQ,uBAAuB,MAAM;AAC1D,QAAM,QAAQ,QAAQ,MAAM,IAAI,OAAO,IAAI,OAAO,kDAAkD,IAAI,CAAC;AACzG,SAAO,QAAQ,CAAC,GAAG,KAAK,KAAK;AAC/B;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,aAAa,GAAG,EAAE,KAAK;AAC9C;AAGA,SAAS,YAAY,MAAsB;AACzC,QAAM,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AAC/C,QAAM,MAA8B;AAAA,IAClC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACA,SAAO,MAAM,IAAI,GAAG,KAAK,6BAA6B;AACxD;AAEA,SAAS,kBAAkB,MAAsB;AAC/C,SAAO,kBAAAC,QAAU,SAAS,MAAM;AAAA,IAC9B,cAAc,EAAE,MAAM,KAAK;AAAA,IAC3B,UAAU,CAAC,QAAQ;AAAA,IACnB,oBAAoB;AAAA,EACtB,CAAC;AACH;AAEA,SAAS,iBAAiBC,WAA0B;AAClD,aAAW,QAAQA,UAAS,iBAAoC,SAAS,GAAG;AAC1E,UAAM,OAAO,KAAK,aAAa,MAAM,KAAK;AAC1C,QAAI,CAAC,gBAAgB,IAAI,GAAG;AAC1B,WAAK,gBAAgB,MAAM;AAC3B,WAAK,gBAAgB,QAAQ;AAC7B,WAAK,gBAAgB,KAAK;AAC1B;AAAA,IACF;AACA,QAAI,mBAAmB,KAAK,IAAI,GAAG;AACjC,WAAK,SAAS;AACd,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,MAAuB;AAC9C,QAAM,UAAU,KAAK,KAAK;AAC1B,SACE,QAAQ,WAAW,GAAG,KACtB,QAAQ,WAAW,GAAG,KACtB,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,KAAK,KACxB,QAAQ,WAAW,OAAO,KAC1B,2BAA2B,KAAK,OAAO;AAE3C;;;AC7fA,IAAAC,eAAiB;AAIjB,IAAM,oBAAoB,oBAAI,IAAI,CAAC,UAAU,OAAO,cAAc,QAAQ,CAAC;AAC3E,IAAM,uBAA+C;AAAA,EACnD,iCAAiC;AAAA,EACjC,mCAAmC;AAAA,EACnC,iCAAiC;AACnC;AACA,IAAM,SAAS;AAER,SAAS,gBAA+B;AAC7C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,kBAAkB,IAAI,KAAK,SAAS,KAAK,QAAQ,qBAAqB,KAAK,QAAQ,CAAC;AAAA,IAC7F;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,aAAa;AACvC,UAAI,SAAS,OAAO,KAAK;AACzB,YAAM,OAAO,MAAM,aAAa,IAAI,IAAI;AACxC,YAAM,YAAY,cAAc,IAAI,MAAM,oBAAoB;AAE9D,UAAI;AACF,YAAI,cAAc,cAAc;AAC9B,2BAAiB,OAAO,IAAI;AAAA,QAC9B,WAAW,cAAc,UAAU;AACjC,uBAAa,OAAO,IAAI;AAAA,QAC1B,WAAW,cAAc,YAAY,cAAc,OAAO;AACxD,uBAAa,OAAO,IAAI;AAAA,QAC1B,OAAO;AACL,2BAAiB,OAAO,aAAa,WAAW,IAAI;AAAA,QACtD;AAAA,MACF,SAAS,OAAO;AACd,mCAA2B,OAAO,aAAa,WAAW,MAAM,KAAK;AAAA,MACvE;AAEA,aAAO;AAAA,QACL,UAAU;AACR,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAcA,SAAS,qBAAqB,OAA0C;AACtE,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,aAAa,kBAAkB,KAAK;AAC1C,uBAAqB,SAAS,gBAAM,OAAO,MAAM,MAAM,CAAC;AACxD,uBAAqB,SAAS,gBAAM,mBAAmB,UAAU,CAAC;AAClE,uBAAqB,SAAS,gBAAM,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,QAAQ,KAAK,KAAK,KAAK,CAAC,EAAE,MAAM,CAAC;AACxG,uBAAqB,SAAS,gBAAM,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,IAAI,EAAE,MAAM,CAAC;AACpF,QAAM,QAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,KAAK,EAAE;AAC/D,MAAI,QAAQ,GAAG;AACb,yBAAqB,SAAS,6BAAS,OAAO,KAAK,CAAC;AAAA,EACtD;AACA,QAAM,SAAS,cAAc,KAAK;AAClC,MAAI,QAAQ;AACV,yBAAqB,SAAS,gBAAM,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE;AAAA,EAC9I;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,QAAqB,OAAe,OAAqB;AACrF,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,OAAK,OAAO,KAAK,OAAO;AACxB,SAAO,OAAO,IAAI;AACpB;AAEA,SAAS,kBAAkB,OAAkD;AAC3E,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,OAAO;AACxB,WAAO,IAAI,KAAK,OAAO,OAAO,IAAI,KAAK,IAAI,KAAK,KAAK,CAAC;AAAA,EACxD;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,QAAqC;AAC/D,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE,EACzC,KAAK,IAAI,KAAK;AACnB;AAEA,SAAS,cAAc,OAA2E;AAChG,QAAM,QAAQ,MACX,IAAI,CAAC,SAAS;AACb,QAAI,CAAC,OAAO,SAAS,KAAK,CAAC,KAAK,CAAC,OAAO,SAAS,KAAK,CAAC,GAAG;AACxD,aAAO;AAAA,IACT;AACA,UAAM,IAAI,KAAK;AACf,UAAM,IAAI,KAAK;AACf,UAAM,QAAQ,KAAK,IAAI,GAAGC,cAAa,KAAK,OAAO,CAAC,CAAC;AACrD,UAAM,SAAS,KAAK,IAAI,GAAGA,cAAa,KAAK,QAAQ,CAAC,CAAC;AACvD,WAAO,CAAC,GAAG,GAAG,IAAI,OAAO,IAAI,MAAM;AAAA,EACrC,CAAC,EACA,OAAO,CAAC,SAAmD,QAAQ,IAAI,CAAC;AAC3E,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;AAAA,IACtC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;AAAA,IACtC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;AAAA,IACtC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;AAAA,EACxC;AACF;AAEA,SAAS,sBAAsB,SAAsD;AACnF,SAAO;AAAA,IACL,MAAM,OAAO,QAAQ,QAAQ,SAAS;AAAA,IACtC,GAAGA,cAAa,QAAQ,GAAG,CAAC;AAAA,IAC5B,GAAGA,cAAa,QAAQ,GAAG,CAAC;AAAA,IAC5B,OAAOA,cAAa,QAAQ,OAAO,CAAC;AAAA,IACpC,QAAQA,cAAa,QAAQ,QAAQ,CAAC;AAAA,IACtC,MAAM,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AAAA,IAC/C,OAAO,QAAQ,SAAS;AAAA,IACxB,OAAO,QAAQ,SAAS;AAAA,IACxB,MAAM,QAAQ,SAAS,WAAW,QAAQ,SAAS;AAAA,EACrD;AACF;AAEA,SAAS,kBAAkB,OAAwC;AACjE,QAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,SAAO;AAAA,IACL,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,SAAS;AAAA,IAClD,GAAGA,cAAa,MAAM,GAAG,CAAC;AAAA,IAC1B,GAAGA,cAAa,MAAM,GAAG,CAAC;AAAA,IAC1B,OAAOA,cAAa,MAAM,GAAGA,cAAa,MAAM,OAAO,CAAC,CAAC;AAAA,IACzD,QAAQA,cAAa,MAAM,GAAGA,cAAa,MAAM,QAAQ,CAAC,CAAC;AAAA,IAC3D,MAAM,OAAO,MAAM,QAAQ,EAAE;AAAA,IAC7B,MAAM,MAAM,SAAS,WAAW,MAAM,SAAS;AAAA,EACjD;AACF;AAEA,SAAS,kBAAkB,OAAwC;AACjE,SAAO;AAAA,IACL,MAAM,MAAM,OAAO,SAAS,gBAAgB,MAAM,KAAK;AAAA,IACvD,GAAG,MAAM;AAAA,IACT,GAAG,MAAM;AAAA,IACT,OAAO,MAAM;AAAA,IACb,QAAQ,MAAM;AAAA,IACd,MAAM,MAAM;AAAA,IACZ,OAAO,gBAAgB,MAAM,KAAK,MAAM;AAAA,IACxC,MAAM,MAAM;AAAA,EACd;AACF;AAEA,SAAS,iBAAiB,OAAoB,MAAoB;AAChE,QAAM,OAAO,KAAK,MAAM,IAAI;AAI5B,QAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,QAAM,YAAY,KAAK,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,QAAQ,SAAS;AAC7E,QAAM,UAAU,cAAc,cAAc,SAAS,MAAM,WAAW;AACtE,UAAQ,OAAO,qBAAqB,SAAS,IAAI,qBAAqB,CAAC,CAAC;AACxE,QAAM,MAAM,SAAS,gBAAgB,QAAQ,KAAK;AAClD,MAAI,aAAa,SAAS,eAAe;AACzC,MAAI,aAAa,WAAW,wBAAwB,QAAQ,CAAC;AAC7D,QAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,MAAI,OAAO,IAAI;AAEf,aAAW,WAAW,UAAU;AAC9B,UAAM,OAAO,OAAO,QAAQ,QAAQ,EAAE;AACtC,UAAM,IAAI,OAAO,QAAQ,KAAK,CAAC;AAC/B,UAAM,IAAI,OAAO,QAAQ,KAAK,CAAC;AAC/B,UAAM,QAAQ,OAAO,QAAQ,SAAS,EAAE;AACxC,UAAM,SAAS,OAAO,QAAQ,UAAU,EAAE;AAC1C,UAAM,SAAS,OAAO,QAAQ,eAAe,SAAS;AACtD,UAAM,OAAO,eAAe,KAAK,MAAM,SAAS,MAAM;AACtD,UAAM,SAAS,yBAAyB,OAAO;AAC/C,UAAM,YAAY,oBAAoB,SAAS,GAAG,GAAG,OAAO,MAAM;AAElE,QAAI,SAAS,SAAS;AACpB,YAAM,QAAQ,SAAS,gBAAgB,QAAQ,MAAM;AACrD,oBAAc,OAAO;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,QACpB,SAAS,OAAO;AAAA,QAChB;AAAA,MACF,CAAC;AACD,UAAI,OAAO,KAAK;AAChB,6BAAuB,KAAK,OAAO,QAAQ,QAAQ,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW;AAAA,QACtF,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH,WAAW,SAAS,SAAS;AAC3B,4BAAsB,KAAK,SAAS,OAAO,GAAG,GAAG,OAAO,QAAQ,QAAQ,SAAS;AAAA,IACnF,WAAW,SAAS,cAAc;AAChC,iCAA2B,KAAK,SAAS,GAAG,GAAG,OAAO,QAAQ,QAAQ,SAAS;AAAA,IACjF,WAAW,SAAS,eAAe,SAAS,WAAW;AACrD,UAAI,SAAS,WAAW;AACtB,cAAM,UAAU,SAAS,gBAAgB,QAAQ,SAAS;AAC1D,gBAAQ;AAAA,UACN;AAAA,UACA,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,SAAS,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,IAAI,MAAM,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;AAAA,QAC5G;AACA,sBAAc,SAAS,EAAE,MAAM,QAAQ,GAAG,QAAQ,UAAU,CAAC;AAC7D,YAAI,OAAO,OAAO;AAAA,MACpB,OAAO;AACL,cAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,sBAAc,MAAM;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,IAAIA,cAAa,QAAQ,aAAa,OAAO,QAAQ,cAAc,WAAY,QAAQ,UAAsC,QAAQ,QAAW,CAAC;AAAA,UACjJ;AAAA,UACA;AAAA,UACA,GAAG;AAAA,UACH;AAAA,QACF,CAAC;AACD,YAAI,OAAO,IAAI;AAAA,MACjB;AAAA,IACF,WAAW,SAAS,WAAW;AAC7B,YAAM,UAAU,SAAS,gBAAgB,QAAQ,SAAS;AAC1D,oBAAc,SAAS;AAAA,QACrB,IAAI,IAAI,QAAQ;AAAA,QAChB,IAAI,IAAI,SAAS;AAAA,QACjB,IAAI,KAAK,IAAI,QAAQ,CAAC;AAAA,QACtB,IAAI,KAAK,IAAI,SAAS,CAAC;AAAA,QACvB;AAAA,QACA;AAAA,QACA,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AACD,UAAI,OAAO,OAAO;AAAA,IACpB,WAAW,SAAS,UAAU,SAAS,SAAS;AAC9C,YAAM,SAAS,iBAAiB,SAAS,GAAG,GAAG,OAAO,MAAM;AAC5D,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,WAAW,SAAS,gBAAgB,QAAQ,UAAU;AAC5D,sBAAc,UAAU;AAAA,UACtB,QAAQ,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,EAAE,KAAK,GAAG;AAAA,UAC/D,MAAM;AAAA,UACN;AAAA,UACA,GAAG;AAAA,UACH;AAAA,QACF,CAAC;AACD,YAAI,OAAO,QAAQ;AACnB,mCAA2B,KAAK,SAAS,QAAQ,MAAM;AAAA,MACzD,OAAO;AACL,cAAM,QAAQ,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE;AAClC,cAAM,MAAM,OAAO,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,IAAI,OAAO,GAAG,IAAI,OAAO;AACvE,cAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,sBAAc,MAAM;AAAA,UAClB,IAAI,MAAM;AAAA,UACV,IAAI,MAAM;AAAA,UACV,IAAI,IAAI;AAAA,UACR,IAAI,IAAI;AAAA,UACR;AAAA,UACA,GAAG;AAAA,UACH;AAAA,QACF,CAAC;AACD,YAAI,OAAO,IAAI;AACf,mCAA2B,KAAK,SAAS,CAAC,OAAO,GAAG,GAAG,MAAM;AAAA,MAC/D;AAAA,IACF,WAAW,SAAS,YAAY;AAC9B,YAAM,OAAO,6BAA6B,SAAS,GAAG,CAAC;AACvD,UAAI,MAAM;AACR,sBAAc,MAAM,EAAE,MAAM,QAAQ,QAAQ,GAAG,QAAQ,UAAU,CAAC;AAClE,YAAI,OAAO,IAAI;AAAA,MACjB;AAAA,IACF,WAAW,SAAS,QAAQ;AAC1B,YAAM,WAAWA,cAAa,QAAQ,UAAU,EAAE;AAClD,YAAM,QAAQ,OAAO,QAAQ,QAAQ,EAAE,EAAE,MAAM,OAAO;AACtD,YAAM,YAAY,OAAO,QAAQ,aAAa,MAAM;AACpD,YAAM,gBAAgB,OAAO,QAAQ,iBAAiB,KAAK;AAC3D,YAAM,SAAS,cAAc,WAAW,WAAW,cAAc,UAAU,QAAQ;AACnF,YAAM,QAAQ,cAAc,WAAW,IAAI,QAAQ,IAAI,cAAc,UAAU,IAAI,QAAQ;AAC3F,YAAM,QACJ,kBAAkB,WACd,IAAI,SAAS,KAAM,MAAM,SAAS,KAAK,WAAW,OAAQ,IAC1D,kBAAkB,WAChB,IAAI,UAAU,MAAM,SAAS,KAAK,WAAW,OAC7C,IAAI;AACZ,6BAAuB,KAAK,OAAO,QAAQ,QAAQ,EAAE,GAAG,OAAO,OAAO,QAAQ;AAAA,QAC5E;AAAA,QACA,YAAY,OAAO,QAAQ,cAAc,6CAA6C;AAAA,QACtF;AAAA,QACA,kBAAkB,kBAAkB,WAAW,WAAW;AAAA,QAC1D,SAAS,OAAO;AAAA,QAChB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,UAAQ,OAAO,GAAG;AAClB,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,sBACP,KACA,SACA,OACA,GACA,GACA,OACA,QACA,QACA,WACM;AACN,QAAM,SAAS,OAAO,QAAQ,UAAU,EAAE;AAC1C,QAAM,OAAO,SAAS,MAAM,MAAM,IAAI;AACtC,QAAM,UAAU,MAAM,WAAW;AACjC,MAAI,6BAA6B,OAAO,GAAG;AACzC,UAAM,QAAQ,SAAS,gBAAgB,QAAQ,OAAO;AACtD,kBAAc,OAAO;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,qBAAqB;AAAA,MACrB,SAAS,OAAO;AAAA,MAChB;AAAA,IACF,CAAC;AACD,QAAI,OAAO,KAAK;AAChB;AAAA,EACF;AAEA,QAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,gBAAc,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,SAAS,OAAO;AAAA,IAChB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,IAAI;AACf,yBAAuB,KAAK,SAAS;AAAA,EAAU,MAAM,KAAK,SAAS,IAAI,QAAQ,GAAG,IAAI,SAAS,IAAI,GAAG,WAAW;AAAA,IAC/G,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACH;AAEA,SAAS,2BACP,KACA,SACA,GACA,GACA,OACA,QACA,QACA,WACM;AACN,QAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,gBAAc,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,SAAS,OAAO;AAAA,IAChB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,IAAI;AACf,QAAM,OAAO,OAAO,QAAQ,QAAQ,QAAQ,OAAO,kBAAkB;AACrE,yBAAuB,KAAK;AAAA,EAAU,YAAY,MAAM,EAAE,CAAC,IAAI,IAAI,QAAQ,GAAG,IAAI,SAAS,IAAI,IAAI,WAAW;AAAA,IAC5G,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACH;AAEA,SAAS,uBACP,KACA,MACA,GACA,GACA,MACA,UAOI,CAAC,GACW;AAChB,QAAM,WAAW,SAAS,gBAAgB,QAAQ,MAAM;AACxD,gBAAc,UAAU;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,QAAQ,YAAY;AAAA,IACjC,eAAe,QAAQ,cAAc;AAAA,IACrC,eAAe,QAAQ;AAAA,IACvB,qBAAqB,QAAQ;AAAA,IAC7B,SAAS,QAAQ;AAAA,IACjB,WAAW,QAAQ;AAAA,EACrB,CAAC;AACD,aAAW,CAAC,OAAO,IAAI,KAAK,KAAK,MAAM,OAAO,EAAE,QAAQ,GAAG;AACzD,UAAM,OAAO,SAAS,gBAAgB,QAAQ,OAAO;AACrD,SAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,SAAK,aAAa,MAAM,UAAU,IAAI,MAAM,QAAQ;AACpD,SAAK,cAAc;AACnB,aAAS,OAAO,IAAI;AAAA,EACtB;AACA,MAAI,OAAO,QAAQ;AACnB,SAAO;AACT;AAEA,SAAS,6BAA6B,OAAwB;AAC5D,SAAO,mDAAmD,KAAK,KAAK;AACtE;AAEA,SAAS,YAAY,OAAe,WAA2B;AAC7D,SAAO,MAAM,SAAS,YAAY,GAAG,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ;AACzF;AAEA,SAAS,wBAAwB,UAAkD;AACjF,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,SAAS,IAAI,CAAC,YAAY;AACvC,UAAM,IAAIA,cAAa,QAAQ,GAAG,CAAC;AACnC,UAAM,IAAIA,cAAa,QAAQ,GAAG,CAAC;AACnC,UAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,OAAO,IAAI,CAAC,UAAU,eAAe,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC;AACvH,UAAM,QAAQ,KAAK,IAAI,GAAGA,cAAa,QAAQ,OAAO,KAAK,IAAI,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC;AACtG,UAAM,SAAS,KAAK,IAAI,GAAGA,cAAa,QAAQ,QAAQ,KAAK,IAAI,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC;AACxG,WAAO,EAAE,GAAG,GAAG,OAAO,OAAO;AAAA,EAC/B,CAAC;AACD,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,IAAI;AAC3D,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,IAAI;AAC3D,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,KAAK,CAAC,IAAI;AACzE,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,MAAM,CAAC,IAAI;AAC1E,SAAO,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,KAAK,OAAO,IAAI,CAAC;AACpF;AAEA,SAAS,yBAAyB,SAAmE;AACnG,QAAM,cAAcA,cAAa,QAAQ,aAAa,GAAG;AACzD,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,cAAa,QAAQ,SAAS,GAAG,IAAI,GAAG,CAAC;AACjF,QAAM,QAAQ,OAAO,QAAQ,eAAe,OAAO;AACnD,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,oBAAoB,UAAU,WAAW,GAAG,cAAc,CAAC,IAAI,cAAc,CAAC,KAAK,UAAU,WAAW,GAAG,WAAW,IAAI,cAAc,CAAC,KAAK;AAAA,IAC9I;AAAA,EACF;AACF;AAEA,SAAS,eACP,KACA,MACA,SACA,QACQ;AACR,QAAM,QAAQ,OAAO,QAAQ,mBAAmB,aAAa;AAC7D,MAAI,CAAC,SAAS,UAAU,eAAe;AACrC,WAAO;AAAA,EACT;AACA,QAAM,YAAY,OAAO,QAAQ,aAAa,OAAO;AACrD,MAAI,cAAc,SAAS;AACzB,WAAO;AAAA,EACT;AACA,QAAM,KAAK,kBAAkB,SAAS,IAAI,KAAK,SAAS,MAAM;AAC9D,QAAM,UAAU,SAAS,gBAAgB,QAAQ,SAAS;AAC1D,gBAAc,SAAS;AAAA,IACrB;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,aAAa,SAAS,gBAAgB,QAAQ,MAAM;AAC1D,gBAAc,YAAY,EAAE,OAAO,IAAI,QAAQ,IAAI,MAAM,OAAO,SAAS,KAAK,CAAC;AAC/E,UAAQ,OAAO,UAAU;AACzB,MAAI,cAAc,eAAe;AAC/B,YAAQ,OAAO,kBAAkB,KAAK,iBAAiB,MAAM,CAAC;AAC9D,YAAQ,OAAO,kBAAkB,KAAK,iBAAiB,MAAM,CAAC;AAAA,EAChE,WAAW,cAAc,QAAQ;AAC/B,UAAM,MAAM,SAAS,gBAAgB,QAAQ,QAAQ;AACrD,kBAAc,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,KAAK,MAAM,QAAQ,SAAS,KAAK,CAAC;AACxE,YAAQ,OAAO,GAAG;AAAA,EACpB,OAAO;AACL,YAAQ,OAAO,kBAAkB,KAAK,iBAAiB,MAAM,CAAC;AAAA,EAChE;AACA,OAAK,OAAO,OAAO;AACnB,SAAO,QAAQ,EAAE;AACnB;AAEA,SAAS,kBAAkB,KAAoB,GAAW,QAAgC;AACxF,QAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,gBAAc,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,SAAS;AAAA,EACX,CAAC;AACD,SAAO;AACT;AAEA,SAAS,oBACP,SACA,GACA,GACA,OACA,QACQ;AACR,QAAM,QAAQA,cAAa,QAAQ,OAAO,CAAC;AAC3C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,SAAO,UAAW,QAAQ,MAAO,KAAK,EAAE,IAAI,IAAI,QAAQ,CAAC,IAAI,IAAI,SAAS,CAAC;AAC7E;AAEA,SAAS,iBACP,SACA,GACA,GACA,OACA,QACiC;AACjC,MAAI,CAAC,MAAM,QAAQ,QAAQ,MAAM,GAAG;AAClC,WAAO;AAAA,MACL,EAAE,GAAG,EAAE;AAAA,MACP,EAAE,GAAG,IAAI,OAAO,GAAG,IAAI,OAAO;AAAA,IAChC;AAAA,EACF;AACA,SAAO,QAAQ,OAAO,IAAI,CAAC,UAAU;AACnC,UAAM,SAAS,eAAe,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACnD,WAAO,EAAE,GAAG,IAAI,OAAO,GAAG,GAAG,IAAI,OAAO,EAAE;AAAA,EAC5C,CAAC;AACH;AAEA,SAAS,6BAA6B,SAAkC,GAAW,GAAkC;AACnH,QAAM,SAAS,iBAAiB,SAAS,GAAG,GAAG,GAAG,CAAC;AACnD,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO;AAAA,EACT;AACA,QAAM,OAAO,SAAS,gBAAgB,8BAA8B,MAAM;AAC1E,OAAK;AAAA,IACH;AAAA,IACA,OACG,IAAI,CAAC,OAAO,UAAU,GAAG,UAAU,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,EACxE,KAAK,GAAG;AAAA,EACb;AACA,SAAO;AACT;AAEA,SAAS,2BACP,KACA,SACA,QACA,QACM;AACN,MAAI,OAAO,QAAQ,QAAQ,EAAE,MAAM,WAAW,OAAO,SAAS,GAAG;AAC/D;AAAA,EACF;AACA,QAAM,YAAY,OAAO,QAAQ,kBAAkB,EAAE;AACrD,QAAM,UAAU,OAAO,QAAQ,gBAAgB,OAAO;AACtD,MAAI,aAAa,cAAc,QAAQ;AACrC,oBAAgB,KAAK,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,QAAQ,SAAS;AAAA,EAC5F;AACA,MAAI,WAAW,YAAY,QAAQ;AACjC,UAAM,WAAW,OAAO,OAAO,SAAS,CAAC;AACzC,UAAM,MAAM,OAAO,OAAO,SAAS,CAAC;AACpC,oBAAgB,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,QAAQ,OAAO;AAAA,EAC5E;AACF;AAEA,SAAS,cAAc,SAAqB,YAA+D;AACzG,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,QAAI,UAAU,UAAa,UAAU,IAAI;AACvC;AAAA,IACF;AACA,YAAQ,aAAa,KAAK,OAAO,KAAK,CAAC;AAAA,EACzC;AACF;AAMA,SAAS,aAAa,OAAoB,MAAoB;AAC5D,QAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,QAAM,SAAS,oBAAoB,IAAI;AACvC,QAAM,UAAU,cAAc,mCAAe,OAAO,MAAM,SAAS;AACnE,UAAQ,OAAO,qBAAqB,OAAO,IAAI,iBAAiB,CAAC,CAAC;AAClE,QAAM,MAAM,SAAS,gBAAgB,8BAA8B,KAAK;AACxE,MAAI,aAAa,SAAS,eAAe;AACzC,MAAI,aAAa,WAAW,oBAAoB,MAAM,CAAC;AAEvD,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,QAAQ,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC/D,UAAM,aAAa,KAAK,IAAI;AAC5B,UAAM,aAAa,KAAK,IAAI;AAC5B,UAAM,aAAa,QAAQ,SAAS;AACpC,UAAM,cAAc;AACpB,QAAI,OAAO,KAAK;AAAA,EAClB,OAAO;AACL,eAAW,SAAS,QAAQ;AAC1B,wBAAkB,KAAK,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,UAAQ,OAAO,GAAG;AAClB,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,oBAAoB,MAA8B;AACzD,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO,CAAC;AAAA,EACV;AACA,QAAM,SAAS;AACf,QAAM,aAAwB,CAAC;AAC/B,MAAI,MAAM,QAAQ,OAAO,OAAO,GAAG;AACjC,eAAW,KAAK,GAAG,OAAO,OAAO;AAAA,EACnC;AACA,MAAI,MAAM,QAAQ,OAAO,MAAM,GAAG;AAChC,eAAW,KAAK,GAAG,OAAO,MAAM;AAAA,EAClC;AACA,MAAI,OAAO,SAAS,OAAO,OAAO,UAAU,UAAU;AACpD,eAAW,KAAK,GAAG,OAAO,OAAO,OAAO,KAAgC,CAAC;AAAA,EAC3E;AACA,MAAI,OAAO,YAAY,OAAO,OAAO,aAAa,UAAU;AAC1D,UAAM,iBAAiB,OAAO;AAC9B,QAAI,MAAM,QAAQ,eAAe,MAAM,GAAG;AACxC,iBAAW,KAAK,GAAG,eAAe,MAAM;AAAA,IAC1C;AAAA,EACF;AAEA,SAAO,WAAW,OAAO,CAAC,SAA8B;AACtD,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,aAAO;AAAA,IACT;AACA,UAAM,SAAS;AACf,WAAO,OAAO,aAAa,WAAW,OAAO,OAAO,MAAM,EAAE,EAAE,WAAW,QAAQ;AAAA,EACnF,CAAC;AACH;AAEA,SAAS,kBAAkB,KAAoB,OAA0B;AACvE,QAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,QAAM,OAAO,OAAO,MAAM,QAAQ,MAAM,QAAQ,EAAE;AAClD,QAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,QAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,QAAM,QAAQ,KAAK,IAAI,GAAGA,cAAa,MAAM,GAAGA,cAAa,MAAM,OAAO,GAAG,CAAC,CAAC;AAC/E,QAAM,SAAS,KAAK,IAAI,GAAGA,cAAa,MAAM,GAAGA,cAAa,MAAM,QAAQ,EAAE,CAAC,CAAC;AAChF,QAAM,SAAS,YAAY,OAAO,MAAM,SAAS,MAAM,SAAS,OAAO,CAAC;AACxE,QAAM,OAAO,WAAW,OAAO,MAAM,QAAQ,MAAM,GAAG,MAAM;AAE5D,MAAI,SAAS,SAAS,SAAS,WAAW,SAAS,aAAa;AAC9D,UAAM,MAAM,OAAO,MAAM,QAAQ,SAAS,UAAU,cAAc,YAAY;AAC9E,QAAI,QAAQ,aAAa,QAAQ,QAAQ;AACvC,YAAM,UAAU,SAAS,gBAAgB,IAAI,cAAc,SAAS;AACpE,cAAQ,aAAa,MAAM,OAAO,IAAI,QAAQ,CAAC,CAAC;AAChD,cAAQ,aAAa,MAAM,OAAO,IAAI,SAAS,CAAC,CAAC;AACjD,cAAQ,aAAa,MAAM,OAAO,QAAQ,CAAC,CAAC;AAC5C,cAAQ,aAAa,MAAM,OAAO,SAAS,CAAC,CAAC;AAC7C,cAAQ,aAAa,QAAQ,IAAI;AACjC,cAAQ,aAAa,UAAU,MAAM;AACrC,cAAQ,aAAa,gBAAgB,GAAG;AACxC,UAAI,OAAO,OAAO;AAAA,IACpB,WAAW,QAAQ,WAAW;AAC5B,YAAM,UAAU,SAAS,gBAAgB,IAAI,cAAc,SAAS;AACpE,cAAQ;AAAA,QACN;AAAA,QACA,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,SAAS,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,IAAI,MAAM,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;AAAA,MAC5G;AACA,cAAQ,aAAa,QAAQ,IAAI;AACjC,cAAQ,aAAa,UAAU,MAAM;AACrC,cAAQ,aAAa,gBAAgB,GAAG;AACxC,UAAI,OAAO,OAAO;AAAA,IACpB,WAAW,QAAQ,YAAY;AAC7B,YAAM,UAAU,SAAS,gBAAgB,IAAI,cAAc,SAAS;AACpE,cAAQ,aAAa,UAAU,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE;AACpG,cAAQ,aAAa,QAAQ,IAAI;AACjC,cAAQ,aAAa,UAAU,MAAM;AACrC,cAAQ,aAAa,gBAAgB,GAAG;AACxC,UAAI,OAAO,OAAO;AAAA,IACpB,OAAO;AACL,YAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,WAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,WAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,WAAK,aAAa,SAAS,OAAO,KAAK,CAAC;AACxC,WAAK,aAAa,UAAU,OAAO,MAAM,CAAC;AAC1C,WAAK,aAAa,MAAM,SAAS,UAAU,MAAM,GAAG;AACpD,WAAK,aAAa,QAAQ,IAAI;AAC9B,WAAK,aAAa,UAAU,MAAM;AAClC,WAAK,aAAa,gBAAgB,GAAG;AACrC,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,qBAAiB,KAAK,OAAO,MAAM,QAAQ,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,MAAM;AAAA,EACxE,WAAW,SAAS,UAAU,SAAS,QAAQ;AAC7C,QAAI,SAAS,QAAQ;AACnB,YAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,WAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,WAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,WAAK,aAAa,SAAS,OAAO,KAAK,CAAC;AACxC,WAAK,aAAa,UAAU,OAAO,MAAM,CAAC;AAC1C,WAAK,aAAa,MAAM,GAAG;AAC3B,WAAK,aAAa,QAAQ,YAAY,OAAO,MAAM,SAAS,QAAQ,GAAG,IAAI,CAAC;AAC5E,WAAK,aAAa,UAAU,MAAM;AAClC,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,qBAAiB,KAAK,OAAO,MAAM,QAAQ,EAAE,GAAG,GAAG,IAAI,IAAI,MAAM;AAAA,EACnE,WAAW,SAAS,WAAW,SAAS,QAAQ;AAC9C,qBAAiB,KAAK,OAAO,MAAM;AAAA,EACrC,WAAW,SAAS,QAAQ;AAC1B,qBAAiB,KAAK,OAAO,MAAM;AAAA,EACrC,OAAO;AACL,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,SAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,SAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,SAAK,aAAa,SAAS,OAAO,KAAK,CAAC;AACxC,SAAK,aAAa,UAAU,OAAO,MAAM,CAAC;AAC1C,SAAK,aAAa,QAAQ,aAAa;AACvC,SAAK,aAAa,UAAU,MAAM;AAClC,SAAK,aAAa,oBAAoB,KAAK;AAC3C,QAAI,OAAO,IAAI;AACf,qBAAiB,KAAK,QAAQ,SAAS,IAAI,GAAG,IAAI,IAAI,MAAM;AAAA,EAC9D;AACF;AAEA,SAAS,iBAAiB,KAAoB,OAAoB,QAAsB;AACtF,QAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,QAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,QAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,QAAM,QAAQ,eAAe,MAAM,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACxD,QAAM,MAAM,eAAe,MAAM,KAAK;AAAA,IACpC,GAAGA,cAAa,MAAM,GAAGA,cAAa,MAAM,OAAO,GAAG,CAAC;AAAA,IACvD,GAAGA,cAAa,MAAM,GAAGA,cAAa,MAAM,QAAQ,CAAC,CAAC;AAAA,EACxD,CAAC;AACD,QAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,OAAK,aAAa,MAAM,OAAO,IAAI,MAAM,CAAC,CAAC;AAC3C,OAAK,aAAa,MAAM,OAAO,IAAI,MAAM,CAAC,CAAC;AAC3C,OAAK,aAAa,MAAM,OAAO,IAAI,IAAI,CAAC,CAAC;AACzC,OAAK,aAAa,MAAM,OAAO,IAAI,IAAI,CAAC,CAAC;AACzC,OAAK,aAAa,UAAU,MAAM;AAClC,OAAK,aAAa,gBAAgB,GAAG;AACrC,OAAK,aAAa,kBAAkB,OAAO;AAC3C,MAAI,OAAO,IAAI;AACf,MAAI,OAAO,MAAM,QAAQ,EAAE,MAAM,SAAS;AACxC,oBAAgB,KAAK,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,MAAM;AAAA,EAC7E;AACF;AAEA,SAAS,iBAAiB,KAAoB,OAAoB,QAAsB;AACtF,QAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,QAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,QAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,QAAM,SAAS,wBAAwB,MAAM,QAAQ;AACrD,MAAI,OAAO,SAAS,GAAG;AACrB;AAAA,EACF;AACA,QAAM,WAAW,SAAS,gBAAgB,IAAI,cAAc,UAAU;AACtE,WAAS,aAAa,UAAU,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AAChG,WAAS,aAAa,QAAQ,MAAM;AACpC,WAAS,aAAa,UAAU,MAAM;AACtC,WAAS,aAAa,gBAAgB,GAAG;AACzC,WAAS,aAAa,kBAAkB,OAAO;AAC/C,WAAS,aAAa,mBAAmB,OAAO;AAChD,MAAI,OAAO,QAAQ;AACrB;AAEA,SAAS,iBAAiB,KAAoB,MAAc,GAAW,GAAW,MAAoB;AACpG,MAAI,CAAC,KAAK,KAAK,GAAG;AAChB;AAAA,EACF;AACA,QAAM,WAAW,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAClE,WAAS,aAAa,KAAK,OAAO,CAAC,CAAC;AACpC,WAAS,aAAa,KAAK,OAAO,CAAC,CAAC;AACpC,WAAS,aAAa,QAAQ,IAAI;AAClC,WAAS,aAAa,aAAa,IAAI;AACvC,WAAS,aAAa,eAAe,6CAA6C;AAClF,aAAW,CAAC,OAAO,IAAI,KAAK,KAAK,MAAM,OAAO,EAAE,QAAQ,GAAG;AACzD,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,OAAO;AAC/D,SAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,SAAK,aAAa,MAAM,UAAU,IAAI,MAAM,OAAO;AACnD,SAAK,cAAc;AACnB,aAAS,OAAO,IAAI;AAAA,EACtB;AACA,MAAI,OAAO,QAAQ;AACrB;AAEA,SAAS,gBACP,KACA,IACA,IACA,IACA,IACA,MACA,OAAO,SACD;AACN,QAAM,QAAQ,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE;AACzC,QAAM,OAAO;AACb,MAAI,SAAS,OAAO;AAClB,UAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,UAAM,KAAK,KAAK,IAAI,KAAK,IAAI,OAAO;AACpC,UAAM,KAAK,KAAK,IAAI,KAAK,IAAI,OAAO;AACpC,kBAAc,MAAM;AAAA,MAClB,IAAI,KAAK;AAAA,MACT,IAAI,KAAK;AAAA,MACT,IAAI,KAAK;AAAA,MACT,IAAI,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,IACpB,CAAC;AACD,QAAI,OAAO,IAAI;AACf;AAAA,EACF;AACA,MAAI,SAAS,SAAS,SAAS,UAAU;AACvC,UAAM,SAAS,SAAS,gBAAgB,QAAQ,QAAQ;AACxD,kBAAc,QAAQ,EAAE,IAAI,IAAI,IAAI,IAAI,GAAG,OAAO,MAAM,KAAK,CAAC;AAC9D,QAAI,OAAO,MAAM;AACjB;AAAA,EACF;AACA,QAAM,SAAS;AAAA,IACb,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,KAAK,OAAO,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,GAAG,KAAK,OAAO,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,CAAC;AAAA,IACrF,CAAC,KAAK,OAAO,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,GAAG,KAAK,OAAO,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,CAAC;AAAA,EACvF;AACA,QAAM,UAAU,SAAS,gBAAgB,IAAI,cAAc,SAAS;AACpE,UAAQ,aAAa,UAAU,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;AAC/E,UAAQ,aAAa,QAAQ,SAAS,sBAAsB,SAAS,kBAAkB,gBAAgB,IAAI;AAC3G,UAAQ,aAAa,UAAU,IAAI;AACnC,MAAI,OAAO,OAAO;AACpB;AAEA,SAAS,oBAAoB,QAA+B;AAC1D,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,OAAO,IAAI,CAAC,UAAU;AACnC,UAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,UAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,UAAM,IAAIA,cAAa,MAAM,GAAG,CAAC;AACjC,UAAM,QAAQ,KAAK,IAAI,GAAGA,cAAa,MAAM,GAAGA,cAAa,MAAM,OAAO,GAAG,CAAC,CAAC;AAC/E,UAAM,SAAS,KAAK,IAAI,GAAGA,cAAa,MAAM,GAAGA,cAAa,MAAM,QAAQ,EAAE,CAAC,CAAC;AAChF,WAAO,EAAE,GAAG,GAAG,OAAO,OAAO;AAAA,EAC/B,CAAC;AACD,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,IAAI;AAC3D,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,IAAI;AAC3D,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,KAAK,CAAC,IAAI;AACzE,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,MAAM,CAAC,IAAI;AAC1E,SAAO,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,KAAK,OAAO,IAAI,CAAC;AACpF;AAEA,SAAS,wBAAwB,OAAiD;AAChF,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,MAAM,QAAQ,CAAC,YAAY;AAChC,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,aAAO,CAAC;AAAA,IACV;AACA,UAAM,SAAU,QAAoC;AACpD,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,CAAC;AAAA,IACV;AACA,WAAO,OAAO,IAAI,CAAC,UAAU,eAAe,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;AAAA,EACpE,CAAC;AACH;AAEA,SAAS,eAAe,OAAgB,UAA8D;AACpG,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO;AAAA,MACL,GAAGA,cAAa,MAAM,CAAC,GAAG,SAAS,CAAC;AAAA,MACpC,GAAGA,cAAa,MAAM,CAAC,GAAG,SAAS,CAAC;AAAA,IACtC;AAAA,EACF;AACA,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ;AACd,SAAO;AAAA,IACL,GAAGA,cAAa,MAAM,GAAG,SAAS,CAAC;AAAA,IACnC,GAAGA,cAAa,MAAM,GAAG,SAAS,CAAC;AAAA,EACrC;AACF;AAEA,SAASA,cAAa,OAAgB,UAA0B;AAC9D,QAAM,SAAS,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC/D,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,WAAW,MAAc,QAAwB;AACxD,SAAO,SAAS,WAAW,SAAS,UAAU,SAAS,YAAY,YAAY,QAAQ,IAAI,IAAI;AACjG;AAEA,SAAS,YAAY,OAAe,QAAQ,GAAW;AACrD,QAAM,SAAmD;AAAA,IACvD,OAAO,CAAC,IAAI,IAAI,EAAE;AAAA,IAClB,MAAM,CAAC,KAAK,KAAK,GAAG;AAAA,IACpB,OAAO,CAAC,KAAK,KAAK,GAAG;AAAA,IACrB,KAAK,CAAC,KAAK,IAAI,EAAE;AAAA,IACjB,QAAQ,CAAC,KAAK,IAAI,EAAE;AAAA,IACpB,QAAQ,CAAC,KAAK,KAAK,CAAC;AAAA,IACpB,OAAO,CAAC,IAAI,KAAK,EAAE;AAAA,IACnB,MAAM,CAAC,IAAI,IAAI,GAAG;AAAA,IAClB,QAAQ,CAAC,KAAK,IAAI,GAAG;AAAA,IACrB,QAAQ,CAAC,KAAK,IAAI,GAAG;AAAA,IACrB,MAAM,CAAC,KAAK,IAAI,GAAG;AAAA,EACrB;AACA,MAAI,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,KAAK,GAAG;AACpD,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO,KAAK,KAAK,OAAO;AACtC,SAAO,SAAS,IAAI,OAAO,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,MAAM,KAAK,GAAG,CAAC,MAAM,KAAK;AACnF;AAEA,SAAS,aAAa,OAAoB,MAAoB;AAC5D,QAAM,WAAW,sBAAsB,IAAI;AAC3C,MAAI,SAAS,WAAW,GAAG;AACzB,qBAAiB,OAAO,WAAW,IAAI;AACvC;AAAA,EACF;AAEA,aAAW,CAAC,OAAO,OAAO,KAAK,SAAS,QAAQ,GAAG;AACjD,UAAM,UAAU,cAAc,oCAAgB,QAAQ,CAAC,EAAE;AACzD,UAAM,SAAS,kBAAkB,OAAO;AACxC,QAAI,OAAO,SAAS,GAAG;AACrB,cAAQ,OAAO,qBAAqB,OAAO,IAAI,iBAAiB,CAAC,CAAC;AAClE,YAAM,MAAM,SAAS,gBAAgB,QAAQ,KAAK;AAClD,UAAI,aAAa,SAAS,eAAe;AACzC,UAAI,aAAa,WAAW,oBAAoB,MAAM,CAAC;AACvD,iBAAW,SAAS,QAAQ;AAC1B,0BAAkB,KAAK,KAAK;AAAA,MAC9B;AACA,cAAQ,OAAO,GAAG;AAAA,IACpB;AAEA,UAAM,UAAU,SAAS,cAAc,SAAS;AAChD,YAAQ,YAAY;AACpB,UAAM,UAAU,SAAS,cAAc,SAAS;AAChD,YAAQ,cAAc,OAAO,SAAS,IAAI,sCAAa,OAAO,MAAM,iBAAY;AAChF,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,YAAY;AAChB,QAAI,cAAc,QAAQ,MAAM,GAAG,GAAK;AACxC,YAAQ,OAAO,SAAS,GAAG;AAC3B,YAAQ,OAAO,OAAO;AACtB,UAAM,OAAO,OAAO;AAAA,EACtB;AACF;AAiBA,SAAS,sBAAsB,MAAwB;AACrD,QAAM,UAAU,CAAC,GAAG,KAAK,SAAS,sCAAsC,CAAC,EAAE,IAAI,CAAC,UAAU,oBAAoB,MAAM,CAAC,KAAK,EAAE,CAAC;AAC7H,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO;AAAA,EACT;AACA,SAAO,KAAK,SAAS,eAAe,IAAI,CAAC,IAAI,IAAI,CAAC;AACpD;AAEA,SAAS,kBAAkB,KAA4B;AACrD,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,iBAAiB;AAClE,MAAI,IAAI,cAAc,aAAa,GAAG;AACpC,WAAO,CAAC;AAAA,EACV;AACA,SAAO,MAAM,KAAK,IAAI,iBAAiB,QAAQ,CAAC,EAAE,QAAQ,CAAC,SAAS;AAClE,UAAM,WAAW,MAAM,KAAK,KAAK,QAAQ,EAAE,KAAK,CAAC,UAAU,MAAM,cAAc,YAAY;AAC3F,UAAM,SAAS,KAAK,aAAa,QAAQ,MAAM;AAC/C,UAAM,OAAO,KAAK,aAAa,MAAM,MAAM;AAC3C,QAAI,CAAC,UAAU,CAAC,MAAM;AACpB,aAAO,CAAC;AAAA,IACV;AACA,UAAM,QAAqB;AAAA,MACzB,IAAI,KAAK,aAAa,IAAI,KAAK;AAAA,MAC/B,OAAO,cAAc,KAAK,aAAa,OAAO,KAAK,EAAE;AAAA,MACrD,OAAO,iBAAiB,KAAK,aAAa,OAAO,KAAK,EAAE;AAAA,MACxD;AAAA,MACA;AAAA,MACA,GAAGA,cAAa,UAAU,aAAa,GAAG,GAAG,CAAC;AAAA,MAC9C,GAAGA,cAAa,UAAU,aAAa,GAAG,GAAG,CAAC;AAAA,MAC9C,OAAO,KAAK,IAAI,GAAGA,cAAa,UAAU,aAAa,OAAO,GAAG,GAAG,CAAC;AAAA,MACrE,QAAQ,KAAK,IAAI,GAAGA,cAAa,UAAU,aAAa,QAAQ,GAAG,OAAO,IAAI,EAAE,CAAC;AAAA,MACjF,QAAQ,KAAK,aAAa,QAAQ,KAAK;AAAA,MACvC,QAAQ,KAAK,aAAa,QAAQ,KAAK;AAAA,IACzC;AAEA,QAAI,QAAQ,UAAU;AACpB,YAAM,SAAS,MAAM,KAAK,SAAS,QAAQ,EACxC,OAAO,CAAC,UAAU,MAAM,cAAc,SAAS,EAC/C,IAAI,CAAC,WAAW;AAAA,QACf,GAAGA,cAAa,MAAM,aAAa,GAAG,GAAG,CAAC;AAAA,QAC1C,GAAGA,cAAa,MAAM,aAAa,GAAG,GAAG,CAAC;AAAA,MAC5C,EAAE;AACJ,UAAI,OAAO,UAAU,GAAG;AACtB,cAAM,IAAI,OAAO,CAAC,EAAE;AACpB,cAAM,IAAI,OAAO,CAAC,EAAE;AACpB,cAAM,QAAQ,OAAO,OAAO,SAAS,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE;AACtD,cAAM,SAAS,OAAO,OAAO,SAAS,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE;AACvD,cAAM,SAAS;AAAA,MACjB;AAAA,IACF;AACA,WAAO,CAAC,KAAK;AAAA,EACf,CAAC;AACH;AAEA,SAAS,iBAAiB,OAAuC;AAC/D,QAAM,SAAiC,CAAC;AACxC,QAAM,aAAa,MAAM,MAAM,gDAAgD;AAC/E,QAAM,iBAAiB,aAAa,MAAM,QAAQ,WAAW,CAAC,GAAG,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,yBAAyB,qBAAqB,IAAI;AACnJ,aAAW,QAAQ,eAAe,MAAM,GAAG,GAAG;AAC5C,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,UAAM,YAAY,KAAK,QAAQ,GAAG;AAClC,UAAM,MAAM,aAAa,IAAI,KAAK,MAAM,GAAG,SAAS,IAAI;AACxD,UAAM,QAAQ,aAAa,IAAI,KAAK,MAAM,YAAY,CAAC,IAAI;AAC3D,QAAI,KAAK;AACP,aAAO,GAAG,IAAI,UAAU,mBAAmB,aAAa,WAAW,CAAC,IAAI;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,QAA+B;AAC1D,QAAM,SAAS,OAAO,IAAI,CAAC,WAAW;AAAA,IACpC,GAAG,KAAK,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,KAAK;AAAA,IAC1C,GAAG,KAAK,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,MAAM;AAAA,IAC3C,OAAO,KAAK,IAAI,MAAM,KAAK;AAAA,IAC3B,QAAQ,KAAK,IAAI,MAAM,MAAM;AAAA,EAC/B,EAAE;AACF,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,IAAI;AAC3D,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,IAAI;AAC3D,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,KAAK,CAAC,IAAI;AACzE,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,MAAM,CAAC,IAAI;AAC1E,SAAO,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,KAAK,OAAO,IAAI,CAAC;AACpF;AAEA,SAAS,kBAAkB,KAAoB,OAA0B;AACvE,QAAM,SAAS,YAAY,MAAM,MAAM,aAAa,SAAS;AAC7D,QAAM,OAAO,MAAM,MAAM,cAAc,SAAS,gBAAgB,YAAY,MAAM,MAAM,WAAW,SAAS;AAC5G,QAAM,cAAcA,cAAa,MAAM,MAAM,aAAa,GAAG;AAC7D,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,cAAa,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;AACrF,QAAM,cAAc,kBAAkB,MAAM,OAAO,WAAW;AAC9D,QAAM,YAAY,gBAAgB,KAAK;AAEvC,MAAI,MAAM,MAAM;AACd,UAAM,SAAS,MAAM,UAAU;AAAA,MAC7B,EAAE,GAAG,MAAM,GAAG,GAAG,MAAM,EAAE;AAAA,MACzB,EAAE,GAAG,MAAM,IAAI,MAAM,OAAO,GAAG,MAAM,IAAI,MAAM,OAAO;AAAA,IACxD;AACA,QAAI,OAAO,SAAS,GAAG;AACrB,YAAM,WAAW,SAAS,gBAAgB,QAAQ,UAAU;AAC5D,oBAAc,UAAU;AAAA,QACtB,QAAQ,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,EAAE,KAAK,GAAG;AAAA,QAC/D,MAAM;AAAA,QACN;AAAA,QACA,GAAG;AAAA,QACH,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB;AAAA,MACF,CAAC;AACD,UAAI,OAAO,QAAQ;AAAA,IACrB,OAAO;AACL,YAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,oBAAc,MAAM;AAAA,QAClB,IAAI,OAAO,CAAC,EAAE;AAAA,QACd,IAAI,OAAO,CAAC,EAAE;AAAA,QACd,IAAI,OAAO,CAAC,EAAE;AAAA,QACd,IAAI,OAAO,CAAC,EAAE;AAAA,QACd;AAAA,QACA,GAAG;AAAA,QACH,kBAAkB;AAAA,QAClB;AAAA,MACF,CAAC;AACD,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,QAAI,MAAM,MAAM,YAAY,MAAM,MAAM,aAAa,QAAQ;AAC3D,YAAM,OAAO,OAAO,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,CAAC;AAClD,YAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,sBAAgB,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM;AAAA,IAC7D;AACA;AAAA,EACF;AAEA,QAAM,YAAY,gBAAgB,MAAM,KAAK;AAC7C,MAAI,cAAc,SAAS;AACzB,sBAAkB,KAAK,OAAO,SAAS,SAAS;AAAA,EAClD,WAAW,cAAc,WAAW;AAClC,UAAM,UAAU,SAAS,gBAAgB,QAAQ,SAAS;AAC1D,kBAAc,SAAS;AAAA,MACrB,IAAI,MAAM,IAAI,MAAM,QAAQ;AAAA,MAC5B,IAAI,MAAM,IAAI,MAAM,SAAS;AAAA,MAC7B,IAAI,MAAM,QAAQ;AAAA,MAClB,IAAI,MAAM,SAAS;AAAA,MACnB;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,OAAO;AAAA,EACpB,WAAW,cAAc,aAAa,cAAc,WAAW;AAC7D,UAAM,UAAU,SAAS,gBAAgB,QAAQ,SAAS;AAC1D,kBAAc,SAAS;AAAA,MACrB,QAAQ,GAAG,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,MAAM,IAAI,MAAM,SAAS,CAAC,IAAI,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,SAAS,CAAC;AAAA,MACtM;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,OAAO;AAAA,EACpB,WAAW,cAAc,aAAa,cAAc,WAAW;AAC7D,UAAM,UAAU,SAAS,gBAAgB,QAAQ,SAAS;AAC1D,UAAM,QAAQ,cAAc,YAAY,MAAM,QAAQ,OAAO,MAAM,QAAQ;AAC3E,kBAAc,SAAS;AAAA,MACrB,QACE,cAAc,YACV,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,MAAM,IAAI,MAAM,SAAS,CAAC,IAAI,MAAM,IAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,MAAM,KACxN,GAAG,MAAM,IAAI,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,MAAM,IAAI,MAAM,SAAS,CAAC,IAAI,MAAM,IAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,SAAS,CAAC;AAAA,MACvR;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,OAAO;AAAA,EACpB,WAAW,cAAc,YAAY;AACnC,UAAM,UAAU,SAAS,gBAAgB,QAAQ,SAAS;AAC1D,kBAAc,SAAS;AAAA,MACrB,QAAQ,GAAG,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,MAAM;AAAA,MACvI;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,OAAO;AAAA,EACpB,WAAW,cAAc,WAAW,cAAc,YAAY;AAC5D,sBAAkB,KAAK,OAAO,QAAQ,aAAa,SAAS,SAAS;AAAA,EACvE,WAAW,cAAc,YAAY;AACnC,UAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,kBAAc,MAAM;AAAA,MAClB,GAAG,yBAAyB,MAAM,GAAG,MAAM,GAAG,MAAM,OAAO,MAAM,MAAM;AAAA,MACvE;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,IAAI;AAAA,EACjB,WAAW,cAAc,YAAY;AACnC,UAAM,QAAQ,SAAS,gBAAgB,QAAQ,GAAG;AAClD,kBAAc,OAAO,EAAE,UAAU,CAAC;AAClC,UAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,kBAAc,MAAM;AAAA,MAClB,GAAG,MAAM;AAAA,MACT,GAAG,MAAM,IAAI,KAAK,IAAI,IAAI,MAAM,SAAS,IAAI,IAAI;AAAA,MACjD,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM,SAAS,KAAK,IAAI,IAAI,MAAM,SAAS,IAAI;AAAA,MACvD;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AACD,UAAM,MAAM,SAAS,gBAAgB,QAAQ,SAAS;AACtD,UAAM,SAAS,SAAS,gBAAgB,QAAQ,SAAS;AACzD,UAAM,YAAY,KAAK,IAAI,IAAI,MAAM,SAAS,IAAI;AAClD,kBAAc,KAAK;AAAA,MACjB,IAAI,MAAM,IAAI,MAAM,QAAQ;AAAA,MAC5B,IAAI,MAAM,IAAI,YAAY;AAAA,MAC1B,IAAI,MAAM,QAAQ;AAAA,MAClB,IAAI,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AACD,kBAAc,QAAQ;AAAA,MACpB,IAAI,MAAM,IAAI,MAAM,QAAQ;AAAA,MAC5B,IAAI,MAAM,IAAI,MAAM,SAAS,YAAY;AAAA,MACzC,IAAI,MAAM,QAAQ;AAAA,MAClB,IAAI,YAAY;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,MACA,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AACD,UAAM,OAAO,MAAM,KAAK,MAAM;AAC9B,QAAI,OAAO,KAAK;AAAA,EAClB,WAAW,cAAc,SAAS;AAChC,UAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,kBAAc,MAAM;AAAA,MAClB,GAAG,sBAAsB,MAAM,GAAG,MAAM,GAAG,MAAM,OAAO,MAAM,MAAM;AAAA,MACpE;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,IAAI;AAAA,EACjB,WAAW,cAAc,YAAY;AACnC,UAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,kBAAc,MAAM;AAAA,MAClB,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,IAAI,MAAM,MAAM,YAAY,MAAM,KAAK,IAAI,IAAI,MAAM,SAAS,CAAC,IAAI;AAAA,MACnE;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,SAAS,SAAS,gBAAgB,QAAQ,MAAM;AACtD,UAAM,eAAe,KAAK,IAAI,MAAM,QAAQA,cAAa,MAAM,MAAM,WAAW,EAAE,CAAC;AACnF,kBAAc,QAAQ;AAAA,MACpB,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,OAAO,MAAM;AAAA,MACb,QAAQ;AAAA,MACR,IAAI,MAAM,MAAM,YAAY,MAAM,KAAK,IAAI,IAAI,eAAe,CAAC,IAAI;AAAA,MACnE,MAAM,YAAY,MAAM,MAAM,qBAAqB,MAAM,MAAM,WAAW,SAAS;AAAA,MACnF;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,MAAM,MAAM;AAAA,EACzB,OAAO;AACL,UAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,kBAAc,MAAM;AAAA,MAClB,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,IAAI,MAAM,MAAM,YAAY,MAAM,KAAK,IAAI,IAAI,MAAM,SAAS,CAAC,IAAI;AAAA,MACnE;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA;AAAA,IACE;AAAA,IACA,MAAM;AAAA,IACN,MAAM,IAAI,MAAM,QAAQ;AAAA,IACxB,MAAM,IAAI,MAAM,SAAS;AAAA,IACzB,YAAY,MAAM,MAAM,WAAW,SAAS;AAAA,IAC5C,MAAM;AAAA,IACN;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAAuC;AAC9D,MAAI,MAAM,OAAO;AACf,WAAO,MAAM;AAAA,EACf;AACA,MAAI,MAAM,OAAO;AACf,WAAO;AAAA,EACT;AACA,MAAI,MAAM,YAAY,KAAK;AACzB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,YAAY,KAAK;AACzB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,aAAa,KAAK;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,KAAK;AACtB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,KAAoB,OAAoB,SAAiB,WAAyB;AAC3G,QAAM,MAAM,MAAM,MAAM,SAAS;AACjC,MAAI,wDAAwD,KAAK,GAAG,GAAG;AACrE,UAAM,QAAQ,SAAS,gBAAgB,QAAQ,OAAO;AACtD,kBAAc,OAAO;AAAA,MACnB,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,MAAM;AAAA,MACN,qBAAqB;AAAA,MACrB;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,KAAK;AAChB;AAAA,EACF;AACA,QAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,gBAAc,MAAM;AAAA,IAClB,GAAG,MAAM;AAAA,IACT,GAAG,MAAM;AAAA,IACT,OAAO,MAAM;AAAA,IACb,QAAQ,MAAM;AAAA,IACd,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,oBAAoB;AAAA,IACpB;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,OAAO,IAAI;AACjB;AAEA,SAAS,kBACP,KACA,OACA,QACA,aACA,SACA,WACM;AACN,QAAM,QAAQ,SAAS,gBAAgB,QAAQ,GAAG;AAClD,gBAAc,OAAO,EAAE,SAAS,UAAU,CAAC;AAC3C,QAAM,KAAK,MAAM,IAAI,MAAM,QAAQ;AACnC,QAAM,aAAa,KAAK,IAAI,MAAM,OAAO,MAAM,MAAM,IAAI;AACzD,QAAM,OAAO,SAAS,gBAAgB,QAAQ,QAAQ;AACtD,gBAAc,MAAM;AAAA,IAClB;AAAA,IACA,IAAI,MAAM,IAAI,aAAa;AAAA,IAC3B,GAAG;AAAA,IACH,MAAM;AAAA,IACN;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AACD,QAAM,OAAO,cAAc,IAAI,MAAM,IAAI,aAAa,KAAK,IAAI,MAAM,IAAI,MAAM,SAAS,MAAM,QAAQ,WAAW;AACjH,QAAM,OAAO,cAAc,MAAM,IAAI,MAAM,QAAQ,MAAM,MAAM,IAAI,MAAM,SAAS,MAAM,MAAM,IAAI,MAAM,QAAQ,MAAM,MAAM,IAAI,MAAM,SAAS,MAAM,QAAQ,WAAW;AACxK,QAAM,UAAU,cAAc,IAAI,MAAM,IAAI,MAAM,SAAS,MAAM,MAAM,IAAI,MAAM,QAAQ,MAAM,MAAM,IAAI,MAAM,QAAQ,QAAQ,WAAW;AAC1I,QAAM,WAAW,cAAc,IAAI,MAAM,IAAI,MAAM,SAAS,MAAM,MAAM,IAAI,MAAM,QAAQ,MAAM,MAAM,IAAI,MAAM,QAAQ,QAAQ,WAAW;AAC3I,QAAM,OAAO,MAAM,MAAM,MAAM,SAAS,QAAQ;AAChD,MAAI,OAAO,KAAK;AAClB;AAEA,SAAS,cACP,IACA,IACA,IACA,IACA,QACA,aACgB;AAChB,QAAM,OAAO,SAAS,gBAAgB,QAAQ,MAAM;AACpD,gBAAc,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH,kBAAkB;AAAA,EACpB,CAAC;AACD,SAAO;AACT;AAEA,SAAS,yBAAyB,GAAW,GAAW,OAAe,QAAwB;AAC7F,QAAM,OAAO,KAAK,IAAI,IAAI,SAAS,IAAI;AACvC,SAAO;AAAA,IACL,KAAK,CAAC,IAAI,CAAC;AAAA,IACX,KAAK,IAAI,KAAK;AAAA,IACd,KAAK,IAAI,SAAS,IAAI;AAAA,IACtB,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,OAAO,CAAC,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,OAAO,GAAG,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,OAAO,GAAG;AAAA,IAC9I,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,SAAS,OAAO,IAAI;AAAA,IAC5H;AAAA,EACF,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,kBAAkB,OAA+B,aAAsD;AAC9G,QAAM,QAAyC;AAAA,IAC7C,gBAAgB;AAAA,EAClB;AACA,MAAI,MAAM,WAAW,KAAK;AACxB,UAAM,kBAAkB,IAAI,MAAM,eAAe,GAAG,cAAc,CAAC,IAAI,cAAc,CAAC;AAAA,EACxF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA4B;AACnD,QAAM,WAAWA,cAAa,MAAM,MAAM,UAAU,CAAC;AACrD,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO,UAAU,QAAQ,IAAI,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,MAAM,IAAI,MAAM,SAAS,CAAC;AACtF;AAEA,SAAS,sBAAsB,GAAW,GAAW,OAAe,QAAwB;AAC1F,QAAM,KAAK,IAAI,QAAQ;AACvB,QAAM,KAAK,IAAI,SAAS;AACxB,SAAO;AAAA,IACL,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI;AAAA,IAC1C,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI;AAAA,IAC9H,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,EAAE,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI;AAAA,IAChH,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,GAAG,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI;AAAA,IAC7H,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,GAAG,KAAK,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI;AAAA,IAC7H;AAAA,EACF,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,iBACP,KACA,MACA,GACA,GACA,MACA,QAAgC,CAAC,GACjC,YAAY,IACN;AACN,MAAI,CAAC,KAAK,KAAK,GAAG;AAChB;AAAA,EACF;AACA,QAAM,QAAQ,qBAAqB,IAAI,EAAE,MAAM,OAAO,EAAE,OAAO,OAAO;AACtE,MAAI,MAAM,WAAW,GAAG;AACtB;AAAA,EACF;AACA,QAAM,WAAW,SAAS,gBAAgB,QAAQ,MAAM;AACxD,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,YAAY,OAAO,SAAS,MAAM,aAAa,KAAK,EAAE;AAC5D,gBAAc,UAAU;AAAA,IACtB,GAAG,UAAU,SAAS,IAAIA,cAAa,MAAM,aAAa,CAAC,IAAI,UAAU,UAAU,IAAIA,cAAa,MAAM,cAAc,CAAC,IAAI;AAAA,IAC7H;AAAA,IACA;AAAA,IACA,aAAaA,cAAa,MAAM,UAAU,EAAE;AAAA,IAC5C,eAAe;AAAA,IACf,eAAe,YAAY,IAAI,QAAQ;AAAA,IACvC,cAAc,YAAY,IAAI,WAAW;AAAA,IACzC,mBAAmB,YAAY,IAAI,cAAc;AAAA,IACjD,eAAe,UAAU,SAAS,UAAU,UAAU,UAAU,QAAQ;AAAA,IACxE,qBAAqB;AAAA,IACrB;AAAA,EACF,CAAC;AACD,QAAM,UAAU,MAAM,SAAS,IAAI,GAAG,SAAS,MAAM,SAAS,EAAE,OAAO;AACvE,aAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC3C,UAAM,OAAO,SAAS,gBAAgB,QAAQ,OAAO;AACrD,SAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAChC,SAAK,aAAa,MAAM,UAAU,IAAI,UAAU,OAAO;AACvD,SAAK,cAAc;AACnB,aAAS,OAAO,IAAI;AAAA,EACtB;AACA,MAAI,OAAO,QAAQ;AACrB;AAEA,SAAS,qBAAqB,MAAsB;AAClD,QAAM,UAAU,cAAc,IAAI;AAClC,SAAO,QACJ,QAAQ,gBAAgB,IAAI,EAC5B,QAAQ,0BAA0B,IAAI,EACtC,QAAQ,YAAY,EAAE,EACtB,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,cAAc,IAAI,EAAE,QAAQ,WAAW,GAAG,EAAE,QAAQ,WAAW,GAAG,EAAE,KAAK,CAAC,EACxF,OAAO,OAAO,EACd,KAAK,IAAI;AACd;AAEA,SAAS,YAAY,OAA2B,UAA0B;AACxE,MAAI,CAAC,SAAS,UAAU,WAAW;AACjC,WAAO;AAAA,EACT;AACA,SAAO,MAAM,WAAW,GAAG,IAAI,QAAQ,IAAI,KAAK;AAClD;AAEA,SAAS,cAAc,OAAuB;AAC5C,QAAM,WAAW,SAAS,cAAc,UAAU;AAClD,WAAS,YAAY;AACrB,SAAO,SAAS;AAClB;AAEA,SAAS,iBAAiB,OAAoB,WAAmB,MAAoB;AACnF,QAAM,UAAU,cAAc,GAAG,SAAS,2BAAO;AACjD,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,MAAI,cAAc,KAAK,MAAM,GAAG,GAAK;AACrC,UAAQ,OAAO,GAAG;AAClB,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,2BAA2B,OAAoB,WAAmB,MAAc,OAAsB;AAC7G,QAAM,gBAAgB;AACtB,QAAM,UAAU,cAAc,GAAG,SAAS,2BAAO;AACjD,QAAM,UAAU,SAAS,cAAc,GAAG;AAC1C,UAAQ,cAAc,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC3E,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,MAAI,cAAc,KAAK,MAAM,GAAG,GAAK,KAAK;AAC1C,UAAQ,OAAO,SAAS,GAAG;AAC3B,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,oBAAoB,OAAuB;AAClD,MAAI;AACF,UAAM,UAAU,mBAAmB,OAAO,KAAK,KAAK,CAAC,CAAC;AACtD,WAAO,aAAAC,QAAK,WAAW,WAAW,KAAK,SAAS,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,GAAG;AAAA,MAC7E,IAAI;AAAA,IACN,CAAC;AAAA,EACH,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC//CA,IAAM,gBAAgB,oBAAI,IAAI;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,mBAA2C;AAAA,EAC/C,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,2BAA2B;AAAA,EAC3B,iBAAiB;AAAA,EACjB,gCAAgC;AAAA,EAChC,wBAAwB;AAC1B;AAEO,SAAS,YAA2B;AACzC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,cAAc,IAAI,KAAK,SAAS,KAAK,aAAa,IAAI,KAAK,QAAQ;AAAA,IAC5E;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,SAAS;AACnC,UAAI,SAAS,OAAO,KAAK;AAEzB,YAAM,YAAY,cAAc,IAAI,MAAM,gBAAgB;AAC1D,UAAI,cAAc,UAAU,cAAc,OAAO;AAC/C,mBAAW,OAAO,MAAM,aAAa,IAAI,IAAI,GAAG,SAAS;AACzD,eAAO,EAAE,SAAS,MAAM,MAAM,OAAO,EAAE;AAAA,MACzC;AACA,UAAI,cAAc,UAAU,cAAc,OAAO;AAC/C,mBAAW,OAAO,MAAM,aAAa,IAAI,IAAI,GAAG,SAAS;AACzD,eAAO,EAAE,SAAS,MAAM,MAAM,OAAO,EAAE;AAAA,MACzC;AACA,UAAI,cAAc,OAAO;AACvB,kBAAU,OAAO,MAAM,aAAa,IAAI,IAAI,CAAC;AAC7C,eAAO,EAAE,SAAS,MAAM,MAAM,OAAO,EAAE;AAAA,MACzC;AACA,UAAI,cAAc,SAAS,cAAc,OAAO;AAC9C,wBAAgB,OAAO,MAAM,gBAAgB,IAAI,IAAI,GAAG,WAAW,IAAI,KAAK,IAAI;AAChF,eAAO,EAAE,SAAS,MAAM,MAAM,OAAO,EAAE;AAAA,MACzC;AACA,UAAI,cAAc,OAAO;AACvB,cAAM,UAAU,cAAc,8BAAU;AACxC,gBAAQ,OAAO,IAAI,aAAa,KAAK,8PAAsD;AAC3F,cAAM,OAAO,OAAO;AACpB,eAAO,EAAE,SAAS,MAAM,MAAM,OAAO,EAAE;AAAA,MACzC;AAEA,YAAM,MAAM,MAAM,aAAa,IAAI,IAAI;AACvC,YAAM,SAAS,UAAU,OAAO,KAAK,GAAG;AACxC,aAAO;AAAA,QACL,WAAW,SAAS;AAClB,iBAAO,OAAO,WAAW,OAAO;AAAA,QAClC;AAAA,QACA,QAAQ,SAAS;AACf,iBAAO,OAAO,QAAQ,OAAO;AAAA,QAC/B;AAAA,QACA,UAAU;AACR,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,WAAW,OAAoB,MAAc,WAAyB;AAC7E,QAAM,UAAU,iBAAiB,IAAI;AACrC,QAAM,aAAa,QAAQ,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC;AAC/D,QAAM,UAAU,cAAc,GAAG,UAAU,YAAY,CAAC,2BAAO;AAC/D,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cAAc;AAEnB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,EAAAC,YAAW,MAAM,gBAAM,QAAQ,MAAM;AACrC,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI;AACtC,EAAAA,YAAW,MAAM,UAAK,WAAW,IAAI,iBAAiB,KAAK,CAAC;AAC5D,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI,WAAW,KAAK,CAAC;AACvD,UAAQ,OAAO,MAAM,MAAM,kBAAkB,UAAU,CAAC;AAExD,QAAM,QAAQ;AAAA,IACZ,QAAQ,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,YAAY;AAAA,MACrC,IAAI,OAAO;AAAA,MACX,MAAM,OAAO;AAAA,MACb,QAAQ,oBAAoB,MAAM;AAAA,IACpC,EAAE;AAAA,EACJ;AACA,UAAQ,OAAO,KAAK;AACpB,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,WAAW,OAAoB,MAAc,WAAyB;AAC7E,QAAM,UAAU,iBAAiB,IAAI;AACrC,QAAM,aAAa,QAAQ,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC;AAC/D,QAAM,UAAU,cAAc,GAAG,UAAU,YAAY,CAAC,2BAAO;AAC/D,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cAAc;AAEnB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,EAAAA,YAAW,MAAM,gBAAM,QAAQ,MAAM;AACrC,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI;AACtC,EAAAA,YAAW,MAAM,sBAAO,WAAW,IAAI,KAAK,KAAK,CAAC;AAClD,EAAAA,YAAW,MAAM,sBAAO,WAAW,IAAI,KAAK,KAAK,CAAC;AAClD,UAAQ,OAAO,MAAM,MAAM,kBAAkB,YAAY,gCAAO,CAAC;AAEjE,QAAM,QAAQ;AAAA,IACZ,QAAQ,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,QAAQ,WAAW;AAAA,MAC5C,IAAI,OAAO,QAAQ,CAAC;AAAA,MACpB,MAAM,aAAa,OAAO,IAAI;AAAA,MAC9B,QAAQ,OAAO,OAAO,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AAAA,IAC7C,EAAE;AAAA,EACJ;AACA,UAAQ,OAAO,KAAK;AACpB,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,UAAU,OAAoB,MAAoB;AACzD,QAAM,UAAU,iBAAiB,IAAI;AACrC,QAAM,aAAa,QAAQ,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC;AAC/D,QAAM,UAAU,cAAc,kCAAc;AAC5C,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cAAc;AAEnB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,EAAAA,YAAW,MAAM,gBAAM,QAAQ,MAAM;AACrC,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI;AACtC,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI,YAAY,KAAK,CAAC;AACxD,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI,aAAa,KAAK,CAAC;AACzD,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI,mBAAmB,KAAK,CAAC;AAC/D,EAAAA,YAAW,MAAM,gBAAM,WAAW,IAAI,UAAU,KAAK,CAAC;AACtD,EAAAA,YAAW,MAAM,gBAAM,iBAAiB,UAAU,CAAC;AACnD,UAAQ,OAAO,MAAM,MAAM,kBAAkB,YAAY,8BAAU,CAAC;AAEpE,QAAM,YAAY,mBAAmB,OAAO;AAC5C,MAAI,WAAW;AACb,YAAQ,OAAO,SAAS;AAAA,EAC1B;AAEA,QAAM,QAAQ;AAAA,IACZ,QAAQ,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,YAAY;AAAA,MACrC,IAAI,OAAO;AAAA,MACX,MAAM,OAAO;AAAA,MACb,QAAQ,mBAAmB,MAAM;AAAA,IACnC,EAAE;AAAA,EACJ;AACA,UAAQ,OAAO,KAAK;AACpB,QAAM,OAAO,OAAO;AACtB;AAaA,SAAS,gBAAgB,OAAoB,aAA0B,WAAmB,UAAwB;AAChH,QAAM,QAAQ,IAAI,WAAW,WAAW;AACxC,QAAM,UAAU,cAAc,GAAG,UAAU,YAAY,CAAC,2BAAO;AAC/D,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cACH,cAAc,QACV,oTACA;AAEN,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,EAAAA,YAAW,MAAM,gBAAM,QAAQ;AAC/B,EAAAA,YAAW,MAAM,gBAAM,UAAU,YAAY,CAAC;AAC9C,EAAAA,YAAW,MAAM,gBAAMC,aAAY,MAAM,UAAU,CAAC;AACpD,EAAAD,YAAW,MAAM,gBAAME,eAAc,KAAK,CAAC;AAC3C,EAAAF,YAAW,MAAM,gBAAM,iBAAiB,OAAO,SAAS,CAAC;AACzD,EAAAA,YAAW,MAAM,gBAAM,mBAAmB,KAAK,CAAC;AAEhD,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,UAAQ,YAAY;AACpB,QAAM,cACJ,cAAc,QACV;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF,IACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACN,aAAW,cAAc,aAAa;AACpC,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc;AACnB,YAAQ,OAAO,IAAI;AAAA,EACrB;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,cAAc,WAAW,KAAK;AAEtC,UAAQ,OAAO,MAAM,MAAM,qBAAqB,OAAO,SAAS,GAAG,SAAS,OAAO;AACnF,QAAM,OAAO,OAAO;AACtB;AAEA,SAAS,qBAAqB,OAAmB,WAAgC;AAC/E,QAAM,QAAQ,eAAe,KAAK;AAClC,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,UAAQ,OAAO;AACf,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,cAAc;AACtB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,EAAAA,YAAW,MAAM,4BAAQ,MAAM,OAAO,MAAM;AAC5C,EAAAA,YAAW,MAAM,kCAAS,uBAAuB,MAAM,YAAY,CAAC;AACpE,EAAAA,YAAW,MAAM,4BAAQ,OAAO,MAAM,WAAW,MAAM,CAAC;AACxD,EAAAA,YAAW,MAAM,mCAAU,OAAO,MAAM,WAAW,MAAM,CAAC;AAC1D,EAAAA,YAAW,MAAM,4BAAQ,OAAO,MAAM,aAAa,MAAM,CAAC;AAC1D,EAAAA,YAAW,MAAM,4BAAQ,cAAc,QAAQ,mCAAU,uCAAS;AAClE,UAAQ,OAAO,SAAS,IAAI;AAE5B,QAAM,QAAQ,CAAC,GAAG,MAAM,YAAY,GAAG,MAAM,YAAY,GAAG,MAAM,YAAY,EAAE,MAAM,GAAG,EAAE;AAC3F,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,YAAY;AACjB,eAAW,QAAQ,OAAO;AACxB,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,WAAK,cAAc;AACnB,WAAK,OAAO,IAAI;AAAA,IAClB;AACA,YAAQ,OAAO,IAAI;AAAA,EACrB;AAEA,MAAI,MAAM,OAAO,SAAS,GAAG;AAC3B,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AACpB,YAAQ,cAAc,MAAM,OAAO,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI;AACzD,YAAQ,OAAO,OAAO;AAAA,EACxB;AACA,SAAO;AACT;AAUA,SAAS,eAAe,OAAmC;AACzD,QAAM,OAAO,iBAAiB,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,KAAK,CAAC,CAAC;AAC3E,QAAM,SAAS,KACZ,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC,EACjC,MAAM,GAAG,GAAG;AACf,QAAM,iBAAiB,CAAC,QAAQ,UAAU,OAAO,cAAc,YAAY,QAAQ,SAAS,UAAU,SAAS,SAAS,QAAQ,WAAW;AAC3I,QAAM,eAAe,oBAAI,IAAoB;AAC7C,aAAW,SAAS,QAAQ;AAC1B,UAAM,aAAa,MAAM,YAAY;AACrC,eAAW,WAAW,gBAAgB;AACpC,UAAI,WAAW,SAAS,OAAO,GAAG;AAChC,qBAAa,IAAI,UAAU,aAAa,IAAI,OAAO,KAAK,KAAK,CAAC;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,YAAY,OAAO,OAAO,CAAC,SAAS,YAAY,KAAK,IAAI,CAAC,CAAC;AAAA,IACvE,YAAY,YAAY,OAAO,OAAO,CAAC,SAAS,kBAAkB,KAAK,IAAI,CAAC,CAAC;AAAA,IAC7E,cAAc,YAAY,OAAO,OAAO,CAAC,SAAS,wCAAwC,KAAK,IAAI,CAAC,CAAC;AAAA,EACvG;AACF;AAEA,SAAS,iBAAiB,OAA6B;AACrD,QAAM,SAAmB,CAAC;AAC1B,MAAI,UAAU;AACd,aAAW,QAAQ,OAAO;AACxB,QAAI,QAAQ,MAAM,QAAQ,KAAK;AAC7B,iBAAW,OAAO,aAAa,IAAI;AACnC;AAAA,IACF;AACA,QAAI,QAAQ,UAAU,GAAG;AACvB,aAAO,KAAK,OAAO;AAAA,IACrB;AACA,cAAU;AAAA,EACZ;AACA,MAAI,QAAQ,UAAU,GAAG;AACvB,WAAO,KAAK,OAAO;AAAA,EACrB;AACA,SAAO;AACT;AAEA,SAAS,YAAY,QAA4B;AAC/C,SAAO,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,EAAE;AAC7F;AAEA,SAAS,uBAAuB,QAAqC;AACnE,QAAM,OAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EAC9B,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE,EACzC,KAAK,IAAI;AACZ,SAAO,QAAQ;AACjB;AAEA,SAAS,iBAAiB,MAA4B;AACpD,SAAO,CAAC,GAAG,KAAK,SAAS,kDAAkD,CAAC,EAAE,IAAI,CAAC,WAAW;AAAA,IAC5F,IAAI,IAAI,MAAM,CAAC,CAAC;AAAA,IAChB,OAAO,MAAM,CAAC,KAAK,IAAI,YAAY;AAAA,IACnC,OAAO,MAAM,CAAC,KAAK,IAAI,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAAA,EACnD,EAAE;AACJ;AAEA,SAAS,iBAAiB,MAA4B;AACpD,QAAM,gBAAgB,KACnB,MAAM,OAAO,EACb,OAAO,CAAC,SAAS,KAAK,MAAM,IAAI,EAAE,EAAE,YAAY,MAAM,OAAO,cAAc,KAAK,IAAI,CAAC,EACrF,IAAI,CAAC,SAAS,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,CAAC,EACtC,KAAK,EAAE;AACV,MAAI,CAAC,eAAe;AAClB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,cACJ,MAAM,GAAG,EACT,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC,EAC7B,OAAO,OAAO,EACd,IAAI,CAAC,WAAW;AACf,UAAM,SAAS,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AAC1E,WAAO,EAAE,MAAM,OAAO,CAAC,KAAK,WAAW,OAAO;AAAA,EAChD,CAAC;AACL;AAEA,SAAS,oBAAoB,QAA4B;AACvD,MAAI,OAAO,SAAS,mBAAmB;AACrC,UAAM,QAAQ,OAAO,KAAK,MAAM,qBAAqB,IAAI,CAAC;AAC1D,WAAO,QAAQ,gBAAM,MAAM,QAAQ,QAAQ,EAAE,CAAC,KAAK,OAAO;AAAA,EAC5D;AACA,MAAI,OAAO,SAAS,eAAe,OAAO,SAAS,UAAU;AAC3D,UAAM,YAAY,OAAO,KAAK,MAAM,qBAAqB,IAAI,CAAC;AAC9D,WAAO,YAAY,gBAAM,UAAU,QAAQ,QAAQ,EAAE,CAAC,KAAK,OAAO;AAAA,EACpE;AACA,MAAI,OAAO,SAAS,UAAU,OAAO,SAAS,YAAY,OAAO,SAAS,iBAAiB;AACzF,WAAO,OAAO,KAAK,MAAM,GAAG,GAAG;AAAA,EACjC;AACA,SAAO,OAAO,KAAK,MAAM,GAAG,GAAG;AACjC;AAEA,SAAS,mBAAmB,QAA4B;AACtD,QAAM,UAAU,mBAAmB,OAAO,IAAI;AAC9C,QAAM,WAAW,QAAQ,CAAC;AAC1B,QAAM,OAAO,QAAQ,CAAC,KAAK,QAAQ,CAAC;AACpC,QAAM,QAAQ,CAAC,UAAU,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK;AACzD,MAAI,OAAO;AACT,WAAO;AAAA,EACT;AACA,SAAO,oBAAoB,MAAM;AACnC;AAEA,SAAS,mBAAmB,SAA2C;AACrE,QAAM,OAAO,QACV,OAAO,CAAC,WAAW,CAAC,cAAc,WAAW,eAAe,qBAAqB,UAAU,EAAE,SAAS,OAAO,IAAI,CAAC,EAClH,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,YAAY;AAAA,IAChB,IAAI,OAAO;AAAA,IACX,MAAM,YAAY,OAAO,IAAI;AAAA,IAC7B,QAAQ,mBAAmB,MAAM;AAAA,EACnC,EAAE;AACJ,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,aAAW,SAAS,CAAC,MAAM,gBAAM,cAAI,GAAG;AACtC,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc;AACnB,WAAO,OAAO,IAAI;AAAA,EACpB;AACA,QAAM,OAAO,MAAM;AACnB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,aAAW,OAAO,MAAM;AACtB,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,eAAW,SAAS,CAAC,IAAI,IAAI,IAAI,MAAM,IAAI,MAAM,GAAG;AAClD,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,WAAK,cAAc;AACnB,SAAG,OAAO,IAAI;AAAA,IAChB;AACA,UAAM,OAAO,EAAE;AAAA,EACjB;AACA,QAAM,OAAO,OAAO,KAAK;AACzB,UAAQ,OAAO,OAAO,KAAK;AAC3B,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAwB;AAClD,QAAM,SAAmB,CAAC;AAC1B,QAAM,UAAU;AAChB,MAAI;AACJ,SAAQ,QAAQ,QAAQ,KAAK,IAAI,GAAI;AACnC,WAAO,MAAM,MAAM,CAAC,KAAK,IAAI,QAAQ,OAAO,GAAG,CAAC;AAAA,EAClD;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAAqC;AAC7D,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,aAAa,OAAO,CAAC,KAAK,SAAS,OAAO,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC;AAC5E;AAEA,SAAS,YAAY,MAAsB;AACzC,QAAM,QAAgC;AAAA,IACpC,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,UAAU;AAAA,EACZ;AACA,SAAO,MAAM,IAAI,KAAK;AACxB;AAEA,SAAS,aAAa,MAAsB;AAC1C,QAAM,QAAgC;AAAA,IACpC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACA,SAAO,MAAM,IAAI,KAAK;AACxB;AAEA,SAAS,kBAAkB,QAA6B,YAAY,4BAAqB;AACvF,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,UAAQ,OAAO;AACf,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,cAAc;AACtB,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,aAAW,CAAC,MAAM,KAAK,KAAK,CAAC,GAAG,OAAO,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,EAAE,GAAG;AAC1F,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc,GAAG,IAAI,KAAK,KAAK;AACpC,SAAK,OAAO,IAAI;AAAA,EAClB;AACA,UAAQ,OAAO,SAAS,IAAI;AAC5B,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAwE;AACpG,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,aAAW,SAAS,CAAC,MAAM,gBAAM,cAAI,GAAG;AACtC,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc;AACnB,WAAO,OAAO,IAAI;AAAA,EACpB;AACA,QAAM,OAAO,MAAM;AACnB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,aAAW,OAAO,MAAM;AACtB,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,eAAW,SAAS,CAAC,IAAI,IAAI,IAAI,MAAM,IAAI,MAAM,GAAG;AAClD,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,WAAK,cAAc;AACnB,SAAG,OAAO,IAAI;AAAA,IAChB;AACA,UAAM,OAAO,EAAE;AAAA,EACjB;AACA,QAAM,OAAO,OAAO,KAAK;AACzB,UAAQ,OAAO,KAAK;AACpB,SAAO;AACT;AAEA,SAAS,QAAQ,QAAuC;AACtD,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,SAAS,QAAQ;AAC1B,WAAO,IAAI,QAAQ,OAAO,IAAI,KAAK,KAAK,KAAK,CAAC;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAASA,YAAW,QAAqB,OAAe,OAA8B;AACpF,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc,OAAO,KAAK;AAClC,MAAI,OAAO,KAAK,OAAO;AACvB,SAAO,OAAO,GAAG;AACnB;AAEA,SAASC,aAAY,OAAuB;AAC1C,MAAI,QAAQ,MAAM;AAChB,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,MAAI,QAAQ,OAAO,MAAM;AACvB,WAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAAA,EACrC;AACA,SAAO,IAAI,QAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC;AAC5C;AAEA,SAASC,eAAc,OAA2B;AAChD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,iBAAiB,GAAG;AACtH,QAAM,MAAM,MAAM,KAAK,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,EAC7D,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,EAC9D,KAAK,GAAG;AACX,SAAO,GAAG,KAAK,KAAK,GAAG;AACzB;AAEA,SAAS,iBAAiB,OAAmB,WAA2B;AACtE,QAAM,SAAS,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,EAAE,CAAC,CAAC;AACzF,MAAI,cAAc,OAAO;AACvB,UAAM,QAAQ,OAAO,MAAM,SAAS;AACpC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AACA,UAAM,QAAgC;AAAA,MACpC,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AACA,WAAO,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC,IAAI,SAAM,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE;AAAA,EACrE;AACA,MAAI,OAAO,WAAW,MAAM,KAAK,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO,OAAO,MAAM,KAAK,EAAE,CAAC,KAAK;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAA2B;AACrD,MAAI,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,IAAM;AAC1C,WAAO;AAAA,EACT;AACA,MAAI,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,KAAM;AAC1C,WAAO;AAAA,EACT;AACA,MAAI,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,IAAM;AACpF,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAA2B;AAC7C,QAAM,OAAiB,CAAC;AACxB,QAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,GAAG;AACxC,WAAS,SAAS,GAAG,SAAS,OAAO,UAAU,IAAI;AACjD,UAAM,QAAQ,MAAM,MAAM,QAAQ,SAAS,EAAE;AAC7C,UAAM,MAAM,MAAM,KAAK,KAAK,EACzB,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,EAC9D,KAAK,GAAG,EACR,OAAO,IAAI,GAAG;AACjB,UAAM,QAAQ,MAAM,KAAK,KAAK,EAC3B,IAAI,CAAC,SAAU,QAAQ,MAAM,QAAQ,MAAM,OAAO,aAAa,IAAI,IAAI,GAAI,EAC3E,KAAK,EAAE;AACV,SAAK,KAAK,GAAG,OAAO,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,KAAK,GAAG,KAAK,KAAK,EAAE;AAAA,EACrF;AACA,MAAI,MAAM,SAAS,OAAO;AACxB,SAAK,KAAK,gCAAY,KAAK,6BAAS,MAAM,MAAM,eAAK;AAAA,EACvD;AACA,SAAO,KAAK,KAAK,IAAI,KAAK;AAC5B;AAEA,SAAS,UACP,OACA,KACA,KAKA;AACA,QAAM,QAAQ,IAAI,MAAM,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AAC1D,QAAM,QAA+D,CAAC;AACtE,QAAM,UAAyD,CAAC;AAChE,QAAM,OAAsE,CAAC;AAC7E,QAAM,SAAgD,CAAC;AACvD,QAAM,YAA0D,CAAC;AACjE,QAAM,QAA+D,CAAC;AAEtE,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,UAAM,OAAO,MAAM,KAAK;AACxB,UAAM,QAAQ,MAAM,QAAQ,CAAC;AAC7B,QAAI,SAAS,OAAO,UAAU,QAAQ;AACpC,YAAM,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC1C,YAAM,KAAK;AAAA,QACT,OAAO,mBAAmB,OAAO,GAAG,CAAC;AAAA,QACrC,OAAO;AAAA,UACL,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,YAAM,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC1C,cAAQ,KAAK;AAAA,QACX,OAAO,mBAAmB,OAAO,GAAG,CAAC;AAAA,QACrC,OAAO;AAAA,UACL,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,SAAS,OAAO,UAAU,OAAO;AACnC,YAAM,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC1C,WAAK,KAAK;AAAA,QACR,OAAO,mBAAmB,OAAO,GAAG,CAAC;AAAA,QACrC,OAAO;AAAA,UACL,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,UACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,SAAS,OAAO,UAAU,SAAS;AACrC,YAAM,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC1C,aAAO,KAAK;AAAA,QACV,OAAO,mBAAmB,OAAO,GAAG,CAAC;AAAA,QACrC,OAAO,CAAC,OAAO,OAAO,IAAI,KAAK,CAAC,GAAG,OAAO,OAAO,IAAI,KAAK,CAAC,CAAC;AAAA,MAC9D,CAAC;AAAA,IACH;AACA,QAAI,SAAS,OAAO,UAAU,cAAc;AAC1C,YAAM,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC1C,YAAM,cAAc,gBAAgB,OAAO,QAAQ,CAAC;AACpD,YAAM,WAAW,mBAAmB,WAAW;AAC/C,UAAI,SAAS,SAAS,GAAG;AACvB,kBAAU,KAAK,EAAE,OAAO,mBAAmB,OAAO,GAAG,CAAC,GAAG,OAAO,SAAS,CAAC;AAAA,MAC5E;AAAA,IACF;AACA,QAAI,SAAS,OAAO,UAAU,YAAY;AACxC,YAAM,SAAS,mBAAmB,OAAO,QAAQ,CAAC;AAClD,UAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,kBAAU,KAAK,EAAE,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,CAAC;AAAA,MAC9D;AACA,cAAQ,KAAK,IAAI,OAAO,OAAO,WAAW,CAAC;AAAA,IAC7C;AACA,QAAI,SAAS,QAAQ,UAAU,UAAU,UAAU,UAAU;AAC3D,YAAM,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC1C,YAAM,OAAO,iBAAiB,OAAO,GAAG,KAAK,OAAO,GAAG,KAAK,EAAE;AAC9D,UAAI,MAAM;AACR,cAAM,KAAK;AAAA,UACT,OAAO,mBAAmB,OAAO,GAAG,CAAC;AAAA,UACrC,OAAO;AAAA,YACL,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,YACxB,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,YACxB;AAAA,YACA,KAAK,IAAI,GAAG,OAAO,OAAO,IAAI,KAAK,EAAE,CAAC;AAAA,UACxC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,cAAc,8BAAU;AACxC,QAAM,MAAM,SAAS,gBAAgB,8BAA8B,KAAK;AACxE,MAAI,aAAa,SAAS,eAAe;AAEzC,QAAM,SAAS,cAAc,OAAO,SAAS,MAAM,QAAQ,WAAW,KAAK;AAC3E,QAAM,iBAAiB;AAAA,IACrB,GAAG,OAAO;AAAA,IACV,GAAG,OAAO;AAAA,IACV,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,EACjB;AACA,MAAI,iBAAiB,EAAE,GAAG,eAAe;AACzC,QAAM,eAAe,MAAM;AACzB,QAAI;AAAA,MACF;AAAA,MACA,GAAG,eAAe,CAAC,IAAI,eAAe,CAAC,IAAI,eAAe,KAAK,IAAI,eAAe,MAAM;AAAA,IAC1F;AAAA,EACF;AACA,eAAa;AAEb,aAAW,QAAQ,MAAM,MAAM,GAAG,GAAI,GAAG;AACvC,UAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,KAAK;AAC9B,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,SAAK,aAAa,MAAM,OAAO,EAAE,CAAC;AAClC,SAAK,aAAa,MAAM,OAAO,CAAC,EAAE,CAAC;AACnC,SAAK,aAAa,MAAM,OAAO,EAAE,CAAC;AAClC,SAAK,aAAa,MAAM,OAAO,CAAC,EAAE,CAAC;AACnC,SAAK,aAAa,UAAU,SAAS;AACrC,SAAK,aAAa,gBAAgB,OAAO,OAAO,MAAM,CAAC;AACvD,eAAW,MAAM,KAAK,KAAK;AAC3B,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA,aAAW,QAAQ,QAAQ,MAAM,GAAG,GAAI,GAAG;AACzC,UAAM,CAAC,IAAI,IAAI,MAAM,IAAI,KAAK;AAC9B,UAAM,SAAS,SAAS,gBAAgB,IAAI,cAAc,QAAQ;AAClE,WAAO,aAAa,MAAM,OAAO,EAAE,CAAC;AACpC,WAAO,aAAa,MAAM,OAAO,CAAC,EAAE,CAAC;AACrC,WAAO,aAAa,KAAK,OAAO,KAAK,IAAI,MAAM,CAAC,CAAC;AACjD,WAAO,aAAa,QAAQ,MAAM;AAClC,WAAO,aAAa,UAAU,SAAS;AACvC,WAAO,aAAa,gBAAgB,OAAO,OAAO,MAAM,CAAC;AACzD,eAAW,QAAQ,KAAK,KAAK;AAC7B,QAAI,OAAO,MAAM;AAAA,EACnB;AAEA,aAAW,QAAQ,KAAK,MAAM,GAAG,GAAI,GAAG;AACtC,UAAM,CAAC,IAAI,IAAI,QAAQ,YAAY,QAAQ,IAAI,KAAK;AACpD,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC9D,SAAK,aAAa,KAAK,QAAQ,IAAI,CAAC,IAAI,KAAK,IAAI,MAAM,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;AACjF,SAAK,aAAa,QAAQ,MAAM;AAChC,SAAK,aAAa,UAAU,SAAS;AACrC,SAAK,aAAa,gBAAgB,OAAO,OAAO,MAAM,CAAC;AACvD,eAAW,MAAM,KAAK,KAAK;AAC3B,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA,aAAW,QAAQ,UAAU,MAAM,GAAG,GAAI,GAAG;AAC3C,UAAM,WAAW,KAAK;AACtB,UAAM,OAAO,SAAS,gBAAgB,IAAI,cAAc,UAAU;AAClE,SAAK,aAAa,UAAU,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AAC5E,SAAK,aAAa,QAAQ,MAAM;AAChC,SAAK,aAAa,UAAU,SAAS;AACrC,SAAK,aAAa,gBAAgB,OAAO,OAAO,MAAM,CAAC;AACvD,eAAW,MAAM,KAAK,KAAK;AAC3B,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA,aAAW,QAAQ,OAAO,MAAM,GAAG,GAAI,GAAG;AACxC,UAAM,CAAC,GAAG,CAAC,IAAI,KAAK;AACpB,UAAM,QAAQ,SAAS,gBAAgB,IAAI,cAAc,QAAQ;AACjE,UAAM,aAAa,MAAM,OAAO,CAAC,CAAC;AAClC,UAAM,aAAa,MAAM,OAAO,CAAC,CAAC,CAAC;AACnC,UAAM,aAAa,KAAK,OAAO,OAAO,SAAS,CAAC,CAAC;AACjD,UAAM,aAAa,QAAQ,SAAS;AACpC,eAAW,OAAO,KAAK,KAAK;AAC5B,QAAI,OAAO,KAAK;AAAA,EAClB;AAEA,aAAW,QAAQ,MAAM,MAAM,GAAG,GAAG,GAAG;AACtC,UAAM,CAAC,GAAG,GAAG,MAAM,MAAM,IAAI,KAAK;AAClC,UAAM,QAAQ,SAAS,gBAAgB,IAAI,cAAc,MAAM;AAC/D,UAAM,aAAa,KAAK,OAAO,CAAC,CAAC;AACjC,UAAM,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC;AAClC,UAAM,aAAa,aAAa,OAAO,KAAK,IAAI,QAAQ,OAAO,SAAS,CAAC,CAAC,CAAC;AAC3E,UAAM,aAAa,QAAQ,cAAc;AACzC,UAAM,cAAc;AACpB,eAAW,OAAO,KAAK,KAAK;AAC5B,QAAI,OAAO,KAAK;AAAA,EAClB;AAEA,QAAM,SAAS,MAAM;AAAA,IACnB,IAAI,IAAI,CAAC,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,KAAK,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AAAA,EACtG,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACnC,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ,OAAO,oBAAoB,KAAK,MAAM,CAAC;AAAA,EACjD;AAEA,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,cACH,2BAAY,MAAM,MAAM,uBAAa,QAAQ,MAAM,oBAAU,KAAK,MAAM,yBAAe,UAAU,MAAM,sBAAY,OAAO,MAAM,qBAAW,MAAM,MAAM;AACzJ,UAAQ,OAAO,MAAM,GAAG;AACxB,QAAM,OAAO,OAAO;AACpB,QAAM,oBAAoB,MAAM;AAC9B,QAAI,SAAS,QAAQ,eAAe,QAAQ,eAAe,KAAK;AAAA,EAClE;AACA,oBAAkB;AAElB,SAAO;AAAA,IACL,WAAW,SAAS;AAClB,aAAO,YAAY,aAAa,YAAY,cAAc,YAAY;AAAA,IACxE;AAAA,IACA,QAAQ,SAAS;AACf,UAAI,YAAY,aAAa,YAAY,YAAY;AACnD,cAAM,SAAS,YAAY,YAAY,OAAO;AAC9C,cAAM,UAAU,eAAe,IAAI,eAAe,QAAQ;AAC1D,cAAM,UAAU,eAAe,IAAI,eAAe,SAAS;AAC3D,uBAAe,SAAS;AACxB,uBAAe,UAAU;AACzB,uBAAe,IAAI,UAAU,eAAe,QAAQ;AACpD,uBAAe,IAAI,UAAU,eAAe,SAAS;AACrD,qBAAa;AACb,0BAAkB;AAClB,eAAO;AAAA,MACT;AACA,UAAI,YAAY,cAAc;AAC5B,yBAAiB,EAAE,GAAG,eAAe;AACrC,qBAAa;AACb,0BAAkB;AAClB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA,UAAU;AACR,UAAI,SAAS,QAAQ,MAAS;AAAA,IAChC;AAAA,EACF;AACF;AAEA,SAAS,WAAW,SAAkB,OAAqB;AACzD,UAAQ,aAAa,cAAc,KAAK;AAC1C;AAEA,SAAS,oBAAoB,KAAoB,QAA+B;AAC9E,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AACrB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc,gBAAM,OAAO,MAAM;AACvC,WAAS,OAAO,KAAK;AAErB,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,WAAW,SAAS,cAAc,OAAO;AAC/C,aAAS,OAAO;AAChB,aAAS,UAAU;AACnB,aAAS,iBAAiB,UAAU,MAAM;AACxC,iBAAW,WAAW,IAAI,iBAA6B,gBAAgB,mBAAmB,KAAK,CAAC,IAAI,GAAG;AACrG,gBAAQ,MAAM,UAAU,SAAS,UAAU,KAAK;AAAA,MAClD;AAAA,IACF,CAAC;AACD,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,cAAc;AACnB,UAAM,OAAO,UAAU,IAAI;AAC3B,aAAS,OAAO,KAAK;AAAA,EACvB;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAiB,OAAuC;AAC1E,QAAM,SAAiC,CAAC;AACxC,WAAS,QAAQ,OAAO,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACxD,UAAM,OAAO,MAAM,KAAK;AACxB,UAAM,QAAQ,MAAM,QAAQ,CAAC;AAC7B,QAAI,SAAS,KAAK;AAChB;AAAA,IACF;AACA,WAAO,IAAI,IAAI;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAiB,OAAwC;AAChF,QAAM,cAAuC,CAAC;AAC9C,WAAS,QAAQ,OAAO,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACxD,UAAM,OAAO,MAAM,KAAK;AACxB,UAAM,QAAQ,MAAM,QAAQ,CAAC;AAC7B,QAAI,SAAS,KAAK;AAChB;AAAA,IACF;AACA,gBAAY,KAAK,CAAC,MAAM,KAAK,CAAC;AAAA,EAChC;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,aAA+D;AACzF,QAAM,SAAkC,CAAC;AACzC,MAAI;AACJ,aAAW,CAAC,MAAM,KAAK,KAAK,aAAa;AACvC,QAAI,SAAS,MAAM;AACjB,UAAI,OAAO,KAAK;AAAA,IAClB;AACA,QAAI,SAAS,QAAQ,MAAM,QAAW;AACpC,aAAO,KAAK,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC;AAC9B,UAAI;AAAA,IACN;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBACP,OACA,OACsE;AACtE,MAAI,QAAQ;AACZ,QAAM,SAAkC,CAAC;AACzC,WAAS,QAAQ,OAAO,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACxD,UAAM,OAAO,MAAM,KAAK;AACxB,UAAM,QAAQ,MAAM,QAAQ,CAAC;AAC7B,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,aAAO,EAAE,OAAO,QAAQ,UAAU,QAAQ,EAAE;AAAA,IAC9C;AACA,QAAI,SAAS,KAAK;AAChB,cAAQ,mBAAmB,KAAK;AAAA,IAClC;AACA,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,YAAM,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC1C,aAAO,KAAK,CAAC,OAAO,OAAO,IAAI,KAAK,CAAC,GAAG,OAAO,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC;AAAA,IACpE;AAAA,EACF;AACA,SAAO,EAAE,OAAO,QAAQ,UAAU,MAAM,OAAO;AACjD;AAEA,SAAS,mBAAmB,OAAmC;AAC7D,SAAO,OAAO,KAAK,KAAK;AAC1B;AAEA,SAAS,mBAAmB,OAAuB;AACjD,MAAI,OAAO,QAAQ,eAAe,IAAI,QAAQ;AAC5C,WAAO,IAAI,OAAO,KAAK;AAAA,EACzB;AACA,SAAO,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK;AACzD;AAEA,SAAS,iBAAiB,MAAsB;AAC9C,SAAO,KACJ,QAAQ,QAAQ,IAAI,EACpB,QAAQ,eAAe,EAAE,EACzB,QAAQ,SAAS,EAAE,EACnB,KAAK;AACV;AAEA,SAAS,QAAQ,IAAY,IAAY,QAAgB,YAAoB,UAA0B;AACrG,QAAM,QAAQ,iBAAiB,IAAI,IAAI,QAAQ,QAAQ;AACvD,QAAM,MAAM,iBAAiB,IAAI,IAAI,QAAQ,UAAU;AACvD,QAAM,QAAQ,KAAK,IAAI,WAAW,UAAU;AAC5C,QAAM,WAAW,SAAS,MAAM,MAAM;AACtC,SAAO,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,MAAM,IAAI,MAAM,MAAM,QAAQ,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC;AACxF;AAEA,SAAS,iBAAiB,IAAY,IAAY,QAAgB,cAAgD;AAChH,QAAM,QAAS,eAAe,KAAK,KAAM;AACzC,SAAO;AAAA,IACL,GAAG,KAAK,SAAS,KAAK,IAAI,KAAK;AAAA,IAC/B,GAAG,KAAK,SAAS,KAAK,IAAI,KAAK;AAAA,EACjC;AACF;AAEA,SAAS,cACP,OACA,SACA,MACA,QACA,WACA,OAC+E;AAC/E,QAAM,KAAK,MAAM,QAAQ,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AAC5D,QAAM,KAAK,MAAM,QAAQ,CAAC,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AAChE,aAAW,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,KAAK,SAAS;AACjD,OAAG,KAAK,KAAK,QAAQ,KAAK,MAAM;AAChC,OAAG,KAAK,CAAC,KAAK,QAAQ,CAAC,KAAK,MAAM;AAAA,EACpC;AACA,aAAW,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,KAAK,MAAM;AAC9C,OAAG,KAAK,KAAK,QAAQ,KAAK,MAAM;AAChC,OAAG,KAAK,CAAC,KAAK,QAAQ,CAAC,KAAK,MAAM;AAAA,EACpC;AACA,aAAW,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,QAAQ;AACtC,OAAG,KAAK,CAAC;AACT,OAAG,KAAK,CAAC,CAAC;AAAA,EACZ;AACA,aAAW,EAAE,OAAO,SAAS,KAAK,WAAW;AAC3C,eAAW,CAAC,GAAG,CAAC,KAAK,UAAU;AAC7B,SAAG,KAAK,CAAC;AACT,SAAG,KAAK,CAAC,CAAC;AAAA,IACZ;AAAA,EACF;AACA,aAAW,EAAE,OAAO,CAAC,GAAG,GAAG,MAAMC,OAAM,EAAE,KAAK,OAAO;AACnD,OAAG,KAAK,GAAG,IAAI,KAAK,SAASA,UAAS,GAAG;AACzC,OAAG,KAAK,CAAC,GAAG,CAAC,IAAIA,OAAM;AAAA,EACzB;AACA,QAAM,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;AAC9B,QAAM,OAAO,KAAK,IAAI,GAAG,IAAI,GAAG;AAChC,QAAM,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;AAC9B,QAAM,OAAO,KAAK,IAAI,GAAG,IAAI,GAAG;AAChC,QAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,IAAI;AACrC,QAAM,SAAS,KAAK,IAAI,GAAG,OAAO,IAAI;AACtC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,KAAK,IAAI,OAAO,MAAM,IAAI;AAAA,EACpC;AACF;;;ACpiCA,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,qBAA6C;AAAA,EACjD,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,yBAAyB;AAAA,EACzB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,8BAA8B;AAAA,EAC9B,mBAAmB;AAAA,EACnB,gCAAgC;AAClC;AACA,IAAM,qBAAqB,oBAAI,IAAI,CAAC,QAAQ,OAAO,MAAM,OAAO,QAAQ,OAAO,OAAO,OAAO,MAAM,MAAM,OAAO,OAAO,QAAQ,KAAK,CAAC;AAE9H,SAAS,gBAA+B;AAC7C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aACE,gBAAgB,IAAI,KAAK,SAAS,KACjC,eAAe,IAAI,KAAK,QAAQ,MAAM,KAAK,cAAc,MAAM,KAAK,cAAc,SAAS,CAAC,mBAAmB,IAAI,KAAK,SAAS;AAAA,IAEtI;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,MAAM,OAAO,OAAO;AAClC,YAAM,EAAE,cAAc,IAAI,MAAM,OAAO,8CAA8C;AACrF,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AAEvC,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,UAAI,SAAS,OAAO,KAAK;AAEzB,YAAM,QAAQ,IAAI,MAAM,MAAM;AAC9B,YAAM,aAAa,IAAI,MAAM,MAAM,QAAQ;AAE3C,YAAM,SAAS,IAAI,MAAM,kBAAkB,IAAI,GAAG,KAAK,GAAK;AAC5D,aAAO,SAAS,IAAI,KAAK,GAAG,GAAG;AAE/B,UAAI;AACJ,UAAI;AACF,mBAAW,IAAI,MAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,MACxD,QAAQ;AACN,cAAM,OAAO;AACb,eAAO,oBAAoB,KAAK,KAAK,YAAY,0IAAiC;AAAA,MACpF;AACA,eAAS,cAAc,KAAK,IAAI,OAAO,kBAAkB,CAAC,CAAC;AAC3D,eAAS,mBAAmB,MAAM;AAClC,eAAS,cAAc,MAAM;AAC7B,eAAS,sBAAsB;AAC/B,YAAM,OAAO,SAAS,UAAU;AAEhC,YAAM,WAAW,IAAI,cAAc,QAAQ,SAAS,UAAU;AAC9D,eAAS,gBAAgB;AAEzB,YAAM,IAAI,IAAI,MAAM,gBAAgB,UAAU,SAAU,GAAG,CAAC;AAC5D,YAAM,cAAc,IAAI,MAAM,iBAAiB,UAAU,CAAC;AAC1D,kBAAY,SAAS,IAAI,GAAG,GAAG,CAAC;AAChC,YAAM,IAAI,WAAW;AACrB,YAAM,IAAI,IAAI,MAAM,WAAW,IAAI,IAAI,UAAU,QAAQ,CAAC;AAE1D,YAAM,YAAY,cAAc,IAAI,MAAM,kBAAkB;AAC5D,YAAM,SAAS,MAAM,UAAU,WAAW,KAAK,KAAK,EAAE,MAAM,MAAM,MAAS;AAC3E,UAAI,CAAC,QAAQ;AACX,iBAAS,QAAQ;AACjB,iBAAS,QAAQ;AACjB,cAAM,OAAO;AACb,eAAO,oBAAoB,KAAK,KAAK,YAAY,wEAAiB;AAAA,MACpE;AACA,UAAI,OAAO,SAAS;AAClB,cAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,gBAAQ,YAAY;AACpB,gBAAQ,cAAc,OAAO;AAC7B,cAAM,OAAO,OAAO;AAAA,MACtB;AACA,YAAM,SAAS,OAAO;AACtB,YAAM,IAAI,MAAM;AAChB,YAAM,eAAe,YAAY,QAAQ,QAAQ,UAAU,KAAK;AAChE,YAAM,cAAc,cAAc,QAAQ,KAAK;AAC/C,YAAM,OAAO,uBAAuB,WAAW,CAAC;AAChD,YAAM,OAAO,oBAAoB,qBAAqB,MAAM,CAAC,CAAC;AAE9D,UAAI,iBAAiB;AACrB,YAAM,UAAU,MAAM;AACpB,iBAAS,OAAO;AAChB,iBAAS,OAAO,OAAO,MAAM;AAC7B,yBAAiB,OAAO,sBAAsB,OAAO;AAAA,MACvD;AACA,cAAQ;AAER,YAAM,SAAS,CAAC,SAAsB;AACpC,cAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK;AACpC,cAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM;AACtC,eAAO,SAAS,QAAQ;AACxB,eAAO,uBAAuB;AAC9B,iBAAS,QAAQ,OAAO,QAAQ,KAAK;AAAA,MACvC;AACA,aAAO,IAAI,IAAI;AACf,YAAM,oBAAoB,MAAM;AAC9B,cAAM,kBAAkB,eAAe,OAAO,UAAU,SAAS,MAAM;AACvE,cAAM,kBAAkB,eAAe,aAAa,gBAAgB,aAAa,MAAM;AACvF,YAAI,SAAS,QAAQ,kBAAkB,IAAI,kBAAkB,kBAAkB,MAAS;AAAA,MAC1F;AACA,wBAAkB;AAElB,aAAO;AAAA,QACL,WAAW,SAAS;AAClB,iBACE,YAAY,aACZ,YAAY,cACZ,YAAY,gBACZ,YAAY,kBACZ,YAAY;AAAA,QAEhB;AAAA,QACA,QAAQ,SAAS;AACf,cAAI,YAAY,aAAa,YAAY,YAAY;AACnD,kBAAM,SAAS,YAAY,YAAY,OAAO;AAC9C,mBAAO,SAAS,IAAI,SAAS,MAAM,EAAE,eAAe,MAAM,EAAE,IAAI,SAAS,MAAM;AAC/E,mBAAO,uBAAuB;AAC9B,qBAAS,OAAO;AAChB,8BAAkB;AAClB,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,cAAc;AAC5B,mBAAO,SAAS,KAAK,aAAa,cAAc;AAChD,qBAAS,OAAO,KAAK,aAAa,MAAM;AACxC,mBAAO,OAAO,aAAa;AAC3B,mBAAO,MAAM,aAAa;AAC1B,mBAAO,uBAAuB;AAC9B,qBAAS,OAAO;AAChB,8BAAkB;AAClB,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,kBAAkB,YAAY,eAAe;AAC3D,mBAAO,QAAQ,YAAY,iBAAiB,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,CAAC;AACtE,mBAAO;AAAA,UACT;AACA,iBAAO;AAAA,QACT;AAAA,QACA;AAAA,QACA,UAAU;AACR,cAAI,SAAS,QAAQ,MAAS;AAC9B,iBAAO,qBAAqB,cAAc;AAC1C,mBAAS,QAAQ;AACjB,mBAAS,QAAQ;AACjB,wBAAc,QAAQ,KAAK;AAC3B,gBAAM,OAAO;AACb,0BAAgB,KAAK,UAAU;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eACP,GACA,GACQ;AACR,MAAI,OAAO,EAAE,eAAe,YAAY;AACtC,WAAO,EAAE,WAAW,CAAC;AAAA,EACvB;AACA,SAAO,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACnD;AAEA,SAAS,oBACP,KACA,KACA,YACA,SACiB;AACjB,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAElB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AAEpB,QAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,SAAO,cAAc,GAAG,OAAO,IAAI,IAAI,KAAK,IAAI;AAEhD,QAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,WAAS,OAAO;AAChB,WAAS,WAAW,IAAI,KAAK;AAC7B,WAAS,cAAc;AAEvB,QAAM,OAAO,OAAO,QAAQ,QAAQ;AACpC,MAAI,SAAS,UAAU,IAAI,YAAY;AACvC,MAAI,SAAS,OAAO,KAAK;AAEzB,SAAO;AAAA,IACL,aAAa;AACX,aAAO;AAAA,IACT;AAAA,IACA,UAAU;AACR,UAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,YAAM,OAAO;AACb,sBAAgB,KAAK,UAAU;AAAA,IACjC;AAAA,EACF;AACF;AAEA,eAAe,UACb,WACA,KACA,OACiE;AACjE,MAAI,cAAc,UAAU,cAAc,OAAO;AAC/C,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,0CAA0C;AAC9E,UAAM,OAAO,MAAM,IAAI,WAAW,EAAE,UAAU,GAAG;AACjD,WAAO,EAAE,QAAQ,KAAK,MAAM;AAAA,EAC9B;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,yCAAyC;AAC5E,WAAO,EAAE,QAAQ,MAAM,IAAI,UAAU,EAAE,UAAU,GAAG,EAAE;AAAA,EACxD;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,yCAAyC;AAC5E,WAAO,EAAE,QAAQ,MAAM,IAAI,UAAU,EAAE,UAAU,GAAG,EAAE;AAAA,EACxD;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,6CAA6C;AACpF,UAAM,UAAU,MAAM,IAAI,cAAc,EAAE,UAAU,GAAG;AACvD,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AACA,WAAO,EAAE,QAAQ,QAAQ,MAAM;AAAA,EACjC;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,yCAAyC;AAC5E,UAAMC,YAAW,MAAM,IAAI,UAAU,EAAE,UAAU,GAAG;AACpD,UAAMC,YAAW,IAAI,MAAM,qBAAqB,EAAE,OAAO,SAAU,WAAW,KAAK,CAAC;AACpF,WAAO,EAAE,QAAQ,IAAI,MAAM,KAAKD,WAAUC,SAAQ,EAAE;AAAA,EACtD;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,yCAAyC;AAC5E,UAAMD,YAAW,MAAM,IAAI,UAAU,EAAE,UAAU,GAAG;AACpD,UAAMC,YAAW,IAAI,MAAM,qBAAqB,EAAE,OAAO,SAAU,WAAW,KAAK,CAAC;AACpF,WAAO,EAAE,QAAQ,IAAI,MAAM,KAAKD,WAAUC,SAAQ,EAAE;AAAA,EACtD;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,yCAAyC;AAChF,WAAO,EAAE,QAAQ,MAAM,IAAI,cAAc,EAAE,UAAU,GAAG,EAAE;AAAA,EAC5D;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,yCAAyC;AAC5E,WAAO,EAAE,QAAQ,MAAM,IAAI,UAAU,EAAE,UAAU,GAAG,EAAE;AAAA,EACxD;AACA,MAAI,cAAc,SAAS,cAAc,UAAU,cAAc,UAAU,cAAc,QAAQ;AAC/F,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,yCAAyC;AAC5E,WAAO,EAAE,QAAQ,MAAM,IAAI,UAAU,EAAE,UAAU,GAAG,EAAE;AAAA,EACxD;AACA,MAAI,cAAc,SAAS,cAAc,QAAQ;AAC/C,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,0CAA0C;AAC9E,WAAO,EAAE,QAAQ,MAAM,IAAI,WAAW,EAAE,UAAU,GAAG,EAAE;AAAA,EACzD;AACA,QAAM,QAAQ,IAAI,MAAM,MAAM;AAC9B,QAAM,WAAW,IAAI,MAAM,YAAY,GAAG,GAAG,CAAC;AAC9C,QAAM,WAAW,IAAI,MAAM,qBAAqB,EAAE,OAAO,QAAS,CAAC;AACnE,QAAM,OAAO,IAAI,MAAM,KAAK,UAAU,QAAQ;AAC9C,QAAM,IAAI,IAAI;AACd,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS,IAAI,SAAS;AAAA,EACxB;AACF;AAEA,SAAS,YACP,QACA,QACA,UACA,OAMA;AACA,QAAM,MAAM,IAAI,MAAM,KAAK,EAAE,cAAc,MAAM;AACjD,QAAM,OAAO,IAAI,QAAQ,IAAI,MAAM,QAAQ,CAAC;AAC5C,QAAM,SAAS,IAAI,UAAU,IAAI,MAAM,QAAQ,CAAC;AAChD,QAAM,UAAU,KAAK,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC;AAClD,QAAM,WAAW,UAAU;AAC3B,SAAO,SAAS,IAAI,OAAO,IAAI,UAAU,OAAO,IAAI,WAAW,KAAK,OAAO,IAAI,QAAQ;AACvF,SAAO,OAAO,KAAK,IAAI,WAAW,KAAM,IAAI;AAC5C,SAAO,MAAM,WAAW;AACxB,SAAO,uBAAuB;AAC9B,WAAS,OAAO,KAAK,MAAM;AAC3B,WAAS,OAAO;AAChB,SAAO;AAAA,IACL,gBAAgB,OAAO,SAAS,MAAM;AAAA,IACtC,QAAQ,SAAS,OAAO,MAAM;AAAA,IAC9B,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,EACd;AACF;AAkBA,SAAS,cAAc,QAAkC,OAAiD;AACxG,QAAM,MAAM,IAAI,MAAM,KAAK,EAAE,cAAc,MAAM;AACjD,QAAM,OAAO,IAAI,QAAQ,IAAI,MAAM,QAAQ,CAAC;AAC5C,QAAM,SAAS,IAAI,UAAU,IAAI,MAAM,QAAQ,CAAC;AAChD,SAAO;AAAA,IACL,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,UAAU,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAAA,IAC3D,QAAQ,EAAE,GAAG,OAAO,GAAG,GAAG,OAAO,GAAG,GAAG,OAAO,EAAE;AAAA,EAClD;AACF;AAEA,SAAS,uBAAuB,aAA4C;AAC1E,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAClB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,gBAAc,MAAM,UAAK,YAAY,KAAK;AAC1C,gBAAc,MAAM,UAAK,YAAY,MAAM;AAC3C,gBAAc,MAAM,UAAK,YAAY,KAAK;AAC1C,gBAAc,MAAM,sBAAO,YAAY,QAAQ;AAC/C;AAAA,IACE;AAAA,IACA;AAAA,IACA,GAAG,cAAc,YAAY,OAAO,CAAC,CAAC,KAAK,cAAc,YAAY,OAAO,CAAC,CAAC,KAAK,cAAc,YAAY,OAAO,CAAC,CAAC;AAAA,EACxH;AACA,QAAM,OAAO,OAAO,IAAI;AACxB,SAAO;AACT;AAEA,SAAS,cAAc,MAAwB,OAAe,OAA8B;AAC1F,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,OAAK,cAAc;AACnB,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,SAAO,cAAc,OAAO,UAAU,WAAW,cAAc,KAAK,IAAI;AACxE,OAAK,OAAO,MAAM,MAAM;AAC1B;AAEA,SAAS,cAAc,OAAuB;AAC5C,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,KAAK,IAAI,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC;AAC3E,SAAO,QAAQ,QAAQ,UAAU,EAAE;AACrC;AAEA,SAAS,qBAAqB,QAAiD;AAC7E,QAAM,YAAY,oBAAI,IAA8B;AACpD,QAAM,WAAW,oBAAI,IAAa;AAClC,QAAM,QAAQ,oBAAI,IAAY;AAC9B,QAAM,QAAQ,oBAAI,IAAY;AAC9B,MAAI,SAAS;AAEb,SAAO,SAAS,CAAC,UAAU;AACzB,UAAM,OAAO;AACb,QAAI,CAAC,KAAK,YAAY,CAAC,KAAK,UAAU;AACpC;AAAA,IACF;AACA,cAAU;AACV,eAAW,YAAY,mBAAmB,KAAK,QAAQ,GAAG;AACxD,gBAAU,IAAI,QAAQ;AACtB,UAAI,SAAS,MAAM;AACjB,cAAM,IAAI,SAAS,IAAI;AAAA,MACzB;AACA,iBAAW,QAAQ,cAAc;AAC/B,cAAM,UAAW,SAAgD,IAAI;AACrE,YAAI,SAAS;AACX,mBAAS,IAAI,OAAO;AACpB,gBAAM,IAAI,IAAI;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,WAAW,UAAU;AAAA,IACrB,UAAU,SAAS;AAAA,IACnB,OAAO,CAAC,GAAG,KAAK;AAAA,IAChB,OAAO,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC;AAAA,EAC9B;AACF;AAEA,SAAS,oBAAoB,OAAmC;AAC9D,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAClB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AAEpB,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,qBAAmB,MAAM,gBAAM,MAAM,MAAM;AAC3C,qBAAmB,MAAM,gBAAM,MAAM,SAAS;AAC9C,qBAAmB,MAAM,gBAAM,MAAM,QAAQ;AAC7C,qBAAmB,MAAM,gBAAM,MAAM,MAAM,SAAS,IAAI,MAAM,MAAM,KAAK,IAAI,IAAI,GAAG;AACpF,MAAI,MAAM,MAAM,SAAS,GAAG;AAC1B,uBAAmB,MAAM,gBAAM,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,EACvD;AAEA,QAAM,OAAO,OAAO,IAAI;AACxB,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAwB,OAAe,OAA8B;AAC/F,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,OAAK,cAAc;AACnB,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,SAAO,cAAc,OAAO,KAAK;AACjC,OAAK,OAAO,MAAM,MAAM;AAC1B;AAEA,SAAS,cAAc,QAAkC,OAAqC;AAC5F,SAAO,SAAS,CAAC,UAAU;AACzB,UAAM,OAAO;AACb,QAAI,KAAK,UAAU;AACjB,WAAK,SAAS,QAAQ;AAAA,IACxB;AACA,UAAM,WAAW,KAAK;AACtB,eAAW,QAAQ,mBAAmB,QAAQ,GAAG;AAC/C,8BAAwB,IAAI;AAC5B,WAAK,QAAQ;AAAA,IACf;AAAA,EACF,CAAC;AACH;AAEA,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,mBACP,UAC4B;AAC5B,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;AAAA,EACV;AACA,SAAO,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ;AACvD;AAEA,SAAS,wBAAwB,UAA0C;AACzE,aAAW,QAAQ,cAAc;AAC/B,UAAM,UAAW,SAA6E,IAAI;AAClG,aAAS,UAAU;AAAA,EACrB;AACF;;;ACvfA,IAAM,gBAAgB,oBAAI,IAAI,CAAC,WAAW,YAAY,OAAO,OAAO,OAAO,KAAK,CAAC;AACjF,IAAM,mBAA2C;AAAA,EAC/C,wBAAwB;AAAA,EACxB,4BAA4B;AAAA,EAC5B,yBAAyB;AAAA,EACzB,wCAAwC;AAAA,EACxC,oCAAoC;AAAA,EACpC,uBAAuB;AACzB;AAEA,SAAS,iBAAgC;AACvC,QAAM,KAAK;AACX,MAAI,SAAS,eAAe,EAAE,GAAG;AAC/B,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACA,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAI,UAAU;AACd,UAAM,OAAO,MAAM;AACjB,UAAI,CAAC,SAAS;AACZ,kBAAU;AACV,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,SAAK,KAAK;AACV,SAAK,MAAM;AACX,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,UAAU;AACf,aAAS,KAAK,YAAY,IAAI;AAC9B,WAAO,WAAW,MAAM,CAAC;AAAA,EAC3B,CAAC;AACH;AAEO,SAAS,YAA2B;AACzC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,cAAc,IAAI,KAAK,SAAS,KAAK,QAAQ,iBAAiB,KAAK,QAAQ,CAAC;AAAA,IACrF;AAAA,IACA,MAAM,OAAO,KAAK;AAEhB,YAAM,eAAe;AAErB,YAAM,CAAC,GAAG,UAAU,WAAW,OAAOC,MAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC/D,OAAO,SAAS;AAAA,QAChB,OAAO,iBAAiB;AAAA,QACxB,OAAO,mBAAmB;AAAA,QAC1B,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,MAChB,CAAC;AAED,YAAM,UAAU,EAAE,WAAW;AAC7B,YAAM,iBAAiB,SAAS,WAAW;AAC3C,YAAM,eAAe,UAAU,WAAW;AAC1C,YAAM,SAAS,MAAM,WAAW;AAChC,YAAM,WAAWA,OAAM,WAAWA;AAGlC,YAAM,cAAc,QAAQ,KAAK;AAAA,QAC/B,SAAS,sCAAsC,mBAAmB;AAAA;AAAA;AAAA;AAAA,SAIjE;AAAA,QACD,UAAU,CAAC,IAAI,EAAE;AAAA,QACjB,YAAY,CAAC,IAAI,EAAE;AAAA,QACnB,aAAa,CAAC,GAAG,GAAG;AAAA,QACpB,WAAW,sCAAsC,mBAAmB;AAAA;AAAA;AAAA;AAAA,SAInE;AAAA,QACD,YAAY,CAAC,IAAI,EAAE;AAAA,QACnB,cAAc,CAAC,IAAI,EAAE;AAAA,MACvB,CAAC;AACD,cAAQ,OAAO,UAAU,QAAQ,OAAO;AAGxC,YAAM,SAAS,MAAM,gBAAgB,IAAI,IAAI;AAC7C,YAAM,UAAU,MAAM;AAAA,QACpB,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,MAAM,CAAC,UAAmB;AAC1B,cAAM,WAAW,kBAAkB,4CAAc,kBAAkB,OAAO,IAAI,KAAK,IAAI,CAAC;AACxF,YAAI,SAAS,UAAU,IAAI,YAAY;AACvC,YAAI,SAAS,OAAO,QAAQ;AAC5B,eAAO,EAAE,SAAS;AAAA,MACpB,CAAC;AAED,UAAI,cAAc,OAAO,GAAG;AAC1B,eAAO;AAAA,UACL,UAAU;AACR,gBAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,oBAAQ,SAAS,OAAO;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAGA,UAAI,YAAY,QAAQ,cAAc,IAAI,MAAM,gBAAgB,MAAM,OAAO;AAC3E,cAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,iBAAS,YAAY;AAErB,cAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,cAAM,cAAc;AAEpB,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,cAAc;AAEnB,iBAAS,OAAO,OAAO,IAAI;AAC3B,YAAI,SAAS,UAAU,IAAI,YAAY;AACvC,YAAI,SAAS,OAAO,QAAQ;AAE5B,eAAO;AAAA,UACL,UAAU;AACR,gBAAI,SAAS,UAAU,OAAO,YAAY;AAC1C,qBAAS,OAAO;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAGA,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AACpB,YAAM,UAAU,iBAAiB,OAAO;AACxC,cAAQ,OAAO,iBAAiB,OAAO,CAAC;AACxC,UAAI,SAAS,YAAY,OAAO;AAEhC,YAAM,eAAe,SAAS,cAAc,KAAK;AACjD,mBAAa,YAAY;AACzB,cAAQ,YAAY,YAAY;AAChC,UAAI,QAAQ,aAAa,GAAG;AAC1B,qBAAa,OAAO,oBAAoB,CAAC;AAAA,MAC3C,OAAO;AACL,qBAAa,OAAO,gBAAgB,OAAO,CAAC;AAAA,MAC9C;AAEA,YAAM,MAAM,QAAQ,IAAI,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;AAEvD,cAAQ,UAAU,sDAAsD;AAAA,QACtE,aAAa;AAAA,MACf,CAAC,EAAE,MAAM,GAAG;AAGZ,YAAM,eAAe,QAAQ,QAAQ,SAAS;AAAA,QAC5C,OAAO,OAAO;AAAA,UACZ,WAAW;AAAA,UACX,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,WAAW;AAAA,UACX,aAAa;AAAA,UACb,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,QACA,cAAc,CAAC,SAAc,WAAgB;AAC3C,iBAAO,QAAQ,aAAa,QAAQ;AAAA,YAClC,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,QACA,eAAe,CAAC,SAAc,UAAe;AAC3C,gBAAM,QAAQ,QAAQ,YAAY,QAAQ,QAAQ,YAAY,SAAS,QAAQ,YAAY;AAC3F,cAAI,OAAO;AACT,kBAAM,cAAc,OAAO,KAAK,GAAG;AAAA,cACjC,WAAW;AAAA,cACX,WAAW;AAAA,cACX,QAAQ;AAAA,YACV,CAAC;AAAA,UACH;AACA,gBAAM,KAAK;AAAA,YACT,UAAU,OAAY;AACpB,oBAAM,QAAQ,WAAW;AAAA,gBACvB,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,aAAa;AAAA,cACf,CAAC;AACD,oBAAM,QAAQ,eAAe;AAAA,YAC/B;AAAA,YACA,SAAS,OAAY;AACnB,2BAAa,aAAa,MAAM,MAAM;AAAA,YACxC;AAAA,UACF,CAAC;AACD,cAAI,QAAQ,YAAY;AACtB,kBAAM,QAAQ,QAAQ;AACtB,kBAAM,OAAO,OAAO,KAAK,KAAK;AAC9B,gBAAI,KAAK,SAAS,GAAG;AACnB,oBAAM,eAAe,SAAS,cAAc,KAAK;AACjD,2BAAa,YAAY;AAEzB,oBAAM,aAAa,SAAS,cAAc,IAAI;AAC9C,yBAAW,cAAc;AACzB,2BAAa,YAAY,UAAU;AAEnC,oBAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,oBAAM,YAAY;AAElB,yBAAW,OAAO,MAAM;AACtB,sBAAM,MAAM,MAAM,GAAG;AACrB,oBAAI,QAAQ,QAAQ,QAAQ,OAAW;AAEvC,sBAAM,MAAM,SAAS,cAAc,IAAI;AACvC,sBAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,wBAAQ,YAAY;AACpB,wBAAQ,cAAc;AAEtB,sBAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,wBAAQ,YAAY;AACpB,wBAAQ,cAAc,OAAO,QAAQ,WAAW,KAAK,UAAU,GAAG,IAAI,OAAO,GAAG;AAEhF,oBAAI,OAAO,SAAS,OAAO;AAC3B,sBAAM,YAAY,GAAG;AAAA,cACvB;AAEA,2BAAa,YAAY,KAAK;AAC9B,oBAAM,UAAU,YAAY;AAAA,YAC9B;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC,EAAE,MAAM,GAAG;AAGZ,UAAI;AACF,cAAM,SAAS,aAAa,UAAU;AACtC,YAAI,OAAO,QAAQ,GAAG;AACpB,cAAI,UAAU,QAAQ,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;AAC3C,cAAI,eAAe;AAAA,QACrB;AAAA,MACF,SAAS,GAAG;AACV,gBAAQ,KAAK,0CAA0C,CAAC;AAAA,MAC1D;AAEA,YAAM,eAAe,CAAC,GAAG,IAAI,GAAG,EAAE,IAAI,CAAC,UAAU,OAAO,WAAW,MAAM;AACvE,YAAI,eAAe;AAAA,MACrB,GAAG,KAAK,CAAC;AAET,aAAO;AAAA,QACL,SAAS;AACP,cAAI,eAAe;AAAA,QACrB;AAAA,QACA,UAAU;AACR,uBAAa,QAAQ,CAAC,UAAU,OAAO,aAAa,KAAK,CAAC;AAC1D,cAAI,OAAO;AACX,kBAAQ,OAAO;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,WAAmB,YAAiC;AAC7E,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AACrB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,SAAO,cAAc;AACrB,WAAS,OAAO,OAAO,MAAM;AAC7B,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAgB,UAA0B;AACnE,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,EAAE;AAC3E,SAAO,UAAU,GAAG,QAAQ,KAAK,OAAO,KAAK,GAAG,QAAQ;AAC1D;AAEA,SAAS,cAAc,OAAoD;AACzE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,cAAc;AACtE;AASA,SAAS,iBAAiB,SAAkC;AAC1D,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,oBAAkB,KAAK,gBAAM,OAAO,QAAQ,QAAQ,CAAC;AACrD,oBAAkB,KAAK,gBAAM,qBAAqB,QAAQ,cAAc,CAAC;AACzE,oBAAkB,KAAK,4BAAQ,OAAO,QAAQ,aAAa,IAAI,CAAC;AAChE,MAAI,QAAQ,aAAa,OAAO,GAAG;AACjC,sBAAkB,KAAK,4BAAQ,CAAC,GAAG,QAAQ,YAAY,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,EACjF;AACA,MAAI,QAAQ,QAAQ;AAClB,sBAAkB,KAAK,gBAAM,aAAa,QAAQ,MAAM,CAAC;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,SAAS,sBAAmC;AAC1C,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAClB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,SAAO,cAAc;AACrB,QAAM,OAAO,OAAO,MAAM;AAC1B,SAAO;AACT;AAEA,SAAS,gBAAgB,SAAkC;AACzD,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,SAAO,YAAY;AACnB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,SAAO,cAAc,GAAG,QAAQ,QAAQ,4BAAU,qBAAqB,QAAQ,cAAc,CAAC;AAC9F,SAAO,OAAO,OAAO,MAAM;AAC3B,SAAO;AACT;AAEA,SAAS,kBAAkB,QAAqB,OAAe,OAAqB;AAClF,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAM,MAAM,SAAS,cAAc,MAAM;AACzC,MAAI,cAAc;AAClB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,OAAK,OAAO,KAAK,OAAO;AACxB,SAAO,OAAO,IAAI;AACpB;AAEA,SAAS,iBAAiB,SAA0B;AAClD,QAAM,UAAsB;AAAA,IAC1B,UAAU;AAAA,IACV,gBAAgB,oBAAI,IAAI;AAAA,IACxB,cAAc,oBAAI,IAAI;AAAA,EACxB;AACA,aAAW,WAAW,gBAAgB,OAAO,GAAG;AAC9C,YAAQ;AACR,QAAI,QAAQ,cAAc,OAAO,QAAQ,eAAe,UAAU;AAChE,aAAO,KAAK,QAAQ,UAAU,EAAE,QAAQ,CAAC,QAAQ,QAAQ,aAAa,IAAI,GAAG,CAAC;AAAA,IAChF;AACA,sBAAkB,QAAQ,UAAU,OAAO;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAmB;AAC1C,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AACA,MAAI,MAAM,SAAS,uBAAuB,MAAM,QAAQ,MAAM,QAAQ,GAAG;AACvE,WAAO,MAAM;AAAA,EACf;AACA,MAAI,MAAM,SAAS,WAAW;AAC5B,WAAO,CAAC,KAAK;AAAA,EACf;AACA,MAAI,MAAM,QAAQ,MAAM,aAAa;AACnC,WAAO,CAAC,EAAE,MAAM,WAAW,YAAY,CAAC,GAAG,UAAU,MAAM,CAAC;AAAA,EAC9D;AACA,SAAO,CAAC;AACV;AAEA,SAAS,kBAAkB,UAAe,SAA2B;AACnE,MAAI,CAAC,UAAU;AACb,YAAQ,eAAe,IAAI,SAAS,QAAQ,eAAe,IAAI,MAAM,KAAK,KAAK,CAAC;AAChF;AAAA,EACF;AACA,QAAM,OAAO,OAAO,SAAS,QAAQ,SAAS;AAC9C,UAAQ,eAAe,IAAI,OAAO,QAAQ,eAAe,IAAI,IAAI,KAAK,KAAK,CAAC;AAC5E,MAAI,SAAS,wBAAwB,MAAM,QAAQ,SAAS,UAAU,GAAG;AACvE,eAAW,SAAS,SAAS,YAAY;AACvC,wBAAkB,OAAO,OAAO;AAAA,IAClC;AACA;AAAA,EACF;AACA,eAAa,SAAS,SAAS,WAAW;AAC5C;AAEA,SAAS,aAAa,SAAqB,aAA4B;AACrE,MAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/B;AAAA,EACF;AACA,MAAI,OAAO,YAAY,CAAC,MAAM,YAAY,OAAO,YAAY,CAAC,MAAM,UAAU;AAC5E,UAAM,MAAM,YAAY,CAAC;AACzB,UAAM,MAAM,YAAY,CAAC;AACzB,QAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,GAAG,GAAG;AAClD;AAAA,IACF;AACA,UAAM,SAAS,QAAQ,UAAU,CAAC,KAAK,KAAK,KAAK,GAAG;AACpD,WAAO,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG;AACnC,WAAO,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG;AACnC,WAAO,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG;AACnC,WAAO,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG;AACnC,YAAQ,SAAS;AACjB;AAAA,EACF;AACA,aAAW,QAAQ,aAAa;AAC9B,iBAAa,SAAS,IAAI;AAAA,EAC5B;AACF;AAEA,SAAS,qBAAqB,QAAqC;AACjE,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE,EACzC,KAAK,IAAI,KAAK;AACnB;AAEA,SAAS,aAAa,QAAkD;AACtE,SAAO,OAAO,IAAI,CAAC,UAAU,OAAO,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI;AAClE;AAEA,eAAe,eACb,MACA,QACA,cACA,gBACA,QACA,UACc;AACd,QAAM,MAAM,cAAc,MAAM,gBAAgB,EAAE,YAAY;AAE9D,MAAI,QAAQ,WAAW;AACrB,UAAM,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM;AAC5C,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AAEA,MAAI,QAAQ,YAAY;AACtB,UAAM,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM;AAC5C,UAAM,WAAW,KAAK,MAAM,IAAI;AAChC,UAAM,kBAAyB,CAAC;AAChC,eAAW,OAAO,OAAO,KAAK,SAAS,OAAO,GAAG;AAC/C,YAAM,UAAU,eAAe,QAAQ,UAAU,SAAS,QAAQ,GAAG,CAAC;AACtE,UAAI,QAAQ,SAAS,qBAAqB;AACxC,wBAAgB,KAAK,GAAG,QAAQ,QAAQ;AAAA,MAC1C,OAAO;AACL,wBAAgB,KAAK,OAAO;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,QAAQ,OAAO;AACjB,UAAM,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM;AAC5C,UAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,MAAM,UAAU;AAC5D,WAAO,aAAa,IAAI,GAAG;AAAA,EAC7B;AAEA,MAAI,QAAQ,OAAO;AACjB,UAAM,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM;AAC5C,UAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,MAAM,UAAU;AAC5D,WAAO,aAAa,IAAI,GAAG;AAAA,EAC7B;AAEA,MAAI,QAAQ,OAAO;AACjB,UAAM,MAAM,MAAM,SAAS,UAAU,MAAM;AAC3C,UAAM,UAAe,OAAO,OAAO,IAAI,KAAK,EAAE,KAAK,CAAC,MAAW,EAAE,KAAK,YAAY,EAAE,SAAS,MAAM,CAAC;AACpG,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AACA,UAAM,UAAU,MAAM,QAAQ,MAAM,MAAM;AAC1C,UAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,SAAS,UAAU;AAC/D,WAAO,aAAa,IAAI,GAAG;AAAA,EAC7B;AAEA,MAAI,QAAQ,OAAO;AACjB,UAAM,KAAK,IAAI,WAAW,MAAM;AAChC,UAAM,QAAQ,GAAG,CAAC,MAAM,MAAQ,GAAG,CAAC,MAAM,MAAQ,GAAG,CAAC,MAAM,KAAQ,GAAG,CAAC,MAAM;AAC9E,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AACA,UAAM,SAAS,MAAM,OAAO,MAAM;AAClC,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,YAAM,WAAkB,CAAC;AACzB,iBAAW,QAAQ,QAAQ;AACzB,YAAI,KAAK,SAAS,qBAAqB;AACrC,mBAAS,KAAK,GAAG,KAAK,QAAQ;AAAA,QAChC,WAAW,KAAK,SAAS,WAAW;AAClC,mBAAS,KAAK,IAAI;AAAA,QACpB;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,MAAI;AACF,UAAM,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM;AAC5C,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,UAAM,IAAI,MAAM,2BAA2B,GAAG,EAAE;AAAA,EAClD;AACF;;;ACxfA,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,qBAA6C;AAAA,EACjD,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,cAAc;AAAA,EACd,iCAAiC;AAAA,EACjC,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,oBAAoB;AAAA,EACpB,kCAAkC;AAAA,EAClC,oBAAoB;AACtB;AAEA,IAAM,iBAAiB,IAAI,IAAI,OAAO,KAAK,kBAAkB,CAAC;AAEvD,SAAS,cAA6B;AAC3C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AACV,aAAO,gBAAgB,IAAI,KAAK,SAAS,KAAK,eAAe,IAAI,KAAK,QAAQ;AAAA,IAChF;AAAA,IACA,MAAM,OAAO,KAAK;AAChB,YAAM,QAAQ,YAAY,WAAW;AACrC,UAAI,SAAS,OAAO,KAAK;AACzB,YAAM,MAAM,gBAAgB,IAAI,IAAI;AACpC,YAAM,aAAa,QAAQ,IAAI,KAAK,GAAG;AACvC,YAAM,YAAY,cAAc,IAAI,MAAM,kBAAkB,EAAE,YAAY;AAC1E,YAAM,QAAQ,IAAI,WAAW,MAAM,gBAAgB,IAAI,IAAI,EAAE,MAAM,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC;AAE5F,YAAM,UAAU,cAAc,WAAW,SAAS,CAAC;AACnD,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AACpB,iBAAW,SAAS,gBAAM,IAAI,KAAK,IAAI;AACvC,iBAAW,SAAS,gBAAM,YAAY,IAAI,SAAS,KAAK,IAAI,KAAK,YAAY,cAAI;AACjF,iBAAW,SAAS,gBAAMC,aAAY,IAAI,KAAK,QAAQ,MAAM,UAAU,CAAC;AACxE,iBAAW,SAAS,gBAAMC,eAAc,KAAK,CAAC;AAE9C,YAAM,OAAO,SAAS,cAAc,GAAG;AACvC,WAAK,cAAc,cAAc,SAAS;AAE1C,YAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,eAAS,YAAY;AACrB,eAAS,OAAO;AAChB,eAAS,WAAW,IAAI,KAAK;AAC7B,eAAS,cAAc;AAEvB,cAAQ,OAAO,SAAS,MAAM,QAAQ;AACtC,UAAI,YAAY,SAAS,GAAG;AAC1B,gBAAQ,OAAO,MAAM,kBAAkB,WAAW,KAAK,IAAI,KAAK,MAAM,KAAK,CAAC;AAAA,MAC9E;AACA,UAAI,cAAc,QAAQ;AACxB,gBAAQ,OAAO,kBAAkB,KAAK,CAAC;AAAA,MACzC;AACA,UAAI,cAAc,SAAS,cAAc,OAAO;AAC9C,gBAAQ,OAAO,uBAAuB,KAAK,CAAC;AAAA,MAC9C;AACA,UAAI,cAAc,YAAY,cAAc,aAAa,cAAc,MAAM;AAC3E,gBAAQ,OAAO,oBAAoB,KAAK,CAAC;AAAA,MAC3C;AACA,UAAI,cAAc,WAAW;AAC3B,gBAAQ,OAAO,qBAAqB,KAAK,CAAC;AAAA,MAC5C;AACA,UAAI,cAAc,QAAQ;AACxB,gBAAQ,OAAO,kBAAkB,KAAK,CAAC;AAAA,MACzC;AACA,UAAI,cAAc,cAAc;AAC9B,gBAAQ,OAAO,wBAAwB,KAAK,CAAC;AAAA,MAC/C;AACA,UAAI,cAAc,QAAQ,cAAc,SAAS,cAAc,MAAM;AACnE,gBAAQ,OAAO,wBAAwB,KAAK,CAAC;AAAA,MAC/C;AACA,YAAM,UAAU,iBAAiB,KAAK;AACtC,UAAI,SAAS;AACX,gBAAQ,OAAO,OAAO;AAAA,MACxB;AACA,YAAM,OAAO,OAAO;AAEpB,aAAO;AAAA,QACL,UAAU;AACR,0BAAgB,KAAK,UAAU;AAC/B,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,WAAW,WAA2B;AAC7C,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,CAAC,OAAO,OAAO,MAAM,OAAO,IAAI,EAAE,SAAS,SAAS,GAAG;AACzD,WAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU,WAAW,MAAM,WAAW,MAAM,EAAE,SAAS,SAAS,GAAG;AACtE,WAAO;AAAA,EACT;AACA,MAAI,cAAc,QAAQ;AACxB,WAAO;AAAA,EACT;AACA,MAAI,cAAc,cAAc;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,cAAc,WAA2B;AAChD,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,cAAc,SAAS,cAAc,OAAO;AAC9C,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,OAAO,IAAI,EAAE,SAAS,SAAS,GAAG;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU,WAAW,IAAI,EAAE,SAAS,SAAS,GAAG;AACnD,WAAO;AAAA,EACT;AACA,MAAI,cAAc,aAAa,cAAc,QAAQ;AACnD,WAAO;AAAA,EACT;AACA,MAAI,cAAc,QAAQ;AACxB,WAAO;AAAA,EACT;AACA,MAAI,cAAc,cAAc;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,YAAY,WAA4B;AAC/C,SAAO,CAAC,OAAO,OAAO,QAAQ,SAAS,KAAK,EAAE,SAAS,SAAS;AAClE;AAEA,eAAe,kBAAkB,WAAmB,KAAa,UAAkB,OAAyC;AAC1H,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AAEpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AAEtB,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,SAAO,YAAY;AACnB,SAAO,cAAc;AAErB,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,cAAc;AAEtB,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,YAAY;AAEjB,UAAQ,OAAO,SAAS,QAAQ,SAAS,IAAI;AAE7C,MAAI,EAAE,cAAc,WAAW,CAAC,SAAS,OAAO;AAC9C,SAAK,cAAc;AACnB,YAAQ,OAAO,sBAAsB,OAAO,SAAS,CAAC;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,SAAS,QAAQ,iBAAiB,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;AAC1E,QAAM,SAAS,eAAe,SAAS;AACvC,QAAM,SAAS,SAAS,QAAQ,GAAG,cAAc,MAAM,OAAO,QAAQ,GAAG;AAEzE,MAAI;AACF,UAAM,WAAW,IAAI,SAAS,QAAQ,MAAM;AAC5C,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,aAAS,MAAM,IAAI,MAAM;AACzB,WAAO,MAAM,aAAa,IAAI,MAAM;AACpC,YAAQ,MAAM,aAAa,IAAI,MAAM;AACrC,SAAK,cAAc;AAAA,EACrB,SAAS,OAAO;AACd,SAAK,cAAc,yDAAY,iBAAiB,QAAQ,MAAM,UAAU,4FAAiB;AAAA,EAC3F;AAEA,UAAQ,OAAO,sBAAsB,OAAO,SAAS,CAAC;AACtD,SAAO;AACT;AAEA,SAAS,eAAe,WAA2B;AACjD,QAAM,MAA8B;AAAA,IAClC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP;AACA,SAAO,IAAI,SAAS,KAAK;AAC3B;AAgCA,SAAS,sBAAsB,OAAmB,WAAgC;AAChF,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AAEpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,cAAc,OAAO,SAAS;AAC7C,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,gBAAM,OAAO,aAAa,MAAM;AACpD,aAAW,SAAS,UAAU,OAAO,UAAU,cAAI;AACnD,aAAW,SAAS,sBAAO,OAAO,OAAO,MAAM;AAC/C,MAAI,OAAO,kBAAkB,QAAW;AACtC,eAAW,SAAS,4BAAQD,aAAY,OAAO,aAAa,CAAC;AAAA,EAC/D;AACA,aAAW,QAAQ,OAAO,QAAQ,CAAC,GAAG;AACpC,eAAW,SAAS,KAAK,OAAO,KAAK,KAAK;AAAA,EAC5C;AACA,UAAQ,OAAO,OAAO;AAEtB,MAAI,OAAO,OAAO;AAChB,UAAM,OAAO,SAAS,cAAc,GAAG;AACvC,SAAK,YAAY;AACjB,SAAK,cAAc,OAAO;AAC1B,YAAQ,OAAO,IAAI;AAAA,EACrB;AAEA,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,YAAQ,OAAO,oBAAoB,QAAQ,OAAO,MAAM,IAAI,CAAC,UAAU,EAAE,KAAK,KAAK,OAAO,OAAO,KAAK,MAAM,EAAE,CAAC,CAAC;AAAA,EAClH;AAEA,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,YAAQ,OAAO,uBAAuB,OAAO,MAAM,CAAC;AAAA,EACtD;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,QAAuC;AACrE,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AAEpB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,aAAW,SAAS,CAAC,OAAO,UAAU,UAAU,cAAc,UAAU,GAAG;AACzE,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,cAAc;AACjB,YAAQ,OAAO,EAAE;AAAA,EACnB;AACA,QAAM,OAAO,OAAO;AAEpB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,aAAW,SAAS,OAAO,MAAM,GAAG,EAAE,GAAG;AACvC,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,eAAW,SAAS;AAAA,MAClB,MAAM;AAAA,MACN,KAAK,MAAM,OAAO,SAAS,EAAE,EAAE,YAAY,CAAC;AAAA,MAC5CA,aAAY,MAAM,MAAM;AAAA,MACxB,MAAM,qBAAqB,SAAY,MAAMA,aAAY,MAAM,gBAAgB;AAAA,MAC/E,MAAM,aAAa,SAAY,MAAM,KAAK,MAAM,SAAS,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC;AAAA,IACtG,GAAG;AACD,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,WAAK,cAAc;AACnB,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,UAAM,OAAO,GAAG;AAAA,EAClB;AACA,QAAM,OAAO,OAAO,KAAK;AACzB,UAAQ,OAAO,OAAO,KAAK;AAC3B,SAAO;AACT;AAEA,SAAS,cAAc,OAAmB,WAA6B;AACrE,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO,EAAE,OAAO,OAAO,OAAO,kFAAiB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EACvE;AACA,QAAM,YAAYE,SAAQ,OAAO,GAAG,CAAC;AACrC,MAAI,cAAc,QAAQ;AACxB,WAAO,cAAc,KAAK;AAAA,EAC5B;AACA,MAAI,cAAc,QAAQ;AACxB,WAAO,eAAe,KAAK;AAAA,EAC7B;AACA,MAAI,cAAc,OAAO;AACvB,WAAO,aAAa,KAAK;AAAA,EAC3B;AACA,SAAO,cAAc,OAAO,GAAG,MAAM;AACvC;AAEA,SAAS,cAAc,OAAmB,QAAgB,WAA6B;AACrF,MAAI,SAAS,KAAK,MAAM,QAAQ;AAC9B,WAAO,EAAE,OAAO,OAAO,OAAO,kFAAgC,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EACtF;AACA,QAAM,SAAS,WAAW,OAAO,MAAM;AACvC,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,OAAO,OAAO,OAAO,sEAAmC,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EACzF;AACA,QAAMC,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,aAAaA,MAAK,UAAU,SAAS,GAAG,KAAK;AACnD,QAAM,eAAe,SAAS,KAAK,aAAa;AAChD,MAAI,cAAc,KAAK,eAAe,MAAM,QAAQ;AAClD,WAAO,EAAE,OAAO,OAAO,OAAO,qEAAmB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EACzE;AACA,QAAM,SAA2B,CAAC;AAClC,WAAS,QAAQ,GAAG,QAAQ,YAAY,SAAS;AAC/C,UAAM,cAAc,SAAS,KAAK,QAAQ;AAC1C,WAAO,KAAK;AAAA,MACV,KAAKD,SAAQ,OAAO,aAAa,CAAC;AAAA,MAClC,UAAUC,MAAK,UAAU,cAAc,GAAG,KAAK;AAAA,MAC/C,QAAQA,MAAK,UAAU,cAAc,GAAG,KAAK;AAAA,MAC7C,QAAQA,MAAK,UAAU,cAAc,IAAI,KAAK;AAAA,IAChD,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,mBAAmB,OAAO,OAAO,KAAK,CAAC,UAAU,MAAM,QAAQ,MAAM,CAAC;AAAA,EAC/E;AACF;AAEA,SAAS,cAAc,OAA6B;AAClD,MAAI,MAAM,SAAS,IAAI;AACrB,WAAO,EAAE,OAAO,OAAO,OAAO,4EAAqB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EAC3E;AACA,QAAMA,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,aAAaA,MAAK,UAAU,IAAI,KAAK;AAC3C,QAAM,eAAe,KAAK,aAAa;AACvC,MAAI,cAAc,KAAK,eAAe,MAAM,QAAQ;AAClD,WAAO,EAAE,OAAO,OAAO,OAAO,qEAAmB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EACzE;AACA,QAAM,SAA2B,CAAC;AAClC,WAAS,QAAQ,GAAG,QAAQ,YAAY,SAAS;AAC/C,UAAM,cAAc,KAAK,QAAQ;AACjC,WAAO,KAAK;AAAA,MACV,KAAKD,SAAQ,OAAO,aAAa,CAAC;AAAA,MAClC,QAAQC,MAAK,UAAU,cAAc,GAAG,KAAK;AAAA,MAC7C,kBAAkBA,MAAK,UAAU,cAAc,GAAG,KAAK;AAAA,MACvD,QAAQA,MAAK,UAAU,cAAc,IAAI,KAAK;AAAA,MAC9C,UAAUA,MAAK,UAAU,cAAc,IAAI,KAAK;AAAA,IAClD,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,WAAW;AAAA,IACX,QAAQ,WAAW,OAAO,CAAC,KAAKD,SAAQ,OAAO,GAAG,CAAC;AAAA,IACnD;AAAA,IACA,OAAO,mBAAmB,OAAO,OAAO,KAAK,CAAC,UAAU,MAAM,QAAQ,UAAU,MAAM,qBAAqB,MAAM,MAAM,CAAC;AAAA,IACxH,eAAeC,MAAK,UAAU,IAAI,KAAK;AAAA,EACzC;AACF;AAEA,SAAS,eAAe,OAA6B;AACnD,MAAI,MAAM,SAAS,IAAI;AACrB,WAAO,EAAE,OAAO,OAAO,OAAO,6EAAsB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EAC5E;AACA,QAAMA,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,aAAaA,MAAK,UAAU,IAAI,KAAK;AAC3C,MAAI,SAAS;AACb,QAAM,SAA2B,CAAC;AAClC,WAAS,QAAQ,GAAG,QAAQ,YAAY,SAAS;AAC/C,QAAI,UAAU,MAAM,QAAQ;AAC1B,aAAO,EAAE,OAAO,OAAO,OAAO,sEAAoB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,IAC1E;AACA,UAAM,QAAQ,MAAM,QAAQ;AAC5B,UAAM,WAAW,QAAQ;AACzB,QAAI,MAAM,mBAAmB,QAAQ;AACrC,QAAI,aAAa,IAAM;AACrB,UAAI,SAAS,IAAI,MAAM,QAAQ;AAC7B,eAAO,EAAE,OAAO,OAAO,OAAO,iFAA0B,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,MAChF;AACA,YAAMD,SAAQ,OAAO,QAAQ,CAAC;AAC9B,gBAAU;AAAA,IACZ;AACA,UAAM,iBAAiB,cAAc,OAAO,MAAM;AAClD,QAAI,CAAC,gBAAgB;AACnB,aAAO,EAAE,OAAO,OAAO,OAAO,4EAAqB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,IAC3E;AACA,aAAS,eAAe;AACxB,QAAI;AACJ,UAAM,gBAAgB,QAAQ,SAAU,KAAM,QAAQ,WAAW,QAAQ,SAAU,KAAO,QAAQ,WAAW,QAAQ,SAAU;AAC/H,QAAI,gBAAgB,QAAQ,QAAQ;AAClC,YAAM,cAAc,cAAc,OAAO,MAAM;AAC/C,UAAI,CAAC,aAAa;AAChB,eAAO,EAAE,OAAO,OAAO,OAAO,8DAAgC,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,MACtF;AACA,0BAAoB,YAAY;AAChC,eAAS,YAAY;AAAA,IACvB;AACA,WAAO,KAAK;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,eAAe;AAAA,MACvB,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,WAAW;AAAA,IACX,QAAQ,WAAW,OAAO,CAAC,KAAKA,SAAQ,OAAO,GAAG,CAAC;AAAA,IACnD;AAAA,IACA,OAAO,CAAC;AAAA,IACR,eAAeC,MAAK,UAAU,IAAI,KAAK;AAAA,IACvC,MAAM;AAAA,MACJ,EAAE,OAAO,4BAAQ,OAAOH,aAAYG,MAAK,UAAU,IAAI,KAAK,CAAC,EAAE;AAAA,MAC/D,EAAE,OAAO,QAAQ,OAAOA,MAAK,UAAU,IAAI,KAAK,IAAI,IAAI,GAAGH,aAAYG,MAAK,UAAU,IAAI,KAAK,CAAC,CAAC,QAAQA,MAAK,UAAU,IAAI,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,CAAC,KAAK,SAAI;AAAA,MACtK,EAAE,OAAO,WAAW,OAAOA,MAAK,UAAU,IAAI,KAAK,IAAI,IAAI,GAAGH,aAAYG,MAAK,UAAU,IAAI,KAAK,CAAC,CAAC,QAAQA,MAAK,UAAU,IAAI,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,CAAC,KAAK,SAAI;AAAA,IAC3K;AAAA,IACA,OAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,OAA6B;AACjD,MAAI,MAAM,SAAS,IAAI;AACrB,WAAO,EAAE,OAAO,OAAO,OAAO,2EAAoB,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EAC1E;AACA,QAAMA,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,UAAUA,MAAK,UAAU,GAAG,IAAI;AACtC,QAAM,eAAeA,MAAK,UAAU,GAAG,IAAI;AAC3C,QAAM,UAAUA,MAAK,UAAU,GAAG,IAAI;AACtC,QAAM,QAAQA,MAAK,UAAU,IAAI,IAAI;AACrC,QAAM,SAAS,MAAM,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG;AACzG,QAAM,UAAU,MAAM,EAAE;AACxB,QAAM,SAAS,MAAM,EAAE;AACvB,QAAM,SAASA,MAAK,UAAU,IAAI,IAAI;AACtC,MAAI,SAAS;AACb,QAAM,QAA0B,CAAC;AACjC,QAAM,SAAgE;AAAA,IACpE,EAAE,IAAI,GAAG,OAAO,UAAU,QAAQ,KAAK;AAAA,IACvC,EAAE,IAAI,GAAG,OAAO,aAAa,QAAQ,KAAK;AAAA,IAC1C,EAAE,IAAI,GAAG,OAAO,WAAW,QAAQ,KAAK;AAAA,IACxC,EAAE,IAAI,GAAG,OAAO,aAAa,QAAQ,KAAK;AAAA,IAC1C,EAAE,IAAI,GAAG,OAAO,gBAAgB,QAAQ,MAAM;AAAA,EAChD;AACA,aAAW,SAAS,QAAQ;AAC1B,UAAM,aAAa,mBAAmB,OAAO,QAAQ,MAAM,MAAM;AACjE,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AACA,aAAS,WAAW;AACpB,QAAI,MAAM,KAAK,KAAK,WAAW,OAAO;AACpC,YAAM,KAAK,EAAE,IAAI,MAAM,IAAI,OAAO,MAAM,OAAO,OAAO,WAAW,MAAM,CAAC;AAAA,IAC1E;AAAA,EACF;AACA,MAAI,SAAS,KAAK,MAAM,QAAQ;AAC9B,cAAU;AAAA,EACZ;AACA,QAAM,aAAa,uBAAuB,OAAO,MAAM;AACvD,QAAM,WAAW,eAAe,SAAY,SAAY,cAAc,OAAO,YAAY,mBAAmB;AAC5G,SAAO;AAAA,IACL,OAAO;AAAA,IACP,WAAW;AAAA,IACX,QAAQ,UAAU,QAAQ,SAAS,SAAS;AAAA,IAC5C,QAAQ,UAAU,QAAQ,SAAS,SAAS,CAAC;AAAA,IAC7C,OAAO,UAAU,SAAS,SAAS,MAAM,SAAS,IAAI,SAAS,QAAQ;AAAA,IACvE,eAAe,gBAAgB;AAAA,IAC/B,MAAM;AAAA,MACJ,EAAE,OAAO,oBAAU,OAAO,UAAUH,aAAY,OAAO,IAAI,qBAAM;AAAA,MACjE,EAAE,OAAO,gBAAM,OAAO,KAAK,QAAQ,SAAS,EAAE,EAAE,YAAY,CAAC,GAAG;AAAA,MAChE,EAAE,OAAO,SAAS,OAAO,KAAK,MAAM,SAAS,EAAE,EAAE,YAAY,CAAC,GAAG;AAAA,MACjE,EAAE,OAAO,UAAU,OAAO,UAAU,qBAAM;AAAA,MAC1C,EAAE,OAAO,UAAU,OAAO,SAAS,WAAM,SAAI;AAAA,MAC7C,EAAE,OAAO,WAAW,OAAO,QAAQ;AAAA,MACnC,EAAE,OAAO,UAAU,OAAO,OAAO;AAAA,MACjC,EAAE,OAAO,qBAAW,OAAO,eAAe,SAAY,uBAAQ,KAAK,WAAW,SAAS,EAAE,EAAE,YAAY,CAAC,GAAG;AAAA,IAC7G;AAAA,IACA,OAAO,UAAU,QAAQ,SAAY;AAAA,EACvC;AACF;AAEA,SAAS,mBAAmB,OAAmB,QAAgB,QAAgE;AAC7H,QAAMG,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,MAAI,QAAQ;AACV,QAAI,SAAS,IAAI,MAAM,QAAQ;AAC7B,aAAO;AAAA,IACT;AACA,cAAU;AAAA,EACZ;AACA,MAAI,SAAS,IAAI,MAAM,QAAQ;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,SAASA,MAAK,UAAU,QAAQ,IAAI;AAC1C,YAAU;AACV,MAAI,SAAS,SAAS,MAAM,QAAQ;AAClC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,SAAS,IAAI,gBAAgB,MAAM,MAAM,QAAQ,SAAS,MAAM,CAAC,IAAI;AACnF,SAAO,EAAE,OAAO,QAAQ,SAAS,OAAO;AAC1C;AAEA,SAAS,mBAAmB,OAAuB;AACjD,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,KAAK,KAAK,KAAK,SAAS,KAAK;AACtC;AAEA,SAAS,cAAc,OAAmB,QAA+D;AACvG,MAAI,UAAU,MAAM,QAAQ;AAC1B,WAAO;AAAA,EACT;AACA,QAAM,OAAO,MAAM,QAAQ;AAC3B,MAAI,SAAS,KAAK;AAChB,QAAI,SAAS,IAAI,MAAM,QAAQ;AAC7B,aAAO;AAAA,IACT;AACA,WAAO,EAAE,OAAQ,MAAM,MAAM,KAAK,IAAK,MAAM,SAAS,CAAC,GAAG,QAAQ,SAAS,EAAE;AAAA,EAC/E;AACA,MAAI,SAAS,KAAK;AAChB,QAAI,UAAU,MAAM,QAAQ;AAC1B,aAAO;AAAA,IACT;AACA,WAAO,EAAE,OAAO,MAAM,MAAM,IAAI,KAAK,QAAQ,SAAS,EAAE;AAAA,EAC1D;AACA,MAAI,SAAS,KAAK;AAChB,QAAI,UAAU,MAAM,QAAQ;AAC1B,aAAO;AAAA,IACT;AACA,WAAO,EAAE,OAAO,MAAM,MAAM,IAAI,KAAK,QAAQ,SAAS,EAAE;AAAA,EAC1D;AACA,SAAO,EAAE,OAAO,MAAM,OAAO;AAC/B;AAEA,SAAS,gBAAgB,OAA2B;AAClD,QAAM,OAAO,cAAc,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK;AAC5D,SAAO,QAAQ,IAAI,YAAY,QAAQ,EAAE,OAAO,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK;AACnF;AAEA,SAAS,cAAc,OAA2B;AAChD,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,IAAI,MAAM,QAAQ,SAAS,GAAG;AACxD,aAAS,OAAO,aAAa,MAAM,KAAK,IAAK,MAAM,QAAQ,CAAC,KAAK,CAAE;AAAA,EACrE;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAmB,OAAmC;AACpF,WAAS,SAAS,KAAK,IAAI,GAAG,KAAK,GAAG,SAAS,MAAM,MAAM,QAAQ,UAAU;AAC3E,UAAM,SAAS,WAAW,OAAO,MAAM;AACvC,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,UAAM,aAAc,MAAM,SAAS,CAAC,KAAK,IAAK,MAAM,SAAS,CAAC;AAC9D,UAAM,eAAe,SAAS,KAAK,aAAa;AAChD,QAAI,aAAa,KAAK,gBAAgB,MAAM,QAAQ;AAClD,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAmB,QAAoC;AACzE,MAAI,SAAS,IAAI,MAAM,QAAQ;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,QAAQD,SAAQ,OAAO,QAAQ,CAAC;AACtC,MAAI,UAAU,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,MAAM,MAAM,KAAQ,MAAM,SAAS,CAAC,MAAM,KAAQ,MAAM,SAAS,CAAC,MAAM,KAAQ,MAAM,SAAS,CAAC,MAAM,GAAM;AACpH,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAmB,OAA0C;AACvF,MAAI,CAAC,SAAS,MAAM,SAAS,MAAM,SAAS,MAAM,UAAU,MAAM,SAAS,GAAG;AAC5E,WAAO,CAAC;AAAA,EACV;AACA,QAAMC,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,SAAS,MAAM;AACrB,QAAM,QAAQA,MAAK,UAAU,SAAS,GAAG,KAAK;AAC9C,QAAM,gBAAgBA,MAAK,UAAU,SAAS,GAAG,KAAK;AACtD,QAAM,aAAa,SAAS,IAAI,QAAQ;AACxC,MAAI,aAAa,MAAM,UAAU,gBAAgB,MAAM,QAAQ;AAC7D,WAAO,CAAC;AAAA,EACV;AACA,QAAM,SAAS,oBAAI,IAAoB;AAAA,IACrC,CAAC,GAAG,QAAQ;AAAA,IACZ,CAAC,GAAG,WAAW;AAAA,IACf,CAAC,GAAG,WAAW;AAAA,IACf,CAAC,GAAG,SAAS;AAAA,IACb,CAAC,GAAG,iBAAiB;AAAA,IACrB,CAAC,GAAG,cAAc;AAAA,IAClB,CAAC,IAAI,SAAS;AAAA,IACd,CAAC,IAAI,oBAAoB;AAAA,IACzB,CAAC,IAAI,uBAAuB;AAAA,EAC9B,CAAC;AACD,QAAM,QAAQ,oBAAI,IAA4B;AAC9C,WAAS,QAAQ,GAAG,QAAQ,OAAO,SAAS;AAC1C,UAAM,eAAe,SAAS,IAAI,QAAQ;AAC1C,UAAM,aAAaA,MAAK,UAAU,cAAc,KAAK;AACrD,UAAM,aAAaA,MAAK,UAAU,eAAe,GAAG,KAAK;AACzD,UAAM,aAAaA,MAAK,UAAU,eAAe,GAAG,KAAK;AACzD,UAAM,SAASA,MAAK,UAAU,eAAe,GAAG,KAAK;AACrD,UAAM,SAASA,MAAK,UAAU,eAAe,GAAG,KAAK;AACrD,UAAM,eAAeA,MAAK,UAAU,eAAe,IAAI,KAAK;AAC5D,UAAM,QAAQ,OAAO,IAAI,MAAM;AAC/B,QAAI,CAAC,SAAS,MAAM,IAAI,MAAM,GAAG;AAC/B;AAAA,IACF;AACA,UAAM,QAAQ,SAAS,gBAAgB;AACvC,UAAM,MAAM,QAAQ;AACpB,QAAI,MAAM,MAAM,UAAU,MAAM,SAAS,MAAM,QAAQ;AACrD;AAAA,IACF;AACA,UAAM,QAAQ,eAAe,MAAM,MAAM,OAAO,GAAG,GAAG,YAAY,UAAU,EAAE,KAAK;AACnF,QAAI,OAAO;AACT,YAAM,IAAI,QAAQ,EAAE,IAAI,QAAQ,OAAO,aAAa,GAAG,KAAK,KAAK,WAAW,SAAS,EAAE,EAAE,YAAY,CAAC,MAAM,OAAO,MAAM,CAAC;AAAA,IAC5H;AAAA,EACF;AACA,SAAO,CAAC,GAAG,MAAM,OAAO,CAAC;AAC3B;AAEA,SAAS,eAAe,OAAmB,YAAoB,YAA4B;AACzF,MAAI,eAAe,KAAK,eAAe,KAAM,eAAe,KAAK,eAAe,GAAI;AAClF,WAAO,cAAc,KAAK;AAAA,EAC5B;AACA,SAAO,IAAI,YAAY,QAAQ,EAAE,OAAO,KAAK;AAC/C;AAEA,SAAS,cAAc,OAA2B;AAChD,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,IAAI,MAAM,QAAQ,SAAS,GAAG;AACxD,aAAS,OAAO,aAAc,MAAM,KAAK,KAAK,IAAK,MAAM,QAAQ,CAAC,CAAC;AAAA,EACrE;AACA,SAAO;AACT;AA+BA,SAAS,kBAAkB,OAAgC;AACzD,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,SAAS,UAAU,KAAK;AAE9B,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,gBAAM,OAAO,WAAW,cAAI;AAChD,aAAW,SAAS,YAAY,OAAO,SAAS,MAAM;AACtD,aAAW,SAAS,WAAW,OAAO,QAAQ,MAAM;AACpD,aAAW,SAAS,WAAW,OAAO,QAAQ,MAAM;AACpD,UAAQ,OAAO,OAAO;AAEtB,UAAQ,OAAO,uBAAuB,OAAO,QAAQ,CAAC;AACtD,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,YAAQ,OAAO,eAAe,gBAAM,OAAO,QAAQ,IAAI,CAAC,SAAS,GAAG,KAAK,MAAM,IAAI,KAAK,IAAI,SAAM,KAAK,IAAI,EAAE,CAAC,CAAC;AAAA,EACjH;AACA,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,YAAQ,OAAO,eAAe,gBAAM,OAAO,QAAQ,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,SAAM,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;AAAA,EACjH;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,UAAsC;AACpE,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,YAAY;AAClB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,aAAW,SAAS,CAAC,WAAW,gBAAM,cAAI,GAAG;AAC3C,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,cAAc;AACjB,WAAO,OAAO,EAAE;AAAA,EAClB;AACA,QAAM,OAAO,MAAM;AACnB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,aAAW,WAAW,SAAS,MAAM,GAAG,EAAE,GAAG;AAC3C,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc,QAAQ,aAAa,GAAG,QAAQ,IAAI,KAAK,QAAQ,UAAU,MAAM,QAAQ;AAC5F,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAcH,aAAY,QAAQ,IAAI;AAC3C,UAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,WAAO,cAAc,KAAK,QAAQ,OAAO,SAAS,EAAE,EAAE,YAAY,CAAC;AACnE,QAAI,OAAO,MAAM,MAAM,MAAM;AAC7B,UAAM,OAAO,GAAG;AAAA,EAClB;AACA,QAAM,OAAO,OAAO,KAAK;AACzB,SAAO;AACT;AAEA,SAAS,eAAe,WAAmB,MAA6B;AACtE,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,UAAQ,OAAO;AACf,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,cAAc,GAAG,SAAS,IAAI,KAAK,MAAM;AACjD,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,aAAW,OAAO,KAAK,MAAM,GAAG,GAAG,GAAG;AACpC,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc;AACnB,SAAK,OAAO,IAAI;AAAA,EAClB;AACA,MAAI,KAAK,SAAS,KAAK;AACrB,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,cAAc,gBAAM,KAAK,SAAS,GAAG;AAC1C,SAAK,OAAO,IAAI;AAAA,EAClB;AACA,UAAQ,OAAO,SAAS,IAAI;AAC5B,SAAO;AACT;AAEA,SAAS,UAAU,OAAgC;AACjD,MAAI,MAAM,SAAS,KAAK,MAAM,CAAC,MAAM,KAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,KAAM;AACxG,WAAO,EAAE,OAAO,OAAO,OAAO,+CAAgC,UAAU,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,EACvG;AAEA,QAAMG,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,UAAUA,MAAK,UAAU,GAAG,IAAI;AACtC,QAAM,WAA0B,CAAC;AACjC,QAAM,UAAwB,CAAC;AAC/B,QAAMC,WAAwB,CAAC;AAC/B,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,SAAS,MAAM,QAAQ;AAC5B,YAAM,gBAAgB;AACtB,YAAM,KAAK,MAAM,QAAQ;AACzB,YAAM,WAAW,YAAY,OAAO,MAAM;AAC1C,eAAS,SAAS;AAClB,YAAM,gBAAgB;AACtB,YAAM,aAAa,gBAAgB,SAAS;AAC5C,UAAI,aAAa,MAAM,QAAQ;AAC7B,cAAM,IAAI,MAAM,gEAAmB;AAAA,MACrC;AAEA,YAAM,UAAuB;AAAA,QAC3B;AAAA,QACA,MAAM,gBAAgB,EAAE;AAAA,QACxB,MAAM,SAAS;AAAA,QACf,QAAQ;AAAA,MACV;AACA,UAAI,OAAO,GAAG;AACZ,cAAM,aAAa,aAAa,OAAO,eAAe,UAAU;AAChE,gBAAQ,aAAa,WAAW,SAAS;AAAA,MAC3C,WAAW,OAAO,GAAG;AACnB,gBAAQ,KAAK,GAAG,iBAAiB,OAAO,eAAe,UAAU,CAAC;AAAA,MACpE,WAAW,OAAO,GAAG;AACnB,QAAAA,SAAQ,KAAK,GAAG,iBAAiB,OAAO,eAAe,UAAU,CAAC;AAAA,MACpE;AACA,eAAS,KAAK,OAAO;AACrB,eAAS;AAAA,IACX;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAChD;AAAA,MACA;AAAA,MACA,SAAAA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,MAAM,SAAS,UAAU,SAAS,SAAAA,SAAQ;AAC5D;AAEA,SAAS,iBAAiB,OAAmB,QAAgB,KAA2B;AACtF,QAAM,UAAwB,CAAC;AAC/B,QAAM,QAAQ,YAAY,OAAO,MAAM;AACvC,WAAS,MAAM;AACf,WAAS,QAAQ,GAAG,QAAQ,MAAM,SAAS,SAAS,KAAK,SAAS;AAChE,UAAM,aAAa,aAAa,OAAO,QAAQ,GAAG;AAClD,aAAS,WAAW;AACpB,UAAM,aAAa,aAAa,OAAO,QAAQ,GAAG;AAClD,aAAS,WAAW;AACpB,UAAM,OAAO,MAAM,QAAQ;AAC3B,aAAS,yBAAyB,OAAO,QAAQ,KAAK,IAAI;AAC1D,YAAQ,KAAK,EAAE,QAAQ,WAAW,OAAO,MAAM,WAAW,OAAO,MAAM,iBAAiB,IAAI,EAAE,CAAC;AAAA,EACjG;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAmB,QAAgB,KAA2B;AACtF,QAAMA,WAAwB,CAAC;AAC/B,QAAM,QAAQ,YAAY,OAAO,MAAM;AACvC,WAAS,MAAM;AACf,WAAS,QAAQ,GAAG,QAAQ,MAAM,SAAS,SAAS,KAAK,SAAS;AAChE,UAAM,aAAa,aAAa,OAAO,QAAQ,GAAG;AAClD,aAAS,WAAW;AACpB,UAAM,OAAO,MAAM,QAAQ;AAC3B,UAAM,YAAY,YAAY,OAAO,MAAM;AAC3C,aAAS,UAAU;AACnB,IAAAA,SAAQ,KAAK,EAAE,MAAM,WAAW,OAAO,MAAM,iBAAiB,IAAI,GAAG,OAAO,UAAU,MAAM,CAAC;AAAA,EAC/F;AACA,SAAOA;AACT;AAEA,SAAS,yBAAyB,OAAmB,QAAgB,KAAa,MAAsB;AACtG,MAAI,SAAS,GAAM;AACjB,WAAO,YAAY,OAAO,MAAM,EAAE;AAAA,EACpC;AACA,MAAI,SAAS,GAAM;AACjB,UAAM,oBAAoB,SAAS;AACnC,WAAO,eAAe,OAAO,mBAAmB,GAAG;AAAA,EACrD;AACA,MAAI,SAAS,GAAM;AACjB,WAAO,eAAe,OAAO,QAAQ,GAAG;AAAA,EAC1C;AACA,MAAI,SAAS,GAAM;AACjB,WAAO,KAAK,IAAI,KAAK,SAAS,CAAC;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAmB,QAAgB,KAAqB;AAC9E,QAAM,QAAQ,MAAM,QAAQ;AAC5B,WAAS,YAAY,OAAO,MAAM,EAAE;AACpC,OAAK,QAAQ,OAAU,KAAQ,SAAS,KAAK;AAC3C,aAAS,YAAY,OAAO,MAAM,EAAE;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAmB,QAAmD;AACzF,MAAI,SAAS;AACb,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS;AACtC,QAAI,UAAU,MAAM,QAAQ;AAC1B,YAAM,IAAI,MAAM,6CAAe;AAAA,IACjC;AACA,UAAM,OAAO,MAAM,QAAQ;AAC3B,eAAW,OAAO,QAAS;AAC3B,SAAK,OAAO,SAAU,GAAG;AACvB,aAAO,EAAE,OAAO,WAAW,GAAG,OAAO;AAAA,IACvC;AACA,aAAS;AAAA,EACX;AACA,QAAM,IAAI,MAAM,uCAAc;AAChC;AAEA,SAAS,aAAa,OAAmB,QAAgB,KAAgD;AACvG,QAAM,SAAS,YAAY,OAAO,MAAM;AACxC,WAAS,OAAO;AAChB,QAAM,UAAU,SAAS,OAAO;AAChC,MAAI,UAAU,KAAK;AACjB,UAAM,IAAI,MAAM,uEAAqB;AAAA,EACvC;AACA,SAAO,EAAE,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM,MAAM,QAAQ,OAAO,CAAC,GAAG,QAAQ,QAAQ;AAC1F;AAEA,SAAS,gBAAgB,IAAoB;AAC3C,QAAM,QAAgC;AAAA,IACpC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AACA,SAAO,MAAM,EAAE,KAAK,WAAW,EAAE;AACnC;AAEA,SAAS,iBAAiB,MAAsB;AAC9C,QAAM,QAAgC;AAAA,IACpC,GAAM;AAAA,IACN,GAAM;AAAA,IACN,GAAM;AAAA,IACN,GAAM;AAAA,EACR;AACA,SAAO,MAAM,IAAI,KAAK,WAAW,IAAI;AACvC;AAcA,SAAS,uBAAuB,OAAgC;AAC9D,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,qBAAqB,KAAK;AACzC,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,gBAAM,OAAO,YAAY,IAAI,2BAAY,KAAK;AAClE,aAAW,SAAS,gBAAM,GAAG,OAAO,KAAK,MAAM,OAAO,MAAM,IAAI;AAChE,aAAW,SAAS,gBAAM,OAAO,YAAY,cAAI;AACjD,aAAW,SAAS,gBAAM,GAAG,OAAO,SAAS,cAAI,MAAM;AACvD,aAAW,SAAS,4BAAQ,mBAAmB,OAAO,aAAa,EAAE,CAAC;AACtE,UAAQ,OAAO,OAAO;AAEtB,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAoC;AAChE,MAAI,MAAM,SAAS,IAAI;AACrB,WAAO,EAAE,OAAO,OAAO,OAAO,0FAAyB;AAAA,EACzD;AACA,QAAM,YAAY,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC;AACnE,MAAI,cAAc,QAAQ;AACxB,WAAO,EAAE,OAAO,OAAO,WAAW,OAAO,iDAAwB;AAAA,EACnE;AAEA,QAAMD,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,UAAUA,MAAK,UAAU,GAAG,KAAK;AACvC,MAAI,YAAY,KAAK,YAAY,GAAG;AAClC,WAAO,EAAE,OAAO,OAAO,WAAW,SAAS,OAAO,wDAAqB,OAAO,SAAI;AAAA,EACpF;AAEA,QAAM,WAAW,MAAM,MAAM,GAAG,EAAE;AAClC,MAAI,SAAS,KAAK,CAAC,SAAS,SAAS,CAAC,GAAG;AACvC,WAAO,EAAE,OAAO,OAAO,WAAW,SAAS,OAAO,6GAA6B;AAAA,EACjF;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,UAAUA,MAAK,UAAU,IAAI,KAAK;AAAA,IAClC,QAAQA,MAAK,UAAU,IAAI,KAAK;AAAA,IAChC,OAAOA,MAAK,UAAU,IAAI,KAAK;AAAA,IAC/B,OAAOA,MAAK,UAAU,IAAI,KAAK;AAAA,IAC/B,WAAWA,MAAK,UAAU,IAAI,KAAK;AAAA,EACrC;AACF;AAEA,SAAS,mBAAmB,MAAsB;AAChD,QAAM,QAAgC;AAAA,IACpC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,SAAO,MAAM,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,IAAI,MAAM,iBAAO,IAAI;AAC/D;AAsBA,SAAS,oBAAoB,OAAgC;AAC3D,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,kBAAkB,KAAK;AACtC,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,sBAAO,GAAG,OAAO,QAAQ,IAAI;AACjD,aAAW,SAAS,gBAAM,OAAO,aAAa,cAAI;AAClD,aAAW,SAAS,4BAAQ,GAAG,kBAAkB,OAAO,WAAW,CAAC,MAAM,kBAAkB,OAAO,YAAY,CAAC,EAAE;AAClH,aAAW,SAAS,UAAU,OAAO,iBAAiB,cAAI;AAC1D,aAAW,SAAS,gBAAM,eAAe,OAAO,YAAY,CAAC;AAC7D,aAAW,SAAS,gBAAgB,OAAO,eAAe,CAAC;AAC3D,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,kBAAkB,OAAO,MAAM;AAC9C,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ,OAAO,wBAAwB,MAAM,CAAC;AAAA,EAChD,OAAO;AACL,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc;AACpB,YAAQ,OAAO,KAAK;AAAA,EACtB;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAiC;AAC1D,MAAI,MAAM,SAAS,KAAK;AACtB,WAAO,EAAE,OAAO,OAAO,OAAO,+FAAyB;AAAA,EACzD;AACA,QAAM,YAAY,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,GAAG,EAAE,CAAC;AACpE,MAAI,cAAc,qBAAqB;AACrC,WAAO,EAAE,OAAO,OAAO,OAAO,8DAA2B;AAAA,EAC3D;AAEA,QAAMA,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,cAAcA,MAAK,UAAU,IAAI,KAAK;AAC5C,QAAM,WAAW,gBAAgB,IAAI,QAAQ;AAC7C,MAAI,WAAW,OAAO,WAAW,UAAU,WAAY,WAAW,OAAQ,GAAG;AAC3E,WAAO,EAAE,OAAO,OAAO,OAAO,8CAAgB,QAAQ,SAAI;AAAA,EAC5D;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA,cAAc,MAAM,EAAE;AAAA,IACtB,aAAa,MAAM,EAAE;AAAA,IACrB,WAAWA,MAAK,UAAU,IAAI,KAAK;AAAA,IACnC,eAAeA,MAAK,UAAU,IAAI,KAAK;AAAA,IACvC,cAAcA,MAAK,UAAU,IAAI,KAAK;AAAA,IACtC,aAAaA,MAAK,UAAU,IAAI,KAAK;AAAA,EACvC;AACF;AAEA,SAAS,kBAAkB,OAAmB,QAA2C;AACvF,QAAM,WAAW,OAAO,YAAY;AACpC,MAAI,YAAY,KAAK,MAAM,SAAS,KAAK,IAAI,UAAU,GAAG,GAAG;AAC3D,WAAO,CAAC;AAAA,EACV;AACA,QAAM,YAAY;AAClB,QAAM,aAAa;AACnB,MAAI,MAAM,UAAU,MAAM,IAAM;AAC9B,WAAO,CAAC;AAAA,EACV;AACA,QAAMA,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,YAAYA,MAAK,UAAU,aAAa,GAAG,KAAK;AACtD,QAAM,UAA+B,CAAC;AACtC,WAAS,QAAQ,GAAG,QAAQ,KAAK,IAAI,WAAW,EAAE,GAAG,SAAS;AAC5D,UAAM,gBAAgB,aAAa,IAAI,QAAQ;AAC/C,QAAI,gBAAgB,IAAI,MAAM,QAAQ;AACpC;AAAA,IACF;AACA,UAAM,aAAa,YAAYA,MAAK,UAAU,eAAe,KAAK;AAClE,UAAM,QAAQ,sBAAsB,OAAO,YAAY,YAAY,QAAQ;AAC3E,QAAI,OAAO;AACT,cAAQ,KAAK,KAAK;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAmB,QAAgB,SAA2C;AAC3G,MAAI;AACF,QAAI,SAAS;AACb,UAAM,gBAAgB,iBAAiB,OAAO,MAAM;AACpD,aAAS,cAAc;AACvB,UAAM,QAAQ,iBAAiB,OAAO,MAAM;AAC5C,aAAS,MAAM;AACf,UAAM,aAAa,KAAK,IAAI,SAAS,SAAS,OAAO,cAAc,KAAK,CAAC;AACzE,QAAI,aAAa,MAAM,QAAQ;AAC7B,aAAO;AAAA,IACT;AACA,UAAM,SAAS,kBAAkB,OAAO,QAAQ,UAAU;AAC1D,QAAI,OAAO,SAAS,GAAG;AACrB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,MAAM,OAAO,OAAO,CAAC,KAAK,EAAE;AAAA,MAC5B,MAAM,OAAO,OAAO,CAAC,KAAK,EAAE;AAAA,MAC5B,WAAW,OAAO,OAAO,CAAC,KAAK,EAAE;AAAA,MACjC,UAAU,OAAO,OAAO,CAAC,KAAK,CAAC;AAAA,MAC/B,KAAK,OAAO,OAAO,CAAC,KAAK,EAAE;AAAA,IAC7B;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,OAAmB,QAAgB,KAA4C;AACxG,QAAM,aAAa,iBAAiB,OAAO,MAAM;AACjD,MAAI,eAAe,WAAW;AAC9B,QAAM,YAAY,SAAS,OAAO,WAAW,KAAK;AAClD,MAAI,aAAa;AACjB,QAAM,cAAwB,CAAC;AAC/B,SAAO,eAAe,aAAa,eAAe,KAAK;AACrD,UAAM,SAAS,iBAAiB,OAAO,YAAY;AACnD,gBAAY,KAAK,OAAO,KAAK;AAC7B,mBAAe,OAAO;AAAA,EACxB;AACA,SAAO,YAAY,IAAI,CAAC,eAAe;AACrC,UAAM,QAAQ,gBAAgB,OAAO,YAAY,KAAK,UAAU;AAChE,iBAAa,MAAM;AACnB,WAAO,MAAM;AAAA,EACf,CAAC;AACH;AAEA,SAAS,gBACP,OACA,QACA,KACA,YACmD;AACnD,QAAM,OAAO,OAAO,UAAU;AAC9B,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,MAAM,OAAO;AAAA,EAC/B;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,cAAc,OAAO,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE;AAAA,EACtE;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,cAAc,OAAO,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE;AAAA,EACtE;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,cAAc,OAAO,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE;AAAA,EACtE;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,cAAc,OAAO,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE;AAAA,EACtE;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,cAAc,OAAO,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE;AAAA,EACtE;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,cAAc,OAAO,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE;AAAA,EACtE;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,GAAG,OAAO;AAAA,EAC5B;AACA,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,GAAG,OAAO;AAAA,EAC5B;AACA,MAAI,QAAQ,IAAI;AACd,UAAM,SAAS,KAAK,OAAO,OAAO,MAAM,CAAC;AACzC,UAAM,WAAW,KAAK,IAAI,KAAK,SAAS,MAAM;AAC9C,QAAI,OAAO,MAAM,GAAG;AAClB,aAAO,EAAE,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM,MAAM,QAAQ,QAAQ,CAAC,GAAG,QAAQ,SAAS,OAAO;AAAA,IACnG;AACA,WAAO,EAAE,OAAO,SAAS,MAAM,OAAO,QAAQ,SAAS,OAAO;AAAA,EAChE;AACA,SAAO,EAAE,OAAO,MAAM,OAAO;AAC/B;AAEA,SAAS,iBAAiB,OAAmB,QAAmD;AAC9F,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS;AACtC,QAAI,UAAU,MAAM,QAAQ;AAC1B,YAAM,IAAI,MAAM,oDAAsB;AAAA,IACxC;AACA,UAAM,OAAO,MAAM,QAAQ;AAC3B,QAAI,UAAU,GAAG;AACf,cAAS,SAAS,KAAM,OAAO,IAAI;AACnC,aAAO,EAAE,OAAO,OAAO;AAAA,IACzB;AACA,YAAS,SAAS,KAAM,OAAO,OAAO,GAAI;AAC1C,SAAK,OAAO,SAAU,GAAG;AACvB,aAAO,EAAE,OAAO,OAAO;AAAA,IACzB;AAAA,EACF;AACA,SAAO,EAAE,OAAO,OAAO;AACzB;AAEA,SAAS,cAAc,OAAmB,QAAgB,QAAwB;AAChF,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,QAAQ,SAAS;AAC3C,YAAS,SAAS,KAAM,OAAO,MAAM,SAAS,KAAK,KAAK,CAAC;AAAA,EAC3D;AACA,QAAM,OAAO,OAAO,SAAS,CAAC;AAC9B,QAAM,UAAU,MAAO,OAAO;AAC9B,OAAK,QAAQ,aAAa,IAAI;AAC5B,aAAS,MAAM;AAAA,EACjB;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,wBAAwB,SAA2C;AAC1E,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc,uBAAa,QAAQ,MAAM;AAC/C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,aAAW,SAAS,CAAC,gBAAM,gBAAM,UAAK,QAAQ,KAAK,GAAG;AACpD,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,cAAc;AACjB,WAAO,OAAO,EAAE;AAAA,EAClB;AACA,QAAM,OAAO,MAAM;AACnB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,aAAW,SAAS,SAAS;AAC3B,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,eAAW,SAAS,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,WAAW,OAAO,MAAM,QAAQ,GAAG,MAAM,GAAG,GAAG;AAChG,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,WAAK,cAAc;AACnB,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,UAAM,OAAO,GAAG;AAAA,EAClB;AACA,QAAM,OAAO,OAAO,KAAK;AACzB,UAAQ,OAAO,OAAO,KAAK;AAC3B,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAwB;AACjD,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AACA,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AACA,SAAO,UAAU,SAAY,iBAAO,OAAO,KAAK;AAClD;AAEA,SAAS,eAAe,OAAwB;AAC9C,QAAM,YAAoC;AAAA,IACxC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,SAAO,UAAU,SAAY,iBAAO,UAAU,KAAK,KAAK,iBAAO,KAAK;AACtE;AAUA,SAAS,qBAAqB,OAAgC;AAC5D,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,aAAa,KAAK;AACjC,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,SAAS,MAAM;AACnC,aAAW,SAAS,UAAU,GAAG,OAAO,YAAY,IAAI;AACxD,aAAW,SAAS,iBAAiB,MAAM,OAAO,gBAAgB,GAAG,SAAS,EAAE,EAAE,YAAY,CAAC,EAAE;AACjG,aAAW,SAAS,sBAAOH,aAAY,OAAO,aAAa,CAAC,CAAC;AAC7D,UAAQ,OAAO,OAAO;AAEtB,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,YAAY;AACjB,OAAK,cAAc;AACnB,UAAQ,OAAO,IAAI;AACnB,SAAO;AACT;AAEA,SAAS,aAAa,OAAmC;AACvD,MAAI,MAAM,SAAS,IAAI;AACrB,WAAO,EAAE,OAAO,OAAO,OAAO,gGAA0B;AAAA,EAC1D;AACA,MAAIE,SAAQ,OAAO,GAAG,CAAC,MAAM,UAAUA,SAAQ,OAAO,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ;AACrF,WAAO,EAAE,OAAO,OAAO,OAAO,sDAAuC;AAAA,EACvE;AACA,QAAMC,QAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,eAAeA,MAAK,UAAU,MAAM,SAAS,GAAG,IAAI;AAC1D,QAAM,eAAe,MAAM,SAAS,IAAI;AACxC,MAAI,eAAe,GAAG;AACpB,WAAO,EAAE,OAAO,OAAO,OAAO,wEAA2B;AAAA,EAC3D;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,WAAW,KAAK,IAAI,GAAG,eAAe,CAAC;AAAA,EACzC;AACF;AAqBA,SAAS,kBAAkB,OAAgC;AACzD,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,UAAU,KAAK;AAC9B,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,SAAS,UAAU;AACvC,aAAW,SAAS,SAAS,OAAO,SAAS,MAAM;AACnD,aAAW,SAAS,YAAY,OAAO,SAAS,MAAM;AACtD,aAAW,SAAS,eAAe,OAAO,cAAc,cAAI;AAC5D,UAAQ,OAAO,OAAO;AAEtB,MAAI,OAAO,QAAQ;AACjB,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AACnB,UAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,UAAM,cAAc;AACpB,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY;AACjB,eAAW,MAAM,gBAAM,OAAO,OAAO,QAAQ,cAAI;AACjD,eAAW,MAAM,gBAAM,CAAC,OAAO,OAAO,WAAW,OAAO,OAAO,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK,cAAI;AACtG,eAAW,MAAM,gBAAM,OAAO,OAAO,OAAO,MAAM;AAClD,WAAO,OAAO,OAAO,IAAI;AACzB,QAAI,OAAO,OAAO,OAAO,SAAS,GAAG;AACnC,YAAM,OAAO,SAAS,cAAc,IAAI;AACxC,iBAAW,SAAS,OAAO,OAAO,OAAO,MAAM,GAAG,EAAE,GAAG;AACrD,cAAM,OAAO,SAAS,cAAc,IAAI;AACxC,aAAK,cAAc;AACnB,aAAK,OAAO,IAAI;AAAA,MAClB;AACA,aAAO,OAAO,IAAI;AAAA,IACpB;AACA,YAAQ,OAAO,MAAM;AAAA,EACvB;AAEA,MAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,YAAQ,OAAO,oBAAoB,YAAY,OAAO,QAAQ,CAAC;AAAA,EACjE;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,OAAgC;AACjD,MAAI,MAAM,SAAS,KAAK,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,GAAM;AACxG,WAAO,EAAE,OAAO,OAAO,OAAO,yDAA0C,UAAU,CAAC,EAAE;AAAA,EACvF;AACA,MAAI,SAAS;AACb,QAAM,WAA2B,CAAC;AAClC,MAAI;AACF,WAAO,MAAM;AACX,YAAM,aAAa,aAAa,OAAO,MAAM;AAC7C,eAAS,WAAW;AACpB,UAAI,QAAQ,WAAW;AACvB,UAAI,UAAU,IAAI;AAChB;AAAA,MACF;AACA,UAAI,QAAQ,IAAI;AACd,gBAAQ,CAAC;AACT,cAAM,YAAY,aAAa,OAAO,MAAM;AAC5C,iBAAS,UAAU;AAAA,MACrB;AACA,eAAS,QAAQ,GAAG,QAAQ,OAAO,KAAK,GAAG,SAAS;AAClD,cAAM,MAAM,cAAc,OAAO,MAAM;AACvC,iBAAS,IAAI;AACb,cAAM,QAAQ,cAAc,OAAO,MAAM;AACzC,iBAAS,MAAM;AACf,iBAAS,KAAK;AAAA,UACZ,KAAK,IAAI,YAAY,EAAE,OAAO,IAAI,KAAK;AAAA,UACvC,OAAO,wBAAwB,IAAI,OAAO,MAAM,KAAK;AAAA,QACvD,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,SAAS,KAAK,MAAM,QAAQ;AAC9B,YAAM,IAAI,MAAM,qCAAsB;AAAA,IACxC;AACA,UAAM,aAAa,MAAM,KAAK,MAAM,MAAM,QAAQ,SAAS,EAAE,CAAC,EAC3D,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAChD,KAAK,EAAE;AACV,UAAM,aAAa,SAAS,KAAK,CAAC,SAAS,KAAK,QAAQ,aAAa,GAAG;AACxE,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,OAAO,SAAS,KAAK,CAAC,SAAS,KAAK,QAAQ,YAAY,GAAG;AAAA,MAC3D;AAAA,MACA,QAAQ,aAAa,oBAAoB,UAAU,IAAI;AAAA,IACzD;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,aAAa,OAAmB,QAAmD;AAC1F,MAAI,SAAS;AACb,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,IAAI,SAAS;AACvC,QAAI,UAAU,MAAM,QAAQ;AAC1B,YAAM,IAAI,MAAM,gDAAkB;AAAA,IACpC;AACA,UAAM,OAAO,MAAM,QAAQ;AAC3B,cAAU,OAAO,OAAO,GAAI,KAAK;AACjC,SAAK,OAAO,SAAU,GAAG;AACvB,YAAM,QAAS,UAAU,KAAM,EAAE,SAAS;AAC1C,aAAO,EAAE,OAAO,OAAO;AAAA,IACzB;AACA,aAAS;AAAA,EACX;AACA,QAAM,IAAI,MAAM,0CAAiB;AACnC;AAEA,SAAS,cAAc,OAAmB,QAAuD;AAC/F,QAAM,SAAS,aAAa,OAAO,MAAM;AACzC,WAAS,OAAO;AAChB,MAAI,OAAO,QAAQ,IAAI;AACrB,UAAM,IAAI,MAAM,2CAAkB;AAAA,EACpC;AACA,QAAM,OAAO,OAAO,OAAO,KAAK;AAChC,QAAM,MAAM,SAAS;AACrB,MAAI,MAAM,MAAM,QAAQ;AACtB,UAAM,IAAI,MAAM,uDAAoB;AAAA,EACtC;AACA,SAAO,EAAE,OAAO,MAAM,MAAM,QAAQ,GAAG,GAAG,QAAQ,IAAI;AACxD;AAEA,SAAS,wBAAwB,UAAsB,YAAgC;AACrF,QAAM,MAAM,IAAI,YAAY,EAAE,OAAO,QAAQ;AAC7C,MAAI,QAAQ,iBAAiB,QAAQ,gBAAgB,kBAAkB,KAAK,GAAG,GAAG;AAChF,WAAO,IAAI,YAAY,EAAE,OAAO,UAAU;AAAA,EAC5C;AACA,SAAO,IAAI,WAAW,MAAM;AAC9B;AAEA,SAAS,oBAAoB,YAA2C;AACtE,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,UAAU;AAMpC,WAAO;AAAA,MACL,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,MACtD,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,MACtD,WAAW,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AAAA,MACrE,QAAQ,MAAM,QAAQ,OAAO,MAAM,IAC/B,OAAO,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM,QAAQ,OAAO,KAAK,eAAe,MAAM,IAAI,CAAC,EAAE,IACtF,CAAC;AAAA,IACP;AAAA,EACF,QAAQ;AACN,WAAO,EAAE,QAAQ,CAAC,EAAE;AAAA,EACtB;AACF;AAEA,SAAS,eAAe,MAAuB;AAC7C,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,IAAI,cAAc,EAAE,KAAK,KAAK;AAAA,EAC5C;AACA,MAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,UAAM,QAAQ;AACd,QAAI,OAAO,MAAM,SAAS,UAAU;AAClC,aAAO,MAAM;AAAA,IACf;AACA,QAAI,MAAM,SAAS,SAAS;AAC1B,aAAO,SAAS,eAAe,MAAM,KAAK,CAAC;AAAA,IAC7C;AACA,QAAI,MAAM,SAAS,OAAO;AACxB,aAAO,OAAO,eAAe,MAAM,MAAM,CAAC;AAAA,IAC5C;AACA,WAAO,eAAe,MAAM,IAAI;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,WAAmB,MAAmC;AACjF,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAM,cAAc;AACpB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,aAAW,OAAO,KAAK,MAAM,GAAG,EAAE,GAAG;AACnC,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,UAAM,MAAM,SAAS,cAAc,IAAI;AACvC,QAAI,cAAc,IAAI;AACtB,UAAM,QAAQ,SAAS,cAAc,IAAI;AACzC,UAAM,cAAc,IAAI;AACxB,OAAG,OAAO,KAAK,KAAK;AACpB,UAAM,OAAO,EAAE;AAAA,EACjB;AACA,QAAM,OAAO,KAAK;AAClB,UAAQ,OAAO,OAAO,KAAK;AAC3B,SAAO;AACT;AAwBA,SAAS,wBAAwB,OAAgC;AAC/D,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,gBAAgB,KAAK;AACpC,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,gBAAM,OAAO,SAAS,iBAAiB,WAAW;AACtE,aAAW,SAAS,sBAAO,OAAO,OAAO,oBAAK;AAC9C,aAAW,SAAS,QAAQ,OAAO,YAAY,cAAI;AACnD,aAAW,SAAS,gBAAM,OAAO,YAAY,oBAAK;AAClD,aAAW,SAAS,kCAAS,OAAO,cAAc,SAAYH,aAAY,OAAO,SAAS,IAAI,cAAI;AAClG,aAAW,SAAS,sBAAO,OAAO,OAAO,gBAAgB,CAAC,CAAC;AAC3D,aAAW,SAAS,sBAAO,OAAO,OAAO,oBAAoB,CAAC,CAAC;AAC/D,UAAQ,OAAO,OAAO;AAEtB,MAAI,OAAO,QAAQ;AACjB,UAAM,OAAO,SAAS,cAAc,GAAG;AACvC,SAAK,YAAY;AACjB,SAAK,cAAc;AACnB,YAAQ,OAAO,IAAI;AAAA,EACrB;AAEA,MAAI,OAAO,SAAS;AAClB,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AACpB,YAAQ,cAAc,OAAO;AAC7B,YAAQ,OAAO,OAAO;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAsC;AAC7D,MAAI,MAAM,UAAU,KAAKE,SAAQ,OAAO,GAAG,CAAC,MAAM,YAAY;AAC5D,WAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,EACrC;AAEA,QAAM,OAAO,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,OAAO,IAAI,CAAC,CAAC;AAClH,MAAI,CAAC,eAAe,KAAK,IAAI,KAAK,CAAC,KAAK,SAAS,iBAAiB,GAAG;AACnE,WAAO,EAAE,OAAO,OAAO,OAAO,mEAAqC;AAAA,EACrE;AACA,MAAI,OAAO,cAAc,aAAa;AACpC,WAAO,EAAE,OAAO,OAAO,OAAO,oGAAwC;AAAA,EACxE;AAEA,QAAM,cAAc,IAAI,UAAU,EAAE,gBAAgB,MAAM,iBAAiB;AAC3E,MAAI,YAAY,cAAc,aAAa,GAAG;AAC5C,WAAO,EAAE,OAAO,OAAO,OAAO,2CAAkB;AAAA,EAClD;AACA,QAAM,WAAW,MAAM,KAAK,YAAY,gBAAgB,QAAQ,EAAE,KAAK,CAAC,UAAU,MAAM,YAAY,MAAM;AAC1G,MAAI,CAAC,UAAU;AACb,WAAO,EAAE,OAAO,OAAO,OAAO,0CAAsB;AAAA,EACtD;AAEA,QAAM,QAAQ,kBAAkB,QAAQ;AACxC,MAAI,CAAC,YAAY,KAAK,GAAG;AACvB,WAAO,EAAE,OAAO,OAAO,OAAO,sDAAwB;AAAA,EACxD;AACA,QAAM,eAAe,MAAM;AAC3B,MAAI,CAAC,YAAY,YAAY,GAAG;AAC9B,WAAO,EAAE,OAAO,OAAO,OAAO,qDAAsC;AAAA,EACtE;AAEA,QAAM,eAAe,aAAa;AAClC,QAAM,WAAW,YAAY,aAAa,mBAAmB;AAC7D,QAAM,YAAY,wBAAwB,aAAa,aAAa,SAAS;AAC7E,SAAO;AAAA,IACL,OAAO;AAAA,IACP,KAAK,YAAY,aAAa,cAAc;AAAA,IAC5C;AAAA,IACA,UAAU,YAAY,aAAa,2BAA2B;AAAA,IAC9D;AAAA,IACA,cAAc,MAAM,QAAQ,MAAM,eAAe,IAAI,MAAM,gBAAgB,SAAS;AAAA,IACpF,kBAAkB,MAAM,QAAQ,MAAM,mBAAmB,IAAI,MAAM,oBAAoB,SAAS;AAAA,IAChG,SAAS,wBAAwB,cAAc,QAAQ;AAAA,EACzD;AACF;AAEA,SAAS,kBAAkB,SAA8B;AACvD,UAAQ,QAAQ,SAAS;AAAA,IACvB,KAAK,QAAQ;AACX,YAAM,SAAqC,CAAC;AAC5C,YAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ;AAC5C,eAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS;AACpD,cAAM,MAAM,SAAS,KAAK;AAC1B,YAAI,IAAI,YAAY,OAAO;AACzB;AAAA,QACF;AACA,cAAM,QAAQ,SAAS,QAAQ,CAAC;AAChC,YAAI,OAAO;AACT,iBAAO,IAAI,eAAe,EAAE,IAAI,kBAAkB,KAAK;AACvD;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AACH,aAAO,MAAM,KAAK,QAAQ,QAAQ,EAAE,IAAI,iBAAiB;AAAA,IAC3D,KAAK;AACH,aAAO,iBAAiB,QAAQ,eAAe,EAAE;AAAA,IACnD,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,QAAQ,eAAe,CAAC;AAAA,IACxC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACE,aAAO,QAAQ,eAAe;AAAA,EAClC;AACF;AAEA,SAAS,iBAAiB,OAA2B;AACnD,QAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE;AAC3C,MAAI,CAAC,YAAY;AACf,WAAO,IAAI,WAAW;AAAA,EACxB;AACA,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAC1C,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS;AAClD,UAAM,KAAK,IAAI,OAAO,WAAW,KAAK;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAA+B,UAAuC;AACrG,MAAI,EAAE,iBAAiB,eAAe,MAAM,WAAW,GAAG;AACxD,WAAO;AAAA,EACT;AACA,MAAI,CAAC,YAAY,CAAC,gEAAgE,KAAK,QAAQ,GAAG;AAChG,WAAO;AAAA,EACT;AACA,QAAM,OAAO,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC,EAAE,OAAO,KAAK;AACpE,SAAO,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;AACvD;AAEA,SAAS,YAAY,OAAuE;AAC1F,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,KAAK,EAAE,iBAAiB;AACpG;AAEA,SAAS,YAAY,OAAmD;AACtE,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAASA,SAAQ,OAAmB,QAAgB,QAAwB;AAC1E,MAAI,SAAS,KAAK,SAAS,SAAS,MAAM,QAAQ;AAChD,WAAO;AAAA,EACT;AACA,SAAO,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,QAAQ,SAAS,MAAM,CAAC;AAC7E;AAcA,SAAS,wBAAwB,OAAgC;AAC/D,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,cAAc;AACtB,UAAQ,OAAO,OAAO;AAEtB,QAAM,SAAS,gBAAgB,KAAK;AACpC,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,YAAY;AAClB,UAAM,cAAc,OAAO,SAAS;AACpC,YAAQ,OAAO,KAAK;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,aAAW,SAAS,gBAAM,OAAO,UAAU,YAAY;AACvD,aAAW,SAAS,SAAS,OAAO,SAAS,oBAAK;AAClD,aAAW,SAAS,WAAW,OAAO,WAAW,oBAAK;AACtD,aAAW,SAAS,SAAS,OAAO,SAAS,cAAI;AACjD,aAAW,SAAS,eAAe,OAAO,eAAe,oBAAK;AAC9D,aAAW,SAAS,WAAW,OAAO,gBAAgB,oBAAK;AAC3D,MAAI,OAAO,cAAc;AACvB,eAAW,SAAS,QAAQ,OAAO,YAAY;AAAA,EACjD;AACA,UAAQ,OAAO,OAAO;AACtB,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAsC;AAC7D,QAAM,OAAO,IAAI,YAAY,QAAQ,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,IAAI,CAAC,CAAC;AAC1F,QAAM,YAAY,KAAK,MAAM,SAAS,CAAC,EAAE,CAAC,KAAK;AAC/C,QAAM,kBAAkB,UAAU,WAAW,OAAO;AACpD,QAAM,eAAe,UAAU,WAAW,IAAI;AAC9C,MAAI,CAAC,mBAAmB,CAAC,cAAc;AACrC,WAAO,EAAE,OAAO,OAAO,OAAO,iFAA8C;AAAA,EAC9E;AAEA,QAAM,cAAc,SAAS,MAAM,aAAa,KAAK,SAAS,MAAM,kBAAkB;AACtF,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ,kBAAkB,+BAA+B,UAAU,QAAQ,MAAM,EAAE,CAAC,MAAM,UAAU,QAAQ,OAAO,aAAa;AAAA,IAChI,OAAO,SAAS,MAAM,OAAO;AAAA,IAC7B,SAAS,SAAS,MAAM,SAAS,KAAK,SAAS,MAAM,KAAK;AAAA,IAC1D,cAAc,SAAS,MAAM,cAAc;AAAA,IAC3C,OAAO,SAAS,MAAM,OAAO;AAAA,IAC7B,aAAa,qBAAqB,WAAW;AAAA,IAC7C,cAAc,SAAS,MAAM,cAAc;AAAA,EAC7C;AACF;AAEA,SAAS,SAAS,MAAc,KAAiC;AAC/D,QAAM,UAAU,IAAI,QAAQ,uBAAuB,MAAM;AACzD,QAAM,QAAQ,KAAK,MAAM,IAAI,OAAO,MAAM,OAAO,cAAc,IAAI,CAAC;AACpE,SAAO,QAAQ,CAAC,GAAG,KAAK;AAC1B;AAEA,SAAS,qBAAqB,OAAoC;AAChE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,MAAM,KAAK,EAAE,MAAM,KAAK,EAAE,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAClE,MAAI,MAAM,SAAS,KAAK,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,SAAS,IAAI,CAAC,GAAG;AACpE,WAAO;AAAA,EACT;AACA,QAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI;AACzB,SAAO,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,KAAK,EAAE,CAAC,MAAM,KAAK,IAAI,GAAG,KAAK,EAAE,CAAC;AACtF;AAEA,SAAS,iBAAiB,OAAuC;AAC/D,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,MAAI,cAAcG,YAAW,KAAK;AAClC,SAAO;AACT;AAEA,SAASL,aAAY,OAAuB;AAC1C,MAAI,QAAQ,MAAM;AAChB,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,MAAI,QAAQ,OAAO,MAAM;AACvB,WAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAAA,EACrC;AACA,SAAO,IAAI,QAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC;AAC5C;AAEA,SAASC,eAAc,OAA2B;AAChD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,iBAAiB,GAAG;AACtH,QAAM,MAAM,MAAM,KAAK,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,EAC7D,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,EAC9D,KAAK,GAAG;AACX,SAAO,GAAG,KAAK,KAAK,GAAG;AACzB;AAEA,SAASI,YAAW,OAA2B;AAC7C,QAAM,OAAiB,CAAC;AACxB,QAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,GAAG;AACxC,WAAS,SAAS,GAAG,SAAS,OAAO,UAAU,IAAI;AACjD,UAAM,QAAQ,MAAM,MAAM,QAAQ,SAAS,EAAE;AAC7C,UAAM,MAAM,MAAM,KAAK,KAAK,EACzB,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,EAC9D,KAAK,GAAG,EACR,OAAO,IAAI,GAAG;AACjB,UAAM,QAAQ,MAAM,KAAK,KAAK,EAC3B,IAAI,CAAC,SAAU,QAAQ,MAAM,QAAQ,MAAM,OAAO,aAAa,IAAI,IAAI,GAAI,EAC3E,KAAK,EAAE;AACV,SAAK,KAAK,GAAG,OAAO,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC,KAAK,GAAG,KAAK,KAAK,EAAE;AAAA,EACrF;AACA,MAAI,MAAM,SAAS,OAAO;AACxB,SAAK,KAAK,gCAAY,KAAK,6BAAS,MAAM,MAAM,eAAK;AAAA,EACvD;AACA,SAAO,KAAK,KAAK,IAAI;AACvB;","names":["name","extension","view","asciiAt","readUint32Be","timescale","duration","readUint32Le","appendMediaInfo","asciiAt","readUint32Le","readUint16Le","formatDuration","readUint32Be","view","PrismModule","Prism","DOMPurify","normalizeFileName","JSZip","appendMeta","DOMPurify","import_jszip","JSZip","appendMeta","getXmlAttribute","countMatches","import_jszip","import_dompurify","JSZip","getXmlAttribute","countMatches","decodeXml","DOMPurify","import_jszip","JSZip","finiteNumber","mimeTypeFromPath","import_jszip","JSZip","pako","formatBytes","view","readUint64Le","import_dompurify","DOMPurify","document","import_pako","finiteNumber","pako","appendMeta","formatBytes","byteSignature","height","geometry","material","JSZip","formatBytes","byteSignature","asciiAt","view","exports","hexPreview"]}
|