@ricsam/excel-to-formula-engine 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,19 +1,21 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/xlsx/package.ts", "../src/a1.ts", "../src/xlsx/worksheet.ts", "../src/xlsx/workbook.ts", "../src/xlsx/styles.ts", "../src/translate/formula.ts", "../src/translate/conditional-format.ts", "../src/translate/dates.ts", "../src/convert.ts", "../index.ts"],
3
+ "sources": ["../src/xlsx/package.ts", "../src/a1.ts", "../src/xlsx/worksheet.ts", "../src/xlsx/workbook.ts", "../src/xlsx/styles.ts", "../src/translate/formula.ts", "../src/translate/conditional-format.ts", "../src/translate/dates.ts", "../src/convert.ts", "../src/csv/parse.ts", "../src/csv/convert.ts", "../index.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * Reads the OPC (zip) container of an .xlsx file and exposes its parts as\n * parsed XML.\n */\n\nimport { unzipSync, strFromU8 } from \"fflate\";\nimport { XMLParser } from \"fast-xml-parser\";\n\nexport type XmlNode = Record<string, unknown>;\n\nconst parser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: \"@\",\n // Repeating elements are NOT forced into arrays here: the same tag name can\n // be a container in one part and a repeating element in another (<color> is\n // one of each). Every read site wraps with asArray() instead, which is\n // correct for both shapes.\n // Cell text must survive exactly as stored: Excel writes \"007\" and \" x \" and\n // both must round-trip.\n parseTagValue: false,\n parseAttributeValue: false,\n trimValues: false,\n processEntities: true,\n});\n\nexport interface XlsxPackage {\n /** Raw part bytes keyed by zip path, e.g. `\"xl/worksheets/sheet1.xml\"`. */\n readonly files: Map<string, Uint8Array>;\n /** Parse a part as XML, or undefined when the part is absent. */\n xml(path: string): XmlNode | undefined;\n text(path: string): string | undefined;\n has(path: string): boolean;\n /** Every part path beginning with the given prefix. */\n list(prefix: string): string[];\n}\n\nexport async function readXlsxPackage(\n source: Blob | ArrayBuffer | Uint8Array\n): Promise<XlsxPackage> {\n const bytes = await toBytes(source);\n let unzipped: Record<string, Uint8Array>;\n try {\n unzipped = unzipSync(bytes);\n } catch (cause) {\n throw new Error(\n \"Could not read the file as an .xlsx package. Legacy .xls files and \" +\n \"password-protected workbooks are not supported.\",\n { cause }\n );\n }\n\n const files = new Map<string, Uint8Array>();\n for (const [path, content] of Object.entries(unzipped)) {\n // Zip paths are sometimes written with a leading slash or backslashes.\n files.set(normalizePath(path), content);\n }\n\n if (!files.has(\"xl/workbook.xml\")) {\n throw new Error(\n \"The file is a zip archive but does not contain xl/workbook.xml, so it \" +\n \"is not an Excel workbook.\"\n );\n }\n\n const xmlCache = new Map<string, XmlNode | undefined>();\n\n return {\n files,\n text(path) {\n const content = files.get(normalizePath(path));\n return content ? strFromU8(content) : undefined;\n },\n xml(path) {\n const key = normalizePath(path);\n if (xmlCache.has(key)) {\n return xmlCache.get(key);\n }\n const content = files.get(key);\n const parsed = content ? (parser.parse(strFromU8(content)) as XmlNode) : undefined;\n xmlCache.set(key, parsed);\n return parsed;\n },\n has(path) {\n return files.has(normalizePath(path));\n },\n list(prefix) {\n const normalized = normalizePath(prefix);\n return Array.from(files.keys()).filter((path) =>\n path.startsWith(normalized)\n );\n },\n };\n}\n\nfunction normalizePath(path: string): string {\n return path.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n}\n\nasync function toBytes(\n source: Blob | ArrayBuffer | Uint8Array\n): Promise<Uint8Array> {\n if (source instanceof Uint8Array) {\n return source;\n }\n if (source instanceof ArrayBuffer) {\n return new Uint8Array(source);\n }\n return new Uint8Array(await source.arrayBuffer());\n}\n\n/**\n * fast-xml-parser gives a single child as an object and repeated children as an\n * array. Parts we do not force into arrays go through this.\n */\nexport function asArray<T>(value: T | T[] | undefined): T[] {\n if (value === undefined || value === null) {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n}\n\nexport function attr(node: unknown, name: string): string | undefined {\n if (!node || typeof node !== \"object\") {\n return undefined;\n }\n const value = (node as Record<string, unknown>)[`@${name}`];\n return value === undefined || value === null ? undefined : String(value);\n}\n\nexport function numAttr(node: unknown, name: string): number | undefined {\n const raw = attr(node, name);\n if (raw === undefined) {\n return undefined;\n }\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nexport function boolAttr(\n node: unknown,\n name: string,\n fallback = false\n): boolean {\n const raw = attr(node, name);\n if (raw === undefined) {\n return fallback;\n }\n return raw === \"1\" || raw.toLowerCase() === \"true\";\n}\n\n/** Text content of an element parsed by fast-xml-parser. */\nexport function textOf(node: unknown): string {\n if (node === undefined || node === null) {\n return \"\";\n }\n if (typeof node === \"string\") {\n return node;\n }\n if (typeof node === \"number\" || typeof node === \"boolean\") {\n return String(node);\n }\n if (typeof node === \"object\") {\n const value = (node as Record<string, unknown>)[\"#text\"];\n return value === undefined || value === null ? \"\" : String(value);\n }\n return \"\";\n}\n",
6
6
  "/**\n * A1-notation helpers. These mirror the engine's own addressing (0-based row\n * and column indices) so translated references line up exactly.\n */\n\nimport type { SpreadsheetRange } from \"@ricsam/formula-engine\";\n\nconst A1_CELL = /^\\$?([A-Za-z]+)\\$?(\\d+)$/;\n\nexport function columnLabelToIndex(label: string): number {\n let index = 0;\n for (let i = 0; i < label.length; i++) {\n index = index * 26 + (label.toUpperCase().charCodeAt(i) - 64);\n }\n return index - 1;\n}\n\nexport function columnIndexToLabel(index: number): string {\n let label = \"\";\n let remaining = index + 1;\n while (remaining > 0) {\n const rest = (remaining - 1) % 26;\n label = String.fromCharCode(65 + rest) + label;\n remaining = Math.floor((remaining - rest) / 26);\n }\n return label;\n}\n\nexport interface ParsedCell {\n colIndex: number;\n rowIndex: number;\n}\n\nexport function parseA1(reference: string): ParsedCell | undefined {\n const match = A1_CELL.exec(reference.trim());\n if (!match || match[1] === undefined || match[2] === undefined) {\n return undefined;\n }\n return {\n colIndex: columnLabelToIndex(match[1]),\n rowIndex: Number.parseInt(match[2], 10) - 1,\n };\n}\n\nexport function toA1({ colIndex, rowIndex }: ParsedCell): string {\n return `${columnIndexToLabel(colIndex)}${rowIndex + 1}`;\n}\n\nexport interface ParsedRange {\n start: ParsedCell;\n end: ParsedCell;\n}\n\n/**\n * Parse an Excel range such as `A1:B10`, `A1`, `A:C` or `2:5`.\n *\n * Whole-column and whole-row ranges are clamped to Excel's grid limits rather\n * than being left open-ended, because Excel's own semantics are bounded.\n */\nexport const EXCEL_MAX_ROW_INDEX = 1_048_575;\nexport const EXCEL_MAX_COL_INDEX = 16_383;\n\nexport function parseA1Range(reference: string): ParsedRange | undefined {\n const trimmed = reference.trim().replace(/\\$/g, \"\");\n const [rawStart, rawEnd] = trimmed.split(\":\");\n if (rawStart === undefined) {\n return undefined;\n }\n if (rawEnd === undefined) {\n const cell = parseA1(rawStart);\n return cell ? { start: cell, end: cell } : undefined;\n }\n\n const startCell = parseA1(rawStart);\n const endCell = parseA1(rawEnd);\n if (startCell && endCell) {\n return { start: startCell, end: endCell };\n }\n\n // Whole columns, e.g. \"A:C\".\n if (/^[A-Za-z]+$/.test(rawStart) && /^[A-Za-z]+$/.test(rawEnd)) {\n return {\n start: { colIndex: columnLabelToIndex(rawStart), rowIndex: 0 },\n end: {\n colIndex: columnLabelToIndex(rawEnd),\n rowIndex: EXCEL_MAX_ROW_INDEX,\n },\n };\n }\n\n // Whole rows, e.g. \"2:5\".\n if (/^\\d+$/.test(rawStart) && /^\\d+$/.test(rawEnd)) {\n return {\n start: { colIndex: 0, rowIndex: Number.parseInt(rawStart, 10) - 1 },\n end: {\n colIndex: EXCEL_MAX_COL_INDEX,\n rowIndex: Number.parseInt(rawEnd, 10) - 1,\n },\n };\n }\n\n return undefined;\n}\n\nexport function toSpreadsheetRange(range: ParsedRange): SpreadsheetRange {\n return {\n start: { col: range.start.colIndex, row: range.start.rowIndex },\n end: {\n col: { type: \"number\", value: range.end.colIndex },\n row: { type: \"number\", value: range.end.rowIndex },\n },\n };\n}\n\n/** Parse an Excel range reference straight into an engine range. */\nexport function rangeReferenceToSpreadsheetRange(\n reference: string\n): SpreadsheetRange | undefined {\n const parsed = parseA1Range(reference);\n return parsed ? toSpreadsheetRange(parsed) : undefined;\n}\n",
7
7
  "/**\n * Parses one xl/worksheets/sheetN.xml part.\n *\n * Cell values in Excel are typed by the `t` attribute and stored in `<v>`, with\n * formulas alongside in `<f>`. Shared formulas are stored once on the group's\n * master cell and re-derived here for every other member.\n */\n\nimport {\n asArray,\n attr,\n boolAttr,\n numAttr,\n textOf,\n type XlsxPackage,\n type XmlNode,\n} from \"./package\";\nimport { parseA1, toA1 } from \"../a1\";\n\nexport type CellKind =\n | \"number\"\n | \"string\"\n | \"boolean\"\n | \"error\"\n | \"date\"\n | \"empty\";\n\nexport interface RawCell {\n reference: string;\n colIndex: number;\n rowIndex: number;\n kind: CellKind;\n /** Literal value, before date conversion. */\n value: string | number | boolean | undefined;\n /** Excel formula text without the leading `=`, when the cell has one. */\n formula?: string;\n /**\n * How far this cell sits from the master cell of its shared-formula group.\n * The formula's relative references are shifted by this much at translation\n * time. Absent or zero for an ordinary formula.\n */\n formulaOffset?: { cols: number; rows: number };\n /** Index into the style table's `formats`. */\n styleIndex?: number;\n}\n\nexport interface RawConditionalFormat {\n /** Ranges the rule applies to, as written in the file (`\"A1:B10 D1:D5\"`). */\n ranges: string[];\n type: string;\n operator?: string;\n /** Rule formulas, in the order Excel stores them. */\n formulas: string[];\n text?: string;\n /** Index into the style table's `differentialFormats`. */\n dxfId?: number;\n priority: number;\n /** Colour-scale stops, for `colorScale` rules. */\n colorScale?: {\n cfvo: { type: string; val?: string }[];\n colors: (string | undefined)[];\n };\n /** Present for `top10` rules. */\n rank?: number;\n bottom?: boolean;\n percent?: boolean;\n stopIfTrue?: boolean;\n}\n\nexport interface RawWorksheet {\n cells: RawCell[];\n merges: string[];\n columnWidths: Record<number, number>;\n rowHeights: Record<number, number>;\n frozen?: { rows: number; cols: number };\n conditionalFormats: RawConditionalFormat[];\n /** Hyperlink targets keyed by A1 reference. */\n hyperlinks: Record<string, string>;\n}\n\nexport function parseWorksheet(\n pkg: XlsxPackage,\n partPath: string,\n sharedStrings: string[]\n): RawWorksheet {\n const root = pkg.xml(partPath);\n const worksheet = root?.[\"worksheet\"] as XmlNode | undefined;\n const result: RawWorksheet = {\n cells: [],\n merges: [],\n columnWidths: {},\n rowHeights: {},\n conditionalFormats: [],\n hyperlinks: {},\n };\n if (!worksheet) {\n return result;\n }\n\n parseCells(worksheet, sharedStrings, result);\n parseColumns(worksheet, result);\n parsePanes(worksheet, result);\n parseMerges(worksheet, result);\n parseConditionalFormats(worksheet, result);\n parseHyperlinks(pkg, partPath, worksheet, result);\n\n return result;\n}\n\n/** Master formula of a shared-formula group, keyed by the group's `si`. */\ninterface SharedFormula {\n formula: string;\n colIndex: number;\n rowIndex: number;\n}\n\ninterface CellFormula {\n formula: string;\n offset?: { cols: number; rows: number };\n}\n\nfunction parseCells(\n worksheet: XmlNode,\n sharedStrings: string[],\n result: RawWorksheet\n): void {\n const sheetData = worksheet[\"sheetData\"] as XmlNode | undefined;\n const shared = new Map<string, SharedFormula>();\n\n for (const rawRow of asArray(sheetData?.[\"row\"])) {\n const row = rawRow as XmlNode;\n const rowNumber = numAttr(row, \"r\");\n const height = numAttr(row, \"ht\");\n if (rowNumber !== undefined && height !== undefined) {\n result.rowHeights[rowNumber - 1] = height;\n }\n\n for (const rawCell of asArray(row[\"c\"])) {\n const cell = rawCell as XmlNode;\n const reference = attr(cell, \"r\");\n if (!reference) {\n continue;\n }\n const address = parseA1(reference);\n if (!address) {\n continue;\n }\n\n const styleIndex = numAttr(cell, \"s\");\n const type = attr(cell, \"t\") ?? \"n\";\n const formula = readFormula(cell, address, shared);\n const { kind, value } = readValue(cell, type, sharedStrings);\n\n if (kind === \"empty\" && formula === undefined && styleIndex === undefined) {\n continue;\n }\n\n result.cells.push({\n reference,\n colIndex: address.colIndex,\n rowIndex: address.rowIndex,\n kind,\n value,\n formula: formula?.formula,\n formulaOffset: formula?.offset,\n styleIndex,\n });\n }\n }\n}\n\nfunction readFormula(\n cell: XmlNode,\n address: { colIndex: number; rowIndex: number },\n shared: Map<string, SharedFormula>\n): CellFormula | undefined {\n const node = cell[\"f\"];\n if (node === undefined || node === null) {\n return undefined;\n }\n\n const body = textOf(node);\n const type = attr(node, \"t\");\n const si = attr(node, \"si\");\n\n if (type === \"shared\" && si !== undefined) {\n if (body) {\n // The master cell of the group carries the formula text.\n shared.set(si, {\n formula: body,\n colIndex: address.colIndex,\n rowIndex: address.rowIndex,\n });\n return { formula: body };\n }\n const master = shared.get(si);\n if (!master) {\n return undefined;\n }\n // Members store no text of their own: they reuse the master's formula with\n // its relative references shifted by the distance between the two cells.\n return {\n formula: master.formula,\n offset: {\n cols: address.colIndex - master.colIndex,\n rows: address.rowIndex - master.rowIndex,\n },\n };\n }\n\n // Array formulas (\"array\"/\"dataTable\") carry their text on the anchor cell.\n return body ? { formula: body } : undefined;\n}\n\nfunction readValue(\n cell: XmlNode,\n type: string,\n sharedStrings: string[]\n): { kind: CellKind; value: string | number | boolean | undefined } {\n // Inline strings live in <is>, everything else in <v>.\n if (type === \"inlineStr\") {\n const inline = cell[\"is\"];\n return { kind: \"string\", value: readRichText(inline) };\n }\n\n const raw = cell[\"v\"];\n if (raw === undefined || raw === null) {\n return { kind: \"empty\", value: undefined };\n }\n const text = textOf(raw);\n\n switch (type) {\n case \"s\": {\n const index = Number.parseInt(text, 10);\n return { kind: \"string\", value: sharedStrings[index] ?? \"\" };\n }\n case \"str\":\n // A formula that returned text.\n return { kind: \"string\", value: text };\n case \"b\":\n return { kind: \"boolean\", value: text === \"1\" };\n case \"e\":\n return { kind: \"error\", value: text };\n case \"d\":\n // ISO 8601 date, used by strict OOXML.\n return { kind: \"date\", value: text };\n default: {\n const parsed = Number(text);\n return Number.isFinite(parsed)\n ? { kind: \"number\", value: parsed }\n : { kind: \"string\", value: text };\n }\n }\n}\n\n/** Flatten a rich-text run container into plain text. */\nexport function readRichText(node: unknown): string {\n if (node === undefined || node === null) {\n return \"\";\n }\n if (typeof node === \"string\") {\n return node;\n }\n const record = node as XmlNode;\n const runs = asArray(record[\"r\"]);\n if (runs.length > 0) {\n return runs.map((run) => textOf((run as XmlNode)[\"t\"])).join(\"\");\n }\n if (record[\"t\"] !== undefined) {\n return textOf(record[\"t\"]);\n }\n return textOf(record);\n}\n\nfunction parseColumns(worksheet: XmlNode, result: RawWorksheet): void {\n for (const rawCol of asArray(\n (worksheet[\"cols\"] as XmlNode | undefined)?.[\"col\"]\n )) {\n const col = rawCol as XmlNode;\n const min = numAttr(col, \"min\");\n const max = numAttr(col, \"max\");\n const width = numAttr(col, \"width\");\n if (min === undefined || max === undefined || width === undefined) {\n continue;\n }\n // A run can legitimately span to Excel's last column; recording every index\n // would be wasteful, so very wide runs are skipped.\n if (max - min > 1024) {\n continue;\n }\n for (let index = min; index <= max; index++) {\n result.columnWidths[index - 1] = width;\n }\n }\n}\n\nfunction parsePanes(worksheet: XmlNode, result: RawWorksheet): void {\n const sheetViews = worksheet[\"sheetViews\"] as XmlNode | undefined;\n const sheetView = asArray(sheetViews?.[\"sheetView\"])[0] as XmlNode | undefined;\n const pane = sheetView?.[\"pane\"] as XmlNode | undefined;\n if (!pane) {\n return;\n }\n if (attr(pane, \"state\") !== \"frozen\") {\n return;\n }\n result.frozen = {\n cols: numAttr(pane, \"xSplit\") ?? 0,\n rows: numAttr(pane, \"ySplit\") ?? 0,\n };\n}\n\nfunction parseMerges(worksheet: XmlNode, result: RawWorksheet): void {\n for (const merge of asArray(\n (worksheet[\"mergeCells\"] as XmlNode | undefined)?.[\"mergeCell\"]\n )) {\n const ref = attr(merge, \"ref\");\n if (ref) {\n result.merges.push(ref);\n }\n }\n}\n\nfunction parseConditionalFormats(\n worksheet: XmlNode,\n result: RawWorksheet\n): void {\n for (const rawBlock of asArray(worksheet[\"conditionalFormatting\"])) {\n const block = rawBlock as XmlNode;\n const sqref = attr(block, \"sqref\");\n if (!sqref) {\n continue;\n }\n const ranges = sqref.split(/\\s+/).filter(Boolean);\n\n for (const rawRule of asArray(block[\"cfRule\"])) {\n const rule = rawRule as XmlNode;\n const type = attr(rule, \"type\");\n if (!type) {\n continue;\n }\n\n const colorScaleNode = rule[\"colorScale\"] as XmlNode | undefined;\n\n result.conditionalFormats.push({\n ranges,\n type,\n operator: attr(rule, \"operator\"),\n formulas: asArray(rule[\"formula\"]).map((formula) => textOf(formula)),\n text: attr(rule, \"text\"),\n dxfId: numAttr(rule, \"dxfId\"),\n priority: numAttr(rule, \"priority\") ?? 0,\n rank: numAttr(rule, \"rank\"),\n bottom: boolAttr(rule, \"bottom\"),\n percent: boolAttr(rule, \"percent\"),\n stopIfTrue: boolAttr(rule, \"stopIfTrue\"),\n colorScale: colorScaleNode\n ? {\n cfvo: asArray(colorScaleNode[\"cfvo\"]).map((cfvo) => ({\n type: attr(cfvo, \"type\") ?? \"min\",\n val: attr(cfvo, \"val\"),\n })),\n colors: asArray(colorScaleNode[\"color\"]).map((color) =>\n attr(color, \"rgb\")\n ),\n }\n : undefined,\n });\n }\n }\n}\n\nfunction parseHyperlinks(\n pkg: XlsxPackage,\n partPath: string,\n worksheet: XmlNode,\n result: RawWorksheet\n): void {\n const links = asArray(\n (worksheet[\"hyperlinks\"] as XmlNode | undefined)?.[\"hyperlink\"]\n );\n if (links.length === 0) {\n return;\n }\n\n const relationships = readRelationships(pkg, partPath);\n\n for (const rawLink of links) {\n const link = rawLink as XmlNode;\n const ref = attr(link, \"ref\");\n if (!ref) {\n continue;\n }\n const id = attr(link, \"r:id\") ?? attr(link, \"id\");\n const location = attr(link, \"location\");\n const target = id ? relationships.get(id) : undefined;\n const href = target\n ? location\n ? `${target}#${location}`\n : target\n : location;\n if (!href) {\n continue;\n }\n\n // A hyperlink can cover a range; record it for the range's top-left cell.\n const start = parseA1(ref.split(\":\")[0] ?? ref);\n if (start) {\n result.hyperlinks[toA1(start)] = href;\n }\n }\n}\n\nexport function readRelationships(\n pkg: XlsxPackage,\n partPath: string\n): Map<string, string> {\n const slash = partPath.lastIndexOf(\"/\");\n const dir = slash === -1 ? \"\" : partPath.slice(0, slash);\n const file = slash === -1 ? partPath : partPath.slice(slash + 1);\n const relsPath = `${dir}/_rels/${file}.rels`;\n\n const map = new Map<string, string>();\n const root = pkg.xml(relsPath);\n const container = root?.[\"Relationships\"] as XmlNode | undefined;\n if (!container) {\n return map;\n }\n for (const relationship of asArray(container[\"Relationship\"])) {\n const id = attr(relationship, \"Id\");\n const target = attr(relationship, \"Target\");\n if (id && target) {\n map.set(id, target);\n }\n }\n return map;\n}\n",
8
8
  "/**\n * Parses the workbook-level parts: the sheet list, defined names, the shared\n * string table, and table definitions.\n */\n\nimport {\n asArray,\n attr,\n numAttr,\n type XlsxPackage,\n type XmlNode,\n} from \"./package\";\nimport { readRelationships, readRichText } from \"./worksheet\";\n\nexport interface SheetEntry {\n name: string;\n /** Zip path of the worksheet part. */\n partPath: string;\n /** `visible`, `hidden` or `veryHidden`. */\n state: string;\n}\n\nexport interface DefinedName {\n name: string;\n /** Formula text as stored, e.g. `\"Sheet1!$A$1:$B$5\"`. */\n formula: string;\n /**\n * Index of the sheet this name is scoped to, or undefined for a\n * workbook-scoped name.\n */\n localSheetId?: number;\n hidden: boolean;\n}\n\nexport interface RawTable {\n name: string;\n displayName: string;\n /** Range in A1 notation, including the header and totals rows. */\n ref: string;\n headerRowCount: number;\n totalsRowCount: number;\n columnNames: string[];\n}\n\n/** Read the shared string table, flattening rich text to plain text. */\nexport function parseSharedStrings(pkg: XlsxPackage): string[] {\n const root = pkg.xml(\"xl/sharedStrings.xml\");\n const sst = root?.[\"sst\"] as XmlNode | undefined;\n if (!sst) {\n return [];\n }\n return asArray(sst[\"si\"]).map((entry) => readRichText(entry));\n}\n\nexport function parseWorkbook(pkg: XlsxPackage): {\n sheets: SheetEntry[];\n definedNames: DefinedName[];\n /** True when the file uses the 1904 date system rather than 1900. */\n date1904: boolean;\n} {\n const root = pkg.xml(\"xl/workbook.xml\");\n const workbook = root?.[\"workbook\"] as XmlNode | undefined;\n if (!workbook) {\n return { sheets: [], definedNames: [], date1904: false };\n }\n\n const relationships = readRelationships(pkg, \"xl/workbook.xml\");\n\n const sheets: SheetEntry[] = [];\n for (const rawSheet of asArray(\n (workbook[\"sheets\"] as XmlNode | undefined)?.[\"sheet\"]\n )) {\n const sheet = rawSheet as XmlNode;\n const name = attr(sheet, \"name\");\n const id = attr(sheet, \"r:id\") ?? attr(sheet, \"id\");\n if (!name || !id) {\n continue;\n }\n const target = relationships.get(id);\n if (!target) {\n continue;\n }\n sheets.push({\n name,\n partPath: resolvePart(target),\n state: attr(sheet, \"state\") ?? \"visible\",\n });\n }\n\n const definedNames: DefinedName[] = [];\n for (const rawName of asArray(\n (workbook[\"definedNames\"] as XmlNode | undefined)?.[\"definedName\"]\n )) {\n const node = rawName as XmlNode;\n const name = attr(node, \"name\");\n if (!name) {\n continue;\n }\n definedNames.push({\n name,\n formula: textContent(node),\n localSheetId: numAttr(node, \"localSheetId\"),\n hidden: attr(node, \"hidden\") === \"1\",\n });\n }\n\n const pr = workbook[\"workbookPr\"];\n const date1904 =\n attr(pr, \"date1904\") === \"1\" || attr(pr, \"date1904\") === \"true\";\n\n return { sheets, definedNames, date1904 };\n}\n\n/** Table parts referenced by one worksheet. */\nexport function parseTables(\n pkg: XlsxPackage,\n worksheetPartPath: string\n): RawTable[] {\n const relationships = readRelationships(pkg, worksheetPartPath);\n const tables: RawTable[] = [];\n\n for (const target of relationships.values()) {\n if (!target.includes(\"tables/\")) {\n continue;\n }\n const partPath = resolvePart(target, worksheetPartPath);\n const root = pkg.xml(partPath);\n const table = root?.[\"table\"] as XmlNode | undefined;\n if (!table) {\n continue;\n }\n\n const ref = attr(table, \"ref\");\n const name = attr(table, \"name\") ?? attr(table, \"displayName\");\n if (!ref || !name) {\n continue;\n }\n\n tables.push({\n name,\n displayName: attr(table, \"displayName\") ?? name,\n ref,\n // Absent headerRowCount means one header row, per the schema default.\n headerRowCount: numAttr(table, \"headerRowCount\") ?? 1,\n totalsRowCount: numAttr(table, \"totalsRowCount\") ?? 0,\n columnNames: asArray(\n (table[\"tableColumns\"] as XmlNode | undefined)?.[\"tableColumn\"]\n ).map((column) => attr(column, \"name\") ?? \"\"),\n });\n }\n\n return tables;\n}\n\nfunction textContent(node: XmlNode): string {\n const value = node[\"#text\"];\n if (value === undefined || value === null) {\n return \"\";\n }\n return String(value);\n}\n\n/**\n * Resolve a relationship target against the part that declared it.\n *\n * Targets are usually relative (`worksheets/sheet1.xml` from `xl/workbook.xml`)\n * but may be absolute (`/xl/worksheets/sheet1.xml`).\n */\nfunction resolvePart(target: string, fromPart = \"xl/workbook.xml\"): string {\n if (target.startsWith(\"/\")) {\n return target.slice(1);\n }\n\n const slash = fromPart.lastIndexOf(\"/\");\n const baseDir = slash === -1 ? \"\" : fromPart.slice(0, slash);\n const segments = baseDir ? baseDir.split(\"/\") : [];\n\n for (const segment of target.split(\"/\")) {\n if (segment === \".\" || segment === \"\") {\n continue;\n }\n if (segment === \"..\") {\n segments.pop();\n continue;\n }\n segments.push(segment);\n }\n\n return segments.join(\"/\");\n}\n",
9
9
  "/**\n * Parses xl/styles.xml into the subset of formatting the engine can express.\n *\n * Excel's style model is indirect: a cell carries an index into `cellXfs`, and\n * each `xf` points at a font, fill, border and number format. This flattens\n * that into one record per `xf`.\n */\n\nimport type { CellStyle } from \"@ricsam/formula-engine\";\nimport { asArray, attr, boolAttr, numAttr, type XlsxPackage, type XmlNode } from \"./package\";\n\nexport interface ExcelFormat {\n style: CellStyle;\n /** Number format code, e.g. `\"0.00%\"` or `\"yyyy-mm-dd\"`. */\n numberFormat?: string;\n /** True when the number format renders a date or a time. */\n isDateFormat: boolean;\n}\n\nexport interface StyleTable {\n formats: ExcelFormat[];\n /** Differential formats, referenced by conditional formatting rules. */\n differentialFormats: CellStyle[];\n}\n\n/**\n * Number format ids Excel defines implicitly. Only the date/time ones matter\n * here: everything else is carried through as a metadata string.\n */\nconst BUILTIN_FORMATS: Record<number, string> = {\n 0: \"General\",\n 1: \"0\",\n 2: \"0.00\",\n 3: \"#,##0\",\n 4: \"#,##0.00\",\n 9: \"0%\",\n 10: \"0.00%\",\n 11: \"0.00E+00\",\n 12: \"# ?/?\",\n 13: \"# ??/??\",\n 14: \"mm-dd-yy\",\n 15: \"d-mmm-yy\",\n 16: \"d-mmm\",\n 17: \"mmm-yy\",\n 18: \"h:mm AM/PM\",\n 19: \"h:mm:ss AM/PM\",\n 20: \"h:mm\",\n 21: \"h:mm:ss\",\n 22: \"m/d/yy h:mm\",\n 37: \"#,##0 ;(#,##0)\",\n 38: \"#,##0 ;[Red](#,##0)\",\n 39: \"#,##0.00;(#,##0.00)\",\n 40: \"#,##0.00;[Red](#,##0.00)\",\n 45: \"mm:ss\",\n 46: \"[h]:mm:ss\",\n 47: \"mmss.0\",\n 48: \"##0.0E+0\",\n 49: \"@\",\n};\n\nconst BUILTIN_DATE_FORMAT_IDS = new Set([\n 14, 15, 16, 17, 18, 19, 20, 21, 22, 45, 46, 47,\n]);\n\nexport function parseStyles(pkg: XlsxPackage): StyleTable {\n const root = pkg.xml(\"xl/styles.xml\");\n const styleSheet = root?.[\"styleSheet\"] as XmlNode | undefined;\n if (!styleSheet) {\n return { formats: [], differentialFormats: [] };\n }\n\n const theme = parseThemeColors(pkg);\n const indexedColors = parseIndexedColors(styleSheet);\n\n const numberFormats = new Map<number, string>();\n for (const numFmt of asArray(\n (styleSheet[\"numFmts\"] as XmlNode | undefined)?.[\"numFmt\"]\n )) {\n const id = numAttr(numFmt, \"numFmtId\");\n const code = attr(numFmt, \"formatCode\");\n if (id !== undefined && code !== undefined) {\n numberFormats.set(id, code);\n }\n }\n\n const fonts = asArray((styleSheet[\"fonts\"] as XmlNode | undefined)?.[\"font\"]);\n const fills = asArray((styleSheet[\"fills\"] as XmlNode | undefined)?.[\"fill\"]);\n const borders = asArray(\n (styleSheet[\"borders\"] as XmlNode | undefined)?.[\"border\"]\n );\n\n const cellXfs = asArray(\n (styleSheet[\"cellXfs\"] as XmlNode | undefined)?.[\"xf\"]\n );\n\n const formats: ExcelFormat[] = cellXfs.map((rawXf) => {\n const xf = rawXf as XmlNode;\n const style: CellStyle = {};\n\n if (boolAttr(xf, \"applyFont\", true)) {\n const font = fonts[numAttr(xf, \"fontId\") ?? -1];\n if (font) {\n applyFont(style, font as XmlNode, theme, indexedColors);\n }\n }\n\n if (boolAttr(xf, \"applyFill\", true)) {\n const fill = fills[numAttr(xf, \"fillId\") ?? -1];\n if (fill) {\n applyFill(style, fill as XmlNode, theme, indexedColors);\n }\n }\n\n if (boolAttr(xf, \"applyBorder\", true)) {\n const border = borders[numAttr(xf, \"borderId\") ?? -1];\n if (border) {\n applyBorder(style, border as XmlNode, theme, indexedColors);\n }\n }\n\n if (boolAttr(xf, \"applyAlignment\", true)) {\n const alignment = xf[\"alignment\"];\n if (alignment && boolAttr(alignment, \"wrapText\")) {\n style.wrapText = true;\n }\n }\n\n const numFmtId = numAttr(xf, \"numFmtId\") ?? 0;\n const numberFormat = numberFormats.get(numFmtId) ?? BUILTIN_FORMATS[numFmtId];\n\n return {\n style,\n numberFormat: numberFormat === \"General\" ? undefined : numberFormat,\n isDateFormat: isDateFormat(numFmtId, numberFormat),\n };\n });\n\n const differentialFormats = asArray(\n (styleSheet[\"dxfs\"] as XmlNode | undefined)?.[\"dxf\"]\n ).map((dxf) => {\n const style: CellStyle = {};\n const node = dxf as XmlNode;\n if (node[\"font\"]) {\n applyFont(style, node[\"font\"] as XmlNode, theme, indexedColors);\n }\n if (node[\"fill\"]) {\n applyFill(style, node[\"fill\"] as XmlNode, theme, indexedColors);\n }\n if (node[\"border\"]) {\n applyBorder(style, node[\"border\"] as XmlNode, theme, indexedColors);\n }\n return style;\n });\n\n return { formats, differentialFormats };\n}\n\nfunction applyFont(\n style: CellStyle,\n font: XmlNode,\n theme: string[],\n indexedColors: string[]\n): void {\n if (font[\"b\"] !== undefined && isOn(font[\"b\"])) {\n style.bold = true;\n }\n if (font[\"i\"] !== undefined && isOn(font[\"i\"])) {\n style.italic = true;\n }\n if (font[\"u\"] !== undefined && isOn(font[\"u\"])) {\n style.underline = true;\n }\n const size = numAttr(font[\"sz\"], \"val\");\n if (size !== undefined) {\n // Excel stores font size in points; the engine's fontSize is in pixels.\n style.fontSize = Math.round(size * (96 / 72));\n }\n const color = resolveColor(font[\"color\"], theme, indexedColors);\n if (color) {\n style.color = color;\n }\n}\n\nfunction applyFill(\n style: CellStyle,\n fill: XmlNode,\n theme: string[],\n indexedColors: string[]\n): void {\n const pattern = fill[\"patternFill\"] as XmlNode | undefined;\n if (!pattern) {\n return;\n }\n const patternType = attr(pattern, \"patternType\");\n if (patternType === \"none\" || patternType === undefined) {\n return;\n }\n // For a solid fill Excel puts the visible colour in fgColor, not bgColor.\n const color =\n resolveColor(pattern[\"fgColor\"], theme, indexedColors) ??\n resolveColor(pattern[\"bgColor\"], theme, indexedColors);\n if (color) {\n style.backgroundColor = color;\n }\n}\n\nconst BORDER_SIDES = [\"top\", \"right\", \"bottom\", \"left\"] as const;\n\nfunction applyBorder(\n style: CellStyle,\n border: XmlNode,\n theme: string[],\n indexedColors: string[]\n): void {\n const sides: NonNullable<CellStyle[\"borderSides\"]> = {};\n let color: string | undefined;\n let any = false;\n\n for (const side of BORDER_SIDES) {\n const node = border[side] as XmlNode | undefined;\n const borderStyle = node ? attr(node, \"style\") : undefined;\n if (!node || borderStyle === undefined || borderStyle === \"none\") {\n continue;\n }\n sides[side] = true;\n any = true;\n color ??= resolveColor(node[\"color\"], theme, indexedColors);\n }\n\n if (any) {\n style.borderSides = sides;\n // The engine has one border colour per cell, so the first side's colour\n // stands in for all of them.\n style.borderColor = color ?? \"#000000\";\n }\n}\n\nfunction isOn(node: unknown): boolean {\n // <b/> means bold; <b val=\"0\"/> means not bold.\n const val = attr(node, \"val\");\n return val === undefined || val === \"1\" || val.toLowerCase() === \"true\";\n}\n\nfunction isDateFormat(numFmtId: number, code: string | undefined): boolean {\n if (BUILTIN_DATE_FORMAT_IDS.has(numFmtId)) {\n return true;\n }\n if (!code) {\n return false;\n }\n // Strip literal text and colour/condition sections before looking for date\n // tokens, so that \"0.00\" with a [Red] section is not read as a date.\n const stripped = code\n .replace(/\\[[^\\]]*\\]/g, \"\")\n .replace(/\"[^\"]*\"/g, \"\")\n .replace(/\\\\./g, \"\");\n return /[dmyhs]/i.test(stripped) && !/^[^dmyhs]*$/i.test(stripped);\n}\n\n/** Convert an Excel colour node to a `#rrggbb` string. */\nfunction resolveColor(\n node: unknown,\n theme: string[],\n indexedColors: string[]\n): string | undefined {\n if (!node || typeof node !== \"object\") {\n return undefined;\n }\n\n const rgb = attr(node, \"rgb\");\n if (rgb) {\n return applyTint(argbToHex(rgb), numAttr(node, \"tint\"));\n }\n\n const themeIndex = numAttr(node, \"theme\");\n if (themeIndex !== undefined) {\n const base = theme[themeIndex];\n if (base) {\n return applyTint(base, numAttr(node, \"tint\"));\n }\n }\n\n const indexed = numAttr(node, \"indexed\");\n if (indexed !== undefined) {\n const base = indexedColors[indexed];\n if (base) {\n return applyTint(base, numAttr(node, \"tint\"));\n }\n }\n\n return undefined;\n}\n\n/** Excel writes colours as AARRGGBB; the alpha channel is dropped. */\nfunction argbToHex(argb: string): string {\n const value = argb.replace(/^#/, \"\");\n const rgb = value.length === 8 ? value.slice(2) : value;\n return `#${rgb.toLowerCase()}`;\n}\n\n/**\n * Excel lightens or darkens a base colour by a tint in [-1, 1]. Negative tints\n * darken, positive tints lighten toward white.\n */\nfunction applyTint(hex: string, tint: number | undefined): string {\n if (!tint) {\n return hex;\n }\n const value = hex.replace(\"#\", \"\");\n const channels = [0, 2, 4].map((offset) =>\n Number.parseInt(value.slice(offset, offset + 2), 16)\n );\n const tinted = channels.map((channel) => {\n const next =\n tint < 0 ? channel * (1 + tint) : channel * (1 - tint) + 255 * tint;\n return Math.max(0, Math.min(255, Math.round(next)));\n });\n return `#${tinted.map((c) => c.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\n/** Theme colours, in the order conditional formats and styles index them. */\nfunction parseThemeColors(pkg: XlsxPackage): string[] {\n const themePath = pkg\n .list(\"xl/theme/\")\n .find((path) => path.endsWith(\".xml\"));\n if (!themePath) {\n return [];\n }\n const text = pkg.text(themePath);\n if (!text) {\n return [];\n }\n\n const scheme = /<a:clrScheme[\\s\\S]*?<\\/a:clrScheme>/.exec(text)?.[0];\n if (!scheme) {\n return [];\n }\n\n const colors: string[] = [];\n const entry =\n /<a:(dk1|lt1|dk2|lt2|accent[1-6]|hlink|folHlink)>([\\s\\S]*?)<\\/a:\\1>/g;\n let match: RegExpExecArray | null;\n while ((match = entry.exec(scheme)) !== null) {\n const body = match[2] ?? \"\";\n const srgb = /<a:srgbClr val=\"([0-9A-Fa-f]{6})\"/.exec(body)?.[1];\n const sys = /<a:sysClr[^>]*lastClr=\"([0-9A-Fa-f]{6})\"/.exec(body)?.[1];\n colors.push(`#${(srgb ?? sys ?? \"000000\").toLowerCase()}`);\n }\n\n // Excel's theme index order swaps the first two pairs relative to the file.\n if (colors.length >= 4) {\n const [dk1, lt1, dk2, lt2, ...rest] = colors;\n return [lt1!, dk1!, lt2!, dk2!, ...rest];\n }\n return colors;\n}\n\nfunction parseIndexedColors(styleSheet: XmlNode): string[] {\n const colors = asArray(\n (\n (styleSheet[\"colors\"] as XmlNode | undefined)?.[\"indexedColors\"] as\n | XmlNode\n | undefined\n )?.[\"rgbColor\"]\n );\n if (colors.length > 0) {\n return colors.map((color) => argbToHex(attr(color, \"rgb\") ?? \"FF000000\"));\n }\n return DEFAULT_INDEXED_COLORS;\n}\n\n/** Excel's legacy 56-colour palette, used when a file omits its own. */\nconst DEFAULT_INDEXED_COLORS: string[] = [\n \"#000000\", \"#ffffff\", \"#ff0000\", \"#00ff00\", \"#0000ff\", \"#ffff00\", \"#ff00ff\",\n \"#00ffff\", \"#000000\", \"#ffffff\", \"#ff0000\", \"#00ff00\", \"#0000ff\", \"#ffff00\",\n \"#ff00ff\", \"#00ffff\", \"#800000\", \"#008000\", \"#000080\", \"#808000\", \"#800080\",\n \"#008080\", \"#c0c0c0\", \"#808080\", \"#9999ff\", \"#993366\", \"#ffffcc\", \"#ccffff\",\n \"#660066\", \"#ff8080\", \"#0066cc\", \"#ccccff\", \"#000080\", \"#ff00ff\", \"#ffff00\",\n \"#00ffff\", \"#800080\", \"#800000\", \"#008080\", \"#0000ff\", \"#00ccff\", \"#ccffff\",\n \"#ccffcc\", \"#ffff99\", \"#99ccff\", \"#ff99cc\", \"#cc99ff\", \"#ffcc99\", \"#3366ff\",\n \"#33cccc\", \"#99cc00\", \"#ffcc00\", \"#ff9900\", \"#ff6600\", \"#666699\", \"#969696\",\n \"#003366\", \"#339966\", \"#003300\", \"#333300\", \"#993300\", \"#993366\", \"#333399\",\n \"#333333\",\n];\n",
10
- "/**\n * Translates an Excel formula into engine formula text.\n *\n * Excel and the engine share almost all of their syntax — A1 references, sheet\n * and workbook qualifiers, structured table references, array literals and the\n * operator set all carry over unchanged. Translation therefore rewrites the few\n * constructs that genuinely differ and reports, rather than rewrites, anything\n * the engine cannot evaluate. Formulas using unsupported functions are kept\n * verbatim so the original intent stays visible in the cell.\n */\n\nimport { getFormulaFunctionCatalog } from \"@ricsam/formula-engine\";\nimport type { Diagnostic } from \"../types\";\n\n/** Uppercase names of every function the engine implements, including aliases. */\nlet supportedFunctionNames: Set<string> | undefined;\n\nfunction getSupportedFunctions(): Set<string> {\n if (!supportedFunctionNames) {\n const names = new Set<string>();\n for (const descriptor of getFormulaFunctionCatalog()) {\n names.add(descriptor.name.toUpperCase());\n for (const alias of descriptor.aliases ?? []) {\n names.add(alias.toUpperCase());\n }\n }\n supportedFunctionNames = names;\n }\n return supportedFunctionNames;\n}\n\n/**\n * Excel writes newer functions with a `_xlfn.` prefix (and `_xlfn._xlws.` for\n * worksheet-scoped ones) when they postdate the file format. The prefix is a\n * storage detail, never part of the user-visible formula.\n */\nconst XLFN_PREFIX = /_xlfn\\.(_xlws\\.)?/g;\n\n/**\n * `@` marks implicit intersection in files written by dynamic-array Excel. The\n * engine has no implicit-intersection operator, so it is dropped: for a single\n * -valued reference the behaviour is identical.\n */\nconst IMPLICIT_INTERSECTION = /(?<![\\w$\"'\\]])@(?=[A-Za-z_\\\\])/g;\n\nexport interface TranslateFormulaOptions {\n sheetName?: string;\n cellReference?: string;\n}\n\nexport interface TranslatedFormula {\n /** Engine formula text, including the leading `=`. */\n formula: string;\n diagnostics: Diagnostic[];\n}\n\nexport function translateFormula(\n rawFormula: string,\n options: TranslateFormulaOptions = {}\n): TranslatedFormula {\n const diagnostics: Diagnostic[] = [];\n let body = rawFormula.startsWith(\"=\") ? rawFormula.slice(1) : rawFormula;\n\n body = body.replace(XLFN_PREFIX, \"\");\n body = body.replace(IMPLICIT_INTERSECTION, \"\");\n\n for (const name of findUnsupportedFunctions(body)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"unsupported-function\",\n message:\n `The engine does not implement ${name}(). The formula was imported ` +\n `unchanged and will evaluate to an error.`,\n sheetName: options.sheetName,\n cellReference: options.cellReference,\n source: rawFormula,\n });\n }\n\n return { formula: `=${body}`, diagnostics };\n}\n\n/**\n * Find function calls in a formula whose names the engine does not implement.\n *\n * This scans outside of string literals and skips identifiers that are not\n * followed by `(`, so table columns (`Table[Amount]`) and named expressions are\n * not mistaken for calls.\n */\nexport function findUnsupportedFunctions(formulaBody: string): string[] {\n const supported = getSupportedFunctions();\n const found = new Set<string>();\n\n let inString = false;\n let identifier = \"\";\n\n for (let i = 0; i < formulaBody.length; i++) {\n const char = formulaBody[i]!;\n\n if (inString) {\n if (char === '\"') {\n // A doubled quote is an escaped quote inside the literal.\n if (formulaBody[i + 1] === '\"') {\n i++;\n } else {\n inString = false;\n }\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n identifier = \"\";\n continue;\n }\n\n if (/[A-Za-z0-9_.]/.test(char)) {\n identifier += char;\n continue;\n }\n\n if (char === \"(\" && identifier.length > 0) {\n const name = identifier.toUpperCase();\n // A trailing sheet qualifier (Sheet1!SUM) cannot occur, but a decimal\n // number can end up in `identifier`; require a letter first.\n if (/^[A-Z_][A-Z0-9_.]*$/.test(name) && !supported.has(name)) {\n found.add(name);\n }\n }\n\n identifier = \"\";\n }\n\n return Array.from(found);\n}\n\n/**\n * Expand a shared formula.\n *\n * Excel stores one formula for a group of cells and expects readers to offset\n * its relative references for every other cell in the group. Absolute parts\n * (`$A$1`) stay put.\n */\nexport function offsetFormulaReferences(\n formulaBody: string,\n deltaCols: number,\n deltaRows: number\n): string {\n if (deltaCols === 0 && deltaRows === 0) {\n return formulaBody;\n }\n\n // Matches an optional sheet/workbook qualifier followed by a cell reference,\n // so that the qualifier is preserved while the reference is shifted.\n const reference =\n /(\\$?)([A-Za-z]{1,3})(\\$?)(\\d{1,7})(?![\\w(])/g;\n\n let result = \"\";\n let lastIndex = 0;\n let inString = false;\n\n for (let i = 0; i < formulaBody.length; i++) {\n if (formulaBody[i] === '\"') {\n if (inString && formulaBody[i + 1] === '\"') {\n i++;\n continue;\n }\n inString = !inString;\n }\n if (inString) {\n continue;\n }\n\n reference.lastIndex = i;\n const match = reference.exec(formulaBody);\n if (!match || match.index !== i) {\n continue;\n }\n\n const [whole, colAbs, colLabel, rowAbs, rowDigits] = match;\n // Skip anything that is part of a longer identifier, e.g. the \"A1\" in\n // \"MYA1NAME\" or a function name. A \"!\" before the reference is a sheet\n // qualifier, whose reference still shifts, and a \"$\" is the reference's own\n // absolute marker.\n const before = i > 0 ? formulaBody[i - 1]! : \"\";\n if (/[A-Za-z0-9_.]/.test(before)) {\n continue;\n }\n\n result += formulaBody.slice(lastIndex, i);\n result += shiftReference(\n colAbs!,\n colLabel!,\n rowAbs!,\n rowDigits!,\n deltaCols,\n deltaRows\n );\n lastIndex = i + whole!.length;\n i = lastIndex - 1;\n }\n\n result += formulaBody.slice(lastIndex);\n return result;\n}\n\nfunction shiftReference(\n colAbs: string,\n colLabel: string,\n rowAbs: string,\n rowDigits: string,\n deltaCols: number,\n deltaRows: number\n): string {\n const colIndex = columnLabelToIndex(colLabel);\n const rowIndex = Number.parseInt(rowDigits, 10) - 1;\n\n const newColIndex = colAbs ? colIndex : colIndex + deltaCols;\n const newRowIndex = rowAbs ? rowIndex : rowIndex + deltaRows;\n\n if (newColIndex < 0 || newRowIndex < 0) {\n return \"#REF!\";\n }\n\n return `${colAbs}${columnIndexToLabel(newColIndex)}${rowAbs}${newRowIndex + 1}`;\n}\n\nfunction columnLabelToIndex(label: string): number {\n let index = 0;\n for (let i = 0; i < label.length; i++) {\n index = index * 26 + (label.toUpperCase().charCodeAt(i) - 64);\n }\n return index - 1;\n}\n\nfunction columnIndexToLabel(index: number): string {\n let label = \"\";\n let remaining = index + 1;\n while (remaining > 0) {\n const rest = (remaining - 1) % 26;\n label = String.fromCharCode(65 + rest) + label;\n remaining = Math.floor((remaining - rest) / 26);\n }\n return label;\n}\n",
10
+ "/**\n * Translates an Excel formula into engine formula text.\n *\n * Excel and the engine share almost all of their syntax — A1 references, sheet\n * and workbook qualifiers, structured table references, array literals and the\n * operator set all carry over unchanged. Translation therefore rewrites the few\n * constructs that genuinely differ and reports, rather than rewrites, anything\n * the engine cannot evaluate. Formulas using unsupported functions are kept\n * verbatim so the original intent stays visible in the cell.\n */\n\nimport { getFormulaFunctionCatalog } from \"@ricsam/formula-engine\";\nimport type { Diagnostic } from \"../types\";\n\n/** Uppercase names of every function the engine implements, including aliases. */\nlet supportedFunctionNames: Set<string> | undefined;\n\nfunction getSupportedFunctions(): Set<string> {\n if (!supportedFunctionNames) {\n const names = new Set<string>();\n for (const descriptor of getFormulaFunctionCatalog()) {\n names.add(descriptor.name.toUpperCase());\n for (const alias of descriptor.aliases ?? []) {\n names.add(alias.toUpperCase());\n }\n }\n supportedFunctionNames = names;\n }\n return supportedFunctionNames;\n}\n\n/**\n * Excel writes newer functions with a `_xlfn.` prefix (and `_xlfn._xlws.` for\n * worksheet-scoped ones) when they postdate the file format. The prefix is a\n * storage detail, never part of the user-visible formula.\n */\nconst XLFN_PREFIX = /_xlfn\\.(_xlws\\.)?/g;\n\n/**\n * `@` marks implicit intersection in files written by dynamic-array Excel. The\n * engine has no implicit-intersection operator, so it is dropped: for a\n * single-valued reference the behaviour is identical.\n *\n * `[` is excluded from what may precede it, because `[@Column]` is not an\n * implicit intersection at all — it is a structured reference to the current\n * row. Stripping that `@` turns `Table[@Amount]` into `Table[Amount]`, which is\n * the whole column: a formula that still evaluates, and quietly gives the wrong\n * number.\n */\nconst IMPLICIT_INTERSECTION = /(?<![\\w$\"'\\]\\[])@(?=[A-Za-z_\\\\])/g;\n\n/**\n * Rewrite Excel's stored current-row selector into the `@` form.\n *\n * Excel stores `Table[[#This Row],[Column]]` in the file but only ever *shows*\n * `[@Column]` in its formula bar — the `@` shorthand is newer than the file\n * format, so the fully-qualified selector is what gets written for compatibility.\n * The engine reads the shorthand and not the selector, so this rewrite is what\n * makes a calculated column work at all. It also happens to put back the exact\n * text the author typed, which is the form they will expect to see.\n *\n * Both the spaced spelling Excel writes and the unspaced one some writers emit\n * are handled, as is the `[ColA]:[ColB]` span form.\n */\nconst THIS_ROW_REFERENCE =\n /(?:'((?:[^']|'')+)'|([A-Za-z_\\\\][\\w.\\\\]*))?\\[\\[#This ?Row\\],\\s*\\[([^\\]]*)\\](?:\\s*:\\s*\\[([^\\]]*)\\])?\\]/gi;\n\nexport interface TranslateFormulaOptions {\n sheetName?: string;\n cellReference?: string;\n /**\n * The table the formula's own cell sits inside, when it sits inside one.\n *\n * Excel drops the table name from a current-row reference that points at the\n * table the formula is already in, so `[@Payload]` is what the author sees.\n * Supplying it here reproduces that, and leaving it out keeps the name — which\n * is still correct, just more verbose than Excel would be.\n */\n containingTableName?: string;\n}\n\nexport interface TranslatedFormula {\n /** Engine formula text, including the leading `=`. */\n formula: string;\n diagnostics: Diagnostic[];\n}\n\nexport function translateFormula(\n rawFormula: string,\n options: TranslateFormulaOptions = {}\n): TranslatedFormula {\n const diagnostics: Diagnostic[] = [];\n let body = rawFormula.startsWith(\"=\") ? rawFormula.slice(1) : rawFormula;\n\n body = body.replace(XLFN_PREFIX, \"\");\n body = body.replace(IMPLICIT_INTERSECTION, \"\");\n body = contractThisRowReferences(body, options.containingTableName);\n\n for (const name of findUnsupportedFunctions(body)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"unsupported-function\",\n message:\n `The engine does not implement ${name}(). The formula was imported ` +\n `unchanged and will evaluate to an error.`,\n sheetName: options.sheetName,\n cellReference: options.cellReference,\n source: rawFormula,\n });\n }\n\n return { formula: `=${body}`, diagnostics };\n}\n\n/**\n * Find function calls in a formula whose names the engine does not implement.\n *\n * This scans outside of string literals and skips identifiers that are not\n * followed by `(`, so table columns (`Table[Amount]`) and named expressions are\n * not mistaken for calls.\n */\nexport function findUnsupportedFunctions(formulaBody: string): string[] {\n const supported = getSupportedFunctions();\n const found = new Set<string>();\n\n let inString = false;\n let identifier = \"\";\n\n for (let i = 0; i < formulaBody.length; i++) {\n const char = formulaBody[i]!;\n\n if (inString) {\n if (char === '\"') {\n // A doubled quote is an escaped quote inside the literal.\n if (formulaBody[i + 1] === '\"') {\n i++;\n } else {\n inString = false;\n }\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n identifier = \"\";\n continue;\n }\n\n if (/[A-Za-z0-9_.]/.test(char)) {\n identifier += char;\n continue;\n }\n\n if (char === \"(\" && identifier.length > 0) {\n const name = identifier.toUpperCase();\n // A trailing sheet qualifier (Sheet1!SUM) cannot occur, but a decimal\n // number can end up in `identifier`; require a letter first.\n if (/^[A-Z_][A-Z0-9_.]*$/.test(name) && !supported.has(name)) {\n found.add(name);\n }\n }\n\n identifier = \"\";\n }\n\n return Array.from(found);\n}\n\n/**\n * Expand a shared formula.\n *\n * Excel stores one formula for a group of cells and expects readers to offset\n * its relative references for every other cell in the group. Absolute parts\n * (`$A$1`) stay put.\n */\nexport function offsetFormulaReferences(\n formulaBody: string,\n deltaCols: number,\n deltaRows: number\n): string {\n if (deltaCols === 0 && deltaRows === 0) {\n return formulaBody;\n }\n\n // Matches an optional sheet/workbook qualifier followed by a cell reference,\n // so that the qualifier is preserved while the reference is shifted.\n const reference =\n /(\\$?)([A-Za-z]{1,3})(\\$?)(\\d{1,7})(?![\\w(])/g;\n\n let result = \"\";\n let lastIndex = 0;\n let inString = false;\n\n for (let i = 0; i < formulaBody.length; i++) {\n if (formulaBody[i] === '\"') {\n if (inString && formulaBody[i + 1] === '\"') {\n i++;\n continue;\n }\n inString = !inString;\n }\n if (inString) {\n continue;\n }\n\n reference.lastIndex = i;\n const match = reference.exec(formulaBody);\n if (!match || match.index !== i) {\n continue;\n }\n\n const [whole, colAbs, colLabel, rowAbs, rowDigits] = match;\n // Skip anything that is part of a longer identifier, e.g. the \"A1\" in\n // \"MYA1NAME\" or a function name. A \"!\" before the reference is a sheet\n // qualifier, whose reference still shifts, and a \"$\" is the reference's own\n // absolute marker.\n const before = i > 0 ? formulaBody[i - 1]! : \"\";\n if (/[A-Za-z0-9_.]/.test(before)) {\n continue;\n }\n\n result += formulaBody.slice(lastIndex, i);\n result += shiftReference(\n colAbs!,\n colLabel!,\n rowAbs!,\n rowDigits!,\n deltaCols,\n deltaRows\n );\n lastIndex = i + whole!.length;\n i = lastIndex - 1;\n }\n\n result += formulaBody.slice(lastIndex);\n return result;\n}\n\nfunction shiftReference(\n colAbs: string,\n colLabel: string,\n rowAbs: string,\n rowDigits: string,\n deltaCols: number,\n deltaRows: number\n): string {\n const colIndex = columnLabelToIndex(colLabel);\n const rowIndex = Number.parseInt(rowDigits, 10) - 1;\n\n const newColIndex = colAbs ? colIndex : colIndex + deltaCols;\n const newRowIndex = rowAbs ? rowIndex : rowIndex + deltaRows;\n\n if (newColIndex < 0 || newRowIndex < 0) {\n return \"#REF!\";\n }\n\n return `${colAbs}${columnIndexToLabel(newColIndex)}${rowAbs}${newRowIndex + 1}`;\n}\n\nfunction columnLabelToIndex(label: string): number {\n let index = 0;\n for (let i = 0; i < label.length; i++) {\n index = index * 26 + (label.toUpperCase().charCodeAt(i) - 64);\n }\n return index - 1;\n}\n\nfunction columnIndexToLabel(index: number): string {\n let label = \"\";\n let remaining = index + 1;\n while (remaining > 0) {\n const rest = (remaining - 1) % 26;\n label = String.fromCharCode(65 + rest) + label;\n remaining = Math.floor((remaining - rest) / 26);\n }\n return label;\n}\n\n/**\n * `Table[[#This Row],[Col]]` → `Table[@Col]`, or `[@Col]` when the formula is\n * already inside that table.\n */\nexport function contractThisRowReferences(\n formulaBody: string,\n containingTableName?: string\n): string {\n return formulaBody.replace(\n THIS_ROW_REFERENCE,\n (whole, quotedTable, bareTable, startCol, endCol) => {\n const tableName: string | undefined = quotedTable\n ? String(quotedTable).replace(/''/g, \"'\")\n : bareTable\n ? String(bareTable)\n : undefined;\n\n // A column name can contain characters that would not survive being\n // written bare, so the bracketed form is kept whenever it is a span or\n // the name is not a plain identifier.\n const columns =\n endCol === undefined\n ? `[${startCol}]`\n : `[${startCol}]:[${endCol}]`;\n\n const isPlainSingleColumn =\n endCol === undefined && /^[^[\\]@#'\"]+$/.test(String(startCol));\n\n const reference = isPlainSingleColumn ? `@${startCol}` : `@${columns}`;\n\n // Excel itself drops the table name when the formula lives in that table.\n if (\n tableName &&\n containingTableName &&\n tableName.toLowerCase() === containingTableName.toLowerCase()\n ) {\n return `[${reference}]`;\n }\n if (!tableName) {\n return `[${reference}]`;\n }\n const quoted = quotedTable ? `'${String(quotedTable)}'` : tableName;\n return `${quoted}[${reference}]`;\n }\n );\n}\n",
11
11
  "/**\n * Translates Excel conditional formatting into engine conditional styles.\n *\n * The engine offers two kinds of rule: a formula rule, which paints a cell one\n * colour when a formula is true, and a gradient rule, which interpolates\n * between two colour stops. Excel's rule catalogue is much larger, so this maps\n * what fits and reports the rest.\n *\n * Excel writes each rule's condition relative to the top-left cell of the range\n * it applies to, which is exactly the convention the engine's formula rules use,\n * so conditions carry over without rebasing.\n */\n\nimport {\n hexToLch,\n type ConditionalStyle,\n type LCHColor,\n type StyleCondition,\n} from \"@ricsam/formula-engine\";\nimport type { RawConditionalFormat } from \"../xlsx/worksheet\";\nimport type { Diagnostic } from \"../types\";\nimport type { WorkbookDataArea } from \"@ricsam/formula-engine\";\nimport { rangeReferenceToSpreadsheetRange } from \"../a1\";\nimport { translateFormula } from \"./formula\";\n\nexport interface TranslatedConditionalFormat {\n areas: WorkbookDataArea[];\n condition: StyleCondition;\n}\n\nexport interface TranslateConditionalFormatOptions {\n sheetName: string;\n /** Differential formats from styles.xml, indexed by `dxfId`. */\n differentialFormats: { backgroundColor?: string; color?: string }[];\n}\n\nexport function translateConditionalFormat(\n rule: RawConditionalFormat,\n options: TranslateConditionalFormatOptions\n): { result?: TranslatedConditionalFormat; diagnostics: Diagnostic[] } {\n const diagnostics: Diagnostic[] = [];\n\n const areas: WorkbookDataArea[] = [];\n for (const reference of rule.ranges) {\n const range = rangeReferenceToSpreadsheetRange(reference);\n if (range) {\n areas.push({ sheetName: options.sheetName, range });\n }\n }\n if (areas.length === 0) {\n return { diagnostics };\n }\n\n const anchor = rule.ranges[0]?.split(\":\")[0]?.replace(/\\$/g, \"\") ?? \"A1\";\n\n if (rule.type === \"colorScale\") {\n return translateColorScale(rule, areas, options, diagnostics);\n }\n\n const condition = buildFormulaCondition(rule, anchor, options, diagnostics);\n if (!condition) {\n return { diagnostics };\n }\n\n return { result: { areas, condition }, diagnostics };\n}\n\nfunction buildFormulaCondition(\n rule: RawConditionalFormat,\n anchor: string,\n options: TranslateConditionalFormatOptions,\n diagnostics: Diagnostic[]\n): StyleCondition | undefined {\n const color = ruleColor(rule, options);\n if (!color) {\n diagnostics.push({\n severity: \"warning\",\n code: \"unsupported-conditional-format\",\n message:\n `A ${rule.type} rule was skipped because its format has no fill or ` +\n `font colour the engine can apply.`,\n sheetName: options.sheetName,\n });\n return undefined;\n }\n\n const expression = buildExpression(rule, anchor, options, diagnostics);\n if (!expression) {\n return undefined;\n }\n\n const translated = translateFormula(expression, {\n sheetName: options.sheetName,\n cellReference: anchor,\n });\n diagnostics.push(...translated.diagnostics);\n\n return { type: \"formula\", formula: translated.formula, color };\n}\n\n/**\n * Build the boolean expression for a rule, in terms of the range's anchor cell.\n */\nfunction buildExpression(\n rule: RawConditionalFormat,\n anchor: string,\n options: TranslateConditionalFormatOptions,\n diagnostics: Diagnostic[]\n): string | undefined {\n const [first, second] = rule.formulas;\n\n switch (rule.type) {\n case \"expression\":\n return first ? `=${first}` : undefined;\n\n case \"cellIs\":\n return cellIsExpression(rule.operator, anchor, first, second);\n\n case \"containsText\":\n return rule.text === undefined\n ? undefined\n : `=IFERROR(FIND(${quote(rule.text)},${anchor})>0,FALSE)`;\n\n case \"notContainsText\":\n return rule.text === undefined\n ? undefined\n : `=IFERROR(FIND(${quote(rule.text)},${anchor})>0,FALSE)=FALSE`;\n\n case \"beginsWith\":\n return rule.text === undefined\n ? undefined\n : `=EXACT(LEFT(${anchor},${rule.text.length}),${quote(rule.text)})`;\n\n case \"endsWith\":\n return rule.text === undefined\n ? undefined\n : `=EXACT(RIGHT(${anchor},${rule.text.length}),${quote(rule.text)})`;\n\n case \"containsBlanks\":\n return `=LEN(${anchor})=0`;\n\n case \"notContainsBlanks\":\n return `=LEN(${anchor})>0`;\n\n default:\n diagnostics.push({\n severity: \"warning\",\n code: \"unsupported-conditional-format\",\n message:\n `The engine cannot express a \"${rule.type}\" conditional formatting ` +\n `rule, so it was skipped.`,\n sheetName: options.sheetName,\n });\n return undefined;\n }\n}\n\nfunction cellIsExpression(\n operator: string | undefined,\n anchor: string,\n first: string | undefined,\n second: string | undefined\n): string | undefined {\n if (first === undefined) {\n return undefined;\n }\n\n switch (operator) {\n case \"equal\":\n return `=${anchor}=${first}`;\n case \"notEqual\":\n return `=${anchor}<>${first}`;\n case \"greaterThan\":\n return `=${anchor}>${first}`;\n case \"greaterThanOrEqual\":\n return `=${anchor}>=${first}`;\n case \"lessThan\":\n return `=${anchor}<${first}`;\n case \"lessThanOrEqual\":\n return `=${anchor}<=${first}`;\n case \"between\":\n return second === undefined\n ? undefined\n : `=AND(${anchor}>=${first},${anchor}<=${second})`;\n case \"notBetween\":\n return second === undefined\n ? undefined\n : `=OR(${anchor}<${first},${anchor}>${second})`;\n default:\n return undefined;\n }\n}\n\nfunction translateColorScale(\n rule: RawConditionalFormat,\n areas: WorkbookDataArea[],\n options: TranslateConditionalFormatOptions,\n diagnostics: Diagnostic[]\n): { result?: TranslatedConditionalFormat; diagnostics: Diagnostic[] } {\n const scale = rule.colorScale;\n if (!scale || scale.cfvo.length < 2 || scale.colors.length < 2) {\n return { diagnostics };\n }\n\n if (scale.cfvo.length > 2) {\n diagnostics.push({\n severity: \"info\",\n code: \"unsupported-conditional-format\",\n message:\n \"A three-colour scale was imported as a two-colour gradient between \" +\n \"its lowest and highest stops; the midpoint colour was dropped.\",\n sheetName: options.sheetName,\n });\n }\n\n const firstStop = scale.cfvo[0]!;\n const lastStop = scale.cfvo[scale.cfvo.length - 1]!;\n const firstColor = toLch(scale.colors[0]);\n const lastColor = toLch(scale.colors[scale.colors.length - 1]);\n\n if (!firstColor || !lastColor) {\n return { diagnostics };\n }\n\n const min =\n firstStop.type === \"num\" && firstStop.val !== undefined\n ? ({\n type: \"number\" as const,\n color: firstColor,\n valueFormula: `=${firstStop.val}`,\n })\n : ({ type: \"lowest_value\" as const, color: firstColor });\n\n const max =\n lastStop.type === \"num\" && lastStop.val !== undefined\n ? ({\n type: \"number\" as const,\n color: lastColor,\n valueFormula: `=${lastStop.val}`,\n })\n : ({ type: \"highest_value\" as const, color: lastColor });\n\n if (\n (firstStop.type !== \"num\" && firstStop.type !== \"min\") ||\n (lastStop.type !== \"num\" && lastStop.type !== \"max\")\n ) {\n diagnostics.push({\n severity: \"info\",\n code: \"unsupported-conditional-format\",\n message:\n `A colour scale using \"${firstStop.type}\"/\"${lastStop.type}\" stops was ` +\n \"imported as a gradient across the range's own lowest and highest \" +\n \"values.\",\n sheetName: options.sheetName,\n });\n }\n\n return {\n result: { areas, condition: { type: \"gradient\", min, max } },\n diagnostics,\n };\n}\n\n/**\n * The colour a rule paints. The engine's formula rule takes a single colour, so\n * a differential format's fill wins over its font colour.\n */\nfunction ruleColor(\n rule: RawConditionalFormat,\n options: TranslateConditionalFormatOptions\n): LCHColor | undefined {\n if (rule.dxfId === undefined) {\n return undefined;\n }\n const format = options.differentialFormats[rule.dxfId];\n if (!format) {\n return undefined;\n }\n const hex = format.backgroundColor ?? format.color;\n return hex ? hexToLch(hex) : undefined;\n}\n\nfunction toLch(argb: string | undefined): LCHColor | undefined {\n if (!argb) {\n return undefined;\n }\n const value = argb.replace(/^#/, \"\");\n const rgb = value.length === 8 ? value.slice(2) : value;\n if (!/^[0-9A-Fa-f]{6}$/.test(rgb)) {\n return undefined;\n }\n return hexToLch(`#${rgb.toLowerCase()}`);\n}\n\nfunction quote(text: string): string {\n return `\"${text.replace(/\"/g, '\"\"')}\"`;\n}\n\nexport type { ConditionalStyle };\n",
12
12
  "/**\n * Excel date handling.\n *\n * Excel stores dates as a serial number of days since an epoch, and the engine\n * has no date type. A date-formatted number would therefore display as a bare\n * serial (45000), so it is converted to an ISO 8601 string instead, which is\n * both readable and sortable.\n */\n\n/** Milliseconds in one day. */\nconst DAY_MS = 86_400_000;\n\n/**\n * Excel's 1900 date system has a deliberate bug: it treats 1900 as a leap year,\n * so serial 60 is the non-existent 1900-02-29 and every serial after it is one\n * day ahead of the true date. Serials above 60 are therefore offset by an epoch\n * of 1899-12-30 rather than 1899-12-31.\n */\nconst EPOCH_1900_UTC = Date.UTC(1899, 11, 30);\nconst EPOCH_1904_UTC = Date.UTC(1904, 0, 1);\n\nexport function excelSerialToIso(serial: number, date1904 = false): string {\n if (!Number.isFinite(serial)) {\n return String(serial);\n }\n\n const epoch = date1904 ? EPOCH_1904_UTC : EPOCH_1900_UTC;\n\n // In the 1900 system serials 1-59 map to Jan 1 - Feb 28 1900 and need the\n // extra day that the leap-year bug adds back for later serials.\n const adjusted =\n !date1904 && serial < 60 && serial >= 1 ? serial + 1 : serial;\n\n const wholeDays = Math.floor(adjusted);\n const fraction = adjusted - wholeDays;\n const ms = epoch + wholeDays * DAY_MS + Math.round(fraction * DAY_MS);\n const date = new Date(ms);\n\n if (Number.isNaN(date.getTime())) {\n return String(serial);\n }\n\n const iso = date.toISOString();\n\n // A whole serial is a date with no time component; Excel represents a\n // time-only value as a fraction below 1.\n if (fraction === 0) {\n return iso.slice(0, 10);\n }\n if (wholeDays === 0) {\n return iso.slice(11, 19);\n }\n return iso.slice(0, 19).replace(\"T\", \" \");\n}\n",
13
- "/**\n * The conversion pipeline: an .xlsx package in, `WorkbookData` out.\n */\n\nimport type {\n SerializedCellValue,\n WorkbookDataCellStyle,\n WorkbookDataConditionalStyle,\n WorkbookDataNamedExpression,\n WorkbookDataSheet,\n WorkbookDataTable,\n} from \"@ricsam/formula-engine\";\nimport { readXlsxPackage } from \"./xlsx/package\";\nimport {\n parseSharedStrings,\n parseTables,\n parseWorkbook,\n type RawTable,\n} from \"./xlsx/workbook\";\nimport { parseWorksheet, type RawCell } from \"./xlsx/worksheet\";\nimport { parseStyles, type ExcelFormat } from \"./xlsx/styles\";\nimport { offsetFormulaReferences, translateFormula } from \"./translate/formula\";\nimport { translateConditionalFormat } from \"./translate/conditional-format\";\nimport { excelSerialToIso } from \"./translate/dates\";\nimport {\n parseA1Range,\n rangeReferenceToSpreadsheetRange,\n toA1,\n toSpreadsheetRange,\n} from \"./a1\";\nimport type {\n ConvertOptions,\n ConvertResult,\n Diagnostic,\n ExcelCellMetadata,\n ExcelSheetMetadata,\n ExcelWorkbookData,\n} from \"./types\";\n\n/**\n * Excel's built-in defined names. They configure print areas and filters rather\n * than naming a value, so importing them as named expressions would be noise.\n */\nconst BUILTIN_DEFINED_NAMES = new Set([\n \"_xlnm.print_area\",\n \"_xlnm.print_titles\",\n \"_xlnm._filterdatabase\",\n \"_xlnm.criteria\",\n \"_xlnm.extract\",\n \"_xlnm.database\",\n \"_xlnm.sheet_title\",\n]);\n\nexport async function convertWorkbook(\n source: Blob | ArrayBuffer | Uint8Array,\n options: ConvertOptions = {}\n): Promise<ConvertResult> {\n const {\n styles: importStyles = true,\n conditionalFormatting: importConditionalFormatting = true,\n tables: importTables = true,\n definedNames: importDefinedNames = true,\n cellMetadata: importCellMetadata = true,\n convertDates = true,\n } = options;\n\n const diagnostics: Diagnostic[] = [];\n const pkg = await readXlsxPackage(source);\n\n const sharedStrings = parseSharedStrings(pkg);\n const { sheets: sheetEntries, definedNames, date1904 } = parseWorkbook(pkg);\n const styleTable = parseStyles(pkg);\n\n const selected = options.sheets\n ? sheetEntries.filter((entry) => options.sheets!.includes(entry.name))\n : sheetEntries;\n\n const sheets: WorkbookDataSheet<ExcelCellMetadata, ExcelSheetMetadata>[] = [];\n const tables: WorkbookDataTable[] = [];\n const cellStyles: WorkbookDataCellStyle[] = [];\n const conditionalStyles: WorkbookDataConditionalStyle[] = [];\n const importedSheetNames = new Set<string>();\n\n for (const entry of selected) {\n const worksheet = parseWorksheet(pkg, entry.partPath, sharedStrings);\n importedSheetNames.add(entry.name);\n\n const content = new Map<string, SerializedCellValue>();\n const cellMetadata = new Map<string, ExcelCellMetadata>();\n // Cells sharing one style are collected so each distinct style becomes a\n // single engine rule over many areas rather than one rule per cell.\n const styleGroups = new Map<number, RawCell[]>();\n\n for (const cell of worksheet.cells) {\n const format =\n cell.styleIndex === undefined\n ? undefined\n : styleTable.formats[cell.styleIndex];\n\n const value = cellValue(cell, format, {\n convertDates,\n date1904,\n sheetName: entry.name,\n diagnostics,\n });\n if (value !== undefined) {\n content.set(cell.reference, value);\n }\n\n if (importStyles && cell.styleIndex !== undefined && format) {\n if (Object.keys(format.style).length > 0) {\n const group = styleGroups.get(cell.styleIndex);\n if (group) {\n group.push(cell);\n } else {\n styleGroups.set(cell.styleIndex, [cell]);\n }\n }\n }\n\n if (importCellMetadata) {\n const metadata: ExcelCellMetadata = {};\n if (format?.numberFormat) {\n metadata.numberFormat = format.numberFormat;\n }\n const hyperlink = worksheet.hyperlinks[cell.reference];\n if (hyperlink) {\n metadata.hyperlink = hyperlink;\n }\n if (Object.keys(metadata).length > 0) {\n cellMetadata.set(cell.reference, metadata);\n }\n }\n }\n\n if (importStyles) {\n for (const [styleIndex, cells] of styleGroups) {\n const format = styleTable.formats[styleIndex];\n if (!format) {\n continue;\n }\n cellStyles.push({\n areas: coalesceCellsIntoAreas(entry.name, cells),\n style: format.style,\n });\n }\n }\n\n if (importConditionalFormatting) {\n // Excel evaluates the lowest priority number last, so it wins. The engine\n // applies later rules on top, so rules are emitted in reverse priority.\n const ordered = [...worksheet.conditionalFormats].sort(\n (a, b) => b.priority - a.priority\n );\n for (const rule of ordered) {\n const { result, diagnostics: ruleDiagnostics } =\n translateConditionalFormat(rule, {\n sheetName: entry.name,\n differentialFormats: styleTable.differentialFormats,\n });\n diagnostics.push(...ruleDiagnostics);\n if (result) {\n conditionalStyles.push(result);\n }\n }\n }\n\n if (importTables) {\n for (const table of parseTables(pkg, entry.partPath)) {\n const converted = convertTable(table, entry.name, diagnostics);\n if (converted) {\n tables.push(converted);\n }\n }\n }\n\n const sheetMetadata: ExcelSheetMetadata = {};\n if (Object.keys(worksheet.columnWidths).length > 0) {\n sheetMetadata.columnWidths = worksheet.columnWidths;\n }\n if (Object.keys(worksheet.rowHeights).length > 0) {\n sheetMetadata.rowHeights = worksheet.rowHeights;\n }\n if (worksheet.merges.length > 0) {\n sheetMetadata.merges = worksheet.merges;\n }\n if (worksheet.frozen) {\n sheetMetadata.frozen = worksheet.frozen;\n }\n if (entry.state !== \"visible\") {\n sheetMetadata.visible = false;\n }\n\n sheets.push({\n name: entry.name,\n content,\n cellMetadata: cellMetadata.size > 0 ? cellMetadata : undefined,\n sheetMetadata:\n Object.keys(sheetMetadata).length > 0 ? sheetMetadata : undefined,\n });\n }\n\n const namedExpressions = importDefinedNames\n ? convertDefinedNames(\n definedNames,\n sheetEntries.map((entry) => entry.name),\n importedSheetNames,\n diagnostics\n )\n : [];\n\n const data: ExcelWorkbookData = {\n sheets,\n tables: tables.length > 0 ? tables : undefined,\n namedExpressions:\n namedExpressions.length > 0 ? namedExpressions : undefined,\n cellStyles: cellStyles.length > 0 ? cellStyles : undefined,\n conditionalStyles:\n conditionalStyles.length > 0 ? conditionalStyles : undefined,\n workbookMetadata: {\n fileName: options.fileName,\n sheetOrder: sheetEntries.map((entry) => entry.name),\n diagnostics: diagnostics.length > 0 ? diagnostics : undefined,\n },\n };\n\n return { data, diagnostics };\n}\n\ninterface CellValueContext {\n convertDates: boolean;\n date1904: boolean;\n sheetName: string;\n diagnostics: Diagnostic[];\n}\n\n/**\n * The engine stores a cell as a formula string, a literal, or nothing. A cell\n * with a formula keeps the formula: Excel's cached result is discarded, because\n * the engine recalculates.\n */\nfunction cellValue(\n cell: RawCell,\n format: ExcelFormat | undefined,\n context: CellValueContext\n): SerializedCellValue {\n if (cell.formula !== undefined) {\n const body = cell.formulaOffset\n ? offsetFormulaReferences(\n cell.formula,\n cell.formulaOffset.cols,\n cell.formulaOffset.rows\n )\n : cell.formula;\n\n const translated = translateFormula(body, {\n sheetName: context.sheetName,\n cellReference: cell.reference,\n });\n context.diagnostics.push(...translated.diagnostics);\n return translated.formula;\n }\n\n switch (cell.kind) {\n case \"number\": {\n const value = cell.value as number;\n if (context.convertDates && format?.isDateFormat) {\n return excelSerialToIso(value, context.date1904);\n }\n return value;\n }\n case \"boolean\":\n return cell.value as boolean;\n case \"string\":\n return cell.value as string;\n case \"date\":\n return cell.value as string;\n case \"error\":\n // Excel's own error text is valid engine cell content.\n return cell.value as string;\n case \"empty\":\n return undefined;\n }\n}\n\nfunction convertTable(\n table: RawTable,\n sheetName: string,\n diagnostics: Diagnostic[]\n): WorkbookDataTable | undefined {\n const parsed = parseA1Range(table.ref);\n if (!parsed) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message: `Table \"${table.displayName}\" has an unreadable range (${table.ref}).`,\n sheetName,\n });\n return undefined;\n }\n\n if (table.headerRowCount === 0) {\n // The engine requires a header row, since structured references name it.\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message:\n `Table \"${table.displayName}\" has no header row, which the engine ` +\n `requires for structured references, so it was skipped.`,\n sheetName,\n });\n return undefined;\n }\n\n const numCols = parsed.end.colIndex - parsed.start.colIndex + 1;\n const dataRows =\n parsed.end.rowIndex -\n parsed.start.rowIndex +\n 1 -\n table.headerRowCount -\n table.totalsRowCount;\n\n if (numCols <= 0 || dataRows < 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message: `Table \"${table.displayName}\" has an empty range (${table.ref}).`,\n sheetName,\n });\n return undefined;\n }\n\n return {\n name: table.displayName,\n sheetName,\n start: toA1(parsed.start),\n numRows: { type: \"number\", value: dataRows },\n numCols,\n };\n}\n\nfunction convertDefinedNames(\n definedNames: { name: string; formula: string; localSheetId?: number; hidden: boolean }[],\n sheetNames: string[],\n importedSheetNames: Set<string>,\n diagnostics: Diagnostic[]\n): WorkbookDataNamedExpression[] {\n const result: WorkbookDataNamedExpression[] = [];\n\n for (const definedName of definedNames) {\n if (BUILTIN_DEFINED_NAMES.has(definedName.name.toLowerCase())) {\n continue;\n }\n if (definedName.hidden || definedName.formula.trim() === \"\") {\n continue;\n }\n if (definedName.formula.includes(\"#REF!\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-defined-name\",\n message: `Defined name \"${definedName.name}\" refers to a deleted range.`,\n source: definedName.formula,\n });\n continue;\n }\n\n const sheetName =\n definedName.localSheetId === undefined\n ? undefined\n : sheetNames[definedName.localSheetId];\n\n if (sheetName !== undefined && !importedSheetNames.has(sheetName)) {\n continue;\n }\n\n // Named expressions are stored as a formula body with no leading \"=\".\n const translated = translateFormula(definedName.formula);\n diagnostics.push(...translated.diagnostics);\n\n result.push({\n name: definedName.name,\n expression: translated.formula.slice(1),\n sheetName,\n });\n }\n\n return result;\n}\n\n/**\n * Turn a set of cells sharing one style into as few rectangular areas as\n * possible.\n *\n * Excel's style model is per-cell, but the engine's is per-area, so emitting\n * one area per cell would produce enormous rule lists on real workbooks. Cells\n * are merged into horizontal runs, then adjacent identical runs are merged\n * vertically into blocks.\n */\nexport function coalesceCellsIntoAreas(\n sheetName: string,\n cells: { colIndex: number; rowIndex: number }[]\n): { sheetName: string; range: ReturnType<typeof toSpreadsheetRange> }[] {\n const byRow = new Map<number, number[]>();\n for (const cell of cells) {\n const row = byRow.get(cell.rowIndex);\n if (row) {\n row.push(cell.colIndex);\n } else {\n byRow.set(cell.rowIndex, [cell.colIndex]);\n }\n }\n\n interface Run {\n rowIndex: number;\n startCol: number;\n endCol: number;\n }\n\n const runs: Run[] = [];\n for (const [rowIndex, columns] of byRow) {\n columns.sort((a, b) => a - b);\n let startCol = columns[0]!;\n let previous = startCol;\n for (let i = 1; i < columns.length; i++) {\n const current = columns[i]!;\n if (current === previous + 1) {\n previous = current;\n continue;\n }\n runs.push({ rowIndex, startCol, endCol: previous });\n startCol = current;\n previous = current;\n }\n runs.push({ rowIndex, startCol, endCol: previous });\n }\n\n // Merge runs with identical column spans in consecutive rows into blocks.\n runs.sort((a, b) =>\n a.startCol - b.startCol || a.endCol - b.endCol || a.rowIndex - b.rowIndex\n );\n\n const areas: { sheetName: string; range: ReturnType<typeof toSpreadsheetRange> }[] = [];\n let index = 0;\n while (index < runs.length) {\n const first = runs[index]!;\n let lastRow = first.rowIndex;\n let next = index + 1;\n while (\n next < runs.length &&\n runs[next]!.startCol === first.startCol &&\n runs[next]!.endCol === first.endCol &&\n runs[next]!.rowIndex === lastRow + 1\n ) {\n lastRow = runs[next]!.rowIndex;\n next++;\n }\n\n areas.push({\n sheetName,\n range: toSpreadsheetRange({\n start: { colIndex: first.startCol, rowIndex: first.rowIndex },\n end: { colIndex: first.endCol, rowIndex: lastRow },\n }),\n });\n index = next;\n }\n\n return areas;\n}\n\nexport { rangeReferenceToSpreadsheetRange };\n",
14
- "/**\n * excel-to-formula-engine\n *\n * Converts an Excel .xlsx file into `WorkbookData` for `@ricsam/formula-engine`,\n * in the browser and in Node/Bun.\n *\n * ```ts\n * const data = await excelToFormulaEngine(blob);\n * engine.addWorkbook({ workbookName: \"Budget\", data });\n * ```\n */\n\nimport { convertWorkbook } from \"./src/convert\";\nimport type {\n ConvertOptions,\n ConvertResult,\n ExcelWorkbookData,\n} from \"./src/types\";\n\n/**\n * Convert an Excel file into engine `WorkbookData`.\n *\n * Accepts a `Blob` or `File` from a file input, or raw bytes. The result is\n * ready to hand to `FormulaEngine.addWorkbook`.\n *\n * Anything that could not be translated is reported in\n * `data.workbookMetadata.diagnostics`; use {@link excelToFormulaEngineDetailed}\n * when you want the diagnostics alongside the data instead.\n *\n * @throws when the input is not a readable .xlsx package.\n */\nexport async function excelToFormulaEngine(\n source: Blob | ArrayBuffer | Uint8Array,\n options?: ConvertOptions\n): Promise<ExcelWorkbookData> {\n const { data } = await convertWorkbook(source, withFileName(source, options));\n return data;\n}\n\n/**\n * Convert an Excel file, returning the data and the translation diagnostics as\n * separate values.\n */\nexport async function excelToFormulaEngineDetailed(\n source: Blob | ArrayBuffer | Uint8Array,\n options?: ConvertOptions\n): Promise<ConvertResult> {\n return convertWorkbook(source, withFileName(source, options));\n}\n\n/** Pick up the name from a `File` so it lands in workbook metadata. */\nfunction withFileName(\n source: Blob | ArrayBuffer | Uint8Array,\n options: ConvertOptions | undefined\n): ConvertOptions {\n if (options?.fileName !== undefined) {\n return options;\n }\n const name =\n typeof File !== \"undefined\" && source instanceof File\n ? source.name\n : undefined;\n return name ? { ...options, fileName: name } : { ...options };\n}\n\nexport { convertWorkbook };\n\nexport type {\n ConvertOptions,\n ConvertResult,\n Diagnostic,\n DiagnosticCode,\n DiagnosticSeverity,\n ExcelCellMetadata,\n ExcelSheetMetadata,\n ExcelWorkbookData,\n ExcelWorkbookMetadata,\n} from \"./src/types\";\n\nexport {\n findUnsupportedFunctions,\n offsetFormulaReferences,\n translateFormula,\n} from \"./src/translate/formula\";\n\nexport { excelSerialToIso } from \"./src/translate/dates\";\n\nexport {\n columnIndexToLabel,\n columnLabelToIndex,\n parseA1,\n parseA1Range,\n toA1,\n} from \"./src/a1\";\n"
13
+ "/**\n * The conversion pipeline: an .xlsx package in, `WorkbookData` out.\n */\n\nimport type {\n SerializedCellValue,\n WorkbookDataCellStyle,\n WorkbookDataConditionalStyle,\n WorkbookDataNamedExpression,\n WorkbookDataSheet,\n WorkbookDataTable,\n} from \"@ricsam/formula-engine\";\nimport { readXlsxPackage } from \"./xlsx/package\";\nimport {\n parseSharedStrings,\n parseTables,\n parseWorkbook,\n type RawTable,\n} from \"./xlsx/workbook\";\nimport { parseWorksheet, type RawCell } from \"./xlsx/worksheet\";\nimport { parseStyles, type ExcelFormat } from \"./xlsx/styles\";\nimport { offsetFormulaReferences, translateFormula } from \"./translate/formula\";\nimport { translateConditionalFormat } from \"./translate/conditional-format\";\nimport { excelSerialToIso } from \"./translate/dates\";\nimport {\n parseA1Range,\n rangeReferenceToSpreadsheetRange,\n toA1,\n toSpreadsheetRange,\n type ParsedRange,\n} from \"./a1\";\nimport type {\n ConvertOptions,\n ConvertResult,\n Diagnostic,\n ExcelCellMetadata,\n ExcelSheetMetadata,\n ExcelWorkbookData,\n} from \"./types\";\n\n/**\n * Excel's built-in defined names. They configure print areas and filters rather\n * than naming a value, so importing them as named expressions would be noise.\n */\nconst BUILTIN_DEFINED_NAMES = new Set([\n \"_xlnm.print_area\",\n \"_xlnm.print_titles\",\n \"_xlnm._filterdatabase\",\n \"_xlnm.criteria\",\n \"_xlnm.extract\",\n \"_xlnm.database\",\n \"_xlnm.sheet_title\",\n]);\n\nexport async function convertWorkbook(\n source: Blob | ArrayBuffer | Uint8Array,\n options: ConvertOptions = {}\n): Promise<ConvertResult> {\n const {\n styles: importStyles = true,\n conditionalFormatting: importConditionalFormatting = true,\n tables: importTables = true,\n definedNames: importDefinedNames = true,\n cellMetadata: importCellMetadata = true,\n convertDates = true,\n } = options;\n\n const diagnostics: Diagnostic[] = [];\n const pkg = await readXlsxPackage(source);\n\n const sharedStrings = parseSharedStrings(pkg);\n const { sheets: sheetEntries, definedNames, date1904 } = parseWorkbook(pkg);\n const styleTable = parseStyles(pkg);\n\n const selected = options.sheets\n ? sheetEntries.filter((entry) => options.sheets!.includes(entry.name))\n : sheetEntries;\n\n const sheets: WorkbookDataSheet<ExcelCellMetadata, ExcelSheetMetadata>[] = [];\n const tables: WorkbookDataTable[] = [];\n const cellStyles: WorkbookDataCellStyle[] = [];\n const conditionalStyles: WorkbookDataConditionalStyle[] = [];\n const importedSheetNames = new Set<string>();\n\n for (const entry of selected) {\n const worksheet = parseWorksheet(pkg, entry.partPath, sharedStrings);\n importedSheetNames.add(entry.name);\n\n /*\n Tables are read before the cells are, because a formula's translation\n depends on whether its own cell sits inside one: Excel stores a calculated\n column's reference as `Table[[#This Row],[Col]]` and displays it as\n `[@Col]`, and reproducing that needs to know which table \"this row\" is in.\n */\n const sheetTables = importTables ? parseTables(pkg, entry.partPath) : [];\n const tableRanges = sheetTables\n .map((table) => ({ name: table.displayName, range: parseA1Range(table.ref) }))\n .filter(\n (entryTable): entryTable is { name: string; range: ParsedRange } =>\n entryTable.range !== undefined\n );\n\n /** The table a cell sits inside, or undefined when it sits in none. */\n const tableAt = (colIndex: number, rowIndex: number): string | undefined =>\n tableRanges.find(\n ({ range }) =>\n colIndex >= range.start.colIndex &&\n colIndex <= range.end.colIndex &&\n rowIndex >= range.start.rowIndex &&\n rowIndex <= range.end.rowIndex\n )?.name;\n\n const content = new Map<string, SerializedCellValue>();\n const cellMetadata = new Map<string, ExcelCellMetadata>();\n // Cells sharing one style are collected so each distinct style becomes a\n // single engine rule over many areas rather than one rule per cell.\n const styleGroups = new Map<number, RawCell[]>();\n\n for (const cell of worksheet.cells) {\n const format =\n cell.styleIndex === undefined\n ? undefined\n : styleTable.formats[cell.styleIndex];\n\n const value = cellValue(cell, format, {\n convertDates,\n date1904,\n sheetName: entry.name,\n diagnostics,\n containingTableName: tableAt(cell.colIndex, cell.rowIndex),\n });\n if (value !== undefined) {\n content.set(cell.reference, value);\n }\n\n if (importStyles && cell.styleIndex !== undefined && format) {\n if (Object.keys(format.style).length > 0) {\n const group = styleGroups.get(cell.styleIndex);\n if (group) {\n group.push(cell);\n } else {\n styleGroups.set(cell.styleIndex, [cell]);\n }\n }\n }\n\n if (importCellMetadata) {\n const metadata: ExcelCellMetadata = {};\n if (format?.numberFormat) {\n metadata.numberFormat = format.numberFormat;\n }\n const hyperlink = worksheet.hyperlinks[cell.reference];\n if (hyperlink) {\n metadata.hyperlink = hyperlink;\n }\n if (Object.keys(metadata).length > 0) {\n cellMetadata.set(cell.reference, metadata);\n }\n }\n }\n\n if (importStyles) {\n for (const [styleIndex, cells] of styleGroups) {\n const format = styleTable.formats[styleIndex];\n if (!format) {\n continue;\n }\n cellStyles.push({\n areas: coalesceCellsIntoAreas(entry.name, cells),\n style: format.style,\n });\n }\n }\n\n if (importConditionalFormatting) {\n // Excel evaluates the lowest priority number last, so it wins. The engine\n // applies later rules on top, so rules are emitted in reverse priority.\n const ordered = [...worksheet.conditionalFormats].sort(\n (a, b) => b.priority - a.priority\n );\n for (const rule of ordered) {\n const { result, diagnostics: ruleDiagnostics } =\n translateConditionalFormat(rule, {\n sheetName: entry.name,\n differentialFormats: styleTable.differentialFormats,\n });\n diagnostics.push(...ruleDiagnostics);\n if (result) {\n conditionalStyles.push(result);\n }\n }\n }\n\n if (importTables) {\n for (const table of sheetTables) {\n const converted = convertTable(table, entry.name, diagnostics);\n if (converted) {\n tables.push(converted);\n }\n }\n }\n\n const sheetMetadata: ExcelSheetMetadata = {};\n if (Object.keys(worksheet.columnWidths).length > 0) {\n sheetMetadata.columnWidths = worksheet.columnWidths;\n }\n if (Object.keys(worksheet.rowHeights).length > 0) {\n sheetMetadata.rowHeights = worksheet.rowHeights;\n }\n if (worksheet.merges.length > 0) {\n sheetMetadata.merges = worksheet.merges;\n }\n if (worksheet.frozen) {\n sheetMetadata.frozen = worksheet.frozen;\n }\n if (entry.state !== \"visible\") {\n sheetMetadata.visible = false;\n }\n\n sheets.push({\n name: entry.name,\n content,\n cellMetadata: cellMetadata.size > 0 ? cellMetadata : undefined,\n sheetMetadata:\n Object.keys(sheetMetadata).length > 0 ? sheetMetadata : undefined,\n });\n }\n\n const namedExpressions = importDefinedNames\n ? convertDefinedNames(\n definedNames,\n sheetEntries.map((entry) => entry.name),\n importedSheetNames,\n diagnostics\n )\n : [];\n\n const data: ExcelWorkbookData = {\n sheets,\n tables: tables.length > 0 ? tables : undefined,\n namedExpressions:\n namedExpressions.length > 0 ? namedExpressions : undefined,\n cellStyles: cellStyles.length > 0 ? cellStyles : undefined,\n conditionalStyles:\n conditionalStyles.length > 0 ? conditionalStyles : undefined,\n workbookMetadata: {\n fileName: options.fileName,\n sheetOrder: sheetEntries.map((entry) => entry.name),\n diagnostics: diagnostics.length > 0 ? diagnostics : undefined,\n },\n };\n\n return { data, diagnostics };\n}\n\ninterface CellValueContext {\n convertDates: boolean;\n date1904: boolean;\n sheetName: string;\n diagnostics: Diagnostic[];\n /** The table this cell sits inside, when it sits inside one. */\n containingTableName?: string;\n}\n\n/**\n * The engine stores a cell as a formula string, a literal, or nothing. A cell\n * with a formula keeps the formula: Excel's cached result is discarded, because\n * the engine recalculates.\n */\nfunction cellValue(\n cell: RawCell,\n format: ExcelFormat | undefined,\n context: CellValueContext\n): SerializedCellValue {\n if (cell.formula !== undefined) {\n const body = cell.formulaOffset\n ? offsetFormulaReferences(\n cell.formula,\n cell.formulaOffset.cols,\n cell.formulaOffset.rows\n )\n : cell.formula;\n\n const translated = translateFormula(body, {\n sheetName: context.sheetName,\n cellReference: cell.reference,\n containingTableName: context.containingTableName,\n });\n context.diagnostics.push(...translated.diagnostics);\n return translated.formula;\n }\n\n switch (cell.kind) {\n case \"number\": {\n const value = cell.value as number;\n if (context.convertDates && format?.isDateFormat) {\n return excelSerialToIso(value, context.date1904);\n }\n return value;\n }\n case \"boolean\":\n return cell.value as boolean;\n case \"string\":\n return cell.value as string;\n case \"date\":\n return cell.value as string;\n case \"error\":\n // Excel's own error text is valid engine cell content.\n return cell.value as string;\n case \"empty\":\n return undefined;\n }\n}\n\nfunction convertTable(\n table: RawTable,\n sheetName: string,\n diagnostics: Diagnostic[]\n): WorkbookDataTable | undefined {\n const parsed = parseA1Range(table.ref);\n if (!parsed) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message: `Table \"${table.displayName}\" has an unreadable range (${table.ref}).`,\n sheetName,\n });\n return undefined;\n }\n\n if (table.headerRowCount === 0) {\n // The engine requires a header row, since structured references name it.\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message:\n `Table \"${table.displayName}\" has no header row, which the engine ` +\n `requires for structured references, so it was skipped.`,\n sheetName,\n });\n return undefined;\n }\n\n const numCols = parsed.end.colIndex - parsed.start.colIndex + 1;\n const dataRows =\n parsed.end.rowIndex -\n parsed.start.rowIndex +\n 1 -\n table.headerRowCount -\n table.totalsRowCount;\n\n if (numCols <= 0 || dataRows < 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message: `Table \"${table.displayName}\" has an empty range (${table.ref}).`,\n sheetName,\n });\n return undefined;\n }\n\n return {\n name: table.displayName,\n sheetName,\n start: toA1(parsed.start),\n numRows: { type: \"number\", value: dataRows },\n numCols,\n };\n}\n\nfunction convertDefinedNames(\n definedNames: { name: string; formula: string; localSheetId?: number; hidden: boolean }[],\n sheetNames: string[],\n importedSheetNames: Set<string>,\n diagnostics: Diagnostic[]\n): WorkbookDataNamedExpression[] {\n const result: WorkbookDataNamedExpression[] = [];\n\n for (const definedName of definedNames) {\n if (BUILTIN_DEFINED_NAMES.has(definedName.name.toLowerCase())) {\n continue;\n }\n if (definedName.hidden || definedName.formula.trim() === \"\") {\n continue;\n }\n if (definedName.formula.includes(\"#REF!\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-defined-name\",\n message: `Defined name \"${definedName.name}\" refers to a deleted range.`,\n source: definedName.formula,\n });\n continue;\n }\n\n const sheetName =\n definedName.localSheetId === undefined\n ? undefined\n : sheetNames[definedName.localSheetId];\n\n if (sheetName !== undefined && !importedSheetNames.has(sheetName)) {\n continue;\n }\n\n // Named expressions are stored as a formula body with no leading \"=\".\n const translated = translateFormula(definedName.formula);\n diagnostics.push(...translated.diagnostics);\n\n result.push({\n name: definedName.name,\n expression: translated.formula.slice(1),\n sheetName,\n });\n }\n\n return result;\n}\n\n/**\n * Turn a set of cells sharing one style into as few rectangular areas as\n * possible.\n *\n * Excel's style model is per-cell, but the engine's is per-area, so emitting\n * one area per cell would produce enormous rule lists on real workbooks. Cells\n * are merged into horizontal runs, then adjacent identical runs are merged\n * vertically into blocks.\n */\nexport function coalesceCellsIntoAreas(\n sheetName: string,\n cells: { colIndex: number; rowIndex: number }[]\n): { sheetName: string; range: ReturnType<typeof toSpreadsheetRange> }[] {\n const byRow = new Map<number, number[]>();\n for (const cell of cells) {\n const row = byRow.get(cell.rowIndex);\n if (row) {\n row.push(cell.colIndex);\n } else {\n byRow.set(cell.rowIndex, [cell.colIndex]);\n }\n }\n\n interface Run {\n rowIndex: number;\n startCol: number;\n endCol: number;\n }\n\n const runs: Run[] = [];\n for (const [rowIndex, columns] of byRow) {\n columns.sort((a, b) => a - b);\n let startCol = columns[0]!;\n let previous = startCol;\n for (let i = 1; i < columns.length; i++) {\n const current = columns[i]!;\n if (current === previous + 1) {\n previous = current;\n continue;\n }\n runs.push({ rowIndex, startCol, endCol: previous });\n startCol = current;\n previous = current;\n }\n runs.push({ rowIndex, startCol, endCol: previous });\n }\n\n // Merge runs with identical column spans in consecutive rows into blocks.\n runs.sort((a, b) =>\n a.startCol - b.startCol || a.endCol - b.endCol || a.rowIndex - b.rowIndex\n );\n\n const areas: { sheetName: string; range: ReturnType<typeof toSpreadsheetRange> }[] = [];\n let index = 0;\n while (index < runs.length) {\n const first = runs[index]!;\n let lastRow = first.rowIndex;\n let next = index + 1;\n while (\n next < runs.length &&\n runs[next]!.startCol === first.startCol &&\n runs[next]!.endCol === first.endCol &&\n runs[next]!.rowIndex === lastRow + 1\n ) {\n lastRow = runs[next]!.rowIndex;\n next++;\n }\n\n areas.push({\n sheetName,\n range: toSpreadsheetRange({\n start: { colIndex: first.startCol, rowIndex: first.rowIndex },\n end: { colIndex: first.endCol, rowIndex: lastRow },\n }),\n });\n index = next;\n }\n\n return areas;\n}\n\nexport { rangeReferenceToSpreadsheetRange };\n",
14
+ "/**\n * Delimited-text parsing: CSV, TSV, and the semicolon-separated files a\n * comma-decimal locale produces.\n *\n * Follows RFC 4180 for quoting — a field wrapped in double quotes may contain\n * the delimiter, line breaks, and doubled quotes standing for one — because that\n * is what every spreadsheet writes and the naive `split(\",\")` gets wrong on the\n * first address field it meets.\n */\n\n/** Delimiters worth guessing between. */\nexport const CANDIDATE_DELIMITERS = [\",\", \"\\t\", \";\", \"|\"] as const;\n\nexport type Delimiter = string;\n\n/**\n * Split delimited text into rows of raw string fields.\n *\n * Values keep the exact text they had: trimming and type conversion are separate\n * decisions made later, where the caller's options are in scope.\n */\nexport function parseDelimitedText(text: string, delimiter: Delimiter): string[][] {\n const rows: string[][] = [];\n let row: string[] = [];\n let field = \"\";\n let inQuotes = false;\n let fieldWasQuoted = false;\n // Distinguishes \"no fields yet\" from \"one empty field\", so a trailing newline\n // does not produce a spurious final row.\n let rowHasContent = false;\n\n const endField = () => {\n row.push(field);\n field = \"\";\n fieldWasQuoted = false;\n rowHasContent = true;\n };\n\n const endRow = () => {\n endField();\n rows.push(row);\n row = [];\n rowHasContent = false;\n };\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i]!;\n\n if (inQuotes) {\n if (char === '\"') {\n if (text[i + 1] === '\"') {\n // A doubled quote inside a quoted field is one literal quote.\n field += '\"';\n i++;\n } else {\n inQuotes = false;\n }\n } else {\n field += char;\n }\n continue;\n }\n\n if (char === '\"' && field.length === 0) {\n inQuotes = true;\n fieldWasQuoted = true;\n continue;\n }\n\n if (char === delimiter) {\n endField();\n continue;\n }\n\n if (char === \"\\r\") {\n // Treat CRLF and a bare CR as one line ending.\n if (text[i + 1] === \"\\n\") i++;\n endRow();\n continue;\n }\n\n if (char === \"\\n\") {\n endRow();\n continue;\n }\n\n field += char;\n }\n\n // A file not ending in a newline still has a last row; one that does should\n // not gain an empty one. A lone quoted empty field counts as content.\n if (field.length > 0 || fieldWasQuoted || rowHasContent) {\n endRow();\n }\n\n return rows;\n}\n\n/**\n * Guess the delimiter from the text itself.\n *\n * Scores each candidate on how *consistently* it splits the first several lines\n * rather than on how often it appears: prose full of commas scores badly because\n * its lines disagree about the field count, while a two-column TSV scores\n * perfectly on one tab per line. Quoted sections are skipped, so a comma inside\n * `\"Smith, J\"` never votes for comma.\n *\n * Falls back to comma, which is both the commonest and the least surprising\n * thing to be wrong about.\n */\nexport function detectDelimiter(\n text: string,\n candidates: readonly string[] = CANDIDATE_DELIMITERS\n): Delimiter {\n const lines = takeSampleLines(text, 20);\n if (lines.length === 0) return \",\";\n\n let best: { delimiter: string; score: number } | undefined;\n\n for (const delimiter of candidates) {\n const counts = lines.map((line) => countOutsideQuotes(line, delimiter));\n const present = counts.filter((count) => count > 0);\n // A delimiter that never appears is not a candidate.\n if (present.length === 0) continue;\n\n const first = counts[0]!;\n // Consistency across lines is the signal; ties break toward more fields,\n // which is what distinguishes the real delimiter from one that happens to\n // appear once per line inside the data.\n const consistent = counts.filter((count) => count === first).length;\n const score = consistent / counts.length + Math.min(first, 50) / 1000;\n\n if (!best || score > best.score) {\n best = { delimiter, score };\n }\n }\n\n return best?.delimiter ?? \",\";\n}\n\n/**\n * The first `limit` non-empty lines, ignoring line breaks inside quoted fields.\n */\nfunction takeSampleLines(text: string, limit: number): string[] {\n const lines: string[] = [];\n let current = \"\";\n let inQuotes = false;\n\n for (let i = 0; i < text.length && lines.length < limit; i++) {\n const char = text[i]!;\n\n if (char === '\"') {\n if (inQuotes && text[i + 1] === '\"') {\n current += '\"\"';\n i++;\n continue;\n }\n inQuotes = !inQuotes;\n current += char;\n continue;\n }\n\n if (!inQuotes && (char === \"\\n\" || char === \"\\r\")) {\n if (char === \"\\r\" && text[i + 1] === \"\\n\") i++;\n if (current.trim().length > 0) lines.push(current);\n current = \"\";\n continue;\n }\n\n current += char;\n }\n\n if (current.trim().length > 0 && lines.length < limit) lines.push(current);\n return lines;\n}\n\nfunction countOutsideQuotes(line: string, delimiter: string): number {\n let count = 0;\n let inQuotes = false;\n\n for (let i = 0; i < line.length; i++) {\n const char = line[i]!;\n if (char === '\"') {\n if (inQuotes && line[i + 1] === '\"') {\n i++;\n continue;\n }\n inQuotes = !inQuotes;\n continue;\n }\n if (!inQuotes && char === delimiter) count++;\n }\n\n return count;\n}\n\n/**\n * Strip a UTF-8 byte-order mark.\n *\n * Excel writes one on every CSV it exports, and left in place it becomes part of\n * the first header cell — where it is invisible, so the column looks right and\n * every lookup against its name silently misses.\n */\nexport function stripBom(text: string): string {\n return text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;\n}\n",
15
+ "/**\n * Delimited text in, `WorkbookData` out.\n *\n * The interesting decisions here are all about what a bare string *is*. A CSV\n * carries no types, so every cell is a judgement call, and the ones that matter\n * are the cases where guessing wrong destroys data rather than merely looking\n * wrong: a leading-zero part number, an identifier too long for a float.\n */\n\nimport type { SerializedCellValue } from \"@ricsam/formula-engine\";\nimport { columnIndexToLabel } from \"../a1\";\nimport { translateFormula } from \"../translate/formula\";\nimport type {\n CsvConvertOptions,\n Diagnostic,\n ExcelWorkbookData,\n} from \"../types\";\nimport { detectDelimiter, parseDelimitedText, stripBom } from \"./parse\";\n\nexport interface ConvertCsvResult {\n data: ExcelWorkbookData;\n diagnostics: Diagnostic[];\n}\n\n/** Cells beyond this are refused rather than silently locking up the tab. */\nconst MAX_CELLS = 2_000_000;\n\nexport function convertDelimitedText(\n text: string,\n options: CsvConvertOptions = {}\n): ConvertCsvResult {\n const {\n sheetName = \"Sheet1\",\n fileName,\n parseNumbers = true,\n parseBooleans = true,\n trimFields = false,\n } = options;\n\n const diagnostics: Diagnostic[] = [];\n const body = stripBom(text);\n const delimiter = options.delimiter ?? detectDelimiter(body);\n const rows = parseDelimitedText(body, delimiter);\n\n const widest = rows.reduce((max, row) => Math.max(max, row.length), 0);\n if (rows.length * widest > MAX_CELLS) {\n throw new Error(\n `The file has about ${rows.length * widest} cells, more than the ` +\n `${MAX_CELLS} this importer will load at once.`\n );\n }\n\n const content = new Map<string, SerializedCellValue>();\n\n for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n const row = rows[rowIndex]!;\n for (let colIndex = 0; colIndex < row.length; colIndex++) {\n const raw = trimFields ? row[colIndex]!.trim() : row[colIndex]!;\n // An empty cell is absent rather than an empty string: the engine deletes\n // empty values anyway, and a sparse sheet is the point of its storage.\n if (raw.length === 0) continue;\n\n const reference = `${columnIndexToLabel(colIndex)}${rowIndex + 1}`;\n content.set(\n reference,\n toCellValue(raw, {\n parseNumbers,\n parseBooleans,\n sheetName,\n reference,\n diagnostics,\n })\n );\n }\n }\n\n const data: ExcelWorkbookData = {\n sheets: [{ name: sheetName, content }],\n workbookMetadata: {\n fileName,\n sheetOrder: [sheetName],\n diagnostics: diagnostics.length > 0 ? diagnostics : undefined,\n },\n };\n\n return { data, diagnostics };\n}\n\ninterface ToCellValueContext {\n parseNumbers: boolean;\n parseBooleans: boolean;\n sheetName: string;\n reference: string;\n diagnostics: Diagnostic[];\n}\n\nfunction toCellValue(raw: string, context: ToCellValueContext): SerializedCellValue {\n // A field beginning with `=` is a formula, the way it is when a spreadsheet\n // opens the same file. See the note on CsvConvertOptions.\n if (raw.startsWith(\"=\") && raw.length > 1) {\n const translated = translateFormula(raw, {\n sheetName: context.sheetName,\n cellReference: context.reference,\n });\n context.diagnostics.push(...translated.diagnostics);\n return translated.formula;\n }\n\n if (context.parseBooleans) {\n const upper = raw.toUpperCase();\n if (upper === \"TRUE\") return true;\n if (upper === \"FALSE\") return false;\n }\n\n if (context.parseNumbers) {\n const number = toNumber(raw);\n if (number !== undefined) return number;\n }\n\n return raw;\n}\n\n/**\n * The numeric value of a field, or undefined to keep it as text.\n *\n * Deliberately narrower than `Number()`. Three kinds of string look numeric and\n * must not be converted, because converting them loses information that cannot\n * be recovered from the result:\n *\n * - Leading zeros (`007`, `01234`) — part numbers, postcodes, phone extensions.\n * This is the mangling Excel is notorious for.\n * - Integers beyond `Number.MAX_SAFE_INTEGER` — long identifiers, which silently\n * change value when they become floats.\n * - Anything `Number()` accepts that is not a plain decimal: `0x1f`, `Infinity`,\n * `1_000`, and the empty string.\n */\nexport function toNumber(raw: string): number | undefined {\n const text = raw.trim();\n if (text.length === 0) return undefined;\n\n // A plain decimal, with an optional sign and exponent. Nothing else.\n if (!/^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/.test(text)) {\n return undefined;\n }\n\n const digits = text.replace(/^[+-]/, \"\");\n // `0`, `0.5` and `0e3` are fine; `007` and `01.5` are identifiers.\n if (/^0\\d/.test(digits)) return undefined;\n\n const value = Number(text);\n if (!Number.isFinite(value)) return undefined;\n\n // A long integer that cannot survive as a float stays text.\n if (\n !text.includes(\".\") &&\n !/[eE]/.test(text) &&\n !Number.isSafeInteger(value)\n ) {\n return undefined;\n }\n\n return value;\n}\n\n/** Decode bytes as UTF-8, which is what every modern exporter writes. */\nexport async function readTextFrom(\n source: Blob | ArrayBuffer | Uint8Array | string\n): Promise<string> {\n if (typeof source === \"string\") return source;\n if (source instanceof Uint8Array || source instanceof ArrayBuffer) {\n return new TextDecoder(\"utf-8\").decode(source);\n }\n return source.text();\n}\n",
16
+ "/**\n * excel-to-formula-engine\n *\n * Converts an Excel .xlsx file into `WorkbookData` for `@ricsam/formula-engine`,\n * in the browser and in Node/Bun.\n *\n * ```ts\n * const data = await excelToFormulaEngine(blob);\n * engine.addWorkbook({ workbookName: \"Budget\", data });\n * ```\n */\n\nimport { convertWorkbook } from \"./src/convert\";\nimport { convertDelimitedText, readTextFrom } from \"./src/csv/convert\";\nimport type {\n ConvertOptions,\n ConvertResult,\n CsvConvertOptions,\n ExcelWorkbookData,\n} from \"./src/types\";\n\n/**\n * Convert an Excel file into engine `WorkbookData`.\n *\n * Accepts a `Blob` or `File` from a file input, or raw bytes. The result is\n * ready to hand to `FormulaEngine.addWorkbook`.\n *\n * Anything that could not be translated is reported in\n * `data.workbookMetadata.diagnostics`; use {@link excelToFormulaEngineDetailed}\n * when you want the diagnostics alongside the data instead.\n *\n * @throws when the input is not a readable .xlsx package.\n */\nexport async function excelToFormulaEngine(\n source: Blob | ArrayBuffer | Uint8Array,\n options?: ConvertOptions\n): Promise<ExcelWorkbookData> {\n const { data } = await convertWorkbook(source, withFileName(source, options));\n return data;\n}\n\n/**\n * Convert an Excel file, returning the data and the translation diagnostics as\n * separate values.\n */\nexport async function excelToFormulaEngineDetailed(\n source: Blob | ArrayBuffer | Uint8Array,\n options?: ConvertOptions\n): Promise<ConvertResult> {\n return convertWorkbook(source, withFileName(source, options));\n}\n\n/** Pick up the name from a `File` so it lands in workbook metadata. */\nfunction withFileName(\n source: Blob | ArrayBuffer | Uint8Array,\n options: ConvertOptions | undefined\n): ConvertOptions {\n if (options?.fileName !== undefined) {\n return options;\n }\n const name =\n typeof File !== \"undefined\" && source instanceof File\n ? source.name\n : undefined;\n return name ? { ...options, fileName: name } : { ...options };\n}\n\n/**\n * Convert delimited text — CSV, TSV, or semicolon-separated — into engine\n * `WorkbookData` holding a single sheet.\n *\n * The delimiter is detected from the text unless one is given: a `.csv`\n * extension says nothing about the separator, and a comma-decimal locale\n * exports semicolons.\n */\nexport async function csvToFormulaEngine(\n source: Blob | ArrayBuffer | Uint8Array | string,\n options?: CsvConvertOptions\n): Promise<ExcelWorkbookData> {\n const { data } = await csvToFormulaEngineDetailed(source, options);\n return data;\n}\n\n/** As {@link csvToFormulaEngine}, with the diagnostics returned separately. */\nexport async function csvToFormulaEngineDetailed(\n source: Blob | ArrayBuffer | Uint8Array | string,\n options?: CsvConvertOptions\n): Promise<ConvertResult> {\n const text = await readTextFrom(source);\n const resolved = withCsvFileName(source, options);\n return convertDelimitedText(text, resolved);\n}\n\n/**\n * Convert whichever kind of spreadsheet file this is.\n *\n * For a drop target, which is handed whatever the user let go of and has to\n * decide afterwards. An `.xlsx` is a ZIP and delimited text is not, so the\n * format is settled by looking at the bytes rather than by trusting the name —\n * a file saved as `.csv` but actually a workbook is a common enough export\n * mistake to be worth handling quietly.\n */\nexport async function spreadsheetToFormulaEngine(\n source: Blob | ArrayBuffer | Uint8Array,\n options?: ConvertOptions & CsvConvertOptions\n): Promise<ExcelWorkbookData> {\n const { data } = await spreadsheetToFormulaEngineDetailed(source, options);\n return data;\n}\n\n/** As {@link spreadsheetToFormulaEngine}, with the diagnostics separately. */\nexport async function spreadsheetToFormulaEngineDetailed(\n source: Blob | ArrayBuffer | Uint8Array,\n options?: ConvertOptions & CsvConvertOptions\n): Promise<ConvertResult> {\n const bytes = await toBytes(source);\n if (looksLikeZip(bytes)) {\n return convertWorkbook(bytes, withFileName(source, options));\n }\n return csvToFormulaEngineDetailed(bytes, withCsvFileName(source, options));\n}\n\n/** Every .xlsx is a ZIP, and every ZIP starts `PK\\x03\\x04`. */\nfunction looksLikeZip(bytes: Uint8Array): boolean {\n return (\n bytes.length >= 4 &&\n bytes[0] === 0x50 &&\n bytes[1] === 0x4b &&\n bytes[2] === 0x03 &&\n bytes[3] === 0x04\n );\n}\n\nasync function toBytes(\n source: Blob | ArrayBuffer | Uint8Array\n): Promise<Uint8Array> {\n if (source instanceof Uint8Array) return source;\n if (source instanceof ArrayBuffer) return new Uint8Array(source);\n return new Uint8Array(await source.arrayBuffer());\n}\n\n/**\n * Default the sheet name to the file's own name, so a dropped `sales.csv`\n * becomes a sheet called `sales` rather than `Sheet1`.\n */\nfunction withCsvFileName(\n source: Blob | ArrayBuffer | Uint8Array | string,\n options: CsvConvertOptions | undefined\n): CsvConvertOptions {\n const name =\n typeof File !== \"undefined\" && source instanceof File ? source.name : undefined;\n const fileName = options?.fileName ?? name;\n if (!fileName) return { ...options };\n return {\n ...options,\n fileName,\n sheetName:\n options?.sheetName ??\n (fileName.replace(/\\.(csv|tsv|tab|txt)$/i, \"\").trim() || \"Sheet1\")\n };\n}\n\nexport { convertWorkbook };\nexport { convertDelimitedText } from \"./src/csv/convert\";\nexport {\n detectDelimiter,\n parseDelimitedText,\n stripBom,\n} from \"./src/csv/parse\";\n\nexport type {\n ConvertOptions,\n ConvertResult,\n CsvConvertOptions,\n Diagnostic,\n DiagnosticCode,\n DiagnosticSeverity,\n ExcelCellMetadata,\n ExcelSheetMetadata,\n ExcelWorkbookData,\n ExcelWorkbookMetadata,\n} from \"./src/types\";\n\nexport {\n findUnsupportedFunctions,\n offsetFormulaReferences,\n translateFormula,\n} from \"./src/translate/formula\";\n\nexport { excelSerialToIso } from \"./src/translate/dates\";\n\nexport {\n columnIndexToLabel,\n columnLabelToIndex,\n parseA1,\n parseA1Range,\n toA1,\n} from \"./src/a1\";\n"
15
17
  ],
