@gridsheet/preact-core 3.0.2 → 3.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../react-core/src/store/index.ts","../../react-core/src/components/FunctionGuide.tsx","../../react-core/src/components/EditorOptions.tsx","../../react-core/src/lib/clipboard.ts","../../react-core/src/components/useAutocomplete.ts","../../react-core/src/components/Fixed.tsx","../../react-core/src/lib/paste.ts","../../react-core/src/components/Editor.tsx","../../react-core/src/components/PluginBase.tsx","../../react-core/src/components/StoreObserver.tsx","../../react-core/src/components/Resizer.tsx","../../react-core/src/components/Emitter.tsx","../../react-core/src/store/applyers.ts","../../react-core/src/lib/menu.ts","../../react-core/src/components/MenuItem.tsx","../../react-core/src/components/ContextMenu.tsx","../../react-core/src/components/ColumnMenuFilterSection.tsx","../../react-core/src/components/ColumnMenuSortSection.tsx","../../react-core/src/components/ColumnMenuLabelSection.tsx","../../react-core/src/components/ColumnMenu.tsx","../../react-core/src/components/RowMenu.tsx","../../react-core/src/lib/events.ts","../../react-core/src/components/Cell.tsx","../../react-core/src/components/ScrollHandle.tsx","../../react-core/src/components/HeaderCellTop.tsx","../../react-core/src/components/HeaderCellLeft.tsx","../../react-core/src/components/CellStateOverlay.tsx","../../react-core/src/components/Tabular.tsx","../../react-core/src/components/FormulaBar.tsx","../../react-core/src/components/svg/Base.tsx","../../react-core/src/components/svg/SearchIcon.tsx","../../react-core/src/components/svg/CloseIcon.tsx","../../react-core/src/components/SearchBar.tsx","../../react-core/src/components/GridSheet.tsx","../../react-core/src/policy/checkbox.tsx","../../react-core/src/lib/style.ts"],"sourcesContent":["import { createContext } from 'react';\nimport { StoreType } from '../types';\n\nexport type Dispatcher = React.Dispatch<{\n type: number;\n value: any;\n}>;\n\nexport const Context = createContext(\n {} as {\n store: StoreType;\n dispatch: Dispatcher;\n },\n);\n","import React, { useContext, useLayoutEffect, useRef } from 'react';\nimport type { FunctionHelp } from '@gridsheet/core';\nimport type { AutocompleteOption } from '@gridsheet/core';\nimport { Context } from '../store';\nimport { calcSideStyle, clampPopup } from '@gridsheet/core';\n\ntype OptionWithGuide = AutocompleteOption & {\n isFunction?: boolean;\n example?: string;\n category?: string;\n description?: string;\n defs?: any[];\n};\n\nexport interface FunctionGuideProps {\n // Option Help Mode (renders in EditorOptions)\n option?: OptionWithGuide;\n\n // Active Function Highlight Mode (renders floating near cursor)\n activeFunctionGuide?: FunctionHelp;\n activeArgIndex?: number;\n top?: number;\n left?: number;\n}\n\nexport const FunctionGuide: React.FC<FunctionGuideProps> = ({\n option,\n activeFunctionGuide,\n activeArgIndex = 0,\n top,\n left,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const guide1Ref = useRef<HTMLDivElement>(null);\n const { store } = useContext(Context);\n // Hide the active help when not hovering over the editor, to prevent it from blocking clicks on other options.\n const isHidden = !store.editorHovering;\n\n useLayoutEffect(() => {\n const el = guide1Ref.current;\n if (!el) {\n return;\n }\n calcSideStyle(el);\n });\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el || left === undefined) {\n return;\n }\n clampPopup(el);\n });\n\n if (option) {\n return (\n <div\n ref={guide1Ref}\n className=\"gs-fn-guide1\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n {option.category && option.isFunction && (\n <span className={`gs-fn-guide-category gs-fn-guide-category-${option.category}`}>{option.category}</span>\n )}\n {option.tooltip && (\n <div className=\"gs-fn-guide1-tooltip\">\n {typeof option.tooltip === 'function'\n ? React.createElement(option.tooltip as any, { value: option.value })\n : option.tooltip}\n </div>\n )}\n {option.isFunction && (\n <>\n <div className=\"gs-fn-guide1-example\">{option.example}</div>\n {option.description && (\n <div className=\"gs-fn-guide1-desc\" style={{ whiteSpace: 'pre-line' }}>\n {option.description}\n </div>\n )}\n {option.defs && option.defs.length > 0 && (\n <div className=\"gs-fn-guide1-args\">\n {option.defs.map((arg: any, j: number) => (\n <div key={j} className=\"gs-fn-guide1-arg\">\n <span className=\"gs-fn-guide1-arg-name\">{arg.name}</span>\n {arg.optional && <span className=\"gs-fn-guide1-arg-opt\"> (optional)</span>}\n {arg.variadic && <span className=\"gs-fn-guide1-arg-iter\">...</span>}\n <code className=\"gs-fn-guide1-arg-type\">{arg.acceptedTypes?.join(' | ') || 'any'}</code>\n <span className=\"gs-fn-guide1-arg-desc\"> — {arg.description}</span>\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </div>\n );\n }\n\n if (activeFunctionGuide) {\n return (\n <div\n ref={ref}\n className={`gs-fn-guide2 ${isHidden ? 'gs-fn-guide2-hidden' : ''}`}\n style={top !== undefined && left !== undefined ? { top: top + 4, left } : undefined}\n >\n {activeFunctionGuide.category && (\n <span className={`gs-fn-guide-category gs-fn-guide-category-${activeFunctionGuide.category}`}>\n {activeFunctionGuide.category}\n </span>\n )}\n <div className=\"gs-fn-guide2-name\">{activeFunctionGuide.example}</div>\n <div className=\"gs-fn-guide2-args-inline\">\n {(() => {\n const args = activeFunctionGuide.defs ?? [];\n const numIterable = args.filter((a: any) => a.variadic).length;\n const variadicStart = args.length - numIterable;\n\n return args.map((arg: any, j: number) => {\n let isActive: boolean;\n if (activeArgIndex < variadicStart) {\n // Cursor is on a fixed (non-variadic) argument\n isActive = activeArgIndex === j;\n } else if (numIterable > 0 && j >= variadicStart) {\n // Cursor is in the variadic zone; cycle through the variadic args\n const offset = (activeArgIndex - variadicStart) % numIterable;\n isActive = j === variadicStart + offset;\n } else {\n isActive = false;\n }\n return (\n <React.Fragment key={j}>\n {j > 0 ? ', ' : ''}\n <span className={isActive ? 'gs-active-arg' : ''}>\n {arg.optional ? '[' : ''}\n {arg.name}\n {arg.variadic ? ', ...' : ''}\n {arg.optional ? ']' : ''}\n </span>\n </React.Fragment>\n );\n });\n })()}\n </div>\n {(() => {\n const args = activeFunctionGuide.defs ?? [];\n const numIterable = args.filter((a: any) => a.variadic).length;\n const variadicStart = args.length - numIterable;\n\n let resolvedIndex: number;\n if (activeArgIndex < variadicStart || numIterable === 0) {\n resolvedIndex = Math.min(activeArgIndex, args.length - 1);\n } else {\n const offset = (activeArgIndex - variadicStart) % numIterable;\n resolvedIndex = variadicStart + offset;\n }\n const activeArg = args[resolvedIndex];\n if (!activeArg?.description) {\n return null;\n }\n return (\n <div className=\"gs-fn-guide2-desc\" style={{ marginTop: 8, fontSize: 12, color: '#888' }}>\n <p>\n <strong>{activeArg.name}:</strong>{' '}\n <code className=\"gs-fn-guide2-arg-type\">{activeArg.acceptedTypes?.join(' | ') || 'any'}</code>\n {activeArg.description}\n </p>\n </div>\n );\n })()}\n\n {activeFunctionGuide.description && (\n <div className=\"gs-fn-guide2-desc\" style={{ whiteSpace: 'pre-line' }}>\n {activeFunctionGuide.description}\n </div>\n )}\n </div>\n );\n }\n\n return null;\n};\n","import React, { useRef, useLayoutEffect, useState } from 'react';\nimport { FunctionGuide } from './FunctionGuide';\nimport { clampLeft } from '@gridsheet/core';\n\ninterface EditorOptionsProps {\n filteredOptions: any[];\n top: number;\n left: number;\n selected: number;\n onOptionMouseDown: (e: React.MouseEvent<HTMLLIElement>, i: number) => void;\n}\n\nexport const EditorOptions: React.FC<EditorOptionsProps> = ({\n filteredOptions,\n top,\n left,\n selected,\n onOptionMouseDown,\n}) => {\n const ulRef = useRef<HTMLUListElement>(null);\n const [adjustedLeft, setAdjustedLeft] = useState(left);\n\n useLayoutEffect(() => {\n if (!ulRef.current) {\n return;\n }\n const width = ulRef.current.getBoundingClientRect().width;\n setAdjustedLeft(clampLeft(left, width));\n }, [left, filteredOptions]);\n\n if (filteredOptions.length === 0) {\n return null;\n }\n\n return (\n <ul ref={ulRef} className=\"gs-editor-options\" style={{ top, left: adjustedLeft }}>\n {filteredOptions.map((option, i) => (\n <li\n key={i}\n className={`gs-editor-option ${selected === i ? ' gs-editor-option-selected' : ''}`}\n onMouseDown={(e) => onOptionMouseDown(e, i)}\n >\n <div className=\"gs-editor-option-content\">\n <span>{option.label ?? option.value}</span>\n {selected === i && <span className=\"gs-editor-option-tab\">⇥ Tab</span>}\n </div>\n {(option.isFunction || option.tooltip) && selected === i && <FunctionGuide option={option} />}\n </li>\n ))}\n </ul>\n );\n};\n","import type { StoreType, AreaType, PointType } from '../types';\n\nimport { zoneToArea } from '@gridsheet/core';\nimport type { Sheet, UserSheet } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\n\nexport const clip = (store: StoreType) => {\n const { selectingZone, choosing, editorRef, sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n\n if (!sheet) {\n return { top: 0, left: 0, bottom: 0, right: 0 };\n }\n\n const { y, x } = choosing;\n const selectingArea = zoneToArea(selectingZone);\n let area = selectingArea;\n if (area.left === -1) {\n area = { top: y, left: x, bottom: y, right: x };\n }\n const input = editorRef.current;\n const trimmed = sheet.trim(area);\n const tsv = sheet2csv(trimmed, {\n getter: (sheet, point) => {\n const policy = sheet.getPolicy(point);\n return policy.serializeForClipboard({ point, sheet });\n },\n });\n const html = sheet2html(trimmed, {\n getter: (sheet, point) => {\n const policy = sheet.getPolicy(point);\n return policy.serializeForClipboard({ point, sheet });\n },\n });\n\n if (navigator.clipboard) {\n const tsvBlob = new Blob([tsv], { type: 'text/plain' });\n const htmlBlob = new Blob([html], { type: 'text/html' });\n\n navigator.clipboard.write([\n new ClipboardItem({\n 'text/plain': tsvBlob,\n 'text/html': htmlBlob,\n }),\n ]);\n } else if (input != null) {\n input.value = tsv;\n focus(input);\n input.select();\n document.execCommand('copy');\n input.value = '';\n input.blur();\n }\n return area;\n};\n\nexport type SheetCSVProps = {\n getter?: (sheet: UserSheet, point: PointType) => string;\n filteredRowsIncluded?: boolean;\n trailingEmptyRowsOmitted?: boolean;\n separator?: string;\n newline?: string;\n};\n\nexport const sheet2csv = (\n sheet: UserSheet,\n {\n getter = (sheet, point) => {\n return String(sheet.getCell(point)?.value ?? '');\n },\n filteredRowsIncluded = false,\n trailingEmptyRowsOmitted = false,\n separator = '\\t',\n newline = '\\n',\n }: SheetCSVProps = {},\n): string => {\n const rows: { isEmpty: boolean; line: string }[] = [];\n for (let y = sheet.top; y <= sheet.bottom; y++) {\n if (sheet.isRowFiltered(y) && !filteredRowsIncluded) {\n continue;\n }\n const cols: string[] = [];\n let rowIsEmpty = true;\n for (let x = sheet.left; x <= sheet.right; x++) {\n const point: PointType = { y, x };\n const value = getter(sheet, point);\n if (value !== '') {\n rowIsEmpty = false;\n }\n if (value.indexOf('\\n') !== -1) {\n cols.push(`\"${value.replace(/\"/g, '\"\"')}\"`);\n } else {\n cols.push(value);\n }\n }\n rows.push({ isEmpty: rowIsEmpty, line: cols.join(separator) });\n }\n if (trailingEmptyRowsOmitted) {\n while (rows.length > 0 && rows[rows.length - 1].isEmpty) {\n rows.pop();\n }\n }\n return rows.map((r) => r.line).join(newline);\n};\n\nexport type SheetHTMLProps = {\n getter?: (sheet: UserSheet, point: PointType) => string;\n filteredRowsIncluded?: boolean;\n trailingEmptyRowsOmitted?: boolean;\n};\n\nexport const sheet2html = (\n sheet: UserSheet,\n {\n getter = (sheet, point) => {\n return String(sheet.getCell(point)?.value ?? '');\n },\n filteredRowsIncluded = false,\n trailingEmptyRowsOmitted = false,\n }: SheetHTMLProps = {},\n): string => {\n const rows: { isEmpty: boolean; html: string }[] = [];\n for (let y = sheet.top; y <= sheet.bottom; y++) {\n if (sheet.isRowFiltered(y) && !filteredRowsIncluded) {\n continue;\n }\n const cols: string[] = [];\n let rowIsEmpty = true;\n for (let x = sheet.left; x <= sheet.right; x++) {\n const point: PointType = { y, x };\n const value = getter(sheet, point);\n if (value !== '') {\n rowIsEmpty = false;\n }\n const valueEscaped = value\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n cols.push(`<td>${valueEscaped}</td>`);\n }\n rows.push({ isEmpty: rowIsEmpty, html: `<tr>${cols.join('')}</tr>` });\n }\n if (trailingEmptyRowsOmitted) {\n while (rows.length > 0 && rows[rows.length - 1].isEmpty) {\n rows.pop();\n }\n }\n return `<table>${rows.map((r) => r.html).join('')}</table>`;\n};\n","import { useState, useMemo, useCallback } from 'react';\nimport { getFunctionHelps, type FunctionHelp } from '@gridsheet/core';\nimport type { FunctionMapping } from '@gridsheet/core';\nimport type { AutocompleteOption } from '@gridsheet/core';\nimport { Lexer } from '@gridsheet/core';\n\ntype UseAutocompleteProps = {\n inputting: string;\n selectionStart: number;\n optionsAll: AutocompleteOption[];\n functions?: FunctionMapping;\n};\n\nexport const useAutocomplete = ({ inputting, selectionStart, optionsAll, functions }: UseAutocompleteProps) => {\n const [selected, setSelected] = useState(0);\n\n const { filteredOptions, matchParams, activeFunctionHelp, activeArgIndex } = useMemo(() => {\n const isFormula = inputting.startsWith('=');\n\n let activeFunctionHelp: FunctionHelp | null = null;\n let activeArgIndex: number = 0;\n\n const textBeforeCursor = inputting.slice(0, selectionStart);\n const textAfterCursor = inputting.slice(selectionStart);\n\n // --- Active Argument Context Tracking ---\n if (isFormula && textBeforeCursor.length > 1) {\n try {\n const textToCursor = textBeforeCursor.slice(1); // skip '='\n const lexer = new Lexer(textToCursor);\n lexer.tokenize();\n\n const functionStack: { name: string; argIndex: number; hasWaitComma: boolean }[] = [];\n\n for (let i = 0; i < lexer.tokens.length; i++) {\n const token = lexer.tokens[i];\n if (token.type === 'FUNCTION') {\n const nextToken = lexer.tokens[i + 1];\n if (nextToken?.type === 'OPEN') {\n functionStack.push({ name: token.entity as string, argIndex: 0, hasWaitComma: false });\n i++; // skip OPEN\n } else if (i === lexer.tokens.length - 1) {\n // Function keyword right before cursor but without paren yet!\n // Do nothing special here, autocomplete dropdown will handle it.\n }\n } else if (token.type === 'COMMA') {\n if (functionStack.length > 0) {\n functionStack[functionStack.length - 1].argIndex++;\n functionStack[functionStack.length - 1].hasWaitComma = true;\n }\n } else if (token.type === 'CLOSE') {\n if (functionStack.length > 0) {\n functionStack.pop();\n }\n } else if (token.type !== 'SPACE' && functionStack.length > 0) {\n functionStack[functionStack.length - 1].hasWaitComma = false;\n }\n }\n\n if (functionStack.length > 0) {\n const activeItem = functionStack[functionStack.length - 1];\n const helps = getFunctionHelps(functions);\n activeArgIndex = activeItem.argIndex;\n activeFunctionHelp = helps.find((h: any) => h.name === activeItem.name.toUpperCase()) || null;\n }\n } catch (e) {\n /* ignore parse errors */\n }\n }\n\n const wordBefore = textBeforeCursor.match(/[a-zA-Z0-9_.]+$/)?.[0] || '';\n const wordAfter = textAfterCursor.match(/^[a-zA-Z0-9_.]+/)?.[0] || '';\n\n // For regular cells, we use the whole word as the search target.\n // For formulas, we extract the word under the cursor.\n const currentWord = isFormula ? (wordBefore + wordAfter).toLowerCase() : inputting.toLocaleLowerCase();\n const hasOpenParenAssigned = isFormula && textAfterCursor.slice(wordAfter.length).trimStart().startsWith('(');\n\n let filtered: any[] = [];\n\n let isOnAddress = false;\n if (isFormula) {\n try {\n const fullLexer = new Lexer(inputting.slice(1));\n fullLexer.tokenize();\n let currentIndex = 1; // start after '='\n for (const token of fullLexer.tokens) {\n const tLen = token.length();\n if (selectionStart > currentIndex && selectionStart < currentIndex + tLen) {\n if (['REF', 'RANGE', 'ID', 'ID_RANGE', 'UNREFERENCED'].includes(token.type)) {\n isOnAddress = true;\n }\n // Inside a string literal (VALUE token whose entity is a string)\n if (token.type === 'VALUE' && typeof token.entity === 'string') {\n isOnAddress = true;\n }\n break;\n }\n if (selectionStart === currentIndex || selectionStart === currentIndex + tLen) {\n if (['REF', 'RANGE', 'ID', 'ID_RANGE', 'UNREFERENCED'].includes(token.type)) {\n isOnAddress = true;\n }\n }\n currentIndex += tLen;\n }\n } catch (e) {\n /* ignore parse errors */\n }\n }\n\n if (isFormula && !isOnAddress) {\n // Suggest if we have at least 1 letter, and there isn't already an opening parenthesis attached\n if (currentWord.length > 0 && !hasOpenParenAssigned) {\n filtered = getFunctionHelps(functions)\n .map((help: any) => {\n const keywordLower = help.name.toLowerCase();\n const startsWith = keywordLower.startsWith(currentWord);\n const index = startsWith ? 0 : -1;\n const hasNoArgs = help.defs.length === 0;\n return {\n option: { ...help, value: help.name + (hasNoArgs ? '()' : '('), isFunction: true, label: help.name },\n index,\n startsWith,\n keywordCount: 1,\n keyword: keywordLower,\n };\n })\n .filter(({ startsWith }: { startsWith: boolean }) => startsWith)\n .sort((a: any, b: any) => {\n if (a.startsWith !== b.startsWith) {\n return b.startsWith ? 1 : -1;\n }\n if (a.index !== b.index) {\n return a.index - b.index;\n }\n return a.keyword.localeCompare(b.keyword);\n })\n .map(({ option }: { option: any }) => option);\n }\n } else {\n filtered = optionsAll\n .map((option) => {\n const keywords = option.keywords ?? [String(option.value)];\n let bestMatch = { index: -1, startsWith: false, keyword: '' };\n\n for (const keyword of keywords) {\n const keywordLower = keyword.toLowerCase();\n const index = keywordLower.indexOf(currentWord);\n if (index !== -1) {\n const startsWith = keywordLower.startsWith(currentWord);\n if (\n bestMatch.index === -1 ||\n index < bestMatch.index ||\n (index === bestMatch.index && startsWith && !bestMatch.startsWith)\n ) {\n bestMatch = { index, startsWith, keyword };\n }\n }\n }\n\n return {\n option,\n ...bestMatch,\n keywordCount: keywords.length,\n };\n })\n .filter(({ index }) => index !== -1)\n .sort((a, b) => {\n if (a.startsWith !== b.startsWith) {\n return b.startsWith ? 1 : -1;\n }\n if (a.index !== b.index) {\n return a.index - b.index;\n }\n if (a.keywordCount !== b.keywordCount) {\n return b.keywordCount - a.keywordCount;\n }\n return a.keyword.localeCompare(b.keyword);\n })\n .map(({ option }) => option);\n }\n\n return {\n filteredOptions: filtered,\n matchParams: {\n isFormula,\n currentWord,\n matchLengthBefore: wordBefore.length,\n matchLengthAfter: wordAfter.length,\n },\n activeFunctionHelp,\n activeArgIndex,\n };\n }, [inputting, selectionStart, optionsAll, functions]);\n\n useMemo(() => {\n if (selected >= filteredOptions.length) {\n setSelected(0);\n }\n }, [filteredOptions.length, selected]);\n\n const replaceWithOption = useCallback(\n (option: any) => {\n if (!option) {\n return { value: inputting, selectionStart };\n }\n\n if (matchParams.isFormula) {\n const beforeMatch = inputting.slice(0, selectionStart - matchParams.matchLengthBefore);\n const afterMatch = inputting.slice(selectionStart + matchParams.matchLengthAfter);\n const newValue = beforeMatch + option.value + afterMatch;\n return { value: newValue, selectionStart: beforeMatch.length + option.value.length };\n } else {\n return { value: String(option.value), selectionStart: String(option.value).length };\n }\n },\n [inputting, selectionStart, matchParams],\n );\n\n const handleArrowUp = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (filteredOptions.length > 1) {\n setSelected((s) => (s <= 0 ? filteredOptions.length - 1 : s - 1));\n e.preventDefault();\n return true;\n }\n return false;\n },\n [filteredOptions.length],\n );\n\n const handleArrowDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (filteredOptions.length > 1) {\n setSelected((s) => (s >= filteredOptions.length - 1 ? 0 : s + 1));\n e.preventDefault();\n return true;\n }\n return false;\n },\n [filteredOptions.length],\n );\n\n return {\n filteredOptions,\n selected,\n setSelected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n isFormula: matchParams.isFormula,\n activeFunctionHelp,\n activeArgIndex,\n };\n};\n","import type { CSSProperties, FC, ReactNode } from 'react';\nimport { useBrowser } from '../lib/hooks';\nimport { createPortal } from 'react-dom';\n\ntype Props = {\n className?: string;\n style?: CSSProperties;\n children: ReactNode;\n [attr: string]: any;\n};\n\nexport const Fixed: FC<Props> = ({ children, style, className = '', ...attrs }) => {\n const { document } = useBrowser();\n if (document == null) {\n return null;\n }\n return createPortal(\n <div {...attrs} className={`gs-fixed ${className}`} style={style}>\n {children}\n </div>,\n document.body,\n );\n};\n","import React, { type CSSProperties } from 'react';\nimport type { RawCellType } from '../types';\nexport const parseHTML = (html: string, onlyValue = false): RawCellType[][] => {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const results: RawCellType[][] = [];\n\n const processSheet = (sheet: HTMLTableElement) => {\n const spans = new Set<string>();\n const rows = sheet.querySelectorAll('tr,caption');\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n if (row.tagName === 'CAPTION') {\n const caption = row.textContent?.trim() ?? '';\n if (caption) {\n results.push([{ value: caption }]);\n }\n continue;\n }\n const cells = Array.from(row.querySelectorAll('td, th'));\n const result: RawCellType[] = [];\n let j = 0;\n for (const cell of cells) {\n const value = cell.textContent?.trim() ?? '';\n const style: CSSProperties | undefined = onlyValue\n ? undefined\n : (() => {\n const childStyle = parseStyleString(cell.firstElementChild);\n const parentStyle = parseStyleString(cell);\n return { ...parentStyle, ...childStyle };\n })();\n while (spans.has(`${i}-${++j}`)) {\n result.push({ value: '', style, skip: true });\n }\n result.push({ value, style });\n\n const rowSpan = parseInt(cell.getAttribute('rowspan') ?? '1', 10);\n const colSpan = parseInt(cell.getAttribute('colspan') ?? '1', 10);\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n spans.add(`${i + r}-${j + c}`);\n }\n }\n }\n results.push(result);\n }\n };\n\n const processNodeSequentially = (node: Node, currentLine: RawCellType[] = []) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n const tagName = el.tagName;\n\n if (tagName === 'TABLE') {\n if (currentLine.length > 0) {\n results.push(currentLine.slice());\n currentLine.length = 0;\n }\n processSheet(el as HTMLTableElement);\n } else if (tagName === 'BR') {\n results.push(currentLine.slice());\n currentLine.length = 0;\n } else if (blockTags.has(tagName)) {\n if (currentLine.length > 0) {\n results.push(currentLine.slice());\n currentLine.length = 0;\n }\n el.childNodes.forEach((child) => processNodeSequentially(child, currentLine));\n if (currentLine.length > 0) {\n results.push(currentLine.slice());\n currentLine.length = 0;\n }\n } else {\n el.childNodes.forEach((child) => processNodeSequentially(child, currentLine));\n }\n } else if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent ?? '';\n const lines = text.split(/\\r?\\n/);\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed) {\n currentLine.push({ value: trimmed });\n }\n }\n }\n };\n\n const currentLine: RawCellType[] = [];\n doc.body.childNodes.forEach((node) => processNodeSequentially(node, currentLine));\n if (currentLine.length > 0) {\n results.push(currentLine);\n }\n\n return results;\n};\n\nfunction parseStyleString(element: Element | null): React.CSSProperties | undefined {\n if (!element) {\n return undefined;\n }\n const styleString = element.getAttribute('style') ?? '';\n const styleObj: React.CSSProperties = {};\n\n styleString.split(';').forEach((d) => {\n let [rawKey, rawValue] = d.split(':');\n if (!rawKey || !rawValue) {\n return;\n }\n rawKey = rawKey.trim();\n if (rawKey === 'height' || rawKey === 'width') {\n return;\n }\n const key = rawKey.trim().replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n if (key === 'float' || key === 'display' || key.startsWith('padding')) {\n return;\n }\n if (key === 'border') {\n Object.assign(styleObj, {\n borderTop: rawValue,\n borderRight: rawValue,\n borderBottom: rawValue,\n borderLeft: rawValue,\n });\n return;\n }\n if (key === 'borderColor') {\n Object.assign(styleObj, {\n borderTopColor: rawValue,\n borderRightColor: rawValue,\n borderBottomColor: rawValue,\n borderLeftColor: rawValue,\n });\n return;\n }\n if (key === 'borderStyle') {\n Object.assign(styleObj, {\n borderTopStyle: rawValue,\n borderRightStyle: rawValue,\n borderBottomStyle: rawValue,\n borderLeftStyle: rawValue,\n });\n return;\n }\n if (key === 'borderWidth') {\n Object.assign(styleObj, {\n borderTopWidth: rawValue,\n borderRightWidth: rawValue,\n borderBottomWidth: rawValue,\n borderLeftWidth: rawValue,\n });\n return;\n }\n const value = rawValue.trim();\n (styleObj as any)[key] = value;\n });\n\n return styleObj;\n}\n\nexport const parseText = (tsv: string, sep = '\\t'): RawCellType[][] => {\n tsv = tsv.replace(/\"\"/g, '\\x00');\n const rows: RawCellType[][] = [[]];\n let row = rows[0];\n let entering = false;\n let word = '';\n for (let i = 0; i < tsv.length; i++) {\n const s = tsv[i];\n if (s === '\\n' && !entering) {\n row.push({ value: restoreDoubleQuote(word) });\n word = '';\n row = [];\n rows.push(row);\n continue;\n }\n if (s === sep) {\n row.push({ value: restoreDoubleQuote(word) });\n word = '';\n continue;\n }\n if (s === '\"' && !entering && word === '') {\n entering = true;\n continue;\n }\n if (s === '\"' && entering) {\n entering = false;\n continue;\n }\n word += s;\n }\n if (word) {\n row.push({ value: restoreDoubleQuote(word) });\n }\n return rows;\n};\n\nconst restoreDoubleQuote = (text: string) => text.replace(/\\x00/g, '\"');\n\nconst blockTags = new Set([\n 'ADDRESS',\n 'ARTICLE',\n 'ASIDE',\n 'BLOCKQUOTE',\n 'DETAILS',\n 'DIALOG',\n 'DD',\n 'DIV',\n 'DL',\n 'DT',\n 'FIELDSET',\n 'FIGCAPTION',\n 'FIGURE',\n 'FOOTER',\n 'FORM',\n 'H1',\n 'H2',\n 'H3',\n 'H4',\n 'H5',\n 'H6',\n 'HEADER',\n 'HR',\n 'LI',\n 'MAIN',\n 'NAV',\n 'OL',\n 'P',\n 'PRE',\n 'SECTION',\n 'TABLE',\n 'UL',\n]);\n","import type { FC } from 'react';\nimport { useContext, useEffect, useState, useCallback, memo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FunctionGuide } from './FunctionGuide';\nimport { EditorOptions } from './EditorOptions';\nimport { x2c, y2r } from '@gridsheet/core';\nimport { clip } from '../lib/clipboard';\nimport {\n clear,\n escape,\n select,\n setEditingAddress,\n undo,\n redo,\n arrow,\n walk,\n write,\n copy,\n cut,\n paste,\n setSearchQuery,\n setEntering,\n setInputting,\n setEditorHovering,\n updateSheet,\n} from '../store/actions';\n\nimport { Context } from '../store';\nimport { areaToZone, zoneToArea } from '@gridsheet/core';\nimport { operations as prevention } from '@gridsheet/core';\nimport {\n expandInput,\n handleFormulaQuoteAutoClose,\n insertTextAtCursor,\n isFocus,\n isRefInsertable,\n resetInput,\n} from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { Lexer } from '@gridsheet/core';\nimport { COLOR_PALETTE } from '@gridsheet/core';\nimport { useAutocomplete } from './useAutocomplete';\nimport { EditorEventWithNativeEvent, FeedbackType, ModeType } from '../types';\nimport { Fixed } from './Fixed';\nimport { parseHTML, parseText } from '../lib/paste';\nimport React from 'react';\n\ntype Props = {\n mode: ModeType;\n};\n\nexport const Editor: FC<Props> = ({ mode }: Props) => {\n const { store, dispatch } = useContext(Context);\n const [shiftKey, setShiftKey] = useState(false);\n const [selectionStart, setSelectionStart] = useState(0);\n const [isFocused, setIsFocused] = useState(false);\n const {\n choosing,\n inputting,\n selectingZone,\n editorRect,\n editingAddress,\n entering,\n matchingCells,\n matchingCellIndex,\n searchQuery,\n editorRef,\n largeEditorRef,\n searchInputRef,\n editingOnEnter,\n sheetReactive: sheetRef,\n sheetId,\n dragging,\n } = store;\n const sheet = sheetRef.current;\n\n const renderOverlays = () => {\n if (!isFocused || !editing || typeof document === 'undefined') {\n return null;\n }\n if (editorRef.current !== document.activeElement) {\n return null;\n }\n\n const rect = editorRef.current?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n const { bottom: top, left } = rect;\n\n return createPortal(\n <>\n {activeFunctionHelp &&\n filteredOptions.length === 0 &&\n (!selectingZone || (selectingZone.endY === -1 && selectingZone.endX === -1)) && (\n <FunctionGuide\n activeFunctionGuide={activeFunctionHelp}\n activeArgIndex={activeArgIndex}\n top={top}\n left={left}\n />\n )}\n {filteredOptions.length > 0 && (\n <EditorOptions\n filteredOptions={filteredOptions}\n top={top}\n left={left}\n selected={selected}\n onOptionMouseDown={handleOptionMouseDown}\n />\n )}\n </>,\n document.body,\n );\n };\n\n const policy = sheet?.getPolicy(choosing);\n const optionsAll = policy?.getSelectOptions() ?? [];\n\n const handleSelect = useCallback((e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n setSelectionStart(e.currentTarget.selectionStart);\n }, []);\n\n const {\n filteredOptions,\n selected,\n setSelected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n isFormula,\n activeFunctionHelp,\n activeArgIndex,\n } = useAutocomplete({\n inputting,\n selectionStart,\n optionsAll,\n functions: sheet?.registry.functions,\n });\n\n useEffect(() => {\n focus(editorRef?.current);\n }, [editorRef]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n if (sheet.registry.lastFocused == null) {\n return;\n }\n if (sheet.registry.lastFocused !== editorRef.current) {\n return;\n }\n if (sheet.registry.lastFocused !== largeEditorRef.current) {\n return;\n }\n\n dispatch(setEditingAddress(''));\n }, [sheet?.registry.lastFocused, sheet, editorRef, largeEditorRef, dispatch]);\n useEffect(() => {\n if (!sheet) {\n return;\n }\n sheet.registry.editingSheetId = sheetId;\n sheet.registry.editingAddress = editingAddress;\n }, [editingAddress, sheet, sheetId]);\n\n useEffect(() => {\n //sheet.registry.transmit();\n expandInput(editorRef.current);\n }, [inputting, editingAddress, editorRef]);\n\n const { y, x } = choosing;\n const rowId = `${y2r(y)}`;\n const colId = x2c(x);\n const address = `${colId}${rowId}`;\n const editing = editingAddress === address;\n\n // Use 'RAW' so that spilled values (stored in solvedCaches) are already\n // reflected in cell.value without re-evaluating the formula.\n const cell = sheet?.getCell({ y, x }, { resolution: 'RAW' });\n const currentString = sheet ? sheet.getSerializedValue({ point: choosing, cell, resolution: 'RAW' }) : '';\n const [before, setBefore] = useState<string>(currentString);\n\n const writeCell = useCallback(\n (value: string) => {\n if (before !== value) {\n dispatch(write({ value }));\n }\n setBefore(value);\n },\n [before, dispatch],\n );\n\n const selectValue = useCallback(\n (selectedIndex: number) => {\n if (!sheet) {\n return;\n }\n const option = filteredOptions[selectedIndex];\n if (option) {\n if (option.isFunction) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n dispatch(setInputting(newValue));\n\n setTimeout(() => {\n if (editorRef.current) {\n focus(editorRef.current);\n editorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n } else {\n const t = sheet.update({\n diff: { [address]: { value: option.value } },\n partial: true,\n });\n dispatch(updateSheet(t.clone()));\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n setSelected(0);\n }\n },\n [filteredOptions, sheet, address, inputting, writeCell, dispatch, editorRef],\n );\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n setBefore(currentString);\n dispatch(setInputting(currentString));\n resetInput(editorRef.current, sheet, choosing);\n }, [choosing, currentString, dispatch, editorRef, sheet]);\n\n const { y: top, x: left, height, width } = editorRect;\n\n const numLines = currentString.split('\\n').length;\n const [isKeyDown, setIsKeyDown] = useState(false);\n const handleKeyDown = useCallback(\n (e: EditorEventWithNativeEvent) => {\n if (!sheet) {\n return;\n }\n if (isKeyDown) {\n return;\n }\n // do not debounce it if control key is down.\n if (!(e.key === 'Meta' || e.key === 'Control')) {\n setIsKeyDown(true);\n requestAnimationFrame(() => {\n setIsKeyDown(false);\n });\n }\n const input = e.currentTarget;\n\n // Auto-close double quotes in formula mode\n if (handleFormulaQuoteAutoClose(e, inputting)) {\n dispatch(setInputting(input.value));\n return false;\n }\n\n const shiftKey = e.shiftKey;\n switch (e.key) {\n case 'Tab': // TAB\n e.preventDefault();\n if (editing) {\n if (filteredOptions.length) {\n const isFunction = filteredOptions[selected]?.isFunction;\n selectValue(selected);\n if (isFunction) {\n return false;\n }\n } else {\n writeCell(input.value);\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n }\n dispatch(\n walk({\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 0,\n deltaX: shiftKey ? -1 : 1,\n }),\n );\n dispatch(setEditingAddress(''));\n return false;\n\n case 'Enter': // ENTER\n if (editing) {\n if (filteredOptions.length) {\n const isFunction = filteredOptions[selected]?.isFunction;\n selectValue(selected);\n if (isFunction) {\n e.preventDefault();\n return false;\n }\n } else if (e.altKey) {\n insertTextAtCursor(input, '\\n');\n dispatch(setInputting(input.value));\n e.preventDefault();\n return false;\n } else {\n if (e.nativeEvent.isComposing) {\n return false;\n }\n writeCell(input.value);\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n } else if (editingOnEnter && selectingZone.endY === -1) {\n const dblclick = document.createEvent('MouseEvents');\n dblclick.initEvent('dblclick', true, true);\n input.dispatchEvent(dblclick);\n e.preventDefault();\n return false;\n }\n dispatch(\n walk({\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: shiftKey ? -1 : 1,\n deltaX: 0,\n }),\n );\n e.preventDefault();\n return false;\n\n case 'Backspace': // BACKSPACE\n if (!editing) {\n // Spilled cells are read-only — clearing them would only erase the\n // cached spill value while the origin formula remains intact, causing\n // a confusing state where the FormulaBar goes blank but the cell\n // visually still shows the spilled value after re-evaluation.\n // e.preventDefault() is required here: without it the browser still\n // fires the default textarea behavior (deletes one char), which\n // triggers onInput → setInputting, making the value shrink character\n // by character on each Backspace press.\n if (sheet.getSystem({ y, x })?.spilledFrom != null) {\n e.preventDefault();\n return false;\n }\n dispatch(clear(null));\n dispatch(setInputting(''));\n return false;\n }\n break;\n case 'Delete': // DELETE\n if (!editing) {\n // Same guard as Backspace — spilled cells must not be cleared directly.\n if (sheet.getSystem({ y, x })?.spilledFrom != null) {\n e.preventDefault();\n return false;\n }\n dispatch(clear(null));\n dispatch(setInputting(''));\n return false;\n }\n break;\n case 'Shift': // SHIFT\n setShiftKey(true);\n return false;\n\n case 'Control': // CTRL\n return false;\n\n case 'Alt': // OPTION\n return false;\n\n case 'Meta': // COMMAND\n return false;\n\n case 'NumLock': // NUMLOCK\n return false;\n\n case 'Escape': // ESCAPE\n dispatch(escape(null));\n dispatch(setSearchQuery(undefined));\n dispatch(setInputting(before));\n // input.blur();\n return false;\n\n case 'ArrowLeft': // LEFT\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 0,\n deltaX: -1,\n }),\n );\n return false;\n }\n break;\n case 'ArrowUp': // UP\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: -1,\n deltaX: 0,\n }),\n );\n return false;\n }\n if (handleArrowUp(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'ArrowRight': // RIGHT\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 0,\n deltaX: 1,\n }),\n );\n return false;\n }\n break;\n case 'ArrowDown': // DOWN\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 1,\n deltaX: 0,\n }),\n );\n return false;\n }\n if (handleArrowDown(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'a': // A\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n dispatch(\n select({\n startY: 1,\n startX: 1,\n endY: sheet.numRows,\n endX: sheet.numCols,\n }),\n );\n return false;\n }\n }\n break;\n case 'c': // C\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n const area = clip(store);\n dispatch(copy(areaToZone(area)));\n focus(input); // refocus\n return false;\n }\n return true;\n }\n break;\n case 'f': // F\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n if (typeof searchQuery === 'undefined') {\n dispatch(setSearchQuery(''));\n }\n dispatch(setEntering(false));\n requestAnimationFrame(() => focus(searchInputRef.current));\n return false;\n }\n }\n break;\n case 'r': // R\n case 'y': // Y\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n dispatch(redo(null));\n requestAnimationFrame(() => dispatch(setInputting(''))); // resetting textarea\n return false;\n }\n }\n break;\n case 's': // S\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n sheet.registry.onSave?.({\n sheet,\n points: {\n pointing: choosing,\n selectingFrom: {\n y: selectingZone.startY,\n x: selectingZone.startX,\n },\n selectingTo: {\n y: selectingZone.endY,\n x: selectingZone.endX,\n },\n },\n });\n return false;\n }\n }\n break;\n case 'v': // V\n if (e.ctrlKey || e.metaKey) {\n // moved to onPaste\n e.stopPropagation();\n return false;\n }\n break;\n case 'x': // X\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n const area = clip(store);\n dispatch(cut(areaToZone(area)));\n focus(input); // refocus\n\n return false;\n }\n }\n break;\n case 'z': // Z\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n if (e.shiftKey) {\n dispatch(redo(null));\n //window.setTimeout(() => apply(setInputting('')), 100); // resetting textarea\n } else {\n dispatch(undo(null));\n }\n return false;\n }\n }\n break;\n case ';': // semicolon\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n // MAYBE: need to aware timezone.\n writeCell(new Date().toDateString());\n }\n }\n break;\n }\n if (e.ctrlKey || e.metaKey) {\n return false;\n }\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n console.warn('This cell is protected from writing.');\n return false;\n }\n dispatch(setEditingAddress(address));\n if (!editing) {\n dispatch(setInputting(''));\n }\n setSelected(0);\n return false;\n },\n [\n isKeyDown,\n editing,\n filteredOptions,\n selected,\n editingOnEnter,\n selectingZone,\n before,\n sheet,\n choosing,\n store,\n cell,\n address,\n writeCell,\n searchQuery,\n inputting,\n ],\n );\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true);\n if (!sheet) {\n return;\n }\n sheet.registry.lastFocused = e.currentTarget;\n },\n [sheet],\n );\n\n const handleDoubleClick = useCallback(\n (e: React.MouseEvent<HTMLTextAreaElement>) => {\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n console.warn('This cell is protected from writing.');\n return;\n }\n const input = e.currentTarget;\n if (!editing) {\n dispatch(setInputting(currentString));\n dispatch(setEditingAddress(address));\n requestAnimationFrame(() => {\n input.style.width = `${input.scrollWidth}px`;\n input.style.height = `${input.scrollHeight}px`;\n const length = new String(currentString).length;\n input.setSelectionRange(length, length);\n });\n }\n },\n [cell, editing, currentString, address],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n if (isRefInsertable(e.currentTarget)) {\n return true;\n } else {\n if (editing) {\n writeCell(e.currentTarget.value);\n }\n }\n dispatch(setEditingAddress(''));\n },\n [editing, writeCell, dispatch],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n return;\n }\n dispatch(setInputting(e.currentTarget.value));\n setSelectionStart(e.currentTarget.selectionStart);\n setSelected(0);\n },\n [cell],\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (editing) {\n return true;\n }\n\n const onlyValue = shiftKey;\n const html = e.clipboardData?.getData?.('text/html');\n if (html) {\n dispatch(paste({ matrix: parseHTML(html), onlyValue }));\n } else {\n const text = e.clipboardData?.getData?.('text/plain');\n if (text) {\n dispatch(paste({ matrix: parseText(text), onlyValue }));\n } else {\n console.warn('No clipboard data found.');\n }\n }\n e.preventDefault();\n e.stopPropagation();\n return false;\n },\n [editing, shiftKey],\n );\n\n const handleKeyUpInternal = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n setShiftKey(false);\n const selectingArea = zoneToArea(store.selectingZone);\n sheet?.registry.onKeyUp?.({\n e,\n points: {\n pointing: choosing,\n selectingFrom: { y: selectingArea.top, x: selectingArea.left },\n selectingTo: { y: selectingArea.bottom, x: selectingArea.right },\n },\n });\n },\n [store.selectingZone, choosing, sheet],\n );\n\n const handleOptionMouseDown = useCallback(\n (e: React.MouseEvent<HTMLLIElement>, index: number) => {\n selectValue(index);\n e.preventDefault();\n e.stopPropagation();\n return false;\n },\n [selectValue],\n );\n\n if (!sheet) {\n return null;\n }\n\n return (\n <Fixed\n className={`gs-editor ${editing ? 'gs-editing' : ''}`}\n style={editing ? { top, left, height } : {}}\n {...{\n 'data-mode': mode,\n 'data-sheet-id': sheetId,\n }}\n >\n <div className={`gs-cell-label ${editing ? ' gs-hidden' : ''}`}>{address}</div>\n <div className=\"gs-editor-inner\" style={{ width }}>\n <pre\n className=\"gs-editor-hl\"\n style={{\n //...cell?.style,\n height: editorRef.current?.scrollHeight,\n width: (editorRef.current?.scrollWidth ?? 0) - 4,\n }}\n >\n {(cell?.formulaEnabled ?? true) ? editorStyle(inputting) : inputting}\n </pre>\n <textarea\n data-sheet-id={sheetId}\n name=\"gs-editor-input\"\n data-size=\"small\"\n autoFocus={true}\n spellCheck={false}\n draggable={false}\n ref={editorRef}\n rows={numLines}\n onFocus={handleFocus}\n style={{ minWidth: width, minHeight: height }}\n onDoubleClick={handleDoubleClick}\n onBlur={handleBlur}\n value={inputting}\n onChange={handleChange}\n onSelect={handleSelect}\n onPaste={handlePaste}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUpInternal}\n onMouseEnter={() => {\n dispatch(setEditorHovering(true));\n }}\n onMouseLeave={() => {\n dispatch(setEditorHovering(false));\n }}\n />\n </div>\n {renderOverlays()}\n </Fixed>\n );\n};\n\n// Memoized token span component to prevent unnecessary re-renders\nconst TokenSpan = memo<{\n token: any;\n tokenKey: string;\n color?: string;\n className?: string;\n}>(\n ({ token, tokenKey, color, className }) => {\n return (\n <span key={tokenKey} style={color ? { color } : undefined} className={className}>\n {token.stringify()}\n </span>\n );\n },\n (prevProps, nextProps) => {\n // Custom comparison to prevent unnecessary re-renders\n return (\n prevProps.tokenKey === nextProps.tokenKey &&\n prevProps.color === nextProps.color &&\n prevProps.className === nextProps.className &&\n prevProps.token.stringify() === nextProps.token.stringify()\n );\n },\n);\n\nexport const editorStyle = (text: string) => {\n if (text[0] !== '=') {\n return <>{text}</>;\n }\n\n const lexer = new Lexer(text.substring(1));\n lexer.tokenize();\n let palletIndex = 0;\n const exists: { [ref: string]: number } = {};\n\n // Create a simple hash of the formula for stable keys\n const formulaHash = text.split('').reduce((hash, char) => {\n return ((hash << 5) - hash + char.charCodeAt(0)) & 0xffffffff;\n }, 0);\n\n return (\n <>\n =\n {lexer.tokens.map((token, i) => {\n // Handle SPACE tokens differently - render as plain text\n if (token.type === 'SPACE') {\n return <React.Fragment key={`${formulaHash}-SPACE-${i}`}>{token.stringify()}</React.Fragment>;\n }\n\n // Create a stable key based on formula hash, token content and index\n const tokenKey = `${formulaHash}-${token.type}-${token.stringify()}-${i}`;\n\n if (token.type === 'REF' || token.type === 'RANGE') {\n const normalizedToken = token.stringify();\n const existsIndex = exists[normalizedToken];\n if (existsIndex !== undefined) {\n return (\n <TokenSpan\n key={tokenKey}\n token={token}\n tokenKey={tokenKey}\n color={COLOR_PALETTE[existsIndex % COLOR_PALETTE.length]}\n />\n );\n }\n const color = COLOR_PALETTE[palletIndex % COLOR_PALETTE.length];\n exists[normalizedToken] = palletIndex++;\n return (\n <TokenSpan\n key={tokenKey}\n token={token}\n tokenKey={tokenKey}\n color={color}\n className={`gs-token-type-${token.type}`}\n />\n );\n }\n\n return (\n <TokenSpan\n key={tokenKey}\n token={token}\n tokenKey={tokenKey}\n className={`gs-token-type-${token.type} gs-token-entity-type-${typeof token.entity}`}\n />\n );\n })}\n </>\n );\n};\n","import type { ReactNode } from 'react';\nimport { createContext, useContext, useState } from 'react';\n\nimport type { StoreType } from '../types';\nimport type { Dispatcher } from '../store';\n\nexport type PluginContextType = {\n provided: boolean;\n store?: StoreType;\n apply?: Dispatcher;\n setStore: (store: StoreType) => void;\n setApply: (apply: Dispatcher) => void;\n};\n\nexport const PluginContext = createContext({} as PluginContextType);\n\nexport function useInitialPluginContext(): PluginContextType {\n const [store, setStore] = useState<StoreType | undefined>(undefined);\n const [apply, setApply] = useState<Dispatcher>();\n return {\n provided: true,\n store,\n apply,\n setStore,\n setApply,\n };\n}\n\nexport function usePluginContext(): [boolean, PluginContextType] {\n const ctx = useContext(PluginContext);\n if (ctx?.provided == null) {\n return [false, ctx];\n }\n return [true, ctx];\n}\n\nexport function usePluginDispatch() {\n const sync = useContext(PluginContext);\n if (!sync) {\n return undefined;\n }\n return sync;\n}\n\ntype Props = {\n children: ReactNode;\n context: PluginContextType;\n};\n\nexport function PluginBase({ children, context }: Props) {\n const [provided] = usePluginContext();\n if (provided) {\n return <>{children}</>;\n }\n return <PluginContext.Provider value={context}>{children}</PluginContext.Provider>;\n}\n","import type { FC, MutableRefObject } from 'react';\nimport { createRef, useContext, useEffect, useRef, useState } from 'react';\n\nimport type { OptionsType, Props, SheetHandle, StoreHandle } from '../types';\nimport { Context } from '../store';\n\nimport { setStore, updateSheet } from '../store/actions';\n\nimport { usePluginContext } from './PluginBase';\nimport { Sheet } from '@gridsheet/core';\n\ntype StoreObserverProps = OptionsType & {\n sheetName?: string;\n sheetRef?: MutableRefObject<SheetHandle | null>;\n storeRef?: MutableRefObject<StoreHandle | null>;\n};\n\nexport const createSheetRef = () => createRef<SheetHandle | null>();\nexport const useSheetRef = () => useRef<SheetHandle | null>(null);\nexport const createStoreRef = () => createRef<StoreHandle | null>();\nexport const useStoreRef = () => useRef<StoreHandle | null>(null);\nexport const StoreObserver: FC<StoreObserverProps> = ({\n sheetName,\n sheetHeight,\n sheetWidth,\n sheetRef,\n storeRef,\n editingOnEnter,\n mode,\n}) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive } = store;\n const sheet = sheetReactive.current;\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n if (sheetName && sheetName !== sheet.name) {\n sheet.name = sheetName;\n sheet.registry.sheetIdsByName[sheetName] = sheet.id;\n delete sheet.registry.sheetIdsByName[sheet.prevName];\n sheet.prevName = sheetName;\n //book.transmit();\n }\n }, [sheetName]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n const { registry } = sheet;\n requestAnimationFrame(() => registry.boot());\n registry.contextsBySheetId[sheet.id] = { store, dispatch };\n registry.transmit();\n\n if (sheetRef) {\n sheetRef.current = {\n sheet,\n apply: (sheet) => {\n dispatch(updateSheet(sheet as Sheet));\n },\n };\n }\n if (storeRef) {\n storeRef.current = {\n store,\n apply: (store) => {\n dispatch(setStore(store));\n },\n dispatch,\n };\n }\n }, [store, sheet, sheetRef, storeRef]);\n\n useEffect(() => {\n if (sheetHeight) {\n dispatch(setStore({ sheetHeight }));\n }\n }, [sheetHeight, dispatch]);\n useEffect(() => {\n if (sheetWidth) {\n dispatch(setStore({ sheetWidth }));\n }\n }, [sheetWidth]);\n useEffect(() => {\n if (typeof editingOnEnter !== 'undefined') {\n dispatch(setStore({ editingOnEnter }));\n }\n }, [editingOnEnter]);\n useEffect(() => {\n if (mode) {\n dispatch(setStore({ mode }));\n }\n }, [mode]);\n\n const [pluginProvided, pluginContext] = usePluginContext();\n useEffect(() => {\n if (!pluginProvided) {\n return;\n }\n pluginContext.setStore(store);\n pluginContext.setApply(() => dispatch);\n }, [store, pluginProvided, pluginContext]);\n\n return <></>;\n};\n","import { useContext } from 'react';\nimport type { MouseEvent } from 'react';\n\nimport { Context } from '../store';\nimport { setResizingPositionY, setResizingPositionX, updateSheet, setStore } from '../store/actions';\n\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH, MIN_WIDTH, MIN_HEIGHT } from '@gridsheet/core';\nimport { zoneToArea, makeSequence, between } from '@gridsheet/core';\nimport type { CellsByAddressType } from '../types';\nimport { p2a } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\n\nexport const Resizer = () => {\n const { store, dispatch } = useContext(Context);\n const {\n resizingPositionY: posY,\n resizingPositionX: posX,\n sheetReactive: sheetRef,\n leftHeaderSelecting,\n topHeaderSelecting,\n selectingZone,\n editorRef,\n mainRef,\n } = store;\n const sheet = sheetRef.current;\n\n const [y, startY, endY] = posY;\n const [x, startX, endX] = posX;\n\n if (mainRef.current == null || editorRef.current == null || !sheet) {\n return <div className=\"gs-resizing gs-hidden\" />;\n }\n\n const cell = sheet.getCell({ y: y === -1 ? 0 : y, x: x === -1 ? 0 : x }, { resolution: 'SYSTEM' });\n const { y: offsetY, x: offsetX } = mainRef.current.getBoundingClientRect();\n\n const baseWidth = cell?.width || DEFAULT_WIDTH;\n const baseHeight = cell?.height || DEFAULT_HEIGHT;\n\n const width = baseWidth + (endX - startX);\n const height = baseHeight + (endY - startY);\n\n const handleResizeEnd = () => {\n const selectingArea = zoneToArea(selectingZone);\n const { top, left, bottom, right } = selectingArea;\n const diff: CellsByAddressType = {};\n if (x !== -1) {\n let xs = [x];\n if (topHeaderSelecting && between({ start: left, end: right }, x)) {\n xs = makeSequence(left, right + 1);\n }\n xs.forEach((x) => {\n diff[p2a({ y: 0, x })] = { width };\n });\n }\n if (y !== -1) {\n let ys = [y];\n if (leftHeaderSelecting && between({ start: top, end: bottom }, y)) {\n ys = makeSequence(top, bottom + 1);\n }\n ys.forEach((y) => {\n diff[p2a({ y, x: 0 })] = { height };\n });\n }\n sheet.update({\n diff,\n partial: true,\n operator: 'USER',\n undoReflection: { selectingZone, sheetId: sheet.id },\n });\n dispatch(\n setStore({\n sheetReactive: { current: sheet },\n }),\n );\n dispatch(setResizingPositionY([-1, -1, -1]));\n dispatch(setResizingPositionX([-1, -1, -1]));\n focus(editorRef.current);\n };\n const handleResizeMove = (e: MouseEvent) => {\n if (y !== -1) {\n let endY = e.clientY;\n const height = baseHeight + (endY - startY);\n if (height < MIN_HEIGHT) {\n endY += MIN_HEIGHT - height;\n }\n dispatch(setResizingPositionY([y, startY, endY]));\n } else if (x !== -1) {\n let endX = e.clientX;\n const width = baseWidth + (endX - startX);\n if (width < MIN_WIDTH) {\n endX += MIN_WIDTH - width;\n }\n dispatch(setResizingPositionX([x, startX, endX]));\n }\n };\n\n return (\n <div\n className={`gs-resizing ${y === -1 && x === -1 ? 'gs-hidden' : ''}`}\n onMouseUp={handleResizeEnd}\n onMouseMove={handleResizeMove}\n >\n <div className={`gs-line-vertical ${x === -1 ? 'gs-hidden' : ''}`}>\n <div className={'gs-line'} style={{ width: 1, height: '100%', left: endX - offsetX }}>\n <span style={{ left: '-50%' }}>{width}px</span>\n </div>\n </div>\n <div className={`gs-line-horizontal ${y === -1 ? 'gs-hidden' : ''}`}>\n <div className={'gs-line'} style={{ width: '100%', height: 1, top: endY - offsetY }}>\n <span style={{ top: '-50%' }}>{height}px</span>\n </div>\n </div>\n </div>\n );\n};\n","import type { FC } from 'react';\nimport { useContext, useEffect, useRef } from 'react';\nimport { Context } from '../store';\n\nexport const Emitter: FC = () => {\n const { store } = useContext(Context);\n const { choosing: pointing, selectingZone: zone, sheetReactive } = store;\n const sheet = sheetReactive.current;\n\n useEffect(() => {\n if (sheet?.isInitialized && sheet.currentVersion > 0 && sheet.registry.onChange) {\n sheet.registry.onChange({\n sheet,\n points: {\n pointing,\n selectingFrom: { y: zone.startY, x: zone.startX },\n selectingTo: { y: zone.endY, x: zone.endX },\n },\n });\n }\n }, [sheetReactive]);\n\n useEffect(() => {\n if (sheet && sheet.registry.onSelect) {\n sheet.registry.onSelect({\n sheet,\n points: {\n pointing,\n selectingFrom: { y: zone.startY, x: zone.startX },\n selectingTo: { y: zone.endY, x: zone.endX },\n },\n });\n }\n }, [pointing, zone]);\n return null;\n};\n","import type { StoreDispatchType, FilterConfig, RawCellType } from '../types';\nimport { areaToZone, zoneShape, zoneToArea } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { p2a } from '@gridsheet/core';\nimport {\n copy,\n cut,\n paste,\n undo,\n redo,\n insertRowsAbove,\n insertRowsBelow,\n insertColsLeft,\n insertColsRight,\n removeRows,\n removeCols,\n sortRows,\n filterRows,\n setSearchQuery,\n setEntering,\n updateSheet,\n} from './actions';\nimport { clip } from '../lib/clipboard';\nimport { parseHTML, parseText } from '../lib/paste';\n\nexport const copier = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n const area = clip(store);\n dispatch(copy(areaToZone(area)));\n focus(editorRef.current);\n};\n\nexport const cutter = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n const area = clip(store);\n dispatch(cut(areaToZone(area)));\n focus(editorRef.current);\n};\n\nexport const paster = async ({ store, dispatch }: StoreDispatchType, onlyValue = false) => {\n const { editorRef } = store;\n const items = await navigator.clipboard.read();\n let cells: RawCellType[][] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.types.indexOf('text/html') !== -1) {\n const blob = await item.getType('text/html');\n const html = await blob.text();\n if (html) {\n cells = parseHTML(html, onlyValue);\n break;\n }\n } else if (item.types.indexOf('text/plain') !== -1) {\n const blob = await item.getType('text/plain');\n const text = await blob.text();\n if (text) {\n cells = parseText(text);\n break;\n }\n }\n }\n dispatch(paste({ matrix: cells, onlyValue }));\n focus(editorRef.current);\n};\n\nexport const undoer = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n dispatch(undo(null));\n focus(editorRef.current);\n};\n\nexport const redoer = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n dispatch(redo(null));\n focus(editorRef.current);\n};\n\nexport const rowsInserterAbove = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { top } = zoneToArea(selectingZone);\n const numRows = zoneShape(selectingZone).rows;\n dispatch(insertRowsAbove({ numRows, y: top, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const rowsInserterBelow = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { bottom } = zoneToArea(selectingZone);\n const numRows = zoneShape(selectingZone).rows;\n dispatch(insertRowsBelow({ numRows, y: bottom, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const colsInserterLeft = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { left } = zoneToArea(selectingZone);\n const numCols = zoneShape(selectingZone).cols;\n dispatch(insertColsLeft({ numCols, x: left, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const colsInserterRight = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { right } = zoneToArea(selectingZone);\n const numCols = zoneShape(selectingZone).cols;\n dispatch(insertColsRight({ numCols, x: right, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const rowsRemover = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { top } = zoneToArea(selectingZone);\n const numRows = zoneShape(selectingZone).rows;\n dispatch(removeRows({ numRows, y: top, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const colsRemover = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { left } = zoneToArea(selectingZone);\n const numCols = zoneShape(selectingZone).cols;\n dispatch(removeCols({ numCols, x: left, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const rowsSorterAsc = async ({ store, dispatch }: StoreDispatchType, x: number) => {\n const sheet = store.sheetReactive.current;\n if (sheet && (sheet.hasPendingCells() || sheet.registry.asyncPending.size > 0)) {\n await sheet.waitForPending();\n }\n dispatch(sortRows({ x, direction: 'asc' }));\n focus(store.editorRef.current);\n};\n\nexport const rowsSorterDesc = async ({ store, dispatch }: StoreDispatchType, x: number) => {\n const sheet = store.sheetReactive.current;\n if (sheet && (sheet.hasPendingCells() || sheet.registry.asyncPending.size > 0)) {\n await sheet.waitForPending();\n }\n dispatch(sortRows({ x, direction: 'desc' }));\n focus(store.editorRef.current);\n};\n\nexport const rowsFilterer = async ({ store, dispatch }: StoreDispatchType, x: number, filter: FilterConfig) => {\n const sheet = store.sheetReactive.current;\n if (sheet && (sheet.hasPendingCells() || sheet.registry.asyncPending.size > 0)) {\n await sheet.waitForPending();\n }\n dispatch(filterRows({ x, filter }));\n focus(store.editorRef.current);\n};\n\nexport const rowsFilterClearer = async ({ store, dispatch }: StoreDispatchType, x?: number) => {\n dispatch(filterRows({ x }));\n focus(store.editorRef.current);\n};\n\nexport const rowSortFixedToggler = ({ store, dispatch }: StoreDispatchType, y: number) => {\n const sheet = store.sheetReactive.current;\n if (!sheet) {\n return;\n }\n const addr = p2a({ y, x: 0 });\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const next = !rowCell?.sortFixed || undefined;\n sheet.update({ diff: { [addr]: { sortFixed: next } }, partial: true });\n dispatch(updateSheet(sheet));\n focus(store.editorRef.current);\n};\n\nexport const rowFilterFixedToggler = ({ store, dispatch }: StoreDispatchType, y: number) => {\n const sheet = store.sheetReactive.current;\n if (!sheet) {\n return;\n }\n const addr = p2a({ y, x: 0 });\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const next = !rowCell?.filterFixed || undefined;\n sheet.update({ diff: { [addr]: { filterFixed: next } }, partial: true });\n dispatch(updateSheet(sheet));\n focus(store.editorRef.current);\n};\n\nexport const searcher = async ({ store, dispatch }: StoreDispatchType) => {\n if (typeof store.searchQuery === 'undefined') {\n dispatch(setSearchQuery(''));\n }\n dispatch(setEntering(false));\n requestAnimationFrame(() => focus(store.searchInputRef.current));\n};\n\nexport const applyers = {\n copy: copier,\n cut: cutter,\n paste: paster,\n undo: undoer,\n redo: redoer,\n insertRowsAbove: rowsInserterAbove,\n insertRowsBelow: rowsInserterBelow,\n insertColsLeft: colsInserterLeft,\n insertColsRight: colsInserterRight,\n removeRows: rowsRemover,\n removeCols: colsRemover,\n sortRowsAsc: rowsSorterAsc,\n sortRowsDesc: rowsSorterDesc,\n filterRows: rowsFilterer,\n clearFilter: rowsFilterClearer,\n toggleSortFixed: rowSortFixedToggler,\n toggleFilterFixed: rowFilterFixedToggler,\n search: searcher,\n};\n","/**\n * Menu system — types, default descriptors, and MenuContext builder.\n */\n\n// ---- types ----------------------------------------------------------------\n\nimport type { PointType, ZoneType, FilterConfig } from '../types';\nimport type { UserSheet } from '@gridsheet/core';\nimport type { StoreType } from '../types';\nimport type { Dispatcher } from '../store';\nimport { operations as prevention } from '@gridsheet/core';\nimport { zoneShape } from '@gridsheet/core';\nimport { p2a } from '@gridsheet/core';\nimport {\n copier,\n cutter,\n paster,\n undoer,\n redoer,\n rowsSorterAsc,\n rowsSorterDesc,\n rowsFilterer,\n rowsFilterClearer,\n rowSortFixedToggler,\n rowFilterFixedToggler,\n searcher,\n} from '../store/applyers';\nimport {\n insertRowsAbove as _insertRowsAbove,\n insertRowsBelow as _insertRowsBelow,\n removeRows as _removeRows,\n insertColsLeft as _insertColsLeft,\n insertColsRight as _insertColsRight,\n removeCols as _removeCols,\n setStore as _setStore,\n} from '../store/actions';\n\nexport type MenuContext = {\n /** Current sheet instance */\n sheet: UserSheet;\n /** Currently focused cell */\n choosing: PointType;\n /** Currently selected zone */\n selectingZone: ZoneType;\n /** True when the left (row) header is being selected */\n leftHeaderSelecting: boolean;\n /** True when the top (column) header is being selected */\n topHeaderSelecting: boolean;\n\n // ---- actions ----\n cut(): Promise<void>;\n copy(): Promise<void>;\n paste(onlyValue?: boolean): Promise<void>;\n undo(): void;\n redo(): void;\n insertRowsAbove(y: number, numRows: number): void;\n insertRowsBelow(y: number, numRows: number): void;\n removeRows(y: number, numRows: number): void;\n insertColsLeft(x: number, numCols: number): void;\n insertColsRight(x: number, numCols: number): void;\n removeCols(x: number, numCols: number): void;\n sortRows(x: number, direction: 'asc' | 'desc'): Promise<void>;\n filterRows(x: number, filter?: FilterConfig): Promise<void>;\n clearFilter(x?: number): void;\n toggleSortFixed(y: number): void;\n toggleFilterFixed(y: number): void;\n search(): void;\n updateColLabel(x: number, label: string | undefined): void;\n /** Close the currently open menu */\n close(): void;\n};\n\nexport type MenuDividerItem = { type: 'divider'; visible?: (ctx: MenuContext) => boolean };\n\n/**\n * Base structure shared by all menu item descriptors.\n * `Args` is the tuple of coordinate arguments passed after `ctx`:\n * - `[]` → ContextMenu (no coordinate)\n * - `[y: number]` → RowMenu\n * - `[x: number]` → ColMenu\n */\nexport type MenuItemBase<Args extends unknown[] = []> = {\n type?: 'item';\n id?: string;\n label: string | ((ctx: MenuContext, ...args: Args) => string);\n shortcuts?: string[] | ((ctx: MenuContext, ...args: Args) => string[]);\n visible?: (ctx: MenuContext, ...args: Args) => boolean;\n disabled?: (ctx: MenuContext, ...args: Args) => boolean;\n /** Render a checkmark prefix when defined. */\n checked?: (ctx: MenuContext, ...args: Args) => boolean;\n onClick: (ctx: MenuContext, ...args: Args) => void | Promise<void>;\n};\n\n/**\n * A menu entry that renders a registered React component.\n * Use `registerMenuComponent(id, Component)` to associate an id with a component,\n * then reference it here as `{ type: 'component', componentId: id }`.\n */\nexport type MenuComponentItem<Args extends unknown[] = []> = {\n type: 'component';\n componentId: string;\n visible?: (ctx: MenuContext, ...args: Args) => boolean;\n};\n\nexport type ContextMenuItemDescriptor = MenuDividerItem | MenuItemBase | MenuComponentItem;\nexport type RowMenuItemDescriptor = MenuDividerItem | MenuItemBase<[y: number]> | MenuComponentItem<[y: number]>;\nexport type ColMenuItemDescriptor = MenuDividerItem | MenuItemBase<[x: number]> | MenuComponentItem<[x: number]>;\n\n// ---- helpers ---------------------------------------------------------------\n\nconst rowInsertCount = (ctx: MenuContext, y: number): number => {\n const { selectingZone } = ctx;\n const selStart = Math.min(selectingZone.startY, selectingZone.endY);\n const selEnd = Math.max(selectingZone.startY, selectingZone.endY);\n const isFullRow = selectingZone.startX === 1 && selectingZone.endX === ctx.sheet.numCols;\n return isFullRow && y >= selStart && y <= selEnd ? selEnd - selStart + 1 : 1;\n};\n\nconst colInsertCount = (ctx: MenuContext, x: number): number => {\n const { selectingZone } = ctx;\n const selStart = Math.min(selectingZone.startX, selectingZone.endX);\n const selEnd = Math.max(selectingZone.startX, selectingZone.endX);\n const isFullCol = selectingZone.startY === 1 && selectingZone.endY === ctx.sheet.numRows;\n return isFullCol && x >= selStart && x <= selEnd ? selEnd - selStart + 1 : 1;\n};\n\n// ---- default descriptors ---------------------------------------------------\n\nexport const defaultContextMenuDescriptors: ContextMenuItemDescriptor[] = [\n {\n id: 'cut',\n label: 'Cut',\n shortcuts: ['X'],\n onClick: (ctx) => ctx.cut(),\n },\n {\n id: 'copy',\n label: 'Copy',\n shortcuts: ['C'],\n onClick: (ctx) => ctx.copy(),\n },\n {\n id: 'paste',\n label: 'Paste',\n shortcuts: ['V'],\n onClick: (ctx) => ctx.paste(false),\n },\n {\n id: 'paste-only-value',\n label: 'Paste only value',\n shortcuts: ['Shift+V'],\n onClick: (ctx) => ctx.paste(true),\n },\n { type: 'divider', visible: (ctx) => ctx.leftHeaderSelecting || ctx.topHeaderSelecting },\n {\n id: 'insert-rows-above',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n return `Insert ${n} row${n > 1 ? 's' : ''} above`;\n },\n visible: (ctx) => ctx.leftHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y: ctx.choosing.y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsAbove)\n );\n },\n onClick: (ctx) => ctx.insertRowsAbove(ctx.choosing.y, zoneShape(ctx.selectingZone).rows),\n },\n {\n id: 'insert-rows-below',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n return `Insert ${n} row${n > 1 ? 's' : ''} below`;\n },\n visible: (ctx) => ctx.leftHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y: ctx.choosing.y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsBelow)\n );\n },\n onClick: (ctx) => ctx.insertRowsBelow(ctx.choosing.y, zoneShape(ctx.selectingZone).rows),\n },\n {\n id: 'insert-cols-left',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n return `Insert ${n} column${n > 1 ? 's' : ''} left`;\n },\n visible: (ctx) => ctx.topHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x: ctx.choosing.x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsLeft)\n );\n },\n onClick: (ctx) => ctx.insertColsLeft(ctx.choosing.x, zoneShape(ctx.selectingZone).cols),\n },\n {\n id: 'insert-cols-right',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n return `Insert ${n} column${n > 1 ? 's' : ''} right`;\n },\n visible: (ctx) => ctx.topHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x: ctx.choosing.x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsRight)\n );\n },\n onClick: (ctx) => ctx.insertColsRight(ctx.choosing.x, zoneShape(ctx.selectingZone).cols),\n },\n {\n id: 'remove-rows',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n return `Remove ${n} row${n > 1 ? 's' : ''}`;\n },\n visible: (ctx) => ctx.leftHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y: ctx.choosing.y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumRows !== -1 && sheet.numRows - n < sheet.minNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.RemoveRows)\n );\n },\n onClick: (ctx) => ctx.removeRows(ctx.choosing.y, zoneShape(ctx.selectingZone).rows),\n },\n {\n id: 'remove-cols',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n return `Remove ${n} column${n > 1 ? 's' : ''}`;\n },\n visible: (ctx) => ctx.topHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x: ctx.choosing.x }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumCols !== -1 && sheet.numCols - n < sheet.minNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.RemoveCols)\n );\n },\n onClick: (ctx) => ctx.removeCols(ctx.choosing.x, zoneShape(ctx.selectingZone).cols),\n },\n { type: 'divider' },\n {\n id: 'undo',\n label: 'Undo',\n shortcuts: ['Z'],\n disabled: (ctx) => ctx.sheet.historyIndex() <= -1,\n onClick: (ctx) => ctx.undo(),\n },\n {\n id: 'redo',\n label: 'Redo',\n shortcuts: ['R', 'Y', 'Shift+Z'],\n disabled: (ctx) => ctx.sheet.historyIndex() >= ctx.sheet.historySize() - 1,\n onClick: (ctx) => ctx.redo(),\n },\n { type: 'divider' },\n {\n id: 'search',\n label: 'Search',\n shortcuts: ['F'],\n onClick: (ctx) => ctx.search(),\n },\n];\n\nexport const defaultRowMenuDescriptors: RowMenuItemDescriptor[] = [\n {\n id: 'cut',\n label: 'Cut',\n shortcuts: ['X'],\n onClick: (ctx) => ctx.cut(),\n },\n {\n id: 'copy',\n label: 'Copy',\n shortcuts: ['C'],\n onClick: (ctx) => ctx.copy(),\n },\n {\n id: 'paste',\n label: 'Paste',\n shortcuts: ['V'],\n onClick: (ctx) => ctx.paste(false),\n },\n {\n id: 'paste-only-value',\n label: 'Paste only value',\n shortcuts: ['Shift+V'],\n onClick: (ctx) => ctx.paste(true),\n },\n { type: 'divider' },\n {\n id: 'insert-rows-above',\n label: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n return `Insert ${n} row${n > 1 ? 's' : ''} above`;\n },\n disabled: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsAbove)\n );\n },\n onClick: (ctx, y) => ctx.insertRowsAbove(y, rowInsertCount(ctx, y)),\n },\n {\n id: 'insert-rows-below',\n label: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n return `Insert ${n} row${n > 1 ? 's' : ''} below`;\n },\n disabled: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsBelow)\n );\n },\n onClick: (ctx, y) => ctx.insertRowsBelow(y, rowInsertCount(ctx, y)),\n },\n {\n id: 'remove-rows',\n label: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n return `Remove ${n} row${n > 1 ? 's' : ''}`;\n },\n disabled: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumRows !== -1 && sheet.numRows - n < sheet.minNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.RemoveRows)\n );\n },\n onClick: (ctx, y) => ctx.removeRows(y, rowInsertCount(ctx, y)),\n },\n { type: 'divider' },\n {\n id: 'toggle-sort-fixed',\n label: 'Fix row for sorting',\n checked: (ctx, y) => !!ctx.sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' })?.sortFixed,\n onClick: (ctx, y) => ctx.toggleSortFixed(y),\n },\n {\n id: 'toggle-filter-fixed',\n label: 'Fix row for filtering',\n checked: (ctx, y) => !!ctx.sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' })?.filterFixed,\n onClick: (ctx, y) => ctx.toggleFilterFixed(y),\n },\n { type: 'divider' },\n {\n id: 'search',\n label: 'Search',\n shortcuts: ['F'],\n onClick: (ctx) => ctx.search(),\n },\n];\n\n// The col menu composes registered section components (filter, sort, label) and\n// simple menu items. Use `registerMenuComponent` to override built-in sections.\nexport const defaultColMenuDescriptors: ColMenuItemDescriptor[] = [\n { type: 'component', componentId: 'col-filter' },\n { type: 'divider' },\n { type: 'component', componentId: 'col-sort' },\n { type: 'divider' },\n {\n id: 'cut',\n label: 'Cut',\n shortcuts: ['X'],\n onClick: (ctx) => ctx.cut(),\n },\n {\n id: 'copy',\n label: 'Copy',\n shortcuts: ['C'],\n onClick: (ctx) => ctx.copy(),\n },\n {\n id: 'paste',\n label: 'Paste',\n shortcuts: ['V'],\n onClick: (ctx) => ctx.paste(false),\n },\n {\n id: 'paste-only-value',\n label: 'Paste only value',\n shortcuts: ['Shift+V'],\n onClick: (ctx) => ctx.paste(true),\n },\n { type: 'divider' },\n {\n id: 'insert-cols-left',\n label: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n return `Insert ${n} column${n > 1 ? 's' : ''} left`;\n },\n disabled: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsLeft)\n );\n },\n onClick: (ctx, x) => ctx.insertColsLeft(x, colInsertCount(ctx, x)),\n },\n {\n id: 'insert-cols-right',\n label: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n return `Insert ${n} column${n > 1 ? 's' : ''} right`;\n },\n disabled: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsRight)\n );\n },\n onClick: (ctx, x) => ctx.insertColsRight(x, colInsertCount(ctx, x)),\n },\n {\n id: 'remove-cols',\n label: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n return `Remove ${n} column${n > 1 ? 's' : ''}`;\n },\n disabled: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumCols !== -1 && sheet.numCols - n < sheet.minNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.RemoveCols)\n );\n },\n onClick: (ctx, x) => ctx.removeCols(x, colInsertCount(ctx, x)),\n },\n { type: 'divider' },\n {\n id: 'search',\n label: 'Search',\n shortcuts: ['F'],\n onClick: (ctx) => ctx.search(),\n },\n { type: 'divider' },\n { type: 'component', componentId: 'col-label' },\n];\n\n// ---- buildMenuContext -------------------------------------------------------\n\nexport function buildMenuContext(store: StoreType, dispatch: Dispatcher, close: () => void): MenuContext {\n const props = { store, dispatch };\n const sheet = store.sheetReactive.current!;\n\n return {\n sheet,\n choosing: store.choosing,\n selectingZone: store.selectingZone,\n leftHeaderSelecting: store.leftHeaderSelecting,\n topHeaderSelecting: store.topHeaderSelecting,\n\n cut: () => cutter(props),\n copy: () => copier(props),\n paste: (onlyValue = false) => paster(props, onlyValue),\n undo: () => undoer(props),\n redo: () => redoer(props),\n\n insertRowsAbove: (y, numRows) => {\n dispatch(_insertRowsAbove({ numRows, y, operator: 'USER' }));\n },\n insertRowsBelow: (y, numRows) => {\n dispatch(_insertRowsBelow({ numRows, y, operator: 'USER' }));\n },\n removeRows: (y, numRows) => {\n dispatch(_removeRows({ numRows, y, operator: 'USER' }));\n },\n insertColsLeft: (x, numCols) => {\n dispatch(_insertColsLeft({ numCols, x, operator: 'USER' }));\n },\n insertColsRight: (x, numCols) => {\n dispatch(_insertColsRight({ numCols, x, operator: 'USER' }));\n },\n removeCols: (x, numCols) => {\n dispatch(_removeCols({ numCols, x, operator: 'USER' }));\n },\n\n sortRows: async (x, direction) => {\n if (direction === 'asc') {\n await rowsSorterAsc(props, x);\n } else {\n await rowsSorterDesc(props, x);\n }\n },\n filterRows: async (x, filter) => {\n if (filter) {\n await rowsFilterer(props, x, filter);\n } else {\n rowsFilterClearer(props, x);\n }\n },\n clearFilter: (x) => rowsFilterClearer(props, x),\n\n toggleSortFixed: (y) => rowSortFixedToggler(props, y),\n toggleFilterFixed: (y) => rowFilterFixedToggler(props, y),\n\n search: () => searcher(props),\n\n updateColLabel: (x, label) => {\n if (!sheet) {\n return;\n }\n const addr = p2a({ y: 0, x });\n sheet.update({\n diff: { [addr]: { label: label || undefined } },\n partial: true,\n undoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n redoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n });\n dispatch(_setStore({ sheetReactive: { current: sheet } }));\n },\n\n close,\n };\n}\n\n// ---- menu component registry -----------------------------------------------\n\nimport type { FC } from 'react';\n\nexport type ContextMenuSectionProps = {\n close: () => void;\n};\n\nexport type RowMenuSectionProps = {\n y: number;\n close: () => void;\n};\n\nexport type ColMenuSectionProps = {\n x: number;\n close: () => void;\n /** Signal waiting state to parent menu. Pass null to clear. */\n onWaiting?: (message: string | null, cancel?: () => void) => void;\n};\n\nconst _menuComponentRegistry = new Map<string, FC<any>>();\n\n/**\n * Register a React component under a string id so it can be referenced in menu\n * descriptors via `{ type: 'component', componentId: '...' }`.\n *\n * Built-in ids: `'col-filter'`, `'col-sort'`, `'col-label'`.\n * You can override any built-in by registering your own component with the same id.\n */\n\nexport function registerMenuComponent(id: string, component: FC<any>): void {\n _menuComponentRegistry.set(id, component);\n}\n\n/** Look up a previously registered component by id. */\n\nexport function getMenuComponent(id: string): FC<any> | undefined {\n return _menuComponentRegistry.get(id);\n}\n","import type { FC } from 'react';\n\ntype MenuItemProps = {\n label: string;\n shortcuts?: string[];\n disabled?: boolean;\n /**\n * undefined → no check column\n * true/false → displayed as a toggle row with a checkmark\n */\n checked?: boolean;\n testId?: string;\n onClick?: () => void;\n className?: string;\n};\n\nexport const MenuItem: FC<MenuItemProps> = ({\n label,\n shortcuts,\n disabled = false,\n checked,\n testId,\n onClick,\n className,\n}) => {\n const hasCheck = checked !== undefined;\n return (\n <li\n className={`gs-menu-item ${disabled ? 'gs-disabled' : 'gs-enabled'}${className ? ` ${className}` : ''}`}\n data-testid={testId}\n onClick={disabled ? undefined : onClick}\n >\n <div className={`gs-menu-name${hasCheck ? ' gs-row-fixed-toggle' : ''}`}>\n {hasCheck && <span className={`gs-row-fixed-check${checked ? ' gs-row-fixed-active' : ''}`}>✓</span>}\n {label}\n </div>\n {shortcuts != null && shortcuts.length > 0 && (\n <div className=\"gs-menu-shortcut\">\n {shortcuts.map((shortcut, i) => (\n <span key={i}>\n {i > 0 && <span className=\"gs-menu-shortcut-sep\">, </span>}\n <span className=\"gs-menu-shortcut-badge\">\n {shortcut.split('+').map((part, j, arr) =>\n j < arr.length - 1 ? (\n <span key={j}>{part}+</span>\n ) : (\n <span key={j} className=\"gs-menu-underline\">\n {part}\n </span>\n ),\n )}\n </span>\n </span>\n ))}\n </div>\n )}\n </li>\n );\n};\n\nexport const MenuDivider: FC = () => <li className=\"gs-menu-divider\" />;\n","import { useContext, useRef, useEffect } from 'react';\n\nimport { setContextMenuPosition } from '../store/actions';\n\nimport { Context } from '../store';\nimport { Fixed } from './Fixed';\nimport type { ContextMenuItemDescriptor } from '../lib/menu';\nimport { buildMenuContext } from '../lib/menu';\nimport { MenuItem, MenuDivider } from './MenuItem';\nimport { clampPopup } from '@gridsheet/core';\n\nexport const ContextMenu = () => {\n const { store, dispatch } = useContext(Context);\n const { contextMenuPosition, contextMenu } = store;\n const { y: top, x: left } = contextMenuPosition;\n const menuRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (menuRef.current) {\n clampPopup(menuRef.current);\n }\n });\n\n if (top === -1) {\n return null;\n }\n\n const close = () => dispatch(setContextMenuPosition({ y: -1, x: -1 }));\n const ctx = buildMenuContext(store, dispatch, close);\n\n return (\n <Fixed\n className=\"gs-menu-modal gs-context-menu-modal\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n close();\n return false;\n }}\n >\n <div ref={menuRef} className={'gs-context-menu'} style={{ top: top, left: left }}>\n <ul className=\"gs-menu-items\">\n {contextMenu.map((d, i) => {\n if (d.type === 'divider') {\n if (d.visible && !d.visible(ctx)) {\n return null;\n }\n return <MenuDivider key={i} />;\n }\n if (d.type === 'component') {\n return null;\n }\n const visible = !d.visible || d.visible(ctx);\n if (!visible) {\n return null;\n }\n const disabled = d.disabled?.(ctx) ?? false;\n const label = typeof d.label === 'function' ? d.label(ctx) : d.label;\n const shortcuts = typeof d.shortcuts === 'function' ? d.shortcuts(ctx) : d.shortcuts;\n const checked = d.checked?.(ctx);\n return (\n <MenuItem\n key={i}\n label={label}\n shortcuts={shortcuts}\n disabled={disabled}\n checked={checked}\n testId={d.id ? `${d.id}-item` : undefined}\n onClick={() => d.onClick(ctx)}\n />\n );\n })}\n </ul>\n </div>\n </Fixed>\n );\n};\n","import { type FC, useContext, useState, useCallback, useEffect } from 'react';\nimport { Context } from '../store';\nimport { filterRows } from '../store/actions';\nimport type { FilterCondition, FilterConditionMethod } from '../types';\nimport { operations as prevention } from '@gridsheet/core';\nimport { registerMenuComponent, type ColMenuSectionProps } from '../lib/menu';\n\nconst METHOD_LABELS: Record<FilterConditionMethod, string> = {\n eq: '=',\n ne: '≠',\n gt: '>',\n gte: '≥',\n lt: '<',\n lte: '≤',\n blank: 'Blank',\n nonblank: 'Nonblank',\n includes: 'Includes',\n excludes: 'Excludes',\n};\n\nconst NO_VALUE_METHODS: FilterConditionMethod[] = ['blank', 'nonblank'];\nconst DEFAULT_CONDITION: FilterCondition = { method: 'eq', value: [''] };\n\ntype PendingFilter = {\n x: number;\n conditions: FilterCondition[];\n mode: 'and' | 'or';\n};\n\nconst FilterSection: FC<ColMenuSectionProps> = ({ x, close, onWaiting }) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n\n const [conditions, setConditions] = useState<FilterCondition[]>([{ ...DEFAULT_CONDITION }]);\n const [mode, setMode] = useState<'and' | 'or'>('or');\n const [pending, setPending] = useState<PendingFilter | null>(null);\n\n // Auto-focus first value input when x changes\n const firstValueRef = useCallback(\n (node: HTMLInputElement | null) => {\n if (node) {\n node.focus();\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [x],\n );\n\n // Restore conditions from existing filter on the column cell when x changes\n useEffect(() => {\n if (sheet) {\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const existing = colCell?.filter;\n if (existing && existing.conditions.length > 0) {\n setConditions(existing.conditions.map((c) => ({ ...c, value: [...c.value] })));\n setMode(existing.mode || 'or');\n } else {\n setConditions([{ ...DEFAULT_CONDITION, value: [''] }]);\n setMode('or');\n }\n }\n }, [x, sheet]);\n\n // Escape key cancels during waiting\n const handleCancel = useCallback(() => {\n setPending(null);\n onWaiting?.(null);\n close();\n }, [close, onWaiting]);\n\n // Notify parent about waiting state\n useEffect(() => {\n if (pending) {\n onWaiting?.('Filtering…', handleCancel);\n }\n // Do NOT include onWaiting/handleCancel in deps to avoid re-triggering execute\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n // Execute pending filter after async formulas resolve\n useEffect(() => {\n if (!pending) {\n return;\n }\n let cancelled = false;\n const execute = () => {\n if (cancelled) {\n return;\n }\n const currentSheet = sheetRef.current;\n if (!currentSheet) {\n return;\n }\n const { x: actionX, conditions: validConditions, mode: filterMode } = pending;\n if (validConditions.length > 0) {\n dispatch(filterRows({ x: actionX, filter: { mode: filterMode, conditions: validConditions } }));\n } else {\n dispatch(filterRows({ x: actionX }));\n }\n onWaiting?.(null);\n setPending(null);\n close();\n };\n const currentSheet = sheetRef.current;\n if (currentSheet && (currentSheet.hasPendingCells() || currentSheet.registry.asyncPending.size > 0)) {\n currentSheet.waitForPending().then(execute);\n } else {\n execute();\n }\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n const updateCondition = useCallback((index: number, patch: Partial<FilterCondition>) => {\n setConditions((prev) => {\n const next = [...prev];\n next[index] = { ...next[index], ...patch };\n return next;\n });\n }, []);\n\n const addCondition = useCallback(() => {\n setConditions((prev) => [...prev, { ...DEFAULT_CONDITION, value: [''] }]);\n }, []);\n\n const removeCondition = useCallback((index: number) => {\n setConditions((prev) => {\n if (prev.length <= 1) {\n return [{ ...DEFAULT_CONDITION, value: [''] }];\n }\n return prev.filter((_, i) => i !== index);\n });\n }, []);\n\n const handleApplyFilter = useCallback(() => {\n const valid = conditions.filter((c) => {\n if (NO_VALUE_METHODS.includes(c.method)) {\n return true;\n }\n return c.value.some((v) => v.trim() !== '');\n });\n setPending({ x, conditions: valid, mode });\n }, [x, conditions, mode]);\n\n const handleResetColumn = useCallback(() => {\n setPending(null);\n dispatch(filterRows({ x }));\n close();\n }, [dispatch, x, close]);\n\n const handleResetAll = useCallback(() => {\n setPending(null);\n dispatch(filterRows({}));\n close();\n }, [dispatch, close]);\n\n if (!sheet) {\n return null;\n }\n\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const filterDisabled = prevention.hasOperation(colCell?.prevention, prevention.Filter);\n const hasAnyFilter = sheet.hasActiveFilters();\n\n return (\n <li className={`gs-column-menu-filter${filterDisabled ? ' gs-disabled' : ''}`}>\n <>\n <div className=\"gs-filter-header\">\n <div className=\"gs-menu-name\">Filter:</div>\n <button className=\"gs-filter-add-btn\" onClick={addCondition} disabled={filterDisabled}>\n + ADD\n </button>\n <div className={`gs-filter-mode-toggle${conditions.length <= 1 ? ' gs-disabled' : ''}`}>\n <label className={mode === 'and' ? 'gs-active' : ''}>\n <input\n type=\"radio\"\n name=\"gs-filter-mode\"\n checked={mode === 'and'}\n onChange={() => setMode('and')}\n disabled={filterDisabled || conditions.length <= 1}\n />\n AND\n </label>\n <label className={mode === 'or' ? 'gs-active' : ''}>\n <input\n type=\"radio\"\n name=\"gs-filter-mode\"\n checked={mode === 'or'}\n onChange={() => setMode('or')}\n disabled={filterDisabled || conditions.length <= 1}\n />\n OR\n </label>\n </div>\n </div>\n <div className=\"gs-filter-conditions\">\n {conditions.map((cond, i) => (\n <div className=\"gs-filter-condition-row\" key={i}>\n <select\n className=\"gs-filter-method-select\"\n value={cond.method}\n disabled={filterDisabled}\n tabIndex={i * 2 + 1}\n onChange={(e) => updateCondition(i, { method: e.target.value as FilterConditionMethod })}\n >\n {(Object.keys(METHOD_LABELS) as FilterConditionMethod[]).map((m) => (\n <option key={m} value={m}>\n {METHOD_LABELS[m]}\n </option>\n ))}\n </select>\n {!NO_VALUE_METHODS.includes(cond.method) && (\n <input\n ref={i === 0 ? firstValueRef : undefined}\n className=\"gs-filter-value-input\"\n type=\"text\"\n placeholder=\"Value\"\n value={cond.value[0] || ''}\n disabled={filterDisabled}\n tabIndex={i * 2 + 2}\n onChange={(e) => updateCondition(i, { value: [e.target.value] })}\n onKeyDown={(e) => {\n if (e.nativeEvent.isComposing) {\n return;\n }\n if (e.key === 'Enter') {\n handleApplyFilter();\n }\n if (e.key === 'Escape') {\n close();\n }\n }}\n />\n )}\n <button\n className=\"gs-filter-remove-btn\"\n onClick={() => removeCondition(i)}\n disabled={filterDisabled}\n title=\"Remove condition\"\n >\n ✕\n </button>\n </div>\n ))}\n </div>\n <div className=\"gs-filter-actions\">\n {hasAnyFilter && (\n <button className=\"gs-filter-reset-all-btn\" onClick={handleResetAll}>\n RESET ALL\n </button>\n )}\n <div className=\"gs-filter-actions-right\">\n {colCell?.filter && (\n <button className=\"gs-filter-reset-btn\" onClick={handleResetColumn}>\n RESET\n </button>\n )}\n <button className=\"gs-filter-apply-btn\" onClick={handleApplyFilter} disabled={filterDisabled}>\n APPLY\n </button>\n </div>\n </div>\n </>\n </li>\n );\n};\n\nregisterMenuComponent('col-filter', FilterSection);\nexport { FilterSection };\n","import { type FC, useContext, useState, useCallback, useEffect } from 'react';\nimport { Context } from '../store';\nimport { sortRows } from '../store/actions';\nimport { operations as prevention } from '@gridsheet/core';\nimport { registerMenuComponent, type ColMenuSectionProps } from '../lib/menu';\n\ntype PendingSort = {\n x: number;\n direction: 'asc' | 'desc';\n};\n\nconst SortSection: FC<ColMenuSectionProps> = ({ x, close, onWaiting }) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n\n const [pending, setPending] = useState<PendingSort | null>(null);\n\n const handleCancel = useCallback(() => {\n setPending(null);\n onWaiting?.(null);\n close();\n }, [close, onWaiting]);\n\n // Notify parent about waiting state\n useEffect(() => {\n if (pending) {\n onWaiting?.('Sorting\\u2026', handleCancel);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n // Execute pending sort after async formulas resolve\n useEffect(() => {\n if (!pending) {\n return;\n }\n let cancelled = false;\n const execute = () => {\n if (cancelled) {\n return;\n }\n const currentSheet = sheetRef.current;\n if (!currentSheet) {\n return;\n }\n dispatch(sortRows({ x: pending.x, direction: pending.direction }));\n onWaiting?.(null);\n setPending(null);\n close();\n };\n const currentSheet = sheetRef.current;\n if (currentSheet && (currentSheet.hasPendingCells() || currentSheet.registry.asyncPending.size > 0)) {\n currentSheet.waitForPending().then(execute);\n } else {\n execute();\n }\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n if (!sheet) {\n return null;\n }\n\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const sortDisabled = prevention.hasOperation(colCell?.prevention, prevention.Sort);\n\n return (\n <li className={`gs-menu-item gs-column-menu-sort${sortDisabled ? ' gs-disabled' : ''}`}>\n <div className=\"gs-menu-name\">Sort:</div>\n <div className=\"gs-sort-buttons\">\n <button\n className=\"gs-sort-btn gs-sort-btn-asc\"\n onClick={(e) => {\n e.stopPropagation();\n if (!sortDisabled) {\n setPending({ x, direction: 'asc' });\n }\n }}\n disabled={sortDisabled}\n >\n ↓ A to Z\n </button>\n <button\n className=\"gs-sort-btn gs-sort-btn-desc\"\n onClick={(e) => {\n e.stopPropagation();\n if (!sortDisabled) {\n setPending({ x, direction: 'desc' });\n }\n }}\n disabled={sortDisabled}\n >\n ↑ Z to A\n </button>\n </div>\n </li>\n );\n};\n\nregisterMenuComponent('col-sort', SortSection);\nexport { SortSection };\n","import { type FC, useContext, useState, useCallback, useEffect, useRef } from 'react';\nimport { Context } from '../store';\nimport { setStore } from '../store/actions';\nimport { operations as prevention } from '@gridsheet/core';\nimport { x2c, p2a } from '@gridsheet/core';\nimport { getLabel } from '@gridsheet/core';\nimport { registerMenuComponent, type ColMenuSectionProps } from '../lib/menu';\n\nconst LabelSection: FC<ColMenuSectionProps> = ({ x, close }) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n const labelInputRef = useRef<HTMLInputElement>(null);\n const [label, setLabel] = useState('');\n\n // Restore label value when x changes\n useEffect(() => {\n if (sheet) {\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n setLabel(colCell?.label ?? '');\n }\n }, [x, sheet]);\n\n const handleApplyLabel = useCallback(() => {\n if (!sheet) {\n return;\n }\n const address = p2a({ y: 0, x });\n sheet.update({\n diff: { [address]: { label: label || undefined } },\n partial: true,\n ignoreFields: [],\n undoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n redoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n });\n dispatch(setStore({ sheetReactive: { current: sheet } }));\n close();\n }, [dispatch, x, label, close, sheet, store.selectingZone, store.choosing]);\n\n if (!sheet) {\n return null;\n }\n\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const labelDisabled = prevention.hasOperation(colCell?.prevention, prevention.SetLabel);\n const labelPlaceholder = getLabel(sheet, colCell?.label, { y: 0, x }, x) ?? x2c(x);\n\n return (\n <li className={`gs-menu-item gs-column-menu-label${labelDisabled ? ' gs-disabled' : ''}`}>\n <label className=\"gs-label-input-row\">\n <div className=\"gs-label-input-label\">Label:</div>\n <input\n ref={labelInputRef}\n className=\"gs-label-input\"\n type=\"text\"\n placeholder={labelPlaceholder}\n value={label}\n disabled={labelDisabled}\n onChange={(e) => setLabel(e.target.value)}\n onKeyDown={(e) => {\n if (e.nativeEvent.isComposing) {\n return;\n }\n if (e.key === 'Enter') {\n handleApplyLabel();\n }\n if (e.key === 'Escape') {\n close();\n }\n }}\n />\n <button className=\"gs-label-apply-btn\" onClick={handleApplyLabel} disabled={labelDisabled}>\n UPDATE\n </button>\n </label>\n </li>\n );\n};\n\nregisterMenuComponent('col-label', LabelSection);\nexport { LabelSection };\n","import { type FC, useContext, useCallback, useState } from 'react';\nimport { Context } from '../store';\nimport { setColumnMenu } from '../store/actions';\nimport { Fixed } from './Fixed';\nimport { focus } from '@gridsheet/core';\nimport { buildMenuContext } from '../lib/menu';\nimport { getMenuComponent } from '../lib/menu';\nimport { MenuItem, MenuDivider } from './MenuItem';\n\n// Import section modules so their registerMenuComponent() calls run at load time.\n// Users may override any of these ids via registerMenuComponent() after import.\nimport './ColumnMenuFilterSection';\nimport './ColumnMenuSortSection';\nimport './ColumnMenuLabelSection';\n\nexport const ColumnMenu: FC = () => {\n const { store, dispatch } = useContext(Context);\n const { columnMenuState, editorRef, colMenu } = store;\n const sheet = store.sheetReactive.current;\n\n const x = columnMenuState?.x;\n const position = columnMenuState?.position;\n\n const [waitingState, setWaitingState] = useState<{ message: string; cancel: () => void } | null>(null);\n\n const handleClose = useCallback(() => {\n dispatch(setColumnMenu(null));\n focus(editorRef.current);\n }, [dispatch, editorRef]);\n\n const handleWaiting = useCallback(\n (message: string | null, cancel?: () => void) => {\n if (message) {\n setWaitingState({ message, cancel: cancel ?? handleClose });\n } else {\n setWaitingState(null);\n }\n },\n [handleClose],\n );\n\n if (!columnMenuState || !sheet || x == null || !position) {\n return null;\n }\n\n const ctx = buildMenuContext(store, dispatch, handleClose);\n\n return (\n <Fixed\n className=\"gs-menu-modal gs-column-menu-modal\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n if (!waitingState) {\n handleClose();\n }\n return false;\n }}\n >\n <div\n className=\"gs-column-menu\"\n style={{ top: position.y, left: position.x, display: waitingState ? 'none' : undefined }}\n onClick={(e) => e.stopPropagation()}\n >\n <ul className=\"gs-menu-items\">\n {colMenu.map((descriptor, index) => {\n if (descriptor.type === 'component') {\n const visible = !descriptor.visible || descriptor.visible(ctx, x);\n if (!visible) {\n return null;\n }\n const Section = getMenuComponent(descriptor.componentId);\n if (!Section) {\n return null;\n }\n return <Section key={index} x={x} close={handleClose} onWaiting={handleWaiting} />;\n }\n if (descriptor.type === 'divider') {\n if (descriptor.visible && !descriptor.visible(ctx)) {\n return null;\n }\n return <MenuDivider key={index} />;\n }\n const visible = !descriptor.visible || descriptor.visible(ctx, x);\n if (!visible) {\n return null;\n }\n const disabled = descriptor.disabled?.(ctx, x) ?? false;\n const label = typeof descriptor.label === 'function' ? descriptor.label(ctx, x) : descriptor.label;\n const shortcuts =\n typeof descriptor.shortcuts === 'function' ? descriptor.shortcuts(ctx, x) : descriptor.shortcuts;\n return (\n <MenuItem\n key={index}\n label={label}\n shortcuts={shortcuts}\n disabled={disabled}\n testId={descriptor.id ? `${descriptor.id}-item` : undefined}\n onClick={() => {\n descriptor.onClick(ctx, x);\n dispatch(setColumnMenu(null));\n }}\n />\n );\n })}\n </ul>\n </div>\n {waitingState && (\n <div\n className=\"gs-column-menu gs-column-menu-waiting\"\n style={{ top: position.y, left: position.x }}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"gs-waiting-message\">{waitingState.message}</div>\n <div className=\"gs-waiting-spinner\" />\n <button className=\"gs-waiting-cancel-btn\" onClick={waitingState.cancel}>\n CANCEL\n </button>\n </div>\n )}\n </Fixed>\n );\n};\n","import { type FC, useContext } from 'react';\nimport { Context } from '../store';\nimport { setRowMenu } from '../store/actions';\nimport { Fixed } from './Fixed';\nimport { focus } from '@gridsheet/core';\nimport type { RowMenuItemDescriptor } from '../lib/menu';\nimport { buildMenuContext } from '../lib/menu';\nimport { MenuItem, MenuDivider } from './MenuItem';\n\nfunction renderRowDescriptor(\n descriptor: RowMenuItemDescriptor,\n ctx: ReturnType<typeof buildMenuContext>,\n y: number,\n index: number,\n close: () => void,\n) {\n if (descriptor.type === 'divider') {\n return <MenuDivider key={index} />;\n }\n if (descriptor.type === 'component') {\n return null;\n }\n const visible = !descriptor.visible || descriptor.visible(ctx, y);\n if (!visible) {\n return null;\n }\n const disabled = descriptor.disabled?.(ctx, y) ?? false;\n const label = typeof descriptor.label === 'function' ? descriptor.label(ctx, y) : descriptor.label;\n const shortcuts = typeof descriptor.shortcuts === 'function' ? descriptor.shortcuts(ctx, y) : descriptor.shortcuts;\n const checked = descriptor.checked != null ? descriptor.checked(ctx, y) : undefined;\n return (\n <MenuItem\n key={index}\n label={label}\n shortcuts={shortcuts}\n disabled={disabled}\n checked={checked}\n testId={descriptor.id ? `${descriptor.id}-item` : undefined}\n onClick={() => {\n descriptor.onClick(ctx, y);\n close();\n }}\n />\n );\n}\n\nexport const RowMenu: FC = () => {\n const { store, dispatch } = useContext(Context);\n const { rowMenuState, sheetReactive: sheetRef, editorRef, rowMenu } = store;\n const sheet = sheetRef.current;\n\n const y = rowMenuState?.y;\n const position = rowMenuState?.position;\n\n const handleClose = () => {\n dispatch(setRowMenu(null));\n focus(editorRef.current);\n };\n\n if (!rowMenuState || !sheet || y == null || !position) {\n return null;\n }\n\n const ctx = buildMenuContext(store, dispatch, handleClose);\n\n return (\n <Fixed\n className=\"gs-menu-modal gs-row-menu-modal\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n handleClose();\n return false;\n }}\n >\n <div className=\"gs-row-menu\" style={{ top: position.y, left: position.x }} onClick={(e) => e.stopPropagation()}>\n <ul className=\"gs-menu-items\">\n {rowMenu.map((descriptor, index) => renderRowDescriptor(descriptor, ctx, y, index, handleClose))}\n </ul>\n </div>\n </Fixed>\n );\n};\n","export const isTouching = (e: React.TouchEvent | React.MouseEvent): boolean => {\n if (e.type.startsWith('touch')) {\n return (e as React.TouchEvent).touches.length > 0;\n }\n if (e.type.startsWith('mouse')) {\n const mouseEvent = e as React.MouseEvent;\n // left click only\n return !!(mouseEvent.buttons & 1) && mouseEvent.button === 0;\n }\n return false;\n};\n\n/**\n * Safely call preventDefault to avoid errors on touch events\n */\nexport const safePreventDefault = (e: React.MouseEvent | React.TouchEvent): void => {\n if (!e.type.startsWith('touch')) {\n e.preventDefault();\n }\n};\n","import { useContext, useRef, useCallback, useEffect, memo, useMemo, useState } from 'react';\nimport { x2c, y2r } from '@gridsheet/core';\nimport { zoneToArea, among, areaToRange } from '@gridsheet/core';\nimport {\n choose,\n select,\n drag,\n write,\n setEditorRect,\n setContextMenuPosition,\n setAutofillDraggingTo,\n setEditingAddress,\n setDragging,\n submitAutofill,\n setStore,\n} from '../store/actions';\n\nimport { Context } from '../store';\nimport { FormulaError } from '@gridsheet/core';\nimport { Pending } from '@gridsheet/core';\nimport { insertRef, isRefInsertable } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { isXSheetFocused } from '../store/helpers';\nimport type { FC, RefObject } from 'react';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport type { UserSheet } from '@gridsheet/core';\nimport { calcBelowPosition, hAlignTransform, type PopupPosition } from '@gridsheet/core';\n\ntype Props = {\n y: number;\n x: number;\n};\n\nexport const Cell: FC<Props> = memo(({ y, x }) => {\n const rowId = y2r(y);\n const colId = x2c(x);\n const address = `${colId}${rowId}`;\n const { store, dispatch } = useContext(Context);\n const isFirstPointed = useRef(true);\n\n const cellRef = useRef<HTMLTableCellElement>(null);\n const [errorTooltipPos, setErrorTooltipPos] = useState<PopupPosition | null>(null);\n const {\n sheetReactive,\n editingAddress,\n choosing,\n selectingZone,\n leftHeaderSelecting,\n topHeaderSelecting,\n editorRef,\n autofillDraggingTo,\n contextMenu,\n } = store;\n const sheet = sheetReactive.current;\n\n // Whether the focus is on another sheet\n const xSheetFocused = isXSheetFocused(store);\n\n const lastFocused = sheet?.registry.lastFocused;\n\n const selectingArea = zoneToArea(selectingZone); // (top, left) -> (bottom, right)\n\n const editing = editingAddress === address;\n const pointed = choosing.y === y && choosing.x === x;\n const _setEditorRect = useCallback(() => {\n const rect = cellRef.current?.getBoundingClientRect();\n if (rect == null) {\n return null;\n }\n dispatch(\n setEditorRect({\n y: rect.y,\n x: rect.x,\n height: rect.height,\n width: rect.width,\n }),\n );\n }, [dispatch]);\n\n useEffect(() => {\n // Avoid setting coordinates on the initial render to account for shifts caused by redrawing due to virtualization.\n if (pointed && !isFirstPointed.current) {\n _setEditorRect();\n return;\n }\n isFirstPointed.current = false;\n }, [pointed, editing, _setEditorRect]);\n\n const cell = sheet?.getCell({ y, x }, { resolution: 'SYSTEM' });\n\n const writeCell = useCallback(\n (value: string) => {\n dispatch(write({ value }));\n },\n [dispatch],\n );\n\n const apply = useCallback(\n (sheet: UserSheet) => {\n dispatch(setStore({ sheetReactive: { current: sheet.__raw__ } }));\n },\n [dispatch],\n );\n\n let errorMessage = '';\n let rendered: any;\n try {\n if (sheet) {\n rendered = sheet.render({ sheet, point: { y, x }, apply, value: undefined });\n }\n } catch (e: any) {\n if (FormulaError.is(e)) {\n errorMessage = e.message;\n rendered = e.code;\n } else {\n errorMessage = e.message;\n rendered = '#UNKNOWN';\n }\n }\n const [, v] = sheet?.getSolvedCache({ y, x }) ?? [undefined, undefined];\n const isPendingCell = Pending.is(v);\n const input = editorRef.current;\n\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const handleDragStart = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n safePreventDefault(e);\n\n if (!sheet) {\n return false;\n }\n if (!isTouching(e)) {\n return false;\n }\n if (!input) {\n return false;\n }\n\n // Single cell selection only for touch events\n if (e.type.startsWith('touch')) {\n // Blur the input field to commit current value when selecting via touch\n if (editingAnywhere && input) {\n input.blur();\n }\n dispatch(choose({ y, x }));\n dispatch(select({ startY: y, startX: x, endY: y, endX: x }));\n return true;\n }\n\n // Normal drag operation for mouse events\n if (e.shiftKey) {\n dispatch(drag({ y, x }));\n } else {\n dispatch(select({ startY: y, startX: x, endY: -1, endX: -1 }));\n }\n\n dispatch(setDragging(true));\n const fullAddress = `${sheet.sheetPrefix(!xSheetFocused)}${address}`;\n if (editingAnywhere) {\n const inserted = insertRef({ input: lastFocused || null, ref: fullAddress });\n if (inserted) {\n return false;\n }\n }\n\n sheet.registry.lastFocused = input;\n focus(input);\n dispatch(setEditingAddress(''));\n\n if (autofillDraggingTo) {\n return false;\n }\n\n if (editingAnywhere) {\n writeCell(input.value);\n }\n if (!e.shiftKey) {\n dispatch(choose({ y, x }));\n }\n return true;\n },\n [editingAnywhere, input, address, xSheetFocused, lastFocused, autofillDraggingTo, writeCell, sheet],\n );\n\n const handleDragEnd = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n if (e.type.startsWith('touch')) {\n return;\n }\n\n safePreventDefault(e);\n dispatch(setDragging(false));\n if (autofillDraggingTo) {\n dispatch(submitAutofill(autofillDraggingTo));\n focus(input);\n return false;\n }\n if (editingAnywhere) {\n dispatch(drag({ y: -1, x: -1 }));\n }\n },\n [autofillDraggingTo, editingAnywhere, input],\n );\n\n const handleDragging = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n if (!isTouching(e)) {\n return false;\n }\n\n // Do nothing for touch events\n if (e.type.startsWith('touch')) {\n return false;\n }\n\n if (!sheet) {\n return false;\n }\n\n safePreventDefault(e);\n e.stopPropagation();\n\n if (autofillDraggingTo) {\n dispatch(setAutofillDraggingTo({ x, y }));\n return false;\n }\n if (leftHeaderSelecting) {\n dispatch(drag({ y, x: sheet.numCols }));\n return false;\n }\n if (topHeaderSelecting) {\n dispatch(drag({ y: sheet.numRows, x }));\n return false;\n }\n if (editingAnywhere && !isRefInsertable(lastFocused || null)) {\n return false;\n }\n dispatch(drag({ y, x }));\n\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: y, endX: x });\n const fullRange = `${sheet.sheetPrefix(!xSheetFocused)}${areaToRange(newArea)}`;\n insertRef({ input: lastFocused || null, ref: fullRange });\n }\n //sheet.registry.transmit(); // Force drawing because the formula is not reflected in largeInput\n return true;\n },\n [\n autofillDraggingTo,\n leftHeaderSelecting,\n topHeaderSelecting,\n sheet,\n editingAnywhere,\n lastFocused,\n selectingZone,\n xSheetFocused,\n ],\n );\n\n const handleAutofillMouseDown = useCallback(\n (e: React.MouseEvent) => {\n dispatch(setAutofillDraggingTo({ x, y }));\n dispatch(setDragging(true));\n e.stopPropagation();\n },\n [dispatch, x, y],\n );\n\n const handleErrorTriangleEnter = useCallback(() => {\n const rect = cellRef.current?.getBoundingClientRect();\n if (!rect) {\n return;\n }\n setErrorTooltipPos(calcBelowPosition(rect));\n }, []);\n\n const handleErrorTriangleLeave = useCallback(() => {\n setErrorTooltipPos(null);\n }, []);\n\n // --- Memoize event handlers with useCallback ---\n const onContextMenu = useCallback(\n (e: React.MouseEvent<HTMLTableCellElement>) => {\n if (contextMenu.length > 0) {\n e.stopPropagation();\n safePreventDefault(e);\n dispatch(setContextMenuPosition({ y: e.clientY, x: e.clientX }));\n return false;\n }\n return true;\n },\n [contextMenu.length],\n );\n\n const onDoubleClick = useCallback(\n (e: React.MouseEvent<HTMLTableCellElement>) => {\n e.stopPropagation();\n safePreventDefault(e);\n setEditingAddress(address);\n const dblclick = document.createEvent('MouseEvents');\n dblclick.initEvent('dblclick', true, true);\n input?.dispatchEvent(dblclick);\n return false;\n },\n [address, input],\n );\n\n const autofillDragClass = useMemo(() => {\n if (!editing && pointed && selectingArea.bottom === -1) {\n return 'gs-autofill-drag';\n }\n\n if (selectingArea.bottom === y && selectingArea.right === x) {\n return 'gs-autofill-drag';\n }\n return 'gs-autofill-drag gs-hidden';\n }, [editing, pointed, selectingArea]);\n\n if (!sheet) {\n return null;\n }\n\n if (!input) {\n return (\n <td key={x} data-x={x} data-y={y} data-address={address} className=\"gs-cell gs-hidden\">\n <div className=\"gs-cell-inner-wrap\">\n <div className=\"gs-cell-inner\">\n <div className=\"gs-cell-rendered\"></div>\n </div>\n <div className=\"gs-autofill-drag\"></div>\n </div>\n </td>\n );\n }\n\n return (\n <td\n key={x}\n ref={cellRef}\n data-x={x}\n data-y={y}\n data-address={address}\n className={`gs-cell ${among(selectingArea, { y, x }) ? 'gs-selecting' : ''} ${pointed ? 'gs-choosing' : ''} ${\n editing ? 'gs-editing' : ''\n } ${isPendingCell ? 'gs-pending' : ''}`}\n style={{\n ...cell?.style,\n }}\n onContextMenu={onContextMenu}\n onDoubleClick={onDoubleClick}\n >\n <div\n className={`gs-cell-inner-wrap`}\n onMouseDown={handleDragStart}\n onTouchStart={handleDragStart}\n onMouseEnter={handleDragging}\n onMouseUp={handleDragEnd}\n >\n <div\n className={'gs-cell-inner'}\n style={{\n ...cell?.style,\n justifyContent: cell?.justifyContent || 'left',\n alignItems: cell?.alignItems || 'start',\n }}\n >\n {errorMessage && (\n <div\n className=\"gs-formula-error-triangle\"\n onMouseEnter={handleErrorTriangleEnter}\n onMouseLeave={handleErrorTriangleLeave}\n />\n )}\n <div className=\"gs-cell-rendered\">{rendered}</div>\n </div>\n {errorMessage && errorTooltipPos && (\n <div\n className=\"gs-formula-error-tooltip\"\n style={{\n top: errorTooltipPos.y + 4,\n left: errorTooltipPos.x,\n transform: hAlignTransform(errorTooltipPos.hAlign),\n }}\n >\n {errorMessage}\n </div>\n )}\n <div className={autofillDragClass} onMouseDown={handleAutofillMouseDown}></div>\n </div>\n </td>\n );\n});\n","import type { CSSProperties } from 'react';\nimport { useEffect, useRef, useContext, useCallback } from 'react';\nimport { Context } from '../store';\nimport { drag, setAutofillDraggingTo, setDragging, submitAutofill } from '../store/actions';\nimport { getAreaInTabular } from '@gridsheet/core';\nimport { insertRef, isFocus } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { areaToRange, zoneToArea } from '@gridsheet/core';\nimport { isXSheetFocused } from '../store/helpers';\n\ntype Props = {\n className?: string;\n style: CSSProperties;\n horizontal?: number;\n vertical?: number;\n};\n\nconst acceleration = 0.4;\nconst maxSpeed = 200;\n\nlet lastScrollTime = new Date().getTime();\nlet currentSpeed = 0;\n\nexport function ScrollHandle({ style, horizontal = 0, vertical = 0, className = '' }: Props) {\n const scrollRef = useRef<number | null>(null);\n const { store, dispatch } = useContext(Context);\n const {\n tabularRef,\n autofillDraggingTo,\n dragging,\n selectingZone,\n editorRef,\n sheetReactive: sheetRef,\n searchInputRef,\n editingAddress,\n } = store;\n const sheet = sheetRef.current;\n\n let isScrolling = false;\n const xSheetFocused = isXSheetFocused(store);\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const getDestEdge = useCallback(\n (e: React.MouseEvent) => {\n if (!sheet) {\n return { x: -1, y: -1 };\n }\n if (horizontal == 0 && vertical == 0) {\n const tabularRect = tabularRef.current!.getBoundingClientRect();\n const { left, top, right, bottom } = tabularRect;\n horizontal = e.pageX > right ? 1 : e.pageX < left ? -1 : 0;\n if (horizontal === 0) {\n vertical = e.pageY > bottom ? 1 : e.pageY < top ? -1 : 0;\n }\n }\n const area = getAreaInTabular(tabularRef.current!);\n let { endX: x, endY: y } = selectingZone;\n if (horizontal) {\n x = horizontal > 0 ? area.right : area.left;\n } else if (vertical) {\n y = vertical > 0 ? area.bottom : area.top;\n }\n return { x, y };\n },\n [sheet, horizontal, vertical, selectingZone],\n );\n\n const scrollStep = useCallback(\n (e: React.MouseEvent) => {\n if (!isScrolling || tabularRef.current === null || !sheet) {\n return;\n }\n const now = new Date().getTime();\n if (now - lastScrollTime > 1000) {\n currentSpeed = 0;\n }\n lastScrollTime = now;\n\n tabularRef.current.scrollBy({\n left: currentSpeed * horizontal!,\n top: currentSpeed * vertical!,\n });\n focus(editorRef.current);\n\n const { x, y } = getDestEdge(e);\n if (autofillDraggingTo) {\n const { y: curY, x: curX } = autofillDraggingTo;\n dispatch(setAutofillDraggingTo({ y: y === -1 ? curY : y, x: x === -1 ? curX : x }));\n } else {\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: y, endX: x });\n const sheetPrefix = sheet.sheetPrefix(!xSheetFocused);\n const sheetRange = areaToRange(newArea);\n const fullRange = `${sheetPrefix}${sheetRange}`;\n insertRef({ input: editorRef.current, ref: fullRange });\n }\n dispatch(drag({ y, x }));\n }\n currentSpeed = Math.min(currentSpeed + acceleration, maxSpeed);\n scrollRef.current = requestAnimationFrame(() => scrollStep(e));\n },\n [\n isScrolling,\n sheet,\n horizontal,\n vertical,\n autofillDraggingTo,\n editingAnywhere,\n selectingZone,\n xSheetFocused,\n getDestEdge,\n ],\n );\n\n const handleMouseEnter = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (isScrolling) {\n return;\n }\n isScrolling = true;\n\n if (horizontal === 0 || vertical === 0) {\n const tabularRect = tabularRef.current!.getBoundingClientRect();\n const { left, top, right, bottom } = tabularRect;\n\n horizontal ||= e.pageX > right ? 1 : e.pageX < left ? -1 : 0;\n if (horizontal === 0) {\n vertical ||= e.pageY > bottom ? 1 : e.pageY < top ? -1 : 0;\n }\n }\n scrollRef.current = requestAnimationFrame(() => scrollStep(e));\n },\n [isScrolling, horizontal, vertical, scrollStep],\n );\n\n const stopScroll = useCallback(() => {\n if (scrollRef.current !== null) {\n cancelAnimationFrame(scrollRef.current);\n scrollRef.current = null;\n }\n isScrolling = false;\n if (!isFocus(searchInputRef.current)) {\n // Pressing Enter on a search result will not focus the editor.\n focus(editorRef.current);\n }\n }, []);\n\n const handleMouseUp = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const area = getAreaInTabular(tabularRef.current!);\n if (area.bottom === -1 || area.right === -1) {\n return;\n }\n\n const { x, y } = getDestEdge(e);\n if (autofillDraggingTo) {\n const { y: curY, x: curX } = autofillDraggingTo;\n dispatch(submitAutofill({ y: y === -1 ? curY : y, x: x === -1 ? curX : x }));\n focus(editorRef.current);\n } else {\n if (editingAnywhere) {\n // inserting a range\n dispatch(drag({ y: -1, x: -1 })); // Reset dragging\n }\n }\n },\n [autofillDraggingTo, editingAnywhere, getDestEdge],\n );\n\n const handleMouseUpWrapper = useCallback(\n (e: React.MouseEvent) => {\n stopScroll();\n dispatch(setDragging(false));\n requestAnimationFrame(() => handleMouseUp(e));\n },\n [stopScroll, handleMouseUp],\n );\n\n const handleMouseLeave = useCallback(() => {\n stopScroll();\n }, [stopScroll]);\n\n useEffect(() => {\n return stopScroll;\n }, [stopScroll]);\n\n if (!editorRef.current || (!dragging && !autofillDraggingTo)) {\n return <div className={`gs-scroll-handle gs-hidden ${className}`} />;\n }\n\n return (\n <div\n style={style}\n className={`gs-scroll-handle ${className}`}\n onMouseUp={(e) => {\n handleMouseUpWrapper(e);\n }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n />\n );\n}\n","import type { FC } from 'react';\nimport { useContext, useCallback, memo, useRef } from 'react';\nimport { x2c } from '@gridsheet/core';\nimport { getLabel } from '@gridsheet/core';\nimport { between, zoneToArea } from '@gridsheet/core';\nimport { Context } from '../store';\nimport {\n choose,\n drag,\n select,\n selectCols,\n setAutofillDraggingTo,\n setColumnMenu,\n setContextMenuPosition,\n setDragging,\n setEditingAddress,\n setResizingPositionX,\n submitAutofill,\n write,\n} from '../store/actions';\nimport { DEFAULT_WIDTH } from '@gridsheet/core';\nimport { operations as prevention } from '@gridsheet/core';\nimport { insertRef } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { isXSheetFocused } from '../store/helpers';\nimport { ScrollHandle } from './ScrollHandle';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport { useDebounceCallback } from '../lib/hooks';\n\ntype Props = {\n x: number;\n};\n\nexport const HeaderCellTop: FC<Props> = memo(({ x }) => {\n const colId = x2c(x);\n const { store, dispatch } = useContext(Context);\n\n const {\n sheetReactive: sheetRef,\n editingAddress,\n choosing,\n selectingZone,\n topHeaderSelecting,\n editorRef,\n autofillDraggingTo,\n dragging,\n contextMenu,\n columnMenuState,\n } = store;\n const sheet = sheetRef.current;\n\n const col = sheet?.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const width = col?.width || DEFAULT_WIDTH;\n const hasFilter = !!(col?.filter && col.filter.conditions.length > 0);\n\n const xSheetFocused = isXSheetFocused(store);\n const lastFocused = sheet?.registry.lastFocused;\n\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const writeCell = useCallback(\n (value: string) => {\n dispatch(write({ value, point: choosing }));\n },\n [choosing],\n );\n\n const handleResizeMouseDown = useCallback((e: React.MouseEvent) => {\n dispatch(setResizingPositionX([x, e.clientX, e.clientX]));\n e.stopPropagation();\n safePreventDefault(e);\n }, []);\n\n const handleDragStart = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n safePreventDefault(e);\n\n if (!isTouching(e) || !sheet) {\n return false;\n }\n\n if (dragging) {\n return false;\n }\n\n // Single column selection only for touch events\n if (e.type.startsWith('touch')) {\n // Blur the input field to commit current value when selecting via touch\n if (editingAnywhere && editorRef.current) {\n editorRef.current.blur();\n }\n dispatch(choose({ y: 1, x }));\n dispatch(select({ startY: 1, startX: x, endY: sheet.numRows, endX: x }));\n return true;\n }\n\n dispatch(select({ startY: 1, startX: x, endY: -1, endX: x }));\n const fullAddress = `${sheet.sheetPrefix(!xSheetFocused)}${colId}:${colId}`;\n if (editingAnywhere) {\n const inserted = insertRef({ input: lastFocused || null, ref: fullAddress });\n if (inserted) {\n dispatch(select({ startY: sheet.numRows, startX: x, endY: 0, endX: x }));\n return false;\n }\n }\n\n let startX = e.shiftKey ? selectingZone.startX : x;\n if (startX === -1) {\n startX = choosing.x;\n }\n\n dispatch(\n selectCols({\n range: { start: startX, end: x },\n numRows: sheet.numRows,\n }),\n );\n\n if (editingAnywhere) {\n writeCell(lastFocused?.value ?? '');\n }\n dispatch(setEditingAddress(''));\n dispatch(setDragging(true));\n focus(editorRef.current);\n\n if (autofillDraggingTo) {\n return false;\n }\n return true;\n },\n [\n dragging,\n editingAnywhere,\n xSheetFocused,\n colId,\n lastFocused,\n selectingZone,\n choosing,\n autofillDraggingTo,\n editorRef,\n ],\n );\n\n const handleDragEnd = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n if (e.type.startsWith('touch')) {\n return;\n }\n\n safePreventDefault(e);\n dispatch(setDragging(false));\n if (autofillDraggingTo) {\n focus(editorRef.current);\n return false;\n }\n },\n [autofillDraggingTo],\n );\n\n const handleDragging = useDebounceCallback((e: React.MouseEvent | React.TouchEvent) => {\n if (!isTouching(e) || !sheet) {\n return false;\n }\n\n if (e.type.startsWith('touch')) {\n return false;\n }\n\n safePreventDefault(e);\n e.stopPropagation();\n\n if (autofillDraggingTo) {\n dispatch(setAutofillDraggingTo({ y: 1, x }));\n return false;\n }\n\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: 1, endX: x });\n const [left, right] = [x2c(newArea.left), x2c(newArea.right)];\n const fullRange = `${sheet.sheetPrefix(!xSheetFocused)}${left}:${right}`;\n insertRef({ input: lastFocused || null, ref: fullRange });\n }\n\n if (autofillDraggingTo == null) {\n const { startY } = selectingZone;\n if (startY === 1) {\n dispatch(drag({ y: sheet.numRows, x }));\n } else {\n dispatch(drag({ y: 1, x }));\n }\n }\n return false;\n }, 100);\n\n if (!sheet) {\n return (\n <th data-x={x} className=\"gs-th gs-th-top gs-hidden\">\n <div className=\"gs-th-inner-wrap\">\n <div className=\"gs-th-inner\">\n <ScrollHandle style={{ position: 'absolute' }} vertical={-1} />\n <div className=\"gs-resizer\"></div>\n </div>\n </div>\n </th>\n );\n }\n\n return (\n <th\n data-x={x}\n className={`gs-th gs-th-top ${choosing.x === x ? 'gs-choosing' : ''} ${\n between({ start: selectingZone.startX, end: selectingZone.endX }, x)\n ? topHeaderSelecting\n ? 'gs-th-selecting'\n : 'gs-selecting'\n : ''\n }`}\n style={{ ...col?.style, width, minWidth: width, maxWidth: width }}\n onContextMenu={(e) => {\n if (contextMenu.length > 0) {\n e.stopPropagation();\n safePreventDefault(e);\n dispatch(setContextMenuPosition({ y: e.clientY, x: e.clientX }));\n return false;\n }\n return true;\n }}\n >\n <div\n className=\"gs-th-inner-wrap\"\n onMouseDown={handleDragStart}\n onTouchStart={handleDragStart}\n onMouseEnter={handleDragging}\n onMouseUp={handleDragEnd}\n >\n <div className=\"gs-th-inner\" style={{ height: sheet.headerHeight, position: 'relative' }}>\n <ScrollHandle\n style={{\n position: 'absolute',\n zIndex: topHeaderSelecting ? -1 : 1,\n }}\n vertical={-1}\n />\n {(() => {\n const displayedLabel = getLabel(sheet, col?.label, { y: 0, x }, x) ?? colId;\n if (displayedLabel !== colId) {\n return (\n <>\n <span className=\"gs-col-addr\">{colId}</span>\n {displayedLabel}\n </>\n );\n }\n return displayedLabel;\n })()}\n {!prevention.hasOperation(col?.prevention, prevention.ColumnMenu) && (\n <button\n className={`gs-menu-btn gs-column-menu-btn ${hasFilter ? 'gs-filtered' : ''} ${columnMenuState?.x === x ? 'gs-active' : ''}`}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n (e.currentTarget as HTMLElement).dataset.pressX = String(e.clientX);\n (e.currentTarget as HTMLElement).dataset.pressY = String(e.clientY);\n }}\n onMouseUp={(e) => {\n e.stopPropagation();\n const btn = e.currentTarget as HTMLElement;\n const pressX = Number(btn.dataset.pressX ?? e.clientX);\n const pressY = Number(btn.dataset.pressY ?? e.clientY);\n const moved = Math.abs(e.clientX - pressX) > 4 || Math.abs(e.clientY - pressY) > 4;\n if (moved) {\n return; // was a drag, ignore\n }\n const rect = btn.getBoundingClientRect();\n if (columnMenuState?.x === x) {\n dispatch(setColumnMenu(null));\n } else {\n const alreadySelected =\n between({ start: selectingZone.startX, end: selectingZone.endX }, x) &&\n selectingZone.startY === 1 &&\n selectingZone.endY === sheet.numRows;\n if (!alreadySelected) {\n dispatch(selectCols({ range: { start: x, end: x }, numRows: sheet.numRows }));\n }\n dispatch(setColumnMenu({ x, position: { y: rect.bottom, x: rect.left } }));\n }\n }}\n title=\"Sort & Filter\"\n >\n ⋮\n </button>\n )}\n <div\n className={`\n gs-resizer \n ${prevention.hasOperation(col?.prevention, prevention.Resize) ? 'gs-protected' : ''}\n ${dragging ? 'gs-hidden' : ''}`}\n style={{ height: sheet.headerHeight }}\n onMouseDown={handleResizeMouseDown}\n >\n <i />\n </div>\n </div>\n </div>\n </th>\n );\n});\n","import type { FC } from 'react';\nimport { useContext, useCallback, memo, useRef } from 'react';\nimport { y2r } from '@gridsheet/core';\nimport { getLabel } from '@gridsheet/core';\nimport { between, zoneToArea } from '@gridsheet/core';\nimport { Context } from '../store';\nimport {\n choose,\n drag,\n select,\n selectRows,\n setAutofillDraggingTo,\n setContextMenuPosition,\n setDragging,\n setEditingAddress,\n setResizingPositionY,\n setRowMenu,\n submitAutofill,\n write,\n} from '../store/actions';\nimport { DEFAULT_HEIGHT } from '@gridsheet/core';\nimport { operations as prevention } from '@gridsheet/core';\nimport { insertRef } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { isXSheetFocused } from '../store/helpers';\nimport { ScrollHandle } from './ScrollHandle';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport { useDebounceCallback } from '../lib/hooks';\n\ntype Props = {\n y: number;\n};\n\nexport const HeaderCellLeft: FC<Props> = memo(({ y }) => {\n const rowId = `${y2r(y)}`;\n const { store, dispatch } = useContext(Context);\n\n const {\n choosing,\n editingAddress,\n selectingZone,\n leftHeaderSelecting,\n editorRef,\n sheetReactive: sheetRef,\n autofillDraggingTo,\n dragging,\n contextMenu,\n rowMenuState,\n } = store;\n const sheet = sheetRef.current;\n\n const row = sheet?.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const height = row?.height || DEFAULT_HEIGHT;\n\n const xSheetFocused = isXSheetFocused(store);\n const lastFocused = sheet?.registry.lastFocused;\n\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const writeCell = useCallback(\n (value: string) => {\n dispatch(write({ value, point: choosing }));\n },\n [choosing],\n );\n\n const handleResizeMouseDown = useCallback((e: React.MouseEvent) => {\n dispatch(setResizingPositionY([y, e.clientY, e.clientY]));\n e.stopPropagation();\n safePreventDefault(e);\n }, []);\n\n const handleDragStart = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n safePreventDefault(e);\n\n if (!isTouching(e) || !sheet) {\n return false;\n }\n if (dragging) {\n return false;\n }\n\n // Single row selection only for touch events\n if (e.type.startsWith('touch')) {\n // Blur the input field to commit current value when selecting via touch\n if (editingAnywhere && editorRef.current) {\n editorRef.current.blur();\n }\n dispatch(choose({ y, x: 1 }));\n dispatch(select({ startY: y, startX: 1, endY: y, endX: sheet.numCols }));\n return true;\n }\n\n // Normal drag operation for mouse events\n dispatch(select({ startY: y, startX: 1, endY: y, endX: -1 }));\n const fullAddress = `${sheet.sheetPrefix(!xSheetFocused)}${rowId}:${rowId}`;\n if (editingAnywhere) {\n const inserted = insertRef({ input: lastFocused || null, ref: fullAddress });\n if (inserted) {\n dispatch(select({ startY: y, startX: sheet.numCols, endY: y, endX: 0 }));\n return false;\n }\n }\n\n let startY = e.shiftKey ? selectingZone.startY : y;\n if (startY === -1) {\n startY = choosing.y;\n }\n\n dispatch(\n selectRows({\n range: { start: startY, end: y },\n numCols: sheet.numCols,\n }),\n );\n\n if (editingAnywhere) {\n writeCell(lastFocused?.value ?? '');\n }\n dispatch(setEditingAddress(''));\n dispatch(setDragging(true));\n focus(editorRef.current);\n\n if (autofillDraggingTo) {\n return false;\n }\n return true;\n },\n [\n dragging,\n editingAnywhere,\n xSheetFocused,\n rowId,\n lastFocused,\n selectingZone,\n choosing,\n autofillDraggingTo,\n editorRef,\n ],\n );\n\n const handleDragEnd = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n if (e.type.startsWith('touch')) {\n return;\n }\n\n safePreventDefault(e);\n dispatch(setDragging(false));\n if (autofillDraggingTo) {\n focus(editorRef.current);\n return false;\n }\n },\n [autofillDraggingTo],\n );\n\n const handleDragging = useDebounceCallback((e: React.MouseEvent | React.TouchEvent) => {\n if (!isTouching(e) || !sheet) {\n return false;\n }\n\n // Do nothing for touch events\n if (e.type.startsWith('touch')) {\n return false;\n }\n\n safePreventDefault(e);\n e.stopPropagation();\n\n if (autofillDraggingTo) {\n dispatch(setAutofillDraggingTo({ y, x: 1 }));\n return false;\n }\n\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: y, endX: 1 });\n const [top, bottom] = [y2r(newArea.top), y2r(newArea.bottom)];\n const fullRange = `${sheet.sheetPrefix(!xSheetFocused)}${top}:${bottom}`;\n insertRef({ input: lastFocused || null, ref: fullRange });\n }\n\n if (autofillDraggingTo == null) {\n const { startX } = selectingZone;\n if (startX === 1) {\n dispatch(drag({ y, x: sheet.numCols }));\n } else {\n dispatch(drag({ y, x: 1 }));\n }\n }\n return false;\n }, 100);\n\n const handleContextMenu = useCallback(\n (e: React.MouseEvent<HTMLTableCellElement>) => {\n if (contextMenu.length > 0) {\n e.stopPropagation();\n safePreventDefault(e);\n dispatch(setContextMenuPosition({ y: e.clientY, x: e.clientX }));\n return false;\n }\n return true;\n },\n [contextMenu.length],\n );\n\n if (!sheet) {\n return null;\n }\n\n return (\n <th\n data-y={y}\n className={`gs-th gs-th-left ${choosing.y === y ? 'gs-choosing' : ''} ${\n between({ start: selectingZone.startY, end: selectingZone.endY }, y)\n ? leftHeaderSelecting\n ? 'gs-th-selecting'\n : 'gs-selecting'\n : ''\n } ${row?.filterFixed ? 'gs-filter-fixed' : ''} ${row?.sortFixed ? 'gs-sort-fixed' : ''}`}\n style={{ ...row?.style, height }}\n onContextMenu={handleContextMenu}\n >\n <div\n className=\"gs-th-inner-wrap\"\n onMouseDown={handleDragStart}\n onTouchStart={handleDragStart}\n onMouseEnter={handleDragging}\n onMouseUp={handleDragEnd}\n >\n <div className=\"gs-th-inner\" style={{ width: sheet.headerWidth, position: 'relative' }}>\n <ScrollHandle\n style={{\n position: 'absolute',\n zIndex: leftHeaderSelecting ? -1 : 1,\n }}\n horizontal={-1}\n />\n {getLabel(sheet, row?.label, { y, x: 0 }, y) ?? rowId}\n {!prevention.hasOperation(row?.prevention, prevention.RowMenu) && (\n <button\n className={`gs-menu-btn gs-row-menu-btn ${rowMenuState?.y === y ? 'gs-active' : ''}`}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n (e.currentTarget as HTMLElement).dataset.pressX = String(e.clientX);\n (e.currentTarget as HTMLElement).dataset.pressY = String(e.clientY);\n }}\n onMouseUp={(e) => {\n e.stopPropagation();\n const btn = e.currentTarget as HTMLElement;\n const pressX = Number(btn.dataset.pressX ?? e.clientX);\n const pressY = Number(btn.dataset.pressY ?? e.clientY);\n const moved = Math.abs(e.clientX - pressX) > 4 || Math.abs(e.clientY - pressY) > 4;\n if (moved) {\n return; // was a drag, ignore\n }\n const rect = btn.getBoundingClientRect();\n if (rowMenuState?.y === y) {\n dispatch(setRowMenu(null));\n } else {\n const alreadySelected =\n between({ start: selectingZone.startY, end: selectingZone.endY }, y) &&\n selectingZone.startX === 1 &&\n selectingZone.endX === sheet.numCols;\n if (!alreadySelected) {\n dispatch(selectRows({ range: { start: y, end: y }, numCols: sheet.numCols }));\n }\n dispatch(setRowMenu({ y, position: { y: rect.bottom, x: rect.right } }));\n }\n }}\n title=\"Row menu\"\n >\n ⋮\n </button>\n )}\n <div\n className={`\n gs-resizer\n ${prevention.hasOperation(row?.prevention, prevention.Resize) ? 'gs-protected' : ''}\n ${dragging ? 'gs-hidden' : ''}`}\n style={{ width: sheet.headerWidth }}\n onMouseDown={handleResizeMouseDown}\n ></div>\n </div>\n </div>\n </th>\n );\n});\n","import { useContext, useEffect, useRef, useCallback } from 'react';\nimport { Context } from '../store';\nimport { zoneToArea } from '@gridsheet/core';\nimport { between } from '@gridsheet/core';\nimport { a2p } from '@gridsheet/core';\nimport { COLOR_PALETTE } from '@gridsheet/core';\nimport { Autofill } from '@gridsheet/core';\nimport { getCellRectPositions } from '@gridsheet/core';\nimport type { Sheet } from '@gridsheet/core';\nimport type { FC } from 'react';\nimport type { RefPaletteType, AreaType, ModeType } from '../types';\n\nconst COLOR_POINTED = 'rgba(0, 119, 255, 1)';\nconst COLOR_SELECTED = 'rgba(0, 119, 255, 0.6)';\nconst SELECTING_FILL = 'rgba(0, 128, 255, 0.2)';\nconst COLOR_COPYING = '#0077ff';\nconst COLOR_CUTTING = '#0077ff';\nconst SEARCH_MATCHING_BACKGROUND = 'rgba(0, 200, 100, 0.2)';\nconst COLOR_SEARCH_MATCHING = '#00aa78';\nconst COLOR_AUTOFILL = '#0077aa';\n\nconst HEADER_COLORS = {\n light: {\n selecting: 'rgba(0, 0, 0, 0.1)',\n choosing: 'rgba(0, 0, 0, 0.2)',\n thSelecting: 'rgba(0, 0, 0, 0.55)',\n },\n dark: {\n selecting: 'rgba(255, 255, 255, 0.08)',\n choosing: 'rgba(255, 255, 255, 0.18)',\n thSelecting: 'rgba(255, 255, 255, 0.4)',\n },\n} as const;\n\ntype Props = {\n refs?: RefPaletteType;\n};\n\ntype Ctx2D = CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n\nconst fillRect = (ctx: Ctx2D, x: number, y: number, width: number, height: number, color: string) => {\n ctx.fillStyle = color;\n ctx.fillRect(x, y, width, height);\n};\n\nconst drawRect = (\n ctx: Ctx2D,\n x: number,\n y: number,\n width: number,\n height: number,\n color: string,\n lineWidth: number = 2,\n dashPattern: number[] = [],\n fillColor?: string,\n) => {\n if (fillColor) {\n ctx.fillStyle = fillColor;\n ctx.fillRect(x, y, width, height);\n }\n\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(dashPattern);\n ctx.strokeRect(x + lineWidth / 2, y + lineWidth / 2, width - lineWidth, height - lineWidth);\n ctx.setLineDash([]);\n};\n\n// Draw an area rect in viewport coordinates (absolute coords - scroll offset, clamped to viewport)\nconst drawAreaRectViewport = (\n ctx: Ctx2D,\n sheet: Sheet,\n scrollTop: number,\n scrollLeft: number,\n viewW: number,\n viewH: number,\n area: AreaType,\n color: string,\n lineWidth: number = 2,\n dashPattern: number[] = [],\n fillColor?: string,\n) => {\n const { top, left, bottom, right } = area;\n if (top === -1 || left === -1 || bottom === -1 || right === -1) {\n return;\n }\n\n const topLeft = getCellRectPositions(sheet, { y: top, x: left });\n const bottomRight = getCellRectPositions(sheet, { y: bottom, x: right });\n\n const x1 = topLeft.left - scrollLeft;\n const y1 = topLeft.top - scrollTop;\n const x2 = bottomRight.right - scrollLeft;\n const y2 = bottomRight.bottom - scrollTop;\n\n // Quick reject if entirely off-screen\n if (x2 < 0 || x1 > viewW || y2 < 0 || y1 > viewH) {\n return;\n }\n\n drawRect(ctx, x1, y1, x2 - x1, y2 - y1, color, lineWidth, dashPattern, fillColor);\n};\n\nexport const CellStateOverlay: FC<Props> = ({ refs = {} }) => {\n const { store } = useContext(Context);\n const {\n sheetReactive,\n tabularRef,\n choosing,\n selectingZone,\n matchingCells,\n matchingCellIndex,\n autofillDraggingTo,\n topHeaderSelecting,\n leftHeaderSelecting,\n mode,\n dragging,\n } = store;\n const sheet = sheetReactive.current;\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const rafIdRef = useRef<number>(0);\n const storeRef = useRef(store);\n storeRef.current = store;\n\n const drawCanvas = useCallback(() => {\n if (!sheet || !tabularRef.current || !canvasRef.current) {\n return;\n }\n\n const canvas = canvasRef.current;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return;\n }\n\n const container = tabularRef.current;\n const dpr = window.devicePixelRatio || 1;\n const w = container.clientWidth;\n const h = container.clientHeight;\n\n // Resize canvas to viewport\n if (canvas.width !== w * dpr || canvas.height !== h * dpr) {\n canvas.style.width = `${w}px`;\n canvas.style.height = `${h}px`;\n canvas.width = w * dpr;\n canvas.height = h * dpr;\n }\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, w, h);\n\n const { registry } = sheet;\n const scrollTop = container.scrollTop;\n const scrollLeft = container.scrollLeft;\n const headerW = sheet.headerWidth;\n const headerH = sheet.headerHeight;\n\n // Clip cell-area drawing to exclude header region\n ctx.save();\n ctx.beginPath();\n ctx.rect(headerW, headerH, w - headerW, h - headerH);\n ctx.clip();\n\n // 1. Selecting zone (border + fill)\n const selectingArea = zoneToArea(selectingZone);\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, selectingArea, COLOR_SELECTED, 1, [], SELECTING_FILL);\n\n // 2. Autofill dragging\n if (autofillDraggingTo) {\n const autofill = new Autofill(storeRef.current, autofillDraggingTo);\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, autofill.wholeArea, COLOR_AUTOFILL, 1, [5, 5]);\n }\n\n // 3. Choosing (pointed cell)\n {\n const { y, x } = choosing;\n if (y !== -1 && x !== -1) {\n const pos = getCellRectPositions(sheet, { y, x });\n const vx = pos.left - scrollLeft;\n const vy = pos.top - scrollTop;\n drawRect(ctx, vx, vy, pos.width, pos.height, COLOR_POINTED, 2, []);\n }\n }\n\n // 4. Copying/Cutting zone\n const { copyingSheetId, copyingZone, cutting } = registry;\n if (sheet.id === copyingSheetId) {\n const copyingArea = zoneToArea(copyingZone);\n const color = cutting ? COLOR_CUTTING : COLOR_COPYING;\n const dashPattern = cutting ? [4, 4] : [6, 4];\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, copyingArea, color, 2.5, dashPattern);\n }\n\n // 5. Formula references (from palette)\n Object.entries(refs).forEach(([ref, i]) => {\n const palette = COLOR_PALETTE[i % COLOR_PALETTE.length];\n try {\n const refArea = sheet.rangeToArea(ref);\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, refArea, palette, 2, [5, 5]);\n } catch (e) {\n // Invalid reference, skip\n }\n });\n\n // 6. Search matching cells\n matchingCells.forEach((address, index) => {\n const { y, x } = a2p(address);\n const pos = getCellRectPositions(sheet, { y, x });\n const vx = pos.left - scrollLeft;\n const vy = pos.top - scrollTop;\n\n // Skip if off-screen\n if (vx + pos.width < 0 || vx > w || vy + pos.height < 0 || vy > h) {\n return;\n }\n\n const isCurrentMatch = index === matchingCellIndex;\n drawRect(\n ctx,\n vx,\n vy,\n pos.width,\n pos.height,\n isCurrentMatch ? COLOR_SEARCH_MATCHING : 'transparent',\n isCurrentMatch ? 2 : 0,\n [],\n SEARCH_MATCHING_BACKGROUND,\n );\n });\n\n // Restore full canvas for header drawing\n ctx.restore();\n\n // 7. Header highlights (top and left) — draw bottom border for top headers, right border for left headers\n const numCols = sheet.numCols;\n const numRows = sheet.numRows;\n\n // Top headers - draw bottom border and background\n for (let x = 1; x <= numCols; x++) {\n let color: string | null = null;\n let backgroundColor: string | null = null;\n if (between({ start: selectingZone.startX, end: selectingZone.endX }, x)) {\n color = 'rgba(80, 180, 255, 1)';\n backgroundColor = topHeaderSelecting ? 'rgba(128, 128, 128, 0.25)' : 'rgba(0, 119, 255, 0.05)';\n }\n if (choosing.x === x) {\n color = COLOR_POINTED;\n backgroundColor = topHeaderSelecting ? 'rgba(128, 128, 128, 0.45)' : 'rgba(0, 119, 255, 0.15)';\n }\n if (!color) {\n continue;\n }\n\n const pos = getCellRectPositions(sheet, { y: 1, x });\n const left = pos.left - scrollLeft;\n if (left + pos.width < headerW || left > w) {\n continue;\n }\n const drawLeft = Math.max(left, headerW);\n const drawWidth = Math.min(left + pos.width, w) - drawLeft;\n if (drawWidth > 0) {\n if (backgroundColor) {\n fillRect(ctx, drawLeft, 0, drawWidth, headerH, backgroundColor);\n }\n // Draw bottom border of the header\n ctx.strokeStyle = color;\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(drawLeft, headerH + 1);\n ctx.lineTo(drawLeft + drawWidth, headerH + 1);\n ctx.stroke();\n }\n }\n\n // Left headers - draw right border and background\n for (let y = 1; y <= numRows; y++) {\n if (sheet.isRowFiltered(y)) {\n continue;\n }\n let color: string | null = null;\n let backgroundColor: string | null = null;\n if (between({ start: selectingZone.startY, end: selectingZone.endY }, y)) {\n color = 'rgba(80, 180, 255, 1)';\n backgroundColor = leftHeaderSelecting ? 'rgba(128, 128, 128, 0.25)' : 'rgba(0, 119, 255, 0.05)';\n }\n if (choosing.y === y) {\n color = COLOR_POINTED;\n backgroundColor = leftHeaderSelecting ? 'rgba(128, 128, 128, 0.45)' : 'rgba(0, 119, 255, 0.15)';\n }\n if (!color) {\n continue;\n }\n\n const pos = getCellRectPositions(sheet, { y, x: 1 });\n const top = pos.top - scrollTop;\n if (top + pos.height < headerH || top > h) {\n continue;\n }\n const drawTop = Math.max(top, headerH);\n const drawHeight = Math.min(top + pos.height, h) - drawTop;\n if (drawHeight > 0) {\n if (backgroundColor) {\n fillRect(ctx, 0, drawTop, headerW, drawHeight, backgroundColor);\n }\n // Draw right border of the header\n ctx.strokeStyle = color;\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(headerW + 1, drawTop);\n ctx.lineTo(headerW + 1, drawTop + drawHeight);\n ctx.stroke();\n }\n }\n }, [\n sheet,\n tabularRef,\n choosing,\n selectingZone,\n matchingCells,\n matchingCellIndex,\n autofillDraggingTo,\n topHeaderSelecting,\n leftHeaderSelecting,\n mode,\n dragging,\n refs,\n ]);\n\n // Schedule a draw on the next animation frame (for state changes)\n const scheduleDrawCanvas = useCallback(() => {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = requestAnimationFrame(drawCanvas);\n }, [drawCanvas]);\n\n // Draw synchronously on scroll to avoid 1-frame lag\n const handleScroll = useCallback(() => {\n drawCanvas();\n }, [drawCanvas]);\n\n useEffect(() => {\n scheduleDrawCanvas();\n return () => cancelAnimationFrame(rafIdRef.current);\n }, [scheduleDrawCanvas]);\n\n useEffect(() => {\n const container = tabularRef.current;\n if (!container) {\n return;\n }\n container.addEventListener('scroll', handleScroll);\n return () => {\n container.removeEventListener('scroll', handleScroll);\n };\n }, [tabularRef, handleScroll]);\n\n return (\n <div\n style={{\n position: 'sticky',\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n overflow: 'visible',\n pointerEvents: 'none',\n zIndex: 10,\n }}\n >\n <canvas\n ref={canvasRef}\n className=\"gs-cell-state-overlay\"\n style={{\n pointerEvents: 'none',\n display: 'block',\n }}\n />\n </div>\n );\n};\n","import { useEffect, useContext, useState, useCallback } from 'react';\n\nimport { Cell } from './Cell';\nimport { HeaderCellTop } from './HeaderCellTop';\nimport { HeaderCellLeft } from './HeaderCellLeft';\nimport { CellStateOverlay } from './CellStateOverlay';\n\nimport { Context } from '../store';\nimport { choose, select, setContextMenuPosition } from '../store/actions';\n\nimport type { RefPaletteType, Virtualization } from '../types';\nimport { virtualize } from '@gridsheet/core';\nimport { p2a, stripAddressAbsolute } from '@gridsheet/core';\nimport { Lexer, stripSheetName } from '@gridsheet/core';\nimport { ScrollHandle } from './ScrollHandle';\nimport { preventSafariBounce } from '@gridsheet/core';\n\nexport const Tabular = () => {\n const [palette, setPalette] = useState<RefPaletteType>({});\n const { store, dispatch } = useContext(Context);\n const {\n sheetReactive,\n choosing,\n editingAddress,\n tabularRef,\n mainRef,\n sheetWidth,\n sheetHeight,\n inputting,\n leftHeaderSelecting,\n topHeaderSelecting,\n contextMenu,\n } = store;\n const sheet = sheetReactive.current;\n\n const [virtualized, setVirtualized] = useState<Virtualization | null>(null);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleScroll = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n if (sheet) {\n setVirtualized(virtualize(sheet, e.currentTarget));\n }\n },\n [sheetReactive],\n );\n\n const handleSelectAllClick = useCallback(() => {\n if (!sheet) {\n return;\n }\n dispatch(choose({ y: -1, x: -1 }));\n requestAnimationFrame(() => {\n dispatch(choose({ y: 1, x: 1 }));\n dispatch(\n select({\n startY: 1,\n startX: 1,\n endY: sheet.numRows,\n endX: sheet.numCols,\n }),\n );\n });\n }, [sheetReactive]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n const formulaEditing = editingAddress && inputting.startsWith('=');\n if (!formulaEditing) {\n setPalette({});\n sheet.registry.paletteBySheetName = {};\n return;\n }\n const palette: RefPaletteType = {};\n const paletteBySheetName: { [sheetName: string]: RefPaletteType } = {};\n const lexer = new Lexer(inputting.substring(1));\n lexer.tokenize();\n\n let i = 0;\n for (const token of lexer.tokens) {\n if (token.type === 'REF' || token.type === 'RANGE') {\n const normalizedRef = stripAddressAbsolute(token.stringify());\n const splitterIndex = normalizedRef.indexOf('!');\n if (splitterIndex !== -1) {\n const sheetName = normalizedRef.substring(0, splitterIndex);\n const ref = normalizedRef.substring(splitterIndex + 1);\n const stripped = stripSheetName(sheetName);\n const upperRef = ref.toUpperCase();\n if (paletteBySheetName[stripped] == null) {\n paletteBySheetName[stripped] = {};\n }\n if (paletteBySheetName[stripped][upperRef] == null) {\n paletteBySheetName[stripped][upperRef] = i++;\n }\n } else {\n const upperRef = normalizedRef.toUpperCase();\n if (palette[upperRef] == null) {\n palette[upperRef] = i++;\n }\n }\n }\n }\n setPalette(palette);\n sheet.registry.paletteBySheetName = paletteBySheetName;\n }, [store.inputting, store.editingAddress, sheetReactive]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n sheet.registry.choosingAddress = p2a(choosing);\n sheet.registry.choosingSheetId = sheet.id;\n }, [choosing]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n setVirtualized(virtualize(sheet, tabularRef.current));\n }, [tabularRef.current, sheetReactive, mainRef.current?.clientHeight, mainRef.current?.clientWidth]);\n\n useEffect(() => {\n const el = tabularRef.current;\n if (!el) {\n return;\n }\n return preventSafariBounce(el);\n }, [sheetReactive]);\n\n const mergedRefs: RefPaletteType = {\n ...palette,\n ...(sheet ? sheet.registry.paletteBySheetName[sheet.name] : {}),\n };\n\n if (!sheet || !sheet.registry.ready) {\n return null;\n }\n\n return (\n <>\n <div\n className=\"gs-tabular\"\n style={{\n width: sheetWidth === -1 ? undefined : sheetWidth,\n height: sheetHeight === -1 ? undefined : sheetHeight,\n }}\n ref={tabularRef}\n onMouseMove={handleMouseMove}\n onScroll={handleScroll}\n >\n <div\n className={'gs-tabular-inner'}\n style={{\n width: sheet.totalWidth + 1,\n height: sheet.totalHeight + 1,\n }}\n >\n <CellStateOverlay refs={mergedRefs} />\n <table className={`gs-table`}>\n <thead className=\"gs-thead\" style={{ height: sheet.headerHeight }}>\n <tr className=\"gs-row\">\n <th\n className=\"gs-th gs-th-left gs-th-top\"\n style={{ position: 'sticky', width: sheet.headerWidth, height: sheet.headerHeight }}\n onClick={handleSelectAllClick}\n >\n <div className=\"gs-th-inner\">\n <ScrollHandle\n className={leftHeaderSelecting || topHeaderSelecting ? 'gs-hidden' : ''}\n style={{ position: 'absolute' }}\n horizontal={leftHeaderSelecting ? 0 : -1}\n vertical={topHeaderSelecting ? 0 : -1}\n />\n {contextMenu.length > 0 && (\n <button\n className=\"gs-menu-btn gs-corner-menu-btn\"\n title=\"Menu\"\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => {\n e.preventDefault();\n (e.currentTarget as HTMLElement).dataset.pressX = String(e.clientX);\n (e.currentTarget as HTMLElement).dataset.pressY = String(e.clientY);\n }}\n onMouseUp={(e) => {\n e.stopPropagation();\n const btn = e.currentTarget as HTMLElement;\n const pressX = Number(btn.dataset.pressX ?? e.clientX);\n const pressY = Number(btn.dataset.pressY ?? e.clientY);\n const moved = Math.abs(e.clientX - pressX) > 4 || Math.abs(e.clientY - pressY) > 4;\n if (moved) {\n return;\n }\n const rect = btn.getBoundingClientRect();\n dispatch(setContextMenuPosition({ y: rect.bottom, x: rect.left }));\n }}\n >\n ⋮\n </button>\n )}\n </div>\n </th>\n <th\n className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-left\"\n style={{ width: virtualized?.adjuster?.left ?? 1 }}\n ></th>\n {virtualized?.xs?.map?.((x) => <HeaderCellTop x={x} key={x} />)}\n <th\n className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-right\"\n style={{ width: virtualized?.adjuster?.right }}\n ></th>\n </tr>\n </thead>\n\n <tbody className=\"gs-sheet-body-adjuster\">\n <tr className=\"gs-row\">\n <th\n className={`gs-adjuster gs-adjuster-horizontal gs-adjuster-vertical`}\n style={{ height: virtualized?.adjuster?.top ?? 1 }}\n ></th>\n <td className=\"gs-adjuster gs-adjuster-vertical\"></td>\n {virtualized?.xs?.map((x) => <td className=\"gs-adjuster gs-adjuster-vertical\" key={x}></td>)}\n <th className={`gs-adjuster gs-adjuster-horizontal gs-adjuster-vertical`}></th>\n </tr>\n </tbody>\n\n <tbody className=\"gs-sheet-body-data\">\n {virtualized?.ys?.map((y) => {\n return (\n <tr key={y} className={`gs-row ${y % 2 === 0 ? 'gs-row-even' : 'gs-row-odd'}`}>\n <HeaderCellLeft y={y} />\n <td className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-left\" />\n {virtualized?.xs?.map((x) => <Cell key={x} y={y} x={x} />)}\n <td className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-right\" />\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </>\n );\n};\n","import type { KeyboardEvent } from 'react';\nimport React, { useCallback, useEffect, useRef, useState, useContext } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FunctionGuide } from './FunctionGuide';\nimport { EditorOptions } from './EditorOptions';\nimport { Context } from '../store';\nimport { p2a, a2p } from '@gridsheet/core';\nimport { setEditingAddress, setInputting, setEditorHovering, walk, write, updateSheet } from '../store/actions';\nimport { operations as prevention } from '@gridsheet/core';\nimport { handleFormulaQuoteAutoClose, insertTextAtCursor, isFocus } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { editorStyle } from './Editor';\nimport { ScrollHandle } from './ScrollHandle';\nimport { useAutocomplete } from './useAutocomplete';\n\ntype FormulaBarProps = {\n ready: boolean;\n};\n\nexport const FormulaBar = ({ ready }: FormulaBarProps) => {\n const { store, dispatch } = useContext(Context);\n const [before, setBefore] = useState('');\n const [selectionStart, setSelectionStart] = useState(0);\n const [isFocused, setIsFocused] = useState(false);\n const {\n choosing,\n selectingZone,\n editorRef,\n largeEditorRef,\n sheetReactive: sheetRef,\n inputting,\n editingAddress: editingCell,\n dragging,\n } = store;\n const sheet = sheetRef.current;\n const hlRef = useRef<HTMLDivElement | null>(null);\n\n const address = choosing.x === -1 ? '' : p2a(choosing);\n const cell = sheet?.getCell(choosing, { resolution: 'SYSTEM' });\n const spilledFromAddress = sheet?.getSystem(choosing)?.spilledFrom;\n const originPoint = spilledFromAddress ? a2p(spilledFromAddress) : undefined;\n const originAddress = originPoint != null ? p2a(originPoint) : undefined;\n useEffect(() => {\n if (!sheet) {\n return;\n }\n let value = sheet.getCell(choosing, { resolution: 'SYSTEM' })?.value ?? '';\n // debug to remove this line\n value = sheet.getSerializedValue({ point: choosing, cell: { ...cell, value }, resolution: 'RAW' });\n largeEditorRef.current!.value = value;\n setBefore(value as string);\n }, [address, sheet]);\n\n const writeCell = useCallback(\n (value: string) => {\n if (before !== value) {\n dispatch(write({ value }));\n }\n dispatch(setEditingAddress(''));\n focus(editorRef.current);\n },\n [before],\n );\n\n useEffect(() => {\n const observer = new ResizeObserver((entries) => {\n entries.forEach(updateScroll);\n });\n if (largeEditorRef.current) {\n observer.observe(largeEditorRef.current);\n }\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const policy = sheet?.getPolicy(choosing);\n const optionsAll = policy?.getSelectOptions() || [];\n\n const {\n filteredOptions,\n selected,\n setSelected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n isFormula,\n activeFunctionHelp,\n activeArgIndex,\n } = useAutocomplete({\n inputting,\n selectionStart,\n optionsAll,\n functions: sheet?.registry.functions,\n });\n\n const largeInput = largeEditorRef.current;\n\n const handleInput = useCallback((e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n dispatch(setInputting(e.currentTarget.value));\n setSelectionStart(e.currentTarget.selectionStart);\n }, []);\n\n const handleSelect = useCallback((e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n setSelectionStart(e.currentTarget.selectionStart);\n }, []);\n\n const updateScroll = useCallback(() => {\n if (!hlRef.current || !largeEditorRef.current) {\n return;\n }\n hlRef.current.style.height = `${largeEditorRef.current.clientHeight}px`;\n hlRef.current.scrollLeft = largeEditorRef.current.scrollLeft;\n hlRef.current.scrollTop = largeEditorRef.current.scrollTop;\n }, []);\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n if (!largeInput || !sheet) {\n return;\n }\n setIsFocused(true);\n dispatch(setEditingAddress(address));\n sheet.registry.lastFocused = e.currentTarget;\n },\n [largeInput, address, sheet],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n if (e.currentTarget.value!.startsWith('=')) {\n return true;\n } else {\n if (editingCell) {\n writeCell(e.currentTarget.value);\n }\n }\n },\n [editingCell, writeCell],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.ctrlKey || !sheet) {\n return true;\n }\n const input = e.currentTarget;\n\n // Auto-close double quotes in formula mode\n if (handleFormulaQuoteAutoClose(e, inputting)) {\n dispatch(setInputting(input.value));\n return false;\n }\n\n switch (e.key) {\n case 'Tab': // TAB\n e.preventDefault();\n if (filteredOptions.length) {\n const option = filteredOptions[selected];\n const isFunc = option?.isFunction;\n\n if (isFunc) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n dispatch(setInputting(newValue));\n setTimeout(() => {\n if (largeEditorRef.current) {\n focus(largeEditorRef.current);\n largeEditorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n return false;\n } else {\n // ... regular completion ...\n const t = sheet.update({ diff: { [address]: { value: option.value } }, partial: true });\n dispatch(updateSheet(t.clone()));\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n }\n break;\n case 'ArrowUp':\n if (handleArrowUp(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'ArrowDown':\n if (handleArrowDown(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'Enter': {\n if (filteredOptions.length) {\n const option = filteredOptions[selected];\n if (option?.isFunction) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n dispatch(setInputting(newValue));\n setTimeout(() => {\n if (largeEditorRef.current) {\n focus(largeEditorRef.current);\n largeEditorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n e.preventDefault();\n return false;\n }\n }\n\n if (e.altKey) {\n insertTextAtCursor(input, '\\n');\n } else {\n writeCell(input.value);\n dispatch(setInputting(''));\n dispatch(\n walk({\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 1,\n deltaX: 0,\n }),\n );\n e.preventDefault();\n return false;\n }\n break;\n }\n case 'Escape': {\n input.value = before;\n dispatch(setInputting(before));\n dispatch(setEditingAddress(''));\n e.preventDefault();\n focus(editorRef.current);\n\n break;\n }\n case 'a': // A\n if (e.ctrlKey || e.metaKey) {\n return true;\n }\n case 'c': // C\n if (e.ctrlKey || e.metaKey) {\n return true;\n }\n break;\n case 'v': // V\n if (e.ctrlKey || e.metaKey) {\n return true;\n }\n break;\n }\n\n const cell = sheet.getCell(choosing, { resolution: 'SYSTEM' });\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n console.warn('This cell is protected from writing.');\n e.preventDefault();\n }\n updateScroll();\n return false;\n },\n [\n sheet,\n choosing,\n address,\n before,\n writeCell,\n updateScroll,\n filteredOptions,\n selected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n inputting,\n ],\n );\n\n const handleOptionMouseDown = useCallback(\n (e: React.MouseEvent, i: number) => {\n e.preventDefault();\n e.stopPropagation();\n const option = filteredOptions[i];\n if (option.isFunction) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n writeCell(newValue);\n dispatch(setInputting(newValue));\n setTimeout(() => {\n if (largeEditorRef.current) {\n focus(largeEditorRef.current);\n largeEditorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n }\n },\n [filteredOptions, replaceWithOption, writeCell, dispatch],\n );\n\n const style: React.CSSProperties = ready ? {} : { visibility: 'hidden' };\n if (!sheet) {\n return (\n <label className=\"gs-formula-bar gs-hidden\" style={style}>\n <div className=\"gs-selecting-address\"></div>\n <div className=\"gs-fx\">Fx</div>\n <div className=\"gs-formula-bar-editor-inner\">\n <textarea />\n </div>\n </label>\n );\n }\n const renderOverlays = () => {\n if (!isFocused || typeof document === 'undefined') {\n return null;\n }\n if (largeEditorRef.current !== document.activeElement) {\n return null;\n }\n\n const rect = largeEditorRef.current?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n\n const top = rect.bottom;\n const left = rect.left;\n\n return createPortal(\n <>\n {activeFunctionHelp &&\n filteredOptions.length === 0 &&\n (!selectingZone || (selectingZone.endY === -1 && selectingZone.endX === -1)) && (\n <FunctionGuide\n activeFunctionGuide={activeFunctionHelp}\n activeArgIndex={activeArgIndex}\n top={top}\n left={left}\n />\n )}\n {filteredOptions.length > 0 && choosing.x !== -1 && (\n <EditorOptions\n filteredOptions={filteredOptions}\n top={top}\n left={left}\n selected={selected}\n onOptionMouseDown={handleOptionMouseDown}\n />\n )}\n </>,\n document.body,\n );\n };\n\n return (\n <div\n className=\"gs-formula-bar\"\n data-sheet-id={store.sheetId}\n data-spill={originAddress != null ? 'true' : undefined}\n style={style}\n >\n <ScrollHandle style={{ position: 'absolute', left: 0, top: 0, zIndex: 2 }} vertical={-1} />\n <div className=\"gs-selecting-address\">{originAddress != null ? originAddress : address}</div>\n <div className=\"gs-fx\">Fx</div>\n <div className=\"gs-formula-bar-editor-inner\">\n <div\n className=\"gs-editor-hl\"\n ref={hlRef}\n style={{\n height: largeEditorRef.current?.clientHeight,\n width: '100%',\n }}\n >\n {(cell?.formulaEnabled ?? true) ? editorStyle(inputting) : inputting}\n </div>\n <textarea\n name=\"gs-formula-bar-editor\"\n data-sheet-id={store.sheetId}\n data-size=\"large\"\n rows={1}\n spellCheck={false}\n ref={largeEditorRef}\n value={inputting}\n // Spilled cells must not be edited from the FormulaBar — input here\n // would modify `inputting` one character at a time (via onInput) even\n // though the underlying cell cannot be written to.\n readOnly={originAddress != null}\n onInput={handleInput}\n onFocus={handleFocus}\n onSelect={handleSelect}\n onPaste={(e) => {\n e.stopPropagation();\n }}\n onKeyDown={handleKeyDown}\n onKeyUp={updateScroll}\n onScroll={updateScroll}\n onMouseEnter={(e) => {\n dispatch(setEditorHovering(true));\n }}\n onMouseLeave={(e) => {\n dispatch(setEditorHovering(false));\n }}\n ></textarea>\n {renderOverlays()}\n </div>\n </div>\n );\n};\n","import type { ReactNode, CSSProperties } from 'react';\n\nexport interface IconProps {\n style?: CSSProperties;\n color?: string;\n size?: number;\n}\n\ninterface BaseProps extends IconProps {\n children?: ReactNode;\n}\n\n// https://tabler.io/icons\n\nexport const Base = ({ style, size = 24, children }: BaseProps) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox={`0 0 24 24`}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={style}\n className=\"icon-tabler\"\n >\n {children}\n </svg>\n );\n};\n","import { type IconProps, Base } from './Base';\n\n// https://tabler.io/icons\n\nexport const SearchIcon = ({ style, color = 'none', size = 24 }: IconProps) => {\n return (\n <Base style={style} size={size}>\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill={color} />\n <path d=\"M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0\" fill={color} />\n <path d=\"M21 21l-6 -6\" fill={color} />\n </Base>\n );\n};\n","import { type IconProps, Base } from './Base';\n\n// https://tabler.io/icons\n\nexport const CloseIcon = ({ style, color = 'none', size = 24 }: IconProps) => {\n return (\n <Base style={style} size={size}>\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill={color} />\n <path d=\"M18 6l-12 12\" fill={color} />\n <path d=\"M6 6l12 12\" fill={color} />\n </Base>\n );\n};\n","import { useContext, useEffect, useRef, useCallback, useMemo } from 'react';\n\nimport { a2p, x2c, y2r } from '@gridsheet/core';\nimport { isZoneNotSelected } from '@gridsheet/core';\n\nimport { Context } from '../store';\nimport { setSearchQuery, search, setSearchCaseSensitive, setSearchRegex, setSearchRange } from '../store/actions';\nimport { smartScroll } from '@gridsheet/core';\nimport { SearchIcon } from './svg/SearchIcon';\nimport { CloseIcon } from './svg/CloseIcon';\nimport { focus } from '@gridsheet/core';\n\nexport const SearchBar = () => {\n const { store, dispatch } = useContext(Context);\n const {\n rootRef,\n editorRef,\n searchInputRef,\n tabularRef,\n searchQuery,\n searchCaseSensitive,\n searchRegex,\n searchRange,\n selectingZone,\n matchingCellIndex,\n matchingCells,\n sheetReactive: sheetRef,\n } = store;\n const sheet = sheetRef.current;\n\n const matchingCell = matchingCells[matchingCellIndex];\n useEffect(() => {\n if (!matchingCell || !sheet) {\n return;\n }\n const point = a2p(matchingCell);\n if (typeof point === 'undefined') {\n return;\n }\n smartScroll(sheet, tabularRef.current, point);\n }, [searchQuery, matchingCellIndex, searchCaseSensitive, searchRegex, sheet, tabularRef]);\n\n const handleProgressClick = useCallback((e: React.MouseEvent) => {\n const input = e.currentTarget.previousSibling as HTMLInputElement;\n input?.nodeName === 'INPUT' && focus(input);\n }, []);\n\n const handleSearchClick = useCallback(() => {\n dispatch(search(1));\n }, []);\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n dispatch(setSearchQuery(e.currentTarget.value));\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Escape') {\n const el = editorRef?.current;\n if (el) {\n focus(el);\n }\n dispatch(setSearchQuery(undefined));\n }\n if (e.key === 'f' && (e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n return false;\n }\n if (e.key === 'Enter') {\n dispatch(search(e.shiftKey ? -1 : 1));\n e.preventDefault();\n return false;\n }\n return true;\n },\n [editorRef],\n );\n\n const handleCaseSensitiveClick = useCallback(() => {\n dispatch(setSearchCaseSensitive(!searchCaseSensitive));\n }, [searchCaseSensitive]);\n\n const handleRegexClick = useCallback(() => {\n dispatch(setSearchRegex(!searchRegex));\n }, [searchRegex]);\n\n const hasSelection = useMemo(() => {\n if (!selectingZone) {\n return false;\n }\n if (isZoneNotSelected(selectingZone)) {\n return false;\n }\n const { startY, startX, endY, endX } = selectingZone;\n return !(startY === endY && startX === endX);\n }, [selectingZone]);\n\n const selectionLabel = useMemo(() => {\n if (!selectingZone || !hasSelection) {\n return '';\n }\n const { startY, startX, endY, endX } = selectingZone;\n const topLeft = `${x2c(Math.min(startX, endX))}${y2r(Math.min(startY, endY))}`;\n const bottomRight = `${x2c(Math.max(startX, endX))}${y2r(Math.max(startY, endY))}`;\n return `${topLeft}:${bottomRight}`;\n }, [selectingZone, hasSelection]);\n\n const handleRangeClick = useCallback(() => {\n if (searchRange) {\n // Clear search range\n dispatch(setSearchRange(undefined));\n } else if (selectingZone && hasSelection) {\n // Set search range to current selection\n const { startY, startX, endY, endX } = selectingZone;\n dispatch(\n setSearchRange({\n startY: Math.min(startY, endY),\n startX: Math.min(startX, endX),\n endY: Math.max(startY, endY),\n endX: Math.max(startX, endX),\n }),\n );\n }\n }, [searchRange, selectingZone, hasSelection]);\n\n const searchRangeLabel = useMemo(() => {\n if (!searchRange) {\n return '';\n }\n const { startY, startX, endY, endX } = searchRange;\n const topLeft = `${x2c(startX)}${y2r(startY)}`;\n const bottomRight = `${x2c(endX)}${y2r(endY)}`;\n return `${topLeft}:${bottomRight}`;\n }, [searchRange]);\n\n const handleCloseClick = useCallback(() => {\n dispatch(setSearchQuery(undefined));\n focus(editorRef.current);\n }, [editorRef]);\n\n if (typeof searchQuery === 'undefined') {\n return null;\n }\n if (rootRef.current === null) {\n return null;\n }\n return (\n <label className={`gs-search-bar ${matchingCells.length > 0 ? 'gs-search-found' : ''}`}>\n <div className=\"gs-search-progress\" onClick={handleProgressClick}>\n {matchingCells.length === 0 ? 0 : matchingCellIndex + 1} / {matchingCells.length}\n </div>\n <div className=\"gs-search-bar-icon\" onClick={handleSearchClick}>\n <SearchIcon style={{ verticalAlign: 'middle', marginLeft: '5px' }} />\n </div>\n <div className=\"gs-search-input-wrapper\">\n <div className=\"gs-search-input-ghost\">\n <span className=\"gs-search-ghost-text\">{searchQuery}</span>\n {searchQuery && <span className=\"gs-search-ghost-hint\"> ↵ Next</span>}\n </div>\n <textarea\n ref={searchInputRef}\n value={searchQuery}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder=\"Search\"\n title=\"Press Enter to next, Shift+Enter to previous\"\n ></textarea>\n </div>\n <div className=\"gs-search-buttons\">\n {searchRange && (\n <div className=\"gs-search-button gs-search-range\">\n <span\n className=\"gs-search-button-on\"\n onClick={handleRangeClick}\n title={`Search range: ${searchRangeLabel}`}\n >\n in {searchRangeLabel}\n </span>\n </div>\n )}\n {!searchRange && hasSelection && (\n <div className=\"gs-search-button gs-search-range\">\n <span onClick={handleRangeClick} title={`Limit to range: ${selectionLabel}`}>\n in {selectionLabel}\n </span>\n </div>\n )}\n <div className=\"gs-search-button gs-search-casesensitive\">\n <span\n className={`${searchCaseSensitive ? 'gs-search-button-on' : ''}`}\n onClick={handleCaseSensitiveClick}\n title={`Case sensitive`}\n >\n Aa\n </span>\n </div>\n <div className=\"gs-search-button gs-search-regex\">\n <span\n className={`${searchRegex ? 'gs-search-button-on' : ''}`}\n onClick={handleRegexClick}\n title={`Regular expression`}\n >\n .*\n </span>\n </div>\n </div>\n <a className=\"gs-search-close\" onClick={handleCloseClick}>\n <CloseIcon style={{ verticalAlign: 'middle' }} />\n </a>\n </label>\n );\n};\n","import { useEffect, useState, useRef, useReducer, createRef } from 'react';\nimport type { CellsByAddressType, SheetHandle, StoreHandle, OptionsType, Props, StoreType } from '../types';\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n HEADER_HEIGHT,\n HEADER_WIDTH,\n SHEET_HEIGHT,\n SHEET_WIDTH,\n DEFAULT_COL_KEY,\n DEFAULT_ROW_KEY,\n} from '@gridsheet/core';\nimport { Context } from '../store';\nimport { reducer as defaultReducer } from '../store/actions';\nimport { Editor } from './Editor';\nimport { StoreObserver } from './StoreObserver';\nimport { Resizer } from './Resizer';\nimport { Emitter } from './Emitter';\nimport { ContextMenu } from './ContextMenu';\nimport { ColumnMenu } from './ColumnMenu';\nimport { RowMenu } from './RowMenu';\nimport { Sheet } from '@gridsheet/core';\nimport { Tabular } from './Tabular';\nimport { getMaxSizesFromCells } from '@gridsheet/core';\nimport { x2c, y2r } from '@gridsheet/core';\nimport { embedStyle } from '@gridsheet/core';\nimport { FormulaBar } from './FormulaBar';\nimport { SearchBar } from './SearchBar';\nimport { useBook } from '../lib/hooks';\nimport { ScrollHandle } from './ScrollHandle';\nimport { defaultContextMenuDescriptors, defaultRowMenuDescriptors, defaultColMenuDescriptors } from '../lib/menu';\n\nexport const createSheetRef = () => createRef<SheetHandle | null>();\nexport const useSheetRef = () => useRef<SheetHandle | null>(null);\nexport const createStoreRef = () => createRef<StoreHandle | null>();\nexport const useStoreRef = () => useRef<StoreHandle | null>(null);\n\nexport function GridSheet({\n initialCells,\n sheetName = '',\n sheetRef: initialSheetRef,\n storeRef: initialStoreRef,\n options = {},\n className,\n style,\n book: initialBook,\n}: Props) {\n const { sheetResize, showFormulaBar = true, mode = 'light' } = options;\n const rootRef = useRef<HTMLDivElement>(null);\n const flashRef = useRef<HTMLDivElement>(null);\n const mainRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLTextAreaElement>(null);\n const editorRef = useRef<HTMLTextAreaElement>(null);\n const largeEditorRef = useRef<HTMLTextAreaElement>(null);\n const tabularRef = useRef<HTMLDivElement>(null);\n\n const internalSheetRef = useSheetRef();\n const sheetRef = initialSheetRef ?? internalSheetRef;\n const internalStoreRef = useStoreRef();\n const storeRef = initialStoreRef ?? internalStoreRef;\n\n const internalBook = useBook({});\n const book = initialBook ?? internalBook;\n const { registry } = book;\n\n const [sheetId] = useState<number>(() => {\n if (sheetName) {\n // Named sheets: use sheetName as stable dedup key to prevent double-increment in Strict Mode.\n if (!registry._componentSheetIds.has(sheetName)) {\n registry._componentSheetIds.set(sheetName, ++registry.sheetHead);\n }\n return registry._componentSheetIds.get(sheetName)!;\n }\n // Unnamed sheets: accept double-increment in Strict Mode (IDs may skip, but remain unique).\n return ++registry.sheetHead;\n });\n\n // Initialize sheetReactive\n const sheetReactive = useRef<Sheet | null>(null);\n\n const [initialState] = useState<StoreType>(() => {\n if (!sheetName) {\n sheetName = `Sheet${sheetId}`;\n console.debug('GridSheet: sheetName is not provided, using default name:', sheetName);\n }\n const { limits, contextMenu, rowMenu, colMenu } = options;\n const sheet = new Sheet({\n limits,\n name: sheetName,\n registry,\n });\n sheet.id = sheetId;\n registry.sheetIdsByName[sheetName] = sheetId;\n\n sheet.initialize(initialCells);\n registry.onInit?.({ sheet });\n\n sheet.setTotalSize();\n sheetReactive.current = sheet;\n\n const store: StoreType = {\n sheetId,\n sheetReactive,\n rootRef,\n flashRef,\n mainRef,\n searchInputRef,\n editorRef,\n largeEditorRef,\n tabularRef,\n choosing: { y: 1, x: 1 },\n inputting: '',\n selectingZone: { startY: 1, startX: 1, endY: -1, endX: -1 },\n autofillDraggingTo: null,\n leftHeaderSelecting: false,\n topHeaderSelecting: false,\n editingAddress: '',\n editorRect: { y: 0, x: 0, height: 0, width: 0 },\n dragging: false,\n sheetHeight: 0,\n sheetWidth: 0,\n entering: false,\n matchingCells: [],\n matchingCellIndex: 0,\n searchCaseSensitive: false,\n searchRegex: false,\n editingOnEnter: true,\n contextMenuPosition: { y: -1, x: -1 },\n contextMenu: contextMenu ?? defaultContextMenuDescriptors,\n rowMenu: rowMenu ?? defaultRowMenuDescriptors,\n colMenu: colMenu ?? defaultColMenuDescriptors,\n resizingPositionY: [-1, -1, -1],\n resizingPositionX: [-1, -1, -1],\n columnMenuState: null,\n rowMenuState: null,\n editorHovering: true,\n mode: 'light',\n };\n return store;\n });\n\n type ReducerWithoutAction<S> = (prevState: S) => S;\n\n const [store, dispatch] = useReducer(\n defaultReducer as unknown as ReducerWithoutAction<StoreType>,\n initialState,\n () => initialState,\n );\n\n useEffect(() => {\n embedStyle();\n }, []);\n\n const [sheetHeight, setSheetHeight] = useState(options?.sheetHeight || estimateSheetHeight(initialCells));\n const [sheetWidth, setSheetWidth] = useState(options?.sheetWidth || estimateSheetWidth(initialCells));\n useEffect(() => {\n const intervalId = window.setInterval(() => {\n setSheetHeight(mainRef.current?.clientHeight || 0);\n setSheetWidth(mainRef.current?.clientWidth || 0);\n }, 1000);\n return () => window.clearInterval(intervalId);\n }, []);\n useEffect(() => {\n if (options.sheetHeight) {\n setSheetHeight(options.sheetHeight);\n }\n }, [options.sheetHeight]);\n useEffect(() => {\n if (options.sheetWidth) {\n setSheetWidth(options.sheetWidth);\n }\n }, [options.sheetWidth]);\n\n return (\n <Context.Provider value={{ store, dispatch }}>\n <div\n className={`gs-root1 ${registry.ready ? 'gs-initialized' : ''}`}\n ref={rootRef}\n data-sheet-name={sheetName}\n data-mode={mode}\n data-rows={store.sheetReactive.current?.numRows ?? 0}\n data-cols={store.sheetReactive.current?.numCols ?? 0}\n >\n <div className=\"gs-flash-overlay\" ref={flashRef} />\n <ScrollHandle style={{ position: 'fixed', top: 0, left: 0 }} />\n <ScrollHandle style={{ position: 'absolute', zIndex: 4, right: 0, top: 0, width: 5 }} horizontal={1} />\n <ScrollHandle style={{ position: 'absolute', zIndex: 4, left: 0, bottom: 0, height: 5 }} vertical={1} />\n\n {typeof store.searchQuery === 'undefined' ? (\n showFormulaBar && <FormulaBar ready={registry.ready} />\n ) : (\n <SearchBar />\n )}\n <div\n className={`gs-main ${className || ''}`}\n ref={mainRef}\n style={{\n //width: '100%',\n maxWidth: (store.sheetReactive.current?.totalWidth || 0) + 2,\n maxHeight: (store.sheetReactive.current?.fullHeight || 0) + 2,\n overflow: 'auto',\n resize: sheetResize,\n ...style,\n }}\n >\n <Editor mode={mode} />\n <Tabular />\n <StoreObserver {...{ ...options, sheetHeight, sheetWidth, sheetName, sheetRef, storeRef }} />\n <ContextMenu />\n <ColumnMenu />\n <RowMenu />\n <Resizer />\n <Emitter />\n </div>\n </div>\n </Context.Provider>\n );\n}\n\nconst estimateSheetHeight = (initialCells: CellsByAddressType) => {\n const auto = getMaxSizesFromCells(initialCells);\n let estimatedHeight = initialCells[0]?.height ?? HEADER_HEIGHT;\n for (let y = 1; y <= auto.numRows; y++) {\n const row = y2r(y);\n const height =\n initialCells?.[row]?.height ||\n initialCells?.['0' + row]?.height ||\n initialCells?.[DEFAULT_ROW_KEY]?.height ||\n initialCells?.default?.height ||\n DEFAULT_HEIGHT;\n if (estimatedHeight + height > SHEET_HEIGHT) {\n return SHEET_HEIGHT;\n }\n estimatedHeight += height;\n }\n return estimatedHeight + 3;\n};\n\nconst estimateSheetWidth = (initialCells: CellsByAddressType) => {\n const auto = getMaxSizesFromCells(initialCells);\n let estimatedWidth = initialCells[0]?.width ?? HEADER_WIDTH;\n for (let x = 1; x <= auto.numCols; x++) {\n const col = x2c(x);\n const width =\n initialCells?.[col]?.width ||\n initialCells?.[col + '0']?.width ||\n initialCells?.[DEFAULT_COL_KEY]?.width ||\n initialCells?.default?.width ||\n DEFAULT_WIDTH;\n if (estimatedWidth + width > SHEET_WIDTH) {\n return SHEET_WIDTH;\n }\n estimatedWidth += width;\n }\n return estimatedWidth + 3;\n};\n","import type { PolicyMixinType, RenderProps } from '@gridsheet/core';\n\nexport const CheckboxPolicyMixin: PolicyMixinType = {\n renderBool({ value, apply, sheet, point }: RenderProps<boolean>): any {\n return (\n <input\n type=\"checkbox\"\n checked={value}\n onChange={(e) => {\n if (apply) {\n apply(sheet.write({ point, value: e.currentTarget.checked.toString() }));\n }\n e.currentTarget.blur();\n }}\n />\n );\n },\n};\n","import type { CSSProperties } from 'react';\n\ntype BorderStyleValue = string;\n\ninterface BorderOptions {\n all?: BorderStyleValue;\n top?: BorderStyleValue;\n right?: BorderStyleValue;\n bottom?: BorderStyleValue;\n left?: BorderStyleValue;\n}\n\nexport function makeBorder(options: BorderOptions): CSSProperties {\n const result: CSSProperties = {};\n const all = options.all;\n if (options.top ?? all) {\n result.borderTop = options.top ?? all;\n }\n if (options.right ?? all) {\n result.borderRight = options.right ?? all;\n }\n if (options.bottom ?? all) {\n result.borderBottom = options.bottom ?? all;\n }\n if (options.left ?? all) {\n result.borderLeft = options.left ?? all;\n }\n return result;\n}\n"],"names":["sheet","activeFunctionHelp","activeArgIndex","h","document","currentLine","_a","top","left","shiftKey","_b","prevention","setStore","store","x","y","endY","height","endX","width","_insertRowsAbove","_insertRowsBelow","_removeRows","_insertColsLeft","_insertColsRight","_removeCols","_setStore","colCell","currentSheet","visible","palette","cell","defaultReducer"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../react-core/src/store/index.ts","../../react-core/src/components/FunctionGuide.tsx","../../react-core/src/components/EditorOptions.tsx","../../react-core/src/lib/clipboard.ts","../../react-core/src/components/useAutocomplete.ts","../../react-core/src/components/Fixed.tsx","../../react-core/src/lib/paste.ts","../../react-core/src/components/Editor.tsx","../../react-core/src/components/PluginBase.tsx","../../react-core/src/components/StoreObserver.tsx","../../react-core/src/components/Resizer.tsx","../../react-core/src/components/Emitter.tsx","../../react-core/src/store/applyers.ts","../../react-core/src/lib/menu.ts","../../react-core/src/components/MenuItem.tsx","../../react-core/src/components/ContextMenu.tsx","../../react-core/src/components/ColumnMenuFilterSection.tsx","../../react-core/src/components/ColumnMenuSortSection.tsx","../../react-core/src/components/ColumnMenuLabelSection.tsx","../../react-core/src/components/ColumnMenu.tsx","../../react-core/src/components/RowMenu.tsx","../../react-core/src/lib/events.ts","../../react-core/src/components/Cell.tsx","../../react-core/src/components/ScrollHandle.tsx","../../react-core/src/components/HeaderCellTop.tsx","../../react-core/src/components/HeaderCellLeft.tsx","../../react-core/src/components/CellStateOverlay.tsx","../../react-core/src/components/Tabular.tsx","../../react-core/src/components/FormulaBar.tsx","../../react-core/src/components/svg/Base.tsx","../../react-core/src/components/svg/SearchIcon.tsx","../../react-core/src/components/svg/CloseIcon.tsx","../../react-core/src/components/SearchBar.tsx","../../react-core/src/components/GridSheet.tsx","../../react-core/src/policy/checkbox.tsx","../../react-core/src/lib/style.ts"],"sourcesContent":["import { createContext } from 'react';\nimport { StoreType } from '../types';\n\nexport type Dispatcher = React.Dispatch<{\n type: number;\n value: any;\n}>;\n\nexport const Context = createContext(\n {} as {\n store: StoreType;\n dispatch: Dispatcher;\n },\n);\n","import React, { useContext, useLayoutEffect, useRef } from 'react';\nimport type { FunctionHelp } from '@gridsheet/core';\nimport type { AutocompleteOption } from '@gridsheet/core';\nimport { Context } from '../store';\nimport { calcSideStyle, clampPopup } from '@gridsheet/core';\n\ntype OptionWithGuide = AutocompleteOption & {\n isFunction?: boolean;\n example?: string;\n category?: string;\n description?: string;\n defs?: any[];\n};\n\nexport interface FunctionGuideProps {\n // Option Help Mode (renders in EditorOptions)\n option?: OptionWithGuide;\n\n // Active Function Highlight Mode (renders floating near cursor)\n activeFunctionGuide?: FunctionHelp;\n activeArgIndex?: number;\n top?: number;\n left?: number;\n}\n\nexport const FunctionGuide: React.FC<FunctionGuideProps> = ({\n option,\n activeFunctionGuide,\n activeArgIndex = 0,\n top,\n left,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const guide1Ref = useRef<HTMLDivElement>(null);\n const { store } = useContext(Context);\n // Hide the active help when not hovering over the editor, to prevent it from blocking clicks on other options.\n const isHidden = !store.editorHovering;\n\n useLayoutEffect(() => {\n const el = guide1Ref.current;\n if (!el) {\n return;\n }\n calcSideStyle(el);\n });\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el || left === undefined) {\n return;\n }\n clampPopup(el);\n });\n\n if (option) {\n return (\n <div\n ref={guide1Ref}\n className=\"gs-fn-guide1\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n {option.category && option.isFunction && (\n <span className={`gs-fn-guide-category gs-fn-guide-category-${option.category}`}>{option.category}</span>\n )}\n {option.tooltip && (\n <div className=\"gs-fn-guide1-tooltip\">\n {typeof option.tooltip === 'function'\n ? React.createElement(option.tooltip as any, { value: option.value })\n : option.tooltip}\n </div>\n )}\n {option.isFunction && (\n <>\n <div className=\"gs-fn-guide1-example\">{option.example}</div>\n {option.description && (\n <div className=\"gs-fn-guide1-desc\" style={{ whiteSpace: 'pre-line' }}>\n {option.description}\n </div>\n )}\n {option.defs && option.defs.length > 0 && (\n <div className=\"gs-fn-guide1-args\">\n {option.defs.map((arg: any, j: number) => (\n <div key={j} className=\"gs-fn-guide1-arg\">\n <span className=\"gs-fn-guide1-arg-name\">{arg.name}</span>\n {arg.optional && <span className=\"gs-fn-guide1-arg-opt\"> (optional)</span>}\n {arg.variadic && <span className=\"gs-fn-guide1-arg-iter\">...</span>}\n <code className=\"gs-fn-guide1-arg-type\">{arg.acceptedTypes?.join(' | ') || 'any'}</code>\n <span className=\"gs-fn-guide1-arg-desc\"> — {arg.description}</span>\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </div>\n );\n }\n\n if (activeFunctionGuide) {\n return (\n <div\n ref={ref}\n className={`gs-fn-guide2 ${isHidden ? 'gs-fn-guide2-hidden' : ''}`}\n style={top !== undefined && left !== undefined ? { top: top + 4, left } : undefined}\n >\n {activeFunctionGuide.category && (\n <span className={`gs-fn-guide-category gs-fn-guide-category-${activeFunctionGuide.category}`}>\n {activeFunctionGuide.category}\n </span>\n )}\n <div className=\"gs-fn-guide2-name\">{activeFunctionGuide.example}</div>\n <div className=\"gs-fn-guide2-args-inline\">\n {(() => {\n const args = activeFunctionGuide.defs ?? [];\n const numIterable = args.filter((a: any) => a.variadic).length;\n const variadicStart = args.length - numIterable;\n\n return args.map((arg: any, j: number) => {\n let isActive: boolean;\n if (activeArgIndex < variadicStart) {\n // Cursor is on a fixed (non-variadic) argument\n isActive = activeArgIndex === j;\n } else if (numIterable > 0 && j >= variadicStart) {\n // Cursor is in the variadic zone; cycle through the variadic args\n const offset = (activeArgIndex - variadicStart) % numIterable;\n isActive = j === variadicStart + offset;\n } else {\n isActive = false;\n }\n return (\n <React.Fragment key={j}>\n {j > 0 ? ', ' : ''}\n <span className={isActive ? 'gs-active-arg' : ''}>\n {arg.optional ? '[' : ''}\n {arg.name}\n {arg.variadic ? ', ...' : ''}\n {arg.optional ? ']' : ''}\n </span>\n </React.Fragment>\n );\n });\n })()}\n </div>\n {(() => {\n const args = activeFunctionGuide.defs ?? [];\n const numIterable = args.filter((a: any) => a.variadic).length;\n const variadicStart = args.length - numIterable;\n\n let resolvedIndex: number;\n if (activeArgIndex < variadicStart || numIterable === 0) {\n resolvedIndex = Math.min(activeArgIndex, args.length - 1);\n } else {\n const offset = (activeArgIndex - variadicStart) % numIterable;\n resolvedIndex = variadicStart + offset;\n }\n const activeArg = args[resolvedIndex];\n if (!activeArg?.description) {\n return null;\n }\n return (\n <div className=\"gs-fn-guide2-desc\" style={{ marginTop: 8, fontSize: 12, color: '#888' }}>\n <p>\n <strong>{activeArg.name}:</strong>{' '}\n <code className=\"gs-fn-guide2-arg-type\">{activeArg.acceptedTypes?.join(' | ') || 'any'}</code>\n {activeArg.description}\n </p>\n </div>\n );\n })()}\n\n {activeFunctionGuide.description && (\n <div className=\"gs-fn-guide2-desc\" style={{ whiteSpace: 'pre-line' }}>\n {activeFunctionGuide.description}\n </div>\n )}\n </div>\n );\n }\n\n return null;\n};\n","import React, { useRef, useLayoutEffect, useState } from 'react';\nimport { FunctionGuide } from './FunctionGuide';\nimport { clampLeft } from '@gridsheet/core';\n\ninterface EditorOptionsProps {\n filteredOptions: any[];\n top: number;\n left: number;\n selected: number;\n onOptionMouseDown: (e: React.MouseEvent<HTMLLIElement>, i: number) => void;\n}\n\nexport const EditorOptions: React.FC<EditorOptionsProps> = ({\n filteredOptions,\n top,\n left,\n selected,\n onOptionMouseDown,\n}) => {\n const ulRef = useRef<HTMLUListElement>(null);\n const [adjustedLeft, setAdjustedLeft] = useState(left);\n\n useLayoutEffect(() => {\n if (!ulRef.current) {\n return;\n }\n const width = ulRef.current.getBoundingClientRect().width;\n setAdjustedLeft(clampLeft(left, width));\n }, [left, filteredOptions]);\n\n if (filteredOptions.length === 0) {\n return null;\n }\n\n return (\n <ul ref={ulRef} className=\"gs-editor-options\" style={{ top, left: adjustedLeft }}>\n {filteredOptions.map((option, i) => (\n <li\n key={i}\n className={`gs-editor-option ${selected === i ? ' gs-editor-option-selected' : ''}`}\n onMouseDown={(e) => onOptionMouseDown(e, i)}\n >\n <div className=\"gs-editor-option-content\">\n <span>{option.label ?? option.value}</span>\n {selected === i && <span className=\"gs-editor-option-tab\">⇥ Tab</span>}\n </div>\n {(option.isFunction || option.tooltip) && selected === i && <FunctionGuide option={option} />}\n </li>\n ))}\n </ul>\n );\n};\n","import type { StoreType, AreaType, PointType } from '../types';\n\nimport { zoneToArea } from '@gridsheet/core';\nimport type { Sheet, UserSheet } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\n\nexport const clip = (store: StoreType) => {\n const { selectingZone, choosing, editorRef, sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n\n if (!sheet) {\n return { top: 0, left: 0, bottom: 0, right: 0 };\n }\n\n const { y, x } = choosing;\n const selectingArea = zoneToArea(selectingZone);\n let area = selectingArea;\n if (area.left === -1) {\n area = { top: y, left: x, bottom: y, right: x };\n }\n const input = editorRef.current;\n const trimmed = sheet.trim(area);\n const tsv = sheet2csv(trimmed, {\n getter: (sheet, point) => {\n const policy = sheet.getPolicy(point);\n return policy.serializeForClipboard({ point, sheet });\n },\n });\n const html = sheet2html(trimmed, {\n getter: (sheet, point) => {\n const policy = sheet.getPolicy(point);\n return policy.serializeForClipboard({ point, sheet });\n },\n });\n\n if (navigator.clipboard) {\n const tsvBlob = new Blob([tsv], { type: 'text/plain' });\n const htmlBlob = new Blob([html], { type: 'text/html' });\n\n navigator.clipboard.write([\n new ClipboardItem({\n 'text/plain': tsvBlob,\n 'text/html': htmlBlob,\n }),\n ]);\n } else if (input != null) {\n input.value = tsv;\n focus(input);\n input.select();\n document.execCommand('copy');\n input.value = '';\n input.blur();\n }\n return area;\n};\n\nexport type SheetCSVProps = {\n getter?: (sheet: UserSheet, point: PointType) => string;\n filteredRowsIncluded?: boolean;\n trailingEmptyRowsOmitted?: boolean;\n separator?: string;\n newline?: string;\n};\n\nexport const sheet2csv = (\n sheet: UserSheet,\n {\n getter = (sheet, point) => {\n return String(sheet.getCell(point)?.value ?? '');\n },\n filteredRowsIncluded = false,\n trailingEmptyRowsOmitted = false,\n separator = '\\t',\n newline = '\\n',\n }: SheetCSVProps = {},\n): string => {\n const rows: { isEmpty: boolean; line: string }[] = [];\n for (let y = sheet.top; y <= sheet.bottom; y++) {\n if (sheet.isRowFiltered(y) && !filteredRowsIncluded) {\n continue;\n }\n const cols: string[] = [];\n let rowIsEmpty = true;\n for (let x = sheet.left; x <= sheet.right; x++) {\n const point: PointType = { y, x };\n const value = getter(sheet, point);\n if (value !== '') {\n rowIsEmpty = false;\n }\n if (value.indexOf('\\n') !== -1) {\n cols.push(`\"${value.replace(/\"/g, '\"\"')}\"`);\n } else {\n cols.push(value);\n }\n }\n rows.push({ isEmpty: rowIsEmpty, line: cols.join(separator) });\n }\n if (trailingEmptyRowsOmitted) {\n while (rows.length > 0 && rows[rows.length - 1].isEmpty) {\n rows.pop();\n }\n }\n return rows.map((r) => r.line).join(newline);\n};\n\nexport type SheetHTMLProps = {\n getter?: (sheet: UserSheet, point: PointType) => string;\n filteredRowsIncluded?: boolean;\n trailingEmptyRowsOmitted?: boolean;\n};\n\nexport const sheet2html = (\n sheet: UserSheet,\n {\n getter = (sheet, point) => {\n return String(sheet.getCell(point)?.value ?? '');\n },\n filteredRowsIncluded = false,\n trailingEmptyRowsOmitted = false,\n }: SheetHTMLProps = {},\n): string => {\n const rows: { isEmpty: boolean; html: string }[] = [];\n for (let y = sheet.top; y <= sheet.bottom; y++) {\n if (sheet.isRowFiltered(y) && !filteredRowsIncluded) {\n continue;\n }\n const cols: string[] = [];\n let rowIsEmpty = true;\n for (let x = sheet.left; x <= sheet.right; x++) {\n const point: PointType = { y, x };\n const value = getter(sheet, point);\n if (value !== '') {\n rowIsEmpty = false;\n }\n const valueEscaped = value\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n cols.push(`<td>${valueEscaped}</td>`);\n }\n rows.push({ isEmpty: rowIsEmpty, html: `<tr>${cols.join('')}</tr>` });\n }\n if (trailingEmptyRowsOmitted) {\n while (rows.length > 0 && rows[rows.length - 1].isEmpty) {\n rows.pop();\n }\n }\n return `<table>${rows.map((r) => r.html).join('')}</table>`;\n};\n","import { useState, useMemo, useCallback } from 'react';\nimport { getFunctionHelps, type FunctionHelp } from '@gridsheet/core';\nimport type { FunctionMapping } from '@gridsheet/core';\nimport type { AutocompleteOption } from '@gridsheet/core';\nimport { Lexer } from '@gridsheet/core';\n\ntype UseAutocompleteProps = {\n inputting: string;\n selectionStart: number;\n optionsAll: AutocompleteOption[];\n functions?: FunctionMapping;\n};\n\nexport const useAutocomplete = ({ inputting, selectionStart, optionsAll, functions }: UseAutocompleteProps) => {\n const [selected, setSelected] = useState(0);\n\n const { filteredOptions, matchParams, activeFunctionHelp, activeArgIndex } = useMemo(() => {\n const isFormula = inputting.startsWith('=');\n\n let activeFunctionHelp: FunctionHelp | null = null;\n let activeArgIndex: number = 0;\n\n const textBeforeCursor = inputting.slice(0, selectionStart);\n const textAfterCursor = inputting.slice(selectionStart);\n\n // --- Active Argument Context Tracking ---\n if (isFormula && textBeforeCursor.length > 1) {\n try {\n const textToCursor = textBeforeCursor.slice(1); // skip '='\n const lexer = new Lexer(textToCursor);\n lexer.tokenize();\n\n const functionStack: { name: string; argIndex: number; hasWaitComma: boolean }[] = [];\n\n for (let i = 0; i < lexer.tokens.length; i++) {\n const token = lexer.tokens[i];\n if (token.type === 'FUNCTION') {\n const nextToken = lexer.tokens[i + 1];\n if (nextToken?.type === 'OPEN') {\n functionStack.push({ name: token.entity as string, argIndex: 0, hasWaitComma: false });\n i++; // skip OPEN\n } else if (i === lexer.tokens.length - 1) {\n // Function keyword right before cursor but without paren yet!\n // Do nothing special here, autocomplete dropdown will handle it.\n }\n } else if (token.type === 'COMMA') {\n if (functionStack.length > 0) {\n functionStack[functionStack.length - 1].argIndex++;\n functionStack[functionStack.length - 1].hasWaitComma = true;\n }\n } else if (token.type === 'CLOSE') {\n if (functionStack.length > 0) {\n functionStack.pop();\n }\n } else if (token.type !== 'SPACE' && functionStack.length > 0) {\n functionStack[functionStack.length - 1].hasWaitComma = false;\n }\n }\n\n if (functionStack.length > 0) {\n const activeItem = functionStack[functionStack.length - 1];\n const helps = getFunctionHelps(functions);\n activeArgIndex = activeItem.argIndex;\n activeFunctionHelp = helps.find((h: any) => h.name === activeItem.name.toUpperCase()) || null;\n }\n } catch (e) {\n /* ignore parse errors */\n }\n }\n\n const wordBefore = textBeforeCursor.match(/[a-zA-Z0-9_.]+$/)?.[0] || '';\n const wordAfter = textAfterCursor.match(/^[a-zA-Z0-9_.]+/)?.[0] || '';\n\n // For regular cells, we use the whole word as the search target.\n // For formulas, we extract the word under the cursor.\n const currentWord = isFormula ? (wordBefore + wordAfter).toLowerCase() : inputting.toLocaleLowerCase();\n const hasOpenParenAssigned = isFormula && textAfterCursor.slice(wordAfter.length).trimStart().startsWith('(');\n\n let filtered: any[] = [];\n\n let isOnAddress = false;\n if (isFormula) {\n try {\n const fullLexer = new Lexer(inputting.slice(1));\n fullLexer.tokenize();\n let currentIndex = 1; // start after '='\n for (const token of fullLexer.tokens) {\n const tLen = token.length();\n if (selectionStart > currentIndex && selectionStart < currentIndex + tLen) {\n if (['REF', 'RANGE', 'ID', 'ID_RANGE', 'UNREFERENCED'].includes(token.type)) {\n isOnAddress = true;\n }\n // Inside a string literal (VALUE token whose entity is a string)\n if (token.type === 'VALUE' && typeof token.entity === 'string') {\n isOnAddress = true;\n }\n break;\n }\n if (selectionStart === currentIndex || selectionStart === currentIndex + tLen) {\n if (['REF', 'RANGE', 'ID', 'ID_RANGE', 'UNREFERENCED'].includes(token.type)) {\n isOnAddress = true;\n }\n }\n currentIndex += tLen;\n }\n } catch (e) {\n /* ignore parse errors */\n }\n }\n\n if (isFormula && !isOnAddress) {\n // Suggest if we have at least 1 letter, and there isn't already an opening parenthesis attached\n if (currentWord.length > 0 && !hasOpenParenAssigned) {\n filtered = getFunctionHelps(functions)\n .map((help: any) => {\n const keywordLower = help.name.toLowerCase();\n const startsWith = keywordLower.startsWith(currentWord);\n const index = startsWith ? 0 : -1;\n const hasNoArgs = help.defs.length === 0;\n return {\n option: { ...help, value: help.name + (hasNoArgs ? '()' : '('), isFunction: true, label: help.name },\n index,\n startsWith,\n keywordCount: 1,\n keyword: keywordLower,\n };\n })\n .filter(({ startsWith }: { startsWith: boolean }) => startsWith)\n .sort((a: any, b: any) => {\n if (a.startsWith !== b.startsWith) {\n return b.startsWith ? 1 : -1;\n }\n if (a.index !== b.index) {\n return a.index - b.index;\n }\n return a.keyword.localeCompare(b.keyword);\n })\n .map(({ option }: { option: any }) => option);\n }\n } else {\n filtered = optionsAll\n .map((option) => {\n const keywords = option.keywords ?? [String(option.value)];\n let bestMatch = { index: -1, startsWith: false, keyword: '' };\n\n for (const keyword of keywords) {\n const keywordLower = keyword.toLowerCase();\n const index = keywordLower.indexOf(currentWord);\n if (index !== -1) {\n const startsWith = keywordLower.startsWith(currentWord);\n if (\n bestMatch.index === -1 ||\n index < bestMatch.index ||\n (index === bestMatch.index && startsWith && !bestMatch.startsWith)\n ) {\n bestMatch = { index, startsWith, keyword };\n }\n }\n }\n\n return {\n option,\n ...bestMatch,\n keywordCount: keywords.length,\n };\n })\n .filter(({ index }) => index !== -1)\n .sort((a, b) => {\n if (a.startsWith !== b.startsWith) {\n return b.startsWith ? 1 : -1;\n }\n if (a.index !== b.index) {\n return a.index - b.index;\n }\n if (a.keywordCount !== b.keywordCount) {\n return b.keywordCount - a.keywordCount;\n }\n return a.keyword.localeCompare(b.keyword);\n })\n .map(({ option }) => option);\n }\n\n return {\n filteredOptions: filtered,\n matchParams: {\n isFormula,\n currentWord,\n matchLengthBefore: wordBefore.length,\n matchLengthAfter: wordAfter.length,\n },\n activeFunctionHelp,\n activeArgIndex,\n };\n }, [inputting, selectionStart, optionsAll, functions]);\n\n useMemo(() => {\n if (selected >= filteredOptions.length) {\n setSelected(0);\n }\n }, [filteredOptions.length, selected]);\n\n const replaceWithOption = useCallback(\n (option: any) => {\n if (!option) {\n return { value: inputting, selectionStart };\n }\n\n if (matchParams.isFormula) {\n const beforeMatch = inputting.slice(0, selectionStart - matchParams.matchLengthBefore);\n const afterMatch = inputting.slice(selectionStart + matchParams.matchLengthAfter);\n const newValue = beforeMatch + option.value + afterMatch;\n return { value: newValue, selectionStart: beforeMatch.length + option.value.length };\n } else {\n return { value: String(option.value), selectionStart: String(option.value).length };\n }\n },\n [inputting, selectionStart, matchParams],\n );\n\n const handleArrowUp = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (filteredOptions.length > 1) {\n setSelected((s) => (s <= 0 ? filteredOptions.length - 1 : s - 1));\n e.preventDefault();\n return true;\n }\n return false;\n },\n [filteredOptions.length],\n );\n\n const handleArrowDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (filteredOptions.length > 1) {\n setSelected((s) => (s >= filteredOptions.length - 1 ? 0 : s + 1));\n e.preventDefault();\n return true;\n }\n return false;\n },\n [filteredOptions.length],\n );\n\n return {\n filteredOptions,\n selected,\n setSelected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n isFormula: matchParams.isFormula,\n activeFunctionHelp,\n activeArgIndex,\n };\n};\n","import type { CSSProperties, FC, ReactNode } from 'react';\nimport { useBrowser } from '../lib/hooks';\nimport { createPortal } from 'react-dom';\n\ntype Props = {\n className?: string;\n style?: CSSProperties;\n children: ReactNode;\n [attr: string]: any;\n};\n\nexport const Fixed: FC<Props> = ({ children, style, className = '', ...attrs }) => {\n const { document } = useBrowser();\n if (document == null) {\n return null;\n }\n return createPortal(\n <div {...attrs} className={`gs-fixed ${className}`} style={style}>\n {children}\n </div>,\n document.body,\n );\n};\n","import React, { type CSSProperties } from 'react';\nimport type { RawCellType } from '../types';\nexport const parseHTML = (html: string, onlyValue = false): RawCellType[][] => {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const results: RawCellType[][] = [];\n\n const processSheet = (sheet: HTMLTableElement) => {\n const spans = new Set<string>();\n const rows = sheet.querySelectorAll('tr,caption');\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n if (row.tagName === 'CAPTION') {\n const caption = row.textContent?.trim() ?? '';\n if (caption) {\n results.push([{ value: caption }]);\n }\n continue;\n }\n const cells = Array.from(row.querySelectorAll('td, th'));\n const result: RawCellType[] = [];\n let j = 0;\n for (const cell of cells) {\n const value = cell.textContent?.trim() ?? '';\n const style: CSSProperties | undefined = onlyValue\n ? undefined\n : (() => {\n const childStyle = parseStyleString(cell.firstElementChild);\n const parentStyle = parseStyleString(cell);\n return { ...parentStyle, ...childStyle };\n })();\n while (spans.has(`${i}-${++j}`)) {\n result.push({ value: '', style, skip: true });\n }\n result.push({ value, style });\n\n const rowSpan = parseInt(cell.getAttribute('rowspan') ?? '1', 10);\n const colSpan = parseInt(cell.getAttribute('colspan') ?? '1', 10);\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n spans.add(`${i + r}-${j + c}`);\n }\n }\n }\n results.push(result);\n }\n };\n\n const processNodeSequentially = (node: Node, currentLine: RawCellType[] = []) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n const tagName = el.tagName;\n\n if (tagName === 'TABLE') {\n if (currentLine.length > 0) {\n results.push(currentLine.slice());\n currentLine.length = 0;\n }\n processSheet(el as HTMLTableElement);\n } else if (tagName === 'BR') {\n results.push(currentLine.slice());\n currentLine.length = 0;\n } else if (blockTags.has(tagName)) {\n if (currentLine.length > 0) {\n results.push(currentLine.slice());\n currentLine.length = 0;\n }\n el.childNodes.forEach((child) => processNodeSequentially(child, currentLine));\n if (currentLine.length > 0) {\n results.push(currentLine.slice());\n currentLine.length = 0;\n }\n } else {\n el.childNodes.forEach((child) => processNodeSequentially(child, currentLine));\n }\n } else if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent ?? '';\n const lines = text.split(/\\r?\\n/);\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed) {\n currentLine.push({ value: trimmed });\n }\n }\n }\n };\n\n const currentLine: RawCellType[] = [];\n doc.body.childNodes.forEach((node) => processNodeSequentially(node, currentLine));\n if (currentLine.length > 0) {\n results.push(currentLine);\n }\n\n return results;\n};\n\nfunction parseStyleString(element: Element | null): React.CSSProperties | undefined {\n if (!element) {\n return undefined;\n }\n const styleString = element.getAttribute('style') ?? '';\n const styleObj: React.CSSProperties = {};\n\n styleString.split(';').forEach((d) => {\n let [rawKey, rawValue] = d.split(':');\n if (!rawKey || !rawValue) {\n return;\n }\n rawKey = rawKey.trim();\n if (rawKey === 'height' || rawKey === 'width') {\n return;\n }\n const key = rawKey.trim().replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n if (key === 'float' || key === 'display' || key.startsWith('padding')) {\n return;\n }\n if (key === 'border') {\n Object.assign(styleObj, {\n borderTop: rawValue,\n borderRight: rawValue,\n borderBottom: rawValue,\n borderLeft: rawValue,\n });\n return;\n }\n if (key === 'borderColor') {\n Object.assign(styleObj, {\n borderTopColor: rawValue,\n borderRightColor: rawValue,\n borderBottomColor: rawValue,\n borderLeftColor: rawValue,\n });\n return;\n }\n if (key === 'borderStyle') {\n Object.assign(styleObj, {\n borderTopStyle: rawValue,\n borderRightStyle: rawValue,\n borderBottomStyle: rawValue,\n borderLeftStyle: rawValue,\n });\n return;\n }\n if (key === 'borderWidth') {\n Object.assign(styleObj, {\n borderTopWidth: rawValue,\n borderRightWidth: rawValue,\n borderBottomWidth: rawValue,\n borderLeftWidth: rawValue,\n });\n return;\n }\n const value = rawValue.trim();\n (styleObj as any)[key] = value;\n });\n\n return styleObj;\n}\n\nexport const parseText = (tsv: string, sep = '\\t'): RawCellType[][] => {\n tsv = tsv.replace(/\"\"/g, '\\x00');\n const rows: RawCellType[][] = [[]];\n let row = rows[0];\n let entering = false;\n let word = '';\n for (let i = 0; i < tsv.length; i++) {\n const s = tsv[i];\n if (s === '\\n' && !entering) {\n row.push({ value: restoreDoubleQuote(word) });\n word = '';\n row = [];\n rows.push(row);\n continue;\n }\n if (s === sep) {\n row.push({ value: restoreDoubleQuote(word) });\n word = '';\n continue;\n }\n if (s === '\"' && !entering && word === '') {\n entering = true;\n continue;\n }\n if (s === '\"' && entering) {\n entering = false;\n continue;\n }\n word += s;\n }\n if (word) {\n row.push({ value: restoreDoubleQuote(word) });\n }\n return rows;\n};\n\nconst restoreDoubleQuote = (text: string) => text.replace(/\\x00/g, '\"');\n\nconst blockTags = new Set([\n 'ADDRESS',\n 'ARTICLE',\n 'ASIDE',\n 'BLOCKQUOTE',\n 'DETAILS',\n 'DIALOG',\n 'DD',\n 'DIV',\n 'DL',\n 'DT',\n 'FIELDSET',\n 'FIGCAPTION',\n 'FIGURE',\n 'FOOTER',\n 'FORM',\n 'H1',\n 'H2',\n 'H3',\n 'H4',\n 'H5',\n 'H6',\n 'HEADER',\n 'HR',\n 'LI',\n 'MAIN',\n 'NAV',\n 'OL',\n 'P',\n 'PRE',\n 'SECTION',\n 'TABLE',\n 'UL',\n]);\n","import type { FC } from 'react';\nimport { useContext, useEffect, useState, useCallback, memo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FunctionGuide } from './FunctionGuide';\nimport { EditorOptions } from './EditorOptions';\nimport { x2c, y2r } from '@gridsheet/core';\nimport { clip } from '../lib/clipboard';\nimport {\n clear,\n escape,\n select,\n setEditingAddress,\n undo,\n redo,\n arrow,\n walk,\n write,\n copy,\n cut,\n paste,\n setSearchQuery,\n setEntering,\n setInputting,\n setEditorHovering,\n updateSheet,\n} from '../store/actions';\n\nimport { Context } from '../store';\nimport { areaToZone, zoneToArea } from '@gridsheet/core';\nimport { operations as prevention } from '@gridsheet/core';\nimport {\n expandInput,\n handleFormulaQuoteAutoClose,\n insertTextAtCursor,\n isFocus,\n isRefInsertable,\n resetInput,\n} from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { Lexer } from '@gridsheet/core';\nimport { COLOR_PALETTE } from '@gridsheet/core';\nimport { useAutocomplete } from './useAutocomplete';\nimport { EditorEventWithNativeEvent, FeedbackType, ModeType } from '../types';\nimport { Fixed } from './Fixed';\nimport { parseHTML, parseText } from '../lib/paste';\nimport React from 'react';\n\ntype Props = {\n mode: ModeType;\n};\n\nexport const Editor: FC<Props> = ({ mode }: Props) => {\n const { store, dispatch } = useContext(Context);\n const [shiftKey, setShiftKey] = useState(false);\n const [selectionStart, setSelectionStart] = useState(0);\n const [isFocused, setIsFocused] = useState(false);\n const {\n choosing,\n inputting,\n selectingZone,\n editorRect,\n editingAddress,\n entering,\n matchingCells,\n matchingCellIndex,\n searchQuery,\n editorRef,\n largeEditorRef,\n searchInputRef,\n editingOnEnter,\n sheetReactive: sheetRef,\n sheetId,\n dragging,\n } = store;\n const sheet = sheetRef.current;\n\n const renderOverlays = () => {\n if (!isFocused || !editing || typeof document === 'undefined') {\n return null;\n }\n if (editorRef.current !== document.activeElement) {\n return null;\n }\n\n const rect = editorRef.current?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n const { bottom: top, left } = rect;\n\n return createPortal(\n <>\n {activeFunctionHelp &&\n filteredOptions.length === 0 &&\n (!selectingZone || (selectingZone.endY === -1 && selectingZone.endX === -1)) && (\n <FunctionGuide\n activeFunctionGuide={activeFunctionHelp}\n activeArgIndex={activeArgIndex}\n top={top}\n left={left}\n />\n )}\n {filteredOptions.length > 0 && (\n <EditorOptions\n filteredOptions={filteredOptions}\n top={top}\n left={left}\n selected={selected}\n onOptionMouseDown={handleOptionMouseDown}\n />\n )}\n </>,\n document.body,\n );\n };\n\n const policy = sheet?.getPolicy(choosing);\n const optionsAll = policy?.getSelectOptions() ?? [];\n\n const handleSelect = useCallback((e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n setSelectionStart(e.currentTarget.selectionStart);\n }, []);\n\n const {\n filteredOptions,\n selected,\n setSelected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n isFormula,\n activeFunctionHelp,\n activeArgIndex,\n } = useAutocomplete({\n inputting,\n selectionStart,\n optionsAll,\n functions: sheet?.registry.functions,\n });\n\n useEffect(() => {\n focus(editorRef?.current);\n }, [editorRef]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n if (sheet.registry.lastFocused == null) {\n return;\n }\n if (sheet.registry.lastFocused !== editorRef.current) {\n return;\n }\n if (sheet.registry.lastFocused !== largeEditorRef.current) {\n return;\n }\n\n dispatch(setEditingAddress(''));\n }, [sheet?.registry.lastFocused, sheet, editorRef, largeEditorRef, dispatch]);\n useEffect(() => {\n if (!sheet) {\n return;\n }\n sheet.registry.editingSheetId = sheetId;\n sheet.registry.editingAddress = editingAddress;\n }, [editingAddress, sheet, sheetId]);\n\n useEffect(() => {\n //sheet.registry.transmit();\n expandInput(editorRef.current);\n }, [inputting, editingAddress, editorRef]);\n\n const { y, x } = choosing;\n const rowId = `${y2r(y)}`;\n const colId = x2c(x);\n const address = `${colId}${rowId}`;\n const editing = editingAddress === address;\n\n // Use 'RAW' so that spilled values (stored in solvedCaches) are already\n // reflected in cell.value without re-evaluating the formula.\n const cell = sheet?.getCell({ y, x }, { resolution: 'RAW' });\n const currentString = sheet ? sheet.getSerializedValue({ point: choosing, cell, resolution: 'RAW' }) : '';\n const [before, setBefore] = useState<string>(currentString);\n\n const writeCell = useCallback(\n (value: string) => {\n if (before !== value) {\n dispatch(write({ value }));\n }\n setBefore(value);\n },\n [before, dispatch],\n );\n\n const selectValue = useCallback(\n (selectedIndex: number) => {\n if (!sheet) {\n return;\n }\n const option = filteredOptions[selectedIndex];\n if (option) {\n if (option.isFunction) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n dispatch(setInputting(newValue));\n\n setTimeout(() => {\n if (editorRef.current) {\n focus(editorRef.current);\n editorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n } else {\n const t = sheet.update({\n diff: { [address]: { value: option.value } },\n partial: true,\n });\n dispatch(updateSheet(t.clone()));\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n setSelected(0);\n }\n },\n [filteredOptions, sheet, address, inputting, writeCell, dispatch, editorRef],\n );\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n setBefore(currentString);\n dispatch(setInputting(currentString));\n resetInput(editorRef.current, sheet, choosing);\n }, [choosing, currentString, dispatch, editorRef, sheet]);\n\n const { y: top, x: left, height, width } = editorRect;\n\n const numLines = currentString.split('\\n').length;\n const [isKeyDown, setIsKeyDown] = useState(false);\n const handleKeyDown = useCallback(\n (e: EditorEventWithNativeEvent) => {\n if (!sheet) {\n return;\n }\n if (isKeyDown) {\n return;\n }\n // do not debounce it if control key is down.\n if (!(e.key === 'Meta' || e.key === 'Control')) {\n setIsKeyDown(true);\n requestAnimationFrame(() => {\n setIsKeyDown(false);\n });\n }\n const input = e.currentTarget;\n\n // Auto-close double quotes in formula mode\n if (handleFormulaQuoteAutoClose(e, inputting)) {\n dispatch(setInputting(input.value));\n return false;\n }\n\n const shiftKey = e.shiftKey;\n switch (e.key) {\n case 'Tab': // TAB\n e.preventDefault();\n if (editing) {\n if (filteredOptions.length) {\n const isFunction = filteredOptions[selected]?.isFunction;\n selectValue(selected);\n if (isFunction) {\n return false;\n }\n } else {\n writeCell(input.value);\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n }\n dispatch(\n walk({\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 0,\n deltaX: shiftKey ? -1 : 1,\n }),\n );\n dispatch(setEditingAddress(''));\n return false;\n\n case 'Enter': // ENTER\n if (editing) {\n if (filteredOptions.length) {\n const isFunction = filteredOptions[selected]?.isFunction;\n selectValue(selected);\n if (isFunction) {\n e.preventDefault();\n return false;\n }\n } else if (e.altKey) {\n insertTextAtCursor(input, '\\n');\n dispatch(setInputting(input.value));\n e.preventDefault();\n return false;\n } else {\n if (e.nativeEvent.isComposing) {\n return false;\n }\n writeCell(input.value);\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n } else if (editingOnEnter && selectingZone.endY === -1) {\n const dblclick = document.createEvent('MouseEvents');\n dblclick.initEvent('dblclick', true, true);\n input.dispatchEvent(dblclick);\n e.preventDefault();\n return false;\n }\n dispatch(\n walk({\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: shiftKey ? -1 : 1,\n deltaX: 0,\n }),\n );\n e.preventDefault();\n return false;\n\n case 'Backspace': // BACKSPACE\n if (!editing) {\n // Spilled cells are read-only — clearing them would only erase the\n // cached spill value while the origin formula remains intact, causing\n // a confusing state where the FormulaBar goes blank but the cell\n // visually still shows the spilled value after re-evaluation.\n // e.preventDefault() is required here: without it the browser still\n // fires the default textarea behavior (deletes one char), which\n // triggers onInput → setInputting, making the value shrink character\n // by character on each Backspace press.\n if (sheet.getSystem({ y, x })?.spilledFrom != null) {\n e.preventDefault();\n return false;\n }\n dispatch(clear(null));\n dispatch(setInputting(''));\n return false;\n }\n break;\n case 'Delete': // DELETE\n if (!editing) {\n // Same guard as Backspace — spilled cells must not be cleared directly.\n if (sheet.getSystem({ y, x })?.spilledFrom != null) {\n e.preventDefault();\n return false;\n }\n dispatch(clear(null));\n dispatch(setInputting(''));\n return false;\n }\n break;\n case 'Shift': // SHIFT\n setShiftKey(true);\n return false;\n\n case 'Control': // CTRL\n return false;\n\n case 'Alt': // OPTION\n return false;\n\n case 'Meta': // COMMAND\n return false;\n\n case 'NumLock': // NUMLOCK\n return false;\n\n case 'Escape': // ESCAPE\n dispatch(escape(null));\n dispatch(setSearchQuery(undefined));\n dispatch(setInputting(before));\n // input.blur();\n return false;\n\n case 'ArrowLeft': // LEFT\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 0,\n deltaX: -1,\n }),\n );\n return false;\n }\n break;\n case 'ArrowUp': // UP\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: -1,\n deltaX: 0,\n }),\n );\n return false;\n }\n if (handleArrowUp(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'ArrowRight': // RIGHT\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 0,\n deltaX: 1,\n }),\n );\n return false;\n }\n break;\n case 'ArrowDown': // DOWN\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 1,\n deltaX: 0,\n }),\n );\n return false;\n }\n if (handleArrowDown(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'a': // A\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n dispatch(\n select({\n startY: 1,\n startX: 1,\n endY: sheet.numRows,\n endX: sheet.numCols,\n }),\n );\n return false;\n }\n }\n break;\n case 'c': // C\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n const area = clip(store);\n dispatch(copy(areaToZone(area)));\n focus(input); // refocus\n return false;\n }\n return true;\n }\n break;\n case 'f': // F\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n if (typeof searchQuery === 'undefined') {\n dispatch(setSearchQuery(''));\n }\n dispatch(setEntering(false));\n requestAnimationFrame(() => focus(searchInputRef.current));\n return false;\n }\n }\n break;\n case 'r': // R\n case 'y': // Y\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n dispatch(redo(null));\n requestAnimationFrame(() => dispatch(setInputting(''))); // resetting textarea\n return false;\n }\n }\n break;\n case 's': // S\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n sheet.registry.onSave?.({\n sheet,\n points: {\n pointing: choosing,\n selectingFrom: {\n y: selectingZone.startY,\n x: selectingZone.startX,\n },\n selectingTo: {\n y: selectingZone.endY,\n x: selectingZone.endX,\n },\n },\n });\n return false;\n }\n }\n break;\n case 'v': // V\n if (e.ctrlKey || e.metaKey) {\n // moved to onPaste\n e.stopPropagation();\n return false;\n }\n break;\n case 'x': // X\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n const area = clip(store);\n dispatch(cut(areaToZone(area)));\n focus(input); // refocus\n\n return false;\n }\n }\n break;\n case 'z': // Z\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n if (e.shiftKey) {\n dispatch(redo(null));\n //window.setTimeout(() => apply(setInputting('')), 100); // resetting textarea\n } else {\n dispatch(undo(null));\n }\n return false;\n }\n }\n break;\n case ';': // semicolon\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n // MAYBE: need to aware timezone.\n writeCell(new Date().toDateString());\n }\n }\n break;\n }\n if (e.ctrlKey || e.metaKey) {\n return false;\n }\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n console.warn('This cell is protected from writing.');\n return false;\n }\n dispatch(setEditingAddress(address));\n if (!editing) {\n dispatch(setInputting(''));\n }\n setSelected(0);\n return false;\n },\n [\n isKeyDown,\n editing,\n filteredOptions,\n selected,\n editingOnEnter,\n selectingZone,\n before,\n sheet,\n choosing,\n store,\n cell,\n address,\n writeCell,\n searchQuery,\n inputting,\n ],\n );\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true);\n if (!sheet) {\n return;\n }\n sheet.registry.lastFocused = e.currentTarget;\n },\n [sheet],\n );\n\n const handleDoubleClick = useCallback(\n (e: React.MouseEvent<HTMLTextAreaElement>) => {\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n console.warn('This cell is protected from writing.');\n return;\n }\n const input = e.currentTarget;\n if (!editing) {\n dispatch(setInputting(currentString));\n dispatch(setEditingAddress(address));\n requestAnimationFrame(() => {\n input.style.width = `${input.scrollWidth}px`;\n input.style.height = `${input.scrollHeight}px`;\n const length = new String(currentString).length;\n input.setSelectionRange(length, length);\n });\n }\n },\n [cell, editing, currentString, address],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n if (isRefInsertable(e.currentTarget)) {\n return true;\n } else {\n if (editing) {\n writeCell(e.currentTarget.value);\n }\n }\n dispatch(setEditingAddress(''));\n },\n [editing, writeCell, dispatch],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n return;\n }\n dispatch(setInputting(e.currentTarget.value));\n setSelectionStart(e.currentTarget.selectionStart);\n setSelected(0);\n },\n [cell],\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (editing) {\n return true;\n }\n\n const onlyValue = shiftKey;\n const html = e.clipboardData?.getData?.('text/html');\n if (html) {\n dispatch(paste({ matrix: parseHTML(html), onlyValue }));\n } else {\n const text = e.clipboardData?.getData?.('text/plain');\n if (text) {\n dispatch(paste({ matrix: parseText(text), onlyValue }));\n } else {\n console.warn('No clipboard data found.');\n }\n }\n e.preventDefault();\n e.stopPropagation();\n return false;\n },\n [editing, shiftKey],\n );\n\n const handleKeyUpInternal = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n setShiftKey(false);\n const selectingArea = zoneToArea(store.selectingZone);\n sheet?.registry.onKeyUp?.({\n e,\n points: {\n pointing: choosing,\n selectingFrom: { y: selectingArea.top, x: selectingArea.left },\n selectingTo: { y: selectingArea.bottom, x: selectingArea.right },\n },\n });\n },\n [store.selectingZone, choosing, sheet],\n );\n\n const handleOptionMouseDown = useCallback(\n (e: React.MouseEvent<HTMLLIElement>, index: number) => {\n selectValue(index);\n e.preventDefault();\n e.stopPropagation();\n return false;\n },\n [selectValue],\n );\n\n if (!sheet) {\n return null;\n }\n\n return (\n <Fixed\n className={`gs-editor ${editing ? 'gs-editing' : ''}`}\n style={editing ? { top, left, height } : {}}\n {...{\n 'data-mode': mode,\n 'data-sheet-id': sheetId,\n }}\n >\n <div className={`gs-cell-label ${editing ? ' gs-hidden' : ''}`}>{address}</div>\n <div className=\"gs-editor-inner\" style={{ width }}>\n <pre\n className=\"gs-editor-hl\"\n style={{\n //...cell?.style,\n height: editorRef.current?.scrollHeight,\n width: (editorRef.current?.scrollWidth ?? 0) - 4,\n }}\n >\n {(cell?.formulaEnabled ?? true) ? editorStyle(inputting) : inputting}\n </pre>\n <textarea\n data-sheet-id={sheetId}\n name=\"gs-editor-input\"\n data-size=\"small\"\n autoFocus={true}\n spellCheck={false}\n draggable={false}\n ref={editorRef}\n rows={numLines}\n onFocus={handleFocus}\n style={{ minWidth: width, minHeight: height }}\n onDoubleClick={handleDoubleClick}\n onBlur={handleBlur}\n value={inputting}\n onChange={handleChange}\n onSelect={handleSelect}\n onPaste={handlePaste}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUpInternal}\n onMouseEnter={() => {\n dispatch(setEditorHovering(true));\n }}\n onMouseLeave={() => {\n dispatch(setEditorHovering(false));\n }}\n />\n </div>\n {renderOverlays()}\n </Fixed>\n );\n};\n\n// Memoized token span component to prevent unnecessary re-renders\nconst TokenSpan = memo<{\n token: any;\n tokenKey: string;\n color?: string;\n className?: string;\n}>(\n ({ token, tokenKey, color, className }) => {\n return (\n <span key={tokenKey} style={color ? { color } : undefined} className={className}>\n {token.stringify()}\n </span>\n );\n },\n (prevProps, nextProps) => {\n // Custom comparison to prevent unnecessary re-renders\n return (\n prevProps.tokenKey === nextProps.tokenKey &&\n prevProps.color === nextProps.color &&\n prevProps.className === nextProps.className &&\n prevProps.token.stringify() === nextProps.token.stringify()\n );\n },\n);\n\nexport const editorStyle = (text: string) => {\n if (text[0] !== '=') {\n return <>{text}</>;\n }\n\n const lexer = new Lexer(text.substring(1));\n lexer.tokenize();\n let palletIndex = 0;\n const exists: { [ref: string]: number } = {};\n\n // Create a simple hash of the formula for stable keys\n const formulaHash = text.split('').reduce((hash, char) => {\n return ((hash << 5) - hash + char.charCodeAt(0)) & 0xffffffff;\n }, 0);\n\n return (\n <>\n =\n {lexer.tokens.map((token, i) => {\n // Handle SPACE tokens differently - render as plain text\n if (token.type === 'SPACE') {\n return <React.Fragment key={`${formulaHash}-SPACE-${i}`}>{token.stringify()}</React.Fragment>;\n }\n\n // Create a stable key based on formula hash, token content and index\n const tokenKey = `${formulaHash}-${token.type}-${token.stringify()}-${i}`;\n\n if (token.type === 'REF' || token.type === 'RANGE') {\n const normalizedToken = token.stringify();\n const existsIndex = exists[normalizedToken];\n if (existsIndex !== undefined) {\n return (\n <TokenSpan\n key={tokenKey}\n token={token}\n tokenKey={tokenKey}\n color={COLOR_PALETTE[existsIndex % COLOR_PALETTE.length]}\n />\n );\n }\n const color = COLOR_PALETTE[palletIndex % COLOR_PALETTE.length];\n exists[normalizedToken] = palletIndex++;\n return (\n <TokenSpan\n key={tokenKey}\n token={token}\n tokenKey={tokenKey}\n color={color}\n className={`gs-token-type-${token.type}`}\n />\n );\n }\n\n return (\n <TokenSpan\n key={tokenKey}\n token={token}\n tokenKey={tokenKey}\n className={`gs-token-type-${token.type} gs-token-entity-type-${typeof token.entity}`}\n />\n );\n })}\n </>\n );\n};\n","import type { ReactNode } from 'react';\nimport { createContext, useContext, useState } from 'react';\n\nimport type { StoreType } from '../types';\nimport type { Dispatcher } from '../store';\n\nexport type PluginContextType = {\n provided: boolean;\n store?: StoreType;\n apply?: Dispatcher;\n setStore: (store: StoreType) => void;\n setApply: (apply: Dispatcher) => void;\n};\n\nexport const PluginContext = createContext({} as PluginContextType);\n\nexport function useInitialPluginContext(): PluginContextType {\n const [store, setStore] = useState<StoreType | undefined>(undefined);\n const [apply, setApply] = useState<Dispatcher>();\n return {\n provided: true,\n store,\n apply,\n setStore,\n setApply,\n };\n}\n\nexport function usePluginContext(): [boolean, PluginContextType] {\n const ctx = useContext(PluginContext);\n if (ctx?.provided == null) {\n return [false, ctx];\n }\n return [true, ctx];\n}\n\nexport function usePluginDispatch() {\n const sync = useContext(PluginContext);\n if (!sync) {\n return undefined;\n }\n return sync;\n}\n\ntype Props = {\n children: ReactNode;\n context: PluginContextType;\n};\n\nexport function PluginBase({ children, context }: Props) {\n const [provided] = usePluginContext();\n if (provided) {\n return <>{children}</>;\n }\n return <PluginContext.Provider value={context}>{children}</PluginContext.Provider>;\n}\n","import type { FC, MutableRefObject } from 'react';\nimport { createRef, useContext, useEffect, useRef, useState } from 'react';\n\nimport type { OptionsType, Props, SheetHandle, StoreHandle } from '../types';\nimport { Context } from '../store';\n\nimport { setStore, updateSheet } from '../store/actions';\n\nimport { usePluginContext } from './PluginBase';\nimport { Sheet } from '@gridsheet/core';\n\ntype StoreObserverProps = OptionsType & {\n sheetName?: string;\n sheetRef?: MutableRefObject<SheetHandle | null>;\n storeRef?: MutableRefObject<StoreHandle | null>;\n};\n\nexport const createSheetRef = () => createRef<SheetHandle | null>();\nexport const useSheetRef = () => useRef<SheetHandle | null>(null);\nexport const createStoreRef = () => createRef<StoreHandle | null>();\nexport const useStoreRef = () => useRef<StoreHandle | null>(null);\nexport const StoreObserver: FC<StoreObserverProps> = ({\n sheetName,\n sheetHeight,\n sheetWidth,\n sheetRef,\n storeRef,\n editingOnEnter,\n mode,\n}) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive } = store;\n const sheet = sheetReactive.current;\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n if (sheetName && sheetName !== sheet.name) {\n sheet.name = sheetName;\n sheet.registry.sheetIdsByName[sheetName] = sheet.id;\n delete sheet.registry.sheetIdsByName[sheet.prevName];\n sheet.prevName = sheetName;\n //book.transmit();\n }\n }, [sheetName]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n const { registry } = sheet;\n requestAnimationFrame(() => registry.boot());\n registry.contextsBySheetId[sheet.id] = { store, dispatch };\n registry.transmit();\n\n if (sheetRef) {\n sheetRef.current = {\n sheet,\n apply: (sheet) => {\n dispatch(updateSheet(sheet as Sheet));\n },\n };\n }\n if (storeRef) {\n storeRef.current = {\n store,\n apply: (store) => {\n dispatch(setStore(store));\n },\n dispatch,\n };\n }\n }, [store, sheet, sheetRef, storeRef]);\n\n useEffect(() => {\n if (sheetHeight) {\n dispatch(setStore({ sheetHeight }));\n }\n }, [sheetHeight, dispatch]);\n useEffect(() => {\n if (sheetWidth) {\n dispatch(setStore({ sheetWidth }));\n }\n }, [sheetWidth]);\n useEffect(() => {\n if (typeof editingOnEnter !== 'undefined') {\n dispatch(setStore({ editingOnEnter }));\n }\n }, [editingOnEnter]);\n useEffect(() => {\n if (mode) {\n dispatch(setStore({ mode }));\n }\n }, [mode]);\n\n const [pluginProvided, pluginContext] = usePluginContext();\n useEffect(() => {\n if (!pluginProvided) {\n return;\n }\n pluginContext.setStore(store);\n pluginContext.setApply(() => dispatch);\n }, [store, pluginProvided, pluginContext]);\n\n return <></>;\n};\n","import { useContext } from 'react';\nimport type { MouseEvent } from 'react';\n\nimport { Context } from '../store';\nimport { setResizingPositionY, setResizingPositionX, updateSheet, setStore } from '../store/actions';\n\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH, MIN_WIDTH, MIN_HEIGHT } from '@gridsheet/core';\nimport { zoneToArea, makeSequence, between } from '@gridsheet/core';\nimport type { CellsByAddressType } from '../types';\nimport { p2a } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\n\nexport const Resizer = () => {\n const { store, dispatch } = useContext(Context);\n const {\n resizingPositionY: posY,\n resizingPositionX: posX,\n sheetReactive: sheetRef,\n leftHeaderSelecting,\n topHeaderSelecting,\n selectingZone,\n editorRef,\n mainRef,\n } = store;\n const sheet = sheetRef.current;\n\n const [y, startY, endY] = posY;\n const [x, startX, endX] = posX;\n\n if (mainRef.current == null || editorRef.current == null || !sheet) {\n return <div className=\"gs-resizing gs-hidden\" />;\n }\n\n const cell = sheet.getCell({ y: y === -1 ? 0 : y, x: x === -1 ? 0 : x }, { resolution: 'SYSTEM' });\n const { y: offsetY, x: offsetX } = mainRef.current.getBoundingClientRect();\n\n const baseWidth = cell?.width || DEFAULT_WIDTH;\n const baseHeight = cell?.height || DEFAULT_HEIGHT;\n\n const width = baseWidth + (endX - startX);\n const height = baseHeight + (endY - startY);\n\n const handleResizeEnd = () => {\n const selectingArea = zoneToArea(selectingZone);\n const { top, left, bottom, right } = selectingArea;\n const diff: CellsByAddressType = {};\n if (x !== -1) {\n let xs = [x];\n if (topHeaderSelecting && between({ start: left, end: right }, x)) {\n xs = makeSequence(left, right + 1);\n }\n xs.forEach((x) => {\n diff[p2a({ y: 0, x })] = { width };\n });\n }\n if (y !== -1) {\n let ys = [y];\n if (leftHeaderSelecting && between({ start: top, end: bottom }, y)) {\n ys = makeSequence(top, bottom + 1);\n }\n ys.forEach((y) => {\n diff[p2a({ y, x: 0 })] = { height };\n });\n }\n sheet.update({\n diff,\n partial: true,\n operator: 'USER',\n undoReflection: { selectingZone, sheetId: sheet.id },\n });\n dispatch(\n setStore({\n sheetReactive: { current: sheet },\n }),\n );\n dispatch(setResizingPositionY([-1, -1, -1]));\n dispatch(setResizingPositionX([-1, -1, -1]));\n focus(editorRef.current);\n };\n const handleResizeMove = (e: MouseEvent) => {\n if (y !== -1) {\n let endY = e.clientY;\n const height = baseHeight + (endY - startY);\n if (height < MIN_HEIGHT) {\n endY += MIN_HEIGHT - height;\n }\n dispatch(setResizingPositionY([y, startY, endY]));\n } else if (x !== -1) {\n let endX = e.clientX;\n const width = baseWidth + (endX - startX);\n if (width < MIN_WIDTH) {\n endX += MIN_WIDTH - width;\n }\n dispatch(setResizingPositionX([x, startX, endX]));\n }\n };\n\n return (\n <div\n className={`gs-resizing ${y === -1 && x === -1 ? 'gs-hidden' : ''}`}\n onMouseUp={handleResizeEnd}\n onMouseMove={handleResizeMove}\n >\n <div className={`gs-line-vertical ${x === -1 ? 'gs-hidden' : ''}`}>\n <div className={'gs-line'} style={{ width: 1, height: '100%', left: endX - offsetX }}>\n <span style={{ left: '-50%' }}>{width}px</span>\n </div>\n </div>\n <div className={`gs-line-horizontal ${y === -1 ? 'gs-hidden' : ''}`}>\n <div className={'gs-line'} style={{ width: '100%', height: 1, top: endY - offsetY }}>\n <span style={{ top: '-50%' }}>{height}px</span>\n </div>\n </div>\n </div>\n );\n};\n","import type { FC } from 'react';\nimport { useContext, useEffect, useRef } from 'react';\nimport { Context } from '../store';\n\nexport const Emitter: FC = () => {\n const { store } = useContext(Context);\n const { choosing: pointing, selectingZone: zone, sheetReactive } = store;\n const sheet = sheetReactive.current;\n\n useEffect(() => {\n if (sheet?.isInitialized && sheet.currentVersion > 0 && sheet.registry.onChange) {\n sheet.registry.onChange({\n sheet,\n points: {\n pointing,\n selectingFrom: { y: zone.startY, x: zone.startX },\n selectingTo: { y: zone.endY, x: zone.endX },\n },\n });\n }\n }, [sheetReactive]);\n\n useEffect(() => {\n if (sheet && sheet.registry.onSelect) {\n sheet.registry.onSelect({\n sheet,\n points: {\n pointing,\n selectingFrom: { y: zone.startY, x: zone.startX },\n selectingTo: { y: zone.endY, x: zone.endX },\n },\n });\n }\n }, [pointing, zone]);\n return null;\n};\n","import type { StoreDispatchType, FilterConfig, RawCellType } from '../types';\nimport { areaToZone, zoneShape, zoneToArea } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { p2a } from '@gridsheet/core';\nimport {\n copy,\n cut,\n paste,\n undo,\n redo,\n insertRowsAbove,\n insertRowsBelow,\n insertColsLeft,\n insertColsRight,\n removeRows,\n removeCols,\n sortRows,\n filterRows,\n setSearchQuery,\n setEntering,\n updateSheet,\n} from './actions';\nimport { clip } from '../lib/clipboard';\nimport { parseHTML, parseText } from '../lib/paste';\n\nexport const copier = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n const area = clip(store);\n dispatch(copy(areaToZone(area)));\n focus(editorRef.current);\n};\n\nexport const cutter = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n const area = clip(store);\n dispatch(cut(areaToZone(area)));\n focus(editorRef.current);\n};\n\nexport const paster = async ({ store, dispatch }: StoreDispatchType, onlyValue = false) => {\n const { editorRef } = store;\n const items = await navigator.clipboard.read();\n let cells: RawCellType[][] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.types.indexOf('text/html') !== -1) {\n const blob = await item.getType('text/html');\n const html = await blob.text();\n if (html) {\n cells = parseHTML(html, onlyValue);\n break;\n }\n } else if (item.types.indexOf('text/plain') !== -1) {\n const blob = await item.getType('text/plain');\n const text = await blob.text();\n if (text) {\n cells = parseText(text);\n break;\n }\n }\n }\n dispatch(paste({ matrix: cells, onlyValue }));\n focus(editorRef.current);\n};\n\nexport const undoer = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n dispatch(undo(null));\n focus(editorRef.current);\n};\n\nexport const redoer = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n dispatch(redo(null));\n focus(editorRef.current);\n};\n\nexport const rowsInserterAbove = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { top } = zoneToArea(selectingZone);\n const numRows = zoneShape(selectingZone).rows;\n dispatch(insertRowsAbove({ numRows, y: top, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const rowsInserterBelow = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { bottom } = zoneToArea(selectingZone);\n const numRows = zoneShape(selectingZone).rows;\n dispatch(insertRowsBelow({ numRows, y: bottom, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const colsInserterLeft = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { left } = zoneToArea(selectingZone);\n const numCols = zoneShape(selectingZone).cols;\n dispatch(insertColsLeft({ numCols, x: left, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const colsInserterRight = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { right } = zoneToArea(selectingZone);\n const numCols = zoneShape(selectingZone).cols;\n dispatch(insertColsRight({ numCols, x: right, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const rowsRemover = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { top } = zoneToArea(selectingZone);\n const numRows = zoneShape(selectingZone).rows;\n dispatch(removeRows({ numRows, y: top, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const colsRemover = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { left } = zoneToArea(selectingZone);\n const numCols = zoneShape(selectingZone).cols;\n dispatch(removeCols({ numCols, x: left, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const rowsSorterAsc = async ({ store, dispatch }: StoreDispatchType, x: number) => {\n const sheet = store.sheetReactive.current;\n if (sheet && (sheet.hasPendingCells() || sheet.registry.asyncPending.size > 0)) {\n await sheet.waitForPending();\n }\n dispatch(sortRows({ x, direction: 'asc' }));\n focus(store.editorRef.current);\n};\n\nexport const rowsSorterDesc = async ({ store, dispatch }: StoreDispatchType, x: number) => {\n const sheet = store.sheetReactive.current;\n if (sheet && (sheet.hasPendingCells() || sheet.registry.asyncPending.size > 0)) {\n await sheet.waitForPending();\n }\n dispatch(sortRows({ x, direction: 'desc' }));\n focus(store.editorRef.current);\n};\n\nexport const rowsFilterer = async ({ store, dispatch }: StoreDispatchType, x: number, filter: FilterConfig) => {\n const sheet = store.sheetReactive.current;\n if (sheet && (sheet.hasPendingCells() || sheet.registry.asyncPending.size > 0)) {\n await sheet.waitForPending();\n }\n dispatch(filterRows({ x, filter }));\n focus(store.editorRef.current);\n};\n\nexport const rowsFilterClearer = async ({ store, dispatch }: StoreDispatchType, x?: number) => {\n dispatch(filterRows({ x }));\n focus(store.editorRef.current);\n};\n\nexport const rowSortFixedToggler = ({ store, dispatch }: StoreDispatchType, y: number) => {\n const sheet = store.sheetReactive.current;\n if (!sheet) {\n return;\n }\n const addr = p2a({ y, x: 0 });\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const next = !rowCell?.sortFixed || undefined;\n sheet.update({ diff: { [addr]: { sortFixed: next } }, partial: true });\n dispatch(updateSheet(sheet));\n focus(store.editorRef.current);\n};\n\nexport const rowFilterFixedToggler = ({ store, dispatch }: StoreDispatchType, y: number) => {\n const sheet = store.sheetReactive.current;\n if (!sheet) {\n return;\n }\n const addr = p2a({ y, x: 0 });\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const next = !rowCell?.filterFixed || undefined;\n sheet.update({ diff: { [addr]: { filterFixed: next } }, partial: true });\n dispatch(updateSheet(sheet));\n focus(store.editorRef.current);\n};\n\nexport const searcher = async ({ store, dispatch }: StoreDispatchType) => {\n if (typeof store.searchQuery === 'undefined') {\n dispatch(setSearchQuery(''));\n }\n dispatch(setEntering(false));\n requestAnimationFrame(() => focus(store.searchInputRef.current));\n};\n\nexport const applyers = {\n copy: copier,\n cut: cutter,\n paste: paster,\n undo: undoer,\n redo: redoer,\n insertRowsAbove: rowsInserterAbove,\n insertRowsBelow: rowsInserterBelow,\n insertColsLeft: colsInserterLeft,\n insertColsRight: colsInserterRight,\n removeRows: rowsRemover,\n removeCols: colsRemover,\n sortRowsAsc: rowsSorterAsc,\n sortRowsDesc: rowsSorterDesc,\n filterRows: rowsFilterer,\n clearFilter: rowsFilterClearer,\n toggleSortFixed: rowSortFixedToggler,\n toggleFilterFixed: rowFilterFixedToggler,\n search: searcher,\n};\n","/**\n * Menu system — types, default descriptors, and MenuContext builder.\n */\n\n// ---- types ----------------------------------------------------------------\n\nimport type { PointType, ZoneType, FilterConfig } from '../types';\nimport type { UserSheet } from '@gridsheet/core';\nimport type { StoreType } from '../types';\nimport type { Dispatcher } from '../store';\nimport { operations as prevention } from '@gridsheet/core';\nimport { zoneShape } from '@gridsheet/core';\nimport { p2a } from '@gridsheet/core';\nimport {\n copier,\n cutter,\n paster,\n undoer,\n redoer,\n rowsSorterAsc,\n rowsSorterDesc,\n rowsFilterer,\n rowsFilterClearer,\n rowSortFixedToggler,\n rowFilterFixedToggler,\n searcher,\n} from '../store/applyers';\nimport {\n insertRowsAbove as _insertRowsAbove,\n insertRowsBelow as _insertRowsBelow,\n removeRows as _removeRows,\n insertColsLeft as _insertColsLeft,\n insertColsRight as _insertColsRight,\n removeCols as _removeCols,\n setStore as _setStore,\n} from '../store/actions';\n\nexport type MenuContext = {\n /** Current sheet instance */\n sheet: UserSheet;\n /** Currently focused cell */\n choosing: PointType;\n /** Currently selected zone */\n selectingZone: ZoneType;\n /** True when the left (row) header is being selected */\n leftHeaderSelecting: boolean;\n /** True when the top (column) header is being selected */\n topHeaderSelecting: boolean;\n\n // ---- actions ----\n cut(): Promise<void>;\n copy(): Promise<void>;\n paste(onlyValue?: boolean): Promise<void>;\n undo(): void;\n redo(): void;\n insertRowsAbove(y: number, numRows: number): void;\n insertRowsBelow(y: number, numRows: number): void;\n removeRows(y: number, numRows: number): void;\n insertColsLeft(x: number, numCols: number): void;\n insertColsRight(x: number, numCols: number): void;\n removeCols(x: number, numCols: number): void;\n sortRows(x: number, direction: 'asc' | 'desc'): Promise<void>;\n filterRows(x: number, filter?: FilterConfig): Promise<void>;\n clearFilter(x?: number): void;\n toggleSortFixed(y: number): void;\n toggleFilterFixed(y: number): void;\n search(): void;\n updateColLabel(x: number, label: string | undefined): void;\n /** Close the currently open menu */\n close(): void;\n};\n\nexport type MenuDividerItem = { type: 'divider'; visible?: (ctx: MenuContext) => boolean };\n\n/**\n * Base structure shared by all menu item descriptors.\n * `Args` is the tuple of coordinate arguments passed after `ctx`:\n * - `[]` → ContextMenu (no coordinate)\n * - `[y: number]` → RowMenu\n * - `[x: number]` → ColMenu\n */\nexport type MenuItemBase<Args extends unknown[] = []> = {\n type?: 'item';\n id?: string;\n label: string | ((ctx: MenuContext, ...args: Args) => string);\n shortcuts?: string[] | ((ctx: MenuContext, ...args: Args) => string[]);\n visible?: (ctx: MenuContext, ...args: Args) => boolean;\n disabled?: (ctx: MenuContext, ...args: Args) => boolean;\n /** Render a checkmark prefix when defined. */\n checked?: (ctx: MenuContext, ...args: Args) => boolean;\n onClick: (ctx: MenuContext, ...args: Args) => void | Promise<void>;\n};\n\n/**\n * A menu entry that renders a registered React component.\n * Use `registerMenuComponent(id, Component)` to associate an id with a component,\n * then reference it here as `{ type: 'component', componentId: id }`.\n */\nexport type MenuComponentItem<Args extends unknown[] = []> = {\n type: 'component';\n componentId: string;\n visible?: (ctx: MenuContext, ...args: Args) => boolean;\n};\n\nexport type ContextMenuItemDescriptor = MenuDividerItem | MenuItemBase | MenuComponentItem;\nexport type RowMenuItemDescriptor = MenuDividerItem | MenuItemBase<[y: number]> | MenuComponentItem<[y: number]>;\nexport type ColMenuItemDescriptor = MenuDividerItem | MenuItemBase<[x: number]> | MenuComponentItem<[x: number]>;\n\n// ---- helpers ---------------------------------------------------------------\n\nconst rowInsertCount = (ctx: MenuContext, y: number): number => {\n const { selectingZone } = ctx;\n const selStart = Math.min(selectingZone.startY, selectingZone.endY);\n const selEnd = Math.max(selectingZone.startY, selectingZone.endY);\n const isFullRow = selectingZone.startX === 1 && selectingZone.endX === ctx.sheet.numCols;\n return isFullRow && y >= selStart && y <= selEnd ? selEnd - selStart + 1 : 1;\n};\n\nconst colInsertCount = (ctx: MenuContext, x: number): number => {\n const { selectingZone } = ctx;\n const selStart = Math.min(selectingZone.startX, selectingZone.endX);\n const selEnd = Math.max(selectingZone.startX, selectingZone.endX);\n const isFullCol = selectingZone.startY === 1 && selectingZone.endY === ctx.sheet.numRows;\n return isFullCol && x >= selStart && x <= selEnd ? selEnd - selStart + 1 : 1;\n};\n\n// ---- default descriptors ---------------------------------------------------\n\nexport const defaultContextMenuDescriptors: ContextMenuItemDescriptor[] = [\n {\n id: 'cut',\n label: 'Cut',\n shortcuts: ['X'],\n onClick: (ctx) => ctx.cut(),\n },\n {\n id: 'copy',\n label: 'Copy',\n shortcuts: ['C'],\n onClick: (ctx) => ctx.copy(),\n },\n {\n id: 'paste',\n label: 'Paste',\n shortcuts: ['V'],\n onClick: (ctx) => ctx.paste(false),\n },\n {\n id: 'paste-only-value',\n label: 'Paste only value',\n shortcuts: ['Shift+V'],\n onClick: (ctx) => ctx.paste(true),\n },\n { type: 'divider', visible: (ctx) => ctx.leftHeaderSelecting || ctx.topHeaderSelecting },\n {\n id: 'insert-rows-above',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n return `Insert ${n} row${n > 1 ? 's' : ''} above`;\n },\n visible: (ctx) => ctx.leftHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y: ctx.choosing.y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsAbove)\n );\n },\n onClick: (ctx) => ctx.insertRowsAbove(ctx.choosing.y, zoneShape(ctx.selectingZone).rows),\n },\n {\n id: 'insert-rows-below',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n return `Insert ${n} row${n > 1 ? 's' : ''} below`;\n },\n visible: (ctx) => ctx.leftHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y: ctx.choosing.y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsBelow)\n );\n },\n onClick: (ctx) => ctx.insertRowsBelow(ctx.choosing.y, zoneShape(ctx.selectingZone).rows),\n },\n {\n id: 'insert-cols-left',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n return `Insert ${n} column${n > 1 ? 's' : ''} left`;\n },\n visible: (ctx) => ctx.topHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x: ctx.choosing.x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsLeft)\n );\n },\n onClick: (ctx) => ctx.insertColsLeft(ctx.choosing.x, zoneShape(ctx.selectingZone).cols),\n },\n {\n id: 'insert-cols-right',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n return `Insert ${n} column${n > 1 ? 's' : ''} right`;\n },\n visible: (ctx) => ctx.topHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x: ctx.choosing.x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsRight)\n );\n },\n onClick: (ctx) => ctx.insertColsRight(ctx.choosing.x, zoneShape(ctx.selectingZone).cols),\n },\n {\n id: 'remove-rows',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n return `Remove ${n} row${n > 1 ? 's' : ''}`;\n },\n visible: (ctx) => ctx.leftHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y: ctx.choosing.y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumRows !== -1 && sheet.numRows - n < sheet.minNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.RemoveRows)\n );\n },\n onClick: (ctx) => ctx.removeRows(ctx.choosing.y, zoneShape(ctx.selectingZone).rows),\n },\n {\n id: 'remove-cols',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n return `Remove ${n} column${n > 1 ? 's' : ''}`;\n },\n visible: (ctx) => ctx.topHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x: ctx.choosing.x }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumCols !== -1 && sheet.numCols - n < sheet.minNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.RemoveCols)\n );\n },\n onClick: (ctx) => ctx.removeCols(ctx.choosing.x, zoneShape(ctx.selectingZone).cols),\n },\n { type: 'divider' },\n {\n id: 'undo',\n label: 'Undo',\n shortcuts: ['Z'],\n disabled: (ctx) => ctx.sheet.historyIndex() <= -1,\n onClick: (ctx) => ctx.undo(),\n },\n {\n id: 'redo',\n label: 'Redo',\n shortcuts: ['R', 'Y', 'Shift+Z'],\n disabled: (ctx) => ctx.sheet.historyIndex() >= ctx.sheet.historySize() - 1,\n onClick: (ctx) => ctx.redo(),\n },\n { type: 'divider' },\n {\n id: 'search',\n label: 'Search',\n shortcuts: ['F'],\n onClick: (ctx) => ctx.search(),\n },\n];\n\nexport const defaultRowMenuDescriptors: RowMenuItemDescriptor[] = [\n {\n id: 'cut',\n label: 'Cut',\n shortcuts: ['X'],\n onClick: (ctx) => ctx.cut(),\n },\n {\n id: 'copy',\n label: 'Copy',\n shortcuts: ['C'],\n onClick: (ctx) => ctx.copy(),\n },\n {\n id: 'paste',\n label: 'Paste',\n shortcuts: ['V'],\n onClick: (ctx) => ctx.paste(false),\n },\n {\n id: 'paste-only-value',\n label: 'Paste only value',\n shortcuts: ['Shift+V'],\n onClick: (ctx) => ctx.paste(true),\n },\n { type: 'divider' },\n {\n id: 'insert-rows-above',\n label: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n return `Insert ${n} row${n > 1 ? 's' : ''} above`;\n },\n disabled: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsAbove)\n );\n },\n onClick: (ctx, y) => ctx.insertRowsAbove(y, rowInsertCount(ctx, y)),\n },\n {\n id: 'insert-rows-below',\n label: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n return `Insert ${n} row${n > 1 ? 's' : ''} below`;\n },\n disabled: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsBelow)\n );\n },\n onClick: (ctx, y) => ctx.insertRowsBelow(y, rowInsertCount(ctx, y)),\n },\n {\n id: 'remove-rows',\n label: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n return `Remove ${n} row${n > 1 ? 's' : ''}`;\n },\n disabled: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumRows !== -1 && sheet.numRows - n < sheet.minNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.RemoveRows)\n );\n },\n onClick: (ctx, y) => ctx.removeRows(y, rowInsertCount(ctx, y)),\n },\n { type: 'divider' },\n {\n id: 'toggle-sort-fixed',\n label: 'Fix row for sorting',\n checked: (ctx, y) => !!ctx.sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' })?.sortFixed,\n onClick: (ctx, y) => ctx.toggleSortFixed(y),\n },\n {\n id: 'toggle-filter-fixed',\n label: 'Fix row for filtering',\n checked: (ctx, y) => !!ctx.sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' })?.filterFixed,\n onClick: (ctx, y) => ctx.toggleFilterFixed(y),\n },\n { type: 'divider' },\n {\n id: 'search',\n label: 'Search',\n shortcuts: ['F'],\n onClick: (ctx) => ctx.search(),\n },\n];\n\n// The col menu composes registered section components (filter, sort, label) and\n// simple menu items. Use `registerMenuComponent` to override built-in sections.\nexport const defaultColMenuDescriptors: ColMenuItemDescriptor[] = [\n { type: 'component', componentId: 'col-filter' },\n { type: 'divider' },\n { type: 'component', componentId: 'col-sort' },\n { type: 'divider' },\n {\n id: 'cut',\n label: 'Cut',\n shortcuts: ['X'],\n onClick: (ctx) => ctx.cut(),\n },\n {\n id: 'copy',\n label: 'Copy',\n shortcuts: ['C'],\n onClick: (ctx) => ctx.copy(),\n },\n {\n id: 'paste',\n label: 'Paste',\n shortcuts: ['V'],\n onClick: (ctx) => ctx.paste(false),\n },\n {\n id: 'paste-only-value',\n label: 'Paste only value',\n shortcuts: ['Shift+V'],\n onClick: (ctx) => ctx.paste(true),\n },\n { type: 'divider' },\n {\n id: 'insert-cols-left',\n label: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n return `Insert ${n} column${n > 1 ? 's' : ''} left`;\n },\n disabled: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsLeft)\n );\n },\n onClick: (ctx, x) => ctx.insertColsLeft(x, colInsertCount(ctx, x)),\n },\n {\n id: 'insert-cols-right',\n label: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n return `Insert ${n} column${n > 1 ? 's' : ''} right`;\n },\n disabled: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsRight)\n );\n },\n onClick: (ctx, x) => ctx.insertColsRight(x, colInsertCount(ctx, x)),\n },\n {\n id: 'remove-cols',\n label: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n return `Remove ${n} column${n > 1 ? 's' : ''}`;\n },\n disabled: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumCols !== -1 && sheet.numCols - n < sheet.minNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.RemoveCols)\n );\n },\n onClick: (ctx, x) => ctx.removeCols(x, colInsertCount(ctx, x)),\n },\n { type: 'divider' },\n {\n id: 'search',\n label: 'Search',\n shortcuts: ['F'],\n onClick: (ctx) => ctx.search(),\n },\n { type: 'divider' },\n { type: 'component', componentId: 'col-label' },\n];\n\n// ---- buildMenuContext -------------------------------------------------------\n\nexport function buildMenuContext(store: StoreType, dispatch: Dispatcher, close: () => void): MenuContext {\n const props = { store, dispatch };\n const sheet = store.sheetReactive.current!;\n\n return {\n sheet,\n choosing: store.choosing,\n selectingZone: store.selectingZone,\n leftHeaderSelecting: store.leftHeaderSelecting,\n topHeaderSelecting: store.topHeaderSelecting,\n\n cut: () => cutter(props),\n copy: () => copier(props),\n paste: (onlyValue = false) => paster(props, onlyValue),\n undo: () => undoer(props),\n redo: () => redoer(props),\n\n insertRowsAbove: (y, numRows) => {\n dispatch(_insertRowsAbove({ numRows, y, operator: 'USER' }));\n },\n insertRowsBelow: (y, numRows) => {\n dispatch(_insertRowsBelow({ numRows, y, operator: 'USER' }));\n },\n removeRows: (y, numRows) => {\n dispatch(_removeRows({ numRows, y, operator: 'USER' }));\n },\n insertColsLeft: (x, numCols) => {\n dispatch(_insertColsLeft({ numCols, x, operator: 'USER' }));\n },\n insertColsRight: (x, numCols) => {\n dispatch(_insertColsRight({ numCols, x, operator: 'USER' }));\n },\n removeCols: (x, numCols) => {\n dispatch(_removeCols({ numCols, x, operator: 'USER' }));\n },\n\n sortRows: async (x, direction) => {\n if (direction === 'asc') {\n await rowsSorterAsc(props, x);\n } else {\n await rowsSorterDesc(props, x);\n }\n },\n filterRows: async (x, filter) => {\n if (filter) {\n await rowsFilterer(props, x, filter);\n } else {\n rowsFilterClearer(props, x);\n }\n },\n clearFilter: (x) => rowsFilterClearer(props, x),\n\n toggleSortFixed: (y) => rowSortFixedToggler(props, y),\n toggleFilterFixed: (y) => rowFilterFixedToggler(props, y),\n\n search: () => searcher(props),\n\n updateColLabel: (x, label) => {\n if (!sheet) {\n return;\n }\n const addr = p2a({ y: 0, x });\n sheet.update({\n diff: { [addr]: { label: label || undefined } },\n partial: true,\n undoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n redoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n });\n dispatch(_setStore({ sheetReactive: { current: sheet } }));\n },\n\n close,\n };\n}\n\n// ---- menu component registry -----------------------------------------------\n\nimport type { FC } from 'react';\n\nexport type ContextMenuSectionProps = {\n close: () => void;\n};\n\nexport type RowMenuSectionProps = {\n y: number;\n close: () => void;\n};\n\nexport type ColMenuSectionProps = {\n x: number;\n close: () => void;\n /** Signal waiting state to parent menu. Pass null to clear. */\n onWaiting?: (message: string | null, cancel?: () => void) => void;\n};\n\nconst _menuComponentRegistry = new Map<string, FC<any>>();\n\n/**\n * Register a React component under a string id so it can be referenced in menu\n * descriptors via `{ type: 'component', componentId: '...' }`.\n *\n * Built-in ids: `'col-filter'`, `'col-sort'`, `'col-label'`.\n * You can override any built-in by registering your own component with the same id.\n */\n\nexport function registerMenuComponent(id: string, component: FC<any>): void {\n _menuComponentRegistry.set(id, component);\n}\n\n/** Look up a previously registered component by id. */\n\nexport function getMenuComponent(id: string): FC<any> | undefined {\n return _menuComponentRegistry.get(id);\n}\n","import type { FC } from 'react';\n\ntype MenuItemProps = {\n label: string;\n shortcuts?: string[];\n disabled?: boolean;\n /**\n * undefined → no check column\n * true/false → displayed as a toggle row with a checkmark\n */\n checked?: boolean;\n testId?: string;\n onClick?: () => void;\n className?: string;\n};\n\nexport const MenuItem: FC<MenuItemProps> = ({\n label,\n shortcuts,\n disabled = false,\n checked,\n testId,\n onClick,\n className,\n}) => {\n const hasCheck = checked !== undefined;\n return (\n <li\n className={`gs-menu-item ${disabled ? 'gs-disabled' : 'gs-enabled'}${className ? ` ${className}` : ''}`}\n data-testid={testId}\n onClick={disabled ? undefined : onClick}\n >\n <div className={`gs-menu-name${hasCheck ? ' gs-row-fixed-toggle' : ''}`}>\n {hasCheck && <span className={`gs-row-fixed-check${checked ? ' gs-row-fixed-active' : ''}`}>✓</span>}\n {label}\n </div>\n {shortcuts != null && shortcuts.length > 0 && (\n <div className=\"gs-menu-shortcut\">\n {shortcuts.map((shortcut, i) => (\n <span key={i}>\n {i > 0 && <span className=\"gs-menu-shortcut-sep\">, </span>}\n <span className=\"gs-menu-shortcut-badge\">\n {shortcut.split('+').map((part, j, arr) =>\n j < arr.length - 1 ? (\n <span key={j}>{part}+</span>\n ) : (\n <span key={j} className=\"gs-menu-underline\">\n {part}\n </span>\n ),\n )}\n </span>\n </span>\n ))}\n </div>\n )}\n </li>\n );\n};\n\nexport const MenuDivider: FC = () => <li className=\"gs-menu-divider\" />;\n","import { useContext, useRef, useEffect } from 'react';\n\nimport { setContextMenuPosition } from '../store/actions';\n\nimport { Context } from '../store';\nimport { Fixed } from './Fixed';\nimport type { ContextMenuItemDescriptor } from '../lib/menu';\nimport { buildMenuContext } from '../lib/menu';\nimport { MenuItem, MenuDivider } from './MenuItem';\nimport { clampPopup } from '@gridsheet/core';\n\nexport const ContextMenu = () => {\n const { store, dispatch } = useContext(Context);\n const { contextMenuPosition, contextMenu } = store;\n const { y: top, x: left } = contextMenuPosition;\n const menuRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (menuRef.current) {\n clampPopup(menuRef.current);\n }\n });\n\n if (top === -1) {\n return null;\n }\n\n const close = () => dispatch(setContextMenuPosition({ y: -1, x: -1 }));\n const ctx = buildMenuContext(store, dispatch, close);\n\n return (\n <Fixed\n className=\"gs-menu-modal gs-context-menu-modal\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n close();\n return false;\n }}\n >\n <div ref={menuRef} className={'gs-context-menu'} style={{ top: top, left: left }}>\n <ul className=\"gs-menu-items\">\n {contextMenu.map((d, i) => {\n if (d.type === 'divider') {\n if (d.visible && !d.visible(ctx)) {\n return null;\n }\n return <MenuDivider key={i} />;\n }\n if (d.type === 'component') {\n return null;\n }\n const visible = !d.visible || d.visible(ctx);\n if (!visible) {\n return null;\n }\n const disabled = d.disabled?.(ctx) ?? false;\n const label = typeof d.label === 'function' ? d.label(ctx) : d.label;\n const shortcuts = typeof d.shortcuts === 'function' ? d.shortcuts(ctx) : d.shortcuts;\n const checked = d.checked?.(ctx);\n return (\n <MenuItem\n key={i}\n label={label}\n shortcuts={shortcuts}\n disabled={disabled}\n checked={checked}\n testId={d.id ? `${d.id}-item` : undefined}\n onClick={() => d.onClick(ctx)}\n />\n );\n })}\n </ul>\n </div>\n </Fixed>\n );\n};\n","import { type FC, useContext, useState, useCallback, useEffect } from 'react';\nimport { Context } from '../store';\nimport { filterRows } from '../store/actions';\nimport type { FilterCondition, FilterConditionMethod } from '../types';\nimport { operations as prevention } from '@gridsheet/core';\nimport { registerMenuComponent, type ColMenuSectionProps } from '../lib/menu';\n\nconst METHOD_LABELS: Record<FilterConditionMethod, string> = {\n eq: '=',\n ne: '≠',\n gt: '>',\n gte: '≥',\n lt: '<',\n lte: '≤',\n blank: 'Blank',\n nonblank: 'Nonblank',\n includes: 'Includes',\n excludes: 'Excludes',\n};\n\nconst NO_VALUE_METHODS: FilterConditionMethod[] = ['blank', 'nonblank'];\nconst DEFAULT_CONDITION: FilterCondition = { method: 'eq', value: [''] };\n\ntype PendingFilter = {\n x: number;\n conditions: FilterCondition[];\n mode: 'and' | 'or';\n};\n\nconst FilterSection: FC<ColMenuSectionProps> = ({ x, close, onWaiting }) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n\n const [conditions, setConditions] = useState<FilterCondition[]>([{ ...DEFAULT_CONDITION }]);\n const [mode, setMode] = useState<'and' | 'or'>('or');\n const [pending, setPending] = useState<PendingFilter | null>(null);\n\n // Auto-focus first value input when x changes\n const firstValueRef = useCallback(\n (node: HTMLInputElement | null) => {\n if (node) {\n node.focus();\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [x],\n );\n\n // Restore conditions from existing filter on the column cell when x changes\n useEffect(() => {\n if (sheet) {\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const existing = colCell?.filter;\n if (existing && existing.conditions.length > 0) {\n setConditions(existing.conditions.map((c) => ({ ...c, value: [...c.value] })));\n setMode(existing.mode || 'or');\n } else {\n setConditions([{ ...DEFAULT_CONDITION, value: [''] }]);\n setMode('or');\n }\n }\n }, [x, sheet]);\n\n // Escape key cancels during waiting\n const handleCancel = useCallback(() => {\n setPending(null);\n onWaiting?.(null);\n close();\n }, [close, onWaiting]);\n\n // Notify parent about waiting state\n useEffect(() => {\n if (pending) {\n onWaiting?.('Filtering…', handleCancel);\n }\n // Do NOT include onWaiting/handleCancel in deps to avoid re-triggering execute\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n // Execute pending filter after async formulas resolve\n useEffect(() => {\n if (!pending) {\n return;\n }\n let cancelled = false;\n const execute = () => {\n if (cancelled) {\n return;\n }\n const currentSheet = sheetRef.current;\n if (!currentSheet) {\n return;\n }\n const { x: actionX, conditions: validConditions, mode: filterMode } = pending;\n if (validConditions.length > 0) {\n dispatch(filterRows({ x: actionX, filter: { mode: filterMode, conditions: validConditions } }));\n } else {\n dispatch(filterRows({ x: actionX }));\n }\n onWaiting?.(null);\n setPending(null);\n close();\n };\n const currentSheet = sheetRef.current;\n if (currentSheet && (currentSheet.hasPendingCells() || currentSheet.registry.asyncPending.size > 0)) {\n currentSheet.waitForPending().then(execute);\n } else {\n execute();\n }\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n const updateCondition = useCallback((index: number, patch: Partial<FilterCondition>) => {\n setConditions((prev) => {\n const next = [...prev];\n next[index] = { ...next[index], ...patch };\n return next;\n });\n }, []);\n\n const addCondition = useCallback(() => {\n setConditions((prev) => [...prev, { ...DEFAULT_CONDITION, value: [''] }]);\n }, []);\n\n const removeCondition = useCallback((index: number) => {\n setConditions((prev) => {\n if (prev.length <= 1) {\n return [{ ...DEFAULT_CONDITION, value: [''] }];\n }\n return prev.filter((_, i) => i !== index);\n });\n }, []);\n\n const handleApplyFilter = useCallback(() => {\n const valid = conditions.filter((c) => {\n if (NO_VALUE_METHODS.includes(c.method)) {\n return true;\n }\n return c.value.some((v) => v.trim() !== '');\n });\n setPending({ x, conditions: valid, mode });\n }, [x, conditions, mode]);\n\n const handleResetColumn = useCallback(() => {\n setPending(null);\n dispatch(filterRows({ x }));\n close();\n }, [dispatch, x, close]);\n\n const handleResetAll = useCallback(() => {\n setPending(null);\n dispatch(filterRows({}));\n close();\n }, [dispatch, close]);\n\n if (!sheet) {\n return null;\n }\n\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const filterDisabled = prevention.hasOperation(colCell?.prevention, prevention.Filter);\n const hasAnyFilter = sheet.hasActiveFilters();\n\n return (\n <li className={`gs-column-menu-filter${filterDisabled ? ' gs-disabled' : ''}`}>\n <>\n <div className=\"gs-filter-header\">\n <div className=\"gs-menu-name\">Filter:</div>\n <button className=\"gs-filter-add-btn\" onClick={addCondition} disabled={filterDisabled}>\n + ADD\n </button>\n <div className={`gs-filter-mode-toggle${conditions.length <= 1 ? ' gs-disabled' : ''}`}>\n <label className={mode === 'and' ? 'gs-active' : ''}>\n <input\n type=\"radio\"\n name=\"gs-filter-mode\"\n checked={mode === 'and'}\n onChange={() => setMode('and')}\n disabled={filterDisabled || conditions.length <= 1}\n />\n AND\n </label>\n <label className={mode === 'or' ? 'gs-active' : ''}>\n <input\n type=\"radio\"\n name=\"gs-filter-mode\"\n checked={mode === 'or'}\n onChange={() => setMode('or')}\n disabled={filterDisabled || conditions.length <= 1}\n />\n OR\n </label>\n </div>\n </div>\n <div className=\"gs-filter-conditions\">\n {conditions.map((cond, i) => (\n <div className=\"gs-filter-condition-row\" key={i}>\n <select\n className=\"gs-filter-method-select\"\n value={cond.method}\n disabled={filterDisabled}\n tabIndex={i * 2 + 1}\n onChange={(e) => updateCondition(i, { method: e.target.value as FilterConditionMethod })}\n >\n {(Object.keys(METHOD_LABELS) as FilterConditionMethod[]).map((m) => (\n <option key={m} value={m}>\n {METHOD_LABELS[m]}\n </option>\n ))}\n </select>\n {!NO_VALUE_METHODS.includes(cond.method) && (\n <input\n ref={i === 0 ? firstValueRef : undefined}\n className=\"gs-filter-value-input\"\n type=\"text\"\n placeholder=\"Value\"\n value={cond.value[0] || ''}\n disabled={filterDisabled}\n tabIndex={i * 2 + 2}\n onChange={(e) => updateCondition(i, { value: [e.target.value] })}\n onKeyDown={(e) => {\n if (e.nativeEvent.isComposing) {\n return;\n }\n if (e.key === 'Enter') {\n handleApplyFilter();\n }\n if (e.key === 'Escape') {\n close();\n }\n }}\n />\n )}\n <button\n className=\"gs-filter-remove-btn\"\n onClick={() => removeCondition(i)}\n disabled={filterDisabled}\n title=\"Remove condition\"\n >\n ✕\n </button>\n </div>\n ))}\n </div>\n <div className=\"gs-filter-actions\">\n {hasAnyFilter && (\n <button className=\"gs-filter-reset-all-btn\" onClick={handleResetAll}>\n RESET ALL\n </button>\n )}\n <div className=\"gs-filter-actions-right\">\n {colCell?.filter && (\n <button className=\"gs-filter-reset-btn\" onClick={handleResetColumn}>\n RESET\n </button>\n )}\n <button className=\"gs-filter-apply-btn\" onClick={handleApplyFilter} disabled={filterDisabled}>\n APPLY\n </button>\n </div>\n </div>\n </>\n </li>\n );\n};\n\nregisterMenuComponent('col-filter', FilterSection);\nexport { FilterSection };\n","import { type FC, useContext, useState, useCallback, useEffect } from 'react';\nimport { Context } from '../store';\nimport { sortRows } from '../store/actions';\nimport { operations as prevention } from '@gridsheet/core';\nimport { registerMenuComponent, type ColMenuSectionProps } from '../lib/menu';\n\ntype PendingSort = {\n x: number;\n direction: 'asc' | 'desc';\n};\n\nconst SortSection: FC<ColMenuSectionProps> = ({ x, close, onWaiting }) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n\n const [pending, setPending] = useState<PendingSort | null>(null);\n\n const handleCancel = useCallback(() => {\n setPending(null);\n onWaiting?.(null);\n close();\n }, [close, onWaiting]);\n\n // Notify parent about waiting state\n useEffect(() => {\n if (pending) {\n onWaiting?.('Sorting\\u2026', handleCancel);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n // Execute pending sort after async formulas resolve\n useEffect(() => {\n if (!pending) {\n return;\n }\n let cancelled = false;\n const execute = () => {\n if (cancelled) {\n return;\n }\n const currentSheet = sheetRef.current;\n if (!currentSheet) {\n return;\n }\n dispatch(sortRows({ x: pending.x, direction: pending.direction }));\n onWaiting?.(null);\n setPending(null);\n close();\n };\n const currentSheet = sheetRef.current;\n if (currentSheet && (currentSheet.hasPendingCells() || currentSheet.registry.asyncPending.size > 0)) {\n currentSheet.waitForPending().then(execute);\n } else {\n execute();\n }\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n if (!sheet) {\n return null;\n }\n\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const sortDisabled = prevention.hasOperation(colCell?.prevention, prevention.Sort);\n\n return (\n <li className={`gs-menu-item gs-column-menu-sort${sortDisabled ? ' gs-disabled' : ''}`}>\n <div className=\"gs-menu-name\">Sort:</div>\n <div className=\"gs-sort-buttons\">\n <button\n className=\"gs-sort-btn gs-sort-btn-asc\"\n onClick={(e) => {\n e.stopPropagation();\n if (!sortDisabled) {\n setPending({ x, direction: 'asc' });\n }\n }}\n disabled={sortDisabled}\n >\n ↓ A to Z\n </button>\n <button\n className=\"gs-sort-btn gs-sort-btn-desc\"\n onClick={(e) => {\n e.stopPropagation();\n if (!sortDisabled) {\n setPending({ x, direction: 'desc' });\n }\n }}\n disabled={sortDisabled}\n >\n ↑ Z to A\n </button>\n </div>\n </li>\n );\n};\n\nregisterMenuComponent('col-sort', SortSection);\nexport { SortSection };\n","import { type FC, useContext, useState, useCallback, useEffect, useRef } from 'react';\nimport { Context } from '../store';\nimport { setStore } from '../store/actions';\nimport { operations as prevention } from '@gridsheet/core';\nimport { x2c, p2a } from '@gridsheet/core';\nimport { getLabel } from '@gridsheet/core';\nimport { registerMenuComponent, type ColMenuSectionProps } from '../lib/menu';\n\nconst LabelSection: FC<ColMenuSectionProps> = ({ x, close }) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n const labelInputRef = useRef<HTMLInputElement>(null);\n const [label, setLabel] = useState('');\n\n // Restore label value when x changes\n useEffect(() => {\n if (sheet) {\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n setLabel(colCell?.label ?? '');\n }\n }, [x, sheet]);\n\n const handleApplyLabel = useCallback(() => {\n if (!sheet) {\n return;\n }\n const address = p2a({ y: 0, x });\n sheet.update({\n diff: { [address]: { label: label || undefined } },\n partial: true,\n ignoreFields: [],\n undoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n redoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n });\n dispatch(setStore({ sheetReactive: { current: sheet } }));\n close();\n }, [dispatch, x, label, close, sheet, store.selectingZone, store.choosing]);\n\n if (!sheet) {\n return null;\n }\n\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const labelDisabled = prevention.hasOperation(colCell?.prevention, prevention.SetLabel);\n const labelPlaceholder = getLabel(sheet, colCell?.label, { y: 0, x }, x) ?? x2c(x);\n\n return (\n <li className={`gs-menu-item gs-column-menu-label${labelDisabled ? ' gs-disabled' : ''}`}>\n <label className=\"gs-label-input-row\">\n <div className=\"gs-label-input-label\">Label:</div>\n <input\n ref={labelInputRef}\n className=\"gs-label-input\"\n type=\"text\"\n placeholder={labelPlaceholder}\n value={label}\n disabled={labelDisabled}\n onChange={(e) => setLabel(e.target.value)}\n onKeyDown={(e) => {\n if (e.nativeEvent.isComposing) {\n return;\n }\n if (e.key === 'Enter') {\n handleApplyLabel();\n }\n if (e.key === 'Escape') {\n close();\n }\n }}\n />\n <button className=\"gs-label-apply-btn\" onClick={handleApplyLabel} disabled={labelDisabled}>\n UPDATE\n </button>\n </label>\n </li>\n );\n};\n\nregisterMenuComponent('col-label', LabelSection);\nexport { LabelSection };\n","import { type FC, useContext, useCallback, useState } from 'react';\nimport { Context } from '../store';\nimport { setColumnMenu } from '../store/actions';\nimport { Fixed } from './Fixed';\nimport { focus } from '@gridsheet/core';\nimport { buildMenuContext } from '../lib/menu';\nimport { getMenuComponent } from '../lib/menu';\nimport { MenuItem, MenuDivider } from './MenuItem';\n\n// Import section modules so their registerMenuComponent() calls run at load time.\n// Users may override any of these ids via registerMenuComponent() after import.\nimport './ColumnMenuFilterSection';\nimport './ColumnMenuSortSection';\nimport './ColumnMenuLabelSection';\n\nexport const ColumnMenu: FC = () => {\n const { store, dispatch } = useContext(Context);\n const { columnMenuState, editorRef, colMenu } = store;\n const sheet = store.sheetReactive.current;\n\n const x = columnMenuState?.x;\n const position = columnMenuState?.position;\n\n const [waitingState, setWaitingState] = useState<{ message: string; cancel: () => void } | null>(null);\n\n const handleClose = useCallback(() => {\n dispatch(setColumnMenu(null));\n focus(editorRef.current);\n }, [dispatch, editorRef]);\n\n const handleWaiting = useCallback(\n (message: string | null, cancel?: () => void) => {\n if (message) {\n setWaitingState({ message, cancel: cancel ?? handleClose });\n } else {\n setWaitingState(null);\n }\n },\n [handleClose],\n );\n\n if (!columnMenuState || !sheet || x == null || !position) {\n return null;\n }\n\n const ctx = buildMenuContext(store, dispatch, handleClose);\n\n return (\n <Fixed\n className=\"gs-menu-modal gs-column-menu-modal\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n if (!waitingState) {\n handleClose();\n }\n return false;\n }}\n >\n <div\n className=\"gs-column-menu\"\n style={{ top: position.y, left: position.x, display: waitingState ? 'none' : undefined }}\n onClick={(e) => e.stopPropagation()}\n >\n <ul className=\"gs-menu-items\">\n {colMenu.map((descriptor, index) => {\n if (descriptor.type === 'component') {\n const visible = !descriptor.visible || descriptor.visible(ctx, x);\n if (!visible) {\n return null;\n }\n const Section = getMenuComponent(descriptor.componentId);\n if (!Section) {\n return null;\n }\n return <Section key={index} x={x} close={handleClose} onWaiting={handleWaiting} />;\n }\n if (descriptor.type === 'divider') {\n if (descriptor.visible && !descriptor.visible(ctx)) {\n return null;\n }\n return <MenuDivider key={index} />;\n }\n const visible = !descriptor.visible || descriptor.visible(ctx, x);\n if (!visible) {\n return null;\n }\n const disabled = descriptor.disabled?.(ctx, x) ?? false;\n const label = typeof descriptor.label === 'function' ? descriptor.label(ctx, x) : descriptor.label;\n const shortcuts =\n typeof descriptor.shortcuts === 'function' ? descriptor.shortcuts(ctx, x) : descriptor.shortcuts;\n return (\n <MenuItem\n key={index}\n label={label}\n shortcuts={shortcuts}\n disabled={disabled}\n testId={descriptor.id ? `${descriptor.id}-item` : undefined}\n onClick={() => {\n descriptor.onClick(ctx, x);\n dispatch(setColumnMenu(null));\n }}\n />\n );\n })}\n </ul>\n </div>\n {waitingState && (\n <div\n className=\"gs-column-menu gs-column-menu-waiting\"\n style={{ top: position.y, left: position.x }}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"gs-waiting-message\">{waitingState.message}</div>\n <div className=\"gs-waiting-spinner\" />\n <button className=\"gs-waiting-cancel-btn\" onClick={waitingState.cancel}>\n CANCEL\n </button>\n </div>\n )}\n </Fixed>\n );\n};\n","import { type FC, useContext } from 'react';\nimport { Context } from '../store';\nimport { setRowMenu } from '../store/actions';\nimport { Fixed } from './Fixed';\nimport { focus } from '@gridsheet/core';\nimport type { RowMenuItemDescriptor } from '../lib/menu';\nimport { buildMenuContext } from '../lib/menu';\nimport { MenuItem, MenuDivider } from './MenuItem';\n\nfunction renderRowDescriptor(\n descriptor: RowMenuItemDescriptor,\n ctx: ReturnType<typeof buildMenuContext>,\n y: number,\n index: number,\n close: () => void,\n) {\n if (descriptor.type === 'divider') {\n return <MenuDivider key={index} />;\n }\n if (descriptor.type === 'component') {\n return null;\n }\n const visible = !descriptor.visible || descriptor.visible(ctx, y);\n if (!visible) {\n return null;\n }\n const disabled = descriptor.disabled?.(ctx, y) ?? false;\n const label = typeof descriptor.label === 'function' ? descriptor.label(ctx, y) : descriptor.label;\n const shortcuts = typeof descriptor.shortcuts === 'function' ? descriptor.shortcuts(ctx, y) : descriptor.shortcuts;\n const checked = descriptor.checked != null ? descriptor.checked(ctx, y) : undefined;\n return (\n <MenuItem\n key={index}\n label={label}\n shortcuts={shortcuts}\n disabled={disabled}\n checked={checked}\n testId={descriptor.id ? `${descriptor.id}-item` : undefined}\n onClick={() => {\n descriptor.onClick(ctx, y);\n close();\n }}\n />\n );\n}\n\nexport const RowMenu: FC = () => {\n const { store, dispatch } = useContext(Context);\n const { rowMenuState, sheetReactive: sheetRef, editorRef, rowMenu } = store;\n const sheet = sheetRef.current;\n\n const y = rowMenuState?.y;\n const position = rowMenuState?.position;\n\n const handleClose = () => {\n dispatch(setRowMenu(null));\n focus(editorRef.current);\n };\n\n if (!rowMenuState || !sheet || y == null || !position) {\n return null;\n }\n\n const ctx = buildMenuContext(store, dispatch, handleClose);\n\n return (\n <Fixed\n className=\"gs-menu-modal gs-row-menu-modal\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n handleClose();\n return false;\n }}\n >\n <div className=\"gs-row-menu\" style={{ top: position.y, left: position.x }} onClick={(e) => e.stopPropagation()}>\n <ul className=\"gs-menu-items\">\n {rowMenu.map((descriptor, index) => renderRowDescriptor(descriptor, ctx, y, index, handleClose))}\n </ul>\n </div>\n </Fixed>\n );\n};\n","export const isTouching = (e: React.TouchEvent | React.MouseEvent): boolean => {\n if (e.type.startsWith('touch')) {\n return (e as React.TouchEvent).touches.length > 0;\n }\n if (e.type.startsWith('mouse')) {\n const mouseEvent = e as React.MouseEvent;\n // left click only\n return !!(mouseEvent.buttons & 1) && mouseEvent.button === 0;\n }\n return false;\n};\n\n/**\n * Safely call preventDefault to avoid errors on touch events\n */\nexport const safePreventDefault = (e: React.MouseEvent | React.TouchEvent): void => {\n if (!e.type.startsWith('touch')) {\n e.preventDefault();\n }\n};\n","import { useContext, useRef, useCallback, useEffect, memo, useMemo, useState } from 'react';\nimport { x2c, y2r } from '@gridsheet/core';\nimport { zoneToArea, among, areaToRange } from '@gridsheet/core';\nimport {\n choose,\n select,\n drag,\n write,\n setEditorRect,\n setContextMenuPosition,\n setAutofillDraggingTo,\n setEditingAddress,\n setDragging,\n submitAutofill,\n setStore,\n} from '../store/actions';\n\nimport { Context } from '../store';\nimport { FormulaError } from '@gridsheet/core';\nimport { Pending } from '@gridsheet/core';\nimport { insertRef, isRefInsertable } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { isXSheetFocused } from '../store/helpers';\nimport type { FC, RefObject } from 'react';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport type { UserSheet } from '@gridsheet/core';\nimport { calcBelowPosition, hAlignTransform, type PopupPosition } from '@gridsheet/core';\n\ntype Props = {\n y: number;\n x: number;\n};\n\nexport const Cell: FC<Props> = memo(({ y, x }) => {\n const rowId = y2r(y);\n const colId = x2c(x);\n const address = `${colId}${rowId}`;\n const { store, dispatch } = useContext(Context);\n const isFirstPointed = useRef(true);\n\n const cellRef = useRef<HTMLTableCellElement>(null);\n const [errorTooltipPos, setErrorTooltipPos] = useState<PopupPosition | null>(null);\n const {\n sheetReactive,\n editingAddress,\n choosing,\n selectingZone,\n leftHeaderSelecting,\n topHeaderSelecting,\n editorRef,\n autofillDraggingTo,\n contextMenu,\n } = store;\n const sheet = sheetReactive.current;\n\n // Whether the focus is on another sheet\n const xSheetFocused = isXSheetFocused(store);\n\n const lastFocused = sheet?.registry.lastFocused;\n\n const selectingArea = zoneToArea(selectingZone); // (top, left) -> (bottom, right)\n\n const editing = editingAddress === address;\n const pointed = choosing.y === y && choosing.x === x;\n const _setEditorRect = useCallback(() => {\n const rect = cellRef.current?.getBoundingClientRect();\n if (rect == null) {\n return null;\n }\n dispatch(\n setEditorRect({\n y: rect.y,\n x: rect.x,\n height: rect.height,\n width: rect.width,\n }),\n );\n }, [dispatch]);\n\n useEffect(() => {\n // Avoid setting coordinates on the initial render to account for shifts caused by redrawing due to virtualization.\n if (pointed && !isFirstPointed.current) {\n _setEditorRect();\n return;\n }\n isFirstPointed.current = false;\n }, [pointed, editing, _setEditorRect]);\n\n const cell = sheet?.getCell({ y, x }, { resolution: 'SYSTEM' });\n\n const writeCell = useCallback(\n (value: string) => {\n dispatch(write({ value }));\n },\n [dispatch],\n );\n\n const apply = useCallback(\n (sheet: UserSheet) => {\n dispatch(setStore({ sheetReactive: { current: sheet.__raw__ } }));\n },\n [dispatch],\n );\n\n let errorMessage = '';\n let rendered: any;\n try {\n if (sheet) {\n rendered = sheet.render({ sheet, point: { y, x }, apply, value: undefined });\n }\n } catch (e: any) {\n if (FormulaError.is(e)) {\n errorMessage = e.message;\n rendered = e.code;\n } else {\n errorMessage = e.message;\n rendered = '#UNKNOWN';\n }\n }\n const [, v] = sheet?.getSolvedCache({ y, x }) ?? [undefined, undefined];\n const isPendingCell = Pending.is(v);\n const input = editorRef.current;\n\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const handleDragStart = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n safePreventDefault(e);\n\n if (!sheet) {\n return false;\n }\n if (!isTouching(e)) {\n return false;\n }\n if (!input) {\n return false;\n }\n\n // Single cell selection only for touch events\n if (e.type.startsWith('touch')) {\n // Blur the input field to commit current value when selecting via touch\n if (editingAnywhere && input) {\n input.blur();\n }\n dispatch(choose({ y, x }));\n dispatch(select({ startY: y, startX: x, endY: y, endX: x }));\n return true;\n }\n\n // Normal drag operation for mouse events\n if (e.shiftKey) {\n dispatch(drag({ y, x }));\n } else {\n dispatch(select({ startY: y, startX: x, endY: -1, endX: -1 }));\n }\n\n dispatch(setDragging(true));\n const fullAddress = `${sheet.sheetPrefix(!xSheetFocused)}${address}`;\n if (editingAnywhere) {\n const inserted = insertRef({ input: lastFocused || null, ref: fullAddress });\n if (inserted) {\n return false;\n }\n }\n\n sheet.registry.lastFocused = input;\n focus(input);\n dispatch(setEditingAddress(''));\n\n if (autofillDraggingTo) {\n return false;\n }\n\n if (editingAnywhere) {\n writeCell(input.value);\n }\n if (!e.shiftKey) {\n dispatch(choose({ y, x }));\n }\n return true;\n },\n [editingAnywhere, input, address, xSheetFocused, lastFocused, autofillDraggingTo, writeCell, sheet],\n );\n\n const handleDragEnd = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n if (e.type.startsWith('touch')) {\n return;\n }\n\n safePreventDefault(e);\n dispatch(setDragging(false));\n if (autofillDraggingTo) {\n dispatch(submitAutofill(autofillDraggingTo));\n focus(input);\n return false;\n }\n if (editingAnywhere) {\n dispatch(drag({ y: -1, x: -1 }));\n }\n },\n [autofillDraggingTo, editingAnywhere, input],\n );\n\n const handleDragging = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n if (!isTouching(e)) {\n return false;\n }\n\n // Do nothing for touch events\n if (e.type.startsWith('touch')) {\n return false;\n }\n\n if (!sheet) {\n return false;\n }\n\n safePreventDefault(e);\n e.stopPropagation();\n\n if (autofillDraggingTo) {\n dispatch(setAutofillDraggingTo({ x, y }));\n return false;\n }\n if (leftHeaderSelecting) {\n dispatch(drag({ y, x: sheet.numCols }));\n return false;\n }\n if (topHeaderSelecting) {\n dispatch(drag({ y: sheet.numRows, x }));\n return false;\n }\n if (editingAnywhere && !isRefInsertable(lastFocused || null)) {\n return false;\n }\n dispatch(drag({ y, x }));\n\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: y, endX: x });\n const fullRange = `${sheet.sheetPrefix(!xSheetFocused)}${areaToRange(newArea)}`;\n insertRef({ input: lastFocused || null, ref: fullRange });\n }\n //sheet.registry.transmit(); // Force drawing because the formula is not reflected in largeInput\n return true;\n },\n [\n autofillDraggingTo,\n leftHeaderSelecting,\n topHeaderSelecting,\n sheet,\n editingAnywhere,\n lastFocused,\n selectingZone,\n xSheetFocused,\n ],\n );\n\n const handleAutofillMouseDown = useCallback(\n (e: React.MouseEvent) => {\n dispatch(setAutofillDraggingTo({ x, y }));\n dispatch(setDragging(true));\n e.stopPropagation();\n },\n [dispatch, x, y],\n );\n\n const handleErrorTriangleEnter = useCallback(() => {\n const rect = cellRef.current?.getBoundingClientRect();\n if (!rect) {\n return;\n }\n setErrorTooltipPos(calcBelowPosition(rect));\n }, []);\n\n const handleErrorTriangleLeave = useCallback(() => {\n setErrorTooltipPos(null);\n }, []);\n\n // --- Memoize event handlers with useCallback ---\n const onContextMenu = useCallback(\n (e: React.MouseEvent<HTMLTableCellElement>) => {\n if (contextMenu.length > 0) {\n e.stopPropagation();\n safePreventDefault(e);\n dispatch(setContextMenuPosition({ y: e.clientY, x: e.clientX }));\n return false;\n }\n return true;\n },\n [contextMenu.length],\n );\n\n const onDoubleClick = useCallback(\n (e: React.MouseEvent<HTMLTableCellElement>) => {\n e.stopPropagation();\n safePreventDefault(e);\n setEditingAddress(address);\n const dblclick = document.createEvent('MouseEvents');\n dblclick.initEvent('dblclick', true, true);\n input?.dispatchEvent(dblclick);\n return false;\n },\n [address, input],\n );\n\n const autofillDragClass = useMemo(() => {\n if (!editing && pointed && selectingArea.bottom === -1) {\n return 'gs-autofill-drag';\n }\n\n if (selectingArea.bottom === y && selectingArea.right === x) {\n return 'gs-autofill-drag';\n }\n return 'gs-autofill-drag gs-hidden';\n }, [editing, pointed, selectingArea]);\n\n if (!sheet) {\n return null;\n }\n\n if (!input) {\n return (\n <td key={x} data-x={x} data-y={y} data-address={address} className=\"gs-cell gs-hidden\">\n <div className=\"gs-cell-inner-wrap\">\n <div className=\"gs-cell-inner\">\n <div className=\"gs-cell-rendered\"></div>\n </div>\n <div className=\"gs-autofill-drag\"></div>\n </div>\n </td>\n );\n }\n\n return (\n <td\n key={x}\n ref={cellRef}\n data-x={x}\n data-y={y}\n data-address={address}\n className={`gs-cell ${among(selectingArea, { y, x }) ? 'gs-selecting' : ''} ${pointed ? 'gs-choosing' : ''} ${\n editing ? 'gs-editing' : ''\n } ${isPendingCell ? 'gs-pending' : ''}`}\n style={{\n ...cell?.style,\n }}\n onContextMenu={onContextMenu}\n onDoubleClick={onDoubleClick}\n >\n <div\n className={`gs-cell-inner-wrap`}\n onMouseDown={handleDragStart}\n onTouchStart={handleDragStart}\n onMouseEnter={handleDragging}\n onMouseUp={handleDragEnd}\n >\n <div\n className={'gs-cell-inner'}\n style={{\n ...cell?.style,\n textAlign: cell?.style?.textAlign || cell?.justifyContent || 'left',\n alignItems: cell?.alignItems || 'start',\n }}\n >\n {errorMessage && (\n <div\n className=\"gs-formula-error-triangle\"\n onMouseEnter={handleErrorTriangleEnter}\n onMouseLeave={handleErrorTriangleLeave}\n />\n )}\n <div\n className=\"gs-cell-rendered\"\n style={\n cell?.alignItems\n ? {\n display: 'flex',\n flexDirection: 'column',\n justifyContent:\n cell.alignItems === 'center' ? 'center' : cell.alignItems === 'end' ? 'flex-end' : undefined,\n }\n : undefined\n }\n >\n {rendered}\n </div>\n </div>\n {errorMessage && errorTooltipPos && (\n <div\n className=\"gs-formula-error-tooltip\"\n style={{\n top: errorTooltipPos.y + 4,\n left: errorTooltipPos.x,\n transform: hAlignTransform(errorTooltipPos.hAlign),\n }}\n >\n {errorMessage}\n </div>\n )}\n <div className={autofillDragClass} onMouseDown={handleAutofillMouseDown}></div>\n </div>\n </td>\n );\n});\n","import type { CSSProperties } from 'react';\nimport { useEffect, useRef, useContext, useCallback } from 'react';\nimport { Context } from '../store';\nimport { drag, setAutofillDraggingTo, setDragging, submitAutofill } from '../store/actions';\nimport { getAreaInTabular } from '@gridsheet/core';\nimport { insertRef, isFocus } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { areaToRange, zoneToArea } from '@gridsheet/core';\nimport { isXSheetFocused } from '../store/helpers';\n\ntype Props = {\n className?: string;\n style: CSSProperties;\n horizontal?: number;\n vertical?: number;\n};\n\nconst acceleration = 0.4;\nconst maxSpeed = 200;\n\nlet lastScrollTime = new Date().getTime();\nlet currentSpeed = 0;\n\nexport function ScrollHandle({ style, horizontal = 0, vertical = 0, className = '' }: Props) {\n const scrollRef = useRef<number | null>(null);\n const { store, dispatch } = useContext(Context);\n const {\n tabularRef,\n autofillDraggingTo,\n dragging,\n selectingZone,\n editorRef,\n sheetReactive: sheetRef,\n searchInputRef,\n editingAddress,\n } = store;\n const sheet = sheetRef.current;\n\n let isScrolling = false;\n const xSheetFocused = isXSheetFocused(store);\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const getDestEdge = useCallback(\n (e: React.MouseEvent) => {\n if (!sheet) {\n return { x: -1, y: -1 };\n }\n if (horizontal == 0 && vertical == 0) {\n const tabularRect = tabularRef.current!.getBoundingClientRect();\n const { left, top, right, bottom } = tabularRect;\n horizontal = e.pageX > right ? 1 : e.pageX < left ? -1 : 0;\n if (horizontal === 0) {\n vertical = e.pageY > bottom ? 1 : e.pageY < top ? -1 : 0;\n }\n }\n const area = getAreaInTabular(tabularRef.current!);\n let { endX: x, endY: y } = selectingZone;\n if (horizontal) {\n x = horizontal > 0 ? area.right : area.left;\n } else if (vertical) {\n y = vertical > 0 ? area.bottom : area.top;\n }\n return { x, y };\n },\n [sheet, horizontal, vertical, selectingZone],\n );\n\n const scrollStep = useCallback(\n (e: React.MouseEvent) => {\n if (!isScrolling || tabularRef.current === null || !sheet) {\n return;\n }\n const now = new Date().getTime();\n if (now - lastScrollTime > 1000) {\n currentSpeed = 0;\n }\n lastScrollTime = now;\n\n tabularRef.current.scrollBy({\n left: currentSpeed * horizontal!,\n top: currentSpeed * vertical!,\n });\n focus(editorRef.current);\n\n const { x, y } = getDestEdge(e);\n if (autofillDraggingTo) {\n const { y: curY, x: curX } = autofillDraggingTo;\n dispatch(setAutofillDraggingTo({ y: y === -1 ? curY : y, x: x === -1 ? curX : x }));\n } else {\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: y, endX: x });\n const sheetPrefix = sheet.sheetPrefix(!xSheetFocused);\n const sheetRange = areaToRange(newArea);\n const fullRange = `${sheetPrefix}${sheetRange}`;\n insertRef({ input: editorRef.current, ref: fullRange });\n }\n dispatch(drag({ y, x }));\n }\n currentSpeed = Math.min(currentSpeed + acceleration, maxSpeed);\n scrollRef.current = requestAnimationFrame(() => scrollStep(e));\n },\n [\n isScrolling,\n sheet,\n horizontal,\n vertical,\n autofillDraggingTo,\n editingAnywhere,\n selectingZone,\n xSheetFocused,\n getDestEdge,\n ],\n );\n\n const handleMouseEnter = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (isScrolling) {\n return;\n }\n isScrolling = true;\n\n if (horizontal === 0 || vertical === 0) {\n const tabularRect = tabularRef.current!.getBoundingClientRect();\n const { left, top, right, bottom } = tabularRect;\n\n horizontal ||= e.pageX > right ? 1 : e.pageX < left ? -1 : 0;\n if (horizontal === 0) {\n vertical ||= e.pageY > bottom ? 1 : e.pageY < top ? -1 : 0;\n }\n }\n scrollRef.current = requestAnimationFrame(() => scrollStep(e));\n },\n [isScrolling, horizontal, vertical, scrollStep],\n );\n\n const stopScroll = useCallback(() => {\n if (scrollRef.current !== null) {\n cancelAnimationFrame(scrollRef.current);\n scrollRef.current = null;\n }\n isScrolling = false;\n if (!isFocus(searchInputRef.current)) {\n // Pressing Enter on a search result will not focus the editor.\n focus(editorRef.current);\n }\n }, []);\n\n const handleMouseUp = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const area = getAreaInTabular(tabularRef.current!);\n if (area.bottom === -1 || area.right === -1) {\n return;\n }\n\n const { x, y } = getDestEdge(e);\n if (autofillDraggingTo) {\n const { y: curY, x: curX } = autofillDraggingTo;\n dispatch(submitAutofill({ y: y === -1 ? curY : y, x: x === -1 ? curX : x }));\n focus(editorRef.current);\n } else {\n if (editingAnywhere) {\n // inserting a range\n dispatch(drag({ y: -1, x: -1 })); // Reset dragging\n }\n }\n },\n [autofillDraggingTo, editingAnywhere, getDestEdge],\n );\n\n const handleMouseUpWrapper = useCallback(\n (e: React.MouseEvent) => {\n stopScroll();\n dispatch(setDragging(false));\n requestAnimationFrame(() => handleMouseUp(e));\n },\n [stopScroll, handleMouseUp],\n );\n\n const handleMouseLeave = useCallback(() => {\n stopScroll();\n }, [stopScroll]);\n\n useEffect(() => {\n return stopScroll;\n }, [stopScroll]);\n\n if (!editorRef.current || (!dragging && !autofillDraggingTo)) {\n return <div className={`gs-scroll-handle gs-hidden ${className}`} />;\n }\n\n return (\n <div\n style={style}\n className={`gs-scroll-handle ${className}`}\n onMouseUp={(e) => {\n handleMouseUpWrapper(e);\n }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n />\n );\n}\n","import type { FC } from 'react';\nimport { useContext, useCallback, memo, useRef } from 'react';\nimport { x2c } from '@gridsheet/core';\nimport { getLabel } from '@gridsheet/core';\nimport { between, zoneToArea } from '@gridsheet/core';\nimport { Context } from '../store';\nimport {\n choose,\n drag,\n select,\n selectCols,\n setAutofillDraggingTo,\n setColumnMenu,\n setContextMenuPosition,\n setDragging,\n setEditingAddress,\n setResizingPositionX,\n submitAutofill,\n write,\n} from '../store/actions';\nimport { DEFAULT_WIDTH } from '@gridsheet/core';\nimport { operations as prevention } from '@gridsheet/core';\nimport { insertRef } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { isXSheetFocused } from '../store/helpers';\nimport { ScrollHandle } from './ScrollHandle';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport { useDebounceCallback } from '../lib/hooks';\n\ntype Props = {\n x: number;\n};\n\nexport const HeaderCellTop: FC<Props> = memo(({ x }) => {\n const colId = x2c(x);\n const { store, dispatch } = useContext(Context);\n\n const {\n sheetReactive: sheetRef,\n editingAddress,\n choosing,\n selectingZone,\n topHeaderSelecting,\n editorRef,\n autofillDraggingTo,\n dragging,\n contextMenu,\n columnMenuState,\n } = store;\n const sheet = sheetRef.current;\n\n const col = sheet?.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const width = col?.width || DEFAULT_WIDTH;\n const hasFilter = !!(col?.filter && col.filter.conditions.length > 0);\n\n const xSheetFocused = isXSheetFocused(store);\n const lastFocused = sheet?.registry.lastFocused;\n\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const writeCell = useCallback(\n (value: string) => {\n dispatch(write({ value, point: choosing }));\n },\n [choosing],\n );\n\n const handleResizeMouseDown = useCallback((e: React.MouseEvent) => {\n dispatch(setResizingPositionX([x, e.clientX, e.clientX]));\n e.stopPropagation();\n safePreventDefault(e);\n }, []);\n\n const handleDragStart = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n safePreventDefault(e);\n\n if (!isTouching(e) || !sheet) {\n return false;\n }\n\n if (dragging) {\n return false;\n }\n\n // Single column selection only for touch events\n if (e.type.startsWith('touch')) {\n // Blur the input field to commit current value when selecting via touch\n if (editingAnywhere && editorRef.current) {\n editorRef.current.blur();\n }\n dispatch(choose({ y: 1, x }));\n dispatch(select({ startY: 1, startX: x, endY: sheet.numRows, endX: x }));\n return true;\n }\n\n dispatch(select({ startY: 1, startX: x, endY: -1, endX: x }));\n const fullAddress = `${sheet.sheetPrefix(!xSheetFocused)}${colId}:${colId}`;\n if (editingAnywhere) {\n const inserted = insertRef({ input: lastFocused || null, ref: fullAddress });\n if (inserted) {\n dispatch(select({ startY: sheet.numRows, startX: x, endY: 0, endX: x }));\n return false;\n }\n }\n\n let startX = e.shiftKey ? selectingZone.startX : x;\n if (startX === -1) {\n startX = choosing.x;\n }\n\n dispatch(\n selectCols({\n range: { start: startX, end: x },\n numRows: sheet.numRows,\n }),\n );\n\n if (editingAnywhere) {\n writeCell(lastFocused?.value ?? '');\n }\n dispatch(setEditingAddress(''));\n dispatch(setDragging(true));\n focus(editorRef.current);\n\n if (autofillDraggingTo) {\n return false;\n }\n return true;\n },\n [\n dragging,\n editingAnywhere,\n xSheetFocused,\n colId,\n lastFocused,\n selectingZone,\n choosing,\n autofillDraggingTo,\n editorRef,\n ],\n );\n\n const handleDragEnd = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n if (e.type.startsWith('touch')) {\n return;\n }\n\n safePreventDefault(e);\n dispatch(setDragging(false));\n if (autofillDraggingTo) {\n focus(editorRef.current);\n return false;\n }\n },\n [autofillDraggingTo],\n );\n\n const handleDragging = useDebounceCallback((e: React.MouseEvent | React.TouchEvent) => {\n if (!isTouching(e) || !sheet) {\n return false;\n }\n\n if (e.type.startsWith('touch')) {\n return false;\n }\n\n safePreventDefault(e);\n e.stopPropagation();\n\n if (autofillDraggingTo) {\n dispatch(setAutofillDraggingTo({ y: 1, x }));\n return false;\n }\n\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: 1, endX: x });\n const [left, right] = [x2c(newArea.left), x2c(newArea.right)];\n const fullRange = `${sheet.sheetPrefix(!xSheetFocused)}${left}:${right}`;\n insertRef({ input: lastFocused || null, ref: fullRange });\n }\n\n if (autofillDraggingTo == null) {\n const { startY } = selectingZone;\n if (startY === 1) {\n dispatch(drag({ y: sheet.numRows, x }));\n } else {\n dispatch(drag({ y: 1, x }));\n }\n }\n return false;\n }, 100);\n\n if (!sheet) {\n return (\n <th data-x={x} className=\"gs-th gs-th-top gs-hidden\">\n <div className=\"gs-th-inner-wrap\">\n <div className=\"gs-th-inner\">\n <ScrollHandle style={{ position: 'absolute' }} vertical={-1} />\n <div className=\"gs-resizer\"></div>\n </div>\n </div>\n </th>\n );\n }\n\n return (\n <th\n data-x={x}\n className={`gs-th gs-th-top ${choosing.x === x ? 'gs-choosing' : ''} ${\n between({ start: selectingZone.startX, end: selectingZone.endX }, x)\n ? topHeaderSelecting\n ? 'gs-th-selecting'\n : 'gs-selecting'\n : ''\n }`}\n style={{ ...col?.style, width, minWidth: width, maxWidth: width }}\n onContextMenu={(e) => {\n if (contextMenu.length > 0) {\n e.stopPropagation();\n safePreventDefault(e);\n dispatch(setContextMenuPosition({ y: e.clientY, x: e.clientX }));\n return false;\n }\n return true;\n }}\n >\n <div\n className=\"gs-th-inner-wrap\"\n onMouseDown={handleDragStart}\n onTouchStart={handleDragStart}\n onMouseEnter={handleDragging}\n onMouseUp={handleDragEnd}\n >\n <div className=\"gs-th-inner\" style={{ height: sheet.headerHeight, position: 'relative' }}>\n <ScrollHandle\n style={{\n position: 'absolute',\n zIndex: topHeaderSelecting ? -1 : 1,\n }}\n vertical={-1}\n />\n {(() => {\n const displayedLabel = getLabel(sheet, col?.label, { y: 0, x }, x) ?? colId;\n if (displayedLabel !== colId) {\n return (\n <>\n <span className=\"gs-col-addr\">{colId}</span>\n {displayedLabel}\n </>\n );\n }\n return displayedLabel;\n })()}\n {!prevention.hasOperation(col?.prevention, prevention.ColumnMenu) && (\n <button\n className={`gs-menu-btn gs-column-menu-btn ${hasFilter ? 'gs-filtered' : ''} ${columnMenuState?.x === x ? 'gs-active' : ''}`}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n (e.currentTarget as HTMLElement).dataset.pressX = String(e.clientX);\n (e.currentTarget as HTMLElement).dataset.pressY = String(e.clientY);\n }}\n onMouseUp={(e) => {\n e.stopPropagation();\n const btn = e.currentTarget as HTMLElement;\n const pressX = Number(btn.dataset.pressX ?? e.clientX);\n const pressY = Number(btn.dataset.pressY ?? e.clientY);\n const moved = Math.abs(e.clientX - pressX) > 4 || Math.abs(e.clientY - pressY) > 4;\n if (moved) {\n return; // was a drag, ignore\n }\n const rect = btn.getBoundingClientRect();\n if (columnMenuState?.x === x) {\n dispatch(setColumnMenu(null));\n } else {\n const alreadySelected =\n between({ start: selectingZone.startX, end: selectingZone.endX }, x) &&\n selectingZone.startY === 1 &&\n selectingZone.endY === sheet.numRows;\n if (!alreadySelected) {\n dispatch(selectCols({ range: { start: x, end: x }, numRows: sheet.numRows }));\n }\n dispatch(setColumnMenu({ x, position: { y: rect.bottom, x: rect.left } }));\n }\n }}\n >\n ⋮\n </button>\n )}\n <div\n className={`\n gs-resizer \n ${prevention.hasOperation(col?.prevention, prevention.Resize) ? 'gs-protected' : ''}\n ${dragging ? 'gs-hidden' : ''}`}\n style={{ height: sheet.headerHeight }}\n onMouseDown={handleResizeMouseDown}\n >\n <i />\n </div>\n </div>\n </div>\n </th>\n );\n});\n","import type { FC } from 'react';\nimport { useContext, useCallback, memo, useRef } from 'react';\nimport { y2r } from '@gridsheet/core';\nimport { getLabel } from '@gridsheet/core';\nimport { between, zoneToArea } from '@gridsheet/core';\nimport { Context } from '../store';\nimport {\n choose,\n drag,\n select,\n selectRows,\n setAutofillDraggingTo,\n setContextMenuPosition,\n setDragging,\n setEditingAddress,\n setResizingPositionY,\n setRowMenu,\n submitAutofill,\n write,\n} from '../store/actions';\nimport { DEFAULT_HEIGHT } from '@gridsheet/core';\nimport { operations as prevention } from '@gridsheet/core';\nimport { insertRef } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { isXSheetFocused } from '../store/helpers';\nimport { ScrollHandle } from './ScrollHandle';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport { useDebounceCallback } from '../lib/hooks';\n\ntype Props = {\n y: number;\n};\n\nexport const HeaderCellLeft: FC<Props> = memo(({ y }) => {\n const rowId = `${y2r(y)}`;\n const { store, dispatch } = useContext(Context);\n\n const {\n choosing,\n editingAddress,\n selectingZone,\n leftHeaderSelecting,\n editorRef,\n sheetReactive: sheetRef,\n autofillDraggingTo,\n dragging,\n contextMenu,\n rowMenuState,\n } = store;\n const sheet = sheetRef.current;\n\n const row = sheet?.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const height = row?.height || DEFAULT_HEIGHT;\n\n const xSheetFocused = isXSheetFocused(store);\n const lastFocused = sheet?.registry.lastFocused;\n\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const writeCell = useCallback(\n (value: string) => {\n dispatch(write({ value, point: choosing }));\n },\n [choosing],\n );\n\n const handleResizeMouseDown = useCallback((e: React.MouseEvent) => {\n dispatch(setResizingPositionY([y, e.clientY, e.clientY]));\n e.stopPropagation();\n safePreventDefault(e);\n }, []);\n\n const handleDragStart = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n safePreventDefault(e);\n\n if (!isTouching(e) || !sheet) {\n return false;\n }\n if (dragging) {\n return false;\n }\n\n // Single row selection only for touch events\n if (e.type.startsWith('touch')) {\n // Blur the input field to commit current value when selecting via touch\n if (editingAnywhere && editorRef.current) {\n editorRef.current.blur();\n }\n dispatch(choose({ y, x: 1 }));\n dispatch(select({ startY: y, startX: 1, endY: y, endX: sheet.numCols }));\n return true;\n }\n\n // Normal drag operation for mouse events\n dispatch(select({ startY: y, startX: 1, endY: y, endX: -1 }));\n const fullAddress = `${sheet.sheetPrefix(!xSheetFocused)}${rowId}:${rowId}`;\n if (editingAnywhere) {\n const inserted = insertRef({ input: lastFocused || null, ref: fullAddress });\n if (inserted) {\n dispatch(select({ startY: y, startX: sheet.numCols, endY: y, endX: 0 }));\n return false;\n }\n }\n\n let startY = e.shiftKey ? selectingZone.startY : y;\n if (startY === -1) {\n startY = choosing.y;\n }\n\n dispatch(\n selectRows({\n range: { start: startY, end: y },\n numCols: sheet.numCols,\n }),\n );\n\n if (editingAnywhere) {\n writeCell(lastFocused?.value ?? '');\n }\n dispatch(setEditingAddress(''));\n dispatch(setDragging(true));\n focus(editorRef.current);\n\n if (autofillDraggingTo) {\n return false;\n }\n return true;\n },\n [\n dragging,\n editingAnywhere,\n xSheetFocused,\n rowId,\n lastFocused,\n selectingZone,\n choosing,\n autofillDraggingTo,\n editorRef,\n ],\n );\n\n const handleDragEnd = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n if (e.type.startsWith('touch')) {\n return;\n }\n\n safePreventDefault(e);\n dispatch(setDragging(false));\n if (autofillDraggingTo) {\n focus(editorRef.current);\n return false;\n }\n },\n [autofillDraggingTo],\n );\n\n const handleDragging = useDebounceCallback((e: React.MouseEvent | React.TouchEvent) => {\n if (!isTouching(e) || !sheet) {\n return false;\n }\n\n // Do nothing for touch events\n if (e.type.startsWith('touch')) {\n return false;\n }\n\n safePreventDefault(e);\n e.stopPropagation();\n\n if (autofillDraggingTo) {\n dispatch(setAutofillDraggingTo({ y, x: 1 }));\n return false;\n }\n\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: y, endX: 1 });\n const [top, bottom] = [y2r(newArea.top), y2r(newArea.bottom)];\n const fullRange = `${sheet.sheetPrefix(!xSheetFocused)}${top}:${bottom}`;\n insertRef({ input: lastFocused || null, ref: fullRange });\n }\n\n if (autofillDraggingTo == null) {\n const { startX } = selectingZone;\n if (startX === 1) {\n dispatch(drag({ y, x: sheet.numCols }));\n } else {\n dispatch(drag({ y, x: 1 }));\n }\n }\n return false;\n }, 100);\n\n const handleContextMenu = useCallback(\n (e: React.MouseEvent<HTMLTableCellElement>) => {\n if (contextMenu.length > 0) {\n e.stopPropagation();\n safePreventDefault(e);\n dispatch(setContextMenuPosition({ y: e.clientY, x: e.clientX }));\n return false;\n }\n return true;\n },\n [contextMenu.length],\n );\n\n if (!sheet) {\n return null;\n }\n\n return (\n <th\n data-y={y}\n className={`gs-th gs-th-left ${choosing.y === y ? 'gs-choosing' : ''} ${\n between({ start: selectingZone.startY, end: selectingZone.endY }, y)\n ? leftHeaderSelecting\n ? 'gs-th-selecting'\n : 'gs-selecting'\n : ''\n } ${row?.filterFixed ? 'gs-filter-fixed' : ''} ${row?.sortFixed ? 'gs-sort-fixed' : ''}`}\n style={{ ...row?.style, height }}\n onContextMenu={handleContextMenu}\n >\n <div\n className=\"gs-th-inner-wrap\"\n onMouseDown={handleDragStart}\n onTouchStart={handleDragStart}\n onMouseEnter={handleDragging}\n onMouseUp={handleDragEnd}\n >\n <div className=\"gs-th-inner\" style={{ width: sheet.headerWidth, position: 'relative' }}>\n <ScrollHandle\n style={{\n position: 'absolute',\n zIndex: leftHeaderSelecting ? -1 : 1,\n }}\n horizontal={-1}\n />\n {getLabel(sheet, row?.label, { y, x: 0 }, y) ?? rowId}\n {!prevention.hasOperation(row?.prevention, prevention.RowMenu) && (\n <button\n className={`gs-menu-btn gs-row-menu-btn ${rowMenuState?.y === y ? 'gs-active' : ''}`}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n (e.currentTarget as HTMLElement).dataset.pressX = String(e.clientX);\n (e.currentTarget as HTMLElement).dataset.pressY = String(e.clientY);\n }}\n onMouseUp={(e) => {\n e.stopPropagation();\n const btn = e.currentTarget as HTMLElement;\n const pressX = Number(btn.dataset.pressX ?? e.clientX);\n const pressY = Number(btn.dataset.pressY ?? e.clientY);\n const moved = Math.abs(e.clientX - pressX) > 4 || Math.abs(e.clientY - pressY) > 4;\n if (moved) {\n return; // was a drag, ignore\n }\n const rect = btn.getBoundingClientRect();\n if (rowMenuState?.y === y) {\n dispatch(setRowMenu(null));\n } else {\n const alreadySelected =\n between({ start: selectingZone.startY, end: selectingZone.endY }, y) &&\n selectingZone.startX === 1 &&\n selectingZone.endX === sheet.numCols;\n if (!alreadySelected) {\n dispatch(selectRows({ range: { start: y, end: y }, numCols: sheet.numCols }));\n }\n dispatch(setRowMenu({ y, position: { y: rect.bottom, x: rect.right } }));\n }\n }}\n >\n ⋮\n </button>\n )}\n <div\n className={`\n gs-resizer\n ${prevention.hasOperation(row?.prevention, prevention.Resize) ? 'gs-protected' : ''}\n ${dragging ? 'gs-hidden' : ''}`}\n style={{ width: sheet.headerWidth }}\n onMouseDown={handleResizeMouseDown}\n ></div>\n </div>\n </div>\n </th>\n );\n});\n","import { useContext, useEffect, useRef, useCallback } from 'react';\nimport { Context } from '../store';\nimport { zoneToArea } from '@gridsheet/core';\nimport { between } from '@gridsheet/core';\nimport { a2p } from '@gridsheet/core';\nimport { COLOR_PALETTE } from '@gridsheet/core';\nimport { Autofill } from '@gridsheet/core';\nimport { getCellRectPositions } from '@gridsheet/core';\nimport type { Sheet } from '@gridsheet/core';\nimport type { FC } from 'react';\nimport type { RefPaletteType, AreaType, ModeType } from '../types';\n\nconst COLOR_POINTED = 'rgba(0, 119, 255, 1)';\nconst COLOR_SELECTED = 'rgba(0, 119, 255, 0.6)';\nconst SELECTING_FILL = 'rgba(0, 128, 255, 0.2)';\nconst COLOR_COPYING = '#0077ff';\nconst COLOR_CUTTING = '#0077ff';\nconst SEARCH_MATCHING_BACKGROUND = 'rgba(0, 200, 100, 0.2)';\nconst COLOR_SEARCH_MATCHING = '#00aa78';\nconst COLOR_AUTOFILL = '#0077aa';\n\nconst HEADER_COLORS = {\n light: {\n selecting: 'rgba(0, 0, 0, 0.1)',\n choosing: 'rgba(0, 0, 0, 0.2)',\n thSelecting: 'rgba(0, 0, 0, 0.55)',\n },\n dark: {\n selecting: 'rgba(255, 255, 255, 0.08)',\n choosing: 'rgba(255, 255, 255, 0.18)',\n thSelecting: 'rgba(255, 255, 255, 0.4)',\n },\n} as const;\n\ntype Props = {\n refs?: RefPaletteType;\n};\n\ntype Ctx2D = CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n\nconst fillRect = (ctx: Ctx2D, x: number, y: number, width: number, height: number, color: string) => {\n ctx.fillStyle = color;\n ctx.fillRect(x, y, width, height);\n};\n\nconst drawRect = (\n ctx: Ctx2D,\n x: number,\n y: number,\n width: number,\n height: number,\n color: string,\n lineWidth: number = 2,\n dashPattern: number[] = [],\n fillColor?: string,\n) => {\n if (fillColor) {\n ctx.fillStyle = fillColor;\n ctx.fillRect(x, y, width, height);\n }\n\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(dashPattern);\n ctx.strokeRect(x + lineWidth / 2, y + lineWidth / 2, width - lineWidth, height - lineWidth);\n ctx.setLineDash([]);\n};\n\n// Draw an area rect in viewport coordinates (absolute coords - scroll offset, clamped to viewport)\nconst drawAreaRectViewport = (\n ctx: Ctx2D,\n sheet: Sheet,\n scrollTop: number,\n scrollLeft: number,\n viewW: number,\n viewH: number,\n area: AreaType,\n color: string,\n lineWidth: number = 2,\n dashPattern: number[] = [],\n fillColor?: string,\n) => {\n const { top, left, bottom, right } = area;\n if (top === -1 || left === -1 || bottom === -1 || right === -1) {\n return;\n }\n\n const topLeft = getCellRectPositions(sheet, { y: top, x: left });\n const bottomRight = getCellRectPositions(sheet, { y: bottom, x: right });\n\n const x1 = topLeft.left - scrollLeft;\n const y1 = topLeft.top - scrollTop;\n const x2 = bottomRight.right - scrollLeft;\n const y2 = bottomRight.bottom - scrollTop;\n\n // Quick reject if entirely off-screen\n if (x2 < 0 || x1 > viewW || y2 < 0 || y1 > viewH) {\n return;\n }\n\n drawRect(ctx, x1, y1, x2 - x1, y2 - y1, color, lineWidth, dashPattern, fillColor);\n};\n\nexport const CellStateOverlay: FC<Props> = ({ refs = {} }) => {\n const { store } = useContext(Context);\n const {\n sheetReactive,\n tabularRef,\n choosing,\n selectingZone,\n matchingCells,\n matchingCellIndex,\n autofillDraggingTo,\n topHeaderSelecting,\n leftHeaderSelecting,\n mode,\n dragging,\n } = store;\n const sheet = sheetReactive.current;\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const rafIdRef = useRef<number>(0);\n const storeRef = useRef(store);\n storeRef.current = store;\n\n const drawCanvas = useCallback(() => {\n if (!sheet || !tabularRef.current || !canvasRef.current) {\n return;\n }\n\n const canvas = canvasRef.current;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return;\n }\n\n const container = tabularRef.current;\n const dpr = window.devicePixelRatio || 1;\n const w = container.clientWidth;\n const h = container.clientHeight;\n\n // Resize canvas to viewport\n if (canvas.width !== w * dpr || canvas.height !== h * dpr) {\n canvas.style.width = `${w}px`;\n canvas.style.height = `${h}px`;\n canvas.width = w * dpr;\n canvas.height = h * dpr;\n }\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, w, h);\n\n const { registry } = sheet;\n const scrollTop = container.scrollTop;\n const scrollLeft = container.scrollLeft;\n const headerW = sheet.headerWidth;\n const headerH = sheet.headerHeight;\n\n // Clip cell-area drawing to exclude header region\n ctx.save();\n ctx.beginPath();\n ctx.rect(headerW, headerH, w - headerW, h - headerH);\n ctx.clip();\n\n // 1. Selecting zone (border + fill)\n const selectingArea = zoneToArea(selectingZone);\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, selectingArea, COLOR_SELECTED, 1, [], SELECTING_FILL);\n\n // 2. Autofill dragging\n if (autofillDraggingTo) {\n const autofill = new Autofill(storeRef.current, autofillDraggingTo);\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, autofill.wholeArea, COLOR_AUTOFILL, 1, [5, 5]);\n }\n\n // 3. Choosing (pointed cell)\n {\n const { y, x } = choosing;\n if (y !== -1 && x !== -1) {\n const pos = getCellRectPositions(sheet, { y, x });\n const vx = pos.left - scrollLeft;\n const vy = pos.top - scrollTop;\n drawRect(ctx, vx, vy, pos.width, pos.height, COLOR_POINTED, 2, []);\n }\n }\n\n // 4. Copying/Cutting zone\n const { copyingSheetId, copyingZone, cutting } = registry;\n if (sheet.id === copyingSheetId) {\n const copyingArea = zoneToArea(copyingZone);\n const color = cutting ? COLOR_CUTTING : COLOR_COPYING;\n const dashPattern = cutting ? [4, 4] : [6, 4];\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, copyingArea, color, 2.5, dashPattern);\n }\n\n // 5. Formula references (from palette)\n Object.entries(refs).forEach(([ref, i]) => {\n const palette = COLOR_PALETTE[i % COLOR_PALETTE.length];\n try {\n const refArea = sheet.rangeToArea(ref);\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, refArea, palette, 2, [5, 5]);\n } catch (e) {\n // Invalid reference, skip\n }\n });\n\n // 6. Search matching cells\n matchingCells.forEach((address, index) => {\n const { y, x } = a2p(address);\n const pos = getCellRectPositions(sheet, { y, x });\n const vx = pos.left - scrollLeft;\n const vy = pos.top - scrollTop;\n\n // Skip if off-screen\n if (vx + pos.width < 0 || vx > w || vy + pos.height < 0 || vy > h) {\n return;\n }\n\n const isCurrentMatch = index === matchingCellIndex;\n drawRect(\n ctx,\n vx,\n vy,\n pos.width,\n pos.height,\n isCurrentMatch ? COLOR_SEARCH_MATCHING : 'transparent',\n isCurrentMatch ? 2 : 0,\n [],\n SEARCH_MATCHING_BACKGROUND,\n );\n });\n\n // Restore full canvas for header drawing\n ctx.restore();\n\n // 7. Header highlights (top and left) — draw bottom border for top headers, right border for left headers\n const numCols = sheet.numCols;\n const numRows = sheet.numRows;\n\n // Top headers - draw bottom border and background\n for (let x = 1; x <= numCols; x++) {\n let color: string | null = null;\n let backgroundColor: string | null = null;\n if (between({ start: selectingZone.startX, end: selectingZone.endX }, x)) {\n color = 'rgba(80, 180, 255, 1)';\n backgroundColor = topHeaderSelecting ? 'rgba(128, 128, 128, 0.25)' : 'rgba(0, 119, 255, 0.05)';\n }\n if (choosing.x === x) {\n color = COLOR_POINTED;\n backgroundColor = topHeaderSelecting ? 'rgba(128, 128, 128, 0.45)' : 'rgba(0, 119, 255, 0.15)';\n }\n if (!color) {\n continue;\n }\n\n const pos = getCellRectPositions(sheet, { y: 1, x });\n const left = pos.left - scrollLeft;\n if (left + pos.width < headerW || left > w) {\n continue;\n }\n const drawLeft = Math.max(left, headerW);\n const drawWidth = Math.min(left + pos.width, w) - drawLeft;\n if (drawWidth > 0) {\n if (backgroundColor) {\n fillRect(ctx, drawLeft, 0, drawWidth, headerH, backgroundColor);\n }\n // Draw bottom border of the header\n ctx.strokeStyle = color;\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(drawLeft, headerH + 1);\n ctx.lineTo(drawLeft + drawWidth, headerH + 1);\n ctx.stroke();\n }\n }\n\n // Left headers - draw right border and background\n for (let y = 1; y <= numRows; y++) {\n if (sheet.isRowFiltered(y)) {\n continue;\n }\n let color: string | null = null;\n let backgroundColor: string | null = null;\n if (between({ start: selectingZone.startY, end: selectingZone.endY }, y)) {\n color = 'rgba(80, 180, 255, 1)';\n backgroundColor = leftHeaderSelecting ? 'rgba(128, 128, 128, 0.25)' : 'rgba(0, 119, 255, 0.05)';\n }\n if (choosing.y === y) {\n color = COLOR_POINTED;\n backgroundColor = leftHeaderSelecting ? 'rgba(128, 128, 128, 0.45)' : 'rgba(0, 119, 255, 0.15)';\n }\n if (!color) {\n continue;\n }\n\n const pos = getCellRectPositions(sheet, { y, x: 1 });\n const top = pos.top - scrollTop;\n if (top + pos.height < headerH || top > h) {\n continue;\n }\n const drawTop = Math.max(top, headerH);\n const drawHeight = Math.min(top + pos.height, h) - drawTop;\n if (drawHeight > 0) {\n if (backgroundColor) {\n fillRect(ctx, 0, drawTop, headerW, drawHeight, backgroundColor);\n }\n // Draw right border of the header\n ctx.strokeStyle = color;\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(headerW + 1, drawTop);\n ctx.lineTo(headerW + 1, drawTop + drawHeight);\n ctx.stroke();\n }\n }\n }, [\n sheet,\n tabularRef,\n choosing,\n selectingZone,\n matchingCells,\n matchingCellIndex,\n autofillDraggingTo,\n topHeaderSelecting,\n leftHeaderSelecting,\n mode,\n dragging,\n refs,\n ]);\n\n // Schedule a draw on the next animation frame (for state changes)\n const scheduleDrawCanvas = useCallback(() => {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = requestAnimationFrame(drawCanvas);\n }, [drawCanvas]);\n\n // Draw synchronously on scroll to avoid 1-frame lag\n const handleScroll = useCallback(() => {\n drawCanvas();\n }, [drawCanvas]);\n\n useEffect(() => {\n scheduleDrawCanvas();\n return () => cancelAnimationFrame(rafIdRef.current);\n }, [scheduleDrawCanvas]);\n\n useEffect(() => {\n const container = tabularRef.current;\n if (!container) {\n return;\n }\n container.addEventListener('scroll', handleScroll);\n const ro = new ResizeObserver(() => drawCanvas());\n ro.observe(container);\n return () => {\n container.removeEventListener('scroll', handleScroll);\n ro.disconnect();\n };\n }, [tabularRef, handleScroll, drawCanvas]);\n\n return (\n <div\n style={{\n position: 'sticky',\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n overflow: 'visible',\n pointerEvents: 'none',\n zIndex: 10,\n }}\n >\n <canvas\n ref={canvasRef}\n className=\"gs-cell-state-overlay\"\n style={{\n pointerEvents: 'none',\n display: 'block',\n }}\n />\n </div>\n );\n};\n","import { useEffect, useContext, useState, useCallback } from 'react';\n\nimport { Cell } from './Cell';\nimport { HeaderCellTop } from './HeaderCellTop';\nimport { HeaderCellLeft } from './HeaderCellLeft';\nimport { CellStateOverlay } from './CellStateOverlay';\n\nimport { Context } from '../store';\nimport { choose, select, setContextMenuPosition } from '../store/actions';\n\nimport type { RefPaletteType, Virtualization } from '../types';\nimport { virtualize } from '@gridsheet/core';\nimport { p2a, stripAddressAbsolute } from '@gridsheet/core';\nimport { Lexer, stripSheetName } from '@gridsheet/core';\nimport { ScrollHandle } from './ScrollHandle';\nimport { preventSafariBounce } from '@gridsheet/core';\n\nexport const Tabular = () => {\n const [palette, setPalette] = useState<RefPaletteType>({});\n const { store, dispatch } = useContext(Context);\n const {\n sheetReactive,\n choosing,\n editingAddress,\n tabularRef,\n mainRef,\n sheetWidth,\n sheetHeight,\n inputting,\n leftHeaderSelecting,\n topHeaderSelecting,\n contextMenu,\n } = store;\n const sheet = sheetReactive.current;\n\n const [virtualized, setVirtualized] = useState<Virtualization | null>(null);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleScroll = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n if (sheet) {\n setVirtualized(virtualize(sheet, e.currentTarget));\n }\n },\n [sheetReactive],\n );\n\n const handleSelectAllClick = useCallback(() => {\n if (!sheet) {\n return;\n }\n dispatch(choose({ y: -1, x: -1 }));\n requestAnimationFrame(() => {\n dispatch(choose({ y: 1, x: 1 }));\n dispatch(\n select({\n startY: 1,\n startX: 1,\n endY: sheet.numRows,\n endX: sheet.numCols,\n }),\n );\n });\n }, [sheetReactive]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n const formulaEditing = editingAddress && inputting.startsWith('=');\n if (!formulaEditing) {\n setPalette({});\n sheet.registry.paletteBySheetName = {};\n return;\n }\n const palette: RefPaletteType = {};\n const paletteBySheetName: { [sheetName: string]: RefPaletteType } = {};\n const lexer = new Lexer(inputting.substring(1));\n lexer.tokenize();\n\n let i = 0;\n for (const token of lexer.tokens) {\n if (token.type === 'REF' || token.type === 'RANGE') {\n const normalizedRef = stripAddressAbsolute(token.stringify());\n const splitterIndex = normalizedRef.indexOf('!');\n if (splitterIndex !== -1) {\n const sheetName = normalizedRef.substring(0, splitterIndex);\n const ref = normalizedRef.substring(splitterIndex + 1);\n const stripped = stripSheetName(sheetName);\n const upperRef = ref.toUpperCase();\n if (paletteBySheetName[stripped] == null) {\n paletteBySheetName[stripped] = {};\n }\n if (paletteBySheetName[stripped][upperRef] == null) {\n paletteBySheetName[stripped][upperRef] = i++;\n }\n } else {\n const upperRef = normalizedRef.toUpperCase();\n if (palette[upperRef] == null) {\n palette[upperRef] = i++;\n }\n }\n }\n }\n setPalette(palette);\n sheet.registry.paletteBySheetName = paletteBySheetName;\n }, [store.inputting, store.editingAddress, sheetReactive]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n sheet.registry.choosingAddress = p2a(choosing);\n sheet.registry.choosingSheetId = sheet.id;\n }, [choosing]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n setVirtualized(virtualize(sheet, tabularRef.current));\n }, [tabularRef.current, sheetReactive, mainRef.current?.clientHeight, mainRef.current?.clientWidth]);\n\n useEffect(() => {\n const el = tabularRef.current;\n if (!el) {\n return;\n }\n return preventSafariBounce(el);\n }, [sheetReactive]);\n\n const mergedRefs: RefPaletteType = {\n ...palette,\n ...(sheet ? sheet.registry.paletteBySheetName[sheet.name] : {}),\n };\n\n if (!sheet || !sheet.registry.ready) {\n return null;\n }\n\n return (\n <>\n <div\n className=\"gs-tabular\"\n style={{\n width: sheetWidth === -1 ? undefined : sheetWidth,\n height: sheetHeight === -1 ? undefined : sheetHeight,\n }}\n ref={tabularRef}\n onMouseMove={handleMouseMove}\n onScroll={handleScroll}\n >\n <div\n className={'gs-tabular-inner'}\n style={{\n width: sheet.totalWidth,\n height: sheet.totalHeight,\n overflow: 'clip',\n }}\n >\n <CellStateOverlay refs={mergedRefs} />\n <table className={`gs-table`}>\n <thead className=\"gs-thead\" style={{ height: sheet.headerHeight }}>\n <tr className=\"gs-row\">\n <th\n className=\"gs-th gs-th-left gs-th-top\"\n style={{ position: 'sticky', width: sheet.headerWidth, height: sheet.headerHeight }}\n onClick={handleSelectAllClick}\n >\n <div className=\"gs-th-inner\">\n <ScrollHandle\n className={leftHeaderSelecting || topHeaderSelecting ? 'gs-hidden' : ''}\n style={{ position: 'absolute' }}\n horizontal={leftHeaderSelecting ? 0 : -1}\n vertical={topHeaderSelecting ? 0 : -1}\n />\n {contextMenu.length > 0 && (\n <button\n className=\"gs-menu-btn gs-corner-menu-btn\"\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => {\n e.preventDefault();\n (e.currentTarget as HTMLElement).dataset.pressX = String(e.clientX);\n (e.currentTarget as HTMLElement).dataset.pressY = String(e.clientY);\n }}\n onMouseUp={(e) => {\n e.stopPropagation();\n const btn = e.currentTarget as HTMLElement;\n const pressX = Number(btn.dataset.pressX ?? e.clientX);\n const pressY = Number(btn.dataset.pressY ?? e.clientY);\n const moved = Math.abs(e.clientX - pressX) > 4 || Math.abs(e.clientY - pressY) > 4;\n if (moved) {\n return;\n }\n const rect = btn.getBoundingClientRect();\n dispatch(setContextMenuPosition({ y: rect.bottom, x: rect.left }));\n }}\n >\n ⋮\n </button>\n )}\n </div>\n </th>\n <th\n className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-left\"\n style={{ width: virtualized?.adjuster?.left ?? 1 }}\n ></th>\n {virtualized?.xs?.map?.((x) => <HeaderCellTop x={x} key={x} />)}\n <th\n className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-right\"\n style={{ width: virtualized?.adjuster?.right }}\n ></th>\n </tr>\n </thead>\n\n <tbody className=\"gs-sheet-body-adjuster\">\n <tr className=\"gs-row\">\n <th\n className={`gs-adjuster gs-adjuster-horizontal gs-adjuster-vertical`}\n style={{ height: virtualized?.adjuster?.top ?? 1 }}\n ></th>\n <td className=\"gs-adjuster gs-adjuster-vertical\"></td>\n {virtualized?.xs?.map((x) => <td className=\"gs-adjuster gs-adjuster-vertical\" key={x}></td>)}\n <th className={`gs-adjuster gs-adjuster-horizontal gs-adjuster-vertical`}></th>\n </tr>\n </tbody>\n\n <tbody className=\"gs-sheet-body-data\">\n {virtualized?.ys?.map((y) => {\n return (\n <tr key={y} className={`gs-row ${y % 2 === 0 ? 'gs-row-even' : 'gs-row-odd'}`}>\n <HeaderCellLeft y={y} />\n <td className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-left\" />\n {virtualized?.xs?.map((x) => <Cell key={x} y={y} x={x} />)}\n <td className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-right\" />\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </>\n );\n};\n","import type { KeyboardEvent } from 'react';\nimport React, { useCallback, useEffect, useRef, useState, useContext } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FunctionGuide } from './FunctionGuide';\nimport { EditorOptions } from './EditorOptions';\nimport { Context } from '../store';\nimport { p2a, a2p } from '@gridsheet/core';\nimport { setEditingAddress, setInputting, setEditorHovering, walk, write, updateSheet } from '../store/actions';\nimport { operations as prevention } from '@gridsheet/core';\nimport { handleFormulaQuoteAutoClose, insertTextAtCursor, isFocus } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { editorStyle } from './Editor';\nimport { ScrollHandle } from './ScrollHandle';\nimport { useAutocomplete } from './useAutocomplete';\n\ntype FormulaBarProps = {\n ready: boolean;\n};\n\nexport const FormulaBar = ({ ready }: FormulaBarProps) => {\n const { store, dispatch } = useContext(Context);\n const [before, setBefore] = useState('');\n const [selectionStart, setSelectionStart] = useState(0);\n const [isFocused, setIsFocused] = useState(false);\n const {\n choosing,\n selectingZone,\n editorRef,\n largeEditorRef,\n sheetReactive: sheetRef,\n inputting,\n editingAddress: editingCell,\n dragging,\n } = store;\n const sheet = sheetRef.current;\n const hlRef = useRef<HTMLDivElement | null>(null);\n\n const address = choosing.x === -1 ? '' : p2a(choosing);\n const cell = sheet?.getCell(choosing, { resolution: 'SYSTEM' });\n const spilledFromAddress = sheet?.getSystem(choosing)?.spilledFrom;\n const originPoint = spilledFromAddress ? a2p(spilledFromAddress) : undefined;\n const originAddress = originPoint != null ? p2a(originPoint) : undefined;\n useEffect(() => {\n if (!sheet) {\n return;\n }\n let value = sheet.getCell(choosing, { resolution: 'SYSTEM' })?.value ?? '';\n // debug to remove this line\n value = sheet.getSerializedValue({ point: choosing, cell: { ...cell, value }, resolution: 'RAW' });\n largeEditorRef.current!.value = value;\n setBefore(value as string);\n }, [address, sheet]);\n\n const writeCell = useCallback(\n (value: string) => {\n if (before !== value) {\n dispatch(write({ value }));\n }\n dispatch(setEditingAddress(''));\n focus(editorRef.current);\n },\n [before],\n );\n\n useEffect(() => {\n const observer = new ResizeObserver((entries) => {\n entries.forEach(updateScroll);\n });\n if (largeEditorRef.current) {\n observer.observe(largeEditorRef.current);\n }\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const policy = sheet?.getPolicy(choosing);\n const optionsAll = policy?.getSelectOptions() || [];\n\n const {\n filteredOptions,\n selected,\n setSelected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n isFormula,\n activeFunctionHelp,\n activeArgIndex,\n } = useAutocomplete({\n inputting,\n selectionStart,\n optionsAll,\n functions: sheet?.registry.functions,\n });\n\n const largeInput = largeEditorRef.current;\n\n const handleInput = useCallback((e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n dispatch(setInputting(e.currentTarget.value));\n setSelectionStart(e.currentTarget.selectionStart);\n }, []);\n\n const handleSelect = useCallback((e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n setSelectionStart(e.currentTarget.selectionStart);\n }, []);\n\n const updateScroll = useCallback(() => {\n if (!hlRef.current || !largeEditorRef.current) {\n return;\n }\n hlRef.current.style.height = `${largeEditorRef.current.clientHeight}px`;\n hlRef.current.scrollLeft = largeEditorRef.current.scrollLeft;\n hlRef.current.scrollTop = largeEditorRef.current.scrollTop;\n }, []);\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n if (!largeInput || !sheet) {\n return;\n }\n setIsFocused(true);\n dispatch(setEditingAddress(address));\n sheet.registry.lastFocused = e.currentTarget;\n },\n [largeInput, address, sheet],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n if (e.currentTarget.value!.startsWith('=')) {\n return true;\n } else {\n if (editingCell) {\n writeCell(e.currentTarget.value);\n }\n }\n },\n [editingCell, writeCell],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.ctrlKey || !sheet) {\n return true;\n }\n const input = e.currentTarget;\n\n // Auto-close double quotes in formula mode\n if (handleFormulaQuoteAutoClose(e, inputting)) {\n dispatch(setInputting(input.value));\n return false;\n }\n\n switch (e.key) {\n case 'Tab': // TAB\n e.preventDefault();\n if (filteredOptions.length) {\n const option = filteredOptions[selected];\n const isFunc = option?.isFunction;\n\n if (isFunc) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n dispatch(setInputting(newValue));\n setTimeout(() => {\n if (largeEditorRef.current) {\n focus(largeEditorRef.current);\n largeEditorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n return false;\n } else {\n // ... regular completion ...\n const t = sheet.update({ diff: { [address]: { value: option.value } }, partial: true });\n dispatch(updateSheet(t.clone()));\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n }\n break;\n case 'ArrowUp':\n if (handleArrowUp(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'ArrowDown':\n if (handleArrowDown(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'Enter': {\n if (filteredOptions.length) {\n const option = filteredOptions[selected];\n if (option?.isFunction) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n dispatch(setInputting(newValue));\n setTimeout(() => {\n if (largeEditorRef.current) {\n focus(largeEditorRef.current);\n largeEditorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n e.preventDefault();\n return false;\n }\n }\n\n if (e.altKey) {\n insertTextAtCursor(input, '\\n');\n } else {\n writeCell(input.value);\n dispatch(setInputting(''));\n dispatch(\n walk({\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 1,\n deltaX: 0,\n }),\n );\n e.preventDefault();\n return false;\n }\n break;\n }\n case 'Escape': {\n input.value = before;\n dispatch(setInputting(before));\n dispatch(setEditingAddress(''));\n e.preventDefault();\n focus(editorRef.current);\n\n break;\n }\n case 'a': // A\n if (e.ctrlKey || e.metaKey) {\n return true;\n }\n case 'c': // C\n if (e.ctrlKey || e.metaKey) {\n return true;\n }\n break;\n case 'v': // V\n if (e.ctrlKey || e.metaKey) {\n return true;\n }\n break;\n }\n\n const cell = sheet.getCell(choosing, { resolution: 'SYSTEM' });\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n console.warn('This cell is protected from writing.');\n e.preventDefault();\n }\n updateScroll();\n return false;\n },\n [\n sheet,\n choosing,\n address,\n before,\n writeCell,\n updateScroll,\n filteredOptions,\n selected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n inputting,\n ],\n );\n\n const handleOptionMouseDown = useCallback(\n (e: React.MouseEvent, i: number) => {\n e.preventDefault();\n e.stopPropagation();\n const option = filteredOptions[i];\n if (option.isFunction) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n writeCell(newValue);\n dispatch(setInputting(newValue));\n setTimeout(() => {\n if (largeEditorRef.current) {\n focus(largeEditorRef.current);\n largeEditorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n }\n },\n [filteredOptions, replaceWithOption, writeCell, dispatch],\n );\n\n const style: React.CSSProperties = ready ? {} : { visibility: 'hidden' };\n if (!sheet) {\n return (\n <label className=\"gs-formula-bar gs-hidden\" style={style}>\n <div className=\"gs-selecting-address\"></div>\n <div className=\"gs-fx\">Fx</div>\n <div className=\"gs-formula-bar-editor-inner\">\n <textarea />\n </div>\n </label>\n );\n }\n const renderOverlays = () => {\n if (!isFocused || typeof document === 'undefined') {\n return null;\n }\n if (largeEditorRef.current !== document.activeElement) {\n return null;\n }\n\n const rect = largeEditorRef.current?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n\n const top = rect.bottom;\n const left = rect.left;\n\n return createPortal(\n <>\n {activeFunctionHelp &&\n filteredOptions.length === 0 &&\n (!selectingZone || (selectingZone.endY === -1 && selectingZone.endX === -1)) && (\n <FunctionGuide\n activeFunctionGuide={activeFunctionHelp}\n activeArgIndex={activeArgIndex}\n top={top}\n left={left}\n />\n )}\n {filteredOptions.length > 0 && choosing.x !== -1 && (\n <EditorOptions\n filteredOptions={filteredOptions}\n top={top}\n left={left}\n selected={selected}\n onOptionMouseDown={handleOptionMouseDown}\n />\n )}\n </>,\n document.body,\n );\n };\n\n return (\n <div\n className=\"gs-formula-bar\"\n data-sheet-id={store.sheetId}\n data-spill={originAddress != null ? 'true' : undefined}\n style={style}\n >\n <ScrollHandle style={{ position: 'absolute', left: 0, top: 0, zIndex: 2 }} vertical={-1} />\n <div className=\"gs-selecting-address\">{originAddress != null ? originAddress : address}</div>\n <div className=\"gs-fx\">Fx</div>\n <div className=\"gs-formula-bar-editor-inner\">\n <div\n className=\"gs-editor-hl\"\n ref={hlRef}\n style={{\n height: largeEditorRef.current?.clientHeight,\n width: '100%',\n }}\n >\n {(cell?.formulaEnabled ?? true) ? editorStyle(inputting) : inputting}\n </div>\n <textarea\n name=\"gs-formula-bar-editor\"\n data-sheet-id={store.sheetId}\n data-size=\"large\"\n rows={1}\n spellCheck={false}\n ref={largeEditorRef}\n value={inputting}\n // Spilled cells must not be edited from the FormulaBar — input here\n // would modify `inputting` one character at a time (via onInput) even\n // though the underlying cell cannot be written to.\n readOnly={originAddress != null}\n onInput={handleInput}\n onFocus={handleFocus}\n onSelect={handleSelect}\n onPaste={(e) => {\n e.stopPropagation();\n }}\n onKeyDown={handleKeyDown}\n onKeyUp={updateScroll}\n onScroll={updateScroll}\n onMouseEnter={(e) => {\n dispatch(setEditorHovering(true));\n }}\n onMouseLeave={(e) => {\n dispatch(setEditorHovering(false));\n }}\n ></textarea>\n {renderOverlays()}\n </div>\n </div>\n );\n};\n","import type { ReactNode, CSSProperties } from 'react';\n\nexport interface IconProps {\n style?: CSSProperties;\n color?: string;\n size?: number;\n}\n\ninterface BaseProps extends IconProps {\n children?: ReactNode;\n}\n\n// https://tabler.io/icons\n\nexport const Base = ({ style, size = 24, children }: BaseProps) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox={`0 0 24 24`}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={style}\n className=\"icon-tabler\"\n >\n {children}\n </svg>\n );\n};\n","import { type IconProps, Base } from './Base';\n\n// https://tabler.io/icons\n\nexport const SearchIcon = ({ style, color = 'none', size = 24 }: IconProps) => {\n return (\n <Base style={style} size={size}>\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill={color} />\n <path d=\"M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0\" fill={color} />\n <path d=\"M21 21l-6 -6\" fill={color} />\n </Base>\n );\n};\n","import { type IconProps, Base } from './Base';\n\n// https://tabler.io/icons\n\nexport const CloseIcon = ({ style, color = 'none', size = 24 }: IconProps) => {\n return (\n <Base style={style} size={size}>\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill={color} />\n <path d=\"M18 6l-12 12\" fill={color} />\n <path d=\"M6 6l12 12\" fill={color} />\n </Base>\n );\n};\n","import { useContext, useEffect, useRef, useCallback, useMemo } from 'react';\n\nimport { a2p, x2c, y2r } from '@gridsheet/core';\nimport { isZoneNotSelected } from '@gridsheet/core';\n\nimport { Context } from '../store';\nimport { setSearchQuery, search, setSearchCaseSensitive, setSearchRegex, setSearchRange } from '../store/actions';\nimport { smartScroll } from '@gridsheet/core';\nimport { SearchIcon } from './svg/SearchIcon';\nimport { CloseIcon } from './svg/CloseIcon';\nimport { focus } from '@gridsheet/core';\n\nexport const SearchBar = () => {\n const { store, dispatch } = useContext(Context);\n const {\n rootRef,\n editorRef,\n searchInputRef,\n tabularRef,\n searchQuery,\n searchCaseSensitive,\n searchRegex,\n searchRange,\n selectingZone,\n matchingCellIndex,\n matchingCells,\n sheetReactive: sheetRef,\n } = store;\n const sheet = sheetRef.current;\n\n const matchingCell = matchingCells[matchingCellIndex];\n useEffect(() => {\n if (!matchingCell || !sheet) {\n return;\n }\n const point = a2p(matchingCell);\n if (typeof point === 'undefined') {\n return;\n }\n smartScroll(sheet, tabularRef.current, point);\n }, [searchQuery, matchingCellIndex, searchCaseSensitive, searchRegex, sheet, tabularRef]);\n\n const handleProgressClick = useCallback((e: React.MouseEvent) => {\n const input = e.currentTarget.previousSibling as HTMLInputElement;\n input?.nodeName === 'INPUT' && focus(input);\n }, []);\n\n const handleSearchClick = useCallback(() => {\n dispatch(search(1));\n }, []);\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n dispatch(setSearchQuery(e.currentTarget.value));\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Escape') {\n const el = editorRef?.current;\n if (el) {\n focus(el);\n }\n dispatch(setSearchQuery(undefined));\n }\n if (e.key === 'f' && (e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n return false;\n }\n if (e.key === 'Enter') {\n dispatch(search(e.shiftKey ? -1 : 1));\n e.preventDefault();\n return false;\n }\n return true;\n },\n [editorRef],\n );\n\n const handleCaseSensitiveClick = useCallback(() => {\n dispatch(setSearchCaseSensitive(!searchCaseSensitive));\n }, [searchCaseSensitive]);\n\n const handleRegexClick = useCallback(() => {\n dispatch(setSearchRegex(!searchRegex));\n }, [searchRegex]);\n\n const hasSelection = useMemo(() => {\n if (!selectingZone) {\n return false;\n }\n if (isZoneNotSelected(selectingZone)) {\n return false;\n }\n const { startY, startX, endY, endX } = selectingZone;\n return !(startY === endY && startX === endX);\n }, [selectingZone]);\n\n const selectionLabel = useMemo(() => {\n if (!selectingZone || !hasSelection) {\n return '';\n }\n const { startY, startX, endY, endX } = selectingZone;\n const topLeft = `${x2c(Math.min(startX, endX))}${y2r(Math.min(startY, endY))}`;\n const bottomRight = `${x2c(Math.max(startX, endX))}${y2r(Math.max(startY, endY))}`;\n return `${topLeft}:${bottomRight}`;\n }, [selectingZone, hasSelection]);\n\n const handleRangeClick = useCallback(() => {\n if (searchRange) {\n // Clear search range\n dispatch(setSearchRange(undefined));\n } else if (selectingZone && hasSelection) {\n // Set search range to current selection\n const { startY, startX, endY, endX } = selectingZone;\n dispatch(\n setSearchRange({\n startY: Math.min(startY, endY),\n startX: Math.min(startX, endX),\n endY: Math.max(startY, endY),\n endX: Math.max(startX, endX),\n }),\n );\n }\n }, [searchRange, selectingZone, hasSelection]);\n\n const searchRangeLabel = useMemo(() => {\n if (!searchRange) {\n return '';\n }\n const { startY, startX, endY, endX } = searchRange;\n const topLeft = `${x2c(startX)}${y2r(startY)}`;\n const bottomRight = `${x2c(endX)}${y2r(endY)}`;\n return `${topLeft}:${bottomRight}`;\n }, [searchRange]);\n\n const handleCloseClick = useCallback(() => {\n dispatch(setSearchQuery(undefined));\n focus(editorRef.current);\n }, [editorRef]);\n\n if (typeof searchQuery === 'undefined') {\n return null;\n }\n if (rootRef.current === null) {\n return null;\n }\n return (\n <label className={`gs-search-bar ${matchingCells.length > 0 ? 'gs-search-found' : ''}`}>\n <div className=\"gs-search-progress\" onClick={handleProgressClick}>\n {matchingCells.length === 0 ? 0 : matchingCellIndex + 1} / {matchingCells.length}\n </div>\n <div className=\"gs-search-bar-icon\" onClick={handleSearchClick}>\n <SearchIcon style={{ verticalAlign: 'middle', marginLeft: '5px' }} />\n </div>\n <div className=\"gs-search-input-wrapper\">\n <div className=\"gs-search-input-ghost\">\n <span className=\"gs-search-ghost-text\">{searchQuery}</span>\n {searchQuery && <span className=\"gs-search-ghost-hint\"> ↵ Next</span>}\n </div>\n <textarea\n ref={searchInputRef}\n value={searchQuery}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder=\"Search\"\n title=\"Press Enter to next, Shift+Enter to previous\"\n ></textarea>\n </div>\n <div className=\"gs-search-buttons\">\n {searchRange && (\n <div className=\"gs-search-button gs-search-range\">\n <span\n className=\"gs-search-button-on\"\n onClick={handleRangeClick}\n title={`Search range: ${searchRangeLabel}`}\n >\n in {searchRangeLabel}\n </span>\n </div>\n )}\n {!searchRange && hasSelection && (\n <div className=\"gs-search-button gs-search-range\">\n <span onClick={handleRangeClick} title={`Limit to range: ${selectionLabel}`}>\n in {selectionLabel}\n </span>\n </div>\n )}\n <div className=\"gs-search-button gs-search-casesensitive\">\n <span\n className={`${searchCaseSensitive ? 'gs-search-button-on' : ''}`}\n onClick={handleCaseSensitiveClick}\n title={`Case sensitive`}\n >\n Aa\n </span>\n </div>\n <div className=\"gs-search-button gs-search-regex\">\n <span\n className={`${searchRegex ? 'gs-search-button-on' : ''}`}\n onClick={handleRegexClick}\n title={`Regular expression`}\n >\n .*\n </span>\n </div>\n </div>\n <a className=\"gs-search-close\" onClick={handleCloseClick}>\n <CloseIcon style={{ verticalAlign: 'middle' }} />\n </a>\n </label>\n );\n};\n","import { useEffect, useState, useRef, useReducer, createRef } from 'react';\nimport type { CellsByAddressType, SheetHandle, StoreHandle, OptionsType, Props, StoreType } from '../types';\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n HEADER_HEIGHT,\n HEADER_WIDTH,\n SHEET_HEIGHT,\n SHEET_WIDTH,\n DEFAULT_COL_KEY,\n DEFAULT_ROW_KEY,\n} from '@gridsheet/core';\nimport { Context } from '../store';\nimport { reducer as defaultReducer } from '../store/actions';\nimport { Editor } from './Editor';\nimport { StoreObserver } from './StoreObserver';\nimport { Resizer } from './Resizer';\nimport { Emitter } from './Emitter';\nimport { ContextMenu } from './ContextMenu';\nimport { ColumnMenu } from './ColumnMenu';\nimport { RowMenu } from './RowMenu';\nimport { Sheet } from '@gridsheet/core';\nimport { Tabular } from './Tabular';\nimport { getMaxSizesFromCells } from '@gridsheet/core';\nimport { x2c, y2r } from '@gridsheet/core';\nimport { embedStyle } from '@gridsheet/core';\nimport { FormulaBar } from './FormulaBar';\nimport { SearchBar } from './SearchBar';\nimport { useBook } from '../lib/hooks';\nimport { ScrollHandle } from './ScrollHandle';\nimport { defaultContextMenuDescriptors, defaultRowMenuDescriptors, defaultColMenuDescriptors } from '../lib/menu';\n\nexport const createSheetRef = () => createRef<SheetHandle | null>();\nexport const useSheetRef = () => useRef<SheetHandle | null>(null);\nexport const createStoreRef = () => createRef<StoreHandle | null>();\nexport const useStoreRef = () => useRef<StoreHandle | null>(null);\n\nexport function GridSheet({\n initialCells,\n sheetName = '',\n sheetRef: initialSheetRef,\n storeRef: initialStoreRef,\n options = {},\n className,\n style,\n book: initialBook,\n}: Props) {\n const { sheetResize, showFormulaBar = true, mode = 'light' } = options;\n const rootRef = useRef<HTMLDivElement>(null);\n const flashRef = useRef<HTMLDivElement>(null);\n const mainRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLTextAreaElement>(null);\n const editorRef = useRef<HTMLTextAreaElement>(null);\n const largeEditorRef = useRef<HTMLTextAreaElement>(null);\n const tabularRef = useRef<HTMLDivElement>(null);\n\n const internalSheetRef = useSheetRef();\n const sheetRef = initialSheetRef ?? internalSheetRef;\n const internalStoreRef = useStoreRef();\n const storeRef = initialStoreRef ?? internalStoreRef;\n\n const internalBook = useBook({});\n const book = initialBook ?? internalBook;\n const { registry } = book;\n\n const [sheetId] = useState<number>(() => {\n if (sheetName) {\n // Named sheets: use sheetName as stable dedup key to prevent double-increment in Strict Mode.\n if (!registry._componentSheetIds.has(sheetName)) {\n registry._componentSheetIds.set(sheetName, ++registry.sheetHead);\n }\n return registry._componentSheetIds.get(sheetName)!;\n }\n // Unnamed sheets: accept double-increment in Strict Mode (IDs may skip, but remain unique).\n return ++registry.sheetHead;\n });\n\n // Initialize sheetReactive\n const sheetReactive = useRef<Sheet | null>(null);\n\n const [initialState] = useState<StoreType>(() => {\n if (!sheetName) {\n sheetName = `Sheet${sheetId}`;\n console.debug('GridSheet: sheetName is not provided, using default name:', sheetName);\n }\n const { limits, contextMenu, rowMenu, colMenu } = options;\n const sheet = new Sheet({\n limits,\n name: sheetName,\n registry,\n });\n sheet.id = sheetId;\n registry.sheetIdsByName[sheetName] = sheetId;\n\n sheet.initialize(initialCells);\n registry.onInit?.({ sheet });\n\n sheet.setTotalSize();\n sheetReactive.current = sheet;\n\n const store: StoreType = {\n sheetId,\n sheetReactive,\n rootRef,\n flashRef,\n mainRef,\n searchInputRef,\n editorRef,\n largeEditorRef,\n tabularRef,\n choosing: { y: 1, x: 1 },\n inputting: '',\n selectingZone: { startY: 1, startX: 1, endY: -1, endX: -1 },\n autofillDraggingTo: null,\n leftHeaderSelecting: false,\n topHeaderSelecting: false,\n editingAddress: '',\n editorRect: { y: 0, x: 0, height: 0, width: 0 },\n dragging: false,\n sheetHeight: 0,\n sheetWidth: 0,\n entering: false,\n matchingCells: [],\n matchingCellIndex: 0,\n searchCaseSensitive: false,\n searchRegex: false,\n editingOnEnter: true,\n contextMenuPosition: { y: -1, x: -1 },\n contextMenu: contextMenu ?? defaultContextMenuDescriptors,\n rowMenu: rowMenu ?? defaultRowMenuDescriptors,\n colMenu: colMenu ?? defaultColMenuDescriptors,\n resizingPositionY: [-1, -1, -1],\n resizingPositionX: [-1, -1, -1],\n columnMenuState: null,\n rowMenuState: null,\n editorHovering: true,\n mode: 'light',\n };\n return store;\n });\n\n type ReducerWithoutAction<S> = (prevState: S) => S;\n\n const [store, dispatch] = useReducer(\n defaultReducer as unknown as ReducerWithoutAction<StoreType>,\n initialState,\n () => initialState,\n );\n\n useEffect(() => {\n embedStyle();\n }, []);\n\n const [sheetHeight, setSheetHeight] = useState(options?.sheetHeight || estimateSheetHeight(initialCells));\n const [sheetWidth, setSheetWidth] = useState(options?.sheetWidth || estimateSheetWidth(initialCells));\n useEffect(() => {\n const el = mainRef.current;\n if (!el) {\n return;\n }\n let first = true;\n const ro = new ResizeObserver(() => {\n if (first) {\n first = false;\n return;\n }\n if (!options.sheetHeight) {\n setSheetHeight(el.clientHeight);\n }\n if (!options.sheetWidth) {\n setSheetWidth(el.clientWidth);\n }\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n useEffect(() => {\n if (options.sheetHeight) {\n setSheetHeight(options.sheetHeight);\n }\n }, [options.sheetHeight]);\n useEffect(() => {\n if (options.sheetWidth) {\n setSheetWidth(options.sheetWidth);\n }\n }, [options.sheetWidth]);\n\n return (\n <Context.Provider value={{ store, dispatch }}>\n <div\n className={`gs-root1 ${registry.ready ? 'gs-initialized' : ''}`}\n ref={rootRef}\n data-sheet-name={sheetName}\n data-mode={mode}\n data-rows={store.sheetReactive.current?.numRows ?? 0}\n data-cols={store.sheetReactive.current?.numCols ?? 0}\n >\n <div className=\"gs-flash-overlay\" ref={flashRef} />\n <ScrollHandle style={{ position: 'fixed', top: 0, left: 0 }} />\n <ScrollHandle style={{ position: 'absolute', zIndex: 4, right: 0, top: 0, width: 5 }} horizontal={1} />\n <ScrollHandle style={{ position: 'absolute', zIndex: 4, left: 0, bottom: 0, height: 5 }} vertical={1} />\n\n {typeof store.searchQuery === 'undefined' ? (\n showFormulaBar && <FormulaBar ready={registry.ready} />\n ) : (\n <SearchBar />\n )}\n <div\n className={`gs-main ${className || ''}`}\n ref={mainRef}\n style={{\n //width: '100%',\n maxWidth: (store.sheetReactive.current?.totalWidth || 0) + 2,\n maxHeight: (store.sheetReactive.current?.fullHeight || 0) + 2,\n resize: sheetResize,\n ...style,\n }}\n >\n <Editor mode={mode} />\n <Tabular />\n <StoreObserver {...{ ...options, sheetHeight, sheetWidth, sheetName, sheetRef, storeRef }} />\n <ContextMenu />\n <ColumnMenu />\n <RowMenu />\n <Resizer />\n <Emitter />\n </div>\n </div>\n </Context.Provider>\n );\n}\n\nconst estimateSheetHeight = (initialCells: CellsByAddressType) => {\n const auto = getMaxSizesFromCells(initialCells);\n let estimatedHeight = initialCells[0]?.height ?? HEADER_HEIGHT;\n for (let y = 1; y <= auto.numRows; y++) {\n const row = y2r(y);\n const height =\n initialCells?.[row]?.height ||\n initialCells?.['0' + row]?.height ||\n initialCells?.[DEFAULT_ROW_KEY]?.height ||\n initialCells?.default?.height ||\n DEFAULT_HEIGHT;\n if (estimatedHeight + height > SHEET_HEIGHT) {\n return SHEET_HEIGHT;\n }\n estimatedHeight += height;\n }\n return estimatedHeight + 3;\n};\n\nconst estimateSheetWidth = (initialCells: CellsByAddressType) => {\n const auto = getMaxSizesFromCells(initialCells);\n let estimatedWidth = initialCells[0]?.width ?? HEADER_WIDTH;\n for (let x = 1; x <= auto.numCols; x++) {\n const col = x2c(x);\n const width =\n initialCells?.[col]?.width ||\n initialCells?.[col + '0']?.width ||\n initialCells?.[DEFAULT_COL_KEY]?.width ||\n initialCells?.default?.width ||\n DEFAULT_WIDTH;\n if (estimatedWidth + width > SHEET_WIDTH) {\n return SHEET_WIDTH;\n }\n estimatedWidth += width;\n }\n return estimatedWidth + 3;\n};\n","import type { PolicyMixinType, RenderProps } from '@gridsheet/core';\n\nexport const CheckboxPolicyMixin: PolicyMixinType = {\n renderBool({ value, apply, sheet, point }: RenderProps<boolean>): any {\n return (\n <input\n type=\"checkbox\"\n checked={value}\n onChange={(e) => {\n if (apply) {\n apply(sheet.write({ point, value: e.currentTarget.checked.toString() }));\n }\n e.currentTarget.blur();\n }}\n />\n );\n },\n};\n","import type { CSSProperties } from 'react';\n\ntype BorderStyleValue = string;\n\ninterface BorderOptions {\n all?: BorderStyleValue;\n top?: BorderStyleValue;\n right?: BorderStyleValue;\n bottom?: BorderStyleValue;\n left?: BorderStyleValue;\n}\n\nexport function makeBorder(options: BorderOptions): CSSProperties {\n const result: CSSProperties = {};\n const all = options.all;\n if (options.top ?? all) {\n result.borderTop = options.top ?? all;\n }\n if (options.right ?? all) {\n result.borderRight = options.right ?? all;\n }\n if (options.bottom ?? all) {\n result.borderBottom = options.bottom ?? all;\n }\n if (options.left ?? all) {\n result.borderLeft = options.left ?? all;\n }\n return result;\n}\n"],"names":["sheet","activeFunctionHelp","activeArgIndex","h","document","currentLine","_a","top","left","shiftKey","_b","prevention","setStore","store","x","y","endY","height","endX","width","_insertRowsAbove","_insertRowsBelow","_removeRows","_insertColsLeft","_insertColsRight","_removeCols","_setStore","colCell","currentSheet","visible","palette","cell","defaultReducer"],"mappings":";;;;;;;;AAQO,MAAM,UAAU;AAAA,EACrB,CAAA;AAIF;ACYO,MAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AACF,MAAM;AACE,QAAA,MAAM,OAAuB,IAAI;AACjC,QAAA,YAAY,OAAuB,IAAI;AAC7C,QAAM,EAAE,MAAA,IAAU,WAAW,OAAO;AAE9B,QAAA,WAAW,CAAC,MAAM;AAExB,kBAAgB,MAAM;AACpB,UAAM,KAAK,UAAU;AACrB,QAAI,CAAC,IAAI;AACP;AAAA,IAAA;AAEF,kBAAc,EAAE;AAAA,EAAA,CACjB;AAED,kBAAgB,MAAM;AACpB,UAAM,KAAK,IAAI;AACX,QAAA,CAAC,MAAM,SAAS,QAAW;AAC7B;AAAA,IAAA;AAEF,eAAW,EAAE;AAAA,EAAA,CACd;AAED,MAAI,QAAQ;AAER,WAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAU;AAAA,QACV,aAAa,CAAC,MAAM;AAClB,YAAE,eAAe;AACjB,YAAE,gBAAgB;AAAA,QACpB;AAAA,QAEC,UAAA;AAAA,UAAO,OAAA,YAAY,OAAO,cACxB,oBAAA,QAAA,EAAK,WAAW,6CAA6C,OAAO,QAAQ,IAAK,UAAA,OAAO,UAAS;AAAA,UAEnG,OAAO,WACL,oBAAA,OAAA,EAAI,WAAU,wBACZ,UAAA,OAAO,OAAO,YAAY,aACvB,MAAM,cAAc,OAAO,SAAgB,EAAE,OAAO,OAAO,OAAO,IAClE,OAAO,SACb;AAAA,UAED,OAAO,cAEJ,qBAAA,UAAA,EAAA,UAAA;AAAA,YAAA,oBAAC,OAAI,EAAA,WAAU,wBAAwB,UAAA,OAAO,SAAQ;AAAA,YACrD,OAAO,eACL,oBAAA,OAAA,EAAI,WAAU,qBAAoB,OAAO,EAAE,YAAY,WACrD,GAAA,UAAA,OAAO,YACV,CAAA;AAAA,YAED,OAAO,QAAQ,OAAO,KAAK,SAAS,yBAClC,OAAI,EAAA,WAAU,qBACZ,UAAO,OAAA,KAAK,IAAI,CAAC,KAAU;;AACzB,0CAAA,OAAA,EAAY,WAAU,oBACrB,UAAA;AAAA,gBAAA,oBAAC,QAAK,EAAA,WAAU,yBAAyB,UAAA,IAAI,MAAK;AAAA,gBACjD,IAAI,YAAY,oBAAC,QAAK,EAAA,WAAU,wBAAuB,UAAW,eAAA;AAAA,gBAClE,IAAI,YAAY,oBAAC,QAAK,EAAA,WAAU,yBAAwB,UAAG,OAAA;AAAA,gBAC5D,oBAAC,UAAK,WAAU,yBAAyB,qBAAI,qCAAe,KAAK,WAAU,MAAM,CAAA;AAAA,gBACjF,qBAAC,QAAK,EAAA,WAAU,yBAAwB,UAAA;AAAA,kBAAA;AAAA,kBAAI,IAAI;AAAA,gBAAA,EAAY,CAAA;AAAA,cAAA,EALpD,GAAA,CAMV;AAAA,aACD,EACH,CAAA;AAAA,UAAA,EAEJ,CAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAEJ;AAAA,EAAA;AAIJ,MAAI,qBAAqB;AAErB,WAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAW,gBAAgB,WAAW,wBAAwB,EAAE;AAAA,QAChE,OAAO,QAAQ,UAAa,SAAS,SAAY,EAAE,KAAK,MAAM,GAAG,KAAA,IAAS;AAAA,QAEzE,UAAA;AAAA,UAAoB,oBAAA,gCAClB,QAAK,EAAA,WAAW,6CAA6C,oBAAoB,QAAQ,IACvF,UAAA,oBAAoB,SACvB,CAAA;AAAA,UAED,oBAAA,OAAA,EAAI,WAAU,qBAAqB,8BAAoB,SAAQ;AAAA,UAC/D,oBAAA,OAAA,EAAI,WAAU,4BACX,WAAM,MAAA;AACA,kBAAA,OAAO,oBAAoB,QAAQ,CAAC;AAC1C,kBAAM,cAAc,KAAK,OAAO,CAAC,MAAW,EAAE,QAAQ,EAAE;AAClD,kBAAA,gBAAgB,KAAK,SAAS;AAEpC,mBAAO,KAAK,IAAI,CAAC,KAAU,MAAc;AACnC,kBAAA;AACJ,kBAAI,iBAAiB,eAAe;AAElC,2BAAW,mBAAmB;AAAA,cACrB,WAAA,cAAc,KAAK,KAAK,eAAe;AAE1C,sBAAA,UAAU,iBAAiB,iBAAiB;AAClD,2BAAW,MAAM,gBAAgB;AAAA,cAAA,OAC5B;AACM,2BAAA;AAAA,cAAA;AAGX,qBAAA,qBAAC,MAAM,UAAN,EACE,UAAA;AAAA,gBAAA,IAAI,IAAI,OAAO;AAAA,gBACf,qBAAA,QAAA,EAAK,WAAW,WAAW,kBAAkB,IAC3C,UAAA;AAAA,kBAAA,IAAI,WAAW,MAAM;AAAA,kBACrB,IAAI;AAAA,kBACJ,IAAI,WAAW,UAAU;AAAA,kBACzB,IAAI,WAAW,MAAM;AAAA,gBAAA,EACxB,CAAA;AAAA,cAAA,EAAA,GAPmB,CAQrB;AAAA,YAAA,CAEH;AAAA,gBAEL;AAAA,WACE,MAAM;;AACA,kBAAA,OAAO,oBAAoB,QAAQ,CAAC;AAC1C,kBAAM,cAAc,KAAK,OAAO,CAAC,MAAW,EAAE,QAAQ,EAAE;AAClD,kBAAA,gBAAgB,KAAK,SAAS;AAEhC,gBAAA;AACA,gBAAA,iBAAiB,iBAAiB,gBAAgB,GAAG;AACvD,8BAAgB,KAAK,IAAI,gBAAgB,KAAK,SAAS,CAAC;AAAA,YAAA,OACnD;AACC,oBAAA,UAAU,iBAAiB,iBAAiB;AAClD,8BAAgB,gBAAgB;AAAA,YAAA;AAE5B,kBAAA,YAAY,KAAK,aAAa;AAChC,gBAAA,EAAC,uCAAW,cAAa;AACpB,qBAAA;AAAA,YAAA;AAET,mBACG,oBAAA,OAAA,EAAI,WAAU,qBAAoB,OAAO,EAAE,WAAW,GAAG,UAAU,IAAI,OAAO,OAAO,GACpF,+BAAC,KACC,EAAA,UAAA;AAAA,cAAA,qBAAC,UAAQ,EAAA,UAAA;AAAA,gBAAU,UAAA;AAAA,gBAAK;AAAA,cAAA,GAAC;AAAA,cAAU;AAAA,cACnC,oBAAC,UAAK,WAAU,yBAAyB,2BAAU,qCAAe,KAAK,WAAU,MAAM,CAAA;AAAA,cACtF,UAAU;AAAA,YAAA,EAAA,CACb,EACF,CAAA;AAAA,UAAA,GAED;AAAA,UAEF,oBAAoB,eAClB,oBAAA,OAAA,EAAI,WAAU,qBAAoB,OAAO,EAAE,YAAY,WAAA,GACrD,UAAA,oBAAoB,YACvB,CAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAEJ;AAAA,EAAA;AAIG,SAAA;AACT;AC3KO,MAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACE,QAAA,QAAQ,OAAyB,IAAI;AAC3C,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,IAAI;AAErD,kBAAgB,MAAM;AAChB,QAAA,CAAC,MAAM,SAAS;AAClB;AAAA,IAAA;AAEF,UAAM,QAAQ,MAAM,QAAQ,sBAAwB,EAAA;AACpC,oBAAA,UAAU,MAAM,KAAK,CAAC;AAAA,EAAA,GACrC,CAAC,MAAM,eAAe,CAAC;AAEtB,MAAA,gBAAgB,WAAW,GAAG;AACzB,WAAA;AAAA,EAAA;AAGT,6BACG,MAAG,EAAA,KAAK,OAAO,WAAU,qBAAoB,OAAO,EAAE,KAAK,MAAM,aAC/D,GAAA,UAAA,gBAAgB,IAAI,CAAC,QAAQ,MAC5B;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,WAAW,oBAAoB,aAAa,IAAI,+BAA+B,EAAE;AAAA,MACjF,aAAa,CAAC,MAAM,kBAAkB,GAAG,CAAC;AAAA,MAE1C,UAAA;AAAA,QAAC,qBAAA,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,UAAA,oBAAC,QAAM,EAAA,UAAA,OAAO,SAAS,OAAO,OAAM;AAAA,UACnC,aAAa,KAAK,oBAAC,QAAK,EAAA,WAAU,wBAAuB,UAAK,QAAA,CAAA;AAAA,QAAA,GACjE;AAAA,SACE,OAAO,cAAc,OAAO,YAAY,aAAa,KAAK,oBAAC,iBAAc,OAAgB,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IARtF;AAAA,EAUR,CAAA,GACH;AAEJ;AC7Ca,MAAA,OAAO,CAAC,UAAqB;AACxC,QAAM,EAAE,eAAe,UAAU,WAAW,eAAe,aAAa;AACxE,QAAM,QAAQ,SAAS;AAEvB,MAAI,CAAC,OAAO;AACH,WAAA,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,EAAE;AAAA,EAAA;AAG1C,QAAA,EAAE,GAAG,EAAA,IAAM;AACX,QAAA,gBAAgB,WAAW,aAAa;AAC9C,MAAI,OAAO;AACP,MAAA,KAAK,SAAS,IAAI;AACb,WAAA,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,EAAE;AAAA,EAAA;AAEhD,QAAM,QAAQ,UAAU;AAClB,QAAA,UAAU,MAAM,KAAK,IAAI;AACzB,QAAA,MAAM,UAAU,SAAS;AAAA,IAC7B,QAAQ,CAACA,QAAO,UAAU;AAClB,YAAA,SAASA,OAAM,UAAU,KAAK;AACpC,aAAO,OAAO,sBAAsB,EAAE,OAAO,OAAAA,QAAO;AAAA,IAAA;AAAA,EACtD,CACD;AACK,QAAA,OAAO,WAAW,SAAS;AAAA,IAC/B,QAAQ,CAACA,QAAO,UAAU;AAClB,YAAA,SAASA,OAAM,UAAU,KAAK;AACpC,aAAO,OAAO,sBAAsB,EAAE,OAAO,OAAAA,QAAO;AAAA,IAAA;AAAA,EACtD,CACD;AAED,MAAI,UAAU,WAAW;AACjB,UAAA,UAAU,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,cAAc;AAChD,UAAA,WAAW,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,aAAa;AAEvD,cAAU,UAAU,MAAM;AAAA,MACxB,IAAI,cAAc;AAAA,QAChB,cAAc;AAAA,QACd,aAAa;AAAA,MACd,CAAA;AAAA,IAAA,CACF;AAAA,EAAA,WACQ,SAAS,MAAM;AACxB,UAAM,QAAQ;AACd,UAAM,KAAK;AACX,UAAM,OAAO;AACb,aAAS,YAAY,MAAM;AAC3B,UAAM,QAAQ;AACd,UAAM,KAAK;AAAA,EAAA;AAEN,SAAA;AACT;AAUa,MAAA,YAAY,CACvB,OACA;AAAA,EACE,SAAS,CAACA,QAAO,UAAU;;AACzB,WAAO,SAAOA,YAAM,QAAQ,KAAK,MAAnBA,mBAAsB,UAAS,EAAE;AAAA,EACjD;AAAA,EACA,uBAAuB;AAAA,EACvB,2BAA2B;AAAA,EAC3B,YAAY;AAAA,EACZ,UAAU;AACZ,IAAmB,OACR;AACX,QAAM,OAA6C,CAAC;AACpD,WAAS,IAAI,MAAM,KAAK,KAAK,MAAM,QAAQ,KAAK;AAC9C,QAAI,MAAM,cAAc,CAAC,KAAK,CAAC,sBAAsB;AACnD;AAAA,IAAA;AAEF,UAAM,OAAiB,CAAC;AACxB,QAAI,aAAa;AACjB,aAAS,IAAI,MAAM,MAAM,KAAK,MAAM,OAAO,KAAK;AACxC,YAAA,QAAmB,EAAE,GAAG,EAAE;AAC1B,YAAA,QAAQ,OAAO,OAAO,KAAK;AACjC,UAAI,UAAU,IAAI;AACH,qBAAA;AAAA,MAAA;AAEf,UAAI,MAAM,QAAQ,IAAI,MAAM,IAAI;AAC9B,aAAK,KAAK,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC,GAAG;AAAA,MAAA,OACrC;AACL,aAAK,KAAK,KAAK;AAAA,MAAA;AAAA,IACjB;AAEG,SAAA,KAAK,EAAE,SAAS,YAAY,MAAM,KAAK,KAAK,SAAS,GAAG;AAAA,EAAA;AAE/D,MAAI,0BAA0B;AACrB,WAAA,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,CAAC,EAAE,SAAS;AACvD,WAAK,IAAI;AAAA,IAAA;AAAA,EACX;AAEK,SAAA,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,OAAO;AAC7C;AAQa,MAAA,aAAa,CACxB,OACA;AAAA,EACE,SAAS,CAACA,QAAO,UAAU;;AACzB,WAAO,SAAOA,YAAM,QAAQ,KAAK,MAAnBA,mBAAsB,UAAS,EAAE;AAAA,EACjD;AAAA,EACA,uBAAuB;AAAA,EACvB,2BAA2B;AAC7B,IAAoB,OACT;AACX,QAAM,OAA6C,CAAC;AACpD,WAAS,IAAI,MAAM,KAAK,KAAK,MAAM,QAAQ,KAAK;AAC9C,QAAI,MAAM,cAAc,CAAC,KAAK,CAAC,sBAAsB;AACnD;AAAA,IAAA;AAEF,UAAM,OAAiB,CAAC;AACxB,QAAI,aAAa;AACjB,aAAS,IAAI,MAAM,MAAM,KAAK,MAAM,OAAO,KAAK;AACxC,YAAA,QAAmB,EAAE,GAAG,EAAE;AAC1B,YAAA,QAAQ,OAAO,OAAO,KAAK;AACjC,UAAI,UAAU,IAAI;AACH,qBAAA;AAAA,MAAA;AAET,YAAA,eAAe,MAClB,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;AAClB,WAAA,KAAK,OAAO,YAAY,OAAO;AAAA,IAAA;AAEjC,SAAA,KAAK,EAAE,SAAS,YAAY,MAAM,OAAO,KAAK,KAAK,EAAE,CAAC,QAAA,CAAS;AAAA,EAAA;AAEtE,MAAI,0BAA0B;AACrB,WAAA,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,CAAC,EAAE,SAAS;AACvD,WAAK,IAAI;AAAA,IAAA;AAAA,EACX;AAEK,SAAA,UAAU,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACnD;ACzIO,MAAM,kBAAkB,CAAC,EAAE,WAAW,gBAAgB,YAAY,gBAAsC;AAC7G,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,CAAC;AAE1C,QAAM,EAAE,iBAAiB,aAAa,oBAAoB,eAAe,IAAI,QAAQ,MAAM;;AACnF,UAAA,YAAY,UAAU,WAAW,GAAG;AAE1C,QAAIC,sBAA0C;AAC9C,QAAIC,kBAAyB;AAE7B,UAAM,mBAAmB,UAAU,MAAM,GAAG,cAAc;AACpD,UAAA,kBAAkB,UAAU,MAAM,cAAc;AAGlD,QAAA,aAAa,iBAAiB,SAAS,GAAG;AACxC,UAAA;AACI,cAAA,eAAe,iBAAiB,MAAM,CAAC;AACvC,cAAA,QAAQ,IAAI,MAAM,YAAY;AACpC,cAAM,SAAS;AAEf,cAAM,gBAA6E,CAAC;AAEpF,iBAAS,IAAI,GAAG,IAAI,MAAM,OAAO,QAAQ,KAAK;AACtC,gBAAA,QAAQ,MAAM,OAAO,CAAC;AACxB,cAAA,MAAM,SAAS,YAAY;AAC7B,kBAAM,YAAY,MAAM,OAAO,IAAI,CAAC;AAChC,iBAAA,uCAAW,UAAS,QAAQ;AAChB,4BAAA,KAAK,EAAE,MAAM,MAAM,QAAkB,UAAU,GAAG,cAAc,OAAO;AACrF;AAAA,YACS,WAAA,MAAM,MAAM,OAAO,SAAS,GAAG;AAAA,YAAA;AAAA,UAG1C,WACS,MAAM,SAAS,SAAS;AAC7B,gBAAA,cAAc,SAAS,GAAG;AACd,4BAAA,cAAc,SAAS,CAAC,EAAE;AACxC,4BAAc,cAAc,SAAS,CAAC,EAAE,eAAe;AAAA,YAAA;AAAA,UACzD,WACS,MAAM,SAAS,SAAS;AAC7B,gBAAA,cAAc,SAAS,GAAG;AAC5B,4BAAc,IAAI;AAAA,YAAA;AAAA,UACpB,WACS,MAAM,SAAS,WAAW,cAAc,SAAS,GAAG;AAC7D,0BAAc,cAAc,SAAS,CAAC,EAAE,eAAe;AAAA,UAAA;AAAA,QACzD;AAGE,YAAA,cAAc,SAAS,GAAG;AAC5B,gBAAM,aAAa,cAAc,cAAc,SAAS,CAAC;AACnD,gBAAA,QAAQ,iBAAiB,SAAS;AACxCA,4BAAiB,WAAW;AAC5BD,gCAAqB,MAAM,KAAK,CAACE,OAAWA,GAAE,SAAS,WAAW,KAAK,YAAY,CAAC,KAAK;AAAA,QAAA;AAAA,eAEpF,GAAG;AAAA,MAAA;AAAA,IAEZ;AAGF,UAAM,eAAa,sBAAiB,MAAM,iBAAiB,MAAxC,mBAA4C,OAAM;AACrE,UAAM,cAAY,qBAAgB,MAAM,iBAAiB,MAAvC,mBAA2C,OAAM;AAInE,UAAM,cAAc,aAAa,aAAa,WAAW,YAAY,IAAI,UAAU,kBAAkB;AAC/F,UAAA,uBAAuB,aAAa,gBAAgB,MAAM,UAAU,MAAM,EAAE,UAAA,EAAY,WAAW,GAAG;AAE5G,QAAI,WAAkB,CAAC;AAEvB,QAAI,cAAc;AAClB,QAAI,WAAW;AACT,UAAA;AACF,cAAM,YAAY,IAAI,MAAM,UAAU,MAAM,CAAC,CAAC;AAC9C,kBAAU,SAAS;AACnB,YAAI,eAAe;AACR,mBAAA,SAAS,UAAU,QAAQ;AAC9B,gBAAA,OAAO,MAAM,OAAO;AAC1B,cAAI,iBAAiB,gBAAgB,iBAAiB,eAAe,MAAM;AACrE,gBAAA,CAAC,OAAO,SAAS,MAAM,YAAY,cAAc,EAAE,SAAS,MAAM,IAAI,GAAG;AAC7D,4BAAA;AAAA,YAAA;AAGhB,gBAAI,MAAM,SAAS,WAAW,OAAO,MAAM,WAAW,UAAU;AAChD,4BAAA;AAAA,YAAA;AAEhB;AAAA,UAAA;AAEF,cAAI,mBAAmB,gBAAgB,mBAAmB,eAAe,MAAM;AACzE,gBAAA,CAAC,OAAO,SAAS,MAAM,YAAY,cAAc,EAAE,SAAS,MAAM,IAAI,GAAG;AAC7D,4BAAA;AAAA,YAAA;AAAA,UAChB;AAEc,0BAAA;AAAA,QAAA;AAAA,eAEX,GAAG;AAAA,MAAA;AAAA,IAEZ;AAGE,QAAA,aAAa,CAAC,aAAa;AAE7B,UAAI,YAAY,SAAS,KAAK,CAAC,sBAAsB;AACnD,mBAAW,iBAAiB,SAAS,EAClC,IAAI,CAAC,SAAc;AACZ,gBAAA,eAAe,KAAK,KAAK,YAAY;AACrC,gBAAA,aAAa,aAAa,WAAW,WAAW;AAChD,gBAAA,QAAQ,aAAa,IAAI;AACzB,gBAAA,YAAY,KAAK,KAAK,WAAW;AAChC,iBAAA;AAAA,YACL,QAAQ,EAAE,GAAG,MAAM,OAAO,KAAK,QAAQ,YAAY,OAAO,MAAM,YAAY,MAAM,OAAO,KAAK,KAAK;AAAA,YACnG;AAAA,YACA;AAAA,YACA,cAAc;AAAA,YACd,SAAS;AAAA,UACX;AAAA,QAAA,CACD,EACA,OAAO,CAAC,EAAE,WAA0C,MAAA,UAAU,EAC9D,KAAK,CAAC,GAAQ,MAAW;AACpB,cAAA,EAAE,eAAe,EAAE,YAAY;AAC1B,mBAAA,EAAE,aAAa,IAAI;AAAA,UAAA;AAExB,cAAA,EAAE,UAAU,EAAE,OAAO;AAChB,mBAAA,EAAE,QAAQ,EAAE;AAAA,UAAA;AAErB,iBAAO,EAAE,QAAQ,cAAc,EAAE,OAAO;AAAA,QACzC,CAAA,EACA,IAAI,CAAC,EAAE,OAAA,MAA8B,MAAM;AAAA,MAAA;AAAA,IAChD,OACK;AACM,iBAAA,WACR,IAAI,CAAC,WAAW;AACf,cAAM,WAAW,OAAO,YAAY,CAAC,OAAO,OAAO,KAAK,CAAC;AACzD,YAAI,YAAY,EAAE,OAAO,IAAI,YAAY,OAAO,SAAS,GAAG;AAE5D,mBAAW,WAAW,UAAU;AACxB,gBAAA,eAAe,QAAQ,YAAY;AACnC,gBAAA,QAAQ,aAAa,QAAQ,WAAW;AAC9C,cAAI,UAAU,IAAI;AACV,kBAAA,aAAa,aAAa,WAAW,WAAW;AACtD,gBACE,UAAU,UAAU,MACpB,QAAQ,UAAU,SACjB,UAAU,UAAU,SAAS,cAAc,CAAC,UAAU,YACvD;AACY,0BAAA,EAAE,OAAO,YAAY,QAAQ;AAAA,YAAA;AAAA,UAC3C;AAAA,QACF;AAGK,eAAA;AAAA,UACL;AAAA,UACA,GAAG;AAAA,UACH,cAAc,SAAS;AAAA,QACzB;AAAA,MACD,CAAA,EACA,OAAO,CAAC,EAAE,YAAY,UAAU,EAAE,EAClC,KAAK,CAAC,GAAG,MAAM;AACV,YAAA,EAAE,eAAe,EAAE,YAAY;AAC1B,iBAAA,EAAE,aAAa,IAAI;AAAA,QAAA;AAExB,YAAA,EAAE,UAAU,EAAE,OAAO;AAChB,iBAAA,EAAE,QAAQ,EAAE;AAAA,QAAA;AAEjB,YAAA,EAAE,iBAAiB,EAAE,cAAc;AAC9B,iBAAA,EAAE,eAAe,EAAE;AAAA,QAAA;AAE5B,eAAO,EAAE,QAAQ,cAAc,EAAE,OAAO;AAAA,MACzC,CAAA,EACA,IAAI,CAAC,EAAE,OAAA,MAAa,MAAM;AAAA,IAAA;AAGxB,WAAA;AAAA,MACL,iBAAiB;AAAA,MACjB,aAAa;AAAA,QACX;AAAA,QACA;AAAA,QACA,mBAAmB,WAAW;AAAA,QAC9B,kBAAkB,UAAU;AAAA,MAC9B;AAAA,MACA,oBAAAF;AAAAA,MACA,gBAAAC;AAAAA,IACF;AAAA,KACC,CAAC,WAAW,gBAAgB,YAAY,SAAS,CAAC;AAErD,UAAQ,MAAM;AACR,QAAA,YAAY,gBAAgB,QAAQ;AACtC,kBAAY,CAAC;AAAA,IAAA;AAAA,EAEd,GAAA,CAAC,gBAAgB,QAAQ,QAAQ,CAAC;AAErC,QAAM,oBAAoB;AAAA,IACxB,CAAC,WAAgB;AACf,UAAI,CAAC,QAAQ;AACJ,eAAA,EAAE,OAAO,WAAW,eAAe;AAAA,MAAA;AAG5C,UAAI,YAAY,WAAW;AACzB,cAAM,cAAc,UAAU,MAAM,GAAG,iBAAiB,YAAY,iBAAiB;AACrF,cAAM,aAAa,UAAU,MAAM,iBAAiB,YAAY,gBAAgB;AAC1E,cAAA,WAAW,cAAc,OAAO,QAAQ;AACvC,eAAA,EAAE,OAAO,UAAU,gBAAgB,YAAY,SAAS,OAAO,MAAM,OAAO;AAAA,MAAA,OAC9E;AACE,eAAA,EAAE,OAAO,OAAO,OAAO,KAAK,GAAG,gBAAgB,OAAO,OAAO,KAAK,EAAE,OAAO;AAAA,MAAA;AAAA,IAEtF;AAAA,IACA,CAAC,WAAW,gBAAgB,WAAW;AAAA,EACzC;AAEA,QAAM,gBAAgB;AAAA,IACpB,CAAC,MAAgD;AAC3C,UAAA,gBAAgB,SAAS,GAAG;AAClB,oBAAA,CAAC,MAAO,KAAK,IAAI,gBAAgB,SAAS,IAAI,IAAI,CAAE;AAChE,UAAE,eAAe;AACV,eAAA;AAAA,MAAA;AAEF,aAAA;AAAA,IACT;AAAA,IACA,CAAC,gBAAgB,MAAM;AAAA,EACzB;AAEA,QAAM,kBAAkB;AAAA,IACtB,CAAC,MAAgD;AAC3C,UAAA,gBAAgB,SAAS,GAAG;AAClB,oBAAA,CAAC,MAAO,KAAK,gBAAgB,SAAS,IAAI,IAAI,IAAI,CAAE;AAChE,UAAE,eAAe;AACV,eAAA;AAAA,MAAA;AAEF,aAAA;AAAA,IACT;AAAA,IACA,CAAC,gBAAgB,MAAM;AAAA,EACzB;AAEO,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,YAAY;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AACF;ACnPa,MAAA,QAAmB,CAAC,EAAE,UAAU,OAAO,YAAY,IAAI,GAAG,YAAY;AAC3E,QAAA,EAAE,UAAAE,UAAS,IAAI,WAAW;AAChC,MAAIA,aAAY,MAAM;AACb,WAAA;AAAA,EAAA;AAEF,SAAA;AAAA,IACL,oBAAC,SAAK,GAAG,OAAO,WAAW,YAAY,SAAS,IAAI,OACjD,SACH,CAAA;AAAA,IACAA,UAAS;AAAA,EACX;AACF;ACpBO,MAAM,YAAY,CAAC,MAAc,YAAY,UAA2B;AACvE,QAAA,SAAS,IAAI,UAAU;AAC7B,QAAM,MAAM,OAAO,gBAAgB,MAAM,WAAW;AACpD,QAAM,UAA2B,CAAC;AAE5B,QAAA,eAAe,CAAC,UAA4B;;AAC1C,UAAA,4BAAY,IAAY;AACxB,UAAA,OAAO,MAAM,iBAAiB,YAAY;AAChD,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAC9B,YAAA,MAAM,KAAK,CAAC;AACd,UAAA,IAAI,YAAY,WAAW;AAC7B,cAAM,YAAU,SAAI,gBAAJ,mBAAiB,WAAU;AAC3C,YAAI,SAAS;AACX,kBAAQ,KAAK,CAAC,EAAE,OAAO,QAAS,CAAA,CAAC;AAAA,QAAA;AAEnC;AAAA,MAAA;AAEF,YAAM,QAAQ,MAAM,KAAK,IAAI,iBAAiB,QAAQ,CAAC;AACvD,YAAM,SAAwB,CAAC;AAC/B,UAAI,IAAI;AACR,iBAAW,QAAQ,OAAO;AACxB,cAAM,UAAQ,UAAK,gBAAL,mBAAkB,WAAU;AACpC,cAAA,QAAmC,YACrC,UACC,MAAM;AACC,gBAAA,aAAa,iBAAiB,KAAK,iBAAiB;AACpD,gBAAA,cAAc,iBAAiB,IAAI;AACzC,iBAAO,EAAE,GAAG,aAAa,GAAG,WAAW;AAAA,QAAA,GACtC;AACA,eAAA,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG;AAC/B,iBAAO,KAAK,EAAE,OAAO,IAAI,OAAO,MAAM,MAAM;AAAA,QAAA;AAE9C,eAAO,KAAK,EAAE,OAAO,MAAA,CAAO;AAE5B,cAAM,UAAU,SAAS,KAAK,aAAa,SAAS,KAAK,KAAK,EAAE;AAChE,cAAM,UAAU,SAAS,KAAK,aAAa,SAAS,KAAK,KAAK,EAAE;AAChE,iBAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,mBAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,kBAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;AAAA,UAAA;AAAA,QAC/B;AAAA,MACF;AAEF,cAAQ,KAAK,MAAM;AAAA,IAAA;AAAA,EAEvB;AAEA,QAAM,0BAA0B,CAAC,MAAYC,eAA6B,CAAA,MAAO;AAC3E,QAAA,KAAK,aAAa,KAAK,cAAc;AACvC,YAAM,KAAK;AACX,YAAM,UAAU,GAAG;AAEnB,UAAI,YAAY,SAAS;AACnBA,YAAAA,aAAY,SAAS,GAAG;AAClB,kBAAA,KAAKA,aAAY,OAAO;AAChCA,uBAAY,SAAS;AAAA,QAAA;AAEvB,qBAAa,EAAsB;AAAA,MAAA,WAC1B,YAAY,MAAM;AACnB,gBAAA,KAAKA,aAAY,OAAO;AAChCA,qBAAY,SAAS;AAAA,MACZ,WAAA,UAAU,IAAI,OAAO,GAAG;AAC7BA,YAAAA,aAAY,SAAS,GAAG;AAClB,kBAAA,KAAKA,aAAY,OAAO;AAChCA,uBAAY,SAAS;AAAA,QAAA;AAEvB,WAAG,WAAW,QAAQ,CAAC,UAAU,wBAAwB,OAAOA,YAAW,CAAC;AACxEA,YAAAA,aAAY,SAAS,GAAG;AAClB,kBAAA,KAAKA,aAAY,OAAO;AAChCA,uBAAY,SAAS;AAAA,QAAA;AAAA,MACvB,OACK;AACL,WAAG,WAAW,QAAQ,CAAC,UAAU,wBAAwB,OAAOA,YAAW,CAAC;AAAA,MAAA;AAAA,IAErE,WAAA,KAAK,aAAa,KAAK,WAAW;AACrC,YAAA,OAAO,KAAK,eAAe;AAC3B,YAAA,QAAQ,KAAK,MAAM,OAAO;AAChC,iBAAW,QAAQ,OAAO;AAClB,cAAA,UAAU,KAAK,KAAK;AAC1B,YAAI,SAAS;AACXA,uBAAY,KAAK,EAAE,OAAO,SAAS;AAAA,QAAA;AAAA,MACrC;AAAA,IACF;AAAA,EAEJ;AAEA,QAAM,cAA6B,CAAC;AAChC,MAAA,KAAK,WAAW,QAAQ,CAAC,SAAS,wBAAwB,MAAM,WAAW,CAAC;AAC5E,MAAA,YAAY,SAAS,GAAG;AAC1B,YAAQ,KAAK,WAAW;AAAA,EAAA;AAGnB,SAAA;AACT;AAEA,SAAS,iBAAiB,SAA0D;AAClF,MAAI,CAAC,SAAS;AACL,WAAA;AAAA,EAAA;AAET,QAAM,cAAc,QAAQ,aAAa,OAAO,KAAK;AACrD,QAAM,WAAgC,CAAC;AAEvC,cAAY,MAAM,GAAG,EAAE,QAAQ,CAAC,MAAM;AACpC,QAAI,CAAC,QAAQ,QAAQ,IAAI,EAAE,MAAM,GAAG;AAChC,QAAA,CAAC,UAAU,CAAC,UAAU;AACxB;AAAA,IAAA;AAEF,aAAS,OAAO,KAAK;AACjB,QAAA,WAAW,YAAY,WAAW,SAAS;AAC7C;AAAA,IAAA;AAEI,UAAA,MAAM,OAAO,KAAA,EAAO,QAAQ,aAAa,CAAC,GAAG,WAAW,OAAO,YAAA,CAAa;AAClF,QAAI,QAAQ,WAAW,QAAQ,aAAa,IAAI,WAAW,SAAS,GAAG;AACrE;AAAA,IAAA;AAEF,QAAI,QAAQ,UAAU;AACpB,aAAO,OAAO,UAAU;AAAA,QACtB,WAAW;AAAA,QACX,aAAa;AAAA,QACb,cAAc;AAAA,QACd,YAAY;AAAA,MAAA,CACb;AACD;AAAA,IAAA;AAEF,QAAI,QAAQ,eAAe;AACzB,aAAO,OAAO,UAAU;AAAA,QACtB,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,MAAA,CAClB;AACD;AAAA,IAAA;AAEF,QAAI,QAAQ,eAAe;AACzB,aAAO,OAAO,UAAU;AAAA,QACtB,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,MAAA,CAClB;AACD;AAAA,IAAA;AAEF,QAAI,QAAQ,eAAe;AACzB,aAAO,OAAO,UAAU;AAAA,QACtB,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,MAAA,CAClB;AACD;AAAA,IAAA;AAEI,UAAA,QAAQ,SAAS,KAAK;AAC3B,aAAiB,GAAG,IAAI;AAAA,EAAA,CAC1B;AAEM,SAAA;AACT;AAEO,MAAM,YAAY,CAAC,KAAa,MAAM,QAA0B;AAC/D,QAAA,IAAI,QAAQ,OAAO,IAAM;AACzB,QAAA,OAAwB,CAAC,EAAE;AAC7B,MAAA,MAAM,KAAK,CAAC;AAChB,MAAI,WAAW;AACf,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AAC7B,UAAA,IAAI,IAAI,CAAC;AACX,QAAA,MAAM,QAAQ,CAAC,UAAU;AAC3B,UAAI,KAAK,EAAE,OAAO,mBAAmB,IAAI,GAAG;AACrC,aAAA;AACP,YAAM,CAAC;AACP,WAAK,KAAK,GAAG;AACb;AAAA,IAAA;AAEF,QAAI,MAAM,KAAK;AACb,UAAI,KAAK,EAAE,OAAO,mBAAmB,IAAI,GAAG;AACrC,aAAA;AACP;AAAA,IAAA;AAEF,QAAI,MAAM,OAAO,CAAC,YAAY,SAAS,IAAI;AAC9B,iBAAA;AACX;AAAA,IAAA;AAEE,QAAA,MAAM,OAAO,UAAU;AACd,iBAAA;AACX;AAAA,IAAA;AAEM,YAAA;AAAA,EAAA;AAEV,MAAI,MAAM;AACR,QAAI,KAAK,EAAE,OAAO,mBAAmB,IAAI,GAAG;AAAA,EAAA;AAEvC,SAAA;AACT;AAEA,MAAM,qBAAqB,CAAC,SAAiB,KAAK,QAAQ,SAAS,GAAG;AAEtE,MAAM,gCAAgB,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;ACnLM,MAAM,SAAoB,CAAC,EAAE,WAAkB;;AACpD,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AAC9C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,CAAC;AACtD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAC1C,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,QAAQ,SAAS;AAEvB,QAAM,iBAAiB,MAAM;;AAC3B,QAAI,CAAC,aAAa,CAAC,WAAW,OAAO,aAAa,aAAa;AACtD,aAAA;AAAA,IAAA;AAEL,QAAA,UAAU,YAAY,SAAS,eAAe;AACzC,aAAA;AAAA,IAAA;AAGH,UAAA,QAAOC,MAAA,UAAU,YAAV,gBAAAA,IAAmB;AAChC,QAAI,CAAC,MAAM;AACF,aAAA;AAAA,IAAA;AAET,UAAM,EAAE,QAAQC,MAAK,MAAAC,MAAS,IAAA;AAEvB,WAAA;AAAA,MAEF,qBAAA,UAAA,EAAA,UAAA;AAAA,QACC,sBAAA,gBAAgB,WAAW,MAC1B,CAAC,iBAAkB,cAAc,SAAS,MAAM,cAAc,SAAS,OACtE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,qBAAqB;AAAA,YACrB;AAAA,YACA,KAAKD;AAAAA,YACL,MAAMC;AAAAA,UAAA;AAAA,QACR;AAAA,QAEH,gBAAgB,SAAS,KACxB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,KAAKD;AAAAA,YACL,MAAMC;AAAAA,YACN;AAAA,YACA,mBAAmB;AAAA,UAAA;AAAA,QAAA;AAAA,MACrB,GAEJ;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAEM,QAAA,SAAS,+BAAO,UAAU;AAChC,QAAM,cAAa,iCAAQ,uBAAsB,CAAC;AAE5C,QAAA,eAAe,YAAY,CAAC,MAAiD;AAC/D,sBAAA,EAAE,cAAc,cAAc;AAAA,EAClD,GAAG,EAAE;AAEC,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,MACE,gBAAgB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,+BAAO,SAAS;AAAA,EAAA,CAC5B;AAED,YAAU,MAAM;AACd,UAAM,uCAAW,OAAO;AAAA,EAAA,GACvB,CAAC,SAAS,CAAC;AAEd,YAAU,MAAM;AACd,QAAI,CAAC,OAAO;AACV;AAAA,IAAA;AAEE,QAAA,MAAM,SAAS,eAAe,MAAM;AACtC;AAAA,IAAA;AAEF,QAAI,MAAM,SAAS,gBAAgB,UAAU,SAAS;AACpD;AAAA,IAAA;AAEF,QAAI,MAAM,SAAS,gBAAgB,eAAe,SAAS;AACzD;AAAA,IAAA;AAGO,aAAA,kBAAkB,EAAE,CAAC;AAAA,EAAA,GAC7B,CAAC,+BAAO,SAAS,aAAa,OAAO,WAAW,gBAAgB,QAAQ,CAAC;AAC5E,YAAU,MAAM;AACd,QAAI,CAAC,OAAO;AACV;AAAA,IAAA;AAEF,UAAM,SAAS,iBAAiB;AAChC,UAAM,SAAS,iBAAiB;AAAA,EAC/B,GAAA,CAAC,gBAAgB,OAAO,OAAO,CAAC;AAEnC,YAAU,MAAM;AAEd,gBAAY,UAAU,OAAO;AAAA,EAC5B,GAAA,CAAC,WAAW,gBAAgB,SAAS,CAAC;AAEnC,QAAA,EAAE,GAAG,EAAA,IAAM;AACjB,QAAM,QAAQ,GAAG,IAAI,CAAC,CAAC;AACjB,QAAA,QAAQ,IAAI,CAAC;AACnB,QAAM,UAAU,GAAG,KAAK,GAAG,KAAK;AAChC,QAAM,UAAU,mBAAmB;AAI7B,QAAA,OAAO,+BAAO,QAAQ,EAAE,GAAG,KAAK,EAAE,YAAY;AAC9C,QAAA,gBAAgB,QAAQ,MAAM,mBAAmB,EAAE,OAAO,UAAU,MAAM,YAAY,MAAM,CAAC,IAAI;AACvG,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAiB,aAAa;AAE1D,QAAM,YAAY;AAAA,IAChB,CAAC,UAAkB;AACjB,UAAI,WAAW,OAAO;AACpB,iBAAS,MAAM,EAAE,MAAM,CAAC,CAAC;AAAA,MAAA;AAE3B,gBAAU,KAAK;AAAA,IACjB;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,EACnB;AAEA,QAAM,cAAc;AAAA,IAClB,CAAC,kBAA0B;AACzB,UAAI,CAAC,OAAO;AACV;AAAA,MAAA;AAEI,YAAA,SAAS,gBAAgB,aAAa;AAC5C,UAAI,QAAQ;AACV,YAAI,OAAO,YAAY;AACrB,gBAAM,EAAE,OAAO,UAAU,gBAAgB,UAAU,IAAI,kBAAkB,MAAM;AACtE,mBAAA,aAAa,QAAQ,CAAC;AAE/B,qBAAW,MAAM;AACf,gBAAI,UAAU,SAAS;AACrB,oBAAM,UAAU,OAAO;AACb,wBAAA,QAAQ,kBAAkB,WAAW,SAAS;AAAA,YAAA;AAAA,aAEzD,CAAC;AAAA,QAAA,OACC;AACC,gBAAA,IAAI,MAAM,OAAO;AAAA,YACrB,MAAM,EAAE,CAAC,OAAO,GAAG,EAAE,OAAO,OAAO,QAAQ;AAAA,YAC3C,SAAS;AAAA,UAAA,CACV;AACD,mBAAS,YAAY,EAAE,MAAO,CAAA,CAAC;AACtB,mBAAA,kBAAkB,EAAE,CAAC;AACrB,mBAAA,aAAa,EAAE,CAAC;AAAA,QAAA;AAE3B,oBAAY,CAAC;AAAA,MAAA;AAAA,IAEjB;AAAA,IACA,CAAC,iBAAiB,OAAO,SAAS,WAAW,WAAW,UAAU,SAAS;AAAA,EAC7E;AAEA,YAAU,MAAM;AACd,QAAI,CAAC,OAAO;AACV;AAAA,IAAA;AAEF,cAAU,aAAa;AACd,aAAA,aAAa,aAAa,CAAC;AACzB,eAAA,UAAU,SAAS,OAAO,QAAQ;AAAA,EAAA,GAC5C,CAAC,UAAU,eAAe,UAAU,WAAW,KAAK,CAAC;AAExD,QAAM,EAAE,GAAG,KAAK,GAAG,MAAM,QAAQ,UAAU;AAE3C,QAAM,WAAW,cAAc,MAAM,IAAI,EAAE;AAC3C,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,gBAAgB;AAAA,IACpB,CAAC,MAAkC;;AACjC,UAAI,CAAC,OAAO;AACV;AAAA,MAAA;AAEF,UAAI,WAAW;AACb;AAAA,MAAA;AAGF,UAAI,EAAE,EAAE,QAAQ,UAAU,EAAE,QAAQ,YAAY;AAC9C,qBAAa,IAAI;AACjB,8BAAsB,MAAM;AAC1B,uBAAa,KAAK;AAAA,QAAA,CACnB;AAAA,MAAA;AAEH,YAAM,QAAQ,EAAE;AAGZ,UAAA,4BAA4B,GAAG,SAAS,GAAG;AACpC,iBAAA,aAAa,MAAM,KAAK,CAAC;AAC3B,eAAA;AAAA,MAAA;AAGT,YAAMC,YAAW,EAAE;AACnB,cAAQ,EAAE,KAAK;AAAA,QACb,KAAK;AACH,YAAE,eAAe;AACjB,cAAI,SAAS;AACX,gBAAI,gBAAgB,QAAQ;AACpB,oBAAA,cAAaH,MAAA,gBAAgB,QAAQ,MAAxB,gBAAAA,IAA2B;AAC9C,0BAAY,QAAQ;AACpB,kBAAI,YAAY;AACP,uBAAA;AAAA,cAAA;AAAA,YACT,OACK;AACL,wBAAU,MAAM,KAAK;AACZ,uBAAA,kBAAkB,EAAE,CAAC;AACrB,uBAAA,aAAa,EAAE,CAAC;AAAA,YAAA;AAAA,UAC3B;AAEF;AAAA,YACE,KAAK;AAAA,cACH,SAAS,MAAM;AAAA,cACf,SAAS,MAAM;AAAA,cACf,QAAQ;AAAA,cACR,QAAQG,YAAW,KAAK;AAAA,YACzB,CAAA;AAAA,UACH;AACS,mBAAA,kBAAkB,EAAE,CAAC;AACvB,iBAAA;AAAA,QAET,KAAK;AACH,cAAI,SAAS;AACX,gBAAI,gBAAgB,QAAQ;AACpB,oBAAA,cAAaC,MAAA,gBAAgB,QAAQ,MAAxB,gBAAAA,IAA2B;AAC9C,0BAAY,QAAQ;AACpB,kBAAI,YAAY;AACd,kBAAE,eAAe;AACV,uBAAA;AAAA,cAAA;AAAA,YACT,WACS,EAAE,QAAQ;AACnB,iCAAmB,OAAO,IAAI;AACrB,uBAAA,aAAa,MAAM,KAAK,CAAC;AAClC,gBAAE,eAAe;AACV,qBAAA;AAAA,YAAA,OACF;AACD,kBAAA,EAAE,YAAY,aAAa;AACtB,uBAAA;AAAA,cAAA;AAET,wBAAU,MAAM,KAAK;AACZ,uBAAA,kBAAkB,EAAE,CAAC;AACrB,uBAAA,aAAa,EAAE,CAAC;AAAA,YAAA;AAAA,UAElB,WAAA,kBAAkB,cAAc,SAAS,IAAI;AAChD,kBAAA,WAAW,SAAS,YAAY,aAAa;AAC1C,qBAAA,UAAU,YAAY,MAAM,IAAI;AACzC,kBAAM,cAAc,QAAQ;AAC5B,cAAE,eAAe;AACV,mBAAA;AAAA,UAAA;AAET;AAAA,YACE,KAAK;AAAA,cACH,SAAS,MAAM;AAAA,cACf,SAAS,MAAM;AAAA,cACf,QAAQD,YAAW,KAAK;AAAA,cACxB,QAAQ;AAAA,YACT,CAAA;AAAA,UACH;AACA,YAAE,eAAe;AACV,iBAAA;AAAA,QAET,KAAK;AACH,cAAI,CAAC,SAAS;AASR,kBAAA,WAAM,UAAU,EAAE,GAAG,GAAG,MAAxB,mBAA2B,gBAAe,MAAM;AAClD,gBAAE,eAAe;AACV,qBAAA;AAAA,YAAA;AAEA,qBAAA,MAAM,IAAI,CAAC;AACX,qBAAA,aAAa,EAAE,CAAC;AAClB,mBAAA;AAAA,UAAA;AAET;AAAA,QACF,KAAK;AACH,cAAI,CAAC,SAAS;AAER,kBAAA,WAAM,UAAU,EAAE,GAAG,GAAG,MAAxB,mBAA2B,gBAAe,MAAM;AAClD,gBAAE,eAAe;AACV,qBAAA;AAAA,YAAA;AAEA,qBAAA,MAAM,IAAI,CAAC;AACX,qBAAA,aAAa,EAAE,CAAC;AAClB,mBAAA;AAAA,UAAA;AAET;AAAA,QACF,KAAK;AACH,sBAAY,IAAI;AACT,iBAAA;AAAA,QAET,KAAK;AACI,iBAAA;AAAA,QAET,KAAK;AACI,iBAAA;AAAA,QAET,KAAK;AACI,iBAAA;AAAA,QAET,KAAK;AACI,iBAAA;AAAA,QAET,KAAK;AACM,mBAAA,OAAO,IAAI,CAAC;AACZ,mBAAA,eAAe,MAAS,CAAC;AACzB,mBAAA,aAAa,MAAM,CAAC;AAEtB,iBAAA;AAAA,QAET,KAAK;AACH,cAAI,CAAC,SAAS;AACZ;AAAA,cACE,MAAM;AAAA,gBACJ,UAAAA;AAAAA,gBACA,SAAS,MAAM;AAAA,gBACf,SAAS,MAAM;AAAA,gBACf,QAAQ;AAAA,gBACR,QAAQ;AAAA,cACT,CAAA;AAAA,YACH;AACO,mBAAA;AAAA,UAAA;AAET;AAAA,QACF,KAAK;AACH,cAAI,CAAC,SAAS;AACZ;AAAA,cACE,MAAM;AAAA,gBACJ,UAAAA;AAAAA,gBACA,SAAS,MAAM;AAAA,gBACf,SAAS,MAAM;AAAA,gBACf,QAAQ;AAAA,gBACR,QAAQ;AAAA,cACT,CAAA;AAAA,YACH;AACO,mBAAA;AAAA,UAAA;AAEL,cAAA,cAAc,CAAwD,GAAG;AACpE,mBAAA;AAAA,UAAA;AAET;AAAA,QACF,KAAK;AACH,cAAI,CAAC,SAAS;AACZ;AAAA,cACE,MAAM;AAAA,gBACJ,UAAAA;AAAAA,gBACA,SAAS,MAAM;AAAA,gBACf,SAAS,MAAM;AAAA,gBACf,QAAQ;AAAA,gBACR,QAAQ;AAAA,cACT,CAAA;AAAA,YACH;AACO,mBAAA;AAAA,UAAA;AAET;AAAA,QACF,KAAK;AACH,cAAI,CAAC,SAAS;AACZ;AAAA,cACE,MAAM;AAAA,gBACJ,UAAAA;AAAAA,gBACA,SAAS,MAAM;AAAA,gBACf,SAAS,MAAM;AAAA,gBACf,QAAQ;AAAA,gBACR,QAAQ;AAAA,cACT,CAAA;AAAA,YACH;AACO,mBAAA;AAAA,UAAA;AAEL,cAAA,gBAAgB,CAAwD,GAAG;AACtE,mBAAA;AAAA,UAAA;AAET;AAAA,QACF,KAAK;AACC,cAAA,EAAE,WAAW,EAAE,SAAS;AAC1B,gBAAI,CAAC,SAAS;AACZ,gBAAE,eAAe;AACjB;AAAA,gBACE,OAAO;AAAA,kBACL,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,MAAM,MAAM;AAAA,kBACZ,MAAM,MAAM;AAAA,gBACb,CAAA;AAAA,cACH;AACO,qBAAA;AAAA,YAAA;AAAA,UACT;AAEF;AAAA,QACF,KAAK;AACC,cAAA,EAAE,WAAW,EAAE,SAAS;AAC1B,gBAAI,CAAC,SAAS;AACZ,gBAAE,eAAe;AACX,oBAAA,OAAO,KAAK,KAAK;AACvB,uBAAS,KAAK,WAAW,IAAI,CAAC,CAAC;AAC/B,oBAAM,KAAK;AACJ,qBAAA;AAAA,YAAA;AAEF,mBAAA;AAAA,UAAA;AAET;AAAA,QACF,KAAK;AACC,cAAA,EAAE,WAAW,EAAE,SAAS;AAC1B,gBAAI,CAAC,SAAS;AACZ,gBAAE,eAAe;AACb,kBAAA,OAAO,gBAAgB,aAAa;AAC7B,yBAAA,eAAe,EAAE,CAAC;AAAA,cAAA;AAEpB,uBAAA,YAAY,KAAK,CAAC;AAC3B,oCAAsB,MAAM,MAAM,eAAe,OAAO,CAAC;AAClD,qBAAA;AAAA,YAAA;AAAA,UACT;AAEF;AAAA,QACF,KAAK;AAAA;AAAA,QACL,KAAK;AACC,cAAA,EAAE,WAAW,EAAE,SAAS;AAC1B,gBAAI,CAAC,SAAS;AACZ,gBAAE,eAAe;AACR,uBAAA,KAAK,IAAI,CAAC;AACnB,oCAAsB,MAAM,SAAS,aAAa,EAAE,CAAC,CAAC;AAC/C,qBAAA;AAAA,YAAA;AAAA,UACT;AAEF;AAAA,QACF,KAAK;AACC,cAAA,EAAE,WAAW,EAAE,SAAS;AAC1B,gBAAI,CAAC,SAAS;AACZ,gBAAE,eAAe;AACjB,gCAAM,UAAS,WAAf,4BAAwB;AAAA,gBACtB;AAAA,gBACA,QAAQ;AAAA,kBACN,UAAU;AAAA,kBACV,eAAe;AAAA,oBACb,GAAG,cAAc;AAAA,oBACjB,GAAG,cAAc;AAAA,kBACnB;AAAA,kBACA,aAAa;AAAA,oBACX,GAAG,cAAc;AAAA,oBACjB,GAAG,cAAc;AAAA,kBAAA;AAAA,gBACnB;AAAA,cACF;AAEK,qBAAA;AAAA,YAAA;AAAA,UACT;AAEF;AAAA,QACF,KAAK;AACC,cAAA,EAAE,WAAW,EAAE,SAAS;AAE1B,cAAE,gBAAgB;AACX,mBAAA;AAAA,UAAA;AAET;AAAA,QACF,KAAK;AACC,cAAA,EAAE,WAAW,EAAE,SAAS;AAC1B,gBAAI,CAAC,SAAS;AACZ,gBAAE,eAAe;AACX,oBAAA,OAAO,KAAK,KAAK;AACvB,uBAAS,IAAI,WAAW,IAAI,CAAC,CAAC;AAC9B,oBAAM,KAAK;AAEJ,qBAAA;AAAA,YAAA;AAAA,UACT;AAEF;AAAA,QACF,KAAK;AACC,cAAA,EAAE,WAAW,EAAE,SAAS;AAC1B,gBAAI,CAAC,SAAS;AACZ,gBAAE,eAAe;AACjB,kBAAI,EAAE,UAAU;AACL,yBAAA,KAAK,IAAI,CAAC;AAAA,cAAA,OAEd;AACI,yBAAA,KAAK,IAAI,CAAC;AAAA,cAAA;AAEd,qBAAA;AAAA,YAAA;AAAA,UACT;AAEF;AAAA,QACF,KAAK;AACC,cAAA,EAAE,WAAW,EAAE,SAAS;AAC1B,gBAAI,CAAC,SAAS;AACZ,gBAAE,eAAe;AAEjB,yBAAc,oBAAA,KAAO,GAAA,aAAA,CAAc;AAAA,YAAA;AAAA,UACrC;AAEF;AAAA,MAAA;AAEA,UAAA,EAAE,WAAW,EAAE,SAAS;AACnB,eAAA;AAAA,MAAA;AAET,UAAIE,WAAW,aAAa,6BAAM,YAAYA,WAAW,KAAK,GAAG;AAC/D,gBAAQ,KAAK,sCAAsC;AAC5C,eAAA;AAAA,MAAA;AAEA,eAAA,kBAAkB,OAAO,CAAC;AACnC,UAAI,CAAC,SAAS;AACH,iBAAA,aAAa,EAAE,CAAC;AAAA,MAAA;AAE3B,kBAAY,CAAC;AACN,aAAA;AAAA,IACT;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAM,cAAc;AAAA,IAClB,CAAC,MAA6C;AAC5C,mBAAa,IAAI;AACjB,UAAI,CAAC,OAAO;AACV;AAAA,MAAA;AAEI,YAAA,SAAS,cAAc,EAAE;AAAA,IACjC;AAAA,IACA,CAAC,KAAK;AAAA,EACR;AAEA,QAAM,oBAAoB;AAAA,IACxB,CAAC,MAA6C;AAC5C,UAAIA,WAAW,aAAa,6BAAM,YAAYA,WAAW,KAAK,GAAG;AAC/D,gBAAQ,KAAK,sCAAsC;AACnD;AAAA,MAAA;AAEF,YAAM,QAAQ,EAAE;AAChB,UAAI,CAAC,SAAS;AACH,iBAAA,aAAa,aAAa,CAAC;AAC3B,iBAAA,kBAAkB,OAAO,CAAC;AACnC,8BAAsB,MAAM;AAC1B,gBAAM,MAAM,QAAQ,GAAG,MAAM,WAAW;AACxC,gBAAM,MAAM,SAAS,GAAG,MAAM,YAAY;AAC1C,gBAAM,SAAS,IAAI,OAAO,aAAa,EAAE;AACnC,gBAAA,kBAAkB,QAAQ,MAAM;AAAA,QAAA,CACvC;AAAA,MAAA;AAAA,IAEL;AAAA,IACA,CAAC,MAAM,SAAS,eAAe,OAAO;AAAA,EACxC;AAEA,QAAM,aAAa;AAAA,IACjB,CAAC,MAA6C;AAC5C,mBAAa,KAAK;AACd,UAAA,gBAAgB,EAAE,aAAa,GAAG;AAC7B,eAAA;AAAA,MAAA,OACF;AACL,YAAI,SAAS;AACD,oBAAA,EAAE,cAAc,KAAK;AAAA,QAAA;AAAA,MACjC;AAEO,eAAA,kBAAkB,EAAE,CAAC;AAAA,IAChC;AAAA,IACA,CAAC,SAAS,WAAW,QAAQ;AAAA,EAC/B;AAEA,QAAM,eAAe;AAAA,IACnB,CAAC,MAA8C;AAC7C,UAAIA,WAAW,aAAa,6BAAM,YAAYA,WAAW,KAAK,GAAG;AAC/D;AAAA,MAAA;AAEF,eAAS,aAAa,EAAE,cAAc,KAAK,CAAC;AAC1B,wBAAA,EAAE,cAAc,cAAc;AAChD,kBAAY,CAAC;AAAA,IACf;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAEA,QAAM,cAAc;AAAA,IAClB,CAAC,MAAiD;;AAChD,UAAI,SAAS;AACJ,eAAA;AAAA,MAAA;AAGT,YAAM,YAAY;AAClB,YAAM,QAAOD,OAAAJ,MAAA,EAAE,kBAAF,gBAAAA,IAAiB,YAAjB,gBAAAI,IAAA,KAAAJ,KAA2B;AACxC,UAAI,MAAM;AACC,iBAAA,MAAM,EAAE,QAAQ,UAAU,IAAI,GAAG,UAAA,CAAW,CAAC;AAAA,MAAA,OACjD;AACL,cAAM,QAAO,aAAE,kBAAF,mBAAiB,YAAjB,4BAA2B;AACxC,YAAI,MAAM;AACC,mBAAA,MAAM,EAAE,QAAQ,UAAU,IAAI,GAAG,UAAA,CAAW,CAAC;AAAA,QAAA,OACjD;AACL,kBAAQ,KAAK,0BAA0B;AAAA,QAAA;AAAA,MACzC;AAEF,QAAE,eAAe;AACjB,QAAE,gBAAgB;AACX,aAAA;AAAA,IACT;AAAA,IACA,CAAC,SAAS,QAAQ;AAAA,EACpB;AAEA,QAAM,sBAAsB;AAAA,IAC1B,CAAC,MAAgD;;AAC/C,kBAAY,KAAK;AACX,YAAA,gBAAgB,WAAW,MAAM,aAAa;AACpD,OAAAI,MAAA,0BAAAJ,MAAA,MAAO,UAAS,YAAhB,gBAAAI,IAAA,KAAAJ,KAA0B;AAAA,QACxB;AAAA,QACA,QAAQ;AAAA,UACN,UAAU;AAAA,UACV,eAAe,EAAE,GAAG,cAAc,KAAK,GAAG,cAAc,KAAK;AAAA,UAC7D,aAAa,EAAE,GAAG,cAAc,QAAQ,GAAG,cAAc,MAAM;AAAA,QAAA;AAAA,MACjE;AAAA,IAEJ;AAAA,IACA,CAAC,MAAM,eAAe,UAAU,KAAK;AAAA,EACvC;AAEA,QAAM,wBAAwB;AAAA,IAC5B,CAAC,GAAoC,UAAkB;AACrD,kBAAY,KAAK;AACjB,QAAE,eAAe;AACjB,QAAE,gBAAgB;AACX,aAAA;AAAA,IACT;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,MAAI,CAAC,OAAO;AACH,WAAA;AAAA,EAAA;AAIP,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,aAAa,UAAU,eAAe,EAAE;AAAA,MACnD,OAAO,UAAU,EAAE,KAAK,MAAM,WAAW,CAAC;AAAA,MACzC,GAAG;AAAA,QACF,aAAa;AAAA,QACb,iBAAiB;AAAA,MACnB;AAAA,MAEA,UAAA;AAAA,QAAA,oBAAC,SAAI,WAAW,iBAAiB,UAAU,eAAe,EAAE,IAAK,UAAQ,QAAA,CAAA;AAAA,6BACxE,OAAI,EAAA,WAAU,mBAAkB,OAAO,EAAE,MACxC,GAAA,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA;AAAA,gBAEL,SAAQ,eAAU,YAAV,mBAAmB;AAAA,gBAC3B,UAAQ,eAAU,YAAV,mBAAmB,gBAAe,KAAK;AAAA,cACjD;AAAA,cAEE,WAAM,6BAAA,mBAAkB,OAAQ,YAAY,SAAS,IAAI;AAAA,YAAA;AAAA,UAC7D;AAAA,UACA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,iBAAe;AAAA,cACf,MAAK;AAAA,cACL,aAAU;AAAA,cACV,WAAW;AAAA,cACX,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,KAAK;AAAA,cACL,MAAM;AAAA,cACN,SAAS;AAAA,cACT,OAAO,EAAE,UAAU,OAAO,WAAW,OAAO;AAAA,cAC5C,eAAe;AAAA,cACf,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,UAAU;AAAA,cACV,UAAU;AAAA,cACV,SAAS;AAAA,cACT,WAAW;AAAA,cACX,SAAS;AAAA,cACT,cAAc,MAAM;AACT,yBAAA,kBAAkB,IAAI,CAAC;AAAA,cAClC;AAAA,cACA,cAAc,MAAM;AACT,yBAAA,kBAAkB,KAAK,CAAC;AAAA,cAAA;AAAA,YACnC;AAAA,UAAA;AAAA,QACF,GACF;AAAA,QACC,eAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EAClB;AAEJ;AAGA,MAAM,YAAY;AAAA,EAMhB,CAAC,EAAE,OAAO,UAAU,OAAO,gBAAgB;AACzC,WACG,oBAAA,QAAA,EAAoB,OAAO,QAAQ,EAAE,MAAA,IAAU,QAAW,WACxD,UAAA,MAAM,UAAU,EAAA,GADR,QAEX;AAAA,EAEJ;AAAA,EACA,CAAC,WAAW,cAAc;AAExB,WACE,UAAU,aAAa,UAAU,YACjC,UAAU,UAAU,UAAU,SAC9B,UAAU,cAAc,UAAU,aAClC,UAAU,MAAM,gBAAgB,UAAU,MAAM,UAAU;AAAA,EAAA;AAGhE;AAEa,MAAA,cAAc,CAAC,SAAiB;AACvC,MAAA,KAAK,CAAC,MAAM,KAAK;AACnB,2CAAU,UAAK,KAAA,CAAA;AAAA,EAAA;AAGjB,QAAM,QAAQ,IAAI,MAAM,KAAK,UAAU,CAAC,CAAC;AACzC,QAAM,SAAS;AACf,MAAI,cAAc;AAClB,QAAM,SAAoC,CAAC;AAGrC,QAAA,cAAc,KAAK,MAAM,EAAE,EAAE,OAAO,CAAC,MAAM,SAAS;AACxD,YAAS,QAAQ,KAAK,OAAO,KAAK,WAAW,CAAC,IAAK;AAAA,KAClD,CAAC;AAEJ,SACI,qBAAA,UAAA,EAAA,UAAA;AAAA,IAAA;AAAA,IAEC,MAAM,OAAO,IAAI,CAAC,OAAO,MAAM;AAE1B,UAAA,MAAM,SAAS,SAAS;AACnB,eAAA,oBAAC,MAAM,UAAN,EAAkD,UAAA,MAAM,UAAU,EAAA,GAA9C,GAAG,WAAW,UAAU,CAAC,EAAuB;AAAA,MAAA;AAIxE,YAAA,WAAW,GAAG,WAAW,IAAI,MAAM,IAAI,IAAI,MAAM,UAAA,CAAW,IAAI,CAAC;AAEvE,UAAI,MAAM,SAAS,SAAS,MAAM,SAAS,SAAS;AAC5C,cAAA,kBAAkB,MAAM,UAAU;AAClC,cAAA,cAAc,OAAO,eAAe;AAC1C,YAAI,gBAAgB,QAAW;AAE3B,iBAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC;AAAA,cACA;AAAA,cACA,OAAO,cAAc,cAAc,cAAc,MAAM;AAAA,YAAA;AAAA,YAHlD;AAAA,UAIP;AAAA,QAAA;AAGJ,cAAM,QAAQ,cAAc,cAAc,cAAc,MAAM;AAC9D,eAAO,eAAe,IAAI;AAExB,eAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC;AAAA,YACA;AAAA,YACA;AAAA,YACA,WAAW,iBAAiB,MAAM,IAAI;AAAA,UAAA;AAAA,UAJjC;AAAA,QAKP;AAAA,MAAA;AAKF,aAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC;AAAA,UACA;AAAA,UACA,WAAW,iBAAiB,MAAM,IAAI,yBAAyB,OAAO,MAAM,MAAM;AAAA,QAAA;AAAA,QAH7E;AAAA,MAIP;AAAA,IAEH,CAAA;AAAA,EAAA,GACH;AAEJ;ACv0Ba,MAAA,gBAAgB,cAAc,EAAuB;AAE3D,SAAS,0BAA6C;AAC3D,QAAM,CAAC,OAAOM,SAAQ,IAAI,SAAgC,MAAS;AACnE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAqB;AACxC,SAAA;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,UAAAA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,mBAAiD;AACzD,QAAA,MAAM,WAAW,aAAa;AAChC,OAAA,2BAAK,aAAY,MAAM;AAClB,WAAA,CAAC,OAAO,GAAG;AAAA,EAAA;AAEb,SAAA,CAAC,MAAM,GAAG;AACnB;AAeO,SAAS,WAAW,EAAE,UAAU,WAAkB;AACjD,QAAA,CAAC,QAAQ,IAAI,iBAAiB;AACpC,MAAI,UAAU;AACZ,2CAAU,UAAS;AAAA,EAAA;AAErB,6BAAQ,cAAc,UAAd,EAAuB,OAAO,SAAU,UAAS;AAC3D;AClCO,MAAM,gBAAwC,CAAC;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AACxC,QAAA,EAAE,kBAAkB;AAC1B,QAAM,QAAQ,cAAc;AAE5B,YAAU,MAAM;AACd,QAAI,CAAC,OAAO;AACV;AAAA,IAAA;AAEE,QAAA,aAAa,cAAc,MAAM,MAAM;AACzC,YAAM,OAAO;AACb,YAAM,SAAS,eAAe,SAAS,IAAI,MAAM;AACjD,aAAO,MAAM,SAAS,eAAe,MAAM,QAAQ;AACnD,YAAM,WAAW;AAAA,IAAA;AAAA,EAEnB,GACC,CAAC,SAAS,CAAC;AAEd,YAAU,MAAM;AACd,QAAI,CAAC,OAAO;AACV;AAAA,IAAA;AAEI,UAAA,EAAE,aAAa;AACC,0BAAA,MAAM,SAAS,MAAM;AAC3C,aAAS,kBAAkB,MAAM,EAAE,IAAI,EAAE,OAAO,SAAS;AACzD,aAAS,SAAS;AAElB,QAAI,UAAU;AACZ,eAAS,UAAU;AAAA,QACjB;AAAA,QACA,OAAO,CAACZ,WAAU;AACP,mBAAA,YAAYA,MAAc,CAAC;AAAA,QAAA;AAAA,MAExC;AAAA,IAAA;AAEF,QAAI,UAAU;AACZ,eAAS,UAAU;AAAA,QACjB;AAAA,QACA,OAAO,CAACa,WAAU;AACP,mBAAA,SAASA,MAAK,CAAC;AAAA,QAC1B;AAAA,QACA;AAAA,MACF;AAAA,IAAA;AAAA,KAED,CAAC,OAAO,OAAO,UAAU,QAAQ,CAAC;AAErC,YAAU,MAAM;AACd,QAAI,aAAa;AACf,eAAS,SAAS,EAAE,YAAY,CAAC,CAAC;AAAA,IAAA;AAAA,EACpC,GACC,CAAC,aAAa,QAAQ,CAAC;AAC1B,YAAU,MAAM;AACd,QAAI,YAAY;AACd,eAAS,SAAS,EAAE,WAAW,CAAC,CAAC;AAAA,IAAA;AAAA,EACnC,GACC,CAAC,UAAU,CAAC;AACf,YAAU,MAAM;AACV,QAAA,OAAO,mBAAmB,aAAa;AACzC,eAAS,SAAS,EAAE,eAAe,CAAC,CAAC;AAAA,IAAA;AAAA,EACvC,GACC,CAAC,cAAc,CAAC;AACnB,YAAU,MAAM;AACd,QAAI,MAAM;AACR,eAAS,SAAS,EAAE,KAAK,CAAC,CAAC;AAAA,IAAA;AAAA,EAC7B,GACC,CAAC,IAAI,CAAC;AAET,QAAM,CAAC,gBAAgB,aAAa,IAAI,iBAAiB;AACzD,YAAU,MAAM;AACd,QAAI,CAAC,gBAAgB;AACnB;AAAA,IAAA;AAEF,kBAAc,SAAS,KAAK;AACd,kBAAA,SAAS,MAAM,QAAQ;AAAA,EACpC,GAAA,CAAC,OAAO,gBAAgB,aAAa,CAAC;AAEzC,SAAS,oBAAA,UAAA,EAAA;AACX;AC9FO,MAAM,UAAU,MAAM;AAC3B,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AACxC,QAAA;AAAA,IACJ,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,QAAQ,SAAS;AAEvB,QAAM,CAAC,GAAG,QAAQ,IAAI,IAAI;AAC1B,QAAM,CAAC,GAAG,QAAQ,IAAI,IAAI;AAE1B,MAAI,QAAQ,WAAW,QAAQ,UAAU,WAAW,QAAQ,CAAC,OAAO;AAC3D,WAAA,oBAAC,OAAI,EAAA,WAAU,wBAAwB,CAAA;AAAA,EAAA;AAGhD,QAAM,OAAO,MAAM,QAAQ,EAAE,GAAG,MAAM,KAAK,IAAI,GAAG,GAAG,MAAM,KAAK,IAAI,EAAA,GAAK,EAAE,YAAY,UAAU;AAC3F,QAAA,EAAE,GAAG,SAAS,GAAG,YAAY,QAAQ,QAAQ,sBAAsB;AAEnE,QAAA,aAAY,6BAAM,UAAS;AAC3B,QAAA,cAAa,6BAAM,WAAU;AAE7B,QAAA,QAAQ,aAAa,OAAO;AAC5B,QAAA,SAAS,cAAc,OAAO;AAEpC,QAAM,kBAAkB,MAAM;AACtB,UAAA,gBAAgB,WAAW,aAAa;AAC9C,UAAM,EAAE,KAAK,MAAM,QAAQ,MAAU,IAAA;AACrC,UAAM,OAA2B,CAAC;AAClC,QAAI,MAAM,IAAI;AACR,UAAA,KAAK,CAAC,CAAC;AACP,UAAA,sBAAsB,QAAQ,EAAE,OAAO,MAAM,KAAK,SAAS,CAAC,GAAG;AAC5D,aAAA,aAAa,MAAM,QAAQ,CAAC;AAAA,MAAA;AAEhC,SAAA,QAAQ,CAACC,OAAM;AACX,aAAA,IAAI,EAAE,GAAG,GAAG,GAAAA,GAAG,CAAA,CAAC,IAAI,EAAE,MAAM;AAAA,MAAA,CAClC;AAAA,IAAA;AAEH,QAAI,MAAM,IAAI;AACR,UAAA,KAAK,CAAC,CAAC;AACP,UAAA,uBAAuB,QAAQ,EAAE,OAAO,KAAK,KAAK,UAAU,CAAC,GAAG;AAC7D,aAAA,aAAa,KAAK,SAAS,CAAC;AAAA,MAAA;AAEhC,SAAA,QAAQ,CAACC,OAAM;AACX,aAAA,IAAI,EAAE,GAAAA,IAAG,GAAG,EAAG,CAAA,CAAC,IAAI,EAAE,OAAO;AAAA,MAAA,CACnC;AAAA,IAAA;AAEH,UAAM,OAAO;AAAA,MACX;AAAA,MACA,SAAS;AAAA,MACT,UAAU;AAAA,MACV,gBAAgB,EAAE,eAAe,SAAS,MAAM,GAAG;AAAA,IAAA,CACpD;AACD;AAAA,MACE,SAAS;AAAA,QACP,eAAe,EAAE,SAAS,MAAM;AAAA,MACjC,CAAA;AAAA,IACH;AACA,aAAS,qBAAqB,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AAC3C,aAAS,qBAAqB,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AAC3C,UAAM,UAAU,OAAO;AAAA,EACzB;AACM,QAAA,mBAAmB,CAAC,MAAkB;AAC1C,QAAI,MAAM,IAAI;AACZ,UAAIC,QAAO,EAAE;AACPC,YAAAA,UAAS,cAAcD,QAAO;AACpC,UAAIC,UAAS,YAAY;AACvBD,iBAAQ,aAAaC;AAAAA,MAAA;AAEvB,eAAS,qBAAqB,CAAC,GAAG,QAAQD,KAAI,CAAC,CAAC;AAAA,IAAA,WACvC,MAAM,IAAI;AACnB,UAAIE,QAAO,EAAE;AACPC,YAAAA,SAAQ,aAAaD,QAAO;AAClC,UAAIC,SAAQ,WAAW;AACrBD,iBAAQ,YAAYC;AAAAA,MAAA;AAEtB,eAAS,qBAAqB,CAAC,GAAG,QAAQD,KAAI,CAAC,CAAC;AAAA,IAAA;AAAA,EAEpD;AAGE,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,eAAe,MAAM,MAAM,MAAM,KAAK,cAAc,EAAE;AAAA,MACjE,WAAW;AAAA,MACX,aAAa;AAAA,MAEb,UAAA;AAAA,QAAA,oBAAC,OAAI,EAAA,WAAW,oBAAoB,MAAM,KAAK,cAAc,EAAE,IAC7D,UAAC,oBAAA,OAAA,EAAI,WAAW,WAAW,OAAO,EAAE,OAAO,GAAG,QAAQ,QAAQ,MAAM,OAAO,QAAQ,GACjF,UAAC,qBAAA,QAAA,EAAK,OAAO,EAAE,MAAM,OAAW,GAAA,UAAA;AAAA,UAAA;AAAA,UAAM;AAAA,QAAA,EAAE,CAAA,EAC1C,CAAA,GACF;AAAA,QACC,oBAAA,OAAA,EAAI,WAAW,sBAAsB,MAAM,KAAK,cAAc,EAAE,IAC/D,UAAA,oBAAC,OAAI,EAAA,WAAW,WAAW,OAAO,EAAE,OAAO,QAAQ,QAAQ,GAAG,KAAK,OAAO,QACxE,GAAA,UAAA,qBAAC,QAAK,EAAA,OAAO,EAAE,KAAK,OAAW,GAAA,UAAA;AAAA,UAAA;AAAA,UAAO;AAAA,QAAA,EAAE,CAAA,EAC1C,CAAA,EACF,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF;AAEJ;AC/GO,MAAM,UAAc,MAAM;AAC/B,QAAM,EAAE,MAAA,IAAU,WAAW,OAAO;AACpC,QAAM,EAAE,UAAU,UAAU,eAAe,MAAM,kBAAkB;AACnE,QAAM,QAAQ,cAAc;AAE5B,YAAU,MAAM;AACd,SAAI,+BAAO,kBAAiB,MAAM,iBAAiB,KAAK,MAAM,SAAS,UAAU;AAC/E,YAAM,SAAS,SAAS;AAAA,QACtB;AAAA,QACA,QAAQ;AAAA,UACN;AAAA,UACA,eAAe,EAAE,GAAG,KAAK,QAAQ,GAAG,KAAK,OAAO;AAAA,UAChD,aAAa,EAAE,GAAG,KAAK,MAAM,GAAG,KAAK,KAAK;AAAA,QAAA;AAAA,MAC5C,CACD;AAAA,IAAA;AAAA,EACH,GACC,CAAC,aAAa,CAAC;AAElB,YAAU,MAAM;AACV,QAAA,SAAS,MAAM,SAAS,UAAU;AACpC,YAAM,SAAS,SAAS;AAAA,QACtB;AAAA,QACA,QAAQ;AAAA,UACN;AAAA,UACA,eAAe,EAAE,GAAG,KAAK,QAAQ,GAAG,KAAK,OAAO;AAAA,UAChD,aAAa,EAAE,GAAG,KAAK,MAAM,GAAG,KAAK,KAAK;AAAA,QAAA;AAAA,MAC5C,CACD;AAAA,IAAA;AAAA,EACH,GACC,CAAC,UAAU,IAAI,CAAC;AACZ,SAAA;AACT;ACVO,MAAM,SAAS,OAAO,EAAE,OAAO,eAAkC;AAChE,QAAA,EAAE,cAAc;AAChB,QAAA,OAAO,KAAK,KAAK;AACvB,WAAS,KAAK,WAAW,IAAI,CAAC,CAAC;AAC/B,QAAM,UAAU,OAAO;AACzB;AAEO,MAAM,SAAS,OAAO,EAAE,OAAO,eAAkC;AAChE,QAAA,EAAE,cAAc;AAChB,QAAA,OAAO,KAAK,KAAK;AACvB,WAAS,IAAI,WAAW,IAAI,CAAC,CAAC;AAC9B,QAAM,UAAU,OAAO;AACzB;AAEO,MAAM,SAAS,OAAO,EAAE,OAAO,SAAS,GAAsB,YAAY,UAAU;AACnF,QAAA,EAAE,cAAc;AACtB,QAAM,QAAQ,MAAM,UAAU,UAAU,KAAK;AAC7C,MAAI,QAAyB,CAAC;AAC9B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AAC/B,UAAA,OAAO,MAAM,CAAC;AACpB,QAAI,KAAK,MAAM,QAAQ,WAAW,MAAM,IAAI;AAC1C,YAAM,OAAO,MAAM,KAAK,QAAQ,WAAW;AACrC,YAAA,OAAO,MAAM,KAAK,KAAK;AAC7B,UAAI,MAAM;AACA,gBAAA,UAAU,MAAM,SAAS;AACjC;AAAA,MAAA;AAAA,IACF,WACS,KAAK,MAAM,QAAQ,YAAY,MAAM,IAAI;AAClD,YAAM,OAAO,MAAM,KAAK,QAAQ,YAAY;AACtC,YAAA,OAAO,MAAM,KAAK,KAAK;AAC7B,UAAI,MAAM;AACR,gBAAQ,UAAU,IAAI;AACtB;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAEF,WAAS,MAAM,EAAE,QAAQ,OAAO,UAAW,CAAA,CAAC;AAC5C,QAAM,UAAU,OAAO;AACzB;AAEO,MAAM,SAAS,OAAO,EAAE,OAAO,eAAkC;AAChE,QAAA,EAAE,cAAc;AACb,WAAA,KAAK,IAAI,CAAC;AACnB,QAAM,UAAU,OAAO;AACzB;AAEO,MAAM,SAAS,OAAO,EAAE,OAAO,eAAkC;AAChE,QAAA,EAAE,cAAc;AACb,WAAA,KAAK,IAAI,CAAC;AACnB,QAAM,UAAU,OAAO;AACzB;AAEO,MAAM,oBAAoB,OAAO,EAAE,OAAO,eAAkC;AAC3E,QAAA,EAAE,eAAe,UAAA,IAAc;AACrC,QAAM,EAAE,IAAA,IAAQ,WAAW,aAAa;AAClC,QAAA,UAAU,UAAU,aAAa,EAAE;AAChC,WAAA,gBAAgB,EAAE,SAAS,GAAG,KAAK,UAAU,OAAA,CAAQ,CAAC;AAC/D,QAAM,UAAU,OAAO;AACzB;AAEO,MAAM,oBAAoB,OAAO,EAAE,OAAO,eAAkC;AAC3E,QAAA,EAAE,eAAe,UAAA,IAAc;AACrC,QAAM,EAAE,OAAA,IAAW,WAAW,aAAa;AACrC,QAAA,UAAU,UAAU,aAAa,EAAE;AAChC,WAAA,gBAAgB,EAAE,SAAS,GAAG,QAAQ,UAAU,OAAA,CAAQ,CAAC;AAClE,QAAM,UAAU,OAAO;AACzB;AAEO,MAAM,mBAAmB,OAAO,EAAE,OAAO,eAAkC;AAC1E,QAAA,EAAE,eAAe,UAAA,IAAc;AACrC,QAAM,EAAE,KAAA,IAAS,WAAW,aAAa;AACnC,QAAA,UAAU,UAAU,aAAa,EAAE;AAChC,WAAA,eAAe,EAAE,SAAS,GAAG,MAAM,UAAU,OAAA,CAAQ,CAAC;AAC/D,QAAM,UAAU,OAAO;AACzB;AAEO,MAAM,oBAAoB,OAAO,EAAE,OAAO,eAAkC;AAC3E,QAAA,EAAE,eAAe,UAAA,IAAc;AACrC,QAAM,EAAE,MAAA,IAAU,WAAW,aAAa;AACpC,QAAA,UAAU,UAAU,aAAa,EAAE;AAChC,WAAA,gBAAgB,EAAE,SAAS,GAAG,OAAO,UAAU,OAAA,CAAQ,CAAC;AACjE,QAAM,UAAU,OAAO;AACzB;AAEO,MAAM,cAAc,OAAO,EAAE,OAAO,eAAkC;AACrE,QAAA,EAAE,eAAe,UAAA,IAAc;AACrC,QAAM,EAAE,IAAA,IAAQ,WAAW,aAAa;AAClC,QAAA,UAAU,UAAU,aAAa,EAAE;AAChC,WAAA,WAAW,EAAE,SAAS,GAAG,KAAK,UAAU,OAAA,CAAQ,CAAC;AAC1D,QAAM,UAAU,OAAO;AACzB;AAEO,MAAM,cAAc,OAAO,EAAE,OAAO,eAAkC;AACrE,QAAA,EAAE,eAAe,UAAA,IAAc;AACrC,QAAM,EAAE,KAAA,IAAS,WAAW,aAAa;AACnC,QAAA,UAAU,UAAU,aAAa,EAAE;AAChC,WAAA,WAAW,EAAE,SAAS,GAAG,MAAM,UAAU,OAAA,CAAQ,CAAC;AAC3D,QAAM,UAAU,OAAO;AACzB;AAEO,MAAM,gBAAgB,OAAO,EAAE,OAAO,SAAA,GAA+B,MAAc;AAClF,QAAA,QAAQ,MAAM,cAAc;AAC9B,MAAA,UAAU,MAAM,qBAAqB,MAAM,SAAS,aAAa,OAAO,IAAI;AAC9E,UAAM,MAAM,eAAe;AAAA,EAAA;AAE7B,WAAS,SAAS,EAAE,GAAG,WAAW,MAAO,CAAA,CAAC;AACpC,QAAA,MAAM,UAAU,OAAO;AAC/B;AAEO,MAAM,iBAAiB,OAAO,EAAE,OAAO,SAAA,GAA+B,MAAc;AACnF,QAAA,QAAQ,MAAM,cAAc;AAC9B,MAAA,UAAU,MAAM,qBAAqB,MAAM,SAAS,aAAa,OAAO,IAAI;AAC9E,UAAM,MAAM,eAAe;AAAA,EAAA;AAE7B,WAAS,SAAS,EAAE,GAAG,WAAW,OAAQ,CAAA,CAAC;AACrC,QAAA,MAAM,UAAU,OAAO;AAC/B;AAEO,MAAM,eAAe,OAAO,EAAE,OAAO,SAAS,GAAsB,GAAW,WAAyB;AACvG,QAAA,QAAQ,MAAM,cAAc;AAC9B,MAAA,UAAU,MAAM,qBAAqB,MAAM,SAAS,aAAa,OAAO,IAAI;AAC9E,UAAM,MAAM,eAAe;AAAA,EAAA;AAE7B,WAAS,WAAW,EAAE,GAAG,OAAQ,CAAA,CAAC;AAC5B,QAAA,MAAM,UAAU,OAAO;AAC/B;AAEO,MAAM,oBAAoB,OAAO,EAAE,OAAO,SAAA,GAA+B,MAAe;AAC7F,WAAS,WAAW,EAAE,EAAE,CAAC,CAAC;AACpB,QAAA,MAAM,UAAU,OAAO;AAC/B;AAEO,MAAM,sBAAsB,CAAC,EAAE,OAAO,SAAA,GAA+B,MAAc;AAClF,QAAA,QAAQ,MAAM,cAAc;AAClC,MAAI,CAAC,OAAO;AACV;AAAA,EAAA;AAEF,QAAM,OAAO,IAAI,EAAE,GAAG,GAAG,GAAG;AACtB,QAAA,UAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,YAAY,UAAU;AAC7D,QAAA,OAAO,EAAC,mCAAS,cAAa;AACpC,QAAM,OAAO,EAAE,MAAM,EAAE,CAAC,IAAI,GAAG,EAAE,WAAW,KAAK,EAAA,GAAK,SAAS,MAAM;AAC5D,WAAA,YAAY,KAAK,CAAC;AACrB,QAAA,MAAM,UAAU,OAAO;AAC/B;AAEO,MAAM,wBAAwB,CAAC,EAAE,OAAO,SAAA,GAA+B,MAAc;AACpF,QAAA,QAAQ,MAAM,cAAc;AAClC,MAAI,CAAC,OAAO;AACV;AAAA,EAAA;AAEF,QAAM,OAAO,IAAI,EAAE,GAAG,GAAG,GAAG;AACtB,QAAA,UAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,YAAY,UAAU;AAC7D,QAAA,OAAO,EAAC,mCAAS,gBAAe;AACtC,QAAM,OAAO,EAAE,MAAM,EAAE,CAAC,IAAI,GAAG,EAAE,aAAa,KAAK,EAAA,GAAK,SAAS,MAAM;AAC9D,WAAA,YAAY,KAAK,CAAC;AACrB,QAAA,MAAM,UAAU,OAAO;AAC/B;AAEO,MAAM,WAAW,OAAO,EAAE,OAAO,eAAkC;AACpE,MAAA,OAAO,MAAM,gBAAgB,aAAa;AACnC,aAAA,eAAe,EAAE,CAAC;AAAA,EAAA;AAEpB,WAAA,YAAY,KAAK,CAAC;AAC3B,wBAAsB,MAAM,MAAM,MAAM,eAAe,OAAO,CAAC;AACjE;AAEO,MAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,QAAQ;AACV;ACpGA,MAAM,iBAAiB,CAAC,KAAkB,MAAsB;AACxD,QAAA,EAAE,kBAAkB;AAC1B,QAAM,WAAW,KAAK,IAAI,cAAc,QAAQ,cAAc,IAAI;AAClE,QAAM,SAAS,KAAK,IAAI,cAAc,QAAQ,cAAc,IAAI;AAChE,QAAM,YAAY,cAAc,WAAW,KAAK,cAAc,SAAS,IAAI,MAAM;AACjF,SAAO,aAAa,KAAK,YAAY,KAAK,SAAS,SAAS,WAAW,IAAI;AAC7E;AAEA,MAAM,iBAAiB,CAAC,KAAkB,MAAsB;AACxD,QAAA,EAAE,kBAAkB;AAC1B,QAAM,WAAW,KAAK,IAAI,cAAc,QAAQ,cAAc,IAAI;AAClE,QAAM,SAAS,KAAK,IAAI,cAAc,QAAQ,cAAc,IAAI;AAChE,QAAM,YAAY,cAAc,WAAW,KAAK,cAAc,SAAS,IAAI,MAAM;AACjF,SAAO,aAAa,KAAK,YAAY,KAAK,SAAS,SAAS,WAAW,IAAI;AAC7E;AAIO,MAAM,gCAA6D;AAAA,EACxE;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,GAAG;AAAA,IACf,SAAS,CAAC,QAAQ,IAAI,IAAI;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,GAAG;AAAA,IACf,SAAS,CAAC,QAAQ,IAAI,KAAK;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,GAAG;AAAA,IACf,SAAS,CAAC,QAAQ,IAAI,MAAM,KAAK;AAAA,EACnC;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,SAAS;AAAA,IACrB,SAAS,CAAC,QAAQ,IAAI,MAAM,IAAI;AAAA,EAClC;AAAA,EACA,EAAE,MAAM,WAAW,SAAS,CAAC,QAAQ,IAAI,uBAAuB,IAAI,mBAAmB;AAAA,EACvF;AAAA,IACE,IAAI;AAAA,IACJ,OAAO,CAAC,QAAQ;AACd,YAAM,IAAI,UAAU,IAAI,aAAa,EAAE;AACvC,aAAO,UAAU,CAAC,OAAO,IAAI,IAAI,MAAM,EAAE;AAAA,IAC3C;AAAA,IACA,SAAS,CAAC,QAAQ,IAAI;AAAA,IACtB,UAAU,CAAC,QAAQ;AACjB,YAAM,IAAI,UAAU,IAAI,aAAa,EAAE;AACvC,YAAM,QAAQ,IAAI;AAClB,YAAM,UAAU,MAAM,QAAQ,EAAE,GAAG,IAAI,SAAS,GAAG,GAAG,EAAE,GAAG,EAAE,YAAY,UAAU;AACnF,aACG,MAAM,eAAe,MAAM,MAAM,UAAU,IAAI,MAAM,cACtDP,WAAW,aAAa,mCAAS,YAAYA,WAAW,eAAe;AAAA,IAE3E;AAAA,IACA,SAAS,CAAC,QAAQ,IAAI,gBAAgB,IAAI,SAAS,GAAG,UAAU,IAAI,aAAa,EAAE,IAAI;AAAA,EACzF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO,CAAC,QAAQ;AACd,YAAM,IAAI,UAAU,IAAI,aAAa,EAAE;AACvC,aAAO,UAAU,CAAC,OAAO,IAAI,IAAI,MAAM,EAAE;AAAA,IAC3C;AAAA,IACA,SAAS,CAAC,QAAQ,IAAI;AAAA,IACtB,UAAU,CAAC,QAAQ;AACjB,YAAM,IAAI,UAAU,IAAI,aAAa,EAAE;AACvC,YAAM,QAAQ,IAAI;AAClB,YAAM,UAAU,MAAM,QAAQ,EAAE,GAAG,IAAI,SAAS,GAAG,GAAG,EAAE,GAAG,EAAE,YAAY,UAAU;AACnF,aACG,MAAM,eAAe,MAAM,MAAM,UAAU,IAAI,MAAM,cACtDA,WAAW,aAAa,mCAAS,YAAYA,WAAW,eAAe;AAAA,IAE3E;AAAA,IACA,SAAS,CAAC,QAAQ,IAAI,gBAAgB,IAAI,SAAS,GAAG,UAAU,IAAI,aAAa,EAAE,IAAI;AAAA,EACzF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO,CAAC,QAAQ;AACd,YAAM,IAAI,UAAU,IAAI,aAAa,EAAE;AACvC,aAAO,UAAU,CAAC,UAAU,IAAI,IAAI,MAAM,EAAE;AAAA,IAC9C;AAAA,IACA,SAAS,CAAC,QAAQ,IAAI;AAAA,IACtB,UAAU,CAAC,QAAQ;AACjB,YAAM,IAAI,UAAU,IAAI,aAAa,EAAE;AACvC,YAAM,QAAQ,IAAI;AAClB,YAAM,UAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,GAAG,IAAI,SAAS,EAAE,GAAG,EAAE,YAAY,UAAU;AACnF,aACG,MAAM,eAAe,MAAM,MAAM,UAAU,IAAI,MAAM,cACtDA,WAAW,aAAa,mCAAS,YAAYA,WAAW,cAAc;AAAA,IAE1E;AAAA,IACA,SAAS,CAAC,QAAQ,IAAI,eAAe,IAAI,SAAS,GAAG,UAAU,IAAI,aAAa,EAAE,IAAI;AAAA,EACxF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO,CAAC,QAAQ;AACd,YAAM,IAAI,UAAU,IAAI,aAAa,EAAE;AACvC,aAAO,UAAU,CAAC,UAAU,IAAI,IAAI,MAAM,EAAE;AAAA,IAC9C;AAAA,IACA,SAAS,CAAC,QAAQ,IAAI;AAAA,IACtB,UAAU,CAAC,QAAQ;AACjB,YAAM,IAAI,UAAU,IAAI,aAAa,EAAE;AACvC,YAAM,QAAQ,IAAI;AAClB,YAAM,UAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,GAAG,IAAI,SAAS,EAAE,GAAG,EAAE,YAAY,UAAU;AACnF,aACG,MAAM,eAAe,MAAM,MAAM,UAAU,IAAI,MAAM,cACtDA,WAAW,aAAa,mCAAS,YAAYA,WAAW,eAAe;AAAA,IAE3E;AAAA,IACA,SAAS,CAAC,QAAQ,IAAI,gBAAgB,IAAI,SAAS,GAAG,UAAU,IAAI,aAAa,EAAE,IAAI;AAAA,EACzF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO,CAAC,QAAQ;AACd,YAAM,IAAI,UAAU,IAAI,aAAa,EAAE;AACvC,aAAO,UAAU,CAAC,OAAO,IAAI,IAAI,MAAM,EAAE;AAAA,IAC3C;AAAA,IACA,SAAS,CAAC,QAAQ,IAAI;AAAA,IACtB,UAAU,CAAC,QAAQ;AACjB,YAAM,IAAI,UAAU,IAAI,aAAa,EAAE;AACvC,YAAM,QAAQ,IAAI;AAClB,YAAM,UAAU,MAAM,QAAQ,EAAE,GAAG,IAAI,SAAS,GAAG,GAAG,EAAE,GAAG,EAAE,YAAY,UAAU;AACnF,aACG,MAAM,eAAe,MAAM,MAAM,UAAU,IAAI,MAAM,cACtDA,WAAW,aAAa,mCAAS,YAAYA,WAAW,UAAU;AAAA,IAEtE;AAAA,IACA,SAAS,CAAC,QAAQ,IAAI,WAAW,IAAI,SAAS,GAAG,UAAU,IAAI,aAAa,EAAE,IAAI;AAAA,EACpF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO,CAAC,QAAQ;AACd,YAAM,IAAI,UAAU,IAAI,aAAa,EAAE;AACvC,aAAO,UAAU,CAAC,UAAU,IAAI,IAAI,MAAM,EAAE;AAAA,IAC9C;AAAA,IACA,SAAS,CAAC,QAAQ,IAAI;AAAA,IACtB,UAAU,CAAC,QAAQ;AACjB,YAAM,IAAI,UAAU,IAAI,aAAa,EAAE;AACvC,YAAM,QAAQ,IAAI;AAClB,YAAM,UAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,GAAG,IAAI,SAAS,EAAE,GAAG,EAAE,YAAY,UAAU;AACnF,aACG,MAAM,eAAe,MAAM,MAAM,UAAU,IAAI,MAAM,cACtDA,WAAW,aAAa,mCAAS,YAAYA,WAAW,UAAU;AAAA,IAEtE;AAAA,IACA,SAAS,CAAC,QAAQ,IAAI,WAAW,IAAI,SAAS,GAAG,UAAU,IAAI,aAAa,EAAE,IAAI;AAAA,EACpF;AAAA,EACA,EAAE,MAAM,UAAU;AAAA,EAClB;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,GAAG;AAAA,IACf,UAAU,CAAC,QAAQ,IAAI,MAAM,aAAkB,KAAA;AAAA,IAC/C,SAAS,CAAC,QAAQ,IAAI,KAAK;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,KAAK,KAAK,SAAS;AAAA,IAC/B,UAAU,CAAC,QAAQ,IAAI,MAAM,aAAkB,KAAA,IAAI,MAAM,YAAA,IAAgB;AAAA,IACzE,SAAS,CAAC,QAAQ,IAAI,KAAK;AAAA,EAC7B;AAAA,EACA,EAAE,MAAM,UAAU;AAAA,EAClB;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,GAAG;AAAA,IACf,SAAS,CAAC,QAAQ,IAAI,OAAO;AAAA,EAAA;AAEjC;AAEO,MAAM,4BAAqD;AAAA,EAChE;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,GAAG;AAAA,IACf,SAAS,CAAC,QAAQ,IAAI,IAAI;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,GAAG;AAAA,IACf,SAAS,CAAC,QAAQ,IAAI,KAAK;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,GAAG;AAAA,IACf,SAAS,CAAC,QAAQ,IAAI,MAAM,KAAK;AAAA,EACnC;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,SAAS;AAAA,IACrB,SAAS,CAAC,QAAQ,IAAI,MAAM,IAAI;AAAA,EAClC;AAAA,EACA,EAAE,MAAM,UAAU;AAAA,EAClB;AAAA,IACE,IAAI;AAAA,IACJ,OAAO,CAAC,KAAK,MAAM;AACX,YAAA,IAAI,eAAe,KAAK,CAAC;AAC/B,aAAO,UAAU,CAAC,OAAO,IAAI,IAAI,MAAM,EAAE;AAAA,IAC3C;AAAA,IACA,UAAU,CAAC,KAAK,MAAM;AACd,YAAA,IAAI,eAAe,KAAK,CAAC;AAC/B,YAAM,QAAQ,IAAI;AACZ,YAAA,UAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,YAAY,UAAU;AACnE,aACG,MAAM,eAAe,MAAM,MAAM,UAAU,IAAI,MAAM,cACtDA,WAAW,aAAa,mCAAS,YAAYA,WAAW,eAAe;AAAA,IAE3E;AAAA,IACA,SAAS,CAAC,KAAK,MAAM,IAAI,gBAAgB,GAAG,eAAe,KAAK,CAAC,CAAC;AAAA,EACpE;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO,CAAC,KAAK,MAAM;AACX,YAAA,IAAI,eAAe,KAAK,CAAC;AAC/B,aAAO,UAAU,CAAC,OAAO,IAAI,IAAI,MAAM,EAAE;AAAA,IAC3C;AAAA,IACA,UAAU,CAAC,KAAK,MAAM;AACd,YAAA,IAAI,eAAe,KAAK,CAAC;AAC/B,YAAM,QAAQ,IAAI;AACZ,YAAA,UAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,YAAY,UAAU;AACnE,aACG,MAAM,eAAe,MAAM,MAAM,UAAU,IAAI,MAAM,cACtDA,WAAW,aAAa,mCAAS,YAAYA,WAAW,eAAe;AAAA,IAE3E;AAAA,IACA,SAAS,CAAC,KAAK,MAAM,IAAI,gBAAgB,GAAG,eAAe,KAAK,CAAC,CAAC;AAAA,EACpE;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO,CAAC,KAAK,MAAM;AACX,YAAA,IAAI,eAAe,KAAK,CAAC;AAC/B,aAAO,UAAU,CAAC,OAAO,IAAI,IAAI,MAAM,EAAE;AAAA,IAC3C;AAAA,IACA,UAAU,CAAC,KAAK,MAAM;AACd,YAAA,IAAI,eAAe,KAAK,CAAC;AAC/B,YAAM,QAAQ,IAAI;AACZ,YAAA,UAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,YAAY,UAAU;AACnE,aACG,MAAM,eAAe,MAAM,MAAM,UAAU,IAAI,MAAM,cACtDA,WAAW,aAAa,mCAAS,YAAYA,WAAW,UAAU;AAAA,IAEtE;AAAA,IACA,SAAS,CAAC,KAAK,MAAM,IAAI,WAAW,GAAG,eAAe,KAAK,CAAC,CAAC;AAAA,EAC/D;AAAA,EACA,EAAE,MAAM,UAAU;AAAA,EAClB;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,SAAS,CAAC,KAAK,MAAM;;AAAA,cAAC,GAAC,SAAI,MAAM,QAAQ,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,YAAY,SAAU,CAAA,MAAvD,mBAA0D;AAAA;AAAA,IACjF,SAAS,CAAC,KAAK,MAAM,IAAI,gBAAgB,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,SAAS,CAAC,KAAK,MAAM;;AAAA,cAAC,GAAC,SAAI,MAAM,QAAQ,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,YAAY,SAAU,CAAA,MAAvD,mBAA0D;AAAA;AAAA,IACjF,SAAS,CAAC,KAAK,MAAM,IAAI,kBAAkB,CAAC;AAAA,EAC9C;AAAA,EACA,EAAE,MAAM,UAAU;AAAA,EAClB;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,GAAG;AAAA,IACf,SAAS,CAAC,QAAQ,IAAI,OAAO;AAAA,EAAA;AAEjC;AAIO,MAAM,4BAAqD;AAAA,EAChE,EAAE,MAAM,aAAa,aAAa,aAAa;AAAA,EAC/C,EAAE,MAAM,UAAU;AAAA,EAClB,EAAE,MAAM,aAAa,aAAa,WAAW;AAAA,EAC7C,EAAE,MAAM,UAAU;AAAA,EAClB;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,GAAG;AAAA,IACf,SAAS,CAAC,QAAQ,IAAI,IAAI;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,GAAG;AAAA,IACf,SAAS,CAAC,QAAQ,IAAI,KAAK;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,GAAG;AAAA,IACf,SAAS,CAAC,QAAQ,IAAI,MAAM,KAAK;AAAA,EACnC;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,SAAS;AAAA,IACrB,SAAS,CAAC,QAAQ,IAAI,MAAM,IAAI;AAAA,EAClC;AAAA,EACA,EAAE,MAAM,UAAU;AAAA,EAClB;AAAA,IACE,IAAI;AAAA,IACJ,OAAO,CAAC,KAAK,MAAM;AACX,YAAA,IAAI,eAAe,KAAK,CAAC;AAC/B,aAAO,UAAU,CAAC,UAAU,IAAI,IAAI,MAAM,EAAE;AAAA,IAC9C;AAAA,IACA,UAAU,CAAC,KAAK,MAAM;AACd,YAAA,IAAI,eAAe,KAAK,CAAC;AAC/B,YAAM,QAAQ,IAAI;AACZ,YAAA,UAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,YAAY,UAAU;AACnE,aACG,MAAM,eAAe,MAAM,MAAM,UAAU,IAAI,MAAM,cACtDA,WAAW,aAAa,mCAAS,YAAYA,WAAW,cAAc;AAAA,IAE1E;AAAA,IACA,SAAS,CAAC,KAAK,MAAM,IAAI,eAAe,GAAG,eAAe,KAAK,CAAC,CAAC;AAAA,EACnE;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO,CAAC,KAAK,MAAM;AACX,YAAA,IAAI,eAAe,KAAK,CAAC;AAC/B,aAAO,UAAU,CAAC,UAAU,IAAI,IAAI,MAAM,EAAE;AAAA,IAC9C;AAAA,IACA,UAAU,CAAC,KAAK,MAAM;AACd,YAAA,IAAI,eAAe,KAAK,CAAC;AAC/B,YAAM,QAAQ,IAAI;AACZ,YAAA,UAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,YAAY,UAAU;AACnE,aACG,MAAM,eAAe,MAAM,MAAM,UAAU,IAAI,MAAM,cACtDA,WAAW,aAAa,mCAAS,YAAYA,WAAW,eAAe;AAAA,IAE3E;AAAA,IACA,SAAS,CAAC,KAAK,MAAM,IAAI,gBAAgB,GAAG,eAAe,KAAK,CAAC,CAAC;AAAA,EACpE;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO,CAAC,KAAK,MAAM;AACX,YAAA,IAAI,eAAe,KAAK,CAAC;AAC/B,aAAO,UAAU,CAAC,UAAU,IAAI,IAAI,MAAM,EAAE;AAAA,IAC9C;AAAA,IACA,UAAU,CAAC,KAAK,MAAM;AACd,YAAA,IAAI,eAAe,KAAK,CAAC;AAC/B,YAAM,QAAQ,IAAI;AACZ,YAAA,UAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,YAAY,UAAU;AACnE,aACG,MAAM,eAAe,MAAM,MAAM,UAAU,IAAI,MAAM,cACtDA,WAAW,aAAa,mCAAS,YAAYA,WAAW,UAAU;AAAA,IAEtE;AAAA,IACA,SAAS,CAAC,KAAK,MAAM,IAAI,WAAW,GAAG,eAAe,KAAK,CAAC,CAAC;AAAA,EAC/D;AAAA,EACA,EAAE,MAAM,UAAU;AAAA,EAClB;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,CAAC,GAAG;AAAA,IACf,SAAS,CAAC,QAAQ,IAAI,OAAO;AAAA,EAC/B;AAAA,EACA,EAAE,MAAM,UAAU;AAAA,EAClB,EAAE,MAAM,aAAa,aAAa,YAAY;AAChD;AAIgB,SAAA,iBAAiB,OAAkB,UAAsB,OAAgC;AACjG,QAAA,QAAQ,EAAE,OAAO,SAAS;AAC1B,QAAA,QAAQ,MAAM,cAAc;AAE3B,SAAA;AAAA,IACL;AAAA,IACA,UAAU,MAAM;AAAA,IAChB,eAAe,MAAM;AAAA,IACrB,qBAAqB,MAAM;AAAA,IAC3B,oBAAoB,MAAM;AAAA,IAE1B,KAAK,MAAM,OAAO,KAAK;AAAA,IACvB,MAAM,MAAM,OAAO,KAAK;AAAA,IACxB,OAAO,CAAC,YAAY,UAAU,OAAO,OAAO,SAAS;AAAA,IACrD,MAAM,MAAM,OAAO,KAAK;AAAA,IACxB,MAAM,MAAM,OAAO,KAAK;AAAA,IAExB,iBAAiB,CAAC,GAAG,YAAY;AAC/B,eAASS,gBAAiB,EAAE,SAAS,GAAG,UAAU,OAAA,CAAQ,CAAC;AAAA,IAC7D;AAAA,IACA,iBAAiB,CAAC,GAAG,YAAY;AAC/B,eAASC,gBAAiB,EAAE,SAAS,GAAG,UAAU,OAAA,CAAQ,CAAC;AAAA,IAC7D;AAAA,IACA,YAAY,CAAC,GAAG,YAAY;AAC1B,eAASC,WAAY,EAAE,SAAS,GAAG,UAAU,OAAA,CAAQ,CAAC;AAAA,IACxD;AAAA,IACA,gBAAgB,CAAC,GAAG,YAAY;AAC9B,eAASC,eAAgB,EAAE,SAAS,GAAG,UAAU,OAAA,CAAQ,CAAC;AAAA,IAC5D;AAAA,IACA,iBAAiB,CAAC,GAAG,YAAY;AAC/B,eAASC,gBAAiB,EAAE,SAAS,GAAG,UAAU,OAAA,CAAQ,CAAC;AAAA,IAC7D;AAAA,IACA,YAAY,CAAC,GAAG,YAAY;AAC1B,eAASC,WAAY,EAAE,SAAS,GAAG,UAAU,OAAA,CAAQ,CAAC;AAAA,IACxD;AAAA,IAEA,UAAU,OAAO,GAAG,cAAc;AAChC,UAAI,cAAc,OAAO;AACjB,cAAA,cAAc,OAAO,CAAC;AAAA,MAAA,OACvB;AACC,cAAA,eAAe,OAAO,CAAC;AAAA,MAAA;AAAA,IAEjC;AAAA,IACA,YAAY,OAAO,GAAG,WAAW;AAC/B,UAAI,QAAQ;AACJ,cAAA,aAAa,OAAO,GAAG,MAAM;AAAA,MAAA,OAC9B;AACL,0BAAkB,OAAO,CAAC;AAAA,MAAA;AAAA,IAE9B;AAAA,IACA,aAAa,CAAC,MAAM,kBAAkB,OAAO,CAAC;AAAA,IAE9C,iBAAiB,CAAC,MAAM,oBAAoB,OAAO,CAAC;AAAA,IACpD,mBAAmB,CAAC,MAAM,sBAAsB,OAAO,CAAC;AAAA,IAExD,QAAQ,MAAM,SAAS,KAAK;AAAA,IAE5B,gBAAgB,CAAC,GAAG,UAAU;AAC5B,UAAI,CAAC,OAAO;AACV;AAAA,MAAA;AAEF,YAAM,OAAO,IAAI,EAAE,GAAG,GAAG,GAAG;AAC5B,YAAM,OAAO;AAAA,QACX,MAAM,EAAE,CAAC,IAAI,GAAG,EAAE,OAAO,SAAS,SAAY;AAAA,QAC9C,SAAS;AAAA,QACT,gBAAgB;AAAA,UACd,SAAS,MAAM;AAAA,UACf,eAAe,MAAM;AAAA,UACrB,UAAU,MAAM;AAAA,QAClB;AAAA,QACA,gBAAgB;AAAA,UACd,SAAS,MAAM;AAAA,UACf,eAAe,MAAM;AAAA,UACrB,UAAU,MAAM;AAAA,QAAA;AAAA,MAClB,CACD;AACQ,eAAAC,SAAU,EAAE,eAAe,EAAE,SAAS,MAAM,EAAA,CAAG,CAAC;AAAA,IAC3D;AAAA,IAEA;AAAA,EACF;AACF;AAsBA,MAAM,6CAA6B,IAAqB;AAUxC,SAAA,sBAAsB,IAAY,WAA0B;AACnD,yBAAA,IAAI,IAAI,SAAS;AAC1C;AAIO,SAAS,iBAAiB,IAAiC;AACzD,SAAA,uBAAuB,IAAI,EAAE;AACtC;AC1kBO,MAAM,WAA8B,CAAC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,WAAW,YAAY;AAE3B,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,gBAAgB,WAAW,gBAAgB,YAAY,GAAG,YAAY,IAAI,SAAS,KAAK,EAAE;AAAA,MACrG,eAAa;AAAA,MACb,SAAS,WAAW,SAAY;AAAA,MAEhC,UAAA;AAAA,QAAA,qBAAC,SAAI,WAAW,eAAe,WAAW,yBAAyB,EAAE,IAClE,UAAA;AAAA,UAAY,YAAA,oBAAC,UAAK,WAAW,qBAAqB,UAAU,yBAAyB,EAAE,IAAI,UAAC,IAAA,CAAA;AAAA,UAC5F;AAAA,QAAA,GACH;AAAA,QACC,aAAa,QAAQ,UAAU,SAAS,KACtC,oBAAA,OAAA,EAAI,WAAU,oBACZ,oBAAU,IAAI,CAAC,UAAU,2BACvB,QACE,EAAA,UAAA;AAAA,UAAA,IAAI,KAAK,oBAAC,QAAK,EAAA,WAAU,wBAAuB,UAAE,MAAA;AAAA,8BAClD,QAAK,EAAA,WAAU,0BACb,UAAS,SAAA,MAAM,GAAG,EAAE;AAAA,YAAI,CAAC,MAAM,GAAG,QACjC,IAAI,IAAI,SAAS,IACf,qBAAC,QAAc,EAAA,UAAA;AAAA,cAAA;AAAA,cAAK;AAAA,YAAA,KAAT,CAAU,IAErB,oBAAC,UAAa,WAAU,qBACrB,kBADQ,CAEX;AAAA,UAAA,EAGN,CAAA;AAAA,QAAA,EAZS,GAAA,CAaX,CACD,EACH,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAEJ;AAEJ;AAEO,MAAM,cAAkB,MAAO,oBAAA,MAAA,EAAG,WAAU,kBAAkB,CAAA;ACjD9D,MAAM,cAAc,MAAM;AAC/B,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AACxC,QAAA,EAAE,qBAAqB,YAAA,IAAgB;AAC7C,QAAM,EAAE,GAAG,KAAK,GAAG,KAAS,IAAA;AACtB,QAAA,UAAU,OAAuB,IAAI;AAE3C,YAAU,MAAM;AACd,QAAI,QAAQ,SAAS;AACnB,iBAAW,QAAQ,OAAO;AAAA,IAAA;AAAA,EAC5B,CACD;AAED,MAAI,QAAQ,IAAI;AACP,WAAA;AAAA,EAAA;AAGH,QAAA,QAAQ,MAAM,SAAS,uBAAuB,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;AACrE,QAAM,MAAM,iBAAiB,OAAO,UAAU,KAAK;AAGjD,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS,CAAC,MAAkB;AAC1B,UAAE,eAAe;AACX,cAAA;AACC,eAAA;AAAA,MACT;AAAA,MAEA,8BAAC,OAAI,EAAA,KAAK,SAAS,WAAW,mBAAmB,OAAO,EAAE,KAAU,QAClE,UAAA,oBAAC,QAAG,WAAU,iBACX,sBAAY,IAAI,CAAC,GAAG,MAAM;;AACrB,YAAA,EAAE,SAAS,WAAW;AACxB,cAAI,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,GAAG;AACzB,mBAAA;AAAA,UAAA;AAEF,iBAAA,oBAAC,iBAAiB,CAAG;AAAA,QAAA;AAE1B,YAAA,EAAE,SAAS,aAAa;AACnB,iBAAA;AAAA,QAAA;AAET,cAAM,UAAU,CAAC,EAAE,WAAW,EAAE,QAAQ,GAAG;AAC3C,YAAI,CAAC,SAAS;AACL,iBAAA;AAAA,QAAA;AAET,cAAM,aAAW,OAAE,aAAF,2BAAa,SAAQ;AAChC,cAAA,QAAQ,OAAO,EAAE,UAAU,aAAa,EAAE,MAAM,GAAG,IAAI,EAAE;AACzD,cAAA,YAAY,OAAO,EAAE,cAAc,aAAa,EAAE,UAAU,GAAG,IAAI,EAAE;AACrE,cAAA,WAAU,OAAE,YAAF,2BAAY;AAE1B,eAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ,EAAE,KAAK,GAAG,EAAE,EAAE,UAAU;AAAA,YAChC,SAAS,MAAM,EAAE,QAAQ,GAAG;AAAA,UAAA;AAAA,UANvB;AAAA,QAOP;AAAA,MAEH,CAAA,EACH,CAAA,EACF,CAAA;AAAA,IAAA;AAAA,EACF;AAEJ;ACpEA,MAAM,gBAAuD;AAAA,EAC3D,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AACZ;AAEA,MAAM,mBAA4C,CAAC,SAAS,UAAU;AACtE,MAAM,oBAAqC,EAAE,QAAQ,MAAM,OAAO,CAAC,EAAE,EAAE;AAQvE,MAAM,gBAAyC,CAAC,EAAE,GAAG,OAAO,gBAAgB;AAC1E,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AACxC,QAAA,EAAE,eAAe,SAAA,IAAa;AACpC,QAAM,QAAQ,SAAS;AAEjB,QAAA,CAAC,YAAY,aAAa,IAAI,SAA4B,CAAC,EAAE,GAAG,kBAAkB,CAAC,CAAC;AAC1F,QAAM,CAAC,MAAM,OAAO,IAAI,SAAuB,IAAI;AACnD,QAAM,CAAC,SAAS,UAAU,IAAI,SAA+B,IAAI;AAGjE,QAAM,gBAAgB;AAAA,IACpB,CAAC,SAAkC;AACjC,UAAI,MAAM;AACR,aAAK,MAAM;AAAA,MAAA;AAAA,IAEf;AAAA;AAAA,IAEA,CAAC,CAAC;AAAA,EACJ;AAGA,YAAU,MAAM;AACd,QAAI,OAAO;AACHC,YAAAA,WAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,YAAY,UAAU;AACnE,YAAM,WAAWA,qCAAS;AAC1B,UAAI,YAAY,SAAS,WAAW,SAAS,GAAG;AAC9C,sBAAc,SAAS,WAAW,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,EAAA,EAAI,CAAC;AACrE,gBAAA,SAAS,QAAQ,IAAI;AAAA,MAAA,OACxB;AACS,sBAAA,CAAC,EAAE,GAAG,mBAAmB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;AACrD,gBAAQ,IAAI;AAAA,MAAA;AAAA,IACd;AAAA,EACF,GACC,CAAC,GAAG,KAAK,CAAC;AAGP,QAAA,eAAe,YAAY,MAAM;AACrC,eAAW,IAAI;AACf,2CAAY;AACN,UAAA;AAAA,EAAA,GACL,CAAC,OAAO,SAAS,CAAC;AAGrB,YAAU,MAAM;AACd,QAAI,SAAS;AACX,6CAAY,cAAc;AAAA,IAAY;AAAA,EACxC,GAGC,CAAC,OAAO,CAAC;AAGZ,YAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ;AAAA,IAAA;AAEF,QAAI,YAAY;AAChB,UAAM,UAAU,MAAM;AACpB,UAAI,WAAW;AACb;AAAA,MAAA;AAEF,YAAMC,gBAAe,SAAS;AAC9B,UAAI,CAACA,eAAc;AACjB;AAAA,MAAA;AAEF,YAAM,EAAE,GAAG,SAAS,YAAY,iBAAiB,MAAM,eAAe;AAClE,UAAA,gBAAgB,SAAS,GAAG;AAC9B,iBAAS,WAAW,EAAE,GAAG,SAAS,QAAQ,EAAE,MAAM,YAAY,YAAY,gBAAA,EAAmB,CAAA,CAAC;AAAA,MAAA,OACzF;AACL,iBAAS,WAAW,EAAE,GAAG,QAAS,CAAA,CAAC;AAAA,MAAA;AAErC,6CAAY;AACZ,iBAAW,IAAI;AACT,YAAA;AAAA,IACR;AACA,UAAM,eAAe,SAAS;AAC1B,QAAA,iBAAiB,aAAa,qBAAqB,aAAa,SAAS,aAAa,OAAO,IAAI;AACtF,mBAAA,eAAA,EAAiB,KAAK,OAAO;AAAA,IAAA,OACrC;AACG,cAAA;AAAA,IAAA;AAEV,WAAO,MAAM;AACC,kBAAA;AAAA,IACd;AAAA,EAAA,GAEC,CAAC,OAAO,CAAC;AAEZ,QAAM,kBAAkB,YAAY,CAAC,OAAe,UAAoC;AACtF,kBAAc,CAAC,SAAS;AAChB,YAAA,OAAO,CAAC,GAAG,IAAI;AAChB,WAAA,KAAK,IAAI,EAAE,GAAG,KAAK,KAAK,GAAG,GAAG,MAAM;AAClC,aAAA;AAAA,IAAA,CACR;AAAA,EACH,GAAG,EAAE;AAEC,QAAA,eAAe,YAAY,MAAM;AACrC,kBAAc,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,GAAG,mBAAmB,OAAO,CAAC,EAAE,EAAA,CAAG,CAAC;AAAA,EAC1E,GAAG,EAAE;AAEC,QAAA,kBAAkB,YAAY,CAAC,UAAkB;AACrD,kBAAc,CAAC,SAAS;AAClB,UAAA,KAAK,UAAU,GAAG;AACb,eAAA,CAAC,EAAE,GAAG,mBAAmB,OAAO,CAAC,EAAE,GAAG;AAAA,MAAA;AAE/C,aAAO,KAAK,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK;AAAA,IAAA,CACzC;AAAA,EACH,GAAG,EAAE;AAEC,QAAA,oBAAoB,YAAY,MAAM;AAC1C,UAAM,QAAQ,WAAW,OAAO,CAAC,MAAM;AACrC,UAAI,iBAAiB,SAAS,EAAE,MAAM,GAAG;AAChC,eAAA;AAAA,MAAA;AAEF,aAAA,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE;AAAA,IAAA,CAC3C;AACD,eAAW,EAAE,GAAG,YAAY,OAAO,MAAM;AAAA,EACxC,GAAA,CAAC,GAAG,YAAY,IAAI,CAAC;AAElB,QAAA,oBAAoB,YAAY,MAAM;AAC1C,eAAW,IAAI;AACf,aAAS,WAAW,EAAE,EAAE,CAAC,CAAC;AACpB,UAAA;AAAA,EACL,GAAA,CAAC,UAAU,GAAG,KAAK,CAAC;AAEjB,QAAA,iBAAiB,YAAY,MAAM;AACvC,eAAW,IAAI;AACN,aAAA,WAAW,CAAA,CAAE,CAAC;AACjB,UAAA;AAAA,EAAA,GACL,CAAC,UAAU,KAAK,CAAC;AAEpB,MAAI,CAAC,OAAO;AACH,WAAA;AAAA,EAAA;AAGH,QAAA,UAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,YAAY,UAAU;AACnE,QAAM,iBAAiBjB,WAAW,aAAa,mCAAS,YAAYA,WAAW,MAAM;AAC/E,QAAA,eAAe,MAAM,iBAAiB;AAG1C,SAAA,oBAAC,QAAG,WAAW,wBAAwB,iBAAiB,iBAAiB,EAAE,IACzE,UACE,qBAAA,UAAA,EAAA,UAAA;AAAA,IAAC,qBAAA,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,MAAC,oBAAA,OAAA,EAAI,WAAU,gBAAe,UAAO,WAAA;AAAA,MACrC,oBAAC,YAAO,WAAU,qBAAoB,SAAS,cAAc,UAAU,gBAAgB,UAEvF,QAAA,CAAA;AAAA,MACA,qBAAC,SAAI,WAAW,wBAAwB,WAAW,UAAU,IAAI,iBAAiB,EAAE,IAClF,UAAA;AAAA,QAAA,qBAAC,SAAM,EAAA,WAAW,SAAS,QAAQ,cAAc,IAC/C,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,SAAS,SAAS;AAAA,cAClB,UAAU,MAAM,QAAQ,KAAK;AAAA,cAC7B,UAAU,kBAAkB,WAAW,UAAU;AAAA,YAAA;AAAA,UACnD;AAAA,UAAE;AAAA,QAAA,GAEJ;AAAA,6BACC,SAAM,EAAA,WAAW,SAAS,OAAO,cAAc,IAC9C,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,SAAS,SAAS;AAAA,cAClB,UAAU,MAAM,QAAQ,IAAI;AAAA,cAC5B,UAAU,kBAAkB,WAAW,UAAU;AAAA,YAAA;AAAA,UACnD;AAAA,UAAE;AAAA,QAAA,EAEJ,CAAA;AAAA,MAAA,EACF,CAAA;AAAA,IAAA,GACF;AAAA,IACC,oBAAA,OAAA,EAAI,WAAU,wBACZ,UAAW,WAAA,IAAI,CAAC,MAAM,MACrB,qBAAC,OAAI,EAAA,WAAU,2BACb,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,KAAK;AAAA,UACZ,UAAU;AAAA,UACV,UAAU,IAAI,IAAI;AAAA,UAClB,UAAU,CAAC,MAAM,gBAAgB,GAAG,EAAE,QAAQ,EAAE,OAAO,OAAgC;AAAA,UAErF,UAAO,OAAA,KAAK,aAAa,EAA8B,IAAI,CAAC,MAC3D,oBAAA,UAAA,EAAe,OAAO,GACpB,UAAA,cAAc,CAAC,EAAA,GADL,CAEb,CACD;AAAA,QAAA;AAAA,MACH;AAAA,MACC,CAAC,iBAAiB,SAAS,KAAK,MAAM,KACrC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAK,MAAM,IAAI,gBAAgB;AAAA,UAC/B,WAAU;AAAA,UACV,MAAK;AAAA,UACL,aAAY;AAAA,UACZ,OAAO,KAAK,MAAM,CAAC,KAAK;AAAA,UACxB,UAAU;AAAA,UACV,UAAU,IAAI,IAAI;AAAA,UAClB,UAAU,CAAC,MAAM,gBAAgB,GAAG,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,GAAG;AAAA,UAC/D,WAAW,CAAC,MAAM;AACZ,gBAAA,EAAE,YAAY,aAAa;AAC7B;AAAA,YAAA;AAEE,gBAAA,EAAE,QAAQ,SAAS;AACH,gCAAA;AAAA,YAAA;AAEhB,gBAAA,EAAE,QAAQ,UAAU;AAChB,oBAAA;AAAA,YAAA;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,MAEF;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAM,gBAAgB,CAAC;AAAA,UAChC,UAAU;AAAA,UACV,OAAM;AAAA,UACP,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,KA5C4C,CA6C9C,CACD,GACH;AAAA,IACA,qBAAC,OAAI,EAAA,WAAU,qBACZ,UAAA;AAAA,MAAA,oCACE,UAAO,EAAA,WAAU,2BAA0B,SAAS,gBAAgB,UAErE,aAAA;AAAA,MAEF,qBAAC,OAAI,EAAA,WAAU,2BACZ,UAAA;AAAA,SAAA,mCAAS,WACP,oBAAA,UAAA,EAAO,WAAU,uBAAsB,SAAS,mBAAmB,UAEpE,QAAA,CAAA;AAAA,QAEF,oBAAC,YAAO,WAAU,uBAAsB,SAAS,mBAAmB,UAAU,gBAAgB,UAE9F,QAAA,CAAA;AAAA,MAAA,EACF,CAAA;AAAA,IAAA,EACF,CAAA;AAAA,EAAA,EAAA,CACF,EACF,CAAA;AAEJ;AAEA,sBAAsB,cAAc,aAAa;ACnQjD,MAAM,cAAuC,CAAC,EAAE,GAAG,OAAO,gBAAgB;AACxE,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AACxC,QAAA,EAAE,eAAe,SAAA,IAAa;AACpC,QAAM,QAAQ,SAAS;AAEvB,QAAM,CAAC,SAAS,UAAU,IAAI,SAA6B,IAAI;AAEzD,QAAA,eAAe,YAAY,MAAM;AACrC,eAAW,IAAI;AACf,2CAAY;AACN,UAAA;AAAA,EAAA,GACL,CAAC,OAAO,SAAS,CAAC;AAGrB,YAAU,MAAM;AACd,QAAI,SAAS;AACX,6CAAY,YAAiB;AAAA,IAAY;AAAA,EAC3C,GAEC,CAAC,OAAO,CAAC;AAGZ,YAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ;AAAA,IAAA;AAEF,QAAI,YAAY;AAChB,UAAM,UAAU,MAAM;AACpB,UAAI,WAAW;AACb;AAAA,MAAA;AAEF,YAAMiB,gBAAe,SAAS;AAC9B,UAAI,CAACA,eAAc;AACjB;AAAA,MAAA;AAEO,eAAA,SAAS,EAAE,GAAG,QAAQ,GAAG,WAAW,QAAQ,UAAU,CAAC,CAAC;AACjE,6CAAY;AACZ,iBAAW,IAAI;AACT,YAAA;AAAA,IACR;AACA,UAAM,eAAe,SAAS;AAC1B,QAAA,iBAAiB,aAAa,qBAAqB,aAAa,SAAS,aAAa,OAAO,IAAI;AACtF,mBAAA,eAAA,EAAiB,KAAK,OAAO;AAAA,IAAA,OACrC;AACG,cAAA;AAAA,IAAA;AAEV,WAAO,MAAM;AACC,kBAAA;AAAA,IACd;AAAA,EAAA,GAEC,CAAC,OAAO,CAAC;AAEZ,MAAI,CAAC,OAAO;AACH,WAAA;AAAA,EAAA;AAGH,QAAA,UAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,YAAY,UAAU;AACnE,QAAM,eAAejB,WAAW,aAAa,mCAAS,YAAYA,WAAW,IAAI;AAEjF,8BACG,MAAG,EAAA,WAAW,mCAAmC,eAAe,iBAAiB,EAAE,IAClF,UAAA;AAAA,IAAC,oBAAA,OAAA,EAAI,WAAU,gBAAe,UAAK,SAAA;AAAA,IACnC,qBAAC,OAAI,EAAA,WAAU,mBACb,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,CAAC,MAAM;AACd,cAAE,gBAAgB;AAClB,gBAAI,CAAC,cAAc;AACjB,yBAAW,EAAE,GAAG,WAAW,MAAA,CAAO;AAAA,YAAA;AAAA,UAEtC;AAAA,UACA,UAAU;AAAA,UACX,UAAA;AAAA,QAAA;AAAA,MAED;AAAA,MACA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,CAAC,MAAM;AACd,cAAE,gBAAgB;AAClB,gBAAI,CAAC,cAAc;AACjB,yBAAW,EAAE,GAAG,WAAW,OAAA,CAAQ;AAAA,YAAA;AAAA,UAEvC;AAAA,UACA,UAAU;AAAA,UACX,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,EACF,CAAA;AAAA,EAAA,GACF;AAEJ;AAEA,sBAAsB,YAAY,WAAW;AC/F7C,MAAM,eAAwC,CAAC,EAAE,GAAG,YAAY;AAC9D,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AACxC,QAAA,EAAE,eAAe,SAAA,IAAa;AACpC,QAAM,QAAQ,SAAS;AACjB,QAAA,gBAAgB,OAAyB,IAAI;AACnD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AAGrC,YAAU,MAAM;AACd,QAAI,OAAO;AACHgB,YAAAA,WAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,YAAY,UAAU;AAC1DA,gBAAAA,qCAAS,UAAS,EAAE;AAAA,IAAA;AAAA,EAC/B,GACC,CAAC,GAAG,KAAK,CAAC;AAEP,QAAA,mBAAmB,YAAY,MAAM;AACzC,QAAI,CAAC,OAAO;AACV;AAAA,IAAA;AAEF,UAAM,UAAU,IAAI,EAAE,GAAG,GAAG,GAAG;AAC/B,UAAM,OAAO;AAAA,MACX,MAAM,EAAE,CAAC,OAAO,GAAG,EAAE,OAAO,SAAS,SAAY;AAAA,MACjD,SAAS;AAAA,MACT,cAAc,CAAC;AAAA,MACf,gBAAgB;AAAA,QACd,SAAS,MAAM;AAAA,QACf,eAAe,MAAM;AAAA,QACrB,UAAU,MAAM;AAAA,MAClB;AAAA,MACA,gBAAgB;AAAA,QACd,SAAS,MAAM;AAAA,QACf,eAAe,MAAM;AAAA,QACrB,UAAU,MAAM;AAAA,MAAA;AAAA,IAClB,CACD;AACQ,aAAA,SAAS,EAAE,eAAe,EAAE,SAAS,MAAM,EAAA,CAAG,CAAC;AAClD,UAAA;AAAA,EACR,GAAG,CAAC,UAAU,GAAG,OAAO,OAAO,OAAO,MAAM,eAAe,MAAM,QAAQ,CAAC;AAE1E,MAAI,CAAC,OAAO;AACH,WAAA;AAAA,EAAA;AAGH,QAAA,UAAU,MAAM,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,YAAY,UAAU;AACnE,QAAM,gBAAgBhB,WAAW,aAAa,mCAAS,YAAYA,WAAW,QAAQ;AACtF,QAAM,mBAAmB,SAAS,OAAO,mCAAS,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;AAG/E,SAAA,oBAAC,MAAG,EAAA,WAAW,oCAAoC,gBAAgB,iBAAiB,EAAE,IACpF,UAAA,qBAAC,SAAM,EAAA,WAAU,sBACf,UAAA;AAAA,IAAC,oBAAA,OAAA,EAAI,WAAU,wBAAuB,UAAM,UAAA;AAAA,IAC5C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAU;AAAA,QACV,MAAK;AAAA,QACL,aAAa;AAAA,QACb,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,QACxC,WAAW,CAAC,MAAM;AACZ,cAAA,EAAE,YAAY,aAAa;AAC7B;AAAA,UAAA;AAEE,cAAA,EAAE,QAAQ,SAAS;AACJ,6BAAA;AAAA,UAAA;AAEf,cAAA,EAAE,QAAQ,UAAU;AAChB,kBAAA;AAAA,UAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA,oBAAC,YAAO,WAAU,sBAAqB,SAAS,kBAAkB,UAAU,eAAe,UAE3F,SAAA,CAAA;AAAA,EAAA,EAAA,CACF,EACF,CAAA;AAEJ;AAEA,sBAAsB,aAAa,YAAY;ACxExC,MAAM,aAAiB,MAAM;AAClC,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AAC9C,QAAM,EAAE,iBAAiB,WAAW,QAAY,IAAA;AAC1C,QAAA,QAAQ,MAAM,cAAc;AAElC,QAAM,IAAI,mDAAiB;AAC3B,QAAM,WAAW,mDAAiB;AAElC,QAAM,CAAC,cAAc,eAAe,IAAI,SAAyD,IAAI;AAE/F,QAAA,cAAc,YAAY,MAAM;AAC3B,aAAA,cAAc,IAAI,CAAC;AAC5B,UAAM,UAAU,OAAO;AAAA,EAAA,GACtB,CAAC,UAAU,SAAS,CAAC;AAExB,QAAM,gBAAgB;AAAA,IACpB,CAAC,SAAwB,WAAwB;AAC/C,UAAI,SAAS;AACX,wBAAgB,EAAE,SAAS,QAAQ,UAAU,aAAa;AAAA,MAAA,OACrD;AACL,wBAAgB,IAAI;AAAA,MAAA;AAAA,IAExB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,MAAI,CAAC,mBAAmB,CAAC,SAAS,KAAK,QAAQ,CAAC,UAAU;AACjD,WAAA;AAAA,EAAA;AAGT,QAAM,MAAM,iBAAiB,OAAO,UAAU,WAAW;AAGvD,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS,CAAC,MAAkB;AAC1B,UAAE,eAAe;AACjB,YAAI,CAAC,cAAc;AACL,sBAAA;AAAA,QAAA;AAEP,eAAA;AAAA,MACT;AAAA,MAEA,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,KAAK,SAAS,GAAG,MAAM,SAAS,GAAG,SAAS,eAAe,SAAS,OAAU;AAAA,YACvF,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,YAElC,UAAA,oBAAC,QAAG,WAAU,iBACX,kBAAQ,IAAI,CAAC,YAAY,UAAU;;AAC9B,kBAAA,WAAW,SAAS,aAAa;AACnC,sBAAMkB,WAAU,CAAC,WAAW,WAAW,WAAW,QAAQ,KAAK,CAAC;AAChE,oBAAI,CAACA,UAAS;AACL,yBAAA;AAAA,gBAAA;AAEH,sBAAA,UAAU,iBAAiB,WAAW,WAAW;AACvD,oBAAI,CAAC,SAAS;AACL,yBAAA;AAAA,gBAAA;AAET,2CAAQ,SAAoB,EAAA,GAAM,OAAO,aAAa,WAAW,iBAA5C,KAA2D;AAAA,cAAA;AAE9E,kBAAA,WAAW,SAAS,WAAW;AACjC,oBAAI,WAAW,WAAW,CAAC,WAAW,QAAQ,GAAG,GAAG;AAC3C,yBAAA;AAAA,gBAAA;AAEF,uBAAA,oBAAC,iBAAiB,KAAO;AAAA,cAAA;AAElC,oBAAM,UAAU,CAAC,WAAW,WAAW,WAAW,QAAQ,KAAK,CAAC;AAChE,kBAAI,CAAC,SAAS;AACL,uBAAA;AAAA,cAAA;AAET,oBAAM,aAAW,gBAAW,aAAX,oCAAsB,KAAK,OAAM;AAC5C,oBAAA,QAAQ,OAAO,WAAW,UAAU,aAAa,WAAW,MAAM,KAAK,CAAC,IAAI,WAAW;AACvF,oBAAA,YACJ,OAAO,WAAW,cAAc,aAAa,WAAW,UAAU,KAAK,CAAC,IAAI,WAAW;AAEvF,qBAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,QAAQ,WAAW,KAAK,GAAG,WAAW,EAAE,UAAU;AAAA,kBAClD,SAAS,MAAM;AACF,+BAAA,QAAQ,KAAK,CAAC;AAChB,6BAAA,cAAc,IAAI,CAAC;AAAA,kBAAA;AAAA,gBAC9B;AAAA,gBARK;AAAA,cASP;AAAA,YAAA,CAEH,EACH,CAAA;AAAA,UAAA;AAAA,QACF;AAAA,QACC,gBACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,KAAK,SAAS,GAAG,MAAM,SAAS,EAAE;AAAA,YAC3C,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,YAElC,UAAA;AAAA,cAAA,oBAAC,OAAI,EAAA,WAAU,sBAAsB,UAAA,aAAa,SAAQ;AAAA,cAC1D,oBAAC,OAAI,EAAA,WAAU,qBAAqB,CAAA;AAAA,kCACnC,UAAO,EAAA,WAAU,yBAAwB,SAAS,aAAa,QAAQ,UAExE,SAAA,CAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AAEJ;AChHA,SAAS,oBACP,YACA,KACA,GACA,OACA,OACA;;AACI,MAAA,WAAW,SAAS,WAAW;AAC1B,WAAA,oBAAC,iBAAiB,KAAO;AAAA,EAAA;AAE9B,MAAA,WAAW,SAAS,aAAa;AAC5B,WAAA;AAAA,EAAA;AAET,QAAM,UAAU,CAAC,WAAW,WAAW,WAAW,QAAQ,KAAK,CAAC;AAChE,MAAI,CAAC,SAAS;AACL,WAAA;AAAA,EAAA;AAET,QAAM,aAAW,gBAAW,aAAX,oCAAsB,KAAK,OAAM;AAC5C,QAAA,QAAQ,OAAO,WAAW,UAAU,aAAa,WAAW,MAAM,KAAK,CAAC,IAAI,WAAW;AACvF,QAAA,YAAY,OAAO,WAAW,cAAc,aAAa,WAAW,UAAU,KAAK,CAAC,IAAI,WAAW;AACnG,QAAA,UAAU,WAAW,WAAW,OAAO,WAAW,QAAQ,KAAK,CAAC,IAAI;AAExE,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,WAAW,KAAK,GAAG,WAAW,EAAE,UAAU;AAAA,MAClD,SAAS,MAAM;AACF,mBAAA,QAAQ,KAAK,CAAC;AACnB,cAAA;AAAA,MAAA;AAAA,IACR;AAAA,IATK;AAAA,EAUP;AAEJ;AAEO,MAAM,UAAc,MAAM;AAC/B,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AAC9C,QAAM,EAAE,cAAc,eAAe,UAAU,WAAW,YAAY;AACtE,QAAM,QAAQ,SAAS;AAEvB,QAAM,IAAI,6CAAc;AACxB,QAAM,WAAW,6CAAc;AAE/B,QAAM,cAAc,MAAM;AACf,aAAA,WAAW,IAAI,CAAC;AACzB,UAAM,UAAU,OAAO;AAAA,EACzB;AAEA,MAAI,CAAC,gBAAgB,CAAC,SAAS,KAAK,QAAQ,CAAC,UAAU;AAC9C,WAAA;AAAA,EAAA;AAGT,QAAM,MAAM,iBAAiB,OAAO,UAAU,WAAW;AAGvD,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS,CAAC,MAAkB;AAC1B,UAAE,eAAe;AACL,oBAAA;AACL,eAAA;AAAA,MACT;AAAA,MAEA,8BAAC,OAAI,EAAA,WAAU,eAAc,OAAO,EAAE,KAAK,SAAS,GAAG,MAAM,SAAS,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,gBAC3F,GAAA,UAAA,oBAAC,QAAG,WAAU,iBACX,UAAQ,QAAA,IAAI,CAAC,YAAY,UAAU,oBAAoB,YAAY,KAAK,GAAG,OAAO,WAAW,CAAC,GACjG,EACF,CAAA;AAAA,IAAA;AAAA,EACF;AAEJ;ACjFa,MAAA,aAAa,CAAC,MAAoD;AAC7E,MAAI,EAAE,KAAK,WAAW,OAAO,GAAG;AACtB,WAAA,EAAuB,QAAQ,SAAS;AAAA,EAAA;AAElD,MAAI,EAAE,KAAK,WAAW,OAAO,GAAG;AAC9B,UAAM,aAAa;AAEnB,WAAO,CAAC,EAAE,WAAW,UAAU,MAAM,WAAW,WAAW;AAAA,EAAA;AAEtD,SAAA;AACT;AAKa,MAAA,qBAAqB,CAAC,MAAiD;AAClF,MAAI,CAAC,EAAE,KAAK,WAAW,OAAO,GAAG;AAC/B,MAAE,eAAe;AAAA,EAAA;AAErB;ACcO,MAAM,OAAkB,KAAK,CAAC,EAAE,GAAG,QAAQ;;AAC1C,QAAA,QAAQ,IAAI,CAAC;AACb,QAAA,QAAQ,IAAI,CAAC;AACnB,QAAM,UAAU,GAAG,KAAK,GAAG,KAAK;AAChC,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AACxC,QAAA,iBAAiB,OAAO,IAAI;AAE5B,QAAA,UAAU,OAA6B,IAAI;AACjD,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAA+B,IAAI;AAC3E,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,QAAQ,cAAc;AAGtB,QAAA,gBAAgB,gBAAgB,KAAK;AAErC,QAAA,cAAc,+BAAO,SAAS;AAE9B,QAAA,gBAAgB,WAAW,aAAa;AAE9C,QAAM,UAAU,mBAAmB;AACnC,QAAM,UAAU,SAAS,MAAM,KAAK,SAAS,MAAM;AAC7C,QAAA,iBAAiB,YAAY,MAAM;;AACjC,UAAA,QAAOvB,MAAA,QAAQ,YAAR,gBAAAA,IAAiB;AAC9B,QAAI,QAAQ,MAAM;AACT,aAAA;AAAA,IAAA;AAET;AAAA,MACE,cAAc;AAAA,QACZ,GAAG,KAAK;AAAA,QACR,GAAG,KAAK;AAAA,QACR,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK;AAAA,MACb,CAAA;AAAA,IACH;AAAA,EAAA,GACC,CAAC,QAAQ,CAAC;AAEb,YAAU,MAAM;AAEV,QAAA,WAAW,CAAC,eAAe,SAAS;AACvB,qBAAA;AACf;AAAA,IAAA;AAEF,mBAAe,UAAU;AAAA,EACxB,GAAA,CAAC,SAAS,SAAS,cAAc,CAAC;AAE/B,QAAA,OAAO,+BAAO,QAAQ,EAAE,GAAG,KAAK,EAAE,YAAY;AAEpD,QAAM,YAAY;AAAA,IAChB,CAAC,UAAkB;AACjB,eAAS,MAAM,EAAE,MAAM,CAAC,CAAC;AAAA,IAC3B;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,QAAQ;AAAA,IACZ,CAACN,WAAqB;AACX,eAAA,SAAS,EAAE,eAAe,EAAE,SAASA,OAAM,QAAU,EAAA,CAAC,CAAC;AAAA,IAClE;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,MAAI,eAAe;AACf,MAAA;AACA,MAAA;AACF,QAAI,OAAO;AACT,iBAAW,MAAM,OAAO,EAAE,OAAO,OAAO,EAAE,GAAG,EAAK,GAAA,OAAO,OAAO,OAAA,CAAW;AAAA,IAAA;AAAA,WAEtE,GAAQ;AACX,QAAA,aAAa,GAAG,CAAC,GAAG;AACtB,qBAAe,EAAE;AACjB,iBAAW,EAAE;AAAA,IAAA,OACR;AACL,qBAAe,EAAE;AACN,iBAAA;AAAA,IAAA;AAAA,EACb;AAEF,QAAM,GAAG,CAAC,KAAI,+BAAO,eAAe,EAAE,GAAG,SAAQ,CAAC,QAAW,MAAS;AAChE,QAAA,gBAAgB,QAAQ,GAAG,CAAC;AAClC,QAAM,QAAQ,UAAU;AAExB,QAAM,kBAAkB,CAAC,GAAE,+BAAO,SAAS,mBAAkB;AAE7D,QAAM,kBAAkB;AAAA,IACtB,CAAC,MAA2C;AAC1C,QAAE,gBAAgB;AAClB,yBAAmB,CAAC;AAEpB,UAAI,CAAC,OAAO;AACH,eAAA;AAAA,MAAA;AAEL,UAAA,CAAC,WAAW,CAAC,GAAG;AACX,eAAA;AAAA,MAAA;AAET,UAAI,CAAC,OAAO;AACH,eAAA;AAAA,MAAA;AAIT,UAAI,EAAE,KAAK,WAAW,OAAO,GAAG;AAE9B,YAAI,mBAAmB,OAAO;AAC5B,gBAAM,KAAK;AAAA,QAAA;AAEb,iBAAS,OAAO,EAAE,GAAG,EAAG,CAAA,CAAC;AAChB,iBAAA,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,EAAG,CAAA,CAAC;AACpD,eAAA;AAAA,MAAA;AAIT,UAAI,EAAE,UAAU;AACd,iBAAS,KAAK,EAAE,GAAG,EAAG,CAAA,CAAC;AAAA,MAAA,OAClB;AACI,iBAAA,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,IAAI,MAAM,GAAI,CAAA,CAAC;AAAA,MAAA;AAGtD,eAAA,YAAY,IAAI,CAAC;AACpB,YAAA,cAAc,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,GAAG,OAAO;AAClE,UAAI,iBAAiB;AACb,cAAA,WAAW,UAAU,EAAE,OAAO,eAAe,MAAM,KAAK,aAAa;AAC3E,YAAI,UAAU;AACL,iBAAA;AAAA,QAAA;AAAA,MACT;AAGF,YAAM,SAAS,cAAc;AAC7B,YAAM,KAAK;AACF,eAAA,kBAAkB,EAAE,CAAC;AAE9B,UAAI,oBAAoB;AACf,eAAA;AAAA,MAAA;AAGT,UAAI,iBAAiB;AACnB,kBAAU,MAAM,KAAK;AAAA,MAAA;AAEnB,UAAA,CAAC,EAAE,UAAU;AACf,iBAAS,OAAO,EAAE,GAAG,EAAG,CAAA,CAAC;AAAA,MAAA;AAEpB,aAAA;AAAA,IACT;AAAA,IACA,CAAC,iBAAiB,OAAO,SAAS,eAAe,aAAa,oBAAoB,WAAW,KAAK;AAAA,EACpG;AAEA,QAAM,gBAAgB;AAAA,IACpB,CAAC,MAA2C;AAC1C,QAAE,gBAAgB;AAClB,UAAI,EAAE,KAAK,WAAW,OAAO,GAAG;AAC9B;AAAA,MAAA;AAGF,yBAAmB,CAAC;AACX,eAAA,YAAY,KAAK,CAAC;AAC3B,UAAI,oBAAoB;AACb,iBAAA,eAAe,kBAAkB,CAAC;AAC3C,cAAM,KAAK;AACJ,eAAA;AAAA,MAAA;AAET,UAAI,iBAAiB;AACnB,iBAAS,KAAK,EAAE,GAAG,IAAI,GAAG,GAAA,CAAI,CAAC;AAAA,MAAA;AAAA,IAEnC;AAAA,IACA,CAAC,oBAAoB,iBAAiB,KAAK;AAAA,EAC7C;AAEA,QAAM,iBAAiB;AAAA,IACrB,CAAC,MAA2C;AACtC,UAAA,CAAC,WAAW,CAAC,GAAG;AACX,eAAA;AAAA,MAAA;AAIT,UAAI,EAAE,KAAK,WAAW,OAAO,GAAG;AACvB,eAAA;AAAA,MAAA;AAGT,UAAI,CAAC,OAAO;AACH,eAAA;AAAA,MAAA;AAGT,yBAAmB,CAAC;AACpB,QAAE,gBAAgB;AAElB,UAAI,oBAAoB;AACtB,iBAAS,sBAAsB,EAAE,GAAG,EAAG,CAAA,CAAC;AACjC,eAAA;AAAA,MAAA;AAET,UAAI,qBAAqB;AACvB,iBAAS,KAAK,EAAE,GAAG,GAAG,MAAM,QAAA,CAAS,CAAC;AAC/B,eAAA;AAAA,MAAA;AAET,UAAI,oBAAoB;AACtB,iBAAS,KAAK,EAAE,GAAG,MAAM,SAAS,EAAA,CAAG,CAAC;AAC/B,eAAA;AAAA,MAAA;AAET,UAAI,mBAAmB,CAAC,gBAAgB,eAAe,IAAI,GAAG;AACrD,eAAA;AAAA,MAAA;AAET,eAAS,KAAK,EAAE,GAAG,EAAG,CAAA,CAAC;AAEvB,UAAI,iBAAiB;AACb,cAAA,UAAU,WAAW,EAAE,GAAG,eAAe,MAAM,GAAG,MAAM,GAAG;AAC3D,cAAA,YAAY,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,GAAG,YAAY,OAAO,CAAC;AAC7E,kBAAU,EAAE,OAAO,eAAe,MAAM,KAAK,WAAW;AAAA,MAAA;AAGnD,aAAA;AAAA,IACT;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAM,0BAA0B;AAAA,IAC9B,CAAC,MAAwB;AACvB,eAAS,sBAAsB,EAAE,GAAG,EAAG,CAAA,CAAC;AAC/B,eAAA,YAAY,IAAI,CAAC;AAC1B,QAAE,gBAAgB;AAAA,IACpB;AAAA,IACA,CAAC,UAAU,GAAG,CAAC;AAAA,EACjB;AAEM,QAAA,2BAA2B,YAAY,MAAM;;AAC3C,UAAA,QAAOM,MAAA,QAAQ,YAAR,gBAAAA,IAAiB;AAC9B,QAAI,CAAC,MAAM;AACT;AAAA,IAAA;AAEiB,uBAAA,kBAAkB,IAAI,CAAC;AAAA,EAC5C,GAAG,EAAE;AAEC,QAAA,2BAA2B,YAAY,MAAM;AACjD,uBAAmB,IAAI;AAAA,EACzB,GAAG,EAAE;AAGL,QAAM,gBAAgB;AAAA,IACpB,CAAC,MAA8C;AACzC,UAAA,YAAY,SAAS,GAAG;AAC1B,UAAE,gBAAgB;AAClB,2BAAmB,CAAC;AACX,iBAAA,uBAAuB,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,CAAC,CAAC;AACxD,eAAA;AAAA,MAAA;AAEF,aAAA;AAAA,IACT;AAAA,IACA,CAAC,YAAY,MAAM;AAAA,EACrB;AAEA,QAAM,gBAAgB;AAAA,IACpB,CAAC,MAA8C;AAC7C,QAAE,gBAAgB;AAClB,yBAAmB,CAAC;AACpB,wBAAkB,OAAO;AACnB,YAAA,WAAW,SAAS,YAAY,aAAa;AAC1C,eAAA,UAAU,YAAY,MAAM,IAAI;AACzC,qCAAO,cAAc;AACd,aAAA;AAAA,IACT;AAAA,IACA,CAAC,SAAS,KAAK;AAAA,EACjB;AAEM,QAAA,oBAAoB,QAAQ,MAAM;AACtC,QAAI,CAAC,WAAW,WAAW,cAAc,WAAW,IAAI;AAC/C,aAAA;AAAA,IAAA;AAGT,QAAI,cAAc,WAAW,KAAK,cAAc,UAAU,GAAG;AACpD,aAAA;AAAA,IAAA;AAEF,WAAA;AAAA,EACN,GAAA,CAAC,SAAS,SAAS,aAAa,CAAC;AAEpC,MAAI,CAAC,OAAO;AACH,WAAA;AAAA,EAAA;AAGT,MAAI,CAAC,OAAO;AACV,WACG,oBAAA,MAAA,EAAW,UAAQ,GAAG,UAAQ,GAAG,gBAAc,SAAS,WAAU,qBACjE,UAAC,qBAAA,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,MAAA,oBAAC,SAAI,WAAU,iBACb,8BAAC,OAAI,EAAA,WAAU,oBAAmB,EACpC,CAAA;AAAA,MACA,oBAAC,OAAI,EAAA,WAAU,mBAAmB,CAAA;AAAA,IAAA,EACpC,CAAA,KANO,CAOT;AAAA,EAAA;AAKF,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,KAAK;AAAA,MACL,UAAQ;AAAA,MACR,UAAQ;AAAA,MACR,gBAAc;AAAA,MACd,WAAW,WAAW,MAAM,eAAe,EAAE,GAAG,GAAG,IAAI,iBAAiB,EAAE,IAAI,UAAU,gBAAgB,EAAE,IACxG,UAAU,eAAe,EAC3B,IAAI,gBAAgB,eAAe,EAAE;AAAA,MACrC,OAAO;AAAA,QACL,GAAG,6BAAM;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MAEA,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,UACX,aAAa;AAAA,UACb,cAAc;AAAA,UACd,cAAc;AAAA,UACd,WAAW;AAAA,UAEX,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW;AAAA,gBACX,OAAO;AAAA,kBACL,GAAG,6BAAM;AAAA,kBACT,aAAW,kCAAM,UAAN,mBAAa,eAAa,6BAAM,mBAAkB;AAAA,kBAC7D,aAAY,6BAAM,eAAc;AAAA,gBAClC;AAAA,gBAEC,UAAA;AAAA,kBACC,gBAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,cAAc;AAAA,sBACd,cAAc;AAAA,oBAAA;AAAA,kBAChB;AAAA,kBAEF;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,QACE,6BAAM,cACF;AAAA,wBACE,SAAS;AAAA,wBACT,eAAe;AAAA,wBACf,gBACE,KAAK,eAAe,WAAW,WAAW,KAAK,eAAe,QAAQ,aAAa;AAAA,sBAAA,IAEvF;AAAA,sBAGL,UAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACH;AAAA,cAAA;AAAA,YACF;AAAA,YACC,gBAAgB,mBACf;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,KAAK,gBAAgB,IAAI;AAAA,kBACzB,MAAM,gBAAgB;AAAA,kBACtB,WAAW,gBAAgB,gBAAgB,MAAM;AAAA,gBACnD;AAAA,gBAEC,UAAA;AAAA,cAAA;AAAA,YACH;AAAA,YAED,oBAAA,OAAA,EAAI,WAAW,mBAAmB,aAAa,wBAAyB,CAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAC3E;AAAA,IAjEK;AAAA,EAkEP;AAEJ,CAAC;ACvYD,MAAM,eAAe;AACrB,MAAM,WAAW;AAEjB,IAAI,kBAAiB,oBAAI,KAAK,GAAE,QAAQ;AACxC,IAAI,eAAe;AAEH,SAAA,aAAa,EAAE,OAAO,aAAa,GAAG,WAAW,GAAG,YAAY,MAAa;AACrF,QAAA,YAAY,OAAsB,IAAI;AAC5C,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AACxC,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,QAAQ,SAAS;AAEvB,MAAI,cAAc;AACZ,QAAA,gBAAgB,gBAAgB,KAAK;AAC3C,QAAM,kBAAkB,CAAC,GAAE,+BAAO,SAAS,mBAAkB;AAE7D,QAAM,cAAc;AAAA,IAClB,CAAC,MAAwB;AACvB,UAAI,CAAC,OAAO;AACV,eAAO,EAAE,GAAG,IAAI,GAAG,GAAG;AAAA,MAAA;AAEpB,UAAA,cAAc,KAAK,YAAY,GAAG;AAC9B,cAAA,cAAc,WAAW,QAAS,sBAAsB;AAC9D,cAAM,EAAE,MAAM,KAAK,OAAO,OAAW,IAAA;AACrC,qBAAa,EAAE,QAAQ,QAAQ,IAAI,EAAE,QAAQ,OAAO,KAAK;AACzD,YAAI,eAAe,GAAG;AACpB,qBAAW,EAAE,QAAQ,SAAS,IAAI,EAAE,QAAQ,MAAM,KAAK;AAAA,QAAA;AAAA,MACzD;AAEI,YAAA,OAAO,iBAAiB,WAAW,OAAQ;AACjD,UAAI,EAAE,MAAM,GAAG,MAAM,EAAM,IAAA;AAC3B,UAAI,YAAY;AACd,YAAI,aAAa,IAAI,KAAK,QAAQ,KAAK;AAAA,iBAC9B,UAAU;AACnB,YAAI,WAAW,IAAI,KAAK,SAAS,KAAK;AAAA,MAAA;AAEjC,aAAA,EAAE,GAAG,EAAE;AAAA,IAChB;AAAA,IACA,CAAC,OAAO,YAAY,UAAU,aAAa;AAAA,EAC7C;AAEA,QAAM,aAAa;AAAA,IACjB,CAAC,MAAwB;AACvB,UAAI,CAAC,eAAe,WAAW,YAAY,QAAQ,CAAC,OAAO;AACzD;AAAA,MAAA;AAEF,YAAM,OAAM,oBAAI,KAAK,GAAE,QAAQ;AAC3B,UAAA,MAAM,iBAAiB,KAAM;AAChB,uBAAA;AAAA,MAAA;AAEA,uBAAA;AAEjB,iBAAW,QAAQ,SAAS;AAAA,QAC1B,MAAM,eAAe;AAAA,QACrB,KAAK,eAAe;AAAA,MAAA,CACrB;AACD,YAAM,UAAU,OAAO;AAEvB,YAAM,EAAE,GAAG,MAAM,YAAY,CAAC;AAC9B,UAAI,oBAAoB;AACtB,cAAM,EAAE,GAAG,MAAM,GAAG,KAAS,IAAA;AAC7B,iBAAS,sBAAsB,EAAE,GAAG,MAAM,KAAK,OAAO,GAAG,GAAG,MAAM,KAAK,OAAO,EAAG,CAAA,CAAC;AAAA,MAAA,OAC7E;AACL,YAAI,iBAAiB;AACb,gBAAA,UAAU,WAAW,EAAE,GAAG,eAAe,MAAM,GAAG,MAAM,GAAG;AACjE,gBAAM,cAAc,MAAM,YAAY,CAAC,aAAa;AAC9C,gBAAA,aAAa,YAAY,OAAO;AACtC,gBAAM,YAAY,GAAG,WAAW,GAAG,UAAU;AAC7C,oBAAU,EAAE,OAAO,UAAU,SAAS,KAAK,WAAW;AAAA,QAAA;AAExD,iBAAS,KAAK,EAAE,GAAG,EAAG,CAAA,CAAC;AAAA,MAAA;AAEzB,qBAAe,KAAK,IAAI,eAAe,cAAc,QAAQ;AAC7D,gBAAU,UAAU,sBAAsB,MAAM,WAAW,CAAC,CAAC;AAAA,IAC/D;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAM,mBAAmB;AAAA,IACvB,CAAC,MAAwB;AACvB,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,UAAI,aAAa;AACf;AAAA,MAAA;AAEY,oBAAA;AAEV,UAAA,eAAe,KAAK,aAAa,GAAG;AAChC,cAAA,cAAc,WAAW,QAAS,sBAAsB;AAC9D,cAAM,EAAE,MAAM,KAAK,OAAO,OAAW,IAAA;AAErC,oCAAe,EAAE,QAAQ,QAAQ,IAAI,EAAE,QAAQ,OAAO,KAAK;AAC3D,YAAI,eAAe,GAAG;AACpB,kCAAa,EAAE,QAAQ,SAAS,IAAI,EAAE,QAAQ,MAAM,KAAK;AAAA,QAAA;AAAA,MAC3D;AAEF,gBAAU,UAAU,sBAAsB,MAAM,WAAW,CAAC,CAAC;AAAA,IAC/D;AAAA,IACA,CAAC,aAAa,YAAY,UAAU,UAAU;AAAA,EAChD;AAEM,QAAA,aAAa,YAAY,MAAM;AAC/B,QAAA,UAAU,YAAY,MAAM;AAC9B,2BAAqB,UAAU,OAAO;AACtC,gBAAU,UAAU;AAAA,IAAA;AAER,kBAAA;AACd,QAAI,CAAC,QAAQ,eAAe,OAAO,GAAG;AAEpC,YAAM,UAAU,OAAO;AAAA,IAAA;AAAA,EAE3B,GAAG,EAAE;AAEL,QAAM,gBAAgB;AAAA,IACpB,CAAC,MAAwB;AACvB,QAAE,eAAe;AACjB,QAAE,gBAAgB;AACZ,YAAA,OAAO,iBAAiB,WAAW,OAAQ;AACjD,UAAI,KAAK,WAAW,MAAM,KAAK,UAAU,IAAI;AAC3C;AAAA,MAAA;AAGF,YAAM,EAAE,GAAG,MAAM,YAAY,CAAC;AAC9B,UAAI,oBAAoB;AACtB,cAAM,EAAE,GAAG,MAAM,GAAG,KAAS,IAAA;AAC7B,iBAAS,eAAe,EAAE,GAAG,MAAM,KAAK,OAAO,GAAG,GAAG,MAAM,KAAK,OAAO,EAAG,CAAA,CAAC;AAC3E,cAAM,UAAU,OAAO;AAAA,MAAA,OAClB;AACL,YAAI,iBAAiB;AAEnB,mBAAS,KAAK,EAAE,GAAG,IAAI,GAAG,GAAA,CAAI,CAAC;AAAA,QAAA;AAAA,MACjC;AAAA,IAEJ;AAAA,IACA,CAAC,oBAAoB,iBAAiB,WAAW;AAAA,EACnD;AAEA,QAAM,uBAAuB;AAAA,IAC3B,CAAC,MAAwB;AACZ,iBAAA;AACF,eAAA,YAAY,KAAK,CAAC;AACL,4BAAA,MAAM,cAAc,CAAC,CAAC;AAAA,IAC9C;AAAA,IACA,CAAC,YAAY,aAAa;AAAA,EAC5B;AAEM,QAAA,mBAAmB,YAAY,MAAM;AAC9B,eAAA;AAAA,EAAA,GACV,CAAC,UAAU,CAAC;AAEf,YAAU,MAAM;AACP,WAAA;AAAA,EAAA,GACN,CAAC,UAAU,CAAC;AAEf,MAAI,CAAC,UAAU,WAAY,CAAC,YAAY,CAAC,oBAAqB;AAC5D,WAAQ,oBAAA,OAAA,EAAI,WAAW,8BAA8B,SAAS,IAAI;AAAA,EAAA;AAIlE,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,WAAW,oBAAoB,SAAS;AAAA,MACxC,WAAW,CAAC,MAAM;AAChB,6BAAqB,CAAC;AAAA,MACxB;AAAA,MACA,cAAc;AAAA,MACd,cAAc;AAAA,IAAA;AAAA,EAChB;AAEJ;AC5KO,MAAM,gBAA2B,KAAK,CAAC,EAAE,QAAQ;AAChD,QAAA,QAAQ,IAAI,CAAC;AACnB,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AAExC,QAAA;AAAA,IACJ,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,QAAQ,SAAS;AAEjB,QAAA,MAAM,+BAAO,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,YAAY;AAChD,QAAA,SAAQ,2BAAK,UAAS;AACtB,QAAA,YAAY,CAAC,GAAE,2BAAK,WAAU,IAAI,OAAO,WAAW,SAAS;AAE7D,QAAA,gBAAgB,gBAAgB,KAAK;AACrC,QAAA,cAAc,+BAAO,SAAS;AAEpC,QAAM,kBAAkB,CAAC,GAAE,+BAAO,SAAS,mBAAkB;AAE7D,QAAM,YAAY;AAAA,IAChB,CAAC,UAAkB;AACjB,eAAS,MAAM,EAAE,OAAO,OAAO,SAAU,CAAA,CAAC;AAAA,IAC5C;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEM,QAAA,wBAAwB,YAAY,CAAC,MAAwB;AACxD,aAAA,qBAAqB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AACxD,MAAE,gBAAgB;AAClB,uBAAmB,CAAC;AAAA,EACtB,GAAG,EAAE;AAEL,QAAM,kBAAkB;AAAA,IACtB,CAAC,MAA2C;AAC1C,QAAE,gBAAgB;AAClB,yBAAmB,CAAC;AAEpB,UAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO;AACrB,eAAA;AAAA,MAAA;AAGT,UAAI,UAAU;AACL,eAAA;AAAA,MAAA;AAIT,UAAI,EAAE,KAAK,WAAW,OAAO,GAAG;AAE1B,YAAA,mBAAmB,UAAU,SAAS;AACxC,oBAAU,QAAQ,KAAK;AAAA,QAAA;AAEzB,iBAAS,OAAO,EAAE,GAAG,GAAG,EAAG,CAAA,CAAC;AAC5B,iBAAS,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,MAAM,SAAS,MAAM,EAAG,CAAA,CAAC;AAChE,eAAA;AAAA,MAAA;AAGA,eAAA,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,IAAI,MAAM,EAAG,CAAA,CAAC;AACtD,YAAA,cAAc,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,GAAG,KAAK,IAAI,KAAK;AACzE,UAAI,iBAAiB;AACb,cAAA,WAAW,UAAU,EAAE,OAAO,eAAe,MAAM,KAAK,aAAa;AAC3E,YAAI,UAAU;AACZ,mBAAS,OAAO,EAAE,QAAQ,MAAM,SAAS,QAAQ,GAAG,MAAM,GAAG,MAAM,EAAG,CAAA,CAAC;AAChE,iBAAA;AAAA,QAAA;AAAA,MACT;AAGF,UAAI,SAAS,EAAE,WAAW,cAAc,SAAS;AACjD,UAAI,WAAW,IAAI;AACjB,iBAAS,SAAS;AAAA,MAAA;AAGpB;AAAA,QACE,WAAW;AAAA,UACT,OAAO,EAAE,OAAO,QAAQ,KAAK,EAAE;AAAA,UAC/B,SAAS,MAAM;AAAA,QAChB,CAAA;AAAA,MACH;AAEA,UAAI,iBAAiB;AACT,mBAAA,2CAAa,UAAS,EAAE;AAAA,MAAA;AAE3B,eAAA,kBAAkB,EAAE,CAAC;AACrB,eAAA,YAAY,IAAI,CAAC;AAC1B,YAAM,UAAU,OAAO;AAEvB,UAAI,oBAAoB;AACf,eAAA;AAAA,MAAA;AAEF,aAAA;AAAA,IACT;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAM,gBAAgB;AAAA,IACpB,CAAC,MAA2C;AAC1C,QAAE,gBAAgB;AAClB,UAAI,EAAE,KAAK,WAAW,OAAO,GAAG;AAC9B;AAAA,MAAA;AAGF,yBAAmB,CAAC;AACX,eAAA,YAAY,KAAK,CAAC;AAC3B,UAAI,oBAAoB;AACtB,cAAM,UAAU,OAAO;AAChB,eAAA;AAAA,MAAA;AAAA,IAEX;AAAA,IACA,CAAC,kBAAkB;AAAA,EACrB;AAEM,QAAA,iBAAiB,oBAAoB,CAAC,MAA2C;AACrF,QAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO;AACrB,aAAA;AAAA,IAAA;AAGT,QAAI,EAAE,KAAK,WAAW,OAAO,GAAG;AACvB,aAAA;AAAA,IAAA;AAGT,uBAAmB,CAAC;AACpB,MAAE,gBAAgB;AAElB,QAAI,oBAAoB;AACtB,eAAS,sBAAsB,EAAE,GAAG,GAAG,EAAG,CAAA,CAAC;AACpC,aAAA;AAAA,IAAA;AAGT,QAAI,iBAAiB;AACb,YAAA,UAAU,WAAW,EAAE,GAAG,eAAe,MAAM,GAAG,MAAM,GAAG;AACjE,YAAM,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,QAAQ,IAAI,GAAG,IAAI,QAAQ,KAAK,CAAC;AACtD,YAAA,YAAY,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,GAAG,IAAI,IAAI,KAAK;AACtE,gBAAU,EAAE,OAAO,eAAe,MAAM,KAAK,WAAW;AAAA,IAAA;AAG1D,QAAI,sBAAsB,MAAM;AACxB,YAAA,EAAE,WAAW;AACnB,UAAI,WAAW,GAAG;AAChB,iBAAS,KAAK,EAAE,GAAG,MAAM,SAAS,EAAA,CAAG,CAAC;AAAA,MAAA,OACjC;AACL,iBAAS,KAAK,EAAE,GAAG,GAAG,EAAG,CAAA,CAAC;AAAA,MAAA;AAAA,IAC5B;AAEK,WAAA;AAAA,KACN,GAAG;AAEN,MAAI,CAAC,OAAO;AACV,WACG,oBAAA,MAAA,EAAG,UAAQ,GAAG,WAAU,6BACvB,UAAC,oBAAA,OAAA,EAAI,WAAU,oBACb,UAAC,qBAAA,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,MAAA,oBAAC,gBAAa,OAAO,EAAE,UAAU,WAAW,GAAG,UAAU,IAAI;AAAA,MAC7D,oBAAC,OAAI,EAAA,WAAU,aAAa,CAAA;AAAA,IAAA,EAC9B,CAAA,EACF,CAAA,GACF;AAAA,EAAA;AAKF,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAQ;AAAA,MACR,WAAW,mBAAmB,SAAS,MAAM,IAAI,gBAAgB,EAAE,IACjE,QAAQ,EAAE,OAAO,cAAc,QAAQ,KAAK,cAAc,QAAQ,CAAC,IAC/D,qBACE,oBACA,iBACF,EACN;AAAA,MACA,OAAO,EAAE,GAAG,2BAAK,OAAO,OAAO,UAAU,OAAO,UAAU,MAAM;AAAA,MAChE,eAAe,CAAC,MAAM;AAChB,YAAA,YAAY,SAAS,GAAG;AAC1B,YAAE,gBAAgB;AAClB,6BAAmB,CAAC;AACX,mBAAA,uBAAuB,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,CAAC,CAAC;AACxD,iBAAA;AAAA,QAAA;AAEF,eAAA;AAAA,MACT;AAAA,MAEA,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,aAAa;AAAA,UACb,cAAc;AAAA,UACd,cAAc;AAAA,UACd,WAAW;AAAA,UAEX,UAAA,qBAAC,OAAI,EAAA,WAAU,eAAc,OAAO,EAAE,QAAQ,MAAM,cAAc,UAAU,WAAA,GAC1E,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,QAAQ,qBAAqB,KAAK;AAAA,gBACpC;AAAA,gBACA,UAAU;AAAA,cAAA;AAAA,YACZ;AAAA,aACE,MAAM;AACA,oBAAA,iBAAiB,SAAS,OAAO,2BAAK,OAAO,EAAE,GAAG,GAAG,KAAK,CAAC,KAAK;AACtE,kBAAI,mBAAmB,OAAO;AAC5B,uBAEI,qBAAA,UAAA,EAAA,UAAA;AAAA,kBAAC,oBAAA,QAAA,EAAK,WAAU,eAAe,UAAM,OAAA;AAAA,kBACpC;AAAA,gBAAA,GACH;AAAA,cAAA;AAGG,qBAAA;AAAA,YAAA,GACN;AAAA,YACF,CAACK,WAAW,aAAa,2BAAK,YAAYA,WAAW,UAAU,KAC9D;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW,kCAAkC,YAAY,gBAAgB,EAAE,KAAI,mDAAiB,OAAM,IAAI,cAAc,EAAE;AAAA,gBAC1H,aAAa,CAAC,MAAM;AAClB,oBAAE,gBAAgB;AAClB,oBAAE,eAAe;AAChB,oBAAE,cAA8B,QAAQ,SAAS,OAAO,EAAE,OAAO;AACjE,oBAAE,cAA8B,QAAQ,SAAS,OAAO,EAAE,OAAO;AAAA,gBACpE;AAAA,gBACA,WAAW,CAAC,MAAM;AAChB,oBAAE,gBAAgB;AAClB,wBAAM,MAAM,EAAE;AACd,wBAAM,SAAS,OAAO,IAAI,QAAQ,UAAU,EAAE,OAAO;AACrD,wBAAM,SAAS,OAAO,IAAI,QAAQ,UAAU,EAAE,OAAO;AACrD,wBAAM,QAAQ,KAAK,IAAI,EAAE,UAAU,MAAM,IAAI,KAAK,KAAK,IAAI,EAAE,UAAU,MAAM,IAAI;AACjF,sBAAI,OAAO;AACT;AAAA,kBAAA;AAEI,wBAAA,OAAO,IAAI,sBAAsB;AACnC,uBAAA,mDAAiB,OAAM,GAAG;AACnB,6BAAA,cAAc,IAAI,CAAC;AAAA,kBAAA,OACvB;AACL,0BAAM,kBACJ,QAAQ,EAAE,OAAO,cAAc,QAAQ,KAAK,cAAc,KAAK,GAAG,CAAC,KACnE,cAAc,WAAW,KACzB,cAAc,SAAS,MAAM;AAC/B,wBAAI,CAAC,iBAAiB;AACpB,+BAAS,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,KAAK,EAAK,GAAA,SAAS,MAAM,QAAS,CAAA,CAAC;AAAA,oBAAA;AAE9E,6BAAS,cAAc,EAAE,GAAG,UAAU,EAAE,GAAG,KAAK,QAAQ,GAAG,KAAK,KAAK,EAAG,CAAA,CAAC;AAAA,kBAAA;AAAA,gBAE7E;AAAA,gBACD,UAAA;AAAA,cAAA;AAAA,YAED;AAAA,YAEF;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW;AAAA;AAAA,gBAEPA,WAAW,aAAa,2BAAK,YAAYA,WAAW,MAAM,IAAI,iBAAiB,EAAE;AAAA,gBACjF,WAAW,cAAc,EAAE;AAAA,gBAC/B,OAAO,EAAE,QAAQ,MAAM,aAAa;AAAA,gBACpC,aAAa;AAAA,gBAEb,8BAAC,KAAE,CAAA,CAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACL,EACF,CAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAEJ,CAAC;AClRM,MAAM,iBAA4B,KAAK,CAAC,EAAE,QAAQ;AACvD,QAAM,QAAQ,GAAG,IAAI,CAAC,CAAC;AACvB,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AAExC,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,QAAQ,SAAS;AAEjB,QAAA,MAAM,+BAAO,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,YAAY;AAChD,QAAA,UAAS,2BAAK,WAAU;AAExB,QAAA,gBAAgB,gBAAgB,KAAK;AACrC,QAAA,cAAc,+BAAO,SAAS;AAEpC,QAAM,kBAAkB,CAAC,GAAE,+BAAO,SAAS,mBAAkB;AAE7D,QAAM,YAAY;AAAA,IAChB,CAAC,UAAkB;AACjB,eAAS,MAAM,EAAE,OAAO,OAAO,SAAU,CAAA,CAAC;AAAA,IAC5C;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEM,QAAA,wBAAwB,YAAY,CAAC,MAAwB;AACxD,aAAA,qBAAqB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AACxD,MAAE,gBAAgB;AAClB,uBAAmB,CAAC;AAAA,EACtB,GAAG,EAAE;AAEL,QAAM,kBAAkB;AAAA,IACtB,CAAC,MAA2C;AAC1C,QAAE,gBAAgB;AAClB,yBAAmB,CAAC;AAEpB,UAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO;AACrB,eAAA;AAAA,MAAA;AAET,UAAI,UAAU;AACL,eAAA;AAAA,MAAA;AAIT,UAAI,EAAE,KAAK,WAAW,OAAO,GAAG;AAE1B,YAAA,mBAAmB,UAAU,SAAS;AACxC,oBAAU,QAAQ,KAAK;AAAA,QAAA;AAEzB,iBAAS,OAAO,EAAE,GAAG,GAAG,EAAG,CAAA,CAAC;AAC5B,iBAAS,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,MAAM,QAAS,CAAA,CAAC;AAChE,eAAA;AAAA,MAAA;AAIA,eAAA,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAI,CAAA,CAAC;AACtD,YAAA,cAAc,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,GAAG,KAAK,IAAI,KAAK;AACzE,UAAI,iBAAiB;AACb,cAAA,WAAW,UAAU,EAAE,OAAO,eAAe,MAAM,KAAK,aAAa;AAC3E,YAAI,UAAU;AACZ,mBAAS,OAAO,EAAE,QAAQ,GAAG,QAAQ,MAAM,SAAS,MAAM,GAAG,MAAM,EAAG,CAAA,CAAC;AAChE,iBAAA;AAAA,QAAA;AAAA,MACT;AAGF,UAAI,SAAS,EAAE,WAAW,cAAc,SAAS;AACjD,UAAI,WAAW,IAAI;AACjB,iBAAS,SAAS;AAAA,MAAA;AAGpB;AAAA,QACE,WAAW;AAAA,UACT,OAAO,EAAE,OAAO,QAAQ,KAAK,EAAE;AAAA,UAC/B,SAAS,MAAM;AAAA,QAChB,CAAA;AAAA,MACH;AAEA,UAAI,iBAAiB;AACT,mBAAA,2CAAa,UAAS,EAAE;AAAA,MAAA;AAE3B,eAAA,kBAAkB,EAAE,CAAC;AACrB,eAAA,YAAY,IAAI,CAAC;AAC1B,YAAM,UAAU,OAAO;AAEvB,UAAI,oBAAoB;AACf,eAAA;AAAA,MAAA;AAEF,aAAA;AAAA,IACT;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAM,gBAAgB;AAAA,IACpB,CAAC,MAA2C;AAC1C,QAAE,gBAAgB;AAClB,UAAI,EAAE,KAAK,WAAW,OAAO,GAAG;AAC9B;AAAA,MAAA;AAGF,yBAAmB,CAAC;AACX,eAAA,YAAY,KAAK,CAAC;AAC3B,UAAI,oBAAoB;AACtB,cAAM,UAAU,OAAO;AAChB,eAAA;AAAA,MAAA;AAAA,IAEX;AAAA,IACA,CAAC,kBAAkB;AAAA,EACrB;AAEM,QAAA,iBAAiB,oBAAoB,CAAC,MAA2C;AACrF,QAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO;AACrB,aAAA;AAAA,IAAA;AAIT,QAAI,EAAE,KAAK,WAAW,OAAO,GAAG;AACvB,aAAA;AAAA,IAAA;AAGT,uBAAmB,CAAC;AACpB,MAAE,gBAAgB;AAElB,QAAI,oBAAoB;AACtB,eAAS,sBAAsB,EAAE,GAAG,GAAG,EAAG,CAAA,CAAC;AACpC,aAAA;AAAA,IAAA;AAGT,QAAI,iBAAiB;AACb,YAAA,UAAU,WAAW,EAAE,GAAG,eAAe,MAAM,GAAG,MAAM,GAAG;AACjE,YAAM,CAAC,KAAK,MAAM,IAAI,CAAC,IAAI,QAAQ,GAAG,GAAG,IAAI,QAAQ,MAAM,CAAC;AACtD,YAAA,YAAY,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,GAAG,GAAG,IAAI,MAAM;AACtE,gBAAU,EAAE,OAAO,eAAe,MAAM,KAAK,WAAW;AAAA,IAAA;AAG1D,QAAI,sBAAsB,MAAM;AACxB,YAAA,EAAE,WAAW;AACnB,UAAI,WAAW,GAAG;AAChB,iBAAS,KAAK,EAAE,GAAG,GAAG,MAAM,QAAA,CAAS,CAAC;AAAA,MAAA,OACjC;AACL,iBAAS,KAAK,EAAE,GAAG,GAAG,EAAG,CAAA,CAAC;AAAA,MAAA;AAAA,IAC5B;AAEK,WAAA;AAAA,KACN,GAAG;AAEN,QAAM,oBAAoB;AAAA,IACxB,CAAC,MAA8C;AACzC,UAAA,YAAY,SAAS,GAAG;AAC1B,UAAE,gBAAgB;AAClB,2BAAmB,CAAC;AACX,iBAAA,uBAAuB,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,CAAC,CAAC;AACxD,eAAA;AAAA,MAAA;AAEF,aAAA;AAAA,IACT;AAAA,IACA,CAAC,YAAY,MAAM;AAAA,EACrB;AAEA,MAAI,CAAC,OAAO;AACH,WAAA;AAAA,EAAA;AAIP,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAQ;AAAA,MACR,WAAW,oBAAoB,SAAS,MAAM,IAAI,gBAAgB,EAAE,IAClE,QAAQ,EAAE,OAAO,cAAc,QAAQ,KAAK,cAAc,KAAA,GAAQ,CAAC,IAC/D,sBACE,oBACA,iBACF,EACN,KAAI,2BAAK,eAAc,oBAAoB,EAAE,KAAI,2BAAK,aAAY,kBAAkB,EAAE;AAAA,MACtF,OAAO,EAAE,GAAG,2BAAK,OAAO,OAAO;AAAA,MAC/B,eAAe;AAAA,MAEf,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,aAAa;AAAA,UACb,cAAc;AAAA,UACd,cAAc;AAAA,UACd,WAAW;AAAA,UAEX,UAAA,qBAAC,OAAI,EAAA,WAAU,eAAc,OAAO,EAAE,OAAO,MAAM,aAAa,UAAU,WAAA,GACxE,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,QAAQ,sBAAsB,KAAK;AAAA,gBACrC;AAAA,gBACA,YAAY;AAAA,cAAA;AAAA,YACd;AAAA,YACC,SAAS,OAAO,2BAAK,OAAO,EAAE,GAAG,GAAG,EAAA,GAAK,CAAC,KAAK;AAAA,YAC/C,CAACA,WAAW,aAAa,2BAAK,YAAYA,WAAW,OAAO,KAC3D;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW,gCAA+B,6CAAc,OAAM,IAAI,cAAc,EAAE;AAAA,gBAClF,aAAa,CAAC,MAAM;AAClB,oBAAE,gBAAgB;AAClB,oBAAE,eAAe;AAChB,oBAAE,cAA8B,QAAQ,SAAS,OAAO,EAAE,OAAO;AACjE,oBAAE,cAA8B,QAAQ,SAAS,OAAO,EAAE,OAAO;AAAA,gBACpE;AAAA,gBACA,WAAW,CAAC,MAAM;AAChB,oBAAE,gBAAgB;AAClB,wBAAM,MAAM,EAAE;AACd,wBAAM,SAAS,OAAO,IAAI,QAAQ,UAAU,EAAE,OAAO;AACrD,wBAAM,SAAS,OAAO,IAAI,QAAQ,UAAU,EAAE,OAAO;AACrD,wBAAM,QAAQ,KAAK,IAAI,EAAE,UAAU,MAAM,IAAI,KAAK,KAAK,IAAI,EAAE,UAAU,MAAM,IAAI;AACjF,sBAAI,OAAO;AACT;AAAA,kBAAA;AAEI,wBAAA,OAAO,IAAI,sBAAsB;AACnC,uBAAA,6CAAc,OAAM,GAAG;AAChB,6BAAA,WAAW,IAAI,CAAC;AAAA,kBAAA,OACpB;AACL,0BAAM,kBACJ,QAAQ,EAAE,OAAO,cAAc,QAAQ,KAAK,cAAc,KAAK,GAAG,CAAC,KACnE,cAAc,WAAW,KACzB,cAAc,SAAS,MAAM;AAC/B,wBAAI,CAAC,iBAAiB;AACpB,+BAAS,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,KAAK,EAAK,GAAA,SAAS,MAAM,QAAS,CAAA,CAAC;AAAA,oBAAA;AAE9E,6BAAS,WAAW,EAAE,GAAG,UAAU,EAAE,GAAG,KAAK,QAAQ,GAAG,KAAK,MAAM,EAAG,CAAA,CAAC;AAAA,kBAAA;AAAA,gBAE3E;AAAA,gBACD,UAAA;AAAA,cAAA;AAAA,YAED;AAAA,YAEF;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW;AAAA;AAAA,gBAEPA,WAAW,aAAa,2BAAK,YAAYA,WAAW,MAAM,IAAI,iBAAiB,EAAE;AAAA,gBACjF,WAAW,cAAc,EAAE;AAAA,gBAC/B,OAAO,EAAE,OAAO,MAAM,YAAY;AAAA,gBAClC,aAAa;AAAA,cAAA;AAAA,YAAA;AAAA,UACd,EACH,CAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAEJ,CAAC;ACtRD,MAAM,gBAAgB;AACtB,MAAM,iBAAiB;AACvB,MAAM,iBAAiB;AACvB,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,6BAA6B;AACnC,MAAM,wBAAwB;AAC9B,MAAM,iBAAiB;AAqBvB,MAAM,WAAW,CAAC,KAAY,GAAW,GAAW,OAAe,QAAgB,UAAkB;AACnG,MAAI,YAAY;AAChB,MAAI,SAAS,GAAG,GAAG,OAAO,MAAM;AAClC;AAEA,MAAM,WAAW,CACf,KACA,GACA,GACA,OACA,QACA,OACA,YAAoB,GACpB,cAAwB,CAAA,GACxB,cACG;AACH,MAAI,WAAW;AACb,QAAI,YAAY;AAChB,QAAI,SAAS,GAAG,GAAG,OAAO,MAAM;AAAA,EAAA;AAGlC,MAAI,cAAc;AAClB,MAAI,YAAY;AAChB,MAAI,YAAY,WAAW;AACvB,MAAA,WAAW,IAAI,YAAY,GAAG,IAAI,YAAY,GAAG,QAAQ,WAAW,SAAS,SAAS;AACtF,MAAA,YAAY,EAAE;AACpB;AAGA,MAAM,uBAAuB,CAC3B,KACA,OACA,WACA,YACA,OACA,OACA,MACA,OACA,YAAoB,GACpB,cAAwB,CAAA,GACxB,cACG;AACH,QAAM,EAAE,KAAK,MAAM,QAAQ,MAAU,IAAA;AACrC,MAAI,QAAQ,MAAM,SAAS,MAAM,WAAW,MAAM,UAAU,IAAI;AAC9D;AAAA,EAAA;AAGI,QAAA,UAAU,qBAAqB,OAAO,EAAE,GAAG,KAAK,GAAG,MAAM;AACzD,QAAA,cAAc,qBAAqB,OAAO,EAAE,GAAG,QAAQ,GAAG,OAAO;AAEjE,QAAA,KAAK,QAAQ,OAAO;AACpB,QAAA,KAAK,QAAQ,MAAM;AACnB,QAAA,KAAK,YAAY,QAAQ;AACzB,QAAA,KAAK,YAAY,SAAS;AAGhC,MAAI,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,OAAO;AAChD;AAAA,EAAA;AAGO,WAAA,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,OAAO,WAAW,aAAa,SAAS;AAClF;AAEO,MAAM,mBAA8B,CAAC,EAAE,OAAO,CAAA,QAAS;AAC5D,QAAM,EAAE,MAAA,IAAU,WAAW,OAAO;AAC9B,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,QAAQ,cAAc;AACtB,QAAA,YAAY,OAA0B,IAAI;AAC1C,QAAA,WAAW,OAAe,CAAC;AAC3B,QAAA,WAAW,OAAO,KAAK;AAC7B,WAAS,UAAU;AAEb,QAAA,aAAa,YAAY,MAAM;AACnC,QAAI,CAAC,SAAS,CAAC,WAAW,WAAW,CAAC,UAAU,SAAS;AACvD;AAAA,IAAA;AAGF,UAAM,SAAS,UAAU;AACnB,UAAA,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,KAAK;AACR;AAAA,IAAA;AAGF,UAAM,YAAY,WAAW;AACvB,UAAA,MAAM,OAAO,oBAAoB;AACvC,UAAM,IAAI,UAAU;AACpB,UAAMR,KAAI,UAAU;AAGpB,QAAI,OAAO,UAAU,IAAI,OAAO,OAAO,WAAWA,KAAI,KAAK;AAClD,aAAA,MAAM,QAAQ,GAAG,CAAC;AAClB,aAAA,MAAM,SAAS,GAAGA,EAAC;AAC1B,aAAO,QAAQ,IAAI;AACnB,aAAO,SAASA,KAAI;AAAA,IAAA;AAEtB,QAAI,aAAa,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC;AACrC,QAAI,UAAU,GAAG,GAAG,GAAGA,EAAC;AAElB,UAAA,EAAE,aAAa;AACrB,UAAM,YAAY,UAAU;AAC5B,UAAM,aAAa,UAAU;AAC7B,UAAM,UAAU,MAAM;AACtB,UAAM,UAAU,MAAM;AAGtB,QAAI,KAAK;AACT,QAAI,UAAU;AACd,QAAI,KAAK,SAAS,SAAS,IAAI,SAASA,KAAI,OAAO;AACnD,QAAI,KAAK;AAGH,UAAA,gBAAgB,WAAW,aAAa;AACzB,yBAAA,KAAK,OAAO,WAAW,YAAY,GAAGA,IAAG,eAAe,gBAAgB,GAAG,CAAA,GAAI,cAAc;AAGlH,QAAI,oBAAoB;AACtB,YAAM,WAAW,IAAI,SAAS,SAAS,SAAS,kBAAkB;AAClE,2BAAqB,KAAK,OAAO,WAAW,YAAY,GAAGA,IAAG,SAAS,WAAW,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC;AAAA,IAAA;AAI7G;AACQ,YAAA,EAAE,GAAG,EAAA,IAAM;AACb,UAAA,MAAM,MAAM,MAAM,IAAI;AACxB,cAAM,MAAM,qBAAqB,OAAO,EAAE,GAAG,GAAG;AAC1C,cAAA,KAAK,IAAI,OAAO;AAChB,cAAA,KAAK,IAAI,MAAM;AACZ,iBAAA,KAAK,IAAI,IAAI,IAAI,OAAO,IAAI,QAAQ,eAAe,GAAG,CAAA,CAAE;AAAA,MAAA;AAAA,IACnE;AAIF,UAAM,EAAE,gBAAgB,aAAa,QAAY,IAAA;AAC7C,QAAA,MAAM,OAAO,gBAAgB;AACzB,YAAA,cAAc,WAAW,WAAW;AACpC,YAAA,QAAQ,UAAU,gBAAgB;AAClC,YAAA,cAAc,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AACvB,2BAAA,KAAK,OAAO,WAAW,YAAY,GAAGA,IAAG,aAAa,OAAO,KAAK,WAAW;AAAA,IAAA;AAI7F,WAAA,QAAQ,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,MAAM;AACzC,YAAM,UAAU,cAAc,IAAI,cAAc,MAAM;AAClD,UAAA;AACI,cAAA,UAAU,MAAM,YAAY,GAAG;AACrC,6BAAqB,KAAK,OAAO,WAAW,YAAY,GAAGA,IAAG,SAAS,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;AAAA,eAClF,GAAG;AAAA,MAAA;AAAA,IAEZ,CACD;AAGa,kBAAA,QAAQ,CAAC,SAAS,UAAU;AACxC,YAAM,EAAE,GAAG,MAAM,IAAI,OAAO;AAC5B,YAAM,MAAM,qBAAqB,OAAO,EAAE,GAAG,GAAG;AAC1C,YAAA,KAAK,IAAI,OAAO;AAChB,YAAA,KAAK,IAAI,MAAM;AAGjB,UAAA,KAAK,IAAI,QAAQ,KAAK,KAAK,KAAK,KAAK,IAAI,SAAS,KAAK,KAAKA,IAAG;AACjE;AAAA,MAAA;AAGF,YAAM,iBAAiB,UAAU;AACjC;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,iBAAiB,wBAAwB;AAAA,QACzC,iBAAiB,IAAI;AAAA,QACrB,CAAC;AAAA,QACD;AAAA,MACF;AAAA,IAAA,CACD;AAGD,QAAI,QAAQ;AAGZ,UAAM,UAAU,MAAM;AACtB,UAAM,UAAU,MAAM;AAGtB,aAAS,IAAI,GAAG,KAAK,SAAS,KAAK;AACjC,UAAI,QAAuB;AAC3B,UAAI,kBAAiC;AACjC,UAAA,QAAQ,EAAE,OAAO,cAAc,QAAQ,KAAK,cAAc,QAAQ,CAAC,GAAG;AAChE,gBAAA;AACR,0BAAkB,qBAAqB,8BAA8B;AAAA,MAAA;AAEnE,UAAA,SAAS,MAAM,GAAG;AACZ,gBAAA;AACR,0BAAkB,qBAAqB,8BAA8B;AAAA,MAAA;AAEvE,UAAI,CAAC,OAAO;AACV;AAAA,MAAA;AAGF,YAAM,MAAM,qBAAqB,OAAO,EAAE,GAAG,GAAG,GAAG;AAC7C,YAAA,OAAO,IAAI,OAAO;AACxB,UAAI,OAAO,IAAI,QAAQ,WAAW,OAAO,GAAG;AAC1C;AAAA,MAAA;AAEF,YAAM,WAAW,KAAK,IAAI,MAAM,OAAO;AACvC,YAAM,YAAY,KAAK,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI;AAClD,UAAI,YAAY,GAAG;AACjB,YAAI,iBAAiB;AACnB,mBAAS,KAAK,UAAU,GAAG,WAAW,SAAS,eAAe;AAAA,QAAA;AAGhE,YAAI,cAAc;AAClB,YAAI,YAAY;AAChB,YAAI,UAAU;AACV,YAAA,OAAO,UAAU,UAAU,CAAC;AAChC,YAAI,OAAO,WAAW,WAAW,UAAU,CAAC;AAC5C,YAAI,OAAO;AAAA,MAAA;AAAA,IACb;AAIF,aAAS,IAAI,GAAG,KAAK,SAAS,KAAK;AAC7B,UAAA,MAAM,cAAc,CAAC,GAAG;AAC1B;AAAA,MAAA;AAEF,UAAI,QAAuB;AAC3B,UAAI,kBAAiC;AACjC,UAAA,QAAQ,EAAE,OAAO,cAAc,QAAQ,KAAK,cAAc,QAAQ,CAAC,GAAG;AAChE,gBAAA;AACR,0BAAkB,sBAAsB,8BAA8B;AAAA,MAAA;AAEpE,UAAA,SAAS,MAAM,GAAG;AACZ,gBAAA;AACR,0BAAkB,sBAAsB,8BAA8B;AAAA,MAAA;AAExE,UAAI,CAAC,OAAO;AACV;AAAA,MAAA;AAGF,YAAM,MAAM,qBAAqB,OAAO,EAAE,GAAG,GAAG,GAAG;AAC7C,YAAA,MAAM,IAAI,MAAM;AACtB,UAAI,MAAM,IAAI,SAAS,WAAW,MAAMA,IAAG;AACzC;AAAA,MAAA;AAEF,YAAM,UAAU,KAAK,IAAI,KAAK,OAAO;AACrC,YAAM,aAAa,KAAK,IAAI,MAAM,IAAI,QAAQA,EAAC,IAAI;AACnD,UAAI,aAAa,GAAG;AAClB,YAAI,iBAAiB;AACnB,mBAAS,KAAK,GAAG,SAAS,SAAS,YAAY,eAAe;AAAA,QAAA;AAGhE,YAAI,cAAc;AAClB,YAAI,YAAY;AAChB,YAAI,UAAU;AACV,YAAA,OAAO,UAAU,GAAG,OAAO;AAC/B,YAAI,OAAO,UAAU,GAAG,UAAU,UAAU;AAC5C,YAAI,OAAO;AAAA,MAAA;AAAA,IACb;AAAA,EACF,GACC;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAGK,QAAA,qBAAqB,YAAY,MAAM;AAC3C,yBAAqB,SAAS,OAAO;AAC5B,aAAA,UAAU,sBAAsB,UAAU;AAAA,EAAA,GAClD,CAAC,UAAU,CAAC;AAGT,QAAA,eAAe,YAAY,MAAM;AAC1B,eAAA;AAAA,EAAA,GACV,CAAC,UAAU,CAAC;AAEf,YAAU,MAAM;AACK,uBAAA;AACZ,WAAA,MAAM,qBAAqB,SAAS,OAAO;AAAA,EAAA,GACjD,CAAC,kBAAkB,CAAC;AAEvB,YAAU,MAAM;AACd,UAAM,YAAY,WAAW;AAC7B,QAAI,CAAC,WAAW;AACd;AAAA,IAAA;AAEQ,cAAA,iBAAiB,UAAU,YAAY;AACjD,UAAM,KAAK,IAAI,eAAe,MAAM,YAAY;AAChD,OAAG,QAAQ,SAAS;AACpB,WAAO,MAAM;AACD,gBAAA,oBAAoB,UAAU,YAAY;AACpD,SAAG,WAAW;AAAA,IAChB;AAAA,EACC,GAAA,CAAC,YAAY,cAAc,UAAU,CAAC;AAGvC,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,eAAe;AAAA,QACf,QAAQ;AAAA,MACV;AAAA,MAEA,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAK;AAAA,UACL,WAAU;AAAA,UACV,OAAO;AAAA,YACL,eAAe;AAAA,YACf,SAAS;AAAA,UAAA;AAAA,QACX;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAEJ;AC3WO,MAAM,UAAU,MAAM;;AAC3B,QAAM,CAAC,SAAS,UAAU,IAAI,SAAyB,CAAA,CAAE;AACzD,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AACxC,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,QAAQ,cAAc;AAE5B,QAAM,CAAC,aAAa,cAAc,IAAI,SAAgC,IAAI;AAEpE,QAAA,kBAAkB,YAAY,CAAC,MAAwB;AAC3D,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAAA,EACpB,GAAG,EAAE;AAEL,QAAM,eAAe;AAAA,IACnB,CAAC,MAAqC;AACpC,UAAI,OAAO;AACT,uBAAe,WAAW,OAAO,EAAE,aAAa,CAAC;AAAA,MAAA;AAAA,IAErD;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEM,QAAA,uBAAuB,YAAY,MAAM;AAC7C,QAAI,CAAC,OAAO;AACV;AAAA,IAAA;AAEF,aAAS,OAAO,EAAE,GAAG,IAAI,GAAG,GAAA,CAAI,CAAC;AACjC,0BAAsB,MAAM;AAC1B,eAAS,OAAO,EAAE,GAAG,GAAG,GAAG,EAAA,CAAG,CAAC;AAC/B;AAAA,QACE,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,MAAM,MAAM;AAAA,UACZ,MAAM,MAAM;AAAA,QACb,CAAA;AAAA,MACH;AAAA,IAAA,CACD;AAAA,EAAA,GACA,CAAC,aAAa,CAAC;AAElB,YAAU,MAAM;AACd,QAAI,CAAC,OAAO;AACV;AAAA,IAAA;AAEF,UAAM,iBAAiB,kBAAkB,UAAU,WAAW,GAAG;AACjE,QAAI,CAAC,gBAAgB;AACnB,iBAAW,CAAA,CAAE;AACP,YAAA,SAAS,qBAAqB,CAAC;AACrC;AAAA,IAAA;AAEF,UAAM2B,WAA0B,CAAC;AACjC,UAAM,qBAA8D,CAAC;AACrE,UAAM,QAAQ,IAAI,MAAM,UAAU,UAAU,CAAC,CAAC;AAC9C,UAAM,SAAS;AAEf,QAAI,IAAI;AACG,eAAA,SAAS,MAAM,QAAQ;AAChC,UAAI,MAAM,SAAS,SAAS,MAAM,SAAS,SAAS;AAClD,cAAM,gBAAgB,qBAAqB,MAAM,UAAA,CAAW;AACtD,cAAA,gBAAgB,cAAc,QAAQ,GAAG;AAC/C,YAAI,kBAAkB,IAAI;AACxB,gBAAM,YAAY,cAAc,UAAU,GAAG,aAAa;AAC1D,gBAAM,MAAM,cAAc,UAAU,gBAAgB,CAAC;AAC/C,gBAAA,WAAW,eAAe,SAAS;AACnC,gBAAA,WAAW,IAAI,YAAY;AAC7B,cAAA,mBAAmB,QAAQ,KAAK,MAAM;AACrB,+BAAA,QAAQ,IAAI,CAAC;AAAA,UAAA;AAElC,cAAI,mBAAmB,QAAQ,EAAE,QAAQ,KAAK,MAAM;AAC/B,+BAAA,QAAQ,EAAE,QAAQ,IAAI;AAAA,UAAA;AAAA,QAC3C,OACK;AACC,gBAAA,WAAW,cAAc,YAAY;AACvCA,cAAAA,SAAQ,QAAQ,KAAK,MAAM;AAC7BA,qBAAQ,QAAQ,IAAI;AAAA,UAAA;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEF,eAAWA,QAAO;AAClB,UAAM,SAAS,qBAAqB;AAAA,EAAA,GACnC,CAAC,MAAM,WAAW,MAAM,gBAAgB,aAAa,CAAC;AAEzD,YAAU,MAAM;AACd,QAAI,CAAC,OAAO;AACV;AAAA,IAAA;AAEI,UAAA,SAAS,kBAAkB,IAAI,QAAQ;AACvC,UAAA,SAAS,kBAAkB,MAAM;AAAA,EAAA,GACtC,CAAC,QAAQ,CAAC;AAEb,YAAU,MAAM;AACd,QAAI,CAAC,OAAO;AACV;AAAA,IAAA;AAEF,mBAAe,WAAW,OAAO,WAAW,OAAO,CAAC;AAAA,EACtD,GAAG,CAAC,WAAW,SAAS,gBAAe,aAAQ,YAAR,mBAAiB,eAAc,aAAQ,YAAR,mBAAiB,WAAW,CAAC;AAEnG,YAAU,MAAM;AACd,UAAM,KAAK,WAAW;AACtB,QAAI,CAAC,IAAI;AACP;AAAA,IAAA;AAEF,WAAO,oBAAoB,EAAE;AAAA,EAAA,GAC5B,CAAC,aAAa,CAAC;AAElB,QAAM,aAA6B;AAAA,IACjC,GAAG;AAAA,IACH,GAAI,QAAQ,MAAM,SAAS,mBAAmB,MAAM,IAAI,IAAI,CAAA;AAAA,EAC9D;AAEA,MAAI,CAAC,SAAS,CAAC,MAAM,SAAS,OAAO;AAC5B,WAAA;AAAA,EAAA;AAGT,SAEI,oBAAA,UAAA,EAAA,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,OAAO,eAAe,KAAK,SAAY;AAAA,QACvC,QAAQ,gBAAgB,KAAK,SAAY;AAAA,MAC3C;AAAA,MACA,KAAK;AAAA,MACL,aAAa;AAAA,MACb,UAAU;AAAA,MAEV,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,UACX,OAAO;AAAA,YACL,OAAO,MAAM;AAAA,YACb,QAAQ,MAAM;AAAA,YACd,UAAU;AAAA,UACZ;AAAA,UAEA,UAAA;AAAA,YAAC,oBAAA,kBAAA,EAAiB,MAAM,WAAY,CAAA;AAAA,YACpC,qBAAC,SAAM,EAAA,WAAW,YAChB,UAAA;AAAA,cAAA,oBAAC,SAAM,EAAA,WAAU,YAAW,OAAO,EAAE,QAAQ,MAAM,aACjD,GAAA,UAAA,qBAAC,MAAG,EAAA,WAAU,UACZ,UAAA;AAAA,gBAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO,EAAE,UAAU,UAAU,OAAO,MAAM,aAAa,QAAQ,MAAM,aAAa;AAAA,oBAClF,SAAS;AAAA,oBAET,UAAA,qBAAC,OAAI,EAAA,WAAU,eACb,UAAA;AAAA,sBAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAW,uBAAuB,qBAAqB,cAAc;AAAA,0BACrE,OAAO,EAAE,UAAU,WAAW;AAAA,0BAC9B,YAAY,sBAAsB,IAAI;AAAA,0BACtC,UAAU,qBAAqB,IAAI;AAAA,wBAAA;AAAA,sBACrC;AAAA,sBACC,YAAY,SAAS,KACpB;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAU;AAAA,0BACV,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,0BAClC,aAAa,CAAC,MAAM;AAClB,8BAAE,eAAe;AAChB,8BAAE,cAA8B,QAAQ,SAAS,OAAO,EAAE,OAAO;AACjE,8BAAE,cAA8B,QAAQ,SAAS,OAAO,EAAE,OAAO;AAAA,0BACpE;AAAA,0BACA,WAAW,CAAC,MAAM;AAChB,8BAAE,gBAAgB;AAClB,kCAAM,MAAM,EAAE;AACd,kCAAM,SAAS,OAAO,IAAI,QAAQ,UAAU,EAAE,OAAO;AACrD,kCAAM,SAAS,OAAO,IAAI,QAAQ,UAAU,EAAE,OAAO;AACrD,kCAAM,QAAQ,KAAK,IAAI,EAAE,UAAU,MAAM,IAAI,KAAK,KAAK,IAAI,EAAE,UAAU,MAAM,IAAI;AACjF,gCAAI,OAAO;AACT;AAAA,4BAAA;AAEI,kCAAA,OAAO,IAAI,sBAAsB;AAC9B,qCAAA,uBAAuB,EAAE,GAAG,KAAK,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC;AAAA,0BACnE;AAAA,0BACD,UAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAED,EAEJ,CAAA;AAAA,kBAAA;AAAA,gBACF;AAAA,gBACA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO,EAAE,SAAO,gDAAa,aAAb,mBAAuB,SAAQ,EAAE;AAAA,kBAAA;AAAA,gBAClD;AAAA,iBACA,sDAAa,OAAb,mBAAiB,QAAjB,4BAAuB,CAAC,MAAO,oBAAA,eAAA,EAAc,KAAW,CAAG;AAAA,gBAC5D;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO,EAAE,QAAO,gDAAa,aAAb,mBAAuB,MAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAC9C,EAAA,CACH,EACF,CAAA;AAAA,kCAEC,SAAM,EAAA,WAAU,0BACf,UAAC,qBAAA,MAAA,EAAG,WAAU,UACZ,UAAA;AAAA,gBAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW;AAAA,oBACX,OAAO,EAAE,UAAQ,gDAAa,aAAb,mBAAuB,QAAO,EAAE;AAAA,kBAAA;AAAA,gBAClD;AAAA,gBACD,oBAAC,MAAG,EAAA,WAAU,mCAAmC,CAAA;AAAA,iBAChD,gDAAa,OAAb,mBAAiB,IAAI,CAAC,0BAAO,MAAG,EAAA,WAAU,mCAAwC,GAAA,CAAG;AAAA,gBACtF,oBAAC,MAAG,EAAA,WAAW,0DAA2D,CAAA;AAAA,cAAA,EAAA,CAC5E,EACF,CAAA;AAAA,cAEA,oBAAC,WAAM,WAAU,sBACd,2DAAa,0BAAI,IAAI,CAAC,MAAM;;AAEzB,uBAAA,qBAAC,QAAW,WAAW,UAAU,IAAI,MAAM,IAAI,gBAAgB,YAAY,IACzE,UAAA;AAAA,kBAAA,oBAAC,kBAAe,GAAM;AAAA,kBACtB,oBAAC,MAAG,EAAA,WAAU,iEAAiE,CAAA;AAAA,mBAC9ExB,MAAA,2CAAa,OAAb,gBAAAA,IAAiB,IAAI,CAAC,0BAAO,MAAa,EAAA,GAAM,EAAT,GAAA,CAAe;AAAA,kBACvD,oBAAC,MAAG,EAAA,WAAU,kEAAkE,CAAA;AAAA,gBAAA,EAAA,GAJzE,CAKT;AAAA,cAAA,GAGN,CAAA;AAAA,YAAA,EACF,CAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA,GAEJ;AAEJ;ACrOO,MAAM,aAAa,CAAC,EAAE,YAA6B;;AACxD,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AAC9C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AACvC,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,CAAC;AACtD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAC1C,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,EAAA,IACE;AACJ,QAAM,QAAQ,SAAS;AACjB,QAAA,QAAQ,OAA8B,IAAI;AAEhD,QAAM,UAAU,SAAS,MAAM,KAAK,KAAK,IAAI,QAAQ;AACrD,QAAM,OAAO,+BAAO,QAAQ,UAAU,EAAE,YAAY;AACpD,QAAM,sBAAqB,oCAAO,UAAU,cAAjB,mBAA4B;AACvD,QAAM,cAAc,qBAAqB,IAAI,kBAAkB,IAAI;AACnE,QAAM,gBAAgB,eAAe,OAAO,IAAI,WAAW,IAAI;AAC/D,YAAU,MAAM;;AACd,QAAI,CAAC,OAAO;AACV;AAAA,IAAA;AAEE,QAAA,UAAQA,MAAA,MAAM,QAAQ,UAAU,EAAE,YAAY,SAAA,CAAU,MAAhD,gBAAAA,IAAmD,UAAS;AAExE,YAAQ,MAAM,mBAAmB,EAAE,OAAO,UAAU,MAAM,EAAE,GAAG,MAAM,MAAA,GAAS,YAAY,OAAO;AACjG,mBAAe,QAAS,QAAQ;AAChC,cAAU,KAAe;AAAA,EAAA,GACxB,CAAC,SAAS,KAAK,CAAC;AAEnB,QAAM,YAAY;AAAA,IAChB,CAAC,UAAkB;AACjB,UAAI,WAAW,OAAO;AACpB,iBAAS,MAAM,EAAE,MAAM,CAAC,CAAC;AAAA,MAAA;AAElB,eAAA,kBAAkB,EAAE,CAAC;AAC9B,YAAM,UAAU,OAAO;AAAA,IACzB;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,YAAU,MAAM;AACd,UAAM,WAAW,IAAI,eAAe,CAAC,YAAY;AAC/C,cAAQ,QAAQ,YAAY;AAAA,IAAA,CAC7B;AACD,QAAI,eAAe,SAAS;AACjB,eAAA,QAAQ,eAAe,OAAO;AAAA,IAAA;AAEzC,WAAO,MAAM;AACX,eAAS,WAAW;AAAA,IACtB;AAAA,EACF,GAAG,EAAE;AAEC,QAAA,SAAS,+BAAO,UAAU;AAChC,QAAM,cAAa,iCAAQ,uBAAsB,CAAC;AAE5C,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,MACE,gBAAgB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,+BAAO,SAAS;AAAA,EAAA,CAC5B;AAED,QAAM,aAAa,eAAe;AAE5B,QAAA,cAAc,YAAY,CAAC,MAAiD;AAChF,aAAS,aAAa,EAAE,cAAc,KAAK,CAAC;AAC1B,sBAAA,EAAE,cAAc,cAAc;AAAA,EAClD,GAAG,EAAE;AAEC,QAAA,eAAe,YAAY,CAAC,MAAiD;AAC/D,sBAAA,EAAE,cAAc,cAAc;AAAA,EAClD,GAAG,EAAE;AAEC,QAAA,eAAe,YAAY,MAAM;AACrC,QAAI,CAAC,MAAM,WAAW,CAAC,eAAe,SAAS;AAC7C;AAAA,IAAA;AAEF,UAAM,QAAQ,MAAM,SAAS,GAAG,eAAe,QAAQ,YAAY;AAC7D,UAAA,QAAQ,aAAa,eAAe,QAAQ;AAC5C,UAAA,QAAQ,YAAY,eAAe,QAAQ;AAAA,EACnD,GAAG,EAAE;AAEL,QAAM,cAAc;AAAA,IAClB,CAAC,MAA6C;AACxC,UAAA,CAAC,cAAc,CAAC,OAAO;AACzB;AAAA,MAAA;AAEF,mBAAa,IAAI;AACR,eAAA,kBAAkB,OAAO,CAAC;AAC7B,YAAA,SAAS,cAAc,EAAE;AAAA,IACjC;AAAA,IACA,CAAC,YAAY,SAAS,KAAK;AAAA,EAC7B;AAEmB;AAAA,IACjB,CAAC,MAA6C;AAC5C,mBAAa,KAAK;AAClB,UAAI,EAAE,cAAc,MAAO,WAAW,GAAG,GAAG;AACnC,eAAA;AAAA,MAAA,OACF;AACL,YAAI,aAAa;AACL,oBAAA,EAAE,cAAc,KAAK;AAAA,QAAA;AAAA,MACjC;AAAA,IAEJ;AAAA,IACA,CAAC,aAAa,SAAS;AAAA,EAAA;AAGzB,QAAM,gBAAgB;AAAA,IACpB,CAAC,MAAgD;AAC3C,UAAA,EAAE,WAAW,CAAC,OAAO;AAChB,eAAA;AAAA,MAAA;AAET,YAAM,QAAQ,EAAE;AAGZ,UAAA,4BAA4B,GAAG,SAAS,GAAG;AACpC,iBAAA,aAAa,MAAM,KAAK,CAAC;AAC3B,eAAA;AAAA,MAAA;AAGT,cAAQ,EAAE,KAAK;AAAA,QACb,KAAK;AACH,YAAE,eAAe;AACjB,cAAI,gBAAgB,QAAQ;AACpB,kBAAA,SAAS,gBAAgB,QAAQ;AACvC,kBAAM,SAAS,iCAAQ;AAEvB,gBAAI,QAAQ;AACV,oBAAM,EAAE,OAAO,UAAU,gBAAgB,UAAU,IAAI,kBAAkB,MAAM;AACtE,uBAAA,aAAa,QAAQ,CAAC;AAC/B,yBAAW,MAAM;AACf,oBAAI,eAAe,SAAS;AAC1B,wBAAM,eAAe,OAAO;AACb,iCAAA,QAAQ,kBAAkB,WAAW,SAAS;AAAA,gBAAA;AAAA,iBAE9D,CAAC;AACG,qBAAA;AAAA,YAAA,OACF;AAEL,oBAAM,IAAI,MAAM,OAAO,EAAE,MAAM,EAAE,CAAC,OAAO,GAAG,EAAE,OAAO,OAAO,MAAA,EAAW,GAAA,SAAS,MAAM;AACtF,uBAAS,YAAY,EAAE,MAAO,CAAA,CAAC;AACtB,uBAAA,kBAAkB,EAAE,CAAC;AACrB,uBAAA,aAAa,EAAE,CAAC;AAAA,YAAA;AAAA,UAC3B;AAEF;AAAA,QACF,KAAK;AACC,cAAA,cAAc,CAAwD,GAAG;AACpE,mBAAA;AAAA,UAAA;AAET;AAAA,QACF,KAAK;AACC,cAAA,gBAAgB,CAAwD,GAAG;AACtE,mBAAA;AAAA,UAAA;AAET;AAAA,QACF,KAAK,SAAS;AACZ,cAAI,gBAAgB,QAAQ;AACpB,kBAAA,SAAS,gBAAgB,QAAQ;AACvC,gBAAI,iCAAQ,YAAY;AACtB,oBAAM,EAAE,OAAO,UAAU,gBAAgB,UAAU,IAAI,kBAAkB,MAAM;AACtE,uBAAA,aAAa,QAAQ,CAAC;AAC/B,yBAAW,MAAM;AACf,oBAAI,eAAe,SAAS;AAC1B,wBAAM,eAAe,OAAO;AACb,iCAAA,QAAQ,kBAAkB,WAAW,SAAS;AAAA,gBAAA;AAAA,iBAE9D,CAAC;AACJ,gBAAE,eAAe;AACV,qBAAA;AAAA,YAAA;AAAA,UACT;AAGF,cAAI,EAAE,QAAQ;AACZ,+BAAmB,OAAO,IAAI;AAAA,UAAA,OACzB;AACL,sBAAU,MAAM,KAAK;AACZ,qBAAA,aAAa,EAAE,CAAC;AACzB;AAAA,cACE,KAAK;AAAA,gBACH,SAAS,MAAM;AAAA,gBACf,SAAS,MAAM;AAAA,gBACf,QAAQ;AAAA,gBACR,QAAQ;AAAA,cACT,CAAA;AAAA,YACH;AACA,cAAE,eAAe;AACV,mBAAA;AAAA,UAAA;AAET;AAAA,QAAA;AAAA,QAEF,KAAK,UAAU;AACb,gBAAM,QAAQ;AACL,mBAAA,aAAa,MAAM,CAAC;AACpB,mBAAA,kBAAkB,EAAE,CAAC;AAC9B,YAAE,eAAe;AACjB,gBAAM,UAAU,OAAO;AAEvB;AAAA,QAAA;AAAA,QAEF,KAAK;AACC,cAAA,EAAE,WAAW,EAAE,SAAS;AACnB,mBAAA;AAAA,UAAA;AAAA,QAEX,KAAK;AACC,cAAA,EAAE,WAAW,EAAE,SAAS;AACnB,mBAAA;AAAA,UAAA;AAET;AAAA,QACF,KAAK;AACC,cAAA,EAAE,WAAW,EAAE,SAAS;AACnB,mBAAA;AAAA,UAAA;AAET;AAAA,MAAA;AAGJ,YAAMyB,QAAO,MAAM,QAAQ,UAAU,EAAE,YAAY,UAAU;AAC7D,UAAIpB,WAAW,aAAaoB,+BAAM,YAAYpB,WAAW,KAAK,GAAG;AAC/D,gBAAQ,KAAK,sCAAsC;AACnD,UAAE,eAAe;AAAA,MAAA;AAEN,mBAAA;AACN,aAAA;AAAA,IACT;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAM,wBAAwB;AAAA,IAC5B,CAAC,GAAqB,MAAc;AAClC,QAAE,eAAe;AACjB,QAAE,gBAAgB;AACZ,YAAA,SAAS,gBAAgB,CAAC;AAChC,UAAI,OAAO,YAAY;AACrB,cAAM,EAAE,OAAO,UAAU,gBAAgB,UAAU,IAAI,kBAAkB,MAAM;AAC/E,kBAAU,QAAQ;AACT,iBAAA,aAAa,QAAQ,CAAC;AAC/B,mBAAW,MAAM;AACf,cAAI,eAAe,SAAS;AAC1B,kBAAM,eAAe,OAAO;AACb,2BAAA,QAAQ,kBAAkB,WAAW,SAAS;AAAA,UAAA;AAAA,WAE9D,CAAC;AAAA,MAAA;AAAA,IAER;AAAA,IACA,CAAC,iBAAiB,mBAAmB,WAAW,QAAQ;AAAA,EAC1D;AAEA,QAAM,QAA6B,QAAQ,CAAK,IAAA,EAAE,YAAY,SAAS;AACvE,MAAI,CAAC,OAAO;AACV,WACG,qBAAA,SAAA,EAAM,WAAU,4BAA2B,OAC1C,UAAA;AAAA,MAAC,oBAAA,OAAA,EAAI,WAAU,uBAAuB,CAAA;AAAA,MACrC,oBAAA,OAAA,EAAI,WAAU,SAAQ,UAAE,MAAA;AAAA,0BACxB,OAAI,EAAA,WAAU,+BACb,UAAA,oBAAC,cAAS,EACZ,CAAA;AAAA,IAAA,GACF;AAAA,EAAA;AAGJ,QAAM,iBAAiB,MAAM;;AAC3B,QAAI,CAAC,aAAa,OAAO,aAAa,aAAa;AAC1C,aAAA;AAAA,IAAA;AAEL,QAAA,eAAe,YAAY,SAAS,eAAe;AAC9C,aAAA;AAAA,IAAA;AAGH,UAAA,QAAOL,MAAA,eAAe,YAAf,gBAAAA,IAAwB;AACrC,QAAI,CAAC,MAAM;AACF,aAAA;AAAA,IAAA;AAGT,UAAM,MAAM,KAAK;AACjB,UAAM,OAAO,KAAK;AAEX,WAAA;AAAA,MAEF,qBAAA,UAAA,EAAA,UAAA;AAAA,QACC,sBAAA,gBAAgB,WAAW,MAC1B,CAAC,iBAAkB,cAAc,SAAS,MAAM,cAAc,SAAS,OACtE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,qBAAqB;AAAA,YACrB;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,QAEH,gBAAgB,SAAS,KAAK,SAAS,MAAM,MAC5C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,mBAAmB;AAAA,UAAA;AAAA,QAAA;AAAA,MACrB,GAEJ;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAGE,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,iBAAe,MAAM;AAAA,MACrB,cAAY,iBAAiB,OAAO,SAAS;AAAA,MAC7C;AAAA,MAEA,UAAA;AAAA,QAAA,oBAAC,cAAa,EAAA,OAAO,EAAE,UAAU,YAAY,MAAM,GAAG,KAAK,GAAG,QAAQ,EAAE,GAAG,UAAU,IAAI;AAAA,4BACxF,OAAI,EAAA,WAAU,wBAAwB,UAAiB,iBAAA,OAAO,gBAAgB,SAAQ;AAAA,QACtF,oBAAA,OAAA,EAAI,WAAU,SAAQ,UAAE,MAAA;AAAA,QACzB,qBAAC,OAAI,EAAA,WAAU,+BACb,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,KAAK;AAAA,cACL,OAAO;AAAA,gBACL,SAAQ,oBAAe,YAAf,mBAAwB;AAAA,gBAChC,OAAO;AAAA,cACT;AAAA,cAEE,WAAM,6BAAA,mBAAkB,OAAQ,YAAY,SAAS,IAAI;AAAA,YAAA;AAAA,UAC7D;AAAA,UACA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,iBAAe,MAAM;AAAA,cACrB,aAAU;AAAA,cACV,MAAM;AAAA,cACN,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,OAAO;AAAA,cAIP,UAAU,iBAAiB;AAAA,cAC3B,SAAS;AAAA,cACT,SAAS;AAAA,cACT,UAAU;AAAA,cACV,SAAS,CAAC,MAAM;AACd,kBAAE,gBAAgB;AAAA,cACpB;AAAA,cACA,WAAW;AAAA,cACX,SAAS;AAAA,cACT,UAAU;AAAA,cACV,cAAc,CAAC,MAAM;AACV,yBAAA,kBAAkB,IAAI,CAAC;AAAA,cAClC;AAAA,cACA,cAAc,CAAC,MAAM;AACV,yBAAA,kBAAkB,KAAK,CAAC;AAAA,cAAA;AAAA,YACnC;AAAA,UACD;AAAA,UACA,eAAe;AAAA,QAAA,EAClB,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF;AAEJ;ACpYO,MAAM,OAAO,CAAC,EAAE,OAAO,OAAO,IAAI,eAA0B;AAE/D,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAa;AAAA,MACb,eAAc;AAAA,MACd,gBAAe;AAAA,MACf;AAAA,MACA,WAAU;AAAA,MAET;AAAA,IAAA;AAAA,EACH;AAEJ;AC5Ba,MAAA,aAAa,CAAC,EAAE,OAAO,QAAQ,QAAQ,OAAO,SAAoB;AAE3E,SAAA,qBAAC,MAAK,EAAA,OAAc,MAClB,UAAA;AAAA,IAAA,oBAAC,UAAK,QAAO,QAAO,GAAE,iBAAgB,MAAM,OAAO;AAAA,IAClD,oBAAA,QAAA,EAAK,GAAE,8CAA6C,MAAM,OAAO;AAAA,IACjE,oBAAA,QAAA,EAAK,GAAE,gBAAe,MAAM,MAAO,CAAA;AAAA,EAAA,GACtC;AAEJ;ACRa,MAAA,YAAY,CAAC,EAAE,OAAO,QAAQ,QAAQ,OAAO,SAAoB;AAE1E,SAAA,qBAAC,MAAK,EAAA,OAAc,MAClB,UAAA;AAAA,IAAA,oBAAC,UAAK,QAAO,QAAO,GAAE,iBAAgB,MAAM,OAAO;AAAA,IAClD,oBAAA,QAAA,EAAK,GAAE,gBAAe,MAAM,OAAO;AAAA,IACnC,oBAAA,QAAA,EAAK,GAAE,cAAa,MAAM,MAAO,CAAA;AAAA,EAAA,GACpC;AAEJ;ACAO,MAAM,YAAY,MAAM;AAC7B,QAAM,EAAE,OAAO,aAAa,WAAW,OAAO;AACxC,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,EAAA,IACb;AACJ,QAAM,QAAQ,SAAS;AAEjB,QAAA,eAAe,cAAc,iBAAiB;AACpD,YAAU,MAAM;AACV,QAAA,CAAC,gBAAgB,CAAC,OAAO;AAC3B;AAAA,IAAA;AAEI,UAAA,QAAQ,IAAI,YAAY;AAC1B,QAAA,OAAO,UAAU,aAAa;AAChC;AAAA,IAAA;AAEU,gBAAA,OAAO,WAAW,SAAS,KAAK;AAAA,EAAA,GAC3C,CAAC,aAAa,mBAAmB,qBAAqB,aAAa,OAAO,UAAU,CAAC;AAElF,QAAA,sBAAsB,YAAY,CAAC,MAAwB;AACzD,UAAA,QAAQ,EAAE,cAAc;AACvB,oCAAA,cAAa,WAAW,MAAM,KAAK;AAAA,EAC5C,GAAG,EAAE;AAEC,QAAA,oBAAoB,YAAY,MAAM;AACjC,aAAA,OAAO,CAAC,CAAC;AAAA,EACpB,GAAG,EAAE;AAEC,QAAA,eAAe,YAAY,CAAC,MAA8C;AAC9E,aAAS,eAAe,EAAE,cAAc,KAAK,CAAC;AAAA,EAChD,GAAG,EAAE;AAEL,QAAM,gBAAgB;AAAA,IACpB,CAAC,MAAgD;AAC3C,UAAA,EAAE,QAAQ,UAAU;AACtB,cAAM,KAAK,uCAAW;AACtB,YAAI,IAAI;AACN,gBAAM,EAAE;AAAA,QAAA;AAED,iBAAA,eAAe,MAAS,CAAC;AAAA,MAAA;AAEpC,UAAI,EAAE,QAAQ,QAAQ,EAAE,WAAW,EAAE,UAAU;AAC7C,UAAE,eAAe;AACV,eAAA;AAAA,MAAA;AAEL,UAAA,EAAE,QAAQ,SAAS;AACrB,iBAAS,OAAO,EAAE,WAAW,KAAK,CAAC,CAAC;AACpC,UAAE,eAAe;AACV,eAAA;AAAA,MAAA;AAEF,aAAA;AAAA,IACT;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEM,QAAA,2BAA2B,YAAY,MAAM;AACxC,aAAA,uBAAuB,CAAC,mBAAmB,CAAC;AAAA,EAAA,GACpD,CAAC,mBAAmB,CAAC;AAElB,QAAA,mBAAmB,YAAY,MAAM;AAChC,aAAA,eAAe,CAAC,WAAW,CAAC;AAAA,EAAA,GACpC,CAAC,WAAW,CAAC;AAEV,QAAA,eAAe,QAAQ,MAAM;AACjC,QAAI,CAAC,eAAe;AACX,aAAA;AAAA,IAAA;AAEL,QAAA,kBAAkB,aAAa,GAAG;AAC7B,aAAA;AAAA,IAAA;AAET,UAAM,EAAE,QAAQ,QAAQ,MAAM,KAAS,IAAA;AAChC,WAAA,EAAE,WAAW,QAAQ,WAAW;AAAA,EAAA,GACtC,CAAC,aAAa,CAAC;AAEZ,QAAA,iBAAiB,QAAQ,MAAM;AAC/B,QAAA,CAAC,iBAAiB,CAAC,cAAc;AAC5B,aAAA;AAAA,IAAA;AAET,UAAM,EAAE,QAAQ,QAAQ,MAAM,KAAS,IAAA;AACvC,UAAM,UAAU,GAAG,IAAI,KAAK,IAAI,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,QAAQ,IAAI,CAAC,CAAC;AAC5E,UAAM,cAAc,GAAG,IAAI,KAAK,IAAI,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,QAAQ,IAAI,CAAC,CAAC;AACzE,WAAA,GAAG,OAAO,IAAI,WAAW;AAAA,EAAA,GAC/B,CAAC,eAAe,YAAY,CAAC;AAE1B,QAAA,mBAAmB,YAAY,MAAM;AACzC,QAAI,aAAa;AAEN,eAAA,eAAe,MAAS,CAAC;AAAA,IAAA,WACzB,iBAAiB,cAAc;AAExC,YAAM,EAAE,QAAQ,QAAQ,MAAM,KAAS,IAAA;AACvC;AAAA,QACE,eAAe;AAAA,UACb,QAAQ,KAAK,IAAI,QAAQ,IAAI;AAAA,UAC7B,QAAQ,KAAK,IAAI,QAAQ,IAAI;AAAA,UAC7B,MAAM,KAAK,IAAI,QAAQ,IAAI;AAAA,UAC3B,MAAM,KAAK,IAAI,QAAQ,IAAI;AAAA,QAC5B,CAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAED,GAAA,CAAC,aAAa,eAAe,YAAY,CAAC;AAEvC,QAAA,mBAAmB,QAAQ,MAAM;AACrC,QAAI,CAAC,aAAa;AACT,aAAA;AAAA,IAAA;AAET,UAAM,EAAE,QAAQ,QAAQ,MAAM,KAAS,IAAA;AACjC,UAAA,UAAU,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;AACtC,UAAA,cAAc,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC;AACrC,WAAA,GAAG,OAAO,IAAI,WAAW;AAAA,EAAA,GAC/B,CAAC,WAAW,CAAC;AAEV,QAAA,mBAAmB,YAAY,MAAM;AAChC,aAAA,eAAe,MAAS,CAAC;AAClC,UAAM,UAAU,OAAO;AAAA,EAAA,GACtB,CAAC,SAAS,CAAC;AAEV,MAAA,OAAO,gBAAgB,aAAa;AAC/B,WAAA;AAAA,EAAA;AAEL,MAAA,QAAQ,YAAY,MAAM;AACrB,WAAA;AAAA,EAAA;AAGP,SAAA,qBAAC,WAAM,WAAW,iBAAiB,cAAc,SAAS,IAAI,oBAAoB,EAAE,IAClF,UAAA;AAAA,IAAA,qBAAC,OAAI,EAAA,WAAU,sBAAqB,SAAS,qBAC1C,UAAA;AAAA,MAAc,cAAA,WAAW,IAAI,IAAI,oBAAoB;AAAA,MAAE;AAAA,MAAI,cAAc;AAAA,IAAA,GAC5E;AAAA,IACC,oBAAA,OAAA,EAAI,WAAU,sBAAqB,SAAS,mBAC3C,UAAA,oBAAC,YAAW,EAAA,OAAO,EAAE,eAAe,UAAU,YAAY,MAAA,EAAS,CAAA,GACrE;AAAA,IACA,qBAAC,OAAI,EAAA,WAAU,2BACb,UAAA;AAAA,MAAC,qBAAA,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,QAAC,oBAAA,QAAA,EAAK,WAAU,wBAAwB,UAAY,aAAA;AAAA,QACnD,eAAe,oBAAC,QAAK,EAAA,WAAU,wBAAuB,UAAO,UAAA,CAAA;AAAA,MAAA,GAChE;AAAA,MACA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,UACV,WAAW;AAAA,UACX,aAAY;AAAA,UACZ,OAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IACP,GACH;AAAA,IACA,qBAAC,OAAI,EAAA,WAAU,qBACZ,UAAA;AAAA,MACC,eAAA,oBAAC,OAAI,EAAA,WAAU,oCACb,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS;AAAA,UACT,OAAO,iBAAiB,gBAAgB;AAAA,UACzC,UAAA;AAAA,YAAA;AAAA,YACK;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,GAER;AAAA,MAED,CAAC,eAAe,gBACf,oBAAC,SAAI,WAAU,oCACb,UAAC,qBAAA,QAAA,EAAK,SAAS,kBAAkB,OAAO,mBAAmB,cAAc,IAAI,UAAA;AAAA,QAAA;AAAA,QACvE;AAAA,MAAA,EAAA,CACN,EACF,CAAA;AAAA,MAEF,oBAAC,OAAI,EAAA,WAAU,4CACb,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,GAAG,sBAAsB,wBAAwB,EAAE;AAAA,UAC9D,SAAS;AAAA,UACT,OAAO;AAAA,UACR,UAAA;AAAA,QAAA;AAAA,MAAA,GAGH;AAAA,MACA,oBAAC,OAAI,EAAA,WAAU,oCACb,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,GAAG,cAAc,wBAAwB,EAAE;AAAA,UACtD,SAAS;AAAA,UACT,OAAO;AAAA,UACR,UAAA;AAAA,QAAA;AAAA,MAAA,EAGH,CAAA;AAAA,IAAA,GACF;AAAA,IACC,oBAAA,KAAA,EAAE,WAAU,mBAAkB,SAAS,kBACtC,UAAC,oBAAA,WAAA,EAAU,OAAO,EAAE,eAAe,YAAY,EACjD,CAAA;AAAA,EAAA,GACF;AAEJ;ACnLa,MAAA,iBAAiB,MAAM,UAA8B;AACrD,MAAA,cAAc,MAAM,OAA2B,IAAI;AACnD,MAAA,iBAAiB,MAAM,UAA8B;AACrD,MAAA,cAAc,MAAM,OAA2B,IAAI;AAEzD,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU,CAAC;AAAA,EACX;AAAA,EACA;AAAA,EACA,MAAM;AACR,GAAU;;AACR,QAAM,EAAE,aAAa,iBAAiB,MAAM,OAAO,YAAY;AACzD,QAAA,UAAU,OAAuB,IAAI;AACrC,QAAA,WAAW,OAAuB,IAAI;AACtC,QAAA,UAAU,OAAuB,IAAI;AACrC,QAAA,iBAAiB,OAA4B,IAAI;AACjD,QAAA,YAAY,OAA4B,IAAI;AAC5C,QAAA,iBAAiB,OAA4B,IAAI;AACjD,QAAA,aAAa,OAAuB,IAAI;AAE9C,QAAM,mBAAmB,YAAY;AACrC,QAAM,WAAW,mBAAmB;AACpC,QAAM,mBAAmB,YAAY;AACrC,QAAM,WAAW,mBAAmB;AAE9B,QAAA,eAAe,QAAQ,EAAE;AAC/B,QAAM,OAAO,eAAe;AACtB,QAAA,EAAE,aAAa;AAErB,QAAM,CAAC,OAAO,IAAI,SAAiB,MAAM;AACvC,QAAI,WAAW;AAEb,UAAI,CAAC,SAAS,mBAAmB,IAAI,SAAS,GAAG;AAC/C,iBAAS,mBAAmB,IAAI,WAAW,EAAE,SAAS,SAAS;AAAA,MAAA;AAE1D,aAAA,SAAS,mBAAmB,IAAI,SAAS;AAAA,IAAA;AAGlD,WAAO,EAAE,SAAS;AAAA,EAAA,CACnB;AAGK,QAAA,gBAAgB,OAAqB,IAAI;AAE/C,QAAM,CAAC,YAAY,IAAI,SAAoB,MAAM;;AAC/C,QAAI,CAAC,WAAW;AACd,kBAAY,QAAQ,OAAO;AACnB,cAAA,MAAM,6DAA6D,SAAS;AAAA,IAAA;AAEtF,UAAM,EAAE,QAAQ,aAAa,SAAS,QAAY,IAAA;AAC5C,UAAA,QAAQ,IAAI,MAAM;AAAA,MACtB;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IAAA,CACD;AACD,UAAM,KAAK;AACF,aAAA,eAAe,SAAS,IAAI;AAErC,UAAM,WAAW,YAAY;AACpB,KAAAA,MAAA,SAAA,WAAA,gBAAAA,IAAA,eAAS,EAAE;AAEpB,UAAM,aAAa;AACnB,kBAAc,UAAU;AAExB,UAAMO,SAAmB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,MACvB,WAAW;AAAA,MACX,eAAe,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,IAAI,MAAM,GAAG;AAAA,MAC1D,oBAAoB;AAAA,MACpB,qBAAqB;AAAA,MACrB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY,EAAE,GAAG,GAAG,GAAG,GAAG,QAAQ,GAAG,OAAO,EAAE;AAAA,MAC9C,UAAU;AAAA,MACV,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,eAAe,CAAC;AAAA,MAChB,mBAAmB;AAAA,MACnB,qBAAqB;AAAA,MACrB,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,qBAAqB,EAAE,GAAG,IAAI,GAAG,GAAG;AAAA,MACpC,aAAa,eAAe;AAAA,MAC5B,SAAS,WAAW;AAAA,MACpB,SAAS,WAAW;AAAA,MACpB,mBAAmB,CAAC,IAAI,IAAI,EAAE;AAAA,MAC9B,mBAAmB,CAAC,IAAI,IAAI,EAAE;AAAA,MAC9B,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,MAAM;AAAA,IACR;AACOA,WAAAA;AAAAA,EAAA,CACR;AAIK,QAAA,CAAC,OAAO,QAAQ,IAAI;AAAA,IACxBmB;AAAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AAEA,YAAU,MAAM;AACH,eAAA;AAAA,EACb,GAAG,EAAE;AAEC,QAAA,CAAC,aAAa,cAAc,IAAI,UAAS,mCAAS,gBAAe,oBAAoB,YAAY,CAAC;AAClG,QAAA,CAAC,YAAY,aAAa,IAAI,UAAS,mCAAS,eAAc,mBAAmB,YAAY,CAAC;AACpG,YAAU,MAAM;AACd,UAAM,KAAK,QAAQ;AACnB,QAAI,CAAC,IAAI;AACP;AAAA,IAAA;AAEF,QAAI,QAAQ;AACN,UAAA,KAAK,IAAI,eAAe,MAAM;AAClC,UAAI,OAAO;AACD,gBAAA;AACR;AAAA,MAAA;AAEE,UAAA,CAAC,QAAQ,aAAa;AACxB,uBAAe,GAAG,YAAY;AAAA,MAAA;AAE5B,UAAA,CAAC,QAAQ,YAAY;AACvB,sBAAc,GAAG,WAAW;AAAA,MAAA;AAAA,IAC9B,CACD;AACD,OAAG,QAAQ,EAAE;AACN,WAAA,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,EAAE;AACL,YAAU,MAAM;AACd,QAAI,QAAQ,aAAa;AACvB,qBAAe,QAAQ,WAAW;AAAA,IAAA;AAAA,EACpC,GACC,CAAC,QAAQ,WAAW,CAAC;AACxB,YAAU,MAAM;AACd,QAAI,QAAQ,YAAY;AACtB,oBAAc,QAAQ,UAAU;AAAA,IAAA;AAAA,EAClC,GACC,CAAC,QAAQ,UAAU,CAAC;AAGrB,SAAA,oBAAC,QAAQ,UAAR,EAAiB,OAAO,EAAE,OAAO,YAChC,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,YAAY,SAAS,QAAQ,mBAAmB,EAAE;AAAA,MAC7D,KAAK;AAAA,MACL,mBAAiB;AAAA,MACjB,aAAW;AAAA,MACX,eAAW,WAAM,cAAc,YAApB,mBAA6B,YAAW;AAAA,MACnD,eAAW,WAAM,cAAc,YAApB,mBAA6B,YAAW;AAAA,MAEnD,UAAA;AAAA,QAAA,oBAAC,OAAI,EAAA,WAAU,oBAAmB,KAAK,UAAU;AAAA,QACjD,oBAAC,cAAa,EAAA,OAAO,EAAE,UAAU,SAAS,KAAK,GAAG,MAAM,EAAK,EAAA,CAAA;AAAA,4BAC5D,cAAa,EAAA,OAAO,EAAE,UAAU,YAAY,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,KAAK,YAAY,GAAG;AAAA,4BACpG,cAAa,EAAA,OAAO,EAAE,UAAU,YAAY,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,KAAK,UAAU,GAAG;AAAA,QAErG,OAAO,MAAM,gBAAgB,cAC5B,kBAAkB,oBAAC,YAAW,EAAA,OAAO,SAAS,MAAO,CAAA,IAErD,oBAAC,WAAU,CAAA,CAAA;AAAA,QAEb;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,WAAW,aAAa,EAAE;AAAA,YACrC,KAAK;AAAA,YACL,OAAO;AAAA;AAAA,cAEL,aAAW,WAAM,cAAc,YAApB,mBAA6B,eAAc,KAAK;AAAA,cAC3D,cAAY,WAAM,cAAc,YAApB,mBAA6B,eAAc,KAAK;AAAA,cAC5D,QAAQ;AAAA,cACR,GAAG;AAAA,YACL;AAAA,YAEA,UAAA;AAAA,cAAA,oBAAC,UAAO,MAAY;AAAA,kCACnB,SAAQ,EAAA;AAAA,cACT,oBAAC,eAAe,EAAA,GAAG,EAAE,GAAG,SAAS,aAAa,YAAY,WAAW,UAAU,SAAY,EAAA,CAAA;AAAA,kCAC1F,aAAY,EAAA;AAAA,kCACZ,YAAW,EAAA;AAAA,kCACX,SAAQ,EAAA;AAAA,kCACR,SAAQ,EAAA;AAAA,kCACR,SAAQ,CAAA,CAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACX;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;AAEA,MAAM,sBAAsB,CAAC,iBAAqC;;AAC1D,QAAA,OAAO,qBAAqB,YAAY;AAC9C,MAAI,oBAAkB,kBAAa,CAAC,MAAd,mBAAiB,WAAU;AACjD,WAAS,IAAI,GAAG,KAAK,KAAK,SAAS,KAAK;AAChC,UAAA,MAAM,IAAI,CAAC;AACjB,UAAM,WACJ,kDAAe,SAAf,mBAAqB,aACrB,kDAAe,MAAM,SAArB,mBAA2B,aAC3B,kDAAe,qBAAf,mBAAiC,aACjC,kDAAc,YAAd,mBAAuB,WACvB;AACE,QAAA,kBAAkB,SAAS,cAAc;AACpC,aAAA;AAAA,IAAA;AAEU,uBAAA;AAAA,EAAA;AAErB,SAAO,kBAAkB;AAC3B;AAEA,MAAM,qBAAqB,CAAC,iBAAqC;;AACzD,QAAA,OAAO,qBAAqB,YAAY;AAC9C,MAAI,mBAAiB,kBAAa,CAAC,MAAd,mBAAiB,UAAS;AAC/C,WAAS,IAAI,GAAG,KAAK,KAAK,SAAS,KAAK;AAChC,UAAA,MAAM,IAAI,CAAC;AACjB,UAAM,UACJ,kDAAe,SAAf,mBAAqB,YACrB,kDAAe,MAAM,SAArB,mBAA2B,YAC3B,kDAAe,qBAAf,mBAAiC,YACjC,kDAAc,YAAd,mBAAuB,UACvB;AACE,QAAA,iBAAiB,QAAQ,aAAa;AACjC,aAAA;AAAA,IAAA;AAES,sBAAA;AAAA,EAAA;AAEpB,SAAO,iBAAiB;AAC1B;AC1QO,MAAM,sBAAuC;AAAA,EAClD,WAAW,EAAE,OAAO,OAAO,OAAO,SAAoC;AAElE,WAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,UAAU,CAAC,MAAM;AACf,cAAI,OAAO;AACH,kBAAA,MAAM,MAAM,EAAE,OAAO,OAAO,EAAE,cAAc,QAAQ,SAAA,EAAY,CAAA,CAAC;AAAA,UAAA;AAEzE,YAAE,cAAc,KAAK;AAAA,QAAA;AAAA,MACvB;AAAA,IACF;AAAA,EAAA;AAGN;ACLO,SAAS,WAAW,SAAuC;AAChE,QAAM,SAAwB,CAAC;AAC/B,QAAM,MAAM,QAAQ;AAChB,MAAA,QAAQ,OAAO,KAAK;AACf,WAAA,YAAY,QAAQ,OAAO;AAAA,EAAA;AAEhC,MAAA,QAAQ,SAAS,KAAK;AACjB,WAAA,cAAc,QAAQ,SAAS;AAAA,EAAA;AAEpC,MAAA,QAAQ,UAAU,KAAK;AAClB,WAAA,eAAe,QAAQ,UAAU;AAAA,EAAA;AAEtC,MAAA,QAAQ,QAAQ,KAAK;AAChB,WAAA,aAAa,QAAQ,QAAQ;AAAA,EAAA;AAE/B,SAAA;AACT;"}