@p10node/office-engine 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{DocViewer-CT8VAa1L.js → DocViewer-xjB59Aqn.js} +2224 -2162
- package/dist/DocViewer-xjB59Aqn.js.map +1 -0
- package/dist/embed.js +3 -1
- package/dist/embed.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/office-engine.embed.js +40 -40
- package/dist/types/embed.d.ts +1 -1
- package/dist/types/react/DocViewer.d.ts +5 -0
- package/dist/types/react/common/Slots.d.ts +6 -0
- package/dist/types/react/common/hooks.d.ts +7 -0
- package/package.json +1 -1
- package/dist/DocViewer-CT8VAa1L.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocViewer-xjB59Aqn.js","names":["colName","_Fragment","SIZES","BLOCK","styleOf","HIGHLIGHTS","_Fragment","mdInline","TableView","GAP","PAD","HANDLES","css","stylesText","EXT","VALIGN","_Fragment","_Fragment","VALIGN","_jsx","colName","_Fragment","HIGHLIGHT","isWebImage","escAttr","escText","DEFAULT_PAGE","tokenize","colName$1","MAX_ROW","writeZip","MAX_COL","colName$2","quoteSheet","DocumentClient","FormulaSyntaxError","cssFont","runsText","publishLocal","getPeers","registerHost","runAt","splitRuns","posFromDom","normalize","RichInput","domFromPos","ordered","opInsertRuns","subscribePeers","opInsert","getSel","startCollab","collapsed","shiftPa","plen","formatRange","Fragment$1","scan","src","e","pos","head","isFormula","text","POINT_BEFORE","POINT_AFTER","formulaContext","out","q","caret","t","toks","lost","tail","stack","prev","inside","next","i","wordTok","typed","callTok","okBefore","okAfter","rangeText","pre","sheet","r0","r1","c0","c1","a","closeFormula","openString","depth","at","bang","RAW","cache","functionCatalog","sig","desc","name","parts","variadic","functionInfo","up","f","suggestFunctions","prefix","limit","argSlot","arg","pairs","start","useIsoLayoutEffect","useEffect","useLayoutEffect","useForceUpdate","n","bump","useReducer","x","useSize","ref","useRef","size","setSize","useState","el","update","w","h","s","ro","useScroll","setPos","setEl","raf","read","p","on","useMediaUrl","url","setUrl","path","enabled","live","client","u","lowerIndex","lo","hi","arr","ans","mid","v","isTextEntry","target","tag","claimFocus","doc","active","rn","host","within","BORDER_GRID","P","Icon","keep","PopBox","dx","setDx","r","vw","props","useDismiss","cb","close","open","Btn","Sep","Dropdown","setOpen","setHi","shift","setShift","listRef","check","sel","options","o","current","pick","show","step","from","k","d","root","bottom","cssMax","room","label","Fragment","Select","SizeBox","sizes","SIZES$1","setText","inputRef","base","set","done","title","cur","flatten","Children","children","isValidElement","c","signature","ToolbarRow","items","rowRef","widths","fit","setFit","more","setMore","moreRef","measured","cut","layout","ws","total","b","used","avail","cs","relayout","isSep","end","rest","all","m","PALETTE","CUSTOM_KEY","MAX_CUSTOM","HEX6","customColors","customListeners","getCustomColors","addCustomColor","subscribeCustom","ColorBtn","pickerRef","custom","useSyncExternalStore","onPick","openPicker","swatch","FONTS","fontOptions","list","fontName","css","download","blob","Menu","Pop","GridPicker","hover","setHover","pickFiles","input","accept","multiple","resolve","ViewerContext","createContext","useViewer","useContext","useFileOps","slot","ops","useSelectAll","fn","EditorBar","bar","createPortal","StatusContext","Status","onStatus","STEPS","ZoomControl","effective","dir","onChange","zoom","ContextMenu","y","onClose","vh","down","key","away","it","MOD","PromptDialog","setV","spec","ConfirmDialog","okRef","Toast","id","onDone","inlineSpec","paraSpec","p0","BLOCK$1","SKIP","hex","color","sizePt","styleOf$1","st","deco","bg","pt","toRun","htmlToParas","html","para","walk","child","node","nextList","first","last","gridOf","occ","cells","g","ri","cell","blankCell","tpl","mk","scaleCols","sum","cols","insertRow","below","rows","newCells","nCols","above","row","deleteRow","insertCol","right","g0","rowCells","crossing","before","deleteCol","remove","ci","newTable","border","width","colsN","rowsN","pa","moveSel","to","mv","DocxEditor","changed","pb","addr","part","runs","left","atEnd","count","bi","blocks","nt","j","pas","opts","lastB","lastN","now","selBefore","near","pid","pids","specs","idx","still","anchor","structural","want","sent","op","res","pi","old","touched","locs","paras","l","loc","empty","pasAfter","pasNow","pd","patch","optimistic","kind","nr","nc","method","nextKeys","beforeKeys","anchorP","added","removed","beforeObj","history","after","nextBlock","files","ext","dims","imageSize","scale","href","lk","style","b2","data","links","lines","headingId","img","nw","nh","alt","file","run","rs","HIGHLIGHTS$1","LINE_SPACING","CANON","SYMBOLS","stylePreview","DocxToolbar","setSt","editor","font","dis","sz","line","styleOpts","styles","hint","look","styleValue","image","FindBar","rep","setRep","showRep","setShowRep","plain","cellText","docxToText","mdEsc","mdInline$1","core","mark","heading","strike","lead","trail","mdTable","docxToMarkdown","prevList","lvl","bodyText","slidesToText","slides","toCsv","sep","UNDERLINE_STYLE","runCss","lineHeight","ps","contextual","paraCss","sp","Img","ctx","InlineView","obj","span","BlockView","ParaView","hang","visible","editable","TableView$1","memo","block","nested","PX","GAP$1","PAD$1","paginate","pages","heights","started","findObj","HANDLES$1","outlineOf","titleId","DocxView","viewer","version","meta","setMeta","setDone","setZoom","initialZoom","scrollRef","scroll","pagesRef","useMemo","isEditing","find","setFind","ctxMenu","setCtxMenu","prompt","setPrompt","toast","setToast","outline","setOutline","painter","setPainter","setImg","imgBox","setImgBox","resizing","resizeRatio","offs","page","contentW","availPx","batch","setBatch","measureRef","widthKey","lastKey","queue","tailEnd","renderStart","measureCtx","hs","dt","pageW","pageH","z","complete","pageHeights","tops","acc","skeleton","totalH","totalW","pageCount","caretBi","caretPage","words","setWords","status","rendered","mod","askLink","ds","range","sc","box","matches","gotoMatch","rect","H","reg","curR","replaceMatch","docStyle","PageView","format","chars","askAlt","paste","pic","copyCut","cmd","pickImage","imgEl","imageActions","startResize","w0","h0","x0","y0","ptPerPx","sx","sy","move","ev","dy","maxW","ctxItems","ranged","headings","topBlock","activeHeading","gotoBlock","index","editing","hfCtx","header","footer","slice","height","CORE","coreProps","xml","date","DetailsDialog","setCore","closeRef","groups","value","DOCX_MIME","XLSX_MIME","XML","REL","PKG_REL","CT_RELS","rootRels","detectSeparator","ch","tabs","semis","commas","parseCsv","field","quoted","colName","NUMBER","cellXml","decimalComma","rowsToXlsx","len","sheetName","SS","textToParas","escHtml","mdInline","code","markdownToHtml","md","flush","closeList","fence","body","li","HL_NAME","rPrXml","hl","runXml","piece","headingStyles","numberingXml","BULLETS","FORMATS","lvls","fmt","nums","parasToDocx","W","pPr","inner","rels","NS_A","PNS","GRP","ph","type","xfrm","THEME","bullet","blankPptx","master","shapes","center","titleLayout","slide","rel","PML","OFFICE","TABLE","TEXT","MARKDOWN","HTML","OPEN_ACCEPT","fromHtml","importFile","styles_default","ID","injectStyles","PRINT_CSS","cssFor","sleep","ms","settle","quiet","mo","urls","loads","RTL","search","ok","fitText","view","cuts","clips","mount","frame","createRoot","disposed","dispose","printing","printDocument","cleanup","esc","toDataUrl","reject","exportHtml","blobs","KIND_LABEL","EXT$1","TEXT_FORMATS","QUICK","useFileActions","busy","setBusy","busyRef","section","fileItems","exec","action","quick","FileMenu","actions","styleOf","toEdit","bulletOf","lvlOf","toTPara","num","PptxEditor","sid","counters","i0","HIGHLIGHTS","SHAPES","LINE_W","DASHES","SPACING","VALIGN$2","PptxToolbar","Presenter","order","setVw","resize","exitFs","go","SlideSlot","poly","pts","adj","def","ellipse","rx","ry","roundRect","regular","rot","star","LINE_GEOMS","geomPath","ss","geom","tx","ty","boxStyle","useFillCss","fill","runStyle","TextView","flow","edit","nodes","Marker","ShapeView","useId","isLine","fillCss","flipped","flip","isRect","solid","PicView","top","sw","sh","strokeCss","CellView","TableView","ElView","SlideView","model","overlay","caches","cacheFor","putSlide","resetSlides","useSlide","setModel","hit","HANDLES","boxOf","els","x1","y1","resized","mode","Selection","onHandle","PAD","GAP","PptxView","shown","rootRef","rootSize","thumbRef","thumbScroll","showThumbs","thumbnails","caretAt","textRoot","slidesRef","selected","setSelected","drag","setDrag","slidesVer","setSlidesVer","presenting","setPresenting","undoDepth","setUndoDepth","fitW","fitH","slideH","slideW","pitch","tScale","tH","tPitch","tFirst","tLast","stopEditing","stopRef","off","modelOf","beginText","onSlideMouseDown","topEl","sidEl","runShapes","selectNew","err","moved","insert","rid","slideAction","goTo","undoShapes","redo","slideCmd","elOf","selRef","shapeCmd","shapeMenu","slideMenu","onShapeKey","nudge","onKeyDown","selOverlay","slots","thumbs","fromStart","useDocument","state","setState","headersKey","worker","credentials","SIZES","BORDERS","BORDER_STYLES","HALIGN","VALIGN$1","ROTATE","FUNCS","decimals","XlsxToolbar","bColor","setBColor","bStyle","setBStyle","align","valign","known","formats","Axis","max","min","px","fontPx","fitNumber","cw","CHUNK","MAX_PRINT_ROWS","TABLE_ROWS","PORTRAIT_W","LANDSCAPE_W","sheetRows","loading","sheetText","lastR","lastC","VALIGN","sheetPrintable","merges","anchors","covered","across","visibleIn","axis","basePx","tables","trs","inMerge","tds","raw","si","_rot","textAlign","spill","whiteSpace","alignItems","landscape","className","tableStyle","colgroup","BLOCK","HH","MAX_SCROLL_PX","SheetState","XlsxStore","cached","rowsAt","firstKey","stores","storeFor","XlsxView","setActive","initialSheet","store","renaming","setRenaming","tabMenu","setTabMenu","bookOp","setEdit","hold","keepEditing","canPoint","SheetGrid","alertError","rotated","JUSTIFY","fc","REF_COLORS","refKey","ARROWS","rectOf","withMerges","setSelState","detailState","setDetail","detail","detailTick","setDetailTick","dragging","editRef","hlRef","fxRef","sugIdx","setSugIdx","setCtx","afterDrag","findOpts","setFindOpts","setMatches","setResizing","HW","viewW","viewH","rowAxis","frozen","colAxis","frozenW","frozenH","spacerW","spacerH","maxLogicalY","maxScrollY","scrollY","scrollX","mainOx","mainOy","mainW","mainH","visMerges","ar","ac","mergeAt","oneCell","peers","sheetPath","peerSels","setSel","region","rr1","rr0","cc1","cc0","oy","ox","cellEl","wOverride","hOverride","textRotate","justify","ov","merged","filled","overflow","findBoxes","refBoxes","colHeaders","rowHeaders","rh","fr","fw","fh","cellBox","scrollIntoView","cellAt","clientX","clientY","lx","ly","focusGrid","selectSheet","startEdit","begin","initialText","initial","committed","commit","backTo","moveBy","cancel","onSheet","own","inCell","fctx","pointOk","pointActive","refSpans","colors","word","sugg","sugKey","inputEl","readCaret","onInput","pointAt","s0","e0","pointDrag","movePoint","baseR","baseC","clampR","clampC","extend","dr","dc","noArgs","ins","clearRange","R","activeCss","fmtAt","toggle","undo","tsv","vals","sheetOp","pageRows","moves","onMouseDown","grip","col","pointRange","xf","m0","toggleMerge","merge","freeze","autoFn","sortBy","rowsOp","pasteText","single","onMouseMove","fx","editKeys","arrow","assist","edStyle","hlParts","assistPos","transportIds","nextTransportId","optsKey","useCollab","optsRef","sync","initials","LABEL","CollabBar","pending","setPending","PeerOverlay","marks","setMarks","layer","measure","place","collab","schedule","offChange","pr","EXT","UNTITLED","fmtBytes","DocViewer","setEditing","dirty","setDirtyState","saving","setSaving","barEl","setBarEl","styleTarget","opened","setOpened","renamed","setRenamed","loadName","docName","canEdit","statusEl","setStatusEl","onLoad","error","onError","openedDirty","setDirty","useCallback","onDirtyChange","baseName","fileName","canSave","allowSave","onSave","allowDownload","save","fileOps","selectAll","api","captureSelectAll","clearToast","confirm","setConfirm","details","setDetails","replace","canOpen","fileMenu","allowOpen","fileActions","allowEdit","pct","progress","toolbar","toolbarExtra"],"sources":["../src/core/xlsx/formula/assist.ts","../src/core/xlsx/formula/catalog.ts","../src/react/common/hooks.ts","../src/react/edit/Toolbar.tsx","../src/react/common/Slots.tsx","../src/react/common/Status.tsx","../src/react/common/ZoomControl.tsx","../src/react/common/ContextMenu.tsx","../src/react/common/Dialog.tsx","../src/core/docx/spec.ts","../src/react/docx/html.ts","../src/react/docx/tables.ts","../src/react/docx/DocxEditor.ts","../src/react/docx/DocxToolbar.tsx","../src/react/docx/FindBar.tsx","../src/react/file/text.ts","../src/react/docx/render.tsx","../src/react/docx/DocxView.tsx","../src/react/file/DetailsDialog.tsx","../src/core/convert.ts","../src/react/file/importFile.ts","../src/react/styles.css?inline","../src/react/injectStyles.ts","../src/react/file/print.tsx","../src/react/file/FileMenu.tsx","../src/react/pptx/PptxEditor.ts","../src/react/pptx/PptxToolbar.tsx","../src/react/pptx/Presenter.tsx","../src/react/pptx/geometry.ts","../src/react/pptx/Slide.tsx","../src/react/pptx/PptxView.tsx","../src/react/useDocument.ts","../src/react/xlsx/XlsxToolbar.tsx","../src/react/xlsx/axis.ts","../src/react/xlsx/fit.ts","../src/react/xlsx/print.tsx","../src/react/xlsx/XlsxView.tsx","../src/collab/react.tsx","../src/react/DocViewer.tsx"],"sourcesContent":["/**\n * Editing helpers for a formula being typed (text starting with '='): tolerant tokenizing,\n * caret context (word to autocomplete, enclosing call, whether a reference can be pointed in),\n * reference spans for highlighting and paren auto-closing. Pure / UI independent.\n */\nimport { FormulaSyntaxError, tokenize, type Token } from './lexer'\nimport { colName, quoteSheet, type RefAddr } from './refs'\nimport { MAX_COL, MAX_ROW } from './types'\n\nexport interface FormulaRef {\n /** span in the full text (including the leading '=') */\n s: number\n e: number\n text: string\n ref: RefAddr\n}\n\nexport interface FormulaContext {\n /** identifier right before the caret (to autocomplete); span in the full text */\n word?: { s: number; e: number; text: string; call: boolean }\n /** innermost function call around the caret; arg is 0-based */\n call?: { name: string; arg: number }\n /** a reference can be inserted at the caret */\n pointable: boolean\n refs: FormulaRef[]\n}\n\ninterface Scan {\n toks: Token[]\n /** offset (in src) where tokenizing failed, the rest is unknown */\n tail: number\n /** the failure was an unterminated string */\n openString: boolean\n}\n\nfunction scan(src: string): Scan {\n try {\n return { toks: tokenize(src), tail: src.length, openString: false }\n } catch (e) {\n if (!(e instanceof FormulaSyntaxError)) return { toks: [], tail: 0, openString: false }\n const pos = Math.max(0, Math.min(e.pos, src.length))\n const head = pos > 0 ? scan(src.slice(0, pos)) : { toks: [], tail: 0, openString: false }\n if (head.tail < pos) return head\n return { toks: head.toks, tail: pos, openString: e.message === 'unterminated string' }\n }\n}\n\nexport const isFormula = (text: string) => text.startsWith('=') && text.length > 0\n\nconst POINT_BEFORE = new Set(['(', ',', ';', '{'])\nconst POINT_AFTER = new Set([')', ',', ';', '}'])\n\n/** Context of the caret inside formula `text` (full cell text, starting with '='). */\nexport function formulaContext(text: string, caret: number): FormulaContext {\n const out: FormulaContext = { pointable: false, refs: [] }\n if (!isFormula(text)) return out\n const src = text.slice(1)\n const q = caret - 1\n const { toks, tail } = scan(src)\n for (const t of toks) if (t.t === 'ref') out.refs.push({ s: t.s + 1, e: t.e + 1, text: src.slice(t.s, t.e), ref: t.ref })\n if (q < 0) return out\n /** caret inside an unterminated string / unparseable tail */\n const lost = q > tail\n\n // enclosing calls\n const stack: { name: string; arg: number }[] = []\n let prev: Token | undefined\n let inside: Token | undefined\n let next: Token | undefined\n for (let i = 0; i < toks.length; i++) {\n const t = toks[i]\n if (t.e <= q) {\n if (t.t === 'punc') {\n if (t.v === '(') stack.push({ name: toks[i - 1]?.t === 'func' && toks[i - 1].e === t.s ? (toks[i - 1] as { v: string }).v : '', arg: 0 })\n else if (t.v === '{') stack.push({ name: '', arg: 0 })\n else if (t.v === ')' || t.v === '}') stack.pop()\n else if ((t.v === ',' || t.v === ';') && stack.length) stack[stack.length - 1].arg++\n }\n if (t.t !== 'ws') prev = t\n } else if (t.s < q) inside = t\n else if (!next && t.t !== 'ws') next = t\n }\n for (let i = stack.length - 1; i >= 0; i--)\n if (stack[i].name) {\n out.call = stack[i]\n break\n }\n if (lost) return out\n\n // word to autocomplete: identifier ending at the caret\n const wordTok = inside ?? (prev && prev.e === q ? prev : undefined)\n if (wordTok && (wordTok.t === 'name' || wordTok.t === 'func' || wordTok.t === 'ref' || wordTok.t === 'bool')) {\n const typed = src.slice(wordTok.s, q)\n const sheetPrefixed = (wordTok.t === 'ref' && wordTok.ref.sheet !== undefined) || (wordTok.t === 'name' && wordTok.sheet !== undefined)\n if (!sheetPrefixed && /^[A-Za-z_][A-Za-z0-9_.]*$/.test(typed)) {\n const callTok = wordTok.t === 'func' || src[wordTok.e] === '('\n out.word = { s: wordTok.s + 1, e: wordTok.e + 1, text: typed, call: callTok }\n }\n }\n\n // point mode: caret between tokens, after an operator / separator, before an end\n if (!inside) {\n const okBefore = !prev || (prev.t === 'punc' && POINT_BEFORE.has(prev.v)) || (prev.t === 'op' && prev.v !== '%')\n const okAfter = !next || (next.t === 'punc' && POINT_AFTER.has(next.v)) || (next.t === 'op' && next.v !== ':')\n out.pointable = okBefore && okAfter\n }\n return out\n}\n\n/** Reference text for a selected block (`A1`, `A1:B3`, `A:A`, `1:1`), sheet-qualified when `sheet` is given. */\nexport function rangeText(r0: number, c0: number, r1: number, c1: number, sheet?: string): string {\n const pre = sheet !== undefined ? quoteSheet(sheet) + '!' : ''\n if (r0 > r1) [r0, r1] = [r1, r0]\n if (c0 > c1) [c0, c1] = [c1, c0]\n if (r0 === 0 && r1 >= MAX_ROW) return `${pre}${colName(c0)}:${colName(c1)}`\n if (c0 === 0 && c1 >= MAX_COL) return `${pre}${r0 + 1}:${r1 + 1}`\n const a = `${colName(c0)}${r0 + 1}`\n return r0 === r1 && c0 === c1 ? pre + a : `${pre}${a}:${colName(c1)}${r1 + 1}`\n}\n\n/**\n * What Excel does on Enter: upper-cases function names, references and booleans,\n * closes an unterminated string and open parentheses.\n */\nexport function closeFormula(text: string): string {\n if (!isFormula(text)) return text\n const src = text.slice(1)\n const { toks, tail, openString } = scan(src)\n if (tail < src.length && !openString) return text\n let depth = 0\n let out = ''\n let at = 0\n for (const t of toks) {\n if (t.t === 'func' || t.t === 'bool' || (t.t === 'ref' && t.ref.sheet === undefined)) {\n out += src.slice(at, t.s) + src.slice(t.s, t.e).toUpperCase()\n at = t.e\n } else if (t.t === 'ref') {\n const bang = src.lastIndexOf('!', t.e)\n out += src.slice(at, bang + 1) + src.slice(bang + 1, t.e).toUpperCase()\n at = t.e\n }\n if (t.t !== 'punc') continue\n if (t.v === '(') depth++\n else if (t.v === ')') depth = Math.max(0, depth - 1)\n }\n out += src.slice(at)\n return '=' + out + (openString ? '\"' : '') + ')'.repeat(depth)\n}\n","/**\n * Function catalog for the formula editor (autocomplete + argument hints).\n * Kept separate from the implementations so the UI bundle stays small.\n * Format: `NAME: 'arg1, [arg2], ...|Description'`.\n */\nconst RAW: Record<string, string> = {\n ABS: 'number|Absolute value of a number.',\n AND: 'logical1, [logical2], ...|TRUE if all arguments are TRUE.',\n AVERAGE: 'number1, [number2], ...|Arithmetic mean of the arguments.',\n AVERAGEIF: 'range, criteria, [average_range]|Average of cells that meet a condition.',\n AVERAGEIFS: 'average_range, criteria_range1, criteria1, ...|Average of cells that meet multiple conditions.',\n CEILING: 'number, significance|Rounds a number up to the nearest multiple of significance.',\n 'CEILING.MATH': 'number, [significance], [mode]|Rounds a number up to the nearest integer or multiple.',\n CHAR: 'number|Character for a character code.',\n CHOOSE: 'index_num, value1, [value2], ...|Picks a value from the list by position.',\n CODE: 'text|Numeric code of the first character.',\n COLUMN: '[reference]|Column number of a reference.',\n COLUMNS: 'array|Number of columns in a reference.',\n CONCAT: 'text1, [text2], ...|Joins several text items into one.',\n CONCATENATE: 'text1, [text2], ...|Joins several text items into one.',\n COUNT: 'value1, [value2], ...|Counts cells that contain numbers.',\n COUNTA: 'value1, [value2], ...|Counts cells that are not empty.',\n COUNTBLANK: 'range|Counts empty cells in a range.',\n COUNTIF: 'range, criteria|Counts cells that meet a condition.',\n COUNTIFS: 'criteria_range1, criteria1, ...|Counts cells that meet multiple conditions.',\n DATE: 'year, month, day|Date serial number from year, month and day.',\n DATEDIF: 'start_date, end_date, unit|Difference between two dates in days, months or years.',\n DAY: 'serial_number|Day of the month (1-31).',\n DAYS: 'end_date, start_date|Number of days between two dates.',\n EDATE: 'start_date, months|Date that is a number of months before or after a date.',\n EOMONTH: 'start_date, months|Last day of the month, months before or after a date.',\n 'ERROR.TYPE': 'error_val|Number that corresponds to an error type.',\n EVEN: 'number|Rounds up to the nearest even integer.',\n EXACT: 'text1, text2|TRUE if two texts are exactly the same.',\n EXP: 'number|e raised to the power of a number.',\n FACT: 'number|Factorial of a number.',\n FALSE: '|The logical value FALSE.',\n FIND: 'find_text, within_text, [start_num]|Position of a text inside another (case-sensitive).',\n FLOOR: 'number, significance|Rounds a number down to the nearest multiple of significance.',\n 'FLOOR.MATH': 'number, [significance], [mode]|Rounds a number down to the nearest integer or multiple.',\n GCD: 'number1, [number2], ...|Greatest common divisor.',\n HLOOKUP: 'lookup_value, table_array, row_index_num, [range_lookup]|Looks up a value in the top row and returns a value from the same column.',\n HOUR: 'serial_number|Hour of a time value (0-23).',\n IF: 'logical_test, [value_if_true], [value_if_false]|Returns one value if a condition is TRUE and another if FALSE.',\n IFERROR: 'value, value_if_error|Returns value_if_error if the expression is an error.',\n IFNA: 'value, value_if_na|Returns value_if_na if the expression is #N/A.',\n IFS: 'logical_test1, value_if_true1, ...|Returns the value of the first TRUE condition.',\n INDEX: 'array, row_num, [column_num]|Value at a given row and column of a range.',\n INDIRECT: 'ref_text, [a1]|Reference given by a text string.',\n INT: 'number|Rounds down to the nearest integer.',\n ISBLANK: 'value|TRUE if the value is empty.',\n ISERR: 'value|TRUE if the value is an error other than #N/A.',\n ISERROR: 'value|TRUE if the value is any error.',\n ISEVEN: 'number|TRUE if the number is even.',\n ISLOGICAL: 'value|TRUE if the value is a logical value.',\n ISNA: 'value|TRUE if the value is #N/A.',\n ISNONTEXT: 'value|TRUE if the value is not text.',\n ISNUMBER: 'value|TRUE if the value is a number.',\n ISODD: 'number|TRUE if the number is odd.',\n ISTEXT: 'value|TRUE if the value is text.',\n LARGE: 'array, k|k-th largest value in a data set.',\n LCM: 'number1, [number2], ...|Least common multiple.',\n LEFT: 'text, [num_chars]|First characters of a text.',\n LEN: 'text|Number of characters in a text.',\n LN: 'number|Natural logarithm.',\n LOG: 'number, [base]|Logarithm to a given base (default 10).',\n LOG10: 'number|Base-10 logarithm.',\n LOOKUP: 'lookup_value, lookup_vector, [result_vector]|Looks up a value in a one-row or one-column range.',\n LOWER: 'text|Converts text to lowercase.',\n MATCH: 'lookup_value, lookup_array, [match_type]|Relative position of a value in a range.',\n MAX: 'number1, [number2], ...|Largest value.',\n MAXIFS: 'max_range, criteria_range1, criteria1, ...|Largest value among cells that meet conditions.',\n MEDIAN: 'number1, [number2], ...|Median of the numbers.',\n MID: 'text, start_num, num_chars|Characters from the middle of a text.',\n MIN: 'number1, [number2], ...|Smallest value.',\n MINIFS: 'min_range, criteria_range1, criteria1, ...|Smallest value among cells that meet conditions.',\n MINUTE: 'serial_number|Minute of a time value (0-59).',\n MOD: 'number, divisor|Remainder after division.',\n MODE: 'number1, [number2], ...|Most frequent value.',\n 'MODE.SNGL': 'number1, [number2], ...|Most frequent value.',\n MONTH: 'serial_number|Month of a date (1-12).',\n N: 'value|Value converted to a number.',\n NA: '|The error value #N/A.',\n NETWORKDAYS: 'start_date, end_date, [holidays]|Number of working days between two dates.',\n NOT: 'logical|Reverses a logical value.',\n NOW: '|Current date and time.',\n ODD: 'number|Rounds up to the nearest odd integer.',\n OFFSET: 'reference, rows, cols, [height], [width]|Reference offset from a starting reference.',\n OR: 'logical1, [logical2], ...|TRUE if any argument is TRUE.',\n PI: '|The value of pi.',\n POWER: 'number, power|A number raised to a power.',\n PRODUCT: 'number1, [number2], ...|Multiplies all the arguments.',\n PROPER: 'text|Capitalizes the first letter of each word.',\n RAND: '|Random number between 0 and 1.',\n RANDBETWEEN: 'bottom, top|Random integer between two numbers.',\n RANK: 'number, ref, [order]|Rank of a number in a list.',\n 'RANK.EQ': 'number, ref, [order]|Rank of a number in a list.',\n REPLACE: 'old_text, start_num, num_chars, new_text|Replaces part of a text by position.',\n REPT: 'text, number_times|Repeats a text a number of times.',\n RIGHT: 'text, [num_chars]|Last characters of a text.',\n ROUND: 'number, num_digits|Rounds a number to a number of digits.',\n ROUNDDOWN: 'number, num_digits|Rounds a number down, toward zero.',\n ROUNDUP: 'number, num_digits|Rounds a number up, away from zero.',\n ROW: '[reference]|Row number of a reference.',\n ROWS: 'array|Number of rows in a reference.',\n SEARCH: 'find_text, within_text, [start_num]|Position of a text inside another (not case-sensitive).',\n SECOND: 'serial_number|Second of a time value (0-59).',\n SIGN: 'number|Sign of a number: 1, 0 or -1.',\n SMALL: 'array, k|k-th smallest value in a data set.',\n SQRT: 'number|Square root.',\n STDEV: 'number1, [number2], ...|Standard deviation of a sample.',\n 'STDEV.P': 'number1, [number2], ...|Standard deviation of a population.',\n 'STDEV.S': 'number1, [number2], ...|Standard deviation of a sample.',\n STDEVP: 'number1, [number2], ...|Standard deviation of a population.',\n SUBSTITUTE: 'text, old_text, new_text, [instance_num]|Replaces existing text with new text.',\n SUM: 'number1, [number2], ...|Adds all the numbers.',\n SUMIF: 'range, criteria, [sum_range]|Adds the cells that meet a condition.',\n SUMIFS: 'sum_range, criteria_range1, criteria1, ...|Adds the cells that meet multiple conditions.',\n SUMPRODUCT: 'array1, [array2], ...|Sum of the products of corresponding items.',\n SWITCH: 'expression, value1, result1, [default_or_value2], ...|Matches an expression against a list of values.',\n T: 'value|Text of a value, or empty text.',\n TEXT: 'value, format_text|Formats a number as text.',\n TEXTJOIN: 'delimiter, ignore_empty, text1, ...|Joins texts with a delimiter.',\n TIME: 'hour, minute, second|Time value from hour, minute and second.',\n TODAY: '|Current date.',\n TRIM: 'text|Removes extra spaces from text.',\n TRUE: '|The logical value TRUE.',\n TRUNC: 'number, [num_digits]|Truncates a number to an integer or number of digits.',\n UPPER: 'text|Converts text to uppercase.',\n VALUE: 'text|Converts text to a number.',\n VAR: 'number1, [number2], ...|Variance of a sample.',\n 'VAR.P': 'number1, [number2], ...|Variance of a population.',\n 'VAR.S': 'number1, [number2], ...|Variance of a sample.',\n VARP: 'number1, [number2], ...|Variance of a population.',\n VLOOKUP: 'lookup_value, table_array, col_index_num, [range_lookup]|Looks up a value in the first column and returns a value from the same row.',\n WEEKDAY: 'serial_number, [return_type]|Day of the week of a date.',\n XLOOKUP: 'lookup_value, lookup_array, return_array, [if_not_found], [match_mode], [search_mode]|Searches a range and returns the matching item from another range.',\n XOR: 'logical1, [logical2], ...|TRUE if an odd number of arguments are TRUE.',\n YEAR: 'serial_number|Year of a date.',\n}\n\nexport interface FnInfo {\n name: string\n args: string[]\n /** last argument repeats (`...`) */\n variadic: boolean\n desc: string\n}\n\nlet cache: FnInfo[] | null = null\n\n/** All functions offered to the user, sorted by name. */\nexport function functionCatalog(): FnInfo[] {\n if (!cache) {\n cache = Object.keys(RAW)\n .sort()\n .map((name) => {\n const [sig, desc] = RAW[name].split('|')\n const parts = sig ? sig.split(', ') : []\n const variadic = parts[parts.length - 1] === '...'\n return { name, args: variadic ? parts.slice(0, -1) : parts, variadic, desc }\n })\n }\n return cache\n}\n\nexport function functionInfo(name: string): FnInfo | undefined {\n const up = name.toUpperCase()\n return functionCatalog().find((f) => f.name === up)\n}\n\n/** Functions whose name starts with `prefix` (case-insensitive). */\nexport function suggestFunctions(prefix: string, limit = 10): FnInfo[] {\n const up = prefix.toUpperCase()\n if (!up) return []\n return functionCatalog()\n .filter((f) => f.name.startsWith(up))\n .slice(0, limit)\n}\n\n/** Index of the signature argument to highlight for the `arg`-th (0-based) argument being typed. */\nexport function argSlot(f: FnInfo, arg: number): number {\n if (arg < f.args.length) return arg\n if (!f.variadic) return -1\n // repeating group: e.g. SUMIFS(sum_range, criteria_range1, criteria1, ...) repeats the last 2,\n // SUM(number1, [number2], ...) repeats the last one\n const n = f.args.length\n const pairs = /1$/.test(f.args[n - 1] ?? '') && /1$/.test(f.args[n - 2] ?? '') ? 2 : 1\n const start = n - pairs\n return start + ((arg - start) % pairs)\n}\n","import { useCallback, useEffect, useLayoutEffect, useReducer, useRef, useState } from 'react'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { isWebImage } from '../../core/opc'\n\nexport const useIsoLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect\n\nexport function useForceUpdate(): [number, () => void] {\n const [n, bump] = useReducer((x: number) => x + 1, 0)\n return [n, bump as () => void]\n}\n\n/** Element size via ResizeObserver. */\nexport function useSize<T extends HTMLElement>(): [React.RefObject<T | null>, { w: number; h: number }] {\n const ref = useRef<T>(null)\n const [size, setSize] = useState({ w: 0, h: 0 })\n useIsoLayoutEffect(() => {\n const el = ref.current\n if (!el) return\n const update = () => {\n const w = el.clientWidth\n const h = el.clientHeight\n setSize((s) => (s.w === w && s.h === h ? s : { w, h }))\n }\n update()\n const ro = new ResizeObserver(update)\n ro.observe(el)\n return () => ro.disconnect()\n }, [])\n return [ref, size]\n}\n\n/** Scroll position of an element, batched to animation frames. Follows the element when it mounts after the first render. */\nexport function useScroll(ref: React.RefObject<HTMLElement | null>): { x: number; y: number } {\n const [pos, setPos] = useState({ x: 0, y: 0 })\n const [el, setEl] = useState<HTMLElement | null>(null)\n // a conditionally rendered panel (slide thumbnails) gets its element later than the first effect run\n useIsoLayoutEffect(() => {\n if (ref.current !== el) setEl(ref.current)\n })\n useEffect(() => {\n if (!el) return\n let raf = 0\n const read = () => setPos((p) => (p.x === el.scrollLeft && p.y === el.scrollTop ? p : { x: el.scrollLeft, y: el.scrollTop }))\n const on = () => {\n if (raf) return\n raf = requestAnimationFrame(() => {\n raf = 0\n read()\n })\n }\n read()\n el.addEventListener('scroll', on, { passive: true })\n return () => {\n el.removeEventListener('scroll', on)\n cancelAnimationFrame(raf)\n }\n }, [el])\n return pos\n}\n\n/** Lazily resolves a package part to an object URL (null while loading / unsupported). */\nexport function useMediaUrl(client: DocumentClient, path: string | undefined, enabled = true): string | null | 'unsupported' {\n const [url, setUrl] = useState<string | null | 'unsupported'>(null)\n useEffect(() => {\n if (!path || !enabled) return\n if (!isWebImage(path)) {\n setUrl('unsupported')\n return\n }\n let live = true\n client.mediaUrl(path).then(\n (u) => live && setUrl(u),\n () => live && setUrl('unsupported'),\n )\n return () => {\n live = false\n }\n }, [client, path, enabled])\n return url\n}\n\n/** Binary search: last index i with arr[i] <= v. */\nexport function lowerIndex(arr: ArrayLike<number>, v: number): number {\n let lo = 0\n let hi = arr.length - 1\n let ans = 0\n while (lo <= hi) {\n const mid = (lo + hi) >> 1\n if (arr[mid] <= v) {\n ans = mid\n lo = mid + 1\n } else hi = mid - 1\n }\n return ans\n}\n\nexport function useLatest<T>(v: T) {\n const r = useRef(v)\n r.current = v\n return r\n}\n\nexport function useStableCallback<A extends unknown[], R>(fn: (...a: A) => R) {\n const r = useLatest(fn)\n return useCallback((...a: A) => r.current(...a), [r])\n}\n\n/** A control that takes typed text: Ctrl/⌘+A selects its own content. */\nexport function isTextEntry(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el || el.nodeType !== 1) return false\n const tag = el.tagName\n if (tag === 'TEXTAREA' || tag === 'SELECT') return true\n if (tag === 'INPUT') return !/^(button|checkbox|radio|submit|reset|range|color|file|image)$/i.test((el as HTMLInputElement).type)\n return !!el.isContentEditable\n}\n\n/**\n * Focuses `el` so keyboard shortcuts work without a click. The focus stays where it is when a control\n * outside the viewer has it (a host page form); the viewer's own chrome (or the page body) yields.\n */\nexport function claimFocus(el: HTMLElement | null): boolean {\n if (!el) return false\n const doc = el.ownerDocument\n const active = doc.activeElement\n const rn = el.getRootNode()\n const host = typeof ShadowRoot !== 'undefined' && rn instanceof ShadowRoot ? rn.host : null\n const within = el.closest('.de-root') ?? el\n if (active && active !== doc.body && active !== host && !within.contains(active)) return false\n el.focus({ preventScroll: true })\n return true\n}\n","import {\n Children,\n Fragment,\n isValidElement,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type ReactElement,\n type ReactNode,\n type RefObject,\n} from 'react'\n\nconst BORDER_GRID = <path d=\"M4 4h16v16H4zM12 4v16M4 12h16\" strokeDasharray=\"1.2 2.6\" opacity={0.5} strokeWidth={1.4} />\n\nconst P: Record<string, ReactNode> = {\n undo: <path d=\"M9 14 4 9l5-5M4 9h10.5a5.5 5.5 0 0 1 0 11H11\" />,\n redo: <path d=\"m15 14 5-5-5-5M20 9H9.5a5.5 5.5 0 0 0 0 11H13\" />,\n bold: <path d=\"M7 5h6a3.5 3.5 0 0 1 0 7H7zM7 12h7a3.5 3.5 0 0 1 0 7H7z\" strokeWidth={2.4} />,\n italic: <path d=\"M14 5h-4m4 14h-4m3-14-2 14\" strokeWidth={2.2} />,\n underline: <path d=\"M7 4v7a5 5 0 0 0 10 0V4M5 20h14\" />,\n strike: <path d=\"M16 6.5C15.3 5 13.8 4 12 4c-2.5 0-4 1.3-4 3 0 4 8 2.5 8 7 0 2-1.8 3.5-4.2 3.5-2 0-3.6-1-4.3-2.5M4 12h16\" />,\n color: <path d=\"m6 16 6-12 6 12M8.3 11.5h7.4\" />,\n highlight: <path d=\"m9 11-5 5v3h3l5-5M14.5 5.5l4 4L12 16l-4-4zM15 4l5 5\" />,\n fill: <path d=\"m19 11-8-8-8.5 8.5a2 2 0 0 0 0 2.8l5.7 5.7a2 2 0 0 0 2.8 0zM5 2l5 5M21 15s2 2.5 2 4a2 2 0 0 1-4 0c0-1.5 2-4 2-4\" />,\n alignLeft: <path d=\"M4 6h16M4 10h10M4 14h16M4 18h10\" />,\n alignCenter: <path d=\"M4 6h16M7 10h10M4 14h16M7 18h10\" />,\n alignRight: <path d=\"M4 6h16M10 10h10M4 14h16M10 18h10\" />,\n justify: <path d=\"M4 6h16M4 10h16M4 14h16M4 18h16\" />,\n bullets: <path d=\"M9 6h11M9 12h11M9 18h11M4.5 6h.01M4.5 12h.01M4.5 18h.01\" strokeWidth={2.2} />,\n numbers: <path d=\"M10 6h10M10 12h10M10 18h10M4 4.5h1.5v4M4 8.5h3M4 14.5c0-1 2.5-1.2 2.5.3 0 1.2-2.5 1.8-2.5 3.2h2.8\" />,\n indent: <path d=\"M4 5h16M11 10h9M11 14h9M4 19h16M4 9l3 3-3 3\" />,\n outdent: <path d=\"M4 5h16M11 10h9M11 14h9M4 19h16M7 9l-3 3 3 3\" />,\n clear: <path d=\"M5 5h10M10 5l-3 14M14 14l5 5m0-5-5 5\" />,\n search: <path d=\"m20 20-4.2-4.2M17 11a6 6 0 1 1-12 0 6 6 0 0 1 12 0\" />,\n save: <path d=\"M12 4v11m-4.5-4.5L12 15l4.5-4.5M5 19h14\" />,\n wrap: <path d=\"M4 6h16M4 12h13a3 3 0 0 1 0 6h-4m2-2-2 2 2 2M4 18h5\" />,\n edit: <path d=\"m4 20 1-4L16 5l3 3L8 19zM14 7l3 3\" />,\n view: <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12m10 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6\" />,\n close: <path d=\"M6 6l12 12M18 6 6 18\" />,\n image: <path d=\"M4 5h16v14H4zM4 16l5-5 4 4 3-3 4 4M15.5 9.5h.01\" />,\n table: <path d=\"M4 5h16v14H4zM4 10h16M4 15h16M10 5v14M15 5v14\" />,\n link: <path d=\"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1\" />,\n pagebreak: <path d=\"M5 4v5h14V4M5 20v-5h14v5M3 12h2m3 0h2m3 0h2m3 0h3\" />,\n sup: <path d=\"m4 8 8 10m0-10L4 18M16 4h4l-4 5h4\" />,\n sub: <path d=\"m4 6 8 10m0-10L4 16M16 15h4l-4 5h4\" />,\n lineSpacing: <path d=\"M10 6h10M10 12h10M10 18h10M5 4v16M3 6l2-2 2 2M3 18l2 2 2-2\" />,\n plus: <path d=\"M12 5v14M5 12h14\" />,\n minus: <path d=\"M5 12h14\" />,\n fit: <path d=\"M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5\" />,\n shape: <path d=\"M4 4h9v9H4zM17 11a4 4 0 1 1 0 8 4 4 0 0 1 0-8\" />,\n textbox: <path d=\"M4 5h16v14H4zM8 9h8M12 9v7\" />,\n slideAdd: <path d=\"M3 6h14v12H3zM20 8v6M17 11h6\" />,\n copy: <path d=\"M8 8h12v12H8zM4 16V4h12\" />,\n trash: <path d=\"M4 7h16M9 7V4h6v3M6 7l1 13h10l1-13\" />,\n play: <path d=\"M7 4l13 8-13 8z\" />,\n front: <path d=\"M8 8h12v12H8zM4 4h10v3M4 4v10h3\" />,\n back: <path d=\"M4 4h12v12H4zM20 8v12H8v-3\" />,\n merge: <path d=\"M4 5h16v14H4zM9 12H4m16 0h-5m-6-3 3 3-3 3m6-6-3 3 3 3\" />,\n borders: <path d=\"M4 4h16v16H4zM12 4v16M4 12h16\" strokeDasharray=\"2 2\" />,\n freeze: <path d=\"M4 4h16v16H4zM4 9h16M9 4v16\" />,\n sum: <path d=\"M17 5H7l6 7-6 7h10\" />,\n rowAdd: <path d=\"M4 4h16v6H4zM12 14v6M9 17h6\" />,\n colAdd: <path d=\"M4 4h6v16H4zM14 12h6M17 9v6\" />,\n sort: <path d=\"M7 4v16M4 17l3 3 3-3M14 6h6M14 12h4M14 18h2\" />,\n up: <path d=\"m6 15 6-6 6 6\" />,\n down: <path d=\"m6 9 6 6 6-6\" />,\n chevron: <path d=\"m7 10 5 5 5-5\" />,\n lineWeight: <><path d=\"M4 6h16\" strokeWidth={1} /><path d=\"M4 11h16\" strokeWidth={2.2} /><path d=\"M4 17.5h16\" strokeWidth={3.6} /></>,\n rotate: <path d=\"M20 11a8 8 0 1 0-2.3 5.7M20 4v7h-7\" />,\n rotateCcw: <path d=\"M4 11a8 8 0 1 1 2.3 5.7M4 4v7h7\" />,\n flipH: <path d=\"M12 3v18M9 7 4 17h5zM15 7l5 10h-5z\" />,\n flipV: <path d=\"M3 12h18M7 9 17 4v5zM7 15l10 5v-5z\" />,\n alignObj: <path d=\"M4 3v18M8 7h12v4H8zM8 14h7v4H8z\" />,\n currency: <path d=\"M12 3v18M16.5 7.5C16 5.9 14.3 5 12 5c-2.6 0-4.5 1.3-4.5 3.3 0 4.7 9 2.6 9 7.4 0 2-1.9 3.3-4.5 3.3-2.4 0-4.2-1-4.7-2.8\" />,\n vTop: <path d=\"M5 4h14M12 20V8M8.5 11.5 12 8l3.5 3.5\" />,\n vMiddle: <path d=\"M5 12h14M12 3v6M9.5 6.5 12 9l2.5-2.5M12 21v-6M9.5 17.5 12 15l2.5 2.5\" />,\n vBottom: <path d=\"M5 20h14M12 4v12M8.5 12.5 12 16l3.5-3.5\" />,\n rotNone: <path d=\"M5 17h14M7 14l3-8 3 8M8 11.5h4\" />,\n rotUp: <path d=\"M5 19h14M6 15l9.5-9.5M9 6.5l4.5 7.5M8 10l4-.5\" />,\n rotDown: <path d=\"M5 5h14M6 9l9.5 9.5M9 17.5l4.5-7.5M8 14l4 .5\" />,\n rotStack: <path d=\"M9 4l2 5 2-5M9.6 6.5h2.8M9 11h4M11 11v4M9 15h4M9 17h3a1.5 1.5 0 0 1 0 3H9z\" strokeWidth={1.5} />,\n rotUp90: <path d=\"M19 5v14M15 18l-8-3 8-3M12.5 13v4M7 7l2-2 2 2M9 5v6\" />,\n rotDown90: <path d=\"M19 5v14M7 6l8 3-8 3M9.5 11V7M13 17l-2 2-2-2M11 19v-6\" />,\n sortAZ: <path d=\"M7 4v16M4 17l3 3 3-3M13 11l2.5-7 2.5 7M13.7 9h3.6M13 14h5l-5 6h5\" />,\n sortZA: <path d=\"M7 4v16M4 17l3 3 3-3M13 4h5l-5 6h5M13 20l2.5-7 2.5 7M13.7 18h3.6\" />,\n gridlines: <path d=\"M4 4h16v16H4zM4 9.3h16M4 14.6h16M9.3 4v16M14.6 4v16\" />,\n lineStyle: <path d=\"M4 6h16M4 12h16M4 18h3M10 18h4M17 18h3\" strokeWidth={2} />,\n paint: <path d=\"M5 4h11v5H5zM16 6.5h3v5l-7 1.5v3M11 16h2v5h-2z\" />,\n omega: <path d=\"M5 19h4v-2.5A6.5 6.5 0 1 1 15 16.5V19h4\" />,\n outline: <path d=\"M4 6h.01M4 12h.01M4 18h.01M8 6h12M11 12h9M11 18h9\" strokeWidth={2} />,\n imgOrig: <path d=\"M4 5h16v14H4zM8 15V9l-1.5 1.5M12 10h.01M12 14h.01M16.5 15V9L15 10.5\" />,\n imgReplace: <path d=\"M4 5h10v8H4zM4 11l3-3 3 3 2-2 2 2M14 19h6v-6M20 19l-5-5M7 16v3h4\" />,\n alt: <path d=\"M4 5h16v14H4zM7.5 15l2.5-6 2.5 6M8.3 13h3.4M15 9v6h2.5\" />,\n cut: <path d=\"M6 6a2.5 2.5 0 1 0 0 .01M6 18a2.5 2.5 0 1 0 0 .01M8 7.5 19 18M8 16.5 19 6\" />,\n paste: <path d=\"M9 4h6v3H9zM15 5h3v15H6V5h3\" />,\n pastePlain: <path d=\"M9 4h6v3H9zM15 5h3v15H6V5h3M9 11h6M12 11v6\" />,\n external: <path d=\"M14 4h6v6M20 4l-9 9M18 14v6H4V6h6\" />,\n unlink: <path d=\"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1M3 3l18 18\" />,\n selectAll: <path d=\"M4 4h3M10 4h4M17 4h3v3M20 10v4M20 17v3h-3M14 20h-4M7 20H4v-3M4 14v-4M4 7V4M8 8h8v8H8z\" />,\n hideShow: <path d=\"M3 3l18 18M10.6 6.1A10 10 0 0 1 12 6c6.5 0 10 6 10 6a17 17 0 0 1-3.1 3.8M6.6 7.6C3.8 9.3 2 12 2 12s3.5 6 10 6c1.6 0 3-.4 4.3-1\" />,\n percent: <path d=\"M19 5 5 19M7.5 9.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4M16.5 18.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4\" />,\n decLess: <path d=\"M3.5 16h.01M8 9.5a2.5 3.5 0 1 1 0 7 2.5 3.5 0 0 1 0-7M21 19h-7m0 0 2-2m-2 2 2 2\" strokeWidth={1.7} />,\n decMore: <path d=\"M3.5 16h.01M8 9.5a2.5 3.5 0 1 1 0 7 2.5 3.5 0 0 1 0-7M14.5 9.5a2 3 0 1 1 0 6 2 3 0 0 1 0-6M13 19h8m0 0-2-2m2 2-2 2\" strokeWidth={1.7} />,\n check: <path d=\"m5 12.5 4.5 4.5L19 7.5\" strokeWidth={2.2} />,\n more: <path d=\"M12 5.5h.01M12 12h.01M12 18.5h.01\" strokeWidth={3.2} />,\n bAll: <path d=\"M4 4h16v16H4zM12 4v16M4 12h16\" />,\n bOuter: <>{BORDER_GRID}<path d=\"M4 4h16v16H4z\" /></>,\n bInner: <>{BORDER_GRID}<path d=\"M12 4v16M4 12h16\" /></>,\n bTop: <>{BORDER_GRID}<path d=\"M4 4h16\" strokeWidth={2.2} /></>,\n bBottom: <>{BORDER_GRID}<path d=\"M4 20h16\" strokeWidth={2.2} /></>,\n bLeft: <>{BORDER_GRID}<path d=\"M4 4v16\" strokeWidth={2.2} /></>,\n bRight: <>{BORDER_GRID}<path d=\"M20 4v16\" strokeWidth={2.2} /></>,\n bNone: BORDER_GRID,\n rect: <path d=\"M4 6h16v12H4z\" />,\n roundRect: <path d=\"M8 6h8a4 4 0 0 1 4 4v4a4 4 0 0 1-4 4H8a4 4 0 0 1-4-4v-4a4 4 0 0 1 4-4\" />,\n ellipse: <path d=\"M12 6c4.4 0 8 2.7 8 6s-3.6 6-8 6-8-2.7-8-6 3.6-6 8-6\" />,\n triangle: <path d=\"M12 5l8 14H4z\" />,\n arrow: <path d=\"M4 10h9V6l7 6-7 6v-4H4z\" />,\n star: <path d=\"m12 4 2.4 5 5.6.7-4.1 3.8 1.1 5.5-5-2.8-5 2.8 1.1-5.5L4 9.7 9.6 9z\" />,\n line: <path d=\"M5 19 19 5\" />,\n rowAbove: <path d=\"M4 12h16v8H4zM12 3v6M9 6h6\" />,\n rowBelow: <path d=\"M4 4h16v8H4zM12 15v6M9 18h6\" />,\n colLeft: <path d=\"M12 4h8v16h-8zM3 12h6M6 9v6\" />,\n colRight: <path d=\"M4 4h8v16H4zM15 12h6M18 9v6\" />,\n delRow: <path d=\"M4 8h16v8H4zM9 10.5l6 3m0-3-6 3\" />,\n delCol: <path d=\"M8 4h8v16H8zM10.5 9l3 6m0-6-3 6\" />,\n hide: <path d=\"M3 3l18 18M10.6 6.1A10 10 0 0 1 12 6c6.5 0 10 6 10 6a17 17 0 0 1-3.1 3.8M6.6 7.6C3.8 9.3 2 12 2 12s3.5 6 10 6c1.6 0 3-.4 4.3-1M9.9 9.9a3 3 0 0 0 4.2 4.2\" />,\n file: <path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8zM14 3v5h5\" />,\n open: <path d=\"M4 19V6a1 1 0 0 1 1-1h4l2 2h7a1 1 0 0 1 1 1v2M4 19l2.6-7.2a1 1 0 0 1 .9-.8H20a1 1 0 0 1 1 1.3L18.6 19z\" />,\n print: <path d=\"M7 9V4h10v5M7 17H5a1 1 0 0 1-1-1v-6a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1h-2M7 14h10v6H7z\" />,\n pdf: <path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8zM14 3v5h5M8.5 16.5v-4h1.2a1.2 1.2 0 0 1 0 2.4H8.5M13 12.5v4h.8a1.6 1.6 0 0 0 1.6-1.6v-.8a1.6 1.6 0 0 0-1.6-1.6z\" strokeWidth={1.5} />,\n html: <path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8zM14 3v5h5M10 12l-2 2.5 2 2.5M14 12l2 2.5-2 2.5\" />,\n doc: <path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8zM14 3v5h5M9 13h6M9 17h4\" />,\n slides: <path d=\"M4 5h16v11H4zM12 16v4M8 20h8\" />,\n info: <path d=\"M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM12 11v5M12 8h.01\" />,\n}\n\nexport function Icon({ name, size = 18 }: { name: string; size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n {P[name]}\n </svg>\n )\n}\n\nconst keep = (e: React.MouseEvent) => e.preventDefault()\n\n/** popover panel kept inside the viewport horizontally */\nfunction PopBox(props: { className?: string; children: ReactNode; onMouseDown?: (e: React.MouseEvent) => void }) {\n const ref = useRef<HTMLDivElement>(null)\n const [dx, setDx] = useState(0)\n useLayoutEffect(() => {\n const el = ref.current\n if (!el) return\n const r = el.getBoundingClientRect()\n const vw = document.documentElement.clientWidth\n if (r.right > vw - 8) setDx(-Math.min(r.left - 8, r.right - vw + 8))\n else if (r.left < 8) setDx(8 - r.left)\n }, [])\n return (\n <div ref={ref} className={props.className ?? 'de-tb-pop'} style={dx ? { transform: `translateX(${dx}px)` } : undefined} onMouseDown={props.onMouseDown}>\n {props.children}\n </div>\n )\n}\n\n/** closes a popup on outside mousedown (shadow-DOM safe: uses the composed path) */\nexport function useDismiss(ref: RefObject<HTMLElement | null>, open: boolean, close: () => void) {\n const cb = useRef(close)\n cb.current = close\n useEffect(() => {\n if (!open) return\n const on = (e: MouseEvent) => {\n const el = ref.current\n if (el && !e.composedPath().includes(el)) cb.current()\n }\n window.addEventListener('mousedown', on, true)\n return () => window.removeEventListener('mousedown', on, true)\n }, [open, ref])\n}\n\nexport function Btn(props: { icon?: string; label?: ReactNode; title: string; active?: boolean; disabled?: boolean; onClick: () => void; wide?: boolean }) {\n return (\n <button\n type=\"button\"\n className={props.active ? 'de-tb de-tb-on' : 'de-tb'}\n title={props.title}\n aria-label={props.title}\n aria-pressed={props.active}\n disabled={props.disabled}\n onMouseDown={keep}\n onClick={props.onClick}\n style={props.wide ? { width: 'auto', padding: '0 8px' } : undefined}\n >\n {props.icon ? <Icon name={props.icon} /> : props.label}\n </button>\n )\n}\n\nexport const Sep = () => <span className=\"de-tb-sep\" />\n\nexport interface DropOption<T> {\n value: T\n label: string\n /** secondary text on the right (example, shortcut) */\n hint?: string\n icon?: string\n /** label style (font / style previews) */\n style?: CSSProperties\n disabled?: boolean\n /** separator above this option */\n sep?: boolean\n /** group heading above this option */\n head?: string\n}\n\n/**\n * Styled dropdown (listbox). Never takes focus from the editor: mouse down is prevented and,\n * while open, keys are captured at the window (arrows, Enter, Escape, type-ahead).\n */\nexport function Dropdown<T extends string | number>(props: {\n title: string\n options: DropOption<T>[]\n onChange: (v: T) => void\n /** selected value (check mark); omit for command menus */\n value?: T | ''\n placeholder?: string\n /** fixed trigger content (menus); null = icon only */\n label?: ReactNode\n icon?: string\n width?: number\n menuWidth?: number\n disabled?: boolean\n /** popup aligned to the trigger's right edge */\n alignRight?: boolean\n /** extra class of the trigger button */\n className?: string\n}) {\n const { options } = props\n const [open, setOpen] = useState(false)\n const [hi, setHi] = useState(-1)\n const [shift, setShift] = useState(0)\n const ref = useRef<HTMLSpanElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n const typed = useRef({ text: '', at: 0 })\n const check = props.value !== undefined\n const sel = check ? options.findIndex((o) => o.value === props.value) : -1\n const current = sel >= 0 ? options[sel] : undefined\n useDismiss(ref, open, () => setOpen(false))\n\n const pick = (o: DropOption<T> | undefined) => {\n if (!o || o.disabled) return\n setOpen(false)\n props.onChange(o.value)\n }\n const show = () => {\n setHi(sel >= 0 ? sel : options.findIndex((o) => !o.disabled))\n setShift(0)\n setOpen(true)\n }\n\n // keyboard while open (captured so the document editor does not see the keys)\n useEffect(() => {\n if (!open) return\n const on = (e: KeyboardEvent) => {\n const n = options.length\n const step = (from: number, d: number) => {\n let i = from\n for (let k = 0; k < n; k++) {\n i = (i + d + n) % n\n if (!options[i].disabled) return i\n }\n return from\n }\n if (e.key === 'ArrowDown') setHi((h) => step(h, 1))\n else if (e.key === 'ArrowUp') setHi((h) => step(h < 0 ? 0 : h, -1))\n else if (e.key === 'Home') setHi(step(-1, 1))\n else if (e.key === 'End') setHi(step(0, -1))\n else if (e.key === 'Enter' || (e.key === ' ' && !typed.current.text)) pick(options[hi])\n else if (e.key === 'Escape') setOpen(false)\n else if (e.key === 'Tab') return setOpen(false)\n else if (e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey) {\n // type-ahead on labels\n const t = typed.current\n t.text = (Date.now() - t.at < 700 ? t.text : '') + e.key.toLowerCase()\n t.at = Date.now()\n const i = options.findIndex((o) => !o.disabled && o.label.toLowerCase().startsWith(t.text))\n if (i >= 0) setHi(i)\n } else return\n e.preventDefault()\n e.stopPropagation()\n }\n window.addEventListener('keydown', on, true)\n return () => window.removeEventListener('keydown', on, true)\n }, [open, hi, options]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // keep the popup inside the viewport, highlighted option visible\n useLayoutEffect(() => {\n const el = listRef.current\n if (!open || !el) return\n const r = el.getBoundingClientRect()\n const vw = document.documentElement.clientWidth\n if (r.right > vw - 8) setShift((s) => s - (r.right - vw + 8))\n else if (r.left < 8) setShift((s) => s + (8 - r.left))\n // the viewer clips its content: keep the list above its bottom edge (scrolls when longer)\n const root = el.closest('.de-root')\n const bottom = Math.min(document.documentElement.clientHeight, root ? root.getBoundingClientRect().bottom : Infinity)\n const cssMax = parseFloat(getComputedStyle(el).maxHeight)\n const room = bottom - r.top - 8\n if (room > 0) el.style.maxHeight = `${Math.max(120, Math.min(Number.isFinite(cssMax) ? cssMax : room, room))}px`\n }, [open])\n useLayoutEffect(() => {\n if (open) listRef.current?.querySelector(`[data-i=\"${hi}\"]`)?.scrollIntoView({ block: 'nearest' })\n }, [open, hi])\n\n const label = props.label !== undefined ? props.label : (current?.label ?? props.placeholder ?? '')\n return (\n <span ref={ref} className=\"de-dd-wrap\">\n <button\n type=\"button\"\n className={(open ? 'de-dd de-dd-open' : 'de-dd') + (props.className ? ' ' + props.className : '')}\n style={{ width: props.width }}\n title={props.title}\n aria-label={props.title}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n disabled={props.disabled}\n onMouseDown={keep}\n onClick={() => (open ? setOpen(false) : show())}\n onKeyDown={(e) => {\n if (!open && (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault()\n show()\n }\n }}\n >\n {props.icon && <Icon name={props.icon} />}\n {label !== null && <span className={current || props.label !== undefined ? 'de-dd-label' : 'de-dd-label de-dd-ph'}>{label}</span>}\n <Icon name=\"chevron\" size={14} />\n </button>\n {open && (\n <div\n ref={listRef}\n className=\"de-dd-pop\"\n role=\"listbox\"\n aria-label={props.title}\n style={{ minWidth: props.menuWidth, ...(props.alignRight ? { right: -shift } : { left: shift }) }}\n onMouseDown={keep}\n >\n {options.map((o, i) => (\n <Fragment key={String(o.value)}>\n {o.sep && i > 0 && <div className=\"de-dd-sep\" role=\"separator\" />}\n {o.head && (\n <div className=\"de-dd-head\" role=\"presentation\">\n {o.head}\n </div>\n )}\n <div\n data-i={i}\n role=\"option\"\n aria-selected={i === sel}\n aria-disabled={o.disabled || undefined}\n className={'de-dd-opt' + (i === hi ? ' de-dd-hi' : '') + (o.disabled ? ' de-dd-dis' : '')}\n onMouseMove={() => i !== hi && !o.disabled && setHi(i)}\n onClick={() => pick(o)}\n >\n {check && <span className=\"de-dd-check\">{i === sel && <Icon name=\"check\" size={16} />}</span>}\n {o.icon && <Icon name={o.icon} />}\n <span className=\"de-dd-text\" style={o.style}>\n {o.label}\n </span>\n {o.hint && <span className=\"de-dd-hint\">{o.hint}</span>}\n </div>\n </Fragment>\n ))}\n </div>\n )}\n </span>\n )\n}\n\n/** Value picker (fonts, styles, formats…). */\nexport function Select<T extends string | number>(props: {\n value: T | ''\n options: DropOption<T>[]\n onChange: (v: T) => void\n title: string\n width?: number\n placeholder?: string\n menuWidth?: number\n disabled?: boolean\n}) {\n return <Dropdown {...props} />\n}\n\n/** Font size box: − [size] + with a list of common sizes (Google Docs style). */\nexport function SizeBox(props: { value?: number; placeholder?: number; sizes?: number[]; onChange: (n: number) => void; title?: string; disabled?: boolean }) {\n const sizes = props.sizes ?? SIZES\n const [text, setText] = useState<string | null>(null)\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLSpanElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n useDismiss(ref, open, () => setOpen(false))\n const base = props.value ?? props.placeholder ?? 11\n const set = (n: number) => {\n setText(null)\n setOpen(false)\n if (Number.isFinite(n) && n >= 1 && n <= 400) props.onChange(Math.round(n * 2) / 2)\n }\n const done = () => {\n if (text !== null) set(parseFloat(text))\n inputRef.current?.blur()\n }\n const title = props.title ?? 'Font size'\n return (\n <span ref={ref} className=\"de-size\">\n <button type=\"button\" className=\"de-tb de-size-step\" title=\"Decrease font size\" aria-label=\"Decrease font size\" disabled={props.disabled} onMouseDown={keep} onClick={() => set(Math.max(1, Math.ceil(base) - 1))}>\n <Icon name=\"minus\" size={16} />\n </button>\n <input\n ref={inputRef}\n className=\"de-size-input\"\n title={title}\n aria-label={title}\n inputMode=\"decimal\"\n disabled={props.disabled}\n value={text ?? (props.value !== undefined ? String(props.value) : '')}\n placeholder={props.placeholder !== undefined ? String(props.placeholder) : ''}\n onFocus={(e) => {\n e.currentTarget.select()\n setOpen(true)\n }}\n onChange={(e) => setText(e.target.value.replace(/[^\\d.]/g, ''))}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n done()\n } else if (e.key === 'Escape') {\n e.preventDefault()\n setText(null)\n setOpen(false)\n inputRef.current?.blur()\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault()\n const cur = parseFloat(text ?? String(base))\n const next = e.key === 'ArrowUp' ? sizes.find((n) => n > cur) : [...sizes].reverse().find((n) => n < cur)\n if (next !== undefined) setText(String(next))\n }\n }}\n onBlur={() => {\n if (text !== null) set(parseFloat(text))\n setOpen(false)\n }}\n />\n <button type=\"button\" className=\"de-tb de-size-step\" title=\"Increase font size\" aria-label=\"Increase font size\" disabled={props.disabled} onMouseDown={keep} onClick={() => set(Math.floor(base) + 1)}>\n <Icon name=\"plus\" size={16} />\n </button>\n {open && (\n <div className=\"de-dd-pop de-size-pop\" role=\"listbox\" aria-label={title} onMouseDown={keep}>\n {sizes.map((n) => (\n <div key={n} role=\"option\" aria-selected={n === props.value} className={'de-dd-opt' + (String(n) === (text ?? String(props.value)) ? ' de-dd-hi' : '')} onClick={() => set(n)}>\n {n}\n </div>\n ))}\n </div>\n )}\n </span>\n )\n}\n\n// ---------------------------------------------------------------- responsive toolbar row\n\nfunction flatten(children: ReactNode): ReactElement[] {\n const out: ReactElement[] = []\n Children.forEach(children, (c) => {\n if (!isValidElement(c)) return\n if (c.type === Fragment) out.push(...flatten((c.props as { children?: ReactNode }).children))\n else out.push(c)\n })\n return out\n}\n\nconst signature = (el: ReactElement) => {\n const p = el.props as { title?: string; icon?: string; label?: unknown }\n const t = typeof el.type === 'string' ? el.type : (el.type as { name?: string }).name\n return `${t}:${p.title ?? p.icon ?? (typeof p.label === 'string' ? p.label : '')}`\n}\n\n/**\n * One-line toolbar: items that do not fit move into a \"more\" popover (like Google Docs).\n * Item widths are measured once per set of items and cached for resizes.\n */\nexport function ToolbarRow({ children }: { children: ReactNode }) {\n const items = flatten(children)\n const sig = items.map(signature).join('|')\n const rowRef = useRef<HTMLDivElement>(null)\n const widths = useRef<number[]>([])\n const [fit, setFit] = useState<{ sig: string; cut: number; w: number }>({ sig: '', cut: items.length, w: 0 })\n const [more, setMore] = useState(false)\n const moreRef = useRef<HTMLSpanElement>(null)\n useDismiss(moreRef, more, () => setMore(false))\n const measured = fit.sig === sig\n const cut = measured ? fit.cut : items.length\n\n const layout = (w: number) => {\n const ws = widths.current\n const gap = 2\n const total = ws.reduce((a, b) => a + b + gap, 0)\n let k = items.length\n if (total > w) {\n const room = w - 34\n let used = 0\n k = 0\n while (k < items.length && used + ws[k] + gap <= room) used += ws[k++] + gap\n }\n setFit((f) => (f.sig === sig && f.cut === k && f.w === w ? f : { sig, cut: k, w }))\n }\n const avail = () => {\n const el = rowRef.current\n if (!el) return 0\n const cs = getComputedStyle(el)\n return el.clientWidth - parseFloat(cs.paddingLeft) - parseFloat(cs.paddingRight)\n }\n\n // new set of items: everything is rendered once, measured, then cut\n useLayoutEffect(() => {\n const el = rowRef.current\n if (!el || measured) return\n widths.current = [...el.querySelectorAll<HTMLElement>(':scope > [data-i]')].map((x) => x.getBoundingClientRect().width)\n layout(avail())\n })\n const relayout = useRef(() => {})\n relayout.current = () => {\n if (widths.current.length === items.length) layout(avail())\n }\n useEffect(() => {\n const el = rowRef.current\n if (!el) return\n const ro = new ResizeObserver(() => relayout.current())\n ro.observe(el)\n return () => ro.disconnect()\n }, [])\n\n const isSep = (el: ReactElement | undefined) => !!el && el.type === Sep\n let end = cut\n while (end > 0 && isSep(items[end - 1]) && end < items.length) end--\n const rest = items.slice(cut).filter((el, i, all) => !(isSep(el) && (i === 0 || i === all.length - 1)))\n return (\n <div ref={rowRef} className=\"de-ebar\" role=\"toolbar\">\n {items.slice(0, end).map((el, i) => (\n <span key={i} data-i={i} className=\"de-ebar-it\">\n {el}\n </span>\n ))}\n {rest.length > 0 && (\n <span ref={moreRef} className=\"de-tb-color de-ebar-morewrap\">\n <button type=\"button\" className={more ? 'de-tb de-tb-on' : 'de-tb'} title=\"More\" aria-label=\"More tools\" aria-expanded={more} onMouseDown={keep} onClick={() => setMore((m) => !m)}>\n <Icon name=\"more\" />\n </button>\n {more && (\n <PopBox className=\"de-tb-pop de-ebar-more\">\n {rest.map((el, i) => (\n <span key={i} className=\"de-ebar-it\">\n {el}\n </span>\n ))}\n </PopBox>\n )}\n </span>\n )}\n </div>\n )\n}\n\nconst PALETTE = [\n '#000000', '#434343', '#666666', '#999999', '#b7b7b7', '#cccccc', '#d9d9d9', '#ffffff',\n '#980000', '#ff0000', '#ff9900', '#ffff00', '#00ff00', '#00ffff', '#4a86e8', '#0000ff',\n '#9900ff', '#ff00ff', '#e6b8af', '#f4cccc', '#fce5cd', '#fff2cc', '#d9ead3', '#d0e0e3',\n '#c9daf8', '#cfe2f3', '#d9d2e9', '#ead1dc', '#cc4125', '#e06666', '#f6b26b', '#ffd966',\n '#93c47d', '#76a5af', '#6d9eeb', '#6fa8dc', '#8e7cc3', '#c27ba0', '#1155cc', '#38761d',\n]\n\n// custom colors picked by the user: shared by every color button, kept across sessions\nconst CUSTOM_KEY = 'office-engine:custom-colors'\nconst MAX_CUSTOM = 7\nconst HEX6 = /^#[0-9a-f]{6}$/\nlet customColors: string[] | null = null\nconst customListeners = new Set<() => void>()\n\nfunction getCustomColors(): string[] {\n if (customColors) return customColors\n customColors = []\n try {\n const v: unknown = JSON.parse(localStorage.getItem(CUSTOM_KEY) ?? '[]')\n if (Array.isArray(v)) customColors = v.filter((c): c is string => typeof c === 'string' && HEX6.test(c)).slice(0, MAX_CUSTOM)\n } catch {\n // storage unavailable (private mode, sandbox)\n }\n return customColors\n}\n\nfunction addCustomColor(c: string) {\n customColors = [c, ...getCustomColors().filter((x) => x !== c)].slice(0, MAX_CUSTOM)\n try {\n localStorage.setItem(CUSTOM_KEY, JSON.stringify(customColors))\n } catch {\n // not persisted\n }\n customListeners.forEach((f) => f())\n}\n\nconst subscribeCustom = (f: () => void) => {\n customListeners.add(f)\n return () => {\n customListeners.delete(f)\n }\n}\n\nexport function ColorBtn(props: { icon: string; title: string; value?: string; onPick: (c: string | null) => void; palette?: string[]; noneLabel?: string }) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLSpanElement>(null)\n const pickerRef = useRef<HTMLInputElement>(null)\n const custom = useSyncExternalStore(subscribeCustom, getCustomColors, getCustomColors)\n useDismiss(ref, open, () => setOpen(false))\n const onPick = useRef(props.onPick)\n onPick.current = props.onPick\n const cur = props.value?.toLowerCase()\n\n // native 'change' fires once the OS picker is confirmed (React's onChange would fire while dragging)\n useEffect(() => {\n const el = pickerRef.current\n if (!el) return\n const on = () => {\n const c = el.value.toLowerCase()\n if (!HEX6.test(c)) return\n addCustomColor(c)\n onPick.current(c)\n }\n el.addEventListener('change', on)\n return () => el.removeEventListener('change', on)\n }, [])\n\n const openPicker = () => {\n const el = pickerRef.current\n if (!el) return\n el.value = cur && HEX6.test(cur) ? cur : (custom[0] ?? '#000000')\n setOpen(false)\n try {\n el.showPicker()\n } catch {\n el.click()\n }\n }\n const swatch = (c: string) => (\n <button key={c} type=\"button\" title={c} className={cur === c ? 'on' : undefined} style={{ background: c }} onClick={() => (props.onPick(c), setOpen(false))} />\n )\n return (\n <span ref={ref} className=\"de-tb-color\">\n <button type=\"button\" className={open ? 'de-tb de-tb-on' : 'de-tb'} title={props.title} aria-label={props.title} aria-expanded={open} onMouseDown={keep} onClick={() => setOpen((o) => !o)}>\n <Icon name={props.icon} />\n <span className=\"de-tb-swatch\" style={{ background: props.value ?? 'transparent' }} />\n </button>\n {/* kept mounted while the OS picker is open (the popover closes) */}\n <input ref={pickerRef} type=\"color\" className=\"de-tb-native\" tabIndex={-1} aria-hidden />\n {open && (\n <PopBox onMouseDown={keep}>\n <button type=\"button\" className=\"de-tb-none\" onClick={() => (props.onPick(null), setOpen(false))}>\n {props.noneLabel ?? 'None'}\n </button>\n <div className=\"de-tb-grid\">{(props.palette ?? PALETTE).map(swatch)}</div>\n <div className=\"de-tb-custom\">Custom</div>\n <div className=\"de-tb-grid\">\n {custom.map(swatch)}\n <button type=\"button\" className=\"de-tb-add\" title=\"Custom color…\" aria-label=\"Custom color\" onClick={openPicker}>\n <Icon name=\"plus\" size={14} />\n </button>\n </div>\n </PopBox>\n )}\n </span>\n )\n}\n\nexport const FONTS = ['Arial', 'Calibri', 'Cambria', 'Courier New', 'Georgia', 'Helvetica', 'Segoe UI', 'Tahoma', 'Times New Roman', 'Verdana']\nexport const SIZES = [8, 9, 10, 10.5, 11, 12, 14, 16, 18, 20, 24, 28, 32, 36, 40, 48, 60, 72]\n\n/** Font picker options (each shown in its own face); keeps an unknown current font at the top. */\nexport function fontOptions(current?: string): DropOption<string>[] {\n const list = current && !FONTS.includes(current) ? [current, ...FONTS] : FONTS\n return list.map((f, i) => ({ value: f, label: f, style: { fontFamily: `\"${f}\", system-ui, sans-serif` }, sep: i === 1 && list !== FONTS }))\n}\n\n/** Picks the first name of a CSS font stack. */\nexport function fontName(css: string | undefined): string {\n if (!css) return ''\n const m = /^\\s*\"?([^\",]+)\"?/.exec(css)\n return m ? m[1] : ''\n}\n\nexport function download(blob: Blob, name: string) {\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = name\n document.body.appendChild(a)\n a.click()\n a.remove()\n setTimeout(() => URL.revokeObjectURL(url), 30_000)\n}\n\n/** Command menu: fixed label, items with optional icons. */\nexport function Menu(props: { title: string; label: string; icon?: string; items: { value: string; label: string; icon?: string; disabled?: boolean; sep?: boolean; hint?: string }[]; onPick: (v: string) => void; width?: number }) {\n return <Dropdown title={props.title} label={props.label.replace(/\\s*▾$/, '')} icon={props.icon} options={props.items} onChange={props.onPick} />\n}\n\n/** Small popover anchored under a toolbar button. */\nexport function Pop(props: { icon: string; title: string; children: (close: () => void) => ReactNode; active?: boolean; disabled?: boolean; chevron?: boolean }) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLSpanElement>(null)\n useDismiss(ref, open, () => setOpen(false))\n return (\n <span ref={ref} className=\"de-tb-color\">\n <button\n type=\"button\"\n className={(props.active || open ? 'de-tb de-tb-on' : 'de-tb') + (props.chevron ? ' de-tb-chev' : '')}\n title={props.title}\n aria-label={props.title}\n aria-expanded={open}\n disabled={props.disabled}\n onMouseDown={keep}\n onClick={() => setOpen((o) => !o)}\n >\n <Icon name={props.icon} />\n {props.chevron && <Icon name=\"chevron\" size={14} />}\n </button>\n {open && (\n <PopBox onMouseDown={(e) => (e.target as HTMLElement).closest('input, textarea') || e.preventDefault()}>\n {props.children(() => setOpen(false))}\n </PopBox>\n )}\n </span>\n )\n}\n\n/** rows × cols picker for new tables */\nexport function GridPicker({ onPick }: { onPick: (r: number, c: number) => void }) {\n const [hover, setHover] = useState<[number, number]>([0, 0])\n return (\n <div>\n <div className=\"de-gridpick\" onMouseLeave={() => setHover([0, 0])}>\n {Array.from({ length: 64 }, (_, i) => {\n const r = Math.floor(i / 8) + 1\n const c = (i % 8) + 1\n return <button key={i} type=\"button\" className={r <= hover[0] && c <= hover[1] ? 'on' : ''} onMouseEnter={() => setHover([r, c])} onMouseDown={keep} onClick={() => onPick(r, c)} />\n })}\n </div>\n <div className=\"de-gridpick-label\">{hover[0] ? `${hover[0]} × ${hover[1]}` : 'Table size'}</div>\n </div>\n )\n}\n\n/** Inline text prompt (URL, sheet name…) inside a popover. */\nexport function PromptBox(props: { placeholder: string; initial?: string; ok: string; onOk: (v: string) => void; extra?: ReactNode }) {\n const [v, setV] = useState(props.initial ?? '')\n return (\n <form\n className=\"de-prompt\"\n onSubmit={(e) => {\n e.preventDefault()\n props.onOk(v)\n }}\n >\n <input autoFocus value={v} placeholder={props.placeholder} onChange={(e) => setV(e.target.value)} />\n <button type=\"submit\" className=\"de-btn\">\n {props.ok}\n </button>\n {props.extra}\n </form>\n )\n}\n\n/** Opens the OS file picker (images by default). */\nexport function pickFiles(accept = 'image/*', multiple = true): Promise<File[]> {\n return new Promise((resolve) => {\n const input = document.createElement('input')\n input.type = 'file'\n input.accept = accept\n input.multiple = multiple\n input.onchange = () => resolve(Array.from(input.files ?? []))\n input.click()\n })\n}\n","import { createContext, useContext, useEffect, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { ToolbarRow } from '../edit/Toolbar'\nimport type { DocumentClient } from '../../core/worker/client'\nimport type { Printable } from '../file/print'\n\n/** What the active view offers to the File menu. */\nexport interface FileOps {\n /** all pages, for PDF / print and HTML */\n printable(): Promise<Printable>\n /** text formats: 'txt' / 'md' (documents, presentations), 'csv' / 'tsv' (current sheet) */\n text(format: string): Promise<string>\n /** File → Document details: [label, value] rows */\n stats(): [string, string][]\n /** File → Import (spreadsheets): rows into a new sheet */\n importTable?(rows: string[][], name: string): Promise<void>\n}\n\nexport interface ViewerApi {\n /** editor bar mount point (null when the viewer toolbar is hidden) */\n bar: HTMLElement | null\n editable: boolean\n /** report unsaved changes */\n setDirty: (dirty: boolean) => void\n /** build + hand off the edited file */\n save: () => Promise<void>\n /** whether files may be downloaded to the user's device */\n canDownload: boolean\n client: DocumentClient | null\n /** set by the mounted view (see useFileOps) */\n fileOps: { current: FileOps | null }\n /** set by the mounted view (see useSelectAll): Ctrl/⌘+A */\n selectAll: { current: (() => void) | null }\n}\n\nexport const ViewerContext = createContext<ViewerApi>({\n bar: null,\n editable: false,\n setDirty: () => {},\n save: async () => {},\n canDownload: true,\n client: null,\n fileOps: { current: null },\n selectAll: { current: null },\n})\n\nexport const useViewer = () => useContext(ViewerContext)\n\n/** Publishes the view's file operations (latest closure each render) to the File menu. */\nexport function useFileOps(ops: FileOps) {\n const slot = useViewer().fileOps\n useEffect(() => {\n slot.current = ops\n })\n useEffect(\n () => () => {\n slot.current = null\n },\n [slot],\n )\n}\n\n/** Publishes the view's select-all: Ctrl/⌘+A from the viewer chrome or, with `captureSelectAll`, from anywhere on the page. */\nexport function useSelectAll(fn: () => void) {\n const slot = useViewer().selectAll\n useEffect(() => {\n slot.current = fn\n })\n useEffect(\n () => () => {\n slot.current = null\n },\n [slot],\n )\n}\n\n/** Renders the editor bar into the viewer's toolbar row. */\nexport function EditorBar({ children }: { children: ReactNode }) {\n const { bar } = useViewer()\n return bar ? createPortal(<ToolbarRow>{children}</ToolbarRow>, bar) : null\n}\n","import { createContext, useContext, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\n\n/** Toolbar slot provided by DocViewer; views portal their status text into it (no parent re-render). */\nexport const StatusContext = createContext<HTMLElement | null>(null)\n\nexport function Status({ text, onStatus }: { text: string; onStatus?: (s: string) => void }) {\n const el = useContext(StatusContext)\n useEffect(() => {\n onStatus?.(text)\n }, [text, onStatus])\n return el ? createPortal(text, el) : null\n}\n","export type Zoom = number | 'fit'\n\nconst STEPS = [0.25, 0.33, 0.5, 0.67, 0.75, 0.9, 1, 1.1, 1.25, 1.5, 1.75, 2, 2.5, 3]\n\nexport function ZoomControl({ zoom, effective, onChange }: { zoom: Zoom; effective: number; onChange: (z: Zoom) => void }) {\n const step = (dir: 1 | -1) => {\n const cur = effective\n const next = dir > 0 ? STEPS.find((s) => s > cur + 0.001) : [...STEPS].reverse().find((s) => s < cur - 0.001)\n if (next) onChange(next)\n }\n return (\n <div className=\"de-zoom\" role=\"group\" aria-label=\"Zoom\">\n <button type=\"button\" aria-label=\"Zoom out\" onClick={() => step(-1)}>\n −\n </button>\n <span title={zoom === 'fit' ? 'Fit width (click for 100%)' : 'Click to fit width'} onClick={() => onChange(zoom === 'fit' ? 1 : 'fit')}>\n {zoom === 'fit' ? 'Fit' : `${Math.round(effective * 100)}%`}\n </span>\n <button type=\"button\" aria-label=\"Zoom in\" onClick={() => step(1)}>\n +\n </button>\n </div>\n )\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport { Icon } from '../edit/Toolbar'\n\nexport interface MenuItem {\n label: string\n run: () => void\n disabled?: boolean\n /** separator above this item */\n sep?: boolean\n /** shortcut / secondary text */\n hint?: string\n icon?: string\n /** small section title above this item */\n head?: string\n}\n\n/** Right-click menu at viewport coordinates; never steals focus from the editor. */\nexport function ContextMenu({ x, y, items, onClose }: { x: number; y: number; items: MenuItem[]; onClose: () => void }) {\n const ref = useRef<HTMLDivElement>(null)\n const [pos, setPos] = useState({ left: x, top: y })\n const [hi, setHi] = useState(-1)\n const close = useRef(onClose)\n close.current = onClose\n\n // keep inside the viewport (flip up / left when needed)\n useLayoutEffect(() => {\n const el = ref.current\n if (!el) return\n const r = el.getBoundingClientRect()\n const vw = document.documentElement.clientWidth\n const vh = document.documentElement.clientHeight\n setPos({\n left: x + r.width > vw - 4 ? Math.max(4, x - r.width) : x,\n top: y + r.height > vh - 4 ? Math.max(4, Math.min(y - r.height, vh - r.height - 4)) : y,\n })\n }, [x, y])\n\n useEffect(() => {\n const down = (e: MouseEvent) => {\n if (ref.current && !e.composedPath().includes(ref.current)) close.current()\n }\n const key = (e: KeyboardEvent) => {\n const n = items.length\n const step = (from: number, d: number) => {\n let i = from\n for (let k = 0; k < n; k++) {\n i = (i + d + n) % n\n if (!items[i].disabled) return i\n }\n return from\n }\n if (e.key === 'Escape') close.current()\n else if (e.key === 'ArrowDown') setHi((h) => step(h, 1))\n else if (e.key === 'ArrowUp') setHi((h) => step(h < 0 ? 0 : h, -1))\n else if (e.key === 'Enter' && hi >= 0 && !items[hi].disabled) {\n close.current()\n items[hi].run()\n } else return\n e.preventDefault()\n e.stopPropagation()\n }\n const away = () => close.current()\n window.addEventListener('mousedown', down, true)\n window.addEventListener('keydown', key, true)\n window.addEventListener('blur', away)\n window.addEventListener('resize', away)\n return () => {\n window.removeEventListener('mousedown', down, true)\n window.removeEventListener('keydown', key, true)\n window.removeEventListener('blur', away)\n window.removeEventListener('resize', away)\n }\n }, [items, hi])\n\n return (\n <div ref={ref} className=\"de-ctx\" style={pos} role=\"menu\" onMouseDown={(e) => e.preventDefault()} onContextMenu={(e) => e.preventDefault()}>\n {items.map((it, i) => (\n <div key={i} className=\"de-ctx-row\">\n {it.sep && i > 0 && <div className=\"de-ctx-sep\" role=\"separator\" />}\n {it.head && <div className=\"de-ctx-head\">{it.head}</div>}\n <button\n type=\"button\"\n role=\"menuitem\"\n className={i === hi ? 'de-ctx-hi' : undefined}\n disabled={it.disabled}\n onMouseEnter={() => setHi(i)}\n onClick={() => {\n close.current()\n it.run()\n }}\n >\n <span className=\"de-ctx-icon\">{it.icon && <Icon name={it.icon} size={16} />}</span>\n <span className=\"de-ctx-label\">{it.label}</span>\n {it.hint && <span className=\"de-ctx-hint\">{it.hint}</span>}\n </button>\n </div>\n ))}\n </div>\n )\n}\n\n/** platform modifier label for shortcut hints */\nexport const MOD = typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.platform) ? '⌘' : 'Ctrl+'\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\n\nexport interface PromptSpec {\n title: string\n label?: string\n initial?: string\n placeholder?: string\n ok?: string\n /** multi-line input */\n area?: boolean\n onOk: (value: string) => void\n /** extra button (e.g. \"Remove link\") */\n extra?: { label: string; run: () => void }\n note?: ReactNode\n}\n\n/** Small modal prompt (no window.prompt: works in sandboxed / embedded pages). */\nexport function PromptDialog({ spec, onClose }: { spec: PromptSpec; onClose: () => void }) {\n const [v, setV] = useState(spec.initial ?? '')\n const ref = useRef<HTMLInputElement & HTMLTextAreaElement>(null)\n useEffect(() => {\n const el = ref.current\n el?.focus()\n el?.select()\n }, [])\n const done = () => {\n onClose()\n spec.onOk(v)\n }\n return (\n <div\n className=\"de-dialog-back\"\n onMouseDown={(e) => e.target === e.currentTarget && onClose()}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.stopPropagation()\n onClose()\n }\n }}\n >\n <form\n className=\"de-dialog\"\n role=\"dialog\"\n aria-label={spec.title}\n onSubmit={(e) => {\n e.preventDefault()\n done()\n }}\n >\n <div className=\"de-dialog-title\">{spec.title}</div>\n {spec.label && <label className=\"de-dialog-label\">{spec.label}</label>}\n {spec.area ? (\n <textarea ref={ref} rows={3} value={v} placeholder={spec.placeholder} onChange={(e) => setV(e.target.value)} />\n ) : (\n <input ref={ref} value={v} placeholder={spec.placeholder} onChange={(e) => setV(e.target.value)} />\n )}\n {spec.note && <div className=\"de-dialog-note\">{spec.note}</div>}\n <div className=\"de-dialog-btns\">\n {spec.extra && (\n <button\n type=\"button\"\n className=\"de-btn de-dialog-extra\"\n onClick={() => {\n onClose()\n spec.extra!.run()\n }}\n >\n {spec.extra.label}\n </button>\n )}\n <button type=\"button\" className=\"de-btn\" onClick={onClose}>\n Cancel\n </button>\n <button type=\"submit\" className=\"de-btn de-btn-primary\">\n {spec.ok ?? 'OK'}\n </button>\n </div>\n </form>\n </div>\n )\n}\n\n/** Yes / no question (no window.confirm: works in sandboxed / embedded pages). */\nexport function ConfirmDialog(props: { title: string; message: ReactNode; ok: string; onOk: () => void; onClose: () => void }) {\n const okRef = useRef<HTMLButtonElement>(null)\n useEffect(() => okRef.current?.focus(), [])\n return (\n <div\n className=\"de-dialog-back\"\n onMouseDown={(e) => e.target === e.currentTarget && props.onClose()}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.stopPropagation()\n props.onClose()\n }\n }}\n >\n <div className=\"de-dialog\" role=\"alertdialog\" aria-label={props.title}>\n <div className=\"de-dialog-title\">{props.title}</div>\n <div className=\"de-dialog-note\">{props.message}</div>\n <div className=\"de-dialog-btns\">\n <button type=\"button\" className=\"de-btn\" onClick={props.onClose}>\n Cancel\n </button>\n <button\n ref={okRef}\n type=\"button\"\n className=\"de-btn de-btn-primary\"\n onClick={() => {\n props.onClose()\n props.onOk()\n }}\n >\n {props.ok}\n </button>\n </div>\n </div>\n </div>\n )\n}\n\n/** Short-lived message at the bottom of the viewer. */\nexport function Toast({ text, onDone }: { text: string; onDone: () => void }) {\n useEffect(() => {\n const id = setTimeout(onDone, 3500)\n return () => clearTimeout(id)\n }, [text, onDone])\n return (\n <div className=\"de-toast\" role=\"status\">\n {text}\n </div>\n )\n}\n","import type { Inline, Paragraph, ParaSpec, SpecRun } from './types'\n\nexport function inlineSpec(x: Inline): SpecRun {\n switch (x.t) {\n case 'text':\n return { text: x.text, src: x.src, set: x.d && Object.keys(x.d).length ? x.d : undefined, lk: x.lk }\n case 'field':\n return { obj: 'field', kind: x.kind }\n case 'img':\n if (x.src) return { obj: 'copy', src: x.src, size: x.resized ? [x.w, x.h] : undefined, alt: x.altSet ? (x.alt ?? '') : undefined, rid: x.repl ? x.rid : undefined }\n return x.rid ? { obj: 'image', rid: x.rid, w: x.w, h: x.h, alt: x.alt } : { text: '' }\n default:\n return x.src ? { obj: 'copy', src: x.src } : { text: '' }\n }\n}\n\n/** Write-back spec for a paragraph (all page-break parts sharing one pid). */\nexport function paraSpec(parts: Paragraph[]): ParaSpec {\n const p0 = parts[0]\n return {\n pid: p0.pid!,\n from: p0.from ?? p0.pid!,\n orig: p0.orig,\n pd: p0.pd,\n keepSect: p0.keepSect,\n pristine: !parts.some((p) => p.edited) && (p0.from === undefined || p0.from === p0.pid),\n parts: parts.map((p) => p.runs.map(inlineSpec)),\n }\n}\n","import type { Inline, RunSet, RunStyle } from '../../core/docx/types'\nimport { cssFont } from '../../core/fonts'\n\nexport interface PastedPara {\n runs: Inline[]\n heading?: number\n list?: 'bullet' | 'number'\n}\n\ntype Ctx = RunStyle & { href?: string; fontName?: string }\n\nconst BLOCK = new Set(['P', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'LI', 'TR', 'BLOCKQUOTE', 'PRE', 'SECTION', 'ARTICLE', 'HEADER', 'FOOTER', 'UL', 'OL', 'TABLE', 'TBODY', 'THEAD', 'DL', 'DT', 'DD', 'FIGURE'])\nconst SKIP = new Set(['SCRIPT', 'STYLE', 'HEAD', 'TITLE', 'META', 'LINK', 'NOSCRIPT', 'TEMPLATE'])\n\nfunction hex(color: string | null | undefined): string | undefined {\n if (!color) return undefined\n const c = color.trim().toLowerCase()\n if (/^#[0-9a-f]{6}$/.test(c)) return c\n if (/^#[0-9a-f]{3}$/.test(c)) return '#' + [...c.slice(1)].map((x) => x + x).join('')\n const m = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)/.exec(c)\n if (m) {\n if (m[4] !== undefined && Number(m[4]) === 0) return undefined\n return '#' + [m[1], m[2], m[3]].map((v) => Number(v).toString(16).padStart(2, '0')).join('')\n }\n return undefined\n}\n\nfunction sizePt(v: string): number | undefined {\n const m = /^([\\d.]+)(pt|px|em|rem)?$/.exec(v.trim())\n if (!m) return undefined\n const n = Number(m[1])\n return m[2] === 'px' ? n * 0.75 : m[2] === 'em' || m[2] === 'rem' ? n * 11 : n\n}\n\nfunction styleOf(el: HTMLElement, base: Ctx): Ctx {\n const s: Ctx = { ...base }\n switch (el.tagName) {\n case 'B':\n case 'STRONG':\n s.b = true\n break\n case 'I':\n case 'EM':\n s.i = true\n break\n case 'U':\n case 'INS':\n s.u = 'single'\n break\n case 'S':\n case 'STRIKE':\n case 'DEL':\n s.strike = true\n break\n case 'SUP':\n s.va = 'sup'\n break\n case 'SUB':\n s.va = 'sub'\n break\n case 'A':\n if ((el as HTMLAnchorElement).href && !(el as HTMLAnchorElement).href.startsWith('javascript:')) {\n s.href = el.getAttribute('href') ?? undefined\n s.u = 'single'\n s.color = '#0563c1'\n }\n break\n case 'FONT': {\n const c = hex(el.getAttribute('color'))\n if (c) s.color = c\n const f = el.getAttribute('face')\n if (f) s.fontName = f.split(',')[0].replace(/['\"]/g, '').trim()\n break\n }\n case 'CODE':\n case 'KBD':\n s.fontName = 'Courier New'\n break\n }\n const st = el.style\n if (st.fontWeight) s.b = st.fontWeight === 'bold' || st.fontWeight === 'bolder' || Number(st.fontWeight) >= 600\n if (st.fontStyle) s.i = st.fontStyle === 'italic' || st.fontStyle === 'oblique'\n const deco = `${st.textDecoration} ${st.textDecorationLine}`\n if (deco.includes('underline')) s.u = 'single'\n if (deco.includes('line-through')) s.strike = true\n if (st.textDecoration === 'none' && el.tagName !== 'A') s.u = undefined\n const c = hex(st.color)\n if (c) s.color = c\n const bg = hex(st.backgroundColor)\n if (bg && bg !== '#ffffff') s.hl = bg\n if (st.fontSize) {\n const pt = sizePt(st.fontSize)\n if (pt && pt >= 4 && pt <= 200) s.sz = Math.round(pt * 2) / 2\n }\n if (st.fontFamily) s.fontName = st.fontFamily.split(',')[0].replace(/['\"]/g, '').trim()\n if (st.verticalAlign === 'super') s.va = 'sup'\n else if (st.verticalAlign === 'sub') s.va = 'sub'\n return s\n}\n\nfunction toRun(text: string, c: Ctx): Inline {\n const { href, fontName, ...rest } = c\n const s: RunStyle = { ...rest }\n if (fontName) s.font = cssFont(fontName)\n const d: RunSet = {}\n if (c.b !== undefined) d.b = c.b\n if (c.i !== undefined) d.i = c.i\n if (c.u) d.u = c.u\n if (c.strike) d.strike = true\n if (c.color) d.color = c.color\n if (c.sz) d.sz = c.sz\n if (fontName) d.font = fontName\n if (c.hl) d.hl = c.hl\n if (c.va) d.va = c.va\n return { t: 'text', text, s, d: Object.keys(d).length ? d : undefined, href } as Inline\n}\n\n/** Converts clipboard HTML (Word, Google Docs, web pages) into paragraphs of formatted runs. */\nexport function htmlToParas(html: string): PastedPara[] {\n const doc = new DOMParser().parseFromString(html, 'text/html')\n const out: PastedPara[] = []\n let cur: PastedPara | null = null\n const para = (props: Partial<PastedPara> = {}) => {\n cur = { runs: [], ...props }\n out.push(cur)\n return cur\n }\n const walk = (node: Node, c: Ctx, list: 'bullet' | 'number' | undefined, pre: boolean) => {\n for (const child of Array.from(node.childNodes)) {\n if (child.nodeType === 3) {\n let text = child.textContent ?? ''\n if (!pre) text = text.replace(/[\\s ]+/g, (m) => (m.includes(' ') && m.length === 1 ? ' ' : ' '))\n if (!text || (!pre && !cur && !text.trim())) continue\n ;(cur ?? para()).runs.push(toRun(text, c))\n continue\n }\n if (child.nodeType !== 1) continue\n const el = child as HTMLElement\n if (SKIP.has(el.tagName)) continue\n if (el.tagName === 'BR') {\n ;(cur ?? para()).runs.push(toRun('\\n', c))\n continue\n }\n if (el.tagName === 'TD' || el.tagName === 'TH') {\n if (cur && (cur as PastedPara).runs.length) (cur as PastedPara).runs.push(toRun('\\t', c))\n walk(el, styleOf(el, c), list, pre)\n continue\n }\n const st = styleOf(el, c)\n if (BLOCK.has(el.tagName)) {\n const nextList = el.tagName === 'UL' ? 'bullet' : el.tagName === 'OL' ? 'number' : list\n if (el.tagName !== 'UL' && el.tagName !== 'OL' && el.tagName !== 'TABLE' && el.tagName !== 'TBODY' && el.tagName !== 'THEAD') {\n const h = /^H([1-6])$/.exec(el.tagName)\n para({ heading: h ? Number(h[1]) : undefined, list: el.tagName === 'LI' ? nextList ?? 'bullet' : undefined })\n }\n walk(el, st, nextList, pre || el.tagName === 'PRE')\n cur = null\n continue\n }\n walk(el, st, list, pre)\n }\n }\n walk(doc.body, {}, undefined, false)\n // trim whitespace-only edges\n for (const p of out) {\n const first = p.runs[0]\n if (first?.t === 'text') first.text = first.text.replace(/^ +/, '')\n const last = p.runs[p.runs.length - 1]\n if (last?.t === 'text') last.text = last.text.replace(/ +$/, '')\n p.runs = p.runs.filter((r) => r.t !== 'text' || r.text)\n }\n while (out.length && !out[0].runs.length) out.shift()\n while (out.length && !out[out.length - 1].runs.length) out.pop()\n return out\n}\n","import type { Paragraph, Table, TableCell, TableRow } from '../../core/docx/types'\n\nexport interface GridCell {\n ri: number\n ci: number\n g: number\n cell: TableCell\n}\n\n/** Grid positions of every cell (row spans occupy following rows). */\nexport function gridOf(t: Table): { cells: GridCell[]; nCols: number; at: (ri: number, g: number) => GridCell | undefined } {\n const occ: boolean[][] = []\n const cells: GridCell[] = []\n t.rows.forEach((row, ri) => {\n let g = 0\n row.cells.forEach((cell, ci) => {\n while (occ[ri]?.[g]) g++\n for (let r = ri; r < ri + Math.max(1, cell.rowSpan); r++) for (let k = g; k < g + Math.max(1, cell.colSpan); k++) (occ[r] ??= [])[k] = true\n cells.push({ ri, ci, g, cell })\n g += Math.max(1, cell.colSpan)\n })\n })\n const nCols = Math.max(t.cols.length, ...cells.map((c) => c.g + c.cell.colSpan))\n const at = (ri: number, g: number) => cells.find((c) => ri >= c.ri && ri < c.ri + c.cell.rowSpan && g >= c.g && g < c.g + c.cell.colSpan)\n return { cells, nCols, at }\n}\n\nexport type NewPara = (template: TableCell) => Paragraph\n\nfunction blankCell(tpl: TableCell, mk: NewPara, colSpan = 1): TableCell {\n return { ...tpl, blocks: [mk(tpl)], colSpan, rowSpan: 1 }\n}\n\nfunction scaleCols(cols: number[], total: number): number[] {\n const sum = cols.reduce((a, b) => a + b, 0) || 1\n return cols.map((w) => +((w * total) / sum).toFixed(2))\n}\n\nexport function insertRow(t: Table, ri: number, below: boolean, mk: NewPara): Table {\n const { cells, nCols, at } = gridOf(t)\n const target = below ? ri + 1 : ri\n const rows = t.rows.map((r) => ({ ...r, cells: [...r.cells] }))\n const newCells: TableCell[] = []\n for (let g = 0; g < nCols; ) {\n const above = at(below ? ri : ri, g)\n if (!above) {\n g++\n continue\n }\n const spansInto = above.ri < target && above.ri + above.cell.rowSpan > target\n if (spansInto) {\n const r = rows[above.ri]\n r.cells[above.ci] = { ...r.cells[above.ci], rowSpan: r.cells[above.ci].rowSpan + 1 }\n } else newCells.push(blankCell(above.cell, mk, above.cell.colSpan))\n g += above.cell.colSpan\n }\n void cells\n const tplRow = t.rows[ri]\n const row: TableRow = { ...tplRow, cells: newCells }\n rows.splice(target, 0, row)\n return { ...t, rows }\n}\n\nexport function deleteRow(t: Table, ri: number): Table | null {\n if (t.rows.length <= 1) return null\n const { cells } = gridOf(t)\n const rows = t.rows.map((r) => ({ ...r, cells: [...r.cells] }))\n for (const c of cells) {\n if (c.ri < ri && c.ri + c.cell.rowSpan > ri) rows[c.ri].cells[c.ci] = { ...rows[c.ri].cells[c.ci], rowSpan: c.cell.rowSpan - 1 }\n }\n rows.splice(ri, 1)\n return { ...t, rows }\n}\n\nexport function insertCol(t: Table, g0: number, right: boolean, mk: NewPara): Table {\n const { cells, nCols } = gridOf(t)\n const g = right ? g0 + 1 : g0\n const rows = t.rows.map((r) => ({ ...r, cells: [...r.cells] }))\n const total = t.cols.reduce((a, b) => a + b, 0)\n t.rows.forEach((_, ri) => {\n const rowCells = cells.filter((c) => c.ri === ri)\n const crossing = cells.find((c) => c.ri <= ri && ri < c.ri + c.cell.rowSpan && c.g < g && c.g + c.cell.colSpan > g)\n if (crossing) {\n if (crossing.ri === ri) rows[ri].cells[crossing.ci] = { ...rows[ri].cells[crossing.ci], colSpan: crossing.cell.colSpan + 1 }\n return\n }\n const covered = cells.find((c) => c.ri < ri && ri < c.ri + c.cell.rowSpan && c.g + c.cell.colSpan === g)\n if (covered && !rowCells.length) return\n const before = rowCells.filter((c) => c.g < g).length\n const tpl = rowCells[Math.max(0, before - 1)]?.cell ?? rowCells[0]?.cell\n if (tpl) rows[ri].cells.splice(before, 0, blankCell(tpl, mk))\n })\n const cols = [...(t.cols.length ? t.cols : new Array(nCols).fill(total / Math.max(1, nCols)))]\n cols.splice(g, 0, cols[Math.min(g0, cols.length - 1)] ?? 72)\n return { ...t, rows, cols: total ? scaleCols(cols, total) : cols }\n}\n\nexport function deleteCol(t: Table, g: number): Table | null {\n const { cells, nCols } = gridOf(t)\n if (nCols <= 1) return null\n const rows = t.rows.map((r) => ({ ...r, cells: [...r.cells] }))\n const remove = new Set<string>()\n for (const c of cells) {\n if (g < c.g || g >= c.g + c.cell.colSpan) continue\n if (c.cell.colSpan > 1) rows[c.ri].cells[c.ci] = { ...rows[c.ri].cells[c.ci], colSpan: c.cell.colSpan - 1 }\n else remove.add(`${c.ri}:${c.ci}`)\n }\n rows.forEach((r, ri) => (r.cells = r.cells.filter((_, ci) => !remove.has(`${ri}:${ci}`))))\n const total = t.cols.reduce((a, b) => a + b, 0)\n const cols = [...t.cols]\n cols.splice(g, 1)\n return { ...t, rows: rows.filter((r) => r.cells.length), cols: total && cols.length ? scaleCols(cols, total) : cols }\n}\n\n/** New table model (rows × cols) with simple single borders. */\nexport function newTable(rowsN: number, colsN: number, width: number, mk: () => Paragraph): Table {\n const border = '0.5pt solid #000000'\n const w = +(width / colsN).toFixed(2)\n return {\n t: 'tbl',\n cols: new Array(colsN).fill(w),\n rows: Array.from({ length: rowsN }, () => ({\n cells: Array.from({ length: colsN }, () => ({ blocks: [mk()], colSpan: 1, rowSpan: 1, borders: { t: border, r: border, b: border, l: border }, pad: [0, 5.4, 0, 5.4] as [number, number, number, number] })),\n })),\n }\n}\n","/**\n * Main-thread DOCX editing host: owns undo history and paragraph mutations,\n * mirrors every change to the worker (which regenerates the XML).\n */\nimport { paraSpec } from '../../core/docx/spec'\nimport type { Block, CanonStyle, EditOp, EditResult, Inline, Paragraph, ParaDirty, ParaStyle, RunSet, RunStyle, StyleInfo, Table, TableSpec } from '../../core/docx/types'\nimport { cssFont } from '../../core/fonts'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { opInsert, opInsertRuns, ordered, RichInput, type ReplaceOpts, type RichHost } from '../edit/input'\nimport { htmlToParas } from './html'\nimport { deleteCol, deleteRow, gridOf, insertCol, insertRow, newTable } from './tables'\nimport { collapsed, formatRange, normalize, plen, runAt, shiftPa, splitRuns, type Pos, type RRun, type Sel } from '../edit/rich'\n\nexport interface DocState {\n blocks: Block[]\n heights: WeakMap<Block, number>\n dirty: Set<Block>\n /** leading blocks measured at least once */\n frontier: number\n}\n\ninterface Entry {\n pas: string[]\n before: Paragraph[]\n after: Paragraph[]\n /** top-level block replacement (tables) */\n blocks?: { bi: number; before: Block[]; after: Block[] }\n selBefore: Sel\n selAfter: Sel\n label: string\n t: number\n}\n\nexport interface FormatState {\n b: boolean\n i: boolean\n u: boolean\n strike: boolean\n color?: string\n hl?: string\n sz?: number\n font?: string\n align?: string\n style?: string\n lst?: 'bullet' | 'number'\n line?: number\n va?: 'sup' | 'sub'\n link?: string\n /** caret inside a table cell */\n inTable: boolean\n /** a single image is selected */\n img?: { w: number; h: number; alt?: string; target: string; pa: string; o: number }\n canUndo: boolean\n canRedo: boolean\n}\n\nconst path = (pa: string) => pa.split('.').map(Number)\n\n/** selection recorded around address `from`, re-based onto `to` (same container) */\nfunction moveSel(sel: Sel, from: string, to: string): Sel {\n if (from === to) return sel\n const dir = (pa: string) => pa.replace(/\\.?\\d+$/, '')\n const d = Number(to.split('.').pop()) - Number(from.split('.').pop())\n const mv = (p: Sel['a']) => (dir(p.pa) === dir(from) ? { ...p, pa: dir(to) ? `${dir(to)}.${Number(p.pa.split('.').pop()) + d}` : String(Number(p.pa.split('.').pop()) + d) } : p)\n return { a: mv(sel.a), f: mv(sel.f) }\n}\n\n/** a model change: contiguous paragraphs replaced, or top-level blocks replaced */\nexport type DocxCommit = { kind: 'paras'; before: Paragraph[]; next: Paragraph[] } | { kind: 'blocks'; bi: number; before: Block[]; next: Block[] }\n\nexport class DocxEditor implements RichHost<Paragraph> {\n readonly input: RichInput\n pendingSel: Sel | null = null\n styles: StyleInfo[] = []\n private history: Entry[] = []\n private future: Entry[] = []\n private pend: { s: Partial<RunStyle>; d: RunSet; at: { pa: string; o: number } } | null = null\n /** next id for new paragraphs / tables (a collaboration session gives each client its own range) */\n nextPid = 1_000_000_000\n private inflight = 0\n onState?: (s: FormatState | null) => void\n /** image selection changed (overlay with resize handles) */\n onImage?: (img: FormatState['img'] | null) => void\n /** style list changed (a built-in style was added to the document) */\n onStyles?: (styles: StyleInfo[]) => void\n shortcut?: (e: KeyboardEvent) => boolean\n onDirty?: () => void\n /** paint format: run formatting copied from the caret, applied to the next selection */\n painter: RunSet | null = null\n onPainter?: (on: boolean) => void\n /** every model change, after it was mirrored to the worker (collaboration hook) */\n onCommit?: (c: DocxCommit) => void\n\n constructor(\n private client: DocumentClient,\n private st: DocState,\n private changed: () => void,\n ) {\n this.input = new RichInput(this)\n }\n\n // ---------------------------------------------------------------- addressing\n\n private container(pa: string): { list: Block[]; at: number; cell?: [number, number, number] } | undefined {\n const p = path(pa)\n if (p.length === 1) return { list: this.st.blocks, at: p[0] }\n const t = this.st.blocks[p[0]]\n if (t?.t !== 'tbl') return undefined\n const cell = t.rows[p[1]]?.cells[p[2]]\n return cell ? { list: cell.blocks, at: p[3], cell: [p[0], p[1], p[2]] } : undefined\n }\n\n para(pa: string): Paragraph | undefined {\n const c = this.container(pa)\n const b = c?.list[c.at]\n return b && b.t === 'p' && b.pid !== undefined && !b.ro ? b : undefined\n }\n\n span(a: string, b: string): string[] | null {\n const pa = path(a)\n const pb = path(b)\n if (pa.length !== pb.length || pa.slice(0, -1).join('.') !== pb.slice(0, -1).join('.')) return null\n const out: string[] = []\n for (let i = pa[pa.length - 1]; i <= pb[pb.length - 1]; i++) {\n const addr = shiftPa(a, i - pa[pa.length - 1])\n if (!this.para(addr)) return null\n out.push(addr)\n }\n return out\n }\n\n prev(pa: string) {\n const at = path(pa).pop()!\n const q = shiftPa(pa, -1)\n return at > 0 && this.para(q) ? q : undefined\n }\n\n next(pa: string) {\n const q = shiftPa(pa, 1)\n return this.para(q) ? q : undefined\n }\n\n cmp(a: string, b: string): number {\n const x = path(a)\n const y = path(b)\n for (let i = 0; i < Math.min(x.length, y.length); i++) if (x[i] !== y[i]) return x[i] - y[i]\n return x.length - y.length\n }\n\n /** the whole document: from the first to the last editable top-level paragraph */\n all(): Sel | null {\n let a = -1\n let f = -1\n this.st.blocks.forEach((_, i) => {\n if (!this.para(String(i))) return\n if (a < 0) a = i\n f = i\n })\n if (a < 0) return null\n return { a: { pa: String(a), o: 0 }, f: { pa: String(f), o: plen(this.para(String(f))!.runs as RRun[]) } }\n }\n\n selectAll() {\n this.input.selectAll()\n }\n\n /** Deletes a top-level range that spans tables: the end paragraphs are joined, everything between goes (section breaks stay). */\n deleteAcross(s: Pos, e: Pos): Pos | null {\n const a = path(s.pa)\n const b = path(e.pa)\n if (a.length !== 1 || b.length !== 1 || a[0] >= b[0]) return null\n const first = this.para(s.pa)\n const last = this.para(e.pa)\n if (!first || !last) return null\n // parts of a paragraph split around a page break share its pid: the worker regenerates whole paragraphs only\n const part = (i: number, p: Paragraph) => this.st.blocks[i]?.t === 'p' && (this.st.blocks[i] as Paragraph).pid === p.pid\n if (part(a[0] - 1, first) || part(b[0] + 1, last)) return null\n const runs = normalize([...splitRuns(first.runs as RRun[], s.o)[0], ...splitRuns(last.runs as RRun[], e.o)[1]])\n const keep = this.st.blocks.slice(a[0] + 1, b[0]).filter((x) => x.t === 'sect')\n this.replaceBlocks(a[0], b[0] - a[0] + 1, [this.join(first, last, runs), ...keep], { a: s, f: s })\n return s\n }\n\n // ---------------------------------------------------------------- paragraph factories\n\n withRuns(p: Paragraph, runs: RRun[]): Paragraph {\n return { ...p, runs: runs as Inline[], edited: true }\n }\n\n private origOf(p: Paragraph): number[] {\n return p.orig ?? (p.pid === (p.from ?? p.pid) ? [p.pid!] : [])\n }\n\n defaultRun(p: Paragraph): Partial<RRun> | undefined {\n if (p.caret) return { ...(p.caret as RRun), text: '' }\n const last = [...p.runs].reverse().find((r) => r.t === 'text') as RRun | undefined\n if (last) return { ...last, text: '' }\n return { t: 'text', s: { sz: p.markSz, font: p.markFont } } as Partial<RRun>\n }\n\n split(p: Paragraph, left: RRun[], right: RRun[], atEnd: boolean): [Paragraph, Paragraph] {\n const keep = p.keepSect ?? p.pid === (p.from ?? p.pid)\n const a: Paragraph = { ...p, runs: left as Inline[], edited: true, keepSect: false }\n const b: Paragraph = {\n ...p,\n runs: right as Inline[],\n pid: this.nextPid++,\n from: p.from ?? p.pid,\n orig: [],\n edited: true,\n keepSect: keep,\n pb: false,\n ver: 0,\n caret: right.length ? undefined : ((runAt(left, plen(left)) as Inline | undefined) ?? p.caret),\n }\n if (atEnd) {\n const next = this.styles.find((s) => s.id === p.sid)?.next\n if (next && next !== p.sid) {\n b.pd = { ...(b.pd ?? {}), style: next }\n b.sid = next\n }\n }\n return [a, b]\n }\n\n join(a: Paragraph, b: Paragraph, runs: RRun[]): Paragraph {\n return { ...a, runs: runs as Inline[], edited: true, orig: [...this.origOf(a), ...this.origOf(b)], keepSect: (a.keepSect ?? a.pid === (a.from ?? a.pid)) || (b.keepSect ?? b.pid === (b.from ?? b.pid)) }\n }\n\n // ---------------------------------------------------------------- mutation core\n\n private splice(pa: string, count: number, next: Block[]): Block[] {\n const c = this.container(pa)!\n if (!c.cell) {\n this.st.blocks.splice(c.at, count, ...next)\n return this.st.blocks\n }\n const [bi, ri, ci] = c.cell\n const t = this.st.blocks[bi] as Table\n const blocks = [...c.list]\n blocks.splice(c.at, count, ...next)\n const nt: Table = { ...t, rows: t.rows.map((r, i) => (i !== ri ? r : { ...r, cells: r.cells.map((cell, j) => (j !== ci ? cell : { ...cell, blocks })) })) }\n this.st.heights.set(nt, this.st.heights.get(t) ?? 0)\n this.st.dirty.add(nt)\n this.st.blocks[bi] = nt\n return blocks\n }\n\n replace(pas: string[], next: Paragraph[], sel: Sel, opts: ReplaceOpts & { history?: boolean; want?: boolean } = {}): void {\n const before = pas.map((pa) => this.para(pa)!)\n if (before.some((b) => !b)) return\n if (opts.remount) next = next.map((p) => ({ ...p, ver: (p.ver ?? 0) + 1 }))\n const c = this.container(pas[0])!\n const at = c.at\n const list = this.splice(pas[0], pas.length, next)\n // split paragraphs: trailing page-break parts follow the paragraph that now ends the range\n const lastB = before[before.length - 1]\n const lastN = next[next.length - 1]\n if (lastN && lastB.pid !== lastN.pid) {\n for (let k = at + next.length; k < list.length; k++) {\n const b = list[k]\n if (b.t !== 'p' || b.pid !== lastB.pid || !b.pb) break\n list[k] = { ...b, pid: lastN.pid, from: lastN.from ?? lastN.pid, edited: true }\n }\n }\n // heights: estimate from what was there, remeasure soon\n if (!c.cell) {\n next.forEach((p, i) => {\n this.st.heights.set(p, this.st.heights.get(before[i] ?? before[0]) ?? 0)\n this.st.dirty.add(p)\n })\n for (const k of [at - 1, at + next.length]) if (list[k]) this.st.dirty.add(list[k])\n if (at < this.st.frontier) this.st.frontier = Math.max(0, this.st.frontier + next.length - pas.length)\n }\n if (opts.history !== false) {\n const now = Date.now()\n const last = this.history[this.history.length - 1]\n const label = opts.label ?? 'edit'\n const selBefore = this.input.lastSel ?? sel\n if (label === 'type' && last?.label === 'type' && pas.length === 1 && next.length === 1 && last.after.length === 1 && last.pas[0] === pas[0] && now - last.t < 1500) {\n last.after = next\n last.selAfter = sel\n last.t = now\n } else {\n this.history.push({ pas, before, after: next, selBefore, selAfter: sel, label, t: now })\n if (this.history.length > 500) this.history.shift()\n }\n this.future = []\n }\n this.commit(pas[0], before, next, opts.want)\n this.onCommit?.({ kind: 'paras', before, next })\n this.pendingSel = sel\n this.onDirty?.()\n this.changed()\n // the caret may not move (formatting): refresh the toolbar from the new runs\n this.emitState(sel)\n }\n\n /** contiguous blocks sharing `pid` around index `near` */\n private partsOf(list: Block[], pid: number, near: number): Paragraph[] {\n let i = near\n while (i > 0 && (list[i - 1] as Paragraph).pid === pid && list[i - 1].t === 'p') i--\n const out: Paragraph[] = []\n for (; i < list.length && list[i].t === 'p' && (list[i] as Paragraph).pid === pid; i++) out.push(list[i] as Paragraph)\n return out\n }\n\n private commit(pa: string, before: Paragraph[], next: Paragraph[], want?: boolean) {\n const c = this.container(pa)!\n if (c.cell && (this.st.blocks[c.cell[0]] as Table).tid !== undefined) {\n this.commitTable(c.cell[0])\n return\n }\n const list = c.list\n const pids: number[] = []\n next.forEach((p) => p.pid !== undefined && !pids.includes(p.pid) && pids.push(p.pid))\n const specs = pids.map((pid) => {\n const idx = c.at + next.findIndex((p) => p.pid === pid)\n return paraSpec(this.partsOf(list, pid, idx))\n })\n const remove: number[] = []\n for (const b of before) {\n if (b.pid === undefined || pids.includes(b.pid) || remove.includes(b.pid)) continue\n const still = list.findIndex((x) => x.t === 'p' && (x as Paragraph).pid === b.pid)\n if (still >= 0) specs.push(paraSpec(this.partsOf(list, b.pid, still)))\n else remove.push(b.pid)\n }\n const anchor = before[0].pid!\n const structural = want || next.some((p) => p.pd !== before.find((b) => b.pid === p.pid)?.pd)\n const sent = new Set<Paragraph>(next)\n const op: EditOp = { anchor, list: specs, remove, want: structural }\n this.inflight++\n this.client\n .call('docx.edit', op)\n .then((res) => this.applyResult(res, sent))\n .catch((e) => console.error('[office-engine] edit failed', e))\n .finally(() => this.inflight--)\n }\n\n get busy() {\n return this.inflight > 0\n }\n\n private locate(pid: number): { list: Block[]; index: number; pa: string }[] {\n const out: { list: Block[]; index: number; pa: string }[] = []\n this.st.blocks.forEach((b, bi) => {\n if (b.t === 'p' && b.pid === pid) out.push({ list: this.st.blocks, index: bi, pa: String(bi) })\n else if (b.t === 'tbl')\n b.rows.forEach((r, ri) =>\n r.cells.forEach((cell, ci) =>\n cell.blocks.forEach((x, pi) => {\n if (x.t === 'p' && x.pid === pid) out.push({ list: cell.blocks, index: pi, pa: `${bi}.${ri}.${ci}.${pi}` })\n }),\n ),\n )\n })\n return out\n }\n\n private put(pa: string, p: Paragraph) {\n const c = this.container(pa)\n if (!c) return\n const old = c.list[c.at]\n this.splice(pa, 1, [p])\n if (!c.cell) {\n this.st.heights.set(p, this.st.heights.get(old) ?? 0)\n this.st.dirty.add(p)\n }\n }\n\n private applyResult(res: EditResult, sent: Set<Paragraph>) {\n if (this.input.isComposing) return\n let touched = false\n // re-converted paragraphs (style / list changes): only if not edited again meanwhile\n for (const [k, blocks] of Object.entries(res.blocks)) {\n const locs = this.locate(Number(k))\n const paras = blocks.filter((b): b is Paragraph => b.t === 'p')\n if (!locs.length || paras.length !== locs.length) continue\n if (!locs.every((l) => sent.has(l.list[l.index] as Paragraph))) continue\n locs.forEach((l, i) => {\n const cur = l.list[l.index] as Paragraph\n this.put(l.pa, { ...paras[i], from: cur.from, orig: cur.orig, pd: cur.pd, edited: cur.edited, keepSect: cur.keepSect, ver: cur.ver, pb: cur.pb })\n })\n touched = true\n }\n // list numbering changes anywhere in the document\n for (const [k, m] of Object.entries(res.markers)) {\n for (const loc of this.locate(Number(k))) {\n const p = loc.list[loc.index] as Paragraph\n if ((loc.list[loc.index - 1] as Paragraph | undefined)?.pid === p.pid) continue\n this.put(loc.pa, { ...p, marker: m ? { text: m.text, s: m.s, tab: m.tab } : undefined, lst: m?.lst })\n touched = true\n }\n }\n if (touched) this.changed()\n }\n\n // ---------------------------------------------------------------- history\n\n /** current address of the first block of `list` (paragraphs by pid, tables by identity), `empty` for an empty list; undefined when gone */\n private whereNow(list: Block[], empty: string): string | undefined {\n const b = list[0]\n if (!b) return empty\n if (b.t === 'p') return b.pid !== undefined ? this.locate(b.pid)[0]?.pa : undefined\n if (b.t === 'tbl') {\n const i = this.st.blocks.findIndex((x) => x.t === 'tbl' && ((b.tid !== undefined && x.tid === b.tid) || (b.item !== undefined && x.item === b.item)))\n return i >= 0 ? String(i) : undefined\n }\n return empty\n }\n\n /** table undo / redo: paragraphs still in place keep their current text (edited since, maybe by collaborators) */\n private keepCurrent(list: Block[], bi: number, count: number): Block[] {\n const cur = new Map(this.st.blocks.slice(bi, bi + count).flatMap((b) => (b.t === 'p' && b.pid !== undefined ? [[b.pid, b] as const] : [])))\n return list.map((b) => (b.t === 'p' && b.pid !== undefined && cur.has(b.pid) ? cur.get(b.pid)! : b))\n }\n\n undo() {\n const e = this.history.pop()\n if (!e) return\n if (e.blocks) {\n const bi = this.whereNow(e.blocks.after, String(e.blocks.bi))\n // the blocks were removed by a collaborator: nothing left to undo\n if (bi === undefined) return\n this.replaceBlocks(Number(bi), e.blocks.after.length, this.keepCurrent(e.blocks.before, Number(bi), e.blocks.after.length), e.selBefore, false)\n this.future.push(e)\n return\n }\n const at = this.whereNow(e.after, e.pas[0])\n if (at === undefined) return\n const pasAfter = e.after.map((_, i) => shiftPa(at, i))\n // a collaborator changed these paragraphs' structure meanwhile: drop the entry\n if (pasAfter.some((pa, i) => this.para(pa)?.pid !== e.after[i].pid)) return\n this.replace(pasAfter.length ? pasAfter : [at], e.before, moveSel(e.selBefore, e.pas[0], at), { history: false, label: 'undo', want: true })\n this.future.push(e)\n }\n\n redo() {\n const e = this.future.pop()\n if (!e) return\n if (e.blocks) {\n const bi = this.whereNow(e.blocks.before, String(e.blocks.bi))\n if (bi === undefined) return\n this.replaceBlocks(Number(bi), e.blocks.before.length, this.keepCurrent(e.blocks.after, Number(bi), e.blocks.before.length), e.selAfter, false)\n this.history.push(e)\n return\n }\n const at = this.whereNow(e.before, e.pas[0])\n if (at === undefined) return\n const pasNow = e.before.map((_, i) => shiftPa(at, i))\n if (pasNow.some((pa, i) => this.para(pa)?.pid !== e.before[i].pid)) return\n this.replace(pasNow, e.after, moveSel(e.selAfter, e.pas[0], at), { history: false, label: 'redo', want: true })\n this.history.push(e)\n }\n\n get canUndo() {\n return this.history.length > 0\n }\n get canRedo() {\n return this.future.length > 0\n }\n\n // ---------------------------------------------------------------- formatting\n\n pendingStyle(): Partial<RRun> | undefined {\n return this.pend ? ({ s: this.pend.s, d: this.pend.d } as Partial<RRun>) : undefined\n }\n\n clearPending() {\n this.pend = null\n }\n\n private selectedParas(sel: Sel): { pas: string[]; s: { pa: string; o: number }; e: { pa: string; o: number } } | null {\n const [s, e] = ordered(this, sel)\n const pas = s.pa === e.pa ? (this.para(s.pa) ? [s.pa] : null) : this.span(s.pa, e.pa)\n return pas ? { pas, s, e } : null\n }\n\n format(s: Partial<RunStyle>, d: RunSet, opts: { want?: boolean } = {}) {\n const sel = this.input.sel()\n if (!sel) return\n if (collapsed(sel)) {\n this.pend = { s: { ...(this.pend?.s ?? {}), ...s }, d: { ...(this.pend?.d ?? {}), ...d }, at: sel.a }\n this.input.restore(sel)\n this.emitState(sel)\n return\n }\n const r = this.selectedParas(sel)\n if (!r) return\n const next = r.pas.map((pa, i) => {\n const p = this.para(pa)!\n const a = i === 0 ? r.s.o : 0\n const b = i === r.pas.length - 1 ? r.e.o : plen(p.runs as RRun[])\n return this.withRuns(p, formatRange(p.runs as RRun[], a, b, s, d))\n })\n this.replace(r.pas, next, sel, { label: 'format', want: opts.want })\n }\n\n toggle(key: 'b' | 'i' | 'u' | 'strike') {\n const st = this.state()\n const on = !(st && st[key])\n if (key === 'u') this.format({ u: on ? 'single' : 'none' }, { u: on ? 'single' : 'none' })\n else this.format({ [key]: on }, { [key]: on })\n }\n\n setFont(name: string) {\n this.format({ font: cssFont(name) }, { font: name })\n }\n\n setSize(sz: number) {\n this.format({ sz }, { sz })\n }\n\n setColor(c: string | null) {\n this.format({ color: c ?? undefined }, { color: c })\n }\n\n setHighlight(c: string | null) {\n this.format({ hl: c ?? undefined, shd: undefined }, { hl: c })\n }\n\n clearFormat() {\n this.format({ b: false, i: false, u: 'none', strike: false, hl: undefined }, { b: false, i: false, u: 'none', strike: false, color: null, hl: null, va: null }, { want: true })\n }\n\n setPara(patch: ParaDirty, optimistic: Partial<ParaStyle> = {}, sel = this.input.sel()) {\n if (!sel) return\n const r = this.selectedParas(sel)\n if (!r) return\n const next = r.pas.map((pa) => {\n const p = this.para(pa)!\n const pd = { ...(p.pd ?? {}), ...patch }\n return { ...p, pd, ps: { ...p.ps, ...optimistic }, edited: true, sid: patch.style ?? p.sid }\n })\n this.replace(r.pas, next, sel, { label: 'para', want: true })\n }\n\n toggleList(kind: 'bullet' | 'number') {\n const sel = this.input.sel()\n if (!sel) return\n const r = this.selectedParas(sel)\n if (!r) return\n const all = r.pas.every((pa) => this.para(pa)?.lst === kind)\n this.setPara({ list: all ? 'none' : kind, ilvl: all ? undefined : 0 }, {}, sel)\n }\n\n indent(dir: 1 | -1, sel = this.input.sel()) {\n if (!sel) return\n const r = this.selectedParas(sel)\n if (!r) return\n const next = r.pas.map((pa) => {\n const p = this.para(pa)!\n const pd: ParaDirty = { ...(p.pd ?? {}) }\n if (p.lst) pd.ilvl = Math.max(0, Math.min(8, (p.ilvl ?? 0) + dir))\n else pd.indL = Math.max(0, (p.ps.indL ?? 0) + dir * 36)\n return { ...p, pd, ps: p.lst ? p.ps : { ...p.ps, indL: pd.indL }, edited: true }\n })\n this.replace(r.pas, next, sel, { label: 'para', want: true })\n }\n\n tab(sel: Sel, shift: boolean): boolean {\n if (sel.f.pa.includes('.')) {\n // move between table cells (Tab on the last cell adds a row)\n const [bi, ri, ci] = sel.f.pa.split('.').map(Number)\n const t = this.st.blocks[bi] as Table\n const cells = t.rows.flatMap((r, i) => r.cells.map((_, j) => [i, j] as [number, number]))\n const k = cells.findIndex(([i, j]) => i === ri && j === ci) + (shift ? -1 : 1)\n if (k >= cells.length && !shift) {\n this.tableOp('rowBelow')\n return true\n }\n const [nr, nc] = cells[Math.max(0, k)]\n const pa = `${bi}.${nr}.${nc}.0`\n const p = this.para(pa)\n this.input.restore({ a: { pa, o: 0 }, f: { pa, o: p ? plen(p.runs as RRun[]) : 0 } })\n return true\n }\n const p = this.para(sel.a.pa)\n if (!p?.lst) return false\n this.indent(shift ? -1 : 1, sel)\n return true\n }\n\n backspaceAtStart(pa: string, p: Paragraph): boolean {\n if (!p.lst) return false\n this.setPara({ list: 'none' }, {}, { a: { pa, o: 0 }, f: { pa, o: 0 } })\n return true\n }\n\n // ---------------------------------------------------------------- blocks (tables)\n\n /** content width (pt) of the page, for sizing new tables / images */\n contentW = 468\n /** document default font (CSS) / size, shown when a run inherits them */\n defaultFont?: string\n defaultSz?: number\n\n private prevParaPid(bi: number): number | undefined {\n for (let i = bi - 1; i >= 0; i--) {\n const b = this.st.blocks[i]\n if (b.t === 'p' && b.pid !== undefined) return b.pid\n }\n return undefined\n }\n\n private tableSpec(t: Table): TableSpec {\n return {\n tid: t.tid!,\n item: t.item,\n cols: t.cols,\n rows: t.rows.map((r) => ({\n src: r.src,\n cells: r.cells.map((c) => ({\n src: c.src,\n colSpan: c.colSpan,\n rowSpan: c.rowSpan,\n paras: c.blocks.filter((b): b is Paragraph => b.t === 'p' && b.pid !== undefined).map((p) => paraSpec([p])),\n })),\n })),\n }\n }\n\n private commitTable(bi: number) {\n const t = this.st.blocks[bi] as Table\n if (t?.t !== 'tbl' || t.tid === undefined) return\n this.send('docx.table', { tid: t.tid, item: t.item, anchor: t.item === undefined ? this.prevParaPid(bi) : undefined, spec: this.tableSpec(t) })\n }\n\n private send(method: 'docx.table' | 'docx.edit', op: unknown) {\n this.inflight++\n ;(this.client.call as (m: string, ...a: unknown[]) => Promise<unknown>)(method, op)\n .then((res) => method === 'docx.edit' && this.applyResult(res as EditResult, new Set()))\n .catch((e) => console.error('[office-engine] edit failed', e))\n .finally(() => this.inflight--)\n }\n\n /** Replaces top-level blocks (table insert/delete/restructure) with history + write-back. */\n replaceBlocks(bi: number, count: number, next: Block[], sel: Sel | null, history = true) {\n const before = this.st.blocks.slice(bi, bi + count)\n this.st.blocks.splice(bi, count, ...next)\n next.forEach((b, i) => {\n this.st.heights.set(b, this.st.heights.get(before[i] ?? before[0]) ?? 0)\n this.st.dirty.add(b)\n })\n if (bi < this.st.frontier) this.st.frontier = Math.max(0, this.st.frontier + next.length - count)\n const key = (b: Block) => (b.t === 'tbl' ? `t${b.tid ?? 'i' + b.item}` : b.t === 'p' ? `p${b.pid}` : '')\n const nextKeys = new Set(next.map(key))\n const beforeKeys = new Set(before.map(key))\n // paragraphs that appear / disappear\n const anchorP = [...before, ...next].find((b): b is Paragraph => b.t === 'p' && b.pid !== undefined && beforeKeys.has(key(b)) && nextKeys.has(key(b)))\n const added = next.filter((b): b is Paragraph => b.t === 'p' && b.pid !== undefined && !beforeKeys.has(key(b)))\n const removed = before.filter((b): b is Paragraph => b.t === 'p' && b.pid !== undefined && !nextKeys.has(key(b)))\n // paragraphs kept but replaced by another version (undo, collaborators) must reach the worker too\n const beforeObj = new Map(before.map((b) => [key(b), b]))\n const changed = next.some((b) => b.t === 'p' && b.pid !== undefined && beforeObj.has(key(b)) && beforeObj.get(key(b)) !== b)\n if (anchorP && (added.length || removed.length || changed)) {\n const list = next.filter((b): b is Paragraph => b.t === 'p' && b.pid !== undefined)\n this.send('docx.edit', { anchor: anchorP.pid, list: list.map((p) => paraSpec([p])), remove: removed.map((p) => p.pid) } as EditOp)\n }\n for (const b of before) if (b.t === 'tbl' && !nextKeys.has(key(b)) && (b.tid !== undefined || b.item !== undefined)) this.send('docx.table', { tid: b.tid ?? -1, item: b.item, spec: null })\n next.forEach((b, i) => {\n if (b.t !== 'tbl') return\n // an original table coming back (undo of its deletion) is regenerated from the model like a new one\n if (b.tid === undefined && !beforeKeys.has(key(b))) this.st.blocks[bi + i] = { ...b, tid: this.nextPid++ }\n this.commitTable(bi + i)\n })\n this.onCommit?.({ kind: 'blocks', bi, before, next })\n if (history) {\n const s = sel ?? this.input.lastSel ?? { a: { pa: String(bi), o: 0 }, f: { pa: String(bi), o: 0 } }\n this.history.push({ pas: [], before: [], after: [], blocks: { bi, before, after: next }, selBefore: this.input.lastSel ?? s, selAfter: s, label: 'table', t: Date.now() })\n this.future = []\n }\n if (sel) this.pendingSel = sel\n this.onDirty?.()\n this.changed()\n }\n\n private emptyPara(tpl: Paragraph): Paragraph {\n return {\n t: 'p', ps: { ...tpl.ps, indFirst: undefined, indL: undefined }, runs: [], markSz: tpl.markSz, markFont: tpl.markFont,\n pid: this.nextPid++, from: tpl.from ?? tpl.pid, orig: [], edited: true, keepSect: false, pd: { style: '', list: 'none' }, sid: undefined,\n }\n }\n\n insertTable(rowsN: number, colsN: number) {\n const sel = this.input.sel()\n const bi = sel ? Number(sel.f.pa.split('.')[0]) : -1\n const p = this.st.blocks[bi]\n if (!sel || sel.f.pa.includes('.') || p?.t !== 'p' || p.pid === undefined) return\n const t: Table = { ...newTable(rowsN, colsN, this.contentW, () => this.emptyPara(p)), tid: this.nextPid++ }\n const after: Block[] = [p, t]\n const nextBlock = this.st.blocks[bi + 1]\n if (!nextBlock || nextBlock.t !== 'p') after.push(this.emptyPara(p))\n this.replaceBlocks(bi, 1, after, { a: { pa: `${bi + 1}.0.0.0`, o: 0 }, f: { pa: `${bi + 1}.0.0.0`, o: 0 } })\n }\n\n /** Structural table edit at the caret's cell. */\n tableOp(kind: 'rowAbove' | 'rowBelow' | 'colLeft' | 'colRight' | 'delRow' | 'delCol' | 'delTable') {\n const sel = this.input.sel()\n if (!sel || !sel.f.pa.includes('.')) return\n const [bi, ri, ci] = sel.f.pa.split('.').map(Number)\n const t = this.st.blocks[bi] as Table\n if (t?.t !== 'tbl') return\n const g = gridOf(t).cells.find((c) => c.ri === ri && c.ci === ci)?.g ?? 0\n const mk = (tpl: { blocks: Block[] }) => {\n const p = tpl.blocks.find((b): b is Paragraph => b.t === 'p') ?? (this.st.blocks.find((b) => b.t === 'p' && b.pid !== undefined) as Paragraph)\n return { ...this.emptyPara(p), pd: {}, ps: p.ps, sid: p.sid }\n }\n let next: Table | null = t\n let caret = `${bi}.${ri}.${ci}.0`\n switch (kind) {\n case 'rowAbove':\n next = insertRow(t, ri, false, mk)\n caret = `${bi}.${ri}.0.0`\n break\n case 'rowBelow':\n next = insertRow(t, ri, true, mk)\n caret = `${bi}.${ri + 1}.0.0`\n break\n case 'colLeft':\n next = insertCol(t, g, false, mk)\n break\n case 'colRight':\n next = insertCol(t, g, true, mk)\n caret = `${bi}.${ri}.${ci + 1}.0`\n break\n case 'delRow':\n next = deleteRow(t, ri)\n caret = `${bi}.${Math.max(0, Math.min(ri, (next?.rows.length ?? 1) - 1))}.0.0`\n break\n case 'delCol':\n next = deleteCol(t, g)\n caret = `${bi}.${ri}.${Math.max(0, ci - 1)}.0`\n break\n case 'delTable':\n next = null\n break\n }\n if (!next) {\n const after = this.st.blocks[bi + 1]\n this.replaceBlocks(bi, 1, [], after?.t === 'p' ? { a: { pa: String(bi), o: 0 }, f: { pa: String(bi), o: 0 } } : null)\n return\n }\n next = { ...next, tid: t.tid ?? this.nextPid++ }\n this.replaceBlocks(bi, 1, [next], { a: { pa: caret, o: 0 }, f: { pa: caret, o: 0 } })\n }\n\n // ---------------------------------------------------------------- inserts\n\n async insertImages(files: Blob[], at?: Sel) {\n const sel = at ?? this.input.sel()\n if (!sel) return\n const runs: Inline[] = []\n for (const f of files) {\n const ext = (f.type.split('/')[1] ?? 'png').replace('svg+xml', 'svg').replace('jpeg', 'jpg')\n const { rid, path } = await this.client.call('docx.image', await f.arrayBuffer(), ext)\n const dims = await imageSize(f)\n const scale = Math.min(1, this.contentW / Math.max(1, dims.w * 0.75))\n runs.push({ t: 'img', target: path, w: +(dims.w * 0.75 * scale).toFixed(1), h: +(dims.h * 0.75 * scale).toFixed(1), rid })\n }\n opInsertRuns(this, sel, [runs as RRun[]], { label: 'image' })\n }\n\n async setLink(url: string | null) {\n const sel = this.input.sel()\n if (!sel) return\n if (!url) {\n this.patchRuns(sel, (r) => ({ ...r, href: undefined, lk: undefined }))\n return\n }\n const href = /^[a-z][\\w+.-]*:/i.test(url) || url.startsWith('#') ? url : 'https://' + url\n const lk = await this.client.call('docx.link', href)\n const style = { color: '#0563c1', u: 'single' }\n if (collapsed(sel)) {\n opInsertRuns(this, sel, [[{ t: 'text', text: url, href, lk, s: { ...(runAt(this.para(sel.a.pa)?.runs as RRun[] ?? [], sel.a.o)?.s ?? {}), ...style }, d: style } as RRun]], { label: 'link' })\n return\n }\n this.patchRuns(sel, (r) => ({ ...r, href, lk, s: { ...(r.s ?? {}), ...style }, d: { ...(r.d ?? {}), ...style } }))\n }\n\n /** applies `fn` to the text runs inside the selection */\n private patchRuns(sel: Sel, fn: (r: RRun) => RRun) {\n const r = this.selectedParas(sel)\n if (!r) return\n const next = r.pas.map((pa, i) => {\n const p = this.para(pa)!\n const a = i === 0 ? r.s.o : 0\n const b = i === r.pas.length - 1 ? r.e.o : plen(p.runs as RRun[])\n const [left, rest] = splitRuns(p.runs as RRun[], a)\n const [mid, right] = splitRuns(rest, b - a)\n return this.withRuns(p, [...left, ...mid.map((x) => (x.t === 'text' ? fn(x) : x)), ...right])\n })\n this.replace(r.pas, next, sel, { label: 'format' })\n }\n\n insertPageBreak() {\n const sel = this.input.sel()\n if (!sel) return\n const p = this.para(sel.f.pa)\n if (!p || sel.f.pa.includes('.')) return\n const [l, r] = splitRuns(p.runs as RRun[], sel.f.o)\n const [a, b] = this.split(p, l, r, false)\n const b2 = { ...b, pb: true, pd: { ...(b.pd ?? {}), pageBreak: true } }\n this.replace([sel.f.pa], [a, b2], { a: { pa: shiftPa(sel.f.pa, 1), o: 0 }, f: { pa: shiftPa(sel.f.pa, 1), o: 0 } }, { label: 'pagebreak', want: true })\n }\n\n /** scales the selected image (factor) or fits it to the page width */\n resizeImage(f: number | 'fit') {\n const sel = this.input.sel()\n if (!sel) return\n const [s] = ordered(this, sel)\n this.patchObjects(sel, (x) => {\n if (x.t !== 'img') return x\n const k = f === 'fit' ? this.contentW / x.w : f\n return { ...x, w: +(x.w * k).toFixed(1), h: +(x.h * k).toFixed(1), resized: true }\n })\n this.pendingSel = { a: s, f: { ...s, o: s.o + 1 } }\n }\n\n private patchObjects(sel: Sel, fn: (x: Inline) => Inline) {\n const [s, e] = ordered(this, sel)\n const p = this.para(s.pa)\n if (!p || s.pa !== e.pa) return\n const [left, rest] = splitRuns(p.runs as RRun[], s.o)\n const [mid, right] = splitRuns(rest, e.o - s.o)\n this.replace([s.pa], [this.withRuns(p, [...left, ...(mid as Inline[]).map(fn), ...right] as RRun[])], sel, { label: 'image' })\n }\n\n pasteRich(sel: Sel, data: DataTransfer): boolean {\n const files = Array.from(data.files ?? []).filter((f) => f.type.startsWith('image/'))\n if (files.length) {\n void this.insertImages(files, sel)\n return true\n }\n const html = data.getData('text/html')\n if (!html) return false\n const paras = htmlToParas(html)\n if (!paras.length) return false\n void (async () => {\n const links = new Map<string, string>()\n for (const p of paras) for (const r of p.runs) if (r.t === 'text' && r.href && !links.has(r.href)) links.set(r.href, await this.client.call('docx.link', r.href))\n const lines = paras.map((p) => p.runs.map((r) => (r.t === 'text' && r.href ? { ...r, lk: links.get(r.href) } : r)) as RRun[])\n const headingId = (n: number) => this.styles.find((s) => s.name.toLowerCase() === `heading ${n}`)?.id\n const props = paras.map((p) => {\n if (!p.heading && !p.list) return undefined\n return (q: Paragraph) => {\n const pd: ParaDirty = { ...(q.pd ?? {}) }\n const h = p.heading ? headingId(p.heading) : undefined\n if (h) pd.style = h\n if (p.list) pd.list = p.list\n return { ...q, pd, sid: h ?? q.sid, edited: true }\n }\n })\n opInsertRuns(this, sel, lines, { label: 'paste' }, props as unknown as ((p: RichParaLike) => RichParaLike)[])\n })()\n return true\n }\n\n // ---------------------------------------------------------------- styles\n\n /** applies a built-in style (Title, Heading 1…), creating it in the document when missing */\n async applyCanon(kind: CanonStyle) {\n const sel = this.input.sel()\n if (!sel) return\n let id = this.styles.find((s) => s.canon === kind)?.id\n if (!id) {\n const r = await this.client.call('docx.style', kind)\n this.styles = r.styles\n this.onStyles?.(r.styles)\n id = r.id\n }\n if (id) this.setPara({ style: id }, {}, sel)\n }\n\n // ---------------------------------------------------------------- images\n\n /** selects the inline object at (pa, o) */\n selectObject(pa: string, o: number) {\n const sel = { a: { pa, o }, f: { pa, o: o + 1 } }\n this.input.restore(sel)\n this.onSelection(sel)\n }\n\n private imageSel(): Sel | null {\n const sel = this.input.sel()\n const img = sel && this.state(sel)?.img\n return img ? { a: { pa: img.pa, o: img.o }, f: { pa: img.pa, o: img.o + 1 } } : null\n }\n\n private patchImage(fn: (x: Inline & { t: 'img' }) => Inline) {\n const sel = this.imageSel()\n if (!sel) return\n this.patchObjects(sel, (x) => (x.t === 'img' ? fn(x) : x))\n this.pendingSel = sel\n }\n\n /** exact size in pt */\n setImageSize(w: number, h: number) {\n this.patchImage((x) => ({ ...x, w: +Math.max(4, w).toFixed(1), h: +Math.max(4, h).toFixed(1), resized: true }))\n }\n\n /** natural pixel size of the picture → pt, limited to the text width */\n imageOriginal(nw: number, nh: number) {\n const k = Math.min(1, this.contentW / Math.max(1, nw * 0.75))\n this.setImageSize(nw * 0.75 * k, nh * 0.75 * k)\n }\n\n setAltText(alt: string) {\n this.patchImage((x) => ({ ...x, alt: alt || undefined, altSet: true }))\n }\n\n async replaceImage(file: Blob) {\n const sel = this.imageSel()\n if (!sel) return\n const ext = (file.type.split('/')[1] ?? 'png').replace('svg+xml', 'svg').replace('jpeg', 'jpg')\n const { rid, path } = await this.client.call('docx.image', await file.arrayBuffer(), ext)\n const dims = await imageSize(file)\n this.input.restore(sel)\n this.patchImage((x) => {\n // keep the current width, follow the new picture's proportions\n const h = +(x.w * (dims.h / Math.max(1, dims.w))).toFixed(1)\n return { ...x, target: path, rid, repl: !!x.src, h, resized: true }\n })\n }\n\n /** deletes the selection (or the selected object) */\n deleteSelection() {\n const sel = this.input.sel()\n if (sel && !collapsed(sel)) opInsert(this, sel, '')\n }\n\n insertText(text: string) {\n const sel = this.input.sel()\n if (sel) opInsert(this, sel, text)\n }\n\n // ---------------------------------------------------------------- paint format\n\n /** copies the caret's character formatting; the next selection receives it */\n copyFormat() {\n if (this.painter) {\n this.painter = null\n this.onPainter?.(false)\n return\n }\n const st = this.state()\n if (!st) return\n this.painter = {\n b: st.b,\n i: st.i,\n u: st.u ? 'single' : 'none',\n strike: st.strike,\n color: st.color ?? null,\n hl: st.hl ?? null,\n va: st.va ?? null,\n sz: st.sz,\n font: st.font ? (/^\\s*\"?([^\",]+)/.exec(st.font)?.[1] ?? st.font) : undefined,\n } as RunSet\n this.onPainter?.(true)\n }\n\n /** applies the copied formatting to the current selection (after the mouse is released) */\n applyPainter(): boolean {\n const set = this.painter\n const sel = this.input.readSel()\n if (!set || !sel || collapsed(sel)) return false\n this.painter = null\n this.onPainter?.(false)\n const s: Partial<RunStyle> = {}\n for (const [k, v] of Object.entries(set)) {\n if (k === 'font') (s as Record<string, unknown>).font = v ? cssFont(v as string) : undefined\n else if (k === 'u') (s as Record<string, unknown>).u = v\n else (s as Record<string, unknown>)[k] = v === null ? undefined : v\n }\n this.format(s, set)\n return true\n }\n\n // ---------------------------------------------------------------- toolbar state\n\n state(sel = this.input.sel()): FormatState | null {\n if (!sel) return null\n const [s] = ordered(this, sel)\n const p = this.para(s.pa)\n if (!p) return null\n const run = runAt(p.runs as RRun[], collapsed(sel) ? s.o : s.o + (plen(p.runs as RRun[]) > s.o ? 1 : 0)) as (Inline & { t: 'text' }) | undefined\n const rs: RunStyle = { ...(run?.s ?? {}), ...(collapsed(sel) ? this.pend?.s ?? {} : {}) }\n const [, e] = ordered(this, sel)\n let img: FormatState['img']\n if (s.pa === e.pa && e.o === s.o + 1) {\n const [, right] = splitRuns(p.runs as RRun[], s.o)\n const x = right[0] as Inline | undefined\n if (x?.t === 'img') img = { w: x.w, h: x.h, alt: x.alt, target: x.target, pa: s.pa, o: s.o }\n }\n return {\n line: p.pd?.line ?? (p.ps.lineRule === 'auto' || !p.ps.lineRule ? p.ps.line : undefined),\n va: rs.va,\n link: (run as { href?: string } | undefined)?.href,\n inTable: s.pa.includes('.'),\n img,\n b: !!rs.b,\n i: !!rs.i,\n u: !!rs.u && rs.u !== 'none',\n strike: !!rs.strike,\n color: rs.color,\n hl: rs.hl,\n sz: rs.sz ?? p.markSz ?? this.defaultSz,\n font: rs.font ?? p.markFont ?? this.defaultFont,\n align: p.ps.align ?? 'left',\n style: p.sid,\n lst: p.lst,\n canUndo: this.canUndo,\n canRedo: this.canRedo,\n }\n }\n\n private emitState(sel: Sel | null) {\n const st = sel ? this.state(sel) : null\n this.onState?.(st)\n this.onImage?.(st?.img ?? null)\n }\n\n onSelection(sel: Sel | null) {\n if (sel && this.pend && (sel.a.pa !== this.pend.at.pa || sel.a.o !== this.pend.at.o)) this.pend = null\n this.emitState(sel)\n }\n}\n\ntype RichParaLike = Parameters<NonNullable<Parameters<typeof opInsertRuns>[4]>[number]>[0]\n\nfunction imageSize(blob: Blob): Promise<{ w: number; h: number }> {\n return new Promise((resolve) => {\n const url = URL.createObjectURL(blob)\n const img = new Image()\n img.onload = () => {\n resolve({ w: img.naturalWidth || 300, h: img.naturalHeight || 200 })\n URL.revokeObjectURL(url)\n }\n img.onerror = () => {\n resolve({ w: 300, h: 200 })\n URL.revokeObjectURL(url)\n }\n img.src = url\n })\n}\n","import { useEffect, useState, type CSSProperties } from 'react'\nimport type { CanonStyle, StyleInfo } from '../../core/docx/types'\nimport { MOD } from '../common/ContextMenu'\nimport { EditorBar } from '../common/Slots'\nimport { Btn, ColorBtn, Dropdown, fontName, fontOptions, GridPicker, Menu, pickFiles, Pop, Select, Sep, SizeBox, type DropOption } from '../edit/Toolbar'\nimport type { DocxEditor, FormatState } from './DocxEditor'\n\nconst HIGHLIGHTS = ['#ffff00', '#00ff00', '#00ffff', '#ff00ff', '#0000ff', '#ff0000', '#000080', '#008080', '#008000', '#800080', '#800000', '#808000', '#808080', '#c0c0c0', '#000000']\n\nconst LINE_SPACING = [\n { value: 1, label: 'Single' },\n { value: 1.15, label: '1.15' },\n { value: 1.5, label: '1.5' },\n { value: 2, label: 'Double' },\n { value: 2.5, label: '2.5' },\n { value: 3, label: 'Triple' },\n]\n\n/** built-in styles always offered (created in the document on first use) */\nconst CANON: { k: CanonStyle; label: string; look: CSSProperties }[] = [\n { k: 'normal', label: 'Normal text', look: {} },\n { k: 'title', label: 'Title', look: { fontSize: 22 } },\n { k: 'subtitle', label: 'Subtitle', look: { fontSize: 15, color: '#5a5a5a' } },\n { k: 'h1', label: 'Heading 1', look: { fontSize: 18, color: '#2f5496' } },\n { k: 'h2', label: 'Heading 2', look: { fontSize: 16, color: '#2f5496' } },\n { k: 'h3', label: 'Heading 3', look: { fontSize: 14, color: '#1f3763' } },\n { k: 'h4', label: 'Heading 4', look: { fontSize: 13, color: '#2f5496', fontStyle: 'italic' } },\n { k: 'h5', label: 'Heading 5', look: { fontSize: 13, color: '#2f5496' } },\n { k: 'h6', label: 'Heading 6', look: { fontSize: 13, color: '#1f3763', fontStyle: 'italic' } },\n]\n\nconst SYMBOLS = [\n '©', '®', '™', '§', '¶', '†', '‡', '•', '…', '–', '—', '‰',\n '€', '£', '¥', '¢', '₫', '$', '°', '±', '×', '÷', '≈', '≠',\n '≤', '≥', '∞', '√', '∑', '∏', '∫', 'π', 'µ', 'Ω', 'α', 'β',\n '←', '→', '↑', '↓', '↔', '⇒', '✓', '✗', '★', '☆', '♥', '♦',\n '«', '»', '“', '”', '‘', '’', '¼', '½', '¾', '¹', '²', '³',\n]\n\n/** how a style looks in the picker (size clamped to fit the menu) */\nfunction stylePreview(s: StyleInfo | undefined): CSSProperties | undefined {\n const p = s?.preview\n if (!p) return undefined\n return {\n fontSize: p.sz ? Math.max(12, Math.min(22, p.sz)) : undefined,\n fontWeight: p.b ? 700 : undefined,\n fontStyle: p.i ? 'italic' : undefined,\n color: p.color && !/^#?f{6}$/i.test(p.color.replace('#', '')) ? p.color : undefined,\n fontFamily: p.font,\n lineHeight: 1.25,\n }\n}\n\nexport interface ImageActions {\n original: () => void\n replace: () => void\n alt: () => void\n /** undefined when downloads are disabled */\n download?: () => void\n}\n\nexport function DocxToolbar(props: {\n editor: DocxEditor\n styles: StyleInfo[]\n onFind: () => void\n outline: boolean\n onOutline: () => void\n painter: boolean\n onLink: () => void\n image: ImageActions\n}) {\n const { editor, styles, image } = props\n const [st, setSt] = useState<FormatState | null>(null)\n useEffect(() => {\n editor.onState = setSt\n return () => {\n editor.onState = undefined\n }\n }, [editor])\n const font = fontName(st?.font)\n const dis = !st\n const sz = st?.sz ? Math.round(st.sz * 2) / 2 : undefined\n const line = st?.line ? Math.round(st.line * 100) / 100 : ''\n\n // style picker: built-ins first (with shortcuts), then the document's other quick styles\n const alt = /Mac|iPhone|iPad/.test(typeof navigator !== 'undefined' ? navigator.platform : '') ? '⌥' : 'Alt+'\n const styleOpts: DropOption<string>[] = CANON.map(({ k, label, look }, i) => {\n const s = styles.find((x) => x.canon === k)\n const hint = k === 'normal' ? `${MOD}${alt}0` : k.startsWith('h') ? `${MOD}${alt}${k.slice(1)}` : undefined\n return { value: s?.id ?? `@${k}`, label, hint, style: { lineHeight: 1.25, ...(k === 'normal' ? {} : (stylePreview(s) ?? look)) }, sep: i === 1 }\n })\n styles\n .filter((s) => !s.canon)\n .forEach((s, i) => styleOpts.push({ value: s.id, label: s.name, style: stylePreview(s), sep: i === 0 }))\n const styleValue = st?.style && styleOpts.some((o) => o.value === st.style) ? st.style : st && !st.style ? (styles.find((x) => x.canon === 'normal')?.id ?? '') : ''\n\n return (\n <EditorBar>\n <Btn icon=\"undo\" title={`Undo (${MOD}Z)`} disabled={!editor.canUndo} onClick={() => editor.undo()} />\n <Btn icon=\"redo\" title={`Redo (${MOD}Y)`} disabled={!editor.canRedo} onClick={() => editor.redo()} />\n <Btn icon=\"paint\" title=\"Paint format (click, then select text)\" active={props.painter} disabled={dis} onClick={() => editor.copyFormat()} />\n {st?.inTable && (\n <>\n <Sep />\n <Menu\n title=\"Table\"\n label=\"Table\"\n icon=\"table\"\n items={[\n { value: 'rowAbove', label: 'Insert row above', icon: 'rowAbove' },\n { value: 'rowBelow', label: 'Insert row below', icon: 'rowBelow' },\n { value: 'colLeft', label: 'Insert column left', icon: 'colLeft' },\n { value: 'colRight', label: 'Insert column right', icon: 'colRight' },\n { value: 'delRow', label: 'Delete row', icon: 'delRow', sep: true },\n { value: 'delCol', label: 'Delete column', icon: 'delCol' },\n { value: 'delTable', label: 'Delete table', icon: 'trash' },\n ]}\n onPick={(v) => editor.tableOp(v as Parameters<DocxEditor['tableOp']>[0])}\n />\n </>\n )}\n {st?.img && (\n <>\n <Sep />\n <Btn icon=\"minus\" title=\"Smaller\" onClick={() => editor.resizeImage(0.8)} />\n <span className=\"de-tb-hint\" style={{ margin: 0 }}>\n {Math.round(st.img.w)}×{Math.round(st.img.h)}pt\n </span>\n <Btn icon=\"plus\" title=\"Larger\" onClick={() => editor.resizeImage(1.25)} />\n <Btn icon=\"fit\" title=\"Fit page width\" onClick={() => editor.resizeImage('fit')} />\n <Btn icon=\"imgOrig\" title=\"Original size\" onClick={image.original} />\n <Btn icon=\"imgReplace\" title=\"Replace image\" onClick={image.replace} />\n <Btn icon=\"alt\" title=\"Alt text\" active={!!st.img.alt} onClick={image.alt} />\n {image.download && <Btn icon=\"save\" title=\"Download image\" onClick={image.download} />}\n <Btn icon=\"trash\" title=\"Delete image\" onClick={() => editor.deleteSelection()} />\n </>\n )}\n <Sep />\n <Select\n title=\"Paragraph style\"\n width={118}\n menuWidth={250}\n disabled={dis}\n value={styleValue}\n placeholder=\"Style\"\n options={styleOpts}\n onChange={(v) => (v.startsWith('@') ? void editor.applyCanon(v.slice(1) as CanonStyle) : editor.setPara({ style: v }))}\n />\n <Sep />\n <Select title=\"Font\" width={118} menuWidth={200} disabled={dis} value={font} placeholder=\"Font\" options={fontOptions(font)} onChange={(v) => editor.setFont(v)} />\n <Sep />\n <SizeBox value={sz} disabled={dis} onChange={(v) => editor.setSize(v)} />\n <Sep />\n <Btn icon=\"bold\" title={`Bold (${MOD}B)`} active={st?.b} disabled={dis} onClick={() => editor.toggle('b')} />\n <Btn icon=\"italic\" title={`Italic (${MOD}I)`} active={st?.i} disabled={dis} onClick={() => editor.toggle('i')} />\n <Btn icon=\"underline\" title={`Underline (${MOD}U)`} active={st?.u} disabled={dis} onClick={() => editor.toggle('u')} />\n <Btn icon=\"strike\" title=\"Strikethrough\" active={st?.strike} disabled={dis} onClick={() => editor.toggle('strike')} />\n <ColorBtn icon=\"color\" title=\"Text color\" value={st?.color} onPick={(c) => editor.setColor(c)} noneLabel=\"Automatic\" />\n <ColorBtn icon=\"highlight\" title=\"Highlight color\" value={st?.hl} palette={HIGHLIGHTS} onPick={(c) => editor.setHighlight(c)} />\n <Sep />\n <Btn icon=\"link\" title={`Insert link (${MOD}K)`} active={!!st?.link} disabled={dis} onClick={props.onLink} />\n <Btn icon=\"image\" title=\"Insert image\" disabled={dis} onClick={() => void pickFiles().then((f) => void (f.length && editor.insertImages(f)))} />\n <Pop icon=\"table\" title=\"Insert table\" disabled={dis || st?.inTable}>\n {(close) => <GridPicker onPick={(r, c) => (close(), editor.insertTable(r, c))} />}\n </Pop>\n <Pop icon=\"omega\" title=\"Special characters\" disabled={dis}>\n {(close) => (\n <div className=\"de-symbols\">\n {SYMBOLS.map((c) => (\n <button key={c} type=\"button\" title={`U+${c.codePointAt(0)!.toString(16).toUpperCase().padStart(4, '0')}`} onClick={() => (close(), editor.insertText(c))}>\n {c}\n </button>\n ))}\n </div>\n )}\n </Pop>\n <Sep />\n <Btn icon=\"alignLeft\" title=\"Align left\" active={st?.align === 'left'} disabled={dis} onClick={() => editor.setPara({ align: 'left' }, { align: 'left' })} />\n <Btn icon=\"alignCenter\" title=\"Center\" active={st?.align === 'center'} disabled={dis} onClick={() => editor.setPara({ align: 'center' }, { align: 'center' })} />\n <Btn icon=\"alignRight\" title=\"Align right\" active={st?.align === 'right'} disabled={dis} onClick={() => editor.setPara({ align: 'right' }, { align: 'right' })} />\n <Btn icon=\"justify\" title=\"Justify\" active={st?.align === 'justify'} disabled={dis} onClick={() => editor.setPara({ align: 'justify' }, { align: 'justify' })} />\n <Dropdown\n title=\"Line & paragraph spacing\"\n icon=\"lineSpacing\"\n label={null}\n menuWidth={150}\n disabled={dis}\n value={line}\n options={LINE_SPACING}\n onChange={(v) => editor.setPara({ line: v }, { line: v, lineRule: 'auto' })}\n />\n <Sep />\n <Btn icon=\"bullets\" title=\"Bulleted list\" active={st?.lst === 'bullet'} disabled={dis} onClick={() => editor.toggleList('bullet')} />\n <Btn icon=\"numbers\" title=\"Numbered list\" active={st?.lst === 'number'} disabled={dis} onClick={() => editor.toggleList('number')} />\n <Btn icon=\"outdent\" title=\"Decrease indent (Shift+Tab)\" disabled={dis} onClick={() => editor.indent(-1)} />\n <Btn icon=\"indent\" title=\"Increase indent (Tab)\" disabled={dis} onClick={() => editor.indent(1)} />\n <Sep />\n <Btn icon=\"sup\" title=\"Superscript\" active={st?.va === 'sup'} disabled={dis} onClick={() => editor.format({ va: st?.va === 'sup' ? undefined : 'sup' }, { va: st?.va === 'sup' ? null : 'sup' })} />\n <Btn icon=\"sub\" title=\"Subscript\" active={st?.va === 'sub'} disabled={dis} onClick={() => editor.format({ va: st?.va === 'sub' ? undefined : 'sub' }, { va: st?.va === 'sub' ? null : 'sub' })} />\n <Btn icon=\"pagebreak\" title={`Page break (${MOD}Enter)`} disabled={dis || st?.inTable} onClick={() => editor.insertPageBreak()} />\n <Btn icon=\"clear\" title={`Clear formatting (${MOD}\\\\)`} disabled={dis} onClick={() => editor.clearFormat()} />\n <Sep />\n <Btn icon=\"outline\" title=\"Document outline\" active={props.outline} onClick={props.onOutline} />\n <Btn icon=\"search\" title={`Find & replace (${MOD}F)`} onClick={props.onFind} />\n </EditorBar>\n )\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\nimport { Btn } from '../edit/Toolbar'\n\nexport interface Match {\n pa: string\n a: number\n b: number\n bi: number\n}\n\nexport function FindBar(props: {\n query: string\n index: number\n count: number\n editable: boolean\n onQuery: (q: string) => void\n onNav: (d: 1 | -1) => void\n onClose: () => void\n onReplace: (text: string, all: boolean) => void\n placeholder?: string\n /** extra controls (match case…) under the search row */\n options?: ReactNode\n /** open with the replace row visible */\n replace?: boolean\n}) {\n const ref = useRef<HTMLInputElement>(null)\n const [rep, setRep] = useState('')\n const [showRep, setShowRep] = useState(!!props.replace)\n useEffect(() => {\n ref.current?.focus()\n ref.current?.select()\n }, [])\n return (\n <div className=\"de-find\" role=\"search\" onKeyDown={(e) => e.key === 'Escape' && props.onClose()}>\n <div className=\"de-find-row\">\n <input\n ref={ref}\n value={props.query}\n placeholder={props.placeholder ?? 'Find in document'}\n aria-label=\"Find\"\n onChange={(e) => props.onQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n props.onNav(e.shiftKey ? -1 : 1)\n }\n }}\n />\n <span className=\"de-find-count\">{props.query ? (props.count ? `${Math.min(props.index + 1, props.count)} / ${props.count}` : '0 / 0') : ''}</span>\n <Btn icon=\"up\" title=\"Previous (Shift+Enter)\" onClick={() => props.onNav(-1)} disabled={!props.count} />\n <Btn icon=\"down\" title=\"Next (Enter)\" onClick={() => props.onNav(1)} disabled={!props.count} />\n {props.editable && <Btn label=\"⇄\" title=\"Replace\" active={showRep} onClick={() => setShowRep((v) => !v)} />}\n <Btn icon=\"close\" title=\"Close (Esc)\" onClick={props.onClose} />\n </div>\n {props.options && <div className=\"de-find-row de-find-opts\">{props.options}</div>}\n {props.editable && showRep && (\n <div className=\"de-find-row\">\n <input value={rep} placeholder=\"Replace with\" aria-label=\"Replace with\" onChange={(e) => setRep(e.target.value)} />\n <button type=\"button\" className=\"de-btn\" disabled={!props.count} onClick={() => props.onReplace(rep, false)}>\n Replace\n </button>\n <button type=\"button\" className=\"de-btn\" disabled={!props.count} onClick={() => props.onReplace(rep, true)}>\n All\n </button>\n </div>\n )}\n </div>\n )\n}\n","import type { Block, Inline, Paragraph, Table } from '../../core/docx/types'\nimport type { SlideModel, TextBody } from '../../core/pptx/types'\n\n// ---------------------------------------------------------------- DOCX\n\nconst plain = (runs: Inline[]) => runs.map((r) => (r.t === 'text' || r.t === 'ref' ? (r.s.vanish ? '' : r.text) : '')).join('')\n\nconst cellText = (blocks: Block[]) =>\n blocks\n .filter((b): b is Paragraph => b.t === 'p')\n .map((p) => plain(p.runs))\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim()\n\n/** Plain text: one line per paragraph, list markers kept, table cells separated by tabs. */\nexport function docxToText(blocks: Block[]): string {\n const out: string[] = []\n for (const b of blocks) {\n if (b.t === 'p') out.push((b.marker ? b.marker.text + (b.marker.tab ? '\\t' : ' ') : '') + plain(b.runs))\n else if (b.t === 'tbl') for (const row of b.rows) out.push(row.cells.map((c) => cellText(c.blocks)).join('\\t'))\n }\n return out.join('\\n') + '\\n'\n}\n\nconst mdEsc = (s: string) => s.replace(/([\\\\`*_[\\]<>])/g, '\\\\$1')\n\n/** `heading`: bold is the heading's own look, not emphasis */\nfunction mdInline(runs: Inline[], heading = false): string {\n let out = ''\n let i = 0\n while (i < runs.length) {\n const r = runs[i]\n if (r.t !== 'text' && r.t !== 'ref') {\n i++\n continue\n }\n if (r.t === 'text' && r.href) {\n // a link spans the consecutive runs with the same target\n let text = ''\n const href = r.href\n while (i < runs.length && runs[i].t === 'text' && (runs[i] as { href?: string }).href === href) text += (runs[i++] as { text: string }).text\n out += `[${mdEsc(text)}](${href.replace(/[()\\s]/g, encodeURIComponent)})`\n continue\n }\n i++\n if (r.s.vanish) continue\n const text = r.text.replace(/\\t/g, ' ').replace(/\\n/g, ' \\n')\n const core = text.trim()\n if (!core) {\n out += text\n continue\n }\n const mark = (r.s.b && !heading ? '**' : '') + (r.s.i && !heading ? '*' : '')\n const strike = r.s.strike ? '~~' : ''\n const lead = text.slice(0, text.indexOf(core[0]))\n const trail = text.slice(text.lastIndexOf(core[core.length - 1]) + 1)\n out += `${lead}${strike}${mark}${mdEsc(core)}${[...mark].reverse().join('')}${strike}${trail}`\n }\n return out.replace(/\\*\\*\\*\\*/g, '')\n}\n\nfunction mdTable(t: Table): string {\n const rows = t.rows.map((r) => r.cells.map((c) => cellText(c.blocks).replace(/\\|/g, '\\\\|') || ' '))\n if (!rows.length) return ''\n const n = Math.max(...rows.map((r) => r.length))\n const line = (r: string[]) => `| ${Array.from({ length: n }, (_, k) => r[k] ?? ' ').join(' | ')} |`\n return [line(rows[0]), `|${' --- |'.repeat(n)}`, ...rows.slice(1).map(line)].join('\\n')\n}\n\n/** Markdown: headings (outline levels), lists, bold / italic / strike, links, tables. */\nexport function docxToMarkdown(blocks: Block[]): string {\n const out: string[] = []\n let prevList = false\n for (const b of blocks) {\n if (b.t === 'tbl') {\n out.push(mdTable(b), '')\n prevList = false\n continue\n }\n if (b.t !== 'p') continue\n const lvl = b.ps.outline\n const heading = lvl !== undefined && lvl < 6\n const text = mdInline(b.runs, heading).trim()\n if (b.marker) {\n const ordered = /^[\\da-zA-Z]{1,4}[.)]$/.test(b.marker.text.trim())\n const depth = Math.max(0, Math.round(((b.ps.indL ?? 36) - 36) / 36))\n if (!prevList && out.length && out[out.length - 1] !== '') out.push('')\n out.push(`${' '.repeat(depth)}${ordered ? '1.' : '-'} ${text}`)\n prevList = true\n continue\n }\n if (prevList) out.push('')\n prevList = false\n if (!text) continue\n out.push(heading ? `${'#'.repeat(lvl + 1)} ${text}` : text, '')\n }\n return out.join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim() + '\\n'\n}\n\n// ---------------------------------------------------------------- PPTX\n\nconst bodyText = (t: TextBody | undefined) =>\n t\n ? t.paras\n .map((p) => (p.bullet ? p.bullet.text + ' ' : '') + p.runs.map((r) => (r.br ? '\\n' : r.text)).join(''))\n .filter((l) => l.trim())\n .join('\\n')\n : ''\n\n/** Text of each slide (shapes, tables, speaker notes). */\nexport function slidesToText(slides: SlideModel[]): string {\n const out: string[] = []\n for (const s of slides) {\n out.push(`Slide ${s.index + 1}`, '')\n for (const el of s.els) {\n if (el.t === 'shape') {\n const t = bodyText(el.text)\n if (t) out.push(t, '')\n } else if (el.t === 'table') {\n for (const row of el.rows) out.push(row.cells.filter((c) => !c.hidden).map((c) => bodyText(c.text).replace(/\\s+/g, ' ')).join('\\t'))\n out.push('')\n }\n }\n if (s.notes?.trim()) out.push('Notes:', s.notes.trim(), '')\n out.push('')\n }\n return out.join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim() + '\\n'\n}\n\n// ---------------------------------------------------------------- CSV\n\n/** RFC 4180 output (CRLF; fields with separators, quotes or line breaks are quoted). */\nexport function toCsv(rows: string[][], sep = ','): string {\n const q = (v: string) => (v.includes(sep) || /[\"\\r\\n]/.test(v) || /^\\s|\\s$/.test(v) ? `\"${v.replace(/\"/g, '\"\"')}\"` : v)\n return rows.map((r) => r.map(q).join(sep)).join('\\r\\n') + '\\r\\n'\n}\n","import { memo, type CSSProperties, type ReactNode } from 'react'\nimport type { Block, Inline, Paragraph, ParaStyle, RunStyle, Table } from '../../core/docx/types'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { useMediaUrl } from '../common/hooks'\n\nexport interface RenderCtx {\n client: DocumentClient\n /** 0-based page index, -1 while measuring */\n page: number\n pages: number\n measuring: boolean\n editable: boolean\n}\n\nconst pt = (v: number | undefined) => (v ? `${+v.toFixed(2)}pt` : undefined)\n\nconst UNDERLINE_STYLE: Record<string, CSSProperties['textDecorationStyle']> = {\n double: 'double', dotted: 'dotted', dottedHeavy: 'dotted', dash: 'dashed', dashedHeavy: 'dashed', dashLong: 'dashed',\n wave: 'wavy', wavyHeavy: 'wavy', wavyDouble: 'wavy',\n}\n\nexport function runCss(s: RunStyle | undefined): CSSProperties {\n const css: CSSProperties = {}\n if (!s) return css\n if (s.b) css.fontWeight = 700\n else if (s.b === false) css.fontWeight = 400\n if (s.i) css.fontStyle = 'italic'\n else if (s.i === false) css.fontStyle = 'normal'\n const u = s.u && s.u !== 'none'\n const deco = [u ? 'underline' : '', s.strike || s.dstrike ? 'line-through' : ''].filter(Boolean).join(' ')\n if (deco) css.textDecoration = deco\n else if (s.u === 'none' || s.strike === false) css.textDecoration = 'none'\n if (u && UNDERLINE_STYLE[s.u!]) css.textDecorationStyle = UNDERLINE_STYLE[s.u!]\n if (s.dstrike) css.textDecorationStyle = 'double'\n if (s.color) css.color = s.color\n if (s.sz) css.fontSize = `${s.va ? s.sz * 0.65 : s.sz}pt`\n if (s.font) css.fontFamily = s.font\n if (s.hl || s.shd) css.background = s.hl ?? s.shd\n if (s.va) css.verticalAlign = s.va === 'sup' ? 'super' : 'sub'\n if (s.caps) css.textTransform = 'uppercase'\n if (s.smallCaps) css.fontVariant = 'small-caps'\n if (s.spacing) css.letterSpacing = `${s.spacing}pt`\n return css\n}\n\nfunction lineHeight(ps: ParaStyle): string | number | undefined {\n if (!ps.line) return 1.17\n if (ps.lineRule === 'exact') return `${ps.line}pt`\n if (ps.lineRule === 'atLeast') return `max(${ps.line}pt, 1.17em)`\n return +(ps.line * 1.17).toFixed(3)\n}\n\n/** contextual spacing flags: 'b' drop space before, 'a' drop space after */\nexport type Spacing = '' | 'b' | 'a' | 'ba'\n\nexport function contextual(p: Block | undefined, prev: Block | undefined, next: Block | undefined): Spacing {\n if (!p || p.t !== 'p' || !p.ps.contextual) return ''\n const b = prev?.t === 'p' && prev.sid === p.sid ? 'b' : ''\n const a = next?.t === 'p' && next.sid === p.sid ? 'a' : ''\n return (b + a) as Spacing\n}\n\nfunction paraCss(ps: ParaStyle, sp: Spacing): CSSProperties {\n const css: CSSProperties = {\n paddingTop: sp.includes('b') ? undefined : pt(ps.before),\n paddingBottom: sp.includes('a') ? undefined : pt(ps.after),\n paddingLeft: pt(ps.indL),\n paddingRight: pt(ps.indR),\n textIndent: pt(ps.indFirst),\n textAlign: ps.align,\n lineHeight: lineHeight(ps),\n }\n if (ps.shd) css.background = ps.shd\n const b = (x: ParaStyle['bTop']) => (x ? `${x.w}pt ${x.style} ${x.color}` : undefined)\n if (ps.bTop) css.borderTop = b(ps.bTop)\n if (ps.bBottom) css.borderBottom = b(ps.bBottom)\n if (ps.bLeft) css.borderLeft = b(ps.bLeft)\n if (ps.bRight) css.borderRight = b(ps.bRight)\n return css\n}\n\nfunction Img({ ctx, target, w, h, alt }: { ctx: RenderCtx; target: string; w: number; h: number; alt?: string }) {\n const url = useMediaUrl(ctx.client, target, !ctx.measuring)\n const size = { width: `${w}pt`, height: `${h}pt` }\n if (ctx.measuring || !url) return <span className=\"de-img-missing\" style={{ ...size, borderStyle: 'none' }} />\n if (url === 'unsupported') {\n return (\n <span className=\"de-img-missing\" style={size} title={target}>\n {target.split('.').pop()?.toUpperCase()} image\n </span>\n )\n }\n return <img src={url} alt={alt ?? ''} style={{ ...size, verticalAlign: 'bottom', display: 'inline-block' }} draggable={false} />\n}\n\nfunction InlineView({ x, ctx, o }: { x: Inline; ctx: RenderCtx; o: number }): ReactNode {\n const obj = { 'data-o': o, 'data-obj': '', contentEditable: ctx.editable ? false : undefined } as const\n switch (x.t) {\n case 'text': {\n const span = (\n <span data-o={o} style={runCss(x.s)}>\n {x.text}\n </span>\n )\n return x.href && !ctx.measuring && !ctx.editable ? (\n <a href={x.href} target={x.href.startsWith('#') ? undefined : '_blank'} rel=\"noreferrer noopener\">\n {span}\n </a>\n ) : (\n span\n )\n }\n case 'field': {\n const v = x.kind === 'PAGE' ? (ctx.page >= 0 ? ctx.page + 1 : 1) : ctx.pages || 1\n return (\n <span {...obj} style={runCss(x.s)}>\n {v}\n </span>\n )\n }\n case 'ref':\n return (\n <span {...obj} style={runCss(x.s)}>\n {x.text}\n </span>\n )\n case 'img': {\n const img = <Img ctx={ctx} target={x.target} w={x.w} h={x.h} alt={x.alt} />\n return (\n <span {...obj}>\n {x.href && !ctx.measuring && !ctx.editable ? (\n <a href={x.href} target=\"_blank\" rel=\"noreferrer noopener\">\n {img}\n </a>\n ) : (\n img\n )}\n </span>\n )\n }\n case 'box':\n return (\n <span\n {...obj}\n className=\"de-tbox\"\n style={{ width: x.w ? `${x.w}pt` : undefined, minHeight: x.h ? `${x.h}pt` : undefined, background: x.fill, border: x.border }}\n >\n {x.blocks.map((b, i) => (\n <BlockView key={i} block={b} ctx={ctx} />\n ))}\n </span>\n )\n case 'shape':\n return x.label ? (\n <span {...obj} className=\"de-ph\" style={{ width: `${x.w}pt`, height: `${x.h}pt` }}>\n {x.label}\n </span>\n ) : (\n <span {...obj} />\n )\n }\n}\n\nfunction ParaView({ p, ctx, pa, sp }: { p: Paragraph; ctx: RenderCtx; pa?: string; sp: Spacing }) {\n const hang = p.ps.indFirst && p.ps.indFirst < 0 ? -p.ps.indFirst : 0\n const visible = p.runs.length > 0\n const style = paraCss(p.ps, sp)\n if (!visible) {\n style.fontSize = pt(p.markSz)\n if (p.markFont) style.fontFamily = p.markFont\n }\n const editable = ctx.editable && pa !== undefined\n let o = 0\n const runs = p.runs.map((x, i) => {\n const node = <InlineView key={i} x={x} ctx={ctx} o={o} />\n o += x.t === 'text' ? x.text.length : 1\n return node\n })\n return (\n <div className=\"de-p\" style={style} data-pa={pa} contentEditable={ctx.editable && !editable ? false : undefined}>\n {p.marker && (\n <span className=\"de-marker\" contentEditable={ctx.editable ? false : undefined} style={{ ...runCss(p.marker.s), minWidth: p.marker.tab && hang ? `${hang}pt` : undefined }}>\n {p.marker.text}\n {p.marker.tab && !hang ? '\\t' : ''}\n </span>\n )}\n {runs}\n {!visible &&\n (editable ? (\n <span data-o={0} data-empty=\"\">\n {'\\u200B'}\n </span>\n ) : (\n '\\u200B'\n ))}\n </div>\n )\n}\n\nfunction TableView({ t, ctx, pa }: { t: Table; ctx: RenderCtx; pa?: string }) {\n const total = t.cols.reduce((a, b) => a + b, 0)\n const style: CSSProperties = { width: total ? `${total}pt` : '100%' }\n if (t.align === 'center') style.margin = '0 auto'\n else if (t.align === 'right') style.marginLeft = 'auto'\n else if (t.indL) style.marginLeft = `${t.indL}pt`\n return (\n <table className=\"de-tbl\" style={style}>\n {total > 0 && (\n <colgroup>\n {t.cols.map((w, i) => (\n <col key={i} style={{ width: `${w}pt` }} />\n ))}\n </colgroup>\n )}\n <tbody>\n {t.rows.map((row, ri) => (\n <tr key={ri} style={{ height: row.h ? `${row.h}pt` : undefined }}>\n {row.cells.map((c, ci) => (\n <td\n key={ci}\n colSpan={c.colSpan > 1 ? c.colSpan : undefined}\n rowSpan={c.rowSpan > 1 ? c.rowSpan : undefined}\n style={{\n borderTop: c.borders.t,\n borderRight: c.borders.r,\n borderBottom: c.borders.b,\n borderLeft: c.borders.l,\n background: c.shd,\n verticalAlign: c.vAlign,\n padding: `${c.pad[0]}pt ${c.pad[1]}pt ${c.pad[2]}pt ${c.pad[3]}pt`,\n }}\n >\n {c.blocks.map((b, i) => (\n <BlockView\n key={b.t === 'p' ? `${i}:${b.ver ?? 0}` : i}\n block={b}\n ctx={ctx}\n pa={pa !== undefined && b.t === 'p' && b.pid !== undefined && !b.ro ? `${pa}.${ri}.${ci}.${i}` : undefined}\n sp={contextual(b, c.blocks[i - 1], c.blocks[i + 1])}\n nested\n />\n ))}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n\nexport interface BlockViewProps {\n block: Block\n ctx: RenderCtx\n /** editable address (top-level: block index; table: block index used as prefix) */\n pa?: string\n sp?: Spacing\n nested?: boolean\n}\n\nexport const BlockView = memo(function BlockView({ block, ctx, pa, sp = '', nested }: BlockViewProps) {\n switch (block.t) {\n case 'p':\n return <ParaView p={block} ctx={ctx} pa={pa} sp={sp} />\n case 'tbl':\n return (\n <div style={{ overflow: 'visible' }} contentEditable={ctx.editable && (nested || pa === undefined) ? false : undefined}>\n <TableView t={block} ctx={ctx} pa={nested ? undefined : pa} />\n </div>\n )\n default:\n return <div />\n }\n})\n","import { useEffect, useMemo, useRef, useState, type CSSProperties } from 'react'\nimport type { Block, DocxMeta, PageSetup, Paragraph } from '../../core/docx/types'\nimport { DEFAULT_PAGE } from '../../core/docx/types'\nimport { registerHost } from '../../collab/hosts'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { claimFocus, lowerIndex, useForceUpdate, useIsoLayoutEffect, useScroll, useSize } from '../common/hooks'\nimport { useFileOps, useSelectAll, useViewer } from '../common/Slots'\nimport { Status } from '../common/Status'\nimport { ZoomControl, type Zoom } from '../common/ZoomControl'\nimport { ContextMenu, MOD, type MenuItem } from '../common/ContextMenu'\nimport { PromptDialog, Toast, type PromptSpec } from '../common/Dialog'\nimport { domFromPos, getSel, opInsert, posFromDom } from '../edit/input'\nimport { download, pickFiles } from '../edit/Toolbar'\nimport { runsText, type RRun } from '../edit/rich'\nimport { DocxEditor, type DocState, type FormatState } from './DocxEditor'\nimport { DocxToolbar, type ImageActions } from './DocxToolbar'\nimport { FindBar, type Match } from './FindBar'\nimport { docxToMarkdown, docxToText } from '../file/text'\nimport { BlockView, contextual, type RenderCtx } from './render'\n\nconst PX = 4 / 3\nconst GAP = 16\nconst PAD = 24\n\ninterface PageSlice {\n start: number\n end: number\n used: number\n}\n\nfunction paginate(blocks: Block[], heights: WeakMap<Block, number>, count: number, avail: number): PageSlice[] {\n const pages: PageSlice[] = []\n let cur: PageSlice = { start: 0, end: 0, used: 0 }\n for (let i = 0; i < count; i++) {\n const b = blocks[i]\n const h = heights.get(b) ?? 0\n if (b.t === 'sect') {\n cur.end = i + 1\n if (b.kind !== 'continuous') {\n pages.push(cur)\n cur = { start: i + 1, end: i + 1, used: 0 }\n }\n continue\n }\n const forced = b.t === 'p' && b.pb && cur.end > cur.start\n if (forced || (cur.used > 0 && cur.used + h > avail)) {\n pages.push(cur)\n cur = { start: i, end: i, used: 0 }\n }\n cur.end = i + 1\n cur.used += h\n }\n if (cur.end > cur.start || !pages.length) pages.push(cur)\n return pages\n}\n\nconst started = new WeakSet<DocumentClient>()\n\n/** the rendered element of the inline object at (pa, o) — its <img> when it is a picture */\nfunction findObj(root: HTMLElement, pa: string, o: number): HTMLElement | null {\n for (const p of root.querySelectorAll<HTMLElement>(`[data-pa=\"${pa}\"]`)) {\n for (const sp of p.querySelectorAll<HTMLElement>(`[data-obj][data-o=\"${o}\"]`)) {\n if (sp.closest('[data-pa]') === p) return sp.querySelector('img') ?? sp\n }\n }\n return null\n}\n\ninterface Box {\n x: number\n y: number\n w: number\n h: number\n}\nconst HANDLES = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'] as const\n\n/** heading entries for the outline panel */\nfunction outlineOf(blocks: Block[], titleId: string | undefined) {\n const out: { bi: number; lvl: number; text: string }[] = []\n blocks.forEach((b, bi) => {\n if (b.t !== 'p' || b.pid === undefined) return\n const title = !!titleId && b.sid === titleId\n const lvl = title ? 0 : b.ps.outline\n if (lvl === undefined || lvl > 5) return\n const text = runsText(b.runs as RRun[]).trim()\n if (text) out.push({ bi, lvl: title ? 0 : lvl + (titleId ? 1 : 0), text })\n })\n return out\n}\nconst editable = (b: Block | undefined): b is Paragraph => !!b && b.t === 'p' && b.pid !== undefined && !b.ro\n\nexport interface DocxViewProps {\n client: DocumentClient\n onStatus?: (s: string) => void\n initialZoom?: Zoom\n}\n\nexport function DocxView({ client, onStatus, initialZoom = 'fit' }: DocxViewProps) {\n const viewer = useViewer()\n const st = useRef<DocState>({ blocks: [], heights: new WeakMap(), dirty: new Set(), frontier: 0 }).current\n const [version, bump] = useForceUpdate()\n const [meta, setMeta] = useState<DocxMeta | null>(null)\n const [done, setDone] = useState<{ error?: string } | null>(null)\n const [zoom, setZoom] = useState<Zoom>(initialZoom)\n const [scrollRef, size] = useSize<HTMLDivElement>()\n const scroll = useScroll(scrollRef)\n const pagesRef = useRef<HTMLDivElement>(null)\n const editor = useMemo(() => new DocxEditor(client, st, bump), [client, st, bump])\n const isEditing = viewer.editable && !!done && !done.error\n const [find, setFind] = useState<{ open: boolean; q: string; idx: number }>({ open: false, q: '', idx: 0 })\n const [ctxMenu, setCtxMenu] = useState<{ x: number; y: number } | null>(null)\n const [prompt, setPrompt] = useState<PromptSpec | null>(null)\n const [toast, setToast] = useState<string | null>(null)\n const [outline, setOutline] = useState(false)\n const [painter, setPainter] = useState(false)\n const [img, setImg] = useState<FormatState['img'] | null>(null)\n const [imgBox, setImgBox] = useState<Box | null>(null)\n const resizing = useRef(false)\n /** pt per screen px of the picture being resized */\n const resizeRatio = useRef<number | null>(null)\n\n useEffect(() => {\n editor.onImage = (x) => setImg((p) => (p?.pa === x?.pa && p?.o === x?.o && p?.w === x?.w && p?.h === x?.h && p?.target === x?.target && p?.alt === x?.alt ? p : x))\n editor.onStyles = (styles) => setMeta((m) => (m ? { ...m, styles } : m))\n editor.onPainter = setPainter\n return () => {\n editor.onImage = editor.onStyles = editor.onPainter = undefined\n }\n }, [editor])\n\n // collaboration sessions edit through this editor once the document is fully loaded\n useEffect(() => (done && !done.error ? registerHost(client, 'docx', { editor, st }) : undefined), [client, editor, st, done])\n\n useEffect(() => {\n const offs = [\n client.on('docx:blocks', (b) => {\n for (const x of b) st.blocks.push(x)\n bump()\n }),\n client.on('docx:meta', (m) => {\n setMeta(m)\n if (m.styles) editor.styles = m.styles\n }),\n client.on('docx:done', setDone),\n ]\n if (!started.has(client)) {\n started.add(client)\n client.call('docx.start').catch(() => {})\n }\n return () => offs.forEach((f) => f())\n }, [client, bump, st, editor])\n\n const page: PageSetup = meta?.page ?? DEFAULT_PAGE\n const contentW = page.w - page.ml - page.mr\n const availPx = (page.h - page.mt - page.mb) * PX\n\n // ---- measurement: edited blocks first, then the not-yet-measured tail (time-sliced) ----\n const [batch, setBatch] = useState(40)\n const measureRef = useRef<HTMLDivElement>(null)\n const widthKey = `${contentW}|${meta?.font}|${meta?.sz}`\n const lastKey = useRef(widthKey)\n if (lastKey.current !== widthKey) {\n lastKey.current = widthKey\n st.heights = new WeakMap()\n st.dirty.clear()\n st.frontier = 0\n }\n const total = st.blocks.length\n const queue: { b: Block; i: number }[] = []\n for (const b of st.dirty) {\n if (queue.length >= 50) break\n const i = st.blocks.indexOf(b)\n if (i < 0) st.dirty.delete(b)\n else queue.push({ b, i })\n }\n const tailEnd = Math.min(total, st.frontier + batch)\n for (let i = st.frontier; i < tailEnd; i++) queue.push({ b: st.blocks[i], i })\n const renderStart = performance.now()\n const measureCtx = useMemo<RenderCtx>(() => ({ client, page: -1, pages: 0, measuring: true, editable: false }), [client])\n\n useIsoLayoutEffect(() => {\n const el = measureRef.current\n if (!el || !queue.length || !meta) return\n const hs = Array.from(el.children).map((c) => (c as HTMLElement).getBoundingClientRect().height)\n const dt = performance.now() - renderStart\n const id = setTimeout(() => {\n queue.forEach((q, k) => {\n st.heights.set(q.b, hs[k] ?? 0)\n st.dirty.delete(q.b)\n })\n if (tailEnd > st.frontier) st.frontier = tailEnd\n setBatch((b) => (dt < 10 ? Math.min(b * 2, 1500) : dt > 30 ? Math.max(10, b >> 1) : b))\n bump()\n }, 0)\n return () => clearTimeout(id)\n })\n\n const pages = useMemo(\n () => paginate(st.blocks, st.heights, Math.min(st.frontier, total), availPx),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [version, availPx, total],\n )\n\n // ---- layout ----\n const pageW = page.w * PX\n const pageH = page.h * PX\n const fit = size.w ? Math.max(0.2, Math.min(2, (size.w - PAD * 2) / pageW)) : 1\n const z = zoom === 'fit' ? Math.min(fit, 1.25) : zoom\n const complete = !!done && st.frontier >= total\n const pageHeights = pages.map((p) => Math.max(pageH, (page.mt + page.mb) * PX + p.used) * z)\n const tops: number[] = []\n let acc = PAD\n for (const h of pageHeights) {\n tops.push(acc)\n acc += h + GAP\n }\n const skeleton = complete ? 0 : 1\n const totalH = acc + skeleton * (pageH * z + GAP) + PAD - GAP\n const totalW = Math.max(size.w, pageW * z + PAD * 2)\n const left = Math.max(PAD, (totalW - pageW * z) / 2)\n\n const first = tops.length ? lowerIndex(tops, scroll.y - pageH * z) : 0\n const last = tops.length ? lowerIndex(tops, scroll.y + size.h + 200) : -1\n const pageCount = complete ? pages.length : 0\n // keep the page holding the caret mounted so the DOM selection survives scrolling\n const caretBi = isEditing && editor.input.lastSel ? Number(editor.input.lastSel.f.pa.split('.')[0]) : -1\n const caretPage = caretBi >= 0 ? pages.findIndex((p) => caretBi >= p.start && caretBi < p.end) : -1\n\n editor.contentW = contentW\n editor.defaultFont = meta?.font\n editor.defaultSz = meta?.sz\n const cur = tops.length ? lowerIndex(tops, scroll.y + size.h / 3) + 1 : 0\n // word count (debounced, off the typing path)\n const [words, setWords] = useState(0)\n useEffect(() => {\n if (!done) return\n const id = setTimeout(() => {\n let n = 0\n const count = (b: Block) => {\n if (b.t === 'p') n += runsText(b.runs as RRun[]).split(/\\s+/).filter((w) => /[\\p{L}\\p{N}]/u.test(w)).length\n else if (b.t === 'tbl') for (const r of b.rows) for (const c of r.cells) c.blocks.forEach(count)\n }\n st.blocks.forEach(count)\n setWords(n)\n }, 600)\n return () => clearTimeout(id)\n }, [version, done, st])\n const status = done?.error\n ? `Error: ${done.error}`\n : complete\n ? `Page ${cur} of ${pages.length} · ${words.toLocaleString()} words`\n : `Page ${cur} of ${pages.length}+ · loading…`\n\n // ---- editing wiring ----\n useEffect(() => {\n const el = pagesRef.current\n if (!isEditing || !el) return\n editor.input.attach(el)\n editor.onDirty = () => viewer.setDirty(true)\n return () => editor.input.detach()\n }, [isEditing, editor, viewer])\n\n // Ctrl/⌘+A: every paragraph when editing, the rendered pages' text when viewing (not the viewer around them)\n useSelectAll(() => {\n if (isEditing) editor.selectAll()\n else if (pagesRef.current) getSel(pagesRef.current)?.selectAllChildren(pagesRef.current)\n })\n\n // keyboard first: shortcuts and typing work without a click (a focused host page control keeps the focus)\n const rendered = pages.some((p) => p.end > p.start)\n useEffect(() => {\n if (!isEditing) {\n claimFocus(scrollRef.current)\n return\n }\n // typing needs a caret: at the start of the document once its first page has content\n if (!rendered || !claimFocus(pagesRef.current) || editor.input.readSel()) return\n const all = editor.all()\n if (all && !editor.input.restore({ a: all.a, f: all.a })) editor.pendingSel = { a: all.a, f: all.a }\n }, [isEditing, rendered]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n editor.shortcut = (e: KeyboardEvent) => {\n const mod = e.metaKey || e.ctrlKey\n if (mod && e.key.toLowerCase() === 's') {\n void viewer.save()\n return true\n }\n if (mod && e.key.toLowerCase() === 'f') {\n setFind((f) => ({ ...f, open: true }))\n return true\n }\n if (mod && e.key === 'Enter') {\n editor.insertPageBreak()\n return true\n }\n if (mod && e.key.toLowerCase() === 'k') {\n askLink()\n return true\n }\n // Ctrl/⌘+Alt+0…6: Normal text, Heading 1…6\n if (mod && e.altKey && /^Digit[0-6]$/.test(e.code)) {\n const n = Number(e.code.slice(5))\n void editor.applyCanon(n ? (`h${n}` as 'h1') : 'normal')\n return true\n }\n if (mod && e.key === '\\\\') {\n editor.clearFormat()\n return true\n }\n if (e.key === 'Escape' && editor.painter) {\n editor.copyFormat()\n return true\n }\n return false\n }\n }, [editor, viewer]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useIsoLayoutEffect(() => {\n const sel = editor.pendingSel\n if (!sel || !pagesRef.current) return\n if (!editor.input.restore(sel)) {\n // caret paragraph not rendered (scrolled away): bring its page into view, retry next render\n const bi = Number(sel.f.pa.split('.')[0])\n const pi = pages.findIndex((p) => bi >= p.start && bi < p.end)\n if (pi >= 0 && scrollRef.current) scrollRef.current.scrollTop = Math.max(0, tops[pi] - 16)\n if (pi < 0 || (pi >= first && pi <= last)) editor.pendingSel = null\n return\n }\n editor.pendingSel = null\n // keep the caret visible\n const ds = getSel(pagesRef.current)\n const range = ds?.rangeCount ? ds.getRangeAt(0) : null\n const sc = scrollRef.current\n if (range && sc) {\n const r = range.getBoundingClientRect()\n const box = sc.getBoundingClientRect()\n if (r.height && r.bottom > box.bottom - 24) sc.scrollTop += r.bottom - box.bottom + 48\n else if (r.height && r.top < box.top + 8) sc.scrollTop -= box.top - r.top + 48\n }\n })\n\n // ---- find ----\n const matches = useMemo<Match[]>(() => {\n const q = find.q.toLowerCase()\n if (!find.open || !q) return []\n const out: Match[] = []\n const scan = (p: Paragraph, pa: string, bi: number) => {\n const t = runsText(p.runs as RRun[]).toLowerCase()\n for (let i = t.indexOf(q); i >= 0 && out.length < 5000; i = t.indexOf(q, i + q.length)) out.push({ pa, a: i, b: i + q.length, bi })\n }\n st.blocks.forEach((b, bi) => {\n if (editable(b)) scan(b, String(bi), bi)\n else if (b.t === 'tbl')\n b.rows.forEach((r, ri) => r.cells.forEach((c, ci) => c.blocks.forEach((x, pi) => editable(x) && scan(x, `${bi}.${ri}.${ci}.${pi}`, bi))))\n })\n return out\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [find.q, find.open, version])\n\n const gotoMatch = (idx: number) => {\n const m = matches[idx]\n const sc = scrollRef.current\n if (!m || !sc) return\n const pi = pages.findIndex((p) => m.bi >= p.start && m.bi < p.end)\n if (pi >= 0) sc.scrollTop = Math.max(0, tops[pi] - 16)\n setFind((f) => ({ ...f, idx }))\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n const root = pagesRef.current\n if (!root) return\n const a = domFromPos(root, { pa: m.pa, o: m.a })\n const b = domFromPos(root, { pa: m.pa, o: m.b })\n if (!a || !b) return\n const r = document.createRange()\n r.setStart(a[0], a[1])\n r.setEnd(b[0], b[1])\n const rect = r.getBoundingClientRect()\n const box = sc.getBoundingClientRect()\n sc.scrollTop += rect.top - box.top - box.height / 3\n if (isEditing) editor.input.restore({ a: { pa: m.pa, o: m.a }, f: { pa: m.pa, o: m.b } }, false)\n }),\n )\n }\n\n // highlight visible matches (CSS Custom Highlight API)\n useIsoLayoutEffect(() => {\n const H = (globalThis as unknown as { Highlight?: new (...r: Range[]) => unknown }).Highlight\n const reg = (CSS as unknown as { highlights?: Map<string, unknown> }).highlights\n if (!H || !reg) return\n const root = pagesRef.current\n if (!root || !matches.length) {\n reg.delete('de-find')\n reg.delete('de-find-cur')\n return\n }\n const all: Range[] = []\n let curR: Range | undefined\n matches.forEach((m, i) => {\n if (m.bi < (pages[first]?.start ?? 0) || m.bi >= (pages[last]?.end ?? 0)) return\n const a = domFromPos(root, { pa: m.pa, o: m.a })\n const b = domFromPos(root, { pa: m.pa, o: m.b })\n if (!a || !b) return\n const r = document.createRange()\n r.setStart(a[0], a[1])\n r.setEnd(b[0], b[1])\n if (i === find.idx) curR = r\n else all.push(r)\n })\n reg.set('de-find', new H(...all))\n if (curR) reg.set('de-find-cur', new H(curR))\n else reg.delete('de-find-cur')\n })\n\n const replaceMatch = (m: Match, text: string) => opInsert(editor, { a: { pa: m.pa, o: m.a }, f: { pa: m.pa, o: m.b } }, text)\n\n const docStyle: CSSProperties = { fontFamily: meta?.font, fontSize: meta ? `${meta.sz}pt` : undefined }\n\n // ---- File → Download as / Print: the pages as laid out on screen ----\n useFileOps({\n printable: async () => {\n if (!complete) throw new Error('The document is still loading — try again in a moment')\n return {\n size: `${page.w}pt ${page.h}pt`,\n margin: '0',\n node: pages.map((p, i) => (\n <div key={i} className=\"de-print-page\" style={{ width: `${page.w}pt`, height: `${page.h}pt` }}>\n <PageView index={i} count={pages.length} slice={p} blocks={st.blocks} meta={meta} page={page} top={0} left={0} height={pageH} zoom={1} client={client} docStyle={docStyle} editing={false} />\n </div>\n )),\n }\n },\n text: async (format) => {\n if (!done) throw new Error('The document is still loading — try again in a moment')\n return format === 'md' ? docxToMarkdown(st.blocks) : docxToText(st.blocks)\n },\n stats: () => {\n let chars = 0\n let paras = 0\n const count = (b: Block) => {\n if (b.t === 'p') {\n const t = runsText(b.runs as RRun[])\n chars += t.length\n if (t.trim()) paras++\n } else if (b.t === 'tbl') for (const r of b.rows) for (const c of r.cells) c.blocks.forEach(count)\n }\n st.blocks.forEach(count)\n const more = complete ? '' : '+'\n return [\n ['Pages', pages.length.toLocaleString() + more],\n ['Words', words.toLocaleString() + more],\n ['Characters', chars.toLocaleString() + more],\n ['Paragraphs', paras.toLocaleString() + more],\n ['Page size', `${+(page.w / 72).toFixed(2)} × ${+(page.h / 72).toFixed(2)} in`],\n ]\n },\n })\n\n // ---- dialogs / clipboard ----\n const askLink = () => {\n const cur = editor.state()?.link\n setPrompt({\n title: cur ? 'Edit link' : 'Insert link',\n placeholder: 'https://…',\n initial: cur,\n ok: 'Apply',\n onOk: (v) => void editor.setLink(v.trim() || null),\n extra: cur ? { label: 'Remove', run: () => void editor.setLink(null) } : undefined,\n })\n }\n const askAlt = () => {\n const cur = editor.state()?.img\n if (!cur) return\n setPrompt({\n title: 'Alt text',\n label: 'Describe the picture for screen readers',\n initial: cur.alt ?? '',\n area: true,\n ok: 'Save',\n onOk: (v) => editor.setAltText(v.trim()),\n })\n }\n const paste = async (plain: boolean) => {\n const sel = editor.input.sel()\n if (!sel) return\n try {\n if (!plain && navigator.clipboard?.read) {\n for (const it of await navigator.clipboard.read()) {\n const pic = it.types.find((t) => t.startsWith('image/'))\n if (pic) return void editor.insertImages([await it.getType(pic)], sel)\n if (it.types.includes('text/html')) {\n const html = await (await it.getType('text/html')).text()\n const dt = { files: [] as unknown as FileList, getData: (t: string) => (t === 'text/html' ? html : '') } as unknown as DataTransfer\n if (editor.pasteRich(sel, dt)) return\n }\n }\n }\n const text = await navigator.clipboard.readText()\n if (text) opInsert(editor, sel, text)\n } catch {\n setToast(`The browser blocked clipboard access — use ${MOD}V to paste`)\n }\n }\n const copyCut = (cmd: 'copy' | 'cut') => {\n if (!document.execCommand(cmd)) setToast(`Use ${MOD}${cmd === 'copy' ? 'C' : 'X'}`)\n }\n const pickImage = () => void pickFiles().then((f) => void (f.length && editor.insertImages(f)))\n const imgEl = () => (img && pagesRef.current ? (findObj(pagesRef.current, img.pa, img.o) as HTMLImageElement | null) : null)\n const imageActions: ImageActions = {\n original: () => {\n const el = imgEl()\n if (el?.naturalWidth) editor.imageOriginal(el.naturalWidth, el.naturalHeight)\n },\n replace: () => void pickFiles('image/*', false).then((f) => f[0] && editor.replaceImage(f[0])),\n alt: askAlt,\n download: !viewer.canDownload\n ? undefined\n : () => {\n const el = imgEl()\n if (!el?.src || !img) return\n void fetch(el.src)\n .then((r) => r.blob())\n .then((b) => download(b, img.target.split('/').pop() ?? 'image'))\n },\n }\n\n // ---- image selection overlay (resize handles) ----\n useIsoLayoutEffect(() => {\n if (resizing.current) return\n const root = pagesRef.current\n const sc = scrollRef.current\n let box: Box | null = null\n if (isEditing && img && root && sc) {\n const el = findObj(root, img.pa, img.o)\n if (el) {\n const r = el.getBoundingClientRect()\n const b = sc.getBoundingClientRect()\n box = { x: r.left - b.left + sc.scrollLeft, y: r.top - b.top + sc.scrollTop, w: r.width, h: r.height }\n }\n }\n setImgBox((p) => (p === box || (p && box && p.x === box.x && p.y === box.y && p.w === box.w && p.h === box.h) ? p : box))\n })\n\n const startResize = (dir: (typeof HANDLES)[number], e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n const el = imgEl()\n if (!img || !imgBox || !el) return\n const { w: w0, h: h0, x: x0, y: y0 } = imgBox\n const ptPerPx = img.w / Math.max(1, w0)\n const sx = e.clientX\n const sy = e.clientY\n let w = w0\n let h = h0\n resizing.current = true\n resizeRatio.current = ptPerPx\n const move = (ev: MouseEvent) => {\n const dx = ev.clientX - sx\n const dy = ev.clientY - sy\n let nw = w0 + (dir.includes('e') ? dx : dir.includes('w') ? -dx : 0)\n let nh = h0 + (dir.includes('s') ? dy : dir.includes('n') ? -dy : 0)\n if (dir.length === 2 && !ev.shiftKey) {\n const k = Math.max(nw / w0, nh / h0)\n nw = w0 * k\n nh = h0 * k\n }\n const maxW = (contentW / ptPerPx) * 1.0\n w = Math.max(8, Math.min(nw, maxW * 2))\n h = Math.max(8, nh)\n el.style.width = `${w * ptPerPx}pt`\n el.style.height = `${h * ptPerPx}pt`\n setImgBox({ x: x0, y: y0, w, h })\n }\n const up = () => {\n window.removeEventListener('mousemove', move)\n window.removeEventListener('mouseup', up)\n resizing.current = false\n resizeRatio.current = null\n if (w !== w0 || h !== h0) editor.setImageSize(w * ptPerPx, h * ptPerPx)\n else setImgBox(null)\n }\n window.addEventListener('mousemove', move)\n window.addEventListener('mouseup', up)\n }\n\n // ---- context menu ----\n const ctxItems = (): MenuItem[] => {\n const s = editor.state()\n const sel = editor.input.sel()\n const ranged = !!sel && (sel.a.pa !== sel.f.pa || sel.a.o !== sel.f.o)\n const items: MenuItem[] = []\n if (s?.img) {\n items.push(\n { head: 'Image', label: 'Original size', icon: 'imgOrig', run: imageActions.original },\n { label: 'Fit to page width', icon: 'fit', run: () => editor.resizeImage('fit') },\n { label: 'Replace image…', icon: 'imgReplace', run: imageActions.replace },\n { label: 'Alt text…', icon: 'alt', run: askAlt },\n ...(imageActions.download ? [{ label: 'Download image', icon: 'save', run: imageActions.download } as MenuItem] : []),\n { label: 'Delete image', icon: 'trash', run: () => editor.deleteSelection() },\n )\n }\n items.push(\n { label: 'Cut', icon: 'cut', hint: `${MOD}X`, disabled: !ranged, run: () => copyCut('cut'), sep: items.length > 0 },\n { label: 'Copy', icon: 'copy', hint: `${MOD}C`, disabled: !ranged, run: () => copyCut('copy') },\n { label: 'Paste', icon: 'paste', hint: `${MOD}V`, run: () => void paste(false) },\n { label: 'Paste without formatting', icon: 'pastePlain', hint: `${MOD}⇧V`, run: () => void paste(true) },\n { label: 'Delete', icon: 'trash', disabled: !ranged || !!s?.img, run: () => editor.deleteSelection() },\n )\n if (s?.link) {\n items.push(\n { label: 'Open link', icon: 'external', sep: true, run: () => window.open(s.link, '_blank', 'noopener') },\n { label: 'Edit link…', icon: 'link', hint: `${MOD}K`, run: askLink },\n { label: 'Remove link', icon: 'unlink', run: () => void editor.setLink(null) },\n )\n } else items.push({ label: 'Insert link…', icon: 'link', hint: `${MOD}K`, sep: true, run: askLink, disabled: !s })\n if (s?.inTable) {\n const op = (k: Parameters<DocxEditor['tableOp']>[0]) => () => editor.tableOp(k)\n items.push(\n { head: 'Table', label: 'Insert row above', icon: 'rowAbove', sep: true, run: op('rowAbove') },\n { label: 'Insert row below', icon: 'rowBelow', run: op('rowBelow') },\n { label: 'Insert column left', icon: 'colLeft', run: op('colLeft') },\n { label: 'Insert column right', icon: 'colRight', run: op('colRight') },\n { label: 'Delete row', icon: 'delRow', run: op('delRow') },\n { label: 'Delete column', icon: 'delCol', run: op('delCol') },\n { label: 'Delete table', icon: 'trash', run: op('delTable') },\n )\n } else {\n items.push(\n { label: 'Insert image…', icon: 'image', sep: true, run: pickImage, disabled: !s },\n { label: 'Insert table', icon: 'table', run: () => editor.insertTable(3, 3), disabled: !s },\n { label: 'Page break', icon: 'pagebreak', hint: `${MOD}↵`, run: () => editor.insertPageBreak(), disabled: !s },\n )\n }\n items.push(\n { label: 'Clear formatting', icon: 'clear', hint: `${MOD}\\\\`, sep: true, run: () => editor.clearFormat(), disabled: !s },\n { label: 'Select all', icon: 'selectAll', hint: `${MOD}A`, run: () => editor.selectAll() },\n )\n return items\n }\n\n // ---- outline ----\n const titleId = meta?.styles?.find((x) => x.canon === 'title')?.id\n const headings = useMemo(\n () => (outline ? outlineOf(st.blocks, titleId) : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [outline, version, titleId],\n )\n const topBlock = pages[Math.max(0, cur - 1)]?.start ?? 0\n const activeHeading = headings.reduce((acc, h, i) => (h.bi <= Math.max(topBlock, caretBi) ? i : acc), -1)\n const gotoBlock = (bi: number) => {\n const sc = scrollRef.current\n const pi = pages.findIndex((p) => bi >= p.start && bi < p.end)\n if (!sc || pi < 0) return\n sc.scrollTop = Math.max(0, tops[pi] - 16)\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n const el = pagesRef.current?.querySelector(`[data-pa=\"${bi}\"]`)\n if (el) sc.scrollTop += el.getBoundingClientRect().top - sc.getBoundingClientRect().top - 24\n if (isEditing) editor.input.restore({ a: { pa: String(bi), o: 0 }, f: { pa: String(bi), o: 0 } })\n }),\n )\n }\n\n return (\n <div style={{ position: 'relative', flex: 1, minWidth: 0, display: 'flex' }}>\n <div\n ref={scrollRef}\n className=\"de-scroll\"\n tabIndex={-1}\n onKeyDown={(e) => {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'f') {\n e.preventDefault()\n setFind((f) => ({ ...f, open: true }))\n }\n }}\n >\n {meta && queue.length > 0 && (\n <div ref={measureRef} className=\"de-measure de-doc\" style={{ ...docStyle, width: `${contentW}pt` }}>\n {queue.map(({ b, i }) => (\n <BlockView key={i} block={b} ctx={measureCtx} sp={contextual(b, st.blocks[i - 1], st.blocks[i + 1])} />\n ))}\n </div>\n )}\n <div\n ref={pagesRef}\n className={isEditing ? 'de-pages de-editing' : 'de-pages'}\n style={{ height: totalH, width: totalW }}\n contentEditable={isEditing || undefined}\n suppressContentEditableWarning\n spellCheck={false}\n onMouseDown={(e) => {\n if (!isEditing) return\n // clicking a picture selects it (resize handles, image tools)\n const t = e.target as HTMLElement\n const obj = t.tagName === 'IMG' ? t.closest<HTMLElement>('[data-obj]') : null\n const pos = obj && pagesRef.current ? posFromDom(pagesRef.current, obj, 0) : null\n if (pos) {\n e.preventDefault()\n editor.selectObject(pos.pa, pos.o)\n }\n }}\n onMouseUp={() => {\n if (editor.painter) setTimeout(() => editor.applyPainter(), 0)\n }}\n onContextMenu={(e) => {\n if (!isEditing) return\n e.preventDefault()\n setCtxMenu({ x: e.clientX, y: e.clientY })\n }}\n >\n {pages.map((p, i) =>\n (i < first || i > last) && i !== caretPage ? null : (\n <PageView\n key={i}\n index={i}\n count={pageCount}\n slice={p}\n blocks={st.blocks}\n meta={meta}\n page={page}\n top={tops[i]}\n left={left}\n height={pageHeights[i]}\n zoom={z}\n client={client}\n docStyle={docStyle}\n editing={isEditing}\n />\n ),\n )}\n {skeleton > 0 && <div className=\"de-page-skeleton\" contentEditable={false} style={{ top: acc, left, width: pageW * z, height: pageH * z }} />}\n </div>\n {imgBox && (\n <div className=\"de-img-sel\" style={{ left: imgBox.x, top: imgBox.y, width: imgBox.w, height: imgBox.h }}>\n {HANDLES.map((d) => (\n <span key={d} className={`de-img-h de-img-${d}`} onMouseDown={(e) => startResize(d, e)} />\n ))}\n {resizeRatio.current && (\n <span className=\"de-img-size\">\n {Math.round(imgBox.w * resizeRatio.current)} × {Math.round(imgBox.h * resizeRatio.current)} pt\n </span>\n )}\n </div>\n )}\n </div>\n {outline && (\n <nav className=\"de-outline\" aria-label=\"Document outline\">\n <div className=\"de-outline-head\">\n <span>Outline</span>\n <button type=\"button\" className=\"de-tb\" title=\"Close outline\" aria-label=\"Close outline\" onClick={() => setOutline(false)}>\n ×\n </button>\n </div>\n {headings.length ? (\n headings.map((h, i) => (\n <button key={h.bi} type=\"button\" className={i === activeHeading ? 'de-outline-item on' : 'de-outline-item'} style={{ paddingLeft: 10 + h.lvl * 14 }} onClick={() => gotoBlock(h.bi)}>\n {h.text}\n </button>\n ))\n ) : (\n <div className=\"de-outline-empty\">Headings you add to the document will appear here.</div>\n )}\n </nav>\n )}\n {find.open && (\n <FindBar\n query={find.q}\n index={find.idx}\n count={matches.length}\n editable={isEditing}\n onQuery={(q) => setFind({ open: true, q, idx: 0 })}\n onNav={(d) => matches.length && gotoMatch((find.idx + d + matches.length) % matches.length)}\n onClose={() => setFind({ open: false, q: find.q, idx: 0 })}\n onReplace={(text, all) => {\n if (!matches.length) return\n if (all) [...matches].reverse().forEach((m) => replaceMatch(m, text))\n else replaceMatch(matches[Math.min(find.idx, matches.length - 1)], text)\n }}\n />\n )}\n {isEditing && (\n <DocxToolbar\n editor={editor}\n styles={meta?.styles ?? []}\n onFind={() => setFind((f) => ({ ...f, open: true }))}\n outline={outline}\n onOutline={() => setOutline((o) => !o)}\n painter={painter}\n onLink={askLink}\n image={imageActions}\n />\n )}\n {!isEditing && done && (\n <button type=\"button\" className={outline ? 'de-outline-toggle on' : 'de-outline-toggle'} title=\"Document outline\" onClick={() => setOutline((o) => !o)}>\n ☰\n </button>\n )}\n {ctxMenu && <ContextMenu x={ctxMenu.x} y={ctxMenu.y} items={ctxItems()} onClose={() => setCtxMenu(null)} />}\n {prompt && <PromptDialog spec={prompt} onClose={() => setPrompt(null)} />}\n {toast && <Toast text={toast} onDone={() => setToast(null)} />}\n <ZoomControl zoom={zoom} effective={z} onChange={setZoom} />\n <Status text={status} onStatus={onStatus} />\n </div>\n )\n}\n\ninterface PageViewProps {\n index: number\n count: number\n slice: PageSlice\n blocks: Block[]\n meta: DocxMeta | null\n page: PageSetup\n top: number\n left: number\n height: number\n zoom: number\n client: DocumentClient\n docStyle: CSSProperties\n editing: boolean\n}\n\nfunction PageView({ index, count, slice, blocks, meta, page, top, left, height, zoom, client, docStyle, editing }: PageViewProps) {\n const ctx = useMemo<RenderCtx>(() => ({ client, page: index, pages: count, measuring: false, editable: editing }), [client, index, count, editing])\n const hfCtx = useMemo<RenderCtx>(() => ({ ...ctx, editable: false }), [ctx])\n const first = index === 0 && meta?.titlePg\n const header = first ? meta?.firstHeader : meta?.header\n const footer = first ? meta?.firstFooter : meta?.footer\n const items = []\n for (let i = slice.start; i < slice.end; i++) {\n const b = blocks[i]\n items.push(\n <BlockView\n key={`${i}:${b.t === 'p' ? b.ver ?? 0 : 0}`}\n block={b}\n ctx={ctx}\n pa={editable(b) || b.t === 'tbl' ? String(i) : undefined}\n sp={contextual(b, blocks[i - 1], blocks[i + 1])}\n />,\n )\n }\n return (\n <div className=\"de-page\" style={{ top, left, width: page.w * PX * zoom, height }} data-page={index + 1}>\n <div className=\"de-page-inner de-doc\" style={{ ...docStyle, width: `${page.w}pt`, height: height / zoom, zoom }}>\n {header && (\n <div className=\"de-hf\" contentEditable={editing ? false : undefined} style={{ top: `${page.header}pt`, padding: `0 ${page.mr}pt 0 ${page.ml}pt` }}>\n {header.map((b, i) => (\n <BlockView key={i} block={b} ctx={hfCtx} />\n ))}\n </div>\n )}\n <div style={{ position: 'absolute', top: `${page.mt}pt`, left: `${page.ml}pt`, width: `${page.w - page.ml - page.mr}pt` }}>{items}</div>\n {footer && (\n <div className=\"de-hf\" contentEditable={editing ? false : undefined} style={{ bottom: `${page.footer}pt`, padding: `0 ${page.mr}pt 0 ${page.ml}pt` }}>\n {footer.map((b, i) => (\n <BlockView key={i} block={b} ctx={hfCtx} />\n ))}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { Fragment, useEffect, useRef, useState } from 'react'\nimport type { DocumentClient } from '../../core/worker/client'\n\nconst CORE: [string, string][] = [\n ['title', 'Title'],\n ['subject', 'Subject'],\n ['creator', 'Author'],\n ['keywords', 'Keywords'],\n ['description', 'Comments'],\n ['lastModifiedBy', 'Last modified by'],\n ['created', 'Created'],\n ['modified', 'Modified'],\n]\n\n/** Core properties (docProps/core.xml) that are set. */\nasync function coreProps(client: DocumentClient): Promise<[string, string][]> {\n const xml = await (await client.call('part', 'docProps/core.xml')).text()\n const doc = new DOMParser().parseFromString(xml, 'application/xml')\n const out: [string, string][] = []\n for (const [tag, label] of CORE) {\n const v = doc.getElementsByTagNameNS('*', tag)[0]?.textContent?.trim()\n if (!v) continue\n const date = tag === 'created' || tag === 'modified' ? new Date(v) : null\n out.push([label, date && !isNaN(date.getTime()) ? date.toLocaleString() : v])\n }\n return out\n}\n\nexport function DetailsDialog(props: { client: DocumentClient; file: [string, string][]; stats: [string, string][]; onClose: () => void }) {\n const [core, setCore] = useState<[string, string][]>([])\n const closeRef = useRef<HTMLButtonElement>(null)\n useEffect(() => {\n closeRef.current?.focus()\n let live = true\n coreProps(props.client).then(\n (c) => live && setCore(c),\n () => {},\n )\n return () => {\n live = false\n }\n }, [props.client])\n const groups = [props.file, core, props.stats].filter((g) => g.length)\n return (\n <div\n className=\"de-dialog-back\"\n onMouseDown={(e) => e.target === e.currentTarget && props.onClose()}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.stopPropagation()\n props.onClose()\n }\n }}\n >\n <div className=\"de-dialog\" role=\"dialog\" aria-label=\"Document details\">\n <div className=\"de-dialog-title\">Document details</div>\n <dl className=\"de-details\">\n {groups.map((g, k) => (\n <Fragment key={k}>\n {k > 0 && <div className=\"de-details-sep\" />}\n {g.map(([label, value]) => (\n <Fragment key={label}>\n <dt>{label}</dt>\n <dd>{value}</dd>\n </Fragment>\n ))}\n </Fragment>\n ))}\n </dl>\n <div className=\"de-dialog-btns\">\n <button ref={closeRef} type=\"button\" className=\"de-btn de-btn-primary\" onClick={props.onClose}>\n Close\n </button>\n </div>\n </div>\n </div>\n )\n}\n","/**\n * Builds new Office files from plain formats (File → Open of CSV / text / Markdown / HTML).\n * DOM-free: HTML is turned into paragraphs on the React side (react/docx/html.ts).\n */\nimport { HIGHLIGHT } from './docx/styles'\nimport type { RunSet } from './docx/types'\nimport { escAttr, escText } from './raw'\nimport { writeZip } from './zipwrite'\n\n// kept local: the writers that also define these are worker-side modules\nconst DOCX_MIME = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\nconst XLSX_MIME = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n\nconst XML = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n'\nconst REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'\nconst PKG_REL = 'http://schemas.openxmlformats.org/package/2006/relationships'\nconst CT_RELS = '<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/>'\n\nconst rootRels = (target: string) =>\n `${XML}<Relationships xmlns=\"${PKG_REL}\"><Relationship Id=\"rId1\" Type=\"${REL}/officeDocument\" Target=\"${target}\"/></Relationships>`\n\n// ---------------------------------------------------------------- CSV → XLSX\n\n/** Separator of a delimited text file: tab, semicolon (European CSV) or comma. */\nexport function detectSeparator(text: string): string {\n const line = text.slice(0, 4096).split(/\\r?\\n/, 1)[0]\n const count = (ch: string) => line.split(ch).length - 1\n const tabs = count('\\t')\n const semis = count(';')\n const commas = count(',')\n if (tabs > 0 && tabs >= semis && tabs >= commas) return '\\t'\n return semis > commas ? ';' : ','\n}\n\n/** RFC 4180 parser (quoted fields, escaped quotes, CRLF / LF, newlines inside quotes). */\nexport function parseCsv(text: string, sep = detectSeparator(text)): string[][] {\n const rows: string[][] = []\n let row: string[] = []\n let field = ''\n let quoted = false\n let i = text.charCodeAt(0) === 0xfeff ? 1 : 0\n const n = text.length\n for (; i < n; i++) {\n const ch = text[i]\n if (quoted) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n field += '\"'\n i++\n } else quoted = false\n } else field += ch\n } else if (ch === '\"' && field === '') quoted = true\n else if (ch === sep) {\n row.push(field)\n field = ''\n } else if (ch === '\\n' || ch === '\\r') {\n if (ch === '\\r' && text[i + 1] === '\\n') i++\n row.push(field)\n rows.push(row)\n row = []\n field = ''\n } else field += ch\n }\n if (field !== '' || row.length) {\n row.push(field)\n rows.push(row)\n }\n return rows\n}\n\nfunction colName(c: number): string {\n let s = ''\n for (let n = c + 1; n > 0; n = Math.floor((n - 1) / 26)) s = String.fromCharCode(65 + ((n - 1) % 26)) + s\n return s\n}\n\nconst NUMBER = /^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?$/\n\n/** Value written for a CSV field: numbers (but not codes like \"007\") and booleans keep their type. */\nfunction cellXml(ref: string, v: string, decimalComma: boolean): string {\n if (v === '') return ''\n let t = v.trim()\n if (decimalComma && /^[-+]?\\d*,\\d+$/.test(t)) t = t.replace(',', '.')\n if (NUMBER.test(t) && !/^[-+]?0\\d/.test(t) && t.replace(/\\D/g, '').length <= 15) return `<c r=\"${ref}\"><v>${Number(t)}</v></c>`\n if (/^(true|false)$/i.test(t)) return `<c r=\"${ref}\" t=\"b\"><v>${/^true$/i.test(t) ? 1 : 0}</v></c>`\n return `<c r=\"${ref}\" t=\"inlineStr\"><is><t xml:space=\"preserve\">${escText(v)}</t></is></c>`\n}\n\n/**\n * Builds a one-sheet workbook from rows of text.\n * `decimalComma`: \"12,5\" is a number (semicolon-separated files from comma-decimal locales).\n */\nexport function rowsToXlsx(rows: string[][], sheetName = 'Sheet1', decimalComma = false): Promise<Blob> {\n const widths: number[] = []\n let data = ''\n rows.forEach((row, r) => {\n let cells = ''\n row.forEach((v, c) => {\n cells += cellXml(colName(c) + (r + 1), v, decimalComma)\n const len = Math.max(...v.split('\\n').map((l) => l.length))\n if (len > (widths[c] ?? 0)) widths[c] = len\n })\n if (cells) data += `<row r=\"${r + 1}\">${cells}</row>`\n })\n let cols = ''\n widths.forEach((len, c) => {\n if (len > 9) cols += `<col min=\"${c + 1}\" max=\"${c + 1}\" width=\"${Math.min(60, len + 2)}\" customWidth=\"1\"/>`\n })\n const name = sheetName.replace(/[\\\\/?*[\\]:]/g, ' ').slice(0, 31).trim() || 'Sheet1'\n const SS = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'\n const parts = new Map<string, string>([\n [\n '[Content_Types].xml',\n `${XML}<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">${CT_RELS}` +\n '<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>' +\n '<Override PartName=\"/xl/worksheets/sheet1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>' +\n '<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/></Types>',\n ],\n ['_rels/.rels', rootRels('xl/workbook.xml')],\n [\n 'xl/workbook.xml',\n `${XML}<workbook xmlns=\"${SS}\" xmlns:r=\"${REL}\"><bookViews><workbookView/></bookViews><sheets><sheet name=\"${escAttr(name)}\" sheetId=\"1\" r:id=\"rId1\"/></sheets></workbook>`,\n ],\n [\n 'xl/_rels/workbook.xml.rels',\n `${XML}<Relationships xmlns=\"${PKG_REL}\"><Relationship Id=\"rId1\" Type=\"${REL}/worksheet\" Target=\"worksheets/sheet1.xml\"/><Relationship Id=\"rId2\" Type=\"${REL}/styles\" Target=\"styles.xml\"/></Relationships>`,\n ],\n [\n 'xl/styles.xml',\n `${XML}<styleSheet xmlns=\"${SS}\"><fonts count=\"1\"><font><sz val=\"11\"/><name val=\"Calibri\"/><family val=\"2\"/></font></fonts>` +\n '<fills count=\"2\"><fill><patternFill patternType=\"none\"/></fill><fill><patternFill patternType=\"gray125\"/></fill></fills>' +\n '<borders count=\"1\"><border><left/><right/><top/><bottom/><diagonal/></border></borders>' +\n '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>' +\n '<cellXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/></cellXfs>' +\n '<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles></styleSheet>',\n ],\n [\n 'xl/worksheets/sheet1.xml',\n `${XML}<worksheet xmlns=\"${SS}\" xmlns:r=\"${REL}\"><sheetViews><sheetView workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>` +\n `${cols ? `<cols>${cols}</cols>` : ''}<sheetData>${data}</sheetData></worksheet>`,\n ],\n ])\n return writeZip(parts, XLSX_MIME)\n}\n\n// ---------------------------------------------------------------- text / Markdown → DOCX\n\nexport interface ImportRun {\n text: string\n set?: RunSet\n href?: string\n}\n\nexport interface ImportPara {\n runs: ImportRun[]\n /** heading level 1-6 */\n heading?: number\n list?: 'bullet' | 'number'\n}\n\n/** One paragraph per line. */\nexport function textToParas(text: string): ImportPara[] {\n return text\n .replace(/^/, '')\n .split(/\\r\\n|\\r|\\n/)\n .map((line) => ({ runs: line ? [{ text: line }] : [] }))\n}\n\nconst escHtml = (s: string) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n\n/** inline Markdown: code, links, bold, italic, strikethrough (input already HTML-escaped) */\nfunction mdInline(s: string): string {\n const code: string[] = []\n s = s.replace(/`([^`]+)`/g, (_, c: string) => `\\u0000${code.push(c) - 1}\\u0000`)\n s = s\n .replace(/!\\[([^\\]]*)\\]\\(([^)\\s]+)[^)]*\\)/g, '$1')\n .replace(/\\[([^\\]]+)\\]\\(([^)\\s]+)[^)]*\\)/g, (_, t: string, u: string) => (/^\\s*javascript:/i.test(u) ? t : `<a href=\"${u}\">${t}</a>`))\n .replace(/(\\*\\*|__)(?=\\S)(.+?)(?<=\\S)\\1/g, '<b>$2</b>')\n .replace(/(^|[^*\\w])\\*(?=\\S)(.+?)(?<=\\S)\\*(?!\\*)/g, '$1<i>$2</i>')\n .replace(/(^|[^_\\w])_(?=\\S)(.+?)(?<=\\S)_(?!\\w)/g, '$1<i>$2</i>')\n .replace(/~~(?=\\S)(.+?)(?<=\\S)~~/g, '<s>$1</s>')\n return s.replace(/\\u0000(\\d+)\\u0000/g, (_, i: string) => `<code>${code[Number(i)]}</code>`)\n}\n\n/** Small CommonMark subset → HTML: headings, paragraphs, lists, quotes, code blocks, rules, tables. */\nexport function markdownToHtml(md: string): string {\n const lines = md.replace(/^/, '').split(/\\r\\n|\\r|\\n/)\n const out: string[] = []\n let para: string[] = []\n let list: 'ul' | 'ol' | null = null\n const flush = () => {\n if (para.length) out.push(`<p>${mdInline(escHtml(para.join(' ')))}</p>`)\n para = []\n }\n const closeList = () => {\n if (list) out.push(`</${list}>`)\n list = null\n }\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n const fence = /^\\s*(```|~~~)/.exec(line)\n if (fence) {\n flush()\n closeList()\n const body: string[] = []\n while (++i < lines.length && !lines[i].trimStart().startsWith(fence[1])) body.push(lines[i])\n out.push(`<pre><code>${escHtml(body.join('\\n'))}</code></pre>`)\n continue\n }\n if (!line.trim()) {\n flush()\n closeList()\n continue\n }\n const h = /^\\s{0,3}(#{1,6})\\s+(.*?)\\s*#*\\s*$/.exec(line)\n if (h) {\n flush()\n closeList()\n out.push(`<h${h[1].length}>${mdInline(escHtml(h[2]))}</h${h[1].length}>`)\n continue\n }\n if (/^\\s{0,3}([-*_])(\\s*\\1){2,}\\s*$/.test(line)) {\n flush()\n closeList()\n continue\n }\n // table: header row + separator row\n if (line.includes('|') && /^\\s*\\|?\\s*:?-{3,}:?\\s*(\\|\\s*:?-{3,}:?\\s*)*\\|?\\s*$/.test(lines[i + 1] ?? '')) {\n flush()\n closeList()\n const cells = (l: string) => l.trim().replace(/^\\||\\|$/g, '').split('|').map((c) => mdInline(escHtml(c.trim())))\n const rows = [`<tr>${cells(line).map((c) => `<th><b>${c}</b></th>`).join('')}</tr>`]\n i++\n while (i + 1 < lines.length && lines[i + 1].includes('|') && lines[i + 1].trim()) rows.push(`<tr>${cells(lines[++i]).map((c) => `<td>${c}</td>`).join('')}</tr>`)\n out.push(`<table>${rows.join('')}</table>`)\n continue\n }\n const li = /^\\s*(?:([-*+])|(\\d+)[.)])\\s+(.*)$/.exec(line)\n if (li) {\n flush()\n const kind = li[1] ? 'ul' : 'ol'\n if (list !== kind) {\n closeList()\n out.push(`<${kind}>`)\n list = kind\n }\n out.push(`<li>${mdInline(escHtml(li[3].replace(/^\\[[ xX]\\]\\s+/, (m) => (m[1] === ' ' ? '☐ ' : '☑ '))))}</li>`)\n continue\n }\n const q = /^\\s*>\\s?(.*)$/.exec(line)\n if (q) {\n flush()\n closeList()\n out.push(`<blockquote><i>${mdInline(escHtml(q[1]))}</i></blockquote>`)\n continue\n }\n if (list && /^\\s{2,}\\S/.test(line)) {\n // lazy continuation of the previous item\n out[out.length - 1] = out[out.length - 1].replace(/<\\/li>$/, ` ${mdInline(escHtml(line.trim()))}</li>`)\n continue\n }\n closeList()\n para.push(line.trim())\n }\n flush()\n closeList()\n return out.join('\\n')\n}\n\nconst HL_NAME: Record<string, string> = Object.fromEntries(Object.entries(HIGHLIGHT).map(([k, v]) => [v, k]))\n\nfunction rPrXml(set: RunSet | undefined): string {\n if (!set) return ''\n let x = ''\n if (set.font) x += `<w:rFonts w:ascii=\"${escAttr(set.font)}\" w:hAnsi=\"${escAttr(set.font)}\" w:eastAsia=\"${escAttr(set.font)}\" w:cs=\"${escAttr(set.font)}\"/>`\n if (set.b) x += '<w:b/>'\n if (set.i) x += '<w:i/>'\n if (set.strike) x += '<w:strike/>'\n if (set.color) x += `<w:color w:val=\"${set.color.replace('#', '').toUpperCase()}\"/>`\n if (set.sz) x += `<w:sz w:val=\"${Math.round(set.sz * 2)}\"/><w:szCs w:val=\"${Math.round(set.sz * 2)}\"/>`\n const hl = set.hl ? HL_NAME[set.hl.toLowerCase()] : undefined\n if (hl) x += `<w:highlight w:val=\"${hl}\"/>`\n if (set.u && set.u !== 'none') x += `<w:u w:val=\"${set.u}\"/>`\n if (set.hl && !hl) x += `<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${set.hl.replace('#', '').toUpperCase()}\"/>`\n if (set.va) x += `<w:vertAlign w:val=\"${set.va === 'sup' ? 'superscript' : 'subscript'}\"/>`\n return x ? `<w:rPr>${x}</w:rPr>` : ''\n}\n\nfunction runXml(r: ImportRun): string {\n let body = ''\n for (const piece of r.text.split(/(\\t|\\n)/)) {\n if (!piece) continue\n if (piece === '\\t') body += '<w:tab/>'\n else if (piece === '\\n') body += '<w:br/>'\n else body += `<w:t xml:space=\"preserve\">${escText(piece)}</w:t>`\n }\n return body ? `<w:r>${rPrXml(r.set)}${body}</w:r>` : ''\n}\n\nfunction headingStyles(): string {\n const sizes = [20, 16, 14, 12, 11, 11]\n let x = ''\n sizes.forEach((sz, k) => {\n const n = k + 1\n x +=\n `<w:style w:type=\"paragraph\" w:styleId=\"Heading${n}\"><w:name w:val=\"heading ${n}\"/><w:basedOn w:val=\"Normal\"/><w:next w:val=\"Normal\"/><w:uiPriority w:val=\"9\"/><w:qFormat/>` +\n `<w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before=\"${n <= 2 ? 360 : 240}\" w:after=\"${n <= 2 ? 120 : 80}\"/><w:outlineLvl w:val=\"${k}\"/></w:pPr>` +\n `<w:rPr>${n <= 4 ? '<w:b/>' : ''}${n >= 5 ? '<w:i/>' : ''}<w:color w:val=\"${n <= 2 ? '1F3864' : '2F5496'}\"/><w:sz w:val=\"${sz * 2}\"/><w:szCs w:val=\"${sz * 2}\"/></w:rPr></w:style>`\n })\n return x\n}\n\nfunction numberingXml(nums: ('bullet' | 'number')[]): string {\n const W = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'\n const BULLETS = ['•', '◦', '▪']\n const FORMATS = ['decimal', 'lowerLetter', 'lowerRoman']\n const lvls = (kind: 'bullet' | 'number') =>\n Array.from({ length: 9 }, (_, l) => {\n const fmt = kind === 'bullet' ? 'bullet' : FORMATS[l % 3]\n const text = kind === 'bullet' ? BULLETS[l % 3] : `%${l + 1}.`\n const font = kind === 'bullet' ? '<w:rPr><w:rFonts w:ascii=\"Arial\" w:hAnsi=\"Arial\"/></w:rPr>' : ''\n return `<w:lvl w:ilvl=\"${l}\"><w:start w:val=\"1\"/><w:numFmt w:val=\"${fmt}\"/><w:lvlText w:val=\"${text}\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"${720 * (l + 1)}\" w:hanging=\"360\"/></w:pPr>${font}</w:lvl>`\n }).join('')\n let x = `${XML}<w:numbering xmlns:w=\"${W}\">`\n x += `<w:abstractNum w:abstractNumId=\"0\"><w:multiLevelType w:val=\"hybridMultilevel\"/>${lvls('bullet')}</w:abstractNum>`\n x += `<w:abstractNum w:abstractNumId=\"1\"><w:multiLevelType w:val=\"hybridMultilevel\"/>${lvls('number')}</w:abstractNum>`\n // one instance per list, numbered lists restart at 1\n nums.forEach((kind, k) => {\n x += `<w:num w:numId=\"${k + 1}\"><w:abstractNumId w:val=\"${kind === 'bullet' ? 0 : 1}\"/>`\n if (kind === 'number') x += '<w:lvlOverride w:ilvl=\"0\"><w:startOverride w:val=\"1\"/></w:lvlOverride>'\n x += '</w:num>'\n })\n return x + '</w:numbering>'\n}\n\n/** Builds a document (Letter, 1\" margins, Calibri 11) from paragraphs of formatted runs. */\nexport function parasToDocx(paras: ImportPara[]): Promise<Blob> {\n const W = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'\n const links: string[] = []\n const nums: ('bullet' | 'number')[] = []\n let prevList: 'bullet' | 'number' | undefined\n let body = ''\n for (const p of paras) {\n let pPr = ''\n if (p.heading && p.heading >= 1 && p.heading <= 6) pPr += `<w:pStyle w:val=\"Heading${p.heading}\"/>`\n else if (p.list) pPr += '<w:pStyle w:val=\"ListParagraph\"/>'\n if (p.list) {\n if (p.list !== prevList) nums.push(p.list)\n pPr += `<w:numPr><w:ilvl w:val=\"0\"/><w:numId w:val=\"${nums.length}\"/></w:numPr>`\n }\n prevList = p.list\n let runs = ''\n for (let i = 0; i < p.runs.length; ) {\n const href = p.runs[i].href\n if (!href) {\n runs += runXml(p.runs[i++])\n continue\n }\n let inner = ''\n while (i < p.runs.length && p.runs[i].href === href) inner += runXml(p.runs[i++])\n if (/^\\s*javascript:/i.test(href)) runs += inner\n else {\n links.push(href)\n runs += `<w:hyperlink r:id=\"rIdL${links.length}\" w:history=\"1\">${inner}</w:hyperlink>`\n }\n }\n body += `<w:p>${pPr ? `<w:pPr>${pPr}</w:pPr>` : ''}${runs}</w:p>`\n }\n if (!body) body = '<w:p/>'\n const sect = '<w:sectPr><w:pgSz w:w=\"12240\" w:h=\"15840\"/><w:pgMar w:top=\"1440\" w:right=\"1440\" w:bottom=\"1440\" w:left=\"1440\" w:header=\"720\" w:footer=\"720\" w:gutter=\"0\"/></w:sectPr>'\n const styles =\n `${XML}<w:styles xmlns:w=\"${W}\"><w:docDefaults><w:rPrDefault><w:rPr><w:rFonts w:ascii=\"Calibri\" w:hAnsi=\"Calibri\" w:eastAsia=\"Calibri\" w:cs=\"Calibri\"/><w:sz w:val=\"22\"/><w:szCs w:val=\"22\"/><w:lang w:val=\"en-US\"/></w:rPr></w:rPrDefault>` +\n '<w:pPrDefault><w:pPr><w:spacing w:after=\"160\" w:line=\"259\" w:lineRule=\"auto\"/></w:pPr></w:pPrDefault></w:docDefaults>' +\n '<w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\"><w:name w:val=\"Normal\"/><w:qFormat/></w:style>' +\n headingStyles() +\n '<w:style w:type=\"paragraph\" w:styleId=\"ListParagraph\"><w:name w:val=\"List Paragraph\"/><w:basedOn w:val=\"Normal\"/><w:uiPriority w:val=\"34\"/><w:qFormat/><w:pPr><w:spacing w:after=\"40\"/><w:ind w:left=\"720\"/><w:contextualSpacing/></w:pPr></w:style>' +\n '<w:style w:type=\"character\" w:default=\"1\" w:styleId=\"DefaultParagraphFont\"><w:name w:val=\"Default Paragraph Font\"/><w:uiPriority w:val=\"1\"/><w:semiHidden/></w:style>' +\n '</w:styles>'\n const rels =\n `${XML}<Relationships xmlns=\"${PKG_REL}\"><Relationship Id=\"rId1\" Type=\"${REL}/styles\" Target=\"styles.xml\"/><Relationship Id=\"rId2\" Type=\"${REL}/numbering\" Target=\"numbering.xml\"/>` +\n links.map((u, k) => `<Relationship Id=\"rIdL${k + 1}\" Type=\"${REL}/hyperlink\" Target=\"${escAttr(u)}\" TargetMode=\"External\"/>`).join('') +\n '</Relationships>'\n const parts = new Map<string, string>([\n [\n '[Content_Types].xml',\n `${XML}<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">${CT_RELS}` +\n '<Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>' +\n '<Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/>' +\n '<Override PartName=\"/word/numbering.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\"/></Types>',\n ],\n ['_rels/.rels', rootRels('word/document.xml')],\n ['word/_rels/document.xml.rels', rels],\n ['word/document.xml', `${XML}<w:document xmlns:w=\"${W}\" xmlns:r=\"${REL}\"><w:body>${body}${sect}</w:body></w:document>`],\n ['word/styles.xml', styles],\n ['word/numbering.xml', numberingXml(nums)],\n ])\n return writeZip(parts, DOCX_MIME)\n}\n\n// ---------------------------------------------------------------- blank presentation\n\nconst NS_A = 'http://schemas.openxmlformats.org/drawingml/2006/main'\nconst NS_P = 'http://schemas.openxmlformats.org/presentationml/2006/main'\nconst PNS = `xmlns:a=\"${NS_A}\" xmlns:r=\"${REL}\" xmlns:p=\"${NS_P}\"`\nconst GRP = '<p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr>'\n\n/** placeholder shape; `xfrm` [x, y, w, h] in EMU (omitted: inherited), `body` extra txBody content */\nfunction ph(id: number, name: string, type: string | null, idx: number | null, xfrm?: number[], body = '<a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang=\"en-US\"/></a:p>'): string {\n const attrs = (type ? ` type=\"${type}\"` : '') + (idx !== null ? ` idx=\"${idx}\"` : '')\n const sp = xfrm ? `<p:spPr><a:xfrm><a:off x=\"${xfrm[0]}\" y=\"${xfrm[1]}\"/><a:ext cx=\"${xfrm[2]}\" cy=\"${xfrm[3]}\"/></a:xfrm></p:spPr>` : '<p:spPr/>'\n return `<p:sp><p:nvSpPr><p:cNvPr id=\"${id}\" name=\"${name}\"/><p:cNvSpPr><a:spLocks noGrp=\"1\"/></p:cNvSpPr><p:nvPr><p:ph${attrs}/></p:nvPr></p:nvSpPr>${sp}<p:txBody>${body}</p:txBody></p:sp>`\n}\n\nconst THEME =\n `${XML}<a:theme xmlns:a=\"${NS_A}\" name=\"Office Theme\"><a:themeElements><a:clrScheme name=\"Office\">` +\n '<a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1><a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1>' +\n '<a:dk2><a:srgbClr val=\"44546A\"/></a:dk2><a:lt2><a:srgbClr val=\"E7E6E6\"/></a:lt2><a:accent1><a:srgbClr val=\"4472C4\"/></a:accent1>' +\n '<a:accent2><a:srgbClr val=\"ED7D31\"/></a:accent2><a:accent3><a:srgbClr val=\"A5A5A5\"/></a:accent3><a:accent4><a:srgbClr val=\"FFC000\"/></a:accent4>' +\n '<a:accent5><a:srgbClr val=\"5B9BD5\"/></a:accent5><a:accent6><a:srgbClr val=\"70AD47\"/></a:accent6><a:hlink><a:srgbClr val=\"0563C1\"/></a:hlink>' +\n '<a:folHlink><a:srgbClr val=\"954F72\"/></a:folHlink></a:clrScheme><a:fontScheme name=\"Office\">' +\n '<a:majorFont><a:latin typeface=\"Calibri Light\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:majorFont>' +\n '<a:minorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:minorFont></a:fontScheme>' +\n '<a:fmtScheme name=\"Office\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"><a:tint val=\"60000\"/></a:schemeClr></a:solidFill>' +\n '<a:solidFill><a:schemeClr val=\"phClr\"><a:shade val=\"80000\"/></a:schemeClr></a:solidFill></a:fillStyleLst>' +\n '<a:lnStyleLst><a:ln w=\"6350\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:ln><a:ln w=\"12700\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:ln>' +\n '<a:ln w=\"19050\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:ln></a:lnStyleLst>' +\n '<a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle></a:effectStyleLst>' +\n '<a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"><a:tint val=\"95000\"/></a:schemeClr></a:solidFill>' +\n '<a:solidFill><a:schemeClr val=\"phClr\"><a:shade val=\"90000\"/></a:schemeClr></a:solidFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements></a:theme>'\n\nconst lvl = (n: number, sz: number, bullet: boolean) =>\n `<a:lvl${n}pPr marL=\"${bullet ? 228600 + (n - 1) * 457200 : 0}\" indent=\"${bullet ? -228600 : 0}\" algn=\"l\">` +\n (bullet ? '<a:buFont typeface=\"Arial\"/><a:buChar char=\"•\"/>' : '<a:buNone/>') +\n `<a:defRPr sz=\"${sz}\" kern=\"1200\"><a:solidFill><a:schemeClr val=\"tx1\"/></a:solidFill><a:latin typeface=\"+mn-lt\"/></a:defRPr></a:lvl${n}pPr>`\n\n/** One empty title slide, 16:9, Office theme; layouts: title, title and content, blank. */\nexport function blankPptx(): Promise<Blob> {\n const W = 12192000\n const H = 6858000\n const master =\n `${XML}<p:sldMaster ${PNS}><p:cSld><p:bg><p:bgRef idx=\"1001\"><a:schemeClr val=\"bg1\"/></p:bgRef></p:bg><p:spTree>${GRP}` +\n ph(2, 'Title Placeholder 1', 'title', null, [838200, 365125, 10515600, 1325563], '<a:bodyPr anchor=\"ctr\"/><a:lstStyle/><a:p><a:endParaRPr lang=\"en-US\"/></a:p>') +\n ph(3, 'Text Placeholder 2', 'body', 1, [838200, 1825625, 10515600, 4351338]) +\n '</p:spTree></p:cSld><p:clrMap bg1=\"lt1\" tx1=\"dk1\" bg2=\"lt2\" tx2=\"dk2\" accent1=\"accent1\" accent2=\"accent2\" accent3=\"accent3\" accent4=\"accent4\" accent5=\"accent5\" accent6=\"accent6\" hlink=\"hlink\" folHlink=\"folHlink\"/>' +\n '<p:sldLayoutIdLst><p:sldLayoutId id=\"2147483649\" r:id=\"rId1\"/><p:sldLayoutId id=\"2147483650\" r:id=\"rId2\"/><p:sldLayoutId id=\"2147483651\" r:id=\"rId3\"/></p:sldLayoutIdLst>' +\n '<p:txStyles><p:titleStyle><a:lvl1pPr algn=\"l\"><a:buNone/><a:defRPr sz=\"4400\" kern=\"1200\"><a:solidFill><a:schemeClr val=\"tx1\"/></a:solidFill><a:latin typeface=\"+mj-lt\"/></a:defRPr></a:lvl1pPr></p:titleStyle>' +\n `<p:bodyStyle>${lvl(1, 2800, true)}${lvl(2, 2400, true)}${lvl(3, 2000, true)}${lvl(4, 1800, true)}${lvl(5, 1800, true)}</p:bodyStyle>` +\n `<p:otherStyle>${lvl(1, 1800, false)}</p:otherStyle></p:txStyles></p:sldMaster>`\n const layout = (type: string, name: string, shapes: string) =>\n `${XML}<p:sldLayout ${PNS} type=\"${type}\" preserve=\"1\"><p:cSld name=\"${name}\"><p:spTree>${GRP}${shapes}</p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>`\n const center = (sz: number, anchor: string) => `<a:bodyPr anchor=\"${anchor}\"/><a:lstStyle><a:lvl1pPr algn=\"ctr\"><a:buNone/><a:defRPr sz=\"${sz}\"/></a:lvl1pPr></a:lstStyle><a:p><a:endParaRPr lang=\"en-US\"/></a:p>`\n const titleLayout = layout(\n 'title',\n 'Title Slide',\n ph(2, 'Title 1', 'ctrTitle', null, [1524000, 1122363, 9144000, 2387600], center(6000, 'b')) + ph(3, 'Subtitle 2', 'subTitle', 1, [1524000, 3602038, 9144000, 1655762], center(2400, 't')),\n )\n const slide =\n `${XML}<p:sld ${PNS}><p:cSld><p:spTree>${GRP}` +\n ph(2, 'Title 1', 'ctrTitle', null) +\n ph(3, 'Subtitle 2', 'subTitle', 1) +\n '</p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld>'\n const rel = (id: number, type: string, target: string) => `<Relationship Id=\"rId${id}\" Type=\"${REL}/${type}\" Target=\"${target}\"/>`\n const rels = (...r: string[]) => `${XML}<Relationships xmlns=\"${PKG_REL}\">${r.join('')}</Relationships>`\n const PML = 'application/vnd.openxmlformats-officedocument.presentationml'\n const parts = new Map<string, string>([\n [\n '[Content_Types].xml',\n `${XML}<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">${CT_RELS}` +\n `<Override PartName=\"/ppt/presentation.xml\" ContentType=\"${PML}.presentation.main+xml\"/>` +\n `<Override PartName=\"/ppt/slideMasters/slideMaster1.xml\" ContentType=\"${PML}.slideMaster+xml\"/>` +\n [1, 2, 3].map((n) => `<Override PartName=\"/ppt/slideLayouts/slideLayout${n}.xml\" ContentType=\"${PML}.slideLayout+xml\"/>`).join('') +\n `<Override PartName=\"/ppt/slides/slide1.xml\" ContentType=\"${PML}.slide+xml\"/>` +\n '<Override PartName=\"/ppt/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/></Types>',\n ],\n ['_rels/.rels', rootRels('ppt/presentation.xml')],\n [\n 'ppt/presentation.xml',\n `${XML}<p:presentation ${PNS} saveSubsetFonts=\"1\"><p:sldMasterIdLst><p:sldMasterId id=\"2147483648\" r:id=\"rId1\"/></p:sldMasterIdLst>` +\n `<p:sldIdLst><p:sldId id=\"256\" r:id=\"rId2\"/></p:sldIdLst><p:sldSz cx=\"${W}\" cy=\"${H}\"/><p:notesSz cx=\"6858000\" cy=\"9144000\"/></p:presentation>`,\n ],\n ['ppt/_rels/presentation.xml.rels', rels(rel(1, 'slideMaster', 'slideMasters/slideMaster1.xml'), rel(2, 'slide', 'slides/slide1.xml'), rel(3, 'theme', 'theme/theme1.xml'))],\n ['ppt/slideMasters/slideMaster1.xml', master],\n [\n 'ppt/slideMasters/_rels/slideMaster1.xml.rels',\n rels(rel(1, 'slideLayout', '../slideLayouts/slideLayout1.xml'), rel(2, 'slideLayout', '../slideLayouts/slideLayout2.xml'), rel(3, 'slideLayout', '../slideLayouts/slideLayout3.xml'), rel(4, 'theme', '../theme/theme1.xml')),\n ],\n ['ppt/slideLayouts/slideLayout1.xml', titleLayout],\n ['ppt/slideLayouts/slideLayout2.xml', layout('obj', 'Title and Content', ph(2, 'Title 1', 'title', null) + ph(3, 'Content Placeholder 2', null, 1))],\n ['ppt/slideLayouts/slideLayout3.xml', layout('blank', 'Blank', '')],\n ...[1, 2, 3].map((n) => [`ppt/slideLayouts/_rels/slideLayout${n}.xml.rels`, rels(rel(1, 'slideMaster', '../slideMasters/slideMaster1.xml'))] as [string, string]),\n ['ppt/slides/slide1.xml', slide],\n ['ppt/slides/_rels/slide1.xml.rels', rels(rel(1, 'slideLayout', '../slideLayouts/slideLayout1.xml'))],\n ['ppt/theme/theme1.xml', THEME],\n ])\n return writeZip(parts, 'application/vnd.openxmlformats-officedocument.presentationml.presentation')\n}\n","import { detectSeparator, markdownToHtml, parasToDocx, parseCsv, rowsToXlsx, textToParas, type ImportPara } from '../../core/convert'\nimport { htmlToParas } from '../docx/html'\n\nconst OFFICE = new Set(['docx', 'dotx', 'xlsx', 'xltx', 'pptx', 'potx'])\nconst TABLE = new Set(['csv', 'tsv', 'tab'])\nconst TEXT = new Set(['txt', 'text', 'log'])\nconst MARKDOWN = new Set(['md', 'markdown'])\nconst HTML = new Set(['html', 'htm', 'xhtml'])\n\n/** `accept` of the File → Open picker */\nexport const OPEN_ACCEPT = [...OFFICE, ...TABLE, ...TEXT, ...MARKDOWN, ...HTML].map((e) => '.' + e).join(',')\n\nexport interface Imported {\n src: Blob\n name: string\n /** built from another format: not saved as an Office file yet */\n converted: boolean\n}\n\nconst fromHtml = (html: string): ImportPara[] =>\n htmlToParas(html).map((p) => ({\n heading: p.heading,\n list: p.list,\n runs: p.runs.flatMap((r) => (r.t === 'text' ? [{ text: r.text, set: r.d, href: r.href }] : [])),\n }))\n\n/** Office files open as they are; CSV / TSV become a workbook, text / Markdown / HTML a document. */\nexport async function importFile(file: File): Promise<Imported> {\n const ext = /\\.([^./\\\\]+)$/.exec(file.name)?.[1].toLowerCase() ?? ''\n const base = file.name.replace(/\\.[^./\\\\]+$/, '') || 'document'\n if (OFFICE.has(ext)) return { src: file, name: file.name, converted: false }\n if (TABLE.has(ext)) {\n const text = await file.text()\n const sep = ext === 'csv' ? detectSeparator(text) : '\\t'\n return { src: await rowsToXlsx(parseCsv(text, sep), base, sep === ';'), name: `${base}.xlsx`, converted: true }\n }\n let paras: ImportPara[] | undefined\n if (TEXT.has(ext)) paras = textToParas(await file.text())\n else if (MARKDOWN.has(ext)) paras = fromHtml(markdownToHtml(await file.text()))\n else if (HTML.has(ext)) paras = fromHtml(await file.text())\n if (paras) return { src: await parasToDocx(paras), name: `${base}.docx`, converted: true }\n // no / unknown extension: an Office package is a ZIP\n const sig = new Uint8Array(await file.slice(0, 4).arrayBuffer())\n if (sig[0] === 0x50 && sig[1] === 0x4b) return { src: file, name: file.name, converted: false }\n throw new Error(`Cannot open “${file.name}”: supported files are Word, Excel, PowerPoint, CSV, text, Markdown and HTML`)\n}\n",".de-root {\n --de-bg: #e9ebee;\n --de-chrome: #ffffff;\n --de-border: #dadde1;\n --de-text: #1d2127;\n --de-muted: #69707a;\n --de-accent: #1a73e8;\n --de-accent-soft: rgba(26, 115, 232, 0.12);\n --de-grid: #e2e4e7;\n --de-head: #f6f7f8;\n --de-shadow: 0 1px 2px rgba(15, 23, 42, 0.1), 0 2px 8px rgba(15, 23, 42, 0.06);\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 200px;\n overflow: hidden;\n background: var(--de-bg);\n color: var(--de-text);\n font: 13px/1.4 system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n text-align: left;\n isolation: isolate;\n}\n.de-root *,\n.de-root *::before,\n.de-root *::after {\n box-sizing: border-box;\n}\n.de-root img {\n max-width: none;\n}\n\n/* ---------------------------------------------------------------- chrome */\n.de-bar {\n display: flex;\n align-items: center;\n gap: 10px;\n min-height: 40px;\n padding: 6px 12px;\n background: var(--de-chrome);\n border-bottom: 1px solid var(--de-border);\n flex: none;\n position: relative;\n /* above the editor bar (20): File menu popup */\n z-index: 21;\n}\n.de-badge {\n flex: none;\n font: 600 10px/1 system-ui, sans-serif;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n padding: 4px 6px;\n border-radius: 4px;\n color: #fff;\n}\n.de-badge-docx { background: #2b579a; }\n.de-badge-xlsx { background: #217346; }\n.de-badge-pptx { background: #c43e1c; }\n.de-title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 600;\n}\n.de-status {\n flex: none;\n color: var(--de-muted);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n.de-progress {\n position: absolute;\n left: 0;\n bottom: -1px;\n height: 2px;\n background: var(--de-accent);\n transition: width 0.2s ease, opacity 0.4s ease;\n}\n.de-body {\n position: relative;\n flex: 1;\n min-height: 0;\n display: flex;\n}\n.de-scroll {\n position: relative;\n flex: 1;\n min-width: 0;\n overflow: auto;\n overscroll-behavior: contain;\n}\n.de-center {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n gap: 12px;\n color: var(--de-muted);\n padding: 24px;\n text-align: center;\n}\n.de-spinner {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n border: 3px solid var(--de-accent-soft);\n border-top-color: var(--de-accent);\n animation: de-spin 0.8s linear infinite;\n}\n@keyframes de-spin { to { transform: rotate(360deg); } }\n.de-error {\n max-width: 460px;\n color: #b42318;\n background: #fff;\n border: 1px solid #f3c2bd;\n border-radius: 8px;\n padding: 14px 18px;\n box-shadow: var(--de-shadow);\n}\n.de-zoom {\n position: absolute;\n right: 16px;\n bottom: 16px;\n z-index: 4;\n display: flex;\n align-items: center;\n background: var(--de-chrome);\n border: 1px solid var(--de-border);\n border-radius: 8px;\n box-shadow: var(--de-shadow);\n overflow: hidden;\n}\n.de-zoom button,\n.de-tab,\n.de-btn {\n appearance: none;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: pointer;\n}\n.de-zoom button {\n width: 32px;\n height: 30px;\n font-size: 16px;\n line-height: 1;\n}\n.de-zoom button:hover,\n.de-btn:hover { background: var(--de-accent-soft); }\n.de-zoom span {\n min-width: 52px;\n text-align: center;\n font-variant-numeric: tabular-nums;\n font-size: 12px;\n cursor: pointer;\n}\n.de-btn {\n padding: 4px 8px;\n border-radius: 6px;\n}\n\n/* ---------------------------------------------------------------- docx */\n.de-pages { position: relative; }\n.de-page {\n position: absolute;\n background: #fff;\n box-shadow: var(--de-shadow);\n overflow: hidden;\n}\n.de-page-inner {\n position: relative;\n transform-origin: 0 0;\n}\n.de-page-skeleton {\n position: absolute;\n background: #fff;\n box-shadow: var(--de-shadow);\n opacity: 0.6;\n}\n.de-page-skeleton::after {\n content: '';\n position: absolute;\n inset: 12% 12%;\n background: repeating-linear-gradient(#eef0f2 0 10px, transparent 10px 24px);\n animation: de-pulse 1.4s ease-in-out infinite;\n}\n@keyframes de-pulse { 50% { opacity: 0.45; } }\n.de-doc {\n color: #000;\n font-kerning: normal;\n text-rendering: optimizeLegibility;\n}\n.de-doc a { color: inherit; text-decoration: inherit; }\n.de-hf {\n position: absolute;\n left: 0;\n right: 0;\n}\n.de-measure {\n position: absolute;\n left: -100000px;\n top: 0;\n visibility: hidden;\n pointer-events: none;\n contain: layout style;\n}\n.de-p {\n margin: 0;\n white-space: pre-wrap;\n overflow-wrap: break-word;\n tab-size: 36pt;\n -moz-tab-size: 36pt;\n}\n.de-p > span { white-space: inherit; }\n.de-marker { display: inline-block; text-indent: 0; white-space: pre; }\n.de-tbl {\n border-collapse: collapse;\n table-layout: fixed;\n}\n.de-tbl td {\n vertical-align: top;\n overflow-wrap: break-word;\n text-indent: 0;\n padding: 0;\n}\n.de-img-missing,\n.de-ph {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 1px dashed #b8bec6;\n background: repeating-linear-gradient(45deg, #f6f7f9 0 8px, #eff1f4 8px 16px);\n color: #6a737d;\n font: 12px/1.2 system-ui, sans-serif;\n text-indent: 0;\n vertical-align: bottom;\n overflow: hidden;\n}\n.de-tbox {\n display: inline-block;\n vertical-align: top;\n text-indent: 0;\n padding: 3.6pt 7.2pt;\n overflow: hidden;\n}\n\n/* ---------------------------------------------------------------- xlsx */\n.de-xlsx {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n.de-fx {\n display: flex;\n align-items: stretch;\n height: 30px;\n flex: none;\n background: var(--de-chrome);\n border-bottom: 1px solid var(--de-border);\n font: 12px/30px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n}\n.de-fx-ref {\n width: 88px;\n flex: none;\n padding: 0 10px;\n border-right: 1px solid var(--de-border);\n color: var(--de-muted);\n}\n.de-fx-val {\n flex: 1;\n min-width: 0;\n padding: 0 10px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.de-grid {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow: auto;\n background: #fff;\n outline: none;\n}\n.de-grid-view {\n position: sticky;\n top: 0;\n left: 0;\n overflow: hidden;\n z-index: 1;\n}\n.de-region {\n position: absolute;\n overflow: hidden;\n}\n.de-gl-h,\n.de-gl-v {\n position: absolute;\n background: var(--de-grid);\n}\n.de-gl-h { height: 1px; left: 0; right: 0; }\n.de-gl-v { width: 1px; top: 0; bottom: 0; }\n.de-cell {\n position: absolute;\n display: flex;\n align-items: flex-end;\n padding: 0 3px 1px;\n overflow: hidden;\n white-space: pre;\n line-height: 1.2;\n}\n.de-cell > span { min-width: 0; }\n.de-cell.de-ov { overflow: visible; }\n.de-head-c,\n.de-head-r {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--de-head);\n color: #5f6368;\n font: 11px/1 system-ui, sans-serif;\n font-variant-numeric: tabular-nums;\n border-right: 1px solid #d3d6da;\n border-bottom: 1px solid #d3d6da;\n user-select: none;\n}\n.de-head-on { background: #d3e3fd; color: #0b57d0; font-weight: 600; }\n.de-corner {\n position: absolute;\n left: 0;\n top: 0;\n background: var(--de-head);\n border-right: 1px solid #c4c7cc;\n border-bottom: 1px solid #c4c7cc;\n z-index: 2;\n}\n.de-freeze-h,\n.de-freeze-v {\n position: absolute;\n background: #b9bdc3;\n z-index: 2;\n}\n.de-sel {\n position: absolute;\n border: 2px solid var(--de-accent);\n pointer-events: none;\n z-index: 3;\n}\n.de-tabs {\n display: flex;\n align-items: stretch;\n gap: 2px;\n height: 34px;\n flex: none;\n padding: 0 8px;\n background: var(--de-head);\n border-top: 1px solid var(--de-border);\n overflow-x: auto;\n scrollbar-width: thin;\n}\n.de-tab {\n flex: none;\n padding: 0 14px;\n color: var(--de-muted);\n border-radius: 0 0 6px 6px;\n white-space: nowrap;\n}\n.de-tab:hover { background: #eceef1; }\n.de-tab[aria-selected='true'] {\n background: #fff;\n color: #188038;\n font-weight: 600;\n box-shadow: inset 0 2px 0 #188038;\n}\n\n/* ---------------------------------------------------------------- pptx */\n.de-thumbs {\n width: 188px;\n flex: none;\n overflow-y: auto;\n border-right: 1px solid var(--de-border);\n background: var(--de-chrome);\n position: relative;\n}\n.de-thumb {\n position: absolute;\n left: 0;\n right: 0;\n display: flex;\n gap: 6px;\n padding: 0 10px 0 6px;\n cursor: pointer;\n}\n.de-thumb-n {\n width: 18px;\n flex: none;\n text-align: right;\n color: var(--de-muted);\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n}\n.de-thumb .de-slide { outline: 1px solid var(--de-border); }\n.de-thumb[aria-current='true'] .de-slide { outline: 2px solid var(--de-accent); }\n.de-slide {\n position: relative;\n overflow: hidden;\n background: #fff;\n}\n.de-slide-frame {\n position: absolute;\n box-shadow: var(--de-shadow);\n}\n.de-slide-inner {\n position: absolute;\n left: 0;\n top: 0;\n transform-origin: 0 0;\n overflow: hidden;\n color: #000;\n}\n.de-el { position: absolute; }\n.de-txt {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n}\n.de-txt > div {\n white-space: pre-wrap;\n overflow-wrap: break-word;\n}\n.de-txt.de-nowrap > div { white-space: pre; }\n/* empty placeholders while editing (new slides, blank presentations) */\n.de-slide-editable .de-el > .de-txt:empty { outline: 1.5px dashed rgba(60, 64, 67, 0.4); outline-offset: -1px; }\n.de-slide-editable .de-el > .de-txt:empty::after {\n content: 'Click to add text';\n color: #80868b;\n font: 28px/1.2 system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif;\n text-align: center;\n pointer-events: none;\n}\n.de-bul { display: inline-block; text-indent: 0; white-space: pre; }\n.de-stbl {\n border-collapse: collapse;\n table-layout: fixed;\n width: 100%;\n}\n.de-stbl td {\n position: relative;\n padding: 0;\n vertical-align: top;\n}\n.de-hidden-slide { opacity: 0.55; }\n\n/* ---------------------------------------------------------------- editing */\n.de-mode {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 28px;\n padding: 0 10px;\n border: 1px solid var(--de-border);\n border-radius: 6px;\n background: var(--de-chrome);\n color: inherit;\n font: inherit;\n font-weight: 500;\n cursor: pointer;\n flex: none;\n}\n.de-mode:hover { background: var(--de-accent-soft); }\n.de-mode-on { border-color: var(--de-accent); color: var(--de-accent); }\n.de-save-dirty { background: var(--de-accent); border-color: var(--de-accent); color: #fff; }\n.de-save-dirty:hover { background: #1765cc; }\n.de-mode:disabled { opacity: 0.6; cursor: default; }\n.de-ebar-host {\n flex: none;\n padding: 6px 10px;\n background: var(--de-chrome);\n border-bottom: 1px solid var(--de-border);\n position: relative;\n z-index: 20;\n}\n.de-ebar {\n --de-tb-ink: #444746;\n --de-tb-hover: rgba(68, 71, 70, 0.08);\n --de-tb-on: #d3e3fd;\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n gap: 2px;\n min-width: 0;\n height: 40px;\n padding: 0 8px;\n background: #eef2f9;\n border-radius: 20px;\n color: var(--de-tb-ink);\n}\n.de-ebar-it { display: inline-flex; align-items: center; flex: none; }\n.de-ebar-morewrap { margin-left: auto; }\n.de-tb-pop.de-ebar-more {\n left: auto;\n right: 0;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 2px;\n width: max-content;\n max-width: min(360px, 90vw);\n padding: 6px;\n background: #eef2f9;\n}\n.de-tb {\n appearance: none;\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: var(--de-tb-ink, #444746);\n font: 600 14px/1 system-ui, sans-serif;\n cursor: pointer;\n transition: background-color 0.1s;\n}\n.de-tb:hover:not(:disabled) { background: var(--de-tb-hover, rgba(68, 71, 70, 0.08)); }\n.de-tb:focus-visible, .de-dd:focus-visible { outline: 2px solid var(--de-accent); outline-offset: -2px; }\n.de-tb-on { background: var(--de-tb-on, #d3e3fd) !important; color: #041e49; }\n.de-tb:disabled { opacity: 0.38; cursor: default; }\n.de-tb-chev { width: auto; padding: 0 2px 0 4px; gap: 0; }\n.de-tb-sep { width: 1px; height: 20px; margin: 0 5px; background: #c7c7c7; flex: none; }\n.de-tb-color { position: relative; display: inline-flex; }\n.de-tb-swatch {\n position: absolute;\n left: 6px;\n right: 6px;\n bottom: 3px;\n height: 3px;\n border-radius: 1px;\n box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.12);\n}\n.de-tb-pop {\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n z-index: 30;\n padding: 10px;\n background: #fff;\n border-radius: 8px;\n box-shadow: 0 2px 6px 2px rgba(60, 64, 67, 0.15), 0 1px 2px rgba(60, 64, 67, 0.3);\n}\n.de-tb-none {\n width: 100%;\n margin-bottom: 8px;\n padding: 5px;\n border: 1px solid var(--de-border);\n border-radius: 4px;\n background: #fff;\n font: inherit;\n cursor: pointer;\n}\n.de-tb-none:hover { background: #f1f3f4; }\n/* dropdown */\n.de-dd-wrap { position: relative; display: inline-flex; }\n.de-dd {\n appearance: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n height: 28px;\n padding: 0 2px 0 6px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: #1f1f1f;\n font: 13px/1 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n cursor: pointer;\n transition: background-color 0.1s;\n}\n.de-dd:hover:not(:disabled), .de-dd-open { background: var(--de-tb-hover, rgba(68, 71, 70, 0.08)); }\n.de-dd:disabled { opacity: 0.38; cursor: default; }\n.de-dd > svg { flex: none; color: var(--de-tb-ink, #444746); }\n.de-dd-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: left; }\n.de-dd-ph { color: var(--de-muted); }\n.de-dd-pop {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 40;\n min-width: 100%;\n max-height: min(380px, 60vh);\n overflow-y: auto;\n padding: 6px 0;\n background: #fff;\n border-radius: 8px;\n box-shadow: 0 2px 6px 2px rgba(60, 64, 67, 0.15), 0 1px 2px rgba(60, 64, 67, 0.3);\n color: #1f1f1f;\n font: 13px/1.3 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n}\n.de-dd-opt {\n display: flex;\n align-items: center;\n gap: 8px;\n min-height: 32px;\n padding: 4px 16px 4px 10px;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n}\n.de-dd-opt > svg { flex: none; color: #444746; }\n.de-dd-hi { background: #f1f3f4; }\n.de-dd-dis { opacity: 0.4; cursor: default; }\n.de-dd-check { display: inline-flex; width: 16px; flex: none; color: #0b57d0; }\n.de-dd-text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }\n.de-dd-hint { margin-left: auto; padding-left: 28px; color: var(--de-muted); font-size: 12px; font-variant-numeric: tabular-nums; }\n.de-dd-sep { height: 1px; margin: 6px 0; background: #e3e3e3; }\n.de-dd-head {\n padding: 6px 16px 2px 10px;\n color: var(--de-muted);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n user-select: none;\n}\n.de-dd.de-file { flex: none; padding: 0 4px 0 8px; font-weight: 500; }\n.de-dd.de-file + .de-dd-pop { max-height: 720px; }\n/* font size box */\n.de-size { position: relative; display: inline-flex; align-items: center; gap: 1px; }\n.de-size-step { width: 24px; }\n.de-size-input {\n width: 38px;\n height: 26px;\n padding: 0;\n border: 1px solid #747775;\n border-radius: 4px;\n background: transparent;\n color: #1f1f1f;\n font: 13px/1 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n text-align: center;\n outline: none;\n}\n.de-size-input:focus { border-color: var(--de-accent); box-shadow: inset 0 0 0 1px var(--de-accent); background: #fff; }\n.de-size-input:disabled { opacity: 0.38; }\n.de-size-pop { left: 25px; min-width: 40px; width: 40px; padding: 4px 0; }\n.de-size-pop .de-dd-opt { justify-content: center; min-height: 28px; padding: 0; }\n/* border picker */\n.de-borders { display: grid; grid-template-columns: repeat(4, 30px); gap: 4px; }\n.de-borders .de-tb { width: 30px; height: 30px; }\n.de-tb-grid { display: grid; grid-template-columns: repeat(8, 18px); gap: 4px; }\n.de-tb-grid button {\n width: 18px;\n height: 18px;\n padding: 0;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 50%;\n cursor: pointer;\n}\n.de-tb-grid button:hover { transform: scale(1.15); }\n.de-tb-grid button.on { box-shadow: 0 0 0 2px #fff, 0 0 0 3.5px var(--de-accent); }\n.de-tb-custom {\n margin: 10px 0 6px;\n color: var(--de-muted);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n}\n.de-tb-grid button.de-tb-add {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: #fff;\n border: 1px dashed #80868b;\n color: #444746;\n}\n.de-tb-native {\n position: absolute;\n left: 0;\n bottom: 0;\n width: 1px;\n height: 1px;\n padding: 0;\n border: 0;\n opacity: 0;\n pointer-events: none;\n}\n.de-editing { outline: none; caret-color: #000; }\n.de-editing .de-page-inner { cursor: text; }\n.de-editing [contenteditable='false'] { cursor: default; }\n.de-find {\n position: absolute;\n top: 10px;\n right: 18px;\n z-index: 6;\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 6px;\n background: #fff;\n border: 1px solid var(--de-border);\n border-radius: 8px;\n box-shadow: var(--de-shadow);\n}\n.de-find-row { display: flex; align-items: center; gap: 2px; }\n.de-find input {\n width: 200px;\n height: 28px;\n padding: 0 8px;\n border: 1px solid var(--de-border);\n border-radius: 6px;\n font: inherit;\n outline: none;\n}\n.de-find input:focus { border-color: var(--de-accent); }\n.de-find-count { min-width: 56px; text-align: center; color: var(--de-muted); font-size: 12px; font-variant-numeric: tabular-nums; }\n::highlight(de-find) { background-color: #fde293; }\n::highlight(de-find-cur) { background-color: #ff9632; }\n.de-range {\n position: absolute;\n background: rgba(26, 115, 232, 0.1);\n border: 1px solid rgba(26, 115, 232, 0.6);\n pointer-events: none;\n z-index: 2;\n}\n.de-cell-edit {\n position: absolute;\n z-index: 5;\n padding: 1px 3px;\n border: 2px solid var(--de-accent);\n outline: none;\n resize: none;\n overflow: hidden;\n background: #fff;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n line-height: 1.2;\n white-space: pre-wrap;\n}\n.de-fx-input { border: 0; outline: none; background: transparent; font: inherit; color: inherit; }\n.de-fx-input:focus { background: #fff; box-shadow: inset 0 -2px 0 var(--de-accent); }\n.de-tb-hint { margin-left: 8px; color: var(--de-muted); font-size: 12px; }\n.de-slide-editable [data-sid] { cursor: text; }\n.de-slide-editable [data-sid]:hover { outline: 1px dashed rgba(26, 115, 232, 0.6); }\n.de-txt-edit { outline: 2px solid var(--de-accent); outline-offset: 0; caret-color: #000; cursor: text; z-index: 2; }\n.de-gridpick { display: grid; grid-template-columns: repeat(8, 16px); gap: 3px; }\n.de-gridpick button { width: 16px; height: 16px; padding: 0; border: 1px solid #c8ccd1; border-radius: 2px; background: #fff; cursor: pointer; }\n.de-gridpick button.on { background: #d3e3fd; border-color: var(--de-accent); }\n.de-gridpick-label { margin-top: 6px; text-align: center; color: var(--de-muted); font-size: 12px; }\n.de-prompt { display: flex; gap: 6px; align-items: center; }\n.de-prompt input { width: 240px; height: 28px; padding: 0 8px; border: 1px solid var(--de-border); border-radius: 6px; font: inherit; outline: none; }\n.de-prompt input:focus { border-color: var(--de-accent); }\n.de-prompt .de-btn { border: 1px solid var(--de-border); background: #fff; }\n.de-shape-sel { position: absolute; border: 1.5px solid var(--de-accent); pointer-events: none; z-index: 5; transform-origin: 50% 50%; }\n.de-handle { position: absolute; background: #fff; border: 1px solid var(--de-accent); border-radius: 2px; pointer-events: auto; }\n.de-h-nw, .de-h-se { cursor: nwse-resize; }\n.de-h-ne, .de-h-sw { cursor: nesw-resize; }\n.de-h-n, .de-h-s { cursor: ns-resize; }\n.de-h-e, .de-h-w { cursor: ew-resize; }\n.de-slide-editable [data-top] { cursor: move; }\n.de-slide-editable [data-sid] { cursor: text; }\n.de-present {\n position: fixed;\n inset: 0;\n z-index: 2147483000;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #000;\n outline: none;\n cursor: none;\n}\n.de-present .de-slide { box-shadow: none; }\n.de-present-n { position: absolute; right: 16px; bottom: 12px; color: rgba(255, 255, 255, 0.5); font: 12px system-ui, sans-serif; }\n.de-present-btn {\n position: absolute;\n right: 16px;\n bottom: 56px;\n z-index: 4;\n}\n.de-grip-c { position: absolute; top: 0; width: 6px; cursor: col-resize; z-index: 3; }\n.de-grip-r { position: absolute; left: 0; height: 6px; cursor: row-resize; z-index: 3; }\n.de-grip-c:hover, .de-grip-r:hover { background: rgba(26, 115, 232, 0.35); }\n.de-ctx {\n position: fixed;\n z-index: 50;\n min-width: 240px;\n max-width: 340px;\n padding: 6px 0;\n background: #fff;\n border-radius: 8px;\n box-shadow: 0 2px 6px 2px rgba(60, 64, 67, 0.15), 0 1px 2px rgba(60, 64, 67, 0.3);\n font: 13px/1.3 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n color: #1f1f1f;\n user-select: none;\n}\n.de-ctx-row { display: contents; }\n.de-ctx button {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n min-height: 30px;\n padding: 4px 16px 4px 12px;\n border: 0;\n background: transparent;\n font: inherit;\n color: inherit;\n text-align: left;\n cursor: pointer;\n}\n.de-ctx button.de-ctx-hi:not(:disabled) { background: #f1f3f4; }\n.de-ctx button:disabled { color: #b0b4ba; cursor: default; }\n.de-ctx-icon { display: inline-flex; width: 16px; flex: none; color: #444746; }\n.de-ctx button:disabled .de-ctx-icon { opacity: 0.4; }\n.de-ctx-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.de-ctx-hint { margin-left: 16px; color: var(--de-muted); font-size: 12px; }\n.de-ctx-sep { height: 1px; margin: 6px 0; background: #e3e3e3; }\n.de-ctx-head { padding: 6px 16px 2px 38px; color: var(--de-muted); font-size: 11px; font-weight: 600; letter-spacing: 0.03em; text-transform: uppercase; }\n.de-tab-add { font-size: 18px; padding: 0 10px; }\n.de-tab-input { width: 120px; margin: 4px 2px; padding: 0 6px; border: 1px solid var(--de-accent); border-radius: 4px; font: inherit; }\n/* formula editing: reference boxes, colored references, autocomplete */\n.de-fx { position: relative; }\n.de-fref { position: absolute; border: 2px solid; pointer-events: none; z-index: 2; }\n.de-fref-pt { border-style: dashed; }\n.de-cell-hl { z-index: 4; pointer-events: none; color: #202124; overflow: hidden; overflow-wrap: break-word; }\n.de-cell-edit { overflow-wrap: break-word; }\n.de-cell-edit-fx { background: transparent; color: transparent; caret-color: #202124; box-shadow: none; }\n.de-cell-edit-fx::selection { color: transparent; background: rgba(26, 115, 232, 0.25); }\n.de-fassist-at { position: absolute; z-index: 30; }\n.de-fassist {\n min-width: 240px;\n max-width: 420px;\n padding: 4px 0;\n background: #fff;\n border: 1px solid var(--de-border);\n border-radius: 6px;\n box-shadow: 0 4px 16px rgba(15, 23, 42, 0.16);\n font: 12px/1.45 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n color: var(--de-text);\n text-align: left;\n white-space: normal;\n}\n.de-fsug { padding: 3px 10px; cursor: pointer; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.de-fsug.on { background: #e8f0fe; }\n.de-fsug-name { font-weight: 600; }\n.de-fsug-args { margin-left: 2px; color: var(--de-muted); }\n.de-fsug-desc { margin-top: 2px; color: var(--de-muted); font-size: 11.5px; white-space: normal; }\n.de-fhint { padding: 6px 10px; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }\n.de-fhint .de-fsug-desc { font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; }\n.de-fhint b { color: var(--de-accent); }\n\n/* docx: picture selection, outline, dialogs */\n.de-img-sel { position: absolute; z-index: 4; border: 1.5px solid var(--de-accent); pointer-events: none; }\n.de-img-h {\n position: absolute;\n width: 9px;\n height: 9px;\n margin: -5px 0 0 -5px;\n background: #fff;\n border: 1.5px solid var(--de-accent);\n border-radius: 2px;\n pointer-events: auto;\n}\n.de-img-nw { left: 0; top: 0; cursor: nwse-resize; }\n.de-img-n { left: 50%; top: 0; cursor: ns-resize; }\n.de-img-ne { left: 100%; top: 0; cursor: nesw-resize; }\n.de-img-e { left: 100%; top: 50%; cursor: ew-resize; }\n.de-img-se { left: 100%; top: 100%; cursor: nwse-resize; }\n.de-img-s { left: 50%; top: 100%; cursor: ns-resize; }\n.de-img-sw { left: 0; top: 100%; cursor: nesw-resize; }\n.de-img-w { left: 0; top: 50%; cursor: ew-resize; }\n.de-img-size {\n position: absolute;\n left: 50%;\n bottom: -28px;\n transform: translateX(-50%);\n padding: 2px 6px;\n border-radius: 4px;\n background: rgba(32, 33, 36, 0.85);\n color: #fff;\n font: 11px/1.4 system-ui, sans-serif;\n white-space: nowrap;\n}\n.de-outline {\n position: absolute;\n top: 12px;\n left: 12px;\n z-index: 6;\n display: flex;\n flex-direction: column;\n width: 240px;\n max-height: calc(100% - 24px);\n overflow-y: auto;\n padding: 6px 6px 10px;\n background: #fff;\n border-radius: 10px;\n box-shadow: 0 2px 6px 2px rgba(60, 64, 67, 0.15), 0 1px 2px rgba(60, 64, 67, 0.3);\n font: 13px/1.35 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n}\n.de-outline-head { flex-shrink: 0; display: flex; align-items: center; justify-content: space-between; padding: 4px 4px 6px 10px; font-weight: 600; color: #1f1f1f; }\n.de-outline-item {\n display: block;\n flex-shrink: 0;\n width: 100%;\n padding: 5px 10px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: #3c4043;\n font: inherit;\n text-align: left;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n cursor: pointer;\n}\n.de-outline-item:hover { background: #f1f3f4; }\n.de-outline-item.on { color: #0b57d0; font-weight: 600; }\n.de-outline-empty { flex-shrink: 0; padding: 8px 10px; color: var(--de-muted); }\n.de-outline-toggle {\n position: absolute;\n top: 12px;\n left: 12px;\n z-index: 6;\n width: 34px;\n height: 34px;\n border: 1px solid var(--de-border);\n border-radius: 8px;\n background: #fff;\n box-shadow: var(--de-shadow);\n font-size: 16px;\n cursor: pointer;\n}\n.de-outline-toggle.on { display: none; }\n.de-symbols { display: grid; grid-template-columns: repeat(12, 26px); gap: 2px; }\n.de-symbols button {\n width: 26px;\n height: 26px;\n padding: 0;\n border: 0;\n border-radius: 4px;\n background: transparent;\n font: 15px/1 system-ui, sans-serif;\n color: #1f1f1f;\n cursor: pointer;\n}\n.de-symbols button:hover { background: #e8f0fe; }\n.de-dialog-back {\n position: fixed;\n inset: 0;\n z-index: 60;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: 18vh;\n background: rgba(32, 33, 36, 0.32);\n}\n.de-dialog {\n display: flex;\n flex-direction: column;\n gap: 10px;\n width: min(420px, calc(100vw - 32px));\n padding: 20px;\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 8px 28px rgba(0, 0, 0, 0.28);\n font: 14px/1.4 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n color: #1f1f1f;\n}\n.de-dialog-title { font-size: 16px; font-weight: 600; }\n.de-dialog-label, .de-dialog-note { color: var(--de-muted); font-size: 12.5px; }\n.de-dialog input, .de-dialog textarea {\n width: 100%;\n padding: 8px 10px;\n border: 1px solid #747775;\n border-radius: 6px;\n font: inherit;\n outline: none;\n resize: vertical;\n}\n.de-dialog input:focus, .de-dialog textarea:focus { border-color: var(--de-accent); box-shadow: inset 0 0 0 1px var(--de-accent); }\n.de-dialog-btns { display: flex; justify-content: flex-end; gap: 8px; margin-top: 4px; }\n.de-dialog-btns .de-btn { padding: 7px 14px; border: 1px solid var(--de-border); border-radius: 18px; background: #fff; }\n.de-dialog-btns .de-btn-primary { background: var(--de-accent); border-color: var(--de-accent); color: #fff; }\n.de-dialog-btns .de-btn-primary:hover { background: #1765cc; }\n.de-dialog-extra { margin-right: auto; }\n.de-details { display: grid; grid-template-columns: max-content 1fr; gap: 7px 18px; margin: 4px 0; font-size: 13px; }\n.de-details dt { color: var(--de-muted); }\n.de-details dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }\n.de-details-sep { grid-column: 1 / -1; height: 1px; background: #e3e3e3; }\n.de-toast {\n position: absolute;\n left: 50%;\n bottom: 24px;\n z-index: 60;\n transform: translateX(-50%);\n padding: 10px 16px;\n border-radius: 6px;\n background: #323232;\n color: #fff;\n font: 13px/1.4 system-ui, sans-serif;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n}\n\n/* xlsx: find, borders popover */\n.de-xlsx { position: relative; }\n.de-xlsx .de-find { top: 40px; }\n.de-find-opts { gap: 10px; padding: 2px 4px; color: #3c4043; font-size: 12px; }\n.de-find-opt { display: inline-flex; align-items: center; gap: 4px; cursor: pointer; user-select: none; }\n.de-findcell { position: absolute; z-index: 1; background: rgba(251, 188, 4, 0.28); pointer-events: none; }\n.de-findcell.on { background: rgba(255, 150, 50, 0.45); box-shadow: inset 0 0 0 1.5px #e37400; }\n.de-borders-pop { display: flex; gap: 8px; align-items: flex-start; }\n.de-borders-side { display: flex; flex-direction: column; gap: 4px; padding-left: 8px; border-left: 1px solid #e3e3e3; }\n.de-find .de-find-opt input { width: auto; height: auto; margin: 0; padding: 0; accent-color: var(--de-accent); }\n.de-find-opts { justify-content: flex-start; }\n\n/* ---------------------------------------------------------------- collaboration */\n.de-collab { display: inline-flex; align-items: center; gap: 8px; flex: none; }\n.de-collab-status { display: inline-flex; align-items: center; gap: 6px; height: 24px; padding: 0 9px; border-radius: 12px; font-size: 12px; color: var(--de-muted); background: var(--de-head); white-space: nowrap; }\n.de-collab-dot { width: 7px; height: 7px; border-radius: 50%; background: #9aa0a6; flex: none; }\n.de-collab-live .de-collab-dot { background: #1e8e3e; box-shadow: 0 0 0 3px rgba(30, 142, 62, 0.18); }\n.de-collab-live { color: #137333; }\n.de-collab-connecting .de-collab-dot,\n.de-collab-syncing .de-collab-dot { background: #f9ab00; animation: de-collab-pulse 1s ease-in-out infinite alternate; }\n.de-collab-offline .de-collab-dot { background: #9aa0a6; }\n.de-collab-error { color: #c5221f; }\n.de-collab-error .de-collab-dot { background: #d93025; }\n@keyframes de-collab-pulse { to { opacity: 0.35; } }\n@media (max-width: 640px) { .de-collab-label { display: none; } }\n.de-peers { display: inline-flex; align-items: center; }\n.de-peer {\n display: inline-grid; place-items: center; width: 26px; height: 26px; margin-left: -6px; border-radius: 50%;\n border: 2px solid var(--de-chrome); color: #fff; font-size: 11px; font-weight: 600; letter-spacing: 0.02em; cursor: default; user-select: none;\n}\n.de-peer:first-child { margin-left: 0; }\n.de-peer-more { background: var(--de-muted); }\n.de-peer-layer { position: absolute; inset: 0; pointer-events: none; overflow: hidden; z-index: 4; }\n.de-peer-caret { position: absolute; width: 2px; margin-left: -1px; background: var(--peer); border-radius: 1px; }\n.de-peer-caret::before { content: ''; position: absolute; top: -3px; left: -2px; width: 6px; height: 6px; border-radius: 50%; background: var(--peer); }\n.de-peer-flag {\n position: absolute; bottom: 100%; left: -1px; margin-bottom: 2px; padding: 1px 6px; border-radius: 4px 4px 4px 0; background: var(--peer);\n color: #fff; font: 600 11px/16px system-ui, -apple-system, 'Segoe UI', sans-serif; white-space: nowrap;\n}\n.de-peer-sel { position: absolute; background: var(--peer); opacity: 0.18; border-radius: 1px; }\n.de-peer-outline { position: absolute; border: 2px solid var(--peer); border-radius: 3px; }\n.de-peer-outline > .de-peer-flag { left: -2px; margin-bottom: 1px; }\n.de-peer-range { position: absolute; border: 2px solid; pointer-events: none; z-index: 2; }\n.de-peer-tag {\n position: absolute; top: -17px; left: -2px; padding: 0 5px; border-radius: 3px 3px 3px 0; color: #fff;\n font: 600 10px/15px system-ui, -apple-system, 'Segoe UI', sans-serif; white-space: nowrap;\n}\n","import css from './styles.css?inline'\n\nconst ID = 'office-engine-styles'\n\n/** Injects the viewer stylesheet once into a document or shadow root. */\nexport function injectStyles(target: Document | ShadowRoot | undefined = typeof document !== 'undefined' ? document : undefined) {\n if (!target) return\n const host = target instanceof Document ? target.head : target\n if (host.querySelector?.(`style#${ID}`)) return\n const el = (target instanceof Document ? target : target.ownerDocument).createElement('style')\n el.id = ID\n el.textContent = css\n host.appendChild(el)\n}\n\nexport { css as stylesText }\n","import type { ReactNode } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { stylesText } from '../injectStyles'\n\n/** Content laid out for paper: PDF / print and standalone HTML. */\nexport interface Printable {\n /** the pages (`.de-print-page` elements) or flowing content */\n node: ReactNode\n /** CSS `@page` size: '612pt 792pt', 'landscape', 'auto' */\n size: string\n /** CSS `@page` margin */\n margin: string\n /** shown to the user (e.g. output was truncated) */\n notice?: string\n}\n\nconst PRINT_CSS = `\nhtml, body { margin: 0; padding: 0; background: #fff; }\n.de-print {\n color: #000;\n font: 13px/1.4 system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n -webkit-print-color-adjust: exact;\n print-color-adjust: exact;\n}\n.de-print *, .de-print *::before, .de-print *::after { box-sizing: border-box; }\n.de-print img { max-width: none; }\n.de-print-page { position: relative; overflow: hidden; background: #fff; break-after: page; }\n.de-print-page:last-child { break-after: auto; }\n.de-print-page > .de-page { left: 0; top: 0; box-shadow: none; }\n/* position: own paint layer, so clipping cells after layout (fitText) stays cheap */\n.de-print-table { position: relative; border-collapse: collapse; table-layout: fixed; }\n.de-print-table td { padding: 0 3px 1px; vertical-align: bottom; white-space: pre; }\n.de-print-table.de-print-grid td { border: 1px solid #e2e4e7; }\n.de-print-grid + .de-print-grid { margin-top: -1px; }\n@media screen {\n body { background: #e9ebee; }\n .de-print { padding: 24px 16px; }\n .de-print-page { margin: 0 auto 24px; box-shadow: 0 1px 3px rgba(15, 23, 42, 0.18); }\n .de-print-sheet { width: max-content; max-width: none; margin: 0 auto; padding: 16px; background: #fff; box-shadow: 0 1px 3px rgba(15, 23, 42, 0.18); }\n}\n@media print {\n .de-print-fit { zoom: var(--de-fit, 1); }\n}\n`\n\nconst cssFor = (p: Printable) => `${stylesText}\\n${PRINT_CSS}\\n@page { size: ${p.size}; margin: ${p.margin}; }\\n`\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms))\n\n/** waits until React and async media (slide pictures, fills) stop changing the DOM, then for images and fonts */\nasync function settle(doc: Document, host: HTMLElement) {\n await sleep(0)\n await new Promise<void>((resolve) => {\n let quiet: ReturnType<typeof setTimeout>\n const end = setTimeout(done, 8000)\n const mo = new MutationObserver(() => {\n clearTimeout(quiet)\n quiet = setTimeout(done, 250)\n })\n function done() {\n mo.disconnect()\n clearTimeout(quiet)\n clearTimeout(end)\n resolve()\n }\n mo.observe(host, { subtree: true, childList: true, attributes: true })\n quiet = setTimeout(done, 250)\n })\n const urls = new Set<string>()\n for (const el of host.querySelectorAll<HTMLElement>('[style*=\"url(\"]')) {\n for (const m of el.style.backgroundImage.matchAll(/url\\([\"']?([^\"')]+)[\"']?\\)/g)) urls.add(m[1])\n }\n const loads: Promise<unknown>[] = [...host.querySelectorAll('img')].map((img) =>\n img.complete ? null : new Promise((r) => ((img.onload = r), (img.onerror = r))),\n ) as Promise<unknown>[]\n for (const u of urls) {\n loads.push(\n new Promise((r) => {\n const img = new Image()\n img.onload = img.onerror = r\n img.src = u\n }),\n )\n }\n await Promise.race([Promise.all(loads), sleep(10_000)])\n await Promise.race([doc.fonts?.ready, sleep(3000)])\n}\n\nconst RTL = /[\\u0590-\\u08ff\\ufb1d-\\ufdff\\ufe70-\\ufefc]/\n\n/** first index in [lo, hi) where `ok` holds (`ok` false then true), hi when none */\nfunction search(lo: number, hi: number, ok: (i: number) => boolean) {\n while (lo < hi) {\n const mid = (lo + hi) >> 1\n if (ok(mid)) hi = mid\n else lo = mid + 1\n }\n return lo\n}\n\n/**\n * Cuts the text of the elements marked `data-de-fit` to what fits inside them (\"#\" marks numbers: shown as ###).\n * Cutting, not clipping: a clip (overflow: hidden) per spreadsheet cell makes Chrome's print layout superlinear in\n * their count — a 20,000-row sheet took minutes and crashed the print preview. Wrapped or right-to-left text is clipped.\n */\nfunction fitText(host: HTMLElement) {\n const view = host.ownerDocument.defaultView!\n const range = host.ownerDocument.createRange()\n const box = (text: Text, i: number) => {\n range.setStart(text, i)\n range.setEnd(text, i + 1)\n return range.getBoundingClientRect()\n }\n const cuts: [Text, string][] = []\n const clips: HTMLElement[] = []\n for (const el of host.querySelectorAll<HTMLElement>('[data-de-fit]')) {\n const node = el.firstChild\n if (node?.nodeType !== Node.TEXT_NODE || node.nextSibling) continue\n const text = node as Text\n const s = text.data\n range.selectNodeContents(text)\n const t = range.getBoundingClientRect()\n const b = el.getBoundingClientRect()\n // the padding box: what overflow: hidden would show\n const left = b.left + el.clientLeft - 0.5\n const right = b.left + el.clientLeft + el.clientWidth + 0.5\n if (t.left >= left && t.right <= right) continue\n const cs = view.getComputedStyle(el)\n if (el.dataset.deFit === '#') {\n const room = el.clientWidth - parseFloat(cs.paddingLeft) - parseFloat(cs.paddingRight)\n cuts.push([text, '#'.repeat(Math.max(1, Math.floor(room / (t.width / s.length))))])\n } else if (RTL.test(s) || (cs.whiteSpace !== 'pre' && cs.whiteSpace !== 'nowrap')) {\n // characters out of visual order, or lines wrapped\n clips.push(el)\n } else {\n const lines: string[] = []\n let start = 0\n for (const line of s.split('\\n')) {\n const end = start + line.length\n // a line's characters run left to right: keep those inside the cell\n let i = search(start, end, (k) => box(text, k).left >= left)\n let j = search(i, end, (k) => box(text, k).right > right)\n if (/[\\udc00-\\udfff]/.test(s[i] ?? '')) i++\n if (/[\\ud800-\\udbff]/.test(s[j - 1] ?? '')) j--\n lines.push(s.slice(i, Math.max(i, j)))\n start = end + 1\n }\n cuts.push([text, lines.join('\\n')])\n }\n }\n // writes after all reads: one layout\n for (const [text, s] of cuts) text.data = s\n for (const el of clips) el.style.overflow = 'hidden'\n}\n\ninterface Mounted {\n frame: HTMLIFrameElement\n doc: Document\n host: HTMLElement\n dispose(): void\n}\n\n/** renders the printable into an off-screen same-origin iframe (keeps host page CSS out) */\nasync function mount(p: Printable, title: string): Promise<Mounted> {\n const frame = document.createElement('iframe')\n frame.setAttribute('aria-hidden', 'true')\n frame.tabIndex = -1\n frame.style.cssText = 'position:fixed;left:-20000px;top:0;width:1100px;height:800px;border:0;visibility:hidden'\n document.body.appendChild(frame)\n const doc = frame.contentDocument!\n doc.open()\n doc.write('<!doctype html><html><head><meta charset=\"utf-8\"></head><body></body></html>')\n doc.close()\n doc.title = title\n const style = doc.createElement('style')\n style.textContent = cssFor(p)\n doc.head.appendChild(style)\n const host = doc.createElement('div')\n host.className = 'de-print'\n doc.body.appendChild(host)\n const root = createRoot(host)\n root.render(p.node)\n let disposed = false\n const dispose = () => {\n if (disposed) return\n disposed = true\n root.unmount()\n frame.remove()\n }\n try {\n await settle(doc, host)\n fitText(host)\n } catch (e) {\n dispose()\n throw e\n }\n return { frame, doc, host, dispose }\n}\n\nlet printing: Mounted | null = null\n\n/** Opens the browser print dialog for the content (choose \"Save as PDF\" there). */\nexport async function printDocument(p: Printable, title: string): Promise<void> {\n printing?.dispose()\n const m = await mount(p, title)\n printing = m\n const w = m.frame.contentWindow!\n const cleanup = () => {\n if (printing === m) printing = null\n // give the print pipeline a moment before the frame goes away\n setTimeout(() => m.dispose(), 1000)\n }\n w.addEventListener('afterprint', cleanup, { once: true })\n setTimeout(cleanup, 10 * 60_000)\n // the PDF file name proposed by \"Save as PDF\" comes from the top document's title in some browsers\n const prev = document.title\n document.title = title\n try {\n w.focus()\n // Safari prints the whole page with frame.print(); execCommand prints the frame there\n let ok = false\n try {\n ok = w.document.execCommand('print', false)\n } catch {\n ok = false\n }\n if (!ok) w.print()\n } finally {\n document.title = prev\n }\n}\n\nconst esc = (s: string) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n\nfunction toDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const r = new FileReader()\n r.onload = () => resolve(r.result as string)\n r.onerror = () => reject(r.error)\n r.readAsDataURL(blob)\n })\n}\n\n/** Standalone web page of the content (pictures embedded). */\nexport async function exportHtml(p: Printable, title: string): Promise<Blob> {\n const m = await mount(p, title)\n try {\n let body = m.host.outerHTML.replace(/ contenteditable=\"(?:true|false)\"| data-de-fit=\"#?\"/g, '')\n const blobs = new Set(body.match(/blob:[^\"'()\\s&]+/g) ?? [])\n for (const url of blobs) {\n try {\n const data = await toDataUrl(await (await fetch(url)).blob())\n body = body.split(url).join(data)\n } catch {\n // revoked: the picture is left out\n }\n }\n const html =\n `<!doctype html>\\n<html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">` +\n `<title>${esc(title)}</title><style>${cssFor(p)}</style></head><body>${body}</body></html>\\n`\n return new Blob([html], { type: 'text/html;charset=utf-8' })\n } finally {\n m.dispose()\n }\n}\n","import { useRef, useState } from 'react'\nimport { detectSeparator, parseCsv } from '../../core/convert'\nimport type { DocKind } from '../../core/opc'\nimport { MOD } from '../common/ContextMenu'\nimport type { FileOps } from '../common/Slots'\nimport { download, Dropdown, pickFiles, type DropOption } from '../edit/Toolbar'\nimport { OPEN_ACCEPT } from './importFile'\nimport { exportHtml, printDocument } from './print'\n\nexport const KIND_LABEL: Record<DocKind, string> = {\n docx: 'Word document',\n xlsx: 'Excel workbook',\n pptx: 'PowerPoint presentation',\n}\nconst EXT: Record<DocKind, string> = { docx: '.docx', xlsx: '.xlsx', pptx: '.pptx' }\n\nconst TEXT_FORMATS: Record<DocKind, { id: string; label: string; ext: string; mime: string }[]> = {\n docx: [\n { id: 'txt', label: 'Plain text', ext: '.txt', mime: 'text/plain' },\n { id: 'md', label: 'Markdown', ext: '.md', mime: 'text/markdown' },\n ],\n xlsx: [\n { id: 'csv', label: 'CSV (current sheet)', ext: '.csv', mime: 'text/csv' },\n { id: 'tsv', label: 'TSV (current sheet)', ext: '.tsv', mime: 'text/tab-separated-values' },\n ],\n pptx: [{ id: 'txt', label: 'Plain text', ext: '.txt', mime: 'text/plain' }],\n}\n\n/** Host-provided File menu entry (Share, Version history…). */\nexport interface FileMenuItem {\n label: string\n /** built-in icon name */\n icon?: string\n /** shortcut / note on the right */\n hint?: string\n disabled?: boolean\n onClick: () => void\n}\n\nexport interface FileActionsOptions {\n kind: DocKind | undefined\n /** file name without extension */\n base: string\n /** New / Open (replace the document) */\n canOpen: boolean\n /** Import into the document (spreadsheets) */\n canImport: boolean\n canSave: boolean\n canDownload: boolean\n ops: { current: FileOps | null }\n create: (kind: DocKind) => void\n open: (file: File) => void\n save: () => Promise<void>\n /** the document in its own format */\n downloadOriginal: () => Promise<void>\n rename?: () => void\n details?: () => void\n close?: () => void\n extra: FileMenuItem[]\n notify: (message: string) => void\n}\n\nexport interface FileActions {\n options: DropOption<string>[]\n busy: boolean\n run: (action: string) => void\n}\n\n/** actions that open a picker / dialog right away (no busy state) */\nconst QUICK = /^(new:|open$|import$|rename$|details$|close$|extra:)/\n\n/** File menu entries and their actions (also used by the Ctrl+O / Ctrl+P shortcuts). */\nexport function useFileActions(o: FileActionsOptions): FileActions {\n const [busy, setBusy] = useState(false)\n const busyRef = useRef(false)\n const opts = useRef(o)\n opts.current = o\n const kind = o.kind\n\n const options: DropOption<string>[] = []\n const section = (items: DropOption<string>[]) => {\n if (!items.length) return\n items[0] = { ...items[0], sep: options.length > 0 }\n options.push(...items)\n }\n section(\n o.canOpen\n ? [\n { value: 'new:docx', label: 'Document', icon: 'doc', head: 'New' },\n { value: 'new:xlsx', label: 'Spreadsheet', icon: 'table' },\n { value: 'new:pptx', label: 'Presentation', icon: 'slides' },\n { value: 'open', label: 'Open…', icon: 'open', hint: `${MOD}O`, sep: true },\n ]\n : [],\n )\n if (o.canImport && kind === 'xlsx') options.push({ value: 'import', label: 'Import CSV into new sheet…', icon: 'table', sep: !o.canOpen && options.length > 0 })\n const fileItems: DropOption<string>[] = []\n if (kind && o.canSave) fileItems.push({ value: 'save', label: 'Save', icon: 'save', hint: `${MOD}S` })\n if (kind && o.rename) fileItems.push({ value: 'rename', label: 'Rename…', icon: 'edit' })\n section(fileItems)\n if (o.canDownload && kind) {\n section([\n { value: 'original', label: KIND_LABEL[kind], icon: 'save', hint: EXT[kind], head: 'Download as' },\n { value: 'pdf', label: 'PDF document', icon: 'pdf', hint: '.pdf' },\n { value: 'html', label: 'Web page', icon: 'html', hint: '.html' },\n ...TEXT_FORMATS[kind].map((f) => ({ value: 'text:' + f.id, label: f.label, icon: 'doc', hint: f.ext })),\n ])\n }\n const tail: DropOption<string>[] = []\n if (kind && o.details) tail.push({ value: 'details', label: 'Document details', icon: 'info' })\n if (kind && o.canDownload) tail.push({ value: 'print', label: 'Print', icon: 'print', hint: `${MOD}P` })\n section(tail)\n section(o.extra.map((x, i) => ({ value: `extra:${i}`, label: x.label, icon: x.icon, hint: x.hint, disabled: x.disabled })))\n if (o.close) section([{ value: 'close', label: 'Close', icon: 'close' }])\n\n const exec = async (action: string) => {\n const c = opts.current\n if (action.startsWith('new:')) return c.create(action.slice(4) as DocKind)\n if (action.startsWith('extra:')) return c.extra[Number(action.slice(6))]?.onClick()\n switch (action) {\n case 'open': {\n const [file] = await pickFiles(OPEN_ACCEPT, false)\n if (file) c.open(file)\n return\n }\n case 'rename':\n return c.rename?.()\n case 'details':\n return c.details?.()\n case 'close':\n return c.close?.()\n case 'save':\n return c.save()\n }\n const ops = c.ops.current\n if (action === 'import') {\n const [file] = await pickFiles('.csv,.tsv,.tab,.txt', false)\n if (!file) return\n if (!ops?.importTable) throw new Error('The document is still loading — try again in a moment')\n const text = await file.text()\n const sep = /\\.(tsv|tab)$/i.test(file.name) ? '\\t' : detectSeparator(text)\n await ops.importTable(parseCsv(text, sep), file.name.replace(/\\.[^.]+$/, '').slice(0, 31) || 'Imported')\n return\n }\n if (!c.kind || !c.canDownload) return\n if (action === 'original') return c.downloadOriginal()\n if (!ops) throw new Error('The document is still loading — try again in a moment')\n if (action.startsWith('text:')) {\n const f = TEXT_FORMATS[c.kind].find((x) => 'text:' + x.id === action)\n if (!f) return\n download(new Blob([await ops.text(f.id)], { type: `${f.mime};charset=utf-8` }), c.base + f.ext)\n return\n }\n if (action === 'pdf' || action === 'print' || action === 'html') {\n c.notify(action === 'pdf' ? 'Preparing PDF… choose “Save as PDF” in the print dialog' : 'Preparing…')\n const p = await ops.printable()\n if (p.notice) c.notify(p.notice)\n if (action === 'html') download(await exportHtml(p, c.base), c.base + '.html')\n else await printDocument(p, c.base)\n }\n }\n\n const run = (action: string) => {\n const quick = QUICK.test(action)\n if (busyRef.current && !quick) return\n if (!quick) {\n busyRef.current = true\n setBusy(true)\n }\n Promise.resolve()\n .then(() => exec(action))\n .catch((e: Error) => opts.current.notify(e.message || String(e)))\n .finally(() => {\n if (quick) return\n busyRef.current = false\n setBusy(false)\n })\n }\n\n return { options, busy, run }\n}\n\nexport function FileMenu({ actions }: { actions: FileActions }) {\n if (!actions.options.length) return null\n return <Dropdown title=\"File\" label=\"File\" className=\"de-file\" options={actions.options} onChange={actions.run} menuWidth={280} disabled={actions.busy} />\n}\n","import { cssFont } from '../../core/fonts'\nimport type { PParaSpec, PRunSet, SlideModel, TextBody, TPara, TRun } from '../../core/pptx/types'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { ordered, RichInput, type ReplaceOpts, type RichHost } from '../edit/input'\nimport { collapsed, formatRange, normalize, plen, runAt, type RRun, type Sel } from '../edit/rich'\n\ntype RunStyle = Omit<TRun, 'text' | 'br' | 'fld' | 'src' | 'href'>\n\nexport interface EPara {\n runs: RRun[]\n base: TPara\n algn: TPara['algn']\n algnSet?: boolean\n /** paragraph changes made here (written back) */\n pp?: { lvl?: number; bullet?: 'none' | 'bullet' | 'number'; lnPct?: number }\n k?: number\n caret?: RRun\n}\n\ninterface Entry {\n before: EPara[]\n after: EPara[]\n selBefore: Sel\n selAfter: Sel\n label: string\n t: number\n}\n\nexport interface PptxFormat {\n b: boolean\n i: boolean\n u: boolean\n strike: boolean\n sz?: number\n color?: string\n font?: string\n algn?: string\n hl?: string\n baseline?: number\n bullet?: 'none' | 'bullet' | 'number'\n lvl: number\n lnPct?: number\n}\n\nconst styleOf = (r: TRun): RunStyle => ({ sz: r.sz, b: r.b, i: r.i, u: r.u, strike: r.strike, color: r.color, font: r.font, baseline: r.baseline, caps: r.caps, hl: r.hl })\n\nfunction toEdit(p: TPara): EPara {\n const runs: RRun[] = p.runs.map((r) =>\n r.fld ? { t: 'fld', text: r.text, s: styleOf(r), src: r.src } : { t: 'text', text: r.br ? '\\n' : r.text, s: styleOf(r), src: r.src },\n )\n return { runs: normalize(runs), base: p, algn: p.algn, k: p.k }\n}\n\nconst bulletOf = (p: EPara) => p.pp?.bullet ?? p.base.buKind ?? 'none'\nconst lvlOf = (p: EPara) => p.pp?.lvl ?? p.base.lvl ?? 0\n\nexport function toTPara(p: EPara, num = 0): TPara {\n const kind = bulletOf(p)\n const lvl = lvlOf(p)\n const sz = (p.runs.find((r) => r.t === 'text')?.s as RunStyle | undefined)?.sz ?? p.base.endSz\n // approximate the look of edited bullets / levels until the slide is re-rendered\n const bullet = !p.pp?.bullet ? p.base.bullet : kind === 'none' ? undefined : { text: kind === 'bullet' ? '•' : `${num}.`, sz, color: p.base.bullet?.color }\n const shift = (lvl - (p.base.lvl ?? 0)) * 48\n const hang = p.pp?.bullet && kind !== 'none' && !p.base.bullet ? 27 : 0\n return {\n ...p.base,\n bullet,\n marL: Math.max(0, p.base.marL + shift + hang),\n indent: hang ? -hang : p.base.indent,\n lnPct: p.pp?.lnPct ?? p.base.lnPct,\n algn: p.algn,\n runs: p.runs.map((r) => (r.t === 'fld' ? { ...(r.s as RunStyle), text: r.text ?? '', fld: true } : { ...(r.s as RunStyle), text: r.text ?? '' })) as TRun[],\n }\n}\n\n/** Text editing of one shape on one slide. */\nexport class PptxEditor implements RichHost<EPara> {\n readonly input: RichInput\n paras: EPara[] = []\n body?: TextBody\n slide = -1\n sid = -1\n pendingSel: Sel | null = null\n private history: Entry[] = []\n private future: Entry[] = []\n private pend: { s: Partial<RunStyle>; d: PRunSet; at: { pa: string; o: number } } | null = null\n private timer: ReturnType<typeof setTimeout> | undefined\n private changedSinceCommit = false\n onChange?: () => void\n onCommitted?: (slide: number, model: SlideModel) => void\n onDirty?: () => void\n onState?: (s: PptxFormat | null) => void\n\n constructor(private client: DocumentClient) {\n this.input = new RichInput(this)\n }\n\n get active() {\n return this.sid >= 0\n }\n\n begin(slide: number, sid: number, body: TextBody) {\n this.end()\n this.slide = slide\n this.sid = sid\n this.body = body\n this.paras = (body.paras.length ? body.paras : [{ algn: 'left', marL: 0, indent: 0, spcBef: 0, spcAft: 0, runs: [], endSz: 18 } as TPara]).map(toEdit)\n this.history = []\n this.future = []\n this.pend = null\n }\n\n end() {\n if (this.sid >= 0 && this.changedSinceCommit) this.commit()\n this.input.detach()\n this.sid = -1\n this.slide = -1\n this.body = undefined\n this.onState?.(null)\n }\n\n text(): TextBody | undefined {\n if (!this.body) return undefined\n const counters: number[] = []\n const paras = this.paras.map((p) => {\n const lvl = lvlOf(p)\n if (bulletOf(p) === 'number') counters[lvl] = (counters[lvl] ?? 0) + 1\n else counters[lvl] = 0\n counters.length = lvl + 1\n return toTPara(p, counters[lvl])\n })\n return { ...this.body, empty: false, paras }\n }\n\n // ---------------------------------------------------------------- RichHost\n\n para(pa: string) {\n return this.paras[Number(pa)]\n }\n span(a: string, b: string) {\n const out: string[] = []\n for (let i = Number(a); i <= Number(b); i++) out.push(String(i))\n return out\n }\n prev(pa: string) {\n return Number(pa) > 0 ? String(Number(pa) - 1) : undefined\n }\n next(pa: string) {\n return Number(pa) < this.paras.length - 1 ? String(Number(pa) + 1) : undefined\n }\n cmp(a: string, b: string) {\n return Number(a) - Number(b)\n }\n withRuns(p: EPara, runs: RRun[]): EPara {\n return { ...p, runs }\n }\n split(p: EPara, left: RRun[], right: RRun[]): [EPara, EPara] {\n return [\n { ...p, runs: left },\n { ...p, runs: right, caret: right.length ? undefined : runAt(left, plen(left)) ?? p.caret },\n ]\n }\n join(a: EPara, _b: EPara, runs: RRun[]): EPara {\n return { ...a, runs }\n }\n defaultRun(p: EPara): Partial<RRun> | undefined {\n if (p.caret) return { ...p.caret, text: '' }\n const last = [...p.runs].reverse().find((r) => r.t === 'text')\n return last ? { ...last, text: '' } : { t: 'text', s: { sz: p.base.endSz } }\n }\n pendingStyle() {\n return this.pend ? ({ s: this.pend.s, d: this.pend.d } as Partial<RRun>) : undefined\n }\n clearPending() {\n this.pend = null\n }\n\n replace(pas: string[], next: EPara[], sel: Sel, opts: ReplaceOpts & { history?: boolean } = {}) {\n const before = this.paras\n const i0 = Number(pas[0])\n this.paras = [...before.slice(0, i0), ...next, ...before.slice(i0 + pas.length)]\n if (opts.history !== false) {\n const now = Date.now()\n const last = this.history[this.history.length - 1]\n const label = opts.label ?? 'edit'\n if (label === 'type' && last?.label === 'type' && now - last.t < 1500) {\n last.after = this.paras\n last.selAfter = sel\n last.t = now\n } else this.history.push({ before, after: this.paras, selBefore: this.input.lastSel ?? sel, selAfter: sel, label, t: now })\n this.future = []\n }\n this.pendingSel = sel\n this.changedSinceCommit = true\n this.onDirty?.()\n clearTimeout(this.timer)\n this.timer = setTimeout(() => this.commit(), 400)\n this.onChange?.()\n this.onState?.(this.state(sel))\n }\n\n undo() {\n const e = this.history.pop()\n if (!e) return\n this.future.push(e)\n this.restore(e.before, e.selBefore)\n }\n redo() {\n const e = this.future.pop()\n if (!e) return\n this.history.push(e)\n this.restore(e.after, e.selAfter)\n }\n private restore(paras: EPara[], sel: Sel) {\n this.paras = paras\n this.pendingSel = sel\n this.changedSinceCommit = true\n clearTimeout(this.timer)\n this.timer = setTimeout(() => this.commit(), 400)\n this.onChange?.()\n this.onState?.(this.state(sel))\n }\n\n commit() {\n clearTimeout(this.timer)\n if (this.sid < 0 || !this.changedSinceCommit) return\n this.changedSinceCommit = false\n const slide = this.slide\n const specs: PParaSpec[] = this.paras.map((p) => ({\n k: p.k,\n algn: p.algnSet ? p.algn : undefined,\n ...p.pp,\n runs: p.runs.map((r) =>\n r.t === 'fld' ? { text: '', src: r.src as [number, number], fld: true } : { text: r.text ?? '', src: r.src as [number, number] | undefined, set: r.d as PRunSet | undefined },\n ),\n }))\n this.client\n .call('pptx.setText', slide, this.sid, specs)\n .then((m) => this.onCommitted?.(slide, m))\n .catch((e) => console.error('[office-engine] slide edit failed', e))\n }\n\n // ---------------------------------------------------------------- formatting\n\n format(s: Partial<RunStyle>, d: PRunSet) {\n const sel = this.input.sel()\n if (!sel) return\n if (collapsed(sel)) {\n this.pend = { s: { ...(this.pend?.s ?? {}), ...s }, d: { ...(this.pend?.d ?? {}), ...d }, at: sel.a }\n this.input.restore(sel)\n this.onState?.(this.state(sel))\n return\n }\n const [a, b] = ordered(this, sel)\n const pas = this.span(a.pa, b.pa)\n const next = pas.map((pa, i) => {\n const p = this.para(pa)\n const from = i === 0 ? a.o : 0\n const to = i === pas.length - 1 ? b.o : plen(p.runs)\n return this.withRuns(p, formatRange(p.runs, from, to, s, d))\n })\n this.replace(pas, next, sel, { label: 'format' })\n }\n\n toggle(key: 'b' | 'i' | 'u' | 'strike') {\n const st = this.state()\n const on = !(st && st[key])\n this.format({ [key]: on }, { [key]: on })\n }\n\n setSize(sz: number) {\n this.format({ sz }, { sz })\n }\n setColor(c: string | null) {\n this.format({ color: c ?? undefined }, { color: c })\n }\n setFont(name: string) {\n this.format({ font: cssFont(name) }, { font: name })\n }\n\n setAlign(algn: TPara['algn']) {\n const sel = this.input.sel()\n if (!sel) return\n const [a, b] = ordered(this, sel)\n const pas = this.span(a.pa, b.pa)\n this.replace(pas, pas.map((pa) => ({ ...this.para(pa), algn, algnSet: true })), sel, { label: 'align' })\n }\n\n /** applies a paragraph-level change to the selected paragraphs */\n private paraOp(fn: (p: EPara) => EPara, label: string) {\n const sel = this.input.sel()\n if (!sel) return\n const [a, b] = ordered(this, sel)\n const pas = this.span(a.pa, b.pa)\n this.replace(pas, pas.map((pa) => fn(this.para(pa))), sel, { label })\n }\n\n toggleBullet(kind: 'bullet' | 'number') {\n const st = this.state()\n const next = st?.bullet === kind ? 'none' : kind\n this.paraOp((p) => ({ ...p, pp: { ...p.pp, bullet: next } }), 'bullet')\n }\n\n indentLevel(d: 1 | -1) {\n this.paraOp((p) => ({ ...p, pp: { ...p.pp, lvl: Math.max(0, Math.min(8, lvlOf(p) + d)) } }), 'indent')\n }\n\n setLineSpacing(x: number) {\n this.paraOp((p) => ({ ...p, pp: { ...p.pp, lnPct: x } }), 'spacing')\n }\n\n setHighlight(c: string | null) {\n this.format({ hl: c ?? undefined }, { hl: c })\n }\n\n toggleBaseline(kind: 'sup' | 'sub') {\n const cur = this.state()?.baseline ?? 0\n const v = kind === 'sup' ? (cur > 0 ? 0 : 30) : cur < 0 ? 0 : -25\n this.format({ baseline: v || undefined }, { baseline: v || null })\n }\n\n clearFormat() {\n this.format({ b: false, i: false, u: false, strike: false, hl: undefined, baseline: undefined }, { b: false, i: false, u: false, strike: false, hl: null, baseline: null })\n }\n\n state(sel = this.input.sel()): PptxFormat | null {\n if (!sel || this.sid < 0) return null\n const [a] = ordered(this, sel)\n const p = this.para(a.pa)\n if (!p) return null\n const run = runAt(p.runs, collapsed(sel) ? a.o : a.o + 1)\n const s = { ...((run?.s ?? {}) as RunStyle), ...(collapsed(sel) ? this.pend?.s ?? {} : {}) }\n return {\n b: !!s.b,\n i: !!s.i,\n u: !!s.u,\n strike: !!s.strike,\n sz: s.sz,\n color: s.color,\n font: s.font,\n algn: p.algn,\n hl: s.hl,\n baseline: s.baseline,\n bullet: bulletOf(p),\n lvl: lvlOf(p),\n lnPct: p.pp?.lnPct ?? p.base.lnPct,\n }\n }\n\n onSelection(sel: Sel | null) {\n if (sel && this.pend && (sel.a.pa !== this.pend.at.pa || sel.a.o !== this.pend.at.o)) this.pend = null\n this.onState?.(sel ? this.state(sel) : null)\n }\n\n shortcut?: (e: KeyboardEvent) => boolean\n}\n","import { useEffect, useState } from 'react'\nimport type { ShapeKind } from '../../core/pptx/types'\nimport { MOD } from '../common/ContextMenu'\nimport { EditorBar } from '../common/Slots'\nimport { Btn, ColorBtn, Dropdown, fontName, fontOptions, Menu, Select, Sep, SizeBox, type DropOption } from '../edit/Toolbar'\nimport type { PptxEditor, PptxFormat } from './PptxEditor'\n\nconst HIGHLIGHTS = ['#ffff00', '#00ff00', '#00ffff', '#ff00ff', '#ff0000', '#0000ff', '#ffc000', '#92d050', '#c0c0c0', '#000000']\n\nexport const SHAPES: DropOption<string>[] = [\n { value: 'text', label: 'Text box', icon: 'textbox' },\n { value: 'image', label: 'Image…', icon: 'image' },\n { value: 'line', label: 'Line', icon: 'line' },\n { value: 'rect', label: 'Rectangle', icon: 'rect', sep: true },\n { value: 'roundRect', label: 'Rounded rectangle', icon: 'roundRect' },\n { value: 'ellipse', label: 'Ellipse', icon: 'ellipse' },\n { value: 'triangle', label: 'Triangle', icon: 'triangle' },\n { value: 'rtTriangle', label: 'Right triangle' },\n { value: 'diamond', label: 'Diamond' },\n { value: 'parallelogram', label: 'Parallelogram' },\n { value: 'trapezoid', label: 'Trapezoid' },\n { value: 'pentagon', label: 'Pentagon' },\n { value: 'hexagon', label: 'Hexagon' },\n { value: 'octagon', label: 'Octagon' },\n { value: 'donut', label: 'Donut' },\n { value: 'can', label: 'Cylinder' },\n { value: 'heart', label: 'Heart' },\n { value: 'plus', label: 'Plus' },\n { value: 'rightArrow', label: 'Arrow right', icon: 'arrow', sep: true },\n { value: 'leftArrow', label: 'Arrow left' },\n { value: 'upArrow', label: 'Arrow up' },\n { value: 'downArrow', label: 'Arrow down' },\n { value: 'leftRightArrow', label: 'Double arrow' },\n { value: 'chevron', label: 'Chevron' },\n { value: 'homePlate', label: 'Pentagon arrow' },\n { value: 'star4', label: '4-point star', sep: true },\n { value: 'star5', label: '5-point star', icon: 'star' },\n { value: 'star6', label: '6-point star' },\n { value: 'wedgeRectCallout', label: 'Callout', sep: true },\n { value: 'wedgeRoundRectCallout', label: 'Rounded callout' },\n]\n\nconst LINE_W = [0.75, 1, 1.5, 2.25, 3, 4.5, 6].map((w) => ({ value: w, label: `${w} pt` }))\nconst DASHES = [\n { value: 'solid', label: 'Solid', hint: '────' },\n { value: 'sysDot', label: 'Dotted', hint: '········' },\n { value: 'dash', label: 'Dashed', hint: '- - - -' },\n { value: 'lgDash', label: 'Long dash', hint: '— — —' },\n { value: 'dashDot', label: 'Dash dot', hint: '-·-·-·' },\n]\nconst SPACING = [1, 1.15, 1.5, 2].map((v) => ({ value: v, label: v === 1 ? 'Single' : v === 2 ? 'Double' : String(v) }))\nconst VALIGN = [\n { value: 't', label: 'Top', icon: 'vTop' },\n { value: 'ctr', label: 'Middle', icon: 'vMiddle' },\n { value: 'b', label: 'Bottom', icon: 'vBottom' },\n] as const\n\nexport type Arrange = 'front' | 'forward' | 'backward' | 'back'\nexport type Rotate = 'cw' | 'ccw' | 'flipH' | 'flipV'\nexport type AlignTo = 'left' | 'center' | 'right' | 'top' | 'middle' | 'bottom'\nexport type SlideCmd = 'add' | 'duplicate' | 'delete' | 'up' | 'down' | 'hide'\n\nexport function PptxToolbar(props: {\n editor: PptxEditor\n /** selected shape (not editing its text) */\n shape: { canText: boolean; anchor?: 't' | 'ctr' | 'b' } | null\n /** anchor of the text box being edited */\n textAnchor?: 't' | 'ctr' | 'b'\n canUndo: boolean\n onUndo: (redo: boolean) => void\n onInsert: (k: ShapeKind) => void\n onFill: (c: string | null) => void\n onLine: (p: { color?: string | null; w?: number; dash?: string }) => void\n onArrange: (k: Arrange) => void\n onRotate: (k: Rotate) => void\n onAlign: (k: AlignTo) => void\n onAnchor: (a: 't' | 'ctr' | 'b') => void\n onDuplicate: () => void\n onDelete: () => void\n onBackground: (c: string | null) => void\n onSlide: (k: SlideCmd) => void\n onPresent: (fromStart: boolean) => void\n}) {\n const { editor } = props\n const [st, setSt] = useState<PptxFormat | null>(null)\n useEffect(() => {\n editor.onState = setSt\n return () => {\n editor.onState = undefined\n }\n }, [editor])\n const text = !!st && editor.active\n const font = fontName(st?.font)\n const sz = st?.sz ? Math.round(st.sz * 2) / 2 : undefined\n const anchor = text ? props.textAnchor : props.shape?.anchor\n return (\n <EditorBar>\n <Btn icon=\"undo\" title={`Undo (${MOD}Z)`} disabled={!text && !props.canUndo} onClick={() => (text ? editor.undo() : props.onUndo(false))} />\n <Btn icon=\"redo\" title={`Redo (${MOD}Y)`} onClick={() => (text ? editor.redo() : props.onUndo(true))} />\n <Sep />\n <Menu title=\"Insert\" label=\"Insert\" icon=\"plus\" items={SHAPES as { value: string; label: string; icon?: string; sep?: boolean }[]} onPick={(v) => props.onInsert(v)} />\n <Menu\n title=\"Slide\"\n label=\"Slide\"\n icon=\"slideAdd\"\n items={[\n { value: 'add', label: 'New slide', icon: 'slideAdd', hint: `${MOD}M` },\n { value: 'duplicate', label: 'Duplicate slide', icon: 'copy' },\n { value: 'delete', label: 'Delete slide', icon: 'trash' },\n { value: 'up', label: 'Move slide up', icon: 'up', sep: true },\n { value: 'down', label: 'Move slide down', icon: 'down' },\n { value: 'hide', label: 'Hide / show slide', icon: 'hide', sep: true },\n ]}\n onPick={(v) => props.onSlide(v as SlideCmd)}\n />\n <Sep />\n {text ? (\n <>\n <Select title=\"Font\" width={112} menuWidth={200} value={font} placeholder=\"Font\" options={fontOptions(font)} onChange={(v) => editor.setFont(v)} />\n <Sep />\n <SizeBox value={sz} onChange={(v) => editor.setSize(v)} />\n <Sep />\n <Btn icon=\"bold\" title={`Bold (${MOD}B)`} active={st?.b} onClick={() => editor.toggle('b')} />\n <Btn icon=\"italic\" title={`Italic (${MOD}I)`} active={st?.i} onClick={() => editor.toggle('i')} />\n <Btn icon=\"underline\" title={`Underline (${MOD}U)`} active={st?.u} onClick={() => editor.toggle('u')} />\n <Btn icon=\"strike\" title=\"Strikethrough\" active={st?.strike} onClick={() => editor.toggle('strike')} />\n <ColorBtn icon=\"color\" title=\"Text color\" value={st?.color} onPick={(c) => editor.setColor(c)} noneLabel=\"Automatic\" />\n <ColorBtn icon=\"highlight\" title=\"Highlight color\" value={st?.hl} palette={HIGHLIGHTS} onPick={(c) => editor.setHighlight(c)} />\n <Btn icon=\"sup\" title=\"Superscript\" active={(st?.baseline ?? 0) > 0} onClick={() => editor.toggleBaseline('sup')} />\n <Btn icon=\"sub\" title=\"Subscript\" active={(st?.baseline ?? 0) < 0} onClick={() => editor.toggleBaseline('sub')} />\n <Sep />\n <Btn icon=\"alignLeft\" title=\"Align left\" active={st?.algn === 'left'} onClick={() => editor.setAlign('left')} />\n <Btn icon=\"alignCenter\" title=\"Center\" active={st?.algn === 'center'} onClick={() => editor.setAlign('center')} />\n <Btn icon=\"alignRight\" title=\"Align right\" active={st?.algn === 'right'} onClick={() => editor.setAlign('right')} />\n <Btn icon=\"justify\" title=\"Justify\" active={st?.algn === 'justify'} onClick={() => editor.setAlign('justify')} />\n <Dropdown title=\"Vertical align\" icon={VALIGN.find((x) => x.value === anchor)?.icon ?? 'vTop'} label={null} menuWidth={140} value={anchor ?? 't'} options={VALIGN.map((x) => ({ ...x }))} onChange={props.onAnchor} />\n <Dropdown\n title=\"Line spacing\"\n icon=\"lineSpacing\"\n label={null}\n menuWidth={140}\n value={st?.lnPct ? Math.round(st.lnPct * 100) / 100 : ''}\n options={SPACING}\n onChange={(v) => editor.setLineSpacing(v)}\n />\n <Sep />\n <Btn icon=\"bullets\" title=\"Bulleted list\" active={st?.bullet === 'bullet'} onClick={() => editor.toggleBullet('bullet')} />\n <Btn icon=\"numbers\" title=\"Numbered list\" active={st?.bullet === 'number'} onClick={() => editor.toggleBullet('number')} />\n <Btn icon=\"outdent\" title=\"Decrease indent (Shift+Tab)\" disabled={!st?.lvl} onClick={() => editor.indentLevel(-1)} />\n <Btn icon=\"indent\" title=\"Increase indent\" onClick={() => editor.indentLevel(1)} />\n <Btn icon=\"clear\" title=\"Clear formatting\" onClick={() => editor.clearFormat()} />\n </>\n ) : props.shape ? (\n <>\n <ColorBtn icon=\"fill\" title=\"Fill color\" onPick={props.onFill} noneLabel=\"Transparent\" />\n <ColorBtn icon=\"borders\" title=\"Border color\" onPick={(c) => props.onLine({ color: c })} noneLabel=\"Transparent\" />\n <Dropdown title=\"Border weight\" icon=\"lineWeight\" label={null} menuWidth={120} options={LINE_W} onChange={(w) => props.onLine({ w })} />\n <Dropdown title=\"Border dash\" icon=\"lineStyle\" label={null} menuWidth={170} options={DASHES} onChange={(dash) => props.onLine({ dash })} />\n <Sep />\n <Menu\n title=\"Arrange\"\n label=\"Arrange\"\n icon=\"front\"\n items={[\n { value: 'front', label: 'Bring to front', icon: 'front', hint: `${MOD}⇧↑` },\n { value: 'forward', label: 'Bring forward', hint: `${MOD}↑` },\n { value: 'backward', label: 'Send backward', hint: `${MOD}↓` },\n { value: 'back', label: 'Send to back', icon: 'back', hint: `${MOD}⇧↓` },\n ]}\n onPick={(v) => props.onArrange(v as Arrange)}\n />\n <Dropdown\n title=\"Rotate\"\n icon=\"rotate\"\n label={null}\n menuWidth={220}\n options={[\n { value: 'cw', label: 'Rotate 90° clockwise', icon: 'rotate' },\n { value: 'ccw', label: 'Rotate 90° counter-clockwise', icon: 'rotateCcw' },\n { value: 'flipH', label: 'Flip horizontally', icon: 'flipH', sep: true },\n { value: 'flipV', label: 'Flip vertically', icon: 'flipV' },\n ]}\n onChange={(v) => props.onRotate(v as Rotate)}\n />\n <Dropdown\n title=\"Align on slide\"\n icon=\"alignObj\"\n label={null}\n menuWidth={150}\n options={[\n { value: 'left', label: 'Left', icon: 'alignLeft' },\n { value: 'center', label: 'Center', icon: 'alignCenter' },\n { value: 'right', label: 'Right', icon: 'alignRight' },\n { value: 'top', label: 'Top', icon: 'vTop', sep: true },\n { value: 'middle', label: 'Middle', icon: 'vMiddle' },\n { value: 'bottom', label: 'Bottom', icon: 'vBottom' },\n ]}\n onChange={(v) => props.onAlign(v as AlignTo)}\n />\n {props.shape.canText && (\n <Dropdown title=\"Vertical text align\" icon={VALIGN.find((x) => x.value === anchor)?.icon ?? 'vTop'} label={null} menuWidth={140} value={anchor ?? 't'} options={VALIGN.map((x) => ({ ...x }))} onChange={props.onAnchor} />\n )}\n <Sep />\n <Btn icon=\"copy\" title={`Duplicate (${MOD}D)`} onClick={props.onDuplicate} />\n <Btn icon=\"trash\" title=\"Delete (Del)\" onClick={props.onDelete} />\n </>\n ) : (\n <>\n <ColorBtn icon=\"fill\" title=\"Slide background\" onPick={props.onBackground} noneLabel=\"Layout default\" />\n <span className=\"de-tb-hint\">Click a shape or text to edit it</span>\n </>\n )}\n <Sep />\n <Dropdown\n title=\"Present\"\n icon=\"play\"\n label=\"Present\"\n menuWidth={200}\n options={[\n { value: 'cur', label: 'From current slide', hint: 'F5' },\n { value: 'start', label: 'From beginning', hint: '⇧F5' },\n ]}\n onChange={(v) => props.onPresent(v === 'start')}\n />\n </EditorBar>\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { PresentationMeta } from '../../core/pptx/types'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { SlideSlot } from './PptxView'\n\n/** Full-screen slideshow: ←/→/Space/PageUp/PageDown/Home/End, click = next, Esc = exit. */\nexport function Presenter({ client, meta, start, onClose }: { client: DocumentClient; meta: PresentationMeta; start: number; onClose: () => void }) {\n const ref = useRef<HTMLDivElement>(null)\n const visible = meta.slides.filter((s) => !s.hidden).map((s) => s.index)\n const order = visible.length ? visible : meta.slides.map((s) => s.index)\n const [pos, setPos] = useState(Math.max(0, order.findIndex((i) => i >= start)))\n const [vw, setVw] = useState({ w: window.innerWidth, h: window.innerHeight })\n\n useEffect(() => {\n const el = ref.current\n el?.focus()\n el?.requestFullscreen?.().catch(() => {})\n const resize = () => setVw({ w: window.innerWidth, h: window.innerHeight })\n const exitFs = () => !document.fullscreenElement && onClose()\n window.addEventListener('resize', resize)\n document.addEventListener('fullscreenchange', exitFs)\n return () => {\n window.removeEventListener('resize', resize)\n document.removeEventListener('fullscreenchange', exitFs)\n if (document.fullscreenElement) document.exitFullscreen().catch(() => {})\n }\n }, [onClose])\n\n const go = (d: number) => setPos((p) => Math.max(0, Math.min(order.length - 1, p + d)))\n const scale = Math.min(vw.w / meta.w, vw.h / meta.h)\n return (\n <div\n ref={ref}\n className=\"de-present\"\n tabIndex={-1}\n onClick={() => go(1)}\n onContextMenu={(e) => {\n e.preventDefault()\n go(-1)\n }}\n onKeyDown={(e) => {\n if (['ArrowRight', 'ArrowDown', 'PageDown', ' ', 'Enter', 'n'].includes(e.key)) go(1)\n else if (['ArrowLeft', 'ArrowUp', 'PageUp', 'Backspace', 'p'].includes(e.key)) go(-1)\n else if (e.key === 'Home') setPos(0)\n else if (e.key === 'End') setPos(order.length - 1)\n else if (e.key === 'Escape') onClose()\n else return\n e.preventDefault()\n }}\n >\n <div style={{ width: meta.w * scale, height: meta.h * scale }}>\n <SlideSlot key={order[pos]} client={client} index={order[pos]} meta={meta} scale={scale} live />\n </div>\n <div className=\"de-present-n\">\n {pos + 1} / {order.length}\n </div>\n </div>\n )\n}\n","/** SVG paths for common DrawingML preset geometries (box-local px). Unknown presets fall back to a rectangle. */\ntype Adj = Record<string, number> | undefined\n\nconst f = (n: number) => +n.toFixed(2)\nconst poly = (pts: [number, number][]) => 'M' + pts.map(([x, y]) => `${f(x)} ${f(y)}`).join(' L') + ' Z'\nconst a = (adj: Adj, name: string, def: number) => (adj?.[name] ?? def) / 100000\n\nfunction ellipse(w: number, h: number) {\n const rx = w / 2\n const ry = h / 2\n return `M0 ${f(ry)} A${f(rx)} ${f(ry)} 0 1 0 ${f(w)} ${f(ry)} A${f(rx)} ${f(ry)} 0 1 0 0 ${f(ry)} Z`\n}\n\nfunction roundRect(w: number, h: number, r: number) {\n r = Math.min(r, w / 2, h / 2)\n return `M${f(r)} 0 H${f(w - r)} A${f(r)} ${f(r)} 0 0 1 ${f(w)} ${f(r)} V${f(h - r)} A${f(r)} ${f(r)} 0 0 1 ${f(w - r)} ${f(h)} H${f(r)} A${f(r)} ${f(r)} 0 0 1 0 ${f(h - r)} V${f(r)} A${f(r)} ${f(r)} 0 0 1 ${f(r)} 0 Z`\n}\n\nfunction regular(w: number, h: number, n: number, rot = -Math.PI / 2) {\n const pts: [number, number][] = []\n for (let i = 0; i < n; i++) {\n const t = rot + (i * 2 * Math.PI) / n\n pts.push([w / 2 + (w / 2) * Math.cos(t), h / 2 + (h / 2) * Math.sin(t)])\n }\n return poly(pts)\n}\n\nfunction star(w: number, h: number, n: number, inner: number) {\n const pts: [number, number][] = []\n for (let i = 0; i < n * 2; i++) {\n const t = -Math.PI / 2 + (i * Math.PI) / n\n const r = i % 2 ? inner : 1\n pts.push([w / 2 + (w / 2) * r * Math.cos(t), h / 2 + (h / 2) * r * Math.sin(t)])\n }\n return poly(pts)\n}\n\nexport const LINE_GEOMS = new Set(['line', 'straightConnector1', 'bentConnector2', 'bentConnector3', 'bentConnector4', 'curvedConnector3', 'curvedConnector2', 'curvedConnector4'])\n\nexport function geomPath(geom: string, w: number, h: number, adj: Adj): string {\n const ss = Math.min(w, h)\n switch (geom) {\n case 'ellipse':\n case 'flowChartConnector':\n case 'cloud':\n return ellipse(w, h)\n case 'roundRect':\n case 'flowChartAlternateProcess':\n return roundRect(w, h, ss * a(adj, 'adj', 16667))\n case 'flowChartTerminator':\n return roundRect(w, h, h / 2)\n case 'triangle': {\n const x = w * a(adj, 'adj', 50000)\n return poly([[x, 0], [w, h], [0, h]])\n }\n case 'rtTriangle':\n return poly([[0, 0], [w, h], [0, h]])\n case 'diamond':\n case 'flowChartDecision':\n return poly([[w / 2, 0], [w, h / 2], [w / 2, h], [0, h / 2]])\n case 'parallelogram':\n case 'flowChartInputOutput': {\n const o = ss * a(adj, 'adj', 25000)\n return poly([[o, 0], [w, 0], [w - o, h], [0, h]])\n }\n case 'trapezoid': {\n const o = ss * a(adj, 'adj', 25000)\n return poly([[o, 0], [w - o, 0], [w, h], [0, h]])\n }\n case 'pentagon':\n return regular(w, h, 5)\n case 'hexagon': {\n const o = ss * a(adj, 'adj', 25000)\n return poly([[o, 0], [w - o, 0], [w, h / 2], [w - o, h], [o, h], [0, h / 2]])\n }\n case 'heptagon':\n return regular(w, h, 7)\n case 'octagon': {\n const o = ss * a(adj, 'adj', 29289)\n return poly([[o, 0], [w - o, 0], [w, o], [w, h - o], [w - o, h], [o, h], [0, h - o], [0, o]])\n }\n case 'decagon':\n return regular(w, h, 10)\n case 'dodecagon':\n return regular(w, h, 12)\n case 'star4':\n return star(w, h, 4, 0.38)\n case 'star5':\n return star(w, h, 5, 0.38)\n case 'star6':\n return star(w, h, 6, 0.5)\n case 'star8':\n return star(w, h, 8, 0.6)\n case 'star10':\n case 'star12':\n case 'star16':\n case 'star24':\n return star(w, h, Number(geom.slice(4)), 0.7)\n case 'homePlate': {\n const o = ss * a(adj, 'adj', 50000)\n return poly([[0, 0], [w - o, 0], [w, h / 2], [w - o, h], [0, h]])\n }\n case 'chevron': {\n const o = ss * a(adj, 'adj', 50000)\n return poly([[0, 0], [w - o, 0], [w, h / 2], [w - o, h], [0, h], [o, h / 2]])\n }\n case 'rightArrow':\n case 'leftArrow': {\n const t = h * a(adj, 'adj1', 50000)\n const hl = ss * a(adj, 'adj2', 50000)\n const y0 = (h - t) / 2\n const pts: [number, number][] = [[0, y0], [w - hl, y0], [w - hl, 0], [w, h / 2], [w - hl, h], [w - hl, y0 + t], [0, y0 + t]]\n return poly(geom === 'leftArrow' ? pts.map(([x, y]) => [w - x, y]) : pts)\n }\n case 'upArrow':\n case 'downArrow': {\n const t = w * a(adj, 'adj1', 50000)\n const hl = ss * a(adj, 'adj2', 50000)\n const x0 = (w - t) / 2\n const pts: [number, number][] = [[x0, h], [x0, hl], [0, hl], [w / 2, 0], [w, hl], [x0 + t, hl], [x0 + t, h]]\n return poly(geom === 'downArrow' ? pts.map(([x, y]) => [x, h - y]) : pts)\n }\n case 'leftRightArrow': {\n const t = h * a(adj, 'adj1', 50000)\n const hl = ss * a(adj, 'adj2', 50000)\n const y0 = (h - t) / 2\n return poly([[0, h / 2], [hl, 0], [hl, y0], [w - hl, y0], [w - hl, 0], [w, h / 2], [w - hl, h], [w - hl, y0 + t], [hl, y0 + t], [hl, h]])\n }\n case 'plus':\n case 'mathPlus': {\n const o = ss * a(adj, 'adj', 25000)\n return poly([[o, 0], [w - o, 0], [w - o, o], [w, o], [w, h - o], [w - o, h - o], [w - o, h], [o, h], [o, h - o], [0, h - o], [0, o], [o, o]])\n }\n case 'snip1Rect': {\n const o = ss * a(adj, 'adj', 16667)\n return poly([[0, 0], [w - o, 0], [w, o], [w, h], [0, h]])\n }\n case 'snip2SameRect': {\n const o = ss * a(adj, 'adj1', 16667)\n return poly([[o, 0], [w - o, 0], [w, o], [w, h], [0, h], [0, o]])\n }\n case 'round1Rect':\n case 'round2SameRect': {\n const r = ss * a(adj, 'adj1', 16667) || ss * a(adj, 'adj', 16667)\n return `M${f(r)} 0 H${f(w - r)} A${f(r)} ${f(r)} 0 0 1 ${f(w)} ${f(r)} V${f(h)} H0 V${f(r)} A${f(r)} ${f(r)} 0 0 1 ${f(r)} 0 Z`\n }\n case 'can':\n case 'flowChartMagneticDisk': {\n const ry = ss * a(adj, 'adj', 25000) / 2\n return `M0 ${f(ry)} A${f(w / 2)} ${f(ry)} 0 0 1 ${f(w)} ${f(ry)} V${f(h - ry)} A${f(w / 2)} ${f(ry)} 0 0 1 0 ${f(h - ry)} Z M0 ${f(ry)} A${f(w / 2)} ${f(ry)} 0 0 0 ${f(w)} ${f(ry)}`\n }\n case 'donut': {\n const t = ss * a(adj, 'adj', 25000)\n return ellipse(w, h) + ` M${f(t)} ${f(h / 2)} A${f(w / 2 - t)} ${f(h / 2 - t)} 0 1 1 ${f(w - t)} ${f(h / 2)} A${f(w / 2 - t)} ${f(h / 2 - t)} 0 1 1 ${f(t)} ${f(h / 2)} Z`\n }\n case 'heart':\n return `M${f(w / 2)} ${f(h * 0.25)} C${f(w / 2)} 0 0 0 0 ${f(h * 0.3)} C0 ${f(h * 0.6)} ${f(w / 2)} ${f(h * 0.8)} ${f(w / 2)} ${f(h)} C${f(w / 2)} ${f(h * 0.8)} ${f(w)} ${f(h * 0.6)} ${f(w)} ${f(h * 0.3)} C${f(w)} 0 ${f(w / 2)} 0 ${f(w / 2)} ${f(h * 0.25)} Z`\n case 'wedgeRectCallout':\n case 'wedgeRoundRectCallout': {\n const tx = w / 2 + w * a(adj, 'adj1', -20833)\n const ty = h / 2 + h * a(adj, 'adj2', 62500)\n return poly([[0, 0], [w, 0], [w, h], [w * 0.58, h], [tx, ty], [w * 0.42, h], [0, h]])\n }\n case 'line':\n case 'straightConnector1':\n return `M0 0 L${f(w)} ${f(h)}`\n case 'bentConnector2':\n return `M0 0 H${f(w)} V${f(h)}`\n case 'bentConnector3': {\n const x = w * a(adj, 'adj1', 50000)\n return `M0 0 H${f(x)} V${f(h)} H${f(w)}`\n }\n case 'bentConnector4':\n return `M0 0 H${f(w / 2)} V${f(h)} H${f(w)}`\n case 'curvedConnector2':\n case 'curvedConnector3':\n case 'curvedConnector4':\n return `M0 0 C${f(w / 2)} 0 ${f(w / 2)} ${f(h)} ${f(w)} ${f(h)}`\n default:\n return `M0 0 H${f(w)} V${f(h)} H0 Z`\n }\n}\n","import { memo, useId, type CSSProperties, type ReactNode } from 'react'\nimport type { Box, Fill, SlideEl, SlideModel, Stroke, TCell, TextBody, TRun } from '../../core/pptx/types'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { useMediaUrl } from '../common/hooks'\nimport { geomPath, LINE_GEOMS } from './geometry'\n\nfunction boxStyle(b: Box): CSSProperties {\n const t: string[] = []\n if (b.rot) t.push(`rotate(${b.rot}deg)`)\n return { left: b.x, top: b.y, width: b.w, height: b.h, transform: t.length ? t.join(' ') : undefined }\n}\n\nfunction useFillCss(client: DocumentClient, fill: Fill | undefined, enabled: boolean): CSSProperties | undefined {\n const url = useMediaUrl(client, fill?.t === 'img' ? fill.target : undefined, enabled)\n if (!fill) return undefined\n switch (fill.t) {\n case 'solid':\n return { background: fill.c }\n case 'grad':\n return { background: fill.css }\n case 'img':\n return url && url !== 'unsupported'\n ? { backgroundImage: `url(\"${url}\")`, backgroundSize: fill.tile ? 'auto' : '100% 100%', backgroundRepeat: fill.tile ? 'repeat' : 'no-repeat' }\n : undefined\n default:\n return undefined\n }\n}\n\nfunction runStyle(r: TRun): CSSProperties {\n const s: CSSProperties = { fontSize: `${r.baseline ? r.sz * 0.65 : r.sz}pt` }\n if (r.b) s.fontWeight = 700\n if (r.i) s.fontStyle = 'italic'\n const deco = [r.u ? 'underline' : '', r.strike ? 'line-through' : ''].filter(Boolean).join(' ')\n if (deco) s.textDecoration = deco\n if (r.color) s.color = r.color\n if (r.font) s.fontFamily = r.font\n if (r.baseline) s.verticalAlign = r.baseline > 0 ? 'super' : 'sub'\n if (r.caps) s.textTransform = 'uppercase'\n if (r.hl) s.background = r.hl\n return s\n}\n\nexport interface TextEdit {\n /** contentEditable root callback */\n root: (el: HTMLDivElement | null) => void\n}\n\nexport function TextView({ text, flow, edit }: { text: TextBody; flow?: boolean; edit?: TextEdit }) {\n const [l, t, r, b] = text.ins\n const style: CSSProperties = {\n ...(flow ? { position: 'relative', inset: 'auto', minHeight: '100%' } : {}),\n padding: `${t}px ${r}px ${b}px ${l}px`,\n justifyContent: text.anchor === 'ctr' ? 'center' : text.anchor === 'b' ? 'flex-end' : 'flex-start',\n }\n if (text.vert) style.writingMode = text.vert === 'vert270' ? 'sideways-lr' : 'vertical-rl'\n if (text.empty && !edit) return <div className=\"de-txt\" style={style} />\n return (\n <div\n ref={edit?.root}\n className={(text.wrap ? 'de-txt' : 'de-txt de-nowrap') + (edit ? ' de-txt-edit' : '')}\n style={style}\n contentEditable={edit ? true : undefined}\n suppressContentEditableWarning\n spellCheck={edit ? false : undefined}\n >\n {text.paras.map((p, i) => {\n const ps: CSSProperties = {\n textAlign: p.algn,\n paddingLeft: p.marL || undefined,\n textIndent: p.indent || undefined,\n paddingTop: p.spcBef || undefined,\n paddingBottom: p.spcAft || undefined,\n lineHeight: p.lnPx ? `${p.lnPx}px` : p.lnPct ? +(p.lnPct * 1.2).toFixed(3) : 1.2,\n }\n if (!p.runs.length || p.runs.every((x) => !x.text && !x.br)) ps.fontSize = `${p.endSz}pt`\n const hang = p.indent < 0 ? -p.indent : 0\n let o = 0\n const nodes: ReactNode[] = p.runs.map((r, k) => {\n const at = o\n o += r.fld ? 1 : r.br ? 1 : r.text.length\n if (edit) {\n if (r.fld)\n return (\n <span key={k} data-o={at} data-obj=\"\" contentEditable={false} style={runStyle(r)}>\n {r.text}\n </span>\n )\n return (\n <span key={k} data-o={at} style={runStyle(r)}>\n {r.br ? '\\n' : r.text}\n </span>\n )\n }\n return r.br ? (\n <br key={k} />\n ) : r.href ? (\n <a key={k} href={r.href} target=\"_blank\" rel=\"noreferrer noopener\" style={{ color: 'inherit' }}>\n <span style={runStyle(r)}>{r.text}</span>\n </a>\n ) : (\n <span key={k} style={runStyle(r)}>\n {r.text}\n </span>\n )\n })\n const empty = o === 0\n return (\n <div key={i} style={ps} data-pa={edit ? String(i) : undefined}>\n {p.bullet && !empty && (\n <span\n className=\"de-bul\"\n contentEditable={edit ? false : undefined}\n style={{ minWidth: hang || undefined, paddingRight: hang ? undefined : '0.4em', fontSize: `${p.bullet.sz}pt`, color: p.bullet.color, fontFamily: p.bullet.font }}\n >\n {p.bullet.text}\n </span>\n )}\n {nodes}\n {empty &&\n (edit ? (\n <span data-o={0} data-empty=\"\">\n {'\\u200B'}\n </span>\n ) : (\n '\\u200B'\n ))}\n </div>\n )\n })}\n </div>\n )\n}\n\nfunction Marker({ id, s }: { id: string; s: Stroke }) {\n return (\n <marker id={id} viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerWidth=\"4\" markerHeight=\"4\" orient=\"auto-start-reverse\">\n <path d=\"M0 0 L10 5 L0 10 Z\" fill={s.c} />\n </marker>\n )\n}\n\nexport interface SlideEditing {\n sid: number\n text: TextBody\n edit: TextEdit\n}\n\nfunction ShapeView({ el, client, live, editing }: { el: Extract<SlideEl, { t: 'shape' }>; client: DocumentClient; live: boolean; editing?: SlideEditing }) {\n const id = useId().replace(/:/g, '')\n const { box } = el\n const isLine = LINE_GEOMS.has(el.geom)\n const fillCss = useFillCss(client, el.fill, live)\n const d = el.path ?? geomPath(el.geom, box.w, box.h, el.adj)\n const flipped = box.flipH || box.flipV\n const flip = flipped ? `translate(${box.flipH ? box.w : 0} ${box.flipV ? box.h : 0}) scale(${box.flipH ? -1 : 1} ${box.flipV ? -1 : 1})` : undefined\n const isRect = !isLine && !el.path && (el.geom === 'rect' || el.geom === 'flowChartProcess')\n const solid = !isLine && el.fill?.t === 'solid' ? el.fill.c : undefined\n const css = !isLine && fillCss && el.fill?.t !== 'solid' ? fillCss : undefined\n const s = el.stroke\n const w = Math.max(box.w, 1)\n const h = Math.max(box.h, 1)\n return (\n <div className=\"de-el\" style={boxStyle(box)} data-sid={el.sid !== undefined && el.text ? el.sid : undefined} data-top={el.top}>\n {isRect && !s && (solid || css) ? (\n <div style={{ position: 'absolute', inset: 0, ...(css ?? { background: solid }) }} />\n ) : (\n <>\n {css && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n ...css,\n clipPath: isRect ? undefined : `path(\"${d}\")`,\n transform: flipped ? `scale(${box.flipH ? -1 : 1}, ${box.flipV ? -1 : 1})` : undefined,\n }}\n />\n )}\n {(solid || s) && (\n <svg width={w} height={h} viewBox={`0 0 ${w} ${h}`} style={{ position: 'absolute', left: 0, top: 0, overflow: 'visible' }}>\n {s && (s.head || s.tail) && (\n <defs>\n {s.head && <Marker id={`h${id}`} s={s} />}\n {s.tail && <Marker id={`t${id}`} s={s} />}\n </defs>\n )}\n <path\n d={d}\n transform={flip}\n fill={solid ?? 'none'}\n fillRule=\"evenodd\"\n stroke={s?.c ?? 'none'}\n strokeWidth={s?.w}\n strokeDasharray={s?.dash}\n strokeLinejoin=\"round\"\n markerStart={s?.head ? `url(#h${id})` : undefined}\n markerEnd={s?.tail ? `url(#t${id})` : undefined}\n />\n </svg>\n )}\n </>\n )}\n {editing && editing.sid === el.sid ? <TextView text={editing.text} edit={editing.edit} /> : el.text && <TextView text={el.text} />}\n </div>\n )\n}\n\nfunction PicView({ el, client, live }: { el: Extract<SlideEl, { t: 'pic' }>; client: DocumentClient; live: boolean }) {\n const url = useMediaUrl(client, el.target, live)\n const { box } = el\n const style: CSSProperties = { ...boxStyle(box), overflow: 'hidden' }\n const top = el.top\n if (el.geom === 'ellipse') style.borderRadius = '50%'\n else if (el.geom === 'roundRect') style.borderRadius = Math.min(box.w, box.h) * 0.1667\n if (el.stroke) style.outline = `${el.stroke.w}px solid ${el.stroke.c}`\n let img: CSSProperties = { position: 'absolute', left: 0, top: 0, width: '100%', height: '100%' }\n if (el.crop) {\n const [l, t, r, b] = el.crop\n const sw = box.w / Math.max(0.01, 1 - l - r)\n const sh = box.h / Math.max(0.01, 1 - t - b)\n img = { position: 'absolute', left: -l * sw, top: -t * sh, width: sw, height: sh }\n }\n const flip = box.flipH || box.flipV ? `scale(${box.flipH ? -1 : 1}, ${box.flipV ? -1 : 1})` : undefined\n if (flip) img.transform = flip\n return (\n <div className=\"de-el\" style={style} data-top={top}>\n {url && url !== 'unsupported' ? (\n <img src={url} alt=\"\" style={img} draggable={false} />\n ) : url === 'unsupported' ? (\n <div className=\"de-ph\" style={{ width: '100%', height: '100%' }}>\n {el.target?.split('.').pop()?.toUpperCase()} image\n </div>\n ) : null}\n {el.video && <div className=\"de-ph\" style={{ position: 'absolute', right: 8, bottom: 8, padding: '2px 6px', border: 0, background: 'rgba(0,0,0,.6)', color: '#fff' }}>▶ media</div>}\n </div>\n )\n}\n\nconst strokeCss = (s: Stroke | undefined) => (s ? `${Math.max(1, s.w)}px solid ${s.c}` : undefined)\n\nfunction CellView({ cell, client, live, h }: { cell: TCell; client: DocumentClient; live: boolean; h: number }) {\n const fill = useFillCss(client, cell.fill, live)\n return (\n <td\n colSpan={cell.colSpan > 1 ? cell.colSpan : undefined}\n rowSpan={cell.rowSpan > 1 ? cell.rowSpan : undefined}\n style={{ ...(fill ?? {}), borderLeft: strokeCss(cell.bl), borderRight: strokeCss(cell.br), borderTop: strokeCss(cell.bt), borderBottom: strokeCss(cell.bb), height: h }}\n >\n {cell.text && <TextView text={cell.text} flow />}\n </td>\n )\n}\n\nfunction TableView({ el, client, live }: { el: Extract<SlideEl, { t: 'table' }>; client: DocumentClient; live: boolean }) {\n return (\n <div className=\"de-el\" style={{ ...boxStyle(el.box), height: 'auto' }} data-top={el.top}>\n <table className=\"de-stbl\">\n <colgroup>\n {el.cols.map((w, i) => (\n <col key={i} style={{ width: w }} />\n ))}\n </colgroup>\n <tbody>\n {el.rows.map((r, ri) => (\n <tr key={ri}>\n {r.cells.map((c, ci) => (c.hidden ? null : <CellView key={ci} cell={c} client={client} live={live} h={r.h} />))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction ElView({ el, client, live, editing }: { el: SlideEl; client: DocumentClient; live: boolean; editing?: SlideEditing }) {\n switch (el.t) {\n case 'shape':\n return <ShapeView el={el} client={client} live={live} editing={editing} />\n case 'pic':\n return <PicView el={el} client={client} live={live} />\n case 'table':\n return <TableView el={el} client={client} live={live} />\n case 'placeholder':\n return (\n <div className=\"de-el de-ph\" style={{ ...boxStyle(el.box), display: 'flex' }} data-top={el.top}>\n {el.label}\n </div>\n )\n }\n}\n\nexport interface SlideViewProps {\n model: SlideModel\n client: DocumentClient\n scale: number\n /** load media (false for far-away thumbnails) */\n live?: boolean\n editing?: SlideEditing\n /** extra layer drawn in slide coordinates (selection handles) */\n overlay?: ReactNode\n}\n\nexport const SlideView = memo(function SlideView({ model, client, scale, live = true, editing, overlay }: SlideViewProps) {\n const bg = useFillCss(client, model.bg, live)\n return (\n <div className={model.hidden ? 'de-slide de-hidden-slide' : 'de-slide'} style={{ width: model.w * scale, height: model.h * scale }}>\n <div className=\"de-slide-inner\" style={{ width: model.w, height: model.h, transform: `scale(${scale})`, background: '#fff', ...(bg ?? {}) }}>\n {model.els.map((el, i) => (\n <ElView key={i} el={el} client={client} live={live} editing={editing} />\n ))}\n {overlay}\n </div>\n </div>\n )\n})\n","import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport type { Box, PresentationMeta, ShapeKind, ShapeOp, SlideModel, SlideOp } from '../../core/pptx/types'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { claimFocus, useForceUpdate, useIsoLayoutEffect, useScroll, useSize } from '../common/hooks'\nimport { useFileOps, useViewer, useSelectAll } from '../common/Slots'\nimport { slidesToText } from '../file/text'\nimport { Status } from '../common/Status'\nimport { ZoomControl, type Zoom } from '../common/ZoomControl'\nimport { getSel } from '../edit/input'\nimport { PptxEditor } from './PptxEditor'\nimport { PptxToolbar, type AlignTo, type Arrange, type Rotate, type SlideCmd } from './PptxToolbar'\nimport { ContextMenu, MOD, type MenuItem } from '../common/ContextMenu'\nimport { Presenter } from './Presenter'\nimport { pickFiles } from '../edit/Toolbar'\nimport { SlideView, type SlideEditing } from './Slide'\nimport { publishLocal, registerHost } from '../../collab/hosts'\n\ninterface SlideCache {\n models: Map<number, SlideModel>\n pending: Map<number, Promise<SlideModel>>\n listeners: Map<number, Set<(m: SlideModel) => void>>\n}\n\nconst caches = new WeakMap<DocumentClient, SlideCache>()\n\nfunction cacheFor(client: DocumentClient): SlideCache {\n let c = caches.get(client)\n if (!c) caches.set(client, (c = { models: new Map(), pending: new Map(), listeners: new Map() }))\n return c\n}\n\n/** replaces a cached slide (after an edit) and notifies mounted views */\nfunction putSlide(client: DocumentClient, index: number, m: SlideModel) {\n const c = cacheFor(client)\n c.models.set(index, m)\n for (const fn of c.listeners.get(index) ?? []) fn(m)\n}\n\n/** forget every cached slide (after slides were added / removed / reordered) */\nfunction resetSlides(client: DocumentClient) {\n const c = cacheFor(client)\n c.models.clear()\n c.pending.clear()\n}\n\nexport function useSlide(client: DocumentClient, index: number): SlideModel | { error: string } | undefined {\n const cache = cacheFor(client)\n const [model, setModel] = useState<SlideModel | { error: string } | undefined>(() => cache.models.get(index))\n useEffect(() => {\n let set = cache.listeners.get(index)\n if (!set) cache.listeners.set(index, (set = new Set()))\n const fn = (m: SlideModel) => setModel(m)\n set.add(fn)\n return () => {\n set!.delete(fn)\n }\n }, [cache, index])\n useEffect(() => {\n const hit = cache.models.get(index)\n if (hit) return setModel(hit)\n let live = true\n let p = cache.pending.get(index)\n if (!p) {\n p = client.call('pptx.slide', index)\n cache.pending.set(index, p)\n p.then((m) => {\n cache.models.set(index, m)\n cache.pending.delete(index)\n if (cache.models.size > 120) cache.models.delete(cache.models.keys().next().value as number)\n }, () => cache.pending.delete(index))\n }\n p.then(\n (m) => live && setModel(m),\n (e) => live && setModel({ error: (e as Error).message }),\n )\n return () => {\n live = false\n }\n }, [client, cache, index])\n return model\n}\n\nexport function SlideSlot(props: { client: DocumentClient; index: number; meta: PresentationMeta; scale: number; live: boolean; editing?: SlideEditing; overlay?: ReactNode }) {\n const { client, index, meta, scale, live, editing, overlay } = props\n const model = useSlide(client, index)\n if (!model) return <div className=\"de-slide\" style={{ width: meta.w * scale, height: meta.h * scale, background: '#fff' }} />\n if ('error' in model) {\n return (\n <div className=\"de-slide de-ph\" style={{ width: meta.w * scale, height: meta.h * scale, display: 'flex' }}>\n {model.error}\n </div>\n )\n }\n return <SlideView model={model} client={client} scale={scale} live={live} editing={editing} overlay={overlay} />\n}\n\ntype DragMode = 'move' | 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw'\nconst HANDLES: DragMode[] = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w']\n\nfunction boxOf(model: SlideModel | undefined, top: number): Box | undefined {\n const els = model?.els.filter((e) => e.top === top) ?? []\n if (!els.length) return undefined\n const x0 = Math.min(...els.map((e) => e.box.x))\n const y0 = Math.min(...els.map((e) => e.box.y))\n const x1 = Math.max(...els.map((e) => e.box.x + e.box.w))\n const y1 = Math.max(...els.map((e) => e.box.y + e.box.h))\n return { x: x0, y: y0, w: x1 - x0, h: y1 - y0, rot: els.length === 1 ? els[0].box.rot : undefined }\n}\n\nfunction resized(b: Box, mode: DragMode, dx: number, dy: number, keep: boolean): Box {\n if (mode === 'move') return { ...b, x: b.x + dx, y: b.y + dy }\n let { x, y, w, h } = b\n if (mode.includes('e')) w += dx\n if (mode.includes('s')) h += dy\n if (mode.includes('w')) {\n x += dx\n w -= dx\n }\n if (mode.includes('n')) {\n y += dy\n h -= dy\n }\n if (keep && mode.length === 2 && b.w && b.h) {\n const k = Math.max(w / b.w, h / b.h)\n const nw = b.w * k\n const nh = b.h * k\n if (mode.includes('w')) x = b.x + b.w - nw\n if (mode.includes('n')) y = b.y + b.h - nh\n w = nw\n h = nh\n }\n return { ...b, x, y, w: Math.max(4, w), h: Math.max(4, h) }\n}\n\nfunction Selection({ box, scale, onHandle }: { box: Box; scale: number; onHandle: (m: DragMode, e: React.MouseEvent) => void }) {\n const hs = 9 / scale\n const pos: Record<DragMode, [number, number]> = { nw: [0, 0], n: [0.5, 0], ne: [1, 0], e: [1, 0.5], se: [1, 1], s: [0.5, 1], sw: [0, 1], w: [0, 0.5], move: [0, 0] }\n return (\n <div className=\"de-shape-sel\" style={{ left: box.x, top: box.y, width: box.w, height: box.h, borderWidth: 1.5 / scale, transform: box.rot ? `rotate(${box.rot}deg)` : undefined }}>\n {HANDLES.map((m) => (\n <div\n key={m}\n className={`de-handle de-h-${m}`}\n style={{ width: hs, height: hs, left: pos[m][0] * box.w - hs / 2, top: pos[m][1] * box.h - hs / 2, borderWidth: 1 / scale }}\n onMouseDown={(e) => {\n e.stopPropagation()\n e.preventDefault()\n onHandle(m, e)\n }}\n />\n ))}\n </div>\n )\n}\n\nexport interface PptxViewProps {\n client: DocumentClient\n onStatus?: (s: string) => void\n initialZoom?: Zoom\n thumbnails?: boolean\n}\n\nconst PAD = 24\nconst GAP = 24\nconst THUMB_W = 188\n\nexport function PptxView({ client, onStatus, initialZoom = 'fit', thumbnails = true }: PptxViewProps) {\n const viewer = useViewer()\n const meta = client.info.pptx as PresentationMeta\n useFileOps({\n printable: async () => {\n const m = client.info.pptx as PresentationMeta\n // hidden flags are known once a slide is parsed: filter on the models\n const all = await Promise.all(m.slides.map((s) => client.call('pptx.slide', s.index)))\n const shown = all.filter((s) => !s.hidden)\n const slides = shown.length ? shown : all\n return {\n size: `${m.w}px ${m.h}px`,\n margin: '0',\n node: slides.map((model) => (\n <div key={model.index} className=\"de-print-page\" style={{ width: m.w, height: m.h }}>\n <SlideView model={{ ...model, hidden: false }} client={client} scale={1} />\n </div>\n )),\n }\n },\n text: async () => {\n const m = client.info.pptx as PresentationMeta\n return slidesToText(await Promise.all(m.slides.map((s) => client.call('pptx.slide', s.index))))\n },\n stats: () => {\n const m = client.info.pptx as PresentationMeta\n return [\n ['Slides', m.count.toLocaleString()],\n ['Slide size', `${+(m.w / 96).toFixed(2)} × ${+(m.h / 96).toFixed(2)} in`],\n ]\n },\n })\n const [rootRef, rootSize] = useSize<HTMLDivElement>()\n const [scrollRef, size] = useSize<HTMLDivElement>()\n const scroll = useScroll(scrollRef)\n const thumbRef = useRef<HTMLDivElement>(null)\n const thumbScroll = useScroll(thumbRef)\n const [zoom, setZoom] = useState<Zoom>(initialZoom)\n const showThumbs = thumbnails && rootSize.w >= 720 && meta.count > 1\n const [, bump] = useForceUpdate()\n const editor = useMemo(() => new PptxEditor(client), [client])\n const caretAt = useRef<{ x: number; y: number } | null>(null)\n const textRoot = useRef<HTMLDivElement | null>(null)\n const slidesRef = useRef<HTMLDivElement>(null)\n const [selected, setSelected] = useState<{ slide: number; top: number } | null>(null)\n const [drag, setDrag] = useState<{ slide: number; top: number; mode: DragMode; sx: number; sy: number; box: Box; cur: Box; moved: boolean; sid?: number; px: number; py: number } | null>(null)\n const [slidesVer, setSlidesVer] = useState(0)\n const [presenting, setPresenting] = useState<number | null>(null)\n const [ctxMenu, setCtxMenu] = useState<{ x: number; y: number; items: MenuItem[] } | null>(null)\n /** shape edits that can be undone */\n const [undoDepth, setUndoDepth] = useState(0)\n\n const fitW = size.w ? (size.w - PAD * 2) / meta.w : 1\n const fitH = size.h ? (size.h - PAD * 2) / meta.h : 1\n const fit = Math.max(0.1, Math.min(fitW, Math.max(fitH, fitW * 0.6), 2))\n const scale = zoom === 'fit' ? fit : zoom\n const slideH = meta.h * scale\n const slideW = meta.w * scale\n const pitch = slideH + GAP\n const totalH = PAD * 2 + meta.count * pitch - GAP\n const totalW = Math.max(size.w, slideW + PAD * 2)\n const left = Math.max(PAD, (totalW - slideW) / 2)\n const first = Math.max(0, Math.floor((scroll.y - PAD) / pitch) - 1)\n const last = Math.min(meta.count - 1, Math.floor((scroll.y + size.h) / pitch) + 1)\n const current = Math.min(meta.count - 1, Math.max(0, Math.floor((scroll.y + size.h / 3 - PAD) / pitch)))\n\n // thumbnails\n const tScale = (THUMB_W - 46) / meta.w\n const tH = meta.h * tScale\n const tPitch = tH + 14\n const tFirst = Math.max(0, Math.floor(thumbScroll.y / tPitch) - 1)\n const tLast = Math.min(meta.count - 1, Math.floor((thumbScroll.y + size.h) / tPitch) + 1)\n\n // keep the active thumbnail in view\n useEffect(() => {\n const el = thumbRef.current\n if (!el) return\n const y = 10 + current * tPitch\n if (y < el.scrollTop || y + tH > el.scrollTop + el.clientHeight) el.scrollTop = y - el.clientHeight / 2 + tH / 2\n }, [current, tPitch, tH])\n\n // ---- editing ----\n useEffect(() => {\n editor.onChange = bump\n editor.onDirty = () => viewer.setDirty(true)\n editor.onCommitted = (slide, m) => putSlide(client, slide, m)\n editor.shortcut = (e) => {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 's') {\n void viewer.save()\n return true\n }\n if (e.key === 'Escape') {\n stopEditing()\n return true\n }\n return false\n }\n })\n useEffect(() => {\n if (!viewer.editable) stopEditing()\n return () => editor.end()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [viewer.editable])\n\n // keyboard first: slide navigation and shortcuts work without a click (a focused host page control keeps the focus)\n useEffect(() => void claimFocus(scrollRef.current), []) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Ctrl/⌘+A: the text being edited, otherwise the rendered slides' text (not the viewer around them)\n useSelectAll(() => {\n const root = editor.active ? textRoot.current : slidesRef.current\n if (root) getSel(root)?.selectAllChildren(root)\n })\n\n const stopEditing = () => {\n if (!editor.active) return\n editor.end()\n if (textRoot.current) getSel(textRoot.current)?.removeAllRanges()\n // keep keyboard shortcuts (Del, ⌘D, arrows…) working on the shape that stays selected\n scrollRef.current?.focus({ preventScroll: true })\n bump()\n }\n\n // ---- collaboration (src/collab) ----\n const stopRef = useRef(stopEditing)\n stopRef.current = stopEditing\n useEffect(() => registerHost(client, 'pptx', { endEditing: () => stopRef.current() }), [client])\n useEffect(\n () =>\n client.on('collab:pptx', (r) => {\n if (r.meta) {\n resetSlides(client)\n setSelected(null)\n setSlidesVer((v) => v + 1)\n } else if (r.slide !== undefined && r.model) putSlide(client, r.slide, r.model)\n }),\n [client],\n )\n useEffect(() => publishLocal(client, { slide: selected?.slide ?? current, top: selected?.top }), [client, selected?.slide, selected?.top, current])\n\n const editing: SlideEditing | undefined =\n editor.active && editor.text()\n ? {\n sid: editor.sid,\n text: editor.text()!,\n edit: {\n root: (el) => {\n textRoot.current = el\n if (el) editor.input.attach(el)\n },\n },\n }\n : undefined\n\n useIsoLayoutEffect(() => {\n const root = textRoot.current\n if (!editor.active || !root) return\n if (caretAt.current) {\n const { x, y } = caretAt.current\n caretAt.current = null\n root.focus({ preventScroll: true })\n const d = root.ownerDocument as Document & { caretPositionFromPoint?: (x: number, y: number) => { offsetNode: Node; offset: number } | null }\n const pos = d.caretPositionFromPoint?.(x, y)\n const range = pos ? null : d.caretRangeFromPoint?.(x, y)\n const node = pos?.offsetNode ?? range?.startContainer\n const off = pos?.offset ?? range?.startOffset ?? 0\n const s = getSel(root)\n if (node && root.contains(node)) s?.collapse(node, off)\n else {\n s?.selectAllChildren(root)\n s?.collapseToEnd()\n }\n editor.input.lastSel = editor.input.readSel()\n return\n }\n const sel = editor.pendingSel\n if (sel) {\n editor.pendingSel = null\n editor.input.restore(sel)\n }\n })\n\n const modelOf = (i: number) => cacheFor(client).models.get(i)\n\n const beginText = (index: number, sid: number, x: number, y: number) => {\n const el = modelOf(index)?.els.find((e) => e.t === 'shape' && e.sid === sid)\n if (!el || el.t !== 'shape' || !el.text) return\n editor.begin(index, sid, el.text)\n caretAt.current = { x, y }\n bump()\n }\n\n const onSlideMouseDown = (index: number, e: React.MouseEvent) => {\n if (!viewer.editable || e.button !== 0) return\n const t = e.target as HTMLElement\n if (editor.active && textRoot.current?.contains(t)) return\n const topEl = t.closest('[data-top]') as HTMLElement | null\n const top = topEl ? Number(topEl.dataset.top) : NaN\n stopEditing()\n if (!topEl || Number.isNaN(top)) {\n setSelected(null)\n return\n }\n e.preventDefault()\n scrollRef.current?.focus({ preventScroll: true })\n const box = boxOf(modelOf(index), top)\n setSelected({ slide: index, top })\n if (!box) return\n const sidEl = t.closest('[data-sid]') as HTMLElement | null\n setDrag({ slide: index, top, mode: 'move', sx: e.clientX, sy: e.clientY, box, cur: box, moved: false, sid: sidEl ? Number(sidEl.dataset.sid) : undefined, px: e.clientX, py: e.clientY })\n }\n\n const runShapes = async (slide: number, ops: ShapeOp[], selectNew = false) => {\n try {\n const m = await client.call('pptx.shapes', slide, ops)\n putSlide(client, slide, m)\n viewer.setDirty(true)\n setUndoDepth((d) => d + 1)\n if (selectNew) {\n const tops = m.els.map((x) => x.top ?? -1)\n setSelected({ slide, top: Math.max(...tops) })\n }\n return m\n } catch (err) {\n console.error('[office-engine]', err)\n }\n }\n\n useEffect(() => {\n if (!drag) return\n const move = (e: MouseEvent) => {\n const dx = (e.clientX - drag.sx) / scale\n const dy = (e.clientY - drag.sy) / scale\n const moved = drag.moved || Math.abs(e.clientX - drag.sx) + Math.abs(e.clientY - drag.sy) > 3\n setDrag({ ...drag, moved, cur: moved ? resized(drag.box, drag.mode, dx, dy, e.shiftKey) : drag.box })\n }\n const up = () => {\n const d = drag\n setDrag(null)\n if (d.moved) void runShapes(d.slide, [{ op: 'xfrm', top: d.top, box: d.cur }])\n // a click on text edits it (Esc then selects the whole shape, like PowerPoint)\n else if (d.mode === 'move' && d.sid !== undefined) beginText(d.slide, d.sid, d.px, d.py)\n }\n window.addEventListener('mousemove', move)\n window.addEventListener('mouseup', up, { once: true })\n return () => {\n window.removeEventListener('mousemove', move)\n window.removeEventListener('mouseup', up)\n }\n })\n\n const insert = async (kind: ShapeKind, at?: number) => {\n const slide = at ?? selected?.slide ?? current\n const w = kind === 'text' ? meta.w * 0.4 : kind === 'line' ? meta.w * 0.25 : meta.w * 0.2\n const h = kind === 'text' ? meta.h * 0.1 : kind === 'line' ? 1 : meta.w * 0.2\n let box: Box = { x: (meta.w - w) / 2, y: (meta.h - h) / 2, w, h }\n let rid: string | undefined\n if (kind === 'image') {\n const [f] = await pickFiles('image/*', false)\n if (!f) return\n rid = await client.call('pptx.image', slide, await f.arrayBuffer(), (f.type.split('/')[1] ?? 'png').replace('svg+xml', 'svg'))\n const dims = await new Promise<{ w: number; h: number }>((res) => {\n const img = new Image()\n img.onload = () => res({ w: img.naturalWidth, h: img.naturalHeight })\n img.onerror = () => res({ w: 400, h: 300 })\n img.src = URL.createObjectURL(f)\n })\n const k = Math.min(1, (meta.w * 0.6) / dims.w, (meta.h * 0.6) / dims.h)\n box = { x: (meta.w - dims.w * k) / 2, y: (meta.h - dims.h * k) / 2, w: dims.w * k, h: dims.h * k }\n }\n const m = await runShapes(slide, [{ op: 'insert', kind, box, rid, text: kind === 'text' ? 'Text' : undefined }], true)\n // the new shape is selected: arrow keys, Delete, ⌘D act on it right away\n scrollRef.current?.focus({ preventScroll: true })\n if (m && kind === 'text') {\n const el = m.els[m.els.length - 1]\n if (el?.t === 'shape' && el.sid !== undefined && el.text) {\n editor.begin(slide, el.sid, el.text)\n bump()\n }\n }\n }\n\n const slideAction = async (op: SlideOp, goTo?: number) => {\n stopEditing()\n setSelected(null)\n const next = await client.call('pptx.slides', op)\n Object.assign(meta, next)\n resetSlides(client)\n viewer.setDirty(true)\n setSlidesVer((v) => v + 1)\n if (goTo !== undefined) requestAnimationFrame(() => go(goTo))\n }\n\n const undoShapes = async (redo: boolean) => {\n const r = await client.call('pptx.undo', redo)\n if (!r) return\n putSlide(client, r.index, r.model)\n setUndoDepth((d) => Math.max(0, d + (redo ? 1 : -1)))\n setSelected(null)\n go(r.index)\n }\n\n const slideCmd = (kind: SlideCmd, i = current) => {\n if (kind === 'add') void slideAction({ op: 'add', after: i }, i + 1)\n else if (kind === 'duplicate') void slideAction({ op: 'duplicate', index: i }, i + 1)\n else if (kind === 'delete') void slideAction({ op: 'delete', index: i }, Math.max(0, i - 1))\n else if (kind === 'up') i > 0 && void slideAction({ op: 'move', from: i, to: i - 1 }, i - 1)\n else if (kind === 'down') i < meta.count - 1 && void slideAction({ op: 'move', from: i, to: i + 1 }, i + 1)\n else if (kind === 'hide') void slideAction({ op: 'hide', index: i, hidden: !modelOf(i)?.hidden }, i)\n }\n\n const elOf = (sel: { slide: number; top: number } | null) => (sel ? modelOf(sel.slide)?.els.find((x) => x.top === sel.top) : undefined)\n // menus act on the shape that was right-clicked even before React re-renders\n const selRef = useRef(selected)\n selRef.current = selected\n const shapeCmd = {\n arrange: (to: Arrange) => {\n const selected = selRef.current\n if (selected) void runShapes(selected.slide, [{ op: 'order', top: selected.top, to }])\n },\n duplicate: () => {\n const selected = selRef.current\n if (selected) void runShapes(selected.slide, [{ op: 'duplicate', top: selected.top }], true)\n },\n remove: () => {\n const selected = selRef.current\n if (selected) void runShapes(selected.slide, [{ op: 'delete', top: selected.top }])\n setSelected(null)\n },\n rotate: (k: Rotate) => {\n const selected = selRef.current\n const el = elOf(selected)\n const box = selected && boxOf(modelOf(selected.slide), selected.top)\n if (!selected || !box) return\n const b: Box = { ...box, flipH: el?.box.flipH, flipV: el?.box.flipV }\n if (k === 'cw') b.rot = (b.rot ?? 0) + 90\n else if (k === 'ccw') b.rot = (b.rot ?? 0) - 90\n else if (k === 'flipH') b.flipH = !b.flipH\n else b.flipV = !b.flipV\n void runShapes(selected.slide, [{ op: 'xfrm', top: selected.top, box: b }])\n },\n align: (k: AlignTo | 'both') => {\n const selected = selRef.current\n const box = selected && boxOf(modelOf(selected.slide), selected.top)\n if (!selected || !box) return\n const b = { ...box }\n // align the visible (rotated) extent\n const r = ((box.rot ?? 0) * Math.PI) / 180\n const vw = Math.abs(box.w * Math.cos(r)) + Math.abs(box.h * Math.sin(r))\n const vh = Math.abs(box.w * Math.sin(r)) + Math.abs(box.h * Math.cos(r))\n const dx = (vw - box.w) / 2\n const dy = (vh - box.h) / 2\n if (k === 'left') b.x = dx\n else if (k === 'center' || k === 'both') b.x = (meta.w - b.w) / 2\n else if (k === 'right') b.x = meta.w - b.w - dx\n else if (k === 'top') b.y = dy\n else if (k === 'middle') b.y = (meta.h - b.h) / 2\n else if (k === 'bottom') b.y = meta.h - b.h - dy\n if (k === 'both') b.y = (meta.h - b.h) / 2\n void runShapes(selected.slide, [{ op: 'xfrm', top: selected.top, box: b }])\n },\n anchor: (a: 't' | 'ctr' | 'b') => {\n if (editor.active && editor.body) {\n editor.body = { ...editor.body, anchor: a }\n void runShapes(editor.slide, [{ op: 'anchor', sid: editor.sid, anchor: a }])\n bump()\n return\n }\n const selected = selRef.current\n const el = elOf(selected)\n if (selected && el?.t === 'shape' && el.sid !== undefined) void runShapes(selected.slide, [{ op: 'anchor', sid: el.sid, anchor: a }])\n },\n }\n\n const shapeMenu = (): MenuItem[] => [\n { label: 'Duplicate', icon: 'copy', hint: `${MOD}D`, run: shapeCmd.duplicate },\n { label: 'Delete', icon: 'trash', hint: 'Del', run: shapeCmd.remove },\n { label: 'Bring to front', icon: 'front', hint: `${MOD}⇧↑`, sep: true, run: () => shapeCmd.arrange('front') },\n { label: 'Bring forward', hint: `${MOD}↑`, run: () => shapeCmd.arrange('forward') },\n { label: 'Send backward', hint: `${MOD}↓`, run: () => shapeCmd.arrange('backward') },\n { label: 'Send to back', icon: 'back', hint: `${MOD}⇧↓`, run: () => shapeCmd.arrange('back') },\n { label: 'Rotate 90° clockwise', icon: 'rotate', sep: true, run: () => shapeCmd.rotate('cw') },\n { label: 'Rotate 90° counter-clockwise', icon: 'rotateCcw', run: () => shapeCmd.rotate('ccw') },\n { label: 'Flip horizontally', icon: 'flipH', run: () => shapeCmd.rotate('flipH') },\n { label: 'Flip vertically', icon: 'flipV', run: () => shapeCmd.rotate('flipV') },\n { label: 'Center on slide', icon: 'alignObj', sep: true, run: () => shapeCmd.align('both') },\n ]\n const slideMenu = (i: number): MenuItem[] => [\n { label: 'New slide', icon: 'slideAdd', hint: `${MOD}M`, run: () => slideCmd('add', i) },\n { label: 'Duplicate slide', icon: 'copy', run: () => slideCmd('duplicate', i) },\n { label: 'Delete slide', icon: 'trash', run: () => slideCmd('delete', i), disabled: meta.count <= 1 },\n { label: modelOf(i)?.hidden ? 'Show slide' : 'Hide slide', icon: 'hide', run: () => slideCmd('hide', i) },\n { label: 'Move slide up', icon: 'up', sep: true, run: () => slideCmd('up', i), disabled: i === 0 },\n { label: 'Move slide down', icon: 'down', run: () => slideCmd('down', i), disabled: i >= meta.count - 1 },\n { label: 'Insert text box', icon: 'textbox', sep: true, run: () => void insert('text', i) },\n { label: 'Insert image…', icon: 'image', run: () => void insert('image', i) },\n { label: 'Present from this slide', icon: 'play', sep: true, run: () => setPresenting(i) },\n ]\n\n const onShapeKey = (e: React.KeyboardEvent) => {\n if (!selected || editor.active || !viewer.editable) return false\n const box = boxOf(modelOf(selected.slide), selected.top)\n const step = e.shiftKey ? 10 : 1\n const nudge: Record<string, [number, number]> = { ArrowUp: [0, -step], ArrowDown: [0, step], ArrowLeft: [-step, 0], ArrowRight: [step, 0] }\n const mod = e.metaKey || e.ctrlKey\n if (mod && e.key.toLowerCase() === 'd') shapeCmd.duplicate()\n else if (mod && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) shapeCmd.arrange(e.key === 'ArrowUp' ? (e.shiftKey ? 'front' : 'forward') : e.shiftKey ? 'back' : 'backward')\n else if (e.key === 'Delete' || e.key === 'Backspace') {\n void runShapes(selected.slide, [{ op: 'delete', top: selected.top }])\n setSelected(null)\n } else if (nudge[e.key] && box) void runShapes(selected.slide, [{ op: 'xfrm', top: selected.top, box: { ...box, x: box.x + nudge[e.key][0], y: box.y + nudge[e.key][1] } }])\n else if (e.key === 'Escape') setSelected(null)\n else return false\n e.preventDefault()\n return true\n }\n\n const go = (i: number) => {\n const el = scrollRef.current\n if (el) el.scrollTop = PAD + Math.max(0, Math.min(meta.count - 1, i)) * pitch - Math.max(0, (size.h - slideH) / 2)\n }\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n // already handled by the text editor (e.g. Esc that just left text editing)\n if (editor.active || e.defaultPrevented) return\n if (onShapeKey(e)) return\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 's') {\n e.preventDefault()\n void viewer.save()\n return\n }\n if (e.key === 'F5') {\n e.preventDefault()\n setPresenting(e.shiftKey ? 0 : current)\n return\n }\n const mod = e.metaKey || e.ctrlKey\n if (viewer.editable && mod && (e.key.toLowerCase() === 'z' || e.key.toLowerCase() === 'y')) {\n e.preventDefault()\n void undoShapes(e.key.toLowerCase() === 'y' || e.shiftKey)\n return\n }\n if (viewer.editable && mod && e.key.toLowerCase() === 'm') {\n e.preventDefault()\n slideCmd('add')\n return\n }\n if (e.key === 'PageDown' || e.key === 'ArrowRight' || (e.key === ' ' && !e.shiftKey)) go(current + 1)\n else if (e.key === 'PageUp' || e.key === 'ArrowLeft') go(current - 1)\n else if (e.key === 'Home') go(0)\n else if (e.key === 'End') go(meta.count - 1)\n else return\n e.preventDefault()\n }\n\n const selOverlay = (i: number) => {\n const box = drag && drag.slide === i && drag.moved ? drag.cur : selected ? boxOf(modelOf(i), selected.top) : undefined\n if (!box || !selected) return undefined\n return (\n <Selection\n box={box}\n scale={scale}\n onHandle={(mode, e) => {\n const b = boxOf(modelOf(i), selected.top)\n if (b) setDrag({ slide: i, top: selected.top, mode, sx: e.clientX, sy: e.clientY, box: b, cur: b, moved: false, px: e.clientX, py: e.clientY })\n }}\n />\n )\n }\n\n const slots = []\n for (let i = first; i <= last; i++) {\n slots.push(\n <div key={`${slidesVer}:${i}`} className={viewer.editable ? 'de-slide-frame de-slide-editable' : 'de-slide-frame'} style={{ top: PAD + i * pitch, left }} data-slide={i + 1}\n onMouseDown={(e) => onSlideMouseDown(i, e)}\n onContextMenu={(e) => {\n if (!viewer.editable) return\n const t = e.target as HTMLElement\n if (editor.active && textRoot.current?.contains(t)) return\n e.preventDefault()\n const topEl = t.closest('[data-top]') as HTMLElement | null\n if (topEl) {\n stopEditing()\n const sel = { slide: i, top: Number(topEl.dataset.top) }\n selRef.current = sel\n setSelected(sel)\n setCtxMenu({ x: e.clientX, y: e.clientY, items: shapeMenu() })\n } else setCtxMenu({ x: e.clientX, y: e.clientY, items: slideMenu(i) })\n }}\n >\n <SlideSlot\n client={client}\n index={i}\n meta={meta}\n scale={scale}\n live\n editing={editor.slide === i ? editing : undefined}\n overlay={viewer.editable && selected?.slide === i ? selOverlay(i) : undefined}\n />\n </div>,\n )\n }\n if (editor.active && (editor.slide < first || editor.slide > last)) stopEditing()\n const thumbs = []\n if (showThumbs) {\n for (let i = tFirst; i <= tLast; i++) {\n thumbs.push(\n <div\n key={`${slidesVer}:${i}`}\n className=\"de-thumb\"\n style={{ top: 10 + i * tPitch }}\n aria-current={i === current}\n onClick={() => go(i)}\n onContextMenu={(e) => {\n if (!viewer.editable) return\n e.preventDefault()\n go(i)\n setCtxMenu({ x: e.clientX, y: e.clientY, items: slideMenu(i) })\n }}\n >\n <span className=\"de-thumb-n\">{i + 1}</span>\n <SlideSlot client={client} index={i} meta={meta} scale={tScale} live />\n </div>,\n )\n }\n }\n\n return (\n <div ref={rootRef} style={{ display: 'flex', flex: 1, minWidth: 0 }}>\n {showThumbs && (\n <div ref={thumbRef} className=\"de-thumbs\">\n <div style={{ height: 20 + meta.count * tPitch, position: 'relative' }}>{thumbs}</div>\n </div>\n )}\n <div style={{ position: 'relative', flex: 1, minWidth: 0, display: 'flex' }}>\n <div ref={scrollRef} className=\"de-scroll\" tabIndex={0} onKeyDown={onKeyDown} style={{ outline: 'none' }} onMouseDown={(e) => e.target === e.currentTarget && stopEditing()}>\n <div ref={slidesRef} style={{ position: 'relative', height: totalH, width: totalW }} onMouseDown={(e) => e.target === e.currentTarget && stopEditing()}>\n {slots}\n </div>\n </div>\n <ZoomControl zoom={zoom} effective={scale} onChange={setZoom} />\n {!viewer.editable && (\n <button type=\"button\" className=\"de-mode de-present-btn\" title=\"Present (F5)\" onClick={() => setPresenting(current)}>\n ▶ Present\n </button>\n )}\n <Status text={`Slide ${current + 1} of ${meta.count}`} onStatus={onStatus} />\n {viewer.editable && (\n <PptxToolbar\n editor={editor}\n shape={\n selected && !editor.active\n ? (() => {\n const el = elOf(selected)\n const sh = el?.t === 'shape' ? el : undefined\n return { canText: sh?.sid !== undefined, anchor: sh?.text?.anchor }\n })()\n : null\n }\n textAnchor={editor.body?.anchor}\n canUndo={undoDepth > 0}\n onUndo={(redo) => void undoShapes(redo)}\n onInsert={(k) => void insert(k)}\n onFill={(color) => selected && void runShapes(selected.slide, [{ op: 'fill', top: selected.top, color }])}\n onLine={(p) => selected && void runShapes(selected.slide, [{ op: 'line', top: selected.top, ...p }])}\n onArrange={shapeCmd.arrange}\n onRotate={shapeCmd.rotate}\n onAlign={shapeCmd.align}\n onAnchor={shapeCmd.anchor}\n onDuplicate={shapeCmd.duplicate}\n onDelete={shapeCmd.remove}\n onBackground={(color) => void runShapes(current, [{ op: 'bg', color }])}\n onSlide={(k) => slideCmd(k)}\n onPresent={(fromStart) => setPresenting(fromStart ? 0 : current)}\n />\n )}\n {ctxMenu && <ContextMenu x={ctxMenu.x} y={ctxMenu.y} items={ctxMenu.items} onClose={() => setCtxMenu(null)} />}\n {presenting !== null && <Presenter client={client} meta={meta} start={presenting} onClose={() => setPresenting(null)} />}\n </div>\n </div>\n )\n}\n","import { useEffect, useState } from 'react'\nimport type { DocSource } from '../core/source'\nimport { DocumentClient, type OpenOptions } from '../core/worker/client'\nimport type { Events } from '../core/worker/protocol'\n\nexport interface DocumentState {\n client: DocumentClient | null\n error: Error | null\n loading: boolean\n progress: Events['progress'] | null\n}\n\n/** Opens a document in a worker and closes it on unmount / source change. */\nexport function useDocument(src: DocSource | null | undefined, options: OpenOptions = {}): DocumentState {\n const [state, setState] = useState<DocumentState>({ client: null, error: null, loading: !!src, progress: null })\n const { name, worker, credentials } = options\n const headersKey = options.headers ? JSON.stringify(options.headers) : ''\n useEffect(() => {\n if (!src) {\n setState({ client: null, error: null, loading: false, progress: null })\n return\n }\n let live = true\n let client: DocumentClient | null = null\n setState({ client: null, error: null, loading: true, progress: null })\n DocumentClient.open(src, {\n name,\n worker,\n credentials,\n headers: headersKey ? JSON.parse(headersKey) : undefined,\n onProgress: (p) => live && setState((s) => ({ ...s, progress: p })),\n }).then(\n (c) => {\n if (!live) return c.destroy()\n client = c\n c.on('progress', (p) => live && setState((s) => ({ ...s, progress: p })))\n setState((s) => ({ ...s, client: c, loading: false }))\n },\n (e: Error) => live && setState({ client: null, error: e, loading: false, progress: null }),\n )\n return () => {\n live = false\n client?.destroy()\n }\n }, [src, name, worker, credentials, headersKey])\n return state\n}\n","import { useState } from 'react'\nimport type { BorderKind, FmtPatch } from '../../core/xlsx/types'\nimport { MOD } from '../common/ContextMenu'\nimport { EditorBar } from '../common/Slots'\nimport { Btn, ColorBtn, Dropdown, fontName, fontOptions, Icon, Menu, Pop, Select, Sep, SizeBox } from '../edit/Toolbar'\n\nconst FORMATS = [\n { value: 'General', label: 'Automatic', hint: '1000.12' },\n { value: '@', label: 'Plain text', hint: 'abc' },\n { value: '0', label: 'Number', hint: '1000', sep: true },\n { value: '0.00', label: 'Number', hint: '1000.12' },\n { value: '#,##0', label: 'Number', hint: '1,000' },\n { value: '#,##0.00', label: 'Number', hint: '1,000.12' },\n { value: '0.00E+00', label: 'Scientific', hint: '1.01E+03' },\n { value: '0%', label: 'Percent', hint: '10%', sep: true },\n { value: '0.00%', label: 'Percent', hint: '10.12%' },\n { value: '\"$\"#,##0.00', label: 'Currency', hint: '$1,000.12', sep: true },\n { value: '\"$\"#,##0', label: 'Currency rounded', hint: '$1,000' },\n { value: '_(\"$\"* #,##0.00_);_(\"$\"* (#,##0.00);_(\"$\"* \"-\"??_);_(@_)', label: 'Accounting', hint: '$ (1,000.12)' },\n { value: '#,##0 \"₫\"', label: 'Currency', hint: '1,000 ₫' },\n { value: '# ?/?', label: 'Fraction', hint: '1000 1/8' },\n { value: 'yyyy-mm-dd', label: 'Date', hint: '2026-09-26', sep: true },\n { value: 'dd/mm/yyyy', label: 'Date', hint: '26/09/2026' },\n { value: 'd mmmm yyyy', label: 'Long date', hint: '26 September 2026' },\n { value: 'h:mm', label: 'Time', hint: '15:59' },\n { value: 'h:mm:ss AM/PM', label: 'Time', hint: '3:59:00 PM' },\n { value: 'yyyy-mm-dd h:mm', label: 'Date time', hint: '2026-09-26 15:59' },\n { value: '[h]:mm:ss', label: 'Duration', hint: '24:01:00' },\n]\nconst SIZES = [6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 36, 48]\nconst BORDERS: { k: BorderKind; icon: string; title: string }[] = [\n { k: 'all', icon: 'bAll', title: 'All borders' },\n { k: 'inner', icon: 'bInner', title: 'Inner borders' },\n { k: 'outer', icon: 'bOuter', title: 'Outer borders' },\n { k: 'none', icon: 'bNone', title: 'Clear borders' },\n { k: 'top', icon: 'bTop', title: 'Top border' },\n { k: 'bottom', icon: 'bBottom', title: 'Bottom border' },\n { k: 'left', icon: 'bLeft', title: 'Left border' },\n { k: 'right', icon: 'bRight', title: 'Right border' },\n]\nconst BORDER_STYLES = [\n { value: 'thin', label: 'Thin', hint: '───' },\n { value: 'medium', label: 'Medium', hint: '━━━' },\n { value: 'thick', label: 'Thick', hint: '▬▬▬' },\n { value: 'dashed', label: 'Dashed', hint: '- - -' },\n { value: 'dotted', label: 'Dotted', hint: '·····' },\n { value: 'double', label: 'Double', hint: '═══' },\n] as const\nconst HALIGN = [\n { value: 'left', label: 'Left', icon: 'alignLeft' },\n { value: 'center', label: 'Center', icon: 'alignCenter' },\n { value: 'right', label: 'Right', icon: 'alignRight' },\n] as const\nconst VALIGN = [\n { value: 'top', label: 'Top', icon: 'vTop' },\n { value: 'center', label: 'Middle', icon: 'vMiddle' },\n { value: 'bottom', label: 'Bottom', icon: 'vBottom' },\n] as const\nconst ROTATE = [\n { value: 0, label: 'None', icon: 'rotNone' },\n { value: 45, label: 'Tilt up', icon: 'rotUp' },\n { value: -45, label: 'Tilt down', icon: 'rotDown' },\n { value: 255, label: 'Stack vertically', icon: 'rotStack' },\n { value: 90, label: 'Rotate up', icon: 'rotUp90' },\n { value: -90, label: 'Rotate down', icon: 'rotDown90' },\n]\nconst FUNCS = ['SUM', 'AVERAGE', 'COUNT', 'MAX', 'MIN']\n\nexport type MergeMode = 'all' | 'across' | 'down' | 'unmerge'\n\n/** number format with one decimal place more / less (Google Sheets .0 / .00 buttons) */\nfunction decimals(fmt: string, d: number): string {\n const base = fmt === 'General' || fmt === '@' ? '0' : fmt\n const m = /0(\\.0*)?/.exec(base)\n if (!m) return d > 0 ? '0.0' : '0'\n const n = Math.max(0, (m[1] ? m[1].length - 1 : 0) + d)\n return base.slice(0, m.index) + '0' + (n ? '.' + '0'.repeat(n) : '') + base.slice(m.index + m[0].length)\n}\n\nexport function XlsxToolbar(props: {\n css: Record<string, string | number>\n /** workbook default font (cells without an explicit font) */\n base: { fontFamily?: string; fontSize?: string | number }\n format: string\n merged: boolean\n frozen: boolean\n gridlines: boolean\n painter: boolean\n onToggle: (k: 'b' | 'i' | 'u' | 'strike') => void\n onFormat: (p: FmtPatch) => void\n onUndo: () => void\n onRedo: () => void\n onPaint: () => void\n onMerge: (mode: MergeMode) => void\n onFreeze: (k: 'none' | 'row' | 'col' | 'sel') => void\n onGridlines: () => void\n onFunc: (fn: string | null) => void\n onSort: (desc: boolean) => void\n onRows: (k: 'rowAbove' | 'rowBelow' | 'colLeft' | 'colRight' | 'delRow' | 'delCol' | 'hideRows' | 'hideCols' | 'unhideRows' | 'unhideCols') => void\n onFind: () => void\n}) {\n const { css, onFormat: f } = props\n const [bColor, setBColor] = useState('#000000')\n const [bStyle, setBStyle] = useState<(typeof BORDER_STYLES)[number]['value']>('thin')\n const deco = String(css.textDecoration ?? '')\n const align = (css.textAlign as string | undefined) ?? ''\n const valign = css.alignItems === 'flex-start' ? 'top' : css.alignItems === 'center' ? 'center' : 'bottom'\n const rot = Number(css.textRotate ?? 0)\n const pt = (v: unknown) => (typeof v === 'string' && v.endsWith('pt') ? parseFloat(v) : typeof v === 'number' ? Math.round(v * 0.75 * 2) / 2 : undefined)\n const sz = pt(css.fontSize) ?? pt(props.base.fontSize)\n const font = fontName((css.fontFamily ?? props.base.fontFamily) as string | undefined)\n const known = FORMATS.find((x) => x.value === props.format)\n const formats = known ? FORMATS : [{ value: props.format, label: 'Custom', hint: props.format }, ...FORMATS]\n return (\n <EditorBar>\n <Btn icon=\"undo\" title={`Undo (${MOD}Z)`} onClick={props.onUndo} />\n <Btn icon=\"redo\" title={`Redo (${MOD}Y)`} onClick={props.onRedo} />\n <Btn icon=\"paint\" title=\"Paint format (click, then select cells)\" active={props.painter} onClick={props.onPaint} />\n <Sep />\n <Btn icon=\"currency\" title=\"Format as currency\" onClick={() => f({ numFmt: '\"$\"#,##0.00' })} />\n <Btn icon=\"percent\" title=\"Format as percent\" onClick={() => f({ numFmt: '0%' })} />\n <Btn icon=\"decLess\" title=\"Decrease decimal places\" onClick={() => f({ numFmt: decimals(props.format, -1) })} />\n <Btn icon=\"decMore\" title=\"Increase decimal places\" onClick={() => f({ numFmt: decimals(props.format, 1) })} />\n <Select title={`Number format: ${known?.label ?? 'Custom'}`} width={96} menuWidth={270} value={props.format} options={formats} onChange={(v) => f({ numFmt: v })} />\n <Sep />\n <Select title=\"Font\" width={112} menuWidth={200} value={font} placeholder=\"Font\" options={fontOptions(font)} onChange={(v) => f({ font: v })} />\n <Sep />\n <SizeBox value={sz} sizes={SIZES} onChange={(v) => f({ sz: v })} />\n <Sep />\n <Btn icon=\"bold\" title={`Bold (${MOD}B)`} active={css.fontWeight === 700} onClick={() => props.onToggle('b')} />\n <Btn icon=\"italic\" title={`Italic (${MOD}I)`} active={css.fontStyle === 'italic'} onClick={() => props.onToggle('i')} />\n <Btn icon=\"underline\" title={`Underline (${MOD}U)`} active={deco.includes('underline')} onClick={() => props.onToggle('u')} />\n <Btn icon=\"strike\" title={`Strikethrough (${MOD}⇧X)`} active={deco.includes('line-through')} onClick={() => props.onToggle('strike')} />\n <ColorBtn icon=\"color\" title=\"Text color\" value={css.color as string | undefined} onPick={(c) => f({ color: c })} noneLabel=\"Automatic\" />\n <Sep />\n <ColorBtn icon=\"fill\" title=\"Fill color\" value={typeof css.background === 'string' && !css.background.includes('gradient') ? css.background : undefined} onPick={(c) => f({ fill: c })} noneLabel=\"No fill\" />\n <Pop icon=\"borders\" title=\"Borders\" chevron>\n {(close) => (\n <div className=\"de-borders-pop\">\n <div className=\"de-borders\" role=\"group\" aria-label=\"Borders\">\n {BORDERS.map((x) => (\n <button\n key={x.k}\n type=\"button\"\n className=\"de-tb\"\n title={x.title}\n aria-label={x.title}\n onClick={() => {\n close()\n f({ border: x.k, borderColor: bColor, borderStyle: bStyle })\n }}\n >\n <Icon name={x.icon} />\n </button>\n ))}\n </div>\n <div className=\"de-borders-side\">\n <ColorBtn icon=\"color\" title=\"Border color\" value={bColor} onPick={(c) => setBColor(c ?? '#000000')} noneLabel=\"Black\" />\n <Dropdown title=\"Border style\" icon=\"lineStyle\" label={null} menuWidth={150} value={bStyle} options={[...BORDER_STYLES]} onChange={(v) => setBStyle(v)} />\n </div>\n </div>\n )}\n </Pop>\n <Dropdown\n title=\"Merge cells\"\n icon=\"merge\"\n label={null}\n menuWidth={190}\n options={[\n { value: 'all', label: 'Merge all' },\n { value: 'across', label: 'Merge horizontally' },\n { value: 'down', label: 'Merge vertically' },\n { value: 'unmerge', label: 'Unmerge', disabled: !props.merged, sep: true },\n ]}\n onChange={(v) => props.onMerge(v as MergeMode)}\n />\n <Sep />\n <Dropdown\n title=\"Horizontal align\"\n icon={HALIGN.find((x) => x.value === align)?.icon ?? 'alignLeft'}\n label={null}\n menuWidth={140}\n value={align}\n options={HALIGN.map((x) => ({ ...x }))}\n onChange={(v) => f({ align: v === align ? null : (v as 'left') })}\n />\n <Dropdown title=\"Vertical align\" icon={VALIGN.find((x) => x.value === valign)!.icon} label={null} menuWidth={140} value={valign} options={VALIGN.map((x) => ({ ...x }))} onChange={(v) => f({ valign: v })} />\n <Btn icon=\"wrap\" title=\"Wrap text\" active={css.whiteSpace === 'pre-wrap'} onClick={() => f({ wrap: css.whiteSpace !== 'pre-wrap' })} />\n <Dropdown title=\"Text rotation\" icon={ROTATE.find((x) => x.value === rot)?.icon ?? 'rotNone'} label={null} menuWidth={180} value={rot} options={ROTATE} onChange={(v) => f({ rotate: v || null })} />\n <Sep />\n <Menu\n title=\"Insert, delete or hide rows & columns\"\n label=\"Rows\"\n icon=\"rowAdd\"\n items={[\n { value: 'rowAbove', label: 'Insert row above', icon: 'rowAbove' },\n { value: 'rowBelow', label: 'Insert row below', icon: 'rowBelow' },\n { value: 'colLeft', label: 'Insert column left', icon: 'colLeft' },\n { value: 'colRight', label: 'Insert column right', icon: 'colRight' },\n { value: 'delRow', label: 'Delete row(s)', icon: 'delRow', sep: true },\n { value: 'delCol', label: 'Delete column(s)', icon: 'delCol' },\n { value: 'hideRows', label: 'Hide row(s)', icon: 'hide', sep: true },\n { value: 'hideCols', label: 'Hide column(s)', icon: 'hide' },\n { value: 'unhideRows', label: 'Unhide rows', icon: 'view' },\n { value: 'unhideCols', label: 'Unhide columns', icon: 'view' },\n ]}\n onPick={(v) => props.onRows(v as 'rowAbove')}\n />\n <Dropdown\n title=\"Functions\"\n icon=\"sum\"\n label={null}\n menuWidth={170}\n options={[...FUNCS.map((x) => ({ value: x, label: x })), { value: '', label: 'More functions…', sep: true }]}\n onChange={(v) => props.onFunc(v || null)}\n />\n <Dropdown\n title=\"Sort range\"\n icon=\"sort\"\n label={null}\n menuWidth={200}\n options={[\n { value: 'asc', label: 'Sort range A → Z', icon: 'sortAZ' },\n { value: 'desc', label: 'Sort range Z → A', icon: 'sortZA' },\n ]}\n onChange={(v) => props.onSort(v === 'desc')}\n />\n <Menu\n title=\"View: freeze, gridlines\"\n label=\"View\"\n icon=\"freeze\"\n items={[\n { value: 'row', label: 'Freeze 1 row' },\n { value: 'col', label: 'Freeze 1 column' },\n { value: 'sel', label: 'Freeze up to current cell' },\n { value: 'none', label: 'Unfreeze', disabled: !props.frozen },\n { value: 'grid', label: props.gridlines ? 'Hide gridlines' : 'Show gridlines', icon: 'gridlines', sep: true },\n ]}\n onPick={(v) => (v === 'grid' ? props.onGridlines() : props.onFreeze(v as 'row'))}\n />\n <Sep />\n <Btn icon=\"clear\" title={`Clear formatting (${MOD}\\\\)`} onClick={() => f({ clear: true })} />\n <Btn icon=\"search\" title={`Find & replace (${MOD}F)`} onClick={props.onFind} />\n </EditorBar>\n )\n}\n","/** Variable-size axis (rows or columns): default size + sparse overrides, O(log n) lookups. */\nexport class Axis {\n count = 0\n private custom = new Map<number, number>()\n private keys: number[] = []\n private cum: number[] = [] // cumulative delta (size - def) up to and including keys[i]\n private dirty = false\n\n constructor(public def: number) {}\n\n set(i: number, size: number) {\n if (size === this.def) this.custom.delete(i)\n else this.custom.set(i, size)\n this.dirty = true\n }\n\n setRange(min: number, max: number, size: number) {\n const hi = Math.min(max, min + 20000)\n for (let i = min; i <= hi; i++) this.set(i, size)\n }\n\n private build() {\n if (!this.dirty) return\n this.keys = [...this.custom.keys()].sort((a, b) => a - b)\n let acc = 0\n this.cum = this.keys.map((k) => (acc += this.custom.get(k)! - this.def))\n this.dirty = false\n }\n\n size(i: number): number {\n return this.custom.get(i) ?? this.def\n }\n\n /** Start offset of index i. */\n pos(i: number): number {\n this.build()\n let lo = 0\n let hi = this.keys.length - 1\n let k = -1\n while (lo <= hi) {\n const mid = (lo + hi) >> 1\n if (this.keys[mid] < i) {\n k = mid\n lo = mid + 1\n } else hi = mid - 1\n }\n return i * this.def + (k >= 0 ? this.cum[k] : 0)\n }\n\n total(): number {\n return this.pos(this.count)\n }\n\n /** Index containing offset px (clamped to [0, count-1]). */\n index(px: number): number {\n if (px <= 0) return 0\n let lo = 0\n let hi = Math.max(0, this.count - 1)\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1\n if (this.pos(mid) <= px) lo = mid\n else hi = mid - 1\n }\n return lo\n }\n}\n","/** px size of a CSS font size ('11pt', px number), `base` when unset */\nexport const fontPx = (v: string | number | undefined, base: number) =>\n typeof v === 'string' && v.endsWith('pt') ? (parseFloat(v) * 4) / 3 : typeof v === 'number' ? v : base\n\n/** Excel-like: shrink General decimals to fit, otherwise show ### when a number is too wide. */\nexport function fitNumber(text: string, width: number, px: number): string {\n const cw = px * 0.56\n if (text.length * cw <= width) return text\n const m = /^(-?\\d+)\\.(\\d+)$/.exec(text)\n if (m && (m[1].length + (text.startsWith('-') ? 0 : 0)) * cw <= width) {\n const keep = Math.max(0, Math.floor(width / cw) - m[1].length - 1)\n const v = Number(text).toFixed(keep)\n if (v.length * cw <= width) return v\n }\n return '#'.repeat(Math.max(1, Math.floor(width / cw)))\n}\n","import type { CSSProperties, ReactNode } from 'react'\nimport type { DocumentClient } from '../../core/worker/client'\nimport type { CellOut, Merge, WorkbookMeta } from '../../core/xlsx/types'\nimport type { Printable } from '../file/print'\nimport { toCsv } from '../file/text'\nimport type { Axis } from './axis'\nimport { fitNumber, fontPx } from './fit'\n\nexport interface SheetLayout {\n rows: number\n cols: number\n rowAxis: Axis\n colAxis: Axis\n merges: Merge[]\n gridLines: boolean\n done: boolean\n}\n\nconst CHUNK = 2000\nconst MAX_PRINT_ROWS = 20_000\n/** Rows per `<table>`: Chrome paginates one long table in worse than linear time; short tables stay linear. */\nconst TABLE_ROWS = 100\n/** printable width (px) of portrait / landscape paper after margins (A4 and Letter) */\nconst PORTRAIT_W = 700\nconst LANDSCAPE_W = 960\n\nasync function sheetRows(client: DocumentClient, sheet: number, rows: number): Promise<Map<number, CellOut[]>> {\n const out = new Map<number, CellOut[]>()\n for (let r0 = 0; r0 < rows; r0 += CHUNK) {\n const b = await client.call('xlsx.block', sheet, r0, Math.min(rows, r0 + CHUNK))\n for (const row of b.rows) out.set(row.r, row.cells)\n }\n return out\n}\n\nconst loading = () => new Error('The sheet is still loading — try again in a moment')\n\n/** Shown values of the sheet as CSV / TSV (UTF-8 BOM for CSV so Excel reads accents). */\nexport async function sheetText(client: DocumentClient, sheet: number, l: SheetLayout, sep: string): Promise<string> {\n if (!l.done) throw loading()\n const data = await sheetRows(client, sheet, l.rows)\n let lastR = -1\n let lastC = -1\n for (const [r, cells] of data) {\n for (const c of cells) {\n if (c[1] === '') continue\n lastR = Math.max(lastR, r)\n lastC = Math.max(lastC, c[0])\n }\n }\n const rows: string[][] = []\n for (let r = 0; r <= lastR; r++) {\n const line = new Array<string>(lastC + 1).fill('')\n for (const c of data.get(r) ?? []) if (c[0] <= lastC) line[c[0]] = c[1]\n rows.push(line)\n }\n return (sep === ',' ? '' : '') + toCsv(rows, sep)\n}\n\nconst VALIGN: Record<string, CSSProperties['verticalAlign']> = { 'flex-start': 'top', center: 'middle', 'flex-end': 'bottom' }\n\n/** The sheet as a table (used range, hidden rows / columns left out), fitted to the paper width. */\nexport async function sheetPrintable(client: DocumentClient, sheet: number, l: SheetLayout, meta: WorkbookMeta): Promise<Printable> {\n if (!l.done) throw loading()\n const data = await sheetRows(client, sheet, Math.min(l.rows, MAX_PRINT_ROWS))\n let lastR = -1\n let lastC = -1\n for (const [r, cells] of data) {\n for (const c of cells) {\n if (c[1] === '' && !c[2]) continue\n lastR = Math.max(lastR, r)\n lastC = Math.max(lastC, c[0])\n }\n }\n const merges = l.merges.filter((m) => m.r0 <= lastR && m.c0 <= lastC)\n for (const m of merges) {\n lastR = Math.max(lastR, Math.min(m.r1, MAX_PRINT_ROWS - 1))\n lastC = Math.max(lastC, m.c1)\n }\n const cols: number[] = []\n for (let c = 0; c <= lastC; c++) if (l.colAxis.size(c) > 0) cols.push(c)\n const anchors = new Map<number, Merge>()\n const covered = new Set<number>()\n const key = (r: number, c: number) => r * 16384 + c\n // a row may start a new table unless a merge runs across it\n const across = new Int32Array(lastR + 2)\n for (const m of merges) {\n anchors.set(key(m.r0, m.c0), m)\n const r1 = Math.min(m.r1, lastR)\n for (let r = m.r0; r <= r1; r++) for (let c = m.c0; c <= m.c1; c++) if (r !== m.r0 || c !== m.c0) covered.add(key(r, c))\n if (r1 > m.r0) {\n across[m.r0 + 1]++\n across[r1 + 1]--\n }\n }\n const visibleIn = (axis: Axis, a: number, b: number) => {\n let n = 0\n for (let i = a; i <= b; i++) if (axis.size(i) > 0) n++\n return Math.max(1, n)\n }\n\n const basePx = fontPx(meta.baseFont.fontSize, 14.67)\n const tables: ReactNode[][] = []\n let trs: ReactNode[] = []\n let inMerge = 0\n for (let r = 0; r <= lastR; r++) {\n inMerge += across[r]\n if (!inMerge && trs.length >= TABLE_ROWS) {\n tables.push(trs)\n trs = []\n }\n const h = l.rowAxis.size(r)\n if (!h) continue\n const cells = new Map((data.get(r) ?? []).map((c) => [c[0], c]))\n const tds: ReactNode[] = []\n cols.forEach((c, k) => {\n if (covered.has(key(r, c))) return\n const cell = cells.get(c)\n const m = anchors.get(key(r, c))\n const [, raw = '', si = 0, kind = 0, color] = cell ?? []\n const { textAlign, textRotate: _rot, alignItems, whiteSpace, ...rest } = (meta.styles[si] ?? {}) as Record<string, string | number>\n // like the grid: fewer decimals or ### when a number does not fit\n const w = m ? l.colAxis.pos(Math.min(m.c1, lastC) + 1) - l.colAxis.pos(m.c0) : l.colAxis.size(c)\n const text = kind === 1 && raw ? fitNumber(raw, w - 6, fontPx(rest.fontSize, basePx)) : raw\n const align = (textAlign as string) ?? (kind === 1 ? 'right' : kind === 2 ? 'center' : 'left')\n // like the grid: left-aligned text runs over empty neighbours (and past the last column)\n const next = cols[k + 1]\n const spill = !!text && !m && align === 'left' && !whiteSpace && (next === undefined || (!cells.get(next)?.[1] && !covered.has(key(r, next))))\n // only what differs from the `.de-print-table td` defaults (bottom, pre, left): keeps a big sheet's DOM small\n const style = { ...rest } as CSSProperties\n if (align !== 'left') style.textAlign = align as CSSProperties['textAlign']\n const valign = VALIGN[alignItems as string]\n if (valign && valign !== 'bottom') style.verticalAlign = valign\n if (whiteSpace) style.whiteSpace = whiteSpace as CSSProperties['whiteSpace']\n if (color) style.color = color\n tds.push(\n <td\n key={c}\n style={style}\n data-de-fit={text && !spill ? (kind === 1 ? '#' : '') : undefined}\n colSpan={m ? visibleIn(l.colAxis, m.c0, Math.min(m.c1, lastC)) : undefined}\n rowSpan={m ? visibleIn(l.rowAxis, m.r0, Math.min(m.r1, lastR)) : undefined}\n >\n {text}\n </td>,\n )\n })\n trs.push(\n <tr key={r} style={{ height: h }}>\n {tds}\n </tr>,\n )\n }\n if (trs.length || !tables.length) tables.push(trs)\n\n const width = cols.reduce((w, c) => w + l.colAxis.size(c), 0)\n const landscape = width > PORTRAIT_W\n const fit = Math.max(0.35, Math.min(1, (landscape ? LANDSCAPE_W : PORTRAIT_W) / Math.max(1, width)))\n const className = l.gridLines ? 'de-print-table de-print-grid' : 'de-print-table'\n const tableStyle = { width, ...(meta.baseFont as CSSProperties) }\n const colgroup = (\n <colgroup>\n {cols.map((c) => (\n <col key={c} style={{ width: l.colAxis.size(c) }} />\n ))}\n </colgroup>\n )\n const node = (\n <div className=\"de-print-sheet de-print-fit\" style={{ '--de-fit': fit } as CSSProperties}>\n {tables.map((rows, i) => (\n <table key={i} className={className} style={tableStyle}>\n {colgroup}\n <tbody>{rows}</tbody>\n </table>\n ))}\n </div>\n )\n return {\n node,\n size: landscape ? 'landscape' : 'auto',\n margin: '12mm',\n notice: l.rows > MAX_PRINT_ROWS ? `Only the first ${MAX_PRINT_ROWS.toLocaleString()} rows are included` : undefined,\n }\n}\n","import { useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, type CSSProperties, type MutableRefObject, type ReactNode } from 'react'\nimport type { BookOp, CellDetail, CellInput, CellOut, FindMatch, FindOptions, FmtPatch, Merge, Range, SheetOp, SheetProgress, WorkbookMeta, XlsxEditResult } from '../../core/xlsx/types'\nimport { colName } from '../../core/xlsx/workbook'\nimport { closeFormula, formulaContext, isFormula, rangeText, type FormulaContext } from '../../core/xlsx/formula/assist'\nimport { argSlot, functionInfo, suggestFunctions, type FnInfo } from '../../core/xlsx/formula/catalog'\nimport { MAX_COL, MAX_ROW } from '../../core/xlsx/formula/types'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { getPeers, publishLocal, subscribePeers } from '../../collab/hosts'\nimport { claimFocus, useForceUpdate, useScroll, useSize } from '../common/hooks'\nimport { useFileOps, useViewer, useSelectAll } from '../common/Slots'\nimport { Status } from '../common/Status'\nimport { ContextMenu, MOD, type MenuItem } from '../common/ContextMenu'\nimport { Toast } from '../common/Dialog'\nimport { FindBar } from '../docx/FindBar'\nimport { XlsxToolbar, type MergeMode } from './XlsxToolbar'\nimport { Axis } from './axis'\nimport { fitNumber, fontPx } from './fit'\nimport { sheetPrintable, sheetText } from './print'\n\nconst BLOCK = 128\nconst HH = 22\nconst MAX_SCROLL_PX = 12_000_000\n\ninterface CachedBlock {\n rows: Map<number, CellOut[]>\n complete: boolean\n rowsAt: number\n}\n\nclass SheetState {\n rows = 0\n cols = 0\n done = false\n error?: string\n header = false\n rowAxis = new Axis(20)\n colAxis = new Axis(64)\n merges: Merge[] = []\n frozen = { rows: 0, cols: 0 }\n gridLines = true\n blocks = new Map<number, CachedBlock>()\n inflight = new Set<number>()\n /** view state kept while another sheet is shown */\n sel?: Selection\n scrollPos?: { x: number; y: number }\n}\n\nclass XlsxStore {\n sheets = new Map<number, SheetState>()\n /** focus the grid when the next sheet grid mounts */\n focusGrid = false\n private listeners = new Set<() => void>()\n private off: () => void\n\n constructor(private client: DocumentClient) {\n const offs = [\n client.on('xlsx:progress', (p) => this.onProgress(p)),\n // edits of collaborators (src/collab)\n client.on('collab:xlsx', (res) => this.applied(res, client.info.xlsx as WorkbookMeta)),\n ]\n this.off = () => offs.forEach((f) => f())\n }\n\n subscribe(fn: () => void) {\n this.listeners.add(fn)\n return () => {\n this.listeners.delete(fn)\n }\n }\n\n private emit() {\n for (const fn of this.listeners) fn()\n }\n\n sheet(i: number): SheetState {\n let s = this.sheets.get(i)\n if (!s) {\n s = new SheetState()\n this.sheets.set(i, s)\n this.client.call('xlsx.load', i).catch((e) => {\n s!.error = (e as Error).message\n s!.done = true\n this.emit()\n })\n }\n return s\n }\n\n private onProgress(p: SheetProgress) {\n const s = this.sheet(p.sheet)\n if (p.defaultRowH !== undefined && !s.header) {\n s.header = true\n s.rowAxis.def = p.defaultRowH || 20\n s.colAxis.def = p.defaultColW || 64\n for (const ci of p.colInfo ?? []) s.colAxis.setRange(ci.min, ci.max, ci.w)\n s.frozen = p.frozen ?? s.frozen\n s.gridLines = p.gridLines ?? true\n }\n for (const [r, px] of p.rowSizes) s.rowAxis.set(r, px)\n if (p.recalc) s.blocks.clear()\n s.rows = Math.max(s.rows, p.rows)\n s.cols = Math.max(s.cols, p.cols)\n if (p.merges) s.merges = p.merges\n if (p.error) s.error = p.error\n s.done = p.done\n this.emit()\n }\n\n ensure(sheet: number, r0: number, r1: number) {\n const s = this.sheet(sheet)\n if (!s.header && !s.done) return\n for (let b = Math.floor(r0 / BLOCK); b <= Math.floor(r1 / BLOCK); b++) {\n const cached = s.blocks.get(b)\n if (s.inflight.has(b)) continue\n if (cached && (cached.complete || (cached.rowsAt === s.rows && !s.done))) continue\n if (b * BLOCK > s.rows && !s.done && cached) continue\n s.inflight.add(b)\n const rowsAt = s.rows\n this.client\n .call('xlsx.block', sheet, b * BLOCK, (b + 1) * BLOCK)\n .then((res) => {\n const rows = new Map<number, CellOut[]>()\n for (const r of res.rows) rows.set(r.r, r.cells)\n s.blocks.set(b, { rows, complete: res.complete, rowsAt })\n if (s.blocks.size > 400) {\n const firstKey = s.blocks.keys().next().value as number\n s.blocks.delete(firstKey)\n }\n })\n .catch(() => {})\n .finally(() => {\n s.inflight.delete(b)\n this.emit()\n })\n }\n }\n\n /** drop cached rows so they are fetched again (after edits) */\n invalidate(sheet: number, r0: number, r1: number) {\n const s = this.sheet(sheet)\n for (let b = Math.floor(r0 / BLOCK); b <= Math.floor(r1 / BLOCK); b++) s.blocks.delete(b)\n s.rows = Math.max(s.rows, r1 + 1)\n this.emit()\n }\n\n /** applies an edit result: new styles, layout, sheet list + refetch of touched rows */\n applied(res: XlsxEditResult | null, meta: WorkbookMeta) {\n if (!res) return\n for (const st of res.styles ?? []) {\n meta.styles[st.index] = st.css\n meta.formats[st.index] = st.format\n }\n for (const i of res.recalc ?? []) this.sheets.get(i)?.blocks.clear()\n if (res.sheets) {\n meta.sheets = res.sheets\n this.sheets.clear()\n this.emit()\n return\n }\n const s = this.sheet(res.sheet)\n if (res.layout) {\n const l = res.layout\n s.rowAxis = new Axis(l.defaultRowH || s.rowAxis.def)\n s.colAxis = new Axis(l.defaultColW || s.colAxis.def)\n for (const ci of l.colInfo ?? []) s.colAxis.setRange(ci.min, ci.max, ci.w)\n for (const [r, px] of l.rowSizes) s.rowAxis.set(r, px)\n s.merges = l.merges ?? []\n s.frozen = l.frozen ?? s.frozen\n if (l.gridLines !== undefined) s.gridLines = l.gridLines\n s.rows = l.rows\n s.cols = l.cols\n s.blocks.clear()\n this.emit()\n return\n }\n s.cols = Math.max(s.cols, res.range.c1 + 1)\n this.invalidate(res.sheet, res.range.r0, res.range.r1)\n }\n\n row(sheet: number, r: number): CellOut[] | undefined {\n return this.sheets.get(sheet)?.blocks.get(Math.floor(r / BLOCK))?.rows.get(r)\n }\n\n dispose() {\n this.off()\n this.listeners.clear()\n }\n}\n\nconst stores = new WeakMap<DocumentClient, XlsxStore>()\nfunction storeFor(client: DocumentClient) {\n let s = stores.get(client)\n if (!s) stores.set(client, (s = new XlsxStore(client)))\n return s\n}\n\nexport interface XlsxViewProps {\n client: DocumentClient\n onStatus?: (s: string) => void\n initialSheet?: number\n}\n\nexport function XlsxView({ client, onStatus, initialSheet }: XlsxViewProps) {\n const meta = client.info.xlsx as WorkbookMeta\n const visible = meta.sheets.filter((s) => !s.hidden)\n const [active, setActive] = useState(initialSheet ?? visible[0]?.index ?? 0)\n const store = useMemo(() => storeFor(client), [client])\n const [, bump] = useForceUpdate()\n useEffect(() => store.subscribe(bump), [store, bump])\n const state = store.sheet(active)\n\n const status = state.error\n ? `Error: ${state.error}`\n : `${state.rows.toLocaleString()} rows × ${state.cols.toLocaleString()} cols${state.done ? '' : ' · loading…'}`\n\n const viewer = useViewer()\n useFileOps({\n printable: () => sheetPrintable(client, cur, store.sheet(cur), meta),\n text: (format) => sheetText(client, cur, store.sheet(cur), format === 'tsv' ? '\\t' : ','),\n stats: () => {\n const s = store.sheet(cur)\n return [\n ['Sheets', `${meta.sheets.length}${meta.sheets.some((x) => x.hidden) ? ` (${meta.sheets.filter((x) => x.hidden).length} hidden)` : ''}`],\n ['Current sheet', meta.sheets[cur]?.name ?? ''],\n ['Used range', `${s.rows.toLocaleString()} rows × ${s.cols.toLocaleString()} columns${s.done ? '' : ' (loading)'}`],\n ]\n },\n importTable: async (rows, name) => {\n const res = await client.call('xlsx.bookOp', { op: 'add', name, after: cur })\n store.applied(res, meta)\n viewer.setDirty(true)\n const idx = cur + 1\n setActive(idx)\n // cells can be written once the new sheet is loaded\n await new Promise<void>((resolve, reject) => {\n let off = () => {}\n const check = () => {\n const s = store.sheet(idx)\n if (s.error) reject(new Error(s.error))\n else if (s.done) resolve()\n else return\n off()\n }\n off = store.subscribe(check)\n check()\n })\n const cells: CellInput[] = []\n rows.forEach((row, r) => row.forEach((input, c) => input !== '' && cells.push({ r, c, input })))\n if (cells.length) store.applied(await client.call('xlsx.set', idx, cells), meta)\n bump()\n },\n })\n const [renaming, setRenaming] = useState<number | null>(null)\n const [tabMenu, setTabMenu] = useState<{ index: number; x: number; y: number } | null>(null)\n const bookOp = async (op: BookOp, goTo?: number) => {\n try {\n const res = await client.call('xlsx.bookOp', op)\n store.applied(res, meta)\n viewer.setDirty(true)\n if (goTo !== undefined) setActive(Math.max(0, Math.min(goTo, meta.sheets.length - 1)))\n bump()\n } catch (e) {\n alertError(e)\n }\n }\n const cur = Math.min(active, meta.sheets.length - 1)\n const [edit, setEdit] = useState<EditState | null>(null)\n /** set while switching sheets during a formula edit: blur must not commit */\n const hold = useRef(false)\n const keepEditing = !!edit && isFormula(edit.value) && canPoint(edit, formulaContext(edit.value, edit.caret))\n\n return (\n <div className=\"de-xlsx\">\n <Status text={status} onStatus={onStatus} />\n <SheetGrid\n key={`${cur}:${meta.sheets[cur]?.path}`}\n store={store}\n sheet={cur}\n meta={meta}\n client={client}\n edit={edit}\n setEdit={setEdit}\n hold={hold}\n onSheet={setActive}\n />\n <div className=\"de-tabs\" role=\"tablist\">\n {viewer.editable && (\n <button type=\"button\" className=\"de-tab de-tab-add\" title=\"Add sheet\" onClick={() => void bookOp({ op: 'add', after: cur }, cur + 1)}>\n +\n </button>\n )}\n {meta.sheets.filter((s) => !s.hidden).map((s) =>\n renaming === s.index ? (\n <input\n key={s.index}\n className=\"de-tab-input\"\n autoFocus\n defaultValue={s.name}\n onBlur={(e) => {\n setRenaming(null)\n if (e.target.value.trim() && e.target.value !== s.name) void bookOp({ op: 'rename', index: s.index, name: e.target.value })\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur()\n if (e.key === 'Escape') setRenaming(null)\n }}\n />\n ) : (\n <button\n key={s.index}\n type=\"button\"\n role=\"tab\"\n className=\"de-tab\"\n aria-selected={s.index === cur}\n onMouseDown={(e) => {\n // formula being typed: clicking another sheet keeps editing (cross-sheet references)\n if (!keepEditing) return\n e.preventDefault()\n if (s.index !== cur) hold.current = true\n }}\n onClick={() => setActive(s.index)}\n onDoubleClick={() => viewer.editable && setRenaming(s.index)}\n onContextMenu={(e) => {\n if (!viewer.editable) return\n e.preventDefault()\n setTabMenu({ index: s.index, x: e.clientX, y: e.clientY })\n }}\n >\n {s.name}\n </button>\n ),\n )}\n </div>\n {tabMenu && (\n <ContextMenu\n x={tabMenu.x}\n y={tabMenu.y}\n onClose={() => setTabMenu(null)}\n items={[\n { label: 'Rename', run: () => setRenaming(tabMenu.index) },\n { label: 'Duplicate name → new sheet', run: () => void bookOp({ op: 'add', after: tabMenu.index, name: meta.sheets[tabMenu.index].name + ' (2)' }, tabMenu.index + 1) },\n { label: 'Move left', disabled: tabMenu.index === 0, run: () => void bookOp({ op: 'move', from: tabMenu.index, to: tabMenu.index - 1 }, tabMenu.index - 1) },\n { label: 'Move right', disabled: tabMenu.index >= meta.sheets.length - 1, run: () => void bookOp({ op: 'move', from: tabMenu.index, to: tabMenu.index + 1 }, tabMenu.index + 1) },\n { label: 'Delete sheet', disabled: meta.sheets.length <= 1, run: () => void bookOp({ op: 'delete', index: tabMenu.index }, Math.max(0, tabMenu.index - 1)) },\n ]}\n />\n )}\n </div>\n )\n}\n\nfunction alertError(e: unknown) {\n console.error('[office-engine]', e)\n}\n\nexport { ContextMenu, type MenuItem } from '../common/ContextMenu'\n\ninterface GridProps {\n store: XlsxStore\n sheet: number\n meta: WorkbookMeta\n client: DocumentClient\n edit: EditState | null\n setEdit: React.Dispatch<React.SetStateAction<EditState | null>>\n hold: MutableRefObject<boolean>\n onSheet: (i: number) => void\n}\n\n/** text rotation (OOXML degrees, + = counter-clockwise, 255 = stacked) */\nfunction rotated(rot: number): CSSProperties {\n if (rot === 255) return { writingMode: 'vertical-rl', textOrientation: 'upright', whiteSpace: 'nowrap' }\n if (rot === 90) return { writingMode: 'vertical-rl', transform: 'rotate(180deg)', whiteSpace: 'nowrap' }\n if (rot === -90) return { writingMode: 'vertical-rl', whiteSpace: 'nowrap' }\n return { display: 'inline-block', transform: `rotate(${-rot}deg)`, whiteSpace: 'nowrap' }\n}\n\nconst JUSTIFY: Record<string, string> = { center: 'center', right: 'flex-end', left: 'flex-start', justify: 'flex-start' }\n\ninterface Selection {\n ar: number\n ac: number\n fr: number\n fc: number\n}\n\ninterface EditState {\n /** sheet of the edited cell (may differ from the shown sheet while pointing) */\n sheet: number\n r: number\n c: number\n value: string\n initial: string\n /** editing in the formula bar */\n bar: boolean\n /** 'enter': started by typing (arrows point / commit), 'edit': F2, double click, formula bar */\n mode: 'enter' | 'edit'\n caret: number\n caretEnd: number\n /** bump to push caret/focus into the input */\n sync: number\n /** reference inserted by pointing: span in `value` + pointed block */\n point?: { s: number; e: number; sheet: number; ar: number; ac: number; fr: number; fc: number }\n /** autocomplete dismissed (Escape) for the word starting here */\n noSuggest?: number\n}\n\n/** pointing a reference is possible at the caret */\nfunction canPoint(e: EditState, fc: FormulaContext | null): boolean {\n if (!fc) return false\n if (e.point && e.point.e === e.caret && e.caret === e.caretEnd) return true\n if (e.caret !== e.caretEnd) return fc.refs.some((r) => r.s === e.caret && r.e === e.caretEnd)\n return fc.pointable\n}\n\nconst REF_COLORS = ['#1a73e8', '#e8710a', '#9334e6', '#188038', '#d93025', '#12a4b8', '#e52592', '#b08800']\nconst refKey = (t: string) => t.replace(/\\$/g, '').toUpperCase()\n\nconst ARROWS: Record<string, [number, number]> = { ArrowUp: [-1, 0], ArrowDown: [1, 0], ArrowLeft: [0, -1], ArrowRight: [0, 1] }\n\nexport const rectOf = (s: Selection): Range => ({ r0: Math.min(s.ar, s.fr), c0: Math.min(s.ac, s.fc), r1: Math.max(s.ar, s.fr), c1: Math.max(s.ac, s.fc) })\n\n/** grows a range until it holds every merged cell it touches (like Excel / Sheets selections) */\nexport function withMerges(r: Range, merges: Merge[]): Range {\n let out = r\n for (let changed = true; changed; ) {\n changed = false\n for (const m of merges) {\n if (m.r1 < out.r0 || m.r0 > out.r1 || m.c1 < out.c0 || m.c0 > out.c1) continue\n if (m.r0 >= out.r0 && m.r1 <= out.r1 && m.c0 >= out.c0 && m.c1 <= out.c1) continue\n out = { r0: Math.min(out.r0, m.r0), c0: Math.min(out.c0, m.c0), r1: Math.max(out.r1, m.r1), c1: Math.max(out.c1, m.c1) }\n changed = true\n }\n }\n return out\n}\n\nfunction SheetGrid({ store, sheet, meta, client, edit, setEdit, hold, onSheet }: GridProps) {\n const viewer = useViewer()\n const editable = viewer.editable\n const s = store.sheet(sheet)\n const [scrollRef, size] = useSize<HTMLDivElement>()\n const scroll = useScroll(scrollRef)\n const [sel, setSelState] = useState<Selection>(() => s.sel ?? { ar: 0, ac: 0, fr: 0, fc: 0 })\n s.sel = sel\n const [detailState, setDetail] = useState<{ r: number; c: number; d?: CellDetail } | null>(null)\n const detail = detailState && detailState.r === sel.ar && detailState.c === sel.ac ? detailState.d : undefined\n const [detailTick, setDetailTick] = useState(0)\n const dragging = useRef(false)\n const editRef = useRef<HTMLTextAreaElement>(null)\n const hlRef = useRef<HTMLDivElement>(null)\n const fxRef = useRef<HTMLInputElement>(null)\n const [sugIdx, setSugIdx] = useState(0)\n const [ctx, setCtx] = useState<{ x: number; y: number } | null>(null)\n /** paint format: style index copied from the active cell, applied to the next selection */\n const [painter, setPainter] = useState<number | null>(null)\n const afterDrag = useRef<(() => void) | null>(null)\n const [find, setFind] = useState<{ open: boolean; q: string; idx: number; replace: boolean; tick: number }>({ open: false, q: '', idx: 0, replace: false, tick: 0 })\n const [findOpts, setFindOpts] = useState<FindOptions>({})\n const [matches, setMatches] = useState<FindMatch[]>([])\n const [toast, setToast] = useState<string | null>(null)\n const [resizing, setResizing] = useState<{ axis: 'col' | 'row'; i: number; start: number; size: number } | null>(null)\n\n const { rowAxis, colAxis, frozen } = s\n const HW = Math.max(40, 12 + 7 * String(Math.max(s.rows, 1000)).length)\n const viewW = Math.max(0, size.w - HW)\n const viewH = Math.max(0, size.h - HH)\n rowAxis.count = Math.max(s.rows + (s.done ? 20 : 1), Math.ceil(viewH / rowAxis.def) + 1, frozen.rows + 1, sel.fr + 2)\n colAxis.count = Math.max(s.cols + 3, 26, Math.ceil(viewW / Math.max(1, colAxis.def)) + 1, frozen.cols + 1, sel.fc + 2)\n const frozenW = colAxis.pos(frozen.cols)\n const frozenH = rowAxis.pos(frozen.rows)\n const totalW = colAxis.total()\n const totalH = rowAxis.total()\n\n // virtual scroll with clamped spacer height (browsers cap element size)\n const spacerW = HW + totalW\n const spacerH = Math.min(HH + totalH, MAX_SCROLL_PX)\n const maxLogicalY = Math.max(0, HH + totalH - size.h)\n const maxScrollY = Math.max(0, spacerH - size.h)\n const scrollY = maxScrollY > 0 ? Math.min(maxLogicalY, (scroll.y / maxScrollY) * maxLogicalY) : 0\n const scrollX = scroll.x\n\n const mainOx = frozenW + scrollX\n const mainOy = frozenH + scrollY\n const mainW = Math.max(0, viewW - frozenW)\n const mainH = Math.max(0, viewH - frozenH)\n const r0 = rowAxis.index(mainOy)\n const r1 = Math.min(rowAxis.count - 1, rowAxis.index(mainOy + mainH))\n const c0 = colAxis.index(mainOx)\n const c1 = Math.min(colAxis.count - 1, colAxis.index(mainOx + mainW))\n\n // merges touching the visible area (+ frozen panes)\n const visMerges = useMemo(() => {\n const inRange = (m: Merge) =>\n (m.r1 >= r0 && m.r0 <= r1) || m.r0 < frozen.rows ? (m.c1 >= c0 && m.c0 <= c1) || m.c0 < frozen.cols : false\n return s.merges.filter(inRange)\n }, [s.merges, r0, r1, c0, c1, frozen.rows, frozen.cols])\n\n useEffect(() => {\n if (frozen.rows) store.ensure(sheet, 0, frozen.rows - 1)\n store.ensure(sheet, Math.max(0, r0 - 20), r1 + 40)\n for (const m of visMerges) if (m.r0 < r0) store.ensure(sheet, m.r0, m.r0)\n })\n\n useEffect(() => {\n let live = true\n const { ar, ac } = sel\n client.call('xlsx.cell', sheet, ar, ac).then((d) => live && setDetail({ r: ar, c: ac, d }), () => {})\n return () => {\n live = false\n }\n }, [client, sheet, sel.ar, sel.ac, s.done, detailTick])\n\n const styles = meta.styles\n const basePx = fontPx(meta.baseFont.fontSize, 14.67)\n const mergeAt = (r: number, c: number) => s.merges.find((m) => r >= m.r0 && r <= m.r1 && c >= m.c0 && c <= m.c1)\n const rect = withMerges(rectOf(sel), s.merges)\n /** one cell, or exactly one merged cell */\n const oneCell = (rect.r0 === rect.r1 && rect.c0 === rect.c1) || s.merges.some((m) => m.r0 === rect.r0 && m.c0 === rect.c0 && m.r1 === rect.r1 && m.c1 === rect.c1)\n const selRef = useRef(rect)\n selRef.current = rect\n // collaboration: share the selection, show the collaborators' ones\n useEffect(() => publishLocal(client, { sheet, range: rect, ar: sel.ar, ac: sel.ac }), [client, sheet, rect.r0, rect.c0, rect.r1, rect.c1, sel.ar, sel.ac]) // eslint-disable-line react-hooks/exhaustive-deps\n const peers = useSyncExternalStore(\n (fn) => subscribePeers(client, fn),\n () => getPeers(client),\n )\n const sheetPath = meta.sheets[sheet]?.path\n const peerSels = peers.flatMap((p) => {\n const x = p.presence as { k?: string; sheet?: string; range?: Range; ar?: number; ac?: number } | undefined\n return x?.k === 'xlsx' && x.sheet === sheetPath && x.range ? [{ ...p, range: x.range, ar: x.ar ?? x.range.r0, ac: x.ac ?? x.range.c0 }] : []\n })\n\n useLayoutEffect(() => {\n hold.current = false\n const el = scrollRef.current\n if (el && s.scrollPos) {\n el.scrollLeft = s.scrollPos.x\n el.scrollTop = s.scrollPos.y\n }\n if (store.focusGrid) {\n store.focusGrid = false\n el?.focus({ preventScroll: true })\n } else claimFocus(el ?? null) // keyboard first: a focused host page control keeps the focus\n return () => {\n if (el?.isConnected) s.scrollPos = { x: el.scrollLeft, y: el.scrollTop }\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n const setSel = (next: Selection) => {\n const m = mergeAt(next.ar, next.ac)\n if (m) next = { ...next, ar: m.r0, ac: m.c0 }\n setSelState(next)\n }\n\n // ---------------------------------------------------------------- rendering helpers\n\n function region(key: string, rr0: number, rr1: number, cc0: number, cc1: number, ox: number, oy: number, left: number, top: number, w: number, h: number) {\n if (w <= 0 || h <= 0 || rr1 < rr0 || cc1 < cc0) return null\n const out: ReactNode[] = []\n if (s.gridLines) {\n for (let r = rr0; r <= rr1; r++) out.push(<div key={'h' + r} className=\"de-gl-h\" style={{ top: rowAxis.pos(r + 1) - oy - 1 }} />)\n for (let c = cc0; c <= cc1; c++) out.push(<div key={'v' + c} className=\"de-gl-v\" style={{ left: colAxis.pos(c + 1) - ox - 1 }} />)\n }\n const covered = new Set<number>()\n const anchors: Merge[] = []\n for (const m of visMerges) {\n if (m.r1 < rr0 || m.r0 > rr1 || m.c1 < cc0 || m.c0 > cc1) continue\n anchors.push(m)\n for (let r = Math.max(m.r0, rr0); r <= Math.min(m.r1, rr1); r++)\n for (let c = Math.max(m.c0, cc0); c <= Math.min(m.c1, cc1); c++) covered.add(r * 16384 + c)\n }\n const cellEl = (r: number, cell: CellOut, wOverride?: number, hOverride?: number, filled?: Set<number>, merged = false) => {\n const [c, raw, si, kind, color] = cell\n const cw = wOverride ?? colAxis.size(c)\n const ch = hOverride ?? rowAxis.size(r)\n if (!cw || !ch) return null\n const css = (styles[si] ?? {}) as Record<string, string | number>\n let text = raw\n if (kind === 1 && raw) text = fitNumber(raw, cw - 6, fontPx(css.fontSize, basePx))\n const { textAlign, textRotate, alignItems, whiteSpace, ...rest } = css\n const rot = Number(textRotate ?? 0)\n const justify = (textAlign && JUSTIFY[textAlign as string]) || (kind === 1 ? 'flex-end' : kind === 2 ? 'center' : 'flex-start')\n let ov = 0\n if (text && !rot && !whiteSpace && justify === 'flex-start' && !merged && filled) {\n let next = c + 1\n while (next <= cc1 + 8 && !filled.has(next) && !covered.has(r * 16384 + next)) next++\n ov = colAxis.pos(next) - colAxis.pos(c)\n }\n const style: CSSProperties = {\n ...(rest as CSSProperties),\n left: colAxis.pos(c) - ox,\n top: rowAxis.pos(r) - oy,\n width: cw,\n height: ch,\n justifyContent: justify,\n alignItems: (alignItems as string) ?? 'flex-end',\n textAlign: (textAlign as CSSProperties['textAlign']) ?? undefined,\n }\n if (color) style.color = color\n if (whiteSpace) style.whiteSpace = whiteSpace as CSSProperties['whiteSpace']\n // a merged cell hides the gridlines inside it (its own right / bottom edge lines stay visible)\n if (merged && !rest.background) style.background = 'linear-gradient(#fff, #fff) 0 0 / calc(100% - 1px) calc(100% - 1px) no-repeat'\n const overflow = ov > cw\n return (\n <div key={`${r}:${c}`} className={overflow ? 'de-cell de-ov' : 'de-cell'} style={style}>\n {text && <span style={rot ? rotated(rot) : overflow ? { maxWidth: ov - 6, overflow: 'hidden', flex: 'none' } : undefined}>{text}</span>}\n </div>\n )\n }\n for (const m of anchors) {\n const row = store.row(sheet, m.r0)\n const cell = row?.find((x) => x[0] === m.c0) ?? ([m.c0, '', 0, 0] as CellOut)\n out.push(cellEl(m.r0, cell, colAxis.pos(m.c1 + 1) - colAxis.pos(m.c0), rowAxis.pos(m.r1 + 1) - rowAxis.pos(m.r0), undefined, true))\n }\n for (let r = rr0; r <= rr1; r++) {\n const row = store.row(sheet, r)\n if (!row) continue\n let filled: Set<number> | undefined\n for (const cell of row) {\n const c = cell[0]\n if (c < cc0 - 8 || c > cc1) continue\n if (covered.has(r * 16384 + c)) continue\n if (c < cc0 && (!cell[1] || cell[3] !== 0)) continue\n if (anchors.some((m) => m.r0 === r && m.c0 === c)) continue\n if (!filled && cell[3] === 0 && cell[1]) filled = new Set(row.filter((x) => x[1] !== '').map((x) => x[0]))\n out.push(cellEl(r, cell, undefined, undefined, filled))\n }\n }\n // selection range + active cell\n if (rect.r1 >= rr0 && rect.r0 <= rr1 && rect.c1 >= cc0 && rect.c0 <= cc1 && !oneCell) {\n out.push(\n <div\n key=\"range\"\n className=\"de-range\"\n style={{\n left: colAxis.pos(rect.c0) - ox,\n top: rowAxis.pos(rect.r0) - oy,\n width: colAxis.pos(rect.c1 + 1) - colAxis.pos(rect.c0),\n height: rowAxis.pos(rect.r1 + 1) - rowAxis.pos(rect.r0),\n }}\n />,\n )\n }\n if (sel.ar >= rr0 - 1 && sel.ar <= rr1 && sel.ac >= cc0 - 1 && sel.ac <= cc1) {\n const m = mergeAt(sel.ar, sel.ac)\n const sw = m ? colAxis.pos(m.c1 + 1) - colAxis.pos(m.c0) : colAxis.size(sel.ac)\n const sh = m ? rowAxis.pos(m.r1 + 1) - rowAxis.pos(m.r0) : rowAxis.size(sel.ar)\n out.push(<div key=\"sel\" className=\"de-sel\" style={{ left: colAxis.pos(sel.ac) - ox - 1, top: rowAxis.pos(sel.ar) - oy - 1, width: sw + 1, height: sh + 1 }} />)\n }\n // collaborators' selections\n for (const p of peerSels) {\n const b = p.range\n if (b.r1 < rr0 || b.r0 > rr1 || b.c1 < cc0 || b.c0 > cc1) continue\n const x0 = colAxis.pos(b.c0)\n const y0 = rowAxis.pos(b.r0)\n const x1 = colAxis.pos(b.c1 + 1)\n const y1 = rowAxis.pos(b.r1 + 1)\n out.push(\n <div key={'peer' + p.site} className=\"de-peer-range\" style={{ left: x0 - ox - 1, top: y0 - oy - 1, width: x1 - x0 + 1, height: y1 - y0 + 1, borderColor: p.color, background: p.color + '12' }}>\n {p.ar >= rr0 && p.ar <= rr1 && p.ac >= cc0 && p.ac <= cc1 && (\n <span className=\"de-peer-tag\" style={{ background: p.color }}>\n {p.name}\n </span>\n )}\n </div>,\n )\n }\n // find matches\n findBoxes.forEach((m, i) => {\n if (m.r < rr0 || m.r > rr1 || m.c < cc0 || m.c > cc1) return\n out.push(\n <div\n key={'fm' + i}\n className={i === find.idx ? 'de-findcell on' : 'de-findcell'}\n style={{ left: colAxis.pos(m.c) - ox, top: rowAxis.pos(m.r) - oy, width: colAxis.size(m.c), height: rowAxis.size(m.r) }}\n />,\n )\n })\n // references of the formula being edited\n refBoxes.forEach((b, i) => {\n if (b.r1 < rr0 || b.r0 > rr1 || b.c1 < cc0 || b.c0 > cc1) return\n const y0 = rowAxis.pos(Math.max(b.r0, rr0 - 1))\n const y1 = rowAxis.pos(Math.min(b.r1, rr1 + 1) + 1)\n const x0 = colAxis.pos(Math.max(b.c0, cc0 - 1))\n const x1 = colAxis.pos(Math.min(b.c1, cc1 + 1) + 1)\n out.push(\n <div\n key={'fr' + i}\n className={b.point ? 'de-fref de-fref-pt' : 'de-fref'}\n style={{ left: x0 - ox - 1, top: y0 - oy - 1, width: x1 - x0 + 1, height: y1 - y0 + 1, borderColor: b.color, background: b.color + '14' }}\n />,\n )\n })\n return (\n <div key={key} className=\"de-region\" style={{ left, top, width: w, height: h }}>\n {out}\n </div>\n )\n }\n\n function colHeaders(key: string, cc0: number, cc1: number, ox: number, left: number, w: number) {\n if (w <= 0) return null\n const out: ReactNode[] = []\n for (let c = cc0; c <= cc1; c++) {\n const cw = colAxis.size(c)\n if (!cw) continue\n out.push(\n <div key={c} data-col={c} className={c >= rect.c0 && c <= rect.c1 ? 'de-head-c de-head-on' : 'de-head-c'} style={{ left: colAxis.pos(c) - ox, top: 0, width: cw, height: HH }}>\n {colName(c)}\n </div>,\n )\n if (editable) out.push(<div key={'g' + c} data-grip-col={c} className=\"de-grip-c\" style={{ left: colAxis.pos(c + 1) - ox - 3, height: HH }} />)\n }\n return (\n <div key={key} className=\"de-region\" style={{ left, top: 0, width: w, height: HH }}>\n {out}\n </div>\n )\n }\n\n function rowHeaders(key: string, rr0: number, rr1: number, oy: number, top: number, h: number) {\n if (h <= 0) return null\n const out: ReactNode[] = []\n for (let r = rr0; r <= rr1; r++) {\n const rh = rowAxis.size(r)\n if (!rh) continue\n out.push(\n <div key={r} data-row={r} className={r >= rect.r0 && r <= rect.r1 ? 'de-head-r de-head-on' : 'de-head-r'} style={{ left: 0, top: rowAxis.pos(r) - oy, width: HW, height: rh }}>\n {r + 1}\n </div>,\n )\n if (editable) out.push(<div key={'g' + r} data-grip-row={r} className=\"de-grip-r\" style={{ top: rowAxis.pos(r + 1) - oy - 3, width: HW }} />)\n }\n return (\n <div key={key} className=\"de-region\" style={{ left: 0, top, width: HW, height: h }}>\n {out}\n </div>\n )\n }\n\n const fr = frozen.rows\n const fc = frozen.cols\n const fw = Math.min(frozenW, viewW)\n const fh = Math.min(frozenH, viewH)\n\n /** cell rectangle in grid-view coordinates (frozen-pane aware) */\n const cellBox = (r: number, c: number) => {\n const m = mergeAt(r, c)\n const x = HW + colAxis.pos(c) - (c >= fc ? scrollX : 0)\n const y = HH + rowAxis.pos(r) - (r >= fr ? scrollY : 0)\n return {\n x,\n y,\n w: m ? colAxis.pos(m.c1 + 1) - colAxis.pos(m.c0) : colAxis.size(c),\n h: m ? rowAxis.pos(m.r1 + 1) - rowAxis.pos(m.r0) : rowAxis.size(r),\n }\n }\n\n const scrollIntoView = (r: number, c: number) => {\n const el = scrollRef.current\n if (!el) return\n const x = colAxis.pos(c)\n const y = rowAxis.pos(r)\n if (c >= fc) {\n if (x - frozenW < scrollX) el.scrollLeft = x - frozenW\n else if (x + colAxis.size(c) > mainOx + mainW) el.scrollLeft = x + colAxis.size(c) - frozenW - mainW\n }\n if (r >= fr && maxLogicalY > 0) {\n let ty = scrollY\n if (y - frozenH < scrollY) ty = y - frozenH\n else if (y + rowAxis.size(r) > mainOy + mainH) ty = y + rowAxis.size(r) - frozenH - mainH\n if (ty !== scrollY) el.scrollTop = (ty / maxLogicalY) * maxScrollY\n }\n }\n\n const cellAt = (clientX: number, clientY: number, el: HTMLElement) => {\n const b = el.getBoundingClientRect()\n const x = clientX - b.left - HW\n const y = clientY - b.top - HH\n const lx = x < frozenW ? x : x + scrollX\n const ly = y < frozenH ? y : y + scrollY\n return { r: y < 0 ? -1 : rowAxis.index(Math.max(0, ly)), c: x < 0 ? -1 : colAxis.index(Math.max(0, lx)) }\n }\n\n // ---------------------------------------------------------------- editing\n\n const focusGrid = () => scrollRef.current?.focus({ preventScroll: true })\n const selectSheet = () => setSel({ ar: 0, ac: 0, fr: Math.max(0, s.rows - 1), fc: Math.max(0, s.cols - 1) })\n // Ctrl/⌘+A from the viewer chrome / the page; a cell being edited keeps its own select-all\n useSelectAll(() => {\n if (edit) return\n focusGrid()\n selectSheet()\n })\n const styleOf = (r: number, c: number) => store.row(sheet, r)?.find((x) => x[0] === c)?.[2] ?? 0\n\n const run = async (p: Promise<XlsxEditResult | null>) => {\n try {\n const res = await p\n store.applied(res, meta)\n if (res) viewer.setDirty(true)\n setDetailTick((t) => t + 1)\n } catch (e) {\n console.error('[office-engine]', e)\n }\n }\n\n const shown = (d: CellDetail | undefined, r: number, c: number) => {\n if (!d) return ''\n if (d.formula) return d.formula\n // dates & times: show the formatted value rather than the serial number\n if (d.type === 'number' && /[dmyhs]/i.test((meta.formats[styleOf(r, c)] ?? '').replace(/\"[^\"]*\"|\\[[^\\]]*\\]/g, ''))) {\n return store.row(sheet, r)?.find((x) => x[0] === c)?.[1] ?? d.value\n }\n return d.value\n }\n\n const startEdit = async (initial?: string, bar = false) => {\n if (!editable || !s.done || edit) return\n const { ar, ac } = sel\n const begin = (value: string, initialText: string, mode: EditState['mode']) =>\n setEdit({ sheet, r: ar, c: ac, value, initial: initialText, bar, mode, caret: value.length, caretEnd: value.length, sync: bar ? 0 : 1 })\n // typing replaces the content: no need to know the current value\n if (initial !== undefined) return begin(initial, '\\u0000', 'enter')\n const d = detailState && detailState.r === ar && detailState.c === ac ? detailState.d : await client.call('xlsx.cell', sheet, ar, ac).catch(() => undefined)\n const current = shown(d, ar, ac)\n begin(current, current, 'edit')\n }\n\n // Enter and the editor's blur can both commit before React re-renders: write once\n const committed = useRef<EditState | null>(null)\n const commit = (move?: [number, number]) => {\n const e = edit\n if (!e || committed.current === e) return\n committed.current = e\n setEdit(null)\n const value = closeFormula(e.value)\n if (value !== e.initial) void run(client.call('xlsx.set', e.sheet, [{ r: e.r, c: e.c, input: value }]))\n if (e.sheet !== sheet) return backTo(e, move)\n if (move) moveBy(move[0], move[1], false)\n focusGrid()\n }\n\n const cancel = () => {\n const e = edit\n setEdit(null)\n if (e && e.sheet !== sheet) return backTo(e)\n focusGrid()\n }\n\n /** formula edited from another sheet: return to the edited cell's sheet */\n const backTo = (e: EditState, move?: [number, number]) => {\n const r = Math.max(0, e.r + (move?.[0] ?? 0))\n const c = Math.max(0, e.c + (move?.[1] ?? 0))\n store.sheet(e.sheet).sel = { ar: r, ac: c, fr: r, fc: c }\n store.focusGrid = true\n onSheet(e.sheet)\n }\n\n // ---------------------------------------------------------------- formula assist\n\n const own = !!edit && edit.sheet === sheet\n const inCell = own && !edit?.bar\n const fctx = edit && isFormula(edit.value) ? formulaContext(edit.value, edit.caret) : null\n const pointOk = !!edit && canPoint(edit, fctx)\n const pointActive = !!edit?.point && edit.point.e === edit.caret && edit.caret === edit.caretEnd\n\n // references of the formula being edited: colored spans + boxes on this sheet\n const refSpans: { s: number; e: number; color: string }[] = []\n const refBoxes: { r0: number; c0: number; r1: number; c1: number; color: string; point: boolean }[] = []\n if (fctx && edit) {\n const colors = new Map<string, string>()\n for (const f of fctx.refs) {\n const k = refKey(f.text)\n let color = colors.get(k)\n if (!color) colors.set(k, (color = REF_COLORS[colors.size % REF_COLORS.length]))\n refSpans.push({ s: f.s, e: f.e, color })\n const sh = f.ref.sheet\n const target = sh === undefined ? edit.sheet : meta.sheets.findIndex((x) => x.name.toLowerCase() === sh.toLowerCase())\n if (target === sheet) refBoxes.push({ r0: f.ref.r0, c0: f.ref.c0, r1: f.ref.r1, c1: f.ref.c1, color, point: pointActive && f.s === edit.point!.s })\n }\n }\n\n const word = fctx?.word && edit?.noSuggest !== fctx.word.s && edit?.caret === edit?.caretEnd ? fctx.word : undefined\n const sugg: FnInfo[] = word ? suggestFunctions(word.text, 8) : []\n const hint = !sugg.length && fctx?.call ? functionInfo(fctx.call.name) : undefined\n const sugKey = word ? `${word.s}:${word.text}` : ''\n useEffect(() => setSugIdx(0), [sugKey])\n\n const inputEl = (): HTMLTextAreaElement | HTMLInputElement | null => (inCell ? editRef.current : fxRef.current)\n\n // push focus + caret into the active input (start, pointing, autocomplete, sheet switch)\n useLayoutEffect(() => {\n if (!edit) return\n const el = inputEl()\n if (!el) return\n const root = el.getRootNode() as Document | ShadowRoot\n if (root.activeElement !== el) el.focus({ preventScroll: true })\n if (edit.sync) el.setSelectionRange(edit.caret, edit.caretEnd)\n }, [edit?.sync, inCell, edit !== null]) // eslint-disable-line react-hooks/exhaustive-deps\n\n const readCaret = (el: HTMLTextAreaElement | HTMLInputElement) => {\n const a = el.selectionStart ?? el.value.length\n const b = el.selectionEnd ?? a\n setEdit((p) => (p && (p.caret !== a || p.caretEnd !== b) ? { ...p, caret: a, caretEnd: b } : p))\n }\n\n const onInput = (el: HTMLTextAreaElement | HTMLInputElement) => {\n const v = el.value\n const a = el.selectionStart ?? v.length\n const b = el.selectionEnd ?? a\n setEdit((p) => (p ? { ...p, value: v, caret: a, caretEnd: b, point: undefined } : p))\n }\n\n /** inserts / replaces the pointed reference at the caret */\n const pointAt = (ar: number, ac: number, fr: number, fc: number) => {\n setEdit((p) => {\n if (!p) return p\n const text = rangeText(ar, ac, fr, fc, sheet !== p.sheet ? meta.sheets[sheet]?.name : undefined)\n const live = p.point && p.point.e === p.caret && p.caret === p.caretEnd\n const s0 = live ? p.point!.s : p.caret\n const e0 = live ? p.point!.e : p.caretEnd\n if (live && p.value.slice(s0, e0) === text) return p\n const end = s0 + text.length\n return { ...p, value: p.value.slice(0, s0) + text + p.value.slice(e0), caret: end, caretEnd: end, sync: p.sync + 1, point: { s: s0, e: end, sheet, ar, ac, fr, fc } }\n })\n }\n\n const pointDrag = useRef<{ ar: number; ac: number; axis: 'cell' | 'col' | 'row' } | null>(null)\n\n /** keyboard pointing (Enter mode): arrows move the reference, Shift extends it */\n const movePoint = (dr: number, dc: number, extend: boolean) => {\n const p = edit?.point && pointActive && edit.point.sheet === sheet ? edit.point : null\n const baseR = p ? p.ar : own ? edit!.r : sel.ar\n const baseC = p ? p.ac : own ? edit!.c : sel.ac\n const clampR = (r: number) => Math.max(0, Math.min(rowAxis.count - 1, r))\n const clampC = (c: number) => Math.max(0, Math.min(colAxis.count - 1, c))\n if (extend) {\n const fr = clampR((p ? p.fr : baseR) + dr)\n const fc = clampC((p ? p.fc : baseC) + dc)\n pointAt(baseR, baseC, fr, fc)\n scrollIntoView(fr, fc)\n } else {\n const r = clampR(baseR + dr)\n const c = clampC(baseC + dc)\n pointAt(r, c, r, c)\n scrollIntoView(r, c)\n }\n }\n\n const accept = (f: FnInfo) => {\n const w = word\n if (!w) return\n setEdit((p) => {\n if (!p) return p\n const noArgs = !f.args.length && !f.variadic\n const ins = f.name + (w.call ? '' : noArgs ? '()' : '(')\n const caret = w.s + f.name.length + (noArgs && !w.call ? 2 : 1)\n return { ...p, value: p.value.slice(0, w.s) + ins + p.value.slice(w.e), caret, caretEnd: caret, sync: p.sync + 1, point: undefined }\n })\n }\n\n const moveBy = (dr: number, dc: number, extend: boolean) => {\n const baseR = extend ? sel.fr : sel.ar\n const baseC = extend ? sel.fc : sel.ac\n const m = !extend ? mergeAt(sel.ar, sel.ac) : undefined\n let r = baseR + dr\n let c = baseC + dc\n if (m && dr > 0) r = m.r1 + dr\n if (m && dc > 0) c = m.c1 + dc\n r = Math.max(0, Math.min(rowAxis.count - 1, r))\n c = Math.max(0, Math.min(colAxis.count - 1, c))\n while (r > 0 && rowAxis.size(r) === 0 && dr < 0) r--\n while (rowAxis.size(r) === 0 && r < rowAxis.count - 1) r++\n while (c > 0 && colAxis.size(c) === 0 && dc < 0) c--\n while (colAxis.size(c) === 0 && c < colAxis.count - 1) c++\n if (extend) setSelState({ ...sel, fr: r, fc: c })\n else setSel({ ar: r, ac: c, fr: r, fc: c })\n scrollIntoView(r, c)\n }\n\n const clearRange = () => {\n const cells = []\n const R = { ...rect, r1: Math.min(rect.r1, rect.r0 + 5000), c1: Math.min(rect.c1, rect.c0 + 200) }\n for (let r = R.r0; r <= R.r1; r++) {\n const row = store.row(sheet, r)\n for (let c = R.c0; c <= R.c1; c++) if (row?.some((x) => x[0] === c && x[1] !== '')) cells.push({ r, c, input: '' })\n }\n if (cells.length) void run(client.call('xlsx.set', sheet, cells))\n }\n\n const activeCss = (styles[styleOf(sel.ar, sel.ac)] ?? {}) as Record<string, string | number>\n const fmt = (patch: FmtPatch) => fmtAt(rect, patch)\n const fmtAt = (range: Range, patch: FmtPatch) => {\n void run(client.call('xlsx.format', sheet, range, patch))\n focusGrid()\n }\n const toggle = (k: 'b' | 'i' | 'u' | 'strike') => {\n const on =\n k === 'b' ? activeCss.fontWeight === 700 : k === 'i' ? activeCss.fontStyle === 'italic' : String(activeCss.textDecoration ?? '').includes(k === 'u' ? 'underline' : 'line-through')\n fmt({ [k]: !on })\n }\n const undo = () => void run(client.call('xlsx.undo'))\n const redo = () => void run(client.call('xlsx.redo'))\n\n const tsv = () => {\n const lines: string[] = []\n const R = { ...rect, r1: Math.min(rect.r1, rect.r0 + 20000) }\n for (let r = R.r0; r <= R.r1; r++) {\n const row = store.row(sheet, r)\n const vals: string[] = []\n for (let c = R.c0; c <= R.c1; c++) vals.push(row?.find((x) => x[0] === c)?.[1] ?? '')\n lines.push(vals.join('\\t'))\n }\n return lines.join('\\n')\n }\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (edit) return\n const mod = e.metaKey || e.ctrlKey\n const k = e.key.toLowerCase()\n if (mod && k === 's') {\n e.preventDefault()\n void viewer.save()\n return\n }\n if (mod && k === 'a' && !e.altKey && !e.shiftKey) {\n e.preventDefault()\n selectSheet()\n return\n }\n if (editable && mod && !e.altKey) {\n if (k === 'z') {\n e.preventDefault()\n if (e.shiftKey) redo()\n else undo()\n return\n }\n if (k === 'y') {\n e.preventDefault()\n redo()\n return\n }\n if (k === 'b' || k === 'i' || k === 'u') {\n e.preventDefault()\n toggle(k)\n return\n }\n if (k === 'd' || k === 'r') {\n e.preventDefault()\n void sheetOp({ op: 'fill', range: rect, dir: k === 'd' ? 'down' : 'right' })\n return\n }\n if (k === '\\\\') {\n e.preventDefault()\n fmt({ clear: true })\n return\n }\n if (k === 'x' && e.shiftKey) {\n e.preventDefault()\n toggle('strike')\n return\n }\n }\n if (mod && (k === 'f' || k === 'h')) {\n e.preventDefault()\n setFind((f) => ({ ...f, open: true, replace: k === 'h' || f.replace, tick: f.tick + 1 }))\n return\n }\n if (e.key === 'Escape' && painter !== null) {\n setPainter(null)\n return\n }\n const pageRows = Math.max(1, Math.floor(mainH / rowAxis.def) - 1)\n const moves: Record<string, [number, number]> = {\n ArrowUp: [-1, 0], ArrowDown: [1, 0], ArrowLeft: [0, -1], ArrowRight: [0, 1],\n PageDown: [pageRows, 0], PageUp: [-pageRows, 0],\n }\n if (moves[e.key]) {\n e.preventDefault()\n const [dr, dc] = moves[e.key]\n if (mod) moveBy(dr ? (dr > 0 ? Math.max(0, s.rows - 1 - (e.shiftKey ? sel.fr : sel.ar)) : -1e9) : 0, dc ? (dc > 0 ? Math.max(0, s.cols - 1 - (e.shiftKey ? sel.fc : sel.ac)) : -1e9) : 0, e.shiftKey)\n else moveBy(dr, dc, e.shiftKey)\n return\n }\n if (e.key === 'Enter' || e.key === 'Tab') {\n e.preventDefault()\n if (e.key === 'Enter') moveBy(e.shiftKey ? -1 : 1, 0, false)\n else moveBy(0, e.shiftKey ? -1 : 1, false)\n return\n }\n if (!editable) return\n if (e.key === 'F2') {\n e.preventDefault()\n void startEdit()\n } else if (e.key === 'Delete' || e.key === 'Backspace') {\n e.preventDefault()\n clearRange()\n } else if (e.key.length === 1 && !mod && !e.altKey) {\n e.preventDefault()\n void startEdit(e.key)\n }\n }\n\n const onMouseDown = (e: React.MouseEvent) => {\n if (e.button !== 0) return\n const grip = (e.target as HTMLElement).closest('[data-grip-col],[data-grip-row]') as HTMLElement | null\n if (grip) {\n e.preventDefault()\n const col = grip.dataset.gripCol\n const i = Number(col ?? grip.dataset.gripRow)\n setResizing(col !== undefined ? { axis: 'col', i, start: e.clientX, size: colAxis.size(i) } : { axis: 'row', i, start: e.clientY, size: rowAxis.size(i) })\n return\n }\n const el = e.currentTarget as HTMLElement\n const { r, c } = cellAt(e.clientX, e.clientY, el)\n if (edit && pointOk) {\n // formula: clicking / dragging cells inserts references, the input keeps focus\n e.preventDefault()\n if (r < 0 && c < 0) return\n const axis = r < 0 ? 'col' : c < 0 ? 'row' : 'cell'\n let [ar, ac] = [Math.max(r, 0), Math.max(c, 0)]\n const m = axis === 'cell' ? mergeAt(r, c) : undefined\n if (m) [ar, ac] = [m.r0, m.c0]\n const p = e.shiftKey && pointActive && edit.point!.sheet === sheet ? edit.point! : null\n if (p) [ar, ac] = [p.ar, p.ac]\n pointDrag.current = { ar, ac, axis }\n pointRange(ar, ac, r, c, axis)\n return\n }\n if (edit) commit()\n e.preventDefault()\n if (painter !== null && r >= 0 && c >= 0) {\n const xf = painter\n afterDrag.current = () => {\n setPainter(null)\n fmtAt(selRef.current, { xf })\n }\n }\n focusGrid()\n if (r < 0 && c < 0) {\n setSel({ ar: 0, ac: 0, fr: Math.max(0, s.rows - 1), fc: Math.max(0, s.cols - 1) })\n return\n }\n if (r < 0) setSel({ ar: 0, ac: c, fr: Math.max(0, s.rows - 1), fc: c })\n else if (c < 0) setSel({ ar: r, ac: 0, fr: r, fc: Math.max(0, s.cols - 1) })\n else if (e.shiftKey) setSelState({ ...sel, fr: r, fc: c })\n else setSel({ ar: r, ac: c, fr: r, fc: c })\n if (r >= 0 && c >= 0) dragging.current = true\n }\n\n /** pointed block from the drag anchor to (r, c); header drags select whole columns / rows */\n const pointRange = (ar: number, ac: number, r: number, c: number, axis: 'cell' | 'col' | 'row') => {\n if (axis === 'col') pointAt(0, ac, MAX_ROW, Math.max(0, c))\n else if (axis === 'row') pointAt(ar, 0, Math.max(0, r), MAX_COL)\n else {\n const m0 = mergeAt(r, c)\n // inside the anchor's merge: just the anchor cell\n const m = m0 && !(ar >= m0.r0 && ar <= m0.r1 && ac >= m0.c0 && ac <= m0.c1) ? m0 : undefined\n // dragging over a merge takes all of it\n const fr = m ? (m.r0 < ar ? m.r0 : m.r1) : Math.max(0, r)\n const fc = m ? (m.c0 < ac ? m.c0 : m.c1) : Math.max(0, c)\n pointAt(ar, ac, fr, fc)\n }\n }\n\n useEffect(() => {\n const up = () => {\n dragging.current = false\n pointDrag.current = null\n const fn = afterDrag.current\n afterDrag.current = null\n if (fn) setTimeout(fn, 0)\n }\n window.addEventListener('mouseup', up)\n return () => window.removeEventListener('mouseup', up)\n }, [])\n\n useEffect(() => {\n if (!resizing) return\n const axis = resizing.axis === 'col' ? colAxis : rowAxis\n const move = (e: MouseEvent) => {\n const d = (resizing.axis === 'col' ? e.clientX : e.clientY) - resizing.start\n axis.set(resizing.i, Math.max(resizing.axis === 'col' ? 8 : 6, Math.round(resizing.size + d)))\n setDetailTick((t) => t + 1)\n }\n const up = () => {\n const px = axis.size(resizing.i)\n setResizing(null)\n // resize every selected full column / row together\n const full = resizing.axis === 'col' ? rect.r0 === 0 && rect.r1 >= s.rows - 1 && resizing.i >= rect.c0 && resizing.i <= rect.c1 : rect.c0 === 0 && rect.c1 >= s.cols - 1 && resizing.i >= rect.r0 && resizing.i <= rect.r1\n const [a, b] = full ? (resizing.axis === 'col' ? [rect.c0, rect.c1] : [rect.r0, rect.r1]) : [resizing.i, resizing.i]\n void sheetOp(resizing.axis === 'col' ? { op: 'colWidth', c0: a, c1: b, px } : { op: 'rowHeight', r0: a, r1: b, px })\n }\n window.addEventListener('mousemove', move)\n window.addEventListener('mouseup', up, { once: true })\n return () => {\n window.removeEventListener('mousemove', move)\n window.removeEventListener('mouseup', up)\n }\n })\n\n const sheetOp = (op: SheetOp) => run(client.call('xlsx.sheetOp', sheet, op))\n // the selection holds merged cells (it always covers them whole): Unmerge / toggle unmerges them all\n const merged = s.merges.some((m) => m.r0 >= rect.r0 && m.r1 <= rect.r1 && m.c0 >= rect.c0 && m.c1 <= rect.c1)\n const toggleMerge = () => void sheetOp({ op: merged ? 'unmerge' : 'merge', range: rect })\n const merge = (mode: MergeMode) => void sheetOp(mode === 'unmerge' ? { op: 'unmerge', range: rect } : { op: 'merge', range: rect, mode })\n const freeze = (kind: 'none' | 'row' | 'col' | 'sel') =>\n void sheetOp({ op: 'freeze', rows: kind === 'row' ? 1 : kind === 'sel' ? sel.ar : 0, cols: kind === 'col' ? 1 : kind === 'sel' ? sel.ac : 0 })\n /** AutoSum-style: the function over the numbers above (or left of) the active cell */\n const autoFn = (fn = 'SUM') => {\n const { ar, ac } = sel\n if (!oneCell) {\n // a selected block: result goes under it\n const ref = `${colName(rect.c0)}${rect.r0 + 1}:${colName(rect.c1)}${rect.r1 + 1}`\n void run(client.call('xlsx.set', sheet, [{ r: rect.r1 + 1, c: rect.c0, input: `=${fn}(${ref})` }]))\n return\n }\n const num = (r: number, c: number) => store.row(sheet, r)?.find((x) => x[0] === c)?.[3] === 1\n let r = ar - 1\n while (r >= 0 && num(r, ac)) r--\n let ref = ''\n if (r < ar - 1) ref = `${colName(ac)}${r + 2}:${colName(ac)}${ar}`\n else {\n let c = ac - 1\n while (c >= 0 && num(ar, c)) c--\n if (c < ac - 1) ref = `${colName(c + 1)}${ar + 1}:${colName(ac - 1)}${ar + 1}`\n }\n if (!ref) return void startEdit(`=${fn}(`)\n void run(client.call('xlsx.set', sheet, [{ r: ar, c: ac, input: `=${fn}(${ref})` }]))\n }\n const sortBy = (desc: boolean) => {\n // one cell: sort the data below the frozen header by the active column\n const single = rect.r0 === rect.r1\n const range = single ? { r0: frozen.rows, c0: 0, r1: Math.max(frozen.rows, s.rows - 1), c1: Math.max(0, s.cols - 1) } : rect\n void sheetOp({ op: 'sort', range, col: sel.ac, desc })\n }\n const rowsOp = (k: string) => {\n const nr = rect.r1 - rect.r0 + 1\n const nc = rect.c1 - rect.c0 + 1\n const ops: Record<string, SheetOp> = {\n rowAbove: { op: 'insertRows', at: rect.r0, n: nr },\n rowBelow: { op: 'insertRows', at: rect.r1 + 1, n: nr },\n colLeft: { op: 'insertCols', at: rect.c0, n: nc },\n colRight: { op: 'insertCols', at: rect.c1 + 1, n: nc },\n delRow: { op: 'deleteRows', at: rect.r0, n: nr },\n delCol: { op: 'deleteCols', at: rect.c0, n: nc },\n hideRows: { op: 'hideRows', a: rect.r0, b: rect.r1, hidden: true },\n hideCols: { op: 'hideCols', a: rect.c0, b: rect.c1, hidden: true },\n // unhide what lies inside (or right around) the selection\n unhideRows: { op: 'hideRows', a: Math.max(0, rect.r0 - (nr === 1 ? 1 : 0)), b: rect.r1 + (nr === 1 ? 1 : 0), hidden: false },\n unhideCols: { op: 'hideCols', a: Math.max(0, rect.c0 - (nc === 1 ? 1 : 0)), b: rect.c1 + (nc === 1 ? 1 : 0), hidden: false },\n }\n if (ops[k]) void sheetOp(ops[k])\n }\n const pasteText = (raw: string) => {\n const text = raw.replace(/\\r\\n?/g, '\\n').replace(/\\n$/, '')\n const cells = text.split('\\n').flatMap((line, i) => line.split('\\t').map((v, j) => ({ r: sel.ar + i, c: sel.ac + j, input: v })))\n if (cells.length) void run(client.call('xlsx.set', sheet, cells.slice(0, 100_000)))\n }\n const ctxItems = (): MenuItem[] => {\n const nr = rect.r1 - rect.r0 + 1\n const nc = rect.c1 - rect.c0 + 1\n const rows = nr === 1 ? `row ${rect.r0 + 1}` : `rows ${rect.r0 + 1}–${rect.r1 + 1}`\n const cols = nc === 1 ? `column ${colName(rect.c0)}` : `columns ${colName(rect.c0)}–${colName(rect.c1)}`\n const single = nr === 1 && nc === 1\n return [\n { label: 'Cut', icon: 'cut', hint: `${MOD}X`, run: () => document.execCommand('cut') },\n { label: 'Copy', icon: 'copy', hint: `${MOD}C`, run: () => document.execCommand('copy') },\n {\n label: 'Paste',\n icon: 'paste',\n hint: `${MOD}V`,\n run: () =>\n void navigator.clipboard\n ?.readText()\n .then(pasteText)\n .catch(() => setToast(`The browser blocked clipboard access — use ${MOD}V to paste`)),\n },\n { label: `Insert ${nr} row${nr > 1 ? 's' : ''} above`, icon: 'rowAbove', sep: true, run: () => rowsOp('rowAbove') },\n { label: `Insert ${nr} row${nr > 1 ? 's' : ''} below`, icon: 'rowBelow', run: () => rowsOp('rowBelow') },\n { label: `Insert ${nc} column${nc > 1 ? 's' : ''} left`, icon: 'colLeft', run: () => rowsOp('colLeft') },\n { label: `Insert ${nc} column${nc > 1 ? 's' : ''} right`, icon: 'colRight', run: () => rowsOp('colRight') },\n { label: `Delete ${rows}`, icon: 'delRow', sep: true, run: () => rowsOp('delRow') },\n { label: `Delete ${cols}`, icon: 'delCol', run: () => rowsOp('delCol') },\n { label: `Hide ${rows}`, icon: 'hide', sep: true, run: () => rowsOp('hideRows') },\n { label: `Hide ${cols}`, icon: 'hide', run: () => rowsOp('hideCols') },\n { label: 'Unhide rows', icon: 'view', run: () => rowsOp('unhideRows') },\n { label: 'Unhide columns', icon: 'view', run: () => rowsOp('unhideCols') },\n { label: merged ? 'Unmerge cells' : 'Merge cells', icon: 'merge', sep: true, run: toggleMerge, disabled: single && !merged },\n { label: `Sort ${single ? 'sheet' : 'range'} by ${colName(sel.ac)}, A → Z`, icon: 'sortAZ', run: () => sortBy(false) },\n { label: `Sort ${single ? 'sheet' : 'range'} by ${colName(sel.ac)}, Z → A`, icon: 'sortZA', run: () => sortBy(true) },\n { label: 'Fill down', icon: 'down', hint: `${MOD}D`, run: () => void sheetOp({ op: 'fill', range: rect, dir: 'down' }), disabled: nr === 1 },\n { label: 'Fill right', hint: `${MOD}R`, run: () => void sheetOp({ op: 'fill', range: rect, dir: 'right' }), disabled: nc === 1 },\n { label: 'Clear contents', icon: 'trash', hint: 'Del', sep: true, run: clearRange },\n { label: 'Clear formatting', icon: 'clear', hint: `${MOD}\\\\`, run: () => fmt({ clear: true }) },\n { label: `Freeze up to ${colName(sel.ac)}${sel.ar + 1}`, icon: 'freeze', sep: true, run: () => freeze('sel') },\n { label: 'Unfreeze', run: () => freeze('none'), disabled: !frozen.rows && !frozen.cols },\n ]\n }\n\n // ---------------------------------------------------------------- find & replace\n useEffect(() => {\n if (!find.open || !find.q) {\n setMatches([])\n return\n }\n let live = true\n const id = setTimeout(() => {\n client.call('xlsx.find', sheet, find.q, findOpts).then((m) => live && setMatches(m), () => {})\n }, 150)\n return () => {\n live = false\n clearTimeout(id)\n }\n }, [client, sheet, find.open, find.q, find.tick, findOpts, detailTick])\n const gotoMatch = (i: number) => {\n const m = matches[i]\n if (!m) return\n setFind((f) => ({ ...f, idx: i }))\n setSel({ ar: m.r, ac: m.c, fr: m.r, fc: m.c })\n scrollIntoView(m.r, m.c)\n }\n const findBoxes = find.open ? matches : []\n\n const onMouseMove = (e: React.MouseEvent) => {\n const pd = pointDrag.current\n if (pd) {\n const { r, c } = cellAt(e.clientX, e.clientY, e.currentTarget as HTMLElement)\n pointRange(pd.ar, pd.ac, r, c, pd.axis)\n return\n }\n if (!dragging.current) return\n const { r, c } = cellAt(e.clientX, e.clientY, e.currentTarget as HTMLElement)\n if (r >= 0 && c >= 0 && (r !== sel.fr || c !== sel.fc)) setSelState((p) => ({ ...p, fr: r, fc: c }))\n }\n\n const box = edit && own ? cellBox(edit.r, edit.c) : null\n const fx = edit ? edit.value : shown(detail, sel.ar, sel.ac)\n const editKeys = (e: React.KeyboardEvent<HTMLTextAreaElement | HTMLInputElement>) => {\n if (!edit || e.nativeEvent.isComposing) return\n const mod = e.metaKey || e.ctrlKey\n if (sugg.length) {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault()\n const n = sugg.length\n setSugIdx((i) => (Math.min(i, n - 1) + (e.key === 'ArrowDown' ? 1 : n - 1)) % n)\n return\n }\n if (e.key === 'Tab' || (e.key === 'Enter' && !e.altKey && !e.shiftKey)) {\n e.preventDefault()\n accept(sugg[Math.min(sugIdx, sugg.length - 1)])\n return\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n const at = word?.s\n setEdit((p) => (p ? { ...p, noSuggest: at } : p))\n return\n }\n }\n const arrow = ARROWS[e.key]\n if (arrow && !mod && !e.altKey && edit.mode === 'enter') {\n if (pointOk) {\n e.preventDefault()\n movePoint(arrow[0], arrow[1], e.shiftKey)\n return\n }\n if (inCell && !e.shiftKey) {\n e.preventDefault()\n commit(arrow)\n return\n }\n }\n if ((e.key === 'Home' || e.key === 'End') && !mod && !e.altKey) {\n // macOS scrolls the page on Home/End: move the caret instead\n e.preventDefault()\n const el = e.currentTarget\n const len = el.value.length\n if (e.key === 'Home') el.setSelectionRange(0, e.shiftKey ? (el.selectionEnd ?? 0) : 0, e.shiftKey ? 'backward' : 'none')\n else el.setSelectionRange(e.shiftKey ? (el.selectionStart ?? len) : len, len)\n readCaret(el)\n } else if (e.key === 'F2') {\n e.preventDefault()\n setEdit((p) => (p ? { ...p, mode: p.mode === 'enter' ? 'edit' : 'enter' } : p))\n } else if (e.key === 'Enter' && !e.altKey) {\n e.preventDefault()\n commit([e.shiftKey ? -1 : 1, 0])\n } else if (e.key === 'Tab') {\n e.preventDefault()\n commit([0, e.shiftKey ? -1 : 1])\n } else if (e.key === 'Escape') {\n e.preventDefault()\n cancel()\n }\n }\n\n // autocomplete list / argument hint under the active input\n let assist: ReactNode = null\n if (edit && (sugg.length || hint)) {\n const slot = hint && fctx?.call ? argSlot(hint, fctx.call.arg) : -1\n assist = sugg.length ? (\n <div className=\"de-fassist\" role=\"listbox\" onMouseDown={(e) => e.preventDefault()}>\n {sugg.map((f, i) => {\n const on = i === Math.min(sugIdx, sugg.length - 1)\n return (\n <div key={f.name} role=\"option\" aria-selected={on} className={on ? 'de-fsug on' : 'de-fsug'} onMouseEnter={() => setSugIdx(i)} onClick={() => accept(f)}>\n <span className=\"de-fsug-name\">{f.name}</span>\n <span className=\"de-fsug-args\">({[...f.args, ...(f.variadic ? ['...'] : [])].join(', ')})</span>\n {on && <div className=\"de-fsug-desc\">{f.desc}</div>}\n </div>\n )\n })}\n </div>\n ) : (\n <div className=\"de-fassist de-fhint\" onMouseDown={(e) => e.preventDefault()}>\n <div>\n {hint!.name}(\n {[...hint!.args, ...(hint!.variadic ? ['...'] : [])].map((a, i, all) => (\n <span key={i}>\n {i === slot ? <b>{a}</b> : a}\n {i < all.length - 1 ? ', ' : ''}\n </span>\n ))}\n )\n </div>\n <div className=\"de-fsug-desc\">{hint!.desc}</div>\n </div>\n )\n }\n\n // in-cell editor geometry (shared by the textarea and its highlight layer)\n const edStyle: CSSProperties | undefined =\n edit && box\n ? {\n left: box.x - 1,\n top: box.y - 1,\n minWidth: box.w + 2,\n width: Math.max(box.w + 2, Math.min(480, edit.value.length * 8 + 16)),\n height: Math.max(box.h + 2, edit.value.split('\\n').length * 18 + 4),\n ...(meta.baseFont as CSSProperties),\n }\n : undefined\n const hlParts: ReactNode[] = []\n if (edit && refSpans.length) {\n let at = 0\n for (const r of refSpans) {\n if (r.s > at) hlParts.push(edit.value.slice(at, r.s))\n hlParts.push(\n <span key={r.s} style={{ color: r.color }}>\n {edit.value.slice(r.s, r.e)}\n </span>,\n )\n at = r.e\n }\n hlParts.push(edit.value.slice(at) + '\\u200b')\n }\n const assistPos = (() => {\n if (!edStyle || !assist) return undefined\n const top = (edStyle.top as number) + (edStyle.height as number) + 2\n return top + 200 > size.h && (edStyle.top as number) > 200 ? { left: edStyle.left as number, bottom: size.h - (edStyle.top as number) + 2 } : { left: edStyle.left as number, top }\n })()\n\n return (\n <>\n <div className=\"de-fx\">\n <div className=\"de-fx-ref\">\n {colName(sel.ac)}\n {sel.ar + 1}\n {!oneCell && `:${colName(rect.c1)}${rect.r1 + 1}`}\n </div>\n {editable ? (\n <input\n ref={fxRef}\n className=\"de-fx-val de-fx-input\"\n value={fx}\n spellCheck={false}\n aria-label=\"Cell content\"\n onFocus={() => !edit && void startEdit(undefined, true)}\n onChange={(e) => onInput(e.target)}\n onSelect={(e) => readCaret(e.currentTarget)}\n onKeyDown={editKeys}\n onBlur={() => {\n if (hold.current) return\n if (edit && (edit.bar || !own)) commit()\n }}\n />\n ) : (\n <div className=\"de-fx-val\" title={fx}>\n {fx}\n </div>\n )}\n {edit && !inCell && assist && <div className=\"de-fassist-at\" style={{ left: 88, top: 30 }}>{assist}</div>}\n </div>\n <div\n ref={scrollRef}\n className=\"de-grid\"\n tabIndex={0}\n onKeyDown={onKeyDown}\n onCopy={(e) => {\n if (edit) return\n e.preventDefault()\n e.clipboardData.setData('text/plain', tsv())\n }}\n onCut={(e) => {\n if (edit || !editable) return\n e.preventDefault()\n e.clipboardData.setData('text/plain', tsv())\n clearRange()\n }}\n onPaste={(e) => {\n if (edit || !editable) return\n e.preventDefault()\n pasteText(e.clipboardData.getData('text/plain'))\n }}\n >\n <div style={{ position: 'relative', width: Math.max(spacerW, size.w), height: Math.max(spacerH, size.h) }}>\n <div\n className=\"de-grid-view\"\n style={{ width: size.w, height: size.h, ...(meta.baseFont as CSSProperties) }}\n onMouseDown={onMouseDown}\n onMouseMove={onMouseMove}\n onContextMenu={(e) => {\n if (!editable) return\n e.preventDefault()\n const { r, c } = cellAt(e.clientX, e.clientY, e.currentTarget as HTMLElement)\n if (r >= 0 && c >= 0 && (r < rect.r0 || r > rect.r1 || c < rect.c0 || c > rect.c1)) setSel({ ar: r, ac: c, fr: r, fc: c })\n setCtx({ x: e.clientX, y: e.clientY })\n }}\n onDoubleClick={() => !edit && void startEdit()}\n >\n {region('main', r0, r1, c0, c1, mainOx, mainOy, HW + fw, HH + fh, mainW, mainH)}\n {fr > 0 && region('top', 0, fr - 1, c0, c1, mainOx, 0, HW + fw, HH, mainW, fh)}\n {fc > 0 && region('left', r0, r1, 0, fc - 1, 0, mainOy, HW, HH + fh, fw, mainH)}\n {fr > 0 && fc > 0 && region('tl', 0, fr - 1, 0, fc - 1, 0, 0, HW, HH, fw, fh)}\n {colHeaders('ch', c0, c1, mainOx, HW + fw, mainW)}\n {fc > 0 && colHeaders('chf', 0, fc - 1, 0, HW, fw)}\n {rowHeaders('rh', r0, r1, mainOy, HH + fh, mainH)}\n {fr > 0 && rowHeaders('rhf', 0, fr - 1, 0, HH, fh)}\n {fr > 0 && <div className=\"de-freeze-h\" style={{ left: 0, top: HH + fh - 1, width: size.w, height: 2 }} />}\n {fc > 0 && <div className=\"de-freeze-v\" style={{ left: HW + fw - 1, top: 0, width: 2, height: size.h }} />}\n <div className=\"de-corner\" style={{ width: HW, height: HH }} />\n {edit && inCell && edStyle && (\n <>\n {hlParts.length > 0 && (\n <div ref={hlRef} className=\"de-cell-edit de-cell-hl\" style={edStyle} aria-hidden>\n {hlParts}\n </div>\n )}\n <textarea\n ref={editRef}\n className={hlParts.length ? 'de-cell-edit de-cell-edit-fx' : 'de-cell-edit'}\n spellCheck={false}\n value={edit.value}\n style={edStyle}\n onMouseDown={(e) => e.stopPropagation()}\n onChange={(e) => onInput(e.target)}\n onSelect={(e) => readCaret(e.currentTarget)}\n onScroll={(e) => {\n if (hlRef.current) hlRef.current.scrollTop = e.currentTarget.scrollTop\n }}\n onKeyDown={editKeys}\n onBlur={(e) => {\n if (hold.current) return\n // moving into the formula bar keeps editing there\n if (e.relatedTarget && e.relatedTarget === fxRef.current) return setEdit((p) => (p ? { ...p, bar: true, sync: 0 } : p))\n commit()\n }}\n />\n {assist && assistPos && (\n <div className=\"de-fassist-at\" style={assistPos}>\n {assist}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n {editable && (\n <XlsxToolbar\n css={activeCss}\n base={meta.baseFont as { fontFamily?: string; fontSize?: string | number }}\n format={meta.formats[styleOf(sel.ar, sel.ac)] ?? 'General'}\n merged={merged}\n frozen={!!(frozen.rows || frozen.cols)}\n gridlines={s.gridLines}\n painter={painter !== null}\n onToggle={toggle}\n onFormat={fmt}\n onUndo={undo}\n onRedo={redo}\n onPaint={() => {\n setPainter((p) => (p === null ? styleOf(sel.ar, sel.ac) : null))\n focusGrid()\n }}\n onMerge={merge}\n onFreeze={freeze}\n onGridlines={() => void sheetOp({ op: 'gridlines', show: !s.gridLines })}\n onFunc={(fn) => (fn ? autoFn(fn) : void startEdit('='))}\n onSort={sortBy}\n onRows={rowsOp}\n onFind={() => setFind((f) => ({ ...f, open: true, tick: f.tick + 1 }))}\n />\n )}\n {find.open && (\n <FindBar\n query={find.q}\n index={find.idx}\n count={matches.length}\n editable={editable}\n replace={find.replace}\n placeholder=\"Find in sheet\"\n onQuery={(q) => setFind((f) => ({ ...f, q, idx: 0 }))}\n onNav={(d) => matches.length && gotoMatch((find.idx + d + matches.length) % matches.length)}\n onClose={() => {\n setFind((f) => ({ ...f, open: false }))\n focusGrid()\n }}\n onReplace={(text, all) => {\n const m = matches[Math.min(find.idx, matches.length - 1)]\n if (!m) return\n void run(client.call('xlsx.replace', sheet, find.q, text, findOpts, all ? undefined : { r: m.r, c: m.c }))\n }}\n options={\n <>\n {(\n [\n ['matchCase', 'Match case'],\n ['whole', 'Entire cell'],\n ['formulas', 'In formulas'],\n ] as const\n ).map(([k, label]) => (\n <label key={k} className=\"de-find-opt\">\n <input type=\"checkbox\" checked={!!findOpts[k]} onChange={(e) => setFindOpts((o) => ({ ...o, [k]: e.target.checked }))} />\n {label}\n </label>\n ))}\n </>\n }\n />\n )}\n {toast && <Toast text={toast} onDone={() => setToast(null)} />}\n {ctx && <ContextMenu x={ctx.x} y={ctx.y} items={ctxItems()} onClose={() => setCtx(null)} />}\n </>\n )\n}\n","/** React bindings: session lifecycle, presence avatars / status, collaborators' cursors. */\nimport { useEffect, useMemo, useRef, useState, useSyncExternalStore, type CSSProperties } from 'react'\nimport type { PresentationMeta } from '../core/pptx/types'\nimport type { DocumentClient } from '../core/worker/client'\nimport { getPeers, subscribePeers, type PeerView } from './hosts'\nimport { startCollab, type Collab, type CollabOptions } from './index'\nimport type { CollabStatus } from './session'\n\nconst transportIds = new WeakMap<object, number>()\nlet nextTransportId = 0\n\nfunction optsKey(o: CollabOptions | undefined): string {\n if (!o) return ''\n let t: string\n if (typeof o.transport === 'string') t = o.transport\n else {\n let id = transportIds.get(o.transport)\n if (id === undefined) transportIds.set(o.transport, (id = ++nextTransportId))\n t = `#${id}`\n }\n return `${t}|${o.room}|${o.base ?? 0}|${o.user.id ?? ''}|${o.user.name}|${o.user.color ?? ''}`\n}\n\nexport interface CollabState {\n collab: Collab | null\n status: CollabStatus | null\n error?: string\n}\n\n/** runs a collaboration session for `client` while `opts` is set */\nexport function useCollab(client: DocumentClient | null | undefined, opts: CollabOptions | undefined): CollabState {\n const [state, setState] = useState<CollabState>({ collab: null, status: null })\n const key = optsKey(opts)\n const optsRef = useRef(opts)\n optsRef.current = opts\n useEffect(() => {\n const o = optsRef.current\n if (!client || !o) {\n setState({ collab: null, status: null })\n return\n }\n let c: Collab\n try {\n c = startCollab(client, o)\n } catch (e) {\n setState({ collab: null, status: 'error', error: (e as Error).message })\n return\n }\n const sync = () => setState({ collab: c, status: c.status, error: c.session.error })\n sync()\n const offs = [c.on('status', sync), c.on('error', sync)]\n return () => {\n offs.forEach((f) => f())\n c.close()\n }\n }, [client, key])\n return state\n}\n\nconst initials = (name: string) =>\n name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0]!.toUpperCase())\n .join('') || '?'\n\nconst LABEL: Record<CollabStatus, string> = {\n connecting: 'Connecting…',\n syncing: 'Syncing…',\n live: 'Live',\n offline: 'Offline · changes will sync',\n error: 'Not synced',\n}\n\n/** status chip + collaborators' avatars (top bar) */\nexport function CollabBar({ client, state }: { client: DocumentClient; state: CollabState }) {\n const peers = useSyncExternalStore(\n (fn) => subscribePeers(client, fn),\n () => getPeers(client),\n )\n const [pending, setPending] = useState(0)\n useEffect(() => {\n const s = state.collab?.session\n if (!s) return\n const t = setInterval(() => setPending(s.pending), 500)\n return () => clearInterval(t)\n }, [state.collab])\n if (!state.status) return null\n const title = state.status === 'error' ? state.error ?? 'Collaboration stopped' : state.status === 'live' && pending ? `Saving ${pending} change${pending > 1 ? 's' : ''}…` : LABEL[state.status]\n return (\n <span className=\"de-collab\">\n <span className={`de-collab-status de-collab-${state.status}`} title={title}>\n <span className=\"de-collab-dot\" />\n <span className=\"de-collab-label\">{state.status === 'live' ? (peers.length ? `${peers.length + 1} editing` : 'Live') : LABEL[state.status]}</span>\n </span>\n {peers.length > 0 && (\n <span className=\"de-peers\">\n {peers.slice(0, 5).map((p) => (\n <span key={p.site} className=\"de-peer\" style={{ background: p.color }} title={p.name}>\n {initials(p.name)}\n </span>\n ))}\n {peers.length > 5 && (\n <span className=\"de-peer de-peer-more\" title={peers.slice(5).map((p) => p.name).join(', ')}>\n +{peers.length - 5}\n </span>\n )}\n </span>\n )}\n </span>\n )\n}\n\ninterface Mark {\n key: string\n color: string\n name: string\n caret?: { x: number; y: number; h: number }\n boxes: { x: number; y: number; w: number; h: number }[]\n outline?: { x: number; y: number; w: number; h: number }\n}\n\n/**\n * Collaborators' cursors drawn over the document (DOCX carets / selections, PPTX selected shapes).\n * Spreadsheets draw their own (in-grid) selection boxes. Render inside a positioned container.\n */\nexport function PeerOverlay({ client, collab }: { client: DocumentClient; collab: Collab | null }) {\n const ref = useRef<HTMLDivElement>(null)\n const peers = useSyncExternalStore(\n (fn) => subscribePeers(client, fn),\n () => getPeers(client),\n )\n const [marks, setMarks] = useState<Mark[]>([])\n const active = useMemo(() => peers.filter((p) => p.presence && (p.presence as { k?: string }).k !== 'xlsx'), [peers])\n\n useEffect(() => {\n const layer = ref.current\n const root = layer?.parentElement\n if (!layer || !root || !active.length) {\n setMarks([])\n return\n }\n let raf = 0\n const measure = () => {\n raf = 0\n const base = layer.getBoundingClientRect()\n const rel = (r: DOMRect) => ({ x: r.left - base.left, y: r.top - base.top, w: r.width, h: r.height })\n const out: Mark[] = []\n for (const p of active) {\n const m = place(p, root, collab, client)\n if (!m) continue\n out.push({\n key: String(p.site),\n color: p.color,\n name: p.name,\n caret: m.caret ? { x: m.caret.left - base.left, y: m.caret.top - base.top, h: m.caret.height || 16 } : undefined,\n boxes: m.sel.map(rel),\n outline: m.outline ? rel(m.outline) : undefined,\n })\n }\n setMarks(out)\n }\n const schedule = () => {\n if (!raf) raf = requestAnimationFrame(measure)\n }\n schedule()\n root.addEventListener('scroll', schedule, true)\n window.addEventListener('resize', schedule)\n const offChange = collab?.on('change', schedule)\n // views re-render asynchronously (paging, slide loading): keep up cheaply\n const t = setInterval(schedule, 400)\n return () => {\n cancelAnimationFrame(raf)\n root.removeEventListener('scroll', schedule, true)\n window.removeEventListener('resize', schedule)\n offChange?.()\n clearInterval(t)\n }\n }, [active, collab, client])\n\n return (\n <div ref={ref} className=\"de-peer-layer\" aria-hidden>\n {marks.map((m) => (\n <div key={m.key} style={{ '--peer': m.color } as CSSProperties}>\n {m.boxes.map((b, i) => (\n <div key={i} className=\"de-peer-sel\" style={{ left: b.x, top: b.y, width: b.w, height: b.h }} />\n ))}\n {m.outline && (\n <div className=\"de-peer-outline\" style={{ left: m.outline.x - 3, top: m.outline.y - 3, width: m.outline.w + 6, height: m.outline.h + 6 }}>\n <span className=\"de-peer-flag\">{m.name}</span>\n </div>\n )}\n {m.caret && (\n <div className=\"de-peer-caret\" style={{ left: m.caret.x, top: m.caret.y, height: m.caret.h }}>\n <span className=\"de-peer-flag\">{m.name}</span>\n </div>\n )}\n </div>\n ))}\n </div>\n )\n}\n\nfunction place(p: PeerView, root: HTMLElement, collab: Collab | null, client: DocumentClient): { caret?: DOMRect | null; sel: DOMRect[]; outline?: DOMRect } | null {\n const pr = p.presence as { k?: string; slide?: string; top?: number }\n if (pr.k === 'docx') {\n const r = collab?.rects(root, p)\n return r ? { caret: r.caret, sel: r.sel } : null\n }\n if (pr.k === 'pptx' && pr.slide) {\n const meta = client.info.pptx as PresentationMeta | undefined\n const i = meta?.slides.findIndex((s) => s.path === pr.slide) ?? -1\n const frame = i >= 0 ? root.querySelector<HTMLElement>(`[data-slide=\"${i + 1}\"]`) : null\n if (!frame) return null\n const el = pr.top !== undefined ? frame.querySelector<HTMLElement>(`[data-top=\"${pr.top}\"]`) : null\n return { sel: [], outline: (el ?? frame).getBoundingClientRect() }\n }\n return null\n}\n","import { useCallback, useEffect, useInsertionEffect, useMemo, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport type { DocSource } from '../core/source'\nimport type { DocumentClient, OpenOptions } from '../core/worker/client'\nimport type { Zoom } from './common/ZoomControl'\nimport { DocxView } from './docx/DocxView'\nimport { ViewerContext, type FileOps, type ViewerApi } from './common/Slots'\nimport { StatusContext } from './common/Status'\nimport { ConfirmDialog, PromptDialog, Toast } from './common/Dialog'\nimport { download, Icon } from './edit/Toolbar'\nimport { DetailsDialog } from './file/DetailsDialog'\nimport { FileMenu, KIND_LABEL, useFileActions, type FileMenuItem } from './file/FileMenu'\nimport { importFile, type Imported } from './file/importFile'\nimport { blankPptx, parasToDocx, rowsToXlsx } from '../core/convert'\nimport type { DocKind } from '../core/opc'\nimport { injectStyles } from './injectStyles'\nimport { isTextEntry } from './common/hooks'\nimport { PptxView } from './pptx/PptxView'\nimport { useDocument } from './useDocument'\nimport { XlsxView } from './xlsx/XlsxView'\nimport type { CollabOptions } from '../collab'\nimport { CollabBar, PeerOverlay, useCollab } from '../collab/react'\n\nexport interface DocViewerProps {\n /** File, Blob, ArrayBuffer, Uint8Array or URL (HTTP Range requests are used when the server supports them). */\n src: DocSource | null | undefined\n /** Display name (defaults to File.name or the URL's last segment). */\n name?: string\n className?: string\n style?: CSSProperties\n /** Show the top bar (name, status, progress). Default true. */\n toolbar?: boolean\n /** Extra toolbar content (rendered at the right). */\n toolbarExtra?: ReactNode\n /** Initial zoom for documents and presentations. Default 'fit'. */\n zoom?: Zoom\n /** Show slide thumbnails for presentations. Default true. */\n thumbnails?: boolean\n headers?: Record<string, string>\n credentials?: RequestCredentials\n /** Custom worker factory, or false to parse on the main thread. */\n worker?: OpenOptions['worker']\n /** Where to inject the stylesheet (document or a shadow root). */\n styleTarget?: Document | ShadowRoot\n onLoad?: (client: DocumentClient) => void\n onError?: (error: Error) => void\n /** Start in edit mode. Default false (view). */\n editable?: boolean\n /** Show the Edit/View toggle. Default true. */\n allowEdit?: boolean\n /** Show the Save/Download button and enable Ctrl+S. Default true. */\n allowSave?: boolean\n /**\n * Allow downloading files to the user's device (the save fallback without `onSave`, \"Download image\").\n * With `onSave`, saving still works when this is false. Default true.\n */\n allowDownload?: boolean\n /** Show the File menu (new, open, save, rename, download as PDF / HTML / text…, details, print) and its shortcuts. Default true. */\n fileMenu?: boolean\n /** File → New / Open: replace the document with a blank one or a local file (Office, CSV, text, Markdown, HTML). Default true. */\n allowOpen?: boolean\n /** Extra File menu entries (Share, Version history…), shown before Close. */\n fileMenuItems?: FileMenuItem[]\n /** File → Rename: called with the new name (extension included). Rename is shown when `fileMenu` is on. */\n onRename?: (name: string) => void\n /** Adds File → Close. */\n onClose?: () => void\n /** Receives the saved file instead of downloading it. */\n onSave?: (file: Blob, name: string) => void | Promise<void>\n /** Called when the document gets / loses unsaved changes. */\n onDirtyChange?: (dirty: boolean) => void\n /**\n * Real-time collaboration: everyone opening the same base document (`src`) with the same `room`\n * edits it together through the hub at `transport` (see src/collab).\n */\n collab?: CollabOptions\n /**\n * Ctrl/⌘+A anywhere on the page selects the document (text fields outside the viewer keep their own).\n * Default true. With false the shortcut works from the viewer only (its content or toolbar).\n */\n captureSelectAll?: boolean\n}\n\nconst EXT: Record<string, string> = { docx: '.docx', xlsx: '.xlsx', pptx: '.pptx' }\nconst UNTITLED: Record<DocKind, string> = { docx: 'Untitled document', xlsx: 'Untitled spreadsheet', pptx: 'Untitled presentation' }\n\nfunction fmtBytes(n: number) {\n if (n < 1024) return `${n} B`\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(0)} KB`\n return `${(n / 1024 / 1024).toFixed(1)} MB`\n}\n\nexport function DocViewer(props: DocViewerProps) {\n const { src, name, className, style, toolbar = true, toolbarExtra, zoom, thumbnails, headers, credentials, worker, styleTarget, onLoad, onError } = props\n const { allowEdit = true, allowSave = true, allowDownload = true, fileMenu = true, allowOpen = true, captureSelectAll = true, onSave, onDirtyChange } = props\n const [editing, setEditing] = useState(!!props.editable)\n useEffect(() => {\n if (props.editable !== undefined) setEditing(!!props.editable)\n }, [props.editable])\n const [dirty, setDirtyState] = useState(false)\n const [saving, setSaving] = useState(false)\n const [barEl, setBarEl] = useState<HTMLDivElement | null>(null)\n useInsertionEffect(() => injectStyles(styleTarget), [styleTarget])\n // File → New / Open: a local file shown instead of `src` until the host passes another `src`\n const [opened, setOpened] = useState<Imported | null>(null)\n const [renamed, setRenamed] = useState<string | null>(null)\n useEffect(() => {\n setOpened(null)\n setRenamed(null)\n }, [src])\n const loadName = opened ? opened.name : name\n // the name is part of what is loaded: Rename only changes what is shown and saved\n const { client, error, loading, progress } = useDocument(opened ? opened.src : src, { name: loadName, headers, credentials, worker })\n const docName = renamed ?? loadName\n const collab = useCollab(client, props.collab)\n // with collaboration, editing waits for the shared history (offline edits sync on reconnect)\n const canEdit = !props.collab || collab.status === 'live' || collab.status === 'offline'\n const [statusEl, setStatusEl] = useState<HTMLSpanElement | null>(null)\n\n useEffect(() => {\n if (client) onLoad?.(client)\n }, [client, onLoad])\n useEffect(() => {\n if (error) onError?.(error)\n }, [error, onError])\n\n // a converted file (CSV → xlsx…) starts unsaved\n const openedDirty = useRef(false)\n useEffect(() => {\n setDirtyState(!!client && openedDirty.current)\n if (client) openedDirty.current = false\n }, [client])\n const setDirty = useCallback(\n (d: boolean) =>\n setDirtyState((prev) => {\n if (prev !== d) onDirtyChange?.(d)\n return d\n }),\n [onDirtyChange],\n )\n const baseName = (renamed ?? (client?.name || docName || 'document')).replace(/\\.[^.]+$/, '')\n const fileName = baseName + (client ? EXT[client.kind] : '')\n // saving without onSave means downloading\n const canSave = allowSave && (!!onSave || allowDownload)\n const save = useCallback(async () => {\n if (!client || saving || !canSave) return\n setSaving(true)\n try {\n const blob = await client.call('save')\n if (onSave) await onSave(blob, fileName)\n else download(blob, fileName)\n setDirty(false)\n } catch (e) {\n onError?.(e as Error)\n console.error('[office-engine] save failed', e)\n } finally {\n setSaving(false)\n }\n }, [client, saving, canSave, onSave, fileName, setDirty, onError])\n const fileOps = useRef<FileOps | null>(null)\n const selectAll = useRef<(() => void) | null>(null)\n const api = useMemo<ViewerApi>(\n () => ({ bar: barEl, editable: editing && canEdit, setDirty, save, canDownload: allowDownload, client, fileOps, selectAll }),\n [barEl, editing, canEdit, setDirty, save, allowDownload, client],\n )\n const rootRef = useRef<HTMLDivElement>(null)\n // captureSelectAll: Ctrl/⌘+A from the rest of the page too (the viewer's own keys are handled in onKeyDown below)\n useEffect(() => {\n const root = rootRef.current\n if (!captureSelectAll || !root) return\n const on = (e: KeyboardEvent) => {\n if (e.defaultPrevented || !(e.metaKey || e.ctrlKey) || e.altKey || e.shiftKey || e.key.toLowerCase() !== 'a') return\n const target = (e.composedPath()[0] ?? e.target) as Node | null\n if ((target && root.contains(target)) || isTextEntry(target) || !selectAll.current) return\n e.preventDefault()\n selectAll.current()\n }\n const doc = root.ownerDocument\n doc.addEventListener('keydown', on)\n return () => doc.removeEventListener('keydown', on)\n }, [captureSelectAll])\n\n // ---- File menu ----\n const [toast, setToast] = useState<string | null>(null)\n const clearToast = useCallback(() => setToast(null), [])\n const [confirm, setConfirm] = useState<{ message: string; run: () => void } | null>(null)\n const [renaming, setRenaming] = useState(false)\n const [details, setDetails] = useState(false)\n /** replaces the document, after confirmation when there are unsaved changes */\n const replace = (message: string, run: () => void) => (dirty ? setConfirm({ message, run }) : run())\n const show = useCallback((doc: Imported, edit = false) => {\n openedDirty.current = doc.converted\n setRenamed(null)\n setOpened(doc)\n if (edit) setEditing(true)\n }, [])\n const canOpen = fileMenu && allowOpen && !props.collab\n const fileActions = useFileActions({\n kind: client?.kind,\n base: baseName,\n canOpen,\n canImport: fileMenu && allowEdit && canEdit,\n canSave: fileMenu && canSave,\n canDownload: fileMenu && allowDownload && !!client,\n ops: fileOps,\n create: (kind: DocKind) =>\n replace(`A new ${UNTITLED[kind].split(' ')[1]} replaces the current document. Your changes are not saved.`, () => {\n const blank = kind === 'docx' ? parasToDocx([]) : kind === 'xlsx' ? rowsToXlsx([], 'Sheet1') : blankPptx()\n blank.then((src) => show({ src, name: UNTITLED[kind] + EXT[kind], converted: false }, allowEdit), (e: Error) => setToast(e.message))\n }),\n open: (file) =>\n replace(`Opening “${file.name}” replaces the current document. Your changes are not saved.`, () => {\n importFile(file).then(show, (e: Error) => setToast(e.message))\n }),\n save,\n downloadOriginal: async () => {\n if (!client) return\n download(await client.call('save'), fileName)\n // without onSave, saving is downloading\n if (!onSave) setDirty(false)\n },\n rename: () => setRenaming(true),\n details: () => setDetails(true),\n close: props.onClose,\n extra: props.fileMenuItems ?? [],\n notify: setToast,\n })\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.defaultPrevented || !(e.metaKey || e.ctrlKey) || e.altKey || e.shiftKey) return\n const k = e.key.toLowerCase()\n if (k === 'a') {\n // from the viewer's own chrome: the document, not the whole page (text fields keep their own select-all)\n if (isTextEntry(e.target) || !selectAll.current) return\n e.preventDefault()\n selectAll.current()\n } else if (!fileMenu) return\n else if (k === 'p') {\n // with downloads disabled, the browser must not print (save) the page either\n e.preventDefault()\n if (allowDownload) fileActions.run('print')\n } else if (k === 'o' && canOpen) {\n e.preventDefault()\n fileActions.run('open')\n }\n }\n\n const pct = progress && progress.total > 0 ? Math.min(100, (progress.loaded / progress.total) * 100) : 0\n const busy = loading || (!!progress && pct < 100)\n const title = renamed ?? client?.name ?? docName ?? (typeof src === 'string' ? decodeURIComponent(src.split(/[?#]/)[0].split('/').pop() ?? '') : (src as File | undefined)?.name) ?? ''\n\n let body: ReactNode\n if (error) {\n body = (\n <div className=\"de-center\">\n <div className=\"de-error\" role=\"alert\">\n <strong>Cannot open document.</strong>\n <div>{error.message}</div>\n </div>\n </div>\n )\n } else if (!client) {\n body = src || opened ? (\n <div className=\"de-center\">\n <div className=\"de-spinner\" />\n <div>{progress?.phase === 'download' && progress.total ? `Downloading… ${fmtBytes(progress.loaded)} / ${fmtBytes(progress.total)}` : 'Opening…'}</div>\n </div>\n ) : (\n <div className=\"de-center\">No document</div>\n )\n } else if (client.kind === 'docx') body = <DocxView key={String(client.name) + client.size} client={client} initialZoom={zoom} />\n else if (client.kind === 'xlsx') body = <XlsxView client={client} />\n else body = <PptxView client={client} initialZoom={zoom} thumbnails={thumbnails} />\n\n return (\n <div ref={rootRef} className={className ? `de-root ${className}` : 'de-root'} style={style} onKeyDown={onKeyDown}>\n {toolbar && (\n <div className=\"de-bar\">\n {client && <span className={`de-badge de-badge-${client.kind}`}>{client.kind}</span>}\n {fileMenu && <FileMenu actions={fileActions} />}\n <span className=\"de-title\" title={title}>\n {title}\n </span>\n <span className=\"de-status\" ref={setStatusEl} hidden={!client} />\n {client && client.size > 0 && <span className=\"de-status\">{fmtBytes(client.size)}</span>}\n {client && props.collab && <CollabBar client={client} state={collab} />}\n {toolbarExtra}\n {client && allowEdit && (\n <button type=\"button\" className={editing ? 'de-mode de-mode-on' : 'de-mode'} onClick={() => setEditing((v) => !v)} title={editing ? 'Switch to viewing' : 'Edit document'}>\n <Icon name={editing ? 'view' : 'edit'} size={16} />\n {editing ? 'View' : 'Edit'}\n </button>\n )}\n {client && canSave && (editing || dirty) && (\n <button type=\"button\" className={dirty ? 'de-mode de-save-dirty' : 'de-mode'} disabled={saving} onClick={() => void save()} title=\"Save a copy (Ctrl+S)\">\n <Icon name=\"save\" size={16} />\n {saving ? 'Saving…' : dirty || onSave ? 'Save' : 'Download'}\n </button>\n )}\n <div className=\"de-progress\" style={{ width: `${busy ? Math.max(pct, 3) : 100}%`, opacity: busy ? 1 : 0 }} />\n </div>\n )}\n {toolbar && client && editing && canEdit && <div className=\"de-ebar-host\" ref={setBarEl} />}\n <div className=\"de-body\">\n <ViewerContext.Provider value={api}>\n <StatusContext.Provider value={statusEl}>{body}</StatusContext.Provider>\n </ViewerContext.Provider>\n {client && collab.collab && <PeerOverlay client={client} collab={collab.collab} />}\n </div>\n {toast && <Toast text={toast} onDone={clearToast} />}\n {confirm && <ConfirmDialog title=\"Discard unsaved changes?\" message={confirm.message} ok=\"Continue\" onOk={confirm.run} onClose={() => setConfirm(null)} />}\n {renaming && client && (\n <PromptDialog\n spec={{\n title: 'Rename',\n label: 'File name',\n initial: baseName,\n ok: 'Rename',\n onOk: (v) => {\n const next = v.trim().replace(/[\\\\/:*?\"<>|]+/g, ' ').replace(new RegExp(`\\\\${EXT[client.kind]}$`, 'i'), '')\n if (!next) return\n setRenamed(next + EXT[client.kind])\n props.onRename?.(next + EXT[client.kind])\n },\n }}\n onClose={() => setRenaming(false)}\n />\n )}\n {details && client && (\n <DetailsDialog\n client={client}\n file={[\n ['Name', fileName],\n ['Type', KIND_LABEL[client.kind]],\n ...(client.size > 0 ? [['File size', fmtBytes(client.size)] as [string, string]] : []),\n ...(dirty ? [['Status', 'Unsaved changes'] as [string, string]] : []),\n ]}\n stats={fileOps.current?.stats() ?? []}\n onClose={() => setDetails(false)}\n />\n )}\n </div>\n )\n}\n"],"mappings":";;;;;;;;AAmCA,SAAS0D,GAAK,GAAmB;CAC/B,IAAI;EACF,OAAO;GAAE,MAAM/B,EAASgC,CAAG;GAAG,MAAMA,EAAI;GAAQ,YAAY;EAAM;CACpE,SAASC,GAAG;EACV,IAAI,EAAEA,aAAazB,IAAqB,OAAO;GAAE,MAAM,CAAC;GAAG,MAAM;GAAG,YAAY;EAAM;EACtF,IAAM0B,IAAM,KAAK,IAAI,GAAG,KAAK,IAAID,EAAE,KAAKD,EAAI,MAAM,CAAC,GAC7CG,IAAOD,IAAM,IAAIH,GAAKC,EAAI,MAAM,GAAGE,CAAG,CAAC,IAAI;GAAE,MAAM,CAAC;GAAG,MAAM;GAAG,YAAY;EAAM;EAExF,OADIC,EAAK,OAAOD,IAAYC,IACrB;GAAE,MAAMA,EAAK;GAAM,MAAMD;GAAK,YAAYD,EAAE,YAAY;EAAsB;CACvF;AACF;AAEA,IAAaG,MAAa,MAAiBC,EAAK,WAAW,GAAG,KAAKA,EAAK,SAAS,GAE3EC,oBAAe,IAAI,IAAI;CAAC;CAAK;CAAK;CAAK;AAAG,CAAC,GAC3CC,oBAAc,IAAI,IAAI;CAAC;CAAK;CAAK;CAAK;AAAG,CAAC;AAGhD,SAAgBC,GAAe,GAAc,GAA+B;CAC1E,IAAMC,IAAsB;EAAE,WAAW;EAAO,MAAM,CAAC;CAAE;CACzD,IAAI,CAACL,GAAUC,CAAI,GAAG,OAAOI;CAC7B,IAAMT,IAAMK,EAAK,MAAM,CAAC,GAClBK,IAAIC,IAAQ,GACZ,EAAE,SAAM,YAASZ,GAAKC,CAAG;CAC/B,KAAK,IAAMY,KAAKC,GAAM,AAAID,EAAE,MAAM,SAAOH,EAAI,KAAK,KAAK;EAAE,GAAGG,EAAE,IAAI;EAAG,GAAGA,EAAE,IAAI;EAAG,MAAMZ,EAAI,MAAMY,EAAE,GAAGA,EAAE,CAAC;EAAG,KAAKA,EAAE;CAAI,CAAC;CACxH,IAAIF,IAAI,GAAG,OAAOD;CAElB,IAAMK,IAAOJ,IAAIK,GAGXC,IAAyC,CAAC,GAC5CC,GACAC,GACAC;CACJ,KAAK,IAAIC,IAAI,GAAGA,IAAIP,EAAK,QAAQ,KAAK;EACpC,IAAM,IAAIA,EAAKO;EACf,AAAI,EAAE,KAAKV,KACL,EAAE,MAAM,WACN,EAAE,MAAM,MAAKM,EAAM,KAAK;GAAE,MAAMH,EAAKO,IAAI,EAAE,EAAE,MAAM,UAAUP,EAAKO,IAAI,EAAE,CAAC,MAAM,EAAE,IAAKP,EAAKO,IAAI,EAAE,CAAmB,IAAI;GAAI,KAAK;EAAE,CAAC,IAC/H,EAAE,MAAM,MAAKJ,EAAM,KAAK;GAAE,MAAM;GAAI,KAAK;EAAE,CAAC,IAC5C,EAAE,MAAM,OAAO,EAAE,MAAM,MAAKA,EAAM,IAAI,KACrC,EAAE,MAAM,OAAO,EAAE,MAAM,QAAQA,EAAM,UAAQ,EAAMA,EAAM,SAAS,EAAE,CAAC,QAE7E,EAAE,MAAM,SAAM,IAAO,MAChB,EAAE,IAAIN,IAAG,IAAS,IACpB,CAACS,KAAQ,EAAE,MAAM,SAAM,IAAO;CACzC;CACA,KAAK,IAAIC,IAAIJ,EAAM,SAAS,GAAGI,KAAK,GAAG,KACrC,IAAIJ,EAAMI,EAAE,CAAC,MAAM;EACjB,EAAI,OAAOJ,EAAMI;EACjB;CACF;CACF,IAAIN,GAAM,OAAOL;CAGjB,IAAMY,IAAUH,MAAWD,KAAQA,EAAK,MAAMP,IAAIO,IAAO,KAAA;CACzD,IAAII,MAAYA,EAAQ,MAAM,UAAUA,EAAQ,MAAM,UAAUA,EAAQ,MAAM,SAASA,EAAQ,MAAM,SAAS;EAC5G,IAAMC,IAAQtB,EAAI,MAAMqB,EAAQ,GAAGX,CAAC;EAEpC,IAAI,EADmBW,EAAQ,MAAM,SAASA,EAAQ,IAAI,UAAU,KAAA,KAAeA,EAAQ,MAAM,UAAUA,EAAQ,UAAU,KAAA,MACvG,4BAA4B,KAAKC,CAAK,GAAG;GAC7D,IAAMC,IAAUF,EAAQ,MAAM,UAAUrB,EAAIqB,EAAQ,OAAO;GAC3D,EAAI,OAAO;IAAE,GAAGA,EAAQ,IAAI;IAAG,GAAGA,EAAQ,IAAI;IAAG,MAAMC;IAAO,MAAMC;GAAQ;EAC9E;CACF;CAGA,IAAI,CAACL,GAAQ;EACX,IAAMM,IAAW,CAACP,KAASA,EAAK,MAAM,UAAUX,EAAa,IAAIW,EAAK,CAAC,KAAOA,EAAK,MAAM,QAAQA,EAAK,MAAM,KACtGQ,IAAU,CAACN,KAASA,EAAK,MAAM,UAAUZ,EAAY,IAAIY,EAAK,CAAC,KAAOA,EAAK,MAAM,QAAQA,EAAK,MAAM;EAC1G,EAAI,YAAYK,KAAYC;CAC9B;CACA,OAAOhB;AACT;AAGA,SAAgBiB,GAAU,GAAY,GAAY,GAAY,GAAY,GAAwB;CAChG,IAAMC,IAAMC,MAAU,KAAA,IAAsC,KAA1BtD,EAAWsD,CAAK,IAAI;CAGtD,IAFIC,IAAKC,MAAI,CAACD,GAAIC,KAAM,CAACA,GAAID,CAAE,IAC3BE,IAAKC,MAAI,CAACD,GAAIC,KAAM,CAACA,GAAID,CAAE,IAC3BF,MAAO,KAAKC,KAAA,SAAe,OAAO,GAAGH,IAAMtF,EAAQ0F,CAAE,EAAE,GAAG1F,EAAQ2F,CAAE;CACxE,IAAID,MAAO,KAAKC,KAAA,OAAe,OAAO,GAAGL,IAAME,IAAK,EAAE,GAAGC,IAAK;CAC9D,IAAMG,IAAI,GAAG5F,EAAQ0F,CAAE,IAAIF,IAAK;CAChC,OAAOA,MAAOC,KAAMC,MAAOC,IAAKL,IAAMM,IAAI,GAAGN,IAAMM,EAAE,GAAG5F,EAAQ2F,CAAE,IAAIF,IAAK;AAC7E;AAMA,SAAgBI,GAAa,GAAsB;CACjD,IAAI,CAAC9B,GAAUC,CAAI,GAAG,OAAOA;CAC7B,IAAML,IAAMK,EAAK,MAAM,CAAC,GAClB,EAAE,SAAM,SAAM,kBAAeN,GAAKC,CAAG;CAC3C,IAAIe,IAAOf,EAAI,UAAU,CAACmC,GAAY,OAAO9B;CAC7C,IAAI+B,IAAQ,GACR3B,IAAM,IACN4B,IAAK;CACT,KAAK,IAAMzB,KAAKC,GAAM;EACpB,IAAID,EAAE,MAAM,UAAUA,EAAE,MAAM,UAAWA,EAAE,MAAM,SAASA,EAAE,IAAI,UAAU,KAAA,GAExE,AADA,KAAOZ,EAAI,MAAMqC,GAAIzB,EAAE,CAAC,IAAIZ,EAAI,MAAMY,EAAE,GAAGA,EAAE,CAAC,CAAC,CAAC,YAAY,GAC5D,IAAKA,EAAE;OACF,IAAIA,EAAE,MAAM,OAAO;GACxB,IAAM0B,IAAOtC,EAAI,YAAY,KAAKY,EAAE,CAAC;GAErC,AADA,KAAOZ,EAAI,MAAMqC,GAAIC,IAAO,CAAC,IAAItC,EAAI,MAAMsC,IAAO,GAAG1B,EAAE,CAAC,CAAC,CAAC,YAAY,GACtE,IAAKA,EAAE;EACT;EACA,AAAIA,EAAE,MAAM,WACRA,EAAE,MAAM,MAAK,MACRA,EAAE,MAAM,QAAK,IAAQ,KAAK,IAAI,GAAGwB,IAAQ,CAAC;CACrD;CAEA,OADA,KAAOpC,EAAI,MAAMqC,CAAE,GACZ,MAAM5B,KAAO0B,IAAa,OAAM,MAAM,IAAI,OAAOC,CAAK;AAC/D;;AC9IA,IAAMG,IAA8B;CAClC,KAAK;CACL,KAAK;CACL,SAAS;CACT,WAAW;CACX,YAAY;CACZ,SAAS;CACT,gBAAgB;CAChB,MAAM;CACN,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,aAAa;CACb,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,SAAS;CACT,UAAU;CACV,MAAM;CACN,SAAS;CACT,KAAK;CACL,MAAM;CACN,OAAO;CACP,SAAS;CACT,cAAc;CACd,MAAM;CACN,OAAO;CACP,KAAK;CACL,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;CACP,cAAc;CACd,KAAK;CACL,SAAS;CACT,MAAM;CACN,IAAI;CACJ,SAAS;CACT,MAAM;CACN,KAAK;CACL,OAAO;CACP,UAAU;CACV,KAAK;CACL,SAAS;CACT,OAAO;CACP,SAAS;CACT,QAAQ;CACR,WAAW;CACX,MAAM;CACN,WAAW;CACX,UAAU;CACV,OAAO;CACP,QAAQ;CACR,OAAO;CACP,KAAK;CACL,MAAM;CACN,KAAK;CACL,IAAI;CACJ,KAAK;CACL,OAAO;CACP,QAAQ;CACR,OAAO;CACP,OAAO;CACP,KAAK;CACL,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,KAAK;CACL,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,MAAM;CACN,aAAa;CACb,OAAO;CACP,GAAG;CACH,IAAI;CACJ,aAAa;CACb,KAAK;CACL,KAAK;CACL,KAAK;CACL,QAAQ;CACR,IAAI;CACJ,IAAI;CACJ,OAAO;CACP,SAAS;CACT,QAAQ;CACR,MAAM;CACN,aAAa;CACb,MAAM;CACN,WAAW;CACX,SAAS;CACT,MAAM;CACN,OAAO;CACP,OAAO;CACP,WAAW;CACX,SAAS;CACT,KAAK;CACL,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;CACP,WAAW;CACX,WAAW;CACX,QAAQ;CACR,YAAY;CACZ,KAAK;CACL,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,QAAQ;CACR,GAAG;CACH,MAAM;CACN,UAAU;CACV,MAAM;CACN,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACP,OAAO;CACP,OAAO;CACP,KAAK;CACL,SAAS;CACT,SAAS;CACT,MAAM;CACN,SAAS;CACT,SAAS;CACT,SAAS;CACT,KAAK;CACL,MAAM;AACR,GAUIC,IAAyB;AAG7B,SAAgBC,KAA4B;CAW1C,OAVA,AACED,MAAQ,OAAO,KAAKD,CAAG,CAAC,CACrB,KAAK,CAAC,CACN,KAAK,MAAS;EACb,IAAM,CAACG,GAAKC,KAAQJ,EAAIK,EAAK,CAAC,MAAM,GAAG,GACjCC,IAAQH,IAAMA,EAAI,MAAM,IAAI,IAAI,CAAC,GACjCI,IAAWD,EAAMA,EAAM,SAAS,OAAO;EAC7C,OAAO;GAAE;GAAM,MAAMC,IAAWD,EAAM,MAAM,GAAG,EAAE,IAAIA;GAAO;GAAU;EAAK;CAC7E,CAAC,GAEEL;AACT;AAEA,SAAgBO,GAAa,GAAkC;CAC7D,IAAMC,IAAKJ,EAAK,YAAY;CAC5B,OAAOH,GAAgB,CAAC,CAAC,MAAM,MAAMQ,EAAE,SAASD,CAAE;AACpD;AAGA,SAAgBE,GAAiB,GAAgB,IAAQ,IAAc;CACrE,IAAMF,IAAKG,EAAO,YAAY;CAE9B,OADKH,IACEP,GAAgB,CAAC,CACrB,QAAQ,MAAMQ,EAAE,KAAK,WAAWD,CAAE,CAAC,CAAC,CACpC,MAAM,GAAGI,CAAK,IAHD,CAAC;AAInB;AAGA,SAAgBC,GAAQ,GAAW,GAAqB;CACtD,IAAIC,IAAML,EAAE,KAAK,QAAQ,OAAOK;CAChC,IAAI,CAACL,EAAE,UAAU,OAAO;CAGxB,IAAM,IAAIA,EAAE,KAAK,QACXM,IAAQ,KAAK,KAAKN,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,KAAK,KAAKA,EAAE,KAAK,IAAI,MAAM,EAAE,IAAI,IAAI,GAC/EO,IAAQ,IAAID;CAClB,OAAOC,KAAUF,IAAME,KAASD;AAClC;;AC1LA,IAAaE,KAAqB,OAAO,SAAW,MAAcC,IAAYC;AAE9E,SAAgBC,KAAuC;CACrD,IAAM,CAACC,GAAGC,KAAQC,IAAY,MAAcC,IAAI,GAAG,CAAC;CACpD,OAAO,CAACH,GAAGC,CAAkB;AAC/B;AAGA,SAAgBG,KAAwF;CACtG,IAAMC,IAAMC,EAAU,IAAI,GACpB,CAACC,GAAMC,KAAWC,EAAS;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC;CAc/C,OAbAb,SAAyB;EACvB,IAAMc,IAAKL,EAAI;EACf,IAAI,CAACK,GAAI;EACT,IAAMC,UAAe;GACnB,IAAMC,IAAIF,EAAG,aACPG,IAAIH,EAAG;GACb,GAAS,MAAOI,EAAE,MAAMF,KAAKE,EAAE,MAAMD,IAAIC,IAAI;IAAE;IAAG;GAAE,CAAE;EACxD;EACA,EAAO;EACP,IAAMC,IAAK,IAAI,eAAeJ,CAAM;EAEpC,OADAI,EAAG,QAAQL,CAAE,SACAK,EAAG,WAAW;CAC7B,GAAG,CAAC,CAAC,GACE,CAACV,GAAKE,CAAI;AACnB;AAGA,SAAgBS,GAAU,GAAoE;CAC5F,IAAM,CAAC3E,GAAK4E,KAAUR,EAAS;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC,GACvC,CAACC,GAAIQ,KAAST,EAA6B,IAAI;CAuBrD,OArBAb,SAAyB;EACvB,AAAIS,EAAI,YAAYK,KAAIQ,EAAMb,EAAI,OAAO;CAC3C,CAAC,GACDR,QAAgB;EACd,IAAI,CAACa,GAAI;EACT,IAAIS,IAAM,GACJC,UAAaH,GAAQ,MAAOI,EAAE,MAAMX,EAAG,cAAcW,EAAE,MAAMX,EAAG,YAAYW,IAAI;GAAE,GAAGX,EAAG;GAAY,GAAGA,EAAG;EAAU,CAAE,GACtHY,UAAW;GACf,AACAH,MAAM,4BAA4B;IAEhC,AADA,IAAM,GACNC,EAAK;GACP,CAAC;EACH;EAGA,OAFAA,EAAK,GACLV,EAAG,iBAAiB,UAAUY,GAAI,EAAE,SAAS,GAAK,CAAC,SACtC;GAEX,AADAZ,EAAG,oBAAoB,UAAUY,CAAE,GACnC,qBAAqBH,CAAG;EAC1B;CACF,GAAG,CAACT,CAAE,CAAC,GACArE;AACT;AAGA,SAAgBkF,GAAY,GAAwB,GAA0B,IAAU,IAAqC;CAC3H,IAAM,CAACC,GAAKC,KAAUhB,EAAwC,IAAI;CAgBlE,OAfAZ,QAAgB;EACd,IAAI,CAAC6B,KAAQ,CAACC,GAAS;EACvB,IAAI,CAAC5H,EAAW2H,CAAI,GAAG;GACrB,EAAO,aAAa;GACpB;EACF;EACA,IAAIE,IAAO;EAKX,OAJAC,EAAO,SAASH,CAAI,CAAC,CAAC,MACnB,MAAME,KAAQH,EAAOK,CAAC,SACjBF,KAAQH,EAAO,aAAa,CACpC,SACa;GACX,IAAO;EACT;CACF,GAAG;EAACI;EAAQH;EAAMC;CAAO,CAAC,GACnBH;AACT;AAGA,SAAgBO,GAAW,GAAwB,GAAmB;CACpE,IAAIC,IAAK,GACLC,IAAKC,EAAI,SAAS,GAClBC,IAAM;CACV,OAAOH,KAAMC,IAAI;EACf,IAAMG,IAAOJ,IAAKC,KAAO;EACzB,AAAIC,EAAIE,MAAQC,KACd,IAAMD,GACN,IAAKA,IAAM,KACN,IAAKA,IAAM;CACpB;CACA,OAAOD;AACT;AAcA,SAAgBG,GAAY,GAAqC;CAC/D,IAAM5B,IAAK6B;CACX,IAAI,CAAC7B,KAAMA,EAAG,aAAa,GAAG,OAAO;CACrC,IAAM8B,IAAM9B,EAAG;CAGf,OAFI8B,MAAQ,cAAcA,MAAQ,WAAiB,KAC/CA,MAAQ,UAAgB,CAAC,iEAAiE,KAAM9B,EAAwB,IAAI,IACzH,CAAC,CAACA,EAAG;AACd;AAMA,SAAgB+B,GAAW,GAAiC;CAC1D,IAAI,CAAC/B,GAAI,OAAO;CAChB,IAAMgC,IAAMhC,EAAG,eACTiC,IAASD,EAAI,eACbE,IAAKlC,EAAG,YAAY,GACpBmC,IAAO,OAAO,aAAe,OAAeD,aAAc,aAAaA,EAAG,OAAO,MACjFE,IAASpC,EAAG,QAAQ,UAAU,KAAKA;CAGzC,OAFIiC,KAAUA,MAAWD,EAAI,QAAQC,MAAWE,KAAQ,CAACC,EAAO,SAASH,CAAM,IAAU,MACzFjC,EAAG,MAAM,EAAE,eAAe,GAAK,CAAC,GACzB;AACT;;ACpHA,IAAMqC,KAAc,kBAAC,QAAD;CAAM,GAAE;CAAgC,iBAAgB;CAAU,SAAS;CAAK,aAAa;AAAM,CAAA,GAEjHC,IAA+B;CACnC,MAAM,kBAAC,QAAD,EAAM,GAAE,+CAAgD,CAAA;CAC9D,MAAM,kBAAC,QAAD,EAAM,GAAE,gDAAiD,CAAA;CAC/D,MAAM,kBAAC,QAAD;EAAM,GAAE;EAA0D,aAAa;CAAM,CAAA;CAC3F,QAAQ,kBAAC,QAAD;EAAM,GAAE;EAA6B,aAAa;CAAM,CAAA;CAChE,WAAW,kBAAC,QAAD,EAAM,GAAE,kCAAmC,CAAA;CACtD,QAAQ,kBAAC,QAAD,EAAM,GAAE,0GAA2G,CAAA;CAC3H,OAAO,kBAAC,QAAD,EAAM,GAAE,+BAAgC,CAAA;CAC/C,WAAW,kBAAC,QAAD,EAAM,GAAE,sDAAuD,CAAA;CAC1E,MAAM,kBAAC,QAAD,EAAM,GAAE,kHAAmH,CAAA;CACjI,WAAW,kBAAC,QAAD,EAAM,GAAE,kCAAmC,CAAA;CACtD,aAAa,kBAAC,QAAD,EAAM,GAAE,kCAAmC,CAAA;CACxD,YAAY,kBAAC,QAAD,EAAM,GAAE,oCAAqC,CAAA;CACzD,SAAS,kBAAC,QAAD,EAAM,GAAE,kCAAmC,CAAA;CACpD,SAAS,kBAAC,QAAD;EAAM,GAAE;EAA0D,aAAa;CAAM,CAAA;CAC9F,SAAS,kBAAC,QAAD,EAAM,GAAE,oGAAqG,CAAA;CACtH,QAAQ,kBAAC,QAAD,EAAM,GAAE,8CAA+C,CAAA;CAC/D,SAAS,kBAAC,QAAD,EAAM,GAAE,+CAAgD,CAAA;CACjE,OAAO,kBAAC,QAAD,EAAM,GAAE,uCAAwC,CAAA;CACvD,QAAQ,kBAAC,QAAD,EAAM,GAAE,qDAAsD,CAAA;CACtE,MAAM,kBAAC,QAAD,EAAM,GAAE,0CAA2C,CAAA;CACzD,MAAM,kBAAC,QAAD,EAAM,GAAE,sDAAuD,CAAA;CACrE,MAAM,kBAAC,QAAD,EAAM,GAAE,oCAAqC,CAAA;CACnD,MAAM,kBAAC,QAAD,EAAM,GAAE,mFAAoF,CAAA;CAClG,OAAO,kBAAC,QAAD,EAAM,GAAE,uBAAwB,CAAA;CACvC,OAAO,kBAAC,QAAD,EAAM,GAAE,kDAAmD,CAAA;CAClE,OAAO,kBAAC,QAAD,EAAM,GAAE,gDAAiD,CAAA;CAChE,MAAM,kBAAC,QAAD,EAAM,GAAE,qGAAsG,CAAA;CACpH,WAAW,kBAAC,QAAD,EAAM,GAAE,oDAAqD,CAAA;CACxE,KAAK,kBAAC,QAAD,EAAM,GAAE,oCAAqC,CAAA;CAClD,KAAK,kBAAC,QAAD,EAAM,GAAE,qCAAsC,CAAA;CACnD,aAAa,kBAAC,QAAD,EAAM,GAAE,6DAA8D,CAAA;CACnF,MAAM,kBAAC,QAAD,EAAM,GAAE,mBAAoB,CAAA;CAClC,OAAO,kBAAC,QAAD,EAAM,GAAE,WAAY,CAAA;CAC3B,KAAK,kBAAC,QAAD,EAAM,GAAE,yCAA0C,CAAA;CACvD,OAAO,kBAAC,QAAD,EAAM,GAAE,gDAAiD,CAAA;CAChE,SAAS,kBAAC,QAAD,EAAM,GAAE,6BAA8B,CAAA;CAC/C,UAAU,kBAAC,QAAD,EAAM,GAAE,+BAAgC,CAAA;CAClD,MAAM,kBAAC,QAAD,EAAM,GAAE,0BAA2B,CAAA;CACzC,OAAO,kBAAC,QAAD,EAAM,GAAE,qCAAsC,CAAA;CACrD,MAAM,kBAAC,QAAD,EAAM,GAAE,kBAAmB,CAAA;CACjC,OAAO,kBAAC,QAAD,EAAM,GAAE,kCAAmC,CAAA;CAClD,MAAM,kBAAC,QAAD,EAAM,GAAE,6BAA8B,CAAA;CAC5C,OAAO,kBAAC,QAAD,EAAM,GAAE,wDAAyD,CAAA;CACxE,SAAS,kBAAC,QAAD;EAAM,GAAE;EAAgC,iBAAgB;CAAO,CAAA;CACxE,QAAQ,kBAAC,QAAD,EAAM,GAAE,8BAA+B,CAAA;CAC/C,KAAK,kBAAC,QAAD,EAAM,GAAE,qBAAsB,CAAA;CACnC,QAAQ,kBAAC,QAAD,EAAM,GAAE,8BAA+B,CAAA;CAC/C,QAAQ,kBAAC,QAAD,EAAM,GAAE,8BAA+B,CAAA;CAC/C,MAAM,kBAAC,QAAD,EAAM,GAAE,8CAA+C,CAAA;CAC7D,IAAI,kBAAC,QAAD,EAAM,GAAE,gBAAiB,CAAA;CAC7B,MAAM,kBAAC,QAAD,EAAM,GAAE,eAAgB,CAAA;CAC9B,SAAS,kBAAC,QAAD,EAAM,GAAE,gBAAiB,CAAA;CAClC,YAAY,kBAAAvK,GAAA,EAAA,UAAA;EAAE,kBAAC,QAAD;GAAM,GAAE;GAAU,aAAa;EAAI,CAAA;EAAC,kBAAC,QAAD;GAAM,GAAE;GAAW,aAAa;EAAM,CAAA;EAAC,kBAAC,QAAD;GAAM,GAAE;GAAa,aAAa;EAAM,CAAA;CAAG,EAAA,CAAA;CACpI,QAAQ,kBAAC,QAAD,EAAM,GAAE,qCAAsC,CAAA;CACtD,WAAW,kBAAC,QAAD,EAAM,GAAE,kCAAmC,CAAA;CACtD,OAAO,kBAAC,QAAD,EAAM,GAAE,qCAAsC,CAAA;CACrD,OAAO,kBAAC,QAAD,EAAM,GAAE,qCAAsC,CAAA;CACrD,UAAU,kBAAC,QAAD,EAAM,GAAE,kCAAmC,CAAA;CACrD,UAAU,kBAAC,QAAD,EAAM,GAAE,wHAAyH,CAAA;CAC3I,MAAM,kBAAC,QAAD,EAAM,GAAE,wCAAyC,CAAA;CACvD,SAAS,kBAAC,QAAD,EAAM,GAAE,uEAAwE,CAAA;CACzF,SAAS,kBAAC,QAAD,EAAM,GAAE,0CAA2C,CAAA;CAC5D,SAAS,kBAAC,QAAD,EAAM,GAAE,iCAAkC,CAAA;CACnD,OAAO,kBAAC,QAAD,EAAM,GAAE,gDAAiD,CAAA;CAChE,SAAS,kBAAC,QAAD,EAAM,GAAE,+CAAgD,CAAA;CACjE,UAAU,kBAAC,QAAD;EAAM,GAAE;EAA6E,aAAa;CAAM,CAAA;CAClH,SAAS,kBAAC,QAAD,EAAM,GAAE,sDAAuD,CAAA;CACxE,WAAW,kBAAC,QAAD,EAAM,GAAE,wDAAyD,CAAA;CAC5E,QAAQ,kBAAC,QAAD,EAAM,GAAE,mEAAoE,CAAA;CACpF,QAAQ,kBAAC,QAAD,EAAM,GAAE,mEAAoE,CAAA;CACpF,WAAW,kBAAC,QAAD,EAAM,GAAE,sDAAuD,CAAA;CAC1E,WAAW,kBAAC,QAAD;EAAM,GAAE;EAAyC,aAAa;CAAI,CAAA;CAC7E,OAAO,kBAAC,QAAD,EAAM,GAAE,iDAAkD,CAAA;CACjE,OAAO,kBAAC,QAAD,EAAM,GAAE,0CAA2C,CAAA;CAC1D,SAAS,kBAAC,QAAD;EAAM,GAAE;EAAoD,aAAa;CAAI,CAAA;CACtF,SAAS,kBAAC,QAAD,EAAM,GAAE,sEAAuE,CAAA;CACxF,YAAY,kBAAC,QAAD,EAAM,GAAE,mEAAoE,CAAA;CACxF,KAAK,kBAAC,QAAD,EAAM,GAAE,yDAA0D,CAAA;CACvE,KAAK,kBAAC,QAAD,EAAM,GAAE,4EAA6E,CAAA;CAC1F,OAAO,kBAAC,QAAD,EAAM,GAAE,8BAA+B,CAAA;CAC9C,YAAY,kBAAC,QAAD,EAAM,GAAE,6CAA8C,CAAA;CAClE,UAAU,kBAAC,QAAD,EAAM,GAAE,oCAAqC,CAAA;CACvD,QAAQ,kBAAC,QAAD,EAAM,GAAE,+GAAgH,CAAA;CAChI,WAAW,kBAAC,QAAD,EAAM,GAAE,wFAAyF,CAAA;CAC5G,UAAU,kBAAC,QAAD,EAAM,GAAE,iIAAkI,CAAA;CACpJ,SAAS,kBAAC,QAAD,EAAM,GAAE,uFAAwF,CAAA;CACzG,SAAS,kBAAC,QAAD;EAAM,GAAE;EAAkF,aAAa;CAAM,CAAA;CACtH,SAAS,kBAAC,QAAD;EAAM,GAAE;EAAqH,aAAa;CAAM,CAAA;CACzJ,OAAO,kBAAC,QAAD;EAAM,GAAE;EAAyB,aAAa;CAAM,CAAA;CAC3D,MAAM,kBAAC,QAAD;EAAM,GAAE;EAAoC,aAAa;CAAM,CAAA;CACrE,MAAM,kBAAC,QAAD,EAAM,GAAE,gCAAiC,CAAA;CAC/C,QAAQ,kBAAAA,GAAA,EAAA,UAAA,CAAGsK,IAAY,kBAAC,QAAD,EAAM,GAAE,gBAAiB,CAAA,CAAG,EAAA,CAAA;CACnD,QAAQ,kBAAAtK,GAAA,EAAA,UAAA,CAAGsK,IAAY,kBAAC,QAAD,EAAM,GAAE,mBAAoB,CAAA,CAAG,EAAA,CAAA;CACtD,MAAM,kBAAAtK,GAAA,EAAA,UAAA,CAAGsK,IAAY,kBAAC,QAAD;EAAM,GAAE;EAAU,aAAa;CAAM,CAAA,CAAG,EAAA,CAAA;CAC7D,SAAS,kBAAAtK,GAAA,EAAA,UAAA,CAAGsK,IAAY,kBAAC,QAAD;EAAM,GAAE;EAAW,aAAa;CAAM,CAAA,CAAG,EAAA,CAAA;CACjE,OAAO,kBAAAtK,GAAA,EAAA,UAAA,CAAGsK,IAAY,kBAAC,QAAD;EAAM,GAAE;EAAU,aAAa;CAAM,CAAA,CAAG,EAAA,CAAA;CAC9D,QAAQ,kBAAAtK,GAAA,EAAA,UAAA,CAAGsK,IAAY,kBAAC,QAAD;EAAM,GAAE;EAAW,aAAa;CAAM,CAAA,CAAG,EAAA,CAAA;CAChE,OAAOA;CACP,MAAM,kBAAC,QAAD,EAAM,GAAE,gBAAiB,CAAA;CAC/B,WAAW,kBAAC,QAAD,EAAM,GAAE,wEAAyE,CAAA;CAC5F,SAAS,kBAAC,QAAD,EAAM,GAAE,uDAAwD,CAAA;CACzE,UAAU,kBAAC,QAAD,EAAM,GAAE,gBAAiB,CAAA;CACnC,OAAO,kBAAC,QAAD,EAAM,GAAE,0BAA2B,CAAA;CAC1C,MAAM,kBAAC,QAAD,EAAM,GAAE,qEAAsE,CAAA;CACpF,MAAM,kBAAC,QAAD,EAAM,GAAE,aAAc,CAAA;CAC5B,UAAU,kBAAC,QAAD,EAAM,GAAE,6BAA8B,CAAA;CAChD,UAAU,kBAAC,QAAD,EAAM,GAAE,8BAA+B,CAAA;CACjD,SAAS,kBAAC,QAAD,EAAM,GAAE,8BAA+B,CAAA;CAChD,UAAU,kBAAC,QAAD,EAAM,GAAE,8BAA+B,CAAA;CACjD,QAAQ,kBAAC,QAAD,EAAM,GAAE,kCAAmC,CAAA;CACnD,QAAQ,kBAAC,QAAD,EAAM,GAAE,kCAAmC,CAAA;CACnD,MAAM,kBAAC,QAAD,EAAM,GAAE,2JAA4J,CAAA;CAC1K,MAAM,kBAAC,QAAD,EAAM,GAAE,sEAAuE,CAAA;CACrF,MAAM,kBAAC,QAAD,EAAM,GAAE,yGAA0G,CAAA;CACxH,OAAO,kBAAC,QAAD,EAAM,GAAE,qGAAsG,CAAA;CACrH,KAAK,kBAAC,QAAD;EAAM,GAAE;EAA4K,aAAa;CAAM,CAAA;CAC5M,MAAM,kBAAC,QAAD,EAAM,GAAE,2GAA4G,CAAA;CAC1H,KAAK,kBAAC,QAAD,EAAM,GAAE,oFAAqF,CAAA;CAClG,QAAQ,kBAAC,QAAD,EAAM,GAAE,+BAAgC,CAAA;CAChD,MAAM,kBAAC,QAAD,EAAM,GAAE,yDAA0D,CAAA;AAC1E;AAEA,SAAgBE,EAAK,EAAE,SAAM,UAAO,MAAuC;CACzE,OACE,kBAAC,OAAD;EAAK,OAAO1C;EAAM,QAAQA;EAAM,SAAQ;EAAY,MAAK;EAAO,QAAO;EAAe,aAAa;EAAK,eAAc;EAAQ,gBAAe;EAAQ,eAAA;EAClJ,UAAAyC,EAAEjE;CACA,CAAA;AAET;AAEA,IAAMmE,MAAQ,MAAwB,EAAE,eAAe;AAGvD,SAASC,GAAO,GAAiG;CAC/G,IAAM9C,IAAMC,EAAuB,IAAI,GACjC,CAAC8C,GAAIC,KAAS5C,EAAS,CAAC;CAS9B,OARAX,QAAsB;EACpB,IAAMY,IAAKL,EAAI;EACf,IAAI,CAACK,GAAI;EACT,IAAM4C,IAAI5C,EAAG,sBAAsB,GAC7B6C,IAAK,SAAS,gBAAgB;EACpC,AAAID,EAAE,QAAQC,IAAK,IAAGF,EAAM,CAAC,KAAK,IAAIC,EAAE,OAAO,GAAGA,EAAE,QAAQC,IAAK,CAAC,CAAC,IAC1DD,EAAE,OAAO,KAAGD,EAAM,IAAIC,EAAE,IAAI;CACvC,GAAG,CAAC,CAAC,GAEH,kBAAC,OAAD;EAAU;EAAK,WAAWE,EAAM,aAAa;EAAa,OAAOJ,IAAK,EAAE,WAAW,cAAcA,EAAG,KAAK,IAAI,KAAA;EAAW,aAAaI,EAAM;EACxI,UAAAA,EAAM;CACJ,CAAA;AAET;AAGA,SAAgBC,EAAW,GAAoC,GAAe,GAAmB;CAC/F,IAAMC,IAAKpD,EAAOqD,CAAK;CAEvB,AADA,EAAG,UAAUA,GACb9D,QAAgB;EACd,IAAI,CAAC+D,GAAM;EACX,IAAMtC,KAAM,MAAkB;GAC5B,IAAMZ,IAAKL,EAAI;GACf,AAAIK,KAAM,CAACtE,EAAE,aAAa,CAAC,CAAC,SAASsE,CAAE,KAAGgD,EAAG,QAAQ;EACvD;EAEA,OADA,OAAO,iBAAiB,aAAapC,GAAI,EAAI,SAChC,OAAO,oBAAoB,aAAaA,GAAI,EAAI;CAC/D,GAAG,CAACsC,GAAMvD,CAAG,CAAC;AAChB;AAEA,SAAgBwD,EAAI,GAAuI;CACzJ,OACE,kBAAC,UAAD;EACE,MAAK;EACL,WAAWL,EAAM,SAAS,mBAAmB;EAC7C,OAAOA,EAAM;EACb,cAAYA,EAAM;EAClB,gBAAcA,EAAM;EACpB,UAAUA,EAAM;EAChB,aAAaN;EACb,SAASM,EAAM;EACf,OAAOA,EAAM,OAAO;GAAE,OAAO;GAAQ,SAAS;EAAQ,IAAI,KAAA;EAEzD,UAAAA,EAAM,OAAO,kBAACP,GAAD,EAAM,MAAMO,EAAM,KAAO,CAAA,IAAIA,EAAM;CAC3C,CAAA;AAEZ;AAEA,IAAaM,UAAY,kBAAC,QAAD,EAAM,WAAU,YAAa,CAAA;AAqBtD,SAAgBC,EAAoC,GAiBjD;CACD,IAAM,EAAE,eAAYP,GACd,CAACI,GAAMI,KAAWvD,EAAS,EAAK,GAChC,CAACwB,GAAIgC,KAASxD,EAAS,EAAE,GACzB,CAACyD,GAAOC,KAAY1D,EAAS,CAAC,GAC9BJ,IAAMC,EAAwB,IAAI,GAClC8D,IAAU9D,EAAuB,IAAI,GACrC7C,IAAQ6C,EAAO;EAAE,MAAM;EAAI,IAAI;CAAE,CAAC,GAClC+D,IAAQb,EAAM,UAAU,KAAA,GACxBc,IAAMD,IAAQE,EAAQ,WAAW,MAAMC,EAAE,UAAUhB,EAAM,KAAK,IAAI,IAClEiB,IAAUH,KAAO,IAAIC,EAAQD,KAAO,KAAA;CAC1C,EAAWjE,GAAKuD,SAAYI,EAAQ,EAAK,CAAC;CAE1C,IAAMU,KAAQ,MAAiC;EAC7C,AAAKF,KAAK,GAAE,aACZR,EAAQ,EAAK,GACbR,EAAM,SAASgB,EAAE,KAAK;CACxB,GACMG,UAAa;EAGjB,AAFAV,EAAMK,KAAO,IAAIA,IAAMC,EAAQ,WAAW,MAAM,CAACC,EAAE,QAAQ,CAAC,GAC5DL,EAAS,CAAC,GACVH,EAAQ,EAAI;CACd;CAoDA,AAjDAnE,QAAgB;EACd,IAAI,CAAC+D,GAAM;EACX,IAAMtC,KAAM,MAAqB;GAC/B,IAAM,IAAIiD,EAAQ,QACZK,KAAQ,GAAc,MAAc;IACxC,IAAI,IAAIC;IACR,KAAK,IAAIC,IAAI,GAAGA,IAAI,GAAG,KAErB,IADA,KAAK,IAAIC,IAAI,KAAK,GACd,CAACR,EAAQ,EAAE,CAAC,UAAU,OAAO;IAEnC,OAAOM;GACT;GACA,IAAI,EAAE,QAAQ,aAAa,GAAO,MAAMD,EAAK/D,GAAG,CAAC,CAAC;QAC7C,IAAI,EAAE,QAAQ,WAAW,GAAO,MAAM+D,EAAK/D,IAAI,IAAI,IAAIA,GAAG,EAAE,CAAC;QAC7D,IAAI,EAAE,QAAQ,QAAQ,EAAM+D,EAAK,IAAI,CAAC,CAAC;QACvC,IAAI,EAAE,QAAQ,OAAO,EAAMA,EAAK,GAAG,EAAE,CAAC;QACtC,IAAI,EAAE,QAAQ,WAAY,EAAE,QAAQ,OAAO,CAACnH,EAAM,QAAQ,MAAO,EAAK8G,EAAQtC,EAAG;QACjF,IAAI,EAAE,QAAQ,UAAU,EAAQ,EAAK;QACrC,IAAI,EAAE,QAAQ,OAAO,OAAO+B,EAAQ,EAAK;QACzC,IAAI,EAAE,IAAI,WAAW,KAAK,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,QAAQ;IAEpE,IAAMjH,IAAIU,EAAM;IAEhB,AADA,EAAE,QAAQ,KAAK,IAAI,IAAIV,EAAE,KAAK,MAAMA,EAAE,OAAO,MAAM,EAAE,IAAI,YAAY,GACrE,EAAE,KAAK,KAAK,IAAI;IAChB,IAAMQ,IAAIgH,EAAQ,WAAW,MAAM,CAACC,EAAE,YAAYA,EAAE,MAAM,YAAY,CAAC,CAAC,WAAWzH,EAAE,IAAI,CAAC;IAC1F,AAAIQ,KAAK,KAAG0G,EAAM1G,CAAC;GACrB,OAAO;GAEP,AADA,EAAE,eAAe,GACjB,EAAE,gBAAgB;EACpB;EAEA,OADA,OAAO,iBAAiB,WAAW+D,GAAI,EAAI,SAC9B,OAAO,oBAAoB,WAAWA,GAAI,EAAI;CAC7D,GAAG;EAACsC;EAAM3B;EAAIsC;CAAO,CAAC,GAGtBzE,QAAsB;EACpB,IAAMY,IAAK0D,EAAQ;EACnB,IAAI,CAACR,KAAQ,CAAClD,GAAI;EAClB,IAAM4C,IAAI5C,EAAG,sBAAsB,GAC7B6C,IAAK,SAAS,gBAAgB;EACpC,AAAID,EAAE,QAAQC,IAAK,IAAGY,GAAU,MAAMrD,KAAKwC,EAAE,QAAQC,IAAK,EAAE,IACnDD,EAAE,OAAO,KAAGa,GAAU,MAAMrD,KAAK,IAAIwC,EAAE,KAAK;EAErD,IAAM0B,IAAOtE,EAAG,QAAQ,UAAU,GAC5BuE,IAAS,KAAK,IAAI,SAAS,gBAAgB,cAAcD,IAAOA,EAAK,sBAAsB,CAAC,CAAC,SAAS,QAAQ,GAC9GE,IAAS,WAAW,iBAAiBxE,CAAE,CAAC,CAAC,SAAS,GAClDyE,IAAOF,IAAS3B,EAAE,MAAM;EAC9B,AAAI6B,IAAO,MAAG,EAAG,MAAM,YAAY,GAAG,KAAK,IAAI,KAAK,KAAK,IAAI,OAAO,SAASD,CAAM,IAAIA,IAASC,GAAMA,CAAI,CAAC,EAAE;CAC/G,GAAG,CAACvB,CAAI,CAAC,GACT9D,QAAsB;EACpB,AAAI8D,KAAMQ,EAAQ,SAAS,cAAc,YAAYnC,EAAG,GAAG,CAAC,EAAE,eAAe,EAAE,OAAO,UAAU,CAAC;CACnG,GAAG,CAAC2B,GAAM3B,CAAE,CAAC;CAEb,IAAMmD,IAAQ5B,EAAM,UAAU,KAAA,IAA2BiB,GAAS,SAASjB,EAAM,eAAe,KAAtDA,EAAM;CAChD,OACE,kBAAC,QAAD;EAAW;EAAK,WAAU;EAA1B,UAAA,CACE,kBAAC,UAAD;GACE,MAAK;GACL,YAAYI,IAAO,qBAAqB,YAAYJ,EAAM,YAAY,MAAMA,EAAM,YAAY;GAC9F,OAAO,EAAE,OAAOA,EAAM,MAAM;GAC5B,OAAOA,EAAM;GACb,cAAYA,EAAM;GAClB,iBAAc;GACd,iBAAeI;GACf,UAAUJ,EAAM;GAChB,aAAaN;GACb,eAAgBU,IAAOI,EAAQ,EAAK,IAAIW,EAAK;GAC7C,YAAY,MAAM;IAChB,AAAKf,KAAS,EAAE,QAAQ,eAAe,EAAE,QAAQ,WAAW,EAAE,QAAQ,QACpE,EAAE,eAAe,GACjBe,EAAK;GAET;GAhBF,UAAA;IAkBGnB,EAAM,QAAQ,kBAACP,GAAD,EAAM,MAAMO,EAAM,KAAO,CAAA;IACvC4B,MAAU,QAAQ,kBAAC,QAAD;KAAM,WAAWX,KAAWjB,EAAM,UAAU,KAAA,IAAY,gBAAgB;KAAyB,UAAA4B;IAAY,CAAA;IAChI,kBAACnC,GAAD;KAAM,MAAK;KAAU,MAAM;IAAK,CAAA;GAC1B;EACP,CAAA,GAAAW,KACC,kBAAC,OAAD;GACE,KAAKQ;GACL,WAAU;GACV,MAAK;GACL,cAAYZ,EAAM;GAClB,OAAO;IAAE,UAAUA,EAAM;IAAW,GAAIA,EAAM,aAAa,EAAE,OAAO,CAACU,EAAM,IAAI,EAAE,MAAMA,EAAM;GAAG;GAChG,aAAahB;GAEZ,UAAAqB,EAAQ,KAAK,GAAG,MACf,kBAACc,GAAD,EAAA,UAAA;IACGb,EAAE,OAAOjH,IAAI,KAAK,kBAAC,OAAD;KAAK,WAAU;KAAY,MAAK;IAAa,CAAA;IAC/DiH,EAAE,QACD,kBAAC,OAAD;KAAK,WAAU;KAAa,MAAK;KAC9B,UAAAA,EAAE;IACA,CAAA;IAEP,kBAAC,OAAD;KACE,UAAQjH;KACR,MAAK;KACL,iBAAeA,MAAM+G;KACrB,iBAAeE,EAAE,YAAY,KAAA;KAC7B,WAAW,eAAejH,MAAM0E,IAAK,cAAc,OAAOuC,EAAE,WAAW,eAAe;KACtF,mBAAmBjH,MAAM0E,KAAM,CAACuC,EAAE,YAAYP,EAAM1G,CAAC;KACrD,eAAemH,EAAKF,CAAC;KAPvB,UAAA;MASGH,KAAS,kBAAC,QAAD;OAAM,WAAU;OAAe,UAAA9G,MAAM+G,KAAO,kBAACrB,GAAD;QAAM,MAAK;QAAQ,MAAM;OAAK,CAAA;MAAQ,CAAA;MAC3FuB,EAAE,QAAQ,kBAACvB,GAAD,EAAM,MAAMuB,EAAE,KAAO,CAAA;MAChC,kBAAC,QAAD;OAAM,WAAU;OAAa,OAAOA,EAAE;OACnC,UAAAA,EAAE;MACC,CAAA;MACLA,EAAE,QAAQ,kBAAC,QAAD;OAAM,WAAU;OAAc,UAAAA,EAAE;MAAW,CAAA;KACnD;;GACG,EAAA,GAvBK,OAAOA,EAAE,KAAK,CAuBnB,CACX;EACE,CAAA,CAEH;;AAEV;AAGA,SAAgBc,GAAkC,GAS/C;CACD,OAAO,kBAACvB,GAAD,EAAU,GAAIP,EAAQ,CAAA;AAC/B;AAGA,SAAgB+B,GAAQ,GAAsI;CAC5J,IAAMC,IAAQhC,EAAM,SAAS9K,IACvB,CAAC8D,GAAMkJ,KAAWjF,EAAwB,IAAI,GAC9C,CAACmD,GAAMI,KAAWvD,EAAS,EAAK,GAChCJ,IAAMC,EAAwB,IAAI,GAClCqF,IAAWrF,EAAyB,IAAI;CAC9C,EAAWD,GAAKuD,SAAYI,EAAQ,EAAK,CAAC;CAC1C,IAAM4B,IAAOpC,EAAM,SAASA,EAAM,eAAe,IAC3CqC,KAAO,MAAc;EAGzB,AAFAH,EAAQ,IAAI,GACZ1B,EAAQ,EAAK,GACT,OAAO,SAAShE,CAAC,KAAKA,KAAK,KAAKA,KAAK,OAAKwD,EAAM,SAAS,KAAK,MAAMxD,IAAI,CAAC,IAAI,CAAC;CACpF,GACM8F,UAAa;EAEjB,AADItJ,MAAS,QAAMqJ,EAAI,WAAWrJ,CAAI,CAAC,GACvCmJ,EAAS,SAAS,KAAK;CACzB,GACMI,IAAQvC,EAAM,SAAS;CAC7B,OACE,kBAAC,QAAD;EAAW;EAAK,WAAU;EAA1B,UAAA;GACE,kBAAC,UAAD;IAAQ,MAAK;IAAS,WAAU;IAAqB,OAAM;IAAqB,cAAW;IAAqB,UAAUA,EAAM;IAAU,aAAaN;IAAM,eAAe2C,EAAI,KAAK,IAAI,GAAG,KAAK,KAAKD,CAAI,IAAI,CAAC,CAAC;IAC9M,UAAA,kBAAC3C,GAAD;KAAM,MAAK;KAAQ,MAAM;IAAK,CAAA;GACxB,CAAA;GACR,kBAAC,SAAD;IACE,KAAK0C;IACL,WAAU;IACH;IACP,cAAYI;IACZ,WAAU;IACV,UAAUvC,EAAM;IAChB,OAAOhH,MAASgH,EAAM,UAAU,KAAA,IAAkC,KAAtB,OAAOA,EAAM,KAAK;IAC9D,aAAaA,EAAM,gBAAgB,KAAA,IAAwC,KAA5B,OAAOA,EAAM,WAAW;IACvE,UAAU,MAAM;KAEd,AADA,EAAE,cAAc,OAAO,GACvBQ,EAAQ,EAAI;IACd;IACA,WAAW,MAAM0B,EAAQ,EAAE,OAAO,MAAM,QAAQ,WAAW,EAAE,CAAC;IAC9D,YAAY,MAAM;KAChB,IAAI,EAAE,QAAQ,SAEZ,AADA,EAAE,eAAe,GACjBI,EAAK;UACA,IAAI,EAAE,QAAQ,UAInB,AAHA,EAAE,eAAe,GACjBJ,EAAQ,IAAI,GACZ1B,EAAQ,EAAK,GACb2B,EAAS,SAAS,KAAK;UAClB,IAAI,EAAE,QAAQ,aAAa,EAAE,QAAQ,aAAa;MACvD,EAAE,eAAe;MACjB,IAAMK,IAAM,WAAWxJ,KAAQ,OAAOoJ,CAAI,CAAC,GACrCtI,IAAO,EAAE,QAAQ,YAAYkI,EAAM,MAAM,MAAMxF,IAAIgG,CAAG,IAAI,CAAC,GAAGR,CAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,MAAMxF,IAAIgG,CAAG;MACxG,AAAI1I,MAAS,KAAA,KAAWoI,EAAQ,OAAOpI,CAAI,CAAC;KAC9C;IACF;IACA,cAAc;KAEZ,AADId,MAAS,QAAMqJ,EAAI,WAAWrJ,CAAI,CAAC,GACvCwH,EAAQ,EAAK;IACf;GACD,CAAA;GACD,kBAAC,UAAD;IAAQ,MAAK;IAAS,WAAU;IAAqB,OAAM;IAAqB,cAAW;IAAqB,UAAUR,EAAM;IAAU,aAAaN;IAAM,eAAe2C,EAAI,KAAK,MAAMD,CAAI,IAAI,CAAC;IAClM,UAAA,kBAAC3C,GAAD;KAAM,MAAK;KAAO,MAAM;IAAK,CAAA;GACvB,CAAA;GACPW,KACC,kBAAC,OAAD;IAAK,WAAU;IAAwB,MAAK;IAAU,cAAYmC;IAAO,aAAa7C;IACnF,UAAAsC,EAAM,KAAK,MACV,kBAAC,OAAD;KAAa,MAAK;KAAS,iBAAexF,MAAMwD,EAAM;KAAO,WAAW,eAAe,OAAOxD,CAAC,OAAOxD,KAAQ,OAAOgH,EAAM,KAAK,KAAK,cAAc;KAAK,eAAeqC,EAAI7F,CAAC;KACzK,UAAAA;IACE,GAFKA,CAEL,CACN;GACE,CAAA;EAEH;;AAEV;AAIA,SAASiG,GAAQ,GAAqC;CACpD,IAAMrJ,IAAsB,CAAC;CAM7B,OALAsJ,GAAS,QAAQC,IAAW,MAAM;EAChC,AAAKC,EAAeC,CAAC,MACjBA,EAAE,SAAShB,IAAUzI,EAAI,KAAK,GAAGqJ,GAASI,EAAE,MAAmC,QAAQ,CAAC,IACvFzJ,EAAI,KAAKyJ,CAAC;CACjB,CAAC,GACMzJ;AACT;AAEA,IAAM0J,MAAa,MAAqB;CACtC,IAAMjF,IAAIX,EAAG;CAEb,OAAO,GADG,OAAOA,EAAG,QAAS,WAAWA,EAAG,OAAQA,EAAG,KAA2B,KACrE,GAAGW,EAAE,SAASA,EAAE,SAAS,OAAOA,EAAE,SAAU,WAAWA,EAAE,QAAQ;AAC/E;AAMA,SAAgBkF,GAAW,EAAE,eAAqC;CAChE,IAAMC,IAAQP,GAAQE,CAAQ,GACxBtH,IAAM2H,EAAM,IAAIF,EAAS,CAAC,CAAC,KAAK,GAAG,GACnCG,IAASnG,EAAuB,IAAI,GACpCoG,IAASpG,EAAiB,CAAC,CAAC,GAC5B,CAACqG,GAAKC,KAAUnG,EAAkD;EAAE,KAAK;EAAI,KAAK+F,EAAM;EAAQ,GAAG;CAAE,CAAC,GACtG,CAACK,GAAMC,KAAWrG,EAAS,EAAK,GAChCsG,IAAUzG,EAAwB,IAAI;CAC5C,EAAWyG,GAASF,SAAYC,EAAQ,EAAK,CAAC;CAC9C,IAAME,IAAWL,EAAI,QAAQ9H,GACvBoI,IAAMD,IAAWL,EAAI,MAAMH,EAAM,QAEjCU,KAAU,MAAc;EAC5B,IAAMC,IAAKT,EAAO,SAEZU,IAAQD,EAAG,QAAQ,GAAG,MAAM/I,IAAIiJ,IAAI,GAAK,CAAC,GAC5CvC,IAAI0B,EAAM;EACd,IAAIY,IAAQxG,GAAG;GACb,IAAMuE,IAAOvE,IAAI,IACb0G,IAAO;GAEX,KADA,IAAI,GACGxC,IAAI0B,EAAM,UAAUc,IAAOH,EAAGrC,KAAK,KAAOK,IAAM,KAAQgC,EAAG,OAAO;EAC3E;EACA,GAAQ,MAAO/H,EAAE,QAAQP,KAAOO,EAAE,QAAQ0F,KAAK1F,EAAE,MAAMwB,IAAIxB,IAAI;GAAE;GAAK,KAAK0F;GAAG;EAAE,CAAE;CACpF,GACMyC,UAAc;EAClB,IAAM7G,IAAK+F,EAAO;EAClB,IAAI,CAAC/F,GAAI,OAAO;EAChB,IAAM8G,IAAK,iBAAiB9G,CAAE;EAC9B,OAAOA,EAAG,cAAc,WAAW8G,EAAG,WAAW,IAAI,WAAWA,EAAG,YAAY;CACjF;CAGA,QAAsB;EACpB,IAAM9G,IAAK+F,EAAO;EAClB,AAAK/F,KAAM,OACX,EAAO,UAAU,CAAC,GAAGA,EAAG,iBAA8B,mBAAmB,CAAC,CAAC,CAAC,KAAK,MAAMP,EAAE,sBAAsB,CAAC,CAAC,KAAK,GACtH+G,EAAOK,EAAM,CAAC;CAChB,CAAC;CACD,IAAME,IAAWnH,QAAa,CAAC,CAAC;CAIhC,AAHA,EAAS,gBAAgB;EACvB,AAAIoG,EAAO,QAAQ,WAAWF,EAAM,UAAQU,EAAOK,EAAM,CAAC;CAC5D,GACA1H,QAAgB;EACd,IAAMa,IAAK+F,EAAO;EAClB,IAAI,CAAC/F,GAAI;EACT,IAAMK,IAAK,IAAI,qBAAqB0G,EAAS,QAAQ,CAAC;EAEtD,OADA1G,EAAG,QAAQL,CAAE,SACAK,EAAG,WAAW;CAC7B,GAAG,CAAC,CAAC;CAEL,IAAM2G,KAAS,MAAiC,CAAC,CAAChH,KAAMA,EAAG,SAASoD,GAChE6D,IAAMV;CACV,OAAOU,IAAM,KAAKD,EAAMlB,EAAMmB,IAAM,EAAE,KAAKA,IAAMnB,EAAM,SAAQ;CAC/D,IAAMoB,IAAOpB,EAAM,MAAMS,CAAG,CAAC,CAAC,QAAQ,GAAI,GAAG,MAAU,GAAMvG,CAAE,KAAMnD,MAAM,KAAKA,MAAMsK,EAAI,SAAS,CAAG;CACtG,OACE,kBAAC,OAAD;EAAK,KAAKpB;EAAQ,WAAU;EAAU,MAAK;EAA3C,UAAA,CACGD,EAAM,MAAM,GAAGmB,CAAG,CAAC,CAAC,KAAK,GAAI,MAC5B,kBAAC,QAAD;GAAc,UAAQpK;GAAG,WAAU;GAChC,UAAAmD;EACG,GAFKnD,CAEL,CACP,GACAqK,EAAK,SAAS,KACb,kBAAC,QAAD;GAAM,KAAKb;GAAS,WAAU;GAA9B,UAAA,CACE,kBAAC,UAAD;IAAQ,MAAK;IAAS,WAAWF,IAAO,mBAAmB;IAAS,OAAM;IAAO,cAAW;IAAa,iBAAeA;IAAM,aAAa3D;IAAM,eAAe4D,GAAS,MAAM,CAACgB,CAAC;IAC/K,UAAA,kBAAC7E,GAAD,EAAM,MAAK,OAAQ,CAAA;GACb,CAAA,GACP4D,KACC,kBAAC1D,IAAD;IAAQ,WAAU;IACf,UAAAyE,EAAK,KAAK,GAAI,MACb,kBAAC,QAAD;KAAc,WAAU;KACrB,UAAAlH;IACG,GAFKnD,CAEL,CACP;GACK,CAAA,CAEN;EAEL,CAAA,CAAA;;AAET;AAEA,IAAMwK,KAAU,2VAMhB,GAGMC,KAAa,+BACbC,KAAa,GACbC,KAAO,kBACTC,IAAgC,MAC9BC,qBAAkB,IAAI,IAAgB;AAE5C,SAASC,KAA4B;CACnC,IAAIF,GAAc,OAAOA;CACzB,IAAe,CAAC;CAChB,IAAI;EACF,IAAM9F,IAAa,KAAK,MAAM,aAAa,QAAQ2F,EAAU,KAAK,IAAI;EACtE,AAAI,MAAM,QAAQ3F,CAAC,MAAG,IAAeA,EAAE,QAAQ,MAAmB,OAAOgE,KAAM,YAAY6B,GAAK,KAAK7B,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG4B,EAAU;CAC9H,QAAQ,CAER;CACA,OAAOE;AACT;AAEA,SAASG,GAAe,GAAW;CACjC,IAAe,CAACjC,GAAG,GAAGgC,GAAgB,CAAC,CAAC,QAAQ,MAAMlI,MAAMkG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG4B,EAAU;CACnF,IAAI;EACF,aAAa,QAAQD,IAAY,KAAK,UAAUG,CAAY,CAAC;CAC/D,QAAQ,CAER;CACA,GAAgB,SAAS,MAAM/I,EAAE,CAAC;AACpC;AAEA,IAAMmJ,MAAmB,OACvBH,GAAgB,IAAIhJ,CAAC,SACR;CACX,GAAgB,OAAOA,CAAC;AAC1B;AAGF,SAAgBoJ,GAAS,GAAoI;CAC3J,IAAM,CAAC5E,GAAMI,KAAWvD,EAAS,EAAK,GAChCJ,IAAMC,EAAwB,IAAI,GAClCmI,IAAYnI,EAAyB,IAAI,GACzCoI,IAASC,GAAqBJ,IAAiBF,IAAiBA,EAAe;CACrF,EAAWhI,GAAKuD,SAAYI,EAAQ,EAAK,CAAC;CAC1C,IAAM4E,IAAStI,EAAOkD,EAAM,MAAM;CAClC,EAAO,UAAUA,EAAM;CACvB,IAAMwC,IAAMxC,EAAM,OAAO,YAAY;CAGrC,QAAgB;EACd,IAAM9C,IAAK+H,EAAU;EACrB,IAAI,CAAC/H,GAAI;EACT,IAAMY,UAAW;GACf,IAAM+E,IAAI3F,EAAG,MAAM,YAAY;GAC/B,AAAKwH,GAAK,KAAK7B,CAAC,MAChBiC,GAAejC,CAAC,GAChBuC,EAAO,QAAQvC,CAAC;EAClB;EAEA,OADA3F,EAAG,iBAAiB,UAAUY,CAAE,SACnBZ,EAAG,oBAAoB,UAAUY,CAAE;CAClD,GAAG,CAAC,CAAC;CAEL,IAAMuH,UAAmB;EACvB,IAAMnI,IAAK+H,EAAU;EACrB,IAAK/H,GACL;GACA,AADA,EAAG,QAAQsF,KAAOkC,GAAK,KAAKlC,CAAG,IAAIA,IAAO0C,EAAO,MAAM,WACvD1E,EAAQ,EAAK;GACb,IAAI;IACF,EAAG,WAAW;GAChB,QAAQ;IACN,EAAG,MAAM;GACX;EANuD;CAOzD,GACM8E,KAAU,MACd,kBAAC,UAAD;EAAgB,MAAK;EAAS,OAAOzC;EAAG,WAAWL,MAAQK,IAAI,OAAO,KAAA;EAAW,OAAO,EAAE,YAAYA,EAAE;EAAG,gBAAgB7C,EAAM,OAAO6C,CAAC,GAAGrC,EAAQ,EAAK;CAAK,GAAjJqC,CAAiJ;CAEhK,OACE,kBAAC,QAAD;EAAW;EAAK,WAAU;EAA1B,UAAA;GACE,kBAAC,UAAD;IAAQ,MAAK;IAAS,WAAWzC,IAAO,mBAAmB;IAAS,OAAOJ,EAAM;IAAO,cAAYA,EAAM;IAAO,iBAAeI;IAAM,aAAaV;IAAM,eAAec,GAAS,MAAM,CAACQ,CAAC;IAAzL,UAAA,CACE,kBAACvB,GAAD,EAAM,MAAMO,EAAM,KAAO,CAAA,GACzB,kBAAC,QAAD;KAAM,WAAU;KAAe,OAAO,EAAE,YAAYA,EAAM,SAAS,cAAc;IAAI,CAAA,CAC/E;;GAER,kBAAC,SAAD;IAAO,KAAKiF;IAAW,MAAK;IAAQ,WAAU;IAAe,UAAU;IAAI,eAAA;GAAa,CAAA;GACvF7E,KACC,kBAACT,IAAD;IAAQ,aAAaD;IAArB,UAAA;KACE,kBAAC,UAAD;MAAQ,MAAK;MAAS,WAAU;MAAa,gBAAgBM,EAAM,OAAO,IAAI,GAAGQ,EAAQ,EAAK;MAC3F,UAAAR,EAAM,aAAa;KACd,CAAA;KACR,kBAAC,OAAD;MAAK,WAAU;MAAe,WAAAA,EAAM,WAAWuE,GAAA,CAAS,IAAIe,CAAM;KAAO,CAAA;KACzE,kBAAC,OAAD;MAAK,WAAU;MAAe,UAAA;KAAW,CAAA;KACzC,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACGJ,EAAO,IAAII,CAAM,GAClB,kBAAC,UAAD;OAAQ,MAAK;OAAS,WAAU;OAAY,OAAM;OAAgB,cAAW;OAAe,SAASD;OACnG,UAAA,kBAAC5F,GAAD;QAAM,MAAK;QAAO,MAAM;OAAK,CAAA;MACvB,CAAA,CACL;;IACC;;EAEN;;AAEV;AAEA,IAAa8F,KAAQ;CAAC;CAAS;CAAW;CAAW;CAAe;CAAW;CAAa;CAAY;CAAU;CAAmB;AAAS,GACjIrQ,KAAQ;CAAC;CAAG;CAAG;CAAI;CAAM;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;AAAE;AAG5F,SAAgBsQ,GAAY,GAAwC;CAClE,IAAMC,IAAOxE,KAAW,CAACsE,GAAM,SAAStE,CAAO,IAAI,CAACA,GAAS,GAAGsE,EAAK,IAAIA;CACzE,OAAOE,EAAK,KAAK,GAAG,OAAO;EAAE,OAAO7J;EAAG,OAAOA;EAAG,OAAO,EAAE,YAAY,IAAIA,EAAE,0BAA0B;EAAG,KAAK7B,MAAM,KAAK0L,MAASF;CAAM,EAAE;AAC5I;AAGA,SAAgBG,GAAS,GAAiC;CACxD,IAAI,CAACC,GAAK,OAAO;CACjB,IAAMrB,IAAI,mBAAmB,KAAKqB,CAAG;CACrC,OAAOrB,IAAIA,EAAE,KAAK;AACpB;AAEA,SAAgBsB,GAAS,GAAY,GAAc;CACjD,IAAM5H,IAAM,IAAI,gBAAgB6H,CAAI,GAC9BjL,IAAI,SAAS,cAAc,GAAG;CAMpC,AALA,EAAE,OAAOoD,GACT,EAAE,WAAWzC,GACb,SAAS,KAAK,YAAYX,CAAC,GAC3BA,EAAE,MAAM,GACRA,EAAE,OAAO,GACT,iBAAiB,IAAI,gBAAgBoD,CAAG,GAAG,GAAM;AACnD;AAGA,SAAgB8H,GAAK,GAAiN;CACpO,OAAO,kBAACvF,GAAD;EAAU,OAAOP,EAAM;EAAO,OAAOA,EAAM,MAAM,QAAQ,SAAS,EAAE;EAAG,MAAMA,EAAM;EAAM,SAASA,EAAM;EAAO,UAAUA,EAAM;CAAS,CAAA;AACjJ;AAGA,SAAgB+F,GAAI,GAA6I;CAC/J,IAAM,CAAC3F,GAAMI,KAAWvD,EAAS,EAAK,GAChCJ,IAAMC,EAAwB,IAAI;CAExC,OADAmD,EAAWpD,GAAKuD,SAAYI,EAAQ,EAAK,CAAC,GAExC,kBAAC,QAAD;EAAW;EAAK,WAAU;EAA1B,UAAA,CACE,kBAAC,UAAD;GACE,MAAK;GACL,YAAYR,EAAM,UAAUI,IAAO,mBAAmB,YAAYJ,EAAM,UAAU,gBAAgB;GAClG,OAAOA,EAAM;GACb,cAAYA,EAAM;GAClB,iBAAeI;GACf,UAAUJ,EAAM;GAChB,aAAaN;GACb,eAAec,GAAS,MAAM,CAACQ,CAAC;GARlC,UAAA,CAUE,kBAACvB,GAAD,EAAM,MAAMO,EAAM,KAAO,CAAA,GACxBA,EAAM,WAAW,kBAACP,GAAD;IAAM,MAAK;IAAU,MAAM;GAAK,CAAA,CAC5C;EACP,CAAA,GAAAW,KACC,kBAACT,IAAD;GAAQ,cAAc,MAAO,EAAE,OAAuB,QAAQ,iBAAiB,KAAK,EAAE,eAAe;GAClG,UAAAK,EAAM,eAAeQ,EAAQ,EAAK,CAAC;EAC9B,CAAA,CAEN;;AAEV;AAGA,SAAgBwF,GAAW,EAAE,aAAsD;CACjF,IAAM,CAACC,GAAOC,KAAYjJ,EAA2B,CAAC,GAAG,CAAC,CAAC;CAC3D,OACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;EAAK,WAAU;EAAc,oBAAoBiJ,EAAS,CAAC,GAAG,CAAC,CAAC;EAC7D,UAAA,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM;GACpC,IAAMpG,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,GACxB+C,IAAK,IAAI,IAAK;GACpB,OAAO,kBAAC,UAAD;IAAgB,MAAK;IAAS,WAAW/C,KAAKmG,EAAM,MAAMpD,KAAKoD,EAAM,KAAK,OAAO;IAAI,oBAAoBC,EAAS,CAACpG,GAAG+C,CAAC,CAAC;IAAG,aAAanD;IAAM,eAAe0F,EAAOtF,GAAG+C,CAAC;GAAI,GAA/J,CAA+J;EACrL,CAAC;CACE,CAAA,GACL,kBAAC,OAAD;EAAK,WAAU;EAAqB,UAAAoD,EAAM,KAAK,GAAGA,EAAM,GAAG,KAAKA,EAAM,OAAO;CAAkB,CAAA,CAC5F,EAAA,CAAA;AAET;AAuBA,SAAgBE,GAAU,IAAS,WAAW,IAAW,IAAuB;CAC9E,OAAO,IAAI,SAAS,MAAY;EAC9B,IAAMC,IAAQ,SAAS,cAAc,OAAO;EAK5C,AAJA,EAAM,OAAO,QACb,EAAM,SAASC,GACf,EAAM,WAAWC,GACjB,EAAM,iBAAiBC,EAAQ,MAAM,KAAKH,EAAM,SAAS,CAAC,CAAC,CAAC,GAC5DA,EAAM,MAAM;CACd,CAAC;AACH;;ACvvBA,IAAaI,KAAgBC,GAAyB;CACpD,KAAK;CACL,UAAU;CACV,gBAAgB,CAAC;CACjB,MAAM,YAAY,CAAC;CACnB,aAAa;CACb,QAAQ;CACR,SAAS,EAAE,SAAS,KAAK;CACzB,WAAW,EAAE,SAAS,KAAK;AAC7B,CAAC,GAEYC,WAAkBC,GAAWH,EAAa;AAGvD,SAAgBI,GAAW,GAAc;CACvC,IAAMC,IAAOH,GAAU,CAAC,CAAC;CAIzB,AAHArK,QAAgB;EACd,EAAK,UAAUyK;CACjB,CAAC,GACDzK,cACc;EACV,EAAK,UAAU;CACjB,GACA,CAACwK,CAAI,CACP;AACF;AAGA,SAAgBE,GAAa,GAAgB;CAC3C,IAAMF,IAAOH,GAAU,CAAC,CAAC;CAIzB,AAHArK,QAAgB;EACd,EAAK,UAAU2K;CACjB,CAAC,GACD3K,cACc;EACV,EAAK,UAAU;CACjB,GACA,CAACwK,CAAI,CACP;AACF;AAGA,SAAgBI,GAAU,EAAE,eAAqC;CAC/D,IAAM,EAAE,WAAQP,GAAU;CAC1B,OAAOQ,IAAMC,GAAa,kBAACpE,IAAD,EAAa,YAAqB,CAAA,GAAGmE,CAAG,IAAI;AACxE;;AC5EA,IAAaE,KAAgBX,GAAkC,IAAI;AAEnE,SAAgBY,GAAO,EAAE,SAAM,eAA8D;CAC3F,IAAMnK,IAAKyJ,GAAWS,EAAa;CAInC,OAHA/K,QAAgB;EACd,IAAWrD,CAAI;CACjB,GAAG,CAACA,GAAMsO,CAAQ,CAAC,GACZpK,IAAKiK,GAAanO,GAAMkE,CAAE,IAAI;AACvC;;ACVA,IAAMqK,KAAQ;CAAC;CAAM;CAAM;CAAK;CAAM;CAAM;CAAK;CAAG;CAAK;CAAM;CAAK;CAAM;CAAG;CAAK;AAAC;AAEnF,SAAgBC,GAAY,EAAE,SAAM,cAAW,eAA4E;CACzH,IAAMpG,KAAQ,MAAgB;EAC5B,IAAMoB,IAAMiF,GACN3N,IAAO4N,IAAM,IAAIH,GAAM,MAAM,MAAMjK,IAAIkF,IAAM,IAAK,IAAI,CAAC,GAAG+E,EAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,MAAMjK,IAAIkF,IAAM,IAAK;EAC5G,AAAI1I,KAAM6N,EAAS7N,CAAI;CACzB;CACA,OACE,kBAAC,OAAD;EAAK,WAAU;EAAU,MAAK;EAAQ,cAAW;EAAjD,UAAA;GACE,kBAAC,UAAD;IAAQ,MAAK;IAAS,cAAW;IAAW,eAAesH,EAAK,EAAE;IAAG,UAAA;GAE7D,CAAA;GACR,kBAAC,QAAD;IAAM,OAAOwG,MAAS,QAAQ,+BAA+B;IAAsB,eAAeD,EAASC,MAAS,QAAQ,IAAI,KAAK;IAClI,UAAAA,MAAS,QAAQ,QAAQ,GAAG,KAAK,MAAMH,IAAY,GAAG,EAAE;GACrD,CAAA;GACN,kBAAC,UAAD;IAAQ,MAAK;IAAS,cAAW;IAAU,eAAerG,EAAK,CAAC;IAAG,UAAA;GAE3D,CAAA;EACL;;AAET;;ACNA,SAAgByG,GAAY,EAAE,MAAG,MAAG,UAAO,cAA6E;CACtH,IAAMhL,IAAMC,EAAuB,IAAI,GACjC,CAACjE,GAAK4E,KAAUR,EAAS;EAAE,MAAMN;EAAG,KAAKmL;CAAE,CAAC,GAC5C,CAACrJ,GAAIgC,KAASxD,EAAS,EAAE,GACzBkD,IAAQrD,EAAOiL,CAAO;CAqD5B,OApDA,EAAM,UAAUA,GAGhBzL,QAAsB;EACpB,IAAMY,IAAKL,EAAI;EACf,IAAI,CAACK,GAAI;EACT,IAAM,IAAIA,EAAG,sBAAsB,GAC7B6C,IAAK,SAAS,gBAAgB,aAC9BiI,IAAK,SAAS,gBAAgB;EACpC,EAAO;GACL,MAAMrL,IAAI,EAAE,QAAQoD,IAAK,IAAI,KAAK,IAAI,GAAGpD,IAAI,EAAE,KAAK,IAAIA;GACxD,KAAKmL,IAAI,EAAE,SAASE,IAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAIF,IAAI,EAAE,QAAQE,IAAK,EAAE,SAAS,CAAC,CAAC,IAAIF;EACxF,CAAC;CACH,GAAG,CAACnL,GAAGmL,CAAC,CAAC,GAETzL,QAAgB;EACd,IAAM4L,KAAQ,MAAkB;GAC9B,AAAIpL,EAAI,WAAW,CAAC,EAAE,aAAa,CAAC,CAAC,SAASA,EAAI,OAAO,KAAGsD,EAAM,QAAQ;EAC5E,GACM+H,KAAO,MAAqB;GAChC,IAAM1L,IAAIwG,EAAM,QACV5B,KAAQ,GAAc,MAAc;IACxC,IAAI,IAAIC;IACR,KAAK,IAAIC,IAAI,GAAGA,IAAI9E,GAAG,KAErB,IADA,KAAK,IAAI+E,IAAI/E,KAAKA,GACd,CAACwG,EAAM,EAAE,CAAC,UAAU,OAAO;IAEjC,OAAO3B;GACT;GACA,IAAI,EAAE,QAAQ,UAAU,EAAM,QAAQ;QACjC,IAAI,EAAE,QAAQ,aAAa,GAAO,MAAMD,EAAK/D,GAAG,CAAC,CAAC;QAClD,IAAI,EAAE,QAAQ,WAAW,GAAO,MAAM+D,EAAK/D,IAAI,IAAI,IAAIA,GAAG,EAAE,CAAC;QAC7D,IAAI,EAAE,QAAQ,WAAWoB,KAAM,KAAK,CAACuE,EAAMvE,EAAG,CAAC,UAElD,AADA0B,EAAM,QAAQ,GACd6C,EAAMvE,EAAG,CAAC,IAAI;QACT;GAEP,AADA,EAAE,eAAe,GACjB,EAAE,gBAAgB;EACpB,GACM0J,UAAahI,EAAM,QAAQ;EAKjC,OAJA,OAAO,iBAAiB,aAAa8H,GAAM,EAAI,GAC/C,OAAO,iBAAiB,WAAWC,GAAK,EAAI,GAC5C,OAAO,iBAAiB,QAAQC,CAAI,GACpC,OAAO,iBAAiB,UAAUA,CAAI,SACzB;GAIX,AAHA,OAAO,oBAAoB,aAAaF,GAAM,EAAI,GAClD,OAAO,oBAAoB,WAAWC,GAAK,EAAI,GAC/C,OAAO,oBAAoB,QAAQC,CAAI,GACvC,OAAO,oBAAoB,UAAUA,CAAI;EAC3C;CACF,GAAG,CAACnF,GAAOvE,CAAE,CAAC,GAGZ,kBAAC,OAAD;EAAU;EAAK,WAAU;EAAS,OAAO5F;EAAK,MAAK;EAAO,cAAc,MAAM,EAAE,eAAe;EAAG,gBAAgB,MAAM,EAAE,eAAe;EACtI,UAAAmK,EAAM,KAAK,GAAI,MACd,kBAAC,OAAD;GAAa,WAAU;GAAvB,UAAA;IACGoF,EAAG,OAAOrO,IAAI,KAAK,kBAAC,OAAD;KAAK,WAAU;KAAa,MAAK;IAAa,CAAA;IACjEqO,EAAG,QAAQ,kBAAC,OAAD;KAAK,WAAU;KAAe,UAAAA,EAAG;IAAU,CAAA;IACvD,kBAAC,UAAD;KACE,MAAK;KACL,MAAK;KACL,WAAWrO,MAAM0E,IAAK,cAAc,KAAA;KACpC,UAAU2J,EAAG;KACb,oBAAoB3H,EAAM1G,CAAC;KAC3B,eAAe;MAEb,AADAoG,EAAM,QAAQ,GACdiI,EAAG,IAAI;KACT;KATF,UAAA;MAWE,kBAAC,QAAD;OAAM,WAAU;OAAe,UAAAA,EAAG,QAAQ,kBAAC3I,GAAD;QAAM,MAAM2I,EAAG;QAAM,MAAM;OAAK,CAAA;MAAQ,CAAA;MAClF,kBAAC,QAAD;OAAM,WAAU;OAAgB,UAAAA,EAAG;MAAY,CAAA;MAC9CA,EAAG,QAAQ,kBAAC,QAAD;OAAM,WAAU;OAAe,UAAAA,EAAG;MAAW,CAAA;KACnD;;GACL;EAlBK,GAAArO,CAkBL,CACN;CACE,CAAA;AAET;AAGA,IAAasO,IAAM,OAAO,YAAc,OAAe,kBAAkB,KAAK,UAAU,QAAQ,IAAI,MAAM;;ACrF1G,SAAgBC,GAAa,EAAE,SAAM,cAAsD;CACzF,IAAM,CAACzJ,GAAG0J,KAAQtL,EAASuL,EAAK,WAAW,EAAE,GACvC3L,IAAMC,EAA+C,IAAI;CAC/D,QAAgB;EACd,IAAMI,IAAKL,EAAI;EAEf,AADAK,GAAI,MAAM,GACVA,GAAI,OAAO;CACb,GAAG,CAAC,CAAC;CACL,IAAMoF,UAAa;EAEjB,AADAyF,EAAQ,GACRS,EAAK,KAAK3J,CAAC;CACb;CACA,OACE,kBAAC,OAAD;EACE,WAAU;EACV,cAAc,MAAM,EAAE,WAAW,EAAE,iBAAiBkJ,EAAQ;EAC5D,YAAY,MAAM;GAChB,AAAI,EAAE,QAAQ,aACZ,EAAE,gBAAgB,GAClBA,EAAQ;EAEZ;EAEA,UAAA,kBAAC,QAAD;GACE,WAAU;GACV,MAAK;GACL,cAAYS,EAAK;GACjB,WAAW,MAAM;IAEf,AADA,EAAE,eAAe,GACjBlG,EAAK;GACP;GAPF,UAAA;IASE,kBAAC,OAAD;KAAK,WAAU;KAAmB,UAAAkG,EAAK;IAAW,CAAA;IACjDA,EAAK,SAAS,kBAAC,SAAD;KAAO,WAAU;KAAmB,UAAAA,EAAK;IAAa,CAAA;IACpEA,EAAK,OACJ,kBAAC,YAAD;KAAe;KAAK,MAAM;KAAG,OAAO3J;KAAG,aAAa2J,EAAK;KAAa,WAAW,MAAMD,EAAK,EAAE,OAAO,KAAK;IAAI,CAAA,IAE9G,kBAAC,SAAD;KAAY;KAAK,OAAO1J;KAAG,aAAa2J,EAAK;KAAa,WAAW,MAAMD,EAAK,EAAE,OAAO,KAAK;IAAI,CAAA;IAEnGC,EAAK,QAAQ,kBAAC,OAAD;KAAK,WAAU;KAAkB,UAAAA,EAAK;IAAU,CAAA;IAC9D,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACGA,EAAK,SACJ,kBAAC,UAAD;OACE,MAAK;OACL,WAAU;OACV,eAAe;QAEb,AADAT,EAAQ,GACRS,EAAK,MAAO,IAAI;OAClB;OAEC,UAAAA,EAAK,MAAM;MACN,CAAA;MAEV,kBAAC,UAAD;OAAQ,MAAK;OAAS,WAAU;OAAS,SAAST;OAAS,UAAA;MAEnD,CAAA;MACR,kBAAC,UAAD;OAAQ,MAAK;OAAS,WAAU;OAC7B,UAAAS,EAAK,MAAM;MACN,CAAA;KACL;;GACD;;CACH,CAAA;AAET;AAGA,SAAgBC,GAAc,GAAiG;CAC7H,IAAMC,IAAQ5L,EAA0B,IAAI;CAE5C,OADAT,QAAgBqM,EAAM,SAAS,MAAM,GAAG,CAAC,CAAC,GAExC,kBAAC,OAAD;EACE,WAAU;EACV,cAAc,MAAM9P,EAAE,WAAWA,EAAE,iBAAiBoH,EAAM,QAAQ;EAClE,YAAY,MAAM;GAChB,AAAIpH,EAAE,QAAQ,aACZA,EAAE,gBAAgB,GAClBoH,EAAM,QAAQ;EAElB;EAEA,UAAA,kBAAC,OAAD;GAAK,WAAU;GAAY,MAAK;GAAc,cAAYA,EAAM;GAAhE,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;KAAmB,UAAAA,EAAM;IAAW,CAAA;IACnD,kBAAC,OAAD;KAAK,WAAU;KAAkB,UAAAA,EAAM;IAAa,CAAA;IACpD,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAAC,UAAD;MAAQ,MAAK;MAAS,WAAU;MAAS,SAASA,EAAM;MAAS,UAAA;KAEzD,CAAA,GACR,kBAAC,UAAD;MACE,KAAK0I;MACL,MAAK;MACL,WAAU;MACV,eAAe;OAEb,AADA1I,EAAM,QAAQ,GACdA,EAAM,KAAK;MACb;MAEC,UAAAA,EAAM;KACD,CAAA,CACL;;GACF;;CACF,CAAA;AAET;AAGA,SAAgB2I,GAAM,EAAE,SAAM,aAAgD;CAK5E,OAJAtM,QAAgB;EACd,IAAMuM,IAAK,WAAWC,GAAQ,IAAI;EAClC,aAAa,aAAaD,CAAE;CAC9B,GAAG,CAAC5P,GAAM6P,CAAM,CAAC,GAEf,kBAAC,OAAD;EAAK,WAAU;EAAW,MAAK;EAC5B,UAAA7P;CACE,CAAA;AAET;;AClIA,SAAgB8P,GAAW,GAAoB;CAC7C,QAAQnM,EAAE,GAAV;EACE,KAAK,QACH,OAAO;GAAE,MAAMA,EAAE;GAAM,KAAKA,EAAE;GAAK,KAAKA,EAAE,KAAK,OAAO,KAAKA,EAAE,CAAC,CAAC,CAAC,SAASA,EAAE,IAAI,KAAA;GAAW,IAAIA,EAAE;EAAG;EACrG,KAAK,SACH,OAAO;GAAE,KAAK;GAAS,MAAMA,EAAE;EAAK;EACtC,KAAK,OAEH,OADIA,EAAE,MAAY;GAAE,KAAK;GAAQ,KAAKA,EAAE;GAAK,MAAMA,EAAE,UAAU,CAACA,EAAE,GAAGA,EAAE,CAAC,IAAI,KAAA;GAAW,KAAKA,EAAE,SAAUA,EAAE,OAAO,KAAM,KAAA;GAAW,KAAKA,EAAE,OAAOA,EAAE,MAAM,KAAA;EAAU,IAC3JA,EAAE,MAAM;GAAE,KAAK;GAAS,KAAKA,EAAE;GAAK,GAAGA,EAAE;GAAG,GAAGA,EAAE;GAAG,KAAKA,EAAE;EAAI,IAAI,EAAE,MAAM,GAAG;EACvF,SACE,OAAOA,EAAE,MAAM;GAAE,KAAK;GAAQ,KAAKA,EAAE;EAAI,IAAI,EAAE,MAAM,GAAG;CAC5D;AACF;AAGA,SAAgBoM,GAAS,GAA8B;CACrD,IAAMC,IAAKxN,EAAM;CACjB,OAAO;EACL,KAAKwN,EAAG;EACR,MAAMA,EAAG,QAAQA,EAAG;EACpB,MAAMA,EAAG;EACT,IAAIA,EAAG;EACP,UAAUA,EAAG;EACb,UAAU,CAACxN,EAAM,MAAM,MAAMqC,EAAE,MAAM,MAAMmL,EAAG,SAAS,KAAA,KAAaA,EAAG,SAASA,EAAG;EACnF,OAAOxN,EAAM,KAAK,MAAMqC,EAAE,KAAK,IAAIiL,EAAU,CAAC;CAChD;AACF;;ACjBA,IAAM3T,qBAAQ,IAAI,IAAI;CAAC;CAAK;CAAO;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAc;CAAO;CAAW;CAAW;CAAU;CAAU;CAAM;CAAM;CAAS;CAAS;CAAS;CAAM;CAAM;CAAM;AAAQ,CAAC,GAC9M+T,qBAAO,IAAI,IAAI;CAAC;CAAU;CAAS;CAAQ;CAAS;CAAQ;CAAQ;CAAY;AAAU,CAAC;AAEjG,SAASC,GAAI,GAAsD;CACjE,IAAI,CAACC,GAAO;CACZ,IAAMvG,IAAIuG,EAAM,KAAK,CAAC,CAAC,YAAY;CACnC,IAAI,iBAAiB,KAAKvG,CAAC,GAAG,OAAOA;CACrC,IAAI,iBAAiB,KAAKA,CAAC,GAAG,OAAO,MAAM,CAAC,GAAGA,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,MAAMlG,IAAIA,CAAC,CAAC,CAAC,KAAK,EAAE;CACpF,IAAM2H,IAAI,qDAAqD,KAAKzB,CAAC;CACrE,IAAIyB,GAEF,OADIA,EAAE,OAAO,KAAA,KAAa,OAAOA,EAAE,EAAE,MAAM,IAAG,SACvC,MAAM;EAACA,EAAE;EAAIA,EAAE;EAAIA,EAAE;CAAE,CAAC,CAAC,KAAK,MAAM,OAAOzF,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;AAG/F;AAEA,SAASwK,GAAO,GAA+B;CAC7C,IAAM/E,IAAI,4BAA4B,KAAKzF,EAAE,KAAK,CAAC;CACnD,IAAI,CAACyF,GAAG;CACR,IAAM,IAAI,OAAOA,EAAE,EAAE;CACrB,OAAOA,EAAE,OAAO,OAAO,IAAI,MAAOA,EAAE,OAAO,QAAQA,EAAE,OAAO,QAAQ,IAAI,KAAK;AAC/E;AAEA,SAASlP,GAAQ,GAAiB,GAAgB;CAChD,IAAMkI,IAAS,EAAE,GAAG8E,EAAK;CACzB,QAAQlF,EAAG,SAAX;EACE,KAAK;EACL,KAAK;GACH,EAAE,IAAI;GACN;EACF,KAAK;EACL,KAAK;GACH,EAAE,IAAI;GACN;EACF,KAAK;EACL,KAAK;GACH,EAAE,IAAI;GACN;EACF,KAAK;EACL,KAAK;EACL,KAAK;GACH,EAAE,SAAS;GACX;EACF,KAAK;GACH,EAAE,KAAK;GACP;EACF,KAAK;GACH,EAAE,KAAK;GACP;EACF,KAAK;GACH,AAAKA,EAAyB,QAAQ,CAAEA,EAAyB,KAAK,WAAW,aAAa,MAC5F,EAAE,OAAOA,EAAG,aAAa,MAAM,KAAK,KAAA,GACpC,EAAE,IAAI,UACN,EAAE,QAAQ;GAEZ;EACF,KAAK,QAAQ;GACX,IAAM2F,IAAIsG,GAAIjM,EAAG,aAAa,OAAO,CAAC;GACtC,AAAI2F,MAAG,EAAE,QAAQA;GACjB,IAAMjH,IAAIsB,EAAG,aAAa,MAAM;GAChC,AAAItB,MAAG,EAAE,WAAWA,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC,KAAK;GAC9D;EACF;EACA,KAAK;EACL,KAAK,OACH,EAAE,WAAW;CAEjB;CACA,IAAM2N,IAAKrM,EAAG;CAEd,AADIqM,EAAG,eAAY,EAAE,IAAIA,EAAG,eAAe,UAAUA,EAAG,eAAe,YAAY,OAAOA,EAAG,UAAU,KAAK,MACxGA,EAAG,cAAW,EAAE,IAAIA,EAAG,cAAc,YAAYA,EAAG,cAAc;CACtE,IAAMC,IAAO,GAAGD,EAAG,eAAe,GAAGA,EAAG;CAGxC,AAFIC,EAAK,SAAS,WAAW,MAAG,EAAE,IAAI,WAClCA,EAAK,SAAS,cAAc,MAAG,EAAE,SAAS,KAC1CD,EAAG,mBAAmB,UAAUrM,EAAG,YAAY,QAAK,EAAE,IAAI,KAAA;CAC9D,IAAM2F,IAAIsG,GAAII,EAAG,KAAK;CACtB,AAAI1G,MAAG,EAAE,QAAQA;CACjB,IAAM4G,IAAKN,GAAII,EAAG,eAAe;CAEjC,IADIE,KAAMA,MAAO,cAAW,EAAE,KAAKA,IAC/BF,EAAG,UAAU;EACf,IAAMG,IAAKL,GAAOE,EAAG,QAAQ;EAC7B,AAAIG,KAAMA,KAAM,KAAKA,KAAM,QAAK,EAAE,KAAK,KAAK,MAAMA,IAAK,CAAC,IAAI;CAC9D;CAIA,OAHIH,EAAG,eAAY,EAAE,WAAWA,EAAG,WAAW,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC,KAAK,IAClFA,EAAG,kBAAkB,UAAS,EAAE,KAAK,QAChCA,EAAG,kBAAkB,UAAO,EAAE,KAAK,QACrCjM;AACT;AAEA,SAASqM,GAAM,GAAc,GAAgB;CAC3C,IAAM,EAAE,SAAM,aAAU,GAAGvF,MAASvB,GAC9BvF,IAAc,EAAE,GAAG8G,EAAK;CAC9B,AAAIsB,MAAU,EAAE,OAAOtO,EAAQsO,CAAQ;CACvC,IAAMnE,IAAY,CAAC;CAUnB,OATIsB,EAAE,MAAM,KAAA,MAAW,EAAE,IAAIA,EAAE,IAC3BA,EAAE,MAAM,KAAA,MAAW,EAAE,IAAIA,EAAE,IAC3BA,EAAE,MAAG,EAAE,IAAIA,EAAE,IACbA,EAAE,WAAQ,EAAE,SAAS,KACrBA,EAAE,UAAO,EAAE,QAAQA,EAAE,QACrBA,EAAE,OAAI,EAAE,KAAKA,EAAE,KACf6C,MAAU,EAAE,OAAOA,IACnB7C,EAAE,OAAI,EAAE,KAAKA,EAAE,KACfA,EAAE,OAAI,EAAE,KAAKA,EAAE,KACZ;EAAE,GAAG;EAAQ;EAAM;EAAG,GAAG,OAAO,KAAKtB,CAAC,CAAC,CAAC,SAASA,IAAI,KAAA;EAAW;CAAK;AAC9E;AAGA,SAAgBqI,GAAY,GAA4B;CACtD,IAAM1K,IAAM,IAAI,UAAU,CAAC,CAAC,gBAAgB2K,GAAM,WAAW,GACvDzQ,IAAoB,CAAC,GACvBoJ,IAAyB,MACvBsH,KAAQ,IAA6B,CAAC,OAC1C,IAAM;EAAE,MAAM,CAAC;EAAG,GAAG9J;CAAM,GAC3B5G,EAAI,KAAKoJ,CAAG,GACLA,IAEHuH,KAAQ,GAAY,GAAQ,GAAuC,MAAiB;EACxF,KAAK,IAAMC,KAAS,MAAM,KAAKC,EAAK,UAAU,GAAG;GAC/C,IAAID,EAAM,aAAa,GAAG;IACxB,IAAIhR,IAAOgR,EAAM,eAAe;IAEhC,IADK1P,MAAK,IAAOtB,EAAK,QAAQ,YAAY,MAAOsL,EAAE,SAAS,MAAG,KAAKA,EAAE,WAAW,IAAI,SAAM,GAAI,IAC3F,CAACtL,KAAS,CAACsB,KAAO,CAACkI,KAAO,CAACxJ,EAAK,KAAK,GAAI;IAC5C,CAACwJ,KAAOsH,EAAK,EAAA,CAAG,KAAK,KAAKH,GAAM3Q,GAAM6J,CAAC,CAAC;IACzC;GACF;GACA,IAAImH,EAAM,aAAa,GAAG;GAC1B,IAAM9M,IAAK8M;GACX,IAAId,GAAK,IAAIhM,EAAG,OAAO,GAAG;GAC1B,IAAIA,EAAG,YAAY,MAAM;IACtB,CAACsF,KAAOsH,EAAK,EAAA,CAAG,KAAK,KAAKH,GAAM,MAAM9G,CAAC,CAAC;IACzC;GACF;GACA,IAAI3F,EAAG,YAAY,QAAQA,EAAG,YAAY,MAAM;IAE9C,AADIsF,KAAQA,EAAmB,KAAK,UAAQA,EAAoB,KAAK,KAAKmH,GAAM,KAAM9G,CAAC,CAAC,GACxFkH,EAAK7M,GAAI9H,GAAQ8H,GAAI2F,CAAC,GAAG4C,GAAMnL,CAAG;IAClC;GACF;GACA,IAAMiP,IAAKnU,GAAQ8H,GAAI2F,CAAC;GACxB,IAAI1N,GAAM,IAAI+H,EAAG,OAAO,GAAG;IACzB,IAAMgN,IAAWhN,EAAG,YAAY,OAAO,WAAWA,EAAG,YAAY,OAAO,WAAWuI;IACnF,IAAIvI,EAAG,YAAY,QAAQA,EAAG,YAAY,QAAQA,EAAG,YAAY,WAAWA,EAAG,YAAY,WAAWA,EAAG,YAAY,SAAS;KAC5H,IAAMG,IAAI,aAAa,KAAKH,EAAG,OAAO;KACtC,EAAK;MAAE,SAASG,IAAI,OAAOA,EAAE,EAAE,IAAI,KAAA;MAAW,MAAMH,EAAG,YAAY,OAAOgN,KAAY,WAAW,KAAA;KAAU,CAAC;IAC9G;IAEA,AADAH,EAAK7M,GAAIqM,GAAIW,GAAU5P,KAAO4C,EAAG,YAAY,KAAK,GAClD,IAAM;GAER,OACA,EAAKA,GAAIqM,GAAI9D,GAAMnL,CAAG;EACxB;CACF;CACA,EAAK4E,EAAI,MAAM,CAAC,GAAG,KAAA,GAAW,EAAK;CAEnC,KAAK,IAAMrB,KAAKzE,GAAK;EACnB,IAAM+Q,IAAQtM,EAAE,KAAK;EACrB,AAAIsM,GAAO,MAAM,WAAQ,EAAM,OAAOA,EAAM,KAAK,QAAQ,OAAO,EAAE;EAClE,IAAMC,IAAOvM,EAAE,KAAKA,EAAE,KAAK,SAAS;EAEpC,AADIuM,GAAM,MAAM,WAAQ,EAAK,OAAOA,EAAK,KAAK,QAAQ,OAAO,EAAE,IAC/D,EAAE,OAAOvM,EAAE,KAAK,QAAQ,MAAMiC,EAAE,MAAM,UAAUA,EAAE,IAAI;CACxD;CACA,OAAO1G,EAAI,UAAU,CAACA,EAAI,EAAE,CAAC,KAAK,SAAQ,EAAI,MAAM;CACpD,OAAOA,EAAI,UAAU,CAACA,EAAIA,EAAI,SAAS,EAAE,CAAC,KAAK,SAAQ,EAAI,IAAI;CAC/D,OAAOA;AACT;;ACpKA,SAAgBiR,GAAO,GAAqG;CAC1H,IAAMC,IAAmB,CAAC,GACpBC,IAAoB,CAAC;CAY3B,OAXAhR,EAAE,KAAK,SAAS,GAAK,MAAO;EAC1B,IAAIiR,IAAI;EACR,EAAI,MAAM,SAAS,GAAM,MAAO;GAC9B,OAAOF,EAAIG,EAAG,GAAGD,KAAI;GACrB,KAAK,IAAI1K,IAAI2K,GAAI3K,IAAI2K,IAAK,KAAK,IAAI,GAAGC,EAAK,OAAO,GAAG,KAAK,KAAK,IAAIpJ,IAAIkJ,GAAGlJ,IAAIkJ,IAAI,KAAK,IAAI,GAAGE,EAAK,OAAO,GAAG,KAAK,CAAC,EAAI5K,OAAO,CAAC,EAAA,CAAGwB,KAAK;GAEvI,AADAiJ,EAAM,KAAK;IAAE;IAAI;IAAI;IAAG;GAAK,CAAC,GAC9B,KAAK,KAAK,IAAI,GAAGG,EAAK,OAAO;EAC/B,CAAC;CACH,CAAC,GAGM;EAAE;EAAO,OAFF,KAAK,IAAInR,EAAE,KAAK,QAAQ,GAAGgR,EAAM,KAAK,MAAM1H,EAAE,IAAIA,EAAE,KAAK,OAAO,CAE9D;EAAO,KADX,GAAY,MAAc0H,EAAM,MAAM,MAAME,KAAM5H,EAAE,MAAM4H,IAAK5H,EAAE,KAAKA,EAAE,KAAK,WAAW2H,KAAK3H,EAAE,KAAK2H,IAAI3H,EAAE,IAAIA,EAAE,KAAK,OAAO;CAC9G;AAC5B;AAIA,SAAS8H,GAAU,GAAgB,GAAa,IAAU,GAAc;CACtE,OAAO;EAAE,GAAGC;EAAK,QAAQ,CAACC,EAAGD,CAAG,CAAC;EAAG;EAAS,SAAS;CAAE;AAC1D;AAEA,SAASE,GAAU,GAAgB,GAAyB;CAC1D,IAAMC,IAAMC,EAAK,QAAQ,GAAG,MAAMpQ,IAAIiJ,GAAG,CAAC,KAAK;CAC/C,OAAOmH,EAAK,KAAK,MAAM,EAAG5N,IAAIwG,IAASmH,EAAA,CAAK,QAAQ,CAAC,CAAC;AACxD;AAEA,SAAgBE,GAAU,GAAU,GAAY,GAAgB,GAAoB;CAClF,IAAM,EAAE,UAAO,UAAO,UAAOZ,GAAO9Q,CAAC,GAC/BwF,IAASmM,IAAQT,IAAK,IAAIA,GAC1BU,IAAO5R,EAAE,KAAK,KAAK,OAAO;EAAE,GAAGuG;EAAG,OAAO,CAAC,GAAGA,EAAE,KAAK;CAAE,EAAE,GACxDsL,IAAwB,CAAC;CAC/B,KAAK,IAAIZ,IAAI,GAAGA,IAAIa,IAAS;EAC3B,IAAMC,IAAQtQ,EAAWyP,GAASD,CAAC;EACnC,IAAI,CAACc,GACH;OAIF;OADkBA,EAAM,KAAKvM,KAAUuM,EAAM,KAAKA,EAAM,KAAK,UAAUvM,GACxD;IACb,IAAMe,IAAIqL,EAAKG,EAAM;IACrB,EAAE,MAAMA,EAAM,MAAM;KAAE,GAAGxL,EAAE,MAAMwL,EAAM;KAAK,SAASxL,EAAE,MAAMwL,EAAM,GAAG,CAAC,UAAU;IAAE;GACrF,OAAO,EAAS,KAAKX,GAAUW,EAAM,MAAMT,GAAIS,EAAM,KAAK,OAAO,CAAC;GAClE,KAAKA,EAAM,KAAK;EADkD;CAEpE;CAGA,IAAMC,IAAgB;EAAE,GADThS,EAAE,KAAKkR;EACa,OAAOW;CAAS;CAEnD,OADAD,EAAK,OAAOpM,GAAQ,GAAGwM,CAAG,GACnB;EAAE,GAAGhS;EAAG;CAAK;AACtB;AAEA,SAAgBiS,GAAU,GAAU,GAA0B;CAC5D,IAAIjS,EAAE,KAAK,UAAU,GAAG,OAAO;CAC/B,IAAM,EAAE,aAAU8Q,GAAO9Q,CAAC,GACpB4R,IAAO5R,EAAE,KAAK,KAAK,OAAO;EAAE,GAAGuG;EAAG,OAAO,CAAC,GAAGA,EAAE,KAAK;CAAE,EAAE;CAC9D,KAAK,IAAM+C,KAAK0H,GACd,AAAI1H,EAAE,KAAK4H,KAAM5H,EAAE,KAAKA,EAAE,KAAK,UAAU4H,MAAI,EAAK5H,EAAE,GAAG,CAAC,MAAMA,EAAE,MAAM;EAAE,GAAGsI,EAAKtI,EAAE,GAAG,CAAC,MAAMA,EAAE;EAAK,SAASA,EAAE,KAAK,UAAU;CAAE;CAGjI,OADAsI,EAAK,OAAOV,GAAI,CAAC,GACV;EAAE,GAAGlR;EAAG;CAAK;AACtB;AAEA,SAAgBkS,GAAU,GAAU,GAAY,GAAgB,GAAoB;CAClF,IAAM,EAAE,UAAO,aAAUpB,GAAO9Q,CAAC,GAC3BiR,IAAIkB,IAAQC,IAAK,IAAIA,GACrBR,IAAO5R,EAAE,KAAK,KAAK,OAAO;EAAE,GAAGuG;EAAG,OAAO,CAAC,GAAGA,EAAE,KAAK;CAAE,EAAE,GACxD8D,IAAQrK,EAAE,KAAK,QAAQ,GAAG,MAAMqB,IAAIiJ,GAAG,CAAC;CAC9C,EAAE,KAAK,SAAS,GAAG,MAAO;EACxB,IAAM+H,IAAWrB,EAAM,QAAQ,MAAM1H,EAAE,OAAO4H,CAAE,GAC1CoB,IAAWtB,EAAM,MAAM,MAAM1H,EAAE,MAAM4H,KAAMA,IAAK5H,EAAE,KAAKA,EAAE,KAAK,WAAWA,EAAE,IAAI2H,KAAK3H,EAAE,IAAIA,EAAE,KAAK,UAAU2H,CAAC;EAClH,IAAIqB,GAAU;GACZ,AAAIA,EAAS,OAAOpB,MAAI,EAAKA,EAAG,CAAC,MAAMoB,EAAS,MAAM;IAAE,GAAGV,EAAKV,EAAG,CAAC,MAAMoB,EAAS;IAAK,SAASA,EAAS,KAAK,UAAU;GAAE;GAC3H;EACF;EAEA,IADgBtB,EAAM,MAAM,MAAM1H,EAAE,KAAK4H,KAAMA,IAAK5H,EAAE,KAAKA,EAAE,KAAK,WAAWA,EAAE,IAAIA,EAAE,KAAK,YAAY2H,CAClG,KAAW,CAACoB,EAAS,QAAQ;EACjC,IAAME,IAASF,EAAS,QAAQ,MAAM/I,EAAE,IAAI2H,CAAC,CAAC,CAAC,QACzCI,IAAMgB,EAAS,KAAK,IAAI,GAAGE,IAAS,CAAC,EAAE,EAAE,QAAQF,EAAS,EAAE,EAAE;EACpE,AAAIhB,KAAKO,EAAKV,EAAG,CAAC,MAAM,OAAOqB,GAAQ,GAAGnB,GAAUC,GAAKC,CAAE,CAAC;CAC9D,CAAC;CACD,IAAMG,IAAO,CAAC,GAAIzR,EAAE,KAAK,SAASA,EAAE,OAAW,MAAM8R,CAAK,CAAC,CAAC,KAAKzH,IAAQ,KAAK,IAAI,GAAGyH,CAAK,CAAC,CAAE;CAE7F,OADAL,EAAK,OAAOR,GAAG,GAAGQ,EAAK,KAAK,IAAIW,GAAIX,EAAK,SAAS,CAAC,MAAM,EAAE,GACpD;EAAE,GAAGzR;EAAG;EAAM,MAAMqK,IAAQkH,GAAUE,GAAMpH,CAAK,IAAIoH;CAAK;AACnE;AAEA,SAAgBe,GAAU,GAAU,GAAyB;CAC3D,IAAM,EAAE,UAAO,aAAU1B,GAAO9Q,CAAC;CACjC,IAAI8R,KAAS,GAAG,OAAO;CACvB,IAAMF,IAAO5R,EAAE,KAAK,KAAK,OAAO;EAAE,GAAGuG;EAAG,OAAO,CAAC,GAAGA,EAAE,KAAK;CAAE,EAAE,GACxDkM,oBAAS,IAAI,IAAY;CAC/B,KAAK,IAAMnJ,KAAK0H,GACd,AAAIC,IAAI3H,EAAE,KAAK2H,KAAK3H,EAAE,IAAIA,EAAE,KAAK,YAC7BA,EAAE,KAAK,UAAU,IAAG,EAAKA,EAAE,GAAG,CAAC,MAAMA,EAAE,MAAM;EAAE,GAAGsI,EAAKtI,EAAE,GAAG,CAAC,MAAMA,EAAE;EAAK,SAASA,EAAE,KAAK,UAAU;CAAE,IACrGmJ,EAAO,IAAI,GAAGnJ,EAAE,GAAG,GAAGA,EAAE,IAAI;CAEnC,EAAK,SAAS,GAAG,MAAQ,EAAE,QAAQ/C,EAAE,MAAM,QAAQ,GAAG,MAAO,CAACkM,EAAO,IAAI,GAAGvB,EAAG,GAAGwB,GAAI,CAAC,CAAE;CACzF,IAAMrI,IAAQrK,EAAE,KAAK,QAAQ,GAAG,MAAMqB,IAAIiJ,GAAG,CAAC,GACxCmH,IAAO,CAAC,GAAGzR,EAAE,IAAI;CAEvB,OADAyR,EAAK,OAAOR,GAAG,CAAC,GACT;EAAE,GAAGjR;EAAG,MAAM4R,EAAK,QAAQ,MAAMrL,EAAE,MAAM,MAAM;EAAG,MAAM8D,KAASoH,EAAK,SAASF,GAAUE,GAAMpH,CAAK,IAAIoH;CAAK;AACtH;AAGA,SAAgBkB,GAAS,GAAe,GAAe,GAAe,GAA4B;CAChG,IAAMC,IAAS,uBACT/O,IAAI,EAAEgP,IAAQC,EAAA,CAAO,QAAQ,CAAC;CACpC,OAAO;EACL,GAAG;EACH,MAAU,MAAMA,CAAK,CAAC,CAAC,KAAKjP,CAAC;EAC7B,MAAM,MAAM,KAAK,EAAE,QAAQkP,EAAM,UAAU,EACzC,OAAO,MAAM,KAAK,EAAE,QAAQD,EAAM,UAAU;GAAE,QAAQ,CAACxB,EAAG,CAAC;GAAG,SAAS;GAAG,SAAS;GAAG,SAAS;IAAE,GAAGsB;IAAQ,GAAGA;IAAQ,GAAGA;IAAQ,GAAGA;GAAO;GAAG,KAAK;IAAC;IAAG;IAAK;IAAG;GAAG;EAAsC,EAAE,EAC7M,EAAE;CACJ;AACF;;ACrEA,IAAMjO,MAAQ,MAAeqO,EAAG,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;AAGrD,SAASC,GAAQ,GAAU,GAAc,GAAiB;CACxD,IAAInL,MAASoL,GAAI,OAAO3L;CACxB,IAAM4G,KAAO,MAAe6E,EAAG,QAAQ,WAAW,EAAE,GAC9ChL,IAAI,OAAOkL,EAAG,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,OAAOpL,EAAK,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,GAC9DqL,KAAM,MAAiBhF,EAAI7J,EAAE,EAAE,MAAM6J,EAAIrG,CAAI,IAAI;EAAE,GAAGxD;EAAG,IAAI6J,EAAI+E,CAAE,IAAI,GAAG/E,EAAI+E,CAAE,EAAE,GAAG,OAAO5O,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI0D,MAAM,OAAO,OAAO1D,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI0D,CAAC;CAAE,IAAI1D;CAC/K,OAAO;EAAE,GAAG6O,EAAG5L,EAAI,CAAC;EAAG,GAAG4L,EAAG5L,EAAI,CAAC;CAAE;AACtC;AAKA,IAAa6L,KAAb,MAAuD;CAwB3C;CACA;CACA;CAzBV;CACA,aAAyB;CACzB,SAAsB,CAAC;CACvB,UAA2B,CAAC;CAC5B,SAA0B,CAAC;CAC3B,OAA0F;CAE1F,UAAU;CACV,WAAmB;CACnB;CAEA;CAEA;CACA;CACA;CAEA,UAAyB;CACzB;CAEA;CAEA,YACE,GACA,GACA,GACA;EACA,AAJQ,KAAA,SAAAtO,GACA,KAAA,KAAAkL,GACA,KAAA,UAAAqD,GAER,KAAK,QAAQ,IAAI/U,EAAU,IAAI;CACjC;CAIA,UAAkB,GAAwF;EACxG,IAAMgG,IAAIK,GAAKqO,CAAE;EACjB,IAAI1O,EAAE,WAAW,GAAG,OAAO;GAAE,MAAM,KAAK,GAAG;GAAQ,IAAIA,EAAE;EAAG;EAC5D,IAAMtE,IAAI,KAAK,GAAG,OAAOsE,EAAE;EAC3B,IAAItE,GAAG,MAAM,OAAO;EACpB,IAAMmR,IAAOnR,EAAE,KAAKsE,EAAE,GAAG,EAAE,MAAMA,EAAE;EACnC,OAAO6M,IAAO;GAAE,MAAMA,EAAK;GAAQ,IAAI7M,EAAE;GAAI,MAAM;IAACA,EAAE;IAAIA,EAAE;IAAIA,EAAE;GAAE;EAAE,IAAI,KAAA;CAC5E;CAEA,KAAK,GAAmC;EACtC,IAAMgF,IAAI,KAAK,UAAU0J,CAAE,GACrB1I,IAAIhB,GAAG,KAAKA,EAAE;EACpB,OAAOgB,KAAKA,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,KAAa,CAACA,EAAE,KAAKA,IAAI,KAAA;CAChE;CAEA,KAAK,GAAW,GAA4B;EAC1C,IAAM0I,IAAKrO,GAAKtD,CAAC,GACXiS,IAAK3O,GAAK2F,CAAC;EACjB,IAAI0I,EAAG,WAAWM,EAAG,UAAUN,EAAG,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG,MAAMM,EAAG,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG,GAAG,OAAO;EAC/F,IAAMzT,IAAgB,CAAC;EACvB,KAAK,IAAIW,IAAIwS,EAAGA,EAAG,SAAS,IAAIxS,KAAK8S,EAAGA,EAAG,SAAS,IAAI,KAAK;GAC3D,IAAMC,IAAOxU,EAAQsC,GAAGb,IAAIwS,EAAGA,EAAG,SAAS,EAAE;GAC7C,IAAI,CAAC,KAAK,KAAKO,CAAI,GAAG,OAAO;GAC7B,EAAI,KAAKA,CAAI;EACf;EACA,OAAO1T;CACT;CAEA,KAAK,GAAY;EACf,IAAM4B,IAAKkD,GAAKqO,CAAE,CAAC,CAAC,IAAI,GAClBlT,IAAIf,EAAQiU,GAAI,EAAE;EACxB,OAAOvR,IAAK,KAAK,KAAK,KAAK3B,CAAC,IAAIA,IAAI,KAAA;CACtC;CAEA,KAAK,GAAY;EACf,IAAMA,IAAIf,EAAQiU,GAAI,CAAC;EACvB,OAAO,KAAK,KAAKlT,CAAC,IAAIA,IAAI,KAAA;CAC5B;CAEA,IAAI,GAAW,GAAmB;EAChC,IAAMsD,IAAIuB,GAAKtD,CAAC,GACVkN,IAAI5J,GAAK2F,CAAC;EAChB,KAAK,IAAI9J,IAAI,GAAGA,IAAI,KAAK,IAAI4C,EAAE,QAAQmL,EAAE,MAAM,GAAG,KAAK,IAAInL,EAAE5C,OAAO+N,EAAE/N,IAAI,OAAO4C,EAAE5C,KAAK+N,EAAE/N;EAC1F,OAAO4C,EAAE,SAASmL,EAAE;CACtB;CAGA,MAAkB;EAChB,IAAIlN,IAAI,IACJgB,IAAI;EAOR,OANA,KAAK,GAAG,OAAO,SAAS,GAAG,MAAM;GAC/B,AAAK,KAAK,KAAK,OAAO7B,CAAC,CAAC,MACpBa,IAAI,MAAG,IAAIb,IACf,IAAIA;EACN,CAAC,GACGa,IAAI,IAAU,OACX;GAAE,GAAG;IAAE,IAAI,OAAOA,CAAC;IAAG,GAAG;GAAE;GAAG,GAAG;IAAE,IAAI,OAAOgB,CAAC;IAAG,GAAGrD,GAAK,KAAK,KAAK,OAAOqD,CAAC,CAAC,CAAC,CAAE,IAAc;GAAE;EAAE;CAC3G;CAEA,YAAY;EACV,KAAK,MAAM,UAAU;CACvB;CAGA,aAAa,GAAQ,GAAoB;EACvC,IAAMhB,IAAIsD,GAAKZ,EAAE,EAAE,GACbuG,IAAI3F,GAAKtF,EAAE,EAAE;EACnB,IAAIgC,EAAE,WAAW,KAAKiJ,EAAE,WAAW,KAAKjJ,EAAE,MAAMiJ,EAAE,IAAI,OAAO;EAC7D,IAAMsG,IAAQ,KAAK,KAAK7M,EAAE,EAAE,GACtB8M,IAAO,KAAK,KAAKxR,EAAE,EAAE;EAC3B,IAAI,CAACuR,KAAS,CAACC,GAAM,OAAO;EAE5B,IAAM2C,KAAQ,GAAW,MAAiB,KAAK,GAAG,OAAOhT,EAAE,EAAE,MAAM,OAAQ,KAAK,GAAG,OAAOA,EAAE,CAAe,QAAQ8D,EAAE;EACrH,IAAIkP,EAAKnS,EAAE,KAAK,GAAGuP,CAAK,KAAK4C,EAAKlJ,EAAE,KAAK,GAAGuG,CAAI,GAAG,OAAO;EAC1D,IAAM4C,IAAOpV,EAAU,CAAC,GAAGF,EAAUyS,EAAM,MAAgB7M,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG5F,EAAU0S,EAAK,MAAgBxR,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GACxG8G,IAAO,KAAK,GAAG,OAAO,MAAM9E,EAAE,KAAK,GAAGiJ,EAAE,EAAE,CAAC,CAAC,QAAQ,MAAMlH,EAAE,MAAM,MAAM;EAE9E,OADA,KAAK,cAAc/B,EAAE,IAAIiJ,EAAE,KAAKjJ,EAAE,KAAK,GAAG,CAAC,KAAK,KAAKuP,GAAOC,GAAM4C,CAAI,GAAG,GAAGtN,CAAI,GAAG;GAAE,GAAGpC;GAAG,GAAGA;EAAE,CAAC,GAC1FA;CACT;CAIA,SAAS,GAAc,GAAyB;EAC9C,OAAO;GAAE,GAAGO;GAAS;GAAkB,QAAQ;EAAK;CACtD;CAEA,OAAe,GAAwB;EACrC,OAAOA,EAAE,SAASA,EAAE,SAASA,EAAE,QAAQA,EAAE,OAAO,CAACA,EAAE,GAAI,IAAI,CAAC;CAC9D;CAEA,WAAW,GAAyC;EAClD,IAAIA,EAAE,OAAO,OAAO;GAAE,GAAIA,EAAE;GAAgB,MAAM;EAAG;EACrD,IAAMuM,IAAO,CAAC,GAAGvM,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,MAAMiC,EAAE,MAAM,MAAM;EAE7D,OADIsK,IAAa;GAAE,GAAGA;GAAM,MAAM;EAAG,IAC9B;GAAE,GAAG;GAAQ,GAAG;IAAE,IAAIvM,EAAE;IAAQ,MAAMA,EAAE;GAAS;EAAE;CAC5D;CAEA,MAAM,GAAc,GAAc,GAAe,GAAwC;EACvF,IAAM6B,IAAO7B,EAAE,YAAYA,EAAE,SAASA,EAAE,QAAQA,EAAE,MAC5C,IAAe;GAAE,GAAGA;GAAG,MAAMoP;GAAkB,QAAQ;GAAM,UAAU;EAAM,GAC7EpJ,IAAe;GACnB,GAAGhG;GACH,MAAM6N;GACN,KAAK,KAAK;GACV,MAAM7N,EAAE,QAAQA,EAAE;GAClB,MAAM,CAAC;GACP,QAAQ;GACR,UAAU6B;GACV,IAAI;GACJ,KAAK;GACL,OAAOgM,EAAM,SAAS,KAAA,IAAcjU,EAAMwV,GAAM1U,GAAK0U,CAAI,CAAC,KAA4BpP,EAAE;EAC1F;EACA,IAAIqP,GAAO;GACT,IAAMpT,IAAO,KAAK,OAAO,MAAM,MAAMwD,EAAE,OAAOO,EAAE,GAAG,CAAC,EAAE;GACtD,AAAI/D,KAAQA,MAAS+D,EAAE,QACrB,EAAE,KAAK;IAAE,GAAIgG,EAAE,MAAM,CAAC;IAAI,OAAO/J;GAAK,GACtC,EAAE,MAAMA;EAEZ;EACA,OAAO,CAAC,GAAG+J,CAAC;CACd;CAEA,KAAK,GAAc,GAAc,GAAyB;EACxD,OAAO;GAAE,GAAGjJ;GAAS;GAAkB,QAAQ;GAAM,MAAM,CAAC,GAAG,KAAK,OAAOA,CAAC,GAAG,GAAG,KAAK,OAAOiJ,CAAC,CAAC;GAAG,WAAWjJ,EAAE,YAAYA,EAAE,SAASA,EAAE,QAAQA,EAAE,UAAUiJ,EAAE,YAAYA,EAAE,SAASA,EAAE,QAAQA,EAAE;EAAM;CAC1M;CAIA,OAAe,GAAY,GAAe,GAAwB;EAChE,IAAMhB,IAAI,KAAK,UAAU0J,CAAE;EAC3B,IAAI,CAAC1J,EAAE,MAEL,OADA,KAAK,GAAG,OAAO,OAAOA,EAAE,IAAIsK,GAAO,GAAGrT,CAAI,GACnC,KAAK,GAAG;EAEjB,IAAM,CAACsT,GAAI3C,GAAIwB,KAAMpJ,EAAE,MACjBtJ,IAAI,KAAK,GAAG,OAAO6T,IACnBC,IAAS,CAAC,GAAGxK,EAAE,IAAI;EACzB,EAAO,OAAOA,EAAE,IAAIsK,GAAO,GAAGrT,CAAI;EAClC,IAAMwT,IAAY;GAAE,GAAG/T;GAAG,MAAMA,EAAE,KAAK,KAAK,GAAG,MAAOQ,MAAM0Q,IAAS;IAAE,GAAG3K;IAAG,OAAOA,EAAE,MAAM,KAAK,GAAM,MAAOyN,MAAMtB,IAAY;KAAE,GAAGvB;KAAM;IAAO,IAAzBA,CAA2B;GAAE,IAArF5K,CAAuF;EAAE;EAI1J,OAHA,KAAK,GAAG,QAAQ,IAAIwN,GAAI,KAAK,GAAG,QAAQ,IAAI/T,CAAC,KAAK,CAAC,GACnD,KAAK,GAAG,MAAM,IAAI+T,CAAE,GACpB,KAAK,GAAG,OAAOF,KAAME,GACdD;CACT;CAEA,QAAQ,GAAe,GAAmB,GAAU,IAA4D,CAAC,GAAS;EACxH,IAAMvB,IAAS0B,EAAI,KAAK,MAAO,KAAK,KAAKjB,CAAE,CAAE;EAC7C,IAAIT,EAAO,MAAM,MAAM,CAACjI,CAAC,GAAG;EAC5B,AAAI4J,EAAK,YAAS,IAAO3T,EAAK,KAAK,OAAO;GAAE,GAAG+D;GAAG,MAAMA,EAAE,OAAO,KAAK;EAAE,EAAE;EAC1E,IAAMgF,IAAI,KAAK,UAAU2K,EAAI,EAAE,GACzBxS,IAAK6H,EAAE,IACP4C,IAAO,KAAK,OAAO+H,EAAI,IAAIA,EAAI,QAAQ1T,CAAI,GAE3C4T,IAAQ5B,EAAOA,EAAO,SAAS,IAC/B6B,IAAQ7T,EAAKA,EAAK,SAAS;EACjC,IAAI6T,KAASD,EAAM,QAAQC,EAAM,KAC/B,KAAK,IAAIrM,IAAItG,IAAKlB,EAAK,QAAQwH,IAAImE,EAAK,QAAQ,KAAK;GACnD,IAAM5B,IAAI4B,EAAKnE;GACf,IAAIuC,EAAE,MAAM,OAAOA,EAAE,QAAQ6J,EAAM,OAAO,CAAC7J,EAAE,IAAI;GACjD,EAAKvC,KAAK;IAAE,GAAGuC;IAAG,KAAK8J,EAAM;IAAK,MAAMA,EAAM,QAAQA,EAAM;IAAK,QAAQ;GAAK;EAChF;EAGF,IAAI,CAAC9K,EAAE,MAAM;GACX,EAAK,SAAS,GAAG,MAAM;IAErB,AADA,KAAK,GAAG,QAAQ,IAAIhF,GAAG,KAAK,GAAG,QAAQ,IAAIiO,EAAO/R,MAAM+R,EAAO,EAAE,KAAK,CAAC,GACvE,KAAK,GAAG,MAAM,IAAIjO,CAAC;GACrB,CAAC;GACD,KAAK,IAAMyD,KAAK,CAACtG,IAAK,GAAGA,IAAKlB,EAAK,MAAM,GAAG,AAAI2L,EAAKnE,MAAI,KAAK,GAAG,MAAM,IAAImE,EAAKnE,EAAE;GAClF,AAAItG,IAAK,KAAK,GAAG,aAAU,KAAK,GAAG,WAAW,KAAK,IAAI,GAAG,KAAK,GAAG,WAAWlB,EAAK,SAAS0T,EAAI,MAAM;EACvG;EACA,IAAIC,EAAK,YAAY,IAAO;GAC1B,IAAMG,IAAM,KAAK,IAAI,GACfxD,IAAO,KAAK,QAAQ,KAAK,QAAQ,SAAS,IAC1CxI,IAAQ6L,EAAK,SAAS,QACtBI,IAAY,KAAK,MAAM,WAAW/M;GASxC,AARIc,MAAU,UAAUwI,GAAM,UAAU,UAAUoD,EAAI,WAAW,KAAK1T,EAAK,WAAW,KAAKsQ,EAAK,MAAM,WAAW,KAAKA,EAAK,IAAI,OAAOoD,EAAI,MAAMI,IAAMxD,EAAK,IAAI,QAC7J,EAAK,QAAQtQ,GACb,EAAK,WAAWgH,GAChB,EAAK,IAAI8M,MAET,KAAK,QAAQ,KAAK;IAAE;IAAK;IAAQ,OAAO9T;IAAM;IAAW,UAAUgH;IAAK;IAAO,GAAG8M;GAAI,CAAC,GACnF,KAAK,QAAQ,SAAS,OAAK,KAAK,QAAQ,MAAM,IAEpD,KAAK,SAAS,CAAC;EACjB;EAOA,AANA,KAAK,OAAOJ,EAAI,IAAI1B,GAAQhS,GAAM2T,EAAK,IAAI,GAC3C,KAAK,WAAW;GAAE,MAAM;GAAS;GAAQ;EAAK,CAAC,GAC/C,KAAK,aAAa3M,GAClB,KAAK,UAAU,GACf,KAAK,QAAQ,GAEb,KAAK,UAAUA,CAAG;CACpB;CAGA,QAAgB,GAAe,GAAa,GAA2B;EACrE,IAAI/G,IAAI+T;EACR,OAAO/T,IAAI,KAAM0L,EAAK1L,IAAI,EAAE,CAAe,QAAQgU,KAAOtI,EAAK1L,IAAI,EAAE,CAAC,MAAM,MAAK;EACjF,IAAMX,IAAmB,CAAC;EAC1B,OAAOW,IAAI0L,EAAK,UAAUA,EAAK1L,EAAE,CAAC,MAAM,OAAQ0L,EAAK1L,EAAE,CAAe,QAAQgU,GAAK,KAAK,EAAI,KAAKtI,EAAK1L,EAAe;EACrH,OAAOX;CACT;CAEA,OAAe,GAAY,GAAqB,GAAmB,GAAgB;EACjF,IAAMyJ,IAAI,KAAK,UAAU0J,CAAE;EAC3B,IAAI1J,EAAE,QAAS,KAAK,GAAG,OAAOA,EAAE,KAAK,GAAG,CAAW,QAAQ,KAAA,GAAW;GACpE,KAAK,YAAYA,EAAE,KAAK,EAAE;GAC1B;EACF;EACA,IAAM4C,IAAO5C,EAAE,MACTmL,IAAiB,CAAC;EACxB,EAAK,SAAS,MAAMnQ,EAAE,QAAQ,KAAA,KAAa,CAACmQ,EAAK,SAASnQ,EAAE,GAAG,KAAKmQ,EAAK,KAAKnQ,EAAE,GAAG,CAAC;EACpF,IAAMoQ,IAAQD,EAAK,KAAK,MAAQ;GAC9B,IAAME,IAAMrL,EAAE,KAAK/I,EAAK,WAAW,MAAM+D,EAAE,QAAQkQ,CAAG;GACtD,OAAOhF,GAAS,KAAK,QAAQtD,GAAMsI,GAAKG,CAAG,CAAC;EAC9C,CAAC,GACKlC,IAAmB,CAAC;EAC1B,KAAK,IAAMnI,KAAKiI,GAAQ;GACtB,IAAIjI,EAAE,QAAQ,KAAA,KAAamK,EAAK,SAASnK,EAAE,GAAG,KAAKmI,EAAO,SAASnI,EAAE,GAAG,GAAG;GAC3E,IAAMsK,IAAQ1I,EAAK,WAAW,MAAM9I,EAAE,MAAM,OAAQA,EAAgB,QAAQkH,EAAE,GAAG;GACjF,AAAIsK,KAAS,IAAGF,EAAM,KAAKlF,GAAS,KAAK,QAAQtD,GAAM5B,EAAE,KAAKsK,CAAK,CAAC,CAAC,IAChEnC,EAAO,KAAKnI,EAAE,GAAG;EACxB;EACA,IAAMuK,IAAStC,EAAO,EAAE,CAAC,KACnBuC,IAAaC,KAAQxU,EAAK,MAAM,MAAM+D,EAAE,OAAOiO,EAAO,MAAM,MAAMjI,EAAE,QAAQhG,EAAE,GAAG,CAAC,EAAE,EAAE,GACtF0Q,IAAO,IAAI,IAAezU,CAAI,GAC9B0U,IAAa;GAAE;GAAQ,MAAMP;GAAO;GAAQ,MAAMI;EAAW;EAEnE,AADA,KAAK,YACL,KAAK,OACF,KAAK,aAAaG,CAAE,CAAC,CACrB,MAAM,MAAQ,KAAK,YAAYC,GAAKF,CAAI,CAAC,CAAC,CAC1C,OAAO,MAAM,QAAQ,MAAM,+BAA+B,CAAC,CAAC,CAAC,CAC7D,cAAc,KAAK,UAAU;CAClC;CAEA,IAAI,OAAO;EACT,OAAO,KAAK,WAAW;CACzB;CAEA,OAAe,GAA6D;EAC1E,IAAMnV,IAAsD,CAAC;EAY7D,OAXA,KAAK,GAAG,OAAO,SAAS,GAAG,MAAO;GAChC,AAAIyK,EAAE,MAAM,OAAOA,EAAE,QAAQkK,IAAK3U,EAAI,KAAK;IAAE,MAAM,KAAK,GAAG;IAAQ,OAAOgU;IAAI,IAAI,OAAOA,CAAE;GAAE,CAAC,IACrFvJ,EAAE,MAAM,SACfA,EAAE,KAAK,SAAS,GAAG,MACjB/D,EAAE,MAAM,SAAS,GAAM,MACrB4K,EAAK,OAAO,SAAS,GAAG,MAAO;IAC7B,AAAI/N,EAAE,MAAM,OAAOA,EAAE,QAAQoR,KAAK3U,EAAI,KAAK;KAAE,MAAMsR,EAAK;KAAQ,OAAOgE;KAAI,IAAI,GAAGtB,EAAG,GAAG3C,EAAG,GAAGwB,EAAG,GAAGyC;IAAK,CAAC;GAC5G,CAAC,CACH,CACF;EACJ,CAAC,GACMtV;CACT;CAEA,IAAY,GAAY,GAAc;EACpC,IAAMyJ,IAAI,KAAK,UAAU0J,CAAE;EAC3B,IAAI,CAAC1J,GAAG;EACR,IAAM8L,IAAM9L,EAAE,KAAKA,EAAE;EAErB,AADA,KAAK,OAAO0J,GAAI,GAAG,CAAC1O,CAAC,CAAC,GACjBgF,EAAE,SACL,KAAK,GAAG,QAAQ,IAAIhF,GAAG,KAAK,GAAG,QAAQ,IAAI8Q,CAAG,KAAK,CAAC,GACpD,KAAK,GAAG,MAAM,IAAI9Q,CAAC;CAEvB;CAEA,YAAoB,GAAiB,GAAsB;EACzD,IAAI,KAAK,MAAM,aAAa;EAC5B,IAAI+Q,IAAU;EAEd,KAAK,IAAM,CAACtN,GAAG+L,MAAW,OAAO,QAAQoB,EAAI,MAAM,GAAG;GACpD,IAAMI,IAAO,KAAK,OAAO,OAAOvN,CAAC,CAAC,GAC5BwN,IAAQzB,EAAO,QAAQ,MAAsBxJ,EAAE,MAAM,GAAG;GAC9D,AAAKgL,EAAK,UAAUC,EAAM,WAAWD,EAAK,UACrCA,EAAK,OAAO,MAAMN,EAAK,IAAIQ,EAAE,KAAKA,EAAE,MAAmB,CAAC,MAC7DF,EAAK,SAAS,GAAG,MAAM;IACrB,IAAMrM,IAAMuM,EAAE,KAAKA,EAAE;IACrB,KAAK,IAAIA,EAAE,IAAI;KAAE,GAAGD,EAAM/U;KAAI,MAAMyI,EAAI;KAAM,MAAMA,EAAI;KAAM,IAAIA,EAAI;KAAI,QAAQA,EAAI;KAAQ,UAAUA,EAAI;KAAU,KAAKA,EAAI;KAAK,IAAIA,EAAI;IAAG,CAAC;GAClJ,CAAC,GACD,IAAU;EACZ;EAEA,KAAK,IAAM,CAAClB,GAAGgD,MAAM,OAAO,QAAQmK,EAAI,OAAO,GAC7C,KAAK,IAAMO,KAAO,KAAK,OAAO,OAAO1N,CAAC,CAAC,GAAG;GACxC,IAAMzD,IAAImR,EAAI,KAAKA,EAAI;GACvB,AAAKA,EAAI,KAAKA,EAAI,QAAQ,EAAE,EAA4B,QAAQnR,EAAE,QAClE,KAAK,IAAImR,EAAI,IAAI;IAAE,GAAGnR;IAAG,QAAQyG,IAAI;KAAE,MAAMA,EAAE;KAAM,GAAGA,EAAE;KAAG,KAAKA,EAAE;IAAI,IAAI,KAAA;IAAW,KAAKA,GAAG;GAAI,CAAC,GACpG,IAAU;EACZ;EAEF,AAAIsK,KAAS,KAAK,QAAQ;CAC5B;CAKA,SAAiB,GAAe,GAAmC;EACjE,IAAM/K,IAAI4B,EAAK;EACf,IAAI,CAAC5B,GAAG,OAAOoL;EACf,IAAIpL,EAAE,MAAM,KAAK,OAAOA,EAAE,QAAQ,KAAA,IAAwC,KAAA,IAA5B,KAAK,OAAOA,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE;EACrE,IAAIA,EAAE,MAAM,OAAO;GACjB,IAAM9J,IAAI,KAAK,GAAG,OAAO,WAAW,MAAM4C,EAAE,MAAM,UAAWkH,EAAE,QAAQ,KAAA,KAAalH,EAAE,QAAQkH,EAAE,OAASA,EAAE,SAAS,KAAA,KAAalH,EAAE,SAASkH,EAAE,KAAM;GACpJ,OAAO9J,KAAK,IAAI,OAAOA,CAAC,IAAI,KAAA;EAC9B;EACA,OAAOkV;CACT;CAGA,YAAoB,GAAe,GAAY,GAAwB;EACrE,IAAMzM,IAAM,IAAI,IAAI,KAAK,GAAG,OAAO,MAAM4K,GAAIA,IAAKD,CAAK,CAAC,CAAC,SAAS,MAAOtJ,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,IAAY,CAAC,CAACA,EAAE,KAAKA,CAAC,CAAU,IAAI,CAAC,CAAE,CAAC;EAC1I,OAAO4B,EAAK,KAAK,MAAO5B,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,KAAarB,EAAI,IAAIqB,EAAE,GAAG,IAAIrB,EAAI,IAAIqB,EAAE,GAAG,IAAKA,CAAE;CACrG;CAEA,OAAO;EACL,IAAM,IAAI,KAAK,QAAQ,IAAI;EAC3B,IAAI,CAAC,GAAG;EACR,IAAI,EAAE,QAAQ;GACZ,IAAMuJ,IAAK,KAAK,SAAS,EAAE,OAAO,OAAO,OAAO,EAAE,OAAO,EAAE,CAAC;GAE5D,IAAIA,MAAO,KAAA,GAAW;GAEtB,AADA,KAAK,cAAc,OAAOA,CAAE,GAAG,EAAE,OAAO,MAAM,QAAQ,KAAK,YAAY,EAAE,OAAO,QAAQ,OAAOA,CAAE,GAAG,EAAE,OAAO,MAAM,MAAM,GAAG,EAAE,WAAW,EAAK,GAC9I,KAAK,OAAO,KAAK,CAAC;GAClB;EACF;EACA,IAAMpS,IAAK,KAAK,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;EAC1C,IAAIA,MAAO,KAAA,GAAW;EACtB,IAAMkU,IAAW,EAAE,MAAM,KAAK,GAAG,MAAM5W,EAAQ0C,GAAIjB,CAAC,CAAC;EAErD,AAAImV,EAAS,MAAM,GAAI,MAAM,KAAK,KAAK3C,CAAE,CAAC,EAAE,QAAQ,EAAE,MAAMxS,EAAE,CAAC,GAAG,MAClE,KAAK,QAAQmV,EAAS,SAASA,IAAW,CAAClU,CAAE,GAAG,EAAE,QAAQwR,GAAQ,EAAE,WAAW,EAAE,IAAI,IAAIxR,CAAE,GAAG;GAAE,SAAS;GAAO,OAAO;GAAQ,MAAM;EAAK,CAAC,GAC3I,KAAK,OAAO,KAAK,CAAC;CACpB;CAEA,OAAO;EACL,IAAM,IAAI,KAAK,OAAO,IAAI;EAC1B,IAAI,CAAC,GAAG;EACR,IAAI,EAAE,QAAQ;GACZ,IAAMoS,IAAK,KAAK,SAAS,EAAE,OAAO,QAAQ,OAAO,EAAE,OAAO,EAAE,CAAC;GAC7D,IAAIA,MAAO,KAAA,GAAW;GAEtB,AADA,KAAK,cAAc,OAAOA,CAAE,GAAG,EAAE,OAAO,OAAO,QAAQ,KAAK,YAAY,EAAE,OAAO,OAAO,OAAOA,CAAE,GAAG,EAAE,OAAO,OAAO,MAAM,GAAG,EAAE,UAAU,EAAK,GAC9I,KAAK,QAAQ,KAAK,CAAC;GACnB;EACF;EACA,IAAMpS,IAAK,KAAK,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;EAC3C,IAAIA,MAAO,KAAA,GAAW;EACtB,IAAMmU,IAAS,EAAE,OAAO,KAAK,GAAG,MAAM7W,EAAQ0C,GAAIjB,CAAC,CAAC;EACpD,AAAIoV,EAAO,MAAM,GAAI,MAAM,KAAK,KAAK5C,CAAE,CAAC,EAAE,QAAQ,EAAE,OAAOxS,EAAE,CAAC,GAAG,MACjE,KAAK,QAAQoV,GAAQ,EAAE,OAAO3C,GAAQ,EAAE,UAAU,EAAE,IAAI,IAAIxR,CAAE,GAAG;GAAE,SAAS;GAAO,OAAO;GAAQ,MAAM;EAAK,CAAC,GAC9G,KAAK,QAAQ,KAAK,CAAC;CACrB;CAEA,IAAI,UAAU;EACZ,OAAO,KAAK,QAAQ,SAAS;CAC/B;CACA,IAAI,UAAU;EACZ,OAAO,KAAK,OAAO,SAAS;CAC9B;CAIA,eAA0C;EACxC,OAAO,KAAK,OAAQ;GAAE,GAAG,KAAK,KAAK;GAAG,GAAG,KAAK,KAAK;EAAE,IAAsB,KAAA;CAC7E;CAEA,eAAe;EACb,KAAK,OAAO;CACd;CAEA,cAAsB,GAAgG;EACpH,IAAM,CAACsC,GAAG1E,KAAKb,EAAQ,MAAM+I,CAAG,GAC1B0M,IAAMlQ,EAAE,OAAO1E,EAAE,KAAM,KAAK,KAAK0E,EAAE,EAAE,IAAI,CAACA,EAAE,EAAE,IAAI,OAAQ,KAAK,KAAKA,EAAE,IAAI1E,EAAE,EAAE;EACpF,OAAO4U,IAAM;GAAE;GAAK;GAAG;EAAE,IAAI;CAC/B;CAEA,OAAO,GAAsB,GAAW,IAA2B,CAAC,GAAG;EACrE,IAAM1M,IAAM,KAAK,MAAM,IAAI;EAC3B,IAAI,CAACA,GAAK;EACV,IAAIzI,EAAUyI,CAAG,GAAG;GAGlB,AAFA,KAAK,OAAO;IAAE,GAAG;KAAE,GAAI,KAAK,MAAM,KAAK,CAAC;KAAI,GAAGxD;IAAE;IAAG,GAAG;KAAE,GAAI,KAAK,MAAM,KAAK,CAAC;KAAI,GAAGiE;IAAE;IAAG,IAAIT,EAAI;GAAE,GACpG,KAAK,MAAM,QAAQA,CAAG,GACtB,KAAK,UAAUA,CAAG;GAClB;EACF;EACA,IAAMhB,IAAI,KAAK,cAAcgB,CAAG;EAChC,IAAI,CAAChB,GAAG;EACR,IAAMhG,IAAOgG,EAAE,IAAI,KAAK,GAAI,MAAM;GAChC,IAAMjC,IAAI,KAAK,KAAK0O,CAAE,GAChB3R,IAAIb,MAAM,IAAI+F,EAAE,EAAE,IAAI,GACtB+D,IAAI9J,MAAM+F,EAAE,IAAI,SAAS,IAAIA,EAAE,EAAE,IAAIvH,GAAKsF,EAAE,IAAc;GAChE,OAAO,KAAK,SAASA,GAAGrF,GAAYqF,EAAE,MAAgBjD,GAAGiJ,GAAGvG,GAAGiE,CAAC,CAAC;EACnE,CAAC;EACD,KAAK,QAAQzB,EAAE,KAAKhG,GAAMgH,GAAK;GAAE,OAAO;GAAU,MAAM2M,EAAK;EAAK,CAAC;CACrE;CAEA,OAAO,GAAiC;EACtC,IAAMlE,IAAK,KAAK,MAAM,GAChBzL,IAAK,EAAEyL,KAAMA,EAAGrB;EACtB,AAAIA,MAAQ,MAAK,KAAK,OAAO,EAAE,GAAGpK,IAAK,WAAW,OAAO,GAAG,EAAE,GAAGA,IAAK,WAAW,OAAO,CAAC,IACpF,KAAK,OAAO,GAAGoK,IAAMpK,EAAG,GAAG,GAAGoK,IAAMpK,EAAG,CAAC;CAC/C;CAEA,QAAQ,GAAc;EACpB,KAAK,OAAO,EAAE,MAAM1G,EAAQmE,CAAI,EAAE,GAAG,EAAE,MAAMA,EAAK,CAAC;CACrD;CAEA,QAAQ,GAAY;EAClB,KAAK,OAAO,EAAE,MAAG,GAAG,EAAE,MAAG,CAAC;CAC5B;CAEA,SAAS,GAAkB;EACzB,KAAK,OAAO,EAAE,OAAOsH,KAAK,KAAA,EAAU,GAAG,EAAE,OAAOA,EAAE,CAAC;CACrD;CAEA,aAAa,GAAkB;EAC7B,KAAK,OAAO;GAAE,IAAIA,KAAK,KAAA;GAAW,KAAK,KAAA;EAAU,GAAG,EAAE,IAAIA,EAAE,CAAC;CAC/D;CAEA,cAAc;EACZ,KAAK,OAAO;GAAE,GAAG;GAAO,GAAG;GAAO,GAAG;GAAQ,QAAQ;GAAO,IAAI,KAAA;EAAU,GAAG;GAAE,GAAG;GAAO,GAAG;GAAO,GAAG;GAAQ,QAAQ;GAAO,OAAO;GAAM,IAAI;GAAM,IAAI;EAAK,GAAG,EAAE,MAAM,GAAK,CAAC;CAChL;CAEA,QAAQ,GAAkB,IAAiC,CAAC,GAAG,IAAM,KAAK,MAAM,IAAI,GAAG;EACrF,IAAI,CAAC/B,GAAK;EACV,IAAM,IAAI,KAAK,cAAcA,CAAG;EAChC,IAAI,CAAC,GAAG;EACR,IAAMhH,IAAO,EAAE,IAAI,KAAK,MAAO;GAC7B,IAAM+D,IAAI,KAAK,KAAK0O,CAAE,GAChB6C,IAAK;IAAE,GAAIvR,EAAE,MAAM,CAAC;IAAI,GAAGwR;GAAM;GACvC,OAAO;IAAE,GAAGxR;IAAG;IAAI,IAAI;KAAE,GAAGA,EAAE;KAAI,GAAGyR;IAAW;IAAG,QAAQ;IAAM,KAAKD,EAAM,SAASxR,EAAE;GAAI;EAC7F,CAAC;EACD,KAAK,QAAQ,EAAE,KAAK/D,GAAMgH,GAAK;GAAE,OAAO;GAAQ,MAAM;EAAK,CAAC;CAC9D;CAEA,WAAW,GAA2B;EACpC,IAAMA,IAAM,KAAK,MAAM,IAAI;EAC3B,IAAI,CAACA,GAAK;EACV,IAAMhB,IAAI,KAAK,cAAcgB,CAAG;EAChC,IAAI,CAAChB,GAAG;EACR,IAAMuE,IAAMvE,EAAE,IAAI,OAAO,MAAO,KAAK,KAAKyM,CAAE,CAAC,EAAE,QAAQgD,CAAI;EAC3D,KAAK,QAAQ;GAAE,MAAMlL,IAAM,SAASkL;GAAM,MAAMlL,IAAM,KAAA,IAAY;EAAE,GAAG,CAAC,GAAGvD,CAAG;CAChF;CAEA,OAAO,GAAa,IAAM,KAAK,MAAM,IAAI,GAAG;EAC1C,IAAI,CAACA,GAAK;EACV,IAAMhB,IAAI,KAAK,cAAcgB,CAAG;EAChC,IAAI,CAAChB,GAAG;EACR,IAAMhG,IAAOgG,EAAE,IAAI,KAAK,MAAO;GAC7B,IAAMjC,IAAI,KAAK,KAAK0O,CAAE,GAChB6C,IAAgB,EAAE,GAAIvR,EAAE,MAAM,CAAC,EAAG;GAGxC,OAFIA,EAAE,MAAK,EAAG,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAIA,EAAE,QAAQ,KAAK6J,CAAG,CAAC,IAC5D,EAAG,OAAO,KAAK,IAAI,IAAI7J,EAAE,GAAG,QAAQ,KAAK6J,IAAM,EAAE,GAC/C;IAAE,GAAG7J;IAAG;IAAI,IAAIA,EAAE,MAAMA,EAAE,KAAK;KAAE,GAAGA,EAAE;KAAI,MAAMuR,EAAG;IAAK;IAAG,QAAQ;GAAK;EACjF,CAAC;EACD,KAAK,QAAQtP,EAAE,KAAKhG,GAAMgH,GAAK;GAAE,OAAO;GAAQ,MAAM;EAAK,CAAC;CAC9D;CAEA,IAAI,GAAU,GAAyB;EACrC,IAAIA,EAAI,EAAE,GAAG,SAAS,GAAG,GAAG;GAE1B,IAAM,CAACsM,GAAI3C,GAAIwB,KAAMnL,EAAI,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,GAE7CyJ,IADI,KAAK,GAAG,OAAO6C,EACX,CAAE,KAAK,SAAS,GAAG,MAAMtN,EAAE,MAAM,KAAK,GAAG,MAAM,CAAC/F,GAAGwT,CAAC,CAAqB,CAAC,GAClFjM,IAAIiJ,EAAM,WAAW,CAACxQ,GAAGwT,OAAOxT,MAAM0Q,KAAM8C,MAAMtB,CAAE,KAAKvL,IAAQ,KAAK;GAC5E,IAAIY,KAAKiJ,EAAM,UAAU,CAAC7J,GAExB,OADA,KAAK,QAAQ,UAAU,GAChB;GAET,IAAM,CAAC8O,GAAIC,KAAMlF,EAAM,KAAK,IAAI,GAAGjJ,CAAC,IAC9BiL,IAAK,GAAGa,EAAG,GAAGoC,EAAG,GAAGC,EAAG,KACvB5R,IAAI,KAAK,KAAK0O,CAAE;GAEtB,OADA,KAAK,MAAM,QAAQ;IAAE,GAAG;KAAE;KAAI,GAAG;IAAE;IAAG,GAAG;KAAE;KAAI,GAAG1O,IAAItF,GAAKsF,EAAE,IAAc,IAAI;IAAE;GAAE,CAAC,GAC7E;EACT;EAIA,OAHU,KAAK,KAAKiD,EAAI,EAAE,EACrB,CAAA,EAAG,OACR,KAAK,OAAOJ,IAAQ,KAAK,GAAGI,CAAG,GACxB,MAFa;CAGtB;CAEA,iBAAiB,GAAY,GAAuB;EAGlD,OAFKjD,EAAE,OACP,KAAK,QAAQ,EAAE,MAAM,OAAO,GAAG,CAAC,GAAG;GAAE,GAAG;IAAE;IAAI,GAAG;GAAE;GAAG,GAAG;IAAE;IAAI,GAAG;GAAE;EAAE,CAAC,GAChE,MAFY;CAGrB;CAKA,WAAW;CAEX;CACA;CAEA,YAAoB,GAAgC;EAClD,KAAK,IAAI9D,IAAIqT,IAAK,GAAGrT,KAAK,GAAG,KAAK;GAChC,IAAM8J,IAAI,KAAK,GAAG,OAAO9J;GACzB,IAAI8J,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,GAAW,OAAOA,EAAE;EACnD;CAEF;CAEA,UAAkB,GAAqB;EACrC,OAAO;GACL,KAAKtK,EAAE;GACP,MAAMA,EAAE;GACR,MAAMA,EAAE;GACR,MAAMA,EAAE,KAAK,KAAK,OAAO;IACvB,KAAKuG,EAAE;IACP,OAAOA,EAAE,MAAM,KAAK,OAAO;KACzB,KAAK+C,EAAE;KACP,SAASA,EAAE;KACX,SAASA,EAAE;KACX,OAAOA,EAAE,OAAO,QAAQ,MAAsBgB,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,CAAS,CAAC,CAAC,KAAK,MAAMkF,GAAS,CAAClL,CAAC,CAAC,CAAC;IAC5G,EAAE;GACJ,EAAE;EACJ;CACF;CAEA,YAAoB,GAAY;EAC9B,IAAM,IAAI,KAAK,GAAG,OAAOuP;EACzB,AAAI,GAAG,MAAM,SAAS,EAAE,QAAQ,KAAA,KAChC,KAAK,KAAK,cAAc;GAAE,KAAK,EAAE;GAAK,MAAM,EAAE;GAAM,QAAQ,EAAE,SAAS,KAAA,IAAY,KAAK,YAAYA,CAAE,IAAI,KAAA;GAAW,MAAM,KAAK,UAAU,CAAC;EAAE,CAAC;CAChJ;CAEA,KAAa,GAAoC,GAAa;EAE3D,AADD,KAAK,YACJ,KAAM,OAAO,KAA0DsC,GAAQlB,CAAE,CAAC,CAChF,MAAM,MAAQkB,MAAW,eAAe,KAAK,YAAYjB,mBAAmB,IAAI,IAAI,CAAC,CAAC,CAAC,CACvF,OAAO,MAAM,QAAQ,MAAM,+BAA+B,CAAC,CAAC,CAAC,CAC7D,cAAc,KAAK,UAAU;CAClC;CAGA,cAAc,GAAY,GAAe,GAAe,GAAiB,IAAU,IAAM;EACvF,IAAM3C,IAAS,KAAK,GAAG,OAAO,MAAMsB,GAAIA,IAAKD,CAAK;EAMlD,AALA,KAAK,GAAG,OAAO,OAAOC,GAAID,GAAO,GAAGrT,CAAI,GACxCA,EAAK,SAAS,GAAG,MAAM;GAErB,AADA,KAAK,GAAG,QAAQ,IAAI+J,GAAG,KAAK,GAAG,QAAQ,IAAIiI,EAAO/R,MAAM+R,EAAO,EAAE,KAAK,CAAC,GACvE,KAAK,GAAG,MAAM,IAAIjI,CAAC;EACrB,CAAC,GACGuJ,IAAK,KAAK,GAAG,aAAU,KAAK,GAAG,WAAW,KAAK,IAAI,GAAG,KAAK,GAAG,WAAWtT,EAAK,SAASqT,CAAK;EAChG,IAAMjF,KAAO,MAAcrE,EAAE,MAAM,QAAQ,IAAIA,EAAE,OAAO,MAAMA,EAAE,SAASA,EAAE,MAAM,MAAM,IAAIA,EAAE,QAAQ,IAC/F8L,IAAW,IAAI,IAAI7V,EAAK,IAAIoO,CAAG,CAAC,GAChC0H,IAAa,IAAI,IAAI9D,EAAO,IAAI5D,CAAG,CAAC,GAEpC2H,IAAU,CAAC,GAAG/D,GAAQ,GAAGhS,CAAI,CAAC,CAAC,MAAM,MAAsB+J,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,KAAa+L,EAAW,IAAI1H,EAAIrE,CAAC,CAAC,KAAK8L,EAAS,IAAIzH,EAAIrE,CAAC,CAAC,CAAC,GAC/IiM,IAAQhW,EAAK,QAAQ,MAAsB+J,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,KAAa,CAAC+L,EAAW,IAAI1H,EAAIrE,CAAC,CAAC,CAAC,GACxGkM,IAAUjE,EAAO,QAAQ,MAAsBjI,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,KAAa,CAAC8L,EAAS,IAAIzH,EAAIrE,CAAC,CAAC,CAAC,GAE1GmM,IAAY,IAAI,IAAIlE,EAAO,KAAK,MAAM,CAAC5D,EAAIrE,CAAC,GAAGA,CAAC,CAAC,CAAC,GAClD+I,IAAU9S,EAAK,MAAM,MAAM+J,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,KAAamM,EAAU,IAAI9H,EAAIrE,CAAC,CAAC,KAAKmM,EAAU,IAAI9H,EAAIrE,CAAC,CAAC,MAAMA,CAAC;EAC3H,IAAIgM,MAAYC,EAAM,UAAUC,EAAQ,UAAUnD,IAAU;GAC1D,IAAMnH,IAAO3L,EAAK,QAAQ,MAAsB+J,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,CAAS;GAClF,KAAK,KAAK,aAAa;IAAE,QAAQgM,EAAQ;IAAK,MAAMpK,EAAK,KAAK,MAAMsD,GAAS,CAAClL,CAAC,CAAC,CAAC;IAAG,QAAQkS,EAAQ,KAAK,MAAMlS,EAAE,GAAG;GAAE,CAAW;EACnI;EACA,KAAK,IAAMgG,KAAKiI,GAAQ,AAAIjI,EAAE,MAAM,SAAU8L,EAAS,IAAIzH,EAAIrE,CAAC,CAAC,KAAMA,EAAE,QAAQ,KAAA,KAAaA,EAAE,SAAS,KAAA,KAAY,KAAK,KAAK,cAAc;GAAE,KAAKA,EAAE,OAAO;GAAI,MAAMA,EAAE;GAAM,MAAM;EAAK,CAAC;EAQ3L,IAPA/J,EAAK,SAAS,GAAG,MAAM;GACrB,AAAI+J,EAAE,MAAM,UAERA,EAAE,QAAQ,KAAA,KAAa,CAAC+L,EAAW,IAAI1H,EAAIrE,CAAC,CAAC,MAAG,KAAK,GAAG,OAAOuJ,IAAKrT,KAAK;IAAE,GAAG8J;IAAG,KAAK,KAAK;GAAU,IACzG,KAAK,YAAYuJ,IAAKrT,CAAC;EACzB,CAAC,GACD,KAAK,WAAW;GAAE,MAAM;GAAU;GAAI;GAAQ;EAAK,CAAC,GAChDkW,GAAS;GACX,IAAM3S,IAAIwD,KAAO,KAAK,MAAM,WAAW;IAAE,GAAG;KAAE,IAAI,OAAOsM,CAAE;KAAG,GAAG;IAAE;IAAG,GAAG;KAAE,IAAI,OAAOA,CAAE;KAAG,GAAG;IAAE;GAAE;GAElG,AADA,KAAK,QAAQ,KAAK;IAAE,KAAK,CAAC;IAAG,QAAQ,CAAC;IAAG,OAAO,CAAC;IAAG,QAAQ;KAAE;KAAI;KAAQ,OAAOtT;IAAK;IAAG,WAAW,KAAK,MAAM,WAAWwD;IAAG,UAAUA;IAAG,OAAO;IAAS,GAAG,KAAK,IAAI;GAAE,CAAC,GACzK,KAAK,SAAS,CAAC;EACjB;EAGA,AAFIwD,MAAK,KAAK,aAAaA,IAC3B,KAAK,UAAU,GACf,KAAK,QAAQ;CACf;CAEA,UAAkB,GAA2B;EAC3C,OAAO;GACL,GAAG;GAAK,IAAI;IAAE,GAAG8J,EAAI;IAAI,UAAU,KAAA;IAAW,MAAM,KAAA;GAAU;GAAG,MAAM,CAAC;GAAG,QAAQA,EAAI;GAAQ,UAAUA,EAAI;GAC7G,KAAK,KAAK;GAAW,MAAMA,EAAI,QAAQA,EAAI;GAAK,MAAM,CAAC;GAAG,QAAQ;GAAM,UAAU;GAAO,IAAI;IAAE,OAAO;IAAI,MAAM;GAAO;GAAG,KAAK,KAAA;EACjI;CACF;CAEA,YAAY,GAAe,GAAe;EACxC,IAAM9J,IAAM,KAAK,MAAM,IAAI,GACrBsM,IAAKtM,IAAM,OAAOA,EAAI,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,IAC5CjD,IAAI,KAAK,GAAG,OAAOuP;EACzB,IAAI,CAACtM,KAAOA,EAAI,EAAE,GAAG,SAAS,GAAG,KAAKjD,GAAG,MAAM,OAAOA,EAAE,QAAQ,KAAA,GAAW;EAE3E,IAAMqS,IAAiB,CAACrS,GAAG;GADR,GAAGqO,GAASI,GAAOD,GAAO,KAAK,gBAAgB,KAAK,UAAUxO,CAAC,CAAC;GAAG,KAAK,KAAK;EACrE,CAAC,GACtBsS,IAAY,KAAK,GAAG,OAAO/C,IAAK;EAEtC,AADK+C,KAAaA,EAAU,MAAM,OAAKD,EAAM,KAAK,KAAK,UAAUrS,CAAC,CAAC,GACnE,KAAK,cAAcuP,GAAI,GAAG8C,GAAO;GAAE,GAAG;IAAE,IAAI,GAAG9C,IAAK,EAAE;IAAS,GAAG;GAAE;GAAG,GAAG;IAAE,IAAI,GAAGA,IAAK,EAAE;IAAS,GAAG;GAAE;EAAE,CAAC;CAC7G;CAGA,QAAQ,GAA2F;EACjG,IAAMtM,IAAM,KAAK,MAAM,IAAI;EAC3B,IAAI,CAACA,KAAO,CAACA,EAAI,EAAE,GAAG,SAAS,GAAG,GAAG;EACrC,IAAM,CAACsM,GAAI3C,GAAIwB,KAAMnL,EAAI,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,GAC7CvH,IAAI,KAAK,GAAG,OAAO6T;EACzB,IAAI7T,GAAG,MAAM,OAAO;EACpB,IAAMiR,IAAIH,GAAO9Q,CAAC,CAAC,CAAC,MAAM,MAAM,MAAMsJ,EAAE,OAAO4H,KAAM5H,EAAE,OAAOoJ,CAAE,CAAC,EAAE,KAAK,GAClEpB,KAAM,MAA6B;GACvC,IAAMhN,IAAI+M,EAAI,OAAO,MAAM,MAAsB/G,EAAE,MAAM,GAAG,KAAM,KAAK,GAAG,OAAO,MAAM,MAAMA,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,CAAS;GAC/H,OAAO;IAAE,GAAG,KAAK,UAAUhG,CAAC;IAAG,IAAI,CAAC;IAAG,IAAIA,EAAE;IAAI,KAAKA,EAAE;GAAI;EAC9D,GACI/D,IAAqBP,GACrBD,IAAQ,GAAG8T,EAAG,GAAG3C,EAAG,GAAGwB,EAAG;EAC9B,QAAQsD,GAAR;GACE,KAAK;IAEH,AADA,IAAOtE,GAAU1R,GAAGkR,GAAI,IAAOI,CAAE,GACjC,IAAQ,GAAGuC,EAAG,GAAG3C,EAAG;IACpB;GACF,KAAK;IAEH,AADA,IAAOQ,GAAU1R,GAAGkR,GAAI,IAAMI,CAAE,GAChC,IAAQ,GAAGuC,EAAG,GAAG3C,IAAK,EAAE;IACxB;GACF,KAAK;IACH,IAAOgB,GAAUlS,GAAGiR,GAAG,IAAOK,CAAE;IAChC;GACF,KAAK;IAEH,AADA,IAAOY,GAAUlS,GAAGiR,GAAG,IAAMK,CAAE,GAC/B,IAAQ,GAAGuC,EAAG,GAAG3C,EAAG,GAAGwB,IAAK,EAAE;IAC9B;GACF,KAAK;IAEH,AADA,IAAOT,GAAUjS,GAAGkR,CAAE,GACtB,IAAQ,GAAG2C,EAAG,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI3C,IAAK3Q,GAAM,KAAK,UAAU,KAAK,CAAC,CAAC,EAAE;IACzE;GACF,KAAK;IAEH,AADA,IAAOiS,GAAUxS,GAAGiR,CAAC,GACrB,IAAQ,GAAG4C,EAAG,GAAG3C,EAAG,GAAG,KAAK,IAAI,GAAGwB,IAAK,CAAC,EAAE;IAC3C;GACF,KAAK,YACH,IAAO;EAEX;EACA,IAAKnS,GAML,AADA,IAAO;GAAE,GAAGA;GAAM,KAAKP,EAAE,OAAO,KAAK;EAAU,GAC/C,KAAK,cAAc6T,GAAI,GAAG,CAACtT,CAAI,GAAG;GAAE,GAAG;IAAE,IAAIR;IAAO,GAAG;GAAE;GAAG,GAAG;IAAE,IAAIA;IAAO,GAAG;GAAE;EAAE,CAAC;OANzE;GACT,IAAM4W,IAAQ,KAAK,GAAG,OAAO9C,IAAK;GAClC,KAAK,cAAcA,GAAI,GAAG,CAAC,GAAG8C,GAAO,MAAM,MAAM;IAAE,GAAG;KAAE,IAAI,OAAO9C,CAAE;KAAG,GAAG;IAAE;IAAG,GAAG;KAAE,IAAI,OAAOA,CAAE;KAAG,GAAG;IAAE;GAAE,IAAI,IAAI;EAEtH;CAGF;CAIA,MAAM,aAAa,GAAe,GAAU;EAC1C,IAAMtM,IAAM9F,KAAM,KAAK,MAAM,IAAI;EACjC,IAAI,CAAC8F,GAAK;EACV,IAAMkM,IAAiB,CAAC;EACxB,KAAK,IAAMpR,KAAKwU,GAAO;GACrB,IAAMC,KAAOzU,EAAE,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM,MAAA,CAAO,QAAQ,WAAW,KAAK,CAAC,CAAC,QAAQ,QAAQ,KAAK,GACrF,EAAE,QAAK,YAAS,MAAM,KAAK,OAAO,KAAK,cAAc,MAAMA,EAAE,YAAY,GAAGyU,CAAG,GAC/EC,IAAO,MAAMC,GAAU3U,CAAC,GACxB4U,IAAQ,KAAK,IAAI,GAAG,KAAK,WAAW,KAAK,IAAI,GAAGF,EAAK,IAAI,GAAI,CAAC;GACpE,EAAK,KAAK;IAAE,GAAG;IAAO,QAAQpS;IAAM,GAAG,EAAEoS,EAAK,IAAI,MAAOE,EAAA,CAAO,QAAQ,CAAC;IAAG,GAAG,EAAEF,EAAK,IAAI,MAAOE,EAAA,CAAO,QAAQ,CAAC;IAAG;GAAI,CAAC;EAC3H;EACA,GAAa,MAAM1P,GAAK,CAACkM,CAAc,GAAG,EAAE,OAAO,QAAQ,CAAC;CAC9D;CAEA,MAAM,QAAQ,GAAoB;EAChC,IAAMlM,IAAM,KAAK,MAAM,IAAI;EAC3B,IAAI,CAACA,GAAK;EACV,IAAI,CAAC9C,GAAK;GACR,KAAK,UAAU8C,IAAM,OAAO;IAAE,GAAGhB;IAAG,MAAM,KAAA;IAAW,IAAI,KAAA;GAAU,EAAE;GACrE;EACF;EACA,IAAM2Q,IAAO,mBAAmB,KAAKzS,CAAG,KAAKA,EAAI,WAAW,GAAG,IAAIA,IAAM,aAAaA,GAChF0S,IAAK,MAAM,KAAK,OAAO,KAAK,aAAaD,CAAI,GAC7CE,IAAQ;GAAE,OAAO;GAAW,GAAG;EAAS;EAC9C,AAAItY,EAAUyI,CAAG,IACf9I,GAAa,MAAM8I,GAAK,CAAC,CAAC;GAAE,GAAG;GAAQ,MAAM9C;GAAK;GAAM;GAAI,GAAG;IAAE,GAAIvG,EAAM,KAAK,KAAKqJ,EAAI,EAAE,EAAE,CAAC,EAAE,QAAkB,CAAC,GAAGA,EAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC;IAAI,GAAG6P;GAAM;GAAG,GAAGA;EAAM,CAAS,CAAC,GAAG,EAAE,OAAO,OAAO,CAAC,IAG/L,KAAK,UAAU7P,IAAM,OAAO;GAAE,GAAGhB;GAAG;GAAM;GAAI,GAAG;IAAE,GAAIA,EAAE,KAAK,CAAC;IAAI,GAAG6Q;GAAM;GAAG,GAAG;IAAE,GAAI7Q,EAAE,KAAK,CAAC;IAAI,GAAG6Q;GAAM;EAAE,EAAE;CACnH;CAGA,UAAkB,GAAU,GAAuB;EACjD,IAAM7Q,IAAI,KAAK,cAAcgB,CAAG;EAChC,IAAI,CAAChB,GAAG;EACR,IAAMhG,IAAOgG,EAAE,IAAI,KAAK,GAAI,MAAM;GAChC,IAAMjC,IAAI,KAAK,KAAK0O,CAAE,GAChB,IAAIxS,MAAM,IAAI+F,EAAE,EAAE,IAAI,GACtB+D,IAAI9J,MAAM+F,EAAE,IAAI,SAAS,IAAIA,EAAE,EAAE,IAAIvH,GAAKsF,EAAE,IAAc,GAC1D,CAACoP,GAAM7I,KAAQ1M,EAAUmG,EAAE,MAAgB,CAAC,GAC5C,CAACe,GAAK8M,KAAShU,EAAU0M,GAAMP,IAAI,CAAC;GAC1C,OAAO,KAAK,SAAShG,GAAG;IAAC,GAAGoP;IAAM,GAAGrO,EAAI,KAAK,MAAOjC,EAAE,MAAM,SAASqK,EAAGrK,CAAC,IAAIA,CAAE;IAAG,GAAG+O;GAAK,CAAC;EAC9F,CAAC;EACD,KAAK,QAAQ5L,EAAE,KAAKhG,GAAMgH,GAAK,EAAE,OAAO,SAAS,CAAC;CACpD;CAEA,kBAAkB;EAChB,IAAMA,IAAM,KAAK,MAAM,IAAI;EAC3B,IAAI,CAACA,GAAK;EACV,IAAMjD,IAAI,KAAK,KAAKiD,EAAI,EAAE,EAAE;EAC5B,IAAI,CAACjD,KAAKiD,EAAI,EAAE,GAAG,SAAS,GAAG,GAAG;EAClC,IAAM,CAACiO,GAAG,KAAKrX,EAAUmG,EAAE,MAAgBiD,EAAI,EAAE,CAAC,GAC5C,CAAClG,GAAGiJ,KAAK,KAAK,MAAMhG,GAAGkR,GAAG,GAAG,EAAK,GAClC6B,IAAK;GAAE,GAAG/M;GAAG,IAAI;GAAM,IAAI;IAAE,GAAIA,EAAE,MAAM,CAAC;IAAI,WAAW;GAAK;EAAE;EACtE,KAAK,QAAQ,CAAC/C,EAAI,EAAE,EAAE,GAAG,CAAClG,GAAGgW,CAAE,GAAG;GAAE,GAAG;IAAE,IAAItY,EAAQwI,EAAI,EAAE,IAAI,CAAC;IAAG,GAAG;GAAE;GAAG,GAAG;IAAE,IAAIxI,EAAQwI,EAAI,EAAE,IAAI,CAAC;IAAG,GAAG;GAAE;EAAE,GAAG;GAAE,OAAO;GAAa,MAAM;EAAK,CAAC;CACxJ;CAGA,YAAY,GAAmB;EAC7B,IAAMA,IAAM,KAAK,MAAM,IAAI;EAC3B,IAAI,CAACA,GAAK;EACV,IAAM,CAACxD,KAAKvF,EAAQ,MAAM+I,CAAG;EAM7B,AALA,KAAK,aAAaA,IAAM,MAAM;GAC5B,IAAInE,EAAE,MAAM,OAAO,OAAOA;GAC1B,IAAM2E,IAAI1F,MAAM,QAAQ,KAAK,WAAWe,EAAE,IAAIf;GAC9C,OAAO;IAAE,GAAGe;IAAG,GAAG,EAAEA,EAAE,IAAI2E,EAAA,CAAG,QAAQ,CAAC;IAAG,GAAG,EAAE3E,EAAE,IAAI2E,EAAA,CAAG,QAAQ,CAAC;IAAG,SAAS;GAAK;EACnF,CAAC,GACD,KAAK,aAAa;GAAE,GAAGhE;GAAG,GAAG;IAAE,GAAGA;IAAG,GAAGA,EAAE,IAAI;GAAE;EAAE;CACpD;CAEA,aAAqB,GAAU,GAA2B;EACxD,IAAM,CAACA,GAAG1E,KAAKb,EAAQ,MAAM+I,CAAG,GAC1BjD,IAAI,KAAK,KAAKP,EAAE,EAAE;EACxB,IAAI,CAACO,KAAKP,EAAE,OAAO1E,EAAE,IAAI;EACzB,IAAM,CAACqU,GAAM7I,KAAQ1M,EAAUmG,EAAE,MAAgBP,EAAE,CAAC,GAC9C,CAACsB,GAAK8M,KAAShU,EAAU0M,GAAMxL,EAAE,IAAI0E,EAAE,CAAC;EAC9C,KAAK,QAAQ,CAACA,EAAE,EAAE,GAAG,CAAC,KAAK,SAASO,GAAG;GAAC,GAAGoP;GAAM,GAAIrO,EAAiB,IAAIoI,CAAE;GAAG,GAAG0E;EAAK,CAAW,CAAC,GAAG5K,GAAK,EAAE,OAAO,QAAQ,CAAC;CAC/H;CAEA,UAAU,GAAU,GAA6B;EAC/C,IAAMsP,IAAQ,MAAM,KAAKS,EAAK,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,MAAMjV,EAAE,KAAK,WAAW,QAAQ,CAAC;EACpF,IAAIwU,EAAM,QAER,OADA,KAAU,aAAaA,GAAOtP,CAAG,GAC1B;EAET,IAAM+I,IAAOgH,EAAK,QAAQ,WAAW;EACrC,IAAI,CAAChH,GAAM,OAAO;EAClB,IAAMiF,IAAQlF,GAAYC,CAAI;EAmB9B,OAlBKiF,EAAM,WACL,YAAY;GAChB,IAAMgC,oBAAQ,IAAI,IAAoB;GACtC,KAAK,IAAMjT,KAAKiR,GAAO,KAAK,IAAMhP,KAAKjC,EAAE,MAAM,AAAIiC,EAAE,MAAM,UAAUA,EAAE,QAAQ,CAACgR,EAAM,IAAIhR,EAAE,IAAI,KAAGgR,EAAM,IAAIhR,EAAE,MAAM,MAAM,KAAK,OAAO,KAAK,aAAaA,EAAE,IAAI,CAAC;GAChK,IAAMiR,IAAQjC,EAAM,KAAK,MAAMjR,EAAE,KAAK,KAAK,MAAOiC,EAAE,MAAM,UAAUA,EAAE,OAAO;IAAE,GAAGA;IAAG,IAAIgR,EAAM,IAAIhR,EAAE,IAAI;GAAE,IAAIA,CAAE,CAAW,GACtHkR,KAAa,MAAc,KAAK,OAAO,MAAM,MAAM1T,EAAE,KAAK,YAAY,MAAM,WAAWd,GAAG,CAAC,EAAE,IAC7FwD,IAAQ8O,EAAM,KAAK,MAAM;IAC7B,IAAKjR,EAAE,WAAYA,EAAE,MACrB,QAAQ,MAAiB;KACvB,IAAMuR,IAAgB,EAAE,GAAI/V,EAAE,MAAM,CAAC,EAAG,GAClCgE,IAAIQ,EAAE,UAAUmT,EAAUnT,EAAE,OAAO,IAAI,KAAA;KAG7C,OAFIR,MAAG,EAAG,QAAQA,IACdQ,EAAE,SAAM,EAAG,OAAOA,EAAE,OACjB;MAAE,GAAGxE;MAAG;MAAI,KAAKgE,KAAKhE,EAAE;MAAK,QAAQ;KAAK;IACnD;GACF,CAAC;GACD,GAAa,MAAMyH,GAAKiQ,GAAO,EAAE,OAAO,QAAQ,GAAG/Q,CAAyD;EAC9G,EAAA,CAAG,GACI,MAlBmB;CAmB5B;CAKA,MAAM,WAAW,GAAkB;EACjC,IAAMc,IAAM,KAAK,MAAM,IAAI;EAC3B,IAAI,CAACA,GAAK;EACV,IAAI8H,IAAK,KAAK,OAAO,MAAM,MAAMtL,EAAE,UAAUiS,CAAI,CAAC,EAAE;EACpD,IAAI,CAAC3G,GAAI;GACP,IAAM9I,IAAI,MAAM,KAAK,OAAO,KAAK,cAAcyP,CAAI;GAGnD,AAFA,KAAK,SAASzP,EAAE,QAChB,KAAK,WAAWA,EAAE,MAAM,GACxB,IAAKA,EAAE;EACT;EACA,AAAI8I,KAAI,KAAK,QAAQ,EAAE,OAAOA,EAAG,GAAG,CAAC,GAAG9H,CAAG;CAC7C;CAKA,aAAa,GAAY,GAAW;EAClC,IAAMA,IAAM;GAAE,GAAG;IAAE;IAAI;GAAE;GAAG,GAAG;IAAE;IAAI,GAAGE,IAAI;GAAE;EAAE;EAEhD,AADA,KAAK,MAAM,QAAQF,CAAG,GACtB,KAAK,YAAYA,CAAG;CACtB;CAEA,WAA+B;EAC7B,IAAMA,IAAM,KAAK,MAAM,IAAI,GACrBmQ,IAAMnQ,KAAO,KAAK,MAAMA,CAAG,CAAC,EAAE;EACpC,OAAOmQ,IAAM;GAAE,GAAG;IAAE,IAAIA,EAAI;IAAI,GAAGA,EAAI;GAAE;GAAG,GAAG;IAAE,IAAIA,EAAI;IAAI,GAAGA,EAAI,IAAI;GAAE;EAAE,IAAI;CAClF;CAEA,WAAmB,GAA0C;EAC3D,IAAMnQ,IAAM,KAAK,SAAS;EAC1B,AAAKA,MACL,KAAK,aAAaA,IAAM,MAAOnE,EAAE,MAAM,QAAQqK,EAAGrK,CAAC,IAAIA,CAAE,GACzD,KAAK,aAAamE;CACpB;CAGA,aAAa,GAAW,GAAW;EACjC,KAAK,YAAY,OAAO;GAAE,GAAGnE;GAAG,GAAG,CAAC,KAAK,IAAI,GAAGS,CAAC,CAAC,CAAC,QAAQ,CAAC;GAAG,GAAG,CAAC,KAAK,IAAI,GAAGC,CAAC,CAAC,CAAC,QAAQ,CAAC;GAAG,SAAS;EAAK,EAAE;CAChH;CAGA,cAAc,GAAY,GAAY;EACpC,IAAMiE,IAAI,KAAK,IAAI,GAAG,KAAK,WAAW,KAAK,IAAI,GAAG4P,IAAK,GAAI,CAAC;EAC5D,KAAK,aAAaA,IAAK,MAAO5P,GAAG6P,IAAK,MAAO7P,CAAC;CAChD;CAEA,WAAW,GAAa;EACtB,KAAK,YAAY,OAAO;GAAE,GAAG3E;GAAG,KAAKyU,KAAO,KAAA;GAAW,QAAQ;EAAK,EAAE;CACxE;CAEA,MAAM,aAAa,GAAY;EAC7B,IAAMtQ,IAAM,KAAK,SAAS;EAC1B,IAAI,CAACA,GAAK;EACV,IAAMuP,KAAOgB,EAAK,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM,MAAA,CAAO,QAAQ,WAAW,KAAK,CAAC,CAAC,QAAQ,QAAQ,KAAK,GACxF,EAAE,QAAK,YAAS,MAAM,KAAK,OAAO,KAAK,cAAc,MAAMA,EAAK,YAAY,GAAGhB,CAAG,GAClFC,IAAO,MAAMC,GAAUc,CAAI;EAEjC,AADA,KAAK,MAAM,QAAQvQ,CAAG,GACtB,KAAK,YAAY,MAAM;GAErB,IAAMzD,IAAI,EAAEV,EAAE,KAAK2T,EAAK,IAAI,KAAK,IAAI,GAAGA,EAAK,CAAC,GAAA,CAAI,QAAQ,CAAC;GAC3D,OAAO;IAAE,GAAG3T;IAAG,QAAQuB;IAAM;IAAK,MAAM,CAAC,CAACvB,EAAE;IAAK;IAAG,SAAS;GAAK;EACpE,CAAC;CACH;CAGA,kBAAkB;EAChB,IAAMmE,IAAM,KAAK,MAAM,IAAI;EAC3B,AAAIA,KAAO,CAACzI,EAAUyI,CAAG,KAAG5I,GAAS,MAAM4I,GAAK,EAAE;CACpD;CAEA,WAAW,GAAc;EACvB,IAAMA,IAAM,KAAK,MAAM,IAAI;EAC3B,AAAIA,KAAK5I,GAAS,MAAM4I,GAAK9H,CAAI;CACnC;CAKA,aAAa;EACX,IAAI,KAAK,SAAS;GAEhB,AADA,KAAK,UAAU,MACf,KAAK,YAAY,EAAK;GACtB;EACF;EACA,IAAMuQ,IAAK,KAAK,MAAM;EACtB,AAAKA,MACL,KAAK,UAAU;GACb,GAAGA,EAAG;GACN,GAAGA,EAAG;GACN,GAAGA,EAAG,IAAI,WAAW;GACrB,QAAQA,EAAG;GACX,OAAOA,EAAG,SAAS;GACnB,IAAIA,EAAG,MAAM;GACb,IAAIA,EAAG,MAAM;GACb,IAAIA,EAAG;GACP,MAAMA,EAAG,OAAQ,iBAAiB,KAAKA,EAAG,IAAI,CAAC,GAAG,MAAMA,EAAG,OAAQ,KAAA;EACrE,GACA,KAAK,YAAY,EAAI;CACvB;CAGA,eAAwB;EACtB,IAAMlH,IAAM,KAAK,SACXvB,IAAM,KAAK,MAAM,QAAQ;EAC/B,IAAI,CAACuB,KAAO,CAACvB,KAAOzI,EAAUyI,CAAG,GAAG,OAAO;EAE3C,AADA,KAAK,UAAU,MACf,KAAK,YAAY,EAAK;EACtB,IAAMxD,IAAuB,CAAC;EAC9B,KAAK,IAAM,CAACgE,GAAGzC,MAAM,OAAO,QAAQwD,CAAG,GACrC,AAAIf,MAAM,SAAQ,EAA+B,OAAOzC,IAAIzH,EAAQyH,CAAW,IAAI,KAAA,IAC1EyC,MAAM,MAAK,EAA+B,IAAIzC,IAClD,EAA+ByC,KAAKzC,MAAM,OAAO,KAAA,IAAYA;EAGpE,OADA,KAAK,OAAOvB,GAAG+E,CAAG,GACX;CACT;CAIA,MAAM,IAAM,KAAK,MAAM,IAAI,GAAuB;EAChD,IAAI,CAACvB,GAAK,OAAO;EACjB,IAAM,CAACxD,KAAKvF,EAAQ,MAAM+I,CAAG,GACvBjD,IAAI,KAAK,KAAKP,EAAE,EAAE;EACxB,IAAI,CAACO,GAAG,OAAO;EACf,IAAMyT,IAAM7Z,EAAMoG,EAAE,MAAgBxF,EAAUyI,CAAG,IAAIxD,EAAE,IAAIA,EAAE,IAAK,KAAKO,EAAE,IAAc,IAAIP,EAAE,EAAU,GACjGiU,IAAe;GAAE,GAAID,GAAK,KAAK,CAAC;GAAI,GAAIjZ,EAAUyI,CAAG,IAAI,KAAK,MAAM,KAAK,CAAC,IAAI,CAAC;EAAG,GAClF,GAAGlI,KAAKb,EAAQ,MAAM+I,CAAG,GAC3BmQ;EACJ,IAAI3T,EAAE,OAAO1E,EAAE,MAAMA,EAAE,MAAM0E,EAAE,IAAI,GAAG;GACpC,IAAM,GAAGoO,KAAShU,EAAUmG,EAAE,MAAgBP,EAAE,CAAC,GAC3CX,IAAI+O,EAAM;GAChB,AAAI/O,GAAG,MAAM,UAAO,IAAM;IAAE,GAAGA,EAAE;IAAG,GAAGA,EAAE;IAAG,KAAKA,EAAE;IAAK,QAAQA,EAAE;IAAQ,IAAIW,EAAE;IAAI,GAAGA,EAAE;GAAE;EAC7F;EACA,OAAO;GACL,MAAMO,EAAE,IAAI,SAASA,EAAE,GAAG,aAAa,UAAU,CAACA,EAAE,GAAG,WAAWA,EAAE,GAAG,OAAO,KAAA;GAC9E,IAAI0T,EAAG;GACP,MAAOD,GAAuC;GAC9C,SAAShU,EAAE,GAAG,SAAS,GAAG;GAC1B;GACA,GAAG,CAAC,CAACiU,EAAG;GACR,GAAG,CAAC,CAACA,EAAG;GACR,GAAG,CAAC,CAACA,EAAG,KAAKA,EAAG,MAAM;GACtB,QAAQ,CAAC,CAACA,EAAG;GACb,OAAOA,EAAG;GACV,IAAIA,EAAG;GACP,IAAIA,EAAG,MAAM1T,EAAE,UAAU,KAAK;GAC9B,MAAM0T,EAAG,QAAQ1T,EAAE,YAAY,KAAK;GACpC,OAAOA,EAAE,GAAG,SAAS;GACrB,OAAOA,EAAE;GACT,KAAKA,EAAE;GACP,SAAS,KAAK;GACd,SAAS,KAAK;EAChB;CACF;CAEA,UAAkB,GAAiB;EACjC,IAAM0L,IAAKzI,IAAM,KAAK,MAAMA,CAAG,IAAI;EAEnC,AADA,KAAK,UAAUyI,CAAE,GACjB,KAAK,UAAUA,GAAI,OAAO,IAAI;CAChC;CAEA,YAAY,GAAiB;EAE3B,AADIzI,KAAO,KAAK,SAASA,EAAI,EAAE,OAAO,KAAK,KAAK,GAAG,MAAMA,EAAI,EAAE,MAAM,KAAK,KAAK,GAAG,OAAI,KAAK,OAAO,OAClG,KAAK,UAAUA,CAAG;CACpB;AACF;AAIA,SAASyP,GAAU,GAA+C;CAChE,OAAO,IAAI,SAAS,MAAY;EAC9B,IAAMvS,IAAM,IAAI,gBAAgB6H,CAAI,GAC9BoL,IAAM,IAAI,MAAM;EAStB,AARA,EAAI,eAAe;GAEjB,AADA1K,EAAQ;IAAE,GAAG0K,EAAI,gBAAgB;IAAK,GAAGA,EAAI,iBAAiB;GAAI,CAAC,GACnE,IAAI,gBAAgBjT,CAAG;EACzB,GACA,EAAI,gBAAgB;GAElB,AADAuI,EAAQ;IAAE,GAAG;IAAK,GAAG;GAAI,CAAC,GAC1B,IAAI,gBAAgBvI,CAAG;EACzB,GACA,EAAI,MAAMA;CACZ,CAAC;AACH;;AC7gCA,IAAM3I,KAAa;CAAC;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;AAAS,GAEjLoc,KAAe;CACnB;EAAE,OAAO;EAAG,OAAO;CAAS;CAC5B;EAAE,OAAO;EAAM,OAAO;CAAO;CAC7B;EAAE,OAAO;EAAK,OAAO;CAAM;CAC3B;EAAE,OAAO;EAAG,OAAO;CAAS;CAC5B;EAAE,OAAO;EAAK,OAAO;CAAM;CAC3B;EAAE,OAAO;EAAG,OAAO;CAAS;AAC9B,GAGMC,KAAiE;CACrE;EAAE,GAAG;EAAU,OAAO;EAAe,MAAM,CAAC;CAAE;CAC9C;EAAE,GAAG;EAAS,OAAO;EAAS,MAAM,EAAE,UAAU,GAAG;CAAE;CACrD;EAAE,GAAG;EAAY,OAAO;EAAY,MAAM;GAAE,UAAU;GAAI,OAAO;EAAU;CAAE;CAC7E;EAAE,GAAG;EAAM,OAAO;EAAa,MAAM;GAAE,UAAU;GAAI,OAAO;EAAU;CAAE;CACxE;EAAE,GAAG;EAAM,OAAO;EAAa,MAAM;GAAE,UAAU;GAAI,OAAO;EAAU;CAAE;CACxE;EAAE,GAAG;EAAM,OAAO;EAAa,MAAM;GAAE,UAAU;GAAI,OAAO;EAAU;CAAE;CACxE;EAAE,GAAG;EAAM,OAAO;EAAa,MAAM;GAAE,UAAU;GAAI,OAAO;GAAW,WAAW;EAAS;CAAE;CAC7F;EAAE,GAAG;EAAM,OAAO;EAAa,MAAM;GAAE,UAAU;GAAI,OAAO;EAAU;CAAE;CACxE;EAAE,GAAG;EAAM,OAAO;EAAa,MAAM;GAAE,UAAU;GAAI,OAAO;GAAW,WAAW;EAAS;CAAE;AAC/F,GAEMC,KAAU,mJAMhB;AAGA,SAASC,GAAa,GAAqD;CACzE,IAAM/T,IAAIP,GAAG;CACb,IAAKO,GACL,OAAO;EACL,UAAUA,EAAE,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,IAAIA,EAAE,EAAE,CAAC,IAAI,KAAA;EACpD,YAAYA,EAAE,IAAI,MAAM,KAAA;EACxB,WAAWA,EAAE,IAAI,WAAW,KAAA;EAC5B,OAAOA,EAAE,SAAS,CAAC,YAAY,KAAKA,EAAE,MAAM,QAAQ,KAAK,EAAE,CAAC,IAAIA,EAAE,QAAQ,KAAA;EAC1E,YAAYA,EAAE;EACd,YAAY;CACd;AACF;AAUA,SAAgBgU,GAAY,GASzB;CACD,IAAM,EAAE,WAAQ,WAAQ,aAAU7R,GAC5B,CAACuJ,GAAIuI,KAAS7U,EAA6B,IAAI;CACrD,SACE,EAAO,UAAU6U,SACJ;EACX,EAAO,UAAU,KAAA;CACnB,IACC,CAACC,CAAM,CAAC;CACX,IAAMC,IAAOtM,GAAS6D,GAAI,IAAI,GACxB0I,IAAM,CAAC1I,GACP2I,IAAK3I,GAAI,KAAK,KAAK,MAAMA,EAAG,KAAK,CAAC,IAAI,IAAI,KAAA,GAC1C4I,IAAO5I,GAAI,OAAO,KAAK,MAAMA,EAAG,OAAO,GAAG,IAAI,MAAM,IAGpD6H,IAAM,kBAAkB,KAAK,OAAO,YAAc,MAAc,UAAU,WAAW,EAAE,IAAI,MAAM,QACjGgB,IAAkCV,GAAM,KAAK,EAAE,MAAG,UAAO,WAAQ,MAAM;EAC3E,IAAMpU,IAAI+U,EAAO,MAAM,MAAM1V,EAAE,UAAU2E,CAAC,GACpCgR,IAAOhR,MAAM,WAAW,GAAG+G,IAAM+I,EAAI,KAAK9P,EAAE,WAAW,GAAG,IAAI,GAAG+G,IAAM+I,IAAM9P,EAAE,MAAM,CAAC,MAAM,KAAA;EAClG,OAAO;GAAE,OAAOhE,GAAG,MAAM,IAAIgE;GAAK;GAAO;GAAM,OAAO;IAAE,YAAY;IAAM,GAAIA,MAAM,WAAW,CAAC,IAAKsQ,GAAatU,CAAC,KAAKiV;GAAO;GAAG,KAAK,MAAM;EAAE;CACjJ,CAAC;CACD,EACG,QAAQ,MAAM,CAACjV,EAAE,KAAK,CAAC,CACvB,SAAS,GAAG,MAAM8U,EAAU,KAAK;EAAE,OAAO9U,EAAE;EAAI,OAAOA,EAAE;EAAM,OAAOsU,GAAatU,CAAC;EAAG,KAAKvD,MAAM;CAAE,CAAC,CAAC;CACzG,IAAMyY,IAAajJ,GAAI,SAAS6I,EAAU,MAAM,MAAMpR,EAAE,UAAUuI,EAAG,KAAK,IAAIA,EAAG,QAAQA,KAAM,CAACA,EAAG,QAAS8I,EAAO,MAAM,MAAM1V,EAAE,UAAU,QAAQ,CAAC,EAAE,MAAM,KAAM;CAElK,OACE,kBAACsK,IAAD,EAAA,UAAA;EACE,kBAAC5G,GAAD;GAAK,MAAK;GAAO,OAAO,SAASgI,EAAI;GAAK,UAAU,CAAC0J,EAAO;GAAS,eAAeA,EAAO,KAAK;EAAI,CAAA;EACpG,kBAAC1R,GAAD;GAAK,MAAK;GAAO,OAAO,SAASgI,EAAI;GAAK,UAAU,CAAC0J,EAAO;GAAS,eAAeA,EAAO,KAAK;EAAI,CAAA;EACpG,kBAAC1R,GAAD;GAAK,MAAK;GAAQ,OAAM;GAAyC,QAAQL,EAAM;GAAS,UAAUiS;GAAK,eAAeF,EAAO,WAAW;EAAI,CAAA;EAC3IxI,GAAI,WACH,kBAAAjU,GAAA,EAAA,UAAA,CACE,kBAACgL,GAAD,CAAM,CAAA,GACN,kBAACwF,IAAD;GACE,OAAM;GACN,OAAM;GACN,MAAK;GACL,OAAO;IACL;KAAE,OAAO;KAAY,OAAO;KAAoB,MAAM;IAAW;IACjE;KAAE,OAAO;KAAY,OAAO;KAAoB,MAAM;IAAW;IACjE;KAAE,OAAO;KAAW,OAAO;KAAsB,MAAM;IAAU;IACjE;KAAE,OAAO;KAAY,OAAO;KAAuB,MAAM;IAAW;IACpE;KAAE,OAAO;KAAU,OAAO;KAAc,MAAM;KAAU,KAAK;IAAK;IAClE;KAAE,OAAO;KAAU,OAAO;KAAiB,MAAM;IAAS;IAC1D;KAAE,OAAO;KAAY,OAAO;KAAgB,MAAM;IAAQ;GAC5D;GACA,SAAS,MAAMiM,EAAO,QAAQlT,CAAyC;EACxE,CAAA,CACD,EAAA,CAAA;EAEH0K,GAAI,OACH,kBAAAjU,GAAA,EAAA,UAAA;GACE,kBAACgL,GAAD,CAAM,CAAA;GACN,kBAACD,GAAD;IAAK,MAAK;IAAQ,OAAM;IAAU,eAAe0R,EAAO,YAAY,EAAG;GAAI,CAAA;GAC3E,kBAAC,QAAD;IAAM,WAAU;IAAa,OAAO,EAAE,QAAQ,EAAE;IAAhD,UAAA;KACG,KAAK,MAAMxI,EAAG,IAAI,CAAC;KAAE;KAAE,KAAK,MAAMA,EAAG,IAAI,CAAC;KAAE;IACzC;;GACN,kBAAClJ,GAAD;IAAK,MAAK;IAAO,OAAM;IAAS,eAAe0R,EAAO,YAAY,IAAI;GAAI,CAAA;GAC1E,kBAAC1R,GAAD;IAAK,MAAK;IAAM,OAAM;IAAiB,eAAe0R,EAAO,YAAY,KAAK;GAAI,CAAA;GAClF,kBAAC1R,GAAD;IAAK,MAAK;IAAU,OAAM;IAAgB,SAASoS,EAAM;GAAW,CAAA;GACpE,kBAACpS,GAAD;IAAK,MAAK;IAAa,OAAM;IAAgB,SAASoS,EAAM;GAAU,CAAA;GACtE,kBAACpS,GAAD;IAAK,MAAK;IAAM,OAAM;IAAW,QAAQ,CAAC,CAACkJ,EAAG,IAAI;IAAK,SAASkJ,EAAM;GAAM,CAAA;GAC3EA,EAAM,YAAY,kBAACpS,GAAD;IAAK,MAAK;IAAO,OAAM;IAAiB,SAASoS,EAAM;GAAW,CAAA;GACrF,kBAACpS,GAAD;IAAK,MAAK;IAAQ,OAAM;IAAe,eAAe0R,EAAO,gBAAgB;GAAI,CAAA;EACjF,EAAA,CAAA;EAEJ,kBAACzR,GAAD,CAAM,CAAA;EACN,kBAACwB,IAAD;GACE,OAAM;GACN,OAAO;GACP,WAAW;GACX,UAAUmQ;GACV,OAAOO;GACP,aAAY;GACZ,SAASJ;GACT,WAAW,MAAOvT,EAAE,WAAW,GAAG,IAAI,KAAKkT,EAAO,WAAWlT,EAAE,MAAM,CAAC,CAAe,IAAIkT,EAAO,QAAQ,EAAE,OAAOlT,EAAE,CAAC;EACrH,CAAA;EACD,kBAACyB,GAAD,CAAM,CAAA;EACN,kBAACwB,IAAD;GAAQ,OAAM;GAAO,OAAO;GAAK,WAAW;GAAK,UAAUmQ;GAAK,OAAOD;GAAM,aAAY;GAAO,SAASxM,GAAYwM,CAAI;GAAG,WAAW,MAAMD,EAAO,QAAQlT,CAAC;EAAI,CAAA;EACjK,kBAACyB,GAAD,CAAM,CAAA;EACN,kBAACyB,IAAD;GAAS,OAAOmQ;GAAI,UAAUD;GAAK,WAAW,MAAMF,EAAO,QAAQlT,CAAC;EAAI,CAAA;EACxE,kBAACyB,GAAD,CAAM,CAAA;EACN,kBAACD,GAAD;GAAK,MAAK;GAAO,OAAO,SAASgI,EAAI;GAAK,QAAQkB,GAAI;GAAG,UAAU0I;GAAK,eAAeF,EAAO,OAAO,GAAG;EAAI,CAAA;EAC5G,kBAAC1R,GAAD;GAAK,MAAK;GAAS,OAAO,WAAWgI,EAAI;GAAK,QAAQkB,GAAI;GAAG,UAAU0I;GAAK,eAAeF,EAAO,OAAO,GAAG;EAAI,CAAA;EAChH,kBAAC1R,GAAD;GAAK,MAAK;GAAY,OAAO,cAAcgI,EAAI;GAAK,QAAQkB,GAAI;GAAG,UAAU0I;GAAK,eAAeF,EAAO,OAAO,GAAG;EAAI,CAAA;EACtH,kBAAC1R,GAAD;GAAK,MAAK;GAAS,OAAM;GAAgB,QAAQkJ,GAAI;GAAQ,UAAU0I;GAAK,eAAeF,EAAO,OAAO,QAAQ;EAAI,CAAA;EACrH,kBAAC/M,IAAD;GAAU,MAAK;GAAQ,OAAM;GAAa,OAAOuE,GAAI;GAAO,SAAS,MAAMwI,EAAO,SAASlP,CAAC;GAAG,WAAU;EAAa,CAAA;EACtH,kBAACmC,IAAD;GAAU,MAAK;GAAY,OAAM;GAAkB,OAAOuE,GAAI;GAAI,SAASlU;GAAY,SAAS,MAAM0c,EAAO,aAAalP,CAAC;EAAI,CAAA;EAC/H,kBAACvC,GAAD,CAAM,CAAA;EACN,kBAACD,GAAD;GAAK,MAAK;GAAO,OAAO,gBAAgBgI,EAAI;GAAK,QAAQ,CAAC,CAACkB,GAAI;GAAM,UAAU0I;GAAK,SAASjS,EAAM;EAAS,CAAA;EAC5G,kBAACK,GAAD;GAAK,MAAK;GAAQ,OAAM;GAAe,UAAU4R;GAAK,eAAe,KAAK9L,GAAU,CAAC,CAAC,MAAM,MAAM,MAAMvK,EAAE,UAAUmW,EAAO,aAAanW,CAAC,EAAE;EAAI,CAAA;EAC/I,kBAACmK,IAAD;GAAK,MAAK;GAAQ,OAAM;GAAe,UAAUkM,KAAO1I,GAAI;GACxD,WAAA,MAAU,kBAACvD,IAAD,EAAY,SAAS,GAAG,OAAO7F,EAAM,GAAG4R,EAAO,YAAYjS,GAAG+C,CAAC,GAAK,CAAA;EAC7E,CAAA;EACL,kBAACkD,IAAD;GAAK,MAAK;GAAQ,OAAM;GAAqB,UAAUkM;GACnD,WAAA,MACA,kBAAC,OAAD;IAAK,WAAU;IACZ,UAAAN,GAAQ,KAAK,MACZ,kBAAC,UAAD;KAAgB,MAAK;KAAS,OAAO,KAAK9O,EAAE,YAAY,CAAC,CAAC,CAAE,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,GAAG,GAAG;KAAK,gBAAgB1C,EAAM,GAAG4R,EAAO,WAAWlP,CAAC;KACpJ,UAAAA;IACK,GAFKA,CAEL,CACT;GACE,CAAA;EAEJ,CAAA;EACL,kBAACvC,GAAD,CAAM,CAAA;EACN,kBAACD,GAAD;GAAK,MAAK;GAAY,OAAM;GAAa,QAAQkJ,GAAI,UAAU;GAAQ,UAAU0I;GAAK,eAAeF,EAAO,QAAQ,EAAE,OAAO,OAAO,GAAG,EAAE,OAAO,OAAO,CAAC;EAAI,CAAA;EAC5J,kBAAC1R,GAAD;GAAK,MAAK;GAAc,OAAM;GAAS,QAAQkJ,GAAI,UAAU;GAAU,UAAU0I;GAAK,eAAeF,EAAO,QAAQ,EAAE,OAAO,SAAS,GAAG,EAAE,OAAO,SAAS,CAAC;EAAI,CAAA;EAChK,kBAAC1R,GAAD;GAAK,MAAK;GAAa,OAAM;GAAc,QAAQkJ,GAAI,UAAU;GAAS,UAAU0I;GAAK,eAAeF,EAAO,QAAQ,EAAE,OAAO,QAAQ,GAAG,EAAE,OAAO,QAAQ,CAAC;EAAI,CAAA;EACjK,kBAAC1R,GAAD;GAAK,MAAK;GAAU,OAAM;GAAU,QAAQkJ,GAAI,UAAU;GAAW,UAAU0I;GAAK,eAAeF,EAAO,QAAQ,EAAE,OAAO,UAAU,GAAG,EAAE,OAAO,UAAU,CAAC;EAAI,CAAA;EAChK,kBAACxR,GAAD;GACE,OAAM;GACN,MAAK;GACL,OAAO;GACP,WAAW;GACX,UAAU0R;GACV,OAAOE;GACP,SAASV;GACT,WAAW,MAAMM,EAAO,QAAQ,EAAE,MAAMlT,EAAE,GAAG;IAAE,MAAMA;IAAG,UAAU;GAAO,CAAC;EAC3E,CAAA;EACD,kBAACyB,GAAD,CAAM,CAAA;EACN,kBAACD,GAAD;GAAK,MAAK;GAAU,OAAM;GAAgB,QAAQkJ,GAAI,QAAQ;GAAU,UAAU0I;GAAK,eAAeF,EAAO,WAAW,QAAQ;EAAI,CAAA;EACpI,kBAAC1R,GAAD;GAAK,MAAK;GAAU,OAAM;GAAgB,QAAQkJ,GAAI,QAAQ;GAAU,UAAU0I;GAAK,eAAeF,EAAO,WAAW,QAAQ;EAAI,CAAA;EACpI,kBAAC1R,GAAD;GAAK,MAAK;GAAU,OAAM;GAA8B,UAAU4R;GAAK,eAAeF,EAAO,OAAO,EAAE;EAAI,CAAA;EAC1G,kBAAC1R,GAAD;GAAK,MAAK;GAAS,OAAM;GAAwB,UAAU4R;GAAK,eAAeF,EAAO,OAAO,CAAC;EAAI,CAAA;EAClG,kBAACzR,GAAD,CAAM,CAAA;EACN,kBAACD,GAAD;GAAK,MAAK;GAAM,OAAM;GAAc,QAAQkJ,GAAI,OAAO;GAAO,UAAU0I;GAAK,eAAeF,EAAO,OAAO,EAAE,IAAIxI,GAAI,OAAO,QAAQ,KAAA,IAAY,MAAM,GAAG,EAAE,IAAIA,GAAI,OAAO,QAAQ,OAAO,MAAM,CAAC;EAAI,CAAA;EACnM,kBAAClJ,GAAD;GAAK,MAAK;GAAM,OAAM;GAAY,QAAQkJ,GAAI,OAAO;GAAO,UAAU0I;GAAK,eAAeF,EAAO,OAAO,EAAE,IAAIxI,GAAI,OAAO,QAAQ,KAAA,IAAY,MAAM,GAAG,EAAE,IAAIA,GAAI,OAAO,QAAQ,OAAO,MAAM,CAAC;EAAI,CAAA;EACjM,kBAAClJ,GAAD;GAAK,MAAK;GAAY,OAAO,eAAegI,EAAI;GAAS,UAAU4J,KAAO1I,GAAI;GAAS,eAAewI,EAAO,gBAAgB;EAAI,CAAA;EACjI,kBAAC1R,GAAD;GAAK,MAAK;GAAQ,OAAO,qBAAqBgI,EAAI;GAAM,UAAU4J;GAAK,eAAeF,EAAO,YAAY;EAAI,CAAA;EAC7G,kBAACzR,GAAD,CAAM,CAAA;EACN,kBAACD,GAAD;GAAK,MAAK;GAAU,OAAM;GAAmB,QAAQL,EAAM;GAAS,SAASA,EAAM;EAAY,CAAA;EAC/F,kBAACK,GAAD;GAAK,MAAK;GAAS,OAAO,mBAAmBgI,EAAI;GAAK,SAASrI,EAAM;EAAS,CAAA;CACrE,EAAA,CAAA;AAEf;;ACpMA,SAAgB0S,GAAQ,GAcrB;CACD,IAAM7V,IAAMC,EAAyB,IAAI,GACnC,CAAC6V,GAAKC,KAAU3V,EAAS,EAAE,GAC3B,CAAC4V,GAASC,KAAc7V,EAAS,CAAC,CAAC+C,EAAM,OAAO;CAKtD,OAJA3D,QAAgB;EAEd,AADAQ,EAAI,SAAS,MAAM,GACnBA,EAAI,SAAS,OAAO;CACtB,GAAG,CAAC,CAAC,GAEH,kBAAC,OAAD;EAAK,WAAU;EAAU,MAAK;EAAS,YAAY,MAAMjE,EAAE,QAAQ,YAAYoH,EAAM,QAAQ;EAA7F,UAAA;GACE,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,kBAAC,SAAD;MACO;MACL,OAAOA,EAAM;MACb,aAAaA,EAAM,eAAe;MAClC,cAAW;MACX,WAAW,MAAMA,EAAM,QAAQpH,EAAE,OAAO,KAAK;MAC7C,YAAY,MAAM;OAChB,AAAIA,EAAE,QAAQ,YACZA,EAAE,eAAe,GACjBoH,EAAM,MAAMpH,EAAE,WAAW,KAAK,CAAC;MAEnC;KACD,CAAA;KACD,kBAAC,QAAD;MAAM,WAAU;MAAiB,UAAAoH,EAAM,QAASA,EAAM,QAAQ,GAAG,KAAK,IAAIA,EAAM,QAAQ,GAAGA,EAAM,KAAK,EAAE,KAAKA,EAAM,UAAU,UAAW;KAAS,CAAA;KACjJ,kBAACK,GAAD;MAAK,MAAK;MAAK,OAAM;MAAyB,eAAeL,EAAM,MAAM,EAAE;MAAG,UAAU,CAACA,EAAM;KAAQ,CAAA;KACvG,kBAACK,GAAD;MAAK,MAAK;MAAO,OAAM;MAAe,eAAeL,EAAM,MAAM,CAAC;MAAG,UAAU,CAACA,EAAM;KAAQ,CAAA;KAC7FA,EAAM,YAAY,kBAACK,GAAD;MAAK,OAAM;MAAI,OAAM;MAAU,QAAQwS;MAAS,eAAeC,GAAY,MAAM,CAACjU,CAAC;KAAI,CAAA;KAC1G,kBAACwB,GAAD;MAAK,MAAK;MAAQ,OAAM;MAAc,SAASL,EAAM;KAAU,CAAA;IAC5D;;GACJA,EAAM,WAAW,kBAAC,OAAD;IAAK,WAAU;IAA4B,UAAAA,EAAM;GAAa,CAAA;GAC/EA,EAAM,YAAY6S,KACjB,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,kBAAC,SAAD;MAAO,OAAOF;MAAK,aAAY;MAAe,cAAW;MAAe,WAAW,MAAMC,EAAO,EAAE,OAAO,KAAK;KAAI,CAAA;KAClH,kBAAC,UAAD;MAAQ,MAAK;MAAS,WAAU;MAAS,UAAU,CAAC5S,EAAM;MAAO,eAAeA,EAAM,UAAU2S,GAAK,EAAK;MAAG,UAAA;KAErG,CAAA;KACR,kBAAC,UAAD;MAAQ,MAAK;MAAS,WAAU;MAAS,UAAU,CAAC3S,EAAM;MAAO,eAAeA,EAAM,UAAU2S,GAAK,EAAI;MAAG,UAAA;KAEpG,CAAA;IACL;;EAEJ;;AAET;;AC/DA,IAAMI,MAAS,MAAmB/F,EAAK,KAAK,MAAOlN,EAAE,MAAM,UAAUA,EAAE,MAAM,QAASA,EAAE,EAAE,SAAS,KAAKA,EAAE,OAAQ,EAAG,CAAC,CAAC,KAAK,EAAE,GAExHkT,MAAY,MAChB3F,EACG,QAAQ,MAAsBxJ,EAAE,MAAM,GAAG,CAAC,CAC1C,KAAK,MAAMkP,GAAMlV,EAAE,IAAI,CAAC,CAAC,CACzB,KAAK,GAAG,CAAC,CACT,QAAQ,QAAQ,GAAG,CAAC,CACpB,KAAK;AAGV,SAAgBoV,GAAW,GAAyB;CAClD,IAAM7Z,IAAgB,CAAC;CACvB,KAAK,IAAMyK,KAAKwJ,GACd,IAAIxJ,EAAE,MAAM,KAAK,EAAI,MAAMA,EAAE,SAASA,EAAE,OAAO,QAAQA,EAAE,OAAO,MAAM,MAAO,OAAO,MAAMkP,GAAMlP,EAAE,IAAI,CAAC;MAClG,IAAIA,EAAE,MAAM,OAAO,KAAK,IAAM0H,KAAO1H,EAAE,MAAM,EAAI,KAAK0H,EAAI,MAAM,KAAK,MAAMyH,GAASnQ,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,GAAI,CAAC;CAEhH,OAAOzJ,EAAI,KAAK,IAAI,IAAI;AAC1B;AAEA,IAAM8Z,MAAS,MAAc5V,EAAE,QAAQ,mBAAmB,MAAM;AAGhE,SAAS/H,GAAS,GAAgB,IAAU,IAAe;CACzD,IAAI6D,IAAM,IACNW,IAAI;CACR,OAAOA,IAAIiT,EAAK,SAAQ;EACtB,IAAMlN,IAAIkN,EAAKjT;EACf,IAAI+F,EAAE,MAAM,UAAUA,EAAE,MAAM,OAAO;GACnC;GACA;EACF;EACA,IAAIA,EAAE,MAAM,UAAUA,EAAE,MAAM;GAE5B,IAAI9G,IAAO,IACLyX,IAAO3Q,EAAE;GACf,OAAO/F,IAAIiT,EAAK,UAAUA,EAAKjT,EAAE,CAAC,MAAM,UAAWiT,EAAKjT,EAAE,CAAuB,SAAS0W,IAAM,KAASzD,EAAK,IAAI,CAAsB;GACxI,KAAO,IAAIkG,GAAMla,CAAI,EAAE,IAAIyX,EAAK,QAAQ,WAAW,kBAAkB,EAAE;GACvE;EACF;EAEA,IADA,KACI3Q,EAAE,EAAE,QAAQ;EAChB,IAAM9G,IAAO8G,EAAE,KAAK,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,OAAO,MAAM,GACvDsT,IAAOpa,EAAK,KAAK;EACvB,IAAI,CAACoa,GAAM;GACT,KAAOpa;GACP;EACF;EACA,IAAMqa,KAAQvT,EAAE,EAAE,KAAK,CAACwT,IAAU,OAAO,OAAOxT,EAAE,EAAE,KAAK,CAACwT,IAAU,MAAM,KACpEC,IAASzT,EAAE,EAAE,SAAS,OAAO,IAC7B0T,IAAOxa,EAAK,MAAM,GAAGA,EAAK,QAAQoa,EAAK,EAAE,CAAC,GAC1CK,IAAQza,EAAK,MAAMA,EAAK,YAAYoa,EAAKA,EAAK,SAAS,EAAE,IAAI,CAAC;EACpE,KAAO,GAAGI,IAAOD,IAASF,IAAOH,GAAME,CAAI,IAAI,CAAC,GAAGC,CAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,IAAIE,IAASE;CACzF;CACA,OAAOra,EAAI,QAAQ,aAAa,EAAE;AACpC;AAEA,SAASsa,GAAQ,GAAkB;CACjC,IAAMvI,IAAO5R,EAAE,KAAK,KAAK,MAAMuG,EAAE,MAAM,KAAK,MAAMkT,GAASnQ,EAAE,MAAM,CAAC,CAAC,QAAQ,OAAO,KAAK,KAAK,GAAG,CAAC;CAClG,IAAI,CAACsI,EAAK,QAAQ,OAAO;CACzB,IAAM,IAAI,KAAK,IAAI,GAAGA,EAAK,KAAK,MAAMrL,EAAE,MAAM,CAAC,GACzCqS,KAAQ,MAAgB,KAAK,MAAM,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAMrS,EAAEwB,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE;CAChG,OAAO;EAAC6Q,EAAKhH,EAAK,EAAE;EAAG,IAAI,SAAS,OAAO,CAAC;EAAK,GAAGA,EAAK,MAAM,CAAC,CAAC,CAAC,IAAIgH,CAAI;CAAC,CAAC,CAAC,KAAK,IAAI;AACxF;AAGA,SAAgBwB,GAAe,GAAyB;CACtD,IAAMva,IAAgB,CAAC,GACnBwa,IAAW;CACf,KAAK,IAAM/P,KAAKwJ,GAAQ;EACtB,IAAIxJ,EAAE,MAAM,OAAO;GAEjB,AADAzK,EAAI,KAAKsa,GAAQ7P,CAAC,GAAG,EAAE,GACvB,IAAW;GACX;EACF;EACA,IAAIA,EAAE,MAAM,KAAK;EACjB,IAAMgQ,IAAMhQ,EAAE,GAAG,SACXyP,IAAUO,MAAQ,KAAA,KAAaA,IAAM,GACrC7a,IAAOzD,GAASsO,EAAE,MAAMyP,CAAO,CAAC,CAAC,KAAK;EAC5C,IAAIzP,EAAE,QAAQ;GACZ,IAAM9L,IAAU,wBAAwB,KAAK8L,EAAE,OAAO,KAAK,KAAK,CAAC,GAC3D9I,IAAQ,KAAK,IAAI,GAAG,KAAK,QAAQ8I,EAAE,GAAG,QAAQ,MAAM,MAAM,EAAE,CAAC;GAGnE,AAFI,CAAC+P,KAAYxa,EAAI,UAAUA,EAAIA,EAAI,SAAS,OAAO,MAAIA,EAAI,KAAK,EAAE,GACtEA,EAAI,KAAK,GAAG,MAAM,OAAO2B,CAAK,IAAIhD,IAAU,OAAO,IAAI,GAAGiB,GAAM,GAChE,IAAW;EAEb,OAGA,AAFI4a,KAAUxa,EAAI,KAAK,EAAE,GACzB,IAAW,IACNJ,KACLI,EAAI,KAAKka,IAAU,GAAG,IAAI,OAAOO,IAAM,CAAC,EAAE,GAAG7a,MAASA,GAAM,EAAE;CAChE;CACA,OAAOI,EAAI,KAAK,IAAI,CAAC,CAAC,QAAQ,WAAW,MAAM,CAAC,CAAC,KAAK,IAAI;AAC5D;AAIA,IAAM0a,MAAY,MAChBva,IACIA,EAAE,MACC,KAAK,OAAOsE,EAAE,SAASA,EAAE,OAAO,OAAO,MAAM,MAAMA,EAAE,KAAK,KAAK,MAAOiC,EAAE,KAAK,OAAOA,EAAE,IAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CACtG,QAAQ,MAAMiP,EAAE,KAAK,CAAC,CAAC,CACvB,KAAK,IAAI,IACZ;AAGN,SAAgBgF,GAAa,GAA8B;CACzD,IAAM3a,IAAgB,CAAC;CACvB,KAAK,IAAMkE,KAAK0W,GAAQ;EACtB,EAAI,KAAK,SAAS1W,EAAE,QAAQ,KAAK,EAAE;EACnC,KAAK,IAAMJ,KAAMI,EAAE,KACjB,IAAIJ,EAAG,MAAM,SAAS;GACpB,IAAM3D,IAAIua,GAAS5W,EAAG,IAAI;GAC1B,AAAI3D,KAAGH,EAAI,KAAKG,GAAG,EAAE;EACvB,OAAO,IAAI2D,EAAG,MAAM,SAAS;GAC3B,KAAK,IAAMqO,KAAOrO,EAAG,MAAM,EAAI,KAAKqO,EAAI,MAAM,QAAQ,MAAM,CAAC1I,EAAE,MAAM,CAAC,CAAC,KAAK,MAAMiR,GAASjR,EAAE,IAAI,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,CAAC,KAAK,GAAI,CAAC;GACnI,EAAI,KAAK,EAAE;EACb;EAGF,AADIvF,EAAE,OAAO,KAAK,KAAGlE,EAAI,KAAK,UAAUkE,EAAE,MAAM,KAAK,GAAG,EAAE,GAC1DlE,EAAI,KAAK,EAAE;CACb;CACA,OAAOA,EAAI,KAAK,IAAI,CAAC,CAAC,QAAQ,WAAW,MAAM,CAAC,CAAC,KAAK,IAAI;AAC5D;AAKA,SAAgB6a,GAAM,GAAkB,IAAM,KAAa;CACzD,IAAM5a,KAAK,MAAewF,EAAE,SAASqV,CAAG,KAAK,UAAU,KAAKrV,CAAC,KAAK,UAAU,KAAKA,CAAC,IAAI,IAAIA,EAAE,QAAQ,MAAM,MAAI,EAAE,KAAKA;CACrH,OAAOsM,EAAK,KAAK,MAAMrL,EAAE,IAAIzG,CAAC,CAAC,CAAC,KAAK6a,CAAG,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI;AAC5D;;AC1HA,IAAMxK,MAAM,MAA2B7K,IAAI,GAAG,CAACA,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAA,GAE5DsV,KAAwE;CAC5E,QAAQ;CAAU,QAAQ;CAAU,aAAa;CAAU,MAAM;CAAU,aAAa;CAAU,UAAU;CAC5G,MAAM;CAAQ,WAAW;CAAQ,YAAY;AAC/C;AAEA,SAAgBC,GAAO,GAAwC;CAC7D,IAAMzO,IAAqB,CAAC;CAC5B,IAAI,CAACrI,GAAG,OAAOqI;CAGf,AAFIrI,EAAE,IAAG,EAAI,aAAa,MACjBA,EAAE,MAAM,OAAO,EAAI,aAAa,MACrCA,EAAE,IAAG,EAAI,YAAY,WAChBA,EAAE,MAAM,OAAO,EAAI,YAAY;CACxC,IAAMgB,IAAIhB,EAAE,KAAKA,EAAE,MAAM,QACnBkM,IAAO,CAAClL,IAAI,cAAc,IAAIhB,EAAE,UAAUA,EAAE,UAAU,iBAAiB,EAAE,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAazG,OAZIkM,IAAM,EAAI,iBAAiBA,KACtBlM,EAAE,MAAM,UAAUA,EAAE,WAAW,QAAO,EAAI,iBAAiB,SAChEgB,KAAK6V,GAAgB7W,EAAE,OAAK,EAAI,sBAAsB6W,GAAgB7W,EAAE,KACxEA,EAAE,YAAS,EAAI,sBAAsB,WACrCA,EAAE,UAAO,EAAI,QAAQA,EAAE,QACvBA,EAAE,OAAI,EAAI,WAAW,GAAGA,EAAE,KAAKA,EAAE,KAAK,MAAOA,EAAE,GAAG,MAClDA,EAAE,SAAM,EAAI,aAAaA,EAAE,QAC3BA,EAAE,MAAMA,EAAE,SAAK,EAAI,aAAaA,EAAE,MAAMA,EAAE,MAC1CA,EAAE,OAAI,EAAI,gBAAgBA,EAAE,OAAO,QAAQ,UAAU,QACrDA,EAAE,SAAM,EAAI,gBAAgB,cAC5BA,EAAE,cAAW,EAAI,cAAc,eAC/BA,EAAE,YAAS,EAAI,gBAAgB,GAAGA,EAAE,QAAQ,MACzCqI;AACT;AAEA,SAAS0O,GAAW,GAA4C;CAI9D,OAHKC,EAAG,OACJA,EAAG,aAAa,UAAgB,GAAGA,EAAG,KAAK,MAC3CA,EAAG,aAAa,YAAkB,OAAOA,EAAG,KAAK,eAC9C,EAAEA,EAAG,OAAO,KAAA,CAAM,QAAQ,CAAC,IAHb;AAIvB;AAKA,SAAgBC,GAAW,GAAsB,GAAyB,GAAkC;CAI1G,OAHI,CAAC1W,KAAKA,EAAE,MAAM,OAAO,CAACA,EAAE,GAAG,aAAmB,MACxCjE,GAAM,MAAM,OAAOA,EAAK,QAAQiE,EAAE,MAAM,MAAM,OAC9C/D,GAAM,MAAM,OAAOA,EAAK,QAAQ+D,EAAE,MAAM,MAAM;AAE1D;AAEA,SAAS2W,GAAQ,GAAe,GAA4B;CAC1D,IAAM7O,IAAqB;EACzB,YAAY8O,EAAG,SAAS,GAAG,IAAI,KAAA,IAAY/K,GAAG4K,EAAG,MAAM;EACvD,eAAeG,EAAG,SAAS,GAAG,IAAI,KAAA,IAAY/K,GAAG4K,EAAG,KAAK;EACzD,aAAa5K,GAAG4K,EAAG,IAAI;EACvB,cAAc5K,GAAG4K,EAAG,IAAI;EACxB,YAAY5K,GAAG4K,EAAG,QAAQ;EAC1B,WAAWA,EAAG;EACd,YAAYD,GAAWC,CAAE;CAC3B;CACA,AAAIA,EAAG,QAAK,EAAI,aAAaA,EAAG;CAChC,IAAMzQ,KAAK,MAA0BlH,IAAI,GAAGA,EAAE,EAAE,KAAKA,EAAE,MAAM,GAAGA,EAAE,UAAU,KAAA;CAK5E,OAJI2X,EAAG,SAAM,EAAI,YAAYzQ,EAAEyQ,EAAG,IAAI,IAClCA,EAAG,YAAS,EAAI,eAAezQ,EAAEyQ,EAAG,OAAO,IAC3CA,EAAG,UAAO,EAAI,aAAazQ,EAAEyQ,EAAG,KAAK,IACrCA,EAAG,WAAQ,EAAI,cAAczQ,EAAEyQ,EAAG,MAAM,IACrC3O;AACT;AAEA,SAAS+O,GAAI,EAAE,QAAK,WAAQ,MAAG,MAAG,UAA+E;CAC/G,IAAM1W,IAAMD,GAAY4W,EAAI,QAAQ5V,GAAQ,CAAC4V,EAAI,SAAS,GACpD5X,IAAO;EAAE,OAAO,GAAGK,EAAE;EAAK,QAAQ,GAAGC,EAAE;CAAI;CASjD,OARIsX,EAAI,aAAa,CAAC3W,IAAY,kBAAC,QAAD;EAAM,WAAU;EAAiB,OAAO;GAAE,GAAGjB;GAAM,aAAa;EAAO;CAAI,CAAA,IACzGiB,MAAQ,gBAER,kBAAC,QAAD;EAAM,WAAU;EAAiB,OAAOjB;EAAM,OAAOgC;EAArD,UAAA,CACGA,EAAO,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,YAAY,GAAE,QACpC;C,KAGH,kBAAC,OAAD;EAAK,KAAKf;EAAK,KAAKoT,KAAO;EAAI,OAAO;GAAE,GAAGrU;GAAM,eAAe;GAAU,SAAS;EAAe;EAAG,WAAW;CAAQ,CAAA;AACjI;AAEA,SAAS6X,GAAW,EAAE,MAAG,QAAK,QAA0D;CACtF,IAAMC,IAAM;EAAE,UAAU7T;EAAG,YAAY;EAAI,iBAAiB,GAAI,YAAmB,KAAA;CAAU;CAC7F,QAAQrE,EAAE,GAAV;EACE,KAAK,QAAQ;GACX,IAAMmY,IACJ,kBAAC,QAAD;IAAM,UAAQ9T;IAAG,OAAOoT,GAAOzX,EAAE,CAAC;IAC/B,UAAAA,EAAE;GACC,CAAA;GAER,OAAOA,EAAE,QAAQ,CAACgY,EAAI,aAAa,CAACA,EAAI,WACtC,kBAAC,KAAD;IAAG,MAAMhY,EAAE;IAAM,QAAQA,EAAE,KAAK,WAAW,GAAG,IAAI,KAAA,IAAY;IAAU,KAAI;IACzE,UAAAmY;GACA,CAAA,IAEHA;EAEJ;EACA,KAAK,SAAS;GACZ,IAAMjW,IAAIlC,EAAE,SAAS,SAAUgY,EAAI,QAAQ,IAAIA,EAAI,OAAO,IAAI,IAAKA,EAAI,SAAS;GAChF,OACE,kBAAC,QAAD;IAAM,GAAIE;IAAK,OAAOT,GAAOzX,EAAE,CAAC;IAC7B,UAAAkC;GACG,CAAA;EAEV;EACA,KAAK,OACH,OACE,kBAAC,QAAD;GAAM,GAAIgW;GAAK,OAAOT,GAAOzX,EAAE,CAAC;GAC7B,UAAAA,EAAE;EACC,CAAA;EAEV,KAAK,OAAO;GACV,IAAMsU,IAAM,kBAACyD,IAAD;IAAU;IAAK,QAAQ/X,EAAE;IAAQ,GAAGA,EAAE;IAAG,GAAGA,EAAE;IAAG,KAAKA,EAAE;GAAM,CAAA;GAC1E,OACE,kBAAC,QAAD;IAAM,GAAIkY;IACP,UAAAlY,EAAE,QAAQ,CAACgY,EAAI,aAAa,CAACA,EAAI,WAChC,kBAAC,KAAD;KAAG,MAAMhY,EAAE;KAAM,QAAO;KAAS,KAAI;KAClC,UAAAsU;IACA,CAAA,IAEHA;GAEE,CAAA;EAEV;EACA,KAAK,OACH,OACE,kBAAC,QAAD;GACE,GAAI4D;GACJ,WAAU;GACV,OAAO;IAAE,OAAOlY,EAAE,IAAI,GAAGA,EAAE,EAAE,MAAM,KAAA;IAAW,WAAWA,EAAE,IAAI,GAAGA,EAAE,EAAE,MAAM,KAAA;IAAW,YAAYA,EAAE;IAAM,QAAQA,EAAE;GAAO;GAE3H,UAAAA,EAAE,OAAO,KAAK,GAAG,MAChB,kBAACoY,IAAD;IAAmB,OAAOlR;IAAQ;GAAM,GAAxB9J,CAAwB,CACzC;EACG,CAAA;EAEV,KAAK,SACH,OAAO4C,EAAE,QACP,kBAAC,QAAD;GAAM,GAAIkY;GAAK,WAAU;GAAQ,OAAO;IAAE,OAAO,GAAGlY,EAAE,EAAE;IAAK,QAAQ,GAAGA,EAAE,EAAE;GAAI;GAC7E,UAAAA,EAAE;EACC,CAAA,IAEN,kBAAC,QAAD,EAAM,GAAIkY,EAAM,CAAA;CAEtB;AACF;AAEA,SAASG,GAAS,EAAE,MAAG,QAAK,OAAI,SAAkE;CAChG,IAAMC,IAAOpX,EAAE,GAAG,YAAYA,EAAE,GAAG,WAAW,IAAI,CAACA,EAAE,GAAG,WAAW,GAC7DqX,IAAUrX,EAAE,KAAK,SAAS,GAC1B8S,IAAQ6D,GAAQ3W,EAAE,IAAI4W,CAAE;CAC9B,AAAKS,MACH,EAAM,WAAWxL,GAAG7L,EAAE,MAAM,GACxBA,EAAE,aAAU,EAAM,aAAaA,EAAE;CAEvC,IAAMsX,IAAWR,EAAI,YAAYpI,MAAO,KAAA,GACpCvL,IAAI,GACFgM,IAAOnP,EAAE,KAAK,KAAK,GAAG,MAAM;EAChC,IAAMoM,IAAO,kBAAC2K,IAAD;GAAuB;GAAQ;GAAQ;EAAI,GAA1B7a,CAA0B;EAExD,OADA,KAAK4C,EAAE,MAAM,SAASA,EAAE,KAAK,SAAS,GAC/BsN;CACT,CAAC;CACD,OACE,kBAAC,OAAD;EAAK,WAAU;EAAc;EAAO,WAASsC;EAAI,iBAAiBoI,EAAI,YAAY,CAACQ,IAAW,KAAQ,KAAA;EAAtG,UAAA;GACGtX,EAAE,UACD,kBAAC,QAAD;IAAM,WAAU;IAAY,iBAAiB,GAAI,YAAmB,KAAA;IAAW,OAAO;KAAE,GAAGuW,GAAOvW,EAAE,OAAO,CAAC;KAAG,UAAUA,EAAE,OAAO,OAAOoX,IAAO,GAAGA,EAAK,MAAM,KAAA;IAAU;IAAxK,UAAA,CACGpX,EAAE,OAAO,MACTA,EAAE,OAAO,OAAO,CAACoX,IAAO,MAAO,EAC5B;;GAEPjI;GACA,CAACkI,MACCC,IACC,kBAAC,QAAD;IAAM,UAAQ;IAAG,cAAW;IACzB,UAAA;GACG,CAAA,IAEN;EAED;;AAET;AAEA,SAAS3f,GAAU,EAAE,MAAG,QAAK,SAAiD;CAC5E,IAAMoO,IAAQrK,EAAE,KAAK,QAAQ,GAAG,MAAMqB,IAAIiJ,GAAG,CAAC,GACxC8M,IAAuB,EAAE,OAAO/M,IAAQ,GAAGA,EAAM,MAAM,OAAO;CAIpE,OAHIrK,EAAE,UAAU,WAAU,EAAM,SAAS,WAChCA,EAAE,UAAU,UAAS,EAAM,aAAa,SACxCA,EAAE,SAAM,EAAM,aAAa,GAAGA,EAAE,KAAK,MAE5C,kBAAC,SAAD;EAAO,WAAU;EAAgB;EAAjC,UAAA,CACGqK,IAAQ,KACP,kBAAC,YAAD,EAAA,UACGrK,EAAE,KAAK,KAAK,GAAG,MACd,kBAAC,OAAD,EAAa,OAAO,EAAE,OAAO,GAAG6D,EAAE,IAAI,EAAI,GAAhCrD,CAAgC,CAC3C,EACO,CAAA,GAEZ,kBAAC,SAAD,EAAA,UACGR,EAAE,KAAK,KAAK,GAAK,MAChB,kBAAC,MAAD;GAAa,OAAO,EAAE,QAAQgS,EAAI,IAAI,GAAGA,EAAI,EAAE,MAAM,KAAA,EAAU;GAC5D,UAAAA,EAAI,MAAM,KAAK,GAAG,MACjB,kBAAC,MAAD;IAEE,SAAS1I,EAAE,UAAU,IAAIA,EAAE,UAAU,KAAA;IACrC,SAASA,EAAE,UAAU,IAAIA,EAAE,UAAU,KAAA;IACrC,OAAO;KACL,WAAWA,EAAE,QAAQ;KACrB,aAAaA,EAAE,QAAQ;KACvB,cAAcA,EAAE,QAAQ;KACxB,YAAYA,EAAE,QAAQ;KACtB,YAAYA,EAAE;KACd,eAAeA,EAAE;KACjB,SAAS,GAAGA,EAAE,IAAI,GAAG,KAAKA,EAAE,IAAI,GAAG,KAAKA,EAAE,IAAI,GAAG,KAAKA,EAAE,IAAI,GAAG;IACjE;IAEC,UAAAA,EAAE,OAAO,KAAK,GAAG,MAChB,kBAACkS,IAAD;KAEE,OAAOlR;KACF;KACL,IAAI0I,MAAO,KAAA,KAAa1I,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,KAAa,CAACA,EAAE,KAAK,GAAG0I,EAAG,GAAG9B,EAAG,GAAGwB,EAAG,GAAGlS,MAAM,KAAA;KACjG,IAAIwa,GAAW1Q,GAAGhB,EAAE,OAAO9I,IAAI,IAAI8I,EAAE,OAAO9I,IAAI,EAAE;KAClD,QAAA;IACD,GANM8J,EAAE,MAAM,MAAM,GAAG9J,EAAE,GAAG8J,EAAE,OAAO,MAAM9J,CAM3C,CACF;GACC,GAvBGkS,CAuBH,CACL;EACC,GA5BKxB,CA4BL,CACL,EACI,CAAA,CACF;;AAEX;AAWA,IAAasK,KAAYM,EAAK,SAAmB,EAAE,UAAO,QAAK,OAAI,QAAK,IAAI,aAA0B;CACpG,QAAQC,EAAM,GAAd;EACE,KAAK,KACH,OAAO,kBAACN,IAAD;GAAU,GAAGM;GAAY;GAAS;GAAQ;EAAK,CAAA;EACxD,KAAK,OACH,OACE,kBAAC,OAAD;GAAK,OAAO,EAAE,UAAU,UAAU;GAAG,iBAAiBX,EAAI,aAAaY,KAAUhJ,MAAO,KAAA,KAAa,KAAQ,KAAA;GAC3G,UAAA,kBAAC/W,IAAD;IAAW,GAAG8f;IAAY;IAAK,IAAIC,IAAS,KAAA,IAAYhJ;GAAK,CAAA;EAC1D,CAAA;EAET,SACE,OAAO,kBAAC,OAAD,CAAM,CAAA;CACjB;AACF,CAAC,GC7PKiJ,KAAK,IAAI,GACT/f,KAAM,IACNC,KAAM;AAQZ,SAASigB,GAAS,GAAiB,GAAiC,GAAe,GAA4B;CAC7G,IAAMC,IAAqB,CAAC,GACxBpT,IAAiB;EAAE,OAAO;EAAG,KAAK;EAAG,MAAM;CAAE;CACjD,KAAK,IAAIzI,IAAI,GAAGA,IAAIoT,GAAO,KAAK;EAC9B,IAAMtJ,IAAIwJ,EAAOtT,IACXsD,IAAIwY,EAAQ,IAAIhS,CAAC,KAAK;EAC5B,AAAIA,EAAE,MAAM,UACV,EAAI,MAAM9J,IAAI,GACV8J,EAAE,SAAS,iBACb+R,EAAM,KAAKpT,CAAG,GACd,IAAM;GAAE,OAAOzI,IAAI;GAAG,KAAKA,IAAI;GAAG,MAAM;EAAE,QAI/B8J,EAAE,MAAM,OAAOA,EAAE,MAAMrB,EAAI,MAAMA,EAAI,SACrCA,EAAI,OAAO,KAAKA,EAAI,OAAOnF,IAAI0G,OAC5C6R,EAAM,KAAKpT,CAAG,GACd,IAAM;GAAE,OAAOzI;GAAG,KAAKA;GAAG,MAAM;EAAE,IAEpC,EAAI,MAAMA,IAAI,GACd,EAAI,QAAQsD;CACd;CAEA,QADImF,EAAI,MAAMA,EAAI,SAAS,CAACoT,EAAM,WAAQA,EAAM,KAAKpT,CAAG,GACjDoT;AACT;AAEA,IAAME,qBAAU,IAAI,QAAwB;AAG5C,SAASC,GAAQ,GAAmB,GAAY,GAA+B;CAC7E,KAAK,IAAMlY,KAAK2D,EAAK,iBAA8B,aAAa+K,EAAG,GAAG,GACpE,KAAK,IAAMkI,KAAM5W,EAAE,iBAA8B,sBAAsBmD,EAAE,GAAG,GAC1E,IAAIyT,EAAG,QAAQ,WAAW,MAAM5W,GAAG,OAAO4W,EAAG,cAAc,KAAK,KAAKA;CAGzE,OAAO;AACT;AAQA,IAAM9e,KAAU;CAAC;CAAM;CAAK;CAAM;CAAK;CAAM;CAAK;CAAM;AAAG;AAG3D,SAASsgB,GAAU,GAAiB,GAA6B;CAC/D,IAAM7c,IAAmD,CAAC;CAS1D,OARAiU,EAAO,SAAS,GAAG,MAAO;EACxB,IAAIxJ,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,GAAW;EACxC,IAAMtB,IAAQ,CAAC,CAAC2T,KAAWrS,EAAE,QAAQqS,GAC/BrC,IAAMtR,IAAQ,IAAIsB,EAAE,GAAG;EAC7B,IAAIgQ,MAAQ,KAAA,KAAaA,IAAM,GAAG;EAClC,IAAM7a,IAAO3B,EAASwM,EAAE,IAAc,CAAC,CAAC,KAAK;EAC7C,AAAI7K,KAAMI,EAAI,KAAK;GAAE;GAAI,KAAKmJ,IAAQ,IAAIsR,IAAO;GAAkB;EAAK,CAAC;CAC3E,CAAC,GACMza;AACT;AACA,IAAM+b,MAAY,MAAyC,CAAC,CAACtR,KAAKA,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,KAAa,CAACA,EAAE;AAQ3G,SAAgBsS,GAAS,EAAE,WAAQ,aAAU,iBAAc,SAAwB;CACjF,IAAMC,IAAS1P,GAAU,GACnB6C,IAAKzM,EAAiB;EAAE,QAAQ,CAAC;EAAG,yBAAS,IAAI,QAAQ;EAAG,uBAAO,IAAI,IAAI;EAAG,UAAU;CAAE,CAAC,CAAC,CAAC,SAC7F,CAACuZ,GAAS5Z,KAAQF,GAAe,GACjC,CAAC+Z,GAAMC,KAAWtZ,EAA0B,IAAI,GAChD,CAACqF,GAAMkU,KAAWvZ,EAAoC,IAAI,GAC1D,CAAC2K,GAAM6O,KAAWxZ,EAAeyZ,CAAW,GAC5C,CAACC,GAAW5Z,KAAQH,GAAwB,GAC5Cga,IAASpZ,GAAUmZ,CAAS,GAC5BE,IAAW/Z,EAAuB,IAAI,GACtCiV,IAAS+E,SAAc,IAAInK,GAAWtO,GAAQkL,GAAI9M,CAAI,GAAG;EAAC4B;EAAQkL;EAAI9M;CAAI,CAAC,GAC3Esa,IAAYX,EAAO,YAAY,CAAC,CAAC9T,KAAQ,CAACA,EAAK,OAC/C,CAAC0U,GAAMC,KAAWha,EAAoD;EAAE,MAAM;EAAO,GAAG;EAAI,KAAK;CAAE,CAAC,GACpG,CAACia,IAASC,MAAcla,EAA0C,IAAI,GACtE,CAACma,IAAQC,KAAapa,EAA4B,IAAI,GACtD,CAACqa,GAAOC,MAAYta,EAAwB,IAAI,GAChD,CAACua,IAASC,MAAcxa,EAAS,EAAK,GACtC,CAACya,GAASC,MAAc1a,EAAS,EAAK,GACtC,CAACgU,GAAK2G,KAAU3a,EAAoC,IAAI,GACxD,CAAC4a,IAAQC,MAAa7a,EAAqB,IAAI,GAC/C8a,IAAWjb,EAAO,EAAK,GAEvBkb,KAAclb,EAAsB,IAAI;CAc9C,AAZAT,SACE,EAAO,WAAW,MAAMub,GAAQ,MAAO/Z,GAAG,OAAOlB,GAAG,MAAMkB,GAAG,MAAMlB,GAAG,KAAKkB,GAAG,MAAMlB,GAAG,KAAKkB,GAAG,MAAMlB,GAAG,KAAKkB,GAAG,WAAWlB,GAAG,UAAUkB,GAAG,QAAQlB,GAAG,MAAMkB,IAAIlB,CAAE,GAClK,EAAO,YAAY,MAAW4Z,GAAS,MAAOjS,KAAI;EAAE,GAAGA;EAAG;CAAO,CAAM,GACvE,EAAO,YAAYqT,UACN;EACX,EAAO,UAAU,EAAO,WAAW,EAAO,YAAY,KAAA;CACxD,IACC,CAAC5F,CAAM,CAAC,GAGX1V,QAAiBiG,KAAQ,CAACA,EAAK,QAAQ9K,EAAa6G,GAAQ,QAAQ;EAAE;EAAQ;CAAG,CAAC,IAAI,KAAA,GAAY;EAACA;EAAQ0T;EAAQxI;EAAIjH;CAAI,CAAC,GAE5HjG,QAAgB;EACd,IAAM4b,IAAO;GACX5Z,EAAO,GAAG,gBAAgB,MAAM;IAC9B,KAAK,IAAM1B,KAAKkH,GAAG,EAAG,OAAO,KAAKlH,CAAC;IACnC,EAAK;GACP,CAAC;GACD0B,EAAO,GAAG,cAAc,MAAM;IAE5B,AADAkY,EAAQjS,CAAC,GACLA,EAAE,WAAQ,EAAO,SAASA,EAAE;GAClC,CAAC;GACDjG,EAAO,GAAG,aAAamY,CAAO;EAChC;EAKA,OAJKV,GAAQ,IAAIzX,CAAM,MACrByX,GAAQ,IAAIzX,CAAM,GAClBA,EAAO,KAAK,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,UAE7B4Z,EAAK,SAAS,MAAMrc,EAAE,CAAC;CACtC,GAAG;EAACyC;EAAQ5B;EAAM8M;EAAIwI;CAAM,CAAC;CAE7B,IAAMmG,IAAkB5B,GAAM,QAAQ5f,GAChCyhB,KAAWD,EAAK,IAAIA,EAAK,KAAKA,EAAK,IACnCE,MAAWF,EAAK,IAAIA,EAAK,KAAKA,EAAK,MAAM1C,IAGzC,CAAC6C,IAAOC,KAAYrb,EAAS,EAAE,GAC/Bsb,IAAazb,EAAuB,IAAI,GACxC0b,KAAW,GAAGL,GAAS,GAAG7B,GAAM,KAAK,GAAGA,GAAM,MAC9CmC,KAAU3b,EAAO0b,EAAQ;CAC/B,AAAIC,GAAQ,YAAYD,OACtB,GAAQ,UAAUA,IAClB,EAAG,0BAAU,IAAI,QAAQ,GACzBjP,EAAG,MAAM,MAAM,GACf,EAAG,WAAW;CAEhB,IAAM3F,IAAQ2F,EAAG,OAAO,QAClBmP,IAAmC,CAAC;CAC1C,KAAK,IAAM7U,KAAK0F,EAAG,OAAO;EACxB,IAAImP,EAAM,UAAU,IAAI;EACxB,IAAM3e,IAAIwP,EAAG,OAAO,QAAQ1F,CAAC;EAC7B,AAAI9J,IAAI,IAAGwP,EAAG,MAAM,OAAO1F,CAAC,IACvB6U,EAAM,KAAK;GAAE;GAAG;EAAE,CAAC;CAC1B;CACA,IAAMC,KAAU,KAAK,IAAI/U,GAAO2F,EAAG,WAAW8O,EAAK;CACnD,KAAK,IAAIte,IAAIwP,EAAG,UAAUxP,IAAI4e,IAAS,KAAK,EAAM,KAAK;EAAE,GAAGpP,EAAG,OAAOxP;EAAI;CAAE,CAAC;CAC7E,IAAM6e,KAAc,YAAY,IAAI,GAC9BC,KAAa/B,UAA0B;EAAE;EAAQ,MAAM;EAAI,OAAO;EAAG,WAAW;EAAM,UAAU;CAAM,IAAI,CAACzY,CAAM,CAAC;CAExH,SAAyB;EACvB,IAAMnB,IAAKqb,EAAW;EACtB,IAAI,CAACrb,KAAM,CAACwb,EAAM,UAAU,CAACpC,GAAM;EACnC,IAAMwC,IAAK,MAAM,KAAK5b,EAAG,QAAQ,CAAC,CAAC,KAAK,MAAO2F,EAAkB,sBAAsB,CAAC,CAAC,MAAM,GACzFkW,IAAK,YAAY,IAAI,IAAIH,IACzBhQ,IAAK,iBAAiB;GAO1B,AANA8P,EAAM,SAAS,GAAG,MAAM;IAEtB,AADAnP,EAAG,QAAQ,IAAIlQ,EAAE,GAAGyf,EAAGxX,MAAM,CAAC,GAC9BiI,EAAG,MAAM,OAAOlQ,EAAE,CAAC;GACrB,CAAC,GACGsf,KAAUpP,EAAG,aAAU,EAAG,WAAWoP,KACzCL,GAAU,MAAOS,IAAK,KAAK,KAAK,IAAIlV,IAAI,GAAG,IAAI,IAAIkV,IAAK,KAAK,KAAK,IAAI,IAAIlV,KAAK,CAAC,IAAIA,CAAE,GACtFpH,EAAK;EACP,GAAG,CAAC;EACJ,aAAa,aAAamM,CAAE;CAC9B,CAAC;CAED,IAAMgN,IAAQkB,SACNnB,GAASpM,EAAG,QAAQA,EAAG,SAAS,KAAK,IAAIA,EAAG,UAAU3F,CAAK,GAAGwU,EAAO,GAE3E;EAAC/B;EAAS+B;EAASxU;CAAK,CAC1B,GAGMoV,IAAQd,EAAK,IAAI1C,IACjByD,KAAQf,EAAK,IAAI1C,IACjBrS,KAAMpG,EAAK,IAAI,KAAK,IAAI,IAAK,KAAK,IAAI,IAAIA,EAAK,IAAI,MAAWic,CAAK,CAAC,IAAI,GACxEE,KAAItR,MAAS,QAAQ,KAAK,IAAIzE,IAAK,IAAI,IAAIyE,GAC3CuR,KAAW,CAAC,CAAC7W,KAAQiH,EAAG,YAAY3F,GACpCwV,KAAcxD,EAAM,KAAK,MAAM,KAAK,IAAIqD,KAAQf,EAAK,KAAKA,EAAK,MAAM1C,KAAK3X,EAAE,IAAI,IAAIqb,EAAC,GACrFG,KAAiB,CAAC,GACpBC,KAAM5jB;CACV,KAAK,IAAM2H,KAAK+b,IAEd,AADAC,GAAK,KAAKC,EAAG,GACb,MAAOjc,IAAI5H;CAEb,IAAM8jB,IAAW,MACXC,IAASF,KAAMC,KAAYN,KAAQC,KAAIzjB,MAAOC,KAAMD,IACpDgkB,KAAS,KAAK,IAAI1c,EAAK,GAAGic,IAAQE,KAAI,EAAO,GAC7CjM,KAAO,KAAK,IAAIvX,KAAM+jB,KAAST,IAAQE,MAAK,CAAC,GAE7C/O,IAAQkP,GAAK,SAAS9a,GAAW8a,IAAMzC,EAAO,IAAIqC,KAAQC,EAAC,IAAI,GAC/D9O,IAAOiP,GAAK,SAAS9a,GAAW8a,IAAMzC,EAAO,IAAI7Z,EAAK,IAAI,GAAG,IAAI,IACjE2c,IAAYP,KAAWvD,EAAM,SAAS,GAEtC+D,IAAU5C,KAAahF,EAAO,MAAM,UAAU,OAAOA,EAAO,MAAM,QAAQ,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,IAChG6H,KAAYD,KAAW,IAAI/D,EAAM,WAAW,MAAM+D,KAAW9b,EAAE,SAAS8b,IAAU9b,EAAE,GAAG,IAAI;CAIjG,AAFA,EAAO,WAAWsa,IAClB,EAAO,cAAc7B,GAAM,MAC3B,EAAO,YAAYA,GAAM;CACzB,IAAM9T,KAAM6W,GAAK,SAAS9a,GAAW8a,IAAMzC,EAAO,IAAI7Z,EAAK,IAAI,CAAC,IAAI,IAAI,GAElE,CAAC8c,IAAOC,MAAY7c,EAAS,CAAC;CACpC,QAAgB;EACd,IAAI,CAACqF,GAAM;EACX,IAAMsG,IAAK,iBAAiB;GAC1B,IAAIpM,IAAI,GACF2Q,KAAS,MAAa;IAC1B,IAAItJ,EAAE,MAAM,KAAK,KAAKxM,EAASwM,EAAE,IAAc,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,QAAQ,MAAM,gBAAgB,KAAKzG,CAAC,CAAC,CAAC,CAAC;SAChG,IAAIyG,EAAE,MAAM,OAAO,KAAK,IAAM/D,KAAK+D,EAAE,MAAM,KAAK,IAAMhB,KAAK/C,EAAE,OAAO,EAAE,OAAO,QAAQqN,CAAK;GACjG;GAEA,AADA5D,EAAG,OAAO,QAAQ4D,CAAK,GACvB2M,GAAStd,CAAC;EACZ,GAAG,GAAG;EACN,aAAa,aAAaoM,CAAE;CAC9B,GAAG;EAACyN;EAAS/T;EAAMiH;CAAE,CAAC;CACtB,IAAMwQ,KAASzX,GAAM,QACjB,UAAUA,EAAK,UACf6W,KACE,QAAQ3W,GAAI,MAAMoT,EAAM,OAAO,KAAKiE,GAAM,eAAe,EAAE,UAC3D,QAAQrX,GAAI,MAAMoT,EAAM,OAAO;CAYrC,AATAvZ,QAAgB;EACd,IAAMa,IAAK2Z,EAAS;EACpB,IAAKE,KAAc7Z,GAGnB,OAFA6U,EAAO,MAAM,OAAO7U,CAAE,GACtB,EAAO,gBAAgBkZ,EAAO,SAAS,EAAI,SAC9BrE,EAAO,MAAM,OAAO;CACnC,GAAG;EAACgF;EAAWhF;EAAQqE;CAAM,CAAC,GAG9BrP,SAAmB;EACjB,AAAIgQ,IAAWhF,EAAO,UAAU,IACvB8E,EAAS,WAAS1e,GAAO0e,EAAS,OAAO,CAAC,EAAE,kBAAkBA,EAAS,OAAO;CACzF,CAAC;CAGD,IAAMmD,KAAWpE,EAAM,MAAM,MAAM/X,EAAE,MAAMA,EAAE,KAAK;CAiDlD,AAhDAxB,QAAgB;EACd,IAAI,CAAC0a,GAAW;GACd,GAAWJ,EAAU,OAAO;GAC5B;EACF;EAEA,IAAI,CAACqD,MAAY,CAAC/a,GAAW4X,EAAS,OAAO,KAAK9E,EAAO,MAAM,QAAQ,GAAG;EAC1E,IAAM1N,IAAM0N,EAAO,IAAI;EACvB,AAAI1N,KAAO,CAAC0N,EAAO,MAAM,QAAQ;GAAE,GAAG1N,EAAI;GAAG,GAAGA,EAAI;EAAE,CAAC,MAAG,EAAO,aAAa;GAAE,GAAGA,EAAI;GAAG,GAAGA,EAAI;EAAE;CACrG,GAAG,CAAC0S,GAAWiD,EAAQ,CAAC,GAExB3d,QAAgB;EACd,EAAO,YAAY,MAAqB;GACtC,IAAM4d,IAAM,EAAE,WAAW,EAAE;GAC3B,IAAIA,KAAO,EAAE,IAAI,YAAY,MAAM,KAEjC,OADA7D,EAAY,KAAK,GACV;GAET,IAAI6D,KAAO,EAAE,IAAI,YAAY,MAAM,KAEjC,OADAhD,GAAS,OAAO;IAAE,GAAGrb;IAAG,MAAM;GAAK,EAAE,GAC9B;GAET,IAAIqe,KAAO,EAAE,QAAQ,SAEnB,OADAlI,EAAO,gBAAgB,GAChB;GAET,IAAIkI,KAAO,EAAE,IAAI,YAAY,MAAM,KAEjC,OADAC,GAAQ,GACD;GAGT,IAAID,KAAO,EAAE,UAAU,eAAe,KAAK,EAAE,IAAI,GAAG;IAClD,IAAMzd,IAAI,OAAO,EAAE,KAAK,MAAM,CAAC,CAAC;IAEhC,OADAuV,EAAY,WAAWvV,IAAK,IAAIA,MAAe,QAAQ,GAChD;GACT;GASA,OARIyd,KAAO,EAAE,QAAQ,QACnBlI,EAAO,YAAY,GACZ,MAEL,EAAE,QAAQ,YAAYA,EAAO,WAC/BA,EAAO,WAAW,GACX,MAEF;EACT;CACF,GAAG,CAACA,GAAQqE,CAAM,CAAC,GAEnBha,SAAyB;EACvB,IAAM0E,IAAMiR,EAAO;EACnB,IAAI,CAACjR,KAAO,CAAC+V,EAAS,SAAS;EAC/B,IAAI,CAAC9E,EAAO,MAAM,QAAQjR,CAAG,GAAG;GAE9B,IAAMsM,IAAK,OAAOtM,EAAI,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,GAClC4N,IAAKkH,EAAM,WAAW,MAAMxI,KAAMvP,EAAE,SAASuP,IAAKvP,EAAE,GAAG;GAE7D,AADI6Q,KAAM,KAAKiI,EAAU,YAAS,EAAU,QAAQ,YAAY,KAAK,IAAI,GAAG0C,GAAK3K,KAAM,EAAE,KACrFA,IAAK,KAAMA,KAAMvE,KAASuE,KAAMtE,OAAO,EAAO,aAAa;GAC/D;EACF;EACA,EAAO,aAAa;EAEpB,IAAM+P,IAAKhiB,GAAO0e,EAAS,OAAO,GAC5BuD,IAAQD,GAAI,aAAaA,EAAG,WAAW,CAAC,IAAI,MAC5CE,IAAK1D,EAAU;EACrB,IAAIyD,KAASC,GAAI;GACf,IAAMva,IAAIsa,EAAM,sBAAsB,GAChCE,IAAMD,EAAG,sBAAsB;GACrC,AAAIva,EAAE,UAAUA,EAAE,SAASwa,EAAI,SAAS,KAAI,EAAG,aAAaxa,EAAE,SAASwa,EAAI,SAAS,KAC3Exa,EAAE,UAAUA,EAAE,MAAMwa,EAAI,MAAM,MAAG,EAAG,aAAaA,EAAI,MAAMxa,EAAE,MAAM;EAC9E;CACF,CAAC;CAGD,IAAMya,KAAUzD,SAAuB;EACrC,IAAMzd,IAAI2d,EAAK,EAAE,YAAY;EAC7B,IAAI,CAACA,EAAK,QAAQ,CAAC3d,GAAG,OAAO,CAAC;EAC9B,IAAMD,IAAe,CAAC,GAChBV,KAAQ,GAAc,GAAY,MAAe;GACrD,IAAMa,IAAIlC,EAASwG,EAAE,IAAc,CAAC,CAAC,YAAY;GACjD,KAAK,IAAI9D,IAAIR,EAAE,QAAQF,CAAC,GAAGU,KAAK,KAAKX,EAAI,SAAS,KAAM,IAAIG,EAAE,QAAQF,GAAGU,IAAIV,EAAE,MAAM,GAAG,EAAI,KAAK;IAAE;IAAI,GAAGU;IAAG,GAAGA,IAAIV,EAAE;IAAQ;GAAG,CAAC;EACpI;EAMA,OALAkQ,EAAG,OAAO,SAAS,GAAG,MAAO;GAC3B,AAAI4L,GAAStR,CAAC,IAAGnL,EAAKmL,GAAG,OAAOuJ,CAAE,GAAGA,CAAE,IAC9BvJ,EAAE,MAAM,SACfA,EAAE,KAAK,SAAS,GAAG,MAAO/D,EAAE,MAAM,SAAS,GAAG,MAAO+C,EAAE,OAAO,SAAS,GAAG,MAAOsS,GAASxY,CAAC,KAAKjE,EAAKiE,GAAG,GAAGyQ,EAAG,GAAG3C,EAAG,GAAGwB,EAAG,GAAGyC,KAAMtB,CAAE,CAAC,CAAC,CAAC;EAC5I,CAAC,GACMhU;CAET,GAAG;EAAC4d,EAAK;EAAGA,EAAK;EAAMX;CAAO,CAAC,GAEzBmE,MAAa,MAAgB;EACjC,IAAMlW,IAAIiW,GAAQrM,IACZmM,IAAK1D,EAAU;EACrB,IAAI,CAACrS,KAAK,CAAC+V,GAAI;EACf,IAAM3L,IAAKkH,EAAM,WAAW,MAAMtR,EAAE,MAAMzG,EAAE,SAASyG,EAAE,KAAKzG,EAAE,GAAG;EAGjE,AAFI6Q,KAAM,MAAG,EAAG,YAAY,KAAK,IAAI,GAAG2K,GAAK3K,KAAM,EAAE,IACrDuI,GAAS,OAAO;GAAE,GAAGrb;GAAG;EAAI,EAAE,GAC9B,4BACE,4BAA4B;GAC1B,IAAM4F,IAAOqV,EAAS;GACtB,IAAI,CAACrV,GAAM;GACX,IAAM5G,IAAI9C,EAAW0J,GAAM;IAAE,IAAI8C,EAAE;IAAI,GAAGA,EAAE;GAAE,CAAC,GACzCT,IAAI/L,EAAW0J,GAAM;IAAE,IAAI8C,EAAE;IAAI,GAAGA,EAAE;GAAE,CAAC;GAC/C,IAAI,CAAC1J,KAAK,CAACiJ,GAAG;GACd,IAAM/D,IAAI,SAAS,YAAY;GAE/B,AADAA,EAAE,SAASlF,EAAE,IAAIA,EAAE,EAAE,GACrBkF,EAAE,OAAO+D,EAAE,IAAIA,EAAE,EAAE;GACnB,IAAM4W,IAAO3a,EAAE,sBAAsB,GAC/Bwa,IAAMD,EAAG,sBAAsB;GAErC,AADA,EAAG,aAAaI,EAAK,MAAMH,EAAI,MAAMA,EAAI,SAAS,GAC9CvD,KAAWhF,EAAO,MAAM,QAAQ;IAAE,GAAG;KAAE,IAAIzN,EAAE;KAAI,GAAGA,EAAE;IAAE;IAAG,GAAG;KAAE,IAAIA,EAAE;KAAI,GAAGA,EAAE;IAAE;GAAE,GAAG,EAAK;EACjG,CAAC,CACH;CACF;CAGA,SAAyB;EACvB,IAAMoW,IAAK,WAAyE,WAC9EC,IAAO,IAAyD;EACtE,IAAI,CAACD,KAAK,CAACC,GAAK;EAChB,IAAMnZ,IAAOqV,EAAS;EACtB,IAAI,CAACrV,KAAQ,CAAC+Y,GAAQ,QAAQ;GAE5B,AADAI,EAAI,OAAO,SAAS,GACpBA,EAAI,OAAO,aAAa;GACxB;EACF;EACA,IAAMtW,IAAe,CAAC,GAClBuW;EAaJ,AAZAL,GAAQ,SAAS,GAAG,MAAM;GACxB,IAAIjW,EAAE,MAAMsR,EAAMzL,EAAM,EAAE,SAAS,MAAM7F,EAAE,OAAOsR,EAAMxL,EAAK,EAAE,OAAO,IAAI;GAC1E,IAAM,IAAItS,EAAW0J,GAAM;IAAE,IAAI8C,EAAE;IAAI,GAAGA,EAAE;GAAE,CAAC,GACzCT,IAAI/L,EAAW0J,GAAM;IAAE,IAAI8C,EAAE;IAAI,GAAGA,EAAE;GAAE,CAAC;GAC/C,IAAI,CAAC,KAAK,CAACT,GAAG;GACd,IAAM/D,IAAI,SAAS,YAAY;GAG/B,AAFAA,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GACrBA,EAAE,OAAO+D,EAAE,IAAIA,EAAE,EAAE,GACf9J,MAAMid,EAAK,MAAK,IAAOlX,IACtBuE,EAAI,KAAKvE,CAAC;EACjB,CAAC,GACD6a,EAAI,IAAI,WAAW,IAAID,EAAE,GAAGrW,CAAG,CAAC,GAC5BuW,IAAMD,EAAI,IAAI,eAAe,IAAID,EAAEE,CAAI,CAAC,IACvCD,EAAI,OAAO,aAAa;CAC/B,CAAC;CAED,IAAME,MAAgB,GAAU,MAAiB3iB,GAAS6Z,GAAQ;EAAE,GAAG;GAAE,IAAIzN,EAAE;GAAI,GAAGA,EAAE;EAAE;EAAG,GAAG;GAAE,IAAIA,EAAE;GAAI,GAAGA,EAAE;EAAE;CAAE,GAAGtL,CAAI,GAEtH8hB,IAA0B;EAAE,YAAYxE,GAAM;EAAM,UAAUA,IAAO,GAAGA,EAAK,GAAG,MAAM,KAAA;CAAU;CAGtG,GAAW;EACT,WAAW,YAAY;GACrB,IAAI,CAAC6C,IAAU,MAAU,MAAM,uDAAuD;GACtF,OAAO;IACL,MAAM,GAAGjB,EAAK,EAAE,KAAKA,EAAK,EAAE;IAC5B,QAAQ;IACR,MAAMtC,EAAM,KAAK,GAAG,MAClB,kBAAC,OAAD;KAAa,WAAU;KAAgB,OAAO;MAAE,OAAO,GAAGsC,EAAK,EAAE;MAAK,QAAQ,GAAGA,EAAK,EAAE;KAAI;KAC1F,UAAA,kBAAC6C,IAAD;MAAU,OAAOhhB;MAAG,OAAO6b,EAAM;MAAQ,OAAO/X;MAAG,QAAQ0L,EAAG;MAAc;MAAY;MAAM,KAAK;MAAG,MAAM;MAAG,QAAQ0P;MAAO,MAAM;MAAW;MAAkB;MAAU,SAAS;KAAQ,CAAA;IACzL,GAFKlf,CAEL,CACN;GACH;EACF;EACA,MAAM,OAAO,MAAW;GACtB,IAAI,CAACuI,GAAM,MAAU,MAAM,uDAAuD;GAClF,OAAO0Y,MAAW,OAAOrH,GAAepK,EAAG,MAAM,IAAI0J,GAAW1J,EAAG,MAAM;EAC3E;EACA,aAAa;GACX,IAAI0R,IAAQ,GACRnM,IAAQ,GACN3B,KAAS,MAAa;IAC1B,IAAItJ,EAAE,MAAM,KAAK;KACf,IAAMtK,IAAIlC,EAASwM,EAAE,IAAc;KAEnC,AADA,KAAStK,EAAE,QACPA,EAAE,KAAK,KAAG;IAChB,OAAO,IAAIsK,EAAE,MAAM,OAAO,KAAK,IAAM/D,KAAK+D,EAAE,MAAM,KAAK,IAAMhB,KAAK/C,EAAE,OAAO,EAAE,OAAO,QAAQqN,CAAK;GACnG;GACA,EAAG,OAAO,QAAQA,CAAK;GACvB,IAAM9J,IAAO8V,KAAW,KAAK;GAC7B,OAAO;IACL,CAAC,SAASvD,EAAM,OAAO,eAAe,IAAIvS,CAAI;IAC9C,CAAC,SAASwW,GAAM,eAAe,IAAIxW,CAAI;IACvC,CAAC,cAAc4X,EAAM,eAAe,IAAI5X,CAAI;IAC5C,CAAC,cAAcyL,EAAM,eAAe,IAAIzL,CAAI;IAC5C,CAAC,aAAa,GAAG,EAAE6U,EAAK,IAAI,GAAA,CAAI,QAAQ,CAAC,EAAE,KAAK,EAAEA,EAAK,IAAI,GAAA,CAAI,QAAQ,CAAC,EAAE,IAAI;GAChF;EACF;CACF,CAAC;CAGD,IAAMgC,WAAgB;EACpB,IAAM1X,IAAMuP,EAAO,MAAM,CAAC,EAAE;EAC5B,EAAU;GACR,OAAOvP,IAAM,cAAc;GAC3B,aAAa;GACb,SAASA;GACT,IAAI;GACJ,OAAO,MAAM,KAAKuP,EAAO,QAAQlT,EAAE,KAAK,KAAK,IAAI;GACjD,OAAO2D,IAAM;IAAE,OAAO;IAAU,WAAW,KAAKuP,EAAO,QAAQ,IAAI;GAAE,IAAI,KAAA;EAC3E,CAAC;CACH,GACMmJ,WAAe;EACnB,IAAM1Y,IAAMuP,EAAO,MAAM,CAAC,EAAE;EAC5B,AAAKvP,KACL6U,EAAU;GACR,OAAO;GACP,OAAO;GACP,SAAS7U,EAAI,OAAO;GACpB,MAAM;GACN,IAAI;GACJ,OAAO,MAAMuP,EAAO,WAAWlT,EAAE,KAAK,CAAC;EACzC,CAAC;CACH,GACMsc,KAAQ,OAAO,MAAmB;EACtC,IAAMra,IAAMiR,EAAO,MAAM,IAAI;EAC7B,IAAKjR,GACL,IAAI;GACF,IAAI,CAACiS,KAAS,UAAU,WAAW,MACjC,KAAK,IAAM3K,KAAM,MAAM,UAAU,UAAU,KAAK,GAAG;IACjD,IAAMgT,IAAMhT,EAAG,MAAM,MAAM,MAAM7O,EAAE,WAAW,QAAQ,CAAC;IACvD,IAAI6hB,GAAK,OAAO,KAAKrJ,EAAO,aAAa,CAAC,MAAM3J,EAAG,QAAQgT,CAAG,CAAC,GAAGta,CAAG;IACrE,IAAIsH,EAAG,MAAM,SAAS,WAAW,GAAG;KAClC,IAAMyB,IAAO,OAAO,MAAMzB,EAAG,QAAQ,WAAW,EAAA,CAAG,KAAK;KAExD,IAAI2J,EAAO,UAAUjR,GAAK;MADb,OAAO,CAAC;MAA0B,UAAU,MAAevH,MAAM,cAAcsQ,IAAO;KACzE,CAAE,GAAG;IACjC;GACF;GAEF,IAAM7Q,IAAO,MAAM,UAAU,UAAU,SAAS;GAChD,AAAIA,KAAMd,GAAS6Z,GAAQjR,GAAK9H,CAAI;EACtC,QAAQ;GACN,GAAS,8CAA8CqP,EAAI,WAAW;EACxE;CACF,GACMgT,MAAW,MAAwB;EACvC,AAAK,SAAS,YAAYC,CAAG,KAAG/D,GAAS,OAAOlP,IAAMiT,MAAQ,SAAS,MAAM,KAAK;CACpF,GACMC,WAAkB,KAAKpV,GAAU,CAAC,CAAC,MAAM,MAAM,MAAMvK,EAAE,UAAUmW,EAAO,aAAanW,CAAC,EAAE,GACxF4f,WAAevK,KAAO4F,EAAS,UAAWd,GAAQc,EAAS,SAAS5F,EAAI,IAAIA,EAAI,CAAC,IAAgC,MACjHwK,KAA6B;EACjC,gBAAgB;GACd,IAAMve,IAAKse,GAAM;GACjB,AAAIte,GAAI,gBAAc6U,EAAO,cAAc7U,EAAG,cAAcA,EAAG,aAAa;EAC9E;EACA,eAAe,KAAKiJ,GAAU,WAAW,EAAK,CAAC,CAAC,MAAM,MAAMvK,EAAE,MAAMmW,EAAO,aAAanW,EAAE,EAAE,CAAC;EAC7F,KAAKsf;EACL,UAAW9E,EAAO,oBAER;GACJ,IAAMlZ,IAAKse,GAAM;GACjB,AAAKte,GAAI,OAAQ+T,KACjB,MAAW/T,EAAG,GAAG,CAAC,CACf,MAAM,MAAM4C,EAAE,KAAK,CAAC,CAAC,CACrB,MAAM,MAAM8F,GAAS/B,GAAGoN,EAAI,OAAO,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;EACpE,IAPA,KAAA;CAQN;CAGA,SAAyB;EACvB,IAAI8G,EAAS,SAAS;EACtB,IAAMvW,IAAOqV,EAAS,SAChBwD,IAAK1D,EAAU,SACjB2D,IAAkB;EACtB,IAAIvD,KAAa9F,KAAOzP,KAAQ6Y,GAAI;GAClC,IAAMnd,IAAK6Y,GAAQvU,GAAMyP,EAAI,IAAIA,EAAI,CAAC;GACtC,IAAI/T,GAAI;IACN,IAAM4C,IAAI5C,EAAG,sBAAsB,GAC7B2G,IAAIwW,EAAG,sBAAsB;IACnC,IAAM;KAAE,GAAGva,EAAE,OAAO+D,EAAE,OAAOwW,EAAG;KAAY,GAAGva,EAAE,MAAM+D,EAAE,MAAMwW,EAAG;KAAW,GAAGva,EAAE;KAAO,GAAGA,EAAE;IAAO;GACvG;EACF;EACA,IAAW,MAAOjC,MAAMyc,KAAQzc,KAAKyc,KAAOzc,EAAE,MAAMyc,EAAI,KAAKzc,EAAE,MAAMyc,EAAI,KAAKzc,EAAE,MAAMyc,EAAI,KAAKzc,EAAE,MAAMyc,EAAI,IAAKzc,IAAIyc,CAAI;CAC1H,CAAC;CAED,IAAMoB,MAAe,GAA+B,MAAwB;EAE1E,AADA9iB,EAAE,eAAe,GACjBA,EAAE,gBAAgB;EAClB,IAAMsE,IAAKse,GAAM;EACjB,IAAI,CAACvK,KAAO,CAAC4G,MAAU,CAAC3a,GAAI;EAC5B,IAAM,EAAE,GAAGye,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,MAAOjE,IACjCkE,IAAU9K,EAAI,IAAI,KAAK,IAAI,GAAG0K,CAAE,GAChCK,IAAKpjB,EAAE,SACPqjB,IAAKrjB,EAAE,SACTwE,IAAIue,GACJte,IAAIue;EAER,AADA,EAAS,UAAU,IACnB,GAAY,UAAUG;EACtB,IAAMG,KAAQ,MAAmB;GAC/B,IAAMtc,IAAKuc,EAAG,UAAUH,GAClBI,IAAKD,EAAG,UAAUF,GACpB/K,IAAKyK,KAAMjU,EAAI,SAAS,GAAG,IAAI9H,IAAK8H,EAAI,SAAS,GAAG,IAAI,CAAC9H,IAAK,IAC9DuR,IAAKyK,KAAMlU,EAAI,SAAS,GAAG,IAAI0U,IAAK1U,EAAI,SAAS,GAAG,IAAI,CAAC0U,IAAK;GAClE,IAAI1U,EAAI,WAAW,KAAK,CAACyU,EAAG,UAAU;IACpC,IAAM7a,IAAI,KAAK,IAAI4P,IAAKyK,GAAIxK,IAAKyK,CAAE;IAEnC,AADA,IAAKD,IAAKra,GACV,IAAKsa,IAAKta;GACZ;GACA,IAAM+a,IAAQlE,KAAW4D,IAAW;GAKpC,AAJA,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI7K,GAAImL,IAAO,CAAC,CAAC,GACtC,IAAI,KAAK,IAAI,GAAGlL,CAAE,GAClB,EAAG,MAAM,QAAQ,GAAG/T,IAAI2e,EAAQ,KAChC,EAAG,MAAM,SAAS,GAAG1e,IAAI0e,EAAQ,KACjCjE,GAAU;IAAE,GAAG+D;IAAI,GAAGC;IAAI;IAAG;GAAE,CAAC;EAClC,GACMngB,UAAW;GAKf,AAJA,OAAO,oBAAoB,aAAaugB,CAAI,GAC5C,OAAO,oBAAoB,WAAWvgB,CAAE,GACxC,EAAS,UAAU,IACnB,GAAY,UAAU,MAClByB,MAAMue,KAAMte,MAAMue,IAAI7J,EAAO,aAAa3U,IAAI2e,GAAS1e,IAAI0e,CAAO,IACjEjE,GAAU,IAAI;EACrB;EAEA,AADA,OAAO,iBAAiB,aAAaoE,CAAI,GACzC,OAAO,iBAAiB,WAAWvgB,CAAE;CACvC,GAGM2gB,WAA6B;EACjC,IAAMhf,IAAIyU,EAAO,MAAM,GACjBjR,IAAMiR,EAAO,MAAM,IAAI,GACvBwK,IAAS,CAAC,CAACzb,MAAQA,EAAI,EAAE,OAAOA,EAAI,EAAE,MAAMA,EAAI,EAAE,MAAMA,EAAI,EAAE,IAC9DkC,IAAoB,CAAC;EAyB3B,IAxBI1F,GAAG,OACL0F,EAAM,KACJ;GAAE,MAAM;GAAS,OAAO;GAAiB,MAAM;GAAW,KAAKyY,GAAa;EAAS,GACrF;GAAE,OAAO;GAAqB,MAAM;GAAO,WAAW1J,EAAO,YAAY,KAAK;EAAE,GAChF;GAAE,OAAO;GAAkB,MAAM;GAAc,KAAK0J,GAAa;EAAQ,GACzE;GAAE,OAAO;GAAa,MAAM;GAAO,KAAKP;EAAO,GAC/C,GAAIO,GAAa,WAAW,CAAC;GAAE,OAAO;GAAkB,MAAM;GAAQ,KAAKA,GAAa;EAAS,CAAa,IAAI,CAAC,GACnH;GAAE,OAAO;GAAgB,MAAM;GAAS,WAAW1J,EAAO,gBAAgB;EAAE,CAC9E,GAEF/O,EAAM,KACJ;GAAE,OAAO;GAAO,MAAM;GAAO,MAAM,GAAGqF,EAAI;GAAI,UAAU,CAACkU;GAAQ,WAAWlB,GAAQ,KAAK;GAAG,KAAKrY,EAAM,SAAS;EAAE,GAClH;GAAE,OAAO;GAAQ,MAAM;GAAQ,MAAM,GAAGqF,EAAI;GAAI,UAAU,CAACkU;GAAQ,WAAWlB,GAAQ,MAAM;EAAE,GAC9F;GAAE,OAAO;GAAS,MAAM;GAAS,MAAM,GAAGhT,EAAI;GAAI,WAAW,KAAK8S,GAAM,EAAK;EAAE,GAC/E;GAAE,OAAO;GAA4B,MAAM;GAAc,MAAM,GAAG9S,EAAI;GAAK,WAAW,KAAK8S,GAAM,EAAI;EAAE,GACvG;GAAE,OAAO;GAAU,MAAM;GAAS,UAAU,CAACoB,KAAU,CAAC,CAACjf,GAAG;GAAK,WAAWyU,EAAO,gBAAgB;EAAE,CACvG,GACIzU,GAAG,OACL0F,EAAM,KACJ;GAAE,OAAO;GAAa,MAAM;GAAY,KAAK;GAAM,WAAW,OAAO,KAAK1F,EAAE,MAAM,UAAU,UAAU;EAAE,GACxG;GAAE,OAAO;GAAc,MAAM;GAAQ,MAAM,GAAG+K,EAAI;GAAI,KAAK6R;EAAQ,GACnE;GAAE,OAAO;GAAe,MAAM;GAAU,WAAW,KAAKnI,EAAO,QAAQ,IAAI;EAAE,CAC/E,IACK/O,EAAM,KAAK;GAAE,OAAO;GAAgB,MAAM;GAAQ,MAAM,GAAGqF,EAAI;GAAI,KAAK;GAAM,KAAK6R;GAAS,UAAU,CAAC5c;EAAE,CAAC,GAC7GA,GAAG,SAAS;GACd,IAAMkR,KAAM,YAAkDuD,EAAO,QAAQzQ,CAAC;GAC9E,EAAM,KACJ;IAAE,MAAM;IAAS,OAAO;IAAoB,MAAM;IAAY,KAAK;IAAM,KAAKkN,EAAG,UAAU;GAAE,GAC7F;IAAE,OAAO;IAAoB,MAAM;IAAY,KAAKA,EAAG,UAAU;GAAE,GACnE;IAAE,OAAO;IAAsB,MAAM;IAAW,KAAKA,EAAG,SAAS;GAAE,GACnE;IAAE,OAAO;IAAuB,MAAM;IAAY,KAAKA,EAAG,UAAU;GAAE,GACtE;IAAE,OAAO;IAAc,MAAM;IAAU,KAAKA,EAAG,QAAQ;GAAE,GACzD;IAAE,OAAO;IAAiB,MAAM;IAAU,KAAKA,EAAG,QAAQ;GAAE,GAC5D;IAAE,OAAO;IAAgB,MAAM;IAAS,KAAKA,EAAG,UAAU;GAAE,CAC9D;EACF,OACE,EAAM,KACJ;GAAE,OAAO;GAAiB,MAAM;GAAS,KAAK;GAAM,KAAK+M;GAAW,UAAU,CAACje;EAAE,GACjF;GAAE,OAAO;GAAgB,MAAM;GAAS,WAAWyU,EAAO,YAAY,GAAG,CAAC;GAAG,UAAU,CAACzU;EAAE,GAC1F;GAAE,OAAO;GAAc,MAAM;GAAa,MAAM,GAAG+K,EAAI;GAAI,WAAW0J,EAAO,gBAAgB;GAAG,UAAU,CAACzU;EAAE,CAC/G;EAMF,OAJA0F,EAAM,KACJ;GAAE,OAAO;GAAoB,MAAM;GAAS,MAAM,GAAGqF,EAAI;GAAK,KAAK;GAAM,WAAW0J,EAAO,YAAY;GAAG,UAAU,CAACzU;EAAE,GACvH;GAAE,OAAO;GAAc,MAAM;GAAa,MAAM,GAAG+K,EAAI;GAAI,WAAW0J,EAAO,UAAU;EAAE,CAC3F,GACO/O;CACT,GAGMkT,KAAUI,GAAM,QAAQ,MAAM,MAAM3Z,EAAE,UAAU,OAAO,CAAC,EAAE,IAC1D6f,KAAW1F,SACRU,KAAUvB,GAAU1M,EAAG,QAAQ2M,EAAO,IAAI,CAAC,GAElD;EAACsB;EAASnB;EAASH;CAAO,CAC5B,GACMuG,KAAW7G,EAAM,KAAK,IAAI,GAAGpT,KAAM,CAAC,EAAE,EAAE,SAAS,GACjDka,KAAgBF,GAAS,QAAQ,GAAK,GAAG,MAAOnf,EAAE,MAAM,KAAK,IAAIof,IAAU9C,CAAO,IAAI5f,IAAIuf,GAAM,EAAE,GAClGqD,MAAa,MAAe;EAChC,IAAMtC,IAAK1D,EAAU,SACfjI,IAAKkH,EAAM,WAAW,MAAMxI,KAAMvP,EAAE,SAASuP,IAAKvP,EAAE,GAAG;EAC7D,AAAI,CAACwc,KAAM3L,IAAK,MAChB,EAAG,YAAY,KAAK,IAAI,GAAG2K,GAAK3K,KAAM,EAAE,GACxC,4BACE,4BAA4B;GAC1B,IAAMxR,IAAK2Z,EAAS,SAAS,cAAc,aAAazJ,EAAG,GAAG;GAE9D,AADIlQ,MAAI,EAAG,aAAaA,EAAG,sBAAsB,CAAC,CAAC,MAAMmd,EAAG,sBAAsB,CAAC,CAAC,MAAM,KACtFtD,KAAWhF,EAAO,MAAM,QAAQ;IAAE,GAAG;KAAE,IAAI,OAAO3E,CAAE;KAAG,GAAG;IAAE;IAAG,GAAG;KAAE,IAAI,OAAOA,CAAE;KAAG,GAAG;IAAE;GAAE,CAAC;EAClG,CAAC,CACH;CACF;CAEA,OACE,kBAAC,OAAD;EAAK,OAAO;GAAE,UAAU;GAAY,MAAM;GAAG,UAAU;GAAG,SAAS;EAAO;EAA1E,UAAA;GACE,kBAAC,OAAD;IACE,KAAKuJ;IACL,WAAU;IACV,UAAU;IACV,YAAY,MAAM;KAChB,CAAK,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,YAAY,MAAM,QACtD,EAAE,eAAe,GACjBM,GAAS,OAAO;MAAE,GAAGrb;MAAG,MAAM;KAAK,EAAE;IAEzC;IATF,UAAA;KAWG0a,KAAQoC,EAAM,SAAS,KACtB,kBAAC,OAAD;MAAK,KAAKH;MAAY,WAAU;MAAoB,OAAO;OAAE,GAAGuC;OAAU,OAAO,GAAG3C,GAAS;MAAI;MAC9F,UAAAO,EAAM,KAAK,EAAE,MAAG,WACf,kBAAC3D,IAAD;OAAmB,OAAOlR;OAAG,KAAKgV;OAAY,IAAItE,GAAW1Q,GAAG0F,EAAG,OAAOxP,IAAI,IAAIwP,EAAG,OAAOxP,IAAI,EAAE;MAAI,GAAtFA,CAAsF,CACvG;KACE,CAAA;KAEP,kBAAC,OAAD;MACE,KAAK8c;MACL,WAAWE,IAAY,wBAAwB;MAC/C,OAAO;OAAE,QAAQyC;OAAQ,OAAOC;MAAO;MACvC,iBAAiB1C,KAAa,KAAA;MAC9B,gCAAA;MACA,YAAY;MACZ,cAAc,MAAM;OAClB,IAAI,CAACA,GAAW;OAEhB,IAAM,IAAI,EAAE,QACNlC,IAAM,EAAE,YAAY,QAAQ,EAAE,QAAqB,YAAY,IAAI,MACnEhc,IAAMgc,KAAOgC,EAAS,UAAUlf,EAAWkf,EAAS,SAAShC,GAAK,CAAC,IAAI;OAC7E,AAAIhc,MACF,EAAE,eAAe,GACjBkZ,EAAO,aAAalZ,EAAI,IAAIA,EAAI,CAAC;MAErC;MACA,iBAAiB;OACf,AAAIkZ,EAAO,WAAS,iBAAiBA,EAAO,aAAa,GAAG,CAAC;MAC/D;MACA,gBAAgB,MAAM;OACpB,AAAKgF,MACL,EAAE,eAAe,GACjBI,GAAW;QAAE,GAAG,EAAE;QAAS,GAAG,EAAE;OAAQ,CAAC;MAC3C;MAzBF,UAAA,CA2BGvB,EAAM,KAAK,GAAG,OACZ7b,IAAIoQ,KAASpQ,IAAIqQ,MAASrQ,MAAM6f,KAAY,OAC3C,kBAACmB,IAAD;OAEE,OAAOhhB;OACP,OAAO2f;OACP,OAAO7b;OACP,QAAQ0L,EAAG;OACL;OACA;OACN,KAAK8P,GAAKtf;OACJ;OACN,QAAQqf,GAAYrf;OACpB,MAAMmf;OACE;OACE;OACV,SAASnC;MACV,GAdMhd,CAcN,CAEL,GACCwf,IAAW,KAAK,kBAAC,OAAD;OAAK,WAAU;OAAmB,iBAAiB;OAAO,OAAO;QAAE,KAAKD;QAAK;QAAM,OAAON,IAAQE;QAAG,QAAQD,KAAQC;OAAE;MAAI,CAAA,CACzI;;KACJrB,MACC,kBAAC,OAAD;MAAK,WAAU;MAAa,OAAO;OAAE,MAAMA,GAAO;OAAG,KAAKA,GAAO;OAAG,OAAOA,GAAO;OAAG,QAAQA,GAAO;MAAE;MAAtG,UAAA,CACGliB,GAAQ,KAAK,MACZ,kBAAC,QAAD;OAAc,WAAW,mBAAmB4L;OAAK,cAAc,MAAMma,GAAYna,GAAG3I,CAAC;MAAI,GAA9E2I,CAA8E,CAC1F,GACAyW,GAAY,WACX,kBAAC,QAAD;OAAM,WAAU;OAAhB,UAAA;QACG,KAAK,MAAMH,GAAO,IAAIG,GAAY,OAAO;QAAE;QAAI,KAAK,MAAMH,GAAO,IAAIG,GAAY,OAAO;QAAE;OACvF;MAEL,CAAA,CAAA;;IAEJ;;GACJR,MACC,kBAAC,OAAD;IAAK,WAAU;IAAa,cAAW;IAAvC,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAAC,QAAD,EAAA,UAAM,UAAa,CAAA,GACnB,kBAAC,UAAD;MAAQ,MAAK;MAAS,WAAU;MAAQ,OAAM;MAAgB,cAAW;MAAgB,eAAeC,GAAW,EAAK;MAAG,UAAA;KAEnH,CAAA,CACL;IACJ,CAAA,GAAA+E,GAAS,SACRA,GAAS,KAAK,GAAG,MACf,kBAAC,UAAD;KAAmB,MAAK;KAAS,WAAWziB,MAAM2iB,KAAgB,uBAAuB;KAAmB,OAAO,EAAE,aAAa,KAAKrf,EAAE,MAAM,GAAG;KAAG,eAAesf,GAAUtf,EAAE,EAAE;KAC/K,UAAAA,EAAE;IACG,GAFKA,EAAE,EAEP,CACT,IAED,kBAAC,OAAD;KAAK,WAAU;KAAmB,UAAA;IAAuD,CAAA,CAExF;;GAEN2Z,EAAK,QACJ,kBAACtE,IAAD;IACE,OAAOsE,EAAK;IACZ,OAAOA,EAAK;IACZ,OAAOuD,GAAQ;IACf,UAAUxD;IACV,UAAU,MAAME,EAAQ;KAAE,MAAM;KAAM;KAAG,KAAK;IAAE,CAAC;IACjD,QAAQ,MAAMsD,GAAQ,UAAUC,IAAWxD,EAAK,MAAMzV,IAAIgZ,GAAQ,UAAUA,GAAQ,MAAM;IAC1F,eAAetD,EAAQ;KAAE,MAAM;KAAO,GAAGD,EAAK;KAAG,KAAK;IAAE,CAAC;IACzD,YAAY,GAAM,MAAQ;KACxB,AAAKuD,GAAQ,WACTlW,IAAK,CAAC,GAAGkW,EAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,SAAS,MAAMM,GAAavW,GAAGtL,CAAI,CAAC,IAC/D6hB,GAAaN,GAAQ,KAAK,IAAIvD,EAAK,KAAKuD,GAAQ,SAAS,CAAC,IAAIvhB,CAAI;IACzE;GACD,CAAA;GAEF+d,KACC,kBAAClF,IAAD;IACU;IACR,QAAQyE,GAAM,UAAU,CAAC;IACzB,cAAcW,GAAS,OAAO;KAAE,GAAGrb;KAAG,MAAM;IAAK,EAAE;IAC1C;IACT,iBAAiB6b,IAAY,MAAM,CAACzW,CAAC;IAC5B;IACT,QAAQkZ;IACR,OAAOuB;GACR,CAAA;GAEF,CAAC1E,KAAazU,KACb,kBAAC,UAAD;IAAQ,MAAK;IAAS,WAAWkV,KAAU,yBAAyB;IAAqB,OAAM;IAAmB,eAAeC,IAAY,MAAM,CAACzW,CAAC;IAAG,UAAA;GAEhJ,CAAA;GAETkW,MAAW,kBAACrP,IAAD;IAAa,GAAGqP,GAAQ;IAAG,GAAGA,GAAQ;IAAG,OAAOoF,GAAS;IAAG,eAAenF,GAAW,IAAI;GAAI,CAAA;GACzGC,MAAU,kBAAC9O,IAAD;IAAc,MAAM8O;IAAQ,eAAeC,EAAU,IAAI;GAAI,CAAA;GACvEC,KAAS,kBAAC3O,IAAD;IAAO,MAAM2O;IAAO,cAAcC,GAAS,IAAI;GAAI,CAAA;GAC7D,kBAAC/P,IAAD;IAAmB;IAAM,WAAW0R;IAAG,UAAUzC;GAAU,CAAA;GAC3D,kBAACpP,IAAD;IAAQ,MAAM0S;IAAkB;GAAW,CAAA;EACxC;;AAET;AAkBA,SAASgB,GAAS,EAAE,UAAO,UAAO,UAAO,WAAQ,SAAM,SAAM,QAAK,SAAM,WAAQ,SAAM,WAAQ,aAAU,cAA0B;CAChI,IAAMpG,IAAMmC,UAA0B;EAAE;EAAQ,MAAM8F;EAAO,OAAOzP;EAAO,WAAW;EAAO,UAAU0P;CAAQ,IAAI;EAACxe;EAAQue;EAAOzP;EAAO0P;CAAO,CAAC,GAC5IC,IAAQhG,UAA0B;EAAE,GAAGnC;EAAK,UAAU;CAAM,IAAI,CAACA,CAAG,CAAC,GACrExK,IAAQyS,MAAU,KAAKtG,GAAM,SAC7ByG,IAAS5S,IAAQmM,GAAM,cAAcA,GAAM,QAC3C0G,IAAS7S,IAAQmM,GAAM,cAAcA,GAAM,QAC3CtT,IAAQ,CAAC;CACf,KAAK,IAAIjJ,IAAIkjB,EAAM,OAAOljB,IAAIkjB,EAAM,KAAK,KAAK;EAC5C,IAAMpZ,IAAIwJ,EAAOtT;EACjB,EAAM,KACJ,kBAACgb,IAAD;GAEE,OAAOlR;GACF;GACL,IAAIsR,GAAStR,CAAC,KAAKA,EAAE,MAAM,QAAQ,OAAO9J,CAAC,IAAI,KAAA;GAC/C,IAAIwa,GAAW1Q,GAAGwJ,EAAOtT,IAAI,IAAIsT,EAAOtT,IAAI,EAAE;EAC/C,GALM,GAAGA,EAAE,GAAG8J,EAAE,MAAM,MAAMA,EAAE,OAAO,IAAI,GAKzC,CACH;CACF;CACA,OACE,kBAAC,OAAD;EAAK,WAAU;EAAU,OAAO;GAAE;GAAK;GAAM,OAAOqU,EAAK,IAAI1C,KAAK5N;GAAM;EAAO;EAAG,aAAWgV,IAAQ;EACnG,UAAA,kBAAC,OAAD;GAAK,WAAU;GAAuB,OAAO;IAAE,GAAG9B;IAAU,OAAO,GAAG5C,EAAK,EAAE;IAAK,QAAQgF,IAAStV;IAAM;GAAK;GAA9G,UAAA;IACGmV,KACC,kBAAC,OAAD;KAAK,WAAU;KAAQ,iBAAiB,MAAkB,KAAA;KAAW,OAAO;MAAE,KAAK,GAAG7E,EAAK,OAAO;MAAK,SAAS,KAAKA,EAAK,GAAG,OAAOA,EAAK,GAAG;KAAI;KAC7I,UAAA6E,EAAO,KAAK,GAAG,MACd,kBAAChI,IAAD;MAAmB,OAAOlR;MAAG,KAAKiZ;KAAQ,GAA1B/iB,CAA0B,CAC3C;IACE,CAAA;IAEP,kBAAC,OAAD;KAAK,OAAO;MAAE,UAAU;MAAY,KAAK,GAAGme,EAAK,GAAG;MAAK,MAAM,GAAGA,EAAK,GAAG;MAAK,OAAO,GAAGA,EAAK,IAAIA,EAAK,KAAKA,EAAK,GAAG;KAAI;KAAI,UAAAlV;IAAW,CAAA;IACtIga,KACC,kBAAC,OAAD;KAAK,WAAU;KAAQ,iBAAiB,MAAkB,KAAA;KAAW,OAAO;MAAE,QAAQ,GAAG9E,EAAK,OAAO;MAAK,SAAS,KAAKA,EAAK,GAAG,OAAOA,EAAK,GAAG;KAAI;KAChJ,UAAA8E,EAAO,KAAK,GAAG,MACd,kBAACjI,IAAD;MAAmB,OAAOlR;MAAG,KAAKiZ;KAAQ,GAA1B/iB,CAA0B,CAC3C;IACE,CAAA;GAEJ;;CACF,CAAA;AAET;;AC31BA,IAAMojB,KAA2B;CAC/B,CAAC,SAAS,OAAO;CACjB,CAAC,WAAW,SAAS;CACrB,CAAC,WAAW,QAAQ;CACpB,CAAC,YAAY,UAAU;CACvB,CAAC,eAAe,UAAU;CAC1B,CAAC,kBAAkB,kBAAkB;CACrC,CAAC,WAAW,SAAS;CACrB,CAAC,YAAY,UAAU;AACzB;AAGA,eAAeC,GAAU,GAAqD;CAC5E,IAAMC,IAAM,OAAO,MAAMhf,EAAO,KAAK,QAAQ,mBAAmB,EAAA,CAAG,KAAK,GAClEa,IAAM,IAAI,UAAU,CAAC,CAAC,gBAAgBme,GAAK,iBAAiB,GAC5DjkB,IAA0B,CAAC;CACjC,KAAK,IAAM,CAAC4F,GAAK4C,MAAUub,IAAM;EAC/B,IAAMte,IAAIK,EAAI,uBAAuB,KAAKF,CAAG,CAAC,CAAC,EAAE,EAAE,aAAa,KAAK;EACrE,IAAI,CAACH,GAAG;EACR,IAAMye,IAAOte,MAAQ,aAAaA,MAAQ,aAAa,IAAI,KAAKH,CAAC,IAAI;EACrE,EAAI,KAAK,CAAC+C,GAAO0b,KAAQ,CAAC,MAAMA,EAAK,QAAQ,CAAC,IAAIA,EAAK,eAAe,IAAIze,CAAC,CAAC;CAC9E;CACA,OAAOzF;AACT;AAEA,SAAgBmkB,GAAc,GAA6G;CACzI,IAAM,CAACnK,GAAMoK,KAAWvgB,EAA6B,CAAC,CAAC,GACjDwgB,IAAW3gB,EAA0B,IAAI;CAC/C,QAAgB;EACd,EAAS,SAAS,MAAM;EACxB,IAAIsB,IAAO;EAKX,OAJAgf,GAAUpd,EAAM,MAAM,CAAC,CAAC,MACrB,MAAM5B,KAAQof,EAAQ3a,CAAC,SAClB,CAAC,CACT,SACa;GACX,IAAO;EACT;CACF,GAAG,CAAC7C,EAAM,MAAM,CAAC;CACjB,IAAM0d,IAAS;EAAC1d,EAAM;EAAMoT;EAAMpT,EAAM;CAAK,CAAC,CAAC,QAAQ,MAAMwK,EAAE,MAAM;CACrE,OACE,kBAAC,OAAD;EACE,WAAU;EACV,cAAc,MAAM5R,EAAE,WAAWA,EAAE,iBAAiBoH,EAAM,QAAQ;EAClE,YAAY,MAAM;GAChB,AAAIpH,EAAE,QAAQ,aACZA,EAAE,gBAAgB,GAClBoH,EAAM,QAAQ;EAElB;EAEA,UAAA,kBAAC,OAAD;GAAK,WAAU;GAAY,MAAK;GAAS,cAAW;GAApD,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;KAAkB,UAAA;IAAqB,CAAA;IACtD,kBAAC,MAAD;KAAI,WAAU;KACX,UAAA0d,EAAO,KAAK,GAAG,MACd,kBAAC7b,GAAD,EAAA,UAAA,CACGP,IAAI,KAAK,kBAAC,OAAD,EAAK,WAAU,iBAAkB,CAAA,GAC1CkJ,EAAE,KAAK,CAAC5I,GAAO+b,OACd,kBAAC9b,GAAD,EAAA,UAAA,CACE,kBAAC,MAAD,EAAA,UAAKD,EAAU,CAAA,GACf,kBAAC,MAAD,EAAA,UAAK+b,EAAU,CAAA,CACP,EAAA,GAHK/b,CAGL,CACX,CACO,EAAA,GARKN,CAQL,CACX;IACC,CAAA;IACJ,kBAAC,OAAD;KAAK,WAAU;KACb,UAAA,kBAAC,UAAD;MAAQ,KAAKmc;MAAU,MAAK;MAAS,WAAU;MAAwB,SAASzd,EAAM;MAAS,UAAA;KAEvF,CAAA;IACL,CAAA;GACF;;CACF,CAAA;AAET;;ACnEA,IAAM4d,KAAY,2EACZC,KAAY,qEAEZC,KAAM,mEACNC,KAAM,uEACNC,KAAU,gEACVC,KAAU,sKAEVC,MAAY,MAChB,GAAGJ,GAAI,wBAAwBE,GAAQ,kCAAkCD,GAAI,2BAA2Bhf,EAAO;AAKjH,SAAgBof,GAAgB,GAAsB;CACpD,IAAMhM,IAAOnZ,EAAK,MAAM,GAAG,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,IAC7CmU,KAAS,MAAegF,EAAK,MAAMiM,CAAE,CAAC,CAAC,SAAS,GAChDC,IAAOlR,EAAM,GAAI,GACjBmR,IAAQnR,EAAM,GAAG,GACjBoR,IAASpR,EAAM,GAAG;CAExB,OADIkR,IAAO,KAAKA,KAAQC,KAASD,KAAQE,IAAe,MACjDD,IAAQC,IAAS,MAAM;AAChC;AAGA,SAAgBC,GAAS,GAAc,IAAML,GAAgBnlB,CAAI,GAAe;CAC9E,IAAMmS,IAAmB,CAAC,GACtBI,IAAgB,CAAC,GACjBkT,IAAQ,IACRC,IAAS,IACT3kB,IAAI,IAAK,WAAW,CAAC,MAAM,QACzByC,IAAIxD,EAAK;CACf,OAAOe,IAAIyC,GAAG,KAAK;EACjB,IAAM4hB,IAAKplB,EAAKe;EAChB,AAAI2kB,IACEN,MAAO,OACLplB,EAAKe,IAAI,OAAO,QAClB,KAAS,MACT,OACK,IAAS,KACX,KAASqkB,IACPA,MAAO,QAAOK,MAAU,KAAI,IAAS,KACvCL,MAAOlK,KACd3I,EAAI,KAAKkT,CAAK,GACd,IAAQ,MACCL,MAAO,QAAQA,MAAO,QAC3BA,MAAO,QAAQplB,EAAKe,IAAI,OAAO,QAAM,KACzCwR,EAAI,KAAKkT,CAAK,GACdtT,EAAK,KAAKI,CAAG,GACb,IAAM,CAAC,GACP,IAAQ,MACH,KAAS6S;CAClB;CAKA,QAJIK,MAAU,MAAMlT,EAAI,YACtBA,EAAI,KAAKkT,CAAK,GACdtT,EAAK,KAAKI,CAAG,IAERJ;AACT;AAEA,SAASwT,GAAQ,GAAmB;CAClC,IAAIrhB,IAAI;CACR,KAAK,IAAI,IAAIuF,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK,OAAO,IAAI,KAAK,EAAE,GAAG,IAAI,OAAO,aAAa,MAAO,IAAI,KAAK,EAAG,IAAIvF;CACxG,OAAOA;AACT;AAEA,IAAMshB,KAAS;AAGf,SAASC,GAAQ,GAAa,GAAW,GAA+B;CACtE,IAAIhgB,MAAM,IAAI,OAAO;CACrB,IAAItF,IAAIsF,EAAE,KAAK;CAIf,OAHIigB,KAAgB,iBAAiB,KAAKvlB,CAAC,MAAG,IAAIA,EAAE,QAAQ,KAAK,GAAG,IAChEqlB,GAAO,KAAKrlB,CAAC,KAAK,CAAC,YAAY,KAAKA,CAAC,KAAKA,EAAE,QAAQ,OAAO,EAAE,CAAC,CAAC,UAAU,KAAW,SAASsD,EAAI,OAAO,OAAOtD,CAAC,EAAE,YAClH,kBAAkB,KAAKA,CAAC,IAAU,SAASsD,EAAI,aAAa,aAAU,KAAKtD,CAAC,EAAU,YACnF,SAASsD,EAAI,8CAA8CpG,EAAQoI,CAAC,EAAE;AAC/E;AAMA,SAAgBkgB,GAAW,GAAkB,IAAY,UAAU,IAAe,IAAsB;CACtG,IAAM7b,IAAmB,CAAC,GACtB2N,IAAO;CACX,EAAK,SAAS,GAAK,MAAM;EACvB,IAAItG,IAAQ;EAMZ,AALAgB,EAAI,SAAS,GAAG,MAAM;GACpB,KAASsT,GAAQF,GAAQ9b,CAAC,KAAK/C,IAAI,IAAIjB,GAAGigB,CAAY;GACtD,IAAME,IAAM,KAAK,IAAI,GAAGngB,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,MAAMkQ,EAAE,MAAM,CAAC;GAC1D,AAAIiQ,KAAO9b,EAAOL,MAAM,OAAI,EAAOA,KAAKmc;EAC1C,CAAC,GACGzU,MAAO,KAAQ,WAAWzK,IAAI,EAAE,IAAIyK,EAAM;CAChD,CAAC;CACD,IAAIS,IAAO;CACX,EAAO,SAAS,GAAK,MAAM;EACzB,AAAIgU,IAAM,MAAG,KAAQ,aAAanc,IAAI,EAAE,SAASA,IAAI,EAAE,WAAW,KAAK,IAAI,IAAImc,IAAM,CAAC,EAAE;CAC1F,CAAC;CACD,IAAMzjB,IAAO0jB,EAAU,QAAQ,gBAAgB,GAAG,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK,UACrEC,IAAK,6DACL1jB,oBAAQ,IAAI,IAAoB;EACpC,CACE,uBACA,GAAGsiB,GAAI,8EAA8EG,GAAA,2YAIvF;EACA,CAAC,eAAeC,GAAS,iBAAiB,CAAC;EAC3C,CACE,mBACA,GAAGJ,GAAI,mBAAmBoB,EAAG,aAAanB,GAAI,+DAA+DvnB,EAAQ+E,CAAI,EAAE,gDAC7H;EACA,CACE,8BACA,GAAGuiB,GAAI,wBAAwBE,GAAQ,kCAAkCD,GAAI,4EAA4EA,GAAI,+CAC/J;EACA,CACE,iBACA,GAAGD,GAAI,qBAAqBoB,EAAG,okBAMjC;EACA,CACE,4BACA,GAAGpB,GAAI,oBAAoBoB,EAAG,aAAanB,GAAI,kGAC1C/S,IAAO,SAASA,EAAK,WAAW,GAAG,aAAa6F,EAAK,yBAC5D;CACF,CAAC;CACD,OAAO/Z,EAAS0E,GAAOqiB,EAAS;AAClC;AAkBA,SAAgBsB,GAAY,GAA4B;CACtD,OAAOnmB,EACJ,QAAQ,MAAM,EAAE,CAAC,CACjB,MAAM,YAAY,CAAC,CACnB,KAAK,OAAU,EAAE,MAAMmZ,IAAO,CAAC,EAAE,MAAMA,EAAK,CAAC,IAAI,CAAC,EAAE,EAAE;AAC3D;AAEA,IAAMiN,MAAW,MAAc9hB,EAAE,QAAQ,MAAM,OAAO,CAAC,CAAC,QAAQ,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,QAAQ;AAG1H,SAAS+hB,GAAS,GAAmB;CACnC,IAAMC,IAAiB,CAAC;CASxB,OARA,IAAIhiB,EAAE,QAAQ,eAAe,GAAG,MAAc,SAASgiB,EAAK,KAAKzc,CAAC,IAAI,EAAE,OAAO,GAC/E,IAAIvF,EACD,QAAQ,oCAAoC,IAAI,CAAC,CACjD,QAAQ,oCAAoC,GAAG,GAAW,MAAe,mBAAmB,KAAKgB,CAAC,IAAI,IAAI,YAAYA,EAAE,IAAI,EAAE,KAAM,CAAC,CACrI,QAAQ,kCAAkC,WAAW,CAAC,CACtD,QAAQ,2CAA2C,aAAa,CAAC,CACjE,QAAQ,yCAAyC,aAAa,CAAC,CAC/D,QAAQ,2BAA2B,WAAW,GAC1ChB,EAAE,QAAQ,uBAAuB,GAAG,MAAc,SAASgiB,EAAK,OAAOvlB,CAAC,GAAG,QAAQ;AAC5F;AAGA,SAAgBwlB,GAAe,GAAoB;CACjD,IAAMxO,IAAQyO,EAAG,QAAQ,MAAM,EAAE,CAAC,CAAC,MAAM,YAAY,GAC/CpmB,IAAgB,CAAC,GACnB0Q,IAAiB,CAAC,GAClBrE,IAA2B,MACzBga,UAAc;EAElB,AADI3V,EAAK,UAAQ1Q,EAAI,KAAK,MAAMimB,GAASD,GAAQtV,EAAK,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,GACvE,IAAO,CAAC;CACV,GACM4V,UAAkB;EAEtB,AADIja,KAAMrM,EAAI,KAAK,KAAKqM,EAAK,EAAE,GAC/B,IAAO;CACT;CACA,KAAK,IAAI1L,IAAI,GAAGA,IAAIgX,EAAM,QAAQ,KAAK;EACrC,IAAMoB,IAAOpB,EAAMhX,IACb4lB,IAAQ,gBAAgB,KAAKxN,CAAI;EACvC,IAAIwN,GAAO;GAET,AADAF,EAAM,GACNC,EAAU;GACV,IAAME,IAAiB,CAAC;GACxB,OAAO,EAAE7lB,IAAIgX,EAAM,UAAU,CAACA,EAAMhX,EAAE,CAAC,UAAU,CAAC,CAAC,WAAW4lB,EAAM,EAAE,IAAG,EAAK,KAAK5O,EAAMhX,EAAE;GAC3F,EAAI,KAAK,cAAcqlB,GAAQQ,EAAK,KAAK,IAAI,CAAC,EAAE,cAAc;GAC9D;EACF;EACA,IAAI,CAACzN,EAAK,KAAK,GAAG;GAEhB,AADAsN,EAAM,GACNC,EAAU;GACV;EACF;EACA,IAAMriB,IAAI,oCAAoC,KAAK8U,CAAI;EACvD,IAAI9U,GAAG;GAGL,AAFAoiB,EAAM,GACNC,EAAU,GACVtmB,EAAI,KAAK,KAAKiE,EAAE,EAAE,CAAC,OAAO,GAAGgiB,GAASD,GAAQ/hB,EAAE,EAAE,CAAC,EAAE,KAAKA,EAAE,EAAE,CAAC,OAAO,EAAE;GACxE;EACF;EACA,IAAI,iCAAiC,KAAK8U,CAAI,GAAG;GAE/C,AADAsN,EAAM,GACNC,EAAU;GACV;EACF;EAEA,IAAIvN,EAAK,SAAS,GAAG,KAAK,oDAAoD,KAAKpB,EAAMhX,IAAI,MAAM,EAAE,GAAG;GAEtG,AADA0lB,EAAM,GACNC,EAAU;GACV,IAAMnV,KAAS,MAAcwE,EAAE,KAAK,CAAC,CAAC,QAAQ,YAAY,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,MAAMsQ,GAASD,GAAQvc,EAAE,KAAK,CAAC,CAAC,CAAC,GACzGsI,IAAO,CAAC,OAAOZ,EAAM4H,CAAI,CAAC,CAAC,KAAK,MAAM,UAAUtP,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE,MAAM;GAEnF,KADA,KACO9I,IAAI,IAAIgX,EAAM,UAAUA,EAAMhX,IAAI,EAAE,CAAC,SAAS,GAAG,KAAKgX,EAAMhX,IAAI,EAAE,CAAC,KAAK,IAAG,EAAK,KAAK,OAAOwQ,EAAMwG,EAAM,EAAEhX,EAAE,CAAC,CAAC,KAAK,MAAM,OAAO8I,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,MAAM;GAChK,EAAI,KAAK,UAAUsI,EAAK,KAAK,EAAE,EAAE,SAAS;GAC1C;EACF;EACA,IAAM0U,IAAK,oCAAoC,KAAK1N,CAAI;EACxD,IAAI0N,GAAI;GACN,EAAM;GACN,IAAMtQ,IAAOsQ,EAAG,KAAK,OAAO;GAM5B,AALIpa,MAAS8J,MACXmQ,EAAU,GACVtmB,EAAI,KAAK,IAAImW,EAAK,EAAE,GACpB,IAAOA,IAETnW,EAAI,KAAK,OAAOimB,GAASD,GAAQS,EAAG,EAAE,CAAC,QAAQ,kBAAkB,MAAOvb,EAAE,OAAO,MAAM,OAAO,IAAK,CAAC,CAAC,EAAE,MAAM;GAC7G;EACF;EACA,IAAMjL,IAAI,gBAAgB,KAAK8Y,CAAI;EACnC,AAAI9Y,KACFomB,EAAM,GACNC,EAAU,GACVtmB,EAAI,KAAK,kBAAkBimB,GAASD,GAAQ/lB,EAAE,EAAE,CAAC,EAAE,kBAAkB,KAGnEoM,KAAQ,YAAY,KAAK0M,CAAI,IAE/B,EAAI/Y,EAAI,SAAS,KAAKA,EAAIA,EAAI,SAAS,EAAE,CAAC,QAAQ,WAAW,IAAIimB,GAASD,GAAQjN,EAAK,KAAK,CAAC,CAAC,EAAE,MAAM,KAGxGuN,EAAU,GACV5V,EAAK,KAAKqI,EAAK,KAAK,CAAC;CACvB;CAGA,OAFAsN,EAAM,GACNC,EAAU,GACHtmB,EAAI,KAAK,IAAI;AACtB;AAEA,IAAM0mB,KAAkC,OAAO,YAAY,OAAO,QAAQxpB,CAAS,CAAC,CAAC,KAAK,CAACgL,GAAGzC,OAAO,CAACA,GAAGyC,CAAC,CAAC,CAAC;AAE5G,SAASye,GAAO,GAAiC;CAC/C,IAAI,CAAC1d,GAAK,OAAO;CACjB,IAAI1F,IAAI;CAMR,AALI0F,EAAI,SAAM,KAAK,sBAAsB7L,EAAQ6L,EAAI,IAAI,EAAE,aAAa7L,EAAQ6L,EAAI,IAAI,EAAE,gBAAgB7L,EAAQ6L,EAAI,IAAI,EAAE,UAAU7L,EAAQ6L,EAAI,IAAI,EAAE,OACpJA,EAAI,MAAG,KAAK,WACZA,EAAI,MAAG,KAAK,WACZA,EAAI,WAAQ,KAAK,gBACjBA,EAAI,UAAO,KAAK,mBAAmBA,EAAI,MAAM,QAAQ,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,OAC5EA,EAAI,OAAI,KAAK,gBAAgB,KAAK,MAAMA,EAAI,KAAK,CAAC,EAAE,oBAAoB,KAAK,MAAMA,EAAI,KAAK,CAAC,EAAE;CACnG,IAAM2d,IAAK3d,EAAI,KAAKyd,GAAQzd,EAAI,GAAG,YAAY,KAAK,KAAA;CAKpD,OAJI2d,MAAI,KAAK,uBAAuBA,EAAG,OACnC3d,EAAI,KAAKA,EAAI,MAAM,WAAQ,KAAK,eAAeA,EAAI,EAAE,OACrDA,EAAI,MAAM,CAAC2d,MAAI,KAAK,+CAA+C3d,EAAI,GAAG,QAAQ,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,OACzGA,EAAI,OAAI,KAAK,uBAAuBA,EAAI,OAAO,QAAQ,gBAAgB,YAAY,OAChF1F,IAAI,UAAUA,EAAE,YAAY;AACrC;AAEA,SAASsjB,GAAO,GAAsB;CACpC,IAAIL,IAAO;CACX,KAAK,IAAMM,KAASpgB,EAAE,KAAK,MAAM,SAAS,GACxC,AAAKogB,MACL,AAEKN,KAFDM,MAAU,MAAc,aACnBA,MAAU,OAAc,YACpB,6BAA6BzpB,EAAQypB,CAAK,EAAE;CAE3D,OAAON,IAAO,QAAQG,GAAOjgB,EAAE,GAAG,IAAI8f,EAAK,UAAU;AACvD;AAEA,SAASO,KAAwB;CAC/B,IAAMne,IAAQ;EAAC;EAAI;EAAI;EAAI;EAAI;EAAI;CAAE,GACjCrF,IAAI;CAQR,OAPAqF,EAAM,SAAS,GAAI,MAAM;EACvB,IAAMxF,IAAI8E,IAAI;EACd,KACE,iDAAiD9E,EAAE,2BAA2BA,EAAE,oJACtBA,KAAK,IAAI,MAAM,IAAI,aAAaA,KAAK,IAAI,MAAM,GAAG,0BAA0B8E,EAAE,oBAC9H9E,KAAK,IAAI,WAAW,KAAKA,KAAK,IAAI,WAAW,GAAG,kBAAkBA,KAAK,IAAI,WAAW,SAAS,kBAAkB0V,IAAK,EAAE,oBAAoBA,IAAK,EAAE;CACjK,CAAC,GACMvV;AACT;AAEA,SAASyjB,GAAa,GAAuC;CAC3D,IACMC,IAAU;EAAC;EAAK;EAAK;CAAG,GACxBC,IAAU;EAAC;EAAW;EAAe;CAAY,GACjDC,KAAQ,MACZ,MAAM,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAM;EAClC,IAAMC,IAAMjR,MAAS,WAAW,WAAW+Q,EAAQvR,IAAI,IACjD/V,IAAOuW,MAAS,WAAW8Q,EAAQtR,IAAI,KAAK,IAAIA,IAAI,EAAE,IACtDiD,IAAOzC,MAAS,WAAW,mEAA+D;EAChG,OAAO,kBAAkBR,EAAE,yCAAyCyR,EAAI,uBAAuBxnB,EAAK,kDAAkD,OAAO+V,IAAI,GAAG,6BAA6BiD,EAAK;CACxM,CAAC,CAAC,CAAC,KAAK,EAAE,GACRrV,IAAI,GAAGmhB,GAAI;CASf,OARA,KAAK,kFAAkFyC,EAAK,QAAQ,EAAE,mBACtG,KAAK,kFAAkFA,EAAK,QAAQ,EAAE,mBAEtGE,EAAK,SAAS,GAAM,MAAM;EAGxB,AAFA,KAAK,mBAAmBnf,IAAI,EAAE,4BAA4BiO,MAAS,WAAW,IAAI,EAAE,MAChFA,MAAS,aAAU,KAAK,+EAC5B,KAAK;CACP,CAAC,GACM5S,IAAI;AACb;AAGA,SAAgB+jB,GAAY,GAAoC;CAC9D,IAAMC,IAAI,gEACJ7P,IAAkB,CAAC,GACnB2P,IAAgC,CAAC,GACnC7M,GACAgM,IAAO;CACX,KAAK,IAAM/hB,KAAKiR,GAAO;EACrB,IAAI8R,IAAM;EAOV,AANI/iB,EAAE,WAAWA,EAAE,WAAW,KAAKA,EAAE,WAAW,IAAG,KAAO,2BAA2BA,EAAE,QAAQ,OACtFA,EAAE,SAAM,KAAO,wCACpBA,EAAE,SACAA,EAAE,SAAS+V,KAAU6M,EAAK,KAAK5iB,EAAE,IAAI,GACzC,KAAO,+CAA+C4iB,EAAK,OAAO,iBAEpE,IAAW5iB,EAAE;EACb,IAAImP,IAAO;EACX,KAAK,IAAIjT,IAAI,GAAGA,IAAI8D,EAAE,KAAK,SAAU;GACnC,IAAM4S,IAAO5S,EAAE,KAAK9D,EAAE,CAAC;GACvB,IAAI,CAAC0W,GAAM;IACT,KAAQwP,GAAOpiB,EAAE,KAAK,IAAI;IAC1B;GACF;GACA,IAAIgjB,IAAQ;GACZ,OAAO9mB,IAAI8D,EAAE,KAAK,UAAUA,EAAE,KAAK9D,EAAE,CAAC,SAAS0W,IAAM,KAASwP,GAAOpiB,EAAE,KAAK,IAAI;GAChF,AAAI,mBAAmB,KAAK4S,CAAI,IAAG,KAAQoQ,KAEzC/P,EAAM,KAAKL,CAAI,GACf,KAAQ,0BAA0BK,EAAM,OAAO,kBAAkB+P,EAAM;EAE3E;EACA,KAAQ,QAAQD,IAAM,UAAUA,EAAI,YAAY,KAAK5T,EAAK;CAC5D;CACA,AAAW4S,MAAO;CAClB,IACMvN,IACJ,GAAGyL,GAAI,qBAAqB6C,EAAE,ibAG9BR,GAAc,IACd,gcAGIW,IACJ,GAAGhD,GAAI,wBAAwBE,GAAQ,kCAAkCD,GAAI,8DAA8DA,GAAI,wCAC/IjN,EAAM,KAAK,GAAG,MAAM,yBAAyBxP,IAAI,EAAE,UAAUyc,GAAI,sBAAsBvnB,EAAQ8H,CAAC,EAAE,0BAA0B,CAAC,CAAC,KAAK,EAAE,IACrI,oBACI9C,oBAAQ,IAAI,IAAoB;EACpC,CACE,uBACA,GAAGsiB,GAAI,8EAA8EG,GAAA,qZAIvF;EACA,CAAC,eAAeC,GAAS,mBAAmB,CAAC;EAC7C,CAAC,gCAAgC4C,CAAI;EACrC,CAAC,qBAAqB,GAAGhD,GAAI,uBAAuB6C,EAAE,aAAa5C,GAAI,YAAY6B,8LAAmC;EACtH,CAAC,mBAAmBvN,CAAM;EAC1B,CAAC,sBAAsB+N,GAAaK,CAAI,CAAC;CAC3C,CAAC;CACD,OAAO3pB,EAAS0E,GAAOoiB,EAAS;AAClC;AAIA,IAAMmD,KAAO,yDAEPC,KAAM,YAAYD,GAAK,aAAahD,GAAI,yEACxCkD,KAAM;AAGZ,SAASC,GAAG,GAAY,GAAc,GAAqB,GAAoB,GAAiB,IAAO,qEAA2E;CAGhL,OAAO,gCAAgCtY,EAAG,UAAUrN,EAAK,gEAF1C4lB,IAAO,UAAUA,EAAK,KAAK,OAAOjT,MAAQ,OAAyB,KAAlB,SAASA,EAAI,IAEiD,wBADnHkT,IAAO,6BAA6BA,EAAK,GAAG,OAAOA,EAAK,GAAG,gBAAgBA,EAAK,GAAG,QAAQA,EAAK,GAAG,yBAAyB,YACkB,YAAYxB,EAAK;AAC5K;AAEA,IAAMyB,KACJ,GAAGvD,GAAI,oBAAoBiD,GAAK,i4DAgB5BlN,MAAO,GAAW,GAAY,MAClC,SAASrX,EAAE,YAAY8kB,IAAS,UAAU9kB,IAAI,KAAK,SAAS,EAAE,YAAY8kB,IAAS,UAAU,EAAE,gBAC9FA,IAAS,yDAAqD,iBAC/D,iBAAiBpP,EAAG,iHAAiH1V,EAAE;AAGzI,SAAgB+kB,KAA2B;CACzC,IAEMC,IACJ,GAAG1D,GAAI,eAAekD,GAAI,wFAAwFC,OAClHC,GAAG,GAAG,uBAAuB,SAAS,MAAM;EAAC;EAAQ;EAAQ;EAAU;CAAO,GAAG,kFAA8E,IAC/JA,GAAG,GAAG,sBAAsB,QAAQ,GAAG;EAAC;EAAQ;EAAS;EAAU;CAAO,CAAC,IAC3E,4lBAGgBrN,GAAI,GAAG,MAAM,EAAI,IAAIA,GAAI,GAAG,MAAM,EAAI,IAAIA,GAAI,GAAG,KAAM,EAAI,IAAIA,GAAI,GAAG,MAAM,EAAI,IAAIA,GAAI,GAAG,MAAM,EAAI,EAAE,8BACtGA,GAAI,GAAG,MAAM,EAAK,EAAE,6CACjCnQ,KAAU,GAAc,GAAc,MAC1C,GAAGoa,GAAI,eAAekD,GAAI,SAASG,EAAK,+BAA+B5lB,EAAK,cAAc0lB,KAAMQ,EAAO,qFACnGC,KAAU,GAAY,MAAmB,qBAAqBtT,EAAO,gEAAgE8D,EAAG,sEACxIyP,IAAcje,EAClB,SACA,eACAwd,GAAG,GAAG,WAAW,YAAY,MAAM;EAAC;EAAS;EAAS;EAAS;CAAO,GAAGQ,EAAO,KAAM,GAAG,CAAC,IAAIR,GAAG,GAAG,cAAc,YAAY,GAAG;EAAC;EAAS;EAAS;EAAS;CAAO,GAAGQ,EAAO,MAAM,GAAG,CAAC,CAC1L,GACME,IACJ,GAAG9D,GAAI,SAASkD,GAAI,qBAAqBC,OACzCC,GAAG,GAAG,WAAW,YAAY,IAAI,IACjCA,GAAG,GAAG,cAAc,YAAY,CAAC,IACjC,gFACIW,KAAO,GAAY,GAAc,MAAmB,wBAAwBjZ,EAAG,UAAUmV,GAAI,GAAGoD,EAAK,YAAYpiB,EAAO,MACxH+hB,KAAQ,GAAGhhB,MAAgB,GAAGge,GAAI,wBAAwBE,GAAQ,IAAIle,EAAE,KAAK,EAAE,EAAE,mBACjFgiB,IAAM,gEACNtmB,IAAQ,IAAI,IAAoB;EACpC,CACE,uBACA,GAAGsiB,GAAI,8EAA8EG,GAAA,0DACxB6D,EAAI,gGACSA,EAAI,uBAC5E;GAAC;GAAG;GAAG;EAAC,CAAC,CAAC,KAAK,MAAM,oDAAoDtlB,EAAE,qBAAqBslB,EAAI,oBAAoB,CAAC,CAAC,KAAK,EAAE,IACjI,4DAA4DA,EAAI,wIAEpE;EACA,CAAC,eAAe5D,GAAS,sBAAsB,CAAC;EAChD,CACE,wBACA,GAAGJ,GAAI,kBAAkBkD,GAAI,2PAE/B;EACA,CAAC,mCAAmCF,EAAKe,EAAI,GAAG,eAAe,+BAA+B,GAAGA,EAAI,GAAG,SAAS,mBAAmB,GAAGA,EAAI,GAAG,SAAS,kBAAkB,CAAC,CAAC;EAC3K,CAAC,qCAAqCL,CAAM;EAC5C,CACE,gDACAV,EAAKe,EAAI,GAAG,eAAe,kCAAkC,GAAGA,EAAI,GAAG,eAAe,kCAAkC,GAAGA,EAAI,GAAG,eAAe,kCAAkC,GAAGA,EAAI,GAAG,SAAS,qBAAqB,CAAC,CAC9N;EACA,CAAC,qCAAqCF,CAAW;EACjD,CAAC,qCAAqCje,EAAO,OAAO,qBAAqBwd,GAAG,GAAG,WAAW,SAAS,IAAI,IAAIA,GAAG,GAAG,yBAAyB,MAAM,CAAC,CAAC,CAAC;EACnJ,CAAC,qCAAqCxd,EAAO,SAAS,SAAS,EAAE,CAAC;EAClE,GAAG;GAAC;GAAG;GAAG;EAAC,CAAC,CAAC,KAAK,MAAM,CAAC,qCAAqClH,EAAE,YAAYskB,EAAKe,EAAI,GAAG,eAAe,kCAAkC,CAAC,CAAC,CAAqB;EAChK,CAAC,yBAAyBD,CAAK;EAC/B,CAAC,oCAAoCd,EAAKe,EAAI,GAAG,eAAe,kCAAkC,CAAC,CAAC;EACpG,CAAC,wBAAwBR,EAAK;CAChC,CAAC;CACD,OAAOvqB,EAAS0E,GAAO,2EAA2E;AACpG;;AC5eA,IAAMumB,qBAAS,IAAI,IAAI;CAAC;CAAQ;CAAQ;CAAQ;CAAQ;CAAQ;AAAM,CAAC,GACjEC,qBAAQ,IAAI,IAAI;CAAC;CAAO;CAAO;AAAK,CAAC,GACrCC,qBAAO,IAAI,IAAI;CAAC;CAAO;CAAQ;AAAK,CAAC,GACrCC,qBAAW,IAAI,IAAI,CAAC,MAAM,UAAU,CAAC,GACrCC,qBAAO,IAAI,IAAI;CAAC;CAAQ;CAAO;AAAO,CAAC,GAGhCC,KAAc;CAAC,GAAGL;CAAQ,GAAGC;CAAO,GAAGC;CAAM,GAAGC;CAAU,GAAGC;AAAI,CAAC,CAAC,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,GAStGE,MAAY,MAChBzY,GAAYC,CAAI,CAAC,CAAC,KAAK,OAAO;CAC5B,SAAShM,EAAE;CACX,MAAMA,EAAE;CACR,MAAMA,EAAE,KAAK,SAAS,MAAOiC,EAAE,MAAM,SAAS,CAAC;EAAE,MAAMA,EAAE;EAAM,KAAKA,EAAE;EAAG,MAAMA,EAAE;CAAK,CAAC,IAAI,CAAC,CAAE;AAChG,EAAE;AAGJ,eAAsBwiB,GAAW,GAA+B;CAC9D,IAAMjS,IAAM,gBAAgB,KAAKgB,EAAK,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,KAAK,IAC5DjP,IAAOiP,EAAK,KAAK,QAAQ,eAAe,EAAE,KAAK;CACrD,IAAI0Q,GAAO,IAAI1R,CAAG,GAAG,OAAO;EAAE,KAAKgB;EAAM,MAAMA,EAAK;EAAM,WAAW;CAAM;CAC3E,IAAI2Q,GAAM,IAAI3R,CAAG,GAAG;EAClB,IAAMrX,IAAO,MAAMqY,EAAK,KAAK,GACvB6C,IAAM7D,MAAQ,QAAQ8N,GAAgBnlB,CAAI,IAAI;EACpD,OAAO;GAAE,KAAK,MAAM+lB,GAAWP,GAASxlB,GAAMkb,CAAG,GAAG9R,GAAM8R,MAAQ,GAAG;GAAG,MAAM,GAAG9R,EAAK;GAAQ,WAAW;EAAK;CAChH;CACA,IAAI0M;CAIJ,IAHImT,GAAK,IAAI5R,CAAG,IAAG,IAAQ8O,GAAY,MAAM9N,EAAK,KAAK,CAAC,IAC/C6Q,GAAS,IAAI7R,CAAG,IAAG,IAAQgS,GAAS9C,GAAe,MAAMlO,EAAK,KAAK,CAAC,CAAC,IACrE8Q,GAAK,IAAI9R,CAAG,MAAG,IAAQgS,GAAS,MAAMhR,EAAK,KAAK,CAAC,IACtDvC,GAAO,OAAO;EAAE,KAAK,MAAM4R,GAAY5R,CAAK;EAAG,MAAM,GAAG1M,EAAK;EAAQ,WAAW;CAAK;CAEzF,IAAM/G,IAAM,IAAI,WAAW,MAAMgW,EAAK,MAAM,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC;CAC/D,IAAIhW,EAAI,OAAO,MAAQA,EAAI,OAAO,IAAM,OAAO;EAAE,KAAKgW;EAAM,MAAMA,EAAK;EAAM,WAAW;CAAM;CAC9F,MAAU,MAAM,gBAAgBA,EAAK,KAAK,6EAA6E;AACzH;;A,4nyBE3CMmR,KAAK;AAGX,SAAgBC,GAAa,IAA4C,OAAO,WAAa,MAAc,WAAW,KAAA,GAAW;CAC/H,IAAI,CAAC1jB,GAAQ;CACb,IAAMM,IAAON,aAAkB,WAAWA,EAAO,OAAOA;CACxD,IAAIM,EAAK,gBAAgB,SAASmjB,IAAI,GAAG;CACzC,IAAMtlB,KAAM6B,aAAkB,WAAWA,IAASA,EAAO,cAAA,CAAe,cAAc,OAAO;CAG7F,AAFA,EAAG,KAAKyjB,IACR,EAAG,cAAc5sB,IACjByJ,EAAK,YAAYnC,CAAE;AACrB;;ACGA,IAAMwlB,KAAY,61CA6BZC,MAAU,MAAiB,GAAG9sB,GAAW,IAAI6sB,GAAU,kBAAkB7kB,EAAE,KAAK,YAAYA,EAAE,OAAO,QAErG+kB,MAAS,MAAe,IAAI,SAAS,MAAM,WAAW9iB,GAAG+iB,CAAE,CAAC;AAGlE,eAAeC,GAAO,GAAe,GAAmB;CAEtD,AADA,MAAMF,GAAM,CAAC,GACb,MAAM,IAAI,SAAe,MAAY;EACnC,IAAIG,GACE5e,IAAM,WAAW7B,GAAM,GAAI,GAC3B0gB,IAAK,IAAI,uBAAuB;GAEpC,AADA,aAAaD,CAAK,GAClB,IAAQ,WAAWzgB,GAAM,GAAG;EAC9B,CAAC;EACD,SAASA,IAAO;GAId,AAHA0gB,EAAG,WAAW,GACd,aAAaD,CAAK,GAClB,aAAa5e,CAAG,GAChBoC,EAAQ;EACV;EAEA,AADAyc,EAAG,QAAQ3jB,GAAM;GAAE,SAAS;GAAM,WAAW;GAAM,YAAY;EAAK,CAAC,GACrE,IAAQ,WAAWiD,GAAM,GAAG;CAC9B,CAAC;CACD,IAAM2gB,oBAAO,IAAI,IAAY;CAC7B,KAAK,IAAM/lB,KAAMmC,EAAK,iBAA8B,mBAAiB,GACnE,KAAK,IAAMiF,KAAKpH,EAAG,MAAM,gBAAgB,SAAS,6BAA6B,GAAG,EAAK,IAAIoH,EAAE,EAAE;CAEjG,IAAM4e,IAA4B,CAAC,GAAG7jB,EAAK,iBAAiB,KAAK,CAAC,CAAC,CAAC,KAAK,MACvE4R,EAAI,WAAW,OAAO,IAAI,SAAS,OAAQ,EAAI,SAASnR,GAAK,EAAI,UAAUA,EAAG,CAChF;CACA,KAAK,IAAMxB,KAAK2kB,GACd,EAAM,KACJ,IAAI,SAAS,MAAM;EACjB,IAAMhS,IAAM,IAAI,MAAM;EAEtB,AADA,EAAI,SAAS,EAAI,UAAUnR,GAC3B,EAAI,MAAMxB;CACZ,CAAC,CACH;CAGF,AADA,MAAM,QAAQ,KAAK,CAAC,QAAQ,IAAI4kB,CAAK,GAAGN,GAAM,GAAM,CAAC,CAAC,GACtD,MAAM,QAAQ,KAAK,CAAC1jB,EAAI,OAAO,OAAO0jB,GAAM,GAAI,CAAC,CAAC;AACpD;AAEA,IAAMO,KAAM;AAGZ,SAASC,GAAO,GAAY,GAAY,GAA4B;CAClE,OAAO5kB,IAAKC,IAAI;EACd,IAAMG,IAAOJ,IAAKC,KAAO;EACzB,AAAI4kB,EAAGzkB,CAAG,IAAG,IAAKA,IACb,IAAKA,IAAM;CAClB;CACA,OAAOJ;AACT;AAOA,SAAS8kB,GAAQ,GAAmB;CAClC,IAAMC,IAAOlkB,EAAK,cAAc,aAC1B+a,IAAQ/a,EAAK,cAAc,YAAY,GACvCib,KAAO,GAAY,OACvBF,EAAM,SAASphB,GAAMe,CAAC,GACtBqgB,EAAM,OAAOphB,GAAMe,IAAI,CAAC,GACjBqgB,EAAM,sBAAsB,IAE/BoJ,IAAyB,CAAC,GAC1BC,IAAuB,CAAC;CAC9B,KAAK,IAAMvmB,KAAMmC,EAAK,iBAA8B,eAAe,GAAG;EACpE,IAAM4K,IAAO/M,EAAG;EAChB,IAAI+M,GAAM,aAAa,KAAK,aAAaA,EAAK,aAAa;EAC3D,IAAMjR,IAAOiR,GACP3M,IAAItE,EAAK;EACf,EAAM,mBAAmBA,CAAI;EAC7B,IAAMO,IAAI6gB,EAAM,sBAAsB,GAChCvW,IAAI3G,EAAG,sBAAsB,GAE7B+P,IAAOpJ,EAAE,OAAO3G,EAAG,aAAa,IAChCwO,IAAQ7H,EAAE,OAAO3G,EAAG,aAAaA,EAAG,cAAc;EACxD,IAAI3D,EAAE,QAAQ0T,KAAQ1T,EAAE,SAASmS,GAAO;EACxC,IAAM1H,IAAKuf,EAAK,iBAAiBrmB,CAAE;EACnC,IAAIA,EAAG,QAAQ,UAAU,KAAK;GAC5B,IAAMyE,IAAOzE,EAAG,cAAc,WAAW8G,EAAG,WAAW,IAAI,WAAWA,EAAG,YAAY;GACrF,EAAK,KAAK,CAAChL,GAAM,IAAI,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM2I,KAAQpI,EAAE,QAAQ+D,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;EACpF,OAAO,IAAI6lB,GAAI,KAAK7lB,CAAC,KAAM0G,EAAG,eAAe,SAASA,EAAG,eAAe,UAEtE,EAAM,KAAK9G,CAAE;OACR;GACL,IAAM6T,IAAkB,CAAC,GACrB5U,IAAQ;GACZ,KAAK,IAAMgW,KAAQ7U,EAAE,MAAM,IAAI,GAAG;IAChC,IAAM6G,IAAMhI,IAAQgW,EAAK,QAErBpY,IAAIqpB,GAAOjnB,GAAOgI,IAAM,MAAMmW,EAAIthB,GAAMsI,CAAC,CAAC,CAAC,QAAQ2L,CAAI,GACvDM,IAAI6V,GAAOrpB,GAAGoK,IAAM,MAAMmW,EAAIthB,GAAMsI,CAAC,CAAC,CAAC,QAAQoK,CAAK;IAIxD,AAHI,kBAAkB,KAAKpO,EAAEvD,MAAM,EAAE,KAAG,KACpC,kBAAkB,KAAKuD,EAAEiQ,IAAI,MAAM,EAAE,KAAG,KAC5CwD,EAAM,KAAKzT,EAAE,MAAMvD,GAAG,KAAK,IAAIA,GAAGwT,CAAC,CAAC,CAAC,GACrC,IAAQpJ,IAAM;GAChB;GACA,EAAK,KAAK,CAACnL,GAAM+X,EAAM,KAAK,IAAI,CAAC,CAAC;EACpC;CACF;CAEA,KAAK,IAAM,CAAC/X,GAAMsE,MAAMkmB,GAAM,EAAK,OAAOlmB;CAC1C,KAAK,IAAMJ,KAAMumB,GAAO,EAAG,MAAM,WAAW;AAC9C;AAUA,eAAeC,GAAM,GAAc,GAAiC;CAClE,IAAMC,IAAQ,SAAS,cAAc,QAAQ;CAI7C,AAHAA,EAAM,aAAa,eAAe,MAAM,GACxC,EAAM,WAAW,IACjB,EAAM,MAAM,UAAU,2FACtB,SAAS,KAAK,YAAYA,CAAK;CAC/B,IAAMzkB,IAAMykB,EAAM;CAIlB,AAHAzkB,EAAI,KAAK,GACTA,EAAI,MAAM,gFAA8E,GACxFA,EAAI,MAAM,GACV,EAAI,QAAQqD;CACZ,IAAMoO,IAAQzR,EAAI,cAAc,OAAO;CAEvC,AADA,EAAM,cAAcyjB,GAAO9kB,CAAC,GAC5BqB,EAAI,KAAK,YAAYyR,CAAK;CAC1B,IAAMtR,IAAOH,EAAI,cAAc,KAAK;CAEpC,AADA,EAAK,YAAY,YACjBA,EAAI,KAAK,YAAYG,CAAI;CACzB,IAAMmC,IAAOoiB,EAAWvkB,CAAI;CAC5B,EAAK,OAAOxB,EAAE,IAAI;CAClB,IAAIgmB,IAAW,IACTC,UAAgB;EACpB,AAAID,MACJ,IAAW,IACXriB,EAAK,QAAQ,GACbmiB,EAAM,OAAO;CACf;CACA,IAAI;EAEF,AADA,MAAMb,GAAO5jB,GAAKG,CAAI,GACtBikB,GAAQjkB,CAAI;CACd,SAAS,GAAG;EAEV,MADAykB,EAAQ,GACF;CACR;CACA,OAAO;EAAE;EAAO;EAAK;EAAM;CAAQ;AACrC;AAEA,IAAIC,KAA2B;AAG/B,eAAsBC,GAAc,GAAc,GAA8B;CAC9E,IAAU,QAAQ;CAClB,IAAM1f,IAAI,MAAMof,GAAM7lB,GAAG0E,CAAK;CAC9B,KAAW+B;CACX,IAAMlH,IAAIkH,EAAE,MAAM,eACZ2f,UAAgB;EAGpB,AAFIF,OAAazf,MAAG,KAAW,OAE/B,iBAAiBA,EAAE,QAAQ,GAAG,GAAI;CACpC;CAEA,AADAlH,EAAE,iBAAiB,cAAc6mB,GAAS,EAAE,MAAM,GAAK,CAAC,GACxD,WAAWA,GAAS,GAAW;CAE/B,IAAMrqB,IAAO,SAAS;CACtB,SAAS,QAAQ2I;CACjB,IAAI;EACF,EAAE,MAAM;EAER,IAAI8gB,IAAK;EACT,IAAI;GACF,IAAKjmB,EAAE,SAAS,YAAY,SAAS,EAAK;EAC5C,QAAQ;GACN,IAAK;EACP;EACA,AAAKimB,KAAIjmB,EAAE,MAAM;CACnB,UAAU;EACR,SAAS,QAAQxD;CACnB;AACF;AAEA,IAAMsqB,MAAO,MAAc5mB,EAAE,QAAQ,MAAM,OAAO,CAAC,CAAC,QAAQ,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,MAAM;AAE9F,SAAS6mB,GAAU,GAA6B;CAC9C,OAAO,IAAI,SAAS,GAAS,MAAW;EACtC,IAAM,IAAI,IAAI,WAAW;EAGzB,AAFA,EAAE,eAAe5d,EAAQ,EAAE,MAAgB,GAC3C,EAAE,gBAAgB6d,EAAO,EAAE,KAAK,GAChC,EAAE,cAAcve,CAAI;CACtB,CAAC;AACH;AAGA,eAAsBwe,GAAW,GAAc,GAA8B;CAC3E,IAAM/f,IAAI,MAAMof,GAAM7lB,GAAG0E,CAAK;CAC9B,IAAI;EACF,IAAIqd,IAAOtb,EAAE,KAAK,UAAU,QAAQ,wDAAwD,EAAE,GACxFggB,IAAQ,IAAI,IAAI1E,EAAK,MAAM,mBAAmB,KAAK,CAAC,CAAC;EAC3D,KAAK,IAAM5hB,KAAOsmB,GAChB,IAAI;GACF,IAAMzT,IAAO,MAAMsT,GAAU,OAAO,MAAM,MAAMnmB,CAAG,EAAA,CAAG,KAAK,CAAC;GAC5D,IAAO4hB,EAAK,MAAM5hB,CAAG,CAAC,CAAC,KAAK6S,CAAI;EAClC,QAAQ,CAER;EAEF,IAAMhH,IACJ,iIACUqa,GAAI3hB,CAAK,EAAE,iBAAiBogB,GAAO9kB,CAAC,EAAE,uBAAuB+hB,EAAK;EAC9E,OAAO,IAAI,KAAK,CAAC/V,CAAI,GAAG,EAAE,MAAM,0BAA0B,CAAC;CAC7D,UAAU;EACR,EAAE,QAAQ;CACZ;AACF;;AC/PA,IAAa0a,KAAsC;CACjD,MAAM;CACN,MAAM;CACN,MAAM;AACR,GACMzuB,KAA+B;CAAE,MAAM;CAAS,MAAM;CAAS,MAAM;AAAQ,GAE7E2uB,KAA4F;CAChG,MAAM,CACJ;EAAE,IAAI;EAAO,OAAO;EAAc,KAAK;EAAQ,MAAM;CAAa,GAClE;EAAE,IAAI;EAAM,OAAO;EAAY,KAAK;EAAO,MAAM;CAAgB,CACnE;CACA,MAAM,CACJ;EAAE,IAAI;EAAO,OAAO;EAAuB,KAAK;EAAQ,MAAM;CAAW,GACzE;EAAE,IAAI;EAAO,OAAO;EAAuB,KAAK;EAAQ,MAAM;CAA4B,CAC5F;CACA,MAAM,CAAC;EAAE,IAAI;EAAO,OAAO;EAAc,KAAK;EAAQ,MAAM;CAAa,CAAC;AAC5E,GA2CMC,KAAQ;AAGd,SAAgBC,GAAe,GAAoC;CACjE,IAAM,CAACC,GAAMC,KAAW5nB,EAAS,EAAK,GAChC6nB,IAAUhoB,EAAO,EAAK,GACtB2Q,IAAO3Q,EAAOkE,CAAC;CACrB,EAAK,UAAUA;CACf,IAAMuO,IAAOvO,EAAE,MAETD,IAAgC,CAAC,GACjCgkB,KAAW,MAAgC;EAC/C,AAAK/hB,EAAM,WACX,EAAM,KAAK;GAAE,GAAGA,EAAM;GAAI,KAAKjC,EAAQ,SAAS;EAAE,GAClDA,EAAQ,KAAK,GAAGiC,CAAK;CACvB;CAWA,AAVA+hB,EACE/jB,EAAE,UACE;EACE;GAAE,OAAO;GAAY,OAAO;GAAY,MAAM;GAAO,MAAM;EAAM;EACjE;GAAE,OAAO;GAAY,OAAO;GAAe,MAAM;EAAQ;EACzD;GAAE,OAAO;GAAY,OAAO;GAAgB,MAAM;EAAS;EAC3D;GAAE,OAAO;GAAQ,OAAO;GAAS,MAAM;GAAQ,MAAM,GAAGqH,EAAI;GAAI,KAAK;EAAK;CAC5E,IACA,CAAC,CACP,GACIrH,EAAE,aAAauO,MAAS,UAAQxO,EAAQ,KAAK;EAAE,OAAO;EAAU,OAAO;EAA8B,MAAM;EAAS,KAAK,CAACC,EAAE,WAAWD,EAAQ,SAAS;CAAE,CAAC;CAC/J,IAAMikB,IAAkC,CAAC;CAIzC,AAHIzV,KAAQvO,EAAE,WAASgkB,EAAU,KAAK;EAAE,OAAO;EAAQ,OAAO;EAAQ,MAAM;EAAQ,MAAM,GAAG3c,EAAI;CAAG,CAAC,GACjGkH,KAAQvO,EAAE,UAAQgkB,EAAU,KAAK;EAAE,OAAO;EAAU,OAAO;EAAW,MAAM;CAAO,CAAC,GACxFD,EAAQC,CAAS,GACbhkB,EAAE,eAAeuO,KACnBwV,EAAQ;EACN;GAAE,OAAO;GAAY,OAAOR,GAAWhV;GAAO,MAAM;GAAQ,MAAMzZ,GAAIyZ;GAAO,MAAM;EAAc;EACjG;GAAE,OAAO;GAAO,OAAO;GAAgB,MAAM;GAAO,MAAM;EAAO;EACjE;GAAE,OAAO;GAAQ,OAAO;GAAY,MAAM;GAAQ,MAAM;EAAQ;EAChE,GAAGkV,GAAalV,EAAK,CAAC,KAAK,OAAO;GAAE,OAAO,UAAU3T,EAAE;GAAI,OAAOA,EAAE;GAAO,MAAM;GAAO,MAAMA,EAAE;EAAI,EAAE;CACxG,CAAC;CAEH,IAAMlC,IAA6B,CAAC;CAKpC,AAJI6V,KAAQvO,EAAE,WAAStH,EAAK,KAAK;EAAE,OAAO;EAAW,OAAO;EAAoB,MAAM;CAAO,CAAC,GAC1F6V,KAAQvO,EAAE,eAAatH,EAAK,KAAK;EAAE,OAAO;EAAS,OAAO;EAAS,MAAM;EAAS,MAAM,GAAG2O,EAAI;CAAG,CAAC,GACvG0c,EAAQrrB,CAAI,GACZqrB,EAAQ/jB,EAAE,MAAM,KAAK,GAAG,OAAO;EAAE,OAAO,SAASjH;EAAK,OAAO4C,EAAE;EAAO,MAAMA,EAAE;EAAM,MAAMA,EAAE;EAAM,UAAUA,EAAE;CAAS,EAAE,CAAC,GACtHqE,EAAE,SAAO+jB,EAAQ,CAAC;EAAE,OAAO;EAAS,OAAO;EAAS,MAAM;CAAQ,CAAC,CAAC;CAExE,IAAME,IAAO,OAAO,MAAmB;EACrC,IAAMpiB,IAAI4K,EAAK;EACf,IAAIyX,EAAO,WAAW,MAAM,GAAG,OAAOriB,EAAE,OAAOqiB,EAAO,MAAM,CAAC,CAAY;EACzE,IAAIA,EAAO,WAAW,QAAQ,GAAG,OAAOriB,EAAE,MAAM,OAAOqiB,EAAO,MAAM,CAAC,CAAC,EAAE,EAAE,QAAQ;EAClF,QAAQA,GAAR;GACE,KAAK,QAAQ;IACX,IAAM,CAAC7T,KAAQ,MAAMlL,GAAUic,IAAa,EAAK;IACjD,AAAI/Q,KAAMxO,EAAE,KAAKwO,CAAI;IACrB;GACF;GACA,KAAK,UACH,OAAOxO,EAAE,SAAS;GACpB,KAAK,WACH,OAAOA,EAAE,UAAU;GACrB,KAAK,SACH,OAAOA,EAAE,QAAQ;GACnB,KAAK,QACH,OAAOA,EAAE,KAAK;EAClB;EACA,IAAMiE,IAAMjE,EAAE,IAAI;EAClB,IAAIqiB,MAAW,UAAU;GACvB,IAAM,CAAC7T,KAAQ,MAAMlL,GAAU,uBAAuB,EAAK;GAC3D,IAAI,CAACkL,GAAM;GACX,IAAI,CAACvK,GAAK,aAAa,MAAU,MAAM,uDAAuD;GAC9F,IAAM9N,IAAO,MAAMqY,EAAK,KAAK,GACvB6C,IAAM,gBAAgB,KAAK7C,EAAK,IAAI,IAAI,MAAO8M,GAAgBnlB,CAAI;GACzE,MAAM8N,EAAI,YAAY0X,GAASxlB,GAAMkb,CAAG,GAAG7C,EAAK,KAAK,QAAQ,YAAY,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE,KAAK,UAAU;EAEzG,OACA,IAAKxO,EAAE,QAASA,EAAE,aAClB;OAAIqiB,MAAW,YAAY,OAAOriB,EAAE,iBAAiB;GACrD,IAAI,CAACiE,GAAK,MAAU,MAAM,uDAAuD;GACjF,IAAIoe,EAAO,WAAW,OAAO,GAAG;IAC9B,IAAMtpB,IAAI6oB,GAAa5hB,EAAE,KAAK,CAAC,MAAM,MAAM,UAAUlG,EAAE,OAAOuoB,CAAM;IACpE,IAAI,CAACtpB,GAAG;IACR,GAAS,IAAI,KAAK,CAAC,MAAMkL,EAAI,KAAKlL,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,GAAGA,EAAE,KAAK,gBAAgB,CAAC,GAAGiH,EAAE,OAAOjH,EAAE,GAAG;GAEhG,OACA,IAAIspB,MAAW,SAASA,MAAW,WAAWA,MAAW,QAAQ;IAC/D,EAAE,OAAOA,MAAW,QAAQ,4DAA4D,YAAY;IACpG,IAAMrnB,IAAI,MAAMiJ,EAAI,UAAU;IAE9B,AADIjJ,EAAE,UAAQgF,EAAE,OAAOhF,EAAE,MAAM,GAC3BqnB,MAAW,SAAQtf,GAAS,MAAMye,GAAWxmB,GAAGgF,EAAE,IAAI,GAAGA,EAAE,OAAO,OAAO,IACxE,MAAMmhB,GAAcnmB,GAAGgF,EAAE,IAAI;GACpC;EAdqD;CAevD;CAmBA,OAAO;EAAE;EAAS;EAAM,MAjBX,MAAmB;GAC9B,IAAMsiB,IAAQT,GAAM,KAAKQ,CAAM;GAC/B,CAAI,GAAQ,WAAYC,OACnBA,MACH,EAAQ,UAAU,IAClBN,EAAQ,EAAI,IAEd,QAAQ,QAAQ,CAAC,CACd,WAAWI,EAAKC,CAAM,CAAC,CAAC,CACxB,OAAO,MAAazX,EAAK,QAAQ,OAAO,EAAE,WAAW,OAAO,CAAC,CAAC,CAAC,CAAC,CAChE,cAAc;IACb,AAAI0X,MACJ,EAAQ,UAAU,IAClBN,EAAQ,EAAK;GACf,CAAC;EACL;CAE4B;AAC9B;AAEA,SAAgBO,GAAS,EAAE,cAAqC;CAE9D,OADKC,EAAQ,QAAQ,SACd,kBAAC9kB,GAAD;EAAU,OAAM;EAAO,OAAM;EAAO,WAAU;EAAU,SAAS8kB,EAAQ;EAAS,UAAUA,EAAQ;EAAK,WAAW;EAAK,UAAUA,EAAQ;CAAO,CAAA,IADrH;AAEtC;;AC7IA,IAAMC,MAAW,OAAuB;CAAE,IAAIxlB,EAAE;CAAI,GAAGA,EAAE;CAAG,GAAGA,EAAE;CAAG,GAAGA,EAAE;CAAG,QAAQA,EAAE;CAAQ,OAAOA,EAAE;CAAO,MAAMA,EAAE;CAAM,UAAUA,EAAE;CAAU,MAAMA,EAAE;CAAM,IAAIA,EAAE;AAAG;AAEzK,SAASylB,GAAO,GAAiB;CAC/B,IAAMvY,IAAenP,EAAE,KAAK,KAAK,MAC/BiC,EAAE,MAAM;EAAE,GAAG;EAAO,MAAMA,EAAE;EAAM,GAAGwlB,GAAQxlB,CAAC;EAAG,KAAKA,EAAE;CAAI,IAAI;EAAE,GAAG;EAAQ,MAAMA,EAAE,KAAK,OAAOA,EAAE;EAAM,GAAGwlB,GAAQxlB,CAAC;EAAG,KAAKA,EAAE;CAAI,CACrI;CACA,OAAO;EAAE,MAAMlI,EAAUoV,CAAI;EAAG,MAAMnP;EAAG,MAAMA,EAAE;EAAM,GAAGA,EAAE;CAAE;AAChE;AAEA,IAAM2nB,MAAY,MAAa3nB,EAAE,IAAI,UAAUA,EAAE,KAAK,UAAU,QAC1D4nB,MAAS,MAAa5nB,EAAE,IAAI,OAAOA,EAAE,KAAK,OAAO;AAEvD,SAAgB6nB,GAAQ,GAAU,IAAM,GAAU;CAChD,IAAMnW,IAAOiW,GAAS3nB,CAAC,GACjBgW,IAAM4R,GAAM5nB,CAAC,GACbqU,IAAMrU,EAAE,KAAK,MAAM,MAAMiC,EAAE,MAAM,MAAM,CAAC,EAAE,GAA4B,MAAMjC,EAAE,KAAK,OAEnFyjB,IAAUzjB,EAAE,IAAI,SAAyB0R,MAAS,SAAS,KAAA,IAAY;EAAE,MAAMA,MAAS,WAAW,MAAM,GAAGoW,EAAI;EAAI;EAAI,OAAO9nB,EAAE,KAAK,QAAQ;CAAM,IAA3HA,EAAE,KAAK,QAChC6C,KAASmT,KAAOhW,EAAE,KAAK,OAAO,MAAM,IACpCoX,IAAOpX,EAAE,IAAI,UAAU0R,MAAS,UAAU,CAAC1R,EAAE,KAAK,SAAS,KAAK;CACtE,OAAO;EACL,GAAGA,EAAE;EACL;EACA,MAAM,KAAK,IAAI,GAAGA,EAAE,KAAK,OAAO6C,IAAQuU,CAAI;EAC5C,QAAQA,IAAO,CAACA,IAAOpX,EAAE,KAAK;EAC9B,OAAOA,EAAE,IAAI,SAASA,EAAE,KAAK;EAC7B,MAAMA,EAAE;EACR,MAAMA,EAAE,KAAK,KAAK,MAAOiC,EAAE,MAAM,QAAQ;GAAE,GAAIA,EAAE;GAAgB,MAAMA,EAAE,QAAQ;GAAI,KAAK;EAAK,IAAI;GAAE,GAAIA,EAAE;GAAgB,MAAMA,EAAE,QAAQ;EAAG,CAAE;CAClJ;AACF;AAGA,IAAa8lB,KAAb,MAAmD;CAiB7B;CAhBpB;CACA,QAAiB,CAAC;CAClB;CACA,QAAQ;CACR,MAAM;CACN,aAAyB;CACzB,UAA2B,CAAC;CAC5B,SAA0B,CAAC;CAC3B,OAA2F;CAC3F;CACA,qBAA6B;CAC7B;CACA;CACA;CACA;CAEA,YAAY,GAAgC;EAC1C,AADkB,KAAA,SAAAvnB,GAClB,KAAK,QAAQ,IAAIxG,EAAU,IAAI;CACjC;CAEA,IAAI,SAAS;EACX,OAAO,KAAK,OAAO;CACrB;CAEA,MAAM,GAAe,GAAa,GAAgB;EAQhD,AAPA,KAAK,IAAI,GACT,KAAK,QAAQ+pB,GACb,KAAK,MAAMiE,GACX,KAAK,OAAOjG,GACZ,KAAK,SAASA,EAAK,MAAM,SAASA,EAAK,QAAQ,CAAC;GAAE,MAAM;GAAQ,MAAM;GAAG,QAAQ;GAAG,QAAQ;GAAG,QAAQ;GAAG,MAAM,CAAC;GAAG,OAAO;EAAG,CAAU,EAAA,CAAG,IAAI2F,EAAM,GACrJ,KAAK,UAAU,CAAC,GAChB,KAAK,SAAS,CAAC,GACf,KAAK,OAAO;CACd;CAEA,MAAM;EAMJ,AALI,KAAK,OAAO,KAAK,KAAK,sBAAoB,KAAK,OAAO,GAC1D,KAAK,MAAM,OAAO,GAClB,KAAK,MAAM,IACX,KAAK,QAAQ,IACb,KAAK,OAAO,KAAA,GACZ,KAAK,UAAU,IAAI;CACrB;CAEA,OAA6B;EAC3B,IAAI,CAAC,KAAK,MAAM;EAChB,IAAMO,IAAqB,CAAC,GACtBhX,IAAQ,KAAK,MAAM,KAAK,MAAM;GAClC,IAAM+E,IAAM4R,GAAM5nB,CAAC;GAInB,OAHI2nB,GAAS3nB,CAAC,MAAM,WAAU,EAASgW,MAAQiS,EAASjS,MAAQ,KAAK,IAChE,EAASA,KAAO,GACrB,EAAS,SAASA,IAAM,GACjB6R,GAAQ7nB,GAAGioB,EAASjS,EAAI;EACjC,CAAC;EACD,OAAO;GAAE,GAAG,KAAK;GAAM,OAAO;GAAO;EAAM;CAC7C;CAIA,KAAK,GAAY;EACf,OAAO,KAAK,MAAM,OAAOtH,CAAE;CAC7B;CACA,KAAK,GAAW,GAAW;EACzB,IAAMnT,IAAgB,CAAC;EACvB,KAAK,IAAIW,IAAI,OAAOa,CAAC,GAAGb,KAAK,OAAO8J,CAAC,GAAG,KAAK,EAAI,KAAK,OAAO9J,CAAC,CAAC;EAC/D,OAAOX;CACT;CACA,KAAK,GAAY;EACf,OAAO,OAAOmT,CAAE,IAAI,IAAI,OAAO,OAAOA,CAAE,IAAI,CAAC,IAAI,KAAA;CACnD;CACA,KAAK,GAAY;EACf,OAAO,OAAOA,CAAE,IAAI,KAAK,MAAM,SAAS,IAAI,OAAO,OAAOA,CAAE,IAAI,CAAC,IAAI,KAAA;CACvE;CACA,IAAI,GAAW,GAAW;EACxB,OAAO,OAAO3R,CAAC,IAAI,OAAOiJ,CAAC;CAC7B;CACA,SAAS,GAAU,GAAqB;EACtC,OAAO;GAAE,GAAGhG;GAAG;EAAK;CACtB;CACA,MAAM,GAAU,GAAc,GAA+B;EAC3D,OAAO,CACL;GAAE,GAAGA;GAAG,MAAMoP;EAAK,GACnB;GAAE,GAAGpP;GAAG,MAAM6N;GAAO,OAAOA,EAAM,SAAS,KAAA,IAAYjU,EAAMwV,GAAM1U,GAAK0U,CAAI,CAAC,KAAKpP,EAAE;EAAM,CAC5F;CACF;CACA,KAAK,GAAU,GAAW,GAAqB;EAC7C,OAAO;GAAE,GAAGjD;GAAG;EAAK;CACtB;CACA,WAAW,GAAqC;EAC9C,IAAIiD,EAAE,OAAO,OAAO;GAAE,GAAGA,EAAE;GAAO,MAAM;EAAG;EAC3C,IAAMuM,IAAO,CAAC,GAAGvM,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,MAAMiC,EAAE,MAAM,MAAM;EAC7D,OAAOsK,IAAO;GAAE,GAAGA;GAAM,MAAM;EAAG,IAAI;GAAE,GAAG;GAAQ,GAAG,EAAE,IAAIvM,EAAE,KAAK,MAAM;EAAE;CAC7E;CACA,eAAe;EACb,OAAO,KAAK,OAAQ;GAAE,GAAG,KAAK,KAAK;GAAG,GAAG,KAAK,KAAK;EAAE,IAAsB,KAAA;CAC7E;CACA,eAAe;EACb,KAAK,OAAO;CACd;CAEA,QAAQ,GAAe,GAAe,GAAU,IAA4C,CAAC,GAAG;EAC9F,IAAMiO,IAAS,KAAK,OACdia,IAAK,OAAOvY,EAAI,EAAE;EAExB,IADA,KAAK,QAAQ;GAAC,GAAG1B,EAAO,MAAM,GAAGia,CAAE;GAAG,GAAGjsB;GAAM,GAAGgS,EAAO,MAAMia,IAAKvY,EAAI,MAAM;EAAC,GAC3EC,EAAK,YAAY,IAAO;GAC1B,IAAMG,IAAM,KAAK,IAAI,GACfxD,IAAO,KAAK,QAAQ,KAAK,QAAQ,SAAS,IAC1CxI,IAAQ6L,EAAK,SAAS;GAM5B,AALI7L,MAAU,UAAUwI,GAAM,UAAU,UAAUwD,IAAMxD,EAAK,IAAI,QAC/D,EAAK,QAAQ,KAAK,OAClB,EAAK,WAAWtJ,GAChB,EAAK,IAAI8M,KACJ,KAAK,QAAQ,KAAK;IAAE;IAAQ,OAAO,KAAK;IAAO,WAAW,KAAK,MAAM,WAAW9M;IAAK,UAAUA;IAAK;IAAO,GAAG8M;GAAI,CAAC,GAC1H,KAAK,SAAS,CAAC;EACjB;EAOA,AANA,KAAK,aAAa9M,GAClB,KAAK,qBAAqB,IAC1B,KAAK,UAAU,GACf,aAAa,KAAK,KAAK,GACvB,KAAK,QAAQ,iBAAiB,KAAK,OAAO,GAAG,GAAG,GAChD,KAAK,WAAW,GAChB,KAAK,UAAU,KAAK,MAAMA,CAAG,CAAC;CAChC;CAEA,OAAO;EACL,IAAM,IAAI,KAAK,QAAQ,IAAI;EAC3B,AAAK,MACL,KAAK,OAAO,KAAK,CAAC,GAClB,KAAK,QAAQ,EAAE,QAAQ,EAAE,SAAS;CACpC;CACA,OAAO;EACL,IAAM,IAAI,KAAK,OAAO,IAAI;EAC1B,AAAK,MACL,KAAK,QAAQ,KAAK,CAAC,GACnB,KAAK,QAAQ,EAAE,OAAO,EAAE,QAAQ;CAClC;CACA,QAAgB,GAAgB,GAAU;EAOxC,AANA,KAAK,QAAQgO,GACb,KAAK,aAAahO,GAClB,KAAK,qBAAqB,IAC1B,aAAa,KAAK,KAAK,GACvB,KAAK,QAAQ,iBAAiB,KAAK,OAAO,GAAG,GAAG,GAChD,KAAK,WAAW,GAChB,KAAK,UAAU,KAAK,MAAMA,CAAG,CAAC;CAChC;CAEA,SAAS;EAEP,IADA,aAAa,KAAK,KAAK,GACnB,KAAK,MAAM,KAAK,CAAC,KAAK,oBAAoB;EAC9C,KAAK,qBAAqB;EAC1B,IAAM8gB,IAAQ,KAAK,OACb3T,IAAqB,KAAK,MAAM,KAAK,OAAO;GAChD,GAAGpQ,EAAE;GACL,MAAMA,EAAE,UAAUA,EAAE,OAAO,KAAA;GAC3B,GAAGA,EAAE;GACL,MAAMA,EAAE,KAAK,KAAK,MAChBiC,EAAE,MAAM,QAAQ;IAAE,MAAM;IAAI,KAAKA,EAAE;IAAyB,KAAK;GAAK,IAAI;IAAE,MAAMA,EAAE,QAAQ;IAAI,KAAKA,EAAE;IAAqC,KAAKA,EAAE;GAAyB,CAC9K;EACF,EAAE;EACF,KAAK,OACF,KAAK,gBAAgB8hB,GAAO,KAAK,KAAK3T,CAAK,CAAC,CAC5C,MAAM,MAAM,KAAK,cAAc2T,GAAOtd,CAAC,CAAC,CAAC,CACzC,OAAO,MAAM,QAAQ,MAAM,qCAAqC,CAAC,CAAC;CACvE;CAIA,OAAO,GAAsB,GAAY;EACvC,IAAMxD,IAAM,KAAK,MAAM,IAAI;EAC3B,IAAI,CAACA,GAAK;EACV,IAAIzI,EAAUyI,CAAG,GAAG;GAGlB,AAFA,KAAK,OAAO;IAAE,GAAG;KAAE,GAAI,KAAK,MAAM,KAAK,CAAC;KAAI,GAAGxD;IAAE;IAAG,GAAG;KAAE,GAAI,KAAK,MAAM,KAAK,CAAC;KAAI,GAAGiE;IAAE;IAAG,IAAIT,EAAI;GAAE,GACpG,KAAK,MAAM,QAAQA,CAAG,GACtB,KAAK,UAAU,KAAK,MAAMA,CAAG,CAAC;GAC9B;EACF;EACA,IAAM,CAAClG,GAAGiJ,KAAK9L,EAAQ,MAAM+I,CAAG,GAC1B0M,IAAM,KAAK,KAAK5S,EAAE,IAAIiJ,EAAE,EAAE,GAC1B/J,IAAO0T,EAAI,KAAK,GAAI,MAAM;GAC9B,IAAM3P,IAAI,KAAK,KAAK0O,CAAE,GAChBlL,IAAOtH,MAAM,IAAIa,EAAE,IAAI,GACvB6R,IAAK1S,MAAMyT,EAAI,SAAS,IAAI3J,EAAE,IAAItL,GAAKsF,EAAE,IAAI;GACnD,OAAO,KAAK,SAASA,GAAGrF,GAAYqF,EAAE,MAAMwD,GAAMoL,GAAInP,GAAGiE,CAAC,CAAC;EAC7D,CAAC;EACD,KAAK,QAAQiM,GAAK1T,GAAMgH,GAAK,EAAE,OAAO,SAAS,CAAC;CAClD;CAEA,OAAO,GAAiC;EACtC,IAAMyI,IAAK,KAAK,MAAM,GAChBzL,IAAK,EAAEyL,KAAMA,EAAGrB;EACtB,KAAK,OAAO,GAAGA,IAAMpK,EAAG,GAAG,GAAGoK,IAAMpK,EAAG,CAAC;CAC1C;CAEA,QAAQ,GAAY;EAClB,KAAK,OAAO,EAAE,MAAG,GAAG,EAAE,MAAG,CAAC;CAC5B;CACA,SAAS,GAAkB;EACzB,KAAK,OAAO,EAAE,OAAO+E,KAAK,KAAA,EAAU,GAAG,EAAE,OAAOA,EAAE,CAAC;CACrD;CACA,QAAQ,GAAc;EACpB,KAAK,OAAO,EAAE,MAAMzL,EAAQmE,CAAI,EAAE,GAAG,EAAE,MAAMA,EAAK,CAAC;CACrD;CAEA,SAAS,GAAqB;EAC5B,IAAMuF,IAAM,KAAK,MAAM,IAAI;EAC3B,IAAI,CAACA,GAAK;EACV,IAAM,CAAClG,GAAGiJ,KAAK9L,EAAQ,MAAM+I,CAAG,GAC1B0M,IAAM,KAAK,KAAK5S,EAAE,IAAIiJ,EAAE,EAAE;EAChC,KAAK,QAAQ2J,GAAKA,EAAI,KAAK,OAAQ;GAAE,GAAG,KAAK,KAAKjB,CAAE;GAAG;GAAM,SAAS;EAAK,EAAE,GAAGzL,GAAK,EAAE,OAAO,QAAQ,CAAC;CACzG;CAGA,OAAe,GAAyB,GAAe;EACrD,IAAMA,IAAM,KAAK,MAAM,IAAI;EAC3B,IAAI,CAACA,GAAK;EACV,IAAM,CAAClG,GAAGiJ,KAAK9L,EAAQ,MAAM+I,CAAG,GAC1B0M,IAAM,KAAK,KAAK5S,EAAE,IAAIiJ,EAAE,EAAE;EAChC,KAAK,QAAQ2J,GAAKA,EAAI,KAAK,MAAOxG,EAAG,KAAK,KAAKuF,CAAE,CAAC,CAAC,GAAGzL,GAAK,EAAE,SAAM,CAAC;CACtE;CAEA,aAAa,GAA2B;EAEtC,IAAMhH,IADK,KAAK,MACH,CAAA,EAAI,WAAWyV,IAAO,SAASA;EAC5C,KAAK,QAAQ,OAAO;GAAE,GAAG1R;GAAG,IAAI;IAAE,GAAGA,EAAE;IAAI,QAAQ/D;GAAK;EAAE,IAAI,QAAQ;CACxE;CAEA,YAAY,GAAW;EACrB,KAAK,QAAQ,OAAO;GAAE,GAAG+D;GAAG,IAAI;IAAE,GAAGA,EAAE;IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG4nB,GAAM5nB,CAAC,IAAI0D,CAAC,CAAC;GAAE;EAAE,IAAI,QAAQ;CACvG;CAEA,eAAe,GAAW;EACxB,KAAK,QAAQ,OAAO;GAAE,GAAG1D;GAAG,IAAI;IAAE,GAAGA,EAAE;IAAI,OAAOlB;GAAE;EAAE,IAAI,SAAS;CACrE;CAEA,aAAa,GAAkB;EAC7B,KAAK,OAAO,EAAE,IAAIkG,KAAK,KAAA,EAAU,GAAG,EAAE,IAAIA,EAAE,CAAC;CAC/C;CAEA,eAAe,GAAqB;EAClC,IAAML,IAAM,KAAK,MAAM,CAAC,EAAE,YAAY,GAChC3D,IAAI0Q,MAAS,QAAS/M,IAAM,IAAI,IAAI,KAAMA,IAAM,IAAI,IAAI;EAC9D,KAAK,OAAO,EAAE,UAAU3D,KAAK,KAAA,EAAU,GAAG,EAAE,UAAUA,KAAK,KAAK,CAAC;CACnE;CAEA,cAAc;EACZ,KAAK,OAAO;GAAE,GAAG;GAAO,GAAG;GAAO,GAAG;GAAO,QAAQ;GAAO,IAAI,KAAA;GAAW,UAAU,KAAA;EAAU,GAAG;GAAE,GAAG;GAAO,GAAG;GAAO,GAAG;GAAO,QAAQ;GAAO,IAAI;GAAM,UAAU;EAAK,CAAC;CAC5K;CAEA,MAAM,IAAM,KAAK,MAAM,IAAI,GAAsB;EAC/C,IAAI,CAACiC,KAAO,KAAK,MAAM,GAAG,OAAO;EACjC,IAAM,CAAClG,KAAK7C,EAAQ,MAAM+I,CAAG,GACvBjD,IAAI,KAAK,KAAKjD,EAAE,EAAE;EACxB,IAAI,CAACiD,GAAG,OAAO;EAEf,IAAMP,IAAI;GAAE,GADA7F,EAAMoG,EAAE,MAAMxF,EAAUyI,CAAG,IAAIlG,EAAE,IAAIA,EAAE,IAAI,CACtC,CAAA,EAAK,KAAK,CAAC;GAAiB,GAAIvC,EAAUyI,CAAG,IAAI,KAAK,MAAM,KAAK,CAAC,IAAI,CAAC;EAAG;EAC3F,OAAO;GACL,GAAG,CAAC,CAACxD,EAAE;GACP,GAAG,CAAC,CAACA,EAAE;GACP,GAAG,CAAC,CAACA,EAAE;GACP,QAAQ,CAAC,CAACA,EAAE;GACZ,IAAIA,EAAE;GACN,OAAOA,EAAE;GACT,MAAMA,EAAE;GACR,MAAMO,EAAE;GACR,IAAIP,EAAE;GACN,UAAUA,EAAE;GACZ,QAAQkoB,GAAS3nB,CAAC;GAClB,KAAK4nB,GAAM5nB,CAAC;GACZ,OAAOA,EAAE,IAAI,SAASA,EAAE,KAAK;EAC/B;CACF;CAEA,YAAY,GAAiB;EAE3B,AADIiD,KAAO,KAAK,SAASA,EAAI,EAAE,OAAO,KAAK,KAAK,GAAG,MAAMA,EAAI,EAAE,MAAM,KAAK,KAAK,GAAG,OAAI,KAAK,OAAO,OAClG,KAAK,UAAUA,IAAM,KAAK,MAAMA,CAAG,IAAI,IAAI;CAC7C;CAEA;AACF,GC5VMklB,KAAa;CAAC;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;AAAS,GAEnHC,KAA+B;CAC1C;EAAE,OAAO;EAAQ,OAAO;EAAY,MAAM;CAAU;CACpD;EAAE,OAAO;EAAS,OAAO;EAAU,MAAM;CAAQ;CACjD;EAAE,OAAO;EAAQ,OAAO;EAAQ,MAAM;CAAO;CAC7C;EAAE,OAAO;EAAQ,OAAO;EAAa,MAAM;EAAQ,KAAK;CAAK;CAC7D;EAAE,OAAO;EAAa,OAAO;EAAqB,MAAM;CAAY;CACpE;EAAE,OAAO;EAAW,OAAO;EAAW,MAAM;CAAU;CACtD;EAAE,OAAO;EAAY,OAAO;EAAY,MAAM;CAAW;CACzD;EAAE,OAAO;EAAc,OAAO;CAAiB;CAC/C;EAAE,OAAO;EAAW,OAAO;CAAU;CACrC;EAAE,OAAO;EAAiB,OAAO;CAAgB;CACjD;EAAE,OAAO;EAAa,OAAO;CAAY;CACzC;EAAE,OAAO;EAAY,OAAO;CAAW;CACvC;EAAE,OAAO;EAAW,OAAO;CAAU;CACrC;EAAE,OAAO;EAAW,OAAO;CAAU;CACrC;EAAE,OAAO;EAAS,OAAO;CAAQ;CACjC;EAAE,OAAO;EAAO,OAAO;CAAW;CAClC;EAAE,OAAO;EAAS,OAAO;CAAQ;CACjC;EAAE,OAAO;EAAQ,OAAO;CAAO;CAC/B;EAAE,OAAO;EAAc,OAAO;EAAe,MAAM;EAAS,KAAK;CAAK;CACtE;EAAE,OAAO;EAAa,OAAO;CAAa;CAC1C;EAAE,OAAO;EAAW,OAAO;CAAW;CACtC;EAAE,OAAO;EAAa,OAAO;CAAa;CAC1C;EAAE,OAAO;EAAkB,OAAO;CAAe;CACjD;EAAE,OAAO;EAAW,OAAO;CAAU;CACrC;EAAE,OAAO;EAAa,OAAO;CAAiB;CAC9C;EAAE,OAAO;EAAS,OAAO;EAAgB,KAAK;CAAK;CACnD;EAAE,OAAO;EAAS,OAAO;EAAgB,MAAM;CAAO;CACtD;EAAE,OAAO;EAAS,OAAO;CAAe;CACxC;EAAE,OAAO;EAAoB,OAAO;EAAW,KAAK;CAAK;CACzD;EAAE,OAAO;EAAyB,OAAO;CAAkB;AAC7D,GAEMC,KAAS;CAAC;CAAM;CAAG;CAAK;CAAM;CAAG;CAAK;AAAC,CAAC,CAAC,KAAK,OAAO;CAAE,OAAO9oB;CAAG,OAAO,GAAGA,EAAE;AAAK,EAAE,GACpF+oB,KAAS;CACb;EAAE,OAAO;EAAS,OAAO;EAAS,MAAM;CAAO;CAC/C;EAAE,OAAO;EAAU,OAAO;EAAU,MAAM;CAAW;CACrD;EAAE,OAAO;EAAQ,OAAO;EAAU,MAAM;CAAU;CAClD;EAAE,OAAO;EAAU,OAAO;EAAa,MAAM;CAAQ;CACrD;EAAE,OAAO;EAAW,OAAO;EAAY,MAAM;CAAS;AACxD,GACMC,KAAU;CAAC;CAAG;CAAM;CAAK;AAAC,CAAC,CAAC,KAAK,OAAO;CAAE,OAAOvnB;CAAG,OAAOA,MAAM,IAAI,WAAWA,MAAM,IAAI,WAAW,OAAOA,CAAC;AAAE,EAAE,GACjH9I,KAAS;CACb;EAAE,OAAO;EAAK,OAAO;EAAO,MAAM;CAAO;CACzC;EAAE,OAAO;EAAO,OAAO;EAAU,MAAM;CAAU;CACjD;EAAE,OAAO;EAAK,OAAO;EAAU,MAAM;CAAU;AACjD;AAOA,SAAgBuwB,GAAY,GAoBzB;CACD,IAAM,EAAE,cAAWtmB,GACb,CAACuJ,GAAIuI,KAAS7U,EAA4B,IAAI;CACpD,SACE,EAAO,UAAU6U,SACJ;EACX,EAAO,UAAU,KAAA;CACnB,IACC,CAACC,CAAM,CAAC;CACX,IAAM/Y,IAAO,CAAC,CAACuQ,KAAMwI,EAAO,QACtBC,IAAOtM,GAAS6D,GAAI,IAAI,GACxB2I,IAAK3I,GAAI,KAAK,KAAK,MAAMA,EAAG,KAAK,CAAC,IAAI,IAAI,KAAA,GAC1C6E,IAASpV,IAAOgH,EAAM,aAAaA,EAAM,OAAO;CACtD,OACE,kBAACiH,IAAD,EAAA,UAAA;EACE,kBAAC5G,GAAD;GAAK,MAAK;GAAO,OAAO,SAASgI,EAAI;GAAK,UAAU,CAACrP,KAAQ,CAACgH,EAAM;GAAS,eAAgBhH,IAAO+Y,EAAO,KAAK,IAAI/R,EAAM,OAAO,EAAK;EAAK,CAAA;EAC3I,kBAACK,GAAD;GAAK,MAAK;GAAO,OAAO,SAASgI,EAAI;GAAK,eAAgBrP,IAAO+Y,EAAO,KAAK,IAAI/R,EAAM,OAAO,EAAI;EAAK,CAAA;EACvG,kBAACM,GAAD,CAAM,CAAA;EACN,kBAACwF,IAAD;GAAM,OAAM;GAAS,OAAM;GAAS,MAAK;GAAO,OAAOmgB;GAA4E,SAAS,MAAMjmB,EAAM,SAASnB,CAAC;EAAI,CAAA;EACtK,kBAACiH,IAAD;GACE,OAAM;GACN,OAAM;GACN,MAAK;GACL,OAAO;IACL;KAAE,OAAO;KAAO,OAAO;KAAa,MAAM;KAAY,MAAM,GAAGuC,EAAI;IAAG;IACtE;KAAE,OAAO;KAAa,OAAO;KAAmB,MAAM;IAAO;IAC7D;KAAE,OAAO;KAAU,OAAO;KAAgB,MAAM;IAAQ;IACxD;KAAE,OAAO;KAAM,OAAO;KAAiB,MAAM;KAAM,KAAK;IAAK;IAC7D;KAAE,OAAO;KAAQ,OAAO;KAAmB,MAAM;IAAO;IACxD;KAAE,OAAO;KAAQ,OAAO;KAAqB,MAAM;KAAQ,KAAK;IAAK;GACvE;GACA,SAAS,MAAMrI,EAAM,QAAQnB,CAAa;EAC3C,CAAA;EACD,kBAACyB,GAAD,CAAM,CAAA;EACLtH,IACC,kBAAAhD,GAAA,EAAA,UAAA;GACE,kBAAC8L,IAAD;IAAQ,OAAM;IAAO,OAAO;IAAK,WAAW;IAAK,OAAOkQ;IAAM,aAAY;IAAO,SAASxM,GAAYwM,CAAI;IAAG,WAAW,MAAMD,EAAO,QAAQlT,CAAC;GAAI,CAAA;GAClJ,kBAACyB,GAAD,CAAM,CAAA;GACN,kBAACyB,IAAD;IAAS,OAAOmQ;IAAI,WAAW,MAAMH,EAAO,QAAQlT,CAAC;GAAI,CAAA;GACzD,kBAACyB,GAAD,CAAM,CAAA;GACN,kBAACD,GAAD;IAAK,MAAK;IAAO,OAAO,SAASgI,EAAI;IAAK,QAAQkB,GAAI;IAAG,eAAewI,EAAO,OAAO,GAAG;GAAI,CAAA;GAC7F,kBAAC1R,GAAD;IAAK,MAAK;IAAS,OAAO,WAAWgI,EAAI;IAAK,QAAQkB,GAAI;IAAG,eAAewI,EAAO,OAAO,GAAG;GAAI,CAAA;GACjG,kBAAC1R,GAAD;IAAK,MAAK;IAAY,OAAO,cAAcgI,EAAI;IAAK,QAAQkB,GAAI;IAAG,eAAewI,EAAO,OAAO,GAAG;GAAI,CAAA;GACvG,kBAAC1R,GAAD;IAAK,MAAK;IAAS,OAAM;IAAgB,QAAQkJ,GAAI;IAAQ,eAAewI,EAAO,OAAO,QAAQ;GAAI,CAAA;GACtG,kBAAC/M,IAAD;IAAU,MAAK;IAAQ,OAAM;IAAa,OAAOuE,GAAI;IAAO,SAAS,MAAMwI,EAAO,SAASlP,CAAC;IAAG,WAAU;GAAa,CAAA;GACtH,kBAACmC,IAAD;IAAU,MAAK;IAAY,OAAM;IAAkB,OAAOuE,GAAI;IAAI,SAASyc;IAAY,SAAS,MAAMjU,EAAO,aAAalP,CAAC;GAAI,CAAA;GAC/H,kBAACxC,GAAD;IAAK,MAAK;IAAM,OAAM;IAAc,SAASkJ,GAAI,YAAY,KAAK;IAAG,eAAewI,EAAO,eAAe,KAAK;GAAI,CAAA;GACnH,kBAAC1R,GAAD;IAAK,MAAK;IAAM,OAAM;IAAY,SAASkJ,GAAI,YAAY,KAAK;IAAG,eAAewI,EAAO,eAAe,KAAK;GAAI,CAAA;GACjH,kBAACzR,GAAD,CAAM,CAAA;GACN,kBAACD,GAAD;IAAK,MAAK;IAAY,OAAM;IAAa,QAAQkJ,GAAI,SAAS;IAAQ,eAAewI,EAAO,SAAS,MAAM;GAAI,CAAA;GAC/G,kBAAC1R,GAAD;IAAK,MAAK;IAAc,OAAM;IAAS,QAAQkJ,GAAI,SAAS;IAAU,eAAewI,EAAO,SAAS,QAAQ;GAAI,CAAA;GACjH,kBAAC1R,GAAD;IAAK,MAAK;IAAa,OAAM;IAAc,QAAQkJ,GAAI,SAAS;IAAS,eAAewI,EAAO,SAAS,OAAO;GAAI,CAAA;GACnH,kBAAC1R,GAAD;IAAK,MAAK;IAAU,OAAM;IAAU,QAAQkJ,GAAI,SAAS;IAAW,eAAewI,EAAO,SAAS,SAAS;GAAI,CAAA;GAChH,kBAACxR,GAAD;IAAU,OAAM;IAAiB,MAAMxK,GAAO,MAAM,MAAM4G,EAAE,UAAUyR,CAAM,CAAC,EAAE,QAAQ;IAAQ,OAAO;IAAM,WAAW;IAAK,OAAOA,KAAU;IAAK,SAASrY,GAAO,KAAK,OAAO,EAAE,GAAG4G,EAAE,EAAE;IAAG,UAAUqD,EAAM;GAAW,CAAA;GACrN,kBAACO,GAAD;IACE,OAAM;IACN,MAAK;IACL,OAAO;IACP,WAAW;IACX,OAAOgJ,GAAI,QAAQ,KAAK,MAAMA,EAAG,QAAQ,GAAG,IAAI,MAAM;IACtD,SAAS6c;IACT,WAAW,MAAMrU,EAAO,eAAelT,CAAC;GACzC,CAAA;GACD,kBAACyB,GAAD,CAAM,CAAA;GACN,kBAACD,GAAD;IAAK,MAAK;IAAU,OAAM;IAAgB,QAAQkJ,GAAI,WAAW;IAAU,eAAewI,EAAO,aAAa,QAAQ;GAAI,CAAA;GAC1H,kBAAC1R,GAAD;IAAK,MAAK;IAAU,OAAM;IAAgB,QAAQkJ,GAAI,WAAW;IAAU,eAAewI,EAAO,aAAa,QAAQ;GAAI,CAAA;GAC1H,kBAAC1R,GAAD;IAAK,MAAK;IAAU,OAAM;IAA8B,UAAU,CAACkJ,GAAI;IAAK,eAAewI,EAAO,YAAY,EAAE;GAAI,CAAA;GACpH,kBAAC1R,GAAD;IAAK,MAAK;IAAS,OAAM;IAAkB,eAAe0R,EAAO,YAAY,CAAC;GAAI,CAAA;GAClF,kBAAC1R,GAAD;IAAK,MAAK;IAAQ,OAAM;IAAmB,eAAe0R,EAAO,YAAY;GAAI,CAAA;EACjF,EAAA,CAAA,IACA/R,EAAM,QACR,kBAAAhK,GAAA,EAAA,UAAA;GACE,kBAACgP,IAAD;IAAU,MAAK;IAAO,OAAM;IAAa,QAAQhF,EAAM;IAAQ,WAAU;GAAe,CAAA;GACxF,kBAACgF,IAAD;IAAU,MAAK;IAAU,OAAM;IAAe,SAAS,MAAMhF,EAAM,OAAO,EAAE,OAAO6C,EAAE,CAAC;IAAG,WAAU;GAAe,CAAA;GAClH,kBAACtC,GAAD;IAAU,OAAM;IAAgB,MAAK;IAAa,OAAO;IAAM,WAAW;IAAK,SAAS2lB;IAAQ,WAAW,MAAMlmB,EAAM,OAAO,EAAE,KAAE,CAAC;GAAI,CAAA;GACvI,kBAACO,GAAD;IAAU,OAAM;IAAc,MAAK;IAAY,OAAO;IAAM,WAAW;IAAK,SAAS4lB;IAAQ,WAAW,MAASnmB,EAAM,OAAO,EAAE,QAAK,CAAC;GAAI,CAAA;GAC1I,kBAACM,GAAD,CAAM,CAAA;GACN,kBAACwF,IAAD;IACE,OAAM;IACN,OAAM;IACN,MAAK;IACL,OAAO;KACL;MAAE,OAAO;MAAS,OAAO;MAAkB,MAAM;MAAS,MAAM,GAAGuC,EAAI;KAAI;KAC3E;MAAE,OAAO;MAAW,OAAO;MAAiB,MAAM,GAAGA,EAAI;KAAG;KAC5D;MAAE,OAAO;MAAY,OAAO;MAAiB,MAAM,GAAGA,EAAI;KAAG;KAC7D;MAAE,OAAO;MAAQ,OAAO;MAAgB,MAAM;MAAQ,MAAM,GAAGA,EAAI;KAAI;IACzE;IACA,SAAS,MAAMrI,EAAM,UAAUnB,CAAY;GAC5C,CAAA;GACD,kBAAC0B,GAAD;IACE,OAAM;IACN,MAAK;IACL,OAAO;IACP,WAAW;IACX,SAAS;KACP;MAAE,OAAO;MAAM,OAAO;MAAwB,MAAM;KAAS;KAC7D;MAAE,OAAO;MAAO,OAAO;MAAgC,MAAM;KAAY;KACzE;MAAE,OAAO;MAAS,OAAO;MAAqB,MAAM;MAAS,KAAK;KAAK;KACvE;MAAE,OAAO;MAAS,OAAO;MAAmB,MAAM;KAAQ;IAC5D;IACA,WAAW,MAAMP,EAAM,SAASnB,CAAW;GAC5C,CAAA;GACD,kBAAC0B,GAAD;IACE,OAAM;IACN,MAAK;IACL,OAAO;IACP,WAAW;IACX,SAAS;KACP;MAAE,OAAO;MAAQ,OAAO;MAAQ,MAAM;KAAY;KAClD;MAAE,OAAO;MAAU,OAAO;MAAU,MAAM;KAAc;KACxD;MAAE,OAAO;MAAS,OAAO;MAAS,MAAM;KAAa;KACrD;MAAE,OAAO;MAAO,OAAO;MAAO,MAAM;MAAQ,KAAK;KAAK;KACtD;MAAE,OAAO;MAAU,OAAO;MAAU,MAAM;KAAU;KACpD;MAAE,OAAO;MAAU,OAAO;MAAU,MAAM;KAAU;IACtD;IACA,WAAW,MAAMP,EAAM,QAAQnB,CAAY;GAC5C,CAAA;GACAmB,EAAM,MAAM,WACX,kBAACO,GAAD;IAAU,OAAM;IAAsB,MAAMxK,GAAO,MAAM,MAAM4G,EAAE,UAAUyR,CAAM,CAAC,EAAE,QAAQ;IAAQ,OAAO;IAAM,WAAW;IAAK,OAAOA,KAAU;IAAK,SAASrY,GAAO,KAAK,OAAO,EAAE,GAAG4G,EAAE,EAAE;IAAG,UAAUqD,EAAM;GAAW,CAAA;GAE5N,kBAACM,GAAD,CAAM,CAAA;GACN,kBAACD,GAAD;IAAK,MAAK;IAAO,OAAO,cAAcgI,EAAI;IAAK,SAASrI,EAAM;GAAc,CAAA;GAC5E,kBAACK,GAAD;IAAK,MAAK;IAAQ,OAAM;IAAe,SAASL,EAAM;GAAW,CAAA;EACjE,EAAA,CAAA,IAEF,kBAAAhK,GAAA,EAAA,UAAA,CACE,kBAACgP,IAAD;GAAU,MAAK;GAAO,OAAM;GAAmB,QAAQhF,EAAM;GAAc,WAAU;EAAkB,CAAA,GACvG,kBAAC,QAAD;GAAM,WAAU;GAAa,UAAA;EAAsC,CAAA,CACnE,EAAA,CAAA;EAEJ,kBAACM,GAAD,CAAM,CAAA;EACN,kBAACC,GAAD;GACE,OAAM;GACN,MAAK;GACL,OAAM;GACN,WAAW;GACX,SAAS,CACP;IAAE,OAAO;IAAO,OAAO;IAAsB,MAAM;GAAK,GACxD;IAAE,OAAO;IAAS,OAAO;IAAkB,MAAM;GAAM,CACzD;GACA,WAAW,MAAMP,EAAM,UAAUnB,MAAM,OAAO;EAC/C,CAAA;CACQ,EAAA,CAAA;AAEf;;AC5NA,SAAgB0nB,GAAU,EAAE,WAAQ,SAAM,UAAO,cAAmG;CAClJ,IAAM1pB,IAAMC,EAAuB,IAAI,GACjCoY,IAAUoB,EAAK,OAAO,QAAQ,MAAM,CAAChZ,EAAE,MAAM,CAAC,CAAC,KAAK,MAAMA,EAAE,KAAK,GACjEkpB,IAAQtR,EAAQ,SAASA,IAAUoB,EAAK,OAAO,KAAK,MAAMhZ,EAAE,KAAK,GACjE,CAACzE,GAAK4E,KAAUR,EAAS,KAAK,IAAI,GAAGupB,EAAM,WAAW,MAAMzsB,KAAKoC,CAAK,CAAC,CAAC,GACxE,CAAC4D,GAAI0mB,KAASxpB,EAAS;EAAE,GAAG,OAAO;EAAY,GAAG,OAAO;CAAY,CAAC;CAE5E,QAAgB;EACd,IAAMC,IAAKL,EAAI;EAEf,AADAK,GAAI,MAAM,GACVA,GAAI,oBAAoB,CAAC,CAAC,YAAY,CAAC,CAAC;EACxC,IAAMwpB,UAAeD,EAAM;GAAE,GAAG,OAAO;GAAY,GAAG,OAAO;EAAY,CAAC,GACpEE,UAAe,CAAC,SAAS,qBAAqB5e,EAAQ;EAG5D,OAFA,OAAO,iBAAiB,UAAU2e,CAAM,GACxC,SAAS,iBAAiB,oBAAoBC,CAAM,SACvC;GAGX,AAFA,OAAO,oBAAoB,UAAUD,CAAM,GAC3C,SAAS,oBAAoB,oBAAoBC,CAAM,GACnD,SAAS,qBAAmB,SAAS,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC;EAC1E;CACF,GAAG,CAAC5e,CAAO,CAAC;CAEZ,IAAM6e,KAAM,MAAcnpB,GAAQ,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI+oB,EAAM,SAAS,GAAG3oB,IAAI0D,CAAC,CAAC,CAAC,GAChFiP,IAAQ,KAAK,IAAIzQ,EAAG,IAAIuW,EAAK,GAAGvW,EAAG,IAAIuW,EAAK,CAAC;CACnD,OACE,kBAAC,OAAD;EACO;EACL,WAAU;EACV,UAAU;EACV,eAAesQ,EAAG,CAAC;EACnB,gBAAgB,MAAM;GAEpB,AADA,EAAE,eAAe,GACjBA,EAAG,EAAE;EACP;EACA,YAAY,MAAM;GAChB,IAAI;IAAC;IAAc;IAAa;IAAY;IAAK;IAAS;GAAG,CAAC,CAAC,SAAS,EAAE,GAAG,GAAG,EAAG,CAAC;QAC/E,IAAI;IAAC;IAAa;IAAW;IAAU;IAAa;GAAG,CAAC,CAAC,SAAS,EAAE,GAAG,GAAG,EAAG,EAAE;QAC/E,IAAI,EAAE,QAAQ,QAAQ,EAAO,CAAC;QAC9B,IAAI,EAAE,QAAQ,OAAO,EAAOJ,EAAM,SAAS,CAAC;QAC5C,IAAI,EAAE,QAAQ,UAAU,EAAQ;QAChC;GACL,EAAE,eAAe;EACnB;EAjBF,UAAA,CAmBE,kBAAC,OAAD;GAAK,OAAO;IAAE,OAAOlQ,EAAK,IAAI9F;IAAO,QAAQ8F,EAAK,IAAI9F;GAAM;GAC1D,UAAA,kBAACqW,IAAD;IAAoC;IAAQ,OAAOL,EAAM3tB;IAAY;IAAa;IAAO,MAAA;GAAM,GAA/E2tB,EAAM3tB,EAAyE;EAC5F,CAAA,GACL,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACGA,IAAM;IAAE;IAAI2tB,EAAM;GAChB;EACF,CAAA,CAAA;;AAET;;ACvDA,IAAM5qB,KAAK,MAAc,CAACY,EAAE,QAAQ,CAAC,GAC/BsqB,MAAQ,MAA4B,MAAMC,EAAI,KAAK,CAACpqB,GAAGmL,OAAO,GAAGlM,EAAEe,CAAC,EAAE,GAAGf,EAAEkM,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,MAC9FlN,KAAK,GAAU,GAAc,OAAiBosB,IAAMzrB,MAAS0rB,KAAO;AAE1E,SAASC,GAAQ,GAAW,GAAW;CACrC,IAAMC,IAAK/pB,IAAI,GACTgqB,IAAK/pB,IAAI;CACf,OAAO,MAAMzB,EAAEwrB,CAAE,EAAE,IAAIxrB,EAAEurB,CAAE,EAAE,GAAGvrB,EAAEwrB,CAAE,EAAE,SAASxrB,EAAEwB,CAAC,EAAE,GAAGxB,EAAEwrB,CAAE,EAAE,IAAIxrB,EAAEurB,CAAE,EAAE,GAAGvrB,EAAEwrB,CAAE,EAAE,WAAWxrB,EAAEwrB,CAAE,EAAE;AACnG;AAEA,SAASC,GAAU,GAAW,GAAW,GAAW;CAElD,OADA,IAAI,KAAK,IAAIvnB,GAAG1C,IAAI,GAAGC,IAAI,CAAC,GACrB,IAAIzB,EAAEkE,CAAC,EAAE,MAAMlE,EAAEwB,IAAI0C,CAAC,EAAE,IAAIlE,EAAEkE,CAAC,EAAE,GAAGlE,EAAEkE,CAAC,EAAE,SAASlE,EAAEwB,CAAC,EAAE,GAAGxB,EAAEkE,CAAC,EAAE,IAAIlE,EAAEyB,IAAIyC,CAAC,EAAE,IAAIlE,EAAEkE,CAAC,EAAE,GAAGlE,EAAEkE,CAAC,EAAE,SAASlE,EAAEwB,IAAI0C,CAAC,EAAE,GAAGlE,EAAEyB,CAAC,EAAE,IAAIzB,EAAEkE,CAAC,EAAE,IAAIlE,EAAEkE,CAAC,EAAE,GAAGlE,EAAEkE,CAAC,EAAE,WAAWlE,EAAEyB,IAAIyC,CAAC,EAAE,IAAIlE,EAAEkE,CAAC,EAAE,IAAIlE,EAAEkE,CAAC,EAAE,GAAGlE,EAAEkE,CAAC,EAAE,SAASlE,EAAEkE,CAAC,EAAE;AACtN;AAEA,SAASwnB,GAAQ,GAAW,GAAW,GAAW,IAAM,CAAC,KAAK,KAAK,GAAG;CACpE,IAAMP,IAA0B,CAAC;CACjC,KAAK,IAAIhtB,IAAI,GAAGA,IAAI,GAAG,KAAK;EAC1B,IAAMR,IAAIguB,IAAOxtB,IAAI,IAAI,KAAK,KAAM;EACpC,EAAI,KAAK,CAACqD,IAAI,IAAKA,IAAI,IAAK,KAAK,IAAI7D,CAAC,GAAG8D,IAAI,IAAKA,IAAI,IAAK,KAAK,IAAI9D,CAAC,CAAC,CAAC;CACzE;CACA,OAAOutB,GAAKC,CAAG;AACjB;AAEA,SAASS,GAAK,GAAW,GAAW,GAAW,GAAe;CAC5D,IAAMT,IAA0B,CAAC;CACjC,KAAK,IAAIhtB,IAAI,GAAGA,IAAI,IAAI,GAAG,KAAK;EAC9B,IAAMR,IAAI,CAAC,KAAK,KAAK,IAAKQ,IAAI,KAAK,KAAM,GACnC+F,IAAI/F,IAAI,IAAI8mB,IAAQ;EAC1B,EAAI,KAAK,CAACzjB,IAAI,IAAKA,IAAI,IAAK0C,IAAI,KAAK,IAAIvG,CAAC,GAAG8D,IAAI,IAAKA,IAAI,IAAKyC,IAAI,KAAK,IAAIvG,CAAC,CAAC,CAAC;CACjF;CACA,OAAOutB,GAAKC,CAAG;AACjB;AAEA,IAAaU,qBAAa,IAAI,IAAI;CAAC;CAAQ;CAAsB;CAAkB;CAAkB;CAAkB;CAAoB;CAAoB;AAAkB,CAAC;AAElL,SAAgBC,GAAS,GAAc,GAAW,GAAW,GAAkB;CAC7E,IAAMC,IAAK,KAAK,IAAIvqB,GAAGC,CAAC;CACxB,QAAQuqB,GAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK,SACH,OAAOV,GAAQ9pB,GAAGC,CAAC;EACrB,KAAK;EACL,KAAK,6BACH,OAAOgqB,GAAUjqB,GAAGC,GAAGsqB,IAAK/sB,EAAEosB,GAAK,OAAO,KAAK,CAAC;EAClD,KAAK,uBACH,OAAOK,GAAUjqB,GAAGC,GAAGA,IAAI,CAAC;EAC9B,KAAK,YAEH,OAAOypB,GAAK;GAAC,CADH1pB,IAAIxC,EAAEosB,GAAK,OAAO,GAAK,GAChB,CAAC;GAAG,CAAC5pB,GAAGC,CAAC;GAAG,CAAC,GAAGA,CAAC;EAAC,CAAC;EAEtC,KAAK,cACH,OAAOypB,GAAK;GAAC,CAAC,GAAG,CAAC;GAAG,CAAC1pB,GAAGC,CAAC;GAAG,CAAC,GAAGA,CAAC;EAAC,CAAC;EACtC,KAAK;EACL,KAAK,qBACH,OAAOypB,GAAK;GAAC,CAAC1pB,IAAI,GAAG,CAAC;GAAG,CAACA,GAAGC,IAAI,CAAC;GAAG,CAACD,IAAI,GAAGC,CAAC;GAAG,CAAC,GAAGA,IAAI,CAAC;EAAC,CAAC;EAC9D,KAAK;EACL,KAAK,wBAAwB;GAC3B,IAAM2D,IAAI2mB,IAAK/sB,EAAEosB,GAAK,OAAO,IAAK;GAClC,OAAOF,GAAK;IAAC,CAAC9lB,GAAG,CAAC;IAAG,CAAC5D,GAAG,CAAC;IAAG,CAACA,IAAI4D,GAAG3D,CAAC;IAAG,CAAC,GAAGA,CAAC;GAAC,CAAC;EAClD;EACA,KAAK,aAAa;GAChB,IAAM2D,IAAI2mB,IAAK/sB,EAAEosB,GAAK,OAAO,IAAK;GAClC,OAAOF,GAAK;IAAC,CAAC9lB,GAAG,CAAC;IAAG,CAAC5D,IAAI4D,GAAG,CAAC;IAAG,CAAC5D,GAAGC,CAAC;IAAG,CAAC,GAAGA,CAAC;GAAC,CAAC;EAClD;EACA,KAAK,YACH,OAAOiqB,GAAQlqB,GAAGC,GAAG,CAAC;EACxB,KAAK,WAAW;GACd,IAAM2D,IAAI2mB,IAAK/sB,EAAEosB,GAAK,OAAO,IAAK;GAClC,OAAOF,GAAK;IAAC,CAAC9lB,GAAG,CAAC;IAAG,CAAC5D,IAAI4D,GAAG,CAAC;IAAG,CAAC5D,GAAGC,IAAI,CAAC;IAAG,CAACD,IAAI4D,GAAG3D,CAAC;IAAG,CAAC2D,GAAG3D,CAAC;IAAG,CAAC,GAAGA,IAAI,CAAC;GAAC,CAAC;EAC9E;EACA,KAAK,YACH,OAAOiqB,GAAQlqB,GAAGC,GAAG,CAAC;EACxB,KAAK,WAAW;GACd,IAAM2D,IAAI2mB,IAAK/sB,EAAEosB,GAAK,OAAO,KAAK;GAClC,OAAOF,GAAK;IAAC,CAAC9lB,GAAG,CAAC;IAAG,CAAC5D,IAAI4D,GAAG,CAAC;IAAG,CAAC5D,GAAG4D,CAAC;IAAG,CAAC5D,GAAGC,IAAI2D,CAAC;IAAG,CAAC5D,IAAI4D,GAAG3D,CAAC;IAAG,CAAC2D,GAAG3D,CAAC;IAAG,CAAC,GAAGA,IAAI2D,CAAC;IAAG,CAAC,GAAGA,CAAC;GAAC,CAAC;EAC9F;EACA,KAAK,WACH,OAAOsmB,GAAQlqB,GAAGC,GAAG,EAAE;EACzB,KAAK,aACH,OAAOiqB,GAAQlqB,GAAGC,GAAG,EAAE;EACzB,KAAK,SACH,OAAOmqB,GAAKpqB,GAAGC,GAAG,GAAG,GAAI;EAC3B,KAAK,SACH,OAAOmqB,GAAKpqB,GAAGC,GAAG,GAAG,GAAI;EAC3B,KAAK,SACH,OAAOmqB,GAAKpqB,GAAGC,GAAG,GAAG,EAAG;EAC1B,KAAK,SACH,OAAOmqB,GAAKpqB,GAAGC,GAAG,GAAG,EAAG;EAC1B,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,UACH,OAAOmqB,GAAKpqB,GAAGC,GAAG,OAAOuqB,EAAK,MAAM,CAAC,CAAC,GAAG,EAAG;EAC9C,KAAK,aAAa;GAChB,IAAM5mB,IAAI2mB,IAAK/sB,EAAEosB,GAAK,OAAO,GAAK;GAClC,OAAOF,GAAK;IAAC,CAAC,GAAG,CAAC;IAAG,CAAC1pB,IAAI4D,GAAG,CAAC;IAAG,CAAC5D,GAAGC,IAAI,CAAC;IAAG,CAACD,IAAI4D,GAAG3D,CAAC;IAAG,CAAC,GAAGA,CAAC;GAAC,CAAC;EAClE;EACA,KAAK,WAAW;GACd,IAAM2D,IAAI2mB,IAAK/sB,EAAEosB,GAAK,OAAO,GAAK;GAClC,OAAOF,GAAK;IAAC,CAAC,GAAG,CAAC;IAAG,CAAC1pB,IAAI4D,GAAG,CAAC;IAAG,CAAC5D,GAAGC,IAAI,CAAC;IAAG,CAACD,IAAI4D,GAAG3D,CAAC;IAAG,CAAC,GAAGA,CAAC;IAAG,CAAC2D,GAAG3D,IAAI,CAAC;GAAC,CAAC;EAC9E;EACA,KAAK;EACL,KAAK,aAAa;GAChB,IAAM9D,IAAI8D,IAAIzC,EAAEosB,GAAK,QAAQ,GAAK,GAC5BhH,IAAK2H,IAAK/sB,EAAEosB,GAAK,QAAQ,GAAK,GAC9BlL,KAAMze,IAAI9D,KAAK,GACfwtB,IAA0B;IAAC,CAAC,GAAGjL,CAAE;IAAG,CAAC1e,IAAI4iB,GAAIlE,CAAE;IAAG,CAAC1e,IAAI4iB,GAAI,CAAC;IAAG,CAAC5iB,GAAGC,IAAI,CAAC;IAAG,CAACD,IAAI4iB,GAAI3iB,CAAC;IAAG,CAACD,IAAI4iB,GAAIlE,IAAKviB,CAAC;IAAG,CAAC,GAAGuiB,IAAKviB,CAAC;GAAC;GAC3H,OAAOutB,GAAKc,MAAS,cAAcb,EAAI,KAAK,CAACpqB,GAAGmL,OAAO,CAAC1K,IAAIT,GAAGmL,CAAC,CAAC,IAAIif,CAAG;EAC1E;EACA,KAAK;EACL,KAAK,aAAa;GAChB,IAAMxtB,IAAI6D,IAAIxC,EAAEosB,GAAK,QAAQ,GAAK,GAC5BhH,IAAK2H,IAAK/sB,EAAEosB,GAAK,QAAQ,GAAK,GAC9BnL,KAAMze,IAAI7D,KAAK,GACfwtB,IAA0B;IAAC,CAAClL,GAAIxe,CAAC;IAAG,CAACwe,GAAImE,CAAE;IAAG,CAAC,GAAGA,CAAE;IAAG,CAAC5iB,IAAI,GAAG,CAAC;IAAG,CAACA,GAAG4iB,CAAE;IAAG,CAACnE,IAAKtiB,GAAGymB,CAAE;IAAG,CAACnE,IAAKtiB,GAAG8D,CAAC;GAAC;GAC3G,OAAOypB,GAAKc,MAAS,cAAcb,EAAI,KAAK,CAACpqB,GAAGmL,OAAO,CAACnL,GAAGU,IAAIyK,CAAC,CAAC,IAAIif,CAAG;EAC1E;EACA,KAAK,kBAAkB;GACrB,IAAMxtB,IAAI8D,IAAIzC,EAAEosB,GAAK,QAAQ,GAAK,GAC5BhH,IAAK2H,IAAK/sB,EAAEosB,GAAK,QAAQ,GAAK,GAC9BlL,KAAMze,IAAI9D,KAAK;GACrB,OAAOutB,GAAK;IAAC,CAAC,GAAGzpB,IAAI,CAAC;IAAG,CAAC2iB,GAAI,CAAC;IAAG,CAACA,GAAIlE,CAAE;IAAG,CAAC1e,IAAI4iB,GAAIlE,CAAE;IAAG,CAAC1e,IAAI4iB,GAAI,CAAC;IAAG,CAAC5iB,GAAGC,IAAI,CAAC;IAAG,CAACD,IAAI4iB,GAAI3iB,CAAC;IAAG,CAACD,IAAI4iB,GAAIlE,IAAKviB,CAAC;IAAG,CAACymB,GAAIlE,IAAKviB,CAAC;IAAG,CAACymB,GAAI3iB,CAAC;GAAC,CAAC;EAC1I;EACA,KAAK;EACL,KAAK,YAAY;GACf,IAAM2D,IAAI2mB,IAAK/sB,EAAEosB,GAAK,OAAO,IAAK;GAClC,OAAOF,GAAK;IAAC,CAAC9lB,GAAG,CAAC;IAAG,CAAC5D,IAAI4D,GAAG,CAAC;IAAG,CAAC5D,IAAI4D,GAAGA,CAAC;IAAG,CAAC5D,GAAG4D,CAAC;IAAG,CAAC5D,GAAGC,IAAI2D,CAAC;IAAG,CAAC5D,IAAI4D,GAAG3D,IAAI2D,CAAC;IAAG,CAAC5D,IAAI4D,GAAG3D,CAAC;IAAG,CAAC2D,GAAG3D,CAAC;IAAG,CAAC2D,GAAG3D,IAAI2D,CAAC;IAAG,CAAC,GAAG3D,IAAI2D,CAAC;IAAG,CAAC,GAAGA,CAAC;IAAG,CAACA,GAAGA,CAAC;GAAC,CAAC;EAC9I;EACA,KAAK,aAAa;GAChB,IAAMA,IAAI2mB,IAAK/sB,EAAEosB,GAAK,OAAO,KAAK;GAClC,OAAOF,GAAK;IAAC,CAAC,GAAG,CAAC;IAAG,CAAC1pB,IAAI4D,GAAG,CAAC;IAAG,CAAC5D,GAAG4D,CAAC;IAAG,CAAC5D,GAAGC,CAAC;IAAG,CAAC,GAAGA,CAAC;GAAC,CAAC;EAC1D;EACA,KAAK,iBAAiB;GACpB,IAAM2D,IAAI2mB,IAAK/sB,EAAEosB,GAAK,QAAQ,KAAK;GACnC,OAAOF,GAAK;IAAC,CAAC9lB,GAAG,CAAC;IAAG,CAAC5D,IAAI4D,GAAG,CAAC;IAAG,CAAC5D,GAAG4D,CAAC;IAAG,CAAC5D,GAAGC,CAAC;IAAG,CAAC,GAAGA,CAAC;IAAG,CAAC,GAAG2D,CAAC;GAAC,CAAC;EAClE;EACA,KAAK;EACL,KAAK,kBAAkB;GACrB,IAAMlB,IAAI6nB,IAAK/sB,EAAEosB,GAAK,QAAQ,KAAK,KAAKW,IAAK/sB,EAAEosB,GAAK,OAAO,KAAK;GAChE,OAAO,IAAIprB,EAAEkE,CAAC,EAAE,MAAMlE,EAAEwB,IAAI0C,CAAC,EAAE,IAAIlE,EAAEkE,CAAC,EAAE,GAAGlE,EAAEkE,CAAC,EAAE,SAASlE,EAAEwB,CAAC,EAAE,GAAGxB,EAAEkE,CAAC,EAAE,IAAIlE,EAAEyB,CAAC,EAAE,OAAOzB,EAAEkE,CAAC,EAAE,IAAIlE,EAAEkE,CAAC,EAAE,GAAGlE,EAAEkE,CAAC,EAAE,SAASlE,EAAEkE,CAAC,EAAE;EAC5H;EACA,KAAK;EACL,KAAK,yBAAyB;GAC5B,IAAMsnB,IAAKO,IAAK/sB,EAAEosB,GAAK,OAAO,IAAK,IAAI;GACvC,OAAO,MAAMprB,EAAEwrB,CAAE,EAAE,IAAIxrB,EAAEwB,IAAI,CAAC,EAAE,GAAGxB,EAAEwrB,CAAE,EAAE,SAASxrB,EAAEwB,CAAC,EAAE,GAAGxB,EAAEwrB,CAAE,EAAE,IAAIxrB,EAAEyB,IAAI+pB,CAAE,EAAE,IAAIxrB,EAAEwB,IAAI,CAAC,EAAE,GAAGxB,EAAEwrB,CAAE,EAAE,WAAWxrB,EAAEyB,IAAI+pB,CAAE,EAAE,QAAQxrB,EAAEwrB,CAAE,EAAE,IAAIxrB,EAAEwB,IAAI,CAAC,EAAE,GAAGxB,EAAEwrB,CAAE,EAAE,SAASxrB,EAAEwB,CAAC,EAAE,GAAGxB,EAAEwrB,CAAE;EACpL;EACA,KAAK,SAAS;GACZ,IAAM7tB,IAAIouB,IAAK/sB,EAAEosB,GAAK,OAAO,IAAK;GAClC,OAAOE,GAAQ9pB,GAAGC,CAAC,IAAI,KAAKzB,EAAErC,CAAC,EAAE,GAAGqC,EAAEyB,IAAI,CAAC,EAAE,IAAIzB,EAAEwB,IAAI,IAAI7D,CAAC,EAAE,GAAGqC,EAAEyB,IAAI,IAAI9D,CAAC,EAAE,SAASqC,EAAEwB,IAAI7D,CAAC,EAAE,GAAGqC,EAAEyB,IAAI,CAAC,EAAE,IAAIzB,EAAEwB,IAAI,IAAI7D,CAAC,EAAE,GAAGqC,EAAEyB,IAAI,IAAI9D,CAAC,EAAE,SAASqC,EAAErC,CAAC,EAAE,GAAGqC,EAAEyB,IAAI,CAAC,EAAE;EACzK;EACA,KAAK,SACH,OAAO,IAAIzB,EAAEwB,IAAI,CAAC,EAAE,GAAGxB,EAAEyB,IAAI,GAAI,EAAE,IAAIzB,EAAEwB,IAAI,CAAC,EAAE,WAAWxB,EAAEyB,IAAI,EAAG,EAAE,MAAMzB,EAAEyB,IAAI,EAAG,EAAE,GAAGzB,EAAEwB,IAAI,CAAC,EAAE,GAAGxB,EAAEyB,IAAI,EAAG,EAAE,GAAGzB,EAAEwB,IAAI,CAAC,EAAE,GAAGxB,EAAEyB,CAAC,EAAE,IAAIzB,EAAEwB,IAAI,CAAC,EAAE,GAAGxB,EAAEyB,IAAI,EAAG,EAAE,GAAGzB,EAAEwB,CAAC,EAAE,GAAGxB,EAAEyB,IAAI,EAAG,EAAE,GAAGzB,EAAEwB,CAAC,EAAE,GAAGxB,EAAEyB,IAAI,EAAG,EAAE,IAAIzB,EAAEwB,CAAC,EAAE,KAAKxB,EAAEwB,IAAI,CAAC,EAAE,KAAKxB,EAAEwB,IAAI,CAAC,EAAE,GAAGxB,EAAEyB,IAAI,GAAI,EAAE;EAClQ,KAAK;EACL,KAAK,yBAAyB;GAC5B,IAAMwqB,IAAKzqB,IAAI,IAAIA,IAAIxC,EAAEosB,GAAK,QAAQ,MAAM,GACtCc,IAAKzqB,IAAI,IAAIA,IAAIzC,EAAEosB,GAAK,QAAQ,KAAK;GAC3C,OAAOF,GAAK;IAAC,CAAC,GAAG,CAAC;IAAG,CAAC1pB,GAAG,CAAC;IAAG,CAACA,GAAGC,CAAC;IAAG,CAACD,IAAI,KAAMC,CAAC;IAAG,CAACwqB,GAAIC,CAAE;IAAG,CAAC1qB,IAAI,KAAMC,CAAC;IAAG,CAAC,GAAGA,CAAC;GAAC,CAAC;EACtF;EACA,KAAK;EACL,KAAK,sBACH,OAAO,SAASzB,EAAEwB,CAAC,EAAE,GAAGxB,EAAEyB,CAAC;EAC7B,KAAK,kBACH,OAAO,SAASzB,EAAEwB,CAAC,EAAE,IAAIxB,EAAEyB,CAAC;EAC9B,KAAK,kBAEH,OAAO,SAASzB,EADNwB,IAAIxC,EAAEosB,GAAK,QAAQ,GAAK,CACf,EAAE,IAAIprB,EAAEyB,CAAC,EAAE,IAAIzB,EAAEwB,CAAC;EAEvC,KAAK,kBACH,OAAO,SAASxB,EAAEwB,IAAI,CAAC,EAAE,IAAIxB,EAAEyB,CAAC,EAAE,IAAIzB,EAAEwB,CAAC;EAC3C,KAAK;EACL,KAAK;EACL,KAAK,oBACH,OAAO,SAASxB,EAAEwB,IAAI,CAAC,EAAE,KAAKxB,EAAEwB,IAAI,CAAC,EAAE,GAAGxB,EAAEyB,CAAC,EAAE,GAAGzB,EAAEwB,CAAC,EAAE,GAAGxB,EAAEyB,CAAC;EAC/D,SACE,OAAO,SAASzB,EAAEwB,CAAC,EAAE,IAAIxB,EAAEyB,CAAC,EAAE;CAClC;AACF;;AC/KA,SAAS0qB,GAAS,GAAuB;CACvC,IAAM,IAAc,CAAC;CAErB,OADIlkB,EAAE,OAAK,EAAE,KAAK,UAAUA,EAAE,IAAI,KAAK,GAChC;EAAE,MAAMA,EAAE;EAAG,KAAKA,EAAE;EAAG,OAAOA,EAAE;EAAG,QAAQA,EAAE;EAAG,WAAW,EAAE,SAAS,EAAE,KAAK,GAAG,IAAI,KAAA;CAAU;AACvG;AAEA,SAASmkB,GAAW,GAAwB,GAAwB,GAA6C;CAC/G,IAAMhqB,IAAMD,GAAYM,GAAQ4pB,GAAM,MAAM,QAAQA,EAAK,SAAS,KAAA,GAAW9pB,CAAO;CACpF,IAAK8pB,GACL,QAAQA,EAAK,GAAb;EACE,KAAK,SACH,OAAO,EAAE,YAAYA,EAAK,EAAE;EAC9B,KAAK,QACH,OAAO,EAAE,YAAYA,EAAK,IAAI;EAChC,KAAK,OACH,OAAOjqB,KAAOA,MAAQ,gBAClB;GAAE,iBAAiB,QAAQA,EAAI;GAAK,gBAAgBiqB,EAAK,OAAO,SAAS;GAAa,kBAAkBA,EAAK,OAAO,WAAW;EAAY,IAC3I,KAAA;EACN,SACE;CACJ;AACF;AAEA,SAASC,GAAS,GAAwB;CACxC,IAAM5qB,IAAmB,EAAE,UAAU,GAAGwC,EAAE,WAAWA,EAAE,KAAK,MAAOA,EAAE,GAAG,IAAI;CAE5E,AADIA,EAAE,MAAG,EAAE,aAAa,MACpBA,EAAE,MAAG,EAAE,YAAY;CACvB,IAAM0J,IAAO,CAAC1J,EAAE,IAAI,cAAc,IAAIA,EAAE,SAAS,iBAAiB,EAAE,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAO9F,OANI0J,MAAM,EAAE,iBAAiBA,IACzB1J,EAAE,UAAO,EAAE,QAAQA,EAAE,QACrBA,EAAE,SAAM,EAAE,aAAaA,EAAE,OACzBA,EAAE,aAAU,EAAE,gBAAgBA,EAAE,WAAW,IAAI,UAAU,QACzDA,EAAE,SAAM,EAAE,gBAAgB,cAC1BA,EAAE,OAAI,EAAE,aAAaA,EAAE,KACpBxC;AACT;AAOA,SAAgB6qB,GAAS,EAAE,SAAM,SAAM,WAA6D;CAClG,IAAM,CAACpZ,GAAGxV,GAAGuG,GAAG+D,KAAK7K,EAAK,KACpB2X,IAAuB;EAC3B,GAAIyX,IAAO;GAAE,UAAU;GAAY,OAAO;GAAQ,WAAW;EAAO,IAAI,CAAC;EACzE,SAAS,GAAG7uB,EAAE,KAAKuG,EAAE,KAAK+D,EAAE,KAAKkL,EAAE;EACnC,gBAAgB/V,EAAK,WAAW,QAAQ,WAAWA,EAAK,WAAW,MAAM,aAAa;CACxF;CAGA,OAFIA,EAAK,SAAM,EAAM,cAAcA,EAAK,SAAS,YAAY,gBAAgB,gBACzEA,EAAK,SAAS,CAACqvB,IAAa,kBAAC,OAAD;EAAK,WAAU;EAAgB;CAAQ,CAAA,IAErE,kBAAC,OAAD;EACE,KAAKA,GAAM;EACX,YAAYrvB,EAAK,OAAO,WAAW,uBAAuBqvB,IAAO,iBAAiB;EAC3E;EACP,iBAAiBA,IAAO,KAAO,KAAA;EAC/B,gCAAA;EACA,YAAY,MAAe,KAAA;EAE1B,UAAArvB,EAAK,MAAM,KAAK,GAAG,MAAM;GACxB,IAAMsb,IAAoB;IACxB,WAAWzW,EAAE;IACb,aAAaA,EAAE,QAAQ,KAAA;IACvB,YAAYA,EAAE,UAAU,KAAA;IACxB,YAAYA,EAAE,UAAU,KAAA;IACxB,eAAeA,EAAE,UAAU,KAAA;IAC3B,YAAYA,EAAE,OAAO,GAAGA,EAAE,KAAK,MAAMA,EAAE,QAAQ,EAAEA,EAAE,QAAQ,IAAA,CAAK,QAAQ,CAAC,IAAI;GAC/E;GACA,CAAI,CAACA,EAAE,KAAK,UAAUA,EAAE,KAAK,OAAO,MAAM,CAAClB,EAAE,QAAQ,CAACA,EAAE,EAAE,OAAG,EAAG,WAAW,GAAGkB,EAAE,MAAM;GACtF,IAAMoX,IAAOpX,EAAE,SAAS,IAAI,CAACA,EAAE,SAAS,GACpCmD,IAAI,GACFsnB,IAAqBzqB,EAAE,KAAK,KAAK,GAAG,MAAM;IAC9C,IAAM7C,IAAKgG;IAeX,OAdA,KAAKlB,EAAE,OAAUA,EAAE,KAAN,IAAeA,EAAE,KAAK,QAC/BuoB,IACEvoB,EAAE,MAEF,kBAAC,QAAD;KAAc,UAAQ9E;KAAI,YAAS;KAAG,iBAAiB;KAAO,OAAOktB,GAASpoB,CAAC;KAC5E,UAAAA,EAAE;IACC,GAFKwB,CAEL,IAGR,kBAAC,QAAD;KAAc,UAAQtG;KAAI,OAAOktB,GAASpoB,CAAC;KACxC,UAAAA,EAAE,KAAK,OAAOA,EAAE;IACb,GAFKwB,CAEL,IAGHxB,EAAE,KACP,kBAAC,MAAD,CAAa,GAAJwB,CAAI,IACXxB,EAAE,OACJ,kBAAC,KAAD;KAAW,MAAMA,EAAE;KAAM,QAAO;KAAS,KAAI;KAAsB,OAAO,EAAE,OAAO,UAAU;KAC3F,UAAA,kBAAC,QAAD;MAAM,OAAOooB,GAASpoB,CAAC;MAAI,UAAAA,EAAE;KAAW,CAAA;IACvC,GAFKwB,CAEL,IAEH,kBAAC,QAAD;KAAc,OAAO4mB,GAASpoB,CAAC;KAC5B,UAAAA,EAAE;IACC,GAFKwB,CAEL;GAEV,CAAC,GACK2N,IAAQjO,MAAM;GACpB,OACE,kBAAC,OAAD;IAAa,OAAOsT;IAAI,WAAS+T,IAAO,OAAOtuB,CAAC,IAAI,KAAA;IAApD,UAAA;KACG8D,EAAE,UAAU,CAACoR,KACZ,kBAAC,QAAD;MACE,WAAU;MACV,iBAAiB,MAAe,KAAA;MAChC,OAAO;OAAE,UAAUgG,KAAQ,KAAA;OAAW,cAAcA,IAAO,KAAA,IAAY;OAAS,UAAU,GAAGpX,EAAE,OAAO,GAAG;OAAK,OAAOA,EAAE,OAAO;OAAO,YAAYA,EAAE,OAAO;MAAK;MAE9J,UAAAA,EAAE,OAAO;KACN,CAAA;KAEPyqB;KACArZ,MACEoZ,IACC,kBAAC,QAAD;MAAM,UAAQ;MAAG,cAAW;MACzB,UAAA;KACG,CAAA,IAEN;IAED;GAnBK,GAAAtuB,CAmBL;EAET,CAAC;CACE,CAAA;AAET;AAEA,SAASwuB,GAAO,EAAE,OAAI,QAAgC;CACpD,OACE,kBAAC,UAAD;EAAY;EAAI,SAAQ;EAAY,MAAK;EAAI,MAAK;EAAI,aAAY;EAAI,cAAa;EAAI,QAAO;EAC5F,UAAA,kBAAC,QAAD;GAAM,GAAE;GAAqB,MAAMjrB,EAAE;EAAI,CAAA;CACnC,CAAA;AAEZ;AAQA,SAASkrB,GAAU,EAAE,OAAI,WAAQ,SAAM,cAAoH;CACzJ,IAAM5f,IAAK6f,EAAM,CAAC,CAAC,QAAQ,MAAM,EAAE,GAC7B,EAAE,WAAQvrB,GACVwrB,IAASjB,GAAW,IAAIvqB,EAAG,IAAI,GAC/ByrB,IAAUX,GAAW3pB,GAAQnB,EAAG,MAAMkB,CAAI,GAC1CmD,IAAIrE,EAAG,QAAQwqB,GAASxqB,EAAG,MAAMod,EAAI,GAAGA,EAAI,GAAGpd,EAAG,GAAG,GACrD0rB,IAAUtO,EAAI,SAASA,EAAI,OAC3BuO,IAAOD,IAAU,aAAatO,EAAI,QAAQA,EAAI,IAAI,EAAE,GAAGA,EAAI,QAAQA,EAAI,IAAI,EAAE,UAAUA,EAAI,QAAQ,KAAK,EAAE,GAAGA,EAAI,QAAQ,KAAK,EAAE,KAAK,KAAA,GACrIwO,IAAS,CAACJ,KAAU,CAACxrB,EAAG,SAASA,EAAG,SAAS,UAAUA,EAAG,SAAS,qBACnE6rB,IAAQ,CAACL,KAAUxrB,EAAG,MAAM,MAAM,UAAUA,EAAG,KAAK,IAAI,KAAA,GACxDyI,IAAM,CAAC+iB,KAAUC,KAAWzrB,EAAG,MAAM,MAAM,UAAUyrB,IAAU,KAAA,GAC/DrrB,IAAIJ,EAAG,QACPE,IAAI,KAAK,IAAIkd,EAAI,GAAG,CAAC,GACrBjd,IAAI,KAAK,IAAIid,EAAI,GAAG,CAAC;CAC3B,OACE,kBAAC,OAAD;EAAK,WAAU;EAAQ,OAAOyN,GAASzN,CAAG;EAAG,YAAUpd,EAAG,QAAQ,KAAA,KAAaA,EAAG,OAAOA,EAAG,MAAM,KAAA;EAAW,YAAUA,EAAG;EAA1H,UAAA,CACG4rB,KAAU,CAACxrB,MAAMyrB,KAASpjB,KACzB,kBAAC,OAAD,EAAK,OAAO;GAAE,UAAU;GAAY,OAAO;GAAG,GAAIA,KAAO,EAAE,YAAYojB,EAAM;EAAG,EAAI,CAAA,IAEpF,kBAAA9yB,GAAA,EAAA,UAAA,CACG0P,KACC,kBAAC,OAAD,EACE,OAAO;GACL,UAAU;GACV,OAAO;GACP,GAAGA;GACH,UAAUmjB,IAAS,KAAA,IAAY,SAASvnB,EAAE;GAC1C,WAAWqnB,IAAU,SAAStO,EAAI,QAAQ,KAAK,EAAE,IAAIA,EAAI,QAAQ,KAAK,EAAE,KAAK,KAAA;EAC/E,EACD,CAAA,IAEDyO,KAASzrB,MACT,kBAAC,OAAD;GAAK,OAAOF;GAAG,QAAQC;GAAG,SAAS,OAAOD,EAAE,GAAGC;GAAK,OAAO;IAAE,UAAU;IAAY,MAAM;IAAG,KAAK;IAAG,UAAU;GAAU;GAAxH,UAAA,CACGC,MAAMA,EAAE,QAAQA,EAAE,SACjB,kBAAC,QAAD,EAAA,UAAA,CACGA,EAAE,QAAQ,kBAACirB,IAAD;IAAQ,IAAI,IAAI3f;IAAS;GAAI,CAAA,GACvCtL,EAAE,QAAQ,kBAACirB,IAAD;IAAQ,IAAI,IAAI3f;IAAS;GAAI,CAAA,CACpC,EAAA,CAAA,GAER,kBAAC,QAAD;IACK;IACH,WAAWigB;IACX,MAAME,KAAS;IACf,UAAS;IACT,QAAQzrB,GAAG,KAAK;IAChB,aAAaA,GAAG;IAChB,iBAAiBA,GAAG;IACpB,gBAAe;IACf,aAAaA,GAAG,OAAO,SAASsL,EAAG,KAAK,KAAA;IACxC,WAAWtL,GAAG,OAAO,SAASsL,EAAG,KAAK,KAAA;GACvC,CAAA,CACE;EAEP,CAAA,CAAA,EAAA,CAAA,GAEHiU,KAAWA,EAAQ,QAAQ3f,EAAG,MAAM,kBAACirB,IAAD;GAAU,MAAMtL,EAAQ;GAAM,MAAMA,EAAQ;EAAO,CAAA,IAAI3f,EAAG,QAAQ,kBAACirB,IAAD,EAAU,MAAMjrB,EAAG,KAAO,CAAA,CAC9H;;AAET;AAEA,SAAS8rB,GAAQ,EAAE,OAAI,WAAQ,WAAuF;CACpH,IAAMhrB,IAAMD,GAAYM,GAAQnB,EAAG,QAAQkB,CAAI,GACzC,EAAE,WAAQlB,GACVyT,IAAuB;EAAE,GAAGoX,GAASzN,CAAG;EAAG,UAAU;CAAS,GAC9D2O,IAAM/rB,EAAG;CAGf,AAFIA,EAAG,SAAS,YAAW,EAAM,eAAe,QACvCA,EAAG,SAAS,gBAAa,EAAM,eAAe,KAAK,IAAIod,EAAI,GAAGA,EAAI,CAAC,IAAI,QAC5Epd,EAAG,WAAQ,EAAM,UAAU,GAAGA,EAAG,OAAO,EAAE,WAAWA,EAAG,OAAO;CACnE,IAAI+T,IAAqB;EAAE,UAAU;EAAY,MAAM;EAAG,KAAK;EAAG,OAAO;EAAQ,QAAQ;CAAO;CAChG,IAAI/T,EAAG,MAAM;EACX,IAAM,CAAC6R,GAAGxV,GAAG,GAAGsK,KAAK3G,EAAG,MAClBgsB,IAAK5O,EAAI,IAAI,KAAK,IAAI,KAAM,IAAIvL,IAAI,CAAC,GACrCoa,IAAK7O,EAAI,IAAI,KAAK,IAAI,KAAM,IAAI/gB,IAAIsK,CAAC;EAC3C,IAAM;GAAE,UAAU;GAAY,MAAM,CAACkL,IAAIma;GAAI,KAAK,CAAC3vB,IAAI4vB;GAAI,OAAOD;GAAI,QAAQC;EAAG;CACnF;CACA,IAAMN,IAAOvO,EAAI,SAASA,EAAI,QAAQ,SAASA,EAAI,QAAQ,KAAK,EAAE,IAAIA,EAAI,QAAQ,KAAK,EAAE,KAAK,KAAA;CAE9F,OADIuO,MAAM,EAAI,YAAYA,IAExB,kBAAC,OAAD;EAAK,WAAU;EAAe;EAAO,YAAUI;EAA/C,UAAA,CACGjrB,KAAOA,MAAQ,gBACd,kBAAC,OAAD;GAAK,KAAKA;GAAK,KAAI;GAAG,OAAOiT;GAAK,WAAW;EAAQ,CAAA,IACnDjT,MAAQ,gBACV,kBAAC,OAAD;GAAK,WAAU;GAAQ,OAAO;IAAE,OAAO;IAAQ,QAAQ;GAAO;GAA9D,UAAA,CACGd,EAAG,QAAQ,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,YAAY,GAAE,QACzC;EACH,CAAA,IAAA,MACHA,EAAG,SAAS,kBAAC,OAAD;GAAK,WAAU;GAAQ,OAAO;IAAE,UAAU;IAAY,OAAO;IAAG,QAAQ;IAAG,SAAS;IAAW,QAAQ;IAAG,YAAY;IAAkB,OAAO;GAAO;GAAG,UAAA;EAAY,CAAA,CAC/K;;AAET;AAEA,IAAMksB,MAAa,MAA2B9rB,IAAI,GAAG,KAAK,IAAI,GAAGA,EAAE,CAAC,EAAE,WAAWA,EAAE,MAAM,KAAA;AAEzF,SAAS+rB,GAAS,EAAE,SAAM,WAAQ,SAAM,QAAwE;CAC9G,IAAMpB,IAAOD,GAAW3pB,GAAQqM,EAAK,MAAMtM,CAAI;CAC/C,OACE,kBAAC,MAAD;EACE,SAASsM,EAAK,UAAU,IAAIA,EAAK,UAAU,KAAA;EAC3C,SAASA,EAAK,UAAU,IAAIA,EAAK,UAAU,KAAA;EAC3C,OAAO;GAAE,GAAIud,KAAQ,CAAC;GAAI,YAAYmB,GAAU1e,EAAK,EAAE;GAAG,aAAa0e,GAAU1e,EAAK,EAAE;GAAG,WAAW0e,GAAU1e,EAAK,EAAE;GAAG,cAAc0e,GAAU1e,EAAK,EAAE;GAAG,QAAQrN;EAAE;EAErK,UAAAqN,EAAK,QAAQ,kBAACyd,IAAD;GAAU,MAAMzd,EAAK;GAAM,MAAA;EAAM,CAAA;CAC7C,CAAA;AAER;AAEA,SAAS4e,GAAU,EAAE,OAAI,WAAQ,WAAyF;CACxH,OACE,kBAAC,OAAD;EAAK,WAAU;EAAQ,OAAO;GAAE,GAAGvB,GAAS7qB,EAAG,GAAG;GAAG,QAAQ;EAAO;EAAG,YAAUA,EAAG;EAClF,UAAA,kBAAC,SAAD;GAAO,WAAU;GAAjB,UAAA,CACE,kBAAC,YAAD,EAAA,UACGA,EAAG,KAAK,KAAK,GAAG,MACf,kBAAC,OAAD,EAAa,OAAO,EAAE,OAAOE,EAAE,EAAI,GAAzBrD,CAAyB,CACpC,EACO,CAAA,GACV,kBAAC,SAAD,EAAA,UACGmD,EAAG,KAAK,KAAK,GAAG,MACf,kBAAC,MAAD,EAAA,UACG4C,EAAE,MAAM,KAAK,GAAG,MAAQ+C,EAAE,SAAS,OAAO,kBAACwmB,IAAD;IAAmB,MAAMxmB;IAAW;IAAc;IAAM,GAAG/C,EAAE;GAAI,GAAlDmM,CAAkD,CAAE,EAC5G,GAFKxB,CAEL,CACL,EACI,CAAA,CACF;;CACJ,CAAA;AAET;AAEA,SAAS8e,GAAO,EAAE,OAAI,WAAQ,SAAM,cAA2F;CAC7H,QAAQrsB,EAAG,GAAX;EACE,KAAK,SACH,OAAO,kBAACsrB,IAAD;GAAe;GAAY;GAAc;GAAe;EAAU,CAAA;EAC3E,KAAK,OACH,OAAO,kBAACQ,IAAD;GAAa;GAAY;GAAc;EAAO,CAAA;EACvD,KAAK,SACH,OAAO,kBAACM,IAAD;GAAe;GAAY;GAAc;EAAO,CAAA;EACzD,KAAK,eACH,OACE,kBAAC,OAAD;GAAK,WAAU;GAAc,OAAO;IAAE,GAAGvB,GAAS7qB,EAAG,GAAG;IAAG,SAAS;GAAO;GAAG,YAAUA,EAAG;GACxF,UAAAA,EAAG;EACD,CAAA;CAEX;AACF;AAaA,IAAassB,KAAYnU,EAAK,SAAmB,EAAE,UAAO,WAAQ,UAAO,UAAO,IAAM,YAAS,cAA2B;CACxH,IAAM5L,IAAKue,GAAW3pB,GAAQorB,EAAM,IAAIrrB,CAAI;CAC5C,OACE,kBAAC,OAAD;EAAK,WAAWqrB,EAAM,SAAS,6BAA6B;EAAY,OAAO;GAAE,OAAOA,EAAM,IAAIjZ;GAAO,QAAQiZ,EAAM,IAAIjZ;EAAM;EAC/H,UAAA,kBAAC,OAAD;GAAK,WAAU;GAAiB,OAAO;IAAE,OAAOiZ,EAAM;IAAG,QAAQA,EAAM;IAAG,WAAW,SAASjZ,EAAM;IAAI,YAAY;IAAQ,GAAI/G,KAAM,CAAC;GAAG;GAA1I,UAAA,CACGggB,EAAM,IAAI,KAAK,GAAI,MAClB,kBAACF,IAAD;IAAoB;IAAY;IAAc;IAAe;GAAU,GAA1DxvB,CAA0D,CACxE,GACA2vB,CACE;;CACF,CAAA;AAET,CAAC,GCpSKC,qBAAS,IAAI,QAAoC;AAEvD,SAASC,GAAS,GAAoC;CACpD,IAAI/mB,IAAI8mB,GAAO,IAAItrB,CAAM;CAEzB,OADKwE,KAAG8mB,GAAO,IAAItrB,GAAS,IAAI;EAAE,wBAAQ,IAAI,IAAI;EAAG,yBAAS,IAAI,IAAI;EAAG,2BAAW,IAAI,IAAI;CAAE,CAAE,GACzFwE;AACT;AAGA,SAASgnB,GAAS,GAAwB,GAAe,GAAe;CACtE,IAAMhnB,IAAI+mB,GAASvrB,CAAM;CACzB,EAAE,OAAO,IAAIue,GAAOtY,CAAC;CACrB,KAAK,IAAM0C,KAAMnE,EAAE,UAAU,IAAI+Z,CAAK,KAAK,CAAC,GAAG,EAAGtY,CAAC;AACrD;AAGA,SAASwlB,GAAY,GAAwB;CAC3C,IAAMjnB,IAAI+mB,GAASvrB,CAAM;CAEzB,AADAwE,EAAE,OAAO,MAAM,GACfA,EAAE,QAAQ,MAAM;AAClB;AAEA,SAAgBknB,GAAS,GAAwB,GAA2D;CAC1G,IAAM5uB,IAAQyuB,GAASvrB,CAAM,GACvB,CAACorB,GAAOO,KAAY/sB,QAA2D9B,EAAM,OAAO,IAAIyhB,CAAK,CAAC;CAgC5G,OA/BAvgB,QAAgB;EACd,IAAIgG,IAAMlH,EAAM,UAAU,IAAIyhB,CAAK;EACnC,AAAKva,KAAKlH,EAAM,UAAU,IAAIyhB,GAAQ,oBAAM,IAAI,IAAI,CAAE;EACtD,IAAM5V,KAAM,MAAkBgjB,EAAS1lB,CAAC;EAExC,OADAjC,EAAI,IAAI2E,CAAE,SACG;GACX,EAAK,OAAOA,CAAE;EAChB;CACF,GAAG,CAAC7L,GAAOyhB,CAAK,CAAC,GACjBvgB,QAAgB;EACd,IAAM4tB,IAAM9uB,EAAM,OAAO,IAAIyhB,CAAK;EAClC,IAAIqN,GAAK,OAAOD,EAASC,CAAG;EAC5B,IAAI7rB,IAAO,IACPP,IAAI1C,EAAM,QAAQ,IAAIyhB,CAAK;EAc/B,OAbK/e,MACH,IAAIQ,EAAO,KAAK,cAAcue,CAAK,GACnCzhB,EAAM,QAAQ,IAAIyhB,GAAO/e,CAAC,GAC1BA,EAAE,MAAM,MAAM;GAGZ,AAFA1C,EAAM,OAAO,IAAIyhB,GAAOtY,CAAC,GACzBnJ,EAAM,QAAQ,OAAOyhB,CAAK,GACtBzhB,EAAM,OAAO,OAAO,OAAKA,EAAM,OAAO,OAAOA,EAAM,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAe;EAC7F,SAASA,EAAM,QAAQ,OAAOyhB,CAAK,CAAC,IAEtC/e,EAAE,MACC,MAAMO,KAAQ4rB,EAAS1lB,CAAC,IACxB,MAAMlG,KAAQ4rB,EAAS,EAAE,OAAQ,EAAY,QAAQ,CAAC,CACzD,SACa;GACX,IAAO;EACT;CACF,GAAG;EAAC3rB;EAAQlD;EAAOyhB;CAAK,CAAC,GAClB6M;AACT;AAEA,SAAgB5C,GAAU,GAAqJ;CAC7K,IAAM,EAAE,WAAQ,UAAO,SAAM,UAAO,SAAM,YAAS,eAAY7mB,GACzDypB,IAAQM,GAAS1rB,GAAQue,CAAK;CASpC,OARK6M,IACD,WAAWA,IAEX,kBAAC,OAAD;EAAK,WAAU;EAAiB,OAAO;GAAE,OAAOnT,EAAK,IAAI9F;GAAO,QAAQ8F,EAAK,IAAI9F;GAAO,SAAS;EAAO;EACrG,UAAAiZ,EAAM;CACJ,CAAA,IAGF,kBAACD,IAAD;EAAkB;EAAe;EAAe;EAAa;EAAe;EAAkB;CAAU,CAAA,IAR5F,kBAAC,OAAD;EAAK,WAAU;EAAW,OAAO;GAAE,OAAOlT,EAAK,IAAI9F;GAAO,QAAQ8F,EAAK,IAAI9F;GAAO,YAAY;EAAO;CAAI,CAAA;AAS9H;AAGA,IAAM0Z,KAAsB;CAAC;CAAM;CAAK;CAAM;CAAK;CAAM;CAAK;CAAM;AAAG;AAEvE,SAASC,GAAM,GAA+B,GAA8B;CAC1E,IAAMC,IAAMX,GAAO,IAAI,QAAQ,MAAM,EAAE,QAAQR,CAAG,KAAK,CAAC;CACxD,IAAI,CAACmB,EAAI,QAAQ;CACjB,IAAMvO,IAAK,KAAK,IAAI,GAAGuO,EAAI,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,GACxCtO,IAAK,KAAK,IAAI,GAAGsO,EAAI,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,GACxCC,IAAK,KAAK,IAAI,GAAGD,EAAI,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,GAClDE,IAAK,KAAK,IAAI,GAAGF,EAAI,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC;CACxD,OAAO;EAAE,GAAGvO;EAAI,GAAGC;EAAI,GAAGuO,IAAKxO;EAAI,GAAGyO,IAAKxO;EAAI,KAAKsO,EAAI,WAAW,IAAIA,EAAI,EAAE,CAAC,IAAI,MAAM,KAAA;CAAU;AACpG;AAEA,SAASG,GAAQ,GAAQ,GAAgB,GAAY,GAAY,GAAoB;CACnF,IAAIC,MAAS,QAAQ,OAAO;EAAE,GAAG3mB;EAAG,GAAGA,EAAE,IAAIjE;EAAI,GAAGiE,EAAE,IAAIuY;CAAG;CAC7D,IAAI,EAAE,MAAG,MAAG,MAAG,SAAMvY;CAWrB,IAVI2mB,EAAK,SAAS,GAAG,MAAG,KAAK5qB,IACzB4qB,EAAK,SAAS,GAAG,MAAG,KAAKpO,IACzBoO,EAAK,SAAS,GAAG,MACnB,KAAK5qB,GACL,KAAKA,IAEH4qB,EAAK,SAAS,GAAG,MACnB,KAAKpO,GACL,KAAKA,IAEH1c,KAAQ8qB,EAAK,WAAW,KAAK3mB,EAAE,KAAKA,EAAE,GAAG;EAC3C,IAAMvC,IAAI,KAAK,IAAIlE,IAAIyG,EAAE,GAAGxG,IAAIwG,EAAE,CAAC,GAC7BqN,IAAKrN,EAAE,IAAIvC,GACX6P,IAAKtN,EAAE,IAAIvC;EAIjB,AAHIkpB,EAAK,SAAS,GAAG,MAAG,IAAI3mB,EAAE,IAAIA,EAAE,IAAIqN,IACpCsZ,EAAK,SAAS,GAAG,MAAG,IAAI3mB,EAAE,IAAIA,EAAE,IAAIsN,IACxC,IAAID,GACJ,IAAIC;CACN;CACA,OAAO;EAAE,GAAGtN;EAAG;EAAG;EAAG,GAAG,KAAK,IAAI,GAAGzG,CAAC;EAAG,GAAG,KAAK,IAAI,GAAGC,CAAC;CAAE;AAC5D;AAEA,SAASotB,GAAU,EAAE,QAAK,UAAO,eAA+F;CAC9H,IAAM3R,IAAK,IAAItI,GACT3X,IAA0C;EAAE,IAAI,CAAC,GAAG,CAAC;EAAG,GAAG,CAAC,IAAK,CAAC;EAAG,IAAI,CAAC,GAAG,CAAC;EAAG,GAAG,CAAC,GAAG,EAAG;EAAG,IAAI,CAAC,GAAG,CAAC;EAAG,GAAG,CAAC,IAAK,CAAC;EAAG,IAAI,CAAC,GAAG,CAAC;EAAG,GAAG,CAAC,GAAG,EAAG;EAAG,MAAM,CAAC,GAAG,CAAC;CAAE;CACnK,OACE,kBAAC,OAAD;EAAK,WAAU;EAAe,OAAO;GAAE,MAAMyhB,EAAI;GAAG,KAAKA,EAAI;GAAG,OAAOA,EAAI;GAAG,QAAQA,EAAI;GAAG,aAAa,MAAM9J;GAAO,WAAW8J,EAAI,MAAM,UAAUA,EAAI,IAAI,QAAQ,KAAA;EAAU;EAC7K,UAAA4P,GAAQ,KAAK,MACZ,kBAAC,OAAD;GAEE,WAAW,kBAAkB5lB;GAC7B,OAAO;IAAE,OAAOwU;IAAI,QAAQA;IAAI,MAAMjgB,EAAIyL,EAAE,CAAC,KAAKgW,EAAI,IAAIxB,IAAK;IAAG,KAAKjgB,EAAIyL,EAAE,CAAC,KAAKgW,EAAI,IAAIxB,IAAK;IAAG,aAAa,IAAItI;GAAM;GAC1H,cAAc,MAAM;IAGlB,AAFA,EAAE,gBAAgB,GAClB,EAAE,eAAe,GACjBka,EAASpmB,GAAG,CAAC;GACf;EACD,GARMA,CAQN,CACF;CACE,CAAA;AAET;AASA,IAAMqmB,KAAM,IACNC,KAAM;AAGZ,SAAgBC,GAAS,EAAE,WAAQ,aAAU,iBAAc,OAAO,gBAAa,MAAuB;CACpG,IAAMzU,IAAS1P,GAAU,GACnB4P,IAAOjY,EAAO,KAAK;CACzB,GAAW;EACT,WAAW,YAAY;GACrB,IAAMiG,IAAIjG,EAAO,KAAK,MAEhBgG,IAAM,MAAM,QAAQ,IAAIC,EAAE,OAAO,KAAK,MAAMjG,EAAO,KAAK,cAAcf,EAAE,KAAK,CAAC,CAAC,GAC/EwtB,IAAQzmB,EAAI,QAAQ,MAAM,CAAC/G,EAAE,MAAM,GACnC0W,IAAS8W,EAAM,SAASA,IAAQzmB;GACtC,OAAO;IACL,MAAM,GAAGC,EAAE,EAAE,KAAKA,EAAE,EAAE;IACtB,QAAQ;IACR,MAAM0P,EAAO,KAAK,MAChB,kBAAC,OAAD;KAAuB,WAAU;KAAgB,OAAO;MAAE,OAAO1P,EAAE;MAAG,QAAQA,EAAE;KAAE;KAChF,UAAA,kBAACklB,IAAD;MAAW,OAAO;OAAE,GAAGC;OAAO,QAAQ;MAAM;MAAW;MAAQ,OAAO;KAAI,CAAA;IACvE,GAFKA,EAAM,KAEX,CACN;GACH;EACF;EACA,MAAM,YAAY;GAChB,IAAMnlB,IAAIjG,EAAO,KAAK;GACtB,OAAO0V,GAAa,MAAM,QAAQ,IAAIzP,EAAE,OAAO,KAAK,MAAMjG,EAAO,KAAK,cAAcf,EAAE,KAAK,CAAC,CAAC,CAAC;EAChG;EACA,aAAa;GACX,IAAMgH,IAAIjG,EAAO,KAAK;GACtB,OAAO,CACL,CAAC,UAAUiG,EAAE,MAAM,eAAe,CAAC,GACnC,CAAC,cAAc,GAAG,EAAEA,EAAE,IAAI,GAAA,CAAI,QAAQ,CAAC,EAAE,KAAK,EAAEA,EAAE,IAAI,GAAA,CAAI,QAAQ,CAAC,EAAE,IAAI,CAC3E;EACF;CACF,CAAC;CACD,IAAM,CAACymB,GAASC,KAAYpuB,GAAwB,GAC9C,CAAC+Z,GAAW5Z,KAAQH,GAAwB,GAC5Cga,IAASpZ,GAAUmZ,CAAS,GAC5BsU,IAAWnuB,EAAuB,IAAI,GACtCouB,IAAc1tB,GAAUytB,CAAQ,GAChC,CAACrjB,GAAM6O,KAAWxZ,EAAeyZ,CAAW,GAC5CyU,IAAaC,KAAcJ,EAAS,KAAK,OAAO1U,EAAK,QAAQ,GAC7D,GAAG7Z,KAAQF,GAAe,GAC1BwV,IAAS+E,SAAc,IAAI8O,GAAWvnB,CAAM,GAAG,CAACA,CAAM,CAAC,GACvDgtB,IAAUvuB,EAAwC,IAAI,GACtDwuB,IAAWxuB,EAA8B,IAAI,GAC7CyuB,IAAYzuB,EAAuB,IAAI,GACvC,CAAC0uB,GAAUC,KAAexuB,EAAgD,IAAI,GAC9E,CAACyuB,GAAMC,MAAW1uB,EAAkK,IAAI,GACxL,CAAC2uB,IAAWC,MAAgB5uB,EAAS,CAAC,GACtC,CAAC6uB,IAAYC,KAAiB9uB,EAAwB,IAAI,GAC1D,CAACia,GAASC,MAAcla,EAA6D,IAAI,GAEzF,CAAC+uB,IAAWC,MAAgBhvB,EAAS,CAAC,GAEtCivB,IAAOnvB,EAAK,KAAKA,EAAK,IAAI,MAAWuZ,EAAK,IAAI,GAC9C6V,KAAOpvB,EAAK,KAAKA,EAAK,IAAI,MAAWuZ,EAAK,IAAI,GAC9CnT,IAAM,KAAK,IAAI,IAAK,KAAK,IAAI+oB,GAAM,KAAK,IAAIC,IAAMD,IAAO,EAAG,GAAG,CAAC,CAAC,GACjE1b,IAAQ5I,MAAS,QAAQzE,IAAMyE,GAC/BwkB,KAAS9V,EAAK,IAAI9F,GAClB6b,KAAS/V,EAAK,IAAI9F,GAClB8b,IAAQF,KAASxB,IACjBpR,KAAS,KAAUlD,EAAK,QAAQgW,IAAQ1B,IACxCnR,IAAS,KAAK,IAAI1c,EAAK,GAAGsvB,KAAS,EAAO,GAC1Cpf,KAAO,KAAK,IAAI0d,KAAMlR,IAAS4S,MAAU,CAAC,GAC1CliB,KAAQ,KAAK,IAAI,GAAG,KAAK,OAAOyM,EAAO,IAAI+T,MAAO2B,CAAK,IAAI,CAAC,GAC5DliB,KAAO,KAAK,IAAIkM,EAAK,QAAQ,GAAG,KAAK,OAAOM,EAAO,IAAI7Z,EAAK,KAAKuvB,CAAK,IAAI,CAAC,GAC3ErrB,IAAU,KAAK,IAAIqV,EAAK,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,OAAOM,EAAO,IAAI7Z,EAAK,IAAI,IAAI4tB,MAAO2B,CAAK,CAAC,CAAC,GAGjGC,IAAU,MAAgBjW,EAAK,GAC/BkW,KAAKlW,EAAK,IAAIiW,GACdE,KAASD,KAAK,IACdE,IAAS,KAAK,IAAI,GAAG,KAAK,MAAMxB,EAAY,IAAIuB,EAAM,IAAI,CAAC,GAC3DE,IAAQ,KAAK,IAAIrW,EAAK,QAAQ,GAAG,KAAK,OAAO4U,EAAY,IAAInuB,EAAK,KAAK0vB,EAAM,IAAI,CAAC;CAqCxF,AAlCApwB,QAAgB;EACd,IAAMa,IAAK+tB,EAAS;EACpB,IAAI,CAAC/tB,GAAI;EACT,IAAM4K,IAAI,KAAK7G,IAAUwrB;EACzB,CAAI3kB,IAAI5K,EAAG,aAAa4K,IAAI0kB,KAAKtvB,EAAG,YAAYA,EAAG,kBAAc,EAAG,YAAY4K,IAAI5K,EAAG,eAAe,IAAIsvB,KAAK;CACjH,GAAG;EAACvrB;EAASwrB;EAAQD;CAAE,CAAC,GAGxBnwB,QAAgB;EAId,AAHA,EAAO,WAAWI,GAClB,EAAO,gBAAgB2Z,EAAO,SAAS,EAAI,GAC3C,EAAO,eAAe,GAAO,MAAMyT,GAASxrB,GAAQujB,GAAOtd,CAAC,GAC5D,EAAO,YAAY,OACZ,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,YAAY,MAAM,OACtD8R,EAAY,KAAK,GACV,MAEL,EAAE,QAAQ,aACZwW,GAAY,GACL;CAIb,CAAC,GACDvwB,SACO+Z,EAAO,YAAUwW,GAAY,SACrB7a,EAAO,IAAI,IAEvB,CAACqE,EAAO,QAAQ,CAAC,GAGpB/Z,QAAgB,KAAK4C,GAAW0X,EAAU,OAAO,GAAG,CAAC,CAAC,GAGtD5P,SAAmB;EACjB,IAAMvF,IAAOuQ,EAAO,SAASuZ,EAAS,UAAUC,EAAU;EAC1D,AAAI/pB,KAAMrJ,GAAOqJ,CAAI,CAAC,EAAE,kBAAkBA,CAAI;CAChD,CAAC;CAED,IAAMorB,WAAoB;EACxB,AAAK7a,EAAO,WACZA,EAAO,IAAI,GACPuZ,EAAS,WAASnzB,GAAOmzB,EAAS,OAAO,CAAC,EAAE,gBAAgB,GAEhE3U,EAAU,SAAS,MAAM,EAAE,eAAe,GAAK,CAAC,GAChDla,EAAK;CACP,GAGMowB,KAAU/vB,EAAO8vB,EAAW;CAclC,AAbA,GAAQ,UAAUA,IAClBvwB,QAAgB7E,EAAa6G,GAAQ,QAAQ,EAAE,kBAAkBwuB,GAAQ,QAAQ,EAAE,CAAC,GAAG,CAACxuB,CAAM,CAAC,GAC/FhC,QAEIgC,EAAO,GAAG,gBAAgB,MAAM;EAC9B,AAAIyB,EAAE,QACJgqB,GAAYzrB,CAAM,GAClBotB,EAAY,IAAI,GAChBI,IAAc,MAAMhtB,IAAI,CAAC,KAChBiB,EAAE,UAAU,KAAA,KAAaA,EAAE,SAAO+pB,GAASxrB,GAAQyB,EAAE,OAAOA,EAAE,KAAK;CAChF,CAAC,GACH,CAACzB,CAAM,CACT,GACAhC,QAAgB/E,EAAa+G,GAAQ;EAAE,OAAOmtB,GAAU,SAASvqB;EAAS,KAAKuqB,GAAU;CAAI,CAAC,GAAG;EAACntB;EAAQmtB,GAAU;EAAOA,GAAU;EAAKvqB;CAAO,CAAC;CAElJ,IAAM4b,KACJ9K,EAAO,UAAUA,EAAO,KAAK,IACzB;EACE,KAAKA,EAAO;EACZ,MAAMA,EAAO,KAAK;EAClB,MAAM,EACJ,OAAO,MAAO;GAEZ,AADA,EAAS,UAAU7U,GACfA,KAAI6U,EAAO,MAAM,OAAO7U,CAAE;EAChC,EACF;CACF,IACA,KAAA;CAEN,SAAyB;EACvB,IAAMsE,IAAO8pB,EAAS;EACtB,IAAI,CAACvZ,EAAO,UAAU,CAACvQ,GAAM;EAC7B,IAAI6pB,EAAQ,SAAS;GACnB,IAAM,EAAE,MAAG,SAAMA,EAAQ;GAEzB,AADA,EAAQ,UAAU,MAClB7pB,EAAK,MAAM,EAAE,eAAe,GAAK,CAAC;GAClC,IAAMD,IAAIC,EAAK,eACT3I,IAAM0I,EAAE,yBAAyB5E,GAAGmL,CAAC,GACrCsS,IAAQvhB,IAAM,OAAO0I,EAAE,sBAAsB5E,GAAGmL,CAAC,GACjDmC,IAAOpR,GAAK,cAAcuhB,GAAO,gBACjC0S,IAAMj0B,GAAK,UAAUuhB,GAAO,eAAe,GAC3C9c,IAAInF,GAAOqJ,CAAI;GAMrB,AALIyI,KAAQzI,EAAK,SAASyI,CAAI,IAAG3M,GAAG,SAAS2M,GAAM6iB,CAAG,KAEpDxvB,GAAG,kBAAkBkE,CAAI,GACzBlE,GAAG,cAAc,IAEnB,EAAO,MAAM,UAAUyU,EAAO,MAAM,QAAQ;GAC5C;EACF;EACA,IAAMjR,IAAMiR,EAAO;EACnB,AAAIjR,MACF,EAAO,aAAa,MACpBiR,EAAO,MAAM,QAAQjR,CAAG;CAE5B,CAAC;CAED,IAAMisB,KAAW,MAAcnD,GAASvrB,CAAM,CAAC,CAAC,OAAO,IAAItE,CAAC,GAEtDizB,KAAa,GAAe,GAAa,GAAW,MAAc;EACtE,IAAM9vB,IAAK6vB,EAAQnQ,CAAK,CAAC,EAAE,IAAI,MAAM,MAAM,EAAE,MAAM,WAAW,EAAE,QAAQiJ,CAAG;EAC3E,AAAK3oB,KAAMA,EAAG,MAAM,WAAYA,EAAG,SACnC6U,EAAO,MAAM6K,GAAOiJ,GAAK3oB,EAAG,IAAI,GAChC,EAAQ,UAAU;GAAE;GAAG;EAAE,GACzBT,EAAK;CACP,GAEMwwB,MAAoB,GAAe,MAAwB;EAC/D,IAAI,CAAC7W,EAAO,YAAYxd,EAAE,WAAW,GAAG;EACxC,IAAMW,IAAIX,EAAE;EACZ,IAAImZ,EAAO,UAAUuZ,EAAS,SAAS,SAAS/xB,CAAC,GAAG;EACpD,IAAM2zB,IAAQ3zB,EAAE,QAAQ,YAAY,GAC9B0vB,IAAMiE,IAAQ,OAAOA,EAAM,QAAQ,GAAG,IAAI;EAEhD,IADAN,GAAY,GACR,CAACM,KAAS,OAAO,MAAMjE,CAAG,GAAG;GAC/B,EAAY,IAAI;GAChB;EACF;EAEA,AADArwB,EAAE,eAAe,GACjB+d,EAAU,SAAS,MAAM,EAAE,eAAe,GAAK,CAAC;EAChD,IAAM2D,IAAM6P,GAAM4C,EAAQnQ,CAAK,GAAGqM,CAAG;EAErC,IADAwC,EAAY;GAAE,OAAO7O;GAAO;EAAI,CAAC,GAC7B,CAACtC,GAAK;EACV,IAAM6S,IAAQ5zB,EAAE,QAAQ,YAAY;EACpC,GAAQ;GAAE,OAAOqjB;GAAO;GAAK,MAAM;GAAQ,IAAIhkB,EAAE;GAAS,IAAIA,EAAE;GAAS;GAAK,KAAK0hB;GAAK,OAAO;GAAO,KAAK6S,IAAQ,OAAOA,EAAM,QAAQ,GAAG,IAAI,KAAA;GAAW,IAAIv0B,EAAE;GAAS,IAAIA,EAAE;EAAQ,CAAC;CAC1L,GAEMw0B,KAAY,OAAO,GAAe,GAAgB,IAAY,OAAU;EAC5E,IAAI;GACF,IAAM9oB,IAAI,MAAMjG,EAAO,KAAK,eAAeujB,GAAO9a,CAAG;GAIrD,IAHA+iB,GAASxrB,GAAQujB,GAAOtd,CAAC,GACzB8R,EAAO,SAAS,EAAI,GACpB6V,IAAc,MAAM1qB,IAAI,CAAC,GACrB8rB,GAAW;IACb,IAAMhU,IAAO/U,EAAE,IAAI,KAAK,MAAM3H,EAAE,OAAO,EAAE;IACzC,EAAY;KAAE;KAAO,KAAK,KAAK,IAAI,GAAG0c,CAAI;IAAE,CAAC;GAC/C;GACA,OAAO/U;EACT,SAASgpB,GAAK;GACZ,QAAQ,MAAM,mBAAmBA,CAAG;EACtC;CACF;CAEA,QAAgB;EACd,IAAI,CAAC5B,GAAM;EACX,IAAMxP,KAAQ,MAAkB;GAC9B,IAAMtc,KAAM,EAAE,UAAU8rB,EAAK,MAAMlb,GAC7B4L,KAAM,EAAE,UAAUsP,EAAK,MAAMlb,GAC7B+c,IAAQ7B,EAAK,SAAS,KAAK,IAAI,EAAE,UAAUA,EAAK,EAAE,IAAI,KAAK,IAAI,EAAE,UAAUA,EAAK,EAAE,IAAI;GAC5F,GAAQ;IAAE,GAAGA;IAAM;IAAO,KAAK6B,IAAQhD,GAAQmB,EAAK,KAAKA,EAAK,MAAM9rB,GAAIwc,GAAI,EAAE,QAAQ,IAAIsP,EAAK;GAAI,CAAC;EACtG,GACM/vB,UAAW;GACf,IAAM4F,IAAImqB;GAEV,AADAC,GAAQ,IAAI,GACRpqB,EAAE,QAAO6rB,GAAe7rB,EAAE,OAAO,CAAC;IAAE,IAAI;IAAQ,KAAKA,EAAE;IAAK,KAAKA,EAAE;GAAI,CAAC,CAAC,IAEpEA,EAAE,SAAS,UAAUA,EAAE,QAAQ,KAAA,KAAWyrB,EAAUzrB,EAAE,OAAOA,EAAE,KAAKA,EAAE,IAAIA,EAAE,EAAE;EACzF;EAGA,OAFA,OAAO,iBAAiB,aAAa2a,CAAI,GACzC,OAAO,iBAAiB,WAAWvgB,GAAI,EAAE,MAAM,GAAK,CAAC,SACxC;GAEX,AADA,OAAO,oBAAoB,aAAaugB,CAAI,GAC5C,OAAO,oBAAoB,WAAWvgB,CAAE;EAC1C;CACF,CAAC;CAED,IAAM6xB,KAAS,OAAO,GAAiB,MAAgB;EACrD,IAAM5L,IAAQ5mB,KAAMwwB,GAAU,SAASvqB,GACjC7D,IAAImS,MAAS,SAAS+G,EAAK,IAAI,KAAM/G,MAAS,SAAS+G,EAAK,IAAI,MAAOA,EAAK,IAAI,IAChFjZ,IAAIkS,MAAS,SAAS+G,EAAK,IAAI,KAAM/G,MAAS,SAAS,IAAI+G,EAAK,IAAI,IACtEgE,IAAW;GAAE,IAAIhE,EAAK,IAAIlZ,KAAK;GAAG,IAAIkZ,EAAK,IAAIjZ,KAAK;GAAG;GAAG;EAAE,GAC5DowB;EACJ,IAAIle,MAAS,SAAS;GACpB,IAAM,CAAC3T,KAAK,MAAMuK,GAAU,WAAW,EAAK;GAC5C,IAAI,CAACvK,GAAG;GACR,IAAM,MAAMyC,EAAO,KAAK,cAAcujB,GAAO,MAAMhmB,EAAE,YAAY,IAAIA,EAAE,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM,MAAA,CAAO,QAAQ,WAAW,KAAK,CAAC;GAC7H,IAAM0U,IAAO,MAAM,IAAI,SAAmC,MAAQ;IAChE,IAAMW,IAAM,IAAI,MAAM;IAGtB,AAFA,EAAI,eAAexC,EAAI;KAAE,GAAGwC,EAAI;KAAc,GAAGA,EAAI;IAAc,CAAC,GACpE,EAAI,gBAAgBxC,EAAI;KAAE,GAAG;KAAK,GAAG;IAAI,CAAC,GAC1C,EAAI,MAAM,IAAI,gBAAgB7S,CAAC;GACjC,CAAC,GACK0F,IAAI,KAAK,IAAI,GAAIgV,EAAK,IAAI,KAAOhG,EAAK,GAAIgG,EAAK,IAAI,KAAOhG,EAAK,CAAC;GACtE,IAAM;IAAE,IAAIgG,EAAK,IAAIhG,EAAK,IAAIhP,KAAK;IAAG,IAAIgV,EAAK,IAAIhG,EAAK,IAAIhP,KAAK;IAAG,GAAGgP,EAAK,IAAIhP;IAAG,GAAGgP,EAAK,IAAIhP;GAAE;EACnG;EACA,IAAMgD,IAAI,MAAM8oB,GAAUxL,GAAO,CAAC;GAAE,IAAI;GAAU;GAAM;GAAK;GAAK,MAAMrS,MAAS,SAAS,SAAS,KAAA;EAAU,CAAC,GAAG,EAAI;EAGrH,IADAoH,EAAU,SAAS,MAAM,EAAE,eAAe,GAAK,CAAC,GAC5CrS,KAAKiL,MAAS,QAAQ;GACxB,IAAMrS,IAAKoH,EAAE,IAAIA,EAAE,IAAI,SAAS;GAChC,AAAIpH,GAAI,MAAM,WAAWA,EAAG,QAAQ,KAAA,KAAaA,EAAG,SAClD6U,EAAO,MAAM6P,GAAO1kB,EAAG,KAAKA,EAAG,IAAI,GACnCT,EAAK;EAET;CACF,GAEMixB,KAAc,OAAO,GAAa,MAAkB;EAExD,AADAd,GAAY,GACZnB,EAAY,IAAI;EAChB,IAAM3xB,IAAO,MAAMuE,EAAO,KAAK,eAAemQ,CAAE;EAKhD,AAJA,OAAO,OAAO8H,GAAMxc,CAAI,GACxBgwB,GAAYzrB,CAAM,GAClB+X,EAAO,SAAS,EAAI,GACpByV,IAAc,MAAMhtB,IAAI,CAAC,GACrB8uB,MAAS,KAAA,KAAW,4BAA4B/G,EAAG+G,CAAI,CAAC;CAC9D,GAEMC,KAAa,OAAO,MAAkB;EAC1C,IAAM9tB,IAAI,MAAMzB,EAAO,KAAK,aAAawvB,CAAI;EAC7C,AAAK/tB,MACL+pB,GAASxrB,GAAQyB,EAAE,OAAOA,EAAE,KAAK,GACjCmsB,IAAc,MAAM,KAAK,IAAI,GAAG1qB,KAAKssB,IAAO,IAAI,GAAG,CAAC,GACpDpC,EAAY,IAAI,GAChB7E,EAAG9mB,EAAE,KAAK;CACZ,GAEMguB,MAAY,GAAgB,IAAI7sB,MAAY;EAChD,AAAIsO,MAAS,QAAOme,GAAiB;GAAE,IAAI;GAAO,OAAO3zB;EAAE,GAAGA,IAAI,CAAC,IAC1DwV,MAAS,cAAame,GAAiB;GAAE,IAAI;GAAa,OAAO3zB;EAAE,GAAGA,IAAI,CAAC,IAC3EwV,MAAS,WAAUme,GAAiB;GAAE,IAAI;GAAU,OAAO3zB;EAAE,GAAG,KAAK,IAAI,GAAGA,IAAI,CAAC,CAAC,IAClFwV,MAAS,OAAMxV,IAAI,KAAU2zB,GAAY;GAAE,IAAI;GAAQ,MAAM3zB;GAAG,IAAIA,IAAI;EAAE,GAAGA,IAAI,CAAC,IAClFwV,MAAS,SAAQxV,IAAIuc,EAAK,QAAQ,KAAUoX,GAAY;GAAE,IAAI;GAAQ,MAAM3zB;GAAG,IAAIA,IAAI;EAAE,GAAGA,IAAI,CAAC,IACjGwV,MAAS,UAAQme,GAAiB;GAAE,IAAI;GAAQ,OAAO3zB;GAAG,QAAQ,CAACgzB,EAAQhzB,CAAC,CAAC,EAAE;EAAO,GAAGA,CAAC;CACrG,GAEMg0B,MAAQ,MAAgDjtB,IAAMisB,EAAQjsB,EAAI,KAAK,CAAC,EAAE,IAAI,MAAM,MAAMnE,EAAE,QAAQmE,EAAI,GAAG,IAAI,KAAA,GAEvHktB,KAASlxB,EAAO0uB,CAAQ;CAC9B,GAAO,UAAUA;CACjB,IAAMyC,IAAW;EACf,UAAU,MAAgB;GACxB,IAAMzC,IAAWwC,GAAO;GACxB,AAAIxC,KAAU4B,GAAe5B,EAAS,OAAO,CAAC;IAAE,IAAI;IAAS,KAAKA,EAAS;IAAK;GAAG,CAAC,CAAC;EACvF;EACA,iBAAiB;GACf,IAAMA,IAAWwC,GAAO;GACxB,AAAIxC,KAAU4B,GAAe5B,EAAS,OAAO,CAAC;IAAE,IAAI;IAAa,KAAKA,EAAS;GAAI,CAAC,GAAG,EAAI;EAC7F;EACA,cAAc;GACZ,IAAMA,IAAWwC,GAAO;GAExB,AADIxC,KAAU4B,GAAe5B,EAAS,OAAO,CAAC;IAAE,IAAI;IAAU,KAAKA,EAAS;GAAI,CAAC,CAAC,GAClFC,EAAY,IAAI;EAClB;EACA,SAAS,MAAc;GACrB,IAAMD,IAAWwC,GAAO,SAClB9wB,IAAK6wB,GAAKvC,CAAQ,GAClBlR,IAAMkR,KAAYrB,GAAM4C,EAAQvB,EAAS,KAAK,GAAGA,EAAS,GAAG;GACnE,IAAI,CAACA,KAAY,CAAClR,GAAK;GACvB,IAAMzW,IAAS;IAAE,GAAGyW;IAAK,OAAOpd,GAAI,IAAI;IAAO,OAAOA,GAAI,IAAI;GAAM;GAKpE,AAJIoE,MAAM,OAAM,EAAE,OAAOuC,EAAE,OAAO,KAAK,KAC9BvC,MAAM,QAAO,EAAE,OAAOuC,EAAE,OAAO,KAAK,KACpCvC,MAAM,UAAS,EAAE,QAAQ,CAACuC,EAAE,QAChC,EAAE,QAAQ,CAACA,EAAE,OAClBupB,GAAe5B,EAAS,OAAO,CAAC;IAAE,IAAI;IAAQ,KAAKA,EAAS;IAAK,KAAK3nB;GAAE,CAAC,CAAC;EAC5E;EACA,QAAQ,MAAwB;GAC9B,IAAM2nB,IAAWwC,GAAO,SAClB1T,IAAMkR,KAAYrB,GAAM4C,EAAQvB,EAAS,KAAK,GAAGA,EAAS,GAAG;GACnE,IAAI,CAACA,KAAY,CAAClR,GAAK;GACvB,IAAMzW,IAAI,EAAE,GAAGyW,EAAI,GAEbxa,KAAMwa,EAAI,OAAO,KAAK,KAAK,KAAM,KACjCva,IAAK,KAAK,IAAIua,EAAI,IAAI,KAAK,IAAIxa,CAAC,CAAC,IAAI,KAAK,IAAIwa,EAAI,IAAI,KAAK,IAAIxa,CAAC,CAAC,GACjEkI,IAAK,KAAK,IAAIsS,EAAI,IAAI,KAAK,IAAIxa,CAAC,CAAC,IAAI,KAAK,IAAIwa,EAAI,IAAI,KAAK,IAAIxa,CAAC,CAAC,GACjEF,KAAMG,IAAKua,EAAI,KAAK,GACpB8B,KAAMpU,IAAKsS,EAAI,KAAK;GAQ1B,AAPIhZ,MAAM,SAAQ,EAAE,IAAI1B,IACf0B,MAAM,YAAYA,MAAM,SAAQ,EAAE,KAAKgV,EAAK,IAAIzS,EAAE,KAAK,IACvDvC,MAAM,UAAS,EAAE,IAAIgV,EAAK,IAAIzS,EAAE,IAAIjE,IACpC0B,MAAM,QAAO,EAAE,IAAI8a,IACnB9a,MAAM,WAAU,EAAE,KAAKgV,EAAK,IAAIzS,EAAE,KAAK,IACvCvC,MAAM,aAAU,EAAE,IAAIgV,EAAK,IAAIzS,EAAE,IAAIuY,IAC1C9a,MAAM,WAAQ,EAAE,KAAKgV,EAAK,IAAIzS,EAAE,KAAK,IACzCupB,GAAe5B,EAAS,OAAO,CAAC;IAAE,IAAI;IAAQ,KAAKA,EAAS;IAAK,KAAK3nB;GAAE,CAAC,CAAC;EAC5E;EACA,SAAS,MAAyB;GAChC,IAAIkO,EAAO,UAAUA,EAAO,MAAM;IAGhC,AAFA,EAAO,OAAO;KAAE,GAAGA,EAAO;KAAM,QAAQnX;IAAE,GAC1CwyB,GAAerb,EAAO,OAAO,CAAC;KAAE,IAAI;KAAU,KAAKA,EAAO;KAAK,QAAQnX;IAAE,CAAC,CAAC,GAC3E6B,EAAK;IACL;GACF;GACA,IAAM+uB,IAAWwC,GAAO,SAClB9wB,IAAK6wB,GAAKvC,CAAQ;GACxB,AAAIA,KAAYtuB,GAAI,MAAM,WAAWA,EAAG,QAAQ,KAAA,KAAWkwB,GAAe5B,EAAS,OAAO,CAAC;IAAE,IAAI;IAAU,KAAKtuB,EAAG;IAAK,QAAQtC;GAAE,CAAC,CAAC;EACtI;CACF,GAEMszB,UAA8B;EAClC;GAAE,OAAO;GAAa,MAAM;GAAQ,MAAM,GAAG7lB,EAAI;GAAI,KAAK4lB,EAAS;EAAU;EAC7E;GAAE,OAAO;GAAU,MAAM;GAAS,MAAM;GAAO,KAAKA,EAAS;EAAO;EACpE;GAAE,OAAO;GAAkB,MAAM;GAAS,MAAM,GAAG5lB,EAAI;GAAK,KAAK;GAAM,WAAW4lB,EAAS,QAAQ,OAAO;EAAE;EAC5G;GAAE,OAAO;GAAiB,MAAM,GAAG5lB,EAAI;GAAI,WAAW4lB,EAAS,QAAQ,SAAS;EAAE;EAClF;GAAE,OAAO;GAAiB,MAAM,GAAG5lB,EAAI;GAAI,WAAW4lB,EAAS,QAAQ,UAAU;EAAE;EACnF;GAAE,OAAO;GAAgB,MAAM;GAAQ,MAAM,GAAG5lB,EAAI;GAAK,WAAW4lB,EAAS,QAAQ,MAAM;EAAE;EAC7F;GAAE,OAAO;GAAwB,MAAM;GAAU,KAAK;GAAM,WAAWA,EAAS,OAAO,IAAI;EAAE;EAC7F;GAAE,OAAO;GAAgC,MAAM;GAAa,WAAWA,EAAS,OAAO,KAAK;EAAE;EAC9F;GAAE,OAAO;GAAqB,MAAM;GAAS,WAAWA,EAAS,OAAO,OAAO;EAAE;EACjF;GAAE,OAAO;GAAmB,MAAM;GAAS,WAAWA,EAAS,OAAO,OAAO;EAAE;EAC/E;GAAE,OAAO;GAAmB,MAAM;GAAY,KAAK;GAAM,WAAWA,EAAS,MAAM,MAAM;EAAE;CAC7F,GACME,MAAa,MAA0B;EAC3C;GAAE,OAAO;GAAa,MAAM;GAAY,MAAM,GAAG9lB,EAAI;GAAI,WAAWylB,GAAS,OAAO/zB,CAAC;EAAE;EACvF;GAAE,OAAO;GAAmB,MAAM;GAAQ,WAAW+zB,GAAS,aAAa/zB,CAAC;EAAE;EAC9E;GAAE,OAAO;GAAgB,MAAM;GAAS,WAAW+zB,GAAS,UAAU/zB,CAAC;GAAG,UAAUuc,EAAK,SAAS;EAAE;EACpG;GAAE,OAAOyW,EAAQhzB,CAAC,CAAC,EAAE,SAAS,eAAe;GAAc,MAAM;GAAQ,WAAW+zB,GAAS,QAAQ/zB,CAAC;EAAE;EACxG;GAAE,OAAO;GAAiB,MAAM;GAAM,KAAK;GAAM,WAAW+zB,GAAS,MAAM/zB,CAAC;GAAG,UAAUA,MAAM;EAAE;EACjG;GAAE,OAAO;GAAmB,MAAM;GAAQ,WAAW+zB,GAAS,QAAQ/zB,CAAC;GAAG,UAAUA,KAAKuc,EAAK,QAAQ;EAAE;EACxG;GAAE,OAAO;GAAmB,MAAM;GAAW,KAAK;GAAM,WAAW,KAAKkX,GAAO,QAAQzzB,CAAC;EAAE;EAC1F;GAAE,OAAO;GAAiB,MAAM;GAAS,WAAW,KAAKyzB,GAAO,SAASzzB,CAAC;EAAE;EAC5E;GAAE,OAAO;GAA2B,MAAM;GAAQ,KAAK;GAAM,WAAWgyB,EAAchyB,CAAC;EAAE;CAC3F,GAEMq0B,MAAc,MAA2B;EAC7C,IAAI,CAAC5C,KAAYzZ,EAAO,UAAU,CAACqE,EAAO,UAAU,OAAO;EAC3D,IAAMkE,IAAM6P,GAAM4C,EAAQvB,EAAS,KAAK,GAAGA,EAAS,GAAG,GACjDpqB,IAAO,EAAE,WAAW,KAAK,GACzBitB,IAA0C;GAAE,SAAS,CAAC,GAAG,CAACjtB,CAAI;GAAG,WAAW,CAAC,GAAGA,CAAI;GAAG,WAAW,CAAC,CAACA,GAAM,CAAC;GAAG,YAAY,CAACA,GAAM,CAAC;EAAE,GACpI6Y,IAAM,EAAE,WAAW,EAAE;EAC3B,IAAIA,KAAO,EAAE,IAAI,YAAY,MAAM,KAAK,EAAS,UAAU;OACtD,IAAIA,MAAQ,EAAE,QAAQ,aAAa,EAAE,QAAQ,cAAc,EAAS,QAAQ,EAAE,QAAQ,YAAa,EAAE,WAAW,UAAU,YAAa,EAAE,WAAW,SAAS,UAAU;OACvK,IAAI,EAAE,QAAQ,YAAY,EAAE,QAAQ,aAEvC,AADAmT,GAAe5B,EAAS,OAAO,CAAC;GAAE,IAAI;GAAU,KAAKA,EAAS;EAAI,CAAC,CAAC,GACpEC,EAAY,IAAI;OACX,IAAI4C,EAAM,EAAE,QAAQ/T,GAAK,GAAekR,EAAS,OAAO,CAAC;GAAE,IAAI;GAAQ,KAAKA,EAAS;GAAK,KAAK;IAAE,GAAGlR;IAAK,GAAGA,EAAI,IAAI+T,EAAM,EAAE,IAAI,CAAC;IAAI,GAAG/T,EAAI,IAAI+T,EAAM,EAAE,IAAI,CAAC;GAAG;EAAE,CAAC,CAAC;OACtK,IAAI,EAAE,QAAQ,UAAU,EAAY,IAAI;OACxC,OAAO;EAEZ,OADA,EAAE,eAAe,GACV;CACT,GAEMzH,KAAM,MAAc;EACxB,IAAM1pB,IAAKyZ,EAAU;EACrB,AAAIzZ,MAAI,EAAG,YAAYytB,KAAM,KAAK,IAAI,GAAG,KAAK,IAAIrU,EAAK,QAAQ,GAAGvc,CAAC,CAAC,IAAIuyB,IAAQ,KAAK,IAAI,IAAIvvB,EAAK,IAAIqvB,MAAU,CAAC;CACnH,GAEMkC,KAAa,MAA2B;EAG5C,IADIvc,EAAO,UAAU,EAAE,oBACnBqc,GAAW,CAAC,GAAG;EACnB,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,YAAY,MAAM,KAAK;GAE3D,AADA,EAAE,eAAe,GACjBhY,EAAY,KAAK;GACjB;EACF;EACA,IAAI,EAAE,QAAQ,MAAM;GAElB,AADA,EAAE,eAAe,GACjB2V,EAAc,EAAE,WAAW,IAAI9qB,CAAO;GACtC;EACF;EACA,IAAMgZ,IAAM,EAAE,WAAW,EAAE;EAC3B,IAAI7D,EAAO,YAAY6D,MAAQ,EAAE,IAAI,YAAY,MAAM,OAAO,EAAE,IAAI,YAAY,MAAM,MAEpF,AADA,EAAE,eAAe,GACjB2T,GAAgB,EAAE,IAAI,YAAY,MAAM,OAAO,EAAE,QAAQ;OAG3D,IAAIxX,EAAO,YAAY6D,KAAO,EAAE,IAAI,YAAY,MAAM,KAEpD,AADA,EAAE,eAAe,GACjB6T,GAAS,KAAK;OAGhB;OAAI,EAAE,QAAQ,cAAc,EAAE,QAAQ,gBAAiB,EAAE,QAAQ,OAAO,CAAC,EAAE,UAAW,EAAG7sB,IAAU,CAAC;QAC/F,IAAI,EAAE,QAAQ,YAAY,EAAE,QAAQ,aAAa,EAAGA,IAAU,CAAC;QAC/D,IAAI,EAAE,QAAQ,QAAQ,EAAG,CAAC;QAC1B,IAAI,EAAE,QAAQ,OAAO,EAAGqV,EAAK,QAAQ,CAAC;QACtC;GACL,EAAE,eAAe;EADZ;CAEP,GAEMiY,KAAc,MAAc;EAChC,IAAMjU,IAAMoR,KAAQA,EAAK,UAAU3xB,KAAK2xB,EAAK,QAAQA,EAAK,MAAMF,IAAWrB,GAAM4C,EAAQhzB,CAAC,GAAGyxB,EAAS,GAAG,IAAI,KAAA;EAC7G,IAAKlR,KAAQkR,GACb,OACE,kBAACf,IAAD;GACO;GACE;GACP,WAAW,GAAM,MAAM;IACrB,IAAM5mB,IAAIsmB,GAAM4C,EAAQhzB,CAAC,GAAGyxB,EAAS,GAAG;IACxC,AAAI3nB,KAAG8nB,GAAQ;KAAE,OAAO5xB;KAAG,KAAKyxB,EAAS;KAAK;KAAM,IAAI5yB,EAAE;KAAS,IAAIA,EAAE;KAAS,KAAKiL;KAAG,KAAKA;KAAG,OAAO;KAAO,IAAIjL,EAAE;KAAS,IAAIA,EAAE;IAAQ,CAAC;GAChJ;EACD,CAAA;CAEL,GAEM41B,IAAQ,CAAC;CACf,KAAK,IAAIz0B,IAAIoQ,IAAOpQ,KAAKqQ,IAAM,KAC7B,EAAM,KACJ,kBAAC,OAAD;EAA+B,WAAWgM,EAAO,WAAW,qCAAqC;EAAkB,OAAO;GAAE,KAAKuU,KAAM5wB,IAAIuyB;GAAO;EAAK;EAAG,cAAYvyB,IAAI;EACxK,cAAc,MAAMkzB,GAAiBlzB,GAAG,CAAC;EACzC,gBAAgB,MAAM;GACpB,IAAI,CAACqc,EAAO,UAAU;GACtB,IAAM7c,IAAI,EAAE;GACZ,IAAIwY,EAAO,UAAUuZ,EAAS,SAAS,SAAS/xB,CAAC,GAAG;GACpD,EAAE,eAAe;GACjB,IAAM2zB,IAAQ3zB,EAAE,QAAQ,YAAY;GACpC,IAAI2zB,GAAO;IACT,GAAY;IACZ,IAAMpsB,IAAM;KAAE,OAAO/G;KAAG,KAAK,OAAOmzB,EAAM,QAAQ,GAAG;IAAE;IAGvD,AAFA,GAAO,UAAUpsB,GACjB2qB,EAAY3qB,CAAG,GACfqW,GAAW;KAAE,GAAG,EAAE;KAAS,GAAG,EAAE;KAAS,OAAO+W,EAAU;IAAE,CAAC;GAC/D,OAAO,GAAW;IAAE,GAAG,EAAE;IAAS,GAAG,EAAE;IAAS,OAAOC,GAAUp0B,CAAC;GAAE,CAAC;EACvE;EAEA,UAAA,kBAAC8sB,IAAD;GACU;GACR,OAAO9sB;GACD;GACC;GACP,MAAA;GACA,SAASgY,EAAO,UAAUhY,IAAI8iB,KAAU,KAAA;GACxC,SAASzG,EAAO,YAAYoV,GAAU,UAAUzxB,IAAIw0B,EAAWx0B,CAAC,IAAI,KAAA;EACrE,CAAA;CACE,GA1BK,GAAG6xB,GAAU,GAAG7xB,GA0BrB,CACP;CAEF,AAAIgY,EAAO,WAAWA,EAAO,QAAQ5H,MAAS4H,EAAO,QAAQ3H,OAAOwiB,GAAY;CAChF,IAAM6B,KAAS,CAAC;CAChB,IAAItD,GACF,KAAK,IAAIpxB,IAAI2yB,GAAQ3yB,KAAK4yB,GAAO,KAC/B,GAAO,KACL,kBAAC,OAAD;EAEE,WAAU;EACV,OAAO,EAAE,KAAK,KAAK5yB,IAAI0yB,GAAO;EAC9B,gBAAc1yB,MAAMkH;EACpB,eAAe2lB,EAAG7sB,CAAC;EACnB,gBAAgB,MAAM;GACpB,AAAKqc,EAAO,aACZ,EAAE,eAAe,GACjBwQ,EAAG7sB,CAAC,GACJod,GAAW;IAAE,GAAG,EAAE;IAAS,GAAG,EAAE;IAAS,OAAOgX,GAAUp0B,CAAC;GAAE,CAAC;EAChE;EAXF,UAAA,CAaE,kBAAC,QAAD;GAAM,WAAU;GAAc,UAAAA,IAAI;EAAQ,CAAA,GAC1C,kBAAC8sB,IAAD;GAAmB;GAAQ,OAAO9sB;GAAS;GAAM,OAAOwyB;GAAQ,MAAA;EAAM,CAAA,CACnE;CAdE,GAAA,GAAGX,GAAU,GAAG7xB,GAclB,CACP;CAIJ,OACE,kBAAC,OAAD;EAAK,KAAKgxB;EAAS,OAAO;GAAE,SAAS;GAAQ,MAAM;GAAG,UAAU;EAAE;EAAlE,UAAA,CACGI,KACC,kBAAC,OAAD;GAAK,KAAKF;GAAU,WAAU;GAC5B,UAAA,kBAAC,OAAD;IAAK,OAAO;KAAE,QAAQ,KAAK3U,EAAK,QAAQmW;KAAQ,UAAU;IAAW;IAAI,UAAAgC;GAAY,CAAA;EAClF,CAAA,GAEP,kBAAC,OAAD;GAAK,OAAO;IAAE,UAAU;IAAY,MAAM;IAAG,UAAU;IAAG,SAAS;GAAO;GAA1E,UAAA;IACE,kBAAC,OAAD;KAAK,KAAK9X;KAAW,WAAU;KAAY,UAAU;KAAc;KAAW,OAAO,EAAE,SAAS,OAAO;KAAG,cAAc,MAAM,EAAE,WAAW,EAAE,iBAAiBiW,GAAY;KACxK,UAAA,kBAAC,OAAD;MAAK,KAAKrB;MAAW,OAAO;OAAE,UAAU;OAAY,QAAQ/R;OAAQ,OAAOC;MAAO;MAAG,cAAc,MAAM,EAAE,WAAW,EAAE,iBAAiBmT,GAAY;MAClJ,UAAA4B;KACE,CAAA;IACF,CAAA;IACL,kBAAChnB,IAAD;KAAmB;KAAM,WAAWgJ;KAAO,UAAUiG;IAAU,CAAA;IAC9D,CAACL,EAAO,YACP,kBAAC,UAAD;KAAQ,MAAK;KAAS,WAAU;KAAyB,OAAM;KAAe,eAAe2V,EAAc9qB,CAAO;KAAG,UAAA;IAE7G,CAAA;IAEV,kBAACoG,IAAD;KAAQ,MAAM,SAASpG,IAAU,EAAE,MAAMqV,EAAK;KAAmB;IAAW,CAAA;IAC3EF,EAAO,YACN,kBAACkQ,IAAD;KACU;KACR,OACEkF,KAAY,CAACzZ,EAAO,gBACT;MACL,IAAM7U,IAAK6wB,GAAKvC,CAAQ,GAClBrC,IAAKjsB,GAAI,MAAM,UAAUA,IAAK,KAAA;MACpC,OAAO;OAAE,SAASisB,GAAI,QAAQ,KAAA;OAAW,QAAQA,GAAI,MAAM;MAAO;KACpE,EAAA,CAAG,IACH;KAEN,YAAYpX,EAAO,MAAM;KACzB,SAASia,KAAY;KACrB,SAAS,MAAS,KAAK4B,GAAWC,CAAI;KACtC,WAAW,MAAM,KAAKL,GAAOlsB,CAAC;KAC9B,SAAS,MAAUkqB,KAAY,KAAK4B,GAAU5B,EAAS,OAAO,CAAC;MAAE,IAAI;MAAQ,KAAKA,EAAS;MAAK;KAAM,CAAC,CAAC;KACxG,SAAS,MAAMA,KAAY,KAAK4B,GAAU5B,EAAS,OAAO,CAAC;MAAE,IAAI;MAAQ,KAAKA,EAAS;MAAK,GAAG3tB;KAAE,CAAC,CAAC;KACnG,WAAWowB,EAAS;KACpB,UAAUA,EAAS;KACnB,SAASA,EAAS;KAClB,UAAUA,EAAS;KACnB,aAAaA,EAAS;KACtB,UAAUA,EAAS;KACnB,eAAe,MAAU,KAAKb,GAAUnsB,GAAS,CAAC;MAAE,IAAI;MAAM;KAAM,CAAC,CAAC;KACtE,UAAU,MAAM6sB,GAASxsB,CAAC;KAC1B,YAAY,MAAcyqB,EAAc2C,IAAY,IAAIztB,CAAO;IAChE,CAAA;IAEFiW,KAAW,kBAACrP,IAAD;KAAa,GAAGqP,EAAQ;KAAG,GAAGA,EAAQ;KAAG,OAAOA,EAAQ;KAAO,eAAeC,GAAW,IAAI;IAAI,CAAA;IAC5G2U,OAAe,QAAQ,kBAACvF,IAAD;KAAmB;KAAc;KAAM,OAAOuF;KAAY,eAAeC,EAAc,IAAI;IAAI,CAAA;GACpH;EACF,CAAA,CAAA;;AAET;;AC7tBA,SAAgB4C,GAAY,GAAmC,IAAuB,CAAC,GAAkB;CACvG,IAAM,CAACC,GAAOC,KAAY5xB,EAAwB;EAAE,QAAQ;EAAM,OAAO;EAAM,SAAS,CAAC,CAACtE;EAAK,UAAU;CAAK,CAAC,GACzG,EAAE,SAAM,WAAQ,mBAAgBoI,GAChC+tB,IAAa/tB,EAAQ,UAAU,KAAK,UAAUA,EAAQ,OAAO,IAAI;CA6BvE,OA5BA1E,QAAgB;EACd,IAAI,CAAC1D,GAAK;GACR,EAAS;IAAE,QAAQ;IAAM,OAAO;IAAM,SAAS;IAAO,UAAU;GAAK,CAAC;GACtE;EACF;EACA,IAAIyF,IAAO,IACPC,IAAgC;EAiBpC,OAhBAwwB,EAAS;GAAE,QAAQ;GAAM,OAAO;GAAM,SAAS;GAAM,UAAU;EAAK,CAAC,GACrE33B,EAAe,KAAKyB,GAAK;GACvB;GACA;GACA;GACA,SAASm2B,IAAa,KAAK,MAAMA,CAAU,IAAI,KAAA;GAC/C,aAAa,MAAM1wB,KAAQywB,GAAU,OAAO;IAAE,GAAGvxB;IAAG,UAAUO;GAAE,EAAE;EACpE,CAAC,CAAC,CAAC,MACA,MAAM;GACL,IAAI,CAACO,GAAM,OAAOyE,EAAE,QAAQ;GAG5B,AAFA,IAASA,GACTA,EAAE,GAAG,aAAa,MAAMzE,KAAQywB,GAAU,OAAO;IAAE,GAAGvxB;IAAG,UAAUO;GAAE,EAAE,CAAC,GACxEgxB,GAAU,OAAO;IAAE,GAAGvxB;IAAG,QAAQuF;IAAG,SAAS;GAAM,EAAE;EACvD,IACC,MAAazE,KAAQywB,EAAS;GAAE,QAAQ;GAAM,OAAO;GAAG,SAAS;GAAO,UAAU;EAAK,CAAC,CAC3F,SACa;GAEX,AADA,IAAO,IACPxwB,GAAQ,QAAQ;EAClB;CACF,GAAG;EAAC1F;EAAK4C;EAAMwzB;EAAQC;EAAaF;CAAU,CAAC,GACxCF;AACT;;ACxCA,IAAMtO,KAAU;CACd;EAAE,OAAO;EAAW,OAAO;EAAa,MAAM;CAAU;CACxD;EAAE,OAAO;EAAK,OAAO;EAAc,MAAM;CAAM;CAC/C;EAAE,OAAO;EAAK,OAAO;EAAU,MAAM;EAAQ,KAAK;CAAK;CACvD;EAAE,OAAO;EAAQ,OAAO;EAAU,MAAM;CAAU;CAClD;EAAE,OAAO;EAAS,OAAO;EAAU,MAAM;CAAQ;CACjD;EAAE,OAAO;EAAY,OAAO;EAAU,MAAM;CAAW;CACvD;EAAE,OAAO;EAAY,OAAO;EAAc,MAAM;CAAW;CAC3D;EAAE,OAAO;EAAM,OAAO;EAAW,MAAM;EAAO,KAAK;CAAK;CACxD;EAAE,OAAO;EAAS,OAAO;EAAW,MAAM;CAAS;CACnD;EAAE,OAAO;EAAe,OAAO;EAAY,MAAM;EAAa,KAAK;CAAK;CACxE;EAAE,OAAO;EAAY,OAAO;EAAoB,MAAM;CAAS;CAC/D;EAAE,OAAO;EAA4D,OAAO;EAAc,MAAM;CAAe;CAC/G;EAAE,OAAO;EAAa,OAAO;EAAY,MAAM;CAAU;CACzD;EAAE,OAAO;EAAS,OAAO;EAAY,MAAM;CAAW;CACtD;EAAE,OAAO;EAAc,OAAO;EAAQ,MAAM;EAAc,KAAK;CAAK;CACpE;EAAE,OAAO;EAAc,OAAO;EAAQ,MAAM;CAAa;CACzD;EAAE,OAAO;EAAe,OAAO;EAAa,MAAM;CAAoB;CACtE;EAAE,OAAO;EAAQ,OAAO;EAAQ,MAAM;CAAQ;CAC9C;EAAE,OAAO;EAAiB,OAAO;EAAQ,MAAM;CAAa;CAC5D;EAAE,OAAO;EAAmB,OAAO;EAAa,MAAM;CAAmB;CACzE;EAAE,OAAO;EAAa,OAAO;EAAY,MAAM;CAAW;AAC5D,GACM2O,KAAQ;CAAC;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;AAAE,GAC/DC,KAA4D;CAChE;EAAE,GAAG;EAAO,MAAM;EAAQ,OAAO;CAAc;CAC/C;EAAE,GAAG;EAAS,MAAM;EAAU,OAAO;CAAgB;CACrD;EAAE,GAAG;EAAS,MAAM;EAAU,OAAO;CAAgB;CACrD;EAAE,GAAG;EAAQ,MAAM;EAAS,OAAO;CAAgB;CACnD;EAAE,GAAG;EAAO,MAAM;EAAQ,OAAO;CAAa;CAC9C;EAAE,GAAG;EAAU,MAAM;EAAW,OAAO;CAAgB;CACvD;EAAE,GAAG;EAAQ,MAAM;EAAS,OAAO;CAAc;CACjD;EAAE,GAAG;EAAS,MAAM;EAAU,OAAO;CAAe;AACtD,GACMC,KAAgB;CACpB;EAAE,OAAO;EAAQ,OAAO;EAAQ,MAAM;CAAM;CAC5C;EAAE,OAAO;EAAU,OAAO;EAAU,MAAM;CAAM;CAChD;EAAE,OAAO;EAAS,OAAO;EAAS,MAAM;CAAM;CAC9C;EAAE,OAAO;EAAU,OAAO;EAAU,MAAM;CAAQ;CAClD;EAAE,OAAO;EAAU,OAAO;EAAU,MAAM;CAAQ;CAClD;EAAE,OAAO;EAAU,OAAO;EAAU,MAAM;CAAM;AAClD,GACMC,KAAS;CACb;EAAE,OAAO;EAAQ,OAAO;EAAQ,MAAM;CAAY;CAClD;EAAE,OAAO;EAAU,OAAO;EAAU,MAAM;CAAc;CACxD;EAAE,OAAO;EAAS,OAAO;EAAS,MAAM;CAAa;AACvD,GACMl5B,KAAS;CACb;EAAE,OAAO;EAAO,OAAO;EAAO,MAAM;CAAO;CAC3C;EAAE,OAAO;EAAU,OAAO;EAAU,MAAM;CAAU;CACpD;EAAE,OAAO;EAAU,OAAO;EAAU,MAAM;CAAU;AACtD,GACMo5B,KAAS;CACb;EAAE,OAAO;EAAG,OAAO;EAAQ,MAAM;CAAU;CAC3C;EAAE,OAAO;EAAI,OAAO;EAAW,MAAM;CAAQ;CAC7C;EAAE,OAAO;EAAK,OAAO;EAAa,MAAM;CAAU;CAClD;EAAE,OAAO;EAAK,OAAO;EAAoB,MAAM;CAAW;CAC1D;EAAE,OAAO;EAAI,OAAO;EAAa,MAAM;CAAU;CACjD;EAAE,OAAO;EAAK,OAAO;EAAe,MAAM;CAAY;AACxD,GACMC,KAAQ;CAAC;CAAO;CAAW;CAAS;CAAO;AAAK;AAKtD,SAASC,GAAS,GAAa,GAAmB;CAChD,IAAMptB,IAAOoe,MAAQ,aAAaA,MAAQ,MAAM,MAAMA,GAChDlc,IAAI,WAAW,KAAKlC,CAAI;CAC9B,IAAI,CAACkC,GAAG,OAAO/C,IAAI,IAAI,QAAQ;CAC/B,IAAM/E,IAAI,KAAK,IAAI,IAAI8H,EAAE,KAAKA,EAAE,EAAE,CAAC,SAAS,IAAI,KAAK/C,CAAC;CACtD,OAAOa,EAAK,MAAM,GAAGkC,EAAE,KAAK,IAAI,OAAO9H,IAAI,MAAM,IAAI,OAAOA,CAAC,IAAI,MAAM4F,EAAK,MAAMkC,EAAE,QAAQA,EAAE,EAAE,CAAC,MAAM;AACzG;AAEA,SAAgBmrB,GAAY,GAqBzB;CACD,IAAM,EAAE,QAAK,UAAU7zB,MAAMoE,GACvB,CAAC0vB,GAAQC,KAAa1yB,EAAS,SAAS,GACxC,CAAC2yB,GAAQC,KAAa5yB,EAAkD,MAAM,GAC9EuM,IAAO,OAAO7D,EAAI,kBAAkB,EAAE,GACtCmqB,IAASnqB,EAAI,aAAoC,IACjDoqB,IAASpqB,EAAI,eAAe,eAAe,QAAQA,EAAI,eAAe,WAAW,WAAW,UAC5F4hB,IAAM,OAAO5hB,EAAI,cAAc,CAAC,GAChC+D,KAAM,MAAgB,OAAO7K,KAAM,YAAYA,EAAE,SAAS,IAAI,IAAI,WAAWA,CAAC,IAAI,OAAOA,KAAM,WAAW,KAAK,MAAMA,IAAI,MAAO,CAAC,IAAI,IAAI,KAAA,GACzIqT,IAAKxI,EAAG/D,EAAI,QAAQ,KAAK+D,EAAG1J,EAAM,KAAK,QAAQ,GAC/CgS,IAAOtM,GAAUC,EAAI,cAAc3F,EAAM,KAAK,UAAiC,GAC/EgwB,IAAQ1P,GAAQ,MAAM,MAAM3jB,EAAE,UAAUqD,EAAM,MAAM,GACpDiwB,IAAUD,IAAQ1P,KAAU,CAAC;EAAE,OAAOtgB,EAAM;EAAQ,OAAO;EAAU,MAAMA,EAAM;CAAO,GAAG,GAAGsgB,EAAO;CAC3G,OACE,kBAACrZ,IAAD,EAAA,UAAA;EACE,kBAAC5G,GAAD;GAAK,MAAK;GAAO,OAAO,SAASgI,EAAI;GAAK,SAASrI,EAAM;EAAS,CAAA;EAClE,kBAACK,GAAD;GAAK,MAAK;GAAO,OAAO,SAASgI,EAAI;GAAK,SAASrI,EAAM;EAAS,CAAA;EAClE,kBAACK,GAAD;GAAK,MAAK;GAAQ,OAAM;GAA0C,QAAQL,EAAM;GAAS,SAASA,EAAM;EAAU,CAAA;EAClH,kBAACM,GAAD,CAAM,CAAA;EACN,kBAACD,GAAD;GAAK,MAAK;GAAW,OAAM;GAAqB,eAAezE,EAAE,EAAE,QAAQ,gBAAc,CAAC;EAAI,CAAA;EAC9F,kBAACyE,GAAD;GAAK,MAAK;GAAU,OAAM;GAAoB,eAAezE,EAAE,EAAE,QAAQ,KAAK,CAAC;EAAI,CAAA;EACnF,kBAACyE,GAAD;GAAK,MAAK;GAAU,OAAM;GAA0B,eAAezE,EAAE,EAAE,QAAQ4zB,GAASxvB,EAAM,QAAQ,EAAE,EAAE,CAAC;EAAI,CAAA;EAC/G,kBAACK,GAAD;GAAK,MAAK;GAAU,OAAM;GAA0B,eAAezE,EAAE,EAAE,QAAQ4zB,GAASxvB,EAAM,QAAQ,CAAC,EAAE,CAAC;EAAI,CAAA;EAC9G,kBAAC8B,IAAD;GAAQ,OAAO,kBAAkBkuB,GAAO,SAAS;GAAY,OAAO;GAAI,WAAW;GAAK,OAAOhwB,EAAM;GAAQ,SAASiwB;GAAS,WAAW,MAAMr0B,EAAE,EAAE,QAAQiD,EAAE,CAAC;EAAI,CAAA;EACnK,kBAACyB,GAAD,CAAM,CAAA;EACN,kBAACwB,IAAD;GAAQ,OAAM;GAAO,OAAO;GAAK,WAAW;GAAK,OAAOkQ;GAAM,aAAY;GAAO,SAASxM,GAAYwM,CAAI;GAAG,WAAW,MAAMpW,EAAE,EAAE,MAAMiD,EAAE,CAAC;EAAI,CAAA;EAC/I,kBAACyB,GAAD,CAAM,CAAA;EACN,kBAACyB,IAAD;GAAS,OAAOmQ;GAAI,OAAO+c;GAAO,WAAW,MAAMrzB,EAAE,EAAE,IAAIiD,EAAE,CAAC;EAAI,CAAA;EAClE,kBAACyB,GAAD,CAAM,CAAA;EACN,kBAACD,GAAD;GAAK,MAAK;GAAO,OAAO,SAASgI,EAAI;GAAK,QAAQ1C,EAAI,eAAe;GAAK,eAAe3F,EAAM,SAAS,GAAG;EAAI,CAAA;EAC/G,kBAACK,GAAD;GAAK,MAAK;GAAS,OAAO,WAAWgI,EAAI;GAAK,QAAQ1C,EAAI,cAAc;GAAU,eAAe3F,EAAM,SAAS,GAAG;EAAI,CAAA;EACvH,kBAACK,GAAD;GAAK,MAAK;GAAY,OAAO,cAAcgI,EAAI;GAAK,QAAQmB,EAAK,SAAS,WAAW;GAAG,eAAexJ,EAAM,SAAS,GAAG;EAAI,CAAA;EAC7H,kBAACK,GAAD;GAAK,MAAK;GAAS,OAAO,kBAAkBgI,EAAI;GAAM,QAAQmB,EAAK,SAAS,cAAc;GAAG,eAAexJ,EAAM,SAAS,QAAQ;EAAI,CAAA;EACvI,kBAACgF,IAAD;GAAU,MAAK;GAAQ,OAAM;GAAa,OAAOW,EAAI;GAA6B,SAAS,MAAM/J,EAAE,EAAE,OAAOiH,EAAE,CAAC;GAAG,WAAU;EAAa,CAAA;EACzI,kBAACvC,GAAD,CAAM,CAAA;EACN,kBAAC0E,IAAD;GAAU,MAAK;GAAO,OAAM;GAAa,OAAO,OAAOW,EAAI,cAAe,YAAY,CAACA,EAAI,WAAW,SAAS,UAAU,IAAIA,EAAI,aAAa,KAAA;GAAW,SAAS,MAAM/J,EAAE,EAAE,MAAMiH,EAAE,CAAC;GAAG,WAAU;EAAW,CAAA;EAC7M,kBAACkD,IAAD;GAAK,MAAK;GAAU,OAAM;GAAU,SAAA;GAChC,WAAA,MACA,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;KAAa,MAAK;KAAQ,cAAW;KACjD,UAAAmpB,GAAQ,KAAK,MACZ,kBAAC,UAAD;MAEE,MAAK;MACL,WAAU;MACV,OAAOvyB,EAAE;MACT,cAAYA,EAAE;MACd,eAAe;OAEb,AADAwD,EAAM,GACNvE,EAAE;QAAE,QAAQe,EAAE;QAAG,aAAa+yB;QAAQ,aAAaE;OAAO,CAAC;MAC7D;MAEA,UAAA,kBAACnwB,GAAD,EAAM,MAAM9C,EAAE,KAAO,CAAA;KACf,GAXDA,EAAE,CAWD,CACT;IACE,CAAA,GACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACqI,IAAD;MAAU,MAAK;MAAQ,OAAM;MAAe,OAAO0qB;MAAQ,SAAS,MAAMC,EAAU9sB,KAAK,SAAS;MAAG,WAAU;KAAS,CAAA,GACxH,kBAACtC,GAAD;MAAU,OAAM;MAAe,MAAK;MAAY,OAAO;MAAM,WAAW;MAAK,OAAOqvB;MAAQ,SAAS,CAAC,GAAGT,EAAa;MAAG,WAAW,MAAMU,EAAUhxB,CAAC;KAAI,CAAA,CACtJ;IACF,CAAA,CAAA;;EAEJ,CAAA;EACL,kBAAC0B,GAAD;GACE,OAAM;GACN,MAAK;GACL,OAAO;GACP,WAAW;GACX,SAAS;IACP;KAAE,OAAO;KAAO,OAAO;IAAY;IACnC;KAAE,OAAO;KAAU,OAAO;IAAqB;IAC/C;KAAE,OAAO;KAAQ,OAAO;IAAmB;IAC3C;KAAE,OAAO;KAAW,OAAO;KAAW,UAAU,CAACP,EAAM;KAAQ,KAAK;IAAK;GAC3E;GACA,WAAW,MAAMA,EAAM,QAAQnB,CAAc;EAC9C,CAAA;EACD,kBAACyB,GAAD,CAAM,CAAA;EACN,kBAACC,GAAD;GACE,OAAM;GACN,MAAM6uB,GAAO,MAAM,MAAMzyB,EAAE,UAAUmzB,CAAK,CAAC,EAAE,QAAQ;GACrD,OAAO;GACP,WAAW;GACX,OAAOA;GACP,SAASV,GAAO,KAAK,OAAO,EAAE,GAAGzyB,EAAE,EAAE;GACrC,WAAW,MAAMf,EAAE,EAAE,OAAOiD,MAAMixB,IAAQ,OAAQjxB,EAAa,CAAC;EACjE,CAAA;EACD,kBAAC0B,GAAD;GAAU,OAAM;GAAiB,MAAMrK,GAAO,MAAM,MAAMyG,EAAE,UAAUozB,CAAM,CAAC,CAAE;GAAM,OAAO;GAAM,WAAW;GAAK,OAAOA;GAAQ,SAAS75B,GAAO,KAAK,OAAO,EAAE,GAAGyG,EAAE,EAAE;GAAG,WAAW,MAAMf,EAAE,EAAE,QAAQiD,EAAE,CAAC;EAAI,CAAA;EAC7M,kBAACwB,GAAD;GAAK,MAAK;GAAO,OAAM;GAAY,QAAQsF,EAAI,eAAe;GAAY,eAAe/J,EAAE,EAAE,MAAM+J,EAAI,eAAe,WAAW,CAAC;EAAI,CAAA;EACtI,kBAACpF,GAAD;GAAU,OAAM;GAAgB,MAAM+uB,GAAO,MAAM,MAAM3yB,EAAE,UAAU4qB,CAAG,CAAC,EAAE,QAAQ;GAAW,OAAO;GAAM,WAAW;GAAK,OAAOA;GAAK,SAAS+H;GAAQ,WAAW,MAAM1zB,EAAE,EAAE,QAAQiD,KAAK,KAAK,CAAC;EAAI,CAAA;EACpM,kBAACyB,GAAD,CAAM,CAAA;EACN,kBAACwF,IAAD;GACE,OAAM;GACN,OAAM;GACN,MAAK;GACL,OAAO;IACL;KAAE,OAAO;KAAY,OAAO;KAAoB,MAAM;IAAW;IACjE;KAAE,OAAO;KAAY,OAAO;KAAoB,MAAM;IAAW;IACjE;KAAE,OAAO;KAAW,OAAO;KAAsB,MAAM;IAAU;IACjE;KAAE,OAAO;KAAY,OAAO;KAAuB,MAAM;IAAW;IACpE;KAAE,OAAO;KAAU,OAAO;KAAiB,MAAM;KAAU,KAAK;IAAK;IACrE;KAAE,OAAO;KAAU,OAAO;KAAoB,MAAM;IAAS;IAC7D;KAAE,OAAO;KAAY,OAAO;KAAe,MAAM;KAAQ,KAAK;IAAK;IACnE;KAAE,OAAO;KAAY,OAAO;KAAkB,MAAM;IAAO;IAC3D;KAAE,OAAO;KAAc,OAAO;KAAe,MAAM;IAAO;IAC1D;KAAE,OAAO;KAAc,OAAO;KAAkB,MAAM;IAAO;GAC/D;GACA,SAAS,MAAM9F,EAAM,OAAOnB,CAAe;EAC5C,CAAA;EACD,kBAAC0B,GAAD;GACE,OAAM;GACN,MAAK;GACL,OAAO;GACP,WAAW;GACX,SAAS,CAAC,GAAGgvB,GAAM,KAAK,OAAO;IAAE,OAAO5yB;IAAG,OAAOA;GAAE,EAAE,GAAG;IAAE,OAAO;IAAI,OAAO;IAAmB,KAAK;GAAK,CAAC;GAC3G,WAAW,MAAMqD,EAAM,OAAOnB,KAAK,IAAI;EACxC,CAAA;EACD,kBAAC0B,GAAD;GACE,OAAM;GACN,MAAK;GACL,OAAO;GACP,WAAW;GACX,SAAS,CACP;IAAE,OAAO;IAAO,OAAO;IAAoB,MAAM;GAAS,GAC1D;IAAE,OAAO;IAAQ,OAAO;IAAoB,MAAM;GAAS,CAC7D;GACA,WAAW,MAAMP,EAAM,OAAOnB,MAAM,MAAM;EAC3C,CAAA;EACD,kBAACiH,IAAD;GACE,OAAM;GACN,OAAM;GACN,MAAK;GACL,OAAO;IACL;KAAE,OAAO;KAAO,OAAO;IAAe;IACtC;KAAE,OAAO;KAAO,OAAO;IAAkB;IACzC;KAAE,OAAO;KAAO,OAAO;IAA4B;IACnD;KAAE,OAAO;KAAQ,OAAO;KAAY,UAAU,CAAC9F,EAAM;IAAO;IAC5D;KAAE,OAAO;KAAQ,OAAOA,EAAM,YAAY,mBAAmB;KAAkB,MAAM;KAAa,KAAK;IAAK;GAC9G;GACA,SAAS,MAAOnB,MAAM,SAASmB,EAAM,YAAY,IAAIA,EAAM,SAASnB,CAAU;EAC/E,CAAA;EACD,kBAACyB,GAAD,CAAM,CAAA;EACN,kBAACD,GAAD;GAAK,MAAK;GAAQ,OAAO,qBAAqBgI,EAAI;GAAM,eAAezM,EAAE,EAAE,OAAO,GAAK,CAAC;EAAI,CAAA;EAC5F,kBAACyE,GAAD;GAAK,MAAK;GAAS,OAAO,mBAAmBgI,EAAI;GAAK,SAASrI,EAAM;EAAS,CAAA;CACrE,EAAA,CAAA;AAEf;;ACpPA,IAAakwB,KAAb,MAAkB;CAOG;CANnB,QAAQ;CACR,yBAAiB,IAAI,IAAoB;CACzC,OAAyB,CAAC;CAC1B,MAAwB,CAAC;CACzB,QAAgB;CAEhB,YAAY,GAAoB;EAAb,KAAA,MAAAjJ;CAAc;CAEjC,IAAI,GAAW,GAAc;EAG3B,AAFIlqB,MAAS,KAAK,MAAK,KAAK,OAAO,OAAOhD,CAAC,IACtC,KAAK,OAAO,IAAIA,GAAGgD,CAAI,GAC5B,KAAK,QAAQ;CACf;CAEA,SAAS,GAAa,GAAa,GAAc;EAC/C,IAAM0B,IAAK,KAAK,IAAI0xB,GAAKC,IAAM,GAAK;EACpC,KAAK,IAAIr2B,IAAIq2B,GAAKr2B,KAAK0E,GAAI,KAAK,KAAK,IAAI1E,GAAGgD,CAAI;CAClD;CAEA,QAAgB;EACd,IAAI,CAAC,KAAK,OAAO;EACjB,KAAK,OAAO,CAAC,GAAG,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,MAAMnC,IAAIiJ,CAAC;EACxD,IAAIyV,IAAM;EAEV,AADA,KAAK,MAAM,KAAK,KAAK,KAAK,MAAO,KAAO,KAAK,OAAO,IAAIhY,CAAC,IAAK,KAAK,GAAI,GACvE,KAAK,QAAQ;CACf;CAEA,KAAK,GAAmB;EACtB,OAAO,KAAK,OAAO,IAAIvH,CAAC,KAAK,KAAK;CACpC;CAGA,IAAI,GAAmB;EACrB,KAAK,MAAM;EACX,IAAIyE,IAAK,GACLC,IAAK,KAAK,KAAK,SAAS,GACxB6C,IAAI;EACR,OAAO9C,KAAMC,IAAI;GACf,IAAMG,IAAOJ,IAAKC,KAAO;GACzB,AAAI,KAAK,KAAKG,KAAO7E,KACnB,IAAI6E,GACJ,IAAKA,IAAM,KACN,IAAKA,IAAM;EACpB;EACA,OAAO7E,IAAI,KAAK,OAAOuH,KAAK,IAAI,KAAK,IAAIA,KAAK;CAChD;CAEA,QAAgB;EACd,OAAO,KAAK,IAAI,KAAK,KAAK;CAC5B;CAGA,MAAM,GAAoB;EACxB,IAAI+uB,KAAM,GAAG,OAAO;EACpB,IAAI7xB,IAAK,GACLC,IAAK,KAAK,IAAI,GAAG,KAAK,QAAQ,CAAC;EACnC,OAAOD,IAAKC,IAAI;GACd,IAAMG,IAAOJ,IAAKC,IAAK,KAAM;GAC7B,AAAI,KAAK,IAAIG,CAAG,KAAKyxB,IAAI,IAAKzxB,IACzB,IAAKA,IAAM;EAClB;EACA,OAAOJ;CACT;AACF,GChEa8xB,MAAU,GAAgC,MACrD,OAAOzxB,KAAM,YAAYA,EAAE,SAAS,IAAI,IAAK,WAAWA,CAAC,IAAI,IAAK,IAAI,OAAOA,KAAM,WAAWA,IAAIuD;AAGpG,SAAgBmuB,GAAU,GAAc,GAAe,GAAoB;CACzE,IAAMC,IAAKH,IAAK;CAChB,IAAIr3B,EAAK,SAASw3B,KAAMpkB,GAAO,OAAOpT;CACtC,IAAMsL,IAAI,mBAAmB,KAAKtL,CAAI;CACtC,IAAIsL,MAAMA,EAAE,EAAE,CAAC,UAAUtL,EAAK,WAAW,GAAG,GAAI,MAAUw3B,KAAMpkB,GAAO;EACrE,IAAM1M,IAAO,KAAK,IAAI,GAAG,KAAK,MAAM0M,IAAQokB,CAAE,IAAIlsB,EAAE,EAAE,CAAC,SAAS,CAAC,GAC3DzF,IAAI,OAAO7F,CAAI,CAAC,CAAC,QAAQ0G,CAAI;EACnC,IAAIb,EAAE,SAAS2xB,KAAMpkB,GAAO,OAAOvN;CACrC;CACA,OAAO,IAAI,OAAO,KAAK,IAAI,GAAG,KAAK,MAAMuN,IAAQokB,CAAE,CAAC,CAAC;AACvD;;ACGA,IAAMC,KAAQ,KACRC,KAAiB,KAEjBC,KAAa,KAEbC,KAAa,KACbC,KAAc;AAEpB,eAAeC,GAAU,GAAwB,GAAe,GAA+C;CAC7G,IAAM13B,oBAAM,IAAI,IAAuB;CACvC,KAAK,IAAIoB,IAAK,GAAGA,IAAK2Q,GAAM,KAAMslB,IAAO;EACvC,IAAM5sB,IAAI,MAAMxF,EAAO,KAAK,cAAc9D,GAAOC,GAAI,KAAK,IAAI2Q,GAAM3Q,IAAKi2B,EAAK,CAAC;EAC/E,KAAK,IAAMllB,KAAO1H,EAAE,MAAM,EAAI,IAAI0H,EAAI,GAAGA,EAAI,KAAK;CACpD;CACA,OAAOnS;AACT;AAEA,IAAM23B,WAAgB,gBAAI,MAAM,oDAAoD;AAGpF,eAAsBC,GAAU,GAAwB,GAAe,GAAgB,GAA8B;CACnH,IAAI,CAACjiB,EAAE,MAAM,MAAMgiB,GAAQ;CAC3B,IAAMlgB,IAAO,MAAMigB,GAAUzyB,GAAQ9D,GAAOwU,EAAE,IAAI,GAC9CkiB,IAAQ,IACRC,IAAQ;CACZ,KAAK,IAAM,CAACpxB,GAAGyK,MAAUsG,GACvB,KAAK,IAAMhO,KAAK0H,GACd,AAAI1H,EAAE,OAAO,OACb,IAAQ,KAAK,IAAIouB,GAAOnxB,CAAC,GACzB,IAAQ,KAAK,IAAIoxB,GAAOruB,EAAE,EAAE;CAGhC,IAAMsI,IAAmB,CAAC;CAC1B,KAAK,IAAIrL,IAAI,GAAGA,KAAKmxB,GAAO,KAAK;EAC/B,IAAM9e,IAAW,MAAc+e,IAAQ,CAAC,CAAC,CAAC,KAAK,EAAE;EACjD,KAAK,IAAMruB,KAAKgO,EAAK,IAAI/Q,CAAC,KAAK,CAAC,GAAG,AAAI+C,EAAE,MAAMquB,MAAO,EAAKruB,EAAE,MAAMA,EAAE;EACrE,EAAK,KAAKsP,CAAI;CAChB;CACA,QAAQ+B,MAAQ,MAAM,MAAM,MAAMD,GAAM9I,GAAM+I,CAAG;AACnD;AAEA,IAAMid,KAAyD;CAAE,cAAc;CAAO,QAAQ;CAAU,YAAY;AAAS;AAG7H,eAAsBC,GAAe,GAAwB,GAAe,GAAgB,GAAwC;CAClI,IAAI,CAACriB,EAAE,MAAM,MAAMgiB,GAAQ;CAC3B,IAAMlgB,IAAO,MAAMigB,GAAUzyB,GAAQ9D,GAAO,KAAK,IAAIwU,EAAE,MAAM2hB,EAAc,CAAC,GACxEO,IAAQ,IACRC,IAAQ;CACZ,KAAK,IAAM,CAACpxB,GAAGyK,MAAUsG,GACvB,KAAK,IAAMhO,KAAK0H,GACd,CAAI1H,EAAE,OAAO,MAAOA,EAAE,QACtB,IAAQ,KAAK,IAAIouB,GAAOnxB,CAAC,GACzB,IAAQ,KAAK,IAAIoxB,GAAOruB,EAAE,EAAE;CAGhC,IAAMwuB,IAAStiB,EAAE,OAAO,QAAQ,MAAMzK,EAAE,MAAM2sB,KAAS3sB,EAAE,MAAM4sB,CAAK;CACpE,KAAK,IAAM5sB,KAAK+sB,GAEd,AADA,IAAQ,KAAK,IAAIJ,GAAO,KAAK,IAAI3sB,EAAE,IAAI,KAAkB,CAAC,GAC1D,IAAQ,KAAK,IAAI4sB,GAAO5sB,EAAE,EAAE;CAE9B,IAAM0G,IAAiB,CAAC;CACxB,KAAK,IAAInI,IAAI,GAAGA,KAAKquB,GAAO,KAAK,AAAIniB,EAAE,QAAQ,KAAKlM,CAAC,IAAI,KAAGmI,EAAK,KAAKnI,CAAC;CACvE,IAAMyuB,oBAAU,IAAI,IAAmB,GACjCC,oBAAU,IAAI,IAAY,GAC1BrpB,KAAO,GAAW,MAAcpI,IAAI,QAAQ+C,GAE5C2uB,IAAS,IAAI,WAAWP,IAAQ,CAAC;CACvC,KAAK,IAAM3sB,KAAK+sB,GAAQ;EACtB,EAAQ,IAAInpB,EAAI5D,EAAE,IAAIA,EAAE,EAAE,GAAGA,CAAC;EAC9B,IAAM7J,IAAK,KAAK,IAAI6J,EAAE,IAAI2sB,CAAK;EAC/B,KAAK,IAAInxB,IAAIwE,EAAE,IAAIxE,KAAKrF,GAAI,KAAK,KAAK,IAAIoI,IAAIyB,EAAE,IAAIzB,KAAKyB,EAAE,IAAI,KAAK,CAAIxE,MAAMwE,EAAE,MAAMzB,MAAMyB,EAAE,OAAIitB,EAAQ,IAAIrpB,EAAIpI,GAAG+C,CAAC,CAAC;EACvH,AAAIpI,IAAK6J,EAAE,OACT,EAAOA,EAAE,KAAK,EAAE,IAChB,EAAO7J,IAAK,EAAE;CAElB;CACA,IAAMg3B,KAAa,GAAY,GAAW,MAAc;EACtD,IAAIj1B,IAAI;EACR,KAAK,IAAI,IAAI5B,GAAG,KAAKiJ,GAAG,KAAK,AAAI6tB,EAAK,KAAK,CAAC,IAAI,KAAG;EACnD,OAAO,KAAK,IAAI,GAAGl1B,CAAC;CACtB,GAEMm1B,IAASrB,GAAOha,EAAK,SAAS,UAAU,KAAK,GAC7Csb,IAAwB,CAAC,GAC3BC,IAAmB,CAAC,GACpBC,IAAU;CACd,KAAK,IAAIhyB,IAAI,GAAGA,KAAKmxB,GAAO,KAAK;EAE/B,AADA,KAAWO,EAAO1xB,IACd,CAACgyB,KAAWD,EAAI,UAAUlB,OAC5BiB,EAAO,KAAKC,CAAG,GACf,IAAM,CAAC;EAET,IAAMx0B,IAAI0R,EAAE,QAAQ,KAAKjP,CAAC;EAC1B,IAAI,CAACzC,GAAG;EACR,IAAMkN,IAAQ,IAAI,KAAKsG,EAAK,IAAI/Q,CAAC,KAAK,CAAC,EAAA,CAAG,KAAK,MAAM,CAAC+C,EAAE,IAAIA,CAAC,CAAC,CAAC,GACzDkvB,IAAmB,CAAC;EAiC1B,AAhCA/mB,EAAK,SAAS,GAAG,MAAM;GACrB,IAAIumB,EAAQ,IAAIrpB,EAAIpI,GAAG+C,CAAC,CAAC,GAAG;GAC5B,IAAM6H,IAAOH,EAAM,IAAI1H,CAAC,GAClByB,IAAIgtB,EAAQ,IAAIppB,EAAIpI,GAAG+C,CAAC,CAAC,GACzB,GAAGmvB,IAAM,IAAIC,IAAK,GAAG1iB,IAAO,GAAGnG,KAASsB,KAAQ,CAAC,GACjD,EAAE,cAAW,YAAYwnB,GAAM,eAAY,eAAY,GAAG9tB,MAAUkS,EAAK,OAAO2b,MAAO,CAAC,GAExF70B,KAAIkH,IAAIyK,EAAE,QAAQ,IAAI,KAAK,IAAIzK,EAAE,IAAI4sB,CAAK,IAAI,CAAC,IAAIniB,EAAE,QAAQ,IAAIzK,EAAE,EAAE,IAAIyK,EAAE,QAAQ,KAAKlM,CAAC,GACzF7J,KAAOuW,MAAS,KAAKyiB,IAAMzB,GAAUyB,GAAK50B,KAAI,GAAGkzB,GAAOlsB,EAAK,UAAUutB,CAAM,CAAC,IAAIK,GAClFlC,KAASqC,MAAyB5iB,MAAS,IAAI,UAAUA,MAAS,IAAI,WAAW,SAEjFzV,KAAOkR,EAAK1J,IAAI,IAChB8wB,KAAQ,CAAC,CAACp5B,MAAQ,CAACsL,KAAKwrB,OAAU,UAAU,CAACuC,MAAev4B,OAAS,KAAA,KAAc,CAACyQ,EAAM,IAAIzQ,EAAI,CAAC,GAAG,MAAM,CAACy3B,EAAQ,IAAIrpB,EAAIpI,GAAGhG,EAAI,CAAC,IAErI6W,IAAQ,EAAE,GAAGvM,EAAK;GACxB,AAAI0rB,OAAU,WAAQ,EAAM,YAAYA;GACxC,IAAMC,IAASoB,GAAOmB;GAItB,AAHIvC,KAAUA,MAAW,aAAU,EAAM,gBAAgBA,IACrDsC,MAAY,EAAM,aAAaA,IAC/BjpB,MAAO,EAAM,QAAQA,IACzB2oB,EAAI,KACF,kBAAC,MAAD;IAES;IACP,eAAa/4B,MAAQ,CAACo5B,KAAS7iB,MAAS,IAAI,MAAM,KAAM,KAAA;IACxD,SAASjL,IAAImtB,EAAU1iB,EAAE,SAASzK,EAAE,IAAI,KAAK,IAAIA,EAAE,IAAI4sB,CAAK,CAAC,IAAI,KAAA;IACjE,SAAS5sB,IAAImtB,EAAU1iB,EAAE,SAASzK,EAAE,IAAI,KAAK,IAAIA,EAAE,IAAI2sB,CAAK,CAAC,IAAI,KAAA;IAEhE,UAAAj4B;GACC,GAPG6J,CAOH,CACN;EACF,CAAC,GACDgvB,EAAI,KACF,kBAAC,MAAD;GAAY,OAAO,EAAE,QAAQx0B,EAAE;GAC5B,UAAA00B;EACC,GAFKjyB,CAEL,CACN;CACF;CACA,CAAI+xB,EAAI,UAAU,CAACD,EAAO,WAAQA,EAAO,KAAKC,CAAG;CAEjD,IAAMzlB,IAAQpB,EAAK,QAAQ,GAAG,MAAM5N,IAAI2R,EAAE,QAAQ,KAAKlM,CAAC,GAAG,CAAC,GACtD0vB,IAAYnmB,IAAQwkB,IACpBztB,IAAM,KAAK,IAAI,KAAM,KAAK,IAAI,IAAIovB,IAAY1B,KAAcD,MAAc,KAAK,IAAI,GAAGxkB,CAAK,CAAC,CAAC,GAC7FomB,IAAYzjB,EAAE,YAAY,iCAAiC,kBAC3D0jB,IAAa;EAAE;EAAO,GAAInc,EAAK;CAA2B,GAC1Doc,IACJ,kBAAC,YAAD,EAAA,UACG1nB,EAAK,KAAK,MACT,kBAAC,OAAD,EAAa,OAAO,EAAE,OAAO+D,EAAE,QAAQ,KAAKlM,CAAC,EAAE,EAAI,GAAzCA,CAAyC,CACpD,EACO,CAAA;CAYZ,OAAO;EACL,MAVA1M,kBAAC,OAAD;GAAK,WAAU;GAA8B,OAAO,EAAE,YAAYgN,EAAI;GACnE,UAAAyuB,EAAO,KAAK,GAAM,MACjB,kBAAC,SAAD;IAA0B;IAAW,OAAOa;IAA5C,UAAA,CACGC,GACD,kBAAC,SAAD,EAAA,UAAQvnB,EAAY,CAAA,CACf;GAHK,GAAApR,CAGL,CACR;EACE,CAGL;EACA,MAAMw4B,IAAY,cAAc;EAChC,QAAQ;EACR,QAAQxjB,EAAE,OAAO2hB,KAAiB,kBAAkBA,GAAe,eAAe,EAAE,sBAAsB,KAAA;CAC5G;AACF;;ACpKA,IAAMiC,KAAQ,KACRC,KAAK,IACLC,KAAgB,MAQhBC,KAAN,MAAiB;CACf,OAAO;CACP,OAAO;CACP,OAAO;CACP;CACA,SAAS;CACT,UAAU,IAAI5C,GAAK,EAAE;CACrB,UAAU,IAAIA,GAAK,EAAE;CACrB,SAAkB,CAAC;CACnB,SAAS;EAAE,MAAM;EAAG,MAAM;CAAE;CAC5B,YAAY;CACZ,yBAAS,IAAI,IAAyB;CACtC,2BAAW,IAAI,IAAY;CAE3B;CACA;AACF,GAEM6C,KAAN,MAAgB;CAOM;CANpB,yBAAS,IAAI,IAAwB;CAErC,YAAY;CACZ,4BAAoB,IAAI,IAAgB;CACxC;CAEA,YAAY,GAAgC;EAAxB,KAAA,SAAA10B;EAClB,IAAM4Z,IAAO,CACX5Z,EAAO,GAAG,kBAAkB,MAAM,KAAK,WAAWR,CAAC,CAAC,GAEpDQ,EAAO,GAAG,gBAAgB,MAAQ,KAAK,QAAQoQ,GAAKpQ,EAAO,KAAK,IAAoB,CAAC,CACvF;EACA,KAAK,YAAY4Z,EAAK,SAAS,MAAMrc,EAAE,CAAC;CAC1C;CAEA,UAAU,GAAgB;EAExB,OADA,KAAK,UAAU,IAAIoL,CAAE,SACR;GACX,KAAK,UAAU,OAAOA,CAAE;EAC1B;CACF;CAEA,OAAe;EACb,KAAK,IAAMA,KAAM,KAAK,WAAW,EAAG;CACtC;CAEA,MAAM,GAAuB;EAC3B,IAAI1J,IAAI,KAAK,OAAO,IAAIvD,CAAC;EAUzB,OATKuD,MACH,IAAI,IAAIw1B,GAAW,GACnB,KAAK,OAAO,IAAI/4B,GAAGuD,CAAC,GACpB,KAAK,OAAO,KAAK,aAAavD,CAAC,CAAC,CAAC,OAAO,MAAM;GAG5C,AAFA,EAAG,QAAS,EAAY,SACxB,EAAG,OAAO,IACV,KAAK,KAAK;EACZ,CAAC,IAEIuD;CACT;CAEA,WAAmB,GAAkB;EACnC,IAAMA,IAAI,KAAK,MAAMO,EAAE,KAAK;EAC5B,IAAIA,EAAE,gBAAgB,KAAA,KAAa,CAACP,EAAE,QAAQ;GAG5C,AAFA,EAAE,SAAS,IACX,EAAE,QAAQ,MAAMO,EAAE,eAAe,IACjC,EAAE,QAAQ,MAAMA,EAAE,eAAe;GACjC,KAAK,IAAMoO,KAAMpO,EAAE,WAAW,CAAC,GAAG,EAAE,QAAQ,SAASoO,EAAG,KAAKA,EAAG,KAAKA,EAAG,CAAC;GAEzE,AADA,EAAE,SAASpO,EAAE,UAAUP,EAAE,QACzB,EAAE,YAAYO,EAAE,aAAa;EAC/B;EACA,KAAK,IAAM,CAACiC,GAAGuwB,MAAOxyB,EAAE,UAAU,EAAE,QAAQ,IAAIiC,GAAGuwB,CAAE;EAOrD,AANIxyB,EAAE,UAAQP,EAAE,OAAO,MAAM,GAC7B,EAAE,OAAO,KAAK,IAAIA,EAAE,MAAMO,EAAE,IAAI,GAChC,EAAE,OAAO,KAAK,IAAIP,EAAE,MAAMO,EAAE,IAAI,GAC5BA,EAAE,WAAQ,EAAE,SAASA,EAAE,SACvBA,EAAE,UAAO,EAAE,QAAQA,EAAE,QACzB,EAAE,OAAOA,EAAE,MACX,KAAK,KAAK;CACZ;CAEA,OAAO,GAAe,GAAY,GAAY;EAC5C,IAAMP,IAAI,KAAK,MAAM/C,CAAK;EAC1B,IAAK+C,EAAE,UAAWA,EAAE,MACpB,KAAK,IAAIuG,IAAI,KAAK,MAAMrJ,IAAKm4B,EAAK,GAAG9uB,KAAK,KAAK,MAAMpJ,IAAKk4B,EAAK,GAAG,KAAK;GACrE,IAAMK,IAAS11B,EAAE,OAAO,IAAIuG,CAAC;GAG7B,IAFIvG,EAAE,SAAS,IAAIuG,CAAC,KAChBmvB,MAAWA,EAAO,YAAaA,EAAO,WAAW11B,EAAE,QAAQ,CAACA,EAAE,SAC9DuG,IAAI8uB,KAAQr1B,EAAE,QAAQ,CAACA,EAAE,QAAQ01B,GAAQ;GAC7C,EAAE,SAAS,IAAInvB,CAAC;GAChB,IAAMovB,IAAS31B,EAAE;GACjB,KAAK,OACF,KAAK,cAAc/C,GAAOsJ,IAAI8uB,KAAQ9uB,IAAI,KAAK8uB,EAAK,CAAC,CACrD,MAAM,MAAQ;IACb,IAAMxnB,oBAAO,IAAI,IAAuB;IACxC,KAAK,IAAMrL,KAAK2O,EAAI,MAAM,EAAK,IAAI3O,EAAE,GAAGA,EAAE,KAAK;IAE/C,IADAxC,EAAE,OAAO,IAAIuG,GAAG;KAAE;KAAM,UAAU4K,EAAI;KAAU;IAAO,CAAC,GACpDnR,EAAE,OAAO,OAAO,KAAK;KACvB,IAAM41B,IAAW51B,EAAE,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;KACxC,EAAE,OAAO,OAAO41B,CAAQ;IAC1B;GACF,CAAC,CAAC,CACD,YAAY,CAAC,CAAC,CAAC,CACf,cAAc;IAEb,AADA51B,EAAE,SAAS,OAAOuG,CAAC,GACnB,KAAK,KAAK;GACZ,CAAC;EACL;CACF;CAGA,WAAW,GAAe,GAAY,GAAY;EAChD,IAAMvG,IAAI,KAAK,MAAM/C,CAAK;EAC1B,KAAK,IAAIsJ,IAAI,KAAK,MAAMrJ,IAAKm4B,EAAK,GAAG9uB,KAAK,KAAK,MAAMpJ,IAAKk4B,EAAK,GAAG,KAAK,EAAE,OAAO,OAAO9uB,CAAC;EAExF,AADA,EAAE,OAAO,KAAK,IAAIvG,EAAE,MAAM7C,IAAK,CAAC,GAChC,KAAK,KAAK;CACZ;CAGA,QAAQ,GAA4B,GAAoB;EACtD,IAAI,CAACgU,GAAK;EACV,KAAK,IAAMlF,KAAMkF,EAAI,UAAU,CAAC,GAE9B,AADA,EAAK,OAAOlF,EAAG,SAASA,EAAG,KAC3B,EAAK,QAAQA,EAAG,SAASA,EAAG;EAE9B,KAAK,IAAMxP,KAAK0U,EAAI,UAAU,CAAC,GAAG,KAAK,OAAO,IAAI1U,CAAC,CAAC,EAAE,OAAO,MAAM;EACnE,IAAI0U,EAAI,QAAQ;GAGd,AAFA,EAAK,SAASA,EAAI,QAClB,KAAK,OAAO,MAAM,GAClB,KAAK,KAAK;GACV;EACF;EACA,IAAMnR,IAAI,KAAK,MAAMmR,EAAI,KAAK;EAC9B,IAAIA,EAAI,QAAQ;GACd,IAAMM,IAAIN,EAAI;GAEd,AADA,EAAE,UAAU,IAAIyhB,GAAKnhB,EAAE,eAAezR,EAAE,QAAQ,GAAG,GACnD,EAAE,UAAU,IAAI4yB,GAAKnhB,EAAE,eAAezR,EAAE,QAAQ,GAAG;GACnD,KAAK,IAAM2O,KAAM8C,EAAE,WAAW,CAAC,GAAG,EAAE,QAAQ,SAAS9C,EAAG,KAAKA,EAAG,KAAKA,EAAG,CAAC;GACzE,KAAK,IAAM,CAACnM,GAAGuwB,MAAOthB,EAAE,UAAU,EAAE,QAAQ,IAAIjP,GAAGuwB,CAAE;GAOrD,AANA,EAAE,SAASthB,EAAE,UAAU,CAAC,GACxB,EAAE,SAASA,EAAE,UAAUzR,EAAE,QACrByR,EAAE,cAAc,KAAA,MAAW,EAAE,YAAYA,EAAE,YAC/C,EAAE,OAAOA,EAAE,MACX,EAAE,OAAOA,EAAE,MACXzR,EAAE,OAAO,MAAM,GACf,KAAK,KAAK;EAEZ,OAEA,AADA,EAAE,OAAO,KAAK,IAAIA,EAAE,MAAMmR,EAAI,MAAM,KAAK,CAAC,GAC1C,KAAK,WAAWA,EAAI,OAAOA,EAAI,MAAM,IAAIA,EAAI,MAAM,EAAE;CACvD;CAEA,IAAI,GAAe,GAAkC;EACnD,OAAO,KAAK,OAAO,IAAIlU,CAAK,CAAC,EAAE,OAAO,IAAI,KAAK,MAAMuF,IAAI6yB,EAAK,CAAC,CAAC,EAAE,KAAK,IAAI7yB,CAAC;CAC9E;CAEA,UAAU;EAER,AADA,KAAK,IAAI,GACT,KAAK,UAAU,MAAM;CACvB;AACF,GAEMqzB,qBAAS,IAAI,QAAmC;AACtD,SAASC,GAAS,GAAwB;CACxC,IAAI91B,IAAI61B,GAAO,IAAI90B,CAAM;CAEzB,OADKf,KAAG61B,GAAO,IAAI90B,GAAS,IAAI,IAAI00B,GAAU10B,CAAM,CAAE,GAC/Cf;AACT;AAQA,SAAgB+1B,GAAS,EAAE,WAAQ,aAAU,mBAA+B;CAC1E,IAAM/c,IAAOjY,EAAO,KAAK,MACnB6W,IAAUoB,EAAK,OAAO,QAAQ,MAAM,CAAChZ,EAAE,MAAM,GAC7C,CAAC6B,GAAQm0B,KAAar2B,EAASs2B,KAAgBre,EAAQ,EAAE,EAAE,SAAS,CAAC,GACrEse,IAAQ1c,SAAcsc,GAAS/0B,CAAM,GAAG,CAACA,CAAM,CAAC,GAChD,GAAG5B,KAAQF,GAAe;CAChC,QAAgBi3B,EAAM,UAAU/2B,CAAI,GAAG,CAAC+2B,GAAO/2B,CAAI,CAAC;CACpD,IAAMmyB,IAAQ4E,EAAM,MAAMr0B,CAAM,GAE1B4a,IAAS6U,EAAM,QACjB,UAAUA,EAAM,UAChB,GAAGA,EAAM,KAAK,eAAe,EAAE,UAAUA,EAAM,KAAK,eAAe,EAAE,OAAOA,EAAM,OAAO,KAAK,iBAE5FxY,IAAS1P,GAAU;CACzB,GAAW;EACT,iBAAiB0qB,GAAe/yB,GAAQmE,GAAKgxB,EAAM,MAAMhxB,CAAG,GAAG8T,CAAI;EACnE,OAAO,MAAW0a,GAAU3yB,GAAQmE,GAAKgxB,EAAM,MAAMhxB,CAAG,GAAGwY,MAAW,QAAQ,MAAO,GAAG;EACxF,aAAa;GACX,IAAM1d,IAAIk2B,EAAM,MAAMhxB,CAAG;GACzB,OAAO;IACL,CAAC,UAAU,GAAG8T,EAAK,OAAO,SAASA,EAAK,OAAO,MAAM,MAAM3Z,EAAE,MAAM,IAAI,KAAK2Z,EAAK,OAAO,QAAQ,MAAM3Z,EAAE,MAAM,CAAC,CAAC,OAAO,YAAY,IAAI;IACvI,CAAC,iBAAiB2Z,EAAK,OAAO9T,EAAI,EAAE,QAAQ,EAAE;IAC9C,CAAC,cAAc,GAAGlF,EAAE,KAAK,eAAe,EAAE,UAAUA,EAAE,KAAK,eAAe,EAAE,UAAUA,EAAE,OAAO,KAAK,cAAc;GACpH;EACF;EACA,aAAa,OAAO,GAAM,MAAS;GACjC,IAAMmR,IAAM,MAAMpQ,EAAO,KAAK,eAAe;IAAE,IAAI;IAAO;IAAM,OAAOmE;GAAI,CAAC;GAE5E,AADAgxB,EAAM,QAAQ/kB,GAAK6H,CAAI,GACvBF,EAAO,SAAS,EAAI;GACpB,IAAMlI,IAAM1L,IAAM;GAGlB,AAFA8wB,EAAUplB,CAAG,GAEb,MAAM,IAAI,SAAe,GAAS,MAAW;IAC3C,IAAI4e,UAAY,CAAC,GACXjsB,UAAc;KAClB,IAAMvD,IAAIk2B,EAAM,MAAMtlB,CAAG;KACzB,IAAI5Q,EAAE,OAAO,EAAW,MAAMA,EAAE,KAAK,CAAC;UACjC,IAAIA,EAAE,MAAM,EAAQ;UACpB;KACL,EAAI;IACN;IAEA,AADA,IAAMk2B,EAAM,UAAU3yB,CAAK,GAC3BA,EAAM;GACR,CAAC;GACD,IAAM0J,IAAqB,CAAC;GAG5B,AAFAY,EAAK,SAAS,GAAK,MAAMI,EAAI,SAAS,GAAO,MAAMnF,MAAU,MAAMmE,EAAM,KAAK;IAAE;IAAG;IAAG;GAAM,CAAC,CAAC,CAAC,GAC3FA,EAAM,UAAQipB,EAAM,QAAQ,MAAMn1B,EAAO,KAAK,YAAY6P,GAAK3D,CAAK,GAAG+L,CAAI,GAC/E7Z,EAAK;EACP;CACF,CAAC;CACD,IAAM,CAACg3B,GAAUC,KAAez2B,EAAwB,IAAI,GACtD,CAAC02B,GAASC,KAAc32B,EAAyD,IAAI,GACrF42B,IAAS,OAAO,GAAY,MAAkB;EAClD,IAAI;GACF,IAAMplB,IAAM,MAAMpQ,EAAO,KAAK,eAAemQ,CAAE;GAI/C,AAHAglB,EAAM,QAAQ/kB,GAAK6H,CAAI,GACvBF,EAAO,SAAS,EAAI,GAChBuX,MAAS,KAAA,KAAW2F,EAAU,KAAK,IAAI,GAAG,KAAK,IAAI3F,GAAMrX,EAAK,OAAO,SAAS,CAAC,CAAC,CAAC,GACrF7Z,EAAK;EACP,SAAS,GAAG;GACV,GAAW,CAAC;EACd;CACF,GACM+F,IAAM,KAAK,IAAIrD,GAAQmX,EAAK,OAAO,SAAS,CAAC,GAC7C,CAAC+R,GAAMyL,KAAW72B,EAA2B,IAAI,GAEjD82B,IAAOj3B,EAAO,EAAK,GACnBk3B,IAAc,CAAC,CAAC3L,KAAQtvB,GAAUsvB,EAAK,KAAK,KAAK4L,GAAS5L,GAAMlvB,GAAekvB,EAAK,OAAOA,EAAK,KAAK,CAAC;CAE5G,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,kBAAChhB,IAAD;IAAQ,MAAM0S;IAAkB;GAAW,CAAA;GAC3C,kBAACma,IAAD;IAES;IACP,OAAO1xB;IACD;IACE;IACF;IACG;IACH;IACN,SAAS8wB;GACV,GATM,GAAG9wB,EAAI,GAAG8T,EAAK,OAAO9T,EAAI,EAAE,MASlC;GACD,kBAAC,OAAD;IAAK,WAAU;IAAU,MAAK;IAA9B,UAAA,CACG4T,EAAO,YACN,kBAAC,UAAD;KAAQ,MAAK;KAAS,WAAU;KAAoB,OAAM;KAAY,eAAe,KAAKyd,EAAO;MAAE,IAAI;MAAO,OAAOrxB;KAAI,GAAGA,IAAM,CAAC;KAAG,UAAA;IAE9H,CAAA,GAET8T,EAAK,OAAO,QAAQ,MAAM,CAAChZ,EAAE,MAAM,CAAC,CAAC,KAAK,MACzCm2B,MAAan2B,EAAE,QACb,kBAAC,SAAD;KAEE,WAAU;KACV,WAAA;KACA,cAAcA,EAAE;KAChB,SAAS,MAAM;MAEb,AADAo2B,EAAY,IAAI,GACZ96B,EAAE,OAAO,MAAM,KAAK,KAAKA,EAAE,OAAO,UAAU0E,EAAE,QAAMu2B,EAAY;OAAE,IAAI;OAAU,OAAOv2B,EAAE;OAAO,MAAM1E,EAAE,OAAO;MAAM,CAAC;KAC5H;KACA,YAAY,MAAM;MAEhB,AADI,EAAE,QAAQ,WAAS,EAAG,OAA4B,KAAK,GACvD,EAAE,QAAQ,YAAU86B,EAAY,IAAI;KAC1C;IACD,GAZMp2B,EAAE,KAYR,IAED,kBAAC,UAAD;KAEE,MAAK;KACL,MAAK;KACL,WAAU;KACV,iBAAeA,EAAE,UAAUkF;KAC3B,cAAc,MAAM;MAElB,AAAKwxB,MACLp7B,EAAE,eAAe,GACb0E,EAAE,UAAUkF,MAAK,EAAK,UAAU;KACtC;KACA,eAAe8wB,EAAUh2B,EAAE,KAAK;KAChC,qBAAqB8Y,EAAO,YAAYsd,EAAYp2B,EAAE,KAAK;KAC3D,gBAAgB,MAAM;MACpB,AAAK8Y,EAAO,aACZxd,EAAE,eAAe,GACjBg7B,EAAW;OAAE,OAAOt2B,EAAE;OAAO,GAAG1E,EAAE;OAAS,GAAGA,EAAE;MAAQ,CAAC;KAC3D;KAEC,UAAA0E,EAAE;IACG,GApBDA,EAAE,KAoBD,CAEZ,CACG;;GACJq2B,KACC,kBAAC9rB,IAAD;IACE,GAAG8rB,EAAQ;IACX,GAAGA,EAAQ;IACX,eAAeC,EAAW,IAAI;IAC9B,OAAO;KACL;MAAE,OAAO;MAAU,WAAWF,EAAYC,EAAQ,KAAK;KAAE;KACzD;MAAE,OAAO;MAA8B,WAAW,KAAKE,EAAO;OAAE,IAAI;OAAO,OAAOF,EAAQ;OAAO,MAAMrd,EAAK,OAAOqd,EAAQ,MAAM,CAAC,OAAO;MAAO,GAAGA,EAAQ,QAAQ,CAAC;KAAE;KACtK;MAAE,OAAO;MAAa,UAAUA,EAAQ,UAAU;MAAG,WAAW,KAAKE,EAAO;OAAE,IAAI;OAAQ,MAAMF,EAAQ;OAAO,IAAIA,EAAQ,QAAQ;MAAE,GAAGA,EAAQ,QAAQ,CAAC;KAAE;KAC3J;MAAE,OAAO;MAAc,UAAUA,EAAQ,SAASrd,EAAK,OAAO,SAAS;MAAG,WAAW,KAAKud,EAAO;OAAE,IAAI;OAAQ,MAAMF,EAAQ;OAAO,IAAIA,EAAQ,QAAQ;MAAE,GAAGA,EAAQ,QAAQ,CAAC;KAAE;KAChL;MAAE,OAAO;MAAgB,UAAUrd,EAAK,OAAO,UAAU;MAAG,WAAW,KAAKud,EAAO;OAAE,IAAI;OAAU,OAAOF,EAAQ;MAAM,GAAG,KAAK,IAAI,GAAGA,EAAQ,QAAQ,CAAC,CAAC;KAAE;IAC7J;GACD,CAAA;EAEA;;AAET;AAEA,SAASQ,GAAW,GAAY;CAC9B,QAAQ,MAAM,mBAAmB,CAAC;AACpC;AAgBA,SAASC,GAAQ,GAA4B;CAI3C,OAHI7M,MAAQ,MAAY;EAAE,aAAa;EAAe,iBAAiB;EAAW,YAAY;CAAS,IACnGA,MAAQ,KAAW;EAAE,aAAa;EAAe,WAAW;EAAkB,YAAY;CAAS,IACnGA,MAAQ,MAAY;EAAE,aAAa;EAAe,YAAY;CAAS,IACpE;EAAE,SAAS;EAAgB,WAAW,UAAU,CAACA,EAAI;EAAO,YAAY;CAAS;AAC1F;AAEA,IAAM8M,KAAkC;CAAE,QAAQ;CAAU,OAAO;CAAY,MAAM;CAAc,SAAS;AAAa;AA+BzH,SAASJ,GAAS,GAAc,GAAoC;CAIlE,OAHKK,IACD,EAAE,SAAS,EAAE,MAAM,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,WAAiB,KACnE,EAAE,UAAU,EAAE,WACXA,EAAG,YADyBA,EAAG,KAAK,MAAM,MAAMx0B,EAAE,MAAM,EAAE,SAASA,EAAE,MAAM,EAAE,QAAQ,IAF5E;AAIlB;AAEA,IAAMy0B,KAAa;CAAC;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;AAAS,GACpGC,MAAU,MAAcj7B,EAAE,QAAQ,OAAO,EAAE,CAAC,CAAC,YAAY,GAEzDk7B,KAA2C;CAAE,SAAS,CAAC,IAAI,CAAC;CAAG,WAAW,CAAC,GAAG,CAAC;CAAG,WAAW,CAAC,GAAG,EAAE;CAAG,YAAY,CAAC,GAAG,CAAC;AAAE,GAElHC,MAAU,OAAyB;CAAE,IAAI,KAAK,IAAIp3B,EAAE,IAAIA,EAAE,EAAE;CAAG,IAAI,KAAK,IAAIA,EAAE,IAAIA,EAAE,EAAE;CAAG,IAAI,KAAK,IAAIA,EAAE,IAAIA,EAAE,EAAE;CAAG,IAAI,KAAK,IAAIA,EAAE,IAAIA,EAAE,EAAE;AAAE;AAGzJ,SAAgBq3B,GAAW,GAAU,GAAwB;CAC3D,IAAIv7B,IAAM0G;CACV,KAAK,IAAI8M,IAAU,IAAMA,IAAW;EAClC,IAAU;EACV,KAAK,IAAMtI,KAAK+sB,GACd,AAAI/sB,EAAE,KAAKlL,EAAI,MAAMkL,EAAE,KAAKlL,EAAI,MAAMkL,EAAE,KAAKlL,EAAI,MAAMkL,EAAE,KAAKlL,EAAI,MAC9DkL,EAAE,MAAMlL,EAAI,MAAMkL,EAAE,MAAMlL,EAAI,MAAMkL,EAAE,MAAMlL,EAAI,MAAMkL,EAAE,MAAMlL,EAAI,OACtE,IAAM;GAAE,IAAI,KAAK,IAAIA,EAAI,IAAIkL,EAAE,EAAE;GAAG,IAAI,KAAK,IAAIlL,EAAI,IAAIkL,EAAE,EAAE;GAAG,IAAI,KAAK,IAAIlL,EAAI,IAAIkL,EAAE,EAAE;GAAG,IAAI,KAAK,IAAIlL,EAAI,IAAIkL,EAAE,EAAE;EAAE,GACvH,IAAU;CAEd;CACA,OAAOlL;AACT;AAEA,SAAS86B,GAAU,EAAE,UAAO,UAAO,SAAM,WAAQ,SAAM,YAAS,SAAM,cAAsB;CAC1F,IAAM9d,IAAS1P,GAAU,GACnByO,IAAWiB,EAAO,UAClB9Y,IAAIk2B,EAAM,MAAMj5B,CAAK,GACrB,CAACoc,GAAW5Z,KAAQH,GAAwB,GAC5Cga,IAASpZ,GAAUmZ,CAAS,GAC5B,CAAC7V,GAAK8zB,KAAe33B,QAA0BK,EAAE,OAAO;EAAE,IAAI;EAAG,IAAI;EAAG,IAAI;EAAG,IAAI;CAAE,CAAC;CAC5F,EAAE,MAAMwD;CACR,IAAM,CAAC+zB,GAAaC,KAAa73B,EAA0D,IAAI,GACzF83B,IAASF,KAAeA,EAAY,MAAM/zB,EAAI,MAAM+zB,EAAY,MAAM/zB,EAAI,KAAK+zB,EAAY,IAAI,KAAA,GAC/F,CAACG,GAAYC,KAAiBh4B,EAAS,CAAC,GACxCi4B,KAAWp4B,EAAO,EAAK,GACvBq4B,KAAUr4B,EAA4B,IAAI,GAC1Cs4B,KAAQt4B,EAAuB,IAAI,GACnCu4B,KAAQv4B,EAAyB,IAAI,GACrC,CAACw4B,GAAQC,KAAat4B,EAAS,CAAC,GAChC,CAAC0X,IAAK6gB,MAAUv4B,EAA0C,IAAI,GAE9D,CAACya,IAASC,KAAc1a,EAAwB,IAAI,GACpDw4B,KAAY34B,EAA4B,IAAI,GAC5C,CAACka,GAAMC,KAAWha,EAAoF;EAAE,MAAM;EAAO,GAAG;EAAI,KAAK;EAAG,SAAS;EAAO,MAAM;CAAE,CAAC,GAC7J,CAACy4B,IAAUC,MAAe14B,EAAsB,CAAC,CAAC,GAClD,CAACsd,GAASqb,MAAc34B,EAAsB,CAAC,CAAC,GAChD,CAACqa,IAAOC,MAAYta,EAAwB,IAAI,GAChD,CAAC8a,GAAU8d,MAAe54B,EAAiF,IAAI,GAE/G,EAAE,YAAS,YAAS,cAAWK,GAC/Bw4B,IAAK,KAAK,IAAI,IAAI,KAAK,IAAI,OAAO,KAAK,IAAIx4B,EAAE,MAAM,GAAI,CAAC,CAAC,CAAC,MAAM,GAChEy4B,KAAQ,KAAK,IAAI,GAAGh5B,EAAK,IAAI+4B,CAAE,GAC/BE,KAAQ,KAAK,IAAI,GAAGj5B,EAAK,IAAI61B,EAAE;CAErC,AADA,EAAQ,QAAQ,KAAK,IAAIt1B,EAAE,QAAQA,EAAE,OAAO,KAAK,IAAI,KAAK,KAAK04B,KAAQC,EAAQ,GAAG,IAAI,GAAGC,EAAO,OAAO,GAAGp1B,EAAI,KAAK,CAAC,GACpH,EAAQ,QAAQ,KAAK,IAAIxD,EAAE,OAAO,GAAG,IAAI,KAAK,KAAKy4B,KAAQ,KAAK,IAAI,GAAGI,EAAQ,GAAG,CAAC,IAAI,GAAGD,EAAO,OAAO,GAAGp1B,EAAI,KAAK,CAAC;CACrH,IAAMs1B,KAAUD,EAAQ,IAAID,EAAO,IAAI,GACjCG,KAAUJ,EAAQ,IAAIC,EAAO,IAAI,GACjCzc,KAAS0c,EAAQ,MAAM,GACvB3c,KAASyc,EAAQ,MAAM,GAGvBK,KAAUR,IAAKrc,IACf8c,IAAU,KAAK,IAAI3D,KAAKpZ,IAAQqZ,EAAa,GAC7C2D,IAAc,KAAK,IAAI,GAAG5D,KAAKpZ,KAASzc,EAAK,CAAC,GAC9C05B,KAAa,KAAK,IAAI,GAAGF,IAAUx5B,EAAK,CAAC,GACzC25B,KAAUD,KAAa,IAAI,KAAK,IAAID,GAAc5f,EAAO,IAAI6f,KAAcD,CAAW,IAAI,GAC1FG,IAAU/f,EAAO,GAEjBggB,IAASR,KAAUO,GACnBE,IAASR,KAAUK,IACnBI,IAAQ,KAAK,IAAI,GAAGf,KAAQK,EAAO,GACnCW,KAAQ,KAAK,IAAI,GAAGf,KAAQK,EAAO,GACnC77B,KAAKy7B,EAAQ,MAAMY,CAAM,GACzBp8B,KAAK,KAAK,IAAIw7B,EAAQ,QAAQ,GAAGA,EAAQ,MAAMY,IAASE,EAAK,CAAC,GAC9Dr8B,KAAKy7B,EAAQ,MAAMS,CAAM,GACzBj8B,KAAK,KAAK,IAAIw7B,EAAQ,QAAQ,GAAGA,EAAQ,MAAMS,IAASE,CAAK,CAAC,GAG9DE,KAAYlgB,SAGTxZ,EAAE,OAAO,QAFC,MACdgH,EAAE,MAAM9J,MAAM8J,EAAE,MAAM7J,MAAO6J,EAAE,KAAK4xB,EAAO,OAAQ5xB,EAAE,MAAM5J,MAAM4J,EAAE,MAAM3J,MAAO2J,EAAE,KAAK4xB,EAAO,OAAO,EAC1E,GAC7B;EAAC54B,EAAE;EAAQ9C;EAAIC;EAAIC;EAAIC;EAAIu7B,EAAO;EAAMA,EAAO;CAAI,CAAC;CAQvD,AANA75B,QAAgB;EAEd,AADI65B,EAAO,QAAM1C,EAAM,OAAOj5B,GAAO,GAAG27B,EAAO,OAAO,CAAC,GACvD1C,EAAM,OAAOj5B,GAAO,KAAK,IAAI,GAAGC,KAAK,EAAE,GAAGC,KAAK,EAAE;EACjD,KAAK,IAAM6J,KAAK0yB,IAAW,AAAI1yB,EAAE,KAAK9J,MAAIg5B,EAAM,OAAOj5B,GAAO+J,EAAE,IAAIA,EAAE,EAAE;CAC1E,CAAC,GAEDjI,QAAgB;EACd,IAAI+B,IAAO,IACL,EAAE,OAAI,UAAO0C;EAEnB,OADAzC,EAAO,KAAK,aAAa9D,GAAO08B,GAAIC,CAAE,CAAC,CAAC,MAAM,MAAM94B,KAAQ02B,EAAU;GAAE,GAAGmC;GAAI,GAAGC;GAAI;EAAE,CAAC,SAAS,CAAC,CAAC,SACvF;GACX,IAAO;EACT;CACF,GAAG;EAAC74B;EAAQ9D;EAAOuG,EAAI;EAAIA,EAAI;EAAIxD,EAAE;EAAM03B;CAAU,CAAC;CAEtD,IAAM3iB,KAASiE,EAAK,QACdqb,KAASrB,GAAOha,EAAK,SAAS,UAAU,KAAK,GAC7C6gB,MAAW,GAAW,MAAc75B,EAAE,OAAO,MAAM,MAAMwC,KAAKwE,EAAE,MAAMxE,KAAKwE,EAAE,MAAMzB,KAAKyB,EAAE,MAAMzB,KAAKyB,EAAE,EAAE,GACzGmW,IAAOka,GAAWD,GAAO5zB,CAAG,GAAGxD,EAAE,MAAM,GAEvC85B,KAAW3c,EAAK,OAAOA,EAAK,MAAMA,EAAK,OAAOA,EAAK,MAAOnd,EAAE,OAAO,MAAM,MAAMgH,EAAE,OAAOmW,EAAK,MAAMnW,EAAE,OAAOmW,EAAK,MAAMnW,EAAE,OAAOmW,EAAK,MAAMnW,EAAE,OAAOmW,EAAK,EAAE,GAC3JuT,KAASlxB,EAAO2d,CAAI;CAG1B,AAFA,GAAO,UAAUA,GAEjBpe,QAAgB/E,EAAa+G,GAAQ;EAAE;EAAO,OAAOoc;EAAM,IAAI3Z,EAAI;EAAI,IAAIA,EAAI;CAAG,CAAC,GAAG;EAACzC;EAAQ9D;EAAOkgB,EAAK;EAAIA,EAAK;EAAIA,EAAK;EAAIA,EAAK;EAAI3Z,EAAI;EAAIA,EAAI;CAAE,CAAC;CACzJ,IAAMu2B,KAAQlyB,IACX,MAAOlN,GAAeoG,GAAQ2I,CAAE,SAC3BzP,EAAS8G,CAAM,CACvB,GACMi5B,KAAYhhB,EAAK,OAAO/b,EAAM,EAAE,MAChCg9B,KAAWF,GAAM,SAAS,MAAM;EACpC,IAAM16B,IAAIkB,EAAE;EACZ,OAAOlB,GAAG,MAAM,UAAUA,EAAE,UAAU26B,MAAa36B,EAAE,QAAQ,CAAC;GAAE,GAAGkB;GAAG,OAAOlB,EAAE;GAAO,IAAIA,EAAE,MAAMA,EAAE,MAAM;GAAI,IAAIA,EAAE,MAAMA,EAAE,MAAM;EAAG,CAAC,IAAI,CAAC;CAC7I,CAAC;CAED,QAAsB;EACpB,EAAK,UAAU;EACf,IAAMO,IAAKyZ,EAAU;EASrB,OARIzZ,KAAMI,EAAE,cACV,EAAG,aAAaA,EAAE,UAAU,GAC5B,EAAG,YAAYA,EAAE,UAAU,IAEzBk2B,EAAM,aACR,EAAM,YAAY,IAClBt2B,GAAI,MAAM,EAAE,eAAe,GAAK,CAAC,KAC5B+B,GAAW/B,KAAM,IAAI,SACf;GACX,AAAIA,GAAI,gBAAa,EAAE,YAAY;IAAE,GAAGA,EAAG;IAAY,GAAGA,EAAG;GAAU;EACzE;CACF,GAAG,CAAC,CAAC;CAEL,IAAMs6B,MAAU,MAAoB;EAClC,IAAMlzB,IAAI6yB,GAAQr9B,EAAK,IAAIA,EAAK,EAAE;EAElC,AADIwK,MAAG,IAAO;GAAE,GAAGxK;GAAM,IAAIwK,EAAE;GAAI,IAAIA,EAAE;EAAG,IAC5CswB,EAAY96B,CAAI;CAClB;CAIA,SAAS29B,GAAO,GAAa,GAAa,GAAa,GAAa,GAAa,GAAY,GAAY,GAAc,GAAa,GAAW,GAAW;EACxJ,IAAIr6B,KAAK,KAAKC,KAAK,KAAKq6B,IAAMC,KAAOC,IAAMC,GAAK,OAAO;EACvD,IAAMz+B,IAAmB,CAAC;EAC1B,IAAIkE,EAAE,WAAW;GACf,KAAK,IAAIwC,IAAI63B,GAAK73B,KAAK43B,GAAK,KAAK,EAAI,KAAK,kBAAC,OAAD;IAAmB,WAAU;IAAU,OAAO,EAAE,KAAKzB,EAAQ,IAAIn2B,IAAI,CAAC,IAAIg4B,IAAK,EAAE;GAAI,GAA3E,MAAMh4B,CAAqE,CAAC;GAChI,KAAK,IAAI+C,IAAIg1B,GAAKh1B,KAAK+0B,GAAK,KAAK,EAAI,KAAK,kBAAC,OAAD;IAAmB,WAAU;IAAU,OAAO,EAAE,MAAMzB,EAAQ,IAAItzB,IAAI,CAAC,IAAIk1B,IAAK,EAAE;GAAI,GAA5E,MAAMl1B,CAAsE,CAAC;EACnI;EACA,IAAM0uB,oBAAU,IAAI,IAAY,GAC1BD,IAAmB,CAAC;EAC1B,KAAK,IAAMhtB,KAAK0yB,IACd,IAAI,IAAE,KAAKW,KAAOrzB,EAAE,KAAKozB,KAAOpzB,EAAE,KAAKuzB,KAAOvzB,EAAE,KAAKszB,IACrD;KAAQ,KAAKtzB,CAAC;GACd,KAAK,IAAIxE,IAAI,KAAK,IAAIwE,EAAE,IAAIqzB,CAAG,GAAG73B,KAAK,KAAK,IAAIwE,EAAE,IAAIozB,CAAG,GAAG,KAC1D,KAAK,IAAI70B,IAAI,KAAK,IAAIyB,EAAE,IAAIuzB,CAAG,GAAGh1B,KAAK,KAAK,IAAIyB,EAAE,IAAIszB,CAAG,GAAG,KAAK,EAAQ,IAAI93B,IAAI,QAAQ+C,CAAC;EAF9E;EAIhB,IAAMm1B,KAAU,GAAW,GAAe,GAAoB,GAAoB,GAAsB,IAAS,OAAU;GACzH,IAAM,CAACn1B,GAAGmvB,GAAKC,GAAI1iB,GAAMnG,KAASsB,GAC5B8lB,IAAKyH,KAAa9B,EAAQ,KAAKtzB,CAAC,GAChCub,IAAK8Z,KAAajC,EAAQ,KAAKn2B,CAAC;GACtC,IAAI,CAAC0wB,KAAM,CAACpS,GAAI,OAAO;GACvB,IAAMzY,IAAO0M,GAAO4f,MAAO,CAAC,GACxBj5B,IAAOg5B;GACX,AAAIziB,MAAS,KAAKyiB,MAAK,IAAOzB,GAAUyB,GAAKxB,IAAK,GAAGF,GAAO3qB,EAAI,UAAUgsB,EAAM,CAAC;GACjF,IAAM,EAAE,cAAW,eAAY,eAAY,eAAY,GAAGvtB,MAASuB,GAC7D4hB,IAAM,OAAO4Q,KAAc,CAAC,GAC5BC,IAAWjG,KAAakC,GAAQlC,OAA0B5iB,MAAS,IAAI,aAAaA,MAAS,IAAI,WAAW,eAC9G8oB,KAAK;GACT,IAAIr/B,KAAQ,CAACuuB,KAAO,CAAC8K,KAAc+F,MAAY,gBAAgB,CAACE,KAAUC,GAAQ;IAChF,IAAIz+B,IAAO+I,IAAI;IACf,OAAO/I,KAAQ89B,IAAM,KAAK,CAACW,EAAO,IAAIz+B,CAAI,KAAK,CAACy3B,EAAQ,IAAIzxB,IAAI,QAAQhG,CAAI,IAAG;IAC/E,KAAKq8B,EAAQ,IAAIr8B,CAAI,IAAIq8B,EAAQ,IAAItzB,CAAC;GACxC;GACA,IAAM8N,KAAuB;IAC3B,GAAIvM;IACJ,MAAM+xB,EAAQ,IAAItzB,CAAC,IAAIk1B;IACvB,KAAK9B,EAAQ,IAAIn2B,CAAC,IAAIg4B;IACtB,OAAOtH;IACP,QAAQpS;IACR,gBAAgBga;IAChB,YAAa9F,KAAyB;IACtC,WAAYH,KAA4C,KAAA;GAC1D;GAIA,AAHI/oB,MAAO,GAAM,QAAQA,IACrBipB,MAAY,GAAM,aAAaA,IAE/BiG,KAAU,CAACl0B,EAAK,eAAY,GAAM,aAAa;GACnD,IAAMo0B,KAAWH,KAAK7H;GACtB,OACE,kBAAC,OAAD;IAAuB,WAAWgI,KAAW,kBAAkB;IAAkB;IAC9E,UAAAx/B,KAAQ,kBAAC,QAAD;KAAM,OAAOuuB,IAAM6M,GAAQ7M,CAAG,IAAIiR,KAAW;MAAE,UAAUH,KAAK;MAAG,UAAU;MAAU,MAAM;KAAO,IAAI,KAAA;KAAY,UAAAr/B;IAAW,CAAA;GACnI,GAFK,GAAG8G,EAAE,GAAG+C,GAEb;EAET;EACA,KAAK,IAAMyB,KAAKgtB,GAAS;GAEvB,IAAM5mB,IADM8oB,EAAM,IAAIj5B,GAAO+J,EAAE,EAClB,CAAA,EAAK,MAAM,MAAM3H,EAAE,OAAO2H,EAAE,EAAE,KAAM;IAACA,EAAE;IAAI;IAAI;IAAG;GAAC;GAChE,EAAI,KAAK0zB,EAAO1zB,EAAE,IAAIoG,GAAMyrB,EAAQ,IAAI7xB,EAAE,KAAK,CAAC,IAAI6xB,EAAQ,IAAI7xB,EAAE,EAAE,GAAG2xB,EAAQ,IAAI3xB,EAAE,KAAK,CAAC,IAAI2xB,EAAQ,IAAI3xB,EAAE,EAAE,GAAG,KAAA,GAAW,EAAI,CAAC;EACpI;EACA,KAAK,IAAIxE,IAAI63B,GAAK73B,KAAK43B,GAAK,KAAK;GAC/B,IAAMnsB,IAAMioB,EAAM,IAAIj5B,GAAOuF,CAAC;GAC9B,IAAI,CAACyL,GAAK;GACV,IAAIgtB;GACJ,KAAK,IAAM7tB,KAAQa,GAAK;IACtB,IAAM1I,IAAI6H,EAAK;IACf,AAAI7H,IAAIg1B,IAAM,KAAKh1B,IAAI+0B,KACnBrG,EAAQ,IAAIzxB,IAAI,QAAQ+C,CAAC,KACzBA,IAAIg1B,MAAQ,CAACntB,EAAK,MAAMA,EAAK,OAAO,MACpC4mB,EAAQ,MAAM,MAAMhtB,EAAE,OAAOxE,KAAKwE,EAAE,OAAOzB,CAAC,MAC5C,CAAC01B,KAAU7tB,EAAK,OAAO,KAAKA,EAAK,OAAI,IAAS,IAAI,IAAIa,EAAI,QAAQ,MAAM5O,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,MAAMA,EAAE,EAAE,CAAC,IACzGvD,EAAI,KAAK4+B,EAAOl4B,GAAG4K,GAAM,KAAA,GAAW,KAAA,GAAW6tB,CAAM,CAAC;GACxD;EACF;EAgBA,IAdI9d,EAAK,MAAMkd,KAAOld,EAAK,MAAMid,KAAOjd,EAAK,MAAMod,KAAOpd,EAAK,MAAMmd,KAAO,CAACR,MAC3Eh+B,EAAI,KACF,kBAAC,OAAD;GAEE,WAAU;GACV,OAAO;IACL,MAAM+8B,EAAQ,IAAI1b,EAAK,EAAE,IAAIsd;IAC7B,KAAK9B,EAAQ,IAAIxb,EAAK,EAAE,IAAIqd;IAC5B,OAAO3B,EAAQ,IAAI1b,EAAK,KAAK,CAAC,IAAI0b,EAAQ,IAAI1b,EAAK,EAAE;IACrD,QAAQwb,EAAQ,IAAIxb,EAAK,KAAK,CAAC,IAAIwb,EAAQ,IAAIxb,EAAK,EAAE;GACxD;EACD,GARK,OAQL,CACH,GAEE3Z,EAAI,MAAM62B,IAAM,KAAK72B,EAAI,MAAM42B,KAAO52B,EAAI,MAAM+2B,IAAM,KAAK/2B,EAAI,MAAM82B,GAAK;GAC5E,IAAMtzB,IAAI6yB,GAAQr2B,EAAI,IAAIA,EAAI,EAAE,GAC1BooB,IAAK5kB,IAAI6xB,EAAQ,IAAI7xB,EAAE,KAAK,CAAC,IAAI6xB,EAAQ,IAAI7xB,EAAE,EAAE,IAAI6xB,EAAQ,KAAKr1B,EAAI,EAAE,GACxEqoB,IAAK7kB,IAAI2xB,EAAQ,IAAI3xB,EAAE,KAAK,CAAC,IAAI2xB,EAAQ,IAAI3xB,EAAE,EAAE,IAAI2xB,EAAQ,KAAKn1B,EAAI,EAAE;GAC9E,EAAI,KAAK,kBAAC,OAAD;IAAe,WAAU;IAAS,OAAO;KAAE,MAAMq1B,EAAQ,IAAIr1B,EAAI,EAAE,IAAIi3B,IAAK;KAAG,KAAK9B,EAAQ,IAAIn1B,EAAI,EAAE,IAAIg3B,IAAK;KAAG,OAAO5O,IAAK;KAAG,QAAQC,IAAK;IAAE;GAAI,GAA3I,KAA2I,CAAC;EAChK;EAEA,KAAK,IAAMtrB,KAAK05B,IAAU;GACxB,IAAM1zB,IAAIhG,EAAE;GACZ,IAAIgG,EAAE,KAAK8zB,KAAO9zB,EAAE,KAAK6zB,KAAO7zB,EAAE,KAAKg0B,KAAOh0B,EAAE,KAAK+zB,GAAK;GAC1D,IAAM/b,IAAKsa,EAAQ,IAAItyB,EAAE,EAAE,GACrBiY,IAAKma,EAAQ,IAAIpyB,EAAE,EAAE,GACrBwmB,IAAK8L,EAAQ,IAAItyB,EAAE,KAAK,CAAC,GACzBymB,IAAK2L,EAAQ,IAAIpyB,EAAE,KAAK,CAAC;GAC/B,EAAI,KACF,kBAAC,OAAD;IAA2B,WAAU;IAAgB,OAAO;KAAE,MAAMgY,IAAKkc,IAAK;KAAG,KAAKjc,IAAKgc,IAAK;KAAG,OAAOzN,IAAKxO,IAAK;KAAG,QAAQyO,IAAKxO,IAAK;KAAG,aAAaje,EAAE;KAAO,YAAYA,EAAE,QAAQ;IAAK;IAC1L,UAAAA,EAAE,MAAM85B,KAAO95B,EAAE,MAAM65B,KAAO75B,EAAE,MAAMg6B,KAAOh6B,EAAE,MAAM+5B,KACpD,kBAAC,QAAD;KAAM,WAAU;KAAc,OAAO,EAAE,YAAY/5B,EAAE,MAAM;KACxD,UAAAA,EAAE;IACC,CAAA;GAEL,GANK,SAASA,EAAE,IAMhB,CACP;EACF;EA2BA,OAzBA46B,GAAU,SAAS,GAAG,MAAM;GAC1B,AAAIn0B,EAAE,IAAIqzB,KAAOrzB,EAAE,IAAIozB,KAAOpzB,EAAE,IAAIuzB,KAAOvzB,EAAE,IAAIszB,KACjDx+B,EAAI,KACF,kBAAC,OAAD;IAEE,WAAWW,MAAMid,EAAK,MAAM,mBAAmB;IAC/C,OAAO;KAAE,MAAMmf,EAAQ,IAAI7xB,EAAE,CAAC,IAAIyzB;KAAI,KAAK9B,EAAQ,IAAI3xB,EAAE,CAAC,IAAIwzB;KAAI,OAAO3B,EAAQ,KAAK7xB,EAAE,CAAC;KAAG,QAAQ2xB,EAAQ,KAAK3xB,EAAE,CAAC;IAAE;GACvH,GAHM,OAAOvK,CAGb,CACH;EACF,CAAC,GAED2+B,GAAS,SAAS,GAAG,MAAM;GACzB,IAAI70B,EAAE,KAAK8zB,KAAO9zB,EAAE,KAAK6zB,KAAO7zB,EAAE,KAAKg0B,KAAOh0B,EAAE,KAAK+zB,GAAK;GAC1D,IAAM9b,IAAKma,EAAQ,IAAI,KAAK,IAAIpyB,EAAE,IAAI8zB,IAAM,CAAC,CAAC,GACxCrN,IAAK2L,EAAQ,IAAI,KAAK,IAAIpyB,EAAE,IAAI6zB,IAAM,CAAC,IAAI,CAAC,GAC5C7b,IAAKsa,EAAQ,IAAI,KAAK,IAAItyB,EAAE,IAAIg0B,IAAM,CAAC,CAAC,GACxCxN,IAAK8L,EAAQ,IAAI,KAAK,IAAItyB,EAAE,IAAI+zB,IAAM,CAAC,IAAI,CAAC;GAClD,EAAI,KACF,kBAAC,OAAD;IAEE,WAAW/zB,EAAE,QAAQ,uBAAuB;IAC5C,OAAO;KAAE,MAAMgY,IAAKkc,IAAK;KAAG,KAAKjc,IAAKgc,IAAK;KAAG,OAAOzN,IAAKxO,IAAK;KAAG,QAAQyO,IAAKxO,IAAK;KAAG,aAAajY,EAAE;KAAO,YAAYA,EAAE,QAAQ;IAAK;GACzI,GAHM,OAAO9J,CAGb,CACH;EACF,CAAC,GAEC,kBAAC,OAAD;GAAe,WAAU;GAAY,OAAO;IAAE;IAAM;IAAK,OAAOqD;IAAG,QAAQC;GAAE;GAC1E,UAAAjE;EACE,GAFK8O,CAEL;CAET;CAEA,SAASywB,GAAW,GAAa,GAAa,GAAa,GAAY,GAAc,GAAW;EAC9F,IAAIv7B,KAAK,GAAG,OAAO;EACnB,IAAMhE,IAAmB,CAAC;EAC1B,KAAK,IAAIyJ,IAAIg1B,GAAKh1B,KAAK+0B,GAAK,KAAK;GAC/B,IAAMpH,IAAK2F,EAAQ,KAAKtzB,CAAC;GACzB,AAAK2tB,MACLp3B,EAAI,KACF,kBAAC,OAAD;IAAa,YAAUyJ;IAAG,WAAWA,KAAK4X,EAAK,MAAM5X,KAAK4X,EAAK,KAAK,yBAAyB;IAAa,OAAO;KAAE,MAAM0b,EAAQ,IAAItzB,CAAC,IAAIk1B;KAAI,KAAK;KAAG,OAAOvH;KAAI,QAAQoC;IAAG;IACzK,UAAAx8B,EAAQyM,CAAC;GACP,GAFKA,CAEL,CACP,GACIsS,KAAU/b,EAAI,KAAK,kBAAC,OAAD;IAAmB,iBAAeyJ;IAAG,WAAU;IAAY,OAAO;KAAE,MAAMszB,EAAQ,IAAItzB,IAAI,CAAC,IAAIk1B,IAAK;KAAG,QAAQnF;IAAG;GAAI,GAA5G,MAAM/vB,CAAsG,CAAC;EAChJ;EACA,OACE,kBAAC,OAAD;GAAe,WAAU;GAAY,OAAO;IAAE;IAAM,KAAK;IAAG,OAAOzF;IAAG,QAAQw1B;GAAG;GAC9E,UAAAx5B;EACE,GAFK8O,CAEL;CAET;CAEA,SAAS0wB,GAAW,GAAa,GAAa,GAAa,GAAY,GAAa,GAAW;EAC7F,IAAIv7B,KAAK,GAAG,OAAO;EACnB,IAAMjE,IAAmB,CAAC;EAC1B,KAAK,IAAI0G,IAAI63B,GAAK73B,KAAK43B,GAAK,KAAK;GAC/B,IAAMmB,IAAK5C,EAAQ,KAAKn2B,CAAC;GACzB,AAAK+4B,MACLz/B,EAAI,KACF,kBAAC,OAAD;IAAa,YAAU0G;IAAG,WAAWA,KAAK2a,EAAK,MAAM3a,KAAK2a,EAAK,KAAK,yBAAyB;IAAa,OAAO;KAAE,MAAM;KAAG,KAAKwb,EAAQ,IAAIn2B,CAAC,IAAIg4B;KAAI,OAAOhC;KAAI,QAAQ+C;IAAG;IACzK,UAAA/4B,IAAI;GACF,GAFKA,CAEL,CACP,GACIqV,KAAU/b,EAAI,KAAK,kBAAC,OAAD;IAAmB,iBAAe0G;IAAG,WAAU;IAAY,OAAO;KAAE,KAAKm2B,EAAQ,IAAIn2B,IAAI,CAAC,IAAIg4B,IAAK;KAAG,OAAOhC;IAAG;GAAI,GAA1G,MAAMh2B,CAAoG,CAAC;EAC9I;EACA,OACE,kBAAC,OAAD;GAAe,WAAU;GAAY,OAAO;IAAE,MAAM;IAAG;IAAK,OAAOg2B;IAAI,QAAQz4B;GAAE;GAC9E,UAAAjE;EACE,GAFK8O,CAEL;CAET;CAEA,IAAM4wB,KAAK5C,EAAO,MACZ5B,KAAK4B,EAAO,MACZ6C,KAAK,KAAK,IAAI3C,IAASL,EAAK,GAC5BiD,KAAK,KAAK,IAAI3C,IAASL,EAAK,GAG5BiD,MAAW,GAAW,MAAc;EACxC,IAAM30B,IAAI6yB,GAAQr3B,GAAG+C,CAAC;EAGtB,OAAO;GACL,GAHQizB,IAAKK,EAAQ,IAAItzB,CAAC,KAAKA,KAAKyxB,KAAKqC,IAAU;GAInD,GAHQ/D,KAAKqD,EAAQ,IAAIn2B,CAAC,KAAKA,KAAKg5B,KAAKpC,KAAU;GAInD,GAAGpyB,IAAI6xB,EAAQ,IAAI7xB,EAAE,KAAK,CAAC,IAAI6xB,EAAQ,IAAI7xB,EAAE,EAAE,IAAI6xB,EAAQ,KAAKtzB,CAAC;GACjE,GAAGyB,IAAI2xB,EAAQ,IAAI3xB,EAAE,KAAK,CAAC,IAAI2xB,EAAQ,IAAI3xB,EAAE,EAAE,IAAI2xB,EAAQ,KAAKn2B,CAAC;EACnE;CACF,GAEMo5B,MAAkB,GAAW,MAAc;EAC/C,IAAMh8B,IAAKyZ,EAAU;EACrB,IAAI,CAACzZ,GAAI;EACT,IAAMP,IAAIw5B,EAAQ,IAAItzB,CAAC,GACjBiF,IAAImuB,EAAQ,IAAIn2B,CAAC;EAKvB,IAJI+C,KAAKyxB,OACH33B,IAAIy5B,KAAUO,IAAS,EAAG,aAAah6B,IAAIy5B,KACtCz5B,IAAIw5B,EAAQ,KAAKtzB,CAAC,IAAI+zB,IAASE,MAAO,EAAG,aAAan6B,IAAIw5B,EAAQ,KAAKtzB,CAAC,IAAIuzB,KAAUU,KAE7Fh3B,KAAKg5B,MAAMtC,IAAc,GAAG;GAC9B,IAAI1O,IAAK4O;GAGT,AAFI5uB,IAAIuuB,KAAUK,KAAS,IAAK5uB,IAAIuuB,KAC3BvuB,IAAImuB,EAAQ,KAAKn2B,CAAC,IAAI+2B,IAASE,OAAO,IAAKjvB,IAAImuB,EAAQ,KAAKn2B,CAAC,IAAIu2B,KAAUU,KAChFjP,MAAO4O,OAAS,EAAG,YAAa5O,IAAK0O,IAAeC;EAC1D;CACF,GAEM0C,MAAU,GAAiB,GAAiB,MAAoB;EACpE,IAAMt1B,IAAI3G,EAAG,sBAAsB,GAC7BP,IAAIy8B,IAAUv1B,EAAE,OAAOiyB,GACvBhuB,IAAIuxB,IAAUx1B,EAAE,MAAM+uB,IACtB0G,IAAK38B,IAAIy5B,KAAUz5B,IAAIA,IAAIg6B,GAC3B4C,IAAKzxB,IAAIuuB,KAAUvuB,IAAIA,IAAI4uB;EACjC,OAAO;GAAE,GAAG5uB,IAAI,IAAI,KAAKmuB,EAAQ,MAAM,KAAK,IAAI,GAAGsD,CAAE,CAAC;GAAG,GAAG58B,IAAI,IAAI,KAAKw5B,EAAQ,MAAM,KAAK,IAAI,GAAGmD,CAAE,CAAC;EAAE;CAC1G,GAIME,WAAkB7iB,EAAU,SAAS,MAAM,EAAE,eAAe,GAAK,CAAC,GAClE8iB,WAAoBjC,GAAO;EAAE,IAAI;EAAG,IAAI;EAAG,IAAI,KAAK,IAAI,GAAGl6B,EAAE,OAAO,CAAC;EAAG,IAAI,KAAK,IAAI,GAAGA,EAAE,OAAO,CAAC;CAAE,CAAC;CAE3G,SAAmB;EACjB,AAAI+qB,MACJmR,GAAU,GACVC,GAAY;CACd,CAAC;CACD,IAAMnU,MAAW,GAAW,MAAckO,EAAM,IAAIj5B,GAAOuF,CAAC,CAAC,EAAE,MAAM,MAAMnD,EAAE,OAAOkG,CAAC,CAAC,GAAG,MAAM,GAEzFyO,KAAM,OAAO,MAAsC;EACvD,IAAI;GACF,IAAM7C,IAAM,MAAM5Q;GAGlB,AAFA21B,EAAM,QAAQ/kB,GAAK6H,CAAI,GACnB7H,KAAK2H,EAAO,SAAS,EAAI,GAC7B6e,GAAe,MAAM17B,IAAI,CAAC;EAC5B,SAAS,GAAG;GACV,QAAQ,MAAM,mBAAmB,CAAC;EACpC;CACF,GAEMuxB,MAAS,GAA2B,GAAW,MAC9CvpB,IACDA,EAAE,UAAgBA,EAAE,UAEpBA,EAAE,SAAS,YAAY,WAAW,MAAM+U,EAAK,QAAQgP,GAAQxlB,GAAG+C,CAAC,MAAM,GAAA,CAAI,QAAQ,uBAAuB,EAAE,CAAC,IACxG2wB,EAAM,IAAIj5B,GAAOuF,CAAC,CAAC,EAAE,MAAM,MAAMnD,EAAE,OAAOkG,CAAC,CAAC,GAAG,MAAMtB,EAAE,QAEzDA,EAAE,QANM,IASXm4B,KAAY,OAAO,GAAkB,IAAM,OAAU;EACzD,IAAI,CAACvkB,KAAY,CAAC7X,EAAE,QAAQ+qB,GAAM;EAClC,IAAM,EAAE,OAAI,UAAOvnB,GACb64B,KAAS,GAAe,GAAqB,MACjD7F,EAAQ;GAAE;GAAO,GAAGmD;GAAI,GAAGC;GAAI;GAAO,SAAS0C;GAAa;GAAK;GAAM,OAAOjc,EAAM;GAAQ,UAAUA,EAAM;GAAQ,MAAM;EAAY,CAAC;EAEzI,IAAIkc,MAAY,KAAA,GAAW,OAAOF,EAAME,GAAS,MAAU,OAAO;EAClE,IAAMt4B,IAAIszB,KAAeA,EAAY,MAAMoC,KAAMpC,EAAY,MAAMqC,IAAKrC,EAAY,IAAI,MAAMx2B,EAAO,KAAK,aAAa9D,GAAO08B,GAAIC,CAAE,CAAC,CAAC,YAAY,KAAA,CAAS,GACrJj2B,IAAU6pB,GAAMvpB,GAAG01B,GAAIC,CAAE;EAC/B,EAAMj2B,GAASA,GAAS,MAAM;CAChC,GAGM64B,KAAYh9B,EAAyB,IAAI,GACzCi9B,MAAU,MAA4B;EAC1C,IAAMnhC,IAAIyvB;EACV,IAAI,CAACzvB,KAAKkhC,GAAU,YAAYlhC,GAAG;EAEnC,AADA,GAAU,UAAUA,GACpBk7B,EAAQ,IAAI;EACZ,IAAMnW,IAAQ9iB,GAAajC,EAAE,KAAK;EAElC,IADI+kB,MAAU/kB,EAAE,WAAS0Y,GAASjT,EAAO,KAAK,YAAYzF,EAAE,OAAO,CAAC;GAAE,GAAGA,EAAE;GAAG,GAAGA,EAAE;GAAG,OAAO+kB;EAAM,CAAC,CAAC,CAAC,GAClG/kB,EAAE,UAAU2B,GAAO,OAAOy/B,GAAOphC,GAAGsjB,CAAI;EAE5C,AADIA,KAAM+d,GAAO/d,EAAK,IAAIA,EAAK,IAAI,EAAK,GACxCsd,GAAU;CACZ,GAEMU,WAAe;EACnB,IAAM,IAAI7R;EAEV,IADAyL,EAAQ,IAAI,GACR,KAAK,EAAE,UAAUv5B,GAAO,OAAOy/B,GAAO,CAAC;EAC3C,GAAU;CACZ,GAGMA,MAAU,GAAc,MAA4B;EACxD,IAAM,IAAI,KAAK,IAAI,GAAGphC,EAAE,KAAKsjB,IAAO,MAAM,EAAE,GACtCrZ,IAAI,KAAK,IAAI,GAAGjK,EAAE,KAAKsjB,IAAO,MAAM,EAAE;EAG5C,AAFA,EAAM,MAAMtjB,EAAE,KAAK,CAAC,CAAC,MAAM;GAAE,IAAI;GAAG,IAAIiK;GAAG,IAAI;GAAG,IAAIA;EAAE,GACxD,EAAM,YAAY,IAClBs3B,EAAQvhC,EAAE,KAAK;CACjB,GAIMwhC,KAAM,CAAC,CAAC/R,KAAQA,EAAK,UAAU9tB,GAC/B8/B,KAASD,MAAO,CAAC/R,GAAM,KACvBiS,KAAOjS,KAAQtvB,GAAUsvB,EAAK,KAAK,IAAIlvB,GAAekvB,EAAK,OAAOA,EAAK,KAAK,IAAI,MAChFkS,KAAU,CAAC,CAAClS,KAAQ4L,GAAS5L,GAAMiS,EAAI,GACvCE,KAAc,CAAC,CAACnS,GAAM,SAASA,EAAK,MAAM,MAAMA,EAAK,SAASA,EAAK,UAAUA,EAAK,UAGlFoS,KAAsD,CAAC,GACvD/B,KAAgG,CAAC;CACvG,IAAI4B,MAAQjS,GAAM;EAChB,IAAMqS,oBAAS,IAAI,IAAoB;EACvC,KAAK,IAAM9+B,KAAK0+B,GAAK,MAAM;GACzB,IAAMh5B,IAAIkzB,GAAO54B,EAAE,IAAI,GACnBwN,IAAQsxB,EAAO,IAAIp5B,CAAC;GAExB,AADK8H,KAAOsxB,EAAO,IAAIp5B,GAAI,IAAQizB,GAAWmG,EAAO,OAAOnG,GAAW,OAAQ,GAC/EkG,GAAS,KAAK;IAAE,GAAG7+B,EAAE;IAAG,GAAGA,EAAE;IAAG;GAAM,CAAC;GACvC,IAAMutB,IAAKvtB,EAAE,IAAI;GAEjB,CADeutB,MAAO,KAAA,IAAYd,EAAK,QAAQ/R,EAAK,OAAO,WAAW,MAAM3Z,EAAE,KAAK,YAAY,MAAMwsB,EAAG,YAAY,CAAC,OACtG5uB,KAAOm+B,GAAS,KAAK;IAAE,IAAI98B,EAAE,IAAI;IAAI,IAAIA,EAAE,IAAI;IAAI,IAAIA,EAAE,IAAI;IAAI,IAAIA,EAAE,IAAI;IAAI;IAAO,OAAO4+B,MAAe5+B,EAAE,MAAMysB,EAAK,MAAO;GAAE,CAAC;EACpJ;CACF;CAEA,IAAMsS,KAAOL,IAAM,QAAQjS,GAAM,cAAciS,GAAK,KAAK,KAAKjS,GAAM,UAAUA,GAAM,WAAWiS,GAAK,OAAO,KAAA,GACrGM,KAAiBD,KAAO9+B,GAAiB8+B,GAAK,MAAM,CAAC,IAAI,CAAC,GAC1DroB,KAAO,CAACsoB,GAAK,UAAUN,IAAM,OAAO5+B,GAAa4+B,GAAK,KAAK,IAAI,IAAI,KAAA,GACnEO,KAASF,KAAO,GAAGA,GAAK,EAAE,GAAGA,GAAK,SAAS;CACjD,QAAgBpF,EAAU,CAAC,GAAG,CAACsF,EAAM,CAAC;CAEtC,IAAMC,WAAgET,KAASlF,GAAQ,UAAUE,GAAM;CAGvG,QAAsB;EACpB,IAAI,CAAChN,GAAM;EACX,IAAMnrB,IAAK49B,GAAQ;EACnB,AAAK59B,MACQA,EAAG,YACZ,CAAA,CAAK,kBAAkBA,KAAIA,EAAG,MAAM,EAAE,eAAe,GAAK,CAAC,GAC3DmrB,EAAK,QAAMnrB,EAAG,kBAAkBmrB,EAAK,OAAOA,EAAK,QAAQ;CAC/D,GAAG;EAACA,GAAM;EAAMgS;EAAQhS,MAAS;CAAI,CAAC;CAEtC,IAAM0S,MAAa,MAA+C;EAChE,IAAMngC,IAAIsC,EAAG,kBAAkBA,EAAG,MAAM,QAClC2G,IAAI3G,EAAG,gBAAgBtC;EAC7B,GAAS,MAAOiD,MAAMA,EAAE,UAAUjD,KAAKiD,EAAE,aAAagG,KAAK;GAAE,GAAGhG;GAAG,OAAOjD;GAAG,UAAUiJ;EAAE,IAAIhG,CAAE;CACjG,GAEMm9B,MAAW,MAA+C;EAC9D,IAAMn8B,IAAI3B,EAAG,OACPtC,IAAIsC,EAAG,kBAAkB2B,EAAE,QAC3BgF,IAAI3G,EAAG,gBAAgBtC;EAC7B,GAAS,MAAOiD,KAAI;GAAE,GAAGA;GAAG,OAAOgB;GAAG,OAAOjE;GAAG,UAAUiJ;GAAG,OAAO,KAAA;EAAU,CAAM;CACtF,GAGMo3B,MAAW,GAAY,GAAY,GAAY,MAAe;EAClE,GAAS,MAAM;GACb,IAAI,CAACp9B,GAAG,OAAOA;GACf,IAAM7E,IAAOqB,GAAU48B,GAAIC,GAAI4B,GAAIxE,GAAI/5B,MAAUsD,EAAE,QAAmC,KAAA,IAA3ByY,EAAK,OAAO/b,EAAM,EAAE,IAAgB,GACzF6D,IAAOP,EAAE,SAASA,EAAE,MAAM,MAAMA,EAAE,SAASA,EAAE,UAAUA,EAAE,UACzDq9B,IAAK98B,IAAOP,EAAE,MAAO,IAAIA,EAAE,OAC3Bs9B,IAAK/8B,IAAOP,EAAE,MAAO,IAAIA,EAAE;GACjC,IAAIO,KAAQP,EAAE,MAAM,MAAMq9B,GAAIC,CAAE,MAAMniC,GAAM,OAAO6E;GACnD,IAAMsG,IAAM+2B,IAAKliC,EAAK;GACtB,OAAO;IAAE,GAAG6E;IAAG,OAAOA,EAAE,MAAM,MAAM,GAAGq9B,CAAE,IAAIliC,IAAO6E,EAAE,MAAM,MAAMs9B,CAAE;IAAG,OAAOh3B;IAAK,UAAUA;IAAK,MAAMtG,EAAE,OAAO;IAAG,OAAO;KAAE,GAAGq9B;KAAI,GAAG/2B;KAAK;KAAO;KAAI;KAAI;KAAI;IAAG;GAAE;EACtK,CAAC;CACH,GAEMi3B,KAAYt+B,EAAwE,IAAI,GAGxFu+B,MAAa,GAAY,GAAY,MAAoB;EAC7D,IAAMx9B,IAAIwqB,GAAM,SAASmS,MAAenS,EAAK,MAAM,UAAU9tB,IAAQ8tB,EAAK,QAAQ,MAC5EiT,IAAQz9B,IAAIA,EAAE,KAAKu8B,KAAM/R,EAAM,IAAIvnB,EAAI,IACvCy6B,IAAQ19B,IAAIA,EAAE,KAAKu8B,KAAM/R,EAAM,IAAIvnB,EAAI,IACvC06B,KAAU,MAAc,KAAK,IAAI,GAAG,KAAK,IAAIvF,EAAQ,QAAQ,GAAGn2B,CAAC,CAAC,GAClE27B,KAAU,MAAc,KAAK,IAAI,GAAG,KAAK,IAAItF,EAAQ,QAAQ,GAAGtzB,CAAC,CAAC;EACxE,IAAI64B,GAAQ;GACV,IAAM5C,IAAK0C,GAAQ39B,IAAIA,EAAE,KAAKy9B,KAASK,CAAE,GACnCrH,IAAKmH,GAAQ59B,IAAIA,EAAE,KAAK09B,KAASK,CAAE;GAEzC,AADAX,GAAQK,GAAOC,GAAOzC,GAAIxE,CAAE,GAC5B4E,GAAeJ,GAAIxE,CAAE;EACvB,OAAO;GACL,IAAMx0B,IAAI07B,EAAOF,IAAQK,CAAE,GACrB94B,IAAI44B,EAAOF,IAAQK,CAAE;GAE3B,AADAX,GAAQn7B,GAAG+C,GAAG/C,GAAG+C,CAAC,GAClBq2B,GAAep5B,GAAG+C,CAAC;EACrB;CACF,GAEMwD,MAAU,MAAc;EAC5B,IAAMjJ,IAAIu9B;EACV,AAAKv9B,KACL02B,GAAS,MAAM;GACb,IAAI,CAACj2B,GAAG,OAAOA;GACf,IAAMg+B,IAAS,CAACjgC,EAAE,KAAK,UAAU,CAACA,EAAE,UAC9BkgC,IAAMlgC,EAAE,QAAQwB,EAAE,OAAO,KAAKy+B,IAAS,OAAO,MAC9CviC,IAAQ8D,EAAE,IAAIxB,EAAE,KAAK,UAAUigC,KAAU,CAACz+B,EAAE,OAAO,IAAI;GAC7D,OAAO;IAAE,GAAGS;IAAG,OAAOA,EAAE,MAAM,MAAM,GAAGT,EAAE,CAAC,IAAI0+B,IAAMj+B,EAAE,MAAM,MAAMT,EAAE,CAAC;IAAG;IAAO,UAAU9D;IAAO,MAAMuE,EAAE,OAAO;IAAG,OAAO,KAAA;GAAU;EACrI,CAAC;CACH,GAEMo8B,MAAU,GAAY,GAAY,MAAoB;EAC1D,IAAMqB,IAAQI,IAAS56B,EAAI,KAAKA,EAAI,IAC9By6B,IAAQG,IAAS56B,EAAI,KAAKA,EAAI,IAC9BwD,IAAKo3B,IAAmC,KAAA,IAA1BvE,GAAQr2B,EAAI,IAAIA,EAAI,EAAE,GACtChB,IAAIw7B,IAAQK,GACZ94B,IAAI04B,IAAQK;EAKhB,KAJIt3B,KAAKq3B,IAAK,MAAG,IAAIr3B,EAAE,KAAKq3B,IACxBr3B,KAAKs3B,IAAK,MAAG,IAAIt3B,EAAE,KAAKs3B,IAC5B,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI3F,EAAQ,QAAQ,GAAGn2B,CAAC,CAAC,GAC9C,IAAI,KAAK,IAAI,GAAG,KAAK,IAAIq2B,EAAQ,QAAQ,GAAGtzB,CAAC,CAAC,GACvC/C,IAAI,KAAKm2B,EAAQ,KAAKn2B,CAAC,MAAM,KAAK67B,IAAK,IAAG;EACjD,OAAO1F,EAAQ,KAAKn2B,CAAC,MAAM,KAAKA,IAAIm2B,EAAQ,QAAQ,IAAG;EACvD,OAAOpzB,IAAI,KAAKszB,EAAQ,KAAKtzB,CAAC,MAAM,KAAK+4B,IAAK,IAAG;EACjD,OAAOzF,EAAQ,KAAKtzB,CAAC,MAAM,KAAKA,IAAIszB,EAAQ,QAAQ,IAAG;EAGvD,AAFIuF,IAAQ9G,EAAY;GAAE,GAAG9zB;GAAK,IAAIhB;GAAG,IAAI+C;EAAE,CAAC,IAC3C20B,GAAO;GAAE,IAAI13B;GAAG,IAAI+C;GAAG,IAAI/C;GAAG,IAAI+C;EAAE,CAAC,GAC1Cq2B,GAAep5B,GAAG+C,CAAC;CACrB,GAEMk5B,WAAmB;EACvB,IAAMxxB,IAAQ,CAAC,GACTyxB,IAAI;GAAE,GAAGvhB;GAAM,IAAI,KAAK,IAAIA,EAAK,IAAIA,EAAK,KAAK,GAAI;GAAG,IAAI,KAAK,IAAIA,EAAK,IAAIA,EAAK,KAAK,GAAG;EAAE;EACjG,KAAK,IAAI,IAAIuhB,EAAE,IAAI,KAAKA,EAAE,IAAI,KAAK;GACjC,IAAMzwB,IAAMioB,EAAM,IAAIj5B,GAAO,CAAC;GAC9B,KAAK,IAAIsI,IAAIm5B,EAAE,IAAIn5B,KAAKm5B,EAAE,IAAI,KAAK,AAAIzwB,GAAK,MAAM,MAAM5O,EAAE,OAAOkG,KAAKlG,EAAE,OAAO,EAAE,KAAG4N,EAAM,KAAK;IAAE;IAAG;IAAG,OAAO;GAAG,CAAC;EACpH;EACA,AAAIA,EAAM,UAAQ+G,GAASjT,EAAO,KAAK,YAAY9D,GAAOgQ,CAAK,CAAC;CAClE,GAEM0xB,KAAa5pB,GAAOiT,GAAQxkB,EAAI,IAAIA,EAAI,EAAE,MAAM,CAAC,GACjD0f,MAAO,MAAoB0b,GAAMzhB,GAAMpL,CAAK,GAC5C6sB,MAAS,GAAc,MAAoB;EAE/C,AADA5qB,GAASjT,EAAO,KAAK,eAAe9D,GAAO6f,GAAO/K,CAAK,CAAC,GACxDmqB,GAAU;CACZ,GACM2C,MAAU,MAAkC;EAChD,IAAMr+B,IACJwD,MAAM,MAAM26B,GAAU,eAAe,MAAM36B,MAAM,MAAM26B,GAAU,cAAc,WAAW,OAAOA,GAAU,kBAAkB,EAAE,CAAC,CAAC,SAAS36B,MAAM,MAAM,cAAc,cAAc;EACpL,GAAI,GAAGA,IAAI,CAACxD,EAAG,CAAC;CAClB,GACMs+B,WAAa,KAAK9qB,GAAIjT,EAAO,KAAK,WAAW,CAAC,GAC9CwvB,WAAa,KAAKvc,GAAIjT,EAAO,KAAK,WAAW,CAAC,GAE9Cg+B,WAAY;EAChB,IAAMtrB,IAAkB,CAAC,GACnBirB,IAAI;GAAE,GAAGvhB;GAAM,IAAI,KAAK,IAAIA,EAAK,IAAIA,EAAK,KAAK,GAAK;EAAE;EAC5D,KAAK,IAAI3a,IAAIk8B,EAAE,IAAIl8B,KAAKk8B,EAAE,IAAI,KAAK;GACjC,IAAMzwB,IAAMioB,EAAM,IAAIj5B,GAAOuF,CAAC,GACxBw8B,IAAiB,CAAC;GACxB,KAAK,IAAIz5B,IAAIm5B,EAAE,IAAIn5B,KAAKm5B,EAAE,IAAI,KAAK,EAAK,KAAKzwB,GAAK,MAAM,MAAM5O,EAAE,OAAOkG,CAAC,CAAC,GAAG,MAAM,EAAE;GACpF,EAAM,KAAKy5B,EAAK,KAAK,GAAI,CAAC;EAC5B;EACA,OAAOvrB,EAAM,KAAK,IAAI;CACxB,GAEMud,MAAa,MAA2B;EAC5C,IAAIjG,GAAM;EACV,IAAMpO,IAAM,EAAE,WAAW,EAAE,SACrB3Y,IAAI,EAAE,IAAI,YAAY;EAC5B,IAAI2Y,KAAO3Y,MAAM,KAAK;GAEpB,AADA,EAAE,eAAe,GACjB8U,EAAY,KAAK;GACjB;EACF;EACA,IAAI6D,KAAO3Y,MAAM,OAAO,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU;GAEhD,AADA,EAAE,eAAe,GACjBm4B,GAAY;GACZ;EACF;EACA,IAAItkB,KAAY8E,KAAO,CAAC,EAAE,QAAQ;GAChC,IAAI3Y,MAAM,KAAK;IAEb,AADA,EAAE,eAAe,GACb,EAAE,WAAUusB,GAAK,IAChBuO,GAAK;IACV;GACF;GACA,IAAI96B,MAAM,KAAK;IAEb,AADA,EAAE,eAAe,GACjBusB,GAAK;IACL;GACF;GACA,IAAIvsB,MAAM,OAAOA,MAAM,OAAOA,MAAM,KAAK;IAEvC,AADA,EAAE,eAAe,GACjB66B,GAAO76B,CAAC;IACR;GACF;GACA,IAAIA,MAAM,OAAOA,MAAM,KAAK;IAE1B,AADA,EAAE,eAAe,GACjBi7B,GAAa;KAAE,IAAI;KAAQ,OAAO9hB;KAAM,KAAKnZ,MAAM,MAAM,SAAS;IAAQ,CAAC;IAC3E;GACF;GACA,IAAIA,MAAM,MAAM;IAEd,AADA,EAAE,eAAe,GACjBkf,GAAI,EAAE,OAAO,GAAK,CAAC;IACnB;GACF;GACA,IAAIlf,MAAM,OAAO,EAAE,UAAU;IAE3B,AADA,EAAE,eAAe,GACjB66B,GAAO,QAAQ;IACf;GACF;EACF;EACA,IAAIliB,MAAQ3Y,MAAM,OAAOA,MAAM,MAAM;GAEnC,AADA,EAAE,eAAe,GACjB2V,GAAS,OAAO;IAAE,GAAGrb;IAAG,MAAM;IAAM,SAAS0F,MAAM,OAAO1F,EAAE;IAAS,MAAMA,EAAE,OAAO;GAAE,EAAE;GACxF;EACF;EACA,IAAI,EAAE,QAAQ,YAAY8b,OAAY,MAAM;GAC1C,EAAW,IAAI;GACf;EACF;EACA,IAAM8kB,IAAW,KAAK,IAAI,GAAG,KAAK,MAAMzF,KAAQd,EAAQ,GAAG,IAAI,CAAC,GAC1DwG,IAA0C;GAC9C,SAAS,CAAC,IAAI,CAAC;GAAG,WAAW,CAAC,GAAG,CAAC;GAAG,WAAW,CAAC,GAAG,EAAE;GAAG,YAAY,CAAC,GAAG,CAAC;GAC1E,UAAU,CAACD,GAAU,CAAC;GAAG,QAAQ,CAAC,CAACA,GAAU,CAAC;EAChD;EACA,IAAIC,EAAM,EAAE,MAAM;GAChB,EAAE,eAAe;GACjB,IAAM,CAACd,GAAIC,KAAMa,EAAM,EAAE;GACzB,AAAIxiB,IAAKggB,GAAO0B,IAAMA,IAAK,IAAI,KAAK,IAAI,GAAGr+B,EAAE,OAAO,KAAK,EAAE,WAAWwD,EAAI,KAAKA,EAAI,GAAG,IAAI,OAAQ,GAAG86B,IAAMA,IAAK,IAAI,KAAK,IAAI,GAAGt+B,EAAE,OAAO,KAAK,EAAE,WAAWwD,EAAI,KAAKA,EAAI,GAAG,IAAI,OAAQ,GAAG,EAAE,QAAQ,IAC/Lm5B,GAAO0B,GAAIC,GAAI,EAAE,QAAQ;EAEhC,OACA,AAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,eAAe,GACb,EAAE,QAAQ,UAAS3B,GAAO,EAAE,WAAW,KAAK,GAAG,GAAG,EAAK,IACtDA,GAAO,GAAG,EAAE,WAAW,KAAK,GAAG,EAAK,KAGtC9kB,MACD,EAAE,QAAQ,QACZ,EAAE,eAAe,GACjBukB,GAAe,KACN,EAAE,QAAQ,YAAY,EAAE,QAAQ,eACzC,EAAE,eAAe,GACjBqC,GAAW,KACF,EAAE,IAAI,WAAW,KAAK,CAAC9hB,KAAO,CAAC,EAAE,WAC1C,EAAE,eAAe,GACjByf,GAAe,EAAE,GAAG;CAExB,GAEMgD,MAAe,MAAwB;EAC3C,IAAI,EAAE,WAAW,GAAG;EACpB,IAAMC,IAAQ,EAAE,OAAuB,QAAQ,iCAAiC;EAChF,IAAIA,GAAM;GACR,EAAE,eAAe;GACjB,IAAMC,IAAMD,EAAK,QAAQ,SACnB5iC,IAAI,OAAO6iC,KAAOD,EAAK,QAAQ,OAAO;GAC5C,GAAYC,MAAQ,KAAA,IAA0E;IAAE,MAAM;IAAO;IAAG,OAAO,EAAE;IAAS,MAAM3G,EAAQ,KAAKl8B,CAAC;GAAE,IAAxH;IAAE,MAAM;IAAO;IAAG,OAAO,EAAE;IAAS,MAAMo8B,EAAQ,KAAKp8B,CAAC;GAAE,CAA+D;GACzJ;EACF;EACA,IAAMmD,IAAK,EAAE,eACP,EAAE,MAAG,SAAMi8B,GAAO,EAAE,SAAS,EAAE,SAASj8B,CAAE;EAChD,IAAImrB,KAAQkS,IAAS;GAGnB,IADA,EAAE,eAAe,GACbz6B,IAAI,KAAK+C,IAAI,GAAG;GACpB,IAAM6uB,IAAO5xB,IAAI,IAAI,QAAQ+C,IAAI,IAAI,QAAQ,QACzC,CAACo0B,GAAIC,KAAM,CAAC,KAAK,IAAIp3B,GAAG,CAAC,GAAG,KAAK,IAAI+C,GAAG,CAAC,CAAC,GACxCyB,IAAIotB,MAAS,SAASyF,GAAQr3B,GAAG+C,CAAC,IAAI,KAAA;GAC5C,AAAIyB,MAAG,CAAC2yB,GAAIC,KAAM,CAAC5yB,EAAE,IAAIA,EAAE,EAAE;GAC7B,IAAMzG,IAAI,EAAE,YAAY28B,MAAenS,EAAK,MAAO,UAAU9tB,IAAQ8tB,EAAK,QAAS;GAGnF,AAFIxqB,MAAG,CAACo5B,GAAIC,KAAM,CAACr5B,EAAE,IAAIA,EAAE,EAAE,IAC7B,GAAU,UAAU;IAAE;IAAI;IAAI;GAAK,GACnCg/B,GAAW5F,GAAIC,GAAIp3B,GAAG+C,GAAG6uB,CAAI;EAE/B,OACA;GAEA,IAFIrJ,KAAM0R,GAAO,GACjB,EAAE,eAAe,GACbriB,OAAY,QAAQ5X,KAAK,KAAK+C,KAAK,GAAG;IACxC,IAAMi6B,IAAKplB;IACX,GAAU,gBAAgB;KAExB,AADAC,EAAW,IAAI,GACfukB,GAAMlO,GAAO,SAAS,EAAE,MAAG,CAAC;IAC9B;GACF;GAEA,AADAwL,GAAU,GACN15B,IAAI,KAAK+C,IAAI,IACf20B,GAAO;IAAE,IAAI;IAAG,IAAI;IAAG,IAAI,KAAK,IAAI,GAAGl6B,EAAE,OAAO,CAAC;IAAG,IAAI,KAAK,IAAI,GAAGA,EAAE,OAAO,CAAC;GAAE,CAAC,KAG/EwC,IAAI,IAAG03B,GAAO;IAAE,IAAI;IAAG,IAAI30B;IAAG,IAAI,KAAK,IAAI,GAAGvF,EAAE,OAAO,CAAC;IAAG,IAAIuF;GAAE,CAAC,IAC7DA,IAAI,IAAG20B,GAAO;IAAE,IAAI13B;IAAG,IAAI;IAAG,IAAIA;IAAG,IAAI,KAAK,IAAI,GAAGxC,EAAE,OAAO,CAAC;GAAE,CAAC,IAClE,EAAE,WAAUs3B,EAAY;IAAE,GAAG9zB;IAAK,IAAIhB;IAAG,IAAI+C;GAAE,CAAC,IACpD20B,GAAO;IAAE,IAAI13B;IAAG,IAAI+C;IAAG,IAAI/C;IAAG,IAAI+C;GAAE,CAAC,GACtC/C,KAAK,KAAK+C,KAAK,MAAG,GAAS,UAAU;EAlBxB;CAmBnB,GAGMg6B,MAAc,GAAY,GAAY,GAAW,GAAW,MAAiC;EACjG,IAAInL,MAAS,OAAO,GAAQ,GAAGwF,GAAIrgC,GAAS,KAAK,IAAI,GAAGgM,CAAC,CAAC;OACrD,IAAI6uB,MAAS,OAAO,GAAQuF,GAAI,GAAG,KAAK,IAAI,GAAGn3B,CAAC,GAAG/I,CAAO;OAC1D;GACH,IAAMgmC,IAAK5F,GAAQr3B,GAAG+C,CAAC,GAEjByB,IAAIy4B,KAAM,EAAE9F,KAAM8F,EAAG,MAAM9F,KAAM8F,EAAG,MAAM7F,KAAM6F,EAAG,MAAM7F,KAAM6F,EAAG,MAAMA,IAAK,KAAA,GAE7EjE,IAAKx0B,IAAKA,EAAE,KAAK2yB,IAAK3yB,EAAE,KAAKA,EAAE,KAAM,KAAK,IAAI,GAAGxE,CAAC,GAClDw0B,IAAKhwB,IAAKA,EAAE,KAAK4yB,IAAK5yB,EAAE,KAAKA,EAAE,KAAM,KAAK,IAAI,GAAGzB,CAAC;GACxD,GAAQo0B,GAAIC,GAAI4B,GAAIxE,CAAE;EACxB;CACF;CAcA,AAZAj4B,QAAgB;EACd,IAAMV,UAAW;GAEf,AADA,GAAS,UAAU,IACnB,GAAU,UAAU;GACpB,IAAMqL,IAAKyuB,GAAU;GAErB,AADA,GAAU,UAAU,MAChBzuB,KAAI,WAAWA,GAAI,CAAC;EAC1B;EAEA,OADA,OAAO,iBAAiB,WAAWrL,CAAE,SACxB,OAAO,oBAAoB,WAAWA,CAAE;CACvD,GAAG,CAAC,CAAC,GAELU,QAAgB;EACd,IAAI,CAAC0b,GAAU;EACf,IAAM2Z,IAAO3Z,EAAS,SAAS,QAAQoe,IAAUF,GAC3C/Z,KAAQ,MAAkB;GAC9B,IAAM3a,KAAKwW,EAAS,SAAS,QAAQnf,EAAE,UAAUA,EAAE,WAAWmf,EAAS;GAEvE,AADA2Z,EAAK,IAAI3Z,EAAS,GAAG,KAAK,IAAIA,EAAS,SAAS,QAAQ,IAAI,GAAG,KAAK,MAAMA,EAAS,OAAOxW,CAAC,CAAC,CAAC,GAC7F0zB,GAAe,MAAM17B,IAAI,CAAC;EAC5B,GACMoC,UAAW;GACf,IAAM00B,IAAKqB,EAAK,KAAK3Z,EAAS,CAAC;GAC/B,GAAY,IAAI;GAGhB,IAAM,CAACnd,GAAGiJ,MADGkU,EAAS,SAAS,QAAQ0C,EAAK,OAAO,KAAKA,EAAK,MAAMnd,EAAE,OAAO,KAAKya,EAAS,KAAK0C,EAAK,MAAM1C,EAAS,KAAK0C,EAAK,KAAKA,EAAK,OAAO,KAAKA,EAAK,MAAMnd,EAAE,OAAO,KAAKya,EAAS,KAAK0C,EAAK,MAAM1C,EAAS,KAAK0C,EAAK,MACjM1C,EAAS,SAAS,QAAQ,CAAC0C,EAAK,IAAIA,EAAK,EAAE,IAAI,CAACA,EAAK,IAAIA,EAAK,EAAE,IAAK,CAAC1C,EAAS,GAAGA,EAAS,CAAC;GACnH,GAAaA,EAAS,SAAS,QAAQ;IAAE,IAAI;IAAY,IAAInd;IAAG,IAAIiJ;IAAG;GAAG,IAAI;IAAE,IAAI;IAAa,IAAIjJ;IAAG,IAAIiJ;IAAG;GAAG,CAAC;EACrH;EAGA,OAFA,OAAO,iBAAiB,aAAaqY,CAAI,GACzC,OAAO,iBAAiB,WAAWvgB,GAAI,EAAE,MAAM,GAAK,CAAC,SACxC;GAEX,AADA,OAAO,oBAAoB,aAAaugB,CAAI,GAC5C,OAAO,oBAAoB,WAAWvgB,CAAE;EAC1C;CACF,CAAC;CAED,IAAM4gC,MAAW,MAAgBjrB,GAAIjT,EAAO,KAAK,gBAAgB9D,GAAOiU,CAAE,CAAC,GAErE8pB,KAASh7B,EAAE,OAAO,MAAM,MAAMgH,EAAE,MAAMmW,EAAK,MAAMnW,EAAE,MAAMmW,EAAK,MAAMnW,EAAE,MAAMmW,EAAK,MAAMnW,EAAE,MAAMmW,EAAK,EAAE,GACtGuiB,WAAoB,KAAKT,GAAQ;EAAE,IAAIjE,KAAS,YAAY;EAAS,OAAO7d;CAAK,CAAC,GAClFwiB,MAAS,MAAoB,KAAKV,GAAQ/R,MAAS,YAAY;EAAE,IAAI;EAAW,OAAO/P;CAAK,IAAI;EAAE,IAAI;EAAS,OAAOA;EAAM;CAAK,CAAC,GAClIyiB,MAAU,MACd,KAAKX,GAAQ;EAAE,IAAI;EAAU,MAAMhtB,MAAS,QAAQ,IAAIA,MAAS,QAAQzO,EAAI,KAAK;EAAG,MAAMyO,MAAS,QAAQ,IAAIA,MAAS,QAAQzO,EAAI,KAAK;CAAE,CAAC,GAEzIq8B,MAAU,IAAK,UAAU;EAC7B,IAAM,EAAE,OAAI,UAAOr8B;EACnB,IAAI,CAACs2B,IAAS;GAEZ,IAAMv6B,IAAM,GAAGzG,EAAQqkB,EAAK,EAAE,IAAIA,EAAK,KAAK,EAAE,GAAGrkB,EAAQqkB,EAAK,EAAE,IAAIA,EAAK,KAAK;GAC9E,GAASpc,EAAO,KAAK,YAAY9D,GAAO,CAAC;IAAE,GAAGkgB,EAAK,KAAK;IAAG,GAAGA,EAAK;IAAI,OAAO,IAAIzT,EAAG,GAAGnK,EAAI;GAAG,CAAC,CAAC,CAAC;GAClG;EACF;EACA,IAAM8oB,KAAO,GAAW,MAAc6N,EAAM,IAAIj5B,GAAOuF,CAAC,CAAC,EAAE,MAAM,MAAMnD,EAAE,OAAOkG,CAAC,CAAC,GAAG,OAAO,GACxF/C,IAAIm3B,IAAK;EACb,OAAOn3B,KAAK,KAAK6lB,EAAI7lB,GAAGo3B,CAAE,IAAG;EAC7B,IAAIr6B,IAAM;EACV,IAAIiD,IAAIm3B,IAAK,GAAG,IAAM,GAAG7gC,EAAQ8gC,CAAE,IAAIp3B,IAAI,EAAE,GAAG1J,EAAQ8gC,CAAE,IAAID;OACzD;GACH,IAAIp0B,IAAIq0B,IAAK;GACb,OAAOr0B,KAAK,KAAK8iB,EAAIsR,GAAIp0B,CAAC,IAAG;GAC7B,AAAIA,IAAIq0B,IAAK,MAAG,IAAM,GAAG9gC,EAAQyM,IAAI,CAAC,IAAIo0B,IAAK,EAAE,GAAG7gC,EAAQ8gC,IAAK,CAAC,IAAID,IAAK;EAC7E;EACA,IAAI,CAACp6B,GAAK,OAAO,KAAK68B,GAAU,IAAI1yB,EAAG,EAAE;EACzC,GAAS3I,EAAO,KAAK,YAAY9D,GAAO,CAAC;GAAE,GAAG08B;GAAI,GAAGC;GAAI,OAAO,IAAIlwB,EAAG,GAAGnK,EAAI;EAAG,CAAC,CAAC,CAAC;CACtF,GACMugC,MAAU,MAAkB;EAGhC,IAAMhjB,IADSK,EAAK,OAAOA,EAAK,KACT;GAAE,IAAIyb,EAAO;GAAM,IAAI;GAAG,IAAI,KAAK,IAAIA,EAAO,MAAM54B,EAAE,OAAO,CAAC;GAAG,IAAI,KAAK,IAAI,GAAGA,EAAE,OAAO,CAAC;EAAE,IAAImd;EACxH,GAAa;GAAE,IAAI;GAAQ;GAAO,KAAK3Z,EAAI;GAAI;EAAK,CAAC;CACvD,GACMu8B,MAAU,MAAc;EAC5B,IAAM7tB,IAAKiL,EAAK,KAAKA,EAAK,KAAK,GACzBhL,IAAKgL,EAAK,KAAKA,EAAK,KAAK,GACzB3T,IAA+B;GACnC,UAAU;IAAE,IAAI;IAAc,IAAI2T,EAAK;IAAI,GAAGjL;GAAG;GACjD,UAAU;IAAE,IAAI;IAAc,IAAIiL,EAAK,KAAK;IAAG,GAAGjL;GAAG;GACrD,SAAS;IAAE,IAAI;IAAc,IAAIiL,EAAK;IAAOhL;GAAG;GAChD,UAAU;IAAE,IAAI;IAAc,IAAIgL,EAAK,KAAK;IAAMhL;GAAG;GACrD,QAAQ;IAAE,IAAI;IAAc,IAAIgL,EAAK;IAAI,GAAGjL;GAAG;GAC/C,QAAQ;IAAE,IAAI;IAAc,IAAIiL,EAAK;IAAOhL;GAAG;GAC/C,UAAU;IAAE,IAAI;IAAY,GAAGgL,EAAK;IAAI,GAAGA,EAAK;IAAI,QAAQ;GAAK;GACjE,UAAU;IAAE,IAAI;IAAY,GAAGA,EAAK;IAAI,GAAGA,EAAK;IAAI,QAAQ;GAAK;GAEjE,YAAY;IAAE,IAAI;IAAY,GAAG,KAAK,IAAI,GAAGA,EAAK,KAAM,QAAO,EAAU;IAAG,GAAGA,EAAK,KAAM,QAAO;IAAY,QAAQ;GAAM;GAC3H,YAAY;IAAE,IAAI;IAAY,GAAG,KAAK,IAAI,GAAGA,EAAK,KAAM,QAAO,EAAU;IAAG,GAAGA,EAAK,KAAM,QAAO;IAAY,QAAQ;GAAM;EAC7H;EACA,AAAI3T,EAAIxF,MAAIi7B,GAAaz1B,EAAIxF,EAAE;CACjC,GACMg8B,MAAa,MAAgB;EAEjC,IAAM/yB,IADOynB,EAAI,QAAQ,UAAU,IAAI,CAAC,CAAC,QAAQ,OAAO,EAC1C,CAAA,CAAK,MAAM,IAAI,CAAC,CAAC,SAAS,GAAM,MAAM7f,EAAK,MAAM,GAAI,CAAC,CAAC,KAAK,GAAG,OAAO;GAAE,GAAGrR,EAAI,KAAK/G;GAAG,GAAG+G,EAAI,KAAKyM;GAAG,OAAO1O;EAAE,EAAE,CAAC;EAChI,AAAI0L,EAAM,UAAQ+G,GAASjT,EAAO,KAAK,YAAY9D,GAAOgQ,EAAM,MAAM,GAAG,GAAO,CAAC,CAAC;CACpF,GACM+R,WAA6B;EACjC,IAAM9M,IAAKiL,EAAK,KAAKA,EAAK,KAAK,GACzBhL,IAAKgL,EAAK,KAAKA,EAAK,KAAK,GACzBtP,IAAOqE,MAAO,IAAI,OAAOiL,EAAK,KAAK,MAAM,QAAQA,EAAK,KAAK,EAAE,GAAGA,EAAK,KAAK,KAC1EzP,IAAOyE,MAAO,IAAI,UAAUrZ,EAAQqkB,EAAK,EAAE,MAAM,WAAWrkB,EAAQqkB,EAAK,EAAE,EAAE,GAAGrkB,EAAQqkB,EAAK,EAAE,KAC/F8iB,IAAS/tB,MAAO,KAAKC,MAAO;EAClC,OAAO;GACL;IAAE,OAAO;IAAO,MAAM;IAAO,MAAM,GAAGpH,EAAI;IAAI,WAAW,SAAS,YAAY,KAAK;GAAE;GACrF;IAAE,OAAO;IAAQ,MAAM;IAAQ,MAAM,GAAGA,EAAI;IAAI,WAAW,SAAS,YAAY,MAAM;GAAE;GACxF;IACE,OAAO;IACP,MAAM;IACN,MAAM,GAAGA,EAAI;IACb,WACE,KAAK,UAAU,WACX,SAAS,CAAC,CACX,KAAKi1B,EAAS,CAAC,CACf,YAAY/lB,GAAS,8CAA8ClP,EAAI,WAAW,CAAC;GAC1F;GACA;IAAE,OAAO,UAAUmH,EAAG,MAAMA,IAAK,IAAI,MAAM,GAAG;IAAS,MAAM;IAAY,KAAK;IAAM,WAAW6tB,GAAO,UAAU;GAAE;GAClH;IAAE,OAAO,UAAU7tB,EAAG,MAAMA,IAAK,IAAI,MAAM,GAAG;IAAS,MAAM;IAAY,WAAW6tB,GAAO,UAAU;GAAE;GACvG;IAAE,OAAO,UAAU5tB,EAAG,SAASA,IAAK,IAAI,MAAM,GAAG;IAAQ,MAAM;IAAW,WAAW4tB,GAAO,SAAS;GAAE;GACvG;IAAE,OAAO,UAAU5tB,EAAG,SAASA,IAAK,IAAI,MAAM,GAAG;IAAS,MAAM;IAAY,WAAW4tB,GAAO,UAAU;GAAE;GAC1G;IAAE,OAAO,UAAUlyB;IAAQ,MAAM;IAAU,KAAK;IAAM,WAAWkyB,GAAO,QAAQ;GAAE;GAClF;IAAE,OAAO,UAAUryB;IAAQ,MAAM;IAAU,WAAWqyB,GAAO,QAAQ;GAAE;GACvE;IAAE,OAAO,QAAQlyB;IAAQ,MAAM;IAAQ,KAAK;IAAM,WAAWkyB,GAAO,UAAU;GAAE;GAChF;IAAE,OAAO,QAAQryB;IAAQ,MAAM;IAAQ,WAAWqyB,GAAO,UAAU;GAAE;GACrE;IAAE,OAAO;IAAe,MAAM;IAAQ,WAAWA,GAAO,YAAY;GAAE;GACtE;IAAE,OAAO;IAAkB,MAAM;IAAQ,WAAWA,GAAO,YAAY;GAAE;GACzE;IAAE,OAAO/E,KAAS,kBAAkB;IAAe,MAAM;IAAS,KAAK;IAAM,KAAK0E;IAAa,UAAUO,KAAU,CAACjF;GAAO;GAC3H;IAAE,OAAO,QAAQiF,IAAS,UAAU,QAAQ,MAAMnnC,EAAQ0K,EAAI,EAAE,EAAE;IAAU,MAAM;IAAU,WAAWs8B,GAAO,EAAK;GAAE;GACrH;IAAE,OAAO,QAAQG,IAAS,UAAU,QAAQ,MAAMnnC,EAAQ0K,EAAI,EAAE,EAAE;IAAU,MAAM;IAAU,WAAWs8B,GAAO,EAAI;GAAE;GACpH;IAAE,OAAO;IAAa,MAAM;IAAQ,MAAM,GAAG/0B,EAAI;IAAI,WAAW,KAAKk0B,GAAQ;KAAE,IAAI;KAAQ,OAAO9hB;KAAM,KAAK;IAAO,CAAC;IAAG,UAAUjL,MAAO;GAAE;GAC3I;IAAE,OAAO;IAAc,MAAM,GAAGnH,EAAI;IAAI,WAAW,KAAKk0B,GAAQ;KAAE,IAAI;KAAQ,OAAO9hB;KAAM,KAAK;IAAQ,CAAC;IAAG,UAAUhL,MAAO;GAAE;GAC/H;IAAE,OAAO;IAAkB,MAAM;IAAS,MAAM;IAAO,KAAK;IAAM,KAAKssB;GAAW;GAClF;IAAE,OAAO;IAAoB,MAAM;IAAS,MAAM,GAAG1zB,EAAI;IAAK,WAAWmY,GAAI,EAAE,OAAO,GAAK,CAAC;GAAE;GAC9F;IAAE,OAAO,gBAAgBpqB,EAAQ0K,EAAI,EAAE,IAAIA,EAAI,KAAK;IAAK,MAAM;IAAU,KAAK;IAAM,WAAWo8B,GAAO,KAAK;GAAE;GAC7G;IAAE,OAAO;IAAY,WAAWA,GAAO,MAAM;IAAG,UAAU,CAAChH,EAAO,QAAQ,CAACA,EAAO;GAAK;EACzF;CACF;CAGA,QAAgB;EACd,IAAI,CAAClf,EAAK,QAAQ,CAACA,EAAK,GAAG;GACzB,GAAW,CAAC,CAAC;GACb;EACF;EACA,IAAI5Y,IAAO,IACLwK,IAAK,iBAAiB;GAC1B,EAAO,KAAK,aAAarO,GAAOyc,EAAK,GAAG0e,EAAQ,CAAC,CAAC,MAAM,MAAMt3B,KAAQw3B,GAAWtxB,CAAC,SAAS,CAAC,CAAC;EAC/F,GAAG,GAAG;EACN,aAAa;GAEX,AADA,IAAO,IACP,aAAasE,CAAE;EACjB;CACF,GAAG;EAACvK;EAAQ9D;EAAOyc,EAAK;EAAMA,EAAK;EAAGA,EAAK;EAAM0e;EAAUV;CAAU,CAAC;CACtE,IAAMxa,MAAa,MAAc;EAC/B,IAAMlW,IAAIiW,EAAQxgB;EAClB,AAAKuK,MACL2S,GAAS,OAAO;GAAE,GAAGrb;GAAG,KAAK7B;EAAE,EAAE,GACjCy9B,GAAO;GAAE,IAAIlzB,EAAE;GAAG,IAAIA,EAAE;GAAG,IAAIA,EAAE;GAAG,IAAIA,EAAE;EAAE,CAAC,GAC7C40B,GAAe50B,EAAE,GAAGA,EAAE,CAAC;CACzB,GACMm0B,KAAYzhB,EAAK,OAAOuD,IAAU,CAAC,GAEnCijB,MAAe,MAAwB;EAC3C,IAAMpuB,IAAKgsB,GAAU;EACrB,IAAIhsB,GAAI;GACN,IAAM,EAAE,MAAG,SAAM+pB,GAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAA4B;GAC5E,GAAW/pB,EAAG,IAAIA,EAAG,IAAItP,GAAG+C,GAAGuM,EAAG,IAAI;GACtC;EACF;EACA,IAAI,CAAC8lB,GAAS,SAAS;EACvB,IAAM,EAAE,MAAG,SAAMiE,GAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAA4B;EAC5E,AAAIr5B,KAAK,KAAK+C,KAAK,MAAM/C,MAAMgB,EAAI,MAAM+B,MAAM/B,EAAI,OAAK8zB,GAAa,OAAO;GAAE,GAAG/2B;GAAG,IAAIiC;GAAG,IAAI+C;EAAE,EAAE;CACrG,GAEMyX,KAAM+N,KAAQ+R,KAAMnB,GAAQ5Q,EAAK,GAAGA,EAAK,CAAC,IAAI,MAC9CoV,KAAKpV,IAAOA,EAAK,QAAQyC,GAAMiK,GAAQj0B,EAAI,IAAIA,EAAI,EAAE,GACrD48B,MAAY,MAAmE;EACnF,IAAI,CAACrV,KAAQ,EAAE,YAAY,aAAa;EACxC,IAAMpO,IAAM,EAAE,WAAW,EAAE;EAC3B,IAAI2gB,GAAK,QAAQ;GACf,IAAI,EAAE,QAAQ,eAAe,EAAE,QAAQ,WAAW;IAChD,EAAE,eAAe;IACjB,IAAMp+B,IAAIo+B,GAAK;IACf,GAAW,OAAO,KAAK,IAAI7gC,GAAGyC,IAAI,CAAC,KAAK,EAAE,QAAQ,cAAc,IAAIA,IAAI,MAAMA,CAAC;IAC/E;GACF;GACA,IAAI,EAAE,QAAQ,SAAU,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,UAAW;IAEtE,AADA,EAAE,eAAe,GACjB6J,GAAOu0B,GAAK,KAAK,IAAItF,GAAQsF,GAAK,SAAS,CAAC,EAAE;IAC9C;GACF;GACA,IAAI,EAAE,QAAQ,UAAU;IACtB,EAAE,eAAe;IACjB,IAAM5/B,IAAK2/B,IAAM;IACjB,GAAS,MAAO98B,KAAI;KAAE,GAAGA;KAAG,WAAW7C;IAAG,CAAM;IAChD;GACF;EACF;EACA,IAAM2iC,IAAQlJ,GAAO,EAAE;EACvB,IAAIkJ,KAAS,CAAC1jB,KAAO,CAAC,EAAE,UAAUoO,EAAK,SAAS,SAAS;GACvD,IAAIkS,IAAS;IAEX,AADA,EAAE,eAAe,GACjBc,GAAUsC,EAAM,IAAIA,EAAM,IAAI,EAAE,QAAQ;IACxC;GACF;GACA,IAAItD,MAAU,CAAC,EAAE,UAAU;IAEzB,AADA,EAAE,eAAe,GACjBN,GAAO4D,CAAK;IACZ;GACF;EACF;EACA,KAAK,EAAE,QAAQ,UAAU,EAAE,QAAQ,UAAU,CAAC1jB,KAAO,CAAC,EAAE,QAAQ;GAE9D,EAAE,eAAe;GACjB,IAAM/c,IAAK,EAAE,eACP8hB,IAAM9hB,EAAG,MAAM;GAGrB,AAFI,EAAE,QAAQ,SAAQA,EAAG,kBAAkB,GAAG,EAAE,WAAYA,EAAG,gBAAgB,IAAK,GAAG,EAAE,WAAW,aAAa,MAAM,IAClHA,EAAG,kBAAkB,EAAE,WAAYA,EAAG,kBAAkB8hB,IAAOA,GAAKA,CAAG,GAC5E+b,GAAU79B,CAAE;EACd,OAAO,AAAI,EAAE,QAAQ,QACnB,EAAE,eAAe,GACjB42B,GAAS,MAAOj2B,KAAI;GAAE,GAAGA;GAAG,MAAMA,EAAE,SAAS,UAAU,SAAS;EAAQ,CAAM,KACrE,EAAE,QAAQ,WAAW,CAAC,EAAE,UACjC,EAAE,eAAe,GACjBk8B,GAAO,CAAC,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC,KACtB,EAAE,QAAQ,SACnB,EAAE,eAAe,GACjBA,GAAO,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC,CAAC,KACtB,EAAE,QAAQ,aACnB,EAAE,eAAe,GACjBG,GAAO;CAEX,GAGI0D,KAAoB;CACxB,IAAIvV,MAASuS,GAAK,UAAUtoB,KAAO;EACjC,IAAMzL,IAAOyL,MAAQgoB,IAAM,OAAOt+B,GAAQsW,IAAMgoB,GAAK,KAAK,GAAG,IAAI;EACjE,KAASM,GAAK,SACZ,kBAAC,OAAD;GAAK,WAAU;GAAa,MAAK;GAAU,cAAc,MAAM,EAAE,eAAe;GAC7E,UAAAA,GAAK,KAAK,GAAG,MAAM;IAClB,IAAM98B,IAAK/D,MAAM,KAAK,IAAIu7B,GAAQsF,GAAK,SAAS,CAAC;IACjD,OACE,kBAAC,OAAD;KAAkB,MAAK;KAAS,iBAAe98B;KAAI,WAAWA,IAAK,eAAe;KAAW,oBAAoBy3B,EAAUx7B,CAAC;KAAG,eAAesM,GAAOzK,CAAC;KAAtJ,UAAA;MACE,kBAAC,QAAD;OAAM,WAAU;OAAgB,UAAAA,EAAE;MAAW,CAAA;MAC7C,kBAAC,QAAD;OAAM,WAAU;OAAhB,UAAA;QAA+B;QAAE,CAAC,GAAGA,EAAE,MAAM,GAAIA,EAAE,WAAW,CAAC,KAAK,IAAI,CAAC,CAAE,CAAC,CAAC,KAAK,IAAI;QAAE;OAAO;;MAC9FkC,KAAM,kBAAC,OAAD;OAAK,WAAU;OAAgB,UAAAlC,EAAE;MAAU,CAAA;KAC/C;IAJK,GAAAA,EAAE,IAIP;GAET,CAAC;EACE,CAAA,IAEL,kBAAC,OAAD;GAAK,WAAU;GAAsB,cAAc,MAAM,EAAE,eAAe;GAA1E,UAAA,CACE,kBAAC,OAAD,EAAA,UAAA;IACG0W,GAAM;IAAK;IACX,CAAC,GAAGA,GAAM,MAAM,GAAIA,GAAM,WAAW,CAAC,KAAK,IAAI,CAAC,CAAE,CAAC,CAAC,KAAK,GAAG,GAAG,MAC9D,kBAAC,QAAD,EAAA,UAAA,CACGvY,MAAM8M,IAAO,kBAAC,KAAD,EAAA,UAAIjM,EAAK,CAAA,IAAIA,GAC1Bb,IAAIsK,EAAI,SAAS,IAAI,OAAO,EACzB,EAAA,GAHKtK,CAGL,CACP;IAAE;GAEA,EAAA,CAAA,GACL,kBAAC,OAAD;IAAK,WAAU;IAAgB,UAAAuY,GAAM;GAAU,CAAA,CAC5C;;CAET;CAGA,IAAMurB,KACJxV,KAAQ/N,KACJ;EACE,MAAMA,GAAI,IAAI;EACd,KAAKA,GAAI,IAAI;EACb,UAAUA,GAAI,IAAI;EAClB,OAAO,KAAK,IAAIA,GAAI,IAAI,GAAG,KAAK,IAAI,KAAK+N,EAAK,MAAM,SAAS,IAAI,EAAE,CAAC;EACpE,QAAQ,KAAK,IAAI/N,GAAI,IAAI,GAAG+N,EAAK,MAAM,MAAM,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC;EAClE,GAAI/R,EAAK;CACX,IACA,KAAA,GACAwnB,KAAuB,CAAC;CAC9B,IAAIzV,KAAQoS,GAAS,QAAQ;EAC3B,IAAIz/B,IAAK;EACT,KAAK,IAAM8E,KAAK26B,IAOd,AANI36B,EAAE,IAAI9E,KAAI8iC,GAAQ,KAAKzV,EAAK,MAAM,MAAMrtB,GAAI8E,EAAE,CAAC,CAAC,GACpDg+B,GAAQ,KACN,kBAAC,QAAD;GAAgB,OAAO,EAAE,OAAOh+B,EAAE,MAAM;GACrC,UAAAuoB,EAAK,MAAM,MAAMvoB,EAAE,GAAGA,EAAE,CAAC;EACtB,GAFKA,EAAE,CAEP,CACR,GACA,IAAKA,EAAE;EAET,GAAQ,KAAKuoB,EAAK,MAAM,MAAMrtB,CAAE,IAAI,GAAQ;CAC9C;CACA,IAAM+iC,YAAmB;EACvB,IAAI,CAACF,MAAW,CAACD,IAAQ;EACzB,IAAM3U,IAAO4U,GAAQ,MAAkBA,GAAQ,SAAoB;EACnE,OAAO5U,IAAM,MAAMlsB,EAAK,KAAM8gC,GAAQ,MAAiB,MAAM;GAAE,MAAMA,GAAQ;GAAgB,QAAQ9gC,EAAK,IAAK8gC,GAAQ,MAAiB;EAAE,IAAI;GAAE,MAAMA,GAAQ;GAAgB;EAAI;CACpL,EAAA,CAAG;CAEH,OACE,kBAAAxnC,GAAA,EAAA,UAAA;EACE,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACGD,EAAQ0K,EAAI,EAAE;MACdA,EAAI,KAAK;MACT,CAACs2B,MAAW,IAAIhhC,EAAQqkB,EAAK,EAAE,IAAIA,EAAK,KAAK;KAC3C;;IACJtF,IACC,kBAAC,SAAD;KACE,KAAKkgB;KACL,WAAU;KACV,OAAOoI;KACP,YAAY;KACZ,cAAW;KACX,eAAe,CAACpV,KAAQ,KAAKqR,GAAU,KAAA,GAAW,EAAI;KACtD,WAAW,MAAMsB,GAAQ,EAAE,MAAM;KACjC,WAAW,MAAMD,GAAU,EAAE,aAAa;KAC1C,WAAW2C;KACX,cAAc;MACZ,AAAI3J,EAAK,WACL1L,MAASA,EAAK,OAAO,CAAC+R,OAAML,GAAO;KACzC;IACD,CAAA,IAED,kBAAC,OAAD;KAAK,WAAU;KAAY,OAAO0D;KAC/B,UAAAA;IACE,CAAA;IAENpV,KAAQ,CAACgS,MAAUuD,MAAU,kBAAC,OAAD;KAAK,WAAU;KAAgB,OAAO;MAAE,MAAM;MAAI,KAAK;KAAG;KAAI,UAAAA;IAAY,CAAA;GACrG;;EACL,kBAAC,OAAD;GACE,KAAKjnB;GACL,WAAU;GACV,UAAU;GACC;GACX,SAAS,MAAM;IACb,AAAI0R,MACJ,EAAE,eAAe,GACjB,EAAE,cAAc,QAAQ,cAAcgU,GAAI,CAAC;GAC7C;GACA,QAAQ,MAAM;IACZ,AAAI,MAASlnB,MACb,EAAE,eAAe,GACjB,EAAE,cAAc,QAAQ,cAAcknB,GAAI,CAAC,GAC3CN,GAAW;GACb;GACA,UAAU,MAAM;IACd,AAAI,MAAS5mB,MACb,EAAE,eAAe,GACjBmoB,GAAU,EAAE,cAAc,QAAQ,YAAY,CAAC;GACjD;GAEA,UAAA,kBAAC,OAAD;IAAK,OAAO;KAAE,UAAU;KAAY,OAAO,KAAK,IAAIhH,IAASv5B,EAAK,CAAC;KAAG,QAAQ,KAAK,IAAIw5B,GAASx5B,EAAK,CAAC;IAAE;IACtG,UAAA,kBAAC,OAAD;KACE,WAAU;KACV,OAAO;MAAE,OAAOA,EAAK;MAAG,QAAQA,EAAK;MAAG,GAAIuZ,EAAK;KAA2B;KAC/D;KACA;KACb,gBAAgB,MAAM;MACpB,IAAI,CAACnB,GAAU;MACf,EAAE,eAAe;MACjB,IAAM,EAAE,MAAG,SAAMgkB,GAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAA4B;MAE5E,AADIr5B,KAAK,KAAK+C,KAAK,MAAM/C,IAAI2a,EAAK,MAAM3a,IAAI2a,EAAK,MAAM5X,IAAI4X,EAAK,MAAM5X,IAAI4X,EAAK,OAAK+c,GAAO;OAAE,IAAI13B;OAAG,IAAI+C;OAAG,IAAI/C;OAAG,IAAI+C;MAAE,CAAC,GACzH2yB,GAAO;OAAE,GAAG,EAAE;OAAS,GAAG,EAAE;MAAQ,CAAC;KACvC;KACA,qBAAqB,CAACnN,KAAQ,KAAKqR,GAAU;KAZ/C,UAAA;MAcGjC,GAAO,QAAQj9B,IAAIC,IAAIC,IAAIC,IAAIi8B,GAAQC,GAAQf,IAAKiD,IAAInG,KAAKoG,IAAIlC,GAAOC,EAAK;MAC7E+B,KAAK,KAAKrB,GAAO,OAAO,GAAGqB,KAAK,GAAGp+B,IAAIC,IAAIi8B,GAAQ,GAAGd,IAAKiD,IAAInG,IAAIkE,GAAOkC,EAAE;MAC5E1E,KAAK,KAAKmD,GAAO,QAAQj9B,IAAIC,IAAI,GAAG65B,KAAK,GAAG,GAAGuC,GAAQf,GAAIlD,KAAKoG,IAAID,IAAIhC,EAAK;MAC7E+B,KAAK,KAAKxE,KAAK,KAAKmD,GAAO,MAAM,GAAGqB,KAAK,GAAG,GAAGxE,KAAK,GAAG,GAAG,GAAGwB,GAAIlD,IAAImG,IAAIC,EAAE;MAC3EL,GAAW,MAAMj+B,IAAIC,IAAIi8B,GAAQd,IAAKiD,IAAIjC,CAAK;MAC/CxC,KAAK,KAAKqE,GAAW,OAAO,GAAGrE,KAAK,GAAG,GAAGwB,GAAIiD,EAAE;MAChDH,GAAW,MAAMp+B,IAAIC,IAAIo8B,GAAQjE,KAAKoG,IAAIjC,EAAK;MAC/C+B,KAAK,KAAKF,GAAW,OAAO,GAAGE,KAAK,GAAG,GAAGlG,IAAIoG,EAAE;MAChDF,KAAK,KAAK,kBAAC,OAAD;OAAK,WAAU;OAAc,OAAO;QAAE,MAAM;QAAG,KAAKlG,KAAKoG,KAAK;QAAG,OAAOj8B,EAAK;QAAG,QAAQ;OAAE;MAAI,CAAA;MACxGu3B,KAAK,KAAK,kBAAC,OAAD;OAAK,WAAU;OAAc,OAAO;QAAE,MAAMwB,IAAKiD,KAAK;QAAG,KAAK;QAAG,OAAO;QAAG,QAAQh8B,EAAK;OAAE;MAAI,CAAA;MACzG,kBAAC,OAAD;OAAK,WAAU;OAAY,OAAO;QAAE,OAAO+4B;QAAI,QAAQlD;OAAG;MAAI,CAAA;MAC7DvK,KAAQgS,MAAUwD,MACjB,kBAAAxnC,GAAA,EAAA,UAAA;OACGynC,GAAQ,SAAS,KAChB,kBAAC,OAAD;QAAK,KAAK1I;QAAO,WAAU;QAA0B,OAAOyI;QAAS,eAAA;QAClE,UAAAC;OACE,CAAA;OAEP,kBAAC,YAAD;QACE,KAAK3I;QACL,WAAW2I,GAAQ,SAAS,iCAAiC;QAC7D,YAAY;QACZ,OAAOzV,EAAK;QACZ,OAAOwV;QACP,cAAc,MAAM,EAAE,gBAAgB;QACtC,WAAW,MAAM7C,GAAQ,EAAE,MAAM;QACjC,WAAW,MAAMD,GAAU,EAAE,aAAa;QAC1C,WAAW,MAAM;SACf,AAAI3F,GAAM,YAAS,GAAM,QAAQ,YAAY,EAAE,cAAc;QAC/D;QACA,WAAWsI;QACX,SAAS,MAAM;SACb,IAAI,GAAK,SAET;cAAI,EAAE,iBAAiB,EAAE,kBAAkBrI,GAAM,SAAS,OAAOvB,GAAS,MAAOj2B,KAAI;WAAE,GAAGA;WAAG,KAAK;WAAM,MAAM;UAAE,CAAM;UACtH,GAAO;SAD+G;QAExH;OACD,CAAA;OACA+/B,MAAUG,MACT,kBAAC,OAAD;QAAK,WAAU;QAAgB,OAAOA;QACnC,UAAAH;OACE,CAAA;MAEP,EAAA,CAAA;KAED;;GACF,CAAA;EACF,CAAA;EACJzoB,KACC,kBAACsa,IAAD;GACE,KAAKwM;GACL,MAAM3lB,EAAK;GACX,QAAQA,EAAK,QAAQgP,GAAQxkB,EAAI,IAAIA,EAAI,EAAE,MAAM;GACzC;GACR,QAAQ,CAAC,EAAEo1B,EAAO,QAAQA,EAAO;GACjC,WAAW54B,EAAE;GACb,SAASoa,OAAY;GACrB,UAAUykB;GACV,UAAU3b;GACV,QAAQ4b;GACR,QAAQvO;GACR,eAAe;IAEb,AADAlW,GAAY,MAAO9Z,MAAM,OAAOynB,GAAQxkB,EAAI,IAAIA,EAAI,EAAE,IAAI,IAAK,GAC/D04B,GAAU;GACZ;GACA,SAASyD;GACT,UAAUC;GACV,mBAAmB,KAAKX,GAAQ;IAAE,IAAI;IAAa,MAAM,CAACj/B,EAAE;GAAU,CAAC;GACvE,SAAS,MAAQ0J,IAAKm2B,GAAOn2B,CAAE,IAAI,KAAK0yB,GAAU,GAAG;GACrD,QAAQ0D;GACR,QAAQC;GACR,cAAcpmB,GAAS,OAAO;IAAE,GAAGrb;IAAG,MAAM;IAAM,MAAMA,EAAE,OAAO;GAAE,EAAE;EACtE,CAAA;EAEFob,EAAK,QACJ,kBAACtE,IAAD;GACE,OAAOsE,EAAK;GACZ,OAAOA,EAAK;GACZ,OAAOuD,EAAQ;GACL;GACV,SAASvD,EAAK;GACd,aAAY;GACZ,UAAU,MAAMC,GAAS,OAAO;IAAE,GAAGrb;IAAG;IAAG,KAAK;GAAE,EAAE;GACpD,QAAQ,MAAM2e,EAAQ,UAAUC,IAAWxD,EAAK,MAAMzV,IAAIgZ,EAAQ,UAAUA,EAAQ,MAAM;GAC1F,eAAe;IAEb,AADAtD,GAAS,OAAO;KAAE,GAAGrb;KAAG,MAAM;IAAM,EAAE,GACtC49B,GAAU;GACZ;GACA,YAAY,GAAM,MAAQ;IACxB,IAAMl1B,IAAIiW,EAAQ,KAAK,IAAIvD,EAAK,KAAKuD,EAAQ,SAAS,CAAC;IACvD,AAAKjW,KACLgN,GAASjT,EAAO,KAAK,gBAAgB9D,GAAOyc,EAAK,GAAGhe,GAAM08B,IAAUrxB,IAAM,KAAA,IAAY;KAAE,GAAGC,EAAE;KAAG,GAAGA,EAAE;IAAE,CAAC,CAAC;GAC3G;GACA,SACE,kBAAAjO,GAAA,EAAA,UAEI;IACE,CAAC,aAAa,YAAY;IAC1B,CAAC,SAAS,aAAa;IACvB,CAAC,YAAY,aAAa;GAC5B,CAAC,CACD,KAAK,CAACiL,GAAGM,OACT,kBAAC,SAAD;IAAe,WAAU;IAAzB,UAAA,CACE,kBAAC,SAAD;KAAO,MAAK;KAAW,SAAS,CAAC,CAAC8zB,GAASp0B;KAAI,WAAW,MAAMq0B,IAAa,OAAO;MAAE,GAAG30B;OAAIM,IAAI1I,EAAE,OAAO;KAAQ,EAAE;IAAI,CAAA,GACvHgJ,CACI;GAHK,GAAAN,CAGL,CACR,EACD,CAAA;EAEL,CAAA;EAEFgW,MAAS,kBAAC3O,IAAD;GAAO,MAAM2O;GAAO,cAAcC,GAAS,IAAI;EAAI,CAAA;EAC5D5C,MAAO,kBAAC9M,IAAD;GAAa,GAAG8M,GAAI;GAAG,GAAGA,GAAI;GAAG,OAAO2H,GAAS;GAAG,eAAekZ,GAAO,IAAI;EAAI,CAAA;CAC1F,EAAA,CAAA;AAEN;;ACtmDA,IAAMwI,qBAAe,IAAI,QAAwB,GAC7CC,KAAkB;AAEtB,SAASC,GAAQ,GAAsC;CACrD,IAAI,CAACl9B,GAAG,OAAO;CACf,IAAI;CACJ,IAAI,OAAOA,EAAE,aAAc,UAAU,IAAIA,EAAE;MACtC;EACH,IAAI4H,IAAKo1B,GAAa,IAAIh9B,EAAE,SAAS;EAErC,AADI4H,MAAO,KAAA,KAAWo1B,GAAa,IAAIh9B,EAAE,WAAY,IAAK,EAAEi9B,EAAgB,GAC5E,IAAI,IAAIr1B;CACV;CACA,OAAO,GAAG,EAAE,GAAG5H,EAAE,KAAK,GAAGA,EAAE,QAAQ,EAAE,GAAGA,EAAE,KAAK,MAAM,GAAG,GAAGA,EAAE,KAAK,KAAK,GAAGA,EAAE,KAAK,SAAS;AAC5F;AASA,SAAgBm9B,GAAU,GAA2C,GAA8C;CACjH,IAAM,CAACvP,GAAOC,KAAY5xB,EAAsB;EAAE,QAAQ;EAAM,QAAQ;CAAK,CAAC,GACxEiL,IAAMg2B,GAAQzwB,CAAI,GAClB2wB,IAAUthC,EAAO2Q,CAAI;CAuB3B,OAtBA,EAAQ,UAAUA,GAClBpR,QAAgB;EACd,IAAM2E,IAAIo9B,EAAQ;EAClB,IAAI,CAAC//B,KAAU,CAAC2C,GAAG;GACjB,EAAS;IAAE,QAAQ;IAAM,QAAQ;GAAK,CAAC;GACvC;EACF;EACA,IAAI6B;EACJ,IAAI;GACF,IAAIzK,GAAYiG,GAAQ2C,CAAC;EAC3B,SAAS,GAAG;GACV,EAAS;IAAE,QAAQ;IAAM,QAAQ;IAAS,OAAQ,EAAY;GAAQ,CAAC;GACvE;EACF;EACA,IAAMq9B,UAAaxP,EAAS;GAAE,QAAQhsB;GAAG,QAAQA,EAAE;GAAQ,OAAOA,EAAE,QAAQ;EAAM,CAAC;EACnF,EAAK;EACL,IAAMoV,IAAO,CAACpV,EAAE,GAAG,UAAUw7B,CAAI,GAAGx7B,EAAE,GAAG,SAASw7B,CAAI,CAAC;EACvD,aAAa;GAEX,AADApmB,EAAK,SAAS,MAAMrc,EAAE,CAAC,GACvBiH,EAAE,MAAM;EACV;CACF,GAAG,CAACxE,GAAQ6J,CAAG,CAAC,GACT0mB;AACT;AAEA,IAAM0P,MAAY,MAChB/iC,EACG,MAAM,KAAK,CAAC,CACZ,OAAO,OAAO,CAAC,CACf,MAAM,GAAG,CAAC,CAAC,CACX,KAAK,MAAM6B,EAAE,EAAE,CAAE,YAAY,CAAC,CAAC,CAC/B,KAAK,EAAE,KAAK,KAEXmhC,KAAsC;CAC1C,YAAY;CACZ,SAAS;CACT,MAAM;CACN,SAAS;CACT,OAAO;AACT;AAGA,SAAgBC,GAAU,EAAE,WAAQ,YAAyD;CAC3F,IAAMnH,IAAQlyB,IACX,MAAOlN,GAAeoG,GAAQ2I,CAAE,SAC3BzP,EAAS8G,CAAM,CACvB,GACM,CAACogC,GAASC,KAAczhC,EAAS,CAAC;CAOxC,IANAZ,QAAgB;EACd,IAAMiB,IAAIsxB,EAAM,QAAQ;EACxB,IAAI,CAACtxB,GAAG;EACR,IAAM/D,IAAI,kBAAkBmlC,EAAWphC,EAAE,OAAO,GAAG,GAAG;EACtD,aAAa,cAAc/D,CAAC;CAC9B,GAAG,CAACq1B,EAAM,MAAM,CAAC,GACb,CAACA,EAAM,QAAQ,OAAO;CAC1B,IAAMrsB,IAAQqsB,EAAM,WAAW,UAAUA,EAAM,SAAS,0BAA0BA,EAAM,WAAW,UAAU6P,IAAU,UAAUA,EAAQ,SAASA,IAAU,IAAI,MAAM,GAAG,KAAKF,GAAM3P,EAAM;CAC1L,OACE,kBAAC,QAAD;EAAM,WAAU;EAAhB,UAAA,CACE,kBAAC,QAAD;GAAM,WAAW,8BAA8BA,EAAM;GAAiB;GAAtE,UAAA,CACE,kBAAC,QAAD,EAAM,WAAU,gBAAiB,CAAA,GACjC,kBAAC,QAAD;IAAM,WAAU;IAAmB,UAAAA,EAAM,WAAW,SAAUyI,EAAM,SAAS,GAAGA,EAAM,SAAS,EAAE,YAAY,SAAUkH,GAAM3P,EAAM;GAAc,CAAA,CAC7I;EACL,CAAA,GAAAyI,EAAM,SAAS,KACd,kBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACGA,EAAM,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,MACtB,kBAAC,QAAD;IAAmB,WAAU;IAAU,OAAO,EAAE,YAAYx5B,EAAE,MAAM;IAAG,OAAOA,EAAE;IAC7E,UAAAygC,GAASzgC,EAAE,IAAI;GACZ,GAFKA,EAAE,IAEP,CACP,GACAw5B,EAAM,SAAS,KACd,kBAAC,QAAD;IAAM,WAAU;IAAuB,OAAOA,EAAM,MAAM,CAAC,CAAC,CAAC,KAAK,MAAMx5B,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI;IAAzF,UAAA,CAA4F,KACxFw5B,EAAM,SAAS,CACb;GAEJ,CAAA,CAAA;EAEJ,CAAA,CAAA;;AAEV;AAeA,SAAgBsH,GAAY,EAAE,WAAQ,aAA6D;CACjG,IAAM9hC,IAAMC,EAAuB,IAAI,GACjCu6B,IAAQlyB,IACX,MAAOlN,GAAeoG,GAAQ2I,CAAE,SAC3BzP,EAAS8G,CAAM,CACvB,GACM,CAACugC,GAAOC,KAAY5hC,EAAiB,CAAC,CAAC,GACvCkC,IAAS2X,SAAcugB,EAAM,QAAQ,MAAMx5B,EAAE,YAAaA,EAAE,SAA4B,MAAM,MAAM,GAAG,CAACw5B,CAAK,CAAC;CA+CpH,OA7CAh7B,QAAgB;EACd,IAAMyiC,IAAQjiC,EAAI,SACZ2E,IAAOs9B,GAAO;EACpB,IAAI,CAACA,KAAS,CAACt9B,KAAQ,CAACrC,EAAO,QAAQ;GACrC,EAAS,CAAC,CAAC;GACX;EACF;EACA,IAAIxB,IAAM,GACJohC,UAAgB;GACpB,IAAM;GACN,IAAM38B,IAAO08B,EAAM,sBAAsB,GACnCjd,KAAO,OAAgB;IAAE,GAAG/hB,EAAE,OAAOsC,EAAK;IAAM,GAAGtC,EAAE,MAAMsC,EAAK;IAAK,GAAGtC,EAAE;IAAO,GAAGA,EAAE;GAAO,IAC7F1G,IAAc,CAAC;GACrB,KAAK,IAAMyE,KAAKsB,GAAQ;IACtB,IAAMmF,IAAI06B,GAAMnhC,GAAG2D,GAAMy9B,GAAQ5gC,CAAM;IACvC,AAAKiG,KACLlL,EAAI,KAAK;KACP,KAAK,OAAOyE,EAAE,IAAI;KAClB,OAAOA,EAAE;KACT,MAAMA,EAAE;KACR,OAAOyG,EAAE,QAAQ;MAAE,GAAGA,EAAE,MAAM,OAAOlC,EAAK;MAAM,GAAGkC,EAAE,MAAM,MAAMlC,EAAK;MAAK,GAAGkC,EAAE,MAAM,UAAU;KAAG,IAAI,KAAA;KACvG,OAAOA,EAAE,IAAI,IAAIud,CAAG;KACpB,SAASvd,EAAE,UAAUud,EAAIvd,EAAE,OAAO,IAAI,KAAA;IACxC,CAAC;GACH;GACA,EAASlL,CAAG;EACd,GACM8lC,UAAiB;GACrB,AAAUvhC,MAAM,sBAAsBohC,CAAO;EAC/C;EAGA,AAFAG,EAAS,GACT19B,EAAK,iBAAiB,UAAU09B,GAAU,EAAI,GAC9C,OAAO,iBAAiB,UAAUA,CAAQ;EAC1C,IAAMC,IAAYF,GAAQ,GAAG,UAAUC,CAAQ,GAEzC3lC,IAAI,YAAY2lC,GAAU,GAAG;EACnC,aAAa;GAKX,AAJA,qBAAqBvhC,CAAG,GACxB6D,EAAK,oBAAoB,UAAU09B,GAAU,EAAI,GACjD,OAAO,oBAAoB,UAAUA,CAAQ,GAC7CC,IAAY,GACZ,cAAc5lC,CAAC;EACjB;CACF,GAAG;EAAC4F;EAAQ8/B;EAAQ5gC;CAAM,CAAC,GAGzB,kBAAC,OAAD;EAAU;EAAK,WAAU;EAAgB,eAAA;EACtC,UAAAugC,EAAM,KAAK,MACV,kBAAC,OAAD;GAAiB,OAAO,EAAE,UAAUt6B,EAAE,MAAM;GAA5C,UAAA;IACGA,EAAE,MAAM,KAAK,GAAG,MACf,kBAAC,OAAD;KAAa,WAAU;KAAc,OAAO;MAAE,MAAMT,EAAE;MAAG,KAAKA,EAAE;MAAG,OAAOA,EAAE;MAAG,QAAQA,EAAE;KAAE;IAAI,GAArF9J,CAAqF,CAChG;IACAuK,EAAE,WACD,kBAAC,OAAD;KAAK,WAAU;KAAkB,OAAO;MAAE,MAAMA,EAAE,QAAQ,IAAI;MAAG,KAAKA,EAAE,QAAQ,IAAI;MAAG,OAAOA,EAAE,QAAQ,IAAI;MAAG,QAAQA,EAAE,QAAQ,IAAI;KAAE;KACrI,UAAA,kBAAC,QAAD;MAAM,WAAU;MAAgB,UAAAA,EAAE;KAAW,CAAA;IAC1C,CAAA;IAENA,EAAE,SACD,kBAAC,OAAD;KAAK,WAAU;KAAgB,OAAO;MAAE,MAAMA,EAAE,MAAM;MAAG,KAAKA,EAAE,MAAM;MAAG,QAAQA,EAAE,MAAM;KAAE;KACzF,UAAA,kBAAC,QAAD;MAAM,WAAU;MAAgB,UAAAA,EAAE;KAAW,CAAA;IAC1C,CAAA;GAEJ;EAdK,GAAAA,EAAE,GAcP,CACN;CACE,CAAA;AAET;AAEA,SAAS06B,GAAM,GAAa,GAAmB,GAAuB,GAA8F;CAClK,IAAMI,IAAKvhC,EAAE;CACb,IAAIuhC,EAAG,MAAM,QAAQ;EACnB,IAAM,IAAIH,GAAQ,MAAMz9B,GAAM3D,CAAC;EAC/B,OAAO,IAAI;GAAE,OAAO,EAAE;GAAO,KAAK,EAAE;EAAI,IAAI;CAC9C;CACA,IAAIuhC,EAAG,MAAM,UAAUA,EAAG,OAAO;EAE/B,IAAMrlC,IADOsE,EAAO,KAAK,MACT,OAAO,WAAW,MAAMf,EAAE,SAAS8hC,EAAG,KAAK,KAAK,IAC1Dzb,IAAQ5pB,KAAK,IAAIyH,EAAK,cAA2B,gBAAgBzH,IAAI,EAAE,GAAG,IAAI;EAGpF,OAFK4pB,IAEE;GAAE,KAAK,CAAC;GAAG,WADPyb,EAAG,QAAQ,KAAA,IAAyE,OAA7Dzb,EAAM,cAA2B,cAAcyb,EAAG,IAAI,GAAG,MACzDzb,EAAA,CAAO,sBAAsB;EAAE,IAF9C;CAGrB;CACA,OAAO;AACT;;ACzIA,IAAM0b,KAA8B;CAAE,MAAM;CAAS,MAAM;CAAS,MAAM;AAAQ,GAC5EC,KAAoC;CAAE,MAAM;CAAqB,MAAM;CAAwB,MAAM;AAAwB;AAEnI,SAASC,GAAS,GAAW;CAG3B,OAFI/iC,IAAI,OAAa,GAAGA,EAAE,MACtBA,IAAI,UAAoB,IAAIA,IAAI,KAAA,CAAM,QAAQ,CAAC,EAAE,OAC9C,IAAIA,IAAI,OAAO,KAAA,CAAM,QAAQ,CAAC,EAAE;AACzC;AAEA,SAAgBgjC,GAAU,GAAuB;CAC/C,IAAM,EAAE,QAAK,SAAM,cAAW,UAAO,aAAU,IAAM,iBAAc,SAAM,eAAY,YAAS,gBAAa,WAAQ,gBAAa,WAAQ,eAAYx/B,GAC9I,EAAE,eAAY,IAAM,eAAY,IAAM,mBAAgB,IAAM,cAAW,IAAM,eAAY,IAAM,sBAAmB,IAAM,WAAQ,qBAAkBA,GAClJ,CAAC6c,GAAS4iB,KAAcxiC,EAAS,CAAC,CAAC+C,EAAM,QAAQ;CACvD,QAAgB;EACd,AAAIA,EAAM,aAAa,KAAA,KAAWy/B,EAAW,CAAC,CAACz/B,EAAM,QAAQ;CAC/D,GAAG,CAACA,EAAM,QAAQ,CAAC;CACnB,IAAM,CAAC0/B,GAAOC,MAAiB1iC,EAAS,EAAK,GACvC,CAAC2iC,IAAQC,MAAa5iC,EAAS,EAAK,GACpC,CAAC6iC,IAAOC,MAAY9iC,EAAgC,IAAI;CAC9D,SAAyBwlB,GAAaud,CAAW,GAAG,CAACA,CAAW,CAAC;CAEjE,IAAM,CAACC,GAAQC,KAAajjC,EAA0B,IAAI,GACpD,CAACkjC,IAASC,MAAcnjC,EAAwB,IAAI;CAC1D,QAAgB;EAEd,AADAijC,EAAU,IAAI,GACdE,GAAW,IAAI;CACjB,GAAG,CAACznC,CAAG,CAAC;CACR,IAAM0nC,KAAWJ,IAASA,EAAO,OAAO1kC,GAElC,EAAE,WAAQ,WAAO,YAAS,gBAAaozB,GAAYsR,IAASA,EAAO,MAAMtnC,GAAK;EAAE,MAAM0nC;EAAU;EAAS;EAAa;CAAO,CAAC,GAC9HC,KAAUH,MAAWE,IACrBpB,IAASd,GAAU9/B,GAAQ2B,EAAM,MAAM,GAEvCugC,IAAU,CAACvgC,EAAM,UAAUi/B,EAAO,WAAW,UAAUA,EAAO,WAAW,WACzE,CAACuB,IAAUC,MAAexjC,EAAiC,IAAI;CAKrE,AAHAZ,QAAgB;EACd,AAAIgC,KAAQqiC,IAASriC,CAAM;CAC7B,GAAG,CAACA,GAAQqiC,CAAM,CAAC,GACnBrkC,QAAgB;EACd,AAAIskC,MAAOC,IAAUD,EAAK;CAC5B,GAAG,CAACA,IAAOC,CAAO,CAAC;CAGnB,IAAMC,KAAc/jC,EAAO,EAAK;CAChC,QAAgB;EAEd,AADA6iC,GAAc,CAAC,CAACthC,KAAUwiC,GAAY,OAAO,GACzCxiC,MAAQ,GAAY,UAAU;CACpC,GAAG,CAACA,CAAM,CAAC;CACX,IAAMyiC,IAAWC,IACd,MACCpB,IAAe,OACT/lC,MAAS2H,KAAGy/B,IAAgBz/B,CAAC,GAC1BA,EACR,GACH,CAACy/B,CAAa,CAChB,GACMC,KAAYd,OAAY9hC,GAAQ,QAAQiiC,MAAW,YAAA,CAAa,QAAQ,YAAY,EAAE,GACtFY,KAAWD,KAAY5iC,IAASghC,GAAIhhC,EAAO,QAAQ,KAEnD8iC,KAAUC,MAAc,CAAC,CAACC,KAAUC,IACpCC,IAAOR,GAAY,YAAY;EACnC,IAAK1iC,KAAU,OAAW8iC,IAC1B;MAAU,EAAI;GACd,IAAI;IACF,IAAMt7B,IAAO,MAAMxH,EAAO,KAAK,MAAM;IAGrC,AAFIgjC,IAAQ,MAAMA,EAAOx7B,GAAMq7B,EAAQ,IAClCt7B,GAASC,GAAMq7B,EAAQ,GAC5BJ,EAAS,EAAK;GAChB,SAAS,GAAG;IAEV,AADAF,IAAU,CAAU,GACpB,QAAQ,MAAM,+BAA+B,CAAC;GAChD,UAAU;IACR,GAAU,EAAK;GACjB;EAXc;CAYhB,GAAG;EAACviC;EAAQuhC;EAAQuB;EAASE;EAAQH;EAAUJ;EAAUF;CAAO,CAAC,GAC3DY,IAAU1kC,EAAuB,IAAI,GACrC2kC,KAAY3kC,EAA4B,IAAI,GAC5C4kC,KAAM5qB,UACH;EAAE,KAAKgpB;EAAO,UAAUjjB,KAAW0jB;EAAS;EAAU;EAAM,aAAae;EAAe;EAAQ;EAAS;CAAU,IAC1H;EAACxB;EAAOjjB;EAAS0jB;EAASO;EAAUS;EAAMD;EAAejjC;CAAM,CACjE,GACM0sB,KAAUjuB,EAAuB,IAAI;CAE3C,QAAgB;EACd,IAAM0E,IAAOupB,GAAQ;EACrB,IAAI,CAAC4W,KAAoB,CAACngC,GAAM;EAChC,IAAM1D,KAAM,MAAqB;GAC/B,IAAIlF,EAAE,oBAAoB,EAAEA,EAAE,WAAWA,EAAE,YAAYA,EAAE,UAAUA,EAAE,YAAYA,EAAE,IAAI,YAAY,MAAM,KAAK;GAC9G,IAAMmG,IAAUnG,EAAE,aAAa,CAAC,CAAC,MAAMA,EAAE;GACzC,AAAKmG,KAAUyC,EAAK,SAASzC,CAAM,KAAMD,GAAYC,CAAM,KAAK,CAAC0iC,GAAU,YAC3E7oC,EAAE,eAAe,GACjB6oC,GAAU,QAAQ;EACpB,GACMviC,IAAMsC,EAAK;EAEjB,OADAtC,EAAI,iBAAiB,WAAWpB,CAAE,SACrBoB,EAAI,oBAAoB,WAAWpB,CAAE;CACpD,GAAG,CAAC6jC,CAAgB,CAAC;CAGrB,IAAM,CAACrqB,GAAOC,KAAYta,EAAwB,IAAI,GAChD2kC,KAAab,SAAkBxpB,EAAS,IAAI,GAAG,CAAC,CAAC,GACjD,CAACsqB,IAASC,MAAc7kC,EAAsD,IAAI,GAClF,CAACw2B,IAAUC,MAAez2B,EAAS,EAAK,GACxC,CAAC8kC,IAASC,MAAc/kC,EAAS,EAAK,GAEtCglC,MAAW,GAAiB,MAAqBvC,IAAQoC,GAAW;EAAE;EAAS;CAAI,CAAC,IAAIxwB,EAAI,GAC5FnQ,KAAO4/B,IAAa,GAAe,IAAO,OAAU;EAIxD,AAHA,GAAY,UAAU7hC,EAAI,WAC1BkhC,GAAW,IAAI,GACfF,EAAUhhC,CAAG,GACTmpB,KAAMoX,EAAW,EAAI;CAC3B,GAAG,CAAC,CAAC,GACCyC,KAAUC,KAAYC,KAAa,CAACpiC,EAAM,QAC1CqiC,KAAc1d,GAAe;EACjC,MAAMtmB,GAAQ;EACd,MAAM4iC;EACN;EACA,WAAWkB,KAAYG,KAAa/B;EACpC,SAAS4B,KAAYhB;EACrB,aAAagB,KAAYb,KAAiB,CAAC,CAACjjC;EAC5C,KAAKmjC;EACL,SAAS,MACPS,GAAQ,SAAS3C,GAAS/vB,EAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,oEAAoE;GAEhH,CADcA,MAAS,SAASmR,GAAY,CAAC,CAAC,IAAInR,MAAS,SAASwP,GAAW,CAAC,GAAG,QAAQ,IAAIwC,GAAU,EAAA,CACnG,MAAM,MAAQpgB,GAAK;IAAE;IAAK,MAAMm+B,GAAS/vB,KAAQ8vB,GAAI9vB;IAAO,WAAW;GAAM,GAAG+yB,CAAS,IAAI,MAAa/qB,EAAS,EAAE,OAAO,CAAC;EACrI,CAAC;EACH,OAAO,MACL0qB,GAAQ,YAAY5wB,EAAK,KAAK,qEAAqE;GACjG,GAAWA,CAAI,CAAC,CAAC,KAAKlQ,KAAO,MAAaoW,EAAS,EAAE,OAAO,CAAC;EAC/D,CAAC;EACH;EACA,kBAAkB,YAAY;GAC5B,AAAKlZ,MACLuH,GAAS,MAAMvH,EAAO,KAAK,MAAM,GAAG6iC,EAAQ,GAEvCG,KAAQP,EAAS,EAAK;EAC7B;EACA,cAAcpN,GAAY,EAAI;EAC9B,eAAesO,GAAW,EAAI;EAC9B,OAAOhiC,EAAM;EACb,OAAOA,EAAM,iBAAiB,CAAC;EAC/B,QAAQuX;CACV,CAAC,GACK+W,MAAa,MAA2B;EAC5C,IAAI,EAAE,oBAAoB,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU;EAC/E,IAAMhtB,IAAI,EAAE,IAAI,YAAY;EAC5B,IAAIA,MAAM,KAAK;GAEb,IAAIxC,GAAY,EAAE,MAAM,KAAK,CAAC2iC,GAAU,SAAS;GAEjD,AADA,EAAE,eAAe,GACjBA,GAAU,QAAQ;EACpB,OAAO,IAAKU,GACP,AAAI7gC,MAAM,OAEb,EAAE,eAAe,GACbggC,KAAee,GAAY,IAAI,OAAO,KACjC/gC,MAAM,OAAO4gC,OACtB,EAAE,eAAe,GACjBG,GAAY,IAAI,MAAM;OAPF;CASxB,GAEME,IAAMC,KAAYA,EAAS,QAAQ,IAAI,KAAK,IAAI,KAAMA,EAAS,SAASA,EAAS,QAAS,GAAG,IAAI,GACjG5d,KAAOmM,KAAY,CAAC,CAACyR,KAAYD,IAAM,KACvChgC,KAAQ49B,MAAW9hC,GAAQ,QAAQiiC,OAAY,OAAO3nC,KAAQ,WAAW,mBAAmBA,EAAI,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,EAAE,IAAKA,GAA0B,SAAS,IAEjLinB;CAuBJ,OAtBA,AAUEA,IAVE+gB,KAEA,kBAAC,OAAD;EAAK,WAAU;EACb,UAAA,kBAAC,OAAD;GAAK,WAAU;GAAW,MAAK;GAA/B,UAAA,CACE,kBAAC,UAAD,EAAA,UAAQ,wBAA6B,CAAA,GACrC,kBAAC,OAAD,EAAA,UAAMA,GAAM,QAAa,CAAA,CACtB;;CACF,CAAA,IAEGtiC,IASDA,EAAO,SAAS,SAAe,kBAAC8X,IAAD;EAA0D;EAAQ,aAAavO;CAAO,GAAvE,OAAOvJ,EAAO,IAAI,IAAIA,EAAO,IAA0C,IACvHA,EAAO,SAAS,SAAe,kBAACg1B,IAAD,EAAkB,UAAS,CAAA,IACvD,kBAACxI,IAAD;EAAkB;EAAQ,aAAajjB;EAAkB;CAAa,CAAA,IAVzEjP,KAAOsnC,IACZ,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,kBAAC,OAAD,EAAK,WAAU,aAAc,CAAA,GAC7B,kBAAC,OAAD,EAAA,UAAMuC,GAAU,UAAU,cAAcA,EAAS,QAAQ,gBAAgBjD,GAASiD,EAAS,MAAM,EAAE,KAAKjD,GAASiD,EAAS,KAAK,MAAM,WAAgB,CAAA,CAClJ;CAEL,CAAA,IAAA,kBAAC,OAAD;EAAK,WAAU;EAAY,UAAA;CAAgB,CAAA,GAO7C,kBAAC,OAAD;EAAK,KAAKzX;EAAS,WAAWyH,IAAY,WAAWA,MAAc;EAAkB;EAAkB;EAAvG,UAAA;GACGiQ,KACC,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACGpkC,KAAU,kBAAC,QAAD;MAAM,WAAW,qBAAqBA,EAAO;MAAS,UAAAA,EAAO;KAAW,CAAA;KAClF8jC,KAAY,kBAAC/c,IAAD,EAAU,SAASid,GAAc,CAAA;KAC9C,kBAAC,QAAD;MAAM,WAAU;MAAkB;MAC/B,UAAA9/B;KACG,CAAA;KACN,kBAAC,QAAD;MAAM,WAAU;MAAY,KAAKk+B;MAAa,QAAQ,CAACpiC;KAAS,CAAA;KAC/DA,KAAUA,EAAO,OAAO,KAAK,kBAAC,QAAD;MAAM,WAAU;MAAa,UAAAkhC,GAASlhC,EAAO,IAAI;KAAQ,CAAA;KACtFA,KAAU2B,EAAM,UAAU,kBAACw+B,IAAD;MAAmB;MAAQ,OAAOS;KAAS,CAAA;KACrEyD;KACArkC,KAAUikC,KACT,kBAAC,UAAD;MAAQ,MAAK;MAAS,WAAWzlB,IAAU,uBAAuB;MAAW,eAAe4iB,GAAY,MAAM,CAAC5gC,CAAC;MAAG,OAAOge,IAAU,sBAAsB;MAA1J,UAAA,CACE,kBAACpd,GAAD;OAAM,MAAMod,IAAU,SAAS;OAAQ,MAAM;MAAK,CAAA,GACjDA,IAAU,SAAS,MACd;;KAETxe,KAAU8iC,OAAYtkB,KAAW6iB,MAChC,kBAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,IAAQ,0BAA0B;MAAW,UAAUE;MAAQ,eAAe,KAAK2B,EAAK;MAAG,OAAM;MAAlI,UAAA,CACE,kBAAC9hC,GAAD;OAAM,MAAK;OAAO,MAAM;MAAK,CAAA,GAC5BmgC,KAAS,YAAYF,KAAS2B,IAAS,SAAS,UAC3C;;KAEV,kBAAC,OAAD;MAAK,WAAU;MAAc,OAAO;OAAE,OAAO,GAAGzc,KAAO,KAAK,IAAI2d,GAAK,CAAC,IAAI,IAAI;OAAI,SAAS;MAAa;KAAI,CAAA;IACzG;;GAENE,KAAWpkC,KAAUwe,KAAW0jB,KAAW,kBAAC,OAAD;IAAK,WAAU;IAAe,KAAKR;GAAW,CAAA;GAC1F,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAACv5B,GAAc,UAAf;KAAwB,OAAOk7B;KAC7B,UAAA,kBAACt6B,GAAc,UAAf;MAAwB,OAAOo5B;MAAW,UAAA5gB;KAA6B,CAAA;IACjD,CAAA,GACvBvhB,KAAU4gC,EAAO,UAAU,kBAACN,IAAD;KAAqB;KAAQ,QAAQM,EAAO;IAAS,CAAA,CAC9E;;GACJ3nB,KAAS,kBAAC3O,IAAD;IAAO,MAAM2O;IAAO,QAAQsqB;GAAa,CAAA;GAClDC,MAAW,kBAACp5B,IAAD;IAAe,OAAM;IAA2B,SAASo5B,GAAQ;IAAS,IAAG;IAAW,MAAMA,GAAQ;IAAK,eAAeC,GAAW,IAAI;GAAI,CAAA;GACxJrO,MAAYp1B,KACX,kBAACiK,IAAD;IACE,MAAM;KACJ,OAAO;KACP,OAAO;KACP,SAAS24B;KACT,IAAI;KACJ,OAAO,MAAM;MACX,IAAMnnC,IAAO+E,EAAE,KAAK,CAAC,CAAC,QAAQ,kBAAkB,GAAG,CAAC,CAAC,QAAY,OAAO,KAAKwgC,GAAIhhC,EAAO,MAAM,IAAI,GAAG,GAAG,EAAE;MAC1G,AAAKvE,MACLsmC,GAAWtmC,IAAOulC,GAAIhhC,EAAO,KAAK,GAClC2B,EAAM,WAAWlG,IAAOulC,GAAIhhC,EAAO,KAAK;KAC1C;IACF;IACA,eAAeq1B,GAAY,EAAK;GACjC,CAAA;GAEFqO,MAAW1jC,KACV,kBAACkf,IAAD;IACU;IACR,MAAM;KACJ,CAAC,QAAQ2jB,EAAQ;KACjB,CAAC,QAAQ3c,GAAWlmB,EAAO,KAAK;KAChC,GAAIA,EAAO,OAAO,IAAI,CAAC,CAAC,aAAakhC,GAASlhC,EAAO,IAAI,CAAC,CAAqB,IAAI,CAAC;KACpF,GAAIqhC,IAAQ,CAAC,CAAC,UAAU,iBAAiB,CAAqB,IAAI,CAAC;IACrE;IACA,OAAO8B,EAAQ,SAAS,MAAM,KAAK,CAAC;IACpC,eAAeQ,GAAW,EAAK;GAChC,CAAA;EAEA;;AAET"}
|