16
- "mappings": ";AAKA;AACA;AAIA,IAAM,SAAS,IAAI,UAAU;AAAA,EAC3B,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EAOrB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,iBAAiB;AACnB,CAAC;AAaD,eAAsB,eAAe,CACnC,QACsB;AAAA,EACtB,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAAA,EAClC,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,WAAW,UAAU,KAAK;AAAA,IAC1B,OAAO,OAAO;AAAA,IACd,MAAM,IAAI,MACR,wEACE,mDACF,EAAE,MAAM,CACV;AAAA;AAAA,EAGF,MAAM,QAAQ,IAAI;AAAA,EAClB,YAAY,MAAM,YAAY,OAAO,QAAQ,QAAQ,GAAG;AAAA,IAEtD,MAAM,IAAI,cAAc,IAAI,GAAG,OAAO;AAAA,EACxC;AAAA,EAEA,IAAI,CAAC,MAAM,IAAI,iBAAiB,GAAG;AAAA,IACjC,MAAM,IAAI,MACR,2EACE,2BACJ;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,IAAI;AAAA,EAErB,OAAO;AAAA,IACL;AAAA,IACA,IAAI,CAAC,MAAM;AAAA,MACT,MAAM,UAAU,MAAM,IAAI,cAAc,IAAI,CAAC;AAAA,MAC7C,OAAO,UAAU,UAAU,OAAO,IAAI;AAAA;AAAA,IAExC,GAAG,CAAC,MAAM;AAAA,MACR,MAAM,MAAM,cAAc,IAAI;AAAA,MAC9B,IAAI,SAAS,IAAI,GAAG,GAAG;AAAA,QACrB,OAAO,SAAS,IAAI,GAAG;AAAA,MACzB;AAAA,MACA,MAAM,UAAU,MAAM,IAAI,GAAG;AAAA,MAC7B,MAAM,SAAS,UAAW,OAAO,MAAM,UAAU,OAAO,CAAC,IAAgB;AAAA,MACzE,SAAS,IAAI,KAAK,MAAM;AAAA,MACxB,OAAO;AAAA;AAAA,IAET,GAAG,CAAC,MAAM;AAAA,MACR,OAAO,MAAM,IAAI,cAAc,IAAI,CAAC;AAAA;AAAA,IAEtC,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,aAAa,cAAc,MAAM;AAAA,MACvC,OAAO,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,OAAO,CAAC,SACtC,KAAK,WAAW,UAAU,CAC5B;AAAA;AAAA,EAEJ;AAAA;AAGF,SAAS,aAAa,CAAC,MAAsB;AAAA,EAC3C,OAAO,KAAK,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,EAAE;AAAA;AAGpD,eAAe,OAAO,CACpB,QACqB;AAAA,EACrB,IAAI,kBAAkB,YAAY;AAAA,IAChC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,kBAAkB,aAAa;AAAA,IACjC,OAAO,IAAI,WAAW,MAAM;AAAA,EAC9B;AAAA,EACA,OAAO,IAAI,WAAW,MAAM,OAAO,YAAY,CAAC;AAAA;AAO3C,SAAS,OAAU,CAAC,OAAiC;AAAA,EAC1D,IAAI,UAAU,aAAa,UAAU,MAAM;AAAA,IACzC,OAAO,CAAC;AAAA,EACV;AAAA,EACA,OAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAAA;AAGvC,SAAS,IAAI,CAAC,MAAe,MAAkC;AAAA,EACpE,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AAAA,IACrC;AAAA,EACF;AAAA,EACA,MAAM,QAAS,KAAiC,IAAI;AAAA,EACpD,OAAO,UAAU,aAAa,UAAU,OAAO,YAAY,OAAO,KAAK;AAAA;AAGlE,SAAS,OAAO,CAAC,MAAe,MAAkC;AAAA,EACvE,MAAM,MAAM,KAAK,MAAM,IAAI;AAAA,EAC3B,IAAI,QAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AAAA,EACA,MAAM,SAAS,OAAO,GAAG;AAAA,EACzB,OAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAAA;AAGrC,SAAS,QAAQ,CACtB,MACA,MACA,WAAW,OACF;AAAA,EACT,MAAM,MAAM,KAAK,MAAM,IAAI;AAAA,EAC3B,IAAI,QAAQ,WAAW;AAAA,IACrB,OAAO;AAAA,EACT;AAAA,EACA,OAAO,QAAQ,OAAO,IAAI,YAAY,MAAM;AAAA;AAIvC,SAAS,MAAM,CAAC,MAAuB;AAAA,EAC5C,IAAI,SAAS,aAAa,SAAS,MAAM;AAAA,IACvC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,SAAS,UAAU;AAAA,IAC5B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,WAAW;AAAA,IACzD,OAAO,OAAO,IAAI;AAAA,EACpB;AAAA,EACA,IAAI,OAAO,SAAS,UAAU;AAAA,IAC5B,MAAM,QAAS,KAAiC;AAAA,IAChD,OAAO,UAAU,aAAa,UAAU,OAAO,KAAK,OAAO,KAAK;AAAA,EAClE;AAAA,EACA,OAAO;AAAA;;;AC9JT,IAAM,UAAU;AAET,SAAS,kBAAkB,CAAC,OAAuB;AAAA,EACxD,IAAI,QAAQ;AAAA,EACZ,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,IACrC,QAAQ,QAAQ,MAAM,MAAM,YAAY,EAAE,WAAW,CAAC,IAAI;AAAA,EAC5D;AAAA,EACA,OAAO,QAAQ;AAAA;AAGV,SAAS,kBAAkB,CAAC,OAAuB;AAAA,EACxD,IAAI,QAAQ;AAAA,EACZ,IAAI,YAAY,QAAQ;AAAA,EACxB,OAAO,YAAY,GAAG;AAAA,IACpB,MAAM,QAAQ,YAAY,KAAK;AAAA,IAC/B,QAAQ,OAAO,aAAa,KAAK,IAAI,IAAI;AAAA,IACzC,YAAY,KAAK,OAAO,YAAY,QAAQ,EAAE;AAAA,EAChD;AAAA,EACA,OAAO;AAAA;AAQF,SAAS,OAAO,CAAC,WAA2C;AAAA,EACjE,MAAM,QAAQ,QAAQ,KAAK,UAAU,KAAK,CAAC;AAAA,EAC3C,IAAI,CAAC,SAAS,MAAM,OAAO,aAAa,MAAM,OAAO,WAAW;AAAA,IAC9D;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,UAAU,mBAAmB,MAAM,EAAE;AAAA,IACrC,UAAU,OAAO,SAAS,MAAM,IAAI,EAAE,IAAI;AAAA,EAC5C;AAAA;AAGK,SAAS,IAAI,GAAG,UAAU,YAAgC;AAAA,EAC/D,OAAO,GAAG,mBAAmB,QAAQ,IAAI,WAAW;AAAA;AAc/C,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAE5B,SAAS,YAAY,CAAC,WAA4C;AAAA,EACvE,MAAM,UAAU,UAAU,KAAK,EAAE,QAAQ,OAAO,EAAE;AAAA,EAClD,OAAO,UAAU,UAAU,QAAQ,MAAM,GAAG;AAAA,EAC5C,IAAI,aAAa,WAAW;AAAA,IAC1B;AAAA,EACF;AAAA,EACA,IAAI,WAAW,WAAW;AAAA,IACxB,MAAM,OAAO,QAAQ,QAAQ;AAAA,IAC7B,OAAO,OAAO,EAAE,OAAO,MAAM,KAAK,KAAK,IAAI;AAAA,EAC7C;AAAA,EAEA,MAAM,YAAY,QAAQ,QAAQ;AAAA,EAClC,MAAM,UAAU,QAAQ,MAAM;AAAA,EAC9B,IAAI,aAAa,SAAS;AAAA,IACxB,OAAO,EAAE,OAAO,WAAW,KAAK,QAAQ;AAAA,EAC1C;AAAA,EAGA,IAAI,cAAc,KAAK,QAAQ,KAAK,cAAc,KAAK,MAAM,GAAG;AAAA,IAC9D,OAAO;AAAA,MACL,OAAO,EAAE,UAAU,mBAAmB,QAAQ,GAAG,UAAU,EAAE;AAAA,MAC7D,KAAK;AAAA,QACH,UAAU,mBAAmB,MAAM;AAAA,QACnC,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EAGA,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,MAAM,GAAG;AAAA,IAClD,OAAO;AAAA,MACL,OAAO,EAAE,UAAU,GAAG,UAAU,OAAO,SAAS,UAAU,EAAE,IAAI,EAAE;AAAA,MAClE,KAAK;AAAA,QACH,UAAU;AAAA,QACV,UAAU,OAAO,SAAS,QAAQ,EAAE,IAAI;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEA;AAAA;AAGK,SAAS,kBAAkB,CAAC,OAAsC;AAAA,EACvE,OAAO;AAAA,IACL,OAAO,EAAE,KAAK,MAAM,MAAM,UAAU,KAAK,MAAM,MAAM,SAAS;AAAA,IAC9D,KAAK;AAAA,MACH,KAAK,EAAE,MAAM,UAAU,OAAO,MAAM,IAAI,SAAS;AAAA,MACjD,KAAK,EAAE,MAAM,UAAU,OAAO,MAAM,IAAI,SAAS;AAAA,IACnD;AAAA,EACF;AAAA;AAIK,SAAS,gCAAgC,CAC9C,WAC8B;AAAA,EAC9B,MAAM,SAAS,aAAa,SAAS;AAAA,EACrC,OAAO,SAAS,mBAAmB,MAAM,IAAI;AAAA;;;ACvCxC,SAAS,cAAc,CAC5B,KACA,UACA,eACc;AAAA,EACd,MAAM,OAAO,IAAI,IAAI,QAAQ;AAAA,EAC7B,MAAM,YAAY,OAAO;AAAA,EACzB,MAAM,SAAuB;AAAA,IAC3B,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,cAAc,CAAC;AAAA,IACf,YAAY,CAAC;AAAA,IACb,oBAAoB,CAAC;AAAA,IACrB,YAAY,CAAC;AAAA,EACf;AAAA,EACA,IAAI,CAAC,WAAW;AAAA,IACd,OAAO;AAAA,EACT;AAAA,EAEA,WAAW,WAAW,eAAe,MAAM;AAAA,EAC3C,aAAa,WAAW,MAAM;AAAA,EAC9B,WAAW,WAAW,MAAM;AAAA,EAC5B,YAAY,WAAW,MAAM;AAAA,EAC7B,wBAAwB,WAAW,MAAM;AAAA,EACzC,gBAAgB,KAAK,UAAU,WAAW,MAAM;AAAA,EAEhD,OAAO;AAAA;AAeT,SAAS,UAAU,CACjB,WACA,eACA,QACM;AAAA,EACN,MAAM,YAAY,UAAU;AAAA,EAC5B,MAAM,SAAS,IAAI;AAAA,EAEnB,WAAW,UAAU,QAAQ,YAAY,MAAM,GAAG;AAAA,IAChD,MAAM,MAAM;AAAA,IACZ,MAAM,YAAY,QAAQ,KAAK,GAAG;AAAA,IAClC,MAAM,SAAS,QAAQ,KAAK,IAAI;AAAA,IAChC,IAAI,cAAc,aAAa,WAAW,WAAW;AAAA,MACnD,OAAO,WAAW,YAAY,KAAK;AAAA,IACrC;AAAA,IAEA,WAAW,WAAW,QAAQ,IAAI,IAAI,GAAG;AAAA,MACvC,MAAM,OAAO;AAAA,MACb,MAAM,YAAY,KAAK,MAAM,GAAG;AAAA,MAChC,IAAI,CAAC,WAAW;AAAA,QACd;AAAA,MACF;AAAA,MACA,MAAM,UAAU,QAAQ,SAAS;AAAA,MACjC,IAAI,CAAC,SAAS;AAAA,QACZ;AAAA,MACF;AAAA,MAEA,MAAM,aAAa,QAAQ,MAAM,GAAG;AAAA,MACpC,MAAM,OAAO,KAAK,MAAM,GAAG,KAAK;AAAA,MAChC,MAAM,UAAU,YAAY,MAAM,SAAS,MAAM;AAAA,MACjD,QAAQ,MAAM,UAAU,UAAU,MAAM,MAAM,aAAa;AAAA,MAE3D,IAAI,SAAS,WAAW,YAAY,aAAa,eAAe,WAAW;AAAA,QACzE;AAAA,MACF;AAAA,MAEA,OAAO,MAAM,KAAK;AAAA,QAChB;AAAA,QACA,UAAU,QAAQ;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB;AAAA,QACA;AAAA,QACA,SAAS,SAAS;AAAA,QAClB,eAAe,SAAS;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAGF,SAAS,WAAW,CAClB,MACA,SACA,QACyB;AAAA,EACzB,MAAM,OAAO,KAAK;AAAA,EAClB,IAAI,SAAS,aAAa,SAAS,MAAM;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,OAAO,IAAI;AAAA,EACxB,MAAM,OAAO,KAAK,MAAM,GAAG;AAAA,EAC3B,MAAM,KAAK,KAAK,MAAM,IAAI;AAAA,EAE1B,IAAI,SAAS,YAAY,OAAO,WAAW;AAAA,IACzC,IAAI,MAAM;AAAA,MAER,OAAO,IAAI,IAAI;AAAA,QACb,SAAS;AAAA,QACT,UAAU,QAAQ;AAAA,QAClB,UAAU,QAAQ;AAAA,MACpB,CAAC;AAAA,MACD,OAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AAAA,IACA,MAAM,SAAS,OAAO,IAAI,EAAE;AAAA,IAC5B,IAAI,CAAC,QAAQ;AAAA,MACX;AAAA,IACF;AAAA,IAGA,OAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,QAAQ;AAAA,QACN,MAAM,QAAQ,WAAW,OAAO;AAAA,QAChC,MAAM,QAAQ,WAAW,OAAO;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAGA,OAAO,OAAO,EAAE,SAAS,KAAK,IAAI;AAAA;AAGpC,SAAS,SAAS,CAChB,MACA,MACA,eACkE;AAAA,EAElE,IAAI,SAAS,aAAa;AAAA,IACxB,MAAM,SAAS,KAAK;AAAA,IACpB,OAAO,EAAE,MAAM,UAAU,OAAO,aAAa,MAAM,EAAE;AAAA,EACvD;AAAA,EAEA,MAAM,MAAM,KAAK;AAAA,EACjB,IAAI,QAAQ,aAAa,QAAQ,MAAM;AAAA,IACrC,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,EAC3C;AAAA,EACA,MAAM,OAAO,OAAO,GAAG;AAAA,EAEvB,QAAQ;AAAA,SACD,KAAK;AAAA,MACR,MAAM,QAAQ,OAAO,SAAS,MAAM,EAAE;AAAA,MACtC,OAAO,EAAE,MAAM,UAAU,OAAO,cAAc,UAAU,GAAG;AAAA,IAC7D;AAAA,SACK;AAAA,MAEH,OAAO,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,SAClC;AAAA,MACH,OAAO,EAAE,MAAM,WAAW,OAAO,SAAS,IAAI;AAAA,SAC3C;AAAA,MACH,OAAO,EAAE,MAAM,SAAS,OAAO,KAAK;AAAA,SACjC;AAAA,MAEH,OAAO,EAAE,MAAM,QAAQ,OAAO,KAAK;AAAA,aAC5B;AAAA,MACP,MAAM,SAAS,OAAO,IAAI;AAAA,MAC1B,OAAO,OAAO,SAAS,MAAM,IACzB,EAAE,MAAM,UAAU,OAAO,OAAO,IAChC,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,IACpC;AAAA;AAAA;AAKG,SAAS,YAAY,CAAC,MAAuB;AAAA,EAClD,IAAI,SAAS,aAAa,SAAS,MAAM;AAAA,IACvC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,SAAS,UAAU;AAAA,IAC5B,OAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AAAA,EACf,MAAM,OAAO,QAAQ,OAAO,IAAI;AAAA,EAChC,IAAI,KAAK,SAAS,GAAG;AAAA,IACnB,OAAO,KAAK,IAAI,CAAC,QAAQ,OAAQ,IAAgB,IAAI,CAAC,EAAE,KAAK,EAAE;AAAA,EACjE;AAAA,EACA,IAAI,OAAO,SAAS,WAAW;AAAA,IAC7B,OAAO,OAAO,OAAO,IAAI;AAAA,EAC3B;AAAA,EACA,OAAO,OAAO,MAAM;AAAA;AAGtB,SAAS,YAAY,CAAC,WAAoB,QAA4B;AAAA,EACpE,WAAW,UAAU,QAClB,UAAU,UAAkC,MAC/C,GAAG;AAAA,IACD,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM,QAAQ,KAAK,KAAK;AAAA,IAC9B,MAAM,MAAM,QAAQ,KAAK,KAAK;AAAA,IAC9B,MAAM,QAAQ,QAAQ,KAAK,OAAO;AAAA,IAClC,IAAI,QAAQ,aAAa,QAAQ,aAAa,UAAU,WAAW;AAAA,MACjE;AAAA,IACF;AAAA,IAGA,IAAI,MAAM,MAAM,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,IACA,SAAS,QAAQ,IAAK,SAAS,KAAK,SAAS;AAAA,MAC3C,OAAO,aAAa,QAAQ,KAAK;AAAA,IACnC;AAAA,EACF;AAAA;AAGF,SAAS,UAAU,CAAC,WAAoB,QAA4B;AAAA,EAClE,MAAM,aAAa,UAAU;AAAA,EAC7B,MAAM,YAAY,QAAQ,aAAa,YAAY,EAAE;AAAA,EACrD,MAAM,OAAO,YAAY;AAAA,EACzB,IAAI,CAAC,MAAM;AAAA,IACT;AAAA,EACF;AAAA,EACA,IAAI,KAAK,MAAM,OAAO,MAAM,UAAU;AAAA,IACpC;AAAA,EACF;AAAA,EACA,OAAO,SAAS;AAAA,IACd,MAAM,QAAQ,MAAM,QAAQ,KAAK;AAAA,IACjC,MAAM,QAAQ,MAAM,QAAQ,KAAK;AAAA,EACnC;AAAA;AAGF,SAAS,WAAW,CAAC,WAAoB,QAA4B;AAAA,EACnE,WAAW,SAAS,QACjB,UAAU,gBAAwC,YACrD,GAAG;AAAA,IACD,MAAM,MAAM,KAAK,OAAO,KAAK;AAAA,IAC7B,IAAI,KAAK;AAAA,MACP,OAAO,OAAO,KAAK,GAAG;AAAA,IACxB;AAAA,EACF;AAAA;AAGF,SAAS,uBAAuB,CAC9B,WACA,QACM;AAAA,EACN,WAAW,YAAY,QAAQ,UAAU,wBAAwB,GAAG;AAAA,IAClE,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ,KAAK,OAAO,OAAO;AAAA,IACjC,IAAI,CAAC,OAAO;AAAA,MACV;AAAA,IACF;AAAA,IACA,MAAM,SAAS,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO;AAAA,IAEhD,WAAW,WAAW,QAAQ,MAAM,SAAS,GAAG;AAAA,MAC9C,MAAM,OAAO;AAAA,MACb,MAAM,OAAO,KAAK,MAAM,MAAM;AAAA,MAC9B,IAAI,CAAC,MAAM;AAAA,QACT;AAAA,MACF;AAAA,MAEA,MAAM,iBAAiB,KAAK;AAAA,MAE5B,OAAO,mBAAmB,KAAK;AAAA,QAC7B;AAAA,QACA;AAAA,QACA,UAAU,KAAK,MAAM,UAAU;AAAA,QAC/B,UAAU,QAAQ,KAAK,UAAU,EAAE,IAAI,CAAC,YAAY,OAAO,OAAO,CAAC;AAAA,QACnE,MAAM,KAAK,MAAM,MAAM;AAAA,QACvB,OAAO,QAAQ,MAAM,OAAO;AAAA,QAC5B,UAAU,QAAQ,MAAM,UAAU,KAAK;AAAA,QACvC,MAAM,QAAQ,MAAM,MAAM;AAAA,QAC1B,QAAQ,SAAS,MAAM,QAAQ;AAAA,QAC/B,SAAS,SAAS,MAAM,SAAS;AAAA,QACjC,YAAY,SAAS,MAAM,YAAY;AAAA,QACvC,YAAY,iBACR;AAAA,UACE,MAAM,QAAQ,eAAe,OAAO,EAAE,IAAI,CAAC,UAAU;AAAA,YACnD,MAAM,KAAK,MAAM,MAAM,KAAK;AAAA,YAC5B,KAAK,KAAK,MAAM,KAAK;AAAA,UACvB,EAAE;AAAA,UACF,QAAQ,QAAQ,eAAe,QAAQ,EAAE,IAAI,CAAC,UAC5C,KAAK,OAAO,KAAK,CACnB;AAAA,QACF,IACA;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAGF,SAAS,eAAe,CACtB,KACA,UACA,WACA,QACM;AAAA,EACN,MAAM,QAAQ,QACX,UAAU,gBAAwC,YACrD;AAAA,EACA,IAAI,MAAM,WAAW,GAAG;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,kBAAkB,KAAK,QAAQ;AAAA,EAErD,WAAW,WAAW,OAAO;AAAA,IAC3B,MAAM,OAAO;AAAA,IACb,MAAM,MAAM,KAAK,MAAM,KAAK;AAAA,IAC5B,IAAI,CAAC,KAAK;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM,KAAK,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,IAAI;AAAA,IAChD,MAAM,WAAW,KAAK,MAAM,UAAU;AAAA,IACtC,MAAM,SAAS,KAAK,cAAc,IAAI,EAAE,IAAI;AAAA,IAC5C,MAAM,OAAO,SACT,WACE,GAAG,UAAU,aACb,SACF;AAAA,IACJ,IAAI,CAAC,MAAM;AAAA,MACT;AAAA,IACF;AAAA,IAGA,MAAM,QAAQ,QAAQ,IAAI,MAAM,GAAG,EAAE,MAAM,GAAG;AAAA,IAC9C,IAAI,OAAO;AAAA,MACT,OAAO,WAAW,KAAK,KAAK,KAAK;AAAA,IACnC;AAAA,EACF;AAAA;AAGK,SAAS,iBAAiB,CAC/B,KACA,UACqB;AAAA,EACrB,MAAM,QAAQ,SAAS,YAAY,GAAG;AAAA,EACtC,MAAM,MAAM,UAAU,KAAK,KAAK,SAAS,MAAM,GAAG,KAAK;AAAA,EACvD,MAAM,OAAO,UAAU,KAAK,WAAW,SAAS,MAAM,QAAQ,CAAC;AAAA,EAC/D,MAAM,WAAW,GAAG,aAAa;AAAA,EAEjC,MAAM,MAAM,IAAI;AAAA,EAChB,MAAM,OAAO,IAAI,IAAI,QAAQ;AAAA,EAC7B,MAAM,YAAY,OAAO;AAAA,EACzB,IAAI,CAAC,WAAW;AAAA,IACd,OAAO;AAAA,EACT;AAAA,EACA,WAAW,gBAAgB,QAAQ,UAAU,eAAe,GAAG;AAAA,IAC7D,MAAM,KAAK,KAAK,cAAc,IAAI;AAAA,IAClC,MAAM,SAAS,KAAK,cAAc,QAAQ;AAAA,IAC1C,IAAI,MAAM,QAAQ;AAAA,MAChB,IAAI,IAAI,IAAI,MAAM;AAAA,IACpB;AAAA,EACF;AAAA,EACA,OAAO;AAAA;;;ACtYF,SAAS,kBAAkB,CAAC,KAA4B;AAAA,EAC7D,MAAM,OAAO,IAAI,IAAI,sBAAsB;AAAA,EAC3C,MAAM,MAAM,OAAO;AAAA,EACnB,IAAI,CAAC,KAAK;AAAA,IACR,OAAO,CAAC;AAAA,EACV;AAAA,EACA,OAAO,QAAQ,IAAI,KAAK,EAAE,IAAI,CAAC,UAAU,aAAa,KAAK,CAAC;AAAA;AAGvD,SAAS,aAAa,CAAC,KAK5B;AAAA,EACA,MAAM,OAAO,IAAI,IAAI,iBAAiB;AAAA,EACtC,MAAM,WAAW,OAAO;AAAA,EACxB,IAAI,CAAC,UAAU;AAAA,IACb,OAAO,EAAE,QAAQ,CAAC,GAAG,cAAc,CAAC,GAAG,UAAU,MAAM;AAAA,EACzD;AAAA,EAEA,MAAM,gBAAgB,kBAAkB,KAAK,iBAAiB;AAAA,EAE9D,MAAM,SAAuB,CAAC;AAAA,EAC9B,WAAW,YAAY,QACpB,SAAS,YAAoC,QAChD,GAAG;AAAA,IACD,MAAM,QAAQ;AAAA,IACd,MAAM,OAAO,KAAK,OAAO,MAAM;AAAA,IAC/B,MAAM,KAAK,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO,IAAI;AAAA,IAClD,IAAI,CAAC,QAAQ,CAAC,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,IACA,MAAM,SAAS,cAAc,IAAI,EAAE;AAAA,IACnC,IAAI,CAAC,QAAQ;AAAA,MACX;AAAA,IACF;AAAA,IACA,OAAO,KAAK;AAAA,MACV;AAAA,MACA,UAAU,YAAY,MAAM;AAAA,MAC5B,OAAO,KAAK,OAAO,OAAO,KAAK;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAA8B,CAAC;AAAA,EACrC,WAAW,WAAW,QACnB,SAAS,kBAA0C,cACtD,GAAG;AAAA,IACD,MAAM,OAAO;AAAA,IACb,MAAM,OAAO,KAAK,MAAM,MAAM;AAAA,IAC9B,IAAI,CAAC,MAAM;AAAA,MACT;AAAA,IACF;AAAA,IACA,aAAa,KAAK;AAAA,MAChB;AAAA,MACA,SAAS,YAAY,IAAI;AAAA,MACzB,cAAc,QAAQ,MAAM,cAAc;AAAA,MAC1C,QAAQ,KAAK,MAAM,QAAQ,MAAM;AAAA,IACnC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,SAAS;AAAA,EACpB,MAAM,WACJ,KAAK,IAAI,UAAU,MAAM,OAAO,KAAK,IAAI,UAAU,MAAM;AAAA,EAE3D,OAAO,EAAE,QAAQ,cAAc,SAAS;AAAA;AAInC,SAAS,WAAW,CACzB,KACA,mBACY;AAAA,EACZ,MAAM,gBAAgB,kBAAkB,KAAK,iBAAiB;AAAA,EAC9D,MAAM,SAAqB,CAAC;AAAA,EAE5B,WAAW,UAAU,cAAc,OAAO,GAAG;AAAA,IAC3C,IAAI,CAAC,OAAO,SAAS,SAAS,GAAG;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,MAAM,WAAW,YAAY,QAAQ,iBAAiB;AAAA,IACtD,MAAM,OAAO,IAAI,IAAI,QAAQ;AAAA,IAC7B,MAAM,QAAQ,OAAO;AAAA,IACrB,IAAI,CAAC,OAAO;AAAA,MACV;AAAA,IACF;AAAA,IAEA,MAAM,MAAM,KAAK,OAAO,KAAK;AAAA,IAC7B,MAAM,OAAO,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO,aAAa;AAAA,IAC7D,IAAI,CAAC,OAAO,CAAC,MAAM;AAAA,MACjB;AAAA,IACF;AAAA,IAEA,OAAO,KAAK;AAAA,MACV;AAAA,MACA,aAAa,KAAK,OAAO,aAAa,KAAK;AAAA,MAC3C;AAAA,MAEA,gBAAgB,QAAQ,OAAO,gBAAgB,KAAK;AAAA,MACpD,gBAAgB,QAAQ,OAAO,gBAAgB,KAAK;AAAA,MACpD,aAAa,QACV,MAAM,kBAA0C,cACnD,EAAE,IAAI,CAAC,WAAW,KAAK,QAAQ,MAAM,KAAK,EAAE;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,WAAW,CAAC,MAAuB;AAAA,EAC1C,MAAM,QAAQ,KAAK;AAAA,EACnB,IAAI,UAAU,aAAa,UAAU,MAAM;AAAA,IACzC,OAAO;AAAA,EACT;AAAA,EACA,OAAO,OAAO,KAAK;AAAA;AASrB,SAAS,WAAW,CAAC,QAAgB,WAAW,mBAA2B;AAAA,EACzE,IAAI,OAAO,WAAW,GAAG,GAAG;AAAA,IAC1B,OAAO,OAAO,MAAM,CAAC;AAAA,EACvB;AAAA,EAEA,MAAM,QAAQ,SAAS,YAAY,GAAG;AAAA,EACtC,MAAM,UAAU,UAAU,KAAK,KAAK,SAAS,MAAM,GAAG,KAAK;AAAA,EAC3D,MAAM,WAAW,UAAU,QAAQ,MAAM,GAAG,IAAI,CAAC;AAAA,EAEjD,WAAW,WAAW,OAAO,MAAM,GAAG,GAAG;AAAA,IACvC,IAAI,YAAY,OAAO,YAAY,IAAI;AAAA,MACrC;AAAA,IACF;AAAA,IACA,IAAI,YAAY,MAAM;AAAA,MACpB,SAAS,IAAI;AAAA,MACb;AAAA,IACF;AAAA,IACA,SAAS,KAAK,OAAO;AAAA,EACvB;AAAA,EAEA,OAAO,SAAS,KAAK,GAAG;AAAA;;;AC/J1B,IAAM,kBAA0C;AAAA,EAC9C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,0BAA0B,IAAI,IAAI;AAAA,EACtC;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAC9C,CAAC;AAEM,SAAS,WAAW,CAAC,KAA8B;AAAA,EACxD,MAAM,OAAO,IAAI,IAAI,eAAe;AAAA,EACpC,MAAM,aAAa,OAAO;AAAA,EAC1B,IAAI,CAAC,YAAY;AAAA,IACf,OAAO,EAAE,SAAS,CAAC,GAAG,qBAAqB,CAAC,EAAE;AAAA,EAChD;AAAA,EAEA,MAAM,QAAQ,iBAAiB,GAAG;AAAA,EAClC,MAAM,gBAAgB,mBAAmB,UAAU;AAAA,EAEnD,MAAM,gBAAgB,IAAI;AAAA,EAC1B,WAAW,UAAU,QAClB,WAAW,aAAqC,SACnD,GAAG;AAAA,IACD,MAAM,KAAK,QAAQ,QAAQ,UAAU;AAAA,IACrC,MAAM,OAAO,KAAK,QAAQ,YAAY;AAAA,IACtC,IAAI,OAAO,aAAa,SAAS,WAAW;AAAA,MAC1C,cAAc,IAAI,IAAI,IAAI;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,QAAS,WAAW,WAAmC,OAAO;AAAA,EAC5E,MAAM,QAAQ,QAAS,WAAW,WAAmC,OAAO;AAAA,EAC5E,MAAM,UAAU,QACb,WAAW,aAAqC,SACnD;AAAA,EAEA,MAAM,UAAU,QACb,WAAW,aAAqC,KACnD;AAAA,EAEA,MAAM,UAAyB,QAAQ,IAAI,CAAC,UAAU;AAAA,IACpD,MAAM,KAAK;AAAA,IACX,MAAM,QAAmB,CAAC;AAAA,IAE1B,IAAI,SAAS,IAAI,aAAa,IAAI,GAAG;AAAA,MACnC,MAAM,OAAO,MAAM,QAAQ,IAAI,QAAQ,KAAK;AAAA,MAC5C,IAAI,MAAM;AAAA,QACR,UAAU,OAAO,MAAiB,OAAO,aAAa;AAAA,MACxD;AAAA,IACF;AAAA,IAEA,IAAI,SAAS,IAAI,aAAa,IAAI,GAAG;AAAA,MACnC,MAAM,OAAO,MAAM,QAAQ,IAAI,QAAQ,KAAK;AAAA,MAC5C,IAAI,MAAM;AAAA,QACR,UAAU,OAAO,MAAiB,OAAO,aAAa;AAAA,MACxD;AAAA,IACF;AAAA,IAEA,IAAI,SAAS,IAAI,eAAe,IAAI,GAAG;AAAA,MACrC,MAAM,SAAS,QAAQ,QAAQ,IAAI,UAAU,KAAK;AAAA,MAClD,IAAI,QAAQ;AAAA,QACV,YAAY,OAAO,QAAmB,OAAO,aAAa;AAAA,MAC5D;AAAA,IACF;AAAA,IAEA,IAAI,SAAS,IAAI,kBAAkB,IAAI,GAAG;AAAA,MACxC,MAAM,YAAY,GAAG;AAAA,MACrB,IAAI,aAAa,SAAS,WAAW,UAAU,GAAG;AAAA,QAChD,MAAM,WAAW;AAAA,MACnB;AAAA,IACF;AAAA,IAEA,MAAM,WAAW,QAAQ,IAAI,UAAU,KAAK;AAAA,IAC5C,MAAM,eAAe,cAAc,IAAI,QAAQ,KAAK,gBAAgB;AAAA,IAEpE,OAAO;AAAA,MACL;AAAA,MACA,cAAc,iBAAiB,YAAY,YAAY;AAAA,MACvD,cAAc,aAAa,UAAU,YAAY;AAAA,IACnD;AAAA,GACD;AAAA,EAED,MAAM,sBAAsB,QACzB,WAAW,UAAkC,MAChD,EAAE,IAAI,CAAC,QAAQ;AAAA,IACb,MAAM,QAAmB,CAAC;AAAA,IAC1B,MAAM,OAAO;AAAA,IACb,IAAI,KAAK,SAAS;AAAA,MAChB,UAAU,OAAO,KAAK,SAAoB,OAAO,aAAa;AAAA,IAChE;AAAA,IACA,IAAI,KAAK,SAAS;AAAA,MAChB,UAAU,OAAO,KAAK,SAAoB,OAAO,aAAa;AAAA,IAChE;AAAA,IACA,IAAI,KAAK,WAAW;AAAA,MAClB,YAAY,OAAO,KAAK,WAAsB,OAAO,aAAa;AAAA,IACpE;AAAA,IACA,OAAO;AAAA,GACR;AAAA,EAED,OAAO,EAAE,SAAS,oBAAoB;AAAA;AAGxC,SAAS,SAAS,CAChB,OACA,MACA,OACA,eACM;AAAA,EACN,IAAI,KAAK,SAAS,aAAa,KAAK,KAAK,IAAI,GAAG;AAAA,IAC9C,MAAM,OAAO;AAAA,EACf;AAAA,EACA,IAAI,KAAK,SAAS,aAAa,KAAK,KAAK,IAAI,GAAG;AAAA,IAC9C,MAAM,SAAS;AAAA,EACjB;AAAA,EACA,IAAI,KAAK,SAAS,aAAa,KAAK,KAAK,IAAI,GAAG;AAAA,IAC9C,MAAM,YAAY;AAAA,EACpB;AAAA,EACA,MAAM,OAAO,QAAQ,KAAK,OAAO,KAAK;AAAA,EACtC,IAAI,SAAS,WAAW;AAAA,IAEtB,MAAM,WAAW,KAAK,MAAM,QAAQ,KAAK,GAAG;AAAA,EAC9C;AAAA,EACA,MAAM,QAAQ,aAAa,KAAK,UAAU,OAAO,aAAa;AAAA,EAC9D,IAAI,OAAO;AAAA,IACT,MAAM,QAAQ;AAAA,EAChB;AAAA;AAGF,SAAS,SAAS,CAChB,OACA,MACA,OACA,eACM;AAAA,EACN,MAAM,UAAU,KAAK;AAAA,EACrB,IAAI,CAAC,SAAS;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,cAAc,KAAK,SAAS,aAAa;AAAA,EAC/C,IAAI,gBAAgB,UAAU,gBAAgB,WAAW;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAM,QACJ,aAAa,QAAQ,YAAY,OAAO,aAAa,KACrD,aAAa,QAAQ,YAAY,OAAO,aAAa;AAAA,EACvD,IAAI,OAAO;AAAA,IACT,MAAM,kBAAkB;AAAA,EAC1B;AAAA;AAGF,IAAM,eAAe,CAAC,OAAO,SAAS,UAAU,MAAM;AAEtD,SAAS,WAAW,CAClB,OACA,QACA,OACA,eACM;AAAA,EACN,MAAM,QAA+C,CAAC;AAAA,EACtD,IAAI;AAAA,EACJ,IAAI,MAAM;AAAA,EAEV,WAAW,QAAQ,cAAc;AAAA,IAC/B,MAAM,OAAO,OAAO;AAAA,IACpB,MAAM,cAAc,OAAO,KAAK,MAAM,OAAO,IAAI;AAAA,IACjD,IAAI,CAAC,QAAQ,gBAAgB,aAAa,gBAAgB,QAAQ;AAAA,MAChE;AAAA,IACF;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,MAAM;AAAA,IACN,UAAU,aAAa,KAAK,UAAU,OAAO,aAAa;AAAA,EAC5D;AAAA,EAEA,IAAI,KAAK;AAAA,IACP,MAAM,cAAc;AAAA,IAGpB,MAAM,cAAc,SAAS;AAAA,EAC/B;AAAA;AAGF,SAAS,IAAI,CAAC,MAAwB;AAAA,EAEpC,MAAM,MAAM,KAAK,MAAM,KAAK;AAAA,EAC5B,OAAO,QAAQ,aAAa,QAAQ,OAAO,IAAI,YAAY,MAAM;AAAA;AAGnE,SAAS,YAAY,CAAC,UAAkB,MAAmC;AAAA,EACzE,IAAI,wBAAwB,IAAI,QAAQ,GAAG;AAAA,IACzC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,CAAC,MAAM;AAAA,IACT,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,WAAW,KACd,QAAQ,eAAe,EAAE,EACzB,QAAQ,YAAY,EAAE,EACtB,QAAQ,QAAQ,EAAE;AAAA,EACrB,OAAO,WAAW,KAAK,QAAQ,KAAK,CAAC,eAAe,KAAK,QAAQ;AAAA;AAInE,SAAS,YAAY,CACnB,MACA,OACA,eACoB;AAAA,EACpB,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,KAAK,MAAM,KAAK;AAAA,EAC5B,IAAI,KAAK;AAAA,IACP,OAAO,UAAU,UAAU,GAAG,GAAG,QAAQ,MAAM,MAAM,CAAC;AAAA,EACxD;AAAA,EAEA,MAAM,aAAa,QAAQ,MAAM,OAAO;AAAA,EACxC,IAAI,eAAe,WAAW;AAAA,IAC5B,MAAM,OAAO,MAAM;AAAA,IACnB,IAAI,MAAM;AAAA,MACR,OAAO,UAAU,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,QAAQ,MAAM,SAAS;AAAA,EACvC,IAAI,YAAY,WAAW;AAAA,IACzB,MAAM,OAAO,cAAc;AAAA,IAC3B,IAAI,MAAM;AAAA,MACR,OAAO,UAAU,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA;AAAA;AAIF,SAAS,SAAS,CAAC,MAAsB;AAAA,EACvC,MAAM,QAAQ,KAAK,QAAQ,MAAM,EAAE;AAAA,EACnC,MAAM,MAAM,MAAM,WAAW,IAAI,MAAM,MAAM,CAAC,IAAI;AAAA,EAClD,OAAO,IAAI,IAAI,YAAY;AAAA;AAO7B,SAAS,SAAS,CAAC,KAAa,MAAkC;AAAA,EAChE,IAAI,CAAC,MAAM;AAAA,IACT,OAAO;AAAA,EACT;AAAA,EACA,MAAM,QAAQ,IAAI,QAAQ,KAAK,EAAE;AAAA,EACjC,MAAM,WAAW,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,WAC9B,OAAO,SAAS,MAAM,MAAM,QAAQ,SAAS,CAAC,GAAG,EAAE,CACrD;AAAA,EACA,MAAM,SAAS,SAAS,IAAI,CAAC,YAAY;AAAA,IACvC,MAAM,OACJ,OAAO,IAAI,WAAW,IAAI,QAAQ,WAAW,IAAI,QAAQ,MAAM;AAAA,IACjE,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC;AAAA,GACnD;AAAA,EACD,OAAO,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAAA;AAIvE,SAAS,gBAAgB,CAAC,KAA4B;AAAA,EACpD,MAAM,YAAY,IACf,KAAK,WAAW,EAChB,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM,CAAC;AAAA,EACvC,IAAI,CAAC,WAAW;AAAA,IACd,OAAO,CAAC;AAAA,EACV;AAAA,EACA,MAAM,OAAO,IAAI,KAAK,SAAS;AAAA,EAC/B,IAAI,CAAC,MAAM;AAAA,IACT,OAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,SAAS,sCAAsC,KAAK,IAAI,IAAI;AAAA,EAClE,IAAI,CAAC,QAAQ;AAAA,IACX,OAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,SAAmB,CAAC;AAAA,EAC1B,MAAM,QACJ;AAAA,EACF,IAAI;AAAA,EACJ,QAAQ,QAAQ,MAAM,KAAK,MAAM,OAAO,MAAM;AAAA,IAC5C,MAAM,OAAO,MAAM,MAAM;AAAA,IACzB,MAAM,OAAO,oCAAoC,KAAK,IAAI,IAAI;AAAA,IAC9D,MAAM,MAAM,2CAA2C,KAAK,IAAI,IAAI;AAAA,IACpE,OAAO,KAAK,KAAK,QAAQ,OAAO,UAAU,YAAY,GAAG;AAAA,EAC3D;AAAA,EAGA,IAAI,OAAO,UAAU,GAAG;AAAA,IACtB,OAAO,KAAK,KAAK,KAAK,QAAQ,QAAQ;AAAA,IACtC,OAAO,CAAC,KAAM,KAAM,KAAM,KAAM,GAAG,IAAI;AAAA,EACzC;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,kBAAkB,CAAC,YAA+B;AAAA,EACzD,MAAM,SAAS,QAEV,WAAW,YAAoC,mBAG9C,WACN;AAAA,EACA,IAAI,OAAO,SAAS,GAAG;AAAA,IACrB,OAAO,OAAO,IAAI,CAAC,UAAU,UAAU,KAAK,OAAO,KAAK,KAAK,UAAU,CAAC;AAAA,EAC1E;AAAA,EACA,OAAO;AAAA;AAIT,IAAM,yBAAmC;AAAA,EACvC;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AACF;;;ACpXA;AAIA,IAAI;AAEJ,SAAS,qBAAqB,GAAgB;AAAA,EAC5C,IAAI,CAAC,wBAAwB;AAAA,IAC3B,MAAM,QAAQ,IAAI;AAAA,IAClB,WAAW,cAAc,0BAA0B,GAAG;AAAA,MACpD,MAAM,IAAI,WAAW,KAAK,YAAY,CAAC;AAAA,MACvC,WAAW,SAAS,WAAW,WAAW,CAAC,GAAG;AAAA,QAC5C,MAAM,IAAI,MAAM,YAAY,CAAC;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,yBAAyB;AAAA,EAC3B;AAAA,EACA,OAAO;AAAA;AAQT,IAAM,cAAc;AAOpB,IAAM,wBAAwB;AAavB,SAAS,gBAAgB,CAC9B,YACA,UAAmC,CAAC,GACjB;AAAA,EACnB,MAAM,cAA4B,CAAC;AAAA,EACnC,IAAI,OAAO,WAAW,WAAW,GAAG,IAAI,WAAW,MAAM,CAAC,IAAI;AAAA,EAE9D,OAAO,KAAK,QAAQ,aAAa,EAAE;AAAA,EACnC,OAAO,KAAK,QAAQ,uBAAuB,EAAE;AAAA,EAE7C,WAAW,QAAQ,yBAAyB,IAAI,GAAG;AAAA,IACjD,YAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SACE,iCAAiC,sCACjC;AAAA,MACF,WAAW,QAAQ;AAAA,MACnB,eAAe,QAAQ;AAAA,MACvB,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,EAAE,SAAS,IAAI,QAAQ,YAAY;AAAA;AAUrC,SAAS,wBAAwB,CAAC,aAA+B;AAAA,EACtE,MAAM,YAAY,sBAAsB;AAAA,EACxC,MAAM,QAAQ,IAAI;AAAA,EAElB,IAAI,WAAW;AAAA,EACf,IAAI,aAAa;AAAA,EAEjB,SAAS,IAAI,EAAG,IAAI,YAAY,QAAQ,KAAK;AAAA,IAC3C,MAAM,OAAO,YAAY;AAAA,IAEzB,IAAI,UAAU;AAAA,MACZ,IAAI,SAAS,KAAK;AAAA,QAEhB,IAAI,YAAY,IAAI,OAAO,KAAK;AAAA,UAC9B;AAAA,QACF,EAAO;AAAA,UACL,WAAW;AAAA;AAAA,MAEf;AAAA,MACA;AAAA,IACF;AAAA,IAEA,IAAI,SAAS,KAAK;AAAA,MAChB,WAAW;AAAA,MACX,aAAa;AAAA,MACb;AAAA,IACF;AAAA,IAEA,IAAI,gBAAgB,KAAK,IAAI,GAAG;AAAA,MAC9B,cAAc;AAAA,MACd;AAAA,IACF;AAAA,IAEA,IAAI,SAAS,OAAO,WAAW,SAAS,GAAG;AAAA,MACzC,MAAM,OAAO,WAAW,YAAY;AAAA,MAGpC,IAAI,sBAAsB,KAAK,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,GAAG;AAAA,QAC5D,MAAM,IAAI,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,IAEA,aAAa;AAAA,EACf;AAAA,EAEA,OAAO,MAAM,KAAK,KAAK;AAAA;AAUlB,SAAS,uBAAuB,CACrC,aACA,WACA,WACQ;AAAA,EACR,IAAI,cAAc,KAAK,cAAc,GAAG;AAAA,IACtC,OAAO;AAAA,EACT;AAAA,EAIA,MAAM,YACJ;AAAA,EAEF,IAAI,SAAS;AAAA,EACb,IAAI,YAAY;AAAA,EAChB,IAAI,WAAW;AAAA,EAEf,SAAS,IAAI,EAAG,IAAI,YAAY,QAAQ,KAAK;AAAA,IAC3C,IAAI,YAAY,OAAO,KAAK;AAAA,MAC1B,IAAI,YAAY,YAAY,IAAI,OAAO,KAAK;AAAA,QAC1C;AAAA,QACA;AAAA,MACF;AAAA,MACA,WAAW,CAAC;AAAA,IACd;AAAA,IACA,IAAI,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IAEA,UAAU,YAAY;AAAA,IACtB,MAAM,QAAQ,UAAU,KAAK,WAAW;AAAA,IACxC,IAAI,CAAC,SAAS,MAAM,UAAU,GAAG;AAAA,MAC/B;AAAA,IACF;AAAA,IAEA,OAAO,OAAO,QAAQ,UAAU,QAAQ,aAAa;AAAA,IAKrD,MAAM,SAAS,IAAI,IAAI,YAAY,IAAI,KAAM;AAAA,IAC7C,IAAI,gBAAgB,KAAK,MAAM,GAAG;AAAA,MAChC;AAAA,IACF;AAAA,IAEA,UAAU,YAAY,MAAM,WAAW,CAAC;AAAA,IACxC,UAAU,eACR,QACA,UACA,QACA,WACA,WACA,SACF;AAAA,IACA,YAAY,IAAI,MAAO;AAAA,IACvB,IAAI,YAAY;AAAA,EAClB;AAAA,EAEA,UAAU,YAAY,MAAM,SAAS;AAAA,EACrC,OAAO;AAAA;AAGT,SAAS,cAAc,CACrB,QACA,UACA,QACA,WACA,WACA,WACQ;AAAA,EACR,MAAM,WAAW,oBAAmB,QAAQ;AAAA,EAC5C,MAAM,WAAW,OAAO,SAAS,WAAW,EAAE,IAAI;AAAA,EAElD,MAAM,cAAc,SAAS,WAAW,WAAW;AAAA,EACnD,MAAM,cAAc,SAAS,WAAW,WAAW;AAAA,EAEnD,IAAI,cAAc,KAAK,cAAc,GAAG;AAAA,IACtC,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,GAAG,SAAS,oBAAmB,WAAW,IAAI,SAAS,cAAc;AAAA;AAG9E,SAAS,mBAAkB,CAAC,OAAuB;AAAA,EACjD,IAAI,QAAQ;AAAA,EACZ,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,IACrC,QAAQ,QAAQ,MAAM,MAAM,YAAY,EAAE,WAAW,CAAC,IAAI;AAAA,EAC5D;AAAA,EACA,OAAO,QAAQ;AAAA;AAGjB,SAAS,mBAAkB,CAAC,OAAuB;AAAA,EACjD,IAAI,QAAQ;AAAA,EACZ,IAAI,YAAY,QAAQ;AAAA,EACxB,OAAO,YAAY,GAAG;AAAA,IACpB,MAAM,QAAQ,YAAY,KAAK;AAAA,IAC/B,QAAQ,OAAO,aAAa,KAAK,IAAI,IAAI;AAAA,IACzC,YAAY,KAAK,OAAO,YAAY,QAAQ,EAAE;AAAA,EAChD;AAAA,EACA,OAAO;AAAA;;;ACvOT;AAAA;AAAA;AAuBO,SAAS,0BAA0B,CACxC,MACA,SACqE;AAAA,EACrE,MAAM,cAA4B,CAAC;AAAA,EAEnC,MAAM,QAA4B,CAAC;AAAA,EACnC,WAAW,aAAa,KAAK,QAAQ;AAAA,IACnC,MAAM,QAAQ,iCAAiC,SAAS;AAAA,IACxD,IAAI,OAAO;AAAA,MACT,MAAM,KAAK,EAAE,WAAW,QAAQ,WAAW,MAAM,CAAC;AAAA,IACpD;AAAA,EACF;AAAA,EACA,IAAI,MAAM,WAAW,GAAG;AAAA,IACtB,OAAO,EAAE,YAAY;AAAA,EACvB;AAAA,EAEA,MAAM,SAAS,KAAK,OAAO,IAAI,MAAM,GAAG,EAAE,IAAI,QAAQ,OAAO,EAAE,KAAK;AAAA,EAEpE,IAAI,KAAK,SAAS,cAAc;AAAA,IAC9B,OAAO,oBAAoB,MAAM,OAAO,SAAS,WAAW;AAAA,EAC9D;AAAA,EAEA,MAAM,YAAY,sBAAsB,MAAM,QAAQ,SAAS,WAAW;AAAA,EAC1E,IAAI,CAAC,WAAW;AAAA,IACd,OAAO,EAAE,YAAY;AAAA,EACvB;AAAA,EAEA,OAAO,EAAE,QAAQ,EAAE,OAAO,UAAU,GAAG,YAAY;AAAA;AAGrD,SAAS,qBAAqB,CAC5B,MACA,QACA,SACA,aAC4B;AAAA,EAC5B,MAAM,QAAQ,UAAU,MAAM,OAAO;AAAA,EACrC,IAAI,CAAC,OAAO;AAAA,IACV,YAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SACE,KAAK,KAAK,6DACV;AAAA,MACF,WAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,IACD;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,gBAAgB,MAAM,QAAQ,SAAS,WAAW;AAAA,EACrE,IAAI,CAAC,YAAY;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,iBAAiB,YAAY;AAAA,IAC9C,WAAW,QAAQ;AAAA,IACnB,eAAe;AAAA,EACjB,CAAC;AAAA,EACD,YAAY,KAAK,GAAG,WAAW,WAAW;AAAA,EAE1C,OAAO,EAAE,MAAM,WAAW,SAAS,WAAW,SAAS,MAAM;AAAA;AAM/D,SAAS,eAAe,CACtB,MACA,QACA,SACA,aACoB;AAAA,EACpB,OAAO,OAAO,UAAU,KAAK;AAAA,EAE7B,QAAQ,KAAK;AAAA,SACN;AAAA,MACH,OAAO,QAAQ,IAAI,UAAU;AAAA,SAE1B;AAAA,MACH,OAAO,iBAAiB,KAAK,UAAU,QAAQ,OAAO,MAAM;AAAA,SAEzD;AAAA,MACH,OAAO,KAAK,SAAS,YACjB,YACA,iBAAiB,MAAM,KAAK,IAAI,KAAK;AAAA,SAEtC;AAAA,MACH,OAAO,KAAK,SAAS,YACjB,YACA,iBAAiB,MAAM,KAAK,IAAI,KAAK;AAAA,SAEtC;AAAA,MACH,OAAO,KAAK,SAAS,YACjB,YACA,eAAe,UAAU,KAAK,KAAK,WAAW,MAAM,KAAK,IAAI;AAAA,SAE9D;AAAA,MACH,OAAO,KAAK,SAAS,YACjB,YACA,gBAAgB,UAAU,KAAK,KAAK,WAAW,MAAM,KAAK,IAAI;AAAA,SAE/D;AAAA,MACH,OAAO,QAAQ;AAAA,SAEZ;AAAA,MACH,OAAO,QAAQ;AAAA;AAAA,MAGf,YAAY,KAAK;AAAA,QACf,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SACE,gCAAgC,KAAK,kCACrC;AAAA,QACF,WAAW,QAAQ;AAAA,MACrB,CAAC;AAAA,MACD;AAAA;AAAA;AAIN,SAAS,gBAAgB,CACvB,UACA,QACA,OACA,QACoB;AAAA,EACpB,IAAI,UAAU,WAAW;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,SACD;AAAA,MACH,OAAO,IAAI,UAAU;AAAA,SAClB;AAAA,MACH,OAAO,IAAI,WAAW;AAAA,SACnB;AAAA,MACH,OAAO,IAAI,UAAU;AAAA,SAClB;AAAA,MACH,OAAO,IAAI,WAAW;AAAA,SACnB;AAAA,MACH,OAAO,IAAI,UAAU;AAAA,SAClB;AAAA,MACH,OAAO,IAAI,WAAW;AAAA,SACnB;AAAA,MACH,OAAO,WAAW,YACd,YACA,QAAQ,WAAW,SAAS,WAAW;AAAA,SACxC;AAAA,MACH,OAAO,WAAW,YACd,YACA,OAAO,UAAU,SAAS,UAAU;AAAA;AAAA,MAExC;AAAA;AAAA;AAIN,SAAS,mBAAmB,CAC1B,MACA,OACA,SACA,aACqE;AAAA,EACrE,MAAM,QAAQ,KAAK;AAAA,EACnB,IAAI,CAAC,SAAS,MAAM,KAAK,SAAS,KAAK,MAAM,OAAO,SAAS,GAAG;AAAA,IAC9D,OAAO,EAAE,YAAY;AAAA,EACvB;AAAA,EAEA,IAAI,MAAM,KAAK,SAAS,GAAG;AAAA,IACzB,YAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SACE,wEACA;AAAA,MACF,WAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,MAAM,KAAK;AAAA,EAC7B,MAAM,WAAW,MAAM,KAAK,MAAM,KAAK,SAAS;AAAA,EAChD,MAAM,aAAa,MAAM,MAAM,OAAO,EAAE;AAAA,EACxC,MAAM,YAAY,MAAM,MAAM,OAAO,MAAM,OAAO,SAAS,EAAE;AAAA,EAE7D,IAAI,CAAC,cAAc,CAAC,WAAW;AAAA,IAC7B,OAAO,EAAE,YAAY;AAAA,EACvB;AAAA,EAEA,MAAM,MACJ,UAAU,SAAS,SAAS,UAAU,QAAQ,YACzC;AAAA,IACC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,cAAc,IAAI,UAAU;AAAA,EAC9B,IACC,EAAE,MAAM,gBAAyB,OAAO,WAAW;AAAA,EAE1D,MAAM,MACJ,SAAS,SAAS,SAAS,SAAS,QAAQ,YACvC;AAAA,IACC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,cAAc,IAAI,SAAS;AAAA,EAC7B,IACC,EAAE,MAAM,iBAA0B,OAAO,UAAU;AAAA,EAE1D,IACG,UAAU,SAAS,SAAS,UAAU,SAAS,SAC/C,SAAS,SAAS,SAAS,SAAS,SAAS,OAC9C;AAAA,IACA,YAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SACE,yBAAyB,UAAU,UAAU,SAAS,qBACtD,sEACA;AAAA,MACF,WAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEA,OAAO;AAAA,IACL,QAAQ,EAAE,OAAO,WAAW,EAAE,MAAM,YAAY,KAAK,IAAI,EAAE;AAAA,IAC3D;AAAA,EACF;AAAA;AAOF,SAAS,SAAS,CAChB,MACA,SACsB;AAAA,EACtB,IAAI,KAAK,UAAU,WAAW;AAAA,IAC5B;AAAA,EACF;AAAA,EACA,MAAM,SAAS,QAAQ,oBAAoB,KAAK;AAAA,EAChD,IAAI,CAAC,QAAQ;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,MAAM,OAAO,mBAAmB,OAAO;AAAA,EAC7C,OAAO,MAAM,SAAS,GAAG,IAAI;AAAA;AAG/B,SAAS,KAAK,CAAC,MAAgD;AAAA,EAC7D,IAAI,CAAC,MAAM;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,KAAK,QAAQ,MAAM,EAAE;AAAA,EACnC,MAAM,MAAM,MAAM,WAAW,IAAI,MAAM,MAAM,CAAC,IAAI;AAAA,EAClD,IAAI,CAAC,mBAAmB,KAAK,GAAG,GAAG;AAAA,IACjC;AAAA,EACF;AAAA,EACA,OAAO,SAAS,IAAI,IAAI,YAAY,GAAG;AAAA;AAGzC,SAAS,KAAK,CAAC,MAAsB;AAAA,EACnC,OAAO,IAAI,KAAK,QAAQ,MAAM,IAAI;AAAA;;;AC7RpC,IAAM,SAAS;AAQf,IAAM,iBAAiB,KAAK,IAAI,MAAM,IAAI,EAAE;AAC5C,IAAM,iBAAiB,KAAK,IAAI,MAAM,GAAG,CAAC;AAEnC,SAAS,gBAAgB,CAAC,QAAgB,WAAW,OAAe;AAAA,EACzE,IAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAAA,IAC5B,OAAO,OAAO,MAAM;AAAA,EACtB;AAAA,EAEA,MAAM,QAAQ,WAAW,iBAAiB;AAAA,EAI1C,MAAM,WACJ,CAAC,YAAY,SAAS,MAAM,UAAU,IAAI,SAAS,IAAI;AAAA,EAEzD,MAAM,YAAY,KAAK,MAAM,QAAQ;AAAA,EACrC,MAAM,WAAW,WAAW;AAAA,EAC5B,MAAM,KAAK,QAAQ,YAAY,SAAS,KAAK,MAAM,WAAW,MAAM;AAAA,EACpE,MAAM,OAAO,IAAI,KAAK,EAAE;AAAA,EAExB,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG;AAAA,IAChC,OAAO,OAAO,MAAM;AAAA,EACtB;AAAA,EAEA,MAAM,MAAM,KAAK,YAAY;AAAA,EAI7B,IAAI,aAAa,GAAG;AAAA,IAClB,OAAO,IAAI,MAAM,GAAG,EAAE;AAAA,EACxB;AAAA,EACA,IAAI,cAAc,GAAG;AAAA,IACnB,OAAO,IAAI,MAAM,IAAI,EAAE;AAAA,EACzB;AAAA,EACA,OAAO,IAAI,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AAAA;;;ACT1C,IAAM,wBAAwB,IAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,eAAsB,eAAe,CACnC,QACA,UAA0B,CAAC,GACH;AAAA,EACxB;AAAA,IACE,QAAQ,eAAe;AAAA,IACvB,uBAAuB,8BAA8B;AAAA,IACrD,QAAQ,eAAe;AAAA,IACvB,cAAc,qBAAqB;AAAA,IACnC,cAAc,qBAAqB;AAAA,IACnC,eAAe;AAAA,MACb;AAAA,EAEJ,MAAM,cAA4B,CAAC;AAAA,EACnC,MAAM,MAAM,MAAM,gBAAgB,MAAM;AAAA,EAExC,MAAM,gBAAgB,mBAAmB,GAAG;AAAA,EAC5C,QAAQ,QAAQ,cAAc,cAAc,aAAa,cAAc,GAAG;AAAA,EAC1E,MAAM,aAAa,YAAY,GAAG;AAAA,EAElC,MAAM,WAAW,QAAQ,SACrB,aAAa,OAAO,CAAC,UAAU,QAAQ,OAAQ,SAAS,MAAM,IAAI,CAAC,IACnE;AAAA,EAEJ,MAAM,SAAqE,CAAC;AAAA,EAC5E,MAAM,SAA8B,CAAC;AAAA,EACrC,MAAM,aAAsC,CAAC;AAAA,EAC7C,MAAM,oBAAoD,CAAC;AAAA,EAC3D,MAAM,qBAAqB,IAAI;AAAA,EAE/B,WAAW,SAAS,UAAU;AAAA,IAC5B,MAAM,YAAY,eAAe,KAAK,MAAM,UAAU,aAAa;AAAA,IACnE,mBAAmB,IAAI,MAAM,IAAI;AAAA,IAEjC,MAAM,UAAU,IAAI;AAAA,IACpB,MAAM,eAAe,IAAI;AAAA,IAGzB,MAAM,cAAc,IAAI;AAAA,IAExB,WAAW,QAAQ,UAAU,OAAO;AAAA,MAClC,MAAM,SACJ,KAAK,eAAe,YAChB,YACA,WAAW,QAAQ,KAAK;AAAA,MAE9B,MAAM,QAAQ,UAAU,MAAM,QAAQ;AAAA,QACpC;AAAA,QACA;AAAA,QACA,WAAW,MAAM;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,MACD,IAAI,UAAU,WAAW;AAAA,QACvB,QAAQ,IAAI,KAAK,WAAW,KAAK;AAAA,MACnC;AAAA,MAEA,IAAI,gBAAgB,KAAK,eAAe,aAAa,QAAQ;AAAA,QAC3D,IAAI,OAAO,KAAK,OAAO,KAAK,EAAE,SAAS,GAAG;AAAA,UACxC,MAAM,QAAQ,YAAY,IAAI,KAAK,UAAU;AAAA,UAC7C,IAAI,OAAO;AAAA,YACT,MAAM,KAAK,IAAI;AAAA,UACjB,EAAO;AAAA,YACL,YAAY,IAAI,KAAK,YAAY,CAAC,IAAI,CAAC;AAAA;AAAA,QAE3C;AAAA,MACF;AAAA,MAEA,IAAI,oBAAoB;AAAA,QACtB,MAAM,WAA8B,CAAC;AAAA,QACrC,IAAI,QAAQ,cAAc;AAAA,UACxB,SAAS,eAAe,OAAO;AAAA,QACjC;AAAA,QACA,MAAM,YAAY,UAAU,WAAW,KAAK;AAAA,QAC5C,IAAI,WAAW;AAAA,UACb,SAAS,YAAY;AAAA,QACvB;AAAA,QACA,IAAI,OAAO,KAAK,QAAQ,EAAE,SAAS,GAAG;AAAA,UACpC,aAAa,IAAI,KAAK,WAAW,QAAQ;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,cAAc;AAAA,MAChB,YAAY,YAAY,UAAU,aAAa;AAAA,QAC7C,MAAM,SAAS,WAAW,QAAQ;AAAA,QAClC,IAAI,CAAC,QAAQ;AAAA,UACX;AAAA,QACF;AAAA,QACA,WAAW,KAAK;AAAA,UACd,OAAO,uBAAuB,MAAM,MAAM,KAAK;AAAA,UAC/C,OAAO,OAAO;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,IAAI,6BAA6B;AAAA,MAG/B,MAAM,UAAU,CAAC,GAAG,UAAU,kBAAkB,EAAE,KAChD,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAC3B;AAAA,MACA,WAAW,QAAQ,SAAS;AAAA,QAC1B,QAAQ,QAAQ,aAAa,oBAC3B,2BAA2B,MAAM;AAAA,UAC/B,WAAW,MAAM;AAAA,UACjB,qBAAqB,WAAW;AAAA,QAClC,CAAC;AAAA,QACH,YAAY,KAAK,GAAG,eAAe;AAAA,QACnC,IAAI,QAAQ;AAAA,UACV,kBAAkB,KAAK,MAAM;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,cAAc;AAAA,MAChB,WAAW,SAAS,YAAY,KAAK,MAAM,QAAQ,GAAG;AAAA,QACpD,MAAM,YAAY,aAAa,OAAO,MAAM,MAAM,WAAW;AAAA,QAC7D,IAAI,WAAW;AAAA,UACb,OAAO,KAAK,SAAS;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,gBAAoC,CAAC;AAAA,IAC3C,IAAI,OAAO,KAAK,UAAU,YAAY,EAAE,SAAS,GAAG;AAAA,MAClD,cAAc,eAAe,UAAU;AAAA,IACzC;AAAA,IACA,IAAI,OAAO,KAAK,UAAU,UAAU,EAAE,SAAS,GAAG;AAAA,MAChD,cAAc,aAAa,UAAU;AAAA,IACvC;AAAA,IACA,IAAI,UAAU,OAAO,SAAS,GAAG;AAAA,MAC/B,cAAc,SAAS,UAAU;AAAA,IACnC;AAAA,IACA,IAAI,UAAU,QAAQ;AAAA,MACpB,cAAc,SAAS,UAAU;AAAA,IACnC;AAAA,IACA,IAAI,MAAM,UAAU,WAAW;AAAA,MAC7B,cAAc,UAAU;AAAA,IAC1B;AAAA,IAEA,OAAO,KAAK;AAAA,MACV,MAAM,MAAM;AAAA,MACZ;AAAA,MACA,cAAc,aAAa,OAAO,IAAI,eAAe;AAAA,MACrD,eACE,OAAO,KAAK,aAAa,EAAE,SAAS,IAAI,gBAAgB;AAAA,IAC5D,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,mBAAmB,qBACrB,oBACE,cACA,aAAa,IAAI,CAAC,UAAU,MAAM,IAAI,GACtC,oBACA,WACF,IACA,CAAC;AAAA,EAEL,MAAM,OAA0B;AAAA,IAC9B;AAAA,IACA,QAAQ,OAAO,SAAS,IAAI,SAAS;AAAA,IACrC,kBACE,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,IACnD,YAAY,WAAW,SAAS,IAAI,aAAa;AAAA,IACjD,mBACE,kBAAkB,SAAS,IAAI,oBAAoB;AAAA,IACrD,kBAAkB;AAAA,MAChB,UAAU,QAAQ;AAAA,MAClB,YAAY,aAAa,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,MAClD,aAAa,YAAY,SAAS,IAAI,cAAc;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,MAAM,YAAY;AAAA;AAe7B,SAAS,SAAS,CAChB,MACA,QACA,SACqB;AAAA,EACrB,IAAI,KAAK,YAAY,WAAW;AAAA,IAC9B,MAAM,OAAO,KAAK,gBACd,wBACE,KAAK,SACL,KAAK,cAAc,MACnB,KAAK,cAAc,IACrB,IACA,KAAK;AAAA,IAET,MAAM,aAAa,iBAAiB,MAAM;AAAA,MACxC,WAAW,QAAQ;AAAA,MACnB,eAAe,KAAK;AAAA,IACtB,CAAC;AAAA,IACD,QAAQ,YAAY,KAAK,GAAG,WAAW,WAAW;AAAA,IAClD,OAAO,WAAW;AAAA,EACpB;AAAA,EAEA,QAAQ,KAAK;AAAA,SACN,UAAU;AAAA,MACb,MAAM,QAAQ,KAAK;AAAA,MACnB,IAAI,QAAQ,gBAAgB,QAAQ,cAAc;AAAA,QAChD,OAAO,iBAAiB,OAAO,QAAQ,QAAQ;AAAA,MACjD;AAAA,MACA,OAAO;AAAA,IACT;AAAA,SACK;AAAA,MACH,OAAO,KAAK;AAAA,SACT;AAAA,MACH,OAAO,KAAK;AAAA,SACT;AAAA,MACH,OAAO,KAAK;AAAA,SACT;AAAA,MAEH,OAAO,KAAK;AAAA,SACT;AAAA,MACH;AAAA;AAAA;AAIN,SAAS,YAAY,CACnB,OACA,WACA,aAC+B;AAAA,EAC/B,MAAM,SAAS,aAAa,MAAM,GAAG;AAAA,EACrC,IAAI,CAAC,QAAQ;AAAA,IACX,YAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS,UAAU,MAAM,yCAAyC,MAAM;AAAA,MACxE;AAAA,IACF,CAAC;AAAA,IACD;AAAA,EACF;AAAA,EAEA,IAAI,MAAM,mBAAmB,GAAG;AAAA,IAE9B,YAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SACE,UAAU,MAAM,sDAChB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,OAAO,IAAI,WAAW,OAAO,MAAM,WAAW;AAAA,EAC9D,MAAM,WACJ,OAAO,IAAI,WACX,OAAO,MAAM,WACb,IACA,MAAM,iBACN,MAAM;AAAA,EAER,IAAI,WAAW,KAAK,WAAW,GAAG;AAAA,IAChC,YAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS,UAAU,MAAM,oCAAoC,MAAM;AAAA,MACnE;AAAA,IACF,CAAC;AAAA,IACD;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ;AAAA,IACA,OAAO,KAAK,OAAO,KAAK;AAAA,IACxB,SAAS,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,IAC3C;AAAA,EACF;AAAA;AAGF,SAAS,mBAAmB,CAC1B,cACA,YACA,oBACA,aAC+B;AAAA,EAC/B,MAAM,SAAwC,CAAC;AAAA,EAE/C,WAAW,eAAe,cAAc;AAAA,IACtC,IAAI,sBAAsB,IAAI,YAAY,KAAK,YAAY,CAAC,GAAG;AAAA,MAC7D;AAAA,IACF;AAAA,IACA,IAAI,YAAY,UAAU,YAAY,QAAQ,KAAK,MAAM,IAAI;AAAA,MAC3D;AAAA,IACF;AAAA,IACA,IAAI,YAAY,QAAQ,SAAS,OAAO,GAAG;AAAA,MACzC,YAAY,KAAK;AAAA,QACf,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS,iBAAiB,YAAY;AAAA,QACtC,QAAQ,YAAY;AAAA,MACtB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAEA,MAAM,YACJ,YAAY,iBAAiB,YACzB,YACA,WAAW,YAAY;AAAA,IAE7B,IAAI,cAAc,aAAa,CAAC,mBAAmB,IAAI,SAAS,GAAG;AAAA,MACjE;AAAA,IACF;AAAA,IAGA,MAAM,aAAa,iBAAiB,YAAY,OAAO;AAAA,IACvD,YAAY,KAAK,GAAG,WAAW,WAAW;AAAA,IAE1C,OAAO,KAAK;AAAA,MACV,MAAM,YAAY;AAAA,MAClB,YAAY,WAAW,QAAQ,MAAM,CAAC;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAYF,SAAS,sBAAsB,CACpC,WACA,OACuE;AAAA,EACvE,MAAM,QAAQ,IAAI;AAAA,EAClB,WAAW,QAAQ,OAAO;AAAA,IACxB,MAAM,MAAM,MAAM,IAAI,KAAK,QAAQ;AAAA,IACnC,IAAI,KAAK;AAAA,MACP,IAAI,KAAK,KAAK,QAAQ;AAAA,IACxB,EAAO;AAAA,MACL,MAAM,IAAI,KAAK,UAAU,CAAC,KAAK,QAAQ,CAAC;AAAA;AAAA,EAE5C;AAAA,EAQA,MAAM,OAAc,CAAC;AAAA,EACrB,YAAY,UAAU,YAAY,OAAO;AAAA,IACvC,QAAQ,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,IAC5B,IAAI,WAAW,QAAQ;AAAA,IACvB,IAAI,WAAW;AAAA,IACf,SAAS,IAAI,EAAG,IAAI,QAAQ,QAAQ,KAAK;AAAA,MACvC,MAAM,UAAU,QAAQ;AAAA,MACxB,IAAI,YAAY,WAAW,GAAG;AAAA,QAC5B,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,KAAK,KAAK,EAAE,UAAU,UAAU,QAAQ,SAAS,CAAC;AAAA,MAClD,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAAA,IACA,KAAK,KAAK,EAAE,UAAU,UAAU,QAAQ,SAAS,CAAC;AAAA,EACpD;AAAA,EAGA,KAAK,KAAK,CAAC,GAAG,MACZ,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,QACnE;AAAA,EAEA,MAAM,QAA+E,CAAC;AAAA,EACtF,IAAI,QAAQ;AAAA,EACZ,OAAO,QAAQ,KAAK,QAAQ;AAAA,IAC1B,MAAM,QAAQ,KAAK;AAAA,IACnB,IAAI,UAAU,MAAM;AAAA,IACpB,IAAI,OAAO,QAAQ;AAAA,IACnB,OACE,OAAO,KAAK,UACZ,KAAK,MAAO,aAAa,MAAM,YAC/B,KAAK,MAAO,WAAW,MAAM,UAC7B,KAAK,MAAO,aAAa,UAAU,GACnC;AAAA,MACA,UAAU,KAAK,MAAO;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,MAAM,KAAK;AAAA,MACT;AAAA,MACA,OAAO,mBAAmB;AAAA,QACxB,OAAO,EAAE,UAAU,MAAM,UAAU,UAAU,MAAM,SAAS;AAAA,QAC5D,KAAK,EAAE,UAAU,MAAM,QAAQ,UAAU,QAAQ;AAAA,MACnD,CAAC;AAAA,IACH,CAAC;AAAA,IACD,QAAQ;AAAA,EACV;AAAA,EAEA,OAAO;AAAA;;;ACpbT,eAAsB,oBAAoB,CACxC,QACA,SAC4B;AAAA,EAC5B,QAAQ,SAAS,MAAM,gBAAgB,QAAQ,aAAa,QAAQ,OAAO,CAAC;AAAA,EAC5E,OAAO;AAAA;AAOT,eAAsB,4BAA4B,CAChD,QACA,SACwB;AAAA,EACxB,OAAO,gBAAgB,QAAQ,aAAa,QAAQ,OAAO,CAAC;AAAA;AAI9D,SAAS,YAAY,CACnB,QACA,SACgB;AAAA,EAChB,IAAI,SAAS,aAAa,WAAW;AAAA,IACnC,OAAO;AAAA,EACT;AAAA,EACA,MAAM,OACJ,OAAO,SAAS,eAAe,kBAAkB,OAC7C,OAAO,OACP;AAAA,EACN,OAAO,OAAO,KAAK,SAAS,UAAU,KAAK,IAAI,KAAK,QAAQ;AAAA;",
17
- "debugId": "90056589614CAA9A64756E2164756E21",
18
+ "mappings": "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",
19
+ "debugId": "D5F9B2A423DC266864756E2164756E21",
18
20
  "names": []
19
21
  }
@@ -10,7 +10,7 @@
10
10
  * ```
11
11
  */
12
12
  import { convertWorkbook } from "./src/convert";
13
- import type { ConvertOptions, ConvertResult, ExcelWorkbookData } from "./src/types";
13
+ import type { ConvertOptions, ConvertResult, CsvConvertOptions, ExcelWorkbookData } from "./src/types";
14
14
  /**
15
15
  * Convert an Excel file into engine `WorkbookData`.
16
16
  *
@@ -29,8 +29,33 @@ export declare function excelToFormulaEngine(source: Blob | ArrayBuffer | Uint8A
29
29
  * separate values.
30
30
  */
31
31
  export declare function excelToFormulaEngineDetailed(source: Blob | ArrayBuffer | Uint8Array, options?: ConvertOptions): Promise<ConvertResult>;
32
+ /**
33
+ * Convert delimited text — CSV, TSV, or semicolon-separated — into engine
34
+ * `WorkbookData` holding a single sheet.
35
+ *
36
+ * The delimiter is detected from the text unless one is given: a `.csv`
37
+ * extension says nothing about the separator, and a comma-decimal locale
38
+ * exports semicolons.
39
+ */
40
+ export declare function csvToFormulaEngine(source: Blob | ArrayBuffer | Uint8Array | string, options?: CsvConvertOptions): Promise<ExcelWorkbookData>;
41
+ /** As {@link csvToFormulaEngine}, with the diagnostics returned separately. */
42
+ export declare function csvToFormulaEngineDetailed(source: Blob | ArrayBuffer | Uint8Array | string, options?: CsvConvertOptions): Promise<ConvertResult>;
43
+ /**
44
+ * Convert whichever kind of spreadsheet file this is.
45
+ *
46
+ * For a drop target, which is handed whatever the user let go of and has to
47
+ * decide afterwards. An `.xlsx` is a ZIP and delimited text is not, so the
48
+ * format is settled by looking at the bytes rather than by trusting the name —
49
+ * a file saved as `.csv` but actually a workbook is a common enough export
50
+ * mistake to be worth handling quietly.
51
+ */
52
+ export declare function spreadsheetToFormulaEngine(source: Blob | ArrayBuffer | Uint8Array, options?: ConvertOptions & CsvConvertOptions): Promise<ExcelWorkbookData>;
53
+ /** As {@link spreadsheetToFormulaEngine}, with the diagnostics separately. */
54
+ export declare function spreadsheetToFormulaEngineDetailed(source: Blob | ArrayBuffer | Uint8Array, options?: ConvertOptions & CsvConvertOptions): Promise<ConvertResult>;
32
55
  export { convertWorkbook };
33
- export type { ConvertOptions, ConvertResult, Diagnostic, DiagnosticCode, DiagnosticSeverity, ExcelCellMetadata, ExcelSheetMetadata, ExcelWorkbookData, ExcelWorkbookMetadata, } from "./src/types";
56
+ export { convertDelimitedText } from "./src/csv/convert";
57
+ export { detectDelimiter, parseDelimitedText, stripBom, } from "./src/csv/parse";
58
+ export type { ConvertOptions, ConvertResult, CsvConvertOptions, Diagnostic, DiagnosticCode, DiagnosticSeverity, ExcelCellMetadata, ExcelSheetMetadata, ExcelWorkbookData, ExcelWorkbookMetadata, } from "./src/types";
34
59
  export { findUnsupportedFunctions, offsetFormulaReferences, translateFormula, } from "./src/translate/formula";
35
60
  export { excelSerialToIso } from "./src/translate/dates";
36
61
  export { columnIndexToLabel, columnLabelToIndex, parseA1, parseA1Range, toA1, } from "./src/a1";
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Delimited text in, `WorkbookData` out.
3
+ *
4
+ * The interesting decisions here are all about what a bare string *is*. A CSV
5
+ * carries no types, so every cell is a judgement call, and the ones that matter
6
+ * are the cases where guessing wrong destroys data rather than merely looking
7
+ * wrong: a leading-zero part number, an identifier too long for a float.
8
+ */
9
+ import type { CsvConvertOptions, Diagnostic, ExcelWorkbookData } from "../types";
10
+ export interface ConvertCsvResult {
11
+ data: ExcelWorkbookData;
12
+ diagnostics: Diagnostic[];
13
+ }
14
+ export declare function convertDelimitedText(text: string, options?: CsvConvertOptions): ConvertCsvResult;
15
+ /**
16
+ * The numeric value of a field, or undefined to keep it as text.
17
+ *
18
+ * Deliberately narrower than `Number()`. Three kinds of string look numeric and
19
+ * must not be converted, because converting them loses information that cannot
20
+ * be recovered from the result:
21
+ *
22
+ * - Leading zeros (`007`, `01234`) — part numbers, postcodes, phone extensions.
23
+ * This is the mangling Excel is notorious for.
24
+ * - Integers beyond `Number.MAX_SAFE_INTEGER` — long identifiers, which silently
25
+ * change value when they become floats.
26
+ * - Anything `Number()` accepts that is not a plain decimal: `0x1f`, `Infinity`,
27
+ * `1_000`, and the empty string.
28
+ */
29
+ export declare function toNumber(raw: string): number | undefined;
30
+ /** Decode bytes as UTF-8, which is what every modern exporter writes. */
31
+ export declare function readTextFrom(source: Blob | ArrayBuffer | Uint8Array | string): Promise<string>;